PDA

Показать полную графическую версию : Магический квадрат


colds0ul@vk
03-09-2014, 20:35
Написать программу, которая проверяет, является ли введенная с клавиатуры
квадратная матрица "магическим" квадратом.

"Магическим" квадратом называется матрица, у которой сумма чисел в каждом
горизонтальном ряду, в каждом вертикальном и по каждой из диагоналей одна
и та же. Надеюсь, что люди умные тут сидят, сколько сам пытался написать ничего не выходит...

LehaMechanic
03-09-2014, 20:56
Предлагаете за вас всё написать? Где ваш код?

colds0ul@vk
03-09-2014, 21:00
LehaMechanic, #include <stdio.h>



void main()
{

const int Height = 2;
const int Weight = 2;


int matrix[Height][Weight]= { {0, 0}, {0, 0} };


int sumINSTR = 0; //сумма в строках
int sumINSTB = 0; //сумма в столбцах
int DYAG1 = 0; //cумма в одной диагонали.
int DYAG2 = 0; //сумма в другой диагонали.

//Суммируем с строках
for(int i = 0;i<Height;i++){
for(int j = 0;j<Weight;j++){
sumINSTR+=matrix[i][j];


}


}
//Суммируем в столбцах
for(int t = 0;t<Weight;t++){
for(int j = 0;j<Height;j++){
sumINSTB+=matrix[t][j];


}
}


//Если матрица не квадратная возможен выход за буфер по строке
//Суммируем в одной диагонали
for(int p = 0, j = 0; p<Weight; p++,j++){

DYAG1+=matrix[p][j];



}


//Если матрица не квадратная возможен выход за буфер по строке
//Суммируем в другой диагонали
for(int g = 0, k = Weight-1; k>=0; g++,k--){

DYAG2+=matrix[g][k];


}


//Выводим суммы----------------
printf("%d",sumINSTR);printf("\n");
printf("%d",sumINSTB);printf("\n");
printf("%d",DYAG1);printf("\n");
printf("%d",DYAG2);printf("\n");
//-----------------------------


int CONTROL = sumINSTR;
//Проверка
if((sumINSTB==CONTROL)&&(DYAG1==CONTROL)&&(DYAG2==CONTROL)){
printf("Magic Matrix\n");
}


return;
} вот

LehaMechanic
03-09-2014, 21:33
//Суммируем с строках
for(int i = 0;i<Height;i++){
for(int j = 0;j<Weight;j++){
sumINSTR+=matrix[i][j];

Что вы здесь сделали? Вы этим суммируете все элементы матрицы, проходя по ним последовательно от первого до последнего, разве нет? А надо отдельно просуммировать первую строку, отдельно вторую и т.д.

Та же самая фигня у вас и для столбцов.

mwz
04-09-2014, 15:57
//Если матрица не квадратная возможен выход за буфер по строке »

Проверку на то, какую матрицу нам подсунули, надо осуществлять первым же делом, и если она не квадратная – выводить сообщение типа "Ну что вы мне тут подсовываете!" и завершать работу программы.

Tau_0
04-09-2014, 16:58
Проверку на то, какую матрицу нам подсунули, надо осуществлять первым же делом, »
А вот это и не обязательно, --- корректность данных запросто вызывающая/серверная часть кода может обеспечить...

Iska
04-09-2014, 18:21
Tau_0, обязательно. Иначе и быть не должно.

mwz
04-09-2014, 19:13
вызывающая/серверная часть кода может обеспечить »

А может и не обеспечить. :)
Почему и предпочитал всегда закладывать проверки на допустимость всех данных, какие возможно: "лучше перебдеть чем недобдеть". Как, впрочем, и инициализацию массивов в случаях, когда их можно не декларировать заранее а создавать по ходу дела.

Tau_0
04-09-2014, 20:53
А может и не обеспечить. »
обязательно. Иначе и быть не должно. »
Это вы мне фортранщику, который десять лет занимался проекционно-сеточными методами пишете ...???... Я не только сам кодировал, но и смотрел/разбирал исходные тексты больших промышленных программных комплексов, --- как америкосы это делают...

Как правило за ВСЁ отвечает вызывающий модуль/программа, которая и генерирует данные. Хотя в зависимости от алгоритма порою и вниз задачу спустить можно

В силу специфики задач (разреженные симметричные положительно определённые квадратные матрицы) для хранения матриц использовались ленточные и профильные схемы (одномерный масств + массивы указателей), а не двухмерные массивы.

ЗЫ Зачем что-то долго в крутить в цикле на неверных данных..???...

ЗЗЫ Про студенческие программки я не говорю --- приказали проверять (мусора наплодить), --- приказ следует выполнять...

mwz
05-09-2014, 00:27
приказали проверять (мусора наплодить), --- приказ следует выполнять.. » (и остальное)

Ага. :)
Но "если бы директором был я", то за такие отвлечённые комментарии в тексте курсовой одного балла студент точно не досчитался бы. В обоих случаях: и если вызывающий модуль выполняет эту проверку, в т.ч. если матрица даётся преподавателем гарантированно квадратная (что означает, что работа выполнена вообще бездумно), и если не выполняет (а тогда какого хрена не учёл, зная из этих слизанных комментариев, что возможен нештатный вылет программы). ;)

