[高等教育]C语言第5章 循环结构设计_OK
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2021/8/18
30
应用实例: 求任意个学生的平均成绩
#include <stdio.h>
void main() {
标记控制循环
int counter=0,total=0,score=0;
float average;
printf("input one score,end flag is -1\n");
例5.6 使用级数求的近似值
1 1 1 1 ... (1)n1 1
4
357
2n 1
#include <stdio.h> #include<math.h> void main() {
int s; float n,t,pi; t=1; pi=0;n=1.0;s=1; while(fabs(t)>1e-6) {pi=pi+t;n=n+2;s=-s;t=s/n;} pi=pi*4; printf("pi=%10.6f\n",pi); } 2021/8/18
i 1
假
i<=100
真
sum sum+i i i+1
输 出结 果sum
6 2021/8/18
例5.1 编码实现
main() {
int i=1,sum=0; while(i<=100) { sum=sum+i;
i++; } printf("%d \n",sum);
}
7
“i=1”可否换成: “i=0”
2021/8/18
4
while 语句
一般形式: while(表达式) 语句
循环条件:决定是否 执行循环体,表达式 值为“真”则执行循
环体
循环体:重复执行 的操作直至表达式
的值为false
表 达式
=0
0
语句 (循 环体)
特点: 先判断表达式,后执行语句
5
2021/8/18
【100 例i 5.1】求 sum=0 i=1
{ s = s+x ; k += 2 ; sign = -sign ; x = sign / (double)k;
} while ( fabs (x) >1e-6 ) ;
pi = s * 4 ;
22
// 累加当前项 // 后项分母 // 变号 运////行求求结果后:项
pi= 3.141594
2021/8/18
}
2021/8/18
21
例5.6 使用级数求的近似值
1 1 1 1 ... (1)n1 1
4 357
2n 1
思路一:设第 k 项 Xk = 1 / k
第 k + 1项 Xk+1 = (-1) / ( k + 2 )
double s = 0, x = 1, pi ; int k = 1; int sign = 1 ; do
14
容易出错的地方
• 变量运算前没有赋初值 • 临界点使用< <= 或者> >=出现错误 • 条件判断永真,出现死循环
2021/8/18
15
do-while 语句
一般形式:
do
循环体语句
语句
while (表达式);
特点:
先执行一次指定的
表 达式
循环内嵌语句,然后判
0
断条件表达式。
=0
图6_4
char c;
COMPUTER↙ (输入)
computer
(输出)
而不是
CcOoMmPpUuTtEeRr
do
{
c=getchar();
if(c>='A'&&c<='Z')c+=32;
putchar(c);
}
while(c!='\n');
}
问题:试着改为while循环结构。
2021/8/18
19
课堂练习
counter=0?
printf("the average is %f\n",average);
}
2021/8/18
31
课堂练习
每名学生有三门课程,共n名学生,统计出每名学生的平均成绩。
2021/8/18
32
i、sum不赋初值会 怎样
“i<=100”可否换 成:“i<100”
“i++”没有会怎 样
2021/8/18
100
sum i i 1
int i = 1 , sum = 0 ; while ( i <= 100 ) {
sum = sum + i ; i ++ ; }
2021/8/18
可以写成: sum + = i ;
☺ 在循环体中应有使循环趋向于结束的语句,以免形成死 循环。
☺ቤተ መጻሕፍቲ ባይዱ允许循环体以空语句形式出现。(延时效果)
2021/8/18
9
【例5.2】求2n
p 1;
p p
p p
* *
22; ;
执行n次 p
241
......
p p * 2;
2021/8/18
× 2
10
【例5.2】求2n
p 1;
p p
sum=55
再运行一次:
再运行一次:
#inclu1d1e↙<stdio.h> vsuomid=m0 ain()
#include<stdio1.1h↙> void mainsu()m=11
{ int sum=0,i;
{ int sum=0,i;
scanf(“%d”,&i);
scanf(“%d”,&i);
p p
* *
22; ;
......
p p * 2;
执行n次
2021/8/18
i=1, p=1
i≤n? p= p*2
循环规 律
i=i+1
计数 器 11
【例5.2】求2n
i=1,p=1 输入 n 当 i<=n
p p*2 i i+1 输出 p
main()
{
int i=1,n; long int p=1; scanf("%d",&n); while(i<=n) {
while(i<=10)
do
{
{
si+um+;=sum说+i;明:当while后面的表达式的si+u第m+一;=s次um的+i;值为“真”
}
时,两种循环得到的结果}w相hil同e(i<。=否10)则; ,二者结
printf(“sum=%果d不\n相″同。
printf(“sum=%d\n″
,sum);
scanf("%d",&score); while(score!=-1)
第一次输入-1 ?
{
total=total+score;
counter++;
printf("input one score,end flag is -1\n");
scanf("%d",&score);
}
if(counter) average =(float)total / counter;
第5章 循环结构程序设计 (一)
1 2021/8/18
本章主要内容
• C语言中的三种循环语句:
– while语句 – do……while语句 – for语句
• 循环体中的辅助控制语句:
– break语句 – continue语句 – goto语句
2021/8/18
2
本节课主要内容
• while语句 • do……while语句
sum=sum+i; i++; } while(i<=100); printf(“%d\n″,sum); }
改为: i++; sum=sum+i;
2021/8/18
18
【例5.5】将键盘输入字符中所有大写字母转换
为小写字母,其他字符不变。
#include <stdio.h> 运行情况:
Void main() {
2021/8/18
3
循环结构——结构化程序设计的基 本结构之一
• 顺序结构 • 选择结构
本章是 全书的 重点和难点!
• 循环结构:为解决某一问题,或求取某一计算结果,
特定的条件下,程序中反复地按某一模式进行操作。
① 无休止循环—死循环 ② 有终止循环—有效循环
条件:循环体---需要重复执行的操作 循环结束条件---在什么情况下停止重复的操作
p*=m; i++; } printf("%d\n",p); 13 }
i=1,p=1 输入m,n
当i<=n p=p*m i=i+1
输出p
2021/8/18
循环三要素
• 规律----循环体的算法 • 临界点----循环的条件,循环结束的条件 • 循环条件的改变----如何改变使循环趋于结束
2021/8/18
应用实例
班里有10个学生参加测验,可以提供考试成绩( 0到100的整数值),以确定 全班平均成绩。
2021/8/18
28
标记控制循环
✓ 标记控制重复也称为不确定重复(indefinite repetition),因
为执行循环之前无法事先知道重复次数。
✓ 用一个特殊值作为标记值,表示数据输入结束。例:用 户输入一个标记值,表示最后一个成绩已经输入。
i++;
或: sum + = i + + ;
如果写成: sum + = + + i ;
会有什么问题?
8
注意:
☺ while语句中的“表达式”(即判断条件)可以是任意的 表达式,但一般为关系表达式或逻辑表达式,结果只有 两种:真(非0)或假(0)。
☺ 循环体如果包含一个以上的语句,应该用花括弧括起来, 以复合语句形式出现。{语句1;语句2;。。。}
x = 1.0* sign / ( 2 * k-1 ) ;
}
while ( fabs (x) >1e-6 ) ;
pi = s * 4 ;
// 累加当前项 // 后项分母 // 变号 // 求后项
// 精度判断
2021/8/18
24
while和 do-while循环的比较
• 凡是能用while循环处理,都能用do…while循环处理。 do…while循环结构可以转换成while循环结构。
,sum);
2021/8/18
26
控制循环的方法
• 计数器控制循环 • 标记控制循环
2021/8/18
27
• 计数器控制循环
常用一个计数器变量(counter)统计循环执行的次数,在循环执行前将其赋 予特定的值,并在循环体执行的过程中不断对其进行修改,这种用计数器控制 循环的方法常应用于确定次数的循环(definite repetition,即循环执行之前已知 重复次数) 。
✓ 标记值不能与可接受的输入值混淆起来。
应用实例:开发一个计算全班平均成绩的程序,
在每次程序运行时处理任意个成绩数。
2021/8/18
29
应用实例: 求10个学生的平均成绩
#include <stdio.h> void main() {
int counter=1,total=0,score; float average; while(counter<=10) {
16 2021/8/18
do_while
while
循环体
True
表达式
False
表达式
True
循环体
False
do while 至少执行一次循环体内的语句!
2021/8/18
17
【例5.4】求
100
n
n1
#include <stdio.h> void main() {
int i=1,sum=0; do {
printf("input one score\n"); scanf("%d",&score); total=total+score; counter++; } average=(float)total/10; printf("the average is %f\n",average); }
计数器控制循环
输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
2021/8/18
20
【例5.6】 用π/4≈1-1/3+1/5-1/7+…公式求π的近似值,
直到某一项的绝对值小于1e-6为止。
思路: 用循环对各项值迭加,直至被加项 < 循环条件: | x | > 10-6 循环终止条件: | x | 10-6 循环体算法: { 累加当前项; 求下一项值;
p*=2; i++; } printf("%d\n",p);
}
计数器 赋初值
运算前 赋初值
循环条件 结束条件
改变循环条 件语句
12 2021/8/18
【例5.3】求mn
main() {
int i=1,m,n; long int p=1; scanf(“%d”,&m); scanf(“%d”,&n); while(i<=n) {
While语句实现
23
例5.6 使用级数求的近似值
1 1 1 1 ... (1)n1 1
4
357
2n 1
思路二:直接用通项描述迭加
double s = 0, x = 1, pi ;
int k = 1;
int sign = 1 ;
do
{
s=s+x;
k ++ ;
sign =- sign;
• 在一般情况下,用while语句和用do-while语句处理同一问 题时,若二者的循环体部分是一样的,它们的结果也一样。 但是如果while后面的表达式一开始就为假(0值)时,两种循 环的结果是不同的。
2021/8/18
25
while和do-while循环的比较
运行结果:
运行结果:
1↙
1↙
sum=55