程序控制結(jié)構(gòu)_第1頁
程序控制結(jié)構(gòu)_第2頁
程序控制結(jié)構(gòu)_第3頁
程序控制結(jié)構(gòu)_第4頁
程序控制結(jié)構(gòu)_第5頁
已閱讀5頁,還剩170頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1第四章程序控制結(jié)構(gòu)

4.1C語言的執(zhí)行語句4.2 順序結(jié)構(gòu)4.3 選擇結(jié)構(gòu)4.4 循環(huán)結(jié)構(gòu)24.1C語言的執(zhí)行語句

C程序的結(jié)構(gòu):

3C語句可分為以下五類:1)表達(dá)式語句2)函數(shù)調(diào)用語句(一般包含在表達(dá)式語句中)3)控制語句4)復(fù)合語句5)空語句

C程序的執(zhí)行部分是由語句組成的。程序的功能也是由執(zhí)行語句實(shí)現(xiàn)的。44.1.1表達(dá)式語句表達(dá)式語句由表達(dá)式加上分號(hào)“;”組成。執(zhí)行表達(dá)式語句就是計(jì)算表達(dá)式的值。其一般形式為:表達(dá)式;例如:x=y+z;y+z;i++;x=0,y=1;賦值語句加法運(yùn)算語句,但計(jì)算結(jié)果不能保留,無實(shí)際意義自增1語句,i值增1逗號(hào)表達(dá)式語句51、賦值語句:由賦值表達(dá)式加上分號(hào)“;”構(gòu)成的表達(dá)式語。語法格式:變量=表達(dá)式;(1)賦值運(yùn)算符除“=”外,還包含復(fù)合賦值運(yùn)算符。例如:a-=a*a;(2)賦值運(yùn)算符右側(cè)的表達(dá)式可以又是一個(gè)賦值表達(dá)式。例如:a=b=5*3;等價(jià)a=a-a*a;等價(jià)a=(b=5*3);等價(jià)b=5*3;a=b;6(3)賦值語句的功能與賦值表達(dá)式相同,但性質(zhì)不同。賦值表達(dá)式是一種表達(dá)式,它可以出現(xiàn)在任何允許表達(dá)式出現(xiàn)的地方,而賦值語句不能出現(xiàn)在表達(dá)式中。例如:

if(x=y+5)z=x;語句的功能是,若表達(dá)式x=y+5大于0則z=x。

if((x=y+5;)>0)z=x;因?yàn)閤=y+5;是語句,不能出現(xiàn)在表達(dá)式中。合法不合法7(4)賦值表達(dá)式的嵌套:賦值符右邊的表達(dá)式又是一個(gè)賦值表達(dá)式:

變量=(變量=表達(dá)式);展開之后的一般形式為:

變量=變量=…=表達(dá)式;例如:

a=b=c=d=e=5;按照賦值運(yùn)算符的右接合性,等效于:

e=5;d=e;c=d;b=c;a=b;8(5)變量說明中給變量賦初值和賦值語句的區(qū)別:給變量賦初值是變量說明的一部分,賦初值后的變量與其后的其它同類變量之間仍必須用逗號(hào)間隔,而賦值語句則必須用分號(hào)結(jié)尾。例如:

inta=5,b,c;(6)在變量說明中,不允許連續(xù)給多個(gè)變量賦初值:

如下述說明是錯(cuò)誤的:

inta=b=c=5;而賦值語句允許連續(xù)賦值:

inta,b,c;a=b=c=5;×√92、函數(shù)調(diào)用語句:函數(shù)調(diào)用語句由函數(shù)名、實(shí)際參數(shù)加上分號(hào)“;”組成。執(zhí)行函數(shù)語句就是調(diào)用函數(shù)體。

一般形式為:函數(shù)名(實(shí)際參數(shù)表);例如:printf("CProgram");z=x+sin(y);調(diào)用庫函數(shù),輸出字符串賦值語句(表達(dá)式中包含函數(shù)調(diào)用)104.1.2空語句空語句只有分號(hào)“;”組成的語句稱為空語句??照Z句是什么也不執(zhí)行的語句。例如

while(getchar()!='\n')

;空語句本語句的功能是,只要從鍵盤輸入的字符不是回車則重新輸入。114.1.3

復(fù)合語句復(fù)合語句把多個(gè)語句用括號(hào){}括起來組成的一個(gè)語句稱復(fù)合語句。在程序中應(yīng)把復(fù)合語句看成是單條語句,而不是多條語句。例如:

{x=y+z;a=b+c;printf(“%d%d”,x,a);

}是一條復(fù)合語句。復(fù)合語句內(nèi)的各條語句都必須以分號(hào)“;”結(jié)尾,在括號(hào)“}”外不能加分號(hào)。124.1.4控制語句

控制語句用于控制程序的流程,以實(shí)現(xiàn)程序的各種結(jié)構(gòu)方式??煞殖梢韵氯悾?)條件判斷語句:ifelse語句;2)開關(guān)分支語句:

switch語句;3)循環(huán)執(zhí)行語句:dowhile語句、while語句、for語句;4)中止循環(huán)語句:

continue語句、

break語句;5)無條件轉(zhuǎn)移語句:goto語句;6)函數(shù)返回語句:

return語句。

134.2

順序結(jié)構(gòu)

