Branching and Looping Statements charturong.ee.engr.tu.ac.th/CN208

Preview:

DESCRIPTION

Branching and Looping Statements charturong.ee.engr.tu.ac.th/CN208. จาตุรงค์ ตันติบัณฑิต ภาควิชาวิศวกรรมไฟฟ้าและคอมพิวเตอร์ มหาวิทยาลัยธรรมศาสตร์. เอกสารประกอบการสอนนี้จัดทำโดย ดร.ทรงยศ นาคอริยกุล. Introduction. - PowerPoint PPT Presentation

Citation preview

Branching and Looping Statements

charturong.ee.engr.tu.ac.th/CN208

จาตรงค ตนตบณฑตภาควชาวศวกรรมไฟฟาและคอมพวเตอร

มหาวทยาลยธรรมศาสตร

เอกสารประกอบการสอนนจดทำาโดย ดร.ทรงยศ นาคอรยกล

2

Introduction

ในบทน เราจะแนะนำาการเขยนโปรแกรมใน MATLAB โดยการใชคำาสงทควบคมการลำาดบการประมวลผลของคำาสงใน MATLAB โดยทแบงออกไดเปน 2 ประเภทใหญๆคอ คำาสง branches ทเลอกบางสวนของโคด (code) ไปประมวลผล และ คำาสง loops ประมวลผลโคดแบบวนซำา

โดยทเราจะพดถงหวขอตอไปน• การเขยนโปรแกรมโดยใช top-down design techniques• การใชขอมลประเภทตรรกะ (logical data type)• การใชคำาสง branches• การใชคำาสง loops

3

การเขยนโปรแกรมแบบ top-down design

การเขยนโปรแกรมแบบ top-down design คอการแตกปญหาใหญทเราไดรบใหเปนหวขอยอยๆซงงายตอการแกไขและเขาใจ จากนนจงเขยนโปรแกรมแกปญหายอยๆใหสำาเรจและตรวจสอบวาโปรแกรมเหลานทำางานไดจรง ในขนตอนสดทายจงนำาโปรแกรมยอยๆเหลานมารวมกนเพอแกปญหาใหญทเราไดรบ

ขนตอนในการเขยนโปรแกรมแบบมประสทธผลสามารถทำาไดดงตอไปน• เขาใจปญหาทจะแกไขใหถกตองและชดเจน• กำาหนดตวอนพต (input) และตวเอาทพต (output) ของโปรแกรมให

ชดเจน• ออกแบบการแกไขปญหาใหละเอยด (design the algorithm)• เปลยนอลกอรทมใหเปนคำาสงใน MATLAB• ตรวจสอบและแกไขโปรแกรม

4

การเขยนโคดเทยม (pseudocode)

ในการออกแบบโปรแกรมแตละครง ผเขยนโปรแกรมสมควรเขยน pseudocode เพอชวยใหงายตอการแกไขปญหา pseudocode ทเขยนจะเปนคำาพดภาษาองกฤษผสมกบรปแบบการใชใน MATLAB เชน เขยนคำาสงเปนบรรทดๆแบบ MATLAB โดยทคำาสงเปนคำาพดภาษาองกฤษ เปนตน

Pseudocode จะชวยผเขยนโปรแกรมในการเรยบเรยงความคดกอนทจะแปลงความคดเปนคำาสงใน MATLAB

5

ตวอยางท 1: Temperature Conversion

จงเขยนโปรแกรม MATLAB ทเปลยนคาอณหภมในระบบฟาเรนไฮตเปนระบบองศาเซลเซยส โดยทโปรแกรมจะรบคาอนพตจากผใชโปรแกรมเปนตวเลขอณหภมในระบบฟาเรนไฮต แลวแสดงผลเปนอณหภมระบบองศาเซลเซยส ออกบนหนาจอ

6

การแกไขปญหาเราจะแกไขปญหาแบบ top-down design ดงทกลาวไปแลวในขางตน

สำาหรบตวอยางนมขนาดเลกจงไมจำาเปนตองแตกปญหาเปนปญหายอยๆแตอยางใด โปรแกรมนสรปไดสนๆวามตวอนพตเปนตวเลขหนงตวและตวเอาทพตหนงตว ซงการออกแบบอลกอรทมในการแกปญหากแสดงไดดวยสมการตอไปน

