курсач / 9494_Lobazev_Nikita_Aleksandrovich_Kursovaya_rabota
.docxМИНОБРНАУКИ РОССИИ
Санкт-Петербургский государственный
электротехнический университет
«ЛЭТИ» им. В.И. Ульянова (Ленина)
Кафедра ВТ
Курсовая РАБОТА
по дисциплине «Введение в ИТ»
Тема: Обработка текстовой информации
Вариант 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(на проверку корректности ввода)
Вывод: Программа ожидает корректного ввода.