10-17日(第七週週三)上課簡記:選擇結構
1.演算法——程式設計的靈魂
-
提問:當你面對一個問題時,你解決它的基本步驟是什麼?
答曰:理解問題;制定計劃;執行計劃;回頭看。 -
提問:如何用計算機求解問題?
答曰:問題描述——>對問題進行抽象,數學建模(讓計算機理解問題)——>演算法設計——>程式設計(用計算機語言)——>求出問題的解。然後,我們檢視計算機求得的結果是否正確,還能不能改進等。
【例項】對於買土豆這個問題。我們需要抽象出買多少斤土豆(用x表示),土豆一斤多少錢(用y表示),繼而才能計算出買土豆所需的總價格。
建模:t=x*y
演算法設計:
step1:輸入x,y;
step2:根據公式t=x*y計算總價;
step3:輸出總價t
有了演算法設計,接下來用程式語言來實現就可以進行問題的求解了。可以看出,演算法設計很關鍵。
- 提問:什麼是演算法?
- 答曰:為解決一個具體問題而採取的確定的有限的操作步驟,僅指計算機能執行的演算法。
前輩說,程式設計是一門藝術,體現在:演算法設計是程式的靈魂,結構設計是程式的肉體。Pascal語言的發明者,同時也是圖靈獎獲得者Wirth教授提出:演算法+資料結構=程式。
-
演算法的特性:
有窮性(包含有限的步驟操作);確定性(每一條指令必須有明確的含義,對於相同的輸入能得出相同的執行結果);允許沒有輸入或有多個輸入;必須有一個或多個輸出。
-
常用的演算法描述方法:
(1)自然語言;通俗易懂,符合人的日常思維習慣,但不易直接轉換為程式。
step1:輸入x,y;
step2:根據公式t=x*y計算總價;
step3:輸出總價t
(2)偽碼描述:介於自然語言和計算機語言之間
begin
input x,y
t=x*y
output t
End
(3)流程圖:形象直觀。描述程式的控制流程和指令執行情況的有向圖。
(4)N-S結構化流程圖:取消了流程線。
2. 順序結構
- 問題:把大象放到冰箱裡需要幾個步驟?
- 答曰:開啟冰箱門;把大象放進去;把冰箱門關上。
讓計算機求解問題,必須事先指定好求解次序。一般而言,順序結構程式涉及如下三個基本操作:輸入資料;處理資料;輸出資料 - 順序結構特點:
只要按照解決問題的順序寫出相應的語句就行。執行順序是自上而下,依序而行,也即一句一句執行。
【程式設計例項】求兩個整相乘的結果,並將該結果輸出的螢幕上。
#include<stdio.h>
int main()
{
int x,y,xc;
scanf("%d%d",&x,&y);
xc=x*y;
printf("%d*%d=%d\n",x,y,xc);
return 0;
}
3. 選擇結構
- 思考:什麼時候需要使用選擇結構?選擇結構有幾種形式?
人生常常面臨許多岔路口,不同的抉擇將有可能完全改變你人生的軌跡。
例子1:
- 曹操敗走華容道
- 如果曹操不走華容道
- 如果關羽不放走曹操
歷史恐怕就要改寫了。
例子2:
意林上有篇文章:馬屁精改變了歐洲世界。有關窩闊臺的故事,大家可以去看看,特別有趣。
例子3:
前幾天微信朋友圈發了一個幼兒園的視訊,老師提問:樹上有10只鳥,開槍打死一隻,還剩幾隻?
孩子們回答:
如果掛在樹枝上,則剩一隻,如果掉下來,則一隻也不剩。
如果有關在籠子裡的鳥,則。。。。。。
如果用的是無聲手槍,則。。。。。。
如果樹上有的鳥是聾子,則。。。。。。
如果一槍打死了兩隻,則。。。。。。
當時笑的肚子疼,看了好幾遍。
其實,上述幾個例子均為多分支控制問題,可以採用選擇結構(分支結構)來解決,共有三種選擇結構。
3.1單分支
單分支:如果滿足某種條件,就進行相應的處理。例如,我昨天給月月說:閨女,你要是認真吃飯,待會媽媽讓你看兩集小豬佩奇。該問題可採用if語句來實現。
if(月月認真吃飯)
媽媽讓她看兩集小豬佩奇;
單分支只提到月月認真吃飯了該怎麼處理,並沒有提到月月不認真吃飯該怎麼處理。
【程式設計例項】比較兩個數的大小,求出較大的值。
#include<stdio.h>
int main()
{
int x=11,y=22;
int max=x;
if(x<y)
max=y;
printf("max=%d\n",max);
return 0;
}
單分支指的是:在滿足x<y的情況下,語句max=y;被執行,並沒有提到x>=y的情況該怎麼做。所以說,單分支就是要麼執行,要麼不執行。
3.2:雙分支
雙分支:在兩個不同的操作中選擇其中一個來執行。用if-else語句實現。
例如,我今天又給月月說:閨女,你要是認真吃飯,待會媽媽讓你看兩集小豬佩奇;否則的話,媽媽帶你去遊樂場玩。該問題可採用if-else語句來實現。
if(月月認真吃飯)
媽媽讓她看兩集小豬佩奇;
else
媽媽帶她去遊樂場玩;
雙分支不但提到月月認真吃飯了該怎麼處理,也提到了月月不認真吃飯該怎麼處理。
【程式設計例項】比較兩個數的大小,求出較大的值。
#include<stdio.h>
int main()
{
int x=11,y=22,max;
if(x<y)
max=y;
else
max=x;
printf("max=%d\n",max);
return 0;
}
再來看一個稍微複雜的雙分支結構,不要暈哦。
【程式設計例項】比較三個數的大小,求出最小值。
#include<stdio.h>
int main()
{
int x=11,y=22,z=33;
if(x>y)
{
if(y>z)
printf("min=%d\n",z);
else
printf("min=%d\n",y);
}
else
{
if(x>z)
printf("min=%d\n",z);
else
printf("min=%d\n",x);
}
return 0;
}
3.3多分支
多分支:有多個選擇,用else if語句實現。
例如,我又給月月說:閨女,你要是認真吃飯,待會媽媽讓你看兩集小豬佩奇;否則的話,如果你認真洗臉,媽媽就帶你去遊樂場玩,要是不認真洗臉,就待在家裡聽媽媽給你講故事哦。該問題可採用if-else語句來實現。
if(月月認真吃飯)
媽媽讓她看兩集小豬佩奇;
else if(月月認真洗臉)
媽媽帶她去遊樂場玩;
else
月月待在家裡聽媽媽講故事;
【程式設計例項】根據輸入的學生成績判斷等級:成績≥90時為A級,80≤成績<90時為B級,70≤成績<80時為C級,60≤成績<70時為D級,成績<60為E級。
#include<stdio.h>
int main()
{
int score;
scanf("%d",&score);
if(score<0||score>100)
printf("input error!\n");
else if(score>=90&&score<=100)
printf("A\n");
else if(score>=80)
printf("B\n");
else if(score>=70)
printf("C\n");
else if(score>=60)
printf("D\n");
else
printf("E\n");
return 0;
}
上述程式也可以改寫單分支結構:
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
int main()
{
int score;
scanf("%d",&score);
if(score<0||score>100)
{
printf("input error!\n");
exit(1);
}
if(score>=90&&score<=100)
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");
if(score>=0&&score<60)
printf("E\n");
return 0;
}
也可以改寫為雙分支結構:
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
int main()
{
int score;
scanf("%d",&score);
if(score<0||score>100)
{
printf("input error!\n");
exit(1);
}
else
{
if(score>=70)
{
if(score<80)
printf("C\n");
else if(score<90)
printf("B\n");
else
printf("A\n");
}
else
{
if(score>=60)
printf("D\n");
else
printf("E\n");
}
}
return 0;
}
採用巢狀,if選擇語句將變得異常靈活。 大家慢慢領悟它的奧祕吧。祝你們愉快,健康!!!