510 likes | 620 Views
第三章 控制结构. 上一章内容回顾. 基本数据类型 运算符 赋值表达式与变量的自增自减 基本输入输出 函数:自定义函数、库函数. 本章内容. 重点: 分支结构 if…else… (条件语句) switch (多分支语句) 循环结构 while do…while for. 真. 假. 条件. 语句 1. 语句 2. 分支结构:条件语句 if…else…. 条件语句的形式: if ( 条件 ) 语句 1; else 语句 2; “ 条件 ”就是逻辑表达式。
E N D
上一章内容回顾 • 基本数据类型 • 运算符 • 赋值表达式与变量的自增自减 • 基本输入输出 • 函数:自定义函数、库函数
本章内容 重点: • 分支结构 • if…else… (条件语句) • switch (多分支语句) • 循环结构 • while • do…while • for
真 假 条件 语句1 语句2 分支结构:条件语句if…else… 条件语句的形式: if (条件) 语句1; else 语句2; • “条件”就是逻辑表达式。 • 如果“语句”不只一句,则用花括号把它们封装起来成为一个复合语句。 • 有时候可能只有if而不需要else,但有else必须有if。
【例3-1】 输入3个整数,求其最大值。 算法: ①输入的3个整数存于变量a、b、c中; ②max=a; ③如果max<b,则max=b; ④如果max<c,则max=c; ⑤输出变量max。 讨论: 按上面的算法,最后得到max一定是最大值吗?
【例3-1】 输入3个整数,求其最大值。 算法: ①输入的3个整数存于变量a、b、c中; ②如果a>=b且a>=c,则max=b; ③如果b>=a且b>=c,则max=b; ④如果c>=a且c>=b,则max=c; ⑤输出变量max。 讨论: a>=b且a>=c可以改为a>=b且b>=c 吗? 上面两个算法,哪个算法更方便处理更多个数据?
课堂练习 • 输入5个整数,输出其最小值。 讨论: 如果有一个函数能求两个数的最大(小)值,用它能否求得更多数的最大(小)值呢?
【例3-2】输入3个数,判断能组成何种三角形。【例3-2】输入3个数,判断能组成何种三角形。 [分析] • 必须是正数; • 必须能组成三角形; • 等边三角形、等腰三角形、直角三角形、一般三角形
if 语句的嵌套 if ..else配对原则 :它缺省{ }时, else总是与上面的最近的、未配对的if配对 • if 语句的嵌套: • 在if语句中又包含一个或多个if语句,称为if语句嵌套if (条件1)if (条件2) 语句1; else 语句2;else if (条件3) 语句3; else 语句4;
if 语句的嵌套 if ..else配对原则 :它缺省{ }时, else总是与上面的最近的、未配对的if配对 • if 语句的嵌套: • 在if语句中又包含一个或多个if语句,称为if语句嵌套 if (条件1) if (条件2) 语句1;else语句2; if (条件1)if (条件2) 语句1; else语句2;
if 语句的嵌套 if ..else配对原则 :它缺省{ }时, else总是与上面的最近的、未配对的if配对 • if 语句的嵌套: • 在if语句中又包含一个或多个if语句,称为if语句嵌套 if (条件1){ if (条件2) 语句1;} else语句2; if (条件1) if (条件2) 语句1;else语句2;
【例3-3】谁做了好事? [分析] 满足什么条件的人才是做好事的人? 穷举法: 假设是A 假设是B 假设是C 假设是D
上机作业 • 上机理解例题3-4; • 习题3.3和3.15。
小结 ① if语句 ② if可以没有else,但else必须有if ③ else总是与上面的最近的、未配对的if配对
内容回顾 • 条件语句 if (条件) 语句1; else 语句2; 如果条件为真,则执行语句1,否则执行语句2。 如果“语句”不只一句,怎么办? • 条件语句的嵌套 • if必须有else吗? else必须有if吗?当有多个if时,else如何配对?
分支结构:多分支语句switch • 一个if语句处理的是两个分支;要处理多分支问题,可以采用if语句的嵌套来实现。 • 当分支越多时,嵌套的if语句的层数越多程序会越冗长,可读性越低。
switch 表达式 case E1 E2 En default 语句组1 语句组2 语句组n 语句组 ... 分支结构:多分支语句switch switch后面的“开关表达式”,不能是实数; case 后面的常数,也不能是实数。 switch (开关表达式) { case 常数1: 语句1; case 常数2: 语句2; ……. case 常数N: 语句N; [default: 语句组 N+1;] } • swith 的一般形式为:
【例3-4】简单菜单。 [分析] 第1步:屏幕显示菜单列表,提示选择: 0. 退出程序 A. 华氏转摄氏 B. 摄氏转华氏 请选择: 第2步:根据选择的字符,做相应的事情。
【例3-4】简单菜单。 [分析] 第2步:根据选择的字符,做相应的事情。 细化: 如果输入的字符是: ① ‘0’,则return; ② ‘A’或者‘a’,则输入华氏温度x,调用H2C(x)得到摄氏温度; ③ ‘B’或者‘b’,则输入摄氏温度x,调用C2H(x)得到华氏温度; ④其它值,则输出“选择错误!”。 (1)用if ……else 实现 (2)用switch实现
课堂练习 • 算法: • 输入成绩 score (float型) • 若score<0或score>100,则退出 • 若score≥90 ,则输出'A' • 否则,若score≥80 输出'B' • 否则,若score≥70 输出‘C' • 否则,若score≥60 输出‘D' • 否则,输出‘E' • [90, 100]: 等级 A • [80, 90): 等级 B • [70, 80): 等级 C • [60, 70): 等级 D • [0, 60): 等级 E • 根据学生的百分制成绩,输出学生成绩的等级。
课堂练习 • 算法: • 输入成绩 score (float型) • 若score<0或score>100,则退出 • 若score≥90 ,则输出'A' • 否则,若score≥80 输出'B' • 否则,若score≥70 输出‘C' • 否则,若score≥60 输出‘D' • 否则,输出‘E' • [90, 100]: 等级 A • [80, 90): 等级 B • [70, 80): 等级 C • [60, 70): 等级 D • [0, 60): 等级 E • 根据学生的百分制成绩,输出学生成绩的等级。
求整数1到5的连加,怎么编程? 讨论 • 求整数1到100的连加,怎么编程? 分析:让我们找出问题的规律 sum=sum+i (i=1,2,3,…,100) • sum=sum+i被重复执行 • 变量i有规律的变化 解决这类问题可以采用 #include”stdio.h” void main() { int sum=0; sum=sum+1; sum=sum+2; sum=sum+3; sum=sum+4; sum=sum+5; printf("sum=%d",sum); } #include”stdio.h” void main() { int sum=0; sum=sum+1; sum=sum+2; sum=sum+3; ........ sum=sum+100; printf("sum=%d",sum); } 循环结构
假(=0) 条件? 真 语句 下一语句 循环:while 语句 • while 语句的一般形式: while (条件) { 语句; } • 当“条件”成立,反复执行“语句”。 • 先判断“循环条件”,再执行“循环体”。
开始 i=1, sum=0 N i<=100 循环条件 Y sum = sum+i i=i+1 输出sum 结束 while语句 #include”stdio.h” void main( ) { int i=1, sum=0; while ( i<=100 ) { sum=sum+i; i++; } printf("%d",sum); } • 用while语句求: 循环体
讨论 • 循环体部分的花括号{ }去掉,可以吗? • 如果i置为0,可以吗? • 如果i置为0,i++放到sum=sum+i的前面,可以吗? • 求和:1+2+3+…+n (其中,n由用户从键盘输入)。 • 求1到n的偶数之和。
循环:while语句 i = 1; sum = 0; while ( i <= 100 ) { sum = sum + i; ++ i; } i = 1; sum = 0; while ( i <= 100 ) sum += i++; i = 1; sum = 0; while ( i <= 100 ) { if ( i%2 ) sum += i; ++i; }
小结 ①条件语句最多提供两条路选择,二选一; 多分支语句,提供多条路选择,多选一。
小结 ② while循环 • 循环体包含一个或多个语句,当包含多个语句时,应以复合语句形式出现 • 循环体中一定要有能够使循环趋向于结束的语句,避免出现“死循环”
上机作业 • 默写例题3-5的程序; • 预习外两种循环: do … while for • 习题3.1和3.4。
内容回顾 • 条件语句:if … else… • 多分支语句:switch • while循环
课堂练习 • 求1到100的奇数之和。 • 学会使用continue和break
break和continue • break: • 在循环语句中,跳出并终止循环体 • break只能终止并跳出最近一层的结构 • continue: • 结束本次循环,跳过循环体中尚未执行的语句,进行下一次是否执行循环体的判断
【例3-6】合成键盘输入的数。 [分析] 从键盘输入数字字符,如’1’、’2’、’3’,把这些字符变成一个整数,如123(一百二十三)。 • 如何接收字符? • ‘1’ —> 1 ?如何转换? • 如何合成?
循环 • while • do…while • for
循环:while 语句 • while 语句的一般形式: while (条件) { 语句; } • 当“条件”成立,反复执行“语句”。 • 先判断“循环条件”,再执行“循环体”。
表达式1 假(=0) 表达式2? 真 语句 表达式3 循环:for 语句 • for 语句的一般形式: for(表达式1;表达式2;表达式3) 语句; • 表达式1:准备。 • 表达式2:条件。 • 表达式3:善后处理。 • 先判断“条件”,后执行“循环体” • 括号中的两个分号是必需的!!!
for语句转换成while语句 求1……100的和 sum = 0; for( i= 1; i<=100; i++) sum += i; for (准备;条件;善后处理) 语句; 相当于: 准备; while(条件) { 语句; 善后处理; } 求1……100的和 sum = 0; i = 1; while( i<=100 ) { sum += i; i++; }
【例3-8】求1到100之间奇数之和。 #include”stdio.h” void main( ) { int i=1, sum; sum=0; for(i=1; i<=100; i++) { if(i%2!=0) sum+=i ; } printf(“结果=%d\n",sum); } 用for实现。
讨论 • 变量sum赋初值可以放到for里吗?如何放?(用逗号隔开,构成逗号表达式) • for( i=1; i<=100; i++); ? • 循环体{ if(i%2!=0) sum+=i ; }的花括号{ }可以去掉吗? • 程序的循环体可以用continue吗?如何修改?
讨论 • for 语句的一般形式: for(表达式1;表达式2;表达式3) 语句; for语句中表达式1,表达式2,表达式3都可省略,但分号不可省略! ①如何理解for( ; ; )?for( ; ; ) putchar(‘A’); ②for( ; ; ) ; putchar(‘A’); ③for( ; 0 ; ) ; putchar(‘A’); ④ for( ; ; ) 相当于 while(1)
【例3-9】 判断正整数是否为素数。 输出1000以内的素数。
小结 循环结构的三种表达方式: • while • do…while • for break continue
上机作业 • 习题3.2和3.5。
语句 真 条件? 假(=0) 循环:do…while 语句 • do…while 语句的一般形式: do 语句; while (条件); • 先执行“循环体”,再判断“循环条件”。 • “语句”很可能是“复合语句”。 • 与while很像,但do…while至少执行一次“语句”,而while不一定。
循环条件 例:求1到100之和。 #include”stdio.h” void main( ) { int i=1, sum=0; do { sum=sum+i; i++; } while( i<=100 ); printf("%d",sum); } 用do…while 实现。 循环体
do…while 语句 1 101 1 101 5050 0 5050 101 void main( ) { int i, sum=0; scanf("%d", &i); while ( i<=100 ) { sum=sum+i; i++; } printf("%d",sum); } void main( ) { int i, sum=0; scanf("%d", &i); do { sum=sum+i; i++; } while ( i<=100 ); printf("%d",sum); } • while语句 和 do…while 语句比较: • while语句——先判断条件,后执行语句do~while语句——先执行循环体,后判断条件 • while语句——循环体执行次数≥0do~while语句——循环体执行次数≥1
例:输入错误,则重新输入。 …… do { printf(“请输入一个不小于2的整数:”); scanf(“%d”,&n); } while( n<2 ); ……
本章内容回顾 • 控制结构有哪些? • 分支 • if(条件)…else… • switch(开关表达式) • 循环 • while (条件) • do…while (条件) • for(准备;条件;善后) • 另外涉及的保留字 • case break continue goto
【例3-3】谁做了好事? [分析] 满足什么条件的人才是做好事的人? 穷举法: 假设是A 假设是B 假设是C 假设是D (1)用多个if ……else 实现,不用循环结构 (2)用循环结构
综合应用 • 习题3.1~3.5 • 习题3.15 • 例题3-12