Добавил:
baraevaliza
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Лабы и курсачи 2022-2023 / 1 сем / Baraeva_Elizaveta_cw
.pdf
МИНОБРНАУКИ РОССИИ
САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ
ЭЛЕКТРОТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
«ЛЭТИ» ИМ. В.И. УЛЬЯНОВА (ЛЕНИНА)
Кафедра МО ЭВМ
КУРСОВАЯ РАБОТА
по дисциплине «Программирование»
Тема: Работа со строками в языке Си
Студентка гр. 2383
Бараева Е.Н.
Преподаватель
Гаврилов А.В.
Санкт-Петербург
2022

2
ЗАДАНИЕ
НА КУРСОВУЮ РАБОТУ
Студентка Бараева Е.Н.
Группа 2383
Тема работы: Работа со строками в языке Си
Исходные данные:
Программе на вход подается текст (текст представляет собой
предложения, разделенные точкой. Предложения - набор слов, разделенные
пробелом или запятой, слова - набор латинских букв, и цифр. Длина текста и
каждого предложения заранее не известна.
Программа должна сохранить этот текст в динамический массив строк и
оперировать далее только с ним.
Программа должна найти и удалить все повторно встречающиеся
предложения (сравнивать их следует посимвольно, но без учета регистра).
Далее, программа должна запрашивать у пользователя одно из
следующих доступных действий (программа должна печатать для этого
подсказку. Также следует предусмотреть возможность выхода из программы):
1) Найти во всем тексте даты, записанные в подстроке вида
“d<day>m<month>y<year>” и вывести все даты по возрастанию в формате
“DD:MM:YYYY”. Пример даты в тексте, “d14m03y0988”.
2) Удалить все предложения, в которых количество слов нечетно.
3) Преобразовать все слова в которых нет цифр так, чтобы все буквы
кроме последней были прописными.
4) Вывести все предложения, в которых нет заглавных букв.
Все сортировки должны осуществляться с использованием функции
стандартной библиотеки. Использование собственных функций, при наличии
аналога среди функций стандартной библиотеки, запрещается.

3
Все подзадачи, ввод/вывод должны быть реализованы в виде отдельной
функции.
Содержание пояснительной записки:
Содержание, Введение, Реализация, Примеры, Заключение, Список
использованных источников, Приложение А.
Предполагаемый объем пояснительной записки:
Не менее 10 страниц.
Дата выдачи задания: 20.10.2022
Дата сдачи реферата: 17.12.2022
Дата защиты реферата: 19.12.2022
Студентка
Бараева Е.Н.
Преподаватель
Гаврилов А.В.

4
АННОТАЦИЯ
Программа сохраняет текст в динамический двумерный массив строк,
далее оперируя только с ним. После чего удаляет все повторно встречающиеся
предложения. Каждая подзадача была реализована в отдельной функции.
Взаимодействие с пользователем происходит через интерфейс командной
строки. Для выполнения каждой задачи программ считывает число в диапазоне
от 0 до 5 (1 – 4 подзадачи, которые требовалось реализовать по заданию, 0 –
завершает программу, а 5 – печатает текст на экран). Все остальные символы
являются некорректными, и программа для них выводит предупреждение о
некорректности ввода.

5
СОДЕРЖАНИЕ
Введение
6
1.
Реализация
7
1.1.
Описание программного кода
7
1.2.
Соглашение
10
2.
Примеры
11
2.1.
Удаление повторяющихся предложений
11
2.2.
Поиск дат, вывод их по возрастанию
11
2.3.
Удаление всех предложений с нечетным количеством слов
11
2.4.
Преобразование всех слов в которых нет цифр
11
2.5.
Вывод всех предложений, в которых нет заглавных букв
12
Заключение
13
Список использованных источников
14
Приложение А. Исходный код программы
15

6
ВВЕДЕНИЕ
Цель работы.
Целью данной работы является создание программы на языке Си, которая
корректно работает с динамической памятью, строками, выполняет
необходимые подзадачи.
Задачи.
Для достижения поставленной цели требуется решить следующие задачи:
освоить работу с динамической памятью в Си; научиться исправлять проблемы,
которые могут возникнуть при некорректной работе с памятью; научиться
работать с документацией языка и изучить библиотеки для работы со строками
(string.h) и символами (ctype.h).

7
1. РЕАЛИЗАЦИЯ
1.1. Описание программного кода
Для реализации курсовой работы были импортированы библиотеки:
stdio.h, ctype.h, stdlib.h, string.h. Далее объявляются макроопределения
SENTENCE_SIZE и TEXT_SIZE, используемые для выделения динамической
памяти. Программа логически разбита по функциям: input_sentence, input_text,
print_text, free_text, delete_null_sentences, delete_same_sentences,
delete_sentences_with_odd_words, print_sentences_without_capital_letters, comp,
output_of_dates, convert_words_without_numbers, hint, select_action, main.
1.1.1) input_sentence:
Функция принимает на вход указатель на предложение (массив
символов). Затем с помощью функции malloc она динамически выделяет память
под новое предложение, после чего посимвольно заполняет его, пока на вход не
встретится символ «.» или «\n». В случае если символ равен «.», то
предложение считается законченным, если символ равен «\n», то ввод
считается оконченным, если в начале предложения встречаются пробелы, то
функция не записывает их. Также функция динамически выделит необходимую
память с помощью функции realloc, при необходимости. В конце записываются
символы «.» и «\0». Функция возвращает либо 1, либо -1, в зависимости от того,
закончен ввод или нет.
1.1.2) input_text:
Функция принимает на вход указатель на текст (массив строк). Затем с
помощью функции malloc она динамически выделяет память под текст.
Функция заполняет текст предложениями, пока функция input_sentence не
вернёт -1 – конец ввода. Также функция динамически выделит необходимую
память под предложения с помощью функции realloc, при необходимости.
Функция возвращает кол-во предложений в полученном тексте.
1.1.3) print_text:

8
Функция принимает на вход адрес начала текста и адрес размера текста.
Далее функция проходится по каждому предложению и выводит его на экран с
помощью функции printf.
1.1.4) free_text:
Функция принимает на вход адрес начала текста и адрес размера текста.
Далее функция проходится по каждому предложению и с помощью функции
free освобождает выделенную память для этого предложения. В конце с
помощью функции free освобождается выделенная память для всего текста.
1.1.5) delete_null_sentences:
Функция принимает на вход указатель на текст и указатель на размер
текста. Функция проходится по каждому предложению текста, и если
предложение равняется NULL, то с помощью функции memmove это
предложение удаляется из текста.
1.1.6) delete_same_sentences:
Функция принимает на вход указатель на текст и указатель на размер
текста. Функция проходится по каждой паре предложений, и если они оба не
равны NULL, то с помощью функции strcasecmp эти предложения
сравниваются без учета регистра, и если предложения равны, то второе
предложение из пары становится равным NULL. В конце вызывается функция
delete_null_sentences.
1.1.7) delete_sentences_with_odd_words:
Функция принимает на вход указатель на текст и указатель на размер
текста. Функция проходится по каждому символу текста, если символ цифра
или буква и переменная-флаг равна нулю, то счетчик слов и переменная-флаг
увеличиваются на 1, если символ отличный от цифры или буквы, то
переменной-флаг присваивается ноль. После прохода по всему предложению
счетчик слов проверяется на кратность, и если он нечетен, то предложение
становится равным NULL. Затем счетчик слов становится равным нулю. В
конце вызывается функция delete_null_sentences.
1.1.8) print_sentences_without_capital_letters:

9
Функция принимает на вход адрес начала текста и адрес размера текста.
Далее функция проходится по каждому символу текста, и если встречается
заглавная буква, то счетчик заглавных букв увеличивается на 1, производится
выход из одно цикла. После окончания одного цикла переменная-счетчик
сравнивается с нулем, и если это истина, то выводится предложение, затем
счетчик становится равным 0.
1.1.9) comp:
comp – функция компаратор, используемая при вызове функции qsort для
сортировки дат. Функция возвращает 0, если даты равны, число больше 0, если
первая дата была позже, и наоборот.
1.1.10) output_of_dates:
Для этой функции объявляется структура Data для дат с полями под день,
месяц и год. Функция принимает на вход адрес начала текста и адрес размера
текста. После этого в тексте ищутся даты, подходящие под формат, и заносятся
в массив структур dates, для которого ранее была выделена память. Функция
таже динамически выделяет необходимую память с помощью функции realloc,
при необходимости. В конце с помощью qsort сортируются даты, выводятся на
экран, и освобождается выделенная память.
1.1.11) convert_words_without_numbers:
Функция принимает на вход указатель на текст и адрес размера текста.
Функция проходится по каждому символу текста, и если символ является
буквой, то запоминается начало слова, добавляется 1 к счетчику длины слова.
Затем если встречается знак разделения или конца предложения, то если
текущий индекс минус индекс начала слова равен счетчику длины слова, то все
буквы слова, кроме последней, заменяются на заглавные.
1.1.12) hint:
Функция для вывода сообщения о выборе необходимой для выполнения
под зачади.
1.1.13) select_action:

10
Функция принимает на вход указатель на текст и указатель на размер
текста. Вызывается функция hint. Далее считывается номер действия, и с
помощи конструкции switch case для каждой подзадачи вызываются
необходимые функции, и производится вывод конечных данных.
1.1.14) main:
Главная функция, которая вызывает другие функции для успешного
выполнения основной цели программы.
1.2. Соглашение
Предложения – набор слов, разделенных пробелом или запятой, слова –
набор латинских букв и цифр. Каждое предложение обязательно должно
оканчиваться точкой, иначе это предложение не будет записано и дальнейшие
операции над ним не будут выполняться. Также, если началом предложения
будет пробел или какое-то их количество – они автоматически будут стираться.
При удалении одинаковых предложений учитываются все разделители. Пустые
предложения – это предложения без единого символа. Все предложения
выводятся через пробел.
Соседние файлы в папке 1 сем
