第4章順序和選擇結(jié)構(gòu)程序設(shè)計(jì)_第1頁(yè)
第4章順序和選擇結(jié)構(gòu)程序設(shè)計(jì)_第2頁(yè)
第4章順序和選擇結(jié)構(gòu)程序設(shè)計(jì)_第3頁(yè)
第4章順序和選擇結(jié)構(gòu)程序設(shè)計(jì)_第4頁(yè)
已閱讀5頁(yè),還剩50頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第4章順序和選擇結(jié)構(gòu)程序設(shè)計(jì)

4.1結(jié)構(gòu)化程序設(shè)計(jì)

4.2語(yǔ)句與分程序

4.3

順序結(jié)構(gòu)程序設(shè)計(jì)4.4

選擇結(jié)構(gòu)程序設(shè)計(jì)4.5switch語(yǔ)句4.6條件運(yùn)算符4.7程序舉例

4.1結(jié)構(gòu)化程序設(shè)計(jì)(1)順序結(jié)構(gòu)順序結(jié)構(gòu)就是一組逐條執(zhí)行的可執(zhí)行語(yǔ)句。按照書寫順序,自上而下的執(zhí)行。(2)選擇結(jié)構(gòu)(分支結(jié)構(gòu))選擇結(jié)構(gòu)是一種先對(duì)給定條件進(jìn)行判斷,并根據(jù)判斷的結(jié)果執(zhí)行相應(yīng)命令的結(jié)構(gòu)。

(3)循環(huán)結(jié)構(gòu)循環(huán)結(jié)構(gòu)是指多次重復(fù)執(zhí)行同一組命令的結(jié)構(gòu)。具有循環(huán)結(jié)構(gòu)的程序一般必須指定循環(huán)的終止條件,以便對(duì)程序的循環(huán)進(jìn)行有效的控制,以免進(jìn)入無(wú)限循環(huán)(或稱死循環(huán))的狀態(tài)。

C程序的執(zhí)行部分由執(zhí)行語(yǔ)句構(gòu)成。執(zhí)行語(yǔ)句的種類

表達(dá)式語(yǔ)句

函數(shù)調(diào)用語(yǔ)句

控制語(yǔ)句

復(fù)合語(yǔ)句(或稱分程序)

空語(yǔ)句

4.2語(yǔ)句與分程序

最簡(jiǎn)單的可執(zhí)行語(yǔ)句。只要在表達(dá)式后面加上分號(hào)就可以了。例如:++i;x=y;

有效的表達(dá)式語(yǔ)句一般都要有賦值運(yùn)算,否則,不做任何賦值運(yùn)算的表達(dá)式大多數(shù)是無(wú)意義的。

表達(dá)式語(yǔ)句

函數(shù)調(diào)用語(yǔ)句由函數(shù)名、實(shí)際參數(shù)以及分號(hào)構(gòu)成。例如:printf("welcome");printf是函數(shù)名,“welcome”是實(shí)際參數(shù)。函數(shù)名既可以是C語(yǔ)言提供的庫(kù)函數(shù)名,也可以是我們自己定義的函數(shù)名。

控制語(yǔ)句控制語(yǔ)句是用于控制程序流程的語(yǔ)句,控制語(yǔ)句一般指那些改變了順序結(jié)構(gòu)的語(yǔ)句。

C語(yǔ)言的控制語(yǔ)句分支語(yǔ)句(if和switch)

循環(huán)語(yǔ)句(while、do-while、for)

轉(zhuǎn)向語(yǔ)句(break、goto、continue、return)。

熟練掌握控制語(yǔ)句是學(xué)會(huì)程序設(shè)計(jì)的基礎(chǔ)。

復(fù)合語(yǔ)句和分程序結(jié)構(gòu)復(fù)合語(yǔ)句是用{和}把數(shù)據(jù)說(shuō)明語(yǔ)句和若干個(gè)有序的執(zhí)行語(yǔ)句組合在一起而構(gòu)成。其一般格式為{[數(shù)據(jù)說(shuō)明];[語(yǔ)句];}復(fù)合語(yǔ)句在語(yǔ)法上相當(dāng)于一個(gè)簡(jiǎn)單語(yǔ)句,在程序中可以作為一個(gè)獨(dú)立語(yǔ)句來(lái)看待,因此又稱為分程序。

