湖北理工学院14本科C语言实验报告实验三循环控制.docx
《湖北理工学院14本科C语言实验报告实验三循环控制.docx》由会员分享,可在线阅读,更多相关《湖北理工学院14本科C语言实验报告实验三循环控制.docx(14页珍藏版)》请在冰豆网上搜索。
湖北理工学院14本科C语言实验报告实验三循环控制
湖北理工学院14本科C语言实验报告实验三循环控制
实验三循环控制
实验课程名:
C语言程序设计
专业班级:
14电气工程2班学号:
201440210237姓名:
熊帆
实验时间:
4.28-5.5实验地点:
K4-207指导教师:
祁文青
一、实验目的和要求
1.熟悉掌握用for语句,while语句和do_while语句实现循环的方法。
2.掌握在程序设计中用循环的方法实现一些常用算法(如穷举、迭代、递推等)。
二、实验内容
1.下面程序求1+…+100,填空,实现该功能。
#include
voidmain()
{
ints,i;
s=0;/*第5行*/
for(i=1;i<=100;i++)
s=s+i;
printf("1+...+100=%d\n",s);
}
解答:
1,源代码:
#include
voidmain()
{
ints,i;
s=0;
for(i=1;i<=100;i++)
s=s+i;
printf("1+...+100=%d\n",s);
}
(2)运行结果:
(3)运行结果分析:
考察for循环语句的运用,i的初值为1,当满足i<=100时就会执行for语句
下面的一条语句,s的值一直累加,直到i=101跳出for循环,输出最终结果,为5050
2.比较下列两个程序。
(验证)
#include
voidmain()
{inti,n,sum=0;
scanf("%d",&i);
n=i;
while(i<=10)
{sum+=i;
i++;
}
printf("%d+...+10=%d",n,sum);
}
#include
voidmain()
{inti,n,sum=0;
scanf("%d",&i);
n=i;
do
{sum+=i;
i++;
}while(i<=10);
printf("%d+...+10=%d",n,sum);
}
分别运行这两题,若输入7,这两个程序的结果分别是多少,若输入12,这两个程序的结
果又分别是多少,比较为什么会有这样的区别,
解答:
1,源代码:
程序1:
#include
voidmain()
{
inti,n,sum=0;
scanf("%d",&i);
n=i;
while(i<=10)
{sum+=i;
i++;
}
printf("%d+...+10=%d",n,sum);}
程序2:
#include
voidmain()
{
inti,n,sum=0;
scanf("%d",&i);
n=i;
do
{
sum+=i;
i++;
}
while(i<=10);
printf("%d+...+10=%d",n,sum);
}
2,运行结果:
输入7时,两个程序的运行结果分别如下图
输入12时,两个程序的运行结果分别如下图
(3)运行结果分析:
程序1和程序2分别用到的分别是while型循环和dowhile循环。
当输入7
时,i<=10对两个程序来说都是成立的,但是程序1是先判断再执行,而程序2是先执行
再判断,但不影响最后的结果,输出都是34。
但是当输入12的时候,由于程序1是先判
断再执行,由于i<=10为假,故输出为0。
而程序2是先执行再判断,不管输入是什么整
数值,都至少会执行一遍,所以还是执行了一遍,最终输出和输入结果一样,都是12。
3.下面程序,若输入12345,分析输出结果是多少,上机验证。
#include
voidmain()
{longdata;
scanf("%ld",&data);
while(data)
{printf("%ld,",data%10);
data=data/10;
}
}
解答:
1,源代码:
#include
voidmain()
{
longdata;
scanf("%ld",&data);
while(data)
{
printf("%ld,",data%10);
data=data/10;
}
}
(2)运行结果:
(3)运行结果分析:
data的定义为长整型,当输入12345时,while(data),则进入一个while循
环,先输出12345除以10的余(加一个逗号),即输出12345的个位数。
再令data等于
12345除以10的模,从而data等于1234,再次,输出1234除以10的余(加一个逗号),
即输出12345的十位数。
接下来依次类推,最终实现输出5,4,3,2,1。
4.下面程序实现求Fibonacci数列的前n个数。
(验证、调试)
,1n1n2或,,F,nF,Fn,3n,1n,2,
运行程序,写出运行结果;采用单步跟踪技术运行该程序,观察一下变量的变化。
#include
voidmain()
{longintf1,f2;
inti,n;
printf("Inputn:
");/*第5行*/
scanf("%d",&n);/*第6行*/
f1=f2=1;
for(i=1;i{printf("%ld\t%ld\n",f1,f2);/*第9行*/
f1=f1+f2;
f2=f2+f1;
}
}
解答:
1,源代码:
#include
voidmain()
{
longintf1,f2;
inti,n;
printf("Inputn:
");/*第5行*/
scanf("%d",&n);/*第6行*/
f1=f2=1;
for(i=1;i{
printf("%ld\t%ld\n",f1,f2);/*第9行*/
f1=f1+f2;
f2=f2+f1;
}
}
(2)运行结果:
调试过程
(3)运行结果分析:
验证了2个值,分别为2和9。
当输入n=2时,输出1行值,为11。
当输入n=9时,输出8行值,如上图所示。
【关于Fibonacci数列:
斐波那契数列指的是这样一个数列0,1,1,2,3,5,8,13,21,34,55,89,
144,233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368
特别指出:
第0项是0,第1项是第一个1。
这个数列从第三项开始,每一项都等于前两项之和。
】
5.下面程序,写出预习结果并上机验证。
(验证)
#include
voidmain()
{
inti,j,x;
for(i=0,x=0;i<2;i++)
{
x++;
for(j=0;j<3;j++)
{
if(j%2)continue;
x++;
}
x++;
}
printf("x=%d\n",x);
}
思考:
用一句话概括if(j%2)语句的作用。
解答:
(1)运行结果:
(2)运行结果分析:
if(j%2)语句的作用实际上就是判断j是否为奇数。
如果能整除2就执行,不能整除就不执行,通过continue跳出本次循环。
即如果j%2=0就执行x++,j%2!
=0就通过continue跳出本次循环。
通过for循环的嵌套与continue语句的结合,使得最终输出结果为8。
6.下面程序输入一批考试分数,用,1作为结束标志,若输入大于100分,则提示重新输入,然后计算最高分、最低分与平均分。
请调试、检查程序中的错误,并改正之。
#include
voidmain()
{intmark;
intn=0;sum=0;
intmax=100;min=0;
for(;;);
{scanf("%d",&mark);
if(mark>100)
{printf("Mark>100,Pleasereinput\n");
break;
}
if(mark=-1)
break;
n++;
sum=sum+mark;
if(mark>max)
max=mark;
if(markmin=mark;
}
sum=sum/n;
printf("max=%d,min=%d,aver=%d\n",max,min,sum);
}
解答:
1,源代码:
#include
voidmain()
{
intmark;
intn=0,sum=0;
intmax=100,min=0;
for(;;)
{
scanf("%d",&mark);
if(mark>100)
{
printf("Mark>100,Pleasereinput\n");
break;
}
if(mark=-1)
break;
n++;
sum=sum+mark;
if(mark>max)
max=mark;
if(markmin=mark;
}
sum=sum/n;
printf("max=%d,min=%d,aver=%d\n",max,min,sum);
}
(2)运行结果:
(3)运行结果分析:
int语句有误,定义多个变量的时候应该使用逗号隔开。
还有一个错误是for
语句后来不能要分号,应该去掉。
运行时输入了10个分数值,并以-1作为结束标志,计算出最高分,最低分和平均分,实验结果与
预期一致。
7.编程:
输入20个1,90的整数,分类统计1,30、31,60、61,90的数各有多少个,
解答:
1,源代码:
#includevoidmain()
{
intcount1=0,count2=0,count3=0;
inti,x;
printf("请输入20个数:
\n");
for(i=0;i<20;i++)
{
scanf("%d",&x);
if(x>=1&&x<=31)
count1++;
if(x>=31&&x<=60)
count2++;
if(x>=61&&x<=90)
count3++;
}
printf("count1=%d,count2=%d,count3=%d\n",count1,count2,count3);
}
2,运行结果:
(3)运行结果分析:
用三个if语句与for循环结合,输入了20个数字,验证结果与预期一致,如上图所示。
8.编程:
素数是除了1和其本身以外,不能被其他自然数整除的自然数。
从键盘输入一个数,判断该数是不是素数,
解答:
1,源代码:
#include
voidmain()
{
inta,b;
printf("请输入一个数:
");
scanf("%d",&a);
for(b=2;b<=a-1;b++)
{
if(a%b);
else
break;
}
if(b==a)
printf("它是一个素数\n");
else
printf("它不是一个素数\n");
return0;
}
2,运行结果:
(3)运行结果分析:
运用for循环实现整除的过程,实验运行程序时分别输入了一个9和11,实
验结果均与预期一致。
9.编程:
显示所有的水仙花数。
谓水仙花数,是指一个3位数,其各位数字立方和等于该数字
333本身。
例,153是水仙花数,因为153=1+5+3。
有两种解题思路,选择其中之一编程实现:
(1)利用三重循环,将这三个数通过一定的运算符连接成一个3位数,然后判断是否是水仙
花数。
for(i=1;i<=9;i++)
for(j=0;j<=9;j++)
for(k=0;k<=9;k++)
注意,因水仙花是一个三位数,百位i是从1开始,不能从0开始,十位j和个数位
k可以从0开始。
(2)利用一个循环,对100,999范围内的每个3位数逐位分离后进行判断。
for(i=100;i<999;i++)
{a=i/100;
b=(i-a*100)/10;
c=i%10;
………
}
解答:
1,源代码:
#include
voidmain()
{
inta,b,c;
for(a=1;a<=9;a++)
for(b=0;b<=9;b++)
for(c=0;c<=9;c++)
if((a*100+b*10+c)==(a*a*a+b*b*b+c*c*c))
printf("%d%d%d\n",a,b,c);
return0;
}
(2)运行结果:
(3)运行结果分析:
运用3个for循环语句,再判断是否满足水仙花数的条件。
实验结果如上图,
与预期结果相符。
10.编程:
输出下列图形。
*
***
*****
*******
*********解答:
1,源代码:
#include
intmain()
{
intm,n;
for(m=1;m<=5;m++)
{
for(n=1;n<=5-m;n++)
printf("");
for(n=1;n<=2*m-1;n++)
print("*");
printf("\n");
}
return0;
}
(2)运行结果:
(3)运行结果分析:
通过for循环的嵌套,通过输出空格和星号来控制最终的图像,由星号组成的
三角形。
三、结论
本次实验主要考察的是for循环的嵌套的使用~要学会用单步执行来观察程序的每一步
的运行情况~这样非常有利于理解for循环的嵌套。