Advertisement
Guest User

Untitled

a guest
Jul 23rd, 2018
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 14.19 KB | None | 0 0
  1. /*
  2. ================================================================================
  3. Datorer och programmering, DoP, 10 hsp, termin/år:ST18
  4.  
  5. Inlämningsuppgift nr 6a
  6.  
  7. Namn: Max Sonebäck
  8.  
  9. Personummer: 9302205472
  10.  
  11. Fyll i (alt stryk det som ej är relevant) av nedanstående:
  12.  
  13. Den fil som jag lämnar in går att kompilera och
  14. programmet fungerar för alla de testdata som finns för uppgiften: Ja/Nej
  15.      Om Nej, beskriv vilka testdata som ger problem:  __________________
  16.  
  17. Jag har använt kompilator/editor (namn/version) ___________________________
  18.  
  19. Jag har använt följande dator (PC/Mac/Annat): PC
  20.       med operativsystemet: Windows
  21.  
  22. Jag har arbetat ungefär  16 timmar med denna uppgift
  23. ================================================================================
  24.  */
  25.  
  26. #include <cstdlib>
  27. #include <iostream>
  28. #include <string>
  29. #include <fstream>
  30. #include <cctype>
  31. #include <cmath>
  32. #include <valarray>
  33.  
  34. using namespace std;
  35.  
  36. const int MAX_KOMPISAR = 20;
  37. const int MAX_PERSONER = MAX_KOMPISAR;
  38. const int MAX_TRANSAKTIONER = 100;
  39.  
  40. class Person {
  41. private:
  42.     string namn;
  43.     double betalat_andras; // ligger ute med totalt
  44.     double skyldig; // skyldig totalt
  45.  
  46. public:
  47.     Person();
  48.     Person(string n, double b, double s);
  49.     double haemta_betalat();
  50.     double haemta_skyldig();
  51.     string haemta_namn();
  52.     double raekna_differans(double a, double b);
  53.     void skrivUt();
  54. };
  55.  
  56. class PersonLista {
  57. private:
  58.     int antal_pers;
  59.     Person pers[MAX_PERSONER];
  60.  
  61. public:
  62.     PersonLista();
  63.     ~PersonLista();
  64.     void laggTillEn(Person pny);
  65.     void skrivUtOchFixa();
  66.     double summaSkyldig();
  67.     double summaBetalat();
  68.     bool finnsPerson(const string& namn);
  69. };
  70.  
  71. class Transaktion {
  72. private:
  73.     string datum;
  74.     string typ;
  75.     string namn;
  76.     double belopp;
  77.     int ant_kompisar;
  78.     string kompisar[MAX_KOMPISAR];
  79.  
  80. public:
  81.     Transaktion();
  82.     ~Transaktion();
  83.     string haemta_namn();
  84.     double haemta_belopp();
  85.     int haemta_ant_kompisar();
  86.     bool finnsKompis(string namnet);
  87.     bool laesEnTrans(istream &is);
  88.     void skrivEnTrans(ostream &os);
  89. };
  90.  
  91. class TransaktionsLista {
  92. private:
  93.     Transaktion trans[MAX_TRANSAKTIONER];
  94.     int antalTrans;
  95.  
  96. public:
  97.     TransaktionsLista();
  98.     ~TransaktionsLista();
  99.     void laesin(istream &is);
  100.     void skrivut(ostream &os);
  101.     void laggTill(Transaktion &t);
  102.     double totalkostnad();
  103.     double liggerUteMed(string namnet);
  104.     double aerSkyldig(string namnet);
  105.     PersonLista FixaPersoner();
  106. };
  107.  
  108.  
  109. //string namn_pa_fil();
  110. //ifstream oppnaIfstream(const string);
  111. int meny();
  112.  
  113. int main() {
  114.     int val;
  115.     TransaktionsLista minLista;
  116.  
  117.     ifstream fin("resa_in.dat");
  118.     ofstream fout("resa_in.dat", ios::app);
  119.     minLista.laesin(fin);
  120.     minLista.FixaPersoner();
  121.     val = meny();
  122.  
  123.     while (val != 0){
  124.     switch (val) {
  125.         case 0:
  126.             exit(EXIT_SUCCESS);
  127.             break;
  128.  
  129.         case 1:
  130.             minLista.laesin(cin);
  131.             minLista.skrivut(fout);
  132.  
  133.  
  134.             break;
  135.  
  136.         case 2:
  137.             minLista.laesin(fin);
  138.             minLista.skrivut(cout);
  139.  
  140.             break;
  141.  
  142.         case 3:
  143.            
  144.             cout << "Den totala kostnaden är: " << minLista.totalkostnad()<<endl;
  145.  
  146.             break;
  147.  
  148.         case 4:
  149.  
  150.             break;
  151.  
  152.         case 5:
  153.  
  154.             break;
  155.  
  156.         case 6:
  157.             minLista.FixaPersoner();
  158.  
  159.             break;
  160.            
  161.     }
  162.     val = meny();
  163.     }
  164.  
  165.     return 0;
  166. }
  167. // <editor-fold desc="main-funktioner">
  168.  
  169. int meny() {
  170.     int val=-1;
  171.     do {
  172.         cout << "Välj i menyn nedan" << endl;
  173.         cout << "0) Avsluta. Alla transaktioner sparas på fil." << endl;
  174.         cout << "1) Läs in en transaktion från tangentbordet." << endl;
  175.         cout << "2) Skriv ut information om alla transaktioner." << endl;
  176.         cout << "3) Beräkna totala kostnaden." << endl;
  177.         cout << "4) Hur mycket är en viss person skyldig?" << endl;
  178.         cout << "5) Hur mycket ligger en viss person ute med?" << endl;
  179.         cout << "6) Lista alla personer mm och FIXA!!!" << endl;
  180.         cin >> val;
  181.     } while (val < 0 || val > 6);
  182.     return val;
  183. }
  184.  
  185. // <editor-fold desc="filnamns-funktioner">
  186. /*string namn_pa_fil() {
  187.     string filnamn;
  188.     string nyckel = ".txt";
  189.  
  190.     cout << "Var god läs in namnet på filen: ";
  191.     cin.ignore(1000, '\n');
  192.     getline(cin, filnamn);
  193.  
  194.     //Om nyckeln inte hittas ELLER om nyckeln inte ligger sist, appenda nyckeln
  195.     if (filnamn.rfind(nyckel) == -1 || filnamn.length() - nyckel.length() != filnamn.rfind(nyckel)) {
  196.         filnamn.append(nyckel);
  197.     }
  198.     return filnamn;
  199. }
  200.  
  201. //Givet ett filnamn försöker denna funktion öppna filen för läsning. Om filen inte kan öppnas avbryts programmet
  202.  
  203. ifstream oppnaIfstream(const string filnamn) {
  204.  
  205.     ifstream fin(filnamn.c_str());
  206.  
  207.     if (!fin) //felkontroll
  208.     {
  209.         cout << "Filen kunde inte öppnas" << endl;
  210.         exit(EXIT_FAILURE);
  211.     }
  212.     return fin;
  213. }*/
  214. //</editor-fold>
  215. // </editor-fold>
  216.  
  217.  
  218. // <editor-fold desc="Person">
  219. //-----------------------------------------------------------------------------
  220. //Klassen Person
  221. //-----------------------------------------------------------------------------
  222. //Konstruktorer & Destruktorer
  223.  
  224. Person::Person() {
  225.  
  226. }
  227.  
  228. Person::Person(string n, double b, double s) {
  229.     namn = n;
  230.     betalat_andras = b;
  231.     skyldig = s;
  232. }
  233.  
  234. //-----------------------------------------------------------------------------
  235. //Selektorer
  236. //-----------------------------------------------------------------------------
  237.  
  238. double Person::haemta_betalat() {
  239.     return betalat_andras;
  240. }
  241.  
  242. double Person::haemta_skyldig() {
  243.     return skyldig;
  244. }
  245.  
  246. string Person::haemta_namn() {
  247.     return namn;
  248. }
  249.  
  250. //-----------------------------------------------------------------------------
  251. //Metoder
  252. //-----------------------------------------------------------------------------
  253.  
  254. void Person::skrivUt() {
  255.     cout << namn << " ligger ute med " << betalat_andras << " kr och är skyldig " << skyldig << " kr. ";
  256.     if (betalat_andras > skyldig) {
  257.         cout << "Skall ha " << raekna_differans(betalat_andras, skyldig) << " kr från potten." << endl;
  258.     } else {
  259.         cout << "Skall betala " << raekna_differans(skyldig, betalat_andras) << " kr till potten." << endl;
  260.     }
  261. }
  262.  
  263. //Räknar ut differansen mellan skuld/utlagt
  264. double Person::raekna_differans(double a, double b) {
  265.     return (a - b);
  266. }
  267.  
  268.  
  269. //</editor-fold>
  270.  
  271. // <editor-fold desc="PersonLista">
  272. //-----------------------------------------------------------------------------
  273. //Klassen PersonLista
  274. //-----------------------------------------------------------------------------
  275. //Konstruktorer & Destruktorer
  276.  
  277. PersonLista::PersonLista() {
  278.  
  279. }
  280.  
  281. PersonLista::~PersonLista() {
  282.  
  283. }
  284. //-----------------------------------------------------------------------------
  285. //Metoder
  286. //-----------------------------------------------------------------------------
  287.  
  288. //Lägger till en ny person sist i person-arrayen
  289. void PersonLista::laggTillEn(Person pny) {
  290.    
  291.     pers[antal_pers]=pny;
  292.     antal_pers++;
  293.    
  294. }
  295.  
  296. void PersonLista::skrivUtOchFixa() {
  297.  
  298. }
  299.  
  300. //Räknar ut totalen på allas skuld, borde gå jämt ut med summaBetalt
  301. double PersonLista::summaSkyldig() {
  302.     double summaSkyldig = 0;
  303.    
  304.     for (int i = 0; i < antal_pers; i++){
  305.         summaSkyldig += pers[i].haemta_skyldig();
  306.     }
  307.    
  308.     return summaSkyldig;
  309.  
  310. }
  311.  
  312. //Räknar ut totalen på vad alla betalat in, borde gå jämt ut med summaSkyldig
  313. double PersonLista::summaBetalat() {
  314.     double summaBetalat = 0;
  315.    
  316.     for (int i = 0; i < antal_pers; i++){
  317.         summaBetalat += pers[i].haemta_betalat();
  318.     }
  319.    
  320.     return summaBetalat;
  321.  
  322. }
  323.  
  324. //Går igenom arrayen med alla personer och kollar efter ett visst namn, om namnet finns hos någon av personerna, returnera true
  325. bool PersonLista::finnsPerson(const string& namn) {
  326.  
  327.     for (int i = 0; i < antal_pers; i++) {
  328.         if (namn == pers[i].haemta_namn()) {
  329.             return true;
  330.         }
  331.     }
  332.  
  333.     return false;
  334. }
  335.  
  336.  
  337. // </editor-fold>
  338.  
  339. // <editor-fold desc="Transaktion">
  340. //-----------------------------------------------------------------------------
  341. //Klassen Transaktion
  342. //-----------------------------------------------------------------------------
  343. //Konstruktorer & Destruktor
  344.  
  345. Transaktion::Transaktion() {
  346.     datum = "0";
  347.     typ = "odef";
  348.     namn = "";
  349.     belopp = 0;
  350.     ant_kompisar = 0;
  351.    
  352. }
  353.  
  354. Transaktion::~Transaktion() {
  355. }
  356. //-----------------------------------------------------------------------------
  357. //Selektorer
  358.  
  359. string Transaktion::haemta_namn() {
  360.  
  361.     return namn;
  362. }
  363.  
  364. double Transaktion::haemta_belopp() {
  365.  
  366.     return belopp;
  367. }
  368.  
  369. int Transaktion::haemta_ant_kompisar() {
  370.  
  371.     return ant_kompisar;
  372. }
  373. //-----------------------------------------------------------------------------
  374. //Metoder
  375. //-----------------------------------------------------------------------------
  376.  
  377. //Letar igenom en array av kompisar och returnerar true om det givna namnet finns med
  378. bool Transaktion::finnsKompis(string namnet) {
  379.  
  380.     for (int i = 0; i < ant_kompisar; i++) {
  381.  
  382.         if (namnet == kompisar[i]) {
  383.             return true;
  384.         }
  385.     }
  386.  
  387.     return false;
  388. }
  389.  
  390. //Läser in från en istream till instansvariablerna i en transaktion, returnerar true så länge eof inte är nådd
  391. bool Transaktion::laesEnTrans(istream &is) {
  392.  
  393.     cout << "Nu är jag i laesEnTrans" << endl;
  394.     is >> datum >> typ >> namn >> belopp >> ant_kompisar;
  395.     for (int i = 0; i < ant_kompisar; i++) {
  396.  
  397.         is >> kompisar[i];
  398.     }
  399.  
  400.     return !is.eof();
  401.  
  402. }
  403.  
  404. //Skriver över informationen om en transaktion ut på en ostream
  405. void Transaktion::skrivEnTrans(ostream &os) {
  406.     os << endl << datum << " " << typ << " " << namn << " " << belopp << " " << ant_kompisar << " ";
  407.     for (int i = 0; i < ant_kompisar; i++) {
  408.         os << kompisar[i] << " ";
  409.     }
  410.     os << "\n";
  411.  
  412. }
  413. //-----------------------------------------------------------------------------
  414. // </editor-fold>
  415.  
  416. // <editor-fold desc="TransaktionsLista">
  417. //-----------------------------------------------------------------------------
  418. //Klassen TransaktionsLista
  419. //-----------------------------------------------------------------------------
  420. //Konstruktorer & Destruktorer
  421.  
  422. TransaktionsLista::TransaktionsLista() {
  423.     antalTrans = 0;
  424. }
  425.  
  426. TransaktionsLista::~TransaktionsLista() {
  427. }
  428. //-----------------------------------------------------------------------------
  429. //Metoder
  430. //-----------------------------------------------------------------------------
  431.  
  432. //Läser in en transaktion/lista av transaktioner från en istream
  433. void TransaktionsLista::laesin(istream &is) {
  434.     Transaktion trans;
  435.  
  436.     if (&is == &cin) { //Här kollar jag om jag läser från cin eller från fil
  437.        
  438.         cout << "Läs in datum, kategori, namn, belopp, antal personer, vilka personer" << endl;
  439.         trans.laesEnTrans(is);
  440.         laggTill(trans);
  441.         cout << " Kom jag hit?" << endl;
  442.     }
  443.     else {
  444.  
  445.         cout << " hit?" << endl;
  446.         while (trans.laesEnTrans(is)) {
  447.             cout << " Eller hit??" << endl;
  448.             laggTill(trans);
  449.         }
  450.     }
  451. }
  452.  
  453. //Skriver ut alla transaktioner på en ostream
  454. void TransaktionsLista::skrivut(ostream &os) {
  455.     cout << "Nu är jag i skrivut" << endl;
  456.  
  457.     for (int i = 0; i < antalTrans; i++) {
  458.         trans[i].skrivEnTrans(os);
  459.     }
  460.  
  461. }
  462.  
  463. //Lägger till en transaktion sist i en transaktionsarray
  464. void TransaktionsLista::laggTill(Transaktion &t) {
  465.  
  466.     trans[antalTrans] = t;
  467.  
  468.     antalTrans++;
  469.  
  470. }
  471.  
  472. //Räknar ut den totala kostnaden för alla transaktioner
  473. double TransaktionsLista::totalkostnad() {
  474.  
  475.     double totKostnad = 0;
  476.  
  477.     for (int i = 0; i < antalTrans; i++) {
  478.         totKostnad += trans[i].haemta_belopp();
  479.     }
  480.  
  481.     return totKostnad;
  482.  
  483. }
  484.  
  485. double TransaktionsLista::liggerUteMed(string namnet) {
  486.     double utlagt = 0;
  487.  
  488.     //Går igenom alla transaktioner, jämför det angivna namnet med transaktionens loggade namn
  489.     // Om de är samma, lägg till beloppet till summan
  490.     for (int i = 0; i < antalTrans; i++) {
  491.         if (namnet == trans[i].haemta_namn()) {
  492.             utlagt += trans[i].haemta_belopp();
  493.         }
  494.     }
  495.     return utlagt;
  496. }
  497.  
  498. double TransaktionsLista::aerSkyldig(string namnet) {
  499.     double skyldig = 0;
  500.  
  501.     for (int i = 0; i < antalTrans; i++) { //går igenom alla transaktioner
  502.  
  503.         if (trans[i].finnsKompis(namnet)) {
  504.  
  505.             //Om namnet finns i listan för kompisar som var med i en given transaktion,
  506.             //dela transaktionens totalkostnad med antalet personer som var med (kompisar + betalare)
  507.             // och lägg till i skulden
  508.  
  509.             skyldig += trans[i].haemta_belopp() / (trans[i].haemta_ant_kompisar() + 1);
  510.         }
  511.  
  512.     }
  513.  
  514.     return skyldig;
  515.  
  516. }
  517. //Skapar en personlista från de namn som finns med på transaktionerna, förutsätter att alla betalat/blivit betalade för minst 1 gång
  518. PersonLista TransaktionsLista::FixaPersoner() {
  519.     string tempNamn;
  520.     double tempBetalt;
  521.     double tempSkyldig;
  522.     PersonLista pLista;
  523.     Person tempPerson;
  524.     int antalP = 0;
  525.     cout << "Nu är jag i FixaPersoner" << endl;
  526.  
  527.     //Gå igenom alla transaktioner
  528.     for (int i = 0; i < antalTrans; i++) {
  529.  
  530.         cout << "Hur många varv kan vi ta: " << antalP << endl << "antal trans: " << antalTrans << endl;
  531.         //Ta ut betalarens namn och se om betalaren finns i Personlistan än, annars: lägg till personen
  532.         //Vi antar att alla någon gång har betalat för sig själv och för andra
  533.        
  534.         tempNamn = trans[i].haemta_namn();
  535.         if (!pLista.finnsPerson(tempNamn)) {
  536.  
  537.             tempBetalt = liggerUteMed(tempNamn);
  538.             tempSkyldig = aerSkyldig(tempNamn);
  539.             tempPerson = Person(tempNamn, tempBetalt, tempSkyldig);
  540.  
  541.             pLista.laggTillEn(tempPerson);
  542.             antalP++;
  543.         }
  544.  
  545.     }
  546.    /* for (int k = 0; k < antalP; k++){
  547.        
  548.     } */
  549.     return pLista;
  550.  
  551. }
  552. // </editor-fold>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement