Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Программирование для начинающих Выпуск 9


Служба Рассылок Subscribe.Ru проекта Citycat.Ru

Программирование для начинающих

Выпуск 9

31 OCT 2000

 
 
 
Ведущий рассылки: Вячеслав Мацнев
e-mail: stac@stacmv.net
Еще раз добрый день, уважаемые пассажиры! Вашему вниманию хочу предложить свежий выпуск рассылки "Программирование для начинающих"

В этом выпуске читайте:

ОТСЕБЯТИНА

Вчера я стал обрабатывать вашу регистрационную информацию (ники2 вы мне слали, помните?). И подумал, а почему бы у вас не спросить еще какие-нибудь другие сведения?

Теперь внимание! Начинающие программисты, следите за ходом моей мысли. Никто вам этого рассказывать не будет, только я из-за специфики нашей рассылки.

Итак у меня есть 70 с чем-то писем с никами2 и другой информацией. Некоторые данные есть у всех, например, email и ник2, другие (имя, фамилия, страна, город и пр.) по секрету сообщили не все. Мне же, наоборот, хочется иметь все данные на всех. Причины этого пока оставим в стороне.

Итак мне нужно написать эти 70 ответов и попросить вас подтвердить информацию, которую вы уже сообщили и дать недостающие сведения. Причем, некоторые рассказали про себя много всего, другие указали только ник. Поэтому задача осложняется тем, что письмо для каждого адресата должно быть в некоторой степени уникально.

Надо сказать, что эту задачу можно решить лишь написанием соответствующей программы. Я думаю всем понятно, почему ручное написание писем не подходит? (Достаточно того, что я данные в БД вручную вводил :)

Я сейчас не буду говорить о написании программы, пока рановато зато, скажу о том, что предшествует кодингу, а конкретно, о постановке задачи.

Обычно программисту ставится какая-то задача и он ее решает, иногда программист сам ставит себе задачу. Это первый этап и он очень важен, т.е. от того как будет поставлена задача, зависит ее решение.

Я сегодня коснусь лишь случая, когда программист (каждый из вас) должен сформулировать задачу и затем написать программу. О других случаях (работа в коллективе, работа на заказ) пусть напишет кто-нибудь другой.

Итак, что мы имеем? Имеем базу данных (БД) частично заполненную данными, части данных не хватает. БД простая, состоит из одной таблицы. В качестве полей выступают, например, такие: имя, фамилия, ник, ник2, email и др. (что конкретно там есть, зарегистрированные подписчики узнают). Проделав определенные манипуляции (не буду говорить об их оправданности, у нас же учеба), мне удалось свести БД к текстовому файлу, где каждая запись расположена на своей строке, а поля разделены символом "звездочка"("*"). Пускай это и будет нашими начальными условиями. Приступим к постановке задачи.

Начнем с конца :-) Что надо получить в итоге? Получить надо письма. Ок. Сколько? 70. Ок. Какие? С постоянной (текстом приветствия, просьбой сообщить данные) и переменной частью. Переменная часть должна включать два раздела: 1) сообщение подписчику уже имеющихся о нем сведений, с просьбой подтвердить (вдруг вкралась ошибка?); 2) запрос недостающих сведений (тех, что еще нет в БД). Понятно, что для каждого подписчика эти два раздела будут отличаться, собственно, поэтому я и назвал эту часть письма переменной.

Примерно таким образом вы должны думать при решении своих задач. Всегда четко должны быть продуманы (или заданы) начальные условия и конечный результат. Причем, все это должно быть известно точно, включая все мелочи, а не, как я сейчас написал, в общих чертах.

Теперь, когда вы решили, что надо делать, пора подумать о том, как это делать и какие средства для этого понадобятся.

А понадобится нам среда разработки. Причем, обратите внимание, не важно какая! Когда подписчик получит письмо, скажите, для него будет иметь значение, на чем написана программа-генератор этого письма? Нет, ни малейшего. Нужно выбирать среду (и язык) из собственных каких-то соображений. Какими могут быть эти соображения? Например, какой-то язык вы хорошо знаете, вот и берите его. Или надо смотреть на возможности известных вам языков.

БД - это текстовый файл, письма тоже. Нужен язык, способный работать (читать и писать) с текстовыми файлами. Очевидно, что JavaScript не подходит. А, вот, другие (почти все) языки подойдут, например, Бейсик. Или лучше даже Perl.

Я говорил, что запись в БД представляет собой строку, где поля разделены "звездочкой", например:

ник2*имя*фамилия*ник*email*country*town
cats*Вячеслав*Мацнев*Stac*stac@stacmv.net*Россия*Трудовая

Как видите, чтобы работать с данными их надо из этой строки извлечь. Можно написать соответствующую функцию на любом языке, но некоторые языки уже имеют встроенные средства для работы с подобными строками, например, Perl или M. (Кстати, формат БД я выбрал такой специально, зная, что потом придется данные оттуда извлекать, а не только смотреть на них, и зная как конкретно я буду это делать.)

