第三次實驗報告
C程序設計實驗報告
實驗項目:
1、用for語句實現循環
2、用while循環語句實現循環
3、用do_while語句實現循環
4、用while語句和for語句配合實現循環
5、用for語句嵌套實現循環
姓名:李小玲 實驗地點:教學樓514教室 實驗時間:2019.4.17
一、實驗目的與要求
1、掌握for語句實現循環的方法。
2、掌握while循環語句實現循環的方法。
3、掌握do/while循環語句實現循環的方法。
4、掌握用while語句和for語句配合實現循環的方法。
5、掌握for語句嵌套實現循環的方法。
二、實驗內容
1、實驗5.3.1
1.問題的簡單描述:編寫一程序,求出1,1+2,1+2+3……數列中前n項的值。
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++; } }
分析:我的話會先整個看一下代碼,理清一下算法的思路,然後再看這個代碼中少的部分的是什麽,這題的話,比較簡單,就是填一個怎麽計算第i項的值。
1.問題的簡單描述:編寫一程序,求數列1,-3!,5!,-7!……(-1)^(n-1)*(2n-1)前n項的和。n的值由鍵盤輸入。
#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); }
分析:這題的話,我卡了挺久的,首先我看了下流程圖,然後我就弄混了sign和j表示的意思,後面才發現;我覺得像這種有點難的題目,還是要找規律,比如sign表示的正負,一正一負,規律比較好找;然後就是累乘的公式,跟數學的數列還是很像的,最後的話就是
{fac=fac*j;}別忘了,它是累乘的表達,後面是fac是包括正負。對了,不懂的地方可以看流程圖!!可以看下你的算法有沒有錯。
2、實驗5.3.2
1.問題的簡單描述:從鍵盤輸入若幹學生的成績,統計並輸出最高成績和最低成績,當輸入負數時結束輸入。
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); }
分析:這題的話,其實不是很難,要會用while的用法,用while語句判斷下分數應該滿足的條件,再用for循環計算第n項,和前n項的和。
1.問題的簡單描述:求所有的水仙花數(水仙花數是一個3位數的自然數,該數各位數的立方和等於該數本身,如153為水仙花數1*1+5*5+3*3=153)
#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++; } }
分析:前面的看k<=999,是判斷它是三位數,然後的話就是x,y,z表示的百位,十位,個位的求法,最後的話就是判斷這三個位數要滿足水仙花數(三位數100—999)的條件,用if判斷的時候,等於要記得用兩個==,我一開始就是沒有用兩個等號,然後沒有出答案。
3、實驗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); }
分析:因為是大於1的任何數,所以用float型定義,然後sum是計算出左邊循環的每一項,最後再用一個if語句與輸入的value的值比較。
4、實驗5.3.4
1.問題的簡單描述:輸入4個字符,並把其轉換為4位十進制整數後顯示出來。
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; } switch(k) { case 0:data+=(c-‘0‘)*1000;break; case 1:data+=(c-‘0‘)*100;break; case 2:data+=(c-‘0‘)*10;break; case 3:data+=(c-‘0‘);break; } } printf("Data=%d",data); }
分析:首先用if語句判斷輸入的是不是字符,在判斷是不是在0-9之間,再將他們轉化為十進制整數(乘1000,100,10,0),後面輸出;我的話就是用了一個switch結構表示表示k,並且!不要將data看成date,我一直沒看到,然後就一直報錯,雖然是小錯誤,但是確實要找錯的時候不好找。
5.實驗5.3.5
1.問題的簡單描述:有100匹馬。要馱100擔貨物,其中,1匹大馬可以馱3擔,1匹中馬可以馱2擔,兩匹小馬可以馱1擔,請問,大馬、中馬和小馬可以有多少種組合。
2.實驗代碼:
#include<stdio.h> main() { int m,n,k; int sum; printf("各種駝法如下:\n") ; for (m=1;m<=100;m++) for (n=1;n<=100-m;n++) {k=100-m-n; if ((k%2==0)&&(3*m+2*n+0.5*k==100)) { printf("大馬%3d匹;中馬%3d匹;小馬%3d匹.\n",m,n,k); sum++; } } printf("共有%d種駝法.\n",sum); }
分析:這個是先設大馬的m數量是一,然後n也是從一開始的,依次累加,再就是找出大馬中馬小馬滿足的關系式,匹數和所駝的質量,用for語句表達,再就是要註意兩匹小馬才馱一擔,所以k要是個偶數,然後其他的問題不大,我自己的話也是漏掉了k要是偶數這個條件,後面看流程圖才發現的。
1.問題的簡單描述:編寫程序,求一正整數等差數列的前6項的和,該數列前4項之和是26,前4項之積是880。
#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; else for(i=0;i<6;i++) { printf("%d,",a+i*d); sum=sum+(a+i*d); } } } printf("\n數列的前六項的和:%d\n",sum); }
分析:因為這是個等差數列,a,b,c,d,i,分別表示首項,前四項和,前四項積,差值,項數,然後用等差數列的方法可以求得每一項,再用計算機語言算出它的和,積,最後輸出結果,並不會很難。
1.問題的簡單描述:有30個學生一起買小吃,共花錢50元,其中,每個大學生花3元,每個中學生花2元,每個小學生花1元,問大、中、小學生的人數共有多少種不同的解(去掉某類學生數為0的解)
#include<stdio.h> main() { int x,y,z,sum; sum=0; 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("大學生%3d\t中學生%3d\t小學生%3d\n",x,y,z); sum=sum+1; } else continue; } } printf("sum=%d\n",sum); }
分析:這個問題和百馬百擔的問題很像,不同的就是每個小學生花的是一塊錢,然後定義的x,y,z都不為零;只要在if語句上加上z不等於0 就好,因為 x,y都是從一開始的,按照百馬百擔思路是沒有問題的。
三、實驗總結
這次實驗課的話可能實驗個數比較多,但是還是有幾個比較簡單的,思路比較明確,比較難的可能是計算數列前n項和的和百馬百擔問題,反正我自己的話卡了挺久的,這兩個問題一個是考慮正負以及找出累乘的規律,另一個的話就是搞懂這個算法的意思,順著它的思路做下去;然後我一上午下來,對於for語句和while語句這兩個更加熟練一點點了;再就是,我註釋的習慣還是沒有,打字速度也是令人窒息,打出來的c語言的句子他們都說醜,我覺得我改正的空間還是很大的,我會慢慢的更正這些。
第三次實驗報告