สวัสดี ครับ ไม่ได้เขียนซะนานเลยเนื่องจากโปรเจคที่ทำอยู่ค่อนข้างเร่ง 1 โปรเจค และก็กำลังจะ luanch อยู่อีก 1 โปรเจคครับ วันนี้พอมีเวลาว่าจะเขียนอีกให้ได้มากที่สุดครับ ติดตามกันด้วยนะครับ อิอิ
ActionScript 3.0 Program Looping
Program Looping นั้นมีประโยชน์อย่างไร ขอให้เรามาดูรูปตัวอย่างนี้กันก่อนนะครับในรูปด้านบนนี้คือ Triangular Number นั่นเองครับ เราสามารถพูดได้ว่า
- Triangular Number ขั้นที่ 1 มีค่าเท่ากับ 1
- Triangular Number ขั้นที่ 2 มีค่าเท่ากับ 3
- Triangular Number ขั้นที่ 3 มีค่าเท่ากับ 6
- Triangular Number ขั้นที่ 4 มีค่าเท่ากับ 10
- Triangular Number ขั้นที่ 5 มีค่าเท่ากับ 15
- Triangular Number ขั้นที่ 6 มีค่าเท่าไหร่ครับ?
- Triangular Number ขั้นที่ 1 มีค่าเท่ากับ 1
- Triangular Number ขั้นที่ 2 มีค่าเท่ากับ 1 + 2 = 3
- Triangular Number ขั้นที่ 3 มีค่าเท่ากับ 1 + 2 + 3 = 6
- Triangular Number ขั้นที่ 4 มีค่าเท่ากับ 1 + 2 + 3 + 4 = 10
- Triangular Number ขั้นที่ 5 มีค่าเท่ากับ 1 + 2 + 3 + 4 + 5 = 15
- Triangular Number ขั้นที่ 6 มีค่าเท่ากับ 1 + 2 + 3 + 4 + 5 + 6 = 21
Tn = 1 + 2 + 3 + 4 + ... + (n - 1) + n
เอาหละ ทีนี้ถ้าเราอยากจะเขียนโปรแกรมแสดงผลค่า Triangular Number ตั้งแต่ขั้นที่ 1 จนถึงขั้นที่ 5 จะเขียนได้ยังไง
ลองเขียนแบบนี้ก็ได้ รับรองถูกต้องแน่นอนไม่มีปัญหา
var t1:int = 1;
var t2:int = 1 + 2;
var t3:int = 1 + 2 + 3;
var t4:int = 1 + 2 + 3 + 4;
var t5:int = 1 + 2 + 3 + 4 + 5;
trace("t1 = " + t1);
trace("t2 = " + t2);
trace("t3 = " + t3);
trace("t4 = " + t4);
trace("t5 = " + t5);
และเมื่อลองรันโปรแกรมดูก็จะได้ผลดังภาพด้านล่างนี้
คราวนี้สมมติโจทย์ยากขึ้นมาอีกหน่อย ถ้าเราอยากจะเขียนโปรแกรมแสดงผลค่า Triangular Number ขั้นขั้นที่ 100 หละครับ เขียนได้มั้ยครับ
ยัง
ได้อยู่ไม่มีปัญหา แต่เหนื่อยหน่อยใช่มั้ยครับ แล้วถ้าเราอยากจะแสดงผลค่า
Triangular Number ขั้นที่ 1,000 หรือขั้นที่ 2,000 หละครับ
เอาหละสิ เหงื่อเริ่มตกหละทีนี้ จะเขียนยังไงไหว
Program Looping มันจึงมีไว้เพื่อแก้ปัญหาการทำซ้ำหลายๆ ครั้งแบบนี้โดยเฉพาะครับ
Program Looping
สำหรับภาษา ActionScript 3.0 นั้น มีวิธีเขียนลูปหลักๆ อยู่ 3 วิธี ตาม Keyword และ Syntax ที่มันมีให้ ได้แก่
- for
- while
- do
เรามาดูกันโดยเริ่มจาก for กันก่อนครับ
for
ตัวอย่างการเขียน for เป็นดังนี้ครับตัวอย่าง for 1
var i:int;
for (i = 0; i < 10; i++)
{
trace("i = " + i);
}
ผลที่ได้
สำหรับ for นั้นปกติเราก็จะมีตัวแปรตัวหนึ่งเป็นตัววิ่งลูป ซึ่งเมื่อการวนลูปแต่ละรอบเสร็จสิ้นจะทำการเพิ่มค่า หรือลดค่าตัววิ่งลูปนี้ (ส่วนใหญ่ทีละ 1 แต่จริงๆ แล้วจะเท่าไหร่ก็ได้) โดยลูปจะจบลงก็ต่อเมื่อ Expression ตรงกลาง (ในตัวอย่างคือ i < 10) เป็น false ก็จะออกจากลูปครับ
เจ้าตัวแปรที่ใช้เป็นตัววิ่งลูปนี้ก็มักจะตั้งชื่อมันว่า i, j, k อะไรประมาณนี้ครับ ผมก็ไม่เข้าใจเหมือนกันว่าทำไม อิอิ หากใครทราบรบกวนบอกผมด้วยจะเป็นพระคุณอย่างมากครับ
และก็ในบางที เราอาจจะประกาศตัวแปรที่จะใช้วิ่งลูปอยู่ใน for เลยก็ได้ครับ มาลองดูอีกตัวอย่างหนึ่งกัน
ตัวอย่าง for 2
for (var i:int = 5; i < 20; i += 5)
{
trace("i = " + i);
}
ผลที่ได้
ลองดูตัวอย่างแบบลบค่าตัววิ่งลูปดูบ้างครับ
ตัวอย่าง for 3
for (var i:int = 100; i > 0; i -= 10)
{
trace("i = " + i);
}
ผลที่ได้
สรุปสำหรับ for นั้น Syntax คือ
for (กำหนดค่าเริ่มต้นของตัววิ่งลูป; ลูป Expression ที่ถ้าเป็น true จะทำต่อถ้าเป็น false จะออกจากลูป; เพิ่มค่า(หรือลดค่า)ตัววิ่งลูป)
{
statement ที่จะทำซ้ำ;
}
Code ที่จะถูกเรียกเวลารันลูปจะเป็น
- กำหนดค่าเริ่มต้นของตัววิ่งลูป
- เช็คลูป Expression ว่าเป็น true หรือ false ถ้าเป็น true ไปข้อถัดไป
- รัน statement ที่จะทำซ้ำ
- เพิ่มค่า(หรือลดค่า)ตัววิ่งลูป
- เช็คลูป Expression ว่าเป็น true หรือ false ถ้าเป็น true ไปข้อถัดไป
- รัน statement ที่จะทำซ้ำ
- เพิ่มค่า(หรือลดค่า)ตัววิ่งลูป
- เช็คลูป Expression ว่าเป็น true หรือ false ถ้าเป็น true ไปข้อถัดไป
- รัน statement ที่จะทำซ้ำ
- เพิ่มค่า(หรือลดค่า)ตัววิ่งลูป
- เช็คลูป Expression ว่าเป็น true หรือ false ถ้าเป็น true ไปข้อถัดไป
- รัน statement ที่จะทำซ้ำ
- เพิ่มค่า(หรือลดค่า)ตัววิ่งลูป
- เช็คลูป Expression ว่าเป็น true หรือ false ถ้าเป็น true ไปข้อถัดไป
- ...
- ...
- ...
- ...
- ...
- เช็คลูป Expression ว่าเป็น true หรือ false ถ้าเป็น false หยุดลูปและออกจากลูป
ตัวอย่างหาค่า Triangular Number ด้วย for
var n:int = 5;
var result:int = 0;
for (var i:int = 1; i <= n; i++)
{
result += i;
}
trace("result for triangular number at " + n + " is = " + result);
ผลที่ได้
ถ้าอยากหาค่า Triangular Number ขั้นที่เท่าไหร่ก็แค่เปลี่ยนค่า n ดูนะครับ
อ้าว แต่แบบนี้หาค่าของ Triangular Number ขั้นที่ n ได้ แล้วถ้าจะแสดงค่าของ Triangular Number ตั้งแต่ขั้นที่ 1 ถึงขั้นที่ n หละ เขียนได้มั้ย?
คำ ตอบก็คือไอ้เขียนได้มั้ยหนะมันได้อยู่แล้วครับ แต่เขียนยังไงนี่สิประเด็น จะเขียนยังไงคุณลองนึกดูก่อนครับ อิอิ เวลาเจอโจทย์แบบนี้มันก็รู้สึกเหมือนเรากำลังเล่นเกม Puzzle ดีๆ นี่เอง ลองหาวิธีผ่านด่านกันดูเองก่อนนะครับ แล้วค่อยดูเฉลยด้านล่างต่อไป บางทีคุณอาจจะเขียนไม่เหมือนผมก็ได้ แต่ถ้าได้ผลลัพธ์เช่นกันก็ไม่มีปัญหาอะไรครับ เพราะ 100 คนเขียนโปรแกรมออกมาเหมือนกันแต่ Code อาจจะไม่เหมือนกันเลยก็ได้นะครับเป็นเรื่องปกติธรรมดามาก
เฉลยๆๆ
ตัวอย่างหาค่า Triangular Number ขั้นที่ 1 ถึง ขั้นที่ n ด้วย for
var n:int = 5;
for (var i:int = 1; i <= n; i++)
{
var result:int = 0;
for (var j:int = 1; j <= i; j++)
{
result += j;
}
trace("result for triangular number at " + n + " is = " + result);
}
ผลที่ได้
วิธีที่ผมใช้ก็คือใช้ for ซ้อน for นั่นเองครับ อิอิ บาง คนอาจจะบอก เฮ้ย! ทำอย่างนี้ได้ด้วยหรอเนี่ย ไม่บอกตั้งแต่แรกไม่งั้นก็คิดออกแล้ว ตรงนี้ก็เป็นประเด็นเล็กๆ อย่างนึงที่เวลาคุณเขียนโปรแกรมจริงๆ แล้วเนี่ยจะพบบ่อยมาก นั่นก็คือ "จะเขียนยังไง" ซึ่งคุณอาจจะไม่มีคนให้ถาม หรือต้องหาวิธีเอง วิธีการที่เราจะสามารถตอบคำถามได้เองว่าจะเขียนยังไงหรือทำอย่างนั้นอย่าง นี้ได้หรือเปล่านั่นก็คือ "ต้องลอง" ครับ ไม่ลองก็ไม่รู้ นะครับผม
ก็คงจบเรื่อง for เท่านี้ก่อนนะครับ มาต่อการวนลูปด้วย while กันต่อเลยดีกว่าครับ
while
เริ่ม กันด้วยตัวอย่างอีกเช่นเคยครับ โดยผมจะให้ผลลัพธ์ที่ได้เป็นเหมือนกับตัวอย่างของ for นะครับ เพื่อจะได้เทียบกันแบบ shot ต่อ shot เลยว่า เขียนให้ได้ผลเหมือนกันโดยใช้ for กับ while มันเขียนต่างกันยังไงบ้างตัวอย่าง while 1
var i:int = 0;
while (i < 10)
{
trace("i = " + i);
i++;
}
ผลที่ได้
ดูตัวอย่างที่ 2 ต่อกันเลยนะครับ
ตัวอย่าง while2
var i:int = 5;
while (i < 20)
{
trace("i = " + i);
i += 5;
}
ผลที่ได้
และต่อที่ตัวอย่างที่ 3 ครับ
ตัวอย่าง while3
var i:int = 100;
while (i > 0)
{
trace("i = " + i);
i -= 10;
}
ผลที่ได้
สรุปสำหรับ while นั้น Syntax คือ
กำหนดค่าเริ่มต้นของตัววิ่งลูป;
while (ลูป Expression ที่ถ้าเป็น true จะทำต่อถ้าเป็น false จะออกจากลูป)
{
statement ที่จะทำซ้ำ;
เพิ่มค่า(หรือลดค่า)ตัววิ่งลูป;
}
เอา หละถ้าจะใช้ while เขียนหาค่า Triangular Number ดูหละ รวมถึงการใช้ while เขียนให้แสดงค่า Triangular Number ตั้งแต่ขั้นที่ 1 ถึงขั้นที่ n จะเขียนยังไง ผมให้เป็นแบบฝึกหัดลองเขียนกันดูนะครับ!!
do
สำหรับ do ลูป จะใกล้เคียงกับ while ลูปครับ หรือบางทีเค้าจะเรียกกันว่า do...while มากกว่า do เฉยๆ ซะอีกเพราะว่าเวลาเขียนจะใช้ Keyword ทั้ง do และ while ครับdo ลูป จะทำการรัน Code ตรงส่วน statement ที่จะทำซ้ำก่อน แล้วค่อยตรวจสอบลูป Expression ที่ถ้าเป็น true จะวนลูปต่อถ้าเป็น false จะออกจากลูป ทีหลังครับ ซึ่งก็แตกจาก for และ while ด้วยเช่นกัน เพราะทั้ง for loop และ while loop จะทำการตรวจสอบลูป Expression ก่อน แล้วค่อยทำ statement ที่จะทำซ้ำ
ลองมาดูตัวอย่าง do กันครับ
ตัวอย่าง do 1
var hp:int = 50;
do
{
trace("attack!");
hp -= 10;
}
while (hp > 0)
trace("die...");
ผลที่ได้
ตัวอย่าง นี้แสดงถึง Syntax การเขียน do...while ครับ โดยที่มาถึงเราก็จะ attack! ก่อนเลย 1 ทีซึ่งจะทำให้ hp ลดลง 10 หลังจากนั้นถึงจะทำการตรวจสอบดูว่าอยากมันยังไม่ตาย (hp ยังมากกว่า 0 อยู่) ก็ให้ทำการวนลูปอัดซ้ำไปเรื่อยๆ จนกว่ามันจะตายนั่นเองครับ อิอิ โปรแกรมนี้โหดสะใจเลยใช่มั้ยครับ ฮ่าๆ
ส่วน ใหญ่แล้วเวลาเขียนโปรแกรมวนลูปเราก็ไม่มีข้อกำหนดตายตัวว่าจะต้องใช้ for, while หรือ do ครับ ขึ้นอยู่กับ Requirement หรือผลลัพธ์ของโปรแกรมที่เราต้องการ รวมถึงความถนัดและความชอบส่วนตัวมากกว่าว่าชอบใช้อะไรมากกว่ากัน ไม่มีผิด-ถูกครับ (แต่สำหรับการเป็นโปรแกรมเมอร์ระดับโปรหรือ Expert นั้นก็อาจจะมีการเขียน Code ที่เรียกว่าดีน้อยกับดีมากหรือดีเยี่ยมอยู่ครับ ไว้อนาคตค่อยพูดถึงครับ หากมีโอกาส)
อย่าง ไรก็ตามผมขอจบเรื่อง Program Looping ไว้เท่านี้ละกันนะครับ อาจจะพูดถึง while กับ do น้อยหน่อย แต่ Concept แล้วทั้ง for, while และ do ไม่ค่อยต่างกันมากครับ ยังไงคุณก็ "ลอง" เขียนเล่นเพื่อทำความคุ้นเคยกันดูละกันนะครับผม
ขอบคุณครับ ไว้พบกันใหม่ครับ ^^
ไม่มีความคิดเห็น:
แสดงความคิดเห็น