Kontrola kódu OOP C++ – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Kontrola kódu OOP C++ – C / C++ – Fórum – Programujte.comKontrola kódu OOP C++ – C / C++ – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené.
Yenkee0
Newbie
26. 12. 2017   #1
-
0
-

Zdravím, 

jako začátečník hledám někoho, kdo by byl ochotný projet můj kód a pokusil by se vyhledat případné chyby (překladač mi žádné nehlásí, nicméně program nefunguje jak by měl). Jedná se o krátký a intuitivní kód, který zašlu e-mailem.

Nahlásit jako SPAM
IP: 188.120.210.–
Jerry
~ Anonymní uživatel
512 příspěvků
26. 12. 2017   #2
-
0
-

a kolik za tu kontrolu intuitivního kodu nabízíš peněz :)

Nahlásit jako SPAM
IP: 2a00:1028:83be:235a:f97f:...–
Yenkee0
Newbie
26. 12. 2017   #3
-
0
-

#2 Jerry
Ahoj Jerry,

předpokládám, že si dotyčný cenu určí na základě vlastní analýzy :-)

Nahlásit jako SPAM
IP: 188.120.210.–
KIIV
~ Moderátor
+43
God of flame
26. 12. 2017   #4
-
0
-

A proc si to nedal rovnou sem, by to bylo rychlejsi a zadara

Nahlásit jako SPAM
IP: 93.91.151.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Yenkee0
Newbie
26. 12. 2017   #5
-
0
-

Dát to sem klidně můžu, otázkou je, kdo to zadarmo bude chtít zkontrolovat :-)

Požadovaná funkcionalita:

- přidání nové rostliny na záhon
- odebrání vybrané rostliny ze záhonu
- výpis informací o vybrané rostlině včetně její ceny
- výpočet celkové ceny všech rostlin na záhoně
- výpis informací a výpočet celkové ceny všech rostlin konkrétního druhu

Záhon má předem definovanou kapacitu (počet rostlin), takže nelze přidávat
do nekonečna, rovněž nelze odebírat ze záhonu, který nemá žádné rostliny.   
  
Rostlina:
- druh (např. růže, čimišník, denivka ...)
- barva květu
- výška

Každá rostlina má určitou cenu (v Kč), která se vypočítá z výše uvedených 
informací.

Program bude uchovávat stav záhonu v souboru, kam se budou promítat
veškeré změny (přidání, odebrání).

Mé řešení:

 main.cpp

#include <iostream> 
#include <fstream>
#include <string>
#include <sstream>
#include <vector>
#include <Rostlina.h>
#include <Zahon.h>
using namespace std;


void vypisMenu(){
    cout << "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++" << endl;
    cout << "+                                                       +" << endl;
    cout << "+          1) Pridat rostlinu                           +" << endl;
    cout << "+          2) Odebrat rostlinu                          +" << endl;
    cout << "+          3) Vypsat informace o rostline               +" << endl;
    cout << "+          4) Vypocitat celkovou cenu                   +" << endl;
    cout << "+          5) Vypsat informace o konketnim druhu        +" << endl;
    cout << "+                                                       +" << endl;  
    cout << "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++" << endl;
    }
    
void vypis(Rostlina rostlina);
void vypisCenuDruhu(Rostlina);
void odebratRostlinu(Zahon, int);
void pridatRostlinu(Zahon);
void cenaVsechRostlin(Zahon);
void cenaVsechDruhu(Zahon);




int main(int argc, char **argv){
    
    vypisMenu();
    
    int vstup = 0;
    int cena = 0;
    int i = 1;
    const int limit = 50;
    
    
    cout << " Zadejte vasi volbu: " << endl;
    cin >> vstup;
  
    Zahon zahon("Soubor.txt");
   for(Rostlina rostlina : zahon.rostliny){
        cout << i << ". ";
        vypis(rostlina);
        cena = cena + rostlina.vypisCenu();
        i++;
    }
    cout << "-----------------------------------------------" << endl;
    
    switch(vstup){
        
        case 1: {
            if(zahon.rostliny.size() > limit){
                cout << "Na tento zahon pridat vice rostlin !" << endl;
                break;
            }
            else{
                pridatRostlinu(zahon);
                
            }
        }
        
        break;
        
        case 2: {
            cout << "Zadejte prvek ktery chcete odebrat: ";
            int prvek = 0;
            cin >>prvek;
            
            if(prvek > 0 && prvek < limit && prvek < zahon.rostliny.size()){
                odebratRostlinu(zahon, prvek);
            }
            else{
                cout << "Nepaltny vstup !";
                return 0;
            }
            break;
        }
        
       case 3: { 
            cout << "Zadejte rostlinu, kterou chcete vypsat: ";
            int prvek = 0;
            cin >> prvek;
            if(prvek > 0 && prvek < limit && limit > zahon.rostliny.size()){
              vypis(zahon.rostliny.at(prvek-1));
            }
            else{
                cout << "Neplatny vstup !";
                return 0;
            }
            break;
        }
        
        case 4: { 
            cenaVsechRostlin(zahon);
            break;
        }
        
        case 5: {
            cenaVsechDruhu(zahon);
            break;
        }
        
        default:{ 
            cout << "Neplatna volba! " << endl; 
            return 0;
        }
    }
    ofstream soubor;
    soubor.open("soubor.txt");
    for(Rostlina rostlina : zahon.rostliny){
        soubor << rostlina.vypisDruh() << " " << rostlina.vypisBarvuKvetu() << " " << rostlina.vypisVysku() << endl;
    }
}   

void vypis(Rostlina rostlina){
    cout << "Druh: " << rostlina.vypisDruh() << endl;
    cout << "Barva kvetu: " << rostlina.vypisBarvuKvetu() << endl;
    cout << "Vyska: " << rostlina.vypisVysku() << endl;
    cout << "Cena: " << rostlina.vypisCenu() <<endl;
}  

void pridatRostlinu(Zahon zahon){
    cout << "Zadejte druh rostliny: " << endl;
    string vstup_druh;
    cin >> vstup_druh;
            
    cout << "Zadejte barvu kvetu: " << endl;
    string vstup_barva;
    cin >> vstup_barva;
            
    cout << "Zadejte vysku rostliny: " << endl;
    int vstup_vyska;
    cin >> vstup_vyska;
            
    stringstream ss;
    ss << vstup_druh << " " << vstup_barva << " " << vstup_vyska << endl;
    string str;
    str = ss.str();
            
    Rostlina novaRostlina(str);
    zahon.rostliny.push_back(novaRostlina);
    int i = 1;
    for(Rostlina rostlina : zahon.rostliny){
        cout << i << ". ";
        vypis(rostlina);
        i++;
    }
}

void vypisCenaDruhu(Rostlina rostlina){
    cout << "Cena druhu je: " << rostlina.vypisCenuDruhu() << endl;
}

void odebratRostlinu(Zahon zahon, int prvek){
    int i = 1;
    zahon.rostliny.erase(zahon.rostliny.begin()+prvek-1);
    for(Rostlina rostlina : zahon.rostliny){
        cout << i << ". ";
        vypis(rostlina);
        i++;
    }
}

void cenaVsechRostlin(Zahon zahon){
    int cena = 0;
    for(Rostlina rostlina : zahon.rostliny){
        cena = cena + rostlina.vypisCenu();
    }
    cout << "Cena vsech rostlin je: " << cena << endl;
}

void cenaVsechDruhu(Zahon zahon){
    int cenaDruhu;
    for(Rostlina rostlina : zahon.rostliny){
        cenaDruhu = cenaDruhu + rostlina.vypisCenuDruhu();
    }
    cout << "Cena vsech druhu rostlinje: " << cenaDruhu << endl;
}

Rostlina.cpp