Следующий критерий выбора языка - возможность (техническая) его использования. На прошлой неделе я убил свой Linux, а под Windows Perl'а у меня сейчас нет. Круг сужается ... И т.д.

Ах, да! Совсем забыл про Си++ и ООП, как же я так, вот, болван. Обязательно учитывайте тот факт, нужна ли "объектная ориентация" для решения конкретной задачи и как ее применить. Если это сразу не очевидно, выкидывайте ООП на помойку. Если задача требует от нескольких часов до нескольких дней или меньше (в зависимости от Вашей квалификации) и задача, типа рассматриваемой нами сейчас, то врядли стоит тратить время на объекты. Часто это не оправдано еще и с экономической точки зрения. Как сказал Cooler107, "карандаш не обязательно затачивать топором" (смотри http://stacmv.nm.ru/isaidit_lang.html#mess9)

С другой стороны, если вы создаете большую программу, какую-то систему, которая будет работать не один день (а может и не один год) и не одном компьютере, пренебрегать возможностями ООП не стоит. Это для всех очевидно, я думаю.

Также для вас должно быть очевидно, что в рамках рассылки мы такими проектами заниматься не будем (не тот уровень ресурсов).

И последний критерий, который я лично вчера учитывал - необходимость для меня, опять же, лично писать программу на том или другом языке. Я мог бы написать ее на Бейсике, на Паскале, на Си, может на Фортране, но это не дало бы мне никакого нового опыта (этот критерий редко учитывается на работе, там важны другие, но при обучении он важен). Сейчас я изучаю скриптовый язык MHTML. Поэтому именно его я и выбрал для написания Генератора писем.

В свою очередь вам рекомендую использовать в период обучения Бейсик (или другой изучаемый язык), даже если вы знаете другие. Опять же смотрите, когда это оправдано, когда вы можете себе это позволить.

К слову, часть исходника, решающая задачу состоит из 147 строк (~50 из которых обеспечивают генерацию писем в латиннице, для некоторых подписчиков). Как по Вашему, много это или мало? (Конечно число строк можно уменьшить, пожертвовав удобством чтения и изменения программы.)

MHTML, это как раз та программа, с помощью которой я делаю выпуски рассылки (обе версии) и сайт. Поэтому не говорите мне, что на Delphi или на VC++ данная задача решается проще. У меня будет уже готов скелет программы, до того, как ваш VC++ загрузится :-).

Зарегистрированные подписчики. Теперь я говорю с Вами. Письма, о которых здесь написано, каждый из Вас получит, наверное, сегодня. Пожалуйста, простите программе возможные ошибки в написании Ваших имен или фамилий. В ответе укажите их по-русски, если не трудно. Пожалуйста, ответьте по всем пунктам "анкеты". Это не сложно. Я не спрашиваю вас о среднем доходе, числе детей до 18 лет и т.п. Ну, в общем, увидите.

Вот еще важный момент. Письма придут к Вам в кодировке Windows-1251. Но, думаю, это не вызовет проблем.

К этому выпуску выйдет дополнение. Там будут указаны все зарегистрированные ники2. Если Вашего там не будет, пришлите его мне.

И последнее, если хотите общаться, присылайте письма, для публикации на сайте. Или мне поставить туда гостевую книгу? Гостевая книга не удобна для тех, кто имеет только email, а страничку с письмами, например, http://stacmv.nm.ru/isaidit_lang.html, они скачать могут.

Идея форумов или email групп мне кажется сейчас не уместной. Посмотрите, хотя бы, форумы на www.ListSoft.ru, большинство из них имеет ноль сообщений.

По поводу сегодняшнего выпуска. У нас довольно много материала, поэтому читайте вдумчиво, разбирайтесь спокойно, торопиться не надо. Сроками я вас никакими не ограничиваю и т.п.

Кое-кто заметит, что изложенный сегодня материал не полон (сильно не полон). Это так, сегодня мы скачем по вершкам. Я хочу познакомить вас с разными понятиями, чтобы в дальнейшем ими оперировать. Во многих книгах, если читали, авторы, приводя на начальной стадии тот или иной пример, говорят, мол, не обращайте внимания пока на это, на то, мы это потом изучим и т.п. Я так не хочу. Каждый пример, который я привожу в рассылке должен быть вами проанализирован и понят целиком и сразу, без всяких "потом узнаете". Поэтому, если что-то не понимаете и сами разобраться не можете, незамедлительно пишите мне и спрашивайте. Тем более, вдруг я допущу ошибку и дам то, что вы, по логике, еще не должны знать.

Итак, каждой из упомянутых сегодня тем нужно посвятить целый выпуск. Но чтобы приводить не совсем примитивные примеры, мне нужно, чтобы вы уже обладали какими-то знаниями. Вот, я вам и даю то, что в дальнейшем буду использовать для объяснения более сложных вещей.

Надеюсь, ясно :-)

Продолжаем ...

БЕЙСИК

До сих пор мы с вами сталкивались с простыми (я их называю линейными, но настоящего названия не знаю) алгоритмами, в которых шаги (действия) выполнялись друг за другом по порядку. Начиная от рецепта пирога, которым меня, до сих пор, никто не угостил и заканчивая вашим последним домашним заданием. Не стоит забывать также и про ALGO, где робот выполняет программу строчка за строчкой, и ничто не может изменить этот порядок.

В реальной жизни такие алгоритмы применяются редко. Единственно, они очень распространены в производстве, где на станке должна быть получена деталь и всякие прибамбасы, вроде учета скорости ветра на улице и изменения плотности воздуха, как-то не уместны.

Безусловный переход

Но привычные нам программы без этих "прибамбасов" не обходятся. Простейшим из них является безусловный переход. В большинстве языков его реализует оператор GO TO ("ИДИ НА":). Вы, наверное, про него уже наслышаны. В свое время из-за использования этого оператора между программистами разыгрывались такие сражения, что битвы вебдизайнеров по поводу тегов физического форматирования выглядят на их фоне дружескими посиделками с применением сильнодействующих отравляющих ... напитков.

Это привело к тому, что в новых языках просто нет аналога оператору GOTO. Но поскольку, в Бейсике, Паскале, Си, командном языке ДОС он есть, мы обращаем на это внимание.

Как работает безусловный переход? Кроме оператора GOTO здесь задействован такой объект программы, как метка. Метка имеет имя и она располагается в каком-то месте программы (меток может быть сколько угодно). Оператор безусловного перехода записывается так:

GOTO имя_метки

И когда выполнение программы доходит до этого места, управление передается оператору, который следует сразу после метки.

Раньше в Бейсике в качестве меток использовались номера строк. Рассмотрим пример:

10 CLS
20 GOTO 40
30 INPUT chislo
40 PRINT "Chislo не было введено"

В этом примере строка 30 никогда не выполняется (проверьте сами).

Такое (как в примере) применение оператора GOTO выглядит довольно глупо, просто я пока не могу привести хороший пример (приведу его ниже).

Хотя сейчас GOTO практически не применяется (появились другие средства для выполнения его функций), в простых программах применение его, я считаю, оправдано и очень наглядно (я уверен, что со мной здесь согласятся знающие люди).

Сейчас пока я допускаю, что вы не просекли "фишку" этого хитрого оператора. Дело в том, что его лучше применять в совокупности с другими операторами, в частности с оператором ветвления или условным оператором.

Ветвление программы. Условный оператор. Операции сравнения.

Часто (практически всегда) программа должна выполнять определенные действия, в зависимости от каких-то условий. За примерами далеко ходить не надо. Удаляем какой-то файл. Программа спрашивает, действительно ли мы хотим удалить файл. В зависимости от нашего ответа она удаляет файл или оставляет его в покое. Другой пример, доступ к ресурсу, защищенному паролем. Вы вводите имя и пароль, программа сравнивает пароль с эталоном, и если пароль верный, то пускает вас куда-то и говорит вам GO TO в противном случае :-)

Как это все делается на практике? Есть такое понятие, как выражения. Выражения бывают арифметическими, про них мы уже говорили вкратце. А есть логические выражения (константы и переменные). Логические выражения могут иметь только два значения: ИСТИНА и ЛОЖЬ (1 и 0 ,а вы думали, что двоичная система нигде не применяется ?:-). Причем, в некоторых языках есть специальные логические константы и логический (он еще называется булевым, по имени человека, который все это придумал) тип данных. Например, в Паскале это константы true (истина, тру) и false (ложь, фолс). В Бейсике и Си специального типа нет, там ноль(0) считается ложью, а единица (1) или, вообще, любое положительное число считается истиной.

Я говорил, что выражения состоят их констант, переменных и операций. Для формирования логических выражений существуют два вида операций: логические и операции сравнения. Начнем с операций сравнения, а логические оставим на потом.

Операции сравнения знакомы вам со школы, это операции "равно", "меньше", "больше", "меньше или равно", "больше или равно", "не равно". Аргументами (операндами) для таких операций могут быть числа и иногда строки. Что интересно, в разных языках эти операции обозначаются по разному. Особенно отличается операция "не равно".

Фортран      .NE.
Бейсик       <>
Си           !=

В дальнейшем мы будем использовать нотацию Бейсика:

       Операция            обозначение
       --------            -----------
       равно                    =
       меньне                   <
       больше                   >
   меньше или равно             <=
   больше или равно             >=
      не равно                  <>

Семантика (значение) этих операций я полагаю, вам понятна.

Вернемся к выражениям, вот примеры:

      Выражение            значение
      ---------            --------
       24>15               истина
       6=45                ложь
       45<45               ложь
       45<=45              истина
       1<>9                истина
       "Basic"="Pascal"    ложь
       "АБВ"="АБВ"         истина

Что касается строк, то в основном к ним применяются операции "равно" и "не равно", поэтому другие мы сейчас не рассматриваем (в одном выпуске все равно всего не охватишь).

Наконец-то мы подошли к конструкции оператора ветвления. Кстати он имеет практически одинаковый синтаксис во всех известных мне языках и называется везде одинаково - IF (ЕСЛИ). В простейшем виде синтаксис его такой (Бейсик):

IF условие THEN оператор

Читается: если условие выполняется (истинно), то (then) выполнить оператор. Если условие ложно, то управление передается на следующую строку.

Простой пример:

INPUT chislo
IF chislo<10 THEN PRINT "Вы ввели число меньше 10"

или более "навороченный" пример:

  1 REM Программа 9.1
 10 LET l$="Max"
 20 LET p$="7@hw1J"
 30 LET popytki=3
 40 IF popytki=0 THEN GOTO 110
 50 INPUT "Login";login$
 60 INPUT "Password";pass$
 70 LET popytki=popytki-1
 80 IF login$<>l$ THEN GOTO 40
 90 IF pass$<>p$ THEN GOTO 40
100 GOTO 130
110 PRINT "Access denied!"
120 END
130 PRINT login$;" you are logged in."
140 ....
 .........

На самом деле сейчас программы так уже никто не пишет, но мне это неважно. Здесь применено, по сути, все, что мы изучили. Несмотря на то, что логика программы может показаться запутанной, на самом деле все очень просто. И разобраться в ней очень для вас важно, особенно для зарегистрированных подписчиков, которые пожелали (пожелают) изучать Бейсик, потому что это есть первая задача вашего домашнего задания.

Если вы не используете номера строк (а мы их используем сейчас, только чтобы вы лучше понимали логику работы программ) и хотите использовать оператор GOTO (повторяю, есть ситуации, когда без него обойтись нельзя или можно, но неоправданно (с экономической точки зрения :)), то вам самим придется создавать метки. Вот так:

метка: ..... GOTO метка.

Циклы

Цикл - повторяющаяся многократно последовательность действий (событий и т.п.)

В нашем случае это последовательность команд. Когда это может понадобиться? Не надо на меня так смотреть :-) Я в прошлом выпуске просил вас написать программу, которая 5 раз будет имя с телефоном запрашивать, помните? Это задание мной не контролируется, но, надеюсь, хоть кто-нибудь написал?

Или, вот, программа 9.1 где логин с паролем запрашиваются 3 раза. Чем не цикл?

Кстати, таким макаром, как в программе 9.1, раньше все циклы и выглядели (и сейчас выглядят на Ассемблере). Разработчики языков пошли дальше и придумали специальные операторы. Их, как и самих, циклов бывает обычно три вида: цикл с известным заранее числом повторений и цикл с не известным заранее числом повторений. Последний бывает с предусловием и с постусловием. Поэтому и получается, что всего их три :).

Цикл с известным числом повторений используется в основном при работе с массивами, хотя и не только. Так как мы массивов не изучали, я сейчас буду придумывать пример без них.

... Тяжело дается придумывание сегодня, и чего-то никто не подсказывает. Ладно, начнем с примитива. Надо нам, зачем-то напечатать 10 букв "А". Нет. Давайте лучше классику посмотрим. Надо нам рамку сделать на экране, в текстовом, ясно, режиме.

Экран у нас 80х25 кажется, так? Пусть будет так. Пока псевдографику трогать не будем, воспользуемся обычными символами. Значит, в углах поставим звездочки "*", горизонтальные линии сделаем из дефисов "-", а вертикальные из символов "конвейера" "|".

Вы уже знаете оператор PRINT и в принципе можете напечатать рамку, например, вот так:

CLS
PRINT "*------------------------------------------------*"
PRINT "|                                                |"
PRINT "|                                                |"
PRINT "|                                                |"
PRINT "|                                                |"
PRINT "|                                                |"
 .... и еще 18 таких строк ....
PRINT "*------------------------------------------------*"

Очень мило. Но, если бы программы так писали (хотя, есть подозрение, что кое-кто так и пишет), то ... Скажем, это немножко не то. Здесь мы можем воспользоваться циклом, чтобы на писать 23 одинаковых строки.

CLS
PRINT "*------------------------------------------------*"
FOR I=1 TO 21 STEP 1
  PRINT "|                                                |"
NEXT I
PRINT "*------------------------------------------------*"

Программа незначительно уменьшилась на 77% по числу строк. Но и так никто не делает, это я вам для примера все привожу процесс совершенствования программы. Нет, так, конечно, делают, только не рамки.

Короче, это цикл с известным заранее числом повторений (это число 21 в примере). За числом повторений (сколько уже было или сколько еще осталось) следит специальная переменная-счетчик, она называется параметром цикла. В примере это I, но имя можно придумать и другое.

Как работает такой цикл? прочтем по-русски:

ДЛЯ I от 1 до 21 С ШАГОМ 1
  ПЕЧАТАЙ ....
СЛЕДУЮЩИЙ I

