Advertisement
Guest User

Untitled

a guest
Jun 24th, 2019
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.52 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstring>
  3.  
  4. using namespace std;
  5. class Date{
  6. int dd,mm, yy;
  7. public:
  8.    Date(int d=1,int m=1,int g=1900){
  9.         dd=d;
  10.         mm=m;
  11.         yy=g;
  12.     }
  13.     static int compare(Date d1,Date d2){
  14.         if(d1.yy<d2.yy)       return 1;
  15.         else if (d1.yy>d2.yy) return -1;
  16.         else if (d1.mm<d2.mm) return 1;
  17.         else if (d1.mm>d2.mm) return -1;
  18.         else if (d1.dd<d2.mm) return 1;
  19.         else if (d1.dd>d2.dd) return -1;
  20.         else return 0;
  21.     }
  22.     int getDay() const{
  23.         return dd;
  24.     }
  25.     int getMonth()const{
  26.         return mm;
  27.     }
  28.     int getYear()const{
  29.         return yy;
  30.     }
  31. };
  32.  
  33. class InvalidAccountNumber{
  34. private:
  35.     char *invalidID;
  36.     char *passedMessage;
  37. public:
  38.     InvalidAccountNumber(char *invalidID,char *passedMessage){
  39.         this->invalidID=invalidID;
  40.         this->passedMessage=passedMessage;
  41.     }
  42.     void message(){
  43.         cout<<passedMessage<<endl;
  44.     }
  45. };
  46.  
  47. class Transaction{
  48. private:
  49.     char *name;
  50.     char ID[16];
  51.     float transactionValue;
  52.     Date date;
  53. public:
  54.  
  55.     Transaction(char *name,char*ID,float transactionValue,Date date){
  56.         this->transactionValue=transactionValue;
  57.         strcpy(this->name,name);
  58.         validateFormat(ID);
  59.         validateLen(ID);
  60.         strcpy(this->ID,ID);
  61.         this->date=date;
  62.     }
  63.    
  64.     void validateFormat(char*ID){
  65.         int k=0;
  66.         while(ID[k]!='\0')
  67.             if(isdigit(ID[k])==0)
  68.                 throw new InvalidAccountNumber(ID,"Non-digit account number format");
  69.             else
  70.                 k++;
  71.     }
  72.    
  73.     void validateLen(char*ID){
  74.         int len=0;
  75.         int k=0;
  76.         while(ID[k]!='\0'){
  77.             if(isdigit(ID[k])!=0)
  78.                 len++;
  79.             k++;
  80.         }
  81.         if(len!=15)
  82.             throw new InvalidAccountNumber(ID,"Error in the number of chars");
  83.     }
  84.  
  85.     Transaction(const Transaction &t1){
  86.         transactionValue=t1.transactionValue;
  87.         strcpy(name,t1.name);
  88.         strcpy(ID,t1.ID);
  89.         date=t1.date;
  90.     }
  91.  
  92.     Transaction& operator=(Transaction &t1){
  93.         if(this!=&t1){
  94.             delete[]name;
  95.             transactionValue=t1.transactionValue;
  96.             strcpy(name,t1.name);
  97.             strcpy(ID,t1.ID);
  98.             date=t1.date;
  99.         }
  100.         return *this;
  101.     }
  102.  
  103.     friend ostream& operator<<(ostream &out,const Transaction &t1)
  104.     {
  105.         if(t1.transactionValue<0)
  106.             out<<"Outflow ";
  107.         else
  108.             out<<"Inflow ";
  109.  
  110.         out<<t1.transactionValue<<" "<<t1.name<<"(";
  111.         for(int i=0;i<16;i++)
  112.             out<<t1.ID[i];
  113.         out<<")-"<<t1.date.getDay()<<"."<<t1.date.getMonth()
  114.         <<"."<<t1.date.getYear()<<endl;
  115.         return out;
  116.     }
  117.  
  118.     float getBalance(){
  119.         return transactionValue;
  120.     }
  121.  
  122.     bool getFlow(){
  123.         return transactionValue>0;
  124.     }
  125.  
  126.     Date getDate(){
  127.         return date;
  128.     }
  129. };
  130.  
  131. void trySort(Transaction **transactions,int N){
  132.     for(int i=0;i<N-1;i++)
  133.     for(int j=i+1;j<N;j++){
  134.         if(Date::compare(transactions[i]->getDate(),transactions[j]->getDate())==-1){
  135.             Transaction *t=transactions[i];
  136.             transactions[i]=transactions[j];
  137.             transactions[j]=t;
  138.         }
  139.     }
  140. }
  141.  
  142. class TransactionAccount{
  143. private:
  144.  
  145.     char *name;
  146.     char ID[16];
  147.     Transaction**transactions;
  148.     int numberOfTransactions;
  149.     int transactionCapacity;
  150. public:
  151.     TransactionAccount(char *name,char *ID){
  152.         strcpy(this->name,name);
  153.         strcpy(this->ID,ID);
  154.         numberOfTransactions=0;
  155.         transactionCapacity=3;
  156.         transactions=new Transaction*[transactionCapacity];
  157.     }
  158.     TransactionAccount(){
  159.         numberOfTransactions=0;
  160.         transactionCapacity=3;
  161.         transactions=new Transaction*[transactionCapacity];
  162.     }
  163.  
  164.     TransactionAccount(const TransactionAccount &t1){
  165.         strcpy(name,t1.name);
  166.         strcpy(ID,t1.ID);
  167.         numberOfTransactions=t1.numberOfTransactions;
  168.         transactionCapacity=t1.transactionCapacity;
  169.         transactions=new Transaction*[transactionCapacity];
  170.         for(int i=0;i<numberOfTransactions;i++)
  171.             transactions[i]=t1.transactions[i];
  172.     }
  173.     TransactionAccount& operator=(const TransactionAccount &t1){
  174.         if(this!=&t1){
  175.             delete[]*transactions;
  176.             strcpy(name,t1.name);
  177.         strcpy(ID,t1.ID);
  178.         numberOfTransactions=t1.numberOfTransactions;
  179.         transactionCapacity=t1.transactionCapacity;
  180.         transactions=new Transaction*[transactionCapacity];
  181.         for(int i=0;i<numberOfTransactions;i++)
  182.             transactions[i]=t1.transactions[i];
  183.         }
  184.         return *this;
  185.     }
  186.  
  187.     void addTransaction(Transaction &t){
  188.         if(numberOfTransactions==transactionCapacity){
  189.             transactionCapacity*=2;
  190.             Transaction **transactionTemp=new Transaction*[transactionCapacity];
  191.             for(int i=0;i<numberOfTransactions;i++)
  192.                 transactionTemp[i]=transactions[i];
  193.  
  194.             transactionTemp[numberOfTransactions++]=&t;
  195.             delete[]*transactions;
  196.             transactions=transactionTemp;
  197.         }else{
  198.             transactions[numberOfTransactions++]=&t;
  199.         }
  200.     }
  201.  
  202.     void reportTransaction(Date from,Date to,bool isInflow){
  203.         Transaction **transactionTemp=new Transaction*[transactionCapacity];
  204.         int k=0;
  205.         for(int i=0;i<numberOfTransactions;i++){
  206.                 if(Date::compare(transactions[i]->getDate(),from)==-1&&
  207.                    Date::compare(transactions[i]->getDate(),to)==1){
  208.                     if(isInflow){
  209.                             if(transactions[i]->getFlow())
  210.                             transactionTemp[k++]=transactions[i];
  211.                     }else
  212.                         transactionTemp[k++]=transactions[i];
  213.             }
  214.         }
  215.  
  216.         trySort(transactionTemp,numberOfTransactions);
  217.         for(int i=0;i<k;i++)
  218.             cout<<transactionTemp[i];
  219.     }
  220.  
  221.     float getBalance(){
  222.         float total=0;
  223.         for(int i=0;i<numberOfTransactions;i++)
  224.             total+=transactions[i]->getBalance();
  225.         return total;
  226.     }
  227.  
  228.     int getTransCapacity(){
  229.         return transactionCapacity;
  230.     }
  231.  
  232.     int getTransNumber(){
  233.         return numberOfTransactions;
  234.     }
  235.  
  236.     Transaction** getTransList(){
  237.         return transactions;
  238.     }
  239.  
  240. };
  241.  
  242. int main(){
  243.  
  244. char name[50],number[16];
  245. float amount;
  246. int d,m,y;
  247. int n;
  248. bool isInflow;
  249. TransactionAccount ta;
  250. int testcase;
  251. cin>>testcase;
  252.  
  253. switch (testcase){
  254.   case 1:
  255.      {
  256.       cout<<"------Transaction test------"<<endl;
  257.       cin>>name;
  258.       cin>>number;
  259.       cin>>amount;
  260.       cin>>d>>m>>y;
  261.       Transaction t(name,number,amount,Date(d,m,y));
  262.       cout<<t;
  263.      }
  264.       break;
  265.   case 2:
  266.       {cout<<"------TransactionAccount test:constructor, desctuctor & get-functions------"<<endl;
  267.       cin>>name;
  268.       cin>>number;
  269.       TransactionAccount ta(name,number);
  270.       cin>>n;
  271.       for (int j=0;j<n;j++)
  272.       {
  273.  
  274.           cin>>name>>number>>amount>>d>>m>>y;
  275.           Transaction t(name,number,amount,Date(d,m,y));
  276.           ta.addTransaction(t);
  277.       }
  278.       cout<<"Capacity: "<<ta.getTransCapacity()<<endl;
  279.       cout<<"Number of elements: "<<ta.getTransNumber()<<endl;
  280.       cin>>n;
  281.       cout<<"The element on position "<<n<<" is "<<endl;
  282.       cout<<(ta.getTransList())[n];
  283.       }  break;
  284.   case 3:
  285.       {cout<<"------TransactionAccount: getSaldo------"<<endl;
  286.       cin>>name;
  287.       cin>>number;
  288.       TransactionAccount ta(name,number);
  289.       cin>>n;
  290.       for (int j=0;j<n;j++)
  291.       {
  292.  
  293.           cin>>name>>number>>amount>>d>>m>>y;
  294.           Transaction t(name,number,amount,Date(d,m,y));
  295.           ta.addTransaction(t);
  296.  
  297.       }
  298.       cout<<"Balance: "<<ta.getBalance()<<endl;
  299.       }  break;
  300.   case 4:
  301.       {cout<<"------TransactionAccount: reportTransaction & Exception------"<<endl;
  302.       cin>>name;
  303.       cin>>number;
  304.       ta=TransactionAccount(name,number);
  305.       cin>>n;
  306.       for (int j=0;j<n;j++)
  307.       {
  308.           try{
  309.           cin>>name>>number>>amount>>d>>m>>y;
  310.           Transaction t(name,number,amount,Date(d,m,y));
  311.           ta.addTransaction(t);
  312.           }
  313.           catch (InvalidAccountNumber e){
  314.               e.message();
  315.           }
  316.       }
  317.       cin>>d>>m>>y;
  318.       Date d1(d,m,y);
  319.       cin>>d>>m>>y;
  320.       Date d2(d,m,y);
  321.       cin>>isInflow;
  322.       ta.reportTransaction(d1,d2,isInflow);
  323.       }  break;
  324.  
  325. };
  326.  
  327. return 0;
  328. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement