语言实用教程课件章程序流程控制_第1页
语言实用教程课件章程序流程控制_第2页
语言实用教程课件章程序流程控制_第3页
语言实用教程课件章程序流程控制_第4页
语言实用教程课件章程序流程控制_第5页
已阅读5页,还剩48页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第4章程序流程控制

程序设计是计算机科学的一个核心问题,主要还是靠人完成。结构化程序设计方法是面向过程程序设计的基本方法,C语言是一种结构化的程序设计语言,它提供了完善的结构化程序设计的各种控制结构。结构化程序设计三原则1.

使用三种基本控制结构(顺序、选择、循环)2.

采用自顶向下、逐步求精的模块化程序设计方法3.

限制goto语句的使用

S1S2顺序结构S1

S2条件选择结构循环结构条件S14.1结构化程序设计的概念4.2选择结构程序设计C语言支持的选择结构:

1.if语句

2.

条件表达式

3.switch语句形式1:单分支选择

if(测试表达式)

语句1;≠0=0测试表达式语句1【例】猜数游戏:若用户猜对了,屏幕显示“**Right**”,然后结束程序运行。#include<stdio.h>voidmain(){intmagic=123;intguess;printf("Enteryourguess:");scanf("%d",&guess);if(guess==magic)printf("**Right**\n");}4.2.1if语句1.if语句的形式和功能形式2:二分支选择

if(测试表达式)

语句1;

else

语句2;语句2≠0=0语句1测试表达式【例】猜数游戏:若用户猜对了,屏幕显示“**Right**”;否则,显示“**Wrong**”。

#include<stdio.h>voidmain(){intmagic=123,guess;printf("Enteryourguess:");scanf("%d",&guess);if(guess==magic)printf("**Right**\n");elseprintf("**Wrong**\n");}形式3:多分支选择

if(测试表达式1)

语句1;elseif(测试表达式2)

语句2;elseif(测试表达式3)

语句3;……elseif(测试表达式n)

语句n;else

语句n+1;≠0=0=0≠0≠0≠0=0=0测试表达式1

语句1测试表达式2测试表达式3测试表达式n

语句2语句3语句n语句n+1【例】猜数游戏:若用户猜对了,屏幕显“**Right**”;否则,将提示用户是猜大了,还是猜小了。

#include<stdio.h>voidmain(){intmagic=123,guess;printf("Enteryourguess:");scanf("%d",&guess);if(guess==magic)printf("**Right**\n");elseif(guess>magic)printf("yourguessistoolarge!\n");elseprintf("yourguessistoosmall!\n");}if(a==2)printf("%d",a);elseprintf(“%d\n”,b);if(a=2)printf("%d\n",a);elseprintf(“%d\n”,b);PK认识几种常见的测试表达式的写法:if(a-2)printf("%d",a)if(a!=2)printf(“%d”,a)if(!a)printf(“%d”,a)if(a==0)printf(“%d”,a)if(a)printf(“%d”,a)if(a!=0)printf(“%d”,a)PKif语句的使用说明:(1)if语句中测试表达式的书写非常灵活,初学者要引起足够的重视。if(a>b)

{t=a;a=b;b=t;}printf("a=%d,b=%d",a,b);if(a>b)t=a;a=b;b=t;printf("a=%d,b=%d",a,b);PK(2)if语句中出现复合语句时,一定要用花括号括住,写成

if(测试表达式){语句序列1}else{语句序列2}if语句的嵌套(1)内层if既可以嵌套在外层的if块中,也可以嵌套在外层的else块中,其形式为:

if(测试表达式1){……if(测试表达式2)……else……}else{……if(测试表达式3)……else……}(2)else和if的配对关系:else总是与离自己最近的不带else的if配对,而与书写格式无关。if(a<b)

{if(b<c)c=a;}elsec=b;if(a<b)if(b<c)c=a;elsec=b;PK=0=0=0=0≠0≠0≠0≠0

输入x,y单位圆上单位圆内X轴下方X轴上X轴上方

