版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
C語言程序設(shè)計第五章程序控制結(jié)構(gòu)1C語言程序設(shè)計第五章1本章學(xué)習(xí)內(nèi)容5-2
算法的描述方法
單分支控制語句:if雙分支控制語句:if-else
多分支控制語句:ifelseif
多路選擇語句:switchbreak語句在switch語句中的作用運算符:
關(guān)系運算符條件運算符邏輯運算符本章學(xué)習(xí)內(nèi)容5-2算法的描述方法算法的概念及其描述數(shù)據(jù)結(jié)構(gòu)+算法=程序數(shù)據(jù)結(jié)構(gòu):數(shù)據(jù)的描述和組織形式算法:為解決一個具體問題而采取的確定的有限的操作步驟。算法特性:有窮性確定性
有效性
沒有輸入或有多個輸入
有一個或多個輸出
5-3算法的概念及其描述數(shù)據(jù)結(jié)構(gòu)+算法=程序5-3算法的特性有窮性在合理的時間內(nèi)完成確定性,無歧義如果x≥0,則輸出Yes;如果x≤0,則輸出No有效性能有效執(zhí)行負(fù)數(shù)開平方?jīng)]有輸入或有多個輸入有一個或多個輸出5-4算法的概念及其描述算法的特性5-4算法的概念及其描述算法的描述方法自然語言描述傳統(tǒng)流程圖(Flowchart)在1966年,Bohra與Jacopini提出N-S結(jié)構(gòu)化流程圖1973年,美國學(xué)者I.Nassi和B.Shneiderman提出偽碼(Pseudocode)表示5-5算法的概念及其描述算法的描述方法5-5算法的概念及其描述偽碼(Pseudocode)人工的,非正式的輔助人們進(jìn)行算法設(shè)計的語言。6if8點以前thendo私人事務(wù);elseif8點到11:45點then上課;else自習(xí);日常生活偽碼(Pseudocode)人工的,非正式的輔助人們進(jìn)行流程圖(Flowchart)5-7開始\結(jié)束框符號Semantic一般處理框輸入\輸出框判斷框連接符流程線流程圖(Flowchart)5-7開始\結(jié)束框符號Sem2022/12/256-8構(gòu)成程序的三種基本結(jié)構(gòu)順序結(jié)構(gòu)選擇結(jié)構(gòu)(分支結(jié)構(gòu))循環(huán)結(jié)構(gòu)任何程序均可只用這三種結(jié)構(gòu)綜合描述只用這三種結(jié)構(gòu)編制的程序,叫結(jié)構(gòu)化程序程序必須符合結(jié)構(gòu)化規(guī)則2022/12/206-8構(gòu)成程序的三種基本結(jié)構(gòu)順序結(jié)構(gòu)2022/12/259結(jié)構(gòu)化程序設(shè)計的核心思想采用順序、選擇和循環(huán)三種基本結(jié)構(gòu)作為程序設(shè)計的基本單元只有一個入口;只有一個出口;無死語句,即不存在永遠(yuǎn)都執(zhí)行不到的語句;無死循環(huán),即不存在永遠(yuǎn)都執(zhí)行不完的循環(huán)。采用“自頂向下、逐步求精”和模塊化的方法進(jìn)行結(jié)構(gòu)化程序設(shè)計2022/12/209結(jié)構(gòu)化程序設(shè)計的核心思想采用順序、選擇構(gòu)成程序的三種基本結(jié)構(gòu)例:買蘋果,計算價錢5-10
數(shù)量
單位價格總價總價=數(shù)量*單位價格InputProcessOutput首先要確認(rèn)輸入與輸出構(gòu)成程序的三種基本結(jié)構(gòu)例:買蘋果,計算價錢5-10數(shù)順序結(jié)構(gòu)給變量賦值賦值表達(dá)式語句/賦值表達(dá)式;總價=數(shù)量*單位價格;輸入輸出數(shù)據(jù)標(biāo)準(zhǔn)庫函數(shù)調(diào)用語句scanf("%d",&pricePerkg);printf("%d",price);5-11ABC順序結(jié)構(gòu)給變量賦值5-11ABC順序結(jié)構(gòu)——應(yīng)用舉例(1)5-12例:求一個數(shù)的絕對值解:(1)問題分析:step1:給出一個數(shù)num=-55step2:求num的絕對值step3:輸出結(jié)果公式:abs=fabs(num)(利用數(shù)學(xué)函數(shù)fabs())順序結(jié)構(gòu)——應(yīng)用舉例(1)5-12例:求一個數(shù)的絕對值解流程圖及代碼5-13num=-55開始abs=fabs(num)輸出num,abs結(jié)束#include<stdio.h>#include<math.h>main(){intnum,abs;num=-55;abs=fabs(num);printf("|%d|=%d",num,abs);}5_1.c流程圖及代碼5-13num=-55開始abs=fabs常用函數(shù)對應(yīng)的頭文件函數(shù)函數(shù)頭文件數(shù)學(xué)函數(shù)math.h字符串函數(shù)string.h輸入輸出函數(shù)stdio.h動態(tài)存儲分配函數(shù)stdlib.h/malloc.h5-14常用函數(shù)對應(yīng)的頭文件函數(shù)函數(shù)頭文件數(shù)學(xué)函數(shù)math.h字符選擇結(jié)構(gòu)(分支結(jié)構(gòu))
5-15分類:單分支:if雙分支:if-else多分支:if-else-if作用:控制程序的流向組成:常量,變量,表達(dá)式(常用:關(guān)系、邏輯表達(dá)式)選擇結(jié)構(gòu)(分支結(jié)構(gòu))5-15分類:本章學(xué)習(xí)內(nèi)容5-16
算法的描述方法
單分支控制語句:if雙分支控制語句:if-else
多分支控制語句:ifelseif
多路選擇語句:switchbreak語句在switch語句中的作用運算符:
關(guān)系運算符條件運算符邏輯運算符本章學(xué)習(xí)內(nèi)容5-16算法的描述方法關(guān)系運算符與關(guān)系表達(dá)式5-17關(guān)系運算符含義示例值優(yōu)先級<小于6<91(true)高<=小于等于5<=51(true)>大于2>60(false)>=大于等于9>=51(true)==等于7==50(false)低!=不等于6!=51(true)關(guān)系運算符與關(guān)系表達(dá)式5-17關(guān)系運算符含義示例值優(yōu)先級關(guān)系運算符與關(guān)系表達(dá)式關(guān)系運算符運算出的結(jié)果為0和非00,表示假,即該關(guān)系不成立非0,表示真,即該關(guān)系成立絕大多數(shù)編譯器,關(guān)系運算得到的非0結(jié)果為1,但是不要利用這個1優(yōu)先級:<、<=、>、>=優(yōu)先于==、!=5-18關(guān)系運算符與關(guān)系表達(dá)式關(guān)系運算符運算出的結(jié)果為0和非05-關(guān)系運算符與關(guān)系表達(dá)式例:設(shè)a=3,b=2,c=1,計算下列表達(dá)式的值5-19a>ba>b>c10int
a=0;
if
(a=0)
printf("OK");int
a=0;
if
(a==0)
printf("OK");如何避免?int
a=0;
if
(0==a)
printf("OK");int
a=0;
if
(0=a)
printf("OK");編譯出錯??!==與=3.a=b1變量的值就是賦值表達(dá)式的值關(guān)系運算符與關(guān)系表達(dá)式例:設(shè)a=3,b=2,c=1,計算下列本章學(xué)習(xí)內(nèi)容5-20
算法的描述方法
單分支控制語句:if雙分支控制語句:if-else
多分支控制語句:ifelseif
多路選擇語句:switchbreak語句在switch語句中的作用運算符:
關(guān)系運算符條件運算符邏輯運算符本章學(xué)習(xí)內(nèi)容5-20算法的描述方法格式:5-21if(表達(dá)式)
語句;if(表達(dá)式){
語句1;語句2;}單分支控制的條件語句復(fù)合語句被當(dāng)做一條語句單語句格式:復(fù)合語句格式:格式:5-21if(表達(dá)式)單分支控制的條件語句復(fù)合語句單分支控制的條件語句5-22yesno語句A條件成立否條件表達(dá)式.T..F.語句單分支控制的條件語句5-22yesno語句A條件成立例5.1計算兩整數(shù)的最大值5-23#include<stdio.h>main(){inta,b,max;printf("Inputa,b:");scanf("%d,%d",&a,&b);
if(a>b) max=a;
if(a<=b)max=b;printf("max=%d\n",max);}Inputa,b:20,
15↙max=20_5_1.c例5.1計算兩整數(shù)的最大值5-23#include<本章學(xué)習(xí)內(nèi)容5-24
算法的描述方法
單分支控制語句:if雙分支控制語句:if-else
多分支控制語句:ifelseif
多路選擇語句:switchbreak語句在switch語句中的作用運算符:
關(guān)系運算符條件運算符邏輯運算符本章學(xué)習(xí)內(nèi)容5-24算法的描述方法用于雙分支控制的條件語句格式:5-25if(表達(dá)式)
語句A;else
語句B;語句A真語句B假入口出口表達(dá)式!=0表達(dá)式值非0時,執(zhí)行語句A,跳出結(jié)構(gòu);
表達(dá)式值為0時,執(zhí)行語句B,跳出結(jié)構(gòu);else部分可以沒有if(表達(dá)式)
語句A;
當(dāng)表達(dá)式值為0時,跳出結(jié)構(gòu);假入口出口用于雙分支控制的條件語句格式:5-25if(表達(dá)式)語句用于雙分支控制的條件語句5-26if(表達(dá)式){
語句A1;
語句A2;}else{
語句B1;
語句B2;}復(fù)合語句格式:語句A1真語句B1假入口出口表達(dá)式!=0語句A2語句B2用于雙分支控制的條件語句5-26if(表達(dá)式)復(fù)合語句格例5.1計算兩整數(shù)的最大值5-27NoYesInputaandbOutputmaxa>b?maxbmaxaStartEnd例5.1計算兩整數(shù)的最大值5-27NoYesInput例5.1計算兩整數(shù)的最大值5-28NoYesInputaandbOutputmaxa>b?maxbmaxaStartEndscanf("%d,%d",&a,&b);if(a>b)max=a;elsemax=b;printf("max=%d\n",max);例5.1計算兩整數(shù)的最大值5-28NoYesInput5-29#include<stdio.h>main(){inta,b,max;printf("Inputa,b:");scanf("%d,%d",&a,&b);
if(a>b) max=a;
if(a<=b)max=b;printf("max=%d\n",max);}例5.1計算兩整數(shù)的最大值if(a>b)max=a;elsemax=b;5-29#include<stdio.h>例5.1計本章學(xué)習(xí)內(nèi)容5-30算法的描述方法
單分支控制語句:if雙分支控制語句:if-else
多路選擇語句:switchbreak語句在switch語句中的作用運算符:
關(guān)系運算符條件運算符邏輯運算符本章學(xué)習(xí)內(nèi)容5-30算法的描述方法條件運算符和條件表達(dá)式5-31#include<stdio.h>main(){inta,b,max;
printf("Inputa,b:");scanf("%d,%d",&a,&b);
if(a>b) max=a;
else max=b;printf("max=%d",max);}表達(dá)式1?表達(dá)式2:表達(dá)式3max=a>b?a:b;條件運算符和條件表達(dá)式5-31#include<st條件表達(dá)式5-32一般形式:
(a>b)?a:ba>b條件成立該表達(dá)式的值就是aa>b條件不成立該表達(dá)式的值是b此種表達(dá)式切忌用得過于繁雜條件表達(dá)式5-32一般形式:例5.2:求分段函數(shù)的值5-33(參見教材P40:常用標(biāo)準(zhǔn)數(shù)學(xué)函數(shù))解:有分段函數(shù):y=X>01X<=0exp(-x)#include<math.h>例5.2:求分段函數(shù)的值5-33(參見教材P40:常用例5.2:求分段函數(shù)的值5-34#include
<stdio.h>#include
<math.h>main(){
float
x,y;
printf("Inputx:"); scanf("%f",&x);
if(x>0)y=exp(-x);elsey=1; printf(“y=%f\n”,y);}5_2.c例5.2:求分段函數(shù)的值5-34#include<st例5.3閱讀程序,求程序結(jié)果5-35#include
<stdio.h>main(){
int
a=3,b=2,c=1;
if
(a>b) {
if
(a>c)printf(a=%d\n,a); else
printf(b=%d\n,b);} printf(over!\n);}if與else配對5_3.c例5.3閱讀程序,求程序結(jié)果5-35#include本章學(xué)習(xí)內(nèi)容5-36算法的描述方法
單分支控制語句:if雙分支控制語句:if-else
多分支控制語句:ifelseif
多路選擇語句:switchbreak語句在switch語句中的作用運算符:
關(guān)系運算符條件運算符邏輯運算符本章學(xué)習(xí)內(nèi)容5-36算法的描述方法5-37多分支選擇結(jié)構(gòu)if的一種擴(kuò)展形式if(表達(dá)式1)
語句1;
elseif
(表達(dá)式2)
語句2;
elseif(表達(dá)式3)
語句3;
…………
elseif(表達(dá)式n)
語句n;
else
語句n+1;
else部分可以沒有5-37多分支選擇結(jié)構(gòu)if的一種擴(kuò)展形式多分支選擇結(jié)構(gòu)5-38Stepaexpression1StepmStepnStepztruefalseexpression2truefalseStepxStepaexpression1StepmStepnStepztruefalseexpression2truefalseStepx多分支選擇結(jié)構(gòu)5-38Stepaexpression1使用if語句需注意事項條件判斷表達(dá)式一定用圓括號括起。復(fù)合語句必須用{}引起。每一個else必須與一個if項匹配。else總是與離它最近的if相匹配。5-39使用if語句需注意事項條件判斷表達(dá)式一定用圓括號括起。5例5.4:輸入學(xué)生分?jǐn)?shù),系統(tǒng)自動評級5-40#include<stdio.h>main(){intscore;printf("pleaseinputthescore:");scanf("%d",&score);if(score>=90)printf("A\n");if(score>=80&&score<90)printf("B\n");if(score>=70&&score<80)printf("C\n");if(score>=60&&score<70)printf("D\n");elseprintf("E\n");}if(score<60)X5_4.c程序有無問題?例5.4:輸入學(xué)生分?jǐn)?shù),系統(tǒng)自動評級5-40#incl例5.4:輸入學(xué)生分?jǐn)?shù),系統(tǒng)自動評級5-41#include<stdio.h>main(){intscore;printf("pleaseinputthescore:");scanf("%d",&score);
if(score>=90)printf("A\n");
else
if(score>=80)printf("B\n");
else
if(score>=70)printf("C\n");
else
if(score>=60)printf("D\n");
elseprintf("E\n");}5_4_1.c例5.4:輸入學(xué)生分?jǐn)?shù),系統(tǒng)自動評級5-41#incl5-42aba&&ba||b!a!b0000110非零0110非零00101非零非零11005-42aba&&ba||b!a!b000011例5.5猜數(shù)游戲5-43編程設(shè)計一個簡單的猜數(shù)游戲:先由計算機想一個“數(shù)”請人猜,如果人猜對了,則計算機提示:“Right!”;否則提示:“Wrong!”,并告訴人所猜的數(shù)是大還是小。
解析:計算機想一個數(shù):magic
人猜測的數(shù):guess判斷兩數(shù)是否相同?輸出判斷結(jié)果:Right/Wrong“想”的數(shù):用隨機函數(shù)rand()產(chǎn)生例5.5猜數(shù)游戲5-43編程設(shè)計一個簡單的猜數(shù)游戲:先隨機函數(shù)rand()產(chǎn)生的隨機數(shù)在0~RAND_MAX之間,
RAND_MAX在stdlib.h中定義為符號常量,且不大于雙字節(jié)整數(shù)的最大值32767。
#include
<stdlib.h>5-44例5.5猜數(shù)游戲隨機函數(shù)rand()5-44例5.5猜數(shù)游戲5-45#include<stdio.h>#include<stdlib.h>/*rand函數(shù)需要的頭文件*/main(){
intmagic,guess;magic=rand();/*利用rand函數(shù)產(chǎn)生隨機數(shù)*/
printf(“pleaseenteraguess:”);scanf(“%d”,&guess);
if(guess>magic){printf(“wrong!toohigh!\n”);}
elseif(guess<magic){printf(“wrong!toolow!\n”);}
else{printf(“right!\n”);printf(“thenumberis:%d\n”,guess);}}例5.5猜數(shù)游戲5-45例5.5猜數(shù)游戲本章學(xué)習(xí)內(nèi)容5-46
算法的描述方法
單分支控制語句:if雙分支控制語句:if-else
多分支控制語句:ifelseif
多路選擇語句:switchbreak語句在switch語句中的作用運算符:
關(guān)系運算符條件運算符邏輯運算符本章學(xué)習(xí)內(nèi)容5-46算法的描述方法邏輯運算符和邏輯表達(dá)式5-47?。海ǚ牵┣蠓慈绻鸻是0,結(jié)果非0;如果a是非0,結(jié)果是0&&:(與)當(dāng)且僅當(dāng)兩者都為真,則結(jié)果為真
(a>b&&b>c):當(dāng)a大于b并且
b大于c同時為真時,表達(dá)式為真||:(或)只要兩者中有一個為真,結(jié)果就為真(a>b||b>c):a大于b或b大于c其中一個為真,表達(dá)式即為真高低邏輯運算符和邏輯表達(dá)式5-47?。海ǚ牵W(xué)生成績在80-90之間為B(score>=80)&&(score<90)ch是大寫英文字母(ch>=‘A’)&&(ch<=‘Z’)判斷某一年是否為閏年需滿足下列二者之一能被4整除,但不能被100整除;能被400整除;5-48邏輯運算符和邏輯表達(dá)式y(tǒng)ear%4==0&&year%100!=0||year%400==0優(yōu)先級:%==!=&&||((year%4==0)&&(year%100!=0))||(year%400==0)學(xué)生成績在80-90之間為B5-48邏輯運算符和邏輯表達(dá)&&與||的短路問題含有&&和||的表達(dá)式由先計算左操作數(shù)的值單獨推導(dǎo)出
1>2結(jié)果0;b++部分不會被執(zhí)行2>1結(jié)果1;b++不會被執(zhí)行
491>2&&b++>32>1||b++>2不建議使用多用途,復(fù)雜而晦澀難懂的復(fù)合表達(dá)式&&與||的短路問題含有&&和||的表達(dá)式491>2&本章學(xué)習(xí)內(nèi)容5-50
算法的描述方法
單分支控制語句:if雙分支控制語句:if-else
多分支控制語句:ifelseif
多路選擇語句:switchbreak語句在switch語句中的作用運算符:
關(guān)系運算符條件運算符邏輯運算符本章學(xué)習(xí)內(nèi)容5-50算法的描述方法開關(guān)語句
Switch開關(guān)語句的一般形式:
switch
(
表達(dá)式)
{
case
常數(shù)1:
語句序列1;
break;
case
常數(shù)2:
語句序列2;
break;
…………
default:
語句序列n;
break;
}5-512.case后的空格不要忘掉3.常量后的冒號也很必要1.大花括號開口笑4.Break有時也不可少5.表達(dá)式的數(shù)值需要注意了char或int隨你挑6.類型一致才生效開關(guān)語句Switch開關(guān)語句的一般形式:5-512.例5.65-52#include<stdio.h>main(){
inti=10;
switch(i) {
case9: i+=2;
case10: i+=2;
case11: i+=2;
case12: i+=2;
default: i+=2; } printf(i=%d\n,i);}i=18例5.65-52#include<stdio.h>i例5.7:輸入月份,屏幕輸出英文5-53#include<stdio.h>main(){intmonth;scanf("%d",&month);switch(month){case1: printf("January\n"); break; case2: printf("February\n"); break; case3: printf("March\n"); break; default: printf("Others\n"); break; } printf("End");如果month=1,那么…執(zhí)行case1后的所有語句遇break后
跳出switchJanuary_JanuaryEnd_例5.7:輸入月份,屏幕輸出英文5-53#includ#include<stdio.h>main(){intmonth;scanf("%d",&month);switch(month){case1: printf("January\n"); break; case2: printf("February\n"); break; case3: printf("March\n"); break; default: printf("Others\n"); break; } printf("End");5-54執(zhí)行case3后語句…March_MarchEnd_如果month=3,…break:跳出switch語句例5.7:輸入月份,屏幕輸出英文#include<stdio.h>5-54執(zhí)行case5-55#include<stdio.h>main(){intmonth;scanf("%d",&month);switch(month){case1: printf("January\n"); break; case2: printf("February\n"); break; case3: printf("March\n"); break; default: printf("Others\n"); break; } printf("End");如果把break去掉,會如何?
例5.7:輸入月份,屏幕輸出英文5-55#include<stdio.h>如果把bre#include<stdio.h>main(){intmonth;scanf("%d",&month);switch(month){case1: printf("January\n"); break; case2: printf("February\n");
case3: printf("March\n"); break; default: printf("Others\n"); break; } printf("End");5-56去掉break會怎樣?例5.7:輸入月份,屏幕輸出英文#include<stdio.h>5-56去掉brea#include<stdio.h>main(){intmonth;scanf("%d",&month);switch(month){case1: printf("January\n"); break; case2: printf("February\n");
case3: printf("March\n"); break; default: printf("Others\n"); break; } printf("End");5-57執(zhí)行case2后的語句February_March_若month=2,則…遇break跳出switch語句End_繼續(xù)執(zhí)行例5.7:輸入月份,屏幕輸出英文#include<stdio.h>5-57執(zhí)行case5-58#include<stdio.h>main(){intmonth;scanf("%d",&month);switch(month){case1: printf("January\n"); break; case2: printf("February\n");
case3: printf("March\n"); break; default: printf("Others\n"); break; } printf("End");若去掉所有的break會怎樣?若month=1?若month=34?最好不省略!例5.7:輸入月份,屏幕輸出英文5-58#include<stdio.h>若去掉所有的例5.8計算器程序
編程設(shè)計一個簡單的計算器程序,要求用戶從鍵盤輸入如下形式的表達(dá)式:操作數(shù)1運算符op操作數(shù)2
然后,計算并輸出表達(dá)式的值指定的運算符為 加(+) 減(-) 乘(*) 除(/)5-59例5.8計算器程序編程設(shè)計一個簡單的計算器程序,要求5-60main(){
intdata1,data2;/*定義兩個操作符*/
charop;/*定義運算符*/ printf("Pleaseentertheexpression:"); scanf("%d%c%d",&data1,&op,&data2);/*輸入運算表達(dá)式*/
switch(op) {
case'+':/*處理加法*/ printf("%d+%d=%d\n",data1,data2,data1+data2);
break;
case'-':/*處理減法*/ printf("%d-%d=%d\n",data1,data2,data1-data2);
break;
case'*':/*處理乘法*/ printf("%d*%d=%d\n",data1,data2,data1*data2);
break;
case'/':/*處理除法*/
if(0==data2) printf("Divisionbyzero!\n");
else
printf("%d/%d=%d\n",data1,data2,data1/data2);
break;
default: printf("Invalidoperator!\n"); }}Why?注釋掉會怎樣?例5.8char類型時,單個字符要用單引號引起
5-60main()Why?注釋掉會怎樣?例5.8ch一些思考(1)語句if(0==data2)的必要性——避免"除零錯誤"1998年11月,《科學(xué)美國人》雜志描述了美國導(dǎo)彈巡洋艦約克敦號上的一起事故,除零錯導(dǎo)致軍艦推進(jìn)系統(tǒng)的關(guān)閉如果要求輸入的算術(shù)表達(dá)式中的操作數(shù)和運算符之間可以加入任意多個空格符,那么程序如何修改?5-61一些思考(1)語句if(0==data2)的必要性——避免"5-62main(){
intdata1,data2;
charop; printf("Pleaseentertheexpression:"); scanf("%d%c%d",&data1,&op,&data2);/*%c前有一個空格*/
switch(op) {
case'+': printf("%d+%d=%d\n",data1,data2,data1+data2);
break;
case'-': printf("%d-%d=%d\n",data1,data2,data1-data2);
break;
case'*': printf("%d*%d=%d\n",data1,data2,data1*data2);
break;
case'/':
if(0==data2) printf("Divisionbyzero!\n");
else
printf("%d/%d=%d\n",data1,data2,data1/data2);
break;
default: printf("Invalidoperator!\n"); }}例5.8scanf("%d%c%d",&data1,&op,&data2);空格5-62main()例5.8scanf("%d%c一些思考(2)如果要求對浮點數(shù)進(jìn)行運算,那么程序如何修改?修改例5.5程序,使其能進(jìn)行浮點數(shù)的算術(shù)運算,同時允許使用字符*、x與X作為乘號,并且允許輸入的算術(shù)表達(dá)式中的操作數(shù)和運算符之間可以加入任意多個空格符。5-63浮點數(shù):并不是真正意義上的實數(shù),在某種范圍內(nèi)的近似值,用近似的方法進(jìn)行比較絕對值是否等于一個很小的數(shù)。一些思考(2)如果要求對浮點數(shù)進(jìn)行運算,那么程序如何修改?55-64main(){
floatdata1,data2;
charop; printf("Pleaseentertheexpression:"); scanf("%f%c%f",&data1,&op,&data2);
switch(op) {
case'+': printf("%f+%f=%f\n",data1,data2,data1+data2);
break;
case'-': printf("%f-%f=%f\n",data1,data2,data1-data2);
break;
case'*':
case'x': case'X': printf("%f*%f=%f\n",data1,data2,data1*data2);
break;
case'/':
if(fabs(data2)<=1e-7)/*實數(shù)與0比較*/ printf("Divisionbyzero!\n");
else
printf("%f/%f=%f\n",data1,data2,data1/data2);
break;
default: printf("Invalidoperator!\n"); }}例5.8取絕對值函數(shù)浮點數(shù):并不是真正意義上的實數(shù),在某種范圍內(nèi)的近似值,用近似的方法進(jìn)行比較絕對值是否等于一個很小的數(shù)。5-64main()例5.8取絕對值函數(shù)浮點數(shù):例5.9判斷三角形類型5-65#include<stdio.h>main(){
floata,b,c;
printf("Inputthethreeedgelength:"); scanf("%f,%f,%f",&a,&b,&c);
if(a+b>c&&b+c>a&&a+c>b) /*三角形的基本條件*/ {
if(a==b&&b==c&&a==c) printf(“等邊三角形”);if(a==b||b==c||c==a) printf("等腰三角形");
else
if(a*a+b*b==c*c||a*a+c*c==b*b||b*b+c*c==a*a) printf("直角三角形");
else printf("一般三角形"); }
else { printf("不是三角形\n"); }}錯在哪里?邏輯:等邊三角形等腰直角三角形??實數(shù)精度:直角三角形5_9_1.c例5.9判斷三角形類型5-65#include<例5.9判斷三角形的形狀
三角形種類5-66等腰直角三角形等邊三角形非三角形三角形等腰三角形直角三角形例5.9判斷三角形的形狀三角形種類5-66等腰直5-67main(){
floata,b,c;
intflag=1; ……
if(a+b>c&&b+c>a&&a+c>b) /*三角形的基本條件*/ {
if(a==b||b==c||c==a) { printf("等腰");
flag=0; }
if(a*a+b*b==c*c||a*a+c*c==b*b||b*b+c*c==a*a) { printf("直角");
flag=0; }
if(flag) { printf("一般"); } printf("三角形\n"); }
else { printf("不是三角形\n"); }}例5.9:引用標(biāo)志量等邊三角形?5-67main()例5.9:引用標(biāo)志量等邊三角形?5-68main(){ ……
if(a+b>c&&b+c>a&&a+c>b)/*三角形的基本條件*/ {
if(a==b&&b==c&&c==a) { printf("等邊"); flag=0; }
if(a==b||b==c||c==a) { printf("等腰"); flag=0; }
if(a*a+b*b==c*c||a*a+c*c==b*b||b*b+c*c==a*a) { printf("直角"); flag=0; }
if(flag) printf("一般"); printf("三角形\n"); }
else printf("不是三角形\n");}例5.9:1.邏輯問題錯在哪里?6,6,6等邊等腰三角形5-68main()例5.9:1.邏輯問題錯在哪里?6,5-69main(){ ……
if(a+b>c&&b+c>a&&a+c>b)/*三角形的基本條件*/ {
if(a==b&&b==c&&c==a) { printf("等邊"); flag=0; } elseif(a==b||b==c||c==a) { printf("等腰"); flag=0; }
if(a*a+b*b==c*c||a*a+c*c==b*b||b*b+c*c==a*a) { printf("直角"); flag=0; }
if(flag) printf("一般"); printf("三角形\n"); }
else printf("不是三角形\n");}例5.9:實數(shù)精度問題5_9_2.c5-69main()例5.9:實數(shù)精度問題5_9_2.c5-70main(){ ……
if(a+b>c&&b+c>a&&a+c>b)/*三角形的基本條件*/ {
if(a==b&&b==c&&c==a) { printf("等邊"); flag=0; } elseif(a==b||b==c||c==a) { printf("等腰"); flag=0; }
if(a*a+b*b==c*c||a*a+c*c==b*b||b*b+c*c==a*a) { printf("直角"); flag=0; }
if(flag) printf("一般"); printf("三角形\n"); }
else printf("不是三角形\n");}例5.9:實數(shù)精度問題錯在哪里?5_9_2.c5-70main()例5.9:實數(shù)精度問題錯在哪里?5_5-71main(){ ……
if(a+b>c&&b+c>a&&a+c>b)/*三角形的基本條件*/ {
if(fabs(a-b)<1e-6&&fabs(b-c)<1e-6&&fabs(c-a)<1e-6) { printf("等邊"); flag=0; } elseif(fabs(a-b)<1e-6||fabs(b-c)<1e-6||fabs(c-a)<1e-6) { printf("等腰"); flag=0; }
if(fabs(a*a+b*b-c*c)<=1e-1||fabs(a*a+c*c-b*b)<=1e-1||fabs(b*b+c*c-a*a)<=1e-1) { printf("直角"); flag=0; }
if(flag) printf("一般"); printf("三角形\n"); }
else printf("不是三角形\n");}例5.9:實數(shù)精度問題5_9_3.c5-71main()例5.9:實數(shù)精度問題5_9_3.c5-72main(){ ……
if(a+b>c&&b+c>a&&a+c>b)/*三角形的基本條件*/ {
if(a==b||b==c||c==a) { printf("等腰"); flag=0; } elseif(a==b&&b==c&&c==a) { printf("等邊"); flag=0; }
if(a*a+b*b==c*c||a*a+c*c==b*b||b*b+c*c==a*a) { printf("直角"); flag=0; }
if(flag) printf("一般"); printf("三角形\n"); }
else printf("不是三角形\n");}等腰在先等邊在后是否可以?例5.95_9_4.c5-72main()等腰在先例5.95_9_4.cswitch和else-if的比較相同點:控制多路選擇不同點:else-if比switch的條件控制更強大一些else-if可以依照各種邏輯運算的結(jié)果進(jìn)行流程控制switch只能進(jìn)行==判斷,并且只能是整數(shù)或字符判斷switch比else-if更清晰兩者都要盡量避免用得過多、過長,尤其不要嵌套得太多它們大大增加程序的分支,使邏輯關(guān)系顯得混亂,不易維護(hù),易出錯5-73switch和else-if的比較相同點:控制多路選擇5本章學(xué)習(xí)內(nèi)容5-74
算法的描述方法
單分支控制語句:if雙分支控制語句:if-else
多分支控制語句:ifelseif
多路選擇語句:switchbreak語句在switch語句中的作用運算符:
關(guān)系運算符條件運算符邏輯運算符難點:條件語句的嵌套本章學(xué)習(xí)內(nèi)容5-74算法的描述方法難點:條件語句的嵌套
5-755-75C語言程序設(shè)計第五章程序控制結(jié)構(gòu)76C語言程序設(shè)計第五章1本章學(xué)習(xí)內(nèi)容5-77
算法的描述方法
單分支控制語句:if雙分支控制語句:if-else
多分支控制語句:ifelseif
多路選擇語句:switchbreak語句在switch語句中的作用運算符:
關(guān)系運算符條件運算符邏輯運算符本章學(xué)習(xí)內(nèi)容5-2算法的描述方法算法的概念及其描述數(shù)據(jù)結(jié)構(gòu)+算法=程序數(shù)據(jù)結(jié)構(gòu):數(shù)據(jù)的描述和組織形式算法:為解決一個具體問題而采取的確定的有限的操作步驟。算法特性:有窮性確定性
有效性
沒有輸入或有多個輸入
有一個或多個輸出
5-78算法的概念及其描述數(shù)據(jù)結(jié)構(gòu)+算法=程序5-3算法的特性有窮性在合理的時間內(nèi)完成確定性,無歧義如果x≥0,則輸出Yes;如果x≤0,則輸出No有效性能有效執(zhí)行負(fù)數(shù)開平方?jīng)]有輸入或有多個輸入有一個或多個輸出5-79算法的概念及其描述算法的特性5-4算法的概念及其描述算法的描述方法自然語言描述傳統(tǒng)流程圖(Flowchart)在1966年,Bohra與Jacopini提出N-S結(jié)構(gòu)化流程圖1973年,美國學(xué)者I.Nassi和B.Shneiderman提出偽碼(Pseudocode)表示5-80算法的概念及其描述算法的描述方法5-5算法的概念及其描述偽碼(Pseudocode)人工的,非正式的輔助人們進(jìn)行算法設(shè)計的語言。81if8點以前thendo私人事務(wù);elseif8點到11:45點then上課;else自習(xí);日常生活偽碼(Pseudocode)人工的,非正式的輔助人們進(jìn)行流程圖(Flowchart)5-82開始\結(jié)束框符號Semantic一般處理框輸入\輸出框判斷框連接符流程線流程圖(Flowchart)5-7開始\結(jié)束框符號Sem2022/12/256-83構(gòu)成程序的三種基本結(jié)構(gòu)順序結(jié)構(gòu)選擇結(jié)構(gòu)(分支結(jié)構(gòu))循環(huán)結(jié)構(gòu)任何程序均可只用這三種結(jié)構(gòu)綜合描述只用這三種結(jié)構(gòu)編制的程序,叫結(jié)構(gòu)化程序程序必須符合結(jié)構(gòu)化規(guī)則2022/12/206-8構(gòu)成程序的三種基本結(jié)構(gòu)順序結(jié)構(gòu)2022/12/2584結(jié)構(gòu)化程序設(shè)計的核心思想采用順序、選擇和循環(huán)三種基本結(jié)構(gòu)作為程序設(shè)計的基本單元只有一個入口;只有一個出口;無死語句,即不存在永遠(yuǎn)都執(zhí)行不到的語句;無死循環(huán),即不存在永遠(yuǎn)都執(zhí)行不完的循環(huán)。采用“自頂向下、逐步求精”和模塊化的方法進(jìn)行結(jié)構(gòu)化程序設(shè)計2022/12/209結(jié)構(gòu)化程序設(shè)計的核心思想采用順序、選擇構(gòu)成程序的三種基本結(jié)構(gòu)例:買蘋果,計算價錢5-85
數(shù)量
單位價格總價總價=數(shù)量*單位價格InputProcessOutput首先要確認(rèn)輸入與輸出構(gòu)成程序的三種基本結(jié)構(gòu)例:買蘋果,計算價錢5-10數(shù)順序結(jié)構(gòu)給變量賦值賦值表達(dá)式語句/賦值表達(dá)式;總價=數(shù)量*單位價格;輸入輸出數(shù)據(jù)標(biāo)準(zhǔn)庫函數(shù)調(diào)用語句scanf("%d",&pricePerkg);printf("%d",price);5-86ABC順序結(jié)構(gòu)給變量賦值5-11ABC順序結(jié)構(gòu)——應(yīng)用舉例(1)5-87例:求一個數(shù)的絕對值解:(1)問題分析:step1:給出一個數(shù)num=-55step2:求num的絕對值step3:輸出結(jié)果公式:abs=fabs(num)(利用數(shù)學(xué)函數(shù)fabs())順序結(jié)構(gòu)——應(yīng)用舉例(1)5-12例:求一個數(shù)的絕對值解流程圖及代碼5-88num=-55開始abs=fabs(num)輸出num,abs結(jié)束#include<stdio.h>#include<math.h>main(){intnum,abs;num=-55;abs=fabs(num);printf("|%d|=%d",num,abs);}5_1.c流程圖及代碼5-13num=-55開始abs=fabs常用函數(shù)對應(yīng)的頭文件函數(shù)函數(shù)頭文件數(shù)學(xué)函數(shù)math.h字符串函數(shù)string.h輸入輸出函數(shù)stdio.h動態(tài)存儲分配函數(shù)stdlib.h/malloc.h5-89常用函數(shù)對應(yīng)的頭文件函數(shù)函數(shù)頭文件數(shù)學(xué)函數(shù)math.h字符選擇結(jié)構(gòu)(分支結(jié)構(gòu))
5-90分類:單分支:if雙分支:if-else多分支:if-else-if作用:控制程序的流向組成:常量,變量,表達(dá)式(常用:關(guān)系、邏輯表達(dá)式)選擇結(jié)構(gòu)(分支結(jié)構(gòu))5-15分類:本章學(xué)習(xí)內(nèi)容5-91
算法的描述方法
單分支控制語句:if雙分支控制語句:if-else
多分支控制語句:ifelseif
多路選擇語句:switchbreak語句在switch語句中的作用運算符:
關(guān)系運算符條件運算符邏輯運算符本章學(xué)習(xí)內(nèi)容5-16算法的描述方法關(guān)系運算符與關(guān)系表達(dá)式5-92關(guān)系運算符含義示例值優(yōu)先級<小于6<91(true)高<=小于等于5<=51(true)>大于2>60(false)>=大于等于9>=51(true)==等于7==50(false)低!=不等于6!=51(true)關(guān)系運算符與關(guān)系表達(dá)式5-17關(guān)系運算符含義示例值優(yōu)先級關(guān)系運算符與關(guān)系表達(dá)式關(guān)系運算符運算出的結(jié)果為0和非00,表示假,即該關(guān)系不成立非0,表示真,即該關(guān)系成立絕大多數(shù)編譯器,關(guān)系運算得到的非0結(jié)果為1,但是不要利用這個1優(yōu)先級:<、<=、>、>=優(yōu)先于==、!=5-93關(guān)系運算符與關(guān)系表達(dá)式關(guān)系運算符運算出的結(jié)果為0和非05-關(guān)系運算符與關(guān)系表達(dá)式例:設(shè)a=3,b=2,c=1,計算下列表達(dá)式的值5-94a>ba>b>c10int
a=0;
if
(a=0)
printf("OK");int
a=0;
if
(a==0)
printf("OK");如何避免?int
a=0;
if
(0==a)
printf("OK");int
a=0;
if
(0=a)
printf("OK");編譯出錯??!==與=3.a=b1變量的值就是賦值表達(dá)式的值關(guān)系運算符與關(guān)系表達(dá)式例:設(shè)a=3,b=2,c=1,計算下列本章學(xué)習(xí)內(nèi)容5-95
算法的描述方法
單分支控制語句:if雙分支控制語句:if-else
多分支控制語句:ifelseif
多路選擇語句:switchbreak語句在switch語句中的作用運算符:
關(guān)系運算符條件運算符邏輯運算符本章學(xué)習(xí)內(nèi)容5-20算法的描述方法格式:5-96if(表達(dá)式)
語句;if(表達(dá)式){
語句1;語句2;}單分支控制的條件語句復(fù)合語句被當(dāng)做一條語句單語句格式:復(fù)合語句格式:格式:5-21if(表達(dá)式)單分支控制的條件語句復(fù)合語句單分支控制的條件語句5-97yesno語句A條件成立否條件表達(dá)式.T..F.語句單分支控制的條件語句5-22yesno語句A條件成立例5.1計算兩整數(shù)的最大值5-98#include<stdio.h>main(){inta,b,max;printf("Inputa,b:");scanf("%d,%d",&a,&b);
if(a>b) max=a;
if(a<=b)max=b;printf("max=%d\n",max);}Inputa,b:20,
15↙max=20_5_1.c例5.1計算兩整數(shù)的最大值5-23#include<本章學(xué)習(xí)內(nèi)容5-99
算法的描述方法
單分支控制語句:if雙分支控制語句:if-else
多分支控制語句:ifelseif
多路選擇語句:switchbreak語句在switch語句中的作用運算符:
關(guān)系運算符條件運算符邏輯運算符本章學(xué)習(xí)內(nèi)容5-24算法的描述方法用于雙分支控制的條件語句格式:5-100if(表達(dá)式)
語句A;else
語句B;語句A真語句B假入口出口表達(dá)式!=0表達(dá)式值非0時,執(zhí)行語句A,跳出結(jié)構(gòu);
表達(dá)式值為0時,執(zhí)行語句B,跳出結(jié)構(gòu);else部分可以沒有if(表達(dá)式)
語句A;
當(dāng)表達(dá)式值為0時,跳出結(jié)構(gòu);假入口出口用于雙分支控制的條件語句格式:5-25if(表達(dá)式)語句用于雙分支控制的條件語句5-101if(表達(dá)式){
語句A1;
語句A2;}else{
語句B1;
語句B2;}復(fù)合語句格式:語句A1真語句B1假入口出口表達(dá)式!=0語句A2語句B2用于雙分支控制的條件語句5-26if(表達(dá)式)復(fù)合語句格例5.1計算兩整數(shù)的最大值5-102NoYesInputaandbOutputmaxa>b?maxbmaxaStartEnd例5.1計算兩整數(shù)的最大值5-27NoYesInput例5.1計算兩整數(shù)的最大值5-103NoYesInputaandbOutputmaxa>b?maxbmaxaStartEndscanf("%d,%d",&a,&b);if(a>b)max=a;elsemax=b;printf("max=%d\n",max);例5.1計算兩整數(shù)的最大值5-28NoYesInput5-104#include<stdio.h>main(){inta,b,max;printf("Inputa,b:");scanf("%d,%d",&a,&b);
if(a>b) max=a;
if(a<=b)max=b;printf("max=%d\n",max);}例5.1計算兩整數(shù)的最大值if(a>b)max=a;elsemax=b;5-29#include<stdio.h>例5.1計本章學(xué)習(xí)內(nèi)容5-105算法的描述方法
單分支控制語句:if雙分支控制語句:if-else
多路選擇語句:switchbreak語句在switch語句中的作用運算符:
關(guān)系運算符條件運算符邏輯運算符本章學(xué)習(xí)內(nèi)容5-30算法的描述方法條件運算符和條件表達(dá)式5-106#include<stdio.h>main(){inta,b,max;
printf("Inputa,b:");scanf("%d,%d",&a,&b);
if(a>b) max=a;
else max=b;printf("max=%d",max);}表達(dá)式1?表達(dá)式2:表達(dá)式3max=a>b?a:b;條件運算符和條件表達(dá)式5-31#include<st條件表達(dá)式5-107一般形式:
(a>b)?a:ba>b條件成立該表達(dá)式的值就是aa>b條件不成立該表達(dá)式的值是b此種表達(dá)式切忌用得過于繁雜條件表達(dá)式5-32一般形式:例5.2:求分段函數(shù)的值5-108(參見教材P40:常用標(biāo)準(zhǔn)數(shù)學(xué)函數(shù))解:有分段函數(shù):y=X>01X<=0exp(-x)#include<math.h>例5.2:求分段函數(shù)的值5-33(參見教材P40:常用例5.2:求分段函數(shù)的值5-109#include
<stdio.h>#include
<math.h>main(){
float
x,y;
printf("Inputx:"); scanf("%f",&x);
if(x>0)y=exp(-x);elsey=1; printf(“y=%f\n”,y);}5_2.c例5.2:求分段函數(shù)的值5-34#include<st例5.3閱讀程序,求程序結(jié)果5-110#include
<stdio.h>main(){
int
a=3,b=2,c=1;
if
(a>b) {
if
(a>c)printf(a=%d\n,a); else
printf(b=%d\n,b);} printf(over!\n);}if與else配對5_3.c例5.3閱讀程序,求程序結(jié)果5-35#include本章學(xué)習(xí)內(nèi)容5-111算法的描述方法
單分支控制語句:if雙分支控制語句:if-else
多分支控制語句:ifelseif
多路選擇語句:switchbreak語句在switch語句中的作用運算符:
關(guān)系運算符條件運算符邏輯運算符本章學(xué)習(xí)內(nèi)容5-36算法的描述方法5-112多分支選擇結(jié)構(gòu)if的一種擴(kuò)展形式if(表達(dá)式1)
語句1;
elseif
(表達(dá)式2)
語句2;
elseif(表達(dá)式3)
語句3;
…………
elseif(表達(dá)式n)
語句n;
else
語句n+1;
else部分可以沒有5-37多分支選擇結(jié)構(gòu)if的一種擴(kuò)展形式多分支選擇結(jié)構(gòu)5-113Stepaexpression1Ste
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 安全標(biāo)準(zhǔn)化生產(chǎn)責(zé)任制度
- 生產(chǎn)安全考核與獎勵制度
- 生產(chǎn)車輛全過程管理制度
- 生產(chǎn)場所巡檢制度范本
- 企業(yè)生產(chǎn)檔案管理制度
- 生產(chǎn)副班長生產(chǎn)管理制度
- 2026重慶市涪陵區(qū)武陵山鎮(zhèn)人民政府招聘公益性崗位1人參考考試題庫附答案解析
- 生產(chǎn)車間防蠅蟲制度
- 生產(chǎn)函數(shù)與科學(xué)制度
- 先進(jìn)生產(chǎn)班組管理制度
- 2024年水合肼行業(yè)發(fā)展現(xiàn)狀分析:水合肼市場需求量約為11.47萬噸
- 肺炎性假瘤誤診為肺癌的HRCT表現(xiàn)及淺析
- (正式版)JBT 14933-2024 機械式停車設(shè)備 檢驗與試驗規(guī)范
- 幼兒園勞動教育計劃及實施
- 新人教版五年級小學(xué)數(shù)學(xué)全冊奧數(shù)(含答案)
- 志愿服務(wù)證明(多模板)
- 術(shù)后腸麻痹學(xué)習(xí)課件
- 淋膜作業(yè)標(biāo)準(zhǔn)指導(dǎo)書
- 頂管施工方案非開挖電纜管道專項施工方案
- XX小學(xué)傳統(tǒng)體育游戲集錦
- GB/T 33091-2016聚氨酯篩板
評論
0/150
提交評論