Sunday, March 4, 2012

CSC138 - Mini Project: Banking System

Assalamualaikum.

Ini contoh program untuk soalan 1 mini project korang.

PERHATIAN
*program ni aku buat se-simple yang mungkin, setakat nk tunjuk concept banking system yang aku boleh bayang
*konsep2 yang aku nk tunjuk tu cmna nk delete data, nk pakai dynamic array
*aku sendiri pun tak brapa nk paham sangat soalan, jadi apa yang aku buat ni berdasarkan apa yang aku paham lah.
*basically program ni agak berterabur sikit, tak complete, dan kalau korang copy sebijik2 buat presentation, drpd 100 markah aku tak gerenti pn bleh dpt 10 markah, hahaha
*dan disebabkan aku buat sekejap jee, dlm 5-8 jam (dgn twitter dn bagai), aku expect korang yang ada lebih berjam2 ni tambah laa bunga2, kasi kemas sikit, buat clearscreen, letak error handling, senang cakap bagi dapat 100 markah lah, hohoho
*ok dah cukup membebel

program ni aku buat pakai Dev-C++ 4.9.9.2, harap maklum

#include 
#include 
using namespace std;

struct Account
{
       long accNum;
       char cusName[50];
       double deposit;
       double withdraw;
       char accType;
};

yang ni macam biasa, include apa2 yang perlu.
bawah namespace tu namanya struct Account tu, itu struct yang aku buat berdasarkan soalan. takde pape yang spesel pn kt sini

ok, memandangkan coding aku berterabur (aku letak function definition atas main program), maka aku akan terangkan daripada main lah, lepas tu kita go on satu2 ikot function yang di pakai step-by-step. (ayat pn berterabur dah)

int main(void)
{
    bool flag = true;
    int menuChoice;
    
    do
    {
         menuChoice = chooseMenu();
         
         switch(menuChoice)
         {
              case 1: createAccount();
                      break;
              case 2: modifyAccount();
                      break;
              case 3: deleteAccount();
                      break;
              case 4: flag = adminMenu();
                      break;
         }
    }while(flag);
}

ini main program nyaaa.
bool flag tu boolean variable yang aku buat untuk kawal loop do while tu.
menuChoice tu untuk simpan input user laah, user nk modify kee, nk create new account kee, nk delete account kee camtu.
masuk loop do while tu, jumpak laah function yang first sekali chooseMenu().
dalam function tu (akan diterangkan sebentar lagi) program request input dr user utk menuChoice.
menuChoice tu digunakan untuk switch tuuuu.
boleh nampak kt atas tu program ni ada 4 pilihan jee
1 - create account
2 - modify account
3 - delete account
4 - admin(ni extra)
condition kt while tu akan berubah bila user input pilihan ke 4 jee.

ok jom pergi function chooseMenu()

int chooseMenu()
{
    int menuChoice=0;
    bool error=false;
    do
    {
         if(error)
         {
                  cout << "Invalid Choice!" << endl;
                  cout << endl;
         }
         cout << "Welcome to ANC Banking! Please select an option." << endl;
         cout << "1 - Create New Account" << endl;
         cout << "2 - Modify Account" << endl;
         cout << "3 - Delete Account" << endl;
         cout << "4 - Admin Only" << endl;
         cin >> menuChoice;
         error = true;
    }while(menuChoice<1 || menuChoice>4);
    return menuChoice;
}

korang patut dah pandai baca function header kan?
baca ja function header kena tau function tu return datatype apa, receive parameter apa, berapa.
aite, menuChoice=0, instantiate variable untuk user input (tak payah 0 pn takpe).
bool error=false, untuk detect error kalau user input selain pilihan yang ada (selain 1-4), instantiate sbg false sbb mula2 start mmg takdak error la kan
do while tu condition akan loop selagi user input selain 1-4 (ni loop control paling simple yang aku bleh pk)
first if tu untuk check kalau ada error then display error message
then, display menu lah, sebelum request input pilihan user.
bwh sikit, assign error=true, tak kisah lah pilihan user dalam range atau tak. kalau dalam range, process akan keluar loop, tak kacau dah error message kt atas tu. kalau takde dlm range pilihan, loop naik atas balik display error baru request input lg skali.
kat luar loop tu return user input ke menuChoice kt function main.
rasanya kat sini je laah kot aku control user input.
kat tempat lain aku tak control, so kalau salah input korang mungkin kena close program, baru run balik
tu semua kerja korang, hahahaha

next, function createAccount()

void createAccount()
{
     Account newCus;
     cout << "Enter account number: ";
     cin >> newCus.accNum;
     cin.ignore(80, '\n');
     cout << "Enter name: ";
     cin.get(newCus.cusName,50);
     cin.ignore(80, '\n');
     cout << "Select account type (s-savings, c-current):";
     cin >> newCus.accType;
     cout << "Enter your initial deposit: ";
     cin >> newCus.deposit;
     
     newCus.withdraw = 0;
     
     insertData (newCus);
}

