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

курсач / 9494_Lobazev_Nikita_Aleksandrovich_Kursovaya_rabota

.docx
Скачиваний:
12
Добавлен:
05.01.2021
Размер:
1.11 Mб
Скачать

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

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

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

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

Кафедра ВТ

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

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

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

Вариант 26

Студент гр. 9494

Лобазев Н.А.

Преподаватель

Гречухин М.Н.

Санкт-Петербург

2020

ЗАДАНИЕ

на курсовую работу

Студент Лобазев Н.А.

Группа 9494

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

Исходные данные:

Ввести массив строк текста с заданным количеством строк и массив символов разделителей. Количество символов разделителей заранее неизвестно. Ввод элементов этого массива заканчивается повторением любого из символов, введённых ранее. Из строк введенного текста сформировать другой текст, в котором строки будут располагаться в порядке уменьшения количества слов с одновременным удалением первых слов. Вывести исходный и сформированный текст.

Содержание пояснительной записки:

Содержание, задание, описание функций, код программы, тестирование программы

Предполагаемый объем пояснительной записки:

Не менее 00 страниц.

Дата выдачи задания: 03.04.2020

Дата сдачи реферата: 09.06.2020

Дата защиты реферата: 04.06.2020

Студент

Лобазев Н.А.

Преподаватель

Гречухин М.Н.

Содержание

3

Содержание 3

3

Задание 4

Описание функций 5

inStr(char* str, char ch) 5

delFWord(char* str, char*del) 6

getNumWord(char* str, char*del) 7

orderStr(char**str, int n, char*del) 8

getStr(intkey) 9

main 10

Код программы 11

Тестирование программы 15

Задание

Ввести массив строк текста с заданным количеством строк и массив символов разделителей. Количество символов разделителей заранее неизвестно. Ввод элементов этого массива заканчивается повторением любого из символов, введённых ранее. Из строк введенного текста сформировать другой текст, в котором строки будут располагаться в порядке уменьшения количества слов с одновременным удалением первых слов. Вывести исходный и сформированный текст.

Описание функций

inStr(char* str, char ch)

Функция определяет, присутствует символ ch в строке str или нет. Возвращает 1, если символ присутствует и 0 если нет.

Имя формального параметра

Тип значения

Смысл параметра

str

char*

строка в которой осуществляется поиск символа

ch

char

символ, который ищется в строке

delFWord(char* str, char*del)

Функция удаляет первое слово в строке str. Слова определяются в строке по символам разделителям del. Исходную строку функция не изменяет. В качестве результата возвращает исходную строку с удалённым первым словом.

Имя формального параметра

Тип значения

Смысл параметра

str

char*

строка в которой осуществляется удаление первого слова

del

char*

строка символов разделителей слов

getNumWord(char* str, char*del)

Функция подсчитывает количество слов в строке str. Слова определяются в строке по символам разделителям del. Исходную строку функция не изменяет. В качестве результата возвращает количество слов в строке.

Имя формального параметра

Тип значения

Смысл параметра

str

char*

строка в которой осуществляется подсчёт количества слов

del

char*

строка символов разделителей слов

orderStr(char**str, int n, char*del)

Функция в массиве strиз nстрок, располагает строки в порядке уменьшения количества слов в строке. Количество слов в строке определяется функцией getNumWord. Функция изменяет исходный массив.

Имя формального параметра

Тип значения

Смысл параметра

str

char**

массив строк, которые будут расположены в порядке уменьшения количества слов

n

int

число строк в массиве

del

char*

строка символов разделителей слов

getStr(intkey)

Функция ввода строки.Посимвольно вводит строку в режиме, определяемом значением key. При key = 1 строка будет вводится, пока не будет введен символ, который уже присутствует в строке.

При любом другом значении key строка будет вводится до символа перехода на новую строку. В качестве результата возвращает введённую строку

Имя формального параметра

Тип значения

Смысл параметра

key

int

режим ввода строки

main

Код программы

#include "stdio.h"

#include "stdlib.h"

/* Функция определяет, присутствует символ ch в строке str или нет */

int inStr(char* str, char ch) {

if (str == NULL)

return 0;

while (*str) {

if (*str == ch)

return 1;

str++;

}

return 0;

}

/* Функция удаления первого слова в строке */

char *delFWord(char* str, char* del) {

if (str == NULL || del == NULL)

return NULL;

char *nstr = NULL;

int len = 0;

int k = 0;

while (*str) {

if (inStr(del, *str) != 0 && k == 0) {

if (len > 0) {

k++;

len = 0;

}

}

else {

len++;

nstr = (char*)realloc(nstr, (len + 1) * sizeof(char));

nstr[len - 1] = *str;

nstr[len] = '\0';

}

str++;

}

return nstr;

}

/* Фунция подсчёта количества слов в строке */

int getNumWord(char* str, char* del) {

if (str == NULL || del == NULL)

return 0;

int len = 0;

int k = 0;

while (*str) {

if (inStr(del, *str) != 0) {

if (len > 0) {

k++;

len = 0;

}

}

else {

len++;

}

str++;

}

return k;

}

/* Функция расположения строк в порядке уменьшения количества слов */

void orderStr(char** str, int n, char* del) {

int i, j;

for (i = 0; i < n - 1; i++) {

for (j = i + 1; j < n; j++) {

if (getNumWord(str[i], del) < getNumWord(str[j], del)) {

char *p = str[i];

str[i] = str[j];

str[j] = p;

}

}

}

}

/* Функция ввода строки, посимвольно вводит строку */

/* при key = 1 строка будет вводится, пока не будет введен символ, */

/* который уже присутствует в строке */

/* При любом другом значении key строка будет вводится до символа */

/* перехода на новую строку */

char* getStr(int key) {

char *str = NULL;

int b, len = 0;

char ch;

do {

scanf("%c", &ch);

if (key == 1)

b = inStr(str, ch) == 0 || ch == '\n';

else

b = (ch != '\n');

if (b) {

len++;

str = (char*)realloc(str, (len + 1) * sizeof(char));

str[len - 1] = ch;

str[len] = '\0';

}

} while (b);

return str;

}

int main() {

system("chcp 1251");

int n, k;

do {

system("cls");

printf("Укажите количество вводимых строк: ");

k = scanf("%d%*c", &n);

fflush(stdin);

} while (n < 1 || k == 0);

char** str = (char**) malloc (n * sizeof(char*));

int i;

printf("Введите %d строк текста:\n", n);

for (i = 0; i < n; i++) {

str[i] = getStr(0);

}

printf("Введите массив символов разделителей:\n");

char* del = getStr(1);

char** nstr = (char**) malloc (n * sizeof(char*));

for (i = 0; i < n; i++) {

nstr[i] = delFWord(str[i], del);

}

orderStr(nstr, n, del);

printf("\n\nИсходный текст:\n");

for (i = 0; i < n; i++) {

printf("%s\n", str[i]);

}

printf("\n\nСформированный текст:\n");

for (i = 0; i < n; i++) {

printf("%s\n", nstr[i]);

}

printf("\n\n");

system("pause");

}

Тестирование программы

Пример 1.

Исходный текст:

qwertyuiop

asdfghjkl

zxcvbnm

Разделители (напоминаю: по условию останавливаем ввод при повторе любого из разделителей):

r i f x v n i

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

cvbnm

tyuiop

ghjkl

Вывод: Программа выполнена успешно!

Пример 2.

Исходный текст:

poiuytrewq

lkjhgfdsa

mnbvcxz

Разделители:

s c b w j g c

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

hgfdsa

vcxz

q

Вывод: Программа выполнена успешно!

Пример 3.

Исходный текст:

1234567890

qwertyuiop

asdfghjkl

zxcvbnm

Разделители:

2 s 5 g 7 j 9 c w b 5

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

34567890

dfghjkl

vbnm

ertyuiop

Вывод: Программа выполнена успешно!

Пример 4.

Исходный текст:

12wsz

34edx

56rtfgcvb

7yuhjnm

89ik,

0o.

Разделители:

6 t g v y h n 2 s 1 4 9 6

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

12wsz

34edx

56rtfgcvb

7yuhjnm

89ik,

0ol.

Вывод: Программа выполнена успешно!

Пример 5.

Исходный текст:

qwertyuiop

asdfghjkl

zxcvbnm

Разделители:

r i f x v n i

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

cvbnm

tyuiop

ghjkl

Вывод: Программа выполнена успешно!

Пример 6.

Исходный текст:

qwert

asdfg

zxcvb

Разделители:

w y s f j k z c c

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

dfg

ert

vb

Вывод: Программа выполнена успешно!

Пример 7(на проверку корректности ввода)

Вывод: Программа ожидает корректного ввода.