第三次作業
作業要求:https://edu.cnblogs.com/campus/hljkj/CS201801/homework/2359
第一題
7-3 統計學生平均成績與及格人數
本題要求編寫程序,計算學生們的平均成績,並統計及格(成績不低於60分)的人數。題目保證輸入與輸出均在整型范圍內。
輸入格式:
輸入在第一行中給出非負整數N,即學生人數。第二行給出N個非負整數,即這N位學生的成績,其間以空格分隔。
#include<stdio.h> int main() { int i=1; int grade=0,total=0; int count=0; double average=0,N=0; scanf("%lf",&N); for(i=1;i<=N;i++){ scanf("%d",&grade); total=total+grade; average=1.0*total/N; if(grade>=60){ count++; } } printf("average = %.1f\n",average); printf("count = %d\n",count); return 0; }
編程思路:
第一:定義整型變量i=1,grade=0,total=0;定義浮點型變量average=0,N=0。
第二:輸入所要統計的學生人數。
第三:使用for循環,使其循環輸入成績,並疊加成績求平均值。在for循環中嵌套if語句,若成績及格則使及格人數+1。
第四:輸出平均數,並保留一位小數;輸出及格人數。
流程圖:
調試運行過程:
一開始運行就發現成績可以不斷輸入,不輸出結果;
接着我判斷是循環語句出現毛病;
於是進行調試;
經調試發現與想象的一樣;
經過修改,成功輸出結果。
調試過程中發現 i 不產生變化
經修改發現是表達式3(i=i++)有誤,修改過后為(i++)正確輸出。
因為這次經驗,我發現,原來一個小小的錯誤就能使程序不能產生所預期的效果,以后應該更小心謹慎。
第二題
7-1 求整數的位數及各位數字之和
對於給定的正整數N,求它的位數及其各位數字之和。
編程思路:
一開始我是這么想的,在for循環語句中找額外兩個數字來作為取余(eg:a=x%10),和進位 (eg;b=x/10),然后把b的值賦給a ;
然后就是用算法 sum=sum+a 來求各數字之和;
第三步就是該數字位數的計算(count++),但又感覺哪里不對,想了想發現for循環中{ y=x%10; x=x/10; sum=sum+y;count++; }可以少定義一個變量;
最后就是輸出位數count和位數和sum。
(自己應該多注意一下算法,學好了算法,相同功能的程序可以減少不少的代碼。)
編程代碼:
#include<stdio.h> #include<math.h> int main() { int x=0,y=0; int count=0,num=0; scanf("%d",&x); for(;x<=10^9&&x>0;){ y=x%10; x=x/10; num=num+y; count++; } printf("%d %d",count,num); return 0; }
流程圖:
編譯過程:
運行了一下,結果正確
接下來進行調試看變量的變化,一開始我就已經把要查看的變量都添加了,下面是調試到輸入x的一張截圖
最后運行正確
第三題
7-1 統計素數並求和
本題要求統計給定整數M和N區間內素數的個數並對它們求和。
輸入格式:
輸入在一行中給出兩個正整數M和N(1<=M<=N<=500)。
小抱怨(題目很簡單,加上標點符號也就28個字,但是讓我做了一個多小時才把這個題目寫出來,不斷的修改)
編程思路:
首先還是打出程序框架,定義變量x,i,sum,count,M和N,手動輸入M,N的值;
其次先寫一個for循環(用來循環從數字M到N)放在條件語句if(1<=M<=N<=500)中,這是因為輸入格式要求1<=M<=N<=500;
然后在之前那個for循環就管它叫大for中嵌套一個條件語句若M=1,則把2賦給M(這是因為1不是素數,我就主動跳過1);
接着我是這么想的,題目讓我判斷M到N的所有素數,於是我就寫一個小循環嵌套在大for循環中來判斷x是不是素數,並且在小循環前,在條件語句if(M==1)后先自己定義變量sb並把值1賦給它,用來假定它是素數,如果x%i==(i為從2開始到x/2的數),就把0賦給sb,並斷開這個小循環;
倒數第二就是再寫一個條件語句放在小for后面將其和之前定義的sb配合起來使用,里面用count++;與sum=sum+x;來計算素數個數與素數的和;
最后輸出count與sum;結束。
編程代碼:
#include<stdio.h> int main() { int M=0,N=0; int sum=0,count=0; int i=0,x=0; scanf("%d %d",&M,&N); if(1<=M<=N<=500){ if(M==1){ M=2; } for(x=M;x<=N;x++){ int sb=1; for(i=2;i<=x/2;i++){ if(x%i==0){ sb=0; break; } } if(sb==1){ count++; sum=sum+x; } } } printf("%d %d",count,sum); return 0; }
流程圖:
調試過程:
第一遍把代碼敲好了以后,出現了這種情況,輸出素數個數對,但是和錯了,懷疑是判斷錯素數了
一番調試后,發現是素數判斷錯了,如圖下(具體是else判斷錯誤,然后把1賦給sb)
於是我又進行修改,修改判斷素數的小for循環,但是這次又多了一個毛病,1不是素數,程序也判斷1為素數,
其他的沒毛病
多增加了一個條件語句,如果M=1,就把2賦給M(調試成功)
總結:
上次寫博客園到這次,之間初步認識了循環,然后有點入門,到現在老師給的題目基本上一給腦袋就有思路,然后就能敲出代碼,但是會有小瑕疵,程序經常會漏東西,然后答案經常離正確答案差一點,應該就是邏輯思維能力還有算法的問題,自己把老師上課教的都能都應用,但是有一些理論的東西還是沒有學好,給同學講題的時候,就會出現專業術語,還有表露不清晰 。
接下來我應該看點理論書,還是多看看翁凱老師的慕課。
遇到困難基本上都是先自己琢磨,然后把自己整廢了,再去上網搜或是和同學討論,向別人請教。
循環很好用,也很難。這次又多學了函數,學到的越多越感覺自己和別人的差距越大。
點評博客:
https://www.cnblogs.com/zduangduang/p/10022227.html