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

下載本文檔

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

文檔簡介

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

本章主要內(nèi)容4.1選擇結(jié)構(gòu)程序的引入4.2條件語句4.3開關(guān)語句4.4選擇結(jié)構(gòu)程序設(shè)計及實例【引例】求一元二次方程ax2+bx+c=0的根(包括實根或復(fù)根)。問題分析:本例需要根據(jù)一元二次方程ax2+bx+c=0中系數(shù)a、b、c的不同情況進(jìn)行判斷,選擇不同的計算或處理方法。4.1選擇結(jié)構(gòu)程序的引入本例具體有下列幾種情況:(1)a=0,b=0時,如果c=0,則方程為同義反復(fù);否則(即c≠0),則方程為矛盾;(2)a=0,b≠0時,方程只有一個根為:x=-c/b;(3)a≠0時,方程有兩個根:①d=b2-4ac=0時,有兩個相等的實根:

②d=b2-4ac>0時,有兩個不相等的實根:

③d=b2-4ac<0時,有兩個不相等的復(fù)根:

4.1.1問題與引例選擇結(jié)構(gòu)就是對給定條件進(jìn)行判斷,從而選擇執(zhí)行不同的執(zhí)行分支。條件的表示通常是關(guān)系表達(dá)式,也可能是邏輯表達(dá)式或一般的算術(shù)表達(dá)式。選擇結(jié)構(gòu)實現(xiàn)的方法是采用條件語句和開關(guān)選擇語句。

4.1選擇結(jié)構(gòu)程序的引入4.1.2選擇結(jié)構(gòu)的基本概念4.2條件語句條件語句if是用來判定所給定的條件是否滿足,根據(jù)判定的結(jié)果(真或假)決定執(zhí)行給出的操作,有三種形式:單分支結(jié)構(gòu)雙分支結(jié)構(gòu)多分支選擇結(jié)構(gòu)4.2.1單分支結(jié)構(gòu)1.語法格式

if(條件)語句;2.說明(1)執(zhí)行過程:

當(dāng)條件為“真”時,執(zhí)行語句;為“假”時,跳過語句,而直接執(zhí)行整個if語句后的其它語句。(2)條件中的結(jié)果為邏輯值。(3)語句如果有多條語句,要用一對花括號“{}”將其括起來,構(gòu)成為一個復(fù)合語句。#include<stdio.h>voidmain(){floata;printf("pleaseinputthescore:");scanf("%f",&a);if(a>=60&&a<=100)printf("pass\n");}【例】從鍵盤輸入學(xué)生成績并判斷是否及格,若及格輸出“pass”。單分支結(jié)構(gòu)控制流程單分支結(jié)構(gòu)舉例

【例4.1】比較a、b兩個數(shù)的大小,將較大數(shù)賦給max。方法1:#include<stdio.h>voidmain(){ inta,b,max; a=1;b=2;

if(a>b)max=a; if(a<=b)max=b; printf("%d",max);}該法思路較明確,接近我們平常的思維模式。方法2:#include<stdio.h>voidmain(){ inta,b,max; a=1;b=2;

max=a; if(a<=b)max=b; printf("%d",max);}該法的思路是:假設(shè)max=a,判斷if后的條件,如果a<b,則執(zhí)行max=b,輸出的max為b的值;如果a>b,則跳過max=b,直接輸出max為a的值。單分支結(jié)構(gòu)舉例

4.2.2雙分支結(jié)構(gòu)1.語法格式if(條件)語句1else語句22.說明(1)執(zhí)行過程:當(dāng)條件為“真”時,執(zhí)行語句1;為“假”時,執(zhí)行語句2。(2)語句1和語句2都可為復(fù)合語句。雙分支結(jié)構(gòu)的執(zhí)行

【例】從鍵盤輸入兩個整數(shù),輸出其中最大者。#include<stdio.h>voidmain(){inta,b;printf("inputthetwonumbers:");scanf("%d,%d",&a,&b);if(a>b)printf("max=%d\n",a);elseprintf("max=%d\n",b);}

單行書寫多行書寫有縮進(jìn)if(a>b)max=a;elsemax=b;if(a>b)max=a;elsemax=b;if(a>b)max=a;elsemax=b;推薦寫法,這樣層次結(jié)構(gòu)更清晰雙分支結(jié)構(gòu)的書寫

C語言書寫形式比較自由??蓪懺谝恍校部蓪懺诙嘈?。一般為了認(rèn)讀方便,特別是語句較多時,會分多行書寫,還會有縮進(jìn),以體現(xiàn)語句結(jié)構(gòu)。雙分支結(jié)構(gòu)語句可寫成下面3種形式:【例4.2】編制程序求一個數(shù)的絕對值。#include<stdio.h>voidmain(){intx,y;printf("輸入一個數(shù):");scanf("%d",&x);//輸入xif(x>=0)