按照解決問題的順序編寫相應(yīng)的語句,程序運(yùn)行時(shí)自上而下依次執(zhí)行語句。14例1.輸入任意兩個(gè)整數(shù),求它們的和及平均值。#include<stdio.h>intmain(){intnum1,num2,sum;floataver;

printf("Pleaseinputtwointegers:\n");

scanf("%d,%d",&num1,&num2);sum=num1+num2; aver=(float)sum/2; printf("sum=%d,aver=%.2f\n",sum,aver);return0;}輸入:30000,5005↙輸出:sum=35005,aver=17502.50變量定義輸入提示數(shù)據(jù)輸入求累計(jì)和求平均值輸出結(jié)果?sum/2.015例2.給定一個(gè)三位正整數(shù),輸出它的個(gè)位、十位和百位數(shù)。數(shù)字分離方法:百位數(shù)m2=m/100十位數(shù)m1=(m-m2*100)/10個(gè)位數(shù)m0=m-m2*100-m1*10個(gè)位數(shù)m0=m%10十位數(shù)m1=(m/10)%10百位數(shù)m2=m/100百位:123/100=1十位:(123-1*100)/10=2個(gè)位:123-1*100-2*10=3個(gè)位:123%10=3十位:(123/10)%10=2百位:123/100=116例2.給定一個(gè)三位正整數(shù),輸出它的個(gè)位、十位和百位數(shù)。#include<stdio.h>intmain(){intm,m0,m1,m2;scanf("%d",&m);m0=m%10;m1=(m/10)%10;m2=m/100;

printf("%d,%d,%d\n",m0,m1,m2);return0;} 輸入:123↙輸出:3,2,1

個(gè)位:m0=123%10=3十位:m1=(123/10)%10=2百位:m2=123/100=117例3.取一個(gè)16位的二進(jìn)制數(shù)a的7、6、5、4四個(gè)位。如16進(jìn)制數(shù):

a=(a25d)16→(1010001001011101)2

10111010010001010154~74~71011101001000101015右移4位14~70100·10001010000a>>4~(~0<<4)00000000000000001111111111111111111111111111000000000000000011110000000000001111&0000101000100101

000000000000010118#include<stdio.h>intmain(){unsigneda,b,c,d;

scanf("%x",&a);b=a>>4;c=~(~0<<4);d=b&c;

printf("%x%x\n",a,d);return0;}輸入:a25d↙輸出:a25d5 以十六進(jìn)制形式輸入整數(shù)a以十六進(jìn)制形式輸出a和結(jié)果d右移4位求低4位19表達(dá)式可以是任意合法表達(dá)式,后面不能加;4.3選擇結(jié)構(gòu)(if語句)4.3.1if語句

1、單分支if:if(表達(dá)式)語句語義:如果表達(dá)式的值為真,則執(zhí)行其后的語句,否則不執(zhí)行該語句。20例1:intmain(){inta,b,max;

printf("\ninputtwonumbers:");

scanf("%d%d",&a,&b);max=a;if(max<b)max=b;

printf("max=%d",max);return0;}

輸入:2346

輸出:max=46此語句用于提示輸入max=23max=4621例2:intmain(){inta,b,c,t;

printf("\ninputtwonumbers:");

scanf("%d%d%d",&a,&b,&c);if(a<b){t=a;a=b;b=t;}if(a<c){t=a;a=c;c=t;}if(b<c){t=b;b=c;c=t;}

printf("%d%d%d\n",a,b,c);return0;}

輸入:162↙

輸出:621實(shí)現(xiàn)數(shù)的互換功能:輸入三個(gè)數(shù),按照從大到小順序輸出22例3:從鍵盤輸入一個(gè)字符,判斷它是否小寫字母。若是,將其轉(zhuǎn)換成大寫字母,否則不進(jìn)行轉(zhuǎn)換,作后輸出該字母。#include<stdio.h>intmain(){ charc,a; c=getchar(); if(c<‘a(chǎn)’||c>‘z’)a=c;

if(c<=‘z’&&c>=‘a(chǎn)’)

a=c-32; printf("%c\n",a);return0;}main(){charc;c=getchar(); if(c<=‘z’&&c>=‘a(chǎn)’)c-=32; printf("%c\n",c);}判斷非小寫字母情況判斷小寫字母情況只用一個(gè)單分支語句實(shí)現(xiàn)232、雙分支:if-else

if(表達(dá)式)

語句1;

else

語句2;語義:如果表達(dá)式的值為真,則執(zhí)行語句1,否則執(zhí)行語句2。

后面不能加;24

intmain(){inta,b;

printf("inputtwonumbers:");

scanf("%d%d",&a,&b);

if(a>b)

printf("max=%d\n",a);else

printf("max=%d\n",b);return0;}

輸入:2346

輸出:max=46

輸入兩個(gè)整數(shù)輸出其中大數(shù)例4.例1的改寫253、多分支if-elseif

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

語句1;

elseif(表達(dá)式2)

語句2;

elseif(表達(dá)式3)

語句3;

elseif(表達(dá)式m)

語句m;

else

語句n;語義:依次判斷表達(dá)式的值,當(dāng)出現(xiàn)某個(gè)值為真時(shí),則執(zhí)行其對(duì)應(yīng)的語句。然后跳到整個(gè)if語句之外繼續(xù)執(zhí)行程序。如果所有的表達(dá)式均為假,則執(zhí)行語句n。然后繼續(xù)執(zhí)行后續(xù)程序。后面不能加;26此為真,做語句1,其它語句都不做27上面的語句為以下三種格式:1、空語句2、一個(gè)語句(不引起轉(zhuǎn)移)3、前后加大括號(hào)的語句(復(fù)合語句),也叫程序段,如:{inta;floatb;a=3;b=7.0;};允許在復(fù)合語句前部定義變量,只能在復(fù)合語句中使用{inta;a=3;floatb;b=7.0;}變量要在最前面定義√×28a<bt=a;a=b;b=t;a<bt=a;a=b;b=t;使用復(fù)合語句不使用復(fù)合語句YYNN29

#include"stdio.h"

intmain(){輸入:Acharc;輸出:Thisisacapitalletterc=getchar();

if(c<32)

printf("Thisisacontrolcharacter\n");elseif(c>='0'&&c<='9')

printf("Thisisadigit\n");elseif(c>='A'&&c<='Z')

printf("Thisisacapitalletter\n");elseif(c>='a'&&c<='z')

printf("Thisisasmallletter\n");else

printf("Thisisanothercharacter\n");return0;}一個(gè)語句例5304、在使用if語句中應(yīng)注意以下問題:1)在三種形式的if語句中,在if之后均為表達(dá)式。該表達(dá)式通常是邏輯表達(dá)式或關(guān)系表達(dá)式,但也可以是其它表達(dá)式,如賦值表達(dá)式等,甚至也可以是一個(gè)變量。例如:if(a=5)語句;

if(b)語句;都是允許的。只要表達(dá)式的值為非0,即為“真”。如在:if(a=5)…;中表達(dá)式的值永遠(yuǎn)為非0,所以其后的語句總是要執(zhí)行的,當(dāng)然這種情況在程序中不一定會(huì)出現(xiàn),但在語法上是合法的。31又如,有程序段:

if(a=b)

printf("%d",a);else

printf("a=0");

本語句的語義是,把b值賦予a,如為非0則輸出該值,否則輸出“a=0”字符串。這種用法在程序中是經(jīng)常出現(xiàn)的。=為賦值運(yùn)算符,比較運(yùn)算符為==

322)在if語句中,條件判斷表達(dá)式必須用括號(hào)括起來,在語句之后必須加分號(hào)。3)在if語句的三種形式中,所有的語句應(yīng)為單個(gè)語句,如果要想在滿足條件時(shí)執(zhí)行一組(多個(gè))語句,則必須把這一組語句用{}括起來組成一個(gè)復(fù)合語句。但要注意的是在}之后不能再加分號(hào)。例如:

if(a>b){a++;b++;}else{a=0;b=10;}

if(a>b){a++;b++;};

else{a=0;b=10;};不能寫成復(fù)合語句×33例如條件語句:

if(a>b)max=a;elsemax=b;可用條件表達(dá)式寫為:

max=(a>b)?a:b;(a>b)?max=a:max=b;(a>b)?(max=a):(max=b);√×用條件語句實(shí)現(xiàn)分支語句功能:34例6:計(jì)算方法一:intmain(){floatx,y;scanf(”%f”,&x);if(x>3)y=x*x+2;elsey=3*x+7*x*x;printf(”y=%f\n”,y);return0;}

x2

+2(x>3)y=3x+7x2(x≤3)表達(dá)式,成立值為1y=x>3?x*x+2:3*x+7*x*x;35例7:從鍵盤輸入任意的兩個(gè)實(shí)數(shù),按從小到大順序輸出這兩個(gè)數(shù),請(qǐng)編程實(shí)現(xiàn)。intmain(){floata,b;

scanf(”%f%f”,&a,&b);if(a>b){a=a+b;b=a-b;a=a-b;}

printf(”%f,%f\n”,a,b);return0;}可用語句if(a>b){floatt;t=a;a=b;b=t;}代替復(fù)合語句可以定義變量實(shí)現(xiàn)a與b的互換36a=a+b;b=a-b;a=a-bt=a;a=b;b=ta3+1ba-b=3aa-3=1a3b1t3b3a1a3b137例8:計(jì)算方法一:intmain(){floatx,y;

scanf(”%f”,&x);if(x<1)y=x;elseif(1<=x&&x<10)y=2*x-1;elsey=3*x-11;

printf(”y=%f\n”,y);return0;}表達(dá)式1表達(dá)式2非00語句1語句2語句3非001<=x&&可省略嗎?可以38方法二:intmain(){floatx,y;

scanf(”%f”,&x);if(x<1)y=x;else{if(x<10)y=2*x-1;elsey=3*x-11;}

printf(”y=%f\n”,y);return0;}{

、}

可省略y=x<1?x

:(

x<10?2*x-1:3*x-11);等價(jià)(、)可省略39方法三:if(x<10)

{

if(x<1)y=x;elsey=2*x-1;

}

elsey=3*x-11;

}

后不能加;{、}

可省略等價(jià)y=x<10?(x<1?x:2*x-1):3*x-11;

(、)

可省略404.3.4

if語句的嵌套

當(dāng)if語句中的執(zhí)行語句又是if語句時(shí),則構(gòu)成了if語句嵌套的情形。其一般形式可表示如下:

if(表達(dá)式)

if(表達(dá)式)

if語句;

if語句;

else

if語句;在嵌套內(nèi)的if語句可能又是if-else型的,這將會(huì)出現(xiàn)多個(gè)if和多個(gè)else重疊的情況,這時(shí)要特別注意if和else的配對(duì)問題。

加;41其中的else究竟是與哪一個(gè)if配對(duì)呢?是if(表達(dá)式1)

還是if(表達(dá)式1)

if(表達(dá)式2)

if(表達(dá)式2)

語句1;

語句1;

else

else

語句2;

語句2;

注意:if與else的配對(duì)關(guān)系——else總是與它前面最近的if配對(duì),因此對(duì)上述例子應(yīng)按前一種情況理解。

√×42例9:寫出下面兩程序的輸出結(jié)果1.intmain(){intx=2,y=-1,z=2;if(x<y)if(y<0)z=0;elsez=1;

printf(”%d\n”,z);return0;}結(jié)果:一個(gè)語句不成立時(shí)執(zhí)行243

intmain(){inta=1,b=3,c=5,d=4;if(a<b)if(c<d)x=1;elseif(a<c)if(b<d)x=2;elsex=3;elsex=6;elsex=7;

printf(”%d\n”,x);return0;}

結(jié)果:244為了使邏輯關(guān)系清晰:

(1)按下面所示書寫程序:

intmain(){inta=1,b=3,c=5,d=4;if(a<b)if(c<d)x=1;elseif(a<c)if(b<d)x=2;elsex=3;elsex=6;elsex=7;printf(”%d\n”,x);return0;}45(2)適當(dāng)?shù)丶哟罄ㄌ?hào):

x=-3;

if(x<0)

{

y=-1;printf(”x<0,y=%d\n”,y);}

elseif(x>0)

{

y=1;printf(”x>0,y=%d\n”,y);}把上面與下面比較x=-3;if(x>=0)if(x>0){y=1;printf(”x>0,y=%d\n”,y);

}else{

y=-1;printf(”x<0,y=%d\n”,y);}結(jié)果:x<0,y=-1無結(jié)果46例10:intmain(){inta,b;

printf("pleaseinputA,B:");

scanf("%d%d",&a,&b);

if(a==b)printf("A=B\n");elseif(a>b)printf("A>B\n");elseprintf("A<B\n");return0;}輸入:輸出:if(a!=b)if(a>b)printf("A>B\n");elseprintf("A<B\n");elseprintf("A=B\n");等價(jià)2346A<B47例11:輸入一年份,判別是否閏年。year被4整除真真真真假假假假year被100整除leap=0leap=1leap=1leap=0leapyear被400整除輸出閏年輸出非閏年48intmain(){intyear,leap;scanf(“%d”,&year);if(year%4==0){if(year(%100==0){if(year%400)==0)leap=1;elseleap=0;}elseleap=1;}elseleap=0;if(leap)printf(“%dis“,year);elseprintf(“%disnot“,year);printf(“aleapyear.\n“);return0;}根據(jù)leap輸出結(jié)果49不要忘記空格4.3.2

switch語句(另一種分支語句)

格式:switch(任意類型表達(dá)式)

{

case

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

case

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

case

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

default:語句n+1;

}注:①常量表達(dá)式中運(yùn)算對(duì)象只能為常量或符號(hào)常量(整型或字符型),各個(gè)值必須互不相同

②default允許出現(xiàn)在前面或中間③switch(任意類型表達(dá)式)

后不帶分號(hào),任意類型表達(dá)式的計(jì)算結(jié)果取整。不帶;50功能:若switch后面表達(dá)式值的整數(shù)(字符常量)部分與某個(gè)case后面表達(dá)式值相等,則就執(zhí)行該case后面的語句,否則就執(zhí)行default后面的語句語句1語句2語句3……值1,入口1繼續(xù)后面執(zhí)行繼續(xù)后面執(zhí)行值2,入口351例12:intmain(){inta;printf("inputintegernumber:");scanf("%d",&a);switch(a){case1:printf("Monday\n");case2:printf("Tuesday\n"); case3:printf("Wednesday\n"); case4:printf("Thursday\n"); case5:printf("Friday\n"); case6:printf("Saturday\n"); case7:printf("Sunday\n"); default:printf("error\n");}return0;}輸入:3入口執(zhí)行輸出:

WednesdaThursdayFridaySaturdaySundayerror“case常量表達(dá)式”相當(dāng)于一個(gè)語句標(biāo)號(hào),表達(dá)式的值和某標(biāo)號(hào)相等則轉(zhuǎn)向該標(biāo)號(hào)執(zhí)行,但不能在執(zhí)行完該標(biāo)號(hào)的語句后自動(dòng)跳出整個(gè)switch語句,所以出現(xiàn)了繼續(xù)執(zhí)行所有后面case語句的情況。52break語句:專用于跳出switch語句在每一case語句之后增加break語句,使每一次執(zhí)行之后均可跳出switch語句,從而避免輸出不應(yīng)有的結(jié)果。

intmain(){

…switch(a){case1:printf("Monday\n");break;case2:printf("Tuesday\n");break;case3:printf("Wednesday\n");break;case4:printf("Thursday\n");break;case5:printf("Friday\n");break;case6:printf("Saturday\n");break;case7:printf("Sunday\n");break;default:printf("error\n");}return0;}入口

53Switch語句常用形式:switch(任意類型表達(dá)式){case整型或字符型常量表達(dá)式1:語句1;break;case整型或字符型常量表達(dá)式2:語句2;break;

…case整型或字符型常量表達(dá)式n:語句n;break;default:語句n+1;}

default后面不加break54注意:1)case后的各常量表達(dá)式的值不能相同,否則會(huì)出現(xiàn)錯(cuò)誤。

2)case后,允許有多個(gè)語句,可以不用{}括起來。

3)case和default子句的先后順序可以變動(dòng),而不會(huì)影響程序執(zhí)行結(jié)果。

4)default子句可以省略不用。55計(jì)算后取整例13:若有宏定義:#definek2

和定義:floatw;inta=2,b;則合法的switch語句是[]A.switch(w)B.switch(a+b)

{case1.0:printf(”*\n”);

{case1printf(”*\n”);case2.0:printf(”**\n”);}caseaprintf(”**\n”):}C.switch(w+1)

D.switch(a);

{casek-1:printf(”*\n”);

{case1:printf(”*\n”);default:printf(”\n”);

case2:printf(”**\n”);

case1+2:printf(”***\n”);}

default:printf(”\n”);}C

不能為實(shí)型不能為變量,少;和:不能加分號(hào)56例14:

先接收從鍵盤輸入的一個(gè)等級(jí)制成績,然后輸出對(duì)應(yīng)的百分制成績。轉(zhuǎn)換規(guī)則如下:

A:85——100B:70——84C:60——69D<6057intmain(){chargrade;

scanf(“%c”,&grade);

switch(grade)

{case‘A’:printf(”85~100\n”);break;case‘B’:printf(”70~84\n”);

break;case‘C’:printf(”60~69\n”);

break;case‘D’:printf(”<60\n”);

break;default:printf(”Error\n”);

}return0;}58

例15:先接收從鍵盤輸入的一個(gè)百分制成績,然后輸出對(duì)應(yīng)的五分制成績。轉(zhuǎn)換規(guī)則如下:

90——100A80——89B70——79C60——69D<60E59#include<stdio.h>intmain(){intscore;printf("\nPleaseinputthescore(0-100):");scanf("%d",&score);if(score>=90)printf("A\n");elseif(score>=80)printf("B\n");elseif(score>=70)printf("C\n");elseif(score>=60)printf("D\n");elseprintf("E\n");return0;}方法一60intmain(){intcj;printf(”Inputaintegernumber(0----100)\n”);scanf(“%d”,&cj);if(cj>100||cj<0)printf(”Inputerror!”);elseif(cj<60)printf(”E\n”);elseswitch(cj/10)

{case6:printf(”D\n”);break;case7:printf(”C\n”);

break;case8:printf(”B\n”);

break;case9:case10:printf(”A\n”);

}return0;}90~100A80~89B70~79C60~69D<60E整數(shù)除整數(shù)方法二61例16:計(jì)算器程序。用戶輸入運(yùn)算數(shù)和四則運(yùn)算符,輸出計(jì)算結(jié)果。intmain(){floata,b;charc;

printf("inputexpression:a+(-,*,/)b\n");

scanf("%f%c%f",&a,&c,&b);switch(c){case'+':printf("%f\n",a+b);break;case'-':printf("%f\n",a-b);break;case'*':printf("%f\n",a*b);break;case'/':printf("%f\n",a/b);break;default:printf("inputerror\n");

}return0;}字符常量輸入:12+13輸出:25.00000062例17:求方程ax2+bx+c=0的兩個(gè)實(shí)根#include<math.h>intmain(){doublea,b,c,x1,x2,disc;

scanf(”%lf%lf%lf”,&a,&b,&c);disc=b*b-4*a*c;if(disc<=0)printf(”輸入錯(cuò)誤”);else{x1=(-b+sqrt(disc))/(2*a);x2=(-b-sqrt(disc))/(2*a);printf(”x1=%.4f,x2=%.4f\n”,x1,x2);}return0;}b*b-4*a*c>0,有解63題目改為:求二次方程ax2+bx+c=0的兩個(gè)根

disc>=0真假輸出兩個(gè)共軛復(fù)根輸出兩個(gè)實(shí)根disc=b2-4aca==0真假輸出:“非二次方程”輸入a,b,ca!=0,一定有解要認(rèn)真分析題目,達(dá)到題目要求64intmain(){doublea,b,c,x1,x2,disc,p,q;scanf(”%lf,%lf,%lf”,&a,&b,&c);if(a==0)printf(”非二次方程”);else{disc=b*b-4*a*c;if(disc>=0)

{x1=(-b+sqrt(disc))/(2*a);x2=(-b-sqrt(disc))/(2*a);printf(”x1=%f,x2=%f\n”,x1,x2);

}else{

p=-b/(2*a);q=sqrt(-disc)/(2*a);printf(”x1=%.4f+%.4fi,x2=%.4f-

%.4fi\n”,p,q,p,q);

}

}

return0;}65例18:輸入某年某月某日,判斷這一天是這一年的第幾天,需考慮閏年的情形。注:符合以下條件之一是閏年:①能被4整除,但不能被100整除;②能被400整除。算法分析:以5月4日為例,先把1~4月份的天數(shù)加起來,然后再加上本月的4天即本年的第幾天。閏年情形只需當(dāng)輸入月份大于3時(shí)需要考慮。若是閏年,2月份應(yīng)是29天。66intmain(){intday,month,year,sum=0;scanf("%d,%d,%d",&year,&month,&day);switch(month){case12:sum+=30;/*加上11月份30天*/case11:sum+=31;/*加上10月份31天*/case10:sum+=30;/*加上9月份30天*/case9:sum+=31;/*加上8月份31天*/case8:sum+=31;/*加上7月份31天*/case7:sum+=30;/*加上6月份30天*/case6:sum+=31;/*加上5月份31天*/case5:sum+=30;/*加上4月份30天*/case4:sum+=31;/*加上3月份31天*/

計(jì)算某月以前月份的總天數(shù)67

case3:/*判斷是否閏年*/if((year%4==0&&year%100!=0)||year%400==0)sum+=29;/*加上閏年2月份29天*/elsesum+=28;/*加上非閏年2月份28天*/case2:sum+=31;/*加上1月份31天*/}sum+=day;/*再加上某天的天數(shù)*/

printf("Itisthe%dthday.",sum);return0;}68例19:運(yùn)輸公司對(duì)用戶計(jì)算運(yùn)費(fèi)。路程(skm)越遠(yuǎn),每噸·千米運(yùn)費(fèi)越低。標(biāo)準(zhǔn)如下:S<250沒有折扣250≤s<5002%折扣500≤s<10005%折扣1000≤s<20008%折扣2000≤s<300010%折扣3000≤s015%折扣設(shè)每噸·千米運(yùn)費(fèi)為p,貨物重量為w,距離為s,折扣為d,則總運(yùn)費(fèi)為:f=p×w×s×(1-d)輸入:p、w、s,計(jì)算運(yùn)費(fèi)69

用公式f=p*w*s*(1-d)

計(jì)算運(yùn)輸費(fèi)。噸公里運(yùn)價(jià)運(yùn)輸距離折扣貨重s<250(公里)d=0250≤s<500d=0.02500≤s<1000d=0.051000≤s<2000d=0.082000≤s<3000d=0.103000≤sd=0.15要根據(jù)距離計(jì)算折扣d,關(guān)鍵是構(gòu)造switch后的表達(dá)式,選擇

c=s/250

來求c的值。

if(s>=3000)c=12;elsec=s/250;70intmain(){intc,s;floatp,w,d,f;scanf("%f,%f,%s",&p,&w,&s);if(s>=3000)c=12;elsec=s/250;switch(c){case0:d=0;break;case1:d=2;break;case2:case3:d=5;break;折扣變化都是250的倍數(shù)s÷250則:S<250→<1250≤s<500→[1,2)500≤s<1000→[2,4)1000≤s<2000→[4,8)2000≤s<3000→[8,12)3000≤s0→≤1271case4:case5:case6:case7:d=8;break;case8:case9:case10:case11:d=10;break;case12:d=15;break;}f=p*w*s*(1-d/100.0)printf(“f=%.4f=”,f);}s÷250則:S<250→<1250≤s<500→[1,2)500≤s<1000→[2,4)1000≤s<2000→[4,8)2000≤s<3000→[8,12)3000≤s0→≤12運(yùn)費(fèi)72例20:判斷以下程序?qū)崿F(xiàn)的功能:#include<stdio.h>voidmain(){charc;printf("inputacharacter:");c=getchar();if(c>='0'&&c<='9')printf("Thisisadigit.\n");elseif(c>='A'&&c<='Z')printf("Thisisacapitalletter.\n");elseif(c>='a'&&c<='z')printf("Thisisasmallletter.\n");elseprintf("Thisisanothercharacter.\n");return0;}輸入一個(gè)字符,判別該字符是數(shù)字、英文大寫字母、小寫字母還是其它字符。

數(shù)字大寫字母小寫字母其它字符73例22:輸入a、b、c三個(gè)整數(shù),輸出最大數(shù)和最小數(shù)。

#include<stdio.h>intmain(){inta,b,c,max,min;

scanf("%d,%d,%d",&a,&b,&c);max=a>b?a:b;min=a<=b?a:b;if(c>max)max=c;elseif(c<min)min=c;printf("max=%d\nmin=%d",max,min);return0;}比較a、b兩數(shù)的大小,大數(shù)賦給max,小數(shù)賦給min若c大于max,則把c賦給max,若c比min更小則把c賦給min。if(a>b){max=a;min=b}else{max=b;min=a;}74例21:

輸入三角形三邊長,求三角形面積。

#include<stdio.h>#include<math.h>intmain(){floata,b,c,s,area;

scanf("%f,%f,%f",&a,&b,&c);if(a+b>c&&a+c>b&&b+c>a)

{s=(a+b+c)/2;area=sqrt(s*(s-a)*(s-b)*(s-c));

printf("area=%7.2f\n",area);}else

printf("Notatriangle.\n");return0;}判斷條件是否滿足75循環(huán)條件4.4

循環(huán)控制概述

循環(huán)結(jié)構(gòu)的特點(diǎn):在給定條件成立時(shí),反復(fù)執(zhí)行某程序段,直到條件不成立為止。C語言提供的循環(huán)結(jié)構(gòu)類型如下:1)用goto語句和if語句構(gòu)成循環(huán);2)用while語句;3)用do-while語句;4)用for語句;循環(huán)體76語法格式:while(表達(dá)式)

語句

表達(dá)式值為零時(shí),立即停止循環(huán)

4.4.1用while語句實(shí)現(xiàn)循環(huán)沒有分號(hào)0

非0循環(huán)體語句表達(dá)式結(jié)構(gòu)流程圖當(dāng)表達(dá)式值為真循環(huán)體語句N-S圖77寫出下面程序的運(yùn)行結(jié)果

(1)intmain(){inti=1;

while(i<=3)

{printf(”%d\n”,i);i++;}

return0;}(2)intmain(){inti=1;while(i<=3);

{printf(”%d\n”,i);i++;}return0;}結(jié)果123

結(jié)果死循環(huán)循環(huán)體空語句若把上面{、}

去掉也死循環(huán)復(fù)合語句作為循環(huán)體語句78語法格式:do語句

while(表達(dá)式);

表達(dá)式值為零時(shí),立即停止循環(huán),至少執(zhí)行一次循環(huán)語句。4.4.2用do-while語句實(shí)現(xiàn)循環(huán)分號(hào)非0循環(huán)體語句表達(dá)式式結(jié)構(gòu)流程圖當(dāng)表達(dá)式值為真循環(huán)體語句當(dāng)表達(dá)式為真N-S圖79intmain(){intk=1,n=1,sum=0;do{

sum+=n;n++;if(sum>=10)k=0;

}

while(k==1);printf(”sum=%d\n”,sum);return0;}改為while(k=1)死循環(huán)sumn0112336410結(jié)果:sum=10寫出下面程序的運(yùn)行結(jié)果

80例:用while語句和do-while語句求

傳統(tǒng)流程圖表示算法

成立不成立成立不成立不81N-S圖表示算法

>100>10082intmain(){inti,sum=0;i=1;while(i<=100){sum+=i;i++;}printf("%d\n",sum);return0;}int

main(){inti,sum=0;i=1;do{sum+=i;i++;}while(i<=100);printf("%d\n",sum);return0;}i、sum的初值為1、0i的終值為101運(yùn)行結(jié)果:5050sum=0+1sum=1+2……sum=99+10083例:計(jì)算p=1×2×3×······×nintmain(){inti,n;floatp;

scanf(”%d”,&n);

i=1;p=1;while(i<=n){p*=i;i++;}

printf(”p=%.0f\n”,p);return0;}

不用long會(huì)溢出i、p的初值為1i的終值為n+1p=1*1p=1*2……p=…*n遞推算法do{p*=i;i++;}while(i<=n);i<=n等價(jià)于i<n+184例:計(jì)算s=1!+2!+3!+······+n!(n>0)intmain(){inti,n;floats,t;scanf(”%d”,&n);

i=1;t=1;s=0;do{t*=i;s+=t;i++;}while(i<=n);printf(”s=%.0f\n”,s);return0;}

保證達(dá)到計(jì)算n次t=1×1×2×3×…S=1+1×2+1×2×3+…while(i<=n){t*=i;s+=t;i++;}

85例:統(tǒng)計(jì)從鍵盤輸入一行字符的個(gè)數(shù)。#include<stdio.h>intmain(){intn=0;printf("inputastring:\n");while(getchar()!='\n')n++;printf("%d",n);return0;}只要從鍵盤輸入的字符不是回車就繼續(xù)循環(huán)完成對(duì)輸入字符個(gè)數(shù)計(jì)數(shù)。輸入:ascdf↙

輸出:586例:計(jì)算π:#include<stdio.h>#include<math.h>intmain(){inti=1,n;doublepi=0;scanf("%d",&n);

while(i<=n){pi+=1.0/(i*i);i++;}pi=sqrt(pi*6);printf("pi=%lf\n",pi);return0;}i=1,pi=1.0;i=2,pi=1.0+1.0/(2*2);i=3,pi=1.0+1.0/(2*2)+1.0/(3*3);i=4,i<=3不滿足,停止循環(huán)改為1/(i*i)出錯(cuò),為什么?輸入387例:求π#include<math.h>intmain(){ints;floatn,t,pi;t=1;pi=0;n=1.0;s=1;

do{pi=pi+t;n=n+2;s=-s;t=s/n;}while(fabs(t)>1e-6);

pi=pi*4;printf("pi=%10.6f\n",pi);return0;}分母每次增加2單項(xiàng)的符號(hào)變化單項(xiàng)的值t=s/n

循環(huán)結(jié)束條件是運(yùn)行某一個(gè)精度:最后一項(xiàng)的值小于10-6,fabs(t)>1e-6來控制循環(huán)是否結(jié)束。881、while語句中的表達(dá)式一般是關(guān)系表達(dá)或邏輯表達(dá)式,也可以是其它表達(dá)式,只要表達(dá)式的值為真(非0)即可繼續(xù)循環(huán)。例:

intmain(){inta=0,n;printf(“\ninputn:”);scanf("%d",&n);while(n--)printf("%d",a++*2);return0;}執(zhí)行n次,每執(zhí)行1次,n減1。(a*2;a++)等價(jià)于輸入:8輸出:02468101214892、while和do-while循環(huán)比較:intmain(){intsum=0,i;scanf(“%d”,&i);

while(i<=10){sum=sum+i;i++;}printf(“sum=%d”,sum);return0;}do{sum=sum+i;i++;}while(i<=10);輸入:8sumi088917102711輸入:11sum=0sum=11903、不管是while循環(huán),還是do-while循環(huán),在循環(huán)體內(nèi)必須要有能夠改變循環(huán)條件的語句,否則將構(gòu)成死循環(huán)。4、循環(huán)條件設(shè)置要合理,否則也將構(gòu)成死循環(huán)。5、不管是while循環(huán)還是do-while循環(huán),循環(huán)體如果包含一個(gè)以上的語句,都應(yīng)以復(fù)合語句的形式出現(xiàn)。91

i=1;

sum=0;

while(i<=10)sum+=i;i=1;sum=0;

while(i<=10){sum+=i;i++;}

i=100;

sum=0;

while(i<=10){sum+=i;i++;}i為循環(huán)變量

沒有改變循環(huán)i的語句,條件一直滿足,死循環(huán)循環(huán)體,復(fù)合語句執(zhí)行到i=11停止條件不滿足,循環(huán)體語句不執(zhí)行sum為:0+11+23+3……+10924.4.3用for語句實(shí)現(xiàn)循環(huán)語法格式:

for(表達(dá)式1;表達(dá)式2;表達(dá)式3)語句要正確表達(dá)循環(huán)結(jié)構(gòu)應(yīng)注意三方面要求:1、循環(huán)控制變量的初始化。2、循環(huán)的條件。3、循環(huán)控制變量的值的更新for語句在書寫形式上集中體現(xiàn)了這三方面要求93功能:for語句完全可以取代while語句。

for(表達(dá)式1;表達(dá)式2;表達(dá)式3)語句執(zhí)行過程:1)先求解表達(dá)式1。2)求解表達(dá)式2,若其值為真(非0),則執(zhí)行for語句中指定的內(nèi)嵌語句,然后執(zhí)行第3)步;若其值為假(0),則結(jié)束循環(huán),轉(zhuǎn)到第5)步。3)求解表達(dá)式3。4)轉(zhuǎn)回第2)步繼續(xù)執(zhí)行。5)循環(huán)結(jié)束,執(zhí)行for語句下面的一個(gè)語句。94計(jì)算表達(dá)式3語句當(dāng)表達(dá)式2值非零計(jì)算表達(dá)式195例:求intmain(){inti,sum=0;i=1;do{sum+=i;i++;}

while(i<=100);

printf("%d\n",sum);return0;}intmain(){inti,sum=0;

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

printf("%d\n",sum);return0;}96例:計(jì)算p=1×2×3×······×nintmain(){inti,n;floatp;

scanf(”%d”,&n);

i=1;p=1;while(i<=n){p*=i;i++;}

printf(”p=%.f\n”,p);return0;}

for(i=1,p=1;i<=n;i++)p*=i;中間用逗號(hào)for(i=1,p=1;i<=n;p*=i,i++);97例:計(jì)算s=1!+2!+3!+······+n!(n>0)intmain(){inti,n;floats,t;

scanf(”%d”,&n);

i=1;t=1;s=0;do{t*=i;s+=t;i++;}while(i<=n);

printf(”s=%.f\n”,s);return0;}

for(i=1,

t=1,

s=0;i<=n;i++){t*=i;s+=t;}i=1;t=1;

s=0;

for(;i<=n;i++){t*=i;s+=t;}i=1;t=1;

s=0;

for(;i<=n;t*=i,s+=t,i++);

98

for語句形式:for(循環(huán)變量賦初值;循環(huán)條件;循環(huán)變量增量)語句

總是一個(gè)賦值語句,

它用來給循環(huán)控制變量賦初值總是一個(gè)表達(dá)式,它用來判別循環(huán)是否終止定義循環(huán)控制變量每循環(huán)一次后按什么方式變化這三個(gè)部分之間用“;”分開99對(duì)于for循環(huán)中語句的一般形式,

for(表達(dá)式1;表達(dá)式2;表達(dá)式3)語句就是如下的while循環(huán)形式:

表達(dá)式1;

while(表達(dá)式2)

{語句表達(dá)式3;}100例:寫出下面程序的輸出結(jié)果#include<stdio.h>intmain(){charc;for(;(c=getchar())-’#’;)putchar(c);return0;}c為’#’,值為0,結(jié)束可以是任意表達(dá)式輸入:

a56*3h#hj$↙輸出:

a56*3h101例:統(tǒng)計(jì)從鍵盤輸入一行字符的個(gè)數(shù),以回車結(jié)束。#include<stdio.h>intmain(){intn;charc;printf("Inputastring:\n");for(n=0;(c=getchar())!='\n';n++);printf("%d",n);return0;}意義是:從鍵盤輸入一個(gè)字符并賦值給變量c,將c與字符‘\n’比較,不一樣就繼續(xù)循環(huán)。完成對(duì)輸入字符個(gè)數(shù)計(jì)數(shù)

循環(huán)體是空語句

輸入:Abg23bs↙輸出:7102例:下面程序的輸出結(jié)果是[]intmain(){intx=10,y=10,i;

for(i=0;x>8;y=++i)printf(”%3d%3d”,x--,y);return0;}A.

溫馨提示

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

評(píng)論

0/150

提交評(píng)論