#include "Rostlina.h"
#include <iostream>
#include <cstring>
#include <sstream>
using namespace std;

Rostlina::Rostlina(string infoRostlina){
    
    stringstream rostlinaStream(infoRostlina);
    rostlinaStream >> druh;
    rostlinaStream >> barvaKvetu;
    rostlinaStream >> vyska;
}

string Rostlina::vypisDruh(){
    return druh;
  }

string Rostlina::vypisBarvuKvetu(){
    return barvaKvetu;
  }   
  
int Rostlina::vypisVysku(){
    return vyska;
  } 
  
int Rostlina::vypisCenu(){
    int cena = 0;
    
    if(druh == "ruze"){
        cena = cena + 30;
        } else if (druh == "cimisnik"){
            cena = cena + 25;
            }  else if (druh == "denivka"){
                cena = cena + 20;
                } else if (druh == "levandule"){
                    cena = cena + 15;
                    } else if (druh == "tulipan"){
                        cena = cena + 10;
                        } else { cout << "Tuto rostlinu bohuzel nemame."  << endl;
                                 } 
   
     if(barvaKvetu == "cervena"){
         cena = cena + 15; 
        } else if (barvaKvetu == "fialova"){
            cena = cena + 14;
            }  else if (barvaKvetu == "bila"){
                cena = cena + 13;
                } else if (barvaKvetu == "ruzova"){
                    cena = cena + 12;
                    } else if (barvaKvetu == "zelena"){
                        cena = cena + 11;
                        } else { cout << "Rostliny o takove barve kvetu bohuzel nemame."  << endl;             
    
    if (vyska > 0 && vyska < 15){
        cena = cena + 5;
        } else if (vyska > 15 && vyska < 30){
            cena = cena + 10;
            } else if (vyska > 30 && vyska < 60 ){
            cena = cena + 40;
               } else { cout << "Zadana vyska je neplatna. Pouzijte prosim vysku od 0 do 60 cm" << endl;
                   }

     return cena;
  } 
   }
  
  int Rostlina::vypisCenuDruhu(){
      int cena = 0;
      
       if(druh == "ruze"){
        cena = cena + 30;
        } else if (druh == "cimisnik"){
            cena = cena + 25;
            }  else if (druh == "denivka"){
                cena = cena + 20;
                } else if (druh == "levandule"){
                    cena = cena + 15;
                    } else if (druh == "tulipan"){
                        cena = cena + 10;
                        } else { cout << "Tuto rostlinu bohuzel nemame."  << endl;
                                 }
         return cena;
      }

Rostlina.h

#ifndef __Rostlina_h_
#define __Rostlina_h_
#include <iostream> 
#include <fstream>
#include <string>
#include <vector>
using namespace std;

class Rostlina
{
private:

  string druh;
  string barvaKvetu;
  int vyska;
  
public: 

    Rostlina(string infoRostlina);
    string vypisDruh();
    string vypisBarvuKvetu();
    int vypisVysku();
    int vypisCenu();
    int vypisCenuDruhu();
  
    
    

};

#endif // __Rostlina_h_

Zahon.cpp

#include "Zahon.h"
#include <iostream> 
#include <fstream>
#include <sstream>
#include <string>
#include <vector>
using namespace std;


Zahon::Zahon(string fin){

    ifstream rostlinaSoubor(fin.c_str());
    string radek;
    while(!rostlinaSoubor.eof()){
        
        getline(rostlinaSoubor, radek);
        
        Rostlina rostlina(radek);
        rostliny.push_back(rostlina);
    }
    rostlinaSoubor.close();
}

Zahon.h

#ifndef __Zahon_h_
#define __Zahon_h_
#include "Rostlina.h"
#include <iostream> 
#include <fstream>
#include <string>
#include <vector>
using namespace std;

class Zahon
{
public:
    Zahon(string fin);
    vypisRostliny();
    vector<Rostlina> rostliny;
    
};

