Vòng lặp while trong ngôn ngữ C/C++

Rất vui khi được tiếp tục đồng hành cùng các bạn trong khóa học lập trình trực tuyến ngôn ngữ C++.

Trong chương trình, chúng ta sẽ cùng nhau tìm hiểu về cấu trúc vòng lặp (Loops) - một trong những cấu trúc điều khiển được sử dụng phổ biến trong ngôn ngữ C++.

Cấu trúc vòng lặp khiến chương trình thực hiện lặp đi lặp lại một chuỗi các câu lệnh cho đến khi không còn thõa mãn một điều kiện nào đó.

Ví dụ:

int main()
{
	//do A
	//do B 0 or more times
	//do C
}

Như vậy, chúng ta hiểu rằng có một cấu trúc vòng lặp được đặt tại B, nó có thể bắt buộc chương trình thực hiện công việc B 1 lần, hoặc cũng có thể thực hiện công việc B vô số lần mà không thể chuyển sang thực hiện công việc C sau đó. Số lần thực hiện công việc B nó sẽ phụ thuộc vào biểu thức điều kiện được đặt trong cấu trúc vòng lặp.

Mình lấy một ví dụ trong đời sống hằng ngày. Sinh viên A đăng kí học môn lập trình C++ tại trường đại học, nếu sinh viên A không đủ điểm để qua môn học này thì sinh viên A sẽ phải học lại. Trong trường hợp sinh viên A phải học lại lần thứ 2, chúng ta lại nói rằng nếu sinh viên A không đủ điểm qua môn học này thì sinh viên A phải học lại… Vậy việc sinh viên A học lại là công việc sẽ được lặp đi lặp lại nhiều lần trong khi điều kiện sinh viên A đủ điểm để qua môn vẫn còn sai.

While statements

While statement là cấu trúc vòng lặp đơn giản nhất trong số các kiểu vòng lặp cơ bản mà ngôn ngữ C++ cung cấp.

while (expression)
{
	statements;
}

Vòng lặp while được định nghĩa bởi từ khóa while. Một khi vòng lặp while được thực thi, biểu thức điều kiện trong while sẽ được đánh giá. Nếu biểu thức điều kiện cho giá trị đúng, các câu lệnh trong khối lệnh của vòng lặp while sẽ được thực thi.

Trong trường hợp chúng ta chỉ thực hiện 1 câu lệnh khi biểu thức điều kiện đúng, chúng ta có thể bỏ cặp dấu ngoặc nhọn đi.

while (expression)
	statement;

Nhưng mình không khuyến khích điều này.

Khác với if statement, một khi kết thúc 1 lần lặp của vòng lặp while, chương trình sẽ quay lên lại vị trí bắt đầu vòng lặp while để đánh giá lại biểu thức điều kiện, nếu biểu thức điều kiện vẫn còn cho giá trị đúng, các câu lệnh trong khối lệnh của vòng lặp while được thực hiện lại.

Ví dụ:

int main()
{
	int score = 0;
	while (score < 4)
	{
		cout << "Learn C++ programming language..." << endl;
		cout << "Enter your final score: ";
		cin >> score; //new score
	}		

	cout << "Congratulation! You passed the exam" << endl;

	system("pause");
	return 0;
}

Trong ví dụ trên, đến khi nào biến score không còn thõa mãn điều kiện (score < 4) thì vòng lặp while mới kết thúc. Chúng ta cùng xem kết quả chương trình:

Khi số điểm được nhập vào là 10, ngay lập tức mệnh đề (score < 4) được đánh giá là false, vòng lặp ngừng thực thi ngay sau đó.

Với vòng lặp while, chúng ta không thể biết trước số lần lặp lại khối công việc. Chúng ta chỉ biết rằng, vòng lặp while sẽ ngừng thực thi khi nào biểu thức điều kiện cho giá trị false.

Chúng ta có thể sử dụng thêm một biến để đếm số lần thực hiện khối lệnh của vòng lặp while:

int score = 0;
int count = 0;

while (score < 4)
{
	count++;
	cout << "Learn C++ programming language..." << endl;
	cout << "Enter your final score: ";
	cin >> score; //new score
}		

cout << "Congratulation! You passed the exam after " << count << " times" << endl;
Infinite loops

Vòng lặp vô tận xảy ra trong trường hợp không có sự tác động đến biểu thức điều kiện của vòng lặp while và nó luôn luôn đúng. Ví dụ:

int count = 0;
while (count < 10)
{
	cout << count << " ";
}

Biến count trong trường hợp này không bị ai tác động đến giá trị, nên nó vẫn là 0 và luôn bé hơn 10. Dó đó, điều kiện luôn luôn đúng và vòng lặp không thể kết thúc được.

Chúng ta có thể cố ý khai báo vòng lặp vô hạn bằng cách sau:

while (true)
{
	//This loop will be executed forever
}

Cách duy nhất để thoát ra khỏi vòng lặp vô tận là sử dụng từ khóa break, return, goto,…

Loop variables

