В.Е. Лѐвкин Как читать и писать программный код? Сложность

advertisement
В.Е. Лѐвкин
Как читать и писать программный код?
Сложность статьи:
 (вводный уровень)
Эта статья для новичков в NeoBook и в программировании вообще.
Главная цель статьи - показать, что "не так страшен черт, как его малюют", иначе говоря, не стоит бояться
писать код – верьте, что у Вас всѐ непременно получится!
Перед
чтением
этой
статьи
рекомендую
прочесть
статью
Peter`a
о
переменных
(http://neobooker.ru/forum/38-1161-1) и статью Сергея об операторе "IF" (http://neobooker.ru/forum/38-1774-1).
Любой, кто только начинает изучать программирование сталкивается с вопросом: "Как кодить?".
В современных визуальных средах программирования в пару кликов мышкой можно создать кнопку, картинку, поле ввода, выпадающий список, переключатель, ссылку и прочие "объекты", составляющие интерфейс программы. Но как заставить всѐ это работать? Как дать знать компьютеру, что делать ему, если
пользователь нажмет эту кнопку или подведет мышь к тому полю ввода текста? Описание таких действий
на понятном машине языке и есть компьютерная программа или исполняемый компьютером код. Существует множество языков программирования, также как существует множество человеческих языков.
Вы можете сказать "я тебя люблю" на русском, английском, французском, японском, испанском и любом
другом языке. Точно также на любом языке программирования Вы может дать команду компьютеру вывести на экран окно с таким-то заголовком и таким-то содержанием.
Например, в NeoBook этот простейший код выглядит так (с комментарием над ним):
.Вывести окно сообщения с заголовком и кнопкой "ОК"
AlertBox "Ваш заголовок" "А тут сам текст любого вашего сообщения."
Когда компьютер прочитает эту часть кода программы, он создаст окно (рисунок можно выбрать любой, я
выбрал свой апельсиновый смайлик):
У команды AlertBox есть два "параметра" (заголовок и сам текст, который, кстати, может быть многострочным). Есть команды с параметрами (с разным их числом) и команды без параметров. Число параметров легко подсчитать по парам кавычек. У команды вывода сообщения две пары кавычек, з начит два
"параметра" (т.е. того, что можно изменять и/или учитывать):
AlertBox "" ""
Имя команды и значение ее параметров - это "синтаксис команды" (т.е. "смысл команды", или, иначе
говоря, описание того, как команду следует читать и для каких действий употреблять). Как дрессировщик
дает команды собаке: "Сидеть!" или "Лежать!", "Ищи!", "Взять!" и др., так и программист, дает команды
компьютеру, для того, чтобы тот делал нужные программисту вещи. К счастью для программистов и пользователей, компьютер "понимает" значительно быстрее и больше команд, чем даже самая умная собака, а
главное - выполняет именно то, что Вы скомандовали! Если Вам кажется, что программа делает что-то не
то, то скорее всего она делает именно то, что Вы написали, но, возможно не то, что Вы в итоге хотели бы
видеть в качестве результата. Но это поправимо! Достаточно найти ошибку и исправить ее.
Синтаксис описывается в справке к той среде программирования, которой Вы пользуетесь и справочный файл - это первый инструмент любого начинающего программера! Справку надо любить и уметь ею
пользоваться, в частности – активно использовать поиск по справке.
Указанную команду AlertBox (вызов окна сообщения) можно записать в область кода для любого события в
котором может участвовать кнопка, например, на клик левой кнопкой мышки. Тогда по нажатию кнопки
всякий раз будет появляться указанное Вами сообщение. "Клик по кнопке левой кнопкой мышки" – это
"событие", как и "клик правой кнопкой мышки", или "подведение мышки к кнопке", "уход мышки за пред елы кнопки") – всѐ это "события", к появлению которых можно добавлять "код", который будет исполняться
всякий раз, при возникновении данного события. Для разных объектов (кнопок, переключателей, картинок
и т.д.) существует разный набор доступных событий, на которые можно "повесить код".
Можно ограничить появление нашего сообщения (или выполнение любых других команд) не только "событием", но и каким-то "условием". Например, нужно, чтобы сообщение появлялось не всякий раз, а
только если пользователь в разработанном Вами тесте выберет неверный вариант ответа (будем считать,
что правильный вариант ответа находится под номером "4"). Тогда код может выглядеть так:
.Если "[номер выбранного варианта ответа]" "не равен" "4"
IF "[otvet]" "<>" "4"
.То отобразить окно с сообщением:
AlertBox "Ахтунг!" "Вы выбрали неверный ответ. Вы арестованы!"
.В противном случае,
Else
.Отобразить другое окно:
AlertBox "Молодец!" "Выбран верный ответ. Спите спокойно, дорогой товарищ."
.Конец условия "Если"
EndIF
В этом примере, благодаря условию "Если" (ставится условный оператор "IF") у нас появилась возможность управлять процессом общения пользователя с программой. Мы заложили в этом коде две послед овательности действий! Первая реализуется, если пользователь выберет любой вариант ответа кроме того, что под цифрой "4". А вторая последовательность действий осуществится только если указанное условие ("IF") не выполняется (т.е. будет выбран вариант именно под цифрой "4"). Тогда начнет исполняться
код начиная с оператора "Else", который можно прочитать как "в противном случае" или "иначе". При
этом каждое "условие" необходимо "закрывать" (закрывающий оператор "EndIF"), т.е. нужно показывать
компьютеру, где условие закончится, иначе это условие следует понимать распространяющимся на весь
код, расположенный строчками ниже… Не написать закрывающий оператор в коде, это все равно, что
скомандовать: "Если ямы нет, то копай яму!" и при этом не сказать на какую глубину и какого размера,
сколько их вообще копать… Когда остановиться то?! Чтобы компьютер "знал", где заканчивается учет указанного условия ему нужно прямо указать на этот момент оператором "EndIF". Тогда компьютер перестанет учитывать это условие и займется исполнением других команд.
В приведенном выше примере с программой-тестом, если наш пользователь выбрал ответ не равный
цифре "4", то выпадет первое сообщение, а если выберет ответ под номером "4", то на экране появится
второе сообщение. Происходит так потому, что компьютер читает условие и если оно выполняется ( в нашем случае, пользователь выбрал какой-то вариант ответа, но не равный цифре "4"), то он читает/исполняет то, что идет ниже этого условия – следующую строку нашего кода, а там команда на вывод
окна сообщения. Если же прочитав условие компьютер определяет, что оно не выполняется (пользователь как раз выбрал ответ под номером "4"), то ищет строчку, в которой написано, что делать "в противном случае", т.е. ищет оператор "Else" (который укажет, что исполнять надо строки идущие сразу после
этого оператора) или ищет оператор "EndIF", который укажет ему на то, что условие (начатое оператором
"IF") более не актуально.
У каждого "начала условия" должен быть свой "конец условия", иначе говоря, у каждого "IF" должен быть
свой "EndIF", а "Else" всегда относится к ближайшему и только выше от него расположенному "IF". Таким
образом можно создавать условия, содержащие внутри множество вложенных условий (условий внутри
условий). Чуть ниже мы увидим иллюстрацию этого.
А вот оператор "Else" может быть, а может и отсутствовать между "IF" и "EndIF". Когда нам нужно однозначно указать на то, что следует делать, если условие "IF" не выполняется, то тогда между IF" и "EndIF" и
помещается "Else". Кстати, между "IF" и "EndIF" может быть только один "Else", однако между "IF" и "Else",
как и между "Else" и закрывающим "EndIF" могут быть другие вложенные условия, со своими "IF", "Else" и
"EndIF". Сколько пожелаете!
Чтобы понять это, прочитайте нижеприведенный "код" состоящий из одних только условных операторов. Я
не все строки прокомментировал, думаю Вы легко сделаете это сами, глядя на те, что прокомментированы. Добавим только еще пустые строки после каждого "EndIF", для читабельности, они на код не влияют
никак. Кстати, для читабельности кода необходимо делать отступы, чтобы было понятно к какому условию
какой код относится (хотя на логику работы программы отступы не влияют никак и при компиляции удаляются также как и пустые строки):
1
2
3
4
5
6
IF " " " " " "
|***код***|
Else
IF " " " " " "
|***код***|
EndIF
Это условие будет считываться только, если не выполняется первое условие
Этот код будет исполнен, если выполняется условие строки 4
7
8
9
10
11
IF " " " " " "
|***код***|
Else
|***код***|
EndIF
Это условие будет считываться независимо от условия строки 4
12
13
14
15
16
17
18
19
IF " " " " " "
|***код***|
Else
IF " " " " " "
|***код***|
Else
|***код***|
EndIF
Это условие будет считываться независимо от 4 и 7
20
21
22
23
24
25
|***код***|
EndIF
|***код***|
|***код***|
EndIF
Этот код будет читаться только если не выполняется условие строки 7
А это условие б удет счи тываться только если не выполняется 12
Этот код исполняется, если выполняется условие 15
В противном случае (т.е. если условие 15 не выполняется)
Исполняется этот код
Этот код исполнится, если не выполняется условие 12, независимо от 15, 7, 4
Этот код исполнится, если не выполняется условие 1
Этот код исполнится, если не выполняется условие 1
Когда код описывает не просто одиночную команду (как например, рассмотренный выше вывод окна сообщения), а описывает разные сценарии, разные варианты исполнения кода при разных условиях или
разных событиях, то следует говорить уже о том, что наш код описывает некую логику действий, некот орую их связанную последовательность – т.е. "алгоритм". По-другому алгоритм еще можно определить как
сценарий работы пользователя с программой. Если Вы придумали такой сценарий для разного поведения
пользователя, то считайте, что алгоритм у Вас есть. Проясним еще понятие алгоритма.
Представим, родитель своему ребенку говорит: "Когда вернешься из школы, то сначала возьми деньги из
тумбочки, убедись в том, что денег достаточно для покупки двух булок хлеба и трех пакетов молока. Если
денег не хватит, то возьми недостающую сумму на полке в серванте (запомни, сколько осталось в серванте – потом мне скажешь), после чего сходи в ближайший магазин, но если он все еще закрыт (на ремонте),
то купи в том, что через дорогу. А когда принесешь, то положи молоко в холодильник, а хлеб в хлебницу.
Проконтролируй, чтобы и холодильник, и хлебница были закрыты!". И эту последовательность действий
(т.е. алгоритм) Вы можете сформулировать на любом человеческом языке, смысл действий от этого не
изменится. Точно также одни и те же алгоритмы (последовательности действий для выполнения компьютером) можно сформулировать на разных языках программирования. И успешность действий во многом
зависит от того, на сколько хорош алгоритм. Например, если пересчитать деньги уже в самом магазине и
обнаружить, что их не хватает, то придется возвращаться домой за ними, а если придти в магазин за хлебом и молоком без денег, то никакую покупку сделать не удастся вовсе. Также и контролировать закрыт ли
холодильник перед тем как положить в него молоко не имеет смысла, поскольку контролировать это нужно
после того как молоко окажется внутри.
Плохой алгоритм не приводит к нужному результату, или создаѐт много трудностей на пути к нему. Хороший алгоритм – это оптимальная последовательность действий – минимум затрат для получения нужного
результата, и при этом с учетом возможных форс-мажорных обстоятельств (а что делать, если денег в
тумбочке не хватит или ближайший магазин закрыт?). Что делать, если пользователь выберет неверный
вариант ответа или вообще не сделает выбор, а просто закроет окно с выбором варианта ответа?
Итак, как Вы уже догадались, "программный код" – это "алгоритм действий", описанный на избранном
Вами языке программирования (в программу код превращается после его "компиляции" – когда код переводится в понятные машине нолики и единицы). Поэтому, чтобы написать программу нужно, прежде
всего, составить ее алгоритм - т.е. хотя бы у себя в голове ясно представлять что и в какой последовательности программа должна делать, какие события возможны и как их следует обрабатывать (что компьютеру делать при их возникновении). Такое понимание работы будущей программы – это тоже алгоритм,
только письменно не зафиксированный. А после продумывания алгоритма нужно этот алгоритм просто записать на выбранном Вами языке программирования. Такая запись (исходный код) далее компилируется
и мы получаем "исполняемый файл", т.е. то, что и называют "программой".
Например, переведем в код наш алгоритм действий "школьника", точнее его первую часть (для простоты):
"Когда вернешься из школы, то сначала возьми деньги из тумбочки, убедись в том, что денег достаточно
для покупки двух булок хлеба и трех пакетов молока. Если денег не хватит, то возьми недостающую сумму
на полке в серванте (запомни, сколько осталось в серванте – потом мне скажешь)…"
Только в нашем учебном примере в роли "денег" пусть будут байты, а в роли "тумбочки" и "серванта" пусть
будут файлы, содержащие определенное количество "денег" (т.е. байт).
В указанном ниже коде используются, кроме уже рассмотренных выше команд, команды "FileSize" (узнать
размер указанного файла и результат сохранить в переменной) и " Math" (произвести математические вычисления, результат показывать с указанным кол-вом знаков после запятой и сохранить результат вычислений в переменной). Названия переменным мы можем придумывать любые, поэтому сделаем их интуитивно понятными.
Мы добились того, что у нас есть 100 "рублей" (но только в том случае, если в серванте не меньше денег,
чем нам нужно, иначе до ста мы не доберем и действия закончатся на сообщении о том, что денег не хватает. Возможную ошибку (отсутствие нужной суммы денег) мы обработали и это очень хорошо!
Вот тот же самый код, но без комментариев (я лишь добавил стрелки, выделив условия. Прочитайте этот
код сами, по схеме: "если выполняется это условие, то делаем это…, далее, если выполняется это условие, то делаем это…, далее, если выполняется это условие, то делаем это…, в противном случае (если
условие не выполняется), то выполняем вот этот код…"):
Если переменная [Ya] не равно [Doma], то весь написанный код выполняться не будет, и компьютер, определив, что первое условие не выполняется, перейдет сразу к строке идущей за самым нижним (в приведенном примере) оператором "EndIF". Если же не выполняется второе условие (смотрим второе по порядку "IF"), то компьютер "перейдет" на тот "EndIF", который ему соответствует (т.е. является самым близким
и находится над ним) – на рисунке выше такие "переходы" показаны стрелками.
Таким образом, самый короткий путь выполнения кода всегда слева, а самый длинный путь (из -за множества условий обрабатывающих разные события и ошибки пользователя) – всегда справа.
Покажем, для ясности, на том же рисунке и с противоположной стороны, а именно: к какому "IF" какой
"EndIF" или "Else" относится:
Писать код следует так, чтобы в правой части вложенные условия предусматривали все возможные сц енарии работы пользователя с программой – как правильные, так и случайные. Это делается для того, чтобы программа учитывала самые разные сценарии и, в том числе, не имела слабых мест в "защите от дурака", своего рода "дыр в защите" от нелепых или ошибочных действий пользователя.
Любая программа должна заботиться о пользователе, а значит должна предусматривать все возможные
его действия. Нужно спрашивать себя: "А что будет, если пользователь сделает не так, а вот так…? А что
должно быть, если пользователь не сделает этого, а сразу будет делать то…? И тому подобные вопросы.
Многие такие слабые места выявляются во время тестирования программы, когда Вы сами нажимаете по
всем кнопкам в разном порядке и специально вводите некорректные данные, так сказать, "мучаете" свою
программу. Конечно, "защита от дурака" несколько "раздувает" код, но зато Ваша программа не будет "падать", "виснуть" или выдавать некорректные данные при неверных (или даже злонамеренных, что тоже
может случиться) действиях пользователя.
К счастью, в NeoBook нет необходимости писать единый текст программы, достаточно прописать код для
нужных объектов и связанных с ними событий, при компиляции проекта умница NeoBook сама соединит
все разрозненные куски кода в один текст (Вы его, кстати, можете увидеть и прочитать – открыв файл Вашего проекта в обычном блокноте).
Надеюсь, что теперь Вам будет проще осваивать программирование в NeoBook! Желаю Вам творческой
энергии и неиссякаемых идей, а NeoBook обязательно поможет Вам их осуществить!
Download