#endif // __Zahon_h_
Nahlásit jako SPAM
IP: 188.120.210.–
KIIV
~ Moderátor
+43
God of flame
26. 12. 2017   #6
-
0
-

#5 Yenkee
no a jak se to chova? Na rozdil od toho co to delat ma?

Nahlásit jako SPAM
IP: 93.91.151.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Yenkee0
Newbie
26. 12. 2017   #7
-
0
-

spustí se menu, požádá uživatele o vstup a po zadání vstupu nereaguje :-)

Nahlásit jako SPAM
IP: 188.120.210.–
KIIV
~ Moderátor
+43
God of flame
26. 12. 2017   #8
-
+1
-
Zajímavé

#7 Yenkee
Problemu je tam vic

Ten hlavni, proc ti to nefunguje, je:  while (!rostlinaSoubor.eof()) { ... krapet to nefacha pri pokusu otevrit neexistujici soubor (coz netestujes). Takze bud tam dej proste  while (rostlinaSoubor) { ..., nebo musis overit, jestli se otevrel soubor.

Dale napriklad vypisCenu neco vrati, az kdyz zadas nespravnou barvu. Jinak to nema co vracet.

Nesmyslny nazvy metod jako: vypisCenu, vypisDruhu  - nic to nevypisuje (krom chybovych hlasek), tak je pitomost nazyvat to vypisCokoliv.

Taktez using namespace std; je v hlavickovych souborech povazovano za tezky zlozvyk. Kdyz uz, tak jen v cpp souborech a i tak je lepsi bud si vytahat konkretni tridy a tak:  using std::string; using std::sstream;  Neni nic horsiho, nez pracovat s nejakou knihovnou, ktera zasere namespace miliardou symbolu, a clovek pak nikdy netusi, co se nakonec pouzije....

Dale mas zbytecne includy v headerech. Staci jen to co tam opravdu pouzivas, zbytek muze byt az v .cpp

Taktez udrzovat si vsechny ty barvy a typy a tak v retezcich je zbytecne, nejakej vhodnej prevod by te usetril tech if - else if --- ke si nakonec narval i tu chybu se spatnou zavorkou (kterou nevidis, protoze odsazujes blbe)

(to je zatim to, na co sem narazil)

A nauc se pouzivat debugger, hned bys zjistil tu hlavni chybu

Mimochodem, intuitivni bych to taky moc nenazyval :D

Nahlásit jako SPAM
IP: 93.91.151.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Yenkee0
Newbie
26. 12. 2017   #9
-
0
-


Mnohokrát děkuji, jdu na to mrknout :-) 

Edit: Nabízím finanční odměnu za případnou korekturu, už si nevím rady

        kontakt: yenkee.gaming@seznam.cz

Nahlásit jako SPAM
IP: 188.120.210.–
KIIV
~ Moderátor
+43
God of flame
26. 12. 2017   #10
-
0
-

#9 Yenkee
uz ses aspon dostal pres tu nekonecnou smycku?

Nahlásit jako SPAM
IP: 93.91.151.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Yenkee0
Newbie
26. 12. 2017   #11
-
0
-

#10 KIIV
No tak to si nejsem jistý, ale když jsem z hlavičkových souborů odebral namespace std, tak to tu mám samou chybu

Nahlásit jako SPAM
IP: 188.120.210.–
KIIV
~ Moderátor
+43
God of flame
26. 12. 2017   #12
-
+1
-
Zajímavé

#11 Yenkee
Musis pak hazet  std::string, std::vector  (tusim, ze nic jineho tam ani neni)

Je to jen zlozvyk, u domacich ukolu se to asi da prezit. Ale na druhou stranu bys aspon mohl vedet, k cemu to vlastne je :)

Nahlásit jako SPAM
IP: 93.91.151.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Kit+15
Guru
27. 12. 2017   #13
-
+1
-
Zajímavé

