Описание переменных функции obrabotka
Описание локальных переменных функции obrabotka представлены в Таблице 6.
Таблица 6. Описание локальных переменных функции obrabotka
Имя переменной |
Тип |
Назначение |
Локальные переменные | ||
i,j,k |
int |
Счётчики |
f |
int |
Флажок |
Формальные переменные | ||
y |
int** |
Указатель на первый элемент первой строки входной матрицы |
z |
int** |
Указатель на первый элемент первой строки выходной матрицы |
n |
int |
кол-во строк входной матрицы |
m |
int |
кол-во столбцов любой матрицы |
x |
Int* |
указатель на кол-во строк выходной матрицы. |
Блок-схема функции obrabotka
Блок-схема функции obrabotka представлена на рисунке 5
Рис. 5. Блок-схема функции obrabotka
Описание функции frе
Назначение: Функция используется для освобождения памяти, выделенной ранее памяти под матрицы.
Прототип: int** fre(int** , int );, где int** - указатель на адрес первого элемента первой строки матрицы, int - кол-во строк матрицы; int** - тип возвращаемого значения.
Пример вызова: y=fre(y,ksk);, где y – указатель на адрес первого элемента первой строки матрицы, ksk – кол-во строк текста.
Вызывающая функция: main.
Блок схема функции не представлена из-за очевидности выполнения алгоритма.
Описание переменных
Описание переменных функции fre представлены в Таблице 8.
Таблица 8. Описание переменных функции fre
Имя переменной |
Тип |
Назначение |
Локальные переменные | ||
i |
int |
Счётчик |
Формальные переменные | ||
t |
int** |
Указатель на адрес первого элемента первой строки матрицы |
m |
int |
Кол-во строк матрицы |
Описание функции mallok
Назначение: Функция используется для выделения памяти, для матриц.
Прототип: int** mallok(int, int );, где первый int – кол-во столбцов матрицы, второй int - кол-во строк матрицы; int** - тип возвращаемого значения.
Пример вызова: r=mallok(m,n);, где m – кол-во строк матрицы, n – кол-во столбцов матрицы.
Вызывающая функция: main.
Блок схема функции не представлена из-за очевидности выполнения алгоритма.
Описание переменных
Описание переменных функции mallok представлены в Таблице 8.
Таблица 8. Описание переменных функции mallok
Имя переменной |
Тип |
Назначение |
Локальные переменные | ||
i |
int |
Счётчик |
y |
int** |
Указатель на адрес первого элемента первой строки матрицы |
Формальные переменные | ||
n |
int |
кол-во строк матрицы |
m |
int |
кол-во столбцов матрицы |
Текст программы
#include <stdio.h>
#include <locale.h>
#include <stdlib.h>
#include <time.h>
int skolko(int );
int** mallok(int , int );
int** fre(int** , int );
void print(int**, int , int );
int** scan(int**, int , int );
int** obrabotka(int**, int**, int , int , int*);
int main()
{
srand(time(NULL));
setlocale(LC_ALL, "RUS");
const int n=50;
int i, j, k, ksk, ksv, c, vd=0, vd2=0, obr=0, f, x, **y, **z;
do
{
printf("\n");
puts("Ìåíþ: ");
puts("1) Ввести размеры матрицы");
puts("2) Ввести новую матрицу");
puts("3) Посмотреть введ¸нную матрицу");
puts("4) Обработать введ¸нную матрицу");
puts("5) Показать обработанную матрицу");
puts("6) Выход");
printf("Введите номер пункта: ");
scanf("%d", &c);
printf("\n");
switch(c)
{
case 0:
vd2=0; obr=0;
printf("Сколько строк будет в матрице?\n");
ksk=skolko(n);
printf("Сколько столбцов будет в матрице?\n");
ksv=skolko(n);
vd=1;
break;
case 1:
if(vd==1)
{
obr=0;
y=mallok(ksk,ksv);
y=scan(y,ksk,ksv);
vd2=1;
}
else
printf("Сначала нужно ввести размеры матрицы, выбрав пункт 1)\n");
break;
case 2:
if(vd==1)
if(vd2==1)
{
printf("Введ¸нная матрица: \n");
print(y,ksk,ksv);
}
else
printf("Сначала нужно ввести матрицу, выбрав пункт 2)\n");
else
printf("Сначала нужно ввести размеры матрицы, выбрав пункт 1)\n");
break;
case 3:
if(vd==1)
if(vd2==1)
{
z=mallok(ksk,ksv);
f=obr=1;
obrabotka(y,z,ksk,ksv,&x);
printf("Матрица обработана.\n");
}
else printf("Сначала нужно ввести матрицу, выбрав пункт 2)\n");
else printf("Сначала нужно ввести размеры матрицы, выбрав пункт 1)\n");
break;
case 4:
if(obr==1 && x==0) printf("Строк, где есть хоть 2 одинаковых элемента, не обнаружено.\n");
else
if(obr==1)
print(z,x,ksv);
else
if(vd2==0)
if(vd==0)
printf("Сначала нужно ввести размеры матрицы, выбрав пункт 1)\n");
else
printf("Сначала нужно ввести матрицу, выбрав пункт 2)\n");
else
printf("Сначала нужно обработать матрицу, выбрав пункт 4)\n");
break;
case 5:
printf("Ïîêà!");
break;
default:
printf("Такого пункта не существует. Введите пункт меню ещ¸ раз\n");
}
}
while (c!=5);
if(vd2==1)
{
y=fre(y,ksk);
z=fre(z,x);
}
}
int skolko(int n)
{
int a;
do
{
scanf("%d", &a);
if(a<1 || a>n)
printf("Требуется целое положительное число от 1 до %d.\nВведите число заново.\n", n);
}
while(a<1 || a>n);
return(a);
}
int** mallok(int n, int m)
{
int i,**y;
y=(int**)malloc(n*sizeof(int));
for(i=0;i<n;i++)
*(y+i)=(int*)malloc(m*sizeof(int));
return(y);
}
int** fre(int** t, int m)
{
if (t!=NULL)
{
for (int i = 0; i<m; i++)
free(*(t+i));
free(t);
}
return NULL;
}
void print(int **y, int n, int m)
{
int i,j;
for(i=0; i<n; printf("\n"), i++)
for(j=0; j<m; printf("%3d", *(*(y+i)+j)), j++);
}
int** scan(int **y, int n, int m)
{
int i,j;
for(i=0; i<n; i++)
{
printf("Введите элементы %d строки матрицы\n", i+1);
for(j=0; j<m; scanf("%d", &y[i][j]), j++);
}
return(y);
}
int** obrabotka(int **y, int **z, int n, int m, int *x)
{
int i,j,k=0,f=1;
for(i=*x=0,f=1; i<n; i++, f=1)
{
for(j=0; j<m && f==1; j++)
for(k=j+1; k<m && f==1; k++)
if(y[i][j]==y[i][k]) f=0;
if(f==0)
{
for(j=0; j<m; j++)
z[*x][j]=y[i][j];
*x=*x+1;
}
}
return(z);
}