Account newCus, delare variable untuk struct Account
pastu, request details input dari user, account number, name, type of account (aku letak savings dgn current jee, byk lg kalau pegi check kt bank tuu, korang tambah2 laa).
pastu initial deposit tu aku saje lah letak, bukak akaun bank mesti ah letak duit skit kn? sspn pun kena masuk rm20, hoho
pastu aku assign withdraw=0, yelah, baru create account, takkan dah withdraw siap2 plak duit tu kan.
last sekali tu function insertData(), dan memandangkan ikut proses jumpak function ni dulu, aku explain laah function ni dulu sebelum function modifyAccount().


void insertData (Account acc)
{
     ofstream outfile ("account.dat", ios::out | ios::app);
     outfile << acc.accNum << endl;
     outfile << acc.cusName << endl;
     outfile << acc.deposit << endl;
     outfile << acc.withdraw << endl;
     outfile << acc.accType << endl;
     outfile.close();
}

function insertData ni kt dlm full coding ada 3 jenis semua.
aku pakai konsep function overload (korang belajar ke belum eh?).
function overload ni, nama function sama, tapi yang membezakan tu mungkin parameter atau return value.
kalau belum belajar lg mungkin part 3 korang belajar dlm java.
so, dlm function ni, receive satu variable struct account dari function call
account ni kita nk insert dalam output file sbg 'database' customer yang buat transaction.
simple jee function ni, aku open file pakai ofstream ios::out dgn ios::app
ios out tu, open file cam biasa lah, kalau file belum ada, create baru, kalau dah ada, overwrite.
tapi aku letak ios app, tu untuk sambung output file dekat end of file.
instead of overwrite semua data yang ada, aku just tambah baru kt hujung.
imagine kalau korang pakai ios::out jee, dalam output file asal ada 10 rekod customer lama, tiba2 tambah customer baru sorang, dah overwrite semua data tadi, hilang camtu jee 10 rekod customer lama.
sbb tu aku pakai ios::app.
yang bawah2 tu macam biasa lah outfile dari console ke output file.

next, modifyAccount()

void modifyAccount()
{
     long accNum;
     bool found = false;
     int modifyChoice;
     do
     {
          cout << "Enter account number: ";
          cin >> accNum;
          
          found = searchData(accNum);
          if(found == false)
              cout << "Account not found" << endl;
          else
          {
              modifyChoice = chooseModify();
              switch(modifyChoice)
              {                    
              case 1: changeName(accNum);
                      break;
              case 2: depositCash(accNum);
                      break;
              case 3: withdrawCash(accNum);
                      break;
              case 4: changeType(accNum);
                      break;
              }
          }        
     }while (found == false);
}

urm, kat sini sakit sikit laah. kalau tak dapat tangkap apa yang aku nk cerita ni mungkin pening sikit. sbb dalam ni ada lagi 5 function. aku akan cuba explain sebaik mungkin. macam tadi gak aku akan explain function ikot flow proses.
so, function ni void, and takdak parameter, maksudnya function ni aku buat sbb nak segmentize kan coding. taknak serabut sangat letak semua kat function main()
long accNum variable untuk request akaun number yang user nk modify( macam pergi atm masukkan kad, atm sebenarnya baca nombor akaun kt kad tu, dari cip la kot skrg, dulu dari strip magnetik yang hitam tuu)
bool found=false variable untuk control loop dan untuk validate akaun number tu ada dalam database atau tak.
int modifyChoice untuk request pilihan user (1-4) nak tukar nama, buat deposit atau withdraw, atau tukar account type.
masuk loop do while, first sekali request number account dr user
pastu call function searchData() dgn akaun number yg user input, untuk cari rekod dalam database.
kalau tak jumpak rekod, display message, loop balik request number dr user lg.
kalau rekod ada, request input dari user, apa dorg nk modify, pakai function chooseModify()
pastu baru masuk switch, mengikut pilihan user, ada 4 function
1 - changeName()
2 - depositCash()
3 - withdrawCash()
4 - changeType
(kat sini aku dh malas nk control input, so kalau user pilih selain dari 1-4 mungkn program akan keluar terus, try ler tgk ape jadi)

jom tgk searchData()

bool searchData(long accNum)
{
     ifstream infile ("account.dat");
     bool flag = false;
     while (!infile.eof())
     {
           Account acc;
           infile >> acc.accNum;
           infile >> acc.cusName;
           infile >> acc.deposit;
           infile >> acc.withdraw;
           infile >> acc.accType;
           
           if(accNum == acc.accNum)
           {
                flag = true;
                cout << "account found" << endl;
                break;
           }
           
     }
     infile.close();
     return flag;
}

function searchData() receive long datatype, return bool datatype.
function ni receive accNum yang user input kt funtion call sebelum ni, untuk search rekod melalui nombor akaun(yang sepatutnya unique untuk setiap customer)
first thing, open input file, nak baca rekod dalam database,
set flag = false, flag ni sebagai tanda jumpak atau tak nombor akaun yg user input tu dalam database.
masuk loop while, condition selagi tak sampai hujung file. condition ni ada masalah skit sebenarnya, sbb aku test td dia akan read line yang kosong last sekali tu sbg infile jugak. tp jgn risau, function2 lain yang lebih kurang, aku dh setel masalah tu, nnt kita tgk.
dalam loop benda biasa, baca dari input file.
condition if tu untuk bila jumpak rekod akaun number yang sama dgn user input.
set flag = true, display message dh jumpak rekod, lepastu break untuk serta merta keluar dari loop walaupun belum sampai hujung file. sbb dah jumpak rekod, tak payah nk tengok yang lain2.
close file, return flag.


