1、结构体7.1知识要点1 1 掌握结构的概念和结构类型的定义;2 2 掌握结构变量的定义和初始化;3 3 掌握结构体指针变量的定义和运算;4 4 掌握结构成员的访问、结构赋值的含义以及结构与指针、函数的关系;5 5 掌握函数的参数为结构体类型时,参数之间的正确传递;6 6 了解共用体定义、变量定义和对共用体变量进行的操作;7 7 了解枚举类型定义,变量定义主和对枚举型变量进行的操作;8 8 掌握用typedef定义数据类型。7.2典型例题分析与解答例题1:下列结构体定义,正确的是( )。A Brecord struct record int no; int no; char num16; cha
2、r num16;float score ; float score ; ; C Dstruct record struct record int no; int no char num16; char num16 float score ; ; float score 答案:C分析:结构体类型定义必须以关键字 struct 开头,即A不正确,不能选择。D中结构体中定义成员语名没有用分号结束,故不正确,不能选择D。根据结构体类型说明形式要求必须用分号结束,所以B和C中,只能选择C。例题2:下列声明结构体变量错误的是( )。Astruct student B struct student int
3、no; int no;char name16; char name16; st1,st2; ;struct student st1,st2;C Dstruct student struct student int no; int no;char name16; char name16; ; ;student st1,st2; struct st1,st2;答案:D分析:结构体变量定义有两种方式,一是在定义结构体类型时说明结构体变量,如A,即A是正确的。二是用结构体类型说明结构体变量。如B和C,即B和C也是正确。不能只用结构体关键字去说明结构体变量,即D不正确,只能选择D。例题3: 设有以下说明
4、,则正确的赋值表达式为()。struct x int no; char name20; float score; y; A. y.no=10; B. y-no=10; C. x.no=10; D. x-n0=10;答案:A分析:引用结构体成员是普通变量是:变量.成员,引用结构体指针变量是:变量-成员。例题4: 若已建立如下链表结构,指针p,q分别指向如下图所示的结点,用以将p所指向结点从链表中删除并释放该结点的正确程序段是()。结点结构A. q-next =p-next B. delete p;q-next=p-next;C. q-next=p-next; delete p; D. p=p-n
5、ext; q-next=p; delete p;答案:C分析:A虽然在单链表中,把结点p跳过,但是结点p所占内存空间没有释放。B是先释放结点p所占内容空间,以下操作均不正确了。C在单链表中,把结点p跳过,也将结点p所占内存空间释放,所以正确。D在单链表中,先把p从结点2移到下一个结点3,再将q -next连到结点3,即跳过结点2,但是删除的是结点3而不是结点2,不正确。例题5:在定义一个共用体变量时,系统为其分配存储空间的原则是()。A A 按所有成员需要的存储空间总和分配。B B 按成员中占存储空间最大者分配。C C 按成员占存储空间最小者分配。D D按第一个成员所需的存储空间分配。答案:B
6、分析:根据共用体定义规则,系统为其分配存储空间是按其成员中占存储空间最大者分配。例题6:设有以下定义枚举型,则元素green值是()。enum color red=2, yellow, blue, green;A.5 B.4 C.3 D.以上答案均不正确答案:A分析:由枚举定义知,enum是自定义枚举类型,它有元素red、yellow、blue和green,由枚举定义知,枚举类型的每个元素,都有一个在定义时按元素位置从左到右默认值,依次是0,1,2,。本题中red的起始值是2,所以以后各元素值依次为3,4,5。故green的值是5。例题7:写出下列程序运行结果:#includestruct p
7、iont int x; int y;st5=1,2,3,4,5,6,7,8,9,10;void main() int i; piont *p; p=st; for(i=0;i5;i+) coutxtyx和p-y分别表示结构体两个成员,所以运行结果如上所示。例题8:下列函数average功能是计算10名学生3门课成绩的平均分,请填空。#includeconst int m=3;const int n=10;struct stud int no; char name16; float markm; float ave;void average(stud st)int i,j; float sum;
8、 for(i=0;in;i+) sum= (1) ; / 1 for(j=0;jm;j+) sum= (2) ; /2 (3) =sum/m; /3 void main()stud presonn; . . . average(preson); . . .答案:(1) 0.0 (2)sum+sti.markj (3)sti.ave分析:结构体数组定义和结构体成员的表示可得到上述结果。例题9:函数findbook的功能是:在有n个元素的数组s中查找名为a的书若找到,函数返回数组下标,否则,函数返回-1,请填空。struct data int id; char name20; double pri
9、ce; book100;int findbook(data s,int n,char a)int i; for(i=0;in;i+) if( (1) ) return i; /1 (2) ; /2答案:(1) strcmp(si.name, a)= = 0(2) return -1分析:根据结构体定义和字符串比较函数。例题10:学生姓名(name)和年龄(age)存于结构体数组person中,函数fun的功能是:找出年龄最小的那名学生,找出程序错误,并改正。#includestruct stud char name20; int age; ;fun (stud person,int n) /
10、1 int min; min=0; for(i=0;in;i+) / 2 if(personi personmin ) min=i; /3 return (personmin);void main() stud a=Zhao,21,Qian,20,Sun,19,LI,22; int n=4; stud minpers; minpers=fun(a,n); cout年龄最小者是:minpers.name minpers.ageendl;答案:(1) stud fun (stud person,int n) (2) for(int i=0;in;i+) (3) personi.agepersonm
11、in.age)分析:(1) (1) 函数fun 的返回值是结构体类型,所示的返回类型也必须是结构体类型,即stud fun (stud person,int n)。(2) (2) 变量i在函数fun中定义,在循环语句中必须说明。(3) (3) 因为是找年龄最小的记录,在比较时应该是比较成员年龄。例题11:利用第3题定义的结构体类型,编写一个小型的班级同学信息的管理系统。要求至少设有以下实用功能:录入学生信息,求某门或各门课程的总分、平均分,按姓名或学号寻找学生的记录并显示,浏览学生信息,按指定的若干门课程或按总分由高到低显示学生信息等。#include#include#include char
12、 ch80;struct stud int no; char name20; int math; int eng; int c; int sum; st10;int n=-1; void inputst() /输入学生记录 int x=1;cout请输入学生学号、姓名、数学、英语、C成绩,学号为0结束x; if(x) n+;stn.no=x; cinstn.namestn.mathstn.engstn.c; stn.sum=stn.math+stn.eng+stn.c; else break; void show()/显示学生记录int i;char y; cout学号 姓名 数学 英语 ;c
13、outC 总分endl; for(i=0;i=n;i+) coutsti.no sti.name sti.math ;coutsti.eng sti.c sti.sumendl; cout按任意键继续y;void locat()/查找int i, yn=1,x;char y; char name20; couttt1. 按姓名查找n; couttt2. 按学号查找n; coutyn;if(yn=1) coutname; for(i=0;i=n;i+) if(strcmp(sti.name,name)=0) break;if(i=n) coutsti.no sti.name sti.math ;
14、coutsti.eng sti.c sti.sumendl;else cout没有找到n; else coutx; for(i=0;i=n;i+) if(sti.no=x) break; if(i=n) coutsti.no sti.name sti.math ;coutsti.eng sti.c sti.sumendl; else cout没有找到n; cout按任意键继续y;void average()int i,j=1,k; int a3=0,0,0; for(k=0;k=n;k+) a0+=stk.math;a1+=stk.eng;a2+=stk.c; while(j) couttt
15、1.数学n; couttt 2.英语n; couttt 3.C+ n; couttt 4.各门课n; couttt 0.退出n; couti;switch(i)case 1: cout数学总分:a0 平均分:a0/(n+1)endl;break;case 2: cout英语总分:a1 平均分:a1/(n+1)endl;break;case 3: coutC总分:a2 平均分:a2/(n+1)endl;break;case 4: cout数学总分:a0 平均分:a0/(n+1)endl; cout英语总分:a1 平均分:a1/(n+1)endl; coutC总分:a2 平均分:a2/(n+1)e
16、ndl;break; case 0: j=0; void sortmath();void sorteng();void sortc();void sort() /输出int x,y=1; while(y) couttt 1.数学排序n; couttt 2.英语排序n; couttt 3.C+排序 n; couttt 0.退出n; coutx; switch(x) case 1:sortmath();break; case 2: sorteng();break; case 3: sortc();break; case 0: y=0; void main() /主程序 int i,j=1; whi
17、le(j) system(cls); /清除屏幕 coutn; couttt1.录入学生记录n; couttt2.求课程总分和平均分n; couttt3.显示学生信息n; couttt4.查找学生信息n; couttt5.排序n; couttt0.退出n; couti; switch(i) case 1: inputst();break; case 2: average();break; case 3: show();break; case 4: locat();break; case 5: sort();break; case 0: j=0; break; default: cout数字选择
18、错误,请重新输入。; cout谢谢光临!再见!n; void sortmath()int i,j; stud k; for(i=0;in;i+) for(j=0;jn-i;j+) if(stj.mathstj+1.math) k=stj; stj=stj+1; stj+1=k; cout学号 姓名 数学 英语;cout C 总分endl; for(i=0;i=n;i+) coutsti.no sti.name sti.math ;coutsti.eng sti.c sti.sumendl;void sorteng()int i,j; stud k; for(i=0;in;i+) for(j=0
19、;jn-i;j+) if(stj.engstj+1.eng) k=stj; stj=stj+1; stj+1=k; cout学号 姓名 数学 英语 ;coutC 总分endl; for(i=0;i=n;i+) coutsti.no sti.name sti.math ;coutsti.eng sti.c sti.sumendl;void sortc()int i,j; stud k; for(i=0;in;i+) for(j=0;jn-i;j+) if(stj.cstj+1.c) k=stj; stj=stj+1; stj+1=k; cout学号 姓名 数学 英语 ;coutC 总分endl;
20、 for(i=0;i=n;i+) coutsti.no sti.name sti.math;cout sti.eng sti.c sti.sumendl;分析:本题功能要求较多,程序比较长,采用模块求解,根据题目要求分解为若干个模块,即学生信息录入模块、显示模块、每门总分和平均分模块、查找模块、按成绩排序模块。为了方便各个模块之间传递数据,定义了一个全局变量的记录数组,程序的运行采用菜单方式,方便操作。7.3教材习题分析与解答1选择题(1)下列关于结构体的说法错误的是( )。A结构体是由用户自定义的一种数据类型B结构体中可设定若干个不同数据类型的成员C结构体中成员的数据类型可以是另一个已定义的
21、结构体D在定义结构体时,可以为成员设置默认值答案:D分析:结构体是C+用户自定义的一种构造数据类型,它可以有若干个不同类型的成员,也可以有相同类型成员,在这些成员中可以前所有定义的数据类型,但是在定义结构类型时,成员函数不能设定默认值,所以A、B、C说法无正确,不能选择,只有D的说法是错误的。(2)下列结构体定义,正确的是( )。A Brecord struct record int no; int no; char num16; char num16;float score ; float score ; ; C Dstruct record struct record int no; in
22、t no char num16; char num16 float score ; ; float score 答案:C分析:见本章例1(3)下列声明结构体变量错误的是( )。Astruct student B struct student int no; int no;char name16; char name16; st1,st2; ;struct student st1,st2;C Dstruct student struct student int no; int no;char name16; char name16; ; ;student st1,st2; struct st1,
23、st2;答案:D分析:见本章例2(4)若有同下定义,下列说法错误的是( )。struct em char a; char b;Astruct是结构体类型关键字 Bem 是结构体类型名 Cem 是用户声明的结构体变量 Da,b是结构体成员名答案:C分析:由结构体类型定义可知,em是定义的结构体类型名,所以C是错误的,其它选项都是正确的,所以选择C。(5)若有下列定义,则对结构体变量的成员引用错误的是( )。struct date int year; int month; int day;struct studentint no;char name16;date birthday; stud;A
24、stud.no B stud.name C stud.birthday D stud.birthday.year答案:C分析:结构体成员表示是结构体变量名.成员名,所以stut.no、stud.name是正确的,A和B不能选择。C中成员birthday类型还是结构体类型,故stud.birthday不正确,应该是stud.birthday.year或stud.birthday.month或stud.birthday.day 。所以选择C。(6)若有下列定义,则错误的赋值语句是( )。enum color red,yellow,blue,green col;int k;A col=red B col=3 C k=red+2 D k=red+blue答案:B分析:由枚举定义知,enum是自定义枚举类型,它有元素red、yellow、blue和green,col是枚举类型的一个变量,它的值应该是枚举元素之一,不能够取整形数,所以A不正确,B正确。由枚
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1