Тема: Обработка символьной информации и строк
(4 часа)
Для представления текстовой информации в языке С используются символы (константы), символьные переменные и строки (строковые константы), для которых в языке С не введено отдельного типа в отличие от некоторых других языков программирования.
Символьные константы используются для изображения отдельных знаков, имеющих индивидуальные внутренние коды. Символьная константа – это лексема, которая состоит из изображения символа и ограничивающих апострофов, например: ‘A’, ‘b’, ‘+’, ‘1’, ‘@’ и т. д. Внутри апострофов кроме символов изображаемых на дисплее или принтере в текстовом режиме можно использовать коды не имеющие графического представления на экране дисплея, принтере или клавиатуре. Для изображения в программе таких символьных констант используются комбинации из нескольких символов, имеющих графическое представление. Такие комбинации носят название управляющих последовательностей. В языке С существуют следующие управляющие последовательности:
‘\n’ – перевод строки;
‘\t’ – горизонтальная табуляция;
‘\r’ – возврат каретки к началу строки;
‘\\’ – обратная косая черта \;
‘\’’– апостроф;
‘\”’ – кавычка;
‘\0’ – нулевой символ;
‘\a’ – сигнал-звонок;
‘\ddd’ – восьмеричное представление любой символьной константы;
‘\xhhh’ – шестнадцатеричное представление любой символьной константы.
Все символьные константы имеют значение целого типа, совпадающие с кодом символа в кодировке ASCII.
Для символьных данных веден базовый тип char. Описание символьных переменных имеет вид:
сhar список_имен_переменных
Для ввода и вывода символьных данных в форматных строках библиотечных функций printf(), scanf() используется спецификация преобразования %c.
Кроме функций printf(), scanf() для ввода и вывода символов предусмотрены специальные функции обмена:
getchar() – чтение одного сивола из входного потока;
putchar(X) – вывод символьного значения Х в стандартный выходной поток.
Пример использования символьных констант:
#include<stdio.h>
void main (){
char a=’A’, b=’*’,c=’\a’,d=’\07’, e=’\x07’;
printf(“a=%c b=%c c=%c d=%c e=%c”,a,b,c,d,e);}
Строковая константа определяется как последовательность символов, заключенных в двойные кавычки, например: “Строка”. Среди символов могут быть эскейп-последовательности, т. е. сочетания знаков, соответствующие неизображаемым символам, или символам, задаваемым их внутренними кодами. Например: “\nСтрока с использованием управляющих кодов. \n”.
Все символы строки размещаются в памяти подряд, и каждый символ (в том числе представленный эскейп-последовательностями) занимает ровно один байт. В конце записи строковой константы компилятор помещает символ ‘\0’.
Строка – это массив символов, т. е. она всегда имеет тип char[]. Количество элементов в таком массиве на один больше, чем в изображении соответствующей строковой константы.
Присвоить значение массиву символов с помощью обычного оператора присваивания нельзя. Поместить строку в массив можно при инициализации.
Таким образом, описание строки может быть выполнено одним из следующих способов:
char string1[50]; – где 50 – максимальное допустимое количество символов в строке.
char string2[]={‘С’, ‘т’, ‘р’, ‘о’, ‘к’, ‘а’, ‘1’, ‘.’, ‘\0’}; – помещение строки в массив при инициализации.
char string3[] =”Еще один пример строки, описанной при инициализации”;
Кроме перечисленных способов поместить строку в массив можно с помощью функций ввода. В функциях printf(), scanf() для символьных строк используется спецификация преобразования %s.
char str[]=”String one”;
printf(“%s”,str);
Работа с символьными строками – это работа с массивами типа char. При этом следует помнить об обязательном присутствии в конце строки символа ‘\0’.
Кроме описанных выше, существует еще один способ описания строковых констант. Такой способ возможен только для массивов символов и выглядит следующим образом:
char *str;
char *str1=”Строка, описанная при помощи указателя.”;
Использование указателей, а не массивов фиксированной длины целесообразно, когда предложения или слова должны быть разной длины.
Пример:
#include<stdio.h>
void main (){
char *str[] ={“Обработка”, “предложений”, “или”, “слов”, “каждое”, “из”, “которых”, “представлено”, “в”, “виде”, “строки”, “.”};
int i,n;
n=sizeof(str)/sizeof(str[0]);
for (i=0;i<n;i++)
printf(“%s”,str[i]);}
Вопросы:
1.Понятие символьных данных и строк.
2.Способы задания строки.
3.Инициализация строк.
4.Ввод/вывод символьных данных.
5.Строки и указатели.
6.Эскейп-последовательности.
Задание на выполнение:
1. Определить долю пробелов в заданной строке.
2. Удалить из заданного слова все буквы “а”.
3. Определить количество предложений в заданном тексте (предложение заканчивается либо точкой, либо вопросительным или восклицательным знаком).
4. Для каждого из слов заданного предложения указать, сколько раз оно встречается в предложении.
5. Из заданного предложения удалить слова, которые встречались в нем раньше.
6. Отредактировать заданное предложение, удаляя из него слова с четными номерами.
7. Найти самое длинное и самое короткое слово в заданном предложении.
8. В заданной последовательности слов найти все слова, имеющие заданное окончание.
9. В заданной последовательности слов найти все слова, начинающиеся с заданной приставки.
10. В заданном предложении указать слово, для которого доля гласных максимальна.
11. В заданную упорядоченную в лексикографическом (алфавитном) порядке последовательность слов вставить новое заданное слово так, чтобы лексикографический порядок сохранился.
12. Дан текст из цифр и строчных латинских букв. Определить, каких букв – гласных или согласных – больше в тексте.
13. Проверить, является ли заданное слово названием времени года на русском языке.
14. Дана последовательность слов, в которых слова разделены запятыми, а за последним словом – точка. Напечатать эту же последовательность слов в обратном порядке. Указать для всех различных слов число вхождений в последовательность.
15. Из заданного текста выбрать и напечатать те символы, которые встречаются в нем ровно один раз (в том порядке, как они встречаются в тексте).
ЛАБОРАТОРНАЯ РАБОТА №7