Praca z strukturami Zadanie 1 Dany jest plik binarny zawierający rekordy w następującym formacie struct osoba { char im[20], nazw[ 20 ]; struct przedmiot oc[10 ]; int n; }; gdzie pole n struktury osoba zawiera liczbę przedmiotów wpisanych do tablicy oc: struct przedmiot { char nazwa[ 20 ]; float ocena; }; Napisać program przetwarzający taki plik binarny na plik tekstowy w następującym formacie IMIE NAZWISKO NAZWA_PRZEDMIOTU_1 OCENA_1 NAZWA_PRZEDMIOTU_2 OCENA_2 ... NAZWA_PRZEDMIOTU_N OCENA_N # IMIE NAZWISKO NAZWA_PRZEDMIOTU_1 OCENA_1 NAZWA_PRZDMIOTU_2 OCENA_2 ... NAZWA_PRZEDMIOTU_N OCENA_N # itd. W pliku wynikowym nazwiska mają być uporządkowane alfabetycznie. Znak # kończy informację o studencie. W pliku wejściowym nazwiska się nie powtarzają. Nazwę pliku wejściowego należy wczytać z klawiatury. Nazwa pliku wyjściowego – wyniki.dat. Zadanie 2 Narysuj strukturę dynamiczną elementów tworzoną przez poniższy program. Rysunek każdego z elementów struktury dynamicznej powinien zawierać wartość pola dane, a pole nast powinno być połączone strzałką ze wskazywanym elementem. struct elem { char dane; struct elem *next; } *p, *q; main() { int i = 0; p = ( struct elem * )malloc( sizeof( struct elem ) ); p->next = p; p->dane = i; for( i = 0; i <= 6; i += 2 ) { q = ( struct elem * )malloc( sizeof( struct elem ) ); q->dane = i; q->next = p->next; p->next = q; p = q; } } Zadanie 3 DRZEWO Zapisać treść programu pobierającego od użytkownika liczby całkowite (aż do pobrania liczby o wartości zero) i umieszczającego je w strukturze drzewa binarnego zgodnie z zasadą: jeśli wartość pobranego elementu jest mniejsza lub równa wartości aktualnego węzła struktury, to wędruje on w drzewie na lewo, a w przeciwnym wypadku na prawo (patrz przykład). Element drzewa zbudowany jest z pola przechowującego pobraną liczbę oraz dwóch wskaźników (na lewy i na prawy element podrzędny). Przykład: Użytkownik podaje kolejno liczby: 14, 30, 20, 5, 8, 45, 2, 7, 6, 0 Powstaje drzewo: posortowany ciąg: 2, 5, 6, 7, 8, 14, 20, 30, 45 gałęzie: 14, 5, 2 14, 5, 8, 7, 6 14, 30, 20 14, 30, 45 poziom 0: 14 poziom 1: 5, 30 poziom 2: 2, 8, 20, 45 poziom 3: 7 poziom 4: 6 14 5 30 2 8 20 45 7 6 Należy więc zapisać: odpowiednie definicje i deklaracje tak aby program był kompilowalny; funkcję wpisującą podaną przez użytkownika liczbę do struktury; funkcję wypisującą (do podanego jako argument pliku) posortowany podczas wpisywania do drzewa, ciąg liczb; funkcję wypisującą na ekranie wszystkie gałęzie drzewa (korzenia do liścia); funkcję wypisującą na ekranie wszystkie węzły drzewa znajdujące się na podanym (jako argument wywołania funkcji) poziomie; funkcję zwalniającą zajmowaną przez drzewo pamięć (element po elemencie) funkcję main, zawierającą odpowiednie wywołania zaprojektowanych funkcji. Zadanie 4 Niech będzie dana dwukierunkowa lista liczb całkowitych. Napisać funkcję, która na wejściu otrzymuje wskaźnik wsk na element tej listy, a której zadaniem jest przesuniecie tego elementu o dwa elementy do prawej strony od wsk (o ile to jest możliwe). Można założyć, że element wskazywany przez wsk istnieje. Zdefiniować odpowiednie typy. WSKAZÓWKA ! Pamiętać o ewentualnej aktualizacji wskaźnika na pierwszy element. wsk head a b wsk c d e head a c d b e Zadanie 5 Narysuj strukturę dynamiczną elementów tworzoną przez poniższy program. Rysunek każdego z elementów struktury dynamicznej powinien zawierać wartość pola dane, a pole nast powinno być połączone strzałką ze wskazywanym elementem. struct elem { int dane; struct elem *next; } *p, *q; main(int argc, char **argv) { int i ; i = argc > 1 ? argv[1] : 0; p = ( struct elem * )malloc( sizeof( struct elem ) ); p->next = p; p->dane = i; for( i = 0; i <= 12; i += 4 ) { q = ( struct elem * )malloc( sizeof( struct elem ) ); q->dane = i; q->next = p->next; p->next = q; p = q; } } Zadanie 6 Niech będzie dany stos do przechowywania liczb całkowitych. Napisać funkcję, która na wejściu otrzymuje int k – numer elementu tego stosu, a której zadaniem jest usuniecie jego poprzednika i następnika (o ile istnieją). Można założyć, że element wskazywany przez k istnieje. Zdefiniować odpowiednie typy. element nr k head Zadanie 7 Niech będzie dana kolejka przechowująca liczby całkowite. Napisać funkcję, która na wejściu otrzymuje numer k elementu tej kolejki, a której zadaniem jest usuniecie poprzednika i następnika (o ile istnieją) tego elementu. Można założyć, że element wskazywany przez k istnieje. Zdefiniować odpowiednie typy oraz funkcje pomocnicze służące do implementacji kolejki. element nr k element nr 1 Zadanie 8 Niech będzie dana dwukierunkowa lista liczb całkowitych. Napisać funkcję, która na wejściu otrzymuje wskaźnik wsk na element tej listy oraz liczby a i b, a której zadaniem jest wstawienie elementów przechowujących te liczb odpowiednio przed i za element wskazywany. Można założyć, że element wskazywany przez wsk istnieje. Zdefiniować odpowiednie typy. WSKAZÓWKA! Pamiętać o ewentualnej aktualizacji wskaźnika na pierwszy element (wskaźnik globalny). wsk wsk a b Zadanie 9 Niech będzie dana dwukierunkowa lista liczb całkowitych. Napisać funkcję, która na wejściu otrzymuje wskaźnik wsk na element tej listy, a której zadaniem jest usuniecie jego poprzednika i następnika (o ile istnieją). Można założyć, że element wskazywany przez wsk istnieje. Zdefiniować odpowiednie typy. WSKAZÓWKA ! Pamiętać o ewentualnej aktualizacji wskaźnika na pierwszy element. k ostatni pierwszy Zadanie 10 Napisać program czytający słowa z pliku tekstowego podanego jako pierwszy argument z linii wywołania programu i wyszukujący w nim wszystkie słowa, które zaczynają się na literę podaną jako drugi argument w linii wywołania programu. Program nie musi być optymalny pod względem czasowym i pamięciowym, ale liczba słów nie powinna być ograniczona. Można założyć, że każda alokacja pamięci zakończy się sukcesem. Zadanie 11 Napisać program czytający słowa ze standardowego wejścia i wyszukujący słowo najczęściej występujące. Jeśli liczba wystąpień różnych słów jest równa, wynikiem może być dowolne z tych słów. Program nie musi być optymalny pod względem czasowym i pamięciowym, ale liczba różnych słów nie powinna być ograniczona. Można założyć, że każda alokacja pamięci zakończy sę sukcesem. Wskazówka: można skorzystać z funkcji realloc(). Zadanie 12 Dany jest plik 'daty.bin' zawierający nieokreśloną liczbę dat w formacie dzień (1 bajt), miesiąc (1 bajt), rok (2 bajty). Liczba różnych dat nie powinna być ograniczona. Można założyć, że każda alokacja pamięci zakończy się sukcesem. Napisać program, który wczyta te daty, posortuje je rosnąco i wypisze do pliku tekstowego 'daty.txt'. Można skorzystać z dowolnego algorytmu sortowania. Daty błędne należy ignorować. Można założyć, że jeśli rok jest podzielny przez 4, to jest to rok przestępny (nawet podzielne przez 100). WSKAZÓWKA! Warto skorzystać z dodatkowej funkcji porównującej dwie daty. Zadanie 13 Dane są następujące typy struct Grupa { int nr; struct Grupa *ng; //następna grupa na roku struct Dane *ls; // lista sudentów }; struct Dane { char imie[20]; // imię char nazw[20]; // nazwisko float srednia; // srednia ocen struct Dane *nast; // nastepny student w grupie }; Za pomocą tych typów można zbudować strukturę danych przechowującą skład grup dziekańskich na danym roku. rok lista Napisać funkcję void Zwolnienia(struct Grupa * rok, struct Dane *lista, float s); która ze struktury wskazanej przez parametr rok, przeniesie do listy wskazanej przez lista wszystkich studentów ze średnią ocen >= s. Lista lista jest wstępnie uporządkowana rosnąco według nazwisk, przy wstawianiu należy taki porządek zachować. Zadanie 14 Niech będzie dana posortowana dwukierunkowa lista liczb całkowitych. Napisać funkcję, która na wejściu otrzymuje wskaźnik pocz na początkowy element tej listy oraz liczby a i b, a której zadaniem jest wstawienie elementów zawierających te liczby w odpowiednie miejsce na liście. Można założyć, że element wskazywany przez pocz istnieje. Zdefiniować odpowiednie typy. WSKAZÓWKA! Pamiętać o ewentualnej aktualizacji wskaźnika na pierwszy element (wskaźnik globalny). Zadanie 15 Dany jest plik 'punkty.bin' zawierający n dwuwymiarowych punktów o całkowitych współrzędnych (int). W pierwszym elemencie pliku znajduje się liczba punktów n (int). Napisać program, który wczyta te punkty, posortuje je rosnąco wg odległości od początku układu współrzędnych i wypisze do pliku tekstowego 'punkty.txt'. Można skorzystać z dowolnego algorytmu sortowania. Zadanie 16 Dany jest plik tekstowy składający się z M wierszy z N kolumn (w sumie w pliku jest M*N znaków). Plik zawiera tylko duże i małe litery alfabetu angielskiego. Napisać program szukaj, który jest wywoływany z czterema parametrami: nazwa pliku liczba wierszy w pliku liczba kolumn w pliku wyraz składający się z dużych i małych liter języka angielskiego Zadaniem programu jest wyszukanie w pliku (o nazwie przekazanej w pierwszym parametrze) wszystkich wystąpień wyrazu przekazanego w czwartym parametrze. Wyraz może wystąpić w wierszu (od strony lewej do prawej) lub w kolumnie (od góry do dołu). Przy wyszukiwaniu wyrazu zignorować wielkość liter. Dla każdego wystąpienia w wierszu należy wypisać na standartowym wyjściu komunikat: Wyraz <wyraz> znajduje się w wierszu nr <wiersz> dla każdego wystąpienia w kolumnie komunikat: Wyraz <wyraz> znajduje się w kolumnie nr <kolumna> Jeżeli wyraz nie występuje w pliku to wypisać: Brak wyrazu <wyraz> w pliku gdzie: <wyraz> - wyraz przekazany jako czwarty parametr wywołania programu <wiersz> - numer wiersza <kolumna> - numer kolumny Uwagi: program zostanie wywołany z czterema argumentami argumenty mają poprawny format wyraz mieści się w wierszu i w kolumnie (długość wyrazu <= M i długość wyrazu <= N) plik ma poprawny format tzn. zawiera tylko duże i małe litery języka angielskiego i jest podzielony na M wierszy i N kolumn zawartość pliku mieści się w pamięci operacyjnej Zadanie 17 Zapisz rekurencyjną funkcję, która wypisze na ekranie wartości kluczy wszystkich elementów struktury drzewa binarnego przedstawionego na rysunku. Element struktury zdefiniowany jest następująco: struct elem { int key; struct elem *left; struct elem *right; } Zadanie 18 Napisać program, który czyta słowa z pliku wejściowego, tworzy listę ze słów zaczynających się z pewnej litery i drukuje tą listę. Nazwa pliku wejściowego oraz litera mają być zadane jako argumenty programu. Zadanie 19 Kucharz na przyjęciu ma do przygotowania pewną nieznaną co do ilości, liczbę potraw (zadanych przez nazwę i listę potraw). Każda potrawa składa się z bliżej nieokreślonej ilości półproduktów (zadanych przez nazwę, ilość i jednostkę). Niektóre półprodukty mogą się powtarzać w różnych potrawach. Napisać program, generujący listę półproduktów i ich ilości potrzebnych do przygotowania wszystkich potraw. Program powinien zawierać kompletne deklaracje i być gotowy do skompilowania. Założyć, że dostępna jest procedura wypełniająca struktury odpowiednimi danymi. Przykład: załóżmy, że struktury danych opisują następujące potrawy: Tort - mąka 1 kg; masło 0.5 kg; cukier 0.20 kg; świeczki 5 sztuk Żurek - mąka 0.30 kg; kiełbasa 0.40 kg; masło 0.10 kg Wynik działania programu to: Mąka – 1.30 kg Masło – 0.60 kg Cukier – 0.20 kg Świeczki – 5.00 sztuk Kiełbasa – 0.40 kg potrawy: nazwa: ”Tort” skład: nazwa: ”mąka” ilość: 1.0 nast: jednostka: ”kg” nast: ”Żurek” ”masło” 0.5 ”kg” ”cukier” ”świeczki” 0.2 5.0 ”kg” ”sztuk” ”mąka” 0.3 ”kiełbasa” 0.4 ”masło” 0.1 ”kg” ”kg” ”kg”