1. 程式人生 > >第三次實驗報告

第三次實驗報告

n-1 怎麽 不同 目的 scanf () for循環 用法 har

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語言的句子他們都說醜,我覺得我改正的空間還是很大的,我會慢慢的更正這些。

第三次實驗報告