Требуется составить программу, которая проверяет, является ли введённая
Условие
Требуется составить программу, которая проверяет, является ли введённая с клавиатуры целочисленная квадратная матрица размером 10х10 "магическим квадратом", то есть равны ли между собой суммы элементов каждой строки, каждого столбца и суммы элементов каждой диагонали. Критерии оценивания выполнения задания | Баллы | Предложен правильный алгоритм, выдающий верное значение. Допускается запись алгоритма на другом языке, использующая аналогичные переменные. В случае, если язык программирования использует типизированные переменные, описания переменных должны быть аналогичны описаниям переменных на естественном языке. Использование нетипизированных или необъявленных переменных возможно только в случае, если это допускается языком программирования, при этом количество переменных и их идентификаторы должны соответствовать условию задачи. В алгоритме, записанном на языке программирования, допускается наличие отдельных синтаксических ошибок, не искажающих замысла автора программы. | 2 | В любом варианте решения может присутствовать не более одной ошибки из числа следующих: 1) не инициализируется или неверно инициализируется переменная; 2) при выводе ответа не учитывается, что требуемого числа в массиве может не быть; 3) отсутствует вывод ответа; 4) в сравнении перепутан знак; 5) неверно осуществляется проверка делимости; 6) на делимость проверяется не значение элемента, а его индекс; 7) в сложном условии вместо логической операции «И» используется логическая операция «ИЛИ»; 8) используется переменная, не объявленная в разделе описания переменных; 9) не указано или неверно указано условие завершения цикла; 10) индексная переменная в цикле не меняется (например, в цикле while) или меняется неверно; 11) неверно расставлены операторные скобки | 1 | Ошибок, перечисленных в п. 1-11, две или больше, или алгоритм сформулирован неверно | 0 | Максимальный балл | 2 |
Формат задания
Решение по шагам
Как рассуждать
Решение. uses crt;const n=10;var a:array[1..n,1..n] of integer; ok:boolean; i,j,k:integer; sum:integer; temp:integer;beginfor i:=1 to n dofor j:=1 to n doreadln(a[i,j]); Ok:=True;sum:=0;//считаем главную диагональfor i:=1 to n dosum:=sum+a[i,i]; {Вычисляем сумму по строкам} i:=1; repeat temp:=0; for j:=1 to n do temp:=temp+a[i,j]; i:=i+1; if temp <> sum then ok:=False; until (ok=false) or (i>n); //если сумма по строкам подходит, то вычисляем по столбцамif ok=true thenbeginj:=1;repeattemp:=0;for i:=1 to n dotemp:=temp+a[i,j];j:=j+1;if temp <> sum thenok:=False;until (ok=false) or (j>n);end; //далее по диагоналямif ok=true thenbegink:=1;repeattemp:=0;for i:=1 to n do beginj:=i+k;if j>n then j:=j-n;temp:=temp+a[i,j];end;k:=k+1;if temp <> sum thenok:=False;until (ok=false) or (k>=n);end; if ok=true thenbegink:=1;repeattemp:=0;for i:=1 to n do beginj:=k-i;if j<1 then j:=j+n;temp:=temp+a[i,j];end;k:=k+1;if temp <> sum thenok:=False;until (ok=false) or (k>n);end;
Осталось ещё 1 шаг
Полный разбор с проверкой ответа
Бесплатно · займёт минуту