Уроки для начинающих программистов
Выпуск N 13
Пятница, 14 декабря 2000 г.
Ведущий рассылки Эдуард Дмитриев
Библиотека программиста (http://prog.agava.ru)
Здравствуйте, уважаемые подписчики!
Это письмо желательно читать в броузере или развернуть на весь экран, тогда легче ориентироваться и приятнее читать!


В этом выпуске:
  1. О выпуске
  2. Уроки HTML. Цитированный текст, преформатирование. Списки.
  3. Уроки программирования на Паскале

1. О выпуске

Здравствуйте, уважаемые подписчики!
Сегодняшний выпуск хочу начать с обзора так называемых "багов" - bags (дословный перевод "жучков"), иначе говоря проблем, связанных с читабельностью рассылки. Дело в том, что ко мне часто приходят письма, где вы меня простите лучше оформлять программы (сообщая, что я все пишу в одну строку, либо не выдерживаю табуляцию, ухудшая прочтение программ), либо каких-то других частей рассылки. Иногда приходят жалобы, что рассылка вообще нечитаема, за исключением некоторых заголовков и т.д.

Уважаемые друзья! Я никогда не позволил бы себе допускать столь досадные ошибки. Уверяю вас, я много работаю над оформлением рассылки, в частности, ее HTML версии. Но проблемы все же бывают: например, выяснилось, что почтовая программа The BAT! (уж не могу точно сказать, каких версий) совершенно не понимает некоторые тэги, рисуя документ так как ей хочется, а не так, как надо. От этого сильно страдает оформление тех же примеров программ. Ну чтож тут поделаешь? Это не моя вина. Я уверен, что создаю документ, полностью совместимый на сегодняшний день со всеми стандартами HTML. Не использую CSS или JAVA Script - так что если у вас зависает почтовая программа (такие жалобы бывают), то это не по моей вине.

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

И на последок: если вы думаете, что имеете проблемы с моей рассылкой в плане оформления, советую посмотреть архив на http://prog.agava.ru/. Там все выпуски храняться только в HTML версии и выглядят так, как они созданы первоначально.
Также, если Вы подписаны в TXT, тоже советую глянуть на оригинал, дабы не сокрушаться на мою неспособность нормально разделять текст на абзацы и т.д.

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

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

 

2. Уроки HTML. Цитированный текст, преформатирование. Списки.

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

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

  Цитированный текст

Цитированным текстом называется блок, который выделяется среди другой части HTML документа. Эта возможность очень полезна при создании документов и с успехом может быть использована. Вот пример цитаты:
Это пример так называемого цитированного текста. На этом примере очень хорошо видно, что данный фрагмент выделяется среди другого текста отсупами, выравниванием и полями. В общем, он оформляется как цитата, вынесенная отдельно.
Приведенный выше текст - это и есть пример цитирования. Как вы можете заметить, текст выровнен по правому краю, имеет отступ сверху и снизу, а также ограничен слева 8-ю пробелами.
Эту возможность удобно использовать при вставке в документ материалов из других источников, например, цитата какого-нибудь автора.

Оформляется блок цитирования тэгом <BLOCKQUOTE>. Этот тэг имеет завершающую пару: </BLOCKQUOTE>. Все, что будет написано внутри этих двух тэгов и будет выделено, как цитированный текст.

Скажу сразу, что внутри тэгов <BLOCKQUOTE> - </BLOCKQUOTE> разрешены любые другие тэги, в том числе и сами тэги <BLOCKQUOTE>. При этом вложенные цитирования будут выравниваться относительно текущего блока.

  Преформатирование

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



Несколько символов пробелов:          (а именно 10 штук),

Переносы строки:







(4 штуки) и т.д.

Нам придется все символы переноса строки заменить на <BR> и т.д. Однако существует возможность набора текста в том виде, в каком он представлен первоначально, причем без использования тэгов. То есть не игнорируются символы переноса строки и пробелы, что позволяет оформить текст без дополнительных тэг-включений.
Такой текст называется "преформатированным" и в некоторых случаях очень удобен. Оформить его просто: для этого служат тэги <PRE> - </PRE>, весь текст, который будет помещен между ними выведется в первоначальном виде. Но у преформатированного текста есть и свои особенности.
Во-первых, некоторые тэги все же учитываются. Например, внутри <pre>-</pre> можно установить шрифт, выполнить выравнивание или выделить жирным, курсивом, подчеркиванием. Вот пример:


Здесь идет преформатированный текст.



Тот же текст, но выделенный жирным.

А вот работа тега <center> внутри преформатирования.

Как видите, текст всеже может быть подвергнут действию некоторых тэгов. Подробнее описывать действие <pre> не имеет смысла, советую самим попробовать и разобраться, что же еще можно и нельзя внутри преформатирования.

  Списки

Иногда бывает очень удобно нумеровать какие-нибудь строки, например пункты меню или другие части документа, организовывая из них списки. Для этого в HTML существует несколько дополнительных возможностей по оформлению таких элементнов. Они называются списками.
Существует три основных вида списков:
  • пронуменрованный
  • непронуменрованный
  • список описаний
Хочу отметить, что допускается вложенность списков, то есть вы можете вставлять тэги любого из списков внутри (опять же) любого из списков. Так как все списки оформляются броузером с дополнительным отсупом от текста и некоторой табуляцией, вложенные списки соответсвенным образом выравниваются относительно списков уровнем выше.
Уровень вложенности практически не ограничена: да и мало кому понадобиться создавать списки с уровнем вложенности равным, например, пяти.

Итак, разберем все списки по порядку.

Пронумерованный список

В этом списке все пункты пронумеровываются по порядку. Каждый последующий элемент имеет номер, больший на единицу. Если вы удалите какой-нибудь элемент списка, то все остальные автоматически пересчитываются.
Пример:
  1. Первый элемент
  2. Второй
  3. Третий
  4. Четвертый...
Оформляется такой список очень просто. Для этого служат два тэга (точнее один, второй - это завершающий): <OL> - </OL>. Каждый новый элемент указывается внутри этой пары и начинается тэгом <LI>, который не имеет завершающей пары.
Пример:

<OL>
<LI>
Первый элемент;
<LI>Второй;
<LI>Третий...
</OL>

Кроме того, тэг <OL> может иметь дополнительные параметры:

<OL TYPE=A|a|I|i|1 START=n>

Где:

TYPE - это тип (вид) счетчика. Возможные значения:
  • A - большие латинские буквы (A,B,C,D,E,F...)
  • a - маленькие латинские буквы (a,b,c,d,e,f...)
  • I - большие римские цифры (I,II,III,IV,V...)
  • i - маленькие римские цифры (i,ii,iii,iv,v...)
  • 1 - обычные цифры (1,2,3,4,5...)
START - начальное значение счетчика, иначе говоря число, с котого начинается отчет. При этом если вы используете буквы в параметре TYPE, то отсчет начнется с буквы под соответсвующим порядковым номеров в англ. алфавите.

Непронумерованный список

В этом списке броузер помечает каждый новый элемент маркерами списоков. Данный список похож на используемый в программе Word автообразователь непронумерованных списоков. Вот пример такого списка:
  • Первый элемент
  • Второй
  • Третий
  • Четвертый...
Образуется такой список с помощью тэгов <UL> - </UL>, каждый новый элемент, как и в пред. списке, начинается с тэга <LI>
Вот пример:

<UL>
<LI>
Первый элемент;
<LI>Второй;
<LI>Третий...
</UL>

Кроме того, тэг <UL> также может иметь дополнительные параметры:

<UL TYPE=disc|circle|square>

Здесь TYPE:
  1. disk - вид маркера по умолчанию (круглый сплошной)
  2. circle - круглый полый (окружность)
  3. square - квадратный

Список описаний

Данный список служит для создания как бы "текстовых списоков", иначе говоря для создания списков вида "определение - описание". Эта возможность удобна при создании элементов с описаниями.
Вот пример:
Определение 1
Описание определения.
Определение 2
Описание определения 2...
Начинается такой список с тэга <DL> и заканчивается, соответсвенно, </DL>. Каждое новое определение указывается тэгом <DT> (определение лучше выделять жирным, так нагляднее), каждое описание - тэгом <DD>.
Пример HTML кода:

<DL>
<DT><b>
Определение 1</b>
<DD>
Описание определения.
<DT><b>Определение 2</b>
<DD>
Описание определения 2...
</DL>

Ну вот, собственно и все на сегодня. Вы прошли довольно много нового материала, советую еще самостоятельно поразбираться в списках, преформатировании и оформлении цитированного текста. Хочу сказать, что мы уже подходим к завершению создания обыкновенных HTML текстов (верстки). Скоро уже начнем учить вещи, направленные на создание сайта.
Удачи!

 

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

Уважаемые друзья! Как я и ожидал, было множество вопросов по массивам - не все их полностью поняли и не справились с домашним заданием. Это довольно естественно - массивы довольно специфический тип, не похожий на другие и требующий глубокого понимания. Собственно, по этому я и решил посвятить этот выпуск решению ДЗ, заданного в прошлом номере. Одновременно вы познакомитесь с новыми алгоритмами решения поставленных задач, так что этот выпуск будет довольно полезным.
Как вы помните, прошлое задание включало в себя пять задач. Сейчас я хочу подробно разобрать их все по порядку, что, надеюсь, поможет вам лучше разобраться в массивах.
Итак, задания. В рассылке я буду расказывать только о алгоритмах решения, сами исходные тексты вы найдете на сайте рассылки - http://prog.agava.ru/ в разделе "Уроки для начинающих программистов >> Домашние задания". Пять задач это все таки довольно большой объем для публикации в рассылке. Если же у вас нет Интернета, вы можете написать мне по адресу: ed1@mailru.com?subject=dz-12 (обратите внимание, в теме письма обязательно должна присутсвовать строка dz-12, что значит "домашнее задание, выпуск 12". Иначе я не буду обрабатывать ваше письмо) и я вышлю вам архив ДЗ почтой.

Итак, возьмите работы на сайте и начем решение задач.

  Задача N1

Напомню условие:

Напишите программу, читающую массив из 10 чисел и печатающий его в обратном порядке.

1. Давайте разберемся, чтожу нам нужно для решения этой задачи. Естественно, сам массив. Далее - переменная, которая будет использоваться в цикле и изменять индекс массива. Все это мы заводим в разделе var.
2. Теперь само решение. Здесь все очень просто: вспомните, что такое массивы? Это последовательность отдельных переменных, упорядоченная по порядку. К каждой переменной (элементу массива) можно обратиться по его индексу или порядковому номеру. Мы этим воспользуется и прочитаем массив с клавиатуры след. образом:
  1. Циклом будем изменять простую численную переменную от 1 до 10;
  2. По индексу, равному этой переменной (мы просто подставляем вместо номера элемента массива подставляем переменную-счетчик) мы читаем значение с клавиатуры;
Таким образом, мы прочитаем весь массив. Собственно, это и все с процедурой чтения (заполнения массива), в дальнейшем я уже не буду обращаться к этим объяснениям, а буду просто говорить "прочитать массив" и т.д.
Итак, мы заполнили массив с клавиатуры. Теперь нужно его распечатать в обратном порядке. Для этого мы воспользуется известной нам возможностью цикла For - служебным словом downto, уменьшая переменную счетчик от 10 до 1. Соответственно, будем печатать элементы массива, указываемые в цикле этой переменной.

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

  Задача N2

Задание:

Дан массив из 100 чисел. Заполнить его случаными значениями и распечатать его по 10 чисел в строке.

Эта задача вызвала очень много вопросов. В частности, не сама задача, а алгоритм вывода массива из 100 чисел по 10 чисел в строке. Ну чтож, думаю на заполнении массива случайными числами я останавливаться не буду (см. пред. выпуск - N12), а вот об алгоритме вывода массива строками по 10 чисел расскажу подробнее.
Хочу также сказать, что для дальнейшего понимания задачи необходимо иметь исходный текст. Где его взять - см. выше.

Итак, у нас есть массив из 100 чисел. Давайте теперь подумаем, как же нам поступить, чтобы через каждые 10 чисел переводить строку. Решений этой задачи довольно много, предлагаю остановиться на одном, очень простом решении.
Как всегда, организовываем цикл для прохода по всему массиву. Цикл будет, ясное дело от 1 до 100.
Ну а теперь давайте вспомним такую операцию, как получение остатка от деления. Вспомнили? Она называется mod. (См. пред. выпуски) Вот ею мы как раз и воспользуемся. Задумайтесь: распечатка 100 чисел по 10 чисел в строке - это не что иное, как печать десяти чисел, после чего перевод строки. Так ведь? Для проверки этого условия будем проверять переменную-счетчик на остаток от деления на 10. Если остатка нет (делится на 10 нацело) - значит печать очередной порции чисел закончена и нужно перевести строку.
Организуется это просто:
  1. Выводим число;
  2. Далее получаем остаток от деления переменной-счетчика на 10;
  3. Если остаток равен нулю, то переводим строку.
Вот и все! Пример реализации такой задачи смотрите на сайте.

  Задача N3

Задание:

Дан массив из 50 чисел. Заполните его случайными числами. Определить, сколько в нем элементов, отличных от последнего элемента. Вывести их количество.

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

Как всегда, организуем цикл, количество повторений которого будет равно 49 (максимальный элемент массива минс 1). Зачем уменьшать на единицу? Все просто. Мы будем циклом сравнивать все элементы массива с последним, исключая его самого. Ведь нам нет смысла сравнивать элемент с самим собой?
В ходе этой проверки будем смотреть: если текущий элемент массива не равен последнему, то увеличиваем некую переменную-счетчик, которая в конце концов и будет содержать количество элементов, не равных последнему.
Все!

  Задача N4

Задание:

Дан массив из 50 чисел. Заполните его случайными числами. Вывести на экран сначала все положительные его элементы, а затем все отрицательные.

Эта задача довольно простая, хотя и по ней были вопросы. С выводом сначала положительных, потом отрицательных элементов проблем, думаю, не возникает - проверяйте на больше/меньше нуля. А вот заполнение массива случайными, отрицательными числами - это вопрос. Ведь известно, что функция Random возвращает случайные числа от 1 до указанного диапазона. Как видите, отрицательных чисел здесь нет.
Однако нужно было придумать, как в функции Random получить отрицательные числа. Для этого есть очень простой алгоритм, а точнее даже и не алгоритм, а прием. Выглядит это примерно так:

A := Random(51)-100;    {Числа от -50 до 50}
B := Random(101)-200;    {от -100 до 100}

Хочу поблагодарить Андрея за предоставленный способ. Как вы видите, для получения диапазона чисел вида -N....N мы отнимаем от функции Random число, вдвое большее ее диапазона. Задумайтесь, как это работает. Очень просто!
Пример реализации такого алгоритма см. на сайте.

  Задача N5

Условие:

Дан массив из 10 чисел. Введите его с клавиатуры, после чего измените у всех чисел знак на противоположный. Вывести получившийся массив на экран.

Как вводить массив с клавиатуры уже не проблема (я так думаю), ну а вот как изменить знак у всего массива на противоположный догадались не все. Все очень просто, друзья! Для изменения знака числа на противоположный (инвертирование) нужно умножить число на -1. При этом если число положтельное, оно станет отрицательным и наоборот.
Вот и поступите так: умножте весь массив на -1. Задача решена!

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

Номер Задание
1 Есть массив на 11 чисел. Переписать его в обратном порядке, то есть чтобы элементы в нем располагались наоборот - первый стал последним, второй - предпоследним и т.д.
2 Есть массив чисел (любой, заполните его любыми извест. способами). Распечатать этот массив по возрастанию - т.е. сначала минимальный элемент, и т.д. по возрастанию.
3 Массив из строк. Найти самую длинную строку в массиве.
4 Найти все элементы некоторого массива, у которых остаток от деления на 10 не равен последнему элементу.

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

Номер Задание
1 Заведите массив из десяти элементов символьного типа - Char. Введите его с клавиатуры. Далее - прочитайте строку и проверьте, возможно ли из символов, введенных в массив составить заданную строку.
Пример:
Массив: А,Р,У,П,Q,К,W,Ф,О,S.
Строка: УРОК
Ответ: возможно. (В веденном массиве существуют сиволы "У", "Р", "О", "К").
2 Существует два массива по 30 эелементов каждый. Один массив - типа Integer, другой - итпа String. Эти массивы - данные о студентах одной группы. Массив из чисел - средняя оценка успеваемости каждого студента. Массив из строк - фамилии студентов. Элементы массивов соответсвуют друг другу, т.е. в первом элементе массива из строк - фамилия студента, в первом элементе численного массива - оценка для этого студента и т.д.
Задание: Напечатать успеваемость по убыванию. (Фамилии и оценки введите с клавиатуры, после чего распечатайте результаты).

Вот такая вот насегодня практика. Два последних, расширенных задания я буду принимать на проверку. Присылайте ваши работы как всегда из формы на сайте http://prog.agava.ru/, в разделе "Уроки для начинающих программистов >> Послать сообщение". Жду! Лучшие, правильные работы будут опубликованы на сайте на всеобщее обозрение.


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


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

Назад

Hosted by uCoz