Bài tập

Lập trình C: Bài 7 - Vòng lặp while, do...while trong C - Cách Học

Huy Erick

Trong bài trước, chúng ta đã tìm hiểu về vòng lặp for và những lợi ích của nó khi chúng ta cần lặp đi lặp lại nhiều lần. Trong bài này, chúng ta cùng khám...

Trong bài trước, chúng ta đã tìm hiểu về vòng lặp for và những lợi ích của nó khi chúng ta cần lặp đi lặp lại nhiều lần. Trong bài này, chúng ta cùng khám phá hai loại vòng lặp khác tương tự như vòng lặp for, nhưng có một số khác biệt là vòng lặp whiledo...while.

Bạn đã từng chú ý đến các trang web mà chúng ta cần đăng nhập chưa? Ví dụ như Facebook hoặc Google. Nếu bạn nhập sai tên người dùng hoặc mật khẩu, thì bạn sẽ không thể đăng nhập dù bạn nhập bao nhiêu lần đi chăng nữa. Mỗi lần nhập sai, họ sẽ yêu cầu chúng ta nhập lại. Điểm khác biệt rõ ràng giữa vòng lặp for và vòng lặp while là vòng lặp for thường được sử dụng để lặp một số lần cụ thể như từ 1 đến n, trong khi quá trình đăng nhập không biết chính xác cần bao nhiêu lần để nhập đúng. Đó chính là cách vòng lặp while và do...while hoạt động.

1. Vòng lặp while

Cấu trúc vòng lặp while

Cấu trúc, lưu đồ và cách hoạt động của vòng lặp while

Ví dụ 1:

Viết chương trình cho phép người dùng nhập một số bất kỳ và dừng lại khi nhập số âm.

#include   int main() {     int x = 1; // Đảm bảo rằng điều kiện ban đầu là đúng     while (x >= 0) {         printf("Nhập vào một số: ");         scanf("%d", &x);     }      printf("Ok, Chương trình đã hoàn thành!\n");     return 0; }

Lưu ý: Trong đoạn code trên, chúng ta khai báo và gán giá trị ban đầu cho biến x là 1 để đảm bảo rằng điều kiện ban đầu của vòng lặp while là đúng, từ đó thực hiện các lệnh bên trong. Sau đó, mỗi lần nhập, giá trị nhập vào sẽ được gán cho biến x. Nếu không khởi gán giá trị ban đầu bằng 1, x có thể nhận một giá trị ngẫu nhiên và có thể âm, khiến cho vòng lặp không thực hiện được.

Kết quả:

Nhập vào một số: 4 Nhập vào một số: 5 Nhập vào một số: 2 Nhập vào một số: 0 Nhập vào một số: 1 Nhập vào một số: -3 Ok, Chương trình đã hoàn thành!

Ví dụ 2:

In ra các số từ 9 đến 0 theo thứ tự giảm dần, các số nằm trên cùng một dòng.

Thông thường, khi chúng ta nghĩ đến vòng lặp for. Đây là cách tiêu chuẩn. Tuy nhiên, ở đây tôi muốn cho bạn biết rằng vòng lặp while cũng có thể làm được điều đó.  ```c #include   int main() {     int n = 10;     while (n--) {         printf("%d ", n);     }     printf("\n");     return 0; }

Đơn giản phải không? Tuy nhiên, hãy chú ý rằng điều kiện trong vòng lặp while là gì?

Điều kiện trong trường hợp này là xem n có khác 0 hay không. Khi viết while (n--), điều này có nghĩa là kiểm tra xem n có khác 0 hay không, và trong khi n là đúng (khác 0), chúng ta sẽ in ra số n. Còn việc n-- chỉ đơn giản là giảm giá trị của n đi 1 đơn vị. Và có một điều quan trọng cần lưu ý trong kết quả:

9 8 7 6 5 4 3 2 1 0

Vì sao số 0 vẫn được in ra mặc dù theo phân tích thì khi n = 0 thì điều kiện sai, và khi điều kiện sai thì vòng lặp while không được thực hiện nữa? Điều này là do biểu thức n-- của chúng ta. Khi n = 1, biểu thức n-- sẽ làm cho n có giá trị 0. Tuy nhiên, vì biểu thức giảm được đặt ở phía sau n, nó sẽ được thực hiện sau khi kiểm tra điều kiện n = 0. Điều này có nghĩa là khi n = 1, biểu thức while (n--) vẫn đúng và sau đó n mới bị giảm xuống 0 và thực hiện lệnh in ra số n. Do đó, kết quả in ra sẽ bao gồm cả số 0.

2. Vòng lặp do...while

Cấu trúc vòng lặp do...while

Cấu trúc, lưu đồ và cách hoạt động của vòng lặp do...while

Ví dụ 1:

Lưu trước mật khẩu Facebook của bạn. Hãy viết chương trình cho phép nhập mật khẩu để đăng nhập.

#include  #include  // for strcmp function  int main() {     char p[20] = "Iloveyou"; // Mật khẩu đã lưu     char pass[20]; // Mật khẩu phải nhập     do {         printf("Nhập mật khẩu của bạn: ");         gets(pass);     } while ( strcmp(p, pass) != 0);      printf("Ok. Bạn đã đăng nhập thành công!\n");     return 0; }

Kết quả:

Nhập mật khẩu của bạn: quan Nhập mật khẩu của bạn: nguyenvanquan Nhập mật khẩu của bạn: iloveyou Nhập mật khẩu của bạn: Iloveyou Ok. Bạn đã đăng nhập thành công!

Lưu ý: Trong đoạn code trên, chúng ta sử dụng hàm strcmp để so sánh hai chuỗi, hàm này có sẵn trong thư viện string.h.

Hàm strcmp so sánh chuỗi p và chuỗi pass và trả về kết quả sau:

  • 1 nếu p lớn hơn pass
  • 0 nếu p giống pass
  • -1 nếu p nhỏ hơn pass

Vì vậy, chúng ta có điều kiện strcmp(p, pass) != 0 tức là hai chuỗi này không giống nhau.

Lưu ý: Chi tiết về cách so sánh hai chuỗi, bạn có thể tham khảo tại bài viết "So sánh hai chuỗi trong C - strcmp".

3. So sánh và cách sử dụng vòng lặp for, while, do...while

  • Vòng lặp for thường được sử dụng khi chúng ta biết điểm dừng cụ thể của vòng lặp.
  • Vòng lặp while và do...while thường được sử dụng khi chúng ta không biết chính xác số lần lặp.
  • Khi gọi vòng lặp while hoặc do...while, nếu điều kiện sai, vòng lặp while sẽ không được thực hiện lần nào, trong khi vòng lặp do...while sẽ được thực hiện ít nhất một lần.

Bài tập:

  1. Viết chương trình cho phép người dùng nhập một ký tự và in ra mã ASCII của ký tự đó, dừng lại khi nhập số 0. (Tham khảo bảng mã ASCII)
  2. Viết chương trình in ra chữ: "Em có yêu anh không?", và cho người dùng nhập 'c' nếu có yêu anh hoặc 'k' nếu không. Khi nào người dùng nhập 'c' thì dừng chương trình, còn nếu nhập 'k' thì yêu cầu người dùng nhập lại. (Gửi cho bạn gái/bạn trai)
  3. Nhập vào một số, phân tích số đó thành các thừa số nguyên tố.
  4. Viết chương trình để tìm Ước số chung lớn nhất (USCLN) và Bội số chung nhỏ nhất (BSCNN) của hai số.
1