Znaki w C

Znaki kodowane są liczbami całkowitymi od 0 do 127 zgodnie z 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<stdio.h> 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 <stdio.h> 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: 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 <stdio.h> #include <ctype.h> 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=7547