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

มาเริ่มกันเลยดีกว่า...

อันดับที่หนึ่ง Hello World!
อันนี้ น่าจะ 99.99% คงจะเคยเขียนโปรแกรมนี้มากันแล้ว
คงไม่ต้องพูดอะไรมาก โปรแกรมก็ง่ายๆ แต่พิมพ์ Hello World ออกมาให้ได้

อันดับที่สอง Swap
ไม่มีไรมากครับ มีตัวแปร a กับ b ให้สลับค่ากัน
ง่ายๆ คือมีตัวแปร temp มาตัวนึง เก็บค่าไว้ก่อน
t = a; a=b; b=t;
ขั้นสูงหน่อยก็ไม่ต้องมี temp
a ^= b; b ^= a; a ^= b;
ดูงงๆ แต่นก็ใช้ได้นะ ไล่ตรรกะเอาครับ

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

อันดับที่สาม มาโคร
อันนี้จะเป็นการพูดถึงเรื่องของ precedence และการแทนที่มาโคร
เรื่อง precedence คือ 5+3*2+1 = 5 + (3*2) + 1
ซึ่งมันมีการลำดับเยอะมากครับ บางภาษาก็ต่างกันไปบ้าง ผมเองก็จำไม่ได้ แหะๆ

ส่วนเรื่องของมาโครก็คือ
ถ้า #define mul(a,b) a*b แล้ว mul(5+2,3) จะได้เป็น 5+2*3
ซึ่งตาม precedence rule มันจะเป็น 5 + (2*3)
ไม่ใช่ (5+2) * 3 ตามความหมายที่ควรเป็น

วิธีแก้ที่เค้าแนะนำก็คือ ใช้วงเล็บครอบตัวแปรไป
เป็น #define mul(a,b) (a)*(b)

อับดับที่สี่ The Loop
อันนี้ที่คลาสสิก เจอกันบ่อยๆ คือให้พิมพ์แบบนี้
*
**
***
****
แล้วก็จะมีลูกเล่นไปเรื่อยๆ
เช่นเป็นสามเหลี่ยมหน้าจั่วบ้าง สี่เหลี่ยมด้านขนาน
สามเหลี่ยมเอาหัวทิ่ม ฯลฯ สารพัดที่อ. และทีเอจะนึกออก
ซึ่งมันไม่มีอะไรมากครับ แค่อยากให้รู้ว่าวนลูปให้เป็น

ลูปหลักๆ มีสองประเภท คือ เช็คก่อน กะเช็คหลัง แค่นี้หล่ะครับ
เพราะฉะนั้น บางคนก็จะเจอโจทย์ให้เขียน while เป็น for หรือ for เป็น while
ส่วน do {} while เป็นลูปเช็คหลังนะครับ

อันดับที่ห้า Palindrome
(เหนื่อย)
อันนี้จะเกี่ยวกับการเล่นสตริง
และพูดถึงการมองสตริงเป็นอะเรย์ของตัวอักษร
(-- ซีไม่มีตัวแปรชนิดสตริงนะครับ!!! --)
รวมทั้งการรู้จักว่า null terminated มันเป็นยังไง
โปรแกรมอื่นๆ ในเครือนี่ก็จะมีพวก นับตัวอักษร
แปลตัวใหญ่เป็นตัวเล็ก นับคำ ฯลฯ ก็ไม่มีอะไรมากครับ
ทำเสร็จก็จะรู้จัก ASCII และ Special Char บางตัวไป

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

int fac(i) {
return (i>0)?(i*fac(i-1)):1;
}

ง่ายมั๊ย...
เรื่องของ recursive นั้น มีประโยชน์หลายอย่างครับ
เช่นเอาไปทำ DFS (Depth-First Search)
แต่บางทีมันก็มีประเด็นในการหาเงื่อนไข (ที่บางทีหายาก)
และเรื่องของการเรียกซ้อนไปหลายๆ ชั้นจน Stack Overflow - -"

อันดับที่เจ็ด Fibonacci
1 1 2 3 5 8 -- หลายคนคงรู้จักเลขชุดนี้นะครับ
มันคือ F(n) = F(n-1) + F(n-2), n > 1; F(0) = F(1) = 1
การหาเลขนี้ก็ถือได้ว่าเป็นโจทย์ที่มันมีกันทุกปี ทุกคอร์ส

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

อันดับแปด Prime
เลขจำนวนเฉพาะนั้นเองครับ
วิธีหาที่ซิมเปิลที่สุด ไล่ไปตั้งแต่ 2 ถึง n -1
ถ้ามีตัวไหนมาหารได้จบ ไม่เป็น
ถ้าเอาเร็วขึ้นมาหน่อยก็ถึง n/2

แล้วถ้าเป็นหาเลขเรียง n ตัวเลขอะไรแบบนี้
เค้าว่ากันว่าใช้ตะแกรงร่อนจะเร็วสุด
มันคือ เริ่มจาก 2 เอาทุกตัวที่หารด้วย 2 ลงตัวออก
ถัดมา 3 เอาทุกตัวที่หารด้วย 3 ลงตัวออก
ถัดมา 5 (เพราะ 4 โดนเอาออกไปแล้ว) เอาทุกตัวที่หารด้วย 5 ลงตัวออก
ไปเรื่อยๆ เหมือนการร่อนทรายนั้นเองครับ

ส่วนวิธีเช็คว่าจำนวนนี้เป็นจำนวนเฉพาะหรือไม่
มันมีทฤษฎีที่ซับซ้อน (แปลว่า ผมลืมไปแล้ว) อยู่เหมือนกัน
ซึ่งเท่าที่จำได้บางวิธีจะบอกได้แค่ว่า มันน่าจะเป็นมากๆ นะ แต่ไม่ชัวร์

อับดับที่ 9 The Math
หลังจากหาเลขจำนวนเฉพาะแล้ว
มันก็มีการคำนวณอีกหลายอย่างรออยู่
ซึ่งพวกนี้ส่วนใหญ่จะเน้นให้ใช้อะเรย์และลูปเป็น
เช่นการหาค่ามากสุด น้อยสุด ค่าเฉลี่ย
การหาคำตอบของสมการ quadratic ด้วยสูตร -b +/- root ..... อะไรนั่นอ่ะ
หรือการหาคำตอบโดยใช้กฏของ Cramer
ยากหน่อยก็น่าจะเป็นการคูณเมตริกมั๊ง ลูปเยอะ
ยากกว่าก็การหาเดทของเมตริก ถ้า 2x2 ก็ง่ายหน่อย.. เจอ 4x4 ไปก็ตาย เหอๆ

