Lập trình C: Bài 7 – Vòng lặp while, do…while trong C
Nội dung
Ở bài trước, chúng ta đã làm quen với vòng lặp for với những tiện ích cho chúng ta việc lặp đi lặp lại nhiều lần. Bài này chúng ta tiếp tục tìm hiểu 2 loại vòng lặp khác có chức năng tương tự vòng lặp for nhưng cách dùng có khác một chút là vòng lặp while và do…while.
Các bạn có để ý đến các trang web mà chúng ta cần đăng nhập? Đơn giản như facebook hoặc google. Nếu các bạn viết sai username hoặc password thì sẽ không thể đăng nhập được dù cho bạn nhập bao nhiêu lần đi nữa. Cứ sai là họ bắt chúng ta nhập lại. Rõ ràng ở vòng for chúng ta thường nhìn thấy vòng for lặp một số lần cụ thể như từ 1 đến n,… Nhưng việc đăng nhập thì không biết bao nhiêu lần mới được mà chỉ có là đúng thì mới kết thúc. Đó là cách hoạt động của vòng lặp while và do…while.
1. Vòng lặp while
Cấu trúc vòng lặp while
Ví dụ 1:
Viết chương trình nhập vào số bất kỳ đến khi nhập số âm thì dừng lại.
#include <stdio.h> int main() { int x = 1; // make x >= 0 is true -> while will run while (x >= 0) { printf("Nhap vao mot so : "); scanf("%d", &x); } printf("Ok, Program is finish!\n"); return 0; }
Lưu ý: Ở trên mình vừa khai báo vừa gán giá trị cho biến x là 1 để đảm bảo rằng ban đầu vòng lặp while có điều kiện đúng để thực hiện được các lệnh bên trong, sau đó mỗi lần nhập thì nhập gì x nhận cái đó. Nếu không khởi gán bằng 1 thì có thể x sẽ nhận 1 giá trị ngẫu nhiên và có thể âm làm cho vòng lặp không thực hiện được.
Kết quả:
Nhap vao mot so : 4
Nhap vao mot so : 5
Nhap vao mot so : 2
Nhap vao mot so : 0
Nhap vao mot so : 1
Nhap vao mot so : -3
Ok, Program is finish!
Ví dụ 2:
In các số từ 9 về 0 theo chiều giảm dần. Các số nằm trên 1 dòng.
Thông thường các bạn sẽ nghĩ đến vòng lặp for. Ok chuẩn. Nhưng ở đây mình muốn các bạn biết cách dùng while cũng làm được.
#include <stdio.h> int main() { int n = 10; while (n--) { printf("%d ", n); } printf("\n"); return 0; }
Thật đơn giản. Tuy nhiên cần chú ý một chút là điều kiện ở vòng lặp while trong code trên là gì?
Đó là n có khác 0 hay không. khi viết while (n--)
tức là kiểm tra xem n có khác 0 hay không hoặc có thể hiểu trong khi n đúng (đúng là khác 0) thì làm công việc in ra số n. Còn việc n--
thì chỉ là trừ đi n 1 đơn vị thôi. Và có một lưu ý quan trọng trong kết quả:
9 8 7 6 5 4 3 2 1 0
Tại sao số 0 vẫn được in ra trong khi theo phân tích thì khi n = 0 tức điều kiện sai, sai thì phải thoát chứ? Đó là do biểu thức n--
của chúng ta. Khi n = 1 thì n--
sẽ làm n có giá trị 0. Nhưng do biểu thức trừ ở phía sau n nên nó thực hiện sau lệnh kiểm tra n = 0. Tức là khi n = 1 thì biểu thức while(n--)
vẫn đúng và sau đó n mới bị giảm về 0 và thực hiện lệnh in, do vậy khi in ra sẽ in cả số 0.
2. Vòng lặp do…while
Cấu trúc 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 nhập vào mật khẩu để đăng nhập.
#include <stdio.h> #include <string.h> // for strcmp function int main() { char p[20] = "Iloveyou"; // pass saved char pass[20]; // pass must enter do { printf("Enter your password: "); gets(pass); } while ( strcmp(p, pass) != 0); printf("Ok. You are login success!\n"); return 0; }
Kết quả:
Enter your password: quan
Enter your password: nguyenvanquan
Enter your password: iloveyou
Enter your password: Iloveyou
Ok. You are login success!
Lưu ý: Ở code trên, mình có dùng hàm strcmp để so sánh 2 chuỗi, hàm này nằm trong thư viện string.h
Hàm strcmp so sánh chuỗi p và chuỗi pass và cho ta kết quả:
- 1 Nếu p lớn hơn pass
- 0 Nếu p giống pass
- -1 Nếu p nhỏ hơn pass
Do vậy chúng ta có điều kiện strcmp(p, pass) != 0
tức là 2 chuỗi này không giống nhau.
Chi tiết cách so sánh 2 chuỗi, các bạn tham khảo tại bài So sánh 2 chuỗi trong C – strcmp
3. So sánh, cách dùng vòng lặp for, while, do…while
- Vòng lặp for thường sử dụng khi biết được số lần lặp xác định.
- Vòng lặp thường while, do…while sử dụng khi không biết rõ số lần lặp
- Khi gọi vòng lặp while, 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 nhưng vòng lặp do…while thực hiện được 1 lần.
Bài tập
- Viết chương trình lặp lại nhiều lần công việc nhập một ký tự và in ra mã ASCII của ký tự đó, khi nào nhập số 0 thì dừng. ( Tham khảo bảng mã ACSII )
- 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 (có) hoặc k (không). Khi nào nhập c thì dừng chương trình, còn nếu nhập k thì cứ bắt nhập lại ^^. (Gửi cho bạn gái/trai)
- Nhập vào 1 số, phân tích số đó thành tích các thừa số nguyên tố.
- Viết chương trình tìm USCLN, BSCNN của 2 số.
ở vòng lặp white vi du 1 em để int x; chương trình vẫn chạy, nhưng sao chú thích ghi phải cho x>= 0 nhỉ
Vì khi khai báo biến int x, giá trị của x sẽ không biết trước, có thể là 1 số ngẫu nhiên nào đó mà ta không kiểm soát được.
#include
int main ()
{
int x = 1;
printf(“em co yeu anh khong ?\n”);
printf(“1: co\n”);
printf(“2: khong\n”);
while(x != 1);
{
printf(“tra loi: “);
scanf(“%d”, &x);
}
printf(“i love u”);
return 0;
}
ai check giúp em … bài tập phía dưới k có ra :3
Ban đầu bạn gán x = 1 rồi thì điều kiện của while(x!=1) sẽ sai, nên vòng while không được thực hiện. Bạn nên gán cho x giá trị ban đầu là 1 số khác 1.
em gán bằng số khác 1 nó k chạy vòng lặp là sao a nhỉ @@
Bạn sai cái #include kìa. Bạn chưa chèn thư viện thì lấy gì chương trình chạy. Với lại bạn cho int x = 0 hoặc số gì đấy khác 1 để điều kiện while mới đúng được chứ.
Sau while ko có ;
Anh ơi cho em hỏi muốn in một in một lời chào ra thành 100 lờ chào thì dùng lệnh while như thế nào ạ
Mn ơi cách giải của bài nàu như nào ạ:>
Đề: cho 2 số nguyên a,b tìm số bé và số lớn(k dùng toán tử điều kiện ?: và hàm If )
#include
int main()
{
int a=0;
do {
printf(” em co yeu anh khong?:D\n”);
printf(“1: co\n”);
printf(“2: khong\n”);
printf(“tra loi di\n”);
scanf(“%d”,&a);
}
while (a!=1);
{
printf(“anh cung yeu em =))”);
}
return 0;
}
em lam the nay co duoc khong a
bạn vui tính thiệt..cho 2 đ.a mà k cho ngta chọn..
#include
int main ()
{
int x;
printf(“em co yeu anh khong \n”);
printf(“1: co\n”);
printf(“2: khong\n”);
while(x!=1)
{
printf(“tra loi: “);
scanf(“%d”, &x);
}
if(x==1)
printf(“i love u”);
f(x==2)
//printf(“nhung tao yeu m”);
return 0;
}
Em dùng vòng while…do giải bài này không được ạ
Đề: Nhập một xâu và xóa đi các dấu cách thừa để giữa mỗi từ chỉ có 1 dấu cách
#include
#include
#include
main()
{ int i;
char s[10],*p;
printf(“\n Nhap vao mot xau “);fflush(stdin);
gets(s);
while(i< strlen(s));
{
i=i++;
if(s[i]==' '&&s[i+1]==' ')
{strcpy(&s[i],&s[i+1]);
i=i–;}
}
puts(s);
}
#include
main()
{
char x;
printf(“em co yeu a k\n”);
printf(“co hoac ko\n”);
while(x!=’c’)
{
printf(“em tl di :”);
scanf(“%c”,&x);
}
printf(“i love you”);
return 0;
}
vấn đề:khi e nhập là k hay bất kỳ chữ cái nào khác c thì dòng em tl đi in ra 2 dòng ạ!!!
Bạn xem phần trôi lệnh nhé.
#include
#include
int main()
{
printf(“Anh co yeu em khong?\n”);
printf(“1. Co\n”);
printf(“2. Khong\n”);
char p[20] = “Co”;
char pass[20];
do
{
printf(” Anh tra loi di: “);
gets(pass);
} while ( strcmp(p, pass) != 0);
printf(“Ok. Em cung yeu anh\n”);
return 0;
}
Xin hỏi mọi người. Vòng lặp nào dùng nhiều điều kiện của 2 hoặc nhiều biến ạ?
Cái này là tùy cách xử lý, tùy công việc cần làm thôi.
{
int n;
scanf(“%d”, &n);
printf(“%d = 1 * “,n);
for(int i = 2;i<=n;i++){
while(n%i==0){
printf("%d * ", i);
n /= i;
}
}
return 0;
}
Bạn vào trang https://code.cachhoc.net để nộp bài nhé.
/*viet chuong trinh nhap vao mot ky tu va in ra ma ascii cua ky tu do*/
#include
#include
#include
int main()
{
char c;
while(c!=’0′)
{
c = getch();
printf(” ma ascii cua %c la: %d \n”, c, c);
}
}
hi vọng ngoài cách dùng c = getch(); như bài của em thì mong ae đóng góp cho em thêm những các khác vì dạng này khi kết hợp với while mà dùng getchar thì em thấy là nó đọc luôn cả enter xuống dòng
Dùng scanf được nhé 🙂 Bạn có thể vào trang https://chamcode.net để làm thêm nhiều bài tập hơn 🙂
cho e hỏi bài tin lớp 8 về pascal với ạ!
sử dụng câu lệnh lặp với số lần chưa biết trước, để viết chương trình nhập vào các số nguyên kết thúc khi nhập số 0. tính và in ra màn hình tổng các số nguyên vừa nhập
cảm ơn nhiều ạ
Bạn dùng repeat until nhé.
cho e hỏi là chương trình chỉ cho phép nhập hai số nguyên dương và tính tổng của nó nhập kiểu gì ak?
Bạn xem bài này nhé: https://cachhoc.net/2018/01/11/lap-trinh-c-bai-3-nhap-xuat-trong-c/#Vi_du_1-2
cho em hỏi bài 3 hướng giải như thế nào ạ ?
Xem ở đây nhé. https://cachhoc.net/2017/05/31/phan-tich-thua-nguyen/
cho em hỏi hướng làm của bài số 4 như thế nào vậy anh ?
Cái này có công thức rồi, bạn có thể tự làm.
bài 4 em anh xem giúp em với ạ em tìm ucln k ra :((((
#include
int main() {
int a[20] , b [20] , n , m , i = 1 , j = 1 ,d;
printf(“nhap n : “);
scanf(“%d”,&n);
printf(“nhap m : “);
scanf(“%d”,&m);
printf(“uoc cua n la : “);
while(i <= n/2) {
if(n % i == 0) {
printf("%d ",i);
a[j] = i ;
j++;
}
i++;
}
printf("\nuoc cua m la : ");
i = 1;
j = 1;
while(i <= m/2) {
if(m % i == 0) {
if(m % i == 0) {
printf("%d ",i);
b[j] = i;
j++;
}
}
i++;
}
for(i = 1;i <= 20;i++) {
for(j = 1;j <=20;j++) {
if(a[i] == b[j]){
d = i;
}
}
}
printf("\n %d la ucln",a[d]);
return 0;
}
Bạn có thể vào website https://chamcode.net để làm (Bài 33) để hệ thống chấm đúng sai luôn, bạn cũng dựa vào đó điều chỉnh code.
Anh cho em hỏi,dùng lệnh nào để kiểm tra hai điều kiện . vd: 0<n<=10
cảm ơn ah.
0 < n && n <=10 nhé.
#include
#include
using namespace std;
int main()
{
int n;
do
{
cout<>n;
if (n20)
{
cout<<"\n Gia tri n khong hop le, Vui long nhap lai!";
}
}while (n20);
return 0;
}
sao lúc chạy lại không đúng với điều kiện ạ
Cho em hỏi cách dùng vòng lặp do while để kiểm tra dữ liệu vào với ạ. Vid dụ như nhập giá trị a dương. Nếu a<=0 yêu cầu nhập lại đến khi thoản mãn
do {
scanf
}while(a <= 0)
Cho mình hỏi viết C++ nhập vào số nguyên dương k với điều kiện 0 < k <= 20 bằng cấu trúc lặp while thì làm sao nhở (C++ )
P/s: C++ nha bạn
while(k < = 0 || k > 20) cin >> k.