Создать симметричную матрицу которая хранится в одномерном массиве - C (СИ)
Формулировка задачи:
Хочу создать симметричную матрицу которая хранится в одномерном массиве, где построчно записаны элементы, стоящие не ниже главной диагонали. Т.е к примеру:
массив: 1 2 3 4 5 6
матрица:
1 2 3
2 4 5
3 5 6
Подумал, что можно задать условие в виде: i=j и i>j (т.е на главную диагональ и выше записываем числа в массиве, ну а ниже главной диагонали по тому же принципу примерно). Программа не работает, мб идея не правильно реализуемая или стоит делать совсем иначе?(пытаюсь сделать максимально просто)
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <time.h>
int main () {
int i,j,n,*A,**B,count;
printf ("vvedite razmer massiva\n");
scanf ("%d",&count);
srand(time(NULL));
A = (int *)malloc(count * sizeof(int));
B = (int **)malloc(n * sizeof(int*));
n = (sqrt(8 * count + 1) - 1) / 2;
for (i=0;i<count;i++) {
A[i]=rand()%10;
printf ("%d ",A[i]); }
for (i=0;i<n;i++) {B[i]=(int *)malloc(sizeof(int)*n); printf ("\n");
for (j=0;j<n;j++) { if (i==j && i>j) {printf ("%d",A[i]);}
printf ("%3d",B[i][j]); }}
free(A);
free(B);
getch (); return 0; }
Неужели никто не может помочь в создании такой матрицы? (
Решение задачи: «Создать симметричную матрицу которая хранится в одномерном массиве»
textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "time.h"
int GetAddr(int i, int j)
{
return i > j ? j+i*(i+1)/2 : i+j*(j+1)/2;
}
int main (void)
{
int i, j, n;
int *a;
srand(time(NULL));
printf ("Input n: "); scanf ("%d", &n);
a = (int *)malloc(0.5*n*(n+1) * sizeof(int));
for (i=0; i < n; i++)
{
a[i] = rand()%10;
printf ("%d ", a[i]);
}
printf("\n\n");
n = (sqrt(8 * n + 1) - 1) / 2;
for (i=0; i < n; printf("\n"), i++)
for (j=0; j < n; j++)
printf("%d ", a[GetAddr(i, j)]);
free(a);
return 0;
}
Объяснение кода листинга программы
В этом коде создается и заполняется случайными числами одномерный массив, который представляет собой симметричную матрицу. Затем этот массив транспонируется (переворачивается по диагонали) и выводится на экран. В конце программы массив освобождается от выделенной для него памяти.
- int GetAddr(int i, int j) - функция для вычисления адреса элемента матрицы.
- int main (void) - главная функция программы.
- scanf (
%d, &n) - ввод размера матрицы (n) с клавиатуры. - a = (int )malloc(0.5n(n+1) sizeof(int)) - выделение памяти под массив.
- for (i=0; i < n; i++) - цикл для заполнения матрицы случайными числами.
- printf (
%d, a[i]) - вывод элемента матрицы на экран. - *n = (sqrt(8 n + 1) - 1) / 2** - вычисление размера транспонированной матрицы.
- for (i=0; i < n; printf(
\n), i++) - цикл для вывода транспонированной матрицы на экран. - free(a) - освобождение памяти под массив.
- return 0 - завершение программы.