Stanislav Gribanov
Stanislav Gribanov личный блог
12 февраля 2024, 11:05

Перевод книги "Хакер фондового рынка". Третий час: ветвление.

Перевод книги "Хакер фондового рынка". Третий час: ветвление.
Третий час: ветвление.

1. Предисловие.
2. Торговля деньгами.
3. Биржевая цена.
4. Золотоискатели и ломбарды.
5. Тики, бары, свечи.
6. Как работают торговые системы?
7. Технический анализ — смысл и бессмыслица.
8. Трехчасовой курс программирования.
9. Первый урок: Переменные.
10. Разновидность калькулятора.
11. Второй час: Функции. 
12. Функции с возвращаемым значением.

Если я хочу тратить больше 3 000 евро в месяц, мне нужна новая стратегия. В противном случае подойдет моя старая стратегия.
Это пример ветви if/else. В коде это будет выглядеть следующим образом:

if(Ausgaben > 3000)
  neue_strategie_starten();
else
  alte_strategie_fortsetzen();

Операторы «if» используются, когда сценарий должен принимать решения — то есть, когда он должен вести себя по-разному в зависимости от того, истинно условие или нет. Таким условием может быть ввод данных пользователем, величина случайного числа, результат математической операции или пересечение двух индикаторов. Основная форма оператора if выглядит следующим образом:

if(Условие_есть_истина)
  tu_was(); // Выполните эту инструкцию (одну единственную инструкцию!)
oder  - если несколько инструкций должны выполняться условно:
if(Условие_есть_истина)
{
  tu_was();      // Выполнить эту инструкцию
  tu_noch_was(); // Также выполните эту инструкцию
}

Более сложная форма оператора if:

if(Условие_есть_истина)
{
  ... // Несколько утверждений внутри фигурных скобок
} else { // если условие не истинно
  ... // Несколько утверждений внутри фигурных скобок
}

Операторы в части «else» выполняются только в том случае, если условие не применяется, как в нашем примере выше:

if(Ausgaben > 3000)
  neue_strategie_starten();
else
  alte_strategie_fortsetzen();

Вызывается либо new_strategy_start, либо old_strategy_continue, но никогда обе ветви, потому что выполняется только одна из них. Условные части кода называются «ветвями» или «разветвлениями», поскольку выполнение кода может принять то или иное разветвление, в зависимости от условия. Кроме того, несколько вложенных операторов if выглядят как ветвящееся дерево с корнем в первом «if».

Заметили ли вы, что мы сделали отступ в строках после «if» и между фигурными скобками? Языку C все равно, как вы делаете отступы между строками, пишете ли вы оператор на той же строке или на новой. Но программисты хотят, чтобы структура была как можно более четкой. Код читается легче, когда зависимые строки имеют отступы. Однако, если бы мы захотели, мы могли бы написать его таким образом:

if(Ausgaben > 3000) neue_strategie_starten();
else alte_strategie_fortsetzen();

или даже вот так:

if(Ausgaben > 3000) neue_strategie_starten(); else alte_strategie_fortsetzen();

Для компилятора оба варианта одинаковы. Теперь давайте сделаем выводы:

► Операторы if начинаются с ключевого слова «if», за которым следует пара круглых скобок;

► скобки содержат условие в виде сравнения или другого математического выражения, которое может быть истинным или ложным;

► если выражение истинно, то выполняется следующий оператор или набор операторов в фигурных скобках;

► если выражение ложно, то следующая инструкция или набор инструкций пропускается, т.е. не выполняется;

► если выражение ложно и мы используем «else», то выполняется оператор или набор операторов, следующий за «else» в фигурных скобках.

► Отступы и разбиение на строки не нужны компилятору, но облегчают чтение кода.

Достаточно теории — давайте посмотрим на действия! Давайте напишем следующий сценарий:
function main()
{
  var Profit = 50;
  if(Profit > 100)
    printf("Достаточно!");
  else
    printf("Недостаточно!");
}

Мы объявили переменную Profit с начальным значением 50. Условие в операторе if сравнивает прибыль со 100. Если прибыль больше 100, условие истинно и мы имеем «Достаточно!», иначе нет. Мы используем форму if/else без фигурных скобок, потому что за один раз выполняется только один оператор.

Создайте новый скрипт, как вы узнали на прошлом занятии, напишите его содержание, сохраните его, например, как «IfElse.c» в папке Strategy, выберите его и нажмите [Test]:
Перевод книги "Хакер фондового рынка". Третий час: ветвление.

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

