第十章    结构体和杂类
一.  选择题
1.    如下说明语句,则下面叙述不正确的是(  C   )
struct stu {  int a ; float b ;} stutype;
A.struct是结构体类型的关键字    B.struct  stu是用户定义结构体类型
C. stutype是用户定义的结构体类型名(变量名)    D. ab都是结构体成员名
2.    16PC机中,若有定义:struct data { int i ; char ch; double f; } b ; 则结构变量b占用内存的字节数是 D   )
A.1          B.2    C.8    D.11
3.      设有定义语句:enum t1 {a1, a2 = 7, a3, a4 = 15} time;则枚举常量a2a3的值分别为 ( D )
A. 12        B. 23      C. 72        D. 78
4.      以下程序的输出结果是 D )
union myun { struct { int x, y, z; } u; int k; } a;
main( )
{  a.u.x=4;  a.u.y=5;  a.u.z=6;  a.k=0;  printf(" %d\n",a.u.x);  }
A. 4        B. 5      C. 6      D. 0
5.    当定义一个共用体变量时,系统分配给它的内存是C    )
A.各成员所需内存量的总和            B.结构中第一个成员所需内存量
C.成员中占内存量最大的容量          D.结构中最后一个成员所需内存量
6.    若有以下程序段:
union data { int i ; char c; float f;} a;
int n;
  则以下语句正确的是C    )
A.a=5;          B.a={2,’a’,1.2}      C.printf(“%d”,a);      D.n=a;
7.        struct {int a; char b; } Q, *p=&Q;错误的表达式是(  d      )。
A.Q.a                  B.(*p).b                C.p->a                  D.*p.b
9.    以下对C语言中共用体类型数据的叙述正确的是(  c  )
A. 可以对共用体变量直接赋值
B.一个共用体变量中可以同时存放其所有成员
C.一个共用体变量中不能同时存放其所有成员
D.共用体类型定义中不能出现结构体类型的成员
10.  下面对typedef的叙述中不正确的是(  b  )
A.typedef可以定义多种类型名,但不能用来定义变量
B.typedef可以增加新类型
C.typedef只是将已存在的类型用一个新的标识符来代表
D.使用typedef有利于程序的通用和移植
二.  判断题
1.      共用体类型的变量的字节数等于各成员字节数之和。F
2.      结构体类型的变量的字节数等于各成员字节数之和。t
3.      typedef实际上是用来定义新的数据类型。f
三.  填空题
1.      结构体变量成员的引用方式是使用    .      运算符,结构体指针变量成员的引用方式是使用    ->      运算符。
c语言struct头文件
2.      struct student{ int nochar name[12]float score[3] } sl* p = &sl
用指针法给sl的成员no赋值1234的语句是____p->no=1234_______________
3.      运算sizeof是求变量或类型的  占用内存字节个数      typedef的功能是                     
4.      C语言可以定义枚举类型,其关键字为  enum       
5.      union student { int nchar a[100]; } b; sizeof(b)的值是_______100____________
四.  程序分析题
1.      #include <stdio.h>
    main()
    {  union { int a; char b[2]; } c;
      c.a=65;
puts(c.b); printf("%d\n",sizeof(c));
}
A
16或32
2.      main()
    { union {
        struct { int x,y; } in;
    int a,b;
      } e;
        e.a=1; e.b=2;
      e.in.x=e.a*e.b;  e.in.y=e.a+e.b;
      printf("%d %d",e.in.x,e.in.y);
    }
2 4
3.     
struct w {  char low ; char high ;  } ;
union u {  struct w byte ; int word ; } uu;
main ( )
{ uu.word = 0x1234 ;
  printf(“%04x\n”, , uu.word); printf(“%02x\n”, , uu.byte.high) ;
  printf(“%02x\n”, , uu.byte.low);  uu.byte.low = 0xff ;
  printf(“%04x\n”, , uu.word) ;
}
1234
12
34
12ff
五.  程序填空
1.      下面的函数是将p所指的结点插入head(形参中)所指的单向链表中。设链表已按学号(num)从小到大顺序排列,要求将p(形参)所指的结点插入后链表保持有序,函数返回插入后的链表的头指针。
  结点结构为:
      typedef struct node {  int num;  struct node *next; } NODE;
    函数为:
    NODE *insert(NODE *head ,NODE * p)
    { NODE *front,*rear;
      front=head;
    while (front!=NULL && front->num < p->num) {
        rear=front;     front=front->next        ;
    }
      if (front==NULL ) {
        if (head==NULL)     head=p;        ;
        else rear->next=p;     
            p->next=NULL      ;
      }
      else { if (head==front) head=p; else rear->next=p;
                    p->next=front          ;
            }
          return head            ;
    }
2.      下面的函数create是建立单向链表的函数,它返回已建立的链表的头指针。(先输入的结点值在头,后输入的值在尾)
    结点结构为:
      typedef struct node { int num;  struct node *next; } NODE;
    函数为:
    NODE *create()
    {
      NODE *head,*tail,*p;
      int num;
      head=NULL;  /*  给表头指针初始化 */
      scanf("%d",&num);
      while (num!=0) {
        p=(NODE *)malloc(sizeof(NODE));
        if (     !p        ) {
          printf("No enugh memory!\n");exit(1);
        }
        p->num=num; 
        if (head==NULL) head=p;
        else    tail->next=p          ;
        tail=p; /*  给表尾指针tail赋值 */
          scanf("%d",&num);          ;
    }
    tail->next=      NULL        ;
          return head        ;
  }
六.  程序编写
1.10个学生,每个学生的数据包括学号,姓名,3门课的成绩,从键盘输入10个,要求打印出3门课总平均成绩,以及最高分的学生的数据(包括学号,姓名,3门课的成绩,平均分数)。
#include <stdio.h>
struct student
{
int num;
char name[10];
int score[3];
int sum;
float aver;
};
main()
{
struct student stu[10];
int i,max;//max记录平均成绩最高的同学的下标
float aver;
printf("\n\n    ");
for(i=0;i<10;i++)
{
printf("\n    请输入学号:");
scanf("%d",&stu[i].num);
fflush(stdin);//清掉缓冲区的数据,主要是为了清掉刚刚学号输入时最后的换行
printf("\n    请输入姓名:");
gets(stu[i].name);
printf("\n    请输入三门课的成绩:");
scanf("%d%d%d",&stu[i].score[0],&stu[i].score[1],&stu[i].score[2]);

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。