C程序设计 第5章 循环结构 主讲教师: 鲁 萍 西安建筑科技大学 理学院.

Slides:



Advertisements
Similar presentations
数据结构的引入. 通讯录管理 社团机构管理 校园导航管理 通讯录管理 社团机构管理 校园导航管理.
Advertisements

While 迴圈 - 不知重複執行次數
CSIM, PU C Language Introduction to the C Programming Language 重覆敘述 (for,while,break,continue) 適合重複性的計算或判斷.
《C语言程序设计》复习
第4章 條件判斷與迴圈 Java 2 程式設計入門與應用.
第六章 循环控制.
C语言实验 第二课.
C 语言程序设计 主讲人:王 英.
C语言实验 第一课 标题:学号+姓名.
数学建模与MATLAB 第五讲:循环结构(1) 2017/9/12.
第3章 While循环程序设计.
C语言程序设计 第八章 函数.
C#程序设计基础 $5 流程控制.
循环结构又称为重复结构:用来处理需要重复处理的问题,它是程序中一种很重要的结构。
C程序设计.
第3章 顺序结构程序设计 本章要点: 格式化输出函数──printf() 格式输入函数——scanf() 字符输出函数——putchar()
C++程序设计 第二讲 清华大学软件学院.
第 四 章 循环结构 while语句 do {} while 语句 break和continue语句
循环结构 NEAU ACM-ICPC TEAM 主讲人:NEAU_ACM_Team.
QQ: 李祥 QQ: 欢迎多种方式的学习交流,祝大家学有所成.
Introduction to the C Programming Language
第5章 循环结构程序设计 5.1 为什么需要循环控制 5.2 用while语句实现循环 5.3 用do---while语句实现循环
第六章 循环结构程序设计 概述 while 语句 do-while 语句 for 语句 循环的嵌套 几种循环的比较
C语言 程序设计基础与试验 刘新国、2012年秋.
Chap 3 分支结构 3.1 统计输入的一批字符中各类字符的数量 3.2 查询自动售货机中商品的价格 3.3 分支结构程序设计.
第3章 程序设计初步 第4章 函数与预处理 第5章 数组 第6章 指针 第7章 自定义数据类型
第五章 循环结构的C程序设计 5.1 while循环语句 5.2 do-while循环语句 5.3 for循环语句 5.4 多重循环
第二章 Java语言基础.
程序的三种基本结构 if条件分支语句 switch多路开关语句 循环语句 循环嵌套 break,continue和goto语句
計數式重複敘述 for 迴圈 P
第六章 循环控制.
第5讲 结构化程序设计(Part II) 周水庚 2018年10月11日.
第2章 C++流程控制语句 if 语句 switch语句 for语句 while语句 do - while语句 break语句
第0章作业: 教材P12-练习与实践 1.写出用符号’*’输出描绘汉字”大”的流程图。
第1章 概述 本章要点: C语言程序结构和特点 C语言程序的基本符号与关键字 C语言程序的编辑及运行 学习方法建议:
第4讲 C++程序控制结构(二) 4.1 循环结构 4.2 转向控制 4.3 综合案例分析.
C++大学基础教程 第3章 C++控制语句 北京科技大学 信息基础科学系.
第4章 PHP流程控制语句.
1.3 C语言的语句和关键字 一、C语言的语句 与其它高级语言一样,C语言也是利用函数体中的可执行 语句,向计算机系统发出操作命令。按照语句功能或构成的不 同,可将C语言的语句分为五类。 goto, return.
C语言概述 第一章.
第1讲 C语言基础 要求: (1) C程序的组成 (2) C语言的标识符是如何定义的。 (3) C语言有哪些基本数据类型?各种基本数
程式結構&語法.
第三章 C++的语句和简单的程序设计 主要内容:
第 二 章 数据类型、运算符与表达式.
C++语言程序设计 C++语言程序设计 第三章 控制语句 第十一组 C++语言程序设计.
C 语言程序设计 程序的循环结构 电大崇信县工作站 梁海亮.
目录 5.1循环结构程序设计的概述 5.2 用while语句实现循环结构程序设计 5.3 用do-while语句实现循环结构程序设计
第2章 算法与C语言程序 程序 (1)数据的描述:数据的类型和组织形式(数据结构) (2)操作的描述:操作步骤(算法) 沃思指出:
C语言程序设计 第一章 数据类型, 运算符与表达式 第二章 顺序程序设计 第三章 选择结构程序设计 第四章 循环控制 第五章 数组.
浙江长征职业技术学院—计算机与信息技术系—相方莉制作
Chap 5 函数 5.1 计算圆柱体积 5.2 使用函数编写程序 5.3 变量与函数.
《计算机应用基础》 第9章 程序设计基础(二).
第4章 Excel电子表格制作软件 4.4 函数(一).
C语言程序设计 李祥 QQ:
第2章 认识C语言 教学要点 2. 1 项目二C语言程序识读 2 .2 项目三班级成绩排名 2 .3 知识链接 返回.
项目1 C程序设计起步 学习目标: 通过该项目你可以知道: C语言的用途。 C语言的基本符号和关键字。 C语言程序的结构及特点。
输入语句 输出语句 赋值语句 条件语句 循环语句
多层循环 Private Sub Command1_Click() Dim i As Integer, j As Integer
程序设计基础.
第七章  数 组.
C/C++基礎程式設計班 字元與字串 講師:林業峻 CSIE, NTU 3/14, 2015.
五 循环结构程序设计 厦大附中信息技术.
C/C++基礎程式設計班 C語言入門、變數、基本處理與輸入輸出 講師:林業峻 CSIE, NTU 3/7, 2015.
迴圈(重複性結構) for while do while.
第三章 流程控制 程序的运行流程 选择结构语句 循环结构语句 主讲:李祥 时间:2015年10月.
Q1(a) 小偉打算編寫一個程序。該程序把兩個44的表內的數字相加。表3內的數字是由表1和表2應格子內的數字相加而成。例如:
第二次课后作业答案 函数式编程和逻辑式编程
函式庫補充資料 1.
C语言基础学习 从外行到入门.
C++语言程序设计 C++语言程序设计 第二章 基本数据类型与表达式 第十一组 C++语言程序设计.
Presentation transcript:

C程序设计 第5章 循环结构 主讲教师: 鲁 萍 西安建筑科技大学 理学院

第5章 循环结构程序设计 为什么要用循环结构 ? 实现循环结构的语句 改变循环执行的状态 循环结构综合举例 while do…while for 改变循环执行的状态 break 语句 continue语句 循环结构综合举例 小 结 习 题 游 戏

应 用 循 环 1. 例: 求1+2+3+4+…+100 的累加和 重复:相加 2. 一个球从100米高度自由落下,每次落地后反跳回原高度的3/4,再落下,再反弹。求它在第10次落地时,共经过多少米? 重复:计算每次反弹的高度,并累加路径 … 100 1 2 3 4 … 10 循 环 重复做一件事情

循 环 结 构 A0501 例1: 求1+2+3+4+…+100的累加和 void main() { int sum=0, i=1; sum=sum+i; i=i+1; printf(“sum=%d\n”,sum); } sum=0 sum = sum + 1 sum = sum + 2 sum = sum + 3 sum = sum + 4 sum = sum + 5 …… sum = sum + 100 循环结构的关键 while( i<=100 ) 循环条件 { } 循环体 (修改循环变量)

循环语句:while 1. while (表达式) 循环体语句 当 表达式为真时重复执行语句;为假时循环结束。 void main() { int sum=0, i=1; while( i<=100 ) { sum = sum + i ; i = i + 1; } printf(“sum=%d\n”,sum); 表达式 假 真 假 真 循环体语句

循环语句:do while 2. do 重复执行循环体语句, 循环体语句 直到表达式为假。 while (表达式); 例1B: 求1+2+3+…+100的累加和 void main() { int i=1,sum=0; do{ sum = sum + i; i = i+1; 直到(i<=100)不成立 printf(“sum=%d\n”,sum); } sum=0 sum = sum + 1 sum = sum + 2 sum = sum + 3 sum = sum + 4 sum = sum + 5 …… sum = sum + 100 循环体语句 循环体 (修改循环变量) 假 表达式 循环条件 真 }while(i<=100); 真 假

循环语句:while 和 do while sum=0, i=1; sum=0, i=1; while( i<=100 ) { sum = sum + i ; i = i + 1; } do{ sum = sum + i; i = i+1; }while(i<=100); 执行 1 次, sum=200 执行100次,sum=5050 执行100次,sum=5050 执行 0 次, sum=0 真 表达式 假 循环体语句 真 表达式 假 循环体语句 “当”型循环 “直到”型循环 2. 说明: 1)表达式:循环判断条件 2)循环次数取决于表达式 3)循环体包含多条语句时用{ }括起 4)先判断表达式,后执行循环体 执行 1 次或多次 执行 0 次或多次