Параметру цикла присваивается начальное значение, в данном случае 1, затем выполняются операторы (их может быть много) между FOR и NEXT, они называются телом цикла. Когда очередь доходит до NEXT компьютер увеличивает текущее значение параметра цикла на ШАГ и проверяет, больше ли оно чем конечное значение (у нас, 21). Если меньше, то цикл выполняется еще раз, если больше - управление передается оператору, который идет следом за NEXT.

Если шаг равен 1, то писать STEP 1 не обязательно, но шаг может быть не равным 1, он вообще, может быть отрицательным.

Кстати параметр цикла можно как и любую другую переменную использовать в теле цикла, при этом хорошо бы другая переменная не имела такого же имени, как и параметр цикла, иначе получится бяка (точнее, может получиться).

Отвлечемся, пусть нам надо распечатать числа от 100 до 0 с шагом 14 (ну, иногда это нужно :):

FOR chislo=100 TO 0 STEP -14
  PRINT chislo
NEXT chislo

Посмотрите как это выглядит, наберите программу, поменяйте начальное и конечное значения цикла, шаг.

Ну а мы к рамке вернемся. Хочу по секрету рассказать Вам об одном операторе, и это LOCATE (так и хочется перевести его, как "ПОЗИЦИОНИРУЙ", но остановлюсь на варианте)"УСТАНОВИ КУРСОР В ПОЗИЦИЮ". Все знают что такое "курсор"? Есть такое понятие, как текущая позиция вывода текста на экран. Курсор, как раз показывает где эта позиция. Он показывает это не только нам но и отвечающим за вывод процедурам ДОС.

LOCATE X, Y - устанавливает курсор в позицию с координатами X,Y.

Экран у нас имеет размеры 80 на 25 символов (режим можно менять) и верхний левый угол имеет координаты (1,1). Причем, X это ряды (вертикальная координата), а Y - столбцы (горизонтальная координата). Да, двадцать пятую строку лучше не использовать.

Поэтому давайте применим LOCATE для вывода рамки:

REM Программа 9.2
CLS
FOR X=2 TO 23
  LOCATE X,1: PRINT "|";
NEXT X
FOR X=2 TO 23
  LOCATE X,80: PRINT "|";
NEXT X
FOR Y=2 TO 79
  LOCATE 1,Y: PRINT "-";
NEXT Y
FOR Y=2 TO 79
  LOCATE 24,Y: PRINT "-";
NEXT Y
LOCATE 1,1: PRINT "*";
LOCATE 1,80: PRINT "*";
LOCATE 24,1: PRINT "*";
LOCATE 24,80: PRINT "*";

Красотища! Правда программа стала больше, чем предыдущий вариант, но зато она универсальнее - только рамку рисует, а остальной экран не поганит. Кстати, подобным образом (но более оптимальным) рисуются рамки окошек в программах (текстовых).

К тому же эту программу можно легко уменьшить, это ваша вторая задача.

Я кое-что поясню по ней (по программе). Первая строка это комментарий. Мы уже сталкивались с этим понятием в HTML, вот и здесь теперь столкнулись. Операторы REM компилятором и интерпретатором пропускаются (и все, что за ними тоже пропускается).

Второе. Если несколько операторов стоят в одной строке, то их лучше отделить друг от друга двоеточием.

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

Ну ладно, посмотрим еще сегодня цикл с постусловием.

Иногда надо повторять разные действия неизвестное число раз, например, до тех пор, пока пользователь не нажмет Escape. Или до тех пор, пока какая-то переменная не станет равна нулю (при том, что начальное ее значение не известно заранее). Второй случай рассмотрим.

В Бейсике за цикл с постусловием отвечают операторы DO, LOOP. Здесь выполняется тело цикла и смотрится условие, истинно оно или нет. Если надо, цикл выполняется еще раз. В цикле с предусловием условие проверяется до выполнения тела цикла.

Цикл с постусловием делится еще на два вида: ДЕЛАЙ, ПОКА УСЛОВИЕ ВЕРНО и ДЕЛАЙ, ПОКА УСЛОВИЕ НЕ СТАНЕТ ВЕРНЫМ. Итак:

INPUT "Введите число :", X
DO
  PRINT X
  LET X=X-1
LOOP UNTIL X<0

или

INPUT "Введите число :", X DO PRINT X LET X=X-1 LOOP WHILE X>=0

Эта программа распечатает все числа от введенного до нуля. UNTIL означает "ПОКА НЕ", т.е. цикл будет выполняться ПОКА X НЕ станет меньше нуля или, что тоже самое, ПОКА условие X<0 НЕ станет верным.

WHILE значит ПОКА, т.е. ПОКА X больше или равен нулю, цикл будет выполняться.

Все. Не знаю, как вы, а я устал. Расскажу-ка я вам про функции чуть-чуть.

Функции

Вы знаете, что понимается под функцией в математике? Вот, а я уже забыл. Это, кажется, отображение одного множества на другое. Функция имеет аргумент (может и не иметь) и возвращает значение. В нашем случае под отображением можно понимать набор действий, которые из аргумента функции получают ее значение.

