คำสั่งวนซ้ำ do-while loop ในภาษา C

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

  • การใช้งานคำสั่ง do-while loop
  • ตัวอย่างการรับค่าด้วยคำสั่ง do-while loop
  • ตัวอย่างโปรแกรมทายตัวเลข

การใช้งานคำสั่ง do-while loop

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

do {
    // statements
} while (condition);

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

จะเห็นว่าเงื่อนไขกำหนดและถูกตรวจสอบในตอนท้ายของลูป นั่นหมายความว่าในการใช้งานคำสั่ง do-while loop โปรแกรมจะทำงานในลูปก่อนอย่างน้อยหนึ่งรอบเสมอ

โดยปกติแล้วคำสั่ง do-while loop สามารถใช้ทดแทนคำสั่ง while loop ได้ ในตัวอย่างนี้ เป็นการเขียนโปรแกรมสำหรับนับตัวเลขจาก 1-10 ด้วยคำสั่ง do-while loop ในภาษา C ซึ่งมันเป็นโปรแกรมอย่างง่ายสำหรับแสดงการทำงานของลูป

counting_numbers.c
#include <stdio.h>

int main()
{
    int n = 1;
    do {
        printf("%d\n", n);
        n++;
    } while (n <= 10);
    return 0;
}

นี่เป็นผลลัพธ์การทำงานของโปรแกรม

1
2
3
4
5
6
7
8
9
10

เริ่มต้นเราได้ประกาศตัวแปร n ที่มีค่าเป็น 1 จากนั้นโปรแกรมทำงานในลูปแต่ละรอบโดยแสดงค่าในตัวแปรออกทางหน้าจอ หลังจากจบลูปในแต่ละรอบเงื่อนไข n <= 10 จะถูกตรวจสอบ ถ้าหากเป็นจริงมันจะทำงานในรอบถัดไป หรือจบการทำงานของลูปหากเงื่อนไขไม่เป็นจริง

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

counting_numbers2.c
#include <stdio.h>

int main()
{
    int n = 1;
    while (n <= 10) {
        printf("%d\n", n);
        n++;
    }
    return 0;
}

นี่เป็นผลลัพธ์การทำงานของโปรแกรม ซึ่งให้ผลลัพธ์เหมือนกับตัวอย่างก่อนหน้า

1
2
3
4
5
6
7
8
9
10

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

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

comparison.c
#include <stdio.h>

int main()
{
    printf("do-while loop\n");
    int n = 0;
    do {
        printf("%d\n", n);
        n--;
    } while (n > 0);

    printf("\nwhile loop\n");
    int m = 0;
    while (m > 0) {
        printf("%d\n", m);
        m--;
    }
    return 0;
}

นี่เป็นผลลัพธ์การทำงานของโปรแกรม

do-while loop
0
while loop

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

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

ตัวอย่างการรับค่าด้วยคำสั่ง do-while loop

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

endless_sum1.c
#include <stdio.h>

int main()
{
    int sum = 0;
    int n;
    do {
        printf("Enter number or 0 to exit: ");
        scanf("%d", &n);
        sum += n;
    } while (n != 0);

    printf("Sum of all entered numbers is: %d\n", sum);
    return 0;
}

นี่เป็นผลลัพธ์การทำงานของโปรแกรม

Enter number or 0 to exit: 2
Enter number or 0 to exit: 4
Enter number or 0 to exit: 7
Enter number or 0 to exit: -1
Enter number or 0 to exit: 8
Enter number or 0 to exit: 0
Sum of all entered numbers is: 20

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

while (n != 0);

เพื่อจบการทำงานของลูป เราเพียงแค่ต้องกรอก 0 เพื่อให้เงื่อนไขของคำสั่ง do-while loop เป็นเท็จ และโปรแกรมจะแสดงผลรวมของตัวเลขทั้งหมดที่กรอกเข้ามาออกทางหน้าจอ

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

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

endless_sum2.c
#include <stdio.h>

int main()
{
    int sum = 0;
    int n;

    printf("Enter number or 0 to exit: ");
    scanf("%d", &n);
    sum += n;

    while (n != 0) {
        printf("Enter number or 0 to exit: ");
        scanf("%d", &n);
        sum += n;
    }

    printf("Sum of all entered numbers is: %d\n", sum);
    return 0;
}

นี่เป็นผลลัพธ์การทำงานของโปรแกรม เราได้กรอกชุดของตัวเลขที่แตกต่างกันออกไป

Enter number or 0 to exit: 10
Enter number or 0 to exit: 2
Enter number or 0 to exit: 3
Enter number or 0 to exit: 0
Sum of all entered numbers is: 15

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

printf("Enter number or 0 to exit: ");
scanf("%d", &n);
sum += n;

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

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

ตัวอย่างโปรแกรมทายตัวเลข

สำหรับตัวอย่างสุดท้ายของการใช้งานคำสั่ง do-while loop ในภาษา C เราจะมาเขียนเกมทายตัวเลข โดยโปรแกรมจะสุ่มตัวเลขที่มีค่าระหว่าง 1-10 และถามให้คุณทายตัวเลขที่สุ่มมาได้จนกว่าจะถุูกต้อง นี่เป็นโค้ดของโปรแกรม

guess_the_number.c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main()
{
    srand(time(NULL));

    int secret = rand() % 10 + 1;
    int n;
    int count = 0;

    do {
        printf("Enter number to guess: ");
        scanf("%d", &n);
        count++;
    } while (n != secret);

    printf("Congrats! you have guessed it!\n");
    printf("The secret number is %d\n", secret);
    printf("Number of guesses: %d\n", count);
    return 0;
}

นี่เป็นผลลัพธ์การทำงานของโปรแกรม

Enter number to guess: 3
Enter number to guess: 8
Enter number to guess: 5
Enter number to guess: 1
Congrats! you have guessed it!
The secret number is 1
Number of guesses: 4

เนื่องจากมันเป็นเกมที่สนุกมาก เรารันและเล่นมันอีกรอบ

Enter number to guess: 10
Enter number to guess: 1
Enter number to guess: 5
Enter number to guess: 3
Enter number to guess: 4
Enter number to guess: 6
Enter number to guess: 8
Congrats! you have guessed it!
The secret number is 8
Number of guesses: 7

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

srand(time(NULL));

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

int secret = rand() % 10 + 1;

ในภาษา C เราสามารถใช้ฟังก์ชัน rand() เพื่อสุ่มตัวเลขได้ ฟังก์ชันนี้ส่งค่ากลับเป็นตัวเลขที่สุ่มได้เป็นจำนวนเต็ม และเรานำมันมาหารเอาเศษด้วย 10 และบวก 1 เข้าไปเพื่อสุ่มตัวเลขที่มีค่าระหว่าง 1-10 เพื่อนำมาใช้ในเกมของเรา

int n;
int count = 0;

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

do {
    printf("Enter number to guess: ");
    scanf("%d", &n);
    count++;
} while (n != secret);

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

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