Рассылка закрыта
Вы можете найти рассылки сходной тематики в Каталоге рассылок.
← Февраль 2001 → | ||||||
1
|
2
|
3
|
4
|
|||
---|---|---|---|---|---|---|
5
|
6
|
7
|
8
|
9
|
10
|
|
12
|
13
|
14
|
15
|
16
|
17
|
18
|
19
|
20
|
21
|
22
|
23
|
24
|
25
|
26
|
27
|
28
|
Статистика
за неделю
Программирование для начинающих #13
Программирование для начинающихВыпуск 13
Ведущий рассылки: Вячеслав Мацнев | e-mail: stac@stacmv.net |
|
В этом выпуске читайте: |
Внимание! Если Вы храните у себя выпуски рассылки, пожалуйста, обновите выпуск 12. Я зыбыл написать несколько абзацев (как бы странно это ни звучало), поэтому потребовалось исправить выпуск. Рассылать его повторно я не стал, дабы не засорять ваши ящики, но рекомендую вам обновить свои архивы. Тем же кто не очень уверенно знает (или чувствует себя в) DOS я советую выполнить такую задачку: возьмите старую и новую редакции выпуска 12 и найдите там "10 отличий" с помощью команд DOS. Выпуск 12 v2: http://stacmv.nm.ru/issue12.htm В архиве на сайте будет только новая редакция выпуска и от старой, разосланной Subscribe.ru, она отличается еще и отсутствием рекламы и т.п., поэтому вам могут понадобиться ваши знания HTML, чтобы удалить лишнее из того или иного файла, дабы привести их к "общему знаменателю".
Вот и наступило преславутое :-) третье тысячелетие, о котором долго говорили, мечтали дожить до его наступления и возрадоваться этому факту. Не всем это удалось, скажу сразу. Да простят меня читатели, что привношу в выпуск и грустные моменты. Но сейчас я просто не могу не вспомнить тех, с кем говорил, порою в шутку,о том, что с окончанием двадцатого века закончатся и наши первые двадцать лет. Тех, кто навсегда остался шестнадцати - восемнадцатилетним человеком XX века. С наступлением нового века все должно было измениться. Вы тоже думали так, правда? И даже 31 декабря 2000, когда ничего уже кардинально измениться не могло, оставалась надежда. Если вы не заметили перемен, то в этом нет ничего удивительного, потому что для того чтобы что-то изменилось, надо, чтобы кто-то это изменение произвел. Поэтому не надо сидеть и ждать перемен, давайте все сами менять. Я, пожалуй, сделаю эту фразу своим девизом в новом ..э.. ну хобя бы, году. А зачем, что-то вообще менять, спросите вы? А потому что так будет лучше, ведь менять мы же все к лучшему будем. Правда иногда это лучшее бывает не очевидным, я согласен. Например, я перешел на Windows 98 (простите за резкую перемену темы, но пора нам поговорить о кмпьютерах и программах). Отстаю, скажете, мол, уже и 2000 есть и ME. Но, если честно, я бы и с 95-ой остался, но не стала она работать с моей новой аппаратной конфигурацией. Слышал, что в подобном случае, процессор считается неработающим и его можно продать только за пол цены. Ну да ладно, придется привыкать к новому интерфейсу, думал я. А 98 интерфейс мне, мягко говоря, не нравится. Имею ввиду, интерфейс Explorer'а. Но не пришлось, выручил старый знакомый LiteStep (одна из альтернативных оболочек для Windows), который убрал весь этот интефейс куда подальше, заменив своим. Servant Salamander тоже внес лепту, взяв на себя функции менеджера файлов и оградив меня, опять же, от Explorer'а. Ура, все, как раньше. Но, ведь, надо что-то менять? Поменял я тему для LiteStep'а, что, между прочим, нетривиально, хотя и не очень сложно. Кстати, элементы графики этой темы использованы мной при создании нового дизайна для сайта. Поменял старуюю версию MacroHTML на новую и переписал с нуля "движок" сайта, превратив попутно процесс создания сайта из простой расстановкии тегов в самое настоящее программирование (чего и вам желаю). Чего еще? Планирую поменять среду разработки на новую (не очень хочу, но старую я банально не могу установить; чувствую, что подобные проблемы со старыми программами будут меня сопровождать до полного исчезновения этих программ с моего винта). Это одна из вторых сторон медали: очередная эпоха дает нам свежее, новое, но заставляет нас отказываться от старого, любимого. И перед всеми нами рано или поздно встает вопрос: от чего стоит отказаться, что принести в жертву новой эпохе?
При написании программ (в том числе и на Бейсике!:), очень часто бывает нужно организивать несколько вариантов выполнения программы, в зависимости от различных условий. В более или менее серьезных программах это "несколько" соответствует сотням и тысячам вариантов. Это число, даже с точностью до тысячи, я вам назвать не могу, кроме того, оно (помните анекдот про Неуловимого Джона?) все равно никому не нужно. Практически ветвления в программе реализуются с помощью условных конструкций, логических операций и операций отношения. С операциями отношения (<>,<,>,=,и т.д.) вы уже знакомы, с условными конструкциями (if ... then), в общих чертах, тоже. Остаются логические операции. Логика компьютера основана на двоичной системе. Поэтому и назвать ее можно двоичной или даже бинарной. Иногда еще используется термин "булева логика". Был такой человек, Буль, который эту логику формализовал (или придумал). В Паскале есть даже специальный логический тип данных, названный в его честь: boolean (булевый). Булева логика оперирует с двумя(!) понятиями: "ИСТИНА" и "ЛОЖЬ", при этом в двоичной системе им соответствуют "1" и "0".
"1"-"Есть"-"Да"-"Истина" Все просто и логично, что характерно :). Эти понятия вам надлежит хорошо усвоить, потому что вам их придется очень часто применять, по многу раз и в каждой программе. В упомянутом выше Паскале есть две логические константы: true и false (без кавычек; в кавычках будут уже строковые константы). В Бейсике нет специального логического типа и логических констант, поэтому, если вам надо выразится, используйте числа. Наша жизнь нас учит, что истин может быть много. Этот момент учтен в языках, не имеющих логического типа. В ряде случаев истиной будет любая величина, отличная от нуля, например, 53. Иногда оговаривается, что эта величина должна быть больше нуля, иногда это, вообще -1 (как раз в используемых нами Бейсиках). Но, заметьте, что "ложь" это всегда ноль. Чтобы избежать путаницы, говорят, что лжи соответствует ноль, а истине - не-ноль. Логические величины обычно появляются в программе как результат вычисления выражений, содержащих логические операции и операции отношения. Попробуйте следующий оператор: PRINT 2<3, 3<2 "Два меньше трех" - это истина (сомневающихся прошу поверить моему слову), а "три меньше двух" - явная ложь. Поэтому на экране вы увидите:
-1 0 Хотя часто достаточными бывают сами понятия "истина" и "ложь", вне зависимости от того какими числами они представлены в машине. Например, в условном операторе IF проверяется истинность условия 2>1. Главное, что 2>1 это "истина" и не важно, чему это выражение равно численно. Поэтому в дальнейшем, я буду называть "истину" и "ложь" этими самыми словами либо 1 и 0, для простоты. Заметьте, что операции отношения, имея в качестве аргументов числа, в результате дают логическую величину. С помощью операций отношения можно составлять простые логичекие выражения. Чтобы получить сложные логические выражения, надо простые соединять с помощью логических операций, которые мы сейчас и рассмотрим. Да, внимание сюда, пожалуйста. Обозначаются логические операции в разных языках по разному. Я буду использовать нотацию Бейсика, которая нам сейчас ближе и родней.
Логические операции -==============================================- NOT Отрицание AND Конъюнкция OR Дизъюнкция XOR Исключающее "или" EQV Эквивалентность IMP Импликация NOT - операция отрицания. результат=NOT выражение Смысл операции заключается в отрицании очевидных истин :-) и лжи. Следующая табличка показывает, что я имею ввиду. Кстати, эта табличка называется таблицей истинности для операции NOT.
--------------------- выражение | результат ----------+---------- 0 | 1 1 | 0 --------------------- Еще раз напоминаю, что 0 это "ложь", а 1 - "истина". Именно так их и слежует сейчас воспринимать, в том смысле, что в реальной программе в качестве истины может выступать любой не-ноль. Примеры: ------------------------- выражение | результат -------------+----------- NOT 0 | истина NOT(5<3) | истина NOT(2>1) | ложь ------------------------- AND - конъюнкция (полагаю, большинство из вас забудут это слово едва дочитав до точки), логическое умножение, "И". результат=выражение1 AND выражение2 Результат будет "истина", если выражение1 И выражение2 истинны.
----------------------------------- выражение1 | выражение2 | результат -----------+------------+---------- 0 | 0 | 0 1 | 0 | 0 0 | 1 | 0 1 | 1 | 1 ----------------------------------- Таблица истинности напоминает таблицу умножения, не так ли? Поэтому-то AND и называется логическим умножением. Примеры: ------------------------------------------- выражение | результат ------------------------------+------------- (2<2) AND (3>=1) | ложь (5>1) AND NOT 0 | истина (2=2) AND (7>=3) AND (3<>2) | истина ------------------------------------------- Когда в одном выражении присутствуют несколько операций, пора задуматься о том, в каком порядке они будут выполнятья компьютером. Операции отношения имеют более высокий приоритет, чем логические операции. Но я все же поставил скобки - лучше читать. Среди логических операций наивысший приоритет имеет NOT (как и унарный минус, среди арифметических). Затем идет AND (умножение), затем OR (сложение). Операции с одинаковым приоритетом выполняются слева направо или в порядке, задаваемом скобками. Третий пример в вышеприведенной табличке будет выполняться в порядке: (2=2) = истина
OR - дизъюнкция, логическое сложение, "ИЛИ". результат=выражение1 OR выражение2 Результат будет "истина", если выражение1 ИЛИ выражение2 истинны(одно из двух или оба вместе).
------------------------------------ выражение1 | выражение2 | результат -----------+------------+----------- 0 | 0 | 0 1 | 0 | 1 0 | 1 | 1 1 | 1 | 1 ------------------------------------
Примеры: -------------------------------------------- выражение | результат -----------------------------+-------------- (2<2) OR (3>=1) | истина (5<1) OR NOT (1=1) | ложь (2=2) OR (7>=3) | истина (3<5) OR (4<4) AND (2=6 ) | истина ((3<5) OR (4<4)) AND (2=6) | ложь -------------------------------------------- Обратите внимание на последние два примера: постановка скобок кардинально мняет результат. Иногда начинающие программисты забывают ставить скобки там, где они нужны, и имеют ошибки в программе, которые порой тяжело найти. Мы рассмотрели три основных, наиболее часто применяемых логических операции. Можно было бы и остановиться на этом, но чтобы вы имели более или менее полную картину, я упомяну и об остальных. XOR - исключающее "ИЛИ". результат=выражение1 XOR выражение2 Результат будет "истина", если выражение1 ИЛИ выражение2 истинны(одно из двух, НО НЕ оба вместе).
------------------------------------ выражение1 | выражение2 | результат -----------+------------+----------- 0 | 0 | 0 1 | 0 | 1 0 | 1 | 1 1 | 1 | 0 ------------------------------------ Вы, наверное, уже слышали не раз про эту операцию. В определенных кругах ходит даже такое выражение, как "заксорить что-нибудь", что значит примерно тоже самое, что и "зашифровать с помощью XOR". С одной стороны, все это немножко не относится к тому, о чем мы сейчас говорим, с другой стороны, относится, опять же немножко :). Поэтому позвольте мне... пару слов. В быту существует понятие логических операций. В программировании эти логические операции разделяются на логические операции (мы их сегодня изучаем) и на т.н. битовые операции (деление это, впрочем, в Бейсике весьма условно, и этот факт может иногда вызавть трудности). Первые характеризуются тем, что в ккчестве аргументов (выражение1 и выражение2) они принимают логические величины. Вторые оперируют с числами на уровне битов. Т.е. операция применяется отдельно к каждому биту. Например, 3 AND 2 = 2, 3 OR 2 = 3, 7 AND 5 = 5. Чтобы понять как это работает, вспомните двоичную систему и переведите в нее аргументы.
--------------------------- 3 | 2 | AND | OR ----+-------+-------+------ Б 0 | 0 | 0 | 0 И 0 | 0 | 0 | 0 Т 1 | 1 | 1 | 1 Ы 1 | 0 | 0 | 1 --------------------------- Битовая операция XOR обладает одним свойством, которое и вызывает к ней повышенный интерес. Заключается оно в том, что операция XOR обратима. Т.е. 3 XOR 2 = 1, а 1 XOR 2 = 3. Используя это свойство мы можем что-нибудь зашифровать, а потом, соответственно, расшифровать. Демонстрирую: Ксорим слово "Программирование"
---------------------------------------------------------------------- Буква | П | р | о | г | р | а | м | м | и | р | о | в | а | н | и | е ------+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+--- Код |143|224|174|163|224|160|172|172|168|224|174|162|160|173|168|165 ------+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+--- XOR | 3 | 3 | 3 | 3 | 3 | 3 | 3 | 3 | 3 | 3 | 3 | 3 | 3 | 3 | 3 | 3 ------+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+--- Код |140|227|173|160|227|163|175|175|171|227|173|161|163|174|171|166 ------+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+--- Буква | М | У | н | а | у | г | п | п | л | У | н | б | г | о | л | ж ------+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+--- Что я наделал? Взял первый символ слова, узнал его код, нашел результат операции код XOR маска (в роли маски служили числа 3 и 195; два числа взял просто для примера) и посмотрел, какой символ имеет такой код. Затем повторил это для остальных символов. Напомню, что в Бейсике код символа можно узнать с помощью функции ASC(), а символ по коду - с помощью CHR$(), и что речь идет об ASCII кодах. Маска в данном случае выступает в роли ключа. Если повторить операцию для зашифрованного текста использовав правильную маску-ключ, то получится исходный текст. Данный механизм шифрования, конечно, чрезвычайно не стоек. Расшифровать сообщение можно перебрав все возможные маски-ключи. Но в домашних условиях, я думаю, его применять можно, особенно если его немного усложнить: шифровать несколько раз подряд разными масками, или даже для каждого символа использовать свою маску, а набор масок тоже зашифровать и т.д. :-)) Ну ладно, к этому мы еще вернемся, когда изучим работу со строками и с файлами, а пока закончим с логическими функциями. Напомню, мы остановились на XOR. Примеры: --------------------------------------------- выражение | результат ------------------------------+-------------- (2<2) XOR (3>=1) | истина (5<1) XOR NOT (1=1) | ложь (2=2) XOR (7>=3) | ложь (3>5) XOR (4<4) XOR (2<=6 ) | ложь (3>5) XOR ((4<4) XOR (2<=6)) | истина --------------------------------------------
Остались две операции, EQV и IMP. Говорить про них не хочется. Смысл
первой из них очевиден, про вторую, если честно, я сам узнал только
сегодня (упс!) и никогда в жизни не использовал. Давайте подведем предварительные итоги. Есть ряд операций, которые позволяют нам конструировать сложные логические выражения и, соответственно, условия в программах. Иногда их также называют вентилями, потому что их легко моделировать с помощью обычных вентилей. В зависимости от управляющих сигналов на входах ("открыто"-"закрыто"), они пропускают или не пропускают воду. В нашем случае, управляющими сигналами являются аргументы, а выходным сигналом-водой - результат операции. Комбинируя различные операции (вентили) можно получить очень сложные условия (системы). Скоро вы познакомитесь с этим на практике. В завершение, привожу для вас сводную таблицу истинности для всех операций. Ее вы также можете посмотреть в help'е к Q Бейсику.
Таблица истинности логических операций -======================================- --------------------------------------------------------------- Выражение1|Выражение2| NOT | AND | OR | XOR | EQV | IMP ---------------------|----------------------------------------- Истина | Истина | Ложь |Истина|Истина| Ложь |Истина|Истина ----------+----------|------+------+------+------+------+------ Истина | Ложь | Ложь | Ложь |Истина|Истина| Ложь | Ложь ----------+----------|------+------+------+------+------+------ Ложь | Истина |Истина| Ложь |Истина|Истина| Ложь |Истина ----------+----------|------+------+------+------+------+------ Ложь | Ложь |Истина| Ложь | Ложь | Ложь |Истина|Истина --------------------------------------------------------------- И совсем последнее. Проблемы в Бейсике, о которых я упоминал. Ну, это не совсем проблемы, конечно, итак ... Все логические функции являются битовыми, в том смысле, как я описывал это выше. Поэтому, составляя сложные условия, надо следить, чтобы аргументами логических функций были бы логические величины (0,-1, либо простые условия, значением которых реально бывают 0 и -1). Если аргументами будут отличные от указанных числа, то битовый характер функций проявит себя в полной мере и это, как говорится в help'е, приведет к неожиданным результатам. NOT 5=-6 , NOT 2=-3 и т.п. Вообще-то, это вполне ожидаемый результат (когда знаешь про дополнительный код двоичных чисел и способ хранения в памяти отрицательных чисел; хотите, расскажу об этом?), но когда подобные вещи появляются в условиях оператора IF, например, результат работы программы будет действительно неожиданным. Так что, внимательно следите за этим. Подобные ошибки не отслеживаются трансляторами, т.к. с точки зрения транслятора, они ошибками не являются. Все. Урок окончен. Перемена.
Буквально пять минут (а если не ходили на перемену, то секунд) назад вы познакомились и четко на всю жизнь усвоили принципы логических операций. Они появились в нашей программе не случайно. Многократно уже отмечалось, что ветвления в программах, т.е. изменения порядка выполнения ее команд, являются наиболее часто применяемыми конструкциями в программировании. Это станет для вас еще более очевидным, если вы вспомните, что конструкции типа "цикл" также используют условия (завершения или продолжения цикла), после проверки которых и в зависимости от результата этой проверки, дальнейшее выполнение программы происходит по одной из двух ветвей (либо повторение тела цикла, либо выполнение следующих за циклом команд). Вы уже познакомились с конструкцией IF...THEN, отвечающей за организацию условий в Бейсике (в большинстве других языков тоже имеется подобная конструкция с аналогичным названием). Поэтому я, думаю, могу рассчитывать на ваше понимание излагаемого материала. Сегодня мы рассмотрим более сложные варианты записи опратора IF, а также конструкцию типа "множественный выбор". Поехали! Раньше мы с вами записывали операторы IF в следующем формате: IF условие THEN оператор При этом указанный оператор выполнялся только тогда, когда условие было истинным. За время, прошедшее после нашего последнего разговора, практически ничего не изменилоссь, и данная конструкция продолжает иметь право на существование :). Надо сказать, что в старых примитивных реализациях Бейсика других форм записи и не существует (точнее, не существовало, потому как найти сейчас примитивный старый Бейсик все равно, что повторить 12 подвигов Геракла). Другое дело, что, если вы хотите, в случае истинности условия, выполнить не один оператор, а несколько, такая форма записи становится неудобной. Поэтому была введена следующая конструкция:
IF условие THEN Полагаю, пояснения не нужны. Единственное, на что стоит обратить внимание, это то, что блок операторов (группу операторов, имеющую смысл иногда называют блоком операторов) обязательно должен начинаться с новой строки, в противном случае, компилятор будет воспринимать первую строчку, как конструкцию IF "старого типа" и недоумевать по поводу "END IF". Ну а вы об этом узнаете по возникновению ошибки типа "END IF WITHOUT IF". Ряд подписчиков уже попались на этом, поэтому я уделяю данному моменту повышенное внимание. Ок. Есть еще одна тонкость при использовании IF, о которой я бессовестно умолчал в прошлый раз, когда мы об этом говорили. Конечно же, это ключевое слово ELSE (читается "элс"). Переводится оно на русский как "еще","кроме","иначе". В Бейсике используется последнее значение (в английском языке это слово имеет одно значение, но на русский точно это не переводится (одним словом), поэтому используются несколько значений). Применяется это супер-слово так: IF условие THEN оператор ELSE оператор или
IF условие THEN оператор1, оператор2, .........., операторN ELSE оператор1, оператор2, .........., операторN END IF Реклама:Минздрав предупреждает, чаще сохраняйте плоды своей работы на компьютере. Если это прочесть по-русски, то получится примерно следующее: ЕСЛИ условие верно, ТО выполнить операторы ИНАЧЕ(если условие не верно) выполнить операторы. Подобная конструкция позволяет в одном операторе предусмотреть два варианта выполнения программы, в зависимости от истинности условия. Например, нужно выдать какое-то сообщение в зависимости от возраста "клиента". Раньше бы мы сделали так:
IF age > 40 THEN ? "Вам больше 40" А теперь мы можем записать это проще: IF age>40 THEN ? "Вам больше 40" ELSE ? "Вам меньше 40" {Оператор PRINT можно сокращать до знака вопроса.} Тперь настало время применить полученные знания о логических функциях. Вспомните программу 9.1 (см. выпуск 9), где у нас проверялся пароль и логин. Там имеются такие строчки:
80 IF login$<>l$ THEN GOTO 40 Можно догадаться, что в данном случае требуется одновременное равенство введенных значений логина и пароля хранящимся в памяти. На ум приходит мысль об использовании операций "И" и "НЕ" (приходит или нет?). 80 IF NOT(login$=l$ AND pass$=p$) THEN GOTO 40 Как альтернативу можно (и в данном случае лучше) использовать операцию "ИЛИ": 80 IF login$<>l$ OR pass$<>p$ THEN GOTO 40 Чем хороши некоторые языки программирования (например, Бейсик), это тем, что программу на них легко читать и понимать. Например строку 80 (последний ее вариант) можно прочесть так: ЕСЛИ login$ не равен l$ ИЛИ pass$ не равен p$ ТОГДА ИДТИ на строку 40. Не правла ли это удобно? И, вообще, здорово. Единственное, что от вас требуется - это освоить обратный процесс: свою мысль на естественном языке перевести на язык программирования и правильно ее записать. Вернемся к возрасту "клиента". Нередко бывает необходимо "разветвить" программу более, чем на два направления. Для примера рассмотрим деление пользователей на возрастные категории. Требуется по конкретному значению возраста определить, к какой категории пользователь относится, чтобы затем произвести специфические для этой категории пользователей действия. Категории у нас будут такие:
I - до 16 лет (включительно) Итак, что нужно сделать (исходная мысь на естественном языке)?
1.Запрашиваем у пользователя возраст. 2.Проверяем его на соответствие диапазону допустимых возрастов. 3.Смотрим, к какой категории относится "клиент". 4.Выдаем номер категории на экран. Теперь более подробно:
1.ВВЕСТИ возраст, выдав на экран приглашение "Ваш возраст :" 2.1.ЕСЛИ возраст меньше 0 ИЛИ больше 120 ТО НАПЕЧАТАТЬ "Простите, но мы обслуживаем только живых людей." и ЗАВЕРШИТЬ программу. 2.2.ЕСЛИ возраст больше 0 И меньше 7 ТО НАПЕЧАТАТЬ "Простите, но мы не обслуживаем грудных детей." и ЗАВЕРШИТЬ программу. 2.3.ЕСЛИ возраст больше 80 ТО НАПЕЧАТАТЬ "Простите, но Вы слишком стары для этого." и ЗАВЕРШИТЬ программу. 3.1.ЕСЛИ возраст меньше или равен 16 ТО категория=1 3.2.ИНАЧЕ ЕСЛИ возраст больше или равен 17 И меньше или равен 23 ТО категория=2 3.3.ИНАЧЕ ЕСЛИ возраст больше или равен 24 И меньше или равен 32 ТО категория=3 3.4.ИНАЧЕ ЕСЛИ возраст больше или равен 33 И меньше или равен 50 ТО категория=2 3.5.ИНАЧЕ категория=5 4.1.ЕСЛИ категория=1 то НАПЕЧАТАТЬ "I" 4.2.ЕСЛИ категория=2 то НАПЕЧАТАТЬ "II" 4.3.ЕСЛИ категория=3 то НАПЕЧАТАТЬ "III" 4.4.ЕСЛИ категория=4 то НАПЕЧАТАТЬ "IV" 4.5.ЕСЛИ категория=5 то НАПЕЧАТАТЬ "V" Теперь это легко перевести на Бейсик:
1: INPUT "Ваш возраст :", age 2: IF age<0 OR age>120 THEN PRINT "Простите, но мы обслуживаем только живых людей." END END IF IF age<7 AND age>0 THEN PRINT "Простите, но мы не обслуживаем грудных детей." END END IF IF age>80 THEN PRINT "Простите, но Вы слишком стары для этого." END END IF 3: IF age<=16 THEN category=1 ELSE IF age>=17 AND age<=23 THEN category=2 ELSE IF age>=24 AND <=32 THEN category=3 ELSE IF age>=33 AND <=50 THEN category=4 ELSE IF age>50 THEN category=5 END IF END IF END IF END IF 4: IF category=1 THEN PRINT "I" IF category=2 THEN PRINT "II" IF category=3 THEN PRINT "III" IF category=4 THEN PRINT "IV" IF category=5 THEN PRINT "V" END Не правда ли возникает ощущение, что можно написать по красивее (проще)? Это был дословный перевод, но такие переводы, как известно, не лучшие (читали ли вы художествееные книги переведенные дословно? IF so THEN я вам сочувствую). Дословный перевод не учитывает особенностей языка. Да. Но особенно мне не нравится третий пункт нашей программы, где мы определяем категорию. Можно было бы обойтись здесь и без ELSE (сделав на манер четвертго пункта), но я хотел вам рассказать еще об одном ключевом слове, используемом в условных конструкциях. Это ELSEIF. У нас сейчас используются ELSE и IF по отдельности, но их можно объединить и это сильно упростит запись. Смотрите:
3: IF age<=16 THEN category=1 ELSEIF age>=17 AND age<=23 THEN category=2 ELSEIF age>=24 AND <=32 THEN category=3 ELSEIF age>=33 AND <=50 THEN category=4 ELSEIF age>50 THEN category=5 END IF Видите, уровень вложенности операторов IF уменьшился, точнее теперь формально все это один оператор и никакой вложенности вообще нет. Вы задавались вопросом, почему, казалось бы, одинаковые программы выполняют свою работу по-разному, занимают различный объем оперативной и внешней памяти и т.д.? Потому что одно и то же действие можно выполнить разными способами: оптимальным и не оптимальными. Например, кусок нашей программы. Он будет работать одинаково (с точки зрения пользователя) в любом случае, но будет отличаться время работы, опять же, объем памяти. Поэтому программы обычно стремятся оптимизировать (раньще стремились больше, чем сейчас: нередко оптимизация не оправдана с экономической точки зрения, ведь на разработку программ тратятся деньги). Попробуем что-нибудь придумать с нашим третьим пунктом. Например, зачем во втором условии проверять, больше ли возраст 17? Если бы он был меньше, то программа бы не дошла до этого условия (потому что выполнилось бы первое). Аналогичная ситуация и с другими условиями. И еще ... меньше или равно 16 это, ведь, тоже самое, что и меньше 17, правда? Зачем выполнять лишнее действие (проверку на равенство) и писать лишний значок? Перепишем:
3: IF age<17 THEN category=1 ELSE IF age<24 THEN category=2 ELSE IF age< 33 THEN category=3 ELSE IF <51 THEN category=4 ELSE category=5 END IF О! Так получше будет. Но ... Но. Если мы анализируем одну и ту же переменную относительно разных значений (как в нашем примере), то мы, по сути, осуществляем множественный выбор, т.е. выбор из множества значений. Относительно недавно (кажется, в конце восьмидесятых) в Бейсик была добавлена конструкция типа "множественный выбор", раньше программисты использовали кучу IFов, и завидовали приверженцам Паскаля и Си :-). Эта конструкция называется SELECT CASE. Поговорим о словах. Select означает "выбрать", CASE - кейс :){Данный термин употребляется в медицинской литературе (я встречал его в книгах по психологии), обозначая историю болезни и т.п. данного пациента. А наши переводчики так его и переводят - кейс.} На самом деле CASE означает "случай" (данный конкретный), но в широком смысле, т.е. сюда попадает и история болезни и судебное дело, когда речь идет имеено об истории и деле, а не о тех бумажках и папках, томах и сейфах, где все это записано и хранится. Оформляется конструкция следующим образом:
SELECT CASE проверяемое выражение CASE список значений операторы ... [CASE список значений] операторы] [CASE ELSE операторы] END SELECT На русском (пусть немного неудобоваримо) это могло бы звучать так:
ВЫБРАТЬ подходящий СЛУЧАЙ для проверяемого выражения: В СЛУЧАЕ если проверяемое выражение равно какому-либо элементу списка значений, выполнить операторы ... В ПРОТИВНОМ СЛУЧАЕ (ИНАЧЕ) выполнить опраторы Принцип работы, возможно, понятен из русского перевода, но я все же поясню. Проверяемое выражение это, грубо говоря, та переменная, которую нам нужно проанализировать (в нашем примере, age). Хотя слово "выражение" подразумевает именно выражение (переменные, константы и функции, объединенные знаками операций), но обычно анализируется именно переменная. Список значений это отделенные друг от друга запятой значения и множества значений, допустимые для данного кейса :). Если это значения, то это значения - константы (числовые либо строковые), если это множество, то здесь, как говорится, может быть два варианта. Если множество ограничено (имеет минимум и максимум), то оно записывается в виде: min TO max. Например, 2 TO 14, что значит от двух до четырнадцати. Или "A" TO "Z", что значит прописные английские буквы. Неограниченное множество (реально оно конечно ограничено) записывается в виде: IS операция_отношения значение. Например, IS >80, что значит больше 80 {IS это английский глагол "быть" в третьем лице и настоящем времени, т.е. "есть"). Чтобы вам стало понятно, как это РЕАЛЬНО работает, перепишем наш пример с использованием кейсов (кстати, многие, наверное, думали, что кейс это чемодан(чик). CASE имеет два значения:1)вышеупомянутый "случай"; 2)чемоданы, шкафы и прочие сундуки).
1: INPUT "Ваш возраст :", age 2: IF age<0 OR age>120 THEN PRINT "Простите, но мы обслуживаем только живых людей." END END IF SELECT CASE age CASE IS<7 PRINT "Простите, но мы не обслуживаем грудных детей." END CASE IS>80 PRINT "Простите, но Вы слишком стары для этого." END END SELECT 3: SELECT CASE age CASE IS<17 category=1 CASE 17 TO 23 category=2 CASE 24 TO 32 category=3 CASE 33 TO 50 category=4 CASE ELSE category=5 END SELECT 4: SELECT CASE category CASE 1 PRINT "I" CASE 2 PRINT "II" CASE 3 PRINT "III" CASE 4 PRINT "IV" CASE 5 PRINT "V" END SELECT END Проверяемое выражение сравнивается с элементами списков значений (списки просматриваются по порядку, т.е. сверху вниз) на предмет равенства или принадлежности к множеству. Если нужный кейс будет найден, то выполнится соответствующая группа операторов (у нас в примере везде стоит по одному оператору, но допустимо туда вставлять хоть целые программы, хотя и не стоит этого делать, а если очень надо, то... продолжайте оставаться с нами :). Если нужный кейс не будет найден, компьютер выполнит операторы стоящие после CASE ELSE. Если CASE ELSE нет, ничего выполнено не будет и управление перейдет к следующему за SELECT оператору. Прошу заметить (особенно тех, кто знает Си), что выполняются только операторы одного кейса. В Си (там подобная конструкция называется SWITCH) выполняется найденный кейс и все последующие(!). Чтобы выполнялся только один, программисты на Си используют искусственное прерывание выполения конструкции множественного выбора (ставят в нужном месте break). Чтобы у Вас не создалось ложное впечатление, скажу, что сишная конструкция более гибкая (это значит, что она лучше). Поразмыслите на досуге почему это так, вам будет полезно это сделать. И не беда что вы не все знаете Си. Того, что я уже рассказал будет достаточно. На этом, пожалуй, и закончим сегодня. Посмотрите help в Q Бейсике. Вас должны интересовать операторы IF и SELECT CASE, особенно последний - там приведен забавный пример, и помните - улыбка вам идет :-).
On-line library Недавно в рассылке была указана on-line библиотека, я хочу предложить еще одну действительно стоящую - www.rusdoc.ru. Спасибо за внимание... -=4F Наш вездеход вперед летит Идея обучать приемам программирования через игрушки с собственным языком очень неплоха (речь идет о программе ALGO). Но по-моему есть гораздо более удачная реализация идеи: http://attend.to/robots - идея такова: на простом до невозможности языке программирования создается AI (ДА! ДА!) робота, оснащенного пушками и глазами. Действуя по заданной программе, робот сражается с другими роботами - как правило, побеждает робот с наиболее совершенным алгоритмом. На сайте можно скачать "визуализатор" сражений, компилятор языка и.т.д. Язык настолько прост, что в течение часа с начала ознакомления с языком я создал вполне боеспособного робота. Trigger
Пришла пора выдавать вам второе домашнее задание. Его код - basic/2. Пожалуйста, не забывайте об этом, тем более что теперь домашних заданий уже 2, и правильно указывайте код задания в теле письма. Задача 1 Имеется суперсекретная дверь с тремя замками. Ключами от замков обладают три человека (каждый одним ключом). Дверь открывается только тогда, когда любые два человека (а не три) открывают свои замки. Напишите условие открывания двери, используя логические функции. Задача 2 Реализуйте конструкцию DO [WHILE,UNTIL] ... LOOP [WHILE,UNTIL], используя IF и GOTO. Задача 3 Реализуйте конструкцию FOR ... NEXT, используя IF и GOTO. Задача 4 Реализуйте конструкцию CASE, используя IF и GOTO. Задача 5 Напишите программу, которая бы подсчитывала число нажатых клавиш и выдавала результат в виде таблицы:
Цифр : столько-то Прописных букв : столько-то Cтрочных букв : столько-то --------------------------- Итого : столько-то Задача 6 Напишите программу проверки знаний типа "тест". Задайте пользователю 3-4 вопроса (на одну тему) и предложите несколько вариантов ответа, один из которых будет правильным. Результаты ответов оцените по 10 бальной шкале и поставьте окончательную оценку, основываясь на следующих данных:
балл | оценка -------+-------- 0-5 | 2 6 | 3 7 | 3,5 8 | 4 9 | 4,5 10 | 5 ----------------
Желаю удачи и ... до следующего выпуска! =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
|
http://subscribe.ru/
E-mail: ask@subscribe.ru |
|
В избранное | ||