• 619.50 KB
  • 2022-04-29 13:53:01 发布

上海电力学院C++课后习题答案.doc

  • 103页
  • 当前文档由用户上传发布,收益归属用户
  1. 1、本文档共5页,可阅读全部内容。
  2. 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,可选择认领,认领后既往收益都归您。
  3. 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细先通过免费阅读内容等途径辨别内容交易风险。如存在严重挂羊头卖狗肉之情形,可联系本站下载客服投诉处理。
  4. 文档侵权举报电话:19940600175。
'课后习题答案第1章C++及其开发环境概述一、问答题1.结构化程序设计主要有哪些劣势?【答案】(1)程序的开发效率低下(2)程序的可重用性差(3)程序的维护成本高(4)无法适应信息的快速膨胀和多样化2.面向对象的程序设计有哪些优点?【答案】(1)程序的开发效率高(2)程序代码的可重用性高(3)程序易于维护3.C++的发展经历了哪些阶段?【答案】C++语言起源于C语言。1980年初期,美国贝尔实验室的BjarneStroustrup博士及其同事在C语言的基础上,从Simula67中引入面向对象的特征,开发出一种过程性与对象性相结合的程序设计语言,最初称为“带类的C”,1983年正式取名为C++。后来,Stroustrup和他的同事陆续将运算符重载、继承、虚函数等特性引入C++,1989年后推出AT&TC++2.0版,并经过多次改进和完善,发展成为现在的C++。4.C++主要有哪些特点?【答案】(1)C++可以被看成C语言的一个超集,是对C的增强和扩展。因此,许多C代码可以不经修改即可为C++所用。自然,也可以利用C++开发环境来开发C程序。(2)C++几乎支持所有面向对象的程序设计特征,因此,利用C++不仅可以进行传统的结构化程序设计,而且可以较好地进行面向对象的程序开发。(3)C++很好地保持了C的简洁、高效、灵活和接近汇编语言的特点,因此,C++程序的执行效率也很高。5.一个C++程序一般由哪几部分构成?【答案】①预处理命令。C++提供了三种预处理命令,即宏定义命令、文件包含命令和条件编译命令。②全局声明部分。此部分内容通常会给出用户自定义的数据类型声明,以及程序中所涉及变量的定义,例如类的声明。③函数。一个程序中可包含一个或多个函数,它们是执行用户指定操作的主要部分。101 课后习题答案6.使用VisualC++开发C++程序时一般要经过哪几个步骤?每个步骤的作用是什么?相应地产生哪些文件?【答案】(1)编写程序C++是一种高级语言,所以用其编写的程序称为“源程序”,以.cpp做为后缀。我们可以利用VisualC++、TurboC++等编译软件来编写C++源程序。(2)编译程序计算机不能识别高级语言,为了将源程序翻译成计算机可识别的二进制指令,需将源程序进行编译,编译之后的文件称作“目标文件”,以.obj作为后缀。编译时以每个源程序单元为单位,每一个源程序文件编译成一个目标文件。因此,如果一个工程中有多个源程序单元,系统会分别将其编译成多个目标文件。另外,编译时系统会自动进行错误检查,一旦检查出有错误,便不会生成目标文件,需改正后重新编译。(3)连接目标文件一个程序中可能会包含很多文件,编译后会生成很多独立的目标文件,此时系统的“连接程序”将这些目标文件和库文件以及系统提供的其他信息连接起来,形成二进制可执行文件,以.exe为后缀。(4)运行程序运行二进制可执行文件,得到运行结果。如运行结果不正确,则需修改源文件,之后重新编译运行。二、分析运行结果1.#includeusingnamespacestd;intmain(){cout<<"My"<<"sister";cout<<"is"<<"a";cout<<"beautifulgirl!"<usingnamespacestd;intmain(){inta,b,c;101 课后习题答案cin>>a>>b;c=a+b;cout<<"a+b="<=-100&&y<=-10)&&!(y>=10&&y<=100)(6)sqrt(pow((x-10),2)+pow((y-20),2))<35(7)a+b>c&&b+c>a&&c+a>b(8)(year%4==0)&&(year%100!=0)||(year%400==0)四、阅读下列程序,写出执行结果(1)#includeusingnamespacestd;voidmain(){inta=1,b=2,x,y;cout<b;y=x--&&b;cout<usingnamespacestd;voidmain(){intx,y,z,f;x=y=z=1;f=--x||y--&&z++;cout<<"x="<usingnamespacestd;voidmain(){intx,i,j,k;cout<<"pleaseinputx:";cin>>x;i=x/100;j=(x-i*100)/10;k=x-i*100-j*10;cout<usingnamespacestd;voidmain(){floatx,y,b;cout<<"pleaseinputx,y:";cin>>x>>y;b=(-2<=x)&&(x<=2)&&(-2<=y)&&(y<=2);cout<=)0if(x!=0)if(x==0)y=0;if(x>0)y=1;elsey=-1;elsey=0C.if(x<=0)D.y=-1;if(x<0)y=-1;if(x<=0)elsey=0;if(x<0)y=-1;elsey=1;elsey=1;【答案】C2.假设i=2,执行下列语句后i的值为()。switch(i)101 课后习题答案{case1:i++;case2:i--;case3:++i;break;case4:--i;default:i++;}A.1B.2C.3D.4【答案】B3.已知inti=0,x=0;下面while语句执行时循环次数为()。while(!x&&i<3){x++;i++;}A.4B.3C.2D.1【答案】D4.已知inti=3;下面do~while语句执行时循环次数为()。do{i--;cout<=0);C.inta=5;while(a){a--;};D.inti=3;for(;i;i--);【答案】B二、阅读下列程序,写出执行结果1.#includevoidmain(){inta,b,c,d,x;a=c=0;b=1;d=20;if(a)d=d-10;101 课后习题答案elseif(!b)if(!c)x=15;elsex=25;cout<voidmain(){inta=0,b=1;switch(a){case0:switch(b){case0:cout<<"a="<voidmain(){inti=1;while(i<=10)if(++i%3!=1)continue;elsecout<voidmain(){inti=0,j=5;do{i++;j--;if(i>3)break;}while(j>0);cout<<"i="<voidmain(){inti,j;for(i=1,j=5;ivoidmain(){inti,s=0;for(i=0;i<5;i++)switch(i){case0:s+=i;break;case1:s+=i;break;case2:s+=i;break;default:s+=2;}cout<<"s="<voidmain(){inti,j,x=0;for(i=0;i<=3;i++){x++;for(j=0;j<=3;j++){if(j%2)continue;x++;}x++;}cout<<"x="<voidmain(){inta,b,c,t;cout<<"a,b,c=";cin>>a>>b>>c;if(a>b){t=a;a=b;b=t;}if(a>c){t=a;a=c;c=t;}if(b>c){t=b;b=c;c=t;}cout<voidmain(){charfirst,second;cout<<"Firstinput(s,rorp):";cin>>first;cout<<"Secondinput(s,rorp):";cin>>second;switch(first){case"s":switch(second){case"s":cout<<"Scissortiesscissor."<voidmain()101 课后习题答案{intm,i=2;cout<<"pleaseinputm:";cin>>m;while(i<=m)if(m%i==0){cout<voidmain(){inti;for(i=100;i<=200;i++){if((i%3==2)&&(i%5==3)&&(i%7==2))cout<voidmain(){inti,j,s;for(i=1;i<=1000;i++){s=0;for(j=1;jvoidmain(){inti,j,k;for(i=1;i<=5;i++){for(k=1;k<=5-i;k++)cout<<"";for(j=1;j<=2*i-1;j++)cout<<"*";cout<usingnamespacestd;voidincx();voidincy();voidmain(){incx();incy();incx();incy();incx();incy();}voidincx(){intx=0;cout<<"nx="<<++x;}voidincy(){staticinty=0;cout<<"ny="<<++y;}【答案】x=1y=1x=1y=2x=1y=3(2)#includeusingnamespacestd;inti=3;intfun1(intn)101 课后习题答案{cout<shortintDivider(unsignedshortinta,unsignedshortintb){if(b==0)return-1;elsereturna/b;}intmain(){unsignedshortintone,two;shortintanswer;cout<<"Entertwonumbers.nNumberone:";101 课后习题答案cin>>one;cout<<"Numbertwo:";cin>>two;answer=Divider(one,two);if(answer>-1)cout<<"Answer:"<#includevoidmain(){doublef,c,b;cout<<"请输入华氏温度:"<>f;cout<<"对应的摄氏温度为:"<101 课后习题答案#includeintprime(inti);//判断一个数是否是质数的函数voidmain(){inti;cout<<"请输入一个整数:";cin>>i;if(prime(i))cout<#includeintfn1(inti,intj);//求最大公约数的函数voidmain()101 课后习题答案{inti,j,x,y;cout<<"请输入一个整数:";cin>>i;cout<<"请输入另一个整数:";cin>>j;x=fn1(i,j);y=i*j/x;cout<0)次幂。【源程序】#include101 课后习题答案longGetPower(intx,inty);intmain(){intnumber,power;longanswer;cout<<"Enteranumber:";cin>>number;cout<<"Towhatpower?";cin>>power;answer=GetPower(number,power);cout<#includedaynum(int,int,int);voiddate(intyear,intmonth,intday){cout<>year>>month>>day;date(year,month,day);}运行结果为:请输入年/月/日:19840305↙1984030565101 课后习题答案第5章数组与字符串一、选择题:(1)以下一维数组a的正确定义是()。A.inta(10);B.intn=10,a[n];C.intn;D.#defineSIZE10cin>>n;inta[SIZE];inta[n];【答案】D(2)以下能对具有10个元素的一维数组a进行正确初始化的语句是()。A.inta[10]=(0,0,0,0,0);B.inta[10]={10*1};C.inta[]={0};D.inta[10]={};【答案】B(3)在定义inta[10];之后,对a的引用正确的是()。A.a[10]B.a[6.3]C.a(6)D.a[10-10]【答案】D(4)以下对二维数组a进行不正确初始化的是()。A.inta[2][3]={0};B.inta[][3]={{3,2,1},{1,2,3}};C.inta[][]={{3,2,1},{1,2,3}};D.inta[2][3]={{3,2,1},{1,2,3}};【答案】C(5)在执行inta[][3]={1,2,3,4,5,6};语句后,a[1][1]的值是()。A.4B.1C.2D.5【答案】D(6)为了判断两个字符串s1和s2是否相等,应当使用()。A.if(s1==s2)B.if(s1=s2)C.if(strcmp(s1,s2)==0)D.if(strcpy(s1,s2))【答案】C(7)定义如下变量和数组:inti;intx[3][3]={1,2,3,4,5,6,7,8,9};则以下语句的输出结果是()。for(i=0;i<3;i++)cout<voidmain(){charch[7]={"12ab56"};inti,s=0;for(i=0;ch[i]>="0"&&ch[i]<="9";i=i+2)s=10*s+ch[i]-"0";cout<voidmain(){inti,j,row,col,min;inta[3][4]={{1,2,3,4},{9,8,7,6},{-1,-2,0,5}};101 课后习题答案min=a[0][0];for(i=0;i<3;i++)for(j=0;j<4;j++)if(a[i][j]voidmain(){inti,r;chars1[80]="bus",s2[80]="book";for(i=r=0;s1[i]!=""&&s2[i]!="";i++)if(s1[i]==s2[i])i++;else{r=s1[i]-s2[i];break;}cout<voidmain(){inta[4][4]={{1,2,-3,-4},{0,-12,-13,14},{-21,23,0,-24},{-31,32,-33,0}};inti,j,s=0;for(i=0;i<4;i++){for(j=0;j<4;j++){if(a[i][j]<0)continue;if(a[i][j]==0)break;s=s+a[i][j];}}cout<usingnamespacestd;voidmain(){inti,j;staticinta[10]={1,1,1,1,1,1,1,1,1,1};for(i=0;i<10;i++)for(j=0;j#defineN20voidmain(){inta[N],i;for(i=0;i>a[i];for(i=0;ivoidmain(){101 课后习题答案inta[5],max,min,i,j,k=0;for(i=0;i<5;i++)cin>>a[i];min=a[0];for(i=1;i<5;i++)if(_______①______){min=a[i];k=i;}max=a[0];for(i=1;i<5;i++)if(a[i]>max){max=a[i];_______②_______;}a[k]=max;a[j]=min;cout<<"最小数的位置是"<#includevoidinverse(charstr[]){charm;inti,j;for(i=0,j=strlen(str);i<______①______;i++,_____②_____){m=str[i];str[i]=______③______;________④_________;}for(i=0;i=strlen(str)/2。本题答案如下:①strlen(str)/2②j--③str[j-1]④str[j-1]=m四、编程题:(1)编写程序,要求首先输入学生人数(最多为50个人),然后按编号从小到大的顺序依次输入学生成绩(包括语文、数学和英语3门课程的成绩),最后统计每门课程全班的总成绩和平均成绩以及每个学生课程的总成绩和平均成绩。源程序:定义一个score[50][5]数组,score[0]、score[2]分别存储3门课程的分数,score[3]和score[4]分别存储计算出来的总分和平均分;定义total和avg两个长度为3的一维数组,分别存放3门课程的总分和平均分。程序如下:#includevoidmain(){intscore[50][5],total[3],avg[3];inti,j,n;cout<<"学生人数:";cin>>n;cout<<"输入成绩n";for(i=0;i>score[i][0]>>score[i][1]>>score[i][2];}for(i=0;ivoidmain(){inti=0,base,n,j,num[20];cout<<"输入一个十进制数:";101 课后习题答案cin>>n;cout<<"输入要转换的进制:";cin>>base;do{i++;num[i]=n%base;n=n/base;}while(n!=0);cout<<"转换的结果:";for(j=i;j>=1;j--)cout<#defineN100voidmain(){intn,i,j,k;chars1[N],s2[N],s3[2*N];cout<<"主串:";cin>>s1;cout<<"子串:";cin>>s2;cout<<"起始位置:";cin>>n;for(i=0;i#defineN100voidmain(){charstr[N],nstr[N],ch;inti=0,j=0;cout<<"输入字符串:";cin>>str;cout<<"要删除的字符:";cin>>ch;while(str[i]!=""){if(str[i]!=ch){nstr[j]=str[i];j++;}i++;}nstr[j]="";cout<<"删除后的新串:"<#includevoidmain(){charstr[]="computer";inti;for(i=0;ivoidmain(){charch[3][4]={"AAA","BB","CCC"},(*q)[4]=ch,*p;//ch是二维数组,q是指向一维数组指针,并且一维数组每行只有4个字符,q被//赋予二维数组ch首地址inti;p=newchar;//开辟char型数据空间*p="b";//装入字符b*(*q+3)=*p;for(i=0;i<3;i++)cout<voidmain(){int*pn,n=10,m=20;float*pf,px=3.14159,py=2.71828;pn=&n;*pn+=m;cout<<"*pn现在的值是:"<<*pn<voidmain(){inti,*p,a[]={10,20,30,40,50,60};p=a;for(i=0;i<=5;i++){cout<<"a["<intb[4][4]={{10,11,12,13},{14,15,16,17},{18,19,20,21},{22,23,24,25}};voidmain(){int(*a)[4],*p;a=b;//指针变量a,取得二维数组第一行地址p=a[1];//指针变量p,取得二维数组第二行第一列地址for(inti=1;i<=4;p=p+1,i++)cout<<*p<<"t";cout<voidfun(int*&a,int&m){a=newint[m];101 课后习题答案int*p=a;for(inti=0;i#includevoidchange()//1{inti=0;for(i=0;;i++)//2if(a[i]>="a"&&a[i]<="z");//3}voidmain(){charp[80];cin.getline(p,80);//读一行字符,中间可以有空格change(p);cout<#includevoidsort(){char;inti,j;for(i=0;i0(4)p[j]=p[j+1]分析:(1)由实参得知函数sort()有两个形参,根据上题得char*p[],intn。(2)有下面语句temp=p[j]可以得到temp是字符中指针。(3)根据冒泡排序方法和字符串比较函数得到p[j],p[j+1])>0。101 课后习题答案(4)字符串指针可以通过赋值语句传递值,字符串变量不能够使用赋值语句传递值。四、编程题(1)编写程序,使用指针实现两个字符串的首尾连接(提示:将字符串str2接到str1的后面时,str1后面的""被取消)。#includevoidstrcat(char*str1,char*str2){inti,m=0;while(str1[m]!="")m++;//求数组str1长度i=0;while(str2[i]!=""){str1[m+i]=str2[i];i++;}//将字符串str2中有字符依次装入字符串str1中str1[m+i]="";}voidmain(){charstr1[16]="Chinese",str2[]="English";strcat(str1,str2);cout<#includechar*maxstr(char*str[],intn){inti,len,j=0;len=strlen(str[j]);//求数组str[0]长度并赋给变量len//从第2个字符串开始,只要字符串长度大于len,就赋给len并保留其下标for(i=1;ilen){j=i;en=strlen(str[i]);}returnstr[j];101 课后习题答案}voidmain(){char*a[4]={"China","England","American","Canada"};cout<#includevoidswap(char*p,char*q){chartemp[20];strcpy(temp,p);strcpy(p,q);strcpy(q,temp);}voidmain(){chara[20]="hello",*ap=a;charb[20]="howareyou",*bp=b;cout<<"交换前字符串值:n";cout<<"ap="<no、(*p).no(4)若有语句enum{a,b=2,c,d=4,e}k;k=a;则k的值是_______________。0(5)将以下程序的空白处补充完整,程序实现的功能是:查找分数最高和最低的同学,分别输出其姓名和成绩。101 课后习题答案#includevoidmain(){intmax,min,i;staticstruct{charname[8];intscore;}stud[5]={"赵萍",92,"钱兵",72,"孙洋",83,"李虎",88,"周金",95};max=min=0;for(i=1;i<5;i++)if(________________)max=i;elseif(________________)min=i;cout<<"最高分"<<__________________<<","<<_________________<stud[max].scorestud[i].scorestructtree{intx;char*s;}t;func(structtreet){t.x=10;t.s="computer";return(0);}voidmain()101 课后习题答案{t.x=1;t.s="minicomputer";func(t);cout<voidmain(){structstudent{charname[10];floatk1;floatk2;floatk3;}a[2]={{"zhang",100,70,90},{"wang",70,80,90}},*pa=a;cout<name<<":"<k1+pa->k2+pa->k3<structstu{unsignedno;charname[10];intpolitic;intmaths;intenglish;101 课后习题答案intspecial;};voidinput(structstu*q,inti){cout<<"inputstudentinformation:"<>q->no;cin>>q->name;cin>>q->politic;cin>>q->maths;cin>>q->english;cin>>q->special;}}voidenquire(structstu*q,intj,unsigneda){for(inti=0;ino==a){cout<no<<"";cout<name<<"";cout<politic<<"";cout<maths<<"";cout<english<<"";cout<special<<"";}}voidmain(){structstustud[30],*p=stud;unsignednum;input(p,30);cout<<"inputenquiringno:"<>num;enquire(p,30,num);}101 课后习题答案(2)假设某公司有员工200人,员工的信息包括编号、姓名、基本工资、补贴、奖金和应扣款。编写程序,实现对员工工资信息的管理,包括查询和打印工资明细、应发工资和实发工资。参考代码如下:本题是在上题的基础上,加了一些控制功能,由此可见程序的编写其实是很实际简单的事。#includestructmember{unsignedno;charname[10];floatbasewage;floatextrawage;floatbonus;floatdecrease;};voidinput(member*q,intj){cout<<"inputmemberwageinformation:"<>q->no;cout<>q->name;cout<>q->basewage;cout<>q->extrawage;cout<>q->bonus;cout<>q->decrease;cout<no==a){cout<<"no"<<"name"<<"basewage"<<"extrawage";//表头cout<<"bonus"<<"decrease"<<"totalwage";cout<<"realwage"<no<<"";cout<name<<"";cout<basewage<<"";cout<extrawage<<"";cout<bonus<<"";cout<decrease<<"";cout<basewage+q->extrawage+q->bonus<<"";cout<basewage+q->extrawage+q->bonus-q->decrease<no<<"";cout<name<<"";cout<basewage<<"";cout<extrawage<<"";cout<bonus<<"";cout<decrease<<"";cout<basewage+q->extrawage+q->bonus<<"";cout<basewage+q->extrawage+q->bonus-q->decrease<no==a){101 课后习题答案cout<<"no"<<"name"<<"basewage"<<"extrawage";//表头cout<<"bonus"<<"decrease"<<"totalwage"<<"realwage"<no<<"";cout<name<<"";cout<basewage<<"";cout<extrawage<<"";cout<bonus<<"";cout<decrease<<"";cout<basewage+q->extrawage+q->bonus<<"";cout<basewage+q->extrawage+q->bonus-q->decrease<>n;if(n=="e"){cout<<"entertheno.:"<>m;enquire(p,200,m);}elseif(n=="p"){intl;cout<<"allorone(0orone"sno.):";cin>>l;print(p,200,l);}elsecout<<"WRONGOPERATOR!";}(3)编写程序,实现对101 课后习题答案学生和教师信息的输入、查询、删除和更新等操作。其中,学生信息包括学号、姓名、性别、班级和院系,教师信息包括编号、姓名、性别、职称、院系。参考代码如下:该数组长度设置应足够大,以便插入元素,删除元素只学号或代号置零,并不真正删除,相应的一些操作加浏览等要有条件判断使为零的学号或代号不显示。本题的插入操作是一次性的,可以试着更改程序,使其需要时再插入。#includestructmember{unsignedno;charname[10];charsex;chardep[20];union{//共同体,实现内存共享charclas[20];charposition[20];}level;};voidconstruction(structmember*q,intj)//数组建设函数{cout<<"inputpersoninformation(student"sno>10000):"<>q->no;cin>>q->name;cin>>q->sex;cin>>q->dep;if(q->no>10000)//学号大于10000,证明是学生cin>>q->level.clas;elsecin>>q->level.position;}}voidenquire(structmember*q,intj,unsigneda)//查询函数{for(inti=0;ino==a){cout<no<<"";cout<name<<"";101 课后习题答案cout<sex<<"";cout<dep<<"";if(a>10000)cout<level.clas;elsecout<level.position;}}voidalter(structmember*q,intj,unsigneda)//更新函数{for(inti=0;ino==a){cin>>q->no;cin>>q->name;cin>>q->sex;cin>>q->dep;if(q->no>10000)cin>>q->level.clas;elsecin>>q->level.position;}}voidbrowser(structmember*q,intj)//浏览函数{for(inti=0;ino!=0)//不显示学号或代号为0的记录{cout<no<<"";cout<name<<"";cout<sex<<"";cout<dep<<"";if(q->no>10000)cout<level.clas;elsecout<level.position;cout<no==a){q->no=0;}//将学号或代号置0}voidmain(){memberperson[2];unsignednum;charx,y;construction(person,2);cout<<"wanttooperate?";//询问是否对数组操作cin>>y;//"y"为操作,其他为不操作while(y=="y")//循环询问操作{cout<<"wanttoenquire?"<>x;if(x=="y"){cout<<"inputno(student"sno>10000):"<>num;enquire(person,2,num);cout<>x;if(x=="y"){cout<<"inputno(student"sno>10000):"<>num;alter(person,2,num);cout<>x;if(x=="y"){browser(person,2);101 课后习题答案cout<>x;if(x=="y"){cout<<"inputno(student"sno>10000):"<>num;delet(person,2,num);cout<>y;//由变量y中的字符判断}}第8章类和对象一、填空题(1)声明类的关键字是。通常,类的成员由和两部分组成,其中,用类的表示类的属性,用类的表示类的操作。答案:(1)class(2)数据成员(3)成员函数(4)数据成员(5)成员函数(2)类数据成员的访问属性有、和三种,其中,私有数据成员只能由的成员函数来访问。答案:(1)public(公有的)(2)private(私有的)(3)protected(保护的)(4)本类(3)构造函数通常用于,它只在时被调用,且只调用一次。答案:(5)初始化数据成员101 课后习题答案(1)对象建立(4)与普通成员函数相比,构造函数主要有这么几个特点:①构造函数名必须与相同;②构造函数没有和;③构造函数可以有多个,它们之间可以通过来区分,这被称为构造函数的重载。答案:(2)类名(3)返回值(4)返回类型(5)参数表(5)当对象的声明周期结束时,析构函数主要用来执行一些“善后工作”,如释放对象占用的内存等。析构函数的特点主要有:①其名称与相同,但要在名称前增加一个符号;②析构函数没有和;③一个类中只能定义个析构函数。答案:(6)类名(7)~(8)参数(9)返回值(10)一二、简答题(1)如何声明和定义对象指针?如何利用对象指针访问类中数据成员和成员函数?答:要声明对象指针,其一般形式为:类名*对象指针名;对象指针=&对象名;要通过对象指针访问对象中的成员,其一般形式为:对象指针->数据成员名或对象指针->成员函数名(参数列表)(2)在友元函数中,如何去访问对象的成员?答:友元函数不是类的成员函数,在友元函数中,不能直接引用对象成员的名字,必须通过形参传递进来的对象名或对象指针来引用该对象的成员,即对象名加运算符“.”加对象成员名。(3)类的静态数据成员与其他数据成员的最大区别是什么?答:静态数据成员是所有对象共享的成员,所有对象都可以访问它。静态数据成员不属于某一个对象,它在内存中占据一个公共的存储空间,所有对象都可以直接访问该存储空间。而不同对象的非静态数据成员占据不同的存储空间,该空间是不能共享的。(4)类的静态成员函数有什么特点?答:静态成员函数只能用来访问类中静态数据成员,而不能直接访问类中非静态数据成员。与静态数据成员类似,我们也可以利用“类名::静态成员函数名(参数列表);”101 课后习题答案形式来直接调用它。要在静态成员函数中访问非静态数据成员,可将该类对象作为静态成员函数的参数。三、编程题(1)构造一个日期时间类Timedate,实现对日期(年、月、日)、时间(时、分、秒)的设置及输出。解:#include#includeenumYR{Y2000,Y2001,Y2002,Y2003,Y2004,Y2005};enumMT{Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec};classTimedate{private:YRyear;MTmonth;intdate;inthh;intmm;intss;public:Timedate(){year=Y2000;month=Jan;date=1;hh=0;mm=0;ss=0;}Timedate(YRa,MTb,intc){year=a;month=b;date=c;hh=12;mm=30;ss=0;}voidgetdate(YR&,MT&,int&);//使用引用一次取得3个数值voidgettime(int&,int&,int&);voidputdate(YR,MT,int);voidputtime(int,int,int);voidlist();};voidTimedate::getdate(YR&y,MT&m,int&d){y=year;m=month;d=date;}101 课后习题答案voidTimedate::gettime(int&a,int&b,int&c){a=hh;b=mm;c=ss;}voidTimedate::putdate(YRa,MTb,intc){year=a;month=b;date=c;}voidTimedate::puttime(inta,intb,intc){hh=a;mm=b;ss=c;}voidTimedate::list()//成员函数,直接访问私有的数据成员{cout<<"year/month/date:";switch(year){caseY2000:cout<<"2000";break;caseY2001:cout<<"2001";break;caseY2002:cout<<"2002";break;caseY2003:cout<<"2003";break;caseY2004:cout<<"2004";break;caseY2005:cout<<"2005";break;}switch(month){caseJan:cout<<"/"<<"Jan";break;caseFeb:cout<<"/"<<"Feb";break;caseMar:cout<<"/"<<"Mar";break;caseApr:cout<<"/"<<"Apr";break;caseMay:cout<<"/"<<"May";break;caseJun:cout<<"/"<<"Jun";break;caseJul:cout<<"/"<<"Jul";break;caseAug:cout<<"/"<<"Aug";break;caseSep:cout<<"/"<<"Sep";break;101 课后习题答案caseOct:cout<<"/"<<"Oct";break;caseNov:cout<<"/"<<"Nov";break;caseDec:cout<<"/"<<"Dec";break;}cout<<"/"<#includeclassRectangle{doubleleft,top;doubleright,bottom;public:Rectangle(doublel=0,doublet=0,doubler=0,doubleb=0);~Rectangle(){};//析构函数,在此函数体为空voidAssign(doublel,doublet,doubler,doubleb);101 课后习题答案doublegetLeft(){returnleft;}//以下四个函数皆为内联成员函数doublegetRight(){returnright;}doublegetTop(){returntop;}doublegetBottom(){returnbottom;}voidShow();doubleArea();doublePerimeter();};//构造函数,带缺省参数,缺省值为全0,在声明中指定Rectangle::Rectangle(doublel,doublet,doubler,doubleb){left=l;top=t;right=r;bottom=b;}voidRectangle::Assign(doublel,doublet,doubler,doubleb)//赋值{left=l;top=t;right=r;bottom=b;}voidRectangle::Show()//成员函数直接使用私有的数据成员{cout<<"left-toppointis("<#includeclassCircle{doubler,Area,Circumference;public:Circle(doublea=0);Circle(Circle&);voidSetR(doubleR);doubleGetR(){returnr;}doubleGetAreaCircle(){returnArea;}doubleGetCircumference(){returnCircumference;}};Circle::Circle(doublea){r=a;Area=r*r*3.14159265;Circumference=2*r*3.14159265;101 课后习题答案}Circle::Circle(Circle&cl){r=cl.r;Area=cl.Area;Circumference=cl.Circumference;}voidCircle::SetR(doubleR){r=R;Area=r*r*3.14159265;Circumference=2*r*3.14159265;}intmain(){Circlecl1(2),cl2,cl3=cl1;cout<<"圆半径:"<#includeenumTsex{mid,man,woman};classPerson{charIdPerson[19];//身份证号,18位数字charName[20];//姓名101 课后习题答案TsexSex;//性别intBirthday;//生日,格式1986年8月18日写作19860818charHomeAddress[50];//家庭地址public:Person(char*,char*,Tsex,int,char*);Person(Person&);Person();~Person();voidPrintPersonInfo();voidinputPerson();//其他接口函数};Person::Person(char*id,char*name,Tsexsex,intbirthday,char*homeadd){cout<<"构造Person"<>ch;if(ch=="m")Sex=man;elseSex=woman;cout<<"请输入生日,格式1986年8月18日写作19860818:"<>Birthday;cin.get();//吸收回车符,否则地址输不进去cout<<"请输入地址:"<#includeconstdoublePI=3.1415926535;classPoint{private:doublex,y;public:Point(){x=0;y=0;}Point(doublexv,doubleyv){x=xv;y=yv;}Point(Point&pt){x=pt.x;y=pt.y;}doublegetx(){returnx;}doublegety(){returny;}doubleArea(){return0;}voidShow(){cout<<"x="<#include#includeclassDate101 课后习题答案{intyear,month,day;public:Date(inty,intm,intd){year=y;month=m;day=d;}voidshow_date(){cout<#includeconstdoublePI=3.1415926535;classGeometric_shape//几何图形{public:virtualdoubleperimeter()=0;//定义纯虚函数,求周长virtualdoublearea()=0;//定义纯虚函数,求面积virtualdoublevolume()=0;//定义纯虚函数,求体积virtualvoidShow(){};//声明虚函数};101 课后习题答案classCircle:publicGeometric_shape//圆{doubleradius;public:Circle(){radius=0;}//定义构造函数Circle(doublevv){radius=vv;}//定义带参数的构造函数doubleperimeter()//周长{return2.0*PI*radius;}doublearea()//面积{returnPI*radius*radius;}doublevolume()//体积{return0;}voidShow(){cout<<"radius="<Show();cout<<"矩形周长:"<perimeter()<<"t";cout<<"矩形面积:"<area()<<"t";cout<<"矩形体积:"<volume()<Show();cout<<"三角形周长:"<perimeter()<<"t";cout<<"三角形面积:"<area()<<"t";cout<<"三角形体积:"<volume()<Show();cout<<"长方体底周长:"<perimeter()<<"t";cout<<"长方体底面积:"<area()<<"t";cout<<"长方体体积:"<volume()<Show();cout<<"圆柱体底周长:"<perimeter()<<"t";cout<<"圆柱体底面积:"<area()<<"t";cout<<"圆柱体体积:"<volume()<Show();cout<<"圆锥体底周长:"<perimeter()<<"t";cout<<"圆锥体底面积:"<area()<<"t";cout<<"圆锥体体积:"<volume()<Show();101 课后习题答案cout<<"三棱锥底周长:"<perimeter()<<"t";cout<<"三棱锥底面积:"<area()<<"t";cout<<"三棱锥体积:"<volume()<Show();cout<<"三棱柱底周长:"<perimeter()<<"t";cout<<"三棱柱底面积:"<area()<<"t";cout<<"三棱柱体积:"<volume()<classMammal{public:Mammal(){cout<<"Mammalconstructor...n";}~Mammal(){cout<<"Mammaldestructor...n";}virtualvoidSpeak()const101 课后习题答案{cout<<"Mammalspeak!n";}};classDog:publicMammal{public:Dog(){cout<<"DogConstructor...n";}~Dog(){cout<<"Dogdestructor...n";}voidSpeak()const{cout<<"Woof!n";}};voidmain(){Mammala,*pDog;pDog=&a;pDog->Speak();Dogd;pDog=&d;pDog->Speak();}程序运行输出:MammalConstructor...Mammalspeak!MammalConstructor...DogConstructor...Woof!DogDestructor...MammalDestructor...(3)定义点坐标类Point,重载++(自增)运算符实现横纵坐标值均加1,重载--(自减)运算符,实现横纵坐标值均减1。解:#includeclassPoint{public:Point&operator++();Pointoperator++(int);Point&operator--();Point101 课后习题答案operator--(int);Point(){_x=_y=0;}intx(){return_x;}inty(){return_y;}private:int_x,_y;};Point&Point::operator++(){_x++;_y++;return*this;}PointPoint::operator++(int){Pointtemp=*this;++*this;returntemp;}Point&Point::operator--(){_x--;_y--;return*this;}PointPoint::operator--(int){Pointtemp=*this;--*this;returntemp;}voidmain(){PointA;cout<<"A的值为:"<classBaseClass{public:virtualvoidfn1();voidfn2();};voidBaseClass::fn1(){cout<<"调用基类的虚函数fn1()"<fn1();pBaseClass->fn2();pDerivedClass->fn1();pDerivedClass->fn2();}运行结果:调用派生类的函数fn1()调用基类的非虚函数fn2()调用派生类的函数fn1()调用派生类的函数fn2()(5)定义一个基类BaseClass,包含虚析构函数;由它派生出类DerivedClass。在主程序中定义一个DerivedClass的对象,将该对象的地址赋给一个BaseClass的指针,观察虚析构函数是如何执行的。解:#includeclassBaseClass{public:virtual~BaseClass(){cout<<"~BaseClass()"<>”和提取函数get()的说法中,不正确的是()A.提取运算符“>>”能提取空白字符B.提取函数get()能够提取空白字符C.提取函数get()可以带参数,用以存储从流中得到的字符D.提取函数get()的返回值为所提取的字符答案:A提取运算符“>>”不能提取空白字符,它是以空白字符作为数据间隔。(3)假设“*”表示空格,当输入“*d”时,下列两段程序的输出结果是()。#include#includevoidmain()voidmain(){charc;{charc;cin>>c;cin.get(c);cout<>”,它_不提取__空格。getline()的作用是_从输入流中读取一个字符串_,get()的作用是_从输入流中提取一个字符__。(5)类istream提供的对读指针进行定位的成员函数是_seekg()_,返回读指针位置的成员函数是_tellg()_;类ostream提供的对写指针进行定位的成员函数是__seekp()__,返回写指针位置的成员函数是_tellp()__。有了这些函数就可以随机地读写指定位置的数据。(6)对数据格式进行设置的方法有两种:使用_格式控制符_和使用_成员函数_。(7)在格式控制流成员函数中,setf()用来__设置格式标志_,unsef()用来_取消格式标志_。(8)重载的流运算符函数通常被定义为类的__友元__函数。(9)根据文件中数据的组织形式,可分为__ASCII_文件和__二进制__文件。(10)C++中输入、输出是以__字节流__的形式实现。三、阅读下列程序,写出执行结果1.#include#includeusingnamespacestd;intmain(){intn=15;cout<#includevoidsavefile(char*filename,intn);voidreadfile(char*filename,intn);voidsort(inta[],intn);intmain(){savefile("f:/f1.dat",10);//输入10个数存入文件f:/f1.dat中savefile("f:/f2.dat",10);//输入10个数存入文件f:/f2.dat中ofstreamfout("f:/f2.dat",ios::out|ios::app);//以输出的方式打开文件f2.dat//写入的数据添加在文件末尾if(!fout)//打开文件失败{cerr<<"outputfilefail!"<>a[i];//将f1.dat中内容写入数组acout<>a[i];fout<>a[i];cout<a[i+1]){temp=a[i];a[i]=a[i+1];a[i+1]=temp;}for(inti=0;i101 课后习题答案#includevoidmain(){ofstreamouf;ifstreaminf;ouf.open("file1.txt");if(!ouf){cout<<"openfile1.txterrors!"<#includestructinfor{unsignednum;charname[15];floatsco1;floatsco2;floatsco3;}stu[3];voidmain(){ofstreamouf("infor.txt");101 课后习题答案if(!ouf){cout<<"openinfor.txterrors!"<>stu[i].num;cout<>stu[i].name;cout<>stu[i].sco1;cout<>stu[i].sco2;cout<>stu[i].sco3;cout<#includevoidmain(){ifstreaminf("infor.txt");if(!inf){cout<<"openinfor.txterrors!"<#includestructinfor{unsignednum;charname[15];floatsco1;floatsco2;floatsco3;}stu[3];voidmain(){ofstreamouf("infor.txt");if(!ouf){cout<<"openinfor.txterrors!"<>stu[i].num;cout<>stu[i].name;cout<>stu[i].sco1;cout<>stu[i].sco2;cout<>stu[i].sco3;cout<>ch;if(ch=="y"){inta;cout<<"inputnumthatwillbedelete:";cin>>a;ouf.open("infor.txt");if(!ouf){cout<<"openinfor.txterrors!"<>ch;if(ch=="y"){intk;cout<<"inputnumthatwillbeenquired:";cin>>k;inf.open("infor.txt");if(!inf){cout<<"openinfor.txterrors!"<>ch;if(ch=="y"){ofstreamouf;ouf.open("infor.txt",ios::app);//在文件中的内容后输出,不清楚数据if(!ouf){cout<<"openinfor.txterrors!"<>stud.num;cout<>stud.name;cout<>stud.sco1;cout<>stud.sco2;cout<>stud.sco3;cout<usingnamespacestd;voidmain(){inta;intb;try{cin>>a>>b;if(b==0)throwb;cout<>a>>b;if(b==0)throwb;101 课后习题答案cout<>a>>b;if(b==0)throwb;cout<usingnamespacestd;classexceptions{char*ch;public:exceptions(){ch="anexceptionwasthrow";}voidprint(){cerr<usingnamespacestd;voidmain(){try{inta=8;doubleb=8.8;throwa#includeusingnamespacestd;namespaceadmin{classstudent{public:student(intn,stringnam,inta,stringadd)://constructorfunction101 课后习题答案num(n),name(nam),age(a),address(add){}voidshowData();private:intnum;stringname;intage;stringaddress;};voidstudent::showData(){cout<<"number:"<#includeusingnamespacestd;namespaceedu{classstudent{public:student(intn,stringnam,chars,floatsco)://constructorfunctionnum(n),name(nam),sex(s),score(sco){}voidshowData();private:intnum;stringname;charsex;floatscore;};voidstudent::showData(){cout<<"number:"<#include"admin.h"#include"edu.h"usingnamespacestd;intmain(){admin::studentstud1(1001,"zhangpeng",17,"changjiangroad8#");stud1.showData();edu::studentstud2(1001,"zhangpeng","M",98.5);stud2.showData();return0;}运行结果:number:1001name:zhangpengage:17address:changjiangroad8#number:1001name:zhangpengsex:Mscore:98.5101 目录101'