Powtórka z C
Najważniejsze sprawy
- typy
- operatory
- wskaźniki, wskaźniki do funkcji
- dynamiczny przydział pamięci
- struktury
- pliki nagłówkowe i źródłowe
- różnice między C a C++
Przykładowe zadania
Wektor
Zaimplementuj bibliotekę operacji na wektorach wielowymiarowych.
Utwórz plik nagłówkowy wektor.h z poniższą zawartością:
struct wektor { int rozmiar; double *wartosc; }; struct wektor *alokuj(struct wektor * w, int n); void zwolnij(struct wektor *w); struct wektor *kopiuj(struct wektor *w1, struct wektor *w2); double dlugosc(struct wektor *w); double iloczyn_sklarny(struct wektor *w1, struct wektor *w2); struct wektor *unormuj(struct wektor *w1);
Zdefiniuj odpowiednie funkcje w pliku źródłowym wektor.c
i napisz przykładowy program testujący ich działanie.
Słownik
Napisz program generujący słownik wyrazów zawartych w dowolnym pliku tekstowym. Dla podanego pliku (lub po wczytaniu tekstu ze strumienia wejściowego) program wyświetla posortowaną alfabetycznie listę występujących w tekście wyrazów oraz liczbę wytapiań danego wyrazu w tekście.
Przykładowe wyjście programu:
ala 5 kota 2 ma 1
Duże i małe znaki są nierozróżnialne - słownik wypisuje wyłącznie słowa pisane małymi literami
Zakładamy, że: pojedyncze słowo to dowolny ciąg znaków alfabetycznych (wyłącznie litery [a-zA-Z]
). Wszystkie pozostałe znaki są separatorami wyrazów.
Dla ułatwienia można zaimplementować funkcję getword, która pobiera kolejne słowo ze strumienia (wejściowego, z pliku). Funkcja wczytuje do tablicy pierwsze napotkane w strumieniu słowo (po pominięciu wszystkich początkowych znaków które nie są literami) i zwraca wartość sygnalizującą czy słowo zostało wczytane (np. może zwracać długość słowa gdzie wartość 0 zwracana jest w przypadku dotarcia do końca strumienia w którym nie wystąpiło już żadne słowo).
Słownik generowany jest w oparciu o drzewo binarne.
Utwórz projekt w środowisku VisualStudio, dodaj do niego plik nagłówkowy slownik.h zawierający deklarację funkcji obsługi drzewa oraz plik źródłowy słownik.c z definicjami tych funkcji.
Przykładowa zawartość pliku slownik.h:
struct tree { char *word; int count; struct tree *left, *right; }; struct tree* add(struct tree *d,char *word); void print(struct tree *d);
Funkcja add(struct tree *d,char *word) dodaje nowe słowo do słownika (drzewa). Wartością zwracaną jest wskaźnik do bieżącego węzła w drzewie. Słowo umieszczane jest w drzewie zależnie od kolejności słownikowej (alfabetycznej).
Funkcja print(struct tree *d) wypisuje zawartość słownika, czyli posortowaną listę słów wraz z liczbą wystąpień danego słowa w pliku.
- Dopisz definicje funkcji add i print w pliku źródłowym slownik.c
- Program niech pobiera plik wejściowy jako argument wywołania aplikacji, jeżeli argumentu brakuje wówczas czytany jest tekst ze standardowego wejścia
slownik.exe plik_tekstowy
Jakiej ważnej funkcji brakuje w pliku slownik.h ?
Zaimplementuj ją.
Przydatne funkcje:
Różnice miedzy C i C++
- Zamień rozszerzenia nazw plików *.c → *.cpp
- Zamień wywołania funkcji
malloc()
ifree()
na wywołania operatorównew
idelete
- Spróbuj użyć strumieni
<iostream>
do wczytywania i wyświetlania słów z terminala lub pliku (cout
,cin
) - Spróbuj wykorzystać obiekty typu
<string>
zamiast tablicchar*
do zapamiętywania słów w węzłach drzewa - Jeżeli wykorzystujesz nadal którąkolwiek funkcję z biblioteki standardowej C zastąp ją odpowiednikiem ze standardowej biblioteki C++
- Struktura w C++ jest klasą, usuń zbędne słowo kluczowe
struct
przy deklaracjach zmiennych typudrzewo
lub uczyń węzeł drzewa klasą. - Użyj referencji zamiast wskaźników tam gdzie uznasz to za stosowane
- Utwórz klasę „slownik”, korzeń drzewa uczyń polem prywatnym zaś funkcje
dodaj()
iwyswietl()
przepisz jako metody publiczne tej klasy (Zobacz zadanie Słownik obiektowo)