Iska
05-09-2014, 01:00
Это вы мне фортранщику, который десять лет занимался проекционно-сеточными методами пишете ...???... Я не только сам кодировал, но и смотрел/разбирал исходные тексты больших промышленных программных комплексов, --- как америкосы это делают...
Как правило за ВСЁ отвечает вызывающий модуль/программа, которая и генерирует данные. Хотя в зависимости от алгоритма порою и вниз задачу спустить можно »
Да, это я Вам, как художник художнику бывший фортранщик (ассемблерщик, бейсиковец, сишник, паскалевец, проложец и фокпровед) фортранщику, пишу: процедура/функция, как программный модуль, должна представлять собой идеальный «чёрный ящик». И, в данном случае, она обязана проверять, что переданный параметр — матрица, и что эта матрица — квадратная.

И мне крайне странно слышать противное от человека, не понаслышке знакомого именно с фортраном: ведь именно в нём были заложены данные базовые основы.

Tau_0
05-09-2014, 10:58
я Вам, как художник художнику »
Когда я писал свой предыдущий пост, то имел в виду, что очень накладно и глупо делать проверки там, где ошибок быть в принципе быть не должно… А подпрограмма в цикле из вызывающейй должна обрабатывать десятки тысяч элементов (пусть это будут "квадраты"). А вот почему я из тела основной программы вынес это дело в подпрограмму – значит был резон. Но это слишком далеко в сторону…

Я не видел ни одного человека, который бы додумался при отладке , что-то вводить и выводить с консоли… Эта задачка для кадетов, которых в воспитательных и образовательных целях учат зубной щёткой пол в казарме мыть…
Лично я бы сделал акцент именно на численной стороне алгоритма --- его красивости…

ЗЫ Пиписьками не меряясь, но вот в качестве флуда мои представления:
1. Бейсик --- язык для идиотов…
2. Ассемблер – он и есть ассемблер. Там почти ничего при получении адреса своей системной таблицы не проверишь. Дай Бог хоть с плохим RC назад вернуться, а не "прыгать с парашутом"… В самом начале с ассемблера начинал --- честно отпахал 3 года призыва.
3. На C, С++ кодировал немного --- не понравился. Телеграфный код, а не язык
4. Почти 4 года (ещё под DOS) кодировал на Modula 2. Этоn язык был покрасившее чем учебный Pascal. Из них три года делал дурные ускорители FoxPro
5. А вот Prolog на зуб не пробовал --- это круто…:kruto:

А любимым остался Fortran и численные методы... А если ещё выше, то Физика и Математика, которые за этим делом стоят.
Язык --- это не самоцель, но системное/логическое программирование это одно, а численные методы это совсем другое.

Iska
05-09-2014, 13:05
Когда я писал свой предыдущий пост, то имел в виду, что очень накладно и глупо делать проверки там, где ошибок быть в принципе быть не должно… А подпрограмма в цикле из вызывающейй должна обрабатывать десятки тысяч элементов (пусть это будут "квадраты"). »
Ход Ваших мыслей понятен, но в целом — неверен.

5. А вот Prolog на зуб не пробовал »
Можно просто ради интереса почитать какой-нибудь приличный учебник — язык с машиной вывода сам по себе очень красив. Читается легко.

Tau_0
05-09-2014, 16:31
Можно просто ради интереса почитать какой-нибудь приличный учебник — язык с машиной вывода сам по себе очень красив. Читается легко. »
Читать это одно (где-то несколько неплохих книг у меня много лет пыляться...), а пробовать на реальной нужной задаче это совсем другое. Пока такой задачи у меня нет.

Ход Ваших мыслей понятен, но в целом — неверен. »
О моде и вкусах не спорят…, --- это всего касается...

А бессмертные слова Эстера Дейкстры гласят, ---“Объектно-ориентрованное программирование — это исключительно плохая идея, которую могли придумать только в Калифорнии.”...:gigi::gigi::gigi:

Iska
05-09-2014, 16:51
Читать это одно (где-то несколько неплохих книг у меня много лет пыляться...), а пробовать на реальной нужной задаче это совсем другое. Пока такой задачи у меня нет. »
Не спорю. Я просто предлагал почитать, чтобы получить чисто эстетическое наслаждение. Например, хорош Иван Братко (https://www.google.ru/search?q=%D0%91%D1%80%D0%B0%D1%82%D0%BA%D0%BE+%D0%9F%D1%80%D0%BE%D0%BB%D0%BE%D0%B3).

О моде и вкусах не спорят…, --- это всего касается... »
Это не мода, и не вкус. Это требование.

А бессмертные слова Эстера Дейкстры гласят, ---“Объектно-ориентрованное программирование — это исключительно плохая идея, которую могли придумать только в Калифорнии.”... »
А это вовсе не ООП ;). Это то самое набившее оскомину cтруктурное программирование (http://ru.wikipedia.org/wiki/%D0%A1%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0 %B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5), к созданию которого и приложил руку Эдсгер.

Tau_0
06-09-2014, 11:23
Это то самое набившее оскомину cтруктурное программирование, к созданию которого и приложил руку Эдсгер. »
Тогда мне совсем непонятен полёт Вашей высокой мысли...
Продолжим однако, оно того стОИт… Заодно и проверим фортранщика на зуб…:)
Вот Вам код подпрограммы всего на двух страничках…
LU_73 (http://rghost.ru/57872677/image.png)
LU_74 (http://rghost.ru/57872712/image.png)

Это не деЦЦкий код. Это из одного серьёзного пакета для FEM/МКЭ, написанного ещё на легендарном FORTRAN 66 для DEC/VAX. По крайней мере код профилирован, и поверьте мне на слово, более чем удовлетворяет требованиям структурного программирования… Как сверху вниз, так и снизу вверх, а также в любом направлении…

Речь идёт в целом море “квадратов и квадратиков” и подпрограмм в пакете полно… Но ни в одной компоненте не найдёте юниорских, так милых Вашему сердцу проверок…

Добавлено
=======
Нашёл pdf оригинала -- его проще обозреть...
ComputerSolution of Sparse Linear Systems (http://web.engr.illinois.edu/~heath/courses/cs598mh/george_liu.pdf)

XPEHOMETP
08-09-2014, 12:35
Сумма всех элементов по столбцам (или строкам) квадратной матрицы в данном случае тоже может быть полезна. Ибо, если она не делится на некое целое число (так сказать, магическое), то опять же можно ответственно заявить, что задача поставлена неверно. Или пользователь навалял дурака с вводом.

Tau_0
08-09-2014, 13:27
XPEHOMETP, немногие квадратные матрицы являются магическими. Посмотрел в Вики (https://ru.wikipedia.org/wiki/Магический_квадрат) и каких-то полезных теоретико групповых или иных свойств этих квадратов, кроме забавной магии..., не узрел...

А пример решения этой задачки приведен на кибере
C++ - Проверить является ли квадратная матрица " магическим квадратом" (http://www.cyberforum.ru/cpp-beginners/thread590513.html)




© OSzone.net 2001-2012