版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、循环结构的程序设计1第6章 循环结构的程序设计 本章要点q 循环语句的执行流程q 不同形式的循环控制q 多重循环问题q 简单算法设计2第6章 循环结构的程序设计 循环的基本概念 while语句 for语句 do_while语句 转移语句 循环应用36.1 循环的基本概念 提出问题提出问题提问:从键盘上输入提问:从键盘上输入10个整数并求和,怎么编程?个整数并求和,怎么编程?回答:在程序中写回答:在程序中写10个个scanf语句,还可以写语句,还可以写%d%d提问:从键盘上输入提问:从键盘上输入500个整数并求和,怎么编程?个整数并求和,怎么编程?回答:这个,嗯回答:这个,嗯? 不会让我写不会让
2、我写500个个 以上问题的实质是:将以上问题的实质是:将scanf函数重复执行函数重复执行N遍。我们可以引出一个概念遍。我们可以引出一个概念“循环循环”,简单而,简单而言:言:循环循环就是不断反复地执行同一段程序。就是不断反复地执行同一段程序。?46.1 循环的基本概念q 循环循环 反复执行同一段程序,直到满足一定反复执行同一段程序,直到满足一定的条件后才停止执行该段程序。的条件后才停止执行该段程序。q C语言中控制循环的语句语言中控制循环的语句:q whileq forq do_while5第6章 循环结构的程序设计 循环的基本概念 while语句 for语句 do_while语句 转移语句
3、 循环应用66.2 while语句一一while语句格式语句格式while (表达式表达式)语句;语句;说明:语句可是简单语句,也可是复合语句。说明:语句可是简单语句,也可是复合语句。二二while语句语句的执行流程的执行流程76.2 while语句表达式表达式?执行语句执行语句成立成立不成立不成立执行执行while循环之后的语句循环之后的语句循环控制条件循环控制条件循环体循环体while (表达式表达式)语句;语句;8例:从键盘输入例:从键盘输入10个整数,求这个整数,求这10个整数之和个整数之和q程序主体:程序主体:count10?输入输入num成立成立不成立不成立输出结果输出结果tota
4、l计数器计数器count=0累加器累加器total=0total += numcount+开始开始结束结束while ( count10 )count+;scanf(%d, &num);total += num;89 #include int main ( ) int count,num,total; / /* * count:计数器,计数器,num:输入的整数输入的整数 * */ / count=0; total=0; / /* * total:存放累加和存放累加和 * */ / while (count10) / /* * 循环控制条件循环控制条件 * */ / printf (Enter
5、 the No.%d=, count); / /* *循环体循环体* */ / scanf (%d, &num); total += num; / /* * 计算累加和计算累加和 * */ / count +; printf(Total=%dn, total);10 例:求例:求n的阶乘的阶乘n! (1=n=10)q程序主体:程序主体: while(i=n) s*=i; i+; i1时时116.2 while语句 #include int main ( ) long s=1; / /* * s:存放累积结果存放累积结果 * */ / int i=1; / /* * i:计数器,同时是累积的对象
6、计数器,同时是累积的对象 * */ / while (i=10) / /* * 循环控制条件循环控制条件 * */ / / /* * 循环体循环体 * */ / s*=i; / /* * 计算累积和计算累积和 * */ / i+; printf(“10!=%dn, s);以求以求10!为例为例126.2 while语句q 比较比较total=0;count=0;while (count10) total += num; count +;s=1;i=1;while (i=10) s *= i; i +;10个数相加个数相加10个数相乘个数相乘13例:分析程序运行结果例:分析程序运行结果 #inc
7、lude int main ( ) int n=0;while ( n3 ) printf (“n is %dn”,n); n+;结果结果:程序将不停的打印:程序将不停的打印“n is 0”,直至终止程序无,直至终止程序无法正常终止的程序,称为法正常终止的程序,称为“死循环死循环”。结论结论:while语句循环体中,一定要有能够对循环控语句循环体中,一定要有能够对循环控制条件产生影响的语句,避免出现制条件产生影响的语句,避免出现“死循环死循环”现象。现象。14 例:求例:求1413的最后三位数。的最后三位数。问题分析:问题分析:14的的13次方已经超次方已经超出了计算机所能表出了计算机所能表示
8、的整数范围示的整数范围乘法规律:乘积的最后乘法规律:乘积的最后三位的值只与乘数和被三位的值只与乘数和被乘数的后三位有关乘数的后三位有关C语言中最长的整数是:语言中最长的整数是:无符号长整型数:无符号长整型数:0 429496729510位位1410=28925465497612位位问题被简化为问题被简化为求三位数乘法求三位数乘法156.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:);
9、printf(%dn,a%1000);Input X and Y:14*133 digits is:144Input X and Y:15*123 digits is:625166.2 while语句如何一次输入多个字符或数值如何一次输入多个字符或数值例:例:将从键盘输入的一行字符将从键盘输入的一行字符(回车结束回车结束)复制复制到标准输出到标准输出(显示器显示器)。回顾字符输入输出函数:回顾字符输入输出函数:getchar():调用时,等待用户按键,输入的:调用时,等待用户按键,输入的字符存入键盘缓冲区,直到用户按字符存入键盘缓冲区,直到用户按Enter为止为止(Enter即即n也在缓冲区也
10、在缓冲区)。输入。输入Enter后,后,getchar从输入流每次读一个字符,作为其返从输入流每次读一个字符,作为其返回值。其它未读的字符保留在缓冲区,待下回值。其它未读的字符保留在缓冲区,待下一个一个getchar调用。调用。176.2 while语句#include int main( ) char ch; ch = getchar( ); while ( ch != n ) putchar ( ch ); ch = getchar( ); ch!=n?显示显示ch成立成立不成立不成立ch=读入一个字符读入一个字符ch=读入下一个字符读入下一个字符开始开始结束结束ab13cdeab13cd
11、eputchar(ch=getchar();putchar(getchar();186.2 while语句#include int main( ) char ch; while (ch= getchar( ) != n ) putchar ( ch );一段更简洁的程序一段更简洁的程序196.2 while语句例:输入若干整数,竖排输出,当输入为例:输入若干整数,竖排输出,当输入为0时时程序结束。如:输入程序结束。如:输入13 -6 356 0 输出:输出:13-6356scanf():调用时,等待用户输入,输入的:调用时,等待用户输入,输入的内容存入键盘缓冲区,直到用户按内容存入键盘缓冲区,
12、直到用户按Enter为止。为止。输入输入Enter后,后,scanf从输入流每次按格式读从输入流每次按格式读一个单元,作为其返回值。其它未读的内容一个单元,作为其返回值。其它未读的内容保留在缓冲区,待下一个保留在缓冲区,待下一个scanf调用。调用。206.2 while语句#include int main( ) int x; scanf(“%d”,&x); while ( x ) printf (“%dn”,x); scanf(“%d”,&x); scanf()把缓冲区的内容把缓冲区的内容全部读完以后,才再次全部读完以后,才再次等待用户从键盘输入等待用户从键盘输入输入:输入:13 -6 3
13、56 0输出:输出:13 -6 356输入:输入:13 -6 356 0 7输出:输出:13 -6 356输入:输入:13 -6 216.2 while语句循环嵌套循环嵌套在循环体中,又包含有循环语句。在循环体中,又包含有循环语句。whilewhile22例:输出下三角形乘法九九表。例:输出下三角形乘法九九表。 1 2 3 4 5 6 7 8 9- 1 2 4 3 6 9 4 8 12 16 5 10 15 20 25 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 假设
14、:行号为假设:行号为i ,列号为,列号为j 则第则第i行中一共要输出行中一共要输出i个乘积,每一项为个乘积,每一项为i*j。(1=i=9)(1=j=i)i=6j=5i*j屏幕上的字符只能从上到下逐屏幕上的字符只能从上到下逐行显示,同一行内,只能从左行显示,同一行内,只能从左到右逐字显示。到右逐字显示。2223l显示要求显示要求 屏幕上的字符只能从上到下逐行显示,同屏幕上的字符只能从上到下逐行显示,同一行内,只能从左到右逐字显示。一行内,只能从左到右逐字显示。l伪代码伪代码(Pseudocode) while (控制显示控制显示n行行 ) while (控制显示一行中的控制显示一行中的m个字符个
15、字符 ) 输出一个需要的字符输出一个需要的字符; 列计数器列计数器 j+; 行数计数器行数计数器 i+; 24 #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 ) /* 嵌套的二重循环,输出第嵌套的二重循环,输出第i行行 */ printf (%4d, i*j );
16、j +; /* 列计数器列计数器+1 */ printf (n); /* 一行输出结束后,输出一行输出结束后,输出n */ i +; /* 行计数器行计数器+1 */ 外层循环体执行外层循环体执行1次,内层循环要完整执行次,内层循环要完整执行1次次25第6章 循环结构的程序设计 循环的基本概念 while语句 for语句 do_while语句 转移语句 循环应用266.3 for语句一一for语句格式语句格式for (表达式表达式1;表达式表达式2;表达式表达式3) 语句;语句; 说明:语句可是简单语句,也可是复合语句。说明:语句可是简单语句,也可是复合语句。二二for语句语句的执行流程的执行
17、流程27循环初始条件循环初始条件循环控制条件循环控制条件表达式表达式2?执行语句执行语句成立成立不成立不成立执行执行for循环之后的语句循环之后的语句执行表达式执行表达式3执行表达式执行表达式1循环体循环体 for (表达式表达式1;表达式表达式2;表达式表达式3) 语句;语句;for语句等价于下列语句:语句等价于下列语句:表达式表达式1;while (表达式表达式2) 语句;语句; 表达式表达式3;286.3 for语句 #include int main ( ) long n=1; int i; i=1;while (i=10) n*=i; i+;printf(“10!=%dn, n);
18、for (i=1;i=10;i+) n*=i;for语句最常用的形式:语句最常用的形式:for (初值;控制条件;增量初值;控制条件;增量) 语句;语句;29 例:用例:用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 项的值,请编写程序。项的值,请编写程序。 根据递推通项公式,可用根据递推通项公式,可用递推法递推法编写程编写
19、程序,计算第序,计算第N项的值。项的值。336.3 for语句递推法递推法 由初始的已知条件开始,先计算出第由初始的已知条件开始,先计算出第(N-1)步的结果,再利用已知的前步的结果,再利用已知的前(N-1)项结果,项结果,按递推公式按递推公式(或遵照递推规则或遵照递推规则),推出第,推出第 N 步结果。步结果。 递推法是程序设计中最常用的方法之一,递推法是程序设计中最常用的方法之一,使用递推法必须有明确的递推初始值和递使用递推法必须有明确的递推初始值和递推规则推规则(递推公式递推公式)。34程序主体程序主体f = f2 = 1;for ( i=3; i=n; i+ ) f1 = f2; f2
20、 = f; f = f1 + f2;i = n?向前传递前两项向前传递前两项f1 = f2f2 = f成立成立不成立不成立初始化:初始化: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;35#include int main( ) long f1, f2, f; int i; for ( ; ; ) printf (Input n=?); scanf (%d,&n); if ( n = 3 ) break; / /* *退出退出
21、for循环循环* */ / else printf (nInput n is error !n); / /* *控制输入正确的控制输入正确的N值值* */ / f = f2 = 1; / /* *设置递推初始值设置递推初始值* */ / for ( i=3; i=n; i+) / /* *用递推法计算第用递推法计算第N项的值项的值* */ / f1 = f2; f2 = f; f = f1 + f2; printf (No. %d is %dn, n, f);36 语句中的逗号语句中的逗号(,)运算运算逗号逗号(,)运算常见的三种用途是:运算常见的三种用途是: 在变量说明表中用来分隔变量,起分
22、隔符的在变量说明表中用来分隔变量,起分隔符的作用,如:作用,如:int i, j, k, m3, *p; 在函数的参数表中分隔参数。如:在函数的参数表中分隔参数。如:printf (n=%d, x=%dn, n, x); 在语句中使用。其形式是:在语句中使用。其形式是:表达式表达式n1, 表达式表达式n2; 用逗号分隔开的表达式从左到右进行计算,用逗号分隔开的表达式从左到右进行计算,结果的类型和值是最右边表达式的类型和值。结果的类型和值是最右边表达式的类型和值。376.3 for语句例:输出下列字符串例:输出下列字符串:a z b y c x d w e v f u g t h s i r j
23、 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); / /* * 输出两个字符输出两个字符 * */ / 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 n38第6章 循
24、环结构的程序设计 循环的基本概念 while语句 for语句 do_while语句 转移语句 循环应用396.4 do_while语句一一do_while语句格式语句格式do 语句语句; while (表达式表达式);二二do_while语句语句的执行流程的执行流程406.4 do_while语句表达式表达式?执行语句执行语句成立成立不成立不成立执行执行while子句之后的语句子句之后的语句循环控制条件循环控制条件循环体循环体后判断后判断do 语句语句; while(表达式表达式);416.4 do_while语句do_while语句的特点语句的特点与与 while 和和 for 的区别:的区
25、别: do_while 语句语句先执行循环体先执行循环体然后然后再再判断判断循环循环控制条件控制条件;使用;使用 do_while 构构成的循环,循环体部分成的循环,循环体部分至少要执行一次至少要执行一次,使用使用 while 和和 for 构成的循环,循环体构成的循环,循环体部分有可能一次也不会执行。部分有可能一次也不会执行。 do_while语句条件表达式后面的分号语句条件表达式后面的分号不是空语句。不是空语句。426.4 do_while语句 #include int main ( ) long n=1; int i; i=1;while (i=10) n*=i; i+; printf(
26、“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); do printf(%d, num%10); num /= 10; / /* *num缩小缩小10倍倍* */
27、/ while ( num != 0 );简单转变为简单转变为while或或for语句,程序将不语句,程序将不能处理数字能处理数字0。446.4 do_while语句 例:从键盘输入任意的字符,按下列规例:从键盘输入任意的字符,按下列规则进行分类计数。则进行分类计数。第一类第一类 0, 1, 2, 3, 4, 5, 6, 7, 8, 9第二类第二类 +, -, *, /, %, =第三类第三类 其它字符其它字符当输入字符当输入字符 时时先计数然后停止先计数然后停止接收输入。接收输入。45int main( ) int class1=0, class2=0, class3=0; char ch;
28、 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;/
29、 /* *对分类对分类3计数计数* */ / while (ch != ); printf(class1=%d, class2=%d, class3=%dn, class1, class2, class3);46循环语句小结C语言提供三种循环:语言提供三种循环:for、while、do_while for和和while先判断循环条件后执行循环体,先判断循环条件后执行循环体,do-while语句先执行循环体后判断循环条件;语句先执行循环体后判断循环条件; while和和do-while语句的条件表达式只有语句的条件表达式只有 1个,个,for语句有语句有3个表达式,表达式个表达式,表达式2是条件
30、表达式;是条件表达式; while、do-while、for可以相互替换使用;可以相互替换使用; while语句多用于语句多用于不需要赋初值不需要赋初值的或的或循环次数不定循环次数不定的情况;的情况; for语句多用于语句多用于要赋初值要赋初值或或循环次数固定循环次数固定的情况;的情况; do-while语句多用于语句多用于至少要运行一次至少要运行一次的循环;的循环;1.循环语句可串可并可嵌套,但不能交叉。循环语句可串可并可嵌套,但不能交叉。47循环语句小结 为了保证循环正常运行,应该特别注意:为了保证循环正常运行,应该特别注意:q循环控制条件循环控制条件q控制条件的初始状态控制条件的初始状态
31、(初始值初始值)q循环体内部对控制条件的影响循环体内部对控制条件的影响 以上三个方面相互配合,相互影响,共同以上三个方面相互配合,相互影响,共同完成循环控制完成循环控制48第6章 循环结构的程序设计 循环的基本概念 while语句 for语句 do_while语句 转移语句 循环应用496.5 转移语句一一转移语句的作用转移语句的作用改变程序的运行流程改变程序的运行流程C语言转移语句语言转移语句qbreakqcontinueqgoto二二return506.5.1 break语句一一格式格式break;功能功能q在在switch语句中结束语句中结束case子句,使控制转到子句,使控制转到swi
32、tch语句之外。语句之外。二二在循环语句的循环体中使用,结束循环过程,在循环语句的循环体中使用,结束循环过程,使控制转移到整个循环语句之外的下一条语使控制转移到整个循环语句之外的下一条语句处。句处。51break语句的执行流程语句的执行流程表达式表达式?成立成立不成立不成立后续语句后续语句break表达式表达式2?成立成立不成立不成立后续语句后续语句执行表达式执行表达式3执行表达式执行表达式1break表达式表达式?成立成立不成立不成立后续语句后续语句breakwhile语句语句for语句语句do-while语句语句52 例:例:求求555555的约数中最大的三位数的约数中最大的三位数int
33、main() int j; long n; printf(Please input number:); scanf(%ld, &n); / /* *所求的约数的可能取值是从所求的约数的可能取值是从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;536.5.1 break语句break语句使用注
34、意语句使用注意q 在嵌套循环中,在嵌套循环中,break 语句仅能退出语句仅能退出一层一层(当当前层前层)循环;循环;q 若在循环语句中包含了若在循环语句中包含了switch 语句,那么语句,那么switch 语句中的语句中的 break 语句仅能使控制退语句仅能使控制退出出 switch 语句;语句;q break 语句并不是程序设计中必不可少的语语句并不是程序设计中必不可少的语句,可以通过改变程序的结构去掉。句,可以通过改变程序的结构去掉。546.5.2 continue语句一一格式格式 continue;功能功能 continue语句仅能在循环语句中使用:它的作语句仅能在循环语句中使用:
35、它的作用不是结束循环,而是开始一次新的循环。用不是结束循环,而是开始一次新的循环。q 对于对于for语句,将控制转到执行表达式语句,将控制转到执行表达式3和条和条件测试部分;件测试部分;q 对于对于while和和do-while语句,将控制转到条件语句,将控制转到条件测试部分;测试部分;二二从逻辑上讲,适当改变程序的结构就可以不从逻辑上讲,适当改变程序的结构就可以不需要使用需要使用continue语句。语句。55continue语句的执行流程语句的执行流程表达式表达式?成立成立不成立不成立后续语句后续语句continue表达式表达式2?成立成立不成立不成立后续语句后续语句执行表达式执行表达式3
36、执行表达式执行表达式1continue表达式表达式?成立成立不成立不成立后续语句后续语句continuewhile语句语句for语句语句do-while语句语句56例:例:输入输入10个整数,求其中正数的个数及平个整数,求其中正数的个数及平均值,精确到小数点后两位。均值,精确到小数点后两位。 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, c
37、ount, 1.0*sum/count); else printf(Plus number: 0, average value: 0);576.5.3 goto语句一一格式格式goto 标号标号;功能功能 将程序控制转移到标号所指定的语句处将程序控制转移到标号所指定的语句处继续执行。标号的唯一功能就是作为继续执行。标号的唯一功能就是作为goto语句的目标。标号的作用域是它所在的整语句的目标。标号的作用域是它所在的整个函数。个函数。注意:为了保证程序的结构化,注意:为了保证程序的结构化,不允许使用向上不允许使用向上goto语句语句586.5.3 goto语句例:已知一首项大于例:已知一首项大于0
38、的等差递增数列的前四的等差递增数列的前四项和为项和为26,前四项的积为,前四项的积为880,求这数列。,求这数列。 设数列的第一项为设数列的第一项为a(a0),公差为,公差为d(d0)。则该数列满足条件:则该数列满足条件: a+(a+d)+(a+2*d)+(a+3*d) = 4*a+6*d = 26 a*(a+d)*(a+2*d)*(a+3*d) = 880 可以推出,首项可以推出,首项a和公差和公差d的取值范围为:的取值范围为: 1 = a =5 1 = d =3 可以使用穷举的方法,在可以使用穷举的方法,在 首项首项a 和和 公差公差d 的取值范围内进行判断。的取值范围内进行判断。596.
39、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*d)*(a+3*d); / /* *前四项的积前四项的积* */ / if (x=26 & y=880 ) / /* *若满足条件若满足条件* */ / goto out; / /* * 退出
40、二重循环退出二重循环 * */ / out: / /* * 语句标号语句标号 * */ / for (i=0; i=20; +i) / /* * 输出运行结果输出运行结果 * */ / printf(%d, a+i*d);606.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)
41、; / /* *前四项的和前四项的和* */ / 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; / /* * 控制退出二重循环控制退出二重循环 * */ / 通过增加标志变量可以有效地控制循环通过增加标志变量可以有效地控制循环616.5.4 return语句一一格式格式q 格式格式1:return;q 格式格式2
42、:return (表达式表达式);功能功能qreturn语句使程序从被调用函数中返回到调语句使程序从被调用函数中返回到调用函数的调用处继续运行;用函数的调用处继续运行;二二如果如果return后跟一表达式,则该表达式的值后跟一表达式,则该表达式的值会从被调用函数中带回到调用它的函数,称会从被调用函数中带回到调用它的函数,称为返回值。为返回值。几个程序片段int s=1,i=1;scanf(“%d”,&n);while(i0) pro*=x; return pro;63子函数子函数power:计算计算x的的y次方次方不要用标准库函数不要用标准库函数pow处理整型处理整型int m=0; scan
43、f(%d,&n);do m=m*10+n%10; n/=10; while(n!=0);64求反序数求反序数例:求最大最小数的算术运算结果例:求最大最小数的算术运算结果用例输入:用例输入: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 65int a,b;char ch;scanf (“%d%c%d”,&a,&ch,&b); scanf (“%c”,&ch); 输入输入
44、3 5 后,后,a为为3,b为为5,ch为为n66“字符字符”对对“%d”来讲是非法输入,但对来讲是非法输入,但对%c是合是合法的,空格和法的,空格和n等也将不作为输入结束标志。等也将不作为输入结束标志。char ch;while (ch= getchar( ) != = ) putchar ( ch );67如何判断如何判断“没有任何一项匹配上没有任何一项匹配上”?6869第6章 循环结构的程序设计 循环的基本概念 while语句 for语句 do_while语句 转移语句 循环应用70程序设计的一般步骤程序设计的一般步骤q 分析题意分析题意,明确问题的性质明确问题的性质 数值问题数值问题
45、/ 非数值问题非数值问题q 建立问题的描述模型建立问题的描述模型 数学模型数学模型 / 过程模型过程模型q 设计设计/确定算法确定算法l数学问题:数值分析数学问题:数值分析l非数学问题:数据结构非数学问题:数据结构 / 算法分析与设计算法分析与设计 一般方法:一般方法:穷举穷举 / 递推递推 / 递归递归 /.q 编程调试编程调试1. 分析运行结果分析运行结果716.6 循环应用一一穷举法穷举法72例:百钱百鸡问题例:百钱百鸡问题 中国古代数学家张丘建在他中国古代数学家张丘建在他的算经中提出了著名的的算经中提出了著名的“百钱百鸡问题百钱百鸡问题”:鸡鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱
46、翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一;百钱买百鸡,翁、母、雏各几何一;百钱买百鸡,翁、母、雏各几何? 问题分析与算法设计问题分析与算法设计 设:要买设:要买x只公鸡,只公鸡,y只母鸡,只母鸡,z只小鸡,可得只小鸡,可得到方程到方程: x + y + z = 100 5 x + 3 y + z / 3 = 100 取值范围:取值范围:0 = x, y, z = 100 可以采用穷举法求解:将变量可以采用穷举法求解:将变量 x、y、z 的所有的所有取值可能代入方程进行计算取值可能代入方程进行计算73int main( ) int x,y,z,j=0; for(x=0;x=100;x+) f
47、or(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输出输出z+z = 0y=100y+y = 0 x=100 x+x = 0开始开始结束结束74丢失重要条件:丢失重要条件: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
48、; 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 chicken=78 3: cock= 8 hen=11 chicken=81 4: cock=12 hen= 4 chicken=84z+=3)75优化程序:优化程序:for(x=0; x=20; x+) for(y=0; y=33; y+) for(z=0; z=1
49、00; 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) printf(%2d:cock=%2d hen=%2d chicken=%2dn, +j,x,y,z); 76例:新娘和新郎例:新娘和新郎问题:问题:三对情侣参加婚礼,三个新郎为三对情侣参加婚礼,三个新郎为A、B、
50、C,三个,三个新娘为新娘为X、Y、Z。有人不知道谁和谁结婚,于是询问了。有人不知道谁和谁结婚,于是询问了其中的三位,听到的回答是这样的:其中的三位,听到的回答是这样的:说他将和结婚;说他将和结婚;说她的未婚夫是;说他将和结婚。说她的未婚夫是;说他将和结婚。这人听后知这人听后知道他们在开玩笑,道他们在开玩笑,全是假话全是假话。请编程找出谁将和谁结婚。请编程找出谁将和谁结婚。问题分析与算法设计:问题分析与算法设计: 设:设:A、B、C三人用三人用1、2、3表示,将表示,将X和和A结婚表示结婚表示为为x=1,将,将Y不与不与A结婚表示为结婚表示为y!=1。则:。则: x!=1 A不与不与X结婚结婚
51、x!=3 X的未婚夫不是的未婚夫不是C z!=3 C不与不与Z结婚结婚题意还隐含:题意还隐含:x!=y 且且 x!=z 且且 y!=z77int main ( ) int x, y, z; for (x=1; x=3; x+) / /* *穷举穷举X的全部可能配偶的全部可能配偶* */ / for (y=1; y=3; y+) / /* *穷举穷举Y的全部可能配偶的全部可能配偶* */ / for (z=1; z0;nm10的整数的整数79int main ( ) int x, y, m, flag; / /* * flag:标志变量:标志变量 * */ / for ( x=0,flag=1;
52、 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、n80int main ( ) int y, m,
53、flag; for ( y=101,flag=1; flag ; y+ ) / /* * 穷举穷举y * */ / for ( m=10; 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、n81int main ( ) int m, n, flag; / /* * flag:标志变量:标志变量 * */ / for ( m=10,flag=1; flag; m+ ) / /* * 通过穷举通过穷举m,直接构造平方数,直接构造
54、平方数y * */ / for ( n=10; n*n 0) printf (“* *”); n-;printf (“n”);86例:输出边长为例:输出边长为 n 的正方型的正方型 例如,输入例如,输入 n=4,输出如下图形:,输出如下图形:* * * * * * * * * * * * * * * * * * * * * * * * * * * * *算法分析与设计:算法分析与设计:1. 输入输入 n ;2. 重复输出重复输出 n行,每行输出行,每行输出 n 个个 * *;加细一:加细一:1. 输入输入 n ;2. for ( i=1; i=n; i+ ) 输出一行中的输出一行中的 n 个个
55、 * * ;87加细二:加细二: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”) ;88l整理,得到程序如下:整理,得到程序如下:int main ( ) int m, i, j; scanf( “%d”, &n ); for ( i=1; i=n; i+ ) / /* * 控制输出控制输出n行行 * */ / for ( j=1; j=n; j+ ) / /* *
56、输出一行中的输出一行中的n个个* *号号* */ / printf(“* *”); printf(“n”); 分析方法分析方法逐步求精法逐步求精法 对于比较复杂问题,不可能一下得到程序,对于比较复杂问题,不可能一下得到程序,可以先将简单的部分明确出来,再逐步对复杂可以先将简单的部分明确出来,再逐步对复杂部分进行细化,一步一步推出完整程序。部分进行细化,一步一步推出完整程序。89例:输出边长为例:输出边长为 n 的平行四边形的平行四边形 例如,输入例如,输入 n=4,输出如下图形:,输出如下图形: * * * * * * * * * * * * * * * * * * * * * * * * *
57、 * * * * * * * 算法分析与设计:算法分析与设计: 在正方型每行在正方型每行* *号的前面先多输出若干个空格。号的前面先多输出若干个空格。对于第对于第 i 行,行,1=i=n,则应先输出,则应先输出 个空格。个空格。 n-i90int main ( ) int n, i, j; scanf( “%d”, &n ); for ( i=1; i=n; i+ ) / /* * 控制输出控制输出 n 行行 * */ / for ( j=1; j=n-i; j+) / /* *控制输出控制输出n-i个空格个空格* */ / printf(“ ”); for ( j=1; j=n; j+ )
58、/ /* *输出一行中的输出一行中的n个个* *号号* */ / printf(“* *”); printf(“n”); 关键在于找出每行要关键在于找出每行要输出的空格和输出的空格和* *的个数的个数91i = 1nj = ii = 1ni + j = n+1* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *j 控制输出控制输出i个个* *j :i-1 个个 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *j
59、:n-i+1 个个* *j :n-i 个个 j :n-i+1个个 * *j :i 个个* *j = n-i+192例:输出例:输出n行用行用* *组成的等腰三角形组成的等腰三角形 例如,输入例如,输入 n=4,输出如下图形:,输出如下图形: * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *j = 1n-i j = 12i-1 * * (“n”)i = 1ni个个* *i-1个个* *93例:输出边长为例:输出边长为n的菱形的菱形 例如,输入例如,输入 n=4,输出如下图形:,输出如下图形: * * * * * * * *
60、 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *j = 1n-i j = 12i-1 * *i = 1nj = 1n-i j = 12i-1 * *i = n-11i = 1 2 3 4 3 2 194例:输出边长为例:输出边长为n的空心菱形的空心菱形 例如,输入例如,输入 n=4,输出如下图形:,输出如下图形: * * * * * * * * * * * * * * * * * * * * * * *j = 1n-i j = 12i-1如果如果j=1或或2i-1 * * 其它其
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 吉林大学《健康教育》2021-2022学年第一学期期末试卷
- 2024苏州商品房买卖合同范本
- 智能家居安防监控系统合同
- 幼儿园护学岗设置与职责规范
- 环保行业:XXX企业环境污染应急预案
- 2024-2025学年高中政治第一单元生活智慧与时代精神第三课第2课时哲学史上的伟大变革练习含解析新人教版必修4
- 2025届高考历史一轮复习课时作业6伟大的抗日战争含解析人民版
- 2024年实验室设备共享与检测协议
- 浙江省杭州市2023-2024学年高一上学期1月期末英语试题 含解析
- 2024年专利使用权转租合同
- 《大学计算机基础(Windows10+Office2016)》试卷213749
- 机械动力学PPT完整全套教学课件
- 粗铜冶炼技改项目可行性研究报告
- 演示文稿意大利埃托索特萨斯
- 结构形态造型
- 温润童心博爱至善
- 04D702-1 常用低压配电设备安装
- 大学生心理健康教育课程说课课件
- 反循环钻孔灌注桩施工方案
- 2023年安徽省投资集团控股有限公司招聘笔试题库及答案解析
- 苏教版三年级上册数学课件第4单元第6课时 三位数除以一位数(首位不够除)
评论
0/150
提交评论