В столбце матрицы, где находится минимальный элемент, найти произведение отличных от нуля элементов - C (СИ)
Формулировка задачи:
Помогите, пожалуйста. Задание было такое:
"Дана матрица A(N,M) и число k, вводимые с клавиатуры. В k-ой строке найти минимальный элемент.
В том столбце, где этот элемент находится, найти произведение отличных от нуля элементов. Каждый этап решить при помощи подпрограммы,
работающей с вектором."
Вот я написал программу, которая находит минимальный элемент, находит тот столбец, где этот элемент живет и находит произведение отличных от нуля элементов.
Проблема в том, что пока сложно разобраться в том, как пользоваться возвратными функциями (подпрограммы). Помогите, как это можно решить при помощи подпрограмм.
Код внизу (без подпрограмм-фунций)
/*Дана матрица A(N,M), которая вводится из файла, и число k, вводимое с клавиатуры. В k-ой строке найти минимальный элемент. В том столбце, где этот элемент находится, найти произведение отличных от нуля элементов. Каждый этап решить при помощи подпрограммы, работающей с вектором. Вектор "вырезать" из матрицы*/ #include<stdio.h> #include<stdlib.h> #include<conio.h> #include<math.h> #define N 3 main() { int a[N][N], p[N], s[N]; int i, j; int k, l; int min; printf("Vvedite elementy matricy:\n"); for(i=1; i<=N; i++) { for(j=1; j<=N; j++) { scanf("%d", &a[i][j]); } } printf("Vy vveli massiv:\n"); for(i=1; i<=N; i++) { printf("\n"); for(j=1; j<=N; j++) { printf("%d ", a[i][j]); } } printf("\nVvedite k-stroku (ot 1go do 3h): "); scanf("%d", &k); printf("\n%d stroka matricy: ", k); for(i=k; i<k+1; i++) { for(j=1; j<=N; j++) { p[j]=a[i][j]; printf("%d ", p[j]); } } min = p[1]; l=1; printf("\nMinimalniy element %d stroki: ", k); for(j=1; j<=N; j++) { if(min > p[j]) {min = p[j]; l=j;} } printf("%d\n", min); printf("Proizvedenie elementov (!=NULL) v %dm stolbce: ", l); for(j=l; j<l+1; j++) { s[j]=1; for(i=1; i<=N; i++) { if(a[i][j]==0) a[i][j]=1; s[j]*=a[i][j]; } } for (j=l; j<l+1; j++) { printf("%d", s[j]); } printf("\n"); getch(); system("pause"); }
Решение задачи: «В столбце матрицы, где находится минимальный элемент, найти произведение отличных от нуля элементов»
textual
Листинг программы
#include <stdio.h> #include <stdlib.h> #include <time.h> void random_fill(int ** matrix, int rows, int columns){ int i, j; for ( i = 0; i < rows; ++i ) for ( j = 0; j < columns; ++j ) matrix[i][j] = rand() % 10; } int * max_element(int * arr, int size){ int * me = arr; while ( --size ) if ( *++arr > *me ) me = arr; return me; } int multiply_column(int ** matrix, int rows, int column){ int result = 1, i; for ( i = 0; i < rows; ++i ) if ( matrix[i][column] ) result *= matrix[i][column]; return result; } void print_matrix(int ** matrix, int rows, int columns ){ int i, j; for ( i = 0; i < rows; ++i ) for ( j = 0; j < columns; ++j ) printf("%d%c", matrix[i][j], ( j < columns - 1 ) ? ' ' : '\n'); } /* эти два объявления не обязательны, просто защита от фанатизма */ #define MAX_ROWS 20 #define MAX_COLUMNS 40 int main(void){ int ** matrix, rows, columns, testRow, testColumn, * pMaxElement, i; printf("Rows: "); scanf("%d", &rows); printf("Columns: "); scanf("%d", &columns); printf("Index of row to find max element: "); scanf("%d", &testRow); if ( rows < 1 || rows > MAX_ROWS || columns < 1 || columns > MAX_COLUMNS || testRow < 0 || testRow > rows - 1 ){ printf("Wrong parameter(s)\n"); exit(1); } if ( ( matrix = (int**)malloc(sizeof(int*) * rows) ) == NULL ){ perror("malloc"); exit(1); } for ( i = 0; i < rows; ++i ){ if ( ( matrix[i] = (int*)malloc(sizeof(int) * columns) ) == NULL ){ perror("malloc"); exit(1); } } srand(time(NULL)); random_fill(matrix, rows, columns); pMaxElement = max_element(matrix[testRow], columns); testColumn = pMaxElement - matrix[testRow]; printf("\nMatrix:\n"); print_matrix(matrix, rows, columns); printf("Maximum value in row indexed by %d is %d\n", testRow, *pMaxElement); printf("Found in column indexed by %d\n", testColumn); printf("Multiply of non zero elements in this column is %d\n", multiply_column(matrix, rows, testColumn)); for ( i = 0; i < rows; ++i ) free(matrix[i]); free(matrix); exit(0); }
Объяснение кода листинга программы
Код решает задачу поиска произведения элементов в столбце матрицы, где находится минимальный элемент.
- В функции
random_fill
происходит заполнение матрицы случайными числами от 0 до 9 с помощью функцииrand()
. - Функция
max_element
находит максимальный элемент в заданном ряду матрицы. - Функция
multiply_column
находит произведение ненулевых элементов в заданном столбце матрицы. - В функции
print_matrix
происходит вывод содержимого матрицы на экран. - В функции
main
создается матрица заданного размера с помощью динамического выделения памяти. - С помощью функции
scanf()
вводятся размеры матрицы и номер ряда, в котором нужно найти максимальное значение. - Вызываются функции
random_fill
,max_element
иmultiply_column
для вычисления произведения ненулевых элементов в столбце с минимальным значением. - Выводится сообщение об ошибке в случае неправильного ввода размеров матрицы или номера ряда.
- Выводится матрица, максимальное значение в заданном ряду и столбце, в котором оно найдено, и произведение ненулевых элементов в этом столбце.
- Производится освобождение выделенной памяти.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д