c語(yǔ)言順序和選擇結(jié)構(gòu)程序設(shè)計(jì)_第1頁(yè)
c語(yǔ)言順序和選擇結(jié)構(gòu)程序設(shè)計(jì)_第2頁(yè)
c語(yǔ)言順序和選擇結(jié)構(gòu)程序設(shè)計(jì)_第3頁(yè)
c語(yǔ)言順序和選擇結(jié)構(gòu)程序設(shè)計(jì)_第4頁(yè)
c語(yǔ)言順序和選擇結(jié)構(gòu)程序設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩54頁(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.1.1結(jié)構(gòu)化程序設(shè)計(jì)思想的產(chǎn)生

結(jié)構(gòu)化程序設(shè)計(jì)思想:圍繞系統(tǒng)功能自頂向下,逐步細(xì)化和精化。細(xì)化過(guò)程:對(duì)系統(tǒng)功能逐層分解出許多易于理解和實(shí)現(xiàn)的、邏輯上相對(duì)獨(dú)立的子功能,形成一棵功能樹。

4.1.2

結(jié)構(gòu)化程序設(shè)計(jì)的三種基本結(jié)構(gòu)

(順序結(jié)構(gòu))(選擇結(jié)構(gòu))(循環(huán)結(jié)構(gòu))實(shí)例說(shuō)明三種結(jié)構(gòu)接通電源啟動(dòng)電腦玩游戲(順序結(jié)構(gòu))拋硬幣正面朝上上自習(xí)真看影碟假門沒(méi)開真假按門鈴(循環(huán)結(jié)構(gòu))(選擇結(jié)構(gòu))1.控制語(yǔ)句––改變語(yǔ)句的執(zhí)行順序共有9種控制語(yǔ)句:

if()~else~(條件)

for()~(循環(huán))

while()~(循環(huán))

do~while(循環(huán))4.2語(yǔ)句與分程序C程序的執(zhí)行部分由執(zhí)行語(yǔ)句構(gòu)成,執(zhí)行語(yǔ)句的種類主要有:控制語(yǔ)句、函數(shù)調(diào)用語(yǔ)句、表達(dá)式語(yǔ)句、空語(yǔ)句、復(fù)合語(yǔ)句(分程序)等。

continue(結(jié)束本次循環(huán))

switch(多分支選擇)

break(中止整個(gè)循環(huán))

goto(轉(zhuǎn)移)

return(函數(shù)返回)()表示條件,~表示語(yǔ)句2.函數(shù)調(diào)用語(yǔ)句3.表達(dá)式語(yǔ)句函數(shù)調(diào)用語(yǔ)句由函數(shù)名、實(shí)際參數(shù)以及分號(hào)構(gòu)成。eg:printf(“hello");表達(dá)式加;如:i=i+1;i++;

x+y;

其函數(shù)調(diào)用也可理解為表達(dá)式語(yǔ)句.5.復(fù)合語(yǔ)句4.空語(yǔ)句

;任何事情都不做.用{}括起來(lái)的一系列語(yǔ)句。如:{z=x+y;t=z/100;printf("%f",t);}順序結(jié)構(gòu)流程圖:表示ABAB先執(zhí)行A,再執(zhí)行B.4.3順序結(jié)構(gòu)程序設(shè)計(jì)特點(diǎn):程序按語(yǔ)句從上到下的排列順序依此執(zhí)行,每條語(yǔ)句必須執(zhí)行且只能執(zhí)行一次,沒(méi)有執(zhí)行不到或執(zhí)行多次的語(yǔ)句。順序程序設(shè)計(jì)的步驟為:(1)用預(yù)處理命令包含文件或進(jìn)行宏定義;(2)定義變量;(3)為變量賦初值(用輸入函數(shù)或賦值語(yǔ)句);(4)計(jì)算;(5)輸出結(jié)果(用輸出函數(shù))順序程序設(shè)計(jì)的步驟順序結(jié)構(gòu)程序舉例例4-1:已知圓柱體半徑6米,高7米,求體積。分析:輸入量:底面半徑高輸出量:體積假設(shè):用變量r表示半徑變量h表示高 變量s表示底面積變量v表示體積中間的處理過(guò)程:

s=PI*r*r;v=s*h;

都是實(shí)型數(shù)據(jù)例4-1程序流程:#include“stdio.h”#definePI3.14159main(){floatr,h,s,v;r=6;h=7;s=PI*r*r;v=s*h;

printf(“V=%f\n”,v);}整個(gè)程序的流程:定義4個(gè)實(shí)型變量r,h,v,s給半徑r和高h(yuǎn)賦值S=PI*r*r;V=s*h;輸出體積v和側(cè)面積s例4-2

輸入三角形的三條邊,求三角形的面積。分析:已知∶三角形的三條邊a,b,c。

求解∶三角形的面積area。

計(jì)算公式∶設(shè)s=(a+b+c)/2area=開始給a,b,c賦值計(jì)算s=(a+b+c)/2計(jì)算area=結(jié)果輸出結(jié)束#include<math.h>main(){floata,b,c,s,area;

scanf(“%f%f%f”,&a,&b,&c);s=(a+b+c)/2.0;area=sqrt(s*(s-a)*(s-b)*(s-c));

printf(“a=%fb=%fc=%fs=%f”,a,b,c,s);

printf(“area=%f”,area);}例4-3從鍵盤輸入一個(gè)大寫字母,要求改用小寫字母輸出。分析:已知∶字符變量c1為大寫字母。求解∶將字符變量c2中放入相應(yīng)的小寫字母。計(jì)算公式∶c2=c1+32(小寫改成大寫字母?)開始計(jì)算c2=c1+32輸出c1結(jié)束輸入一大寫字母放入c1中輸出c2#include<stdio.h>main(){charc1,c2;c1=getchar();

/*鍵盤輸入一個(gè)大寫字母*/

printf(“%c,%d\n”,c1,c1);c2=c1+32;printf(“%c,%d\n”,c2,c2);}輸入:A

輸出:A,65

a,97

例4-4求ax2+bx+c=0的根,a,b,c由鍵盤輸入,設(shè)b2-4ac>0#include<math.h>main(){floata,b,c,delta,x1,x2,p,q;

scanf("%f%f%f",&a,&b,&c);delta=b*b-4*a*c;p=-b/(2*a);q=sqrt(delta)/(2*a);x1=p+q;x2=p-q;printf(”x1=%fx2=%f",x1,x2);}運(yùn)行情況:a=1,b=3,c=2x1=-1.000000x2=-2.0000004.4選擇結(jié)構(gòu)程序設(shè)計(jì)選擇結(jié)構(gòu)程序設(shè)計(jì)就是通過(guò)判斷從兩種或兩種以上的可能中確定問(wèn)題的解。書寫語(yǔ)句之前,應(yīng)首先確定要判斷的是什么條件,以及當(dāng)判斷結(jié)果為不同的情況(“真”或“假”)時(shí)應(yīng)該執(zhí)行什么樣的操作。1if的三種形式功能:

當(dāng)表達(dá)式值非0時(shí),執(zhí)行語(yǔ)句A,否則不執(zhí)行語(yǔ)句A.表達(dá)式語(yǔ)句A=00形式1

if(表達(dá)式)

語(yǔ)句A其流程圖:4.4.2

if語(yǔ)句如:

intx;

scanf(“%d”,&x);if(x<0) x=-x;

printf(“%d”,x);如:

if(3)prinft("o.k");if('a')…1.表達(dá)式可以是邏輯、關(guān)系,甚至是算術(shù)表達(dá)式。

2.上述形式中的語(yǔ)句必須以分號(hào)結(jié)束

3.上述形式中的語(yǔ)句可以是由{}括起來(lái)的復(fù)合語(yǔ)句。此時(shí),在{}外可以不用分號(hào).注意的問(wèn)題:形式2

if(表達(dá)式)

語(yǔ)句Aelse

語(yǔ)句B功能:

表達(dá)式為非0,

執(zhí)行語(yǔ)句A

表達(dá)式為0,

執(zhí)行語(yǔ)句B表達(dá)式語(yǔ)句A語(yǔ)句B0=0例:

if(x>y) printf("%d",x); elseprintf("%d",y);書寫語(yǔ)句之前,應(yīng)首先確定要判斷的是什么條件,以及當(dāng)判斷結(jié)果為不同的情況(“真”或“假”)時(shí)應(yīng)該執(zhí)行什么樣的操作。例4-5:編程求

x2+3x-1(x<=3)Y=x2-2x+5(x>3)顯然,這應(yīng)該是一個(gè)分支結(jié)構(gòu)的程序。它要根據(jù)x的不同取值范圍,求得不同的y。判斷條件:x<=3嗎?結(jié)構(gòu)如下:如果x<=3那么y=x*x+3*x-1否則y=x*x-2*x+5用c語(yǔ)言表示:

if(x<=3)

y=x*x+3*x-1;else y=x*x-2*x+5;輸入輸出分析:輸入:x輸出:y變量類型:?jiǎn)尉葘?shí)型流程圖開始輸入xX<=3?Y=x*x-2*x+5Y=x*x+3*x-1輸出y結(jié)束YN程序4-5.c:Main(){ floatx,y;

printf(“inputx:”);

scanf(“%f”,&x); if(x<=3) y=x*x+3*x-1; else y=x*x-2*x+5;

printf(“y=%f”,y);}注意程序的書寫采用縮進(jìn)式,也稱為鋸齒形書寫格式。例4-6:求最大或最小值main(){

inta,b,c,max;

printf("inputa,b,c=");

scanf("%d,%d,%d",&a,&b,&c); if(a>b) max=a; else max=b; if(c>max) max=c;

printf("maxis:%d\n",max);}這是一種常見的求最大最小值的方法。增加變量,通常取名為max或min,用于存放最大或最小值.把a(bǔ),b的最大值放到max中如果c大于max,則把c放到max中練習(xí):任意輸入3個(gè)整數(shù),找出最小的一個(gè)。main(){

inta,b,c,min;

printf("inputa,b,c=");

scanf("%d,%d,%d",&a,&b,&c); if(a<b) min=a; else min=b; if(c<min) min=c;

printf("minis:%d\n",min);}main(){

inta,b,c,t;

printf("inputa,b,c=");

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("%5d%5d%5d\n",a,b,c);}滿足條件,就需要執(zhí)行多條語(yǔ)句,則必須用{}把這些語(yǔ)句括起來(lái),成為復(fù)合語(yǔ)句例4-7:任意輸入3個(gè)整數(shù),按從小到大的順序輸出形式3

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