循环语句:while 和 do while sum=0, i=1; sum=0, i=1; while( i<=100 ) { sum = sum + i ; i = i + 1; } do{ sum = sum + i; i = i+1; }while(i<=100); 真 表达式 假 循环体语句 真 表达式 假 循环体语句 “当”型循环 “直到”型循环 2. 说明: 1)表达式:循环判断条件 2)循环次数取决于表达式 3)循环体包含多条语句时用{ }括起 4)先判断表达式,后执行循环体 执行 1 次或多次 执行 0 次或多次

循环语句: for语句 3. for (表达式1; 表达式2; 表达式3 ) 循环体语句 变量初始化 循环条件 循环变量修改 循环体 假 for (i=1; i<=100; i=i+1) { sum=sum+i; } …… 表达式1: 赋初值 假 真 条件表达式2 真 循环体语句 表达式3:循环变量递增

for和while比较 例6-1C:求1~100的累加 求100-200之间偶数的累加和 sum=0; for(i= 1 ;i<=100 ; i++ ) sum=sum+i; sum=0; i=1; while (i<=100) { sum=sum+i; i++; } 假 表达式1 100 200 i+=2 真 表达式2 循环体 表达式3 for语句能够取代while语句,且可读性好 尤其适用于:循环次数确定的循环

课堂练习 分别用for和while语句完成 1. 求100-200之间偶数的累加和 2. 求 10! 100! i=100; sum=0; { sum=sum+i; i+=2; } for(i=100,sum=0; i<=200; i+=2) sum=sum+i; 100! i=1; n=1; while (i<=10) { n*=i; i++; } double n; int n; for(i=1,n=1; i<=10; i++) n=n*i;

循环结构举例 A0502 一个球从100米高度落下,每次落地后反跳回原高度的3/4,再落下,再反弹。求它在第10次落地时,共经过多少米? 循环结构的关键 循环体:重复做的事情 循环条件:做多少次 … 100 米 对每一个落点: 计算高度并 累加路径长度 1. h=100 sum = sum + h 2. h=h*3/4 sum = sum + 2*h 3. h=h*3/4 sum = sum + 2*h 4. h=h*3/4 sum = sum + 2*h …… 10. h=h*3/4 sum = sum + 2*h 1 2 3 4 …. 10

循环结构举例 A0502一个球从100米高度落下,每次落地后反跳回原高度的3/4,再落下,再反弹。求它在第10次落地时,共经过多少米? sum=0 1. h=100 sum = sum + h 2. h=h*3/4 sum = sum + 2*h 3. h=h*3/4 sum = sum + 2*h 4. h=h*3/4 sum = sum + 2*h …… 10. h=h*3/4 sum = sum + 2*h sum=0; h=100; sum=sum+h for(i=2;i<=10;i++) { h=h*3/4; sum=sum+2*h; }

循环结构举例 A0502一个球从100米高度落下,每次落地后反跳回原高度的3/4,再落下,再反弹。求它在第10次落地时,共经过多少米? for(i=2;i<=10;i++) { h=h*3/4; sum=sum+2*h; } i=2; while(i<=10) { h=h*3/4; sum=sum+2*h; i++; } i=2; do { h=h*3/4; sum=sum+2*h; i++; } while(i<=10)

