4 FUNKCJE I STRUKTURA PROGRAMU
4 FUNKCJE I STRUKTURA PROGRAMU
Na początku opracujemy i napiszemy program wypisujący każdy wiersz wejściowy, w którym występuje określony „wzorzec”, czyli pewien ciąg znaków. (Jest to szczególny przypadek usługowego programu grep z systemu Unix.) Na przykład wyszukanie wzorca liter „nie” w zbiorze wierszy:
W co się bawić - w co się bawić? gdy komis każdy sprzeda ci niewidkę czapkę i nawet ślepa babka grać przestanie w klasy, a klasy dawno już nie grają w ślepą babkę.’
spowoduje wypisanie następujących wierszy:
gdy komis każdy sprzeda ci niewidkę czapkę i nawet ślepa babka grać przestanie w klasy, a klasy dawno już nie grają w ślepą babkę.
Zasadniczą strukturę zadania da się podzielić zręcznie na trzy części:
while (istnieje następny wiersz) if (wiersz zawiera wzorzec) wypisz ten wiersz
Można oczywiście wszystkie te części umieścić w main, lepiej jest jednak skorzystać z naturalnej struktury zadania i z każdej z nich utworzyć osobną funkcję. Trzema małymi kawałkami łatwiej się posługiwać niż jednym dużym: w funkcjach można ukryć nieistotne szczegóły; także prawdopodobieństwo niezamierzonych wzajemnych oddziaływań jest minimalne. Poza tym utworzone funkcje mogą być przydatne do innych celów.
„Dopóki (while) istnieje następny wiersz” to po prostu getline - funkcja, którą napisaliśmy w rozdz. 1. „Wypisz ten wiersz” to funkcja printf, którą ktoś kiedyś dla nas przygotował. Musimy więc napisać jedynie tę funkcję, która zadecyduje, czy wier$: zawiera wzorzec. 1
4.1 WPROWADZENIE
Aby rozwiązać ten problem, napiszemy funkcję strindex(s,t) zwrftagącsr pozyćjf (numer) znaku tekstu zawartego w s, od której rozpoczyna się ciąg znaków t. Ze względu na to, że początkową pozycją w tablicach języka C jest zero, poprawny numer może być równy zero albo dodatni, a zatem wartość ujemna, np. -1, jest wygodnym sygnałem sytuacji awaryjnej. Kiedy w przyszłości będziemy potrzebować bardziej wyrafinowanej metody dopasowywania wzorca, będziemy musieli wymienić jedynie funkcję strindex; reszta programu pozostanie ta sama. (W bibliotece standardowej występuje funkcja strstr, która jest podobna do naszej strindex z tym, że zamiast numeru zwraca wskaźnik.)
Mając do dyspozycji tak opisany projekt, wypełnienie programu szczegółami jest już proste. Podajemy go w całości, możesz więc zobaczyć, jak jego części ze sobą współpracują. Na razie wyszukiwany wzorzec jest dosłownym napisem, co nie jest zbyt ogólnym mechanizmem. Wrócimy wkrótce do dyskusji o inicjowaniu tablic znakowych, a w rozdz. 5 pokażemy, co należy zrobić, aby wzorzec stał się parametrem, to znaczy aby mógł być ustalany przy uruchamianiu programu. Prezentujemy tu także nieznacznie zmienioną wersję funkcji getline; porównanie jej z pierwszą wersją (z rozdz. 1) może być pouczające.
#include <stdio.h>
#define MAXLINE 1000 /1 maksymalna długość wiersza 1/
int getline(char line[], int max);
int strindex(char sourcef], char searchfor[]);
char patternf ] = "nie”; /1 szukany wzorzec 1/
/1 wypisz wszystkie wiersze zawierające wzorzec 1/
main()
char line[MAXLINEJ;
int found = 0;
while (getline(line, MAXLINE) > 0) if (strindex(line, pattern) >= 0) {
printf(”%s”, linę); found-H-;
return found; /1 podaj liczbę znalezionych wierszy 1/
Mi sio!
powered by
101
Jest to fragment piosenki Wojciecha Młynarskiego. - Przyp. tłum.