เราสามารถเขยน pseudocode สำาหรบปญหานไดดงนPrompt user to enter temperature in degree FahrenheitRead temperature in degrees Fahrenheit (temp_f)temp_c in Celsius (temp_f – 32) / 1.8Write temperature in Celsius

( ) ( ) 32 /1.8T in Celsius T in Fahrenheit

7

temp_conversion.m% Script file: temp_conversion% Programmer: …………….% Purpose: to convert an input temperature from degrees Fahrenheit% to an output temperature in Celsius.% Define variables:% temp_f -- Temperature in degrees Fahrenheit% temp_c -- Temperature in degrees Celsius

% Prompt the user for the input temperaturetemp_f = input('Enter the temperature in degrees Fahrenheit:');

% Convert to Celsius.temp_c = (temp_f - 32) / 1.8;

% Write out the result.fprintf('%6.2f degrees Fahrenheit = %6.2f Celsius.\n', temp_f, temp_c);

8

Testing the program

หลงจากเขยนโปรแกรมสำาเรจแลว ผเขยนโปรแกรมสมควรทจะตองตรวจสอบความถกตองของโปรแกรมทเขยนเสมอ โดยทำาไดดวยการทดลองใสคาอนพตเพอตรวจสอบ

9

The Logical Data Type

ชนดของขอมลอกประเภทหนงใน MATLAB คอ ขอมลตรรกะ (logical data type) ทมคาได 2 ชนดคอ จรง (true) หรอ เทจ (false) โดยมการเรมใชใน MATLAB 6.5 เปนตนไป ขอมลตรรกะสามารถถกสรางโดยคำาสง 2 ประเภทคอ relational operators กบ logic operators

หากเราตองการกำาหนดคาตวแปรใหเปนประเภท logical กทำาไดเชน>> a1 = true;

เวลาทขอมลประเภทตรรกะถกใชผสมกบตวเลข ขอมลประเภทตรรกะจะถกเปลยนเปนตวเลขโดยทคา true คอ 1 และคา false เปน 0 ถาหากขอมลตวเลขถกใชแทนทขอมลตรรกะ คาตวเลขทไมเทากบ 0 จะถกเปลยนเปน true และคา 0 จะถกเปลยนเปน false

10

Relational Operators

คาโอเปอเรเตอรสำาหรบเปรยบเทยบความสมพนธระหวางคาตวแปรชนดสเกลารหรอเมทรกซกได โดยทคาโอเปอเรอเตอรทใชมดงน

โอเปอเรเตอร Relational คำาอธบาย==~=<>

<=>=

เทากบไมเทากบนอยกวามากกวานอยกวาหรอเทากบมากกวาหรอเทากบ

11

ตวอยางการใช relational operators

โอเปอเรเตอร ผลลพธ3 < 4

3 == 43 ~= 43 <= 4

7+ 3 > 4 +103^2 >= 4

จรง (1) เทจ (0) จรง (1) จรง (1) เทจ (0) จรง (1)

12

Logic Operators

โอเปอเรเตอร logic เปนโอเปอเรเตอรทใชเชอมความสมพนธระหวางคาของตวแปรทเกดขนโดยโอเปอเรเตอร relational ถาความสมพนธสอดคลองกนผลลพธทไดกจะมคาเปนจรง (true) แตถาความสมพนธไมสอดคลองกนผลลพธทไดกจะมคาเปนเทจ (false) โอเปอเรเตอร logic ทใชทวไปใน MATLAB มอย 3 แบบ คอ

โอเปอเรเตอร logic คำาอธบาย&|~

และ (AND)หรอ (OR)ไม (NOT)

13

ผลลพธของโอเปอเรเตอร logic

ยกตวอยางเชน >> x = (5 > 3) & (2 < 9);

ผลลพธ x จะมคาเปนจรง (true)

อนพต และ (AND) หรอ (OR) ไม (NOT)

P Q false false false true true false true true

P & Q P | Q ~P false false true false true false true false true true

14

Branchesการเขยนคำาสงทดสอบเงอนไขใน MATLAB มความจำาเปนอยางมาก เพอ

ชวยในการตดสนใจทซบซอน และชวยใหโปรแกรมตดสนใจเลอกคำาสงทจะกระทำาและคำาสงทจะไมกระทำา รปแบบการใชทนาสนใจคอ คำาสง if และคำาสง switch

คำาสง ifคำาสง if ใชทำาการทดสอบเงอนไขความสมพนธวาเปนจรงหรอเปนเทจแลวจงกระทำาคำาสงทอยภายใตเงอนไขนน มรปแบบการใชงานดงนif expression (command 1)(command 2)…end

ถาผลการทดสอบเงอนไขเปนจรง โปรแกรมMATLAB จะกระทำาคำาสง commands ทงหมดทอยระหวาง if และ end แตถาผลการทดสอบเปนเทจ โปรแกรมจะขาม(ไมประมวลผล) คำาสงทงหมดทอยระหวาง if และ end

15

คำาสง if กบ else คำาสง if ยงมรปแบบการใชงานในการตดสนใจทซบซอน โดยมรปแบบการ

ใชงานรวมกบ else ดงน

if expression (commands evaluated if expression is true)

else(commands evaluated if expression is false)

end

ถาผลการทดสอบเงอนไขใน expression เปนจรง MATLAB จะกระทำาคำาสง commands ทงหมด (ซงอาจจะมมากกวา 1 คำาสง) ทอยระหวาง if กบ else แตถาหากผลการทดสอบ expression เปนเทจ คำาสง commands ทงหมดทอยระหวาง else กบ end จะถกกระทำา

16

elseifหากในการตดสนใจมหลายเงอนไขและซบซอนมากขน คำาสง if มการใชรวมกบคำาสง

elseif ไดดงนif expression_1(commands_1 evaluated if expression_1 is true)elseif expression_2(commands_2 evaluated if expression_2 is true)elseif expression_3(commands_3 evaluated if expression_3 is true) else(commands evaluated if no other expression is true)end

ซงหากผลการทดสอบเงอนไขใน expression_1 เปนจรง คำาสง commands_1 ทงหมด (ซงอาจจะมมากกวา 1 คำาสง) จะถกกระทำาและจะขามคำาสงทเหลอทงหมดไปจนถง end แตถา expression_1 เปนเทจ expression_2 จะถกตรวจสอบเปนลำาดบตอไปเรอยๆ

ขอควรจำา: คำาสง else ตวสดทายและ commands ทเกยวกบ else นนอาจจะมหรอไมมกได

17

ตวอยางท 2: function of two variables

จงเขยนโปรแกรม MATLAB เพอชวยคำานวณคาของฟงกชน f(x,y) โดยกำาหนดใหผใชเปนผกำาหนดคา x และ y แลวแสดงผล f(x,y) ออกบนหนาจอ ฟงกชน f(x,y) มดงคาตอไปน

f(x,y) = x + y, x >= 0 and y >= 0 x + y2, x >= 0 and y < 0 x2 + y, x < 0 and y >= 0 x2 + y2, x < 0 and y < 0

18

การแกไขปญหาเราเรมดวยการเขยน pseudocode สำาหรบปญหาขอน

Prompt the user for the values x and yRead x and y if x >= 0 and y >= 0

func x + yelseif x >= 0 and y < 0

func x + y^2elseif x < 0 and y >= 0

func x^2 + yelse

func x^2 + y^2endWrite out f(x,y)

19

func_xy.m% Script file: func_xy.m% Programmer: ...................% Purpose: This program solves the function f(x,y) for a user-% specified x and y, where f(x, y) is defined as:% f(x,y) = x + y, x >= 0 and y >= 0% x + y2, x >= 0 and y < 0% x2 + y, x < 0 and y >= 0% x2 + y2, x < 0 and y < 0 %% Define variables:% x -- first independent variable % y -- second independent variable% func -- resulting function

20

% Prompt the user for the values x and yx = input('Enter the x coefficient: ');y = input('Enter the y coefficient: ');

% Calculate the function f(x,y) if x >= 0 & y >= 0

func = x + y;elseif x >= 0 & y < 0

func = x + y^2;elseif x < 0 & y >= 0

func = x^2 + y;else

func = x^2 + y^2;end

%Write the value of the functiondisp (['The value of the function is ', num2str(func)]);

21

คำาสง switchคำาสง switch เปนคำาสงประเภท branching อกแบบหนงทใหผเขยน

โปรแกรมเลอกใช รปแบบของคำาสง switch มดงนswitch switch_var

case case_expression_1(commands_1)

case case_expression_2(commands_2)

otherwise(commands_3)

end

ถาคาของ switch_var เทากบ case_expression_1 คำาสง commands_1 ทงหมด (ซงอาจมมากกวา 1 คำาสง) จะถกกระทำาแลวโปรแกรมจะขามคำาสงทเหลอทงหมดไปจนถง end แตถา switch_var เทากบ case_expression_2 commands_2 ทงหมดจะถกกระทำาแทน แบบนตอไปเรอยๆ ถาทก case เปนเทจ คำาสงใน otherwise จะถกใช

ขอควรจำา: คำาสง otherwise จะมหรอไมมกได

22

การรวม case ใน switchถา case บาง case ใหผลลพธของคำาสงเดยวกน เราสามารถรวม case

เหลานเขาดวยกนได ซงทำาไดโดยการรวมไวในเครองหมายปกกา (brackets) โดยใชรปแบบดงน

switch switch_varcase {case_expression_1, case_expression_2}

(commands_1)case {case_expression_3, case_expression_4}

(commands_2)otherwise

(commands_3)end

โดยท switch_var สามารถเปนตวเลข (double) หรอตวอกษร (character string) กได

23

ตวอยางการใชคำาสง switchหากเราตองการแสดงผลบนหนาจอวาตวเลขทผใชเลอกระหวาง 1 ถง 10

เปนเลขคหรอเลขคกสามารถใชคำาสง switch ไดดงน

value = input('Choose a integer between 1 and 10: ');switch value

case {1, 3, 5, 7, 9}disp('The number is odd.');

case {2, 4, 6, 8, 10}disp('The number is even.');

otherwisedisp('The number is out of range.');

end

24

ตวอยางคำาสง switch กบตวแปร charคำาสง switch สามารถใชเปรยบเทยบตวแปรประเภทตวอกษร (character

string) โดยเชนการแปลงคาตวแปร x จากเซนตมเตอรเปนระบบอนเชน เปนนว ฟต หรอ เมตร

x = 2.7;units = 'm' ;switch unitscase {'inch' , 'in' }y = x/2.54;case {'feet' , 'ft' }y = x/2.54/12;case {'meter' , 'm' }y = x/100;otherwisedisp(['Unknown Units: ', units])y = nan;end

หลงจาก run โปรแกรมนแลว ผลลพธทไดคอ y = 0.027

25

คำาสงวนลปการเขยนโปรแกรมทซบซอน ในหลายๆครงมความจำาเปนตองคำานวณชด

คำาสงบางอยางซำาไปซำามาหลายๆรอบ ซงคำาสงวนลปทสำาคญๆมอย 2 แบบคอ คำาสง for และคำาสง while

ขอแตกตางทสำาคญของ 2 คำาสงนคอ คำาสง while จะวนซำาไปเรอยๆไมมทสนสด จนกวา การทดสอบเงอนไขใน expression จะเปนเทจ ในขณะท คำาสง for จะกำาหนดจำานวนรอบการวนซำาไวชดเจน

26

คำาสง while

คำาสง while จะทำาการทดสอบเงอนไขใน expression ทกๆรอบของการวนซำา ถาผลการทดสอบใน expression ใหคาเปนจรง โปรแกรมจะกระทำาคำาสงทงหมดภายใน while ลปหนงรอบ แลวกลบมาตรวจสอบ expression อกครงหนง และจะทำาแบบนตอไปเรอยๆ จนกวาผลการทดสอบจะเปนเทจ แลวMATLAB จงจะกระทำาคำาสงหลงจากคำาสง end

คำาสง while มรปแบบการใชงานดงน

