Учебник по программированию.

Первые шаги. Язык программирования PascalABC.

 

Предыдущий параграф Назад в содержание Следующий параграф


§18. Сведения, необходимые для программирования под ОС DOS.

Прежде чем начать изучать модуль CRT и начать программировать по ОС DOS необходимо разобрать ряд следующих понятий.

Консольное приложение. Исполняемый файл.

До сих пор результат работы программы мы видели только в «Окне вывода». На самом деле все написанные нами программы это программы под операционную систему DOS. Т.е. они могут работать самостоятельно в этой системе. Возникает уместный вопрос т.к. наша программа может работать самостоятельно, то можно ли её запустить не в среде разработки, и если да, то где она находится. На самом деле если вы ничего не меняли в окне «Настройки» во вкладке «Опции компиляции», то ваши программы ни где не находятся, а существуют только в исходных текстах с расширением PAS.

Дело в том, что когда мы запускаем команду «Выполнить», происходит компиляция программы и автоматический её запуск. Компиляция это создание исполняемого файла с расширением EXE. Именно исполняемый файл это и есть наша «самостоятельная» программа, которую можно запустить не в среде разработки и на другом компьютере. После выполнения программы этот исполняемый файл автоматически удаляется.

Что бы этот файл не удалялся, необходимо убрать галочку в пункте «Удалять EXE файл после выполнения», который находится в окне «Настройки» во вкладке «Опции компиляции». С окном «Настройки» вы уже знакомы. С выбранной вкладкой «Опции компиляции» оно выглядит следующим образом:



Здесь же можно выбрать место, где должен создаваться исполняемый файл, поставив галочку в пункте «Выходные файлы генерировать в папку». Если галочка не стоит, то файлы будут создаваться в папке, которая указана блеклым цветом в поле ниже данного пункта. В том случае если исходный код вашей программы уже сохранен в файле с расширением PAS, то исполняемый файл будет создаваться в той же папке, что исходный код не зависимо от настроек.

Что бы создать исполняемый файл можно или запустить программу на выполнение или просто откомпилировать её командой «Компилировать».

Если вы запустите исполняемый EXE файл в операционной системе Windows, то появится специальное окно для вывода «Досовских» программ. Выглядит оно следующим образом:



Это окно называется консолью. Отсюда появилось следующее название «Консольное приложение». Поэтому все наши программы, написанные под DOS, называются консольными приложениями. Это окно можно развернуть на весь экран с помощью сочетания клавиш «Alt+Enter». В этом случае на экране будет всё то же самое, что и в операционной системе DOS.

Для того, что бы увидеть свою программу в консольном окне, необязательно создавать EXE файл. Можно запустить команду «Выполнить без связи с оболочкой» из меню «Программа». Или нажать сочетание клавиш «Shift+F9». В этом случае наша программа будет выглядеть так:



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

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

Для того, что бы программа завершалась по нажатию клавиши, добавьте в конец программы процедуру readln. В таком случае программа не завершит свою работу до тех пор, пока не будет выполнена данная процедура, т.е. до тех пор, пока вы не нажмёте клавишу «Enter».


Текущий каталог.

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

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


Модуль CRT.

В отличии от TurboPascal, в справке PascalABC.NET почему то нет описания данного модуля. Как можно его изучить без справки? Для этого можно просто открыть его в любом текстовом редакторе или в редакторе кода PascalABC.NET, а затем просмотреть раздел интерфейса. Находится этот модуль в папке LibSource, там же где и PascalABC.NET.

Открыв модуль, вы увидите, что в нём практически всё подписано с помощью комментариев. Т.к. все комментарии на русском языке, то вам должно быть понятно, то что вам нужно на данный момент, а именно что делает та или иная процедура или функция.

Стоит сразу заметить, что при использовании данного модуля необходимо запускать программу на выполнение без связи с оболочкой, с помощью комбинации клавиш «Shift+F9».


Процедуры и функции для работы с курсором.

