1. 程式人生 > >10-17日(第七週週三)上課簡記:選擇結構

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選擇語句將變得異常靈活。 大家慢慢領悟它的奧祕吧。祝你們愉快,健康!!!