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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.09.2011, 19:17   #1
Jack125
Пользователь
 
Регистрация: 16.10.2010
Сообщений: 24
По умолчанию Задача на процедуры

Доброго времени суток. Помогите, пожалуйста, решить задачу

Нужно проверить, являются ли два массива одинаковыми

Вот код:
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Grids;

type
mymas=array[1..3] of integer;
  TForm1 = class(TForm)
    StringGrid1: TStringGrid;
    StringGrid2: TStringGrid;
    Button1: TButton;
    Button2: TButton;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  mas,masdva:mymas;
  mas1,mas2:mymas;
implementation
Procedure rand(mas:mymas;t:TStringGrid);
var i:integer;
begin
For i:=1 to 3 do
    begin
    mas[i]:=random(2);
    t.Cells[i-1,0]:=IntToStr(mas[i]);
    end;
    end;

procedure proverka(mas:mymas;masdva:mymas;var flag:boolean);
var i:integer;
begin
Flag:=True;
For i:=1 to 3 do
    If mas[i]<>masdva[i] then
        flag:=False;
 end;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
rand(mas1,StringGrid1);
rand(mas2,StringGrid2);
end;

procedure TForm1.Button2Click(Sender: TObject);
var flag2:boolean;
begin
proverka(mas1,mas2,flag2);
If flag2=True then
    Label1.Caption:='Массивы равны'
    else
    Label1.Caption:='Массивы не равны';
end;

end.
Проблема в том, что с данным кодом программа не будет работать, а если в процедуре TForm1.Button2Click сначала ввести два массива,
Код:
For i:=1 to 3 do
    mas1[i]:=StrToint(StringGrid1.Cells[i-1,0]);
For i:=1 to 3 do
    mas2[i]:=StrToint(StringGrid2.Cells[i-1,0]);
то все работает нормально. Можно, конечно, и так оставить, но препод говорит, чтобы так не делать а задавать массивы глобально. Почему же так происходит, если они и так вроде бы глобально заданы?

Заранее спасибо за помощь
Jack125 вне форума Ответить с цитированием
Старый 16.09.2011, 19:52   #2
MyLastHit
Очень суровый
Участник клуба
 
Аватар для MyLastHit
 
Регистрация: 17.12.2009
Сообщений: 1,988
По умолчанию

Я в Delphi не работаю, но попробую объяснить.
1. Вместо имени mas лучше использовать что-то другое, например NewMas. В идеале вот тут хорошо бы поставить break;
Код:
procedure proverka(newmas:mymas;newmasdva:mymas;var flag:boolean);
var i:integer;
begin
Flag:=True;
For i:=1 to 3 do
    If newmas[i]<>newmasdva[i] then
    begin
      flag:=False;
      break;
    end;
 end;
2. Так же избавиться от псевдослучайности.
Код:
Procedure rand(var newmas:mymas;t:TStringGrid);
var i:integer;
begin
  randomize;
  For i:=1 to 3 do
  begin
    newmas[i]:=random(2);
    t.Cells[i-1,0]:=IntToStr(newmas[i]);
  end;
end;
Далее должно работать как вы описали. Мне кажется что компилятор все в кашу смешал(всмысле ваши одноименные глобальные переменные и параметры процедур)
Ненавижу быть как все, но люблю, чтобы все были как я.

Последний раз редактировалось MyLastHit; 16.09.2011 в 20:41.
MyLastHit вне форума Ответить с цитированием
Старый 16.09.2011, 20:24   #3
Jack125
Пользователь
 
Регистрация: 16.10.2010
Сообщений: 24
По умолчанию

Сделал все, как вы сказали - поставил break в цикле проверки, поставил randomize и заменил mas и masdva на newmas и newmasdva, но программа по прежнему не работает без ввода массива. Мне кажется, что в процедуре rand он просто не сохраняет значения ячеек массива, которые сам сгенерировал, и поэтому приходится их брать из заполненных массивов, где они сохранились. Может быть, я неправильно описал глобальный массив или задал тип? Просто делал все так же, как делали на паре, но почему то не работает (
Jack125 вне форума Ответить с цитированием
Старый 16.09.2011, 20:29   #4
JuniorProger
Форумчанин
 
Регистрация: 16.09.2011
Сообщений: 114
По умолчанию

Не работает, потому что массивы ВСЕГДА РАВНЫ!
В заголовке Procedure rand(mas:mymas;t:TStringGrid); перед mas нужно написать var. Если хочешь, чтобы значения передаваемых в процедуру параметров, при изменении их в процедуре, заменялись новыми, а не возвращались к предыдущим, нужно писать перед параметром var.
Т.е. Procedure rand(var mas:mymas;t:TStringGrid);
Прочитай про передачу параметров по ссылке и по значению - не раз пригодится.
JuniorProger вне форума Ответить с цитированием
Старый 16.09.2011, 20:38   #5
MyLastHit
Очень суровый
Участник клуба
 
Аватар для MyLastHit
 
Регистрация: 17.12.2009
Сообщений: 1,988
По умолчанию

Процедура Rand заполняет массивы mas1, mas2. Они правильно объявлены - глобально.
И две кнопки кстати тут не к чему.
Код:
procedure TForm1.Button1Click(Sender: TObject);
var flag:boolean;
begin
  rand(mas1,StringGrid1);
  rand(mas2,StringGrid2);
  proverka(mas1,mas2,flag);
  If flag then
    Label1.Caption:='Массивы равны'
    else
    Label1.Caption:='Массивы не равны';
end;
Ненавижу быть как все, но люблю, чтобы все были как я.
MyLastHit вне форума Ответить с цитированием
Старый 16.09.2011, 20:38   #6
Jack125
Пользователь
 
Регистрация: 16.10.2010
Сообщений: 24
По умолчанию

Действительно, я забыл поставить var перед массивом в rand'е, поэтому он изменялся только в пределах процедуры

Всем большое спасибо за помощь
Jack125 вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задача на процедуры и функции. Николай1 Помощь студентам 3 06.06.2011 21:57
Задача на файлы, процедуры. art.marked Помощь студентам 0 05.05.2011 18:47
задача на функции и процедуры katya36 Помощь студентам 2 17.02.2009 15:24
задача с использованием процедуры Chief Паскаль, Turbo Pascal, PascalABC.NET 0 12.01.2009 12:59