打印结果y=0x2+y2≤1x2+y2=1y≥0#include<stdio.h>voidmain(){floatx,y,z;scanf("%f%f",&x,&y);z=x*x+y*y;printf("%.2f,%.2f\t",x,y);if(z<=1)if(z==1)printf("在单位圆上\n");elseprintf("在单位圆内\n");elseif(y>=0)if(y>0)printf("在单位圆外,x轴上方\n");elseprintf("在单位圆外,x轴上\n");elseprintf("在单位圆外,x轴下方\n");}【例】在直角坐标系中有一个以原点为中心的单位圆,今任给一点(x,y),试判断该点是在单位圆内、单位圆上,还是单位圆外?若在单位圆外,那么是在x轴的上方,在x轴上,还是在x轴的下方?上例可改写为if-elseif-else语句构成多分支选择结构。#include<stdio.h>voidmain(){floatx,y,z;scanf("%f%f",&x,&y);z=x*x+y*y;printf("%.2f,%.2f\t",x,y);if(z==1)printf("在单位圆上\n");elseif(z<1) printf("在单位圆内\n");else if(y>0)printf(“在单位圆外,x轴上方\n");elseif(y==0)printf("在单位圆外,x轴上\n");elseprintf("在单位圆外,x轴下方\n");}exp3≠0=0exp2exp1【例】inta,b,c;scanf(“%d%d”,&a,&b);c=a>b?a:b;printf(“%d\n”,c);4.2.2条件表达式1.条件运算符和条件表达式条件运算符?://三元运算符条件表达式exp1?exp2:exp3结合性为从右至左exp1?exp2:exp3?exp4:exp5c=((a>b)?a:b)c=a>b?a:bexp1?exp2:(exp3?exp4:exp5)exp1?exp2?exp3:exp4:exp5exp1?(exp2?exp3:exp4):exp5小贴士最右边的“?”总是与紧靠其右的“:”匹配2.条件运算符的优先级和结合性优先级仅高于赋值运算符和逗号运算符,低于其他运算符。3.条件表达式的使用条件表达式常用在赋值语句中代替if-else语句。【例】从键盘接收一个字符存放在变量c中。要求只把输入的小写字母转换成大写字母,其他字符不变,并显示是输入了小写字母还是其他字符。

#include<stdio.h>voidmain(){charch,c;scanf("%c",&ch);printf("%c\n",c);c=ch>='a'&&ch<='z'?ch-32:ch;printf(ch>='a'&&ch<='z'?"Lowercasechracter":"Otherchracter");}4.2.3switch语句和break语句switch用于多分支选择,比if-elseif-else语句易读、可使程序更加简明。

switch不能完全取代if-elseif-else;

switch常与break联用。switch(e){casec1:语句1;casec2:语句2;…….casecn:语句n;[default:语句n+1;]}//e是整型变量或表达式//c1~cn是整型常量或常量表达式defaulte=cne=c1e=c2计算表达式e语句1语句2语句n语句n+11.switch语句程序运行时,①若输入字母“a”,输出?②若输入字母“x”,输出?【例4.6】从键盘输入不同的字母,显示不同的国家名称。

#include<stdio.h>voidmain(){charch;ch=getchar();switch(ch){case'a':printf("America\n");case'b':printf("Britain\n");case'c':printf("China\n");case'd':printf("Denmark\n");default:printf("Japan\n");}}defaulte=cne=c1e=c2计算表达式e语句1语句2语句n语句n+1break与switch联用,强迫控制立即退出switch。①防止从一个case下落到另一个case中;②防止因case和default位置的改变而影响程序的运行结果。2.break语句【例】

在例4.6程序中加入break。#include<stdio.h>main(){charch;ch=getchar();switch(ch){case'a':printf("America\n");break;case'b':printf("Britain\n");break;case'c':printf("China\n");break;case'd':printf("Denmark\n");break;default:printf("Japan\n");break;}}程序运行时,①若输入字母“a”,输出?②若输入字母“x”,输出?switch(ch){case'0':case'1':case'2':case'3':case'4':case'5':case'6':case'7':case'8':case'9':digit++;break;case'':case'\n':case'\t':white++;break;default:character++;break;}①

