Функция неверно заполняет матрицу - 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 не используется в коде.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д