Zadanie 1 z L4

advertisement
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”
Download