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