第 四 章 循环结构 while语句 do {} while 语句 break和continue语句

Slides:



Advertisements
Similar presentations
CSIM, PU C Language Introduction to the C Programming Language 重覆敘述 (for,while,break,continue) 適合重複性的計算或判斷.
Advertisements

《C语言程序设计》复习
循环模式 流程图的画法: 条件 y 循环体 伪代码: n Do while 条件 循环体 loop 每个循环模式的结构都是一个入口,一个出口.
第六章 循环控制.
Loops.
第一章 C语言概述 计算机公共教学部.
数学建模与MATLAB 第五讲:循环结构(1) 2017/9/12.
第3章 While循环程序设计.
C语言程序设计 第八章 函数.
第一章 程序设计入门.
高级语言程序设计 主讲人:陈玉华.
循环结构又称为重复结构:用来处理需要重复处理的问题,它是程序中一种很重要的结构。
第3章 顺序结构程序设计 本章要点: 格式化输出函数──printf() 格式输入函数——scanf() 字符输出函数——putchar()
Chap 10 函数与程序结构 10.1 函数的组织 10.2 递归函数 10.3 宏定义 10.4 编译预处理.
循环结构 NEAU ACM-ICPC TEAM 主讲人:NEAU_ACM_Team.
If … else 選擇結構 P27.
Chap 2 用C语言编写程序 2.1 在屏幕上显示 Hello World! 2.2 求华氏温度 100°F 对应的摄氏温度
第3章 C语言的基本语句 和程序结构设计.
Introduction to the C Programming Language
第七章 函数 目录 有参的加法函数的开发 函数定义的一般形式 函数参数和函数的值 函数的调用
Function.
2017北一女中 資訊能力競賽 暑期培訓營
QQ: 李祥 QQ: 欢迎多种方式的学习交流,祝大家学有所成.
Introduction to the C Programming Language
作弊是否很有诱惑性? 上堂课已经讲了 作业不一定在两个小时里都能完成 答疑没有一个人? 作弊是有记录的 心理系很多同学集体作弊,让人震惊
第一单元 初识C程序与C程序开发平台搭建 ---观其大略
Chap 5 函数 5.1 计算圆柱体积 5.2 使用函数编写程序 5.3 变量与函数.
Chap 3 分支结构 3.1 简单的猜数游戏 3.2 四则运算 3.3 查询自动售货机中商品的价格.
第四章 C 语言中的输入和输出.
1. 說明一個一維整數陣列passwd,下標範圍0至49 2. 在屏幕顯示 "Enter password"
C语言 程序设计基础与试验 刘新国、2012年秋.
Chap 3 分支结构 3.1 统计输入的一批字符中各类字符的数量 3.2 查询自动售货机中商品的价格 3.3 分支结构程序设计.
第五章 循环结构的C程序设计 5.1 while循环语句 5.2 do-while循环语句 5.3 for循环语句 5.4 多重循环
本章中將會更詳細地考慮有關重複的概念,並且會 介紹for和do…while等兩種用來控制重複的敘述 式。 也將會介紹switch多重選擇敘述式。 我們會討論直接和迅速離開某種控制敘述式的 break敘述式,以及用來跳過重複敘述式本體剩餘 部份的continue敘述式。 本章會討論用來組合控制條件的邏輯運算子,最後.
程序的三种基本结构 if条件分支语句 switch多路开关语句 循环语句 循环嵌套 break,continue和goto语句
第5讲 结构化程序设计(Part II) 周水庚 2018年10月11日.
第七章 函数及变量存贮类型 7.1 函数基础与C程序结构 7.2 函数的定义和声明 7.3 函数的调用 7.4 函数的嵌套与递归
Chap 2 用C语言编写程序 2.1 在屏幕上显示 Hello World! 2.2 求华氏温度 100°F 对应的摄氏温度
第1章 概述 本章要点: C语言程序结构和特点 C语言程序的基本符号与关键字 C语言程序的编辑及运行 学习方法建议:
第二章 基本数据类型及运算 C数据类型概述 基本数据类型 运算符和表达式 混合运算与类型转换 数据的输入输出 顺序程序设计举例.
C语言概述 第一章.
程式結構&語法.
第三章 C++的语句和简单的程序设计 主要内容:
for 迴圈 while迴圈 do-while迴圈 break 與 continue goto 與 標籤 程式觀摩
C 语言程序设计 程序的循环结构 电大崇信县工作站 梁海亮.
Introduction to the C Programming Language
Instructor:Po-Yu Kuo 教師:郭柏佑
C语言程序设计 第一章 数据类型, 运算符与表达式 第二章 顺序程序设计 第三章 选择结构程序设计 第四章 循环控制 第五章 数组.
浙江长征职业技术学院—计算机与信息技术系—相方莉制作
Chap 5 函数 5.1 计算圆柱体积 5.2 使用函数编写程序 5.3 变量与函数.
Chap 5 函数 5.1 计算圆柱体积 5.2 数字金字塔 5.3 复数运算.
第十四章 若干深入问题和C独有的特性 作业: 函数指针 函数作参数 函数副作用 运算 语句 位段 存储类别 编译预处理
C程序设计.
《计算机应用基础》 第9章 程序设计基础(二).
第4章 Excel电子表格制作软件 4.4 函数(一).
第2章 认识C语言 教学要点 2. 1 项目二C语言程序识读 2 .2 项目三班级成绩排名 2 .3 知识链接 返回.
Introduction to the C Programming Language
多层循环 Private Sub Command1_Click() Dim i As Integer, j As Integer
第四章 C 语言中的输入和输出.
程序设计基础.
第3章 最简单的C程序设计 3.1 顺序程序设计举例 3.2 数据的表现形式及其运算 3.3 C语句 3.4 数据的输入输出.
第五章 逻辑运算和判断选取控制 §5.1 关系运算符和关系表达式
第七章  数 组.
五 循环结构程序设计 厦大附中信息技术.
Chap 7 数 组 7.1 排序问题 7.2 找出矩阵中最大值所在的位置 7.3 进制转换.
C/C++基礎程式設計班 C語言入門、變數、基本處理與輸入輸出 講師:林業峻 CSIE, NTU 3/7, 2015.
Chap 10 函数与程序结构 10.1 圆形体积计算器 10.2 汉诺塔问题 10.3 长度单位转换 10.4 大程序构成.
第三章 流程控制 程序的运行流程 选择结构语句 循环结构语句 主讲:李祥 时间:2015年10月.
Q1(a) 小偉打算編寫一個程序。該程序把兩個44的表內的數字相加。表3內的數字是由表1和表2應格子內的數字相加而成。例如:
函式庫補充資料 1.
Presentation transcript:

第 四 章 循环结构 while语句 do {} while 语句 break和continue语句 第 四 章 循环结构 while语句 do {} while 语句 break和continue语句 xgliu@cad.zju.edu.cn 13858115132

4.1 用格里高利公式求π的近似值 1,3,5,7,分之一,正负交替 使用格里高利公式求π的近似值,要求精确到最后一项的绝对值小于10–4。 4.1 用格里高利公式求π的近似值 使用格里高利公式求π的近似值,要求精确到最后一项的绝对值小于10–4。 1,3,5,7,分之一,正负交替 xgliu@cad.zju.edu.cn 13858115132

4.1.1 程序解析-求π的近似值 flag = 1; /* int */ denominator = 1; /* int */ 4.1.1 程序解析-求π的近似值 flag = 1; /* int */ denominator = 1; /* int */ item = 1.0; /* double */ pi = 0; /* double */ while(fabs (item) >= 0.0001) { item = flag * 1.0 / denominator; pi = pi + item; flag = -flag; denominator = denominator +2; } pi = pi * 4; xgliu@cad.zju.edu.cn 13858115132

4.1.2 while 语句 while (条件表达式) 循环体语句; 循环条件 循环体 假 表达式 真 循环体语句 while下一条语句 xgliu@cad.zju.edu.cn 13858115132

