Nhờ xem giúp C++ chương trình mô phỏng máy ATM
Em là newbie mới học lập trình, trước giờ chỉ biết vài ba chữ Pascal học năm 11.
Vừa thi đại học xong chuẩn bị đi học đại học, trong lúc chờ đi học em có tự học C++ ở nhà.
Hiện em đang học khóa C++ free trên cpp.daynhauhoc.com
Em có dùng các lệnh if else, switch case, while và một số thứ đơn giản như Sleep, system(“cls”) để viết chương trình mô phỏng máy ATM (chưa đc hoàn thiện), ban đầu chỉ là chương trình kiểm tra ID, mật khẩu nhưng e nảy sinh thêm ý tưởng dùng switch case để thêm tùy chọn giống như máy ATM
Chương trình này chả có gì rắc rối nhưng dài vì cái switch case em lặp lại 2 lần, các anh em xem code của em, em thấy nó còn dài dòng quá, chắc chắn là chương trình cũng chưa hoàn chỉnh vì em nghĩ trình C++ 1 tháng thì …
#include <iostream>
#include <string>
#include <windows.h> //de su dung ham Sleep()
using namespace std;
int main()
{
string ten = "tien";
string mat_khau = "123456";
string TEN, MAT_KHAU;
int so_lan_nhap_sai = 0;
int tuy_chon;
int so_du = 200000;
int tien_rut;
string mat_khau_moi, mat_khau_moi1;
string tai_khoan_can_chuyen;
cout << " DANG NHAP TAI KHOAN CUA BAN
";
cout << "
Ten nguoi dung: "; cin >> TEN;
cout << "Mat khau: "; cin >> MAT_KHAU;
if (TEN == ten && MAT_KHAU == mat_khau)
{
system("cls");
cout << " DANG NHAP TAI KHOAN CUA BAN
";
cout << "Dang kiem tra thong tin...
";
Sleep(1000);
cout << "
DANG NHAP THANH CONG!aa
";
Sleep(2000);
system("cls");
cout << " MOI BAN CHON YEU CAU CAN THUC HIEN
";
cout << "1: TRA CUU SO DU TAI KHOAN
";
cout << "2: RUT TIEN
";
cout << "3: DOI MAT KHAU
";
cout << "4: CHUYEN TIEN
";
cin >> tuy_chon;
switch (tuy_chon)
{
case 1:
Sleep(1000);
system("cls");
cout << " TRA CUU SO DU
";
cout << "
So du tai khoan hien tai la: " << so_du << " VND
";
break;
case 2:
Sleep(1000);
system("cls");
cout << " RUT TIEN
";
cout << "Nhap so tien ban muon rut: ";
cin >> tien_rut;
if (tien_rut <= so_du)
{
Sleep(1000);
cout << "
BAN DA RUT TIEN THANH CONG, SO DU CON LAI LA: " << so_du - tien_rut << " VND
";
Sleep(1000);
}
while (tien_rut > so_du)
{
cout << "
So tien rut phai nho hon hoac bang so du con lai!
";
cin >> tien_rut;
if (tien_rut <= so_du)
{
Sleep(1000);
cout << "
BAN DA RUT TIEN THANH CONG, SO DU CON LAI LA: " << so_du - tien_rut << " VND
";
Sleep(1000);
}
}
break;
case 3:
Sleep(1000);
system("cls");
cout << " DOI MAT KHAU
";
cout << "Moi ban nhap mat khau moi: ";
cin >> mat_khau_moi;
cout << "Moi ban nhap lai mat khau moi lan nua: ";
cin >> mat_khau_moi1;
Sleep(1000);
if (mat_khau_moi == mat_khau_moi1)
{
mat_khau = mat_khau_moi;
cout << "
Dang kiem tra thong tin...
";
Sleep(1000);
cout << "
DOI MAT KHAU THANH CONG!
";
Sleep(1000);
system("cls");
cout << " DANG NHAP
";
cout << "Ten nguoi dung: "; cin >> TEN;
cout << "Mat khau: "; cin >> MAT_KHAU;
if (TEN == ten && MAT_KHAU == mat_khau)
{
system("cls");
cout << " DANG NHAP
";
cout << "Dang kiem tra thong tin...
";
Sleep(1000);
cout << "
DANG NHAP THANH CONG!aa
";
} else
{
system("cls");
cout << " DANG NHAP
";
cout << "Dang kiem tra thong tin...
";
Sleep(1000);
cout << "
DANG NHAP THAT BAI!aa
";
}
}
break;
case 4:
Sleep(1000);
system("cls");
cout << " CHUYEN TIEN
";
cout << "Moi ban nhap ten nguoi dung can chuyen tien: ";
cin >> tai_khoan_can_chuyen;
cout << "Moi ban nhap so tien can chuyen: ";
cin >> tien_rut;
if (tien_rut <= so_du)
{
Sleep(1000);
cout << "
BAN DA CHUYEN THANH CONG "<<tien_rut<<" VND CHO TAI KHOAN "<<tai_khoan_can_chuyen<<" SO DU CON LAI LA: " << so_du - tien_rut << " VND
";
Sleep(1000);
}
while (tien_rut > so_du)
{
cout << "
So tien chuyen phai nho hon hoac bang so du con lai!
";
cin >> tien_rut;
if (tien_rut <= so_du)
{
Sleep(1000);
cout << "
BAN DA CHUYEN THANH CONG " << tien_rut << " VND CHO TAI KHOAN " << tai_khoan_can_chuyen << " SO DU CON LAI LA: " << so_du - tien_rut << " VND
";
Sleep(1000);
}
}
break;
default:
Sleep(1000);
system("cls");
Sleep(1000);
cout << "Hien chua co chuc nang nay!
";
break;
}
} else while (TEN != ten || MAT_KHAU != mat_khau)
{
so_lan_nhap_sai++;
system("cls"); //xoa man hinh console
cout << " DANG NHAP TAI KHOAN CUA BAN
";
cout << "Dang kiem tra thong tin...
";
Sleep(1000); //dung chuong trinh 1000 mili giay
cout << "
BAN DA NHAP SAI TEN NGUOI DUNG HOAC MAT KHAU "<<so_lan_nhap_sai<<" LAN, MOI NHAP LAI!
a";
cout << "
Ten nguoi dung: "; cin >> TEN;
cout << "Mat khau: "; cin >> MAT_KHAU;
if (TEN == ten && MAT_KHAU == mat_khau)
{
system("cls");
cout << " DANG NHAP TAI KHOAN CUA BAN
";
cout << "Dang kiem tra thong tin...
";
Sleep(1000);
cout << "
DANG NHAP THANH CONG!aa
";
Sleep(2000);
system("cls");
cout << " MOI BAN CHON YEU CAU CAN THUC HIEN
";
cout << "1: TRA CUU SO DU TAI KHOAN
";
cout << "2: RUT TIEN
";
cout << "3: DOI MAT KHAU
";
cout << "4: CHUYEN TIEN
";
cin >> tuy_chon;
switch (tuy_chon)
{
case 1:
Sleep(1000);
system("cls");
cout << " TRA CUU SO DU
";
cout << "
So du tai khoan hien tai la: " << so_du << " VND
";
break;
case 2:
Sleep(1000);
system("cls");
cout << " RUT TIEN
";
cout << "Nhap so tien ban muon rut: ";
cin >> tien_rut;
if (tien_rut <= so_du)
{
Sleep(1000);
cout << "
BAN DA RUT TIEN THANH CONG, SO DU CON LAI LA: " << so_du - tien_rut << " VND
";
Sleep(1000);
}
while (tien_rut > so_du)
{
cout << "
So tien rut phai nho hon hoac bang so du con lai!
";
cin >> tien_rut;
if (tien_rut <= so_du)
{
Sleep(1000);
cout << "
BAN DA RUT TIEN THANH CONG, SO DU CON LAI LA: " << so_du - tien_rut << " VND
";
Sleep(1000);
}
}
break;
case 3:
Sleep(1000);
system("cls");
cout << " DOI MAT KHAU
";
cout << "Moi ban nhap mat khau moi: ";
cin >> mat_khau_moi;
cout << "Moi ban nhap lai mat khau moi lan nua: ";
cin >> mat_khau_moi1;
Sleep(1000);
if (mat_khau_moi == mat_khau_moi1)
{
mat_khau = mat_khau_moi;
cout << "
Dang kiem tra thong tin...
";
Sleep(1000);
cout << "
DOI MAT KHAU THANH CONG!
";
Sleep(1000);
system("cls");
cout << " DANG NHAP
";
cout << "Ten nguoi dung: "; cin >> TEN;
cout << "Mat khau: "; cin >> MAT_KHAU;
if (TEN == ten && MAT_KHAU == mat_khau)
{
system("cls");
cout << " DANG NHAP
";
cout << "Dang kiem tra thong tin...
";
Sleep(1000);
cout << "
DANG NHAP THANH CONG!aa
";
}
else
{
system("cls");
cout << " DANG NHAP
";
cout << "Dang kiem tra thong tin...
";
Sleep(1000);
cout << "
DANG NHAP THAT BAI!aa
";
}
}
break;
case 4:
Sleep(1000);
system("cls");
cout << " CHUYEN TIEN
";
cout << "Moi ban nhap ten nguoi dung can chuyen tien: ";
cin >> tai_khoan_can_chuyen;
cout << "Moi ban nhap so tien can chuyen: ";
cin >> tien_rut;
if (tien_rut <= so_du)
{
Sleep(1000);
cout << "
BAN DA CHUYEN THANH CONG " << tien_rut << " VND CHO TAI KHOAN " << tai_khoan_can_chuyen << " SO DU CON LAI LA: " << so_du - tien_rut << " VND
";
Sleep(1000);
}
while (tien_rut > so_du)
{
cout << "
So tien chuyen phai nho hon hoac bang so du con lai!
";
cin >> tien_rut;
if (tien_rut <= so_du)
{
Sleep(1000);
cout << "
BAN DA CHUYEN THANH CONG " << tien_rut << " VND CHO TAI KHOAN " << tai_khoan_can_chuyen << " SO DU CON LAI LA: " << so_du - tien_rut << " VND
";
Sleep(1000);
}
}
break;
default:
Sleep(1000);
system("cls");
Sleep(1000);
cout << "Hien chua co chuc nang nay!
";
break;
}
}
}
system("pause");
return(0);
}


mo phong may ATM.exe
MediaFire is a simple to use free service that lets you put all your photos, documents, music, and video in a single place so you can access them anywhere and share them everywhere.
Bạn chia hàm riêng ra để xử lí sẽ dễ đọc code hơn
HI Nguyen Dang Tien.
diễn đàn cần những người như bạn.
Thường thì TEN, MAT_KHAU dùng để khai báo hằng số http://geosoft.no/development/cppstyle.html
Tất cả các switch case đều có
Sleep(1000); system("cls");
Sao không đặt nó lên đầu luôn ?Bạn học về hàm con để chia code ra.
P/S Phần logic chương trình hơi sai thì phải.
Mình chỉ mới học tới mảng 1 chiều trên trang cpp.daynhauhoc.com nên chưa biết về hàm, chỉ biết thoáng qua kiểu như
và hàm là cái chương trình con mà mình đã học ở Pascal 11
dạ cảm ơn anh ý tưởng linh tinh của e thôi mà [quote=“Phong_Ky_Vo, post:3, topic:50677”]
[/quote]
dạ vì có phần đổi mật khẩu nên e phải để nó là biến, lúc đầu chưa có ý tưởng đổi mật khẩu thì em để nó là hằng
để chúng lên đầu switch case như thế nào ah?
dạ em sắp học đến hàm rồi
Logic có gì sai a góp ý giúp e, e thấy nó vẫn chưa hoàn thiện chức năng lắm.
Mình góp ý tí:
Anh em nào biết cách cho dừng chương trình khi mình nhập sai 3 lần ko ah?
Trước khi có các tùy chọn của máy ATM thì khi chỉ kiểm tra tên và mật khẩu em làm đc nhưng sau khi thêm vào nó lỗi em đành xóa đi.
Như thế thì hơi thiếu thực tế vì chẳng máy ATM nào cho nhập sai vô tư lần cả
HI Nguyen Dang Tien.
Ý mình là với biến bạn viết bằng chữ thường VD: dayLaBien, còn hằng thì viết DAY_LA_HANG_SO.
Đọc lại link mình gửi.
Cái đó bạ tự nghĩ.
dạ dạ em hiểu rồi, lần sau rút KN
sau khi học đến hàm e sẽ làm tiếp[quote=“huyletien, post:6, topic:50677”]
3. chỗ rút tiền bạn nên trừ luôn tiền rút chứ chỉ in ra so_du - tien_rut thì số dư vẫn còn. Và cái này bạn nên vứt vào do…while
[/quote]
tất nhiên là số dư còn chứ ạ? mình in ra tiền còn lại sau khi rút
số dư chính là tài khoản của quý khách hiện tại là … đồng đó, ko biết bạn có hiểu cái này ko hay có ý gì khác
ý tưởng của em là nhập mk mới, nếu check đúng thì cho đổi, sau đó dùng mk này để đăng nhập lại một lần rồi kết thúc CT
À mình hiểu ý bạn rồi,tại ý mình là nên trừ tiền mỗi lần rút cho nó thiết thực :))). Còn đổi pass thic thêm cái nhập pass cũ nữa thì hay (y)
(Diễn đàn ko cho reply quá 6 lần nên em đành edit cái reply này)
Em vừa tối ưu lại code, ngắn hơn nhiều rồi vì đã bỏ switch case 2 lần và chuyển thành IF anh em xem và thấy chỗ nào còn bị gì thì góp ý giúp em
Hiện chương trình đã chạy được tối đa là 10000 lần cho đến khi người dùng chọn lệnh Thoát
MediaFire
Ngoài ra còn lưu đc mật khẩu, số dư tài khoản cho lần sử dụng tiếp theo luôn.
ATM by Tien.exe
MediaFire is a simple to use free service that lets you put all your photos, documents, music, and video in a single place so you can access them anywhere and share them everywhere.
Học hàm giúp cho chương trình gọn hơn
Thao tác với File giúp người dùng đăng kí thêm tài khoản lưu các thông tin vào file. gọi là Database.
Kiếm file nhạc nào, mỗi lần rút tiền đăng nhập, cho chạy file nhạc như máy thật.
Làm vòng lặp while để chương trình chạy liên tục
Thật cảm ơn bạn đã góp ý, mình cũng sắp vào đại học rồi, chắc cũng ko đc rảnh nhiều như ở nhà nhưng mình sẽ giữ ý tưởng này sau này học thêm kiến thức mới sẽ nâng cấp nó lên.
Rất tâm đắc với ý kiến về database, nhạc của bạn nhưng có vẻ còn hơi lâu mình mới chạm đến đc mấy cái này
Điều mình đang nghĩ lúc này là làm thế nào để dùng vòng while lặp lại chương trình và lưu lại các thông số như mật khẩu đã đổi, số dư còn lại, … hoặc sau khi dùng một chức năng xong thì có thể dùng tiếp chức năng khác…
Ok mình đã bỏ đi vòng for 10000 lần rồi, xài đến 10000 lần là cháy máy
Đã thay bằng while (true)
Anh em xem còn gì chưa hợp lý góp ý em nha, em mới học C++ đc 1 tháng, trước có học Pascal năm 11 nhưng cũng hơi mơ hồ, chỉ biết chép code cô viết trên bảng là chính thôi
break trong switch case tác dụng gì tới vòng lặp? Sao không phải là if?
Thế mình thay vòng for bằng
Đến khi nào người dùng nhập vào tùy chọn có chứa lệnh Break là nó thoát, ko biết như thế có được ko?
Nếu vậy chương trình của bạn sẽ chỉ chạy được trong chừng đó lần. Sao bạn không thử dùng vòng lặp vô hạn? Bạn muốn break để thoát ra vòng lặp thì đặt mộ câu if, đương nhiên là nó nằm ngoài switch.
Chưa thấy ATM chạy Console bao giờ ??
*có tổ chức hơn
^ thì luyện tập mà.