C程序设计谭浩强完整版课后习题答案_第1页
C程序设计谭浩强完整版课后习题答案_第2页
C程序设计谭浩强完整版课后习题答案_第3页
C程序设计谭浩强完整版课后习题答案_第4页
C程序设计谭浩强完整版课后习题答案_第5页
已阅读5页,还剩69页未读 继续免费阅读

下载本文档

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

文档简介

C程序设计(第四版)(谭浩强)第一章课后习题答案P0061.1向屏幕输出文字.#include<stdio.h>//预编译.代码均调试成功,若有失误大多不是代码问题.自已找找.intmain(){ printf("W\n"); return0;//与intmain对应,为了程序可移植性,建议全用intmain+return0;.}P0081.2求两个数的和.#include<stdio.h>intmain(){ inta,b,sum; a=5; b=4; sum=a+b; printf("Thesumis%d.\n",sum); return0;}P0081.3调用函数比较两个数的大小.#include<stdio.h>intmain(){ intmax(intx,inty);//被调用函数在主函数后面,用前先声明. inta,b,c; scanf("%d,%d",&a,&b);//输入时要按格式来,此处的逗号,用空格会发生错误. c=max(a,b);//a,b作为实参传入被调用函数中. printf("Themaxis%d.\n",c); return0;}intmax(intx,inty)//定义了两个形参.{ intz;//z属于局部变量,可与主函数中相同名字. if(x>y) z=x; else z=y; return(z);//z作为整个程序的出口值,赋给主函数中的c.}P0150.6三个数的大小.(数字0表示课后练习题)#include<stdio.h>intmain(){ inta,b,c,d;//d是用于存储最大值的. intmax(intx,inty,intz);//测试可知,在VS2008中,可以不预先声明. printf("Pleaseinput3numbers:\n"); scanf("%d%d%d",&a,&b,&c);d=max(a,b,c);//调用函数中有三个形参,这里需要传入三个实参,才可运算. printf("Themaxis:%d.\n",d);//d可以换成max(a,b,c).}intmax(intx,inty,intz){ intm; if(x>y&&x>z)//求三者之大的一种方法. m=x; if(y>x&&y>z) m=y; if(z>y&&z>x) m=z; return(m);//返回值m给主函数中的d.}C程序设计(第四版)(谭浩强)第2章课后习题答案算法——程序的灵魂P0172.1计算机1-5相乘的积.#include<stdio.h>intmain(){ inti,s=1;//在执行数值操作前一定要先有个初值. for(i=1;i<6;i++)//这里是到6. { s=s*i;//相乘 } printf("Thesumis%d.\n",s); return0;}#include<stdio.h>//作出要求:换成1到11间奇数相乘.intmain(){ inti,s=1;//在执行数值操作前一定要先有个初值. for(i=1;i<12;i++)//这里是到,但题目要求的是取单数.也可以是i=i+2 { if(i%2!=0)//i对取模,值为非为奇数;为则为偶数. s=s*i; else continue;//跳过这个for循环的这一次,执行下一次. } printf("Thesumis%d.\n",s); return0;}P0192.2按要求输出80分以上的学生信息.暂时没法做.P0192.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<stdio.h>intmain(){ inti; for(i=2000;i<=2200;i++) { if((i%4==0&&i%100!=0)||i%400==0)//闰年的经典判断条件. printf("%disaleapyear!\n",i); else printf("%disnotaleapyear!\n",i); }}P0202.4求(1)-(1/2)+(1/3)……+(1/99)-(1/100)的值.#include<stdio.h>intmain(){ floatsign=1,sum=0,deno,term;//关于有小数的计算应该用float. for(deno=1;deno<=100;deno++) { term=sign*(1/deno);//term临时值,sing符号,deno为分母. sum=sum+term;//第一次总全存储. sign=(-1)*sign;//换号. } printf("Thesumofdeno(指定值)is%f.\n",sum); return0;//若是到100的话,结果为0.68172}P0212.5得到一个大于3的数,并判断是否为素数.#include<stdio.h>intmain(){ inti,num,n;//像13,37,这样只能让和它本身除以外,没有其它除数的叫素数. printf("Pleaseinputanumber:\n");//获取一个数值 scanf("%d",&num); for(i=2;i<num;i++)//在到此数值间进行循环除,如果除得尽,就不满足素数要求. { if(num%i==0)//除得尽,则不是. { n=1; break;//设置跳出,才不会执行多次. } n=0;//按程序走的话,这里会执行多次,不能用printf语句,会输出多次. } if(n==0)//单出口问题,虽然n=0执行多次,但仍然是n=0,这样才会只输出一次. { printf("Itisdoaprimenumber!");//如果是100-200可以加个”%d”,nmu进去. } else { printf("Itisnotaprimenumber!"); } return0;}2.6-2.10要求用流程图表示上列算法.2.11-2.16要求用N-S图表示上列算法.…………还要伪代码P0360.1调换二个参数的值.#include<stdio.h>intmain(){ chara='a',b='b',c; c=a; a=b; b=c; printf("anowis%c,bnowis%c!\n",a,b); return0;}P0360.2输入10个数,并输出最大的那一个数.#include<stdio.h>intmain(){ inti,a[10],s=0; printf("Pleaseinput10numbers:\n"); for(i=0;i<=9;i++) { scanf("%d",&a[i]); } for(i=0;i<=9;i++) { if(s<a[i])s=a[i]; } printf("%disthebiggestnumber!\n",s); return0;}P0360.3按大小顺序输出一些数.#include<stdio.h>intmain(){ inti,j,a[4],s=0; printf("Pleaseinput5numbers:\n");//此处要回车. for(i=0;i<=4;i++) { scanf("%d",&a[i]);//这是取多个数的代码,可以用while控制取到\n符为止. } for(i=0;i<=3;i++)//双重循环,先一个外循,再轮所有小循,轮完后再下一个大循. { for(j=i+1;j<=4;j++)//第一个循环是至n-1,第二个循环是到n. { if(a[i]>a[j])//如果成立,则对换,小于号表示降序排列,大于号表示升序排列. { s=a[i]; a[i]=a[j]; a[j]=s; } } } for(i=0;i<=4;i++)//重新定义循环输出数组中新排列的数. printf("%d-",a[i]); return0;}P0360.4求1至100的总合.#include<stdio.h>intmain(){ inti,sum=0;//这是一个简单的程序. for(i=0;i<101;i++) sum=sum+i; printf("Thesumofonetoonehundredis%d!\n",sum); return0;}P0360.5判断一个数能否同时被3和5整除.#include<stdio.h>intmain(){ intn; printf("Pleaseinputanumber:\n"); scanf("%d",&n); if(n%3==0&&n%5==0)//关键句,用"并"的符号. printf("Canbedevideby3and5!\n"); else printf("Cannotbedevideby3and5!\n"); return0;}P0360.6输出100-200间的素数.//********************第一种方法.#include<stdio.h>//网络版本,采用调用函数和求根取素.#include<math.h>//下面用到sqrt,所以需要包含数据函数.sqrt是求根,属数学函数.intmain()//学会一个程序采用”主函数+被调用函数”的方式,会比较规范.{ inti; for(i=100;i<=200;i++)//为了书写规范,最好加上{},以示清范围. if(prime_number(i)==1)//i是实参. printf("%d",i); return0;}intprime_number(doublem)//m是形参.{ intj,k; k=(int)sqrt(m);//求根,(int)是强制转换,求根里要是浮点型. for(j=2;j<=k;j++) { if(m%j==0) return0;//此值返回给主函数中的实参. } return1;}//********************第二种方法.#include<stdio.h>#include<math.h>intmain(){ inti; for(i=100;i<=200;i++)//指定至间. { if(prime(i)==1)//这里i为实参,传入形参j中进行运算,然后再由形参j带出返回. printf("%distheprimenumber!\n",i); } return0;}intprime(intj)//j是形参,用于接收实参i给的值.{ intm,n; m=(int)sqrt(j); for(n=2;n<=m;n++) { if(j%n==0) return0;//返回值,0为不是素数,1是素数. } return1; }//********************第二种方法.请仿照2.5来写.P0360.7最大公约数和最小公倍数.#include<stdio.h>//最大公约数用累除法,除到无余数时的被除数是最大公约数.main(){ intm,n,c,d; intgcd();//这是最大公约数的缩写,此处调用函数,可以不写里面的实参. intlcm();//这是最小公倍数的缩写,此处调用函数,可以不写里面的实参. printf("Pleaseinputtwonumber:\n"); scanf("%d%d",&m,&n); c=gcd(m,n);//c获取最大公约数 d=lcm(m,n);//d获取最小公倍数 printf("TheGCDof%dand%dis:%d!\n",m,n,c); printf("TheLCMof%dand%dis:%d!\n",m,n,d); return0;}intgcd(intx,inty)//最大公约数GreatestCommonDivisor{ inttemp; while(x%y!=0) { temp=y;//y在下一轮中作为除数,即是下一轮中的X,所以先闪一边去. y=x%y;//x,y的余数作为下一轮中的Y,由x%y来取得. x=temp;//刚才temp中存储了y的值,现在拿出来作为下一轮中的X使用. } returny;//这是每一轮中的被除数,按原理来,这就是最大公约数,即累除法的原理.}intlcm(intx,inty)//最小公倍数LowestCommonMultiple{ inti,temp; if(x<y)//保证二者大的数在X上,小的数在Y上.小于号降序,大于号升序. {//以下为经典三行码,实现两个数的互换. temp=x; x=y; y=temp; } for(i=1;i<=y;i++)//设定一个区间,从1至小的数之间的循环. { if(!((x*i)%y))//除得尽为零,非零为真,则成立并返回. {//如此往复,直到取模无余数,那么小的数X乘以区间当前的I值,就是最小公倍数. returnx*i; } }}最简单的C程序设计——顺序程序设计P0373.1把华氏温度转化为摄氏表示法.#include<stdio.h>floatF_to_C(floatinput_fah)//代表华转摄,input_fah是局部变量.{ floatoutput_cen; //这里也是局部变量. output_cen=(5.0/9)*(input_fah-32);//函数的功能体. returnoutput_cen;//返回值,注意,返回值的数据类型应该和函数一致.}floatC_to_F(floatinput_cen){ floatoutput_fah; output_fah=(9.0/5)*input_cen+32;//转换过程. returnoutput_fah;}intmain(){ intchoice; floatinput_fah,input_cen,output_fah,output_cen;//局部变量的调用及参数传递. printf("F_to_Cpress<1>andC_to_Fpress<2>!\n"); scanf("%d",&choice); if(choice==1) { printf("Pleaseinputfahrenheit:"); scanf("%f",&input_fah);//这个是主函数定义的变量,虽然和调用函数同名.output_cen=F_to_C(input_fah); printf("The华氏is%d,摄氏is%d.",(int)input_fah,(int)output_cen); } if(choice==2) { printf("Pleaseinputcentigrade:"); scanf("%f",&input_cen); output_fah=C_to_F(input_cen); printf("TheCentigradeis%d,andtheFahrenheitis%d.",(int)input_cen,(int)output_fah); } return0;}P0383.2计算存款利息(关于精度问题).#include<stdio.h>intmain(){ floatp0=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=%f\np2=%f\np3=%f\n",p1,p2,p3); return0;}P0553.3大写转换成小写#include<stdio.h>intmain()//小写范围是97-122,大写范围是65-90,大写加上即得小写.26个字母.{ charc1,c2; c1='A'; c2=c1+32; printf("%c%d",c2,c2); return0;}P0593.4给出三角形边长,算出面积.#include<stdio.h>#include<math.h>intmain(){ doublea=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("areais%f\n",area);//默认可以组成三角形. return0;}P0653.5求一无二次等式的根,默认两个不同根.#include<stdio.h>#include<math.h>intmain(){ doublea,b,c,disc,x1,x2,p,q; scanf("%lf%lf%lf",&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=%7.2f\nx2=%7.2f",x1,x2); return0;}P0713.6用%f输出实数,只能得到六位小数.#include<stdio.h>#include<math.h>intmain(){ doublea=1.0;//1是整型,1.0是浮点型,默认是double.可以是float. printf("%.9f\n",a/3); return0;}P0723.7float型数据的有效位数.#include<stdio.h>#include<math.h>intmain(){ floata;//输出的结果是.333252,float精度6位,所以第七位后不可信. a=10000/3.0; printf("%f\n",a); return0;}P0783.8使用putchar函数输出.#include<stdio.h>#include<math.h>intmain(){ chara='B',b='O',c='Y'; putchar(a); putchar(b); putchar(c); putchar('\n'); putchar(101);//101是A的ASCII代码的缩写,因为此函数只能输出字符. putchar(66); return0;}P0793.9使用getchar得到字符.#include<stdio.h>#include<math.h>intmain(){ chara,b,c; a=getchar(); b=getchar(); c=getchar(); putchar(a); putchar(b); putchar(c);//这也是基本回显的C程序代码. putchar('\n'); return0;}P0813.10getchar得到大写,putchar输出小写.#include<stdio.h>#include<math.h>intmain(){ chara,b; a=getchar(); b=a+32; putchar(b); putchar('\n'); return0;}P0820.1国民生产总值10年后的增长倍数.#include<stdio.h>#include<math.h>intmain(){ doublep,r=0.09,n=10; p=pow((1+r),n);//这是数学函数,pow(x,y)计算x的y次方. printf("Pis%lfwhen10yearslater.\n",p); return0;//结果是0.36倍.}P0820.2求各种存款的利息数.#include<stdio.h>#include<math.h>intmain(){ doublep,r,n;//年份和当年利率均有给出. p=1000*(1+5*0.0585); printf("5yearsis%lf!\n",p);//1292.5,这是全五年期.lf输出的是double型. p=(1000*(1+2*0.0468)); p=(p*(1+3*0.0540)); printf("5yearsis%lf!\n",p);//1270.76,这是先二年,再三年的. p=(1000*(1+3*0.0540)); p=(p*(1+2*0.0468)); printf("5yearsis%lf!\n",p);//1270.76,这是先三年,再二年的.证明,是一样的. p=1000*pow((1+0.0414),5); printf("5yearsis%lf!\n",p);//1224.86,这难道说是,相对的存死期越久越值钱. p=1000*pow((1+0.072/4),4*5); printf("5yearsis%lf!\n",p);//1428.74. return0;}P0830.3求几个月要以还贷.#include<stdio.h>#include<math.h>intmain(){ doublem,r=0.01,d=300000,p=6000; m=(log10(p/(p-d*r)))/(log10(1+r)); printf("%.1lf",m);//按要求只留一个小数,所以要写%.1lf. return0;}P0840.6字母密码转换,调用函数及临界处理.#include<stdio.h>charprintcode(charf){ if(((int)f>86&&(int)f<91)||((int)f>118&&(int)f<123)) { return(f-26+4);//因为putchar会自动返回,所以改成return,因为这是在函数中,调用需要返回值. } else { return(f+4); }}intmain(){ chara,b,c,d,e; printf("Pleaseinput:\n"); a=getchar(); b=getchar(); c=getchar(); d=getchar(); e=getchar();//临界问题. printf("%c%c%c%c%c",printcode(a),printcode(b),printcode(c),printcode(d),printcode(e)); putchar(putcharcode(a)); putchar(putcharcode(b)); putchar(putcharcode(c)); putchar(putcharcode(d)); putchar(putcharcode(e)); return0;//注意理解自定义函数的定义,使用,及形参实参的流向. //p84的是计算问题,自己看着办,最后要求小数点后两位,用的是%.2lf来实现,因为没有要求实部,所以m.n格式中m不写. //p84的是定义问题,第一问,两者都行,但是定义字母时,scanf要写%c来获取,而定义数值时则要用%d来获取. //第二问,putchar貌似只能输出字符,所以用printf.putchar本身就是字符输出函数啦,字符,有木有!!!字符啊!!尽管它的参数可以是putchar('\101'),效果是输出字符A啊. //第三问,出现"任何"及"无条件",那么答案明显是"否".可以转换,但要在某此条件下,例如输出和读入时,%c是字母,而%d是数值,看着办.}选择结构程序设计P0864.1一无二次方程求根的二分支.#include<stdio.h>#include<math.h>intmain(){ doublea,b,c,disc,x1,x2,p,q; scanf("%lf%lf%lf",&a,&b,&c); disc=b*b-4*a*c; if(disc<0)//这是选择结构和其判断条件的示例. printf("Thisequationhasn'trealroots\n"); else { p=-b/(2.0*a); q=sqrt(disc)/(2.0*a); x1=p+q; x2=p-q; printf("x1=%7.2f\nx2=%7.2f",x1,x2); } return0;}P0874.2二个数按大小输出.#include<stdio.h>intmain()//此程序代表按大小顺序输出.{ floata,b,t; scanf("%f%f",&a,&b);//出错时,注意检查这里是否按格式输入了.比如有个逗号. if(a>b) { t=a; a=b; b=t; } printf("%5.2f,%5.2f\n",a,b); return0;}P0884.3三个数按大小输出.#include<stdio.h>intmain()//此程序代表按大小顺序输出.{ floata,b,c,t; scanf("%f%f%f",&a,&b,&c); if(a>b)//此处执行后,a为小者. { t=a; a=b; b=t; } if(a>c)//此处执行后,a为小者. { t=a; a=c; c=t; } if(b>c)//上面已经搞定a是最小者,现在对比得出次小者,并且已经归到变量中. { t=b; b=c; c=t; } printf("%5.2f,%5.2f%5.2f\n",a,b,c); return0;}P0994.4判断输入字符,并最终按小写输出.#include<stdio.h>intmain(){ charch; scanf("%c",&ch); ch=(ch>='A'&&ch<='Z')(ch+32):ch;//条件运算符,真取前,假取后. printf("%c\n",ch); return0;}P1004.5按要求输出相应的Y值.#include<stdio.h>intmain(){ intx,y; scanf("%d",&x); if(x>=0) { if(x>0)//这个范围要基于x>=0来判断. { y=1; } else { y=0; } } else//这个是x<0的范围. { y=-1; } printf("x=%d,y=%d",x,y); return0;}P1024.6switch的简单应用.#include<stdio.h>intmain(){ chargrade; scanf("%c",&grade); printf("Yourscore:"); switch(grade) { case'a':printf("85-100\n");break;//当多分支结构过于多时,可以用switch来解决. case'b':printf("70-84\n");break; case'c':printf("60-69\n");break; case'd':printf("<60\n");break; default:printf("Enterdataerror!\n"); } return0;}P1044.7按输入执行操作,并且不分大小写.#include<stdio.h>voidaction1(intx,inty){ printf("x+y=%d\n",x+y);}voidaction2(intx,inty){ printf("x*y=%d\n",x*y);}intmain(){ charch; inta=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'可以控制电脑发出蜂鸣声. } return0;}P1064.8用if的分支来做闰年问题#include<stdio.h>intmain(){ intyear,leap; printf("Pleaseinputtheyear:\n"); scanf("%d",&year); if(year%4==0)//400年里,在100个可除尽4的年里计算,以下是在全范围内计算. { if(year%100==0)//既是100个内的,又是可以除尽100的,算是且. { if(year%400==0)//相当于且了两次,只余下唯一一个. { leap=1; } else//400年里只有1个除得尽,其它都不是. { leap=0; } } else//这里的范围是(year%4==0)&&(year%100!=0) { leap=1;//在合法的100内,又不是2100,2200一类的,当然属闰年. } } else { leap=0; } if(leap) { printf("%dis",year); } else { printf("%disnot",year); } printf("aleapyear!");//不管上面如何判断,最后还是会输出这一句. return0;}P1084.9一元二次等式的全计算过程.#include<stdio.h>#include<math.h>intmain(){ doublea,b,c,disc,x1,x2,realpart,imagpart; scanf("%lf%lf%lf",&a,&b,&c); printf("Theequation"); if(fabs(a)<=1e-6)//fabs是绝对值,le-6,即是的负六次方,接近或是等于零. { printf("isnotaquadratic!\n"); printf("x1=x2=%lf",-c/b); } else { disc=b*b-4*a*c; if(fabs(disc)<=1e-6)//指数形式,数字1. { printf("hastwoequalroots:%lf\n",-b/(2*a)); } else { if(disc>1e-6) { x1=(-b+sqrt(disc))/(2*a); x2=(-b-sqrt(disc))/(2*a); printf("hasdistinctrealroots:%lfand%lf\n",x1,x2); } else { realpart=-b/(2*a); imagpart=sqrt(-disc)/(2*a); printf("hascomplexroots:\n"); printf("%lf+%lfi\n",realpart,imagpart); printf("%lf+%lfi\n",realpart,imagpart); } } } return0;}P1094.10关于多个区间的计算,运费问题为例.#include<stdio.h>intmain(){ doublep,w,s,d,f; printf("p,w,s\n"); scanf("%lf%lf%lf",&p,&w,&s); if(s<250) { d=0.0; f=p*w*s*(1-d); printf("%lf",f); } elseif(s<500) { d=0.02; f=p*w*s*(1-d); printf("%lf",f); } elseif(s<1000) { d=0.05; f=p*w*s*(1-d); printf("%lf",f); } elseif(s<2000) { d=0.08; f=p*w*s*(1-d); printf("%lf",f); } elseif(s<3000) { d=0.1; f=p*w*s*(1-d); printf("%lf",f); } else { d=0.15; f=p*w*s*(1-d); printf("%lf",f); } return0;}P01120.4键盘输入三个数,输出最大者.#include<stdio.h>intmina,mida,maxa;intmax(inta,intb,intc){ intm; if(a>b)//凡是比较中,大于号代表升序排列. { m=a; a=b; b=m; } if(a>c) { m=a; a=c; c=m; } if(b>c) { m=a; a=c; c=m; } return(c);//此排序后,a,b,c由小到大.所以c是返回中最大的.}intmain(){ inta,b,c; printf("Pleaseinput3numbers:"); scanf("%d%d%d",&a,&b,&c); printf("Themaxis%d!\n",max(a,b,c)); return0;}P01120.5一个小于1000的数,有判定条件.#include<stdio.h>#include<math.h>intmain(){ doublea,b; printf("Pleaseinputanumber:"); scanf("%lf",&a); if(a<1000) { b=sqrt(a); } else { printf("\a");//控制蜂鸣声 printf("Pleaseinputanumberagain:"); scanf("%lf",&a);11 b=sqrt(a); } printf("%.0lf",b);//按要求,只取整数. return0;}P01120.9一个不多于5位的数,按条件输出.#include<stdio.h>#include<math.h>intmain(){ inti,a,b[4],count=0; printf("Pleaseinputanumber(five-digitnumber):");//意思是五位数以内. scanf("%d",&a); for(i=0;i<=4;i++) { b[i]=a%10;//是%10,不是/10000,结果就是b[0]至b[4]中存着个,十,百,千,万位. a=a/10;///10后得到的结果去掉了个数. if(b[i]!=0) { count=count+1; } } printf("%d位数.\n",count); printf("分别输出每一位数字,如下:"); for(i=4;i>=0;i--) { printf("%d",b[i]); } printf("\n"); printf("倒序输出这一个数字,如下:"); for(i=0;i<=4;i++) { printf("%d",b[i]); } printf("\n"); return0;}P01120.10按要求提成奖金(if写法).#include<stdio.h>intmain(){ doublea,b; printf("Pleaseinputprofitamount:"); scanf("%lf",&a); if(a<=10)//这个是整个if的基础. { b=a*0.1; } elseif(a<=20)//以上面为基础,这已经代表了10-20间了!!! { b=1+(a-10)*0.075; } elseif(a<=40)//同理,这是20-40间. { b=1+0.75+(a-20)*0.05; } elseif(a<=60) { b=1+0.75+0.1+(a-40)*0.03; } elseif(a<=100) { b=1+0.75+0.1+0.06+(a-60)*0.15; } else//这里是大于100的. { b=1+0.75+0.1+0.06+(a-100)*0.01; } printf("Therewardis%lf!\n",b); return0;}P01120.10按要求提成奖金(switch写法).#include<stdio.h>doubleGetProfit(doublec){ printf("Pleaseinputprofitamount:"); scanf("%lf",&c); return(c);//返回本身了,如果有进一步的计算结果,将值赋给其它变量,也可以返回.}intmain(){ doublea; charc; printf("Yourchoice:\nA:0-10;\nB:10-20;\nC:20-40;\nD:40-60;\nE:60-100;\nF:100-1000;\n"); scanf("%c",&c);//不同档时,应照档的规定数值进行输入,否则结果不会是正确的. switch(c)//前三后三用于比较调用函数. { //GetProfit(c)引入的实参没有意义,返回值和引入的实参没关系,反而由键盘获得. case'A':{printf("Therewardis%lf!\n",GetProfit(c)*0.1);};break;//0-100.100 case'B':{printf("Therewardis%lf!\n",1+(GetProfit(c)-10)*0.075);}break;//10-200.075 case'C':{printf("Therewardis%lf!\n",1+0.75+(GetProfit(c)-20)*0.05);}break;//20-400.050 case'D':{printf("Pleaseinputprofitamount:");scanf("%lf",&a);printf("Therewardis%lf!\n",1+0.75+0.1+(a-40)*0.03);}break; //40-600.030 case'E':{printf("Pleaseinputprofitamount:");scanf("%lf",&a);printf("Therewardis%lf!\n",1+0.75+0.1+0.6+(a-60)*0.15);}break; //60-1000.015 case'F':{printf("Pleaseinputprofitamount:");scanf("%lf",&a);printf("Therewardis%lf!\n",1+0.75+0.1+0.6+0.6+(a-100)*0.01);}break; //100-10000.010 default:printf("Errordata!");break;//可以有一个执行体,用{}包括起来. } return0;}P01120.11键盘输入数值,然后排序输出.#include<stdio.h>intmain(){ inta[10],i,j,m,n;//变量可以在写代码过程中再回来临时添加. printf("请输入数值的个数:(十个以内)"); scanf("%d",&m);//到这里需要变量来承载数值的个数,设m,回头去定义变量那写上m. printf("请分别输入相对应个数的数值:"); for(i=0;i<m;i++) { scanf("%d",&a[i]); } for(i=0;i<m;i++) { for(j=i+1;j<m;j++) { if(a[i]>a[j])//这是选择排序法.升序. { n=a[i];//这里需要一个用于临时变量的n,所以回头去写上. a[i]=a[j]; a[j]=n; } } } for(i=0;i<m;i++) { printf("%d",a[i]); } return0;}C程序设计(第四版)(谭浩强)第五章课后习题答案循环结构程序设计P1155.1用while计算1至100的合.#include<stdio.h>intmain(){ inti=1,sum=0; while(i<=100)//对于需要运算的值,要么在运算前可以赋值,要么一开始要指定. { sum=sum+i; i++; } printf("Thesumis%d.\n",sum); return0;}P1175.2用do-while来做1至100的合.#include<stdio.h>intmain(){ inti=1,sum=0; do//do-while可以做的事,用while都可以做到. {//do-while先做一次执行,再判断条件,而while却是先做一个条件,再执行. sum=sum+i; i++; }while(i<=100); printf("Thesumis%d.\n",sum); return0;}P1185.3比较do-while与while的差别.#include<stdio.h>intmain(){ inti,sum=0; printf("Pleaseinputanumber:"); scanf("%d",&i);//输入10以内,正常,11的话,则sum仍然是0. while(i<=10) { sum=sum+i; i++; } printf("Thesumof1-10is%d.\n",sum); return0;}#include<stdio.h>intmain(){ inti,sum=0; printf("Pleaseinputanumber:"); scanf("%d",&i);//输入10以内,结果一样.输入11的话,先做操作,所以sum=11. do { sum=sum+i; i++; }while(i<=10);//此重点在于理解二者的差别. printf("Thesumof1-10is%d.\n",sum); return0;}P1265.4break的例子.#include<stdio.h>intmain(){ inti,b=0,a,c; for(i=0;i<=1000;i++) { printf("Pleaseinputamount:");//循环体内套有输出语句以及跳出语句. scanf("%d",&a); b=b+a; if(b>=100) { break;//break是用于跳出循环,对if无效,对whileforswitch这一类. } } c=b/i; printf("conutis%d,averis%d",i+1,c);//注意%号后的形式,否则可能输出错误. return0;}P1275.5continue的例子.#include<stdio.h>intmain(){ inti; for(i=1;i<20;i++) { if(i%3!=0) { continue;//跳过本次I,执行下一个i. } printf("%d",i); } printf("\n"); return0;}P1285.6形成一个4*5的矩阵.#include<stdio.h>intmain(){ inti,j,a=0;//没有给初值,会出现警告:使用了未初始化的局部变量“a” . for(i=1;i<=4;i++) { for(j=1;j<=5;j++,a++)//a用来控制换行. { if(a%5==0) { printf("\n"); } printf("%d\t",i*j); } } printf("\n"); return0;}P1315.7用一个交错的式子求哌的近似值.#include<stdio.h>#include<math.h>intmain()//四分之哌等于(1)-(1/3)+(1/5)-(1/7)+(1/9)-(1/11).{ floats=1,n=1,m,sum=0,t; for(m=1;;m=m+2)//不确定哪项才会小于等于十的负六次方,所以不指定,无限下去. {//不指定第二项,执行语句中应该有控制跳出的句子,否则死循环. t=(s)*(n/m);//这是第一项,s是符号, if(fabs(t)<=1e-6)//应该写在这里,题目要求这一项不累加进去. { break; } sum=sum+t;//因为累加项在这里,所以,一旦跳出就不会累加进来了. s=s*(-1);//变号一次. } printf("四分之一哌的值是%f.\n",sum); printf("一个完整哌的值是%f.\n",sum*4); return0;}//下面这段小代码用来验证关于数值型数据类型的关系.去掉注释,可运行.//如果出现类似值为全1或是全零的话,一般可以考虑数据类型赋值或是定义错了的问题.//#include<stdio.h>//这是关于intfloatdouble三者关复杂关系的,乱啊,如果看不懂,可以通过实验自己明白来.////intmain()//在C语言中,1.0认为是实数,即是double型,所以,如果你把它用float输出的话,会有警告:警告 1 warningC4305:“=”:从“double”到“float”截断 .//{// floatm,a,b,c;//一旦定义了是这种类型的话,输出或是赋值的时候只能扩展不能截断,意思就是能变成double型,不能变成int型啦.而且后面的赋值会跟着它变成相应的类型.比如下面的m=1,其实得到的是m=1.0.// intd,e,f;// m=1;// a=1.0/3;// b=1/3;// c=m/3;// d=1.0;// e=1/4;// f=1.0/4;// printf("%lf(float用double的%lf来输出是可以的.)\n%f\n%f\n%f\n",m,a,b,c);//不管上面定义什么,这边写的输出类型是什么,就按相应的类型输出,有可能会出错,所以建议按定义的类型来输出.当然扩展的是不会错的,截断的是会错的,比如float可以用%lf来输出,而不能用%d来输出.// printf("%d\n%d\n%d\n",d,e,f);//但是,不相应的int型不可以用%f来输出的.因为intfloat就不同种类,一个是整数,一个是小数,floatdouble同样是有小数点的!!!!// return0;//}P1335.8着名的Fibonacci(费波那契数列问题)#include<stdio.h>intmain()//这个就是着名的Fibonacci(费波那契数列问题){ intf1=1,f2=1,f3,i; printf("%12d\n%12d\n",f1,f2); for(i=1;i<=38;i++)//注意,这是个基础问题,(i=1;i<=5;i++)这里其实进行了次运算,因为有f1,f2,要求有个,所以要有个.要么写<=38,要么写<39,边界问题一定要注意,不可以太随意!!!! { f3=f1+f2; printf("%12d\n",f3);//这个问题同样适用于"一对兔子一个月生一对"的问题., f1=f2;//f1=f1+f2;此时它们各是,所以,现在的f1是. f2=f3;//f2=f2+f1;此时的f1已经是最先二者之和了.可以不用到f3. } return0;}P1355.9还是求素数,方法不一样.#include<stdio.h>#include<math.h>intmain(){ doublenum; inti; printf("Pleaseinputanumber:"); scanf("%lf",&num);//因为sqrt要求是浮点型,那就给它浮点型,需要时再强制转换. for(i=2;i<=sqrt(num);i++)//这边是<=号没错. { if((int)num%i==0)//如果在这期间有任何一个可以为零的话,则不是素数. { break;//当然跳出. } }//执行到这里的时候,i=5,已经变成了!! if(i<=sqrt(num)) { printf("Not%d",(int)num); } else//如上所述,i=5,超出了求根的值,所以是素数. { printf("Yes%d",(int)num); } return0;}P1375.10求100至200间的素数.#include<stdio.h>//不解释,HOHO>>>>...#include<math.h>intmain(){ doublej; inti,k=0; for(j=100;j<=200;j++) { for(i=2;i<=sqrt(j);i++) { if((int)j%i==0) { break; } } k=k+1;//这里是布局的开头.学习一下,有助逻辑. if(i<=sqrt(j)) { printf("Not%d",(int)j); if(k%5==0)//5个换一次行. { printf("\n"); } } else { printf("Yes%d",(int)j); if(k%5==0) { printf("\n"); } } } return0;}P1395.11密码转换.#include<stdio.h>intmain(){ charc; c=getchar(); while(c!='\n')//这也可以用数组来实现. { if((c>='a'&&c<='z')||(c>='A'&&c<='Z')) { if((c>='w'&&c<='z')||(c>='W'&&c<='Z')) { c=c-22; } else { c=c+4; } printf("%c",c); c=getchar();//套在循环里,依次得到字母,而while中判断回车为结束. } } printf("\n");//这是布局问题. return0;}P1400.3最大公约数和最小公倍数.#include<stdio.h>//最大公约数用累除法,除到无余数时的被除数是最大公约数.main(){ intm,n,c,d; intgcd();//这是最大公约数的缩写,此处调用函数,可以不写里面的实参. intlcm();//这是最小公倍数的缩写,此处调用函数,可以不写里面的实参. printf("Pleaseinputtwonumber:\n"); scanf("%d%d",&m,&n); c=gcd(m,n);//c获取最大公约数 d=lcm(m,n);//d获取最小公倍数 printf("TheGCDof%dand%dis:%d!\n",m,n,c); printf("TheLCMof%dand%dis:%d!\n",m,n,d); return0;}intgcd(intx,inty)//最大公约数GreatestCommonDivisor{ inttemp; while(x%y!=0) { temp=y;//y在下一轮中作为除数,即是下一轮中的X,所以先闪一边去. y=x%y;//x,y的余数作为下一轮中的Y,由x%y来取得. x=temp;//刚才temp中存储了y的值,现在拿出来作为下一轮中的X使用. } returny;//这是每一轮中的被除数,按原理来,这就是最大公约数,即累除法的原理.}intlcm(intx,inty)//最小公倍数LowestCommonMultiple{ inti,temp; if(x<y)//此段代码结果是保证二者大的数在X上,小的数在Y上.即小于号降序. {//以下为经典三行码,实现两个数的互换. temp=x; x=y; y=temp; } for(i=1;i<=y;i++)//设定一个区间,从1至大的数之间的循环. { if(!((x*i)%y))//此式子如有余数,加上"!"号,会是假,则不返回,进行下一轮. {//如此往复,直到取模无余数,那么小的数X乘以区间当前的I值,就是最小公倍数. returnx*i; } }}P1400.4判断一串输入的字符.#include<stdio.h>intmain(){ charch; inta=0,b=0,c=0,d=0,e=0; printf("Pleaseinputthestring\n"); while((ch=getchar())!='\n')//直到回车. { if(ch<='z'&&ch>='a') { a++; } elseif(ch=='') { c++; } elseif(ch<58&&ch>47) { d++; } elseif(ch<='Z'&&ch>='A') { b++; } else { e++; } } printf("大写%d小写%d空格%d数字%d其它%d\n",a,b,c,d,e);}P1400.52+22+222+2222系列的和.#include<stdio.h>//不理解时可以百度或是谷歌更多的信息.intmain()//想办法既快速做完,又要消化理解!!!{ inttemp,i,a,n,sum=0;//主逻辑,友好性暂时放松. scanf("%d%d",&a,&n);//a是数字,n是要乘的个数. temp=a;//先把第一阶的值存起来. for(i=0;i<n;i++) { sum=sum+a; printf("%d+",a);//事关布局. a=a*10+temp;//重点是每次乘,然后加上上一个数. } printf("=%d.",sum); return0;}P1400.61!+2!+3!+4!.....的值.#include<stdio.h>intmain()//1!+2!+3!+4!.....{ inti,j,k,sum=0,m=1; scanf("%d",&k);//比如设定为,值为. for(i=1;i<=k;i++)//第一层循环,指定到. { for(j=1;j<=i;j++)//第二层循环,指定至当前数. { m=m*j; }//到此是阶乘的结构. sum=sum+m; m=1; } printf("%d",sum);//完全不理解时,搜索并参考. return0;//尝试自己做,第一次做出来就是自己的东西了.}P1400.71至100,1至50平方,1至10倒数的总和.#include<stdio.h>intmain(){ inta,b; doublec,asum=0,bsum=0,csum=0; for(a=1;a<=100;a++)//三个块分别注释验证结果. { asum=asum+a; } for(b=1;b<=50;b++)//在VS运行中,注意*.cpp为C++语言. { bsum=bsum+b*b;//为了避免语言差别,请注意文件名为*.c. } for(c=1;c<=10;c++)//c作浮点运算,所以定义在double类型中. { csum=csum+1/c; } printf("%lf",asum+bsum+csum); return0;}PP#include<stdio.h>#include<math.h>intmain(){ intj,k,s[6],x=100,y,sum=0; for(j=153;j<=154;j++) { for(k=2;k>=0;k--) { s[k]=j%(int)pow(10,k+1)/(int)pow(10,k); y=pow(s[k],3); sum+=y; printf("%d-%d--%d\t",k,s[k],j); } printf("%d\n",sum); } return0;}P1400.8水仙花数.//#include<stdio.h>//一步步的发现问题.////intmain()//在%和/号之间,以前pow.以后再做.//{// inti,j,k,a,b,c,sum=0;//这里逻辑对,算出来却错了.// for(i=2;i<=4;i++)//计算机在想什么,看来它的大脑难以模拟.// {// for(j=pow(10,i);j<=pow(10,i+1)-1;j++)//我不完全明白它遵守的逻辑.// {// for(k=0;k<=i;k++)// {// sum+=pow((j%pow(10,i+1)/pow(10,i)),3);// }// if(sum==j)// {// printf("%d是水仙花数!\n",j);// }// sum=0;// }// }// return0;//}//为什么还是无法实现!#include<stdio.h>#include<math.h>intmain(){ inta,b,c,i,sum=0;//这里只计算三位数的. for(i=100;i<1000;i++) { a=i/100; b=i%100/10; c=i%10; sum+=a*a*a+b*b*b+c*c*c; if(sum==i) { printf("%d是水仙花数.\n",i); } sum=0; } return0;}P1410.9完数.#include<stdio.h>intmain(){ inti,j,r; for(i=1;i<=1000;i++)//零是个临界值,不能包括它. { r=0;//每次清零重来.类似水仙中的sum. for(j=1;j<i;j++) { if(i%j==0)//除得尽即是因子. { r=r+j;//然后累加进去. } } if(r==i)//若相等. { printf("%d是完数.\n",i); } } return0;}P1410.102/1+3/2+5/3+8/5+13/8…#include<stdio.h>intmain()//10.007051{ doublei,a=2,b=1,c,s=0;//a是分子,b是分母. for(i=0;i<6;i++)//二十可以用户指定. { s+=a/b;//中间储值变量. c=a+b; b=a; a=c; } printf("%lf\n",s); return0;}P1410.11球落地并反弹问题.#include<stdio.h>intmain()//从一百开始,减一半再自加两次,下降一次,反弹一次.{ doublesum=100,high=100,up,donw,i; for(i=1;i<10;i++)//不管指定到哪个数,都不会超过三百. { up=high/2; donw=up; high=donw;//自咬尾巴问题. sum+=donw*2; } printf("%lf%lf\n",donw,sum); return0;}P1410.12猴子吃桃子.#include<stdio.h>intmain()//从一百开始,减一半再自加两次,下降一次,反弹一次.{ inti,sum=1; for(i=1;i<=10;i++)//临界要清楚,结果要与手算的前几个实例相匹配. { printf("倒数第%d天还剩有%d个桃子.\n",i,sum); sum=(sum+1)*2; } //printf("%d\n",sum); return0;}P1410.16输出星号棱形图案.#include<stdio.h>#include<conio.h>main()//只关注左半部分.右半部分无视空格.{inti,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("\n");}for(i=m-1;i>0;i--)//下半部分.其实也是倒三角.{//减一是因为行数问题.这是中心行以下的.for(j=m-1;j>=i;j--)printf("");for(k=1;k<2*i;k++)printf("*");printf("\n");}getch();//用户反应后结束.但,没必要.}第六章?第六章循环控制?6.1输入两个正整数m和n,求其最大公约数和最小公倍数。?main()?{longm,n,i=1,j,s;?scanf("%ld,%ld",&m,&n);?for(;i<=m&&i<=n;i++)?{if(m%i==0&&n%i==0)s=i;}?if(m>=n)j=m;?elsej=n;?for(;!(j%m==0&&j%n==0);j++);?printf("s=%ld,j=%ld\n",s,j);?}?6.2输入一行字符,分别统计出其中英文字母、空格、数字和其他字符的个数。?#include"stdio.h"?main()?{charc;inti=0,j=0,k=0,l=0;?while((c=getchar())!=’\n’)?{if(c>=65&&c<=90||c>=97&&c<=122)i++;?elseif(c>=48&&c<=57)j++;?elseif(c==32)k++;?elsel++;}?printf("i=%d,j=%d,k=%d,l=%d\n",i,j,k,l);?}?6.3求Sn=a+aa+aaa+…+aa…aaa(有n个a)之值,其中a是一个数字。例如:2+22+222+2222+22222(n=5),n由键盘输入。?#include"math.h"?main()?{intn,sum=0,i=1,s=2;?scanf("%d",&n);?while(i<=n)?{sum=sum+s;s=s+2*pow(10,i);?i++;}?printf("sum=%d\n",sum);?}?6.4求,(即求1!+2!+3!+4!+5!+…+20!)?main()?{intn,i=1;longsum=0,s=1;?scanf("%d",&n);?while(i<=n){s=s*i;sum=sum+s;i++;}?printf("sum=%ld\n",sum);?}?6.5求??main()?{doublei=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("sum=%f\n",sum);?}?6.6打印出所有"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该本身。例如:153是一个水仙花数,因为153=1^3+5^3+3^3。?#include"math.h"?main()?{intx=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("%5d",x);x++;}?}?6.7一个数如果恰好等于它的因子之和,这个数就称为"完数"。例如,6的因子为1、2、3,而6=1+2+3,因此6是"完数"。编程序找出1000之内的所有完数,并按下面格式输出其因子:?6itsfactorsare1、2、3?main()?{intm,i,j,s;?for(m=6;m<10000;m++)?{s=1;?for(i=2;i<m;i++)?if(m%i==0)s=s+i;?if(m-s==0)?{printf("%5ditsfastorsare1",m);for(j=2;j<m;j++)if(m%j==0)?printf("%d",j);printf("\n");}?}?}?或?main()?{intm,i,j,s;?for(m=6;m<1000;m++)?{s=m-1;?for(i=2;i<m;i++)?if(m%i==0)s=s-i;?if(s==0)?{printf("%5di

温馨提示

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

评论

0/150

提交评论