C程序設計(譚浩強)完整版-課后習題標準答案_第1頁
C程序設計(譚浩強)完整版-課后習題標準答案_第2頁
C程序設計(譚浩強)完整版-課后習題標準答案_第3頁
C程序設計(譚浩強)完整版-課后習題標準答案_第4頁
C程序設計(譚浩強)完整版-課后習題標準答案_第5頁
已閱讀5頁,還剩127頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

C程序設計(譚浩強)完整版-課后習題答案————————————————————————————————作者:————————————————————————————————日期:C程序設計(第四版)(譚浩強)第一章課后習題答案P0061.1向屏幕輸出文字.#include<stdio.h>//預編譯.代碼均調試成功,若有失誤大多不是代碼問題.自已找找.intmain(){printf("Welcometo\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;elsez=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;elsecontinue;//跳過這個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);elseprintf("%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");elseprintf("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);11b=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.100case'B':{printf("Therewardis%lf!\n",1+(GetProfit(c)-10)*0.075);}break;case'C':{printf("Therewardis%lf!\n",1+0.75+(GetProfit(c)-20)*0.05);}break;//10-200.075//20-400.050case'D':{printf("Pleaseinputprofitamount:");scanf("%lf",&a);printf("Therewardis%lf!\n",1+0.75+0.1+(a-40)*0.03);}break;//40-600.030case'E':{printf("Pleaseinputprofitamount:");scanf("%lf",&a);printf("Therewardis%lf!\n",1+0.75+0.1+0.6+//60-1000.015(a-60)*0.15);}break;case'F':{printf("Pleaseinputprofitamount:");scanf("%lf",&a);printf("Therewardis%lf//100-10000.010!\n",1+0.75+0.1+0.6+0.6+(a-100)*0.01);}break;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輸出的話,會有警告:警告1warningC4305:“=”:從“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,

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論