Pokud ten program má být napsán objektově, měl by ses zbavit těch switchů a špaget z ifů. Při požadavku přídání dalšího druhu rostliny by se hotové třídy již neměly modifikovat, ale pouze se přidá další třída, která bude potomkem třídy Rostlina.

Nahlásit jako SPAM
IP: 194.228.68.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Yenkee0
Newbie
27. 12. 2017   #14
-
0
-

Stále platí nabídka odměny pro toho, kdo by byl ochoten opravit program do funkční podoby

Nahlásit jako SPAM
IP: 188.120.210.–
Jerry
~ Anonymní uživatel
512 příspěvků
27. 12. 2017   #15
-
-2
-
Mimo téma
Kit -

#14 Yenkee
copak ? on ti nikdo neporadil zadara ??? :))) to je divný ne ?

Nahlásit jako SPAM
IP: 2a00:1028:83be:235a:4446:...–
Yenkee0
Newbie
28. 12. 2017   #16
-
0
-

#15 Jerry

Ale ano, odhalili mi spoustu chyb, které se snažím postupně vyřešit. Například už se mi podařilo opravit "vypisNeco" metody, aby opravdu vracely to, co potřebuji. Nabídku na opravu jsem zadal proto, abych ušetřil investovaný čas, člověku, který tomu rozumí to zabere 1/10 času. Já se programovat učím 2 měsíce, takže mi bohužel chybí ten potřebný nadhled a u každého, byť sebemenšího problému, se zaseknu na dlouhou dobu.

Tvůj komentář byl více než zbytečný.

Nahlásit jako SPAM
IP: 188.120.210.–
28. 12. 2017   #17
-
0
-

Je tvůj cíl naučit se programovat? Pak hotové řešení tě moc nenaučí. 

hu

Nahlásit jako SPAM
IP: 195.178.67.–
Yenkee0
Newbie
28. 12. 2017   #18
-
0
-

#17 hlucheucho

Mým cílem je projít povinným kurzem programovaní (bohužel i ve specializaci, která programování nevyžaduje je jeden povinný), nikoli se naučit programovat. Navíc teoretickou část mám již za sebou, už jen dodělat program.

Nahlásit jako SPAM
IP: 188.120.210.–
KIIV
~ Moderátor
+43
God of flame
28. 12. 2017   #19
-
0
-

#16 Yenkee
mimochodem u tech vypisNeco, jsem narazel zrovna na nazev te metody zacinajici "vypis", kdyz to nic nevypisuje.

Nahlásit jako SPAM
IP: 93.91.151.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Kit+15
Guru
28. 12. 2017   #20
-
0
-

#16 Yenkee
Zveřejnil jsi to, co už máš, i když to zatím nefunguje. To je dobrý začátek. Domácí úkoly tu sice neděláme, ale můžeme kolem tvého kódu diskutovat, což ti může přinést mnohem víc.

V C++ nedělám, od toho jsou tu povolanější.

Nahlásit jako SPAM
IP: 194.228.68.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Kit+15
Guru
28. 12. 2017   #21
-
0
-

#19 KIIV
Také se mi ty názvy metod nelíbí. Jak správně uvádíš, dělají něco jiného. Osobně dávám přednost jednoslovním názvům - slovesům.

Nahlásit jako SPAM
IP: 194.228.68.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Yenkee0
Newbie
28. 12. 2017   #22
-
0
-

zatím jsem zkusil opravit pouze třídu rostlina, už by to mělo vracet to, co je potřeba

rostlina.h

#ifndef __Rostlina_h_
#define __Rostlina_h_

class Rostlina
{
private:

  std::string druh;
  std::string barvaKvetu;
  int vyska;
  
public: 

    Rostlina(std::string infoRostlina);
    std::string vypisDruh();
    std::string vypisBarvuKvetu();
    int vypisVysku();
    int vypisCenu();
    int vypisCenuDruhu();
  
    
    

};

#endif // __Rostlina_h_

rostlina.cpp

