Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Отчет_по_КР

.docx
Скачиваний:
0
Добавлен:
30.05.2022
Размер:
856.42 Кб
Скачать

МИНОБРНАУКИ РОССИИ

Санкт-Петербургский государственный

электротехнический университет

«ЛЭТИ» им. В.И. Ульянова (Ленина)

Кафедра ВТ

Курсовая РАБОТА

по дисциплине «ВВиТ»

Тема: Обработка текстовой информации

Студентка гр. 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\

Введенные разделители:

\

Заданное слово:

Ожидаемый результат:

Фактический результат:

Вывод: результаты совпадают.