程序設(shè)計(jì)與問題求解_第1頁
程序設(shè)計(jì)與問題求解_第2頁
程序設(shè)計(jì)與問題求解_第3頁
程序設(shè)計(jì)與問題求解_第4頁
程序設(shè)計(jì)與問題求解_第5頁
已閱讀5頁,還剩46頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第2章選擇結(jié)構(gòu)程序設(shè)計(jì)繆裕青2015.32本章主要內(nèi)容關(guān)系運(yùn)算與關(guān)系表達(dá)式邏輯運(yùn)算與邏輯表達(dá)式簡單分支選擇結(jié)構(gòu)條件運(yùn)算符與條件表達(dá)式多分支選擇結(jié)構(gòu)選擇結(jié)構(gòu)的嵌套程序設(shè)計(jì)舉例3順序結(jié)構(gòu)例:交換x和y兩個變量的值 如何交換?

10x20yx=y;y=x;4順序結(jié)構(gòu)(續(xù))例:交換兩個變量的值1020xytemp1020y20x20xtemp1010ytemp10(a)第一步temp=x(b)第二步x=y(c)第三步y(tǒng)=temptemp=x;x=y;y=temp;temp=xx=yy=temp5順序結(jié)構(gòu)(續(xù))例:交換兩個變量的值#include<stdio.h>intmain(){ intx=10,y=20; //定義變量并初始化

inttemp; //定義一個整型變量作為中間交換之用

printf("交換前:x=%d,y=%d\n",x,y);

temp=x; x=y; y=temp; printf("交換后:x=%d,y=%d\n",x,y);return0;}6問題:有x,y兩個整型變量,如果x比y大就交換,否則不交換。算法?問題延伸x>y?開始結(jié)束YN不再順序執(zhí)行,有分支變量x,y交換x,y不交換根據(jù)表達(dá)式的值判斷走哪個分支x>y是什么表達(dá)式?7關(guān)系運(yùn)算符又稱比較運(yùn)算符,優(yōu)先次序?yàn)椋?/p>

<<=>>===!=

關(guān)系表達(dá)式的結(jié)果類型為bool,值為true或false。若關(guān)系成立,結(jié)果為true(1);否則,結(jié)果為false(0)。例: a=3,b=5;

a>=b

a<b

a==b a!=b

關(guān)系運(yùn)算與關(guān)系表達(dá)式優(yōu)先級相同(高)

優(yōu)先級相同(低)結(jié)果為0結(jié)果為1結(jié)果為0結(jié)果為1注意“=”與“==”的區(qū)別8練習(xí):如何寫關(guān)系表達(dá)式?

x≤60 寫成

a=0 寫成

c+d≠e+f 寫成

u≥10-7

寫成關(guān)系運(yùn)算與關(guān)系表達(dá)式(續(xù))0≤x≤10如何表示?x<=60a==0(c+d)!=(e+f)u>=1.0E-70<=5<=10表示什么意思?結(jié)果?等價于(0<=5)<=10等價于1<=10,結(jié)果為19邏輯運(yùn)算也被稱為布爾運(yùn)算,值只能為true

或false。&&與運(yùn)算(a>b&&b>c);a大于b,并且b大于c||或運(yùn)算(a>b

||b>c);a大于b,或者b大于c!非運(yùn)算(求反)(!a);求a的相反值并不改變a的值邏輯運(yùn)算與邏輯表達(dá)式!(邏輯非)&&(邏輯與)||(邏輯或)優(yōu)先級高低10運(yùn)算:

0&&0=0,0&&1=0,1&&0=0,1&&1=1

0||0=0,0||1=1,1||0=1,1||1=1 !0=1,!1=0練習(xí):如何寫邏輯表達(dá)式?0≤x≤10寫成: 若x=5,結(jié)果?a<0或者a>10寫成: 若a=15,結(jié)果?b不大于0寫成: 若b=6,結(jié)果?邏輯運(yùn)算與邏輯表達(dá)式(續(xù))(x>=0&&x<=10)1(a<0)||(a>10)1!(b>0)或者(b<=0)011邏輯運(yùn)算與邏輯表達(dá)式(續(xù))練習(xí):如何寫邏輯表達(dá)式?i和j均小于或等于100,或者i和j均大于k(i<=100&&j<=100)||(i>k&&j>k)ch是英文大寫字母(ch>='A')&&(ch<='Z')判斷某一年year是否是閏年的條件是滿足下列兩個條件之一:能被4整除,但不能被100整除;能被400整除;

year%4==0 year%100!=0 year%400==0((year%4==0)&&(year%100!=0))||(year%400==0)12運(yùn)算符優(yōu)先級括號!算術(shù)運(yùn)算符關(guān)系運(yùn)算符&&||賦值運(yùn)算符低高用括號來控制運(yùn)算順序更直觀、方便,并減少出錯的概率c>a+ba>b==ca=b>c等價于c>(a+b)等價于(a>b)==c等價于a=(b>c)z=!a&&b||x>y&&c+d②①③④⑤⑥⑦13運(yùn)算符優(yōu)先級(續(xù))x=5<=10表示什么意思?結(jié)果?等價于x=(5<=10),結(jié)果x=1(x=5)<=10表示什么意思?結(jié)果?結(jié)果x=5,5<=10表達(dá)式值為15<=x<=10與5<=x&&x<=10一樣嗎?當(dāng)x=15,結(jié)果不一樣!14選擇結(jié)構(gòu)C語言中實(shí)現(xiàn)選擇結(jié)構(gòu)的語句:if語句if-else語句switch-case語句15語法格式:語句塊可以是一條語句,也可以是用大括號括起來的復(fù)合語句簡單分支選擇結(jié)構(gòu)——if語句表達(dá)式?truefalse語句塊語義:if(表達(dá)式)

{語句塊}16問題:有x,y兩個整型變量,如果x比y大就交換,否則不交換。簡單分支選擇結(jié)構(gòu)——if語句(續(xù))#include<stdio.h>intmain(){intx=10,y=20,temp;printf("交換前:x=%d,y=%d\n",x,y);if(x>y)//交換x,y

{temp=x;x=y;y=temp;

}

printf("交換后:x=%d,y=%d\n",x,y);return0;}x>y?開始結(jié)束YN變量x,y交換x,y不交換一條if語句17語法格式:簡單分支選擇結(jié)構(gòu)——if-else語句表達(dá)式?truefalse語句塊1語句塊2if(表達(dá)式)

{語句塊1}else

{語句塊2}語義:18簡單分支選擇結(jié)構(gòu)——if-else語句(續(xù))問題:求整型變量x的絕對值分析:如何求|x|? ifx>=0,|x|=xelse|x|=-x[算法]:(1)輸入x(2)求y=|x|(3)輸出yifx>=0,y=xelsey=-x#include<stdio.h>intmain(){intx,y;scanf("%d",&x);

if(x>=0)

{y=x;

}else

{y=-x;

}

printf("|x|=%d\n",y);return0;}一條if-ese語句19條件運(yùn)算符與條件表達(dá)式語法格式:

表達(dá)式1?表達(dá)式2:表達(dá)式3說明:表達(dá)式1必須是bool類型語義例:y=x>=0?x:-x;if(x>=0)y=x;elsey=-x;表達(dá)式1?truefalse表達(dá)式2表達(dá)式3x>=0?(y=x):(y=-x)20運(yùn)算符優(yōu)先級(續(xù))括號算術(shù)運(yùn)算關(guān)系運(yùn)算邏輯運(yùn)算條件運(yùn)算賦值運(yùn)算低高例:max=x>y?x:ymax=((x>y)?x:y)21多分支選擇結(jié)構(gòu)——多if-else語句例:有一函數(shù)

編一程序,輸入一個x值,要求輸出相應(yīng)的y值。解題思路:用if語句檢查x的值,根據(jù)x的值決定賦予y的值由于y的可能值不是兩個而是三個,因此不可能只用一個簡單(無內(nèi)嵌if)的if語句來實(shí)現(xiàn)22多分支選擇結(jié)構(gòu)——多if-else語句解題思路:方法1(1)用3個獨(dú)立的if語句處理:輸入x若

x<0,則y=-1若

x=0,則y=0若

x>0,則y=1輸出x和yscanf("%d",&x);if(x<0)y=-1;if(x==0)y=0;if(x>0)y=1;printf("x=%d,y=%d\n",x,y);23多分支選擇結(jié)構(gòu)——多if-else語句解題思路:方法2(2)用一個嵌套的if語句處理:輸入x若x<0,則y=-1否則(隱含x>=0)

x=0,則y=0

否則

y=1輸出x和yscanf("%d",&x);if(x<0)y=-1;elseif(x==0)y=0;elsey=1;printf("x=%d,y=%d\n",x,y);24多分支選擇結(jié)構(gòu)——多if-else語句scanf("%d",&x);if(x<0)y=-1;elseif(x==0)y=0;elsey=1;printf("x=%d,y=%d\n",x,y);scanf("%d",&x);if(x>=0)if(x>0)y=1;elsey=0;elsey=-1;printf("x=%d,y=%d\n",x,y);提倡內(nèi)嵌if放在else中25多分支選擇結(jié)構(gòu)——多if-else語句例:將百分制成績轉(zhuǎn)換成5分制成績[算法分析]: 轉(zhuǎn)換關(guān)系:

90≤score≤100,優(yōu)

80≤score<90,良

70≤score<80,中

60≤score<70,及格

score<60,不及格if(score>=90&&score<=100){printf("優(yōu)\n");}if(score>=80&&score<90){printf("良\n");}if(score>=70&&score<80){printf("中\(zhòng)n");}if(score>=60&&score<70){printf("及格\n");}if(score<60){printf("不及格\n");}當(dāng)成績?yōu)?0判斷幾次?為50判斷幾次?能否減少判斷次數(shù)?26if(表達(dá)式1)語句塊1;elseif(表達(dá)式2)語句塊2;elseif(表達(dá)式3)語句塊3;┇

elseif(表達(dá)式n)語句塊n;else語句塊n+1;多分支選擇結(jié)構(gòu)——多if-else語句(續(xù))例:將百分制成績轉(zhuǎn)換成5分制成績#include<stdio.h>intmain(){ intscore; printf("請輸入(百分制)分?jǐn)?shù):"); scanf("%d",&score);

if(score<60) {printf("不及格\n");}

else//>=60

if(score<70) {printf("及格\n");}

else//>=70

if(score<80){printf("中\(zhòng)n");}

else//>=80

if(score<90) {printf("良\n");}

else//>=90 {printf("優(yōu)\n");}return0;}多路分支注意:else與if必須配對使用,對齊可以更便于閱讀。良好的程序風(fēng)格:鋸齒形

——縮進(jìn)排27多分支選擇結(jié)構(gòu)——switch語句多路(開關(guān))選擇語句語法格式:

switch

(整型表達(dá)式)

{

case數(shù)值1:

語句塊1;break;

case數(shù)值2:

語句塊2;break;

case數(shù)值3:

語句塊3;break;

...

default:

語句塊n;

}28有break情況語句塊3語句塊1表達(dá)式的值等于?數(shù)值1其他語句塊2語句塊n數(shù)值2數(shù)值3…多分支選擇結(jié)構(gòu)——switch語句(續(xù))后面語句29多分支選擇結(jié)構(gòu)——switch語句沒有break的情況

switch

(整型表達(dá)式)

{

case數(shù)值1:

語句塊1;

case數(shù)值2:

語句塊2;

case數(shù)值3:

語句塊3;

...

default:

語句塊n;

}30多分支選擇結(jié)構(gòu)——switch語句(續(xù))沒有break的情況語句塊3語句塊1表達(dá)式的值等于?數(shù)值1其他語句塊2語句塊n數(shù)值2數(shù)值3…沒有實(shí)現(xiàn)多路分支31多分支選擇結(jié)構(gòu)——switch語句(續(xù))例:將百分制成績轉(zhuǎn)換成5分制成績[算法分析]:有5個分?jǐn)?shù)檔,因此有5個分支。如何從一個百分制成績得到5個分支的數(shù)值,整型表達(dá)式如何構(gòu)造?數(shù)值如何設(shè)置?90≤score≤100,優(yōu)80≤score<90,良70≤score<80,中60≤score<70,及格score<60,不及格90≤score≤100,優(yōu)80≤score≤89,良70≤score≤

79

,中60≤score≤

69

,及格score<60

,不及格“百分成績/10=”?9,1087632例:將百分制成績到5分制成績轉(zhuǎn)換#include<stdio.h>intmain(){ intscore; printf("請輸入(百分制)分?jǐn)?shù):"); scanf("%d",&score);

switch

(score/10) //根據(jù)轉(zhuǎn)換值進(jìn)行分支選擇

{

case10: case9: printf("優(yōu)\n");break; case8: printf("良\n");break; case7: printf("中\(zhòng)n"); break; case6: printf("及格\n");break;

default: printf("不及格\n");

}

return0;}一條switch語句如果沒有break?#include<stdio.h>intmain(){intscore;printf("請輸入(百分制)分?jǐn)?shù):");scanf("%d",&score);switch(score/10) {case10:case9: printf("優(yōu)\n");case8: printf("良\n");case7: printf("中\(zhòng)n"); case6: printf("及格\n");default: printf("不及格\n");}return0;}如何檢驗(yàn)輸入數(shù)據(jù)是否滿足輸入值范圍?×33完全嵌套是合法的選擇結(jié)構(gòu)的嵌套合法非法√×交叉嵌套是非法的34選擇結(jié)構(gòu)的嵌套(續(xù))ififelseelseifswitchelseswitchifelse√×ififelseelseififelseelse√√ifelseswitch√35例:將百分制成績到5分制成績轉(zhuǎn)換#include<stdio.h>intmain(){ intscore; printf("請輸入(百分制)分?jǐn)?shù):"); scanf("%d",&score); if(score>=0&&score<=100)

{

switch(score/10) //根據(jù)轉(zhuǎn)換值進(jìn)行分支選擇

{ case10: case9: printf("優(yōu)\n");break; case8: printf("良\n");break; case7: printf("中\(zhòng)n"); break; case6: printf("及格\n");break; default: printf("不及格\n");

}

}

elseprintf("輸入數(shù)據(jù)錯誤\n");

return0;}判斷是否符合取值范圍36程序設(shè)計(jì)舉例例1:輸入一小寫字母將其轉(zhuǎn)換為大寫字母。[分析]:小寫字母與大寫字母之間的關(guān)系?從ASCII碼表知道,大小寫對應(yīng)字母之間的差值是32,如:'A'的值是65、'a'的值是97,兩者的差值是32。[算法]:輸入:charlcase,ucase;計(jì)算:ucase=lcase-32;//轉(zhuǎn)換公式輸出:ucase;#include<stdio.h>//將輸入的小寫字母轉(zhuǎn)換成大寫字母輸出intmain(){charlcase,ucase;printf("請輸入要轉(zhuǎn)換的小寫字母:");scanf("%c",&lcase);ucase=lcase-32;printf("對應(yīng)的大寫字母:%c\n",ucase);return0;}如果變量lcase中的小寫字母后面不再使用,程序中可以減少變量嗎?37程序設(shè)計(jì)舉例(續(xù))例1:輸入一小寫字母將其轉(zhuǎn)換為大寫字母。[算法]:輸入:charch;計(jì)算:ch=ch-32;輸出:ch;#include<stdio.h>//將輸入的小寫字母轉(zhuǎn)換成大寫字母輸出intmain(){ charch; printf("請輸入要轉(zhuǎn)換的小寫字母:"); scanf("%c",&ch);

ch=ch-32; printf("對應(yīng)的大寫字母:%c\n",ch);return0;}程序還可以改進(jìn)嗎?如果沒有ASCII表可查,如何知道相差32?38程序設(shè)計(jì)舉例(續(xù))例1:輸入一小寫字母將其轉(zhuǎn)換為大寫字母。

32='a'-'A'#include<stdio.h>//將輸入的小寫字母轉(zhuǎn)換成大寫字母輸出intmain(){ charch; printf("請輸入要轉(zhuǎn)換的小寫字母:"); scanf("%c",&ch); ch=ch-'a'+'A'; printf("對應(yīng)的大寫字母:%c\n",ch);return0;}如果將大寫字母轉(zhuǎn)換成小寫字母,程序如何寫?39程序設(shè)計(jì)舉例(續(xù))例1:輸入一小寫字母將其轉(zhuǎn)換為大寫字母。如果輸入的不是小寫字母怎么辦?#include<stdio.h>//將輸入的小寫字母轉(zhuǎn)換成大寫字母輸出intmain(){ charch; printf("請輸入要轉(zhuǎn)換的小寫字母:"); scanf("%c",&ch); ch=ch-'a'+'A'; printf("對應(yīng)的大寫字母:%c\n",ch);return0;}40程序設(shè)計(jì)舉例(續(xù))例1:輸入一小寫字母將其轉(zhuǎn)換為大寫字母。#include<stdio.h>//將輸入的小寫字母轉(zhuǎn)換成大寫字母輸出intmain(){ charch; printf("請輸入要轉(zhuǎn)換的小寫字母:"); scanf("%c",&ch);

if(ch>='a'&&ch<='z') ch=ch-'a'+'A'; printf("對應(yīng)的大寫字母:%c\n",ch);return0;}通過檢驗(yàn)輸入數(shù)據(jù)來增加程序的強(qiáng)壯性!一條語句41程序設(shè)計(jì)舉例(續(xù))例2:求一元二次方程ax2+bx+c=0的根,其中系數(shù)a,b,c為實(shí)數(shù),由鍵盤輸入。[分析]:△=b2-4ac

當(dāng)△>0時,方程有兩個實(shí)根 當(dāng)△=0時,方程有重根 當(dāng)△<0時,方程有兩個共軛復(fù)根設(shè)42解題思路:輸入a,b,c計(jì)算deltadelta≥0計(jì)算x1,x2輸出無實(shí)根輸出x1,x2真假43#include<stdio.h>#include<math.h>voidmain(){doublea,b,c,delta,p,q;printf("Pleaseinputa,b,c=");scanf("%lf%lf%lf",&a,&b,&c);delta=b*b-4*a*c;p=-b/(2*a);q=sqrt(fabs(delta))/(2*a);

if(delta>=0) {printf("x1=%f\nx2=%f\n",p+q,p-q);}

else { printf("x1=%f+j%f\n",p,q); printf("x2=%f-j%f\n",p,q); }}庫函數(shù)一條語句44#include<stdio.h>#include<math.h>voidmain(){doublea,b,c,delta,p,q;printf("Pleaseinputa,b,c=");scanf("%lf%lf%lf",&a,&b,&c);delta=b*b-4*a*c;p=-b/(2*a);q=sqrt(fabs(delta))/(2*a);

if

(fabs(delta)<=1e-6) {printf("x1=x2=%f\n",p);}

elseif(delta>1e-6) {printf("x1=%f\nx2=%f\n",p+q,p-q);}

else{ printf("x1=%f+j%f\n",p,q); printf("x2=%f-j%f\n",p,q); }}較小的數(shù)近似045程序設(shè)計(jì)舉例(續(xù))例3:求兩個整數(shù)中的較大者。[分析]:設(shè)整數(shù)x和y的較大值為max,可以直接將x和y進(jìn)行比較,若x>=y,則較大值為x,即max=x,否則,較大值為y,即max=y。#include<stdio.h>intmain(){intmax,x,y;printf("pleaseinputxy:");scanf("%d%d",&x,&y);

if(x>=y) {max=x;}

else {max=y;}printf("max=%d\n",max);return0;}#include<stdio.h>intmain(){intmax,x,y;printf("pleaseinputxy:");

溫馨提示

  • 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

提交評論