第三次实验报告
实验项目:
1.用for语句实现循环
2.用while循环语句实现循环
3.用do-while语句实现循环
4.用while语句和for语句配合实现循环
5.用for语句嵌套实现循环
姓名:袁诚 实验地点:教学楼514教室 实验时间:4月17日
一、实验目的与要求
1.用for语句实现循环
·掌握for语句实现循环的方法。
2.用while循环语句实现循环
·掌握while语句实现循环的方法。
3.用do-while语句实现循环
·掌握do/while语句实现循环的方法。
4.用while语句和for语句配合实现循环
·掌握while语句和for语句配合实现循环的方法。
5.用for语句嵌套实现循环
·掌握for语句嵌套实现循环的方法。
二丶实验内容
5.3.1实验练习
1.问题描述
一:编写一程序,求出1,1+2,1+2+3…数列中前n项的值。程序流程图如图5-1所示。
二:编写一程序,求数列1,-3!,5!,-7!……(-1)^(n-1)*(2n-1)前n项的和。n的值由键盘输入。
2.实验代码
#include <stdio.h>
main()
{
int i,j,s;
s=0;
printf("Enter a number:");
scanf("%d",&i);
if(i<=0)
{
printf("输入数据有误,请重新输入!");
}
else
{
for(j=1;i>=j;j++)
{
s=s+j;
printf("%d ",s);
}
}
}
#include<stdio.h>
main()
{
int i,j,k,z,y,sum;
sum=0;
printf("Please input value of n:");
scanf("%d",&i);
if(i<=0)
{
printf("输入数据有误,请重新输入!");
}
else
{
for(j=1;j<=i*2-1;j=j+2)
{
k=1;
y=1;
for(z=1;j>=z;z++)
{
y=y*z*k;
k=-k;
}
sum=sum+y;
}
printf("%d",sum);
}
}
3.问题分析
问题:实验二的输出的结果总是不正确。
解决方法:将k与y等于1的赋值放在外部的for中,使其每一次循环都可以让k与y的值重置。
5.3.2实验练习
1.问题描述
一:从键盘输入若干学生的成绩,统计并输出最高成绩和最低成绩,当输入负数时结束输入。二:求所有的水仙花数(水仙花数是一个3位数的自然数,该数各位数的立方和等于该数本身,如153为水仙花数1*1+5*5+3*3=153)
2.实验代码
#include<stdio.h>
main()
{
float x,max,min,z;
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("max=%.0f min=%.0f",max,min);
}
#include<stdio.h>
main()
{
int x,y,z,s,k,p;
k=100;
while(k<1000)
{
x=k/100;
p=k/10;
y=p%10;
z=k%10;
s=x*x*x+y*y*y+z*z*z;
if(s==k)
{
printf("%d\n",k);
}
k++;
}
}
3.问题分析
问题:实验二中的个十百位的分离不成功。
解决方法:使用取余,除法和int型变量的性质来分离个十百位。
5.3.3实验练习
1.问题描述
求满足下列不等式的n的最小值。其中,value是大于1的任何数。1+1/2+1/3+……+1/n>value2.实验代码
#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);
}
3.问题分析
该实验没有碰到问题。
5.3.4实验练习
1.问题描述
输入4个字符,并把其转换为4位十进制整数后显示出来。2.实验代码
#include<stdio.h>
main()
{
char a;
int k,s;
s=0;
for(k=0;k<4;k++)
{
while(1)
{
a=getchar();
if(a>='0'&&a<='9')
break;
}
if(k=0)
{
s=s+(a-48)*1000;
}
if(k=1)
{
s=s+(a-48)*100;
}
if(k=2)
{
s=s+(a-48)*10;
}
if(k=3)
{
s=s+(a-48);
}
}
printf("s=%d",s);
}
3.问题分析
问题:实验中,没有搞清楚字符型与整形数据的关系,导致输出结果不对。
解决方法:通过ASCII码来计算值,再输出相应的数据,得到结果。
5.3.5实验练习
1.问题描述
一:有100匹马。要驮100担货物,其中,1匹大马可以驮3担,1匹中马可以驮2担,两匹小马可以驮1担,请问,大马、中马和小马可以有多少种组合。二:编写程序,求一正整数等差数列的前6项的和,该数列前4项之和是26,前4项之积是880。
三:有30个学生一起买小吃,共花钱50元,其中,每个大学生花3元,每个中学生花2元,每个小学生花1元,问大、中、小学生的人数共有多少种不同的解(去掉某类学生数为0的解)
实验代码
#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("大马%d匹;中马%d匹;小马%d匹.\n",m,n,k);
sum++;
}
else
{
continue;
}
}
}
printf("共有%d种驮法.\n",sum);
}
#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+b)*(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);
}
#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);
}
3.问题分析
问题:第二个实验中,输出不出结果。
解决方法:将等差数列的和与积表达式写正确,再合理运用if与continue,即可令语句正常运行出结果。
三、实验小结
收获:本次实验,我熟悉了循环语句的使用方法,对于for、do/while、while的了解更深了一步。同时学会了怎样使用多重循环的嵌套,对于循环语句的理解也更上一层楼了。
不足:本次实验,我发现我对于循环语句的使用方法还存在很多的不了解与不熟悉,对于各种算法的使用还不清楚,还需要更多的加强。