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