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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.11.2007, 20:26   #1
Иринкаа
Пользователь
 
Регистрация: 11.11.2007
Сообщений: 44
По умолчанию Проблемы с циклом, условием

Код:
if Edit2.Text='3' then
   repeat
    Vremya_tekyshee:= Vremya_tekyshee+Delt_m;
    Kol_post:= Kolichestvo(lmbd/5);
    Kl5_post:= Kl5_post+1;
    Edit13.Text:= IntToStr(Kl5_post);
    Randomize;
        if ((Kl1_ochered < Kl2_ochered) and (Kl1_ochered < Kl3_ochered)) or ((Kl1_ochered = Kl2_ochered) and (Kl1_ochered = Kl3_ochered))  then
       begin
        Kl1_ochered:= Kl1_ochered+Kol_post;
        if Kl1_ochered > 0 then
          begin
           if Vremya_tekyshee > Vremya_obsl1 then
             begin
              Kl1_post:= Kl1_post + 1;
              Kl1_ochered:= Kl1_ochered - 1;
              Edit8.Text:= IntToStr(Kl1_post);
              Vr_obsl1:= Vremya_obslugivania(StrToInt(Edit3.Text)/Scale, 15/Scale);
              Vr_obsl2:= Vremya_obslugivania(StrToInt(Edit4.Text)/Scale, 20/Scale);
              Vremya_obsl1:= Vr_obsl1 + Vr_obsl2 + Vremya_tekyshee;
             end;
          end;
       end;
      if (Kl2_ochered < Kl1_ochered) and (Kl2_ochered < Kl3_ochered) then
       begin
        Kl2_ochered:= Kl2_ochered+Kol_post;
        if Kl1_ochered > 0 then
          begin
            if Vremya_tekyshee > Vremya_obsl2 then
              begin
               Kl2_post:= Kl2_post + 1;
               Kl2_ochered:= Kl2_ochered - 1;
               Edit9.Text:= IntToStr(Kl2_post);
               Vr_obsl1:= Vremya_obslugivania(StrToInt(Edit3.Text)/Scale, 15/Scale);
               Vr_obsl2:= Vremya_obslugivania(StrToInt(Edit4.Text)/Scale, 20/Scale);
               Vremya_obsl2:= Vr_obsl1 + Vr_obsl2 + Vremya_tekyshee;
              end;
          end;
        end;
        if (Kl3_ochered < Kl1_ochered) and (Kl3_ochered < Kl2_ochered) then
       begin
        Kl3_ochered:= Kl3_ochered+Kol_post;
        if Kl3_ochered > 0 then
          begin
            if Vremya_tekyshee > Vremya_obsl3 then
              begin
               Kl3_post:= Kl3_post + 1;
               Kl3_ochered:= Kl3_ochered - 1;
               Edit10.Text:= IntToStr(Kl3_post);
               Vr_obsl1:= Vremya_obslugivania(StrToInt(Edit3.Text)/Scale, 15/Scale);
               Vr_obsl2:= Vremya_obslugivania(StrToInt(Edit4.Text)/Scale, 20/Scale);
               Vremya_obsl3:= Vr_obsl1 + Vr_obsl2 + Vremya_tekyshee;
              end;
          end;
        end;
   until Vremya_tekyshee > Vr_mashin_obsh;
Подскажите, плиз, почему 2-е и 3-е не выполняется, а именно
Код:
if (Kl2_ochered < Kl1_ochered) and (Kl2_ochered < Kl3_ochered) then
и
Код:
if (Kl3_ochered < Kl1_ochered) and (Kl3_ochered < Kl2_ochered) then
а заходит только в 1-е условие
Код:
if ((Kl1_ochered < Kl2_ochered) and (Kl1_ochered < Kl3_ochered)) or ((Kl1_ochered = Kl2_ochered) and (Kl1_ochered = Kl3_ochered))  then
Хотя при правильном выполнении, должны выполняться по очереди все условия.
Иринкаа вне форума Ответить с цитированием
Старый 18.11.2007, 20:31   #2
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Поставьте брекпойнты на точки входа в условия и смотрите значения переменных.
У вас просто условия не выполняются.
mihali4 вне форума Ответить с цитированием
Старый 18.11.2007, 21:34   #3
Иринкаа
Пользователь
 
Регистрация: 11.11.2007
Сообщений: 44
По умолчанию

Цитата:
Сообщение от mihali4 Посмотреть сообщение
Поставьте брекпойнты на точки входа в условия и смотрите значения переменных.
У вас просто условия не выполняются.
Что такое брекпойнты?

Условия не выполняются - это я поняла, проверила.
не могу понять, почему не выполняется.
при выполнении 1-ого условия Kl1_ochered наращивается и следовательно в следующем прогоне должно выполняться 2 или 3-е условие
Иринкаа вне форума Ответить с цитированием
Старый 18.11.2007, 21:40   #4
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Цитата:
Что такое брекпойнты?
ALT+CTRL+B - вызов окна для просмотра точек останова (брекпойнтов).
Собственно установка - щелчок мышкой по левому серому полю редактора на уровне нужной строки.
ALT+CTRL+W - вызов окна просмотра текущих значений переменных.
Изучите хотя бы немного среду, в которой работаете...
mihali4 вне форума Ответить с цитированием
Старый 18.11.2007, 22:03   #5
Jeni
Форумчанин
 
Регистрация: 31.05.2007
Сообщений: 486
По умолчанию

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

Application.MessageBox(PAnsiChar('K l1=' + IntToStr(Kl1) + ' Kl2=' + IntToStr(Kl2) + ' Kl3=' + IntToStr(Kl3)), '');

будет выводить значения Kl1, Kl2 и Kl3 на экран и тогда можно оценить, правильно ли работает алгоритм.
Jeni вне форума Ответить с цитированием
Старый 18.11.2007, 22:15   #6
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Цитата:
Сообщение от Jeni Посмотреть сообщение
Можно и не ставить точки останова, а просто проверять значения переменных перед условием. Например, код

Application.MessageBox(PAnsiChar('K l1=' + IntToStr(Kl1) + ' Kl2=' + IntToStr(Kl2) + ' Kl3=' + IntToStr(Kl3)), '');

будет выводить значения Kl1, Kl2 и Kl3 на экран и тогда можно оценить, правильно ли работает алгоритм.
Можно и отдельную программу написать, которая будет ловить значения переменных и выводить их, вести лог и так далее...
Вопрос - зачем? Разработчики Дельфи побеспокоились об удобстве отладки программы без ввода какого-либо дополнительного кода...
mihali4 вне форума Ответить с цитированием
Старый 18.11.2007, 22:16   #7
Иринкаа
Пользователь
 
Регистрация: 11.11.2007
Сообщений: 44
По умолчанию

Цитата:
Сообщение от Jeni Посмотреть сообщение
Можно и не ставить точки останова, а просто проверять значения переменных перед условием. Например, код

Application.MessageBox(PAnsiChar('K l1=' + IntToStr(Kl1) + ' Kl2=' + IntToStr(Kl2) + ' Kl3=' + IntToStr(Kl3)), '');

будет выводить значения Kl1, Kl2 и Kl3 на экран и тогда можно оценить, правильно ли работает алгоритм.
Я в принципе подобным образом всегда проверяю.

И получается, что 2 и 3-е условие не выполняются
но по логике, по работе 1-ого условия, кот выполняется - должны выполняться и они
Иринкаа вне форума Ответить с цитированием
Старый 18.11.2007, 23:02   #8
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Первое условие предусматривает возможное равенство трех показателей, а второе и третье - нет. Вероятно перед этим фрагментом программы все три показателя оказались равными.
puporev вне форума Ответить с цитированием
Старый 18.11.2007, 23:47   #9
Иринкаа
Пользователь
 
Регистрация: 11.11.2007
Сообщений: 44
По умолчанию

Цитата:
Сообщение от puporev Посмотреть сообщение
Первое условие предусматривает возможное равенство трех показателей, а второе и третье - нет. Вероятно перед этим фрагментом программы все три показателя оказались равными.
Такого не должно быть
При начальном условии Kl1_ochered, Kl2_ochered и Kl3_ochered = 0
Пр выполнении 1-ого условия Kl1_ochered увеличивается, следовательно равенства показателей не должно быть
Иринкаа вне форума Ответить с цитированием
Старый 19.11.2007, 21:13   #10
Иринкаа
Пользователь
 
Регистрация: 11.11.2007
Сообщений: 44
По умолчанию

Вообще мне надо распределить поставщиков по кладовщикам.
Рассмотреть разные ситуации: 2, 3, 4, 5 кладовщиков
Когда 2 кладовщика все работает. Когда 3 или больше нет. Не могу понять почему.

Ситуация 2 кладовщика:
Код:
if Edit2.Text='2' then
  repeat
    Vremya_tekyshee:= Vremya_tekyshee+Delt_m;
    Kol_post:= Kolichestvo(lmbd/5);
   if (Kl1_ochered > Kl2_ochered) or (Kl1_ochered = Kl2_ochered)  then
       Kl2_ochered:= Kl2_ochered+Kol_post
       else Kl1_ochered:= Kl1_ochered+Kol_post;
        if (Kl2_ochered > 0) and (Vremya_tekyshee > Vremya_obsl2) then
             begin
              Kl2_post:= Kl2_post + 1;
              Kl2_ochered:= Kl2_ochered - 1;
              Edit9.Text:= IntToStr(Kl2_post);
              Vr_obsl1:= Vremya_obslugivania(StrToInt(Edit3.Text)/Scale, 15/Scale);
              Vr_obsl2:= Vremya_obslugivania(StrToInt(Edit4.Text)/Scale, 20/Scale);
              Vremya_obsl2:= Vr_obsl1 + Vr_obsl2 + Vremya_tekyshee;
             end;

        if (Kl1_ochered > 0) and (Vremya_tekyshee > Vremya_obsl1) then
          begin
               Kl1_post:= Kl1_post + 1;
               Kl1_ochered:= Kl1_ochered - 1;
               Edit8.Text:= IntToStr(Kl1_post);
               Vr_obsl1:= Vremya_obslugivania(StrToInt(Edit3.Text)/Scale, 15/Scale);
               Vr_obsl2:= Vremya_obslugivania(StrToInt(Edit4.Text)/Scale, 20/Scale);
               Vremya_obsl1:= Vr_obsl1 + Vr_obsl2 + Vremya_tekyshee;
          end;
   until Vremya_tekyshee > Vr_mashin_obsh;
3 кладовщика:
Код:
if Edit2.Text='3' then
 begin
   repeat
    Vremya_tekyshee:= Vremya_tekyshee+Delt_m;
    Kol_post:= Kolichestvo(lmbd/5);

  if ((Kl1_ochered < Kl2_ochered) and (Kl1_ochered < Kl3_ochered)) or ((Kl1_ochered = Kl2_ochered) and (Kl1_ochered = Kl3_ochered))  then
      Kl1_ochered:= Kl1_ochered+Kol_post;
    if (Kl2_ochered < Kl1_ochered) and (Kl2_ochered < Kl3_ochered) then
      Kl2_ochered:= Kl2_ochered+Kol_post;
    if (Kl3_ochered < Kl1_ochered) and (Kl3_ochered < Kl2_ochered) then
      Kl3_ochered:= Kl3_ochered+Kol_post;

    if (Kl1_ochered > 0) and (Vremya_tekyshee > Vremya_obsl1) then
       begin
          Kl1_post:= Kl1_post + 1;
          Kl1_ochered:= Kl1_ochered - 1;
          Edit8.Text:= IntToStr(Kl1_post);
          Edit20.Text:= IntToStr(Kl1_ochered);
          Vr_obsl1:= Vremya_obslugivania(StrToInt(Edit3.Text)/Scale, 15/Scale);
          Vr_obsl2:= Vremya_obslugivania(StrToInt(Edit4.Text)/Scale, 20/Scale);
          Vremya_obsl1:= Vr_obsl1 + Vr_obsl2 + Vremya_tekyshee;
       end;

     if (Kl2_ochered > 0) and (Vremya_tekyshee > Vremya_obsl2) then
        begin
          Kl2_post:= Kl2_post + 1;
          Kl2_ochered:= Kl2_ochered - 1;
          Edit9.Text:= IntToStr(Kl2_post);
          Edit21.Text:= 'lf';
          Vr_obsl1:= Vremya_obslugivania(StrToInt(Edit3.Text)/Scale, 15/Scale);
          Vr_obsl2:= Vremya_obslugivania(StrToInt(Edit4.Text)/Scale, 20/Scale);
          Vremya_obsl2:= Vr_obsl1 + Vr_obsl2 + Vremya_tekyshee;

        end;

     if (Kl3_ochered > 0) and (Vremya_tekyshee > Vremya_obsl3) then
        begin
          Kl3_post:= Kl3_post + 1;
          Kl3_ochered:= Kl3_ochered - 1;
          Edit10.Text:= IntToStr(Kl3_post);
          Edit22.Text:= 'lf';
          Vr_obsl1:= Vremya_obslugivania(StrToInt(Edit3.Text)/Scale, 15/Scale);
          Vr_obsl2:= Vremya_obslugivania(StrToInt(Edit4.Text)/Scale, 20/Scale);
          Vremya_obsl3:= Vr_obsl1 + Vr_obsl2 + Vremya_tekyshee;
        end;
   until Vremya_tekyshee > Vr_mashin_obsh;
 end;
В ситуации 3-х все поставщики идут почему то к 1-му кладовщику

Последний раз редактировалось Иринкаа; 19.11.2007 в 21:16.
Иринкаа вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с циклом.. POPOV Помощь студентам 3 29.04.2008 18:36
Помогите с циклом Almost_Famous Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 8 27.03.2008 21:08
Помогите с Условием memoze Microsoft Office Excel 7 22.02.2008 15:23
Задача с циклом POPOV Общие вопросы Delphi 13 01.02.2008 20:33