#include <iostream>
#include <sstream>
#include <stdlib.h>
#include "Rostlina.h"
using namespace std;


Rostlina::Rostlina(std::string infoRostlina){
    
    stringstream rostlinaStream(infoRostlina);
    rostlinaStream >> druh;
    rostlinaStream >> barvaKvetu;
    rostlinaStream >> vyska;
}

std::string Rostlina::vypisDruh(){
    cout << "Druh: " << druh << endl;
  }

std::string Rostlina::vypisBarvuKvetu(){
    cout << "Barva kvetu: " << barvaKvetu << endl;
  }   
  
int Rostlina::vypisVysku(){
    cout << "Vyska: " << vyska << endl;
  } 
  
int Rostlina::vypisCenu(){
    int cena = 0;
    
     if(druh == "ruze")
        {
        cena = cena + 30;
        } else if (druh == "cimisnik")
            {
            cena = cena + 25;
            }  else if (druh == "denivka")
                {
                cena = cena + 20;
                } else if (druh == "levandule")
                    {
                    cena = cena + 15;
                    } else if (druh == "tulipan")
                        {
                        cena = cena + 10;
                        } else { cout << "Tuto rostlinu bohuzel nemame."  << endl;
                                 exit(EXIT_FAILURE);
                                 } 
   
     if(barvaKvetu == "cervena")
         {
         cena = cena + 15; 
         } else if (barvaKvetu == "fialova")
            {
            cena = cena + 14;
            }  else if (barvaKvetu == "bila")
                {
                cena = cena + 13;
                } else if (barvaKvetu == "ruzova")
                    {
                    cena = cena + 12;
                    } else if (barvaKvetu == "zelena")
                        {
                        cena = cena + 11;
                        } else { cout << "Rostliny o takove barve kvetu bohuzel nemame."  << endl; 
                                 exit (EXIT_FAILURE);            
                                }
    if (vyska > 0 && vyska < 15)
        {
        cena = cena + 5;
        } else if (vyska > 15 && vyska < 30)
            {
            cena = cena + 10;
            } else if (vyska > 30 && vyska < 60 )
            {
            cena = cena + 40;
            } else { cout << "Zadana vyska je neplatna. Pouzijte prosim vysku od 0 do 60 cm" << endl;
                    exit (EXIT_FAILURE);
                   }

     
     cout << "Cena této rostline je: "  << cena << "Kč." << endl;
  }     
  
  int Rostlina::vypisCenuDruhu(){
      int cena = 0;
      
       if(druh == "ruze"){
        cena = cena + 30;
        } else if (druh == "cimisnik"){
            cena = cena + 25;
            }  else if (druh == "denivka"){
                cena = cena + 20;
                } else if (druh == "levandule"){
                    cena = cena + 15;
                    } else if (druh == "tulipan"){
                        cena = cena + 10;
                        } else { cout << "Tuto rostlinu bohuzel nemame."  << endl;
                                 exit (EXIT_FAILURE);
                                 }
         cout << "Cena " << druh <<" je: " << cena << " Kč" << endl;
      }
Nahlásit jako SPAM
IP: 188.120.210.–
Kit+15
Guru
28. 12. 2017   #23
-
+1
-
Zajímavé

#22 Yenkee
Snaž se dostat cin a cout ven z metod. Vstupy a výstupy mají být mimo objekty nebo se předávají přes parametry. Nebudeš pak mít duplicity v metodách vypisCenu() a vypisCenuDruhu(). Místo toho ti metody cenaDruhu(), cenaBarvy() a cenaVyska() budou vracet čísla, která si už sečteš a zformátuješ dle potřeby. Případně metoda cena() zavolá tyto tři metody a jejich výsledky sečte. Tím také zcela odpadne interní proměnná cena.

Nechej svůj editor ten kód zformátovat. Stačilo mi, abych ho prohnal programem indent a rázem se to dá číst.