chooseModify()

int chooseModify()
{
    cin.ignore(80,'\n');
    int choice;
    cout << "Select an option: " << endl;
    cout << "1 - Change name" << endl;
    cout << "2 - Deposit Cash" << endl;
    cout << "3 - Withdraw Cash" << endl;
    cout << "4 - Change Account Type" << endl;
    cin >> choice;
    return choice;
}


return int datatype, no paramater.
function simple untuk display menun request input pilihan user.
input return kat function call.


changeName()

void changeName(long accNum)
{
     int recordSize = countRecord();
     char newName[50];
     cout << "Enter new name: ";
     cin.ignore(80,'\n');
     cin.get(newName,50);
     Account * pAcc;
     pAcc = new (nothrow) Account[recordSize];
     ifstream infile ("account.dat");
     for(int x=0;x<recordSize;x++)
     {
             
             Account acc;
             infile >> acc.accNum;
             infile >> acc.cusName;
             infile >> acc.deposit;
             infile >> acc.withdraw;
             infile >> acc.accType;
             
             if(acc.accNum == accNum)
             {
                 int i;
                 for(i=0;i<50;i++)
                 {
                     acc.cusName[i] = '\0';
                 }
                 i=0;
                 do
                 {
                     acc.cusName[i] = newName[i];
                     i++;
                 }while(newName[i]!='\0');
             }
             
             pAcc[x] = acc;
     }
     infile.close();
     insertData (pAcc,recordSize);
     cout << "Update Successful" << endl;     
}

void function, parameter long accNum dari function call.
kat sini start pakai pointer dgn dynamic array.
aku tak nampak cara lain dah untuk buat benda ni. kalau korang ada cara lain , sharing2 lah ek.
nombor akaun yg user input digunakan untuk compare dan modify rekod yg berkaitan.
function ni untuk ubah nama pemilik akaun.
int recordSize = countRecord() ni untuk kira bilangan akaun yang ada dalam database(atau input file kita).
 char newName untuk simpan nama baru yang user nk ubah.
pastu request nama dari user
Account * pAcc declare pointer untuk struct jenis Account (sbb nak buat dynamic array)
line yg bawah tu, cara declare dynamic array, <pointer> = new (no throw) <datatype>[<dynamic size>].
(no throw) tu aku pun baru belajar, kalau tak letak tu nanti dynamic array akan throw error kalau memory tak cukup, kalau ada throw, kena ada catch, sbb tu aku buat no throw, malas nk catch. so that, bila ada error nanti, program continue macam biasa(xsure)
aku pakai dynamic array ni sbb jumlah bilangan akaun dalam database berubah2 ikot berapa user create new account dan berapa user delete account. bilangan akaun dalam database tak tetap, a.k.a dynamic.
sbb tu wujud function countRecord tadi tu, untuk kira berapa akaun dalam input file, then baru pakai value tu sbg size array.
open file, masuk for loop, condition selagi x kurang dari size bilangan akaun.
baca input dari file,
sampai if tu, condition nombor akaun rekod sama dengan nombor akaun user input, baru masuk proses tukar nama.
ok, part ni aku sendiri tak brapa nk faham.
loop for tu untuk 'clear' array char yang simpan nama user yang lama(dari input file).
lepas dah clear tu baru lah salin nama yang user input, abjad demi abjad, sbb array takleh buat assignment.
dah habes tukar nama, simpan data dalam dynamic array Account.
tutup input file, then call function insertData(), tgk betul2 function insertData() ni lain sikit dari function insertData() yang kt createAccount() tu, yang ni ada dua parameter(function overload) walaupun nama sama. function call ni hantar pointer untuk dynamic array dgn size rekod atau jumlah bilangan akaun dalam input file.

countRecord()

int countRecord()
{

     int countData = 0;
     Account acc;
     ifstream infile ("account.dat");
     while (infile >> acc.accNum)
     {
           infile >> acc.cusName;
           infile >> acc.deposit;
           infile >> acc.withdraw;
           infile >> acc.accType;
           countData++;   
     }
     infile.close();
     return countData;
}

function countRecord() return integer value sbg saiz atau jumlah bilangan akaun dalam input file.
countData untuk kira bilangan akaun. basically function ni cuma baca dari input file macam biasa, sambil tu setiap kali cukup satu set data(accNum, name, deposit, withdraw, accType) kita increment countData sbg tanda cukup satu rekod.
last sekali return countData ke function call.
function ni rasanya semua function untuk modify account ada pakai benda ni.

insertData() - yang kedua

void insertData (Account * pAcc, int size)
{
     ofstream outfile ("account.dat", ios::trunc);
     for(int x=0;x<size;x++)
     {     
             insertData (pAcc[x]);   
     }
     outfile.close();
}

insertData() ni ada dua parameter, satu pointer, lagi satu saiz rekod atau blangan akaun.
untuk yang ni, aku pakai ofstream ios::trunc, yang ni untuk overwrite semua data yang ada dalam database, tulis yang baru. data2 yang lama aku overwrite dgn data2 yang aku simpan dalam dynamic array tadi dalam function changeName()
dalam loop for tu aku call function insertData() yang first tadi.


depositCash()


void depositCash(long accNum)
{
     int recordSize = countRecord();
     double deposit;
     cout << "Enter deposit amount: ";
     cin >> deposit;
     Account * pAcc;
     pAcc = new (nothrow) Account[recordSize];
     ifstream infile ("account.dat");
     for(int x=0;x<recordSize;x++)
     {
             Account acc;
             infile >> acc.accNum;
             infile >> acc.cusName;
             infile >> acc.deposit;
             infile >> acc.withdraw;
             infile >> acc.accType;
             if(acc.accNum == accNum)
                 acc.deposit = acc.deposit + deposit;
             pAcc[x] = acc;
     }
     infile.close();
     insertData (pAcc,recordSize);
     cout << "Deposit successful" << endl;
}

function void, receive satu parameter long, accNum (user input)
countRecord ni benda sama macam changeName() tadi
next 3 lines untuk request input user punya deposit amount (dah makin malas nak menaip)
pointer, dynamic array, open file, macam changeName() jugak
loop dan baca dari input file pun sama.
beza kt sini cuma if tu, dalam if tu kita cuma nk tambah jumlah deposit yang sedia ada(dulu), dgn deposit yang user baru input tadi. total up, simpan dalam acc.deposit
then simpan struct tu dalam dynamic array.
keluar loop, tutup file, insertData() jenis yang kedua macam dalam changeName()
display message, *chiiiiiing* (blurr dah)


withdrawCash()


void withdrawCash(long accNum)
{
     int recordSize = countRecord();
     double withdraw;
     cout << "Enter withdraw amount: ";
     cin >> withdraw;
     Account * pAcc;
     pAcc = new (nothrow) Account[recordSize];
     ifstream infile ("account.dat");
     for(int x=0;x<recordSize;x++)
     {
             
             Account acc;
             infile >> acc.accNum;
             infile >> acc.cusName;
             infile >> acc.deposit;
             infile >> acc.withdraw;
             infile >> acc.accType;
             
             if(acc.accNum == accNum)
             {
                 if((acc.deposit-acc.withdraw) < withdraw)
                     cout << "Insufficient account balance to withdraw" << endl;
                 else
                 {
                     acc.withdraw +=withdraw;
                     cout << "Withdrawal successful" << endl;
                 }
                     
             }
             
             pAcc[x] = acc;
     }
     infile.close();
     insertData (pAcc,recordSize);
}


konsep sama macam depositCash(), (sepatutnya boleh segmentize lg benda2 yang sama ni bg jadi satu function, tp aku dh pening)
beza kalini untuk withdraw duit
kt dlm if tu, aku buat condition untuk check (yang ni aku pk logik sendiri) 'balance' account, asamada cukup atau tak user nk withdraw.
kalau tengok kt coding aku takdak laa tulis balance account kt mana2, tapi tgk formula "acc.deposit - acc.withdraw" yang tu sebenarnya 'balance account' sbb user hanya boleh withdraw duit yang dia dh deposit,
so, kalau user mintak nk withdraw lebih dari yang dia deposit, kena halang transaction.
so, condition if tu sebenarnya kalau balance tu kurang dari permintaan withdraw user, then display error, stop transaction.
else, continue transaction, pastu rekodkan jumlah withdraw yang baru.
yang seterusnya pun sama macam function depositCash()

changeType()

void changeType(long accNum)
{
     int recordSize = countRecord();
     char accType;
     cout << "Select account type (s-savings, c-current):";
     cin >> accType;
     Account * pAcc;
     pAcc = new (nothrow) Account[recordSize];
     ifstream infile ("account.dat");
     for(int x=0;x<recordSize;x++)
     {
             
             Account acc;
             infile >> acc.accNum;
             infile >> acc.cusName;
             infile >> acc.deposit;
             infile >> acc.withdraw;
             infile >> acc.accType;
             
             if(acc.accNum == accNum)
                 acc.accType = accType;
             
             pAcc[x] = acc;          
     }
     infile.close();
     insertData (pAcc,recordSize);
     cout << "Update successful" << endl;
}

again, same thing over here, just change the input request and the process inside the if, the rests are all copy-pasted from the former functions.

deleteAccount()
yayyyy!!! back to the 3rd menu of the first selection~~ (lol)


void deleteAccount()
{
     long accNum;
     char confirm;
     bool found = false;
     do
     {
          cout << "Enter account number: ";
          cin >> accNum;
          
          found = searchData(accNum);
          if(found == false)
              cout << "Account not found" << endl;
          else
          {
              cout << "Are you sure you want to delete account?(Y/N): ";
              cin >> confirm;
              if(confirm == 'Y' || confirm == 'y')
              {
                  deleteData(accNum);
                  break;
              }
              else
                  break;
          }        
     }while (found == false);
}

kay, function ni untuk delete account user, berdasarkan nombor akaun (macam yang lain2 jugak).
flow proses lebih kurang camni: request nombor akaun dari user, check account tu ada tak dalam input file, kalau takdak abort, kalau ada, buat confirmation untuk delete. tu jaaa
long accNum untuk simpan nombor akaun user input,
char confirm untuk confirmation user betul2 nk delete atau tak,
bool found = false, untuk validate ada rekod nombor akaun atau tak dalam database,
dlm loop, request input user, searchData() dh explain kt atas.
kalau jumpa rekod, baru buat confirmation.
then bila user dah confirm, baru proses masuk function deleteData().
selain dari tu, break je keluar loop.


deleteData()


void deleteData(long accNum)
{
     int recordSize = countRecord();
     int deleteIndex;
     Account * pAcc;
     pAcc = new (nothrow) Account[recordSize];
     ifstream infile ("account.dat");
     for(int x=0;x<recordSize;x++)
     {
             
             Account acc;
             infile >> acc.accNum;
             infile >> acc.cusName;
             infile >> acc.deposit;
             infile >> acc.withdraw;
             infile >> acc.accType;
             
             if(acc.accNum == accNum)
             {
                 deleteIndex=x;
             }  
             pAcc[x] = acc;       
     }
     infile.close();
     insertData (pAcc,recordSize,deleteIndex);
     cout << "Account deleted" << endl;
}

function void, receive one parameter, long, accNum, input from user.
countRecord() dah explain.
deleteIndex ni just satu variable untuk simpan index untuk data dlm array yang kita nk delete (of course ada cara lain lagi selain pakai deleteIndex ni, malas nk pk)
skip2 benda yg dah tahu, masuk if, deleteIndex = x; nampak kt sini kita just nk amek value 'x' tu bila nombor akaun user input sama dengan nombor akaun dalam database. kita cuma nak index array tu.
skip2, insertData() kalini ada 3 parameter( function overload lagi).

insertData() - yang ketiga


void insertData (Account * pAcc, int size, int deleteIndex)
{
     ofstream outfile ("account.dat", ios::trunc);
     for(int x=0;x<size;x++)
     {     
           if(x!=deleteIndex)
               insertData (pAcc[x]);   
     }
     outfile.close();
}

function void, terima 3 parameter, pointer struct account, integer size rekod database, integer index array utk 'delete' data.
secara keseluruhan, hampir sama dengan insertData() kedua tadi, cuma ada condition untuk insertData() dalam loop for tu.
condition tu untuk kita insert semua data dalam array, kecuali data yg index kita retrieve dari function call tadi.
dari segi logiknya, kita bukanlah 'delete' data tu, kita cuma tak tulis balik dalam database :D




adminMenu()
yayyyy!! last!!


bool adminMenu()
{
     return false;
} 

takde pape pun kt sini
aku buat function ni utk exit jee sbnarnye, tp atm kan takde exit.
so, kt sini laa korang nk tambah extra features, nk letak option untuk print report kee tgk brapa byk dh user deposit, nak kira jumlah customer ke ape, ikot kreativiti masing2.


okay, selamat mencobaa.


ini full coding




//BANKING SYSTEM

#include <iostream>
#include <fstream>
using namespace std;

struct Account
{
       long accNum;
       char cusName[50];
       double deposit;
       double withdraw;
       char accType;
};

int chooseMenu()
{
    int menuChoice=0;
    bool error=false;
    do
    {
         if(error)
         {
                  cout << "Invalid Choice!" << endl;
                  cout << endl;
         }
         cout << "Welcome to ANC Banking! Please select an option." << endl;
         cout << "1 - Create New Account" << endl;
         cout << "2 - Modify Account" << endl;
         cout << "3 - Delete Account" << endl;
         cout << "4 - Admin Only" << endl;
         cin >> menuChoice;
         error = true;
    }while(menuChoice<1 || menuChoice>4);
    return menuChoice;
}

void insertData (Account acc)
{
     ofstream outfile ("account.dat", ios::out | ios::app);
     outfile << acc.accNum << endl;
     outfile << acc.cusName << endl;
     outfile << acc.deposit << endl;
     outfile << acc.withdraw << endl;
     outfile << acc.accType << endl;
     outfile.close();
}

void insertData (Account * pAcc, int size)
{
     ofstream outfile ("account.dat", ios::trunc);
     for(int x=0;x<size;x++)
     {     
             insertData (pAcc[x]);   
     }
     outfile.close();
}

void insertData (Account * pAcc, int size, int deleteIndex)
{
     ofstream outfile ("account.dat", ios::trunc);
     for(int x=0;x<size;x++)
     {     
           if(x!=deleteIndex)
               insertData (pAcc[x]);   
     }
     outfile.close();
}

void createAccount()
{
     Account newCus;
     cout << "Enter account number: ";
     cin >> newCus.accNum;
     cin.ignore(80, '\n');
     cout << "Enter name: ";
     cin.get(newCus.cusName,50);
     cin.ignore(80, '\n');
     cout << "Select account type (s-savings, c-current):";
     cin >> newCus.accType;
     cout << "Enter your initial deposit: ";
     cin >> newCus.deposit;
     
     newCus.withdraw = 0;
     
     insertData (newCus);
}

bool searchData(long accNum)
{
     ifstream infile ("account.dat");
     bool flag = false;
     while (!infile.eof())
     {
           Account acc;
           infile >> acc.accNum;
           infile >> acc.cusName;
           infile >> acc.deposit;
           infile >> acc.withdraw;
           infile >> acc.accType;
           
           if(accNum == acc.accNum)
           {
                flag = true;
                cout << "account found" << endl;
                break;
           }
           
     }
     infile.close();
     return flag;
}