空語(yǔ)句

C語(yǔ)言中有一個(gè)很特殊的語(yǔ)句,即空語(yǔ)句。空語(yǔ)句,顧名思義,就是什么也不存在的語(yǔ)句,只有一個(gè)分號(hào):;盡管空語(yǔ)句不會(huì)有任何命令執(zhí)行,但仍然是一個(gè)有用的語(yǔ)句。常用于循環(huán)語(yǔ)句中,使循環(huán)體為空。例如:for(sum=0,i=0;i<=9;i++;sum=sum+i);

4.3順序結(jié)構(gòu)程序設(shè)計(jì)

順序程序設(shè)計(jì)的步驟可以歸納為:(1)用預(yù)處理命令包含文件或進(jìn)行宏定義(不是必須的,根據(jù)具體情況);(2)定義變量(分配內(nèi)存空間);(3)為變量賦初值(可以用賦值語(yǔ)句或輸入函數(shù));(4)計(jì)算;(5)輸出結(jié)果(用輸出函數(shù))。

例4.1編寫程序,輸入x和y,交換它們的值,并輸出交換前后的數(shù)。#include“stdio.h“/*方法一*/voidmain(){

intx,y,temp;

printf("Pleaseinputtointnumber:");scanf("%d%d",&x,&y);printf("\nbeforechangedx=%3dy=%3d",x,y);temp=x;x=y;y=temp;printf("\nafterchangedx=%3dy=%3d",x,y);}

#include"stdio.h"voidmain()/*方法二(注意適用條件)*/{

intx,y;printf("Pleaseinputtointnumber:");scanf("%d%d",&x,&y);printf("\nbeforechangedx=%3dy=%3d",x,y);x=x+y;y=x-y;x=x-y;printf("\nafterchangedx=%3dy=%3d",x,y);}

4.4選擇結(jié)構(gòu)程序設(shè)計(jì)

4.4.1問(wèn)題的提出

4.4.2if形式

4.4.3ifelse形式

4.4.4elseif形式

4.4.5嵌套的if語(yǔ)句

4.4.1問(wèn)題的提出

用數(shù)學(xué)公式可以這樣描述:

xx>=0y=-xx<0y是x的絕對(duì)值,如果x大于等于0,絕對(duì)值就是x自己;否則,絕對(duì)值就是取x的負(fù)值。這個(gè)數(shù)學(xué)問(wèn)題用順序結(jié)構(gòu)是不能解決的,因?yàn)橐鶕?jù)x的值的不同,做不同的動(dòng)作。只有用選擇結(jié)構(gòu)才能解決問(wèn)題。

4.4.2if形式

if形式是最簡(jiǎn)單的條件語(yǔ)句。語(yǔ)法:if(表達(dá)式)語(yǔ)句1;下一條語(yǔ)句;功能:檢測(cè)表達(dá)式,如果表達(dá)式的值為非0(真),則執(zhí)行語(yǔ)句1,然后執(zhí)行下一條語(yǔ)句;如果表達(dá)式的值為0(假),直接執(zhí)行下一條語(yǔ)句。條件表達(dá)式

注意:(1)表達(dá)式必須用圓括號(hào)括起來(lái),不能省略。(2)表達(dá)式可以使用關(guān)系表達(dá)式,例如if(x>10)表示如果x大于10;也可以使用邏輯運(yùn)算符連接關(guān)系表達(dá)式,例如,if(a>b)&&(b==c);還可以是一般的表達(dá)式,甚至是一個(gè)常量或一個(gè)變量,例如,if(x)和if(checkstate())只要x或checkstate()的值為非0,表達(dá)式即為真。

例4.2使用if形式編寫程序:輸入x,求出并輸出x的絕對(duì)值。

#include"stdio.h"/*----------------------abs(x)--------------------------*/voidmain(){intx;scanf("%d",&x);if(x<0)x=-x;printf("|x|=%d\n",x);}

例4.3使用if形式編寫程序:若a>b將兩個(gè)數(shù)的位置調(diào)換;否則,保持不變。#include"stdio.h"/*-------------swapaandb-------------------------*/voidmain(){inta,b;scanf("%d%d",&a,&b);