循环结构例题 A0503 例:输入一行字符,统计输入字符的个数 (以回车键 '\n'作为输入结束标记) 输入:hello↙ num:5 循环结构的关键 循环体:重复做的事情 循环条件:做多少次 6 循环体 输入字符 ch,num=num+1 …… 直到 输入回车键('\n') num=0; do { ch=getchar(); num=num+1; } while(ch!='\n') num=num-1; 循环次数不确定! 循环条件:ch!='\n'

循环结构例题 num=0 A0503例:输入一行字符,统计输入字符的个数 (以回车键作为输入结束标记) ch!='\n' 再次输入字符ch num=0 num=num+1 结束 开始 输入字符ch 输出num 真 假 循环结构例题 A0503例:输入一行字符,统计输入字符的个数 (以回车键作为输入结束标记) #include <stdio.h> void main() { char ch; int num=0; ch=getchar(); while(ch!='\n') { num++; } printf("num=%d\n",num); do { ch= getchar(); num++; }while(ch!='\n'); while((ch=getchar())!='\n') num++;

循环结构例题 num=0 B0501例:输入一行字符,分别统计其中英文字母,空格,数字和其他字符的个数 (以回车键作为输入结束标记) ch!='\n' 再次输入字符ch num=0 num=num+1 结束 开始 输入字符ch 输出num 真 假 循环结构例题 B0501例:输入一行字符,分别统计其中英文字母,空格,数字和其他字符的个数 (以回车键作为输入结束标记) 分析:字符变量c:接收键盘输入字符 整形变量:zimu_num,kong_num,shuzi_num,other_num 如果ch是英文字母:zimu_num++ 如果ch是空格:kongge_num++ 如果ch是数字:shuzi_num++ 如果ch是其他字符:other_num++ 循环标记:c!=‘\n’ 布置为作业题

循环结构例题 B0503例:输入一行字符,分别统计其中英文字母,空格,数字和其他字符的个数 (以回车键作为输入结束标记) #include <stdio.h> void main() { char ch; int num=0; ch=getchar(); while(ch!='\n') { num++; } printf("num=%d\n",num); int zimu_num=0, kong_num=0; int shuzi_num=0, other_num=0; if((ch>=‘a’ && ch<=‘z’)|| (ch>= ’A’ && ch<=‘Z’) ) zimu_num++; else if( ch==‘ ‘) kong_num++; else if( ch>=‘0’ && ch<=‘9’) shuzi_num++; else other_num++; while { if ( ) { ... } ... }

循环应用分析 for / while { if ( ) { ... } ... } 1.录入50个学生的成绩,计算平均成绩,并显示。 2.录入50个学生的成绩,统计100~90,89~80,79~70,69~60,59~0各分数段学生的人数,并显示统计结果 循环统计(for) ,嵌套 switch 或 if..else if..else 3.对某单位100个人进行年龄统计,35岁以下是“青年”,35~55是中年,55以上是“老年”,并显示统计结果 循环for,嵌套if…else for / while { if ( ) { ... } ... }

任 务 A0504 在全系1000学生中进行募捐,当总数达到10万元时结束。统计此时捐款的人数 ,以及 平均每人 捐款的数目。

break语句 至此位置 假 1.格式: break; 条件 2.功能:强行结束整个循环,转向执行循环语句的下一条语句。 用于循环语句和switch语句中 条件 真 语句A 3. 执行过程 while(条件) { 语句A; break; 语句 B; } break 语句B if (表达式) break; 至此位置 结束循环

continue语句 1.格式: continue ; 2.功能:结束该循环中的本次循环,继续下一轮循环。 只能用于循环语句中 假 条件 真 语句A 3. 执行 for(表达式1;表达式2;表达式3) { 语句A; continue; 语句 B; } 3. 执行 while(条件) { 语句A; continue; 语句 B; } 至此位置 continue if (表达式) continue; 语句B 结束循环

break & continue 应用 #include <stdio.h> void main() { int x,k; 小 结 break & continue 应用 A0505例: 求300以内能被17整除的最大的数。 #include <stdio.h> void main() { int x,k; for(x=300;x>=1;x--) if(x%17==0) printf("x=%d\n",x); } 找到满足条件的最大数,结束循环 break;