每个case中的常量或常量表达式的值应互不相同,否则会出现矛盾的结果。②如果每个case和default中都有break语句,那么,case和default出现的次序不会影响程序的运行结果。③允许多个case共用一个语句序列。3.switch和break语句的使用④

字符常数出现在case中,它们会自动转换成整型。⑤

switch可以嵌套使用,要求内层的switch必须完全包含在外层的某个case中,允许内、外层switch的case中含有相同的常数,不会引起误会。如

switch(x){case1:switch(y){case0:printf("dividedbyzero");break;case1:printf("Itisright");break;}case2:……}⑥

switch只能进行相等性检查,而if不但可进行相等性检查,还可以计算关系或逻辑表达式。因此,switch不能完全替代if。#include<stdio.h>main(){inta,b,c,t;scanf("%d%d%d",&a,&b,&c);printf(“初始序列:a=%db=%dc=%d\n",a,b,c);if(a<b) {t=a;a=b;b=t;}if(c<b)printf(“排序后:a=%db=%dc=%d\n",a,b,c);elseif(c<a) {t=b;b=c;c=t; printf("排序后:a=%db=%dc=%d\n",a,b,c);} else {t=a;a=c;c=b;b=t; printf("排序后:a=%db=%dc=%d\n",a,b,c);}}【例】

从键盘输入三个数,然后按从大到小输出。4.3循环结构

循环结构用来进行有规律性的重复运算,可以大大缩短程序的长度。C语言支持的循环结构:for循环(步长型循环)

while循环(当型循环)

do-while循环(直到型循环)1.for语句的一般格式

for(表达式1;表达式2;表达式3)

语句;for(i=1;i<10;i+=2)printf("%d",i);

2.for语句的执行流程计算表达式1≠0循环体计算表达式3=0

计算表达式24.3.1for语句【例】

将50以内的奇数在屏幕上显示出来的程序。

#include<stdio.h>voidmain(){inti;for(i=1;i<50;i+=2)printf("%d",i);//循环体

printf("\n");}①for语句是先判断后执行。就是说,如果开始时循环条件不成立,循环体一次也不被执行。例如程序段

x=10;for(y=10;y!=x;++y)printf("%d",y);中的循环体不被执行。②可用逗号表达式实现两个或多个循环控制变量。例如,语句

for(i=0,j=1;j<n&&i<n;i++,j++)printf("%d",i+j);中,初始化部分和增值部分有两个变量,它们同时控制循环。这种形式经常用在数组和字符串的操作中。3.for语句的使用注意事项③三个表达式可以放在for语句外部。

for(i=1;i<=5;i++)printf("%d",i);

i=1;for(;i<=5;i++)printf("%d",i);i=1for(;i<5;){printf("%d",i);

i++;}

i=1for(;;){printf("%d",i);

i++;

if(i>5)break;}④循环体可以是空语句。

for(i=0;i<1000;++i);这个程序的功能是延迟一小段时间,这一小段时间用来计算循环变量的值和判断循环是否终止。⑤注意防止出现“死循环”。无休止的循环称为“死循环”。例如

main(){intx=10;for(;x<=10;x--)printf(“%d”,++x);}

该程序会输出无数个“11”而不能正常终止。#include<stdio.h>voidmain(){inti,n,p;scanf("%d",&n);p=1;for(i=2;i<=n;i++)p=p*i;printf("%d%d\n",n,p);}【例】编制一个求n!的程序,n的值由键盘输入。≠0=0

测试表达式循环体4.3.2while语句2.while语句的执行流程【例】显示50以内的奇数。#include<stdio.h>voidmain(){inti=1;//提前给i赋值

while(i<50){printf("%d",i);i+=2;//修改i的值

}printf("\n");}1.while语句的一般格式:

while(测试表达式)

语句;用for循环实现。#include<stdio.h>voidmain(){inti,s=0;for(i=1;i<=100;i++)s+=i;printf(“s=%d\n",s);}【例】求s=1+2+3+…+100。

#include<stdio.h>voidmain(){inti,s;i=1;s=0;while(i<=100){s+=i;i++;}printf(“s=%d\n",s);}①while语句相当于下面形式的for语句:

for(;测试表达式;)②和for语句一样,while也是先判断后执行。比如,程序段

