Vòng lặp do-while

Trong bài học trước, chúng ta đã tìm hiểu về cấu trúc và cách hoạt động của vòng lặp while. Bây giờ mình sẽ giới thiệu đến các bạn vòng lặp do-while, và so sánh sự giống và khác nhau giữa 2 cấu trúc vòng lặp này để các bạn có thể chọn cấu trúc lặp cho phù hợp với những vấn đề khác nhau.

Mình lấy lại ví dụ trong bài trước: 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.

Khi sử dụng vòng lặp while để áp dụng cho trường hợp sinh viên A này, luồng thực hiện của chương trình sẽ diễn ra như sơ đồ khối sau:

Nhưng trong thực tế, có thể sinh viên A mới đăng kí học môn lập trình C++ lần đầu, lúc này sinh viên A chưa có điểm thi nhưng vẫn được đưa vào biểu thức điều kiện trong vòng lặp while để kiểm tra, như vậy vẫn giải quyết được bài toán nhưng chưa phù hợp lắm. Điều chúng ta mong muốn là sinh viên A phải thực hiện công việc “học lập trình C++” trước, sau đó chúng ta mới lấy điểm của sinh viên A để đánh giá và ra quyết định sinh viên A có phải học lại hay không.

Với cấu trúc thực hiện công việc trước và kiểm tra điều kiện sau, chúng ta nên sử dụng cấu trúc vòng lặp do-while.

Vậy sơ đồ khối của vòng lặp do-while dùng để biểu diễn bài toán của sinh viên A sẽ là:

Nhìn vào sơ đồ, chúng ta thấy sinh viên A phải học lập trình C++ ít nhất 1 lần, sau đó đưa điểm số của sinh viên A vào biểu thức điều kiện để đánh giá và quyết định sinh viên A có bị học lại hay không. Cấu trúc vòng lặp do-while áp dụng vào bài toán này phù hợp hơn cấu trúc vòng lặp while.


do-while statements

do-while statement là cấu trúc vòng lặp thứ 2 mình muốn giới thiệu đến các bạn:

do
{
	statements;
} while (expression);

Các câu lệnh bên trong khối lệnh của cấu trúc do-while sẽ được thực thi ít nhất 1 lần. Sau khi thực thi các câu lệnh, vòng lặp do-while sẽ đánh giá biểu thức điều kiện. Nếu biểu thức điều kiện đúng, chương trình quay trở lại thực hiện khối công việc của vòng lặp do-while, ngược lại, nếu biểu thức điều kiện sai, chương trình thoát khỏi vòng lặp do-while.

Lưu ý: vòng lặp do-while kết thúc bằng dấu chấm phẩy.

Ví dụ về vòng lặp do-while:

int main()
{
	int selection;
	do
	{
		cout << "_____Please make a selection_____" << endl;
		cout << "1/ Addition" << endl;
		cout << "2/ Subtraction" << endl;
		cout << "3/ Multiplication" << endl;
		cout << "4/ Division" << endl;

		cout << "Your selection: "; 
		cin >> selection;

		cout << "Do something with your selection here" << endl;

	}while (selection >= 1 && selection <= 4);		

	system("pause");
	return 0;
}

Có một điều đáng chú ý trong vòng lặp do-while là biến vòng lặp dùng cho biểu thức điều kiện cần được khai báo trước vòng lặp do-while. Vì từ khóa while được đặt bên ngoài khối lệnh của vòng lặp nên những biến khai báo bên trong khối lệnh sẽ bị hủy trước khi đến biểu thức điều kiện.

Trong chương trình trên, vòng lặp sẽ dừng lại khi các bạn lựa chọn giá trị không nằm trong khoảng [1, 4]. Lựa chọn giá trị nằm ngoài khoảng [1, 4] sẽ khiến biểu thức điều kiện sai.


Tổng kết

Khi sử dụng vòng lặp do-while các bạn chỉ cần lưu ý rằng các câu lệnh bên trong vòng lặp này sẽ được thực hiện trước khi kiểm tra biểu thức điều kiện, còn lại nó hoạt động hoàn toàn tương tự vòng lặp while mà mình đã trình bày ở bài học trước.

Bài tập cơ bản

Giả sử userID và password của chương trình được định nghĩa như bên dưới

#include <iostream>
using namespace std;

const int ID = 123;
const int password = 123456;

int main()
{
	//.................
}

Viết tiếp chương trình trên sử dụng vòng lặp do-while để kiểm tra userID và password được nhập từ bàn phím. Chương trình chỉ thực hiện tiếp khi người dùng nhập đúng userID và password. Nếu nhập sai, chương trình sẽ yêu cầu người dùng nhập lại.


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

5 Likes

Anh ơi dòng define để làm gì vậy, em đem id với password so sánh với giá trị nhập vào không được

1 Like

à define dịch sang tiếng việt có nghĩa là định nghĩa.

Mình dùng #define ID 123
thì sau này trong chương trình bắt gặp từ ID thì nó được thay thế bằng số 123.

Ví dụ:

#define ID 123

int main()
{
    cout << ID << endl;

    if(ID == 123)
    {
          //.......
    }
}

define là một trong những chỉ thị tiền xử lý (preprocessor) của C/C++. Để mình bổ sung cái này vào danh sách bài học sau.

Bạn có thể sửa lại cái đề bài là:

#include <iostream>
using namespace std;

const int ID = 123;
const int password = 123456;

int main()
{
	//.................
}
2 Likes

mình cũng mới làm bài này bạn thay “&&” bằng “||” xem thử.

2 Likes

mình làm được rồi bạn :3

1 Like

Giải bài tập:

#include <iostream>
using namespace std;

const int ID = 123;
const int password = 123456;

int main()
{
	   int id_user, password_user;
       do 
{
       cout << " Nhap vao ID: " ; cin >> id_user; cout << endl;
       cout << " Nhap vao password: " ; cin >> password_user ; cout << endl;
}
      while ((id_user != ID) || (password_user != password));
      cout << "Chuc mung ban da dang nhap thanh cong" << endl;
      //system("pause");
      return 0;
}
1 Like

bạn cho mình hỏi nếu là nhập sai hiện lên dòng " Sai tài khoản " thì thêm ở đâu vậy bạn??. Vẫn cấu trúc do while nhé

1 Like

Sai rồi nên thay && = ||
Nên nhớ vòng lập chỉ lặp lại khi nhận giá trị true (1)
(id_user != ID) && (password_user != password) có thể phát biểu như sau biểu thức chỉ trả về true (1) khi id_user khác IDđồng thời password_user khác password.
=> Vậy còn trường hợp người dùng nhập id_user đúng nhưng password_user sai và ngược lại?
(id_user != ID) || (password_user != password) có thể phát biểu như sau biểu thức chỉ trả về false (0) khi id_user bằng IDđồng thời password_user bằng password. => Thoát vòng lặp
Không biết mình diễn đạt vậy có dễ hiểu không :sweat_smile:

2 Likes

Thêm if sau khi nhập xong.

2 Likes

sao dùng hoặc được ||, kiểm tra cả 2 điều kiện phải đúng đồng thời (&&) thì mới thoát vòng lặp. Nếu hoặc thì 1 trong 2 điều kiện đúng là đúng, vì vậy sẽ dẫn đến không đúng, vì user_id hoặc password_user đúng (và ngược lại) nó cũng trả về True.

vi du : user_id = ID = 123, (password_user = 123) != (password = 123456) hoặc (user_id = 12345) != (ID=123) , password_user = passoword = 123456

nếu để hoặc (||) thì khi kiểm tra sẽ trả về True vì 1 trong 2 biểu thức trả về là true >>> nó sẽ thoát vòng lặp. Không đúng với bài toán đặt ra là đúng user và password thì mới thoát vòng lặp, không đúng thì nhập lại.

Bạn @Luu_Thanh_Vuong xem lại nhé

1 Like

