实验三循环结构程序设计
一、实验目的
1.通过本实验,加深对循环控制结构有关概念的理解。
2.熟练掌握while、do-while和for三种循环控制语句的特点,掌握循环结构程序设计和调试方法。
3.掌握二重循环结构程序的设计方法。
二、预习内容
1.If语句和goto语句组合实现循环的方法。
理解循环的条件设置,循环的次数,循环体以及循环的结束。
2. while循环结构的特点。
理解while循环的条件设置,循环次数,循环体以及循环
结束的条件。
3. do-while循环结构的特点。
理解do-while循环的条件设置,循环次数,循环体以
及循环结束的条件。
4. for结构的特点。
理解for结构中三个表达式的执行顺序以及各自的作用,指出循
环的条件,循环的次数,循环体以及循环结束的条件。
5. 循环的嵌套。
理解循环嵌套的结构特点,循环的执行顺序以及循环体,循环次数及
内层循环的跳出。
6. break,continue语句的意义及其在循环结构中的应用特点。
三、实验内容
(一)阅读调试下列程序,并写出程序结果。
1.用while循环实现数据统计问题。
数据统计问题:从键盘输入一批任意数量的整数,统计其中不大于100的非负数数
值的个数。
/* 使用负数作为数据输入结束标志的程序 */
#include <stdio.h>
void main()
{
int m,counter=0;
while(1)
{
printf("请输入一个整数:");
scanf("%d",&m);
if(m<0)break;
if(m<=100)counter++;
printf("\n");
}
printf("符合要求的整数个数为: %d\n",counter);
}
(1)程序编制思路说明:
由于输入数据个数是不确定的,因此每次执行程序时,循环次数都是不确定的。
在
进行程序设计时,确定循环控制的方法是本实验的一个关键问题。
循环控制条件可
以有多种确定方法:① 使用一个负数作为数据输入结束标志。
② 输入一个数据后
通过进行询问的方式决定是否继续输入下一个数据。
本程序采用的是第一种。
同学
们可以考虑采用第二种应该如何实现?(参考附录程序一)
(2)程序调试
① 输入的一组数据之间全部以空格分隔,只有最后一个数为负数,以回车键结束。
如:
16 35 7 –10
② 输入的一组数据之间全部以空格分隔,在负数之后又有正数数据,最后一个数不为负数,以回车键结束。
如:
16 35 7 –10 96 17
③ 输入的一组数据之间全部以空格分隔,输入数据中有多个负数,以回车键结束。
如:
16 35 7 –10 96 17 –87 7
④ 输入的数据中有大于100的整数。
如:
16 35 7 –10 96 117 –87 267 66
⑤ 数据之间既用空格分隔,也用回车键分隔。
如:
76 35 376 22 717
96 67
96 17 –87 719 66 98 2 -16 31
⑥ 每输入一个数据后均按回车键。
⑦ 输入的第一个数据即为负数。
⑧ 在输入的数据中使用数值很大的整数。
如:
17 66778 98765 17 899 -109 87
⑷ 在上面的“参考程序”中,使用了常数“1”作为循环控制的条件,这是常用的循环控制方式。
请修改上面的程序,不使用常数循环条件,仍然使用while语句实现数据统计问题。
2.编写并调试程序,使用do-while循环控制语句实现上面的数据统计问题。
调试数据仍参照上面给出的几种情况设计使用。
3.编写并调试程序,使用for循环控制语句实现上面的数据统计问题。
4.阶乘累加问题。
编写程序,求1+2!+3!+…+n!的值。
⑴ 编程分析
① 本实验内容是求解阶乘问题。
② 求n!用一个循环即可实现。
③ 求1+2!+3!+…+n!的值即为求累加,需要在求n!程序之外增加一个外重循环。
⑵ 参考程序
#include <stdio.h>
void main()
{
long int s=1,t;
int i,j,n;
printf("n=");
scanf("%d",&n);
for(i=2;i<=n;i++)
{
for(t=1,j=1;j<=i;j++)
t*=j;
s+=t;
}
printf("s=%ld\n",s);
}
⑶ 程序调试
① 输入一个不大的正整数,分析程序执行结果。
② 输入一个零或者负数,分析程序执行结果。
③ 输入一个很大的正整数,分析程序执行结果。
④ 当程序结果不符合要求时,修改程序,直到对任何输入数据都能输出正确的执行结果,或者给出一个明确的提示信息。
例如,当输入数据非法时,给出一个恰当的提示信息。
(二)编制下列程序
1.求100~200间不能被3整除的数的个数。
2. 在屏幕上打印出乘法九九表,要求左对齐。
3. (选作)用弦截法求方程的根。
其方程是:x3-5x2+16x-80=0
求解的方法是:
(1) 令 f(x)=x3-5x2+16x-80。
(2) 选取两个初值x1、x2,使f(x1)、f(x2)异号。
(3) 连接(x1,f(x1))和(x2,f(x2))两点,过这两点的直线与X轴的交点为x,用该点取
代区间(x1,x2)的一个端点,使其相应的函数值与另一个端点的函数值仍保持异号。
从而构成一个新的区间(x1,x2)。
重复上述做法,直到|f(x)|是一个很小的数(比如绝对值小于10-6),此时认为f(x)近似为0,x即是方程的解。
四、思考题
1.完善实验内容1的“数据统计问题”程序,使得对于任何类型的数值,都能进行正常的数据统计。
2.用一个单循环程序实现实验内容4的阶乘累加问题。
3.输入不同的数据进行测试,测试该程序在计算哪个数的阶乘时会溢出?仔细考
虑为什么会溢出?有什么解决办法?。