i=3;while(i<3)printf("i=%d",i);中的循环体将不被执行。3.while语句的使用③while语句的循环体可以是空语句。如

while((ch=getchar())!='A');它与下面的程序段功能相同:

for(;;){ch=getchar();if(ch=='A')break;}这个程序段也可以编写成

while(1){ch=getchar();if(ch==’A’)break;}④while语句本身不具有给循环变量赋初值及修改循环变量值的功能,因此应注意在while语句之前给循环变量赋初值,在循环体内修改循环变量的值,防止出现死循环。【例】自然常数e的计算公式为请编制程序计算e的近似值,要求被舍弃的首项<0.000001。#include<math.h>#include<stdio.h>voidmain(){intn=1;floate=0,t=1.0;while(fabs(t)>=1E-6){e=e+t;t=t/n;n++;}printf("e=%f\n",e);}4.3.3do-while语句循环体≠0=0

测试表达式2.do-while语句的执行流程【例】显示50以内的奇数。#include<stdio.h>voidmain(){inti=1;//提前给i赋值

do{printf("%d",i);i+=2;//修改i的值

}while(i<50);printf("\n");}1.do-while语句的一般格式

do

{

语句;}while(测试表达式);#include<stdio.h>voidmain(){intx,c;printf("Inputaninteger:");scanf("%d",&x);do{c=x%10;printf("%d",c);}while((x/=10)!=0);printf("\n");}【例】从键盘输入一个整数,把这个整数中的各位数字反序显示出来。例如,输入为1234,则输出为4321。4.3.4循环的嵌套

循环的嵌套是指一个循环的循环体中包含了另一个或几个循环,也称多重循环。1.一个二重循环的例子【例】打印九九乘法表。

#include<stdio.h>voidmain(){inti,j;for(i=1;i<=9;i++){for(j=1;j<=9;j++)printf("%d*%d=%2d",i,j,i*j);printf("\n");}}

请思考,如果要输出如下图所示的左下三角形九九乘法表,应如何修改程序?若要输出右上三角形或右下三角形九九乘法表,又应如何实现?

2.嵌套循环的使用①内层循环必须完全包含在外层循环中,二者不能使用相同的循环变量,不能出现交叉。②循环嵌套的层数没有限制,但层数太多,可读性变差。

③为了使嵌套的层次关系清晰明了,建议采用缩排格式书写程序。

【例】用迭代法求正数x(2~100)的平方根。迭代公式为:,要求迭代精度为0.00001。#include<math.h>#include<stdio.h>voidmain(){floatx,x0,x1;for(x=2;x<=100;x++){x0=x/2;x1=(x0+x/x0)/2;do{x0=x1;x1=(x0+x/x0)/2;}while(fabs(x1-x0)>=1e-5);printf("%.0f%f\n",x,x1);}}

所谓迭代,就是从初始值x0出发,用迭代公式计算x1,当|x1-x0|<ε时(ε称为迭代精度),迭代收敛,x1就是所求的根;否则,用x1替换x0,继续使用迭代公式,计算新的x1。4.4转移控制语句C语言提供的转移控制语句:

break可用在switch和循环结构中,强行结束switch或循环。

continue

只用在循环结构中,提前进入下一轮循环。

goto

无条件转移到指定的位置。

return

只用在子函数中,将控制返回调用段。

exit()<stdlib.h>提供的控制转移函数,强行控制程序运行结束。4.4.1break语句break语句有两种用途。一种是用在switch中,强行控制立即退出switch,第二种是用在循环中,强行控制立即退出循环。【例】break语句的应用示例。

#include<stdio.h>voidmain(){intt;for(t=0;t<100;t++){printf("%d",t);if(t==10)break;}}for(...){...switch(a){case1:...

break;case2:...}...}break的使用

1.break用在switch中,只强行退出该switch而不影响switch所在的任何循环。例如for(...){...while(...){...if(...)break;do

{...

if(…)break;}while(...);...}...

}

不能期望用break从最内层循环一下子退出最外层循环(可以用goto实现)。2.break用在循环中,只能退出它所在的那一层循环,即for(...){...if(...){...continue;}...}4.4.2continue语句

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论