Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курсовая работа финал.docx
Скачиваний:
2
Добавлен:
29.04.2019
Размер:
992.03 Кб
Скачать
  1. Иерархическая структура программы

Иерархическая структура программы представлена на рисунке 7.

Функция ввода

текста

Функция ввода

слова

Функция изменения текста

Функция вывода

помощи пользователю

Главная функция

Функция вывода меню

Функция вывода

текста

Функция освобождения

памяти

Рисунок 7. Иерархическая структура программы

  1. Текст программы

#include <stdio.h>

#include <conio.h>

#include <cstdlib>

#include <stdlib.h>

#include <string.h>

//Курсовая работа работа. Выполнил студент группы №1307 Орлов Виктор

void menu(); //функция меню

//……………………………………………………………………………………

void help(); //помошь пользователю

//……………………………………………………………………………………

char** vvod(int* kolstrok); //ввод текста

//……………………………………………………………………………………

void vivod(char** massiv, int stroki); //вывод текста

//……………………………………………………………………………………

char* vvod_slova1(); //ввод слова для текста

//……………………………………………………………………………………

char* vvod_slova(); //ввод слова для замены

//……………………………………………………………………………………

char** free1(char**massiv, int koltrok); //освобождение динамической памяти

//……………………………………………………………………………………

char** zamena(char** text, char* slovo1,char* slovo, int kolstrok); //замена слов

//……………………………………………………………………………………

int main() //главная функция

{

int kolstrok = 0; //количество строк

int f, z = 0, h, g = 0; //переменные для организации интерфейса

char **text = NULL; //указатель на введённый текст

char **newtxt = NULL; //указатель на сформированный текст

char *slovo1 = NULL; //указатель на введённое слово для текста

char *slovo = NULL; //указатель на введённое слово

printf("+++++++++++++++++++++++++Программа для работы с текстом+++++++++++++++++++++++++ \n");

do

{

menu(); //вывод меню

scanf("%d", &f); //выбор пользователем пункта меню

fflush(stdin); //очистка буфера

system("cls");

switch(f)

{

case 1:

if (text!= NULL)

free1(text, kolstrok);

z = 1;

g = 0;

text = vvod(&kolstrok);

break;

case 2:

if (z == 0)

printf("\nОшибка, введите первый пункт меню\n");

else

{

printf("\nКонтрольный вывод текста\n");

vivod(text, kolstrok); //вывод текста

}

break;

case 3:

g = 0;

if (slovo1 != NULL)

{

printf("Введённое вами слово - ");

puts(slovo1);

printf("\nЕсли вы хотите изменить данное слово, нажмите <1>, в противном случае любую другую клавишу\n");

scanf("%d", &h);

fflush(stdin);

}

if ((slovo1 == NULL)||(h == 1))

{

if(h == 1)

{

free (slovo1);

slovo1 = NULL;

}

slovo1 = vvod_slova1();

}

break;

case 4:

g = 0;

if (slovo != NULL)

{

printf("Введённое вами слово - ");

puts(slovo);

printf("\nЕсли вы хотите изменить данное слово, нажмите <1>, в противном случае любую другую клавишу\n");

scanf("%d", &h);

fflush(stdin);

}

if ((slovo == NULL)||(h == 1))

{

if(h == 1)

{

free (slovo);

slovo = NULL;

}

slovo = vvod_slova();

}

break;

case 5:

if (z == 0)

printf("\nОшибка, введите первый пункт меню\n");

else

{

if (newtxt != NULL)

free1(newtxt, kolstrok);

g = 1;

if ((slovo != NULL)&&(slovo1 != NULL))

{

newtxt = zamena(text, slovo1, slovo, kolstrok);

printf("\nЗамена слов проведена успешно\n");

}

else

printf("\nОшибка, не было введено слово, выберите 3-ий пункт меню\n");

}

break;

case 6:

if (z == 0)

printf("\nОшибка, введите первый пункт меню\n");

else

{

if(g == 1)

{

printf("\n Новый текст: \n\n\n");

vivod(newtxt, kolstrok);

}

else

printf("\nНовый текст не был сформирован. Так как не был выбран 4-ый пункт меню\n");

}

break;

case 7:

help();

printf("\nДля выхода в меню нажмите любую клавишу\n");

getch();

break;

case 8:

if (text!= NULL)

free1(text, kolstrok);

if (newtxt != NULL)

free1(newtxt, kolstrok);

if (slovo1 != NULL)

free (slovo1);

if (slovo != NULL)

free (slovo);

printf("\nДля выхода из программы нажмите любую клавишу\n");

getch();

break;

default:

printf("\nОшибка, введите номер операции: \n");

}

}

while(f != 8);

}

//.............................меню.............................................

void menu()

{

printf("\n**************************************МЕНЮ**************************************\n\n"

"1.Ввод текста;\n"

"2.Контрольный вывод текста;\n"

"3.Введите слово которое должно встречаться в тексте;\n"

"4.Ввод слова для замены;\n"

"5.Замена первых слов, строк содержащих введённое слово для текста;\n"

"6.Вывод изменённого текста;\n"

"7.Помощь пользователю;\n"

"8.Выход из программы;\n"

"\n\n\n\n\n\nВведите номер операции\n");

}

//..........................помощь..............................................

void help()

{

printf("\n*******************************Помощь пользователю******************************\n"

"\n1. Для того, чтобы ввести текст, необходимо выбрать 1-ый пункт меню\n"

"\n2. Текст может содержать произвольно количество строк\n"

"\n3. Для перехода на следующую строку используется клавиша ENTER\n"

"\n4. Для прекращения ввода текста необходимо нажать два раза клавишу ENTER\n"

"\n5. Если необходимы пустые строки в тексте, то необходимо использовать один раз"

"\nENTER и один раз ПРОБЕЛ на каждой строке\n"

"\n6. Для вывода введённого текста на экран используется 2-ой пункт меню\n"

"\n7. Для того, чтобы ввести слово, на которое будут заменяться слова, содержащие"

"\nцифры, необходимо выбрать 3-ий пункт меню, ввод слова прекращается после нажатия клавиши ПРОБЕЛ"

"\nВвести можно только одно слово.\n"

"\n8. Для замены слов, содержащие цифры, на введённое слово, необходимо использовать 4-ый пункт меню\n"

"\n9. Для вывода нового текста необходимо использовать 5-ый пункт меню\n"

"\n10. Для вызова справки необходимо использовать 6-ой пункт меню\n"

"\n11. Для выхода необходимо использовать 7-ой пункт меню\n\n"

"\nРазработчик: студент группы №1307 Ляховец Вадим");

}

//.....................Ввод текста..............................................

char** vvod(int* stroki)

{

char** text = NULL; //Массив указатель(текст)

int i, j; //счётчик по строкам и счётчик по символам

int w, v = 0; //переменные для организации перехода на следующую строку и выхода из набора текста

char s[81]; //вводимая строка

printf("\nВведите текст\n");

for(i = 0; v != 1; i ++)

{

w = 0;

for(j = 0; w != 1; j ++)

{

s[j] = getchar(); //ввод символа

if(s[j] == '\n') //переход на следующую строку

{

w = 1;

s[j] = '\0';

}

if(s[0] == '\0') //конец набора текста

v = 1;

if(j == 79) //переход на следующую строку

{

w = 1;

s[80] = '\0';

}

}

text = (char **) realloc(text,(i+1)*sizeof(char*)); //выделение памяти для строк

text[i] = (char *) malloc((strlen(s)+1)*sizeof(char));

strcpy(text[i], s); //копирование введённой строки в массив указателей

for(j = 0; j < strlen(s); j ++) //обнуление строки

s[j] = 0;

}

*stroki = i; //количество строк

return text;

}

//...........................Вывод текста.......................................

void vivod(char** massiv, int stroki)

{

int i, j;

for(i = 0; i < stroki; i ++)

{

for(j = 0; j < strlen(*(massiv+i)); j ++)

printf("%c", *(*(massiv+i)+j)); //вывод посимвольно

if(*(*(massiv+i)+80) != '\0'||*(*(massiv+i)+1) == '\0') //переход на следующую строку

printf("\n");

}

}

//.........................Ввод слова для текста................................

char* vvod_slova1()

{

char* slovo1 = NULL; //указатель вводимое слово

int n = 0; //счётчик символов

int w = 0; //переменная для организации выхода из набора слова

char key; //вводимый символ

printf("\nВведите слово\n");

for(n = 0; w != 1; n ++)

{

slovo1 =(char*)realloc(slovo1, (n+1)*sizeof(char)); //выделение памяти под символ вводимой строки

key = getch(); //ввод символа

printf("%c", key);

*(slovo1+n) = key; //копирование символа в строку

if(*(slovo1+n) == ' ') //конец ввода слова

{

w = 1;

*(slovo1+n) = '\0';

}

}

return slovo1;

}

//.........................Ввод слова для замены................................

char* vvod_slova()

