Advertisement
akevintg

(MATERIAL REVIEW) UAP + PROBLEM

Jun 8th, 2014
472
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 14.69 KB | None | 0 0
  1. //
  2. //  main.cpp
  3. //  UAP
  4. //
  5. //  Created by Alexander Kevin on 6/8/14.
  6. //  Copyright (c) 2014 Alexander Kevin. All rights reserved.
  7. //
  8.  
  9. //info seputar UAP
  10. //- 100 menit , kerjakan 1 soal
  11. //- Inheritance
  12. //- Array of Objects
  13. //- gk boleh ada global variabel
  14. //- gk boleh input/ output within class
  15. //
  16. //NOTES:
  17. //1)    There are 2 classes needed here
  18. //2)    Inheritance
  19. //3)    String class is allowed
  20. //4)    Vector (???) / Array of objects
  21. //5)    Another variety of the problem: such as update data or find and display
  22. //
  23. //|>    PRE-MENU
  24. //  - Input USERNAME:
  25. //      1) Combination of numbers and alphabets
  26. //      2) 5 - 20 characters
  27. //      3) One word only
  28. // 
  29. //|>    MAIN MENU
  30. //  - Display USERNAME
  31. //  - Menu 1 : Make an Order
  32. //  - Menu 2 : View Your Order
  33. //  - Menu 3 : Delete Order
  34. //  - Menu 4 : Pay Order
  35. // 
  36. //|>    MENU 1 - Make an order
  37. //  - Validate maximum number of existing order is 4 (both yogurt and special yogurt)
  38. //  - Input FLAVOUR (Coffee, Green Tea, Mocha)
  39. //  - Input TYPE (Balkan, Swiss, Greek)
  40. //  - Input SIZE (Small, Medium, Large)
  41. //  - Ask for TOPPING:
  42. //      (+) If YES, then input TOPPING (Lychee, Dark Chocolate, Marshmallow)
  43. //      (-) Continue program
  44. //  - Generate ORDERID:
  45. //      Format: ORD-ABC-XXYY
  46. //      Where ABC -> First 3 character of USERNAME
  47. //            X   -> Random alphabet (A-Z)
  48. //            Y   -> Random number (0-9)
  49. //  - Calculate PRICE by sum up the value according the order made:
  50. //      1)  FLAVOUR
  51. //          - Coffee            : 15000
  52. //          - Green Tea         : 16000
  53. //          - Mocha             : 17000
  54. //      2)  TYPE
  55. //          - Balkan            : 6000
  56. //          - Swiss             : 7000
  57. //          - Greek             : 8000
  58. //      3)  SIZE
  59. //          - Small             : 2000
  60. //          - Medium            : 3000
  61. //          - Large             : 4000
  62. //      4)  TOPPING
  63. //          - Lychee            : 4000
  64. //          - Dark Chocolate    : 5000
  65. //          - Marshmallow       : 6000
  66. //  - Display the detail of the order
  67. //
  68. //|>    MENU 2 - View your order
  69. //  - Validate whether there is order or not (display message)
  70. //  - Display all the order have been made
  71. //
  72. //|>    MENU 3 - Delete Order
  73. //  - Validate whether there is order or not (display message)
  74. //  - Input ORDERID, validate that input should be matched the ORDERID formatting
  75. //      Format: ORD-ABC-XXYY
  76. //      Where ABC -> First 3 character of USERNAME
  77. //            X   -> an alphabet (A-Z)
  78. //            Y   -> a number (0-9)
  79. //  - If the data is found, delete the data. Else, display error message
  80. //
  81. //|>    MENU 4 - Pay Order
  82. //  - Validate whether there is order or not (display message)
  83. //  - If there is data exist, calculate total payment of all orders
  84. //  - Input user payment (Minimum is the amount of payment)
  85. //  - Calculate the change, if there is any
  86. //  - Display message
  87. //  - Exit the program
  88. //           
  89. //
  90. #include <iostream>
  91. #include <string>
  92. #include <time.h>
  93. #define abc cin.sync();cin.clear();//menganti pengektikan cin sync,clear dengan hanya mengetik abc
  94.  
  95. using namespace std;
  96. //ga ada global variable +2 point
  97. void menu(string,int);//function prototype
  98. string regist();//untuk buat id
  99. bool cekUser(string);//untuk loop cek id
  100.  
  101. class basic{//deklarasi class <- 5 point , implementasi 5 point, definition 10 point, skor dari class total 35 point;
  102. protected://dibuat protected supaya bisa diakses anak class/inheritancenya
  103.     string type;//<-data member 2 point
  104.     string size;//pake string bair ga ribet
  105.     string flavor;
  106.     int price;
  107.     string code;
  108. public:
  109.     basic(){//constructor
  110.         type="";
  111.         size="";
  112.         flavor="";
  113.         price=0;
  114.         code="";
  115.     }
  116.     void setBasic(string a,string b,string c,string d){//<-Setter(passing by value) 2point. Ga boleh ada input(cin) dalam class (2point)
  117.         flavor=a;
  118.         type=b;
  119.         size=c;
  120.         price=0;
  121.         code="ORD-";//code awal pasti pake depan ORD-
  122.         code=code+d.substr(0,3)+'-';//ngambil 3 huruf pertama user
  123.         srand(time(NULL));//buat ngerandom
  124.         char x;//buat nyetaknya
  125.         x=rand()%26+65;//26 dari total alphabet(a-z), 65 dari ascii A=65 harus huruf besar*
  126.         code=code+x;//code ditambah huruf yg d random diatas
  127.         x=rand()%26+65;
  128.         code=code+x;
  129.         x=rand()%10+48;//10 dari total angka(0-9), 48 dari ASCII 0=48;
  130.         code=code+x;//code ditambah angka yg di random di atas
  131.         x=rand()%10+48;
  132.         code=code+x;
  133.         if(flavor=="Coffee")//kalo input kopi harga sekian dst
  134.             price+=15000;
  135.         else if(flavor=="Green Tea")
  136.             price+=16000;
  137.         else
  138.             price+=17000;
  139.         if(flavor=="Balkan")
  140.             price+=6000;
  141.         else if(flavor=="Swiss")
  142.             price+=7000;
  143.         else
  144.             price+=8000;
  145.         if(flavor=="Small")
  146.             price+=2000;
  147.         else if(flavor=="Medium")
  148.             price+=3000;
  149.         else
  150.             price+=4000;
  151.     }
  152.     string getType(){//getter(2point)
  153.         return type;
  154.     }
  155.     string getSize(){
  156.         return size;
  157.     }
  158.     string getFlavor(){
  159.         return flavor;
  160.     }
  161.     int getPrice(){
  162.         return price;
  163.     }
  164.     string getCode(){
  165.         return code;
  166.     }
  167.     ~basic(){
  168.     }
  169. };
  170.  
  171. class detail:public basic{// inheritance dari class public 5point
  172. private:
  173.     string topping;
  174. public:
  175.     detail(){
  176.         topping="No Topping";
  177.     }
  178.     void setTopping(string a){// di passing value stringnya (setter)
  179.         topping=a;
  180.         if(topping=="Lychee")//tentuin harga
  181.             price+=4000;
  182.         else if(topping=="Dark Chocolate")
  183.             price+=5000;
  184.         else
  185.             price+=6000;
  186.     }
  187.     string getTopping(){//getter
  188.         return topping;
  189.     }
  190.     ~detail(){//destructor
  191.         cout<<code<<" DELETED"<<endl;
  192.     }
  193. };
  194.  
  195. void e(){//buat spasi(tampilan)
  196.     int x=0;
  197.     do{
  198.         cout<<endl;
  199.         x++;
  200.     }while(x<27);
  201. }
  202.  
  203. bool cekUser(string a){//booltipe data yg mereturn true / false, baiknya diggunain di loop
  204.     if(a.length()<5||a.length()>20)//cek ukuran
  205.         return false;
  206.     else if(a.find(" ")<20)//cek ga boleh ada lebih dari 1 kata, cari " ". kalo ga ketemu dia mereturn 490xxxx
  207.         return false;
  208.     int w=0,z=0,x=0;//w untuk is alpha, z untuk isdigit, x untuk loop kalo di for sering dipake isitilah int i=0
  209.     while(x<a.length()){
  210.         if(isalpha(a[x]))//is alpha cek huruf atau enga kalo iya dia return true
  211.             w=1;
  212.         if(isdigit(a[x]))//is digit cek angka atau enga kalo iya dia return true
  213.             z=1;
  214.         x++;
  215.     }
  216.     if(w==1&&z==1)//baru bakal kirim true kalo smeua syarat bener
  217.         return true;
  218.     else
  219.         return false;
  220. }
  221.  
  222. string regist(){//untuk registrasi id
  223.     e();//sekedar tampilan
  224.     string a;
  225.     cout<<"Username Requirement :"<<endl<<"1) Combination of numbers and alphabets"<<endl<<"2) 5 - 20 characters"<<endl<<"3) One word only"<<endl;
  226.     while(!cekUser(a)){//loop cek username
  227.         cout<<"Masukan Username Anda :";//output 2 point
  228.         getline(cin,a);abc;//input 2 point, kalo string jangan lupa pake getline(cin,<nama_string>);
  229.         cekUser(a);//di passing yg barusan "a" yg di input user
  230.     }
  231.     return a;
  232. }
  233.  
  234. void menu(string id,int jumlah){
  235.     system("cls");
  236.     e();
  237.     static detail ord[10];//<- array of object (5 point) dibikin static supaya constructor ga kepanggil terus2an. kelemaanya satu ga dinamis (cuma bisa 10/sesuai yg ditentuin di awal)
  238.     //^ bisa diganti juga dengan nantinya pake object *array[]=new object[n];tar di Bagian apus data diubah jadi delete array[];(lebih ribet dan berhubung ga ada di penilaian pake static aja)
  239.     int count;
  240.     count=jumlah;//tampung nilai jumlah <- jadi repot gini soalnya ga boleh pake var Global
  241.     cout<<"MAIN MENU"<<endl
  242.         <<"Welcome, "<<id<<endl
  243.         <<"1. Make an Order"<<endl
  244.         <<"2. View Your Order"<<endl
  245.         <<"3. Delete Order"<<endl
  246.         <<"4. Pay Order"<<endl;
  247.     int answer;
  248.     cout<<"Masukan Pilihan : ";
  249.     cin>>answer;abc;//abc penganti cin.sync(),cin.clear() yg tadi di define diatas
  250.     switch(answer){
  251.         case 1:
  252.         {  
  253.             string a1,a2,a3,a4;
  254.             system("cls");
  255.             e();
  256.             int flag=0;
  257.             while(flag==0){//cek udah bener inputnya, kalo mau bisa di bikin kaya bool cekFlavor() cuma tar passing2 nya ribet sendiri
  258.                 cout<<"Input FLAVOUR (Coffee, Green Tea, Mocha) : ";
  259.                 getline(cin,a1);abc;
  260.                 if(a1=="Coffee"||a1=="Green Tea"||a1=="Mocha")
  261.                     flag=1;
  262.             }
  263.             flag=0;//balikin ke 0 jangan lupa
  264.             while(flag==0){//cek udah bener inputnya
  265.                 cout<<"Input TYPE (Balkan, Swiss, Greek) : ";
  266.                 getline(cin,a2);abc;
  267.                 if(a2=="Balkan"||a2=="Swiss"||a2=="Greek")
  268.                     flag=1;
  269.             }
  270.             flag=0;
  271.             while(flag==0){//cek udah bener inputnya
  272.                 cout<<"Input SIZE (Small, Medium, Large) : ";
  273.                 getline(cin,a3);abc;
  274.                 if(a3=="Small"||a3=="Medium"||a3=="Large")
  275.                     flag=1;
  276.             }
  277.             cout<<"Add Topping[Y/N]?";//cek mau tambah topping ga
  278.             getline(cin,a4);abc;
  279.             if(a4=="Y"){
  280.                 flag=0;
  281.                 while(flag==0){
  282.                     cout<<"Input TOPPING (Lychee, Dark Chocolate, Marshmallow) : ";
  283.                     getline(cin,a4);abc;
  284.                     if(a4=="Lychee"||a4=="Dark Chocolate"||a4=="Marshmallow")
  285.                         flag=1;
  286.                 }
  287.                 ord[count].setTopping(a4);//implementasi array 3 point
  288.             }
  289.             ord[count].setBasic(a1,a2,a3,id);//implementasi array 3 point
  290.             cout<<endl<<"Detail Order"<<endl<<"==========================="<<endl
  291.             <<"Flavor : "<<ord[count].getFlavor()<<endl//ga di buat void view() soalnya di class jangan ada Input maupun output mengurangi nilai 2 point kalo ampe ada
  292.             <<"Type : "<<ord[count].getType()<<endl//jadi mau ga mau mesti di luar class kaya gini
  293.             <<"Size : "<<ord[count].getSize()<<endl
  294.             <<"Topping : "<<ord[count].getTopping()<<endl
  295.             <<"Price: "<<ord[count].getPrice()<<endl
  296.             <<"Code : "<<ord[count].getCode()<<endl;
  297.             cin.get();//supaya ga langsung ilang
  298.             count++;//udah semua beres valid jangan lupa di ++ countnya
  299.             menu(id,count);//lempar lagi id nya ama count yg udah ditambah barusan. sebenrnya bisa ga pasiing kalo boleh var global >,<
  300.             break;
  301.         }
  302.         case 2:
  303.             system("cls");
  304.             e();
  305.             if(count>0){//cek ada ga pesennya kalo ga ada langsung else
  306.             cout<<"Detail Order"<<endl<<"==========================="<<endl;//ini juga sama mestinya bisa di singkat pake void view() cuma berhubung ga boleh ya sudah.
  307.                 for(int i=0;i<count;i++){
  308.                     cout
  309.                     <<"Flavor : "<<ord[i].getFlavor()<<endl//i itu index arraynya
  310.                     <<"Type : "<<ord[i].getType()<<endl
  311.                     <<"Size : "<<ord[i].getSize()<<endl
  312.                     <<"Topping : "<<ord[i].getTopping()<<endl
  313.                     <<"Price : "<<ord[i].getPrice()<<endl
  314.                     <<"Code : "<<ord[i].getCode()<<endl<<endl;
  315.                 }
  316.             }
  317.             else{//kalo belom pesen
  318.                 cout<<"Belum Melakukan Pemesanan Apapun, Kembali ke menu";
  319.             }
  320.             cin.get();
  321.             menu(id,count);
  322.             break;
  323.         case 3:
  324.         {
  325.             system("cls");
  326.             e();
  327.             string hapus;
  328.             int flag=-1;
  329.             if(count>0){//cek udah order belom
  330.                 cout<<"List Order"<<endl<<"==========================="<<endl;//tunjukin dulu list kodenya, ga mungkin user afal. kalo di contoh aplikasnya ini ga ada jadi terserah mau dibuat apa enga
  331.                 for(int i=0;i<count;i++){
  332.                     cout<<"Code : "<<ord[i].getCode()<<endl<<endl;
  333.                 }
  334.                 while(flag==-1){//falg -1 kenapa? karena mungkin aja yg mau dia pus di index 0, tapi kan ga mungkin di -1
  335.                     cout<<"Masukan Code yang ingin di delete : ";
  336.                     getline(cin,hapus);abc;
  337.                     for(int i=0;i<count;i++){//cek ada di index mana
  338.                         if(ord[i].getCode()==hapus)
  339.                             flag=i;//catet indeknya di flag
  340.                     }
  341.                     if(flag==-1)//kalo ternyata ga ada/ slaah input
  342.                         cout<<"Code yang anda masukan salah"<<endl;
  343.                 }
  344.                 for(int i=flag;i<count-1;i++)//pindhain ke paling belakang kaya algo waktu delete-sort
  345.                     ord[i]=ord[i+1];
  346.                 ord[count].~detail();//panggil destructornya buat ngapus isi object, kalo di atas mau pake yg object *array[]=new object[]; , disini ganti jadi delete array[];
  347.                 count--;//udah sukss apus di -- jangan lupa;
  348.                 cout<<"Sukses Mengahapus Order "<<hapus;//hapus intu kode smenetara yg diinput diatas
  349.             }
  350.             else//kalo belom pesen
  351.                 cout<<"Belum Melakukan Pemesanan Apapun, Kembali ke menu";
  352.             cin.get();
  353.             menu(id,count);
  354.             break;
  355.         }
  356.         case 4:
  357.             system("cls");
  358.             e();
  359.             if(count>0){
  360.                 int total=0,payment=0;//total buat itung biaya, payment buat tar dinput user
  361.                 for(int i=0;i<count;i++){//looping cek masing2 di jumlah
  362.                     total+=ord[i].getPrice();
  363.                 }
  364.                 cout<<"total payment of all orders : Rp. "<<total<<",00"<<endl;//print totalnya
  365.                 while(payment<total){//looping kurang ga bayarnya
  366.                     cout<<"Masukan Input user payment (Minimum is the amount of payment) : ";
  367.                     cin>>payment;abc;
  368.                 }
  369.                 if(payment>total)//kalo ada kembalian
  370.                     cout<<"Your Change is Rp. "<<(payment-total)<<",00"<<endl;//(payment-total) itu biar langsung ngeprint tanpa perlu nambah variable buat sekedar nampung doank
  371.                 cout<<"Thank You, See you next time!";//udah jangan di menu() lagi kan abis check out program mati
  372.             }
  373.             else{//kalo belom ada
  374.                 cout<<"Belum Melakukan Pemesanan Apapun, Kembali ke menu";
  375.                 cin.get();
  376.                 menu(id,count);//balik ke menu
  377.                 break;
  378.             }
  379.             cin.get();//satu2nya jalan keluar program adalah dengan pesen min 1 dan bayar
  380.             break;
  381.         default:
  382.             menu(id,count);//kalo user slaah input menu
  383.             break;
  384.     }
  385. }
  386.  
  387. int main(){
  388.     int count=0;//buat ngasih tau masih 0;kalo di declare di menu atas setiap masuk menu bakla balik ke 0 >,< jadi harus dipisah decalrenya. again karena ga boleh var global !
  389.     menu(regist(),count);//regis buat user id, count yg tadi dipoer diatas;
  390. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement