Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Лекция 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