Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Комплексное пособие Си.pdf
Скачиваний:
57
Добавлен:
12.03.2015
Размер:
1.57 Mб
Скачать

Последовательная обработка символьных данных

Символьные данные

Значением символьного типа является одиночный символ. В языке C символьные данные рассматриваются как разновидность целых чисел. Числовым значением символа является его код.

Вязыке C над символами разрешаются не только операции присваивания и сравнения, но и арифметические операции.

Вмеждународном стандарте кодов ASCII каждый символ занимает один байт, этого достаточно для кодирования 256 различных кодов. Есть кодировки, в которых символ занимает два байта, например, международный код UNICODE.

Примеры символьных констант:

‘*’

 

‘a’

‘5’

‘n’

Специальные (управляющие) символьные константы:

'\n'

 

 

новая строка (new line),

'\t'

 

'\v'

табуляция горизонтальная, вертикальная,

'\b'

 

 

возврат на шаг (backspace),

'\\'

-

\ (обратный слэш)

 

'\''

-

' (апостроф)

 

 

'\"' - " (кавычка),

 

'\0'

 

нуль-символ (байт с нулевым кодом).

При объявлении символьных переменных обычно используется тип char, но можно использовать и тип int. Например:

char

s, sim = ‘Z’, c;

int

b = ‘a’;

Кодировка цифровых символов (символ и его числовой код):

'0' =

=

48

'1' = '0' + 1

49

'2' = '0' + 2

=

50

61

. . .

'9' = '0' + 9 = 57

Отсюда соотношения:

Код цифры = '0' + Значение цифры Значение цифры = Код цифры - '0'

Условие "значение символьной переменой s является цифрой" на языке C запишется так:

s >= '0' && s <= '9‘

Коды заглавных латинских букв возрастают по алфавиту:

'A'

= 65, 'B'

=

66, 'С' = 67, …

'A'

< 'B' < ...

<

'Z' .

Коды строчных латинских букв также составляют возрастающую последовательность: 'a' = 97, 'b' = 98, 'с' = 99, …

'a' < 'b' < ... < 'z'.

Условие "значение символьной переменой s является латинской буквой" можно записать так:

(s>='A' && s<='Z') || (s>='a' && s<='z')

Русские буквы (символы кириллицы) имеются не во всех кодировках и не всегда кодируются по алфавиту.

Последовательная обработка символов

Если для решения задачи достаточно просмотреть исходный текст один раз, то обычно текст вводится и обрабатывается посимвольно и не хранится целиком в памяти (в виде массива). В программе используется переменная типа char, которой поочередно присваиваются значения символов исходного текста. Ввод и обработка символов происходит до тех пор, пока не встретится признак конца текста или количество введенных символов не достигнет заданной длины текста.

Функции getchar( ) и putchar( )

Функции getchar() и putchar() служат соответственно для ввода и вывода одного символа. Для посимвольного ввода/вывода текстов лучше использовать эти функции, нежели scanf() и printf().

62

Функция getchar() не имеет аpгументов. Она читает очередной введенный символ и возвpащает его код выполняемой пpогpамме.

Пpимеp вызова функции getchar():

char ch;

ch = getchar();

Как и функция scanf(), функция getchar() читает данные из буфера ввода-вывода. В буфер данные помещаются построчно. То есть пока не будет введена вся строка, функция getchar() не начнет чтение символа.

Функция putchar() имеет один аpгумент - это символ, который требуется вывести на экран.

Пpимеpы вызова функции putchar():

putchar (ch);

/* ch - переменная

типа char */

putchar

('S');

/* перевод строки

*/

putchar

('\n');

Определения функций getchar() и putchar() содержатся в файле stdio.h.

Задача 1. Вывести коды введенных с клавиатуры символов. Последовательность символов завершается нажатием клавиши Enter.

/* Коды символов */ #include <stdio.h> #include <conio.h> main()

{char sim; /* очередной символ */ printf("\n Введите строку символов\n"); while((sim=getchar()) != '\n')

printf("%c = %d, ", sim, sim);

printf("\nНажмите

любую клавишу");

getch();

/* чтение

кода нажатой клавиши без отображения

символа

 

 

на экране*/

return 0;

}

Оператор while в программе можно записать иначе – с использованием функции putchar():

while((sim=getchar()) != '\n') { putchar(sim);

printf(" = %d, ", sim);

}

63

Пример результата выполнения программы:

Введите строку символов

Kazan 2009

K = 82, a = 97, z = 122, a = 97, n = 110, = 32, 2 = 50, 0 = 48, 0 = 48, 9 = 57,

Нажмите любую клавишу

Задача 2. Дан текст произвольной длины, оканчивающийся точкой. Проверить, есть ли в тексте сочетания "ВА".

Программа:

#include

<stdio.h>

 

 

 

main()

 

 

 

 

{

s;

/* текущий символ текста */

 

char

 

char

prs;

/* предыдущий символ

*/

 

short

net=1;

/* признак, имеется

ли "ВА" в тексте */

 

 

/* net=1, если "ВА"

нет

*/

 

 

/* net=0, если "ВА"

есть

*/

printf ("\nВведите текст.\n");

s=getchar();

/* чтение первого символа */

if (s!='.')

 

{ do

prs=s; s=getchar();

{

}

if

(prs=='В' && s=='А') net=0;

 

 

while (s!='.');

}

printf ("В тексте нет 'ВА'.\n");

if (net)

else printf ("В тексте есть 'ВА'.\n"); return 0;

}

Тесты для проверки программы

Номер теста

Исходный текст

Ожидаемый результат

 

 

 

1

МОСКВА, БЕРЛИН, ВАРНА .

В тексте есть 'ВА'.

2

Школа .

В тексте нет 'ВА'.

3

.

В тексте нет 'ВА'.

 

 

 

Контрольные вопросы

1.Как объявить символьные переменные? Запишите примеры.

2.Как выполнить ввод и вывод символьной переменной t?

3.Запишите условный оператор для проверки, является ли символ s

строчной латинской буквой, и вывода соответствующего сообщения.

64

4. Как проверить, является ли символ s цифрой?

5. Определите результат выполнения следующего фрагмента программы:

char b;

for (b = 'A'; b <= 'Z'; b++) printf ("%c - %d\n", b, b);

65