Из массива получить последовательность из наименьших положительных элементов - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Нужно из массива получить последовательность (короче, одномерный массив) из наименьших положительных элементов в столбцах этого массива. Проблема вот в чем: когда без указания размеров матрицы - все работает. Но когда я пытаюсь реализовать ввод размера массива с клавиатуры, то тут же получаю отказ проги, а именно не ищутся эти самые наименьшие элементы. Что у меня не так? Вот код:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
 
int main(void)
{
    srand(time(NULL));
    //блок объявления переменных и размерности массива
    int i,j,min,m,k;
    int B[0];
    //printf ("vvedite kolichestvo strok \n");
    scanf ("%d", &m);
    //printf ("vvedite kolichestvo stolbcov \n");
    scanf ("%d", &k);
    int A[m][k];
 
    printf ("\n");
 
    //заполняем массив случайными числами от 0 до 9 и выводим его на экран
    for (i=0; i<m; i++)
    {
        for (j=0; j<k; j++)
            A[i][j]=rand()%10;
    }
 
    for (i=0; i<m; i++)
    {
        for (j=0; j<k; j++)
            printf("%d ", A[i][j]);
            printf("\n");
    }
 
    printf ("\n");
 
    //находим наименьшие положительные элементы
    //в каждом столбце и заносим их в отдельный массив данных
    for (i=0; i<m; i++)
    {
        min = A[0][i];
        for (j=1; j<k; j++)
        {
            if(min > A[j][i])
                min = A[j][i];
                B[i] = min;
        }
    }

    //выводим получившийся массив на экран
    for (i=0; i<k; i++)
    {
        printf ("%d ", B[i]);
    }

    return 0;
}

Решение задачи: «Из массива получить последовательность из наименьших положительных элементов»

textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
 
int main()
{
    int **Matrix, *arr, min, n, m, i, j, k=0;
    char c;
    bool flag=false;
 
    do 
    {
        system("cls");
        printf("Insert the amount of strings: ");
        scanf("%d", &n);
        printf("Insert the amount of columns: ");
        scanf("%d", &m);
 
        Matrix=(int**)calloc(n, sizeof(int*));        //
        for (i=0; i<n; i++)                           //Выделение памяти под матрицу размером n*m
            *(Matrix+i)=(int*)calloc(m, sizeof(int)); //
 
        arr=(int*)calloc(m ,sizeof(int));             //Выделение памяти под массив
 
        printf("\nInsert the Matrix:\n");
        for (i=0; i<n; i++)
            for (j=0; j<m; j++)
            {
                printf("Insert the element [%d, %d]: ", i+1, j+1);
                scanf("%d", *(Matrix+i)+j);
            }
 
        printf("\nYour Matrix:\n"); 
        for (i=0; i<n; i++)
        {
            for (j=0; j<m; j++)
                printf("%3d", *(*(Matrix+i)+j));
            printf("\n");
        }
 
        for (j=0; j<m; j++)
        {
            flag=false;                                            //Флаг о найденном минимальном в столбце
            i=0;
 
            while (i<n)                                            
            {                                                      
                if (*(*(Matrix+i)+j)>0)                            
                {                                                  
                    min=*(*(Matrix+i)+j);                          
                    break;                                           
                }                                                   
                else                                               
                    i++;                                           
            }                                                      
 
            for (i; i<n; i++)
                if ( *(*(Matrix+i)+j)>0 && *(*(Matrix+i)+j)<=min)
                {
                    min=*(*(Matrix+i)+j);
                    flag=true;
                }
 
            if (flag==true)
                *(arr+k++) = min;
        }
 
        if (k!=m)
            arr=(int*)realloc(arr, k*sizeof(int));
 
        printf("\nResult:\n");
        for (i=0; i<k; i++)
            printf("%3d", *(arr+i));
 
        for (i=0; i<n; i++)
            free(*(Matrix+i));
        free(Matrix);
        Matrix=NULL;
 
        free(arr);
        arr=NULL;
 
        printf("\nRun the programm again? y/n");
        c=getch();
    } while (c=='y');
    return 0;
}

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

  1. Ввод количества строк и столбцов матрицы
  2. Выделение памяти под матрицу и заполнение её элементами
  3. Поиск минимального положительного элемента в каждом столбце матрицы и сохранение их в отдельный массив
  4. Вывод результата на экран
  5. Вопроса о повторном запуске программы
  6. В случае положительного ответа, процесс повторяется с начала
  7. В случае отрицательного ответа, программа завершается

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


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

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

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