哈工大c语言教学PPT6 循环控制结构_第1页
哈工大c语言教学PPT6 循环控制结构_第2页
哈工大c语言教学PPT6 循环控制结构_第3页
哈工大c语言教学PPT6 循环控制结构_第4页
哈工大c语言教学PPT6 循环控制结构_第5页
已阅读5页,还剩70页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第6章 循环控制结构,本章学习内容,计数控制的循环 条件控制的循环 for语句,while语句,do-while语句 continue语句,break语句 嵌套循环 程序调试与排错,example,如何确定程序的输入和输出呢,draw a flowchart for the following problem: 读入5个整数,计算并显示它们的和,input : 5 个整数n1, n2, n3, n4, n5 output: n1, n2, n3, n4, n5的和 input example: 2 3 4 5 6 output example: 20,问题的提出,input n1,input

2、n2,input n3,input n4,input n5,output sum,sum n1+n2+n3+n4+n5,assume input example: 2 3 4 5 6,end,使用了6个不同的变量,start,问题的提出,读入1000个整数,计算并显示它们的和.,6.1循环控制结构与循环语句,如何对循环进行控制呢,counter 1, sum 0,counter6,sum sum + n,false,true,counter,output sum,input n,1,counter,sum,0,1 6true,2,n,0 + 2,2,2,2 6true,3,2 + 3,5,3,

