Вы можете найти рассылки сходной тематики в Каталоге рассылок.
Программирование для начинающихВыпуск 17
Ведущий рассылки: Вячеслав Мацнев | e-mail: stac@stacmv.net |
|
В этом выпуске читайте: |
Поздравляю вас с майскими праздниками!
Недавно я получил письмо.
Привет Слава! С уважением, Atom00 Я даже не знаю что сказать. Все сказано в письме. Вот оно подтверждение того, что я не напрасно создал рассылку и что она достигает поставленной цели - помочь начать, заставить качать, хватать инфу, получать плоды. Молодец, Atom00! Порадовал ты меня. Слова словами, а ты взял и сделал. Народ, посмотрите на плоды старания вашего товарища. Посмотрите и сделайте также. А, если можете, сделайте ... по-другому. Долго не ждите, тем более, что со мной у вас все равно никакого терпния не хватит.
Для начала вспомним кое-что из теории. Циклы бывают с известным заранее числом повторений (например, цикл FOR в Бейсике и Паскале) и с не известным заранее. В пятнадцатом выпуске мы рассмотрели цикл FOR, там же было отмечено, что значит "известно заранее". Сегодня, вкратце (так как, это вы уже знаете), мы рассмотрим цикл DO..LOOP. Это цикл с неизвестным заранее числом повторений, т.е. завершение или продолжение такого цикла зависит от процессов происходящих во время выполнения программы. К таким процессам можно отнести изменения значений различных переменных, нажатие пользователем клавиш клавиатуры и т.п. Условие продолжение или завершения цикла может быть как в начале, так и в конце цикла. Это, так называемые, цикл с предусловием и цикл с постусловием. Общий вид записи оператора DO..LOOP:
с предусловием с пост условием Условие это логическое выражение (простое или сложное). Слова WHILE и UNTIL означают ПОКА и ПОКА НЕ, соответственно. Нужно использовать только одно из этих слов. На это указывает прямая вертикальная черта в записи общего вида. "ПОКА" означает, что цикл будет выполняться, пока условие верно (истинно). "ПОКА НЕ" означает, что цикл выполняется пока условие не станет верным (истинным). Какой цикл выбрать с пред или с пост условием зависит от многих факторов, но в основном от того, чего вы хотите добиться. Про один из фактором я расскажу. Если в ваше условие входит переменная, которая меняется как в цикле, так и за его пределами (до цикла), то к выбору формы записи следует относиться очень внимательно.
Рассмотрим это дело на примере. Представьте, что где-то в программе у нас был ввод символов, так что переменной с именем ch$ еще до цикла было присвоено какое-то значение, отличное от пустой строки(""). Теперь мы хотим организовать еще один ввод символов, например одного предложения. Это можно сделать так:
.... sentence$="" DO UNTIL ch$="." OR ch$="!" OR ch$="?" REM ".","!","?" - символы конца предложения. ch$=INKEY$ sentence$=sentence$+ch$ LOOP Все ок, не так ли? Не так. Программные единицы (в данном случае просто куски кода) должны всегда рассматриваться в контексте взаимодействия с другим программными единицами. Вспомните, мы договорились, что переменная ch$ до цикла имеет какое-то значение. Причем, какое именно это значение мы не знаем, так как оно зависит от ввода пользователя. Теперь представьте, что последним введенным символом до цикла является точка ".". Йо-у! Первая же проверка условия завершения цикла покажет, что цикл пора завершать. А он еще даже не начинался!!! Т.е. пользователю просто не будет предоставлена возможность ввести предложение! Переменная sentence$ будет равна пустой строке, а к чему это приведет в дальнейшем (в смысле, к каким ошибкам), никому не известно. Можно в данном случае использовать цикл с постусловием:
.... sentence$="" DO REM ".","!","?" - символы конца предложения. ch$=INKEY$ sentence$=sentence$+ch$ LOOP UNTIL ch$="." OR ch$="!" OR ch$="?" Бывают и обратные ситуации, когда, в зависимости от предыдущего ввода, нужно разрешить, запретить или как-то управлять выполнением цикла. В ряде случаев может помочь оператор IF, но иногда нужно использовать цикл с предусловием. Пример. Программа ждет ввода от пользователя, а пока он ничего не ввел занимается "своими делами", в хранителя экрана играет или еще что-нибудь, вычисления какие-то производит и т.п.
DO ch$=INKEY$ Здесь удобно использовать цикл с предусловием. Если пользователь уже нажал клавишу, то "серьезная работа" даже не начнется. В противном случае (если бы цикл был с постусловием) пользователю пришлось бы ждать какое-то время, пока нажатую клавишу не словит второй INKEY$. В вашей практике будут встречаться и другие случаи, когда место проверки условия завершения цикла существенно. Мы же пока закончим разговор о циклах. Вернемся к нему, если у кого-нибудь возникнут вопросы или проблемы.
Спираль вашего развития как программистов возвращает нас к разговору о переменных. Все переменные перед их использованием должны быть объявлены или, как еще говорят, декларированы. Объявление может быть явным (только такое допустимо в Паскале и Си) и неявным (допустимо в Бейсике и некоторых других языках). Явно переменные объявляются с помощью специальных операторов, неявно - при первом использовании переменной (подробно этот механизм уже обсуждался ранее). Объявление переменной заключается в указании транслятору имени переменной и ее типа. Посредством имени эта переменная будет доступна в программе, т.е. имя переменной это как бы ссылка на нее. Помните, я философствовал насчет объектов и их отображений. Так вот, имя переменной это ее отображение. Реально переменная это область памяти, имеющая соответствующие начальный и конечный адрес. В программу же на языке программирования (типа Бейсика) переменная отображается в виде своего имени. Это имя существует в исходном тексте программы и не существует в откомпилированной программе, в exe-файле. Тип переменной говорит транслятору (и программисту) о размере переменной, т.е. сколько байт она будет занимать в памяти. У начинающих иногда возникает вопрос, зачем это транслятору нужно знать размер переменной? Дело в том, что в программе обычно бывает очень много переменных, и все они должны быть размещены в памяти. По возможности компактно. Потому что это, в частности, определяет объем свободной памяти, необходимый для запуска программы. И чтобы разместить очередную переменную, транслятор должен знать, где заканчивается область памяти, отведенная под предыдущую. Основные типы, используемые в Бейсике, вы уже знаете. Также вы знаете о существовании специальных суффиксов имен переменных, которые определяют их тип. Это, например, %,$,& и другие. Но сопоставление переменной какому-то типу можно производить и не пользуясь суффиксами. Например, можно иметь в программе переменную sentence (это "предложение" по-английски) строкового типа (типа STRING), несмотря на отсутствие суффикса $. Для этого переменную нужно объявить явно. Эту функцию выполняет оператор DIM (от dimension - "размер"). Формат записи оператора DIM следующий: DIM имя переменной AS тип [,имя переменной AS тип,...] Одним оператором можно объявить несколько переменных. Если у имени переменной есть специальный суффикс, то тип указывать не надо. Примеры:
DIM slovo AS STRING DIM i AS INTEGER, j AS LONG DIM ch$ DIM bignum AS DOUBLE Полагаю, примеры не требуют пояснений. Явные объявления переменных не обязательны, но я, наоборот, настоятельно рекомендую вам их использовать. Привыкайте. Кроме единичного объявления можно одним оператором объявить целое множество переменных. Для этого служит набор команд DEF"тип": DEFINT, DEFLNG, DEFSNG, DEFDBL и DEFSTR. После соответствующего ключевого слова должны стоять диапазоны (или один диапазон) символов. Переменным, чьи имена начинаются с символов, входящих в тот или иной диапазон будет сопоставлен тот или иной тип. Пример,
DEFINT i-n DEFDBL d-f DEFSTR s-t В этом случае, переменные i, jack, lenta, number будут целого типа (INTEGER), переменные errnum, datasize, f будут иметь тип DOUBLE (число с плавающей точкой двойной точности), а переменные sim, symbol, tapename будут иметь строковой тип (STRING). Однако специальные суффиксы имеют большую силу, поэтому переменные ch$, filenumber%, tag& будут иметь тип в соответствии с суффиксом (STRING, INTEGER и LONG соответственно). Кстати, аналогов DEF"тип" в других языках я что-то не припомню... м-да, старею... Пока все с переменными, можете применять полученные знания на практике. В следующий раз мы обсудим что такое видимость переменных, сфера их действия и время жизни.
Интересно, сколько подписчиков, желавших изучать Си++, в действительности делают это? А может, кто-нибудь желает до сих пор? Тогда скачайте архив этой рассылки или даже подпишитесь на нее.
Коллеги, мы с вами уже (немного) умеем программировать ... кажется :)
Ну ... =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
|
http://subscribe.ru/
E-mail: ask@subscribe.ru |
В избранное | ||