2024S_FE-B_Questions_Final_Translated_v2.pdf (662.9 KB)
Q1
ตอบ: e) (เติม A: ≥, B: "P", C: "F")
วิธีทำ:
- เกณฑ์ในตาราง: 80–100 ⇒ D, 50–79 ⇒ P, 0–49 ⇒ F
- เงื่อนไขต้องเป็น
if (score ≥ 80) ret ← "D";elseif (score ≥ 50) ret ← "P"; else"F"จึงตรงกับตัวเลือก e) ที่ให้≥, "P", "F"ครบถ้วน.
Q2
ตอบ: d) (ตั๋วราคา 10 บาทถ้าอายุน้อยกว่าหรือเท่ากับ 10 หรือ มากกว่าหรือเท่ากับ 60 หรือ เป็นสมาชิก)
วิธีทำ:
- เงื่อนไขส่วนลดคือเด็ก/ผู้สูงอายุ/สมาชิก จึงใช้ OR รวมกัน ⇒ ตัวเลือก d).
Q3
ตอบ: c) (i mod 2 = 0)
วิธีทำ:
- ต้องรวมเฉพาะเลขคู่ระหว่าง 1–100 ⇒ เงื่อนไขเลขคู่คือ
i mod 2 = 0.
Q4
ตอบ: b) (เติม sum ← sum + (num mod 10) และ num ← ส่วนที่เป็นจำนวนเต็มของ (num ÷ 10))
วิธีทำ:
- หาผลรวมหลักทุกหลักของ
num⇒ หลักหน่วยคือnum mod 10; ตัดหลักหน่วยทิ้งด้วยหารปัดทิ้ง 10 ⇒ ตรง b).
Q5
ตอบ: d) (minute ← modulus(division(input,60),60), hour ← division(input,3600))
วิธีทำ:
- วินาทีที่เหลือ =
input mod 60(ให้มาแล้ว) - นาทีที่เหลือ = เอาจำนวน “นาทีทั้งหมด” (
input ÷ 60) แล้ว mod 60 ⇒modulus(division(input,60),60) - ชั่วโมง =
input ÷ 3600⇒division(input,3600).
Q6
ตอบ: a) (if ((rbyte & (00000001 << (i - 1))) ≠ 0) …)
วิธีทำ:
- ตรวจบิตที่ตำแหน่ง i (เริ่มนับจาก 1) ⇒ สร้างมาสก์
1 << (i-1)แล้ว AND กับ rbyte ถ้าผล ≠ 0 แปลว่าบิตนั้นเป็น 1 ⇒ นับเพิ่ม.
Q7
ตอบ: i) (เงื่อนไขฐาน: (n = 1) or (n = 2) คืน n-1; มิฉะนั้นคืน fibo(n-1) + fibo(n-2))
วิธีทำ:
- ลำดับฟีโบนักชีเริ่ม 0,1 ⇒ ค่าที่ตำแหน่ง 1 และ 2 คือ 0,1 ตามลำดับ จึงใช้ base case
n=1,2 ⇒ n-1; ที่เหลือใช้ผลรวมสองตัวก่อนหน้า.
Q8
ตอบ: b) (เติม A: index > max, B: index + 1, C: index - 1)
วิธีทำ:
- โครงสร้างสแตกใช้ตัวชี้
indexชี้ “ตำแหน่งว่างถัดไป”; ว่างเมื่อindex = 1; เต็มเมื่อindex > max - push: เก็บที่
content[index]แล้วindex ← index + 1 - pop: ลด
indexก่อน แล้วคืนcontent[index].
Q9 (เดินต้นไม้ preorder ด้วยสแตก)
ตอบ: b) (เติม A: 0, B: v.right, C: v.left)
วิธีทำ:
- Preorder = root → left → right
- ใช้สแตก: ดึง
vออกมาพิมพ์ก่อน แล้ว “ดัน right ก่อน left” เพื่อให้ left โผล่มาก่อนตอน pop ⇒push(v.right)แล้วpush(v.left) - ลูปทำงานจน
sp ≠ 0⇒ เงื่อนไข while คือsp ≠ 0ซึ่งในแบบเลือกกรอกเป็นA: 0(ใช้while (sp ≠ A)).
Q10 (เชื่อมลิสต์วน)
ตอบ: b) (เติม A: listHead, B: tmp.next)
วิธีทำ:
- หาโหนดสุดท้ายของลิสต์วงกลมโดยวนจนกว่า
tmp.next == listHead - ลูปจึงเป็น
while (tmp.next is not listHead) tmp ← tmp.nextแล้วผูกtmp.next ← newNodeและnewNode.next ← listHead.
Q11 (Selection Sort — เติมช่องว่าง)
ตอบ: เติมค่าที่ถูกต้องคือ
- A:
i + 1(เริ่มค้นหาตำแหน่ง min จากถัดจาก i) - B:
<(อัปเดตminPosเมื่อdata[j] < data[minPos]) - C:
data[i](สลับdata[i]กับdata[minPos]โดยใช้temp ← data[i])
วิธีทำ:
- selection sort วน
i = 1..n-1, setminPos = i, วนj = i+1..nหา “ค่าต่ำสุด” ด้วย<แล้วสลับที่ท้ายรอบ. (หน้าโจทย์ส่วนตัวเลือกในไฟล์นี้พิมพ์ตกหล่น/กะเทาะ แต่โค้ดที่ถูกต้องต้องเป็นสามค่าตามนี้).
Q12 (ตรวจพาลินดรอม – เงื่อนไขลูป)
ตอบ: b) (while (i < (len ÷ 2) + 1))
วิธีทำ:
- ตรวจคู่ตัวอักษรจากซ้าย–ขวาให้ครบครึ่งหนึ่งของสตริง
- เงื่อนไข
i < (len ÷ 2) + 1(โดยเริ่ม i=1 และลดขวา) ให้จำนวนรอบเท่าที่ต้องเปรียบเทียบพอดี แม้กรณียาวเป็นเลขคู่.
Q13 (วงเล็บสมดุล)
ตอบ: h) (เติม A: ≠ c, B: stack.isEmpty(), C: chars[2])
วิธีทำ:
- ถ้าเจอปิดวงเล็บ: pop วงเล็บเปิดจากสแตก =
stackedแล้วต้องเช็คว่า “วงเล็บปิดที่จับคู่กับstacked” ไม่เท่ากับc⇒ ผิดทันที ⇒ เงื่อนไขคือget_closing_bracket(stacked) ≠ c - หลังจบลูปต้องว่างสนิทจึงสมดุล ⇒
return stack.isEmpty() - ฟังก์ชันจับคู่ต้องคืน
chars[2]เมื่อพบchars[1] = c.
Q14 (โปรแกรมสร้าง N-grams)
ตอบ: i) (เติม A: length − n + 1, B: i + n − 1)
วิธีทำ:
- ตำแหน่งเริ่มของ n-gram ตัวสุดท้ายคือ
length - n + 1 - สำหรับแต่ละ
iความยาว n ตัว ⇒jวิ่งถึงi + n − 1.
Q15 (cosine similarity)
ตอบ: i) 0.9
วิธีทำ:
sxy = 2×3 + 2×1 + 1×1 + 0×1 + 4×2 = 17sxx = 2² + 2² + 1² + 0² + 4² = 25syy = 3² + 1² + 1² + 1² + 2² = 16- similarity =
sxy / sqrt(sxx×syy) = 17 / sqrt(400) = 17/20 = 0.85ปัดทศนิยม 1 ตำแหน่งเป็น 0.9.
Q16 (ประมาณค่า sin(x) แบบ Maclaurin)
ตอบ: h) (เติม A: > epsi, B: − vn × x² ÷ ((k − 1) × k))
วิธีทำ:
- ลูปต่อเมื่อ “พจน์ปัจจุบันยังใหญ่กว่า epsi” ⇒
abs(vn) > epsi - สัมพันธ์พจน์ถัดไปของอนุกรมสลับเครื่องหมายและคูณด้วย
x²/((k−1)k)เมื่อkกระโดดทีละ 2 ⇒vn ← − vn × x² / ((k−1)k).
Q17 (อีเมลน่าสงสัย)
ตอบ: c) (โจมตี ฟิชชิง; โดยทั่วไปดำเนินการผ่าน อีเมลที่ล่อให้คลิกลิงก์ไปเว็บปลอม)
วิธีทำ:
- ลักษณะตรงกับ phishing: หลอกให้ผู้ใช้คลิกลิงก์กรอกข้อมูลบนเว็บปลอม/แนบไฟล์อันตราย
- จึงเลือก “ฟิชชิง — การส่งอีเมลเพื่อล่อให้ไปยังเว็บไซต์ปลอม”.
Q18 (PKI สำหรับเว็บ/อีเมล – ตาราง)
ตอบ: f)
- A: “กุญแจสาธารณะของเว็บเซิร์ฟเวอร์” (ส่ง CSR ที่มี public key ให้ CA เซ็น ไม่เคยส่ง private key)
- B: “กุญแจสาธารณะของพนักงาน” (ให้คู่ค้าเข้ารหัสอีเมลถึงพนักงานได้)
- C: “กุญแจส่วนตัวของพนักงาน” (ต้องติดตั้งในอีเมลไคลเอนต์เพื่อ ลงลายเซ็นดิจิทัล)
เหตุผลตามกระบวนการ PKI มาตรฐาน.
Q19 (เหตุบัญชีลูกค้าถูกยึด + โจมตีฐานข้อมูล)
ตอบ: f) (A: เอสคิวแอลอินเจ็กชัน, B: เว็บแอปพลิเคชันไฟร์วอลล์)
วิธีทำ:
- เคสล็อกอินแปลกของลูกค้า ⇒ น่าจะมาจาก “รหัสที่รั่วจากเว็บอื่น + ยัดเข้าเว็บนี้ (credential stuffing/ brute-force online)” → องค์กรจึงเพิ่ม 2FA
- อีกเหตุคือ “เข้าถึง/รันคิวรีฐานข้อมูลโดยไม่พบล็อกอินแอดมิน” ⇒ ลักษณะ SQL Injection
- มาตรการฝั่งแอปด่านหน้าเพื่อลดช่องโหว่ทันทีคือ WAF ⇒ ตรงชุด (A=SQLi, B=WAF).
Q20
ข้อนี้ในไฟล์ 2024S_FE-B (เม.ย. 2024) ที่คุณอัปโหลด เนื้อหาโจทย์/ตัวเลือกส่วน Q20 ไม่ปรากฏครบถ้วน (ตัดไปในหน้าถัดไป) จึงไม่สามารถระบุคำตอบตัวเลือก a–d ได้อย่างเชื่อถือ โดยไม่เดาเกินข้อมูลในไฟล์ครับ