อัลกอริทึมและ伪代码 (Pseudocode)
แนะนำใหม่| English | ความหมาย |
|---|---|
| algorithm/ˈælɡərɪθəm/ | อัลกอริทึม |
| sequence/ˈsiːkwəns/ | ลำดับ |
| deterministic/dɪˌtɜːmɪˈnɪstɪk/ | แบบกำหนดได้ |
| identifier table/aɪˈdentɪfaɪə ˈteɪbl/ | ตารางตัวระบุ |
| variable/ˈveərɪəbl/ | ตัวแปร |
| data type/ˈdeɪtə taɪp/ | ชนิดข้อมูล |
| pseudocode/ˈsuːdəʊkəʊd/ | รหัสจำลอง |
| assignment/əˈsaɪnmənt/ | การกำหนดค่า |
| loop/luːp/ | ลูป |
| count-controlled loop/kaʊnt kənˈtrəʊld luːp/ | ลูปควบคุมด้วยนับ |
| pre-condition loop/priː kənˈdɪʃn luːp/ | ลูปก่อนเงื่อนไข |
| post-condition loop/pəʊst kənˈdɪʃn luːp/ | ลูปหลังเงื่อนไข |
| iteration/ˌɪtəˈreɪʃn/ | รอบการทำงาน |
| selection/sɪˈlekʃn/ | การเลือก |
| flowchart/ˈfləʊtʃɑːt/ | แผนภาพไหล |
| stepwise refinement/ˈstepwaɪz rɪˈfaɪnmənt/ | การปรับแต่งทีละขั้น |
รอยขีดข่วนที่แพงที่สุดในประวัติศาสตร์
- ในวันที่ 22 กรกฎาคม ค.ศ. 1962 จรวด Mariner 1 ที่มุ่งหน้าไปดาวศุกร์ ถูก引爆หลังจากบินได้ 293 วินาที
- สาเหตุมาจากการขาดเส้นขีดทับเหนือสัญลักษณ์หนึ่งในสมการนำทาง คอมพิวเตอร์ปฏิบัติตามขั้นตอนที่เขียนไว้อย่างเคร่งครัด และขั้นตอนที่เขียนไว้นั้นผิด
- คอมพิวเตอร์ไม่เคยเติมสิ่งที่คุณตั้งใจไว้ ทุกขั้นตอนที่คุณให้มันต้องมีความหมายเพียงอย่างเดียวเท่านั้น
- นั่นคือเหตุผลที่บทเรียนนี้เกี่ยวกับการเขียนขั้นตอนที่เครื่องสามารถทำตามได้: อัลกอริทึม (Algorithms)
อัลกอริทึมคืออะไร
- อัลกอริทึม คือวิธีแก้ปัญหาที่แสดงออกมาเป็น ลำดับขั้นตอนที่กำหนดไว้ชัดเจน
- แต่ละขั้นตอนต้อง ไม่ambiguous (มีความหมายเดียว) determinis tic (อินพุตเท่าเดิม → เอาต์พุตเท่าเดิม)有限 (ขั้นตอนสิ้นสุดลง) และEffective (แต่ละขั้นตอนสามารถทำได้จริง)
- มันบอก ต้องทำอะไร โดยไม่ขึ้นอยู่กับภาษาโปรแกรมใด และทุกตัว遵循 Input → Process → Output

