当前位置:首页 > 《C语言程序设计》案例讲义 - 完整版
2. 什么情况下选择断点调试程序的方法。
3. 如何设置断点?一般选择什么位置来设置断点。
案例七 求π=4*(1/1-1/3+1/5-1/7+??)的值
教学目的:
1. 进一步熟悉循环的结构;
2. 掌握用while和do ……while语句实现循环结构。
C语言中设计了for、while和do ??while三种语句来实现循环结构,前面已经知道for语句的格式,这次课我们要学习while和do ??while语句的结构。用while和do ??while语句实现计算π=4*(1/1-1/3+1/5-1/7+??)值的程序如下:
/*do??while实现的循环结构*/ /*while实现的循环结构*/
#include “stdio.h” #include “stdio.h”
#include “conio.h” #include “conio.h”
main() main()
{ {
int j,k; int j,k;
float pi,; float pi,;
clrscr(); clrscr();
k=1;pi=0;j=1; /*循环初始化*/ k=1;pi=0;j=1; /*循环初始化*/
do while(1.0/j>0.0001) /*循环条件*/
{ {
pi=pi+k*1.0/j; /*循环体*/ pi=pi+k*1.0/j; /*循环体*/
k=-k; k=-k;
j=j+2; /*循环控制变量值的改变*/ j=j+2; /*循环控制变量值的改变*/
} while(1.0/j>0.0001); /*循环条件*/ }
pi=pi*4; pi=pi*4;
printf(“π=%f\\n”,pi); printf(“π=%f\\n”,pi);
} }
一、案例分析
1. do??while和while语句的格式 do
{
循环体语句组; }while(条件表达式); 2. 两种语句的执行过程
do??while语句的执行过程
1) 执行do后的循环体语句组;
2) 计算while后面条件表达式的值; 3) 如果条件表达式的值为非0(真),则转1)继续执行循环体语句组;如果条件表达式为0(假),则结束循环的执行,继续执行while下面的语句。
3. 两种语句执行过程图解(图7.1)
45
while(条件表达式);
{
循环体语句组; }
while语句的执行过程
1) 计算while后面条件表达式的值; 2) 如果条件表达式的值为非0(真),则执
行循环体语句组;然后转1)继续重复上面的过程;
3) 如果条件表达式为0(假),则结束循环
的执行,继续执行while下面的语句。
从图解和上述的执行过程描述可知,do??while和while语句的主要区别在于while语句先进行条件表达式的计算,满足条件才执行循环体,如果第一次条件就为0(假),则循环体一次也不执行就结束循环语句执行;而do??while语句则先执行循环体,然后才计算条件表达式的值,并判断条件是否满足,因此不管怎样,循环体至少执行一次。
4.程序分析
“k=1;pi=0;j=1;”行是循环的初始化部分,给变量赋相应的初值,变量k是用来在计算中改符号位的,第一项是符号位是正,所以k赋为1;pi是用来存放和值的,所以其初值赋为0;j是表示某项
?? ?? 执行循环体语句组 0(假) 计算条件表达式的值 ?? 非0(真) 执行循环体语句组 0(假) 计算条件表达式的值 非0(真) ??
图7.1 b)do??while语句执行图解
图7.1 a)while语句执行图解
的分母值,第一项的分母是1,所以赋其初值为1。
“1.0/j>0.0001”为循环的条件,表示当前项的绝对值大于0.0001时,还需要把此项添加到和值中。
“pi=pi+k*1.0/j; k=-k;”两条语句是循环体,分别完成求和及下一项符号的改变。 “j=j+2;”计算下一项的分母。
在此例中,关键的一个问题是循环条件的确定,本例是当前项的绝对值大于0.0001;第二个问题是每项前的符号的确定,本例用一个整型变量k,使其交替的改为1和-1,以实现当前项符号的确定;由于k,j都是整型,相除时,其值将会为0,因此需要用k*1.0/j这种形式将运算对象值的类型转换为实型。
二、三种实现循环语句的比较
1. 初始化部分 for语句可以将初始化部分的语句放入表达式1中,而while和do??while语句的初始化则需要放在while和do??while语句之前;
2. 循环条件 for语句的循环条件由表达式2表示,而while和do??while语句则放在while后;
3. 循环控制部分 通常控制循环的变量值的改变对于for语句是由表达式3来实现,而while和do??while语句则需要放在循环体内;
4. do??while语句实现的循环,其循环体至少执行一次,所以在选择时应加以注意。 5. 三种语句实现的循环一般是可以相互转换的。
一般情况下,已知次数的循环用for来实现。循环结构程序编写时应特别注意循环初始部分、循环体部分、循环的条件以及循环控制部分。
三、应用举例
【例7-1】一张纸的厚度是0.1mm,珠穆郎玛峰的高度为8848.13m,假如纸张有足够大,将纸对折多少次后可以超过珠峰的高度?(分别用三种循环语句编写)
分析:该题主要是计算是每对折一次,其厚度就是前一次的厚度*2;其次是循环的条件,当厚度超过8848.13后,即停止对折,因此这个循环是不知道次数的,但是需要计算对折的次数,因此每循
46
环一次,需要将计次的变量加1。我们定义以下几个变量: int count;用于计算对折的次数,其初值为0;
float thickness;用于计算当前纸的厚度,其初值为0.0001;
程序如下:
/*while实现的程序*/ #include “stdio.h” #include “conio.h” main() {
int count;
float thickness; clrscr();
count=0;thickness=0.0001; /*循环初始化*/ while(thickness<8848.13) /*循环条件*/
{
thickness=thickness*2; /*循环体*/ count++; }
printf(“thickness=%f,count=%d\\n”,thickness,count); }
/*do??while实现的程序*/ #include “stdio.h” #include “conio.h” main() {
int count;
float thickness; clrscr();
count=0;thickness=0.0001; /*循环初始化*/ do
{
thickness=thickness*2; /*循环体*/ count++;
} while(thickness<8848.13); /*循环条件*/
printf(“thickness=%f,count=%d\\n”,thickness,count); }
/*for实现的程序*/ #include “stdio.h” #include “conio.h” main() {
int count;
float thickness; clrscr();
count=0;thickness=0.0001; /*循环初始化*/ for( ;thickness<8848.13; ) /*循环条件*/
{
thickness=thickness*2; /*循环体*/ count++; }
printf(“thickness=%f,count=%d\\n”,thickness,count); }
47
四、习题
1. 求Fibonacci数列前40个数。该数列的生成方法是:F1=1,F2=1,Fn=Fn-1+Fn-2(n>=3),即从第三个数开始,每个数等于前两个数的和。
2. 求数列的前10项的和。2/1+3/2+5/3+8/5+??
3. 给出一个正整数,编程实现:从低位到高位顺序输出每位数字及位数。 提示:要把一个整数的每一位取出来,需要用到一个新的算术运算符“%”,称之为求余运算,即两个整数相除的余数,如3%2=1,9%5=4,1%5=1,其运算优先级同“*、/”运算符。如取35的每一位,用35先取个位,然后k=35/10,将该数缩小10倍,再用k取出十位。当然不管整数是多少位的,始终重复黑斜体部分即可。
五、实验 实验八 while和do??while语句
5.1实验目的
1. 掌握while和do……while语句; 2. 熟悉三种实现循环结构语句的区别。
5.2实验内容及步骤
1.选择合适的程序调试方法调试案例的两种程序,并设计记录格式。 2.将案例程序改为用for语句实现,并调试程序。 3.调试【例7-1】的三种程序,并进行记录。
4.将【例7-1】用for语句实现的程序进行以下修改,并调试。
将原程序中的下列语句改成一条for语句。 count=0;thickness=0.0001; /*循环初始化*/ for( ;thickness<8848.13; ) /*循环条件*/
{
thickness=thickness*2; /*循环体*/ count++; }
for(count=0,thickness=0.0001; thickness<8848.13;thickness=thickness*2, count++); 5. 调试习题的程序,并做好记录。 5.3思考题
1.三种实现循环结构的语句应如何选用?
48
共分享92篇相关文档