好文档 - 专业文书写作范文服务资料分享网站

C程序设计4(谭浩强)完整版-课后习题答案

天下 分享 时间: 加入收藏 我要投稿 点赞

C程序设计(第四版)(谭浩强)第一章课后习题答案

P006 1.1 向屏幕输出文字.

#include //预编译. 代码均调试成功,若有失误大多不是代码问题.自已找找. int main() { }

printf(\);

return 0; //与int main对应,为了程序可移植性,建议全用int main + return 0;.

P008 1.2 求两个数的和.

#include int main() { }

int a,b,sum; a=5; b=4; sum=a+b;

printf(\,sum); return 0;

P008 1.3 调用函数比较两个数的大小.

#include int main() {

int max(int x,int y); //被调用函数在主函数后面,用前先声明. int a,b,c;

scanf(\,&a,&b); //输入时要按格式来,此处的逗号,用空格会发生错误. c=max(a,b); //a,b作为实参传入被调用函数中. printf(\,c); return 0;

}

int max(int x,int y) //定义了两个形参. { }

int z; //z属于局部变量,可与主函数中相同名字. if (x>y)

z=x; z=y; else

return(z); //z作为整个程序的出口值,赋给主函数中的c.

P015 0.6 三个数的大小.(数字0表示课后练习题)

#include int main() { }

int max(int x , int y , int z) { }

int m;

if (x>y && x>z) //求三者之大的一种方法.

m=x; m=y; m=z; if (y>x && y>z) if (z>y && z>x)

return (m); //返回值m给主函数中的d. int a,b,c,d; //d是用于存储最大值的.

int max(int x , int y , int z); //测试可知,在VS2008中,可以不预先声明. printf(\); scanf(\,&a,&b,&c);

printf(\,d); // d可以换成max(a,b,c).

d=max(a,b,c); //调用函数中有三个形参,这里需要传入三个实参,才可运算.

C程序设计(第四版)(谭浩强)第2章课

后习题答案 算法——程序的灵魂

P017 2.1 计算机1-5相乘的积. #include int main() { }

#include //作出要求:换成1到11间奇数相乘. int main() { }

int i,s=1; //在执行数值操作前一定要先有个初值.

for(i=1;i<12;i++) //这里是到,但题目要求的是取单数.也可以是i=i+2 { }

printf(\,s); return 0;

if(i%2!=0) //i对取模,值为非为奇数;为则为偶数.

s=s*i;

continue; //跳过这个for循环的这一次,执行下一次. else

int i,s=1; //在执行数值操作前一定要先有个初值. for(i=1;i<6;i++) //这里是到6. { }

printf(\,s); return 0;

s=s*i; //相乘

P019 2.2 按要求输出80分以上的学生信息.

暂时没法做.

P019 2.3 判断2000-2500年中的闰年,并输出. 年的概念是地球围绕太阳一周的时间(所谓公转周期)称为一年,这个周期是相当稳定的,很长时间也不会变动1秒,但是真正的一年是365.2423天(目前)。所以,如果每年定义为365天的话,1年就会多出0.2423天,4年就会多出0.9692天,非常接近1天,这样闰年就出现了,也就是每4年要有1年设置为366天,来抵消这多出的1天。规则为:·1)如果年份能被4整除,则该年计为闰年;可是,假如不做调整的话,当400年的时候,累计才多出96.92天,接近于多出97天,闰年的设置却多出来100天,所以要在400年内,再撤销3个闰年。怎么撤销呢?就有了下面这个规则:·2)如果年份能被100整除,则不计为闰年;问题又来了,400年里有4个100年吧,去掉后四个100年后,又少了一个,所以再加一个规则就是:·3)如果年份能被400整除,则计为闰年。简单说来每400年里设置了97个闰年,也就是400里的前3个100年不设置闰年,误差被调整到400年仅有0.08天。 #include int main() { }

int i;

for(i=2000;i<=2200;i++) { }

if((i%4==0 && i0!=0)||i@0==0) //闰年的经典判断条件.

printf(\,i); printf(\,i); else

P020 2.4 求(1)-(1/2)+(1/3)……+(1/99)-(1/100)的值. #include int main() { }

float sign=1 , sum=0 , deno , term ; //关于有小数的计算应该用float. for (deno=1;deno<=100;deno++) { }

printf(\指定值) is %f .\\n\,sum); return 0; //若是到100的话,结果为0.68172

term=sign*(1/deno); //term临时值,sing符号,deno为分母. sum=sum+term; //第一次总全存储. sign=(-1)*sign; //换号.

P021 2.5 得到一个大于3的数,并判断是否为素数.

#include int main() {

}

int i , num ,n ; //像13,37,这样只能让和它本身除以外,没有其它除数的叫素数. printf(\); //获取一个数值 scanf(\,&num);

for(i=2;i

if(n==0) //单出口问题,虽然n=0执行多次,但仍然是n=0,这样才会只输出一次. { } else { }

return 0;

printf(\);

printf(\); //如果是100-200可以加个”%d”,nmu进去. if(num%i==0) //除得尽,则不是. { }

n=0; //按程序走的话,这里会执行多次,不能用printf语句,会输出多次.

n=1;

break; //设置跳出,才不会执行多次.

2.6-2.10要求用流程图表示上列算法.

2.11-2.16要求用N-S图表示上列算法.

… … … … 还要伪代码

P036 0.1 调换二个参数的值.

#include int main() {

char a='a',b='b',c; c=a; a=b; b=c;

}

printf(\,a,b); return 0;

P036 0.2 输入10个数,并输出最大的那一个数.

#include int main() { }

int i,a[10],s=0 ;

printf(\); for(i=0;i<=9;i++) { }

for(i=0;i<=9;i++) { }

printf(\,s); return 0;

if (s

P036 0.3 按大小顺序输出一些数.

#include int main() {

int i , j , a[4] , s=0 ;

printf(\); //此处要回车. for (i=0 ; i<=4 ; i++) { }

for (i=0 ; i<=3 ; i++) //双重循环,先一个外循,再轮所有小循,轮完后再下一个大循. { {

if (a[i]>a[j]) //如果成立,则对换,小于号表示降序排列,大于号表示升序排列. {

s=a[i];

for (j=i+1 ; j<=4 ; j++) //第一个循环是至n-1,第二个循环是到n. scanf(\,&a[i]); //这是取多个数的代码,可以用while控制取到\\n符为止.

}

} }

}

a[i]=a[j]; a[j]=s;

for (i=0 ; i<=4 ; i++) //重新定义循环输出数组中新排列的数.

printf(\,a[i]); return 0;

P036 0.4 求1至100的总合. #include int main() { }

int i , sum=0 ; //这是一个简单的程序. for (i=0 ; i<101 ; i++)

sum=sum+i;

printf(\,sum); return 0;

P036 0.5 判断一个数能否同时被3和5整除. #include int main() { }

int n ;

printf(\); scanf(\,&n);

if(n%3==0&&n%5==0) //关键句,用\并\的符号.

printf (\); printf (\); else return 0;

P036 0.6 输出100-200间的素数. //********************第一种方法.

#include //网络版本,采用调用函数和求根取素.

#include //下面用到sqrt,所以需要包含数据函数.sqrt是求根,属数学函数.

int main() //学会一个程序采用”主函数+被调用函数”的方式,会比较规范. { }

int prime_number(double m) //m是形参. {

int j,k;

k=(int)sqrt(m); //求根,(int)是强制转换,求根里要是浮点型. for(j=2;j<=k;j++) {

if(m%j==0)

return 0; //此值返回给主函数中的实参.

int i;

for (i=100; i<=200; i++) //为了书写规范,最好加上{},以示清范围.

if(prime_number(i) == 1) //i是实参.

printf(\,i);

return 0;

}

}

return 1;

//********************第二种方法. #include #include

int main() { }

int prime(int j) //j是形参,用于接收实参i给的值. {

int m, n; m=(int)sqrt(j); for (n=2;n<=m;n++) {

if(j%n==0) int i;

for(i=100;i<=200;i++) //指定至间. { }

return 0;

if(prime(i)==1) //这里i为实参,传入形参j中进行运算,然后再由形参j带出返回.

printf (\,i);

}

}

return 0; //返回值,0为不是素数,1是素数.

return 1;

//********************第二种方法. 请仿照2.5来写.

P036 0.7 最大公约数和最小公倍数. #include //最大公约数用累除法,除到无余数时的被除数是最大公约数. main () { }

int gcd(int x, int y) //最大公约数Greatest Common Divisor { }

int lcm(int x, int y) //最小公倍数Lowest Common Multiple {

int i, temp;

if(x

temp=x; x=y; y=temp; int temp; while(x%y!=0) { }

return y; //这是每一轮中的被除数,按原理来,这就是最大公约数,即累除法的原理.

temp=y; //y在下一轮中作为除数,即是下一轮中的X,所以先闪一边去. y=x%y; //x,y的余数作为下一轮中的Y,由x%y来取得.

x=temp; //刚才temp中存储了y的值,现在拿出来作为下一轮中的X使用. int m, n, c, d;

int gcd(); //这是最大公约数的缩写,此处调用函数,可以不写里面的实参. int lcm(); //这是最小公倍数的缩写,此处调用函数,可以不写里面的实参. printf(\); scanf(\,&m,&n);

c=gcd(m,n); //c获取最大公约数 d=lcm(m,n); //d获取最小公倍数

printf(\, m, n, c); printf(\, m, n, d); return 0;

}

for(i=1; i<=y; i++) //设定一个区间,从1至小的数之间的循环. { }

if(!((x*i)%y)) //除得尽为零,非零为真,则成立并返回.

{ //如此往复,直到取模无余数,那么小的数X乘以区间当前的I值,就是最小公倍数. }

return x*i;

最简单的C程序设计——顺序程序设计

P037 3.1 把华氏温度转化为摄氏表示法. #include

float F_to_C(float input_fah) //代表华转摄,input_fah是局部变量. { }

float C_to_F(float input_cen) { }

int main() {

int choice;

float input_fah,input_cen,output_fah,output_cen; //局部变量的调用及参数传递. printf(\); scanf(\,&choice); if(choice==1) { }

if(choice==2) {

printf(\);

scanf(\,&input_fah); //这个是主函数定义的变量,虽然和调用函数同名. output_cen=F_to_C(input_fah);

printf(\华氏 is %d , 摄氏 is %d .\,(int)input_fah,(int)output_cen); float output_fah;

output_fah=(9.0/5)*input_cen+32; //转换过程. return output_fah; float output_cen;

//这里也是局部变量.

output_cen=(5.0/9)*(input_fah-32); //函数的功能体.

return output_cen; //返回值,注意,返回值的数据类型应该和函数一致.

}

}

printf(\); scanf(\,&input_cen); output_fah=C_to_F(input_cen);

printf(\

%d .\,(int)input_cen,(int)output_fah);

return 0;

P038 3.2 计算存款利息(关于精度问题).

#include

int main() { }

float p0=1000,r1=0.0036,r2=0.0225,r3=0.0198,p1,p2,p3; p1=p0*(1+r1); p2=p0*(1+r2);

p3=p0*(1+r3/2)*(1+r3/2);

printf(\,p1,p2,p3); return 0;

P055 3.3 大写转换成小写

#include

int main() //小写范围是97-122,大写范围是65-90,大写加上即得小写.26个字母. { }

char c1, c2; c1='A'; c2=c1+32;

printf(\,c2,c2); return 0;

P059 3.4 给出三角形边长,算出面积.

#include #include

int main() { }

double a=3.67, b=5.43, c=6.21, s, area; s=(a+b+c)/2;

area=sqrt(s*(s-a)*(s-b)*(s-c));

printf(\,area); //默认可以组成三角形. return 0;

P065 3.5 求一无二次等式的根,默认两个不同根. #include #include

int main() { }

double a,b,c,disc,x1,x2,p,q; scanf(\,&a,&b,&c); disc=b*b-4*a*c; p=-b/(2.0*a);

q=sqrt(disc)/(2.0*a); x1=p+q; x2=p-q;

printf(\,x1,x2); return 0;

P071 3.6 用%f输出实数,只能得到六位小数.

#include #include

int main() { }

double a=1.0; //1是整型,1.0是浮点型,默认是double.可以是float. printf(\,a/3); return 0;

P072 3.7 float型数据的有效位数. #include #include

int main() { }

float a; //输出的结果是.333252,float精度6位,所以第七位后不可信. a=10000/3.0; printf(\,a); return 0;

P078 3.8 使用putchar函数输出.

#include #include

int main() { }

char a='B',b='O',c='Y'; putchar(a); putchar(b); putchar(c); putchar('\\n');

putchar(101); //101是A的ASCII代码的缩写,因为此函数只能输出字符. putchar(66); return 0;

P079 3.9 使用getchar得到字符. #include #include

int main() {

char a,b,c; a=getchar(); b=getchar();

}

c=getchar(); putchar(a); putchar(b);

putchar(c); //这也是基本回显的C程序代码. putchar('\\n'); return 0;

P081 3.10 getchar得到大写,putchar输出小写.

#include #include

int main() { }

char a,b; a=getchar(); b=a+32; putchar(b); putchar('\\n'); return 0;

P082 0.1 国民生产总值10年后的增长倍数.

#include #include

int main() { }

double p,r=0.09,n=10;

p=pow((1+r),n); //这是数学函数, pow(x,y)计算x的y次方. printf(\,p); return 0; //结果是0.36倍.

P082 0.2 求各种存款的利息数. #include

#include

int main() { }

double p,r,n; //年份和当年利率均有给出. p=1000*(1+5*0.0585);

printf(\,p); //1292.5,这是全五年期.lf输出的是double型. p=(1000*(1+2*0.0468)); p=(p*(1+3*0.0540));

printf(\,p); //1270.76,这是先二年,再三年的. p=(1000*(1+3*0.0540)); p=(p*(1+2*0.0468));

printf(\,p); //1270.76,这是先三年,再二年的.证明,是一样的. p=1000*pow((1+0.0414),5);

printf(\,p); //1224.86,这难道说是,相对的存死期越久越值钱.p=1000*pow((1+0.072/4),4*5);

printf(\,p); //1428.74. return 0;

P083 0.3 求几个月要以还贷. #include #include

int main() { }

double m,r=0.01,d=300000,p=6000; m=(log10(p/(p-d*r)))/(log10(1+r));

printf(\,m); //按要求只留一个小数,所以要写%.1lf. return 0;

P084 0.6 字母密码转换,调用函数及临界处理.

#include

char printcode(char f) {

if(((int)f>86&&(int)f<91)||((int)f>118&&(int)f<123)) {

}

}

return(f-26+4); //因为putchar会自动返回,所以改成return,因为这是在函数中,

调用需要返回值.

else { }

return(f+4);

int main() {

char a,b,c,d,e;

printf(\); a=getchar(); b=getchar(); c=getchar(); d=getchar();

e=getchar(); //临界问题.

printf(\,printcode(a),printcode(b),printcode(c),printcode(d),printcputchar(putcharcode(a)); putchar(putcharcode(b)); putchar(putcharcode(c)); putchar(putcharcode(d)); putchar(putcharcode(e));

return 0; //注意理解自定义函数的定义,使用,及形参实参的流向.

//p84的是计算问题,自己看着办,最后要求小数点后两位,用的是%.2lf 来实现,因为没有//p84的是定义问题,第一问,两者都行,但是定义字母时,scanf要写%c来获取,而定义数值// 第二问,putchar貌似只能输出字符,所以用printf.putchar本身就是

ode(e));

要求实部,所以m.n格式中m不写. 时则要用%d来获取.

字符输出函数啦,字符,有木有!!!字符啊!!尽管它的参数可以是putchar('\\101'),效果是输出字符A啊. }

// 第三问,出现\任何\及\无条件\那么答案明显是\否\可以转换,但要在某此条件下,例如输出和读入时,%c是字母,而%d是数值,看着办.

选择结构程序设计

P086 4.1 一无二次方程求根的二分支. #include #include

int main() { }

double a,b,c,disc,x1,x2,p,q; scanf(\,&a,&b,&c); disc=b*b-4*a*c;

if(disc<0) //这是选择结构和其判断条件的示例. {

p=-b/(2.0*a);

q=sqrt(disc)/(2.0*a); x1=p+q; x2=p-q;

printf(\,x1,x2); }

return 0;

printf(\); else

P087 4.2 二个数按大小输出.

#include

int main() //此程序代表按大小顺序输出. { }

float a,b,t;

scanf(\,&a,&b); //出错时,注意检查这里是否按格式输入了.比如有个逗号. if(a>b) { }

printf(\,a,b); return 0;

t=a; a=b; b=t;

P088 4.3 三个数按大小输出. #include

int main() //此程序代表按大小顺序输出. { }

float a,b,c,t;

scanf(\,&a,&b,&c); if(a>b) //此处执行后,a为小者. { }

if(a>c) //此处执行后,a为小者. { }

if(b>c) //上面已经搞定a是最小者,现在对比得出次小者,并且已经归到变量中. { }

printf(\,a,b,c); return 0;

t=b; b=c; c=t; t=a; a=c; c=t; t=a; a=b; b=t;

P099 4.4 判断输入字符,并最终按小写输出.

#include

int main() { }

char ch;

scanf(\,&ch);

ch=(ch>='A'&&ch<='Z')?(ch+32):ch; //条件运算符,真取前,假取后. printf(\,ch); return 0;

P100 4.5 按要求输出相应的Y值. #include

int main() { }

int x,y; scanf(\,&x); if(x>=0) { }

else //这个是x<0的范围. { }

printf(\,x,y); return 0;

y=-1;

if(x>0) //这个范围要基于x>=0来判断. { } else { }

y=0; y=1;

P102 4.6 switch的简单应用. #include

int main() {

char grade;

scanf(\,&grade); printf(\); switch(grade) {

case'a':printf(\);break; //当多分支结构过于多时,可以用switch来解决. case'b':printf(\);break; case'c':printf(\);break; case'd':printf(\);break;

default:printf(\); }

return 0;

}

P104 4.7 按输入执行操作,并且不分大小写. #include

void action1(int x,int y) { }

void action2(int x,int y) { }

int main() { }

char ch; int a=15,b=23; ch=getchar(); switch(ch) { case'a':

case'A':action1(a,b);break; //a,A共用一个执行语句. case'b':

case'B':action2(a,b);break;

default:putchar('\\a'); //'\\a'可以控制电脑发出蜂鸣声. }

return 0;

printf(\,x*y); printf(\,x+y);

P106 4.8 用if的分支来做闰年问题 #include

int main() {

int year,leap;

printf(\); scanf(\,&year);

}

if(year%4==0) //400年里,在100个可除尽4的年里计算,以下是在全范围内计算. { } else { } if(leap) { } else { }

printf(\); //不管上面如何判断,最后还是会输出这一句. return 0;

printf(\,year); printf(\,year); leap=0;

if(year0==0) //既是100个内的,又是可以除尽100的,算是且. { }

else //这里的范围是(year%4==0)&&(year0!=0) { }

leap=1; //在合法的100内,又不是2100,2200一类的,当然属闰年. if(year@0==0) //相当于且了两次,只余下唯一一个. { }

else //400年里只有1个除得尽,其它都不是. { }

leap=0; leap=1;

P108 4.9 一元二次等式的全计算过程. #include #include

int main() {

double a,b,c,disc,x1,x2,realpart,imagpart; scanf(\,&a,&b,&c);

}

printf(\);

if(fabs(a)<=1e-6) //fabs是绝对值, le-6,即是的负六次方,接近或是等于零. { } else { }

return 0;

disc=b*b-4*a*c;

if(fabs(disc)<=1e-6) //指数形式,数字1. { } else { }

if(disc>1e-6) { } else { }

realpart=-b/(2*a);

imagpart=sqrt(-disc)/(2*a); printf(\);

printf(\,realpart,imagpart); printf(\,realpart,imagpart); x1=(-b+sqrt(disc))/(2*a); x2=(-b-sqrt(disc))/(2*a);

printf(\,x1,x2); printf(\,-b/(2*a)); printf(\); printf(\,-c/b);

P109 4.10 关于多个区间的计算,运费问题为例. #include

int main() {

double p,w,s,d,f; printf(\);

scanf(\,&p,&w,&s);

}

if(s<250) { }

else if(s<500) { }

else if(s<1000) { }

else if(s<2000) { }

else if(s<3000) { } else { }

return 0;

d=0.15; f=p*w*s*(1-d); printf(\,f); d=0.1;

f=p*w*s*(1-d); printf(\,f); d=0.08; f=p*w*s*(1-d); printf(\,f); d=0.05; f=p*w*s*(1-d); printf(\,f); d=0.02; f=p*w*s*(1-d); printf(\,f); d=0.0;

f=p*w*s*(1-d); printf(\,f);

P0112 0.4 键盘输入三个数,输出最大者. #include

int mina,mida,maxa; int max(int a,int b,int c) { }

int main() {

int a,b,c;

printf(\); scanf(\,&a,&b,&c);

printf(\,max(a,b,c)); return 0; int m;

if(a>b) //凡是比较中,大于号代表升序排列. { } if(a>c) { } if(b>c) { }

return (c); //此排序后,a,b,c由小到大.所以c是返回中最大的.

m=a; a=c; c=m; m=a; a=c; c=m; m=a; a=b; b=m;

}

P0112 0.5 一个小于1000的数,有判定条件. #include #include

int main() {

double a,b;

printf(\);

}

scanf(\,&a); if(a<1000) { } else { }

printf(\,b); //按要求,只取整数. return 0;

printf(\); //控制蜂鸣声

printf(\); scanf(\,&a);11 b=sqrt(a); b=sqrt(a);

P0112 0.9 一个不多于5位的数,按条件输出.

#include #include

int main() {

int i,a,b[4],count=0;

printf(\); //意思是五位数以内. scanf(\,&a); for(i=0;i<=4;i++) { }

printf(\位数.\\n\,count);

printf(\分别输出每一位数字,如下:\); for(i=4;i>=0;i--) { }

printf(\);

printf(\倒序输出这一个数字,如下:\);

printf(\,b[i]);

b[i]=a; //是,不是/10000,结果就是b[0]至b[4]中存着个,十,百,千,万位. a=a/10; // /10后得到的结果去掉了个数. if(b[i]!=0) { }

count=count+1;

for(i=0;i<=4;i++) { }

printf(\); return 0;

printf(\,b[i]);

}

P0112 0.10 按要求提成奖金(if写法). #include

int main() {

double a,b;

printf(\); scanf(\,&a);

if(a<=10) //这个是整个if 的基础. { }

else if(a<=20) //以上面为基础,这已经代表了10-20间了!!! { }

else if(a<=40) //同理,这是20-40间. { }

else if(a<=60) { }

else if(a<=100) { }

else //这里是大于100的. { }

printf(\,b); return 0;

b=1+0.75+0.1+0.06+(a-100)*0.01; b=1+0.75+0.1+0.06+(a-60)*0.15; b=1+0.75+0.1+(a-40)*0.03; b=1+0.75+(a-20)*0.05; b=1+(a-10)*0.075; b=a*0.1;

}

P0112 0.10 按要求提成奖金(switch写法). #include

double GetProfit(double c) { }

int main() {

double a; char c;

printf(\scanf(\,&c); //不同档时,应照档的规定数值进行输入,否则结果不会是正确的. switch(c) //前三后三用于比较调用函数. {

//GetProfit(c)引入的实参没有意义,返回值和引入的实参没关系,反而由键盘获得.

case'A':{ printf(\,GetProfit(c)*0.1);};break; case'B':{ printf(\,1+(GetProfit(c)-10)*0.075);}break; case'C':{ printf(\,1+0.75+(GetProfit(c)-20)*0.05);}break; case'D':{printf(\);scanf(\,&a);printf(\

printf(\); scanf(\,&c);

return (c); //返回本身了,如果有进一步的计算结果,将值赋给其它变量,也可以返回.

60-100 ;\\nF : 100-1000 ;\\n\);

//0-10 0.100 //10-20 0.075 //20-40 0.050

reward is %lf !\\n\,1+0.75+0.1+(a-40)*0.03);}break; //40-60 0.030

case'E':{printf(\);scanf(\,&a);printf(\

reward is %lf !\\n\,1+0.75+0.1+0.6+(a-60)*0.15);}break; //60-100 0.015

case'F':{printf(\);scanf(\,&a);printf(\

reward is %lf !\\n\,1+0.75+0.1+0.6+0.6+(a-100)*0.01);}break; //100-1000 0.010

default:printf(\);break; //可以有一个执行体,用{}包括起来. }

return 0;

}

P0112 0.11 键盘输入数值,然后排序输出. #include

int main() { }

int a[10],i,j,m,n; //变量可以在写代码过程中再回来临时添加. printf(\请输入数值的个数: (十个以内)\);

scanf(\,&m); //到这里需要变量来承载数值的个数,设m,回头去定义变量那写上m. printf(\请分别输入相对应个数的数值:\); for(i=0;i

for(i=0;i

for(i=0;i

return 0;

printf(\,a[i]); for(j=i+1;j

if(a[i]>a[j]) //这是选择排序法.升序. { }

n=a[i]; //这里需要一个用于临时变量的n,所以回头去写上. a[i]=a[j]; a[j]=n;

scanf(\,&a[i]);

C程序设计(第四版)(谭浩强)第五章课后习

题答案

循环结构程序设计

P115 5.1 用while计算1至100的合. #include

int main() { }

int i=1,sum=0;

while(i<=100) //对于需要运算的值,要么在运算前可以赋值,要么一开始要指定. { }

printf(\,sum); return 0;

sum=sum+i; i++;

P117 5.2 用do-while来做1至100的合.

#include

int main() { }

int i=1,sum=0;

do // do-while可以做的事,用while都可以做到.

{ //do-while先做一次执行,再判断条件,而while却是先做一个条件,再执行.

sum=sum+i; i++;

}while(i<=100);

printf(\,sum); return 0;

P118 5.3 比较do-while与while的差别. #include

int main() {

int i,sum=0;

printf(\);

scanf(\,&i); //输入10以内,正常,11的话,则sum仍然是0. while(i<=10) {

}

}

sum=sum+i; i++;

printf(\,sum); return 0;

#include

int main() { }

int i,sum=0;

printf(\);

scanf(\,&i); //输入10以内,结果一样.输入11的话,先做操作,所以sum=11. do {

sum=sum+i; i++;

}while(i<=10); //此重点在于理解二者的差别. printf(\,sum); return 0;

P126 5.4 break的例子.

#include

int main() {

int i,b=0,a,c; for(i=0;i<=1000;i++) { } c=b/i;

printf(\,i+1,c); //注意%号后的形式,否则可能输出错误. return 0;

printf(\); //循环体内套有输出语句以及跳出语句. scanf(\,&a); b=b+a; if(b>=100) { }

break; //break是用于跳出循环,对if无效,对while for switch 这一类.

}

P127 5.5 continue的例子. #include

int main() { }

int i;

for(i=1;i<20;i++) { }

printf(\); return 0;

if(i%3!=0) { }

printf(\,i);

continue; //跳过本次I,执行下一个i.

P128 5.6 形成一个4*5的矩阵.

#include

int main() {

int i,j,a=0; //没有给初值,会出现警告: 使用了未初始化的局部变量“a” . for(i=1;i<=4;i++) {

for(j=1;j<=5;j++,a++) // a用来控制换行. { }

if(a%5==0) { }

printf(\,i*j);

printf(\);

}

printf(\); return 0;

}

P131 5.7 用一个交错的式子求哌的近似值. #include #include

int main() //四分之哌等于(1)-(1/3)+(1/5)-(1/7)+(1/9)-(1/11). { }

//下面这段小代码用来验证关于数值型数据类型的关系.去掉注释,可运行.

//如果出现类似值为全1或是全零的话,一般可以考虑数据类型赋值或是定义错了的问题. //#include //这是关于int float double三者关复杂关系的,乱啊,如果看不懂,可以通过实验自己明白来. //

//int main() //在C语言中,1.0认为是实数,即是double型,所以,如果你把它用float输出的话,会有警告:警告 1 //{

// float m,a,b,c; //一旦定义了是这种类型的话,输出或是赋值的时候只能扩展不能截断,意思就是能变成double型,不能变成int型啦.而且后面的赋值会跟着它变成相应的类型.比如下面的m=1,其实得到的是m=1.0. // int d,e,f; // m=1; // a=1.0/3; // b=1/3; // c=m/3; // d=1.0; // e=1/4;

warning C4305: “=”: 从“double”到“float”截断

.

float s=1,n=1,m,sum=0,t;

for(m=1;;m=m+2) //不确定哪项才会小于等于十的负六次方,所以不指定,无限下去. { //不指定第二项,执行语句中应该有控制跳出的句子,否则死循环. }

printf(\四分之一哌的值是%f.\\n\,sum); printf(\一个完整哌的值是%f.\\n\,sum*4); return 0;

t=(s)*(n/m); //这是第一项,s是符号,

if(fabs(t)<=1e-6) //应该写在这里,题目要求这一项不累加进去. { }

sum=sum+t; //因为累加项在这里,所以,一旦跳出就不会累加进来了. s=s*(-1); //变号一次.

break;

// f=1.0/4;

// printf(\用double的%lf来输出是可以的.)\\n%f\\n%f\\n%f\\n\不管上面定义什么,这边写的输出类型是什么,就按相应的类型输出,有可能会出错,所以建议按定义的类型来输出.当然扩展的是不会错的,截断的是会错的,比如float可以用%lf来输出,而不能用%d来输出.

// printf(\但是,不相应的int型不可以用%f来输出的.因为int float就不同种类,一个是整数,一个是小数,float double同样是有小数点的!!!! // return 0; //}

P133 5.8 著名的Fibonacci(费波那契数列问题) #include

int main() //这个就是著名的Fibonacci(费波那契数列问题) {

int f1=1,f2=1,f3,i;

printf(\,f1,f2);

for(i=1;i<=38;i++) //注意,这是个基础问题,(i=1;i<=5;i++)这里其实进行了次运算,

因为有f1,f2,要求有个,所以要有个.要么写<=38,要么写<39,边界问题一定要注意,不可以太随意!!!! }

{ }

return 0;

f3=f1+f2;

printf(\,f3); //这个问题同样适用于\一对兔子一个月生一对\的问题., f1=f2; //f1=f1+f2;此时它们各是,所以,现在的f1是.

f2=f3; //f2=f2+f1;此时的f1已经是最先二者之和了.可以不用到f3.

P135 5.9 还是求素数,方法不一样. #include #include

int main() {

double num; int i;

printf(\);

scanf(\,&num); //因为sqrt要求是浮点型,那就给它浮点型,需要时再强制转换.

}

for(i=2;i<=sqrt(num);i++) //这边是<=号没错. {

if((int)num%i==0) //如果在这期间有任何一个可以为零的话,则不是素数. {

break; //当然跳出. }

} //执行到这里的时候,i=5,已经变成了!! if(i<=sqrt(num)) { }

else //如上所述,i=5,超出了求根的值,所以是素数. {

printf(\,(int)num); } return 0;

printf(\,(int)num);

P137 5.10 求100至200间的素数.

#include //不解释,HOHO>>>>... #include

int main() {

double j; int i,k=0;

for(j=100;j<=200;j++) {

for(i=2;i<=sqrt(j);i++) { }

k=k+1; //这里是布局的开头.学习一下,有助逻辑. if(i<=sqrt(j)) {

printf(\,(int)j); if(k%5==0) //5个换一次行. {

printf(\); if((int)j%i==0) {

break; }

}

}

}

}

