[zap. test] 18.1. (16:30)

Invasion

[zap. test] 18.1. (16:30)

Příspěvek od Invasion »

Měli jsme udělat simulaci odletové tabule na letišti během dne.

Do systému jsou během dne přidávány nové lety. Sekvence těchto požadavků je na vstupu, ve formátu:
čas_zadání_požadavku číslo_letu destinace čas_odletu
např.:

Kód: Vybrat vše

0:50 OK131 Helsinky 8:40
0:54 AF147 Moskva 7:30
1:30 BA121 Londyn 10:40
10:25 AF885 Pariz 16:30
V určitých okamžicích se letová tabule mění, a právě v nich nás zajímá, jak bude vypadat.

Tabule se mění, když:
- je do systému zadán nový let (objeví se na tabuli)
- letadlo odletělo (zmizí z tabule)
- let mění stav:
2 hodiny před odletem přechází do stavu 'check-in'
30 minut před odletem přechází do stavu 'nástup'
10 minut před odletem přechází do stavu 'brána uzavřena'

Úkolem je vypsat tabuli ve všech časech nějaké změny (+čas této změny nad tabulí) vzestupně podle času během dne, tedy:
Výstup:

Kód: Vybrat vše

0:50
OK131 Helsinky 8:40

0:54
AF147 Moskva 7:30
OK131 Helsinky 8:40

1:30
AF147 Moskva 7:30
OK131 Helsinky 8:40
BA121 Londyn 10:40

5:30
AF147 Moskva 7:30 check-in
OK131 Helsinky 8:40
BA121 Londyn 10:40

...

Překvapilo mě pohodové takto pohodové zadání.
Dělal jsem to zhruba tak, že jsem si načetl všechny lety do vector<Flight>, při načítání převáděl čas (string) na počet minut od půlnoci (int) , setřídil podle času odletu.
Zároveň při načítání jsem do setu (set<int>) sypal časy změn, které každý let vygeneruje. Tím se tyto časy setřídily a zárověň odpady duplicity.
Pak stačilo set časů projít a v každém čase vypsat vektor letů, ale pouze ty letadla, které už byly zadány a ještě neodletěly a taky případně připsat stav.

Šlo by to možná i líp, ale co :)
Tak gl těm co tam ještě nebyli.
atombomb
Matfyz(ák|ačka) level I
Příspěvky: 22
Registrován: 18. 1. 2007 13:11

Příspěvek od atombomb »

ako, pravda je, ze nebolo tazke(no, nakontajnerovali ste sa, ale tak ked clovek vedel o com, tak sa dalo, videl som ine hrozy), na druhu stranu, po mne(15 minut pred uplnym koncom cca) tam ostalo este par ludi.

co ma dost ziritovalo, bolo zistenie par minut pred limitom, ze map pri inserte insertuje, len ked neexistuje prvok s danym klucom... to boli radosti pri sucasnych udalostiach. teraz pozeram, ze ten zotriedeny vector mal asi cosi do seba.
ja som nacital riadok, vygeneroval k datam udalosti(kedy bol pridany, kedy zacina checkin,nastup etc) a tie nahadzal do mapy map<int cas udalosti, class udalost(destination, flight number..) >, nahadzal ich casy do set<int cas>
a potom vypisal vsetky cez udalosti do 'cas'-u prislusne zoznamy
a po dokonceni citania som vypisal vseky udalosti do casu (24:00)

no trochu prasacke, ale tak raz som to tak zacal, tak som aj dokoncil...
Uživatelský avatar
Petr-H
Matfyz(ák|ačka) level II
Příspěvky: 81
Registrován: 30. 1. 2006 14:18
Typ studia: Informatika Mgr.
Bydliště: VŠK 17. listopadu
Kontaktovat uživatele:

Příspěvek od Petr-H »

Přikládám zadání, příklad vstupu a výstupu a vlastní řešení pro inspiraci :wink:

Kód: Vybrat vše

#include <iostream>
#include <fstream>
#include <string>
#include <queue>
#include <map>
#include <algorithm>
#include <iomanip>
using namespace std;

// class State
enum State { waiting, checkin, boarding, gateclosed, departure };

// class Time
class Time
{
private:
	int hour, minute;
public:
	Time() : hour(0), minute(0) {}
	Time(int hour, int minute) : hour(hour), minute(minute) {}

	friend ostream & operator <<(ostream & stream, Time & time);
	friend istream & operator >>(istream & stream, Time & time);
	friend Time operator -(const Time & t1, const Time & t2);
	friend bool operator <(const Time & t1, const Time & t2);
};

Time operator-(const Time & t1, const Time & t2)
{
	return Time(t1.hour - t2.hour - (t1.minute < t2.minute ? 1 : 0), t1.minute >= t2.minute ? t1.minute - t2.minute : 60 - (t2.minute - t1.minute));
}

bool operator <(const Time & t1, const Time & t2)
{
	return (t1.hour < t2.hour) || (t1.hour == t2.hour && t1.minute < t2.minute);
}

ostream & operator <<(ostream & stream, Time & time)
{
	stream << setfill('0') << setw(2) << time.hour << ':' << setw(2) << time.minute;
	return stream;
}

istream & operator >>(istream & stream, Time & time)
{
	char separator;
	stream >> time.hour >> separator >> time.minute;
	return stream;
}

// class Fly
class Fly
{
private:
	State state;
	string number, destination;
	Time time;
public:
	Fly () : state(waiting) {}

	Time getTime() { return time; }
	State getState() { return state; }
	void setState(State s) { state = s; }

	friend ostream & operator <<(ostream & stream, Fly & fly);
	friend istream & operator >>(istream & stream, Fly & fly);
	friend bool operator <(const Fly & f1, const Fly & f2);
};

bool operator <(const Fly & f1, const Fly & f2)
{
	return f1.time < f2.time;
}

ostream & operator <<(ostream & stream, Fly & fly)
{
	stream << fly.number << " " << fly.destination << " " << fly.time;
	switch (fly.state)
	{
	case checkin : stream << " check-in"; break;
	case boarding : stream << " nastup"; break;
	case gateclosed : stream << " brana uzavrena"; break;
	}
	return stream;
}

istream & operator >>(istream & stream, Fly & fly)
{
	stream >> fly.number >> fly.destination >> fly.time;
	fly.state = waiting;
	return stream;
}

// class Event
class Event
{
private:
	Time time;
	State state;
	Fly * fly;
public:
	Event() {}
	Event(Time time, State state, Fly * fly) : time(time), state(state), fly(fly) {}
	
	State getState() { return state; }
	Time getTime() { return time; }
	Fly * getFly() { return fly; }
	void process();

	friend bool operator <(const Event & e1, const Event & e2);
};

void Event::process()
{
	fly->setState(state);
}

bool operator <(const Event & e1, const Event & e2)
{
	return e2.time < e1.time;
}

// class Table
class Table
{
private:
	priority_queue<Event> events_;
	multimap<Time, Fly *> flies_;
public:
	friend ostream & operator <<(ostream & stream, Table & table);
	void add(Fly * fly);
	Time process();
	Time time() { if (!empty()) return events_.top().getTime(); }
	bool empty() { return events_.empty(); };
};

void Table::add(Fly * fly)
{
	events_.push(Event(fly->getTime() - Time(2, 0), checkin, fly));
	events_.push(Event(fly->getTime() - Time(0, 30), boarding, fly));
	events_.push(Event(fly->getTime() - Time(0, 10), gateclosed, fly));
	events_.push(Event(fly->getTime(), departure, fly));
	flies_.insert(pair<Time, Fly *>(fly->getTime(), fly));
}

Time Table::process()
{
	Event e = events_.top();
	e.process();
	if (e.getState() == departure)
	{
		flies_.erase(e.getTime());
		delete e.getFly();
	}
	events_.pop();
	return e.getTime();
}

ostream & operator <<(ostream & stream, Table & table)
{
	for (multimap<Time, Fly *>::iterator i = table.flies_.begin(); i != table.flies_.end(); ++i)
		stream << *i->second << endl;
	return stream;
}

// main function
int main(int argc, char ** argv)
{
	if (argc != 2)
	{
		cerr << "Invalid arguments." << endl;
		return 1;
	}

	ifstream file;
	file.open(argv[1]);
	if (!file.is_open())
	{
		cerr << "Error opening file." << endl;
	}

	Table table;
	Time time;
	Fly * fly;
	while (!file.eof())
	{
		fly = new Fly();
		file >> time >> *fly;

		while (!table.empty() && table.time() < time)
			cout << table.process() << endl << table << endl;
		table.add(fly);
		cout << time << endl << table << endl;
	}
	while (!table.empty())
			cout << table.process() << endl << table << endl;

	return 0;
}
Přílohy
Zadaní zápočtového testu z OOP 18.1.07
Zadaní zápočtového testu z OOP 18.1.07
zadani.jpg (285.23 KiB) Zobrazeno 2111 x
Příklad vstupu a výstupu
Příklad vstupu a výstupu
priklad.JPG (243.08 KiB) Zobrazeno 2110 x
Odpovědět

Zpět na „2006“