Bạn tìm bảng chân trị về toán tử và (&&) và hoặc (||) hay thử thực nghiệm chỉ gõ 1 cái (id hoặc pass đúng) nhưng nó vẫn thoát vòng lặp.
Mình lấy ví dụ như vậy:
+Bạn nhập đúng id nhưng sai pass. Có thể nhận thấy trường hợp này cần phải cho người dùng nhập lại.
(id_user != ID) trả về false (0);
(password_user != password) trả về true (1);
(id_user != ID) && (password_user != password) == 0&&1==0 =>thoát vòng lặp
Trong khi: (id_user != ID) || (password_user != password) ==0||1==1=>Vẫn lặp và bắt người dùng nhập lại.

1 Like

Như mình nói ở trên khi biểu thức trả về true(1) thì vẫn lặp nhé.
while(1) lặp.
while(0) thoát.

1 Like

Mình nghĩ không thêm được dòng “Sai tài khoản” , nếu thêm dòng đó thì bạn dùng while … .

ví dụ :

const int ID = 123;
const int password = 123456;

int main()
{
     int id_user, password_user;
     cout << " Nhap vao ID: " ; cin >> id_user; 
     cout << " Nhap vao password: " ; cin >> password_user ; 

     while ((id_user != ID) || (password_user != password))
{
    cout << " Bạn đã nhập sai đề nghị bạn nhập lại";
    cout << " Nhap vao ID: " ; cin >> id_user;
    cout << " Nhap vao password: " ; cin >> password_user ; 
}
   cout << " Bạn đã đăng nhập thành công";
return 0;
}

P/s: có bạn nào cao kiến hơn thì chỉ dẫn thêm. Dùng while thì phải thêm bước nhập ban đầu ngoài vòng lặp để kiểm tra điều kiện.

1 Like

Thì đúng rồi, mình có nói gì đâu, nếu dùng hoặc (||) thì nó sẽ trả về True nếu 1 trong 2 biểu thức đúng và thoát vòng lặp. Nhưng ở đây bài toán đặt ra là : người dùng nhập vào user và pass, kiểm tra cả 2 điều kiện, là user và pass phải đúng nên phải dùng toán tử và (&&) thì mới đúng được. Dùng toán tử hoặc (||) sẽ cho kết quả sai.

Em suy nghĩ lại nhé.

1 Like

Cạn lời :angry:. Test chụp hình luôn đây
&&

||

1 Like

Ok, mình có sự nhầm lẫn. Cám ơn @Luu_Thanh_Vuong nhé. Để mình sửa code lại :smiley:

1 Like

Bạn nào đưa mình cái file .exe của chương trình này đi. đổi user và password bất kỳ luôn. :wink:
Mình vừa tìm ra cách để crack mật khẩu :sunglasses:

2 Likes

Mình gặp lỗi thế này, khi nhập sai password thì nó hiện như thế . Lần đầu mình tự viết cũng ra như vậy luôn, mình chép thử code của bạn @mrche cũng bị như thế

1 Like

2 posts were merged into an existing topic: Cách post Code dùng Markdown trong Category Programming

1 Like

em làm được bài tập đó rồi, nhưng em thấy vẫn chưa hoàn chỉnh và hợp lý cho lắm, ví dụ ở phần điều kiện của while(), em không nghĩ ra được cái gì nên đành cho một biến bool ma_xac_minh =true rồi cho vào phần điều kiện để vòng lặp thực hiện được, vậy mong các tiền bối cao kiến góp ý và chỉnh sửa, hậu bối xin cảm tạ :smiley: :smiley: , dưới đây là toàn bộ code của em

  #include <iostream>
int main() {
const int32_t  id = 123;
const int32_t password = 123456;
int32_t id_;
int32_t password_;
bool ma_xac_minh = true;
do {
	std::cout << "enter your id : \n";
	std::cin >> id_;
	std::cout << "enter your password : \n";
	std::cin >> password_;
	if (id_ == id && password_ == password) {
		
		std::cout << "logged in successfully :D \n";
		break;
	}
	else
	{
		std::cout << "have some problem with your id or password, please try again : \n";
	}

} while (ma_xac_minh);
     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?