C语言各章节单元测试题及答案——结构体与共用体
- 格式:pdf
- 大小:1.81 MB
- 文档页数:12
实验八构造体及其应用班级:**:**:成绩:一.实验目的1、掌握构造体数据类型的定义和使用。
2、掌握构造体数组的定义和使用。
3、掌握链表的根本概念,熟练掌握单链表的创立、插入、删除和遍历操作。
二.使用的设备和仪器:计算机+Windows *P +Visual C++6.0三.实验内容及要求1、定义一个描述时间的构造体类型Time〔包括时、分、秒〕,然后定义一个该构造体类型的变量,按24小时制输入时间信息,然后按12小时制输出〔区分AM和PM〕。
例如,输入的时间是22:10:30;输出:PM 10:10:30。
2、定义描述学生信息〔**、**、成绩〕的构造体数组。
1〕定义输入学生信息的函数Input;2〕定义输出学生信息的函数Output;3〕定义按**进展查找的函数Search,假设找到,则输出该学生的信息;如果没找到,则输出"该学生不存在〞。
3、建立一个由3个学生〔包括**、**、成绩〕组成的静态链表,然后,输出该链表中各结点的数据。
4、动态建立一个学生信息〔包括**、**、成绩〕的链表,**输入-1时表示完毕,然后输出该链表中各结点的数据。
选作题:5、在第2题的根底上修改函数Search,假设找到,则返回该学生的信息;否则,返回一个内容为空的构造变量。
6、有N个候选人,每个选民只能投一票,要求编写一个模拟10个选民进展投票的程序,先后输入被选人的名字,最后按照选票由高到低输出投票结果。
7、在第3题的根底上,定义一个链表查找函数,对所输入的**进展查找,如果找到,则输出该学生的信息;如果没找到,则输出"该学生不存在〞。
四.实验步骤1、程序代码:*include<stdio.h>struct Time{int h,m,s;};void Input(Time *pt);void Output12(Time t);void main(){Time t;Input(&t);Output12(t);}void Input(Time *pt){printf("Input hour:minute:second:");scanf("%d:%d:%d",&pt->h,&pt->m,&pt->s);}void Output12(Time t){printf("The Time is:");if(t.h<12)printf("AM %d:%d:%d\n",t.h,t.m,t.s);elseprintf("PM %d:%d:%d\n",t.h-12,t.m,t.s);}运行结果:2、程序代码:*include<stdio.h>*include<string.h>*define N 3struct Student{char num[10];char name[10];double score;};void Input(Student *p){int i;for(i=0;i<N;i++)scanf("%s%s%lf",(p+i)->num,(p+i)->name,&(p+i)->score ); }void Output(Student *p){int i;for(i=0;i<N;i++)printf("num=%s name=%s score=%lf\n",(p+i)->num,(p+i)->name,(p+i)->score );}void Search(Student *p,char *nm){for(int i=0;i<N;i++){if(strcmp((p+i)->num,nm)==0){printf("num=%s name=%s score=%lf\n",(p+i)->num,(p+i)->name,(p+i)->score );break;}}if(i==N)printf("该学生不存在!\n");}void main(){Student stu[N];printf("请输入%d个学生的信息〔**、**、成绩〕:\n",N);Input(stu);printf("学生的信息为:\n");Output(stu);char nm[10];printf("请输入要查找的学生的**:");scanf("%s",nm);printf("查找结果:\n");Search(stu,nm);}运行结果:3、程序代码:*include<stdio.h>*define N 3struct student{char num[10];char name[10];double score;student *ne*t;};void main(){student stu1={"001","zhangsan",89},stu2={"002","lisi",99},stu3={"004","wangwu",70};student *head,*p;head=&stu1;stu1.ne*t=&stu2;stu2.ne*t=&stu3;stu3.ne*t=NULL;p=head;while(p!=NULL){printf("num:%s,name:%s,socre:%.2lf\n",p->num,p->name,p->score);p=p->ne*t;}}运行结果:4、程序代码:*include<stdio.h>*include<malloc.h>*include<string.h>*define N 3struct student{char num[10];char name[10];double score;student *ne*t;};void main(){student *head,*p,*s;head=NULL;printf("请输入学生信息,包括**和**〔**输入-1,表示完毕〕:\n");s=(student*)malloc(sizeof(student));scanf("%s%s%d",s->num,s->name,&s->score);s->ne*t=NULL;while(strcmp(s->num,"-1")!=0){if(head==NULL)head=s;elsep->ne*t=s;p=s;s=(student*)malloc(sizeof(student));scanf("%s%s%d",s->num,s->name,&s->score);s->ne*t=NULL;}p=head;while(p!=NULL){printf("%s,%s,%d\n",p->num,p->name,p->score);p=p->ne*t;}free(s);}运行结果:选做题:5、程序代码:*include<stdio.h>*include<string.h>*define N 3struct Student{char num[10];char name[10];double score;};void Input(Student *p){int i;for(i=0;i<N;i++)scanf("%s%s%lf",(p+i)->num,(p+i)->name,&(p+i)->score );}void Output(Student *p){int i;for(i=0;i<N;i++)printf("num=%s name=%s score=%lf\n",(p+i)->num,(p+i)->name,(p+i)->score ); }Student Search(Student *p,char *nm){Student ept_stu={",",0};for(int i=0;i<N;i++){if(strcmp((p+i)->num,nm)==0)return *(p+i);}return ept_stu;}void main(){Student stu[N];printf("请输入%d个学生的信息〔**、**、成绩〕:\n",N);Input(stu);printf("学生的信息为:\n");Output(stu);char nm[10];printf("请输入要查找的学生的**:");scanf("%s",nm);printf("查找结果:\n");Student t=Search(stu,nm);printf("num=%s name=%s score=%lf\n",t.num,,t.score); }运行结果:6、程序代码:*include<stdio.h>*include<string.h>*define N 3struct person{char name[20];int count;};void main(){person leader[N]={"HJT",0,"W",0,"*JP",0};char lname[20];person t;int i,j;printf("候选人为:\n");for(i=0;i<N;i++)printf("%s ",leader[i].name );printf("\n请开场投票:\n");for(i=1;i<=10;i++){scanf("%s",lname);for(j=0;j<N;j++){if(strcmp(lname,leader[j].name )==0)leader[j].count ++;}}for(i=0;i<N-1;i++)for(j=i+1;j<N;j++){if(leader[j].count>leader[j].count){t=leader[j]; leader[j]=leader[i]; leader[i]=t;}}printf("最后的投票结果为:\n");for(i=0;i<N;i++){printf("%s:%d\n",leader[i].name ,leader[i].count );}}运行结果:7、程序代码:*include<stdio.h>*include<string.h>struct Student{int num;char name[20];double score;Student *ne*t;};void PrintList(Student *head);void Search(Student *head);void main(){Student s1={1001,"Lily",100};Student s2={1002,"Lucy",90};Student s3={1003,"Ada",70};Student *head;head=&s1; s1.ne*t =&s2; s2.ne*t =&s3; s3.ne*t =NULL;PrintList(head);Search(head);}void PrintList(Student *head){printf("The List are:\n");Student *p=head;while(p!=NULL){printf("num=%d name=%s score=%lf\n",p->num ,p->name ,p->score );p=p->ne*t ;}}void Search(Student *head){char nm[20];printf("请输入要查找的**:");scanf("%s",nm);Student *p=head;while(p!=NULL){if(strcmp(p->name,nm)==0)break;p=p->ne*t ;}if(p!=NULL)printf("查找的结果为:num=%d name=%s score=%lf\n",p->num ,p->name ,p->score );elseprintf("该学生不存在!\n");}运行结果:五、实验总结。
第九章结构体类型与公用体类型习题及其答案9-3编写程序,使用结构体类型,输出一年十二个月的英文名称及相应天数。
解:#include "stdio.h"struct date{char month[10];int daynumber;}main(){int i ;date a[12]={{n January u,31},{“February”,29}, {“March”,31}, {” Aprial”,30}, {”May“,31},{“June",30}, {“july”,31},{” August”,31},「'September”,30} ,{“October”,31},{"November",30},{"December",31}};for(i=0;i<12;i++);printf(u%d 月:%s %d\n",i+l,a[i].month,a[i].daynumber);}思考:如何对结构体变量进行初始化?对结构体变量的引用为何要体现为分量(或成员)的引用?9-4编写程序求空间任一点到原点的距离,点用结构体描述。
并请考虑求空间中任意两点的距离的程序。
解:#include "stdio.h"#include "math.h'1struct point{float x ;float y;float z;}void main()double dl,d2,d;point pl,p2 ;printfC请输入第一个点的坐标:“);scanf(”%f,%f,%f",&pl.x,&pl.y,&pl.z);printf(u W输入第二个点的坐标:”);scanf(”%f,%f,%f”,&p2.x,&p2.y,&p2.z);d 1 =sqrt(p l.x*p l.x+p l.y*p l.y+p l.z*p l.z);d2=sqrt(p2.x*p2.x+p2.y*p2.y+p2.z*p2.z);d=sqrt((p2.x-p l.x)*(p2.x-p l.x)+(p2.y-p 1 .y)*(p2.y-p l.y)+(p2.z-pl.z)*(p2.z-pl.z));printfC第一个点到原点的距离:%f\n”,dl);printf(“第二个点到原点的距离:%f\n”,d2);printfC俩点间的距离:%f\n”,d);}9-5编写输入、输出10个朋友数据的通讯录程序,每个朋友数据包括姓名、地址、邮编、电话、传呼、手机等数据。
第9章结构体与共用体9.1典型考试题剖析9.1.1选择题【例1】若指针p已经正确定义,要使p指向两个连续的整型动态存储单元,不正确的语句是。
A) p=2*(int *)malloc(sizeof(int)); B) p=(int*)malloc(2*sizeof(int));C) p=(int *)malloc(2*2); D) p=(int*)calloc(2,sizeof(int));✧考点:动态存储分配函数。
✧分析:根据动态存储分配函数malloc和calloc的函数原型可以知道,calloc函数的调用形式为:void * calloc(unsigned n,unsigned size);表示在动态存储区中分配n个长度为size的连续空间,函数返回一个指向分配域起始地址的指针,因此答案D是正确的。
malloc函数的调用形式为:void * malloc(unsigned int size);表示是在内存的动态存储区分配一个长度为size的连续空间,并返回一个指向分配域起始地址的指针,答案B和C中malloc的参数分别为:2*(sizeof(int))和2*2,都是整型数,因此调用形式正确。
答案A中(int *)malloc(sizeof(int))的返回值为一个地址值,将地址的值乘以2是没有意义的。
✧答案:A【例2】若有以下说明和定义:struct test{ int m1; char m2; float m3;union uu{ char u1[5]; int u2[2]; }ua;}myaa;则sizeof(struct test)的值是。
A) 12 B) 16 C) 14 D) 9✧考点:结构体类型和共用体类型所占内存的字节数。
✧分析:sizeof(struct test)的功能是求结构体类型test所占用的内存字节数。
它应该等于结构体每个成员所占的字节数之和。
m1为int型,占2字节,m2为char型,占1字节,m3为float型,占4字节,接下来是一个共用体类型uu,共用体所占的字节数应该等于成员中最长者所占的字节数,u1占5字节,u2占4字节,那么该共用体类型应该占用5字节,所以2+1+4+5=12。
试题汇编之:结构体与共用体一.选择题1.共用体定义为“union data{char ch;int x;}a;”下列语句正确的是。
A:a.ch=‟x‟;a=10; B:a a=‟x‟,10;C:a.x=10;a.ch=‟x‟; D:a=‟x‟;2.共用体定义为“union data{char ch;int x;}a;”下列语句不正确的是。
A:a={…x‟,10}; B:a.x=10;a.x++;C:a.ch=‟x‟;a.ch++; D:a.x=10;a.ch=‟x‟;3.对于:struct node{double x;char c;}*p;下列哪个赋值是错的。
A:p->x=2B:p.x=2.0 C.p->c=2 D.(*p).c=‟a‟4.对于以下结构定义:struct{int len;char *str;}*p;(*p)->str++中的++加在。
A:指针str上B:指针p上. C.str所指的内容上 D:表达式语法有错5.对如下定义:struct{char a1;int a2;}xx; union{char a1;int a2;int a3;}yy;如果sizeof(xx)的值为3,则sizeof(yy)的值应为:A:2 B:4 C:5 D:定义有错6.以下结构体变量定义语句中错误的是。
A.struct staffer{ long int code; float salary;} one;B.struct staffer{ long int code; float salary;} staffer one;C.typedef struct { long int code ; float salary;} STAFFER;D.struct { long int code; float salary; }one;-7.形如上题中定义的结构体变量,下列对此变量的输入形式中正确的是。
第10章结构体与共用体1.以下叙述中错误的是()。
A) 可以通过typedef增加新的类型B) 可以用typedef将已存在的类型用一个新的名字来代表C) 用typedef定义新的类型名后,原有类型名仍有效D) 用typedef可以为各种类型起别名,但不能为变量起别名参考答案:A【解析】关键字typedef的作用只是将C语言中的已有的数据类型作了置换,并不是增加新的类型,所以A)错误。
2.以下关于typedef的叙述错误的是A) 用typedef可以增加新类型B) typedef只是将已存在的类型用一个新的名字来代表C) 用typedef可以为各种类型说明一个新名,但不能用来为变量说明一个新名D) 用typedef为类型说明一个新名,通常可以增加程序的可读性参考答案:A【解析】typedef并不是增加了新类型,而是用一个新名字替代已存在的类型,不能为变量说明一个新名,使用typedef可以增强移植性。
所以A选项错误。
3.若有以下语句typedef struct S{ int g; char h; } T;以下叙述中正确的是A) 可用S定义结构体变量B) 可用T定义结构体变量C) S是struct 类型的变量D) T是struct S类型的变量参考答案:B【解析】本题考查typedef重新声明一种结构体类型,那么T为结构体类型,而不是结构体变量,所以B选项正确。
4.设有以下语句typedef struct TT{ char c; int a[4]; } CIN;则下面叙述中正确的是A) CIN是struct TT类型的变量B) TT是struct类型的变量C) 可以用TT定义结构体变量D) 可以用CIN定义结构体变量参考答案:D【解析】本题考查typedef重新声明一种结构体类型,其中CIN为结构体类型名,而不是结构体变量,所以D 选项正确。
5.以下叙述中错误的是A) 可以用typedef将已存在的类型用一个新的名字来代表B) 可以通过typedef增加新的类型C) 用typedef定义新的类型名后,原有类型名仍有效D) 用typedef可以为各种类型起别名,但不能为变量起别名参考答案:B【解析】本题考查typedef的用法,typedef并不是增加一种新的类型,而是对已存在的类型用一个新的名字来代表,所以B选项错误。
实验九结构体和共用体一,实验目的:1,掌握结构体类型变量的定义和使用.2,掌握结构体类型数组的概念和应用.3,掌握共用体的概念和使用.4,了解链表的概念,初步学会对链表进行操作.二,实验准备:1,复习结构体的概念和定义方法.2,复习共用体的概念和定义方法.3,源程序.三,实验步骤及内容:程序改错typedef union { lo ng x[2];int y[4];char z[8];} MYTYPE;typedef union them;main(){ printf("%d",sizeof(them));}修改后的程序:typedef union { lo ng x[2];int y[4];char z[8];} MYTYPE;MYTYPE them;main(){ printf("%d",sizeof(them));}程序填空以下程序建立了一个带有头结点的单向链表,结点中的数据可由键盘输入,当输入数据为-1时,表示输入结束(链表头结点的data与不放数据,表空的条件是ph―>next==NULL).#include _<stdio.h>_____struct list {int data ;struct list *next ;};_ struct list *creatlist(){ struct list *p, *q, *ph;int a ;ph=(struct list *)malloc(sizeof(struct list));p=q=ph;printf("input an integer number,enter -1 to end :\n");scanf("%d",&a);while (a!=-1){ p=(struct list *)malloc(sizeof(struct list));p->data=a;q->next=p;ph->next=p;scanf("%d",&a);}p->next ="\0";return(ph);}main(){struct list *head;head=creatlist();}3,有5个学生,每个学生的数据包括学号,姓名,三门课成绩,从键盘输入5个学生数据,要求打印出三门课总平均成绩,以及最高分的学生的数据(包括学号,姓名,三门课成绩,平均成绩).要求:用一个input函数输入5个学生数据;用一个average函数求总平均分;用max函数找出最高分学生数据;总平均分和最高分的学生的数据都在主函数中输出.(习题9.5)源程序:#include<stdio.h>#define N 5struct student{char num[6];char name[8];float score[3];float avr;}stu[N];int i,j,maxi;float sum,max,average;void main(){printf("请输入学生信息:\n");for(i=0;i<5;i++){printf("no.:");scanf("%s",stu[i].num);printf("name:");scanf("%s",stu[i].name);for(j=0;j<3;j++){printf("score %d:",j+1);scanf("%d",&stu[i].score[j]);}printf("\n");}average=0;max=0;for(i=0;i<5;i++){sum=0;for(j=0;j<3;j++)sum+=stu[i].score[j];stu[i].avr=sum/3;average+=stu[i].avr;if (sum>max){max=sum;maxi=i;}}average/=N;printf("no. name score1 score2 core3 average\n"); for(i=0;i<N;i++){printf("%5s%10s",stu[i].num,stu[i].name);for(j=0;j<3;j++)printf("%9.2f",stu[i].score[i]);printf("8.2%f\n",stu[i].avr);}printf("average=%5.2f\n",average);printf("highestscore :student %s,%s.\n",stu[maxi].num,stu[maxi].name);printf("hisscore :%6d,%6d,%6d,average: %5.2f\n",stu[maxi].score[0], stu[maxi].score[1],stu[maxi].score[2],stu[maxi].avr);getch();}4,输入和运行以下程序:unio n data{int i[2];float a;long b;char c[4];};main(){unio n data u;scanf("%d,%d",&u.i[0],&u.i[1]);printf("i[0]=%d,i[1]=%d\na=%f\nb=%ld\nc[0]=%c,c[1]=%c,c[2]=%c,c[3]=%c\n",u.i[0],u.i[1],u.a,u.b,u.c[0],u.c[1],u.c[2],u.c[3]);}输入两个整数10000,20000给u.i[0]和u.i[1].分析运行结果.运行结果:分析:定义了共用体变量data.u,将10000,20000分别赋给u.i[0],u.i[1],分别用%d,%c,%f,输出这两个数,得到的结果然后将scanf语句改成:scanf("%ld",&u.b);输入60000给b.分析运行结果.源程序:unio n data{int i[2];float a;long b;char c[4];};main(){unio n data u;scanf("%ld",&u.b);printf("i[0]=%d,i[1]=%d\na=%f\nb=%ld\nc[0]=%c,c[1]=%c,c[2]=% c,c[3]=%c\n",u.i[0],u.i[1],u.a,u.b,u.c[0],u.c[1],u.c[2],u.c[3]);getch();运行结果:分析:原来的程序:结构体中的数组i被赋值10000和20000,并且也没有超过32767的范围;但其他的变量没有初始值;改后的程序:只有b的值是被赋值的;四,实验报告:1,根据下列程序段回答问题:struct data{int i;char ch;float f;}a;uno in data{int i;char ch;float f;}b;试问结构体变量a和共用体变量b所占用的字节数各是多少解答:结构体变量a是七个字节,共用体变量b是七个字节2,源程序.3,错误原因及其修改记录.4,实验结果记录.5,实验体会.。
第9章结构体与共用体(参考答案)二. 填空题1.if(a&OxlO==OxlO)2.s=(high&OxffffOOOO) I (low&OxOOOOffff)3.04.30 4【说明】此题考查的是结构体类型变量分配的空间,结构体变量a所需的空间是各成员之和,成员num占6个字节,成员s是数组,占16个字节,成员ave占8个字节。
结构体指针变量p 在内存所占字节数是4个字节,用于存放相同类型的地址。
5.80【说明】共用体类型STU定义的数组分配的是一块连续的存储空间,其长度为数组长度X共用体最大成员空间=5X 16.6.No:1001N ame: WangzhenBirthday: 1990/12/9*三. 编程题1、定义一个结构体变量(包括年、月、日),计算该日在本年中是第几天。
【程序分析:】以3月5日为例,应该先把前两个月的加起来,然后再加上5天即本年的第几天,特殊情况,闰年且输入月份大于3时需考虑多加一天。
【程序源代码:】#include <stdio.h>struct(int day;int month;int year;}date;int main()( intdays[13]={0,31,28,31,30,31,30,31,31,30,31,30,31}; 〃每月的天数从下标为1 开始int sumdays=O,leap;printf(u\nplease input year,month,day\n n);scanf("%d,%d,%d",&date.year,& date.month,& date.day);〃计算正常年份month月以前的天数for(int i= 1 ;i<date.month;i++)"5(^林第2章数据类型、运算符与表达式sumdays+=days[i];sumdays+=date.day; 〃再加上当月的天数if(date.year%400==0ll(date.year%4==0&&date.year%100!=0))/* 判断是不是闰年*/leap=l;elseleap=O;if(leap== 1 &&date.month>2)/*如果是闰年且月份大于2,总天数应该加一天*/ sumdays++;printf("It is the %dth day.",sumdays);}2、针对【例9.11】做修改,对任意班级学生的基本信息和成绩进行管理,学生的基本信息包括: 学号、姓名、3门课的成绩,要求编写用户函数分别实现学生基本信息输入、总成绩计算、最高分学生的查找、学生信息排序(按学生总成绩从高到低)、输出最高分学生的信息,输出所有学生的信息功能。