Tutorial

C Language 101 - What the f__k is Repetition? (EP.4)

By Arnon Puitrakul - 28 เมษายน 2015

C Language 101 - What the f__k is Repetition? (EP.4)

กลับมาแล้ว ผิดสัญญาไปหน่อย บอกว่าจะเว้นแปบเดียว นี่เว้นนานเลย ก็ช่วงนี้มันงานยุ่งจริงๆ แถมใกล้สอบ Final แล้วอีก ร่างจะแตกและ วันนี้ (เหมือนจะ) ว่างเลยจะเขียนต่อซะเลย เข้าเรื่องกันเลยดีกว่า
วันนี้เราจะมาพูดถึงเรื่อง Repetition หรือการ "วน" เช่นยังไง เราจะเขียนโปรแกรมให้มันพิมพ์ตัวเลข 1-3 ออกมาทางหน้าจอ ถ้าไม่มี Repetition เราก็ต้องสั่งทีล่ะบรรทัด

printf("1\n");
printf("2\n");
printf("3\n");

มันก็เหนื่อยอยู่นะ (ไม่มีอะไรหรอก เพราะขี้เกียจล้วนๆ) ลองคิดเล่นๆสิครับ ถ้าเราต้องให้มันพิมพ์ถึงสัก 1 ล้าน เราคงไม่มานั่งพิมพ์ทีล่ะบรรทัดแบบนี้หรอก ฉะนั้น เราจึงต้องมีการวนลูปในโปรแกรมขึ้นมา ซึ่งใน C ถ้าไม่เอาเทคนิคอะไรยุ่งยากก็มี 3 แบบ แต่วันนี้ขอ 2 ล่ะกันนะ อีกอันไว้พูดตอนเรื่อง Function ใน EP. หน้าๆเลย

For-Loop

อันนี้จะเป็น Loop ง่ายๆที่เรา มีค่าตัวนึงเป็นตัวนับ เริ่มตั้งแต่เท่าไหร่ ถึงเท่าไหร่ (หยุดเมื่อไหร่นั่นแหละ) และนับยังไง บวกทีล่ะ 1 2 อะไรว่ากันไป Syntax ง่ายๆ

int i;
for (i = 1; i<= 3; i++) {printf("%d\n",i);}

ก่อนจะใช้ เราจะต้องประกาศตัวแปรตัวนึง เป็น int ไว้ก่อน เพื่อให้มันเป็น Counter ในลูป เช่นข้างบน เราก็ประกาศตัวแปรเป็น int ชื่อ i ไว้ก่อน และใน for เราบอกว่า ให้ i เริ่มที่ 1 และให้หยุดเมื่อ i น้อยกว่า หรือเท่ากับ 3 และสุดท้ายให้ i บวกทีล่ะ 1 ในแต่ล่ะรอบ
เพราะฉะนั้น Loop นี้จะวิ่งตั้งแต่ 1 ถึง 3 แค่ 3 รอบเอง มาลอง Adap มันง่ายๆกัน มาลองสร้างตารางสูตรคูณแม่ 2 ง่ายๆกัน ก่อนอื่น เราก็ต้องรู้ก่อนว่า เราจะท่องถึงเท่าไหร่ ในที่นี้ผมจะท่องถึง 2x12 = 24 ล่ะกัน ฉะนั้น เราต้องวนรอบตั้งแต่ 1-12 โดยเพิ่มขึ้นทีล่ะ 1 นั่นเอง มาลองดูโค๊ตกัน

int i;
for (i =1;i<=12;i++) {
   printf("2 x %d = %d\n",i,2*i);
}

ส่วน Output จะเป็นยังไงนั้น ต้องลองไปเขียนเองล่ะกันนะ จะได้หัดเขียนไปในตัวด้วย แต่ๆๆๆๆ เดี๋ยวก่อน ถ้าคิดว่าตัว for มันมีแค่นี้ ก็ง่ายไป มันจะมี for ซ้อน for ด้วยนะ (คล่อม for ด้วย for อีกชั้นนึง) มาลองกัน
จากโจทย์ข้อเมื่อกี้ เราท่องสูตรคูณแม่ 2 แม่เดียว รอบนี้เราจะมาท่องแม่ 2 ถึง 12 กันเลย
ก่อนจะเขียน เรามาดูกันก่อนว่าลูปเราควรจะหน้าตายังไง เรามาดูโค๊ตด้านบนที่เมื่อกี้เขียน อันนั้นเราเขียนให้มันเป็น 2_1 -> 2_12 ไปเรื่อยๆ ฉะนั้น 1 แม่สูตรคูณเราท่องได้และ แต่เราต้องการหลายๆแม่ เราก็จะต้องวน ที่เราท่องเมื่อกี้อีก เพื่อให้เราท่องตั้งแต่ แม่ 2-12 ฉะนั้นโค๊ตควรจะเป็น