Thông thường, chúng ta muốn vòng lặp thực hiện công việc trong một số lần có giới hạn. Để làm điều này, chúng ta thường sử dụng thêm các biến vòng lặp (loop variable), những biến này thường được sử dụng cho mục đích đếm số lần thực hiện khối lệnh của vòng lặp.

Mình lấy ví dụ chương trình đếm ngược từ 10 về 0 như sau:

int count = 10;
while (count >= 0)
{
	_sleep(1000); //stop 1000 miliseconds
	if (count == 0)
		cout << "Finished" << endl;
	else
		cout << count << " ";

	count--;
}

Kết quả:

10 9 8 7 6 5 4 3 2 1 Finished

Tại cuối vòng lặp, mình thực hiện trừ giá trị của biến count đi 1, điều này sẽ dẫn đến mệnh đề (count >= 0) sẽ sai trong tương lai. Như vậy, vòng lặp while này có điểm dừng.

Nest while loops

Cũng tương tự như if statement hay switch case statement, chúng ta có thể đặt vòng lặp while bên trong khối lệnh của vòng lặp while khác.

int outer = 1;
while (outer <= 5)
{
	int inner = 1;
	while (inner <= 5)
	{
		cout << inner << " ";
		inner++;
	}
	cout << endl; // print a newline at the end of each row
	
	outer++;
}

Cứ mỗi lần lặp của vòng lặp while ngoài, chương trình lại thực hiện toàn bộ vòng lặp while trong, sau đó thực hiện tăng biến outer lên 1 giá trị. Kết quả chương trình sẽ là:

1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5

Tổng kết

Tìm hiểu về vòng lặp while giúp chúng ta định hình tư duy về cấu trúc vòng lặp trong ngôn ngữ C/C++. Cấu trúc vòng lặp while khá ngắn gọn, dễ hiểu. Chúng ta thường sử dụng vòng lặp while cho các trường hợp số lần lặp lại công việc là chưa biết trước.

Bài tập cơ bản

1/ Viết chương trình tính tổng các số nguyên được nhập từ bàn phím cho đến khi nhập số 0 thì dừng.

2/ Viết chương trình in ra tất cả ký tự thuộc bảng mã ASCII từ 0 đến 127.

3/ Viết chương trình sử dụng vòng lặp while để chương trình in ra như sau:

1
1 2
1 2 3
1 2 3 4
1 2 3 4 5

P/s: Hẹn gặp lại các bạn trong bài học tiếp theo trong khóa học lập trình C++ hướng thực hành.

Mọi ý kiến đóng góp hoặc thắc mắc có thể đặt câu hỏi trực tiếp tại diễn đàn

www.daynhauhoc.com


Link Videos khóa học

https://www.udemy.com/c-co-ban-danh-cho-nguoi-moi-hoc-lap-trinh/learn/v4/overview

8 Likes

cho mình hỏi hàm _sleep () thuộc thư viện nào vậy :slight_smile:

1 Like

Trong Visual studio 2015, bạn có thể dùng luôn hàm _sleep(miliseconds);

Hoặc bạn có thể thêm thư viện windows.h để dùng hàm Sleep(miliseconds);

2 Likes

Mình biết rồi.
Cảm ơn bạn đã giúp đỡ.

1 Like

Em nhớ là bữa trước em dung _sleep không được :frowning:, Visual Studio 2015 bắt chuyển qua dùng hàm Sleep. Nhưng tại sao vậy anh? :confused:

1 Like

@tankhoa0000
Đây là bài tự e làm có một số vấn đề cần a giải đáp a giúp e với:
1.Làm thế nào khi e nhập số 0 thỳ nó in kết quả và hiện dòng chữ " Press any key to continue…"
2. Theo như đề bài làm thế nào để e ko dùng biến đếm i được không ??

#include<iostream>
#include<windows.h>
using namespace std;

int main()
{
	int n, i=0, Tong = 0;
	
	while (i<1000000)
	{
		i++;
		cout << "Nhap so nguyen n: ";
		cin >> n;
		if (n != 0)
			Tong = Tong + n;		
		else
			cout << "Tong = " << Tong << endl;
	}
	
	system("pause");
	return 0;
}
1 Like

Bài 3 này có cách nào ngắn hơn không mọi người. Mình lam thấy dài quá.Với cả ai sửa giúp mình cho khoảng trống chỗ này nó bé lại được không?

#include<iostream>
#include<windows.h>
using namespace std;

int main()
{
	int a = 1,b=0,c=0,d=0,e=0,f=0;
	b++; c++; d++; e++; f++;
	while (a <= 5)
	{
		while (b <= 1)
		{
			cout << b;
			b++;
		}
		cout << endl;
		
		while (c <= 2)
		{
			cout << c << " ";
			c++;
		}
		cout << endl;

		while (d <= 3)
		{
			cout << d << " ";
			d++;		
		}
		cout << endl;
		while (e <= 4)
		{
			cout << e << " ";
			e++;
		}
		cout << endl;
		while (f <= 5)
		{
			cout << f << " ";
			f++;
		}
		a++;
	}
	system("pause");
	return 0;
}
1 Like

