一、用for語句實現循環
二、用while循環語句實現循環
三、用do-while語句實現循環
四、用while語句和for語句配合實現循環
五、用for語句嵌套實現循環算法
掌握for語句實現循環的方法函數
循環嵌套的使用學習
掌握while語句實現循環的方法spa
進一步掌握while語句實現循環的方法設計
掌握do/while語句實現循環3d
掌握while語句和for語句配合實現循環code
掌握for語句嵌套實現循環的方法blog
掌握for語句嵌套(三層)實現循環的方法get
掌握continue語句的用法input
編寫一程序,求出1,1+2,1+2+3···數列中前n項的值。流程圖以下:
二、實驗代碼
#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(" "); printf("%d",s); j++; } }
三、問題分析
問題:這個代碼並非很難,可是我第一次輸出發現結果與結果之間沒有空格,很差分辨。
解決方法:我在代碼中加上printf(" ")。
1. 問題的簡單描述
編寫一程序,求數列1,-3!,5!,-7!……(-1)n-1(2*n-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); }
三、問題分析
第一次,我並不知道要用兩個for循環嵌套,得出的代碼與結果以下圖:
分析流程圖,發現須要用兩個for循環的嵌套。先是 i 的變換,再是 j 的變換。我按照本身的想法開始第二次實驗,結果以下:
發現得出的結果更加莫名其妙,等老師分析後,我發現 j 中只有 fac=fac*j ,由於第二個循環只和 j 相關。改進以後獲得正確答案。
一、簡單問題描述
從鍵盤上輸入若干學生的成績,統計並輸出最高成績和最低成績,當輸入負數時結束輸入。程序流程圖以下所示:
二、實驗代碼
#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); }
三、問題分析
問題:第一次敲這題時,我沒有反應過來要用if語句,後來看了流程圖,發現while循環中是真或假的判斷。
解決辦法:用上if語句if(x>max) max=x;if(x<min) min=x;。
一、簡單問題描述
求全部的水仙花數(水仙花數是一個3位數的天然數,該數各位數的立方和等於該數自己,如153爲水仙花數13+53+33=153)。程序流程圖以下所示:
二、實驗代碼
#include<stdio.h> int 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++; } }
三、問題分析
問題:第一次得出的代碼與結果以下圖所示:
我發現得出的結果超過了所規定的範圍,剛開始我覺得是while中的k值範圍錯誤,一直沒法得出正確答案。後來看了書上的流程圖提示,才發現應該將if(k=x*x*x+y*y*y+z*z*z)改成if(k==x*x*x+y*y*y+z*z*z)。
一、簡單問題描述
求知足下列不等式的n的最小值,其中,value是大於1的任何數。
1+1/2+1/3+……+1/n>value,流程圖以下所示:
二、實驗代碼
#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); }
三、問題分析
這個題目並不複雜,根據流程圖寫,並無什麼問題。
一、簡單問題描述
輸入4個數字字符,並把其轉換爲4位十進制整數後顯示出來。流程圖以下所示:
二、實驗代碼
#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; } if(k==1){ data+=(c-'0')*100; } if(k==2){ data+=(c-'0')*10; } if(k==3){ data+=(c-'0'); } } printf("Data=%d",data); }
三、問題分析
問題:在while語句中,我忘記了輸入break,結果發現我只能不停地輸入數字,而沒法輸出結果。
解決辦法:加入break,由於break意味着跳出該循環。
一、簡單問題描述
有100匹馬,要馱100擔貨物,其中,1匹大馬能夠馱3擔,1匹中馬能夠馱兩擔,兩匹小馬能夠馱1擔,請問,大馬、中馬和小馬能夠有多少種組合。程序流程圖以下所示:
二、實驗代碼
#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-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); }
三、問題分析
問題:最開始我將if條件句寫爲了if(k%2==0)&&(3*m+2*n+0.5*k==100),而後我發現程序不停報錯(以下圖),
可是我看了不少遍,發現我並無少了反括號。
解決辦法:和同窗討論後,我發現了應該將if(k%2==0)&&(3*m+2*n+0.5*k==100)改成if((k%2==0)&&(3*m+2*n+0.5*k==100)),這樣程序就能夠運行了。
一、簡單問題描述
編寫程序,求一正整數等差數列的前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); }
三、問題分析
根據書上的提示,並無遇到什麼困難。
一、簡單問題描述
有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); }
三、問題分析
這道題和百馬百擔問題類似,沒有什麼困難。
一、第一個實驗(求累加數列前n項):這個是數學中累加的算法,將k視爲項數,i爲每一項的大小,s爲從1到k的和,當k=1時,i=1,s=1;當k=2時,i=2,s=1+2;由此類推,我知道i 和 k 相等,比前一項1,s爲前(n-1)與最後一項i值相加,該代碼適合用for循環,i=i+1,s=s+i。這道題因爲用到了函數,多使用了一個頭文件<conio.h>。
二、第二個實驗(求階乘數列前n項):這是一個階乘函數,可是它和(-1)n-1結合,求前n項和。令i爲項數,j爲階乘的數,fac爲該項階乘的結果,sum爲前n項和。由流程圖可得,應該使用兩個for循環的嵌套。我列出幾項就發現了規律,j比前一項大2,fac爲前(i-1)項的乘積和i項的乘積,sum爲前(i-1)項之和與最後一項相加。可是,因爲題目與(-1)n-1結合,根據書本提示,能夠用sign改變正負。sign在C語言中表示有符號,令sign=1,進行完兩次for循環後,進行sign=-sign的變換,改變下一次的正負。若下一次遇到符號的變化也能夠用這個方法。
三、第三個實驗(統計最高分最低分):x爲輸入的分數,max爲最大值,min爲最小值,用while語句,若x<0,則直接輸出結果,x>0,則將輸入的分數兩兩相比較,輸出最大值和最小值。
四、第四個實驗(求水仙花數):這道題和以前的將三位數調換位置(如輸入「123」輸出「321」)的題目有類似之處,以前的題目是輸入一個三位數x,x除以10取餘做爲百位,x除以100的餘數再除以10取整做爲十位,再將x除以100取整做爲個位。這道題是設x,y,z爲三位數的百,十,個位, k爲水仙花數,將k除以100取整獲得x,k除以10取整後再除以10取餘獲得y,將k除以10取餘獲得z,判斷x*x*x+y*y*y+z*z*z是否與k相等。
五、第五個實驗(求不等式):這道題並非很複雜,將不等號左邊做爲一個式子求和,再與value比較,若sum<value則返回,反之,則輸出n。不等式左邊的式子求和規律第一個實驗類似。
六、第六個實驗(十進制轉換):這道題主要用到了while語句循環和if條件語句判斷。我感受這道題與第二個實驗所說的三位數互換位置是逆向思惟,這道題就是將輸入的數分別乘以1,10,100,1000,變爲一個四位數。可是,要注意規定範圍,輸入的數必須爲個位數。
七、第七個實驗(百馬百擔問題):這道題與最後一個實驗(食品分配問題)是相似的,設大馬m匹,中馬n匹,小馬k匹。由題意可得方程m+n+k=100,3m+2n+1/2k=100,因爲兩匹小馬只能馱一擔,因此k必須爲偶數,即k%2=0。使用兩個for循環的嵌套,先是大馬的變換,再是中馬,小馬,判斷是否知足方程組,知足則輸出結果。
八、第八個實驗(求等差數列):設a爲首項,b爲前四項之和,c爲前四項之積,d爲公差,可獲得方程組b=4*a+6*d,c=a*(a+d)*(a+2*d)*(a+3*d)。由題意可得b=26,c=880,因此a,d要小於26。是用for循環,就能夠得出結果。
九、此次的實驗其實都不復雜,可是有不少經典的算法,感受很重要,並且要有數學習慣,注意變量的取值範圍,若是沒有課本的提示,我可能會忽略不少。