Nhờ xem giúp C++ chương trình mô phỏng máy ATM

*có tổ chức hơn :slight_smile:

^ thì luyện tập mà.

Chương trình mô phỏng thôi anh ơi, cứ từ từ rồi sẽ có ngày em nó code giao diện :))

Em là thằng chủ topic đây ạ, vì newbie chỉ đc reply 6 lần trong ngày nên em tạo thêm cái account.
Tình hình là em vừa tối ưu lại cái mớ code này rồi:
Chỉ còn hơn 150 dòng thay vì 300 dòng, ko phải chạy 2 lần switch case nữa cho dài dòng, chương trình có thể nhận diện đổi mật khẩu và ghi nhớ mật khẩu cho lần chạy tiếp theo (dùng mật khẩu mới) cũng như số tiền rút, số dư còn lại trong tài khoản… nói chung là các chức năng đã sử dụng vô tư. Tất nhiên vẫn còn một số lỗi logic mà em mỏi quá với lại thấy ko quan trọng lắm.
Mời anh em tiếp tục góp ý ạ :smile:

#include <iostream>
#include <string>
#include <windows.h> //de su dung ham Sleep()

using namespace std;

int main()
{
	string ten;
	string mat_khau = "123456";
	string mat_khau_luc_dau = "123456";
	int tuy_chon;
	int so_du = 2000000; //ban dau co 2 trieu $$$
	int so_du_moi;
	int tien_rut;
	string mat_khau_moi, mat_khau_moi_kiem_tra;
	string tai_khoan_chuyen;

	for (int i = 0; i < 10000; i++)
	{
		system("cls");
		cout << "(Lan nhap va su dung thu " << i+1 << ")\n";
		cout << "(Sau moi lan lam viec, tai khoan se tu dong dang xuat khoi chuong trinh.)\n\n";
		cout << "\t\t\tDANG NHAP TAI KHOAN CUA BAN\n";
		cout << "\nTen nguoi dung: "; cin >> ten;
		cout << "Mat khau: "; cin >> mat_khau;

		if (ten == "tien" && mat_khau == mat_khau_luc_dau)
		{
			system("cls");
			cout << "\t\t\tDANG NHAP TAI KHOAN CUA BAN\n\n";
			cout << "Dang kiem tra thong tin...\n";
			Sleep(1000);
			cout << "\nDANG NHAP THANH CONG!\a\a\n\n";
			Sleep(2000);
			system("cls");
			cout << "\t\t\tMOI BAN CHON YEU CAU CAN THUC HIEN\n\n";
			cout << "1   :     TRA CUU SO DU TAI KHOAN\n";
			cout << "2   :     RUT TIEN\n";
			cout << "3   :     DOI MAT KHAU\n";
			cout << "4   :     CHUYEN TIEN\n";
			cout << "KHAC:     THOAT\n\n";
			cin >> tuy_chon;

			if (tuy_chon == 1)
			{
				Sleep(1000);
				system("cls");
				cout << "\t\t\t\tTRA CUU SO DU\n";
				cout << "\nSo du tai khoan hien tai la: " << so_du << " VND\a\n\n";
				system("pause");
			}
			else if (tuy_chon == 2)
			{
				Sleep(1000);
				system("cls");
				cout << "\t\t\t\tRUT TIEN\n\n";
				cout << "Nhap so tien ban muon rut: ";
				cin >> tien_rut;
				while ((tien_rut % 50000 != 0) || (tien_rut) > so_du)
				{
					cout << "\a\nVUI LONG NHAP SO TIEN NHO HON HOAC BANG SO DU TRONG TAI KHOAN CUA BAN VA LA BOI SO CUA 50000:\n";
					cin >> tien_rut;
				}
				if (tien_rut <= so_du)
				{
					Sleep(1000);
					so_du_moi = so_du - tien_rut;
					so_du = so_du_moi;
					cout << "\nBAN DA RUT TIEN THANH CONG, SO DU CON LAI LA: " << so_du << " VND\a\a\n\n";
					system("pause");
				}
			}
			else if (tuy_chon == 3)
			{
				Sleep(1000);
				system("cls");
				cout << "\t\t\t\tDOI MAT KHAU\n\n";
				cout << "Moi ban nhap mat khau moi: ";
				cin >> mat_khau_moi;
				cout << "Moi ban nhap lai mat khau moi lan nua: ";
				cin >> mat_khau_moi_kiem_tra;
				Sleep(1000);
				if (mat_khau_moi == mat_khau_moi_kiem_tra)
				{
					mat_khau_luc_dau = mat_khau_moi;
					cout << "\nDang kiem tra thong tin...\n";
					Sleep(1000);
					cout << "\nDOI MAT KHAU THANH CONG!\a\a\n\n";
					cout << "\nVUI LONG DANG NHAP DE KIEM TRA MAT KHAU MOI!\n\n";
					system("pause");
					system("cls");
					cout << "\t\t\t\tDANG NHAP\n\n";
					cout << "Ten nguoi dung: "; cin >> ten;
					cout << "Mat khau: "; cin >> mat_khau;
					if (ten == "tien" && mat_khau == mat_khau_moi)
					{
						system("cls");
						cout << "\t\t\t\tDANG NHAP\n\n";
						cout << "Dang kiem tra thong tin...\n";
						Sleep(1000);
						cout << "\nDANG NHAP THANH CONG!\a\a\n\n";
						system("pause");
					}
					else if (ten != "tien" || mat_khau != mat_khau_moi)
					{
						system("cls");
						cout << "\t\t\t\tDANG NHAP\n\n";
						cout << "Dang kiem tra thong tin...\n";
						Sleep(1000);
						cout << "\nDANG NHAP THAT BAI!\a\a\n\n";
						Sleep(2000);
					}
				}
				else
				{
					cout << "\nDang kiem tra thong tin...\n";
					Sleep(1000);
					cout << "\nDOI MAT KHAU THAT BAI!\a\a\n\n";
					system("pause");
				}
			}
			else if (tuy_chon == 4)
			{
				Sleep(1000);
				system("cls");
				cout << "\t\t\t\tCHUYEN TIEN\n\n";
				cout << "Moi ban nhap ten nguoi dung can chuyen tien: ";
				cin >> tai_khoan_chuyen;
				while (tai_khoan_chuyen == "tien")
				{
					cout << "\nTen tai khoan nhan tien phai khac ten tai khoan cua ban!\a\n";
					cout << "Moi nhap lai TK can chuyen tien den: ";
					cin >> tai_khoan_chuyen;
				}
				Sleep(1000);
				system("cls");
				cout << "\t\t\t\tCHUYEN TIEN\n\n";
				cout << "Moi ban nhap so tien can chuyen: ";
				cin >> tien_rut;
				while ((tien_rut % 50000 != 0) || (tien_rut) > so_du)
				{
					cout << "\a\nVUI LONG NHAP SO TIEN NHO HON HOAC BANG SO DU TRONG TAI KHOAN CUA BAN VA LA BOI SO CUA 50000:\n";
					cin >> tien_rut;
				}
				if (tien_rut <= so_du)
				{
					Sleep(1000);
					so_du_moi = so_du - tien_rut;
					so_du = so_du_moi;
					cout << "\nBAN DA CHUYEN TIEN THANH CONG DEN TAI KHOAN " << tai_khoan_chuyen << ", SO DU CON LAI LA: " << so_du << " VND\a\a\n\n";
					system("pause");
				}
			}
			else
				{
					cout << "\n\t\tBAN DA CHON DANG XUAT KHOI CHUONG TRINH, CAM ON BAN!\a\a\n\n";
					Sleep(1000);
					break;
				}
		}
	}
		
		system("pause");
		return(0);
}

:smile: trời ạ mình gợi ý vậy rồi mà.
Nếu phần mềm nào cũng vậy thì ai dùng? Bạn thấy lúc chơi game không. Nếu bạn vẫn cứ để đó thì game mãi mãi chạy đúng không? Và bạn cũng cần làm nó chạy mãi mãi tới khi bạn tắt đi mà thôi :smile:. Để làm được việc đó thì vòng lặp 10000 lần cũng không si nhê :smile:

Đúng rồi, ai cũng dùng while True hết. Một số người thích lạ thì họ làm khác (while khác, for khác) nhưng nói chung bản chất vẫn là vòng lặp vô hạn.

1 Like

Bạn có thể cải tiến thêm chương trình như sau:
• Chia ra các hàm để dễ quản lý hơn, ví dụ hàm kiểm tra tài khoản, chuyển tiền,…v…v…
• Thay cái vòng lặp 10000 đó thành 1 vòng lặp vô hạn, chỉ thoát khi người dùng chọn thoát, (ví dụ ấn phím 4 thì thoát)
• Bạn học thêm về xử lý file input output, để lưu tên, mật khẩu số dư lại, để khi tắt hoàn toàn thì dữ liệu của chương trình vẫn còn. Bước tiến xa hơn nữa thì mã hoá cái user và pass khi lưu vào file để hacker khó có thể đọc đc tài khoản ngân hàng của bạn :smile:

Chúc thành công.

cảm ơn bạn đã góp ý.
mình đã thay vòng lặp 10000 lần bằng vòng lặp while (true) rồi, chỉ thoát CT khi người dùng chọn lệnh
2 đóng góp còn lại mình chưa học tới phần kiến thức đó, cũng rất tâm đắc cái vụ lưu đc nhiều user, password và lưu dữ liệu sau khi tắt chương trình luôn :sunglasses:
còn cái vụ mà mình nhập mật khẩu vào nó chuyển thành dấu ****** thì em ko biết làm sao, có ai biết ko chỉ em với :blush:

Lệnh này ko có trong C/C++. Dùng getch() nếu trên VS.

Cái khoản mật khẩu thì bạn có thể search Google mà.
Mình tìm được trang này: http://www.cplusplus.com/forum/general/3570/
Cụ thể thì đây là đoạn code nhập pass :sunglasses:

#include <iostream>
#include <string>
#include <conio.h>
using namespace std;
int main(){
   string pass ="";
   char ch;
   cout << "Enter pass\n";
   ch = _getch();
   while(ch != 13){ //13 là mã của phím Enter
      pass.push_back(ch);
      cout << '*';
      ch = _getch();
   }
   //Làm gì đó với pass...
}
1 Like

làm như thế này thì có kiểm tra mật khẩu bằng câu lệnh if đc ko ạ?

Được chứ bạn, đơn giản đoạn code trên chỉ nhận các kí tự bạn nhập thông qua hàm _getch() vào biến ch, kiểm tra xem kí tự nhập vào có phải phím enter ko, nếu là enter thì kết thúc việc nhập mật khẩu, còn không phải thì thêm kí tự ch mà mình get được vào biến pass. Sau đó bạn kiểm tra mật khẩu bình thường từ biến pass.

Tuy nhiên đoạn code trên chưa xoá được mật khẩu khi nhập sai (có nghĩa là khi mình ấn Backspace hay Delete không được) phần xử lý này dành cho bạn, Gợi ý cho bạn là mã hệ 10 của phím Backspace là 8 và Delete là 127.

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