Je dobrým zvykem soubor pojmenovávat podle názvu třídy. Třída Rostlina by tedy měla být v souboru Rostlina.cpp. Respektuj velikost písmen.

Nahlásit jako SPAM
IP: 194.228.68.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Yenkee0
Newbie
30. 12. 2017   #24
-
0
-

Zdravím, většinu funkcí se mi již podařilo opravit, nyní jsem se zasekl na funkci, která by dokázala odebrat vybranou rostlinu, kterou přidávám následující funkcí. 

void pridejRostlinu(rostlina** rostliny, int& pocet)
{

    //zde vstupy od uživatele a podmínky, které je šetří -pro přehlednost 
    // jsem je vynechal

    rostlina* rostliny2 = new rostlina[pocet + 1];
    for (int i = 0; i < pocet; i++)
    {

        rostliny2[i] = (*rostliny)[i];
    }
    rostliny2[pocet] = rostlina(druh, barvaKvetu, vyska);
    *rostliny = rostliny2;
    pocet++;
}
Nahlásit jako SPAM
IP: 188.120.210.–
gna
~ Anonymní uživatel
1891 příspěvků
30. 12. 2017   #25
-
+1
-
Zajímavé

#24 Yenkee
Můžeš zase vytvořit nové pole, ale při kopírování vynecháš prvek, který chceš odstranit.

Pokud jsi na tohle řešení přešel, protože ti nešlo přidávat do toho vektoru, tak to bylo tím, že jsi přidával do parametru, který je kopií původní hodnoty. Stačí ho deklarovat jako referenci a změna se promítne i ven, stejně jako to máš teď u 'pocet'.

void pridatRostlinu(Zahon& zahon)
Nahlásit jako SPAM
IP: 213.211.51.–
gna
~ Anonymní uživatel
1891 příspěvků
30. 12. 2017   #26
-
+1
-
Zajímavé

Celkově je lepší všechny složitější struktury předávat jako referenci, aby se zbytečně nevytvářela kopie. A pokud ve funkci ten parametr nechceš měnit, tak ještě můžeš přidat 'const'.

A pokud zůstaneš u toho řešení s polem, tak ještě nezapomeň to staré vždycky ještě smazat (delete[])

Nahlásit jako SPAM
IP: 213.211.51.–
Yenkee0
Newbie
30. 12. 2017   #27
-
0
-

#26 gna
Nechám si to pole, přijde mi to lepší .. na delete jsem samozřejmě zase zapomněl :) Děkuji

Nahlásit jako SPAM
IP: 188.120.210.–
Yenkee0
Newbie
31. 12. 2017   #28
-
0
-

Netušíte někdo proč se mi data do souboru zapíší, ale neuloží ? po znovu spuštění programu se soubor vymaže, stejně tak pokud chci ukládat více než jednou (to už se ani nezapíší)

metoda ve třídě:

  void ulozDoSouboru(ofstream& soubor)
    {
        soubor << druh;
        soubor << barvaKvetu;
        soubor << vyska;
    }

implementace

ofstream f("cesta k souboru");

if (f.is_open())
                    {
                        for (int i = 0; i < pocet; i++)
                        {
                            rostliny[i].ulozDoSouboru(f);
                        }
                        cout << "Informace o rostlinach na zahone byly uspesne ulozeny. " << endl;
                        f.close();
                    }
                    else
                        cout << "Soubor se nepodarilo otevrit." << endl;
                }
Nahlásit jako SPAM
IP: 188.120.210.–
KIIV
~ Moderátor
+43
God of flame
31. 12. 2017   #29
-
0
-

#28 Yenkee
jak vis, ze se data do souboru zapisou, ale neulozi, kdyz se neulozi a nemuzes se tedy mrknout, ze v souboru opravdu jsou?

Nahlásit jako SPAM
IP: 81.30.230.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Yenkee0
Newbie
31. 12. 2017   #30
-
0
-

#29 KIIV