อัลกอริทึมทุกตัวมีรูปทรงเดียวกัน: Input, Process, Output
อัลกอริทึมเป็น "deterministic" (มีกำหนดผลลัพธ์) ซึ่งหมายความว่า:
Difficulty 1/5 · 100 coins + a small bonus on first completion today
Deterministic = อินพุตเดียวกัน → เอาต์พุตเหมือนกันทุกครั้ง (Finite = ขั้นตอนสิ้นสุด; unambiguous = ความหมายเดียวต่อขั้นตอน)
ตัวอย่างทำโจทย์: ตารางตัวแปร
- ก่อนเขียนโค้ด ให้ระลิสข้อมูลทั้งหมดใน ตารางตัวแปร (identifier table): ชื่อ ตัวแปร, ชนิดข้อมูล และคำอธิบาย
- โปรแกรมสต็อกของร้านเก็บ
"Fruit",20/02/2025,12.67และTRUEข้อสอบถามหาชื่อและชนิดสำหรับแต่ละอย่าง Category : STRING(หมวดหมู่สินค้า),DateSold : DATE(วันที่ขาย),ItemCost : REAL(ราคา),InStock : BOOLEAN(มีสต็อกหรือไม่?)- 1 คะแนนต่อแถวสำหรับชื่อ และ ชนิด ดังนั้นเขียนชนิดให้ตรงตามคู่มือ Pseudocode พอดี:
INTEGER,REAL,STRING,CHAR,BOOLEAN,DATE

ตารางตัวแปรระบุชื่อข้อมูลทุกชิ้นก่อนเริ่มเขียนโค้ด
ในตารางไถ่ (identifier table) ประเภทข้อมูลสำหรับค่าเช่น 12.67 (ค่าใช้จ่าย) คือ ____
Difficulty 1/5 · 100 coins + a small bonus on first completion today
ตัวเลขที่มีส่วนทศนิยมคือ REAL INTEGER สำหรับจำนวนเต็ม STRING สำหรับข้อความ BOOLEAN สำหรับ TRUE/FALSE และ DATE สำหรับวันที่
โครงสร้างสามชนิด
IF … THEN … ELSE … ENDIF
- การกำหนดค่า (Assignment) เก็บค่าด้วยลูกศร,
Total ← Total + Value;=ใช้สำหรับการเปรียบเทียบ.DIVเป็นการหารจำนวนเต็ม และMODเป็นเศษเหลือ ดังนั้น17 MOD 5 = 2
INPUT Age # sequence
IF Age >= 18 THEN
# selection
ENDIF
OUTPUT "Adult"
ELSE
OUTPUT "Minor"
ENDIF
FOR Count <- 1 TO 10 # iteration
OUTPUT Count
NEXT Count

บล็อกสร้างอัลกอริทึมทั้งสาม
การเลือก: ตามเส้นทาง IF / ELSE
ลากคะแนนและดูว่าเส้นทางไหนทำงาน การเลือกจะทดสอบเงื่อนไขทีละข้อและเลือกเส้นทางที่ TRUE เป็นข้อแรก — นั่นคือวิธีการทำงานของ IF … ELSE IF … ELSE
จับคู่โครงสร้างการเขียนโปรแกรมทั้งสามกับสิ่งที่มันทำหน้าที่
Difficulty 2/5 · 140 coins + a small bonus on first completion today
อัลกอริทึมทุกตัวสร้างจากโครงสร้างพื้นฐานเพียงสามอย่าง — ลำดับขั้นตอน, การเลือก และการทำซ้ำ
ใน伪代码นี้ สัญลักษณ์ใดหมายถึงการกำหนดค่า (เก็บค่า)?
Difficulty 1/5 · 100 coins + a small bonus on first completion today
การกำหนดค่าใช้ ← (เช่น x ← 5); = สงวนไว้สำหรับการเปรียบเทียบเท่านั้น
ค่าของ 17 MOD 5 คืออะไร?
Difficulty 2/5 · 140 coins + a small bonus on first completion today
MOD ให้เศษเหลือ: $17 = 3 \times 5 + 2$, ดังนั้น 17 MOD 5 = 2. (17 DIV 5 = 3.)
เลือกวงลูปแบบไหน?
FOR … NEXTเมื่อคุณทราบจำนวนครั้ง: Count-controlled loopWHILE … ENDWHILEตรวจสอบเงื่อนไข ก่อน การวนแต่ละรอบ ดังนั้น Body อาจรัน ศูนย์ ครั้ง: Pre-condition loopREPEAT … UNTILตรวจสอบ หลัง การวนแต่ละรอบ ดังนั้น Body จะรันอย่างน้อย หนึ่ง ครั้งเสมอ: Post-condition loop. การตรวจสอบ Input เป็นกรณีคลาสสิก- คำตอบแบบ "อธิบายโครงสร้างการทำซ้ำ" ต้องระบุชื่อนวงลูป บอก จุดที่ตรวจสอบเงื่อนไข และบอกผลลัพธ์

ลูป WHILE จะทดสอบก่อนรันตัวลูป; ลูป REPEAT … UNTIL จะทดสอบหลังจากรันตัวลูป
WHILE loop แตกต่างจาก REPEAT...UNTIL loop อย่างไร?
Difficulty 1/5 · 100 coins + a small bonus on first completion today
WHILE ตรวจสอบก่อน (สามารถทำงาน 0 ครั้ง); REPEAT...UNTIL ตรวจสอบหลัง ทำให้งานอย่างน้อยหนึ่งครั้งเสมอ
FOR loop เป็นแบบควบคุมนับจำนวน (ทำซ้ำจำนวนครั้งคงที่) ในขณะที่ WHILE loop เป็นแบบควบคุมโดยเงื่อนไข (ทำซ้ำจนกว่าเงื่อนไขจะเปลี่ยน)
Difficulty 1/5 · 100 coins + a small bonus on first completion today
ใช้ FOR เมื่อคุณทราบจำนวนรอบที่จะวน; ใช้ WHILE/REPEAT เมื่อวนจนกว่าสิ่งใดสิ่งหนึ่งจะเป็นจริง
ตัวอย่างทำโจทย์: จากข้อความสู่ Pseudocode
- หน้าที่: รับค่าจำนวนเต็ม 100 ค่า บวกเฉพาะค่าบวก และแสดงผลรวม
- วางแผนข้อมูลก่อน:
Count,TotalและNextNumber, ทั้งหมดINTEGER. จากนั้นโครงสร้างสามชนิดจะทำส่วนที่เหลือ
DECLARE Count, Total, NextNumber : INTEGER
Total <- 0
FOR Count <- 1 TO 100
INPUT NextNumber
IF NextNumber > 0 THEN
Total <- Total + NextNumber
ENDIF
NEXT Count
OUTPUT Total
- ส่วนถัดไปขอให้คุณ ระบุโครงสร้าง: การทำซ้ำ (วงลูป
FORทำซ้ำการรับข้อมูล 100 ครั้ง), การเลือก (IFตัดสินว่าค่าจะถูกบวกหรือไม่) และลำดับ (คำสั่งรันตามลำดับ)
ระบุโครงสร้างจากส่วนคัดลอก
- คำถามยอดนิยมแสดงตัวอย่าง Pseudocode ห้าส่วนและขอให้ติ๊กว่าแต่ละส่วนใช้ การกำหนดค่า, การเลือก, หรือการทำซ้ำ อย่างใด
Result ← CalculateTotal()เป็นการกำหนดค่า.WHILE IsClosedเป็นการทำซ้ำ.REPEAT … INPUT Value … UNTIL Sales[4] > Valueเป็นการทำซ้ำ และ การกำหนดค่า (INPUTเก็บค่า) IF Sales[Current] <= 150 THEN Discount ← TRUE ENDIF- ดูทุกบรรทัดของส่วนคัดลอก ไม่ใช่แค่บรรทัดแรก บรรทัดหนึ่งอาจต้องการติ๊กสองจุด
ส่วนนี้ใช้โครงสร้างใด? REPEAT … INPUT Value … UNTIL Total > 100. เลือก ทุก ข้อที่ใช้ได้
Difficulty 2/5 · 140 coins + a small bonus on first completion today
REPEAT … UNTIL เป็นการทำซ้ำ และ INPUT Value เก็บค่า ซึ่งถือเป็น Assignment ไม่มี IF หรือ CASE ดังนั้นจึงไม่มี Selection — เงื่อนไข UNTIL ควบคุมการวนลูป ไม่ได้เลือกระหว่างทางแยก
Flowchart
- แผนผังการทำงาน (flowchart) แสดงอัลกอริทึมเดียวกันในรูปภาพ วงรีคือ
STARTและEND,สี่เหลี่ยมผืนผ้าคือกระบวนการ, สี่เหลี่ยมขนมเปียกปูนคือINPUT/OUTPUT,และ รูปเพชร คือการตัดสินใจ - รูปเพชรคือจุดที่มีการเลือก,และเส้นนำทางที่วิ่งกลับ ขึ้น บนแผนผังคือลูป
- การสอบถามทั้งสองแบบ: พ MESSAGECODE จาก แผนผังการทำงาน,และแผนผังการทำงาน จาก พ MESSAGECODE หรือภาษาอังกฤษแบบโครงสร้าง ทุกสัญลักษณ์ที่คุณวาดควรจับคู่กับหนึ่งบรรทัดของพ MESSAGECODE