Курсор это мигающая полоска, которая располагается в том месте, куда в данный момент можно вывести символ. В операционной системе Windows курсор представляет из себя вертикальную мигающую полоску, которая может находиться между символами. В операционной системе DOS это горизонтальная полоска, которая располагается под символами. Соответственно и в консольном окне курсор тоже находится под символом.

Что такое консольное окно мы узнали в одном из предыдущих параграфов. Плюсом к тому, что уже было сказано об этом окне, необходимо сказать, что в консольном окне помещается 25 строк по 80 символов в каждой. Шире консольное окно быть не может, однако если появилось более 25 строк, то в нём появляется полоса прокрутки и его можно прокручивать. Если окно не развёрнуто на весь экран, то можно увеличить его вертикальный размер, при этом в него будет помещаться более 25 строк.

Теперь, объединяя информацию из последних двух абзацев, можно сказать следующее: положение курсора на экране выражается координатами Х и Y. Координата X означает, на сколько символов от левого края отступает курсор. Координата Y означает, в какой строчке сверху находится курсор.

Далее приведены подпрограммы, с помощью которых можно управлять курсором:

function WhereX: integer; возвращает Х-координату курсора.

function WhereY: integer; возвращает Y-координату курсора.

procedure GotoXY(x, y: integer); переводит курсор в координаты (x,y). x порядковый номер символа в строке, y номер строки. Если будут указаны координаты превышающие допустимые значения, то команда будет игнорироваться и выполняться не будет.

procedure ShowCursor; показывает курсор если он скрыт.

procedure HideCursor; скрывает курсор.

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


Функции для работы с клавиатурой.

function KeyPressed: boolean; возвращает true если была нажата клавиша. В PascalABC.NET данная функция не определяет нажатия клавиш Shift, Alt и Ctr, а так же PAUSE, PRTSC и INS.

function ReadKey: char; возвращает символ нажатой клавиши. Данной функцией можно определить какая клавиша была нажата.


Далее в таблице указаны порядковые номера возвращаемых символов, при нажатии некоторых клавиш, которые не являются символами:

Название клавиши

Порядковый номер

Возвращаемого символа

ESC

27

BACK SPACE

8

TAB

9

ENTER

13


При нажатии клавиш, указанных в следующей таблице, функция ReadKey выдаёт символ NUL с порядковым номером 0. Для определения такой клавиши необходимо повторное обращение к этой функции, при этом она выдаёт соответствующий символ, который указан в таблице:


Название клавиши

Порядковый номер

Возвращаемого символа

при повторном обращении

к функции ReadKey

Стрелочка вверх

38

Стрелочка вниз

40

Стрелочка влево

37

Стрелочка вправо

39

HOME

36

PGUP

33

PGDN

34

END

35

F1..F12

112..123

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


Program Opredeleniye_Klavishi;

uses crt;

var cTemp:char;

begin

  while true do

   begin

     if crt.KeyPressed then

       begin

         cTemp:=readkey;

         if ord(cTemp)<>0 then writeln('Символ - ',cTemp,

                                '. Порядковый номер - ',ord(cTemp))

          else

            begin

                writeln('Символ - NUL. При повторном обращении'+

                  ' порядковый номер симвла - ',ord(readkey));

            end;  

       end

   end;

end.

Теперь можем написать программу перемещения курсора по экрану при нажатии клавиш клавиатуры:


Program Kursor;

uses crt;

begin

  while true do

    begin

      if keypressed then

        begin

          if ord(readkey) = 0 then

            begin

              case ord(readkey) of

                38:crt.GotoXY(whereX,whereY-1);

                40:crt.GotoXY(whereX,whereY+1);

                37:crt.GotoXY(whereX-1,whereY);

                39:crt.GotoXY(whereX+1,whereY);

              end;

            end;

        end;

    end;

end.



Процедуры для работы с цветами и фоном.

procedure TextBackground(c: integer); задает цвет фона выводимого текста. c цвет фона.

procedure TextColor(c: integer); задает цвет выводимого текста. c цвет текста.

