ZADANIA Z PODSTAW PROGRAMOWANIA ZALICZENIE

Transkrypt

ZADANIA Z PODSTAW PROGRAMOWANIA ZALICZENIE
ZADANIA Z PODSTAW PROGRAMOWANIA
ZALICZENIE WARUNKOWE, SEMESTR ZIMOWY 16/17
Warunkiem podejścia do kolokwium poprawkowego w styczniu 2017 r. (termin zostanie podany
później) jest samodzielne rozwiązanie zadania 1, 2 i zaprezentowanie ich na konsultacjach,
najpóźniej do 15 grudnia 2016 r. Co najmniej 24 h przed prezentacją należy przesłać zadania na emaila. Zastrzegam sobie prawo do rozmowy na temat rozwiązań w celu zweryfikowania
samodzielności rozwiązanych zadań. Rozwiązanie zadań nie gwarantuje zaliczenia – należy potem
zdać kolokwium poprawkowe, o którym wspomniano na początku. Tylko rozwiązanie zadań 1 i 2
dopuszcza do kolokwium.
Samodzielne rozwiązania zadań: 1, 2 i 3 (ze wszystkimi podpunktami, zweryfikowane podczas
rozmowy z prowadzącym) skutkuje zaliczeniem ćwiczeń laboratoryjnych bez potrzeby pisania
kolokwium poprawkowego, po wcześniejszej prezentacji na konsultacjach i rozmowie na temat
rozwiązań. Co najmniej 24 h przed prezentacją należy przesłać zadania na e-maila.
Jakiekolwiek braki w rozumieniu własnych kodów źródłowych mogą skutkować
natychmiastowym niezaliczeniem przedmiotu. Tyczy się to zwłaszcza przedstawienia
rozwiązania punktu 3.
Prowadzący zastrzega sobie prawo do korekty treści zadań (data aktualizacji znajduje się na
końcu pliku).
Egzamin dla osób, które zaliczą ćwiczenia laboratoryjne – prawdopodobnie 13 stycznia, zostanie to
doprecyzowane później.
1. Zaprojektować i zaimplementować funkcję el_powyzej_sredniej, która przyjmuje trzy
argumenty:
• wskaźnik na tablicę liczb rzeczywistych zr;
• liczbę całkowitą nieujemną n;
• wskaźnik na wskaźnik na tablicę liczb rzeczywistych doc. Zmiana wskaźnika,
wskazującego na utworzoną dynamicznie wewnątrz funkcji tablicę doc musi być widoczna
po wywołaniu tej funkcji (dlatego użyto wskaźnika na wskaźnik zamiast referencji – nie
wolno zmieniać typu tego argumentu).
• wskaźnik na liczbę całkowitą nieujemną roz.
Funkcja nic nie zwraca.
Zadaniem funkcji jest utworzyć tablicę doc, w której zostaną zawarte te elementy z tablicy zr,
których wartość jest większa do średniej arytmetycznej wartości z tablicy doc. Wskaźnik roz ma
wskazywać na rozmiar tablicy doc. Porządek elementów w tablicy doc nie musi być taki sam, jak
w tablicy zr.
Przykładowo, jeżeli tablica zr ma następujące elementy: {1,3,4,5,7}, to utworzona wewnątrz
funkcji tablica doc będzie zawierać elementy: {5,7}. Średnia elementów tablicy zr jest równa 4,
więc w tablicy doc znajdą się tylko wartości 5 i 7.
2. Zaprojektować i zaimplementować funkcję podziel_napis, która przyjmuje trzy argumenty:
• napis jako wskaźnik na tablicę znakową (char*) zrodlowy;
• znak typu char (lub int, long itp.) znak;
• referencję na podwójny wskaźnik na zmienną typu char (logicznie będzie to tablica
napisów typu char*) napisy
i zwraca wartość całkowitą nieujemną.
Funkcja ma podzielić napis zrodlowy na spójne podciągi znaków, gdzie separatorem jest znak
znak. Wynik ma być zachowany w dynamicznej tablicy napisów napisy (która musi zostać
utworzona wewnątrz funkcji). Wynikowe napisy muszą być typu char* - stąd potrzeba obsługi
podwójnego wskaźnika na char.
Przykładowo, jeżeli zrodlowy = "Ala ma kota", znak = ' ' (spacja), to po wywołaniu
funkcji tablica napisy przechowuje następujące ciągi znaków:
napisy[0] = "Ala"
napisy[1] = "ma"
napisy[2] = "kota"
a funkcja zwraca wartość 3 (bo źródłowy napis został podzielony na 3 podciągi znaków).
Jeżeli zrodlowy nie zawiera danego znaku, to tablica napisy powinna pozostać pusta, a funkcja
zwraca wartość 0. Jeżeli znak znajduje się na początku/końcu napisu
źródłowego (zrodlowy = "Ala " ), to zachowanie funkcji jest dowolne (można pominąć,
można podzielić na podciągi, w których jeden będzie pusty itp.).
Dozwolone jest korzystanie z typu string podczas operacji na ciągach znaków, ale funkcja musi
zwracać wskaźnik na wskaźnik na ciągi znaków (typ char**).
3.
a) Zaimplementować dwie struktury:
struct SOdjazd {
char godzina;
char minuta;
bool czy_roboczy;
bool czy_soboty;
bool czy_swieta;
char oznaczenie;
};
struct SRozklad {
unsigned ile_odjazdow;
SOdjazd* odjazdy;
unsigned ile_oznaczen;
string** legenda;
};
legenda jest dwuwymiarową tablicą napisów (z dwiema kolumnami).
b) W pliku wejściowym mamy następujące dane:
ile_odjazdow
GG:MM [F][6][7][A-E|G-Z]
GG:MM [F][6][7][A-E|G-Z]
... itd. ile_odjazdow razy
ile_oznaczen
[A-E|G-Z] [opis]
[A-E|G-Z] [opis]
[A-E|G-Z] [opis]
... itd. ile_oznaczen razy
Wyjaśnienie:
plik zawiera N razy podaną godzinę, po której musi znajdować się co najmniej jeden znak: F
oraz/lub 6 oraz/lub 7 oraz/lub dowolna liczba dużych liter prócz F. Znak F oznacza, że dany odjazd
odbywa się w dni robocze, 6 - w soboty, 7 - w niedziele i święta. Po oznaczeniu dni odjazdów może
znajdować się opcjonalny znak z zakresu od A do Z (prócz F), oznaczający jakiś wariant kursu
(przez jakąś miejscowość, pojazd niskopodłogowy, autobus jedzie tyłem itp.), podobnie jak jest to
oznaczane np. na tabliczkach odjazdowych w komunikacji obsługiwanej przez PKSy. Godzina jest
podawana w formacie GG:MM (jeżeli godzina lub minuta składa się z jednej cyfry, to musi być
poprzedzona zerem).
Następnie podawana jest liczba oznaczeń/wariantów (możliwa liczba dodatkowych literek po
oznaczeniu dni odjazdów) M. Każda z kolejnych linijek zawiera dwa napisy - pojedynczą literkę i
opis (dla ułatwienia - bez białych znaków), które tworzą legendę, czyli opis wariantów.
Przykładowo, plik wejściowy może wyglądać następująco:
12
07:00 F67A
08:00 F6
10:00 FA
17:00 FA
19:00 F67A
21:00 F
06:00 F67A
06:30 F6A
12:00 F
14:00 F67A
14:30 FA
15:00 F
1
A jedzie_przez_Abecadlowo
Należy zaimplementować wczytywanie takiego rozkładu do obiektu struktury SRozklad, z
jednoczesnym utworzeniem dynamicznej tablicy SOdjazd (każdy obiekt reprezentuje pojedynczy
odjazd) i posortowaniem odjazdów według godzin odjazdów (tak, aby na początku tablicy
znajdowały się najwcześniejsze godziny odjazdów). Aby ułatwić implementację i porównywanie
dni odjazdów (potrzebne w następnym podpunkcie), każdy obiekt typu SOdjazd zawiera trzy pola
logiczne - czy_roboczy, czy_soboty i czy_swieta, które należy odpowiednio uzupełniać
przy wczytywaniu. Pole oznaczenie oznacza pozostałą literkę, z ewentualnym wariantem kursu.
Pole legenda w obiekcie SRozklad jest dwuwymiarową tablicą, z dwiema kolumnami. W każdym
wierszu pierwsze pole to pojedyncza literka (w przykładzie: A), a drugie jest opisem (w
przykładzie: jedzie_przez_Abecadlowo).
Konstrukcja wczytywania jest dowolna, ale musi działać dla dowolnego strumienia wejściowego
(tj. pliku lub standardowego wejścia).
c) Należy zaimplementować funkcję, która dla danego obiektu SRozklad wyświetli godziny
odjazdów, podane w sposób tabelaryczny (jak np. jest to podawane w komunikacji miejskiej we
Wrocławiu, Krakowie czy na stronie Miejskiego Zarządu Dróg i Transportu w Częstochowie). Tj.
należy wypisać tabelę, która będzie zawierać: godziny (bez minut, od najwcześniejszej do
najpóźniejszej w danym SRozkladzie) i poszczególne odjazdy minutowe dla rozkładów w dni
robocze, soboty i święta, z ewentualną literką oznaczającą wariant.
Pod tabelą należy wypisać legendę, tj. możliwe literki (oznaczające warianty) i ich opis.
Przykładowo, dla rozkładu z punktu (b) należy wyświetlić/wygenerować następujący plik:
GODZ || ROBOCZE | SOBOTA
| NIED |
-----++----------|----------|------|
6
|| 00A 30A | 00A 30A | 00A |
7
|| 00A
| 00A
| 00A |
8
|| 00
| 00
|
|
9
||
|
|
|
10
|| 00A
|
|
|
11
||
|
|
|
12
|| 00
|
|
|
13
||
|
|
|
14
|| 00 30A | 00
| 00
|
15
|| 00
|
|
|
16
||
|
|
|
17
|| 00A
|
|
|
18
||
|
|
|
19
|| 00A
| 00A
| 00A |
20
||
|
|
|
21
|| 00
|
|
|
LEGENDA:
A jedzie_przez_Abecadlowo
Należy zapewnić czytelność rozkładu:
- proste kolumny (ich szerokość jest dowolna - nie musi być zależna od tego ile maksymalnie może
być odjazdów w danym typie, ale muszą się zmieścić wszystkie wyszczególnione odjazdy);
- odstępy pomiędzy minutami (ale nie jest wymagane by odjazdy były ułożone w kolumnach);
- minusy, kreski pionowe i plusy powinny tworzyć krawędzie tabeli;
- nagłówki tabeli (mogą być skracane, jeżeli w danym dniu odjazdów jest mało - tak jak powyżej na
przykładzie niedziel i świąt);
- można (ale nie trzeba) założyć, że istnieje co najmniej jeden odjazd w dniu roboczym, sobotnim i
świątecznym.
Konstrukcja wyświetlania jest dowolna, ale musi działać dla dowolnego strumienia wyjściowego
(tj. pliku lub standardowego wyjścia).
d) należy przetestować program, używając w funkcji main zaimplementowanych przez siebie
funkcji. Należy także zapewnić dealokację dynamicznie przydzielonej pamięci i podstawową
diagnostykę strumieni. Nie jest wymagane sprawdzanie poprawności wprowadzonych danych (czy
godziny podawane są w odpowiednim formacie itp.)
Aby zadanie zostało zaliczone, należy zrealizować wszystkie podpunkty. Dopuszczalna jest zmiana
formatu pliku wejściowego czy zmiana układu tabeli (np. na poziomy - jak na przystankach w
Częstochowie), ale wszystkie informacje muszą być zachowane. Obowiązuje dowolność w
konstrukcji programu poza wymogiem użycia struktur.
Można zmieniać pola danych struktur (np. użycie tablicy wartości logicznych zamiast pól
czy_roboczy itp.), ale dane obiekty powinny przechowywać te same informacje, co
przedstawione struktury. Dopuszczam użycie zewnętrznych modułów, bibliotek itp. pod warunkiem
podstawowej znajomości ich użytkowania. Dopuszczam również użycie elementów biblioteki STL i
programowania obiektowego, pod warunkiem podstawowej znajomości tych technologii.
pj
Aktualizacja: 13.10.2016

Podobne dokumenty