Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.04.2018, 11:35   #11
РезедаМуратова
Пользователь
 
Регистрация: 05.12.2017
Сообщений: 69
По умолчанию

при введение цифр из магического квадрата выдает что квадрат не магический; и если введешь рандомно цифры тоже не магический. Помогите исправить пожалуйста
Код:
var
  a:array[1..3,1..3]of integer;
flag, // флаг, магический квадрат или нет (=0 - нет, =1 - да)
i, // счётчик циклов
sum:integer; // сумма элементов строки матрицы
begin
  flag:=1; // предполагаем, что матрица магический квадрат
sum:=0; // пока сумма элементов строки матрицы = 0
//подсчитываем сумму
for i:=1 to 3 do
sum:=sum+a[1,i];
//проверяем все строки
for i:=1 to 3 do
if(sum <> a[i,1]+a[i,2]+a[i,3]) then
flag:=0;
//проверяем все столбцы
for i:=1 to 3 do
if(sum <> a[1,i]+a[2,i]+a[3,i]) then
flag:=0;
//проверяем диагонали
if(sum <> a[1,1]+a[2,2]+a[3,3]) then
flag:=0;
// ВЫВОДИМ РЕЗУЛЬТАТ
if (flag=1) then
label2.caption:='Является Магическим квадратом'
else
label2.caption:=' Не является Магическим квадратом';

end;
РезедаМуратова вне форума Ответить с цитированием
Старый 16.04.2018, 11:59   #12
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,859
По умолчанию

И где в этом коде присваиваются хоть какие-нибудь значения элементам массива a?
northener вне форума Ответить с цитированием
Старый 16.04.2018, 12:04   #13
РезедаМуратова
Пользователь
 
Регистрация: 05.12.2017
Сообщений: 69
По умолчанию

ээээээээ
РезедаМуратова вне форума Ответить с цитированием
Старый 16.04.2018, 12:08   #14
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Че бекать то? Где в массив присвоение?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 16.04.2018, 12:36   #15
РезедаМуратова
Пользователь
 
Регистрация: 05.12.2017
Сообщений: 69
По умолчанию

не так?
Код:
 var
  a:array[1..3,1..3]of integer;
flag, // флаг, магический квадрат или нет (=0 - нет, =1 - да)
i,j,sum:integer; // сумма элементов строки матрицы
begin
a[i,j]:=StrToInt(StringGrid1.Cells[j,i]);
  flag:=1; // предполагаем, что матрица магический квадрат
sum:=0; // пока сумма элементов строки матрицы = 0
//подсчитываем сумму
for i:=1 to 3 do
sum:=sum+a[1,i];
//проверяем все строки
for i:=1 to 3 do
if(sum <> a[i,1]+a[i,2]+a[i,3]) then
flag:=0;
//проверяем все столбцы
for i:=1 to 3 do
if(sum <> a[1,i]+a[2,i]+a[3,i]) then
flag:=0;
//проверяем диагонали
if(sum <> a[1,1]+a[2,2]+a[3,3]) then
flag:=0;
// ВЫВОДИМ РЕЗУЛЬТАТ
if (flag=1) then
label2.caption:='Является Магическим квадратом'
else
label2.caption:=' Не является Магическим квадратом';

end;
РезедаМуратова вне форума Ответить с цитированием
Старый 16.04.2018, 12:40   #16
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,859
По умолчанию

Такое присваивание надо делать в двойном цикле по строкам и столбцам.
northener вне форума Ответить с цитированием
Старый 16.04.2018, 13:22   #17
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Код:
var i,j,k,n: Integer;
    s: String;
    Rows,Cols: array of Integer;
begin
  n:=StringGrid1.RowCount;
  SetLength(Rows,n+1);
  SetLength(Cols,n+1);
  for i:=0 to n-1 do begin
    for j:=0 to n-1 do begin
      s:='';
      if not TryStrToInt(StringGrid1.Cells[j,i],k) then s:=Format('В строке %d колонке %d не целое число',[i+1,j+1])
      else if k<=0 then s:=Format('В строке %d колонке %d не положительное целое число',[i+1,j+1])
      else if k>1000000 then s:=Format('В строке %d колонке %d слишком большое число',[i+1,j+1]);
      if s<>'' then begin ShowMessage(s); Exit; end;
      Inc(Cols[j],k);
      Inc(Rows[i],k);
    end;
    Inc(Cols[n],StrToInt(StringGrid1.Cells[i,i]));
    //Inc(Rows[n],StrToInt(StringGrid1.Cells[i,n-i-1]));
    Inc(Rows[n],StrToInt(StringGrid1.Cells[n-i-1,i]));  //подправил
  end;
  Label2.Caption:='Матрица является магическим квадратом';
  for i:=0 to n do if (Rows[i]<>Rows[0]) or (Cols[i]<>Rows[0]) then begin Label2.Caption:='Матрица не является магическим квадратом'; Break; end;
end;
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 16.04.2018 в 15:31.
Аватар вне форума Ответить с цитированием
Старый 16.04.2018, 13:49   #18
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Аватар, красиво!!

так надо же ещё диагонали проверять?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 16.04.2018, 13:51   #19
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Дык считаю в массив, лень было переменные описывать для диагональных сумм и еще код для сравнения))
Inc(Cols[n],... и ниже, и цикл проверки до n, а не до n-1
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 16.04.2018, 14:00   #20
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

а я бы по старинке так расписал:
Код:
procedure TForm2.Image1Click(Sender: TObject);
var
  a:array of array of integer;
  i, j, n, sumEtalon, sum, sumd1, sumd2 : integer;
begin
  if StringGrid1.RowCount<>StringGrid1.ColCount then begin
    Application.MessageBox('Грид должен быть квадратным. '#13+
    'Обратитесь к программисту, пусть устраняет ошибки в коде!',
    'Ошибка', MB_OK or MB_ICONERROR);
    Exit
  end;

  // выделим память под массив a
  n := StringGrid1.RowCount;
  SetLength(a, n);
  for i := 0 to n - 1 do SetLength(a[i], n);
   try
    //проверим, что в квадрате только натуральные числа и заполним массив a
    for i := 0 to n - 1 do
      for j := 0 to n - 1 do begin
        a[i,j] := StrToIntDef(StringGrid1.Cells[j,i],0);
        if a[i,j]<=0 then begin
              Application.MessageBox('Грид  нужно заполнить натуральными числами',
              'Ошибка', MB_OK or MB_ICONWARNING);
              Exit
        end;
      end;

    // найдём сумму первой строки
    sumEtalon := 0;
    for i := 0 to n-1 do
      sumEtalon := sumEtalon + a[0, i];

    // суммы по диагоналям
    sumd1 := 0; sumd2 := 0;
    for i := 0 to n - 1 do begin
      sumd1:=sumd1+a[i,i];
      sumd2:=sumd2+a[i,n-i-1];
    end;

    if (sumd1<>sumEtalon) or (sumd2<>sumEtalon) then begin
      label2.Caption:='Матрица не является магическим квадратом';
      Exit
    end;

    // найдём суммы остальных строк
    for i := 0 to n - 1 do begin
       sum := 0;
       for j := 0 to n - 1 do sum := sum + a[i,j];
       if (sum<>sumEtalon) then begin
        label2.Caption:='Матрица не является магическим квадратом';
        Exit
       end;
    end;
    // найдём суммы столбцов
    for j := 0 to n - 1 do begin
       sum := 0;
       for i := 0 to n - 1 do sum := sum + a[i,j];
       if (sum<>sumEtalon) then begin
        label2.Caption:='Матрица не является магическим квадратом';
        Exit
       end;
    end;

    label2.Caption:='Матрица является магическим квадратом';

  finally
    for i := 0 to n - 1 do SetLength(a[i], 0);
    SetLength(a, 0);
  end;

end;
p.s.
кстати, РезедаМуратова, тот unit2, что лежит у Вас в архиве в папке проекта - практически пустой,
а тот, что прописан в исходниках проекта и с которым вы реально работаете
Цитата:
Сообщение от РезедаМуратова
Код:
  Unit2 in '..\..\..\..\..\Users\murat\OneDrive\Изображения\сайт\Unit2.pas' {Form2};
в архиве отсутствует.
я бы рекомендовал перенести Unit2 в каталог проекта и исправить к нему путь.
чтобы было так:
Код:
program Project1;

uses
  Forms,
  Unit1 in 'Unit1.pas' {Form1},
  Unit2 in 'Unit2.pas' {Form2};
p.p.s. кстати, нет никакого ограничения на повторное использование чисел. поэтому можно во все ячейки забить одно и то же число и квадрат станет "магическим"

Последний раз редактировалось Serge_Bliznykov; 16.04.2018 в 14:03.
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Развивающие мультики для детей MooNDeaR Свободное общение 36 02.04.2019 12:13
Программирование для детей ytrytr Свободное общение 13 08.06.2016 13:20
Программирование для детей sinid Свободное общение 70 05.11.2013 16:27
Программа-тест для детей на Delphi Алина)) Фриланс 15 06.08.2013 09:23
Известно количество детей, проживающих в каждой из квартир. Составить программу, находящую сколько детей в многодетных семьях саша аврамов Паскаль, Turbo Pascal, PascalABC.NET 2 22.03.2013 08:20