else { }

printf(\,(int)j); if(k%5==0) { }

printf(\);

return 0;

P139 5.11 密码转换.

#include

int main() { }

char c; c=getchar();

while(c!='\\n') //这也可以用数组来实现. { }

printf(\); //这是布局问题. return 0;

if((c>='a'&&c<='z')||(c>='A'&&c<='Z')) { }

if((c>='w'&&c<='z')||(c>='W'&&c<='Z')) { } else { }

printf(\,c);

c=getchar(); //套在循环里,依次得到字母,而while中判断回车为结束.

c=c+4; c=c-22;

P140 0.3 最大公约数和最小公倍数. #include //最大公约数用累除法,除到无余数时的被除数是最大公约数. main () { }

int gcd(int x, int y) //最大公约数Greatest Common Divisor { }

int lcm(int x, int y) //最小公倍数Lowest Common Multiple { }

int i, temp;

if(x

for(i=1; i<=y; i++) //设定一个区间,从1至大的数之间的循环. { }

if(!((x*i)%y)) //此式子如有余数,加上\号,会是假,则不返回,进行下一轮. { //如此往复,直到取模无余数,那么小的数X乘以区间当前的I值,就是最小公倍数. }

return x*i; temp=x; x=y; y=temp; int temp; while(x%y!=0) { }

return y; //这是每一轮中的被除数,按原理来,这就是最大公约数,即累除法的原理.

temp=y; //y在下一轮中作为除数,即是下一轮中的X,所以先闪一边去. y=x%y; //x,y的余数作为下一轮中的Y,由x%y来取得.

x=temp; //刚才temp中存储了y的值,现在拿出来作为下一轮中的X使用. int m, n, c, d;

int gcd(); //这是最大公约数的缩写,此处调用函数,可以不写里面的实参. int lcm(); //这是最小公倍数的缩写,此处调用函数,可以不写里面的实参. printf(\); scanf(\,&m,&n);

c=gcd(m,n); //c获取最大公约数 d=lcm(m,n); //d获取最小公倍数

printf(\, m, n, c); printf(\, m, n, d); return 0;

P140 0.4 判断一串输入的字符.

#include

int main() {

char ch;

int a=0,b=0,c=0,d=0,e=0;

printf(\); while((ch=getchar())!='\\n') //直到回车. { }

printf(\大写%d 小写%d 空格%d 数字%d 其它%d\\n\,a,b,c,d,e);

if(ch<='z'&&ch>='a') { }

else if(ch==' ') { }

else if(ch<58&&ch>47) { }

else if(ch<='Z'&&ch>='A') { } else { }

e++; b++; d++; c++; a++;

}

P140 0.5 2+22+222+2222系列的和.

#include //不理解时可以百度或是谷歌更多的信息.

int main() //想办法既快速做完,又要消化理解!!!

{ }

int temp,i,a,n,sum=0; //主逻辑,友好性暂时放松. scanf(\,&a,&n); //a是数字,n是要乘的个数. temp=a; //先把第一阶的值存起来. for(i=0;i

printf(\,sum); return 0;

sum=sum+a;

printf(\,a); //事关布局.

a=a*10+temp; //重点是每次乘,然后加上上一个数.

P140 0.6 1!+2!+3!+4!.....的值.

#include

int main() //1!+2!+3!+4!..... { }

int i,j,k,sum=0,m=1;

scanf(\,&k); //比如设定为,值为. for(i=1;i<=k;i++) //第一层循环,指定到. { }

printf(\,sum); //完全不理解时,搜索并参考.

return 0; //尝试自己做,第一次做出来就是自己的东西了.

for(j=1;j<=i;j++) //第二层循环,指定至当前数. {

m=m*j;

} //到此是阶乘的结构. sum=sum+m; m=1;

P140 0.7 1至100,1至50平方,1至10倒数的总和. #include

int main() {

}

int a,b;

double c,asum=0,bsum=0,csum=0;

for(a=1;a<=100;a++) //三个块分别注释验证结果. { }

for(b=1;b<=50;b++) //在VS运行中,注意*.cpp为C++语言. { }

for(c=1;c<=10;c++) //c作浮点运算,所以定义在double类型中. { }

printf(\,asum+bsum+csum); return 0;

csum=csum+1/c;

bsum=bsum+b*b; //为了避免语言差别,请注意文件名为*.c. asum=asum+a;

P P

#include #include

int main() { }

int j,k,s[6],x=100,y,sum=0; for(j=153;j<=154;j++) { }

return 0;

for(k=2;k>=0;k--) { }

