* При перепечатке материалов ссылка на www.SeoLiga.ru обязательна!
Консольные приложения
15 апреля 2009
В первой главе, при ознакомлении с графическим интерфейсом пользователя, для демонстрации примеров использовались приложения типа VCL Form Application. Одна- ко для изучения языка Delphi значительно удобнее использовать приложения типа Console Application (консольное приложение). Здесь не надо думать о графическом ин- терфейсе, а ввод и вывод на экран информации происходит значительно проще. По- этому не надо отвлекаться на посторонние вещи, думайте только об особенностях языка. К графическому интерфейсу и приложениям типа VCL Form Application мы обя- зательно вернемся в следующих главах, так как они используются в подавляющем большинстве программ, написанных на Delphi.
Итак, создадим консольное приложение, что делается так же, как и для всех других приложений, которые можно создать несколькими способами. Можно щелкнуть на пиктограмме New Items на панели Standard, можно использовать команды меню File1* New=>Other или последовательно нажать клавиши <AltoFc>Ni=>0>. Затем в открывшемся окне New Item необходимо выбрать папку Delphi for .NET, чтобы дважды щелкнуть на пик- тограмме Console Application. При этом будет создан новый проект с одной вкладкой редак- тора кодов со стандартным кодом по умолчанию (см. предыдущий раздел). Вкладки с формой создаваться не будет, так как вывод будет происходить в окно DOS. Для того чтобы лучше понять работу консольного приложения, создадим простей- шую программу. Для этого дополните стандартный код, созданный по умолчанию, несколькими выражениями, как показано в приведенном ниже листинге. program Project2; {$АРРТУРЕ CONSOLE} u s e s S y s U t i l s ; v a r a : C a r d i n a l ; b: Cardinal; begin { TODO -oUser -cConsole Main : Insert code here } a := 3; b := 4; W r i t e d n t T o S t r ( a ) + ' + ' + I n t T o S t r ( b ) + ' = ' ) ; Write(a+b); Readln; end. Здесь добавилось ключевое слово var, затем идут объявления переменных а и Ь, которые объявлены как целочисленные значения без знака (натуральные числа), о чем говорит слово Cardinal, которое определяет тип переменной. Тип любой пе- ременной всегда объявляется только таким образом, т.е. после имени переменной ста- вится двоеточие, а затем идет тип, который может быть как стандартным типом, так и созданным самим пользователем. Когда говорится об объявлении переменной, то имеется в виду, что, встретив код объявления переменной, компилятор создает эту переменную, выделяя место в па- мяти в соответствии с присвоенным ей типом. Во многих случаях на это место запи- сывается нулевое значение, но лучше всегда самому присвоить вновь созданной пе- ременной необходимое значение. Подобным образом следует описать все переменные, используемые в программе, иначе компилятор не сможет разобраться в программе и выдаст сообщение об ошиб- ке. Далее этим переменным присваиваются значения. Это делается в начале блока begin...end, где размешается разрабатываемая программа. Затем идет процедура write (Записать). В данном случае необходимо вывести (записать) на экран сумму двух чисел, которым уже присвоены значения. Процедура Readln (Считать) заканчи- вает программу пользователя. Она необходима для того, чтобы оставить открытым ок- но DOS, в котором будет отображаться результат сложения (рис. 3.1). Без процедуры Readln окно DOS после вывода результата моментально закроется, так как программа будет завершена, а наличие этой процедуры требует ввода какого-либо значения, что не позволит закончить программу. Нажатия любой клавиши будет достаточно для то- го, чтобы программа завершилась. Теперь напишем такую же программу сложения двух чисел, в которой слагаемые можно вводить в процессе работы программы. Выглядеть она будет так. program Projectl; {$APPTYPE CONSOLE} uses SysUtils; var a: Cardinal; b: Cardinal; begin { TODO -oUser -cConsole Main : Insert code here } Write('Input a: ' ) ; Read(a); Write('Input b: ' ) ; Read(b); Write('Result: ' ) ; Writeln(a+b); Write('Press any key1); Readln; Readln; end. Если посмотреть внимательнее, то структура программы не изменилась, только вместо присваивания переменным значений появились вызовы процедур Write и Read. Таким образом можно вводить необходимые значения с экрана. После появ- ления надписи input а: необходимо ввести нужное число и нажать клавишу <Enter>. То же самое сделайте в ответ на запрос input b:. После нажатия клавиши <Enter> появится результат. В некоторых случаях вместо слова w r i t e используется слово Writeln. Суффикс In необходим, если после ввода или вывода значения должен быть сделан переход на новую строку. С аналогичной целью используется и процедура Readln, которая считывает неотображаемые символы перехода на новую строку и установки курсора в начало строки. Сделаем еще одно изменение, чтобы наша программа напоминала простейший калькулятор. program Projectl; {$APPTYPE CONSOLE} uses SysUtils; var a, b, sign: Cardinal; begin { TODO -oUser -cConsole Main : Insert code here } while a<>0 do begin Write('Input a: ' ) ; Read(a) ; Write('Input b: ' ) ; Read(b); Write('Operation: ') ; Read(sign); if sign=l then begin Write(' **Result: ' ) ; Writeln(a+b); end else begin Write(' **Result: ' ) ; Writeln(a-b); end end; end. Если запустить эту программу на выполнение, то можно постоянно вводить два числа и получать результат, не выходя из программы, как это было раньше. Для этого фрагменты ввода и вывода значений помещены в конструкцию, обеспечивающую циклическое повторение программы, это ключевые слова while. . .do (пока...делать). После них идет блок повторяющихся кодов, расположенных между ключевыми сло- вами begin. . .end;. После слова end стоит точка с запятой, что говорит о заверше- нии блока, но не о завершении программы. Как видим, условие выхода из цикла оп- ределяет выражение а<>0, т.е. пока а не равно 0, цикл будет постоянно повторяться. Как только а станет равным нулю, управление моментально будет передано строке, находящейся за концом цикла, т.е. end.. Это конец программы. Здесь еще введена третья переменная sign. Это будет конструкция выбора ариф- метической операции. Если в ответ на запрос "Operation:" ввести 1, то это будет означать суммирование, а любое другое число вводится при вычитании — для этого создана конструкция if.. .then.. . e l s e (если...тогда...иначе). Чтобы можно было использовать отрицательные значения, я поменял тип переменных — из Cardinal (натуральные) на integer (целочисленные, допускающие отрицательные значения). Разработчики Delphi рекомендуют использовать групповые типы Cardinal и Integer, так как для них оптимизированы математические вычисления, т.е. мате- матические операции с ними выполняются быстрее, чем с другими типами. Эти типы называются групповыми потому, что они Хотя часто приходится использовать и другие типы, например, с целью экономии памяти или если необходимы вещест- венные числа (числа с плавающей запятой). Запустите эту программу и убедитесь, что можно складывать и вычитать два числа в цикле. Выход из программы произойдет, если первому числу присвоить значение 0. Как видите, использование даже самых простейших средств позволило создать ра- ботающую и полезную программу. Постарайтесь понять всю программу. Большие и сложные приложения проектируются таким же образом, но, разумеется, в них ис- пользуется больше специфических конструкций, ключевых слов и операторов, изуче- нием которых сейчас и займемся.