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 using namespace std; int main() {

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 using namespace std; int main() {

int a=8,b=10; int temp; temp=a; a=b; b=temp;

cout<<\ return 0; }

不用中间变量方法一: #include using namespace std; int main() {

int a=8,b=10; a=a^b; b=b^a; a=a^b;

cout<<\ return 0; }

不用中间变量方法二: #include using namespace std;

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 using namespace std;

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 using namespace std; const int STDNO=50; int main() {

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<指出cin执行后,a、b、c的值分别是什么?输出的结果是什么? 答案:输出结果是:12 12 12 a、b、c的值分别是18,10和12

第三章 运算符和表达式

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 using namespace std; int main() {

cout <<\类型所占字节数为\cout <<\类型所占字节数为\cout <<\类型所占字节数为\cout <<\类型所占字节数为\cout <<\类型所占字节数为\cout <<\类型所占字节数为\

cout <<\类型所占字节数为\cout<<\字符\\nCh\\t\\v\\0ina所占字节数为\return 0; }

10. 从键盘输入一个三位数,从左到右用a,b,c表示各位的数字,记为abc.现要求依次输出从右到左的各位数字,即输出另外三位数cba。试设计程序。 #include using namespace std; int main() {

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 using namespace std; int main() {

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 using namespace std; int main() {

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 using namespace std; int main() { int x,y; cout<<\请输入x:\ cin >>x;

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 using namespace std; int main()

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 #include using namespace std; int main() {

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 #include using namespace std;

10

int main() {

int n,m=1;

cout<<\请输入n:\ cin>>n;

for(int i=0;i=1;n--) { m*=n; }*/ { m*=(n-i); }

cout <<\的阶乘为\ return 0; }

12. 从键盘上输入一个整数n的值,按下式求出y 的值,并输出n和y 的值(y用浮点数表示)

y=1!+2!+3!+……+n!

方法一: #include #include using namespace std; int main() {

int n,y=0,m=1; cout<<\请输入n:\cin>>n;

for(int j=0;j

cout <<\的值为\return 0; }

方法二:

#include using namespace std; int main() {

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 #include using namespace std; int main() {

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 using namespace std; int main() {

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 using namespace std; int main() {

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 using namespace std; int main() {

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 using namespace std; int main() {

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 using namespace std; int main() {

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 using namespace std; int getMax(); int main() {

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 using namespace std; void getHex(int dec); void convert(int dec); int main() {

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 using namespace std; double getC(double f); int main() {

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 using namespace std;

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 using namespace std;

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 using namespace std; void getMin(int i1,int i2);

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<i2) min1=i2; if(i3>i4) min2=i4;

if(min1>min2) min=min2; else min=min1; cout<

6. 设计一个程序,通过重载实现两个整数、两个实数和两个复数的加、减运算。

#include using namespace std;

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 using namespace std; struct PUKE {

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 using namespace std;

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<data <next; }

cout<

10.设计函数,实现单链表的逆置。#include using namespace std;

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 using namespace std;

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 using namespace std;

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;ia[j+1]) { temp=a[j]; a[j]=a[j+1]; a[j+1]=temp; }

for(i=0;i

32

}

4 编写函数int fun(int *a,int *n,int pos,int x); 其功能是将x值插入到指针a所指向的一维数组中,其中指针n指定数组元素个数,pos指定插入位置的下标。编写完整的程序并测试。 #include using namespace std;

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<>x; while(true) { cout<<\请输入插入位置的下标(0-9):\ cin>>pos; if(pos>=0&&pos<=9) break; else 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 using namespace std;

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 using namespace std; int strlen(char *str); int main() {

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 using namespace std;

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 #include using namespace std; void fun(char *s); int main() {

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 using namespace std;

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 #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 #include using namespace std;

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;i0) { min=str[j]; k=j;

37

} str[k]=str[i]; str[i]=min; }

for(i=0;i

12 用带参数的main函数判断某一年是否是闰年。编写完整的程序并测试。 #include #include using namespace std;

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 using namespace std; int main() {

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 using namespace std;

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 using namespace std;

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=minb?a:b;

max=max>c?max:c;//求最大数 if(min==a)//求中间数 middle=bc?c:a; else middle=a

cout<

15 由17个人围成一个圈,编号为1—17,从第1号开始报数,报到3的倍数的人离开,一直数下去,直到最后只剩下1人,求此人的编号。 #include using namespace std; int main() {

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 struct DATE

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 #include struct POINT3D {

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 #include #include struct POINT {

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 #include #include struct COMPLEX

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 #include #include struct STUDENT {

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

绩分别是

本文来源:https://www.bwwdw.com/article/g752.html

Top