Pokud spustím program, přidám rostliny a uložím, tak jsou v souboru zapsány, pokud při stejném běhu programu přidám další rostlinu  a chci uložit podruhé, do souboru se už neuloží, jsou tam jen ty z prvního uložení (hlásí chybu, že se soubor nepodařilo otevřít). No a pokud program vypnu a znovu zapnu, tak se obsah souboru vymaže.

Nahlásit jako SPAM
IP: 188.120.210.–
Kit+15
Guru
31. 12. 2017   #31
-
+1
-
Zajímavé

#30 Yenkee
To bude asi tím, že ten soubor na konci zavíráš. Do zavřeného souboru už nezapíšeš.

Nahlásit jako SPAM
IP: 194.228.68.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
KIIV
~ Moderátor
+43
God of flame
31. 12. 2017   #32
-
+1
-
Zajímavé

#31 Kit
pokud ho tedy pokazde neotevre

#30 Yenkee
bez kodu je to proste tezke odhadnout. Kazdopadne ofstream defaultne maze obsah, takze pokud to nemas spravne v seznamu, tak uz nic dalsiho nevykouzlis.

Nahlásit jako SPAM
IP: 81.30.230.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Yenkee0
Newbie
31. 12. 2017   #33
-
0
-

#31 Kit

Tu implementaci ukládání mám pod casem, čili pokud chce uživatel uložit, měl by se kód provést znovu celý ne ? tedy znovu otevřít soubor, zapsat a zavřít. Nebo to chápu špatně ?

Nahlásit jako SPAM
IP: 188.120.210.–
Yenkee0
Newbie
31. 12. 2017   #34
-
0
-

#32 KIIV
Jak ten ofstream použít, aby soubor nepřemazával ?

Nahlásit jako SPAM
IP: 188.120.210.–
KIIV
~ Moderátor
+43
God of flame
31. 12. 2017   #35
-
0
-

#34 Yenkee
v tom myslim problem nebude, zameril bych se na to, co mas v seznamu. Umis to uz vypsat na obrazovku? Vypisuje to co ma ci ne?

Nahlásit jako SPAM
IP: 81.30.230.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Yenkee0
Newbie
31. 12. 2017   #36
-
0
-

#35 KIIV

Ano, mám dva druhy výpisů, kde každý používám na něco jiného (oba fungují, jak mají)

  void vypis()
    {
        cout << "ROSTLINA: " << druh << " "
             << ", BARVA KVETU: " << barvaKvetu << " "
             << ", VYSKA: " << vyska << "" << endl;
    }
void RostlinaInfo()
    {
        cout << "----------------------" << endl;
        cout << "Informace o rostline: " << endl;
        cout << "----------------------" << endl;
        cout << "Druh: " << druh << endl;
        cout << "Barva Kvetu: " << barvaKvetu << endl;
        cout << "Vyska: " << vyska << " cm" << endl;
        cout << "Cena: " << cenaDruhu() + cenaBarvyKvetu() + cenaVysky() << " Kc" << endl;
    }
Nahlásit jako SPAM
IP: 188.120.210.–
gna
~ Anonymní uživatel
1891 příspěvků
31. 12. 2017   #37
-
0
-

#36 Yenkee
To je jedna rostlina, zkus je vypsat všechny. Problém bude v tom seznamu (nebo počtu), jinak to vypadá dobře.

Nahlásit jako SPAM
IP: 213.211.51.–
Yenkee0
Newbie
31. 12. 2017   #38
-
0
-

#37 gna

všechny vypisuji opět pod casem

   case 3:
                    system("cls");
                    if (pocet < 1)
                    {
                        cout << "Zahon je prazdny ! Nejprve je treba nejakou rostinu pridat."
                             << endl;
                    }
                    for (int i = 0; i < pocet; i++)
                        rostliny[i].RostlinaInfo();

                    break;
Nahlásit jako SPAM
IP: 188.120.210.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 74 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý