Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Отчет по лабе 4.docx
Скачиваний:
4
Добавлен:
09.02.2015
Размер:
1 Mб
Скачать

Описание переменных функции 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);

}