【文档说明】[工学]4_b_循环结构的程序设计.ppt,共(46)页,1.851 MB,由小橙橙上传
转载请保留链接:https://www.ichengzhen.cn/view-2103.html
以下为本文档部分文字说明:
第6章——循环结构的程序设计2数据描述过程描述顺序访问第三章第四、五章解决的问题:当过程中出现选择结构问题时,针对问题的类型,可有三种不同的条件判定方法来描述过程。第3页•循环语句的执行流程•while语句•for语句•do-while语句•掌握简单算法设计•输出
简单图形•穷举法当问题中需要多次使用同一过程时,用循环的方法来描述过程。第4页§6.1循环的概念⚫提出问题提问:从键盘上输入10个整数并求和,怎么编程?回答:在程序中写10个scanf语句,还可以写%d%d...提问:从键盘
上输入500个整数并求和,怎么编程?回答:这个,嗯……???不会让我写500个......换一个角度来看待这些问题,→以上问题的实质是:将scanf函数重复执行N遍。→引出一个概念“循环”--反复地执行同
一段程序第5页§6.1循环概念⚫循环反复执行同一段程序,直到满足一定的条件后才停止执行该段程序。⚫C语言中控制循环的语句:◆while◆for◆do-while第6页§6.2while语句⚫while语句格式while
(表达式)语句;说明:语句可是简单语句,也可是复合语句。⚫while语句的执行流程表达式?执行语句成立不成立执行while循环之后的语句循环控制条件循环体第7页§6.2while语句-实例(数字计算)⚫例C3_5101.C从键盘输入10个整数,求这10个整数之和。c
ount<10?count=count+1成立不成立输出结果total计数器count=0累加器total=0输入numtotal+=num开始结束while(count<10){}count++;scanf("%d"
,&num);total+=num;⚫程序主体第8页§6.2while语句-实例#include<stdio.h>main(){intcount,num,total;/*count:计数器,num:输入的整数*/count=0;total=0;/*total:存放累加和*
/例C3_5101while(count<10)/*循环控制条件*/{count++;/*循环体*/printf("EntertheNo.%d=",count);scanf("%d",&num);total+=num;/*计算累加和*
/}printf("Total=%d\n",total);}第9页§6.2while语句-实例(字符处理)⚫例C3_5103.C:从键盘中读入一系列字符,直到读入字母a时才停止。ch!=’a’?显示ch成立不成立ch=读入一个字符ch=读入下一个
字符开始结束while(ch!=’a’){}ch=getchar();putchar(ch);ch=getchar();⚫分析:由于不知道要读入的字符数量,只知停止条件是读入字母a,则只能将循环控制条件设为ch!='a'。⚫程序主体:第10页§6.2while语句-实例#include
<stdio.h>main(){charch;ch=getchar();while(ch!='a'){putchar(ch);ch=getchar();}}ch!=’a’?显示ch成立不成立ch=读入一个字符ch=读入下一个字符开始结
束第11页§6.2while语句-注意事项⚫while使用注意1.while(0){....}由于循环的条件表达式恒等于0,循环体永远也不会执行,是编程者的错误。2.while(1){....}由于循环的条件表达式恒等于1,所以不可能通过循环控制条件来结束循环体的执行,称为“死循环”。3.为
了保证循环正常运行,应该特别注意:◆循环控制条件◆控制条件的初始状态(初始值)◆循环体内部对控制条件的影响第12页§6.3for语句⚫for语句格式for(表达式1;表达式2;表达式3)语句;⚫for语句的执行流程循环初始条件循环控制条件表达
式2?执行语句成立不成立执行for循环之后的语句执行表达式3执行表达式1循环体for语句等价于下列语句:表达式1;while(表达式2){语句;表达式3;}第13页§6.3for语句-实例(数字计算)⚫例C3_5
203.C:求1到10的阶乘。递推公式:n!=1当n=1时n!=(n-1)!*n当n>1时#include<stdio.h>main(){longintn=1;inti;for(i=1;i<=10;i++){n=n*i;/*求N!*/printf("%2d!=%ld\n",i,n);}}
例C3_5203⚫for语句最常用的形式for(初值;控制条件;增量)语句;第14页§6.3for语句-实例⚫语句中的逗号(,)运算逗号(,)运算常见的三种用途是:1.在变量说明表中用来分隔变量,起分隔符的作用。如:inti,j,k,m[3],*p;2.
在函数的参数表中分隔参数。如:printf("n=%d,x=%d\n",n,x);3.在语句中使用。其形式是:表达式n1,表达式n2;用逗号分隔开的表达式从左到右进行计算,结果的类型和值是最右边表达式的类型和值。第15页§6.3for语句-实例(符号处理
)⚫例C3_5205.C:用逗号运算输出下列字符串。azbycxdwevfugthsirjqkplomn分析:奇数位上的字符从'a'开始逐次递增,偶数位上的字符从'z'开始逐次递减#include<stdio.h>main(){chari,j;/*i
:奇位字符j:偶位字符*//*i从’a’开始逐次递增,j从’z’开始逐次递减*/for(i='a',j='z';i<j;i++,j--)printf(”%c%c”,i,j);/*输出两个字符*/printf("\n");}例C3
_5205第16页§6.3for语句–注意事项⚫for语句的变化形式for语句中的三个表达式中的任意一个都是可以省略的(在语法上被接受),但是逻辑不合理。1.省略表达式2,则:for(表达式1;;表达式3)就形成了一个死循环。2.省略表达式1和表达式3,则:f
or(;表达式2;)等同于:while(表达式)据此结论:所有用while语句实现的循环都可以用for语句实现。3.表达式1、2、3全省略,则:for(;;)等同于:while(1)第17页§6.4do-while语
句⚫do-while语句格式do语句while(表达式);⚫do-while语句的执行流程表达式?执行语句成立不成立执行while子句之后的语句循环控制条件循环体第18页§6.4do-while语句-实
例–数字计算⚫例C3_5301.C:输入一个>=0的整数,要求以相反的顺序输出该数。例如:输入12345,则输出为54321。基本思路:可以从个位开始,按位输出整数的每一位main(){unsigned
intnumber;printf("Inputthenumber:");scanf("%d",&number);do{printf("%d",number%10);number/=10;/*number缩小10倍*/}while(number!=0);}例C3_5301思考:使用while
或for语句,如何实现?例C3_53011两个程序有何区别?前面的程序可以处理数字0,后面的程序不能处理第19页§6.4do-while语句-实例–符号处理⚫例C3_5302.C从键盘输入任意的字符,按下列规则进行分类计数。第一类’0’,’1’,’2’,’3’,’
4’,’5’,’6’,’7’,’8’,’9’第二类’+’,’-’,’*’,’/’,’%’,’=’第三类其它字符当输入字符’\’时先计数然后停止接收输入。第20页§6.4do-while语句-实例main(){intclass1=0,class2=0,class3=0;ch
arch;do{putchar(ch=getch());/*函数的嵌套调用*/switch(ch){case’0’:case’1’:case’2’:case’3’:case’4’:case’5’:ca
se’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,class2=%d,class3=%d\n",class1,class2,class3);}例C3_5302第21页§6.4do-while语句
–注意事项⚫do-while语句特点do-while与while和for的最大区别:do-while语句先执行循环体然后再判断循环控制条件,而while和for却是先判断条件之后再执行循环体。使用do-whil
e构成的循环,循环体部分至少要执行一次;而采用while和for构成的循环,循环体部分有可能一次也不会执行。第22页§6.5循环语句小结⚫C语言提供三种循环:for、while、do-while:1、fo
r和while先判断循环条件后执行循环体,do-while语句先执行循环体后判断循环条件。2、while和do-while语句的条件表达式只有1个;for语句有3个表达式,表达式2是条件表达式。3、while、do-while、for可以相互替换使用。4、w
hile语句多用于不需要赋初值的或循环次数不定的情况。for语句多用于要赋初值或循环次数固定的情况。do-while语句多用于至少要运行一次的循环。5、循环语句可以嵌套,可以并列,但不能交叉。第23页§6
.5循环语句小结⚫为了保证循环体正常运行,应该特别注意:◆循环控制条件◆控制条件的初始状态(初始值)◆循环体内部对控制条件的影响以上三个方面相互配合,相互影响,共同完成循环控制第24页循环中的常见算法问题1-循环与递推⚫例C3_5204.C:草原上有一对小兔子,它们刚出
生后的第1个月就会逐步长大,到了第2个月末就生出一对小兔子。第3个月大兔子会继续生一对小兔子,而第2个月出生的小兔子会逐步长大。第4个月时,第1月出生的兔子继续生育,第2月出生的小兔子也可以生育一对小兔子了,第3月出生的小兔子则逐步长大……假设这些草原的兔子非常长寿,可以
认为它们不会死亡。请建立数学模型,计算第N个月时,草原上将会有多少对兔子?第25页循环与递推⚫例C3_5204.C:数列1、1、2、3、5、8、13、21、…是著名的菲波那奇数列,其递推通项公式为:U1=U2=1Un=Un-1+Un-2(
n>=3)为求出第N项的值,请编写程序。根据递推通项公式,可用递推法编写程序,计算第N项的值。⚫递推法:由初始的已知条件开始,先计算出第(N-1)步的结果,再利用前面已知的(N-1)项结果,按照递推公式(或遵照递推规则),推出第N步结果。递推法是程序设计中最常用的方法之一,使用递推法必
须有明确的递推初始值和递推规则(递推公式)。第26页循环与递推⚫例C3_5204.C程序un=un_1=1;for(i=3;i<=n;i++){un_2=un_1;un_1=un;un=un_2+un_1;}i<=n?向前传递前两项un_2=un_1un_1=u
n成立不成立初始化:un=un_1=1计算un=un_2+un_1递推项:i=3i++数列对应关系:un_2,un_1,un递推计算第27页循环与递推⚫例C3_5204.C程序#include<stdi
o.h>main(){intn,i,un_2,un_1,un;for(;;){printf("Inputn=?");scanf("%d",&n);if(n>=3)break;/*退出for循环*/elsepr
intf("\nInputniserror!\n");}/*控制输入正确的N值*/un=un_1=1;/*设置递推初始值*/for(i=3;i<=n;i++)/*用递推法计算第N项的值*/{un_2=un_1;un_1=un;un=un_2+un_1;}printf("No.%dis%d\n
",n,un);}例C3_5204循环中的常见算法问题2-循环的嵌套在一个循环结构的循环体中又包含了另一个循环结构,称为循环的嵌套。嵌套形式多种多样,可嵌套任意的一个或多个循环。x=1while(x<=9){for(i=1;i<=9;i++)printf(“
%5d”,x*i);x++;printf(“\n”);}for(i=1;i<=9;i++){for(j=1;j<=9;j++)printf(“%5d”,i*j);printf(“\n”);}for(i=1;i<=9;i++){j=1
;do{printf(“%5d”,i*j);j++;}while(j<10);printf(“\n”);}注意大括号{}的使用{}不要可以吗?循环的嵌套-结构规则外循环内循环交叉循环外循环入口内循环出口内循环出口外循环出口如:打印乘法九九表外循
环出口1.在嵌套的循环中外循环与内循环变量不可同名。2.外循环与内循环不可交叉。第30页循环的嵌套-实例⚫循环嵌套在循环体中,又包含有循环语句,构成循环嵌套。例C3_5107.C:输出下三角形乘法九九表。123456789------------------------------
---------12436948121651015202561218243036714212835424981624324048566491827364554637281假设:行号为i,列号为ji=6j=5i*j(1<=i<=9)(1<
=j<=i)则:第i行中一共要输出i个乘积第31页循环的嵌套-实例#include<stdio.h>main(){inti=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);j++;/*列计数器+1
*/}printf("\n");/*一行输出结束后,输出\n*/i++;/*行计数器+1*/}}例C3_5107外层循环体执行1次,内层循环要完整执行1次第32页循环的嵌套-for语句-实例⚫例C3_5202.C:用for语句实现打印乘法九九表。#
include<stdio.h>main(){inti,j;for(i=1;i<10;i++)printf("%4d",i);/*打印表头*/printf("\n-----------------------------------\n");
for(i=1;i<10;i++)/*控制打印表体*/for(j=1;j<=i;j++)printf((j==i)?"%4d\n":"%4d",i*j);}例C3_5202⚫输出函数printf中使用了“?”操作,含义
相当于:if(j==i)printf("%4d\n",i*j);elseprintf("%4d",i*j);第33页§6.6转移语句⚫转移语句的作用改变程序的运行流程。⚫C语言转移语句◆break◆continue◆goto◆return第34页§6.6.1break语句⚫格式break;
⚫break语句的功能1.在switch语句中结束case子句,使控制转到switch语句之外。2.在循环语句的循环体中使用,结束循环过程,使控制转移到整个循环语句之外的下一条语句处。第35页表达式2?成立不成立执行后续语句执行表达式
3执行表达式1§6..1break语句⚫break语句的执行流程表达式?成立不成立执行后续语句breakbreak表达式?成立不成立执行后续语句breakwhile语句for语句do-while语句第36页§6.6.1break语句-实例⚫例C3_6101.C:求给定整数的约数中最大的三位
数?main(){intj;longn;printf("Pleaseinputnumber:");scanf("%ld",&n);/*所求的约数的可能取值是从999到100,j从大到小*/for(j=999;j>=100;j--)if(n%j==0)/*若能够整除j,则j是
约数*/{printf(”3digitsin%ld=%d\n”,n,j);break;/*控制退出循环*/}}例C3_6101第37页§6.6.1break语句-实例⚫break语句使用注意:1、在嵌套循环中,break语句仅能退出一层(当前层)循环。2、若
在循环语句中包含了switch语句,那么switch语句中的break语句仅能使控制退出switch语句。3、break语句并不是程序设计中必不可少的语句,可以通过改变程序的结构去掉。第38页§6.6.2continue语句⚫continue语句格式
continue;⚫continue语句的功能continue语句仅能在循环语句中使用.它的作用不是结束循环,而是开始一次新的循环。对于for语句,将控制转到执行表达式3和条件测试部分;对于while和do-while语句,将控制转到条件测试部分;从逻辑上讲,改
变if语句的条件表达式所表示的条件,就可以不需要使用continue语句。第39页§6.6.2continue语句⚫continue语句的执行流程表达式2?continue成立不成立执行后续语句执行表达式3执行表达式1表达式?continue
成立不成立执行后续语句表达式?continue成立不成立执行后续语句while语句for语句do-while语句第40页§6.6.2continue语句-实例⚫例C3_6201.C:输入10个整数,求其中正数的个数及平均值,
精确到小数点后两位。main(){inti,count=0,j,sum=0;for(i=1;i<=10;i++){printf("Inputinteger:");scanf("%d",&j);if(j<=0)continue;/*结束本次循环,不进行后续操
作*/count++;/*计数器*/sum+=j;/*求累加和*/}if(count>0)printf("Plusnumer:%d,averagevalue:%.2f",count,1.0*sum/count);
elseprintf("Plusnumer:0,averagevalue:0");}例C3_6201改变if语句的条件表达式,可以不需要使用continue。第41页§6.6.3goto语句⚫goto语句格式goto标号;⚫goto语句的功能1、将控制转移到标号所指定的语句处继续
执行。2、标号的唯一功能就是作为goto语句的目标。标号的作用域是它所在的整个函数。⚫goto语句的使用说明在C语言中,goto语句并不是必不可少的,使用goto语句的地方都可以用C的其它控制流程语句改写。第45页§6.
6.4return语句⚫return语句格式格式一:return;格式二:return(表达式);⚫return语句的功能1.return语句使程序从被调用函数中返回到调用函数的调用处继续运行。2.如果return后跟一表达式,则该表达式的值会从被调用函数中带回到调用它的函数
,称为返回值。循环程序设计⚫循环程序的实现要点:◆归纳出哪些操作需要反复执行?循环体◆这些操作在什么情况下重复执行?循环条件⚫选用合适的循环语句forwhiledo-while⚫循环具体实现时考虑(循环条件):◆事先给定循环次数,首选for◆
通过其他条件控制循环,考虑while或do-while#include<stdio.h>intmain(void){inti,mark,max,n;printf("Entern:");scanf("%d",&n);printf("Enter%dmarks:",n
);scanf("%d",&mark);/*读入第一个成绩*/max=mark;/*假设第一个成绩是最高分*/for(i=1;i<n;i++){scanf("%d",&mark);if(max<mark)max=mark;}printf("Max=%d\n",max);ret
urn0;}例4-7输入一批学生的成绩,求最高分(for)markmaxmaxmarkEntern:5Enter5maks:6788735482Max=88Entern:0#include<stdio.h>intmain(void)
{intmark,max;printf(“Entermarks:");scanf("%d",&mark);/*读入第一个成绩*/max=mark;/*假设第一个成绩最高分*/while(mark>=0){if(max<mark
)max=mark;scanf("%d",&mark);};printf("Max=%d\n",max);return0;}例4-7输入一批学生的成绩,求最高分(while)Entermarks:6788735482-1Max=88Enterm
arks:-1#include<stdio.h>intmain(void){intmark,max;max=-1;/*给max赋一个小初值*/printf(“Entermarks:");do{scanf("%d",&ma
rk);if(max<mark)max=mark;}while(mark>=0);printf("Max=%d\n",max);}例4-7输入一批学生的成绩,求最高分(do-while)Entermarks:67887
35482-1Max=88Entermarks:-1