Компьютерный форум 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=279926)

Olessya88 28-03-2014 10:09 2329659

Головоломка
 
Всем привет. Я сделала головоломку и приложение запускается - но не работает так как нужно. При запуску приложения просто прожимаются все чекбоксы. А нужно чтобы при нажатии 1 чекбокса - менялись другие. Помогите пожалуйста.
Код:

implementation
var s: boolean;
{$R *.dfm}



procedure TForm1.FormCreate(Sender: TObject);
begin
s:=False;
end;



procedure TForm1.CheckBox1Click(Sender: TObject);
  var Index, i, num: Integer; e: Boolean;
begin
if s then Exit;
s:=True;
for Index:= 0 to 4 do
if Sender=Controls[i] then break;
if not (Controls[Index] as TCheckBox).Checked
then (Controls[Index] as TCheckBox).Checked:=True
else
begin
num:=Index+1;
if Index=4 then num:= 0;
(Controls[num] as TCheckBox).Checked:=not (Controls[num] as TCheckBox).Checked;
 num:=num+1; if Index=3 then num:=0;
(Controls[num] as TCheckBox).Checked :=not (Controls[num] as TCheckBox).Checked;
end;
e:=True;
for i:= 0 to 4 do
e:=e and (Controls[i] as TCheckBox).Checked;
  if e then
  for i:=0 to 4 do begin
(Controls[i] as TCheckBox).Caption:= 'Победа!';
(Controls[i] as TCheckBox).Enabled:=False;
end;
s:=False;
end;



end.


Гуллипут 29-03-2014 21:21 2330332

Цитата:

Цитата Olessya88
for Index:= 0 to 4 do if Sender=Controls[i] then break; if not (Controls[Index] as TCheckBox).Checked »

Этот кусок сомнителен, потому что
1. i не присвоена, но используется.
2. Index - параметр цикла, но внутри цикла не используется.
3. Цикл кончается оператором break (нет блока begin-end), но дальше используется переменная Index. Так задумано ? Возможно, конечно, но сомнительно.

Вот что получилось, когда я расставил отступы для большей читабельности программы:
Код:

implementation
var s: boolean;
{$R *.dfm}



procedure TForm1.FormCreate(Sender: TObject);
begin
  s:=False;
end;



procedure TForm1.CheckBox1Click(Sender: TObject);
  var Index, i, num: Integer; e: Boolean;
begin
  if s then Exit;
  s:=True;
  for Index:= 0 to 4 do
    if Sender=Controls[i] then break;

  if not (Controls[Index] as TCheckBox).Checked
  then (Controls[Index] as TCheckBox).Checked:=True
  else
  begin
    num:=Index+1;
    if Index=4 then num:= 0;
    (Controls[num] as TCheckBox).Checked:=not (Controls[num] as TCheckBox).Checked;
    num:=num+1;
    if Index=3 then num:=0;
    (Controls[num] as TCheckBox).Checked :=not (Controls[num] as TCheckBox).Checked;
  end;
  e:=True;
  for i:= 0 to 4 do
    e:=e and (Controls[i] as TCheckBox).Checked;
  if e then
    for i:=0 to 4 do begin
      (Controls[i] as TCheckBox).Caption:= 'Победа!';
      (Controls[i] as TCheckBox).Enabled:=False;
    end;

  s:=False;
end;



end.

Рекомендую всегда так делать, чтобы не запутаться.

Olessya88 01-04-2014 10:30 2331366

Я, может туплю конечно, но я не поняла где исправить, что бы заработала программа. То что ты в пример привел мой же текст, исправленный для лучшей читабельности - это понятно. Спасибо за ответ. Но мне бы поконкретнее узнать: что и как исправить....

lxa85 01-04-2014 20:18 2331681

Olessya88, приложи пожалуйста архив с приложением или с "болванкой", что алгоритм "головоломки" остался тайной, а проблемное место - нет.

Olessya88 02-04-2014 22:33 2332311

Вложений: 1
Вот файлы проекта.

Гуллипут 02-04-2014 23:45 2332361

Цитата:

Цитата Гуллипут
Цитата Olessya88:
for Index:= 0 to 4 do if Sender=Controls[i] then break; if not (Controls[Index] as TCheckBox).Checked »
Этот кусок сомнителен, потому что
1. i не присвоена, но используется.
2. Index - параметр цикла, но внутри цикла не используется.
3. Цикл кончается оператором break (нет блока begin-end), но дальше используется переменная Index. Так задумано ? Возможно, конечно, но сомнительно. »

Объясняю.
Параметр цикла - переменная Index. Наверно, и индексом при обращении к массиву должна быть она же, а не переменная i, которая даже не присвоена к моменту использования.
Кроме того, очень похоже на то, что телом цикла должен быть не один только оператор "if Sender=Controls[i] then break", а и последующие. Но для этого надо всё тело цикла окружить "операторными скобками", то есть командами begin|end ! Я не вникал в алгоритм, тебе виднее, какие именно операторы ты предполагала использовать в качестве тела цикла, поэтому не могу сказать, где ставить "end". Но "begin" должен быть сразу после "do".
Sapienti sat (умному достаточно).


Время: 20:37.

Время: 20:37.
© OSzone.net 2001-