The words you are searching are inside this book. To get more targeted content, please make full-text search by clicking here.
Discover the best professional documents and content resources in AnyFlip Document Base.
Search
Published by ttacademic9, 2020-03-06 04:21:49

2301170-Dittaya-ebook

2301170-Dittaya-ebook

6.2. การทำซำ้ แบบทดสอบกอ่ นทำและทดสอบหลังทำ 83

F T
เง่ือนไขในการทำซำ้ เง่ือนไขในการเลิกทำซ้ำ

T F
งานท่ตี ้องทำซำ้ งานที่ตอ้ งทำซำ้

(ก) โครงสรา้ งการวนซำ้ โดยใชเ้ งือ่ นไขให้ทำซ้ำตอ่ (ข) โครงสรา้ งการวนซ้ำโดยใช้เงอ่ื นไขใหเ้ ลิกทำซ้ำ

รูปที่ 6.2: โครงสร้างการทำซำ้ แบบทดสอบก่อนทำ

6.2.1 การทำซำ้ แบบทดสอบกอ่ นทำ

โครงสร้างการทำงานแบบทดสอบกอ่ นทำจะเริม่ จากการตรวจสอบเงอื่ นไขกอ่ น แลว้ จึงเร่ิมงานทต่ี อ้ งทำ
ซ้ำ แบง่ เงือ่ นไขออกเปน็ 2 กรณี ดงั นี้

1. เง่ือนไขใหท้ ำซ้ำตอ่

• เม่ือเป็นจรงิ จะทำงานทต่ี อ้ งทำซ้ำ
• เมื่อเปน็ เท็จ จะเลิกการทำซ้ำ

2. เง่ือนไขใหเ้ ลิกทำซ้ำ

• เมอ่ื เป็นจรงิ จะเลกิ การทำซำ้
• เมือ่ เป็นเทจ็ จะทำงานทีต่ อ้ งทำซำ้ ต่อ

เมื่อเขยี นเปน็ ผงั งาน จะไดด้ ังรปู ที่ 6.2(ก) และ 6.2(ข) ตามลำดบั
เง่ือนไขทงั้ สองกรณเี ป็นนเิ สธของกันและกนั เราสามารถเลอื กใช้เงอื่ นไขแบบใดก็ได้ ในการเขียนผงั

งานนั้น ควรเลอื กเง่อื นไขแบบท่เี ขา้ ใจง่าย เช่น จากตัวอย่างการเตมิ สารจนกว่าจะเกิดปฏิกิริยาเคมี จะ
เขยี นเงือ่ นไขไดส้ องรปู แบบดังรปู ที่ 6.3

เง่ือนไขคอื การตรวจสอบการเกิดปฏิกิริยาเคมี แบบ 6.3(ก) น้นั จะเป็นการทำซำ้ เม่ือเงื่อนไขเปน็ เท็จ
สว่ นแบบ 6.3(ข) เปน็ การเลกิ ทำซำ้ เมอื่ เง่อื นไขเปน็ จริง

6.2.2 การทำซำ้ แบบทดสอบหลังทำ

อีกรูปแบบหนึง่ ในการทำซำ้ คอื ทำสิ่งท่ตี อ้ งทำให้ครบกอ่ น แลว้ จงึ ตรวจสอบเงอ่ื นไขวา่ จะทำตอ่ หรือเลกิ
ทำ ซึ่งเขยี นเงื่อนไขได้ทัง้ แบบทำต่อเมอ่ื เงื่อนไขเป็นจริง และเลกิ ทำเมือ่ เงอื่ นไขเปน็ จริง ดังรปู ท่ี 6.4(ก)

84 บทที่ 6. การทำงานแบบวนซำ้

ไมพ่ บปฏกิ ิริยาเคมี F พบปฏกิ ิรยิ าเคมี T

T F
เติมสาร เติมสาร

(ก) เมือ่ ไม่มปี ฏกิ ิรยิ าเคมใี ห้เติมสาร (ข) เมือ่ มีปฏิกิรยิ าเคมใี ห้หยุดเติมสาร

รูปที่ 6.3: สว่ นของผังงานแสดงการเตมิ สารเคมจี นกวา่ จะเกิดปฏิกิริยา

งานท่ีตอ้ งทำซ้ำ งานทตี่ อ้ งทำซำ้

F T
เง่อื นไขในการทำซำ้ เงือ่ นไขในการเลกิ ทำซ้ำ

T F

(ก) โครงสรา้ งการวนซำ้ โดยใชเ้ งือ่ นไขใหท้ ำซ้ำตอ่ (ข) โครงสร้างการวนซำ้ โดยใชเ้ งอ่ื นไขใหเ้ ลิกทำซ้ำ

รูปที่ 6.4: โครงสรา้ งการทำซำ้ แบบทดสอบหลังทำ

และ 6.4(ข) ตามลำดบั

6.2.3 เปรยี บเทยี บการทำซำ้ แบบทดสอบก่อนทำและทดสอบหลงั ทำ

ในการออกแบบการทำงานนนั้ จะเลือกการทำงานแบบทดสอบก่อนหรอื หลงั ทำก็ได้ ข้อสงั เกตหนึ่งคือ
การทำซำ้ แบบทดสอบหลังทำ จะมีการทำซำ้ อยา่ งน้อย 1 รอบเสมอ ในขณะทกี่ ารทำซ้ำแบบทดสอบก่อน
ทำจะตรวจสอบเงอื่ นไขก่อน จงึ อาจจะไม่เกิดการทำซำ้ เลยกไ็ ด้ หากตอ้ งการทำซ้ำอยา่ งนอ้ ย 1 รอบ ไม่วา่
จะเลือกโครงสร้างแบบใดกใ็ ห้ผลลัพธท์ ีเ่ หมือนกนั

โครงสรา้ งการทำซ้ำแบบทดสอบกอ่ นทำท่ีมักพบในภาษาโปรแกรมคือโครงสร้าง while-do ซึ่ง
หมายถึงในขณะทเ่ี งื่อนไขยงั คงเป็นจรงิ อยู่ ใหท้ ำซ้ำไปเรอ่ื ยๆ ส่วนโครงสรา้ งการทำซ้ำแบบทดสอบหลงั

6.3. ตวั แจงนับ 85

iter F
T
งานที่ตอ้ งทำซำ้

NEXT iter

รปู ที่ 6.5: โครงสรา้ งการทำซำแบบใชต้ ัวแจงนบั

ทำมที ั้งแบบ do-while คือทำซำ้ ในขณะที่เงื่อนไขยังเปน็ จรงิ และ repeat-until ซง่ึ เป็นการทำ
ซ้ำจนกว่าเงอ่ื นไขเปน็ จรงิ จงึ เลกิ ทำ

ลองคดิ

เขียนผงั งานแบบทดสอบกอ่ นทำทท่ี ำงานเหมอื นกบั การทำงานแบบทดสอบหลงั ทำทกุ ประการ และลอง
เขยี นในทางกลับกันด้วย

6.3 ตวั แจงนับ

ตวั แจงนบั (iterator) เปน็ วตั ถหุ นง่ึ ในภาษาโปรแกรม ซงึ่ สามารถแจกแจงขอ้ มลู ออกมาตามลำดับได้ การ
แจกแจงคา่ โดยตวั แจงนบั นั้นเปน็ เพียงการสำเนาคา่ หรอื สรา้ งตวั ชไี้ ปยังขอ้ มลู ในลำดับเทา่ น้ัน โดยตัวแจง
นับจะคืนคา่ ข้อมูลถัดไปในลำดับออกมาให้ และใหผ้ ลลัพธเ์ ป็นเทจ็ เม่อื ไม่มีข้อมลู เหลอื ในตัวลำดับอกี แลว้
จึงมกั จะถกู ใช้ร่วมกบั โครงสร้างการทำซ้ำ โดยเปน็ การแจกแจงค่าหรือขอ้ มลู ทลี ะตัวเพ่อื ทำซ้ำ และยตุ กิ าร
ทำซำ้ เมื่อตวั แจงนับไม่สามารถเลอื่ นไปทีข่ ้อมลู ตวั ถัดไปได้อกี

โครงสรา้ งการทำซ้ำแบบใช้ตัวแจงนบั สามารถเขยี นเป็นผังงานไดด้ ังรูปท่ี 6.5

ตวั อยา่ ง 6.1 (การหาจำนวนท้ังหมดท่หี ารด้วย 3 และ 5 ลงตวั ในชว่ ง 1-1000). ลกั ษณะของจำนวนที่
หารด้วย 3 และ 5 ลงตัวคือ

• จำนวนที่หารดว้ ย 3 แล้วเหลอื เศษ 0 และ
• จำนวนท่หี ารดว้ ย 5 แลว้ เหลือเศษ 0

จำนวนทง้ั หมดตัง้ แต่ 1 ถงึ 1000 นน้ั เราสามารถใช้ตวั แจงนับในการแจกแจงทลี ะตัวได้ การหาจำนวน
ทั้งหมดทีห่ ารด้วย 3 และ 5 ลงตวั จึงเป็นการแจกแจงทกุ จำนวนในช่วงที่กำหนด แลว้ ทดสอบการหาร
ลงตวั สรุปงานทีต่ อ้ งทำซำ้ และเงือ่ นไขในการทำซ้ำไดด้ ังนี้

86 บทที่ 6. การทำงานแบบวนซำ้

data in [1,1000] F F

T

(data MOD 3 == 0)
AND

(data MOD 5 == 0)

T
PRINT data

NEXT data

รูปท่ี 6.6: สว่ นของผงั งานแสดงการหาจำนวนทห่ี ารดว้ ย 3 และ 5 ลงตวั ในชว่ ง [1,1000]

1. งานทีต่ อ้ งทำซำ้ คอื ทดสอบการหารดว้ ย 3 และ 5 ลงตวั □
2. เง่ือนไขในการทำซำ้ คือ ตวั แจงนบั ทม่ี คี ่าเรียงลำดับจาก 1 ถงึ 1000

เขยี นเป็นผังงานได้ดังรปู ท่ี 6.6

6.4 การออกแบบการทำงานแบบวนซ้ำ

งานบางชนิดนั้นเห็นได้ชดั ตั้งแต่เริ่มว่าการทำซ้ำคอื อะไร เช่น การเตมิ สารเคมจี นกวา่ จะเกิดปฏกิ ิรยิ า แต่
บางงานก็อาจจะไมต่ รงไปตรงมานัก เช่น การหาจุดสมดลุ การหมุนของคานในรปู ท่ี 6.1 ซ่ึงเมอื่ มองปัญหา
นเ้ี ป็นปัญหาการทดสอบจุดสมดุลและขยบั จดุ หมุนของคานไปเรอ่ื ยๆ จนกวา่ จะพบจดุ ที่สมดุล กจ็ ะเห็นว่า
ปญั หานเี้ ป็นการทำซ้ำรูปแบบหนึง่ เชน่ กนั

การออกแบบการทำงานแบบวนซ้ำตอ้ งกำหนดสิ่งท่ีตอ้ งทำซ้ำและเงอ่ื นไขในการทำซำ้ หรือเลกิ ทำ
ซ้ำออกมาใหไ้ ดก้ ่อน วธิ ีตรวจสอบว่างานทตี่ อ้ งทำซ้ำคืออะไร อาจจะลองทำดว้ ยมอื ไปสักสองสามรอบ
จนกวา่ จะเห็นรปู แบบทเ่ี กิดซ้ำขน้ึ จากนั้นจงึ ไปดูวา่ เขยี นเง่อื นไขกำกับอย่างไร จงึ จะทำใหร้ อบของการทำ
ซ้ำเป็นไปตามที่ตอ้ งการ

รปู แบบการทำซ้ำทีพ่ บบ่อยแบง่ ตามรูปแบบของเงื่อนไขในการทำซำ้ ไดด้ ังนี้

6.4. การออกแบบการทำงานแบบวนซำ้ 87
ลำดบั

เล่ือน ...

ตัวแจงนับ หมด

รปู ที่ 6.7: การใช้ตวั แจงนบั แจกแจงสมาชิกในลำดับ

1. นบั รอบ เง่ือนไขในการทำซ้ำคอื ทำยงั ไม่ครบจำนวนรอบทก่ี ำหนด วธิ กี ารนบั รอบจะใชต้ ัวแปรหนึ่ง
ตวั ในการนับ การนบั เปน็ ไดท้ งั้ แบบนบั กอ่ นเร่ิมรอบ โดยใช้ตัวนับเร่มิ ตน้ ท่ี 1 หรอื นับรอบที่ทำไป
แล้ว โดยตวั นับรอบจะเริม่ ตน้ ที่ 0 (ยังไมไ่ ดท้ ำ) และทำไปจนกว่าจะครบจำนวนรอบ ในแตล่ ะรอบ
เมอ่ื ทำงานครบรอบแล้ว จะมกี ารเพิม่ ค่าตวั นับไปทีละหน่งึ

2. แจกแจงสมาชกิ ในลำดับ เงอื่ นไขในการทำซ้ำคอื ยงั มีขอ้ มูลเหลอื อยู่ในลำดับ หากมีตวั แจงนบั ให้ก็
สามารถใชค้ ่าจากตวั แจงนบั เป็นเงื่อนไขได้ เชน่ ในรปู ที่ 6.7 แต่หากไมใ่ ชต้ วั แจงนบั การทำงานแบบ
แจกแจงสมาชกิ ในลำดบั จะเป็นการเล่ือนตวั ชข้ี องข้อมูลในลำดับไปทีละตัว เรม่ิ จากตัวแรกไปจนถงึ
ตวั สดุ ท้าย เง่ือนไขในการทำซ้ำจงึ เปน็ ตัวชย้ี งั ไมเ่ กินตวั สุดท้าย

3. แบบอ่นื ๆ เงอื่ นไขในการทำซ้ำไมม่ รี ูปแบบตายตวั

ตัวอย่าง 6.2 (การตง้ั เวลาถ่ายภาพแบบ timelapse ทุก 1 นาทเี ปน็ เวลา  24 ชั่วโมง). การถ่าย
ภาพแบบ timelapse คือการตง้ั เวลาถ่ายภาพทกุ ๆ ช่วงท่กี ำหนด แล้วนำภาพมาเรียงต่อกนั เป็นภาพ
เคลื่อนไหว

งานท่ตี อ้ งทำซ้ำคอื การกดชัตเตอร์ หรือสัง่ ถา่ ยภาพ สว่ นเงือ่ นไขในการทำซำ้ คอื ถ่ายรปู ไปจนครบ 24
ชว่ั โมง ซึ่งอาจแปลงเป็นจำนวนครั้งท่ตี ้องถ่ายภาพ แล้วนบั คร้ังแทนได้

• ต้องถา่ ยภาพท้งั หมด 60 × 24 = 1440 ครง้ั

ดังนน้ั จึงสามารถเขยี นเป็นผงั งาน โดยกำหนดรอบของการวนซ้ำท้ังหมด 1440 รอบ และการทำงาน
แต่ละรอบคือการสั่งถา่ ยภาพ

ใหต้ วั แปร count เปน็ ตวั นบั การเรมิ่ ต้นของรอบ จึงเร่ิมทำตงั้ แต่รอบที่ 1 ถึงรอบท่ี 1440 ในการนบั
รอบนัน้ นับเพม่ิ ทีละ 1 จงึ เขียนเปน็ ส่วนของผังงานไดด้ งั รูปท่ี 6.8



ตัวอย่าง 6.3 (การแสดงรายช่ือนักเรยี นทกุ คนในลำดับ). กำหนดใหม้ ีข้อมลู แบบลำดับ ซง่ึ มีตัวแจงนบั
สำหรับแจกแจงขอ้ มูลแต่ละตวั ในลำดบั ได้อยู่ การแสดงรายช่อื นักเรียนทุกคนในลำดบั จงึ เปน็ การสร้างตัว
แจงนับสำหรบั ลำดบั ขนึ้ มา แล้วแสดงข้อมูลแตล่ ะคา่ ทีต่ ัวแจงนับนั้นอ้างถึง ไปจนกว่าจะครบทุกข้อมูลใน
ลำดบั

88 บทที่ 6. การทำงานแบบวนซำ้

count = 1

count <= 1440 F
T

สัง่ ถา่ ยภาพ
count = count + 1
รปู ท่ี 6.8: ผงั งานแสดงการต้งั เวลาถ่ายรปู ทกุ 1 นาที เปน็ เวลา 24 ชั่วโมง

name in namelist F

T
PRINT name
NEXT name
รูปท่ี 6.9: ผงั งานการแสดงรายชือ่ นกั เรยี นทกุ คนในลำดบั
เม่ือแจงนบั ครบทุกตวั แลว้ ตวั แจงนับจะชีไ้ ปยงั ขอ้ มูลนอกลำดับ หรือสถานะขอ้ มูลหมด ซึ่งจะทำให้
ผลลัพธข์ องเงื่อนไขการเป็นสมาชิกในลำดับเปน็ เทจ็ และจบการทำซ้ำโดยอตั โนมัติ เขียนงานที่ต้องทำซ้ำ
และเงื่อนไขไดด้ งั น้ี
1. งานทต่ี อ้ งทำซ้ำ คือ แสดงขอ้ มูลชื่อ
2. เงอ่ื นไขในการทำซ้ำ คอื ตัวแจงนบั ยังช้ีไปทขี่ ้อมูลในลำดับ
กำหนดตวั แปร name เก็บชอ่ื ทไี่ ดจ้ ากตวั แจงนับ จะเขียนเปน็ ส่วนของผงั งานไดต้ ามรปู ท่ี 6.9 □
ตัวอยา่ ง 6.4 (การหาผู้ชนะเกมเปา่ ย้ิงฉุบ). การเล่นเปา่ ยิ้งฉุบมีผู้เล่น 2 คน แต่ละคนสามารถออก คอ้ น
หรือ กรรไกร หรอื กระดาษ ได้ การแพช้ นะเป็นดงั นี้

6.5. ภาษาโปรแกรมท่ีใช้ในการวนซำ้ 89
READ player1, player2

player1 == player2 F หาผูช้ นะ

T
READ player1, player2

รูปที่ 6.10: ผงั งานการหาผู้ชนะเกมเปา่ ย้งิ ฉบุ

• ค้อน ชนะ กรรไกร
• กรรไกร ชนะ กระดาษ
• กระดาษ ชนะ ค้อน

หากผเู้ ลน่ ท้ังสองฝ่ายออกเหมือนกันจะถอื วา่ เสมอ และเร่มิ ต้นเลน่ ไหม
การหาผูช้ นะของเกมเป่ายิง้ ฉบุ จึงเปน็ การเล่นวนซำ้ ไปเรื่อยๆ จนกวา่ จะมฝี ่ายใดฝ่ายหนงึ่ ชนะ สรปุ ได้

ดังนี้

1. งานทตี่ อ้ งทำซ้ำ คือ การออกของผูเ้ ล่นทง้ั สองฝา่ ย
2. เงอ่ื นไขในการทำซ้ำ คอื ผ้เู ล่นทงั้ สองฝา่ ยออกเหมือนกนั (เสมอ)

หลงั จากการวนซ้ำ จะหาผ้ชู นะระหวา่ งผ้เู ล่นทง้ั สองฝา่ ยได้ กำหนดตวั แปร player1 และ player2 เกบ็
ขอ้ มูลการออกของผเู้ ลน่ แตล่ ะฝ่าย เขียนสว่ นของผงั งานได้ดงั รูปท่ี 6.10



ข้อสังเกตหนึง่ จากตวั อยา่ ง 6.4 คือ ตัวแปรทีใ่ ชใ้ นการตรวจสอบค่า ต้องถกู กำหนดค่า หรอื มคี ่า กอ่ น
จะใช้ในการตรวจสอบ จงึ ตอ้ งมกี ารอา่ นข้อมลู คร้งั แรกนอกการวนซำ้ ก่อน

6.5 ภาษาโปรแกรมทีใ่ ช้ในการวนซ้ำ

6.5.1 โครงสร้าง while-do

โครงสรา้ ง while-do มลี กั ษณะเป็นการวนซำ้ แบบทดสอบก่อนทำ และทำซำ้ เมอื่ เงอ่ื นไขเป็นจริง เขียน
เปน็ รหสั เทียมได้ดงั รหัสคำส่ังที่ 6.1

90 บทท่ี 6. การทำงานแบบวนซำ้

1 WHILE cond
2 DO
3 job
4 ENDWHILE

รหสั คำส่งั ที่ 6.1: โครงสร้าง while-do

cond เป็นนิพจน์ทีใ่ หค้ า่ จรงิ หรือเท็จ สว่ น job แทนงานที่ตอ้ งทำ ซึ่งอาจมีมากกวา่ หนง่ึ งานกไ็ ด้ รหสั คำ
ส่งั ท่ี 6.1 เทยี บไดก้ บั ผงั งานในรูปท่ี 6.2(ก)

6.5.2 โครงสร้าง do-while

โครงสรา้ ง do-while มีลกั ษณะเปน็ การวนซำ้ แบบทดสอบหลงั ทำ และทำซำ้ เมื่อเง่ือนไขเป็นจริง เขยี น
เปน็ รหสั เทยี มไดด้ ังรหสั คำสง่ั ท่ี 6.2

1 DO
2 job
3 WHILE cond

รหัสคำสั่งท่ี 6.2: โครงสร้าง do-while

รหสั คำส่ังท่ี 6.2 นี้เทียบไดก้ ับผังงานในรูปที่ 6.4(ก) ส่วน cond และ job เป็นเงื่อนไขในการทำซำ้
และงานทต่ี ้องทำซำ้ เช่นเดียวกับในรหัสคำสั่งที่ 6.1

6.5.3 โครงสร้าง repeat-until

โครงสรา้ ง repeat-until มลี ักษณะเป็นการวนซ้ำแบบทดสอบหลงั ทำ และเลิกทำซำ้ เมอื่ เง่อื นไขเป็น
จรงิ เขียนเป็นคำส่ังได้ดังนี้

1 REPEAT
2 job
3 UNTIL cond

รหสั คำสงั่ ที่ 6.3: โครงสร้าง repeat-until

รหัสคำสัง่ ที่ 6.3 เทยี บไดก้ ับผงั งานในรูปท่ี 6.4(ข) ส่วน cond และ job เปน็ เงอ่ื นไขในการทำซำ้ และ
งานท่ตี ้องทำซ้ำ เช่นเดยี วกับในรหสั คำส่ังที่ 6.1 และ 6.2

6.5. ภาษาโปรแกรมท่ใี ชใ้ นการวนซำ้ 91

6.5.4 โครงสร้าง for

โครงสรา้ ง for มลี กั ษณะเปน็ การวนซ้ำแบบทดสอบก่อนทำ และทำซำ้ เมอ่ื เงอื่ นไขเปน็ จรงิ เช่นเดยี วกบั
โครงสร้าง while-do แตโ่ ครงสร้าง for แบ่งออกเป็นสองรูปแบบ ไดแ้ ก่

1. โครงสรา้ ง for แบบด้งั เดิม ซึ่งมีการกำหนดงานทตี่ ้องทำก่อนทำซำ้ เงือ่ นไข และงานที่ตอ้ งทำก่อน
ครบรอบการทำซำ้ เขียนเปน็ รหัสเทยี มได้ดังรหัสคำส่งั ที่ 6.4 และเขยี นส่วนของผงั งานได้ดังรปู ที่
6.11

2. โครงสร้าง for แบบใช้กบั ตวั แจงนบั มกั ใช้ในการทำซ้ำกับขอ้ มูลท้ังหมดในรายการ โดยอาศยั ตวั
แจงนับเป็นตวั แจกแจงข้อมูล เขยี นเป็นรหสั เทียมได้ดังรหัสคำส่งั ท่ี 6.5 และเขียนสว่ นของผงั งานได้
ดงั รปู ท่ี 6.12 ซึง่ เหมอื นกับผงั งานในรปู ท่ี 6.5

init

1 FOR (init; cond; inc) cond F
2 job
3 ENDFOR T
job
รหัสคำสงั่ ที่ 6.4: โครงสรา้ ง for แบบ
ด้งั เดมิ

inc
รูปที่ 6.11: โครงสรา้ ง for แบบดัง้ เดมิ

1 FOR item IN list item in list F
2 job T
3 ENDFOR job

รหัสคำสั่งที่ 6.5: โครงสร้าง for แบบใช้ NEXT item
ตวั แจงนับ รปู ที่ 6.12: โครงสรา้ ง for แบบใช้ตัวแจงนับ

92 บทที่ 6. การทำงานแบบวนซำ้

สำหรับแบบดง้ั เดมิ init คอื งานท่ตี อ้ งทำกอ่ นเรมิ่ ทำซ้ำ cond คือเง่ือนไขในการทำซำ้ เมอ่ื จริง และ
inc คืองานสดุ ท้ายทต่ี ้องทำในรอบของการทำซำ้ และ job คือคำสัง่ ตา่ งๆ ทตี่ อ้ งทำซำ้

ส่วนแบบตัวแจงนบั นัน้ list เปน็ รายการข้อมลู ซ่ึงมีตวั แจงนบั item เป็นตวั แปรซึง่ รบั ค่าจากตัวแจง
นับซึง่ จะช้ไี ปท่ีขอ้ มลู ในรายการทลี ะตัว เมอื่ เวยี นไปครบทกุ ขอ้ มลู แลว้ กจ็ บการทำซำ้ ได้

6.6 โครงสรา้ งการทำซำ้ ในภาษาซี

ภาษาซมี ีโครงสรา้ งการทำซำ้ 3 รปู แบบ ได้แก่

1. โครงสร้าง while-do
while (cond)
stmt

รหสั คำสง่ั ท่ี 6.6: โครงสร้าง while-do ในภาษาซี

โดยท่ี cond เป็นตัวแปรหรอื นพิ จนซ์ ึ่งมคี ่าเปน็ จำนวนเตม็ และทำซ้ำในกรณีท่ี cond ไมเ่ ป็น 0
ส่วน stmt คอื งานที่ตอ้ งทำซ้ำ ซงึ่ อยใู่ นรปู แบบคำส่งั โดดหรอื บลอ็ ก
2. โครงสรา้ ง do-while

do
{

stmts
} while (cond);

รหัสคำส่ังท่ี 6.7: โครงสรา้ ง do-while ในภาษาซี

โดยที่ cond เปน็ ตัวแปรหรอื นิพจนซ์ ึ่งมคี า่ เปน็ จำนวนเต็มเช่นเดยี วกบั while-do และยอ้ นกลบั
ไปทำซ้ำในกรณีท่ี cond ไม่เปน็ 0 เช่นกัน และ stmts คอื ชดุ ของคำส่ังท่ที ำซ้ำ จะมคี ำส่ังเดียว
หรือมากกวา่ กไ็ ด้
3. โครงสร้าง for แบบดัง้ เดมิ

for (init; cond; inc)
stmt

รหัสคำสั่งที่ 6.8: โครงสร้าง for ในภาษาซี

โดยที่ init คือชดุ ของคำสั่งท่ที ำก่อนเริ่มทำซ้ำ หากมมี ากกว่าหนงึ่ คำสงั่ ให้คั่นแตล่ ะคำสั่งดว้ ย
จลุ ภาค (,) cond คอื ตวั แปรหรือนพิ จนซ์ งึ่ มคี ่าเปน็ จำนวนเตม็ และทำซำ้ ในกรณที ี่ cond ไมเ่ ปน็
0 ส่วน inc คอื ชดุ ของคำสงั่ ทต่ี อ้ งทำกอ่ นจะจบรอบการวนซ้ำ และ stmt คอื งานทต่ี อ้ งทำซำ้ ซึง่
อยใู่ นรปู แบบคำสั่งโดดหรือบล็อก ในภาษาซไี มม่ ีโครงสร้าง for แบบใช้ตัวแจงจบั

6.6. โครงสร้างการทำซ้ำในภาษาซี 93

ลองคดิ

โครงสรา้ งการทำซำ้ ในภาษาซีนั้นเปน็ แบบทำซำ้ เม่อื เงอื่ นไขเปน็ จริงทง้ั หมด หากต้องการใชโ้ ครงสร้างการ
ทำซำ้ เม่อื เงือ่ นไขเป็นเทจ็ (เลกิ ทำเมอ่ื เง่อื นไขเปน็ จริง) จะเขยี นเป็นภาษาซีไดอ้ ยา่ งไร

แบบฝึกหัด

1. เมอื่ รบั จำนวนเข้าเป็นจำนวนเตม็ บวกหน่ึงจำนวน จงเขียนผังงานและโปรแกรมภาษาซีเพอื่ หาวา่
จำนวนทร่ี บั เขา้ มาน้ีเปน็ จำนวนเฉพาะหรอื ไม่

จำนวนเฉพาะคอื จำนวนทีม่ เี ฉพาะ 1 และตัวมันเองเท่านน้ั ที่หารลงตวั

2. จงเขียนผังงานและโปรแกรมภาษาซใี หผ้ ใู้ ชป้ อ้ นจำนวนบรรทดั ทต่ี อ้ งการ แล้วพิมพอ์ ักขระ * ออก
มาโดยมลี ักษณะดงั นี้

6
*
**
***
****
*****
******

บรรทดั ที่ 1 มี * 1 ตวั บรรทดั ท่ี 2 มี * 2 ตัว …
(บรรทดั ท่ี i จะมี * i ตวั โดยท่ี i เป็นจำนวนเตม็ บวก)
3. เมอ่ื ให้ผใู้ ชป้ อ้ นจำนวนบรรทัดเข้ามา จงเขียนโปรแกรมภาษาซีเพอ่ื พมิ พ์ * ใหเ้ ป็นรูปสามเหล่ียม
หน้าจว่ั ซงึ่ มลี กั ษณะดังนี้

5
*

***
*****
*******
*********

4. ระบบนับถอยหลงั จะรับข้อมูลเป็นจำนวนเตม็ บวกหน่ึงจำนวน แล้วนับถอยหลงั โดยแสดงคา่ ตง้ั แต่
จำนวนท่รี ับเข้า ลดลงทลี ะหน่ึง จนถงึ 1 แลว้ จบการทำงาน จงเขยี นผงั งานและโปรแกรมภาษาซขี อง
ระบบนบั ถอยหลังนี้

5. ในการแขง่ ขนั ยมิ นาสตกิ จะมีกรรมการทงั้ หมด 6 คน แต่ละคนให้คะแนนได้ต้ังแต่ 0.0 -
10.0 การคิดคะแนนของผเู้ ขา้ แข่งขนั จะตัดคะแนนสงู สุดและต่ำสุดออก แลว้ หารเฉล่ียคะแนนของ

94 บทที่ 6. การทำงานแบบวนซ้ำ

กรรมการท้งั 4 คนท่ีเหลอื หากมีผ้เู ขา้ แข่งขนั ทง้ั หมด 10 คน จงเขียนโปรแกรมเพ่ือหาผชู้ นะเมอื่
ผู้ดแู ลการแขง่ ขนั กรอกคะแนนจากกรรมการทั้ง 6 คนของผู้เขา้ แข่งขนั แต่ละคนใหร้ ะบบ
6. เกมทายจำนวนใชผ้ เู้ ลน่ สองคน ผ้เู ล่นคนแรกจะปอ้ นข้อมลู ตวั เลขในใจของตนเองให้กบั ระบบ จาก
นนั้ ผเู้ ลน่ คนที่สองจะทายจำนวนที่ผเู้ ลน่ คนแรกป้อนให้ระบบ โดยระบบจะนับจำนวนคร้งั ทท่ี าย
จนกวา่ จะทายถกู หากทายไมถ่ ูก ระบบจะช่วยบอกใบ้ด้วยการบอกวา่ คา่ ทที่ ายนน้ั มากกวา่ หรอื
น้อยกว่า คา่ ทีผ่ ้คู นแรกกำหนดไว้ หากทายถกู ระบบจะแสดงจำนวนครงั้ ทที่ ายแล้วจบการทำงาน
จงเขียนผังงานและโปรแกรมภาษาซีของระบบเกมทายจำนวนนี้

บทท่ี 7

ตัวแปรแถวลำดบั

วัตถุประสงคก์ ารเรียนรู้

อธิบายการเกบ็ ขอ้ มูลแบบแถวลำดบั การเก็บข้อมลู สายอกั ขระ และการใช้ตวั แปรแถวลำดับ

1. กำหนดค่าให้ตวั แปรแถวลำดับ และเรยี กใชค้ ่าในตัวแปรแถวลำดับได้
2. ประกาศตวั แปรแบบแถวลำดบั ได้
3. อธบิ ายการเขา้ ถงึ อกั ขระตา่ งๆ ในตวั แปรแบบสายอกั ขระได้
4. อธิบายโครงสร้างการเกบ็ ข้อมูลแบบแถวลำดับในหนว่ ยความจำ
5. ใช้แถวลำดับขนาดมากกว่าหน่งึ มิติได้

ใช้เวลารวม 6 คาบ

7.1 การเขา้ ถึงและการเรยี กใช้ตวั แปรแถวลำดบั

ตวั แปรโดยปกตทิ ัว่ ไปน้ัน จะเกบ็ ค่าไดห้ นงึ่ ค่าต่อตัวแปรหนึ่งตัว แตห่ ากขอ้ มลู มีลักษณะเปน็ ชุดซึง่ มีหลาย
คา่ เราจำเป็นต้องประกาศตวั แปรเทา่ กับจำนวนขอ้ มูลทมี่ ี ซงึ่ ไมส่ ะดวกในการจดั การข้อมลู ซ่งึ เปน็ ชดุ ใน
ลกั ษณะน้ี จงึ มตี ัวแปรชนิดแถวลำดบั (array) ขึ้นมาชว่ ยอำนวยความสะดวกในการจัดการตวั แปรใหเ้ ป็น
ชดุ ๆ

ข้อมลู แตล่ ะตวั ในตวั แปรชนดิ แถวลำดับจะมลี ำดับกำกบั เรยี กวา่ ดชั นี (index) การเขา้ ถึงขอ้ มูลใน
แถวลำดบั ทำได้ดว้ ยการอ้างองิ ช่ือตวั แปรประกอบกับเลขดชั นีของข้อมลู นั้น เขยี นได้ดังรหัสคำสัง่ ท่ี 7.1

varname[index]
รหัสคำสัง่ ที่ 7.1: การอา้ งถงึ ตวั แปรแถวลำดบั

โดยท่ี varname คือชอื่ ของตวั แปร และ index เปน็ จำนวนเตม็ ซง่ึ เปน็ เลขดชั นขี องข้อมูล

96 บทที่ 7. ตวั แปรแถวลำดับ

0 ชอ่ ง 1 ชอ่ ง 1 ชอ่ ง 1 ช่อง
1 ช่อง

d[0] d[1] d[2] d[3] d[4]

d 1 10 2 4 3

รูปท่ี 7.1: เลขดชั นขี องตัวแปรแถวลำดบั

ภาษาโปรแกรมสว่ นมาก เช่น ซี จาวา ไพธอน จะมดี ัชนเี ร่มิ ตน้ ท่ี 0 หมายถึง ระยะห่างศูนย์
ชอ่ ง จากชอ่ งแรกทีเ่ กบ็ ขอ้ มูล แต่บางภาษาโปรแกรม เชน่ Matlab ก็ให้มีดชั นีเริม่ ต้นท่ี 1 ซงึ่ หมายถงึ
ช่องที่หนง่ึ กอ่ นจะอ้างถงึ ตวั แปรแถวลำดับจึงควรตรวจสอบขอ้ กำหนดของดชั นใี นแต่ละภาษาเสยี กอ่ น ใน
เอกสารฉบับนี้จะใหด้ ัชนีเรม่ิ ต้นทศี่ นู ย์

จากรปู ท่ี 7.1 ตวั แปร d เปน็ ตัวแปรชนิดแถวลำดับขนาด 5 ช่อง โดยมีดัชนีเร่ิมต้นที่ 0 ขอ้ มลู ในช่อง
ทีห่ น่ึง (ดชั นเี ป็น 0) มีค่า 1 อา้ งองิ ถึงโดยชอ่ื ตวั แปรและดัชนไี ดเ้ ปน็ d[0]

การกำหนดคา่ ให้แตล่ ะช่องในตวั แปรแถวลำดบั ใช้การอ้างอิงถงึ ชอ่ งนั้นเชน่ เดียวกบั การเข้าถึงขอ้ มูล
การกำหนดคา่ ใช้หลักการเดยี วกบั การกำหนดคา่ ใหต้ วั แปรท่วั ไป คา่ ทก่ี ำหนดไดเ้ ปน็ ได้ทั้งคา่ คงที่ นิพจน์
และตัวแปร เชน่ d[0] หมายถึงชอ่ งท่ีหนงึ่ หากกำหนดค่าด้วยคำส่งั d[0] = d[1]+d[2] คา่ ในชอ่ งทีห่ นง่ึ ก็
จะเปล่ยี นเปน็ 12 ซ่ึงเกิดจาก 10+2 เป็นต้น

ชนิดของขอ้ มลู แต่ละตวั ในแถวลำดบั ขน้ึ กับขอ้ กำหนดของภาษาโปรแกรม บางภาษา เชน่ ภาษาซี จะ
กำหนดให้ขอ้ มลู ทกุ ตวั ในแถวลำดับต้องเปน็ ชนดิ เดยี วกัน แตบ่ างภาษา เชน่ ไพธอน กไ็ ม่มขี อ้ กำหนดเร่อื ง
นี้1

ลองคิด

เลขดชั นขี องแถวลำดบั สามารถเป็นจำนวนจรงิ ได้หรอื ไม่

7.2 แถวลำดับกับการวนซำ้

เน่อื งจากการทำงานกับตัวแปรแถวลำดับน้นั มกั ตอ้ งไล่เรียงค่าตามช่องต่างๆ ในแถวลำดบั การทำงานกับ
แถวลำดบั จึงมกั มาคู่กบั การวนซ้ำแบบทดสอบก่อนทำแบบโครงสร้าง for โดยเปลยี่ นค่าดัชนไี ปในแตล่ ะ
รอบของการวนซำ้ หรอื การใชต้ วั แจงนับเพ่อื เข้าถงึ ขอ้ มูลแต่ละตัวในแถวลำดบั

โครงสร้าง for แบบดัง้ เดิมนั้นออกแบบมาใหม้ ีการตั้งคา่ เรม่ิ ตน้ ซ่ึงใชเ้ ป็นการตงั้ ค่าเร่มิ ต้นใหต้ วั แปร
ซ่ึงเก็บค่าดชั นี และงานสดุ ท้ายท่ีต้องทำกอ่ นจบรอบการทำซ้ำ ให้เปน็ การเพ่มิ คา่ ในตวั แปรดัชนเี พอ่ื ใหช้ ้ี

1ข้อมลู ชนิดแถวลำดับในไพธอน คอื List แต่มลี กั ษณะเปน็ แถวลำดบั (array) ซึง่ สามารถเข้าถึงตำแหน่งใดในลำดบั ก็ได้
ดว้ ยการกำหนดดัชนี ข้อมูลชนดิ List ของไพธอนไม่ใชข่ อ้ มลู ชนดิ รายการ (list) ซึ่งเข้าถึงไดต้ ามลำดบั จากต้นรายการ แต่ไม่
สามารถกำหนดดชั นีเพื่อเข้าถงึ ตำแหนง่ ทตี่ อ้ งการไดโ้ ดยตรง

7.3. แถวลำดบั สองมติ ิ 97

ตารางที่ 7.1: รายการตัวแปรสำหรับการแปลงค่าใหอ้ ย่ใู นช่วง [0,1]

ชอ่ื ตัวแปร ชนิด คำอธบิ าย
x float[100] ขอ้ มลู เข้า
z float[100] ขอ้ มูลทแี่ ปลงเปน็ บรรทดั ฐานแล้ว
min float ค่าตำ่ สดุ
max float ค่าสูงสุด

ไปทช่ี อ่ งถดั ไป สว่ นโครงสร้าง for แบบใช้ตัวแจงนับน้นั จะเป็นการแจกแจงสมาชกิ แตล่ ะตวั ในแถวลำดับ
ทลี ะตวั

ตวั อย่าง 7.1 (การแปลงคา่ ใหอ้ ยู่ใช้ช่วง 0-1 (normalization)). การนำขอ้ มูลต่างๆ ไปใชว้ เิ คราะหผ์ ล
นั้น เราควรปรบั ค่าของขอ้ มลู ในอย่ใู นช่วงที่เขา้ ใจงา่ ย เช่น คา่ ตำ่ สดุ เปน็ 0 และค่าสงู สุดเป็น 1 วธิ ีแปลง
ข้อมูลเขา้ อยา่ งงา่ ยคอื ใช้การแปลงเชิงเส้นดังสมการ (7.1)

= − (7.1)


เมอื่ คอื ข้อมลู เข้าแตล่ ะตัว และ คือคา่ ตำ่ สุดและคา่ สงู สดุ จากข้อมลู เขา้ ทงั้ หมด จะได้ เปน็
ขอ้ มลู ท่ปี รับให้อยู่ในชว่ ง [0,1] แลว้

เมือ่ รับข้อมูลจำนวนจริงเข้ามา 100 คา่ เกบ็ ลงในตวั แปรแถวลำดับ จะเขียนผงั งานเพอื่ แปลงแถว
ลำดบั ของขอ้ มูลเข้านใี้ ห้เป็นแถวลำดบั ของค่าท่ีปรบั ช่วงแลว้ ไดด้ ังรปู ท่ี 7.2

จากสมการ (7.1) การแปลงคา่ ให้อยใู่ นช่วง [0,1] นนั้ ต้องหาค่าต่ำสุด ( ) และคา่ ต่ำสุด ( ) กอ่ น
จากนน้ั จงึ คำนวณค่า สำหรับข้อมลู แต่ละตัวในแถวลำดับ จงึ แบง่ งานออกเปน็ 2 สว่ น ดังน้ี

1. หาค่าต่ำสดุ และค่าสูงสดุ ซ่งึ ใช้การวนซำ้ ใหค้ รบจำนวนขอ้ มลู ท้ังหมด 1 รอบ
2. แปลงข้อมูลใหอ้ ยู่ในช่วง [0,1] โดยใชส้ มการ 7.1 และเก็บลงแถวลำดบั ใหม่ ซ่งึ ใชก้ ารวนซำ้ คำนวณ

ค่าข้อมลู ทลี ะจำนวนจนครบขอ้ มูลท้งั หมด 1 รอบ

รายการตวั แปรที่ตอ้ งใช้เป็นดังตารางท่ี 7.1 และเขยี นผังงานแต่ละสว่ นไดด้ งั รูปท่ี 7.2(ก) และ 7.2(ข)

ตามลำดบั □

7.3 แถวลำดับสองมิติ

ตวั แปรแถวลำดับนน้ั เปน็ ตวั ชไี้ ปยังข้อมูล หรอื อีกนยั หนึ่งคอื เปน็ ตวั แปรซ่งึ เก็บทอ่ี ยู่ของข้อมลู โดยท่ขี อ้ มูล
จะมีชนิดใดๆ กไ็ ดต้ ามแตจ่ ะประกาศตัวแปรไว้ สมมติให้มตี ารางขนาด แถว แถวละ ตวั เราสามารถ
จองพ้นื ที่สำหรบั ตวั แปรนี้เปน็ ให้เก็บข้อมูล ช่อง แต่ละช่องเปน็ ทีส่ ำหรบั เกบ็ แถวลำดบั ขนาด ตัวได้

98 บทท่ี 7. ตวั แปรแถวลำดบั

READ x[0]
min = x[0], max = x[0]

index = 1

index < 100 F index = 0
T
index < 100 F
READ x[index]
T
x[index] < min F
T z[index] = x[index]- min
max-min
min = x[index]
index = index + 1
x[index] > max F
T (ข) การแปลงข้อมูลให้อยูใ่ นช่วง [0,1]

