第三次作業


第三次作業

作業要求: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

https://www.cnblogs.com/yangzhenghui/p/10022270.html

https://www.cnblogs.com/chengxu230921/p/10017973.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM