当前位置:文档之家› 实验三循环结构程序设计

实验三循环结构程序设计

实验三循环结构程序设计一、实验学时4学时。

二、实验目的1.熟练掌握用while、do-while以及for语句实现循环程序设计的方法。

2.理解循环条件和循环体的含义。

理解循环结构中语句的执行过程。

3.熟练掌握break和continue语句的功能及应用。

4.掌握应用嵌套循环结构进行程序设计的方法。

5.掌握应用循环结构及穷举算法解决有关问题。

6.掌握运行到光标位置、使用断点等程序调试方法。

三、实验内容1.程序调试【例1】改正下列程序中的错误,求S=1!+2!+3!+…+n!的值,n的值通过键盘输入(n ≤10)。

程序:#include <stdio.h>void main(){int n,i;long int s,sum;printf("请通过键盘输入具体数据给变量n赋值:");scanf("%d",&n);for(i=1;i<=n;i++){s=s*isum+=s;}printf("1!+2!+3!+...+%d!=%ld\n",n,sum);}(1)按照前面章节实验中介绍的步骤,保存源程序代码。

(2)单击编译按钮(Compile),出现第一条编译错误信息是:missing ';' beforeidentifier 'sum',改正后,重新编译和连接,都正确。

(3)开始调试程序,鼠标单击第11行,光标在第11行闪烁,这就是当前光标的位置,单击,程序运行到光标位置。

在变量窗口中,第一次循环时i的值为 1 ,n的值为 5 ,正确;而s的值为-858993460,不正确。

请分析错误原因:s示未赋初值,long int s,sum;改为long int s=1,sum;,改正后,重新编译和连接,继续进行上述操作,这时s的值为1正确。

(4)鼠标单击第12行,光标在第12行闪烁,这就是当前光标的位置,单击,程序运行到光标位置。

在变量窗口中,第一次循环时i的值为 1 ,s的值为 1 ,正确;而sum 的值为-858993460,不正确。

请分析错误原因:sum示未赋初值,long int s,sum;改为long int s=1,sum=0;,改正后,重新编译和连接,继续进行上述操作,这时sum的值为0正确。

(5)把光标定位到倒数第3行,单击(Run to Cursor)按钮,程序运行到光标位置。

在变量窗口中,s的值为 1 ,sum的值为 1 ,显示信息正确。

(6)单击(Stop Debugging)按钮,程序调试结束。

在程序调试的过程中,应用了“运行到光标位置”的程序调试方法:即单击按钮,程序运行到光标位置,观察变量窗口中所显示的变量信息内容,分析此时变量的值是否正确。

同时,结合断点的使用,断点的使用就是让程序运行到断点处暂停,让用户可以观察当前变量或表达式的值。

设置断点时,先将光标定位到要设置断点的位置,然后单击编译微型工具条的按钮,断点设置完毕。

如果要取消已经设置的断点,只需要将光标移到要取消的断点处,再次单击按钮,该断点取消。

在循环结构的程序设计中,这种程序调试的方法经常使用,在具体进行程序调试时,设置程序运行断点处位置,注意变量窗口中显示变量的具体值信息(如果变量较多时,可以输入变量名查看),这些变量的值是否与循环第一次运行时一致。

2.编程练习(1)读入一个正整数n,计算并输出前n项之和s的值(保留6位小数)。

S=1+1/4+1/7+1/10+1/13+1/16+…程序运行结果输入/输出示例:参考程序如下:#include "stdio.h"void main(){int i, k, n;double sum;printf("请输入n的值:");scanf("%d", &n);sum = 0;k = 1;for(i = 1; i <= n; ++i){sum += 1/(double)k;k += 3;}printf("S=%lf\n", sum);}思考题1:读入一个正实数n,计算并s的值(保留6位小数),要求精确到最后一项的绝对值小于n(保留6位小数)。

S=1-1/4+1/7-1/10+1/13-1/16+…参考程序如下:#include "stdio.h"#include "math.h"void main(){int i, k, t;double n;double sum;printf("请输入n的值:");scanf("%lf", &n);sum = 0;t = 1;k = 1;while(fabs(t/(double)k)>n){sum += t /(double)k;k += 3;t *= -1;}printf("S=%lf\n", sum);}思考题2:读入一个正整数n,计算并输出前n项之和s的值(保留6位小数)。

n为偶数时,正项个数与负项的个数相等;当n为偶数,正项个数比负项的个数多一项,可以将正项与负项分别进行计算。

参考程序:#include "stdio.h"void main(){int i, k, n;double sum;printf("请输入n 的值:");scanf("%d", &n);sum = 0;k = 1;for(i = 1; i <= (n+1)/2; ++i) //计算正数项的和:1+3/7+5/13+…{sum += (2*i-1)/(double)k;k += 6;}//正数项和分别与各个负数项求和(1+3/7+5/13+…-1/2-2/5-3/8-…if(n%2==0) //区分n 为偶数时,负数项的个数为n 的一半{k=2;for(i = 1; i <= n/2; ++i){sum -= i/(double)k;k += 3;}}else //区分n 为奇数时,负数项的个数为n-1的一半,比正数项少一个 {k=2;for(i = 1; i <= (n-1)/2; ++i){sum -= i/(double)k;k += 3;}}printf("S=%.3lf\n", sum);}分析2:132531234561275138147101316S =-+-+-+=-+-+-+L L 即对S 中负数项的分子与分母分别乘以2,会发现相邻的两项的分子部分为相邻的整数,而相邻两项的分母间为前项的分母+3=后项的分母。

参考程序:#include <stdio.h>void main(){ int n,i,k,sign;float s=0;sign=1;k=1;scanf("%d",&n);for(i=1;i<=n;i++){s=s+sign*(float)i/k;k=k+3;sign=sign*(-1);}printf("S=%.3f\n",s);}(2)输入一个正整数data,请编写程序,实现下列功能:①求它的位数;②求各位数字之和;③从高位开始逐位分割并输出它的各位数字。

参考程序如下:#include <stdio.h>#include <math.h>void main( ){int count, in, sum, temp,t;printf("请输入一个正整数:");scanf("%d", &in);temp=in;count=sum=0;while(temp!=0) //求正整数的位数,及各位数之和{sum=sum+temp%10;count++;temp=temp/10;}printf("%d是一个%d位整数,各位数字之和为%d\n", in, count, sum);temp=in;printf("各位数字分别为:");while(temp!=0){t=temp/pow(10,count-1);printf("%d ",t);temp=temp-t*pow(10,count-1);count--;}}(3)输入2个正整数m和n(m≥1,n≤500),输出m和n之间的所有素数,每行输出6参考程序如下:#include <stdio.h>#include <math.h>void main(){int i,j,p,m,n,count;count=0; //统计素数的个数printf("请输入两个整数:");scanf("m=%d,n=%d",&m,&n);for(i=m;i<=n;i++){for(j=2;j<=(int)sqrt(i);j++)if(i%j==0)break;if(j>(int)sqrt(i) && i!=1){printf("%d ",i);count++;}if(count%6==0)printf("\n");}}3.程序改错输入2个正整数m和n,求这两个正整数的最大公约数和最小公倍数。

#include <stdio.h>#include <math.h>void main(){int m,n,max,min,data1,data2,r;printf("请输入两个正整数:");scanf("m=%d,n=%d",&m,&n);data1=m; data2=n;if(m<n){ r=m; m=n; n=r; }r=m%n;while(r!=0) //辗转相除法,求最大公约数{ m=n; n=r; r=m%n; }max=n; //循环结束后,最大公约数即为nmin=data1*data2/max; //两个原数相乘,再除以最大公约数,即为最小公倍数printf("%d,%d的最大公约数:%d\n",data1,data2,max);printf("%d,%d的最小公倍数:%d\n",data1,data2,min);}思考题3:求两个正整数的最大公约数和最小公倍数,采用辗转相乘法是求解问题的方法之一,也可以采用for循环结构,结合break语句进行求解,不需要判断两个正整数的大小,请读者根据这种算法思想,编程求解两个正整数的最大公约数和最小公倍数。

相关主题