if(a>b)

{

a=a+b;b=a-b;a=a-b;}

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

例4.4請(qǐng)判斷下面程序的執(zhí)行結(jié)果,并解釋該程序的功能。#include"stdio.h"voidmain(){inta=10,b=20,x;

x=a;if(a<b)x=b;printf("%d\n",x);}

4.4.3ifelse形式

ifelse形式的語(yǔ)法是:if(表達(dá)式)語(yǔ)句1;else

語(yǔ)句2;下一條語(yǔ)句;功能:檢測(cè)表達(dá)式,如果值為非0(真),則執(zhí)行語(yǔ)句1,然后執(zhí)行下一條語(yǔ)句;如果值為0(假),執(zhí)行語(yǔ)句2,再執(zhí)行下一條語(yǔ)句。

例4.5解決求商的問(wèn)題。#include"stdio.h"/*--------------adividedbyb---------------------*/voidmain(){inta,b;scanf("%d%d",&a,&b);if(b==0) printf("Dividedbyzero\n");else

printf("%f",1.0*a/b);}

例4.6:將輸入字符的大寫字符轉(zhuǎn)換成小寫字符輸出,小寫字符原樣輸出。#include"stdio.h"/*-------------------lowercase--------------------------*/voidmain(){intc;

c=getchar();

if(c>='A'&&c<='Z')putchar(c+32);else

putchar(c);}

例4.7

請(qǐng)判斷下面程序的執(zhí)行結(jié)果。#include"stdio.h"voidmain(){inta=30,b=20,x;

if(a>b){x=a; printf("%d\n",a);}else

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

4.4.4elseif形式

例如我們要解決這樣一個(gè)問(wèn)題:輸入一個(gè)整數(shù),根據(jù)輸入值,輸出數(shù)的范圍屬于大于0、小于0還是等于0。

x的范圍實(shí)際上是三種情況,我們先用ifelse解決這個(gè)問(wèn)題:

if(x==0)printf("x=0");else{if(x<0)printf("x<0");else

printf("x>0");}

elseif的語(yǔ)法:if(表達(dá)式1)語(yǔ)句1;

elseif(表達(dá)式2)語(yǔ)句2;[elseif(表達(dá)式3)語(yǔ)句3;]…[elseif(表達(dá)式n)語(yǔ)句n;][else語(yǔ)句n+1;]

一條語(yǔ)句;

功能:按表達(dá)式的順序進(jìn)行判斷,最早值為真的表達(dá)式將引起執(zhí)行相應(yīng)語(yǔ)句i,并且不再繼續(xù)判斷其它條件,跳轉(zhuǎn)到下一條語(yǔ)句執(zhí)行。若全部表達(dá)式為假,則執(zhí)行語(yǔ)句n+1。if(x>0)

printf("x=0");elseif(x<0)

printf("x<0");else

printf("x>0");

例4.8根據(jù)輸入的百分制按五分制的成績(jī)輸出。百分制與五分制之間的關(guān)系見下表。百分制五分制90~100580~89460~7930~592

#include"stdio.h"voidmain(){intscore;chargrade;

printf(“pleaseinputscore:”);/*請(qǐng)輸入分?jǐn)?shù)*/

scanf("%d",&score);

if(score>89)grade='5';

elseif(score>79)grade='4';

elseif(score>59)grade='3';

elsegrade='2';

printf("gradeis%c",grade);}

4.4.5嵌套的if語(yǔ)句

修改例4.8,排除不可能的分?jǐn)?shù)。#include"stdio.h"voidmain(){intscore;chargrade;

printf("pleaseinputscore:");

scanf("%d",&score);if(score>=0&&score<=100){

if(score>89)grade='5';

elseif(score>79)grade='4';elseif(score>59)grade='3';

elsegrade='2';printf("gradeis%c",grade);}else

printf("dataerror\007\n");}

if(表達(dá)式1){if(表達(dá)式2)語(yǔ)句1;}else

語(yǔ)句2;if(表達(dá)式1)&&(表達(dá)式2)語(yǔ)句1;if(!表達(dá)式1)語(yǔ)句2;

if(表達(dá)式1){if(表達(dá)式2)語(yǔ)句1;

else

語(yǔ)句2;}if(表達(dá)式1)&&(表達(dá)式2)語(yǔ)句1;if(表達(dá)式1)&&(!表達(dá)式2)語(yǔ)句2;

if(表達(dá)式1)

if(表達(dá)式2)

語(yǔ)句1;

else

語(yǔ)句2

else到底與哪個(gè)if結(jié)合呢?因?yàn)檫@時(shí)有兩種可能,這就產(chǎn)生了所謂的二義性。C語(yǔ)言規(guī)定:else與離它最近的if結(jié)合。

例4.9輸入一個(gè)數(shù),若該數(shù)為正整數(shù)并且是偶數(shù),打印“是正的偶數(shù)”,否則打印“非正整數(shù)”。#include“stdio.h”voidmain(){

intx;

printf("Pleaseinputoneinteger:");

scanf("%d",&x);if(x>0){if(x%2==0) printf("positiveandeven\n");}else

printf("notpositive\n");}

輸入一個(gè)數(shù),若該數(shù)為正整數(shù)并且是偶數(shù),打印“是正的偶數(shù)”,否則打印“正整數(shù)并且是奇數(shù)”。#include“stdio.h”voidmain(){intx;printf("Pleaseinputoneinteger:");scanf("%d",&x);if(x>0)

if(x%2==0) printf("positiveandeven\n");else

printf("positiveandodd\n");}4.5switch語(yǔ)句

switch語(yǔ)句屬于多路分支結(jié)構(gòu)。switch的常用形式:switch(條件表達(dá)式){case常量表達(dá)式1:語(yǔ)句1;break;case常量表達(dá)式2:語(yǔ)句2;break;

case常量表達(dá)式3:語(yǔ)句3;break;…case常量表達(dá)式n:語(yǔ)句n;break;default語(yǔ)句n+1;[break;]}功能:首先計(jì)算條件表達(dá)式的值,然后找到與其相等的常量表達(dá)式的case分支去執(zhí)行語(yǔ)句,然后退出switch語(yǔ)句,若沒(méi)有與條件表達(dá)式相等的常量表達(dá)式,則執(zhí)行default語(yǔ)句后面的語(yǔ)句n+1。default語(yǔ)句可省略。若語(yǔ)句i后不含break,繼續(xù)執(zhí)行下一條語(yǔ)句i+1,不用判斷常量表達(dá)式。

功能:首先計(jì)算條件表達(dá)式的值,然后找到與其相等的常量表達(dá)式的case分支去執(zhí)行語(yǔ)句,然后退出switch語(yǔ)句,若沒(méi)有與條件表達(dá)式相等的常量表達(dá)式,則執(zhí)行default語(yǔ)句后面的語(yǔ)句n+1。default語(yǔ)句可省略。若語(yǔ)句i后不含break,繼續(xù)執(zhí)行下一條語(yǔ)句i+1,不用判斷常量表達(dá)式。

注意:(1)case分支中的語(yǔ)句i后面的break語(yǔ)句一般情況下不要省略,因?yàn)闆](méi)有break語(yǔ)句,程序不能跳出switch語(yǔ)句,而是執(zhí)行下一條case語(yǔ)句后面的語(yǔ)句,直到遇到break才能終止switch的執(zhí)行。switch(s){case'+':a=a+b;case'-':a=a*b;break;case'*':a=a-b;break;case'/':a=a/b;break}(2)條件表達(dá)式和常量表達(dá)式的數(shù)據(jù)類型必須一致,常量表達(dá)式中不能包含變量。實(shí)際上,switch語(yǔ)句的重點(diǎn)就在于如何構(gòu)造條件表達(dá)式,并讓它的值正好能夠匹配n個(gè)常量表達(dá)式的值。(3)多個(gè)case可以共同使用相同的語(yǔ)句i。switch(s){case1:case2:case4:case5:printf("%d",x);break;}