max = x[index]

index = index + 1

(ก) การหาค่าสงู สดุ และคา่ ต่ำสุด

รปู ท่ี 7.2: สว่ นของผังงานสำหรับการแปลงขอ้ มูลให้อยู่ในช่วง [0,1]

7.4. ตวั แปรแถวลำดับในภาษาซี 99

ตารางที่ 7.2: การอา้ งถงึ แถวลำดบั สองมติ ิ
[0] [1] [2]

แถว 0 1 2 3
แถว 1 4 5 6

จะเห็นว่าการจองพืน้ ท่นี ี้เป็นการสรา้ งแถวลำดบั ซ้อนแถวลำดบั เรยี กว่า แถวลำดบั สองมิติ การเขา้
ถึงขอ้ มูลในแถวลำดบั สองมิตทิ ำได้โดยเลอื กแถวลำดับท่ตี ้องการกอ่ นดว้ ยการระบดุ ัชนีของแถวลำดบั นน้ั
จากนัน้ จงึ ระบุตำแหน่งของขอ้ มลู ด้วยดชั นีในแถวลำดบั น้ันอกี ทหี นง่ึ

ตัวอย่าง 7.2 (แถวลำดบั สองมิติ). ตาราง ช่ือ table ขนาด 2 × 3 ซง่ึ มีขอ้ มลู ดังตารางท่ี 7.2
การเขา้ ถงึ ขอ้ มลู ต่างๆ จะไดผ้ ลลพั ธ์ดังน้ี

• table[1][0] เกบ็ คา่ 4 (ดชั นแี ถว 1 ดชั นขี ้อมลู 0)
• table[0][1] เก็บคา่ 2 (ดชั นแี ถว 0 ดชั นขี ้อมลู 1)
• table[1] หมายถึงเลขทีอ่ ยขู่ องแถวท่ีสอง ซึง่ เกบ็ ค่า [4,5,6]
• table หมายถงึ เลขทีอ่ ยขู่ องตารางนี้



ลองคิด

เราสามารถจองพ้ืนทส่ี ำหรับตัวแปรแถวลำดบั มากกว่าสองมติ ไิ ด้หรอื ไม่ หากได้ วิธีการอา้ งถึงข้อมลู ควร
เป็นอยา่ งไร

7.4 ตัวแปรแถวลำดับในภาษาซี

ภาษาซกี ำหนดให้ข้อมลู ทกุ ตัวในแถวลำดบั ตอ้ งเปน็ ชนดิ เดียวกัน การประกาศตวั แปรแถวลำดบั จึงใชก้ าร
ระบชุ นดิ ของข้อมูลในแถวลำดบั และขนาดของแถวลำดับ ขนาดของแถวลำดับคือจำนวนขอ้ มลู ทีอ่ ย่ใู น
แถวลำดับ

int data[10];
loat score[30];
char name[40];

รหสั คำส่งั ที่ 7.2: ตวั อยา่ งการประกาศตัวแปรแถวลำดบั ในภาษาซี

การประการตวั แปรแถวลำดบั แบง่ ออกเป็น 2 แบบ แยกตามวธิ กี ำหนดขนาดของแถวลำดบั ได้แก่
แบบกำหนดขนาดล่วงหนา้ ด้วยคา่ คงที่ และแบบระบุขนาดเมื่อทำงาน การประกาศตวั แปรแถวลำดบั แบบ

100 บทท่ี 7. ตัวแปรแถวลำดบั

data[0]
*data

data

[0] [1] [2] [3]

รปู ที่ 7.3: แถวลำดบั กบั ตัวแปรชนดิ ตัวช้ี

กำหนดขนาดลว่ งหน้าจะระบชุ นดิ ของข้อมลู ในแถวลำดับ และจำนวนชอ่ งทีต่ ้องการเป็นค่าคงท่ี จากรหัส
คำสั่งท่ี 7.2 ตวั แปร data เปน็ แถวลำดบั ของจำนวนเตม็ ขนาด 10 ช่อง ตวั แปร score เปน็ แถวลำดบั
ของจำนวนจริงขนาด 30 ช่อง และตวั แปร name เปน็ แถวลำดบั ของอักขระขนาด 40 ช่อง

การประกาศตวั แปรในรูปแบบน้เี รียกว่าเปน็ การจองพื้นทีส่ ำหรับตวั แปร และกำหนดขนาดคงทต่ี ง้ั แต่
ตอนคอมไพล์ (static allocation) เน่ืองจากจำนวนชอ่ งเป็นค่าคงท่ใี นรหัสตน้ ฉบับ คอมไพเลอรจ์ ะรู้
ขนาดของหนว่ ยความจำที่ตอ้ งใช้ และกำหนดให้ระบบปฏบิ ัตกิ ารจองพนื้ ที่ได้ตามขนาดที่ต้องการ เมอื่ ใช้
งานโปรแกรมเสรจ็ เคร่อื งจะสามารถคืนพ้ืนท่ใี นหน่วยความจำใหร้ ะบบปฏิบัตกิ ารได้โดยอัตโนมตั ิ

ในบางครัง้ เราอาจไม่รูข้ นาดของแถวลำดับในขณะเขยี นรหสั ต้นฉบบั การประกาศตวั แปรเมอื่ ไมร่ ู้
ขนาดลว่ งหน้าจึงเป็นการจองพนื้ ท่สี ำหรบั ตัวชขี้ องแถวลำดบั แลว้ ใหห้ น่วยความจำจองพ้นื ทีเ่ พม่ิ เติมเม่อื
ทำงาน (dynamic allocation) ทำผา่ นคำส่ัง malloc, calloc

การจองพื้นทีใ่ นรูปแบบนนี้ ัน้ ระบบปฏิบัตกิ ารไม่สามารถรูข้ นาดพื้นที่ทตี่ ้องใชใ้ นหน่วยความจำไดล้ ว่ ง
หน้า ทำให้เมือ่ ใช้งานเสรจ็ แลว้ ผู้เขียนโปรแกรมจำเป็นต้องระบคุ ำสง่ั สำหรับคนื พืน้ ที่ในหน่วยความจำให้
ระบบปฏบิ ัติการเอง การคนื พ้นื ท่ใี ชค้ ำส่ัง free

ในการเกบ็ ข้อมูลชนดิ แถวลำดับ เครือ่ งจะจองพนื้ ท่ตี ดิ กันในหนว่ ยความจำสำหรับแถวลำดับ และอา้ ง
ถึงพืน้ ทีท่ ้งั บรเิ วณดว้ ยตัวแปรชนิดตัวชี้ โดยข้อมลู ในตวั แปรชนิดตวั ช้จี ะเปน็ ท่อี ยขู่ องขอ้ มลู ตำแหน่งแรก
ในแถวลำดับ ขอ้ มลู ตัวทีส่ องจะอยู่ติดกับข้อมลู ตัวแรก ซง่ึ เปน็ ท่ีอยใู่ นตวั ช้บี วกกับขนาดของขอ้ มลู ตัวแรก
นั้น

เช่น ในรปู ท่ี 7.3 แถวลำดบั ของจำนวนเตม็ ขนาด 4 ชอ่ ง อ้างถงึ ดว้ ยตวั แปรช่อื data และจำนวนเต็ม
1 จำนวนใช้พ้นื ที่ 4 ไบต์ ข้อมลู ทอี่ ยู่ในตัวแปร data จะเป็นทีอ่ ยขู่ องแถวลำดบั และเปน็ ท่ีอยเู่ ดยี วกับ
ขอ้ มูลตัวแรก หากใหก้ ารอ้างถึงขอ้ มูลดว้ ยตัวชใี้ ชส้ ญั ลกั ษณ์ * การอ้างถงึ *data จะหมายถงึ ขอ้ มูลตวั
แรก ซง่ึ เทยี บเท่ากับ data[0] สำหรบั ข้อมูลตัวถัดไป จะอยู่ ณ เลขทอี่ ยู่ data+4 เนอ่ื งจากจำนวนเตม็
หนง่ึ ตวั มีขนาด 4 ไบต์ จึงอา้ งถึงผา่ นตัวแปรชนดิ ตัวช้ีได้เปน็ *(data+4) หรือ data[1] ดังนั้น การ
ใช้เลขดัชนชี ่วย จะชว่ ยใหอ้ า้ งถึงข้อมูลในแถวลำดบั ไดโ้ ดยไม่จำเป็นต้องบวกลบเลขที่อยู่เอง ช่วยอำนวย
ความสะดวกให้ผเู้ ขียนโปรแกรม

หากต้องการเพิ่มขนาดของแถวลำดบั ตอ้ งจองพืน้ ทใี่ หม่ท่มี ขี นาดตามต้องการ แล้วสำเนาค่าในแถว
ลำดับเดมิ มายังทีใ่ หม่ ระบบปฏบิ ตั ิการอาจไม่สามารถใชห้ น่วยความจำในตำแหนง่ เดิมไดเ้ นอ่ื งจากพ้ืนท่ี
ขา้ งเคยี งบริเวณเดิมอาจะมขี อ้ มลู อนื่ อยู่

7.5. ตวั แปรชนิดสายอักขระในภาษาซี 101

ลองคดิ

หากใสด่ ชั นเี ป็นลบ หรือมีค่าเกินกว่าจำนวนชอ่ งของขอ้ มลู จะเกิดผลอย่างไร

7.5 ตวั แปรชนิดสายอกั ขระในภาษาซี

7.5.1 การเกบ็ ข้อมลู แบบสายอักขระ

ภาษาซีไมม่ ีชนิดขอ้ มูลโดยตรงสำหรับข้อความ การแทนข้อความจึงใช้ตวั แปรแบบแถวลำดับของอักขระ
แทน และเข้าถึงข้อมลู อกั ขระแต่ละตัวไดใ้ นลกั ษณะเดยี วกบั ตวั แปรแถวลำดับอ่ืนๆ แต่เนอื่ งจากข้อมลู ท่ี
เปน็ ข้อความนั้นมีความยาวไมค่ งที่ เชน่ ชอ่ื คน อาจยาว 3-10 ตวั อักษร การจองพืน้ ทีใ่ ห้พอดกี บั ข้อมลู
เข้านัน้ เปน็ ไปได้ยาก สว่ นการแสดงผลข้อความนน้ั เครอื่ งจะวนซ้ำแสดงผลอักขระทลี ะตำแหนง่ ไปจนหมด
ข้อความ จงึ จำเป็นตอ้ งมีอกั ขระพเิ ศษเพ่อื บ่งบอกขอบเขตของสายอักขระ ในภาษาซีใชอ้ กั ขระวา่ ง (null
character, ‘\0’ หรือคา่ 0) แทนตัวระบจุ ุดสน้ิ สุดของขอ้ ความ

การจองพื้นทสี่ ำหรับสายอักขระในภาษาซี จึงเป็นการจองพน้ื ทส่ี ำหรับตวั แปรชนดิ แถวลำดบั ของ
อกั ขระ โดยกำหนดจำนวนช่องเป็นจำนวนอักขระที่ตอ้ งการ บวกหนึ่งช่องสำหรบั อกั ขระระบุจุดสนิ้ สดุ

ตัวอย่าง 7.3 (การแปลงขอ้ ความทั้งหมดใหเ้ ปน็ ตัวพมิ พ์ใหญ)่ . บางครั้งเราตอ้ งการบนั ทกึ ข้อมูลเป็นตัว
พมิ พใ์ หญ่ทัง้ หมด เช่น ชื่อบทความตีพมิ พ์ แต่ขอ้ มลู ทีป่ อ้ นโดยผูใ้ ชอ้ าจเปน็ ทง้ั ตัวพิมพใ์ หญแ่ ละตัวพมิ พ์
เล็กผสมกัน การบังคบั ใหผ้ ใู้ ชป้ ้อนขอ้ มูลเขา้ เปน็ ตัวพมิ พใ์ หญท่ ัง้ หมดนน้ั อาจสรา้ งความลำบากใหก้ บั ผใู้ ช้
ผทู้ ำระบบรบั ข้อมูลจงึ ทำฟังก์ชนั สำหรบั แปลงขอ้ ความให้เปน็ ตวั พิมพ์ใหญ่ทงั้ หมดแทน

การเกบ็ ขอ้ มูลอักขระตา่ งๆ นั้นเกบ็ เปน็ รหัสอกั ขระ เช่น รหสั แอสกใี นตารางท่ี 3.2 (หนา้ 47) ซ่ึง
เสมอื นเปน็ จำนวนเต็ม หากอกั ขระนั้นเป็นจำนวนในช่วง [97-122] (0x61 - 0x7A) แสดงว่าเปน็ ตัวพมิ พ์
เล็ก และจะเหน็ ไดว้ า่ ตัวอกั ษร a-z ตัวพมิ พเ์ ล็กนั้นอยเู่ รยี งกัน สว่ นตวั อักษร A-Z ตัวพิมพใ์ หญก่ อ็ ยเู่ รยี ง
กนั เชน่ กัน ระยะหา่ งระหว่างอกั ขระ a-A b-B ... z-Z น้นั คงท่เี ท่ากับ 32 การแปลงอกั ขระตวั พิมพ์เลก็
เป็นตวั พิมพ์ใหญจ่ งึ ทำไดโ้ ดยตรวจสอบวา่ อกั ขระน้ันมรี หัสอยูใ่ นชว่ ง [97-122] หรอื ไม่ หากใช่ให้นำรหัส
นั้นลบด้วย 32 แล้วเก็บลงไปทีเ่ ดิม ทำซำ้ กับทุกอักขระในขอ้ ความ ก็จะเปน็ การแปลงสายอกั ขระท่มี ีตัว
พมิ พ์เลก็ ใหก้ ลายเป็นตวั พมิ พ์ใหญ่ท้ังหมด เขียนเป็นส่วนของโปรแกรมภาษาซไี ด้ดังรหสั คำสั่งที่ 7.3

1 char input[100];
2 scanf(”%s”, input);
3 int i;
4 for (i = 0; input[i] != ’\0’; i++)
5 if (input[i] >= 97 && input[i] <= 122)
6 input[i] -= 32;
7 printf(”%s\n”, input);

รหัสคำสัง่ ท่ี 7.3: การแปลงข้อความทงั้ หมดให้เปน็ ตัวพิมพใ์ หญ่

102 บทท่ี 7. ตวั แปรแถวลำดบั

input เปน็ ตัวแปรชนิดแถวลำดบั ของอกั ขระขนาด 100 ชอ่ ง สามารถเกบ็ ข้อความไดย้ าว 99
อกั ขระ และเผ่อื ทส่ี ำหรบั อกั ขระพเิ ศษปดิ ทา้ ยสายอักขระ 1 ช่อง เงอื่ นไขในการวนซ้ำคอื อักขระ ณ ดชั นนี ัน้
ยังไม่เปน็ อักขระระบุจดุ ส้ินสุด สิง่ ที่ตอ้ งทำซ้ำประกอบด้วยการแปลงอักขระนน้ั ให้เปน็ ตวั พมิ พใ์ หญ่ และ
การเพม่ิ ดัชนไี ปอกี หน่ึง ซ่ึงหากใชโ้ ครงสร้าง for แบบดงั้ เดิม การเพ่ิมดัชนไี ปอกี หนึ่งจะเปน็ งานสุดทา้ ย
ทีต่ ้องทำซ้ำก่อนเรมิ่ รอบใหม่



7.5.2 ฟังกช์ นั ต่างๆ เกีย่ วกบั สายอักขระในภาษาซี

เน่ืองจากข้อมลู ชนดิ ขอ้ ความนั้นมกี ารใชบ้ ่อยคร้ัง และโดยมากจะเปน็ การอ่านเขยี นท้งั สายอกั ขระ ไม่
จำเพาะเจาะจงทอ่ี กั ขระใดอกั ขระหนง่ึ การเขียนโปรแกรมด้วยการวนซำ้ สำหรบั อา่ นเขยี นทุกคร้ังไปน้นั
จึงทำให้รหัสต้นฉบับหรือผงั งานยาวกวา่ ทคี่ วรจะเปน็ จงึ มีการสร้างฟงั กช์ นั เฉพาะสำหรบั การทำงานกับ
ขอ้ ความขนึ้ เกบ็ อยใู่ นคลังโปรแกรม string การเรยี กใช้ฟงั กช์ ันตา่ งๆ ในคลงั โปรแกรมน้ที ำไดโ้ ดยระบุ
#include <string.h> ในตวั ชแ้ี นะ (directive) ของโปรแกรมตอนต้นแฟม้ รหสั ต้นฉบบั เพอื่ ให้
คอมไพเลอร์เรยี กใช้ฟังก์ชันเหลา่ นี้ไดถ้ กู ต้อง มฟี งั กช์ ันทใ่ี ช้งานบ่อยครงั้ เช่น

1. strlen การหาความยาวของข้อความในตัวแปรสายอกั ขระ เคร่ืองจะหาคา่ ดัชนขี องอักขระระบุ
จดุ สน้ิ สดุ แล้วคืนคา่ ดชั นน้ี ้นั ซงึ่ ก็จะเป็นความยาวของสายอกั ขระด้วย

2. strcpy การคัดลอกข้อความในตัวแปรสายอกั ขระ ต้องจองพืน้ ทีส่ ำหรบั ตัวแปรปลายทางกอ่ น
เรียกใชฟ้ ังก็ชนั เม่ือเรียกใช้ ฟังกช์ นั น้จี ะสำเนาค่าอักขระจากตัวแปรตน้ ทางไปยังตัวแปรปลายทาง
ทลี ะตำแหน่งจากดัชนเี รม่ิ ตน้ ไปยงั ตำแหน่งสุดท้ายของข้อความ และคนื คา่ เป็นตัวช้ไี ปยงั อกั ขระ
ระบจุ ดุ สิ้นสุดของตัวแปรปลายทาง

3. strcat การคัดลอกขอ้ ความจากสายอักขระต้นทางไปตอ่ ทา้ ยสายอักขระปลายทาง ต้องจอง
พน้ื ท่สี ำหรบั ตัวแปรปลายทางไวก้ ่อนเชน่ เดียวกัน ฟงั กช์ นั จะสำเนาอกั ขระแรกของตวั แปรตน้ ทาง
ไปยังตำแหนง่ เดมิ ของอกั ขระปดิ ทา้ ยขอ้ ความในตวั แปรปลายทาง และสำเนาทีละตำแหน่งไป
จนถงึ ตำแหน่งสดุ ทา้ ยของขอ้ ความตน้ ทาง จากน้ันคนื คา่ เป็นตวั ชไ้ี ปยังอกั ขระระบจุ ุดสนิ้ สุดของ
ตวั แปรปลายทางหลงั สำเนาข้อมูลทัง้ หมด

4. strcmp การเปรียบเทียบข้อความในตัวแปรสายอักขระ ฟงั กช์ ันจะเปรยี บเทียบอักขระทลี ะตัว
ตามค่าของรหสั อักขระทีใ่ ช้ โดยตวั เลขมากอ่ นตวั อักษร และตัวพิมพใ์ หญ่ท้ังหมดจะมาก่อนตัว
พิมพเ์ ล็ก เชน่ ลำดับในตารางท่ี 3.2 (หน้า 47)

size_t strlen(const char *s);
char *stpcpy(char *dest, const char *src);
char *strcat(char *dest, const char *src);
int strcmp(const char *s1, const char *s2);

รหสั คำส่ังท่ี 7.4: ฟังก์ชนั ตา่ งๆ เก่ยี วกบั สายอักขระในภาษาซี

7.5. ตวั แปรชนดิ สายอกั ขระในภาษาซี 103

วธิ ีการเรียกใช้ฟังกช์ ันเกย่ี วกับสตรงิ เปน็ ดงั ต้นแบบในรหัสคำสง่ั ท่ี 7.4 ฟงั ก์ชันเหล่าน้หี ากมีผลลัพธ์

เป็นสายอักขระ เช่น การตอ่ สายอักขระ ฟังกช์ ันจะคืนคา่ ผลลพั ธ์ทเี่ ปน็ สายอักขระผ่านพารามเิ ตอร์ตวั แรก
(dest) สว่ นค่าท่ีรับคืนจากฟงั ก์ชันจะเป็นตัวช้ีไปยงั ตำแหน่งสดุ ท้ายของข้อความในผลลพั ธ์

แบบฝึกหดั

จงเขียนผงั งานและโปรแกรมภาษาซเี พือ่ ทำงานดงั ต่อไปนี้

1. รับขอ้ มูลจำนวนเตม็ 10 จำนวน จากนัน้ แสดงผลข้อมูลจากลำดับสุดทา้ ยไปยงั ลำดบั แรก
2. ลำดบั ฟโี บนักชี (Fibonacci) มนี ยิ ามความสัมพันธค์ อื จำนวนถัดไปเทา่ กับผลบวกของสองจำนวน

กอ่ นหน้า เขียนเปน็ สัญลกั ษณไ์ ดด้ ังน้ี

= −1 + −2

เมื่อ คอื เลขในลำดับฟโี บนักชีตวั ที่ โดยท่ี 0 = 0 และ 1 = 1 ใหร้ บั ค่า ซ่งึ เป็นจำนวนเต็ม
มีค่าไม่เกิน 100 แล้วแสดงผลลพั ธ์
3. ตอ้ งการสรา้ งตารางแจกแจงความถ่ขี องข้อมูลคะแนนสอบของนิสิตซ่ึงอยู่ในชว่ ง [0,100] จำนวน
100 คน โดยแบ่งข้อมูลเปน็ 5 ช่วง ต้ังแต่ [0,20), [20,40), [40,60), [60,80) และ [80,100]
แลว้ แสดงจำนวนนิสิตท่ีมีคะแนนอยู่ในช่วงตา่ งๆ
4. ใหผ้ ใู้ ช้ป้อนขอ้ มูลหมายเลขโทรศพั ท์ของไทยเขา้ มาซึง่ เป็นตวั เลขโดด 9-10 ตัว ซึ่งอาจจะมี - ค่นั
กลางระหว่างตัวเลขบางตวั ได้ เชน่ 02-2185148 หรอื 022185148 ใหแ้ ปลงหมายเลขท่ไี ดน้ ้ี
ให้อยู่ในรปู แบบ [เลข2-3 ตวั ]-[เลข 3 ตัว]-[เลข 4 ตัว] เช่น 02-218-5148
5. รบั ข้อมลู เป็นสายอักขระความยาวไมเ่ กิน 20 ตวั อักษร แลว้ ตรวจสอบวา่ สายอักขระน้นั เปน็
palindrome หรือไม่

palindrome คอื ข้อความที่อา่ นจากซ้ายไปขวาหรือขวาไปซา้ ยไดเ้ ปน็ คำเดียวกนั
เชน่ anna, otto, madam กำหนดใหข้ ้อความมเี ฉพาะอักษร a-z เทา่ นัน้

6. การหาค่าพ้นื ท่ีปิดล้อมของฟงั กช์ ันไมเ่ ปน็ ลบ ( ) กับแกน ในชว่ ง , ] หาไดจ้ าก ∫ ( )
ซ่งึ สามารถประมาณคา่ ได้โดยแบง่ [ , ] เปน็ ช่วงแคบๆ ช่วง แต่ละช่วงกว้าง = ( − )/ แล้ว

คำนวณค่าจากสมการ (7.2)

∑1 ( + − 2 ) ⋅ (7.2)

กำหนดฟงั กช์ นั ไมเ่ ปน็ ลบ loat f ( loat x ) มาให้ เมอ่ื รบั ขอ้ มลู ขอบล่าง a และขอบบน
b เป็นจำนวนจรงิ และรบั จำนวนเต็ม n เป็นจำนวนช่วงที่ตอ้ งการแบ่ง จงคำนวณ ∫ ( ) โดย

ใช้วิธกี ารประมาณค่าขา้ งตน้

104 บทที่ 7. ตัวแปรแถวลำดบั

7. จากการประมาณในสมการ (7.2) นัน้ ( + − 2) ⋅ เป็นการคำนวณพื้นที่สีเ่ หลี่ยมมมุ ฉาก
ทส่ี ูงเทา่ กับจุดกึ่งกลางของแตล่ ะชว่ ง เราสามารถประมาณค่าใหใ้ กล้เคียงข้ึนได้โดยใช้พนื้ ที่ของ
สี่เหล่ยี มดา้ นขนานที่มีความสูงสองจุดเทา่ กับขอบล่างและขอบบนของชว่ งตามลำดบั ลองคำนวณ
โดยปรับวิธกี ารประมาณค่าดู

บทที่ 8

การเรยี กใชฟ้ งั กช์ ัน

วัตถุประสงคก์ ารเรียนรู้

อธิบายการทำงานของโปรแกรมในรปู แบบการเรยี กใชฟ้ งั ก์ชัน

1. กำหนดพารามิเตอรแ์ ละรับคา่ คืนจากฟังกช์ ันได้เมือ่ กำหนดต้นแบบของฟังก์ชันมาให้
2. แยกแยะขอบเขตการใช้งานของตัวแปรเมอื่ มฟี ังก์ชันมาให้ได้
3. เขยี นฟังก์ชันเพ่อื ใหท้ ำงานตามท่ตี ้องการได้

8.1 นยิ ามและสัญลักษณ์

โปรแกรมย่อย (Pre-defined process หรือ subroutine) เปน็ ชุดคำสัง่ ซึง่ มกี ารกำหนดการทำงาน
ไวล้ ่วงหน้าแลว้ โดยมากเรามกั แบ่งโปรแกรมขนาดใหญอ่ อกเปน็ โปรแกรมยอ่ ยหลายๆ ส่วน เพ่อื ใหเ้ ขา้ ใจ
ไดง้ ่าย บำรงุ รกั ษาสะดวก นอกจากน้ี ส่วนของโปรแกรมใดท่ีถูกเรยี กใช้บ่อย ก็มกั จะถกู เขยี นแยกออกมา
เป็นโปรแกรมยอ่ ยดว้ ย การใชส้ ญั ลกั ษณ์โปรแกรมย่อยแทนขัน้ ตอนการทำงานแบบละเอยี ดทำใหผ้ ังงาน
กระชับ เขา้ ใจง่าย ในรหสั ตน้ ฉบบั เองก็เชน่ กนั

โปรแกรมย่อยกับฟังก์ชันมีลกั ษณะเปน็ ชดุ คำส่งั ซ่งึ ทำงานจบในตัวเหมอื นกนั แตแ่ ตกต่างกันทฟ่ี งั กช์ ัน
น้ันจะสามารถคืนค่าได้เช่นเดยี วกับฟงั ก์ชนั ทางคณติ ศาสตร์ แต่โปรแกรมยอ่ ยจะไม่มีการคนื ค่า ภาษา
โปรแกรมบางภาษา เชน่ ภาษาซี ใช้โครงสรา้ งแบบฟังก์ชันทั้งหมด และเพมิ่ ลักษณะการคืนค่าชนิด void
แทนการไม่คนื ค่าเขา้ มา ดงั นัน้ บางคร้งั อาจใช้คำว่าฟงั กช์ ันและโปรแกรมย่อยแทนกนั ได้โดยไม่ผิดความ
หมาย

ผงั งานใชส้ ัญลักษณ์สเ่ี หลยี่ มมุมฉากซง่ึ มขี อบข้างเปน็ เส้นขนานแทนการเรียกใช้โปรแกรมย่อย และ
มชี อ่ื โปรแกรมย่อยกำกับในสญั ลักษณ์ ซึง่ จะอา้ งอิงไปถึงการทำงานอย่างใดอยา่ งหนึง่ ซึ่งกำหนดไว้ในผงั
งานอื่นหรอื ผงั งานหน้าอน่ื ดังตวั อย่างในรปู ที่ 8.1

106 บทที่ 8. การเรยี กใชฟ้ งั ก์ชัน

draw(text) print()

y = f(x) เก็บข้อมลู

รูปท่ี 8.1: สัญลักษณก์ ารเรยี กใชโ้ ปรแกรมยอ่ ยหรือฟงั ก์ชนั

เราอาจระบคุ ่าต่างๆ ที่ต้องการส่งใหโ้ ปรแกรมย่อยหรอื ฟงั ก์ชนั และตัวแปรสำหรบั รบั ค่าคืนลงในผงั
งานด้วยกไ็ ด้ หรือไม่ระบกุ ็ได้ เพ่อื ใหผ้ งั งานแสดงขนั้ ตอนการทำงานทช่ี ดั เจน ควรระบุคา่ ทรี่ บั ส่ง

สญั ลกั ษณข์ องโปรแกรมย่อยในรหสั ตน้ ฉบับข้ึนกับภาษาทใ่ี ช้ โดยมากจะเปน็ การประกาศหรอื นิยาม
ชือ่ กอ่ นใช้งาน การอ้างอิงถึงโปรแกรมย่อยหรอื ฟังก์ชนั ทำได้ผา่ นชือ่ ของโปรแกรมย่อยหรือฟงั กช์ ันน้ัน
ในกรณที ่มี ีการคืนค่า การเรียกใชฟ้ งั ก์ชนั นั้นสามารถมองเสมือนเปน็ นพิ จนซ์ ง่ึ ใหผ้ ลลัพธ์เปน็ ค่าในชนิดที่
กำหนดได้

8.2 โครงสร้างของฟงั กช์ ันและการเรียกใช้

ฟงั ก์ชันประกอบดว้ ยองค์ประกอบหลัก 4 สว่ น ได้แก่

1. ช่อื ของฟงั ก์ชนั มขี อ้ กำหนดในการตงั้ เช่นเดียวกับตวั แปร ในบางภาษาจะยอมให้ต้ังชอื่ ฟังก์ชนั ซ้ำ
กันไดห้ ากมพี ารามิเตอร์ท่ตี ่างกัน เคร่ืองจะเลอื กฟังก์ชันทีถ่ กู ต้องจากลกั ษณะของพารามิเตอร์ที่
ปอ้ นเข้ามาให้เอง บางภาษาเช่นไพธอนยอมให้ตงั้ ชื่อซำ้ ได้ โดยจะเปน็ การนิยามช่อื ใหมต่ ามการ
ประกาศลา่ สดุ ท่ีมี อย่างไรกต็ าม ควรหลกี เลี่ยงการใช้ชือ่ ซ้ำเพอ่ื ป้องกนั ความสับสนเมอื่ เรียกใช้

2. พารามิเตอร์ คือตัวแปรสำหรับรบั ค่าทสี่ ง่ เข้ามาให้ใช้ในฟังก์ชนั จะมีหรอื ไม่มกี ็ได้
3. ชนิดของค่าท่ีส่งคนื ใหต้ ัวเรยี ก หรือไมม่ ีหากไม่ตอ้ งการคนื ค่าใดๆ
4. ชดุ คำส่งั สำหรับขนั้ ตอนการทำงานของฟังก์ชนั และคำส่งั สำหรับคนื คา่ ตัวชดุ คำสั่งน้คี อื สิ่งท่ีนำไป

เขยี นเปน็ ผงั งานของฟังกช์ ัน

หากเปน็ โปรแกรมยอ่ ย กจ็ ะตัดสว่ นการคนื คา่ ออกไปได้ การประกาศฟังก์ชันโดยทัว่ ไปมโี ครงสรา้ งดงั
รหัสคำส่งั ที่ 8.1

ชนิดของตัวแปรคืนคา่ ชอื่ ฟังกช์ นั ( ตัวแปรรบั คา่ , ตวั แปรรับคา่ , ...)

ชดุ คำสัง่
return คา่ ส่งคนื

รหสั คำสงั่ ท่ี 8.1: โครงสร้างของฟังกช์ นั

การเรียกใชโ้ ปรแกรมย่อยหรอื ฟังกช์ ันทำโดยการระบุชอ่ื โปรแกรมยอ่ ยนั้นในโปรแกรมหลัก พรอ้ มทงั้
ส่งค่าตา่ งๆ ทจ่ี ำเปน็ ไปให้ ในกรณที ี่เปน็ ฟงั ก์ชันและมคี า่ คนื กลบั มา หากต้องการเก็บคา่ ไว้ใช้งาน ก็
สามารถตั้งตวั แปรมาแลว้ กำหนดคา่ ใหเ้ ปน็ ผลลพั ธข์ องฟงั กช์ ันได้

8.3. การรบั ส่งค่า 107

ตน้ แบบ (signature, prototype) ของฟังก์ชนั ประกอบด้วย ช่ือฟงั ก์ชนั ชนดิ ของตัวแปรรับค่า
ต่างๆ ซง่ึ เป็นพารามิเตอรข์ องฟังก์ชนั และชนดิ ของตวั แปรคืนคา่ การเรยี กใชฟ้ งั กช์ ันนน้ั ไม่จำเปน็ ต้องรขู้ นั้
ตอนการทำงานภายในฟังกช์ นั เพียงรู้ตน้ แบบกจ็ ะสามารถเรยี กใช้ฟังก์ชนั เหลา่ นนั้ ได้ถูกตอ้ ง

ตวั อยา่ ง 8.1 (การเรยี กใช้ฟงั กช์ ันการหารากที่สอง). ฟังกช์ ันการหารากทีส่ อง มีต้นแบบดงั น้ี
double sqrt(double x);

แสดงวา่ ฟงั กช์ ันหารากทีส่ องชือ่ sqrt รบั คา่ เปน็ จำนวนจริงนัยสำคัญสงู หนึง่ คา่ และคนื คา่ ผลลพั ธเ์ ปน็
จำนวนจรงิ นัยสำคญั สงู เช่นกัน เมอ่ื เขียนคำส่ัง

double x;
x = sqrt(10.5);

จะมกี ารทำงานดังนี้

1. ประกาศตัวแปร x ใหเ้ ปน็ จำนวนจริงนัยสำคญั สูง
2. เรยี กใชฟ้ ังก์ชัน sqrt โดยสง่ จำนวน 10.5 ให้
3. ไดผ้ ลลพั ธ์กลับมา แลว้ กำหนดคา่ ให้ x เท่ากบั ผลลพั ธ์นั้น

หากส่งั

printf(”%f”,sqrt(2.5));

จะเป็นการเรียกใช้ฟังก์ชนั sqrt และป้อนจำนวน 2.5 ให้ฟังก์ชนั และเมอื่ ไดผ้ ลลัพธก์ ลับมาแล้ว ใช้

ผลลพั ธน์ ั้นเปน็ ข้อมูลเขา้ ส่งตอ่ ให้ฟังก์ชัน printf แตไ่ มเ่ กบ็ ผลลพั ธไ์ ว้ใช้งานอกี □

การเขียนโปรแกรมยอ่ ยหรือฟงั กช์ ันนน้ั เหมอื นกับการออกแบบโปรแกรมปกติ คอื

1. ระบุข้อมูลเขา้ ซ่ึงอาจรับมาจากโปรแกรมหลกั ผ่านวิธกี ารสง่ คา่ แบบต่างๆ หรือรับจากผู้ใช้
2. ระบขุ ้อมูลออกถา้ มี อย่ใู นรูปของการคนื ค่าแบบตา่ งๆ
3. ออกแบบขั้นตอนการทำงานของโปรแกรม

ดงั นน้ั เราจึงสามารถเขียนผังงานย่อยสำหรับโปรแกรมยอ่ ยหรือฟงั กช์ ันได้เชน่ เดยี วกับโปรแกรมทว่ั ไป

8.3 การรบั ส่งคา่

การรบั ส่งค่าให้ฟงั กช์ นั หรอื โปรแกรมย่อยมสี องรปู แบบ คอื ผา่ นพารามิเตอร์ของฟังก์ชนั ซง่ึ เป็นการ
สำเนาคา่ จากตวั เรยี ก ส่งไปใหต้ วั ถูกเรียก และผ่านตวั แปรร่วมทป่ี ระกาศไวส้ ำหรบั ทงั้ โปรแกรม

108 บทท่ี 8. การเรยี กใช้ฟงั ก์ชัน

f(a ,b )
\{

\} ตวั ถูกเรียกสำเนา ่คา
สำเนา ่คา
f(a สำเนา ่คา,bptr2

)

ตวั เรยี ก ptr1 value

(ก) การสง่ ค่าผา่ นพารามิเตอร์ (ข) การส่งค่าผ่านตัวแปรชนดิ ตัวช้ี

8.3.1 พารามเิ ตอร์

พารามิเตอร์ (formal parameter) เป็นตัวแปรรับคา่ ของฟังกช์ นั หรอื โปรแกรมยอ่ ย ซง่ึ ตวั เรยี กส่งให้
ในการเรียกใชแ้ ตล่ ะครงั้ การส่งค่าผ่านพารามเิ ตอร์เปน็ การสำเนาค่าจริงทอี่ ยู่ในตวั เรียก (actual pa-
rameter) ไปให้ตวั แปรรับค่าในตวั ถกู เรยี ก ดังรปู ที่ 8.2(ก) การส่งคา่ ผา่ นพารามิเตอร์ยงั แบง่ ออกเป็น
สองรปู แบบ คือการสำเนาค่าทั่วๆไป เชน่ จำนวนเต็ม จำนวนจริง และอกั ขระ กบั การสำเนาค่าตวั ช้ซี ่ึง
เปน็ ตำแหน่งท่อี ย่ใู นหน่วยความจำสง่ ไปยงั ตวั ถูกเรยี ก การสำเนาค่าทวั่ ๆ ไปไมท่ ำใหค้ า่ ทมี อี ยใู่ นตวั แปร
ของตวั เรียกเปลย่ี นแปลงไป แตใ่ นกรณีที่เป็นตัวแปรชนดิ ตัวช้ี เช่นตวั แปร ptr1 ในรปู ที่ 8.2(ข) ซง่ึ เก็บ
ตำแหน่งท่ีอยู่ของคา่ ในตัวแปร value (ช้ีไปยัง value) เม่อื สำนาเค่าไปยงั ตวั แปร ptr2 ถึงแม้คา่ ในตวั
ชจ้ี ะถูกสำเนาไปเช่นเดียวกบั การสำเนาคา่ ปกติ แตค่ ่านน้ั คอื ตำแหน่งทอี่ ยขู่ องข้อมลู จรงิ การเปล่ยี นแปลง
ค่าตา่ งๆ โดยอาศยั ท่ีอย่ทู ก่ี ำหนดในตวั ชี้ เชน่

*ptr2 = 10

จะทำให้ตวั ชี้อน่ื ๆ (ในท่นี ้คี ือ ptr1) เห็นค่าท่ีเปล่ียนแปลงตามไปดว้ ย จึงสามารถใช้วิธนี ใี้ นการคนื ค่า
โดยไม่ต้องผา่ นตัวแปรคนื ค่า แตอ่ าศัยการกำหนดคา่ ใหมใ่ หต้ ำแหน่งข้อมลู ระบโุ ดยตัวแปรชนดิ ตัวช้ีใน
พารามเิ ตอรแ์ ทน เช่นในกรณีคำส่งั scanf ซ่งึ ไม่ได้คนื คา่ ข้อมลู ทีอ่ ่านผ่านตวั แปรคนื คา่ แต่ใชก้ ารนำ
ขอ้ มูลท่ีอ่านไดไ้ ปใสใ่ นตำแหนง่ ท่ีระบุด้วยตวั แปรตัวช้แี ต่ละตวั แทน

8.4. ขอบเขตของตัวแปร 109

จำนวนของตัวแปรรบั คา่ ขึน้ กับผ้เู ขยี นโปรแกรมจะกำหนด ชนดิ ของตวั แปรแตล่ ะตัวไมจ่ ำเปน็ ต้อง
เหมอื นกนั การส่งคา่ ในตัวเรียกจะส่งเรียงลำดบั ตามทก่ี ำหนดในฟังกช์ ันหรือโปรแกรมย่อย คอื ตัวที่ 1 2
3 ... ตามลำดบั

8.3.2 การคืนคา่

ตวั แปรคืนค่าใชส้ ำหรบั ส่งค่าบางอยา่ งคนื ให้ตัวเรียกนำกลบั ไปใชต้ ่อ โดยมีชนดิ ของตัวแปรตามท่ปี ระกาศ
ไวใ้ นฟังก์ชัน นอกจากชนดิ ตวั แปรพืน้ ฐานแล้ว สว่ นของโปรแกรมย่อยอาจไม่คนื ค่าใดๆเลยกไ็ ด้ ในภาษาซี
กำหนดชนิดไมค่ ืนค่านี้วา่ ชนิด void

คำสัง่ return ใชส้ ำหรบั กำหนดคา่ ใหต้ ัวแปรสง่ คืนค่า และออกจากการทำงานของฟังกช์ นั หาก
ไมม่ กี ารคนื คา่ ในกรณที ่ไี มต่ ้องการคืนค่า อาจใช้คำส่งั return โดยไมร่ ะบคุ า่ ก็ได้เช่นกัน

8.4 ขอบเขตของตวั แปร

ตวั แปรทใ่ี ชม้ สี องประเภท แบบแรกคอื ตวั แปรซงึ่ ใช้รว่ มกันทั้งโปรแกรม ตวั แปรชนดิ น้สี ามารถเรียกใช้
จากสว่ นใดของโปรแกรมก็ได้ ไมว่ า่ จะเป็นโปรแกรมหลกั หรือโปรแกรมย่อย แบบทีส่ องคือตัวแปรเฉพาะ
ที่ ตวั แปรชนดิ นีจ้ ะใช้ได้เฉพาะในสว่ นทปี่ ระกาศเท่านน้ั ตวั แปรทงั้ หมดทป่ี ระกาศอยใู่ นสว่ นของโปรแกรม
ยอ่ ย หากประกาศให้เปน็ ตวั แปรเฉพาะที่ แม้จะเป็นชื่อเดียวกับตัวแปรทปี่ ระกาศทอี่ ื่น ค่าต่างๆจะใช้ได้ใน
สว่ นของโปรแกรมยอ่ ยนเ้ี ทา่ นน้ั

หากตอ้ งการสง่ ค่าจากส่วนอ่นื ๆของโปรแกรมเข้ามาใหส้ ว่ นของโปรแกรมยอ่ ย การส่งคา่ ทำได้ผ่าน
ตวั แปรรบั ค่า ตัวแปรรับค่าน้จี ะใช้เฉพาะในสว่ นของโปรแกรมยอ่ ย และไม่มีการเปล่ยี นแปลงค่าของ
ตัวแปรนอกสว่ นของโปรแกรมย่อย หากต้องการนำคา่ ท่คี ำนวณได้ในส่วนของโปรแกรมยอ่ ยออกไปใช้ที่
สว่ นอ่นื ๆ ตอ้ งประกาศตัวแปรนัน้ ใหเ้ ป็นตัวแปรร่วม หรอื คนื ค่าทค่ี ำนวณไดผ้ า่ นตัวแปรคนื คา่ ไป

8.5 ลำดับการทำงานของฟงั กช์ นั

การทำงานของโปรแกรมจะเร่ิมท่โี ปรแกรมหลัก และมกี ารเรยี กใช้โปรแกรมยอ่ ยตา่ งๆ โปรแกรมยอ่ ยเอง
ก็สามารถเรยี กโปรแกรมยอ่ ยอน่ื ๆ รวมถึงเรียกใชต้ วั โปรแกรมย่อยเองไดเ้ ช่นเดยี วกนั ในการวเิ คราะห์
การเรยี กใช้โปรแกรมย่อย เราแบ่งโปรแกรมย่อยตามลักษณะการทำงานเป็น 2 สว่ น คือ ตวั เรยี ก (caller)
และตัวถูกเรยี ก (callee) ทัง้ ตวั เรยี กและตัวถูกเรียกสามารถเป็นโปรแกรมย่อยใดๆ ก็ได้ เป็นรหัสต้นฉบบั
ชดุ เดียวกันกไ็ ด้ แต่การทำงานจะเป็นไปตามลำดบั คอื เร่ิมจากตวั เรยี กก่อน เมื่อตวั เรยี กน้นั เรียกใชต้ วั ถูก
เรียก การทำงานจะขา้ มไปเร่ิมต้นท่จี ดุ เริม่ ต้นของตัวถูกเรยี ก จนกวา่ จะเสรจ็ สิน้ การทำงานในสว่ นของตัว
ถูกเรียกแลว้ จงึ จะกลับมาทำงานสว่ นทเ่ี หลอื ของตัวเรยี กต่อ

ตัวแปรต่างๆ ทป่ี ระกาศภายในฟังก์ชนั นั้น จะใช้ไดใ้ นขอบเขตของการทำงานในการเรยี กใช้ครง้ั หน่งึ ๆ
เท่าน้ัน การเรยี กใช้โปรแกรมย่อยจะเสมอื นกบั มกี ารสรา้ งชดุ ของตัวแปรเฉพาะทสี่ ำหรบั โปรแกรมยอ่ ยนั้น

110 บทท่ี 8. การเรียกใช้ฟังก์ชัน

ขนึ้ ใหม่ โดยไมเ่ กย่ี วขอ้ งกับตัวแปรเฉพาะทอ่ี น่ื ๆ ทีเ่ คยประกาศมาก่อนลว่ งหนา้ และเมื่อการทำงานของ
ตวั ถกู เรียกนน้ั สิน้ สดุ ตัวแปรเฉพาะท่ีต่างๆ ของตวั ถูกเรยี กกจ็ ะหมดอายุตามไปด้วย หากต้องการอ้างถงึ
ค่าต่างๆ ทีม่ อี ยู่ในตวั ถูกเรียก ต้องสง่ คา่ น้ันคนื ให้ตัวเรยี กผ่านการคนื คา่ ในรูปแบบตา่ งๆ

ตวั อยา่ ง 8.2 (ฟงั ก์ชันแฟกทอเรียลและขั้นตอนการทำงาน). โปรแกรมในรหัสตน้ ฉบบั ท่ี 8.2 ประกอบ
ดว้ ยฟังกช์ ัน main และ factorial

1 #include <stdio.h>
2 #include <stdlib.h>

3
4 int nRound;

5
6 int factorial(int n)
7{
8 printf(”round %d, n = %d\n”, nRound, n);
9 nRound++;

10 if (n < 0)
11 return -1;
12
13 else if (n <= 2)
14 return n;
15
16 else
17 } return n * factorial(n-1);

18
19 int main()
20 {
21 int n;
22 printf(”Enter n: ”);
23 scanf(”%d”, &n);

24
25 nRound = 1;

26
27 printf(”%d! = %d\n”, n, factorial(n));

28 return 0;

29
30 }

รหสั คำสัง่ ที่ 8.2: โปรแกรมแฟกทอเรียล

8.6. คลังโปรแกรม 111

ขอ้ สงั เกตท่นี า่ สนใจในโปรแกรมนมี้ ี 4 จดุ ไดแ้ ก่

1. ตวั แปร nRound เปน็ ตวั แปรรว่ ม ประกาศท่บี รรทดั ท่ี 4 อยนู่ อกท้งั สองฟงั ก์ชัน ทำให้ทัง้ สอง
ฟังกช์ นั สามารถใช้งานตวั แปรนไ้ี ด้ และการเปลี่ยนแปลงค่าใดๆ ในตวั แปรนีด้ ว้ ยฟังกช์ ันหน่งึ จะสง่
ผลให้ฟงั ก์ชนั อ่ืนๆ เห็นคา่ ท่ีเปลย่ี นไปตามไปดว้ ย
เชน่ ใน main มีการกำหนดคา่ nRound ให้เป็น 1 ในบรรทดั ท่ี 25 มอ่ื เรยี กฟงั กช์ ัน
factorial ครงั้ แรกในบรรทัดท่ี 27 ในฟงั กช์ นั factorial กจ็ ะเห็นวา่ nRound มคี า่ 1
ตามไปด้วย
สว่ นในฟงั กช์ นั factorial นัน้ มีการเพมิ่ คา่ nRound ไปทีละหนงึ่ ในแตล่ ะครงั้ ของการเรยี ก
ฟงั กช์ นั ด้วยคำสั่งในบรรทัดท่ี 9 การเรียกฟงั ก์ชนั ในรอบหลงั ๆ ก็จะเห็นค่า nRound ที่เปล่ยี นไป
แลว้ เช่นกนั

2. ตวั แปร n ประกาศอยใู่ นทัง้ main และ factorial แตท่ ้งั สองตัวแปรเกบ็ แยกจากกันโดยเดด็
ขาด ความเชอ่ื มโยงของทัง้ สองตวั แปรมเี ฉพาะตอนที่ main สำเนาคา่ ใน n ของ main ไปให้ n
ของ factorial ผ่านการเรยี กใชใ้ นคร้งั แรกเทา่ นนั้

3. ฟงั ก์ชันใดๆ สามารถเรียกใชต้ วั มันเองได้ เชน่ ในฟงั กช์ ัน factorial ก็มีการเรยี กใชฟ้ งั กช์ นั
factorial ดว้ ยเช่นกนั แต่การเกบ็ ตัวแปรเฉพาะทีต่ า่ งๆ ของตัวเรยี กและตวั ถกู เรยี กนั้นแยก
จากกัน ไมว่ ่าช่ือตวั แปรหรอื ฟังก์ชนั จะซ้ำกันหรือไมก่ ็ตาม

4. ในรหัสคำส่งั ท่ี 8.2 เปน็ โปรแกรมภาษาซี ประกาศฟงั ก์ชนั factorial และการทำงานไวก้ ่อน
การเรียกใช้ในฟงั กช์ นั main จงึ ไม่จำเปน็ ตอ้ งเขยี นตน้ แบบของฟังก์ชันกอ่ นการเรียกใช้อกี แต่หาก
สลบั ตำแหน่งของรหสั ตน้ ฉบับสำหรับฟงั ก์ชัน factorial และฟังกช์ นั main กอ่ นประกาศ
ฟังกช์ ัน main ตอ้ งระบตุ น้ แบบของฟงั กช์ ัน factorial เอาไวก้ อ่ นฟังกช์ ัน main ดว้ ย



8.6 คลังโปรแกรม

โปรแกรมยอ่ ยและฟังก์ชันต่างๆ ท่ีใชบ้ อ่ ยมักจะถูกรวบรวมเก็บไว้ในคลังโปรแกรม (library) เพอ่ื จัด
ใหเ้ ปน็ หมวดหมแู่ ละใหผ้ ู้ท่ตี ้องการใชส้ ามารถดึงมาใชไ้ ด้โดยไม่ต้องเขียนใหมอ่ กี การเรียกใชฟ้ งั ก์ชันใน
คลงั โปรแกรมทำได้โดยระบุชื่อคลังโปรแกรมท่ีใช้ เพื่อใหค้ อมไพเลอรห์ รอื อินเทอร์พรเี ตอร์รู้จกั ฟงั ก์ชนั ที่
ต้องการเรียกใช้ และใหต้ ัวเชอื่ มโยงสามารถไปดงึ ออบเจกต์โค้ดของฟังก์ชนั เหลา่ น้ันมารวมเป็นโปรแกรม
ท่ีทำงานได้

คลงั โปรแกรมจึงข้ึนกบั ภาษาโปรแกรมทใ่ี ช้ รวมถึงขนึ้ กับระบบปฏิบตั กิ ารท่ีใช้ด้วย คลังโปรแกรมท่ี
เป็นที่นิยมนั้นจะสนบั สนุนหลายภาษาและระบบปฏิบัตกิ าร เชน่ OpenGL (Open Graphic Library)
เปน็ คลงั โปรแกรมสำหรบั งานกราฟกิ สนบั สนุนทั้ง Windows, Linux, OS X และมีส่วนตอ่ ประสาน
โปรแกรม (API) ในหลากหลายภาษา เชน่ ซี จาวา

112 บทท่ี 8. การเรียกใช้ฟงั กช์ นั

แบบฝกึ หัด

1. กำหนดฟังกช์ ัน longdiv เป็นฟงั ก์ชันการหารยาวทศนิยม 1 ตำแหนง่ กำหนดให้ dividend
เปน็ ตัวตงั้ และ divisor เป็นตวั หาร มีต้นแบบดงั น้ี

loat longdiv(loat dividend, loat divisor);

เช่น 10/4 จะได้ผลลัพธ์เป็น 2.5
หากตอ้ งการหาผลลพั ธข์ อง 20/3 จะตอ้ งเรยี กใช้ฟังกช์ ัน longdiv นี้อยา่ งไร
2. ตอ้ งการเขียนฟังก์ชัน contains เพือ่ ตรวจสอบวา่ อกั ขระอนิ พุตอยูใ่ นสายอักขระทีป่ ้อนเขา้ มา
หรือไม่ โดยใหผ้ ลลพั ธเ์ ป็นจำนวนเตม็ 1 หากพบ หรือ 0 หากไม่พบ เช่น ตรวจสอบวา่ อักขระ ‘a’
อยใู่ นสายอักขระ “contains” หรือไม่ ฟังก์ชันน้ีควรมีต้นแบบเปน็ อย่างไร
3. จากแบบฝึกหัด Fibonacci ในบทท่ี 7 จงเขยี นฟงั กช์ นั การคำนวณเลขฟโี บนกั ชีลำดับท่ี เมอ่ื
ฟงั กช์ นั การหาค่าในลำดบั ฟีโบนักชคี อื

= −1 + −2

กำหนด 0 = 0 และ 1 = 1

บทที่ 9

ความปลอดภัยและจริยธรรมคอมพวิ เตอร์

วัตถปุ ระสงคก์ ารเรียนรู้

ระบปุ ัจจยั เสี่ยงเกี่ยวกับความปลอดภัยของระบบและขอ้ มูลคอมพวิ เตอร์ จรยิ ธรรมการใช้คอมพิวเตอร์
และอาชญากรรมบนอินเทอร์เนต็

1. อธิบายรปู แบบการโจมตีระบบคอมพวิ เตอร์ และข้อมลู ในระบบคอมพิวเตอรแ์ บบพ้นื ฐาน และวธิ ี
การปอ้ งกนั เบอื้ งตน้ ได้

2. อธบิ ายหลักการแสดงตัวและหลักการยืนยนั ตวั ตนพน้ื ฐานในระบบคอมพวิ เตอร์ได้
3. ผเู้ รยี นระดับพืน้ ฐานควรสามารถอธบิ ายหลกั การเข้ารหัสอย่างงา่ ย โดยใชก้ ุญแจสมมาตร และ

กญุ แจอสมมาตรได้
4. เช่ือมโยงความผดิ ตามพระราชบญั ญตั คิ อมพิวเตอร์ พ.ศ. 2550 กับวิธีป้องกันตนจากอาชญากรร

รมเหลา่ น้ีได้
5. อธบิ ายการตดั สนิ ใจตามหลกั การทางจริยธรรมได้เม่ือพบกับปัญหา

9.1 ความเสียหายตอ่ ระบบคอมพิวเตอร์และข้อมลู

ความเสียหายทอ่ี าจเกิดได้กับระบบคอมพวิ เตอร์มีทั้งความเสียหายในส่วนฮารด์ แวร์ ซอฟต์แวร์ และ
ความเสียหายโดยตรงกบั ขอ้ มลู ท่ีเกบ็ ไวใ้ นระบบคอมพิวเตอร์ ความเสยี หายทเี่ กิดขึน้ เปน็ ไดท้ ั้งในทางตรง
เชน่ ฮาร์ดดิสก์เสียหายจากการตกกระแทก หรือทางอ้อม เช่น ขอ้ มูลร่ัวไหลทำให้ธรุ กิจเสยี หาย เปน็ ตน้

ความเสยี หายของระบบคอมพวิ เตอร์เกิดได้จากหลายสาเหตุ บางกรณีเปน็ เหตุสุดวสิ ยั ไม่สามารถ
ป้องกันได้ เช่น ภัยธรรมชาติ หรอื อปุ กรณ์ตา่ งๆ เสอ่ื มสภาพไปตามอายกุ ารใช้งาน บางกรณีเกิดจากความ
ร้เู ทา่ ไม่ถงึ การณห์ รอื ความประมาทของผ้ใู ช้ เชน่ ไม่มีการเกบ็ ขอ้ มลู สำรอง หรือปิดระบบคอมพิวเตอรไ์ ม่
ถกู วธิ ีแลว้ ทำให้ข้อมูลสญู หาย แต่บางกรณีก็เกิดจากชอ่ งโหว่ตา่ งๆ ในระบบคอมพิวเตอร์ และมีผ้ปู ระสงค์
รา้ ยต้งั ใจโจมตีทช่ี อ่ งโหว่เพือ่ สร้างความเสียหายให้กบั ระบบหรอื ข้อมูลในระบบ

114 บทท่ี 9. ความปลอดภัยและจริยธรรมคอมพิวเตอร์

การรักษาความปลอดภยั จงึ ตอ้ งคำนงึ ถงึ ปัจจยั ตา่ งๆ ทอ่ี าจสรา้ งความเสียหายเหล่าน้ี และหาวิธกี าร
ปอ้ งกนั

9.2 อาชญากรรมคอมพิวเตอร์

ประเทศไทยตราพระราชบญั ญัตวิ ่าด้วยการกระทำผิดเกย่ี วกับคอมพิวเตอร์ พ.ศ. 2550 เพอ่ื ปอ้ งกัน
และปราบปรามการกระทำผดิ เกีย่ วกับคอมพวิ เตอร์ ในพระราชบญั ญัติฯ กำหนดฐานความผิดทางอาญา
อำนาจหนา้ ท่ขี องเจ้าหน้าที่ในการป้องกนั และปราบปราม และหน้าทข่ี องผใู้ ห้บริการในการจราจรทาง
คอมพวิ เตอร์

การกำหนดฐานความผดิ ต่างๆ ยึดตามหลกั การรักษาความลบั (confidentiality) การรักษา
ความครบถว้ น (integrity) และการรักษาสภาพพร้อมใชง้ าน (availability) ของระบบและขอ้ มลู
คอมพิวเตอร์ การกระทำท่ีเปน็ อาชญากรรมคอมพวิ เตอรจ์ ะอยู่ในหมวด 1 ของพระราชบญั ญตั ิฯ โดยแบง่
ออกเป็นการกระทำโดยตรงกับคอมพวิ เตอร์ และการใช้คอมพิวเตอร์เป็นเครือ่ งมือในการกระทำความผดิ
อน่ื จำแนกฐานความผิดตา่ งๆ ไดด้ ังตอ่ ไปนี้

1. (มาตรา 5) การเข้าถึงระบบคอมพิวเตอรท์ ่ีไม่ได้มไี วส้ ำหรบั ตน
2. (มาตรา 6) การรู้วธิ กี ารปอ้ งกันการเข้าถึงระบบแล้วนำไปเผยแพร่ตอ่ แก่ผ้อู ่ืนในทางท่ีจะกอ่ ให้เกิด

ความเสียหาย
3. (มาตรา 7) การเขา้ ถงึ ขอ้ มูลคอมพิวเตอรท์ ่ีไม่ไดม้ ีไว้สำหรบั ตน
4. (มาตรา 8) การดักรบั ขอ้ มูลคอมพวิ เตอรข์ องผ้อู ่ืน โดยไม่ได้เป็นไปเพอ่ื ประโยชน์สาธารณะ
5. (มาตรา 9) การรบกวนข้อมูลคอมพิวเตอร์ โดยการทำใหเ้ สียหาย ดัดแปลง เพม่ิ เติม ขอ้ มลู ของผู้

อ่นื โดยมิชอบ
6. (มาตรา 10) การรบกวนระบบคอมพิวเตอรด์ ว้ ยการใช้งานที่ไมป่ กติ แลว้ ทำใหร้ ะบบคอมพวิ เตอร์

ไม่สามารถทำงานไดต้ ามปกติ
7. (มาตรา 11) การสง่ ขอ้ มูลใหผ้ ูอ้ ่ืนโดยปกปิดแหลง่ ทมี่ า และเป็นการรบกวนการใชง้ านโดยปกตสิ ุข

ของผ้อู น่ื
8. (มาตรา 13) การเผยแพร่หรอื จำหน่ายชุดคำสง่ั ซ่ึงเปน็ เครอื่ งมอื ในการกระทำผิด
9. (มาตรา 12) โทษสถานหนักหากความผดิ ตามมาตรา 9 หรอื 10 นน้ั สรา้ งความเสียหายแก่

ประชาชน หรือความมนั่ คงของประเทศ
10. (มาตรา 14) การนำขอ้ มลู ปลอม และข้อมลู ท่ีมเี นื้อหาท่ีไม่เหมาะสมเขา้ สรู่ ะบบคอมพิวเตอร์
11. (มาตรา 15) การเป็นผูใ้ หบ้ รกิ ารท่ีจงใจสนบั สนนุ หรอื ยินยอมใหม้ กี ารกระทำผิด
12. (มาตรา 16) การเผยแพร่ภาพตดั ต่อ ดัดแปลง ซึ่งทำให้ผู้อื่นเสียหาย

หมวดอ่นื ๆ ของพรบ. คอมพวิ เตอร์ฯ เป็นเรื่องหน้าท่ขี องผู้ใหบ้ ริการ และอำนาจหน้าที่ของเจ้าหน้าท่ี

9.3. การเขา้ ถงึ ระบบและขอ้ มลู คอมพวิ เตอร์ 115

9.3 การเข้าถึงระบบและขอ้ มลู คอมพิวเตอร์

ความเส่ยี งหน่ึงกับระบบและข้อมูลคอมพวิ เตอรค์ ือการเข้าถงึ โดยไม่ได้รับอนุญาตหรอื ไม่สมควร หากผู้
ประสงคร์ า้ ยสามารถเข้าถงึ ระบบคอมพิวเตอร์ได้ และไดส้ ิทธิดำเนินการบางอย่าง เชน่ ปดิ การทำงานบาง
อยา่ งของระบบ ดดั แปลงแก้ไขข้อมลู หรือสำเนาข้อมูลออกไป กอ็ าจสรา้ งความเสยี หายใหอ้ งคก์ รได้

ในระบบคอมพิวเตอรจ์ ึงมกี ารจำแนกระดบั ของสิทธิ (authority) ในการเขา้ ถงึ ข้อมลู และทรพั ยากร
ตา่ งๆ ของระบบ เชน่ ผใู้ ชบ้ ริการทวั่ ไปควรเข้าถงึ ขอ้ มลู ของตนเองได้ มสี ิทธิใชโ้ ปรแกรมได้ แตไ่ มม่ ีสทิ ธิ
เขา้ ดขู อ้ มลู ของผู้ใช้อ่นื และไมค่ วรมสี ทิ ธติ ดิ ตงั้ โปรแกรมเอง เพือ่ จำกดั ความเสียหายท่ีอาจเกิดขนึ้ ทัง้ โดย
จงใจและไม่จงใจ ในขณะท่ผี ูด้ ูแลระบบควรมสี ทิ ธิในการติดต้งั โปรแกรม ตามพรบ.คอมพิวเตอร์ฯ การเขา้
ถึงระบบหรอื ข้อมูลเหลา่ นี้โดยที่ตนไมม่ สี ทิ ธิเปน็ ความผิดตามมาตรา 5 หรือ 7 แล้วแตก่ รณี

เนื่องจากจำเปน็ ตอ้ งมมี าตรการป้องกนั ผ้ใู ช้ไม่ให้เขา้ ถึงระบบหรอื ขอ้ มลู โดยท่ตี นไม่มสี ทิ ธิ จงึ ต้อง
มกี ารแสดงตัวตนของผู้เข้าใชร้ ะบบวา่ เปน็ ใคร (identification) และตรวจสอบวา่ เป็นตวั จรงิ หรือไม่
(authentication) แตถ่ ึงแมร้ ะบบคอมพวิ เตอรจ์ ะมีมาตรการป้องกนั แล้วก็ตาม มาตรการป้องกนั เหล่า
นก้ี ็อาจจะยังมีช่องโหวอ่ ยู่ ผูด้ ูแลระบบควรตระหนกั และหามาตรการเพิม่ เติม ส่วนผู้ประสงค์รา้ ยที่ใชช้ อ่ ง
โหว่นใ้ี นการบุกรกุ เข้าสรู่ ะบบ หรือเขา้ ถึงข้อมลู ทต่ี นไม่มสี ิทธิ ก็จะมคี วามผดิ ตามพรบ. คอมพิวเตอร์ฯ
มาตรา 5 หรือ 7 และการเผยแพรม่ าตรการปอ้ งกนั ทีผ่ ้ดู แู ลระบบจดั ขนึ้ ไวแ้ กผ่ ู้อน่ื เพอื่ ให้ผปู้ ระสงค์
ร้ายรายอ่ืนสามารถบกุ รุกเขา้ มาในระบบได้ เช่น การเผยแพร่ชอ่ งโหวข่ องระบบ กม็ คี วามผิดตามพรบ.
คอมพวิ เตอร์ฯ มาตรา 6 ด้วย

ลองคิด

เมอ่ื นสิ ิตพบช่องโหว่ของระบบหรอื ซอฟตแ์ วร์ นสิ ติ ควรแจ้งใหผ้ ดู้ แู ลรบั ผดิ ชอบระบบหรือซอฟตแ์ วรน์ ้ันๆ
ดำเนินการแกไ้ ข แตช่ อ่ งโหว่บางประเภทน้นั อาจทำให้ผู้ใชถ้ ูกขโมยขอ้ มลู หรือสร้างความเสยี หายกบั ตัวผู้
ใชด้ ว้ ย นสิ ติ ควรเตอื นผูใ้ ชร้ ายอ่นื ๆ หรอื ไม่ วา่ ซอฟต์แวรห์ รือระบบเหลา่ นม้ี ีช่องโหว่ หากเตือน ควรใชว้ ธิ ี
ใด และการเตือนจะผดิ พรบ. คอมพิวเตอร์ฯ วา่ ดว้ ยการเผยแพรช่ อ่ งโหว่ของระบบหรือไม่

9.3.1 การแสดงตัวตน (Identification)