Вот функция f(x)=x^2. Чтобы отобразить аргумент на множество значений надо просто возвести аргумент в квадрат.

В языках программирования все тоже самое. Функция имеет имя. Для стандартных функций это ключевое слово, например, SIN (синус), SQRT (квадратный корень). Функции бывают не обязательно математическими, просто с математическими вы все знакомы, вот, я их в пример и привожу. А есть функции, которые возвращают не число, а строку. С ними мы еще познакомимся.

Функции можно писать самому, причем большинство программистов именно этим и заняты, особенно, если учесть, что в Си сама программа есть не что иное, как одна большая (или маленькая) функция. Но в Бейсике не так.

Сегодня мы будем говорить лишь о стандартных функция, потому что нам надо одну из них использовать в примере из рубрики ДОС.

Функции (любые) можно использовать в выражениях, а также их значения можно присваивать различным переменным. Положим, вам надо узнать чему сегодня равен синус "пи", пишем: PRINT SIN(3.14).

Или мы хотим простенькую диаграмму построить:

REM Программа 9.3
LET chislo=0
LET den=0
CLS
FOR I = 0 TO 9
  LOCATE I + 5, 1: PRINT I; "|";
NEXT I
LOCATE 20, 2: PRINT "Введите номер дня (0-9), а затем кол-во товара";
LOCATE 21, 2: PRINT "проданного за день (в тоннах).";
LOCATE 22, 2: PRINT "Для выхода из программы, укажите номер дня 10";
DO
  LOCATE 23, 2: INPUT "Номер дня: ", den
  IF den = 10 THEN END
mnogo:
  LOCATE 23, 40: INPUT "Количество товара: ", chislo
  IF chislo > 70 THEN LOCATE 23, 40: PRINT "Слишком много": GOTO mnogo
  LOCATE 23, 13: PRINT "   "
  LOCATE 23, 59: PRINT "         "
  LET x = den + 5
  LET y = 5
  LOCATE x, y
  FOR I = 1 TO INT(chislo)
    PRINT "*";
  NEXT I
  PRINT " "; chislo;
LOOP WHILE 1

Не очень подходящий пример для демонстрации использования функций, ну и что. Здесь используется только одна функция - INT(x), где x - параметр функции, любое число. Функция возвращает целую часть от x, например, INT(3.2)=3, а INT(34.87)=34. Т.е. INT не округляет число, а отбрасывает дробную часть. В данном примере она использована на случай, если вы продали в какой-то день 34.87 (т.е. не целое число) тонн товара, а для построения диаграммы мы можем использовать только целые числа, так система координат у нас такая, ну не придумали инженеры 34.87-ого знакоместа :-)

Да, кстати, эта программа содержит много ошибок, и я знаю, кто их будет исправлять :-).

Другая интересная функция это INKEY$, она считывает символ с клавиатуры. INKEY$ возвращает строку, которая содержит считанный символ.

Например, так делается в программе пауза:

PRINT "Press Any Key"
DO
LOOP WHILE INKEY$=""

Две кавычки ("") это пустая строка, т.е. строка не содержащая символов. INKEY$ возвращает такую строку, когда пользователь ничего не нажимает. А цикл мы используем потому, что INKEY$ только проверяет нажата ли в данный момент кнопка, она не ждет нажатия, как INPUT. Поэтому нам надо затормозить комп до тер пор, пока пользователь сообразит что-нибудь.

Интересно, что в старых Бейсиках не было цикла DO...LOOP (там был только FOR), поэтому приходилось делать паузу с использованием GOTO, вот так:

300 IF INKEY$="" THEN GOTO 300

Конечно, так делать можно и сейчас.

Если продолжение программы должно быть не после нажатия Any Key, а после какой-то конкретной, то надо менять условие завершения цикла:

PRINT "Нажми кнопку 'R'"
DO
LOOP UNTIL INKEY$="R"

Внимание! Регистр символов здесь различается. Вы можете два дня нажимать на "r" и ничего не выйдет, пока не перейдете в регистр заглавных букв. Но не волнуйтесь, выход есть. Это функции LCASE$() и UCASE$(). Попробуйте догадаться, что они делают, если UCASE$("cool")="COOL", а LCASE$("IMHO")="imho"? Кстати, эти функции не всегда работают с русскими буквами (в PB не работают).

PRINT "Нажми кнопку 'R'"
DO
LOOP UNTIL UCASE$(INKEY$)="R"

Каждая кнопка имеет свой код (ASCII-код). Его можно узнать используя функцию ASC("строка"). Эта функция возвращает код первого символа в строке. Обратное действие совершает функция CHR$(код), она возвращает графическое изображение символа с данным кодом. Помните, что не у всех символов есть графическое изображение.

А код кнопки ESC равен 27. А Enter'а - 13.

Попробуйте написать программу, которая будет вам печатать коды нажимаемых клавиш.

