C语言 第八章 结构体与共用体 重点 典型题

一、概念

二、重点代码(书本)

三、重点题目

1、有如下说明语句:

        struct stu

        {

                int a;

                float b;

        }stutype;

则以下叙述中不正确的是( )

A.  struct是结构体类型的关键字

B.  struct stu是用户定义的结构体类型

C.  stutype是用户定义的结构体类型名

D.  a和b都是结构体成员名

答案:C

解析:结构体变量定义(声明)有3种形式:1、先声明结构体类型,再定义结构体变量(这种最常见);2、声明结构体类型同时定义结构体变量;3、声明一个无名结构体类型,同时定义结构体变量。本题属于第2种形式,因此应选C。

2、以下对结构体变量的定义中不正确的是( )。

A.  #define STUDENT struct student                            B.  struct student {

     STUDENT{                                                                          int num;

          int num;                                                                          float age;

          float age;                                                                   }std1;

     }std1;

C.  struct {                                                                     D.  struct {  

          int num;                                                                          int num;

          float age;                                                                        float age;

      }std1;                                                                             }student;

                                                                                            struct student std1;

答案:D

解析:

3、当定义一个结构体变量时,系统分配给它的内存是( )

A.  各成员所需内存量的总和

B.  结构体中第一个成员所需内存量

C.  各成员所需内存量的最大值

D.  结构中最后一个成员所需内存量

答案:A

解析:C语言中一个结构体变量所占用的内存空间是所有成员变量所占用空间的总和,而共用体(联合体)变量所占用的内存空间是各成员变量中占用内存空间最大的那个变量。因此选A。

4、C语言结构体变量再程序执行期间( )

A.  所有成员一直驻留内存中

B.  只有一个成员驻留内存中

C.  部分成员驻留内存中

D.  没有成员驻留内存中

答案:A

解析:C语言中一个结构体变量所占用的内存空间是所有成员变量所占用空间的总和,因此应选A。

5、若有以下程序段:

      int a=1,b=2,c=3;
      struct dent

      {
           int n;
           int *m;
      }dent s[3]={{101,&a},{102,&b},{103,&c}};
      struct dent *p=s;
则以下表达式中值为2的是( )。
A.(p++)->m
B.*(p++)->m
C.(*p).m
D.*(++p)->m

答案:D

解析:选项A是求整型数据占用的内存大小,一般的整型类型是4个字节。选项B中,p++->m就是变量a的地址,*(p++)->m就为a的值,因此也是1。选项D中,由于p=s,++p指向s[1],则++p->m就是变量b的地址,所以*(++p)->m的值为2。

6、下面对typedef的叙述不正确的是( )

A.  用typedef可以定义多种类型名,但不能用来定义变量

B.  用typedef可以增加新类型

C.  用typedef只是将已存在的类型用一个新的标识符来代表

D.  使用typedef有利于程序的通用和移植

答案:B

解析:C语言中typedef是自定义数据类型名,就是将已有的数据类型名用另外一个名字来表示(在自定义数据类型中非常方便),并不能改变原来的数据类型,也不能增加新的数据类型,因此选B。

7、结构体变量成员引用方式是使用   .(成员域访问运算符) 运算符,结构体指针变量成员的引用方式是使用  ->  (成员域间接访问运算符)运算符。

8、C语言可以定义枚举类型,其关键字为   enum  

解析:C语言中枚举类型是基本数据类型,在定义时列出可能的取值,用enum作为关键字。

9、C语言允许用  typedef  声明新的类型名来代替已有的类型名。

解析:C语言中可以用typedef来对已有的类型取一个别名,而不改变数据类型本身。

10、结构体数组中存有三人的姓名和年龄,以下程序输出三人中的最年长者的姓名和年龄。请填空使程序完整。

        #include <stdio.h>
        struct man
        {
               char name[20];
               int age;
        }person[]={"li-ming",18,"wang-hua",19,"zhang-ping",20};
        int main()
        {
               struct man *p,*q;
               int old=0;
               p=person;
               for( ;  p<person+3  ;p++)
               if(old<p->age)
               {
                      q=p;
                      old=p->age;
               }
               printf("%s %d",  q->name,q->age  );
               return 0;
        }

解析:本题中定义了一个有3个元素的结构体数组person并赋了初值,结构体的成员包含一个用字符串表示的姓名和整型表示的姓名和整型表示的年龄,主程序中对年龄比较,找出年龄最大的,并将指针变量q指向对应年龄最大的结构体数组元素。第一空是循环控制条件,指针p指向最后,则填<person+3 或<=person+2 。第二空是将较大的年龄值赋给old,则应填old=p->age。第三空是输出最大年龄者的姓名和年龄,则应填q->name,q->age。

11、以下程序段的功能是统计链表中节点的个数,其中first为指向第一个节点的指针(链表不带头节点)。请填空使程序完整。

       struct link
       {
             char data;
             struct link *next;
       };
       。。。
       struct link *p,first;
       int c=0;
       p=first;
       while(p!=NULL)
       {
             c++  ;
             p=   p->next    ;
       }

12、设链表上节点的数据结构如下:

        struct node
        {
              int x;
              struct node *next;
        };
