Рассылка закрыта
Вы можете найти рассылки сходной тематики в Каталоге рассылок.
← Апрель 2001 → | ||||||
1
|
||||||
---|---|---|---|---|---|---|
2
|
3
|
4
|
5
|
7
|
8
|
|
9
|
10
|
11
|
12
|
13
|
14
|
15
|
16
|
18
|
19
|
20
|
21
|
22
|
|
23
|
24
|
25
|
26
|
27
|
28
|
29
|
30
|
Статистика
за неделю
Программирование для начинающих Выпуск 15
Программирование для начинающихВыпуск 15
Ведущий рассылки: Вячеслав Мацнев | e-mail: stac@stacmv.net |
|
В этом выпуске читайте: |
Представляю Вашему вниманию пилотный выпуск рассылки "Программирование для начинающих". Именно этими словами начинался самый первый выпуск рассылки, написанный мной ровно год назад, 28 марта 2000 года. И пусть вас не смущает тот факт, что он вышел лишь 16 мая. Тормозил наш проект, как видите, изначально :) Несмотря на столь грандиозное событие, повода для праздника я не вижу, но призываю вас подумать в письменном виде на тему "что дал мне прошедший год, какие были успехи и неудачи". Т.е. что этот год дал вам, а не мне, конечно. К 16 мая я все-таки обновлю сайт, и нужно будет что-то, что покажет и расскажет новым подписчикам о том, за чем мы с вами просиживаем штаны и юбки. Год назад я говорил на эту тему в пилотном выпуске. Теперь было бы очень хорошо, если скажете вы. В идеале мы можем провести своеобразный SWOT-анализ рассылки, отметив ее сильные(S) и слабые(W) стороны, а также возможности(O) и угрозы(T). Приглашаются все желающие. Другими словами, я объявляю подготовку к "юбилею". Другой ведущий бы на моем месте сам все сделал, но я в этом отношении (как и в других) нетрадиционен и предлагаю решить вопросы "юбилея" небольшим коллективом желающих. В какой-то степени это может считаться вашей стажировкой. Тем более, что возникла очередная проблема (Эй, кто там строит козни?:) и процесс обучения будет немного форсирован (если мне удастся это проделать без жертв :). Речь идет вот о чем. В марте мне начали приходить испорченные письма, в которых вместо русских букв стоят знаки вопроса. Расшифровать такое письмо невозможно (так как знаки вопроса все одинаковые, с одним кодом). А к середине месяца число таких писем достигло половины от общей массы приходящих мне писем. Я прошу прощения у всех, кто написал мне и получил в ответ свое же письмо с глупой фразой, что я не могу чего-то там прочесть. Пожалуйста, дублируйте текст своего письма в латиннице (это временно, надеюсь). В связи с этим я захотел попросить вас писать в транслите. Но транслит, он вообще-то напрягает, гораздо удобнее писать и читать по-русски. Поэтому, время от времени, на рынке программного обеспечения появляются программы, переводящие текст с русского в транслит и обратно. Но, как есть несколько кодировок, так есть и несколько вариантов транслитерации. Например, буква "ц" иногда пишется "ts", иногда "c", подобная ситуация складывается и с другими буквами, не имеющими фонетических аналогов в английском алфавите. В нашем случае (ну, если вы будете слать мне письма в транслите) это безобразие не годится. Поэтому разумно нам написать свою программку-кодер-декодер. Почему мы не можем использовать уже написанные программы? Во-первых, их много и никто не заставит вас выбросить любимую программу и пользоваться другой (а щаставить меня это сделать вдвое сложнее), во-вторых, я сомневаюсь, что какая-нибудь из имеющихся программ знает о существовании Бейсика. Здесь, ведь, вот, какое дело. Есть такие вещи, как операторы языка Бейсик, и нам не нужно, чтобы они при декодировании превращались в ПРИНТ, ИФ, ЛОЦАТЕ и т.п. Поэтому с сегодняшнего дня мы начинаем думать о том, как написать нужную программу и усиленно впитывать необходимые для этого знания с каждым выпуском рассылки и других источников информации.
В прошлый раз, в рубрике ТЕОРИЯ мы вкратце обсудили с вами теоретические аспекты циклических процессов на примере свидания двух молодых людей. Сейчас вы узнаете, как циклы можно применять в компьютерных программах. Начнем с цикла FOR (напомню для тех, кто только что пришел, что в общем-то с циклами мы уже знакомы, а сейчас систематизируем полученную ранее информацию). Оформляется конструкция цикла следующим образом:
FOR переменная=выражение1 TO выражение2 [STEP шаг] [тело цикла (операторы)] NEXT переменная Тело цикла стоит в квадратных скобках, это говорит, что тело цикла может отсутствовать (как и шаг, впрочем, но об этом ниже), в этом случае цикл будет пустым. Примеры записи оператора FOR:
FOR i=2 TO 100 STEP 3 IF (i\2)=(i/2) THEN PRINT i NEXT i Программа просмотрит все числа от 2 до 100 с шагом 3 и напечатает те из них, которые делятся на 2 без остатка.
FOR oo=9 to 1 STEP -1 LOCATE 50,12:PRINT oo NEXT oo Программа напечатает в позиции 50,12 (50-й столбец, 12-ая строка) числа от 9 до 1. Впрочем, вы врядли это заметите :). Оператор FOR применяется, когда нужно повторить какой-то кусок программы несколько раз, и когда число повторений известно заранее. Вы можете спросить, что значит "заранее". За неделю? За месяц? В приведенных примерах число повторений указано явно (числами) и оно известно на стадии написания программы. Даже если вы не можете сразу сказать сколько же чисел от 2 до 100 с шагом 3, вы в принципе можете посчитать (Лучше пусть считает компьютер, добавьте строку LET count=0 перед циклом, в цикле (строкой выше или ниже IF'а запишите LET count=count+1, а после цикла напишите PRINT "Count=";count). Но начальное, конечное значение переменной цикла (параметра цикла) и шаг не обязаны быть константами. Они могут представлять собой переменные и выражения:
INPUT num FOR i=1 TO num+1 PRINT i-1 NEXT i Программка напечатает все числа от нуля и до введенного num с шагом 1 (при этом слово STEP писать не обязательно). Если же num будет равен нулю или будет отрицательным, то цикл не будет выполнен ни разу. Таким образом, мы имеем возможность управлять выполнением программы, содержащей FOR циклы. Причем управление можно осуществлять как извне цикла, так из изнутри его. Как обычно, пара бессмысленных примеров: Пример внешнего управления:
INPUT "Ключевое слово",a$ SELECT CASE a$ CASE "Mike" num=100 CASE "Don" num=50 CASE ELSE num=0 END SELECT FOR i=0 TO num PRINT i NEXT i Пример, внутреннего управления:
FOR i=1 to 10000 ch$=INKEY$ if ch$="b" THEN i=i-1000 if ch$="f" THEN i=i+1000 NEXT i При внутреннем управлении мы воздействуем на параметр цикла, то уменьшая его и продлевая, тем самым "жизнь" цикла, то увеличивая его. Если после очередного увеличения параметра цикла его значение превысит 10000 цикл прекратится. Сразу скажу, что подобные проделывать обычно не рекомендуется и о подобных вещах мало где рассказывают (разве что при изучении системного программирования). Считается, что манипуляции с параметром цикла способны запутать программу (текст программы), что, в свою очередь, может увеличить вероятность возникновения в этом месте ошибок и усложнить их исправление. Мое мнение такое: если ваш цикл свободно помешается на экране (т.е. не большой) то можете его мучить как угодно, в противном случае подумайте дважды, как обойтись без этого. Иногда бывает нужно внезапно выйти из цикла (вы печатаете числа от нуля до 10000000000 и пользователю надоело ждать, когда это прекратится). Чтобы не подстрекать вас к прямому изменению параметра цикла или, не дай Бог, выходить из цикла по GOTO, разработчики Бейсика добавили в язык несколько операторов, одним из которых является EXIT FOR. Из этого цикла можно легко выйти, нажав ESC:
FOR i=0 to 10000 PRINT i ch$=INKEY$ IF ch$=CHR$(27) THEN EXIT FOR NEXT i Вообще, цикл FOR наиболее часто используется при обработке массивов. Так как, официально мы еще не знаем, что это такое (кто знает - молчите :), то обсуждать массивы сейчас не будем. Уверен, когда вы об этом узнаете, будете долго бить кулаками по волосатой груди и по-детски радоваться. При этом, пожалуйста, не перестарайтесь, особенно, если грудь не ваша. Почему именно вы будете радоваться я тоже не скажу, сами поймете (с первого раза получится не у всех). Еще можно применять FOR и во многих других случаях. В 9-ом выпуске я приводил пример с рисованием рамочки. К такого типа задачам также относится, например, заполнение экрана одним каким-то символом. Можно заполнять даже и не весь экран. Все вы знаете такой оператор как CLS, который очищает экран. Его эквивалент, написанный с применением цикла FOR мог бы быть таким:
REM -=CLS=- FOR i = 1 TO 25 FOR j = 1 TO 79 LOCATE i, j: PRINT " " NEXT j NEXT i LOCATE 1,1 Теперь рассмотрим случаи частичного очищения экрана. Можно модернизировать наш CLS так, чтобы вместо пробела экран заполнялся другим символом, например, точкой. Или можно очистить лишь часть экрана (окно), просто изменив начальные и конечные значения циклов. Смотрите:
REM Программа 15.1 FOR i = 1 TO 25 FOR j = 1 TO 79 LOCATE i, j: PRINT "."; NEXT j NEXT i FOR i = 6 TO 18 FOR j = 19 TO 58 LOCATE i, j: PRINT " "; NEXT j NEXT i Обратите внимание на точку с запятой, после PRINT'а. Она запрещает перевод строки после печати. Уберите ее и посмотрите, что будет. Теперь поставьте ее обратно :). Разберите (изучите, проанализируйте) самостоятельно следующую программу:
REM Программа 15.2 x = 10: y = 25 h = 6: w = 32 FOR i = 1 TO 25 FOR j = 1 TO 79 LOCATE i, j: PRINT "."; NEXT j NEXT i FOR i = 79 TO 79 - w STEP -1 FOR j = x TO x + h LOCATE j, i: PRINT " "; NEXT j REM SLEEP NEXT i FOR i = 0 TO (79 - w) - y FOR j = 0 TO h LOCATE x + j, (79 - w) - i PRINT " "; LOCATE x + j, 79 - i PRINT "."; NEXT j REM SLEEP NEXT i Если программа на вашем компьютере выполняется слишком быстро (а так и будет), раскомментируйте (уберите слово REM) строчки со SLEEP, а при выполнении программы нажимайте любую клавишу (например, CTRL). В этом случае, правда, все будет наоборот тормозить (пропорционально вам :). Посмотрите HELP на предмет SLEEP. Подумайте, как можно написать программу, которая бы очищала экран, заполненный точками, от центра к краям. И напишите ее, если сможете. А где еще можно применить частичную очистку экрана? Да практически везде, где приходится работать с неквалифицированным пользователем, а сюда входят все случаи, кроме написания программы для себя. Вспомните программу 9.3 (первое число (9) соответствует номеру выпуска рассылки, где программа была впервые опубликована). В случае ввода пользователем неправильных значений, печаталось сообщение о его ошибке и повторялся запрос данных. При этом (такие ситуации могут возникать в любой программе) нужно перед повторным вводом стирать с экрана то, что осталось от предыдущего ввода, в том числе и сообщение об ошибке. В примитивных программах можно ограничиться очисткой всего экрана посредством CLS, но в серьезных программах это делать нельзя. Представьте, что Ваша программа уже нарисовала кучу окошек, вывела в них какую-то информацию. И что теперь все стирать , а потом заново перерисовывать? Да, если вы собираетесь выставлять программу на конкурсе "Тормоз-2001". В противном случае нужно очищать только нужную область экрана и только ее, при необходимости перерисовывать. Очистить произвольную область экрана можно с помощью двойного цикла, аналогичного циклам программы 15.1. Причем, настолько аналогичного, что единственным отличием будут лишь координаты очищаемой области (начальные и конечные значения параметров циклов). Таким образом, в любом месте, где требуется очистка прямоугольной области экрана нужно вставить соответствующим образом настроенный (с правильными координатами) двойной цикл. Шутка. Шу-утка-а-а! Шутка! Шутка! Я шучу. Если бы так, действительно, требовалось поступать, то компьютеры сейчас не были так распространены, а работа программистов была бы тяжелее и опасней работы шахтеров. Если требуется повторить какие-то действия, пусть отличающиеся, но имеющие много общего (такие, например, как очистка области экрана, рисование произвольной рамки, организация паузы и пр.), используются так называемые подпрограммы. Подпрограммы - тема наших ближайших выпусков и предмет вашей головной боли ближайшие 2-3 месяца. насчет головной боли, это тоже шутка, хотя и с долей правды (как вы любите :). В принципе работать с оператором FOR довольно просто. Мы еще встретимся с ним, когда будем изучать массивы, а пока, пожалуй, хватит.
Здравствуйте.
... Думаю, Бейсик не такой уж и древний и никому не нужный язык. Сейчас пытаюсь осваивать Дельфи, Си++ и т.п., но когда мне нужно быстро сделать какой-либо график, типа синусоиды, экспоненты, и т.п. и вставить его в Word, предпочитаю сделать это в Бейсике. Очень просто и быстро. В Паскале для перевода в графический режим надо кучу команд набить, а тут - один screen, и всё. Конечно, сложные программы лучше делать в чем-то современном, но навыки программирования, основы необходимо получать всё-таки, считаю, в простейших языках - Паскале, Бейсике. Когда делал диплом, мне необходимо было составить программу. Встал вопрос о языке программирования, выбирать было не из чего - Паскаль или ... Паскаль, т.к. комп предполагался 386, а на Бейсике такую программу просто невозможно сделать (хотя что-то слышал о том, что типа, в Бейсике можно мышку заставить работать, но не нашёл). Хотел в Дельфи всё сделать, но для них нужен минимум 486 и винда, а на той трёшке винды не было. Потом, правда, выяснилось, что тройка не подходит и мне выделили пентиум, но было уже поздно, программа была практически готова. Начал изучать ООП в Турбо Паскале. И я даже не жалею, что составлял тогда программу в Паскале, т.к. я писал всё с нуля - меню, окошки, кнопочки, progress-bar'ы и т.п. ерунду и все это как в win95 - типа, круто, да и красиво. Получившейся прогой до сих пор горжусь. Теперь я знаю, как нужно нарисовать окно, чтобы оно было "выпуклым", объёмным, что надо сделать, чтобы кнопочка на экране была нажата/отжата. Попутно возникла необходимость работы с wav-файлами. При программировании в виндовых приложениях ведь не надо знать формата хранения данных в звуковых, видео и других файлах, там всё встроено, указываешь, что тут должен быть звук из такого-то файла, а тут - рисунок, а под ДОСом нет практически ничего. Можно открыть файл, прочитать любое место оттуда, но что это за файл, ДОС тебе не скажет, сам думай. Сам всё ищи, проверяй. Нашел описание riff-заголовка wav-файла на английском. Перевел.
Ладно, заболтался я (а может, записался?), письмо очень длинное
получилось. Если кратко, то считаю так: Бейсик с Паскалем следует
изучать. Для усвоения основ программирования. После их изучения можно
приниматься за более мощные языки. Да, чуть не забыл, почти нет никаких книг по программированию компьютерной графики. Вернее есть, но не то. Или рассказывается о фотошопе, о кореле и др., что по идее не может считаться программированием. Или рассказывается о программировании на Си++ под виндой с установленными драйверами DirectX. А это не то. Ладно, нашёл в своё время книгу по программированию компьютерной графики для старшеклассников, между прочим, в Бейсике! Но там сравнительно мало, только основы, да и оформление текста книги оставляет желать лучшего. Ну и на том спасибо. С уважением, Егор
Тема 10-ого за этот год номера еженедельника "Компьютерра" называется "Дон". Признаюсь честно, название темы ничего мне не сказало, когда я купил журнал. Я был занят и журнал пролежал добрые две недели, прежде чем я за него взялся. Оказалось, что "Дон" это Дональд Кнут (знал бы - прочитал в первый же день), очень известный в компьютерном мире (особенно в программистской его области) человек, автор серии книг "Искусство программирования" и многих других. Думаю для вас не будет большим секретом сообщение о том, что первые три тома (планируется семь, но остальные еще не написаны) "Искусства программирования" были недавно переизданы на русском языке. Так вот, об этом выдающемся человеке и рассказывается в выпуске "Компьютерры" от 13 марта 2001 (#10[387]). Рассказывается очень интересно, но ... мало :)
А в 16 выпуске рассылки "Программирование для начинающих" будет рассказано о шестнадцатеричной системе счисления.
Тогда и встретимся. До свидания, уважаемые подписчики!
|
http://subscribe.ru/
E-mail: ask@subscribe.ru |
В избранное | ||