Chương trình kiểm tra mật khẩu

Đề bài: Viết chương trình kiểm tra mật khẩu người dùng khi đăng nhập. Người dùng phải đăng nhập khi đến khi nào đúng username và password thì thôi. (username và password được định nghĩa trước trong chương trình)

Trong thực tế, các bạn sẽ gặp bài toán này rất nhiều khi xây dựng phần mềm, wesbite mà có chức năng đăng nhập. Vậy nên bài toán này là vô cùng hữu ích.

Trước tiên các bạn cần nhận ra rằng nếu người dùng nhập đúng thì không sao, nếu người dùng nhập sai thì phải nhập lại, tức là phải lặp đi lặp lại nhiều lần. Vậy phải lặp lại bao nhiêu lần? Lặp lại đến khi nào đúng thì mới thôi -> Không thể biết trước lặp bao nhiêu lần. Vậy chúng ta phải dùng cái gì? Dùng vòng lặp mà chưa biết trước số lần lặp -> Dùng while hoặc do while.

Giờ các bạn nhớ lại ý nghĩa của vòng lặp while và do while:

  • while: Trong khi cái gì đúng thì làm công việc nào đó.
  • do while: Làm công việc trong khi cái gì vẫn còn đúng.

Do 2 cấu trúc này khá giống nhau về mặt ý nghĩa và cách dùng nên các bạn có thể dùng cái nào cũng được. Tuy nhiên để ý kỹ thì chúng ta sẽ thấy sự khác biệt.

Code sử dụng vòng lặp while:

/**
*	Program login, enter username and passwrod until they correct
*/

#include <stdio.h>
#include <string.h>	// for compare string by strcmp

int main() {

	// username and password we have
	char username[] = "nguyenvanquan7826";
	char passwrod[] = "0codauem";

	// username and password user must enter to login
	char user[50], pass[50]; 

	printf("Enter your username: ");
	gets(user);

	printf("Enter your password: ");
	gets(pass);

	while(strcmp(user, username) != 0 || strcmp(pass, passwrod) != 0) {
		printf("\nusername or passwrod incorrect\n");

		printf("Enter your username: ");
		gets(user);

		printf("Enter your password: ");
		gets(pass);
	}

	printf("Login success!\n");

	return 0;
}

Trong code trên các bạn lưu ý một số điểm:
Sử dụng thư viện string.h để dùng hàm so sánh chuỗi strcmp.
Do user và pass là chuỗi nên chúng ta sử dụng gets để nhập chứ không nên dùng scanf.
Do vòng while là vòng lặp kiểm tra điều kiện trước, do đó chúng ta phải có cái gì đó cho nó kiểm tra, do vậy chúng ta cần nhập vào user và pass ở trước đó. Điều này làm code của chúng ta bị lặp lại thừa một lần ở phía trên trước khi dùng vòng while. Tuy nhiên chúng ta cũng có thể không cần nhập trước, như vậy chuỗi user và pass ban đầu sẽ rỗng.

Sau đây là code mà chúng ta sử dụng do-while.

/**
*	Program login, enter username and passwrod until they correct
*/

#include <stdio.h>
#include <string.h>	// for compare string by strcmp

int main() {

	// username and password we have
	char username[] = "nguyenvanquan7826";
	char passwrod[] = "0codauem";

	// username and password user must enter to login
	char user[50], pass[50]; 

	int count = 0; // Counting the number of login times

	do{

		if(count > 0) printf("\nusername or passwrod incorrect\n");

		printf("Enter your username: ");
		gets(user);

		printf("Enter your password: ");
		gets(pass);

		count++;

	}while(strcmp(user, username) != 0 || strcmp(pass, passwrod) != 0);
	
	printf("Login success!\n");

	return 0;
}

Trong code này, chúng ta sử dụng thêm biến count để đếm số lần login, nếu lần đầu tiên thì không hiện ra là mật khẩu sai, chỉ hiện từ lần thứ 2 trở đi mà thôi.

Về cơ bản, bài này khá dễ dàng. Hi vọng các bạn có thể nắm vững 🙂