elseif(表達(dá)式2)語(yǔ)句2elseif(表達(dá)式3)語(yǔ)句3……elseif(表達(dá)式n)語(yǔ)句nelse語(yǔ)句n+1下一條語(yǔ)句功能:按表達(dá)式的順序進(jìn)行判斷,最早值為真的表達(dá)式n將引起相應(yīng)語(yǔ)句n的執(zhí)行,并且不再判斷其他條件,跳轉(zhuǎn)到下一條語(yǔ)句執(zhí)行。若全部表達(dá)式為假,則執(zhí)行語(yǔ)句n+1。流程:表達(dá)1表達(dá)2表達(dá)3表達(dá)n語(yǔ)句1語(yǔ)句2語(yǔ)句3語(yǔ)句n語(yǔ)句n+1語(yǔ)句1……0=0=0000例4-8

對(duì)學(xué)生成績(jī)的判斷:分?jǐn)?shù)小于60是“不及格”,否則,小于70是“及格”;否則,小于80是“中”;否則,小于90是“良”,否則是“優(yōu)秀”。用如下程序表示:#include"stdio.h"main(){intscore;scanf("%d",&score);if(score<60)printf("不及格");

elseif(score<70) printf("及格");

elseif(score<80) printf("中");

elseif(score<90) printf("良");

else

printf("優(yōu)秀");}4.4.3.if語(yǔ)句的嵌套if(表達(dá)式1)內(nèi)嵌ifelse內(nèi)嵌注意:else與最近的if配對(duì).一般形式在上述形式的if語(yǔ)句中,又可以是if語(yǔ)句–––稱為嵌套。if(表達(dá)式2)語(yǔ)句1if(表達(dá)式3)語(yǔ)句3else語(yǔ)句2else語(yǔ)句4例:

if()if()語(yǔ)句2else語(yǔ)句3if(){if()語(yǔ)句1}

else…所以:必要時(shí)加{}.if()語(yǔ)句1else#include"math.h"main(){ floatx,y;

printf("inputx=");

scanf("%f",&x); if(x<=2) y=x*(x-3)+2.5; else if(x<=7) y=sqrt(7-x); else y=(x-5)/3;

printf("x=%7.3fy=%7.3f\n",x,y);}此處不需要寫成X>2&&x<=7例4-9:分段函數(shù)

x*(x-3)+2.5(x<=2)y=(x<=7)(x-5)/3(x>7)如果x<=2那么

y=……..否則

如果x<=7

那么

y=……

否則

y=…….(隱含:x>2)(隱含:x>7)例4-10有一函數(shù)y=–1(x<0)0(x=0)1(x>0)編一程序,輸入一個(gè)x值,輸出y值。有以下幾種寫法,請(qǐng)判斷哪些是正確的?程序1:

main(){intx,y;scanf("%d",&x);

if(x<0)y=–1;elseif(x==0)y=0;elsey=1;

printf("x=%d,y=%d\n",x,y);}程序2:將上面程序的if語(yǔ)句改為:

if(x>=0)if(x>0)y=1;elsey=0;elsey=–1;程序3:將上述if語(yǔ)句改為:

y=–1;if(x!=0)if(x>0)y=1;elsey=0;程序4:

y=0;if(x>=0)if(x>0)y=1;elsey=–1;switch語(yǔ)句

C語(yǔ)言中提供了switch語(yǔ)句用于直接實(shí)現(xiàn)多分支選擇結(jié)構(gòu)。switch語(yǔ)句的一般形式為:

switch(表達(dá)式)

{case常量表達(dá)式1:語(yǔ)句1;

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

……case常量表達(dá)式n:語(yǔ)句n;

[default:語(yǔ)句組n+1;]}switch語(yǔ)句switch語(yǔ)句的執(zhí)行過(guò)程為:先計(jì)算switch后面的表達(dá)式的值;然后使其順次花括號(hào)內(nèi)同各個(gè)case后的常量表達(dá)式的值相比較,若找到相等的常量表達(dá)式i,則執(zhí)行該常量表達(dá)式冒號(hào)后的語(yǔ)句i;若找不到匹配的常量表達(dá)式,此時(shí)要考慮是否有default選項(xiàng),若有,則執(zhí)行default后面的語(yǔ)句直到結(jié)束;否則什么也不執(zhí)行。switch語(yǔ)句在執(zhí)行過(guò)程中,若遇到break語(yǔ)句,則跳出switch結(jié)構(gòu),將程序流程轉(zhuǎn)向switch結(jié)構(gòu)外的下一條語(yǔ)句執(zhí)行;若沒(méi)有break語(yǔ)句,則從該語(yǔ)句組為入口,依次執(zhí)行其后的所有冒號(hào)后面的語(yǔ)句。【例4.9】用switch語(yǔ)句實(shí)現(xiàn)例4.8。main(){intscore,mark;

printf("\nEnterscore:");

scanf("%d",&score);mark=-1;if(score>=0&&score<=100) mark=score/10;switch語(yǔ)句switch(mark){case10:case9:printf("\nVerygood");break;/*成績(jī)≥90*/case8:printf("\nGood");break;/*80≤成績(jī)<90*/case7:case6:printf("\nPassed");break;/*60≤成績(jī)<80*/case5:case4:case3:case2:case1:case0:printf("\nFailed");break;/*成績(jī)<60*/

default:printf("\nEntererror!");/*處理錯(cuò)誤的輸入*/}}switch語(yǔ)句switch結(jié)構(gòu)使用要注意以下幾點(diǎn):

switch后面表達(dá)式的類型,一般為整型、字符型或枚舉類型(枚舉類型將在以后的章節(jié)中介紹)。每個(gè)case后面常量表達(dá)式的值必須互不相同,即不允許對(duì)表達(dá)式的同一個(gè)值有兩種或兩種以上的處理方案。盡管各個(gè)case和default出現(xiàn)的次序不影響程序的執(zhí)行結(jié)果,但是把default放在最后是一種良好的程序設(shè)計(jì)習(xí)慣。多個(gè)case可共有一組執(zhí)行語(yǔ)句。case后面的常量表達(dá)僅起語(yǔ)句標(biāo)號(hào)的作用,并不進(jìn)行條件判斷。系統(tǒng)一旦找到入口標(biāo)號(hào),就從此標(biāo)號(hào)開始執(zhí)行下去,不再進(jìn)行判斷。switch語(yǔ)句switch語(yǔ)句又稱為開關(guān)語(yǔ)句。當(dāng)僅需執(zhí)行一個(gè)開關(guān)時(shí),則在該case后面的語(yǔ)句中必須包含一個(gè)break語(yǔ)句,讓其執(zhí)行后跳出switch語(yǔ)句,否則會(huì)一直執(zhí)行到最后,或遇到下一個(gè)case中的break語(yǔ)句為止。當(dāng)case后面包含一條以上的執(zhí)行語(yǔ)句時(shí),可以不用花括號(hào)括起來(lái),系統(tǒng)會(huì)自動(dòng)識(shí)別并順序執(zhí)行所有語(yǔ)句。default是可選項(xiàng)。但良好的程序設(shè)計(jì)習(xí)慣是,在每個(gè)switch語(yǔ)句中,寫上一條default語(yǔ)句來(lái)集中處理例外條件,從而防止一些條件沒(méi)有被測(cè)試到。條件運(yùn)算符格式:表達(dá)式1?表達(dá)式2:表達(dá)式3功能:先求表達(dá)式1的值,若表達(dá)式1的值為真,則表達(dá)式2的值為整個(gè)表達(dá)式的值,否則表達(dá)式3的值為整個(gè)表達(dá)式的值。Max=(a>b)?a:b;等價(jià)于:

if(a>b)max=a;elsemax=b;例4.5main(){ charch;

printf("input

ch=");

scanf("%c",&ch);

ch=ch>='a'&&ch<='z’?ch-32:ch;

printf("%c\n",ch);}判斷字符ch是否是大寫字母

ch>=‘A'&&ch<=‘Z’

選擇結(jié)構(gòu)程序設(shè)計(jì)舉例【例4.10】求一元二次方程的根。#include"math.h"main(){floata,b,c,disc,x1,x2,rpart,ipart;

printf("\n\npleaseinputa,b,c:");

scanf("%f,%f,%f",&a,&b,&c);/*輸入方程的系數(shù)*/

printf("Theequation");

if(fabs(a)<=1E-6)/*若a等于0,則不是一元二次方程*/ {printf("isnotquadratic");exit(0);}else{disc=b*b-4*a*c;

if(fabs(disc)<=1E-6)/*△=0時(shí),有兩個(gè)相等實(shí)根*/ {printf("hastwoequalroots:%8.4f",-b/(2*a));}elseif(disc>1E-6)/*△>0,有兩個(gè)不等實(shí)根*/選擇結(jié)構(gòu)程序設(shè)計(jì)舉例

{x1=(-b+sqrt(disc))/(2*a);x2=(-b-sqrt(disc))/(2*a);

printf("hastwodistinctrealroots:%8.4f,%8.4f",x1,x2);}else/*△<0,有兩個(gè)共厄復(fù)根*/ {rpart=-b/(2*a);

ipart=sqrt(-disc)/(2*a);

printf("hastwocomplexroots:");printf("\n%8.4f+%8.4fi",rpart,ipart);printf("\n%8.4f-%8.4fi",rpart,ipart); }}}選擇結(jié)構(gòu)程序設(shè)計(jì)舉例程序的運(yùn)行情況如下:①

pleaseinputa,b,c:1,2,1Theequationhastwoequalroots:-1.0000②pleaseinputa,b,c:2,8,6Theequationhasdistinctrealroots:-1.0000,-3.000③pleaseinputa,b,c:1,2,3Theequationhastwocomplexroots:-1.0000+1.4141i-1.0000-1.4141i選擇結(jié)構(gòu)程序設(shè)計(jì)舉例【例4.12】某商店售貨,按購(gòu)買貨物的款數(shù)多少分別給予不同的優(yōu)惠折扣:購(gòu)貨不足250元的,沒(méi)有折扣;購(gòu)貨滿250元,不足500元,折扣5%;購(gòu)貨滿500元,不足1000元,折扣7.5%;購(gòu)貨滿1000元,不足2000元,折扣10%;購(gòu)貨滿2000元,折扣15%。①

用嵌套的if結(jié)構(gòu)實(shí)現(xiàn)。選擇結(jié)構(gòu)程序設(shè)計(jì)舉例選擇結(jié)構(gòu)程序設(shè)計(jì)舉例main(){floatm,d,amount;printf("\nEnteryourmoneyforbuying:");scanf("%f",&m);if(m<250)d=0;elseif(m<500)d=5;elseif(m<1000)d=7.5;elseif(m<2000)d=10;elsed=15;amount=m*(1-d/100);printf("\namount=%6.2f",amount);}選擇結(jié)構(gòu)程序設(shè)計(jì)舉例運(yùn)行情況:Enteryourmoneyforbuying:680amount=629.00再運(yùn)行:Enteryourmoneyforbuying:1350amount=1215.00②用switch結(jié)構(gòu)實(shí)現(xiàn)。設(shè)置mark標(biāo)記變量:mark=m/250,根據(jù)mark的值而確定相應(yīng)的折扣。程序如下:main(){floatm,d,amount;

intmark;

printf("\nEnteryourmoneyforbuying:");

scanf("%f",&m);選擇結(jié)構(gòu)程序設(shè)計(jì)舉例mark=m/250;switch(mark){case0:d=0;break;case1:d=5;break;case2:case3:d=7.5;break;case4:case5:case6:d=10;break;default:d=15;}if(d<0)print

溫馨提示

  • 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)論