C语言程序设计教程(第三版)李凤霞 第十章课后习题答案

习题十
一、 单选题
1、下面的四个运算符中,优先级最低的是( )。
A)( ) B). C)-> D)++
2、已知: struct
{int i;
char c;
float a;
}test;
则sizeof(test)的值是( )。
A)4 B)5 C)6 D)7
3、选择出错误的函数定义( )。
A)struct tree funa(s) B)int *funb(s) C)struct tree *func(s) **D)**int *fund(s)
Struct tree s[ ]; char s[ ]; char **s; char *s[10][ ];
{ … {… {… {…
} } } }
4、以下对C语言中联合类型数据的正确叙述是( )。
A) 一旦定义了一个联合变量后,即可引用该变量或该变量中的任意成员
B) 一个联合变量中可以同时存放其所有成员
C) 一个联合变量中不能同时存放其所有成员
D) 联合类型数据可以出现在结构类体型定义中,但结构体类型数据不能出现在联合类型定义中
5、已知函数原型为:
struct tree *f(int x1,int x2,struct tree x3,struct tree *x4)
其中tree为已定义过的结构,且有下列变量定义:
struct tree pt,*p;int i;
请选择正确的的函数调用语句( )。
A)&pt=f(10,&i,pt,p); B)p=f(i++,(int *)p,pt,&pt);
*C)p=f(i+1,&(i+2),p,p); D)f(i+1,&i,p,p);
6、当说明一个结构变量时系统分配给它的内存是( )。
A)各成员所需内存量的总和 B)结构中第一个成员所需内存量
C)成员中占内存量最大者所需内存量 D)结构中最后一个成员所需内存量
7、C语言结构类型变量在程序执行期间( )。
A)所有成员一直驻留在内存中 B)只有一个成员驻留在内存中
C)部分成员驻留在内存中 D)没有成员驻留在内存中
8、已知:
struct sk
{int a;float b;
}data,*p;
若有p=&data, 则对data中的成员a的正确引用是( )。
A)(*p).data.a *B)(p).a C)p->data.a D)p.data.a
9、若有以下定义和语句:
struct student
{int num,age;
};
struct student stu[3]={{1001,20},{1001,19},{1003,21}};
struct student *p=stu;
则以下错误的引用是( )。
A)(p++)->num B)p++ C)(*p).num D)p=&stu.age
10、以下对C语言中联合类型数据的叙述正确的是( )。
A) 可以对联合变量直接赋值
B) 使用联合变量的目的是节省内存
C) 对一个联合变量,可以同时引用联合中的不同成员
D) 联合类型定义中不能出现结构类型成员
11、已知函数定义的形式如下:
struct data *f( void)
{……}
则函数f( )。
A) 没有参数,返回值是一个结构
B) 有一个参数void,返回值是一个结构
C) 没有参数,返回值是一个结构指针
D) 有一个参数void,返回值是一个结构指针
12、在对typedef的叙述中错误的是( )。用typedef可以定义各种类型名,但不能用来定义变量
A) 用typedef可以增加新类型
B) 用typedef只能是将已存在的类型用一个新的标识符来代替
C) 使用typedef有利于程序的通用和移植
13、设有以下语句:
struct st
{int n;
struct st *next;
};
static struct st a[3]={5,&a[1],7,&a[2],9,NULL},*p;
p=&a[0];
则以下表达式的值为6的是( )。
A)p++ ->n B)p->n++ C)(*p).n++ D)++p->n
14、若已建立下面的链表结构,指针p、q分别指向图中所是结点,则不能将q所值的结点插入到链表末尾的一组语句是( )。
A)q->next=NULL;p=p->next;p->next=q;
B)p=p->next;q->next=p->next;p->next=q;
C)p=p->next;q->next=p;p->next=q;
D)p=(*p).next;(*q).next=(*p).next;(*p).next=q;

二、填空题
1、已知:

union{int x;
      struct
       {char c1,c2;
        }b;
     }a;

执行语句a.x=0x1234之后,a.b.c1的值为(用16 进制表示),a.b.c2的值为(用16进制表示)__。(34 12)
2、用typedef定义整型一维数组:

typedef int ARRAY[10];

则对整型数组a[10],b[10],c[10]可定义为_________。(ARRAY a,b,c;)
3、 已知:

struct{
iny x,y;
}s[2]={{1,2},{3,4}},*p=s;

则:表达式++p->x的值为________。表达式(++p)->x的值________。(1 3)
4、已知:

   struct {
          int x;
          char *y;
           }tab[2]={{1,"ab"},{2,"cd"}},*p=tab;

则:表达式p->y的结果为________。表达式(++p)->y的结果为________。(a c)
5、 已知:struct {int day;char month;intyear;}a,*b; b=&a;
可用a.day引用结构中的成员day,请写出通过指针变量b引用成员a.day的其它两种形式,它们是__________和__________。((*b).day=? b->day=?)

6、 分析下列程序执行结果。

#include “stdio.h”
main()
{static struct s1
  {char c[4],*s;
   s1={“abc”,”def”};
 static struct s2
  {char *cp;struct s1 ss1;
   }s2={“ghi”,{“jkl”,”mno”}};
 printf(%c%c\n”,s1.c[0],*s1.s);  /*output ab    */
 printf(%s%s\n”,s1.c,s1.s);     /*output abcdef  */
 printf(%s%s\n”,s2.cp,s2.ss1.s);  /*output ghimno */
 printf(%s%s\n”,++s2.cp,++s2.ss1.s);  /* output hino */
}

7、 以下程序的功能是:读入一行字符(如:a,…,y,z),按输入时的逆序建立一个链式的结点序列,即先输入的位于链表尾(如下图),然后再按输入的相反顺序输出,并释放全部结点。

#include 
#define getnode(type)_________malloc(sizeof(type)) ( (struct node *)) 
main()
{struct node
  {char info;
   struct node *link;
   }*top,*p;
 char c;
 top=NULL;
 while((c=getchar())______________)!='\n'{p=getnode(struct node);
   p->info=c;
   p->link=top;
   top=p;
 }
while(top)
 {_________________;  (p=top)
  top=top->link;
  putchar(p->info);
  free(p);
  }
 }

8、 下面的函数将指针p2所指向的线性链表链接到p1所指向的的链表的末端。假定p1所指向的链表非空。

#define NULL 0
struct link
 {float a;
  struct link *next;
  };
concatenate(p1,p2)
 struct list *p1,*p2;
 {if(p1->next==NULL)
     p1->next=p2;
  else
concatenate(___________,p2);  (p->next)
      }

9、 以下函数create用来建立一个带头结点的单项链表。新产生的结点总是插入再链表的末尾。单向链表的头指针作为函数的返回值。

#include 
struct list
{char data;
 struct list *list;
};
struct list *cteate()
{struct list *h,*p,*q;
 char ch;
 h=___________malloc(sizeof(struct list));struct list *)
 p=q=h;
 ch=getchar();
 while(ch!='\n')
  {p=____________malloc(sizeof(struct list));  (struct list *)
   p->date=ch;
   q->next=p;
   q=p;
   ch=getchar();
   }
   p->next='\0';
   ______________; (rerturn h)
  }

三、编程题
1、 成绩排序。按学生的序号输入学生的成绩,按照分数由低到高的顺序输出学生的名次、该名次的分数、相同名次的人数和学号;同名次的学号输出再同一行中,一行最多输出10 个学号。

#include "stdio.h"
struct student
{int n;
 int mk;
 }
main( )
{int i,j,k,count=0,no;
 struct student stu[100],*s[100],*p;
 printf("\nPleasse enter mark(if mark<0 is end) \n");
 for(i=0;i<100;i++)
 { printf("No.%4d= =',i+1);
   scanf("%d",&stu[i].mk);
   s[i]=&stu[i];
   stu[i].n=i+1;
   if(stu[i].mk<=0)break;
   for(j=0;j<I;j++)
     for(k=j+1;k<=I;k++)
       if(s[j]->mk<s[k]->mk)
        {p=s[j];s[j]=s[k];s[k]=p;}
     }
  for(no=1,count=1,j=0;j<I;j++)
   {if(s[j]->mk>s[k+1]->mk)
{printf("\nNo.%3d= =%4d%4d:",no,s[j]->mk,count);
 for(k=j-count+1;k<=j;k++)
  {ptintf("%3d",s[k]->n);
   if((k-(j-count))%10= =0&&k!=j)
     printf("\n      ");
   }
  count=1;
  no++;
 }
 else count++;
}
      }

2、 现在有教师(姓名、单位、住址、职称)和学生(姓名、班级、住址、入学成绩)的信息。请在输入10名教师和学生的信息后,按姓名进行排序,最后按排序后的顺序进行输出,对于教师要输出姓名、单位、住址和职称,对学生要输出姓名、班级、住址和入学成绩。请编程实现。

/*p332_2.c*/
#include "string.h"
union dwbj
{char dw[20];
 char bj[10];
 };
union zcrxcj
 {char zhich[10];
  float rxcj;
  };
struct inf
 {int fl;/*0:teacher;1:student*/
  char name[20];
  union dwbj db;
  char addr[30];
  union zcrxcj zs;
  };
main()
{int i,j;
 struct inf info[10];
 for(i=0;i<10;i++)
   {printf("teacher:input 0;student:input 1\n");
    scanf("%d",&info[i].fl);
    printf("Input name of teacher or student:\n");
    scanf("%s",info[i].name);
    printf("Input dept of teacher or class of student:\n");
    if(info[i].fl==0)scanf("%s",info[i].db.dw);
    else scanf("%s",info[i].db.bj);
    printf("Input address:\n");
    scanf("%s",info[i].addr);
    printf("job of teacher or suc of student\n");
    if(info[i].fl==0)scanf("%s",info[i].zs.zhich);
    else scanf("%f",&info[i].zs.rxcj);
    }
 for(i=0;i<10;i++)
   {printf("%s,",info[i].name);
    if(info[i].fl==0)printf("%s,",info[i].db.dw);
    else printf("%s,",info[i].db.bj);
    printf("%s,",info[i].addr);
    if(info[i].fl==0)printf("%s\n",info[i].zs.zhich);
    else printf("%f\n",info[i].zs.rxcj);
    }
 } 

你可能感兴趣的:(C语言,c语言)