====== Znaki w C ====== * Znaki kodowane są liczbami całkowitymi od 0 do 127 zgodnie z [[https://pl.wikipedia.org/wiki/ASCII|kodem ASCII]] * Typ znakowy **char** służy do reprezentowania pojedynczych znaków. Zmienna typu **char** ma rozmiar 1 bajta i zawiera liczbę całkowitą z zakresu od -128 do 127 * Pojedynczy znak zapisany w apostrofach '' 'A' '' odpowiada liczbie z kodu ASCII, np. znak '' 'A' '' to 65 a znak '' '\n' '' (nowa linia) to liczba 10 * Używając funkcji ''printf()'' i ''scanf()'' znaki formatujemy za pomocą ''%c'' Poniższy przykład wyświetla wartość odpowiadającą znakowi '' 'A' '' oraz znak odpowiadający liczbie '' 'A'+1 ''. #include int main() { char znak = 'A'; printf("%c %d\n", znak, znak); printf("%c %d\n", znak+1, znak+1); printf("%c %d\n", 42, 42); } Program wyświetli następujący komunikat: A 65 B 66 * 42 ===== Ćwiczenie: kod ASCII ===== Wypisz wszystkie znaki kodu ASCII wraz z odpowiadającymi im wartościami liczbowymi (od 0 do 127). Liczby wypisz w formacie dziesiętnym, szesnastkowym i ósemkowym, tak aby uzyskać tabelę podobną do poniższego fragmentu: Znak Dec Hex Oct ────────────────────── ... X 88 58 130 Y 89 59 131 Z 90 5A 132 [ 91 5B 133 \ 92 5C 134 ] 93 5D 135 ^ 94 5E 136 _ 95 5F 137 ` 96 60 140 a 97 61 141 b 98 62 142 c 99 63 143 ... ===== Funkcja getchar() i putchar() ===== * Funkcja ''getchar()'' zwraca pojedynczy znak pobrany ze standardowego wejścia (z terminala) lub wartość ''EOF'', gdy napotka koniec strumienia (//end of file//) * Podczas wprowadzania danych z terminala znak ''EOF'' uzyskujemy wciskając ''Ctrl+d'' (Unix/Linux) lub ''Ctrl+z'' (MS Windows) * Funkcja ''putchar(int a)'' wypisuje pojedynczy znak na standardowym wyjściu * Funkcje ''getchar()'' i ''putchar()'' zadeklarowane są w pliku ''stdio.h'' Przykład: #include int main() { char a; while((a=getchar()) != EOF) putchar(a); return 0; } Powyższy program kopiuje na wyjście wszystkie znaki wprowadzone na wejściu. Program działa aż do momentu napotkania końca strumienia (pliku). Stosując przekierowanie strumienia wejściowego, można powyższy program wykorzystać do wyświetlenia zawartości dowolnego pliku, np. wydając w terminalu polecenie: $ program < plik_wejsciowy Przekierowując wyjście z programu do pliku możemy skopiować dowolny plik $ program < plik_wejsciowy > plik_docelowy ===== Ćwiczenie: małe na duże ===== Napisz funkcję o nazwie ''male_na_duze'', która zamienia małą literę na wielką literę. \\ **Argumenty funkcji:**\\ * pojedynczy znak **Wartość zwracana funkcji:** * pojedynczy znak, jeżeli wejściowy znak jest małą literą (''a-z'') to zwracana jest odpowiadająca mu duża litera. W przeciwnym wypadku zwracany jest ten sam znak (brak zamiany). Wykorzystaj funkcję ''male_na_duze'' do napisania programu, który zamienia tekst wprowadzony na standardowym wejściu w taki sposób, że wszystkie małe litery będą zamienione na wielkie litery. Tekst wejściowy czytany jest aż do napotkania znaku ''EOF''. **Przykład:** dla tekstu podanego na wejściu Ala ma kota, a KOT ma Ale i zyc bez siebie nie moga wcale. 123 (!@#) program generuje następujące wyjście ALA MA KOTA, A KOT MA ALE I ZYC BEZ SIEBIE NIE MOGA WCALE. 123 (!@#) ===== Biblioteka ctype.h ===== Plik nagłówkowy ''ctype.h'' zawiera deklaracje funkcji służących do klasyfikacji znaków. Zobacz: [[https://pl.wikibooks.org/wiki/C/Biblioteka_standardowa/Indeks_tematyczny#ctype.h|ctype.h]] Oto lista wybranych funkcji z ''ctype.h'' | ''isalpha()'' | czy znak przekazany jako argument literą alfabetu | | ''isdigit()'' | czy znak przekazany jako argument jest cyfrą | | ''isalnum()''' | czy znak przekazany jako argument jest cyfrą lub literą alfabetu | | ''isprint()'' | czy znak przekazany jako argument jest znakiem drukowalnym | | ''isspace()'' | czy znak przekazany jako argument jest białym znakiem | | ''islower()'' | czy znak przekazany jako argument jest małą literą alfabetu | | ''isupper()'' | czy znak przekazany jako argument jest dużą literą alfabetu | | ''tolower()'' | zwraca znak zamieniony z dużej litery na małą | | ''toupper()'' | zwraca znak zamieniony z małej litery na dużą | **Przykład** Poniższy przykład zawiera program realizujący zamianę znaków z małych na duże z użyciem funkcji zadeklarowanych w ''ctype.h''. #include #include int main() { int a; while( (a = getchar()) != EOF ) { if ( islower(a) ) a = toupper(a); putchar(a); } return 0; } ===== Ćwiczenie: Licz znaki ===== Napisz program, który po wczytaniu tekstu ze standardowego wejścia wyświetla następujące informacje: * ilość przeczytanych znaków (wszystkich, także białych i niewidocznych), * ilość przeczytanych wyrazów, * ilość linii tekstu, * ilość małych liter ''a-z'', * ilość dużych liter ''A-Z'', * ilość cyfr ''0-9''. Przy liczeniu wyrazów zakładamy, że wyrazem jest ciąg znaków oddzielony przynajmniej jednym białym znakiem, tj. spacją, znakiem nowej linii '' '\n' '' lub znakiem tabulacji '' '\t' ''. Zauważ, że wyrazy nie muszą składać się tylko z liter alfabetu. Zwróć uwagę na to, że w tekście mogą wystąpić wyrazy oddzielone kilkoma następującymi po sobie białymi znakami oraz, że białe znaki mogą występować na początku linii (np. wcięcie kodu). Przykładowo dla wprowadzonego teksu: Ala ma kota, a KOT ma Ale i zyc bez siebie nie mogą wcale. 123 (!@#) program wypisze znaki 69 wyrazy 16 linie 3 duze litery 5 male litery 38 cyfry 3 ===== Zadanie: Licz litery alfabetu ===== Napisz program, który wyznacza liczbę wystąpień liter alfabetu w podanym tekście. Tekst czytany jest ze standardowego wejścia aż do końca pliku (''EOF''). Po wczytaniu tekstu program wyświetla listę liter alfabetu angielskiego w kolejności alfabetycznej od ''a'' do ''z'', które pojawiły się w tekście, wraz z ilością wystąpień każdej z liter. Program nie rozróżnia wielkości liter, tj. zarówno mała litera '' 'a' '' oraz wielka litera '' 'A' '' traktowane są jako wystąpienie tej samej litery alfabetu. Dodatkowo, obok liczby wystąpień litery, program podaje częstość (w procentach) z jaką znak pojawił się w tekście. Częstość podawana jest z dokładnością do 2 miejsc po przecinku. Przykładowo dla wprowadzonego teksu: Ala ma kota, a KOT ma Ale i zyc bez siebie nie moga wcale. 123 (!@#) program wypisze a 9 20.93 b 2 4.65 c 2 4.65 e 6 13.95 g 1 2.33 i 4 9.30 k 2 4.65 l 3 6.98 m 3 6.98 n 1 2.33 o 3 6.98 s 1 2.33 t 2 4.65 w 1 2.33 y 1 2.33 z 2 4.65 Rozwiązanie (plik źródłowy) umieść w Moodle pod adresem https://moodle.umk.pl/WFAIIS/mod/assign/view.php?id=2088