Symulator skrzyżowania

0

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();
	}
}
0

nie da się "dołożyć" dziedziczenia do programu. Albo program masz zaprojektowany obiektowo z uwzględnieniem dziedziczenia albo nie. Najczęściej takie "dołożenie" dziedziczenia wiąże się niestety z koniecznością przeprojektowania, a co za tym przepisania większości kodu na nowo.

0

Za bardzo nie wpatrywałem się w ten kod, ale możesz zrobić podstawową klasę auto i klasy pochodne osobowy i ciężarowy.

uuu akurat w tym przypadku(Zauważ, że kod nie jest zbyt złożony) dołożenie abstrakcyjnej klasy podstawowej auto i pary klas pochodnych nie zmieni za dużo w kodzie, a już będzie mógł coś tam pokazać.

0

Ja to rozumiem tak: szkoła ma przygotować do pracy inżyniera czy technika dla którego komputer ma być narzędziem.
Po ch... do ku.. nędzy nie uczy się numeryki, korzystania z zaawansowanych narzędzi (mathematica czy inny matlab) ale po koniecznych podstawach, np. w C. Podstawy by jakoś pokazać jak naprawdę działa komputer, wyrobić jakieś pojęcie o złożoności, dokładności.
Do czego powstały obiekty, klasy? Czy on ma być szefem czy członkiem jakiejś ekipy programistycznej?
Czy to wina kompleksów nauczyciela, czy idiotów ustalających program nauczania?

0

Siema chciałem zobaczyć jak działa Twój program bo wygląda nawet ciekawie ale nie moge go odpalić i nie wiem dlaczego ;] co to jest ta bilioteka <sstream> to jest istringstream tak ? gdzie mozna ją pobrać czy cos ?albo w czym to uruchomić bo mam dev c++ 4 i mi własnie wyskakuje że nie ma takiego pliku <sstream>

0
Zenek napisał(a)

Siema chciałem zobaczyć jak działa Twój program bo wygląda nawet ciekawie ale nie moge go odpalić i nie wiem dlaczego ;] co to jest ta bilioteka <sstream> to jest istringstream tak ? gdzie mozna ją pobrać czy cos ?albo w czym to uruchomić bo mam dev c++ 4 i mi własnie wyskakuje że nie ma takiego pliku <sstream>
masz gotowy kod źródłowy i nie potrafisz go skompilować? masakra. Zmień tego starocia, a znikną twoje problemy.

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