ในระบบซง่ึ มีผู้ใช้หลายรายน้นั ผ้ใู ชแ้ ต่ละรายตอ้ งมีส่งิ อ้างองิ แสดงวา่ ตนเองเปน็ ใคร หากเป็นในชวี ติ
ประจำวนั สิ่งระบตุ วั ตนของผใู้ ชอ้ าจจะเปน็ ชอ่ื -นามสกุล ชื่อตำแหนง่ หากเป็นในระบบคอมพวิ เตอรก์ ็
อาจเป็น ช่อื ผูใ้ ช้ บัตรสมาร์ตการด์ เป็นตน้

ส่ิงทสี่ ามารถระบุตวั ตนของผใู้ ชไ้ ด้น้นั ตอ้ งไมซ่ ำ้ กับผู้ใช้รายอน่ื เพ่ือใหร้ ะบบสามารถแยกแยะไดว้ ่าผู้
เขา้ ใชร้ ะบบนน้ั เปน็ ใคร ตวั อยา่ งในชีวิตประจำวนั เช่น ช่อื -นามสกลุ นน้ั ยงั มโี อกาสที่จะซำ้ กนั ได้ ในระบบ
คอมพวิ เตอร์จึงมักสร้างชื่อผู้ใชข้ น้ึ มาใหม่ เพอื่ ให้ยนื ยนั ไดว้ ่าจะไม่ซำ้ กับชอ่ื เดมิ ทีม่ ีอยูแ่ ลว้ แนน่ อน ใน
ระบบซึ่งมีผู้ใช้จำนวนมาก การสร้างชอ่ื ผใู้ ช้จำเป็นตอ้ งมคี วามยาวทมี่ ากพอ เพื่อใหร้ บั ประกันไดว้ ่าจะไม่
ซ้ำกับชื่อเดิมทม่ี อี ยู่

116 บทที่ 9. ความปลอดภยั และจริยธรรมคอมพิวเตอร์

การแสดงตวั ตนเพยี งอยา่ งเดียวน้นั ไม่เพยี งพอในการป้องกนั การเขา้ ถงึ ระบบและขอ้ มลู โดยไม่ไดร้ ับ
อนญุ าต เนื่องจากส่งิ ระบุตัวตนบางอย่างเป็นที่รบั ทราบโดยท่วั ไป เช่น ชือ่ ผใู้ ช้ หรอื เลขประจำตวั จึงตอ้ ง
มีระบบยนื ยันตวั ตนเพ่มิ ขนึ้ เพือ่ ใหแ้ น่ใจว่าผูท้ อ่ี า้ งชื่อนั้นเปน็ ตวั จรงิ หรอื ไม่

9.3.2 การยืนยันตัวตน (Authentication)

หลักการการยนื ยันตัวตนของผใู้ ชแ้ บง่ ออกเปน็ 3 แบบ ไดแ้ ก่

1. การสอบถามถึงส่ิงท่ีผ้ใู ช้ตัวจรงิ เท่านั้นจึงจะรู้ เช่น รหัสผา่ น
2. การขอดูสง่ิ ทผี่ ู้ใช้ตวั จริงเทา่ น้ันท่จี ะมี เช่น บตั รประจำตัวประชาชน คยี ์การด์
3. การตรวจสอบลักษณะของตัวผใู้ ช้ เช่น ลกั ษณะเฉพาะบคุ คลจำพวกลายน้ิวมือ หรอื มา่ นตา

วธิ ีการบางอยา่ งเป็นได้เพยี งการระบุตัวตน แตไ่ ม่เพียงพอท่จี ะใชย้ ืนยนั ตัวตนได้ เช่น การระบชุ อื่ ผู้
ใชไ้ ด้ถกู ตอ้ ง แตว่ ิธีการบางอยา่ งก็เป็นไดท้ ั้งการระบุและการยนื ยนั ตัวตน เช่น การตรวจสอบลายนว้ิ มือ

การแสดงตวั ตนและยืนยนั ตวั ตนใชร้ ่วมกันเพื่อยืนยันสทิ ธิต่างๆ ทพี่ ึงมีเมือ่ เขา้ ใช้ระบบ และเป็นการ
ป้องกนั ไมใ่ ห้ผ้ทู ี่ไม่มสี ิทธสิ ามารถเขา้ สูร่ ะบบได้

9.3.3 ชอื่ ผใู้ ช้และรหสั ผา่ น

เนอื่ งจากชอื่ ผ้ใู ช้น้ันไมไ่ ด้เป็นความลับ ชื่อผู้ใชแ้ ละรหัสผา่ น
มกั ถกู ใช้คู่กันในการแสดงตัวตนและยนื ยนั ตวั ตน แตห่ ากผู้
ประสงคร์ า้ ยได้ชือ่ ผู้ใช้ไป สงิ่ ทีต่ ้องทำในการบุกรกุ เขา้ สรู่ ะบบ
คอื พยายามหารหัสผา่ นมาใหไ้ ด้ วธิ ีหนึง่ ในการหารหัสผ่าน
คอื ทดลองสุ่มไปเร่อื ยๆ (brute force attack) หากรหสั
ผา่ นไม่แขง็ แรงพอ เครอ่ื งจะสามารถทดลองทลี ะรหสั จนครบ
ได้ในเวลาอันส้นั ระบบกจ็ ะมคี วามเส่ยี งต่อการถูกบุกรกุ

ตวั อยา่ งของรหสั ผ่านที่ไมแ่ ขง็ แรงหรอื ไม่ปลอดภัย ไดแ้ ก่

• คำท่วั ไปทมี่ คี วามหมายในพจนานุกรม เพราะเรา

สามารถให้เครื่องคอมพวิ เตอรท์ ดลองคำทีละคำใน

พจนานุกรมได้

• ข้อมลู สว่ นตวั ของผใู้ ช้ เช่น หมายเลขโทรศัพท์ เลข

ทะเบยี นรถยนต์ เพราะขอ้ มูลเหลา่ น้ีไมเ่ ป็นความลับ รูปท่ี 9.1: ตัวอยา่ ง CAPTCHA

• รหสั ผ่านทม่ี คี วามยาวนอ้ ยจนเกินไป เน่อื งจาก

คอมพวิ เตอร์สามารถทดลองไดค้ รบทุกรปู แบบท่เี ปน็

ไปไดใ้ นระยะเวลาอนั ส้ัน

9.4. การรบกวนระบบและขอ้ มูลคอมพวิ เตอร์ 117

การป้องกันการบกุ รกุ เขา้ สู่ระบบโดยการเดาสมุ่ รหสั ผ่านนั้น ผดู้ แู ลระบบตอ้ งมีนโยบายบังคับใชร้ หสั
ผ่านทีแ่ ขง็ แรงพอสมควร ไม่อนุญาตให้เดาสุม่ รหัสผ่านในจำนวนครัง้ ทีม่ ากเกินปกติ หรืออาจใชร้ ะบบ
ปอ้ งกันการใช้คอมพิวเตอรก์ รอกขอ้ มลู แทน เช่น CAPTCHA (รูปที่ 9.1) เป็นตน้

ในทางกลบั กนั การสรา้ งรหสั ผา่ นที่ดีควรเป็นรหัสผา่ นท่ีใชค้ อมพิวเตอร์เดาสมุ่ ไดย้ าก เช่น ใช้ท้งั ตวั
พิมพเ์ ลก็ ตวั พมิ พ์ใหญ่ ตวั เลขผสมกนั และมคี วามยาวมากพอ จำนวนรหัสทเ่ี ป็นไปไดย้ ่อมมากกวา่ การ
ใชร้ หัสผา่ นเปน็ ตวั อักษรพมิ พเ์ ลก็ เพียงอยา่ งเดยี ว แตข่ ้อเสียของการใชร้ หัสผา่ นท่ีซับซ้อนคอื เจ้าของรหัส
ผา่ นกอ็ าจจะจำรหสั ไมไ่ ด้เชน่ เดยี วกัน แนวทางในปจั จุบันจงึ มกั ใช้การยนื ยันตวั ตนสองช้ัน (two-factor
authentication) เช่น ใชร้ หัสผา่ นร่วมกบั SMS ผา่ นโทรศพั ทเ์ คลือ่ นที่ โดยมีสมมตฐิ านวา่ ผู้ใชต้ วั จรงิ
ตอ้ งรู้ทัง้ รหสั ผ่าน และมโี ทรศพั ทเ์ คล่อื นท่ที ่ลี งทะเบยี นไวล้ ่วงหนา้ อยใู่ นครอบครอง ก็จะทำให้ปอ้ งกันการ
สวมรอยไดด้ ีขน้ึ

ลองคดิ

รหัสเอทเี อ็มในระบบเดมิ น้ันเป็นเลขจำนวนสห่ี ลกั หากการเดาสมุ่ โดยคอมพวิ เตอรใ์ ช้เวลา 0.1 วินาทตี อ่
การเดาหนงึ่ คร้งั เวลาทีม่ ากทส่ี ดุ ทีค่ อมพิวเตอรต์ อ้ งใช้ในการเดารหสั ให้ถกู เปน็ เทา่ ใด สมมตวิ า่ ไมม่ มี าตร
การอืน่ ๆ ในการป้องกันการเดาสุ่มรหัส

9.3.4 ประตูหลัง (Back door)

การเขา้ สรู่ ะบบโดยปกตจิ ะต้องผา่ นการตรวจสอบตวั ตนของผ้ใู ช้ทกุ ครั้ง แต่บางระบบอาจจะมที างลบั หรือ
ทางลดั ขน้ั ตอนการตรวจสอบเหล่านเ้ี พอื่ เข้าสู่ระบบได้ เราเรียกช่องทางนีว้ า่ ประตูหลัง

ช่องทางน้อี าจเกิดจากผูป้ ระสงคร์ า้ ยใช้วธิ อี นื่ ๆ เพ่ือเข้าสรู่ ะบบได้แลว้ และวางประตูหลงั เอาไว้เพอ่ื
อำนวยความสะดวกใหต้ นเองเม่อื ตอ้ งการกลบั เข้ามาในระบบอีกคร้งั และหลกี เล่ยี งการตรวจจบั ความผิด
ปกตติ า่ งๆ ตามปกตทิ ผ่ี ดู้ ูแลระบบอาจจะต้งั ไว้ แต่ในบางกรณี ประตหู ลงั ก็อาจจะเกิดจากผ้พู ัฒนาหรอื
ผู้ดแู ลระบบจงใจวางเอาไว้เอง เพ่อื จะไดไ้ ม่ต้องเสียเวลาผา่ นขั้นตอนตรวจสอบและยืนยนั ตวั ตนของระบบ
เมอ่ื ต้องการเข้ามาทดสอบหรือบำรุงรักษาระบบ การประมาทเลินเลอ่ ของผู้พัฒนาหรอื ผดู้ แู ลระบบเชน่ นี้
ก็สร้างความเสยี หายใหก้ บั องคก์ รได้

9.4 การรบกวนระบบและขอ้ มลู คอมพวิ เตอร์

ตัวข้อมูลท่ีเกบ็ อยูใ่ นคอมพิวเตอร์นัน้ มีมลู คา่ เช่น อาจเป็นความลบั ทางธุรกิจ หรอื ขอ้ มลู ส่วนบุคคล หากผู้
ประสงคร์ ้ายสามารถเข้าถงึ ข้อมูลเหล่าน้ี แล้วนำไปดดั แปลงแก้ไข หรอื ลบท้ิงทำลาย ก็ก่อให้เกิดความเสีย
หายกับเจ้าของขอ้ มลู ได้ การกระทำเหลา่ นีเ้ ป็นความผิดตามพรบ. คอมพวิ เตอร์ฯ มาตรา 9

ตวั ระบบคอมพิวเตอรเ์ องนน้ั ถกู ออกแบบมาให้รองรบั การใชง้ านตามปกตขิ องผู้ใช้ หากมกี ารใชง้ านท่ี
ไม่ปกติ หรอื การรบกวนระบบ ทำให้การใชง้ านตามปกตนิ ้ันเสียไป เจา้ ของระบบรวมถึงผู้ใช้ทัว่ ไปย่อม
เดอื ดร้อน เชน่ หากระบบธนาคารไมส่ ามารถใหบ้ ริการฝากถอนเงนิ ได้ ท้ังธนาคารและลกู คา้ ของธนาคาร

118 บทท่ี 9. ความปลอดภัยและจรยิ ธรรมคอมพิวเตอร์

ย่อมเดือดรอ้ น ผู้ประสงคร์ า้ ยจึงอาจม่งุ โจมตีระบบคอมพิวเตอร์เพอื่ ให้ระบบน้ันไมส่ ามารถทำงานไดต้ าม
ปกติ การรบกวนน้มี คี วามผดิ ตามพรบ. คอมพิวเตอร์ฯ มาตรา 10

9.4.1 มลั แวร์

มัลแวร์เป็นซอฟตแ์ วร์ไมพ่ งึ ประสงค์ ซึง่ ทำสิง่ ทีผ่ ู้ใช้ไมไ่ ด้ต้องการ และรบกวนการทำงานโดยปกตขิ อง
คอมพิวเตอร์ ผู้ประสงคร์ ้ายใชม้ ัลแวร์เพือ่ วตั ถุประสงคต์ า่ งๆ กัน เช่น ลบแฟม้ ข้อมลู สำคญั ๆ ก่อกวน
การเชือ่ มตอ่ ของข่ายงาน เพ่ือไม่ให้ระบบทำงานได้ เข้ารหสั แฟม้ ขอ้ มลู ของผูใ้ ช้ เพอ่ื ไม่ให้ผู้ใชส้ ามารถใช้
ขอ้ มูลได้ หรอื เก็บขอ้ มูลตา่ งๆ ของผู้ใช้ เพอื่ นำไปหาประโยชน์ในรปู แบบอื่นในอนาคต

มลั แวร์สามารถจำแนกตามลักษณะการแพร่กระจายได้ 3 รูปแบบ ไดแ้ ก่

1. ไวรสั คอมพวิ เตอร์ ไม่สามารถแพรก่ ระจายได้ด้วยตนเอง ผูใ้ ชจ้ ำเปน็ ตอ้ งเรยี กใช้แฟ้มขอ้ มลู ทม่ี ี
ไวรสั อยู่ ไวรสั จงึ จะแพรก่ ระจายไปยังบริเวณอ่นื ๆ หรอื เครอ่ื งอนื่ ๆ ได้

2. หนอนคอมพวิ เตอร์ แพร่กระจายได้ด้วยตัวเอง ผใู้ ชไ้ ม่จำเป็นต้องเรียกใชแ้ ฟ้มข้อมูลทีม่ ีไวรสั อยู่
3. โทรจัน มีลักษณะคลา้ ยโปรแกรมปกตทิ ่ัวไป หลอกใหผ้ ้ใู ช้ตดิ ตงั้ หรอื เผยแพรต่ อ่ แต่ภายใน

ซ่อนชดุ คำสั่งหรือโปรแกรมท่ีเปน็ อนั ตรายไว้ การแพรก่ ระจายของโทรจันจึงเกิดจากการนำเข้าหรอื
ส่งต่อโดยตวั ผู้ใช้เอง

ลกั ษณะความเสียหายท่เี กิดจากมลั แวร์ หรือลกั ษณะตอ้ งสงสยั ทค่ี าดวา่ จะมีมัลแวร์ในระบบ เชน่

• ระบบคอมพวิ เตอรโ์ ดยรวมทำงานได้ช้าลง มกี ารรับสง่ ข้อมลู ในขา่ ยงานมากผดิ ปกติ มีการเรยี กใช้
อุปกรณต์ อ่ พ่วงสูงมาก หน่วยความจำเต็มหรือไม่เพียงพอตลอดเวลา เพราะทรัพยากรตา่ งๆ ของ
ระบบคอมพวิ เตอร์ถูกแบง่ ไปให้มัลแวร์ใชง้ าน

• แฟม้ ขอ้ มูลหาย มแี ฟ้มขอ้ มลู แปลกๆ ปรากฏขน้ึ มา หรอื ไม่สามารถเข้าถึงขอ้ มลู ได้ เนอ่ื งจากถูก
มัลแวร์ไปแกไ้ ขข้อมลู ต่างๆ ในดิสก์

ปจั จบุ ันพบวา่ มีมลั แวร์เรียกคา่ ไถ่ (ransomware) มากขนึ้ มลั แวร์เรยี กค่าไถ่จะเข้ารหสั ข้อมลู ในดสิ ก์
ของเหยื่อ และเรยี กคา่ ไถเ่ ปน็ ค่าถอดรหสั เป้าหมายการโจมตขี องมลั แวร์เหล่านก้ี ระจายไปที่ผู้ใช้ท่วั ไป
มากขึน้ ไมเ่ จาะจงเฉพาะองคก์ รใหญด่ งั ในอดีต

การป้องกันมลั แวร์โดยท่วั ไปทำได้โดยหลกี เล่ยี งการเปดิ แฟ้มข้อมลู หรอื การติดต้งั ซอฟตแ์ วรซ์ ่งึ ไม่
ทราบแหลง่ ทมี่ าทีช่ ัดเจน หรอื มีแหลง่ ท่มี าไมน่ า่ เชื่อถือ ปดิ การเรยี กใชม้ าโครโดยอัตโนมตั ใิ นซอฟต์แวร์
ติดตง้ั ซอฟตแ์ วรป์ ้องกนั ไวรัสเพอื่ ช่วยคัดกรองแฟ้มข้อมลู ทีม่ ลี ักษณะผดิ ปกติ รวมถงึ ใชซ้ อฟตแ์ วร์ปอ้ งกนั
การบุกรกุ จากข่ายงาน เชน่ ไฟร์วอลล์ เนอ่ื งจากมัลแวรบ์ างชนดิ สามารถแพรก่ ระจายผ่านข่ายงานได้เอง
ดว้ ย

การรกั ษาอาการตดิ มัลแวร์นน้ั อาศัยซอฟตแ์ วรป์ อ้ งกนั ไวรัสชว่ ยดำเนินการให้ ซอฟต์แวรจ์ ะพยายาม
ลบไฟลข์ องมลั แวร์ออก หรือแยกไฟล์ทีม่ ปี ัญหาใหไ้ ปอยใู่ นเขตกักกนั (quarantine zone) หากไม่
สามารถลบได้ เพื่อไม่ให้มัลแวร์รบกวนการทำงานตามปกติของเคร่อื ง แต่หากซอฟตแ์ วรป์ ้องกนั ไวรสั ไม่
สามารถกำจัดมลั แวรไ์ ด้ กจ็ ำเป็นจะต้องลา้ งระบบปฏิการและข้อมูลทง้ั หมดทง้ิ แล้วเริม่ ตน้ ตดิ ตั้งใหม่ ใน

9.4. การรบกวนระบบและข้อมลู คอมพิวเตอร์ 119

กรณขี องมัลแวรเ์ รยี กคา่ ไถก่ เ็ ช่นกัน หากไม่สามารถถอดรหสั ได้ กจ็ ำเปน็ ต้องลบขอ้ มลู ทั้งหมดทิ้ง ดงั นน้ั จึง
ควรสำรองข้อมลู ไว้เปน็ ระยะๆ เพอื่ บรรเทาความเสยี หายที่อาจจะเกิดขึน้ จากมัลแวร์

9.4.2 การโจมตีเพอ่ื ปฏเิ สธการใหบ้ รกิ าร (Denial of Service attack -
DoS attack)

ระบบคอมพวิ เตอรน์ ้นั จะถกู ออกแบบมาใหร้ องรบั การใช้งานตามปกติ แต่หากมผี ้ใู ชม้ ากจนเกินไป ระบบ
กอ็ าจไมส่ ามารถตอบสนองกับผใู้ ชไ้ ด้ ผูป้ ระสงค์ร้ายจะใช้จดุ อ่อนในนใ้ี นการโจมตีระบบโดยมีวธิ กี ารต่างๆ
เชน่

• การระดมสง่ ข้อมลู ปริมาณมากท่ไี มเ่ ป็นประโยชนเ์ ขา้ ไปรบกวนการจราจรของข้อมลู บนข่ายงาน
ทำใหช้ ่องการจราจรเต็ม การส่งขอ้ มลู ตามปกตทิ ำได้ชา้ หรืออาจทำไม่ไดเ้ ลย และทำให้ผู้ใชง้ าน
ตามปกตไิ ม่สามารถเขา้ ใชร้ ะบบได้

• การสง่ แฟม้ ขอ้ มลู ขนาดใหญ่หลายๆ แฟ้มไปวางไว้ในเนือ้ ท่ีสว่ นกลางจนเน้อื ทีเ่ ต็ม ทำให้ผใู้ ชอ้ นื่ ๆ
ไม่สามารถเขา้ ไปใชไ้ ด้

• การลบชอื่ และข้อมูลของผใู้ ชอ้ อกจากระบบ ทำให้ผู้ใชไ้ ม่สามารถเขา้ สรู่ ะบบได้

การรบกวนเหลา่ นีใ้ นบางรูปแบบอาจจะไมไ่ ดม้ คี วามพยายามในการบกุ รกุ เขา้ สู่ระบบ หรอื การแกไ้ ข

ดัดแปลงทำลายข้อมูลใดๆ ในระบบเลย แต่เปน็ การใช้งานแบบไม่ปกติซ่งึ สง่ ผลให้ระบบคอมพวิ เตอรไ์ ม่

สามารถทำงานได้ตามท่คี วรจะเปน็ ก็นับเป็นความผิดตามพรบ. คอมพวิ เตอรฯ์ เช่นกนั

รูปแบบการโจมตีเพอ่ื ปฏเิ สธการให้บริการซึ่งเปน็ ท่นี ิยมคือการโจมตีผา่ นขา่ ยงาน โดยใช้เครือ่ ง

หลายๆ เครอื่ งรว่ มกนั โจมตีเป้าหมาย (Distributed Denial of Service attack - DDoS attack)

ผูป้ ระสงค์รา้ ยมกั จะอาศยั เครอ่ื งคอมพวิ เตอรอ์ ่นื ๆ ซึ่งมีการปอ้ งกนั ออ่ น หรือไม่มกี ารปอ้ งกนั เป็นเคร่ือง

