结构体.docx

上传人:b****5 文档编号:30262357 上传时间:2023-08-13 格式:DOCX 页数:29 大小:38.51KB
下载 相关 举报
结构体.docx_第1页
第1页 / 共29页
结构体.docx_第2页
第2页 / 共29页
结构体.docx_第3页
第3页 / 共29页
结构体.docx_第4页
第4页 / 共29页
结构体.docx_第5页
第5页 / 共29页
点击查看更多>>
下载资源
资源描述

结构体.docx

《结构体.docx》由会员分享,可在线阅读,更多相关《结构体.docx(29页珍藏版)》请在冰豆网上搜索。

结构体.docx

结构体

7.1知识要点

1.1. 掌握结构的概念和结构类型的定义;

2.2. 掌握结构变量的定义和初始化;

3.3. 掌握结构体指针变量的定义和运算;

4.4. 掌握结构成员的访问、结构赋值的含义以及结构与指针、函数的关系;

5.5. 掌握函数的参数为结构体类型时,参数之间的正确传递;

6.6. 了解共用体定义、变量定义和对共用体变量进行的操作;

7.7. 了解枚举类型定义,变量定义主和对枚举型变量进行的操作;

8.8. 掌握用typedef定义数据类型。

7.2典型例题分析与解答

例题1:

下列结构体定义,正确的是()。

A.B.

record{structrecord{

intno;intno;

charnum[16];charnum[16];

floatscore;floatscore;

};}

C.D.

structrecord{structrecord{

intno;intno

charnum[16];charnum[16]

floatscore;};floatscore}

答案:

C

分析:

结构体类型定义必须以关键字struct开头,即A不正确,不能选择。

D中结构体中定义成员语名没有用分号结束,故不正确,不能选择D。

根据结构体类型说明形式要求必须用分号结束,所以B和C中,只能选择C。

 

例题2:

下列声明结构体变量错误的是()。

 

A.structstudentB.structstudent

{{

   intno;intno;

charname[16];charname[16];

}st1,st2;};

structstudentst1,st2;

 

C.D.

structstudent{structstudent{

intno;intno;

charname[16];charname[16];

};};

studentst1,st2;structst1,st2;

答案:

D

分析:

结构体变量定义有两种方式,一是在定义结构体类型时说明结构体变量,如A,即A是正确的。

二是用结构体类型说明结构体变量。

如B和C,即B和C也是正确。

不能只用结构体关键字去说明结构体变量,即D不正确,只能选择D。

 

例题3:

设有以下说明,则正确的赋值表达式为(  )。

 structx

{intno;charname[20];floatscore;}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.deletep;q->next=p->next;

C.q->next=p->next;deletep;D.p=p->next;q->next=p;deletep;

答案:

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:

设有以下定义枚举型,则元素green值是(    )。

