Вектор в динамическом массиве

Дано задание: Для квадратной матрицы размера n*n подсчитать среднее арифметическое элементов каждого столбца, исключая элемент на главной диагонали, и сформировать из них вектор. Найти минимальный элемент этого вектора. (Размерность массивов вводит пользователь, значения генерируются. Массив динамический).

// Размер массива вводит пользователь (значения случайны)
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <malloc.h>
#include <locale.h>
#include <conio.h>

int main()
{
    srand(time(NULL));
    unsigned n;
    printf("\tСоздание матрицы размером n*n. Введите значение n: ");
    scanf("%u", &n);

    int **arr;
    arr = (int*)malloc(n*n * sizeof(int));

    printf("\n\tМатрица:\n");
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            arr[i][j] =  rand()%100;
            printf("\t%d ", *(arr + i*n +j));
        }
        printf("\n");
    }
    free(arr);
    getch();
    return 0;
}

Массив создается нормально, но значения через рандом получаются слишком огромными

 double k, m, a = 0, vec[n];
    for (int j = 0; j < n; j++) // среднее арифметическое по столбцам
    {
        for (int i = 0; i < n; i++)
        {
            if(i != j) // исключая элемент на главной диагонали
            a += arr[i][j]; // сумма элементов столбца
        }
        m = a / n; // среднее арифметическое столбца
        vec[j] = m;
        a = 0;
    }

    printf("\n\tВектор:");
    k = vec[0];
    for (int j = 0; j < n; j++)
    {
        printf("\t%.2f ", vec[j]);
        if (k > vec[j]) // поиск минимального элемента вектора
        k = vec[j];
    }

    printf("\n\tМинимальный элемент вектора = ");
    printf("%.2f", k);

Сам вектор не выводится, не очень понимаю как реализовать создание вектора динамического массива. Полагаю, что нужно по другому сделать цикл. Не могу разобраться. Помогите.


Ответы (1 шт):

Автор решения: AlexGlebe
int **arr;
arr = (int*)malloc(n*n * sizeof(int));

malloc - возвращает указатель на вектор, а вы этот указатель переделываете на вектор векторов. Происходит несоотвествие типов.

Дальше :

arr[i][j] =  rand()%100;

здесь вы присваиваете как будто arr - это вектор векторов или матрица, а это не так.

Первый правильный вариант такой, что arr - это вектор в памяти:

int * arr = malloc(n*n * sizeof(int));
printf("\n\tМатрица:\n");
for (int i = 0; i < n; i++)
{
    for (int j = 0; j < n; j++)
    {
        *(arr + i*n +j) = rand()%100;
        printf("\t%d ", *(arr + i*n +j));
    }
    printf("\n");
}
free(arr);

Второй вариант, выделить память для матрицы :

int (* mat)[n][n] = malloc( sizeof(int[n][n]));
printf("\n\tМатрица:\n");
for (int i = 0; i < n; i++)
{
    for (int j = 0; j < n; j++)
    {
        (*mat)[i][j] =  rand()%100;
        printf("\t%d ", (*mat)[i][j]);
    }
    printf("\n");
}
free(mat);

Вот вам два варианта, ответ на почему средние значения огромные. Потому, что значения брались со случайных мест памяти и происходил конфликт неправильного доступа к памяти.

Ошибка вторая : среднее значение вычисляется без диагональных чисел, так :

m = a / (n - 1); // среднее арифметическое столбца
→ Ссылка