int chooseModify()
{
    cin.ignore(80,'\n');
    int choice;
    cout << "Select an option: " << endl;
    cout << "1 - Change name" << endl;
    cout << "2 - Deposit Cash" << endl;
    cout << "3 - Withdraw Cash" << endl;
    cout << "4 - Change Account Type" << endl;
    cin >> choice;
    return choice;
}

int countRecord()
{

     int countData = 0;
     Account acc;
     ifstream infile ("account.dat");
     while (infile >> acc.accNum)
     {
           infile >> acc.cusName;
           infile >> acc.deposit;
           infile >> acc.withdraw;
           infile >> acc.accType;
           countData++;   
     }
     infile.close();
     return countData;
}

void changeName(long accNum)
{
     int recordSize = countRecord();
     char newName[50];
     cout << "Enter new name: ";
     cin.ignore(80,'\n');
     cin.get(newName,50);
     Account * pAcc;
     pAcc = new (nothrow) Account[recordSize];
     ifstream infile ("account.dat");
     for(int x=0;x<recordSize;x++)
     {
             
             Account acc;
             infile >> acc.accNum;
             infile >> acc.cusName;
             infile >> acc.deposit;
             infile >> acc.withdraw;
             infile >> acc.accType;
             
             if(acc.accNum == accNum)
             {
                 int i;
                 for(i=0;i<50;i++)
                 {
                     acc.cusName[i] = '\0';
                 }
                 i=0;
                 do
                 {
                     acc.cusName[i] = newName[i];
                     i++;
                 }while(newName[i]!='\0');
             }
             
             pAcc[x] = acc;
     }
     infile.close();
     insertData (pAcc,recordSize);
     cout << "Update Successful" << endl;     
}

void depositCash(long accNum)
{
     int recordSize = countRecord();
     double deposit;
     cout << "Enter deposit amount: ";
     cin >> deposit;
     Account * pAcc;
     pAcc = new (nothrow) Account[recordSize];
     ifstream infile ("account.dat");
     for(int x=0;x<recordSize;x++)
     {
             Account acc;
             infile >> acc.accNum;
             infile >> acc.cusName;
             infile >> acc.deposit;
             infile >> acc.withdraw;
             infile >> acc.accType;
             if(acc.accNum == accNum)
                 acc.deposit = acc.deposit + deposit;
             pAcc[x] = acc;
     }
     infile.close();
     insertData (pAcc,recordSize);
     cout << "Deposit successful" << endl;
}

void withdrawCash(long accNum)
{
     int recordSize = countRecord();
     double withdraw;
     cout << "Enter withdraw amount: ";
     cin >> withdraw;
     Account * pAcc;
     pAcc = new (nothrow) Account[recordSize];
     ifstream infile ("account.dat");
     for(int x=0;x<recordSize;x++)
     {
             
             Account acc;
             infile >> acc.accNum;
             infile >> acc.cusName;
             infile >> acc.deposit;
             infile >> acc.withdraw;
             infile >> acc.accType;
             
             if(acc.accNum == accNum)
             {
                 if((acc.deposit-acc.withdraw) < withdraw)
                     cout << "Insufficient account balance to withdraw" << endl;
                 else
                 {
                     acc.withdraw +=withdraw;
                     cout << "Withdrawal successful" << endl;
                 }
                     
             }
             
             pAcc[x] = acc;
     }
     infile.close();
     insertData (pAcc,recordSize);
}

void changeType(long accNum)
{
     int recordSize = countRecord();
     char accType;
     cout << "Select account type (s-savings, c-current):";
     cin >> accType;
     Account * pAcc;
     pAcc = new (nothrow) Account[recordSize];
     ifstream infile ("account.dat");
     for(int x=0;x<recordSize;x++)
     {
             
             Account acc;
             infile >> acc.accNum;
             infile >> acc.cusName;
             infile >> acc.deposit;
             infile >> acc.withdraw;
             infile >> acc.accType;
             
             if(acc.accNum == accNum)
                 acc.accType = accType;
             
             pAcc[x] = acc;          
     }
     infile.close();
     insertData (pAcc,recordSize);
     cout << "Update successful" << endl;
}

void modifyAccount()
{
     long accNum;
     bool found = false;
     int modifyChoice;
     do
     {
          cout << "Enter account number: ";
          cin >> accNum;
          
          found = searchData(accNum);
          if(found == false)
              cout << "Account not found" << endl;
          else
          {
              modifyChoice = chooseModify();
              switch(modifyChoice)
              {                    
              case 1: changeName(accNum);
                      break;
              case 2: depositCash(accNum);
                      break;
              case 3: withdrawCash(accNum);
                      break;
              case 4: changeType(accNum);
                      break;
              }
          }        
     }while (found == false);
}

void deleteData(long accNum)
{
     int recordSize = countRecord();
     int deleteIndex;
     Account * pAcc;
     pAcc = new (nothrow) Account[recordSize];
     ifstream infile ("account.dat");
     for(int x=0;x<recordSize;x++)
     {
             
             Account acc;
             infile >> acc.accNum;
             infile >> acc.cusName;
             infile >> acc.deposit;
             infile >> acc.withdraw;
             infile >> acc.accType;
             
             if(acc.accNum == accNum)
             {
                 deleteIndex=x;
             }  
             pAcc[x] = acc;       
     }
     infile.close();
     insertData (pAcc,(recordSize),deleteIndex);
     cout << "Account deleted" << endl;
}

