Вы не получаете симметричную матрицу, потому что вы неправильно обращаетесь к индексу матрицы.Позвольте мне объяснить немного подробнее.
Используемая вами матрица имеет размер size-1 x size-1
, поэтому, если size=5
, то матрица, которую вы выделяете, имеет размер 4x4
, поэтомутолько 16 элементов в вашей матрице.(И вам на самом деле нужно 25 элементов).
Но при обходе матрицы для ее заполнения вы получаете доступ к индексу, например [4,4]
, что означает, что ваша матрица должна (логически) иметь 25 элементов.(Но это не так).
Таким образом, есть два способа избавиться от этой ошибки:
- Вы можете изменить свой цикл
for
на for(int i=0;i<size-1;i++)
, чтобы вы не делалиНе обращайтесь к элементам неожиданным образом. - Вы можете увеличить размер массива до
size x size
вместо size-1 x size-1
.
Окончательный код будет выглядеть примерно так(Я публикую только основную часть):
int matrix[size][size];
for(int i=0;i<size;i++){
for(int j=i;j<size;j++){
num = rand()%100+1;
matrix[i][j]=num;
matrix[j][i]=num;
}
}
В качестве оптимизации вы можете избежать перезаписи значений, поставив запуск внутреннего цикла для j
с самого i
, так чтозначения в верхнем треугольнике матрицы генерируются случайным числом, а нижние значения треугольника заполняются значением в соответствующей симметричной ячейке в верхнем треугольнике.
Я думаю, что вы хотите задать вопрос, чтобы узнатьи поправиться, поэтому я ответил подробно с некоторыми дополнительными комментариями.Я надеюсь, что это было полезно.:)