3、3 6true,4,5 + 4,9,4,4 6true,5,9 + 5,14,5,5 6true,6,14 + 6,20,6,6 6false,counter-controlled,计数器每次增1,使用了3个变量,assume input example: 2 3 4 5 6,6.2计数控制的循环,end,6.2计数控制的循环,counter initialvalue,test counter,step n,step x,false,true,update counter,循环体 (body of loop,当型循环condition is tested first 计数控制loop is c

4、ontrolled by a counter syntax for (initial value ; condition; update counter) statement; or for (initial value ; condition; update counter) statement; statement;,for循环语句,循环起始条件,循环结束条件,循环变量增值,i 0, sum 0,i 5,sumsum+ n,false,true,i,output sum,input n,int i, sum, n; sum = 0; for (i = 0; i 5; i+) scanf(“

5、%d”,printf(“%d”, sum,for循环语句,a,条 件p,直 到 型 循 环,假,真,6.3条件控制的循环,a,当 型 循 环,真,假,假,条 件p,当型循环condition is tested first 条件或计数控制 loop is controlled by condition or a counter 语法 while (condition) statement; or while (condition) statement; statement;,no semicolon,while循环语句,直到型循环statements in the loop are execu

6、ted first (at least once), and condition is tested last 条件或计数控制 loop is controlled by condition or a counter 语法 do statement; statement; while (condition) ; statement,do-while循环语句,例6.1】计算并输出1+2+3+n的值,循环次数已知,计数控制的循环,循环次数已知,计数控制的循环,例6.1】计算并输出1+2+3+n的值,循环次数已知,计数控制的循环,例6.1】计算并输出1+2+3+n的值,循环条件第一次就为假(如输入-

7、1)时会怎样,例6.1】计算并输出1+2+3+n的值,a,当型循环,真,假,假,条 件p,假,条 件p,testing condition first,例6.1】计算并输出1+2+3+n的值,条 件p,直到 型循环,a,假,真,条 件p,a,假,testing condition last,例6.1】计算并输出1+2+3+n的值,注意,在for和while语句之后一般没有分号 有分号表示循环体就是分号之前的内容 空语句表示循环体内什么都不做 while (i 100); i+; 死循环 for (i = 0; i 100; i+); printf(%d, i); 用于延时,注意,如何减少循环的

8、次数,例6.1】计算并输出1+2+3+n的值,例6.1】计算并输出1+2+3+n的值,逗号运算符(comma operator,多数情况下,并不使用整个逗号表达式的值,更常见的情况是要分别得到各表达式的值 主要用在循环语句中,同时对多个变量赋初值等 for (i = 1 , j = 100; i j; i+, j,例6.3】计算并输出n! = 1 2 3 n,例6.4】计算并输出1!, 2!, 3!, , n,若用户不慎输入了非法字符,那么先清除输入缓冲区中的内容,然后提示用户重新输入数据直到输入正确为止,例6.5】输入两个整型数,计算并输出两个整数的最大值,循环次数未知,标记控制的循环,标记

9、值(sentinel value,例6.2】输入数据,显示每次累加的结果,直到输入0时为止,循环次数未知,标记控制的循环,例6.2】输入数据,显示每次累加的结果,直到输入0时为止,选择三种循环的一般原则,如果循环次数已知,计数控制的循环 用for 如果循环次数未知,条件控制的循环 用while 如果循环体至少要执行一次 用do-while 这只是“一般”原则,不是“原则,转移控制语句goto语句、break和continue语句,break语句的作用:循环体中使用break语句可以提前结束整个循环,continue语句的作用:循环体中使用continue语句可以提前结束本次循环,return语

10、句 标准库函数exit(,6.5流程的转移控制,break语句 和 continue语句 对for、while、do-while循环进行内部手术,break?退出一层循环或switch,continue?中断此次循环,开始下一次,6.5流程的转移控制,n,10,please enter n:10 n = 10 please enter n: -10 program is over,例6.14】 演示break与continue,10,include main() int i, n; for (i=1; i=5; i+) printf(please enter n:); scanf(%d,n,1

11、0,please enter n:10 n = 10 please enter n: -10 please enter n:20 n = 20 please enter n: -20 please enter n:30 n = 30 program is over,例6.14】 演示break与continue,10,20,20,30,include main() int i, n; for (i=1; i=5; i+) printf(please enter n:); scanf(%d,语句标号(label)举例 error: goto语句举例 goto error; 一般形式,goto语句

12、与语句标号,用if goto构成循环,结构形式,语句标号:if (表达式) 语句/语句组 goto 语句标号;,kk: if(ab) a=a-2; goto kk;,此结构构成的是“当型”循环,功能:无条件转去执行语句标号所指语句行,exit() 函数,exit(0) 作用是终止整个程序的执行,强制返回操作系统 调用该函数需要嵌入头文件,例6.9】输入n值,计算并输出 1! + 2! + 3! + + n,利用前项 计算后项,例6.9】输入n值,计算并输出 1! + 2! + 3! + + n,每次单独计算累加项,使用嵌套循环的注意事项,使用复合语句,以保证逻辑上的正确性 即用一对花括号将各层

13、循环体语句括起来 内层和外层循环控制变量不能同名,以免造成混乱 采用右缩进格式书写,以保证层次的清晰性,注意,例:输出图形 1.编程实现输出四行“*”号,每行输出5个“*”号 main() int i,j; for(i=1;i=4;i+) for(j=1;j=5;j+) printf(“* ”); printf(“n”);,* * * * * * * * * * * * * * * * * *,2.如何修改程序使其输出直角三角形,* * * * * * * * * * * * *,include main() int i,j,m; scanf(%d,include main() int i,

14、j, k,m; scanf(%d,3.如何修改程序使其输出正三角形,* * * * * * * * * * * * *,马克思手稿中有一道趣味数学题:有30个人,其中有男人、女人和小孩,在一家饭馆里吃饭共花了50先令,每个男人各花3先令,每个女人各花2先令,每个小孩各花1先令,问男人、女人和小孩各有几人? 解方程组 穷举法,方法1:穷举x,y,z的所有组合,include main() int x,y,z; printf(man t women t childernn); for (x=0; x=30; x+) for (y=0; y=30; y+) for (z=0; z=30; z+) i

15、f (x+y+z=30,方法2:改进算法,include main() int x,y,z; printf(man t women t childernn); for (x=0; x=16; x+) for (y=0; y=25; y+) z = 30 x - y; if (3 * x + 2 * y + z = 50) printf(%3d t %5d t %8dn,x,y,z);,水仙花数,打印出所有的“水仙花数”,所谓“水仙花数” 是指一个三位数,其各位数字立方和等于该数字 本身。 例如:153=13+53+33,水仙花数解法1-程序,include main() int l1, l2,

16、 l3, l4; for (l1=1; l1=9; l1+) for (l2=0; l2=9; l2+) for (l3=0; l3=9; l3+) l4=l1*100+l2*10+l3; if (l4=l1*l1*l1+l2*l2*l2+l3*l3*l3) printf(daffodils number is %dn,l4);,水仙花数程序实例(解法2,include main() int l1, l2, l3, l4; for (l4=100; l4=999; l4+) l1=l4/100; l2=(l4%100)/10; l3=i4%10; if (l4=l1*l1*l1+l2*l2*l

17、2+l3*l3*l3) printf(daffodils number is %dn,l4);,从键盘任意输入一个正整数,编程判断它是否是素数,若是素数,输出“yes!”;否则,输出“no,问题分析: 概念:素数是指除了能被1和它本身整除外,不能被其他任何整数整除的数; 判断素数的方法:把m作为被除数,把i=2(m-1)依次做为除数,若余数都不为0,则说明是素数。 简单判断方法:只需用2 的数去除m,即可得到正确的判定结果。 负数、 0和1不是素数,include main() int m, i, k, flag = 1; /*标志变量flag初值置为1*/ printf(please ent

18、er a number:); scanf(%d,采用设置 标志变量的方法,include main() int m, i, k, flag = 1; /*标志变量flag初值置为1*/ printf(please enter a number:); scanf(%d,采用设置 标志变量的方法,include main() int m, i, k; printf(please enter a number:); scanf(%d,break方法,include #include main() int m, i, k; printf(please enter a number:); scanf(%

19、d,goto方法,韩信有一队兵,他想知道有多少人,便让士兵排队报数。按从1至5报数,最末一个士兵报的数为1;按从1至6报数,最末一个士兵报的数为5;按从1至7报数,最末一个士兵报的数为4;最后再按从1至11报数,最末一个士兵报的数为10。你知道韩信至少有多少兵吗? 设兵数为x,则x应满足: x%5=1 for (x=1; x 5000 ;x+) if (x%5=1,例6.15】韩信点兵,瞎猫碰死耗子,include main() int x; for (x=1; ;x+) if (x%5=1,例6.15】韩信点兵,死循环,include main() int x; for (x=1; ;x+)

20、 if (x%5=1,例6.15】韩信点兵goto,include main() int x; for (x=1; ;x+) if (x%5=1,例6.15】韩信点兵break,include #include main() int x; for (x=1; ;x+) if (x%5=1,例6.15】韩信点兵break,标准库函数,作用是终止整个程序的执行,强制返回操作系统,include main() int x; int find = 0; /*置找到标志为假*/ for (x=1; !find ;x+) if (x%5=1 /*置找到标志为真*/,例6.15】韩信点兵标志变量,结构清晰的

21、程序,include main() int x; int find = 0; /*置找到标志为假*/ while(!find) if (x%5=1 /*置找到标志为真*/,例6.15】韩信点兵while,错在哪儿,include main() int x=1; int find = 0; /*置找到标志为假*/ while(!find) if (x%5=1,例6.15】韩信点兵while,错在哪儿,include main() int x=1; int find = 0; /*置找到标志为假*/ while(!find) if (x%5=1,例6.15】韩信点兵while,你答对了吗,本章学习

22、内容,计数控制的循环 条件控制的循环 for语句,while语句,do-while语句 continue语句,break语句 嵌套循环 程序调试与排错,循序渐进式编程例6.6:猜数游戏,想一个1100之间的数,猜对: right! 猜错:wrong!并提示大小,循序渐进式编程:猜数游戏例5.4,例6.6,例6.7,例6.12,猜数游戏用到的库函数,怎样模拟计算机“想”一个数呢? 随机函数rand() 产生0,rand_max 之间的随机数 magic = rand(); #include #define rand_max 0 x7fff rand_max在stdlib.h中定义,不大于双字节整

23、数的最大值32767 产生0,b-1 之间的随机数 magic = rand()%b; 产生a,a+b-1 之间的随机数 magic = rand()%b + a,include #include main() int magic; /*计算机想的数*/ int guess; /*人猜的数*/ magic = rand()%100 + 1; /*“想”一个1,100之间的数magic*/ printf(please guess a magic number:); scanf(%d,例5.4,include #include main() int magic; int guess; int co

24、unter; /*记录人猜次数的计数器变量*/ magic = rand() % 100 + 1; counter = 0; /*计数器变量count初始化为0*/ do printf(please guess a magic number:); scanf(%d,例6.6,猜数游戏用到的库函数,每次运行程序时计算机所“想”的数都是一样的,这是什么原因呢? 函数rand()产生的只是伪随机数 随机函数srand 为函数rand()设置随机数种子来实现对函数rand所产生的伪随机数的 “随机化” 通过输入随机数种子,产生0,100之间的随机数 scanf(%u,include #include main() int magic; int guess; int counter; /*记录人猜次数的计数器变量*/ unsigned int seed; printf(please enter seed:); scanf(%u,例6.6,猜数游戏用到的库函数,使用计算机读取其时钟值并把

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论