当前位置:文档之家› 2.2.10循环结构程序设计 - 循环结构程序设计_教学案例

2.2.10循环结构程序设计 - 循环结构程序设计_教学案例

【教学案例一】1. 实验目的熟练使用for语句控制循环。

2. 实验任务(1)实验内容:打印输出所有"水仙花数"。

所谓"水仙花数"是指一个三位的正整数,其各位数字立方和等于该数本身。

例如:153是一个"水仙花数",因为153=13+53+33。

(2)实验要求:没有输入,输出所有"水仙花数"。

程序输出以下4个"水仙花数":153 370 371 4073. 实验分析(1)问题分析:用循环语句循环测试每一个三位数是否符合"水仙花数"的规则。

即对所有100至999的数,把每个数分解出个位数,十位数和百位数,再判断是否符合条件。

(2)实现要点:用一次穷举循环就可以了。

因为是固定次数的循环,一般采用for语句。

对于每个当前的整数,用取余和整除运算分解出各位的数字。

对于三位的正整数n,个位数g = n%10,十位数s = (n%100)/10,百位数b = n/100。

4. 参考代码#include <stdio.h>int main(void){int n, g, s, b;for (n=100; n<=999; n++){b = n / 100;s = n / 10 % 10;g = n % 10;if ( g*g*g + b*b*b + s*s*s==n) printf("%d ",n);}return 0;}5. 思考题什么情况下采用穷举循环是比较合适的?【教学案例二】1. 实验目的(1)熟练使用while 语句和理解该语句的执行顺序,掌握累加和计算的算法。

(2)熟练运用断点调试。

2. 实验任务74(1)实验内容:根据下面关系式,求π的值,直到最后一项的值小于epsilon 。

epsilon 的值由键盘输入。

12!3!!12335357357n p =++++ᄡᄡᄡᄡᄡᄡᄡ…+…(2n+1)(2)实验要求:改正下面的错误程序,达到满足如下表的运行示例结果。

测试用例:/* 1 */ #include <stdio.h>/* 2 */ int main(void)/* 3 */ {/* 4 */double sum,item;/* 5 */double epsilon;/* 6 */int i;/* 7 */printf("Enter Epsilon:");/* 8 */scanf("%lf",&epsilon);/* 9 */item = 1;/* 10*/sum = 0; /*调试时设置断点*//* 11*/while (item >= epsilon)/* 12*/{/* 13*/sum += item;/* 14*/i++;/* 15*/item *= i;/* 16*/item /=(2*i-1);/* 17*/}/* 18*/printf("Pi=%.6lf\n",2*sum); /*调试时设置断点*//* 19*/return 0; /* 20*/ }3. 实验分析(1)程序分析:这是一个求累加和的问题。

为解决这个问题,首先抽取出具有共性的算式:sum=sum + item ,其中sum 存放累加和,item 表示第i 项的内容。

题目没有显式地给出循环次数,只是提出了精度要求。

在反复计算累加的过程中,一旦第i 项的绝对值小于Epsilon ,就达到了给定的精度,计算终止,这说明精度要求实际上给出了循环的结束条件,转换为循环条件item≧Epsilon。

通过以上分析,主要的错误可能会出现在求和变量的初值赋值以及循环的次数错误及输入输出的格式等。

(2)调试要点:该程序调试的主要要点是:对源代码进行编译,解读相关的编译信息,若存在编译错误,则根据提示信息修改源代码;用测试用例数据运行,看结果是否有错;若有错,设置断点,利用断点调试运行;设置断点的分析,观察在第一个断点时各边量的值(初值是否设置正确),单步进行循环时观察各个变量的值的变化以及while循环语句条件的变化;根据观察情况综合分析,与预期结果做比对,从而找出错误,给出正确结果。

具体调试步骤:1)先编译源程序,信息窗口中显示编译正确信息,然后执行连接,完全正确。

运行该程序,发现输出结果不正确,调试该程序。

2)在源程序第10行和第18行设置断点,运行至第一个断点处,输入变量测试用例,查看变量epsilon的值,此时,epsilon的值与输入的值一致。

3)单步执行,程序执行到输入第15行,观察变量i,这时看到变量i的值是一个奇怪的数值。

检查之前的代码,发现程序忘记给变量i赋初值了。

变量i的初值到底应该是多少是合适的?分析代码可以得出变量i的初值设置为0较合适,这是通过比较变量item的初值得出的。

终止调试,修改程序代码,在语句“item =1;”之前插入语句“i=0;”,重新编译,连接运行,输入测试用例。

4)程序执行到第一个断点。

单步执行,程序执行到输入第16行,观察到变量item值为1.00,但是分析计算公式,item的值应该为1/3,按照item的值推算,语句“item /=(2*i-1);”应为“item /=(2*i+1);”。

修改程序代码,然后重新编译和连接,程序显示结果正确。

4. 参考代码#include <stdio.h>int main(void){double sum,item;double epsilon;int i;printf("Enter Epsilon:");scanf("%lf",&epsilon);i = 0;item = 1;sum = 0; /*调试时设置断点*/while (item >= epsilon){sum += item;i++;item *= i;item /=(2*i+1);}printf("Pi=%.6lf\n",2*sum); /*调试时设置断点*/return 0; /*调试时设置断点*/}5. 思考题修改上面程序,利用格利高里公式求π的值,要求精确到最后一项的绝对值小于10-4。

公式如下:⋯+-+-=71513114π【教学案例三】1. 实验目的(1)熟练使用while 语句控制循环。

(2)熟练理解和掌握循环体内变量存储的循环变化规则。

2. 实验任务(1)实验内容:一对兔子,从出生后第3个月起每个月都生一对兔子。

小兔子长到第3个月后每个月又生一对兔子。

假如兔子都不死,请问第1个月出生的一对兔子,至少需要繁衍到第几个月时兔子总数才可以达到R 对?(R 为给定的正整数。

)(2)实验要求:输入一个正整数R ,输出“至少到第几个月时,兔子总对数才能达到R 对。

”测试用例:3. (1)问题分析:这显然是一个循环计算的问题。

设某一个月的当月出生的兔子有R1对,两个月大的兔子有R2对,三个月及以上大小的兔子有R3对,则总数是R1+R2+R3对。

那么下一个月的兔子数量按年龄分别是R3=R3+R2、R2=R1、R1=R3。

第1个月的初始值:R1=1、R2=0、R3=0。

(2)实现要点:1)循环控制结构。

循环计算的次数不能预先知道,所以可以采用while 循环,只要R1+R2+R3 < R 的条件满足,就要继续计算下一个月,否则结束循环。

2)每月不同年龄兔子数量的循环更新。

每月不同年龄兔子数量的循环更新规则:R3=R3+R2、R2=R1、R1=R3。

3)把每个月的各月龄兔子数量序列都打印出来,就容易验证结果是否正确。

正确的序列是:1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, ……如果不正确,进行跟踪调试。

4. 参考代码/* 1 */ #include <stdio.h>/* 2 */ int main(void)/* 3 */ {/* 4 */int month=1, R, R1=1, R2=0, R3=0;/* 5 */scanf("%d", &R);/* 6 */while( R1+R2+R3 < R )/* 兔子数量未达到给定的量,继续计算下个月的值 *//* 7 */{ month++;/* 8 */R3 += R2; /* 二月龄兔子变成成年兔子*//* 9 */ R2 = R1; /* 一月龄兔子变成二月龄兔子*//* 10 */ R1 = R3; /* 成年兔子又生出一月龄兔子*//* 11 */}/* 12 */printf("至少第 %d 个月才有 %d 对兔子。

\n", month, R1+R2+R3 );/* 13 */ }5. 思考题这个兔子繁殖的增长序列与Fibonacci序列(后一项是前两项的和)有什么关系?【教学案例四】1. 实验目的(1) 熟练使用当形循环语句控制循环。

(2) 熟练掌握整数中各位数的处理。

2. 实验任务(1) 实验内容:从键盘读入一个整数,统计该数的位数。

实验分析(1)问题分析:一个整数由多位数字组成,统计过程需要逐位地数,因此这是个循环过程,循环次数由整数的位数决定。

(2)实现要点:由于需要处理的数据有待输入,故无法事先确定循环次数。

程序中采用do-while循环语句。

由于负数和相应的正数的位数是一样的,所以把输入的负数转换为正数后再处理。

将输入的整数不断地整除10,该数最后变成了0。

例如,234 / 10商为23,23再整除10商为2,2再整除10商为0并结束循环,一共循环了三次,故234的位数是3。

4. 参考代码/* 1 */ # include <stdio.h>/* 2 */ int main(void)/* 3 */ {/* 4 */ int count, number; /* count 记录整数number的位数 *//* 5 *//* 6 */ count = 0;/* 7 */ printf("Enter a number:"); /* 输入提示 *//* 8 */ scanf ("%d", &number);/* 9 */ if(number < 0) number = -number; /* 将输入的负数转换为正数 *//* 10 */ do{/* 11*/ number = number / 10; /* 整除后减少一位个位数,组成一个新数 *//* 12 */ count++; /* 位数加1 *//* 13 */ }while(number != 0); /* 判断循环条件 *//* 14 */ printf("It contains %d digits.\n", count);/* 15 *//* 16 */ return 0;/* 17 */ }5. 思考题将程序中的do-while语句改为下列while语句,会影响程序的功能吗?为什么?再增加一条什么语句,就可以实现同样的功能?while(number != 0){number = number / 10;count ++;}【教学案例五】1. 实验目的(1)熟练使用do/while 循环语句以及理解do/while语句的执行顺序;(2)理解二分法的概念,掌握运用二分法求简单方程近似解的方法;(2)熟练理解和掌握程序错误判断及修改。

相关主题