Вектор в динамическом массиве
Дано задание: Для квадратной матрицы размера 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 шт):
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); // среднее арифметическое столбца