[ главная ]   [ рейтинг статей ]   [ справочник радиолюбителя ]   [ новости мира ИТ ]



Ответов: 0
25-02-12 07:01







   Web - программирование
PHP


ASP






XML



CSS

SSI





   Программирование под ОС











   Web - технологии








   Базы Данных









   Графика






Данные




Программирование под ОС / Pascal - Delphi /

Модули. Мастерим падающие снежинки

Модули - это отдельные файлы, содержащие дополнительные процедуры.

 Дело в том, что сам язык Паскаль имеет довольно ограниченное количество процедур и функций, они не позволяют производить некоторые действия. Для этого и существуют модули - они содержат в себе действия, расширяющие язык. При этом все процедуры в модулях собраны по тематическим группам. Например, модуль Graph содержит функции работы с графикой - построение линий, окружностей, многоугольников, дуг, рисование точек и т.д. Модуль DOS - позволяет обращаться к системным средствам MS-DOS, таким как чтение/удаление/создание каталогов, обращение к самой системе. Модуль CRT - позволяет обращаться к средствам консоли (клавиатура+экран): перемещать курсор в любое положение, очищать экран, менять цвет букв и фона, читать и опрашивать клавиатуру (в чем разница объясню позже), создавать текстовые окна и мн. другое.

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

Использование модуля

Сами модули храняться во внешних файлах, которые имеют расширение ".tpu" - Turbo Pascal UNIT (англ. "Модуль турбо паскаля"). Однако не всегда этот файл может существовать. К примеру, использование модуля Graph требует наличия файла graph.tpu, а вот использование модуля Crt обходиться и без файла crt.tpu. Почему, спросите вы? Дело в том, что процедуры этого модуля находятся в т.н. "Системном модуле", иначе говоря в файле "turbo.tpl". Этот файл содержит в себе все внутренние функции Турбо Паскаля и некоторых его модулей. Теперь понимаете, почему у вас не работал один файл "turbo.exe"?

Сегодня мы и займемся модулем CRT. Скажу сразу, что он содержит довольно большое количество процедур и функций, сегодня мы пройдем только основные, требующиеся нам для написания нашей новогодней программы. Да и выпуск как-никак праздничный, поэтому я постараюсь быть краток :))

Итак, чтобы работал модуль Crt и вы могли использовать его функции и процедуры, не нужно никаких дополнительных программных средств. Если вы пользуетесь дистрибутивом, который скачали с моего сайта (файлы turbo.exe, turbo.tpl, tubo.tph), то вам его вполне хватит! Я ведь уже упоминал о том, что весь Crt находиться в turbo.tpl.

Подключение модулей к программе происходит с помощью служебного слова uses, после которого указывается имя модуля. Причем uses обязательно должно быть в самом начале программы, но после слова Program. Вот пример подключения Crt:

Program UsesCrt;
uses crt;
begin
.
.
end.

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

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

1: Процедура ClrScr, модуль: CRT. (сокр. от англ. Clear Screen - очистка экрана).

Эта продедура очищает экран. Если вы знакомы с бейсиком, то знаете процедуру CLS. Аналогичная операция есть и в операционной системе MS-DOS - также называется CLS. ClrScr делает тоже самое.

2: Процедура GotoXY(X, Y: Byte;), модуль: CRT.

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

GotoXY(80,25);

И еще: смотрите пример использовая этой процедуры не только в программе "Снежинки", но и в раделе "Вопросы-ответы". Там есть интересный пример использования.

3: Процедура Delay(A: Word;), модуль: CRT. (анг. "Задержка");

Эта процедура выполняет задержку программы на указанное количество миллисекунд. Указывается оно параметров A, который, как видите, не может быть отрицательным. Используется эта процедра при необходимости замедлить выполнение программы - например, в сегодняшней программе "Снежинки" она тормозит сам ход снегопада - без ее использования все выпонялось бы слишком быстро.

4: Функция ReadKey: Char;, модуль: CRT.

Эта функция возвращает от своей работы последнюю нажатую клавишу. Очень похоже на работу Readln, только не ждет нажатия и завершается сразу же при нажатии клавиши. При этом в переменную Char, к которой присваивается эта функция, заноситься введенный символ. Применение см. в разделе "Вопросы-ответы".

Ну и последняя процедура (точнее, функция) из модуля CRT, которая нам сегодня понадобиться:

5: Фукнция KeyPressed: Boolean;, модуль: CRT.

Эта функция возвращает TRUE если была нажата клавиша. Помните, я выше говорил про разнацу между "чтением" клавиатуры и "опрос" клавиатуры. Вот здесь как раз и используется эта разница: KeyPressed - это опрос клавиатуры. Readln - это чтение. (В модуле Crt также есть похожая функция - ReadKey). Разница здесь в том, что при чтении клавиатуры программа ждет, пока с нее не будут введены данные. При опросе нет ожидания и если клавиша сразу не была нажата, то программа продолжает свою работу. Получше вы сможете разобраться когда будете использовать эту функцию.

Ну и завершающий этап перед самим текстом программы - это новый раздел - const. В нем описываются константы, используемые в программе. Далее все понятно на наглядном примере. Помните, что так можно описывать и строку и символ и даже массив:

const

S='Here is string.'; { Константа - строка }

A: Array[1..5] of Char = ('a','b','c','d','e'); { Массив }

(в фигурных скобках указаны комментарии)

Итак, сегодня это все, что нам понадобиться. Пишем программу:

{ СHЕЖИHКИ }
uses crt;
const n=79;
Var
x:array[1..n] of byte;
i,k:byte; c:char;
Begin
clrscr;
for i:=1 to n do
begin
x[i]:=0;
end;
repeat
k:=random(80);
if x[k]=0 then x[k]:=1;
for i:=1 to n do
begin
if x[i]>0 then
begin
gotoxy(i,x[i]);
write(' ');
x[i]:=x[i]+1;
gotoxy(i,x[i]);
write('*');
if x[i]>23 then x[i]:=0;
end;
end;
delay(100);
until keypressed;
end.

При выполнии этой программы обратите внимание на Delay, чтобы добиться лучшего эффекта, установите его соответсвующим образом, в зависимости от вашего компьютера. К примеру, на моем компьютере (Pentium III 800) это дело работает только с параметром Delay(2000). Меньше - слишком быстро. Кроме того, автор программы также рекомендует проделать над ней следующее:

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

  2. снежинки падают под углом, в одну сторону, две стороны <= и =>

Что и будет вам сегодня новогодним заданием! Решайте!


Вопросы - ответы (расширенный раздел)

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

Вопрос 1. Можно ли в Паскале специально на некоторое время задерживать действия, т.е. производить действия через какой-либо заданный отрезок времени? (например: произвести какое-нибудь действие, а только через 3 секунды произвести другое)

Да, для этого используйте вышеописанную процедуру Delay из модуля Crt.

Вопрос 2. В выпуске 11 от 14 ноября 2000 г. предложена программка печатающая цикл из вещественных чисел от 1.00 до 1.90 с шагом 0.1. В разделе VAR Вы предлагаете переменным A и Step задать вещественный тип Single, я попробовал выдаёт ошибку: Error 116: Must be in 8087 mode to compile this. Попробовал использовать другие типы Double, Extended, Comp, результат тот-же, получилось нормально только с типом Real, я думал вначале что может название типа не так записываю, но тогда должен был выдать Error 3: Unknown identifier. Как это было пару раз раньше (написал bate, вместо byte). Да, у меня стоит полный Pascal 7.1 если конечно это имеет какое-то значение.

Нет, то что у Вас стоит Pascal 7.1 значения не имеет. Тут дело в том, что при вычислениях чисел некоторых вещественных типов используется сопроцессор. Сопроцессор (FPU) это - дополнение к Вашему центральному процессору (CPU), он берет на себя часть математических вычислений (в том числе вещественных чисел - с плавающей точкой), снижая нагрузку на CPU.

В Паскале, чтобы использовать таковой необходимо включить соответсвующую опцию: меню Options, пункт Compiler..., далее в разделе Numeric Processing поставьте отметьте (пробелом) пункт 8087/80287.

Вопрос 3. Может ли Паскаль считывать данные до нажатия "Ввода" (Например, как в Windows: нажмите Esc для отмены)?

Да, конечно можно. Для этого используйте функцию ReadKey: Char из модуля Crt (см. выше), которая читает последний введенный символ. Создайте цикл с проверкой на необходимую клавишу и все! Вот пример чтения строки до нажатия Esc (аналог Readln, только с Esc):

Program N1;
uses Crt;
var
C: Char;
S: String;
begin
Write('Введите строку (Esc - конец ввода): ');
Repeat
C := ReadKey;
Write(C);
if S <> #27 then S := S + C;
Until C = #27;
Writeln;
Write('Вы ввели строку: ', S);
Readln;
end.

Комментарии:

Во-первых, обратите внимание на символ #. Этим символом указываются специальные клавиши, к примеру Esc - #27, Enter - #13 и т.д. Более подробную таблицу я приведу в дальнейшем на сайте.

Далее - я вывожу прочитанную переменную на экран. Зачем? Да потому, что ReadKey не выводит прочитанный символ на экран, только возвращает его программе.

И последнее - до того, как дополнить строку введенным символом, я проверяю его на #27 (Esc). Делаю это затем, чтобы сам символ #27 не записывался в строку. Думаю, вы и сами уже догадались.

Вопрос 4. Можно ли сделать ввод данных скрытым звёздочками (***), например, как при вводе пароля?

Думаю, я уже ответил на этот вопрос в предыдущем примере. ReadKey - не выводит символы на экран. Можно вместо Write(C) поставить Write("*");

Вопрос 5. Есть ли в Паскале функция, с помощью которой внутренний динамик может "бипнуть" (Примерно, как при загрузке компьютера)?

Да, есть. Для этого в модуле CRT существует две взаимосвязанные процедуры:

  1. Sound(Hz: Word);

  2. NoSound;

Sound(Hz: Word) - вызывает звук, подаваемый через системный динамик, с указанной частотой в Герцах. Звук будет верещать пока не будет вызвана процедура NoSound.




Комментарии

 Ваш комментарий к данному материалу будет интересен нам и нашим читателям!



Последние статьи: Программирование под ОС / Pascal - Delphi /

Работа со шрифтами на Win API
06-06-2010   

Сегодня поговорим о шрифтах, и о том, каким образом работать с ними на Win API. Нам потребуется переменная типа HFONT. Изменить стиль шрифта можно у любого компонента, я покажу это на примере кнопки... подробнее

Кол. просмотров: общее - 3463 сегодня - 1

Работа с таймером на Win API
06-06-2010   

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

Кол. просмотров: общее - 3455 сегодня - 1

Работа с мультимедийным таймером на Win API
06-06-2010   

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

Кол. просмотров: общее - 3582 сегодня - 1

Создание CheckBoxов средствами Win API
06-06-2010   

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

Кол. просмотров: общее - 3697 сегодня - 1

Создание группы RadioButton средствами Win API
06-06-2010   

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

Кол. просмотров: общее - 3515 сегодня - 0



  WWW.COMPROG.RU - 2009-2012 | Designed and Powered by Zaipov Renat | Projects