《c语言苏小红资料实用教案》由会员分享,可在线阅读,更多相关《c语言苏小红资料实用教案(63页珍藏版)》请在金锄头文库上搜索。
1、本章学习(xux)内容 计数控制的循环 条件控制的循环 for语句,while语句,do-while语句 continue语句,break语句 嵌套循环 结构化程序设计的基本(jbn)思想 程序调试与排错第1页/共62页第一页,共63页。Example:如何如何(rh)确确定程序的定程序的输入和入和输出呢出呢?Draw a flowchart for the following problem:读入5个整数(zhngsh),计算并显示它们的和.Input: 5个整数(zhngsh)n1,n2,n3,n4,n5Output:n1,n2,n3,n4,n5的和Inputexample:23456Ou
2、tputexample:20问题的提出问题的提出问题的提出问题的提出第2页/共62页第二页,共63页。Input n1Input n2Input n3input n4input n5output sumsum n1+n2+n3+n4+n52 2n1Assume input example: 2 3 4 5 63 3n24 4n35 5n46 6n52020sumend使用使用(shyng)了了6个不个不同的变量同的变量start问题问题问题问题(wnt)(wnt)的提出的提出的提出的提出第3页/共62页第三页,共63页。6.1循环(xnhun)控制结构与循环(xnhun)语句标记控制Senti
3、nel Controlled计数控制Counter Controlled1, 2, 3, 4, , 4, 3, 2, 1条件控制Condition Controlled如何对循环进行(jnxng)控制呢?第4页/共62页第四页,共63页。counter 1, sum 0counter6sum sum + nfalsetruecounter+output suminput n1countersum01 6true2n0 + 2222 6true32 + 3533 6true45 + 4944 6true59 + 51455 6true614 + 62066 6falsecounter-contr
4、olled 计数器每次增1使用(shyng)了3个变量Assume input example: 2 3 4 5 66.26.2计数控制计数控制计数控制计数控制(kngzh)(kngzh)的循环的循环的循环的循环startend第5页/共62页第五页,共63页。6.2计数控制(kngzh)的循环counter initial valuecounter initial valuetest countertest counterstep nstep xfalsetrueupdate counterupdate counter循环体循环体(Body of Body of LoopLoop) 第6页/
5、共62页第六页,共63页。当型循环当型循环(xnhun)Condition is tested first 计数控制计数控制Loop is controlled by a counterSyntaxfor (initial value ; condition; update counter) statement;Orfor (initial value ; condition; update counter) statement;statement; for循环(xnhun)语句循环循环循环循环(xnhun)(xnhun)起始条件起始条件起始条件起始条件循环结束条件循环结束条件循环结束条件循环
6、结束条件循环变量增值循环变量增值循环变量增值循环变量增值复合语句复合语句compound statement被当做一条语句看待被当做一条语句看待循环变量控制循环次循环变量控制循环次数,不要在循环体内数,不要在循环体内改变这个变量的值改变这个变量的值第7页/共62页第七页,共63页。i 0, sum 0i 5sumsum+ nfalsetruei+output suminput nint i, sum, n;sum = 0;for (i = 0; i 5; i+) scanf(“%d”, &n);sum = sum + n;printf(“%d”, sum);for循环(xnhun)语句star
7、tend第8页/共62页第八页,共63页。A A直直直直到到到到型型型型循循循循环环环环假假真真条件条件(tiojin)控制的循环控制的循环A A当当当当型型型型循循循循环环环环真真假假假第9页/共62页第九页,共63页。 当型循环(xnhun)Condition is tested first 条件或计数控制 Loop is controlled by condition or a counter 语法while (condition) statement; Orwhile (condition) statement;statement;No No semicolon!while循环(xnh
8、un)语句第10页/共62页第十页,共63页。直到(zhdo)型循环Statements in the loop are executed first (at least once), and condition is tested last条件或计数控制 Loop is controlled by condition or a counter 语法do statement; statement; while (condition) ;statement;Dont forget the semicolon!do-while循环(xnhun)语句第11页/共62页第十一页,共63页。【例6.1】
9、计算(jsun)并输出1+2+3+n的值 循环次数循环次数循环次数循环次数(csh)(csh)已知,计数控制的循环已知,计数控制的循环已知,计数控制的循环已知,计数控制的循环第12页/共62页第十二页,共63页。 循环次数循环次数(csh)已知,计数控制的循环已知,计数控制的循环【例6.1】计算(jsun)并输出1+2+3+n的值sum = 0的作用?的作用? 第13页/共62页第十三页,共63页。 循环次数循环次数(csh)已知,计数控制的循环已知,计数控制的循环【例6.1】计算(jsun)并输出1+2+3+n的值第14页/共62页第十四页,共63页。循环(xnhun)条件第一次就为假(如输
10、入1)时会怎样? 【例6.1】计算(jsun)并输出1+2+3+n的值第15页/共62页第十五页,共63页。A A当当型型循循环环(x(xnnhuhunn) )真真假假假假 Testing Condition First【例6.1】计算(jsun)并输出1+2+3+n的值第16页/共62页第十六页,共63页。直直到到(z(zhhddo)o)型型循循环环A A假真真A A假假Testing condition last 【例6.1】计算(jsun)并输出1+2+3+n的值第17页/共62页第十七页,共63页。注意(zhy)在for和while语句(yj)之后一般没有分号有分号表示循环体就是分号之
11、前的内容空语句(yj)表示循环体内什么都不做 while (i 100); i+;死循环 for (i = 0; i 100; i+); printf(%d, i);用于延时注意!注意!第18页/共62页第十八页,共63页。 如何减少如何减少(jinsho)循环的次数?循环的次数?【例6.1】计算(jsun)并输出1+2+3+n的值第19页/共62页第十九页,共63页。【例6.1】计算(jsun)并输出1+2+3+n的值第20页/共62页第二十页,共63页。逗号(duho)运算符(CommaOperator)多数情况下,并不使用整个逗号表达式的值,更常见的情况是要分别得到各表达式的值主要用在循
12、环语句(yj)中,同时对多个变量赋初值等 for (i = 1 , j = 100; i j; i+, j-)表达式1, 表达式2, , 表达式n循环起始条件循环变量增值循环结束条件第21页/共62页第二十一页,共63页。【例【例6.2】计算】计算(j sun)并输出并输出n! = 1 2 3 n 第22页/共62页第二十二页,共63页。【例【例6.3】计算】计算(j sun)并输出并输出1!, 2!, 3!, , n! 第23页/共62页第二十三页,共63页。【例6.4】输入(shr)n值,计算并输出 1! + 2! + 3! + + n! 利用前利用前项(qin xin)计算后算后项第24
13、页/共62页第二十四页,共63页。【例6.4】输入(shr)n值,计算并输出 1! + 2! + 3! + + n! 每次每次单独独(dnd)计算累算累加加项第25页/共62页第二十五页,共63页。使用嵌套循环的注意事项使用复合语句,以保证逻辑上的正确性即用一对花括号将各层循环体语句括起来内层和外层循环控制变量不能同名,以免造成混乱 采用右缩进格式书写(shxi),以保证层次的清晰性 注意!注意!6.3嵌套循环第26页/共62页第二十六页,共63页。选择(xunz)三种循环的一般原则如果循环次数已知,计数控制的循环用for如果循环次数未知,条件控制的循环用while如果循环体至少(zhsho)
14、要执行一次用do-while这只是“一般”原则,不是“必要”原则第27页/共62页第二十七页,共63页。6.4条件控制(kngzh)的循环例6.6:猜数游戏想一个想一个(y )1100之之间的数间的数猜对猜对: right!猜错猜错:wrong!并提示并提示(tsh)大小大小第28页/共62页第二十八页,共63页。只猜只猜1 1次次直到猜对为止直到猜对为止最多猜最多猜1010次次猜多个数猜多个数1010次猜不对就猜下一个数次猜不对就猜下一个数循序渐进(xnxjinjn)式编程:猜数游戏例6.6,例6.7,例6.8,例6.9,例6.10第29页/共62页第二十九页,共63页。猜数游戏(yux)用
15、到的库函数怎样模拟计算机“想”一个数呢?随机函数(hnsh)rand()产生0,RAND_MAX 之间的随机数magic = rand(); #include RAND_MAX在stdlib.h中定义,不大于双字节整数的最大值32767 产生0,b-1 之间的随机数magic = rand()%b;产生a,a+b-1 之间的随机数magic = rand()%b + a; 第30页/共62页第三十页,共63页。#include #include main() int magic; /*计算机想的数*/int guess; /*人猜的数*/magic = rand()%100 + 1; /*“想
16、”一个(y )1,100之间的数magic*/printf(Please guess a magic number:);scanf(%d, &guess); if (guess magic) printf(Wrong! Too high!n); else if (guess magic) printf(Wrong! Too low!n); else printf(Right! n); printf(The number is:%d n, magic); 例6.6只猜只猜1 1次次第31页/共62页第三十一页,共63页。#include #include main() int magic; in
17、t guess; int counter; /*记录(jl)人猜次数的计数器变量*/magic = rand() % 100 + 1; counter = 0; /*计数器变量count初始化为0*/doprintf(Please guess a magic number:);scanf(%d, &guess); counter +; /*计数器变量count加1*/if (guess magic) printf(Wrong! Too high!n);else if (guess magic) printf(Wrong! Too low!n); else printf(Right!n);whi
18、le (guess != magic); printf(counter = %d n, counter); 直到猜对为止直到猜对为止例6.7第32页/共62页第三十二页,共63页。猜数游戏(yux)用到的库函数每次运行(ynxng)程序时计算机所“想”的数都是一样的,这是什么原因呢?函数rand()产生的只是伪随机数随机函数srand为函数rand()设置随机数种子来实现对函数rand所产生的伪随机数的“随机化”通过输入随机数种子,产生0,100之间的随机数scanf(%u,&seed);srand(seed);magic=rand()%100+1;第33页/共62页第三十三页,共63页。#i
19、nclude #include main() int magic; int guess; int counter; /*记录人猜次数(csh)的计数器变量*/ unsigned int seed; printf(Please enter seed:);scanf(%u, &seed);srand(seed);magic = rand() % 100 + 1; counter = 0; /*计数器变量count初始化为0*/doprintf(Please guess a magic number:);scanf(%d, &guess); counter +; /*计数器变量count加1*/if
20、 (guess magic) printf(Wrong! Too high!n);else if (guess magic) printf(Wrong! Too low!n); else printf(Right!n);while (guess != magic); printf(counter = %d n, counter); 直到猜对为止直到猜对为止例6.7第34页/共62页第三十四页,共63页。猜数游戏(yux)用到的库函数使用计算机读取其时钟值并把该值自动设置为随机数种子,产生0,100之间的随机数函数time()返回(fnhu)以秒计算的当前时间值,该值被转换为无符号整数并用做随机
21、数发生器的种子 #include srand(time(NULL); magic = rand() % 100 + 1; 函数time()能为程序员提供代表时间的字符串,使用NULL作为函数参数,使其不具备此功能第35页/共62页第三十五页,共63页。#include #include #include main() int magic; int guess; int counter; /*记录(jl)人猜次数的计数器变量*/ srand(time(NULL);magic = rand() % 100 + 1; counter = 0; /*计数器变量count初始化为0*/doprintf(
22、Please guess a magic number:);scanf(%d, &guess); counter +; /*计数器变量count加1*/if (guess magic) printf(Wrong! Too high!n);else if (guess magic) printf(Wrong! Too low!n); else printf(Right!n);while (guess != magic); printf(counter = %d n, counter); 直到猜对为止直到猜对为止例6.7第36页/共62页第三十六页,共63页。#include #include #
23、include main() int magic; int guess; int counter; /*记录(jl)人猜次数的计数器变量*/ srand(time(NULL); magic = rand() % 100 + 1; counter = 0; /*计数器变量count初始化为0*/doprintf(Please guess a magic number:);scanf(%d, &guess); counter +; /*计数器变量count加1*/if (guess magic) printf(Wrong! Too high!n);else if (guess magic) pri
24、ntf(Wrong! Too low!n); else printf(Right!n);while (guess != magic & counter 10); printf(counter = %d n, counter); 例6.8最多猜最多猜1010次次第37页/共62页第三十七页,共63页。#include #include #include main() int magic; int guess; int counter; /*记录人猜次数(csh)的计数器变量*/ srand(time(NULL); magic = rand() % 100 + 1; counter = 0; /*
25、计数器变量count初始化为0*/doprintf(Please guess a magic number:);scanf(%d, &guess); counter +; /*计数器变量count加1*/if (guess magic) printf(Wrong! Too high!n);else if (guess magic) printf(Wrong! Too low!n); else printf(Right!n);while (guess != magic & counter magic) printf(Wrong!Too high!n);else if (guess magic)
26、printf(Wrong!Too low!n);else printf(Right!n);while (guess != magic & counter 10);printf(counter = %dn, counter); printf(Do you want to continue(Y/N or y/n)?);scanf( %c, &reply);while (reply = Y) | (reply = y); 猜多个数猜多个数1010次猜不对就猜下一个数次猜不对就猜下一个数直到用户选择结束为止直到用户选择结束为止例例6.106.10第39页/共62页第三十九页,共63页。 break语句
27、 和 continue语句 对for、while、do-while循环进行(jnxng)内部手术Break?Break?退出退出退出退出(tuch)(tuch)一一一一层层循循循循环环或或或或switchswitchContinue?Continue?中断中断中断中断(zhngdun)(zhngdun)此次循此次循此次循此次循环环,开始下一次,开始下一次,开始下一次,开始下一次6.5流程的转移控制第40页/共62页第四十页,共63页。n?10Please enter n:10n = 10Please enter n: -10Program is over!【例6.11】 演示(ynsh)bre
28、ak与continue-10# #includeinclude mainmain()() intint i, n; i, n;forfor (i=1; i=5; i+) (i=1; i=5; i+) printf(Please enter n:);printf(Please enter n:);scanf(%d, &n);scanf(%d, &n);ifif (n 0) (n 0) breakbreak; ;printf(n = %dn, n);printf(n = %dn, n); printf(Program is over!n);printf(Program is over!n); 第4
29、1页/共62页第四十一页,共63页。n?10Please enter n:10n = 10Please enter n: -10Please enter n:20n = 20Please enter n: -20Please enter n:30n = 30Program is over!【例6.12】 演示(ynsh)break与continue-1020-2030# #includeinclude mainmain()() intint i, n; i, n;forfor (i=1; i=5; i+) (i=1; i=5; i+) printf(Please enter n:);print
30、f(Please enter n:);scanf(%d, &n);scanf(%d, &n);ifif (n 0) (n 0) continuecontinue; ;printf(n = %dn, n);printf(n = %dn, n); printf(Program is over!n);printf(Program is over!n); 第42页/共62页第四十二页,共63页。语句(yj)标号(Label)举例error:goto语句(yj)举例gotoerror;一般形式goto语句(yj)与语句(yj)标号第43页/共62页第四十三页,共63页。韩信有一队兵,他想知道有多少人,便
31、让士兵排队报数。按从1至5报数,最末一个士兵报的数为1;按从1至6报数,最末一个士兵报的数为5;按从1至7报数,最末一个士兵报的数为4;最后再按从1至11报数,最末一个士兵报的数为10。你知道韩信至少有多少兵吗?设兵数为x,则x应满足(mnz):x%5=1 & x%6=5 & x%7=4 & x%11=10穷举法,对x从1开始试验【例6.13】韩信点兵第44页/共62页第四十四页,共63页。#include main()int x; for (x=1; x 5000 ;x+)if (x%5=1 & x%6=5 & x%7=4 & x%11=10)printf(x = %dn, x); 【例6.
32、13】韩信点兵“瞎猫碰死耗子瞎猫碰死耗子”第45页/共62页第四十五页,共63页。#include main()int x; for (x=1; ;x+)if (x%5=1 & x%6=5 & x%7=4 & x%11=10)printf(x = %dn, x); 【例6.13】韩信点兵“死循死循环”第46页/共62页第四十六页,共63页。#include main()int x; for (x=1; ;x+) if (x%5=1 & x%6=5 & x%7=4 & x%11=10)printf(x = %dn, x); goto END; END: ;【例例6.13】韩信点兵韩信点兵goto
33、第47页/共62页第四十七页,共63页。#include main()int x; for (x=1; ;x+) if (x%5=1 & x%6=5 & x%7=4 & x%11=10)printf(x = %dn, x); break; 【例例6.13】韩信点兵韩信点兵break第48页/共62页第四十八页,共63页。#include #include main()int x; for (x=1; ;x+) if (x%5=1 & x%6=5 & x%7=4 & x%11=10)printf(x = %dn, x); exit(0); 【例例6.13】韩信点兵韩信点兵break标准准库函数,
34、作函数,作用是用是终止整个程止整个程序序(chngx)的的执行,行,强强制返回操制返回操作系作系统 第49页/共62页第四十九页,共63页。#include main()int x; int find = 0; /*置找到标志(biozh)为假*/for (x=1; !find ;x+) if (x%5=1 & x%6=5 & x%7=4 & x%11=10)printf(x = %dn, x); find = 1; /*置找到标志(biozh)为真*/ 【例【例6.13】韩信点兵】韩信点兵标志标志(biozh)变量变量结构清晰构清晰(qngx)的程序的程序第50页/共62页第五十页,共63页
35、。#include main()int x = 0; int find = 0; /*置找到标志(biozh)变量为假*/dox+;find = (x%5=1 & x%6=5 & x%7=4 & x%11=10);while (!find); printf(x = %dn, x); 【例例6.13】韩信点兵韩信点兵第51页/共62页第五十一页,共63页。#include main()int x = 0; dox+;while (!(x%5=1 & x%6=5 & x%7=4 & x%11=10); printf(x = %dn, x); 【例例6.13】韩信点兵韩信点兵第52页/共62页第五十
36、二页,共63页。6.6本章扩充(kuchng)内容结构化程序设计(StructuredProgramming)1965年,最早由E.W.Dijkstra在一次国际会议上提出1966年,C.Bohm和G.Jacopini首先证明了:只用顺序、选择、循环三种基本的控制结构就能实现任何单入口、单出口的程序给结构化程序设计奠定(dindng)了基础1971年,IBM公司的Mills提出:程序应该只有一个入口和一个出口进一步补充了结构化程序的规则第53页/共62页第五十三页,共63页。6.6本章扩充(kuchng)内容目前,还没有一个严格的定义1974年,D.Gries教授将已有的对结构化程序(chng
37、x)设计的不同解释归纳为13种。一个比较流行的定义是:结构化程序(chngx)设计是一种进行程序(chngx)设计的原则和方法它避免使用goto语句采用“自顶向下、逐步求精”方法进行程序(chngx)设计按照这种原则和方法设计出的程序(chngx)的特点为:结构清晰容易阅读容易修改容易验证第54页/共62页第五十四页,共63页。START_LOOP:if (fStatusOk) if (fDataAvaiable) i = 10; goto MID_LOOP; else goto END_LOOP; else for (i = 0; i 100; i+) MID_LOOP: / lots of
38、 code here goto START_LOOP;END_LOOP:糟糕(zogo)的goto语句第55页/共62页第五十五页,共63页。用goto语句(yj)跳向共同的出口位置void Init(void) char *p1 = NULL;char *p2 = NULL;char *p3 = NULL;p1 = (char*)malloc(256); if (p1 = NULL) goto Exit; p2 = (char*)malloc(256); if (p2 = NULL) goto Exit; p3 = (char*)malloc(256); if (p3 = NULL) got
39、o Exit; /*正常(zhngchng)处理的代码*/Exit:if(p1!=NULL)free(p1);if(p2!=NULL)free(p2);if(p3!=NULL)free(p3);return;第56页/共62页第五十六页,共63页。Evilgotos?MaybeNot凌波微步,未必(wib)摔跤现代观点(gundin)认为:混乱根源不在goto语句,而在语句标号任何程序都可以不用goto语句就实现其功能但在某些情况下,使用goto语句可使程序更清晰两种适合使用goto语句的情况跳向共同的出口位置,进行退出前的处理工作跳出多重循环的一条捷径 goto error; 第57页/共6
40、2页第五十七页,共63页。结构化程序设计(shj)关注的焦点不能简单地认为避免使用goto语句的程序设计方法就是结构化程序设计方法结构化程序设计关注的焦点程序结构的好坏有无goto语句,并不是(b shi)程序结构好坏的标志限制和避免使用goto语句,只是得到结构化程序的一种手段,而不是(b shi)目的第58页/共62页第五十八页,共63页。结构化程序设计(shj)的核心思想采用顺序、选择和循环三种基本结构作为程序设计(chn x sh j)的基本单元 只有一个入口只有一个出口无死语句,即不存在永远都执行不到的语句无死循环,即不存在永远都执行不完的循环采用“自顶向下、逐步求精”和模块化的方法
41、进行结构化程序设计(chn x sh j) Top-down, Stepwise refinement 1971年,wirth提出先全局后局部,先整体后细节,先抽象后具体第59页/共62页第五十九页,共63页。使用(shyng)goto语句的原则主张少用、慎用,而不是禁用保证使用之后,程序仍然是单入口,单出口不要使用一个以上的标号不要用goto语句往回跳,要向下跳不要让goto语句制造出永远(yngyun)不会被执行的代码第60页/共62页第六十页,共63页。Questionsandanswers第61页/共62页第六十一页,共63页。感谢您的欣赏(xnshng)!第62页/共62页第六十二页,共63页。内容(nirng)总结本章学习内容。sumsum+ n。有分号表示循环体就是分号之前的内容。空语句表示循环体内什么都不做。6.4 条件控制的循环例6.6:猜数游戏。产生a,a+b-1 之间的随机数。通过输入随机数种子,产生0,100之间的随机数。使用计算机读取其时钟值并把该值自动设置为随机数种子,产生0,100之间的随机数。【例6.13】韩信点兵break。【例6.13】韩信点兵标志(biozh)变量。感谢您的欣赏第六十三页,共63页。