第三次實驗報告

第三次實驗報告

C程序設計實驗報告

實驗項目:

一、用for語句實現循環
二、用while循環語句實現循環
三、用do-while語句實現循環
四、用while語句和for語句配合實現循環
五、用for語句嵌套實現循環
算法

姓名:徐溢璠     實驗地點: 514實驗室       實驗時間:2019年4月17日

1、實驗目的與要求

一、用for語句實現循環

  • 掌握for語句實現循環的方法函數

  • 循環嵌套的使用學習

二、用while循環語句實現循環

  • 掌握while語句實現循環的方法spa

  • 進一步掌握while語句實現循環的方法設計

三、用do-while語句實現循環

  • 掌握do/while語句實現循環3d

四、用while語句和for語句配合實現循環

  • 掌握while語句和for語句配合實現循環code

五、用for語句嵌套實現循環

  • 掌握for語句嵌套實現循環的方法blog

  • 掌握for語句嵌套(三層)實現循環的方法get

  • 掌握continue語句的用法input

2、實驗內容

5.3.1  用for語句實現循環

實驗練習1:求數列前n項

1. 問題的簡單描述

編寫一程序,求出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(" ")。

實驗練習2:求數列前n項的和

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 相關。改進以後獲得正確答案。

5.3.2  用while循環語句實現循環

實驗練習1  統計學生的最高最低成績

一、簡單問題描述

從鍵盤上輸入若干學生的成績,統計並輸出最高成績和最低成績,當輸入負數時結束輸入。程序流程圖以下所示:

二、實驗代碼

#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;。

實驗練習2  求水仙花數。

一、簡單問題描述

求全部的水仙花數(水仙花數是一個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)。

5.3.3  用do-while語句實現循環

實驗練習  求不等式。

一、簡單問題描述

求知足下列不等式的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);
}

三、問題分析

這個題目並不複雜,根據流程圖寫,並無什麼問題。

5.3.4  用while語句和for語句配合實現循環

實驗練習  十進制轉換。

一、簡單問題描述

輸入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意味着跳出該循環。

5.3.5  用for語句嵌套實現循環

實驗練習1  百馬百擔問題。

一、簡單問題描述

有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)),這樣程序就能夠運行了。

實驗練習2  求等差數列。

一、簡單問題描述

編寫程序,求一正整數等差數列的前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);
}

三、問題分析

根據書上的提示,並無遇到什麼困難。

實驗練習3  食品分配問題。

一、簡單問題描述

有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);
}

三、問題分析

這道題和百馬百擔問題類似,沒有什麼困難。

3、實驗小結

 

一、第一個實驗(求累加數列前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循環,就能夠得出結果。

九、此次的實驗其實都不復雜,可是有不少經典的算法,感受很重要,並且要有數學習慣,注意變量的取值範圍,若是沒有課本的提示,我可能會忽略不少。

相關文章
相關標籤/搜索