(4)每個(gè)常量表達(dá)式應(yīng)不相等,因?yàn)樗愃朴谡Z(yǔ)句標(biāo)號(hào)的作用,case部分與default的順序可自由書寫。若每個(gè)case后包含break,則順序不影響最后的執(zhí)行結(jié)果。反之,則有可能影響執(zhí)行結(jié)果s=2;switch(s){case1:printf("1");break;case2:printf("2");break;case3:printf("3");break;}結(jié)果?

switch(s){case1:printf("1");case2:printf("2");case3:printf("3");}結(jié)果??(5)語(yǔ)句i可以用復(fù)合語(yǔ)句,而且允許省略花括號(hào){}。(6)switch語(yǔ)句可以嵌套,即在一個(gè)switch語(yǔ)句中嵌套另一個(gè)switch語(yǔ)句,但是要注意break只能跳出最內(nèi)層的switch語(yǔ)句。例4.11用switch完成:根據(jù)輸入的百分制按五分制的成績(jī)輸出。#include"stdio.h"voidmain(){intscore,s,sum;chargrade;

printf("pleaseinputscore:");

scanf("%d",&score);if(score>=0&&score<=100){

s=score/10;

switch(s)

{case0:case1:case2:case3:case4:

case5:grade='2';break;

case6:case7:grade='3';break;

case8:grade='4';break; case9:case10:grade='5';break;}

printf("grade=%c\n",grade);}else

printf("dataerror!\n");}例4.11

根據(jù)輸入字符(0到F,用%c接收)顯示與該字符所表示的十六進(jìn)制數(shù)相對(duì)應(yīng)的十進(jìn)制數(shù)。(例如輸入A,輸出10;輸入0,輸出0。)#include"stdio.h"voidmain(){chari;

printf("\npleaseinput0~F:");scanf("%c",&i);switch(i){

case'0':case'1':case'2':case'3':case'4':case'5':case'6':case'7':case'8':case'9':

printf("\n%d",i-'0');break;case'A':case'a':printf("\n%d",10);break;case'B':case'b':printf("\n%d",11);break;case'C':case'c':printf("\n%d",12);break;case'D':case'd':printf("\n%d",13);break;case'E':case'e':printf("\n%d",14);break;case'F':case'f':printf("\n%d",15);break;default:printf("errordata");}}

C語(yǔ)言中提供的唯一的一個(gè)三目運(yùn)算符就是條件運(yùn)算符“?:”,它的運(yùn)算對(duì)象有三個(gè)。條件運(yùn)算符的語(yǔ)法格式是:

表達(dá)式1?表達(dá)式2:表達(dá)式3

由條件運(yùn)算符與操作數(shù)構(gòu)成的表達(dá)式也可以稱為條件表達(dá)式。包括了條件運(yùn)算符的條件表達(dá)式的計(jì)算方法是:首先計(jì)算表達(dá)式1的值,若表達(dá)式1為真,條件表達(dá)式的解取表達(dá)式2的值,表達(dá)式1為假,條件表達(dá)式的解取表達(dá)式3的值。4.6條件運(yùn)算符

例4.12將輸入的字母小寫變大寫。#include"stdio.h"#include"string.h"voidmain(){charc;puts("pleaseinputonechar:");c=getchar();c=(c<='z'&&c>='a'?(c+'A'-'a'):c);

putchar(c);

putchar('\n');}例4.13用條件表達(dá)式求三個(gè)整數(shù)中的最大數(shù)。#include"stdio.h"/*max*/voidmain(){

inta,b,c;

printf("Pleaeinputthreeint:");

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

printf("\nMaxis%d"\,((a>b?a:b)>c)?(a>b?a:b):c);}我國(guó)的個(gè)人所得稅稅率表:4.7程序舉例

例4.14全月應(yīng)納稅所得額=月收入-800。例如某人月收入1320,減去800元,全月應(yīng)納稅所得額為520元,由稅率表知,其中500元稅率為5%,另20元的稅率為10%,所以此人應(yīng)納個(gè)人所得稅27元。voidmain(){

doublesalary,s,tax;

printf("pleaseinputyoursalaryonemonth:");

scanf("%lf",&salary);s=salary-800;if(s<=500)

tax=s*0.05;elseif(s<=2000)

tax=(s-500)*0.1+500*0.05;elseif(s<=5000)tax=(s-2000)*0.15+1500*0.1+500*0.05;

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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)論