while expression(commands)

end

27

ตวอยางการใชคำาสง while

ในตวอยางนจะแสดงการใช while loop ในการถามผใชโปรแกรมใหตอบคำาถามทางคณตศาสตร และจะไมออกจากโปรแกรมจนกวาผใชโปรแกรมจะตอบถก

sum = input('What is five plus ten?: ');while (sum ~= 15)

disp('Nope! Your answer is incorrect.');sum = input('What is five plus ten?: ');

enddisp('Great! You are smart.')

28

คำาสง for

คำาสง for จะกระทำาคำาสงทงหมด (ซงอาจจะมมากกวา 1 คำาสง) ทอยระหวาง expression กบ end ในจำานวนรอบทคงท ทกำาหนดไวใน expression โดยมรปแบบการใชงานดงน

for index = array(commands)

endตวแปร index คอ ตวแปรของลป (loop variable) และ array คอ อาเรย

ทเปนตวควบคมจำานวนลป (loop control expression) แตละคอลมนใน array จะถกกำาหนดใหกบตวแปร index ในแตละรอบในการวนลป คำาสง commands ทงหมดจะถกกระทำาในแตละจำานวนรอบของการวนลป โดยสวนมากแลว array จะเปนเวกเตอรและมแบบฟอรมคอ first:incr:last

29

ตวอยางการใชคำาสง for

sum = 0;for ii = 1:10

sum = sum + ii;fprintf('sum = %6.2f.\n', sum);

endfprintf('The value of ii is now %d.\n', ii);

30

คำาอธบายตวอยางการใช for1 .ในตอนเรมตนของคำาสง for โปรแกรม MATLAB สราง array ซง

เปน row vector มคาจาก 1 ถง 102. ในครงท 1 ของการวนลป ตวแปร ii มคาเปน 1 ซงเปนคาเลขตวแรก

ใน array และคำาสงทงหมดระหวาง คำาสง for กบ end จะถกกระทำา ผลลพธคอคาของตวแปร sum = sum + ii หรอ 0 + 1 ซงกคอ 1

3. เมอคำาสง fprintf ถกกระทำา โปรแกรมจะเจอกบคำาสง end ดงนนโปรแกรมจะวนกลบไปยงจดเรมตนของคำาสง for และกำาหนดคาตวเลขตวตอไปใน array ใหกบตวแปร ii ซงกคอเลข 2 เพราะฉะนนในการวนลปครงน ii = 2 และคาของตวแปร sum = sum + ii = 1 + 2 หรอ 3

4. โปรแกรม MATLAB จะทำาคำาสงในขอ 3 ไปเรอยๆ จนกระทงตวเลขตวสดทายใน array ถกกำาหนดใหกบตวแปร ii และคำาสง commands ระหวาง for กบ end จะถกกระทำาเปนรอบสดทาย

31

ตวอยางท 2 ของการใชคำาสง for

sum = 0;for ii = 1:2:9

sum = sum + 1;fprintf('sum = %6.2f.\n', sum);

endfprintf('The value of ii is now %d.\n', ii);

32

คำาเตอนในการใชคำาสง forหลกเลยงการกำาหนดคาใหมใหกบตวแปร index โดยใชคำาสง commands ภายในคำา

สง for ลปการกำาหนดคาใหมใหกบตวแปร index ภายในคำาสง for ไมสามารถทำาใหคำาสงวนลป

for จบเรวขนได และอาจทำาใหเกดขอผดพลาดหรอ bug ไดงาย ยกตวอยางเชนsum = 0;for ii = 1:10ii = 5;sum = sum + ii;fprintf('sum = %6.2f.\n', sum);endfprintf('The value of ii is now %d.\n', ii);

ในตวอยางน คำาสง for จะวนลปเปนจำานวน 10 รอบและคา sum จะมคาเปน 50 เมอจบโปรแกรม

33

คำาสง break กบ continue

มคำาสง 2 คำาสงทสามารถใชควบคมการวนลปของคำาสง while และ for ไดนนกคอ คำาสง breakและ continue

คำาสง break หยดการทำางานของคำาสงวนลปใน for หรอ while และสงให MATLAB กระทำาคำาสงบรรทดตอไปจากคำาสง end