В модуле CRT определены следующие константы для задания цвета:

 

  Black        = 0;   //Чёрный

  Blue         = 1;   //Голубой

  Green        = 2;   //Зелёный

  Cyan         = 3;   //Cине-зелёный

  Red          = 4;   //Красный

  Magenta      = 5;   //Красновато-лиловый

  Brown        = 6;   //Коричневый

  LightGray    = 7;   //Светло-серый

  DarkGray     = 8;   //Тёмно-серый

  LightBlue    = 9;   //Светло-голубой

  LightGreen   = 10//Светло-зелёный

  LightCyan    = 11//Светло-сине-зелёный

  LightRed     = 12//Светло-красный

  LightMagenta = 13//Светло-лиловый

  Yellow       = 14//Жёлтый

  White        = 15//Белый


procedure ClrScr; очищает экран, заполняя его текущим цветом фона.

procedure ClearLine; очищает линию на которой установлен курсор.

Пример:


Program HelloWorld;

Uses CRT;

begin

while true do

   begin

     TextColor(11);

     TextBackground(Blue);

     GotoXY(33,8);

     Write('                ');

     GotoXY(33,9);

     Write(' Привет всем!!! ');

     GotoXY(33,10);

     Write('                ');

     sleep(700);

     TextBackground(Black);

     gotoXY(1,8);

     clearLine;

     gotoXY(1,10);

     clearLine;

     sleep(700);

     ClrScr;

     sleep(700);

   end;

end.


Результат работы программы нагляднее будет выглядеть в компьютере, поэтому в книге его не привожу.


Процедуры и функции для работы с консольным окном.

function WindowWidth: integer;  возвращает высоту экрана, количество строк помещаемых в консольное окно.

function WindowHeight: integer; возвращает ширину экрана, количество символов помещаемых в строке консольного окна.

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


uses crt;

begin

  while true do

    begin

      clrscr;

      write(WindowWidth,'  ',WindowHeight);

      sleep(100);//Для того, что бы надпись не моргала.

    end;

end.


procedure SetWindowSize(w, h: integer); задает размеры консольного окна. w ширина, h высота в символах. Можно использовать перед началом работы программы.

procedure SetWindowCaption(s: string); задает заголовок консольного окна. Параметр s и есть заголовок. Заголовок находится в левом верхнем углу консольного окна. Если заголовок не установить, то на месте заголовка будет высвечено название выполняемого файла.


В данном параграфе мы узнали,  такое консольное приложение и исполняемый файл. А так же изучили модуль CRT.


Задачи.

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

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

3.  Написать следующую программу: пользователь нажимает на клавишу, а компьютер выдаёт сообщение о том, какая клавиша была нажата. За основу можете взять программу Opredeleniye_Klavishi.


Решение.

1. Вариантов решения данной задачи может быть превеликое множество, поэтому оставляю её на самостоятельное решение.

2.

Program HelloWorld_2;

Uses CRT;


var x,y:integer;


Procedure WhriteHellow;

begin

     TextBackground(Blue);

     GotoXY(x,y);

     Write('                ');

     GotoXY(x,y+1);

     Write(' Привет всем!!! ');

     GotoXY(x,y+2);

     Write('                ');

     TextBackground(Black);

end;


Procedure Peremesheniye;

begin

   if keypressed then

     begin

       if ord(readkey) = 0 then

         begin

           ClrScr;

           case ord(readkey) of

             38:if y>=2 then y:=y-1;

             40:if y<=(WindowHeight-3) then y:=y+1;

             37:if x>=2 then x:=x-1;

             39:if x<=(WindowWidth-16) then x:=x+1;

           end;

           WhriteHellow;

         end;

     end;

end;


begin

SetWindowCaption('Hellow World 2.');

HideCursor;

x:=1;

Y:=1;

TextColor(11);

WhriteHellow;

while true do

   begin

     Peremesheniye;    

   end;

end.


3. Данную задачу решите самостоятельно. Думаю, её не трудно будет сделать из программы Opredeleniye_Klavishi.




Предыдущий параграф Назад в содержание Следующий параграф