แต่ละสัญลักษณ์ในแผนผังการทำงานจับคู่กับชนิดหนึ่งของคำสั่งพ MESSAGECODE
ใน Flowchart รูปสี่เหลี่ยมขนมเปียกปูนแทนอะไร?
Difficulty 1/5 · 100 coins + a small bonus on first completion today
รูปสี่เหลี่ยมจตุรัสใช้สำหรับการเลือก (Selection) และรูปสี่เหลี่ยมจตุรัสที่มีเส้นไหลย้อนกลับขึ้นไปในแผนภาพคือLoop Test ส่วนสี่เหลี่ยมผืนผ้าใช้สำหรับกระบวนการ สี่เหลี่ยมขนมเปียกปูนใช้สำหรับข้อมูลเข้า/ออก และวงรีใช้สำหรับจุดเริ่มต้นและจุดสิ้นสุด
ตัวอย่างทำพร้อมวิธี: เกมทายตัวเลข
- โปรแกรมสุ่มจำนวนเต็มจาก 1 ถึง 100,แล้วขอการทายจนกว่าผู้ใช้จะทายถูก ผู้ใช้ต้องทายอย่างน้อยครั้งเดียว ดังนั้นลูปนี้จึงเป็น
REPEAT … UNTIL
DECLARE Target, Guess : INTEGER
Target <- INT(RAND(100)) + 1
REPEAT
INPUT Guess
IF Guess < Target THEN
OUTPUT "Too low"
ELSE
IF Guess > Target THEN
OUTPUT "Too high"
ENDIF
ENDIF
UNTIL Guess = Target
OUTPUT "Correct"
- ติดตามแผนผังการทำงาน: รูปเพชรหนึ่งรูปสำหรับการทดสอบลูป,สองรูปสำหรับคำแนะนำ,และเส้นนำทางทั้งหมดจบลงที่
INPUT GuessหรือEND

เกมทายตัวเลขในรูปแบบแผนผังการทำงาน: ลูปจะย้อนกลับไปที่การรับค่าจนกว่าการทายจะตรงกับคำตอบ
ทำไม REPEAT … UNTIL จึงเป็นLoop ที่ถูกต้องสำหรับเกมทายเลข?
Difficulty 1/5 · 100 coins + a small bonus on first completion today
Loop แบบPost-condition จะทำงานภายในLoop อย่างน้อยหนึ่งรอบก่อนทำการทดสอบ ซึ่งสอดคล้องกับเกมที่ต้องการให้ทายอย่างน้อยหนึ่งครั้ง ส่วนWHILE Loop จำเป็นต้องมีการทายก่อนเริ่มLoop เพื่อมีค่าให้ทดสอบ
การปรับปรุงทีละขั้น (Stepwise refinement)
- การปรับปรุงทีละขั้น หมายถึงเริ่มจากโครงร่างและขยายแต่ละขั้นตอนให้เป็นขั้นตอนรายละเอียดมากขึ้น ซ้ำแล้วซ้ำเล่า จนกว่าทุกขั้นตอนสามารถเขียนเป็นพ MESSAGECODE ได้โดยตรง
- "ประมวลผลคำสั่งซื้อ" → "รับรายการ", "คำนวณยอดรวม", "รับชำระเงิน" → "คำนวณยอดรวม" กลายเป็น "สำหรับแต่ละรายการ, บวกราคา × จำนวน; ใช้ส่วนลดหากมี"
- แต่ละระดับเป็นการปรับปรุงของระดับด้านบน,และระดับที่สมบูรณ์รวมกันคือแบบแผน "อธิบายการปรับปรุงทีละขั้น" ต้องการโครงร่าง,การขยาย,และกฎการหยุด

