C++实用教程 - 郑阿奇 课后习题答案18093203叶子上传
更新时间:2023-11-03 00:45:01 阅读量: 综合文库 文档下载
第一章C++概述
1. C++语言的标准有哪些?它有哪些编程方法?结构化程序设计的结构有哪些?
答案:标准:C++国际标准ISO/IEC 14882:1998,常被称为C++98、标准C++或ANSI/ISO
C++;C++标准第二版(ISO/IEC 14882:2003)。
3种编程方法:以C语言为子集的结构化程序设计模式、以类为核心的面向对象程序
设计模式以及以模版为机制的通用编程模式。
结构化程序设计的结构:顺序结构、选择结构和循环结构。
2. 面向对象的程序设计有3个主要特征,他们分别是什么?试举例说明。 答案:3个主要特征:封装、继承和多态。
封装:封装是将数据和代码捆绑到一起,避免了外界的干扰和不确定性。例如C++
中的类,它定义了该集合中每个对象所共有的属性和方法。
继承:继承是让某个类型的对象获得另一个类型的对象的特征。例如:C++中子类对
父类的继承,子类具有父类的特性,同时还可以拥有自己的新特性。
多态:多态是指不同类型的对象接收相同的消息时产生不同的行为。多态机制使具有
不同内部结构的对象可以共享相同的外部接口,通过这种方式减小代码的复杂度。例如函数的重载。
3. C++是以编译方式实现的高级语言,它的编译过程可分为3个子过程,它们分别是什么? 答案:创建、编译和连接。
4. 参照本章示例,编写1个C++程序:输入圆的半径,输出其周长。 答案:
#include
double r, area;
cout<<\输入圆的半径: \ cin>>r;
area=2*3.14159*r;
cout<<\圆的周长为:\ return 0; }
第二章数据类型和基本输入/输出
1. 下列常量表示在C++中是否合法?若不合法,指出原因;若合法,指出常量的数据类型。 答案:32767:合法,int
35u:合法,无符号整形
1.25e3.4:不合法,e后面的数字必须是整数 3L:合法,长整形
0.0086e-32:合法,实数
?\\87?:不合法,八进制数中不应该出现8
1
“Computer System”:合法,字符串 “a”:合法,字符串 ?a?:合法,字符
?\\96\\45?:不合法,?96? ?\\45?分别为字符类型 .5:合法,double
2. 字符常量与字符串常量有什么区别?指出下列哪些表示字符?哪些表示字符串?哪些
既不表示字符也不表示字符串?
?0x66? China “中国” “8.42” ?\\0x33? 56.34 “\\n\\t0x34” ?\\r? ?\\\\? ?8.34? “\\0x33” ?\\0?
答案:字符: ?\\\\?, ?\\0?, ?\\r?
字符串:“中国”, “8.42”, “\\n\\t0x34”, “\\0x33”
非字符亦非字符串:?0x66?, China,?\\0x33?,56.34, ?8.34?
3. 定义两个变量a和b,初值分别为8和10,若要a和b的值互换,即a为10,b为8,
如何实现(可用另外一个变量t作为过渡)?如不用中间变量又如何实现? 答案:用变量temp作为过渡 #include
int a=8,b=10; int temp; temp=a; a=b; b=temp;
cout<<\ return 0; }
不用中间变量方法一: #include
int a=8,b=10; a=a^b; b=b^a; a=a^b;
cout<<\ return 0; }
不用中间变量方法二: #include
2
int main() {
int a=8,b=10;
cout<<\ a=a+b; b=a-b; a=a-b;
cout<<\ return 0; }
4. 用enum定义4个枚举常量Flase、FALSE、TRUE、True,使其值分别等于bool类型中
的false、false、true、true。想一想这样做的好处是什么?若使用const来定义,则如何进行?并比较这两种定义的优缺点。
答案:enum {False=false,FALSE=false,TRUE=true,True=true};
好处:因为VC++中对大小写是敏感的,为了防止用户输入中大小写出错的情况,所
以分别又定义了表示true和false的两种形式。
const bool False=false; const bool FALSE=false; const bool TRUE=true; const bool True=true;
优缺点:用enum一次可以定义多个整型标识符变量,而const定义的标识符常量由其数据
类型决定;
另外,用const定义看不出其关联性。
5. 用const常量代替圆周率3.1415926,分别输入半径40和928.335,求圆面积。要求先输
出圆周率和半径,再输出其面积。 答案:
#include
const double PI=3.1415926; int main() {
double radius1=40,radius2=928.335; double area1,area2;
area1=PI*radius1*radius1; area2=PI*radius2*radius2;
cout<<\圆周率: \半径: \面积: \ cout<<\圆周率: \半径: \面积: \ return 0; }
6. 设学生人数是一个常数50,编程输出下列结果(双引号也要输出): “How many students in your class?” “50” 答案:
3
#include
cout<<'\\\ cout< cout<<'\\\ return 0; } 7. 设有语句: char c1, c2, c3; cin>>c1>>c2>>c3; 若在执行过程中,输入: ?a? ?b? ?c? 则cin执行后,c1、c2、c3的值分别是什么?若输入: abcdef 则cin执行后,c1、c2、c3的值又分别是什么? 答案:输入?a? ?b? ?c?后,c1的值为 ? , c2的值为a , c3的值为 ? 输入abcdef后,c1的值为 a , c2的值为b , c3的值为 c 8. 设有语句: int a, b, c; cin>>hex>>a>>oct>>b>>dec>>c; cout< 第三章 运算符和表达式 1. 将下列代数式写成C++的表达式: (1)(sin(x))2.5=sqrt(pow(sin(x),2.5)) a?bh(2)2m=((a+b)*h)/(2*m) e(3)2?=exp(x*x)/sqrt(2*3.1415926) 2. 求出下列算数表达式的值: (1) 5+7/3*4=13 (2) 23.5+9/5+0.5=25.0 4 x2 (3) 8+2*9/2=17 (4) ?a? +23=97+23=120 (5) 设x=2.5,y=4.7,a=7 x+a%3*(int)(x+y)%2/4 =2.5+1*int(7.2)%2/4=2.5+7%2/4=2.5+1/4=2.5 (6) 设x=3.5,y=2.5,a=2,b=3 (float)(a+b)/2-(int)x%(int)y=2.5-1=1.5 (7) 设x=8 ?a?+x%3+5/2-?\\24?=97+2+2-20=81 3. 在下列表达式中,哪些是合法的赋值表达式?哪些不是?为什么? (a,b,c,x,y都是已定义的int 型变量) (1) a=b=4.5+7.8 是 (2) c=3.5+4.5=x=y=7.9 不是,因为4.5是常量不能作为左值 (3) x=(y=4.5)*45 是 (4) a=x++=++y 不是,x++不能作为左值 4. 写出下面表达式运算后a的值,设原来的a都是10. (1) a+=a <=> a=a+a=20 (2) a%=(7%2) <=> a=a%(7%2)=10%1=0 (3) a*=3+4 <=>a=a*(3+4)=70 (4) a/=a+a <=>a=a/(a+a)=10/20=0 (5) a-=a <=>a=a-a=0 (6) a+=a-=a*=a <=>a+=a-=100 =>a+=0 =>a=0 5. 设m,n的值分别为10,8,指出下列表达式运算后a,b,c,和d的值。 (1) a=m++ + n++=10+8=18 (2)b=m++ + ++n=10+9=19 (3)c=++m + ++n=11+9=20 (4)d=m-- + n++=10+8=18 6. 设a,b,c的值分别为5,8,9;指出下列表达式运算后x ,y和z 的值 (1) y=(a+b,c+a)=(13,14)=14 (2) x=y=a,z=a+b x=5 y=5 z=13 (3) y=(x=a*b , x+x , x*x)=(x=40,80,1600)=1600 x=40 (4) x=(y=a ,z=a+b)=(y=5,z=13)=13 y=5 z=13 7. 设有变量: float x, y; int a ,b; 指出运算下列表达式后x , y, a和b的值。 (1)x=a=3.523 x=3 y为null a=3 b为null (2)a= x =3.523 x=3.523 y为null a=3 b为null (3)x=a=y=3.523 x=3.0 y=3.532 a=3 b为null (4) b=x=(a=25,15/2) x=7.5 y为null a=25 b=7 8. 若有char x=15;使得x的第0位(即二进制位的最右边的那一位,或称最低位)为0,其 5 余位保持不变的赋值表达式是什么? x=x & ~1 (其中1是由2即pow(2,0)算出来的) 9. 用sizeof 运算符编写一段测试程序,测试本机中各基本数据类型或字符串所占的字节数,并将其填写到下表中,然后分析其结果。 基本数据类型 char short int long 所占字节数 1 2 4 4 基本数据类型或字符串 float double long double “\\nCh\\t\\v\\0ina” 所占字节数 4 8 8 10 0#include cout <<\类型所占字节数为\cout <<\类型所占字节数为\cout <<\类型所占字节数为\cout <<\类型所占字节数为\cout <<\类型所占字节数为\cout <<\类型所占字节数为\ cout <<\类型所占字节数为\cout<<\字符\\nCh\\t\\v\\0ina所占字节数为\return 0; } 10. 从键盘输入一个三位数,从左到右用a,b,c表示各位的数字,记为abc.现要求依次输出从右到左的各位数字,即输出另外三位数cba。试设计程序。 #include int n ,a , b , c , m; //n为输入的三位数,m为需要输出的三位数 cout<<\请输入一个三位数:\cin>>n; if(n<=999 && n>=000) { c=n; b=(n/10); a=((n/10)/10); m=c*100+b*10+a; cout<<\数字\的逆序为\} else cout<<\输入不正确\ return 0; 6 } 第四章 基本语句和基本程序结构 01. 设有变量int a=3,b=4,c=5;求下列表达式的值: (1) a+b>c&&b==c ? 7>5&&4==5?True && False ?F (2) a||b+c&&b>c ? 3||9&&4>5?3||9&&F ?3||F ?T||F ? T (3) !a||!c||b?F||F||4?T (4) a*b&&c+a?15&&8?T 02. 设a,b,c的值分别是15,18,19,指出下列表达式运算后x,y,a,b,c的值 (1) x=a 表达式运算:x= T||c++=T 此时x=T,a=15,b=18,c=19 (2) y=a>b&&c++ 表达式运算:y=F&&c++=F 此时 y=F ,a=15,b=18,c=19 (3) x=a+b>c&&c++ 表达式运算:x=33>19&&c++=T 此时 x=T.a=15,b=18,c=20 (4) y=a||b++||c++ 表达式运算:y=T||b++||c++=T 此时 y=T,a=15,b=18,c=19 03. 输入三个整数a,b,c要求按照从小到大的顺序输出 方法一: #include int a,b,c,temp; cout<<\请输入三个整数:\ cin >>a>>b>>c; if(a>b) /*如果a>b,交换a与b的值*/ { temp=a; a=b; b=temp; } if(a>c) /*如果a>c,交换a与c的值*/ { temp=a; a=c; c=temp; } if(b>c) /*如果b>c,交换b与c的值*/ { temp=b; b=c; c=temp; } cout<<\这三个数从小到大的排列为\ cout<<\ 7 cout<<\ cout<<\ return 0; } 方法二: #include int a,b,c,temp; cout<<\请输入三个整数:\ cin >>a>>b>>c; if(a>b) /*如果a>b,交换a与b的值*/ { temp=a; a=b; b=temp; } if(b>c) /*如果a>c,交换a与c的值*/ { temp=b; b=c; c=temp; } if(a>b) /*如果b>c,交换b与c的值*/ { temp=a; a=b; b=temp; } cout<<\这三个数从小到大的排列为\ cout<<\ <<\ <<\ return 0; } 4. 有一个数学函数 ?x?1(x??10)?y??2x?2(1?x?10) ?3x2?3x?1(x??1)?写一个程序,输入x,输出y. #include 8 } if(x>=10) y=x-1; else if(x>1) y=2*x+2; else y=3*x*x+3*x-1; cout<<\的值为\ return 0; 5. 给出一个百分制的成绩,要求输出成绩为A,B,C,D.其中,85分以上为A,75~84分为B,65~74分为C,65分以下为D。 #include using namespace std; int main() { float fScore; cout<<\请输入一个百分制的成绩:\ cin >>fScore; if( fScore>100||fScore<0) cout<<\输入的分数无效\ else if(fScore>=85) cout<<\ else if(fScore>=75) cout<<\ else if(fScore>=65) cout<<\ else cout<<\ return 0; } 6. 选(D) 7. 求下列循环次数 (1) for(int i=0,x=0;!x&&i<=5;i++) 循环了6次 (2) while(int i=0)i--; 循环了0次 (3) int i=5; do{ cout< } While(i!=0); 循环了无数次 8. 编程求100以内被7或5 整除的最大自然数 #include 9 { int max; for(int i=1;i<=100;i++) { if(i%5==0||i%7==0) max=i; } cout<<\这个最大的自然数是\return 0; } 9. 分析下列程序的输出结果 (1) x=5,y=4,z=1 (2) k=4 (3) <><><># 10. Fibonacci数列中的前两个数是1和1,从第三个数开始,每个数等于前两个数之和。编程计算并输出次数列中的前30个数 。 #include int sum=0 ,a=1,b=1; for(int i=1;i<=6;i++) { for(int j=1;j<=5;j++) { if(i==1&&j<=2) cout< cout< } return 0; } 11. 编程求n!,即n!?1?2?3?...?n #include 10 int main() { int n,m=1; cout<<\请输入n:\ cin>>n; for(int i=0;i cout <<\的阶乘为\ return 0; } 12. 从键盘上输入一个整数n的值,按下式求出y 的值,并输出n和y 的值(y用浮点数表示) y=1!+2!+3!+……+n! 方法一: #include int n,y=0,m=1; cout<<\请输入n:\cin>>n; for(int j=0;j cout <<\的值为\return 0; } 方法二: #include int n,m=1; 11 double y=0.0; cout<<\请输入n:\ cin>>n; for(int i=1;i<=n;i++) { m*=i; y+=m; } cout <<\的值为\ return 0; } 13. 用泰勒级数求e的近似值,直到最后一项小于 10?6为止。 e?1?111??...? 1!2!n!方法一: #include double e=0.0,m=1; int n=1; do{ m=m*(m+1); n++; }while(m<10*10*10*10*10*10); for(int j=0;j cout <<\的值为\ return 0; } 方法二: #include using namespace std; int main() 12 { double e=0.0, m; int i=1,n=1; do { m=1.0/n; i++; n*=i; e+=m; }while(m>=1.0e-6); cout <<\的值为\ return 0; } 14. 设计一个程序,输出所有的水仙花数。所谓水仙花就是一个三位的整数,其各位数字的立方和等于该数本身。 #include int n=100,a ,b,c; //a 为三位数的个位,b为三位数的十位,c为三位数的百位 while(n<=999) { a=n; b=(n/10); c=n/100; if(a*a*a+b*b*b+c*c*c==n) cout< return 0; } 15. 设计一个程序,输入一个4位整数,将各位数字分开,并按其反序输出。要求必须用循环语句。 #include int n,a ; cout<<\请输入一个四位数:\ cin>>n; if(1000<=n && n<=9999) { cout<<\这个四位数的反序为:\ 13 for(int i=1;i<=4;i++) { a=n; n=n/10; cout< else cout<<\输入不正确\cout< } 16. 求?/2的近似值的公式为 ?2242n2n????...???... 21332n?12n?1其中,n=1,2,3,…,设计一个程序,求出n=1000时?的近似值。 #include int n=1000; double pi,p=1.0; for(n=1000;n>=1;n--) { p=p*(2.0*n/(2.0*n-1))*(2.0*n/(2.0*n+1)); } pi=p*2; cout< return 0; } 17. 用迭代法求x=a。其中公式如下: 1axn?1?(xn?) 2xn要求前后两次求出的x的差的绝对值小于10?5。 #include #include double a; const double EPSTLON = 1E-5; 14 cout<<\请输入一个数字:\ cin>>a; double xnew=a; double xold; do{ xold = xnew; xnew = (xold + a/xold)/2; }while(fabs(xnew - xold) >= EPSTLON); cout<<\它的平方根是:\ return 0; } 18. 打印下列菱形图案。 #include int i,j,num=7; for(i=0;i for(i=0;i for(i=(num/2-1);i>=0;i--) //以中间为线,生成下半部 { for(j=0;j<((num-i*2)/2);j++) { cout<<\ } for(j=0;j return 0; } 15 第五章_函数 1. 设计一个函数,要求输入三个整数,求其最大数。编写完整的程序并测试。 #include int max=getMax(); cout<<\ return 0; } int getMax() { int c1,c2,c3; int max; cout<<\输入三个整数:\ cin>>c1>>c2>>c3; max=c1; if(max 2. 设计一个程序,输入一个十进制数,输出相应的十六进制数。设计一个函数实现数制转 换。 #include int dec; cout<<\请输入一个整数: \ cin>>dec; cout<<\对应的16进制数为:\ getHex(dec); cout< void getHex(int dec) { 16 if(dec<=15) convert(dec); else { getHex(dec/16); getHex(dec); } } void convert(int dec) { switch(dec) { case 10: cout<<'A'; break; case 11: cout<<'B'; break; case 12: cout<<'C'; break; case 13: cout<<'D'; break; case 14: cout<<'E'; break; case 15: cout<<'F'; break; default: cout< 3. 编写一个函数,将华氏温度(f)转化成摄氏温度(c),转换公式为c=(5/9)(f-32) #include double f,c; cout<<\请输入华氏温度(f): \ cin>>f; cout<<\对应的摄氏温度(c)为:\ c=getC(f); cout< 17 double getC(double f) { double c; c=(5.0/9)*(f-32); return c; } 4. 设计一个程序通过重载求两个数中最大数的函数max(),分别实现求两个实数和两个整数 及两个字符的最大者。 方法一: #include void getMax(double d1,double d2); void getMax(int i1,int i2); void getMax(char c1,char c2); int main() { getMax(1.2,2.3); getMax(3,3); getMax('a','b'); return 0; } void getMax(double d1,double d2) { cout< void getMax(int i1,int i2) { cout< void getMax(char c1,char c2) { cout< 18 } cout< 方法二: #include double getMax(double d1,double d2); int getMax(int i1,int i2); char getMax(char c1,char c2); int main() { cout< double getMax(double d1,double d2) { double max=d1>d2?d1:d2; return max; } int getMax(int i1,int i2) { int max=i1>i2?i1:i2; return max; } char getMax(char c1,char c2) { char max=c1>c2?c1:c2; return max; } 5. 设计一个程序,通过重载求两个整数、三个整数和四个整数的最小值。 #include void getMin(int i1,int i2,int i3); void getMin(int i1,int i2,int i3,int i4); int main() { 19 getMin(3,5); getMin(4,5,5); getMin(34,45,89,78); return 0; } void getMin(int i1,int i2) { cout< void getMin(int i1,int i2,int i3) { cout< if(i1>i2) min=i2; if(min>i3) min=i3; cout< void getMin(int i1,int i2,int i3,int i4) { cout< if(min1>min2) min=min2; else min=min1; cout< 6. 设计一个程序,通过重载实现两个整数、两个实数和两个复数的加、减运算。 #include void operation(double d1,double d2); void operation(int i1,int i2); void operation(double real1,double ima1,double real2,double ima2); int main() { 20 all[pos]=all[i];all[i]=min; } } void main(){ STUDENT all[2]; STUDENT *pt; for(int i=0;i<2;i++) all[i]=Input(all[i]); for(i=0;i<2;i++) { pt=&all[i]; Cal(pt); } sort(all,2); cout<<\排序后的结果为:\ for(i=0;i<2;i++) Output(all[i]); } 6.输出结果为9 7.设计一个函数,通过连和类型求一个负整数或正整数的二进制补码,结果用字符串通过函数返回。编写完整的程序并测试。 8.有52张扑克牌,使他们全部正面朝上,从第2张牌开始,把凡是2的倍数的位置上那个的牌翻成正面朝下,接着,从第3张牌开始,把凡是3的倍数的位置上那个的牌翻成正面朝下,接着从第4张牌开始,把凡是4的倍数位置上的牌按此规律翻转。依次类推,直到第一张要翻的牌的位置超过26为止,统计此时有几张牌朝上,并打印出他们的位置。 #include int pos,state;//定义2个变量分别表示牌的位置号和牌的状态,1是正面朝上,0是正面朝下 }; void print(PUKE puke[]) { 46 int count=0; cout<<\正面朝上的牌有\ for(int i=0;i<52;i++) { if(puke[i].state==0) { count++; cout<<\第\张\ } } cout<<\一共有\张\} int main() { int count=0;//看是不是第一张要翻的牌 int j=2;//j是2,3,4等; PUKE puke[52]; for(int i=0;i<52;i++)//输入每张牌的状态 { puke[i].pos=i+1; puke[i].state=1; } while(true){ for(int i=0;i<52;i++) { if(puke[i].pos%j==0)//位置是2,3,4等的倍数就反面 { if(puke[i].pos>26&&count==0) //第一张要翻的牌大于26,打印 { print(puke ); //cout<<\到了\ return 0; } puke[i].state=0; count++; } } i=0; 47 j++; count=0; } } 9.设计一个单向链表,节点的数据域是一个字符数组,用来存放字符串。定义两个函数Add和List,分别用来在链表末尾添加一个节点和输出链表的所有节点。编写完整的程序并测试:在Main函数中实现链表的创建,调用5次Add函数添加5个节点,然后输出链表,最后释放链表的所有节点的内存空间。 #include struct NODE { char data[50]; NODE *next; }; NODE * Add(NODE *head); void List(NODE *head); void main() { NODE *H=NULL;//开始时链表为空 H=Add(H); NODE * head=H; H=Add(H); H=Add(H); H=Add(H); H=Add(H); List(head); } NODE * Add(NODE *head){ NODE *pNew=new NODE ,*pCur; cout<<\请输入节点信息\ cin>>pNew->data; if(head==NULL) { //将节点加入到链表中 48 head=pNew; head->next=NULL; } else { // pCur=pNew; head->next =pNew; pNew->next =NULL; head=pNew; } return head; } void List(NODE *head){ NODE *pCur=head; cout<<\输入的信息为:\ while(pCur!=NULL) { cout< cout< 10.设计函数,实现单链表的逆置。#include struct NODE { int data; NODE *next; }; NODE * Add(NODE *head); void List(NODE *head); NODE * DaozhiList(NODE *L) ; 49 void main() { NODE *H=NULL;//开始时链表为空 H=Add(H); NODE * head=H; H=Add(H); H=Add(H); H=Add(H); H=Add(H); List(head); List(DaozhiList(head)); } NODE * DaozhiList(NODE *L) { NODE *newfirst=L,*now,*oldfirst;//辅助结点 oldfirst=L->next; //原链表剩余部分第一结点(非表头) while(oldfirst!=NULL) //原链表剩余部分第一结点不为空 { now=oldfirst; //原链表剩余部分第一结点为当前结点 oldfirst=oldfirst->next; //原链表剩余部分第一结点下移 now->next=newfirst; //当前指针指向新链表的第一个结点 newfirst=now;//当前指针成为新链表的第一个结点 } L->next =NULL; return newfirst; } NODE * Add(NODE *head){ NODE *pNew=new NODE ,*pCur; cout<<\请输入节点信息\ cin>>pNew->data; if(head==NULL) { //将节点加入到链表中 head=pNew; head->next=NULL; } 50 1 已知int d=5,*pd=&d,b=3;求下列表达式的值: (1)*pd*b=15 (2)++*pd-b=3 (3)*pd++=5 (4)++(*pd)=6 2 选择 (1)A (2)B (3)A (4)B 3 用指针作为函数的参数,设计一个实现两个参数交换的函数。然后实现输入三个实数,按升序排序后输出。 方法一: #include void swap(double *a,double *b); int main() { double x, y, z; cout<<\请输入3个实数:\\n\ cin>>x>>y>>z; cout<<\个实数为:\ if(x>y)swap(&x,&y); if(y>z)swap(&y,&z); if(x>y)swap(&x,&y); cout<<\排序后3个实数为:\ return 0; } void swap(double *a,double *b) { double temp; temp=*a; *a=*b; *b=temp; } 方法二: #include void swap(void *a,void *b,int size); void sort(double *a,int size); int main() 31 { //double a=6.5,b=8.5; char a[20]=\ char b[20]=\ cout<<\交换前:a=\ swap(&a,&b,sizeof(a)); cout<<\交换后:a=\ double d[3]; cout<<\请输入3个实数:\ for(int i=0;i<3;i++) cin>>d[i]; sort(d,sizeof(d)/sizeof(double)); return 0; } void swap(void *a,void *b,int size) { char temp; for(int i=0;i void sort(double *a,int size) { int temp; for(int i=1;i for(i=0;i 32 } 4 编写函数int fun(int *a,int *n,int pos,int x); 其功能是将x值插入到指针a所指向的一维数组中,其中指针n指定数组元素个数,pos指定插入位置的下标。编写完整的程序并测试。 #include void fun(int *a,int *n,int pos,int x); int main() { int data[10]={1,2,3,4,5,6,7,8,9,10}; int x,pos,size=sizeof(data)/sizeof(int); cout<<\数组元素:\ for(int i=0;i cout< fun(data,&size,pos,x); cout<<\插入后,data数组元素:\ for(i=0;i void fun(int *a,int *n,int pos,int x) { for(int i=*n-1;i>pos;i--) { a[i]=a[i-1]; } a[pos]=x; } 5 编写函数int find(int *data,int n,int x);其功能是在data所指向的一维数组中查找值为x的元素,若找到,则函数返回该元素的下标;如找不到,则函数返回-1.其中n指定数组元素个数。编写完整的程序并测试。 33 #include int find(int *data,int n,int x); int main() { int data[]={1,2,3,4,5,6,7,8,9,10}; int size=sizeof(data)/sizeof(int); int result=find(data,size,12); cout< int find(int *data,int n,int x) { for(int i=0;i return -1; } 6 不用库函数编写函数int strlen(char *str),获取str中的字符个数。编写完整的程序并测试。 #include char str[]=\ cout<<\字符串\\\有\个字符\ return 0; } int strlen(char *str) //长度不包括结束字符?\\0? { int length=0; while(*str++!='\\0') length++; 34 return length; } 7 不用库函数编写函数int strcmp(char *str1,char *str2),实现两个字符窜的比较,当str1>str2时返回1,当str1 #include int strcmp(char *str1,char *str2); int main() { char str1[]=\ cout< int strcmp(char *str1,char *str2) { for(int i=0;*str1!='\\0'&&*str2!='\\0';i++) { if(*str1>*str2) return 1; else if(*str1<*str2) return -1; str1++; str2++; } if(*str1!='\\0') return 1; else if(*str2!='\\0') return -1; else return 0; } 8 编写函数void fun(char *s),其功能是将s所指的字符串逆序存放。编写完整的程序并测试。 #include char str[]=\ cout<<\原字符串为: \\\ fun(str); 35 return 0; } void fun(char *s) { int j=strlen(s); char news[30]; for(int i=j-1;i>=0;i--) news[i]=*s++; news[j]='\\0'; cout<<\逆序存放后,字符串变为: \\\} 9 设计一个函数,实现4*4阶矩阵的转置。编写完整的程序并测试。 #include void MatInv(int data[4][4],int n); int main() { int a[4][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}}; MatInv(a,4); for(int i=0;i<4;i++) { for(int j=0;j<4;j++) cout< void MatInv(int (*data)[4],int n) { int t; for(int i=0;i 10 设计一个通用函数,从一个字符指针数组中寻找一个指定的字符串,若找到返回1,找不到返回0.编写完整的程序并测试。 #include 36 using namespace std; int find(char *str[],int n,char *subStr); int main() { char *str[]={\ int n=4; char *sub=\ cout< int find(char *str[],int n,char *subStr) { for(int i=0;i 11 设计一个函数,实现n个字符串从小到大排序。编写完整的程序并测试。 #include void sort(char *str[],int n); int main() { char *str[]={\ int n=6; sort(str,n); return 0; } void sort(char *str[],int n) { char *min; int k; for(int i=0;i 37 } str[k]=str[i]; str[i]=min; } for(i=0;i 12 用带参数的main函数判断某一年是否是闰年。编写完整的程序并测试。 #include int main(int argc,char *argv[]) { if(argc<=1) cout<<\没有输入年份!\ else { int year=atoi(argv[1]);//将字符串argv[1]转换为整形 if(!(year@0)||(!(year%4)&&(year0))) cout< return 0; } 13 编写程序测试堆内存的容量。每次申请一个数组,内含100个整数,直到分配失败,并输出堆容量报告。 #include int i=0; double capacity; while(true) { int *p; p=new int[100]; if(!p) { cout<<\内存分配失败!\ break; } i++; 38 } capacity=100*sizeof(int)*i/1024.0/1024.0; cout<<\堆容量为: \ return 0; } 14 设计一个函数,形参是引用类型,要求输入三个整数,按从小到大排序后输出,编写完整的程序并测试。 方法一: #include void sort(int &a,int &b,int &c); int main() { int a,b,c; cout<<\输入3个整数(a,b,c):\ cin>>a>>b>>c; sort(a,b,c); cout<<\ return 0; } void sort(int &a,int &b,int &c) { int temp; if(a>b) {temp=a; a=b; b=temp;} if(b>c) {temp=b; b=c; c=temp;} if(a>b) {temp=a; a=b; b=temp;} } 方法二: #include void output(int &a,int &b,int &c); int main() { int a,b,c; cout<<\输入3个整数(a,b,c):\ cin>>a>>b>>c; output(a,b,c); cout<<\ return 0; 39 } void output(int &a,int &b,int &c) { int min,max,middle; min=a min=min max=max>c?max:c;//求最大数 if(min==a)//求中间数 middle=b cout< 15 由17个人围成一个圈,编号为1—17,从第1号开始报数,报到3的倍数的人离开,一直数下去,直到最后只剩下1人,求此人的编号。 #include const int nMax=17; //总人数 const int nOut=3; //数到3的倍数的人离开 int *p,*pPerson=new int[nMax]; int i,num=nMax; //用num记录剩下的人数 int nRemain; int nLast; //最后一个 for(i=0;i p=&pPerson[0]; //p指向第一个人 nRemain=0; while(num>1) { if(*p) nRemain++; if(nRemain==nOut) { 40 } } *p=0; nRemain=0; num--; } p++; if(p>&pPerson[nMax-1]) //当指针指向最后一个孩子时的处理 p=&pPerson[0]; for(i=0;i cout<<\最后留下来的是: \号\delete []pPerson; return 0; 第七章学生作业情况:(1,2,5,7,14) 第1题基本上都正确 第2题中(1)很多同学选D (4)个别同学选D 第7题比较的是两个字符串的大小,很多同学比较的是两个字符串长度的大 小; 第14题中有同学用选择排序,但是只是比较了一轮(只有一个for循环)。 编程中出现的问题:定义数组的时候用int a[i];//a为变量 if(n1=n2)//中间用一个等号 int max(a);//给变量起名字的时候中间有() 变量没有初始化就直接使用 void output(int *a,int *b,int *c)//形参要求是引用类型 第八章_结构 1. 定义一个日期结构类型DATE,描述年,月,日信息。设计一个函数DaysOfYear(DATE day),求day在本年中是第几天(考虑闰年情况)?结果通过函数返回。编写完整的程序并测试。 #include 41 { int year; int month; int date; }; int DaysOfYear(DATE day) { int sum; switch(day.month){ case 1: sum= day.date;break; case 2: sum= 31+day.date;break; case 3: sum= 31+28+day.date;break; case 4: sum=31+28+31+day.date;break; case 5: sum=31+28+31+30+day.date;break; case 6: sum=31+28+31+30+31+day.date;break; case 7: sum=31+28+31+30+31+30+day.date;break; case 8: sum=31+28+31+30+31+30+31+day.date;break; case 9: sum=31+28+31+30+31+30+31+31+day.date;break; case 10: sum=31+28+31+30+31+30+31+31+30+day.date;break; case 11: sum=31+28+31+30+31+30+31+31+30+31+day.date;break; case 12: sum=31+28+31+30+31+30+31+31+30+31+30+day.date;break; } if(day.year%4 ==0&&day.year!=0) return sum+1; else return sum; } int main(){ DATE day={1985,5,18}; cout<<\它是这年的第\天\return 0; } 2.定义一个描述三位点位置(X,Y,Z)的结构类型POINT3D。设计一个函数Distance(POINT3D pt1,POINT#D pt2),求pt1,pt2两点之间的距离,结果通过函数返回。编写完整的程序并测试。 #include float x; float y; 42 float z; }; Double Distance(POINT3D pt1,POINT3D pt2) { return sqrt(pow((pt1.x - pt2.x),2)+pow((pt1.y - pt2.y),2)+pow((pt1.z - pt2.z),2)); } int main(){ POINT3D pt1={1,1,1},pt2={2,2,2}; cout<<\两点间的长度是\return 0; } 3.定义一个描述复数的结构类型RECT,矩形大小用左上角坐标(x1,y1)和右下角坐标(x2,y2)来确定。设计一个函数Area(RECT rc),求矩形的面积,结果通过函数返回。编写完整的程序并测试。 #include int x,y; }; struct RECT { POINT A; POINT B; }; double Area(RECT rc) { return abs(rc.A.x-rc.B.x)*abs(rc.A.y-rc.B.y) ; } int main(){ RECT rc={{10,10},{20,20}}; cout<<\矩形的面积是\return 0; } 4.定义一个描述复数的结构类型COMPLEX,设计两个函数Add和Mul,分别实现两个复数的加法和乘法运算,计算结果通过函数返回。编写完整的程序并测试。 #include 43 { float a,b; }; COMPLEX Add(COMPLEX x1,COMPLEX x2) { COMPLEX x; x.a=x1.a+x2.a; x.b=x1.b+x2.b; return x; } COMPLEX Mul(COMPLEX x1,COMPLEX x2) { COMPLEX x; x.a=x1.a*x2.a-x1.b*x2.b; x.b=x1.a*x2.b+x1.b*x2.a; return x; } int main(){ COMPLEX x1={3,5},x2={4,7}; cout<<\和x2的和为\ cout<<\和x2的积为\ return 0; } 5.定义一个学生成绩结构类型STUDENT,描述的信息有:学号,姓名,三门课成绩,总分,平均分。为一个班级成绩定义该结构类型数组,编写4个函数Input,Output,Cal和Sort。其中Input函数输入某个的全部信息(不含总分和平均分),输入的结果通过函数返回,要求有信息提示。Output函数输出某个学生的全部信息。Cal函数计算某个学生的总分和平均分,并填入成员变量中,左后结果通过形参返回。Sort函数将结构类型数组的元素按总分从小到大的次序排列。编写完整的程序并测试。 #include int no; char name[20]; float score[3]; float total,ave; }; STUDENT Input(STUDENT A) 44 { cout<<\请输入学生的学号\ cin>>A.no; cout< cout<<\请输入学生的姓名\ cin>>A.name; cout< cout<<\请输入学生的三门课的成绩\ int i=0; while(i<3){ cin>>A.score[i]; i++; cout< void Output(STUDENT A) { cout<<\学生的学号为\ cout<<\学生的姓名为\ cout<<\学生的三门课的成\ cout<<\学生的总分为\ cout<<\学生的平均分为\ cout<<\} void Cal(STUDENT *A) { (*A).total=(*A).score[0]+(*A).score[1]+(*A).score[2]; A->ave =A->total/3; } void sort(STUDENT all[],int n) { int pos; STUDENT min; for(int i=0;i 45 绩分别是
正在阅读:
C++实用教程 - 郑阿奇 课后习题答案18093203叶子上传11-03
浙江省宁波市2015年普通高中创新素养培育实验班招生考试模拟数学试题及答案05-19
北师大版七年级历史(下)教学资料03-08
2014版大型矿山开采装备产业升级改造项目(立项及贷款用)可行性研究报告编制机构服务流程及案例展示 - 图文01-10
国际经济学题库 - 图文04-29
襄阳市中考语文试卷及答案解析03-12
数据结构c语言版期末考试复习试题(无串)06-09
民营银行的发展路径改08-09
双簧打麻将台词02-15
智能锁小区活动方案概述10-10
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 阿奇
- C++
- 课后
- 习题
- 18093203
- 叶子
- 答案
- 上传
- 实用
- 教程
- 钢筋符号识图
- 高频 谐振功率放大器 - 图文
- 青歌赛主持词
- 公司一级安全技术交底书(样本)
- FANUC伺服计算
- 2009静脉输液试题及答案(1)
- 八年级物理下册9.3大气压强测试新版新人教版
- 工程水文学计算题
- 会计基础第一章习题及答案
- 2017年继续教育考试 Microsoft Word 2007 文档(2)
- 走进四季,感受自然 修改
- 公共经济学大纲
- 电气控制技术及应用习题库 - 图文
- 最新审定新人教版小学数学二年级上册第6单元《表内乘法二》试卷1
- (-神经科学导论)尔雅大脑的奥秘课后答案及考试答案
- 2019年中国二类压力容器市场调查研究及发展趋势分析报告目录
- 公共关系专题活动
- 上海市普陀区曹杨二中2018-2019学年高一(上)期中物理试卷(word版含答案解析)
- 西方经济学(宏观部分)第五版内容整理
- 小班科学活动计划