มอื ในการระดมโจมตีเป้าหมาย เรียกเครอื่ งทถ่ี กู ใช้เป็นเครอ่ื งมือเหลา่ นวี้ ่า ซอมบี้ (zombie) โดยกลมุ่

ของซอมบีท้ ใ่ี ชใ้ นการระดมโจมตีเหยอ่ื เรียกว่า botnet การสรา้ งซอมบ้ที ำไดโ้ ดยส่งมัลแวร์เข้าไปใน

เครอ่ื งเปา้ หมาย ลักษณะท่มี กั พบในเครอ่ื งท่เี ป็นซอมบ้จี งึ มีการใช้งานพนื้ ท่เี ก็บขอ้ มูลสงู มาก การติดตอ่

กบั ข่ายงานทำไดช้ า้ มาก หรอื อุปกรณ์ตอ่ พ่วงต่างๆ ไมต่ อบสนองตอ่ การใชง้ าน

มลั แวรท์ ่ีมลี กั ษณะการทำงานเปน็ การลบหรอื ดดั แปลงแฟม้ ขอ้ มลู ในระบบ ทำให้ระบบไมส่ ามารถให้

บริการตามปกติได้ กน็ ับเป็นการโจมตเี พื่อปฏเิ สธการให้บริการเชน่ เดียวกัน การปอ้ งกนั ในกรณีทสี่ าเหตุ

เกิดจากมลั แวรน์ ้ัน จึงเหมือนการปอ้ งกันมลั แวร์ตามปกติ

แตใ่ นกรณีทีก่ ารโจมตเี กิดผา่ นขา่ ยงาน การป้องกันสามารถทำได้ในระดับข่ายงานด้วย หลักการ

สำคญั คอื แยกข่ายงานภายในออกจากขา่ ยงานภายนอก แล้วใช้ซอฟตแ์ วรห์ รือระบบตา่ งๆ กำกบั ดแู ลการ

รบั สง่ ขอ้ มลู ระหวา่ งขา่ ยงานภายในและภายนอก เชน่ ใชไ้ ฟรว์ อลล์ (firewall) เพ่อื ใชก้ รองการรับส่ง

ข้อมูล ใชแ้ คช (cache) สำเนาข้อมลู ทีม่ ีการเรยี กใช้บ่อย เพื่อลดภาระของข่ายงานในการเรียกใชข้ อ้ มูล

เดิมจากภายนอกซ้ำๆ

120 บทท่ี 9. ความปลอดภัยและจริยธรรมคอมพวิ เตอร์

นอกจากการปอ้ งกันตัวในกรณที ี่อาจตกเป็นเหย่ือจากการโจมตีโดยตรงแล้ว ผ้ดู แู ลระบบควรป้องกนั
ไม่ใหเ้ ครือ่ งในระบบของตนถูกใชเ้ ป็นซอมบีเ้ พอ่ื ไปโจมตรี ะบบอ่ืนๆ ดว้ ยเช่นกนั วิธีป้องกันเป็นวธิ ีเดยี ว
เดียวกับการปอ้ งกนั มลั แวร์

การจัดการเม่อื ถูกโจมตีนน้ั กรณที ่สี ามารถระบุทม่ี าของผู้ประสงคร์ ้ายได้ เชน่ ระบชุ ือ่ ผใู้ ชท้ ่สี รา้ ง
ปญั หา หรอื ระบเุ ลขท่อี ยู่ไอพีท่ที ำการโจมตไี ด้ ผ้ดู แู ลระบบควรตัดสทิ ธิการใช้งาน หรือตดั การเชื่อมตอ่
ของผู้ประสงคร์ า้ ยออกไปกอ่ น แตใ่ นกรณีของการโจมตีแบบ DDoS นน้ั จำนวนเครอ่ื งทร่ี ะดมโจมตีอาจมี
มากเกินกว่าจะตัดการเชอื่ มตอ่ ได้หมด แนวทางทแี่ นะนำให้ผดู้ แู ลระบบใชใ้ นการรับมือจึงเปน็ ตัดเครื่องท่ี
ถูกโจมตอี อกไปจากระบบกอ่ น เพ่ือปอ้ งกนั ไม่ให้เครือ่ งอนื่ ๆ ในระบบไดร้ ับผลกระทบตามไปด้วย อยา่ งไร
ก็ตาม วิธนี ้ีก็จะทำใหผ้ ู้ใชต้ ามปกติใช้งานไมไ่ ดเ้ ชน่ เดยี วกนั นอกจากน้ี ผดู้ แู ลระบบควรเกบ็ บันทึกการ
เช่อื มตอ่ และบันทกึ การใชง้ าน (log) ของผู้ใช้ไว้ด้วย เพอ่ื ใชใ้ นการตรวจพสิ จู น์หาตัวผูป้ ระสงค์รา้ ยตอ่ ไป

ลองคดิ

วันแรกของการเปิดภาคการศกึ ษาของทุกภาคเรียนนั้นนสิ ิตจำนวนมากจะพยายามเขา้ สู่ระบบลงทะเบียน
เพ่อื ลงทะเบียนวชิ าเลอื ก จงึ ทำให้ระบบลงทะเบยี นของมหาวิทยาลยั ช้า หรอื ใช้การไมไ่ ด้ การเขา้ ส่รู ะบบ
ลงทะเบียนของนสิ ิตพรอ้ มกันจำนวนมากๆ นี้ นับเปน็ การร่วมกันโจมตีระบบลงทะเบียนหรือไม่ เพราะ
เหตุใด

9.5 การดกั รบั ข้อมูล

ในระบบคอมพิวเตอรท์ ั่วไปน้ัน ฮารด์ แวร์ หรือซอฟต์แวร์ อาจหามาเปลย่ี นทดแทนกรณสี ูญหายหรือเสยี
หายได้ แตข่ อ้ มูลน้นั เปน็ ของเฉพาะองคก์ ร หากสูญหายหรอื เสียหายกห็ ามาทดแทนได้ยาก นอกจากน้ี
หากข้อมลู ถูกขโมยกอ็ าจสรา้ งความเสยี หายทางออ้ มใหก้ บั องค์กรได้ เชน่ ขอ้ มูลผลิตภณั ฑใ์ หมข่ องบริษทั
ถกู คูแ่ ขง่ ขโมยไปทำให้บริษัทเสยี เปรยี บในการแขง่ ขนั การลักลอบทำสำเนากน็ ับเป็นการขโมยข้อมลู เช่น
กนั การขโมยขอ้ มูลมักเกิดรว่ มกับการบกุ รกุ เข้าสู่ระบบเข้ามานำข้อมลู ออกไป และอาจเกิดระหวา่ งการ
รับส่งขอ้ มลู กับข่ายงานอื่นๆ กไ็ ด้

9.5.1 ลกั ษณะการรบั สง่ ข้อมูลในระบบขา่ ยงาน

การสง่ ขอ้ มูลในข่ายงานอินเทอร์เนต็ นน้ั เปน็ การแบ่งปันเสน้ ทางการสอ่ื สารร่วมกนั หลายๆ เครอ่ื ง โดย
เคร่ืองท่ีอยูร่ ะหวา่ งเสน้ ทางจะทำหนา้ ท่ีสง่ ต่อขอ้ มูลไปให้ถงึ ปลายทาง การระบเุ ส้นทางหรอื เลอื กเส้น
ทางในการส่งข้อมูลน้ันจะทำให้ประสทิ ธิภาพโดยรวมในการส่งข้อมลู ลดลง เน่อื งจากไม่ได้ใช้ช่องทางใน
การส่อื สารอยา่ งเต็มที่ ถึงแมว้ ่าข้อมลู จะถกู ส่งไปในหลายเส้นทางก็ตาม ข่ายงานเฉพาะทแ่ี ตล่ ะแหง่ จะมี
เกตเวยเ์ ปน็ ประตูหลกั ของขอ้ มูลตา่ งๆ ทีไ่ หลเข้าออกขา่ ยงาน หากสามารถดกั ฟงั ทเ่ี ครอ่ื งเหล่านี้ กจ็ ะได้
ขอ้ มลู ทั้งหมดทไ่ี หลเขา้ ออกระบบ

9.5. การดักรับข้อมูล 121
A
B

1 B: Public

B: Public
3

2 B: Public 4
+ B: PublicB: Private

+

รปู ที่ 9.2: การเขา้ รหัสด้วยกญุ แจอสมมาตร

เน่อื งจากเราไมส่ ามารถปอ้ งกนั การไหลของขอ้ มลู ผา่ นตัวกลางได้ แนวทางป้องกนั การรัว่ ไหลของ
ข้อมลู จึงเปน็ การเขา้ รหัสขอ้ มลู เพอ่ื ไมใ่ ห้ผู้ท่ีดักรับข้อมูลอยู่สามารถตีความข้อมลู ทีด่ ักไปได้

9.5.2 การเขา้ รหสั ด้วยกุญแจสมมาตร

การเขา้ รหสั น้นั จะประกอบดว้ ย ข้อมูลต้ังต้น (plain text) และกญุ แจสำหรบั เข้าและถอดรหสั (key)
การเขา้ รหสั โดยใชก้ ญุ แจสมมาตรจะมีกุญแจท่ีใชใ้ นการเข้าและถอดรหัสเป็นดอกเดียวกัน โดยผ้สู ง่ ขอ้ มลู
จะเขา้ รหสั ดว้ ยกุญแจดอกหนง่ึ สง่ ขอ้ มลู ทีเ่ ขา้ รหสั แล้วให้ผู้รับ และสง่ กุญแจด้วยช่องทางลับให้ผู้รับ จาก
น้นั ผู้รับจงึ ถอดรหสั ขอ้ มลู ดว้ ยกญุ แจท่ีได้รบั มา

จะเห็นไดว้ า่ วิธีนก้ี ญุ แจต้องเป็นความลับ ถงึ แมต้ ัวข้อมูลจะเขา้ รหัสแลว้ หากกุญแจรัว่ ไหลก็ยงั ทำให้
ข้อมลู รั่วไหลได้ การหาวธิ ีส่งกญุ แจใหป้ ลอดภัยจึงเปน็ ปจั จยั หลกั ในการใช้กญุ แจแบบสมมาตรเพื่อการ
เข้ารหัสข้อมลู ปจั จบุ ันยังมกี ารเขา้ รหสั ดว้ ยกุญแจสมมาตรอยู่ท่วั ไป เชน่ การเขา้ รหสั แบบ WPA2 ใน
ข่ายงานไวไฟ การเขา้ รหัสแบบ 3DES สำหรับเคร่ืองจา่ ยเงนิ อิเล็กทรอนิกส์ โพรโทคอล TLS/SSL ซ่ึง
เป็นการเขา้ รหสั สำหรบั การรบั ส่งข้อมลู ในเว็บไซต์ เปน็ ต้น

9.5.3 การเขา้ รหัสดว้ ยกุญแจอสมมาตร

จากปัญหาของการสง่ กุญแจในกรณขี องกญุ แจสมมาตร จึงมีวธิ ีพัฒนาการเขา้ รหสั อกี รูปแบบหนง่ึ ซึ่งแยก
กญุ แจสำหรับเขา้ และถอดรหสั ออกจากกัน วธิ ีน้ีเรยี กวา่ การเข้ารหสั โดยใชก้ ญุ แจอสมมาตร

การใชก้ ุญแจอสมมาตรแต่ละครง้ั จะมกี ุญแจหนงึ่ คู่ เปน็ กุญแจสาธารณะ (public key) และกุญแจ
ส่วนบคุ คล (private key) ผ้ใู ชแ้ ต่ละรายจะมีค่กู ญุ แจเปน็ ของตนเอง โดยกญุ แจสาธารณะจะแจก
จ่ายโดยเปดิ เผยให้ผอู้ นื่ ใช้ได้ แต่กุญแจส่วนบคุ คลน้ันเปน็ ความลบั ในการรบั สง่ ข้อมูล ผรู้ บั ข้อมลู ตอ้ งสง่

122 บทท่ี 9. ความปลอดภัยและจริยธรรมคอมพวิ เตอร์

กุญแจสาธารณะของตนเองมาใหผ้ ้สู ง่ ขอ้ มูลกอ่ น ผสู้ ่งข้อมูลจะใชก้ ุญแจสาธารณะของผ้รู บั ข้อมูลเขา้ รหัส
แลว้ สง่ ข้อมูลซึง่ เข้ารหสั แล้วใหผ้ ูร้ ับข้อมลู การถอดรหัสจะใชก้ ญุ แจส่วนบุคคลของผรู้ ับขอ้ มูล ดังรปู ที่ 9.2
ดังน้ันแม้ขอ้ มูลทีเ่ ขา้ รหสั แล้วจะหลุดไปยงั ผปู้ ระสงค์รา้ ย ก็ยังไม่สามารถถอดรหสั ไดเ้ พราะไม่มีกญุ แจเพอ่ื
ถอดรหสั

นอกจากนี้ การเข้ารหสั แบบกญุ แจอสมมาตรอาจใช้เปน็ วิธใี นการรับสง่ กญุ แจสมมาตร เพ่ือให้การรบั
ส่งกญุ แจเป็นไปโดยลบั และสามารถใช้กุญแจสมมาตรในการติดตอ่ คร้ังต่อๆ ไปได้

ลองคิด

เม่ือใชค้ ู่กุญแจสาธารณะและกุญแจสว่ นบคุ คลในการสง่ ข้อมูลที่เปน็ ความลับ เราสามารถใชค้ ่กู ุญแจของผู้
สง่ ข้อมูลในการเข้าและถอดรหสั ไดห้ รือไม่ จงให้เหตุผลประกอบ

9.6 การปลอมแปลงตวั ตน และการส่งข้อมลู รบกวนผอู้ ่ืน

9.6.1 Spoofing และ phishing

Spoofing คอื การปลอมแปลงขอ้ มลู แสดงตัวตนบางอยา่ งเพ่ือหลอกใหผ้ ู้ใช้เข้าใจผิดวา่ การรับส่งข้อมลู
นน้ั กระทำกบั ผูอ้ ื่นซึ่งเชอ่ื ถอื ได้ ไม่ใช่ตัวผู้ประสงคร์ ้าย ตัวอยา่ งของ spoofing เช่น

• การปลอมแปลงอเี มลว่ามาจากธนาคาร
• การปลอมแปลงหมายเลขไอพเี พือ่ หลอกระบบคอมพิวเตอร์ว่ามาจากแหลง่ ทเี่ ชือ่ ถอื ได้
• การปลอมแปลงตำแหนง่ ทอี่ ยใู่ นระบบ GPS ของตนเพ่อื หลอกระบบคอมพิวเตอร์ว่าอยใู่ นพิกดั ที่

กำหนด

การปลอมแปลงตัวตนนับเป็นความผิดฐานนำเขา้ ข้อมูลปลอมเข้าส่รู ะบบคอมพิวเตอร์ ตามมาตรา 9 ใน
พรบ. คอมพวิ เตอรฯ์

Phishing เปน็ การปลอมแปลงหน้าเว็บไซต์ให้เหมอื นกบั เว็บไซตจ์ ริงเพอื่ หลอกใหเ้ หย่ือเข้ามากรอก
ขอ้ มูลในเว็บไซต์ ลักษณะเวบ็ ไซต์ท่ีมกั เปน็ เป้าหมายของ phishing คือ เวบ็ ไซต์ธนาคาร บริการจดหมาย
อเิ ล็กทรอนกิ ส์ และบริการขา่ ยงานสงั คมตา่ งๆ ผปู้ ระสงค์รา้ ยจะไดข้ ้อมลู ช่ือผู้ใชแ้ ละรหสั ผา่ นของเหยื่อ
เพือ่ นำไปใช้กับเวบ็ ไซต์จริงต่อไป

ผู้ใช้สามารถระมดั ระวังตนเองไมใ่ หเ้ ป็นเหยื่อของ phishing ได้ด้วยการพมิ พ์ URL ของเวบ็ ไซตท์ ี่
ตอ้ งการเข้าด้วยตนเองทกุ คร้ัง ไม่กดลิงกเ์ พ่อื เขา้ ส่เู วบ็ ไซต์ และตรวจสอบความถูกตอ้ งของ URL กอ่ นจะ
กรอกขอ้ มลู ตา่ งๆ เสมอ ส่วนฝั่งเจา้ ของเว็บไซตส์ ามารถรับรองตนเองไดโ้ ดยใชใ้ บรับรองดจิ ิทัล

9.6.2 ลายมอื ช่ือดจิ ิทลั (Digital signature)

การแสดงตัวตนและยนื ยนั ตวั ตนนัน้ สามารถใชต้ รวจสอบผู้ทีเ่ ขา้ ใชร้ ะบบได้ดว้ ยวธิ ีการตา่ งๆ ของระบบ
แต่การยืนยันตวั ตนบางรูปแบบซง่ึ ต้องใชข้ ้อมูลจำเพาะของตวั ผู้ใชน้ ้นั อาจไมเ่ หมาะสมหากตอ้ งการสง่

9.6. การปลอมแปลงตัวตน และการสง่ ขอ้ มูลรบกวนผอู้ นื่ 123

รปู ท่ี 9.3: ตวั อย่างใบรบั รองดิจิทัล

ข้อมลู ไปมาระหวา่ งผูใ้ ช้ และผูใ้ ชต้ อ้ งใช้ข้อมูลจำเพาะเหลา่ น้ีในการยนื ยันตวั ตนของคสู่ นทนาเมื่อเร่มิ
สนทนา

วธิ กี ารหนง่ึ ซงึ่ เปน็ ที่นยิ มคอื ใชก้ ารลงลายมอื ชื่อดจิ ทิ ลั โดยใช้คูก่ ญุ แจส่วนบุคคลและกญุ แจสาธารณะ
ของผู้สง่ ขอ้ มลู เม่อื มีการสง่ ข้อมูลต่างๆ ผู้ส่งขอ้ มูลจะลงลายมอื ช่อื ด้วยกุญแจส่วนตวั ของตนเอง ผรู้ บั
ขอ้ มลู สามารถตรวจสอบตวั ตนของผู้ส่งข้อมูลไดโ้ ดยถอดรหสั ลายมือช่อื น้นั ดว้ ยกุญแจสาธารณะของผู้สง่
หากตรงกันกแ็ สดงว่าผู้ส่งนั้นเปน็ ตวั จริง

หลกั การลงลายมือชือ่ ดจิ ิทัลใช้ยืนยนั ตวั ตนไดเ้ พราะเราถือหลกั การว่าผู้สง่ ขอ้ มูลเท่านน้ั ที่มกี ุญแจส่วน
บุคคลของตนเอง ผู้อื่นจะไมม่ ีกญุ แจนอี้ ยู่ ทำใหส้ ามารถยืนยนั ไดว้ ่าผสู้ ง่ เปน็ ตัวจริง

9.6.3 ใบรบั รองดจิ ทิ ัล (Digital certificate)

ปัญหาของการใชค้ กู่ ุญแจสว่ นบคุ คลและกญุ แจสาธารณะคอื ไม่ว่าใครกส็ ามารถสร้างคู่กญุ แจนี้ขน้ึ มาได้
เรอ่ื ยๆ และไม่สามารถยนื ยันไดว้ ่ากญุ แจสาธารณะทแ่ี จกจา่ ยอยูเ่ ปน็ ของหน่วยงานหรือบคุ คลท่กี ล่าวอ้าง
จริงหรอื ไม่ จึงเกิดหนว่ ยงานเพอ่ื รบั รองกุญแจสาธารณะขนึ้ (certificate authority) ในใบรบั รอง
จะระบุชอื่ องค์กรหรือบคุ คลผ้ถู กู รับรอง ชอ่ื ผู้รับรอง เวลาหมดอายขุ องใบรบั รอง และกญุ แจสาธารณะ
ท่ถี ูกรับรอง บริการที่สำคญั เช่น ธนาคาร ล้วนใช้บริการใบรบั รองดิจิทลั ในการรับส่งขอ้ มูลทงั้ สน้ิ เชน่
ในรูปที่ 9.3 ฝงั่ ซา้ ยแสดงชอ่ื องคก์ รที่ถูกรบั รองเป็น www.scbeasy.com ซึ่งเปน็ บรกิ ารธนาคาร
อิเลก็ ทรอนกิ ส์ของธนาคารไทยพาณชิ ย์ ใบรบั รองออกโดย Entrust Certification Authority มอี ายุ
ต้ังแต่ 29 พฤษภาคม 2012 ถึง 9 มิถนุ ายน 2013 และฝ่ังขวาแสดงขอ้ มลู กญุ แจสาธารณะทไี่ ด้รับการ

124 บทท่ี 9. ความปลอดภยั และจริยธรรมคอมพิวเตอร์
รบั รอง

9.6.4 สแปม (Spam)

สแปม คือ การสง่ ข้อความ หรอื ตัวข้อความท่ีผรู้ บั ไม่ตอ้ งการผา่ นทางจดหมายอเิ ลก็ ทรอนิกสแ์ ละจะ
สง่ หาผู้ใชพ้ รอ้ มกันคราวละหลายคน ขอ้ ความในจดหมายอาจเปน็ การโฆษณาขายสนิ คา้ หรอื บรกิ าร
ประชาสัมพนั ธ์งานหรือโอกาสในการทำธุรกิจ สแปมจัดเป็นจดหมายขยะประเภทหนึง่ ซ่งึ ทำใหผ้ ู้รับเกิด
ความไมพ่ อใจและตอ้ งเสียเวลาในการลบจดหมายทง้ิ นอกจากนนั้ แลว้ ยังเปน็ การทำให้ประสทิ ธภิ าพใน
การขนส่งขอ้ มลู ในอนิ เทอร์เน็ตลดลงด้วย การส่งสแปมเป็นการรบกวนการใช้งานของผู้อ่ืน นบั เป็นความ
ผดิ ตามพรบ. คอมพิวเตอร์ฯ มาตรา 11