var Profit = slider(3,50,0,200,"Profit",0);

Если теперь вы нажмете на [Test], чтобы снова запустить сценарий, вы заметите, что нижний ползунок вдруг стал обозначаться как «Прибыль». Теперь передвиньте ползунок до упора вправо, чтобы в маленьком окошке появилось 200, и снова нажмите [Test]:
Перевод книги "Хакер фондового рынка". Третий час: ветвление.

Что случилось? Вместо числа 50 мы теперь присвоили возвращаемое значение вызова функции slider в качестве начального значения переменной Profit. Переместив ползунок до упора вправо, условие if внезапно стало истинным. Таким образом, значение стало больше 100. Это дает нам представление о том, как работает функция ползунка. Вызов был slider(3, 50, 0, 200, «profit», 0). В функцию передается шесть параметров: номер ползунка (3), его начальное значение (50), его значение на левом (0) и правом краю (200), название ползунка («Profit») и информационный текст (здесь 0, т.е. не используется). Переместите ползунок до упора влево и проверьте, выдает ли теперь скрипт «Недостаточно!» при нажатии кнопки [Тест]. Возвращаемое значение функции ползунка соответствует положению ползунка. Теперь вы можете представить, как мы можем использовать ползунки для установки переменных для наших стратегий.

Предположим, что сценарий должен сделать что-то только при выполнении не одного, а двух различных условий. Например, в следующем сценарии:
function main()
{
  var Risiko = slider(2,50,0,200,"Risiko",0);
  var Profit = slider(3,50,0,200,"Profit",0);
  if((Profit > 100) and (Risiko == 0))
    printf("Достаточно!");
  else
    printf("Недостаточно!");
}

Теперь задействованы два ползунка. Как их нужно установить, чтобы скрипт выводил «Достаточно!»? Мы оставляем эту небольшую задачу читателю… но подсказка: два условия связаны оператором «и» (оператор — это знак для математической операции, например, "+", "*" или также «и»). Это означает, что оба условия должны выполняться одновременно, чтобы связь была истинной. Существует также связь «или», которая истинна, если выполнено хотя бы одно из условий.

Вот три совета, как избежать ошибок сценария при проведении сравнений:

► Вы заметили скобки вокруг (прибыль > 50) и (риск == 0)? Из школьной математики мы знаем, что в математическом уравнении сначала решаются выражения в скобках. (1 + 2) * 3 не то же самое, что 1 + (2 * 3) — это верно как в математике, так и в языке программирования. Всегда используйте круглые скобки, чтобы убедиться, что программа вычисляет выражения в правильном порядке… и убедитесь, что у вас столько же открывающих скобок, сколько закрывающих! Отсутствие круглой скобки в конце сложного выражения является распространенной причиной сообщений об ошибках компилятора. Компьютер обычно сообщает об ошибке в следующей строке, потому что он ищет там недостающую скобку. Это был первый совет.

► Что насчет этого «risk == 0» — двойной знак равенства — это опечатка? Нет, это не так. Когда вы проверяете два значения (риск и 0 в примере выше) на равенство, вы должны использовать "==" вместо "=". Потому что строка кода выглядит следующим образом:

if(Risiko = 0) // неправильно!!

формально верна, но она установит переменную risk в ноль вместо того, чтобы сравнивать ее! Это еще одна ошибка, которую часто и охотно допускают даже опытные программисты. Вы можете избежать этого, если возьмете за правило всегда помещать постоянное значение в левую часть сравнения, а переменную — в правую. Тогда сравнение выглядит следующим образом:

if(0 == Risiko) // Правильно!!

Если вы случайно опустите "=", компилятор будет ворчать, потому что 0 не может быть установлен в другое значение. Это был второй совет.

► Будьте осторожны при сравнении переменных "==". Когда компьютер вычисляет математическое выражение, результат обычно получается немного неточным из-за ограниченной точности чисел с плавающей запятой. Например, 1/3 — это не 0,33333333… для компьютера, а 0,3333329856. Таким образом, если вы сравниваете два математически одинаковых числа, они вполне могут быть разными! Обычно, поэтому, вы используете сравнения «больше чем» или «меньше чем» ("<" или ">") только с переменными. Только при сравнении целых чисел — например, с переменными int или при установке var непосредственно в небольшое целочисленное значение — "==" не вызывает проблем. Это был третий совет.

Продолжение следует...

0 Комментариев

Активные форумы
Что сейчас обсуждают

Старый дизайн
Старый
дизайн