第三次实验报告

C程序设计实验报告

姓名:杨怡程 实验地点:524教室 实验时间:5.6

一、实验目的与要求
1、用for语句实现循环
2、用while循环语句实现循环
3、用do-while语句实现循环
4、用while语句和for语句配合实现循环
5、用for语句嵌套实现循环

二、实验内容

  • 实验项目 5.3.1

代码:

#include<stdio.h>
#include<conio.h>
main()
{
	int n,k,s=0;
	printf("Enter a number:");
	scanf("%d",&n);
	for(k=1;k<=n;k++)
	{
		s=s+k;
		printf(" ");
		printf("%d",s);
		
	}
}

问题描述:这个代码并不是很难,但是我第一次输出发现结果与结果之间没有空格,不好分辨。

解决方法:我在代码中加上printf(" ")。

  • 实验项目 5.3.1练习

代码:

#include<stdio.h>
main()
{
	int n,i,j,sign=1;
	float fac,sum;
	printf("please inout 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*=j;
		}
		fac=fac*sign;
		sum+=fac;
		sign=-sign;
	}
	printf("sum=%.0f\n",sum);
}

问题描述:第一次,我并不知道要用两个for循环嵌套。

  • 实验项目 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);
}

问题描述: 第一次敲这题时,我没有反应过来要用if语句,后来看了流程图,发现while循环中是真或假的判断。

解决办法:用上if语句if(x>max) max=x;if(x<min) min=x;。

  • 实验项目 5.3.2水仙

代码:

#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++;
		}
}

问题描述:本题无较大问题。

  • 实验项目 5.3.3

代码:

#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

代码:

#include<stdio.h>
main()
{
	char c;
	int k,data;
	data=0;
	for(k=0;k<4;k++)
	{
		while(k<4)
		{
			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练习2

代码:

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

问题描述:本题无较大问题。

  • 实验项目 5.3.5练习3

代码:

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

问题描述:这道题和百马百担问题相似,没有什么困难。

  • 实验项目 5.3.5

代码:

#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%20)&&(3m+2n+0.5*k100),然后我发现程序不停报错但是我看了很多遍,发现我并没有少了反括号。

解决办法:和同学讨论后,我发现了应该将if(k%20)&&(3m+2n+0.5*k100)改为if((k%20)&&(3m+2n+0.5*k100)),这样程序就可以运行了。

  • 实验项目 九九乘法表

代码:

#include<stdio.h>
main()
{
	int i,j;
	for(i=1;i<=9;i++)
	{
		for(j=1;j<=i;j++)
		printf("%d\t",i*j);
		printf("\n");
	}
 } 

问题描述:本题基本无问题。

三、实验小结

1、第一个实验(求累加数列前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>。

2、第三个实验(统计最高分最低分):x为输入的分数,max为最大值,min为最小值,用while语句,若x<0,则直接输出结果,x>0,则将输入的分数两两相比较,输出最大值和最小值。

3、第五个实验(求不等式):这道题并不是很复杂,将不等号左边作为一个式子求和,再与value比较,若sum<value则返回,反之,则输出n。不等式左边的式子求和规律第一个实验相似

4、第九个实验(百马百担问题):这道题与最后一个实验(食品分配问题)是类似的,设大马m匹,中马n匹,小马k匹。由题意可得方程m+n+k=100,3m+2n+1/2k=100,由于两匹小马只能驮一担,所以k必须为偶数,即k%2=0。使用两个for循环的嵌套,先是大马的变换,再是中马,小马,判断是否满足方程组,满足则输出结果。

posted @ 2021-05-11 21:16  逆刃  阅读(69)  评论(1)    收藏  举报