实验八循环结构程序设计(二)
【实验目的】
1.熟练掌握循环程序设计,包括嵌套循环。
2.熟练掌握使用break、continue语句在循环程序设计中的实现。
3.继续掌握VC++的程序调试方法。
【实验内容】
8-1调试示例,输入正整数的个数n,再输入n个正整数,判断它们是否为素数。素数就是只能被1和自身整除的正整数,1不是素数,2是素数。
源程序(有错误的程序)error8_1.cpp
#include
#include
void main( )
{
int i, j, k, m, n;
printf("输入正整数的个数n: ");
scanf ("%d", &k);
printf("输入%d个正整数\n",k);
for(j = 0; j < k; j++){
scanf ("%d", &m);
n = sqrt(m);
for(i = 2; i <= n; i++)
if (m / i == 0) break;
if (i > n)
printf("%d是一个素数! \n", m);
else
printf("%d不是一个素数!\n", m);
} /* 调试时设置断点*/
}
运行结果(改正后程序的运行结果)
输入正整数的个数n:3
输入3个正整数
11
11是一个素数
13
13是一个素数
15
15不是一个素数
(1)输入并保存上述程序后,再进行编译和连接,没有出现错误信息。
(2)调试程序开始,设置1个断点,具体位置见源程序的注释。
(3)单击go (F5),运行程序,输入1 和9,程序运行到断点暂停,输出9是素数,结果不对。在Watch窗口的Name栏分别输入n、i、m,它们的值分别为3、4、9,这也是while 循环结束时的值。从程序看,while循环有2个条件i <= n和m/i != 0,但是,当i<=n时,m/i == 0的值一直为假,即实际上只有一个条件i <= n起作用,但那就无法区分m是否为素数。根据素数的定义,要判断m能否被i整除,应该用m%i == 0表示,而不是程序中的m/i == 0。
(4)单击(Stop Debugging (Shaft F5))停止调试,把/ 改为% 后,重新编译和连接,没有错误和警告。
(5)单击(Rstart (Ctrl+Shaft+F5)),重新开始调试。单击go (F5),运行程序,输入1 和9,程序运行到断点暂停,输出9不是素数,正确,单击(Stop Debugging (Shaft+F5))停止调试。
(6)取消断点,再单击,运行程序,输入3 和11 13 15,输出结果和题目要求一致,程序调试结束。
8-2 输入1个正整数n,求下式的前n项之和(保留2位小数),要求使用嵌套循环。
111
e=++++
1.....
1!2!3!
8-3 输入2个正整数a和n,求a+aa+aaa+aa…a(n个a)之和。例如,输入2和3,输出246(2 + 22 + 222)。
8-4 输出100~200之间的所有素数,每行输出8个。素数就是只能被1和自身整除的正整数,1不是素数,2是素数。
8-5 输入2个正整数m和n(1<=m,n<=500),统计并输出m 和n之间的素数的个数以及这些素数的和。要求定义并调用函数prime(m)判断m是否为素数。
8-6 改错,找出200以内的所有完数,并输出其因子。一个数如恰好等于它的因子之和,这个数称为完数,如6=1+2+3,其中1、2、3为因子,6为因子和。(源程序error8_2.cpp)输入输出示例:
1=1
6=1+2+3
28=1+2+4+7+14
源程序(有错误的程序)error8_2.cpp
#include "stdio.h"
void main()
{ int i, j, s=1;
for(i = 1; i <= 200; i++) {
for(j = 2; j <= i / 2; j++)
if(i / j == 0) s = s + j;
if(s == i) {
printf("%d=1", i);
for(j = 2; j <= i / 2; j++)
if(i / j == 0) printf("+%d", j);
printf("\n");
}
}
}
实验报告要求
将编程题(8-2~8-5)的程序流程图、源程序、运行结果和改错题(8-6)改正后的源程序、运行结果,以及实验中遇到的问题和解决问题的方法,写在实验报告上。