ผใู้ ช้สามารถลดจำนวนของสแปมไดโ้ ดยใช้โปรแกรมรับส่งอีเมลทใี่ หผ้ ู้ใชก้ ำหนดว่าใหล้ บสแปมทิ้ง
ทนั ทอี ย่างอตั โนมัติ หรือใชก้ ารกรองอเี มล (e-mail filtering) ซ่งึ คือบริการที่ชว่ ยกรองอเี มลจากแหลง่
ท่กี ำหนดไวห้ รือจากคำสำคญั ทผี่ ้ใู ชก้ ำหนด ตวั กรองจะเกบ็ สแปมไว้ในท่ีเก็บสะสมสแปม โดยผู้ใชง้ าน
สามารถเปิดดขู อ้ มลู ได้ หรืออาจใช้โปรแกรมปอ้ งกนั สแปม (anti-spam) ซ่ึงจะพยายามลบสแปมท้ิง
ก่อนท่ีจะส่งเข้ากล่องจดหมายเข้า (inbox) ของผใู้ ช้ แต่ขอ้ เสยี ของการกรองอเี มลและโปรแกรมป้องกนั
สแปม คือ บางครงั้ ก็อาจกรองหรือลบอเี มลท่ไี ม่ใชส่ แปม ดังน้ันหากใช้ตวั กรองอเี มล ผ้ใู ช้ควรตรวจดูในที่
เก็บสแปมวา่ มอี ีเมลทตี่ อ้ งการปนอยู่ในนนั้ หรือไม่

ลองคิด

เราจะเช่ือมน่ั ได้อย่างไรว่าผ้อู อกใบรับรอง (certificate authority) น้ัน นา่ เชอ่ื ถอื

9.7 ทรพั ยส์ ินทางปญั ญา

ทรพั ย์สินทางปญั ญาแบ่งออกเป็น 2 ประเภท ไดแ้ ก่

1. ทรพั ย์สนิ ทางอุตสาหกรรม ซึ่งมีประเภทย่อยๆ ท่สี ำคัญ เชน่ สิทธบิ ตั ร อนุสิทธิบตั ร เคร่อื งหมาย
ทางการคา้ ความลบั ทางการค้า

2. ลิขสทิ ธิ์

ซอฟตแ์ วร์คอมพวิ เตอร์นั้นเปน็ ทรพั ยส์ นิ ทางปญั ญาในกลุ่มลิขสทิ ธิ์ และได้รบั ความคุ้มครองตามพระราช
บญั ญัตลิ ิขสทิ ธ์ิ พ.ศ. 2537 โดยจะคุ้มครองในสว่ นของรหสั ตน้ ฉบบั (source code) ซ่งึ จะทำให้ความ
คุ้มครองทันทีโดยไม่ต้องนำไปจดทะเบียนก่อน นอกจากน้ี รหัสต้นฉบับยังไดร้ ับความค้มุ ครองในหมวด
ความลบั ทางการคา้ ดว้ ย อยา่ งไรกต็ าม กฎหมายในประเทศไทยยังไมใ่ ห้ความคุม้ ครองแนวความคิดและ
ขั้นตอนวธิ ีในการทำงาน ซง่ึ ในบางประเทศ เชน่ สหรฐั อเมรกิ า จะให้ความคมุ้ ครองข้นั ตอนวธิ ใี นหมวด
สทิ ธิบตั ร สำหรบั ในประเทศไทยน้นั หากมีผู้ลอกเลยี นแนวคิดการทำงานแต่ไปเขยี นรหัสตน้ ฉบบั เอง จะไม่
ผดิ กฎหมาย

9.8. จรยิ ธรรมคอมพวิ เตอร์ 125

พรบ. ลิขสิทธใ์ิ ห้สิทธิขาดกบั ผู้สรา้ งสรรค์ในการทำซำ้ ดดั แปลง และเผยแพร่ ซ่ึงหากเปน็ ซอฟตแ์ วร์ ผู้
สร้างสรรคค์ ือผเู้ ขยี นรหสั ต้นฉบบั ผ้สู ร้างสรรค์สามารถขายหรอื ยกสิทธินใี้ ห้กับผ้อู ื่นได้ ไม่วา่ จะเปน็ การยก
ใหบ้ างสว่ น หรอื ให้ท้งั หมด หรือใหแ้ บบจำกดั เวลา ข้ึนกับการทำสญั ญาตกลงกนั

ซอฟต์แวรแ์ ละคลงั โปรแกรมจำนวนมากในท้องตลาดมีสญั ญาอนุญาตให้ใชง้ านไดโ้ ดยไมม่ คี า่ ใชจ้ ่าย
แต่ผู้ใชพ้ งึ อา่ นสญั ญาอนญุ าตกอ่ นทุกครัง้ เนอ่ื งจากสัญญาแต่ละฉบบั มขี อ้ จำกัดตา่ งกัน สญั ญาอนุญาตท่ี
น่าสนใจ เชน่

• GPL (GNU General Public License) อนุญาตใหน้ ำซอฟต์แวร์ไปใช้ จา่ ยแจก หรือดดั แปลง
ได้ โดยมขี ้อกำหนดวา่ ยังตอ้ งใชส้ ัญญาอนุญาตแบบเดมิ

• BSD (Berkeley Software Distribution) อนุญาตเช่นเดียวกับ GPL แต่ไมจ่ ำเป็นตอ้ งใช้
สัญญาอนุญาตแบบเดมิ เพียงแค่ต้องแสดงข้อความสัญญาอนญุ าตเดิมเอาไว้

จะเหน็ วา่ หากตอ้ งการนำซอฟตแ์ วร์หรอื คลังโปรแกรมไปดัดแปลงเพอ่ื ใชใ้ นซอฟต์แวรเ์ พื่อการค้าทจี่ ำเป็น
ตอ้ งปกปิดรหสั ตน้ ฉบับ จะไมส่ ามารถใชซ้ อฟตแ์ วรห์ รือคลังโปรแกรมทใ่ี ช้สัญญาอนญุ าตแบบ GPL ได้
นอกจากนี้ สัญญาอนุญาตสำหรบั คลังโปรแกรมท่พี ัฒนาโดยสถานศึกษามักจะระบวุ ่าให้ใชไ้ ดโ้ ดยไมม่ ีค่า
ใชจ้ ่ายเพ่ือการศึกษาเทา่ นนั้ หากตอ้ งการใชเ้ พอื่ การคา้ ต้องตดิ ตอ่ เพอื่ จา่ ยคา่ ลขิ สทิ ธ์ิ เป็นต้น

ลองคิด

หากนสิ ิตซือ้ ซอฟต์แวรห์ นึง่ ชดุ แลว้ แบง่ กับเพอื่ นใช้หลายๆ คน นสิ ิตละเมิดลขิ สิทธิข์ องผู้ผลติ ซอฟตแ์ วร์
หรือไม่ จงให้เหตผุ ลประกอบ

9.8 จริยธรรมคอมพิวเตอร์

แนวทางในการตดั สนิ ใจทำเร่ืองตา่ งๆ นัน้ เราจะเลอื กทำในส่งิ ทถ่ี กู จรยิ ธรรม หรือจรยิ ศาสตร์ เปน็ แขนง
หนง่ึ ของวชิ าปรชั ญา เป็นแนวทางท่ีใชใ้ นการตัดสนิ ถกู ผดิ นักปรชั ญาสำนักตา่ งๆ ได้เสนอแนวทางในการ
ตัดสินถูกผิดนี้ไว้หลากหลายแนว และไม่มแี นวทางไหนที่ถกู ตอ้ งทส่ี ดุ ดงั น้นั ในทางจรยิ ศาสตรแ์ ลว้ เรอื่ ง
หน่งึ อาจเปน็ ไดท้ ัง้ ถกู และผดิ ขึ้นกบั เกณฑ์ในการตดั สนิ ใจ หลกั คดิ ทน่ี ่าสนใจมีดงั น้ี

• จรยิ ศาสตรเ์ ชงิ คุณธรรม นกั ปรชั ญากรกี โบราณ เชน่ โสกราตีส อริสโตเตลิ เพลโต เชือ่ วา่ สิ่งท่ีดนี ั้น
ดีในตัวมนั เอง ไมต่ อ้ งอธิบายโดยเช่ือมโยงหรอื เกี่ยวข้องกับบริบทอน่ื ๆ เชน่ หากการชว่ ยเหลือคน
เปน็ ส่ิงท่ดี ี กไ็ ม่จำเปน็ ต้องใหเ้ หตุผลอน่ื ๆ เพอื่ ให้นำ้ หนกั สนับสนุนว่าการชว่ ยเหลอื คนเปน็ ส่ิงที่ดีอกี

• แนวทางการพจิ ารณาถกู ผดิ จากผลของการกระทำ เช่น หลักประโยชน์นยิ ม (utilitarianism)
ตัดสนิ วา่ การกระทำนัน้ ถกู ต้องหากให้ประโยชนส์ งู สุด จากตวั อยา่ งการช่วยเหลอื คนนั้น หากการ
ชว่ ยเหลอื คนจะทำใหส้ งั คมโดยรวมสงบสขุ แลว้ การชว่ ยเหลอื คนยอ่ มเปน็ สิ่งทีถ่ ูกตอ้ งและควร
กระทำตามหลักประโยชน์นิยม

126 บทท่ี 9. ความปลอดภัยและจรยิ ธรรมคอมพิวเตอร์

• แนวทางการพจิ ารณาถกู ผดิ จากการกระทำน้ันโดยไม่คำนึงถงึ ผล เชน่ อิมมานเู อล คานต์ เสนอว่า
สิ่งทถ่ี ูกตอ้ งนัน้ ตอ้ งไม่ขึน้ กบั เวลา สถานที่ และบุคคล และการกระทำที่ดีนั้นเป็นจุดหมายในตวั มนั
เอง ไม่ไดเ้ ป็นทางผ่านไปสู่เปา้ หมายอ่นื เช่น หากการช่วยเหลอื คนเป็นส่งิ ทีด่ ี เราตอ้ งช่วยเหลือทุก
คนไมว่ า่ คนนนั้ จะเป็นคนดีหรือไมด่ ี แตห่ ากการชว่ ยเหลือคนนน้ั ต้องทำไปเพอื่ ให้คนพ้นจากความ
เดือดร้อน เราไม่สามารถบอกได้วา่ การชว่ ยเหลือคนเป็นสิ่งท่ดี ี

จริยศาสตรเ์ ร่มิ เข้ามาเก่ียวข้องกับคอมพิวเตอรเ์ มื่อคอมพิวเตอรเ์ ริม่ มีบทบาทกบั ชวี ติ มนุษย์ เครื่อง
คอมพิวเตอรน์ ั้นตดั สินใจตามกฎทมี่ นุษย์ตั้งให้ แต่เครื่องไมส่ ามารถตดั สินใจเลอื กทำสิ่งทีถ่ กู ผดิ ตามหลกั
จรยิ ศาสตร์ได้ จงึ ต้องมีหลกั จริยธรรมสำหรับผู้ใช้และผูค้ วบคมุ คอมพวิ เตอร์ข้ึน

ตัวอย่างเชน่ ผูด้ แู ลระบบนน้ั มีสทิ ธใิ นการดู ดัดแปลง ลบ ข้อมูลของผใู้ ช้ แต่ผู้ดูแลระบบควรใชส้ ทิ ธิ
เหลา่ นีห้ รอื ไม่ และใชเ้ มอื่ ใดได้บ้าง ในอดีตนัน้ ยังไมม่ ีกฎหมายเข้ามาควบคมุ การใชง้ านคอมพิวเตอร์ หลัก
จรยิ ศาสตรจ์ ะเข้ามาช่วยในการตัดสินใจการกระทำต่างๆ ของผ้ใู ช้คอมพวิ เตอรไ์ ด้

ปจั จุบันประเทศไทยมี พรบ. คอมพิวเตอร์ฯ เข้ามาควบคุมการใช้คอมพิวเตอรบ์ า้ งแล้ว แตก่ ย็ ังมกี รณี
ทย่ี ังไม่ครอบคลุมอยู่ เช่น ความเปน็ ส่วนตวั ของผู้ใช้ระบบคอมพิวเตอร์ การใช้คอมพิวเตอร์เปน็ เคร่ืองมอื
ในการกลนั่ แกล้งกนั การพฒั นาซอฟตแ์ วร์ทีห่ ละหลวมแลว้ มชี อ่ งโหวร่ ้ายแรงสรา้ งความเดอื ดร้อนให้ผู้ใช้
เปน็ ตน้

9.9 ความเปน็ สว่ นตัวของข้อมลู สารสนเทศ

ปัจจบุ นั มีบรกิ ารในอนิ เทอร์เนต็ มากมายทไี่ มค่ ดิ ค่าใชจ้ ่าย เช่น บริการค้นหาเวบ็ ไซต์ บรกิ ารรบั ฝากแฟม้
ข้อมลู บรกิ ารกล่องจดหมายอิเลก็ ทรอนิกส์ บรกิ ารจองรา้ นอาหาร บริการแนะนำเส้นทาง ซึ่งผ้ใู ห้บริการ
จะเก็บข้อมลู สว่ นบคุ คลบางประการของผ้ใู ชไ้ ป และนำไปหาประโยชนจ์ ากการโฆษณาเป็นการตอบแทน
ขอ้ มูลบางประการของผใู้ ชน้ ้นั เปน็ ขอ้ มูลทอ่ี ่อนไหว เช่น ทอ่ี ยู่ หมายเลขโทรศพั ท์ ซึง่ หากหลดุ ไปอยู่ในมือ
ผปู้ ระสงคร์ ้าย ก็อาจนำไปส่กู ารปลอมตัวเป็นผใู้ ชไ้ ด้ ขอ้ มลู ตำแหน่งท่ีอยู่ การเดนิ ทาง กส็ ามารถทำใหผ้ ู้
ประสงคร์ า้ ยตดิ ตามตวั เหย่ือได้ง่ายเชน่ เดยี วกนั

แนวทางปฏิบตั โิ ดยทว่ั ไปในการเกบ็ ข้อมูลของผู้อ่ืนน้ันต้องมกี ารขออนญุ าตก่อนเสมอ และมขี อ้ ตกลง
ท่ีชดั เจนว่าจะนำข้อมลู ไปใช้ทำอะไรบ้าง บางครัง้ บริษทั ผใู้ หบ้ รกิ ารอาจไมม่ เี จตนาร้ายในการเก็บขอ้ มลู
ของลูกค้า แตบ่ รษิ ทั มภี าระหน้าที่โดยตรงทจี่ ะตอ้ งเก็บข้อมลู ของลกู คา้ ไวอ้ ย่างดี ไม่ให้ร่วั ไหล และสร้าง
ความเดือดร้อนใหล้ กู คา้ ได้ โดยเฉพาะอย่างย่งิ หากเป็นธรุ กรรมการเงนิ ตา่ งๆ

แนวทางการปกป้องความเปน็ สว่ นตวั ของตัวผใู้ ช้เองนัน้ ควรระมัดระวังการเผยแพรข่ อ้ มลู ที่ออ่ นไหว
ในอินเทอรเ์ นต็ โดยเฉพาะอย่างยิ่งในกลุม่ สาธารณะ พิจารณาสญั ญาขอ้ ตกลงให้ถี่ถ้วนกอ่ นสมคั รบรกิ าร
ต่างๆ และเลือกใช้งานเฉพาะบริการทน่ี า่ ไว้ใจ

9.9. ความเป็นสว่ นตวั ของข้อมูลสารสนเทศ 127

แบบฝึกหดั

1. หากนิสติ เขยี นซอฟตแ์ วร์ช่วยในการลงทะเบยี น ดว้ ยการใหซ้ อฟต์แวร์วนซ้ำตรวจสอบท่ีว่างในวชิ า
ท่ตี ้องการไปเร่ือยๆ จนกว่าจะวา่ ง และลงทะเบยี นวิชานน้ั ให้นิสิต นสิ ิตจะมคี วามผดิ ตามพรบ.
คอมพวิ เตอร์ฯ ในกรณใี ดหรือไม่ จงให้เหตุผลประกอบ

2. นสิ ิตคดิ วา่ การกระทำต่อไปนี้ถกู ต้องหรือไม่
“ลอกขอ้ สอบกไ็ มเ่ ปน็ ไร ขอให้ไดค้ วามรกู้ ็พอ”

อธิบายเหตุผลและหลักคดิ ประกอบดว้ ย



ภาคผนวก A

แบบฝกึ หัด

A.1 Checksum

checksum เปน็ การคำนวณคา่ เพอ่ื ตรวจสอบความถกู ต้องของข้อมลู โดยมาก checksum จะเปน็ การ
เตมิ เลข 1 หลักต่อท้ายค่าทตี่ อ้ งการ หากผูใ้ ชป้ ้อนข้อมูลผิดพลาด ค่า checksum ทค่ี ำนวณได้จะเปลยี่ น
ไป ทำให้ตรวจสอบในเบอ้ื งต้นไดว้ ่าการป้อนขอ้ มูลถูกตอ้ งหรือไม่

A.1.1 เลขประจำตัวประชาชน

การคำนวณ checksum ในเลขประจำตัวประชาชน เม่ือเลขหลักแรกอยู่ซ้ายสุด เปน็ ดงั นี้
1. นำเลขแตล่ ะหลกั มาคณู กบั เลขประจำหลัก (หลกั ที่ 13 ถึงหลกั ท่ี 2)
2. หาผลบวกของจำนวนในข้อ 1 (12 จำนวน)
3. นำผลลัพธใ์ นขอ้ 2 หารดว้ ย 11 เก็บค่าเศษเหลอื เฉพาะหลกั หนว่ ยเอาไว้
4. หาผลตา่ งของ 11 กบั เศษเหลือทไ่ี ดใ้ นข้อ 3
5. นำหลักหนว่ ยของผลลัพธใ์ นขอ้ 4 มาเปน็ เลขหลกั สุดทา้ ย (หลกั ที่ 1) ของเลขประจำตวั ประชาชน

จงเขียนโปรแกรมภาษาซเี พ่ือหาค่า checksum เม่อื ผู้ใช้ป้อนเลขประจำตวั ประชาชน (13 หลกั ) เขา้ มา
ให้ระบบ เชน่ 3 7 9 5 3 5 7 2 4 9 0 5 7 จะมี checksum เปน็ 7

130 ภาคผนวก A. แบบฝกึ หดั

คำตอบ

1 #include <stdio.h>
2 #include <stdlib.h>

3
4 int main()
5{
6 // variable declaraion
7 int d13, d12, d11, d10, d9, d8 ,d7, d6, d5, d4, d3,

d2, d1;

8
9 // read input
10 scanf(”%d %d %d %d %d %d %d %d %d %d %d %d %d”,
11 &d13, &d12, &d11, &d10, &d9, &d8, &d7, &d6, &d5,

&d4, &d3, &d2, &d1);

12
13 printf(”%d\n”, 11 - (d13 * 13 + d12 * 12 + d11 * 11

+ d10 * 10 + d9 * 9 + d8 * 8
14 + d7 * 7 + d6 * 6 + d5 * 5 + d4 * 4 + d3 * 3 + d2 *

2) % 11 % 10);

15 return 0;

16
17 }

รหัสคำสง่ั ท่ี A.1: โปรแกรมคำนวณ checksum ของเลขประจำตัวประชาชน

A.1. CHECKSUM 131

A.1.2 เลขประจำตัวนสิ ิต

เลขประจำตัวนสิ ติ 10 หลกั มคี วามหมายดงั น้ี

• สองหลกั แรกเปน็ ปีการศึกษาที่เข้า
• หลกั ท่ี 3เป็นระดับการศกึ ษา
• หลักที่ 4 - 7 เป็นเลขลำดบั
• หลกั ท่ี 8 เปน็ checksum
• สองหลักสดุ ท้ายเป็นรหสั คณะ

การคำนวณ checksum ของเลขประจำตัวนิสติ ทำได้ดังนี้

1. หารเลขปีการศึกษาด้วยสบิ นำผลหารจำนวนเตม็ ไปคณู ด้วยสาม แล้วบวกกบั เศษเหลือจากการ
หาร

2. คณู เลขระดับการศึกษาดว้ ย 7
3. คูณเลขหลักที่ 4 ด้วย 2
4. คณู เลขหลกั ท่ี 5 ดว้ ย 1
5. คูณเลขหลกั ที่ 6 ดว้ ย 3
6. คูณเลขหลักท่ี 7 ดว้ ย 7
7. หาผลบวกของข้อ 1-6 หารด้วย 11 แล้วนำเลขหลักหน่วยของผลลพั ธ์มาเป็น checksum

จงเขียนโปรแกรมภาษาซรี ับเลขประจำตวั นสิ ติ 10 หลัก แล้วตรวจสอบว่าการป้อนขอ้ มลู ถกู ต้องหรอื ไม่
โดยตรวจค่า checksum

132 ภาคผนวก A. แบบฝกึ หัด

คำตอบ

1 #include <stdio.h>
2 #include <stdlib.h>

3
4 int main()
5{
6 // variable declaraion
7 int d10, d9, d8 ,d7, d6, d5, d4, d3, d2, d1;
8 int year, item1, item2, item3, item4, item5, item6;
9 int checksum;

10
11 // read input
12 scanf(”%d %d %d %d %d %d %d %d %d %d”,
13 &d1, &d2, &d3, &d4, &d5, &d6, &d7, &d8, &d9, &

d10);

14
15 year = d1 * 10 + d2;
16 item1 = year / 10 * 3 + year % 10; // Item 1

17 // Item 2
18 item2 = d3 * 7; // Item 3
19 item3 = d4 * 2; // Item 4
20 item4 = d5 * 1; // Item 5
21 item5 = d6 * 3; // Item 6
22 item6 = d7 * 7;

23
24 checksum = (item1 + item2 + item3 + item4 + item5 +

item6) % 11 % 10;

25
26 printf(”%d %d\n”, checksum, d8);

27 return 0;

28
29 }

รหัสคำสัง่ ท่ี A.2: โปรแกรมคำนวณ checksum ของเลขประจำตัวนสิ ิต


Click to View FlipBook Version