循环程序综合举例 A0506 例:近似求PI。 PI/4=1-1/3+1/5-1/7+….,直到某一项绝对值小于10-6为止。 void main() { int s; double n,t,pi; // s:分子,n:分母,t:分式,pi:累加和 t=1; pi=0; n=1.0; s=1; while(fabs(t)>1e-8) { pi=pi+t; n=n+2; s=-s; t=s/n; } pi=pi*4; printf("PI=%15.10f\n",pi);

斐波那契数列 问题:已知一对幼兔一个月长成成年兔子,一对成年兔子在一月内生出一对幼兔。如果有一对幼兔,问一年后共有多少对兔子? 如果设F(n)为该数列的第n项 F(0) = 0, F(1)=F(2)=1, F(n)=F(n-1)+F(n-2) (n≥3) 显然这是一个线性递推数列 1、1、2、3、5、8、13、21、34、55、

循环程序设计举例 A0507 例: Fibonacci数列。 void main() { long int f1,f2; int i; for(i=0;i<=20;i++) { printf("%12ld %12ld ",f1,f2); if(i%2==0) printf("\n"); f1=f1+f2; f2=f2+f1; } 如果设F(n)为该数列的第n项 F(0) = 0, F(1)=F(2)=1, F(n)=F(n-1)+F(n-2) (n≥3)

循环结构例题 A0508例:键盘输入一个正整数, 判断是否为素数。 数x在[2,sqrt(x)]范围内没有因子 n=2 循环结构例题 A0508例:键盘输入一个正整数, 判断是否为素数。 数x在[2,sqrt(x)]范围内没有因子 n<= sqrt(x) n=n+1 假 假 真 x%n==0 真 分析: 对每一个n∈ [2,sqrt(x)] 如果x%n==0 则 不是素数 循环结构,循环结束条件: (1) n> sqrt(x) 没有n满足x%n==0 ,是素数 (2)找到n,满足x%n==0 ,则x不是素数,退出循环( break) 此时 n<=sqrt(x) C1:例6.8 c3: 例4.16部分 x是素数 n> sqrt(x) 真 假

循环结构例题 A0508例:键盘输入一个正整数,判断是否为素数 #include <math.h> void main() 键盘输入x n=2 n<= sqrt(x) 假 真 x%n==0 n=n+1 x是素数 n> sqrt(x) 循环结构例题 A0508例:键盘输入一个正整数,判断是否为素数 #include <math.h> void main() { int x,n; scanf("%d",&x); for(n=2;n<=sqrt(x);n++) if(x%n==0) break; if(n>sqrt(x)) printf(" %d is a prime " ,x); else printf(" %d is not a prime " ,x); } 在判断范围内无因子,程序正常终止 有因子不再判断 C1:例6.8 c3: 例4.16部分 有因子,程序 非正常终止

循环嵌套 A0509例:输出100以内的素数 分析: for( x=2~100) { for( n=2~ sqrt(x)) #include < math.h> void main() { int n,x; for(x=2;x<=100;x++) { for(n=2;n<=sqrt(x);n++) if(x%n==0) break; if(n>sqrt(x)) printf(“% d " ,x); } 分析: for( x=2~100) { for( n=2~ sqrt(x)) if x%n==0? 判素数 } 外循环 内循环 上机演示 Lisushu1 d 和 Lisushu2 4d c1: 例6.9 C3:例4.16 4d break和continue只影响其所在的循环,与外层循环无关

for( ...) { ... while(...) { ... } ... 内循环 外循环 嵌套循环 外循环初始条件 假 外循环条件 真 { ... while(...) { ... } ... 内循环 外循环 嵌套循环 真 内循环初始条件 假 内循环条件 真 内循环体 外循环体 循环结束

循环程序设计举例 A0510例:译密码。按照如下方式将英文字符加密 6566 87 88 89 90 A B C D E F G H I …W X Y Z a b c d e… x y z E F G H I J K L M… A B C D e f g h i… a b c 91 分析: (1)对每个英文字符c用其后第4个字符替代 c=c+4 注意:右边界 WXYZ +4 不在是英文字符,特殊处理c=c-26 (2)非英文字符不变 C1:例6.10

循环程序设计举例 A0510例:译密码。按照如下方式将英文字符加密 #include<stdio.h> void main() { char c; while((c=getchar())!=‘\n’) /* 输入字符并判断是否回车*/ { if((c>=‘A’ && c<=‘Z’)||(c>=‘a’ && c<=‘z’)) /* 是否英文字符*/ { c=c+4; if (c>‘Z’ && c<=‘Z’+4 || c>‘z’) c=c-26; /* 是否出界*/ } putchar(c); /* 输出加密后字符*/ printf("\n");

循环小结 重复做一件事情 循环结构 循环体:重复做的事情 循环条件:做多少次 1.“当”型循环 while (表达式) 循环体语句 2. “直到”型 循环 do 循环体语句 while (表达式); 变量初始化 循环条件 循环变量修改 3. for (表达式1; 表达式2; 表达式3) 循环体语句

习题 B0501 :输入一行字符,分别统计其中英文字母,空格,数字和其他字符的个数(回车键作为输入结束标记)

游戏扩展 A05011 计时程序 计算执行10000000空循环需要的时间。 A05012 循环随机算式:每次游戏后询问游戏者是否继续游戏,键入y或Y 则继续游戏,否则退出。 C0501猜数游戏:系统产生一个随机数,请游戏者从键盘上输入数据猜想设值的数是什么,告诉用户是猜大了还是小了。5次以内猜对,用户获胜。否则,提示失败信息,并告诉游戏者该数值。(可扩充程序功能,如循环猜数游戏,对游戏进行计时等) C0502 打字练习游戏 随机出现若干个英文字母,游戏者按照顺序键入。 练习结束后给出正确以及错误个数的提示信息,计算正确率,并给出所用时间。

游戏扩展 A0511 计时程序。 执行10000000空循环需要的时间 void main( ) { long i = 10000000L; clock_t start, finish; double duration; start = clock(); while( i-- ) ; finish = clock(); duration = (double)(finish - start) / CLOCKS_PER_SEC; printf("%ld empty loops is %f seconds\n", i,duration ); } #include<stdio.h> #include<stdlib.h> #include<time.h> 获取的时间是一个长整形 将毫秒转化成秒 1000

循环结构例题 A0512例: 循环随机算式(扩展A0502):每次随机算式游戏后询问游戏者是否继续游戏,键入y或Y 则继续游戏,否则退出。 #define N 100 void main() { int a,b,c,score=0,ans; char next; srand(time(0)); //设置种子 do{ a=rand()%N; b=rand()%N; c=a+b; printf("%d+%d=",a,b); scanf("%d",&ans); if(ans==c) printf("right!\n"); else { printf("wrong!\n"); printf("%d+%d=%d",a,b,c);} printf("play the game again? Y/N: "); fflush(stdin); //清空输入缓冲区 next=getchar(); }while((next=='Y')||(next=='y')); } #include<stdio.h> #include<stdlib.h> #include<time.h>

循环程序分析 猜数游戏:任意设置一个整数,请用户从键盘上输入数据猜想设值的数是什么,告诉用户是猜大了还是小了。5次以内猜对,用户获胜。否则,告诉用户设置的数据是什么。 循环猜数 分析: (1)已知循环次数n <=5 for() (2) 每次循环中 接收一个整数, scanf 并判断和已知数的大小关系 if 如果猜中退出循环 break (3)如果5次后没有猜中 n==6 则输出已知数

循环应用分析 C0502 打字练习游戏 随机出现英文字母,游戏者键入相同字母。 练习结束后给出正确以及错误个数的提示信息,计算正确率,并给出所用时间。 知识点: (1) 随机字母: ASCII码,给定范围的随机数 (2) 接收一个字符 (3) 统计正确个数: 分支判断,正确则计数增1 (4) 下一次接收字母前要清除输入缓存 A0604 (5) 循环结构:for,while 均可 (6) 系统计时 A0603