语句与控制流课件_第1页
语句与控制流课件_第2页
语句与控制流课件_第3页
语句与控制流课件_第4页
语句与控制流课件_第5页
已阅读5页,还剩52页未读 继续免费阅读

下载本文档

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

文档简介

第三章句与控制流

内容提要:

C句的分句分表

空句与合句空句与合句

条件分支句条件分支句

循控制句与嵌套循控制句

行流程强制移程序示例

程常用技巧流程强制移

第三章句与控制流

C言是一很好的构化程序

言,它提供了比FCRIRW、P/SCLE更丰

富的流程控制句,提供了将多个

句合成一个句的合句

C句的分

T函数用句函数用加分号构成

表达式句表达式加分勺构成

句空句只有一个分号的句

合句花括号括起来的句

分if()~else~条件分支句

流支

svitch多分支句

程移

控break,continue,return,goto无条件移句

制vhi1e()~当循

句do~\^hi1e()直到型循

for()~for循

号句以上句添加号,构成号句,

C句的分

函数用句函数用加分号构成

定:叙述捷方便,-

分凡以后在法形式中出的‘

句'一,均指以上表中的各旬

循句◎

for()for循

号句以上句添加号,构成号句,

一、空句与合句

空句:只有一个分号的句,属于不行任

何操作的句。

掉入字符流中的空白、回行和制表符的

句。循体是一个空句:

vhi1e((c=getchar())=''IIc='\n'IIc='\t')

算字符串的度句,其循体是一个空句:

for(i=0;a[i]!='\0';i++);

合句:在程序中用大括号括起来的若干

句成合句。一般形式:

•行句可以是

数据明部分;句、构造句,

可以是合句°

行句部分;•在合句内部定

的量,其作用域

限于合句的

内部;

t.LFinwiiase»0第二—早35c

例[1]:比a,b的大小,且把大者量X,小的

量y,并打印°

#incltide<stdio.h>

