还剩20页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
高等院校计算机基础教育规划教材《C++程序设计》课后习题参考答案――武汉大学出版社习题1参考答案
三、简答题1.简述三代计算机语言各自的特点解答如下机器语言是用二进制指令表示的、计算机能够直接识别和执行的语言由于计算机可以直接执行机器语言,执行速度快是机器语言的主要优点在计算机发展初期,软件工程师使用机器语言来编写程序在计算机指令集不断增大的情况下,机器语言不易记忆,不便于学习,软件开发难度大、周期长、易出错,软件维护工作量大等缺点更加突出,机器语言已不能胜任编程工作汇编语言是用一些易读的助记符表示机器指令操作码,如ADD、CALL等使用汇编语言编写程序提高了编程速度,也比较容易编写出质量较高的程序,检查、维护也比较容易但汇编语言抽象层次低,程序员编写程序工作量大高级语言屏蔽了机器语言的细节,提高了语言抽象层次程序中采用了具有一定含义的数据命令和容易理解的执行语句高级语言不受计算机种类的限制,通用性强,易于理解、学习和掌握使用高级语言减少了大量的编程工作量目前使用比较广泛的高级语言有Basic、Fortran、Pascal和C语言C++是一种功能强大、应用更广泛的高级语言2.简述C语言程序实现的过程解答如下用C++语言编写好一个完整的程序后,第一步要上机运行编辑程序,输入源程序;第二步是对源程序进行编译生成目标代码文件,目标代码文件名与源程序文件名相同,而扩展名改为obj;第三步运行连接程序,将目标代码文件与C++的库文件相连接,生成可执行文件,可执行文件名与源程序文件名相同,而扩展名为exe;第四步运行可执行文件,实现程序所具有的功能习题2参考答案1.C++基本数据类型有哪几种?程序设计如下C++的基本数据类型有bool(布尔型,又称逻辑型)、char(字符型)、int(整型)、float(浮点型,表示实数)和double(双精度浮点型,简称双精度型)等5种2.定义符号变量与定义变量有何异同?程序设计如下定义符号常量和定义变量都要指定数据类型,系统将为其分配一定的存储空间其不同之处在于定义符号常量必须给出常量值,且以后不能修改本常量的值;而变量可以在定义变量的同时赋初值,以后可以修改该变量3.什么叫常量?什么是变量?程序设计如下常量就是在程序的运行过程中该量是不可修改的量;变量在程序的运行过程中允许对该变量的值进行修改习题3参考答案
1、编程题1.编写找出a=18,b=35,c=21,d=96中最大值的程序程序设计如下#includeiostream.hvoidmain{inta=18,b=35,c=21,d=96,max;max=aba b;max=maxcmax c;max=maxdmax d;coutmax=maxend1;}2.输入一个整数:为65时,显示“A”;为66时,显示“B”,为67时,显示“C”,其它值显示“END”程序设计如下#includeiostream.hvoidmain{intx;cinx;switchx{case65coutA\n;break;case66coutB\n;break;case67coutC\n;break;default coutEND\n;}}3.编写输入一个整数并且该数按小于10,10~99,100~999,1000以上分类并显示的C++程序,例如输入335时,显示“335is100to999”程序设计如下#includeiostream.hvoidmain{inta;cina;ifa=100{ifa=1000coutaisgreaterthan1000\n;elsecoutais100to999\n;}else{ifa10coutaislessthan10\n;elsecoutais10to99\n;}}4.一个分数序列为2/1,3/2,5/3,8/5,13/8,21/23,…编写求该数列的前20项之和的程序程序设计如下#includeiostream.hvoidmain{floatx=1y=2pks=0;fork=1;k=20;k++{s+=y/x;p=x+y;x=y;y=p;}cout2/1+3/2+5/3+8/5+…=sendl;}5.编写程序,显示如下图形*************************程序设计如下#includeiostream.hvoidmain{inti,j,k;fori=1;i5;i++{fork=4;k=i;k--cout;forj=1;j=2*i-1;j++cout*;coutendl;}fori=3;i0;i--{fork=1;k=4-i+1;k++cout;forj=1j=2*i-1;j++cout*;coutend1;}}习题4参考答案
三、编程题1.将一个数组中的值按逆序存放,例如,原来是1,3,5,7,9,要求改为9,7,5,3,1程序设计如下#includeiostream.hvoidmain{inta[5],t;forinti=0;i5;i++cina[i];fori=0;i5/2;i++{t=a[i];a[i]=a[4-i];a[4-i]=t;}fori=0;i5;i++couta[i]\t;coutendl;}2.有一个3×3的矩阵,分别求出两条对角线元素之和程序设计如下#includeiostream.hvoidmain{inta[3][3],i,j,suml=0,sum2=0;cout输入数组元素\n;fori=0;i3;i++forj=0;j3:j++cina[i][j];fori=0;i3;i++{sum1+=a[i][i];sum2+=a[i][2-i];}coutsum1=sum1sum2=sum2endl;}3.输入一个字符,统计单词个数,单词之间用空格分离程序设计如下#includeisotream.hvoidmain{charstr[80],c1,c2=′′;inti=0,num=0;cin.getlinestr78;whilestr[i]=\o{c1=str[i];ifi==0c2=;elsec2=str[i-1];ifc1!=c2=num++;i++}cout共有num个单词endl;}4.用冒泡法对输入的15个整数按由小到大顺序排列程序设计如下#includeiostream.h#includeiomanip.hvoidmain{inti,j,ma[15];fori=0;i15;i++cina[i];forj=1;j14;j++fori=0;i15-j;i++ifa[i]a[i+1]{m=a[i];a[i]=a[i+1];a[i+1]=m;}fori=0;i15;i++coutsetw4a[i];coutend1;}5.从键盘为1个N×N的整型数组a输入数据,并显示每一行的最大值程序设计如下#includeiostream.h#includeiomanip.hvoidmain{constN=5;inta[N][N],b[N],i,j;cout请为数组a输入数据endl;fori=0;iN;i++forj=0;jN;j++cina[i][j];//用双重循环为数组a顺序输入数据fori=0;iN;i++{b[i]=a[i][0];forj=1;jN j++ifb[i]a[i][j]b[i]=a[i][j];//经比较将a数组第i行的最大值分别存入b[i]中}cout输出每一行的最大值:;fori=0;iN;i++coutsetw4b[i];coutend1;//经b[i]输出数组a每一行的最大值}程序运行结果请为数组a输入数据5015341729182542773525241723115998322862541997848输出每一行的最大值5077259878习题5参考答案
三、编程题1.输入3个字符串,要求输出其中最大,最小字符串程序设计如下输入3#includeiostream.h#includestring.hvoidmain{constintN=3;chars[N][20],max[20],min[20];forinti=0;iN;i++cin.getlines[i],20;strcpymaxs[0];strcpymins[0];fori=0;iN;i++{if(strcmps[i],max0)strcpymaxs[i];if(strcmpmins[i]0)strcpymin,s[i];}cout最大字符串是maxendl;cout最小字符串是minendl;}2.用指针的方法将一个字符串“china”的单个字符依次输出程序设计如下#includeiostream.hvoidmain{char*p=china;forinti=0;p[i]!=\0;i++coutp[i]endl;}3.使用指针数组编写一个程序,要求当用户输入1~12的月份数字时,程序能够输出该月的英文名输入不是1~12时,则退出程序程序设计如下#includeiostream.hvoidmain{//C++语言中续行符用\表示char*monthname[]={januaryfebruary,march,april,may,junejuly,augustseptember,october,november,december};inti;while1{cout请输入月份号cini;ifi1‖i12{cont错误的月份号end1;break;}cont……monthname[i-1]end1;}}4.编写程序将n个数按逆序输出,要求使用指针思考可以假设两个指针变量p和q,分别指向最后一个和第一个数组元素,而后互换*p和*q即可程序设计如下#includeiostream.hvoidmain{constintN=5;inta[N],*p=a,*q,t;forinti=0;iN;i++cin*p++;//输入数组元素p--;//将p指向最后一个数组元素forq=a;qp;p--q++{t=*p;*p=*q;*q=t;}p=a;fori=0;iN;i++cout*p+i\t;coutendl;}5.有n个人围成一个圈,顺序排号从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来的第几号程序设计如下#includeiostream.hvoidmain{intikmnnum[50],*p;coutinputnumberofperson:n=;cinn;p=num;fori=0;in;i++*p+i=i+l;//从1到n对每个人进行编号i=0;//i为每次循环时的计数变量k=0;//k为按1,2,3报数时的计数变量m=0;//m为退出人数whilemn-1//当退出人数比n-1少时即未退出人数大于1时执行{if*p+i!=0k++;ifk==3//对退出的人的编号置为0{*p+i=0;k=0;m++;}i++;ifi==ni=0;//报数到尾后,i恢复为0}while*p=0p++;coutendlthelastoneisNO*p;}运行结果为inputnumberofperson n=8thelastoneisNO7习题6参考答案
三、编程题1.编写程序,计算1+2+3+…+n的值其中n是自然数分析n1为1,n2为100即可程序设计如下#includeiostream.hintGetSumintn;voidmain{intnum;intsum=0;coutPleaseenteranumber;cinnum;sum=GetSumnum;coutsumend1;while1{}return0;}intGetSumintn{ints=0;forinta=0;a=n;a++s+=a;returns;}2.编写一个函数,该函数返回给定字符串中大写字母字符的个数例如,字符串“ChineseComputerWorld”中,大写字母字符的个数为3个程序设计如下#includeiostream.h#includemath.hintrootfloat,float,float;floatxl,x2;voidmain{floata,b,c;cout请输入a,b,c的值;cinabc;ifroota,b,ccoutx1=x1\tx2=x2\n;}rootfloata,floatb,floatc{floatt;t=b*b-4*a*c;ift=0a{t=sqrtt;x1=-b+t/2*a;x2=-b-t/2*a;return1;}return0;}3.编写一个函数,分别求出一维整型数组a[n]中所有值为奇数的元素个数和所有值为偶数的元素个数程序设计如下#includestring.hintGetcountchar*p{intcount=0;//记录大写字母字符个数的变量,设初值为0while*p!=NULL//如为大写字母,则总数加1{if*p=A*p=zcount++;p++;}returncount;}voidFuncinta[],intn,intox,intex{inti=0;ox=0;//参数引用,返回数组中值为奇数的元素个数ex=0;//参数引用,返回数组中值为偶数的元素个数whilein{ifa[i]%2==0ex++;elseox++;i++;}}4.编写一个函数,求输入的两个自然数的最大公约数程序设计如下intFuncintMax,intMin{intTemp,Num;ifMaxMin{Temp=Max;Max=Min;Min=Temp;}do{Num=Max%Min;Max=Min;Min=Num;}whileNum!=0;returnMax;}注释本题采用“辗转相除法”具体如下1Max变量存放较大的数作为被除数,Min变量存放较小的数作为除数2用Max除以Min后的余数存放在Num中3若Num!=0,则Max←Min,Min←Num,继续相除得到的新的Num4重复步骤3,最后的Max就是最大公约数5.有4个人,其中第4个人比第3个人大2岁,第3个人比第2个人大2岁,第2个人又比第1个人大2岁,如果第1个人30岁,那么第4个人多少岁用递归调用实现程序设计如下#includeiostream.hintyearint;voidmain{intn;cout请输入第一个人的年龄30;cinn;cout第四个人的年龄是yearnendl;}intyearintn{staticinty=n,m=0;ifm==3returny;else{m++;y=yeary+2;}}6.求一元二次方程的实根程序程序设计如下#includeiostream.hintfunintint;voidmain{intn1,n2;cout输入两个正整数且前者要小于后者;cinn1n2;cout从n1到n2的累加和为funn1,n2end1;}intfunintm,intn{ifm=nreturnn;elsereturnn+funmn-1;}习题7参考答案
二、编程题1.利用math.h头文件,编写一个C++程序,输入3个数,输出其中绝对值最大的数程序设计如下#includeiostream.h#includemath.h#definemaxxyxyx:y;voidmain{intx,y,z,absmax;cinxyz;absmax=maxabsx,absy;absmax=maxabsabsmax,absz;coutTheabsolutevalueofmaximalnumberis;coutabsmaxend1;}2.编写一个程序,利用宏定义一个常量N,然后生成、输出一个4*4({0123}{1234}{2345}{3456})的数据阵列程序设计如下#includeiostream.h#defineN4intmain{int[N][N];forinti=0;iN;i++forintj=0;jN;j++**a+i+j=i+j;fori=0;iN;i++{forintj=0;jN;j++cout**a+i+j;coutend1;}return0;}程序运行的结果01231234234534563.定义一个带参数的宏MIN用于计算在两个参数中找出较小的一个程序设计如下#includestdio.h#defineMINm,nmnm n//定义宏名MIN替换运算mnm nvoidmain{floatt=36.712,u=18.645;//定义实型变量t,ufloatmin;min=MINt,u;//调用带参数的宏MIN,求t和u的最小值coutminend1;}运算结果是
18.645习题8参考答案
三、编程题1.定义枚举类型months,用枚举常量代表一年的12个月份程序设计如下enummanths{JAN=1,FEB,MAR,APR,MAY,JUN,JUL,AUGSEP,OCT,NOV,DEC};
2.利用结构体类型编制一程序,实现输入输出一个学生的学号、姓名和出生日期程序设计如下#includeiostream.hstructdate{intyear;intmonth;intday;};structstudent{intnumber;charname[10];datebirth;};voidmain{structstudentstu1;cinstu1.numberstu1.name;cinstu1.birth.yearstu1.birth.monthStu1.birth.day;coutstu1.number\tstu1.name\tstu1.birth.year;cout年stu1.birth.month月stu1.birth.day日end1;}3.利用结构体类型编制一程序,实现输入一个学生的数学期中和期末成绩,然后计算并输出其平均成绩程序设计如下#includeiostream.h#includeiomanip.hvoidmain{structstudy{intmid;intend;intaverage;}math;cinmath.midmath.end;math.average=math.mid+math.end/2;coutsetprecision
(2)math.averageend1;}4.利用指向结构体的指针编制一程序,实现输入3个学生的学号,数学期中和期末成绩,然后计算其平均成绩并输出成绩表程序设计如下#includeiostream.hstructstu{intnum;intmid intend;intave;}s[3];voidmain{inti;structstu*p;forp=s;ps+3;p++{cinp-nump-midp-end;p-ave=p-mid+p-end/2;}forp=s;ps+3;p++coutp-num\tp-mid\tp-end\tp-aveend1;}习题9参考答案
三、编程题1.编写一个函数,统计一条英文句子中字母的个数,在主程序中实现输入、输出程序设计如下#includeiostream.h#includestdio.hintcountchar*str{inti,num=0;fori=0;str[i];i++{ifstr[i]=astr[i]=z||str[i]=Astr[i]=znum++;}returnnum;}intmain{chartext[100];cout输入一个英语句子end1;getstext;cout这个句子里有counttext个字母end1;while1{}return0;}2.设学生人数N=8,提示用户输入N个人的考试成绩,然后计算出平均成绩并且显示程序设计如下#includeiostream.h#includestring.h#defineN8floatgrades[N];//存放成绩的数组intmain{inti;floattotal,average;//提示输入成绩fori=0;iN;i++{coutEntergrade#i+1;cingrades[i];}total=0;fori=0;iN;i++total+=grades[i];average=total/N;cout\nAveragegrade averageendl;}习题10参考答案
三、编程题大学里有这样几类人员学生、教师、职员和兼职教书的教师给出这几类人员的类描述程序设计如下:#includeiostream.hintGetSumintn;classPerson{public Personconstchar*n{name=newchar[strlenn+1];strcpyname,n;}voidPrintconst{coutName nameend1;}protected char*name;};classstudent virtualpublicPerson{public Studentconstchar*n,constchar*m Personn{major=newchar[strlenm+1];strcpymajorm;}voidPrintconst{PersonPrint;coutMajor endl;}protected char*major;};classStaff virtualpublicPerson{public Staffconstchar*nconstchar*d Personn{dept=newchar[strlend+1];strcpydept,d;}voidPrintconst{PersonPrint;coutDepartment deptendl;}protected char*dept;};ClassTeacher publicStaff{public Teacherconstchar*nconstchar*d,constchar*1Personn,Staffn,d{lesson=newchar[strlen1+1];strcpylesson,1;}voidPrintconst{StaffPrint;coutLesson lessonendl;}protected:char*lesson;};classStudentTeacher:publicStudentpublicTeacher{public:StudentTeacherconstchar*nconstchar*mconstchar*dconstchar*1:PersonnStudentnmTeacherndl{}voidPrintconst{Student::Print;coutDepartment:endlendl;coutLesson:lessonendl;}};voidmain{StudentstuMikeSoftwareEnginerring;StaffstaJasonManagement;TeachertTimComputerC++;StudentTeacherstSamComputerApplicationComputerC++;stu.Print;sta.Print;t.Print;st.Print;}习题11参考答案
三、编程题1.运用动态联编和虚函数的方法编写派生类程序,要求能够输入简单的数据程序设计如下#includeiostream.hclassX{public virtualvoidDisplayintx,floaty{coutx,yend1;}};ClassY publicX{public virtualvoidDisplayintx,floaty{coutx,yend1;}};voidScrrenXx{x.Display5,18,98;x.Display66,9,97;}voidmain{Yy;Scrreny;}2.使用指向类的成员函数的指针和虚函数的调用,以及动态联编的方法编写程序程序设计如下#includeiostream.hclassP{public virtualvoidfun{coutPfuncalled.\n;}};classQ publicP{public virtualvoidfun{coutQfuncalled.\n;}};voidmain{Qq;Pa=q;VoidP*pf=Pfun;a.*pf;}习题12参考答案
1.设计一个函数模板MaxT用于求一个数组中最大的元素并用整型数组和字符数组检验其正确性程序设计如下#includeiostream.htemplateclassTTMaxTa[],intn{Ttemp=a[0];forinti=1;in;i++iftempa[i]temp=a[i];returntemp;}voidmain{inta[]={5,8,3,222,9,123};charc[]={g,a,d,z,m,c,y};couta数组中最大数是Maxa,6endl;coutc数组中最大元素是Maxc,7endl;}2.设计一个类模板StoreT用于存储某一类型的数据,并用整型数据和字符串数据检验其正确性程序设计如下#includeiostream.htemplateclassTclassStore{Titem;public TGetItem;voidSetItemTx;};templateclassTTStoreTGetItem{returnitem;}templateclassTvoidStoreTSetItemTx{item=x;}voidmain{intn=1011;Storeints1;s
1.SetItemn;charstr=这是字符串;Storechar*s2;s
2.SetItemstr;coutn=s1.GetItemendl;coutstr=s2.GetItemendl;}3.用函数模板设计一个SortT函数模板,完成对整型和字符数组进行排序程序设计如下#includeiostream.htemplateclassTvoidSortTa[],intn//Sort函数模板{Ttemp;forinti=1;in;++i{intj=i;temp=a[i];whilej0tempa[j-1]{a[j]=a[j-1];j;}a[j]=temp;}}templateclassTvoidDisplayTa[],intn//Display函数模板{forinti=0;in;++icouta[i],;coutend1;}main{inta[]={1,3,5,7,9,8,6,4,2,0};charb[]={i,d,A,2,g,zehk7};cout整型数组原序列为:endl;Displaya,10;cout整型数组排序后为:endl;Sorta,10;Displaya,10;cout字符数组原序列为:endl;Displayb,10cout字符数组排序后为:endl;Sortb,10;Displayb,10;return0;}上例中,Sort函数模板采用的是插入法排序方法,对整型和字符型数组进行排序;而Display函数模板对整型和字符数组进行输出,使程序的编写得到了简化,输出结果略去应用类模板也可以使编程得到简化在今后的编程实践中,在函数或类功能相近时,要尽量使用相应的模板,以减少编程的工作量习题13参考答案
三、编程题定义一个数据文件,并向其中输入数据程序设计如下#includefstream.hStructDatas{intmm,dd,yy;};voidmain{Datasdays={12,8,63};Ofstreamtfiledatas.dat,iosbinary;Tfile.writechar*days,sizeofdays;}。