C程序設計實驗報告
姓 名:賴瑾
實驗地點:家
實驗時間:2020年4月9日
實驗項目:5.3.1練習2 求數列的前n項和
5.3.2練習2 求水仙花數
5.3.4 十進制轉換
5.3.5練習1 百馬百擔問題
5.3.5練習2 求等差數列
5.3.5練習3 食品分配問題
九九乘法表的實現
一、實驗目的與要求
1.熟練地掌握while,do while及for語句實現循環的方法。
2.了解3種循環語句的區別和轉換、各自的適應性、循環嵌套的使用。
3.掌握如何在循環語句種使用break,continue語句,改變程序流程。
4.掌握在程序設計種用循環的方法實現各種算法。
二、實驗內容
(1)5.3.1練習2 求數列的前n項和
1、問題的簡單描述:編寫程序,求數列1, -3!,5!,-7!,.. (-1)^(n-1)*(2n-1)!前n項的和。n的值由鍵盤輸人。
2、流程圖:
3、實驗代碼:
#include<stdio.h>
main()
{
int n,i,j=1,sign=1;
float fac,sum;
printf("Please input value of n(n<18):");
scanf("%d",&n);
sum=0.0;
for(i=1;i<=2*n-1;i=i+2)
{
fac=1.0;
for(j=1;j<=i;j++)
{
fac=fac*j;
}
fac=fac*sign;
sum=sum+fac;
sign=-sign;
}
printf("sum=%.0f\n",sum);
}
4、問題:剛開始沒有理清思路,直接改變了sum的正負而不是fac的正負導致結果錯誤
5、分析:要養成先理清思路再開始寫代碼的習慣
(2)5.3.2練習2 求水仙花數
1、問題的簡單描述:求所有的水仙花數(水仙花數是-一個3位自然數,該數各位數的立方和等於該數本身,如153為水仙花數13+53+3^3=153 )。
2、流程圖:
3、實驗代碼:
#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++;
}
}
4、問題:剛開始想了一下怎么確定三位數然后分別求個十百位的數也又想了一會兒。
5、分析:可以動一下筆輔助思考。
(3)5.3.4 十進制轉換
1、問題的簡單描述:輸入4個字符型數字,並把其轉換為十進制整數后顯示出來。
2、流程圖:
3、實驗代碼:
#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("Date=%d",data);
}
4、問題:對while語句和字符不夠熟悉,()里不是0即為真
5、分析:遇到問題才能發現自己存在的問題,剛開始看到這個題目沒懂什么意思看了書上的流程圖才明白。
(4)5.3.5練習1 百馬百擔問題
1、問題的簡單描述:有100匹馬,要駝100擔貨物。其中一匹大馬可以駝3擔貨物,一匹中馬可以駝兩擔貨物,兩匹小馬可以駝1擔貨物。求所需要的大罵,中馬和小馬可以有多少種組合。
2、流程圖:
3、實驗代碼:
#include<stdio.h>
main()
{
int m,n,k; //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&&m*3+n*2+k/2==100)
{
printf("大馬%3d匹;中馬%3d匹;小馬%3d匹.\n",m,n,k);
sum++;
}
}
printf("共有%d種馱法。\n",sum);
}
4、問題:關於條件k%2==0
5、分析:剛開始覺得不需要判斷k%2==0
,因為從數學角度如果k%2!=0的話后面那個條件是一定不成立的,但是這里k/2,不管k是不是奇數都會是整數,所以需要這個條件。
(5)5.3.5練習2 求等差數列
1、問題的簡單描述:有一正整數等差數列,已知該數列前4項之和等於26,前4項之積等於880。求該等差數列前6項的值及前6項的和。
2、流程圖:
3、實驗代碼:
#include<stdio.h>
main()
{
int a,b,c,d,i,sum=0; //a為首項,d為公差,b為前n項和,c為前n項積
for(a=1;a<=26;a++)
for(d=1;d<=26;d++)
{
b=4*a+6*d;
c=a*(a+d)*(a+2*d)*(a+3*d);
if(b==26&&c==880)
{
printf("數列的初值為a=%d,差值為d=%d\n",a,d);
printf("\n數列前六項的值:");
for(i=0;i<6;i++)
{
printf("%d ",a+i*d);
sum=sum+(a+i*d);
}
printf("\n");
}
}
printf("\n數列的前六項的和:%d\n",sum);
}
4、問題:對for嵌套不太熟
5、分析:多應用
(6)5.3.5練習3 食品分配問題
1、問題的簡單描述:有30個學生一起買小吃,共花費50元。其中,每個大學生花3元,每個中學生花2元,每個小學生花1元。求大,中,小學生的人數分配共有多少種不同的組合,(不計算某類學生為0的組合)。
2、流程圖:
3、實驗代碼:
#include<stdio.h>
main()
{
int x,y,z,sum; //x為大學生,y為中學生,z為小學生
sum=0;
for(x=1;x<30;x++)
{
for(y=1;y<30;y++)
{
z=30-x-y;
if(x*3+y*2+z==50) // 條件為總共的費用
{
printf("大學生%3d\t 中學生%3d\t 小學生%3d\n",x,y,z);
sum=sum+1;
}
}
}
printf("共有%d種不同的組合。\n",sum);
}
4、問題:跟練習1是類似題型
5、分析:沒什么問題
九九乘法表的實現
1.設計思路:跟上次畫三角形差不多,用for嵌套實現,內層控制列,外層控制行
2.流程圖:
3.代碼:
#include<stdio.h>
main()
{
int i,j;
for(i=1;i<=9;i++)
{
for(j=1;j<=i;j++)
printf("%d*%d=%d\t",j,i,i*j);
printf("\n");
}
}
4.設計中遇到的問題及解決辦法:先畫流程圖還是比較重要的,這樣寫代碼會快很多,但是用電腦寫流程圖比較難控制那個箭頭,需要再練習一下。
四、實驗小結
這次實驗課發現的主要問題就是要先構思清楚(畫流程圖之類)再寫代碼,之前的程序都比較簡單,大概想一下就直接寫也沒什么問題,現在嵌套多了起來,如果不先理清思路就容易寫着寫着代碼就懵😵了,然后目前電腦畫流程圖需要比較久,可以先用紙筆寫一下大概思路就比較清楚了。然后還要一個需要注意的問題/
這個除法得到的是整數。