C程序设计(第二版-吴乃陵-况迎辉)课后答案_第1页
C程序设计(第二版-吴乃陵-况迎辉)课后答案_第2页
C程序设计(第二版-吴乃陵-况迎辉)课后答案_第3页
C程序设计(第二版-吴乃陵-况迎辉)课后答案_第4页
C程序设计(第二版-吴乃陵-况迎辉)课后答案_第5页
已阅读5页,还剩106页未读 继续免费阅读

下载本文档

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

文档简介

第一章C++基础知识习题1

第一章C++基础知识习题

1.1判断下列标识符的合法性。

sinbook5arry_nameExample2.1main

$1class_cppa3x*ymyname

答:合法的:sinbook_namemainclass_cppa3

非法的:5arryExample2.1$1x*ymyname

1.2假定有下列变量:

inta=3,b=5,c=0;

floatx=2.5,y=8.2,z=l.4;

charchi='a',ch2='5',ch3='O',ch4;

求下列表达式的值,以及运算后表达式所涉及的各变量的值。

x+(int)y%ax=z*b++,b=b*x,b++ch4=ch3-ch2+chl

int(y/z)+(int)y/(int)z!(a>b)&&C&&(x*=y)&&b++

ch3||(b+=a*c)||c++z=(a«2)/(b»l)

答:x+(int)y%a表达式值为:4.5,运算后x、y、a的值不变,仍分别为2.5、8.2、

3o

提示:运算时取出y变量的数值强制转化为整型数放入寄存器参加运算,但内存中y

本身的数值不变化。只有赋值运算和自增、自减运算才改变变量本身的值

x=z*b++,b=b*x,b++表达式值为:42,运算后x为7.0,b为43。

提示:逗号表达式,依次运算,表达式的值是最后一次运算的值。后++是变量先参

加运算然后变量自身加1,所以第1步x等于1.4*5,即7.0,然后b增为6;第2步b赋

值为42;第3步,表达式的值是上一步后b的值42,但随后b的值自增1,成为43。

ch4=ch3-ch2+chl表达式值为:'\\',字符外斜杠。运算后chi、ch2、ch3值不

变。

提示:字符型的变量实质是范围很小的整型量。

int(y/z)+(int)y/(int)z表达式值为:13。y和z自身的值不变。

提示:int(y/z)是完成实数除法后,商强制转化为整型,(int)y/(int)z则是数值

先转换,完成的是整除。

!(a>b)&&c&&(x*=y)&&b++表达式值为:0。运算后x仍为2.5,b仍为5

提示:只要出现一个false右边的不再做,因为c为0,即false,所以其右的所有运

算不再做。

ch3||(b+=a*c)||c++表达式值为:lo运算后b为5,c为0,均不变。

提示:只要出现一个true,右迈不再做。ch3的值为48。

z=(a«2)/(b»l)表达式值为:60运算后a与b的值不变仍为3和5。

提示:a的数值为(00000011)2,左移2位为(00001100)2即12,相当整数2两次,而b

的数值为(00000101)2,右移1位为(00000010)2,即2,相当于整除2。

1.3判明下列哪些是常量,哪些是变尊。,一

“China“constintn=10;intm=5;'a'charch='a'

intarray[5]={1,2,3,4,5};chars[]="Hello”;

答:"China”文字常量

constintn=10;常变量

intm=5;变量

'a'文字常量1

第一章C++基础知识习题

2,,

charch=,a变量

intarray[5]={1,2,3,4,5);变量

chars[]="Hello”;变量

1.4将下列算式或叙述用C++表达式描述。

(2)(x+y)/((x-y)*ay)

(3)位于原点为圆心,a,b为半径的圆环中的点坐标。

(4)o

(5)并且字符ch不为‘\0'。

答:pi/2+sqrt(asin(x)*asin(x)+c*c)

(x+y)/((x-y)*pow(a,y))

((x*x+y*y)>=a*a)&&((x*x+y*y)<=b*b)

(a!=b)&&.(a!=c)&&(b!=c)

(k<=20)&&(ch!=\0')

1.6设有语句:

inta,b;

floatx,y:

charchi,ch2,ch3;

cin>>a»b>>x»y>>chl;

ch2=cin.get();

cin>>ch3;

若从键盘输入:

321.87abc

执行后各变量取值如何?注意abc三字符两两间有空格。

答:a是3,b是2,x是1.8,y是7,chi是'a',ch2是空格,ch3是‘b'。

1.7设有语句:

inta,b,c,d;

cin>>oct»a>>b>>hex>>c>>dec>>d;

若从键盘输入:

23232323

执行后各变量的值用十进制表示各是多少?

答:a:19,b:19,c:35,d:23

1.8对于习题1.7,若执行:

cout«a<<,\t'<<hex«b<<z\tz<<oct«c<<endl;

显示结果是什么?

答:190x13043

2

第二章基本控制结构程序设计习题

一.基本概念与基础知识自测题

3.1程序阅读题

3.1.1设有说明:

inta=3,b=100;

下面的循环语句执行(1)次,执行后a、b的值分别为⑵、⑶。

while(b/a>5){i

f(b-a>25)a++;

elseb/=a;

)解答:本题检查学生整除的概

念。跟踪:

abb/a循环次数b-a

310033197

410025296

510020395

1510061385

1610061484

171005停

(1)14

(2)17

(3)100

3.1.2设有说明:

intn,x,k,y;

下面程序段的功能是备选答案中的(1),当n=10,x=10打印结果是(2).

cin»x»n;

k=0;

do{x

/=2;

k++;

}while(k<n);

y=l+x;

k=0;

do{y=

y*y;

k++;

}while(k<n);

cout«y«endl;

备选答案:

A.y=(l〜")B->=(1土C.y=(1D.y=(l上/

)+2"+2"+2n+l

n

n

__________________________第二章基本控制结构程序设计习题__________________________2

解答:

第一个循环使x成为:三;y成为:1+二;第.个循环使y成为:(1+二户";

2"2"T

(1)B

考虑整除二连除4次以后为零,所以:

八’2〃

(2)1

3.1.3请看如下程序段:

if(num==1)cout«MAlphan;

elseif(num==2)cout«^^Bata^^;

elseif(num==3)cout«,,Gamma,>;

elsecout«^^Delta^^;

当num的值分别为1、2、3时,上面程序段的输出分别为(1)、⑵、⑶°解

答:

检查条件语句与字符串输出概念:

(1)Alpha

(2)Bata

(3)Gamma

3.1.4执行下面程序段后,m和k的值分别为(1)、(2)Q

intm,k;

for(k=1,m=0;k<=50;k++){

if(m>=10)break;

if(m%2==0){

m+=5;

continue;

)

m-=3;

解答:注意continue语句的使用

初值m=lk=0

第1次循环后m=5k=l

第2次循环m=2k=2

第3次循环m=7k=3

第4次循环m=4k=4

第5次循环m=9k=5

第6次循环m=6k=6

第7次循环m=l1结束,k++未做

(1)11

(2)6

二.编程与综合练习题

3.2编程求一元二次方程ax2+bx+c=0的根。包括以下判断和结果:若输入a=0,给出提示:

第二章基本控制结构程序设计习题3

若△>(),输出两个不等实根;若△=(),输出两个相等实根;若△<().输出两个复数根。

解:本题以一个绝对值极小的数作为实数0。

#include<iostream.h>

#include<math.h>

#include<stdlib.h>

voidmain(){

doublea,b,c;

doubledelta,xl,x2;

constdoublezero=le-9;〃定义一个很小的常数

intsign;

cout<〈”输入三个系数a(a!=0),b,c:,z«endl;

cin»a>>b»c;

if(fabs(a)<zero){cout<<〃二次项系数为0,

方程根是-c/b〃;exit(0);

}cout<<,,a=,,«a<<,\t*<<,,b=,,«b<<,\t*<<,,c=,/«c<<endl;

delta=b*b-4*a*c;if(fabs(delta)〈zero){〃绝对值很小

的数即被认为是0

cout<<〃方程有两个相同实根:〃;

cout<<z,xl=x2=/z<<-b/(2*a)«endl;

)

else{

if(delta>0)

signal;

else

sign=0;

delta=sqrt(fabs(delta));

xl=-b/(2*a);

x2二delta/(2*a);

if(sign){cout<<”方程有两个不同实根:〃;

cout<<,/xl=,z<<xl+x2<<,\tJ<<,/x2:=,z<<xl-x2<<endl;

)

else{//delta<0cout<<〃方程无实根!有两个不同复数根:〃;

cout«〃xl/<<xl<<〃+i〃<<x2«'\t'<<〃x2=〃<<xl<<〃-i〃<<x2<〈endl;

)

}

}

3.3设计程序将输入的百分制成绩转换为五分制输出,90分以上为5分,80〜89分为4分,

70-79分为3分,60-69分为2分,60分以下为1分。解:

10分一档用10进行整除获得,转换用开关语句实行。

第二章基本控制结构程序设计习题4

#include<iostream.h>

voidmain(){

intmark,result;〃mark是百分制成绩,result是5分制

cout<〈〃请输入百分制成绩:〃<Xendl;

cin»mark;

if(mark<0){cout<<“缺考!

“<<endl;return;

)

switch

(mark/10){case9:

case10:result=5;

cout<〈〃输出五分制成绩*/z«result«endl;

break;

case8:result=4;cout<〈”输出五分制成绩:

,z«result«endl;break;

case7:result=3;cout<<"输出五分制成绩:

z/«result«endl;break;

case6:result=2;cout<<"输出五分制成绩:

?z«result<<endl;break;

case5:case4:case3:case2:case1:case0:

result=1;cout<X"输出五分制成绩:

,z«result«endl;break;

default:

cout<<“输入错误!"<<endl;

}

)

3.4编程打印如下图形:

*****

**

***

***

解:难点在三角形左边的空格的控制,嵌套一个循环语句完成此任务。

第二章基本控制结构程序设计习题5

#include<iostream.h>

voidmain(){

inti,j;

for(i=l;i<=4;i++){

for(j=4-i;j>0;j—)〃三角形每彳亍前部的空格

cout<<〃〃;

for(j=l;j<=2*i-l;j++)

cout«z/*〃;

cout<<endl;

}

for(i=l;i<=3;i++)cout«z,***\n〃;

)

3.5编程输出下列图形,中间一行英文字母由输入得至L

A

BBB

CCCCC

DDDDDDD

CCCCC

BBB

A

解:分上三角和下三角两部分分别处理左边的空格。

#include<iostream.h>

void

main(){

charin;

inti,j;

do{

cout<<"输入一个字母:〃;

cin»in;

if((in>=97)&&(in<=122))in-=32;〃小写改大写

}while((in<65)||(in>90));

intline二in」A';

for(i=0;i<=line;i++){〃上三角

for(j=line-i;j>0;j一)

cout«,z〃;〃前方空格

for(j=l;j<=2*i+l;j++)

cout<<,'<<char(i+'A');

cout<<endl;

}

for(i=line;i>0;i一){〃下三角(少•行)

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

cout<</z〃;

for(j=l;j<=2*i-l;j++)

cout<<,'<<char(iT+'A');

第二章基本控制结构程序设计习题6

cout<<endl;

)

}

3.6输入n,求1!+2!+3!+…+n!

解:通常求和作为外循环,阶乘作为内循环。这里考虑到:n!=n*(n-l)!,利用递推法运算速

度大大提高,同时两者可合并为一个循环。本程序考虑了输入的健壮性。

/include<iostream.h>

^include<stdlib.h>

voidmain(){

intn;

doubleresult=0;〃result是结果

cin»n;

if(n<l)

(

cout<<〃输入错误!"<Xendl;

//return;

exit(0);

)

result=l;

for(inti=2,jch=l;i<=n;i++)

(

jch*=i;〃jch是i的阶乘,注意n!二n*(nT)!这样可少一层循环

result+=jch;

)

cout<<result«endl;

)

3.7猴子吃桃问题:猴子摘下若干个桃子,第一天吃了桃子的一半多一个,以后每天吃了前

一天剩下的一半多一个,到第十天吃以前发现只剩下一个桃子,问猴子共摘了几个桃子。

解:采用递推法。从最后一天逆推到第一天,9次循环。

#include<iostream.h>

constintday=10;

voidmain(){

inti,x=l;〃最后一天只有一个

for(i=l;i〈day;i++)〃从一天前推到九天前

x=(x+l)*2;

cout<〈〃开始共有桃子〃<<x«〃个。\n〃;

)

3.8从键盘输入一组非0整数,以输入0标志结束,求这组整数的平均值,并统计其中的个

数。解:将这组整数放在整型数组中,一边输入一边求和及统计正数和负数的个数,平均数

由和除以整数数量取得。

第二章基本控制结构程序设计习题7

#include<fstream.h>

#include<iostream.h>

voidmain(){

intstem[256],sum=0,pnum=0,nnum=0,i=0;cout<<“从键盘输

入一组非0整数,以输入0标志结束:“<<endl;cin»stem[i];

while(stem[i]!=0){sum+=stem[i];〃求

和if(stem[i]>0)pnum++;〃正数数

量elsennum++;〃负数数量

i++;

cin»stem[i];

)

if(!i)cout<<"0个数〃<<endl;

else{cout<X"平均值=〃<<(double)sum/(pnum+nnuni)<<endl;〃平均值习惯不用整

数cout<〈〃正数个数="<<pnum〈〈endl;

cout<<“负数个数=,z«nnum<<endl;

)

}

3.9编程找出卜500之中满足除以3余2,除以5余3,除以7余2的整数。

解:中国古代数学问题(韩信点兵)采用穷举法。注意三个条件同时成立用&&。

#include<iostream.h>

voidmain(){inti;

for(i=l;i<=500;i++)

if((i%3=2)&&(i%5==3)&&(i%7=2))

cout«i«endl;

)

3.10编程求1000之内的所有完全数。所谓完全数指的是一个数恰好等于它的所有因子和。

例如6=1+2+3,就是一个完全数。

解:采用穷举法。两重循环,外层是从1到999依次处理,内层是求该数的所有因子的和,并

判断是否等于该数。

#include<iostream.h>

voidmain(){

inti,a,sum_yz;〃sum_yz是a的因户和

for(a=l;a<1000;a++){

sum_yz=0;

for(i=l;i<a;i++)

if(a%i=0)sum_yz+=i;

if(a==sum_yz)

cout<<a<<endl;

}

__________________________第二章基本控制结构程序设计习题__________________________8

)

3.11将100元换成用10元、5元和1元的组合,共有多少种组合方法。

解:采用穷举法。考虑10元最多10张,5元最多20张,余下是1元。

#include<iostream.h>

voidmain(){

for(inti=0,j,k,count=0;i<=10;i++)〃i是10元张数,j是5元张数,k是1元张数

for(j=0;j<=20;j++){

k=100-10*i-5*j;

if(k>=0){

cout<<i<<,\V<<j<<)\t*<<k«endl;

count++;

)

)

cout<<count<<endl;

3.12利用反正切展开计算兀的近似值,要求误差10工公式如下:

3X1X

、X\.T

arct2(x)々x——+——-+L

357

令x=l,可计算出兀/4的近似值。解:采用递推法。初看每一项的递推通式不易写出,但每一

项全看作奇数项,而偶数项全为零,则很容易写出:第1项为x,第3项为第1项乘以x的

平方除以项序号3乘以・1,其余类推。同时和的误差小于最后一项的绝对值。

#include<iostream.h>

#inciude<math.h>

constdoublee=le-6;

voidmain(){

doublex,a,sum;inti=3;

cout<<〃请输入弧度值:〃*endl;

cin»x;

a=x;

sum=x;

do{

a*=x*x*(T);

sum+=a/i;

i+=2;

}while(fabs(a/i)>e);

cout<<z,arctgCz«x<</,)=//<<sum<<endl;

}

__________________________第二章基本控制结构程序设计习题__________________________9

3.13用迭代法求方程x2+10cosx=0的根,误差限为10一5。迭代公式如下:

i=X;70(/sipx+/x)

2xn-lOsinx,,

解:迭代法也是用循环语句实现,数学上

#include<iostream.h>

#include<math.h>

constdoublee=le-5;

voidmain(){

floatxO,xl;intn=0;cout<<〃输

入初始近似值•/?«endl;cin»xl;

do{

xO=xl;

xl=(x0*x0-10*(xO*sin(xO)+cos(xO)))/(2*x0T0*sin(xO));

〃x0是上次算出的结果,xl用作保存新算出的结果

n++;

}while((fabs(xl-xO)>e)&&(n<=le5));

if(n>le5)

cout<<“超出迭代le5次\n”;

elsecout<<"方程x*x+10*cos(x)=0的一个极为:"<<xl〈<endl;

cout<<"方程误差为:〃<<xl*xl+10*cos(xl)«endl;

)

3.14两队选手每队5人进行一对一的比赛,甲队为A、B、C、D、E,乙队为J、K、L、M、

N,经过抽签决定比赛配对名单。规定A不和J比赛,M不和D及E比赛。列出所有可能

的比赛名单。

解:这是一个组合问题,使用穷举法。共有5个位置,设甲队5名队员位置不变,乙队改变队

员位置,进行配对。注意第1个位置可在5个队员中任选一个,以后的位置必须扣除已选过

的队员。并扣除不能配对的情况,即得所有可能的比赛名单。

#include<iostream.h>

voidmain(){

charstl[5]=CA','B','C','D','E'},st2[5]={'J','K','L','M','N'};

inti=0,j,k,1,m,n;

for(j=0;j<5;j++){〃。号位

if(j==0)continue;//A不与J上匕赛,BPst1[0]不与st2[0]比赛

for(k=0;k〈5;k++){〃1号位

if(k==j)continue;

for(l=0;l<5;l++){〃2号位

if(l==j||l==k)continue;

for(m=0;m〈5;m++){〃3号位

if(m==j||m==k||m==l)continue;

第二章基本控制结构程序设计习题______________________________20

if(m==3)continue;〃M不与D比赛,即stl[3]不与st2[3]比赛

for(n=0;n<5;n++){〃4号位

if(n==3)continue;〃M不与E比赛,即stl[4]不与st2[3]比赛

if(n==j!jn==k||n==11|n==m)continue;

cout<<stl[0]«*<<st2[j]«?\t*«stl[1]<;

cout«stl[2]«,-«st2[1]«,\t?«st1[3]«-«st2[m"<'\t’;

cout<<stl[4]«,<<st2[n]«endl;

i++;

)

)

)

)

)

cout<<i«endl;

}

3.15编程模拟选举过程。假定四位候选人:zhang、wang、li、zhao,代号分别为1、2、3、

4O选举人直接键入候选人代号,卜4之外的整数视为弃权票,-1为终止标志。打印各位候

选人的得票以及当选者(得票数超过选票总数一半)名单。

解:用5个元素的整型数组,分别放弃权票和各候选人的得票,然后用开关语句打印。

#include<iostream.h>

#include<iomanip.h>

voidmain(){

enumcandidate{feipiao,zhang,wang,li,zhao}cand;

intvote[5]={0},i,k=0,n;

cin»n;

while(n!=-l){

k++;

if(n>=l&&n<=4)vote[n]++;

elsevote[0]++;

cin»n;

}

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

=(candidate)i;

switch(cand){

casefeipiao:

cout<<setw(10)«,zfeipiao,,«,\t*«vote[cand]«endl;break;

casezhang:cout<<setw(10)«,,zhang/,«,\t'«vote[cand];

if(vote[cand]>k/2)cout<<“当选〃<<endl;

elsecout«endl;

break;

casewang:cout<<setw(10)<<,/wangz/<<,\t'<<vote[cand];

if(vote[cand]>k/2)cout<<?,当选“<<endl;

第二章基本控制结构程序设计习题__________________________H

elsecout«endl;

break;

caseli:cout«setw(10)\tJ«vote[cand];

if(vote[cand]>k/2)cout<<〃当选"<<6ndl;

elsecout«endl;

break;

casezhao:cout«setw(10)<<zzzhao,,«,\t'«vote[cand];

if(vote[cand]>k/2)cout<<〃当选"<<endl;

elsecout«endl;

break;

)

}

)

3.16改造【例3.11】将运行结果(Fibonacii数列的前20项)存入文件。

解:采用3步法。首先建立或打开一个输出文件,并与磁盘文件联系:

ofstreamofile(,zmyfile3_16.txt");再按一定格式存入数据:

ofile<<setw(15)〈〈fib0<<setw(15)<<fibl;等然后关闭文件:

ofile.closeO;如要读出数据,则用输入文件打开,并与同一磁盘文件

联系:

ifstreamifile("myfile3_16.txt");再按同一

格式读入数据:等,并输出最后关闭

文件:file,close();

#include<fstream.h>

#include<iomanip.h>

constintm=20;

voidmain(){

intfibO=O,fibl=l,fib2,i,j,k,1;

charch,a[256];

ofstreamofile(^myfileS16.txt");

ofile«setw(15)<<fib0«setw(15)«fibl;

for(intn=3;n<=m;n++){

fib2=fib0+fibl;

ofile«setw(15)«fib2;

if(n%5=0)ofile«endl;〃控制每行5个数据

fibO=fibl;fibl=fib2;

}ofile.close();cout<<"是否要将文件输

出?Y或N”〈<endl;cin»ch;

if(ch='y'||ch='Y'){

ifstreamifile("myfile3_16.txt");

while(1){

ifile>>i>>j»k〉>l;//由文件读入

第二章基本控制结构程序设计习题______________________________12

if(ifile.eof()!=0)break;

cout<<setw(15)«i<<setw(15)<<j<<setw(15)<<k«setw(15)«l«endl;

〃屏幕显示

)

ifile.closeO;

)

3.17改造【例3.16】将运行结果(100以内素数)存入文件。

解:采用4步法。首先定义一个输出文件:ofstreamofile;再打开该文

件并与并与磁盘文件联系:ofile.open(〃myfile317.txt");按一定格式

把数据存入文件。最后关闭文件。效果与3步法相同。读文件同样可用3步

法或4步法。

#include<fstream.h>

#include<iomanip.h>

#include<math.h>

constintn=100;

voidmain(){

inta[n],i,j;

charch,b[256];

ofstreamofile;

ifstreamifile;

for(i=0;i<n;i++)a[i]=l+i;〃用数组保存整数1700

a[0]=0;〃1不是素数,置0

for(i=0;i<n;i++){

if(a[i]==0)continue;〃该数已经置0,判断下一个数

for(j=i+l;j<n;j++)if(a[j]%a[i]==0)a[j]=0;〃是a[i]倍数的元素置0;

}ofile.open(z,myfile317.txt,z);

intcount=O;

〃之间的素数:"«endl;

for(i=0;i<n;i++)〃输出所有素数

if(a[i]!=0){ofile«setw(

6)«a[i];count++;

if(count%10—0)ofile«endl;〃每行10个数据

}ofile.closeO;cout<<”是否要将文

件输出?Y或N〃«endl;cin>>ch;

if(ch=,yf||ch==,Y'){ifile.open(

/zmyfile3_17.txt");i=0;

while(ifile.get(b[i])){〃不可用>>,它不能读白字符,

第二章基本控制结构程序设计习题______________________________23

if(b[i]==,\n)break;

i++;

)

b[i]=\O,;

cout<<b«endl;

count=0;

while(1){

ifile>〉i;〃由文件读入

cout«setw(6)〈〈i;〃屏幕显示

count++;

if(count%10==0)cout«endl;〃每行10个数

if(ifile.eof()!=0)break;

〃这里与例3.20不同,最后•个数据后面可能没有回车,直接为文件结束

}ifile.closeO;

cout<<endl;

)

)

3.18改造【例3.10】文本由文本文件输入。

解:文本文件读入要用成员函数:ifile.get。,而不可用插入运算符《,否则会丢失空白字

符。

#include<fstream.h>

voidmain(){

charch;

intnline=0,nword=0,nch=O;

intisword=0;

ifstreamifile(,zep3_18.cpp〃);

cout<<〃读入ep3_18.cpp,z<<endl;

do(

ch=ifile.get();

if(ch==,\n)nline++;〃遇换行符行数+1

if(ch!=''&&ch!='\t'&&ch!='\n'&&ch!二EOF){〃读到非间隔符

if(!isword)nword++;〃在单词的起始处给单词数+1

nch++;〃字符数加+1

isword=l;

)

elseisword=0;〃读到间隔符

}while(ch!=EOF);〃读到文本结束符为止

ifile.closeO;cout<<“行数:

z/<<nline<<endl;cout<<”单词数:

zz<<nword<<endl;cout<<〃字符数:

zr«nch«endl;

}

第三章函数习题

一.基本概念与基础知识自测题

3.1填空题

3.1.1被定义为形参的是在函数中起(1)作用的变量,形参只能用(2)表示。

实参的作用是(3),实参可以用(4)、(5)、(6)表示。

答案:

(1)自变量

(2)变量名

(3)将实际参数的值传递给形参

(4)具有值的变量

(5)常量

(6)表达式

3.1.2局部域包括(1)、(2)和(3)o使用局部变量的意义在于(4)o

(2)函数域

(3)函数原型域

(4)局部变量具有局部作用域使得程序在不同块中可以使用同名变量

3.1.3静态局部变量存储在(1)区,在(2)时候建立,生存期为(3),如定

义时未显式初始化,则其初值为(4)。

(3)全局生存期

(4)全0

3.1.4局部变量存储在(1)区,在(2)时候建立,生存期为(3),如定义时

未显式初始化,则其初值为(4)o

(2)在函数或块开始执行时

(3)函数或块的执行期

(4)随机值

3.1.5编译预处理的作用是(1),预处理指令的标志是(2)o多文件系统中,

程序由(3)来管理,用户自定义头文件中通常定义一些(4)

答橐•o

(1),将源程序文件进行处理,生成一个中间文件,编译系统对此中间文件进行编

译并生成目标代码

(2)#

(3)工程文件

第三章函数习题2

(4)用户构造的数据类型(如枚举类型),外部变量,外部函数、常量和内联函

数等具有一定通用性或常用的量

3.1.6设有函数说明如下:

intf(intx,inty){returnx%y+l;}

假定a=10,b=4,c=5,下列语句的放行结果分别是(1)和(2)o

(1)cout«f(a,b)+f(a,c);(2)cout«f(f(a+c,b),f(b,c));

解答:

(1)答案:4411035abcf(a,b)f(a,c)main()f(a,b)f(a,c)41Oxy51Oxyreturnx%y+1;return

x%y+l;

(2)答案:5

3.L7下列转序的输出结果分别为(1)和(2)。

(1)

#include<iostream>

usingnamespacestd;

inta,b;

voidf(intj){

第三章函数习题3

staticinti=a;〃注意静态局部变量

intm,n;

m=i+j;i++;j++;n=i*j;a++;

cout«"i="«i«'\t,«"j="«j«'\t';

cout«"m="«m«'\t'«"n="«n«endl;

)

intmain(){

a=l;b=2;

f(b);f(a);

cout«"a="«a«'\t'«"b="«b«endl;

return0;

)

解:21abmain()f(b)f(a)ji+j=2+2=4i*j=3*3=9nmf()32Ii3232j32i+j=1+2=3i*j=2*3=6nm

答案:

i=2j=3m=3n=6(对应蓝色)

i=3j=3m=4n=9(对应绿色)

a=3b=2

(2)

#include<iostream>

usingnamespacestd;

floatsqr(floata){returna*a;}

floatp(floatx,intn){

cout«',in-process:n«,,x=,,«x«,\t,«,'n=',«n«endl;

if(n==0)return1;

elseif(n%2!=0)returnx*sqr(p(x,n/2));

elsereturnsqr(p(x,n/2));

)

intmain(){

cout«p(2.0,13)«endl;

return0;

%三章函数习题4

图解递归,共五层,返回值是回归时产生:

13nmain()l()p(2.0,13)81922.0xp(2.0,6)646n2()2.0xp(2.0,3)83n3()2.0xp(2.0,1)21n4()2.0

^^.0,0)10n5()2.0xx*sqr(p(x,n/2)x*sqr(p(x,n/2)x*sqr(p(x,n/2)sqr(p(x,n/2)

in-process:x=2n=13

in-process:x=2n=6

in-process:x=2n=3

in-process:x=2n=l

in-process:x=2n=0

8192

32简答题

321卤数'的实参和形参怎样对应?实参和形参数目必须一致吗?什么情况下可以

不同?

答:实参和形参的个数和排列顺序应一一对应,并且对应参数应类型匹配(赋值兼

容),当有缺省参数时可以不同。

3.2.2函数和内联函数的执行机制有何不同?定义内联函数有何意义?又有何要

求?

答;内联函数的调用机制与一般函数不同,编译器在编译过程中遇到inline时,为

该函数建立一段代码,而后在每次调用时直接将该段代码嵌入到调用函数中,从而

将函数调用方式变为顺序执行方式,这一过程称为内联函数的扩展或内联。内联函

数的实质是牺牲空间来换取时间。因inline指示符对编译器而言只是一个建议,编

译器也可以选择忽略该建议,内联函数只适用于功能简单,代码短小而又被重复使

用的函数。函数体中机含复杂结构控制语句,如switch、复杂if做套、while语句等,

以及无法内联展开的递归函数,都不能定义为内联函数,即使定义,系统也将作为

一般函数处理。

3.2.3全局变量和全局静态变量的区别在哪里?为什么提倡尽量使用局部变量?

答:有static修饰的全局变量只能在定义它的文件中可见,在其他文件中不可见,而

非静态的全局变量则可以被其他程序文件访问,但使用前必须用extern说明。

第三章函数习题5

局部变量具有局部作用域使得程序在不同块中可以使用同名变量。这些同名变量各

自在自己的作用域中可见,在其它地方不可见。所以提倡尽量使用局部变量

3.2.4函数重载的作用是什么?满足什么条件的函数才可以成为重载函数?重载函

数在调用时是怎样进行对应的?

答:函数重载可以定义几个功能相似,而参数类型不同使用相同的函数名的函数,

以适应不同情况下自动选用不同函数进行操作。函数重载的好处在于,可以用相同

的函数名来定义一组功能相同或类似的函数,程序的可读性增强。

在定义重载函数时必须保证参数类型不同,仅仅返回值类型不同是不行的。

当某个函数中调用到重载函数时,编译器会根据实参的类型去对应地调用相应的函

数。匹配过程按如下步骤进行:

(1)如果有严格匹配的函数,就调用该函数;

(2)参数内部转换后如果匹配,调用该函数;

(3)通过用户定义的转换寻求匹配。

3.2.5多文件结构的程序是如何进行管理并运行的?采用多文件结构有什么好处?

答:多文件结构通过工程进行管理,在工程中建立若干用户定义的头文件.h和源程

序文件.cpp。头文件中定义用户自定义的数据类型,所有的程序实现则放在不同的

源程序文件中。编译时每个源程序文件单独编译,如果源程序文件中有编译预处理

指令,则首先经过编译预处理生成临时文件存放在内存,之后对临时文件进行编译

生成目标文件.obj,编译后临时文件撤销。所有的目标文件经连接器连接最终生成

一个完整的可执存文件.exe。

多文件结构管理程序的好处是十分明显的。首先,可以避免重复性的编译,如果修

改了个别函数,那么只需将这些函数所在的文件重新编译即可;其次,将程序进行

合理的功能划分后,更容易设计、调试和维护;另外,通常把相关函数放在一个文

件中,这样形成一系列按照功能分类的文件,便于为其他程序文件使用。

3.2.6宏定义与常量定义从作用及效果上看是一样的,二者是否完全相同?

答:完全不同。不带参宏定义与const说明符定义常量从效果上看是一样的,但它们

的机制不同。首先宏定义是在预处理阶段完成,而const定义则是在编译阶段实现。

其次宏定义只是一种简单的字符串替代,不会为字符串分配内存单元,替代过程也

不作语法检查,即使指令中的常量字符串不符合常量要求,预处理的替代过程也照

样按指令给出的格式进行。而const定义则是象定义一个变量一样定义一个常量标识

符,系统要按照类型要求为该标识符分配内存单元,同时在将常量放入单元时进行

类型检查,如果类型不匹配,类型相容的会进行系统的类型转换,不相容的则要提

示错误。

二.编程与综合练习题

3.3设计函数,将小写英文字符变为对应的大写字符。

解:小写字母比大写字母ASCH码值大32,或写作ch=ch-'a'+'A,;

#include<iostream>

usingnamespacestd;

charcapitalize(charch){

if(ch>='a'&&ch<='z')returnch-'a'+'A';

elsereturnch;

)

第三章函数习题6

intmain(){

inti=0;

charcp[30];

cout<<”请输入包含小写字母的句子:"vvendl;

cin.getline(cp,30);

while(cp[i]!='\O')cout«capitalize(cp[i++]);

cout«endl;

return0;

3.4设计两个函数,分别求两个数的最大公约数和最小公倍数。

解:可用穷举法求最大公约数(从大到小找到的第1个公约数)和最小公倍数(从

小到大找到的第1个公倍数)。

#include<iostream>

usingnamespacestd;

MaxCommonDevisor(intn,intm){

inti;

for(i=n;i>=l;i-)

if(n%i==0&&m%i=0)break;

returni;

MinCommonMultiple(intn,intm){

inti;

fbr(i=n;iv=n*m;i++)

if(i%n==0&&i%m==0)break;

returni;

intmain(){

inti,j;

cout«”请输入两个整数:"vvendl;

cin»i»j;

cout«"最大公约数:"〈〈MaxCommonDevisor(i,j)

«Af<<"最小公倍数:”<vMinCommonMultiple(i,j)v<endl;

return0;

3.5设计函数digit(num,k),返回整数num从右边开始的第k位数字的值。例如:

digit(4647,3)=6

digit(23523,7)=0

解:把整数转换为数串,放在一个整型数组中。

#include<iostream>

usingnamespacestd;

digit(intnum,intk){

ints[10]={0,0,0,0,0,0,0,0,0,0};

第三章函数习题7

inti=0;

do{〃先把整数转换为数字串

s[i]=num%10;

num/=10;

i++;

}while(num>0);

if(k<=i)returns[k-l];〃题目中位数的下标从1开始,而数组下标从0开始

elsereturn0;

)

intmain(){

cout«ndigit(4647,3)=n«digit(4647,3)«endl;

cout«ndigit(23523J)=H«digit(23523,7)«endl;

return0;

3.6设计函数factors(num,k),返回整数num中包含因子k的个数,如果没有该因子,

则返回0。

解:必须先判断整数m能否被k整除。

#include<iostream>

usingnamespacestd;

factors(intnum,血{〃缺省返回值为整型

intcount=0;

while(num%k==0){

count++;

num/=k;

)

returncount;

)

intmain(){

cout«"factors(l875,5)="«factors(1875,5)«endl;

cout«nfactors(64,3)-n<<factors(64,3)«endl;

return0;

3.7歌德巴赫猜想指出:任何一个充分大的偶数都可以表示为两个素数之和。例如:

4=2+26=3+38=3+5........50=3+47

将4.50之间的所有偶数用两个素数之和表示。判断一个整数是否为素数用函数完

成。

解:用prime。函数判断是否素数,用穷举法。歌德巴赫猜想验证也用穷举法,在所

有组合中找两个数均为素数者。

#include<iostream>

#include<cmath>

usingnamespacestd;

boolprime(intm){

if(m==l||m==0)returnfalse;

第三章函数习题8

if(m==2)returntrue;

intk=(int)sqrt(m);

for(inti=2;i<=k;i++)〃穷举法

if(m%i==O)break;

if(i>k)returntrue;

elsereturnfalse;

)

intmain(){

fdr(intn=4;n<=50;n+=2){

fbr(inti=2;i<=n/2;i++)

if(prime(i)&&prime(n-i))cout<<n<<=<vi<<,+V<n・i<<endl;〃歹!J出所有可能组合

)

return0;

3.8设计函数打印直方图,直方图宽度为3行,每列代表数据1%。如下面的图形表

不10%。

|**********

I

解:为简单将a%用a表示。

#include<iostream>

usingnamespacestd;

voidPrintDiagram(intm){

inti;

cout«T«endl;

for(i=0;i<3;i++){

cout«T;

for(intj=O;j<m;j++)cout«,*1;

cout«endl;

)

cout«T«endl;

)

int

温馨提示

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

评论

0/150

提交评论