Создать симметричную матрицу которая хранится в одномерном массиве - 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;
}

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

В этом коде создается и заполняется случайными числами одномерный массив, который представляет собой симметричную матрицу. Затем этот массив транспонируется (переворачивается по диагонали) и выводится на экран. В конце программы массив освобождается от выделенной для него памяти.

  1. int GetAddr(int i, int j) - функция для вычисления адреса элемента матрицы.
  2. int main (void) - главная функция программы.
  3. scanf (%d, &n) - ввод размера матрицы (n) с клавиатуры.
  4. a = (int )malloc(0.5n(n+1) sizeof(int)) - выделение памяти под массив.
  5. for (i=0; i < n; i++) - цикл для заполнения матрицы случайными числами.
  6. printf (%d, a[i]) - вывод элемента матрицы на экран.
  7. *n = (sqrt(8 n + 1) - 1) / 2** - вычисление размера транспонированной матрицы.
  8. for (i=0; i < n; printf(\n), i++) - цикл для вывода транспонированной матрицы на экран.
  9. free(a) - освобождение памяти под массив.
  10. return 0 - завершение программы.

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


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

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

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