Отчет_по_КР
.docxМИНОБРНАУКИ РОССИИ
Санкт-Петербургский государственный
электротехнический университет
«ЛЭТИ» им. В.И. Ульянова (Ленина)
Кафедра ВТ
Курсовая РАБОТА
по дисциплине «ВВиТ»
Тема: Обработка текстовой информации
Студентка гр. 9493 |
|
Старикова А.С. |
Преподаватель |
|
Гречухин М. Н. |
Санкт-Петербург
2020
ЗАДАНИЕ
на курсовую работу
Студентка Старикова А. С. |
||
Группа 9493. |
||
Тема работы: Обработка текстовой информации
|
||
Вариант 19: Ввести строку символов разделителей и массив строк текста с неизвестным количеством строк. Признаком окончания ввода строки, содержащей количество слов, равное максимальному количеству слов из ранее введенных строк. Из строк введенного текста сформировать другой текст, в который войдут только те строки, которые содержат заданное в исходных данных слово. При наличии в строке двух и более заданных слов удалить первое из них. Отсортировать строки в порядке увеличения количества заданного слова в них. Вывести исходный и сформированный текст.
|
||
Дата выдачи задания: 03.04.2020 |
||
Дата сдачи курсовой: 03.06.2020 |
||
Дата защиты курсовой: |
||
Студент |
|
Старикова А. С. |
Преподаватель |
|
Гречухин М. Н. |
1.Описание функций.
Функция “stringCin”
Данная функция вводит строку, выделяет под нее память и возвращает указатель на массив введенной строки.
Функция “words_amount”
Данная функция посимвольно проверяет на разделитель введенный элемент, увеличивая или нет длину слова, а затем подсчитывает количество слов в строке и возвращает целочисленное значение переменной words_amount.
Функция “output”
Данная функция выводит строку на консоль, ничего не возвращает.
Функция “check_if_the_element_is_delimeter”
Данная функция проверяет элемент на разделитель, возвращая нам вычисленное значение переменной symb_is_delimeter (либо 0, либо 1).
Функция “key_word_counter”
Данная функция подсчитывает количество заданных пользователем слов и возвращает указатель на массив индексов, с которых начинаются заданное слово или слова, если их несколько.
Функция “delete_key_word”
Данная функция удаляет заданное пользователем первое слово из строки и возвращает указатель на массив строки.
Функция “sorting”
Данная функция сортирует строки по количеству заданных слов в них. Функция ничего не возвращает.
Функция “main”
Код программы:
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <stdio.h>
#include <string>
#include <malloc.h>
char* stringCin(char* str)//ввод строки
{
char ch;
int length = 0;
str[0] = '\0';
ch = getchar(
while (ch != '\n')
{
str = (char*)realloc(str, (length + 1) * sizeof(char));
str[length] = ch;
length++;
str[length] = '\0';
ch = getchar();
}
return str;
}
int words_amount(char* string, char* dividers)//подсчет количества слов в строке
{
int word_length = 0;
int words_amount = 0;
for (int current_index_in_string = 0; current_index_in_string < strlen(string); current_index_in_string++)
{
bool symb_is_divider = false;
for (int index_divider = 0; index_divider < strlen(dividers); index_divider++)
{
if (string[current_index_in_string] == dividers[index_divider])
{
symb_is_divider = true;
}
}
if (symb_is_divider == false)
{
word_length++;
}
else
{
if (word_length > 0)
{
words_amount++;
}
word_length = 0;
}
if ((current_index_in_string == strlen(string) - 1) && symb_is_divider == false)
words_amount++;
}
return words_amount;
}
void output(char* string)//функция вывода строки
{
for (int index = 0; index < strlen(string); index++)
{
printf("%c", string[index]);
}
printf("\n");
}
int check_if_the_element_is_delimiter(char letter, char* delimiters) {//проверяем является ли символ разделителем
int symb_is_delimiter = 0;
int size_delimiters = strlen(delimiters);
for (int i = 0; i < size_delimiters; i++)
{
if (letter == delimiters[i])
symb_is_delimiter = 1;
}
return symb_is_delimiter;
}
int* key_word_counter(char* string, char* keyWord, char* delimiters, int* countKeyWordInString) {//подсчитывает количество заданных слов и ищет индекс его начала
int* start_index_array = (int*)malloc(sizeof(int));
countKeyWordInString[0] = 0;
int slovo_is_finded = 0;
int amountSovpashihSymb = 0;
for (int i = 0; i < strlen(string); i++) {
if (keyWord[amountSovpashihSymb] == string[i])
amountSovpashihSymb++;
else amountSovpashihSymb = 0;
if (amountSovpashihSymb == strlen(keyWord)) {
int word_start_with_a_delim = (check_if_the_element_is_delimiter(string[i - strlen(keyWord)], delimiters) || (i + 1 - strlen(keyWord) == 0));
int word_end_with_a_delim = (check_if_the_element_is_delimiter(string[i + 1], delimiters) || (i + 1 == strlen(string)));
if (word_end_with_a_delim && word_start_with_a_delim) {
start_index_array = (int*)realloc(start_index_array, (countKeyWordInString[0] + 1) * sizeof(int));
start_index_array[countKeyWordInString[0]] = i + 1 - strlen(keyWord);
countKeyWordInString[0]++;
}
}
}
return start_index_array;
}
char* delete_key_word(char* texti, int index, char* keyWord) {// удаление заданного слова
char* string = (char*)malloc(sizeof(char) * strlen(texti));
strcpy(string, texti);
int len = strlen(keyWord);
for (int i = 0; i < strlen(string) - index - len; i++) {
string[index + i] = string[index + len + i];
}
string[strlen(string) - len] = 0;
return string;
}
void sorting(char** text, int* countKeyWordInString, int count_string) {//сортировка
int temp;
char* tempCHAR;
for (int first = 0; first < count_string; first++) {
for (int second = 0; second < count_string; second++) {
if (countKeyWordInString[first] < countKeyWordInString[second]) {
temp = countKeyWordInString[first];
countKeyWordInString[first] = countKeyWordInString[second];
countKeyWordInString[second] = temp;
tempCHAR = text[first];
text[first] = text[second];
text[second] = tempCHAR;
}
}
}
}
int main()
{
char* delimiters;
char** text = (char**)malloc(sizeof(char*) * 1);
int max_words_amount = -1;
delimiters = (char*)malloc(sizeof(char));
delimiters[0] = 0;
printf("INPUT THE DELIMITERS: \n");
while (delimiters[0] == 0)//проверка что было что-то введено, а не энтер
delimiters = stringCin(delimiters);
int current_word_amount;
int element_text = 0;
fflush(stdin);
//ввод текста и сравнение с максимальным количеством слов
printf("INPUT THE TEXT: \n");
while (true) {
char* temp_string = (char*)malloc(sizeof(char));
text = (char**)realloc(text, sizeof(char*) * (element_text + 1));
text[element_text] = (char*)malloc(sizeof(char));
temp_string[0] = 0;
while (temp_string[0] == 0)
temp_string = stringCin(temp_string);
fflush(stdin);
current_word_amount = words_amount(temp_string, delimiters);
text[element_text] = (char*)realloc(text[element_text], sizeof(char) * strlen(temp_string));
strcpy(text[element_text], temp_string);
element_text++;
if (max_words_amount == current_word_amount && current_word_amount != 0)
break;
if (max_words_amount == -1 || max_words_amount < current_word_amount)
max_words_amount = words_amount(temp_string, delimiters);
}
//задаем слово
puts("INPUT THE KEY WORD:");
char* keyWord = (char*)malloc(sizeof(char));
keyWord[0] = 0;
while (keyWord[0] == 0)
keyWord = stringCin(keyWord);
fflush(stdin);
int* countKeyWordArray = (int*)malloc(sizeof(int) * 1);//массив, где i-ый элемент это количество заданных слов в строке
int countTransformString = 0;
char** transformText = (char**)malloc(sizeof(char*));
int* indexKeyWords;//массив, который хранит данные о том, где начинается первое заданное слово
int* countKeyWordInString = (int*)malloc(sizeof(int));;
for (int i = 0; i < element_text; i++) {
indexKeyWords = key_word_counter(text[i], keyWord, delimiters, countKeyWordInString);
if (countKeyWordInString[0] > 0) {// если количество заданных слов больше нуля, то мы запишем в массив countKeyWordArray эти данные
transformText = (char**)realloc(transformText, (countTransformString + 1) * sizeof(char*));
char* temp_string;
temp_string = delete_key_word(text[i], indexKeyWords[0], keyWord);
transformText[countTransformString] = (char*)malloc(sizeof(char) * strlen(temp_string));
strcpy(transformText[countTransformString], temp_string);
countKeyWordArray = (int*)realloc(countKeyWordArray, (countTransformString + 1) * sizeof(int));
countKeyWordArray[countTransformString] = countKeyWordInString[0];
countTransformString++;
}
}
//сортируем сформированный текст
sorting(transformText, countKeyWordArray, countTransformString);
puts("YOUR TEXT:");
for (int i = 0; i < element_text; i++)
output(text[i]);
puts("TRANSFORMED TEXT:");
for (int i = 0; i < countTransformString; i++)
output(transformText[i]);
}
3.Тестирование
Исходный текст:
i,am/not.really.pro/at,programming
,.but.i.can.really/imagine,i/could,improve
myself/and.learn.any/programming/,
language.,./so.i,/.,wish.i
will.,/.do/.,my/.,best/.,,//to
make./my./future/./better/.,
./.i/.,.i/.,i.,/i.,/i.,/i/.sda/.,fg
Введенные разделители:
,./
Заданное слово:
i
Ожидаемый результат:
,am/not.really.pro/at,programming
language.,./so.,/.,wish.i
,.but..can.really/imagine,i/could,improve
././.,.i/.,i.,/i.,/i.,/i/.sda/.,fg
Фактический результат:
,am/not.really.pro/at,programming
language.,./so.,/.,wish.i
,.but..can.really/imagine,i/could,improve
././.,.i/.,i.,/i.,/i.,/i/.sda/.,fg
Вывод: результаты тестирования совпали.
2.
Исходный текст:
momma2i3am1trully3sorry
i1wanna2113come3home
1233232121321321321
nothing1i2is3impossible3yes
Введенные разделители:
123
Заданное слово:
i
Ожидаемый результат:
momma23am1trully3sorry
1wanna2113come3home
nothing12is3impossible3yes
Фактический результат:
momma23am1trully3sorry
1wanna2113come3home
nothing12is3impossible3yes
Вывод: результаты совпали.
3)
Исходный текст:
iPcantPreallyPunderstandPwhyP
itPfhjskdfjPnddfbjdP
jdfksjgfPdkvvPalkdvld
PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
efjjghfjbpPPPdlvjnfPPjnfekrjgnjcPPPPsjdkfnPPP
dfPasdafPadffgPsgdhrjyPdfhdghP
Введенные разделители:
P
Заданное слово:
why
Ожидаемый результат:
iPcantPreallyPunderstandPP
Фактический результат:
iPcantPreallyPunderstandPP
Вывод: результаты совпали.
4)
Исходный текст:
afd.,dffs/dfdgf/,dfsdg
asf/.fsdg./.,g,125/fwfw
232d/.d321f/.s.32df1/..f
Введенные разделители:
,./
Заданное слово:
125
Ожидаемый результат:
asf/.fsdg./.,g,/fwfw
Фактический результат:
asf/.fsdg./.,g,/fwfw
5)
Исходный текст:
aaadfgrg/i/sdgdfhfhsdfghjkl;lkjh/hjyjkuikuikyhg/i/gfhfgdtjyui/ii/iktmj/i/vfdzgjtuyfkfghgjj.,jyrujuj134653/tyjyu/fgrthhg/gdfgdhrt/idfb
asdtfyui/sdfghjkl/oiuytr/;l,mnb/rgjthj/7525/rhtty/i/efwsrgdthfgjhk/i/adsfghj/lkmjnhbgv/sdfghj
sdfghjk/i/kmjynhtbgrvfc/sdfghj/,mnhg/8636/ewfrdghj/ikjnhbgvf/i/sedrfgh/mjnhbgv/oiuyf/wedf/
i/sfghj/iiii/esdfghjk/8653/ujythrgef/wertyu/iuytre/sdfghjk/kjhgfd/rtyuk/jhbv/iuygf/erghj
Введенные разделители:
/
Заданное слово:
i
Ожидаемый результат:
/sfghj/iiii/esdfghjk/8653/ujythrgef/wertyu/iuytre/sdfghjk/kjhgfd/rtyuk/jhbv/iuygf/erghj
sdfghjk//kmjynhtbgrvfc/sdfghj/,mnhg/8636/ewfrdghj/ikjnhbgvf/i/sedrfgh/mjnhbgv/oiuyf/wedf/
asdtfyui/sdfghjkl/oiuytr/;l,mnb/rgjthj/7525/rhtty//efwsrgdthfgjhk/i/adsfghj/lkmjnhbgv/sdfghj
aaadfgrg//sdgdfhfhsdfghjkl;lkjh/hjyjkuikuikyhg/i/gfhfgdtjyui/ii/iktmj/i/vfdzgjtuyfkfghgjj.,jyrujuj134653/tyjyu/fgrthhg/gdfgdhrt/idfb
Фактический результат:
/sfghj/iiii/esdfghjk/8653/ujythrgef/wertyu/iuytre/sdfghjk/kjhgfd/rtyuk/jhbv/iuygf/erghj
sdfghjk//kmjynhtbgrvfc/sdfghj/,mnhg/8636/ewfrdghj/ikjnhbgvf/i/sedrfgh/mjnhbgv/oiuyf/wedf/
asdtfyui/sdfghjkl/oiuytr/;l,mnb/rgjthj/7525/rhtty//efwsrgdthfgjhk/i/adsfghj/lkmjnhbgv/sdfghj
aaadfgrg//sdgdfhfhsdfghjkl;lkjh/hjyjkuikuikyhg/i/gfhfgdtjyui/ii/iktmj/i/vfdzgjtuyfkfghgjj.,jyrujuj134653/tyjyu/fgrthhg/gdfgdhrt/idfb
6)
Исходный текст:
sdfghjklrdacfvgbfvnirbgrobrgbkmbk\fhgrg\hy\jtj\yutj\tjr\j\fjg\k\k\uk\gj\dg\sgdhfjk
sxdcfvgbhnjm\rgdthfyjgui\dfghjk\sfgdhjk
efsgrdhfjgkh\sgdfhj\dsfghjk\rtyu\dgjy\dfhfgh\djtk\dfhfgh\drhtj\sdgeh\hfgj\f\f\h\
Введенные разделители:
\
Заданное слово:
Ожидаемый результат:
Фактический результат:
Вывод: результаты совпадают.