Новостей на сегодня больше нет. Шутка. Пара-тройка новостей еще осталась.

Новость 1. Пока с сегодняшним выпуском не разберемся, дальше не двинемся. Поэтому, если я где-то непонятно объяснил или, вообще, забыл что-нибудь объяснить, спрашивайте. Опытные - поправляйте.

Новость 2. Если после запроса в INPUT ставить не точку с запятой, а запятую, то знак вопроса выводиться не будет. Это напомнил мне Владимир. Вы тоже, друзья, что-нибудь мне напоминайте, я же помню не все. Сами понимаете, Бейсик, для ДОСа ... тонкостей много всяких и хитростей. Вот, вместо оператора PRINT можно писать ? (знак вопроса).

Новость 3. Сегодня у нас выдача домашнего задания. Читайте ниже об этом. Опять же сегодня или завтра к вам придет дополнение к этому выпуску, там будут указаны ники2 товарищей, для которых это ДЗ предназначено. Да, не забудьте подтвердить регистрацию.

ВОПРОСЫ И ОТВЕТЫ

По предыдущему выпуску писем я пока не получал, а, вот, по файловой системе вопросы были. Точнее два вопроса: Какая конкретно информация по каждому файлу хранится в каталоге? и Неужели на дискету нельзя записать больше 224 файлов? Даже, если они будут занимать по три байта каждый?

Ответ на первый вопрос. На каждый файл в каталоге отводится 32 байта. Сообразительные подписчики могли получить это число разделив 14 секторов (512 байт каждый), отведенных под Каталог на дискете, на 224 файла: (14*512)/224 = 32 байта.

Эти 32 байта распределены следующим образом:

байтысодержимое
0-7имя файла (8 байт)
8-10расширение (3 байта)
11атрибуты файла (1 байт)
12-21зарезервировано (10 байт)
22-23время создания/изменения (2 байт)
24-25дата создания/изменения (2 байт)
26-27номер начального кластера (2 байт)
28-31размер файла в байтах (4 байт)

Более подробно разбирать этот вопрос сейчас мы не будем, может когда-нибудь ...

Ответ на второй вопрос. Да. Попробуйте смоделировать эту ситуацию, тем более, что это не сложно. Для таких простых "прикладных" задач Бейсик, как раз, подходит. Вот, например, программа для Quick Basic'а:

CLS
PRINT "Для выхода нажмите Esc..."
DO
a$ = INKEY$
LOOP UNTIL a$ <> ""
IF a$ = CHR$(27) THEN END
FOR i = 1 TO 224
  f$ = "c:\test\" + LTRIM$(STR$(i))
  OPEN f$ FOR OUTPUT AS 1
  PRINT #1, "A"
  CLOSE #1
  PRINT ".";
  IF INKEY$ = CHR$(27) THEN EXIT FOR
NEXT i
PRINT "Выполнение программы закончено."
PRINT "Создано "; i - 1; " файлов."

Многое из написанного выше уже вам знакомо. Вот, пожалуйста, пример практического применения циклов и условий. Единственно, может быть не понятна работа с файлами. Но это все мы изучим вскорости.

Программа создает 224 файла в каталоге c:\test с именами 1,2,..,244 (без расширения). Каждый файл занимает 3 байта (всего 672 байта). Попробуйте записать их на чистую дискету. Один файл у вас не поместится. Т.е. записать вы сможете только 223. Потому что 224-й файл уже есть на дискете - это метка тома.

ОКРУЖЕНИЕ

Меня иногда очень часто спрашивают, где взять какую-нибудь литературу в электронном виде. Так и хочется спросить, а Вы в библиотеке были? Или за компьютером засиделись и забыли, что такое библиотека? Ничего, бывает.

Из-за компьютера я вас, друзья, не гоню. Потому что есть, ведь, у нас и электронные библиотеки. А среди них, очень даже специализированные.

Это, например, компьютерная библиотека InfoCity (http://infocity.kiev.ua)

В этой библиотеке довольно много разделов. Есть по железу, по графике, по софту. Но нам-то интереснее всего был бы раздел по программированию. И он там есть. Сходите, может чего присмотрите.

Меня еще спрашивали, какая книга по HTML лучше всего. Не знаю, но наиболее полно HTML 4.0 описан, конечно, в спецификации на него же :). Хоть, браузеры не всегда следуют требованиям спецификации, иметь ее дома полезно. Я, наконец-то, нашел ее русский перевод, вот, сообщаю вам. Попробуйте догадаться, куда за этим талмудом надо идти :-) Правильно, угадали ....

