Symulator jazdy autem problem z typem char i if

Odpowiedz Nowy wątek
2010-05-22 10:00

Rejestracja: 9 lat temu

Ostatnio: 3 lata temu

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 :-)

Pozostało 580 znaków

javauser
2010-05-22 10:10
javauser
0

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

Pozostało 580 znaków

javauser
2010-05-22 10:20
javauser
0

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

Pozostało 580 znaków

Świętowit
2010-05-22 10:22
Świętowit
0

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

Pozostało 580 znaków

javauser
2010-05-22 10:26
javauser
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.

Pozostało 580 znaków

Świętowit
2010-05-22 10:29
Świętowit
0

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

Pozostało 580 znaków

2010-05-22 10:48

Rejestracja: 9 lat temu

Ostatnio: 3 lata temu

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" ;-)

Pozostało 580 znaków

javauser
2010-05-22 10:53
javauser
0

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

Pozostało 580 znaków

javauser
2010-05-22 11:00
javauser
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;
}

Pozostało 580 znaków

2010-05-22 11:14

Rejestracja: 9 lat temu

Ostatnio: 3 lata temu

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 :-)

Pozostało 580 znaków

javauser
2010-05-22 11:21
javauser
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ą .

Pozostało 580 znaków

Odpowiedz

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