//雙分支結(jié)構(gòu)

y=x;//x>=0時,把x賦給yelsey=-x;//x<0時,把-x賦給y

printf("|%d|=%d\n",x,y);//輸出x,y}4.2.3多分支結(jié)構(gòu)1.語法格式if(條件1)語句1elseif(條件2)語句2elseif(條件3)語句3……elseif(條件n)語句nelse語句n+12.執(zhí)行過程當(dāng)條件1成立時,執(zhí)行語句1;當(dāng)條件1不成立時判斷條件2;當(dāng)條件2成立時,執(zhí)行語句2;當(dāng)條件2不成立時判斷條件3;以此類推;如果一直到條件n都不成立就執(zhí)行語句n+1。

4.2.3多分支結(jié)構(gòu)注意:條件的判斷有層級關(guān)系,是在前面條件不成立的情況下才會判斷后面的條件,比如當(dāng)條件1成立后,執(zhí)行語句1,然后就直接跳出if語句,執(zhí)行后面的其它程序語句了,條件2、3等根本就不會被執(zhí)行到。【例4.3】根據(jù)考試的百分制成績輸出相應(yīng)的等級。設(shè)成績90至100分為“優(yōu)秀”,80至89分為“良好”,70至79分為“中等”,60至69分為“及格”,60分以下為“不及格”。#include<stdio.h>voidmain(){intg;printf("請輸入一個百分制成績:");scanf("%d",&g);//輸入一個成績if(g>=90)輸入一個百分制成績

printf("成績?yōu)閮?yōu)秀\n");//成績大于或等于90elseif(g>=80)printf("成績?yōu)榱己肻n");//成績小于90且大于或等于80elseif(g>=70)printf("成績?yōu)橹械萛n");//成績小于80且大于或等于70elseif(g>=60)printf("成績?yōu)榧案馶n");//成績小于70且大于或等于60elseprintf("成績?yōu)椴患案馶n");//成績小于60}【例4.4】從鍵盤輸入一個字符,并根據(jù)輸入字符的ASCII碼來判別其類型。#include<stdio.h>voidmain(){charc;printf("請輸入一個字符:");c=getchar();//輸入一個字符if(c<32)printf("這是一個控制字符\n");//ASCII碼小于32elseif(c>='0'&&c<='9')printf(“這是一個數(shù)字\n”);

//字符大于或等于'0'且小于或等于'9'elseif(c>='A'&&c<='Z')printf("這是一個大寫字母\n");//字符大于或等于'A'且小于或等于'Z'elseif(c>='a'&&c<='z')printf("這是一個小寫字母\n");//字符大于或等于'a'且小于或等于'z'elseprintf("這是一個其它字符\n");//以上四種情況都不是}4.2.4條件語句的嵌套在if語句中又包含一個或多個if語句稱為if語句的嵌套。1.語法格式if(條件) 內(nèi)嵌if語句else

內(nèi)嵌if語句可為if語句3中基本形式的任意一種可為if語句3中基本形式的任意一種2.說明(1)內(nèi)嵌形式“內(nèi)嵌的if語句”可以為前面講的三種基本形式(單分支、雙分支、多分支)中的任意一種。(2)配對關(guān)系if語句的嵌套形式中,可能會出現(xiàn)多個if和多個else重疊的情況,這時要特別注意if和else的配對問題。C語言規(guī)定:else總是與它前面最近的還沒有配對的if配對。

4.2.4條件語句的嵌套條件語句嵌套形式比較如果沒有任何縮進(jìn),應(yīng)準(zhǔn)確判斷出if和else的配對關(guān)系。比較下列正確的嵌套形式和錯誤的嵌套形式。

原型嵌套:正確理解嵌套:錯誤理解m=0;if(a<b)if(a<c)m=10;Elsem=20;printf("m=%d",m);m=0;

if(a<b)

{if(a<c)

m=10;

else

m=20;}printf("m=%d",m);m=0;

if(a<b)

{if(a<c)

m=10;}

else

m=20;

printf("m=%d",m);當(dāng)a=2;b=1;c=3;時,結(jié)果:m=0當(dāng)a=2;b=1;c=3;時,結(jié)果:m=0當(dāng)a=2;b=1;c=3;時,結(jié)果:m=20當(dāng)a=2;b=3;c=1;時,結(jié)果:m=20當(dāng)a=2;b=3;c=1;時,結(jié)果:m=20當(dāng)a=2;b=3;c=1;時,結(jié)果:m=0當(dāng)a=1;b=2;c=3;時,結(jié)果:m=10當(dāng)a=1;b=2;c=3;時,結(jié)果:m=10當(dāng)a=1;b=2;c=3;時,結(jié)果:m=10【例4.5】比較兩個數(shù)的大小關(guān)系。#include<stdio.h>voidmain(){inta,b;printf("請輸入a,b:");scanf("%d,%d",&a,&b);//輸入a、b的值

if(a!=b)//在if與else之間嵌套一個雙分支結(jié)構(gòu)

if(a>b)printf("a大于b\n");//a不等于b時,a大于belseprintf("a小于b\n");//a不等于b時,a小于belseprintf("a等于b\n");//a不等于b條件不成立時,即a等于b}1.在三種形式的if語句中,在if關(guān)鍵字之后均為表達(dá)式。該表達(dá)式通常是邏輯表達(dá)式或關(guān)系表達(dá)式,但也可以是其它表達(dá)式,如賦值表達(dá)式等,甚至也可以是一個變量。

main(){inta=2,b=3;if(a=b)printf("%d",a);

if(3)printf("OK");if(’a’)printf("%d",’a’);}3OK974.2.5條件語句使用注意點(diǎn)2.在if語句中,條件判斷表達(dá)式必須用括號括起,在語句之后必須加分號。3.在if語句的三種形式中,所有的語句應(yīng)為單個語句,如果要想在滿足條件時執(zhí)行一組(多個)語句,則必須把這一組語句用“{}”括起來組成一個復(fù)合語句。但要注意的是在“}”之后不能再加分號。例如:

if(a>b){a++;b++;}else{a=0;b=10;}4.2.5條件語句使用注意點(diǎn)4.3.1開關(guān)語句的一般形式4.3開關(guān)語句switch(表達(dá)式){case常量表達(dá)式1:[語句序列1];[break;]case常量表達(dá)式2:[語句序列2];[break;]…case常量表達(dá)式n:[語句序列n];[break;][default:語句序列]}

首先計算switch后面表達(dá)式的值,然后進(jìn)行判斷:當(dāng)表達(dá)式的值與某一個case后面的常量表達(dá)式的值相等時,就執(zhí)行此case后面的語句;如果遇到break語句,就結(jié)束整個switch語句;若所有的case中的常量表達(dá)式的值都沒有與表達(dá)式的值匹配的,就執(zhí)行default后面的語句。4.3.2開關(guān)語句的執(zhí)行4.3開關(guān)語句(1)switch后括號內(nèi)的表達(dá)式,為任意復(fù)合C語言語法規(guī)則的表達(dá)式,但其值只能是整型或字符型。(2)每個case只能列舉一個整型常量或一個字符常量。(3)每個case后的常量表達(dá)式的值必須互不相同,否則就會出現(xiàn)互相矛盾的現(xiàn)象。(4)語句執(zhí)行時碰到break才會停止,否則從執(zhí)行處接著往后執(zhí)行,不會再判斷條件。(5)“default”和各個“case”出現(xiàn)的次序不影響執(zhí)行結(jié)果;如果不需要,default可省略不寫。4.3開關(guān)語句開關(guān)語句的使用注意點(diǎn)【例4.6】根據(jù)學(xué)生考試成績的等級輸出相應(yīng)的百分制分?jǐn)?shù)段。算法分析:

設(shè)學(xué)生的考試成績分為五個等級。等級A表示90~100分,等級B表示80~89分,等級C表示70~79分,等級D表示60~69分,等級E表示0~59分。本例共有5種情況,使用switch語句實現(xiàn)很方便。4.4選擇結(jié)構(gòu)程序設(shè)計及舉例#include<stdio.h>voidmain(){charg;printf("請輸入學(xué)生考試成績的等級:");scanf("%c",&g);//輸入一個考試成績的等級

switch(g){case'A'://考試成績的等級為'A'時printf("90~100分\n");case'B'://考試成績的等級為'B'時printf("80~89分\n");case'C'://考試成績的等級為'C'時printf("70~79分\n");case'D'://考試成績的等級為'D'時printf("60~69分\n");default://考試成績的等級不為'A'、'B'、'C'、'D'、時

printf("60分以下\n");

}}break;break;break;break;【例4.7】輸入一個1~7之間的數(shù)字,輸出這個數(shù)字是對應(yīng)的星期幾。#include<stdio.h>voidmain(){inta;printf("輸入一個整數(shù):");scanf("%d",&a);//輸入一個整數(shù)switch(a){ case1:printf("星期一\n");break;//a的值為1時 case2:printf("星期二\n");break;//a的值為2時 case3:printf("星期三\n");break;//a的值為3時 case4:printf("星期四\n");break;//a的值為4時 case5:printf("星期五\n");break;//a的值為5時 case6:printf("星期六\n");break;//a的值為6時 case7:printf("星期日\n");break;//a的值為7時 default:printf(“輸入錯誤!\n”);//以上七種情況都不是}}

break:跳出swi

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論