{

char* slovo = NULL; //указатель вводимое слово

int j = 0; //счётчик символов

int w = 0; //переменная для организации выхода из набора слова

char key; //вводимый символ

printf("\nВведите слово\n");

for(j = 0; w != 1; j ++)

{

slovo =(char*)realloc(slovo, (j+1)*sizeof(char)); //выделение памяти под символ вводимой строки

key = getch(); //ввод символа

printf("%c", key);

*(slovo+j) = key; //копирование символа в строку

if(*(slovo+j) == ' ') //конец ввода слова

{

w = 1;

*(slovo+j) = '\0';

}

}

return slovo;

}

//.................Освобождение динамической памяти.............................

char** free1(char** massiv, int stroki)

{

int i; //счётчик по строкам

for (i = 0; i < stroki; i ++)

free (massiv[i]); //освобождение памяти

free (massiv);

massiv = NULL; //обнуление массива

return NULL;

}

//.....................Замена первых слов, в строках содержащих заданное слово............................

char** zamena(char** text, char* slovo1, char* slovo, int kolstrok)

{

int r; //переменная для организации цикла

int p; //переменная для организации цикла

int s1; //длинна первого слова

int f; //флажок для замены

int n; //счётчик по символу заданного слова для текста

int i; //переменная для организации цикла

int j; //счётчик по символу первоначальной строки

int y; //флажок для замены

int s; //длина копированного слова из первоначальной строки

int e; //переменная для организации цикла

int q; //счётчик по символу новой строки

char** newtxt = NULL; //указатель на новый текст

char* t1 = NULL; //указатель на первоначальная строка

char* t2 = NULL; //указатель на новая строка

for(i = 0; i < kolstrok; i ++) //пока не конец текста

{ p = 0;

q = 0;

r = 0;

for(j = 0; j < strlen(*(text+i)); j ++) //копирование строки в строку t1

{

t1 =(char*)realloc(t1, (j+1)*sizeof(char)); //выделение памяти посимвольно

*(t1+j) = *(*(text+i)+j); //посимвольное копирование

}

t1 =(char*)realloc(t1, (j+1)*sizeof(char)); //выделение памяти под признак конца строки

*(t1+j) = '\0';

j = 0;

while(*(t1+j) != '\0') //пока не конец строки

{

if(*(t1+j) == ' '||*(t1+j) == '.'||*(t1+j) == ','||*(t1+j) == '!'||*(t1+j) == '?'||*(t1+j) == ':'||*(t1+j) == ';') //если разделитель

{

t2 =(char*)realloc(t2, (q+1)*sizeof(char)); //выделение памяти для новой строки посимвольно

*(t2+q) = *(t1+j); //копирование разделителей

j ++;

q ++;

}

else

{

n = 0;

s = 0;

y = 0; //обнуление флажка

while((*(t1+j) != ' ')&&(*(t1+j) != '\0')&&(*(t1+j) != '.')&&(*(t1+j) != ',')&&(*(t1+j) != '!')&&(*(t1+j) != '?')&&(*(t1+j) != ':')&&(*(t1+j) != ';'))

//пока не конец слова

{

if (*(t1+j) == *(slovo1+n))

{

y++;

}

else

{

y = 0;

}

n ++;

j ++;

s ++;

}

if (s == j)

{

s1=s;

}

if(s == y)

{

f=1;

}

if (f == 1)

{

q=0;

for(e = 0; e < strlen(slovo); e ++) //копирование введённого слова в новую строку

{

t2 =(char*)realloc(t2, (q+1)*sizeof(char));

*(t2+q) = *(slovo+e);

q ++;

}

r = strlen(t1+i);

r = r-s1;

p=p+s1;//смещение индекса

for(e = 0; e < r; e ++) //копирование остальных слов строки

{

t2 =(char*)realloc(t2, (q+1)*sizeof(char));

*(t2+q) = *(t1+p);

q ++;

p ++;

}

*(t1+j)= '\0';

}

else

{

if (*(t1+j) == '\0')

{

m = strlen(t1+i);

m = m+1;

q = 0;

for(e = 0; e < strlen(t1+i); e ++) //копирование строки в строку t2

{

t2 =(char*)realloc(t2, (q+1)*sizeof(char));

*(t2+q) = *(t1+q);

q ++;

}

}

}

f = 0;

}

}

t2 =(char*)realloc(t2, (q+1)*sizeof(char)); //выделение памяти под признак конца строки

*(t2+q) = '\0';

newtxt = (char **) realloc(newtxt,(i+1)*sizeof(char*)); //выделение памяти под новый текст

newtxt[i] = (char *) malloc((q+1)*sizeof(char));

strcpy(newtxt[i], t2); //копирование строки t2 в новый текст

free(t1); //освобождение памяти строки t1

t1 = NULL; //обнуление строки t1

free(t2); //освобождение памяти строки t2

t2 = NULL; //обнуление строки t2

}

return newtxt;

}