Słownik w liście

Wymagania wstępne

Zadanie do wykonania

Celem zadania jest napisanie programu, który, na podstawie tekstu odczytanego z pliku o nazwie podanej w linii poleceń, zbuduje listę zawierającą występujące w tym tekście słowa oraz liczbę ich wystąpień. Następnie w trybie interakcji z użytkownikiem program ma umożliwić sprawdzenie czy dane słowo występuje w tekście, a jeśli tak, wypisać je wraz z liczbą jego wystąpień.

Dane o słowach powinny być przechowywane w dynamicznie tworzonej liście. Jako słowa należy rozumieć ciągi liter, pozostałe znaki powinny być pomijane.

Program powinien podawać następujące informacje: po wczytaniu tekstu wyświetlić ogólną liczbę wszystkich słów w tekście oraz liczbę słów unikalnych (różnych), następnie po zapytaniu użytkownika o dane słowo wyświetlić informację czy takie słowo występuje, jeśli tak, to ile razy. Oprócz tego, obojętnie czy słowo zostanie znalezione, czy nie, liczbę porównań wykonanych przy przeszukiwaniu. Drugą opcją programu powinna być możliwość wypisania wszystkich słów w kolejności alfabetycznej.

Nazwę pliku z tekstem program będzie otrzymywał jako parametr wywołania, po opcji -d, tzn.
./slownik1 -d tekst

Zadanie dodatkowe

W zadaniu dodatkowym należy przyjąć, że program może być wywoływany z dodatkowym argumentem, będącym nazwą pliku z listą słów do sprawdzenia. Jeśli tak się stanie, to program zamiast wchodzić w tryb interaktywny, powinien wypisać listę wyników w postaci
slowo: wystepuje XXX razy, wykonano YYY porownan
slowo: nie wystepuje, wykonano YYY porownan

Podobnie jak w zadaniu z przetwarzaniem obrazów należy przyjąć, że nazwa - oznacza standardowe wejście.

Dodatkowe informacje

Teksty do testowania programu można znaleźć na diablo w katalogu ~mucha/edu/info2/ksiazki/

Aby program działał dla dowolnego języka wybranego przez użytkownika, można wykorzystać funkcje isalpha oraz strcmp. Funkcja isalpha sprawdza kod podanego znaku i zwraca 0, gdy znak nie jest literą, a wartość niezerową, gdy jest to litera. Z kolei funkcja strcmp porównuje dwa ciągi znaków (zakonczone znakiem chr(0)) i zwraca wartość 0, gdy są takie same, liczbę mniejszą od 0, gdy pierwszy ciąg jest alfabetycznie przed drugim, a większą od 0 w przeciwnym przypadku. Przykladowy program wykorzystujący obie funkcje znajduje się poniżej:
program isalphatest(input,output);

function isalpha(znak : integer):integer; external c;
function strcmp(s1,s2 :string ):integer; external c;

var
  s1,s2 : string;
begin
   writeln(isalpha(ord('a')));
   writeln(isalpha(ord('1')));

   s1:='aar'; s1[4]:=chr(0);
   s2:='aax'; s2[4]:=chr(0);
   writeln(strcmp(s1,s2));
end.