Podstawy Programowania. Przetwarzanie napisów, drzewa binarne

Podobne dokumenty
Podstawy Programowania. Przetwarzanie napisów, drzewa binarne

Podstawy Programowania

Informatyka 1. Przetwarzanie tekstów

Programowanie w C Typ wskaźnikowy do typu znakowego i operacje na łańcuchach

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

Podstawy programowania w języku C++

DANE TEKSTOWE W JĘZYKU C/C++ - TABLICE ZNAKOWE

ŁAŃCUCHY W JĘZYKU C/C++

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

Podstawy Programowania

Katedra Elektrotechniki Teoretycznej i Informatyki. wykład 9 - sem.iii. Dr inż. M. Czyżak

Katedra Elektrotechniki Teoretycznej i Informatyki. wykład 7- sem.iii. M. Czyżak

Podstawy programowania

Języki programowania. Przetwarzanie tablic znaków. Część druga. Autorzy Tomasz Xięski Roman Simiński

Języki programowania obiektowego Nieobiektowe elementy języka C++

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

Spis treści JĘZYK C - ŁAŃCUCHY ZNAKÓW. Informatyka 2. Instrukcja do pracowni specjalistycznej z przedmiotu. Numer ćwiczenia INF22

Reprezentacja symboli w komputerze. Znaki alfabetu i łańcuchy znakowe. Programowanie Proceduralne 1

Spis treści JĘZYK C - ŁAŃCUCHY ZNAKÓW. Informatyka 1. Instrukcja do pracowni specjalistycznej z przedmiotu. Numer ćwiczenia INF10Z

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

Tablice deklaracja, reprezentacja wewnętrzna

Reprezentacja symboli w komputerze.

Programowanie Proceduralne

Operacje na łańcuchach znaków

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

Reprezentacja symboli w komputerze.

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

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

PODSTAW PROGRAMOWANIA WYKŁAD 7 ŁAŃCUCHY

Wstęp do programowania INP001213Wcl rok akademicki 2017/18 semestr zimowy. Wykład 12. Karol Tarnowski A-1 p.

Biblioteka standardowa - operacje wejścia/wyjścia

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

Programowanie Proceduralne

Podstawy programowania 1

Tablice, funkcje - wprowadzenie

Podstawy programowania w języku C++

Wprowadzenie do programowania w języku C

wykład III uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C - zarządzanie pamięcią, struktury,

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

. Podstawy Programowania 1. Łańcuchy znaków. Arkadiusz Chrobot. 25 listopada 2015

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

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

Programowanie w językach wysokiego poziomu

Tablice i struktury. czyli złożone typy danych. Programowanie Proceduralne 1

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

tablica: dane_liczbowe

Funkcja (podprogram) void

Języki programowania. Przetwarzanie plików amorficznych Konwencja języka C. Część siódma. Autorzy Tomasz Xięski Roman Simiński

Informatyka 1. Plan dzisiejszych zajęć. zajęcia nr 11. Elektrotechnika, semestr II rok akademicki 2008/2009

Języki i metodyka programowania. Typy, operatory, wyrażenia. Wejście i wyjście.

Programowanie I C / C++ laboratorium 03 arytmetyka, operatory

Funkcje zawarte w bibliotece < io.h >

dr inż. Jarosław Forenc

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

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

Podstawy programowania w języku C++

Laboratorium 3: Tablice, tablice znaków i funkcje operujące na ciągach znaków. dr inż. Arkadiusz Chrobot dr inż. Grzegorz Łukawski

2 Przygotował: mgr inż. Maciej Lasota

wykład II uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C - funkcje, tablice i wskaźniki wykład II dr Jarosław Mederski Spis

Wstęp do programowania 1

Wstęp do programowania 1

Podstawy programowania C. dr. Krystyna Łapin

TABLICE W JĘZYKU C/C++ typ_elementu nazwa_tablicy [wymiar_1][wymiar_2]... [wymiar_n] ;

Funkcje zawarte w bibliotece < io.h >

