實驗報告(2019年4月17日)
c程序實驗報告
姓名:黃誌乾????實驗地點:教學樓514教室????實驗時間:4月17日
實驗項目:
???1、用for語句實現循環
???2、用while循環語句實現循環
???3、用do-while語句實現循環
???4、用while語句和for語句配合實現循環
???5、用for語句嵌套實現循環
一、實驗目的與要求
1.用for語句實現循環
● 掌握c語言邏輯運算和關系運算的規則
● 掌握for語句實現循環的方法
● 循環嵌套的使用
2.用while循環語句實現循環
● 掌握while語句實現循環的方法
● 進一步掌握while語句實現循環的方法
3.用do-while語句實現循環
● 掌握do/while語句實現循環
4.用while語句和for語句配合實現循環
●掌握while語句和for語句配合實現循環
5.用for語句嵌套實現循環
● 掌握for語句嵌套實現循環的方法
● 掌握for語句嵌套(3層)實現循環的方法
● 掌握continue語句的用法
二、實驗內容
1.實驗練習:5.3.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+j; printf(" %d",s); j++; } }
運行結果
問題:
無
2.實驗練習:5.3.1(2)
問題描述:
編寫一程序,求數列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); }
運行結果
問題:
在做這個實驗時,輸出的結果與正確結果相反,本來應為正的顯示是負的。對於這道題首先明確for循環中i和j代表的含義,可知內循環為階乘的運算,所以階乘前的正負有項數決定,其次是運算的順序,sign值的改變需要在階乘運算以後,這也是符號錯誤的原因
3.實驗練習:5.3.2
問題描述:
從鍵盤上輸入若幹學生的成績,統計並輸出最高成績和最低成績,當輸入負數時結束輸入。。
流程圖
實驗代碼
#include<stdio.h>
#include<conio.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);
}
運行結果
問題:無
4.實驗練習:5.3.2(2)
問題描述:
求所有的水仙花數(水仙花數是一個3位數的自然數,該數各位數的立方和等於該數本身,如153位水仙花數1^3+5^3+3^3=15)。
流程圖
實驗代碼
#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++;
}
}
運行結果
問題:
無
6.實驗練習:5.3.3
問題描述:
求滿足下列不等式的n的最小值,其中,value是大於1的任何數。
流程圖
實驗代碼
#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);
}
運行結果
問題:
無
7.實驗練習:5.3.4
問題描述:
輸入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;
else if(k==1)
data+=(c-'0')*100;
else if(k==2)
data+=(c-'0')*10;
else if(k==3)
data+=(c-'0');
}
printf("Data=%d",data);
}
運行結果
問題:
無
7.實驗練習:5.3.5
問題描述:
有100匹馬,要馱100擔貨物,其中一匹大媽可以馱三擔,一匹中馬可以馱兩擔,兩匹小馬可以馱一擔,請問,大馬、中馬和小馬可以有多少種組合。
流程圖
實驗代碼
#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+k/2==100))
{
printf("大馬%3d匹;中馬%3d匹;小馬%3d匹。\n",m,n,k);
sum++;
}
}
printf("共有%d種馱法。\n",sum);
}
運行結果
問題:
這個程序並不難,主要在於算法,算法通過兩個for循環,循環大馬與中馬的數量,可以通過大馬中馬數量得出小馬數量,然後判斷等式是否成立,如果成立就輸出
7.實驗練習:5.3.5(2)
問題描述:
編寫程序,求以正整數等差數列的前6項。
流程圖
實驗代碼
#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數列的前6項的和:%d\n",sum);
}
運行結果
問題:
這道題並不難在運行該程序時沒出錯。主要要搞清楚算法,首先搞清楚變量代表的含義,a代表首項,d代表公差,所以前4項和為4a+6d,通過a和d的循環得出a和d的值,後根據等差數列特效依次輸出
7.實驗練習:5.3.5(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);
}
運行結果
問題:
這道題與大馬小馬一樣,通過循環大學生與中學生的數量,得出小學生的數量,並判斷等式是否成立後依次輸出成立的值
三、實驗小結
本次實驗課需要完成的實驗數目較多,但是難度並不大,在算法上相較之前較難,其次是語句的嵌套,對於嵌套首先要搞清楚內外循環,哪些循環的運算需要用在外循環中,哪些用在內循環中都會對程序的結果產生很大的影響所以在編寫程序時最好先畫一個流程圖。
實驗報告(2019年4月17日)