Pers.narod.ru. Алгоритмы. Симметричный одномерный и двумерный массивы |
Задача состоит в том, чтобы проверить, симметричен ли одномерный массив (т.е., совпадает ли его первый элемент с последним, второй с предпоследним и т.д.)
Для целочисленного массива s
размерностью n
(данные вводятся с клавиатуры, правильность ввода не контролируется), получается следующая программа:
#include <stdio.h> #include <conio.h> void main() { int i, n, s[100]; //Ввод данных printf ("\nEnter size of array: "); scanf ("%d",&n); printf ("\nEnter %d item(s) of array: ",n); for (i=0;i<n;i++) scanf("%d", &s[i]); //Обработка int simm=1; //Предположили, что массив симметричен for (i=0;i<n/2;i++) //Цикл от 1-го элемента до середины; т.к. деление целых в C++ даёт целое, //проблемы с четным или нечетным числом элементов в массиве не возникнет if (s[i]!=s[n-1-i]) { //Если хотя бы раз есть различные по значению элементы, стоящие симметрично //относительно середины массива, simm=0; break; //то массив не симметричен, сбросить флаг и выйти из цикла } if (simm==1) printf ("\nYes"); //выводим ответ Да или Нет else printf ("\nNo"); getch(); return; }
Основные действия листинга закомментированы, думаю, он понятен.
Для двумерного массива или матрицы понятие симметричности выглядит естественней - обычно имеется в виду матрица, симметричная относительно главной диагонали, то есть, такая матрица, элементы которой ai,j
и
aj,i
совпадают для всех различных между собой пар индексов i,j
.
Для решения достаточно организовать двойной цикл с переменной границей вложенного цикла (см. тут, задача 4), который будет перебирать элементы выше (или ниже) главной диагонали и сравнивать их с симметрично расположенными элементами.
#include <stdio.h> void main () { const int n=4; int a[n][n]= { {1,2,3,4}, {2,1,5,6}, {3,5,1,7}, {4,6,7,1} }; int i,j; int simm=1; for (i=0; i<n; i++) for (j=i+1; j<n; j++) if (a[i][j]!=a[j][i]) { simm=0; break; } printf ("\n%s",(simm?"Yes":"No")); getchar(); }
гостевая; E-mail |