Wstęp. #define include include include include include include

Podobne dokumenty
METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

Podstawy programowania skrót z wykładów:

Ćwiczenie nr 6. Poprawne deklaracje takich zmiennych tekstowych mogą wyglądać tak:

Wykład X. Programowanie. dr inż. Janusz Słupik. Gliwice, Wydział Matematyki Stosowanej Politechniki Śląskiej. c Copyright 2016 Janusz Słupik

Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych.

WYKŁAD 10. Zmienne o złożonej budowie Statyczne i dynamiczne struktury danych: lista, kolejka, stos, drzewo. Programy: c5_1.c, c5_2, c5_3, c5_4, c5_5

Wstęp do Programowania, laboratorium 02

Tablice, funkcje - wprowadzenie

Laboratorium 6: Ciągi znaków. mgr inż. Leszek Ciopiński dr inż. Arkadiusz Chrobot dr inż. Grzegorz Łukawski

Wstęp do programowania INP003203L rok akademicki 2018/19 semestr zimowy. Laboratorium 2. Karol Tarnowski A-1 p.

Ćwiczenie 4. Obsługa plików. Laboratorium Podstaw Informatyki. Kierunek Elektrotechnika. Laboratorium Podstaw Informatyki Strona 1.

Dynamiczny przydział pamięci w języku C. Dynamiczne struktury danych. dr inż. Jarosław Forenc. Metoda 1 (wektor N M-elementowy)

ISO/ANSI C - funkcje. Funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje

Wskaźniki w C. Anna Gogolińska

Funkcja (podprogram) void

. Podstawy Programowania 2. Drzewa bst - część pierwsza. Arkadiusz Chrobot. 22 maja 2016

Obsługa plików. Laboratorium Podstaw Informatyki. Kierunek Elektrotechnika. Laboratorium Podstaw Informatyki Strona 1. Kraków 2013

ALGORYTMY I STRUKTURY DANYCH

Programowanie proceduralne INP001210WL rok akademicki 2015/16 semestr letni. Wykład 6. Karol Tarnowski A-1 p.

Co nie powinno być umieszczane w plikach nagłówkowych:

2 Przygotował: mgr inż. Maciej Lasota

Pliki w C/C++ Przykłady na podstawie materiałów dr T. Jeleniewskiego

Struktury czyli rekordy w C/C++

Operacje wejścia/wyjścia odsłona pierwsza

Elementarne wiadomości o języku C

Języki i metodyka programowania. Wprowadzenie do języka C

Wstęp do programowania INP003203L rok akademicki 2018/19 semestr zimowy. Laboratorium 3. Karol Tarnowski A-1 p.

Język C zajęcia nr 11. Funkcje

Język C : programowanie dla początkujących : przewodnik dla adeptów programowania / Greg Perry, Dean Miller. Gliwice, cop

lekcja 8a Gry komputerowe MasterMind

Podstawy informatyki. Informatyka stosowana - studia niestacjonarne. Grzegorz Smyk. Wydział Inżynierii Metali i Informatyki Przemysłowej

Podstawy programowania 2. Temat: Drzewa binarne. Przygotował: mgr inż. Tomasz Michno

Elementy języka C. ACprogramislikeafastdanceonanewlywaxeddancefloorbypeople carrying razors.

Pliki. Informacje ogólne. Obsługa plików w języku C

Algorytmy i złożoności. Wykład 3. Listy jednokierunkowe

Programowanie I C / C++ laboratorium 01 Organizacja zajęć

1. Pierwszy program. Kompilator ignoruje komentarze; zadaniem komentarza jest bowiem wyjaśnienie programu człowiekowi.

Wykład VII. Programowanie. dr inż. Janusz Słupik. Gliwice, Wydział Matematyki Stosowanej Politechniki Śląskiej. c Copyright 2014 Janusz Słupik

Wskaźniki. Przemysław Gawroński D-10, p marca Wykład 2. (Wykład 2) Wskaźniki 8 marca / 17

Zmienne, stałe i operatory

. Podstawy Programowania 2. Drzewa bst - część druga. Arkadiusz Chrobot. 12 maja 2019

Narzędzia internacjonalizacji programów

Podstawy programowania, Poniedziałek , 8-10 Projekt, część 1

Pliki. Informacje ogólne. Obsługa plików w języku C

Wyszukiwanie w BST Minimalny i maksymalny klucz. Wyszukiwanie w BST Minimalny klucz. Wyszukiwanie w BST - minimalny klucz Wersja rekurencyjna

1 Podstawy c++ w pigułce.

Podstawy programowania w języku C++

Laboratorium 6: Dynamiczny przydział pamięci. dr inż. Arkadiusz Chrobot dr inż. Grzegorz Łukawski

Informacje wstępne #include <nazwa> - derektywa procesora umożliwiająca włączenie do programu pliku o podanej nazwie. Typy danych: char, signed char

Programowanie komputerowe. Zajęcia 1

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość

Tablice (jedno i wielowymiarowe), łańcuchy znaków

Podstawy Programowania Podstawowa składnia języka C++

Abstrakcyjne struktury danych w praktyce

1 Podstawy c++ w pigułce.

Inicjacja tablicy jednowymiarowej

Laboratorium Podstaw Informatyki. Kierunek Elektrotechnika. Ćwiczenie 1. Podstawy. Wprowadzenie do programowania w języku C. Katedra Metrologii AGH

IX. Wskaźniki.(3 godz.)

Podstawy Programowania C++

Podstawy programowania. Wykład: 9. Łańcuchy znaków. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

Wskaźniki. Programowanie Proceduralne 1

Drzewa poszukiwań binarnych

Program 6. Program wykorzystujący strukturę osoba o polach: imię, nazwisko, wiek. W programie wykorzystane są dwie funkcje:

ISO/ANSI C - funkcje. Funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje

XML i nowoczesne technologie zarządzania treścią 2007/08

Wskaźniki. Informatyka

Program 14. #include <iostream> #include <ctime> using namespace std;

Programowanie w językach wysokiego poziomu

Algorytmy sortujące i wyszukujące

Stałe, znaki, łańcuchy znaków, wejście i wyjście sformatowane

Programowanie Proceduralne

dr inż. Jarosław Forenc

Uniwersytet Zielonogórski Instytut Sterowania i Systemów Informatycznych. Algorytmy i struktury danych Laboratorium 7. 2 Drzewa poszukiwań binarnych

Język C, tablice i funkcje (laboratorium, EE1-DI)

WYKŁAD 8. Funkcje i algorytmy rekurencyjne Proste przykłady. Programy: c3_1.c..., c3_6.c. Tomasz Zieliński

Wstęp do wskaźników w języku ANSI C

Wykład VI. Programowanie. dr inż. Janusz Słupik. Gliwice, Wydział Matematyki Stosowanej Politechniki Śląskiej. c Copyright 2014 Janusz Słupik

Łącza nienazwane(potoki) Łącza nienazwane mogą być używane tylko pomiędzy procesami ze sobą powiązanymi.

Laboratorium 1. Programowanie II - Kierunek Informatyka. dr inż. Janusz Słupik. Gliwice, Wydział Matematyki Stosowanej Politechniki Śląskiej

Temat 1: Podstawowe pojęcia: program, kompilacja, kod

Podstawy programowania C. dr. Krystyna Łapin

Poprawność semantyczna

Drzewa wyszukiwań binarnych (BST)

Struktura pliku projektu Console Application

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

Podstawy programowania. Wykład Pętle. Tablice. Krzysztof Banaś Podstawy programowania 1

Część 4 życie programu

Zmienne powłoki. Wywołanie wartości następuje poprzez umieszczenie przed nazwą zmiennej znaku dolara ($ZMIENNA), np. ZMIENNA=wartosc.

Programowanie strukturalne i obiektowe

4. Tablica dwuwymiarowa to jednowymiarowa tablica wskaźników do jednowymiarowych tablic danego typu.

Programowanie strukturalne i obiektowe : podręcznik do nauki zawodu technik informatyk / Adam Majczak. Gliwice, cop

Podstawy Informatyki. Wykład 6. Struktury danych

Wysokość drzewa Głębokość węzła

Laboratorium 3: Preprocesor i funkcje ze zmienną liczbą argumentów. mgr inż. Arkadiusz Chrobot

Pobieranie argumentów wiersza polecenia

Wstęp do programowania obiektowego. Przekazywanie parametrów do funkcji w C++ Metody i funkcje operatorowe Strumienie: standardowe, plikowe, napisowe

int tab[5]; tab[1]; ciągły obszar pamięci, w którym umieszczone są elementy tego samego typu macierz [ ] - dwuargumentowy operator indeksowania

1. Wprowadzanie danych z klawiatury funkcja scanf

Dla każdej operacji łącznie tworzenia danych i zapisu ich do pliku przeprowadzić pomiar czasu wykonania polecenia. Wyniki przedstawić w tabelce.

Transkrypt:

1 FW WSTĘP 1 1. Wstęp. Przedstawiany tu program po wczytaniu tekstu ze standardowego wejścia wypisuje uporządkowaną alfabetycznie listę słów wraz z liczbą ich wystąpień w podanym tekście. Przez słowo rozumiemy każdy napis złożony z liter oddzielony od innych napisów znakiem nie będącym literą. Wielkie i małe litery nie będą rozróżniane. Program fw można wykorzystać do wyszukiwania najczęściej występujących słów. Wykonanie poniższego polecenia spowoduje wypisanie na ekranie monitora dziesięciu linii zawierających najczęściej występujące słowa w tekście tego programu: fw < fw.w sort +0nr head -n10 2. Program czyta tekst, po jednym wierszu, ze stdin przy pomocy funkcji getline. Funkcja ta nie należy do standardowej biblioteki I/O (wejścia/wyjścia). Należy ona do biblioteki I/O kompilatora GCC. Używam tej funkcji ponieważ umożliwia ona wczytywanie dowolnie długich wierszy tekstu. Napisy porównywane są przez funkcję strcoll. Funkcja ta, porównując napisy stosuje kolejność znaków języka określonego zmienną środowiskową LANG. Aby program fw zaliczył polskie znaki diakrytyczne do liter i słowa zostały wypisane według porządku alfabetycznego obowiązującego w Polsce, wystarczy przed uruchomieniem tego programu ustawić zmienną LANG tak, aby wskazywała język polski: export LANG=pl_PL albo uruchamiamy program w taki oto sposób: LANG=pl_PL cat nazwa pliku fw W programie korzystam z kilkunastu funkcji, których prototypy zawarte są w standardowych plikach nagłówkowych. #define _GNU_SOURCE / zdefiniuj getline / #include <stdio.h> / zawiera deklarację funkcji getline / #include <stdlib.h> / malloc, EXIT_SUCCESS / #include <limits.h> / UCHAR_MAX / #include <locale.h> / setlocale wpływa na działanie poniższych funkcji / #include <ctype.h> / isupper, islower, tolower / #include <string.h> / strcoll, strtok /

2 DRZEWA BINARNE FW 3 3. Drzewa binarne. Wczytywane słowa są na bieżąco wstawiane do drzewa binarnego. Zanim powstanie wierzchołek z nowo wczytanego słowa zostanie ono porównane ze słowem uprzednio wstawionym do korzenia. Jeśli nowe słowo jest alfabetycznie mniejsze od porównywanego słowa, to operacja wstawiania zostanie zastosowana rekurencyjnie do lewego poddrzewa. Jeśli jest większe, to do prawego poddrzewa. Jeśli jest równe słowu porównywanemu to chociaż licznik jego wystąpień w wczytywanym tekście zostanie zwiększony o 1. Obok przedstawiono drzewo binarne zdania z książki S. J. Leca, Myśli nieuczesane: Chociaż krowie dasz kakao, nie wydoisz czekolady. Uwaga: W języku C nie dopuszcza się, aby struktura była definiowana rekurencyjnie inaczej niż za pomocą wskaźników do siebie samej. struct wierzchołek char słowo; int liczba wystąpień ; struct wierzchołek lewe poddrzewo; struct wierzchołek prawe poddrzewo; ; 4. Zmienne lokalne funkcji main 4 struct wierzchołek korzeń = Λ; Kontynuacja: sekcje 11 i 14. Ten kod jest użyty w sekcji 10. dasz krowie nie czekolady kakao wydoisz 5. Utworzenie i inicjalizacja nowego wierzchołka. Jeśli zabraknie pamięci na nowy wierzchołek to program fw kończy działanie. Jeśli miejsce jest, to kopiujemy wczytane słowo s z bufora w nowe miejsce w pamięci. Gdybyśmy tego nie zrobili, to następne wywołanie funkcji getline umieściłoby w buforze nową linię, zamazując tym samym poprzednią zawartość zawierającą słowo s. struct wierzchołek nowy wierzchołek (char s) struct wierzchołek w = malloc(sizeof (struct wierzchołek)); if (w Λ) Zakończ działanie komunikatem o braku pamięci 9 w słowo = strdup(s); if (w słowo Λ) Zakończ działanie komunikatem o braku pamięci 9 w liczba wystąpień = 1; w lewe poddrzewo = w prawe poddrzewo = Λ; return w;

6 FW WSTAWIANIE WIERZCHOŁKÓW DO DRZEWA 3 6. Wstawianie wierzchołków do drzewa. Funkcja wstaw wierzchołek jest rekurencyjna. Jeśli wczytywany ciąg słów jest już częściowo uporządkowany, to budowane drzewo ma mało rozgałęzień i rośnie w dół bardzo nisko (tak rosną drzewa w RAM). Również w takiej sytuacji, drzewo rośnie coraz wolniej, ponieważ funkcja wstaw wierzchołek będzie przeglądać większość wierzchołków drzewa zanim wstawi nowy wierzchołek. struct wierzchołek wstaw wierzchołek (struct wierzchołek w, char s) int wynik porównania ; if (w Λ) w = nowy wierzchołek (s); else if ((wynik porównania = strcoll (s, w słowo)) 0) w liczba wystąpień ++; else if (wynik porównania < 0) w lewe poddrzewo = wstaw wierzchołek (w lewe poddrzewo, s); else w prawe poddrzewo = wstaw wierzchołek (w prawe poddrzewo, s); return w; 7. Drukowanie słów wstawionych do drzewa w porządku alfabetycznym. Funkcja rekurencyjna inorder print wypisze słowa występujące w wierzchołkach w porządku alfabetycznym określonym przez kolejność liter alfabetu języka ustalonego przez zmienną środowiskową LANG. Jest tak, ponieważ dla każdego wierzchołka, słowa występujące w jego lewym poddrzewie są mniejsze alfabetycznie od słowa występującego w wierzchołku, a ono samo jest mniejsze od wszystkich słów występujących w jego prawym poddrzewie (zob. rysunek w sekcji 3). void inorder print (struct wierzchołek w) if (w Λ) inorder print (w lewe poddrzewo); printf ("%9d %s\n", w liczba wystąpień, w słowo); inorder print (w prawe poddrzewo); 8. Przed umieszczeniem słowa w drzewie zamieniamy wielkie litery na małe. char lowercase(char s) char c = s; while (isupper ( c)) c = tolower ( c); c++; return s; 9. Jest możliwe, by ten program zachowywał się sensowniej, niż tylko kończąc działanie w tym miejscu patrz dokumentacja INFO do biblioteki libc węzeł: Basic Allocation. Zakończ działanie komunikatem o braku pamięci 9 fprintf (stderr, "! Virtual memory exhausted.\n"); exit (1); Ten kod jest użyty w sekcji 5.

4 FUNKCJA GŁÓWNA FW 10 10. Funkcja główna. Główna część programu to pętla while, w której tekst ze stdin wczytywany jest przez funkcję getline do bufora p. Z wczytanego wiersza kolejne słowa oddzielane są przez strtok i wstawiane na bieżąco do drzewa binarnego przez funkcję wstaw wierzchołek. Po wczytaniu ostatniego wiersza ze stdin, funkcja inorder print wypisze wszystkie przeczytane słowa wraz z liczbą ich wystąpień. int main ( ) Zmienne lokalne funkcji main 4 Ustal język na podstawie wartości zmiennej środowiskowej LANG 12 Utwórz ogranicznik dla funkcji strtok 13 while (getline (&bufor p, &długość bufora, stdin ) 1) while ((następne słowo = strtok (bufor p, ogranicznik )) Λ) korzeń = wstaw wierzchołek (korzeń, lowercase(następne słowo)); bufor p = Λ; / dlaczego Λ patrz strona podręcznika poświęcona strtok / inorder print (korzeń ); return EXIT_SUCCESS; 11. Jeśli przed wywołaniem getline nadamy zmiennym bufor p i długość bufora wartość 0, to funkcja sama przydzieli sobie pamięć na bufor i adres początku bufora umieści w bufor p. Napotykając koniec pliku getline zwraca wartość 1. Zmienne lokalne funkcji main 4 + char bufor p = 0; size t długość bufora = 0; 12. Wywołanie setlocale z drugim argumentem będącym pustym napisem spowoduje, że funkcje: isupper, islower, tolower i strcoll będą korzystać z danych lokalnych (locale data) ustalonych przez zmienną środowiskową LANG. Ustal język na podstawie wartości zmiennej środowiskowej LANG 12 setlocale (LC_CTYPE, ""); / wczytaj kody wielkich i małych liter / setlocale (LC_COLLATE, ""); / wczytaj dane dotyczące porządku alfabetycznego / Ten kod jest użyty w sekcji 10. 13. Kolejne wywołania strtok oddzielają od początku bufora bufor p napisy rozdzielone znakami umieszczonymi w tablicy ogranicznik. Tablica ta zawiera tylko znaki nie będące znakami alfanumerycznymi. Utwórz ogranicznik dla funkcji strtok 13 for (i = 1, k = 0; i UCHAR_MAX; i++) if ( isalnum (i)) ogranicznik [k++] = i; ogranicznik [k] = \0 ; Ten kod jest użyty w sekcji 10. 14. Pozostaje jeszcze tylko zadeklarować kilka zmiennych i program jest gotowy. To by było na tyle jak mawia prof. Stanisławski. Zmienne lokalne funkcji main 4 + unsigned int i, k; / liczniki pętli / unsigned char ogranicznik [UCHAR_MAX]; / argument delim w strtok / char następne słowo;

15 FW SKOROWIDZ 5 15. Skorowidz. Poniżej znajdziesz listę identyfikatorów użytych w programie hello.w. Liczba wskazuje na numer sekcji, w której użyto identyfikatora, a liczba podkreślona numer sekcji w której zdefiniowano identyfikator. _GNU_SOURCE: 2. bufor p: 10, 11, 13. bufora p: 10. c: 8. delim : 14. długość bufora : 10, 11. exit : 9. EXIT_SUCCESS: 2, 10. fprintf : 9. getline : 2, 5, 10, 11. head, program: 1. i: 14. inorder print : 7, 10. isalnum : 13. islower : 2, 12. isupper : 2, 8, 12. k: 14. korzeń : 4, 10. LANG: 2. LANG, zmienna środowiskowa: 2, 7, 10, 12. LC_COLLATE: 12. LC_CTYPE: 12. Lec SJ: 3. lewe poddrzewo: 3, 5, 6, 7. liczba wystąpień : 3, 5, 6, 7. lowercase : 8, 10. main : 10. malloc: 2, 5. następne słowo: 10, 14. nowy wierzchołek : 5, 6. ogranicznik : 10, 13, 14. prawe poddrzewo: 3, 5, 6, 7. printf : 7. s: 5, 6, 8. setlocale : 2, 12. słowo: 3, 5, 6, 7. słowo, definicja: 1. sort, program: 1. Stanisławski JT, profesor: 14. stderr : 9. stdin : 2, 10. strcoll : 2, 6, 12. strdup: 5. strtok : 2, 10, 13, 14. tolower : 2, 8, 12. UCHAR_MAX: 2, 13, 14. użycie fw, przykład: 1. w: 5, 6, 7. wierzchołek: 3, 4, 5, 6, 7. wstaw wierzchołek : 6, 10. wynik porównania : 6.

6 NAZWY SEKCJI FW Ustal język na podstawie wartości zmiennej środowiskowej LANG 12 Użyto w sekcji 10. Utwórz ogranicznik dla funkcji strtok 13 Użyto w sekcji 10. Zakończ działanie komunikatem o braku pamięci 9 Użyto w sekcji 5. Zmienne lokalne funkcji main 4, 11, 14 Użyto w sekcji 10.

ZLICZANIE SŁÓW (wersja 1.1) Sekcja Strona Wstęp............................................................................... 1 1 Drzewa binarne....................................................................... 3 2 Utworzenie i inicjalizacja nowego wierzchołka......................................... 5 2 Wstawianie wierzchołków do drzewa................................................. 6 3 Drukowanie słów wstawionych do drzewa w porządku alfabetycznym..................... 7 3 Funkcja główna...................................................................... 10 4 Skorowidz........................................................................... 15 5 Copyright c 2002 Włodek Bzyl Jest to wersja programu autorstwa R. Haighta z książki B. W. Kernighana, D. M. Ritchiego, Język ANSI C. Program ten korzysta z locales. Oznacza to, że słowa zostaną wypisane w porządku alfabetycznym właściwym dla języka ustalonego przez zmienną środowiskową LANG. /var/cvs/wyklady/jpz/doc/literate/tz/fw.w,v 2004/12/03