Уроки для начинающих программистов
Выпуск N 10
Воскресение, 29 сентября 2000 г.
Всего подписчиков - около 13000
Ведущий рассылки Эдуард Дмитриев
Здравствуйте, уважаемые подписчики!
Это письмо желательно читать в броузере или развернуть на весь экран, тогда легче ориентироваться и приятнее читать!

В этом выпуске:
  1. О выпуске
  2. Уроки HTML. Параметры тэга <BODY>
  3. Уроки программирования на Паскале
  4. Вопросы - ответы

1. О выпуске

Здравствуйте, друзья!
Сразу же хочу сказать большое спасибо за ваши письма, всем сразу и каждому в отдельности. К сожалению, мне не удалось ответить на все, но это не значит, что я не уделяю им внимания! Ваша почта учитывается при написании выпусков, вопросы позволяют строить общую картину успеваемости, а также ваши предпочтения, предугадывать некоторые другие вещи. Однако хочу заметить, что неуместны ваши вопросы на те темы, которые мы еще не проходили. Так, к примеру у вас возникает множество вопросов по Паскалю, до которых мы пока не дошли в рассылке.
  • Как обращатсья к внешним файлам?
  • Как использовать числа с плавающей точкой?
  • Как рисовать в графическом режиме
  • и т.д...
  • Я бы с удовольствием отвечал на продвинутые вопросы наравне с вопросами новичков, но у меня нет ни времени ни возможностей. Слишком много почты, да и рассылке надо уделять внимание. Будьте снисходительны!

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

    И опять комментарии по поводу Библиотеки программиста, в частности, раздела Уроки для начинающих программистов. Большое, очень большое количество писем по поводу мертвых ссылок. Да, такие имеются на сайте в целом - об этом написано на главной странице сайта. Я прекрасно об этом знаю - какие ссылки не работают и всвязи с чем это происходит. Но вот в разделе Уроков программирования неработающих ссылок нет, все оттестировано и должно отзываться. Однако часто пишут, что не скачивается Паскаль, не открывается та или иная страница. И действительно, после небольшого ON LINE тестирования моими знакомыми из разных частей страны были получены неверные ответы сервера, вроде "страница не существует" или "у вас нет прав доступа"... Чтож, бывает. Повторюсь - возможно, из-за загруженности сервера, а может и из-за проблем с DNS в вашей зоне. Но как бы там ни было, факт налицо и придется принимать меры. Единственный выход - перенос сайта на другой сервер, что дело не однодневное. Но проблему надо решать и в ближайшее время я займусь осуществлением этой идеи.
    А пока могу рекомендовать - если что-то не отзывается, перейдите по этому адресу еще раз. Не отзывается опять, зайдите позже, через день, например.

      Новым подписчикам

    Если Вы недавно подписались и Вам что-то непонятно, пожалуйста, перед тем, как спрашивать у меня, просмотрите предыдущие выпуски рассылки. Возможно, там есть ответы на ваш вопрос.
    Архив рассылки можно взять на моем сайте "Библиотека программиста" - http://www.plib.f2s.com/.
    Также там можно скачать программное обеспечение, необходимое нам для работы на сегодняшний день.
    Буду особо благодарен, если Вы оставите свое мнение о рассылке на сайте и примете участие в форуме.

      Маленький такой юбилей

    Обратите внимание, номер который вы читаете - десятый, а значит юбилейный. Десять - это совсем не большой юбилей, но всеже приятно. Мы с вами знакомы уже несколько месяцев, уже освоили довольно много информации. Думаю, сегодня подходящее время для подведения итогов, что же мы прошли и что нас ждет впереди.
    Итак, мы вместе уже десять выпусков. Что же вы успели освоить?
    HTML - полностью освоили всю основу языка. За десять выпусков мы разобрали как строятся страницы, самые основные и важные их элементы. Пусть этого пока не много, но вы уже наверняка сможете создать себе небольшой сайт. А главное - сами, без помощи редакторов и программ, автоматически генерирующих HTML код. Это важно. Я знаю, что многие из вас начинали с нуля, и как же все-таки здорово, когда замечаешь, что твои уроки людям полезны - когда начинают интересоваться рассылкой и задавать все более и более продвинутые вопросы.
    Что будет дальше? А дальше мы с вами начнем заниматься таблицами, которые и будут конечным этапом освоения гипертекстового языка. Попутно будем отвлекаться на несложные моменты, проходить разные тэги, не требующие глубокого понимания. После того, как вы научитесь создавать полноценные WEB-сайты, будем учиться загружать их в Сеть, организовывать структуру, разрабатывать концепции проекта.

    Turbo PASCAL - с этим языком вы знакомы пока немного. На сегодняшний день мы проходили больше организацию программ, структуру и методы использования стандартных средств, нежели существующие процедуры, функции и самые различные конструкции языка. Но это только на первом этапе - сейчас мы учим все то, что необходимо для написания текущих программ. Тем самым вы уже развиваетесь как программисты, учитесь использовать существующие средства по максимуму. Однако далее мы уже начнем проходить вещи посложнее - десятки процедур, конструкции, приемы программирования.
    После того, как язык будет более-менее освоен, мы напишем какую-нибудь большую программу, которая и будет завершающим итогом изучения Паскаля. Возможно, это будет игра, хотя я точно сказать не могу, сейчас прорабатываю и другие варианты. Но как бы там ни было, после этой программы мы оставляем Паскаль и начнем заниматься Си, С++ и другими языками.

    Вот, собственно и есть наш небольшой план действий. Ваши комментарии?

     

    2. Уроки HTML. Параметры тэга <BODY>

    В прошлом выпуске (N9) мы окончательно завершили тему гипертекстовых ссылок. Надеюсь, вам все было понятно и не возникло никаких серьезных затруднений. Сегодня же мы вернемся к известному нам тэгу <BODY>, который озаглавливает тело HTML документа. На самом деле этот тэг - больше чем просто заголовок одной из частей странички. Кроме этого он имеет большие возможности по управлению внешним видом документа. Реализуются эти возможности через его параметры, то есть к тэгу дописываются дополнительные условия. Сегодня мы этим и займемся - изучением параметров <BODY> и их влияний на гипертекстовый документ.

      Параметры <BODY>

    Параметры, как вам известно дописываются непосредственно в самом тэге, то есть внутри знаков < и >. Кроме этого не забывайте про некоторые основные правила (см. пред. выпуски) относительно расположения параметров. Итак, не будем терять времени и перейдем к действиям. Для начала приведу пример BODY с параметрами, которые мы сегодня изучим:

    <BODY BGCOLOR="#0000FF" BACKGROUND="images/back.gif" TEXT="#FF0000" LINK="#0000FF" VLINK="#800080">

    Ну а теперь разбираем все по отдельности...

      Параметр BGCOLOR

    Первый параметр, который мы изучим, это BGCOLOR. Замечу, что это сокращение от английских слов background color, что значит цвет фона. Думаю, из перевода вы уже догадались, чем управляет этот параметр. Подробнее:
    BGCOLOR - задает цвет общий фона всего документа. Здесь все очень просто - при задании этого парамерта фон документа изменит свой цвет на желаемый. Номер цвета задается по уже известной нам схеме красный - зеленый - синий. (См. тему "шрифты"). Если вы не помните, что данная схема - это стандарт представления цветов в HTML, то я вам это напоминаю, а также напомню то, что цвета задаются в шестнадцатеричной системе счисления. Как без труда выбрать требуемый цвет и перевести его в 16-ю систему смотрите предыдущие выпуски. Ну а я показываю пример использования данного параметра:

    <BODY BGCOLOR="#FF0000">
    Здесь цвет фона будет красным.

    <BODY BGCOLOR="#000000">
    А здесь черным.

    Вот и вся работа BGCOLOR. Не сложно, правда? И при этом очень удобно и универсально.
    Кстати, по умолчанию цвет фона белый, то есть #FFFFFF, что эквивалентно записи:

    <BODY BGCOLOR="#FFFFFF">

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

      Параметр BACKGROUND

    У вас никогда не возникало желание заполнить фон документа какой-нибудь картинкой или текстурой? Кстати, ко мне приходило много писем с такими вопросами. Действительно, заполнение фона графическим файлом иногда очень удобно и красиво смотрится. (Так называемые обои). А выполнить это в HTML очень легко. Рисунок для фона вставляется с помощью параметра BACKGROUND тэга BODY, в качестве условия для параметра указывается путь к рисунку. При этом рисунок будет размножен, то есть изображение равномерно распределиться по всему окну броузера.
    Вот пример использования параметра:

    <BODY BACKGROUND="images/back.jpg">

    В этом примере подразумевается, что рисунок фона находиться в каталоге images, под именем back.jpg.
    Вот и все использования параметра BACKGROUND.

      Параметр TEXT

    Следующий параметр - TEXT. Он определяет цвет текста по умолчанию, то есть указывает номер цвета в шестнадцатеричной системе счисления, которым будет выводиться весь шрифт, если у тэга FONT не задано других значений. По умолчанию цвет шрифта - черный, то есть #000000.
    Тоже довольно удобно. Допустим, у вас задан черный цвет фона. Естественно, что при этом цвет шрифта по умолчанию (#000000) не подойдет, ведь черный шрифт на черном фоне и не видно вовсе. Что делать? Придется изменять цвет шрифта на более подходящий, к примеру на белый - #FFFFFF. Реализоваться это может через использование параметра COLOR тэга FONT, но при этом придется все время его прописывать, что усложнит написание документа и увеличит его объем.
    Поэтому и удобно использовать параметр TEXT непосредственно в тэге BODY. Задав его один раз, мы установим единый цвет шрифта во всем документе. Вот пример:

    <BODY TEXT="#0000FF">
    Здесь задаем синий цвет шрифта.

    <BODY BGCOLOR="#000000" TEXT="#FFFFFF">
    А здесь обсуждаемая выше комбинация - черный фон и белый шрифт во всем документе.

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

      Параметр LINK

    Параметр, похожий на предыдущий. Отличие в том, что LINK задает цвет ссылок, то есть изменяет его с используемого по умолчанию (синий - #0000FF) на желаемый. При определении этого параметра все гипертекстовые ссылки в документе изменяют свой цвет. Особых пояснений к этому параметру, думаю, не требуется. Привожу пример его использования:

    <BODY LINK="#0095FF">

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

      Параметр VLINK

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

    <BODY VLINK="#FF0000">

    Здесь посещенные ссылки будут выделяться красным цветом.

    Вот, собственно и все про параметры! Давайте теперь смастерим такой тэг BODY, чтобы попровать изменить всю картину документа. Решим, какого цвета у нас будет фон? Примера ради не будем особо долго задумываться и создадим фон документа светло-коричневым. Используем для этого цвет под номером #E0E0C6. Вот вам эталон:

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

    шрифт...

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

    * Ссылка
    * Посещенная ссылка

    М-да... Ну ничего, для примера сойдет. А может кто и уловит свой стиль? :)
    В определении ссылок я использую цвет #FF0000 для обычных и #A00000 для посещенных. Кстати, вам не приходит в голову, что такое #A00000? Это и есть затемнение красного цвета. То есть мы попросту понижаем значение первого байта цвета, который как раз и отвечает за оттенок красного. Тем самым и получается понижение насыщенности и красный цвет как бы смешивается с черным.

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

    <BODY BGCOLOR="#E0E0C6" TEXT="NAVY" LINK="#FF0000" VLINK="#A00000">

    Теперь настоятельно рекомендую попробовать его в действии. Изменяйте все цвета, попробуйте их влияние на оформление документа. Здорово, правда?
    На сегодня все. Вы получили сегодня важную информацию, которая расширила ваши возможности по работе с документом. Хочу заметить, что BODY имеет и другие парамерты, которые мы пока не проходим, но обязательно займемся этим в дальнейшем.
    Тренируйтесь!

     

    3. Уроки программирования на Паскале

    И снова Паскаль. На сей раз мы будем изучать новый цикл, так называемый цикл REPEAT-UNTIL. Этот цикл является заключительным, он единственный оставшийся из трех имеющихся в Паскале - два мы уже прошли (FOR и WHILE). Хочу также обратить ваше внимание, что в этом выпуске мы снова вернемся к типам. Дело в том, что в цикле REPEAT-UNTIL очень часто используется неизвестный вам пока тип данных, так называемый логический, или булевский, или BOOLEAN. Так вот, этот тип очень удобен в использовании циклов REPEAT-UNTIL, да и вообще в программировании. Он довольно прост, но одновременно не все его понимают. Это ничего: если вы не поймете его сегодня, то обязательно разберетесь по ходу его использования. Как говориться, нет ничего лучше практики. Ну что, начнем?

      Тип BOOLEAN

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

    Итак, давайте представим, что мы пишем программу, в которой нам необходимо прочитать десять чисел, после чего выполнить следующие действия:

    1. Если среди введенных чисел был нуль, то напечатать "нули существуют".
    2. Если среди введенных чисел нулей не было, то так и пишем: "нету у нас нулей!".

    Задача поставлена. Думаем, как же будем ее решать. Заранее не сказано, что введенные числа нужно где-нибудь оставлять. Понимаете, о чем я? То есть ни одно из введенных чисел далее нам не потребуется, главное знать, был ли среди них нуль. Алгоритмов для решения такой задачи превеликое множество. Один из удачных вариантов (точнее, более простых) это использование массива, но таковые мы еще не проходили. Отпадает. Другой вариант - непосредственная проверка введенного числа, то есть после ввода проверять - число это нуль? Если да, выведем подтверждение. Но и это не очень гибкое решение задачи.
    Можно зделать иначе - проверять число на ноль, и если оно таковое, изменять какую-нибудь специально заведенную переменную. Например, Is_zero: Byte. Если у нас ноль, то пишем: Is_zero := 1;
    А после ввода проверяем, если в Is_zero = 1, то нули были. Вам понятен ход моих мыслей? Мы используем как бы подтверждение наличия нулей. Вот пример для наглядного отображения:

    Program N1;

    var

    Is_zero, I: Byte;
    A: Integer;

    begin

    Is_zero := 0;
    For I := 1 to 10 do
    begin
       Write('Введите число N',I,': ');
       Readln(A);
       if A = 0 then Is_zero := 1;
    end;

    if Is_zero = 1 then
       Write('В введенной последовательности есть нули! ')
    else
       Write('В введенной последовательности нулей ни фига нет! ');
    Readln;
    end.

    Надеюсь, программа понятна? В частности, использование переменной Is_zero? Вот мы и подошли к новому типу переменных, а именно к логическому типу - BOOLEAN. Что же это такое?

    Тип BOOLEAN - это логический тип. Переменная такого типа довольно специфична, она может иметь всего два значения:

  • TRUE - истина;
  • FALSE - ложь;

  • Именно эти значения и проверяются в программе. Переменные такого типа крайне удобны в нашем примере. Модифицируем?

    Program N2;

    var

    I: Byte;
    A: Integer;
    Is_zero: Boolean;

    begin

    For I := 1 to 10 do
    begin
       Write('Введите число N',I,': ');
       Readln(A);
       if A = 0 then Is_zero := true;
    end;

    if Is_zero then
       Write('В введенной последовательности есть нули! ')
    else
       Write('В введенной последовательности нулей ни фига нет! ');
    Readln;
    end.

    Видите, что мы сделали? Если перевести работу переменной BOOLEAN на русский язык, получиться примерно следующая фраза:

    Если правда то, что нули были, то напиши об этом;
    А вот если неправда, то так и напиши, что не было нулей...

    То есть работа BOOLEAN это просто определение истинности условия или его ложности. Вот собственно и все. Кстати, обратите внимание на проверку:

    if Is_zero then.....

    Вы видите, что я не пишу If Is_zero = true? BOOLEAN - переменная логическая, поэтому и не требует в проверках указания своего значения. Она просто проверяется на истину. Как бы по умолчанию, IF ищет подлинность условия.
    Понятно, нет? Если нет, то уверяю вас, дальше разберетесь. Пока про BOOLEAN сказать больше нечего, нужно пробовать использовать его и смотреть на результаты работы. Переходим к циклу.

      Цикл REPEAT-UNTIL

    Этот цикл весьма и весьма часто используется в программировании. Он довольно удобен для организации больших структур данных, оформления целых блоков программы. Отличительная особенность цикла - это проверка подлинности выполнения не в начале, как у других циклов, а в конце. Проверка может быть на что угодно:
    • На подлинность булевской переменной;
    • На наличие какого-нибудь условия, например была введена буква "q", означающая выход из программы;
    • На значение какой-нибудь переменной (а не больше ли она пяти?)
    • и т.д...
    Оформляется цикл тоже довольно просто.
    Для того, чтобы озаглавить цикл REPEAT-UNTIL (кстати, по английски repeat - повторять, а until - пока, до того как) необходимо в любом месте программы вставить служебное слово REPEAT. Именно одно слово, не как во всех других циклах. Завершается цикл служебным словом UNTIL с последующей проверкой какого-нибудь условия. Пример? Пожалуйста:

    Program N3;

    var

    S: String;
    Exit: Boolean;

    begin

    REPEAT
       Write('Введите строку (end - выход): ');
       Readln(S);
       if S = 'end' then Exit := true;
    UNTIL Exit;

       Write('Конец программы... ');
    Readln;
    end.

    В этом примере проверка происходит на подлинность булевской переменной, которая устанавливается если введена строка 'end'.
    Здесь хочу сделать дополнительные комментарии к циклу.
    Во-первых, обратите внимание, что после слова REPEAT не ставится точка с запятой, наподобие слова BEGIN. Дело в том, что REPEAT озаглавливает целый блок, поэтому знак ";" и отсутсвует.
    Во-вторых, обратите внимание, что операторы внутри конструкции REPEAT-UNTIL не выделяются дополнительными begin-end. Хотя операторов и несколько, этого не происходит.

    Ну а теперь еще пример, на этот раз проверяем числовую переменную:

    Program N4;

    var

    A: Integer;

    begin

    REPEAT
       Write('Введите число (0 - выход): ');
       Readln(A);
    UNTIL A=0;

       Write('Конец программы... ');
    Readln;
    end.

    Из программы видно, что она будет повторяться пока не будет введен нуль. Теперь, когда вы более-менее познакомились с этим циклом, думаю, вы согласитесь, что он очень удобен и прост. Вы уже довольно хорошо знакомы с понятием циклов и я считаю, что дополнительных комментариев к сегодняшнему вопросу не требуется. Очень рекомендую написать как можно больше программ, использующих этот цикл; попробуйте заменить в старых вариантах циклы FOR и WHILE на REPEAT-UNTIL.

    Теперь мы полностью завершили циклы и можем двигаться дальше. На пути у нас еще много интересной информации, которую нам предстоит шаг за шагом освоить. Перед тем, как вы сможете написать более-менее серьезную программу, необходимо еще изучить много приемов и теории...
    Кроме того, вам сейчас нужна практика. В ближайшем времени я планирую новый практический выпуск (помните такой?), задачей которого и будет предоставление возможности попрактиковаться.
    Ну а пока на этом все. Не знаю как вам, но мне, честно говоря, сегодняшний урок показался суховатым. Видимо, потому, что сама тема выпуска - цикл REPEAT-UNTIL, довольно проста и не требует серьезных обсуждений. Но еще есть в чем поразбираться. Точно вам говорю.
    Увидимся!

    4. Вопросы - ответы

     1 
    Как в Турбо Паскале обратиться к внешним файлам?
    Это тема для следующих выпусков.

     2 
    Паскаль - умирающий язык?
    Нет. Это определенно не так. Я согласен, в последнее время растет популярность Си, не вымирание Паскаля - не более чем субъективное мнение. Хочу сказать, что изучение Паскаля на самых начальных стадиях обучения определенно лучше, нежели занятия Си, в силу более принципиальных требований Паскаля к типам, структурам и концепциям программ. Это позволяет избегать многих ошибок и недопониманий.
    Кроме того, никто не сможет отрицать, что на Паскале можно сделать абсолютно все, что можно на Си. Кто-то не согласен? Милости прошу.

     3 
    Будет ли Windows?
    Да. DELPHI, возможно OWindows и т.д. Не скоро.

     4 
    Можно ли задать вопрос в эту рубрику, или Вы сами решаете?
    Сейчас решаю сам. Но вы можете явно указать, что желаете увидеть здесь свой вопрос. Однако я оставляю за собой право решать его помещение в рубрику "Вопросы-ответы".

    На этом прощаюсь, до следующего выпуска!


    Автор рассылки Эдуард Дмитриев (E-mail: ed1@mailru.com)

    Назад

    Hosted by uCoz