• 602.50 KB
  • 2022-04-22 11:51:24 发布

《c++语言程序设计教程》习题及解答.doc

  • 77页
  • 当前文档由用户上传发布,收益归属用户
  1. 1、本文档共5页,可阅读全部内容。
  2. 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,可选择认领,认领后既往收益都归您。
  3. 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细先通过免费阅读内容等途径辨别内容交易风险。如存在严重挂羊头卖狗肉之情形,可联系本站下载客服投诉处理。
  4. 文档侵权举报电话:19940600175。
'《c++语言程序设计教程》习题及解答第1章 C++语言概述 练习题11.1判断题×1.C++语言和C语言都是面向对象的程序设计语言。√2.面向对象方法具有封装性、继承性和多态性。√3.C语言是C++语言的一个子集。C++语言继承了C语言。×4.C++语言程序与C语言程序一样都是函数串。×5.C++语言支持封装性和继承性,不支持多态性。√6.C++语言比C语言对数据类型要求更加严格了。√7.C++语言对C语言进行了一次改进,使得编程更加方便了。×8.C++源程序在编译时可能出现错误信息,而在连接时不会出现错误信息。√9.编译C++源程序时,出现了警告错(Warning)也可以生成可执行文件。√10.C++语言程序的实现也要经过编辑、编译连接和运行3个步骤。1.2单选题1.下列关于面向对象概念的描述中,错误的是(C)。A.面向对象方法比面向过程方法更加先进B.面向对象方法中使用了一些面向过程方法中没有的概念C.面向对象方法替代了结构化程序设计方法D.面向对象程序设计方法要使用面向对象的程序设计语言2.下列各种高级语言中,不是面向对象的程序设计语言是(D)。A.C++B.JavaC.VBD.C3.下列关于类的描述中,错误的是(A)。A.类就是C语言中的结构类型B.类是创建对象的模板C.类是抽象数据类型的实现D.类是具有共同行为的若干对象的统一描述体4.下列关于对象的描述中,错误的是(C)。A.对象是类的一个实例B.对象是属性和行为的封装体C.对象就是C语言中的结构变量D.对象是现实世界中客观存在的某种实体5.下列关于C++程序中使用提取符和插入符的输入/输出语句的描述中,错误的是(C)。A.提取符是对右移运算符(>>)重载得到的B.插入符是对左移运算符(<<)重载得到的C.提取符和插入符都是双目运算符,它们要求有两个操作数D.提取符和插入符在输入/输出语句中不可以连用1.3填空题1.C++语言具有面向对象方法中要求的三大特性:封装性、继承性和多态性。2.C++程序中,有且仅有一个主函数。第77页共77页 3.C++程序是由类和函数组成的。4.C++源程序的扩展名是cpp。5.使用插入符进行标准输出文件输出时,使用的输出流对象名是cout。1.4上机调试下列程序,并分析输出结果1.#includevoidmain(){inti,j;cout<<"Enterij:";cin>>i>>j;cout<<"i="<intmax(int,int);voidmain(){inta,b,c;a=5;b=8;c=max(a,b);cout<<"max("<y?x:y;}答:max(5,8)=83.文件e1.4.3.cpp内容如下:#includevoidf1(),f2();voidmain(){cout<<"在北京.n";f1();f2();cout<<"再见.n";}文件1.4.3-1.cpp内容如下:#includevoidf1(){cout<<"在上海.n";}文件1.4.3-2.cpp内容如下:#includevoidf2(){cout<<"在广州.n";}第77页共77页 答:在北京。在上海。在广卅。再见。1.5编译下列程序,修改所出现的错误,获得正确结果1.main(){cout<<"Inmain().n"}答:修改后如下:#includevoidmain(){cout<<"Inmain().n";}2.#includevoidMAIN(){cin>>a;intb=a+a;cout<<"b=<voidmain(){inta;cin>>a;intb=a+a;cout<<"b=”<voidmain(){inti,j;i=5;intk=i+j;COUT<<"i+j="<voidmain(){inti,j;j=10;i=5;intk=i+j;cout<<"i+j="<>D.%=10.下列运算符中,优先级最低的是(B)。A.==B.?:第77页共77页 C.|D.&&11.已知:inta(3);下列表达式中,错误的是(C)。A.a%2==0B.a--+2C.(a-2)++D.a>>=212.已知:intb(5),下列表达式中,正确的是(D)。A.b="a"B.++(b-1)C.b%2.5D.b=3,b+1,b+213.下列关于类型转换的描述中,错误的是(C)。A.类型转换运算符是(<类型>)B.类型转换运算符是单目运算符C.类型转换运算符通常用于保值转换中D.类型转换运算符作用于表达式左边14.下列表达式中,其值为0的是(A)。A.5/10B.!0C.2>4?0:1D.2&&2||015.下列表达式中,其值不为逻辑值的是(A)。A.算术表达式B.关系表达式C.逗号表达式D.逻辑表达式16.下列关于数组概念的描述中,错误的是(B)。A.数组中所有元素类型是相同的B.数组定义后,它的元素个数是可以改变的C.数组在定义时可以被初始化,也可以不被初始化D.数组元素的个数与定义时的每维大小有关17.下列关于数组维数的描述中,错误的是(C)。A.定义数组时必须将每维的大小都明确指出B.二维数组是指该数组的维数为2C.数组的维数可以使用常量表达式D.数组元素个数等于该数组的各维大小的乘积18.下列关于数组下标的描述中,错误的是(B)。A.C++语言中数组元素的下标是从0开始的B.数组元素下标是一个整常型表达式C.数组元素可以用下标来表示D.数组元素的某维下标值应小于该维的大小值19.下列关于初始值表的描述中,错误的是(C)。A.数组可以使用初始值表进行初始化B.初始值表是用一对花括号括起的若干个数据项组成的C.初始值表中数据项的个数必须与该数组的元素个数相等D.使用初始值表给数组初始化时,没有被初始化的元素都具有默认值20.下列关于字符数组的描述中,错误的是(D)。A.字符数组中的每一个元素都是字符B.字符数组可以使用初始值表进行初始化C.字符数组可以存放字符串D.字符数组就是字符串21.下列关于字符串的描述中,错误的是(C)。A.一维字符数组可以存放一个字符串B.二维字符数组可以存放多个字符串C.可以使用一个字符串给二维字符数组赋值第77页共77页 D.可以用一个字符串给二维字符数组初始化22.已知:inta[5]={1,2,3,4};下列数组元素值为2的数组元素是(B)。A.a[0]B.a[1]C.a[2]D.a[3]23.已知:intab[][3]={{1,5,6},{3},{0,2}};数组元素ab[1][1]的值为(A)。A.0B.1C.2D.324.已知:chars[]="abcd";输出显示字符"c"的表达式是(C)。A.sB.s+2C.s[2]D.s[3]25.已知:charss[][6]={"while","for","else","break"};输出显示"reak"字符串的表达式是(B)。A.ss[3]B.ss[3]+1C.ss+3D.ss[3][1]2.3填空题1.C++语言中,基本数据类型包含有整型、浮点型、字符型、空值型和布尔型。2.变量的存储类可分为自动类、寄存器类、外邹类和静态存储类。3.浮点型常量可分为单精度、双精度和长双精度浮点型常量。4.结合性从右至左的运算符有单目运算符、双目运算符和赋值运算符。5.条件表达式是由三目运算符组成的,该表达式的类型是由冒号左边和右边两个操作数中类型高的操作数类型决定的。6.已知:doubledd[][3]={{1.2,2.4,3.6},{4.8,5.2},{6.4}};这里dd是一个二维数组的数组名,该数组共有9个元素,每个元素的类型是double。数组元素dd[0][0]的值是1.2,dd[1][1]的值是5.2,数组元素dd[2][2]的值是0。7.已知:charss[][6]={"while","break","for","else"};字符数组ss是二维数组,它的第1维大小应该是4。使用cout和<<输出字符串"for"时,对应的表达式是ss+2。使用cout和<<输出字符串"break"的子串"reak"时,对应的表达式是ss[1]+1。使用cout和<<输出字符串else中的字符"s"时,对应的表达式是ss[3][2]。2.4分析下列程序1.#includevoidmain(){inta,b;cout<<"Enterab:";cin>>b>>a;intd=a-b;cout<<"d="<voidmain(){constintA=8;constcharCH="k";constdoubleD=8.5;cout<<"A="<inta=9;voidmain(){intb=5;cout<<"a+b="<voidmain(){inta=3;charb="m";cout<<"a="<voidmain(){cout<<6%4*5/3+3<>2)<voidmain(){inta=5;cout<,4,44,8,87.#includevoidmain(){inta=3,b=5;cout<<(a>b+a==b-2)<<","<<(a!=b+a<=b)<voidmain(){inti,j,k;i=j=k=5;!i&&++j&&--k;cout<voidmain(){inti(5),j(8);cout<<(i=i*=j)<inta=8;voidmain(){intb=6;doubled=1.5;d+=a+b;cout<voidmain(){intm[][3]={9,8,7,6,5,4,3,2,1},s=0;for(inti=0;i<3;i++)s+=m[i][i];cout<voidmain(){chars[]="bhy543kpm345";for(inti=0;s[i]!="";i++){if(s[i]>="a"&&s[i]<="z")continue;cout<voidmain(){intb[]={5,-3,4,1,-8,9,0,10};inti=0,j;for(j=i;i<8;i++)if(b[i]>b[j])j=i;cout<voidmain(){inta[][3]={1,2,3,4,5,6,7,8,9};ints1(0),s2(0);for(inti=0;i<3;i++)for(intj=0;j<3;j++){if(i!=j)s1+=a[i][j];if(i+j==1)s2+=a[i][j];}cout<<"s1="<voidmain(){chars[]="#%#";for(inti=0;i<3;i++){for(intj=0;j0;i--){for(intj=0;jvoidmain(){inta=3,b=5;intd1=(a+b)*(a+b);intd2=a*a+2*a*b+b*b;cout<<"d1="<voidmain(){intx=5;intf=3*x*x*x+2*x*x+5*x+2;cout<第77页共77页 voidmain(){doublea,b;cout<<"请输入两个double型数:";cin>>a>>b;cout<<"输入的两个数中较小的是";if(a<=b)cout<voidmain(){doublec,f;cout<<"请输入一个摄氏温度值:";cin>>c;f=9.0/5.0*c+32.0;cout<<"摄氏温度为"<voidmain(){doublea,b,c,d,e;cout<<"请输入5个double型数:";cin>>a>>b>>c>>d>>e;doublef=a+b+c+d+e;cout<<"输入的5个数的和是"<voidmain(){chara[]="12345";cout<*/第77页共77页 格式二://<注释信息>注释信息是用来对程序进行提示和说明的。1.使用const定义符号常量比使用#define定义符号常量有何优点?答:使用const定义符号常量时要指出数据类型,而用#define定义符号常量时不需提出类型,因此前者比后者对类型要求更严格,这样会更安全。2.内部静态存储类变量有何特点?答:内部静态存储类变贯的特点是作用域较小,但寿命很长,这种变量作用域与寿命不一致,因此会出现不可见但又存在的情况。3.在使用插入符(<<)输出若干个表达式值时,有的表达式中使用的运算符的优先级低于插入符优先级时应该如何处理?答:这时需将表达式用括号括起来,己改变其优先级。5.由多种不同运算符组成的表达式,其类型如何确定?例如,inta,b,c;…a=b>c?b:c;这是一个条件表达式还是赋值表达式?答:表达式类型由优先级低的运算符组成的表达式来确定。这是一个赋值表达式,因为赋值运算符优先级低于三目运算符。6.数组元素个数是由什么决定的?答:数组元素个数是由维数及其大小来决定的。一维数组元素个数是该维的大小,二维数组的元素个数是两维大小之积等。7.数组元素下标有何规定?答:C++语言中,数组元素下标从0开始。8.初始值表中数据项的类型和个数有何规定?答:初始值表中数据项的类型应与该变是类型相同,个数应小于或等于被初始化的数组元素的个数。9.字符数组和字符串有什么关系?答:字符数组中可存放字符串,而字符数组不都是存放字符串的。如果字符数组中有字符串结束符,则说明该字符数存放的是字符串。10.一个数组中的元素类型是否一定相同?何时定义的数组元素具有默认值?答:数组中元素类型必须相同。存储类为外部和静态的数组其元素具有默认值。第3章 语句和预处理 练习题33.1判断题√1.表达式和表达式语句是不同的。×2.空语句是一种没有用处的语句。×3.复合语句就是分程序。×4.条件语句中if子句和else子句都是必须有并且仅有一个。√5.条件语句中elseif子句可以没有,也可以有多个。√6.开关语句可实现多路分支。×7.开关语句的<语句序列>中必须有一个break语句,否则该开关语句便无法退出。×8.任何循环语句都是至少执行一次循环体。×9.退出for循环语句必须是for后面括号内的中间一个表达式的值为0。第77页共77页 √10.do-while循环语句至少要执行一次循环体。×11.循环语句的循环体中可以出现if语句,if语句的if体内不能出现循环语句。×12.goto语句中所使用的语句标号是一种标识符,它的作用域是文件级的。√13.break语句和continue语句都可以出现在循环体中,但是它们的作用是不同的。×14.文件包含命令所能包含的文件类型是不受限制的。3.2单选题1.下列关于语句的描述中,错误的是(A)。A.C++程序中的函数是由若干条语句组成的B.每条语句都要实现某种操作C.条件语句是用来实现分支操作的D.循环语句是用来在一定条件下重复执行某段程序的2.下列关于条件语句的描述中,错误的是(C)。A.if语句中最多只能有一个else子句B.if语句的if体内可以出现开关语句C.if语句中elseif子句和else子句的顺序是没有限制的D.if语句中else子句是与它最近的if子句配对的3.下列关于开关语句的描述中,错误的是(B)。A.开关语句中,case子句的个数是不受限制的B.开关语句中,case子句的语句序列中一定要有break语句C.开关语句中,default子句可以省略D.开关语句中,右花括号具有退出开关语句的功能4.下列关于循环语句的描述中,错误的是(A)。A.while循环语句中<条件>给定的表达式不能为非0的常量,否则便是死循环B.for循环语句的循环体内可以出现while循环语句、do-while循环语句和for循环语句C.循环语句的循环体可以是空语句D.循环语句的循环体内可以出现break语句,也可以出现continue语句5.已知:inti(3);下列do-while循环语句的循环次数是(D)。do{cout<voidmain(){intsum;_sum=0_;for(inti(1);__i<=100_;i++)if(_i%7==0__)sum+=i;cout<voidmain(){inta(8),b(5);if(!a)b--;elseif(b)if(a)a++;elsea--;elseb++;cout<第77页共77页 voidmain(){inta(10);while(--a){if(a==5)break;if(a%2==0&&a%3==0)continue;cout<voidmain(){intb(10);do{++b;cout<<++b<voidmain(){intw(5);do{switch(w%2){case1:w--;break;case0:w++;break;}w--;第77页共77页 cout<0);}答:31-15.#includevoidmain(){inta(4),b(5),i(0),j(0);switch(a){case4:switch(b){case4:i++;break;case5:j++;break;default:i++;j++;}case5:i++;j++;break;default:i++;j++;}cout<voidmain(){intb(10);for(inti=9;i>=0;i--){switch(i){case1:case4:case7:b++;break;case2:case5:case8:break;case3:case6:case9:b+=2;}}cout<voidmain(){inta(6);for(inti(1);i<=a;i++){for(intj=1;j<=a-i;j++)cout<<"";for(j=1;j<=2*i-1;j++)cout<<"A";cout<#defineMAX(x,y)(x)>(y)?(x):(y)voidmain(){typedefintIN;INa(3),b(4),c;c=MAX(a,b)*2;cout<voidmain(){ints=0;for(inti=1;i<100;i+=2)第77页共77页 s+=i;cout<voidmain(){intm,n,t;m=15;n=25;if(mvoidmain(){inta;doublei=2,j=1,sum=0,t;for(a=1;a<15;a++){sum+=i/j;t=i;i+=j;j=t;}cout<<"SUM="<#includevoidmain(){doublex(1),s(0);for(inti=1;fabs(x)>1e-8;i++){x*=(-1.0)*(2*i-3)/(2*i-1);s+=x;}s*=4;cout<<"pi="<voidmain(){ints(0),s1(0);for(inti=1;i<=10;i++){s1+=i;s+=s1;}cout<中都应该有break语句?答:通常case子句后面的<语句序列>中都有break语句,根据需要也可以没有break语句。4.循环语句的循环体中出现的continue语句的作用是什么?答:结束本次循环,转到循环头判断是否继续循环。第77页共77页 1.文件包含命令的功能吗?该命令一定要放在程序首部吗?答:该预处理命令是将指定的包含文件内容放在该命令出现的地方。通常放在程序开头,便于后边语句的使用。第4章 指针和引用 练习题44.1判断题×1.指针是变量,它具有的值是某个变量或对象的地址值,它还具有一个地址值,这两个地址值是相等的。√2.指针的类型是它所指向的变量或对象的类型。×3.定义指针时不可以赋初值。√4.指针可以赋值,给指针赋值时一定要类型相同,级别一致。×5.指针可以加上或减去一个int型数,也可以加上一个指针。√6.两个指针在任何情况下相减都是有意义的。√7.数组元素可以用下标表示,也可以用指针表示。×8.指向数组元素的指针只可指向数组的首元素。√9.指向一维数组的指针是一个二级指针。×10.指针数组的元素可以是不同类型的指针。√11.字符指针是指向字符串的指针,可以用字符串常量给字符指针赋值。×12.引用是一种变量,它也有值和地址值。√13.引用是某个变量的别名,引用是被绑定在被引用的变量上。√14.创建引用时要用一个同类型的变量进行初始化。√15.指针是变量,它可以有引用,而引用不能有引用。4.2单选题1.下列关于定义一个指向double型变量的指针,正确的是(B)。A.inta(5);double*pd=a;B.doubled(2.5),*pd=&d;C.doubled(2.5),*pd=d;D.doublea(2.5),pd=d;2.下列关于创建一个int型变量的引用,正确的是(A)。A.inta(3),&ra=a;B.inta(3),&ra=&a;C.doubled(3.1);int&rd=d;D.inta(3),ra=a;3.下列关于指针概念的描述中,错误的是(B)。A.指针中存放的是某变量或对象的地址值B.指针的类型是它所存放的数值的类型C.指针是变量,它也具有一个内存地址值D.指针的值(非常量指针)是可以改变的4.下列关于引用概念的描述中,错误的是(A)。A.引用是变量,它具有值和地址值B.引用不可以作数组元素C.引用是变量的别名D.创建引用时必须进行初始化5.已知:inta[5],*p=a;则与++*p相同的是(D)。A.*++pB.a[0]C.*p++D.++a[0]6.已知:inta[]={1,2,3,4,5},*p=a;在下列数组元素地址的表示中,正确的是(C)。第77页共77页 A.&(a+1)B.&(p+1)C.&p[2]D.*p++7.已知:inta[3][4],(*p)[4];下列赋值表达式中,正确的是(A)。A.p=a+2B.p=a[1]C.p=*aD.p=*a+28.已知:intb[3][5]={0};下列数组元素值的表示中,错误的是(D)。A.**(b+1)B.(*(b+1))[2]C.*(*(b+1)+1)D.*(b+2)9.已知:inta=1,b=2,*p[2];下列表达式中正确的是(C)。A.p=&aB.p=&bC.p[0]=&a,p[1]=&bD.p[]={&a,&b};10.已知:inta(5),&ra=a;下列描述中,错误的是(D)。A.ra是变量a的引用,即为变量的别名B.ra的值为5C.ra的地址值为&aD.改变ra的值为10,变量a值仍为54.3填空题1.单目运算符&作用在变量名左边,表示该变量的地址值,单目运算符*作用在指针名的左边,表示取该变量的值。2.指向一维数组元素的指针是一级指针,指向二维数组元素的指针是一级指针,指向一维数组的指针是二级指针,指向一级指针的指针是二级指针,一维一级指针数组名是二级指针的地址值,二维数组的数组名是二级指针的地址值。3.在一个二维数组b[3][5]中,b[0]与*b是等价的,&b[1]与b+1是等价的。4.指针的运算有4种,它们是赋值运算、一个指针加减整型数的运算、两个指针相减和比较运算。5.引用不是变量,它是某个变量或对象的别名。引用的值是被引用的变量的值,引用的地址值是被引用的变量的地址值。4.4分析下列程序的输出结果1.#includevoidmain(){inta[]={5,4,3,2,1};int*p=&a[2];intm(5),n;for(inti(2);i>=0;i--){n=(*(p+i)<*a)?*(p+i):*a;cout<voidmain()第77页共77页 {char*p1,*p2;p1="abcqrv";p2="abcpqo";while(*p1&&*p2&&*p2++==*p1++);intn=*(p1-1)-*(p2-1);cout<inta[]={10,9,6,5,4,2,1};voidmain(){intn(7),i(7),x(7);while(x>*(a+i)){*(a+i+1)=*(a+i);i--;}*(a+i+1)=x;for(i=0;iinta[][3]={1,2,3,4,5,6,7,8,9};int*p[]={a[0],a[1],a[2]};int**pp=p;voidmain(){int(*s)[3]=a;for(inti(1);i<3;i++)for(intj(0);j<2;j++)cout<<*(a[i]+j)<<","<<*(*(p+i)+j)<<","<<(*(pp+i))[j]<<","<<*(*s+3*i+j)<inta[]={1,2,3,4,5,6,7,8,9};voidmain(){int*pa=a;cout<<*pa<<",";cout<<*(pa++)<<",";cout<<*++pa<<",";cout<<*(pa--)<<",";pa+=4;cout<<*pa<<","<<*(pa+2)<voidmain(){charstr[][4]={"345","789"},*m[2];ints(0);for(inti=0;i<2;i++)m[i]=str[i];for(i=0;i<2;i++)for(intj(0);j<4;j+=2)s+=m[i][j]-"0";cout<voidmain(){doubled1=3.2,d2=5.2;double&rd1=d1,&rd2=d2;cout<voidmain(){int*p;int*&rp=p;第77页共77页 inta=90;p=&a;cout<<"a="<#includevoidswap(charp1[],charp2[]);voidmain(){chars1[10]="while",s2[10]="else",s3[10]="default",s4[10]="continue";if(strcmp(s1,s2))swap(s1,s2);if(strcmp(s3,s4))swap(s3,s4);if(strcmp(s1,s3))swap(s1,s3);cout<#includevoidinverse(char[]);voidmain(){chars[50];cout<<"输入一个字符串:";cin>>s;inverse(s);cout<<"反序后的字符串是"<voidmain(){intn[3][2]={{3,8},{-5,9},{2,4}};intlim=n[0][0];for(inti=0;i<3;i++)for(intj=0;j<2;j++)if(n[i][j]#includechar*str[5]={"abc","def","ghi","jkl","pqo"};char*modify(int,char[]);voidmain(){intn;chars[10];cout<<"修改第几个字符串:";cin>>n;cout<<"该字符串修改为:";cin>>s;cout<<"修改后的字符串是"<voidmain(){第77页共77页 intn,num[100];cout<<"输入排号人数:";cin>>n;int*p=num;for(inti=0;iintfun(intn){intp(1),s(0);for(inti(1);ivoidfun();voidmain(){for(inti(0);i<4;i++)fun();}voidfun(){inta(0);a++;staticintb;b++;cout<<"a="<intfac(int);voidmain(){ints(0);for(inti(1);i<=5;i++)s+=fac(i);cout<<"5!+4!+3!+2!+1!="<intfun(char*,char*);voidmain(){char*p1,*p2;p1="abcfgy";p2="abcdhu";intn=fun(p1,p2);cout<voidfun(int,int,int*);voidmain(){inta,b,c;fun(5,6,&a);fun(7,a,&b);fun(a,b,&c);第77页共77页 cout<intadd(int,int=5);voidmain(){inta(8);cout<<"sum1="<voidswap(int&,int&);voidmain(){inta(8),b(5);cout<<"a="<voidprint(int),print(char),print(char*);voidmain(){inta(800);print(a);print("a");print("break");}voidprint(inti){cout<doubles,sum(doubleb[],intn),average(intn);voidmain(){doublea[8];cout<<"输入8个double型数;";for(inti=0;i<8;i++)cin>>a[i];s=sum(a,8);doubleave=average(8);cout<<"SUM="<intmax(doubleb[],intn),min(doubleb[],intn);voidmain(){inta[8];cout<<"输入8个int型数;";for(inti=0;i<8;i++)cin>>a[i];cout<<"最大数为"<max)max=b[i];returnmax;}intmin(doubleb[],intn){intmin=b[0];for(inti=0;iintsum_day(int,int),leap(int);voidmain(){intyear,month,day;cout<<"请输入一个日期(yyyymmdd):";cin>>year>>month>>day;intdays=sum_day(month,day);if(leap(year)&&month>2)days++;cout<voidconvert(int);voidmain(){intnum;cout<<"请输入一个整型数:";第77页共77页 cin>>num;cout<<"输出的字符串是";convert(num);cout<intprime(int);voidmain(){intn;cout<<"请输入一个大于或等于6的偶数:";cin>>n;inti,j;cout<<"两个素数的所有可能有:n";for(i=2;i<=n/2;i++){j=n-i;if(prime(i)&&prime(j))cout<<"N="<classA{public:A(){a1=a2=0;cout<<"Defaultconstructorcalled.n";}A(inti,intj);~A(){cout<<"Destructorcalled.n";}voidPrint(){cout<<"a1="<classB{public:B(){cout<<++b<classDate{public:Date(inty,intm,intd){year=y;第77页共77页 month=m;day=d;}friendvoidPrint(Date&);private:intyear,month,day;};voidPrint(Date&d){cout<classC{public:C(inti,intj){c1=i;c2=j;}voidSum(Ca,Cb){c1=a.c1+b.c1;c2=a.c2+b.c2;}voidPrint(){cout<<"c1="<classS{public:S(){PC=0;}S(S&s){PC=s.PC;for(inti=0;i0)cout<classRectangle{public:Rectangle(inta,intb){width=a;length=b;}intArea(){returnwidth*length;}intPeriment(){return2*(width+length);}voidChangesize(inta,intb){width=a;length=b;}voidPrint();private:intwidth,length;};voidRectangle::Print(){cout<<"AREA="<classASMD{public:第77页共77页 ASMD(doublea,doubleb){x=a;y=b;}voidAddition(){cout<#includeclassStudent{public:Student(chars[],intgr){strcpy(name,s);grade=gr;totalize+=gr;}staticvoidPrint();private:charname[10];intgrade;staticinttotalize;};intStudent::totalize=0;voidStudent::Print(){cout<<"总成绩为"<p=5C.a.*p=5D.*a.p=53.VoidSet(A&a);是类A中一个成员函数的说明,其中A&a的含义是(A)。A.类A的对象引用a作该函数的参数B.类A的对象a的地址值作函数的参数C.表达式变量A与变量a按位与作函数参数D.指向类A对象指针a作函数参数4.已知:constAa;其中A是一个类名,指向常对象指针的表示为(D)。A.const*Apa;B.constA*pa;C.A*constpa;D.const*paA;5.下列关于子对象的描述中,错误的是(D)。A.子对象不可以是自身类的对象B.子对象是另一个类的对象C.子对象的初始化要包含在构造函数中D.一个类中只能有一个子对象6.执行下列说明语句,其调用构造函数的次数为(A)。Aa[5],*p[2];其中,A是一个类名A.5B.6C.7D.107.下列关于运算符new的描述中,错误的是(D)。A.它可以创建对象或变量B.它可以创建对象数组或一般类型数组C.用它创建对象或对象数组时要调用相应的构造函数D.用它创建的对象可以不用delete运算符释放8.下列关于运算符delete的描述中,错误的是(B)。A.使用该运算符可以释放用new运算符创建的对象或对象数组B.使用该运算符可以释放所有对象C.使用delete运算符时会自动调用析构函数D.用它释放对象数组时,它作用的指针名前要加下标运算符[]9.定义不同存储类对象时,必须要加的存储类说明符是(C)。A.autoB.externC.statieD.register10.下列关于this的描述中,错误的是(D)。A.this是一个由系统自动生成的指针B.this指针是指向对象的C.this指针在用对象引用成员函数时系统创建的D.this指针只能隐含使用,不能显式使用7.3填空题已知:classA{public:A(inti){a=i;}voidprint(){cont<classA{public:A(inti){a=i;}A(){a=0;cout<<"Defaultconstructorcalled."<Print();}答:Defaultconstructorcalled.0Defaultconstructorcalled.0Defaultconstructorcalled.0第77页共77页 Defaultconstructorcalled.0Destructorcalled.2Destructorcalled.3Destructorcalled.4Destructorcalled.52345Destructorcalled.5Destructorcalled.4Destructorcalled.3Destructorcalled.22.#includeclassB{public:B(inti){b=i;}B(){b=0;cout<<"Defaultconstructorcalled."<Print();for(i=0;i<4;i++)delete*(pb+i);}答:123第77页共77页 4Destructorcalled.1Destructorcalled.2Destructorcalled.3Destructorcalled.43.#includeclassC{public:C(inti){c=i;}C(){c=0;cout<<"Defaultconstructorcalled."<classD{public:D(){d1=d2=0;cout<<"Defaultconstructorcallrd.n";}D(inti,intj){d1=i;d2=j;cout<<"Constructorcalled."<<"d1="<classE{public:第77页共77页 E(inti,intj){e1=i;e2=j;cout<<"Constructorcalled."<<"e1="<e1;e2=e->e2;cout<<"Constructorcalled."<<"e1="<classF{public:classG{public:G(){}G(inti){g=i;}intGetValue(){returng;}voidPrint(F*p);private:intg;第77页共77页 }myg;friendclassG;F(inti,intj):myg(i){f=j;}private:intf;};voidF::G::Print(F*p){cout<f<#includeclassStack{public:Stack(inti);~Stack(){delete[]sta;}voidPush(inti);intPop();voidIsUpll(){if(tos==length){cout<<"Stackisfill.n";return;}}intIsEmpty(){if(tos==0)第77页共77页 {cout<<"Stackunderflow.n";return0;}}private:int*sta;;inttos,length;};Stack::Stack(inti){sta=newint[i];if(!sta){cout<<"Can"tallocatestack.n";abort();}tos=0;length=i;}voidStack::Push(inti){sta[tos]=i;tos++;}intStack::Pop(){tos--;returnsta[tos];}voidmain(){Stacka(50);a.Push(1);a.Push(2);a.Push(3);a.Push(4);a.Push(5);a.Push(6);a.Push(7);a.Push(8);a.Push(9);a.Push(10);cout<#includeclassStudent{public:Student(chars[],intgr){strcpy(name,s);grade=gr;}friendvoidfun();private:charname[10];intgrade;};Studentss[5]={Student("马力",85),Student("王欣",96),Student("李明",82),Student("赵亮",78),Student("张京",80)};voidfun(){intk=0;for(inti=0;i<5;i++)if(ss[i].grade>ss[0].grade)k=i;cout<<"最高分的学生姓名和成绩如下:n"<classA第77页共77页 {public:A(){cout<<"InA0.n";}A(inti){a=i;cout<<"InA1."<classA{public:A(inti,intj){a1=i;a2=j;}voidMove(intx,inty)第77页共77页 {a1+=x;a2+=y;}voidPrint(){cout<<"("<classA{public:voidInitA(inti,intj){a1=i;a2=j;}voidMove(intx,inty){a1+=x;a2+=y;}intGeta1(){returna1;}intGeta2(){returna2;}private:inta1,a2;};classB:publicA{public:voidInitB(inti,intj,intk,intl){InitA(i,j);b1=k;b2=l;}voidMove(intx,inty){b1+=x;b2+=y;}intGetb1(){returnb1;}第77页共77页 intGetb2(){returnb2;}private:intb1,b2;};classC:publicB{public:voidfun(){Move(10,15);}};voidmain(){Cc;c.InitB(11,12,13,14);c.fun();cout<classA{public:A(inti):a(i){cout<<"A:constructorcalled.n";}~A(){cout<<"A:Destructorcalled.n";}voidPrint(){cout<classA{public:A(inti){cout<<"ConstructorinA."<#includeclassPerson{public:Person(char*s){name=newchar[strlen(s)+1];strcpy(name,s);}voidPrint(){cout<<"姓名:"<#includeclassLine{public:Line(inti){length=i;}voidShow(){for(inti=0;i::<虚函数名>C.使用构造函数调用虚函数D.使用成员函数调用虚函数10.下列关于动态联编的描述中,错误的是(C)。A.动态联编是函数联编的一种方式,它是在运行时来选择联编函数的B.动态联编又可称为动态多态性,它是C++语言中多态性的一种重要形式C.函数重载和运算符重载都属于动态联编D.动态联编只是用来选择虚函数的9.3填空题1.C++语言多态性主要表现在动态联编、 函数 重载和 运算符 重载。2.运算符重载函数的两种主要方式是 成员 函数和 友元 函数。3.静态联编支持的多态性称为 静态 多态性,它是在 编译 时进行的;动态联编支持的多态性称为 动态 多态性,它是在 运行 时进行的。4.虚函数是一种 非静态 成员函数。说明方法是在函数名前加关键字 virtual 。虚函数具有 继承 性,在基类中被说明的虚函数,具有相同说明的函数在派生类中自然是虚函数。1.含有 纯虚函数 的类称为抽象类。它不能定义对象,但可以定义 对象指针和 对象引用 。9.4分析下列程序的输出结果1.#includeclassMatrix{public:Matrix(intr,intc){row=r;col=c;elem=newdouble[row*col];}double&operator()(intx,inty){returnelem[x*col+y];}第77页共77页 ~Matrix(){delete[]elem;}voidprint(inti){cout<classA{public:virtualvoidfun(){cout<<"A::fun()called.n";}};classB:publicA{voidfun(){cout<<"B::fun()called.n";}};voidffun(A*pa){pa->fun();}voidmain(){A*pa=newA;ffun(pa);B*pb=newB;ffun(pb);}答:A::fun()called.B::fun()called.3.#includeclassA{public:A(){ver="A";}virtualvoidprint(){cout<<"TheAversion"<print();}voidmain(){Aa;B1b1(14);B2b2(88);B3b3(65);print_info(&a);print_info(&b1);print_info(&b2);print_info(&b3);}答:TheAversionATheB1info:14versionBTheB2info:88versionATheB3info:65versionC4.#includeclassB{public:virtualvoidfun1(){cout<<"B::fun1().n";}virtualvoidfun2(){cout<<"B::fun2().n";}voidfun3()第77页共77页 {cout<<"B::fun3().n";}voidfun4(){cout<<"B::fun4().n";}};classD:publicB{public:voidfun1(){cout<<"D::fun1().n";}voidfun2(){cout<<"D::fun2().n";}voidfun3(){cout<<"D::fun3().n";}voidfun4(){cout<<"D::fun4().n";}};voidmain(){B*pb;Dd;pb=&d;pb->fun1();pb->fun2();pb->fun3();pb->fun4();}答:D::fun1().D::fun2().B::fun3().B::fun4().5.#includeclassA{public:A(){cout<<"InAcons.n";}virtual~A(){cout<<"InAdes.n";}virtualvoidf1(){cout<<"InAf1().n";}voidf2(){f1();}};classB:publicA{public:B(){f1();cout<<"InBcons.n";}~B(){cout<<"InBdes.n";}};classC:publicB{public:C(){cout<<"InCcons.n";}~C(){cout<<"InCdes.n";}voidf1(){cout<<"InCf1().n";}第77页共77页 };voidmain(){A*pa=newC;pa->f2();deletepa;}答:InAcons.InAf1().InBcons.InCcons.InCf1().InCdes.InBdes.InAdes.6.#includeclassA{public:virtualvoidprint()=0;};classB:publicA{public:voidprint(){cout<<"InBprint().n";}};classC:publicB{public:voidprint(){cout<<"InCprint().n";}};voidfun(A*pa){pa->print();}voidmain(){A*pa;Bb;Cc;pa=&b;fun(pa);pa=&c;fun(pa);}答:InBprint().InCprint().9.5编程题1.编程求圆、圆内接正方形和圈外切正方形的面积和周长。要求使用抽象类。答:编程如下:#includeconstdoublePI=3.1415;classShape{第77页共77页 public:Shape(doublei){r=i;}virtualvoidArea()=0;virtualvoidPerimeter()=0;protected:doubler;};classCircle:publicShape{public:Circle(doublei):Shape(i){}voidArea(){cout<<"圆的面积是"<Area();ps->Perimeter();ps=newIn_Square(8);ps->Area();ps->Perimeter();ps=newEx_Square(8);ps->Area();ps->Perimeter();deleteps;第77页共77页 }1.在类的多层次继承结构中,类之间哪些函数是按作用域规则处理的?哪些函数是按多态性规则处理的?试编程说明之。答:一般成员函数是按作用域规则处理的,虚函数是按多态性规则中的动态联编处理的。下列程序中有一般成员函数和虚函数。#includeclassA{public:voidPrint(){cout<<"InA.n";}virtualvoidfun(){cout<<"virtualA.n";}};classB:publicA{public:voidPrint(){cout<<"InB.n";}virtualvoidfun(){cout<<"virtualB.n";}};voidtext(A&a){a.fun();}voidmain(){Aa;Bb;a.Print();b.Print();text(b);}9.6简单回答下列问题1.运算符重载使用成员函数方法和友元函数方法是否都可以?并且是没有区别的吗?答:两种方都法可以。有区别,参数个数不同。2.运算符重载实际上通过函数来重新定义运算符的功能,运算符重载的功能直接通过函数调用是否可以?答:可以。3.多态性中对函数的选择从时间上来区分有哪两种方式?答:一种是在编译时选定函数,称静态联编方式,另一种是在运行时选定函数,称动态联编方式。4.有虚函数是否就一定是动态联编?非虚函数是否就一定是静态联编?答:不一定。一定是。5.第77页共77页 在多层次的继承结构中,基类与派生类中存在着虚函数,这时调用虚函数就一定实现动态联编吗?答:不一定。第10章 C++语言的输入/输出操作 练习题1010.1判断题√1.C++语言提供的文件操作包含文本文件和二进制文件。×2.预定义的提取符和插入符不可以再重载。√3.C++语言中的读写函数,不仅可用于标准文件,也可用于磁盘文件。×4.使用插入符输出一个字符串与使用write()成员函数输出一个字符串是没有差别的。×5.使用成员函数put()一次可写入一个字符串。×6.读取一个字符的成员函数get()是不可以带参数的。√7.读取一行字符的成员函数getline()具有一个默认的参数值"n"。×8.使用read()成员函数一次只能读取一行字符。√9.输出数据的默认对齐方式是右对齐。√10.使用流对象的成员函数进行格式输出要比使用控制符进行格式输出复杂些,因为成员函数需要对象调用,而控制符可直接使用。√11.在非标准文件操作中,应该先定义流对象,再打开文件,必须使用open()函数。√12.关闭打开的文件时使用成员函数close(),该函数无参数。√13.进行二进制文件操作时,在打开文件方式中增加ios::binary选项。×14.在定位文件的读/写指针的操作中,只能向增加字节数的方向移动,不能向减少字节数的方向移动。√15.C++语言的文件操作中,既可以顺序读写,又可以随机读写。×16.读/写指针相关函数tellp()的返回值是一个longint型数,这表示当前读指针距文件尾的字节数。√17.在文件操作中,通常使用打开文件的流对象的值来判断打开文件是否成功。×18.文件结束函数eof()返回值为0时,表示文件结束。10.2单选题1.C++语言程序中进行文件操作时应包含的头文件是(A)。A.fstream.hB.math.hC.stdlib.hD.strstrea.h2.C++语言程序中进行字符串流操作时应包含的头文件是(D)。A.fstream.hB.math.hC.stdlib.hD.strstrea.h3.C++语言程序中使用控制符进行格式输出时应包含的头文件是(B)。A.fstream.hB.iomanip.hC.math.hD.strstrea.h4.下列各语句是输出字符"A"的,其中错误语句是(D)。A.cout<<"A";B.cout.put("A");C.charch="A";cout<#includevoidmain(){inta=234;cout<#includeostream&out1(ostream&outs){outs.setf(ios::left);outs<#includevoidmain(){for(inti=1;i<6;i++)cout<#include#includevoidmain(){fstreaminf,outf;outf.open("my.dat",ios::out);if(!outf){cout<<"Can"topenfile!n";abort();}outf<<"abcdef"<#include#include第77页共77页 voidmain(){fstreamf;f.open("my1.dat",ios::out|ios::in);if(!f){cout<<"Can"topenfile!n";abort();}charch[]="abcdefg1234567.n";for(inti=0;i#include#includestructstudent{charname[20];longintnumber;inttotalscore;}stu[5]={"Li",502001,287,"Gao",502004,290,"Yan",5002011,278,"Lu",502014,285,"Hu",502023,279};voidmain(){students1;fstreamfile("my3.dat",ios::out|ios::in|ios::binary);if(!file){cout<<"Can"topenfile!n";abort();}for(inti=0;i<5;i++)file.write((char*)&stu[i],sizeof(student));file.seekp(sizeof(student)*2);file.read((char*)&s1,sizeof(stu[i]));cout<voidmain(){intch,n=0;cout<<"输入含有若干个xy子串的字符序列,以结束:n";while((ch=cin.get())!=EOF)if(ch=="x"&&cin.peek()=="y")第77页共77页 n++;cout<<"出现xy子串的次数为"<#include#includevoidmain(){fstreamf;f.open("abc.txt",ios::in);if(!f){cout<<"abc.txtcan"topen.n";abort();}charch;intn=0;while(!f.eof()){f.get(ch);n++;}cout<<"该文件字符数为"<#include#includevoidmain(){fstreaminf,outf;inf.open("del.cpp",ios::in);if(!inf){cout<<"Can"topen.n";abort();}outf.open("del22.cpp",ios::out);if(!outf){cout<<"Can"topen.n";abort();}chars[80];intn=1;while(!inf.eof())第77页共77页 {inf.getline(s,sizeof(s));outf<