c第5章教学zpWord文件下载.docx

上传人:b****6 文档编号:21761089 上传时间:2023-02-01 格式:DOCX 页数:21 大小:103.14KB
下载 相关 举报
c第5章教学zpWord文件下载.docx_第1页
第1页 / 共21页
c第5章教学zpWord文件下载.docx_第2页
第2页 / 共21页
c第5章教学zpWord文件下载.docx_第3页
第3页 / 共21页
c第5章教学zpWord文件下载.docx_第4页
第4页 / 共21页
c第5章教学zpWord文件下载.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

c第5章教学zpWord文件下载.docx

《c第5章教学zpWord文件下载.docx》由会员分享,可在线阅读,更多相关《c第5章教学zpWord文件下载.docx(21页珍藏版)》请在冰豆网上搜索。

c第5章教学zpWord文件下载.docx

然后再计算表达式的值,重复上述过程,直到表达式的值为“假(0)”时结束循环,流程控制转到循环结构的下一语句。

利用while语句对例5.1实现编程。

例5.1程序如下:

#include<

stdio.h>

voidmain()

inti,sum,x;

i=1;

sum=0;

//循环控制变量i、累加变量sum赋初值

while(i<

=10)//循环继续的条件

{

printf("

Enteradata:

"

);

scanf("

%d"

&

x);

//输入累加的数据

sum=sum+x;

//进行累加求和

i++;

//循环控制变量递增

}

sum=%d\n"

sum);

//输出计算结果

使用while循环结构应注意以下几点:

(P57)

①while循环结构的特点是“先判断,后执行“。

如果表达式的值一开始就为“假”则循环体一次也不执行。

②循环体中,如果包含一个以上的语句,则应用花括号括起来。

③循环体内一定要有改变循环继续条件的语句,使得循环趋向于结束,否则循环将无休止地进行下去,即形成“循环”如上例中的语句:

i++。

④为使循环能够正确开始运行,还要做好循环前的准备工作。

如上例中的语句i=1和sum=0,分别给循环控制变量初始化和对累加求和单元清零。

例5.2将4.3改为从键盘上输入30名学生的成绩,对其进行处理。

如果成绩及格,则输出“Passed”;

否则输出“Failed”。

每个学生成绩的处理流程都是一样的,30名学生成绩的处理无非是对每个学生成绩处理流程进行30次的重复,而每次只需输入不同的学生成绩即可。

因此,该问题的求解算法是:

只需在例4.3的基础上加一个循环处理。

设一个变量n用来累计已处理完的学生成绩的个数,当处理完30个成绩后,程序结束。

二、for语句(P58)

for(表达式1;

表达式2;

表达式3)

循环体语句

for循环结构的执行过程如图:

例5.3用for循环实现例5.1

for(i=1,sum=0;

i<

=10;

i++)

使用for循环结构应注意以下几点:

(P59)

①for循环结构也具有“先判断,后执行”的特点。

for循环结构相当于如下形式的while结构:

表达式1;

while(表达式2)

循环体

表达式3;

②从语法上看,for的3个成分都是表达式,他们之间都以分号“;

”隔开。

表达式1和表达式3通常是赋值表达式或函数调用,有时也可以是逗号表达式,一般用来实现对循环控制变量初始化和循环控制变量增(减)值。

表达式2通常是关系表达式或逻辑表达式,但也可以是数值表达式或字符表达式,是用来表示循环继续的条件,只要其值为非零,就可执行循环体。

例如:

for(i=1,sum=0;

=100;

i++,i++)

sum+=i;

其中,表达式1与表达式3都是逗号表达式。

此外,for的3个表达式还允许部分或全部省略。

当省略表达式1时,应该在进入for循环结构之前有适当的给循环控制变量初始化的语句;

当省略表达式3时,应该在循环体内含有改变循环控制变量的值的语句;

当表达式2省略时,应该在循环体内设置相应的语句来结束循环,否则循环将无休止地继续下去(因为循环继续的条件被认为总为“真”)。

③由于for循环结构书写形式灵活多样,如果在3个表达式中过多地加入与循环控制无关的内容,容易降低可读性。

因此,通常使用一种更为简单明了的for循环结构形式,即为:

for(循环控制变量赋初值;

循环条件;

循环控制变量增(减)值)

例如,将例5.3中的for循环结构改为:

sum=0;

for(i=1;

……

例5.4输入整数n,求n!

这是一个“连乘”的问题。

为得到连乘的积,程序中需要有:

①用来存放连乘积的变量(fac),其初值为1;

②控制连乘个数的循环控制变量(i),其初值为1,终值为n,每次增量为1;

③每次要连乘的乘数,由于其恰好与循环控制变量(i)的值相吻合,因此可用循环控制变量的值代替。

程序如下:

intn,i,fac;

Pleaseentern:

n);

fac=1;

for(i=1;

=n;

fac=fac*i;

%d!

=%d\n"

n,fac);

说明:

上例中的for循环结构还可以改为以下几种形式。

形式1(省略表达式1):

i=1;

For(;

形式2(省略表达式3):

For(i=1;

{

fac=fac*i;

i++;

形式3(循环体为空语句):

fac=fac*i,i++);

do

}while(表达式);

do~while循环结构的执行过程如图所示:

例5.5用do~while循环结构实现例5.1

do

}while(i<

=10);

使用do~while循环结构应注意以下几点:

①do~while循环结构的特点是“先执行,后判断”,因此无论循环继续的条件是否成立,循环体中的语句至少被执行一次。

这是他与while循环结构的本质区别。

②如果循环体包含一个以上的语句,则也应该用花括号括起来,以复合语句的形式出现。

③循环体内一定要有改变循环条件的语句,使得循环趋向于结束。

循环嵌套是指:

在一个循环体内又包含了另一个完整的循环结构。

3种循环不仅可以自身嵌套,而且还可以互相嵌套。

例5.6编程输出以下形式的乘法“九九表”

1*1=11*2=21*3=31*4=41*5=51*6=6  ……

2*1=22*2=42*3=62*4=82*5=102*6=12 ……

9*1=99*2=189*3=279*4=369*5=459*6=54 ……

首先观察第1行乘法表的变化规律:

被乘数为1不变,而乘数从1变化到9,每次增量为1。

因此,构造如下循环即可实现第1行乘法表的输出:

for(j=1;

j<

=9;

j++)

printf(“%1d*%1d=%2d”,1,j,1*j);

再观察第2行乘法表的变化规律:

与第1行惟一不同的是被乘数为2,而处理过程完全一样。

因此,只需将被乘数改为2,对上述循环再执行一次即可。

同理,第3行,第4行,……,只需让被乘数从1变化到9对上述循环执行9次即可。

因此,在上述循环的外面再加上一个循环(即构成双重循环),即可得所求的乘法“九九表”。

inti,j;

i++)//i作为外循环控制变量控制被乘数变化

for(j=1;

j++)//j作为内循环控制变量控制乘数变化

%1d*%1d=%2d"

i,j,i*j);

//i*j即为两个数的乘积

\n"

//换行

双重循环的执行过程是:

先执行外循环,当外循环控制变量i取初值1后,执行内循环,在内循环j从1变化到9的过程中,i始终不变,直到内循环执行完毕,到了外循环,i才变为2,而后再执行内循环,j又从1变化到9……如此下去,直到外循环控制变量i超过终值,整个双重循环才执行完毕。

例5.71全班有30名学生,每名学生考8门课。

要求分别统计出每名学生各门课的平均成绩。

首先考虑一名学生各门课的平均成绩。

设置循环控制变量i控制课程数,其变化从1到8,每次增量为1。

算法表示如下图1。

每个学生的处理过程是一样的,因此,只需对上述流程重复执行30遍(即形成双重循环,每遍输入不同学生的各门课成绩)。

设置循环控制变量j控制学生人数,其变化从1到30,每次增量为1。

算法表示如下图2。

inti,j,score,sum;

floataver;

j=1;

while(j<

=30)

=8;

EnterNO.%dthescore%d:

j,i);

score);

//输入第j名学生第i门课程的成绩

sum=sum+score;

//累计第j名学生的总成绩

aver=sum/8.0;

//计算第j名学生的平均成绩

NO.%daver=%5.2f\n"

j,aver);

//输出第j名学生的平均成绩

j++;

考虑以下两个问题:

程序中的变量sum,为什么要赋初值0?

其位置如何?

如果对该问题进一步提问:

统计出全班的总平均成绩?

(ex5-72.cpp)

floataver,total,total_aver;

total=0;

total=total+aver;

total_aver=total/30.0;

Classtotal_averis:

%5.2f\n"

total_aver);

使用循环嵌套结构要注意以下几点:

①外层循环应“完全包含“内层循环,不能发生交叉。

②嵌套的循环控制变量一般不应同名,以免造成混乱。

③嵌套的循环要注意正确使用“缩进式“书写格式来明确嵌套循环的层次关系,以增加程序的可读性。

5.4循环结构程序设计举例(P65)

例5.8输入10个整数,求出其中的最大值与最小值。

设输入数为x,最大值为max,最小值为min。

首先输入第1个数并作为max与min的初值,然后每输入一个数,都将其与max和min比较。

如果他大于max,则用他替代原来的max的值;

如果他小于min,则用他替代原来的min的值。

如此重复下去,max始终存放的是当前已输入数的最大值,min始终存放的是当前已输入数的最小值。

直至第10个数输入完并比较完后,max就是最大值,min就是最小值。

算法表示如图:

{inti;

intx,max,min;

pleaseinputthefirstnumber:

max=x;

min=x;

for(i=2;

pleaseinputthenextnumber:

if(x>

max)

elseif(x<

min)

min=x;

max=%d,min=%d\n"

max,min);

例5.9利用格里高利公式求∏:

                  …… 

                     

直到最后一项的绝对值小于等于10-6为止

设置一个符号变量sign来控制每次要累加的数据的符号。

math.h>

{intsign=1;

floatn,pi,t;

t=1.0;

n=1.0;

pi=0.0;

{pi=pi+t;

n=n+2;

sign=-sign;

t=sign/n;

while(fabs(t)>

=1e-6);

pi=pi*4;

pi=%f\n"

pi);

例5.10对求全班平均成绩问题进行一般化处理。

即要求程序在每次运行时能够处理任意个数的成绩。

由于要求程序能够处理任意个数的成绩,程序循环的次数是不确定的。

因此可以采取一个专门的值来指示数据输入的结束,这个值就称为“标记值”或称为“信号值”。

用户将所有要处理的正常数据键入以后,键入该“标记值”(用于表示已输入完最后一个处理数据),此时,程序接收到这个“标记值”,即终止循环。

{intn,score,sum;

floataverage;

n=0;

Enterscore,-1toend:

while(score!

=-1)

{sum=sum+score;

n=n+1;

printf("

if(n!

=0)

{average=(float)sum/n;

Classaverageis%5.2f\n"

average);

else

NOscorewereentered.\n"

程序说明:

①由于考试成绩通常是非负数据,所以本例可用“-1”作为“标记值”;

②由于不能被0除,所以在进行求平均成绩之前要进行测试,以保证程序正确运行;

③在请求键入数据的提示信息中,明确地把标记值告诉用户,是一种良好的程序设计习惯。

例5.11输入一个整数n(n≥3),判断是否为素数(质数)。

数学方法已证明:

若要判断一个整数n否为素数,只需用2~√n各数去除n,如果都除不尽,n就是素数;

只要有一次除尽了,n就不是素数。

设置一个开关变量flag,用于标识是否除尽。

Flag初值为1(“真”,一旦某一次除尽了就将其置为0(“假”),从而终止循环。

当循环结束时,若flag为“真”,就表明n是素数。

{intn,i,flag;

Enterainteger:

i=2;

flag=1;

while(i<

(int)sqrt(n)&

&

flag)

if(n%i==0)

flag=0;

if(flag)

%disprimenumber.\n"

n);

%disnotprimenumber.\n"

例5.12输出如下形式的图案。

********

这是一个6行8列的星形矩阵。

对于这类图案的输出关键是找出其规律,理解控制变量所代表的实际意义。

分析语句:

printf(“*”);

的功能;

对该语句重复若干次其结果是:

********……

{inti,j;

=6;

{for(j=1;

*"

总结:

通过上述例题可以看出,所谓循环就是在循环条件为“真”时,让计算机反复执行一组指令,直到循环条件为“假”时终止。

实际应用中用到的大多数循环通常分为两类:

一类是次数确定的循环,一类是次数不确定的循环。

次数确定的循环通常采用计数器的方式控制循环。

循环控制变量用来控制循环的次数,循环控制变量要有:

初始值、每次变化的增量及控制循环是否终止的终值和测试条件。

次数不确定的循环通常采用“标记值”的方式控制循环。

“标记值”表示获取数据的结束,“标记值”是在所有合法的数据项都提供给程序后的键入值。

“标记值”必须不同于正常的数据项,以免发生混淆。

无论是用计数器控制循环,还是用标记值控制循环,在实现过程中,都要注意使开发的程序具有通用性。

3种循环的比较:

①3种循环都可以用来处理同一问题,一般情况下他们可以互相代替。

②do~while循环类似于while循环,不同之处是他们执行循环体和计算表达式的先后顺序不同。

此外,从流程图可以看出,do~while循环至少要执行一次循环体,而while和for循环在进入循环体之前,首先要判断循环条件的表达式,如果条件不成立,则循环体一次也不执行就结束循环流程,所以,这两种循环可能执行零次或若干次。

③while和do~while循环,在while后面指定循环条件,在循环体中包含应重复执行的操作语句。

而for循环可以在表达式3中包含使循环趋于结束的操作,甚至可以将循环体中的操作全部放到表达式3中。

④用while和do~while循环时,循环变量初始化的操作应在while和do~while之前完成。

而for语句可以在表达式1中实现循环变量的初始化。

break语句的功能是使执行从包含他的最内层循环或开关语句中跳出,转到switch结构或循环结构外的下一语句执行。

这将导致包含他的最内层循环或switch语句的终止。

break语句的一般形式:

break;

例5.13计算r=1到r=10的圆的面积,直到其面积大于100为止。

{intr;

floatpi=3.14159;

floatarea;

for(r=1;

r<

r++)

{area=pi*r*r;

if(area>

100)break;

r=%dareais%f\n"

r,area);

从for循环可以看到:

当area>100时,执行break语句,循环将提前结束,即不再执行其余的几次循环。

使用break语句应注意以下几点:

(P70)

①break语句只能用于switch结构或循环结构中。

在循环结构中应用时,一般要有if语句配合使用。

②在嵌套的循环结构中使用时,break语句只能跳出(或终止)包含他的最内层循环,而不能同时跳出(或终止)多层循环。

continue语句的作用是结束本次循环,使得包含他的循环开始下一次循环。

continue语句的一般形式为:

continue;

例5.14输出100~200范围内不能被5整除的数。

执行continue

{intn;

for(n=100;

n<

=200;

n++)

{if(n%5==0)continue;

%d\t"

使用continue语句时要注意以下几点:

①continue语句只能用于循环结构中,通常也要有if语句配合使用。

②continue语句和break语句虽然都实现了程序执行方向的无条件转移,但他们的区别是:

continue语句只能结束本次循环,而不是终止整个循环的执行;

break语句则是立即结束整个循环的过程,不再进行条件判断。

例如;

以for循环为例。

for(表达式1;

表达式3)for(表达式1;

{{

……

continue;

……

}}

三、goto(转向语句)

goto语句为无条件转向语句,其功能是:

把程序控制转移到标号指定的语句处,使程序从指定的标号处的语句开始继续执行。

goto语句的一般形式为:

goto标号;

标号:

语句;

标号是由用户命名的标识符,其后要跟一个冒号。

标号的命名规则与变量名相同,其作用识用来表示goto的目标。

标号可以用

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 农学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1