第6章 自定义数据类型思考与练习题答案.docx
《第6章 自定义数据类型思考与练习题答案.docx》由会员分享,可在线阅读,更多相关《第6章 自定义数据类型思考与练习题答案.docx(10页珍藏版)》请在冰豆网上搜索。
第6章自定义数据类型思考与练习题答案
第6章自定义数据类型
1、什么叫结构体数据类型?
答:
结构体数据类型是由若干个数据成员组成的构造类型,每个成员可以是一个基本的数据类型,也可以是一个已经定义的构造数据类型,各个成员占据不同的存储空间。
2、什么叫联合体数据类型?
答:
联合体数据类型是一种混合数据使用的数据类型,它的各个成员虽然是存储不同数据类型的数据,但使用时改变其一个数据成员的数值将会影响其它数据成员的数值,各个成员共享其占用空间最多的成员所分配的存储空间。
3、在C++语言中,请说明结构体和联合体的异同点。
答:
结构体数据类型的变量可以同时存储int、long、char和double型等已有数据类型的数据,这些数据使用不同的存储空间,而联合体虽然表面上可以存储int、long、char或double等已有数据类型的数据,但它们共享其占用空间最多的成员所分配的存储空间,对某个成员赋值将影响其它成员的数值。
4、结构体数据作为参数在函数间传递有哪几种方式?
请指出它们的异同点。
答:
结构体作为参数在函数之间进行传递主要有下列三种方式:
复制传递方式:
把调用函数中结构体实参的值复制给被调用函数的形参构体
地址传递方式:
将调用函数中实参结构体的地址传递给被调用函数形参的结构体指针。
引用方式:
被调用函数的形参应该说明为引用结构体变量形式。
实际上,它是为实参结构化起一个别名。
另外,还可以通过全局变量的方式在函数间进行数据传递,但这种方式不好,增加函数之间的耦合性。
地址传递方式要比复制方式效率高。
结构体复制传递方式需要对实参做一个备份,它把一个结构体变量作为参数传递,但要将结构体全部成员值一个一个传递,费时间又费空间,开销大。
如果结构体的成员较多,则程序运行效率会大大降低,而采用地址传递方式将结构体变量的地址作为函数参数比较好,能提高运行效率。
复制传递方式不影响调用函数实参的数值,而地址传递方式有可能影响实参的数值。
5、编写程序定义一个结构体数据类型并说明一个结构体数据类型的数组,然后说明个结构体指针变量,通过指针变量输出该数组中各元素的值,要求输出结果如下所示:
学号姓名数学C++
1张三8798
2李四6782
3王刚5460
4刘丽10090
5陈军8895
答:
程序代码如下:
#include
#include
typedefstruct{
charNumber[12];//存放学生学号
charName[12];//存放学生姓名
//intEnglishScore;//存放学生英语成绩
intMathScore;//存放学生数学成绩
intCPPScore;
}student;
voidmain()
{
intn=0;
studentst[10];//说明一个Student的结构体变量数组
student*p;
p=st;
cout<<"请输入学生的人数内n=";
cin>>n;
for(inti=0;i{
cout<<"请输入第"<
";
cin>>p->Number;
cout<<"请输入第"<
";
cin>>p->Name;
cout<<"请输入第"<
";
cin>>p->MathScore;
cout<<"请输入第"<
";
cin>>p->CPPScore;
p++;
}
cout<cout<<"学号"<<"姓名"<<"数学"<<"C++"<for(intj=0;j{
p--;
cout<Number<<""<Name<<""<<
p->MathScore<<""<CPPScore<}
}
6、若定义结构体数据类型和说明其变量如下
structMyData
{
inta;
floatb;
charc[3]
};
MyDatax={10,1.0f,"ab"},*y=&x;
则经过x.c[1]++,(y->b)+=10+x.a++;运算,x的各分量结果是什么?
答:
{11,21.0,"ac"}
7、若定义联合体数据类型如下所示:
unionMyUnion
{
charx[2];inty;
};//设int占4个字节
则经过MyUnionMyKey;*pKey=&MyKey;pKey->y=0,pKey->x[0]='1';运算之后,表达式(*pKey).y的结果是什么?
答:
结果是:
49。
8、阅读下列程序,写出结果。
(1)#include
#include
#include
#include
structStudent
{
charname[20];intnum;floatscore[3];
};
voidprint(structStudent*p)
{
cout<num<<"\n"<name<<"\n"<score[0]<<"\n"
<score[1]<<"\n"<score[2]<<"\n";
cout<<"";
}
voidmain()
{
structStudentstu;
stu.num=12345;
strcpy(stu.name,"lili");
stu.score[0]=67.5;
stu.score[1]=89;
stu.score[2]=78.6;
print(&stu);
}
答:
运行结果是:
12345
lili
67.5
89
78.6
(2)#include
structStudent
{
intnum;charname[10];intage;
};
voidfun(Student*p)
{cout<<(*p).name<voidmain(void)
{
Studentstu[3]={{9801,"Zhang",20},{9802,"Long",21},{9803,"Xue",19}};
fun(stu+2);
}
答:
运行结果是:
xue
(3)#include
structab
{chara;floatb;};
voidf(ab&y)
{y.a='W';y.b=90.5;}
voidmain()
{
abx={'L',89.5};f(x);
cout<}
答:
运行结果是:
W90.5
(4)#include
voidmain(void)
{
enumcolor{RED=1,GREEN=6,BLUE=9};
enumcolorv1=RED,v2;
cout<<"RED="<cout<<"GREEN="<cout<<"BLUE="<cout<<"v1="<v2=GREEN;
cout<<"(v1}
答:
运行结果是:
RED=1
GREEN=6
BLUE=9
v1=1
(v19、定义一个日期结构体数据类型,由年、月、日3个整型数据组成,用该结构体类型说明一个结构体变量并初始化为一个日期,计算该日期是本年度的第几日。
答:
#include
structdate//定义包含年月日的结构体
{
intyear;
intmonth;
intday;
};
boolTest(dated)//判断输入的年月日是否有误
{
boolk=true;
if(d.year<1)
{
k=false;
cout<<"你输入的年月日有误"<}
if((d.month<1)||(d.month>12))
{
k=false;
cout<<"你输入的年月日有误"<}
if((d.month==1)||(d.month==3)||(d.month==5)||(d.month==7)
||(d.month==8)||(d.month==10)||(d.month==12))
{
if((d.day<1)||(d.day>31))
{
k=false;
cout<<"你输入的年月日有误"<}
}
if((d.month==4)||(d.month==6)||(d.month==9)||
(d.month==11))
{
if((d.day<1)||(d.day>30))
{
k=false;
cout<<"你输入的年月日有误"<}
}
if(d.month==2)
{
if(((d.year%4)==0)&&((d.year%100)!
=0))
{
if((d.month<1)||(d.month>29))
{
k=false;
cout<<"你输入的年月日有误"<}
}
elseif((d.month<1)||(d.month>28))
{
k=false;
cout<<"你输入的年月日有误"<}
}
returnk;
}
intmonth[12]={31,28,31,30,31,30,31,31,30,31,30,31};
boolleapyear(dated)//判断输入的年是否为润年
{
if(((d.year%100==0)&&(d.year%400==0))||((d.year%100!
=0)&&(d.year%4==0)))
returntrue;
else
returnfalse;
}
intaccount(dated)//计算输入日期为该年的第几天
{
inti;
intsum=0;
for(i=0;isum+=month[i-1];
if(leapyear(d)&&d.month>2)
sum=sum+1;
sum=sum+d.day;
returnsum;
}
voidmain()
{
inty,m,d;
cout<<"请输入年月日";
cin>>y>>m>>d;
dateda;
da.year=y;
da.month=m;
da.day=d;
if(Test(da))
{
cout<<"你输入的日期是本年的"<}
}
10、使用typedef定义一个职工结构类型的类型,然后定义一个该自定义类型的变量,该职工包括编号、姓名、性别、出生日期和住址。
日期包括年、月、日。
〕
答:
#include
typedefstruct{//定义生日的结构体
intyear;
intmonth;
intday;
}birthday;
typedefstruct{//定义职工的结构体
charnumber[100];
charname[100];
charsex[100];
charaddress;
birthdaybirt;
}worker;
voidmain()
{
workerw;
cout<<"请输入职工的编号:
";
cin>>w.number;
cout<<"请输入职工的姓名:
";
cin>>w.name;
cout<<"请输入职工的性别:
";
cin>>w.sex;
cout<<"请输入职工的住址:
";
cin>>w.address;
cout<<"请输入职工的出生年月:
";
cin>>w.birt.year>>w.birt.month>>w.birt.day;
cout<cout<<"编号:
"<<"姓名"<<"性别"<<"住址"<<"出生年月"<cout<}