Advertisement
Guest User

ohj2harkkatyo4

a guest
Nov 22nd, 2014
168
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 23.34 KB | None | 0 0
  1. TYO4.CC
  2. //----------------------------------------------------------//
  3. //OHJ2 syksy 2013                                           //
  4. //HARJOITUSTYO4, TEEMU LAINE, 234210, <teemu.laine@tut.fi>  //
  5. //MODUULIT:                                                 //
  6. //tyo4.cc        1.9                                        //
  7. //todolista.cc   1.4                                        //
  8. //todolista.hh   1.3                                        //
  9. //tehtavat.cc    1.6                                        //
  10. //tehtavat.hh    1.3                                        //
  11. //----------------------------------------------------------//
  12.  
  13. //Ohjeessa ei maaritelty tarkkaan, annetaanko virheilmoitus vai ei
  14. //jos todo-lista on tyhja _JA_ maaritelty ja kaytetaan esim
  15. //"seuraava"-komentoa, tassa ohjelmassa edellamainitusta ei tapahdu
  16. //mitaan, kysytaan vain uutta komentoa
  17.  
  18.  
  19. //- - - - - - - - - - - - - - - - - - -
  20. //VIRHEET (omaa kirjanpitoa)
  21. //komentoriviparametrit[x]
  22. //syotetiedosto ei aukea[x]
  23. //syotetiedostossa virhe[x]
  24. //muistinvaraus epäonnistui[x]
  25. //tallentaminen epäonnistui[x]
  26. //muut
  27.  
  28. //segmentation fault kun ei tärkeyksiä jälellä                 x
  29. //komennot jossa käytetään dequea, varmista että solu olemassa x
  30. //outofrange tyhjalla                                          x
  31. //*lue*, muista tyhjennys                                      x
  32. //listaa ei maaritelty                                         x
  33. //seuraava kaatuu jos tyhjä mutta alustettu                    x
  34. //- - - - - - - - - - - - - - - - - - - -
  35.  
  36.  
  37. #include <iostream>
  38. #include <fstream>
  39. #include <deque>
  40. #include <string>
  41. #include <OHJ-1150>
  42. using namespace std;
  43.  
  44. //MODUULIT
  45. #include "todolista.hh"
  46. #include "tehtavat.hh"
  47.  
  48.  
  49. //lue() - paluuarvo:
  50. //1=kaikki ok
  51. //2=lista on maarittelematon
  52. //3=ohjelmansuoritus loppuu
  53. unsigned lue(const string& syote, Todolista& lista)
  54. {
  55.    ifstream virtatiedosto(syote.c_str());
  56.    
  57.    //Tiedosto ei avaudu
  58.    if(! virtatiedosto)
  59.    {
  60.       cerr << "Virhe: syotetiedostoa ei saa avattua luettavaksi" << endl;
  61.       return 3;
  62.    }
  63.    
  64.    string rivi;
  65.    bool ensimmainen = false;
  66.    unsigned kiireellisyyksia = 0;
  67.    
  68.    while(getline(virtatiedosto, rivi))
  69.    {
  70.       if(! ensimmainen)//ensimmainen rivi - numero ylos
  71.       {
  72.          if(ohj2::string_luvuksi(rivi, kiireellisyyksia))
  73.          {
  74.             lista.prioriteetteja(kiireellisyyksia);
  75.             ensimmainen = true;
  76.             continue;
  77.          }
  78.          else
  79.          {
  80.             cerr << "Virhe: virheellinen tiedoston rivi \""
  81.                  << rivi << "\"." << endl;
  82.             virtatiedosto.close();
  83.             return 2;
  84.          }
  85.       }
  86.      
  87.       deque<string> riviosat;
  88.       ohj2::paloittele_string(rivi, ':', riviosat);
  89.      
  90.       //whitespacet pois numerosta
  91.       unsigned tarkeys = 0;
  92.       string tarkeys_str = riviosat.at(0);
  93.       ohj2::poista_valit_alusta_ja_lopusta(tarkeys_str);
  94.      
  95.       //lisätään luokkaan
  96.       if(ohj2::string_luvuksi(tarkeys_str, tarkeys))
  97.       {
  98.          //liian suuri tarkeys
  99.          if(tarkeys >= kiireellisyyksia)
  100.          {
  101.             cerr << "Virhe: virheellinen tiedoston rivi \""
  102.                  << rivi << "\"." << endl;
  103.             lista.Alusta();
  104.             virtatiedosto.close();
  105.             return 2;
  106.          }
  107.          //whitespacet pois tehtavasta
  108.          string tehtava = riviosat.at(1);
  109.          ohj2::poista_valit_alusta_ja_lopusta(tehtava);
  110.          
  111.          if(! lista.lisaa_tehtava(tarkeys, tehtava))
  112.          {
  113.             virtatiedosto.close();
  114.             return 3;
  115.          }
  116.       }      
  117.       else
  118.       {
  119.          cerr << "Virhe: virheellinen tiedoston rivi \""
  120.               << rivi << "\"." << endl;
  121.          lista.Alusta();
  122.          virtatiedosto.close();
  123.          return 2;
  124.       }
  125.    }
  126.    
  127.    virtatiedosto.close();
  128.    return 1;
  129. }
  130. //tarkistetaan ettei dequella ole virheellista maaraa soluja
  131. //ja valtytaan outofrangeista
  132. bool dequetarkistus(const deque<string>& osat)
  133. {
  134.    if(osat.empty())
  135.       return true;
  136.    
  137.    if(osat.at(0) == "seuraava"   and osat.size() != 1) return true;
  138.    if(osat.at(0) == "poista"     and osat.size() != 1) return true;
  139.    if(osat.at(0) == "lisaa"      and osat.size() != 3) return true;
  140.    if(osat.at(0) == "tulosta"    and osat.size() != 1) return true;
  141.    if(osat.at(0) == "uusi"       and osat.size() != 2) return true;
  142.    if(osat.at(0) == "lue"        and osat.size() != 2) return true;
  143.    if(osat.at(0) == "tallenna"   and osat.size() != 2) return true;
  144.    if(osat.at(0) == "siirra"     and osat.size() != 3) return true;
  145.    if(osat.at(0) == "loppu"      and osat.size() != 1) return true;
  146.    
  147.    return false;
  148. }
  149.  
  150. int main(int argc, char* argv[])
  151. {
  152.    Todolista lista;
  153.    bool onkoalustettu = false;
  154.    
  155.    if(argc == 2)
  156.    {
  157.       unsigned paluu = lue(string(argv[1]), lista);
  158.       if(paluu == 3)
  159.       {
  160.          return 0;
  161.       }
  162.       if(paluu == 1)
  163.       {
  164.          onkoalustettu = true;
  165.       }
  166.    }
  167.    else if(argc != 1)
  168.    {
  169.       cerr << "Virhe: vaara maara komentoparametreja." << endl;
  170.       return 0;
  171.    }
  172.    
  173.    string syote;
  174.    deque<string> osat;
  175.    
  176.    //komentorivi alkaa
  177.    while(1)
  178.    {
  179.       cout << "todo> ";
  180.       getline(cin, syote);
  181.      
  182.       ohj2::paloittele_komento(syote, osat);
  183.      
  184.       //varmistetaan dequen oikeellisuus
  185.       if(dequetarkistus(osat))
  186.       {
  187.          cerr << "Virhe: ongelma kayttajan syottaman komennon kanssa." <<endl;
  188.          continue;
  189.       }
  190.      
  191.       //KAYTTAJAN KOMENNOT
  192.       //------------------
  193.       if(osat.at(0) == "seuraava" and onkoalustettu)
  194.       {
  195.          if(lista.size() == 0)
  196.             continue;
  197.          
  198.          lista.seuraava();
  199.       }
  200.      
  201.       //------------------
  202.       else if(osat.at(0) == "poista" and onkoalustettu)
  203.       {
  204.          if(lista.size() == 0)
  205.             continue;
  206.          
  207.          lista.seuraava(true);
  208.       }
  209.      
  210.       //------------------
  211.       else if(osat.at(0) == "lisaa" and onkoalustettu)
  212.       {
  213.          unsigned tarkeys = 0;
  214.          if(ohj2::string_luvuksi(osat.at(1), tarkeys))
  215.          {
  216.             //vaara tarkeystaso
  217.             if(tarkeys >= lista.tasomaara())
  218.             {
  219.                cerr << "Virhe: ongelma kayttajan "
  220.                     << "syottaman komennon kanssa." <<endl;
  221.                continue;
  222.             }
  223.            
  224.             if(! lista.lisaa_tehtava(tarkeys, osat.at(2)))
  225.             {
  226.                return 0;
  227.             }
  228.          }
  229.          else
  230.          {
  231.             cerr << "Virhe: ongelma kayttajan "
  232.                  << "syottaman komennon kanssa." <<endl;
  233.             continue;
  234.          }
  235.       }
  236.      
  237.       //------------------
  238.       else if(osat.at(0) == "tulosta" and onkoalustettu)
  239.       {
  240.          if(lista.size() == 0)
  241.             continue;
  242.          
  243.          lista.tulosta_tehtavat();
  244.       }
  245.      
  246.       //------------------
  247.       else if(osat.at(0) == "uusi")
  248.       {
  249.          lista.Alusta();
  250.          
  251.          unsigned kiireellisyyksia = 0;
  252.          if(ohj2::string_luvuksi(osat.at(1), kiireellisyyksia))
  253.          {
  254.             lista.prioriteetteja(kiireellisyyksia);
  255.          }
  256.          else
  257.          {
  258.             cerr << "Virhe: ongelma kayttajan "
  259.                  << "syottaman komennon kanssa." <<endl;
  260.             continue;
  261.          }
  262.          onkoalustettu = true;
  263.       }
  264.      
  265.       //------------------
  266.       else if(osat.at(0) == "lue")
  267.       {
  268.          lista.Alusta();
  269.          
  270.          unsigned paluu = lue(osat.at(1), lista);
  271.          if(paluu == 3)
  272.          {
  273.             return 0;
  274.          }
  275.          if(paluu == 2)
  276.          {
  277.             onkoalustettu = false;
  278.          }
  279.          else if(paluu == 1)
  280.          {
  281.             onkoalustettu = true;
  282.          }
  283.       }
  284.      
  285.       //------------------
  286.       else if(osat.at(0) == "tallenna" and onkoalustettu)
  287.       {
  288.          if(! lista.tallenna(osat.at(1)))
  289.          {
  290.             cerr << "Virhe: tallennus epaonnistui." << endl;
  291.             continue;
  292.          }
  293.       }
  294.      
  295.       //------------------
  296.       else if(osat.at(0) == "siirra" and onkoalustettu)
  297.       {
  298.          if(lista.size() == 0)
  299.             continue;
  300.          
  301.          unsigned tehtavanro, taso;
  302.          string tehtavaX;
  303.          
  304.          if(ohj2::string_luvuksi(osat.at(1), tehtavanro) &&
  305.             ohj2::string_luvuksi(osat.at(2), taso) &&
  306.             lista.siirra(tehtavanro, tehtavaX))
  307.          {
  308.             if(taso >= lista.tasomaara())
  309.             {
  310.                cerr << "Virhe: ongelma kayttajan "
  311.                     << "syottaman komennon kanssa." <<endl;
  312.                continue;
  313.             }
  314.             if(! lista.lisaa_tehtava(taso, tehtavaX))
  315.             {
  316.                return 0;
  317.             }
  318.          }
  319.          else
  320.          {
  321.             cerr << "Virhe: ongelma kayttajan "
  322.                  << "syottaman komennon kanssa." <<endl;
  323.             continue;
  324.          }
  325.       }
  326.      
  327.       //------------------
  328.       else if(osat.at(0) == "loppu")
  329.       {
  330.          break;
  331.       }
  332.      
  333.       //------------------
  334.       else
  335.       {
  336.          cerr << "Virhe: ongelma kayttajan syottaman komennon kanssa." <<endl;
  337.          continue;
  338.       }
  339.    }
  340. }
  341.  
  342. // $Log: tyo4.cc,v $
  343. // Revision 1.9  2013/12/19 14:05:14  lainet
  344. // tiedostonluvun semanttiset virheet done
  345. //
  346. // Revision 1.8  2013/12/19 12:50:28  lainet
  347. // try-catch linkitetty mainiin muistinvarausongelmille
  348. //
  349. // Revision 1.7  2013/12/18 16:53:30  lainet
  350. // ei pitaisi tulla out_of_rangeja enaa vaaranlaisella komennolla
  351. //
  352. // Revision 1.6  2013/12/18 15:45:10  lainet
  353. // siirra() lisatty
  354. //
  355. // Revision 1.5  2013/12/13 12:23:54  lainet
  356. // whitespacen poisto lisatty lukuun
  357. //
  358. // Revision 1.4  2013/12/05 12:28:31  lainet
  359. // tallennus toimii
  360. //
  361. // Revision 1.3  2013/12/04 12:25:29  lainet
  362. // "tallenna" ja "siirra" lukuunottamatta toiminnot toimivat paapiirteittain hyvin, muutamasta kohtaa herjaa segmentation faultia
  363. //
  364. // Revision 1.2  2013/12/02 21:32:57  lainet
  365. // alkeellinen tiedostonluku tehty
  366. //
  367. // Revision 1.1  2013/12/02 18:56:34  lainet
  368. // Initial revision
  369. //
  370.  
  371.  
  372. ------------------------------------------------------------------------------------
  373. TODOLISTA.HH
  374. #ifndef TODOLISTA_HH
  375. #define TODOLISTA_HH
  376.  
  377. #include <string>
  378. using namespace std;
  379.  
  380. #include "tehtavat.hh"
  381.  
  382. class Todolista
  383. {
  384.    public:
  385.       Todolista();
  386.       void prioriteetteja(unsigned kiireellisyyksia);
  387.       unsigned tasomaara();
  388.       unsigned size();
  389.      
  390.       void seuraava(bool poistetaanko = false);
  391.       bool lisaa_tehtava(unsigned kiiretaso, const string& kuvaus);
  392.       void tulosta_tehtavat();
  393.       bool tallenna(const string& tiednimi);
  394.       bool siirra(unsigned tehtavanro, string& tehtavaX);
  395.      
  396.       void Alusta();//"destructor"
  397.       ~Todolista();
  398.    private:
  399.       struct Alkio
  400.       {
  401.          unsigned tarkeys;
  402.          Tehtavat teht;
  403.          Alkio* next;
  404.          Alkio* prev;
  405.       };
  406.       Alkio* first;
  407.       Alkio* last;
  408.       unsigned kiireellisyystasoja;
  409. };
  410.  
  411. #endif
  412.  
  413. // $Log: todolista.hh,v $
  414. // Revision 1.3  2013/12/05 12:29:39  lainet
  415. // tallennus toimii
  416. //
  417. // Revision 1.2  2013/12/02 21:34:30  lainet
  418. // perustavanlaatuinen luokka Todolista tehty
  419. //
  420. // Revision 1.1  2013/12/02 18:57:28  lainet
  421. // Initial revision
  422. //
  423.  
  424.  
  425.  
  426.  
  427.  
  428. -------------------------------------------------------------
  429. TODOLISTA.CC
  430. #include <string>
  431. #include <iostream>
  432. #include <fstream>
  433. using namespace std;
  434.  
  435. #include "todolista.hh"
  436. #include "tehtavat.hh"
  437.  
  438.  
  439. //rakentaja
  440. Todolista::Todolista():
  441.    first(nullptr),
  442.    last(nullptr),
  443.    kiireellisyystasoja(0)
  444. {}
  445. void Todolista::prioriteetteja(unsigned kiireellisyyksia)
  446. {
  447.    kiireellisyystasoja = kiireellisyyksia;
  448. }
  449. unsigned Todolista::tasomaara()
  450. {
  451.    return kiireellisyystasoja;
  452. }
  453.  
  454. //palauttaa alkioiden määrän
  455. unsigned Todolista::size()
  456. {
  457.    Alkio* laskija = first;
  458.    unsigned alkioita = 0;
  459.    
  460.    while(laskija != nullptr)
  461.    {
  462.       laskija = laskija->next;
  463.       alkioita++;
  464.    }
  465.    
  466.    return alkioita;
  467. }
  468.  
  469. //kayttajan komennot
  470. void Todolista::seuraava(bool poistetaanko)
  471. {
  472.    //ei olemassa seuraavaa
  473.    if(first == nullptr)
  474.    {
  475.       cerr << "Virhe: ongelma kayttajan syottaman komennon kanssa." << endl;
  476.    }
  477.    
  478.    if(poistetaanko)
  479.    {
  480.       //true jos oli viimeinen teht kyseisessa alkiossa
  481.       if(first->teht.tulosta(first->tarkeys, true, true))
  482.       {
  483.          //poistetaan nykyinen alkio, ainoa
  484.          if(first == last)
  485.          {
  486.             last = nullptr;
  487.             delete first;
  488.             first = nullptr;
  489.          }
  490.          //poistetaan nykyinen alkio, vah. kaksi alkiota
  491.          else
  492.          {
  493.             Alkio* poisto = first;
  494.            
  495.             first = first->next;
  496.             first->prev = nullptr;
  497.            
  498.             delete poisto;
  499.             poisto = nullptr;
  500.          }
  501.       }
  502.    }
  503.    else
  504.       first->teht.tulosta(first->tarkeys, true);
  505. }
  506. bool Todolista::lisaa_tehtava(unsigned kiiretaso, const string& kuvaus)
  507. {
  508.    //kokeillaan muistinvarausta
  509.    try
  510.    {
  511.       Alkio* uusi = nullptr;
  512.      
  513.       if(first == nullptr) //tyhjä
  514.       {
  515.          uusi = new Alkio;
  516.          first = last = uusi;      
  517.          uusi->tarkeys = kiiretaso;
  518.          uusi->next = nullptr;
  519.          uusi->prev = nullptr;
  520.          
  521.       }
  522.       else//onko alussa tai lopussa
  523.       {
  524.          if(kiiretaso < first->tarkeys)//lisataan listan alkuun
  525.          {
  526.             uusi = new Alkio;
  527.             uusi->next = first;
  528.             uusi->prev = nullptr;
  529.             first->prev = uusi;
  530.             first = uusi;
  531.            
  532.             uusi->tarkeys = kiiretaso;    
  533.          }
  534.          else if(kiiretaso > last->tarkeys)//lisataan viimeiseksi
  535.          {
  536.             uusi = new Alkio;
  537.             uusi->next = nullptr;
  538.             uusi->prev = last;
  539.             last->next = uusi;
  540.             last = uusi;
  541.            
  542.             uusi->tarkeys = kiiretaso;
  543.          }
  544.          else//tutkitaan vali
  545.          {
  546.             Alkio* seuraaja = first;
  547.            
  548.             while(seuraaja != nullptr)
  549.             {
  550.                if(kiiretaso == seuraaja->tarkeys)//loytyi jo ennestaan
  551.                {
  552.                   uusi = seuraaja;
  553.                   break;
  554.                }
  555.                else if(kiiretaso > seuraaja->tarkeys and
  556.                        kiiretaso < seuraaja->next->tarkeys)
  557.                        //tulee nykyisen ja seuraavan valiin
  558.                {
  559.                   uusi = new Alkio;
  560.                   uusi->prev = seuraaja;
  561.                   uusi->next = seuraaja->next;
  562.                  
  563.                   seuraaja->next->prev = uusi;
  564.                   seuraaja->next = uusi;
  565.                  
  566.                   uusi->tarkeys = kiiretaso;
  567.                   break;
  568.                }
  569.                seuraaja = seuraaja->next;
  570.             }
  571.             seuraaja = nullptr;
  572.          }
  573.       }
  574.       //uusi nyt asettuneena oikeaan kiireystasoon
  575.       uusi->teht.lisaa_solu(kuvaus);
  576.       return true;
  577.    }
  578.    catch(...)
  579.    {
  580.       //muistinvaraus epaonnistui
  581.       cerr << "Virhe: muistinvaraus epaonnistui." << endl;
  582.       return false;
  583.    }
  584. }
  585. void Todolista::tulosta_tehtavat()
  586. {
  587.    Alkio* apu;
  588.    apu = first;
  589.    unsigned mones = 0;//pidetaan kirjaa mika jarjestysnumero
  590.    
  591.    while(apu != nullptr)
  592.    {
  593.       apu->teht.tulosta(apu->tarkeys, false, false, mones);
  594.       mones += apu->teht.koko();
  595.      
  596.       apu = apu->next;
  597.    }
  598. }
  599. bool Todolista::tallenna(const string& tiednimi)
  600. {
  601.    //virta tiedoston tallennukseen
  602.    ofstream otallennus(tiednimi);
  603.    
  604.    if(! otallennus)
  605.    {
  606.       return false;
  607.    }
  608.    otallennus << kiireellisyystasoja << endl;
  609.    
  610.    Alkio* tallennettava;
  611.    tallennettava = first;
  612.    
  613.    while(tallennettava != nullptr)
  614.    {
  615.       //ostream&
  616.       if(! tallennettava->teht.tallenna(otallennus, tallennettava->tarkeys))
  617.       {
  618.          return false;
  619.       }
  620.       tallennettava = tallennettava->next;
  621.    }
  622.    return true;
  623. }
  624.  
  625. bool Todolista::siirra(unsigned tehtavanro, string& tehtavaX)
  626. {
  627.    Alkio* apu = first;
  628.    unsigned jnro = 0; //alkioittain summautuva jarjestysnumero
  629.    
  630.    while(apu != nullptr)
  631.    {
  632.       jnro += apu->teht.koko();
  633.       if(tehtavanro <= jnro-1)
  634.       {
  635.          if(apu->teht.seek_and_destroy(
  636.             (apu->teht.koko()-(jnro - tehtavanro)), tehtavaX))
  637.          {
  638.             //oli ainoa tehtava alkiossa, poistetaan
  639.            
  640.             //ensimmainen
  641.             if(apu == first)
  642.             {
  643.                first = last = nullptr;
  644.                delete apu;
  645.             }
  646.             //viimeinen
  647.             else if(apu == last)
  648.             {
  649.                last->prev->next = nullptr;
  650.                last = last->prev;
  651.                delete apu;
  652.             }
  653.             else
  654.             {
  655.                //keskella
  656.                apu->prev->next = apu->next;
  657.                apu->next->prev = apu->prev;
  658.                delete apu;
  659.             }
  660.             apu = nullptr;
  661.          }
  662.          return true;
  663.       }
  664.      
  665.       apu = apu->next;
  666.    }
  667.    
  668.    //liian suuri numero
  669.    return false;
  670. }
  671.  
  672. void Todolista::Alusta()//destructor
  673. {
  674.    Alkio* tamanhetkinen = first;
  675.    Alkio* loput = nullptr;
  676.    
  677.    last = nullptr;
  678.    
  679.    while(tamanhetkinen != nullptr)
  680.    {
  681.       loput = tamanhetkinen->next;
  682.       delete tamanhetkinen;
  683.       tamanhetkinen = loput;
  684.    }
  685.    first = nullptr;
  686.    kiireellisyystasoja = 0;
  687. }
  688. Todolista::~Todolista()
  689. {
  690.    Alkio* tamanhetkinen = first;
  691.    Alkio* loput = nullptr;
  692.    
  693.    last = nullptr;
  694.    
  695.    while(tamanhetkinen != nullptr)
  696.    {
  697.       loput = tamanhetkinen->next;
  698.       delete tamanhetkinen;
  699.       tamanhetkinen = loput;
  700.    }
  701.    first = nullptr;
  702. }
  703.  
  704.  
  705. // $Log: todolista.cc,v $
  706. // Revision 1.4  2013/12/18 15:45:32  lainet
  707. // siirra() luotu
  708. //
  709. // Revision 1.3  2013/12/05 12:29:25  lainet
  710. // tallennus toimii
  711. //
  712. // Revision 1.2  2013/12/03 17:37:33  lainet
  713. // tehtavanlisays tarkeyden mukaan
  714. //
  715. // Revision 1.1  2013/12/02 18:57:13  lainet
  716. // Initial revision
  717. //
  718.  
  719.  
  720.  
  721.  
  722. -------------------------------------------------------------
  723. TEHTAVAT.HH
  724. #ifndef TEHTAVAT_HH
  725. #define TEHTAVAT_HH
  726.  
  727. #include <string>
  728. using namespace std;
  729.  
  730. class Tehtavat
  731. {
  732.    public:
  733.       Tehtavat();
  734.       void lisaa_solu(const string& virke);
  735.       unsigned koko();
  736.       bool tulosta(unsigned tarkeys, bool vainyksi = false,
  737.                    bool poistetaanko = false, unsigned mones = 0);
  738.       bool tallenna(ostream& otallennus, unsigned tarkeys);
  739.       bool seek_and_destroy(unsigned monesko, string& tehtavaX);
  740.      
  741.       ~Tehtavat();
  742.    private:
  743.       struct Alkio
  744.       {
  745.          string kuvaus;
  746.          Alkio* seuraava;
  747.       };
  748.       Alkio* ensimmainen;
  749.       Alkio* viimeinen;
  750. };
  751.          
  752.  
  753.  
  754. #endif
  755.  
  756. // $Log: tehtavat.hh,v $
  757. // Revision 1.3  2013/12/05 12:29:09  lainet
  758. // tallennus toimii
  759. //
  760. // Revision 1.2  2013/12/02 19:04:10  lainet
  761. // luokka Tehtavat luotu
  762. //
  763. // Revision 1.1  2013/12/02 18:57:44  lainet
  764. // Initial revision
  765. //
  766.  
  767.  
  768.  
  769.  
  770.  
  771.  
  772. --------------------------------------------------------
  773. TEHTAVAT.CC
  774. #include <string>
  775. #include <iostream>
  776. #include <fstream>
  777. using namespace std;
  778.  
  779. #include "tehtavat.hh"
  780.  
  781. //rakentaja
  782. Tehtavat::Tehtavat():
  783.    ensimmainen(nullptr),
  784.    viimeinen(nullptr)
  785. {}
  786.  
  787. void Tehtavat::lisaa_solu(const string& virke)
  788. {
  789.    Alkio* uusi;
  790.    uusi = new Alkio; //HUOMHUOM ei poistanut kaikkia
  791.    
  792.    if(ensimmainen == nullptr) //tyhjä
  793.    {
  794.       ensimmainen = viimeinen = uusi;
  795.    }
  796.    else
  797.    {
  798.       viimeinen->seuraava = uusi;
  799.       viimeinen = uusi;
  800.    }
  801.    
  802.    uusi->seuraava = nullptr;
  803.    uusi->kuvaus = virke;
  804.    
  805. }
  806. //palauttaa alkioiden määrän
  807. unsigned Tehtavat::koko()
  808. {
  809.    Alkio* laskija = ensimmainen;
  810.    unsigned alkioita = 0;
  811.    
  812.    while(laskija != nullptr)
  813.    {
  814.       laskija = laskija->seuraava;
  815.       alkioita++;
  816.    }
  817.    
  818.    return alkioita;
  819. }
  820.  
  821. //jos vainyksi==true, komento ollut "seuraava"
  822. //jos poistetaanko==true, komento ollut "poista"
  823. bool Tehtavat::tulosta(unsigned tarkeys, bool vainyksi,
  824.                        bool poistetaanko, unsigned mones)
  825. {
  826.    if(vainyksi)
  827.    {
  828.       cout << tarkeys << ":" << ensimmainen->kuvaus << endl;
  829.       if(poistetaanko)
  830.       {
  831.          Alkio* poisto = ensimmainen;
  832.          ensimmainen = ensimmainen->seuraava;
  833.          if(ensimmainen == nullptr)
  834.          {
  835.             //vain yksi alkio
  836.             delete poisto;
  837.             viimeinen = nullptr;
  838.            
  839.             //poistetaan myos lista-alkio
  840.             return true;
  841.          }
  842.          
  843.          poisto->seuraava = nullptr;
  844.          delete poisto;
  845.          poisto = nullptr;
  846.       }
  847.       return false;
  848.    }
  849.    
  850.    //koko sailon tulostus
  851.    Alkio* apu = ensimmainen;
  852.    while(apu != nullptr)
  853.    {
  854.       cout << "(" << mones << ") ";
  855.       mones++;
  856.      
  857.       cout << tarkeys << ":" << apu->kuvaus << endl;
  858.       apu = apu->seuraava;
  859.    }
  860.    return false;
  861. }
  862.  
  863. bool Tehtavat::tallenna(ostream& otallennus, unsigned tarkeys)
  864. {
  865.    Alkio* tallennettava = ensimmainen;
  866.    
  867.    while(tallennettava != nullptr)
  868.    {
  869.       otallennus << tarkeys << ":" << tallennettava->kuvaus << endl;
  870.       if(! otallennus)
  871.       {
  872.          return false;
  873.       }
  874.      
  875.       tallennettava = tallennettava->seuraava;
  876.    }
  877.    return true;
  878. }
  879.  
  880. bool Tehtavat::seek_and_destroy(unsigned monesko, string& tehtavaX)
  881. {
  882.    Alkio* apu = ensimmainen;
  883.    for(unsigned i=0;i<monesko;i++)
  884.    {
  885.       apu = apu->seuraava;
  886.    }
  887.    
  888.    //apu osoittaa nyt haluttuun alkioon
  889.    tehtavaX = apu->kuvaus;
  890.    
  891.    //poisto
  892.    if(ensimmainen == viimeinen)
  893.    {
  894.       //voidaan poistaa tarkeystaso
  895.       apu = nullptr;
  896.       return true;
  897.    }
  898.    
  899.    if(apu == ensimmainen)
  900.    {
  901.       ensimmainen = ensimmainen->seuraava;
  902.       delete apu;
  903.       apu = nullptr;
  904.       return false;
  905.    }
  906.    
  907.    Alkio* edellinenptr = ensimmainen;
  908.    for(unsigned i=1;i<monesko;i++)
  909.    {
  910.       edellinenptr = edellinenptr->seuraava;
  911.    }
  912.    
  913.    if(apu == viimeinen)
  914.    {
  915.       //viimeinen alkio, poistetaan
  916.       viimeinen = edellinenptr;
  917.       viimeinen->seuraava = nullptr;
  918.       delete apu;
  919.       apu = nullptr;
  920.    }
  921.    else
  922.    {
  923.       //alkio keskella
  924.       edellinenptr->seuraava = edellinenptr->seuraava->seuraava;
  925.       delete apu;
  926.    }
  927.    apu = edellinenptr = nullptr;
  928.    return false;  
  929. }
  930.  
  931. Tehtavat::~Tehtavat()
  932. {
  933.    Alkio* tamanhetkinen = ensimmainen;
  934.    Alkio* loput = nullptr;
  935.    
  936.    ensimmainen = viimeinen = nullptr;
  937.    
  938.    while(tamanhetkinen != nullptr)
  939.    {
  940.       loput = tamanhetkinen->seuraava;
  941.       delete tamanhetkinen;
  942.       tamanhetkinen = loput;
  943.    }
  944. }
  945.  
  946.  
  947. // $Log: tehtavat.cc,v $
  948. // Revision 1.6  2013/12/19 14:28:36  lainet
  949. // poista-komennon ongelma poistettu jossa viimeisen alkion muisti ei poistunut
  950. //
  951. // Revision 1.5  2013/12/18 15:45:54  lainet
  952. // hae_ja_poista luotu
  953. //
  954. // Revision 1.4  2013/12/05 12:28:51  lainet
  955. // tallennus toimii
  956. //
  957. // Revision 1.3  2013/12/04 12:28:14  lainet
  958. // tulosta() kykenee parametreista riippuen joko tulostamaan kaikki, tulostamaan ensimmaisen tai tulostamaan ensimmaisen poistaen sen samalla
  959. //
  960. // Revision 1.2  2013/12/02 21:33:37  lainet
  961. // osaa lisätä ja tulostaa soluja, purkaja toimii myös
  962. //
  963. // Revision 1.1  2013/12/02 18:57:55  lainet
  964. // Initial revision
  965. //
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement