В столбце матрицы, где находится минимальный элемент, найти произведение отличных от нуля элементов - 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для вычисления произведения ненулевых элементов в столбце с минимальным значением. - Выводится сообщение об ошибке в случае неправильного ввода размеров матрицы или номера ряда.
- Выводится матрица, максимальное значение в заданном ряду и столбце, в котором оно найдено, и произведение ненулевых элементов в этом столбце.
- Производится освобождение выделенной памяти.