Создать симметричную матрицу которая хранится в одномерном массиве - 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 - завершение программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д