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

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

【教学案例一】

1. 实验目的

熟练使用for语句控制循环。

2. 实验任务

(1)实验内容:打印输出所有"水仙花数"。所谓"水仙花数"是指一个三位的正整数,其各位数字立方和等于该数本身。例如:153是一个"水仙花数",因为153=13+53+33。

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

程序输出以下4个"水仙花数":

153 370 371 407

3. 实验分析

(1)问题分析:用循环语句循环测试每一个三位数是否符合"水仙花数"的规则。即对所有100至999的数,把每个数分解出个位数,十位数和百位数,再判断是否符合条件。

(2)实现要点:用一次穷举循环就可以了。因为是固定次数的循环,一般采用for语句。对于每个当前的整数,用取余和整除运算分解出各位的数字。对于三位的正整数n,个位数g = n%10,十位数s = (n%100)/10,百位数b = n/100。

4. 参考代码

#include

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 /* 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

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++;

相关文档
最新文档