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 แล้ว