Лабораторная работа № 1-15-16

advertisement
-1Информатика
Лабораторная работа 1-15-16
Лабораторная работа № 1-15-16
Работа с символьными строками в C
1. ЦЕЛЬ РАБОТЫ
Целью работы является разработка, отладка и выполнение программы на C для
операций над строками символов.
2. СОСТАВ РАБОЧЕГО МЕСТА
2.1. Оборудование: IBM-совместимый персональный компьютер (ПК).
2.2. Программное обеспечение: операционная система Windows, интегрированная
оболочка Dev C++.
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.
Функция
char *gets (имя-строки)
Файл: Document1 Создан: 16.10.2012 Модифицирован: 02.05.2016 Автор: Прищепа Т. А., Шонин
В.А.
-2Информатика
Лабораторная работа 1-15-16
получает строку из стандартного устройства ввода системы (обычно клавиатуры).
Поскольку строка не имеет заранее определенной длины, функция 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.
islower
Тест на буквы a-z.
isprint
Тест на печатаемые символы – 0x20-0x7e.
ispunct
Тест на символы – знаки пунктуации.
isspace
Тест на символ пробела.
Файл: Document1 Создан: 16.10.2012 Модифицирован: 02.05.2016 Автор: Прищепа Т. А., Шонин
В.А.
-3Информатика
Лабораторная работа 1-15-16
Имя функции
Действие функции
isupper
Тест на буквы A-Z.
isxdigit
Тест на шестнадцатеричную цифру – 0-9, A-F.
Функция tolower() с аргументом типа int проверяет, является
ли аргумент
прописной буквой и, если является, буква переводится в нижний регистр. В противном
случае функция возвращает значение аргумента.
Функция toupper() с аргументом типа int проверяет, является ли аргумент
строчной буквой и, если является, буква переводится в верхний регистр. В противном
случае функция возвращает значение аргумента.
Числа могут сохраняться как в форме строк, так и в форме цифр. Сохранение числа
в виде строки означает сохранение цифровых символов. Например, число 213 может быть
сохранено в массиве символьной строки в виде цифр '2', '1', '3', '\0'. Сохранение числа 213 в
цифровой форме означает сохранение его, например, в качестве значения типа int.
В языке C цифровая форма требуется для выполнения таких цифровых операций,
как сложение и сравнение, но отображение чисел на экране требует представления в
форме строки, поскольку на экране отображаются символы. Функции printf() и scanf() с
помощью своих спецификаций преобразуют цифровые формы в строковые и наоборот.
Преобразование строк в числа и чисел в строки выполняется с помощью
следующих функций, объявленных в разделе stdlib.h.
Прототип функции
Действие функции
double atof (char *string)
Возвращает число с плавающей точкой типа double
или 0, если преобразование невозможно.
int atoi (char *string)
Возвращает целое число или 0, если преобразование
невозможно.
long atol (char *string)
Возвращает целое число типа long или 0, если
преобразование невозможно.
char *itoa (int value, char *string,
int radix)
Преобразует целое число, заданное в аргументе
value, в строку символов *string в системе счисления
radix (2 < radix < 36).
char *ltoa ( long value, char
*string, int radix)
Аналогична функции itoa, но для длинных целых
чисел.
char *ultoa (unsigned long value,
char *string, int radix)
Аналогична функции itoa, но для длинных целых
чисел без знака.
Операции над строковыми переменными, определенные в разделе string.h
включают следующие функции:
Прототип функции
char *strcat (char *string1,
char *string2)
Действие функции
Возвращает строку, являющуюся конкатенацией строк
string1 и string2.
Файл: Document1 Создан: 16.10.2012 Модифицирован: 02.05.2016 Автор: Прищепа Т. А., Шонин
В.А.
-4Информатика
Лабораторная работа 1-15-16
Прототип функции
Действие функции
char *strchr (char *string,
int symbol)
Возвращает указатель на первое вхождение symbol в string
или NULL, если symbol не найден в string.
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)
Возвращает длину string в байтах.
char *strncat (char
*string1, char *string2, n)
Аналогична функции 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)
Возвращает указатель на первое вхождение любого символа
из string2 в string1 или NULL, если нет общих символов.
char *strrchr (char *string,
int symbol)
Возвращает указатель на последнее вхождение symbol в
string или NULL, если нет общих символов.
int strspn (char *string1,
char *string2)
Возвращает длину начальной подстроки string1, которая
содержит только символы из string2.
char *strstr (char *string1,
char *string2)
Возвращает указатель на первое вхождение строки string2 в
string1 или NULL, если вхождение не найдено.
Файл: Document1 Создан: 16.10.2012 Модифицирован: 02.05.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.
Определить функцию, заменяющую
все буквы нижнего регистра в строке
на буквы верхнего регистра.
Определить функцию анализа
строки, возвращающую 1, если
строка содержит только русский или
украинский текст, -1, если строка
содержит только текст латинскими
буквами и 0, если в тексте есть как
буквы кириллицы, так и латинские
буквы.
Выводимые данные
общее количество слов
в строке, количество
одинаковых слов в
строке
сообщение
"Правильное
выражение" или
"Нарушен баланс
<тип> скобок", где
тип - одно из слов:
фигурных, круглых
или квадратных
исходная
строка
преобразованная
строка
исходная
строка
одно из сообщений
"Русский или
украинский текст",
"Латинский текст" или
"Многоязычный текст"
Файл: Document1 Создан: 16.10.2012 Модифицирован: 02.05.2016 Автор: Прищепа Т. А., Шонин
В.А.
-6Информатика
Лабораторная работа 1-15-16
№
варианта
5.
6.
Операции над строками,
выполняемые в программе
Определить функцию,
подсчитывающую количество
повторений заданной буквы в строке
(буква может быть прописной или
строчной).
Определить функцию,
подсчитывающую количество
повторений заданной цифры в
строке.
7.
Определить функцию,
подсчитывающую количество
заглавных букв в строке.
8.
Определить позиции первого
символа заданного слова в исходной
строке (в строке может быть
несколько одинаковых слов).
9.
10.
11.
12.
Определить, является ли вводимая
строка целым числом, т.е. содержит
только цифры и, возможно, знак "+"
или "-", и определить тип числа (если
вводимое число больше 32767 или
меньше -32768, то тип числа long,
иначе int).
Определить, является ли вводимая
строка вещественным числом с целой
и дробной частью и, возможно,
знаком "+" или "-", и определить тип
числа (если вводимое число
содержит больше 7 значащих цифр,
то тип числа double, иначе float).
Проанализировать правильность
задания слов в строке. Слова в строке
могут состоять только из букв
(прописных или строчных) и цифр.
Разделителями между словами
служат пробелы и/или запятые.
Определить количество повторений
заданной строки в исходной строке
(без различия строчных и прописных
букв).
Вводимые
данные
Выводимые данные
исходная
строка,
проверяемая
буква
количество повторений
буквы в исходной
строке
исходная
строка,
проверяемая
цифра
исходная
строка,
заглавная
буква
количество повторений
цифры в исходной
строке
количества повторений
буквы в исходной
строке
исходная
строка,
проверяемое
слово
номера позиций
первого символа слова
в исходной строке или
сообщение о том, что
заданного слова нет в
строке
исходная
строка
число и его тип: "int"
или "long" или
сообщение о том, что
введенная строка не
является целым числом
исходная
строка
число и его тип:
"double" или "float"
или сообщение о том,
что введенная строка
не является
вещественным числом
исходная
строка
слова исходной строки
и сообщение о том,
является ли данное
слово правильным или
нет
исходная
строка,
строка
поиска
количество повторений
строки поиска в
исходной строке
Файл: Document1 Создан: 16.10.2012 Модифицирован: 02.05.2016 Автор: Прищепа Т. А., Шонин
В.А.
-7Информатика
Лабораторная работа 1-15-16
№
варианта
13.
14.
15.
16.
17.
18.
19.
20.
Операции над строками,
выполняемые в программе
Определить количество предложений
в исходной строке (разделителем
между предложениями являются
символы ".", "?", "!").
Проанализировать типы слов в
исходной строке (если слово
содержит только цифры и, возможно,
знак "+" или "-" впереди и
десятичную точку, то оно считается
типа "number", иначе "string").
Разделителями между словами
служат пробелы и/или запятые.
Убрать заданное слово из исходной
строки (без различия строчных и
прописных букв). В строке может
быть несколько одинаковых слов.
Поменять местами два слова в
исходной строке (если они оба есть в
строке). Игнорировать различие
между прописными и строчными
буквами.
Проверить правильность написания
слов в исходной строке (слово
считается правильным, если оно
содержит либо только русские и
украинские, либо только латинские
буквы).
Убрать лишние пробелы между
словами исходной строки (между
словами должен быть оставлен
только один разделитель).
Определить, содержится ли заданное
слово в исходной строке (без
различия строчных и прописных
букв). В строке может быть
несколько одинаковых слов.
Заменить заданное слово в исходной
строке на указанное слово (без
различия строчных и прописных
букв). В строке может быть
несколько одинаковых слов.
Вводимые
данные
Выводимые данные
исходная
строка
количество
предложений в
исходной строке
исходная
строка
слова строки и их
типы - "number" или
"string"
исходная
строка,
слово,
которое
надо
убрать
измененная строка
исходная
строка, два
слова
измененная строка или
сообщение о том, что
замены не
производились
исходная
строка
неправильные слова
или сообщение о том,
что текст не содержит
ошибок
исходная
строка
измененная строка
исходная
строка,
заданное
слово
номера позиций
первого символа слова
или сообщение о том,
что данного слова нет в
исходной строке
исходная
строка,
слово
поиска,
слово
замены
измененная строка и
сообщение о том,
производилась замена
или нет
Файл: Document1 Создан: 16.10.2012 Модифицирован: 02.05.2016 Автор: Прищепа Т. А., Шонин
В.А.
-8Информатика
Лабораторная работа 1-15-16
№
варианта
21.
22.
23.
24.
25.
26.
Операции над строками,
выполняемые в программе
Вводимые
данные
Заменить заданную подстроку в
исходной строке на указанную
строку (без различия строчных и
прописных букв). В строке может
быть несколько одинаковых
подстрок.
Убрать заданную подстроку из
исходной строки (без различия
строчных и прописных букв). В
строке может быть несколько
одинаковых подстрок.
Заменить первую букву предложения
на прописную, если она строчная.
Строка может содержать как русские
и украинские, так и латинские буквы.
Разделителем между предложениями
считаются символы ".", "?", "!".
Заменить все прописные буквы
внутри слов исходной строки (за
исключением первой буквы) на
строчные.
Отсортировать слова в исходной
строке по первой букве слова (без
различия строчных и прописных
букв). Исходный текст должен
содержать слова на русском языке и
первым символом должна быть
буква, иначе вывод сообщения и
исключение данного слова из
сортировки. Если слова в исходной
строке начинаются на одну и ту же
букву, они выводятся в порядке их
появления в исходной строке. Перед
сортировкой текст должен быть
переведен в нижний регистр.
исходная
строка,
строка
поиска,
строка
замены
исходная
строка,
строка,
которую
надо убрать
Форматировать слова исходной
строки влево по заданной длине
выводимой строки (если слово не
помещается полностью на данной
строке, оно переносится на первую
позицию следующей строки).
Выводимые данные
измененная строка и
сообщение о том,
производилась замена
или нет
измененная строка и
сообщение о том,
производилась замена
или нет
исходная
строка
измененная строка и
сообщение о том,
производилась замена
или нет
исходная
строка
измененная строка и
сообщение о том,
производилась замена
или нет
исходная
строка
строка, содержащая
слова исходной строки
в алфавитном порядке
и строка
нераспознанных слов
исходная
строка,
максимальный
размер
выводимой
строки
отформатированные
строки
Файл: Document1 Создан: 16.10.2012 Модифицирован: 02.05.2016 Автор: Прищепа Т. А., Шонин
В.А.
-9Информатика
Лабораторная работа 1-15-16
№
варианта
27.
28.
29.
30.
Операции над строками,
выполняемые в программе
Вывести строку заголовка с
разрядкой. Разделителем между
словами заголовка считаются
пробелы. Текст в исходной строке
должен быть переведен в заглавные
буквы и между буквами слов должно
быть введено nspace пробелов, а
между словами - 2*nspace+1
пробелов. Слова в заголовке могут
содержать как русские и украинские,
так и латинские буквы.
Проверить, являются ли слова в
исходной строке правильными
идентификаторами переменных
языка С. Идентификатор языка С это последовательность латинских
букв, цифр и символов
подчеркивания, которая начинается с
буквы или символа подчеркивания.
Определить количество слов в
исходной строке, начинающихся на
заданную букву (без различия
строчных и прописных букв).
Определить количество символов в
словах исходной строки (без учета
символов-разделителей).
31.
Написать программу-переводчик,
осуществляющую поиск заданного
слова в исходной строке и, если
слово найдено, вывод его перевода
(слова с тем же индексом в строке
перевода).
32.
Вывести строку, содержащую
отсортированные в порядке
возрастания буквы исходной строки
(без различия строчных и прописных
букв). Если в строке содержатся
несколько одинаковых букв,
выводится только одна буква
33.
Вывести строку, являющуюся
пересечением двух строк (в
пересечении содержатся только те
символы, которые есть в обеих
строках)
Вводимые
данные
Выводимые данные
строка
заголовка,
значение n.
заголовок с разрядкой
исходная
строка
строка, содержащая
правильные
идентификаторы и
строка, содержащая
ошибочные
идентификаторы
исходная
строка,
буква
исходная
строка
строка
исходных
слов, строка
слов
перевода,
исходное
слово
исходная
строка
(должна
содержать
только
буквы
латинского
алфавита)
две
исходные
строки
количество слов в
исходной строке,
начинающихся на
заданную букву
количество символов в
словах исходной
строки
перевод слова или
сообщение о том, что
данного слова нет в
исходной строке
результирующая
строка
строка пересечения
Файл: Document1 Создан: 16.10.2012 Модифицирован: 02.05.2016 Автор: Прищепа Т. А., Шонин
В.А.
- 10 Информатика
Лабораторная работа 1-15-16
№
варианта
Операции над строками,
выполняемые в программе
Вводимые
данные
Выводимые данные
34.
Определить количество повторений
заданных символов в исходной
строке
исходная
строка,
строка
символ
Количество
повторений для
каждого символа
строки
35.
Вывести для каждой из введенных
двух строк строку, в которой
содержатся только те символы,
которые есть только в данной строке
две
исходные
строки
две результирующие
строки
2. Введите программу с клавиатуры в среде Dev C++.
3. Выполните отладку программы и запустите ее на выполнение. Протестируйте
программу для ошибочных и правильных значений исходных данных.
4. Покажите преподавателю программу и результаты ее работы (при ошибочных
и правильных значениях исходных данных) и скопируйте текст программы и результаты
работы программы в окно текстового редактора Блокнот с заголовками "Текст
программы имя-программы" и "Результат работы программы имя-программы".
5. Скопируйте полученный в окне текстового редактора Блокнот документ на
свою дискету или флэш-карту.
5. СОДЕРЖАНИЕ ОТЧЕТА
В отчете должно быть представлено содержимое созданного вами документа.
6. ВОПРОСЫ ДЛЯ САМОКОНТРОЛЯ
1. Как выполняют ввод-вывод символов функции getchar() и putchar()?
2. Как определяется строка для ввода в языке C?
3. Какие функции используются в C для ввода и вывода строк и как они
работают?
4. Какие группы функций для операций над символами и строками символов
имеются в стандартной библиотеке C?
5. Какие тесты для символов можно выполнить с помощью функций C?
6. Какие функции C осуществляют преобразование чисел в строки и обратные
преобразования?
7. Какие операции над строками символов можно выполнить в C?
8. Как функция strtok() выполняет анализ слов в строке?
Файл: Document1 Создан: 16.10.2012 Модифицирован: 02.05.2016 Автор: Прищепа Т. А., Шонин
В.А.
Download