printf(\,sum);

s[k]=j%(int)pow(10,k+1)/(int)pow(10,k); y=pow(s[k],3); sum+=y;

printf(\,k,s[k],j);

P140 0.8 水仙花数. //#include //一步步的发现问题. //

//int main() //在%和/号之间,以前pow.以后再做. //{

// int i,j,k,a,b,c,sum=0; //这里逻辑对,算出来却错了. // for(i=2;i<=4;i++) //计算机在想什么,看来它的大脑难以模拟. // { // // // // // // // // // // // // // }

// return 0;

//} //为什么还是无法实现?! #include #include

int main() { }

int a,b,c,i,sum=0; //这里只计算三位数的. for(i=100;i<1000;i++) { }

return 0;

a=i/100; b=i0/10; c=i;

sum+=a*a*a+b*b*b+c*c*c; if(sum==i) { } sum=0;

printf(\是水仙花数.\\n\,i);

for(j=pow(10,i);j<=pow(10,i+1)-1;j++) //我不完全明白它遵守的逻辑. { }

for(k=0;k<=i;k++) { }

if(sum==j) { } sum=0;

printf(\是水仙花数!\\n\

sum+=pow((j%pow(10,i+1)/pow(10,i)),3);

P141 0.9 完数.

#include

int main() { }

int i,j,r;

for(i=1;i<=1000;i++) //零是个临界值,不能包括它. { }

return 0;

r=0; //每次清零重来.类似水仙中的sum. for(j=1;j

if(r==i) //若相等. { }

printf(\是完数.\\n\,i); if(i%j==0) //除得尽即是因子. { }

r=r+j; //然后累加进去.

P141 0.10 2/1+3/2+5/3+8/5+13/8… #include

int main() //10.007051 { }

double i,a=2,b=1,c,s=0; //a是分子,b是分母. for(i=0;i<6;i++) //二十可以用户指定. { }

printf(\,s); return 0;

s+=a/b; //中间储值变量. c=a+b; b=a; a=c;

P141 0.11 球落地并反弹问题. #include

int main() //从一百开始,减一半再自加两次,下降一次,反弹一次. { }

double sum=100,high=100,up,donw,i;

for(i=1;i<10;i++) //不管指定到哪个数,都不会超过三百. { }

printf(\,donw,sum); return 0;

up=high/2; donw=up;

high=donw; //自咬尾巴问题. sum+=donw*2;

P141 0.12 猴子吃桃子.

#include

int main() //从一百开始,减一半再自加两次,下降一次,反弹一次. { }

int i,sum=1;

for(i=1;i<=10;i++) //临界要清楚,结果要与手算的前几个实例相匹配. { }

//printf(\return 0;

printf(\倒数第%d天还剩有%d个桃子.\\n\,i,sum); sum=(sum+1)*2;

P141 0.16 输出星号棱形图案. #include #include

main() //只关注左半部分.右半部分无视空格.

{

int i,j,k,m=6; //m可指定,指定中心点位置.可任意奇偶. for(i=1;i<=m;i++) //上半部分.其实也是正三角. {

for(j=1;j<=m-i;j++) //一到中心点前i个位置填充空格. printf(\);

for(k=1;k<2*i;k++) //空格后向前填充星号的个数.是奇数.一,三,五... printf(\); printf(\); }

for(i=m-1;i>0;i--) //下半部分.其实也是倒三角. { //减一是因为行数问题.这是中心行以下的. for(j=m-1;j>=i;j--) printf(\); for(k=1;k<2*i;k++) printf(\); printf(\); }

getch(); //用户反应后结束.但,没必要. }

第六章

第六章 循环控制

6.1输入两个正整数m和n,求其最大公约数和最小公倍数。 main()

{long m,n,i=1,j,s;

scanf(\ for(;i<=m&&i<=n;i++)

{if(m%i==0&&n%i==0) s=i;} if(m>=n) j=m; else j=n;

for(;!(j%m==0&&j%n==0);j++); printf(\ }

6.2输入一行字符,分别统计出其中英文字母、空格、数字和其他字符的个数。 #include\ main()

{char c;int i=0,j=0,k=0,l=0; while((c=getchar())!=’\\n’)

{if(c>=65&&c<=90||c>=97&&c<=122) i++; else if(c>=48&&c<=57) j++; else if(c==32) k++; else l++;}

printf(\ }

6.3求Sn=a+aa+aaa+…+aa…aaa(有n个a)之值,其中a是一个数字。例如:2+22+222+2222+22222(n=5),n由键盘输入。 #include\ main()

{int n,sum=0,i=1,s=2; scanf(\ while(i<=n)

{sum=sum+s;s=s+2*pow(10,i); i++;}

printf(\ }

6.4 求 ,(即求1!+2!+3!+4!+5!+…+20!) main()

{int n,i=1;long sum=0,s=1; scanf(\

while(i<=n) {s=s*i;sum=sum+s;i++;} printf(\ }

6.5 求 main()

{double i=1,j=1,k=1,s1=0,s2=0,s3=0,sum; for(;i<=100;i++) s1=s1+i; for(;j<=50;j++) s2=s2+j*j; for(;k<=10;k++) s3=s3+1/k; sum=s1+s2+s3;

printf(\ }

6.6打印出所有\水仙花数\,所谓\水仙花数\是指一个三位数,其各位数字立方和等于该本身。例如:153是一个水仙花数,因为153=1^3+5^3+3^3。 #include\ main()

{int x=100,a,b,c;

while(x>=100&&x<1000) {a=0.01*x;b=10*(0.01*x-a);c=x-100*a-10*b; if(x==(pow(a,3)+pow(b,3)+pow(c,3))) printf(\ }

6.7一个数如果恰好等于它的因子之和,这个数就称为\完数\。例如,6的因子为1、2、3,而6=1+2+3,因此6是\完数\。编程序找出1000之内的所有完数,并按下面格式输出其因

子:

6 its factors are 1、2、3 main() {int m,i,j,s;

for(m=6;m<10000;m++) {s=1;

for(i=2;i

{printf(\ printf(\ } }

或 main() {int m,i,j,s;

for(m=6;m<1000;m++) {s=m-1;

for(i=2;i

{printf(\ printf(\ } }

6.8有一分数序列:

求出这个数列的前20项之和。 main()

{int i=1,n;double t,x=1,y=2,s,sum=0; scanf(\

while(i<=n) {s=y/x;sum=sum+s;t=y;y=y+x;x=t;i++;} printf(\ }

6.9一球从100米高度自由下落,每次落地后返回原高度的一半,再落下。求它在第10次落地时共经过多少米?第10次反弹多高? main()

{int i,n;double h=100,s=100; scanf(\ for(i=1;i<=n;i++)

{h*=0.5;if(i==1) continue;s=2*h+s;} printf(\

}

6.10猴子吃桃问题。猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘多少桃子。 main()

{int i=1,sum=0;

for(;i<=10;sum=2*sum+1,i++); printf(\ }

6.11用迭代法求 。求平方根的迭代公式为:

要求前后两次求出的得差的绝对值少于0.00001。 #include\ main()

{float x0,x1,a; scanf(\ x1=a/2; do

{x0=x1;x1=(x0+a/x0)/2;}

while(fabs(x0-x1)>=0.00001); printf(\ }

6.12 用牛顿迭代法求方程在1.5附近的根。

main()

{double x,y;x=1.5;

do{y=2*x*x*x-4*x*x+3*x-6; x=x-y/(6*x*x-8*x+3);} while(y!=0);

printf(\ }

6.13用二分法求方程在(-10,10)之间的根

main()

{double x1,x2,y1,y2;x1=-10;x2=10; do{y1=2*x1*x1*x1-4*x1*x1+3*x1-6; x1=x1-y1/(6*x1*x1-8*x1+3);} while(y1!=0); do

{y2=2*x2*x2*x2-4*x2*x2+3*x2-6;

x2=x2-y2/(6*x2*x2-8*x2+3);} while(y2!=0);

printf(\ }

6.14打印以下图案 *

* * *

* * * * *

* * * * * * * * * * * * * * * *

#include\ main() {int i,j,k;

for(i=0;i<=3;i++) {for(j=0;j<=2-i;j++) printf(\

for(k=0;k<=2*i;k++) printf(\ printf(\ }

for(i=0;i<=2;i++) {for(j=0;j<=i;j++) printf(\

for(k=0;k<=4-2*i;k++) printf(\ printf(\ } }

第七章

第七章 数组

7.1 用筛法求之内的素数。

main()

{ int i,j,a[100]; for(i=2;i<100;i++) { a[i]=i;

for(j=2;j<=i;j++) {if(j

if(a[i]%j==0) break; if(a[i]-j==0)

printf(\ } }

printf(\ }

#include\ main()

{static int i,j,k,a[98]; for(i=2;i<100;i++) {a[i]=i;k=sqrt(i); for(j=2;j<=a[i];j++) if(j=k+1)

printf(\ }

printf(\ }

7.2用选择法对10个整数从小到大排序。 main()

{ int i,j,a[10],t; for(i=0;i<10;i++) scanf(\ for(j=1;j<10;j++) for(i=0;i<=9-j;i++) if(a[i]>a[i+1])

{t=a[i+1];a[i+1]=a[i];a[i]=t;} for(i=0;i<10;i++) printf(\ } 或 main()

{static int a[10],i,j,k,t; for(i=1;i<11;i++)

scanf(\ for(j=1;j<10;j++) for(i=1;i<=10-j;j++) if (a[i]>a[i+1])

{t=a[i+1];a[i+1]=a[i];a[i]=t;} for(i=1;i<11;i++) printf(\ printf(\ }

7.3求一个3×3矩阵对角线元素之和。 main()

{int i=0,j=0,a[3][3],s1,s2; for(i=0;i<3;i++) for(j=0;j<3;j++)

scanf(\

s1=a[0][0]+a[1][1]+a[2][2]; s2=a[0][2]+a[1][1]+a[2][0]; printf(\ }

或 main() {

static int i,j,s1,s2,a[3][3]; for(i=1;i<=3;i++) for(j=1;j<=3;j++) scanf(\

s1=a[1][1]+a[2][2]+a[3][3]; s2=a[1][3]+a[2][2]+a[3][1]; printf(\ }

7.4已有一个已排好的数组今输入一个数要求按原来排序的规律将它插入数组中。 main()

{ static int a[10]={1,7,8,17,23,24,59,62,101};int i,j,t; scanf(\ for(i=9;i>0;i--) if(a[i]

{t=a[i-1];a[i-1]=a[i];a[i]=t;} for(i=0;i<10;i++)

printf(\ } 或 main()

{

static int a[5]={1,4,5,6,7}; int i,t,b;

scanf(\ for(i=0;i<5;i++) {if(b<=a[i])

{t=a[i];a[i]=b;b=t;} printf(\ printf(\ }

7.5将一个数组的值按逆序重新存放,例如,原来顺序为:8,6,5,4,1。要求改为:1,4,5,6,8。 main()

{ int i,b[10]; for(i=0;i<10;i++) scanf(\ for(i=9;i>-1;i--) printf(\ printf(\

7.6打印出以下杨辉三角形(要求打印出10行)。 1

1 1

1 2 1

1 3 3 1

1 4 6 4 1

1 5 10 10 5 1 ∶ ∶ main()

{ static int m,n,k,b[15][15]; b[0][1]=1;

for(m=1;m<15;m++) {for(n=1;n<=m;n++)

{ b[m][n]=b[m-1][n-1]+b[m-1][n]; printf(\ } } } 或 main()

{ int i,j,n,k,a[10][10];

static a[][1]={{1},{1},{1},{1},{1},{1},{1},{1},{1},{1}};

C程序设计4(谭浩强)完整版-课后习题答案

C程序设计(第四版)(谭浩强)第一章课后习题答案P0061.1向屏幕输出文字.#include//预编译.代码均调试成功,若有失误大多不是代码问题.自已找找.intmain(){}printf(\);return0;//
推荐度:
点击下载文档文档为doc格式
0wnyq12bzj721et5ixox47ty70kclt004xx
领取福利

微信扫码领取福利

微信扫码分享