อันดับที่ 10 Sort & Search
อืมม.. อันนี้น่าจะยากสุดในสิบอย่างพื้นฐานนี้
ยากจนตอนสอบมีคนคิด Binary Sort มาได้ (คือมันไม่มีง่ะ - -')

ว่าด้วยเรื่องของการเรียงลำดับเนี่ย
อัลกอง่ายสุดก็น่าจะเป็นบับเบิลมั๊ง ประมาณว่าเรียงดะ
ค่อยๆ กระดึบๆ เรียงทีละตัว.. ช้าโคตร

ที่เข้าใจง่ายๆ หน่อยถัดมาก็น่าจะเป็น Insertion กับ Selection
สองตัวนี้คล้ายๆ กัน เขียนไม่ยากเท่าไหร่ แต่ก็ช้าอยู่ดี

เร็วสุดก็น่าจะเป็น Quick Sort มั๊ง (มั๊งนะ จำไม่ได้แล้ว - เข้าใจยากด้วย)
ส่วนที่เอามาเรียงข้อมูลใหญ่ๆ ได้ก็ Merge Sort (ใช้หลักการแบ่งเรียงทีละนิด)
แต่ถ้าข้อมูลซ้ำๆ กัน ก็ Radix Sort หรือ Bucket Sort

โอ๊ยย.. เยอะแยะสารพัดวิธีมากครับ จำบ่ได้หมด เหอๆ

ส่วนเรื่องการค้นหา
ก็มีตั้งแต่ไล่หาไปเรื่อยๆ (Linear)
การทำเป็นทรีเพื่อหาให้เร็วขึ้น
การ hash เอาไว้ก่อน แล้วหาจาก hash เอา ฯลฯ

จากเรื่องสองเรื่องนี้.. จะนำไปสู่เรื่องของโอตัวใหญ่ (บิ๊กโอ)
ซึ่งจะใช้วัดว่าอัลกอแต่ละแบบนี้ใช้เวลาเท่าไหร่ (จริงๆ มันใช้ทุกเรื่องหล่ะ Big-O เนี่ย)
เช่น
การเรียงแบบบับเบิล ใช้เวลา O(n2) คือใช้เวลาแปรตามกำลังสองของข้อมูล
การเรียงแบบ Quick ใช้เวลา O(n log n )
การหาไปเรื่อยๆ เป็น O(n) คือใช้เวลาแปรตามจำนวนข้อมูล
การหาแบบ hash O(1) คือใช้เวลาคงที่ ไม่ขึ้นกับจำนวนข้อมูล

นอกจาก Big-O แล้วยังมี Big-Omega และ Big-Theta อีกนะครับ
จำได้ว่าอ. มะนาวสอนสนุกสนาน เอิ้กๆ



....
หลังๆ เริ่มเขียนน้อย.. แบบว่าเหนื่อยครับ เหอๆ
แค่นี้ก่อนหล่ะครับ หมดแรงแล้ววว อิอิ
ว่าแต่... เคยเขียนมากันหมดหรือเปล่าครับ อิอิ

ปล. อันนี้นั่งนึกๆ มาเองนะครับ แหะๆ
อาจจะมีอะไรผิดๆ ไปบ้างนะ อิอิ
ปล2. พยายามจะใส่ลิงค์ไปวิกิให้หมด.. แต่หมดแรงก่อน รอมีแรงจะมาใส่ต่อ

Comment



smilebig smileopen-mounthed smileconfused smilesad smileangry smiletonguequestionembarrassedsurprised smilewinkdouble winkcry

ถ้านึกถึงแบบฝึกหัดแบบรวมๆ ก็จะเป็นพวกนี้ ไม่เคยเปลี่ยนเลย

- OX
- Hang Man
- เครื่องคิดเลข
- ตัดเกรด
- ... อะไรอีก
- เงินทอน (ต้องจ่ายแบงค์อะไรกี่ใบ)
- ปฏิทิน, คำนวณอายุ
เจ๋งครับ ครบหมดเลย นะเนี่ย ชอบๆ
พยายามจะช่วยนึก แต่ตอนนี้มึนงานตัวเองยังไม่เสร็จเลย (แอบมาเล่น Blog อีก อิอิ)

#3 By faith on 2006-11-29 22:22

นานมาแล้ว เคยทำข้อ 1...
ทำได้แล้วบอกกับตัวเองว่า...
"เอาดีทางด้านอื่นดีกว่า"
ฮา~

#4 By Catkun on 2006-11-29 22:25

นึกออกแหละ ป้อนจำนวนเงินแล้วแยกออกมาว่ามีแบงค์อะไรบ้าง

#5 By faith on 2006-11-29 22:25

พวก sort นี่ปวดหัวจริงด้วยหลากวิธีเต็มไปหมด

ทอนเงินนี่ก็สนุกดีครับ
ยิ่งถ้ารวมพวกไฟกระพริบ assembly นี่ยิ่งสนุกนิ
แก่แล้วชักนึกถึงความหลัง

#6 By dionysos.exe on 2006-11-29 22:58

> Fibonacci
> หรือจะขั้นสูงหน่อยก็ใช้ recursive ไป อิอิ

อันนี้ใช้ recursive มันแค่ดูขั้นสูง แต่ประสิทธิภาพต่ำ :-P


> Sort & Search
Radix -> O(n)
Bucket -> O(n)

Quick Sort จริง ๆ เข้าใจง่ายนะ มันเป็น divide & conquer ทำความเข้าใจวิธีการ divide ของมันก็จะเข้าใจได้ทันที

#7 By PaePae on 2006-11-30 00:13

เริ่มรู้สึกว่าตัวเองเป็น โปรแกรมเมอร์ป่าววะเนี่ย จำอะไรหลายๆอย่างไม่ได้เลย

#8 By ฟิวส์ on 2006-11-30 01:30

ไอ้การเขียนตัดเกรดน่าจะมีีคนเขียนเยอะนะ แถมออกเยอะด้วยโดยเฉพาะตอนปีหนึ่งเจอทุกเทอม อาจจะเพราะมันใกล้ตัวเนื่องจากจะได้รู้ว่า ต่ำกว่า 45% มัน F ฮ่า ..... (ย้ำกันจริ้งงงงงง)

#9 By Ford AntiTrust (61.7.151.213 /61.7.151.213) on 2006-11-30 01:50

เด็กเกียรตินิยมอันดับ2มหาวิทยาลัยศิลปากรเขียน Factorial ไม่เป็น
จบไปจะทำประเทศชาติล่มมั้ยครับ

#10 By kiterminal (202.44.135.35 /172.27.105.7, unknown) on 2006-11-30 02:31

พวกคักเกรดอะไรรวมอยู่ใน the math ไงครับ อิอิ
(จริงๆ คือนึกไม่ออก)

พี่เป้
fibo: จริงครับ เหอๆ
quick: ผมชอบมันก็ตรงที่ถ้าเรียงอยุ่แล้วจะเรียงช้าต้องเอามาสลับมั่วๆ ก่อนเนี่ยแหละ

dionysos.exe
ไฟกระพริบที่ผมชอบและทำง่ายสุดคือ เอาไฟคีย์บอร์ดมาเล่น สามดวงนี่แหละ กระพริบได้มันดี แถมไม่ต้องทำบอร์ดด้วย อิอิ

kiterminal
เอ่อ.. ไม่เข้าใจว่าจะสื่ออะไรครับ ไว้จะเขียนตอบแบบยาวๆ ล่ะกันครับ

#11 By ไอ้แพท.. on 2006-11-30 09:08


ตอนเรียน ป.ตรี ผมเรียนแค่ Pascal ครับ
แต่พอต้องมาใช้พวก Mathlab ทำคำนวณ ก็มึนหลาย

#12 By AkE on 2006-11-30 09:38

อยู่ในวิชา
C programming
Discrete Math
Data Structure
Principle of Programming Language

อาจารย์เคยให้เขียน
ระบบการจ่าย Invoice
ให้ คำนวณ
ค้นหา
การเล่นกับตัวอักษร เพราะมันต้องทำหน้าตา Invoice ไว้สำหรับพิมพ์

สรุป ทำ Invoice นี่ครบเลย

#13 By Na - th (นัท) on 2006-11-30 18:36

ปล. โอโหเฮะ ... นัทก็เด็กคอมเหมือนกันนะนี่
แต่ตอนเรียนอ่ะ ไม่รู้เรื่องเลย โง่วมาก ตอนโปรแกรมก็เหมือนกัน ติ๊งต๊องมากถึงมากที่สุด

เอ้อ ยังมี Regular Expression อีกด้วย รึป่าวอ่ะคะ? พี่ต่าย

#14 By Na - th (นัท) on 2006-11-30 18:37

Programmer ตรึม - -

อย่างที่พี่ต่ายว่าแหละ ไม่ว่าภาษาไหน Hello World อัมตะนิรันดรจริงๆ - -

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

สรุปเป็นผลพลอยได้ล่ะมั้ง

#15 By [[ Dr Devil ]] on 2006-12-01 22:18

uwx2r2kze8694 uwx2r2kze8694 uwx2r2kze8694 uwx2r2kze8694 uwx2r2kze8694d

#16 By mp3 ringtones (192.138.53.36) on 2006-12-04 02:42

รู้อย่างนึงว่า Hello World นี่99.99 % ชัวร์ที่เขียนเป็นโปรแกรมแรก

#17 By นพ on 2007-05-11 13:25