1、循环结构的程序设计图形打印题优选循环结构的程序设计图形打印题2第6章 循环结构的程序设计 本章要点q 循环语句的执行流程q 不同形式的循环控制q 多重循环问题q 简单算法设计3第6章 循环结构的程序设计 循环的基本概念 while语句 for语句 do_while语句 转移语句 循环应用46.1 循环的基本概念 提出问题提出问题提问:从键盘上输入提问:从键盘上输入10个整数并求和,怎么编程?个整数并求和,怎么编程?回答:在程序中写回答:在程序中写10个个scanf语句,还可以写语句,还可以写%d%d提问:从键盘上输入提问:从键盘上输入500个整数并求和,怎么编程?个整数并求和,怎么编程?回答:
2、这个,嗯回答:这个,嗯?不会让我写不会让我写500个个 以上问题的实质是:将以上问题的实质是:将scanf函数重复执行函数重复执行N遍。我们可以引出一个概念遍。我们可以引出一个概念“循环循环”,简单而,简单而言:循环就是不断反复地执行同一段程序。言:循环就是不断反复地执行同一段程序。?56.1 循环的基本概念q 循环循环 反复执行同一段程序,直到满足一定反复执行同一段程序,直到满足一定的条件后才停止执行该段程序。的条件后才停止执行该段程序。q C语言中控制循环的语句语言中控制循环的语句:q whileq forq do_while6第6章 循环结构的程序设计 循环的基本概念 while语句 f
3、or语句 do_while语句 转移语句 循环应用76.2 while语句一一while语句格式语句格式while(表达式表达式)语句;语句;说明:语句可是简单语句,也可是复合语句。说明:语句可是简单语句,也可是复合语句。二二while语句语句的执行流程的执行流程86.2 while语句表达式表达式?执行语句执行语句成立成立不成立不成立执行执行while循环之后的语句循环之后的语句循环控制条件循环控制条件循环体循环体while(表达式表达式)语句;语句;9例:从键盘输入例:从键盘输入10个整数,求这个整数,求这10个整数之和个整数之和q程序主体:程序主体:count10?输入输入num成立成立
4、不成立不成立输出结果输出结果total计数器计数器count=0累加器累加器total=0total+=numcount+开始开始结束结束while(count10)count+;scanf(%d,&num);total+=num;810#include int main()int count,num,total;/*count:计数器,计数器,num:输入的整数输入的整数*/count=0;total=0;/*total:存放累加和存放累加和*/while(count10)/*循环控制条件循环控制条件 */printf(Enter the No.%d=,count);/*循环体循环体*/sc
5、anf(%d,&num);total+=num;/*计算累加和计算累加和 */count+;printf(Total=%dn,total);11 例:求例:求n的阶乘的阶乘n!(1=n=10)q程序主体:程序主体:while(i=n)s*=i;i+;i1时时126.2 while语句#include int main()long s=1;/*s:存放累积结果存放累积结果*/int i=1;/*i:计数器,同时是累积的对象计数器,同时是累积的对象*/while(i=10)/*循环控制条件循环控制条件 */*循环体循环体 */s*=i;/*计算累积和计算累积和 */i+;printf(“10!=%
6、dn,s);以求以求10!为例为例136.2 while语句q 比较比较total=0;count=0;while(count10)total+=num;count+;s=1;i=1;while(i=10)s*=i;i+;10个数相加个数相加10个数相乘个数相乘14例:分析程序运行结果例:分析程序运行结果#include int main()int n=0;while(n3)printf(“n is%dn”,n);n+;结果:程序将不停的打印结果:程序将不停的打印“n is 0”,直至终止程序无,直至终止程序无法正常终止的程序,称为法正常终止的程序,称为“死循环死循环”。结论:结论:while
7、语句循环体中,一定要有能够对循环控语句循环体中,一定要有能够对循环控制条件产生影响的语句,避免出现制条件产生影响的语句,避免出现“死循环死循环”现象。现象。15 例:求例:求1413的最后三位数。的最后三位数。问题分析:问题分析:14的的13次方已经超次方已经超出了计算机所能表出了计算机所能表示的整数范围示的整数范围乘法规律:乘积的最后乘法规律:乘积的最后三位的值只与乘数和被三位的值只与乘数和被乘数的后三位有关乘数的后三位有关C语言中最长的整数是:语言中最长的整数是:无符号长整型数:无符号长整型数:0 429496729510位位1410=28925465497612位位问题被简化为问题被简化
8、为求三位数乘法求三位数乘法166.2 while语句int main()int i=1,x,y,a=1;printf(Input X and Y:);scanf(%d*%d,&x,&y);while(i=y)a=a*x%1000;i+;printf(3 digits is:);printf(%dn,a%1000);Input X and Y:14*133 digits is:144Input X and Y:15*123 digits is:625176.2 while语句如何一次输入多个字符或数值如何一次输入多个字符或数值例:例:将从键盘输入的一行字符将从键盘输入的一行字符(回车结束回车结束
9、)复制复制到标准输出到标准输出(显示器显示器)。回顾字符输入输出函数:回顾字符输入输出函数:getchar():调用时,等待用户按键,输入的:调用时,等待用户按键,输入的字符存入键盘缓冲区,直到用户按字符存入键盘缓冲区,直到用户按Enter为止为止(Enter即即n也在缓冲区也在缓冲区)。输入。输入Enter后,后,getchar从输入流每次读一个字符,作为其返从输入流每次读一个字符,作为其返回值。其它未读的字符保留在缓冲区,待下回值。其它未读的字符保留在缓冲区,待下一个一个getchar调用。调用。186.2 while语句#include int main()char ch;ch=getc
10、har();while(ch!=n)putchar(ch);ch=getchar();ch!=n?显示显示ch成立成立不成立不成立ch=读入一个字符读入一个字符ch=读入下一个字符读入下一个字符开始开始结束结束ab13cdeab13cdeputchar(ch=getchar();putchar(getchar();196.2 while语句#include int main()char ch;while(ch=getchar()!=n)putchar(ch);一段更简洁的程序一段更简洁的程序206.2 while语句例:输入若干整数,竖排输出,当输入为例:输入若干整数,竖排输出,当输入为0时时
11、程序结束。如:输入程序结束。如:输入13-6 356 0 输出:输出:13-6356scanf():调用时,等待用户输入,输入的:调用时,等待用户输入,输入的内容存入键盘缓冲区,直到用户按内容存入键盘缓冲区,直到用户按Enter为止。为止。输入输入Enter后,后,scanf从输入流每次按格式读从输入流每次按格式读一个单元,作为其返回值。其它未读的内容一个单元,作为其返回值。其它未读的内容保留在缓冲区,待下一个保留在缓冲区,待下一个scanf调用。调用。216.2 while语句#include int main()int x;scanf(“%d”,&x);while(x)printf(“%d
12、n”,x);scanf(“%d”,&x);scanf()把缓冲区的内容把缓冲区的内容全部读完以后,才再次全部读完以后,才再次等待用户从键盘输入等待用户从键盘输入输入:输入:13-6 356 0输出:输出:13 -6 356输入:输入:13-6 356 0 7输出:输出:13 -6 356输入:输入:13-6 226.2 while语句循环嵌套循环嵌套在循环体中,又包含有循环语句。在循环体中,又包含有循环语句。whilewhile23例:输出下三角形乘法九九表。例:输出下三角形乘法九九表。1 2 3 4 5 6 7 8 9-1 2 4 3 6 9 4 8 12 16 5 10 15 20 25
13、6 12 18 24 30 36 7 14 21 28 35 42 49 8 16 24 32 40 48 56 64 9 18 27 36 45 54 63 72 81 假设:行号为假设:行号为i ,列号为,列号为j 则第则第i行中一共要输出行中一共要输出i个乘积,每一项为个乘积,每一项为i*j。(1=i=9)(1=j=i)i=6j=5i*j屏幕上的字符只能从上到下逐屏幕上的字符只能从上到下逐行显示,同一行内,只能从左行显示,同一行内,只能从左到右逐字显示。到右逐字显示。2324l显示要求显示要求 屏幕上的字符只能从上到下逐行显示,同屏幕上的字符只能从上到下逐行显示,同一行内,只能从左到右逐
14、字显示。一行内,只能从左到右逐字显示。l伪代码伪代码(Pseudocode)while(控制显示控制显示n行行)while(控制显示一行中的控制显示一行中的m个字符个字符)输出一个需要的字符输出一个需要的字符;列计数器列计数器 j+;行数计数器行数计数器 i+;25#include int main()int i=1,j;/*i:行计数器行计数器 j:列计数器列计数器*/while(i=9)/*控制打印表头控制打印表头*/printf(%4d,i+);printf(n-n);i=1;while(i=9)j=1;/*列计数器置列计数器置1*/while(j=i)/*嵌套的二重循环,输出第嵌套的二
15、重循环,输出第i行行*/printf(%4d,i*j);j+;/*列计数器列计数器+1*/printf(n);/*一行输出结束后,输出一行输出结束后,输出n*/i+;/*行计数器行计数器+1*/外层循环体执行外层循环体执行1次,内层循环要完整执行次,内层循环要完整执行1次次26第6章 循环结构的程序设计 循环的基本概念 while语句 for语句 do_while语句 转移语句 循环应用276.3 for语句一一for语句格式语句格式for(表达式表达式1;表达式表达式2;表达式表达式3)语句;语句;说明:语句可是简单语句,也可是复合语句。说明:语句可是简单语句,也可是复合语句。二二for语句
16、语句的执行流程的执行流程28循环初始条件循环初始条件循环控制条件循环控制条件表达式表达式2?执行语句执行语句成立成立不成立不成立执行执行for循环之后的语句循环之后的语句执行表达式执行表达式3执行表达式执行表达式1循环体循环体 for(表达式表达式1;表达式表达式2;表达式表达式3)语句;语句;for语句等价于下列语句:语句等价于下列语句:表达式表达式1;while(表达式表达式2)语句;语句;表达式表达式3;296.3 for语句#include int main()long n=1;int i;i=1;while(i=10)n*=i;i+;printf(“10!=%dn,n);for(i=
17、1;i=10;i+)n*=i;for语句最常用的形式:语句最常用的形式:for(初值;控制条件;增量初值;控制条件;增量)语句;语句;30 例:用例:用for语句实现打印乘法九九表语句实现打印乘法九九表#include int main()int i,j;for(i=1;i=9;i+)printf(%4d,i);printf(n-n);for(i=1;i=9;i+)for(j=1;j=3)为求出第为求出第 N 项的值,请编写程序。项的值,请编写程序。根据递推通项公式,可用递推法编写程根据递推通项公式,可用递推法编写程序,计算第序,计算第N项的值。项的值。346.3 for语句递推法递推法 由初
18、始的已知条件开始,先计算出第由初始的已知条件开始,先计算出第(N-1)步的结果,再利用已知的前步的结果,再利用已知的前(N-1)项结果,项结果,按递推公式按递推公式(或遵照递推规则或遵照递推规则),推出第,推出第 N 步结果。步结果。递推法是程序设计中最常用的方法之一,递推法是程序设计中最常用的方法之一,使用递推法必须有明确的递推初始值和递使用递推法必须有明确的递推初始值和递推规则推规则(递推公式递推公式)。35程序主体程序主体f=f2=1;for(i=3;i=n;i+)f1=f2;f2=f;f=f1+f2;i=n?向前传递前两项向前传递前两项f1=f2f2=f成立成立不成立不成立初始化:初始
19、化:f=f2=1计算计算 f=f1+f2递推项:递推项:i=3i+数列对应关系:数列对应关系:f1,f2,f递推计算递推计算f1=f2=1;for(i=3;i=n;i+)f=f1+f2;f1=f2;f2=f;36#include int main()long f1,f2,f;int i;for(;)printf(Input n=?);scanf(%d,&n);if(n=3)break;/*退出退出for循环循环*/else printf(nInput n is error!n);/*控制输入正确的控制输入正确的N值值*/f=f2=1;/*设置递推初始值设置递推初始值*/for(i=3;i=n;
20、i+)/*用递推法计算第用递推法计算第N项的值项的值*/f1=f2;f2=f;f=f1+f2;printf(No.%d is%dn,n,f);37 语句中的逗号语句中的逗号(,)运算运算逗号逗号(,)运算常见的三种用途是:运算常见的三种用途是:在变量说明表中用来分隔变量,起分隔符的在变量说明表中用来分隔变量,起分隔符的作用,如:作用,如:int i,j,k,m3,*p;在函数的参数表中分隔参数。如:在函数的参数表中分隔参数。如:printf(n=%d,x=%dn,n,x);在语句中使用。其形式是:在语句中使用。其形式是:表达式表达式n1,表达式表达式n2;用逗号分隔开的表达式从左到右进行计算,
21、用逗号分隔开的表达式从左到右进行计算,结果的类型和值是最右边表达式的类型和值。结果的类型和值是最右边表达式的类型和值。386.3 for语句例:输出下列字符串例:输出下列字符串:a z b y c x d w e v f u g t h s i r j q k p l o m n 分析:奇数位上的字符从分析:奇数位上的字符从a开始逐次递增,偶开始逐次递增,偶数位上的字符从数位上的字符从z开始逐次递减。开始逐次递减。#include int main()char i,j;/*i:奇位字符奇位字符 j:偶位字符偶位字符*/for(i=a,j=z;ij;i+,j-)printf(%c%c,i,j);
22、/*输出两个字符输出两个字符 */printf(n);a z b y c x d w e v f u g t h s i r j q k p l o m n39第6章 循环结构的程序设计 循环的基本概念 while语句 for语句 do_while语句 转移语句 循环应用406.4 do_while语句一一do_while语句格式语句格式do 语句语句;while(表达式表达式);二二do_while语句语句的执行流程的执行流程416.4 do_while语句表达式表达式?执行语句执行语句成立成立不成立不成立执行执行while子句之后的语句子句之后的语句循环控制条件循环控制条件循环体循环体后判
23、断后判断do 语句语句;while(表达式表达式);426.4 do_while语句do_while语句的特点语句的特点与与 while 和和 for 的区别:的区别:do_while 语句先执行循环体然后再语句先执行循环体然后再判断循环控制条件;使用判断循环控制条件;使用 do_while 构构成的循环,循环体部分至少要执行一次,成的循环,循环体部分至少要执行一次,使用使用 while 和和 for 构成的循环,循环体构成的循环,循环体部分有可能一次也不会执行。部分有可能一次也不会执行。do_while语句条件表达式后面的分号语句条件表达式后面的分号不是空语句。不是空语句。436.4 do_
24、while语句#include int main()long n=1;int i;i=1;while(i=10)n*=i;i+;printf(“10!=%dn,n);for(i=1;i=10;i+)n*=i;i=1;do n*=i;i+;while(i=0的整数,要求以相反的顺序的整数,要求以相反的顺序输出。例如:输入输出。例如:输入12345,则输出为,则输出为54321。思路:可以从个位开始,按位输出整数的每一位思路:可以从个位开始,按位输出整数的每一位 int main()unsigned int num;printf(Input the number:);scanf(%d,&num);
25、do printf(%d,num%10);num/=10;/*num缩小缩小10倍倍*/while(num!=0);简单转变为简单转变为while或或for语句,程序将不语句,程序将不能处理数字能处理数字0。456.4 do_while语句 例:从键盘输入任意的字符,按下列规例:从键盘输入任意的字符,按下列规则进行分类计数。则进行分类计数。第一类第一类 0,1,2,3,4,5,6,7,8,9第二类第二类 +,-,*,/,%,=第三类第三类 其它字符其它字符当输入字符当输入字符 时先计数然后停止接收输入。时先计数然后停止接收输入。46int main()int class1=0,class2=0
26、,class3=0;char ch;do putchar(ch=getch();/*函数的嵌套调用函数的嵌套调用*/switch(ch)case 0:case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 8:case 9:class1+;break;/*对分类对分类1计数计数*/case+:case-:case*:case/:case%:case=:class2+;break;/*对分类对分类2计数计数 */default:class3+;break;/*对分类对分类3计数计数*/while(ch!=);printf(class1=%d,c
27、lass2=%d,class3=%dn,class1,class2,class3);47循环语句小结C语言提供三种循环:语言提供三种循环:for、while、do_while for和和while先判断循环条件后执行循环体,先判断循环条件后执行循环体,do-while语句先执行循环体后判断循环条件;语句先执行循环体后判断循环条件;while和和do-while语句的条件表达式只有语句的条件表达式只有 1个,个,for语句有语句有3个表达式,表达式个表达式,表达式2是条件表达式;是条件表达式;while、do-while、for可以相互替换使用;可以相互替换使用;while语句多用于不需要赋初值
28、的或循环次数不定语句多用于不需要赋初值的或循环次数不定的情况;的情况;for语句多用于要赋初值或循环次数固定的情况;语句多用于要赋初值或循环次数固定的情况;do-while语句多用于至少要运行一次的循环;语句多用于至少要运行一次的循环;1.循环语句可串可并可嵌套,但不能交叉。循环语句可串可并可嵌套,但不能交叉。48循环语句小结 为了保证循环正常运行,应该特别注意:为了保证循环正常运行,应该特别注意:q循环控制条件循环控制条件q控制条件的初始状态控制条件的初始状态(初始值初始值)q循环体内部对控制条件的影响循环体内部对控制条件的影响 以上三个方面相互配合,相互影响,共同以上三个方面相互配合,相互
29、影响,共同完成循环控制完成循环控制49第6章 循环结构的程序设计 循环的基本概念 while语句 for语句 do_while语句 转移语句 循环应用506.5 转移语句一一转移语句的作用转移语句的作用改变程序的运行流程改变程序的运行流程C语言转移语句语言转移语句qbreakqcontinueqgoto二二return516.5.1 break语句一一格式格式break;功能功能q在在switch语句中结束语句中结束case子句,使控制转到子句,使控制转到switch语句之外。语句之外。二二在循环语句的循环体中使用,结束循环过程,在循环语句的循环体中使用,结束循环过程,使控制转移到整个循环语句
30、之外的下一条语使控制转移到整个循环语句之外的下一条语句处。句处。52break语句的执行流程语句的执行流程表达式表达式?成立成立不成立不成立后续语句后续语句break表达式表达式2?成立成立不成立不成立后续语句后续语句执行表达式执行表达式3执行表达式执行表达式1break表达式表达式?成立成立不成立不成立后续语句后续语句breakwhile语句语句for语句语句do-while语句语句53 例:例:求求555555的约数中最大的三位数的约数中最大的三位数int main()int j;long n;printf(Please input number:);scanf(%ld,&n);/*所求的
31、约数的可能取值是从所求的约数的可能取值是从999到到100,j从大到小从大到小*/for(j=999;j=100;j-)if(n%j=0)/*若能被若能被j整除,则整除,则j是约数是约数*/printf(3 digits in%ld=%dn,n,j);break;/*控制退出循环控制退出循环 */return 0;546.5.1 break语句break语句使用注意语句使用注意q 在嵌套循环中,在嵌套循环中,break 语句仅能退出一层语句仅能退出一层(当当前层前层)循环;循环;q 若在循环语句中包含了若在循环语句中包含了switch 语句,那么语句,那么switch 语句中的语句中的 bre
32、ak 语句仅能使控制退语句仅能使控制退出出 switch 语句;语句;q break 语句并不是程序设计中必不可少的语语句并不是程序设计中必不可少的语句,可以通过改变程序的结构去掉。句,可以通过改变程序的结构去掉。556.5.2 continue语句一一格式格式 continue;功能功能 continue语句仅能在循环语句中使用:它的作语句仅能在循环语句中使用:它的作用不是结束循环,而是开始一次新的循环。用不是结束循环,而是开始一次新的循环。q 对于对于for语句,将控制转到执行表达式语句,将控制转到执行表达式3和条和条件测试部分;件测试部分;q 对于对于while和和do-while语句,
33、将控制转到条件语句,将控制转到条件测试部分;测试部分;二二从逻辑上讲,适当改变程序的结构就可以不从逻辑上讲,适当改变程序的结构就可以不需要使用需要使用continue语句。语句。56continue语句的执行流程语句的执行流程表达式表达式?成立成立不成立不成立后续语句后续语句continue表达式表达式2?成立成立不成立不成立后续语句后续语句执行表达式执行表达式3执行表达式执行表达式1continue表达式表达式?成立成立不成立不成立后续语句后续语句continuewhile语句语句for语句语句do-while语句语句57例:例:输入输入10个整数,求其中正数的个数及平个整数,求其中正数的个
34、数及平均值,精确到小数点后两位。均值,精确到小数点后两位。int main()int i,count=0,j,sum=0;for(i=1;i=10;i+)printf(Input integer:);scanf(%d,&j);if(j 0)printf(Plus number:%d,average value:%.2f,count,1.0*sum/count);else printf(Plus number:0,average value:0);586.5.3 goto语句一一格式格式goto 标号标号;功能功能 将程序控制转移到标号所指定的语句处将程序控制转移到标号所指定的语句处继续执行。标
35、号的唯一功能就是作为继续执行。标号的唯一功能就是作为goto语句的目标。标号的作用域是它所在的整语句的目标。标号的作用域是它所在的整个函数。个函数。注意:为了保证程序的结构化,注意:为了保证程序的结构化,不允许使用向上不允许使用向上goto语句语句596.5.3 goto语句例:已知一首项大于例:已知一首项大于0的等差递增数列的前四的等差递增数列的前四项和为项和为26,前四项的积为,前四项的积为880,求这数列。,求这数列。设数列的第一项为设数列的第一项为a(a0),公差为,公差为d(d0)。则该数列满足条件:则该数列满足条件:a+(a+d)+(a+2*d)+(a+3*d)=4*a+6*d=2
36、6 a*(a+d)*(a+2*d)*(a+3*d)=880 可以推出,首项可以推出,首项a和公差和公差d的取值范围为:的取值范围为:1=a=5 1=d=3 可以使用穷举的方法,在可以使用穷举的方法,在 首项首项a 和和 公差公差d 的取值范围内进行判断。的取值范围内进行判断。606.5.3 goto语句int main()int a,x,y,d,i;for(a=1;a=5;+a)/*在在a的范围内穷举的范围内穷举*/for(d=1;d=3;+d)/*在在d的范围内穷举的范围内穷举 */x=a+(a+d)+(a+2*d)+(a+3*d);/*前四项的和前四项的和*/y=a*(a+d)*(a+2*
37、d)*(a+3*d);/*前四项的积前四项的积*/if(x=26&y=880)/*若满足条件若满足条件*/goto out;/*退出二重循环退出二重循环 */out:/*语句标号语句标号 */for(i=0;i=20;+i)/*输出运行结果输出运行结果 */printf(%d,a+i*d);616.5.3 goto语句int main()int a,x,y,d,i,flag=1;/*flag:标志变量:标志变量 */for(a=1;a=5&flag;+a)/*flag!=0是进行循环是进行循环*/for(d=1;d=3&flag;+d)x=a+(a+d)+(a+2*d)+(a+3*d);/*前
38、四项的和前四项的和*/y=a*(a+d)*(a+2*d)*(a+3*d);/*前四项的积前四项的积*/if(x=26&y=880)/*若满足条件若满足条件 */for(i=0;i=20;+i)/*输出结果输出结果 */printf(%d,a+i*d);flag=0;/*控制退出二重循环控制退出二重循环 */通过增加标志变量可以有效地控制循环通过增加标志变量可以有效地控制循环626.5.4 return语句一一格式格式q 格式格式1:return;q 格式格式2:return(表达式表达式);功能功能qreturn语句使程序从被调用函数中返回到调语句使程序从被调用函数中返回到调用函数的调用处继续
39、运行;用函数的调用处继续运行;二二如果如果return后跟一表达式,则该表达式的值后跟一表达式,则该表达式的值会从被调用函数中带回到调用它的函数,称会从被调用函数中带回到调用它的函数,称为返回值。为返回值。几个程序片段int s=1,i=1;scanf(“%d”,&n);while(i0)pro*=x;return pro;64子函数子函数power:计算计算x的的y次方次方不要用标准库函数不要用标准库函数pow处理整型处理整型int m=0;scanf(%d,&n);do m=m*10+n%10;n/=10;while(n!=0);65求反序数求反序数例:求最大最小数的算术运算结果例:求最大
40、最小数的算术运算结果用例输入:用例输入:15,1,11,2,0,3,+,=输出:输出:15+0=15 如何用字符输入形式读入一个整数?如何用字符输入形式读入一个整数?int s=0;char ch;while(ch=getchar()!=)if(ch=0&ch=9)s=s*10+ch-0;else 66int a,b;char ch;scanf(“%d%c%d”,&a,&ch,&b);scanf(“%c”,&ch);输入输入 3 5 后,后,a为为3,b为为5,ch为为n67“字符字符”对对“%d”来讲是非法输入,但对来讲是非法输入,但对%c是合是合法的,空格和法的,空格和n等也将不作为输入结
41、束标志。等也将不作为输入结束标志。char ch;while(ch=getchar()!=)putchar(ch);68如何判断如何判断“没有任何一项匹配上没有任何一项匹配上”?6970第6章 循环结构的程序设计 循环的基本概念 while语句 for语句 do_while语句 转移语句 循环应用71程序设计的一般步骤程序设计的一般步骤q 分析题意分析题意,明确问题的性质明确问题的性质 数值问题数值问题/非数值问题非数值问题q 建立问题的描述模型建立问题的描述模型 数学模型数学模型/过程模型过程模型q 设计设计/确定算法确定算法l数学问题:数值分析数学问题:数值分析l非数学问题:数据结构非数学
42、问题:数据结构/算法分析与设计算法分析与设计 一般方法:穷举一般方法:穷举/递推递推/递归递归/.q 编程调试编程调试1.分析运行结果分析运行结果726.6 循环应用一一穷举法穷举法73例:百钱百鸡问题例:百钱百鸡问题 中国古代数学家张丘建在他中国古代数学家张丘建在他的算经中提出了著名的的算经中提出了著名的“百钱百鸡问题百钱百鸡问题”:鸡:鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一;百钱买百鸡,翁、母、雏各几何一;百钱买百鸡,翁、母、雏各几何?问题分析与算法设计问题分析与算法设计 设:要买设:要买x只公鸡,只公鸡,y只母鸡,只母鸡,z只小鸡,可得只
43、小鸡,可得到方程到方程:x+y+z=100 5 x+3 y+z/3=100 取值范围:取值范围:0=x,y,z=100 可以采用穷举法求解:将变量可以采用穷举法求解:将变量 x、y、z 的所有的所有取值可能代入方程进行计算取值可能代入方程进行计算74int main()int x,y,z,j=0;for(x=0;x=100;x+)for(y=0;y=100;y+)for(z=0;z=100;z+)if(x+y+z=100&5*x+3*y+z/3=100)printf(%2d:cock=%2d hen=%2d chicken=%2dn,+j,x,y,z);z=100满足方满足方程?程?Y N输出
44、输出z+z=0y=100y+y=0 x=100 x+x=0开始开始结束结束75丢失重要条件:丢失重要条件:z 应该能够被应该能够被3整除。整除。int main()int x,y,z,j=0;for(x=0;x=20;x+)for(y=0;y=33;y+)for(z=0;z=100;z+)if(z%3=0&x+y+z=100&5*x+3*y+z/3=100)printf(%2d:cock=%2d hen=%2d chicken=%2dn,+j,x,y,z);运行程序,正确的结果:运行程序,正确的结果:1:cock=0 hen=25 chicken=75 2:cock=4 hen=18 chic
45、ken=78 3:cock=8 hen=11 chicken=81 4:cock=12 hen=4 chicken=84z+=3)76优化程序:优化程序:for(x=0;x=20;x+)for(y=0;y=33;y+)for(z=0;z=100;z+)if(z%3=0&x+y+z=100&5*x+3*y+z/3=100)printf(%2d:cock=%2d hen=%2d chicken=%2dn,+j,x,y,z);再优化:再优化:for(x=0;x=20;x+)for(y=0;y=(100-5*x)/3;y+)z=100-x-y;if(z%3=0&5*x+3*y+z/3=100)prin
46、tf(%2d:cock=%2d hen=%2d chicken=%2dn,+j,x,y,z);77例:新娘和新郎例:新娘和新郎问题:三对情侣参加婚礼,三个新郎为问题:三对情侣参加婚礼,三个新郎为A、B、C,三个,三个新娘为新娘为X、Y、Z。有人不知道谁和谁结婚,于是询问了。有人不知道谁和谁结婚,于是询问了其中的三位,听到的回答是这样的:说他将和结婚;其中的三位,听到的回答是这样的:说他将和结婚;说她的未婚夫是;说他将和结婚。这人听后知说她的未婚夫是;说他将和结婚。这人听后知道他们在开玩笑,全是假话。请编程找出谁将和谁结婚。道他们在开玩笑,全是假话。请编程找出谁将和谁结婚。问题分析与算法设计:问
47、题分析与算法设计:设:设:A、B、C三人用三人用1、2、3表示,将表示,将X和和A结婚表示结婚表示为为x=1,将,将Y不与不与A结婚表示为结婚表示为y!=1。则:。则:x!=1 A不与不与X结婚结婚 x!=3 X的未婚夫不是的未婚夫不是C z!=3 C不与不与Z结婚结婚题意还隐含:题意还隐含:x!=y 且且 x!=z 且且 y!=z78int main()int x,y,z;for(x=1;x=3;x+)/*穷举穷举X的全部可能配偶的全部可能配偶*/for(y=1;y=3;y+)/*穷举穷举Y的全部可能配偶的全部可能配偶*/for(z=1;z0;nm10的整数的整数80int main()in
48、t x,y,m,flag;/*flag:标志变量:标志变量*/for(x=0,flag=1;flag;x+)/*穷举穷举x */y=100+x;/*计算计算y */for(m=10;m*m y;m+);if(m*m=y)/*判断判断y是否为一个数的平方是否为一个数的平方*/for(;m*m y+68;m+);if(m*m=y+68)/*判断判断 y+68*/printf(%dn,x);flag=0;/*flag置置0,结束循环,结束循环 */穷举穷举x、m、n81int main()int y,m,flag;for(y=101,flag=1;flag;y+)/*穷举穷举y */for(m=10
49、;m*m y;m+);if(m*m=y)for(;m*m y+68;m+);if(m*m=y+68)printf(%dn,y-100);flag=0;穷举穷举y、m、n82int main()int m,n,flag;/*flag:标志变量:标志变量*/for(m=10,flag=1;flag;m+)/*通过穷举通过穷举m,直接构造平方数,直接构造平方数y*/for(n=10;n*n 0)printf(“*”);n-;printf(“n”);87例:输出边长为例:输出边长为 n 的正方型的正方型 例如,输入例如,输入 n=4,输出如下图形:,输出如下图形:*算法分析与设计:算法分析与设计:1.
50、输入输入 n;2.重复输出重复输出 n行,每行输出行,每行输出 n 个个*;加细一:加细一:1.输入输入 n;2.for(i=1;i=n;i+)输出一行中的输出一行中的 n 个个*;88加细二:加细二:1.输入输入n;2.for(i=1;i=n;i+)输出输出 n 个个*;换新行换新行;加细三:加细三:1.输入输入n;2.for(i=1;i=n;i+)for(j=1;j=n;j+)printf(“*”);printf(“n”);89l整理,得到程序如下:整理,得到程序如下:int main()int m,i,j;scanf(“%d”,&n);for(i=1;i=n;i+)/*控制输出控制输出n
侵权处理QQ:3464097650--上传资料QQ:3464097650
【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。