Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Программирование(4172,4173) / Лекции / Лекция 6.Последовательная обработка символьных данных

.doc
Скачиваний:
68
Добавлен:
12.03.2015
Размер:
58.37 Кб
Скачать

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

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

Значением символьного типа является одиночный символ. В языке 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

. . .

'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().

Функция 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);

}

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

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

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()

{

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

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!='.');

}

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

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

return 0;

}

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

Номер теста

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

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

1

2

3

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

Школа .

.

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

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

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


Контрольные вопросы и упражнения

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

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

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

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

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

char b;

for (b = 'A'; b <= 'Z'; b++)

printf ("%c - %d\n", b, b);

Выполнение контрольных заданий

1. Получите у преподавателя индивидуальное задание.

2. Составьте блок-схему и программу на языке С и подберите тесты для проверки программы на компьютере.

3. Отладьте программу на компьютере.

5. Оформите и сдайте отчет.

Контрольные задания

1. Дан текст произвольной длины, оканчивающийся точкой с запятой. Подсчитать количество цифр в тексте.

2. Дана последовательность символов и количество символов в этой последовательности. Проверить, есть ли в тексте латинские буквы.

3. Дан текст произвольной длины, оканчивающийся символом ";". Проверить, есть ли в тексте скобки.

4. Дан текст заданной длины. Подсчитать количество сочетаний ":=".

5. Дан текст произвольной длины, оканчивающийся точкой. Текст состоит из слов, разделенных пробелами. Подсчитать

а) количество слов в тексте;

б) количество слов, начинающихся с буквы К;

в) количество слов, заканчивающихся буквой А.

6. Дано скобочное выражение, оканчивающееся точкой с запятой.

а) Проверить правильность расстановки скобок в выражении.

б) Подсчитать количество уровней вложенности скобок в выражении.

7. Дана строка символов. Признак конца - символ '\n' ( перевод строки).

а) Вывести символы строки без лишних пробелов, т.е. если подряд следует несколько пробелов, оставить только один.

б) Удалить последовательности символов, заключенные в фигурные скобки.

в) Вывести последовательности символов, заключенные в скобки. Каждую такую последовательность выводить с новой строки.

г) Проверить, есть ли одинаковые соседние символы.

д) Определить наибольшее число подряд идущих одинаковых символов.

е) Определить, каких символов больше: цифр или латинских букв.

61