USP Kolokvijum I (2026)
F1 selektor
Svake sezone Formule 1, svaki tim bira po dva vozača. Napisati program koji na osnovu podataka i rezultata vozača bira najbolja dva vozača za svaki tim.
Timovi u sezoni Formule 1 su: Alpine, Aston_Martin, Ferrari, Haas_F1_Team, Kick_Sauber, McLaren, Mercedes, Racing_Bulls, Red_Bull_Racing i Williams.
Svaki vozac ima ime, tim, broj osvojenih bodova u prethodnoj sezoni, najbolje vreme kvalifikacionog kruga (u milisekundama) i status (koji može biti OK(0), SUSPENDOVAN(1) ili POVREDJEN(2)). Napisati strukturu Vozac koja sadrži ove podatke (1 poen).
Vozači se biraju na osnovu sledećih kriterijuma:
-
Vozač mora biti podoban, što znaći da:
- nije suspendovan (status nije
SUSPENDOVAN(1)); - nije povređen (status nije
POVREDJEN(2)); - ima najmanje 40 osvojenih bodova u prethodnoj sezoni; i
- vozio je kvalifikacije (najbolji kvalifikacioni krug nije 0).
Implementirati funkcijuint je_podoban(const Vozac* v)koja proverava da li je vozač podoban (1 poen).
- nije suspendovan (status nije
-
Među podobnim vozačima, biraju se oni sa najboljim vremenom kvalifikacionog kruga. Ako dva vozača imaju isto vreme kvalifikacionog kruga, bira se onaj sa većim brojem osvojenih bodova u prethodnoj sezoni. Implementirati funkciju
int poredjenje_vozaca(const void* a, const void* b)koja poredi dva vozača po navedenim kriterijumima (1 poen).
Glavni program treba da učita podatke o vozačima dinamički u niz, sa inicijalnom veličinom 10 koja se duplira pri svakoj realokaciji (2 poena), iz datoteke (1 poen) čija se putanja prosleđuje kao argument komandne linije (1 poen). Omogućiti izbor najboljih vozača za svaki tim (2 poena), sa ispravnom obradom grešaka (1 poen).
Ulaz
Program se pokreće komandnom linijom oblika (1 poen):
./f1_selektor <putanja_vozaca>
Tekstualna datoteka na putanji <putanja_vozaca> sadrži podatke o vozačima i njihovim rezultatima. Svaki red datoteke sadrži ime vozača (niska bez razmaka maksimalne dužine 31), tim (niska bez razmaka maksimalne dužine 31), broj osvojenih bodova u prethodnoj sezoni (ceo broj), najbolji kvalifikacioni krug u milisekundama (ceo broj) i status vozača (ceo broj koji kodira: OK(0), SUSPENDOVAN(1) i POVREDJEN(2)), odvojene razmakom.
Izlaz
Na standardni izlaz, za svaki tim, ispisati ime tima i imana dva izabrana vozača, odvojena razmakom. Timovi treba da budu ispisani redom kako su navedeni u opisu zadatka. Pretpostaviti da će u svakom timu biti bar dva vozača koja zadovoljavaju kriterijume.
U slučaju greške (neispravan broj argumenata komandne linije, nepostojanje datoteke sa vozačima ili nemogućnost čitanja iz nje), na standardni izlaz za greške ispisati -1 i završiti program sa statusom neuspeha (1).
Primer
command line
./f1_selektor vozaci.txt
vozaci.txt
Lewis_Hamilton Mercedes 250 80800 0
ance_Stroll Aston_Martin 35 82400 0
Alex_Albon Red_Bull_Racing 85 0 0
Pietro_Fittipaldi Haas_F1_Team 75 83650 0
Esteban_Ocon Alpine 165 82300 0
Oscar_Piastri McLaren 195 81600 0
Max_Verstappen Red_Bull_Racing 300 80500 0
Stoffel_Vandoorne Aston_Martin 55 0 0
Mick_Schumacher Mercedes 110 82000 0
Zhou_Guanyu Kick_Sauber 95 82900 0
Antonio_Giovinazzi Ferrari 35 0 0
Victor_Martins Alpine 45 84200 1
Yuki_Tsunoda Racing_Bulls 110 83200 0
Lando_Norris McLaren 210 81500 0
Franco_Colapinto Williams 95 83600 0
Callum_Ilott Haas_F1_Team 60 83800 2
Charles_Leclerc Ferrari 220 81000 0
Frederik_Vesti Kick_Sauber 65 0 0
Daniel_Ricciardo Racing_Bulls 140 83000 0
Theo_Pourchaire Alpine 60 0 0
Jack_Doohan McLaren 90 82800 2
Logan_Sargeant Williams 65 83800 0
Kevin_Magnussen Haas_F1_Team 120 83500 0
Daniel_Kvyat Red_Bull_Racing 100 81400 0
Fernando_Alonso Aston_Martin 200 82000 0
Carlos_Sainz Ferrari 210 81200 0
Alex_Palou McLaren 120 82000 0
Nyck_DeVries Mercedes 65 0 0
Theo_Nakamura Kick_Sauber 30 84000 1
Pierre_Gasly Alpine 150 82500 0
Ayumu_Iwasa Racing_Bulls 45 84200 2
Antonio_Fuoco Ferrari 50 83800 1
Jamie_Chadwick Williams 55 85000 2
Nico_Hulkenberg Haas_F1_Team 130 83300 0
George_Russell Mercedes 230 80900 0
Felipe_Drugovich Aston_Martin 70 82800 0
Robert_Schwartzman Kick_Sauber 75 83100 0
Nikita_Mazepin Aston_Martin 20 83500 2
Valtteri_Bottas Kick_Sauber 180 82600 0
Oliver_Bearman Ferrari 85 82000 0
Esteban_Gutierrez Mercedes 40 84500 1
Liam_Lawson Racing_Bulls 90 83500 0
Juri_Vips Red_Bull_Racing 50 84500 1
Patricio_Oward McLaren 85 0 0
Isack_Hadjar Racing_Bulls 55 0 0
Nicholas_Latifi Williams 80 84200 0
Ryo_Hirakawa Haas_F1_Team 25 0 0
Jack_Aitken Alpine 90 84000 0
Sergio_Perez Red_Bull_Racing 190 80600 0
Roy_Nissany Williams 35 0 0
stdout
Alpine Esteban_Ocon Pierre_Gasly
Aston_Martin Fernando_Alonso Felipe_Drugovich
Ferrari Charles_Leclerc Carlos_Sainz
Haas_F1_Team Nico_Hulkenberg Kevin_Magnussen
Kick_Sauber Valtteri_Bottas Zhou_Guanyu
McLaren Lando_Norris Oscar_Piastri
Mercedes Lewis_Hamilton George_Russell
Racing_Bulls Daniel_Ricciardo Yuki_Tsunoda
Red_Bull_Racing Max_Verstappen Sergio_Perez
Williams Franco_Colapinto Logan_Sargeant
Primer
command line
./f1_selektor vozaci2.txt
stderr
-1
Primer
command line
./f1_selektor
stderr
-1
F1 prenos
Miki sluša radio prenos trke Formule 1. On na početku trke poseduje startnu listu vozača označenih svojim startnim brojevima. Kako bi mogao da isprati poredak trke, potreban mu je program koji će podržati sledeće funkcionalnosti:
-
(2 poena)
int ulazak_u_pitstop(cvor *sentinel, int startni_broj)- funkcija iz liste izbacuje vozača sa zadatim startnim brojem (on ulazi u pitstop). Funkcija vraća1u slučaju da ne postoji traženi vozač, a0inače. -
(2 poena)
int izlazak_iz_pitstopa(cvor *sentinel, int startni_broj, int i)- funkcija umeće vozača sa zadatim startnim brojem na pozicijuiu listi (on izlazi iz pitstopa). Funkcija vraća1ukolikoinije validna pozicija ili vozač sa datim startnim brojem već postoji u listi, a0inače. -
(2 poena)
int promena_poretka(cvor *sentinel, int i, int j)- funkcija premešta vozača sa pozicijeiu listi na pozicijuj. Poredak ostalih vozača ostaje nepromenjen. Ukoliko neka od pozicija nije validna, funkcija vraća1, a inače0. -
(2 poena)
int duel(cvor *sentinel, int a, int b)- funkcija proverava da li su vozači sa startnim brojevimaaibjedan do drugog u tekućem poretku i ako jesu, menja im mesta. Funkcija vraća1ukoliko vozači sa startnim brojevimaaibnisu bili jedan do drugog ili ukoliko neki od startnih brojevaaibnije validan, a0inače. -
(2 poena) Glavni program koji simulira radio prenos. Najpre se učitava startna lista vozača, a zatim i
$n$ upita u sledećem formatu: -
up s- vozač sa startnim brojemsulazi u pitstop. -
ip s i- vozač sa startnim brojemsnapušta pitstop i ulazi u trku na pozicijii. -
pp i j- vozač sa pozicijeiu trci prelazi na pozicijuju trci. -
du s1 s2- dešava se duel između susednih vozača sa startnim brojevimas1is2, nakon čega im se menjaju mesta u poretku.
Nakon izvršenja svih upita, ispisati poredak takmičara. Podrazumevati da se pozicije broje od
Napomena: zadatak se mora uraditi korišćenjem listi, inače nosi
Ulaz
Sa standardnog ulaza se najpre učitava lista pozitivnih celih brojeva (startna lista vozača). Nakon toga, učitava se broj upita
Izlaz
Na standardni izlaz ispisati poredak vozača nakon izvršenih svih -1 i prekinuti program sa izlaznim kodom neuspeha (1).
Primer
stdin
[1, 2, 3, 4, 5]
6
up 2
ip 2 4
pp 2 5
pp 4 2
du 5 4
du 2 5
stdout
[1, 4, 2, 5, 3]
Objašnjenje
Stanje liste nakon svakog upita:
up 2: [1, 3, 4, 5]ip 2 4: [1, 3, 4, 2, 5]pp 2 5: [1, 4, 2, 5, 3]pp 4 2: [1, 5, 4, 2, 3]du 5 4: [1, 4, 5, 2, 3]du 2 5: [1, 4, 2, 5, 3]
Primer
stdin
[1, 2, 3, 4, 5]
6
up 2
ip 2 4
pp 2 6
pp 4 2
du 1 2
du 5 2
stderr
-1
Objašnjenje
Stanje liste nakon svakog upita:
up 2: [1, 3, 4, 5]ip 2 4: [1, 3, 4, 2, 5]pp 2 6: Greška!
Primer
stdin
[1, 2, 3, 4, 5]
7
up 2
ip 2 4
pp 2 5
pp 4 2
du 1 3
du 5 2
stderr
-1
Objašnjenje
Stanje liste nakon svakog upita:
up 2: [1, 3, 4, 5]ip 2 4: [1, 3, 4, 2, 5]pp 2 5: [1, 4, 2, 5, 3]pp 4 2: [1, 5, 4, 2, 3]du 1 3: Greška!