В столбце матрицы, где находится минимальный элемент, найти произведение отличных от нуля элементов - 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);
}

Объяснение кода листинга программы

Код решает задачу поиска произведения элементов в столбце матрицы, где находится минимальный элемент.

  1. В функции random_fill происходит заполнение матрицы случайными числами от 0 до 9 с помощью функции rand().
  2. Функция max_element находит максимальный элемент в заданном ряду матрицы.
  3. Функция multiply_column находит произведение ненулевых элементов в заданном столбце матрицы.
  4. В функции print_matrix происходит вывод содержимого матрицы на экран.
  5. В функции main создается матрица заданного размера с помощью динамического выделения памяти.
  6. С помощью функции scanf() вводятся размеры матрицы и номер ряда, в котором нужно найти максимальное значение.
  7. Вызываются функции random_fill, max_element и multiply_column для вычисления произведения ненулевых элементов в столбце с минимальным значением.
  8. Выводится сообщение об ошибке в случае неправильного ввода размеров матрицы или номера ряда.
  9. Выводится матрица, максимальное значение в заданном ряду и столбце, в котором оно найдено, и произведение ненулевых элементов в этом столбце.
  10. Производится освобождение выделенной памяти.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 3.7 из 5
Похожие ответы