c第5章教学zpWord文件下载.docx
- 文档编号:21761089
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:21
- 大小:103.14KB
c第5章教学zpWord文件下载.docx
《c第5章教学zpWord文件下载.docx》由会员分享,可在线阅读,更多相关《c第5章教学zpWord文件下载.docx(21页珍藏版)》请在冰豆网上搜索。
然后再计算表达式的值,重复上述过程,直到表达式的值为“假(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的目标。
标号可以用
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 教学 zp
![提示](https://static.bdocx.com/images/bang_tan.gif)