第三次实验报告
c語言實(shí)驗(yàn)報(bào)告
實(shí)驗(yàn)項(xiàng)目:
???1、用for語句實(shí)現(xiàn)循環(huán)
???2、用while循環(huán)語句實(shí)現(xiàn)循環(huán)
???3、用do-while循環(huán)語句實(shí)現(xiàn)循環(huán)
???4、用while語句和for語句配合實(shí)現(xiàn)循環(huán)
???5、用for語句嵌套實(shí)現(xiàn)循環(huán)
姓名:張順利? ?實(shí)驗(yàn)地點(diǎn):第一教學(xué)樓514教室????實(shí)驗(yàn)時(shí)間:4月17日
?
一、實(shí)驗(yàn)?zāi)康呐c要求
1.用for語句實(shí)現(xiàn)循環(huán)
2.用while循環(huán)語句實(shí)現(xiàn)循環(huán)
3.用do-while循環(huán)語句實(shí)現(xiàn)循環(huán)
4.用while語句和for語句配合實(shí)現(xiàn)循環(huán)
5.用for語句嵌套實(shí)現(xiàn)循環(huán)
二、實(shí)驗(yàn)內(nèi)容
1.實(shí)驗(yàn)練習(xí):
5.3.1 (1)
1.編寫一程序,求出1,1+2,1+2+3···數(shù)列中前n項(xiàng)的值。
2.代碼示例:
#include <stdio.h> #include <conio.h> main() {int i,j=0,k,s=0;printf("Enter a number:");scanf("%d",&k);for(i=1;i<=k;i++){s=s+i;printf("%d",s);j++;} }3.算法思考:i為項(xiàng)數(shù),k為輸入數(shù),s為前n項(xiàng)和,在輸入k的值之后進(jìn)入for語句循環(huán),首先給i賦值1,進(jìn)入循環(huán),判斷條件i<=k,是,進(jìn)入算式s=s+i,再進(jìn)入i=i+1,再重新進(jìn)入循環(huán),直到i>k,不滿足循環(huán)條件,跳出循環(huán),輸出之前所得的所有s的值。
5.3.1 (2)
1.編寫一程序,求數(shù)列1,-3!,5!,-7!···(-1)^n-1(2n-1)前n項(xiàng)的和。n的值由鍵盤輸入。
2.代碼示例:
#include <stdio.h> main() {int n,i,j,sign=1;float fac,sum;printf("please input value of n:");scanf("%d",&n);sum=0.0;for(i=1;i<=n;i++){fac=1.0;for(j=1;j<=2*i-1;j++){fac=fac*j;}fac=fac*sign;sum=sum+fac;sign=-sign;}printf("sum=%.0f\n",sum); }3.算法思考:剛開始的時(shí)候老師說for里的i的條件有問題,但是要我們用i的條件對(duì)下面的算法進(jìn)行填空,害的我以為不能更改for中的條件,所以一直看不懂,寫不懂,直到后老師給我了一點(diǎn)提示我才恍然大悟。下面是我對(duì)算法流程的思考。
n為輸入數(shù),i為循環(huán)次數(shù),j為每一項(xiàng)的數(shù)值,fac為每一項(xiàng)j相乘的數(shù)值,sign為數(shù)值之前的符號(hào),sum為前n項(xiàng)的和,
首先由鍵盤輸入n的值,將i賦值為1,進(jìn)入循環(huán),判斷條件i<=n,成立,進(jìn)入循環(huán)1,又將fac,j賦值為1,再次進(jìn)入判斷條件j<=2*i-1,成立,進(jìn)入循環(huán)2,則進(jìn)入算式fac=fac*j,再進(jìn)行j=j+1,再次進(jìn)入判斷條件,直到j(luò)>2*i-1時(shí),條件不成立,跳出循環(huán)2,再進(jìn)入fac=fac*sign(將fac添加符號(hào),進(jìn)行包裝),sum=sum+fac(計(jì)算前n項(xiàng)和),sign=-sign(更改“+”“-”號(hào),滿足算式(-1)^n-1),之后繼續(xù)進(jìn)入判斷條件i<=n,直到i>=n時(shí),條件不滿足,跳出循環(huán)1,輸出前n項(xiàng)和sum。
只是由兩個(gè)for循環(huán)進(jìn)行嵌套的循環(huán)先進(jìn)入大循環(huán)i<=n,其中又有一個(gè)小循環(huán)j<=2*i-1。這是一道非常經(jīng)循典的題目,對(duì)于for循環(huán)的嵌套很有幫助,以后在復(fù)習(xí)的時(shí)候可以拿出來進(jìn)行for語句的循環(huán)嵌套訓(xùn)練。
5.3.2 (1)
1.在鍵盤上輸入若干個(gè)學(xué)生的成績(jī),統(tǒng)計(jì)并輸出最高成績(jī)和最低成績(jī),當(dāng)輸入負(fù)數(shù)時(shí)結(jié)束輸入。
2.代碼演示:
#include <conio.h> #include <stdio.h> main() {float x,max,min;printf("please input scores:");scanf("%f",&x);max=min=x;while(x>0) {if( x>max) max=x;if( x<min) min=x;scanf("%f",&x);}printf("\nmax=%f\nmin=%f\n",max,min); }3.算法思考:經(jīng)典的C語言排序算法,max為最大值,min為最小值,x為輸入的數(shù)值,首先將max,min,賦值為x,這時(shí)的x為第一個(gè)數(shù),當(dāng)x>0時(shí),進(jìn)入循環(huán),先與max比較,max=x,不滿足判斷條件x>max,跳出循環(huán),接下來與min進(jìn)行比較,min=x,不滿足判斷條件x<min,跳出循環(huán),輸入第二個(gè)數(shù),重新進(jìn)入循環(huán),直到遇到負(fù)數(shù),滿足判斷條件x<0,跳出循環(huán),輸出max,min的值。
這是while語句和if語句進(jìn)行嵌套的循環(huán)結(jié)構(gòu),首先要先滿足非負(fù)數(shù)這個(gè)條件,才能進(jìn)入while的大循環(huán),才會(huì)有max,min,x的比大小,這個(gè)小循環(huán),題目不難,算是一道中規(guī)中矩的題目吧。
5.3.2 (2)
1.求所有的水仙花數(shù)(水仙花數(shù)是一個(gè)3位數(shù)的自然數(shù),該數(shù)各位數(shù)的立方和等于該數(shù)本身,如153為水仙花數(shù)1^3+5^3+3^3=153)。
2.代碼示例:
#include <stdio.h> main() {int x,y,z;int k=100;while(k<=999){x=k/100;y=(k/10)%10;z=k%10;if(k==x*x*x+y*y*y+z*z*z)printf("%d\n",k);k++;} }算法思考:這道題需要注意的在之后的判斷條件中包含if結(jié)構(gòu),同時(shí)k為==,不要打成=的賦值,
首先進(jìn)入循環(huán)的判斷的條件,因?yàn)樗苫〝?shù)是三位數(shù),所以應(yīng)該在100~999之間,由于輸入的初始k值為100,所以我們條件為k<=999,再由x,y,z,分別提取k的百位,十位,個(gè)位。即用算式x=k/100,y=(k/10)%1,;z=k%10。再進(jìn)入if的判斷語句,判斷是否符合水仙花數(shù)的條件,k=x*x*x+y*y*y+z*z*z,成立輸出k的值,不成立,k=k+1后,重新進(jìn)入循環(huán),直到k=1000時(shí),不滿足判斷條件k<=999,跳出循環(huán),結(jié)束。
5.3.3
1.求滿足下列不等式的n的最小值,其中,value是大于1的任何事。1+1/2+1/3+···+1/n>value
2.代碼示例:
#include <stdio.h> main() {float sum,value;int n;printf("Input value:");scanf("%f",&value);sum=0.0;n=0;do{++n;sum+=1.0/(float)n;} while(sum<value);printf("n=%d",n); }3.算法思考:value為輸入值,n為所求值,sum為前n項(xiàng)的和。首先輸入value,再將sum,n賦值為0,直接進(jìn)入算式n=n+1,再將sum加入上1/n的前n項(xiàng)和計(jì)算出來,即sum=sum+1/(float)n,再將sum與value進(jìn)行比較,當(dāng)sum滿足判斷條件sum<value時(shí),重新進(jìn)入循環(huán),直到sum>value時(shí),不滿足判斷條件,跳出循環(huán),輸出n。
這道題不難,與之前的算法題目大同小異,但在這里可以明顯看出while語句和do-while語句的不同,while語句是先進(jìn)行判斷,再進(jìn)入算式運(yùn)算;而do-while語句則是先進(jìn)入算式運(yùn)算,再進(jìn)行運(yùn)算。在運(yùn)算上就比while語句多了一次。所以相同的題目while語句,和do-while語句的判斷條件是不同的。
5.3.4
1.輸入四個(gè)數(shù)字字符,并把其轉(zhuǎn)換為四位十進(jìn)制整數(shù)后顯示出來。
2.代碼示例:
#include <stdio.h> main() {char c;int k,data;data=0;for (k=0;k<4;k++){while(1){c=getchar();if (c>='0' &&c<'9')break;}if(k==0)data+=(c-'0')*1000;else if(k==1)data+=(c-'0')*100;else if(k==2)data+=(c-'0')*10;elsedata+=(c-'0');}printf("Data=%d",data);}3.算法思考:這道題和前面求水仙花數(shù)的算法差不多,只不過使用的是for結(jié)構(gòu),while結(jié)構(gòu),if結(jié)構(gòu)的連環(huán)嵌套,首先for語句把k限定在4個(gè)數(shù)字即k<4,再輸入c的值,再判斷c的值是否在0~9之間,如果是,就將0位上的數(shù)乘上1000,變?yōu)榍粩?shù),將1位上的數(shù)乘上100,變?yōu)榘傥粩?shù),將2位上的數(shù)乘上10,變?yōu)槭粩?shù),將3位上的數(shù)直接添加進(jìn)去,再將所有位數(shù)上的數(shù)值進(jìn)行相加,得出data的值,再將k自增,這時(shí)k的值已經(jīng)為4,不滿足循環(huán)條件,跳出循環(huán),輸出data的值。
這道題,我認(rèn)為是一道非常好的題目,算法上都不難,但考驗(yàn)的卻是我們關(guān)于循環(huán)結(jié)構(gòu)的嵌套,這里幾乎把我們學(xué)過的循環(huán)語句都運(yùn)用進(jìn)去了,所以我認(rèn)為是一道非常不錯(cuò)的題目。
5.3.5(1)
1.有100匹馬,要馱100擔(dān)貨物,其中,1匹大馬可以馱3擔(dān),一匹中馬可以馱兩擔(dān),兩匹小馬可以馱1擔(dān),請(qǐng)問,大馬,中馬和小馬可以有多少種組合。
2.代碼示例:
?
#include <stdio.h> main() {int m,n,k;int sum=0;printf("各種馱法如下:\n");for(m=1;m<=100;m++)for(n=1;n<=100-m;n++){k=100-n-m;if((k%2==0)&&(3*m+2*n+0.5*k==100)){ printf("大馬%3d匹;中馬%3d匹;小馬%3d匹.\n",m,n,k);sum++;} elsecontinue;} printf("共有%d種馱法.\n",sum); }3.算法思考:我剛看到這道題的時(shí)候,就覺得這道題挺有趣的,他是用兩個(gè)for語句進(jìn)行并列嵌套,首先因?yàn)樗旭R的數(shù)量為100,所以無論是什么馬的數(shù)量都不會(huì)超過100,故m表示大馬,n表示中馬,k表示小馬,先一個(gè)個(gè)來,先通過for語句,進(jìn)入判斷條件m<=100,因?yàn)橐呀?jīng)有了大馬的數(shù)量,所以第二個(gè)for語句所判斷的條件就為n<=100-m,在這里要說明,為了防止中馬,大馬的數(shù)量變?yōu)樨?fù)數(shù)這種不可能的現(xiàn)象,所以我們?cè)谥熬蛯和n的值賦值為1,最后進(jìn)入循環(huán)等式k=100-m-n,因?yàn)樾●R的數(shù)量就是剩下的數(shù)量,最后用if語句判斷他是否滿足條件,可以拖動(dòng)100擔(dān),故用if((k%2==0)&&(3*m+2*n+0.5*k==100))來進(jìn)行判斷,如果成立就輸出大馬,中馬,小馬的數(shù)量,不成立的話,在m=m+1后,重新進(jìn)入循環(huán),直到m=101,不滿足循環(huán)條件m<=100,跳出循環(huán)。并且在最后要輸出總共有幾種方法,所以在成立的后面加上sum=sum+1,來計(jì)算。
5.3.5(2)
1.編寫程序,求一正整數(shù)等差數(shù)列的前6項(xiàng)的和,該數(shù)列前4項(xiàng)之和是26,前4項(xiàng)之積是880。
2.代碼示例:
#include <stdio.h> main() {int a,b,c,d,i,sum=0;for(a=1;a<=26;a++)for(d=1;d<=26;d++){b=4*a+6*d;if(b!=26)continue;else{ c=a*(a+d)*(a+2*d)*(a+3*d);if(c!=880)continue;elsefor(i=0;i<6;i++){printf("%d,",a+i*d);sum=sum+(a+i*d);}}}printf("\n數(shù)列的前六項(xiàng)的和: %d\n",sum); }3.算法思考:這同樣是一道上for語句嵌套的結(jié)構(gòu),其中a表示首項(xiàng),d表示每一項(xiàng)增加的值,b表示前四項(xiàng)之和,c表示前四項(xiàng)之積,sum表示前六項(xiàng)之和,首先因?yàn)榍八捻?xiàng)之和為26,所以無論是a還是d都不不會(huì)超過26,故進(jìn)入循環(huán)的條件就是a(d)<=26,在進(jìn)入判斷條件,判斷他的前四項(xiàng)之和,之積是不是等于26,880.所以用的是if語句,因?yàn)榍懊娌粚?duì)的話是沒資格進(jìn)入下面一個(gè)循環(huán)的,下面一個(gè)循環(huán)則是在前者正確的基礎(chǔ)之上,來計(jì)算前六項(xiàng)之和的,所以只是一個(gè)簡(jiǎn)單的for循環(huán)。
這道題其實(shí)可以分為兩個(gè)部分來思考,前一個(gè)部分是通過循環(huán)來求出首項(xiàng)和增加值,后一部分則是一個(gè)簡(jiǎn)單的求前n項(xiàng)和。這樣思考是的一道較難的題簡(jiǎn)單化了。
5.3.5(3)
1.有30個(gè)學(xué)生一起買小吃,共花錢50元,其中,每個(gè)大學(xué)生花3元,每個(gè)中學(xué)生花2元,每個(gè)小學(xué)生花1元,問大、中、小學(xué)生的人數(shù)共有多少種不同的解(去掉某類學(xué)生數(shù)為0的解)
2.代碼示例:
#include <stdio.h> main() {int x,y,z,sum;sum;for(x=1;x<30;x++){for(y=1;y<30;y++){z=30-x-y;if((z!=0)&&(3*x+2*y+z==50)){printf("大學(xué)生%3d\t中學(xué)生%3d\t小學(xué)生%3d\n",x,y,z);sum=sum+1;}elsecontinue;}}printf("sum=sum=%d\n",sum); }3.算法思考:這道題其實(shí)和百馬百擔(dān)問題差不多,我在這里就不在贅述了。但有一點(diǎn)要說的是,這是因?yàn)樗麄儍傻南嗨菩?#xff0c;所以在他們兩其中一道題出問題的話,把他們兩進(jìn)行比較,反而會(huì)有意想不到的結(jié)果。
三、實(shí)驗(yàn)總結(jié)
要說這一次得到的東西,那就不得不說說我失去的東西,怎么說呢,在這次實(shí)驗(yàn)中,我失去了不少的頭發(fā)。這次的問題總結(jié)來說,就是大錯(cuò)沒有,小錯(cuò)不斷。所以說在自己明明感覺自己打代碼沒有錯(cuò)誤的情況下,卻還是無法顯示相同答案,于是就開始揪頭發(fā);在代碼實(shí)現(xiàn)后,自己發(fā)現(xiàn)原來就是這么一個(gè)小問題,打錯(cuò)了字母符號(hào),就又會(huì)開始揪頭發(fā),懊悔自己為什么會(huì)這么不小心,搞得損失了那么多少時(shí)間。揪著揪著就掉發(fā)了。所以我感覺這次實(shí)驗(yàn)打代碼打的讓我十分憋屈,有的必有失,我希望通過這次實(shí)驗(yàn),能不斷改善我粗心的弱點(diǎn),盡量少犯錯(cuò)誤,不犯錯(cuò)誤。
轉(zhuǎn)載于:https://www.cnblogs.com/1403262085zsl/p/10723529.html
總結(jié)
- 上一篇: URI, URL, URN
- 下一篇: adb logcat查看手机端日志