А чтобы в другой раз не узнавать подобные новости неделю спустя от меня :(, подпишитесь на рассылку новостей библиотеки, благо она тоже выходит с Subscribe.ru.

Новости компьютерной библиотеки InfoCity

В рассылке публикуются новые поступления книг и статей компьютерной тематики в библиотеке InfoCity. (http://infocity.kiev.ua)

Новости компьютерной библиотеки InfoCity

ДОМАШНЕЕ ЗАДАНИЕ ПО БЕЙСИКУ 1

Это первое задание, выполнение которого будет контролироваться. Сроки выполнения я не устанавливаю, каждый занимается в удобном ему темпе. Ответы на это задание в рассылке публиковаться не будут. Если Вы пришлете задание выполненное с ошибками, то я верну его вам, указав на ошибки. Вы их должны исправить сами, но при затруднениях можете консультироваться со мной по электронной почте.

Если задание Вам не вернулось, то это значит, что оно верно, я его не получил или не проверил. Причем, в первом случае, Ваш ник2 будет опубликован в рассылке, мол, задание выполнил такой-то и такой-то. Чтобы узнать дошло ли до меня Ваше письмо, можете посылать его с запросом подтверждения получения или прочтения.

Задание состоит из нескольких подзаданий или задач. Первое ДЗ общее для всех зарегистрированных подписчиков. Делать и посылать задания мне на проверку можно как по частям, т.е. по одной или несколько задач (рекомендуется), так и целиком.

Цель задания для вас: - понять, как выполняются программы вообще
                      - изучить и уметь применять на практике
                      конструкции типа "безусловный переход",
                      "ветвление" и "цикл".
                      - изучить и уметь применять на практике основные
                      операторы и функции языка Бейсик
Цель задания для меня: - посмотреть как вы усваиваете материал
                       - отработать механизм проверки заданий
                       - провести анализ ваших решений на предмет
                       усложнения или упрощения заданий в дальнейшем
                       - специальные цели

Задача 1

Разобраться в логике работы программы 9.1. Подробно описать ее в отчете и отослать мне.

Задача 2

Переписать программу 9.1 без использования номеров строк.

Задача 3

Сократить программу 9.2.

Задача 4

Напишите программу, печатающую все числа от введенного с клавиатуры (организовать проверку, что это число не больше 20) до нуля в столбик с использованием цикла FOR. Рядом (справа) надо напечатать столбик чисел от нуля до введенного. Затем поменять столбики местами (перепечатать). Этот процесс повторять до нажатия пользователем кнопки с надписью "ESC" (на клавиатуре :).

Задача 5

Написать программу для решения квадратного уравнения вида a*x^2+b*x+c=0, где a,b,c - коэффициенты, вводимые с клавиатуры, x -искомая переменная. Извлечение квадратного корня делает функция SQRT(). Например, SQRT(4)=2, SQRT(81)=9.

Задача 6

Напишите программу "Печатная машинка", которая будет отображать нажимаемые пользователем кнопки. Сделайте поддержку ENTER'а. Выход по ESC.

Задача 7

Для товарищей, чьи ники2 в дополнении к этому выпуску будут напечатаны красным цветом:

Найти ошибки в программе 9.3. (диаграмма), т.е. побыть ее бета-тестерами. Свои замечания оформить в виде отчета. Эти отчеты потом будут переданы другим ребятам для осуществления исправлений и доработок, согласно этим отчетам. Забыл сказать, что вы будете поделены на команды. Посмотрим потом, кто как справится.

p.s. Может оказаться, что в дополнении ники2 не будут отмечены никак (наверное так и будет, я уже спать хочу:). В этом случае, я всех, кого надо уведомлю по email.

Задача 8

Написать контрольную работу (тест). Задание все получат со временем.

Замечание 1. Это ДЗ не на одну неделю, поэтому не надо рвать и метать, делайте все спокойно (исключение - задача 7, хотя она и не на неделю, но чем быстрее, тем лучше; следите за качеством, эстафета в обратном порядке не передается).

Замечание 2. Если кому-то не ясно что-нибудь по заданию, смело спрашивайте. Сейчас у меня два тридцать ночи, и я признаю, что в некоторых местах я явно переутомился :-).

Все. С нетерпением жду вторника, чтобы отправить этот выпуск и еще 90 писем, и забрать то, что вы мне написали. (У меня сникернет, для тех, кто понимает :).

Пока.

------------------------------
Нет, ну вы посмотрите, что они там вытворяют! Это ж надо, какая фантазия!

"Школа жизни" - это рассылка, цели и задачи которой абсолютно альтруистичны и человечны :) - нести разумное, доброе, вечное...

В выпусках рассылки и на страницах нашего сайта Вы можете найти полезные советы, хитрости и секреты на все случаи жизни:

  • как вести себя на собеседовании при приеме на работу, чтобы работодатель выбрал именно Вас;
  • как познакомиться с девушкой (юношей), дабы произвести самое благоприятное впечатление;
  • хитрости домашнего ремонта;
  • вождение и починки автомобиля;
  • прикладные советы из области юриспруденции (общение с родной милицией и ГИБДД, размен, покупка квартир).
И многое, многое другое.
Школа жизни
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

С уважением,
Вячеслав Stac Мацнев mailto:stac@stacmv.net
31.10.00.



http://subscribe.ru/
E-mail: ask@subscribe.ru

В избранное