enumcolor{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:

写出下列程序运行结果:

 #include

structpiont

{intx; inty; } st[5]={1,2,3,4,5,6,7,8,9,10};

voidmain()

{inti;

  piont*p;

  p=st;

  for(i=0;i<5;i++)

{cout<x<<'\t'<y<

p++; }

}

运行结果是:

1 2

34

56

78

99                               10

分析:

st是一个结构体数组,p是结构体指针变量,并取得结构体数组首地址,p->x和p->y分别表示结构体两个成员,所以运行结果如上所示。

 

例题8:

下列函数average功能是计算10名学生3门课成绩的平均分,请填空。

#include

constintm=3;

constintn=10;

structstud{

intno;

charname[16];

floatmark[m];

floatave;

};

voidaverage(studst[])

{inti,j;

floatsum;

for(i=0;i

{sum=

(1);//1

for(j=0;j

sum=

(2);//2

(3)=sum/m;//3

}

}

voidmain()

{studpreson[n];

.

.

.

average(preson);

.

.

.

}

答案:

(1)0.0

(2)sum+st[i].mark[j](3)st[i].ave

分析:

结构体数组定义和结构体成员的表示可得到上述结果。

 

例题9:

函数findbook的功能是:

在有n个元素的数组s中查找名为a的书若找到,函数返回数组下标,否则,函数返回-1,请填空。

structdata

{intid;

charname[20];

doubleprice;

}book[100];

intfindbook(datas[],intn,chara[])

{inti;

for(i=0;i

if(

(1))returni;//1

(2);//2

}

答案:

(1)strcmp(s[i].name,a)==0

(2)return-1

分析:

根据结构体定义和字符串比较函数。

 

例题10:

学生姓名(name)和年龄(age)存于结构体数组person中,函数fun的功能是:

找出年龄最小的那名学生,找出程序错误,并改正。

#include

structstud{

charname[20];

intage;

};

fun(studperson[],intn)//1

{intmin;

min=0;

for(i=0;i

if(person[i]

return(person[min]);

}

voidmain()

{studa[]={{"Zhao",21},{"Qian",20},{"Sun",19},{"LI",22}};

intn=4;

studminpers;

minpers=fun(a,n);

cout<<"年龄最小者是:

"<

}

答案:

(1)studfun(studperson[],intn)

(2)for(inti=0;i

(3)person[i].age

分析:

(1)

(1)   函数fun的返回值是结构体类型,所示的返回类型也必须是结构体类型,即studfun(studperson[],intn)。

(2)

(2)   变量i在函数fun中定义,在循环语句中必须说明。

(3)(3)   因为是找年龄最小的记录,在比较时应该是比较成员年龄。

 

例题11:

利用第3题定义的结构体类型,编写一个小型的班级同学信息的管理系统。

要求至少设有以下实用功能:

录入学生信息,求某门或各门课程的总分、平均分,按姓名或学号寻找学生的记录并显示,浏览学生信息,按指定的若干门课程或按总分由高到低显示学生信息等。

#include

#include

#include

charch[80];

structstud

{intno;

charname[20];

intmath;

inteng;

intc;

intsum;

}st[10];

intn=-1;

voidinputst()//输入学生记录

{intx=1;

cout<<"请输入学生学号、姓名、数学、英语、C++成绩,学号为0 结束"<

while(x)

{cin>>x;

if(x){n++;st[n].no=x;

cin>>st[n].name>>st[n].math>>st[n].eng>>st[n].c;

st[n].sum=st[n].math+st[n].eng+st[n].c;

}

elsebreak;

}

}

voidshow()     //显示学生记录

{inti;chary;

cout<<"学号"<<""<<"姓名"<<""<<"数学"<<""<<"英语"<<"";

cout<<<<"C++"<<""<<"总分"<

for(i=0;i<=n;i++)

{cout<

cout<

cout<<"按任意键继续"<

cin>>y;

}

voidlocat()       //查找

{inti,yn=1,x;chary;

charname[20];

cout<<"\t\t"<<"1.按姓名查找\n";

cout<<"\t\t"<<"2.按学号查找\n";

cout<<"请选择(1--2)";

cin>>yn;

if(yn==1)

{cout<<"\t\t输入姓名 ";

cin>>name;

for(i=0;i<=n;i++)

if(strcmp(st[i].name,name)==0)break;

if(i<=n)

{cout<

cout<

elsecout<<"没有找到\n";

}

else

{cout<<"输入查询学号";

cin>>x;

for(i=0;i<=n;i++)

if(st[i].no==x)break;

if(i<=n)

{cout<

cout<<<

elsecout<<"没有找到\n";

}

cout<<"按任意键继续"<

cin>>y;

}

voidaverage()

{inti,j=1,k;

inta[3]={0,0,0};

for(k=0;k<=n;k++)

{a[0]+=st[k].math;a[1]+=st[k].eng;a[2]+=st[k].c;}

while(j)

{

cout<<"\t\t1.数学\n";

cout<<"\t\t2.英语\n";

cout<<"\t\t3.C++\n";

cout<<"\t\t4.各门课\n";

cout<<"\t\t0.退出\n";

cout<<"请选择(0--4)";

cin>>i;

switch(i)

{case1:

cout<<"数学总分:

"<

"<

case2:

cout<<"英语总分:

"<

"<

case3:

cout<<"C++总分:

"<

"<

case4:

cout<<"数学总分:

"<

"<

cout<<"英语总分:

"<

"<

cout<<"C++总分:

"<

"<

case0:

j=0;

}

}

}

voidsortmath();

voidsorteng();

voidsortc();

 

voidsort()//输出

{intx,y=1;

while(y)

{

cout<<"\t\t1.数学排序\n";

cout<<"\t\t2.英语排序\n";

cout<<"\t\t3.C++排序\n";

cout<<"\t\t0.退出\n";

cout<<"请选择(0--3)";

cin>>x;

switch(x)

{case1:

sortmath();break;

case2:

sorteng();break;

case3:

sortc();break;

case0:

y=0;

}

}

}

voidmain()//主程序

{inti,j=1;

while(j)

{system("cls");//清除屏幕

cout<<"\n";

cout<<"\t\t"<<"1.录入学生记录\n";

cout<<"\t\t"<<"2.求课程总分和平均分\n";

cout<<"\t\t"<<"3.显示学生信息\n";

cout<<"\t\t"<<"4.查找学生信息\n";

cout<<"\t\t"<<"5.排    序\n";

cout<<"\t\t"<<"0.退    出\n";

cout<<"请选择(0--5)";

cin>>i;

switch(i)

{case1:

inputst();break;

case2:

average();break;

case3:

show();break;

case4:

locat();break;

case5:

sort();break;

case0:

j=0;break;

default:

cout<<"数字选择错误,请重新输入。

";

}

}

cout<<"谢谢光临!

再见!

\n";

}

voidsortmath()

{inti,j;

studk;

for(i=0;i

for(j=0;j

if(st[j].math

{k=st[j];

st[j]=st[j+1];

st[j+1]=k;

}

cout<<"学号"<<""<<"姓名"<<""<<"数学"<<""<<"英语";

cout<<""<<"C++"<<""<<"总分"<

for(i=0;i<=n;i++)

{cout<

cout<

}

}

voidsorteng()

{inti,j;

studk;

for(i=0;i

for(j=0;j

if(st[j].eng

{k=st[j];

st[j]=st[j+1];

st[j+1]=k;

}

cout<<"学号"<<""<<"姓名"<<""<<"数学"<<""<<"英语"<<"";

cout<<"C++"<<""<<"总分"<

for(i=0;i<=n;i++)

{cout<

cout<

}

voidsortc()

{inti,j;

studk;

for(i=0;i

for(j=0;j

if(st[j].c

{k=st[j];

st[j]=st[j+1];

st[j+1]=k;

}

cout<<"学号"<<""<<"姓名"<<""<<"数学"<<""<<"英语"<<"";

cout<<"C++"<<""<<"总分"<

for(i=0;i<=n;i++)

{cout<

cout<<""<

}

分析:

本题功能要求较多,程序比较长,采用模块求解,根据题目要求分解为若干个模块,即学生信息录入模块、显示模块、每门总分和平均分模块、查找模块、按成绩排序模块。

为了方便各个模块之间传递数据,定义了一个全局变量的记录数组,程序的运行采用菜单方式,方便操作。

 

7.3教材习题分析与解答

1.选择题

(1)下列关于结构体的说法错误的是()。

A.结构体是由用户自定义的一种数据类型

B.结构体中可设定若干个不同数据类型的成员

C.结构体中成员的数据类型可以是另一个已定义的结构体

D.在定义结构体时,可以为成员设置默认值

答案:

D

分析:

结构体是C++用户自定义的一种构造数据类型,它可以有若干个不同类型的成员,也可以有相同类型成员,在这些成员中可以前所有定义的数据类型,但是在定义结构类型时,成员函数不能设定默认值,所以A、B、C说法无正确,不能选择,只有D的说法是错误的。

 

(2)下列结构体定义,正确的是()。

A.B.

recordstructrecord

{intno;{intno;

charnum[16];charnum[16];

floatscore;floatscore;

};}

C.D.

structrecordstructrecord

{intno;{intno

charnum[16];charnum[16]

floatscore;};floatscore}

答案:

C

分析:

见本章例1

 

(3)下列声明结构体变量错误的是()。

A.structstudentB.structstudent

{intno;{intno;

charname[16];charname[16];

}st1,st2;};

structstudentst1,st2;

C.D.

structstudentstructstudent

{intno;{intno;

charname[16];charname[16];

};};

studentst1,st2;structst1,st2;

答案:

D

分析:

见本章例2

 

(4)若有同下定义,下列说法错误的是()。

structem{

  chara;

  charb;

}

A.struct是结构体类型关键字B.em是结构体类型名

 C.em是用户声明的结构体变量D.a,b是结构体成员名

答案:

C

分析:

由结构体类型定义可知,em是定义的结构体类型名,所以C是错误的,其它选项都是正确的,所以选择C。

 

(5)若有下列定义,则对结构体变量的成员引用错误的是()。

structdate{intyear;intmonth;intday;}

structstudent{

intno;

charname[16];

datebirthday;

}stud;

A.stud.noB.stud.name

 C.stud.birthdayD.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)若有下列定义,则错误的赋值语句是()。

enumcolor{red,yellow,blue,green}col;

intk;

A.col=redB.col=3

C.k=red+2D.k=red+blue

答案:

B

分析:

由枚举定义知,enum是自定义枚举类型,它有元素red、yellow、blue和green,col是枚举类型的一个变量,它的值应该是枚举元素之一,不能够取整形数,所以A不正确,B正确。

由枚

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > PPT模板 > 其它模板

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1