Тема для программистов

Статус
В этой теме нельзя размещать новые ответы.

Aliens

Меня знают многие ;-)
#21
Хотя в некоторых языках и так бывает. Но это то не ответ на мой вопрос. Это способ победить указанный алгоритм имеющимися конструкциями языка.

ПОЧЕМУ НЕТ УЖЕ ГОТОВОЙ?
 

GMX

schizophrenic
#22
Ну тогда считай, что я этот язык придумал. :) Давай тогда вот так, чтобы понятнее:
Код:
int check()
{
  if (not statement1) { ; }
  else if (not statement2) { ;}
  else {
    result1;
    return(1);
  }
  result2;
  return(0);
}
 

GMX

schizophrenic
#23
А вообще было бы всем намного проще, если бы было известно ТЗ. Есть подозрение, что некоторые просто слишком узко смотрят на проблему. ;)
 
#24
не вижу проблемы. Во-первых нигде не сказано, что "наличие спичек" является атрибутом объекта "сигареты не найдётся?".
Без go to вполне вырисовывается:

PHP:
if ($kurevo=='yes')
{
  if ($spichki == 'yes') {echo "Покурил";}
}
else  {echo "пролетел";} ;
 

skif

Житель центра
#25
Ну это пример простецкий, а если в этом блоке меняются значения локальных переменных, что мне их все в процедуру кидать? А если таких блоков в реальном листинге несколько десятков, а если вложенность подобных условий многоуровневая? А если язык не позволяет пользоваться указателями (например их там просто не существует)) )?
Вы все ничего не поняли!
Во первых конструкция: Если (УСЛОВИЕ) Тогда {...}
Подразумевает любое составное УСЛОВИЕ, но! Это составное условие рассчитывается сразу, например многие компиляторы используют метод обратной польской записи (Ну что там многие, почти все), так вот, если мы зададим составное условие вида:
(СуществетОбъект(Объект)=Да)и(Объект.Атрибут=1)
Компилятор тупо проверит существоние объекта и значение атрибута этого объекта, в случае если объект существует все нормально, но если объекта нет, тогда вторая часть составного условия вызовет исключения типа обращение к несуществующему объекту, области памяти, нарушение доступа и т.д. на вкус компилятора.
Компилятор? Классический компилятор (ala gcc в контексте c++ кода) это корректно скомпилирует.
В рантайме код if case1 && case2 отработает корректно. Корректная работа этого кода означает кейс:
– выполняется самое левое условие,
– если предыдущее условие истинно, то выполняется следующее,
– ...
– возвращается значение в "условный оператор".

Среда выполнения в которой нет JIT не может работать иначе.
Выше под компилятором подразумевался JIT?
Если так, то придется тебя растроить, в Java, .Net, ObjC и прочих наборах технологий, которе мне знакомы JIT может вызвать некоторые сложности в условных операторах, передаче вычисляемых параметров в функции, но описанная ситуация в них невозможна.

Поэтому в таких проверках придеться использовать 2 конструкции Если (if), первой проверяем существование объекта и если он есть, то его атрибут.
Алгоритм который написал Раздолбайкер правильный с точки зрения задачи и реализации на любом языке, но в нем есть минус 1 и тот же блок кода приходится переписывать 2 раза! (в версии Раздолбайкера "пролет")примерно так:

Если "сигареты не найдётся" = нет
{
пролет
}
иначе
{
Если "спички есть" = нет тогда
{
Покурил
}
иначе
{
пролет
}
}

Блок-схема в топике, иллюстрирует немного другую конструкцию, она позволяет выйти из второго условия в другую ветку первого. Так вот вопрос: почему ее нет в языках?
Можно конечно так написать:

Если "сигареты не найдётся" = нет
{
goto l1
}
Если "спички есть" = нет тогда
{
Покурил
goto l2
}
:l1 пролет
:l2 ....

Но как известно в открытую использовать безусловный переход на метку не православно...
А теперь самый главный вопрос. ПОЧЕМУ при вычислении условия меняется значение локальных переменных?
Проблема в дизайне приложения, а не в языках.
Такой странной фичи нигде нет, потому что она не нужна. В контексте других языков описанная ситуация в подавляющем большинстве случаев решается конструкцией if (case1 && case2), в остальных случаях, с которыми я не сталкивался, но могу предположить – это проблема не языка.
 

GMX

schizophrenic
#26
не вижу проблемы. Во-первых нигде не сказано, что "наличие спичек" является атрибутом объекта "сигареты не найдётся?".
Без go to вполне вырисовывается:

PHP:
if ($kurevo=='yes')
{
  if ($spichki == 'yes') {echo "Покурил";}
}
else  {echo "пролетел";} ;
А если $kurevo=='yes', а $spichki!='yes'?
 

Aliens

Меня знают многие ;-)
#27
Раздолбакер - ты не понял смысла задачи, прочти еще раз мой пост на стр1
GMX - подождем что остальные участники скажут ;)
 

GMX

schizophrenic
#28
Да, кстати, а почему просто не выстраивать в таком случае условия в нужном порядке? Скиф тему задвигает.
if (statement2 && statement1)
Если statement1 ложно, то дальнейшая проверка условия не проводится, верно?
А вообще че я тут умничаю, это ж вам к программистам надо! :)
 

skif

Житель центра
#29
не вижу проблемы. Во-первых нигде не сказано, что "наличие спичек" является атрибутом объекта "сигареты не найдётся?".
Без go to вполне вырисовывается:

PHP:
if ($kurevo=='yes')
{
  if ($spichki == 'yes') {echo "Покурил";}
}
else  {echo "Покурил";} ;
Ну и курево, спички выделить в отдельные функции.
Убрать оттуда изменение локальных переменных и тп. Если изменение переменных в первом условии нужно для использования во втором – все безжалостно отрефаторить.
 

skif

Житель центра
#30
Код:
if (kurevo=='yes') {
    if (spichki == 'yes') {  
      System.out.println("Покурил");
      return;
    }
}
System.out.println("Ни сигарет, ни спичек") ;
Не?

Ну и это не задача в общем виде. Блоксхема не подразумевает работу JIT неведанной долбанутости. Она вобще JIT не подразумевает. Поэтому нужно указывать, где и как будет использоваться реализация алгоритма.

Или развернуть в другую сторону,
if (kurevo != 'yes') { return; }
И т.д.
 

Aliens

Меня знают многие ;-)
#31
ГМХ - отличная логика и правильное решение ситуации.
Скиф - сильная теория, и такое же решение как у ГМХ только позже.
Оба почти победили :)

Давайте еще варианты, представим что мы ограниченны только одной процедурой. Т.е. обыграть все надо в ее теле, без вызовов.
 

skif

Житель центра
#33
Какие варианты, это что, конкурс?
Кодирование алгоритма описанного на блоксхеме – в первом ответе этой темы. Если нужно решение – давайте задачу.
 

Aliens

Меня знают многие ;-)
#34
Задачу я уже дал: написать код в рамках одной процедуры, без вызовов других и без дублирования кусков кода. Да и когда я сказал на любом языке программирования, я имел ввиду именно язык, а не платформы, технологии оптимизации и т.п.
Что бы было проще понять: нужен алгоритм без учета возможностей оптимизации отдельных языков.
 

skif

Житель центра
#35
Есть ли такая конструкция в каком нибудь языке? И если нет то почему?

Что бы было проще понять: нужен алгоритм без учета возможностей оптимизации отдельных языков.
Правильный ответ:
ЕСЛИ Хорошая погода и Лето Тогда
Поедем на море
Иначе
Пойдем в лес
КонецЕсли
Язык знаешь.
На ruby:
Код:
def answer(case1, case2)
  return ok if case1 && case2
  fail
end
Так в чем проблема, которая стала причиной темы?)
 

absent

Известный деятель города
#36
если мы зададим составное условие вида:
(СуществетОбъект(Объект)=Да)и(Объект.Атрибут=1)
Компилятор тупо проверит существоние объекта и значение атрибута этого объекта, в случае если объект существует все нормально, но если объекта нет, тогда вторая часть составного условия вызовет исключения типа обращение к несуществующему объекту, области памяти, нарушение доступа и т.д. на вкус компилятора.
Насколько я знаю, большинство компиляторов сейчас работает по краткой схеме вычисления. То есть если объект не существует, он уже не будет даже пытаться проверять его атрибут. В случае с операцией логическое ИЛИ аналогично - если хоть одно из подучсловий ИСТИНА - дальше не вычисляется.
 

skif

Житель центра
#37
Да, но если я правильно понял, высказана гипотеза, что если объект, который задействован в первом условии существует, то JIT выполнит "забегание вперед" и "попытается" выполнить второе условие.

Я не понимаю как это может происходить и ни разу не встрачался с этим.

И еще, оперировать терминами языка, без учета его платформы – это все-равно, что оценивать зарплату в другом городе не прнимая в расчет стоимость проезда и жилья. Возможно увлекательно, но не имеет никакого смысла и связи с реальным миром.
 

Coole

Графиня
#38
Вы все ничего не поняли!
так вот, если мы зададим составное условие вида:
(СуществетОбъект(Объект)=Да)и(Объект.Атрибут=1)
Процедура КнопкаСформироватьНажатие(Кнопка)

КаталогНаДиске = Новый Файл(""); // пустое значение
//----------------// ложь -----------------------------// не проверяется
Если КаталогНаДиске.Существует() И КаталогНаДиске.Имя = "ЧтоНибудьРавно" Тогда
Сообщить ("ххх");
Иначе
Сообщить("ууу"); // попали сюда
КонецЕсли;

КонецПроцедуры
Подтверждение слов absent'a.
 
#39
Я вижу только один вариант, когда код, приведённый мной выше, будет не уместен. При работе с объектами, имеющими вложенные свойства.
Скажем, у нас есть авианосец (НАТО|на 40 самолётов), проститутка ( анал|за 100 баксов) и халат (шелковый|с зелёными пуговицами).
В случае, если нам жена заказала "халат, с перламутровыми пуговицами", то попытка узнать какие пуговицы у путаны не только вызовет ругань компилятора (в некоторых языках), но и жены.
Но это не вопрос корректности применения условного оператора или построения алгоритма. (В этом плане Coole ещё в первом посте правильно всё оптимизировала). А вопрос построения архитектуры приложения и главное - фильтрации входных данных.
В таких случаях можно выйти из положения множеством вариантов, но все они будут больше чем два if/then и нужно, прежде всего смотреть задачу целиком.
Для простой же задачи, скажем "назовите целое число от 4 до 6" - код приведённый мною корректен.

ЗЫ. Программист, когда ложится спать ставит на тумбочку два стакана: полный и пустой. Полный на случай если ночью пить захочется. А пустой - если не захочется.

Гы. Эта тема - пример этой темы. Все верно решили изначально поставленную задачу (первое условие). Но далее к условиям добавили пунктов и мы перешли к новому решению (вернулись в другую ветку :)
Рекурсия, мать её :)
 
Статус
В этой теме нельзя размещать новые ответы.