Symulator jazdy autem problem z typem char i if

0

Witam mam napisać symulator jazdy samochodem zgodnie z tymi kryteriami:

http://hostuje.net/file.php?id=199076a7b5104d962073f41da05a4b7c

Mój pierwszy problem to fakt że pola Marka Model i nrrejestracyjny maja być typu char. Gy są one typu char nie mogę ich uzupełnić za pomocą metody.
Kolejny problem to fakt że po wywołaniu metod odpowiadających za zapłon i pasy z parometrem false nadal zwraca komunikat dla parometru true. Macie moźe jakiś pomysł na zoptymalizowanie if w metodzie odpowiadającej za przyspieszanie i zwalnianie?

Oto mój kod:

#include <iostream>
#include <cstdlib>
using namespace std;

class Samochod
{
 
 public:
        friend class Uzytkownik;
        string marka,model,nrrejestracyjny;
        bool zaplon; 
        unsigned short predkosc;
        
        Samochod (unsigned short p=0)
        {
        
        this->predkosc=p;
                 }
 
 void produkuj (string m, string mo, string nrr)
 {
  marka=m;
  model=mo;
  nrrejestracyjny=nrr;
  }
  
  void pokazdane ()
  {
   cout<<"Marka: "<<marka<<endl;
   cout<<"Model: "<<model<<endl;
   cout<<"Numer rejestracyjny: "<<nrrejestracyjny<<endl;
   }
   
   void pokazpredkosc()
   {
cout<<"Aktualna predkosc to: "<<predkosc<<endl;    
    }
   
   void silnik
 (bool z)
   {
    zaplon=z;
    }
    
    void gaz (unsigned short pr)
    {
     predkosc=pr;
     }
 
      };
      
class Uzytkownik
{
public:
bool stanpasow;

void kup (Samochod & a)
{
 cout<<"Kierowca kupil: "<<endl;
a.pokazdane();
 }  
 
 void wsiadz ()
 {
cout<<"Kierowca
 wsiadl do samochodu"<<endl;  
  }
  
  void pasy (bool sp)
{
 stanpasow=sp;
 if (stanpasow=true)
 {
    cout<<"Pasy zapiente"<<endl;
}    
else
{
cout<<"Pasy odpiete"<<endl;
}               
       }
       
void uruchomzgas (Samochod & b, bool za)
{
 b.silnik(za);
if (b.zaplon=true)
{
cout<<"Samochod odpalony"<<endl;             }

else
{
cout<<"Samochod zgaszony"<<endl;
}
}
      
void km (Samochod & c, unsigned short pre)
{
 if (pre>0)
 {
  cout<<"Kierowca przyspieszyl"<<endl;         }
else
{
cout<<"Kierowca zwolnil"<<endl;
}
  
 c.gaz(pre);
 c.pokazpredkosc();
 }      
 
 void wysiadz ()
 {
cout<<"Kierowca wysiadl z samochodu"<<endl;  
  }
      };


int main ()
{
    Samochod autko;
Uzytkownik kierowca;
autko.produkuj("Opel","Vectra C","PCHL155");
kierowca.kup(autko);
kierowca.wsiadz();
kierowca.pasy(true);
kierowca.uruchomzgas(autko,true);
kierowca.km(autko,100);
kierowca.km(autko,140);
kierowca.km(autko,false);
kierowca.uruchomzgas(autko,false);
kierowca.pasy(false);
kierowca.wysiadz();
    system("pause");
    return 0;
}

Proszę o sprawdzenie poprawności kodu (zgodności z powyższymi kryteriami) i informacje o błędach z góry dzięki za pomoc :-)

0

Jeżeli to jest C++ to operatorem porównania nie jest "=" tylko "=="
operator przypisania "=" zwraca prawą wartość.

0

Uuuuu, zanim użyjesz klasy musisz stworzyć jej instance
Samochod autko = new Samochod()
autko.produkuj("Opel","Vectra C","PCHL155");

0

@javauser - popieprzyły Ci się języki.

0

Jeszcze rada do modelowania rzeczywistości za pomocą klas.
Metoda "produkuj" bardzie by pasowała do klasy np Fabryka
cechy Samochodu ustawiaj raczej jako argumenty przekazywane do konstruktora

np Samochód autko = new Samochod("Opel")

Tak jest berdziej czytelnie.

0

Jak już to Samochód autko("Opel"), C++ nie robi w tym względzie rozróżnienia pomiędzy prymitywami a złożonymi.

0

Ok problem z komunikatem związanym z zapłonem i pasami rozwiązany. Dzięki za przypomnienie że operator porównania to "==" teraz pozostał tylko problem z typem char. Poniżej macie program gdzie zmieniłem typ string na wymagany typ char i program się krzaczy.

#include <iostream>
#include <cstdlib>
using namespace std;

class Samochod
{
 
 public:
        friend class Uzytkownik;
        char marka,model,nrrejestracyjny;
        bool zaplon; 
        unsigned short predkosc;
        
        Samochod (unsigned short p=0)
        {
        
        this->predkosc=p;
                 }
 
 void produkuj (char m, char mo, char nrr)
 {
  marka=m;
  model=mo;
  nrrejestracyjny=nrr;
  }
  
  void pokazdane ()
  {
   cout<<"Marka: "<<marka<<endl;
   cout<<"Model: "<<model<<endl;
   cout<<"Numer rejestracyjny: "<<nrrejestracyjny<<endl;
   }
   
   void pokazpredkosc()
   {
cout<<"Aktualna predkosc to: "<<predkosc<<endl;    
    }
   
   void silnik (bool z)
   {
    zaplon=z;
    }
    
    void gaz (unsigned short pr)
    {
     predkosc=pr;
     }
 
      };
      
class Uzytkownik
{
public:
bool stanpasow;

void kup (Samochod & a)
{
 cout<<"Kierowca kupil: "<<endl;
a.pokazdane();
 }  
 
 void wsiadz ()
 {
cout<<"Kierowca wsiadl do samochodu"<<endl;  
  }
  
  void pasy (bool sp)
{
 stanpasow=sp;
 if (stanpasow==true)
 {
    cout<<"Pasy zapiente"<<endl;
}    
else
{
cout<<"Pasy odpiete"<<endl;
}               
       }
       
void uruchomzgas (Samochod & b, bool za)
{
 b.silnik(za);
if (b.zaplon==true)
{
cout<<"Samochod odpalony"<<endl;             }

else
{
cout<<"Samochod zgaszony"<<endl;
}
}
      
void km (Samochod & c, unsigned short pre)
{
 if (pre>0)
 {
  cout<<"Kierowca przyspieszyl"<<endl;         }
else
{
cout<<"Kierowca zwolnil"<<endl;
}
  
 c.gaz(pre);
 c.pokazpredkosc();
 }      
 
 void wysiadz ()
 {
cout<<"Kierowca wysiadl z samochodu"<<endl;  
  }
      };


int main ()
{
    Samochod autko;
Uzytkownik kierowca;
autko.produkuj("Opel","Vectra C","PCHL155");
kierowca.kup(autko);
kierowca.wsiadz();
kierowca.pasy(true);
kierowca.uruchomzgas(autko,true);
kierowca.km(autko,100);
kierowca.km(autko,140);
kierowca.km(autko,0);
kierowca.uruchomzgas(autko,false);
kierowca.pasy(false);
kierowca.wysiadz();
    system("pause");
    return 0;
}

Co do wyglądu klas pisałem je zgodnie z wymaganiami które macie w linku na górze. Obie klasy mają swoją instancje jak widać instancją pierwszej jest "autko" a drugiej "kierowca" ;-)

0

char wskazuje jeden znak. Musisz przekazać wskaźnik na ciąg znaków (char*)

0

char* marka;
char* model;
char* nrrejestracyjny;
bool zaplon;
unsigned short predkosc;

    Samochod (unsigned short p=0)
    {
   
        this->predkosc=p;
      }

void produkuj (char* m, char* mo, char* nrr)
{
this->marka=m;
this->model=mo;
this->nrrejestracyjny=nrr;
}

0

Ok wszystko działa powiem szczerze że o wskaźnikach nie pomyślałem wpadło mi do głowy strcpy Swoją drogą ciekawe czy zadziała? zmodyfikowałem jeszcze delikatnie metodę odpowiadającą za zwalnianie i przyspieszanie i otrzymałem coś takiego:

#include <iostream>
#include <cstdlib>
using namespace std;

class Samochod
{
 
 public:
        friend class Uzytkownik;
        char* marka;
        char* model;
        char* nrrejestracyjny;
        bool zaplon;
        unsigned short predkosc;
       
        Samochod (unsigned short p=0)
        {
       
            this->predkosc=p;
          }
 
 void produkuj (char* m, char* mo, char* nrr)
 {
      this->marka=m;
      this->model=mo;
      this->nrrejestracyjny=nrr;
  } 
  
  void pokazdane ()
  {
   cout<<"Marka: "<<marka<<endl;
   cout<<"Model: "<<model<<endl;
   cout<<"Numer rejestracyjny: "<<nrrejestracyjny<<endl;
   }
   
   void pokazpredkosc()
   {
cout<<"Aktualna predkosc to: "<<predkosc<<endl;    
    }
   
   void silnik (bool z)
   {
    zaplon=z;
    }
    
    void gaz (unsigned short pr)
    {
     predkosc=pr;
     }
 
      };
      
class Uzytkownik
{
public:
bool stanpasow;

void kup (Samochod & a)
{
 cout<<"Kierowca kupil: "<<endl;
a.pokazdane();
 }  
 
 void wsiadz ()
 {
cout<<"Kierowca wsiadl do samochodu"<<endl;  
  }
  
  void pasy (bool sp)
{
 stanpasow=sp;
 if (stanpasow==true)
 {
    cout<<"Pasy zapiente"<<endl;
}    
else
{
cout<<"Pasy odpiete"<<endl;
}               
       }
       
void uruchomzgas (Samochod & b, bool za)
{
 b.silnik(za);
if (b.zaplon==true)
{
cout<<"Samochod odpalony"<<endl;             }

else
{
cout<<"Samochod zgaszony"<<endl;
}
}
      
void km (Samochod & c, unsigned short pre)
{
 if (pre>c.predkosc)
 {
  cout<<"Kierowca przyspieszyl"<<endl;         }
else
{
cout<<"Kierowca zwolnil"<<endl;
}
  
 c.gaz(pre);
 c.pokazpredkosc();
 }      
 
 void wysiadz ()
 {
cout<<"Kierowca wysiadl z samochodu"<<endl;  
  }
      };


int main ()
{
    Samochod autko;
Uzytkownik kierowca;
autko.produkuj("Opel","Vectra C","PCHL155");
kierowca.kup(autko);
kierowca.wsiadz();
kierowca.pasy(true);
kierowca.uruchomzgas(autko,true);
kierowca.km(autko,100);
kierowca.km(autko,140);
kierowca.km(autko,0);
kierowca.uruchomzgas(autko,false);
kierowca.pasy(false);
kierowca.wysiadz();
    system("pause");
    return 0;
}

Wielkie dzięki za pomoc :-)

0

strcpy tez by zadziałało ale jak widzisz argumentami też są wskaźniki. Jak będziesz jej używał to pamietaj aby zarezerwować odpowiednia ilość pamięci na kopiowany string. Jeśli nie zaalokujesz pamięci to strcopy może zapisać coś ważnego - np inna zmienną .

0

Ok jeszcze raz wielkie dzięki za pomoc :-) Swoją drogom nie myślałem że popełnię tak banalny błąd jak z tym operatorem porównania. Ale jak widać niekiedy oko kogoś kto patrzy na program z góry a nie z pozycji autora łatwiej zauważy wpadki :-)

1 użytkowników online, w tym zalogowanych: 0, gości: 1