谭浩强C课后习题答案_第1页
谭浩强C课后习题答案_第2页
谭浩强C课后习题答案_第3页
谭浩强C课后习题答案_第4页
谭浩强C课后习题答案_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

谭浩强C++课后习题答案

第1章

谭浩强C++课后习题答案

1.请根据你的了解,叙述C++的特点。C++对c有哪些发展?

【解】略。

2.一个C++的程序是由哪几部分构成的?其中的每一部分起什么作用?

【解】略。

3.从拿到一个任务到得到最终结果,一般要经过几个步骤?

【解】略。

4.请说明编辑、编译、连接的作用。在编译后得到的目标文件为什么不能直接运行?

【解】编译是以源程序文件为单位进行的,而一个完整的程序可能包含若干个程序文

件,在分别对它们编译之后,得到若干个目标文件(后缀一般为.obj),然后要将它们连

接为一个整体。此外,还需要与编译系统提供的标准库相连接,才能生成一个可执行文件

(后缀为.exe)。不能直接运行后缀为.obj的目标文件,只能运行后缀为.exe的可执行

文件。

5.分析下面程序运行的结果。

ttinclude<iostream>

usingnamespacestd;

intmain()

cout«,zThis〃<<〃is

cout«,zaC++〃;

cout«/zprogram.〃«endl;

return0;

【解】输出的结果为

ThisisaC++program.

4C++面向对象程序设计题解与上机指导

6.分析下面程序运行的结果。

#include<iostream>

usingnamespacestd;

intmain()

(

inta,b,c;

a=10;

b=23;

c=a+b;

cout<<〃a+b=〃;

cout«c;

cout«endl;

return0;

}

【解】前两个cout语句在输出数据后不换行,第3个cout语句输出一个换行,因此

输出的结果为

a+b=33

7.分析下面程序运行的结果。请先阅读程序写出程序运行时应输出的结果,然后上机

运行程序,验证自己分析的结果是否正确。以下各题同。

ftinclude<iostream>

usingnamespacestd;

intmain()

inta,b,c;

intf(intx,inty,intz);

cin»a»b»c;

c=f(a,b,c);

cout«c<<endl;

return0;

)

intf(intx,inty,intz)

(

intm;

if(x<y)m=x;

elsem=y;

if(z<m)m=z;

return(m);

}

【解】程序的作用是:输入3个整数,然后输出其中值最小的数。在主函数中输入3

个整数,然后调用f函数,在f函数中实现找最小的整数,用if语句比较两个数,将第1

章C++的初步知识

小者存放在变量m中,经过两个if语句的比较,m中存放的是3个整数中最小的数。运

行情况如下:

(输入3个整数)

1(输出其中最小的数)

5

8.在你所用的C++系统上,输入以下程序,进行编译,观察编译情况,如果有错误,请

修改程序,再进行编译,直到没有错误,然后进行连接和运行,分析运行结果。

intmain();

inta,b;

c=a+b;

cout>>"a+b=〃>>a+b;

【解】上机编译出错,编译出错信息告知在第2行出错,经检查,发现第1行的末尾

多了一个分号,编译系统无法理解第2行的花括号,导致报告第2行出错。将第1行的末

尾的分号去掉,重新编译,编译出错信息告知在第5行和第6行出错。第5行出错原因是

cout未经声明,因为cout不是C++语言提供的系统的关键字,而是输出流的对象,必须

使用头文件iostream。第6行出错原因是main是int型函数,应返回一个整型值。将程

序改为

^include<iostream>

intmain()

inta,b;

c=a+b;

cout>>"a+b=”>>a+b;

return0;

}

重新编译。编译出错信息告知在第5行和第6行出错。第5行出错原因是变量c未定

义,第6行出错原因是cout未经声明,说明#includeCiostream〉命令行未能起作用,原

因是未指明命名空间。将程序改为

#include<iostream>

usingnamespacestd;

intmain()

(

inta,b,c;

c二a+b;

cout»,za+b=”>>a+b;

return0;}

6C++面向对象程序设计题解与上机指导

重新编译。编译出错信息告知在第7行出错,经检查,是“〉”用得不当,“>>”是提

取运算符,应与cin联合使用,用来从输入流中提取数据,输出时应该用插入运算符

o把两处">>”都改为,再重新编译,发现没有error错误,但有两个警告

(warning),原因是定义了a和b,但未对它们赋值。应增加赋值语句或输入语句,使a

和b获得值,将程序改为

Sinclude<iostream>

usingnamespacestd;

intmain()

(

inta,b,c;

cin»a»b;

c=a+b;

cout»,za+b=〃»a+b;

return0;

)

重新编译,没有编译错误,能通过编译和连接,可以正常运行,在VisualC++6.0环

境下运行时屏幕显示如下:

a+b=14Pressanykeytocontinue

显然这样的输出不理想,"Pressanykeytocontinue,,是VisualC++系统在输出了

运行结果后自动显示的一个信息,告诉用户“如果想继续工作,请按任何一个键”。当用

户按任何一个键后,显示运行结果的窗口消失,屏幕显示回到VisualC++的主窗口,显示

出源程序和编译信息。

为了解决以上输出不理想的情况,可以在最后一个输出语句中增加输出一个换行符。最

后的程序如下:

Sinclude<iostream>

usingnamespacestd;

intmain()

(

inta,b,c;

cin»a»b;

c=a+b;

cout<</za+b=//«a+b<<endl;

return0;

)

运行时屏幕显示如下:

a+b=14

第1章C++的初步知识

Pressanykeytocontinue

7

这就完成了程序的调试。

这里对本题的调试过程作了比较详细的分析,以便使读者对如何调试程序有比较具体而

清晰的了解。需要说明:

(1)编译系统给出的编译出错信息,只是提示性的,引导用户去检查错误,用户必须

根据程序的上下文和编译出错信息,全面考虑,找出真正出错之处。例如编译出错信息通

知第2行出错,其实可能是第1行出错。

(2)有时,有的错误开始时未被检查出来并告知用户(例如未定义变量c),由于其他

错误未解决,掩盖了这个错误。当解决了其他错误后,这个错误会被检查出来。有时在调

试过程中会不断检查出新的错误,这是不奇怪的。一一处理,问题会迎刃而解。

(3)为了说明调试过程,这里全部依靠计算机系统来检查错误,其实有些明显的错

误,完全可以由人工查出,这样可以提高调试效率。由人工在纸面或屏幕上检查错误,称

为静态查错,用计算机编译系统检查错误,称为动态查错。建议尽量先用静态查错的方法

排除错误,只有人工检查不出来的错误才让计算机检查。

9.输入以下程序,进行编译,观察编译情况,如果有借误,请修改程序,再进行编

译,直到没有错误,然后进行连接和运行,分析运行结果。

#include<iostream>

usingnamespacestd;

intmain()

inta,b;

c=add(a,b)

cout«,,a+b=,,«c«endl;

return0;

intadd(intx,inty);

z=x+y;

retrun(z);

【解】发现7个错误:

(1)对add函数未声明就调用,应在main函数中对add函数进行声明。

(2)定义add函数时,函数首行末尾不应有分号。

(3)变量c未经定义。

(4)add函数中的变量z未经定义。

(5)第6行末尾少了一个分号。

(6)add函数中的retrun拼写错误,应为return。编译系统把retrun作为未声明的

标识符而报错,因为retrun(z)会被认为是函数调用的形式。

8C++面向对象程序设计题解与上机指导

(7)变量a和b未被赋值。

改正后的程序如下:

#include<iostream>

usingnamespacestd;

intmain()

{intadd(intx,inty);

inta,b,c;

cin»a»b;

c=add(a,b);

couta+b="«c<<endl;

return0;

)

intadd(intx,inty)

{intz;

z=x+y;

return(z);

运行情况如下:

/

10.输入以下程序,编译并运行,分析运行结果。

ttinclude<iostream>

usingnamespacestd;

intmain()

{voidsort(intx,inty,intz);

intx,y,z;

cin»x»y»z;

sort(x,y,z);

return0;

)

voidsort(intx,inty,intz)

(

inttemp;

if(x>y){temp=x;x=y;y=temp;}//{}内3个语句的作用是将x和y的值互换if

(z<x)cout<<z'<<x'<<y<<endl;

elseif(z<y)cout<<x<<','<<z'«y<<endl;

elsecout<<x'<<y'«z«endl;}

第1章C++的初步知识

请分析此程序的作用。sort函数中的if语句是一个嵌套的if语句。

运行时先后输入以下几组数据,观察并分析运行结果。

①3610/

②6310/

③1063/

④10,6,3/

9

【解】程序的作用是对输入的3个整数按由小到大的顺序进行排序。sort函数中的第

1个if语句的作用是先将x和y排序,使x小于或等于y。第2个if语句是一个嵌套的

if语句,先比较z和x,如果句x,显然由小到大的顺序应当是z,x,y,按此顺序输出;

如果z不小于x,而小于y,显然由小到大的顺序应当是x,z,y,按此顺序输出;如果z既

不小于x,又不小于y,显然由小到大的顺序应当是x,y,z,按此顺序输出。

按题目要求分别输入以下几组数据,运行结果如下:

①3610/

3,6,10

②6310/

3,6,10

③1063/

3,6,10

④10,6,3/

-858993460,-858993460,10

以上是在VisualC++6.0环境下运行的情况,前3次运行正常,表明当输入不同的数

据时,程序能实现由小到大的排序功能。第4次运行的结果显然不正常,这是由于输入数

据时出了问题,本来要求在输入数据时,数据之间以空格或换行相隔,而现在却以逗号相

隔,只有第一个整数能正常赋给变量x,第二和第三个数据均无法正常赋给变量y和z,y

和z的值来自输入流中相应字节的内容。

11.求2个或3个正整数中的最大数,用带有默认参数的函数实现。

【解】可以编写出以下程序:

^include<iostream>

usingnamespacestd;

intmain()

{intmax(inta,intb,intc=0);

inta,b,c;

cin»a»b»c;

cout<<〃max(a,b,c)=〃<<max(a,b,c)<<endl;

cout<<〃max(a,b)=〃«max(a,b)«endl;

return0;}

10C++面向对象程序设计题解与上机指导

intmax(inta,intb,intc)

{if(b>a)a=b;

if(c>a)a=c;

returna;

)

运行情况如下:

/

max(a,b,c)=76(从3个数中找最大者)

max(a,b)=13(从前2个数中找最大者)

如果想从3个数中找大者,可以在调用时写成“max(a,b,c)”形式,如果只想从2个数

中找大者,则在调用时写成“max(a,b)”形式,此时c自动取默认值0,由于0比任何正

整数都小,因此从14,5,0中选最大者和从14,5中选大者的结果是一样的。

12.输入两个整数,将它们按由大到小的顺序输由。要求使用变量的引用。

【解】可以编写出以下程序:

#include<iostream>

usingnamespacestd;

intmain()

{voidchange(int&,int&);

inta,b;

cin>>a>>b;

if(a<b)changed,b);〃如果a<b,使a和b的值互换

cout<max=〃<〈a<<"min="z<<b«endl;

return0;

}

voidchange(int&rl,int&r2)〃函数的作用是使rl与r2互换

{inttemp;

temp=rl;

rl=r2;

r2=temp;

)

运行情况如下:

/max=67min=12

13.对3个变量按由小到大顺序排序,要求使用变量的引用。

【解】可以编写出以下程序:

itinclude<iostream>第1章C++的初步知识

usingnamespacestd;

intmain()

{voidsort(int&,int&,int&);

inta,b,c,al,bl,cl;

cout«/zPleaseenter3integers:;

cin>>a>>b>>c;

al=a;bl=b;cl=c;

sort(al,bl,cl);

cout«a<<z,/z«b«,zinsortedorderis

cout«al«z,,,«bl<<,zz,«cl<<endl;

return0;

}

voidsort(int&i,int&j,int&k)

{voidchange(int&,int&);

if(i>j)changed,j);

if(i>k)change(i,k);

if(j>k)change(j,k);

)

voidchange(int&x,int&y)

{inttemp;

temp=x;

x=y;

y二temp;

11

运行情况如下:

2367-55insortedorderis-552367

这个程序很容易理解,不易出错。由于在调用sort函数时虚实结合使形参i,j,k成为

实参al,bl,cl的引用(别名),因此通过调用函数sort(al,bl,cl)既实现了对i,j,k

排序,也就同时实现了对al,bl,cl排序。同样,执行change(i,j)函数,可以实现对实

参i和j的互换。

14.编一程序,将两个字符串连接起来,结果取代第一个字符串。要求用string方法。

【解】可以编写出以下程序:

#include<iostream>

^include<string>〃程序中若使用字符串变量,必须包含头文件string

usingnamespacestd;

intmain()

{stringsl=〃week〃,s2=〃end〃;

cout<<〃sl=〃<<si«endl;

cout<<〃s2="«s2<<endl;12C++面向对象程序设计题解与上机指导

sl=sl+s2;

cout«,zThenewstringis:zz«sl<<endl;

return0;

)

运行情况如下:

sl=week

s2=end

Thenewstringis:weekend

15.输入一个字符串,把其中的字符按逆序输出。如输入LIGHT,输出THGIL。要求用

string方法。

【解】可以编写出以下程序:

#include<iostream>

#include<string>

usingnamespacestd;

intmain()

{stringstr;〃定义字符串变量str

inti,n;

chartemp;〃定义字符变量temp

cout<<〃pleaseinputastring:〃;

cin»str;

n=str.size();

for(i=0;i<n/2;i++)

cout<<str«endl;

return0;

)

〃输入一个字符串赋给字符串变量str〃测量str的长度n〃使str中的字符对称互

换{temp=strEi];str[i]=str[n-i-l];str[n-i-l]=temp;}

运行情况如下:

pleaseinputastring:

THG1L

注意:输入的字符串中不能含有空格。

16.有5个字符串,要求将它们按由小到大的顺序排列,用string方法。

【解】可以编写出以下程序:

ttinclude<iostream>

#include<string>

usingnamespacestd;

intmain(){inti;

第1章C++的初步知识

stringstr[5]=fBASIC",〃C〃,〃FORTRAN",/zC++","PASCAL");

voidsort(string[]);

sort(str);〃对字符串排序

cout<X"thesortedstrings:〃<<endl;

for(i=0;i<5;i++)

cout«str[i]«,z〃按Ll排好的顺序输出字符串

cout«endl;

return0;

)

voidsort(strings[])

{inti,j;

stringt;

for(j=0;j<5;j++)

for(i=0;i<5-j;i++)

if(s[i]>s[i+l])

{t=s[i];s[i]=s[i+l];s[i+l]=t;}

13

运行结果如下:

thesortedstrings:

BASICCC++FORTRANPASCAL

17.编一个程序,用同一个函数名对n个数据进行从小到大排序,数据类型可以是整

型、单精度型、双精度型。用重载函数实现。

【解】可以编写出以下两个程序:

(1)建立3个函数,分别用于处理整型、单精度型、双精度型数据的排序,在3个函

数中都采用选择法排序方法。

ftinclude<iostream>

^include<string>

usingnamespacestd;

intmain()

(

longa[5]={10100,-123567,1198783,-165654,3456);

intb[5]={l,9,0,23,-45);

floatc[5]={2.4,7.6,5.5,6.6,-2.3};

voidsort(long[]);

voidsort(int[]);

voidsort(float[]);

sort(a);

sort(b);

sort(c);return0;

C++面向对象程序设计题解与上机指导

voidsort(longa[])

{inti,j;

longt;

for(j=0;j<5;j++)

for(i=0;i<5-j;i++)

if(a[i]>a[i+l])

{t=a[i];a[i]=a[i+l];a[i+l]=t;}cout«/zthesortednumbers:〃<<endl;

for(i=0;i<5;i++)

cout«a[i]«z,;

cout«endl«endl;

)

voidsort(inta[])

{inti,j,t;

for(j=0;j<5;j++)

for(i=0;i<5-j;i++)

if(a[i]>a[i+l])

{t=a[i];a[i]=a[i+l]cout«z,thesortednumbers:〃<<endl;

for(i=0;i<5;i++)

cout«a[i]«〃〃;

cout«endl<<endl;

)

voidsort(floata[])

{inti,j;

floatt;

for(j=0;j〈5;j++)

for(i=0;i<5-j;i++)

if(a[i]>a[i+l])

{t=aLi];a[i]=a[i+l];a[i+l]=t;}cout<<〃thesortednumbers:"<<endl;

for(i=0;i<5;i++)

cout«a[i]«,zz,;

cout«endl<<endl;

)

运行结果如下:

thesortednumbers:

-123567-1656541010034561198783

14(长整型数据排序)第1章C++的初步知识

thesortednumbers:(整型数据排序)

-4501923

thesortednumbers:

-6.67.6(单精度型数据排序)

15

(2)在第1种方法中,3个函数的函数体基本上是相同的,都是采用选择法排序,在下

面的程序中,3个函数的函数体不全相同,前两个函数采用选择法排序,最后一个函数采

用起泡法排序。

ttinclude<iostream>

ttinclude<string>

usingnamespacestd;

intmain()

{longa[5]={10100,-123567,1198783,-165654,3456);

intb[5]={l,9,0,23,-45);

floatc[5]={2.4,7.6,5.5,6.6,-2.3};

voidsort(int[]);

voidsort(float[]);

voidsort(long[]);

sort(a);〃对长整型数据排序

sort(b);〃对整型数据排序

sort(c);〃对单精度型数据排序

return0;

)

voidsort(longa[])〃对长整型数据用选择法排序的函数

{inti,j,min;

longt;

for(i=0;i<5;i++)

{min=i;

for(j=i+l;j<5;j++)

if(a[min]>a[j])min=j;{t=a[i];a[i]=a[min];a[min]=t;}

cout«z/thesortednumbers:zz<<endl;

for(i=0;i<5;i++)

cout«a[i]«z,;

cout«endl<<endl;

voidsort(inta[])〃对整型数据用选择法排序的函数

{inti,j,t;

for(j=0;j<5;j++)16C++面向对象程序设计题解与上机指导

for(i=0;i<5-j;i++)

if(a[i]>a[i+l])

{t=a[i];a[i]=a[i+l];a[i+l]=t;}

cout«^thesortednumbers:zz«endl;

for(i=0;i〈5;i++)

cout«a[i]«z,;

cout«endl<<endl;

)

voidsort(floata[])〃对单精度型数据用起泡法排序的函数

{inti,j

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论