คำาสง continue หยดการทำางานของคำาสงวนลปใน for หรอ while แลวสงให MATLAB กลบไปทำาคำาสงในจดเรมตนของคำาสงวนลป

34

ตวอยางการใช breakfor ii = 1:5if ii == 3 break;endfprintf('ii = %d\n', ii);enddisp(['End of loop!']);

เวลาท m-file นถก run ผลลพธทจะไดบนหนาจอคอ ii = 1ii = 2End of loop!

นนเพราะเมอ ii เทากบ 3 เงอนไขทดสอบใน if จะเปนจรงแลวคำาสง break จะถกกระทำา ซงทำาใหขามคำาสงทงหมดในคำาสง for ลป แลวไปกระทำาคำาสงหลงจาก end

35

ตวอยางการใชคำาสง continuefor ii = 1:5if ii == 3 continue;endfprintf('ii = %d\n', ii);enddisp(['End of loop!']);

เวลาท m-file นถก run ผลลพธทจะไดบนหนาจอคอ ii = 1ii = 2ii = 4ii = 5End of loop!

นนคอเมอ ii เทากบ 3 เงอนไขทดสอบใน if จะเปนจรงแลวคำาสง continue จะถกกระทำา ซงทำาใหขามคำาสงทงหมดในรอบลปนน ไปยงคำาสง for ใหม แลว ii จะมคาเปน 4 ในการวนรอบใหมและกระทำาคำาสงตอไปจนจบ

36

Nested Loops

ในบางกรณ อาจมการเขยนคำาสงวนลปภายในของอกคำาสงวนลป ซงทง 2 ลปนนเรยกวา nested loops โดยตวอยางตอไปนเปน คำาสง for ลปภายในอกคำาสง for ลป (two nested for loops) สำาหรบหาผลคณของจำานวนเตมของจำานวน

for ii = 1:3 for jj = 1:3 product = ii * jj;

fprintf('%d * %d = %d\n', ii, jj, product); endend

37

คำาสง for ตวนอก(ตวแรก) จะกำาหนดคา 1 ใหกบตวแปร ii จากนนคำาสง for ตวใน(ตวทสอง) จะถกกระทำา 3 ครงโดยทตวแปร jj จะมคา 1, 2, และ 3 ซงหลงจากจบการกระทำา for ลปตวในแลว คำาสง for ตวนอกจะกำาหนดคาตวแปร ii เปน 2 แลว เรมทำาคำาสง for ตวในใหมอกครงแบบน ไปจนกระทงคำาสง for ตวนอก ไดกำาหนดคาใหกบตวแปร ii จนครบ 3 ครง

ผลลพธทไดจากโปรแกรมขางตนคอ 1 * 1 = 11 * 2 = 21 * 3 = 3 2 * 1 = 22 * 2 = 42 * 3 = 63 * 1 = 33 * 2 = 63 * 3 = 9

38

การใชคำาสง break หรอ continue ใน nested loops

ถาคำาสง break หรอ continue ปรากฎอยภายในคำาสงวนลปตวใน คำาสง break หรอ continue นนจะมผลตอคำาสงวนลปตวในเทานน ยกตวอยางเชน

for ii = 1:3 for jj = 1:3 if jj == 3

break;endproduct = ii * jj;fprintf('%d * %d = %d\n', ii, jj, product);

end fprintf('End of inner loop\n');end fprintf('End of outer loop\n');

39

เมอคำาสงวนลปตวใน กำาหนดคาให jj เปน 3 คำาสง break จะถกกระทำาซงทำาใหโปรแกรมหยดการกระทำาคำาสงลปตวใน และพมพแสดงผล End of inner loop จากนนโปรแกรมกจะกลบไปทคำาสงวนลปตวนอก และเพมคา ii อก 1 และกระทำาคำาสงวนลปตวในอกครง ผลลพธทไดคอ

1 * 1 = 11 * 2 = 2End of inner loop2 * 1 = 22 * 2 = 4

End of inner loop3 * 1 = 33 * 2 = 6End of inner loopEnd of outer loop

Recommended