Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #31  
Старый 04.01.2012, 14:10
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

А что в нем так? Вот что это такое?
Код:
 SetLength(byteArray, 5);
  for i := 0 to (Length(byteArray)-1) do
    begin
      byteArray[0] := StrToInt(Edit1.Text);
      byteArray[1] := StrToInt(Edit2.Text);
      byteArray[2] := StrToInt(Edit3.Text);
      byteArray[3] := StrToInt(Edit4.Text);
      byteArray[4] := StrToInt(Edit5.Text);
    end;
На кой, вы это делаете? 5 раз присвоить одни и те-же значения. Типа для надежности?

Дальше идем.
Код:
z1:=0;
  while z1 > 0 do
z1 = 0, и согласно условию выполнять цикл не надо, значит весь цикл вообще никогда не выполняется.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #32  
Старый 04.01.2012, 23:35
TheVenom TheVenom вне форума
Прохожий
 
Регистрация: 29.12.2011
Сообщения: 31
Репутация: 10
Вопрос

Я думаю что лучше всего здесь подойдет оператор цикла с постусловием (" repeat... until... ; "), как мне лучше прописать условие для этого цикла?
Ответить с цитированием
  #33  
Старый 04.01.2012, 23:44
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Пробуй так:
Код:
  while True do
  begin
    ...
    if z1 = 0 then Break;
  end;

  repeat
    ...
    if z1 = 0 then Break;
  until True;
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #34  
Старый 05.01.2012, 00:06
TheVenom TheVenom вне форума
Прохожий
 
Регистрация: 29.12.2011
Сообщения: 31
Репутация: 10
Печаль

Если использовать:
Код:
  while True do
  begin
    ...
    if z1 = 0 then Break;
  end;
То выводится ошибка ввода, а если использовать:
Код:
  repeat
    ...
    if z1 = 0 then Break;
  until True;
то все происходит так же, как и без repeat\until т.е. программа находит минимум только 1 раз.
Ответить с цитированием
  #35  
Старый 05.01.2012, 00:09
TheVenom TheVenom вне форума
Прохожий
 
Регистрация: 29.12.2011
Сообщения: 31
Репутация: 10
Сообщение

возможно что то не так с телом цикла, а не с самим циклом? посмотрите, пожалуйста может найдете ошибку.
Ответить с цитированием
  #36  
Старый 05.01.2012, 00:10
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Так не нужно копировать бездумно. Я не зря троеточие поставил, там должен выполняться твой код, а заодно изменяться значение z1.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #37  
Старый 05.01.2012, 00:17
TheVenom TheVenom вне форума
Прохожий
 
Регистрация: 29.12.2011
Сообщения: 31
Репутация: 10
По умолчанию

ну я так и делал...
Ответить с цитированием
  #38  
Старый 05.01.2012, 00:32
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Код:
  while True do
  begin
    min1 := 0;

    for I := 1 to (Length(byteArray)-1) do
      if byteArray[i] < byteArray[min1] then
        min1 := i;

    x1 :=  StrToInt(Edit21.Text);

    case min1 of
      0 :
      begin
        Edit1.Color := clLime;
        yy1 :=  StrToInt(Edit16.text);
        z1 := x1 - yy1 - z1;
      end;
      1 :
      begin
        Edit2.Color := clLime;
        yy1 :=  StrToInt(Edit17.text);
        z1 := x1 - yy1 - z1;
      end;
      2 :
      begin
        Edit3.Color := clLime;
        yy1 :=  StrToInt(Edit18.text);
        z1 := x1 - yy1 - z1;
      end;
      3 :
      begin
        Edit4.Color := clLime;
        yy1 := StrToInt(Edit19.text);
        z1 := x1 - yy1 - z1;
      end;
      4 :
      begin
        Edit5.Color := clLime;
        yy1 := StrToInt(Edit20.text);
        z1 := x1 - yy1 - z1;
      end;
    end;
  
    for I := min1 to Length(byteArray) - 2 do
      byteArray[i] := byteArray[I + 1];

    SetLength(byteArray, Length(byteArray) - 1);

    if z1 = 0 then
      Break;
  end;
Почти так, только работать не будет, так как z1 неинициализирована. Какое она должна иметь первоначальное значение тебе видней, я логику не проверял. И в следующий раз не ври, что так и делал. Красным я выделил ошибку в твоём рассуждении.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #39  
Старый 05.01.2012, 00:57
TheVenom TheVenom вне форума
Прохожий
 
Регистрация: 29.12.2011
Сообщения: 31
Репутация: 10
По умолчанию

ввел первоначальное значение z1 и даже в теле цикла все через case прописал. все равно ошибка......
Ответить с цитированием
  #40  
Старый 05.01.2012, 01:07
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Ты издеваешься? Штатный телепат сейчас не в сети, а я не знаю, что там происходит в строке 17. Ой ошибся в 34, не... наверное в 45.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #41  
Старый 05.01.2012, 02:01
TheVenom TheVenom вне форума
Прохожий
 
Регистрация: 29.12.2011
Сообщения: 31
Репутация: 10
Вопрос

вот что у меня получилось
Код:
procedure TForm1.BitBtn2Click(Sender: TObject);
var
  byteArray  : Array of integer;
  i:integer;
  min1,x1,yy1,z1: Integer;
begin
  SetLength(byteArray, 5);
  byteArray[0] := StrToInt(Edit1.Text);
  byteArray[1] := StrToInt(Edit2.Text);
  byteArray[2] := StrToInt(Edit3.Text);
  byteArray[3] := StrToInt(Edit4.Text);
  byteArray[4] := StrToInt(Edit5.Text);
  z1:=0;
  repeat
    min1 := 0;

    for I := 1 to (Length(byteArray)-1) do
      if byteArray[i] < byteArray[min1] then
        min1 := i;

    x1 :=  StrToInt(Edit21.Text);

    case min1 of
      0 :
      begin
        Edit1.Color := clLime;
        yy1 :=  StrToInt(Edit16.text);
        z1 := x1 - yy1 - z1;
      end;
      1 :
      begin
        Edit2.Color := clLime;
        yy1 :=  StrToInt(Edit17.text);
        z1 := x1 - yy1 - z1;
      end;
      2 :
      begin
        Edit3.Color := clLime;
        yy1 :=  StrToInt(Edit18.text);
        z1 := x1 - yy1 - z1;
      end;
      3 :
      begin
        Edit4.Color := clLime;
        yy1 := StrToInt(Edit19.text);
        z1 := x1 - yy1 - z1;
      end;
      4 :
      begin
        Edit5.Color := clLime;
        yy1 := StrToInt(Edit20.text);
        z1 := x1 - yy1 - z1;
      end;
    end;

    for I := min1 to Length(byteArray) - 2 do
      byteArray[i] := byteArray[I + 1];

    SetLength(byteArray, Length(byteArray) - 1);

    if z1 <= 0 then Break;
  until True;
  Label16.Caption:= IntToStr(z1);
end;
что здесь не так?
Ответить с цитированием
  #42  
Старый 05.01.2012, 02:28
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Нужно тестировать в пошаговом режиме прервётся цикл или зациклится, дерзай.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #43  
Старый 05.01.2012, 02:54
TheVenom TheVenom вне форума
Прохожий
 
Регистрация: 29.12.2011
Сообщения: 31
Репутация: 10
По умолчанию

цикл прерывается. как избежать прирывания?
Ответить с цитированием
  #44  
Старый 05.01.2012, 02:58
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Ну почему из тебя слова клещами вытаскивать нужно? Кому сдавать программу мне или тебе? Как, при каких услових прерывается? "шагать" пробовал?
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #45  
Старый 05.01.2012, 03:07
TheVenom TheVenom вне форума
Прохожий
 
Регистрация: 29.12.2011
Сообщения: 31
Репутация: 10
По умолчанию

Код:
  repeat
    min1 := 0;

    for I := 1 to (Length(byteArray)-1) do
      if byteArray[i] < byteArray[min1] then min1 := i;

    x1 :=  StrToInt(Edit21.Text);

    case min1 of
      0 :
      begin
        Edit1.Color := clLime;
        yy1 :=  StrToInt(Edit16.text);
        z1 := x1 - yy1 - z1;
      end;
      1 :
      begin
        Edit2.Color := clLime;
        yy1 :=  StrToInt(Edit17.text);
        z1 := x1 - yy1 - z1;
      end;
      2 :
      begin
        Edit3.Color := clLime;
        yy1 :=  StrToInt(Edit18.text);
        z1 := x1 - yy1 - z1;
      end;
      3 :
      begin
        Edit4.Color := clLime;
        yy1 := StrToInt(Edit19.text);
        z1 := x1 - yy1 - z1;
      end;
      4 :
      begin
        Edit5.Color := clLime;
        yy1 := StrToInt(Edit20.text);
        z1 := x1 - yy1 - z1;
      end;
    end;

    for I := min1 to Length(byteArray) - 2 do
      byteArray[i] := byteArray[I + 1];

    SetLength(byteArray, Length(byteArray) - 1);

    if z1 <= 0 then Break;      //шагает отсюда
  until True;
  Label16.Caption:= IntToStr(z1);       //сразу сюда, не затрагивая until
end;
и из за этого цикл не повторяется
Ответить с цитированием
Ответ


Delphi Sources

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

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 15:50.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter