- •Оглавление
- •Задание
- •Уточнение задания
- •Контрольные примеры
- •Описание главной функции
- •Описание переменных функции
- •Краткое описание алгоритма
- •Описание функции print
- •Описание переменных
- •Блок-схема print
- •5.3 Описание функции poryadok
- •Описание переменных
- •5.4 Описание функции punct
- •Инструкция пользователю
- •Набор тестов
- •Результаты решения задачи
Описание переменных
Описание переменных функции poryadok представлены в Таблице 5.
Таблица 5. Описание переменных функции poryadok
Имя переменной |
Тип |
Назначение | ||
Локальные переменные | ||||
Newtext |
char** |
Указатель на адрес первого элемента первой строки сформированного текста | ||
i,j,e,k,s,q |
int |
Счётчики | ||
l |
int |
Хранитель кол-ва слов в строке | ||
x,y,z |
int |
Переменные, используемые при сортировке слов в строках | ||
a, c, d |
int |
Массивы, содержащие число гласных букв в слове, координаты начал и координаты концов слов | ||
Формальные переменные | ||||
t |
char** |
Указатель на адрес первого элемента первой строки входного текста | ||
r |
char** |
Указатель на адрес первого элемента первой строки выходного текста | ||
m |
int |
Кол-во строк текста | ||
n |
int |
кол-во символов в строке |
Блок-схема poryadok
Блок-схема функции poryadok представлена на рисунке 4.
Рис. 4. Блок-схема функции poryadok
5.4 Описание функции punct
Назначение: Функция используется для проверки символа на разделитель.
Прототип: int punct (char); , где char – проверяемый символ; int– тип возвращаемого значения.
Пример вызова:punct(t[i][j]), где t[i][j] - j-ый символ в слове.
Вызывающая функция: poryadok.
Описание переменных
Описание переменных функции представлены в Таблице 7.
Таблица 7. Описание переменных функции punct
Имя переменной |
Тип |
Назначение |
Локальные переменные | ||
isSymb |
int |
Флаг, отвечающий за проверку, является ли символ разделителем |
i |
int |
Счётчик |
Формальные переменные | ||
symb |
char |
Проверяемый символ |
Блок-схема punct
Блок-схема функции punct представлена на рисунке 6.
Рис. 6. Блок-схема функции punct
5.5 Описание функции fre
Назначение: Функция используется для освобождения памяти, выделенной ранее памяти под тексты.
Прототип: char** fre(char** , int);, где сhar** - указатель на адрес первого элемента первой строки текста, int - кол-во строк текста; char** - тип возвращаемого значения.
Пример вызова: t=fre(t, m); , где t – указатель на адрес первого элемента первой строки текста, m – кол-во строк текста.
Вызывающая функция: main.
Блок схема функции не представлена из-за очевидности выполнения алгоритма.
Описание переменных
Описание переменных функции fr представлены в Таблице 8.
Таблица 8. Описание переменных функции fr
Имя переменной |
Тип |
Назначение |
Локальные переменные | ||
i |
int |
Счётчик |
Формальные переменные | ||
t |
char** |
Указатель на адрес первого элемента первой строки входного текста |
m |
int |
Кол-во строк текста |
5.6 Описание функции mallok
Назначение: Функция используется для выделения памяти, для выходного текста.
Прототип: char** mallok(int, int );, где первый int – число символов в строке, второй int - кол-во строк текста; char** - тип возвращаемого значения.
Пример вызова: r=mallok(m,n);, где m – кол-во строк текста, n – кол-во cимволов в строке.
Вызывающая функция: main.
Блок схема функции не представлена из-за очевидности выполнения алгоритма.
Описание переменных
Описание переменных функции mallok представлены в Таблице 8.
Таблица 8. Описание переменных функции mallok
Имя переменной |
Тип |
Назначение |
Локальные переменные | ||
i |
int |
Счётчик |
y |
Char** |
Указатель на адрес первого элемента первой строки входного текста |
Формальные переменные | ||
n |
int |
Число символов в строке |
m |
int |
Кол-во строк текста |
Описание функции Help
Назначение: Функция используется для вывода справки.
Прототип: void Help();, где void – тип не возвращаемого значения.
Пример вызова: Help();
Вызывающая функция: main.
Блок схема функции не представлена из-за очевидности выполнения алгоритма.
Иерархическая структура вызова функций
Иерархическая структура вызова функций представлена на рисунке 7.
Рис. 7. Иерархическая структура вызова функций
Текст программы
#include <stdio.h>
#include <conio.h>
#include <locale.h>
#include <stdlib.h>
#include <string>
void Help();
char** poryadok(char**, char**, int, int);
char** fre(char** , int);
void print(char**, int , int );
char** reallok(char**, int, int*);
char** mallok(int, int );
char** probel(char**,int,int);
int punct(char);
int main()
{
setlocale(LC_ALL, "RUS");
const int n=81;
int m, cc, vd=0, obr=0;
char b[n], **t, **r;
do
{
puts("Меню: ");
puts("1) Вызвать справку");
puts("1) Ввести текст");
puts("2) Показать введенный текст");
puts("3) Обработать текст");
puts("4) Показать обработанный текст");
puts("5) Выход");
printf("Введите номер пункта: ");
scanf("%d", &cc);
switch(cc)
{
Case 0:
Help();
Break;
case 1:
obr=0;
t=reallok(t,n,&m);
r=mallok(m,n);
r=probel(r,n,m);
vd=1;
break;
case 2:
if(vd==1)
{
puts("Введены строки:");
print(t,n,m);
}
else
printf("Сначала нужно ввести текст, выбрав пункт 1)\n");
break;
case 3:
if(vd==1)
{
r=poryadok(t,r,n,m);
printf("Текст обработан.\n");
}
else
printf("Сначала нужно ввести текст, выбрав пункт 1)\n");
obr=1;
break;
case 4:
if(vd==1)
if(obr==1)
print(r,n,m);
else
printf("Сначала нужно обработать текст, выбрав пункт 3)\n");
else
printf("Сначала нужно ввести текст, выбрав пункт 1)\n");
break;
case 5:
printf("Пока!");
break;
default:
printf("Такого пункта не существует. Введите пункт меню ещё раз\n");
}
}
while(cc!=5);
if(vd==1)
{
t=fre(t,m);
r=fre(r,m);
}
}
char** reallok(char** t, int n, int *m)
{
int i, j;
char b[n];
b[0]=' ';
t=(char**)malloc(sizeof(char*));
for(i=0;b[0]!='@';i++)
{
gets(b);
if(b[0]!='@')
{
puts("Введи строку");
t=(char**)realloc(t,(i+1)*sizeof(char*));
*(t+i)=(char*)malloc(n*sizeof(char));
for(j=0;j<n-1;j++)
t[i][j]=' ';
strcpy(t[i],b);
}
}
*m=i-1;
return(t);
}
char** poryadok(char** t, char** r, int n, int m)
{
int i, j, a[n], c[n], d[n], l, k, s, x ,y, z, q, e;
char b[n];
for(i=0,l=0,q=0,j=0;i<m;i=i+2)
{
l=0; q=0; j=0;
for(e=0;e<n;e++)
{
a[e]=0;
c[e]=0;
d[e]=0;
}
while(punct(t[i][j])==1)
j++;
c[0]=j;
for(;(j<n-1)&&(t[i][j-1]!='\0');j++)
{
if(t[i][j]=='a'||
t[i][j]=='e'||
t[i][j]=='i'||
t[i][j]=='o'||
t[i][j]=='u'||
t[i][j]=='y')
a[l]++;
if(punct(t[i][j])==1)
{
if(punct(t[i][j-1])==0)
d[l]=j-1;
if((punct(t[i][j+1])==0)&&(j+1!=n-1)&&(t[i][j+1]!='\0'))
{
l++;
c[l]=j+1;
}
}
if((punct(t[i][j-1])==0)&&(t[i][j]=='\0'))
d[l]=j-1;
}
for(k=0;k<l;k++)
for(s=1;s<=l-k;s++)
{
if(a[k]<=a[k+s])
{
x=a[k];
a[k]=a[k+s];
a[k+s]=x;
y=c[k];
c[k]=c[k+s];
c[k+s]=y;
z=d[k];
d[k]=d[k+s];
d[k+s]=z;
}
}
for(k=0;k<=l;k++)
{
for(s=c[k];s<=d[k];s++,q++)
r[i][q]=t[i][s];
r[i][q]=' ';
q++;
}
}
for(i=1;i<m;i=i+2)
for(j=0;j<n-1;j++)
r[i][j]=t[i][j];
return(r);
}
int punct(char symb)
{
char punSymbls[30] = " ,.!@#$%^&*()_-+=[]\"№:?/|\;'<>";
int i = 0;
int isSymb = 0;
while ((punSymbls[i]) && (isSymb == 0))
{
if (symb == punSymbls[i])
isSymb = 1;
i++;
}
return isSymb;
}
char** mallok(int n, int m)
{
int i,j;
char **y;
y=(char**)malloc(n*sizeof(char));
for(i=0;i<n;i++)
*(y+i)=(char*)malloc(m*sizeof(char));
return(y);
}
char** probel(char** r, int n, int m)
{
int i,j;
for(i=0;i<m;i++)
for(j=0;j<n-1;j++)
r[i][j]=' ';
return(r);
}
char** fre(char** t, int m)
{
if (t!=NULL)
{
for (int i = 0; i<m; i++)
free(*(t+i));
free(t);
}
return NULL;
}
void print(char **r, int n, int m)
{
int i,j;
printf("\n");
for(i=1;i<m;i++)
{
printf("\n");
for(j=0;j<n-1;j++)
printf("%c",r[i][j]);
}
printf("\n");
}
void Help()
{
system("cls");
puts("\n\n Данная программа предназначена для формирования нового текста, который");
puts(" является результатом следующего преобразования исходного текста:");
puts("в четных строках расположить слова в порядке убывания по численности в них гласных букв.");
puts("\n Ввод текста пользователем заканчивается после ввода символа “@”,");
system("pause");
}