《C++面向对象程序设计》
自学指导书
浙江师范大学 信息科学与工程学院
朱建新 编
2005年4月30日
1
《C++面向对象程序设计》 函授自学指导书
目 录
第一章 C++语言概述 ........................................................................................... 4
【学习要点】.................................................................................................. 4 【例题分析】.................................................................................................. 4 【思考题】...................................................................................................... 5 第二章 基本数据类型 运算符及表达式............................................................. 6
【学习要点】.................................................................................................. 6 【例题分析】.................................................................................................. 6 【思考题】...................................................................................................... 8 第三章 控制结构................................................................................................... 8
【学习要点】.................................................................................................. 8 【例题分析】.................................................................................................. 9 【思考题】.................................................................................................... 17 第四章 数组......................................................................................................... 20
【学习要点】................................................................................................ 20 【例题分析】................................................................................................ 21 【思考题】.................................................................................................... 24 第五章 函数与编译预处理................................................................................. 33
【学习要点】................................................................................................ 33 【例题分析】................................................................................................ 33 【思考题】.................................................................................................... 40 第六章 指针......................................................................................................... 49
【学习要点】................................................................................................ 49 【例题分析】................................................................................................ 50 【思考题】.................................................................................................... 58 第七章 结构体与共用体..................................................................................... 60
【学习要点】................................................................................................ 60 【例题分析】................................................................................................ 60 【思考题】.................................................................................................... 67 第八章 类与对象................................................................................................. 70
【学习要点】................................................................................................ 70 【例题分析】................................................................................................ 71 【思考题】.................................................................................................... 77 第九章 继承与派生类......................................................................................... 80
【学习要点】................................................................................................ 80 【例题分析】................................................................................................ 80 【思考题】.................................................................................................... 84 第十章 运算符重载与虚函数............................................................................. 89
【学习要点】................................................................................................ 89 【例题分析】................................................................................................ 89 【思考题】.................................................................................................... 99 第十一章 文件与流类库................................................................................... 100
【学习要点】.............................................................................................. 100
2
《C++面向对象程序设计》 函授自学指导书
【例题分析】.............................................................................................. 100 【思考题】.................................................................................................. 105
3
《C++面向对象程序设计》 函授自学指导书
第一章 C++语言概述
本章主要介绍C+十的起源、发展历史及其特点;C+十程序的基本结构;Visual C++6.0集成开发环境及上机操作过程。
【学习要点】
1. 了解C+十语言的特点。
2. 理解C+十语言源程序的结构、书写格式和main()函数的作用。
3. 熟悉 Visual C++6.0集成开发环境。熟练掌握利用 Visual C++6.0集成开发环境开发、调试C+十控制台程序的步骤和基本操作。
【例题分析】
一、选择题
例1-1 以下叙述中正确的是_。 A. C+十程序由main()函数组成 B. C+十程序由函数组成
C. C+十程序的执行从第一个函数开始
D. 在C+十程序中,注释只能位于一条语句之后 解:对于C+十程序应明确:
(l)程序由函数组成。一个可运行的C+十源程序可由一个且仅能由一个 main()函数加上其他的函数组成,其他函数可有可无。
(2)不管main()函数出现在什么位置,程序总是从main()函数开始执行。
(3)注释的两种方法:一是用/*和*/把注释信息括起来;二是用//,它表示//之后到本行结束为注释内容。可以在程序任何位置进行注释。 正确答案:B。 二、填空题
例1-2 在下列程序的每行之后加上注释。 #include \"iostream.h\" void main() {
cout<<\"Hello!\\n\";
cout<<\"Welcome to C++!\\n\"; }
解:注释如下:
#include \"iostream.h\" //指示编译器在此处将文件iostream.h上中的代码嵌入本程序。
void main() //主函数,void表示 main()函数没有返回值。 {
cout<<\"Hello!\n\";//输出字符串“Hello!”到显示器上。
4
《C++面向对象程序设计》 函授自学指导书
cout<<“Welcome to C++!\\n\";//输出字符串“Welcome to C++!\\n”。 }
例1-3 C+十中函数的函数体由符号_开始,用符号_结束。
解:C+十中函数的函数体由符号“{”开始,用符号“}”结束。 三、 编程题
例1-4 编写一个程序,运行时提示输入一个数字,再把这个数字显示出来。 解: 程序如下:
#include \"iostream.h\" void main( ) {
int i;
cout<<\"请输入一个数字:\"; cin>>i;
cout<<\"你输入的数字是\"<【思考题】
一、选择题
1. C+十语言规定:在一个源程序中,main()函数的位置_。 A. 必须在最开始
B. 必须在系统调用的库函数的后面 C. 可以任意 D. 必须在最后
2. 以下正确的叙述是_。
A. C+十程序的每行中只能写一个语句 B. C+十语言本身无输入、输出语句
C. 在对一个C+十源程序进行编译的过程中,可发现注释中的拼写错误 D. 在C+十程序中,main()函数必须位于程序的最前面 3. 以下符号中能作为用户标识符的是_。 A. 123 B. void C. struct D .switch 4. C+十语言程序的基本单位是_。 A. 程序行B. 语句C. 函数D. 字符 二、填空题
5. 一个可执行的C+十程序至少必须有一个_函数。 6. C+十源程序中注释的作用是_。
7. 一个C+十语句以_结束。_是C+十语句的组成部分。 8. 在C+十语言中输入、输出操作是通过_来实现的。 9. 在下列程序的每行之后力,上注释。 #include<iostream.h> void main() {
int nl, n2, sum;
cont<<\"Emter two numbers n1,n2:\"; cin>>n1>>n2; sum=n1+n2;
cout<<\"n1+n1=\"<<sum<<endl;
5
《C++面向对象程序设计》 函授自学指导书
}
三、编程题
10. 参照例题分析,编写一个C+十程序并上机运行,能输出以下信息:
************************************** Hello,C++!
**************************************
11. 编写一个C+十程序,输入任意三个数a,b,c,能输出其中的最大值。
第二章 基本数据类型 运算符及表达式
本章是C+十语言中需要熟记的内容最多的一章,对于数据类型、运算符、表达式等内容既要熟记,更要灵活运用;特别要注意与自然语言明显不同的逗号运算、自增自减等运算的特点。
【学习要点】
1. 掌握常量与变量、整型数与实型数的概念。
2. 掌握字符型数据与字符串型数据的概念以及二者的区别。 3. 掌握各种类型的变量说明及其初始化。
4. 掌握算术运算、逻辑运算、关系运算、赋值运算、逗号运算等概念。 5. 掌握运算符的优先级、左结合和右结合规则以及目数的概念。 6. 掌握表达式求值时类型的自动转换和强制类型转换。 7. 掌握表达式的组成、表达式的优化。 8. 掌握位运算和位运算符。
【例题分析】
一、选择题
例 2-1 下列不合法的变量名为_
A. student B. -student C._student D. student()
解:根据变量命名要求,首字母以英文字母或下划线开头。 正确答案:B。
例 2-2 下列不合法的变量名为
A.t%udent B.astudent C.s_tudent D.studen()
解:根据变量命名要求,变量名组成只能由大小写字母、数字、下划线组成。 正确答案:A。
例2-3 下列不合法的变量名为_
A.lint B.int1 c.int D._lint
解:根据变量命名要求,系统关键字不能作为变量名。 正确答案:C。
例 2-4 当 a=6,b=5时,逻辑表达式 a<=7&&a+b>8的值为__ A.true B.false C. 非0整型数 D. 0 解:根据题意和该逻辑表达式的运算结果。
6
《C++面向对象程序设计》 函授自学指导书
正确答案:C。
例 2-5 设 X,y,Z为整型数,下列各式中,运算结果与 X=y=24的表达式相同的是_。
A.x=(y=z=8,4×6) B.x= y=(z=8,4×6) C.X= y= z=8,4×6 D.x=(y= z= 8),4×6
解:C++语言的赋值运算有别于其他高级语言,逗号运算又是其他高级语言所没有的。
1. 在赋值表达式中,可以有多个赋值运算符;计算顺序自右向左,运算优先级低,仅高于远号运算符。
2. 逗号既是分隔符,又是运算符,可以用一个逗号运算符或多个逗号运算得将多个表达式连接成逗号表达式,计算顺序自左向右,并将最后一个表达式的值作为整个逗号表达式的值,运算优先级最低;例:a=(2×2, 4+6,20/4,6);结果a=6。
正确答案:B。
例2-6 设i=6,k=0下列各式中,运算结果为k=7 的表达式是_。
A. k=i+++k B. k=k+i++ C. k=++i+k D.k=k+(十十i) 解:自增十十、自减――运算符是C+十语言特有的。
1.运算符在变量的前面或后面,其运算结果是不同的。若十十或--在变量前;则先将变量的值加1(或减 1后,再将变量的值参加运算;反之则先将变量的值参加运算;再将变量的值加1(或减1)。
2.自增、自减运算符优先级高于算术运算符,A式i+++k,先计算i++,
再力。k,D式 k= k+(++i),若去掉括号,则改变了运算顺序;变为 k+十后, 再十l。
正确答案;C和D。 二、填空题
例 2-7 表达式'A'+'B'+20的值为_
解:不同类型的数据混合运算时,系统可以自动进行类型转换,将表示范围小的数据类型转换成另一操作数的相同类型后再参与运算,则转换为65+66+20=151。
例2-8 如果定义int e=8;double f=6.4,g=8.9;则表达式f+int(e/3*int (f+g)/2)%4的值为_。
解:不同类型的数据混合运算时,可以使用强制类型转换符,强制将一种数据类型转换成另一种数据类型后再参与运算,对于表达式,先求表达式的值,然后再转换值的类型,本例的运算结果为 9.4 。若将式中 e/3改为 e/3.0
则运算结果为6.4,因为e/3的值是整型数,而e/3.0的值是实型数,改变了括号内的运算结果,致使整个表达式的值发生变化。
例2-9 若int i= 65535,j =0x000x,k:k=i&j; ,则k值为_,i值为_。 解:将 10进制数65535和 16进制数000aH在计算机内的二进制原型数值按位与运算,结果为 k= 10,i为 65535。
三、编程题
例 2-10 编写一个将华氏温度转换为摄氏温度的程序。转换公式为 C=(5.0/9)(F—32),要求输出华氏温度和摄氏温度的对应值。
解:程序如下: #include double C,F; 7 《C++面向对象程序设计》 函授自学指导书 cout<<\"输入华氏温度值:\"; cin>>F; C=(5.0/9)*(F-32); cout<<\"华氏温度为:\"< 一、选择题 1. 以下可作为正确变量名的是_。 A .class B. class1 C. 1class D. cl\\ass 2 以下可作为正确变量名的是。 A .case B.-cd C. 33 D. 33s 3.若a=15,b=3 时,逻辑表达式a<=7&&a+b>8 的值为 A.ture B.false C. 非0整型数 D.0 4. 若a和b为整型变量,语句b= (a=1+2 a×3),a+5运行后,a 和b的结果为 A .9,8 B. 3,8 C. 3,9 D. 9,14 5. 以下不正确的叙述是_。 A.在C+十程序中,PI和pi是不同的变量 B.在C+十程序中,逗号运算符的优先级最低 C.当从键盘输入数据时,对于整型变量只能输入整型数值,对于实型变量只能输入实型数值 D. 若 s、t为int数,设 t=S>>2后,s的值不变 6.若int a;char b;float c; double d;则表达式a*b-c+d值的数据类型为_。 A. int B. float C. double D. char 7. 已知字母 A的ASCII码为十进制数 65,D为字符型变量,则D='A'+'9'-'4' 的值_ 。 8. 若a为16进制数,若想通过a&b运算使a的二进制数的高4位清零,低4位不变;则 b的 16进制数是_。 9. 编制程序,输入相应字母的 ASCII码值,输出该字母。 10. 用C+十描述下面命题: (1)a小于b或大于c (2)a和b中至少有一个大于c。 (3)a和b中只有一个大于c。 (4)a和b中两个都大于c。 第三章 控制结构 【学习要点】 1.掌握顺序结构的编程方法,这是程序设计的基础。 8 《C++面向对象程序设计》 函授自学指导书 2.学会cin、cout实现输入/输出数据。 3.学会应用字符输入/输出函数。 4.掌握 printf函数和 scanf函数。 5.掌握条件语句的形式和使用. 6.掌握条件语句的嵌套。 7.掌握条件运算符的使用。 8.掌握switch语句的形式和使用。 9.掌握 for,while,do—while三种循环语句。 10.掌握循环的嵌套。 11.掌握break,continue,goto语句. 【例题分析】 一、多项选择题 例3-1 如有以下定义和输入语句,若要求al、a2、c1、c2的值分别为20、60、A、B,则下列数据输入方式中正确的是_。 int a1,a2; char c1,c2;; cin>>a1>>c1>>a2>>c2; A.20A ┗┛60B B.20,A,60,B C. 20┗┛ A┗┛ 60┗┛ B D.20A60B E.20 注:此处┗┛为空格符,<CR>为回车键符,下文同。 解:C+十语言没有专门的输入/输出语句,其输入/输出可通过输入/输出流来实现。cin不能将输入的空格赋给字符型变量,空格和回车键均作为输入字符之间的分隔符;字符型变量只能容纳一个字符,整型数只能由数字组成;逗号不能作为分隔符。 正确答案:A、C、D、E。 例3-2 设有语句float PI= 3.14;,若用科学表示法输出为3.140000e+000则下列正确的表达式为__ A.cout<<PI<<endl; B.cout.setf(ios:: scientific,ios::floatfield);cout<PI<<\"\\n\"; C.printf(\"%12.10f\\n\",PI); D.printf(\"%e\n\",PI); 解:C+十语言除用输出流输出数据外,还可用C语言的输入/输出函数,但需包含stdio.h,其输出格式与C+十输出流格式不同:C+十中可用预定义的格式控制函数定义输出格式,也可以用ios类的成员函数进行格式控制。若学用科学表示法输出数据,必须用ios类成员函数 setf设置状态标志。printf函数必须用e格式符才可以输出科学表示法形式的数据。 正确答案:B、D。 二、填空题 例3-3 以下程序的输出结果为_____________ #include<iostream.h> void main() { short i; i=-6; cout<<"oct="<<oct<<i<<\"dec\" <<dec<i<<\=\"<<hex<<i<endl: } 9 《C++面向对象程序设计》 函授自学指导书 解:i为short 类型,占用2字节内存,而oct、dec、hex是C+十中预定义的格式控制函数控制输入/输出数据的格式。答案为 oct=177772, dec=-6, hex= fffa。 例 3-4 以下程序的输出结果为 #include<iostream.h> void main() { int i=66; char c='A'; cout<<\"i=\"<<(char)i<<\} 解: 本程序采用了强制型转换符,将i转换为字符型数据输出,又用格式控制函数将字符型数据转换成数值型数据输出。答案为i=B,C=66a 例3-5 以下程序的输出结果为___________ #include int i=0,x=0,y=0; do { i++; if(i%3!=0) { x+=i;i++; } y+=i++; } while(i<5), cout<<\"x=\"< 例3-6 以下程序的输出结果为_________ #include int x, y=10; while(x=y-l) { y-=2; if(y%3==0) { x++; continue; } else if(y<4) break; x++; } cout<<\"x=\"< 例3-7 以下程序的输出结果为______________ #include for(i=1;i<4;i++) { for(j=l;j<7;j++) 10 《C++面向对象程序设计》 函授自学指导书 { if(j= =4) break; m=i*j; cout<cout< 解: 运行结果如下: l×l = 1 l×2 = 2 l×3 = 3 2×l = 2 2×2 = 4 2×3 = 6 3×1 = 3 3×2 = 6 3×3 = 9 注意:当j的值为4时,结束的是内层循环,外层for循环继续执行。 例3-8 以下程序的输出结果为___________ #include for(i= l;i<4;i++) { for(j=1;j<7;j++) { if(j = = 4) continue; m=i *j; cout<cout< 1×l = l l×2=2 l ×3=3 1×5=5 l ×6=6 2×1 = 2 2×2=4 2×3= 6 2×5 = l0 2×6= l2 3×l =3 3×2= 6 3×3=9 3×5 = l5 3×6= 18 注意: continue结束本次循环,即当j的值为4时,内层循环体的条件语句后面的部分不执行,循环变量j自加,执行下一次内层循环。 例3-9 输入一个自然数,输出其各因子的连乘形式。如输入12,输出12=12×2×3的形式,请填空。 #include int i=2, n; cout<<\"输入一个自然数:\"; cin>>n; cout< cout<<'*'<______1_________; } else i++; 11 《C++面向对象程序设计》 函授自学指导书 } while(____2_____); } 解: ①n=n/i;②n!=1 三、编程题 例 3-10 编程实现如下所示的函数关系式。已知 X,求 y的值。 x (x<1) y= x+5 (1≤x≤10) x-5 (x≥ l0) 解:该函数实质是一个分段函数,即根据x的不同取值范围,由相应的函数式求y的值。 (1)使用缺省else的if语句形式 #inc1ude float x,y; cout<<\"Enter a number: \"; cin>>x ; if(x cout<<\"y= \" < float x,y; cout<<\"Enter a number:\"; cin>>x; if(x<1) y=x; else if(x< 10) y=x+5; else y=x-5; cout<< \" y= \" < 解:本题要根据月份来讨论天数,如是大月(1,3,5,7,8,10,12)则天数是31,如是小月(4,6,9,11)则天数是30;如是2月;要看该年是否闰年,是闰年则为29天,非闰年则为28天,显然本程序采用多分支选择结构。具体程序如下: #include int year,month,days; cout<<\"Enter the year: \"; cin>>year; cout<<\"Enter the month:\"; 12 《C++面向对象程序设计》 函授自学指导书 cin>>month; switch(month) { case 1: case 3: case 5: case 7: case 8: case 10: case l2:days=3 1;break; case 4: case 6: case 9: case 11:days=30;break; case 2: if((year%4==0& & year%100!=0) || year%400= =0) days=29; else days=28; break; default:cout<<\"Input error ! \"< 例3-12 求下列分数序列的前15项之和。 2/1,3/2,5/3,8/5,13/8,21/13,... 解:根据题意可采用累加方法,为此需定义一个存放累加结果的变量sum,累加的过程自然是通过循环结构来实现,循环变量i的取值范围是1到15,且循环变量表示当前的数列项数;在循环体内不仅要计算数列第i项的值,还要计算前i项的累加和。数列的规律:从第2项开始;每一项的分母是前一项的分子,而分于是前一项的分子分母之和,即第i-1项为a/b,则当i>l时,第i项为(a+b)/a。程序如下: (l)用while语句实现。 #include { float sum,t,a,b; int i; a=2;b= l;i= 2 ) t=a/b; sum=t; while(i<=5) { a=a+b; //求第i项的分子 b=a-b; //求第i项的分母 t=a/h; //求第i项的值 sum+=t; //求第i项的和 i++; } cout<<\" sum=\" < 13 《C++面向对象程序设计》 函授自学指导书 { float sum,t,a,b; int i, a=b= 1.0, sum=0.0; for(i= 1;i<= 15;i++) { a=a+b; //求第i项的分子 b=a-b,; //求第i项的分母 t=a/b; //求第i项的值 sum+=t; //求第i项的和 } cout<< \"sum= \" << sum< { float sum,t,a,b; int i=l, a=b=1.0;sum=0; do { a=a+b; //求第i项的分子 b=a-b; //求第i项的分母 t=a/b; //求第i项的值 sum+=t; //求第i项的和 } while(++i<= 15); cout<< \"sum=\" < 解:计算5n可用循环语句实现,本例仅以while语句实现。 #include int i=1,n; float resuIt=1.0; cout<<\"输入n:\"; cin>>n; if(n) { while(i<=n) { result*=5.0; i++; } cout<<\"结果是: \"< 例3-14 1-l/2+1/3-1/4+„+l/99-1/100的值。 解:本题仅以for语句实现。 #include float sum=0.0, s=1 .0; 14 《C++面向对象程序设计》 函授自学指导书 for(int i=l;i<=l00;i++) { sum+=s/i; s=-s, } cout<<\"结果是: \"< char ch; int i=0; while ((ch=getchar() ) ! ='\\n' ) { if(ch!='C'&&ch!='+') { i++; continue; } cout< 解:要求程序具有灵活性,程序中参加统计的学生人数应随具体情况而定,不应固定,若以输入负数作为统计结束条件,则程序如下: #include float score;max;min;sum=0.0; int num=0; cout<<\"输入一个成绩!\"; cin>>score; max=min= score; whi1e(score>=0) { if(score>max) max=score; if(score if(num) { cout<<\"共统计 \"< 《C++面向对象程序设计》 函授自学指导书 cout<<\"平均成绩是\"< 例3-17 从键盘不断读入字母,如字母为元音字母,则输出其相应的大写字母,否则结束程序 解: #include char ch; int quit=0; do { cout<<\"\\n 输入一个字母:\"; cin>>ch; switch(ch) { case 'a':cout<<'A'; break; case 'e':cout<<'E'; break; case 'i':cout<<'l'; break; case 'o':cout<<'O'; break; case 'u':cout<<'U'; break; default: quit=1; break; } } while(!quit); } 例3-18 模拟计算器进行加、减、乘、除数学运算。要求当输入两个操作数和运算符后,输出运算结果。一次运算结束后询问用户是否继续,用户根据需要可继续进行运算。 解: #include char op; char quit='y'; float dl;d2; while(quit= ='y'|| quit= ='Y') { cout<<\"输入:第一个操作数;运算符和第二个操作数\"< case '+': cout< case '-': cout< case '*': cout< case '/':if(d2==0.0) { cout<<\"输入错误! \"< 《C++面向对象程序设计》 函授自学指导书 else cout< cout<<\"是否继续(y)? \"; cin>>quit; } } 【思考题】 一. 选择题 1.以下程序的输出结果是_______ #include int w=4,x=3,y=2,z= 1,result; result=w 2.若所以变量均已正确说明,下列程序运行后X的值是________ a=b=c=0;x=35; if(! a)x--; else if(b) x=2; if(c) x=3; else x=4; cout< 3. 若已有说明语句int x,y;则不能实现以下函数关系的程序段是________ -1 (x<0) y= 0 (x=0) 1 (x>1) A. if (x<0) y=-1; B. y=-1; else if (x= =0) y=0; if (x!=0) else y=l; if(x>0) y=1; e1se y=0; C. y=0; D. if(x>=0) if(x>=0) if(x>0) y=l; {if(x>0) y=1;} else y=0; else y=-l; e1se y=-1; 4.设有说明语句int a=1,b=0;则执行以下语句后输出为______ switch(a) 17 《C++面向对象程序设计》 函授自学指导书 { case l: switch(b) { case 0:cout<<\" **0**\";break; case l: cout<<: **1** ;break; } case 2: cout<<\"**2**\";break; } A. **0** B. **0****2** C. **0****l****2** D. 有语法错误 5.设有以下程序段,则_____ int x=0;s=0; while (!x!=0) s+=++x; cout< }while(i<=l0); }whi1e(i<=10); C. i=l;s=1; D. i=1;s=0; do{ s=s*i; do{ s=s*i; i++; i++; }while(i<=10); }while(i<=10); 7.下面程序的功能是计算正整数2345的各位数字的平方和。请选择填空。 #include { int n,sum=0; n=2345; do { sum=sum+____1____; n=_____2______; } while(n); cout<<\" sum=\" < 8.等比数例的第1项a=1,公比q=2下面程序的功能是求满足前n项和小于100时的最大n,请选择填空。 #include\"iostream.h\" void main() { int a,q,n,sum; a=1;q=2;n=sum=0; do { ____1____; ++n; a=a*q; 18 《C++面向对象程序设计》 函授自学指导书 } whi1e(sum<100); ____2_____; cout< ① A. sum++ B. sum+=a C. sum*=a D. a+=sum ② A. n=n-2 B. n=n C. n++ D. n-=1 二、填空题 9. 下面程序的功能是计算100至1000之间有多少个数,其各位数字之和是5。 #include { int i,s,k,count=0, for(i=l00;i<=1000;i++) { s=0,k=i, while(__________) { s=s+__________; __________; } if(s!=5)_________; else count++; } cout< { int temp,num,den,a,b; cin>>a>>b, num=a; den=b, while(den) { temp=________; num=den; den=temp; } cout<<______ < const int magic= l7; int guess; cout<<\"guess the magic number: \"; cin>>guess; if(guess= =magic) { 19 《C++面向对象程序设计》 函授自学指导书 cout<<\"Right!\"< 三、编程题 12. 修改例3-11 根据所输入的年份,求出该年天数。 13. 试编程序输入三角形三边 a,b,c,判断是否能构成一个三角形若能,则求该三 角形面积。 14. 每个苹果0.8元 第一天买2个苹果 从第二天开始,每天买前一天的2倍直至 购买的苹果个数不超过 100的最大值、编写程序,求每天花多少钱? 15.找出1-99之间的全部同构数。同构数是这样一组数:它出现在其平方数的右边。如 5是 25右边的数,25是 625右边的数,故 5和 25都是同构数。 16.求一个整数任意次方的最后三位数。即求x y的最后三位数要求x,y从键盘输入。 17. 将数列1、2、5、10、21、42、85、170、341、682、...延长到第50项 18. 计算1!+2!+3!+...+n!前10项之和。 19. 输入一行由英文字母、数字、符号等组成的字符,将其中的大写和小写字母的个数分别统计出来。 20. 买现摄氏温度与华氏温度的转换,并按1.0间隔输出对照表,格式如下: 摄氏温度 华氏温度 0.0 32.0 1.0 33.8 ... ... 21.求整数100-200间能被3或13整除的所有整数。 22.读入10个学生的个人信息的学号和成绩,输出所有学生的学号、成绩,同时并根据分数与等级的对应关系,输出每一个学生相应的成绩等级。 成绩:100~90 89~80 79~70 69~60 59~0 等级: 优 良 中 及格 差 第四章 数组 【学习要点】 1.掌握一维和二维数组的定义和数组元素的引用方法,了解其存储结构。 2.掌握一维和二维数组初始化方法。 3.掌握有关一维和二维数组的基本算法。 4.掌握字符数组的定义、其元素的引用方法和字符数组的初始化方法。 5.掌握C++提供的对字符串进行处理的基本函数. 20 《C++面向对象程序设计》 函授自学指导书 【例题分析】 一、选择题 例 4-1 以下合法的数组定义是 。 A.int a[ ]={\"A\B.ini a[5]={0,l,2,3,4,5}; C.nt a={'A','B','C'}; D.int a[ ]={0, 1,2,3,4,5 }; 解:根据数组定义和初始化情况,数组类型与所赋数据的类型应一致,指定的数组长度应大于或等于花括弧中的数据个数,对数组长度可省略。 正确答案:D。 例4-2 设有定义语句inta[2][4]]:则以下叙述不正确的是_。 A. a数组可以看成是由 a[0]、a[1]两个元素组成的一维数组 B. a[0]代表一个地址常量 C. 元素a[0]是由4个整型元素组成的一维数组 D. 可用a[0]=5;的形式给数组元素赋值 解:C++对二维数组的处理是将其看作一个特殊的一维数组,即这个数组中每个元素又是一个一线数组。所以二维数组a可认为是由两个元素a[0]。a[1]组成的一维数组,而数组元素 a[0]和 a[1]又是由 4个int型元素组成的一维数组。C+十规定了数组名代表地址常量,其值是不可改变的,故赋值语句a[0]=5:是非法的。 正确答案:D。 例4-3 若有说明int a[3][4];,则对a数组元素的非法引用是_。 A. a[0][2*1] B. a[0][4] C. a[4-2][0] D. a[1][3] 解:引用二维数组元素的格式为:数组名[下标表达式1][下标表达式2],而下标表达式可以是常量、变量,但其值必须是确定的整数且在该数组的定义范围之内。 正确答案;B。 例4-4 若有以下定义和语句,则输出结果是_。 char a, s[l0], s=\"abcd\"; a=s; cout< 解:字符数组的赋值,不能通过赋值语句实现,而是通过初始化或Strcpy函数来实现。 正确答案:D。 例4-5 能判断字符串s1是否大于字符串s2的是_。 A. if(sl>s2) B. if(strcmp(s1,s2)) C. if (strcmp(sl, s2)>0) D. s1>s2 解:两个字符串比较必须使用字符串比较函数strcmP(字符串1,字符串2)。比较的结果:相等时返回以0;大于时返回正整数;小于时返回负整数。 正确答案:C。 二、填空题 例4-6 若有定义 int a[3][4]={ { 1,2},{0},{4,6,8,l0} ),,则初始化后a[1][2]得到的初值是_,对[2][1]得到的初值是_。 解:在定义的同时对数组元素进行初始化,可以对所有元素赋初值,也可只对部分元素赋初值;其余元素为0。根据数组中元素排列的顺序以行为单位进行存放,定义式右边的数据是以{}作为行元素进行组织的。故 a[l][2]得到的初值是0,a[2][1]得到的初值是6。 21 《C++面向对象程序设计》 函授自学指导书 例4-7 语句cout< 注意:若将 8改为 7,而\\07却是一个字符,加上 A、W,此字符串的长度是8。 例4-8 以下程序的输出结果是_。 #include \"iostream.h\" #include\" string.h\" void main() { char str[50]=\"xyz\strcpy(str+2, strcat(p1 +2,p2+1)); cout< 正确答案:xycdBCD。 三、编程题 例4-9 先定义一个含有30个整型元素的数组,依次赋予从2开始的偶数,然后将按顺序每五个数的平均值放在另一个数组中,并要求按每行3个数输出结果。 解:根据题意,可定义一维整型数组a[30]用于存放初始数据和数组b[6]用于存放平均值,临时变量sum用来存放5个元素之和。以i(初值为0,终值为29)作为循环变量,用for循环通过a[i]=2*i+2给数组a赋值;以i作为循环变量,表达式i%5==0将a的30个元素分成6组,分别求出和sum,以j为数组b的下标,用while循环来实现b[j]为a的5个元素之平均值。 程序如下: #inc1ude \"iostream.h\" void main() { int a[30],i,j=0; float sum=0,b[6]; for(i=0,i<30,i++) a[i]=2*i+2; //给a数组元素赋值 cout<<\"30 个整数为:\\n\"; for(i=0;i<30;i++) cout<while(i<30){ //求 a中每 5个元素的平均值,放入 b数组中 sum+=a[i];i++; if(i%5= =0) { //5个元素为一组,求平均值 b[j]=sum/5; sum=0; j++; //sum必须置为0,为下一组数求和作准备 22 《C++面向对象程序设计》 函授自学指导书 } } cout<<\"每五个数的平均值:\"; for(i=0;i<6;i++){ if(i%3==0) cout<<'\\n';//每行输出 3个数 cout<例 4-10 通过循环按行顺序为一个 5×5 的二维数组赋 1~25 的自然数,然后计算并输出该数组的左下三角元素之和。试编程。 解:可以利用双重循环实现二维数组的赋值,即用外循环控制行下标i,内循环控制列下标j,在循环体中数组元素a[i][j]=n,(n的初值为1,每赋值一次加 1);同样利用双重循环实现左下三角元素之和的计算,外循环的行下标i从0~4,内循环的列下标j的终值为可变数,其规律是与行下标值正好相等,即 j的值从 0变化到 i,在循环体内对元素a[i][j]进行累加,并存放在sum中。程序如下: #include \"iostream.h\" void main () { int a[5] [5],i,j,n=1,sum=0; for (i=0;i<5;i++) for(j=0;j<5;j++) a[i][j]=n++; cout<<\"数组的左下半三角:\\n\"; for(i=0;i<5;i++) { for(j=0;j<=I;j++){ sum+=a[i][j]; cout<cout<<'\\n'; } cout<<\"数组左下三角的元素之和: \"< 解:拆半查找法的算法原理:先检索当中的一个数据,看它是否为所需的数据,若不是,则判断要找的数据去在当中数的哪一边,下次就在这个范围内查找,重复此过程直全找到为止。设三个变量top、mid、bot分别指向长度为N且已排序数据a的头、中间和尾的位置,需查找数据为c, 则具体算法为: (1 )令 top = 0, bot=N-l, mid= (top+bot) /2。 (2)若a[mid] = c. 则找到了该数据,查找结束。 (3)若 a[midl>c, 则c在mid的左侧,令新的bot=mid-1,转(5)。 (4) 若 a[midl #include \"iostream.h\" #include\" string.h\" void main() 23 《C++面向对象程序设计》 函授自学指导书 { char a[ ]=\" adfgikmnprs\int top,bot,mid; cout<<\"已排序的字符串 : \"<>c; for(top=0;bot=strlen(a) -1;top<=bot;) { //用srtlen(a)计算a中的实际字符个数 mid=(top+bot)/2; if(c= =a[mid] ) { cout< else bot=mid-1; } if(top>bot) cout<<\" * *\\n\"; } 【思考题】 一、选择题 1.若有以下说明,则数值为4的表达式是_。 int a[ 12]= { 1,2,3,4,5,6,7,8,9, l0, 11, l2 }; char c= 'a',d, g; A. a[g-c] B. a[4] C. a['d'-'c'] D. a['d'-c] 2.以下程序的输出结果是_。 #include\" iostream.h\" void main() { int n[2]= { 0},i,j,k=2; for (i=0;i C. double a[1][4] D. float a(3)(4) 4.若有说明inta[3][4];则对 a数组元素的正确引用是_。 A. a[2][4] B. a[1,3] C. a[1+1][0] D. a(2)(1) 5.以下能对二维数组b正确进行初始化的语句是_。 A. int b[2][3] = { { 1,1 },{2,2},{3,3 } }; B. int b[3][ ] = { { 1 },{2},{3}}; C. int b[ ][ ]= { 1,2,3,4,5,6}; D. int b[ ] [3] = { { 1,1,1,},{2,2},{3} }; 6.若有定义语句 int m[ ][2]={1,3,5,7,9}; 则以下叙述正确的是_。 A. 该语句存在语法错误 B. 该语句等价于int m[3][2l = { 1,3,5,7,9}; C. k语句等价于int m[ ][2] = { { 1,3,5},{7,9} }; D. 该语句等价于int m[2][2] = { 1,3,5,7,9}; 24 《C++面向对象程序设计》 函授自学指导书 7. 以下程序的输出结果是______ #include \"iostream.h\" void main() { int i,x[3] [3]={ 1,2,3,4,5,6,7,8,9 }; for (i=0;i<3;i++) cout< int a[3] [3]={ { 1,2},{ 3,4}. { 5,6} },i,j,s=0; for (i= 1,i<3,i++) for(j=0;j<=l;j++)s+=a[i][j]; cout< A.char s[5l={ \"abc\" }; B.char s[5]={ 'a','b','c' }; C.char s[5]=\" \"; D.char s[5]=\"abcdef\"; l0.下面程序段的运行结果是_________A. 运行程序段后输出0 子 B. 运行程序段后输出1 C. 程序段中的控制表达式是非法 D.程序段执行无限次 6. 以下程序段中,能正确计算10!的是_________ A. do {i=1;s=1; B. do {i=1;s=0; s=s*i; s=s*i; i++; i++;A. abcd B. a C. abcd┗┛┗┛┗┛┗┛┗┛ D. 编译出错A. l8 B. 19 C.20 D. 2l 9.下面对S初始化不正确的是____