voidnain(){

inta,b,x,y;

a=2;b=3;运行果:

if(a>b){

x=a;y43;x=3y=2

)

else{

x4;y=a;

printf("x=%ly=%i\n,x,y);

画@1431,LILcrip;自

二、条件句(if)

1.两基本形式:

基本形式1:

if(表达式)句1

基本形式2:

if(表达式)句1

例[2]:比a,b的大小,且把大者量x,小

的量y,并打印°

#include<stdio.h>

voidnain(){

inta,b,x,y;a=2;b=3;

if(a>b){

x=a;y=b;运行果:

)x=3y=2

else{

x=b;y=a;

}

printf("x=%ly=%i\n,x,y);

2.if句的嵌套

(1)在基本形式1的else后的句2位置

嵌套基本形式1句°

if(表达式1)句1基本形式i:

if(表达式)句1

elseif(表达式2)句2

else句2

基本形式2:

if(表达式)句1

elseif(表达式n)句n

else句n+1;

2.if句的嵌套

(2)在基本形式1的句1位置嵌套基本

形式1。

if(表达式1)基本形式1:

if(表达式)句1

if(表达式2)

else句2

if(表达式2)句1基本形式2:

else句2if(表达式)句1

else句3

else句4

2.if句的嵌套

(3)在基本形式1的句1位置嵌套基本形式2

if(表达式1)基本形式1:

if(表达式)句1

if(表达式2)句1else句2

else句2基本形式2:

if(表达式)句1

else究竟与哪一个if配?

基本形式1:if(表达式)句1else句2

基本形式2:if(表达式)句1

注意:

•法定else是与它前面最接近的没

有配的if配;

・入if句后,不管其嵌套有多

最多只行其中的一个句°

例[3]:根据学生的考分,来判断划分成的

'良'及格和不及格,分用5,4,3,2来

表示,且按如下划分:100955

94804

79603

5902

完整的源程序如下:

t.LFinwiiaseA第三章

voidnain(){

intsnuniscore;chargrade;

scanf("%1%1",&snim)&core);

if(score>94)

•分的形式,

grade='5';便于,便于°

elseif(score>79)

•else是与它前面最接

grade=4,;

近的没有配的if配

elseif(score>59)

grade=3,;•入if句后至多行

其中的一个句,即使嵌

else

套形式也不例外;

grade=2,;

printf("%i9fe\nsnumgrade);

us.|;(

1)(

三、多分之句(switch)

svdtch句形式:功能:根据表

svitch(表达式){达式的是否

与某常量表达

case常量表达式1:句1式i相同,来

case常量表达式2:句2行若干

句中的一个

句或一个句

序列。若要真

case常量表达式n:句n正起到多分支

[default:句n+1行功能

,配合使用

break句

真正能起到多分支行功能的形式:

s\Aitch(表达式){

case常量表达式1:句1;break;

case常量表达式2:句2;break;

case常量表达式n:句n;break;

[defalt:句n+1]

}break句用于JLEswitch

句的行,跳出switch相

明:

svitch(表达式){❶表达式和常量表达式i要求是

case常量表达式1:整形或字符形,且两者型相

句1;break;同;

case常量表达式2:❷常量表达式i的必互不相

同,它只起相当于句入口

句2;break;

号的作用,没有条件判断分

支行的功能;

case常量表达式n:

❸行若常量表达式i的与

句n;break;

表达式相等,就序行其后

[defalt:

的句,否行defalt后

句n+1]

的句n+1;

>0第二-早-sfe

,^入:A

voidnain(){出:gracje>g5

chargrade;grade>75

scanf("9fe",tirade);grade>60

switch(grade){grade<60

case'A:printf("grade>85\n");err°r・

case'B':printf("grade>75\n");

case'C':printf("grade>60\n");

case':printf("grade<60\n");

default:printf("error!");

t.LFinwiiase>0第二-早-sfe

❹若要真正起到多分支判断行功能,

在其后加break句°

voidnain(){入:A

chargrade;出:grade>85

scanf("9fc",tirade);

svdtch(grade){

case'A:printf(grade>85\n");break;

case'B':printf(grade>75\n");break;

case'C':printf(grade>60\n");break;

case'El:printf(grade<60\n");break;

default:printf(error!"):

IL

bqjla®u«@mHe电濡【口且

0—.sfc

t.LFinwiiase»第二早

❺多个case可以共用一行句

voidmin(){.

入:A

chargrade;口

&出Hl:grade>o8c5

scanf("%",(%rade);

swtch(grade){

case'A:

case'B1:

case'C1:printf("grade>60\n");break;

case']J:printf("grade<60\n");break;

defaultprintf("error!");

翳出

IJ“%」£[.i

例同模袖珍算器的加成乘除四运算程,

入数据,并按算式算果

voidmin(){

doublex,y;charoperate;

scanf("%f",&c);

vdhi1e((operate=getchar())[='='){

scanf("%f",;

swtch(operate){

case'+':x+=y;break;

case'-':x-=y;break;

case':x*=y;break;

case'/':x/=y;break;

})□人

printf("7£\n',x);10.8+0.13*10=

口出:109.300000

voidnnin(){:若去掉break

doublex,y;句行果将如何?

charoperate;

scanf("%f",&c);

vhi1e((operate^etchar())!=’='){

scanf("%f",;

swtch(operate){

case'+':x+=y;break;

case1-':x-=y;break;

case':x*=y;break;

case'/':x/=y;break;

}}□人:

}—^0rO10

---us

bqi由®UBLJ%bi.c-Tiui

voidmin(){

doublex,y;charoperate;

scanBH□rr/l£"c

vJhi11明三个:

sc;1)S\Mtch句的用;

S3

2)数据的入与取数据技巧(入

冲区概念);

3)程序的运算是一步步行的,相

当于算器,没有运算符先

理功能。

printf(%\n",x);

四、循句

(1)当循(Wiile句)

vhi1e(表达式)句

特点:先判断后行,它

循体可能一次也不

行。通常用于事先不能确

定循次数的情况。

例[5]求£"。源程序如下:

n-1

#include<stdio.h>循控制量:在表达式中出

voidnain(){的量称循控制量°

inti,sum=0;必注意的几个:

i=1;A①循控制量必有正确

\4iile(i<=100){的初;

②在循体内有改其

句;

③其的改使得表达式

printf("%1\n",sun^;的最向于零(循束

条件),否将形成死循°

100

例[]求£〃。源程序如下:

5口出口果旦5050

n-1

#include<stdio.h>

►-注意:循体如果包

voidmin(){

含一个以上的句,

inti,sumO;

用花括号括起来

i=1;

\4iile(i<=100){1►,以合形式出,

sum=sumn;若不加花括号,

i++;\4ii1e句的范只到

)岫ile后面的第一个

printf("%1\n",sun^;

句。

(2)直到型循(do〜岫ile句)

do

\Ahile(表达式);

特点:先行后判断,循

体至少行一次。适用

于循体至少行一次,

且次数不确定的情况°

100

例[]求£"

5。源程序如下:口出口果旦5050

n-1

#include<stdio.h>k明:do〜\Ahi1e

voidnain(){

句与vhi1e句

inti,sum=0;

似,只不是将

i=1;

do{条件表达式AA句

sum=sumH;的始移到了尾部

++;

i,因此循体至少

}vhi1e(i<=100);一

printf("%1\n",sun^;行一次

(3)for循

初始表达式循条件表达式增量表达式

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

作用循量初循束条件循量增

表达式、可系表达式、表达式

表达表达式、也可以是

以是与循量无、自增自减

式可数和字符表达式

的其它表达式,表达式、及

以是,只要其非零

如逗万表式,就行循体其匕表式

同循体

行由循条件确定°

句行次数

次只行1次(循体行皿次O

一,它行n+l次)

(11次)

100

例[5]求£"。源程序如下:口出口果旦5050

n-1

voidmin(){

inti,surnrO;

for(i=1;i<=100;i++)sum=sumn;

printf("%i\n",sun^;

For循的行可用当表达式1;

作似描述:vhi1e(表达式2){

i=1;句(循体)

Wiile(i<=100){

sum=sumn;表达式3;

i++;

明:三个表达式可根据用需要,省略其中的

一个、两个或全部省略,但其分号必保留。如:

for(;;)句while(1)句

for(i=0;((c=getchar())!=’‘&&c!='\ii'&&c!='\t';)

s[i++]=c;

s[i]=,\(F;

此for循句无表达式3,其功能入字符

到字符数s中去,直到遇到一个空格或回符

至。表达式3的功能由数的下表达式

例[8]算入正文中字符个数,行数及个数°

是一串不含有空格、行符或制表符的字符串°

★通置状志,可以使求解的算法化支

#include<stdio.h>//字符行.c

#defineYES1//在中1

#defineND0//不在中0

voidnain(){

intc,nl,nwnc,inword;

nl=nv«ic=O;inw)rd=N35//累力口器置0,累乘器置1°

//入字符按要求分理并判断入是否

也A第三章

vhi1e((c=getchar())!=ECF){入:countlines/

words/

”C;AD

if(c='\n')+-H11;出:2318

if(c='IIc='\n'IIc='\t')

inw3rd=N3j

elseif(inwrd==N3){

inword=^ES;++nw

printf("%1%i%1\n",nl,nv^nc);

............三OS4遍

bqj厘@u3lq“M,£k居I

例[9]用牛迭代法求解方程°

牛迭代法求解程:Y

①一个接近于x的近似根xl;

②通xl求出f(xl);

③f(xl)作f(x)的切,交X于x2;

可由公式求出x2;

由于:

xl—^2

r(xi)

④通x2求出f(x2),如此重③④°

直到接近真正的根。当两次求出

的根之差|£1

H根

X/1■足接近于真根,运算束°

f(x)=3A;3—4A:2—5x+13

其中:,

1)已知牛迭代:Xk+i=xk-f(xk)/f\xk)

2)f\x)=9x2-8x-5

3)允差(算精度):当dk=-f(xk)/f\xk)

的小于IE-6,%+1就作方程的解°

4)采用高效的算表达式形式,以提高算速度°

f(x)=3x3-4x2-5x+13=(((3*x-4)*x-5)*x+13)

/'(X)=9X2—8X—5=((9*x—8)*x—5

A第三章

#include<mth.h>★采用精度作循

#defineEPSIE-6束志,是程中常

voidmin(){使用的方法之一★

doublex,d;//d允差

printf("x=");

scanf("%f",&x);

do{

d=-(((3*x-4)*x-5)*x+13)/((9*x-8)*x-5);

x=x-Hd;

}vdhi1e(fabs(d)>EPS);

printf("therootis%\n”,x);

入:x=2

出:therootis-1.548910

I

us©:l(bt,燔濡酊自

(四)循的嵌套

□一个循体内又包含另一个完整的循

构,称循嵌套。内循中可以嵌

套循,就是多重循°

口三循(\4iile,do-vhi1e,for)可以

互相多重^套.,可以与分支;-一旬i3

svdtch)构成互相多重嵌套°

口在法相上必注意:全包含不交叉!

在法相上必注意:全包含不交叉!

示例:

do{

if(){

}\4ii1e();

else{

-•

例[10]百翁五;母一----,

三一。百百翁、母、各几何?

采用枚的算法思想,每一可能的合行判断°

voidmainQ{果:

02575

intcock,hen,chicken;418

for(cock=0;cock<=100;cock++)78

811

for(hen=0;hen<=100;hen++)

for(chicken=0;chicken<=100;chicken+-F)

if(cock+hen+chicken==l00&&

cock*5+hen*3+chicken/3.0==100)

printf(n%d%d%d\n",cock,hen,chicken);

}

将翁、母、用三个整型量表示,采用匕

重循形成三个量的在100以内的各合,

判断每一*合是否足意要求°找出所

程序需要一百万次判断°

voidmain(){果:

02575

intcock,hen,chicken;41878

for(cock=0;cock<=100;cock++)81181

12484

for(hen=0;hen<=100;hen++)

for(chicken=0;chicken<=100;chickenH

if(cock+hen+chicken==100&&

cock*5+hen*3+chicken/3.0:.00)

printf(n%d%d%d\nu,cock,hen,chicken);

■循次数的算:外循行一次内循需要行

100次,依次推,因此内循体if句需要一百万

次判断。因此有必要考化算法°

voidmain(){

intcock,hen,chicken;

for(cock=0;cock<=100;cock++)

ici次

for(hen=0;hen<=100;hen++)

101次

for(chicken=0;chicken<=100;chicken++)

101次

if(cock+hen+chicken==100&&

cock*5+hen*3+chicken/3.0==100)

printf(n%d%d%d\nn,cock,hen,chicken);

cock数不会大于:100+5=20

化算法减

少判断次数:hen数不会大于:100+3=33

chicken数:100-cock-hen

voidmain(){

intcock,hen,chicken;

for(cock=0;cock<=20;cock++)

for(hen=0;hen<=33;hen++)

for(chicken=0;chicken<=100-cock-hen;chicken++)

if(cock+hen+chicken==100&&

cock*5+hen*3+chicken/3.0==100)

printf(n%d%d%d\n1,cock,hen,chicken);

)

iTDETamTOims»第三章

要求程序按次,同的格式写,

便于°

voidmain(){

intcock,hen,chicken;

for(cock=0;cock<=20;cock++)

for(hen=0;hen<=33;hen++)

for(chicken=0;chicken<=100-cock-hen;chicken++)

if(cock+hen+chicken==100&&

cock*5+hen*3+chicken/3.0==100)

printf(n%d%d%d\n11,cock,hen,chicken);

)

!L

—@㈱©MLLC电£—

(五)return句

Return句形式:

return(表达式);或return;

功能:

①将程序控制(行流程控制)返回到主

函数的用。

②在有表达式,将表达式的回到主

I函数的用。无表达式,用的是

不确定的°

例[11]一函数,返回任一数的符号。当自量磔勺

大于0返回1;自量期勺等于0返回0;自量

侬勺小于。返回-1°

#include<stdio.h>■在一个函数中,

intsign(doublex){根据需要可多

if(x<0)return(-l);置return句,但

elsereturn((x==O)?0:1);最多只行其中的

―k个°

}

voidmain(){

doublea;

scanf(nlfn,&a);

printf(nsign=%d\n",sign(a));口入:-123

□出:sign=-1

(六)break中断句

break句形式:break;

注意:不能用于循句和s®tch句之外的任何地方

rtr)continils句>第—早

continue句形式:continue;

功能:束本次循,即跳循体中本句

下面尚未行的句,接着行下一次是否

循的判断°(只能用于循体)

while(){do{for(){

continue;|Mcontinue;continue;

}while();

break与continue句的区

break是中断包含break句的最内的整个循

句的行,止本循,或sEtch句;

while(){do{for(){switch(){

break;break;break;break;-(

_।

}vyhile();

■continue只是中断当前循体的本次行,而不是

止整个的循

例[12]求1〜指定数之的素数。素数是大于1,且除

了1和它本身外,不能被其它任何整数除的整数°

:根据素数的定可知

2,3,5,7,11,13,17等是素数°

1,4,6,8,10,12,14,15不是素数°

了判断某数i是否素数,一个最的法是用

2,3,4,5,…,i-1些数逐个去除i,看能否除尽

若被其中一个数除尽了,i不是素数,否(全部除

不尽)i是素数。当i大,用法,除的次数

太多°

例[12]求1〜指定数之的素数。素数是大于1,且除

了1和它本身外,不能被其它任何整数除的整数°

:根据素数的定可知

2,3,5,7,11,13,17等是素数°

1,4,6,8,10,12,14,15不是素数

根号

温馨提示

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

评论

0/150

提交评论