Đây là bài của mình

#include <iostream>

using namespace std;

int main()
{
	int i = 1;
	int dem = 1;
	int n = 10;
	while (i <= n)
	{
		cout << i << "  ";
		
		if (dem == i)
		{
			cout << endl;

			if (dem == n)
			{
				break;
			}

			dem++;
			
			i = 1;
			continue;
		}	

		i++;
	}

	system("pause");
	return 0;
}
2 Likes

Dùng break để thoát khỏi vòng lập

while(true)
{
if(n == 0)
{
break;
}
}
1 Like

bài cậu hay vậy :D. Mà mình không hiểu chỗ đoạn i=1 trên chỗ continue nó có tác dụng gì vậy ??

1 Like

đoạn i =1 mà ???. Đoạn break mình hiểu rồi.

1 Like

continue dùng thể bỏ qua vòng lập hiện tại, không cho nó chạy xuống tới i++. tại vì khi dem == i thì i được gán lại về i = 1 nên ko được cho i++ (nếu i++ thì i sẽ bằng 2) nên dùng continue để bỏ qua i++

1 Like

Đây là bài mình, chỉ dùng đơn thuần vòng lặp while và 2 biến :smiley:

#include <iostream>
using namespace std;

int main()
{
	int m,n;
	m=1;
	while (m<=5)
	{
		n=1;
		while (n<=m)
		{
			cout << n ;
			n++;
			cout << " ";
		}
		cout << endl;
		m++;
	}
	system("pause");
	return 0;
}
10 Likes

Giải bài tập:

Bài 1:

   #include <iostream>
    using namespace std;

    int main()
    {
    int tong = 0; // lưu giá trị tổng các số nguyên
    int i  ; // lưu giá trị số nguyên người dùng nhập
    cout << "Ban nhap vao mot so nguyen: " ; cin >> i;

    while (i > 0)
    {
        tong = tong + i;
        cout << "Nhap vao so nguyen tiep theo: " ; cin >> i;
                
    }
    cout << "Tong la :" << tong << endl;
    cout << "ban da nhap so 0, chuong trinh ket thuc" << endl;

    //system("pause");
    return 0;
    }

Bài tập 2:

#include <iostream>
using namespace std;

int main()
{
	int i=0;
	while (i <= 127)
	{
	    cout << char(i);
	    i++;
	}
	return 0;
}

P/s : mình test code chỉ ra màn hình các ký tự có giá trị từ 32 đến 126, bạn nào giải thích giúp?

Bài tập 3 (đang bí) :joy:

Xem code @gororo thì giờ hiểu rồi, cám ơn @gororo nhé.

P/s: khóa học này hình như chưa có thầy hay trợ giảng vào chấm bài, hỗ trợ học viên nhỉ. Chắc chỉ hỗ trợ online trên udemy thôi ah :frowning:

Các ký tự không được in ra là các ký tự điều khiển. Tham khảo bảng ascii

1 Like
#include<iostream>
using namespace std;
int main() {
	int soNguyen = 1;
	int tong = 0;
	while (soNguyen != 0) {
		cin >> soNguyen;
		tong = tong + soNguyen;
		cout << "tong = " << tong << endl;
	}
	system("pause");
}
1 Like

Em muốn hỏi là trong lúc thử vòng lập while em có bấm một ký tự không phải là số và nó xuất hiện cái này. Ai có thế giải thích cho em được không ạ?.

e có ý kiến sửa câu 1 thế này ạ. mọi ng xem đc ko ạ. thanks ạ!

#include <iostream>
using namespace std;

int main()
{
int tong = 0; 
int i  ;
cout << "Ban nhap vao mot so nguyen: " ; cin >> i; // e nghĩ dòng này ko cần ạ.

while (i != 0)  //theo e thì nên dùng !=0, vì đề bài ko nói là chỉ có số dương.
{
    tong += i;   // dùng toán tử += để ngắn gọn hơn.
    cout << "Nhap vao so nguyen tiep theo: " ; cin >> i;
            
}
cout << "Tong la :" << tong << endl;
cout << "ban da nhap so 0, chuong trinh ket thuc" << endl; // e nghĩ dòng này ko phù hợp, vì 0 nhập sẽ in ra trước tong.

//system("pause");
return 0;
}
#include <iostream>

using namespace std;

int main()
{
	int outer = 1;

	while (outer <= 5)
	{
		int inner = 1;

		while (inner <= outer)
		{
			cout << inner << " ";
			inner++;
		}

		cout << endl;
		outer++;
	}

	system("pause");
	return 0;
}

chép lại bài ở trên thôi mà

1 Like

Sao mấy bạn trên làm Bài 3 có vẻ dài dòng nhỉ.
Bài 3

#include <iostream>
using namespace std;

int a,b;

int main() 
{
	while (a < 5)
	{
		b = 1;
		a++;
		while (b <= a)
		{
			cout <<b<<" ";
			b++;
		}
		cout<<endl;
	}
	system("pause>nul");
	return 0;
}

1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?