760 likes | 975 Views
บทที่ 4 ฟังก์ชั่น ลูป อาร์เรย์. ฟังก์ชั่น ( หน้า 17) ลูป ( หน้า 15) อาร์เรย์ ( หน้า 49). 1. การเขียนโปรแกรมแบบ Event Driven Programming. Please choose the operation (+ - * /). Enter first number : 8. Enter second number : 7. Event - Driven. The result is : 15
E N D
บทที่ 4 ฟังก์ชั่น ลูป อาร์เรย์ • ฟังก์ชั่น (หน้า 17)ลูป (หน้า 15)อาร์เรย์ (หน้า 49) 1
การเขียนโปรแกรมแบบ Event Driven Programming Please choose the operation (+ - * /) Enter first number : 8 Enter second number : 7 Event - Driven The result is : 15 Do you want to exit program?(y/n) ดั้งเดิม 2
รู้จักกับออบเจ็กต์ สิ่งที่ควรรู้เมื่อต้องเขียนโปรแกรม หรือพัฒนาแอพพลิเคชั่นเพื่อใช้งานบน Windows ก็คือ เรื่องของ ออบเจ็กต์ (Object) ซึ่งสอดคล้องกับแนวคิดของ Event Driven Programming ซึ่งจากประสบการณ์ของผู้ใช้งานวินโดว์ จะเห็นได้ว่าแอพพลิเคชั่นนั้นจะประกอบมาจากสิ่งต่างๆ เช่น ปุ่มกด , วินโดว์ ซึ่งเราเรียกแต่ละสิ่งที่ประกอบเป็นแอพพลิเคชั่นนั้นว่า ออบเจ็กต์ (Object) 3
พร็อพเพอร์ตี้ (Property) : คุณสมบัติของออบเจ็กต์ ออบเจ็กต์แต่ละชนิดย่อมมีคุณสมบัติประจำตัวของมัน เช่น ออบเจ็กต์รถยนต์ ก็จะมีคุณสมบัติ เช่น ยี่ห้อ , รุ่น , ขนาดเครื่องยนต์ , สี เป็นต้น ซึ่งเราเรียกคุณสมบัตินี้ว่า พร็อพเพอร์ตี้ (Property) ในการใช้งาน Visual C# 2008 นั้นการกำหนดพร็อพเพอร์ตี้ให้กับออบเจ็กต์ชนิดต่างๆ จะสามารถทำได้ทั้งในช่วงของการออกแบบ และในขณะที่แอพพลิเคชั่นนั้นทำงาน ซึ่งในขณะออกแบบนั้นจะปรับแต่งผ่าน Property Windows ส่วนการกำหนดค่าพร็อพเพอร์ตี้ในขณะทำงานจะใช้การเขียนโปรแกรมกำกับการทำงานเอาไว้ 4
เมธอด (Method) : ความสามารถของออบเจ็กต์ เมธอด Load เมธอด Close นอกจากจะมีคุณสมบัติแล้วออบเจ็กต์จะมีความสามารถที่ทำให้ออบเจ็กต์ทำงานได้ เช่น ออบเจ็กต์รถยนต์มีความสามารถในการสตาร์ทเครื่องยนต์ , การขับ , การเปลี่ยนทิศทาง เป็นต้น ซึ่งเราเรียกความสามารถของออบเจ็กต์นี้ว่า เมธอด 5
รู้จักกับอีเวนต์ (Event) : เหตุการณ์ที่เกิดขึ้นกับออบเจ็กต์ ในการทำงานของออบเจ็กต์ที่อยู่ในแอพพลิเคชั่นที่ทำงานบน Windows นั้น ย่อมจะพบกับเหตุการณ์ต่างๆที่เกิดจากทั้งการโต้ตอบกับผู้ใช้งาน, การทำงานร่วมกับโปรแกรมอื่นๆ หรือการทำงานร่วมกับ Windows ซึ่งเราเรียกแต่ละเหตุการณ์ที่เกิดขึ้นกับออบเจ็กต์ต่างๆว่า อีเวนต์ (Event) ในการเขียนโปรแกรมด้วย Visual C# 2005 นั้น เราต้องเลือกเขียนโปรแกรมจัดการอีเวนต์แต่ละตัวที่เราสนใจ ซึ่งโปรแกรมที่เราได้เขียนขึ้นมาเพื่อจัดการอีเวนต์แต่ละตัวนั้นจะเรียกว่า Event Handler 6
รู้จักกับอีเวนต์ (Event) : เหตุการณ์ที่เกิดขึ้นกับออบเจ็กต์ 7
คอนโทรลกับคอมโพเนนต์ ในการสร้างแอพพลิเคชั่นด้วย Visual C# 2008นั้นมีออบเจ็กต์ให้เลือกใช้งานได้ หลายตัว ออบเจ็กต์ซึ่งมองเห็นได้เราจะเรียกว่า คอนโทรล (Control) เช่น คอนโทรล Button, คอนโทรล Textbox เป็นต้น และยังมีออบเจ็กต์หนึ่งที่มองไม่เห็นในเวลาที่แอพพลิเคชั่นทำงาน เราเรียกว่า คอมโพเนนต์ (Component) 8
เทคนิคที่ช่วยให้การเขียนโปรแกรมง่ายขึ้นเทคนิคที่ช่วยให้การเขียนโปรแกรมง่ายขึ้น Code Editor ของ Visual Studio 2008 นั้นได้รับการเพิ่มเติมให้มีความสามารถที่มากขึ้น ช่วยให้การเขียนโปรแกรมเป็นเรื่องที่ทำได้ง่ายขึ้น ซึ่งเราจะเรียกความสามารถของ Code Editor นี้ว่า Intellisense ซึ่งประกอบด้วยความสามารถต่าง ๆ คือ List Members Parameter Info Quick Info 10
List Members เป็นเครื่องมือที่ช่วยให้การเขียนโค้ดง่ายขึ้น โดยจะทำหน้าที่ตรวจสอบว่าแต่ละออบเจ็กต์ที่มีการใช้งานหรือชนิดข้อมูลที่เราสร้างขึ้นเองนั้นมีสมาชิก คือ พร็อพเพอร์ตี้หรือเมธอดอะไรที่สามารถใช้ได้ โดยจะแสดงในลักษณะของรายการผุดขึ้นมาใน Code Editor 11
Parameter Info บ่อยครั้งที่เราเรียกใช้งานเมธอด หรือเรียกใช้งาน Function ที่มีพารามิเตอร์ยาว ๆ แทนที่เราจะต้องจดสำหรือย้อนกลับไปดู Code Editor ก็จะช่วยให้เราสามารถเขียนพารามิเตอร์ได้อย่างครบถ้วนได้ 12
Quick Info เป็นเครื่องมือที่ช่วยให้การเขียนโค้ดง่ายขึ้น โดยจะทำหน้าที่ตรวจสอบว่าแต่ละคำสั่งที่เขียนขึ้นนั้นมีรูปแบบอะไร ต้องการข้อมูลหรืออาร์กิวเมนต์อะไรในคำสั่งนั้น ๆ แล้วจึงแสดงให้ผู้ใช้นั้นเห็น ซึ่งผู้ใช้เพียงแค่นำเมาส์ไปทาบ ณ ตำแหน่งที่สนใจก็จะมีการแสดงข้อมูลให้ทราบโดยย่อขึ้นมา 13
การขอความช่วยเหลือจาก Help สำหรับวิธีการในการตรวจสอบคำสั่งหรือจุดที่สงสัยจากการเขียนโปรแกรม สามารถทำได้โดยการวางเมาส์บนจุดหรือไฮไลท์คำสั่งที่สงสัย แล้วกดปุ่ม <F1> ก็จะปรากฏข้อมูลที่เกี่ยวข้องได้ 14
Function Function คือ บล็อกของโค้ดที่สามารถเรียกใช้งานได้จากจุดใด ๆ ก็ได้ในแอพพลิเคชัน นอกจากฟังก์ชันจะช่วยให้เราแบ่งงานออกเป็นงานย่อย ๆ แล้ว ข้อดีของฟังก์ชันอีกอย่างก็คือ Reuse ซึ่งหมายถึง ฟังก์ชันสามารถถูกเรียกใช้ซ้ำ ๆ กันได้ไม่จำกัดจำนวน ทำให้เราไม่ต้องเขียนโค้ดยาว ๆ และเอาเวลาไปคิดงานส่วนอื่น ๆ ได้โดยไม่ต้องกังวล เพราะเคยมีฟังก์ชันไว้ให้ใช้งานแล้ว 15
Function Scope ReturnTypeFunctionName (type1 param1, type2 param2, …) { โค้ดการทำงานภายในฟังก์ชัน return ค่าที่คืนกลับมา ; } Scope : ขอบเขตการทำงานของฟังก์ชันนั้น (private , public , etc.) ReturnType : ชนิดของการคืนค่า สามารถระบุเป็นชนิดข้อมูลที่จะคืนกลับมา แต่ถ้าไม่มีการคืนค่าเราจะระบุด้วยคีย์เวิร์ด void FunctionName : ชื่อฟังก์ชัน type1 ,type2,… : ชนิดข้อมูลของพารามิเตอร์ param1, param2,… : ชื่อของพารามิเตอร์แต่ละตัว ซึ่งบางฟังก์ชันอาจจะไม่มี 16
ตัวอย่างการสร้างและใช้งานฟังก์ชันตัวอย่างการสร้างและใช้งานฟังก์ชัน ให้นักศึกษาสร้างแอพพลิเคชัน ดังรูป 17
Code เมื่อคลิกปุ่ม private void btnRandom_Click(object sender, EventArgs e) { int rndm = MyRandom(); if (rndm > 5) { this.BackColor = Color.White; } } private int MyRandom() { Random rndObj = new Random(); int i = rndObj.Next(10); MessageBox.Show("ค่าที่สุ่มได้คือ : " + i.ToString(), "ฟังก์ชัน MyRandom"); return i; } 18
Code เมื่อคลิกปุ่ม private void btnPassword_Click(object sender, EventArgs e) { if (CheckValidPassword(txtPassword.Text) == true) { MessageBox.Show("รหัสผ่านของท่านคือ : " + txtPassword.Text, "กำหนดรหัสผ่านสำเร็จ"); } } private bool CheckValidPassword(string pswd) { if (pswd.Length < 4) { MessageBox.Show("คุณกำหนดรหัสผ่านสั้นเกินไป", "รหัสผ่านต้องมากกว่า 4 ตัวอักษร"); return false; } else if ((pswd == "1234") || (pswd == "abcd") || (pswd == "1111")) { MessageBox.Show("รหัสผ่านเดาง่ายเกินไป", "ผิดพลาด"); return false; } else return true; } 19
Code เมื่อคลิกปุ่ม private void btnMatrix_Click(object sender, EventArgs e) { int X = (int)nudX.Value; int Y = (int)nudY.Value; DrawMatrix(X, Y); } private void DrawMatrix(int XVal, int YVal) { string strOut = ""; for (int j = 1; j <= YVal; j++) { for (int i = 1; i <= XVal; i++) { strOut += i.ToString() + " "; } strOut += "\r\n"; } txtOut.Text = strOut; } 20
Code เมื่อคลิกปุ่ม private void btnClear_Click(object sender, EventArgs e) { DialogResult dr = MessageBox.Show("คุณต้องการเคลียร์ค่าในคอนโทรลหรือไม่", "Clear", MessageBoxButtons.OKCancel); if (dr == DialogResult.OK) { ClearAll(); } } private void ClearAll() { this.BackColor = SystemColors.Control; txtPassword.Clear(); nudX.Value = nudX.Minimum; nudY.Value = nudY.Minimum; txtOut.Clear(); MessageBox.Show("เคลียร์เรียบร้อยแล้วครับผม!", "Clear"); } 21
ขอบเขตของตัวแปร Solution Project Class { } Class { } Function { expression { } } ตัวแปร X ตัวแปร X Function { } ตัวแปร X Project ตัวแปร X ในการเขียนโปรแกรมด้วยภาษา C# นั้น ตัวแปรที่ถูกประกาศจะมีขอบเขตการใช้งานอยู่เฉพาะในบล็อกของโค้ดที่มันประกาศ 22
อายุการใช้งานของตัวแปรอายุการใช้งานของตัวแปร ตัวแปรแต่ละตัวมีอายุการใช้งานที่จำกัด นั่นคือ มันสามารถใช้งานได้เฉพาะในขอบเขตที่ได้ประกาศไว้ เพราะฉะนั้นการอ้างอิงตัวแปรนอกขอบเขตจะทำให้ Code Editor ฟ้องข้อผิดพลาดขึ้นมาได้ และถ้าเราพยายามสั่งให้แอพพลิเคชันทำงานก็จะพบว่าทำไม่ได้ และมีการแจ้งข้อผิดพลาดที่หน้าต่าง Error List 23
for วนซ้ำครบจำนวน ? ครบแล้ว ยังไม่ครบ ทำคำสั่งในบล็อก for ทำคำสั่งถัดไป สำหรับการวนซ้ำด้วยจำนวนรอบที่แน่นอนเราจะใช้คำสั่ง for ในการใช้งานวนซ้ำ ซึ่งจะต้องใช้ตัวแปร 1 ตัวที่ใช้นับจำนวนรอบว่า วนซ้ำครบตามรอบที่กำหนดหรือไม่ 24
for for(ตัวแปรใช้นับจำนวนรอบ = จำนวนรอบเริ่มต้น ; เงื่อนไขการหยุดวนซ้ำ ; สเต็ปชั้นของการนับ) { <ทำงานตามคำสั่ง> } เช่น for(int i = 1;i<=5;i++) { // วนซ้ำทั้งหมด 5 รอบ } 25
ตัวอย่างการใช้งานคำสั่ง for ให้นักศึกษาสร้างแอพพลิเคชันต่อไปนี้ 26
Code เมื่อคลิกปุ่ม private void btnUp_Click(object sender, EventArgs e) { intcnt = 14; string strOut = "วนรอบทั้งหมด = " + cnt.ToString() + " รอบ" + "\r\n"; strOut += "- - - - - - - - - - - - - - - - " + "\r\n"; for (int i = 1 ; i <= cnt ; i++) { strOut += "วนรอบที่ : " + i.ToString() + "\r\n"; } txtOut.Text = strOut; } 27
Code เมื่อคลิกปุ่ม private void btnDown_Click(object sender, EventArgs e) { intcnt = 14; string strOut = "วนรอบทั้งหมด = " + cnt.ToString() + " รอบ" + "\r\n"; strOut += "- - - - - - - - - - - - - - - - " + "\r\n"; for (int i = cnt ; i >= 1; i--) { strOut += "นับถอยหลัง : " + i.ToString() + "\r\n"; } txtOut.Text = strOut; } 28
Code เมื่อคลิกปุ่ม private void btnStep_Click(object sender, EventArgs e) { intcnt = 25; string strOut = "วนซ้ำแบบ Step, ค่าตัวแปรวนซ้ำ = " + cnt.ToString() + " รอบ, สเต็ปละ 3" + "\r\n"; strOut += "- - - - - - - - - - - - - - - - " + "\r\n"; for (int i = 0 ; i <= cnt ; i +=3) { strOut += "ค่าที่ได้จากการเพิ่มสเต็ป : " + i.ToString() + "\r\n"; } txtOut.Text = strOut; } 29
การใช้ for แบบซ้อนกัน ในโปรแกรมที่ซับซ้อน บางครั้งอาจเกิดเหตุการณ์ที่ต้องมีการใช้การวนซ้ำแบบซ้อนกัน เช่น การเติมข้อมูลในตาราง เราต้องค่อย ๆ เติมข้อมูลทีละแถว ซึ่งแต่ละแถวเราก็จะต้องเติมข้อมูลทีละคอลัมน์ โดยในการวนซ้ำจะเริ่มจากการวนซ้ำทีละคอลัมน์ก่อน เมื่อหมด 1 แถวก็จะขึ้นแถวใหม่แล้ววนซ้ำจนครบทุก ๆ แถว 31
ตัวอย่างแอพพลิเคชันที่มีการใช้ for แบบซ้อนกัน ให้นักศึกษาสร้างแอพพลิเคชันที่มีหน้าตาดังนี้ 32
Code เมื่อคลิกปุ่ม private void btnTable_Click(object sender, EventArgs e) { txtOut.Text = ""; for (int row = 1; row <= nudRow.Value; row++) { for (int column = 1; column <= nudColumn.Value; column++) { txtOut.Text += column.ToString() + " | "; } txtOut.Text += "\r\n"; } } 33
Code เมื่อคลิกปุ่ม private void btnTriUp_Click(object sender, EventArgs e) { txtOut.Text = ""; for (int j = 1; j <= (int)nudTriRow.Value; j++) { for (inti = 1; i <= j; i++) { txtOut.Text += i.ToString() + " "; } txtOut.Text += "\r\n"; } } 34
Code เมื่อคลิกปุ่ม private void btnTriDown_Click(object sender, EventArgs e) { txtOut.Text = ""; for (int j = (int)nudTriRow.Value; j >= 1; j--) { for (int i = 1; i <= j; i++) { txtOut.Text += i.ToString() + " "; } txtOut.Text += "\r\n"; } } 35
while false วนซ้ำอีกหรือไม่? true ทำคำสั่งในบล็อก while ทำคำสั่งถัดไป while เป็นรูปแบบการวนซ้ำที่ไม่สามารถบอกจำนวนรอบที่แน่นอนของการวนซ้ำได้ ซึ่งจะวนซ้ำถึงเมื่อใดนั้น จะใช้การตรวจสอบเงื่อนไขก่อนการวนซ้ำว่าต้องวนซ้ำอีกหรือไม่ ถ้าเงื่อนไขยังคงเป็นจริงอยู่ก็จะวนซ้ำต่อ แต่ถ้าเป็นเท็จก็จะหลุดจากการวนซ้ำ 38
while while <ทดสอบเงื่อนไข จริงหรือเท็จ> { <ถ้าเงื่อนไขเป็นจริง ให้ทำงานตามคำสั่ง> } 39
ตัวอย่างการสร้างแอพพลิเคชันโดยใช้ while private void cmdloop_Click(object sender, EventArgs e) { inti; i = 1; lstShow.Items.Clear(); while(i<=20) { lstShow.Items.Add("วนลูปครั้งที่ " + i); i++; } } ให้นักศึกษาสร้างแอพพลิเคชัน 40
do-while จะนำเงื่อนไขการตรวจสอบวนซ้ำ while ไปไว้ด้านท้าย คือต้องวนซ้ำอย่างน้อย 1 รอบก่อน แล้วจึงทำการตรวจสอบเงื่อนไขนั่นเอง do { <ทำงานตามคำสั่ง> } while <ทดสอบเงื่อนไข จริงหรือเท็จ ถ้าเป็นจริงให้กลับไปทำงานอีกรอบ> 41
ตัวอย่างแอพพลิเคชัน do-while private void cmdloop_Click(object sender, EventArgs e) { inti; i = 20; lstShow.Items.Clear(); do { lstShow.Items.Add("วนลูปครั้งที่ " + i); i--; } while (i > 0) ; } 42
ตัวอย่างโค้ด void MyMethod(int par1) { for(int i = 0; i < 10; i ++) { if(i==5) break; } } วนซ้ำแค่ 6 รอบ โดยในรอบที่ 6 หลัง if จะกระโดดออกจากเมธอด MyMethodทันที 43
ตัวอย่างแอพพลิเคชัน ให้นักศึกษาสร้างแอพพลเคชันต่อไปนี้ 44
Code เมื่อคลิกปุ่ม private void btnBreak_Click(object sender, EventArgs e) { Random rndObj = new Random(); int num = rndObj.Next(10); txtOut.Text = ""; for (int i = 1; i <= 10; i++) { txtOut.Text += "วนรอบครั้งที่ " + i.ToString() + "\r\n"; if (i == num) { txtOut.Text += "สุ่มตัวเลขมา = " + num.ToString(); break; } } } 45
Code เมื่อคลิกปุ่ม private void btnContinue_Click(object sender, EventArgs e) { Random rndObj = new Random(); int num = rndObj.Next(10); txtOut.Text = ""; for (int i = 1; i <= 10; i++) { txtOut.Text += "วนซ้ำรอบที่ " + i.ToString(); if (i == num) { txtOut.Text += " ตรงกับจำนวนที่สุ่มมาครับ" + "\r\n"; continue; } txtOut.Text += "\r\n"; } } 46
Code เมื่อคลิกปุ่ม private void btnGoto_Click(object sender, EventArgs e) { Random rndObj = new Random(); int num = rndObj.Next(10); switch (num) { case 0: txtOut.Text += "สุ่มได้เลข 0" + "\r\n"; break; case 1: txtOut.Text += "เลขที่สุ่มเป็นเลขคี่" + "\r\n"; break; case 2: txtOut.Text += "เลขที่สุ่มเป็นเลขคู่" + "\r\n"; break; 47
Array <typeOfArray> [ ] <arrayName;> • typeOfArray : ชนิดข้อมูลที่เก็บในอาร์เรย์ • arrayName : ชื่อของอาร์เรย์ ซึ่งมีหลักการตั้งชื่อเหมือนกับตัวแปร • เมื่อประกาศอาร์เรย์แล้ว เราจะกำหนดค่าเริ่มต้นให้อาร์เรย์โดยจะใช้คีย์เวร์ด new เพื่อระบุขนาดของอาร์เรย์ว่าเก็บข้อมูลชนิดนั้น ๆ ได้กี่ตัว 48
Array int[] MyArray; string[] YourArray; MyArray = new int[10]; YourArray = new string[4] { “C#”, “ASP.net”, “C”, “Pascal” }; MyArray YourArray 49
foreach foreach (<typeName> <varName> in <arrayName>) { <ทำคำสั่งอะไรก็ได้> } typeName : ชนิดข้อมูลที่จะนำค่าจากอาร์เรย์มาเก็บจะต้องตรงกับชนิด ข้อมูลของอาร์เรย์ varName : ชื่อของตัวแปรที่นำค่าจากอาร์เรย์มาเก็บ arrayName : ชื่อของอาร์เรย์ 50