Witam,
Postanowilem odwiedzic wasze forum, gdyz mam pewien problem;p czuje sie jak na obcej ziemii bo w koncu glownie to srodowisko informatykow, a ja jestem przyszlym elektronikiem;pp do rzeczy, mam pewien problem z przedmiotem podstawy program komp, a dokladniej z zadaniem postawionym przez prowadzacego zajecia.. mam do napisania symulator skrzyzowania, nie bede opisywal jak ma dzialac, gdyz zorientujecie sie jak odpalicie program (tak program juz mam, jakimis silami napisany przy wspolpracy z kumplami) TYLKO, ZE dowiedzialem sie ze na zajeciach bede musial dolozyc do tego dziedziczenie, pojecie juz zrozumialem, ale jak to zrobic nie wiem... prosze o pomoc w udodkonaleniu mojego kodu (jesli chodzi o dlugosc) i dolozenie tego dziedziczenia.. wiem ze powienienem sam dojsc do tego jak to zrobic, ale szczerze to programowanie nie jest czyms co lubie...
#include <cstdlib>
#include <iostream>
#include <list>
#include <string>
#include <iomanip>
#include <sstream>
#include <windows.h>
using namespace std;
// Typ samochodu
enum typ_samochodu {
OSOBOWY,
CIEZAROWY
};
// Kolor swiatla
enum kolor {
ZIELONE,
ZOLTE,
CZERWONE
};
// Klasa obslugujaca samochody
class samochod {
private:
// o - osobowy, c - ciezarowy
typ_samochodu typ;
public:
// Konstruktor klasy
samochod();
// Funkcja zwracajaca typ samochodu
typ_samochodu podaj_typ();
};
// Konstruktor klasy samochod
samochod::samochod() {
typ = typ_samochodu(rand() % 2);
};
// Funkcja zwracajaca typ samochodu
typ_samochodu samochod::podaj_typ() {
return typ;
}
// Koniec klasy samochod
// Klasa przechowujaca pojazdy znajdujace sie na drodze
class droga {
private:
// Lista samochodow na danej drodze
list<samochod> listaSamochodow;
// Zmienna steruje szybkoscia usuwania pojazdu z listy 1 - osobowy, 2 - ciezarowy
int predkosc;
public:
// Konstruktor klasy
droga();
// Funkcja dodaje nowy samochod do listy
void dodaj();
// Funkcja usuwa pierwszy samochod na liscie
void usun();
// Funkcja zwraca typ pierwszego samochodu
int pokaz();
// Funkcja wyswietla typ samochodu "po ludzku"
string __pokaz();
// Funkcja zwraca ilosc samochodow na liscie
int ile();
};
// Konstruktor klasy
droga::droga() {
predkosc = 1;
};
// Funkcja dodaje nowy samochod do listy
void droga::dodaj() {
listaSamochodow.push_back(samochod::samochod());
};
// Funkcja usuwa pierwszy samochod na liscie
void droga::usun() {
if (listaSamochodow.size() > 0) {
if (predkosc == 1 && pokaz() == 0) {
listaSamochodow.pop_front();
} else if (predkosc == 1 && pokaz() == 1) {
predkosc = 2;
} else if (predkosc == 2 && pokaz() == 1) {
listaSamochodow.pop_front();
predkosc = 1;
}
}
};
// Funkcja zwraca typ pierwszego samochodu
int droga::pokaz() {
list<samochod>::iterator element;
element = listaSamochodow.begin();
samochod pojazd = *element;
return pojazd.podaj_typ();
};
// Funkcja wyswietla typ samochodu "po ludzku"
string droga::__pokaz() {
list<samochod>::iterator element;
element = listaSamochodow.begin();
samochod pojazd = *element;
if (pojazd.podaj_typ() == 0) {
return "osobowy";
} else if (pojazd.podaj_typ() == 1 && ile() != 0) {
return "ciezarowy";
} else {
return "brak";
}
};
// Funkcja zwraca ilosc samochodow na liscie
int droga::ile() {
return listaSamochodow.size();
};
// Koniec klasy droga
// Klasa zarzadzajaca sygnalizatorami
class sygnalizator {
private:
// Zmienna przechowuje aktualny kolor swiatel
kolor swiatlo;
// Kierunek zmiany swiatel {-1, 1}
int kierunek;
public:
// Konstruktor klasy
sygnalizator();
// Funkcja zmieniajaca kolor swiatel
void zmien();
// Funkcja zwraca kolor swiatla
int podaj_kolor();
};
// Konstryktor klasy
sygnalizator::sygnalizator() {
// Sygnalizator zatrzymuje ruch
swiatlo = CZERWONE;
kierunek = -1;
};
// Funkcja zmieniajaca kolor swiatel
void sygnalizator::zmien() {
if (swiatlo == ZOLTE) {
swiatlo = (kolor)(swiatlo + kierunek);
kierunek -= kierunek * 2;
} else {
swiatlo = ZOLTE;
}
};
// Funkcja zwraca kolor swiatla
int sygnalizator::podaj_kolor() {
return swiatlo;
};
// Koniec klasy sygnalizator
// Klasa zarzadzajaca skrzyzowaniem
class skrzyzowanie {
private:
// Tablice przechowujace liste samochodow znajdujących sie na skrzyzowaniu
droga *drogi_pionowo;
droga *drogi_poziomo;
// Tablica przechowuje stan sygnalizatorow
sygnalizator *sygnalizatory;
// Zmienna przechowujaca numer zmienianego sygnalizatora
int numer;
// Czas zmian stanu samochodow na drodze
int samCzas;
// Czas zmian stanu sygnalizatorow
int sygCzas;
public:
// Konstryktor klasy
skrzyzowanie();
// Generator zdarzen
void __event();
// Funkcja zwraca stan skrzyzowania
void stan();
};
// Konstryktor klasy
skrzyzowanie::skrzyzowanie() {
// Utworzenie drog: gora, dol, lewo, prawo
drogi_pionowo = new droga[2];
drogi_poziomo = new droga[2];
// Utworzenie sygnalizacji 0 - gora, dol 1 - lewo, prawo
sygnalizatory = new sygnalizator[2];
// Poczatkowo zmianie ulegaja swiatla gora, dol
numer = 1;
// Przypisanie zmiennej ilosci milisekund od wlaczenia komputera do wywolania konstruktora
samCzas = GetTickCount();
// Przypisanie zmiennej ilosci milisekund od wlaczenia komputera do wywolania konstruktora
sygCzas = GetTickCount();
stan();
};
// Generator zdarzen
void skrzyzowanie::__event() {
// Ilosc milisekund do wywolania funkcje __event()
int tmpCzas = GetTickCount();
if ((tmpCzas - 5000) >= sygCzas && sygnalizatory[numer].podaj_kolor() == 2) {
numer = !(numer && numer);
sygnalizatory[numer].zmien();
sygCzas = tmpCzas;
} else if((tmpCzas - 5000) >= sygCzas){
sygnalizatory[numer].zmien();
sygCzas = tmpCzas;
}
if ((tmpCzas - 1000) >= samCzas) {
samCzas = tmpCzas;
if (sygnalizatory[0].podaj_kolor() == sygnalizatory[1].podaj_kolor()) {
;
} else if (sygnalizatory[1].podaj_kolor() == 2) {
for(int i = 0; i < rand() % 10; i++) {
drogi_poziomo[rand() % 2].dodaj();
}
drogi_pionowo[0].usun();
drogi_pionowo[1].usun();
} else if (sygnalizatory[0].podaj_kolor() == 2) {
for(int i = 0; i < rand() % 10; i++) {
drogi_pionowo[rand() % 2].dodaj();
}
drogi_poziomo[0].usun();
drogi_poziomo[1].usun();
}
stan();
}
};
// Funkcja zwraca stan skrzyzowania
void skrzyzowanie::stan() {
// Pomocnicza zmienna uzywana do wyswietlania sygnalizatorow
string syg[2][3];
// Pomocnicza zmienna uzywana do wyswietlania typu samochodu 0 - gora, 1 - dol, 2 - lewo, 3 - prawo
ostringstream sam[4];
sam[0] << "(" << drogi_pionowo[0].ile() << ") " << drogi_pionowo[0].__pokaz();
sam[1] << "(" << drogi_pionowo[1].ile() << ") " << drogi_pionowo[1].__pokaz();
sam[2] << "(" << drogi_poziomo[0].ile() << ") " << drogi_poziomo[0].__pokaz();
sam[3] << "(" << drogi_poziomo[1].ile() << ") " << drogi_poziomo[1].__pokaz();
system ("cls");
cout << "\t o " << setw(2) << setfill('0') << drogi_pionowo[0].ile() << " | o" << endl;
cout << "\tooo | ooo" << endl;
cout << "\t | " << setw(2) << setfill('0') << drogi_poziomo[1].ile() << endl;
cout << "\t---------------" << endl;
cout << "\t" << setw(2) << setfill('0') << drogi_poziomo[0].ile() << " |" << endl;
cout << "\tooo | ooo" << endl;
cout << "\t o | " << setw(2) << setfill('0') << drogi_pionowo[1].ile() << " o" << endl << endl;
cout << "GORA / DOL LEWO / PRAWO" << endl;
if (sygnalizatory[0].podaj_kolor() == 0) {
syg[0][0] = "[O]";
syg[0][1] = "[ ]";
syg[0][2] = "[ ]";
} else if (sygnalizatory[0].podaj_kolor() == 1) {
syg[0][0] = "[ ]";
syg[0][1] = "[O]";
syg[0][2] = "[ ]";
} else if (sygnalizatory[0].podaj_kolor() == 2) {
syg[0][0] = "[ ]";
syg[0][1] = "[ ]";
syg[0][2] = "[O]";
}
if (sygnalizatory[1].podaj_kolor() == 0) {
syg[1][0] = "[O]";
syg[1][1] = "[ ]";
syg[1][2] = "[ ]";
} else if (sygnalizatory[1].podaj_kolor() == 1) {
syg[1][0] = "[ ]";
syg[1][1] = "[O]";
syg[1][2] = "[ ]";
} else if (sygnalizatory[1].podaj_kolor() == 2) {
syg[1][0] = "[ ]";
syg[1][1] = "[ ]";
syg[1][2] = "[O]";
}
cout << " " << syg[0][0] << " " << syg[1][0] << endl;
cout << " " << syg[0][1] << " " << syg[1][1] << endl;
cout << " " << syg[0][2] << " " << syg[1][2] << endl << endl;
cout << "Typ pierwszego samochodu:" << endl << "Gorny pas: " << sam[0].str() << endl;
cout << "Dolny pas: " << sam[1].str() << endl;
cout << "Lewy pas : " << sam[2].str() << endl;
cout << "Prawy pas: " << sam[3].str() << endl;
};
// Koniec klasy skrzyzowanie
int main(int argc, char *argv[])
{
srand(time(NULL));
skrzyzowanie s1;
while (1) {
s1.__event();
}
}