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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第2章選擇結構程序設計繆裕青2015.32本章主要內容關系運算與關系表達式邏輯運算與邏輯表達式簡單分支選擇結構條件運算符與條件表達式多分支選擇結構選擇結構的嵌套程序設計舉例3順序結構例:交換x和y兩個變量的值 如何交換?

10x20yx=y;y=x;4順序結構(續(xù))例:交換兩個變量的值1020xytemp1020y20x20xtemp1010ytemp10(a)第一步temp=x(b)第二步x=y(c)第三步y=temptemp=x;x=y;y=temp;temp=xx=yy=temp5順序結構(續(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?開始結束YN不再順序執(zhí)行,有分支變量x,y交換x,y不交換根據表達式的值判斷走哪個分支x>y是什么表達式?7關系運算符又稱比較運算符,優(yōu)先次序為:

<<=>>===!=

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

a>=b

a<b

a==b a!=b

關系運算與關系表達式優(yōu)先級相同(高)

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

x≤60 寫成

a=0 寫成

c+d≠e+f 寫成

u≥10-7

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

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

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

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練習:如何寫邏輯表達式?0≤x≤10寫成: 若x=5,結果?a<0或者a>10寫成: 若a=15,結果?b不大于0寫成: 若b=6,結果?邏輯運算與邏輯表達式(續(xù))(x>=0&&x<=10)1(a<0)||(a>10)1!(b>0)或者(b<=0)011邏輯運算與邏輯表達式(續(xù))練習:如何寫邏輯表達式?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ōu)先級括號!算術運算符關系運算符&&||賦值運算符低高用括號來控制運算順序更直觀、方便,并減少出錯的概率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ōu)先級(續(xù))x=5<=10表示什么意思?結果?等價于x=(5<=10),結果x=1(x=5)<=10表示什么意思?結果?結果x=5,5<=10表達式值為15<=x<=10與5<=x&&x<=10一樣嗎?當x=15,結果不一樣!14選擇結構C語言中實現選擇結構的語句:if語句if-else語句switch-case語句15語法格式:語句塊可以是一條語句,也可以是用大括號括起來的復合語句簡單分支選擇結構——if語句表達式?truefalse語句塊語義:if(表達式)

{語句塊}16問題:有x,y兩個整型變量,如果x比y大就交換,否則不交換。簡單分支選擇結構——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?開始結束YN變量x,y交換x,y不交換一條if語句17語法格式:簡單分支選擇結構——if-else語句表達式?truefalse語句塊1語句塊2if(表達式)

{語句塊1}else

{語句塊2}語義:18簡單分支選擇結構——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條件運算符與條件表達式語法格式:

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

編一程序,輸入一個x值,要求輸出相應的y值。解題思路:用if語句檢查x的值,根據x的值決定賦予y的值由于y的可能值不是兩個而是三個,因此不可能只用一個簡單(無內嵌if)的if語句來實現22多分支選擇結構——多if-else語句解題思路:方法1(1)用3個獨立的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多分支選擇結構——多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多分支選擇結構——多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);提倡內嵌if放在else中25多分支選擇結構——多if-else語句例:將百分制成績轉換成5分制成績[算法分析]: 轉換關系:

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");}當成績?yōu)?0判斷幾次?為50判斷幾次?能否減少判斷次數?26if(表達式1)語句塊1;elseif(表達式2)語句塊2;elseif(表達式3)語句塊3;┇

elseif(表達式n)語句塊n;else語句塊n+1;多分支選擇結構——多if-else語句(續(xù))例:將百分制成績轉換成5分制成績#include<stdio.h>intmain(){ intscore; printf("請輸入(百分制)分數:"); 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必須配對使用,對齊可以更便于閱讀。良好的程序風格:鋸齒形

——縮進排27多分支選擇結構——switch語句多路(開關)選擇語句語法格式:

switch

(整型表達式)

{

case數值1:

語句塊1;break;

case數值2:

語句塊2;break;

case數值3:

語句塊3;break;

...

default:

語句塊n;

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

switch

(整型表達式)

{

case數值1:

語句塊1;

case數值2:

語句塊2;

case數值3:

語句塊3;

...

default:

語句塊n;

}30多分支選擇結構——switch語句(續(xù))沒有break的情況語句塊3語句塊1表達式的值等于?數值1其他語句塊2語句塊n數值2數值3…沒有實現多路分支31多分支選擇結構——switch語句(續(xù))例:將百分制成績轉換成5分制成績[算法分析]:有5個分數檔,因此有5個分支。如何從一個百分制成績得到5個分支的數值,整型表達式如何構造?數值如何設置?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分制成績轉換#include<stdio.h>intmain(){ intscore; printf("請輸入(百分制)分數:"); scanf("%d",&score);

switch

(score/10) //根據轉換值進行分支選擇

{

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("請輸入(百分制)分數:");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;}如何檢驗輸入數據是否滿足輸入值范圍?×33完全嵌套是合法的選擇結構的嵌套合法非法√×交叉嵌套是非法的34選擇結構的嵌套(續(xù))ififelseelseifswitchelseswitchifelse√×ififelseelseififelseelse√√ifelseswitch√35例:將百分制成績到5分制成績轉換#include<stdio.h>intmain(){ intscore; printf("請輸入(百分制)分數:"); scanf("%d",&score); if(score>=0&&score<=100)

{

switch(score/10) //根據轉換值進行分支選擇

{ 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("輸入數據錯誤\n");

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

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

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

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

當△>0時,方程有兩個實根 當△=0時,方程有重根 當△<0時,方程有兩個共軛復根設42解題思路:輸入a,b,c計算deltadelta≥0計算x1,x2輸出無實根輸出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); }}庫函數一條語句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); }}較小的數近似045程序設計舉例(續(xù))例3:求兩個整數中的較大者。[分析]:設整數x和y的較大值為max,可以直接將x和y進行比較,若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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論