Лабораторная работа № 1-15 Работа с символьными строками в C

advertisement
-1Информатика
Лабораторная работа 1-15-16
Лабораторная работа № 1-15
Работа с символьными строками в C
1. ЦЕЛЬ РАБОТЫ
Целью работы является разработка, отладка и выполнение программы на C для
операций над строками символов.
2. СОСТАВ РАБОЧЕГО МЕСТА
2.1. Оборудование: IBM-совместимый персональный компьютер (ПК).
2.2. Программное обеспечение: операционная система Windows, интегрированная
оболочка BorlandC++.
3. КРАТКИЕ ТЕОРЕТИЧЕСКИЕ СВЕДЕНИЯ
3.1. Ввод и вывод символов и строк
Чтение одного символа с клавиатуры можно выполнить как с помощью функции
scanf(), та и с помощью функции
int getchar (void)
Эта функция не имеет параметров (часто параметр void опускается) и возвращает
следующий символ ввода.
Функция
int putchar (int)
выводит символ на экран дисплея и, в качестве результата, возвращает посланный символ.
Функцию getchar() можно использовать для ввода нескольких символов.
Ввод символов будет продолжаться до тех пор, пока во входном потоке не
встретится символ точки.
Функция getchar() распознает в качестве вводимого символа также символ
конца файла (при вводе с клавиатуры в MS DOS и Windows этот символ генерируется при
нажатии клавиш Ctrl+Z). Конец файла задается в C с помощью константы EOF, которая,
как и функции getchar() и putchar(), определены в stdio.h. Кроме того, функция
возвращает символ EOF в том случае, если при выводе символа произошла ошибка.
Если необходимо ввести значение строки в программе, вначале нужно
зарезервировать место в памяти для ее хранения, а затем использовать функцию ввода для
загрузки строки.
Простейшее решение этой проблемы – включить в объявление явное указание
размера массива.
Для ввода и вывода строк, помимо функций scanf() и printf() можно
использовать также функции gets() и puts(). Эти функции также находится в разделе
stdio.h стандартной библиотеки языка C.
Файл: 308820976 Создан: 29.11.1998 Модифицирован: 25.01.2016 Автор: Шонин В.А.
-2Информатика
Лабораторная работа 1-15-16
Функция
char *gets (имя-строки)
получает строку из стандартного устройства ввода системы (обычно клавиатуры).
Поскольку строка не имеет заранее определенной длины, функция gets() нуждается в
способе определения момента прекращения своей работы. Она считывает символы до тех
пор, пока не достигнет символа перевода строки "\n", который генерируется путем
нажатия клавиши Enter. Функция принимает все символы вплоть до символа перевода
строки (но, не включая его), дописывает нулевой символ "\0" и передает строку
вызывающей программе.
Сам символ перевода строки считывается и отбрасывается, поэтому следующее
считывание начинается с начала следующей строки. Функция gets() возвращает
значение указателя на введенную строку, что можно использовать для обработки строки.
Если файл ввода закончен или обнаружена ошибка, функция gets() возвращает
значение NULL.
Функция
int puts(имя-строки);
выводит строку на стандартное устройство вывода системы (обычно дисплей). В отличие
от функции printf(), при выводе функция puts() автоматически осуществляет переход на новую строку. Функция puts() прекращает вывод, встретив символ "\0", поэтому
необходимо, чтобы строка содержала такой символ. Функция возвращает последний
записанный символ "\n" или EOF (в случае ошибки).
3.2. Функции обработки символов и строк символов
В стандартной библиотеке C есть следующие группы функций, оперирующих с
символами и строками символов:
 проверка символов и преобразование символов (раздел ctype.h);
 преобразование строк в числовые данные и обратные преобразования (раздел
stdlib.h);
 операции над строками (раздел string.h);
 операции над буферными областями (разделы string.h и mem.h).
Для функций определения класса символов, описанных в стандартной
библиотеке, в качестве аргумента задаются значения типа int (проверяется только
младший байт аргумента). Возвращаемое значение (типа int) равно 0, если условие
проверки не выполняется и отлично от нуля в противном случае. В разделе библиотеки
ctype.h определены следующие функции:
Имя функции
Действие функции
isalnum
Тест на символы A-Z, a-z, 0-9.
isalpha
Тест на буквы A-Z, a-z.
iscntrl
Тест на управляющие символы с кодами 0x00 – 0x1f и 0x7f.
isdigit
Тест на цифры 0-9.
isgraph
Тест на печатаемые символы, исключая пробел – 0x21 - 0x7e.
Файл: 308820976 Создан: 29.11.1998 Модифицирован: 25.01.2016 Автор: Шонин В.А.
-3Информатика
Лабораторная работа 1-15-16
Имя функции
Действие функции
islower
Тест на буквы a-z.
isprint
Тест на печатаемые символы – 0x20-0x7e.
ispunct
Тест на символы – знаки пунктуации.
isspace
Тест на символ пробела.
isupper
Тест на буквы A-Z.
isxdigit
Тест на шестнадцатеричную цифру – 0-9, A-F.
Функция tolower() с аргументом типа int проверяет, является ли аргумент
прописной буквой и, если является, буква переводится в нижний регистр. В противном
случае функция возвращает значение аргумента.
Функция toupper() с аргументом типа int проверяет, является ли аргумент
строчной буквой и, если является, буква переводится в верхний регистр. В противном
случае функция возвращает значение аргумента.
Числа могут сохраняться как в форме строк, так и в форме цифр. Сохранение числа
в виде строки означает сохранение цифровых символов. Например, число 213 может быть
сохранено в массиве символьной строки в виде цифр '2', '1', '3', '\0'. Сохранение числа
213 в цифровой форме означает сохранение его, например, в качестве значения типа int.
В языке C цифровая форма требуется для выполнения таких цифровых операций,
как сложение и сравнение, но отображение чисел на экране требует представления в
форме строки, поскольку на экране отображаются символы. Функции printf() и
scanf() с помощью своих спецификаций преобразуют цифровые формы в строковые и
наоборот.
Преобразование строк в числа и чисел в строки выполняется с помощью
следующих функций, объявленных в разделе stdlib.h.
Прототип функции
Действие функции
char *ltoa ( long value,
char *string, int radix)
Возвращает число с плавающей точкой типа double
или 0, если преобразование невозможно.
Возвращает целое число или 0, если преобразование
невозможно.
Возвращает целое число типа long или 0, если
преобразование невозможно.
Преобразует целое число, заданное в аргументе
value, в строку символов *string в системе
счисления radix (2 < radix < 36).
Аналогична функции itoa, но для длинных целых
чисел.
char *ultoa (unsigned
long value, char
*string, int radix)
Аналогична функции itoa, но для длинных целых
чисел без знака.
double atof (char
*string)
int atoi (char *string)
long atol (char *string)
char *itoa (int value,
char *string, int radix)
Файл: 308820976 Создан: 29.11.1998 Модифицирован: 25.01.2016 Автор: Шонин В.А.
-4Информатика
Лабораторная работа 1-15-16
Операции над строковыми переменными, определенные в разделе string.h
включают следующие функции:
Прототип функции
Действие функции
char *strcat (char
*string1, char
*string2)
char *strchr (char
*string, int
symbol)
Возвращает строку, являющуюся конкатенацией строк
string1 и string2.
int strcmp (char
*string1, char
*string2)
Возвращает значение, большее 0, если string1>string2,
равное 0, если string1==string2 и меньшее 0, если
string1<string2.
char *strcpy (char
*string1, char
*string2)
Копирует string2 в string1 и возвращает string1.
int strcspn (char
*string1, char
*string2)
Возвращает длину начальной подстроки string1, не
содержащей ни одного символа из string2.
int strlen (char
*string)
char *strncat (char
*string1, char
*string2, n)
Возвращает указатель на первое вхождение symbol в
string или NULL, если symbol не найден в string.
Возвращает длину string в байтах.
Аналогична функции strcat(), но оперирует с n
символами строки string2.
int strncmp (char
*string1, char
*string2, n)
Аналогична функции strcmp(), но оперирует с n
символами строки string2.
char *strncpy (char
*string1, char
*string2, n)
Аналогична strcpy(), но оперирует с n символами строки
string2.
char *strset (char
*string, int
symbol)
Возвращает строку string, заполненную символами
symbol.
char *strpbrk (char
*string1, char
*string2)
char *strrchr (char
*string, int
symbol)
int strspn (char
*string1, char
*string2)
Возвращает указатель на первое вхождение любого символа
из string2 в string1 или NULL, если нет общих
символов.
char *strstr (char
*string1, char
*string2)
Возвращает указатель на первое вхождение строки
string2 в string1 или NULL, если вхождение не
найдено.
Возвращает указатель на последнее вхождение symbol в
string или NULL, если нет общих символов.
Возвращает длину начальной подстроки string1, которая
содержит только символы из string2.
Файл: 308820976 Создан: 29.11.1998 Модифицирован: 25.01.2016 Автор: Шонин В.А.
-5Информатика
Лабораторная работа 1-15-16
Прототип функции
char *strtok (char
*string1, char
*string2)
Действие функции
При первом вызове функции для заданного значения
параметра string1 и строки string2, содержащей
символы-разделители слов для string, производится
возврат указателя на первый символ string1. Чтобы найти
начало следующего слова в string1, необходимо вызвать
функцию со значением NULL для string1. Когда все слова
в string1 исчерпаны, возвращается NULL.
4. ПОРЯДОК ВЫПОЛНЕНИЯ РАБОТЫ
Порядок выполнения работы:
1. Выполнить операции над символьными строками по одному из вариантов,
приведенных в следующей таблице. Если операции над строками выполняются в
функции, в функции main() организуется ввод исходных данных, вызов функции и
вывод результата. Буквы в строках (если не указано иначе) могут быть латинскими,
русскими и украинскими. Если в качестве исходного данного вводится слово, оно не
должно содержать символов-разделителей.
№
варианта
1.
2.
3.
4.
5.
6.
Операции над строками,
выполняемые в программе
Определить количество одинаковых слов в
исходной строке.
Составить программу, определяющую
правильность задания скобочного
выражения (количество открывающих
скобок должно быть равно количеству
закрывающих скобок – круглых, фигурных
или квадратных).
Определить функцию, заменяющую все
буквы нижнего регистра в строке на буквы
верхнего регистра.
Определить функцию анализа строки,
возвращающую 1, если строка содержит
только русский или украинский текст, -1,
если строка содержит только текст
латинскими буквами и 0, если в тексте есть
как буквы кириллицы, так и латинские
буквы.
Определить функцию, подсчитывающую
количество повторений заданной буквы в
строке (буква может быть прописной или
строчной).
Определить функцию, подсчитывающую
количество повторений заданной цифры в
строке.
Вводимые
данные
исходная
строка
исходная
строка
Выводимые данные
общее количество слов в
строке, количество
одинаковых слов в строке
сообщение "Правильное
выражение" или "Нарушен
баланс <тип> скобок", где
тип - одно из слов:
фигурных, круглых или
квадратных
исходная
строка
преобразованная строка
исходная
строка
одно из сообщений
"Русский или украинский
текст", "Латинский текст"
или "Многоязычный текст"
исходная
строка,
проверяемая
буква
исходная
строка,
проверяемая
цифра
количество повторений
буквы в исходной строке
количество повторений
цифры в исходной строке
Файл: 308820976 Создан: 29.11.1998 Модифицирован: 25.01.2016 Автор: Шонин В.А.
-6Информатика
Лабораторная работа 1-15-16
№
варианта
Операции над строками,
выполняемые в программе
Вводимые
данные
Выводимые данные
7.
Определить функцию, подсчитывающую
количество заглавных букв в строке.
исходная
строка,
заглавная
буква
количества повторений
буквы в исходной строке
8.
Определить позиции первого символа
заданного слова в исходной строке (в строке
может быть несколько одинаковых слов).
исходная
строка,
проверяемое
слово
номера позиций первого
символа слова в исходной
строке или сообщение о
том, что заданного слова
нет в строке
исходная
строка
число и его тип: "int" или
"long" или сообщение о
том, что введенная строка
не является целым числом
исходная
строка
число и его тип: "double"
или "float" или
сообщение о том, что
введенная строка не
является вещественным
числом
исходная
строка
слова исходной строки и
сообщение о том, является
ли данное слово
правильным или нет
исходная
строка, строка
поиска
количество повторений
строки поиска в исходной
строке
исходная
строка
количество предложений в
исходной строке
исходная
строка
слова строки и их типы "number" или "string"
исходная
строка, слово,
которое надо
убрать
измененная строка
исходная
строка, два
слова
измененная строка или
сообщение о том, что
замены не производились
исходная
строка
неправильные слова или
сообщение о том, что текст
не содержит ошибок
9.
10.
11.
12.
13.
14.
15.
16.
17.
Определить, является ли вводимая строка
целым числом, т.е. содержит только цифры
и, возможно, знак "+" или "-", и определить
тип числа (если вводимое число больше
32767 или меньше -32768, то тип числа
long, иначе int).
Определить, является ли вводимая строка
вещественным числом с целой и дробной
частью и, возможно, знаком "+" или "-", и
определить тип числа (если вводимое число
содержит больше 7 значащих цифр, то тип
числа double, иначе float).
Проанализировать правильность задания
слов в строке. Слова в строке могут состоять
только из букв (прописных или строчных) и
цифр. Разделителями между словами служат
пробелы и/или запятые.
Определить количество повторений
заданной строки в исходной строке (без
различия строчных и прописных букв).
Определить количество предложений в
исходной строке (разделителем между
предложениями являются символы ".",
"?", "!").
Проанализировать типы слов в исходной
строке (если слово содержит только цифры
и, возможно, знак "+" или "-" впереди и
десятичную точку, то оно считается типа
"number", иначе "string"). Разделителями
между словами служат пробелы и/или
запятые.
Убрать заданное слово из исходной строки
(без различия строчных и прописных букв).
В строке может быть несколько одинаковых
слов.
Поменять местами два слова в исходной
строке (если они оба есть в строке).
Игнорировать различие между прописными
и строчными буквами.
Проверить правильность написания слов в
исходной строке (слово считается
правильным, если оно содержит либо только
русские и украинские, либо только
латинские буквы).
Файл: 308820976 Создан: 29.11.1998 Модифицирован: 25.01.2016 Автор: Шонин В.А.
-7Информатика
Лабораторная работа 1-15-16
№
варианта
Операции над строками,
выполняемые в программе
Вводимые
данные
18.
Убрать лишние пробелы между словами
исходной строки (между словами должен
быть оставлен только один разделитель).
исходная
строка
19.
Определить, содержится ли заданное слово в
исходной строке (без различия строчных и
прописных букв). В строке может быть
несколько одинаковых слов.
исходная
строка,
заданное слово
20.
21.
Заменить заданное слово в исходной строке
на указанное слово (без различия строчных и
прописных букв). В строке может быть
несколько одинаковых слов.
Заменить заданную подстроку в исходной
строке на указанную строку (без различия
строчных и прописных букв). В строке
может быть несколько одинаковых подстрок.
исходная
строка, слово
поиска, слово
замены
исходная
строка, строка
поиска, строка
замены
исходная
строка,
строка,
которую надо
убрать
Выводимые данные
измененная строка
номера позиций первого
символа слова или
сообщение о том, что
данного слова нет в
исходной строке
измененная строка и
сообщение о том,
производилась замена или
нет
измененная строка и
сообщение о том,
производилась замена или
нет
22.
Убрать заданную подстроку из исходной
строки (без различия строчных и прописных
букв). В строке может быть несколько
одинаковых подстрок.
23.
Заменить первую букву предложения на
прописную, если она строчная. Строка
может содержать как русские и украинские,
так и латинские буквы. Разделителем между
предложениями считаются символы ".",
"?", "!".
исходная
строка
измененная строка и
сообщение о том,
производилась замена или
нет
24.
Заменить все прописные буквы внутри слов
исходной строки (за исключением первой
буквы) на строчные.
исходная
строка
измененная строка и
сообщение о том,
производилась замена или
нет
25.
Отсортировать слова в исходной строке по
первой букве слова (без различия строчных и
прописных букв). Исходный текст должен
содержать слова на русском языке и первым
символом должна быть буква, иначе вывод
сообщения и исключение данного слова из
сортировки. Если слова в исходной строке
начинаются на одну и ту же букву, они
выводятся в порядке их появления в
исходной строке. Перед сортировкой текст
должен быть переведен в нижний регистр.
исходная
строка
строка, содержащая слова
исходной строки в
алфавитном порядке и
строка нераспознанных
слов
26.
Форматировать слова исходной строки влево
по заданной длине выводимой строки (если
слово не помещается полностью на данной
строке, оно переносится на первую позицию
следующей строки).
исходная
строка, максимальный
размер
выводимой
строки
измененная строка и
сообщение о том,
производилась замена или
нет
отформатированные строки
Файл: 308820976 Создан: 29.11.1998 Модифицирован: 25.01.2016 Автор: Шонин В.А.
-8Информатика
Лабораторная работа 1-15-16
№
варианта
27.
28.
29.
30.
31.
32.
33.
Операции над строками,
выполняемые в программе
Вывести строку заголовка с разрядкой.
Разделителем между словами заголовка
считаются пробелы. Текст в исходной строке
должен быть переведен в заглавные буквы и
между буквами слов должно быть введено
nspace пробелов, а между словами 2*nspace+1 пробелов. Слова в заголовке
могут содержать как русские и украинские,
так и латинские буквы.
Проверить, являются ли слова в исходной
строке правильными идентификаторами
переменных языка С. Идентификатор языка
С - это последовательность латинских букв,
цифр и символов подчеркивания, которая
начинается с буквы или символа
подчеркивания.
Определить количество слов в исходной
строке, начинающихся на заданную букву
(без различия строчных и прописных букв).
Определить количество символов в словах
исходной строки (без учета символовразделителей).
Написать программу-переводчик,
осуществляющую поиск заданного слова в
исходной строке и, если слово найдено,
вывод его перевода (слова с тем же индексом
в строке перевода).
Вывести строку, содержащую
отсортированные в порядке возрастания
буквы исходной строки (без различия
строчных и прописных букв). Если в строке
содержатся несколько одинаковых букв,
выводится только одна буква
Вывести строку, являющуюся пересечением
двух строк (в пересечении содержатся
только те символы, которые есть в обеих
строках)
Вводимые
данные
Выводимые данные
строка
заголовка,
значение n.
заголовок с разрядкой
исходная
строка
строка, содержащая
правильные
идентификаторы и строка,
содержащая ошибочные
идентификаторы
исходная
строка, буква
количество слов в исходной
строке, начинающихся на
заданную букву
исходная
строка
количество символов в
словах исходной строки
строка
исходных слов,
строка слов
перевода,
исходное слово
исходная
строка (должна
содержать
только буквы
латинского
алфавита)
перевод слова или
сообщение о том, что
данного слова нет в
исходной строке
результирующая строка
две исходные
строки
строка пересечения
34.
Определить количество повторений
заданных символов в исходной строке
исходная
строка, строка
символ
Количество повторений для
каждого символа строки
35.
Вывести для каждой из введенных двух
строк строку, в которой содержатся только
те символы, которые есть только в данной
строке
две исходные
строки
две результирующие строки
2. Введите программу с клавиатуры в среде BorlandC++.
3. Выполните отладку программы и запустите ее на выполнение. Протестируйте
программу для ошибочных и правильных значений исходных данных.
4. Покажите преподавателю программу и результаты ее работы (при ошибочных
и правильных значениях исходных данных) и скопируйте текст программы и результаты
Файл: 308820976 Создан: 29.11.1998 Модифицирован: 25.01.2016 Автор: Шонин В.А.
-9Информатика
Лабораторная работа 1-15-16
работы программы в окно текстового редактора Блокнот с заголовками "Текст
программы имя-программы" и "Результат работы программы имя-программы".
5. Скопируйте полученный в окне текстового редактора Блокнот документ на
свою дискету или флэш-карту.
5. СОДЕРЖАНИЕ ОТЧЕТА
В отчете должно быть представлено содержимое созданного вами документа.
6. ВОПРОСЫ ДЛЯ САМОКОНТРОЛЯ
1. Как выполняют ввод-вывод символов функции getchar() и putchar()?
2. Как определяется строка для ввода в языке C?
3. Какие функции используются в C для ввода и вывода строк и как они
работают?
4. Какие группы функций для операций над символами и строками символов
имеются в стандартной библиотеке C?
5. Какие тесты для символов можно выполнить с помощью функций C?
6. Какие функции C осуществляют преобразование чисел в строки и обратные
преобразования?
7. Какие операции над строками символов можно выполнить в C?
8. Как функция strtok() выполняет анализ слов в строке?
Файл: 308820976 Создан: 29.11.1998 Модифицирован: 25.01.2016 Автор: Шонин В.А.
Related documents
Download