語句與控制流課件_第1頁
語句與控制流課件_第2頁
語句與控制流課件_第3頁
語句與控制流課件_第4頁
語句與控制流課件_第5頁
已閱讀5頁,還剩52頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

第三章句與控制流

內(nèi)容提要:

C句的分句分表

空句與合句空句與合句

條件分支句條件分支句

循控制句與嵌套循控制句

行流程強制移程序示例

程常用技巧流程強制移

第三章句與控制流

C言是一很好的構(gòu)化程序

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

富的流程控制句,提供了將多個

句合成一個句的合句

C句的分

T函數(shù)用句函數(shù)用加分號構(gòu)成

表達(dá)式句表達(dá)式加分勺構(gòu)成

句空句只有一個分號的句

合句花括號括起來的句

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

流支

svitch多分支句

程移

控break,continue,return,goto無條件移句

制vhi1e()~當(dāng)循

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

for()~for循

號句以上句添加號,構(gòu)成號句,

C句的分

函數(shù)用句函數(shù)用加分號構(gòu)成

定:敘述捷方便,-

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

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

循句◎

for()for循

號句以上句添加號,構(gòu)成號句,

一、空句與合句

空句:只有一個分號的句,屬于不行任

何操作的句。

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

句。循體是一個空句:

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

算字符串的度句,其循體是一個空句:

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

合句:在程序中用大括號括起來的若干

句成合句。一般形式:

?行句可以是

數(shù)據(jù)明部分;句、構(gòu)造句,

可以是合句°

行句部分;?在合句內(nèi)部定

的量,其作用域

限于合句的

內(nè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(表達(dá)式)句1

基本形式2:

if(表達(dá)式)句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(表達(dá)式1)句1基本形式i:

if(表達(dá)式)句1

elseif(表達(dá)式2)句2

else句2

基本形式2:

if(表達(dá)式)句1

elseif(表達(dá)式n)句n

else句n+1;

2.if句的嵌套

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

形式1。

if(表達(dá)式1)基本形式1:

if(表達(dá)式)句1

if(表達(dá)式2)

else句2

if(表達(dá)式2)句1基本形式2:

else句2if(表達(dá)式)句1

else句3

else句4

2.if句的嵌套

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

if(表達(dá)式1)基本形式1:

if(表達(dá)式)句1

if(表達(dá)式2)句1else句2

else句2基本形式2:

if(表達(dá)式)句1

else究竟與哪一個if配?

基本形式1:if(表達(dá)式)句1else句2

基本形式2:if(表達(dá)式)句1

注意:

?法定else是與它前面最接近的沒

有配的if配;

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

最多只行其中的一個句°

例[3]:根據(jù)學(xué)生的考分,來判斷劃分成的

'良'及格和不及格,分用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句形式:功能:根據(jù)表

svitch(表達(dá)式){達(dá)式的是否

與某常量表達(dá)

case常量表達(dá)式1:句1式i相同,來

case常量表達(dá)式2:句2行若干

句中的一個

句或一個句

序列。若要真

case常量表達(dá)式n:句n正起到多分支

[default:句n+1行功能

,配合使用

break句

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

s\Aitch(表達(dá)式){

case常量表達(dá)式1:句1;break;

case常量表達(dá)式2:句2;break;

case常量表達(dá)式n:句n;break;

[defalt:句n+1]

}break句用于JLEswitch

句的行,跳出switch相

明:

svitch(表達(dá)式){?表達(dá)式和常量表達(dá)式i要求是

case常量表達(dá)式1:整形或字符形,且兩者型相

句1;break;同;

case常量表達(dá)式2:?常量表達(dá)式i的必互不相

同,它只起相當(dāng)于句入口

句2;break;

號的作用,沒有條件判斷分

支行的功能;

case常量表達(dá)式n:

?行若常量表達(dá)式i的與

句n;break;

表達(dá)式相等,就序行其后

[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

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

入數(shù)據(jù),并按算式算果

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)數(shù)據(jù)的入與取數(shù)據(jù)技巧(入

沖區(qū)概念);

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

當(dāng)于算器,沒有運算符先

理功能。

printf(%\n",x);

四、循句

(1)當(dāng)循(Wiile句)

vhi1e(表達(dá)式)句

特點:先判斷后行,它

循體可能一次也不

行。通常用于事先不能確

定循次數(shù)的情況。

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

n-1

#include<stdio.h>循控制量:在表達(dá)式中出

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

inti,sum=0;必注意的幾個:

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

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

②在循體內(nèi)有改其

句;

③其的改使得表達(dá)式

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(表達(dá)式);

特點:先行后判斷,循

體至少行一次。適用

于循體至少行一次,

且次數(shù)不確定的情況°

100

例[]求£"

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

n-1

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

voidnain(){

句與vhi1e句

inti,sum=0;

似,只不是將

i=1;

do{條件表達(dá)式AA句

sum=sumH;的始移到了尾部

++;

i,因此循體至少

}vhi1e(i<=100);一

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

(3)for循

初始表達(dá)式循條件表達(dá)式增量表達(dá)式

for(表達(dá)式1;表達(dá)式2;表達(dá)式3)句

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

表達(dá)式、可系表達(dá)式、表達(dá)式

表達(dá)表達(dá)式、也可以是

以是與循量無、自增自減

式可數(shù)和字符表達(dá)式

的其它表達(dá)式,表達(dá)式、及

以是,只要其非零

如逗萬表式,就行循體其匕表式

同循體

行由循條件確定°

句行次數(shù)

數(shù)

次只行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循的行可用當(dāng)表達(dá)式1;

作似描述:vhi1e(表達(dá)式2){

i=1;句(循體)

Wiile(i<=100){

sum=sumn;表達(dá)式3;

i++;

明:三個表達(dá)式可根據(jù)用需要,省略其中的

一個、兩個或全部省略,但其分號必保留。如:

for(;;)句while(1)句

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

s[i++]=c;

s[i]=,\(F;

此for循句無表達(dá)式3,其功能入字符

到字符數(shù)s中去,直到遇到一個空格或回符

至。表達(dá)式3的功能由數(shù)的下表達(dá)式

例[8]算入正文中字符個數(shù),行數(shù)及個數(shù)°

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

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

#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),如此重③④°

直到接近真正的根。當(dāng)兩次求出

的根之差|£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)允差(算精度):當(dāng)dk=-f(xk)/f\xk)

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

4)采用高效的算表達(dá)式形式,以提高算速度°

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,燔濡酊自

(四)循的嵌套

□一個循體內(nèi)又包含另一個完整的循

構(gòu),稱循嵌套。內(nèi)循中可以嵌

套循,就是多重循°

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

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

svdtch)構(gòu)成互相多重嵌套°

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

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

示例:

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以內(nèi)的各合,

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

程序需要一百萬次判斷°

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);

■循次數(shù)的算:外循行一次內(nèi)循需要行

100次,依次推,因此內(nèi)循體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數(shù)不會大于:100+5=20

化算法減

少判斷次數(shù):hen數(shù)不會大于:100+3=33

chicken數(shù):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(表達(dá)式);或return;

功能:

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

函數(shù)的用。

②在有表達(dá)式,將表達(dá)式的回到主

I函數(shù)的用。無表達(dá)式,用的是

不確定的°

例[11]一函數(shù),返回任一數(shù)的符號。當(dāng)自量磔勺

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

儂勺小于。返回-1°

#include<stdio.h>■在一個函數(shù)中,

intsign(doublex){根據(jù)需要可多

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句的區(qū)

break是中斷包含break句的最內(nèi)的整個循

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

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

break;break;break;break;-(

_?

}vyhile();

■continue只是中斷當(dāng)前循體的本次行,而不是

止整個的循

例[12]求1?指定數(shù)之的素數(shù)。素數(shù)是大于1,且除

了1和它本身外,不能被其它任何整數(shù)除的整數(shù)°

:根據(jù)素數(shù)的定可知

2,3,5,7,11,13,17等是素數(shù)°

1,4,6,8,10,12,14,15不是素數(shù)°

了判斷某數(shù)i是否素數(shù),一個最的法是用

2,3,4,5,…,i-1些數(shù)逐個去除i,看能否除盡

若被其中一個數(shù)除盡了,i不是素數(shù),否(全部除

不盡)i是素數(shù)。當(dāng)i大,用法,除的次數(shù)

太多°

例[12]求1?指定數(shù)之的素數(shù)。素數(shù)是大于1,且除

了1和它本身外,不能被其它任何整數(shù)除的整數(shù)°

:根據(jù)素數(shù)的定可知

2,3,5,7,11,13,17等是素數(shù)°

1,4,6,8,10,12,14,15不是素數(shù)

根號

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論