Chào mọi người, chúc mọi người một ngày vui vẻ!
Vào chủ đề chính lun: mình đang viết chương trình mô tả lại hoạt động của máy ATM bằng Linked List.
Mình sai ở tính năng chuyển tiền.
Quy trình hoạt động: …Nhập số tiền chuyển --> Xét điều kiện --> Cập nhật (Nếu thành công: thì cập nhật lại file, Nếu fail giữ nguyên hiện trường)
Lỗi gặp phải: (source bên dưới)
Error 1: (…Nhập tiền chuyển (Thỏa mãn điều kiện) --> Cập nhật lại file sau khi chuyển tiền)
- file ban đầu:
- file sau khi chuyển tiền thành công: (chuyển từ tk: 01234567891011 --> 12345671234567: 100000VND)

—> Làm sao để nó không in ra dòng cuối cùng ấy ạ!
Source Code:
/*
* Thanh vien trong nhom:
* 1. Bui Van Hieu.
* 2. Nguyen Minh Triet.
* 3. Nguyen Dinh Trieu.
* 4. Luong Thanh
* 5.
* Project: Mo ta hoat dong cua may ATM.
* Create of date: 04/05/2019.
*/
//Khai bao thu vien va tien xu ly
#include <iostream>
using namespace std;
#include <string> //thu vien xu ly chuoi
#include <fstream> //thu vien nhap xuat file
#include <conio.h> //thu vien nhan gia tri tu phim
#include <windows.h> //thu vien giao dien tren console
#include <time.h> //thu vien thoi gian he thong
#pragma warning(disable : 4996) //_CRT_SECURE_NO_WARNINGS //sua loi localtime
//tao doi tuong Khach Hang
struct KhachHang
{
string sUser = "", sPin = "", sTenKH = "";
double dSoDu = 0.0;
string sLoaiTienTe = "";
};
//tao doi tuong Node chua du lieu khach hang
struct Node
{
KhachHang xDataKH;
Node *pNext;
};
//tao doi tuong List
struct List
{
Node *pHead, *pTail;
List()
{
pHead = pTail = NULL;
}
};
//Khai bao nguyen mau ham
Node *createNote(KhachHang xKH); //tao Node moi
string maHoa_Pass(int maxLength); //chuyen ky tu nhap vao thanh dau *
void textColor(int iColor);
void giaoDienATM(string sGD); //giao dien ATM
void addTail(List &L, KhachHang xKH);
void docData_1_KhachHang(ifstream &finCus, KhachHang &xKH);
void xuatData_1_KhachHang(KhachHang xKH);
void inputList(List &L, ifstream &finCus);
void outputList(List L);
/*============================
* Tinh Nang Chuyen Tien
==============================*/
void chuyenTien(List &L, Node *k, Node *t, string sUserInput);
void updateGiaoDich(List &L, string sUserInput, string sSoTKNguoiNhan, double dTienChuyen, double dTienConLai, double dTienDuocNhan);
int demSoLuongKH();
void ghiLichSu(List L, string sUserInput, double dTienChuyen, Node *k, Node *t, string sTypeGD);
//============================
/*============================
* Tinh nawng rut tien
=============================*/
//============================
/*============================
* Xem thong tin khach hang
=============================*/
//============================
/*=========================
* Tinh nang dang nhap
==========================*/
void logIn(List &L); //man hinh dang nhap
//==========================
//Chuong trinh chinh
void main()
{
List L;
ifstream finCus; // b1. doc du lieu tu file len
finCus.open("TheATM.dat"); //b2. mo file.
inputList(L, finCus); //b3. doc du lieu tu file len
/*outputList(L);*/
finCus.close(); //b4. dong file
logIn(L);
system("pause");
}
/*=======================
//* Chuc nang dang nhap
//=======================*/
void logIn(List &L)
{
string sUserInput = "";
string sPinInput = "";
int nDemLanSai = 0;
int nLuaChon = 0;
int i = 0;
while (i < 3)
{
giaoDienATM("Login");
textColor(12); cout << "\t\t\t\t===== Luu y: nhan ESC de thoat chuong trinh =====" << endl;
textColor(10); cout << "\t\t\t\t\tUser: "; //nhap user
rewind(stdin);
getline(cin, sUserInput);
//nhap pin
textColor(10); cout << "\t\t\t\t\tPin: ";
sPinInput = maHoa_Pass(6);
Node *k = L.pHead;
Node *t = L.pHead;
Node *q = L.pHead;
for (q = L.pHead; q != NULL; q = q->pNext)
{
if (sUserInput == q->xDataKH.sUser && sPinInput == q->xDataKH.sPin) //ca 2 deu phai dung
{
cout << "\t\t\t\t\tDang dang nhap ..." << endl;
Sleep(1000);
system("cls");
cout << "\t\t\t\t\t====== Dang nhap thanh cong ======" << endl;
Sleep(1000);
system("cls");
giaoDienATM("Menu");
cout << "Lua chon chuc nang: ";
cin >> nLuaChon;
do
{
switch (nLuaChon)
{
case 1: //nhan 1 de chon tinh nang rut tien
system("cls");
giaoDienATM("RutTien");
/*tinhNangRutTien(L, t);*/
break;
case 2:
system("cls");
textColor(11); chuyenTien(L, k, t, sUserInput);
break;
case 3:
giaoDienATM("XemThongTin");
break;
default:
Sleep(1000);
cout << "Cam on quy khach da su dung dich vu!";
cout << "\nGoodbye!\n";
nLuaChon = 5;
break;
}
} while (nLuaChon > 0 && nLuaChon <= 4);
}
else if (sUserInput == q->xDataKH.sUser || sPinInput == q->xDataKH.sPin)//1 trong 2 user hoac pass sai
{
nDemLanSai++;
cout << "\t\t\t\t\t Dang dang nhap ..." << endl;
Sleep(1000);
system("cls");
textColor(12); cout << "\t\t\t\t\t====== Sai user hoac pin ======" << endl;
textColor(12); cout << "\t\t\t\t\tVui long dang nhap lai!" << endl;
i++;
}
}
if (nDemLanSai < 3) //sai nho hon 3 lan
{
textColor(12); cout << "\t\t\t\t\t\tQuy khach con " << 3 - nDemLanSai << " lan sai!\n";
}
if (nDemLanSai >= 3) //sai qua 3 lan
{
textColor(12); cout << "\t\t\t\t\t\tQuy khach da dang nhap sai qua 3 lan!\n";
i += 4;
break;
textColor(7);
}
}
}
/*=====================
* Rut tien
=======================*/
//void tinhNangRutTien(List L, Node *t)
//{
// double dNhapTienRut = 0.0;
// int nN;
// char c;
// string sMatKhauXacNhan = "";
// giaoDienATM("RutTien");
// cout << "Luu y so tien rut lon hon 50000!";
// cout << "Nhap so tien rut:" ;
// cin >> dNhapTienRut;
// double dSoTienKhaDung = t->xDataKH.dSoDu - 50000;
// if (dNhapTienRut > dSoTienKhaDung && dNhapTienRut < 50000)
// {
// cout << "So tien trong tai khoan khong du de thuc hien giao dich nay!" << endl;
// }
// else
// {
// system("cls");
// giaoDienATM("RutTien");
// cout << "So tien ban can rut la: " << dNhapTienRut << t->xDataKH.sLoaiTienTe;
// cout << "\nBan co muon tiep tuc xac nhan mat khau hay khong (C/K)?\n";
// cout << "Nhap 'C' de xac nhan rut tien hoac nhap 'K' huy rut tien!\n";
// if (c == 'C' || c == 'c')
// {
// cout << "Nhap mat khau cua ban:";
// sMatKhauXacNhan = maHoa_Pass(6);
// if (sMatKhauXacNhan == t->xDataKH.sPin)
// {
// cout << "Ban da rut " << dNhapTienRut << t->xDataKH.sLoaiTienTe << " thanh cong!\n";
// cout << "Giao dich thanh cong!\n";
// double dSoTienConLai = t->xDataKH.dSoDu - dNhapTienRut;
// cout << "So tien con lai trong tai khoan la:" << dSoTienConLai << t->xDataKH.sLoaiTienTe << endl;
// //Ghi du lieu len file sau khi da rut tien
// ghiLaiGiaoDich("GDRUTTIEN");
// }
// else if(sMatKhauXacNhan != t->xDataKH.sPin)
// {
// cout << "Giao dich bi huy!\n";
// }
// }
// if (c == 'K' || c == 'k')
// {
// cout << "He thong ngung giao dich!";
// }
// }
//}
/*==============================================================
* Chuyen tien:
* - Cho nguoi dung nhap vao so taikhoan nguoi nhan
* - Cho nhap so tien can chuyen:
* + So tien chuyen lon hon 50000VND
* + So du trong tai khoan > 50000VND
* + Cap nhat so tien sau khi thuc hien giao dich
* + Ghi du lieu chuyen tien ra mot file khac
================================================================*/
void chuyenTien(List &L, Node *k, Node *t, string sUserInput)
{
giaoDienATM("ChuyenTien");
string sSoTKNguoiNhan = "";
double dTienChuyen = 0.0;
double dTienConLai = 0.0;
double dTienDuocNhan = 0.0;
double dTienKhaDung = 0.0;
string s = "";
do
{
system("cls");
giaoDienATM("ChuyenTien");
cout << "\t\t\t\t\tNhap so tai khoan nguoi nhan: ";
rewind(stdin);
getline(cin, sSoTKNguoiNhan);
} while (sSoTKNguoiNhan == sUserInput);
for (k = L.pHead; k != NULL; k = k->pNext)
{
dTienKhaDung = k->xDataKH.dSoDu - 50000;
if (sSoTKNguoiNhan == k->xDataKH.sUser)
{
cout << "\n\t\t\t\t\tNhap so tien can chuyen: ";
cin >> dTienChuyen;
if (dTienChuyen > 50000 && dTienChuyen <= dTienKhaDung)
{
k->xDataKH.dSoDu += dTienChuyen; //Tien cua nguoi nhan tang len sau giao dich
dTienDuocNhan = k->xDataKH.dSoDu;
cout << "Ban da chuyen tien thanh cong!" << endl;
s = "thanhcong";
Sleep(2000);
break;
}
else
{
dTienDuocNhan = k->xDataKH.dSoDu;
textColor(14); cout << "So tien khong kha dung, Chuyen tien that bai! ";
s = "thatbai";
Sleep(1000);
break;
}
}
}
if (s == "thanhcong")
{
dTienConLai = t->xDataKH.dSoDu - dTienChuyen;
}
else if (s == "thatbai")
{
dTienConLai = t->xDataKH.dSoDu;
}
updateGiaoDich(L, sUserInput, sSoTKNguoiNhan, dTienChuyen, dTienConLai, dTienDuocNhan);
ghiLichSu(L, sUserInput, dTienChuyen, k, t, "chuyentien");
}
//Sau khi giao dich ghi lai lich su giao dich va luu vao thu muc giao dich
void ghiLichSu(List L, string sUserInput, double dTienChuyen, Node *k, Node *t, string sTypeGD)
{
time_t hientai = time(0);
tm *ltm = localtime(&hientai);
ofstream writeFile;
writeFile.open("GiaoDich\\" + sUserInput + ".dat", ios::out);
writeFile << "Loai giao dich" << "\t\t\t" << "|" << "\t\t\t" << "Nguoi chuyen: " << "\t\t\t" << "|" << "\t\t\t" << "Nguoi nhan: " << "\t\t\t" << "|" << "\t\t\t" << "Tien Chuyen" << "\t\t\t" << "|" << "\t\t\t" << "Ngay" << "\t\t\t" << "|" << "\t\t\t" << "Thang" << "\t\t\t" << "|" << "\t\t\t" << "Nam" << "\t\t\t" << "|" << "\t\t\t" << "Time" << endl;
if (sTypeGD == "chuyentien")
{
writeFile << "Chuyen tien" << "\t\t\t" << "|" << "\t\t\t" << t->xDataKH.sTenKH << "\t\t\t" << "|" << "\t\t\t" << k->xDataKH.sTenKH << "\t\t\t" << "|" << "\t\t\t" << dTienChuyen << "\t\t\t" << "|" << "\t\t\t" << ltm->tm_mday << "\t\t\t" << "|" << "\t\t\t" << 1 + ltm->tm_mon << "\t\t\t" << "|" << "\t\t\t" << 1900 + ltm->tm_year << "\t\t\t" << "|" << "\t\t\t" << ltm->tm_hour << ':' << ltm->tm_min << ':' << ltm->tm_sec << endl;
}
writeFile.close();
}
//Cap nhat lai so tien trong tai khoang sau khi thuc hien giao dich chuyen tien
void updateGiaoDich(List &L, string sUserInput, string sSoTKNguoiNhan, double dTienChuyen, double dTienConLai, double dTienDuocNhan)
{
Node *h;
int nDem = 0;
int nDemDong = demSoLuongKH();
ofstream foutCus;
foutCus.open("TheATM.dat");
for (h = L.pHead; h != NULL; h = h->pNext)
{
nDem++;
if (h->xDataKH.sUser == sUserInput)
{
foutCus << h->xDataKH.sUser << ", " << h->xDataKH.sPin << ", " << h->xDataKH.sTenKH << ", " << dTienConLai << ',' << h->xDataKH.sLoaiTienTe << endl;
}
else if (h->xDataKH.sUser == sSoTKNguoiNhan)
{
foutCus << h->xDataKH.sUser << ", " << h->xDataKH.sPin << ", " << h->xDataKH.sTenKH << ", " << dTienDuocNhan << ',' << h->xDataKH.sLoaiTienTe << endl;
}
else
{
foutCus << h->xDataKH.sUser << ", " << h->xDataKH.sPin << ", " << h->xDataKH.sTenKH << ", " << h->xDataKH.dSoDu << ',' << h->xDataKH.sLoaiTienTe << endl;
}
}
if (nDem < nDemDong)
{
foutCus << endl;
}
foutCus.close();
}
//Dem so luong khach hang co trong file
int demSoLuongKH()
{
int nDem = 0;
string s = "";
ifstream finCus;
finCus.open("TheATM.dat");
while (!finCus.eof())
{
nDem++;
getline(finCus, s, '\n');
}
finCus.close();
return nDem;
}
//====================================================== Tinh Nang Chuyen Tien ========================= Bui Van Hieu ==========================================================================================
/*=============================
* Xem thong tin khach hang
=============================*/
//xuat du lieu tu file
void outputList(List L)
{
Node *p = L.pHead;
int nDem = 0;
for (p = L.pHead; p != NULL; p = p->pNext)
{
cout << "\nKhach hang thu:" << nDem++ << endl;
xuatData_1_KhachHang(p->xDataKH);
}
}
//Du du lieu khach hang vao Node
void inputList(List &L, ifstream &finCus)
{
KhachHang xKH;
while (!finCus.eof()) // lenh !finCus.eof(): end of file, neu con tro tro den cuoi file la dung thi thuc hien
{
docData_1_KhachHang(finCus, xKH);
addTail(L, xKH);
}
}
//xuat du lieu khach hang
void xuatData_1_KhachHang(KhachHang xKH)
{
/*cout << "User:" << xKH.sUser << endl;
cout << "Pin:" << xKH.sPin << endl;*/
cout << "Ten khach hang:" << xKH.sTenKH << endl;
cout << "So du:" << xKH.dSoDu << xKH.sLoaiTienTe << endl;
}
//doc du lieu khach hang
void docData_1_KhachHang(ifstream &finCus, KhachHang &xKH)
{
getline(finCus, xKH.sUser, ',');
finCus.ignore(1);
getline(finCus, xKH.sPin, ',');
finCus.ignore(1);
getline(finCus, xKH.sTenKH, ',');
finCus.ignore(1);
finCus >> xKH.dSoDu, ',';
finCus.ignore(1);
getline(finCus, xKH.sLoaiTienTe);
}
//thong tin khach hang vao cuoi danh sach
void addTail(List &L, KhachHang xKH)
{
Node *pNew = createNote(xKH);
if (L.pHead == NULL)
{
L.pHead = L.pTail = pNew;
}
else
{
L.pTail->pNext = pNew;
L.pTail = pNew;
}
}
//tao mot Node moi chua du lieu chua lien ket voi List
Node *createNote(KhachHang xKH)
{
Node *p = new Node;
if (p == NULL)
{
exit(1);
}
else
{
p->xDataKH = xKH;
p->pNext = NULL;
}
return p;
}
//ham lay mau sac cho text
void textColor(int iColor)
{
HANDLE hConsoleColor;
hConsoleColor = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(hConsoleColor, iColor);
}
//ham hien thi giao dien
void giaoDienATM(string sGD)
{
if (sGD == "Login")
{
textColor(10); cout << "\t\t\t\t\t*********************************" << endl;
textColor(10); cout << "\t\t\t\t\t*\t";
textColor(14); cout << "Dang nhap he thong";
textColor(10); cout << "\t*" << endl;
textColor(10); cout << "\t\t\t\t\t*********************************" << endl;
}
else if (sGD == "Menu")
{
textColor(13);
cout << "\t\t\t\t\t*********************************" << endl;
cout << "\t\t\t\t\t* Chon chuc nang de thuc hien *" << endl;
cout << "\t\t\t\t\t*********************************" << endl;
cout << endl;
cout << " Chon 1. DE RUT TIEN.\n";
cout << " Chon 2. DE CHUYEN TIEN.\n";
cout << " Chon 3. DE XEM GIAO DICH.\n";
cout << " Chon 4. DE THOAT KHOI HE THONG.\n ";
}
else if (sGD == "RutTien")
{
cout << "\t\t\t\t\t*********************************" << endl;
cout << "\t\t\t\t\t* Rut Tien *" << endl;
cout << "\t\t\t\t\t*********************************" << endl;
cout << endl;
}
else if (sGD == "ChuyenTien")
{
cout << "\t\t\t\t\t*********************************" << endl;
cout << "\t\t\t\t\t* Chuyen Tien *" << endl;
cout << "\t\t\t\t\t*********************************" << endl;
cout << endl;
}
else if (sGD == "XemThongTin")
{
cout << "\t\t\t\t\t*****************************************" << endl;
cout << "\t\t\t\t\t* Thong Tin Giao Dich *" << endl;
cout << "\t\t\t\t\t*****************************************" << endl;
}
}
//ma hoa pass thanh dau *
string maHoa_Pass(int maxLength)
{
string pW = "";
for (char c; (c = _getch());) // lenh _getch() de nam bat su kien ban phim
{
if (c == '\n' || c == '\r') //\n: phim enter, \r xuong dong
{
std::cout << "\n";
break;
}
else if (c == '\b') //phim backspace
{
std::cout << "\b \b";
if (!pW.empty()) pW.erase(pW.size() - 1);
}
else if (c == -32) //phím mũi tên
{
_getch(); //bo qua ki tu tiep theo (huong mui ten)
}
else if (isprint(c) && pW.size() < maxLength) //isprint nhan nhung ky tu in ra duoc (co khoang trang)
{
std::cout << '*';
pW += c;
}
}
return pW;
}
Xin được giúp đỡ, Nếu có đề xuất gì xin comment bên dưới.
Xin cám ơn!

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