复合语句 for ( i=1; i<n; i++) sum = sum + i; for ( i=1; i<n; i++) { item = 1.0/i; sum = sum + item; } if( x<y ) { temp = x; x = y; y = temp; } if( x<0 ) x = -x; xgliu@cad.zju.edu.cn 13858115132

while 语句说明 while 语句和for语句 都是在循环前先判断条件 for(表达式1; 表达式2; 表达式3) 循环体语句 表达式1; while (表达式2) { 循环体语句; 表达式3; } 改写for语句为while 语句 xgliu@cad.zju.edu.cn 13858115132

while 和 for 的比较 for (i = 1; i <= 10; i++) sum = sum + i; while (i <= 10){ 循环条件 sum = sum + i; i++; 循环变量的改变 } 循环体 xgliu@cad.zju.edu.cn 13858115132

4.1.3 统计输入的一批学生的平均成绩 例4-2 从键盘输入一批学生的成绩,计算平均分。 分析: 求累加和 确定循环条件 不知道输入数据的个数,无法事先确定循环次数 用一个特殊的数据作为正常输入数据的结束标志,比如选用一个负数作为结束标志。 xgliu@cad.zju.edu.cn 13858115132

#include <stdio.h> Int main(void) { int num; double grade, total; num = 0; total = 0; printf(“Enter grades: \n"); scanf("%lf", &grade); /* 输入第1个数*/ while (grade>= 0) { /* 输入负数,循环结束 */ total = total + grade; num++; scanf (“%lf”, &grade); } if(num != 0) printf(“Grade average is %.2f\n", total/num); else printf(" Grade average is 0\n"); return 0; Enter grades: -1 67 88 73 54 82 Grade average mark is Enter grades: 67 88 73 54 82 -1 Grade average is 72.80 xgliu@cad.zju.edu.cn 13858115132

4.2.2 do - while 语句 do { 循环体语句 } while (表达式) 先循环 后判断 循环体语句 假 表达式 真 xgliu@cad.zju.edu.cn 13858115132

4.2 统计一个整数的位数 从键盘读入一个整数,统计该数的位数。 4.2.1 程序解析 4.2.2 do - while语句 4.2.1 程序解析 4.2.2 do - while语句 4.2.3 循环语句的选择 xgliu@cad.zju.edu.cn 13858115132

4.2.1 程序解析-统计一个整数的位数 int main(void) { int count, number; count = 0; 4.2.1 程序解析-统计一个整数的位数 Enter a number: 12534 It contains 5 digits. int main(void) { int count, number; count = 0; printf(“Enter a number: "); scanf ("%d", &number) ; if (number < 0) number = -number; do { number = number / 10; count ++; } while (number != 0); printf("It contains %d digits.\n", count); return 0; } Enter a number: -99 It contains 2 digits. Enter a number: 0 It contains 1 digits. if (number==0) count = 1; while (number != 0) { number = number / 10; count ++; } xgliu@cad.zju.edu.cn 13858115132

while 和 do-while 的比较 while 是先判别条件,再决定是否循环; 真 假 表达式 循环体语句 do-while的下一条语句 真 假 while的下一条语句 表达式 循环体语句 xgliu@cad.zju.edu.cn 13858115132

4.2.3 循环语句的选择 if(循环次数已知) 使用for语句 else /* 循环次数未知 */ if (循环条件在进入循环时明确) 4.2.3 循环语句的选择 if(循环次数已知) 使用for语句 else /* 循环次数未知 */ if (循环条件在进入循环时明确) 使用while语句 else /* 循环条件需要在循环体中明确 */ 使用do-while语句 xgliu@cad.zju.edu.cn 13858115132

4.3 判断素数 输入一个正整数m,判断它是否为素数。 xgliu@cad.zju.edu.cn 13858115132

4.3.1 程序解析-判断素数 算法:除了1和m,不能被其它数整除。 设 i 取值 [2, m-1] 如果m不能被该区间上的任何一个数整除,即对每个i,m%i 都不为0,则m是素数 只要找到一个i,使m%i为0,则m肯定不是素数 m %2 %3 %4 %5 %(m-1) 不是素数 || =0 =0 是素数 && !=0 !=0 m不可能被大于 m/2 的数整除 i 取值 [2, m-1] 、 [2, m/2] 、 [2, ] for(i = 2; i <= m/2; i++) if(m % i == 0) break; if(i > m/2) printf("yes\n") else printf("no\n”); xgliu@cad.zju.edu.cn 13858115132

例4-4源程序-判断素数 int main(void) { int i, m; printf(“Enter a number: "); No int main(void) { int i, m; printf(“Enter a number: "); scanf ("%d", &m); for (i = 2; i <= m/2; i++) if (m % i == 0) break; if (i > m/2 ) printf("%d is a prime number! \n", m); else printf("No!\n"); } Enter a number: 11 11 is a prime number! 循环条件? 循环的结束条件? xgliu@cad.zju.edu.cn 13858115132

break 语句 while(exp){ 语句1 if (expb) break; 语句2 } 当循环有多个出口时: 区分与处理结束条件 for (i = 2; i <= m/2; i++) if (m % i == 0) break; if (i > m/2 ) printf("Yes"); else printf("No!\n"); break 语句 for(i = 2; i <= m/2; i++) if(m%i == 0){ printf("No!\n"); break; } printf("Yes"); while(exp){ 语句1 if (expb) break; 语句2 } 真 假 exp 语句1 expb 语 句2 循环体 当循环有多个出口时: 区分与处理结束条件 xgliu@cad.zju.edu.cn 13858115132

continue 语句 while(exp){ 语句1 if (expb) continue; 语句2 } 真 假 exp 语句1 expb 语 句2 循环体 while(exp){ 语句1 if (expb) continue; 语句2 } 跳过continue后面的语句,继续下一次循环 xgliu@cad.zju.edu.cn 13858115132

break 和 continue #include "stdio.h" int main(void) { char c; int i; abc↙ efgh ↙ 123 ↙ #include "stdio.h" int main(void) { char c; int i; for (i = 0; i < 10; i++) { c = getchar(); if (c == '\n') break; putchar(c); } abc continue; abcefgh1 xgliu@cad.zju.edu.cn 13858115132

4.4 求1! + 2! + …. + 100! for (i = 1; i <= 100; i++){ item = i ! sum = sum + item; } 4.4.1 程序解析 调用函数 fact(i) 计算 i 的阶乘 4.4.2 嵌套循环 用循环计算 i 的阶乘 xgliu@cad.zju.edu.cn 13858115132

4.4.1 程序解析 求1! + 2! + …. + 100! #include <stdio.h> double fact (int n); int main(void) { int i; double sum; sum = 0; for(i = 1; i <= 100; i++ ) sum = sum + fact (i); printf("1! + 2! + 3! + … + 100! = %e\n", sum); return 0; } double fact (int n) { int i; double result = 1; for (i = 1; i <= n; i++) result = result * i ; return result ; 4.4.1 程序解析 求1! + 2! + …. + 100! xgliu@cad.zju.edu.cn 13858115132

4.4.2 嵌套循环 for (i = 1; i <= 100; i++){ item = i ! sum = sum + item; 4.4.2 嵌套循环 for (i = 1; i <= 100; i++){ item = i ! sum = sum + item; } for(i = 1; i <= 100; i++) { item = 1; for (j = 1; j <= i; j++) item = item * j; sum = sum + item; } xgliu@cad.zju.edu.cn 13858115132

例4-6 源程序 #include <stdio.h> int main(void) { int i, j; double item, sum; /* item 存放阶乘 */ sum = 0; for(i = 1; i <= 100; i++) { item = 1; /* 每次求阶乘都从1开始 */ for (j = 1; j <= i; j++) /* 内层循环算出 item = i! */ item = item * j; sum = sum + item; } printf("1! + 2! + 3! + … + 100! = %e\n", sum); 例4-6 源程序 xgliu@cad.zju.edu.cn 13858115132

内层循环的初始化 求1! + 2! + …. + 100! for(i = 1; i <= 100; i++) { item = 1; for (j = 1; j <= i; j++) item = item * j; sum = sum + item; } item = 1; for(i = 1; i <= 100; i++){ for (j = 1; j <= i; j++) item = item * j; sum = sum + item; } 求1! + 1!*2! + …… + 1!*2!*……*100! xgliu@cad.zju.edu.cn 13858115132

分析嵌套循环的执行过程 for(i = 1; i <= 100; i++) { item = 1; for (j = 1; j <= i; j++) item = item * j; sum = sum + item; } 外层循环变量 i 的每个值 内层循环变量 j 变化一个轮次; 内外层循环变量不能相同 分别用 i 和 j xgliu@cad.zju.edu.cn 13858115132

for (i = 1; i <= 100; i++) for (j = 1; j <= i; j++) printf ("%d %d\n", i, j ); xgliu@cad.zju.edu.cn 13858115132

4.5 循环程序设计 循环程序的实现要点: 选用合适的循环语句 循环具体实现时考虑(循环条件): 归纳出哪些操作需要反复执行? 循环体 4.5 循环程序设计 循环程序的实现要点: 归纳出哪些操作需要反复执行? 循环体 这些操作在什么情况下重复执行? 循环条件 选用合适的循环语句 for while do-while 循环具体实现时考虑(循环条件): 事先给定循环次数,首选for 通过其他条件控制循环,考虑while或do-while xgliu@cad.zju.edu.cn 13858115132

例4-7 输入一批学生的成绩,求最高分(for) Enter n: 5 Enter 5 maks:67 88 73 54 82 Max = 88 #include <stdio.h> int main(void) { int i, mark, max, n; printf("Enter n: "); scanf ("%d", &n); printf("Enter %d marks: ", n); scanf ("%d", &mark); /* 读入第一个成绩 */ max = mark; /* 假设第一个成绩是最高分 */ for (i = 1; i < n; i++ ){ scanf ("%d", &mark); if (max < mark) max = mark; } printf("Max = %d\n", max); return 0; mark max max mark Enter n: 0 xgliu@cad.zju.edu.cn 13858115132

例4-7 输入一批学生的成绩,求最高分(while) #include <stdio.h> int main(void) { int mark, max; printf(“Enter marks:"); scanf ("%d", &mark); /* 读入第一个成绩 */ max = mark; /* 假设第一个成绩最高分 */ while (mark >= 0){ if(max < mark) max = mark ; scanf ("%d", &mark ); }; printf("Max = %d\n", max); return 0; } Enter marks:67 88 73 54 82 -1 Max = 88 Enter marks:-1 xgliu@cad.zju.edu.cn 13858115132

例4-7 输入一批学生的成绩,求最高分(do-while) #include <stdio.h> int main(void) { int mark, max; max = -1; /* 给max赋一个小初值 */ printf(“Enter marks: "); do{ scanf ("%d", &mark ); if (max < mark) max = mark; } while(mark >= 0); printf("Max = %d\n", max); } Enter marks: 67 88 73 54 82 -1 Max = 88 Enter marks: -1 xgliu@cad.zju.edu.cn 13858115132

例4-8 将一个正整数逆序输出 确定:循环条件和循环体(循环不变式) 12345 5 4 3 2 1 例4-8 将一个正整数逆序输出 确定:循环条件和循环体(循环不变式) 12345 5 4 3 2 1 12345 % 10 = 5 12345 / 10 = 1234 1234 % 10 = 4 1234 / 10 = 123 123 % 10 = 3 123 / 10 = 12 12 % 10 = 2 12 / 10 = 1 1 % 10 = 1 1 / 10 = 0 结束 用do-while实现? scanf( “%d”, &x); while (x != 0){ digit = x %10; x = x/10 ; printf( "%d ", digit); } 循环不变式 x%10 x=x/10 循环结束条件 x==0 xgliu@cad.zju.edu.cn 13858115132

例4-9 求500以内的全部素数,每行输出10个 for (m = 2; m <= 500; m++) if (m是素数) printf( "%d", m); n = sqrt(m); for(i = 2; i <= n; i++) if(m % i == 0) break; if(i > n) printf("yes\n") else printf("no\n”); for (m = 2; m <= 500; m++){ n=sqrt(m); for(i = 2; i <= n; i++) if(m % i == 0) break; if(i > n) printf("%d", m) } xgliu@cad.zju.edu.cn 13858115132

例4-9 源程序 #include <stdio.h> #include <math.h> int main(void) { int count, i, m, n; count = 0; for (m = 2; m <= 500; m++){ n = sqrt(m); for (i = 2; i <= n; i++) if(m % i == 0) break; if(i > n){ /* 如果m是素数 */ printf("%6d", m); count++; if (count %10 == 0) printf(“\n”); } 例4-9 源程序 xgliu@cad.zju.edu.cn 13858115132

例4-10 求Fibonacci序列:1,1,2,3,5,8,13,… x1 = x2 = 1; x = x1 + x2; x1 = x2; x2 = x; 1, 1, 2, 3, 5, 8, 13, …… x1 x2 x x1 = 1; x2 = 1; printf ("%6d%6d", x1, x2 ); /* 输出头两项 */ for (i = 1; i <= 8; i++){ /* 循环输出后8项 */ x = x1 + x2; /* 计算新项 */ printf("%6d", x); x1 = x2; /* 更新x1和x2 */ x2 = x; } xgliu@cad.zju.edu.cn 13858115132

例4-11古典算术问题-搬砖头 某地需要搬运砖块,已知男人一人搬3块,女人一人搬2块,小孩两人搬一块。 问用45人正好搬45块砖,有多少种搬法? for (men = 0; men <= 45; men++) for (women = 0; women <= 45; women++) for (child = 0; child <= 45; child++) { if ((men+women+child==45) && (men*3+women*2+child*0.5==45)) printf("men=%d women=%d child=%d\n", men, women, child); } xgliu@cad.zju.edu.cn 13858115132

例4-11 源程序(2) 比较循环次数 for (men = 0; men <= 15; men++) for (women = 0; women <= 22; women++) { child = 45 – women – men; if (men * 3 + women * 2 + child * 0.5 == 45) printf("men=%d women=%d child=%d\n", men, women, child); } 比较循环次数 for (men = 0; men <= 45; men++) for (women = 0; women <= 45; women++) for (child = 0; child <= 45; child++) { if ((men+women+child==45) && (men*3+women*2+child*0.5==45)) printf("men=%d women=%d child=%d\n", men, women, child); } xgliu@cad.zju.edu.cn 13858115132

4.5 循环程序设计-习题 习题4-9 输入一个整数,从高位开始逐个数字输出。 (1) 如何得到10000 12345 /10000 = 1 4.5 循环程序设计-习题 习题4-9 输入一个整数,从高位开始逐个数字输出。 (1) 如何得到10000 找输入数据对应的幂 pow=1; temp = x; while (x != 0) { pow = pow * 10; x =x /10; } pow = pow /10; (2) 每次循环pow缩小1/10 (3) pow=0 结束 12345 /10000 = 1 12345 %10000 =2345 2345 /1000 = 2 2345%1000 =345 345 /100 = 3 345%100 =45 45 /10 = 4 45%10 =5 5/1= 5 5%1=5 xgliu@cad.zju.edu.cn 13858115132

本章要点 什么是循环? 为什么要使用循环? 如何实现循环? 实现循环时,如何确定循环条件和循环体? 怎样使用while 和do-while语句实现次数不确定的 循环? while 和do-while语句有什么不同? 如何使用break语句处理多循环条件? 如何实现多重循环? xgliu@cad.zju.edu.cn 13858115132