Informatyka I. Typy danych. Operacje arytmetyczne. Konwersje typów. Zmienne. Wczytywanie danych z klawiatury. dr hab. inż. Andrzej Czerepicki

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

Lab 9 Podstawy Programowania

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

Typy złożone. Struktury, pola bitowe i unie. Programowanie Proceduralne 1

Łańcuchy znaków. Agnieszka Nowak - Brzezińska

JĘZYK C - TABLICE DWUWYMIAROWE,

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

Programowanie I C / C++ laboratorium 02 Składnia pętli, typy zmiennych, operatory

Wskaźniki. Programowanie Proceduralne 1

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

Wykład II. Programowanie II - semestr II Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej

main( ) main( void ) main( int argc, char argv[ ] ) int MAX ( int liczba_1, liczba_2, liczba_3 ) źle!

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

Spis treści JĘZYK C - TABLICE JEDNOWYMIAROWE, ŁAŃCUCHY ZNAKÓW. Informatyka 1. Instrukcja do pracowni specjalistycznej z przedmiotu

Podstawy programowania w języku C++

Zasady programowania Dokumentacja

scanf( %s,tekst); //znaki podane z klawiatury (do pierwszego białego znaku ) //s kopiowane do zmiennej tekst i dostawiany jest znak \0

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

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

Tablice. int rozmiar; cout << Jaki ma być rozmiar tabeli? ; cin >> rozmiar; { int tablica[rozmiar]; /* TU JEST ŹLE */... }

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

Inicjacja tablicy jednowymiarowej

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

Podstawy Programowania. Składnia wyrażeń i instrukcji, złożoności obliczeniowej, operacje wejścia i wyjścia, definicja

Podstawy programowania w języku C++

Informatyka programowanie w języku C część II. dr hab. inż. Mikołaj Morzy

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

Podstawy programowania w języku C++

Prawidłowa konstrukcja (3 x 4) char** tab = new char*[3]; for (size_t i = 0; i < 3; i++) tab[i] = new char[4];

utworz tworzącą w pamięci dynamicznej tablicę dwuwymiarową liczb rzeczywistych, a następnie zerującą jej wszystkie elementy,

1 Wskaźniki i zmienne dynamiczne, instrukcja przed zajęciami

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

Języki i metody programowania I

Struktury czyli rekordy w C/C++

۰ Elementem jednostkowym takiego pliku jest bajt. ۰ Format pliku binarnego: [bajty pliku][eof]

Transkrypt:

Podstawy Programowania Wykład XI Przetwarzanie napisów, drzewa binarne Robert Muszyński ZPCiR ICT PWr Zagadnienia: reprezentacja napisów znakowych, operowanie na napisach: porównywanie, kopiowanie, łączenie, wyszukiwanie, konwersja; częste błędy, drzewa binarne. Copyright c 2007 2012 Robert Muszyński Niniejszy dokument zawiera materiały do wykładu na temat podstaw programowania w językach wysokiego poziomu. Jest on udostępniony pod warunkiem wykorzystania wyłącznie do własnych, prywatnych potrzeb i może być kopiowany wyłącznie w całości, razem ze stroną tytułową. Skład FoilTEX

Przetwarzanie napisów, drzewa binarne 1 Tablice niepełne Reprezentacja napisów znakowych #define MAXSTRING 20 typedef char String1[MAXSTRING]; String1 Napis1; int Dlug_Napis1; typedef struct { char Znaki[MAXSTRING]; int Dlugosc; String2; Tablice ze znacznikiem (np. \0) #define MAXSTRING 20 typedef char String1[MAXSTRING]; String1 Napis1 = "Ala ma kota"; /* to nie to samo co */ String1 Napis2 = { A, l, a,, m, a,, k, o, t, a ;

Przetwarzanie napisów, drzewa binarne 2 OSTRZEŻENIE! Napisy w języku C Napisy w języku C mogą być przyczyną wielu trudnych do wykrycia błędów w programach. Warto dobrze zrozumieć, jak należy operować na łańcuchach znaków i zachować szczególną ostrożność w tych miejscach, gdzie napisów używamy. printf("napis w jezyku C"); char *tekst = "Jakis tam tekst"; printf("%c\n", tekst[2]); /* wypisze k */ printf("%c\n", "przyklad"[0]); /* wypisze p */ printf("%d", "test"[4]); /* wypisze 0 */ Na napisach operują standardowe funkcje printf, scanf z nagłówka stdio.h: printf("%s", tekst); Ale większość z nich znajduje się w pliku nagłówkowym string.h.

Przetwarzanie napisów, drzewa binarne 3 Napisy w języku C cd. char *tekst = "Jakis tam tekst"; /* Napis w obszarze danych programu */ char tekst[] = "Jakis tam tekst"; /* Napis w tablicy o automatycznie */ /* dobranym rozmiarze */ char tekst[80] = "Tekst krotszy niz 80 znakow"; /* Tablica 80-znakowa */ printf("ten napis zajmuje \ wiecej niz jedna linie"); printf("ten napis\nna wyjsciu\nzajmie wiecej niz jedna linie."); UWAGA! Warto zaznaczyć, że znak nowej linii ( \n ) jest w różny sposób przechowywany w różnych systemach operacyjnych. W niektórych systemach używa się do tego jednego znaku (systemy z rodziny Unix: Linux, *BSD, Mac OS, Commodore, Apple II); drugą konwencją jest zapisywanie \n za pomocą dwóch znaków (CP/M, DOS, OS/2, Microsoft Windows).

Przetwarzanie napisów, drzewa binarne 4 Porównywanie napisów Tak się nie da: #include <stdio.h> #include <string.h> int main(void) { char str1[80], str2[80]; puts("podaj dwa ciagi znakow: "); fgets(str1, sizeof str1, stdin); fgets(str2, sizeof str2, stdin); Trzeba tak: #include <stdio.h> #include <string.h> int main(void) { char str1[80], str2[80]; int cmp; puts("podaj dwa ciagi znakow: "); fgets(str1, sizeof str1, stdin); fgets(str2, sizeof str2, stdin); cmp = strcmp(str1, str2); if (str1<str2) { puts("pierwszy napis jest mniejszy."); else if (str1>str2) { puts("pierwszy napis jest wiekszy."); else { puts("napisy sa takie same."); return 0; if (cmp<0) { puts("pierwszy napis jest mniejszy."); else if (cmp>0) { puts("pierwszy napis jest wiekszy."); else { puts("napisy sa takie same."); return 0;

Przetwarzanie napisów, drzewa binarne 5 Biblioteka string #include <string.h> char *strcpy(char *dst, const char *src); char *strncpy(char *dst, const char *src, size_t n); char *strdup(const char *s1); size_t strlen(const char *s); char *strcat(char *dst, const char *src); char *strncat(char *dst, const char *src, size_t n); char *strchr(const char *s, int c); char *strrchr(const char *s, int c); int strcmp(const char *s1, const char *s2); int strncmp(const char *s1, const char *s2, size_t n); int strcasecmp(const char *s1, const char *s2); int strncasecmp(const char *s1, const char *s2, int n); size_t strcspn(const char *s1, const char *s2); size_t strspn(const char *s1, const char *s2); char *strpbrk(const char *s1, const char *s2); char *strtok(char *s1, const char *s2); char *strstr(const char *s1, const char *s2);

Przetwarzanie napisów, drzewa binarne 6 Inne operacje na napisach porównanie fragmentu napisów if (!strncmp(str, "foo", 3)) { puts("podany ciag zaczyna sie od foo."); kopiowanie napisów strcpy(napis, "Oto pies Oli."); /* napis musi byc wystarczajaco duzy */ strncpy(napis, "Oto pies Oli.", sizeof napis - 1); napis[sizeof napis - 1] = 0; /* teraz juz nie */ /* kopiowanie znak po znaku */ /* co z rozmiarem? */ for (i = 0; i < 80; ++i) s2[i] = s1[i]; /* to samo przy uzyciu wskaznikow */ s3 = s1; s4 = s2; for (i = 0; i < 80; ++i, ++s3, ++s4) *s4 = *s3;

Przetwarzanie napisów, drzewa binarne 7 Inne operacje na napisach cd. kopiowanie napisów cd. char s1[20], s2[20] = "Ala ma kota."; char *s3, *s4; s1 = s2; /* niedozwolone */ strcpy(s1, s2); /* tak mozna, funkcja biblioteczna */ s3 = s1; /* tez dozwolone */ strcpy(s4, s3); /* zle, s4 nie jest tablica */ s4 = s2; /* oczywiscie */ strcpy(s4, s3); /* teraz dobrze, kopiuja sie s2 do s1 */ łączenie napisów char napis1[80] = "Witaj, "; char *napis2 = "Swiecie"; strcat(napis1, napis2); /* znow musimy dbac o wymiar */ /* moze wiec podobnie jak poprzednio */ strncat(napis1, napis2, sizeof napis1-1); /* co ze znakiem \0? */

Przetwarzanie napisów, drzewa binarne 8 Wyszukiwanie wzroców Zadanie: Napisać program do wyświetlania tych linii z stdin, które zawierają określony napis znakowy. Schemat: while ( jest jeszcze jedna linia danych ) if ( linia zawiera zadany napis znakowy ) wyswietl linie /* getline: get line into s, return length */ int getline(char s[], int lim) { int c, i = 0; while (--lim > 0 && (c=getchar())!= EOF && c!= \n ) s[i++] = c; if (c == \n ) s[i++] = c; s[i] = \0 ; return i;

Przetwarzanie napisów, drzewa binarne 9 /* strindex: return index of t in s, -1 if none */ int strindex(char s[], char t[]) { int i, j, k; for (i = 0; s[i]!= \0 ; i++) { for (j=i, k=0; t[k]!= \0 && s[j]==t[k]; j++, k++) ; if (k > 0 && t[k] == \0 ) return i; return -1;

Przetwarzanie napisów, drzewa binarne 10 Kompletujemy rozwiązanie naszego przykładowego problemu: #include <stdio.h> #define MAXLINE 1000 /* max dlugosc linii wejsciowej */ int getline(char line[], int max); int strindex(char source[], char searchfor[]); char pattern[] = "ould"; /* wzorzec do znalezienia */ /* wyszukaj wszystkie linie pasujace do wzorca */ main() { char line[maxline]; int found = 0; while (getline(line, MAXLINE) > 0) if (strindex(line, pattern) >= 0) { printf("%s", line); found++; return found;

Przetwarzanie napisów, drzewa binarne 11 Konwersje Funkcje biblioteczne służące do konwersji napisów: atoi zamienia łańcuch na liczbę całkowitą typu int, atol, strtol zamienia łańcuch na liczbę całkowitą typu long, atoll, strtoll zamienia łańcuch na liczbę całkowitą typu long long, atof, strtod przekształca łańcuch na liczbę typu double Czasami przydaje się też konwersja w drugą stronę, tzn. z liczby na łańcuch. Do tego celu może posłużyć funkcja sprintf lub snprintf. sprintf jest bardzo podobna do printf, tyle, że wyniki jej pracy zwracane są do wskazanego łańcucha, a nie wyświetlane na standardowym wyjściu.

Przetwarzanie napisów, drzewa binarne 12 Operacje na znakach przykład konwersji #include <stdio.h> #include <ctype.h> #include <string.h> int main() /* zamiana male <-> duze */ { int znak; while ((znak = getchar())!=eof) { if( islower(znak) ) { znak = toupper(znak); else if( isupper(znak) ) { znak = tolower(znak); putchar(znak); return 0;

Przetwarzanie napisów, drzewa binarne 13 Częste błędy pisanie do niezaalokowanego miejsca char *tekst; scanf("%s", tekst); zapominanie o kończącym napis nullu char test[4] = "test"; /* nie zmiescil sie NULL konczacy napis */ nieprawidłowe porównywanie łańcuchów char tekst1[] = "jakis tekst"; char tekst2[] = "jakis tekst"; if( tekst1 == tekst2 ) { /* tu zawsze bedzie fasz */...

Przetwarzanie napisów, drzewa binarne 14 Drzewa binarne drzewo graf reprezentujący regularną strukturę wskaźnikową, gdzie każdy element zawiera dwa lub więcej wskaźników (ponumerowanych) do takich samych elementów; węzły (albo wierzchołki) grafu reprezentują elementy pamięciowe, a łuki reprezentują wskaźniki drzewo binarne każdy element zawiera dokładnie dwa wskaźniki korzeń element drzewa, od którego zaczynają się wskaźniki do pozostałych elementów liście elementy drzewa, których oba wskaźniki są puste (NULL) wewnętrzne węzły drzewa węzły, które nie są ani liściami ani korzeniem scieżka ciąg węzłów biegnący zgodnie ze wskaźnikami od korzenia do jakiegoś liścia poddrzewo drzewo, które jest całkowicie zawarte w innym drzewie rząd drzewa liczba wskaźników ( 2) w jednym węźle drzewa (niektóre z nich są NULL) wysokość drzewa długość najdłuższej ścieżki drzewa waga drzewa całkowita liczba węzłów w drzewie

Przetwarzanie napisów, drzewa binarne 15 Podsumowanie Zagadnienia podstawowe 1. Wymień sposoby reprezentowania napisów w pamięci komputera. 2. Jakie są wady reprezentacji napisu w postaci ze znacznikiem końca? 3. Jakie są potencjalne źródła błędów przy korzystaniu z napisów w języku C? 4. Jakich funkcji można użyć do porównywania napisów w języku C? Czym one się różnią? 5. Co robi funkcja strstr? 6. W jaki sposób można przekształcić napis reprezentujący wartość liczbową w tę wartość i vice versa? 7. Czym jest drzewo binarne i jakie elementy można w nim wyróżnić? 8. Czym różni się drzewo od listy? 9. Czy każda ścieżka w drzewie jest listą? 10. Czy wysokość drzewa może być większa od jego wagi? Zagadnienia rozszerzające 1. Czym różni się zamiana ciągu znaków na liczbę przy pomocy funkcji atoi() od sscanf()? 2. Jaka jest różnica w poziomie bezpieczeństwa pomiędzy funkcją strcpy a strncpy? 3. Jaka jest rola modyfikatora const w funkcji char *strstr(const char *s1, const char *s2)?

Przetwarzanie napisów, drzewa binarne 16 4. Na czym polega problem z kodowaniem narodowych znaków diakrytycznych w napisach? Jakie są popularne sposoby ich kodowania? Do czego służy polecenie iconv? 5. Jakie są zastosowania drzew binarnych? 6. Jakie inne rodzaje drzew (oprócz binarnych) stosuje się w programach? 7. Czym są drzewa zrównoważone? Podaj przykładowe ich rodzaje i zastosowania. Zadania 1. Napisz funkcję zwracającą indeks ostatniego znaku w napisie. 2. Napisz program, który w podanym na jego wejście tekście znajdzie wszystkie palindromy. 3. Napisz program, który dla podanego na jego wejściu tekstu zwróci liczbę występujących w nim słów o kolejnych długościach. 4. Napisz program, który w podanym pliku będzie wyszukiwał linie zawierające zadane słowo. Dodatkowo można uwzględnić następujące opcje: tylko zliczanie linii (bez wyświetlania), linie nie zawierające słowa, brak rozróżniania wielkich i małych liter. Zwróć uwagę na zachowanie programu przy różnych ustawieniach zmiennych lokalizacyjnych w jakim przypadku można zaobserwować różnicę? 5. Zdefiniuj strukturę danych i podstawowe operacje potrzebne do stworzenia programu słownika wykorzystującego drzewa binarne.