Функция неверно заполняет матрицу - C (СИ)
Формулировка задачи:
Здравствуйте, в программе функция неверно вводит массив А, заполняет первый столбец числами, остальную часть нулями. Никак не могу найти ошибку, буду благодарен за помощь. И если не трудно, можете часть программы, которая максимальный элемент столбца помещает вверх, записать в виде функции с вызовом. Я плохо разбираюсь в функциях и хочу на примере разобраться, так как мне всю программу нужно раскидать по функциям. Заранее спасибо!!!
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int VVOD_A(int **arr, int M)
{int i,j,N;
printf("Введённая матрица A\n");
for ( i = 0; i < N; i++ )
{
for ( j = 0; j < M; j++ )
{
arr[ i ][ j ] = rand() % 50;
printf( "\n" );
}}}
int main() {
int i, j, max, t,temp,k,min,N,M,index_max;
setlocale (0,"rus");
srand( time( NULL ) );
printf("Введите порядок массива: ");
scanf("%d", &N);
M=N;
int **arr = (int**)malloc(N*M * sizeof(int*));
for (i = 0; i < N; i++)
{
arr[i] = (int*)malloc(N * sizeof(int));
}
int **brr = (int**)malloc(N*M * sizeof(int*));
for (i = 0; i < N; i++)
{
brr[i] = (int*)malloc(N * sizeof(int));
}
/*printf("Введённая матрица A\n");
for ( i = 0; i < N; i++ ) {
for ( j = 0; j < M; j++ ) {
arr[ i ][ j ] = rand() % 50;
printf( " |%3d| ", arr[ i ][ j ] );}
printf( "\n" );}
for ( j = 0; j < M; j++ )
printf( " ----- " );
printf( "\n" );*/
VVOD_A(&arr,M);
for ( i = 0; i < N; i++ ) {
for ( j = 0; j < M; j++ ) {
printf( " |%3d| ", arr[ i ][ j ] );}
printf( "\n" );}
for ( j = 0; j < M; j++ )
printf( " ----- " );
printf( "\n" );
printf("Максимальный элемент наверх А\n");
for ( j = 0; j < M; j++ ) {
max = arr[ 0 ][ j ];
int index_max = 0;
for ( i = 1; i < N; i++ )
if ( arr[ i ][ j ] > max ) {
max = arr[ i ][ j ];
index_max = i;}
t = arr[ 0 ][ j ];
arr[ 0 ][ j ] = max;
arr[ index_max ][ j ] = t; }
for ( i = 0; i < N; i++ ) {
for ( j = 0; j < M; j++ ) {
printf( " |%3d| ", arr[ i ][ j ] );
}
printf( "\n" );
}
printf( "\n" );
printf("Транспонированная матрица А\n");
int **ATR = (int**)malloc(N*M * sizeof(int*));
for (i = 0; i < N; i++)
{
ATR[i] = (int*)malloc(N * sizeof(int));
}
for(i=0; i<N; ++i){
for(j=i; j<N; ++j)
{ temp=arr[i][j];
ATR[i][j]=arr[j][i];
ATR[j][i]=temp;
}
}
for ( i = 0; i < N; i++ ) {
for ( j = 0; j < M; j++ ) {
printf( " |%3d| ", ATR[ i ][ j ] );
}
printf( "\n" );
}
printf( "\n" );
printf("Введённая матрица B\n");
for ( i = 0; i < N; i++ ) {
for ( j = 0; j < M; j++ ) {
brr[ i ][ j ] = rand() % 50;
printf( " |%3d| ", brr[ i ][ j ] );}
printf( "\n" );}
for ( j = 0; j < M; j++ )
printf( " ----- " );
printf( "\n" );
printf("Транспонированная матрица B\n");
int **BTR = (int**)malloc(N*M * sizeof(int*));
for (i = 0; i < N; i++)
{
BTR[i] = (int*)malloc(N * sizeof(int));
}
for(i=0; i<N; ++i){
for(j=i; j<N; ++j)
{ temp=brr[i][j];
BTR[i][j]=brr[j][i];
BTR[j][i]=temp;
}
}
for ( i = 0; i < N; i++ ) {
for ( j = 0; j < M; j++ ) {
printf( " |%3d| ", BTR[ i ][ j ] );
}
printf( "\n" );
}
printf( "\n" );
printf("AT*B\n");
int **C = (int**)malloc(N*M * sizeof(int*));
for (i = 0; i < N; i++)
{
C[i] = (int*)malloc(N * sizeof(int));
}
for (i = 0; i < N; i++)
for (j = 0; j < M; j++)
{
C[i][j] = 0;
for (k = 0; k < M; k++)
C[i][j] += ATR[i][k] * brr[k][j];}
for ( i = 0; i < N; i++ )
{
for ( j = 0; j < M; j++ ) {
printf( " |%3d| ", C[i][j] );
}
printf( "\n" );
}
printf( "\n" );
printf("BT*A\n");
int **X = (int**)malloc(N*M * sizeof(int*));
for (i = 0; i < N; i++)
{
X[i] = (int*)malloc(N * sizeof(int));
}
for (i = 0; i < N; i++)
for (j = 0; j < M; j++)
{
X[i][j] = 0;
for (k = 0; k < M; k++)
X[i][j] += BTR[i][k] * arr[k][j];}
for ( i = 0; i < N; i++ )
{
for ( j = 0; j < M; j++ ) {
printf( " |%3d| ", X[i][j] );
}
printf( "\n" );
}
printf( "\n" );
printf("BT*A-AT*B\n");
int **S = (int**)malloc(N*M * sizeof(int*));
for (i = 0; i < N; i++)
{
S[i] = (int*)malloc(N * sizeof(int));
}
for ( i = 0; i < N; i++ ) {
for ( j = 0; j < M; j++ ) {
S[i][j]=X[i][j] - C[i][j];
printf( " |%3d| ", S[ i ][ j ] );}
printf( "\n" );}
for ( j = 0; j < M; j++ )
printf( " ----- " );
printf( "\n" );
printf("Введённая матрица 6E\n");
int **E = (int**)malloc(N*M * sizeof(int*));
for (i = 0; i < N; i++)
{
E[i] = (int*)malloc(N * sizeof(int));
}
for ( i = 0; i < N; i++ ) {
for ( j = 0; j < M; j++ ) {
if (i==j){E[i][j]=6;}
else{E[i][j]=0;}
printf( " |%3d| ", E[ i ][ j ] );}
printf( "\n" );}
for ( j = 0; j < M; j++ )
printf( " ----- " );
printf( "\n" );
printf("A-6E\n");
int **V = (int**)malloc(N*M * sizeof(int*));
for (i = 0; i < N; i++)
{
V[i] = (int*)malloc(N * sizeof(int));
}
for ( i = 0; i < N; i++ ) {
for ( j = 0; j < M; j++ ) {
V[i][j]=arr[i][j] - E[i][j];
printf( " |%3d| ", V[ i ][ j ] );}
printf( "\n" );}
for ( j = 0; j < M; j++ )
printf( " ----- " );
printf( "\n" );
printf("min\n");
int index_min = 0;
min = fabs(brr[ 0 ][ j ]);
for (j = 0; j < M; j++)
{for ( i = 0; i < N; i++ )
if ( fabs(brr[ i ][ j ]) < min ) {
min = brr[ i ][ j ];
}}
printf( " |%3d| ", min );
printf( "\n" );
//for ( j = 0; j < M; j++ )
printf( " ----- " );
printf( "\n" );
printf("Транспонированная матрица A-6E\n");
int **AETR = (int**)malloc(N*M * sizeof(int*));
for (i = 0; i < N; i++)
{
AETR[i] = (int*)malloc(N * sizeof(int));
}
for(i=0; i<N; ++i){
for(j=i; j<N; ++j)
{ temp=V[i][j];
AETR[i][j]=V[j][i];
AETR[j][i]=temp;
}
}
for ( i = 0; i < N; i++ ) {
for ( j = 0; j < M; j++ ) {
printf( " |%3d| ", AETR[ i ][ j ] );
}
printf( "\n" );
}
printf( "\n" );
printf("Две скобки -\n");
int **F = (int**)malloc(N*M * sizeof(int*));
for (i = 0; i < N; i++)
{
F[i] = (int*)malloc(N * sizeof(int));
}
for ( i = 0; i < N; i++ ) {
for ( j = 0; j < M; j++ ) {
F[i][j]=S[i][j] - AETR[i][j];
printf( " |%3d| ", F[ i ][ j ] );}
printf( "\n" );}
for ( j = 0; j < M; j++ )
printf( " ----- " );
printf( "\n" );
if (min==0){printf("Минимальный элемент равен 0, следовательно деление невозможно!\n");}
else {printf("Ответ\n");
int **OTV = (int**)malloc(N*M * sizeof(int*));
for (i = 0; i < N; i++)
{
OTV[i] = (int*)malloc(N * sizeof(int));
}
for ( i = 0; i < N; i++ ) {
for ( j = 0; j < M; j++ ) {
OTV[i][j]=F[i][j] / min;
printf( " |%3d| ", OTV[ i ][ j ] );}
printf( "\n" );}
for ( j = 0; j < M; j++ )
printf( " ----- " );
printf( "\n" );
}
getchar();getchar();
return 0;
}Решение задачи: «Функция неверно заполняет матрицу»
textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include<math.h>
int **VVOD(int N, int M);
void free_memory(int **arr,int N);
void VIVOD(int **arr,int N, int M);
void max_up(int **arr,int N, int M);
int **tran(int **arr,int N,int M);
int **mult(int **arr, int **brr,int N,int M);
int **sub(int **arr, int **brr,int N,int M);
int **divis(int **arr,int N,int M, int min);
int main(void)
{
int i, j, max, t,temp,k,min,N,M,index_max;
int **arr,**brr, **ATR,**BTR,**C,**X,**S,**E,**V,**AETR,**F,**OTV;
srand( time( NULL ) );
printf("Enter size of matrix: ");
scanf("%d", &N);
M=N;
printf("Entered matrix A:\n");
arr=VVOD(N,M);
VIVOD(arr,N,M);
printf("Maximum element up A\n");
max_up(arr,N,M);
VIVOD(arr,N,M);
printf("transposed matrix A\n");
ATR =tran(arr,N,M);
VIVOD(ATR,N,M);
printf("Entered matrix B:\n");
brr=VVOD(N,M);
VIVOD(brr,N,M);
printf("transposed matrix B\n");
BTR =tran(arr,N,M);
VIVOD(BTR,N,M);
printf("AT*B\n");
C=mult(ATR,brr,N,M);
VIVOD(C,N,M);
printf("BT*A\n");
X=mult(BTR,arr,N,M);
VIVOD(X,N,M);
printf("BT*A-AT*B\n");
S=sub(X,C,N,M);
VIVOD(S,N,M);
printf("Entered matrix 6E\n");
E=VVOD(N,M);
for ( i = 0; i < N; i++ )
for ( j = 0; j < M; j++ )
if (i==j)E[i][j]=6;
else E[i][j]=0;
VIVOD(E,N,M);
printf("A-6E\n");
V=sub(arr,E,N,M);
VIVOD(V,N,M);
//здесь не слишком понятно какой минимум искать.
printf("min\n");
int index_min = 0;
min = fabs(brr[ 0 ][ j ]);
for (j = 0; j < M; j++)
{for ( i = 0; i < N; i++ )
if ( fabs(brr[ i ][ j ]) < min ) {
min = brr[ i ][ j ];
}}
printf( " |%3d| ", min );
printf( "\n" );
//for ( j = 0; j < M; j++ )
printf( " ----- " );
printf( "\n" );
//
printf("transposed matrix A-6E\n");
AETR =tran(V,N,M);
VIVOD(V,N,M);
printf("Two semicolons -\n");
F=sub(S,AETR,N,M);
VIVOD(F,N,M);
if (min==0){printf("Минимальный элемент равен 0, следовательно деление невозможно!\n");}
else {printf("Ответ\n");
OTV=divis(F,N,M,min);
VIVOD(OTV,N,M);
}
free_memory(arr,N);
free_memory(brr,N);
free_memory(ATR,N);
free_memory(BTR,N);
free_memory(C,N);
free_memory(X,N);
free_memory(S,N);
free_memory(E,N);
free_memory(V,N);
free_memory(AETR,N);
free_memory(F,N);
free_memory(OTV,N);
return 0;
}
int ** VVOD(int N, int M)
{
int i,j,**arr;
arr = (int**)malloc(N * sizeof(int*));
for (i = 0; i < N; i++)
arr[i] = (int*)malloc(M * sizeof(int));
for ( i = 0; i < N; i++ )
for ( j = 0; j < M; j++ )
arr[ i ][ j ] = rand() % 50;
return arr;
}
void free_memory(int **arr,int N)
{
int i;
for(i=0;i<N;i++)
free(arr[i]);
free(arr);
}
void VIVOD(int **arr,int N, int M)
{
int i,j;
for ( i = 0; i < N; i++ ) {
for ( j = 0; j < M; j++ ) {
printf( " |%3d| ", arr[ i ][ j ] );}
printf( "\n" );}
for ( j = 0; j < M; j++ )
printf( " ----- " );
printf( "\n" );
}
void max_up(int **arr,int N, int M)
{
int i,j,max,index_max,t;
for ( j = 0; j < M; j++ ) {
max = arr[ 0 ][ j ];
index_max = 0;
for ( i = 1; i < N; i++ )
if ( arr[ i ][ j ] > max ) {
max = arr[ i ][ j ];
index_max = i;}
t = arr[ 0 ][ j ];
arr[ 0 ][ j ] = max;
arr[ index_max ][ j ] = t; }
}
int **tran(int **arr,int N,int M)
{
int i,j,temp;
int **t;
t=VVOD(N,M);
for(i=0; i<N; ++i){
for(j=i; j<M; ++j)
{ temp=arr[i][j];
t[i][j]=arr[j][i];
t[j][i]=temp;
}
}
return t;
}
int **mult(int **arr, int **brr,int N,int M)
{
int **C,i,j,k;
C=VVOD(N,M);
for (i = 0; i < N; i++)
for (j = 0; j < M; j++)
{
C[i][j] = 0;
for (k = 0; k < M; k++)
C[i][j] += arr[i][k] * brr[k][j];}
return C;
}
int **sub(int **arr, int **brr,int N,int M)
{
int **S,i,j;
S=VVOD(N,M);
for ( i = 0; i < N; i++ )
for ( j = 0; j < M; j++ )
S[i][j]=arr[i][j] - brr[i][j];
return S;
}
int **divis(int **arr,int N,int M, int min)
{
int **OTV,i,j;
OTV=VVOD(N,M);
for ( i = 0; i < N; i++ )
for ( j = 0; j < M; j++ )
OTV[i][j]=arr[i][j] / min;
return OTV;
}
Объяснение кода листинга программы
Этот код представляет собой программу на языке C, которая выполняет различные операции над матрицами. Вначале определяется размер матрицы и считывается из входных данных. Затем создается матрица A и выводится её содержимое. Далее выполняются следующие действия:
- Вычисляется максимальное значение в матрице A и индекс этого значения.
- Выполняется операция транспонирования матрицы A.
- Создается матрица B и выводится её содержимое.
- Вычисляется произведение матриц A и B.
- Вычисляется произведение матриц B и A.
- Вычисляется разность матриц B и A.
- Создается матрица 6E, в которой все элементы равны 6.
- Вычисляется разность матриц A и матрицы 6E.
- Вычисляется минимальное значение в матрице B и проверяется, равно ли оно нулю. Если да, то выводится сообщение о невозможности деления. В противном случае выполняется операция деления матрицы B на минимальное значение и выводится результат.
- Все используемые матрицы освобождаются от выделенной для них памяти. Номер 20 не используется в коде.