Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Магический квадрат (http://forum.oszone.net/showthread.php?t=287444)

colds0ul@vk 03-09-2014 20:35 2398009

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

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

LehaMechanic 03-09-2014 20:56 2398017

Предлагаете за вас всё написать? Где ваш код?

colds0ul@vk 03-09-2014 21:00 2398021

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 2398031

Код:

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

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

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

mwz 04-09-2014 15:57 2398328

Цитата:

Цитата colds0ul@vk
//Если матрица не квадратная возможен выход за буфер по строке »

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

Tau_0 04-09-2014 16:58 2398369

Цитата:

Цитата mwz
Проверку на то, какую матрицу нам подсунули, надо осуществлять первым же делом, »

А вот это и не обязательно, --- корректность данных запросто вызывающая/серверная часть кода может обеспечить...

Iska 04-09-2014 18:21 2398415

Tau_0, обязательно. Иначе и быть не должно.

mwz 04-09-2014 19:13 2398438

Цитата:

Цитата Tau_0
вызывающая/серверная часть кода может обеспечить »

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

Tau_0 04-09-2014 20:53 2398484

Цитата:

Цитата mwz
А может и не обеспечить. »

Цитата:

Цитата Iska
обязательно. Иначе и быть не должно. »

Это вы мне фортранщику, который десять лет занимался проекционно-сеточными методами пишете ...???... Я не только сам кодировал, но и смотрел/разбирал исходные тексты больших промышленных программных комплексов, --- как америкосы это делают...

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

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

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

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

mwz 05-09-2014 00:27 2398554

Цитата:

Цитата Tau_0
приказали проверять (мусора наплодить), --- приказ следует выполнять.. »

(и остальное)

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

Iska 05-09-2014 01:00 2398562

Цитата:

Цитата Tau_0
Это вы мне фортранщику, который десять лет занимался проекционно-сеточными методами пишете ...???... Я не только сам кодировал, но и смотрел/разбирал исходные тексты больших промышленных программных комплексов, --- как америкосы это делают...
Как правило за ВСЁ отвечает вызывающий модуль/программа, которая и генерирует данные. Хотя в зависимости от алгоритма порою и вниз задачу спустить можно »

Да, это я Вам, как художник художнику бывший фортранщик (ассемблерщик, бейсиковец, сишник, паскалевец, проложец и фокпровед) фортранщику, пишу: процедура/функция, как программный модуль, должна представлять собой идеальный «чёрный ящик». И, в данном случае, она обязана проверять, что переданный параметр — матрица, и что эта матрица — квадратная.

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

Tau_0 05-09-2014 10:58 2398651

Цитата:

Цитата Iska
я Вам, как художник художнику »

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

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

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

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






Iska 05-09-2014 13:05 2398692

Цитата:

Цитата Tau_0
Когда я писал свой предыдущий пост, то имел в виду, что очень накладно и глупо делать проверки там, где ошибок быть в принципе быть не должно… А подпрограмма в цикле из вызывающейй должна обрабатывать десятки тысяч элементов (пусть это будут "квадраты"). »

Ход Ваших мыслей понятен, но в целом — неверен.

Цитата:

Цитата Tau_0
5. А вот Prolog на зуб не пробовал »

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

Tau_0 05-09-2014 16:31 2398806

Цитата:

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

Читать это одно (где-то несколько неплохих книг у меня много лет пыляться...), а пробовать на реальной нужной задаче это совсем другое. Пока такой задачи у меня нет.

Цитата:

Цитата Iska
Ход Ваших мыслей понятен, но в целом — неверен. »

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

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

Iska 05-09-2014 16:51 2398822

Цитата:

Цитата Tau_0
Читать это одно (где-то несколько неплохих книг у меня много лет пыляться...), а пробовать на реальной нужной задаче это совсем другое. Пока такой задачи у меня нет. »

Не спорю. Я просто предлагал почитать, чтобы получить чисто эстетическое наслаждение. Например, хорош Иван Братко.

Цитата:

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

Это не мода, и не вкус. Это требование.

Цитата:

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

А это вовсе не ООП ;). Это то самое набившее оскомину cтруктурное программирование, к созданию которого и приложил руку Эдсгер.

Tau_0 06-09-2014 11:23 2399120

Цитата:

Цитата Iska
Это то самое набившее оскомину cтруктурное программирование, к созданию которого и приложил руку Эдсгер. »

Тогда мне совсем непонятен полёт Вашей высокой мысли...
Продолжим однако, оно того стОИт… Заодно и проверим фортранщика на зуб…:)
Вот Вам код подпрограммы всего на двух страничках…
LU_73
LU_74

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

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

Добавлено
=======

Нашёл pdf оригинала -- его проще обозреть...
ComputerSolution of Sparse Linear Systems


XPEHOMETP 08-09-2014 12:35 2399980

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

Tau_0 08-09-2014 13:27 2399999

XPEHOMETP, немногие квадратные матрицы являются магическими. Посмотрел в Вики и каких-то полезных теоретико групповых или иных свойств этих квадратов, кроме забавной магии..., не узрел...

А пример решения этой задачки приведен на кибере
C++ - Проверить является ли квадратная матрица " магическим квадратом"


Время: 10:49.

Время: 10:49.
© OSzone.net 2001-