苏小红c语言电子教案第六章教学文案.ppt
2022/11/221/63苏小红c语言电子教案第六章2022/11/222/63Example: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 6Output example:20问题的提出问题的提出问题的提出问题的提出2022/11/223/63Input n1Input n2Input n3input n4input n5output sumsum n1+n2+n3+n4+n52 2n1Assume input example:2 3 4 5 63 3n24 4n35 5n46 6n52020sumend使用了使用了6个不同的个不同的变量量start问题的提出问题的提出问题的提出问题的提出2022/11/224/636.1循环控制结构与循环语句循环控制结构与循环语句标记标记控制控制控制控制Sentinel Sentinel ControlledControlled计计数控制数控制数控制数控制Counter ControlledCounter Controlled1,2,3,4,4,3,2,1条件控制条件控制条件控制条件控制Condition Condition ControlledControlled如何对循环进行控制呢如何对循环进行控制呢如何对循环进行控制呢如何对循环进行控制呢?2022/11/225/63counter 1,sum 0counter6sum sum+nfalsetruecounter+output suminput n1countersum01 6true2n0+2222 6true32+3533 6true45+4944 6true59+51455 6true614+62066 6falsecounter-controlled 计计数器每次增数器每次增1使用了使用了3个个变变量量Assume input example:2 3 4 5 66.26.2计数控制的循环计数控制的循环计数控制的循环计数控制的循环startend2022/11/226/636.2计数控制的循环计数控制的循环counter initialValuecounter initialValuetest countertest counterStep nStep xfalsetrueUpdate counterUpdate counter循环体循环体循环体循环体(Body of Body of LoopLoop)2022/11/227/63n前测当型循环前测当型循环Condition is tested first n计数控制计数控制Loop is controlled by a counternSyntaxforfor(initial value;condition;update counter)statement;Orforfor(initial value;condition;update counter)statement;statement;for循环语句循环语句循环起始条件循环起始条件循环起始条件循环起始条件循环结束条件循环结束条件循环结束条件循环结束条件循环变量增值循环变量增值循环变量增值循环变量增值复合语句复合语句compound statement被当作一条语句看待被当作一条语句看待循环变量控制循环次循环变量控制循环次数,不要在循环体内数,不要在循环体内改变这个变量的值改变这个变量的值2022/11/228/63i 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循环语句循环语句startend2022/11/229/63A后后测测当当型型循循环环假假真真6.3条件控制的循环条件控制的循环A前前测测当当型型循循环环真真假假假2022/11/2210/63 前测当型循环前测当型循环Condition is tested first 条件或计数控制条件或计数控制 Loop is controlled by condition or a counter 语法法whilewhile(condition)(condition)statement;statement;Orwhilewhile(condition)(condition)statement;statement;statement;statement;No No semicolon!while循环语句循环语句2022/11/2211/63后测当型循环后测当型循环Statements in the loop are executed first(at least once),and condition is tested last条件或计数控制条件或计数控制 Loop is controlled by condition or a counter 语法语法dodo statement;statement;statement;statement;whilewhile(condition);(condition);statement;statement;Dont forget the Dont forget the semicolon!do-while循环语句循环语句2022/11/2212/63【例例例例6.16.1】计算并输出计算并输出计算并输出计算并输出1+2+3+n1+2+3+n的值的值的值的值循环次数已知,计数控制的循环循环次数已知,计数控制的循环循环次数已知,计数控制的循环循环次数已知,计数控制的循环2022/11/2213/63循环次数已知,计数控制的循环循环次数已知,计数控制的循环循环次数已知,计数控制的循环循环次数已知,计数控制的循环【例例例例6.16.1】计算并输出计算并输出计算并输出计算并输出1+2+3+n1+2+3+n的值的值的值的值sum=0的作用?的作用?2022/11/2214/63循环次数已知,计数控制的循环循环次数已知,计数控制的循环循环次数已知,计数控制的循环循环次数已知,计数控制的循环【例例例例6.16.1】计算并输出计算并输出计算并输出计算并输出1+2+3+n1+2+3+n的值的值的值的值2022/11/2215/63循环条件第一次就为假(如输循环条件第一次就为假(如输入入-1)时会怎样?)时会怎样?【例例例例6.16.1】计算并输出计算并输出计算并输出计算并输出1+2+3+n1+2+3+n的值的值的值的值2022/11/2216/63A前前测测当当型型循循环环真真假假假假 Testing Condition First【例例例例6.16.1】计算并输出计算并输出计算并输出计算并输出1+2+3+n1+2+3+n的值的值的值的值2022/11/2217/63后后测测当当到到型型循循环环A假真真A假假Testing condition last【例例例例6.16.1】计算并输出计算并输出计算并输出计算并输出1+2+3+n1+2+3+n的值的值的值的值2022/11/2218/63注意注意注意注意在在在在forfor和前测和前测和前测和前测whilewhile语句之后一般没有分号语句之后一般没有分号语句之后一般没有分号语句之后一般没有分号有分号表示循环体就是分号之前的内容有分号表示循环体就是分号之前的内容有分号表示循环体就是分号之前的内容有分号表示循环体就是分号之前的内容空语句空语句空语句空语句表示循环体内什么都不做表示循环体内什么都不做表示循环体内什么都不做表示循环体内什么都不做 while while(i 100)(i 100);i+;i+;死循环死循环死循环死循环 for for(i=0;i 100;i+)(i=0;i 100;i+);printf(%d,i);printf(%d,i);用于延时用于延时用于延时用于延时注意!注意!2022/11/2219/63如何减少循环的次数?如何减少循环的次数?如何减少循环的次数?如何减少循环的次数?【例例例例6.16.1】计算并输出计算并输出计算并输出计算并输出1+2+3+n1+2+3+n的值的值的值的值2022/11/2220/63【例例例例6.16.1】计算并输出计算并输出计算并输出计算并输出1+2+3+n1+2+3+n的值的值的值的值2022/11/2221/63逗号运算符(逗号运算符(逗号运算符(逗号运算符(Comma OperatorComma Operator)多数情况下,并不使用整个逗号表达式的值,更多数情况下,并不使用整个逗号表达式的值,更多数情况下,并不使用整个逗号表达式的值,更多数情况下,并不使用整个逗号表达式的值,更常见的情况是要分别得到各表达式的值常见的情况是要分别得到各表达式的值常见的情况是要分别得到各表达式的值常见的情况是要分别得到各表达式的值主要用在循环语句中,同时对多个变量赋初值等主要用在循环语句中,同时对多个变量赋初值等主要用在循环语句中,同时对多个变量赋初值等主要用在循环语句中,同时对多个变量赋初值等 forfor(i=1,j=100;i j;i+,j-)(i=1,j=100;i j;i+,j-)表达式表达式表达式表达式1,1,表达式表达式表达式表达式2,2,表达式表达式表达式表达式n n循环起始条件循环起始条件循环变量增值循环变量增值循环结束条件循环结束条件2022/11/2222/63【例例6.3】计算并输出计算并输出n!=1 2 3 n 2022/11/2223/63【例例6.4】计算并输出计算并输出1!,2!,3!,n!2022/11/2224/63循环次数未知,循环次数未知,循环次数未知,循环次数未知,标记标记标记标记控制的循环控制的循环控制的循环控制的循环标记值(标记值(Sentinel Value)【例例6.2】输入数据,显示每次累加输入数据,显示每次累加的结果,直到输入的结果,直到输入0时为止时为止2022/11/2225/63循环次数未知,循环次数未知,循环次数未知,循环次数未知,标记标记标记标记控制的循环控制的循环控制的循环控制的循环【例例6.2】输入数据,显示每次累加输入数据,显示每次累加的结果,直到输入的结果,直到输入0时为止时为止2022/11/2226/63选择三种循环的一般原则选择三种循环的一般原则选择三种循环的一般原则选择三种循环的一般原则如果循环次数已知,计数控制的循环如果循环次数已知,计数控制的循环如果循环次数已知,计数控制的循环如果循环次数已知,计数控制的循环用用用用forfor如果循环次数未知,条件控制的循环如果循环次数未知,条件控制的循环如果循环次数未知,条件控制的循环如果循环次数未知,条件控制的循环用用用用whilewhile如果循环体至少要执行一次如果循环体至少要执行一次如果循环体至少要执行一次如果循环体至少要执行一次用用用用do-whiledo-while这只是这只是这只是这只是“一般一般一般一般”原则,不是原则,不是原则,不是原则,不是“原则原则原则原则”2022/11/2227/63循序渐进式编程循序渐进式编程循序渐进式编程循序渐进式编程例例例例6.66.6:猜数游戏猜数游戏猜数游戏猜数游戏想一个想一个1100之间的数之间的数猜对猜对:right!猜错猜错:wrong!并提示并提示大小大小2022/11/2228/63只猜1次直到猜对为止最多猜10次猜多个数10次猜不对就猜下一个数循序渐进式编程循序渐进式编程循序渐进式编程循序渐进式编程:猜数游戏:猜数游戏:猜数游戏:猜数游戏例例例例5.4,5.4,例例例例6.6,6.6,例例例例6.7,6.7,例例例例6.126.122022/11/2229/63猜数游戏用到的库函数猜数游戏用到的库函数猜数游戏用到的库函数猜数游戏用到的库函数怎样模拟计算机怎样模拟计算机怎样模拟计算机怎样模拟计算机“想想想想”一个数呢?一个数呢?一个数呢?一个数呢?随机函数随机函数随机函数随机函数rand()rand()产生产生产生产生0,RAND_MAX 0,RAND_MAX 之间的随机数之间的随机数之间的随机数之间的随机数magic=rand();magic=rand();#include#include RAND_MAXRAND_MAX在在在在stdlib.hstdlib.h中定义,不大于双字节整数中定义,不大于双字节整数中定义,不大于双字节整数中定义,不大于双字节整数的最大值的最大值的最大值的最大值32767 32767 产生产生产生产生0,b-1 0,b-1 之间的随机数之间的随机数之间的随机数之间的随机数magic=rand()%b;magic=rand()%b;产生产生产生产生a,a+b-1 a,a+b-1 之间的随机数之间的随机数之间的随机数之间的随机数magic=rand()%b+a;magic=rand()%b+a;2022/11/2230/63#includeinclude#includeinclude main()main()intint magic;/*magic;/*计算机计算机计算机计算机 想想想想 的数的数的数的数*/intint guess;/*guess;/*人猜的数人猜的数人猜的数人猜的数*/magic=rand()%100+1;magic=rand()%100+1;/*“/*“想想想想”一个一个一个一个11,100100之间的数之间的数之间的数之间的数magic*/magic*/printf(Please guess a magic number:);printf(Please guess a magic number:);scanf(%d,&guess);scanf(%d,&guess);ifif(guess magic)(guess magic)printf(Wrong!Too high!n);printf(Wrong!Too high!n);else ifelse if(guess magic)(guess magic)printf(Wrong!Too low!n);printf(Wrong!Too low!n);elseelse printf(Right!n);printf(Right!n);printf(The number is:%d n,magic);printf(The number is:%d n,magic);例例例例5.45.4只猜1次2022/11/2231/63#includeinclude#includeinclude main()main()intint magic;magic;intint guess;guess;intint counter;counter;/*/*记录人猜次数的计数器变量记录人猜次数的计数器变量记录人猜次数的计数器变量记录人猜次数的计数器变量*/magic=rand()%100+1;magic=rand()%100+1;counter=0;counter=0;/*/*计数器变量计数器变量计数器变量计数器变量countcount初始化为初始化为初始化为初始化为0*/0*/dodo printf(Please guess a magic number:);printf(Please guess a magic number:);scanf(%d,&guess);scanf(%d,&guess);counter+;counter+;/*/*计数器变量计数器变量计数器变量计数器变量countcount加加加加1*/1*/ifif(guess magic)(guess magic)printf(Wrong!Too high!n);printf(Wrong!Too high!n);else ifelse if(guess magic)(guess magic)printf(Wrong!Too low!n);printf(Wrong!Too low!n);else else printf(Right!n);printf(Right!n);whilewhile (guess!=magic);(guess!=magic);printf(counter=%d n,counter);printf(counter=%d n,counter);直到猜对为止例例例例6.66.62022/11/2232/63猜数游戏用到的库函数猜数游戏用到的库函数猜数游戏用到的库函数猜数游戏用到的库函数每次运行程序时计算机所每次运行程序时计算机所每次运行程序时计算机所每次运行程序时计算机所“想想想想”的数都是一样的,的数都是一样的,的数都是一样的,的数都是一样的,这是什么原因呢?这是什么原因呢?这是什么原因呢?这是什么原因呢?函数函数函数函数rand()rand()产生的只是伪随机数产生的只是伪随机数产生的只是伪随机数产生的只是伪随机数随机函数随机函数随机函数随机函数srandsrand为函数为函数为函数为函数rand()rand()设置随机数种子来实现对函数设置随机数种子来实现对函数设置随机数种子来实现对函数设置随机数种子来实现对函数randrand所产所产所产所产生的伪随机数的生的伪随机数的生的伪随机数的生的伪随机数的“随机化随机化随机化随机化”通过输入随机数种子,产生通过输入随机数种子,产生通过输入随机数种子,产生通过输入随机数种子,产生0,1000,100之间的随机数之间的随机数之间的随机数之间的随机数scanf(%u,&seed);scanf(%u,&seed);srand(seed);srand(seed);magic=rand()%100+1;magic=rand()%100+1;2022/11/2233/63#includeinclude#includeinclude main()main()intint magic;magic;intint guess;guess;intint counter;/*counter;/*记录人猜次数的计数器变量记录人猜次数的计数器变量记录人猜次数的计数器变量记录人猜次数的计数器变量*/unsigned int unsigned int seed;seed;printf(Please enter seed:);printf(Please enter seed:);scanf(%u,&seed);scanf(%u,&seed);srand(seed);srand(seed);magic=rand()%100+1;magic=rand()%100+1;counter=0;/*counter=0;/*计数器变量计数器变量计数器变量计数器变量countcount初始化为初始化为初始化为初始化为0*/0*/dodo printf(Please guess a magic number:);printf(Please guess a magic number:);scanf(%d,&guess);scanf(%d,&guess);counter+;/*counter+;/*计数器变量计数器变量计数器变量计数器变量countcount加加加加1*/1*/ifif(guess magic)(guess magic)printf(Wrong!Too high!n);printf(Wrong!Too high!n);else ifelse if(guess magic)(guess magic)printf(Wrong!Too low!n);printf(Wrong!Too low!n);else else printf(Right!n);printf(Right!n);whilewhile (guess!=magic);(guess!=magic);printf(counter=%d n,counter);printf(counter=%d n,counter);直到猜对为止例例例例6.66.62022/11/2234/63【例例6.9】输入输入n值,计算并输出值,计算并输出 1!+2!+3!+n!每次每次单单独独计计算算累加累加项项2022/11/2235/63【例例6.9】输入输入n值,计算并输出值,计算并输出 1!+2!+3!+n!利用前利用前项项计计算后算后项项2022/11/2236/63使用嵌套循环的注意事项使用嵌套循环的注意事项使用嵌套循环的注意事项使用嵌套循环的注意事项使用复合语句,以保证逻辑上的正确性使用复合语句,以保证逻辑上的正确性即用一对花括号将各层循环体语句括起来即用一对花括号将各层循环体语句括起来即用一对花括号将各层循环体语句括起来即用一对花括号将各层循环体语句括起来内层和外层循环控制变量不能同名,以免造内层和外层循环控制变量不能同名,以免造成混乱成混乱 采用右缩进格式书写,以保证层次的清晰性采用右缩进格式书写,以保证层次的清晰性 注意!注意!2022/11/2237/63编程实现简单图形的输出编程实现简单图形的输出编程实现简单图形的输出编程实现简单图形的输出1、编程输出如下图形:、编程输出如下图形:*2、编程输出九九乘法表、编程输出九九乘法表3、任意输入一个整数,判断是否为素数、任意输入一个整数,判断是否为素数4、任意输入两个正整数,求最大公约数和最、任意输入两个正整数,求最大公约数和最小公倍数小公倍数2022/11/2238/63breakbreak语句语句语句语句 和和和和 continuecontinue语句语句语句语句对对对对forfor、whilewhile、dodo-whilewhile循环进行内部手术循环进行内部手术循环进行内部手术循环进行内部手术BreakBreak:退出循退出循环环体或体或switchContinueContinue:中断此次循中断此次循环环,开始下一次循,开始下一次循环环6.56.5流程的转移控制流程的转移控制流程的转移控制流程的转移控制 2022/11/2239/63n?10Please enter n:10n=10Please enter n:-10Program is over!【例例6.14】演示演示break与与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);2022/11/2240/63n?10Please enter n:10n=10Please enter n:-10Please enter n:20n=20Please enter n:-20Please enter n:30n=30Program is over!【例例6.14】演示演示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:);printf(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);2022/11/2241/63语句标号(语句标号(语句标号(语句标号(LabelLabel)举例)举例)举例)举例error:error:gotogoto语句举例语句举例语句举例语句举例gotogoto error;error;一般形式一般形式一般形式一般形式gotogoto语句语句语句语句与语句标号与语句标号与语句标号与语句标号2022/11/2242/636.66.6本章扩充内容本章扩充内容本章扩充内容本章扩充内容结构化程序设计(结构化程序设计(结构化程序设计(结构化程序设计(Structured ProgrammingStructured Programming)19651965年,最早由年,最早由年,最早由年,最早由E.W.DijkstraE.W.Dijkstra在一次国际会议上提出在一次国际会议上提出在一次国际会议上提出在一次国际会议上提出19661966年,年,年,年,C.BohmC.Bohm和和和和G.JacopiniG.Jacopini首先证明了:首先证明了:首先证明了:首先证明了:只用顺序、选择、循环三种基本的控制结构就能实现任何只用顺序、选择、循环三种基本的控制结构就能实现任何只用顺序、选择、循环三种基本的控制结构就能实现任何只用顺序、选择、循环三种基本的控制结构就能实现任何单入口、单出口的程序单入口、单出口的程序单入口、单出口的程序单入口、单出口的程序给结构化程序设计奠定了基础给结构化程序设计奠定了基础给结构化程序设计奠定了基础给结构化程序设计奠定了基础19711971年,年,年,年,IBMIBM公司的公司的公司的公司的MillsMills提出:提出:提出:提出:程序应该只有一个入口和一个出口程序应该只有一个入口和一个出口程序应该只有一个入口和一个出口程序应该只有一个入口和一个出口进一步补充了结构化程序的规则进一步补充了结构化程序的规则进一步补充了结构化程序的规则进一步补充了结构化程序的规则2022/11/2243/636.66.6本章扩充内容本章扩充内容本章扩充内容本章扩充内容目前,还没有一个严格的定义目前,还没有一个严格的定义目前,还没有一个严格的定义目前,还没有一个严格的定义19741974年,年,年,年,D.GriesD.Gries教授将已有的对结构化程序设计的不同教授将已有的对结构化程序设计的不同教授将已有的对结构化程序设计的不同教授将已有的对结构化程序设计的不同解释归纳为解释归纳为解释归纳为解释归纳为1313种。种。种。种。一个比较流行的定义是:一个比较流行的定义是:一个比较流行的定义是:一个比较流行的定义是:结构化程序设计是一种进行程序设计的原则和方法结构化程序设计是一种进行程序设计的原则和方法结构化程序设计是一种进行程序设计的原则和方法结构化程序设计是一种进行程序设计的原则和方法它避免使用它避免使用它避免使用它避免使用gotogoto语句语句语句语句采用采用采用采用“自顶向下、逐步求精自顶向下、逐步求精自顶向下、逐步求精自顶向下、逐步求精”方法进行程序设计方法进行程序设计方法进行程序设计方法进行程序设计按照这种原则和方法设计出的程序的特点为:按照这种原则和方法设计出的程序的特点为:按照这种原则和方法设计出的程序的特点为:按照这种原则和方法设计出的程序的特点为:结构清晰结构清晰结构清晰结构清晰 容易阅读容易阅读容易阅读容易阅读 容易修改容易修改容易修改容易修改 容易验证容易验证容易验证容易验证2022/11/2244/63结构化程序设计的核心思想结构化程序设计的核心思想结构化程序设计的核心思想结构化程序设计的核心思想 采用顺序、选择和循环三种基本结构作为程序设计采用顺序、选择和循环三种基本结构作为程序设计采用顺序、选择和循环三种基本结构作为程序设计采用顺序、选择和循环三种基本结构作为程序设计的基本单元的基本单元的基本单元的基本单元 只有一个入口只有一个入口只有一个入口只有一个入口只有一个出口只有一个出口只有一个出口只有一个出口无死语句,即不存在永远都执行不到的语句无死语句,即不存在永远都执行不到的语句无死语句,即不存在永远都执行不到的语句无死语句,即不存在永远都执行不到的语句无死循环,即不存在永远都执行不完的循环无死循环,即不存在永远都执行不完的循环无死循环,即不存在永远都执行不完的循环无死循环,即不存在永远都执行不完的循环采用采用采用采用“自顶向下、逐步求精自顶向下、逐步求精自顶向下、逐步求精自顶向下、逐步求精”和模块化的方法进行和模块化的方法进行和模块化的方法进行和模块化的方法进行结构化程序设计结构化程序设计结构化程序设计结构化程序设计 Top-down,Stepwise refinementTop-down,Stepwise refinement 19711971年,年,年,年,wirthwirth提出提出提出提出先全局后局部,先整体后细节,先抽象后具体先全局后局部,先整体后细节,先抽象后具体先全局后局部,先整体后细节,先抽象后具体先全局后局部,先整体后细节,先抽象后具体2022/11/2245/63本章作业本章作业本章作业本章作业2022/11/2246/63此课件下载可自行编辑修改,仅供参考!此课件下载可自行编辑修改,仅供参考!感谢您的支持,我们努力做得更好!谢谢感谢您的支持,我们努力做得更好!谢谢