int i,j
for (j=2;j<=12;j++){
   for (i =1;i<=12;i++) {
      printf("%d x %d = %d\n"j,i,j*i);
   }
   printf("\n");
}

จากโค๊ตข้างบน เราเอาโค๊ตเมื่อตอนแรก เข้ามาวนเป็น 10 รอบตั้งแต่ 2-12 และใน printf เราแก้นิดหน่อยจาก 2*i มันคือการท่อง แม่ 2 แต่ตอนนี้เราต้องการท่อง แม่ j (ตามรอบของลูป นอก) เราก็ต้องเปลี่ยน 2 เป็น j และ 2 ข้างหน้าก็เช่นกัน และหมดลูปแรก ผมใส่ printf("\n"); เข้าไปอีก เพื่อให้เวลาเราหมด 1 แม่ปุ๊บ เรา Enter ลงไปอีกบรรทัดนึงค่อย ท่องแม่ถัดไป อาจจะ งง นิดนึง เรื่องนี้มันงงจริงจัง ต้องใช้เวลาฝึกหน่อย

While-Loop

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

int i = 1;
while (i != 12)
{
    printf("2 * %d = %d",i,2*i);
    i++;
}

จากโปรแกรมนี้ เราลองเปลี่ยนโปรแกรม ท่องสูตรคูณแม่ 2 นิดหน่อย เรา Implement Loop ด้วย While-Loop แทน For-Loop จากที่เห็น เราจะต้องบวกตัว Counter เอง และใน While เรากำหนดเงื่อนไข เป็น i != 12 เพื่อให้มันวิ่งถึง 12 แล้วให้มันหยุด (พอมันวิ่งถึง 12 ปุ๊บ มันก็จะเด้งออกจากลูปเอง) อ้าว! แล้วจุดเริ่มของมันอยู่ตรงไหน ไม่เห็นมีเลย? มันอยู่ตรงบรรทัดที่เราประกาศตัวแปร i ขึ้นมา เราให้ค่ามันเป็น 1 เพราะฉะนั้น ลูปของเราจะวิ่งตั้งแต่ 1-12 ท่องแม่อื่นก็เช่นกัน ก็แค่เอา While ซ้อนลงไปอีกชั้นนึงก็เป็นอันเรียบร้อยแล้ว
สรุปนะครับ เรื่องนี้ถือเป็นเรื่องที่ค่อนข้างยากสำหรับมือใหม่มากๆเลย เพราะอาจจะยังงงว่า มันวิ่งยังไง คำแนะนำคือ พยายามฝึกใช้มันบ่อยๆ มองโปรแกรมเป็นส่วนๆ พยายามจับอะไรที่มันซ้ำกันมาเขียนเป็นโค๊ตอันเดียว (ประหยัดโค๊ตนั่นเอง) เขียนให้น้อยที่สุด คิดให้มากที่สุดครับ บาย ตอนหน้ามาใหม่ คงจะอีกสักพักเลยล่ะ จะสอบ Final แล้ว

Read Next...

จัดการข้อมูลบน Pandas ยังไงให้เร็ว 1000x ด้วย Vectorisation

จัดการข้อมูลบน Pandas ยังไงให้เร็ว 1000x ด้วย Vectorisation

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

ปั่นความเร็ว Python Script เกือบ 700 เท่าด้วย JIT บน Numba

ปั่นความเร็ว Python Script เกือบ 700 เท่าด้วย JIT บน Numba

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

Humanise the Number in Python with "Humanize"

Humanise the Number in Python with "Humanize"

หลายวันก่อน เราทำงานแล้วเราต้องการทำงานกับตัวเลขเพื่อให้มันอ่านได้ง่ายขึ้น จะมานั่งเขียนเองก็เสียเวลา เลยไปนั่งหา Library มาใช้ จนไปเจอ Humanize วันนี้เลยจะเอามาเล่าให้อ่านกันว่า มันทำอะไรได้ แล้วมันล่นเวลาการทำงานของเราได้ยังไง...

ทำไม 0.3 + 0.6 ถึงได้ 0.8999999 กับปัญหา Floating Point Approximation

ทำไม 0.3 + 0.6 ถึงได้ 0.8999999 กับปัญหา Floating Point Approximation

การทำงานกับตัวเลขทศนิยมบนคอมพิวเตอร์มันมีความลับซ่อนอยู่ เราอาจจะเคยเจอเคสที่ เอา 0.3 + 0.6 แล้วมันได้ 0.899 ซ้ำไปเรื่อย ๆ ไม่ได้ 0.9 เพราะคอมพิวเตอร์ไม่ได้มองระบบทศนิยมเหมือนกับคนนั่นเอง บางตัวมันไม่สามารถเก็บได้ เลยจำเป็นจะต้องประมาณเอา เราเลยเรียกว่า Floating Point Approximation...