第三次实验报告

C程序设计实验报告

实验项目: 循环结构实验

姓名: 王雨晴 实验地点: 514物联网实验室 实验时间:2019年4月17日

一、实验目的和要求

  1、熟练掌握while、do while及for语句实现循环的方法。
  2、了解3种循环语句的区别和转换、各自的适应性、循环嵌套的使用。
  3、掌握如何在循环语句中使用break和continue语句,改变程序流程。
  4、掌握在程序设计中用循环的方法实现各种算法。

一、实验项目:

1、用for语句实现循环
2、用while循环语句实现循环
3、用do-while语句实现循环
4、用while语句和for语句配合实现循环
5、用for语句嵌套实现循环

二、实验目的与要求

1、用for语句实现循环
•掌握for语句实现循环的方法
•循环嵌套的使用

2、用while循环语句实现循环
•掌握while语句实现循环的方法
•进一步掌握while语句实现循环的方法

3、用do-while语句实现循环
•掌握do/while语句实现循环

4、用while语句和for语句配合实现循环。
•掌握while语句和for语句配合实现循环

5、用for语句嵌套实现循环
•掌握for语句嵌套实现循环的方法
•掌握for语句嵌套(三层)实现循环的方法
•掌握continue语句的用法

二、实验内容

1、实验练习:5.3.1 实验练习1 求数列前n项

1问题的简单描述:
编写一程序,求出1,1+2,1+2+3...数列中前n项和的值。
2流程图:

3、实验代码

#include<stdio.h>
int 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\t",s);
 	j++;
 }
 return 0;
}

4、问题分析:
这个编程用到的是累加的思想,每循环一次s的值都是前面的项的和。这个题比较简单

运行结果

2、实验练习:5.3.1 实验练习2 求数列前n项的和

1问题的简单描述:
编写一程序,求数列1,-3!,5!,-7!...(-1)^(n-1)(2n-1)!前n项的和。n的值由键盘输入。
2流程图:

3、实验代码

#include<stdio.h>
int main()
{
	int n,i=1,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=%0.f\n",sum);
}

4、问题分析
这个题目是将求阶层和数列和结合在一起,阶层的方法用到了后面学得递归思想,奇数的值是正数,偶数的值为负数,sign=-sign;这里就实现了。
运行结果

3、实验练习:5.3.2 实验练习1 统计学生的最高最低成绩

1问题的简单描述:
从键盘上输入若干学生的成绩,统计并输出最高成绩和最低成绩,当输入负数时结束输入。
2、流程图:

3、实验代码

#include<stdio.h>
int main()
{
 float x,max,min;
 printf("plerse 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、问题分析
开始先给max和min赋值,然后让输入的值与其相比较大小,从而确定最大值和最小值。
运行结果

4、实验练习:5.3.2 实验练习2 求水仙花数

1问题的简单描述:
求所有的水仙花数(水仙花数是一个3位数的自然数,该数各位数的立方和等于该数本身,如153为水仙花数13+53+3^3=153)。
2流程图:

3、实验代码

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

4、问题分析
首先要明确什么叫做水仙花数,水仙花数是一个三位数的数,这是一个大前提,该数各位数的立方和等于该数本身。所以我们要知道如何把各位数的值表示出来。这里我用的是正数型的除法和模运算来实现的。用while语句同时满足上面俩个条件的数才会被输出。
运行结果

5、实验练习:5.3.3 用do-while语句实现循环

1问题的简单描述:
求满足下列不等式的n的最小值,其中,value是大于1的任何数。
1+1/2+1/3+...+1/n>value
2流程图:

3、实验代码

#include<stdio.h>
int 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);
}

4、问题分析
其实也是一个求和,不等式左边的和大于右边时n的最小值为多少。
运行结果

6、实验练习:5.3.4 用while语句和for语句配合实现循环

1问题的简单描述:
输入4个数字字符,并把其转换为4位十进制整数后显示出来。
2流程图:

3、实验代码

#include<stdio.h>
int 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);
}

4、问题分析
十进制的转换,输入四个数字字符将依次输入的字符转化为十进制的数字就要扩大到相应位子上的倍数,四位数千百十个,一次1000,100.、10,1
运行结果

7、实验练习:5.3.5 实验练习1 百马百担问题

1问题的简单描述:
有100匹马,要驮100担货物,其中,1匹大马可以驮3担,1匹中马可以驮2担,两匹小马可以驮1担,请问,大马、中马和小马可以有多少种组合。
2流程图:

3、实验代码

#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))
   	 {
    sum++;
   	printf("大马%3d匹;中马%3d匹; 小马%3d匹.\n",m,n,k);
   }	   
 }
 printf("共有%d种驮法。\n",sum);	
}

4、问题分析
这是个应用题,for语句的嵌套使用,同时使用continue语句,满足条件的方式输出,三种马加起来总共100匹,要驮的重物也是100担,而大马可以3担,中马是俩担,而小马是每俩匹担一旦。找到其条件就可以了。
运行结果

8、实验练习:5.3.5 实验练习2 求等差数列

1问题的简单描述:
编写程序,求一正整数等差数列的前6项的和,该数列前4项之和是26,前4项之积是880。
2流程图:

3、实验代码

#include<stdio.h>
int 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);
}

4、问题分析
求等差数列
前四项之和为26,前四项之积为880求等差数列的前六项和前六项之和。(?)
运行结果

9、实验练习:5.3.5 实验练习3 食品分配问题

1问题的简单描述:
有30个同学一起买小吃,共花钱50元,其中,每个大学生花3元,每个中学生花2元,每个小学生花1元,问大、中、小学生的人数分配共有多少种不同的解(去掉某类学生数为0的解)?
2流程图:

3、实验代码

#include<stdio.h>
int 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);
}

4、问题分析
这个题目和马挑担的题目很相像,主要分析出他们要满足的条件就可以了。
运行结果

三、实验小结

 上实验课的思路很多时候都会被书上给出的流程图带节奏,自己还没来得及想,思路就已经是在想我要怎么把流程图换成代码敲出来,完全没有了自己算法的思维,这样很可怕~~~

所以我们要在上机前来看看我们课上要写的编程题,但是这个还是会有难度的~~所以尽量做到课前的预习。多花时间,多花时间。

posted @ 2019-04-27 21:58  太阳嘿  Views(433)  Comments(0Edit  收藏  举报