若已经建立了一条链表,h表示链表的头指针,函数delete的功能是:在链表上找到等于value的节点,则删除该节点(假定各节点的值不同),要求返回链表的首指针。请填空使程序完整。

        struct node
        {
              int x;
              struct node *next;
        }
        struct node *delete(struct node *h,int value)
        {
              struct node *p,*p2;
              p1=p2=h;
              while(p1!=NULL)
              {
                    if(p1->x == value)
                    {
                          if(p1==h)
                          {
                                h=  p1->next  ;
                                free(p1);
                          }
                          else
                          {
                                p2->next=   p1->next  ;
                                free(p1);
                          }
                    }
                    else
                    {
                          p2=p1;
                          p1=  p1->next  ;
                    }
              }
              return h;
        }

解析:指针p1是移动到的当前节点,p2是当前节点的前一个节点。第一空表示要删除的是第一个节点,则应把当前节点的后面一个节点的后面一个节点作为第一个节点,因此应填p1->next。第二空表示删除的不是第一个节点,若删除后,前面一个节点应指向被删除节点的后一个节点,因此应填p1->next。第三空表示当前节点不是要删除的节点,指向节点的指针要向后移动,因此应填p1->next。

13、以下程序的运行结果是   7,3   

        #include <stdio.h>
        struct ks
        {
              int a;
              int *b;
        }s[4],*p;
        int main()
        {
              int n=1,i;
              for(i=0;i<4;i++)
              {
                     s[i].a=n;
                     s[i].b=&s[i].a;
                     n=n+2;
              }
              p=&s[0];
              p++;
              printf("%d, %d\n",(++p)->a,(p++)->a);
              return 0;
        }
解析:结构体数组s的元素分别为s[0]={1,&s[0].a},s[1]={3,&s[1].a},s[2]={5,&s[2].a},s[3]={7,&s[3].a} 。p指向s[0],p++后指向s[1]。一般来说,由于C语言中函数参数是从右向左结合的,因此先输出(p++)->a(值为3),然后p指向s[2],++p后p就指向s[3],因此++p->a的值为7 。

14、编写一个函数output,打印学生的成绩数据(包含姓名、学号、3门课成绩,总分),该数组中有N个学生的数据记录,每个记录的输入数据包括姓名,学号和3门课成绩,用主函数输出这些记录,用output函数输出这些记录。

#include<stdio.h>
#include<stdlib.h>
#define N 10  /*学生人数*/
#define M 3   /*课程数*/
struct stu    /*定义结构体类型*/
{
    char name[15];
    char num[6];
    float score[M];
    float sum;
} student[N];  /*说明结构体变量*/

void input(struct stu student[],int n,int m);
void output(struct stu student[],int n,int m);
int main()
{
    struct stu temp;
    input(student,N,M);
    output(student,N,M);
    return 0;
}
void input(struct stu student[],int n,int m)
{
    int i,j;
    printf("input data:\n");
    for(i=0;i<n;i++)
    {
        scanf("%s %s",&student[i].name,&student[i].num);
        student[i].sum = 0;
        for(j=0;j<m;j++)
        {
            scanf("%f",&student[i].score[j]);
            student[i].sum += student[i].score[j];
        }
    }
}
void output(struct stu student[],int n,int m)
{
    int i,j;
    for(i=0;i<n;i++)
    {
        printf("%15s,%8s",student[i].name,student[i].num);
        for(j=0;j<m;j++)
            printf("7.2f",student[i].score[j]);
        printf("7.2f\n",student[i].sum);
    }
}

 

15、有10个学生,每个学生的数据包括学号、姓名、3门课的成绩,从键盘输入10个学生的数据,要求编程输出3门课平均成绩,以及总分最高学生的数据(包括学号、姓名、3门课的成绩、平均分数)。

#include <stdio.h>
#define N 10
typedef struct student
{
    int num;
    char name[20];
    float s1,s2,s3;
    float sum;
} STU;
int main()
{
    float sv1=0,sv2=0,sv3=0,smax;//设置三门课均分初值
    STU stu[N];
    int i,k;
    for(i=0;i<N;i++)
    {
        scanf("%d %s %f %f %f",&stu[i].num,&stu[i].name,&stu[i].s1,&stu[i].s2,&stu[i].s3);
        stu[i].sum=stu[i].s1+stu[i].s2+stu[i].s3;
        sv1=sv1+stu[i].s1;
        sv2=sv2+stu[i].s2;
        sv3=sv3+stu[i].s3;
    }
    sv1=sv1/N;
    sv2=sv2/N;
    sv3=sv3/N;
    smax=stu[0].sum;//给总分最高赋初值
    for(i=1;i<N;i++)
        if(stu[i].sum>smax)
        {
            smax=stu[i].sum;
            k=i;
        }
    printf("%.2f %.2f %.2f\n",sv1,sv2,sv3);
    printf("%d %s %.2f %.2f %.2f %.2f\n",stu[k].num,stu[k].name,stu[k].s1,stu[k].s2,stu[k].s3,stu[k].sum);
    return 0;
}

16、学生的记录由学号和成绩组成,在主函数中将N名学生的数据输入结构体数组s中,请编写函数fun,其功能是:把分数最低的学生数据放在h所指的数组中。注意,分数最低的学生可能不止一个,函数返回分数最低的学生个数。

        int fun(STU s[],STU h[])
        {
             int k=0,i,smin=s[0].score;
             for(i=0;i<N;i++)
                  if(smin<s[i].score)
                        smin=s[i].score;
             for(i=0;i<N;i++)
                  if(smin==s[i].score)
                        h[k++]=s[i];
             return k;
        }

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页