void deleteAccount()
{
     long accNum;
     char confirm;
     bool found = false;
     do
     {
          cout << "Enter account number: ";
          cin >> accNum;
          
          found = searchData(accNum);
          if(found == false)
              cout << "Account not found" << endl;
          else
          {
              cout << "Are you sure you want to delete account?(Y/N): ";
              cin >> confirm;
              if(confirm == 'Y' || confirm == 'y')
              {
                  deleteData(accNum);
                  break;
              }
              else
                  break;
          }        
     }while (found == false);
}

bool adminMenu()
{
     return false;
} 

int main(void)
{
    bool flag = true;
    int menuChoice;
    
    do
    {
         menuChoice = chooseMenu();
         
         switch(menuChoice)
         {
              case 1: createAccount();
                      break;
              case 2: modifyAccount();
                      break;
              case 3: deleteAccount();
                      break;
              case 4: flag = adminMenu();
                      break;
         }
    }while(flag);
}

edit: file coding aku baru upload yg updated. yg lama tu ada benda2 kecik aku tak delete

sekian, terima kasih kerana membaca.
Assalamualaikum.

Monday, January 9, 2012

CSC159 - Chapter 2 : Numbering System (part 1)

Assalamualaikum

Chapter 2.
2.1 Numbering Representation – Hexadecimal, Octal
2.2 Converting between bases – Hexadecimal, Octal, Binary
2.3 Arithmetic operations (+, -) – Hexadecimal & Octal
2.4 Floating point Format using IEEE – Hex – IEEE

Untuk chapter ni lect aku tak bg slide kot. Atau aku yg tak simpan o-0. Jadi, aku pakai nota cskedah tu punya lah untuk cover entri ni. Link kat sini. Aku nasihat korang scan through skali dulu word tu baru baca entri ni. Sng sikit nk paham.

Basically, korang kena conquer 4 base, hexa, octal, binary dgn decimal. Decimal siapa tak conquer lg sila pergi darjah 1 xP . Sbg budak CS korang akan byk guna hexa, binary dgn decimal. Nak kata wajib tak lah, tapi kalau master 3 base ni mmg takde masalah laa bab2 assembly language dgn digital logic nanti. Part 5 nanti kalau nasib korg pun sama cam kitorg gak, terpaksa amek ITT270 Digital Electronic, yang sepatutnya subjek 'ELEKTIF'. Subjek tu 20-30% benda2 yg korg dh blajar dlm csc159 ; number base, digital logic.

Berbalik kpd topik.
2.1 Numbering Representation

Nombor yang kita selalu pakai 0,1,2,3,.....9,10,11,... infinity, ni sebenarnya base 10, atau decimal. System ni dipanggil base 10 sbb dia pakai 10 digit yang unik {0,1,2,3,4,5,6,7,8,9}. Itulah logiknya. So, kalau kata kita nak pakai system nombor base 4, digit2 yg boleh diterima pakai ialah {0,1,2,3}. Sentiasa start dari kosong {0}.

Boleh jee kalau korang nak pakai base 6 ke base 13 ke nk buat ape2 pun, tapi yang korg kena master dlm topik ni, base 2 (binary), base 8 (octal) dgn base 16 (hexadecimal). Mengikut logik yang sama,

base 2 cuma ada digit {0,1},
base 8 {0,1,2,3,4,5,6,7}
dn base 16 {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}.

Tapi, disbbkan {10,11,12,13,14,15} tu tak unik, maka digantikan dgn huruf {A,B,C,D,E,F} mengikut turutan.
A=10, B=11, C=12, D=13, E=14, F=15.

Kalau korg rujuk nota cskedah tu, tgk la jadual kt page 2 tu yang nampak sebijik macam ni:


Decimal
Binary
Octal
Hexadecimal
0
0000
0
0
1
0001
1
1
2
0010
2
2
3
0011
3
3
4
0100
4
4
5
0101
5
5
6
0110
6
6
7
0111
7
7
8
1000
10
8
9
1001
11
9
10
1010
12
A
11
1011
13
B
12
1100
14
C
13
1101
15
D
14
1110
16
E
15
1111
17
F

 Oh, penting jugak korg kena tau main power. Bukan power rangers, tapi power yg square,cube segala tu. Kalau dlm bahasamelayunya kuasa. Kuasa dua, kuasa tiga, kuasa empat. Sbbnya, nilai tempat untuk semua number base tu kita boleh cari dgn power. Tgk jadual kat page 1 tu dan cuba pahamkan. Aku serabut tgk jadual tu so, aku bg contoh sendiri kat sini.

Kita amek contoh nombor decimal 14. Nombor 14 ni 14 laa kan.
Tapi, kalau baca dari segi power decimal, 14 tu sebenarnya :
1X101 + 4X100 = 10 + 4 = 14

Konsep yang sama untuk semua base.
Binary : 14 = 11102 = 1X23 + 1X22 + 1X21 + 0X20 = 8 + 4 + 2 + 0 = 14
Octal : 14 = 168 = 1X81 + 6X80 = 8 + 6 = 14
Hexadecimal : 14 = E = 14X160 (takleh nk buat apa dah kekeke)

Power sentiasa start dgn kosong {0} dari digit yang paling kanan sekali.


2.2 Converting Between Bases.

Kita ada 4 number system yang nk dipakai, jadi ada banyak cara nak convert antara satu base ke satu base lain.
Decimal > Binary ,, Decimal > Octal ,, Decimal > Hexadecimal

Binary > Octal ,, Binary > Decimal ,, Binary > Hexadecimal

Octal > Binary ,, Octal > Decimal ,, Octal > Hexadecimal

Hexadecimal > Binary ,, Hexadecimal > Octal ,, Hexadecimal > Decimal

Hamek tu, 12 conversion, kikiki. Kalau rajin bljr lah semua. Page 4 sampai page 11. Mmg kena bljr semua pun, sbb kalau keluar soalan korang kena tunjuk working utk dapat markah. Tapi aku suka buat conversion2 yang ni jee, sbb sng. Nak convert apa2 pun aku mesti convert binary dulu.

DECIMAL <-> BINARY

Nothing much here. Probably what u guys have been doing all along. Bahagi nombor decimal tu dgn {2}, baki letak kt sebelah kanan tu (baki sentiasa {0} atau {1}, kalau dpt selain dari tu ada la yg silap tu). Hasil bahagi tu, bahagikan lagi dgn {2}. Ulang sampai dapat hasil kosong. Baki yg sebelah kanan tu, tulis balik mula dgn nombor paling bawah tu tulis paling kiri, nombor paling atas tu tulis paling kanan. Itulah conversion decimal ke binary.
Binary ke decimal pulak, ada dua cara yang aku suka guna. Cara pertama macam dlm gambar atas sebelah kanan tu. Aku tulis power untuk stiap tempat digit (sbb power sentiasa start dgn {0} dari kanan). Lepas tu darab jaa setiap digit {1} dlm binary tu dgn power base {2} macam kt atas tu. dah darab, jumlahkan semua. Cara kedua, aku congak terus nilai setiap tempat digit tu(feveret). Dari kanan, nilai tempat {1,2,4,8,16,31,64,128,256,512,1024,2048.......}(perasan tak nombor2 ni kt mana2?), base 2 senang sbb semua gandaan dua untuk nombor yg seterusnya. Instead of tulis power, aku terus tulis nilai untuk kira. Lepas tu aku cuma jumlahkan semua nilai tu.

OCTAL <-> BINARY

Ini benda yang paling senang. Pisahkan setiap digit octal tu. Lepas tu tukar nilai tiap2 digit tu kpd tiga digit binary. Lepas dh tukar, gabungkan jee nombor binary tu.
Binary ke octal pulak, pisahkan nombor2 binary tu TIGA PER TIGA DARI KANAN. Kalau yang hujung kiri tu tak cukup tiga digit, anggap jaa ada digit {0} kt depan tuu bg cukup tiga. Lagi skali, tukar binary tu jadi decimal secara berasingan. Sudah tukar, kasi gabung, selesai.

Kenapa????
Ingat, base 8 ada nombor {0,1,2,3,4,5,6,7} digit paling tinggi {7}. Dalam binary, digit {7} ditulis sebagai 111. Sbb tu kita pisah tiga per tiga. Sbb semua nilai base 8 boleh diganti dgn mana2 gabungan 3 digit base 2.

HEXADECIMAL <-> BINARY

Yang ini sama jee dgn octal, beza nya yang ni ada 4 digit binary untuk setiap satu digit hexa.

Kenapa????
Ingat, base 16 ada nombor {0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F} digit paling tinggi {F}. Dalam binary, digit {F} ditulis sebagai 1111. Sbb tu kita pisah 4by4.  Sbb semua nilai base 16 boleh diganti dgn mana2 gabungan 4 digit base 2.

Nampak tak berapa byk pakai binary kt sini? Semua nk kena binary ooooohhh. Tak masuk lagi truth table, {1} dgn {0} gak. Digital Logic nanti {1}  dgn {0} gak. Semua tu binary lah. Sbbnya, computer atau machine ni paham satu benda jaa. Suis. On/Off, {1}/{0}. Takdak benda lain dah. Core number system utk CS ni binary lah (self-proclaimed xP). Conquer binary, conquer semua base *whistles*

Untuk conversion2 yang lain, aku cuma pakai gabungan 2 conversion kt atas. Contoh nk buat Hexa > Decimal, aku buat Hexa > Binary, Binary > Decimal. Bukan sbb sng nk buat (sng apenye kalau kena buat dua conversion sekali), tapi sebab aku malas nk ingat conversion yg lain. Ingat, matematik, nombor, dan programming, semuanya bergantung kpd REASONING atau LOGIK. Selagi ada jalan logik, betul lah jawapan tu.(tapi bukan logik fallacy lah, xP). Anyway, cara conversion yang macam mana pun, bergantung kpd keselesaan masing2. Aku xleh paksa semua ikut cara aku. Sbb tu ada nota tu, page 4- 11 tu semua conversion. Cari cara yg korang selesa buat.

Ok, nanti sambung part 2. Apa2, mcm biasa, komen kt bawah tu. Kat tepi kanan tu pun ada chatbox, shoutout jee.

Assalamualaikum