450 likes | 739 Vues
259201 Computer Programming for Engineers. Week 5 à¸à¸²à¸£à¹ƒà¸Šà¹‰ For -While. FOR. ในà¸à¸£à¸“ีที่ต้à¸à¸‡à¸à¸²à¸£à¸—ำงานซ้ำๆ เช่น ถ้าต้à¸à¸‡à¸à¸²à¸£à¹à¸ªà¸”งคำว่า. Programming is fun. จำนวน 5 ครั้ง à¸à¸²à¸ˆà¸—ำได้ดังนี้คืà¸. disp(‘Programming is fun.’); disp(‘Programming is fun.’); disp(‘Programming is fun.’);
E N D
259201Computer Programmingfor Engineers Week 5 การใช้ For -While
FOR • ในกรณีที่ต้องการทำงานซ้ำๆ เช่น ถ้าต้องการแสดงคำว่า Programming is fun. จำนวน 5 ครั้งอาจทำได้ดังนี้คือ disp(‘Programming is fun.’); disp(‘Programming is fun.’); disp(‘Programming is fun.’); disp(‘Programming is fun.’); disp(‘Programming is fun.’); • แต่ถ้าต้องแสดงประโยคนี้ 1000 ครั้ง จะทำอย่างไร?
คำตอบ : ใช้ For • ไฟล์ for1.m
FOR • ถ้าต้องแสดงประโยคนี้ 1000 ครั้ง ทำได้โดย for i=1:1000 disp(‘Programming is fun.’); end แก้ที่เดียว
FOR • รูปแบบการใช้งาน (Syntax) forindex = expression ชุดคำสั่งใน loop end
For - ตัวอย่างการใช้งาน • ไฟล์ for2.m
Flowchart ของตัวอย่างนี้ i = 1 1. กำหนดค่าเริ่มต้น i<=15? 2. เงื่อนไขการเข้าลูป False True Display i 3. การปรับค่าตัวแปรที่ใช้ทดสอบในแต่ละรอบ i = i + 3
FOR : ตัวอย่าง - การสร้าง vector % การสร้างเวกเตอร์โดยทุกสมาชิกมีค่า เป็น 0 forI = 1 : 5 % ให้นับจำนวน I ไปตั้งแต่ 1 ถึง 5 x(I) = 0 end disp(x); % การสร้าง vector โดยสมาชิกมี Index เป็น 1, 3, 5, 7, 9 มีค่าเป็น 1 forI = 1 : 2 : 10 %ให้นับจำนวน I ไปตั้งแต่ 1 ถึง 10 โดยนับไปทีละ 2 x(I) = 1 end disp(x);
เกมทายตัวเลข • สุ่มตัวเลขที่มีค่าอยู่ในช่วง (0,10) แล้ววนรอบรับค่าจากคีย์บอร์ดไม่เกิน 5 ครั้ง • หากภายใน 5 ครั้งทายถูก จะแสดงข้อความ You got it • หากทายไม่ถูกในแสดงข้อความ You failed. Please try again next time.
หาผลบวกสะสมของเลข 1 ถึง n • เขียน m-file ชื่อ cummulativeSum • หาผลบวกสะสมของเลข 1 ถึง n
หาผลบวกสะสม % cummulativesum.m n = input('n = '); csum = 0; for i = 1:n csum = csum + i; end fprintf('Cummulative sum from 1 to %d is %d.', n, csum); >> cummulativesum n = 10 Cummulative Sum from 1 to 10 is 55.
หาผลบวกสะสม • จากสมการ csum = csum + i • csum = 0 • i= 1 csum = csum + i = 0+1 = 1 • i= 2 csum = csum + i = 1+2 = 3 • i= 3 csum = csum + i = 3+3 = 6 • i= 4 csum = csum + i = 6+4 = 10 • i= 5 csum = csum + i = 10+5 = 15 • csum = 15
หาค่าเฉลี่ยของตัวเลข 5 เลข (cavg.m)
หาค่าเฉลี่ยของตัวเลข 5 ตัว จากสมการ csum = csum + n โดยที่ n = input(‘Please input number’) csum = 0, for i = 1:5 input n= 4 csum = csum + n= 0+4 = 4 input n= 2 csum = csum + n= 4+2 = 6 input n= 5 csum = csum + n= 6+5 = 11 input n= 1 csum = csum + n= 11+1 =12 input n= 3 csum = csum + n= 12+3 =15 cavg = csum/5 = 15/5 = 3.00
For ซ้อนกัน • ในหลายกรณีที่จะต้องมีการใช้ for ซ้อนกัน เช่น ถ้าต้องการแสดงสูตรคูณแม่ 2 ถึง 6 โดยตัวคูณมีค่า 1 ถึง 12 • ในกรณีนี้ for ลูปชั้นนอกใช้ตัวแปร base มีค่าวิ่งจาก 2 ถึง 6 • ส่วน for ลูปชั้นในใช้ตัวแปร mul มีค่าวิ่งจาก 1 ถึง 12
ตัวอย่าง : สูตรคูณ • แบบฝึกหัด: ทดลองเขียน Flowchart ของโปรแกรมนี้ forbase = 2:6 formul = 1:12 fprintf(‘%d x %d = %d\n’, base, mul, base * mul); end end
ตัวอย่าง : For ซ้อนกัน • ในบางกรณี ลูปชั้นนอกและลูปชั้นในมีตัวแปรที่ขึ้นต่อกันเช่น fori = 1:5 forj = 1:i fprintf('%d ', j); end fprintf('\n'); end 1 1 2 1 2 3 1 2 3 4 1 2 3 4 5 • ในกรณีนี้ for ลูปชั้นนอกใช้ตัวแปร i มีค่าวิ่งจาก 1 ถึง 5 ส่วน for ลูปชั้นในใช้ตัวแปร j มีค่าวิ่งจาก 1 ถึง i
ตัวอย่าง : For ซ้อนกัน • ถ้าต้องการให้แสดงผลดังต่อไปนี้ โดยแก้ไขโปรแกรมได้เฉพาะ 2 บรรทัดแรก จะต้องแก้ไขอย่างไร? 1 2 3 4 5 1 2 3 4 1 2 3 1 2 1
การใช้ WHILE • นอกจากสามารถวนซ้ำการทำงาน (Loop) ได้ด้วยการใช้ For แล้ว ยังสามารถใช้ While ได้ • การใช้ While จะต้องมีการกำหนดเงื่อนไขของการวนทำงาน ถ้าเป็นจริงให้ทำงาน(เข้าไปใน Loop) อีกครั้งไปเรื่อยๆ ถ้าเป็นเท็จให้หยุดการวนทำงาน (ออกจากลูป)
WHILE • รูปแบบการใช้งาน (Syntax) whileเงื่อนไข คำสั่ง end
Flowchart ของตัวอย่างนี้ i = 1 1. กำหนดค่าเริ่มต้น i<=5? 2. เงื่อนไขการเข้าลูป False True Display ‘Programming is fun’ 3. การปรับค่าตัวแปรที่ใช้ทดสอบในแต่ละรอบ i = i + 1
การใช้ WHILE (ตัวอย่างเปรียบเทียบกับ For) • จากตัวอย่างการวนลูปโดยการใช้ For (ตัวอย่าง for1.m) % for1.m for i = 1:5 disp('Programming is fun'); end • สามารถเขียนโดยการใช้ While ได้ดังนี้ % while1.m i = 1; while i <= 5 disp('Programming is fun'); i = i + 1; end 1. กำหนดค่าเริ่มต้น 2. เงื่อนไขการเข้าลูป 3. การปรับค่าตัวแปรที่ใช้ทดสอบในแต่ละรอบ
แบบฝึกหัด • จากตัวอย่างโปรแกรมสูตรคูณที่ใช้ For ซ้อนกันสองชั้น forbase = 2:6 formul = 1:12 fprintf(‘%d x %d = %d\n’, base, mul, base * mul); end end • เขียนใหม่โดยการใช้ While แทนได้อย่างไร?
WHILE • ในการใช้งานที่ผ่านมา การวนลูปโดยใช้ For หรือ While จะต้องรู้ก่อนว่าจะมีการวนลูปกี่รอบ • แต่สำหรับในกรณีที่ต้องการทำงานซ้ำๆ แต่ไม่รู้ล่วงหน้าว่าจะวนกี่รอบ • เช่น จะให้วนลูปไปเรื่อยๆ โดยให้มีการถามผู้ใช้ว่าต้องการจะวนลูปต่อหรือไม่ เป็นต้น
WHILE -เกมทายตัวเลข • แทนที่จะจำกัด 5 ครั้ง • ให้ถามผู้ใช้ว่าต้องการทายต่อไปเรื่อยๆ หรือไม่ • หากต้องการให้ทำต่อ • หากไม่ต้องการให้ออกจาก loop • สังเกตว่า ในขณะเขียนโปรแกรม ไม่สามารถรู้ก่อนได้ว่าโปรแกรมจะวนลูปกี่ครั้ง
แทนที่จะเพิ่มจำนวนรอบ เพื่อนับจำนวนรอบเหมือน for ก็เปลี่ยนเป็นรับ input จาก user ว่าต้องการให้ทำต่อหรือไม่ cont = input(‘……’); n = round(rand(1)*10); i = 1 ; cont = ‘y’
WHILE - เกมทายตัวเลข ส่วนที่ต่างจาก for
การตรวจสอบและการหาจุดที่ผิดในโปรแกรมการตรวจสอบและการหาจุดที่ผิดในโปรแกรม • ในการเขียนโปรแกรม มักจะต้องมีการตรวจสอบอยู่เสมอ ว่าโปรแกรมนั้น สามารถทำงานอย่างถูกต้องตามที่ได้ออกแบบไว้หรือไม่ • ซึ่งบางครั้ง การเขียนโปรแกรมที่ผิดพลาด จะทำให้โปรแกรมไม่สามารถทำงานตามที่ได้ออกแบบไว้ และจะทำให้ผลการคำนวณผิดพลาดได้
การตรวจสอบและการหาจุดที่ผิดในโปรแกรมการตรวจสอบและการหาจุดที่ผิดในโปรแกรม • ข้อผิดพลาดที่เกิดขึ้นในการเขียนโปรแกรม สามารถแบ่งออกเป็น 2 ประเภท ได้แก่ • ข้อผิดพลาดที่ไม่สามารถ run โปรแกรมต่อได้ • ข้อผิดพลาดที่สามารถ run โปรแกรมได้ แต่ให้ผลการคำนวณที่ไม่ถูกต้อง Error ประเภทนี้ ตรวจสอบได้ง่าย เพราะ user ทราบว่าโปรแกรมมีข้อผิดพลาดเกิดขึ้นอย่างแน่นอน Error ประเภทนี้ ตรวจสอบได้ยาก ดังนั้น จึงต้องมีการทดสอบ run โปรแกรมอย่างรอบคอบ ในขณะที่เขียนโปรแกรม
ข้อผิดพลาดที่ไม่สามารถ run โปรแกรมได้ • Error ประเภทนี้ จะทำให้โปรแกรมไม่สามารถคำนวณผลลัพธ์ได้ และจะมีข้อความเตือนแสดงใน command window เพื่ออธิบาย error ที่เกิดขึ้น • การแก้ไข error ประเภทนี้ สามารถแก้ไขได้จากการอ่านรายละเอียดจากข้อความเตือนที่โปรแกรมแสดง ไม่ได้มีการกำหนดค่าของตัวแปร หรือฟังก์ชั่น y และ x ในโปรแกรม
ข้อผิดพลาดที่ไม่สามารถ run โปรแกรมได้ % bug1.m x = [3,50,75,95,110]; y = [32,65,73,68,70]; z = x+y; disp(Z) ไม่ได้มีการกำหนดค่าของตัวแปร หรือฟังก์ชั่น Z Error เกิดขึ้นในไฟล์ bug1 ที่บรรทัดที่ 4 คำสั่งที่เกิด error คือ คำสั่ง disp(Z)
ข้อผิดพลาดที่ไม่สามารถ run โปรแกรมได้ % bug1.m x = [3,50,75,95,110]; y = [32,65,73,68,70]; z = x+y; disp(Z) Error ที่เกิดขึ้น เกิดจากอะไร??? ตัวแปร Z ไม่เท่ากับ z เนื่องจาก ชื่อตัวแปรใน MATLAB เป็น case sensitive
ข้อผิดพลาดที่ไม่สามารถ run โปรแกรมได้ • Error ประเภทนี้ ตรวจสอบได้ยาก เนื่องจาก โปรแกรมสามารถทำการคำนวณได้ แต่ผลลัพธ์จากการคำนวณไม่ถูกต้อง • สามารถหาข้อผิดพลาดประเภทนี้ได้ จากการทดลอง run โปรแกรมทุกครั้ง หลังจากที่เขียน code ซึ่งควรตรวจสอบการทำงานในจุดต่างๆ เช่น • จุดที่เป็นการทำงานแบบเงื่อนไข (คำสั่ง if) โดยป้อนค่าทั้งในกรณีที่เงื่อนไขเป็นจริง และเงื่อนไขเป็นเท็จ • จุดที่มีการคำนวณ การกำหนดค่า หรือการเปลี่ยนค่าให้กับตัวแปร
วิธีการตรวจสอบการทำงานของโปรแกรมวิธีการตรวจสอบการทำงานของโปรแกรม • การกำหนดให้ โปรแกรมเปิด M-Files ที่มีข้อผิดพลาด เมื่อมี debug เกิดขึ้น
วิธีการตรวจสอบการทำงานของโปรแกรมวิธีการตรวจสอบการทำงานของโปรแกรม • การกำหนดให้ โปรแกรมหยุดทำงาน เมื่อมี error เกิดขึ้น กำหนดให้โปรแกรมหยุดทำงาน เมื่อมี error เกิดขึ้น
วิธีการตรวจสอบการทำงานของโปรแกรมวิธีการตรวจสอบการทำงานของโปรแกรม • การกำหนด break point ในบรรทัดที่ต้องการตรวจสอบผลการคำนวณ โดยวาง cursor ไว้หน้าบรรทัดที่ต้องการ break และเลือก icon กำหนด break point คำสั่งในการกำหนดหรือยกเลิก break point สัญลักษณ์ break point
วิธีการตรวจสอบการทำงานของโปรแกรมวิธีการตรวจสอบการทำงานของโปรแกรม • เมื่อโปรแกรมหยุด สามารถตรวจสอบค่าของตัวแปรต่างๆ ได้จากการนำ cursor มาไว้หน้าชื่อตัวแปรที่ต้องการทราบค่า • โปรแกรมจะขึ้น message box ที่แสดงประเภท และค่าของตัวแปรนั้นๆ Message box ที่แสดงประเภท และค่าของตัวแปร
วิธีการตรวจสอบการทำงานของโปรแกรมวิธีการตรวจสอบการทำงานของโปรแกรม • เราสามารถ run โปรแกรมทีละบรรทัดได้ โดยคลิกที่ icon step คำสั่ง step ใช้ในการ run โปรแกรมทีละบรรทัด
วิธีการตรวจสอบการทำงานของโปรแกรมวิธีการตรวจสอบการทำงานของโปรแกรม • เราสามารถออกจาก debug mode ได้ด้วยการเลือกที่ tab debug และเลือกคำสั่ง Exit debug mode
ตัวอย่าง • จงเขียนโปรแกรมในการหาค่าคะแนนสูงสุดของนักศึกษา โดยที่ user จะต้องกำหนดจำนวนนักศึกษาที่จะกรอกคะแนน เมื่อกรอกคะแนนจนครบแล้ว โปรแกรมจะแสดงค่าคะแนนที่มากที่สุด และแสดงค่าคะแนนเฉลี่ยของนักศึกษากลุ่มนี้ (save ในชื่อ maxscore.m) ผลลัพธ์จากการ run โปรแกรม
ตัวอย่าง • จากไฟล์ maxscore.m ในนักศึกษาทดลอง run โปรแกรมในเงื่อนไขต่างๆ ดังนี้ • กำหนด break point ในบรรทัดที่ 9 • ทุกครั้งที่โปรแกรมหยุดทำงาน ให้นักศึกษาสังเกตค่าของตัวแปรต่างๆ • ทดลอง run โปรแกรม ทีละบรรทัด โดยใช้คำสั่ง step พร้อมทั้งสังเกตค่าของตัวแปรที่เปลี่ยนไป