*ปรับปรุงแต่ละขั้นตอนจนสามารถเขียนโค้ดได้โดยตรง
เรียงลำดับขั้นตอนของการปรับปรุงทีละขั้น (Stepwise Refinement)
Difficulty 3/5 · 200 coins + a small bonus on first completion today
วางโครงร่างก่อน แล้วจึงปรับปรุงทีละระดับ; หยุดเมื่อขั้นตอนใดเป็นPseudocode ได้เพียงบรรทัดเดียว
คำสั่งตรรกะ
- ส่วนหนึ่งของโซลูชันถูกกำหนดโดย คำสั่งตรรกะ: เงื่อนไขที่สร้างจากการเปรียบเทียบ (
=,<>,<,>,<=,>=) ที่เชื่อมต่อกันด้วยAND,ORและNOT - คะแนนที่ถูกต้อง:
Mark >= 0 AND Mark <= 100. ส่วนลดใช้ได้หากลูกค้าเป็นสมาชิก หรือใช้จ่ายเกิน 50:IsMember OR Total > 50 NOT (Mark < 40)มีความหมายเหมือนMark >= 40. เขียนคำสั่ง แล้วทดสอบด้วยค่าแต่ละด้านของขอบเขต

*การเปรียบเทียบที่เชื่อมต่อกันด้วย AND, OR และ NOT สร้างเงื่อนไขที่อัลกอริทึมต้องการ
NOT (Mark < 40) เป็นจริงสำหรับค่าของ Mark เดียวกันพอดีกับ Mark >= 40
Difficulty 1/5 · 100 coins + a small bonus on first completion today
การ negate "น้อยกว่า 40" จะได้ "40 ขึ้นไป" ทดสอบที่ขอบเขต: เมื่อ Mark = 40 ทำให้ Mark < 40 เป็นเท็จ ดังนั้นNOT ของมันจะเป็นจริง และ 40 >= 40 ก็จะเป็นจริงด้วย
คะแนนที่หลุดหายไป
←assigning และ=comparing.IF Total = 0เป็น test;Total = 0ในบรรทัดเดียวไม่ได้รับคะแนน- Every construct ปิด:
ENDIF,ENDWHILE,UNTIL,NEXT,ENDCASE.缺失 closer ทำลายโครงสร้าง mark - Declare ก่อนใช้, และ initialise running total เป็น
0 WHILEอาจไม่ pernah run,REPEATalways รันครั้งเดียว. เลือก loop ที่ตรงกับงาน, และบอกเหตุผลถ้าถูกถาม
คุณเข้าใจแล้ว
- ขั้นตอนของอัลกอริทึมต้อง ไม่มีความกำกวม, เป็นแบบกำหนดเอง, มีจำนวนจำกัด, และใช้ประโยชน์ได้จริง; จัดเตรียมข้อมูลใน ตารางตัวระบุ (identifier table)
- โครงสร้างสามประเภท: ลำดับ (sequence), การเลือก (selection) (
IF/CASE), การทำซ้ำ (iteration) (FOR/WHILE/REPEAT);WHILEตรวจสอบก่อน,REPEATตรวจสอบหลัง - กราฟแสดงขั้นตอนและพ MESSAGE code อธิบายอัลกอริทึมเดียวกัน; การปรับแต่งทีละขั้น (stepwise refinement) จะขยายร่างแผนจนสามารถเขียนโค้ดได้
- conditions are logic statements: comparisons joined with
AND,OR,NOT