Книга
Книга
ГЛАВА 1
От алгоритма к программе
Решение задач на персональном компьютере представляет собой диалог между человеком и электронной машиной на языке программирования. Этот диалог будет успешным только тогда, если правильно понята поставленная задача, разработан план ее решения, и она представлена в виде отлаженной программы на выбранном языке программирования.
Что такое алгоритм?
Ежедневно каждому человеку, как в своей профессиональной деятельности, так н в жизни, приходится решать ряд возникающих перед ним задач. Опыт показывает, что решение проблемы будет происходить быстрее, успешнее и эффективнее, если у человека есть готовый план или рецепт решения этой задачи. Такой план может быть составлен человеком самостоятельно на основе собственных знаний н жизненного опыта, или при условии, что у него есть возможность воспользоваться рецептом решения проблемы, составленным кем-то ранее, и проверенной на практике. В любом случае использование такого плана при четком и неукоснительном соблюдении его положений должно привести, в конечном счете, к решению задачи. Такая последователь^ ность четких однозначных указаний, разработанных для решения поставленной задачи, называется алгоритмом.
Одним из наиболее простых примеров алгоритма являются правила перехода улицы пешеходом. Их можно свести к нескольким пунктам.
Перед началом перехода улицы посмотреть налево и убедиться, что в непосредственной близости не находится движущийся транспорт.
В случае если вблизи пешехода находится движущийся транспорт, подождать, пока он проедет. Если транспорта нет, нанать переход улицы и дойти до середины проезжей части.
Дойдя до середины проезжей части, посмотреть направо для проверки наличия или отсутствия в непосредственной близости движущегося транспорта.
В случае если вблизи находится движущийся транспорт, подождать, пока он проедет. При отсутствии транспорта можно завершить переход улицы.
Естественно, что когда человек, проживший достаточно длительное время в большом городе, переходит улицу, он необязательно должен вспоминать все указанные ранее правила, т. к. они уже будут запечатлены у него в мозгу на подсознательном уровне. Но при решении какой-либо более сложной задачи даже на бытовом уровне, особенно на первых порах, без тщательного соблюдения всех инструкций, изложенных “на бумажке”, часто не обойтись. Примером такого более сложного алгоритма является инструкция по пользованию банкоматом, с помощью которого в настоящее время получают зарплату сотрудники многих организаций и предприятий. Такая инструкция состоит из следующих пунктов:
Вставить кредитную карточку в банкомат определенным образом (как правило, логотипом банка, изображенным на карточке, от себя).
Набрать индивидуальный цифровой код владельца карточки, после чего нажать клавишу Ввод.
Выбрать язык, на котором пользователь дальше будет общаться с банкоматом (как правило, в нашей стране банкоматы запрограммированы на работу с двумя языками: русским и английским), подтвердив выбор нажатием соответствующей клавиши.
Выбрать операцию, которую пользователь будет производить с банкоматом, из списка, приведенного на экране банкомата (это может быть получение денег, получение сведений о нескольких последних операциях, произведенных со счетом пользователя» получение информации справочного характера о работе сети банкоматов и т. &), нажав клавишу, соответствующую выбранной операции.
В случае если пользователю необходимо получить деньги со счета, ответить на вопрос, хочет ли он получить также н чек, в котором будет указан размер полученной суммы и остаток денег на счете.
Ввести сумму, которую пользователь хочет получить со счета и подтвердить ее правильность нажатием клавиши Ввод. В случае если снимаемая пользователем со счета сумма превышает ту сумму, которая находится в данный момент на счете пользователя, ввести другую, меньшую по величине сумму.
Подождать несколько секунд, пока банкомат отсчитывает требуемую сумму, а затем, после появления разрешающей надписи на экране банко-
мата, вынуть из банкомата кредитную карточку, а затем забрать деньги н чек.
Такой же набор инструкций может быть с успехом использован для решения задач из различных областей науки и техники. В качестве простого примера приведем алгоритм нахождения среднего арифметического ряда, состоящего из нескольких чисел. Такой алгоритм состоит всего из двух пунктов.
. Сложить все числа ряда.
. Разделить полученную сумму на число членов ряда. Полученное частное н будет средним арифметическим.
Все три приведенные примеры алгоритмов относятся к разным сферам человеческой деятельности, однако можно заметить, что у них имеются некоторые общие свойства, которыми должен обладать любой работоспособный алгоритм.
Понятность— тот, кто выполняет алгоритм, должен понимать, как на основе алгоритма и имеющихся исходных данных можно получить искомый результат.
Дискретность— процесс решения задачи можно разбить на несколько этапов (пунктов), каждый из которых представляет собой некоторое законченное действие.
П Определенность — каждый пункт алгоритма должен быть сформулирован четко и однозначно и не оставлять места для произвольного толкования.
Результативность — с помощью алгоритма задача должна быть решена за конечное число шагов.
口 Массовость — алгоритм должен быть пригоден для решения целого класса задач, если такие задачи отличаются друг от друга только различными исходными данными.
Правильность ——решение задачи, полученное посредством использования алгоритма, должно соответствовать действительности.
Важной особенностью правильно составленного алгоритма является то, что он может выполняться не только человеком, но и любым устройством, которое в состоянии механически, не размышляя, выполнять указанные в алгоритме действия. Часто человека или подобное устройство называют исполнителем алгорипша. В качестве исполнителя, например, может выступать персональный компьютер- При этом, однако, нужно иметь в виду, что алгоритм, по которому работает компьютер, должен быть задан на понятном ему (компьютеру) языке, что требует иной записи алгоритма, нежели та, которая была использована в приведенных примерах. В данных примерах применялась словесная форма записи алгоритма, помимо которой используются еще две формы записи: графическая и в виде программы, написанной на каком- либо из языков программирования.
Графически форма записи удобна для более компактного и наглядного представления различных элементов, из которых складывается алгоритм. При графическом представлении алгоритм изображается в виде последовательности связанных между собой блоков, каждый из которых соответствует выполнению одного или нескольких действий и изображается в виде определенной геометрической фигуры. Такой способ представления алгоритма на^ зывается блок-схемой или графической схемой, что более правильно, т. к. соответствует названию, употребляемому в государственном стандарте. Наиболее часто употребляемые блоки, входящие в состав графических схем, приведены на рис. 1.1.
Начало, конец алгоритмаНачало, конец алгоритмаВвод и вывод данныхВвод и вывод данныхВычисленияВычисленияПроверка условияПроверка условия
Начало, конец алгоритма
Начало, конец алгоритма
Ввод и вывод данных
Ввод и вывод данных
Вычисления
Вычисления
Проверка условия
Проверка условия
ООУзелУзелПодпрограммаПодпрограмма
О
О
Узел
Узел
Подпрограмма
Подпрограмма
Вывод на принтерВывод на принтер
Вывод на принтер
Вывод на принтер
Рис. 1.1. Изображения основных блоков, используемых при составлении графических схем
Поясним назначение этих блоков. Блоки м начал о1* и "коней" используются для обозначения начала и конца алгоритма. Внутри обозначающей их фигуры пишется слово "начало" или "коней". Ввод и вывод соответственно используются для ввода исходных величин, необходимых для решения задачи, или вывода полученных результатов. Соответствующие величины указываются внутри параллелограмма, обозначаюшего ввод или вывод. Обработка данных (как правило, это какие-либо вычисления) изображается в виде прямоугольника. Внутри прямоугольника записывается содержание этих вычислений.
Проверка определенного условия изображается в виде ромба. Само условие записывается внутри ромба. В результате проверки условия осуществляется выбор одного из двух возможных путей дальнейшего выполнения алгоритма.
s=a】+a2+…...+an,i+3n
Рис. 1.2. Графическая схема нахождения среднего арифметического
Запишем в виде графической схемы процесс вычисления среднего арифметического (рис. 1.2). После блока, означающего начало алгоритма, находится блок ввода исходных данных, к которым в этом случае относятся п ——число членов ряда и значения членов этого ряда аь а? и т. д. вплоть до последнего члена ряда ап. Эти блоки, как и все входящие в состав графической схемы, объединяются друг с другом прямыми линиями. Следующий прямоугольный
блок представляет собой процесс вычисления ——нахождение величины s, являющейся суммой членов ряда. Следующий блок также относится к разряду блоков обработки информации. На этот раз в нем производится операция деления, которая позволяет найти величину as — искомое среднее арифметическое членов ряда. В предпоследнем блоке осуществляется вывод полученного результата. Последний блок представляет собой конец алгоритма, о чем опо- вещаег соответствующая надпись внутри него.
Приведенный способ записи является, как уже говорилось, более строгим и лаконичным, чем словесное описание алгоритма, и нередко используется на этапе подготовки к решению задачи на компьютере, но непосредственно в компьютер для получения искомого результата графическую схему вводить нельзя, так же как и словесный рецепт. Единственный способ описания алгоритма, который непосредствен но понятен центральному процессору компьютера (центральный процессор— это компьютерное устройство, координирующее работу всех прочих устройств компьютера и выполняющее элементарные арифметические и логические операции) н с которым он может в дальнейшем работать, является компьютерная программа^ записанная на одном из языков программирования. Об этих понятиях и пойдет речь в следующем разделе книги.
Программа и языки программирования
Итак, если попытаться дать в самом общем виде определение компьютерной программе, то можно сказать, что программа— это алгоритм, понятный компьютеру. Только язык, на котором написаны программы, понятен компьютеру, а при отсутствии программ компьютер из полезного, а во многих случаях незаменимого для современного человека успройства, превращается в абсолютно бесполезный набор микросхем и проводов. Процесс обработки информации, осуществляемый компьютером, требует наличия как технических средств (называемых часто англоязычным словосочетанием hardware или русскоязычным жаргонным словом "железо"), так и программного обеспечения (называемого software или "со巾т"). Программированием называется процесс создания компьютерной программы.
Единственным языком, который непосредственно понимает процессор компьютера, является язык маиатных кодов, который представляет собой последовательность двоичных чисел, изображаемых нулями и единицами. Эта особенность языка машинных кодов объясняется причинами технического характера. Оказалось, что технически гораздо легче построить компьютер на базе элементов, каждый из которых может находиться в одном из двух устойчивых состояний, одно из которых соответствует нулю, а другое единице. Когда в 40-е годы XX века были созданы первые компьютеры, то машинный
код был единственным языком, на котором составлялись компьютерные программы. Естественно, что составление программ на таком языке является для человека крайне скучным и утомительным процессом, чреватым к тому же многочисленными ошибками. Еще одним существенным недостатком машинных кодов является то, что они привязаны к компьютерам определенной модели, конструкции. Созданные для компьютера одной конструкции программы в машинных кодах нельзя переносить без соответствующей переработки на компьютеры другой конструкции.
Уже через несколько лет после появления первых компьютеров для облегчения и упрощения работы программистов был создан язык ассемблера^ в котором команды машинных кодов заменялись более понятными для человека. Такими командами в основном были сокращенные слова английского языка. Эти более удобные для запоминания команды называют мнемоническими или мнемониками языка ассемблера. Язык ассемблера до сих пор употребляется для составления программ в тех случаях, когда предъявляются повышенные требования к компактности программ. Программы, написанные на языке ассемблера, требуют минимального объема памяти и времени выполнения. Однако этот язык сохранил ряд существенных недостатков своего предшественника —языка машинных кодов. Это, во-первых, достаточно жесткая привязка языка к компьютерам определенной конструкции. Во-вторых, как н в случае с машинными кодами, язык ассемблера требует очень высокой квалификации программиста, знания не только нюансов программирования, но и знания тонкостей устройства компьютера, особенно в том, что касается архитектуры его центрального процессора. Поэтому язык ассемблера называют машинно-ориентированным языком. По отношению к машинным кодам и языку ассемблера употребляют термин "языки низкого уровняи9 т. к. они максимально приближены к уровню технических устройств компьютера.
Следующим шагом в развитии программирования стало создание алгоритмических языков высокого уровня. Такие языки еще удобнее для понимания, чем команды ассемблера, т. к. они включают в себя обычные слова человеческого языка и общепринятые обозначения математических операций. Команды языков высокого уровня (называемые также операторами) зачастую напоминают фразы, составленные на английском языке. Надо сказать, что именно английский язык, являющийся в настоящее время языком международного общейия9 своего рода латынью XX—XXI веков, стал основой, на которой было создано подавляющее большинство языков программирования высокого уровня. Кроме того, языки высокого уровня стали машинно-независимыми, т. е. программы, написанные на таких языках, можно без труда переносить с одного компьютера на другой. Первым широко распространенным во всем мире языком программирования высокого уровня стал язык Фортран, созданный в первую очередь для решения различных научно-технических
задач. Название этого языка представляет сокращение английского словосочетания formula translation, что означает "перевсщ формул**, т. е. имеется в виду перевод различных математических формул с обычного человеческого языка на язык, понятный компьютеру. За ним последовали такие языки высокого уровня, как Кобол, Алгол, Паскаль, Бейсик, Си и многие, многие другие.
Говоря о достоинствах языков программирования высокого уровня, надо иметь в виду, что процессор компьютера не может воспринимать эти языки непосредственно. Для того чтобы компьютер мог выполнять программы, написанные на этих языках, ему требуется перевод их в машинные коды. Такой перевод осуществляется с помощью специальных программ, называемых трансляторами. Трансляторы делятся на две основные категории. В одних случаях транслятор непосредственно переводит строку за строкой команды языка высокого уровня в машинные коды, которые немедленно выполняются. Такой способ трансляции называется интерпретацией и используется, например, для перевода в машинные коды программ, составленных на языке Бейсик. Для большинства других языков высокого уровня, включая язык Паскаль, используется другой способ трансляции, который заключается в том, что программа обрабатывается целиком, а затем на ее основе создается модуль в машинных кодах. Такой способ обработки программ называется компиляцией.
Каждый из этих способов трансляции имеет свои достоинства и недостатки. Составление программ на интерпретируемых языках часто бывает легче для программиста, т. к. многие ошибки в программе выявляются уже на стадии ввода ее текста в компьютер. После ввода очередной строки текста программы интерпретатор сразу выдает сообщение об ошибках (естественно, при наличии таковых). Однако за удобство программирования на интерпретируемом языке приходится расплачиваться быстродействием составленных на этом языке программ. Такая программа работает в несколько десятков раз медленнее, чем программа, переведенная в машинные коды посредством компилятора. Последнее обстоятельство, как правило, оказывается более важным, поэтому в большинстве случаев для создания программ, особенно на профессиональном уровне, используются компилирующие языки.
Этапы работы над программой. Система программирования
Из сказанного в предыдущем разделе понятно, что составление программ даже с помощью современных средств и языков программирования не является неким одномоментным процессом, а включает в себя ряд последовательных этапов.
Перечислим основные этапы:
Постановка задачи. Для того чтобы правильно составить программу, программисту нужно предварительно решить для самого себя, чего он хочет добиться, составляя программу, достаточно четко и конкретно сформулировать задачу, решаемую с помощью программы, определить, какие исходные данные необходимы для ее решения и какой требуется получить результат.
Нахождение оптимального метода решения задачи и создание соответствующего алгоритма. Для того чтобы поставленную задачу можно было успешно решить, программист должен вначале хотя бы в общих чертах составить план решения задачи, наметить наиболее надежный и эффективный путь ее решения. Часто бывает полезно перед тем, как начать составлять программу на компьютере, изобразить на бумаге ее алгоритм в виде графической схемы либо изложить в словесном виде основные пункты ее решения.
Запись текста программы на языке программирования. Этот процесс часто называют также кодированием программы, т. е. происходит перевод алгоритма в код, понятный компьютеру либо непосредственно (в случае языков низкого уровня), либо через переводчика — программу-транслятор (в случае языков высокого уровня). Для того чтобы можно было набирать текст программы, необходимо наличие на компьютере специальной программы —текстового редактора. Текстовым редактором называется программа, с помощью которой пользователь может осуществлять операции ввода и редактирования текста. Под редактированием текста понимается его правка, исправление обнаруженных в тексте ошибок. Наличие возможностей правки является обязательным элементом текстового редактора, т. к., во-первых, набор текста практически любой программы, особенно у неопытных пользователей на начальном этапе обучения программированию, не обходится без опечаток. Во-вторых, даже опытный программист часто в ходе составления программы осуществляет оптимизацию программы, т. е. делает уже работающую программу более качественной и эффективно работающей, что требует удаления определенных фрагментов программы и замены их новыми.
Текст программы, уже набранный и откорректированный, находится до определенного момента в оперативной памяти компьютера. Если программа не является "одноразовой", необходимой для получения только один раз некоторых результатов (а такими, как правило, бывают только программы, написанные для тренировки, в учебных целях), то ее следует сохранить на жестком диске компьютера в виде отдельного файла. Файлом называется область на диске компьютера, имеющая свое собственное имя н служащая для хранения программ и данных. В противном случае
(если не сохранить программу в файле) сразу после выключения компьютера содержимое его оперативной памяти очистится, а вместе с ним пропадет и набранный пользователем текст программы.
Проверка программы. Данный этап начинается с того, что программа запускается на трансляцию. При этом программа-транслятор проверяет исходный текст программы (называемый также исходным кодом) на правильность с точки зрения орфографии и синтаксиса того языка программирования, на котором составлен текст данной программы. При обнаружении подобных ошибок транслятор выдает об этом соответствующее сообщение. В этом случае программа заведомо не будет работать, поэтому в случае выдачи сообщений об ошибках пользователь должен внести в программу соответствующие коррективы^ а затем снова запустить ес на трансляцию. В том случае, если в тексте программы транслятором не было обнаружено явных ошибок, на основе исходного кода программы транслятор создает перевод текста программы в машинные коды, называемый объектным модулем.
Однако объектный модуль еще не является готовой к выполнению на компьютере программой. Дело в том, что практически ни одна современная компьютерная программа не обходится без использования некоторых вспомогательных программ, разработанных ранее другими программистами. Такие вспомогательные программы называются стандартными подпрограммами и объединяются в специальные библиотеки. Подключение же этих библиотек производится с помощью специальной программы, называемой редактором связей. После подключения необходимых стандартных подпрограмм и создается готовая к выполнению программа, называемая исполняемым модулем.
Отладка программы. Нередко встречается ситуация, когда пользователь составил программу, в которой отсутствуют грамматические ошибки, но тем не менее программа не выдает желаемого результата, либо выдает результат в неправильном виде. Такая ситуация говорит о том, что в программе имеются семантические (смысловые) ошибки. Для исправления таких ошибок требуется не просго формальное знание правил языка программирования, как на предыдущем этапе, а наличие четкой логики мышления, знания основных принципов программирования и наиболее эффективных методов выявления ошибок, определенный опыт в составлении компьютерных программ. Однако и эти ошибки при наличии у пользователя терпения и желания довести работу до логического конца являются в конечном счете устранимыми, и тогда итогом работы над программой становится работоспособный окончательный вариант программы.
Если мы охватим мысленно все описанные этапы работы над программой, то станет ясно, что на первых двух этапах основным инструментом для работы
над программой является мозг программиста, позволяющий должным образом поставить задачу и найти способ ее решения. Однако на последующих этапах разработки программы имеется много рутинной работы, которую в значительной своей части способен выполнять не человек, а компьютер. Поэтому на основе опыта программирования на языках высокого уровня возникла идея дополнить транслятор рядом вспомогательных программ, облегчающих и упрощающих в значительной степени процесс создания и отладки программ, интегрировав эти программные средства в единый программный комплекс. Такой комплекс называется интегрированной системой или средой программирования. Данный комплекс должен включать в себя несколько основных элементов.
Встроенный текстовый редактор — использование такого редактора гораздо удобнее, нежели подключение какого-либо внешнего. Ему можно, в частности, поручить такую задачу, как отмена одного или нескольких последних действий пользователя в том случае, если они были ошибочными.
口 Компилятор — это основное ядро системы программирования. Компилятор может создавать как исполняемые модули в рамках самой системы программирования, так и модули, которые, будучи созданы в данной системе, могут работать независимо от нее.
口 Редактор связей подключает требуемые стандартные библиотеки.
О Программа-отладчик выдает сообщения об обнаруженных ошибках, причем сообщает не только о самом факте ошибки, но и указывает характер сделанной ошибки, а в большинстве случаев также называет номер строки, в которой ошибка была обнаружена, или автоматически устанавливает на нее курсор.
Справочная система содержит различную информацию как об основных структурах языка и правилах их использования с примерами программ, так и необходимую информацию о самой системе программирования.
Как уже было сказано в предисловии, подобная система программирования была разработана для языка Паскаль и получила название Turbo Pascal. Приставка Turbo означает "ускорение" и объясняется тем, что компиляция программы в данной системе происходила быстрее, чем в других аналогичных системах. Данная система позволяет успешно создавать достаточно сложные и в то же время эффективно работающие программы как в текстовом режиме работы компьютера, так и в графическом.
ГЛАВА 2
Подготовка к программированию на Паскале
Когда выбран язык для программирования поставленной задачи, возникает резонный вопрос, где взять этот программный продукт? Можно, например, систему программирования Turbo Pascal 7.0 купить на оптическом диске в компьютерном магазине, а можно, подключившись к Интернету, бесплатно ее "скачать" с соответствующего сайта. После того как программный продукт загружен и установлен, можно приступать к решению задач, предварительно изучив основы составления программ на этом языке.
2.1. Где взять Turbo Pascal
У человека, естественно, который ранее не занимался программированием, но хочет приступить к изучению языка программирования, возникает законный вопрос: "Откуда взять этот самый язык программирования?"
Для того чтобы ответить на данный вопрос, необходимо, прежде всего, сказать, что язык программирования неотъемлем от системы программирования. Система программирования представляет собой набор взаимосвязанных файлов, который может храниться либо на каком-то из дисковых носителей информации (компакт-диск или дискета), либо находиться на каком-то сайте в Интернете. Задача пользователя заключается в том, чтобы перенести этот набор файлов на жесткий диск (винчестер своего компьютера). Рассмотрим возможные варианты действий применительно к системе программирования Turbo Pascal 7.0.
Система программирования Turbo Pascal 7.0 невелика по объему (она занимает на диске около 2,5 Мбайт), поэтому, как правило, она записывается на имеющиеся в продаже компакт-диски не сама по себе, а вместе с другими программными комплексами. Часто на таких дисках можно обнаружить так называемые Rip-версии программных продуктов (в том числе и Turbo Pascal).
Rip-версия представляет собой сделанную пиратским способом копию того или иного программного продукта. При этом компьютерные пираты нещадно удаляют ненужные на их взгляд файлы, содержащиеся в программном комплексе (приставка Rip представляет собой не что иное, как сокращение английской фразы rest in peace, что в переводе означает ипокойся с мнром”). Делается это с очевидной целью ——на одном и том же компакт-диске разместить как можно больше различных программ. Однако такая "забота” о пользователе может быть чревата тем, что программный комплекс будет неработоспособен. Возможен и другой вариант: в принципе программа будет запускаться и работать, но из-за отсутствия некоторых файлов пользователь сможет воспользоваться далеко не всеми ее возможностями.
Поэтому авторы книги рекомендуют начинающим пользователям переписать Turbo Pascal с одного из сайтов, где имеется нормальная, работоспособная версия данного продукта. Таким сайтом является, например. Turbo Pascal, расположенный по адресу http://borlpasc.narod.ru. Этот сайт, помимо самого Turbo Pascal, содержит еще много другой интересной и полезной для начинающего программиста информации, но подробнее об этом мы расскажем в другой главе данной книги, посвященной языку Turbo Pascal во Всемирной паутине. Сейчас же нас интересует в первую очередь процесс загрузки Turbo Pascal, о чем мы и расскажем далее.
Процедура загрузки Turbo Pascal рассматривается исходя из того, что у пользователя на компьютере установлена операционная система Windows и браузер Internet Explorer. Итак, набрав в адресной строке вашего браузера адрес 11 tt р ://bo г 1 pasc. па г о(1. г и и нажав клавишу <Enter>, вы оказываетесь на главной странице сайта, которая показана на рис. 2.1.
НсвостяПсогс-з^мыTurbo P-3SG3IL-lTOblДок уьу?ч ганияСтпхнкж 1卜A口』!DtUtDjUVdНсвостяПсогс-з^мыTurbo P-3SG3IL-lTOblДок уьу?ч ганияСтпхнкж 1卜A口』!DtUtDjUVdTURBO PASCAL
Нсвостя
Псогс-з^мы
Turbo P-3SG3I
L-lTObl
Док уьу?ч гания
Стпхнкж 1
卜A口
』!DtU
tDjUVd
Нсвостя
Псогс-з^мы
Turbo P-3SG3I
L-lTObl
Док уьу?ч гания
Стпхнкж 1
卜A口
』!DtU
tDjUVd
Паскаль- юмечателыаш тык пр огр аммкров алия, который относительно прост в шрмжни, довольно ясен н логичен и, будучи первым inpiacAibiM «тжом iipoi раммнровання. npiQ^iaer к хорошем^' стилю.
Паскаль* гибкий н развитый в отношении типов данных язык Привлекательны его рекрусивнне возможности, а также поддержка технологии обьектно-сриентнровочкого прсграмммрованая
Нап“山iitw, по#9ПуВст口.,itc ннб”口ь к。口口山/е нлк плохое。。己;向丁邑 s
03 Самые последние новости будут в )Киврм 41/■■ г» з、с с
Рис. 2.1. Главная страница сайта borlpasc.narod.ru
Далее на главной странице нужно щелкнуть мышью гиперссылку, которая так и называется Turbo Pascal. В результате вы оказываетесь в разделе сайта, где содержатся различные версии языка Паскаль (рис. 2.2).
Гг.咱 сети口m「0日М 山 Turb立 Postal L'TObl■Qq,r\,Men?di』iD йсоаьнйсги FAQC 匚。tfll'klffcjCYtl*квой 米у口 налГг.咱 сети口m「0日М 山 Turb立 Postal L'TObl■Qq,r\,Men?di』iD йсоаьнйсги FAQC 匚。tfll'klffcjCYtl*квой 米у口 налTURBO PASCAL㈢
Гг.咱 сети
口m「0日М 山 Turb立 Postal L'TObl
■Qq,r\,Men?di』iD йсоаьнйсги FAQ
C 匚。tfll'kl
ffcjCYtl
*квой 米у口 нал
Гг.咱 сети
口m「0日М 山 Turb立 Postal L'TObl
■Qq,r\,Men?di』iD йсоаьнйсги FAQ
C 匚。tfll'kl
ffcjCYtl
*квой 米у口 нал
Turbo Pascal и дополнения к нему
гй
• lurpo Рагсацкоаткая веосия)
Л lurbo Pascal: попн-ая веосия!、
(СаЕьм известный язык программирования)-
J Ф)уЬс turbo,tpl (более совершеннь1й|)—»
■归力 口ranh3
/ C小:QH"K ELuULHd,I,,,B H 匕口1力口<1,8<?000
慢。ДУЛ!ЛЛЯ_ЫйОЕ1£йНУ?卜汇ПУМ頂匕工方斂Т引K_h П曰觊]й!УРй£к
_ СЗГНИТСЮ»*.
厂 Tur—。Pascal, Pu「£irn亡 Library - atrlnci H&nd卜门口 Lmt N匚,irynu qna Q?UG「bLC iinKHHLHMX С.ГШККЕН :.>2+5 С:口・1日0.门射口、Pi二hjr
FHe iAc己】YS€?r C©&「MaMHN7EH /1ЛН Qnuj/1EDJLJ19 НТ Т0Е GKOE- riXKlDG 口 8H 巾 J『U"I. HJZ '.『б.■二旧 K" “ TH,一 E「【b BbmzgXf 口 CTE QnPQQQ- 砲上一 н^исполнк^мые »Ьайлы WHdUPnveL A*J 启口xsei,. =DR 力証ifla上
J- MoAVIIb nuwroE МНСТОПЕЮиеССНОГО е5*ГОО& VSTisks v 1 I」\
『 Утнлмт(з,дл「собни^ння iioAYne,.в оану бн^пнаех小 Гик tu”bc* ta】 曾 наобсдв
Г £^К5Я_£П^ЕЙ5J
Рис. 2.3. Окно загрузки файла tp7.zipРис. 2.3. Окно загрузки файла tp7.zipРис. 2.2. Страница сайта borlpasc.narod.ru, содержащая различные версии языка Паскаль
Рис. 2.3. Окно загрузки файла tp7.zip
Рис. 2.3. Окно загрузки файла tp7.zip
Для наших целей лучше всего подойдет полная версия языка Turbo Pascal, поэтому щелкаем соответствующую гиперссылку. После щелчка на гиперссылке открывается диалоговое окно загрузки файла, содержащего систему Turbo Pascal (рис. 2.3). Этот файл называется tp7.zip и представляет собой архнв, в котором в запакованном виде хранятся файлы системы программи-
рования. В окне загрузки файла tp7.zip пользователь должен указать, нужно ли открывать файл, находясь в Интернете, или сохранить его на диске. В данном случае выбираем второй вариант, установленный в окне по умолчанию, что подтверждаем щелчком на экранной кнопке ОК.
После щелчка появляется дополнительное диалоговое окно, в котором пользователь может указать, в какой именно папке нужно сохранить загружаемый файл (рис. 2.4). Эту папку пользователь может выбрать самостоятельно, перемещаясь по файловой структуре компьютера. Для навигации по файловой структуре можно использовать экран^ю кнопку 画I для перехода в расположенную выше папку или кнопку Открыть для открытия вложенной папки. Пользователь может создать и специал ь ную пап ку, в которую будет записан файл tp7.zip щелчком на экранной кнопке 囿|. Когда папка для сохранения файла выбрана или создана, подтверждаем наши действия щелчком на кнопке Сохранить.
Рис. 2.4. Окно выбора папки, в которой будет сохранен файл tp7.zip
После щелчка на этой кнопке появляется информационное окно, которое показывает ход загрузки файла tp7.zip (рис. 2.5). В данном окне показывается количество записанной на жесткий диск компьютера информации в килобайтах и в процентах от общего объема загружаемого файла. Так как файл tp7.zip невелик по объему (1,09 Мбайт), то даже при плохом качестве связи загрузка данного файла занимает, как правило, не более 10—15 минут.
По окончании процесса загрузки файла на зкране компьютера появляется окно, сообщающее о том, что процесс передачи данных завершен, а также показывающее, сколько времени было затрачено на загрузку файла, объем данного файла и среднюю скорость, с которой производилась загрузка (рис. 2.6). После ознакомления с данной информацией нужно щелкнуть в окне на кнопке Закрыть.
27
'Выпптшно 68工 из 1р7 ?甲
СофаненмеГ.'
•依布 с 1ммч.ЬоН1шс.п«м1ги anurtinmnilifna#kMnrttfr宀—!
Осталось времомс 6 мин 57-сос (скопирована 738 КБ иэЪ09 М5)
Звпзузитьв:' 0iVp7Mb?#
Скорость переда^ ' Я31 КБ/ом
Г |3^рь^ 礴 псх^воб окно 眸2 завершений загй 的
ЯЕВ;ЯЕВ;Рис. 2.5. Информационное окно, показывающее ход процесса загрузки файла tp7zip
ЯЕВ;
ЯЕВ;
—«Загмжа'эа^Ьрйине.:Сочлена -.'—«Загмжа'эа^Ьрйине.:Сочлена -.'|3агрдзка лл1Нфшпна
—«Загмжа'эа^Ьрйине.
:Сочлена -.'
—«Загмжа'эа^Ьрйине.
:Сочлена -.'
.,7#CMEdM岭 rydiu,
ипшшшппшитй|шп・“н1Пйш
Зе游呜《-IjOSMSb 6мик57слс 轉А
Загр^ритьк ♦ • DiVpZMpT^p二户
:.御产吋挙繪尿f,.干:Г Ij^i^Tib jj^£^6ft ^Гпос^в S^Syni^jai^i^
tjXKpwn» I 5крыгьп«пкЛ~3i»^g. I
Рис. 2.6. Информационное окно, сообщающее о завершении процесса загрузки
Подготовка
к запуску системы Turbo Pascal
Следутощим этапом по созданию системы программирования Turbo Pascal на компьютере является распаковка архивного файла tp7.zip. Для этого нужно использовать соответствующую программу-архиватор. При этом необязательно, чтобы это была программа Winzip. Программа Winrar также понимает формат ZIP, в котором был записан архивный файл, и может быть с успехом применена для его распаковки. После разархивации файла на жестком диске компьютера появится папка (каталог) с именем ТР7.
Этот каталог содержит ряд файлов системы программирования. Это файл turbo.exe — головной файл системы программирования, который запускает ее на выполнение, файл turbo.tpl, содержащий стандартные библиотечные модули, которые можно подключать по мере необходимости, файл turbo.tp, который содержит сведения о настройках системы программирования, файл turbo.tph, который содержит справку по языку Паскаль, а также другие файлы. Помимо файлов в каталоге могут содержаться н другие, вложенные каталоги (например, каталог BGI, который необходим для создания графических программ на языке Паскаль).
В принципе, этих файлов и каталогов вполне достаточно для того, чтобы приступить к программированию на языке Паскаль. Но желательно все же перед этим выполнить одну подготовительную операцию. Дело в том, что когда вы начнете создавать программы в системе Turbo Pascal, по умолчанию файлы программ будут записываться в основной каталог системы, в котором находятся указанные ранее системные файлы. При этом могут быть случайно повреждены или удалены системные файлы, что может привести к неработоспособности всей системы Turbo Pascal. Поэтому рекомендуется внутри каталога ТР7 создать отдельный каталог, в который будут записываться файлы написанных вами программ. Назовем этот каталог prog.
Поскольку система Turbo Pascal является приложением операционной системы MS-DOS, то создание вложенного каталога можно производить как средствами этой операционной системы, так и средствами операционной системы Windows. Поэтому рассмотрим следующие варианты.
口 Создание каталога в системе MS-DOS. Для этого необходимо перейти в каталог ТР7 и написать в командной строке команду md prog, а затем для подтверждения команды нажать на клавиатуре компьютера клавишу <Enter>.
Создание каталога в файловой оболочке Norton Commander (эта оболочка имеется на многих старых компьютерах, работающих под управлением системы MS-DOS). Необходимо вывести в активную панель Norton Commander содержимое каталога ТР7 и нажать на клавиатуре компьютера функциональную клавишу <F7>. Затем в открывшемся диалоговом окне набрать имя создаваемого вложенного каталога (prog) и подтвердить его создание нажатием экранной кнопки ОК (рис. 2.7).
Создание вложенной папки в операционной системе Windows. Для этого нужно открыть окно папки ТР7 и в строке меню щелчком мыши выбрать меню Файл, а в нем команду Создать. Справа от пункта Создать имеется треугольная стрелка, говорящая о том, что фактически эта команда представляет собой вложенное подменю, содержащее список объектов, которые можно создать с ее помощью. Если задержать указатель мыши (не
29
нажимая кнопку мыши) на пункте Создать, то через одну-две секунды вы увидите данный список. Для того чтобы выбрагь нужный нам объект из списка, следует переместить указатель мыши на пункт списка Папка и щелкнугь его левой кнопкой мыши (рис. 2.8).
C:\HCC:\HC[SOURCES[SOURCESехсехс;prog;prog*^ч*^челеелеекееке►КЛТЙП0Г4►КЛТЙП0Г4>КАТАПО「《>КАТАПО「《14:1714:1720:1520:15turbo turboturbo turbo123view4372ansiG502an§i123view4372ansiG502an§itxe cxetxe cxe(Jraw2wMf drw2wmf(Jraw2wMf drw2wmfns§ rxens§ rxencsi ncsi ncuiewncsi ncsi ncuiewncnet ncpscr ipncnet ncpscr ipbunqee c】p?dib dbuiewbunqee c】p?dib dbuiewansi2866 arcview bitmapansi2866 arcview bitmapРис. 2.7. Создание каталога для программ в файловой оболочке Norton CommanderРис. 2.7. Создание каталога для программ в файловой оболочке Norton Commander
C:\HC
C:\HC
[SOURCES
[SOURCES
ехс
ехс
;prog
;prog
*^ч
*^ч
еле
еле
еке
еке
►КЛТЙП0Г4
►КЛТЙП0Г4
>КАТАПО「《
>КАТАПО「《
14:17
14:17
20:15
20:15
turbo turbo
turbo turbo
123view
4372ansi
G502an§i
123view
4372ansi
G502an§i
txe cxe
txe cxe
(Jraw2wMf drw2wmf
(Jraw2wMf drw2wmf
ns§ rxe
ns§ rxe
ncsi ncsi ncuiew
ncsi ncsi ncuiew
ncnet ncpscr ip
ncnet ncpscr ip
bunqee c】p?dib dbuiew
bunqee c】p?dib dbuiew
ansi2866 arcview bitmap
ansi2866 arcview bitmap
Рис. 2.7. Создание каталога для программ в файловой оболочке Norton Commander
Рис. 2.7. Создание каталога для программ в файловой оболочке Norton Commander
■回С3
i|FSi« geu Нм Перепад 小8M» 6p』ai|FSi« geu Нм Перепад 小8M» 6p』a鱼|一口寸卜鱼|一口寸卜4 ■ Папку4 ■ Папку@ I:速鹏"■竺," Г 憶小а赘丝翅。.я呑,总*,• ,,「 j」曝"-. 一丁.--二.j@ I:速鹏"■竺," Г 憶小а赘丝翅。.я呑,总*,• ,,「 j」曝"-. 一丁.--二.jМойкомпыотврNotwtiem 画T₽7МойкомпыотврNotwtiem 画T₽70 &吋.」専 ApweZP^VHlAflТексто*ЛД5Ж!Г*нг它 Дсжумвнг Miaowft Wcxd団 Точа*ь»>санок«£]? Звукозапись更]П—екгация Mtaxolt Pw—Pori0 &吋.」専 ApweZP^VHlAflТексто*ЛД5Ж!Г*нг它 Дсжумвнг Miaowft Wcxd団 Точа*ь»>санок«£]? Звукозапись更]П—екгация Mtaxolt Pw—PoriЕвЛяатьляойбмйоЙ. (1цагМсфмЛЕ«е1 ■..寧冲 “@ MfcwwftHTMLDocumrtRCrЕвЛяатьляойбмйоЙ. (1цагМсфмЛЕ«е1 ■..寧冲 “@ MfcwwftHTMLDocumrtRCrописгния.описгния.固X—0|fct BinderE MioioioftAccesf база хинных..0 JQpjf^e дбмэмамгы 口ffica-iSa^WH^ARQ П<ы^'Мои док^1вкг1^*иарабоч^ crone 。.啰 0”.росцМ'IQ dicg^ftDauLink ■ . • . .: 1固X—0|fct BinderE MioioioftAccesf база хинных..0 JQpjf^e дбмэмамгы 口ffica-iSa^WH^ARQ П<ы^'Мои док^1вкг1^*иарабоч^ crone 。.啰 0”.росцМ'IQ dicg^ftDauLink ■ . • . .: 1切j Отмерь切j Отмерь
i|FSi« geu Нм Перепад 小8M» 6p』a
i|FSi« geu Нм Перепад 小8M» 6p』a
鱼|一口寸卜
鱼|一口寸卜
4 ■ Папку
4 ■ Папку
@ I:速鹏"■竺," Г 憶小а赘丝翅。.
я呑,总*,• ,,「 j」
曝"-. 一丁.--二.j
@ I:速鹏"■竺," Г 憶小а赘丝翅。.
я呑,总*,• ,,「 j」
曝"-. 一丁.--二.j
Мойкомпыотвр
Notwtiem 画
T₽7
Мойкомпыотвр
Notwtiem 画
T₽7
0 &吋.」
専 ApweZP^VHlAfl
Тексто*ЛД5Ж!Г*нг
它 Дсжумвнг Miaowft Wcxd
団 Точа*ь»>санок
«£]? Звукозапись
更]П—екгация Mtaxolt Pw—Pori
0 &吋.」
専 ApweZP^VHlAfl
Тексто*ЛД5Ж!Г*нг
它 Дсжумвнг Miaowft Wcxd
団 Точа*ь»>санок
«£]? Звукозапись
更]П—екгация Mtaxolt Pw—Pori
ЕвЛяатьляойбмйоЙ. (1цагМсфмЛЕ«е1 ■
..寧冲 “@ MfcwwftHTMLDocumrtRCr
ЕвЛяатьляойбмйоЙ. (1цагМсфмЛЕ«е1 ■
..寧冲 “@ MfcwwftHTMLDocumrtRCr
описгния.
описгния.
固X—0|fct Binder
E MioioioftAccesf база хинных.
.0 JQpjf^e дбмэмамгы 口ffica-i
Sa^WH^AR
Q П<ы^'Мои док^1вкг1^*иарабоч^ crone 。.啰 0”.росцМ'I
Q dicg^ftDauLink ■ . • . .: 1
固X—0|fct Binder
E MioioioftAccesf база хинных.
.0 JQpjf^e дбмэмамгы 口ffica-i
Sa^WH^AR
Q П<ы^'Мои док^1вкг1^*иарабоч^ crone 。.啰 0”.росцМ'I
Q dicg^ftDauLink ■ . • . .: 1
切
j Отмерь
切
j Отмерь
沁/
Рис. 2.8. Создание вложенной папки для программ в папке ТР7в операционной систгеме Windows
В результате указанных ранее действий в окне папки ТР7 появится новый объект с именем Новая палка, причем поле с названием объекта будет выделено синим цветом. Для того чтобы переименовать эту новую папку, нужно сразу же после ее создания ввести с клавиатуры требуемое имя (в данном случае это имя prog). Ввод имени следует подтвердить нажатием клавиши <Enter>.
После создания папки prog любым из трех описанных ранее способов можно приступать к запуску системы программирования.
Запуск системы Turbo Pascal
Как уже было сказано в предыдущем разделе, система программирования Turbo Pascal представляет собой комплекс, содержащий ряд файлов, но в нем имеется один головной файл, запускающий систему на выполнение. Этот файл называется turbo.exe. Процедура запуска системы зависит от того, в какой операционной системе или программной оболочке работает пользователь, поэтому, как и ранее, рассмотрим следующие три варианта.
口 Запуск Turbo Pascal из операционной системы MS-DOS. Для этого необходимо перейти в подкаталог, содержащий файл turbo.exe, набрать в командной строке команду turbo и затем нажать клавишу <Enter>.
口 Запуск Turbo Pascal из программы-оболочки Norton Commander. Вывести в активную панель Norton Commander каталог, содержащий файл turbo.exe, установить на этот файл курсор и затем нажать клавишу <Enter> или дважды щелкнуть имя файла мышью (рис. 2.9).
1
kJ *m
BGI PROG SOURCES 1PU b mob jexe
graphtpu
tpcexe
turbodsk
turbohip
turbotp
turbotph
turbotpl
turbop*!pif
三噺0k
*1A
同I痴北
123view exe A^7?ansi sei |85D2ac+i set H632ansi set 865?ansi set U662ansi set Unsi?^37 set ian$12050 set
ensi28G3 set 2nsi2865 set jansi2866 set
а г с view exe
Ibitmap exe bug nss ibunqrc nss
clp2dib exe dbulew exe
=C : \HC == Иля
1 draw2unf exe drw2wnf exe pvilrye n、s face* css f ish nss flip n$$ ■co2dib exe
mouse nss e5P2dib exe nc cf g nc exe nc f 1 1
nc in 1 nc esq nc_exit com1 njexil doc:
И1Я ncc lean ncclean nedd 1 nedd need it ncedit net f nef f nc label ncmain ncnet ncnet nepser ip nesf nesf nesi ncs* пси lew
exe ' I nt rxe m$g exe msg hip
exe esq hdr
exe nsq мд
turbo.exe
402474 5,
.10.928:02
•-
►КЙ1ЙНОГ« 15
.04.03 2
0:15
и:\гр?>
1, и—<*7一 FTF ?,• Е “!Т"М У"/』4E'F 7[ЕЕ 8 егь,『「7 IIJFm
Рис. 2.9. Запуск системы программирования Turbo Pascal из файловой оболочки Norton Commander
ИабйннмИабйннм□c,KpamQ□c,KpamQтта WMowtUpiW*/_ 5 Открыть дмэиенг Miqotdt ОШс« О Q»y^阿FT胆呼触тта WMowtUpiW*/_ 5 Открыть дмэиенг Miqotdt ОШс« О Q»y^阿FT胆呼触Рис. 2.10. Запуск системы программирования Turbo Pascal в операционной системе Windows через кнопку ПускРис. 2.10. Запуск системы программирования Turbo Pascal в операционной системе Windows через кнопку Пускhie 甲 el ExptoierWMmvt5tL “片抽hie 甲 el ExptoierWMmvt5tL “片抽Нэстрой»*Нэстрой»*g^sMOPU一g^sMOPU一
Иабйннм
Иабйннм
□c,KpamQ
□c,KpamQ
тта WMowtUpiW*
/_ 5 Открыть дмэиенг Miqotdt ОШс« О Q»y^阿FT胆呼触
тта WMowtUpiW*
/_ 5 Открыть дмэиенг Miqotdt ОШс« О Q»y^阿FT胆呼触
Рис. 2.10. Запуск системы программирования Turbo Pascal в операционной системе Windows через кнопку Пуск
Рис. 2.10. Запуск системы программирования Turbo Pascal в операционной системе Windows через кнопку Пуск
hie 甲 el ExptoierWMmvt5tL “片抽
hie 甲 el ExptoierWMmvt5tL “片抽
Нэстрой»*
Нэстрой»*
g^sMOPU一
g^sMOPU一
31
口 Запуск Turbo Pascal из операционной системы Windows. Как и большинство других операций в ОС Windows, запуск файла на выполнение можно осуществить несколькими способами:
открыть папку, содержащую файл turbo.exe, и запустить файл на выполнение двойным щелчком мыши;
если система программирования Turbo Pascal "прописана" в главном меню, открыть меню нажатием кнопки Пуск, найти в меню соответствующий пункт и один раз щелкнуть его мышью (рис. 2.10);
если на рабочем столе Windows для файла turbo.exe создан ярлык, для запуска файла достаточно дважды щелкнуть ярлык мышью.
Мои KOfxnmrep C_ «tep.
項 A«bsirp^3)t* ©> бглммрпм 區 Hwc^ve' 必(питы 方 Мкзо«ДО11к« 毋:ПррзЕ ■ Смнс MS-DOS
Ж-Мк«(ж» QuickBASIC (g V№AA IQ WrdMnCOnvMrxb, I 也 HoriqnlCcwMndei ® VHuaICOv< t§ Ug Wb 価 Ke$Oo«d “1 Aaob« Reeder 5.0 闫 MKhS^iAppr 总.蘇№iouvhu^e.«c&g»
о боМОЙЖб 国 bt^Mt 匾 E^kinbo^ 區 »4ra«u S ABBVY汗/в«ь ■ •Нур^е^вШЫс.ХОО 篇 PROMT S6 @ se '
Под управлением ОС Windows система программирования может работать либо в полноэкранном режиме, либо в оконном, занимая только часть экрана компьютера. Для того чтобы выбрать удобный для пользователя режим работы, следует отредактировать ярлык файла turbo.exe. Ярлык данного файла (как и других приложений ОС MS-DOS, работающих в ОС Windows) является не
просто ярлыком, а представляет собой программно-информационный файл, посредством редактирования которого можно настроить файл приложения (в данном случае это файл turbo.exe) оптимальным для пользователя образом.
Рис. 2.11. Окно свойств программно<информационного файла для turbo.exe, вкладка Программа
Для редактирования ярлыка нужно щелкнуть его правой кнопкой мыши и в открывшемся контекстном меню выбрать пункт Свойства, щелкнув его мышью. В результате открывается диалоговое окно свойств ярлыка. Это окно содержит ряд вкладок: Общие, Программа, Шрифт, Память, Экран, Разное. Щелчком мыши выводим на передний план вкладку Программа (рис. 2.11). На вкладке установим флажок Закрывать окно по завершении сеанса работы. Тогда при выходе из системы программирования окно системы будет закрываться автоматически. Затем щелкнем на той же вкладке кнопку Дополнительно, после чего на экране компьютера появится еще одно окно для установки дополнительных настроек файла turbo.exe (рис. 2.12). В окне дополнительных настроек уберем флажок Режим MS-DOS, после чего можно будет работать в Turbo Pascal, не выходя из Windows. Подтвердим изменения щелчком на кнопке ОК, после чего окно дополнительных настроек закроется. Теперь перейдем на вкладку Экран м установим переключатель в положение Полноэкранный или Оконный в зависимости от того, в каком режиме вам удобнее работать. Снова щелкаем мышью кнопку ОК (теперь уже в основном окне свойств) для подтверждения сделанных изменений. По-
еле закрытия основного окна начальная настройка системы программировав ния произведена, н можно приступать к изучению самой системы.
Рис. 2.12. Окно дополнительных настроек для файла turbo.exe
Экран системы Turbo Pascal
После успешного запуска системы программирования вы увидите на экране компьютера исходный экран системы. На экране системы можно выделить три основные части: верхнюю строку, основную часть экрана и нижнюю строку (рис. 2.13).
Верхняя строка исходного экрана системы программирования называется строкой меню н содержит десять разделов. Для того чтобы активизировать строку меню (т. е. привести ее в рабочее состояние), необходимо нажать клавишу <FIO>. После этого одно из меню будет подсвечено (как правило, зеленым цветом). Перемещаться по строке меню можно клавишами <стрелка вле- во> и <стрелка вправо>.
После нажатия клавиши <Enter> подсвеченное меню будет раскрыто, т. е. появится ниспадающее меню. То же самое можно сделать, щелкнув строку меню мышью. После щелчка мышью или нажатия <Enter> в ниспадающем меню будут видны все пункты выделенного меню. Часть пунктов меню закрашена серым цветом. Эти пункты соответствуют командам, которые в данный момент времени недоступны. Те же команды, которые можно выпол-
2 Зак 1068
Рис. 2.13. Исходный экран системы программирования
нить, закрашены черным цветом. Справа от некоторых команд указываются названия клавиш или сочетаний клавиш, с помощью которых можно быстро выполнить данные команды, не открывая меню. Всего основное меню системы Turbo Pascal содержит десять разделов. Далее приведены названия разделов в том порядке, в котором они расположены в строке меню, и краткая информация по каждому из них:
File — операции с файлами;
Edit — редактирование исходного текста программы;
Search — поиск и замена группы символов в тексте программы;
Run ——компиляция программы с запуском ее на выполнение;
Compile — компиляция программы без запуска на выполнение;
口 Debug— отладка программы (поиск ошибок в программе и просмотр результатов ее выполнения);
Tools — работа с внешними по отношению к системе программирования программами (например, с ассемблером);
Options ——настройка параметров системы программирования;
П Window — операции с окнами, открытыми в текущем сеансе работы;
П Help— получение справочной информации по работе с системой программирования.
На рис. 2.14 изображен экран системы Turbo Pascal после активизации меню (раскрыто меню File). Данный раздел содержит команды, используемые для операций с файлами: создания новых файлов, открытия ранее созданных, со-
хранения изменений в файлах, их переименования, смены каталога, в который по умолчанию записываются файлы, а также для выхода из систем。про- фаммирования. Например, выход из системы программирования по завершении сеанса работы в Turbo Pascal осуществляется командой File | Exit. Это означает, что для выполнения данной команды нужно произвести следующие действия: открыть меню File, стрелкой выбрать нужный пункт в разделе и затем нажать клавишу <Enter>, либо щелкнуть данный пункт мышью. После выполнения этой команды вы вернетесь в среду той операционной системы, либо файловой оболочки, из которой был запушен Turbo Pascal.
Рис. 2.14. Экран системы программирования с активизированной строкой меню
Под строкой меню расположена основная рабочая область системы программирования, в которой впоследствии мы будем вводить текст программы. В нижней части экрана находится строка состояния (у нее есть и другое название—строка статуса). В этой строке перечислены названия тех команд меню, которые чаще всего используются в текущем режиме работы, и соответствующих им клавиш или комбинаций клавиш. По мере того как вы будете осваивать систему программирования, вы выучите значения наиболее часто употребляемых клавиш и их сочетаний, что ускорит работу над программой. Названия тех из них, которые можно непосредственно использовать в данный момент, выделены красным цветом. Сразу после открытия системы программирования можно использовать клавиши <FI>, <F3> и комбинацию клавиш <Alt>+<F 10>. При изменении режима работы системы программирования меняется и содержимое строки состояния.
Алфавит языка Паскаль
Перед тем как приступить к созданию первой программы на языке Паскаль, пользователю необходимо получить представление об основных компонентах, из которых складывается эта программа.
Любая программа на любом языке программирования записывается в виде символов. Символы эти не могут быть произвольными. Подобно естественным языкам, таким как русский, английский, французский и др., которые люди используют при общении друг с другом, языки программирования, на которых человек общается с компьютером, имеют свой алфавит. В данном случае алфавит — это набор букв, цифр и других символов, используемых при написании программ.
Алфавит языка Паскаль включает в себя:
буквы латинского алфавита от А до Z. Буквы могут быть как прописными, так и строчными, т. к. компилятор языка Паскаль при обработке программ не делает различия между ними;
口 цифры от 0 до 9;
специальные символы. К специальным символам относятся знаки математических операций, знаки пунктуации и некоторые другие. Спецсимволы подразделяются на:
одиночные
+ ・*/ = <>
[],():;
А ・ @ { } $ #
парные
<=>=:=..(* *)(..)
Наряду с цифрами, буквами и специальными символами Паскаль содержит ряд служебных слов, значения которых заранее определены и не могут изменяться пользователем. К таким зарезервированным словам относятся:
asm array begin case const constructor destructor div do downto else end exports file for function goto if implementation in inherited inline interface label library mod nil not object of or packed procedure program record repeat set shl shr string then to type unit until uses var while with xor
Из отдельных символов и служебных слов в Паскале складываются операторы. Оператором называется выражение, обозначающее и описывающее какую-либо операцию, осуществляемую в программе.
Использование букв русского алфавита в программе допускается только в комментариях (пояснениях к программе, не влияющих на ход ее выполнения) н в тексте, который выводится на экран компьютера.
Структура программы на языке Паскаль
Программа, как мы уже знаем, представляет собой последовательность действий, выполняемых в процессе решения поставленной задачи. Эти действия описываются в виде операторов языка Паскаль, являющихся основными элементами, из которых складывается программа. При этом операторы работают с различными величинами: постоянными (константами) и переменными.
Константой называется величина, которая в процессе выполнения программы остается неизменной. Константа может быть либо числом (числовая константа), либо некоторым произвольным набором символов (текстовая константа). В ряде случаев для удобства работы константам дают имена, состоящие из букв латинского алфавита и цифр.
Переменной называется величина, которая может изменяться в ходе выполнения программы. Каждая переменная должна иметь собственное имя, значение и тип. Имя переменной обозначается подобно имени константы латинскими буквами и цифрами, причем начинаться имя переменной обязательно должно с буквы.
Каждая отдельная переменная может принимать значения только определенного типа. Это могут быть, например, целые или вещественные числа. В первом случае переменная называется целочисленной, во втором — переменной вещественного типа или вещественной. Значениями переменной могут быть не только числа, по и отдельные символы. В таком случае переменная называется символьной. Если же значением переменной является не отдельный символ, а группа символов (такая группа называется в Паскале строкой), то соответствующая переменная будет именоваться строковой. Позднее мы познакомимся и с другими типами переменных.
В Паскале тип каждой используемой в программе переменной обязательно должен быть описан в соответствующем разделе программы. Тип переменной определяет не только область значений переменной, но и набор операций, которые можно производить над переменной. гГакой набор является специфическим для каждого типа переменной. Например, над числовыми переменными можно производить операции умножения и деления, а для строковой переменной существует операция определения ее длины. Под каждую переменную в памяти компьютера отводится некоторая область, в которой хранится ее значение. Это значение сохраняется в неизменном виде до тех пор.
пока переменная не получит новое значение. Операция изменения значения переменной называется операцией присваивания.
Операторы^ а также обрабатываемые ими величины, не могут располагаться в программе произвольным образом. Элементы программы должны находиться в определенных разделах программы. Программа на языке Паскаль состоит из разделов, каждый из которых начинается специальным ключевым словом, характерным для конкретного раздела:
program — заголовок программы;
uses — раздел подключения модулей — библиотек дополнительных процедур и функций;
label — раздел описания меток безусловного перехода;
口 const — раздел описания констант;
П type — раздел описания типов данных;
var — раздел описания переменных;
function — раздел описания функций;
procedure ——раздел описания процедур;
begin ——начало тела программы (основной части программы);
end — конец программы.
Большинство перечисленных разделов не являются обязательными. Единственным обязательным разделом является тело программы, начинающееся со служебного слова begin и заканчивающееся служебным словом end с точкой на конце. Общее описание разделов программы приведено далее.
Заголовок программы имеет вид:
program название_программы
Название программы может быть произвольным, но для того чтобы легче было ориентироваться в имеющихся программах, рекомендуется давать программе название, совпадающее с именем файла, в котором она хранится. Обратите внимание, что в названии программы не должно быть пробелов; в случае необходимости пробел можно заменить знаком подчеркивания. Также в названии программы не должно быть точек, запятых, точек с запятыми —такие имена будут восприниматься системой программирования как ошибочные. В имени программы нельзя использовать также русские буквы, круглые скобки, вопросительный и восклицательный знаки. Желательно, чтобы имя программы было связано по смыслу с ее содержанием.
Со служебного слова uses, что в переводе означает Ииспользует*\ начинается раздел подключения дополнительных модулей. При этом после служебного
слова uses следует перечисление этих модулей через запятую. В стандартную поставку Turbo Pascal входит несколько стандартных модулей: Crt — модуль для работы в текстовом режиме, графический модуль Graph и др. На применении модуля Crt мы в дальнейшем остановимся подробнее. Модули позволяют использовать в программе дополнительные команды н операторы.
В разделе объявлений описываются константы и переменные. Описание констант начинается со служебного слова consti. переменных со слова vat. После описания группы переменных, относящихся к одному типу, в программе ставится точка с запятой.
Наряду с указанными ранее в разделе могут присутствовать описания других элементов программы: функций— соогветствующий раздел начинается со слова function, процедур— раздел начинается со слова procedure, меток —— раздел начинается со слова label, типов данных — раздел начинается с type. Для чего используются все эти элементы и как их описывать, мы более подробно разберем в следующих главах книги. В самых простых программах, в которых не используются никакие из перечисленных ранее элементов, раздел описаний может отсутствовать.
Основную часть программы предваряет служебное слово begin. После него никаких знаков препинания не ставится.
В основной части программы находятся операторы, ответственные за ее выполнение. Операторы отделяются друг от друга точками с запятой, причем в одной строке может находиться несколько операторов, а если оператор не помещается в одну строку, то его можно переносить на следующую строку. После последнего в программе оператора точку с запятой ставить необязательно.
Программа завершается служебным словом end, после которого обязательно ставится точка.
ГЛАВА 3
Простейшие программы в Паскале
Усвоив основные компоненты, из которых складывается программа на языке Паскаль, можно приступать к составлению и отладке простейших программ. Такого типа программы являются, как правило, линейными. Они содержат операторы ввода, вывода и присваивания. В этих программах используется управляющая структура следования, т. е. один оператор в программе следует за другим, н он выполняется после того, как выполнил свои функции предыдущий. В этом разделе рассмотрены и другого типа программы, осуществляющие не только ввод или вывод информации, но и ее обработку. Простейшим примером такой обработки информации являются арифметические вычисления, в ходе которых по имеющимся исходным данным подсчитывается результат.
Первая программа на Паскале
Для того чтобы приступить к работе над программой, необходимо предварительно создать новый файл, в котором будет записан текст данной программы. Создание файла производится выполнением команды File | New (для этого нужно щелкнуть мышью пункт New в меню File или установить курсор на этот пункт стрелками клавиатуры и нажать клавишу <Enter>). После этого на экране появится окно вновь созданного файла, в котором можно вводить текст программы на языке Паскаль (рис. 3.1).
Можно настроить систему программирования таким образом, что окно для вновь создаваемого файла будет открываться автоматически сразу после запуска системы программирования. Для этого следует после открытия окна для нового файла записать изменения в файл turbo.tp. В файле turbo.tp, входящем в состав системы программирования, хранится информация о настройках системы. Запись изменений в файл настроек производится следую-
щим образом. Нужно щелкнуть мышью меню Options, а в открывшемся разделе команду Save TURBO.TP (рис. 3.2). При следующем запуске системы программирования сразу, без захода в меню, откроется окно для нового файла. Этот файл с текстом новой программы по умолчанию получает имя NonameOO.pas. Следующие созданные вами файлы получат соответственно имена NonameO 1 .pas, Nonaine02.pas и т. д.
Рис. 3.1. Окно для ввода текста программы в системе Turbo Pascal
Рис. 3.2. Сохранение настроек системы программирования
Теперь, когда пользователь имеет общее представление о том, как должна выглядеть программа на языке Паскаль, можно приступить к созданию первой программы на этом языке. Первая программа должна вывести на экран компьютера сообщение. Текст этого сообщения будет следующим: "Моя первая программа на языке Паскаль*1.
Введем текст программы с клавиатуры компьютера по строкам (рис. 3.3, листинг 3.1).
[Листинг 3.1 . Первая профамм^ на языке Паскаль
program pervprog;
begin
writein (*Моя первая программа на языке Паскаль *) end.
Рис. 3.3. Текст первой программы на Паскале
Место, куда пользователь вводит очередной символ, отмечается специальной меткой. Эта метка называется курсором и имеет вид мигающей горизонтальной черты. Ввод очередной строки завершается нажатием клавиши <Enter>. После нажатия этой клавиши курсор переходит на следующую строку. Если при наборе программы пользователь сделал опечатку, то неверный символ можно удалить, нажав клавишу <Backspace>, стирающую символ, находящийся слева от курсора. Для удаления того символа, на котором курсор установлен в данный момент, нужно нажать клавишу <Delete>. Для контроля правильности вводимого текста советуем обратить внимание на следующее:
ряд служебных слов (в частности слова program, begin и end) в случае их правильного написания выделятся на синем фоне экрана белым цветом в отличие от остального текста, имеющего желтый цвет.
Разберем подробно текст введенной нами программы. Сделать это будет несложно, т. к. программа занимает всего четыре строки.
Программа имеет заголовок, который обязательно должен начинаться со служебного слова program. После пробела вводится собственное имя программы (в данном случае имя petvprog). Раздел объявлений здесь отсутствует, т. к. в программе не задействована ни одна переменная, а используемая константа не имеет собственного имени. Перед основной частью программы обязательно ставится служебное слово begin (начало).
В самой же основной части содержится единственный оператор. Это оператор вывода, который состоит из служебного слова writein и выводимой на экран компьютера информации, заключенной в скобки. Эта информация в данном случае состоит из одного элемента — текста, расположенного между апострофами (одиночными кавычками). Такие тексты в Паскале называются строковыми константами или просто строками. Строка может содержать любые символы (включая буквы русского алфавита), кроме апострофа. При выполнении оператора writein эта строка выводится на экран компьютера, причем ограничивающие ее апострофы не выводятся, а затем курсор перемещается на следующую строку. Программа обязательно заканчивается служебным словом end (конец), после которого ставится точка —— признак конца программы.
После того как текст программы набран, содержащий его файл нужно сохранить на жестком диске компьютера или на дискете. Сохранение файла включает в себя указание каталога (папки), в котором данный файл сохраняется, и имени, под которым сохраняется файл. Рассмотрим основные правила наименования файлов.
Во-первых, файлу нельзя оставлять даваемое по умолчанию системой программирования имя Noname (что в переводе с английского означает '*безы- мянный"). Во время следующего сеанса программирования текст новой программы также запишется в файл с именем Noname, и текст предыдущей программы будет потерян. Поэтому нужно дать файлу какое-либо имя, отличное от Noname. причем желательно, чтобы это имя по смыслу было связано с содержанием файла. Например, файл, содержащий программу, складывающую два числа, можно назвать Summa2.pas. Имена файлов могут содержать буквы латинского алфавита и цифры. В именах файлов не следует использовать буквы кириллицы, пробелы, а также следующие символы:
* = + [];:',.<>/?
Так как система Turbo Pascal является приложением операционной системы MS-DOS, то необходимо помнить еще об одном ограничении: имена файлов с программами на Паскале (как и все прочие имена файлов в MS-DOS) не могут содержать более 8 символов (не считая 3 символов, зарезервированных для расширения имени). Всего имя файла, таким образом, может содержать не более 11 символов. Такой способ наименования файлов часто называют "система 8+3". Файл, создаваемый в системе программирования Turbo Pascal, должен иметь расширение pas.
Сохранение файла на диске под новым именем осуществляется посредством команды File | Save as (Файл | Сохранить как). С помощью этого пункта меню задается также каталог, в котором будет сохранен данный файл. Обратите внимание, что после названия команды стоит многоточие. Многоточие говорит о том, что при выполнении данной команды открывается диалоговое окно. Внешний вид окна сохранения файла, которое открывается после щелчка мыквью или нажатия клавиши <Enter> на команде Save as, показан на рис. 3.4.
Рис. 3.4. Диалоговое окно сохранения файла
Диалоговое окно сохранения файла содержит несколько элементов.
口 Текстовое поле, в которое можно вводить новое имя файла. Это поле находится в верхней части диалогового окна и выделено синим цветом. Само диалоговое окно имеет светло-серый цвет.
口 Окно, содержащее список файлов с программами на Паскале, находящихся в том каталоге, куда по умолчанию записывается файл. Это окно занимает центральную часть диалогового окна и выделено бирюзовым цветом.
Если имена всех файлов, находящихся в каталоге, не помещаются в окне списка, то в нижней части этого окна появляется полоса прокрутки (полосы прокрутки часто также называют скроллерами), которая позволяет перемещаться по списку файлов путем перетаскивания находящегося на полосе бегунка, иначе называемого также лифтом. Полоса прокрутки выделена синим цветом, а бегунок имеет вид маленького квадратика бирюзового цвета.
口 Стандартные экранные кнопки ОК (подтверждение операции), Cancel (отмена операции) и Help (получение помощи). Экранные кнопки находятся в правой части диалогового окна и выделены зеленым цветом.
口 Информационная строка, содержащая сведения о текущем каталоге и о выделенном файле (один файл в каталоге всегда выделен другим цветом). Строка расположена в нижней части диалогового окна и выделена синим цветом. Для каталога в информационной строке указывается путь к нему, начиная с имени диска, на котором он находится. Для файла, помимо его имени, указывается его размер в байтах, а также дата и время его создания или последнего изменения.
Перемещение между элементами диалогового окна можно производить с помощью клавиши <ТаЬ> или мыши. Перемещение внутри элементов производится с помощью клавиш управления курсором (<стрелка влево>, <стрелка вправо〉,<стрелка вверх>, <стрелка вниз>) или мышью.
Если каталог, заданный по умолчанию, устраивает пользователя, то ему необходимо после ввода имени сохраняемого файла только щелкнуть два раза мышью экранную кнопку ОК или выделить эту кнопку клавишей <ТаЬ> и нажать <Enter>, после чего диалоговое окно закроется и файл сохранится в текущем каталоге под указанным именем. Но, как уже говорилось в предыдущей главе, лучше сохранить файл с текстом программы в специальном каталоге prog. Для того чтобы изменить заданный по умолчанию каталог, нужно уметь перемещаться с помощью элементов диалогового окна по файловой структуре компьютера.
Для того чтобы перейти в каталог верхнего уровня (на один уровень вверх), необходимо выделить в текущем каталоге .. (символ надкаталога) и нажать клавишу <Enter> или щелкнуть два раза мышью. Если символ надкаталога не виден в окне, то нужно прокручивать содержимое текущего каталога с помощью лифта до тех пор, пока вы его не обнаружите. Для перехода в подкаталог (на один уровень вниз) необходимо выделить в текущем каталоге имя этого подкаталога и нажать клавишу <Enter> или щелкнуть два раза мышью. После того как пользователь открыл нужный каталог, в текстовом поле в верхней части диалогового окна можно ввести имя сохраняемого файла.
Можно сразу ввести имя диска, на котором будет сохранен файл, каталога, в котором он будет сохранен, и самого файла непосредственно в текстовом поле. При этом не нужно переходить из каталога в каталог, как было описано ранее, но для начинающего пользователя это представляет определенные сложности, т. к. при этом нужно правильно указать путь к каталогу и файлу.
Если пользователь не будет сохранять данный файл (например, если он был создан только в учебных целях), то нужно щелкнуть кнопку Cancel.
После закрытия окна сохранения файла правильность выполненных действий можно проконтролировать по верхней части рамки рабочей области, в которой будет указано полное имя сохраненного файла, включающее имя каталога (каталогов), содержащих данный файл. Например, в случае успешного сохранения файла pervprog в каталоге prog, находящемся в каталоге ТР7, который расположен на логическом диске D:, вверху рабочей области пользователь увидит следующее полное имя файла: TP7\prog\pervprog.pas.
Если в дальнейшем в ходе работы над программой пользователь будет корректировать ее текст, то изменения в тексте можно быстро сохранить, выполнив команду File | Save. При этом диалоговое окно открываться не будет, а все изменения в файле будут записаны на диск автоматически.
Когда ввод текста программы завершен, и программа записана в долговременную память компьютера, ее можно запускать на выполнение. Это действие можно произвести двумя способами. Первый из них заключается в том, что в начале с помощью команды Compile (компиляция), находящейся в одноименном разделе меню, создается исполняемый файл с расширением ехе. Затем полученный файл можно запускать на выполнение. Этот способ предпочтителен в том случае, если мы будем использовать созданную программу за пределами системы программирования. Созданный таким образом исполняемый файл можно запускать штатными средствами операционных систем MS-DOS или Windows. Но в данном случае такая задача перед нами не стоит, поэтому воспользуемся для запуска программы другим, более удобным способом. Мы используем пункт Run в одноименном разделе меню. Эта команда осуществляет компиляцию файла и затем сразу запускает его на выполнение. Ту же самую операцию можно выполнить, нажав сочетание клавиш <Ctrl>-b<F9>.
В том случае, если при компиляции в исходном тексте программы были обнаружены ошибки (при копировании текста готовой программы такими ошибками, как правило, являются опечатки), на экране появится красная строка с сообщением о номере и характере сделанной ошибки. Например, если вы забыли заключить текстовую строку в апострофы, то на экране будет следующее сообщение, которое означает просто "синтаксическая ошибка'*:
Error 5: Syntax error
Если же вы забыли поставить заключительную точку после служебного слова end, то на экране компьютера можно будет прочитать сообщение о неправильном конце файла:
Error 10: Unexpected end of file
После устранения ошибок произойдет следующее: экран компьютера "моргнет" и вернется в исходное состояние, т. е. результатов проделанной работы мы не увидем. Для просмотра результатов следует воспользоваться командой Output (Вывод) из раздела меню Debug. Слово Debug в переводе на русский язык означает "отладка” (буквально ——"вылавливание насекомых**), но этот раздел содержит не только команды, связанные непосредственно с отладкой программы, но и команды просмотра полученных результатов. При выполнении команды Output на зкране компьютера ниже текста программы появится дополнигельное окно с результатами работы (рис. 3.5). В верхней правой части окна видна цифра 2 — порядковый номер этого окна. Номер 1 имеет окно с исходным текстом программы. Таким образом мы вывели требуемый текст на экран компьютера.
Рис. 3.5. Результаты работы первой программы
Если результаты необходимо просмотреть в полноэкранном режиме, а не в окне вывода, то необходимо выполнить команду User screen (экран пользователя) из того же меню Debug либо нажать сочетание клавиш <Alt>+<F5>. Можно развернуть во весь экран и окно, выводимое командой Output, щелкнув мышью стрелку в верхнем правом углу данного окна. Для того чтобы от экрана с результатами вернуться к экрану с исходным текстом программы, следует нажать любую алфавитно-цифровую клавишу.
Наряду с оператором writein для вывода информации на экран компьютера можно использовать также другой оператор вывода write. Этот оператор действует подобно оператору writein, но особенность оператора write заключается в том, что после его выполнения курсор не перемещается на следующую строку, а остается в той же строке, в которой выводилась информация. Различие между операторами write и writein продемонстрируем на следующем примере. Пусть в программе нам необходимо вывести текст: иМы изучаем программирование*1.
Если этот текст вывести тремя операторами write:
write ( ЧЧы*);
write(・ изучаем *);
write(1программирование *);
то при выполнении программы вся фраза будет выведена в одну строку:
Мы изучаем программирование
Если же тот же текст вывести тремя операторами writein:
writein(,Мы,);
writein(* изучаем ');
writein(•программирование");
то каждое слово фразы будет начинаться с новой строки, и при выполнении программы на экране мы увидим следующее:
Мы изучаем программирование
Информация, заключенная в операторах write или writein в скобках, называется списком вывода. Такой список может включать в себя один или несколько элементов, которые могут быть как константами, подобно тексту в нашей программе, так и переменными. Элементы списка вывода внутри скобок отделяются друг от друга запятыми и выводятся при выполнении опера* тора на экран в той последовательности, в которой они перечислены в самом операторе.
Цветовое оформление результатов выполнения программы
Окно с результатами работы программы необязательно должно быть чернобелым. Текст может выводиться различными цветами. Цветным может быть и фон, на котором выводится текст. Для этого необходимо использовать мо-
дуль crt, входящий в состав системы программирования. Модулем называется блок, входящий в состав стандартной библиотеки системы Turbo Pascal и обеспечивающий дополнительные возможности системы при создании программ. По умолчанию при запуске системы в оперативную память загружается только модуль System. Для подключения других модулей необходимо дать специальную команду. В частности, для подключения модуля Crt первой командой программы, находящейся сразу после заголовка, должна быть команда uses Crt. Цвет символов задается с помощью команды Textcolor. После служебного слова Textcolor в скобках указывается непосредственно цвет символов. Всего в Turbo Pascal используется 16 стандартных цветов. Вот их названия:
Black ——Черный;
DarkGray —
темно-серый;
Blue — СИНИЙ;
LightBlue —
-голубой;
Green — зеленый;
LightGreen-
—светло-зелен ы й;
Cyan — бирюзовый;
LightCyan —
一 светло-бирюзовый;
Red — красный;
LightRed —
светло-красный;
Magenta — фиолетовый;
LightMagenta ——светло-фиолетовый;
Brown — коричневый;
Yellow ——желтый;
LightGray ——светло-серый;
White — белый.
Для задания цвета фона используется команда TextBackground. Формат ее аналогичен команде Textcolor, но эта команда позволяет использовать только 8 цветов:
Black Red Blue Magenta Green Brown Cyan LightGray
Цвета в командах Textcolor н TextBackground можно обозначать не только указанными ранее словами, но и числами. В некоторых случаях использование чисел даже удобнее. Для кодирования цветов используются следующие числа:
1
——черный;
9 —
голубой;
2
——синий;
to
-с ветло-зелен ый;
2
—зеленый;
il -
-светло-бирюзовый:
3
—бирюзовый;
12-
-светло-красный;
4
—красный;
13-
-светло-фиолетовый;
5 — фиолетовый;
14-
一 желтый;
6
—коричневый;
15-
-белый;
7
——светло-серый;
128
—мерцание.
8 — темно-серый;
Поясним последний числовой код. Он не используется самостоятельно, а является дополнительным, т. е. употребляется вместе с каким-либо числовым значением цвета для создания эффекта мерцания. Для этого число 128 добавляется к основному числовому значению. Поясним сказанное следующими примерами: если в тексте программы имеется команда
Textсоlor(lightgreen);
то следующий за ней текст будет выводиться светло-зеленым цветом. Аналогичный результат обеспечит и команда
Textcolor(10);
если же мы используем команду
Textcolor(10+128);
то текст будет выводиться светло-зеленым цветом н при этом будет мерцать. Составим программу, которая выводит на светло-сером фоне следующий текст (рис. 3.6):
Эта программа представляет собой пример исполь зования цветовой палитры системы программирования
Turbo Pascal 7.0
Первая строка этого текста будет выведена красным цветом, вторая — зеленым, третья — синим, а четвертая ——желтым. Обратите внимание, что операторы в программе отделяются друг от друга точкой с запятой. В начале программы для очистки экрана дается команда cirscr. Эта команда работает только в том случае, если к программе подключен модуль crt. Далее командой TextBackground задается фон текста. Перед выводом очередной строки текста командой Textcolor предварительно указывается ее цвет, а затем сам этот текст выводится оператором writein. В листинге 3.2 приводится текст данной программы.
f Листинг 3・2;百訛而 текста различными цветами|
program democolor;
Uses Crt;
begin
ClrScr;
TextBackground(LightGray);
Textcolor(Red);
writein(1Эта программа представляет собой пример ');
TextColor(Green);
writein(*использования цветовой палитры •);
TextColor (Blue);
writein(*системы программирования1);
TextColor(Yellow);
writeIn(1Turbo Pascal 7.0 •);
end.
Отметим еще одну особенность данной программы. Если в первой программе все ее строки вводились, начиная с первой позиции в строке, то в этой программе перед рядом строк стоит несколько пробелов, и соответственно текст в этих строках сдвигается вправо. Такая группа пробелов называется отступом и используется для того, чтобы пользователь более четко и наглядно представлял себе структуру программы. В данной программе с отступом написаны операторы, входящие в основную часть программы. В программах, приводимых в последующих главах книги, с помощью отступов мы будем выделять отдельные блоки и программные структуры внутри основной части программы, что в значительной степени облегчит понимание смысла программ.
Рис. 3.6. Программа, демонстрирующая возможности модуля Crt (а), и результат ее работы (6)Рис. 3.6. Программа, демонстрирующая возможности модуля Crt (а), и результат ее работы (6)
Рис. 3.6. Программа, демонстрирующая возможности модуля Crt (а), и результат ее работы (6)
Рис. 3.6. Программа, демонстрирующая возможности модуля Crt (а), и результат ее работы (6)
В программе на рис. 3.6 использовались словесные наименования цветов выводимых строк, а в следующей программе для обозначения цветов мы воспользуемся числовыми кодами (рис. 3.7). Эта программа выводит на экран компьютера четверостишие поэта И. Анненского на черном фоне бирюзовым цветом, причем текст четверостишия будет мерцать. Бирюзовый цвет текста четверостишия закодирован цифрой 3, к которой добавлено слагаемое 128, обеспечивающее эффект мерцания. В листинге 3.3 приводится текст программы.
Рис. 3.7. Программа, выводящая мерцающий текст (а/, и результат ее работы (6)
Листинг 3.3. Вывод текста с эффектом мерцания
program blinkl;
Uses Crt;
begin
ClrScr;
TextColor(3+128);
writein(* Среда миров, в мерцании светил1);
writein(1Одной звезды я повторяю имя...*);
writein{*Не потому, чтоб я ее любил,1);
writein (*А потому, что я томлюсь с другими *); readln end.
Отметим еще одно отличие данной программы от двух предыдущих. Первые две программы, в которых отсутствует эффект мерцания, будут нормально работать и в полноэкранном, и в оконном режимах. Программа же, изображенная на рис. 3.7, может создавать эффект мерцания только в полноэкранном режиме. Естественно, что эффект мерцания не виден на иллюстрации в книге, но вы увидите его, когда наберете текст данной программы на компьютере и запустите ее на выполнение.
Помимо указанных ранее возможностей модуль crt позволяет также устанавливать курсор в указанное программистом место на экране, а также создавать различные аудиоэффекты.
Использование переменных в программе
Программы, рассмотренные в предыдущем разделе, осуществляли вывод информации на экран компьютера. Теперь мы перейдем к задачам, в которых осуществляется не только ввод или вывод информации, но и ее обработка. Простейшим примером такой обработки информации являются арифметические вычисления, в ходе которых по имеющимся исходным данным подсчитывается результат. Составим программу, которая складывает два числа и выводит их сумму на экран компьютера (рис. 3.8, листинг 3.4). Для того чтобы сложить эти числа, необходимо в начале присвоить их каким-либо переменным (например, а и ь), а потом описать эти переменные. Затем следует присвоить результат арифметической операции сложения третьей переменной (с) н вывести его на экран компьютера.
;Листинг 3.4. Сложение двух чисел и вывод результата на экран
program summa; var
a,b,c:integer;
begin
а:=5;
Ь:=10;
с:=а+Ь;
writein(с) end.
Рис. 3.8. Программа, складывающая два числа (а), и результат ее работы (б)
Заметим, что в заголовке этой программы не указана команда подключения модуля Crt. Вообще говоря, операцию очистки экрана рекомендуется всегда производить в начале работы программы, т. к. в противном случае после запуска на выполнение текущей программы на экране могут оставаться "хво- стыи (результаты работы предыдущей программы), что затруднит анализ полученных результатов работы текущей программы. В случае же, если мы не
забудем подключить модуль crt, а в основной части программы первой командой будет команда очистки экрана cirScr, то вывод результатов будет производиться на "чистый лист”,что конечно гораздо удобней для пользователя.
Затем идет раздел описания переменных, который обязательно должен начинаться со служебного слова var (сокращение от английского variable— переменная). После служебного слова через запятую перечисляются сами переменные, используемые в программе, и после двоеточия указывается тип этих переменных. Обратите внимание на то, что в этом разделе в обязательном порядке должны быть описаны все используемые в данной программе переменные. Если мы забудем описать какую-либо из использованных в программе переменных, то при запуске этой программы на компиляцию мы увидим следующее сообщение:
Error 3: Unknown identifier
н программа не будет работать до тех пор, пока вы не исправите ошибку, описав недостающую переменную в разделе описаний после слова var.
В нашем случае для упрощения задачи будем складывать только целые числа, поэтому все переменные будут относиться к одному типу — integer (т. е. целые). В разделе описания должны быть описаны три переменные, используемые в программе: а, ь и с. Затем в основной части программы переменным а и ь должны быть присвоены конкретные числовые значения с помощью оператора присваивания, т. к. по умолчанию начальные значения переменных будут равны нулю.
Общий вид оператора присваивания в языке Паскаль: имя^переменной: =знз чение;
где значение— присваиваемая величина, которая может быть числом, переменной или арифметическим выражением. Число присваивается непосредственно, а значение арифметического выражения в процессе выполнения программы вычисляется и присваивается стоящей в левой части оператора переменной.
После выполнения операции присваивания в ячейки компьютерной памяти, отведенные под переменную, будет занесено значение, записанное справа от знака равенства. Это значение будет оставаться в неизменном виде вплоть до выполнения в программе следующей операции присваивания.
В операторе присваивания после имени переменной обязательно должно стоять двоеточие. Если пропустить в записи оператора двоеточие, то получится не оператор присваивания, а операция сравнения. Отличие этих двух записей можно наглядно проиллюстрировать на следующем примере:
口 запись х=х+5 с математической точки зрения является неправильной;
□ запись х:=х+5 в Паскале является вполне допустимой. Эта запись означает, что переменной х присваивается новое значение, которое больше чем старое значение этой же переменной на 5. Например, если до выполнения операции присваивания значение х было равно 3, то после ее выполнения значение х станет равным 8.
В нашей программе мы присваиваем переменным а и ь конкретные числовые значения— 5 и 10. Далее мы присвоим переменной с значение выражения а+ь, т. е. в переменной с будет содержаться теперь значение суммы двух чисел. Теперь осталось вывести это значение на экран компьютера, что мы сделаем с помощью уже знакомого нам оператора writein. Однако следует учесть, что в этом случае оператор writein используется иначе, чем при выводе текста. Во-первых^ имя переменной, в отличие от текстовой строки, не заключается в апострофы (хотя скобки нужно обязательно ставить и в этом случае). Во-вторых, при выполнении оператора вь(вода на экране мы увидим не имя переменной» а ее текущее значение. Оператор вывода в программе будет записан следующим образом:
writein(с);
В результате же выполнения оператора на экран будет выведена сумма, содержащаяся в переменной с — число 15.
Эта программа (как и предыдущие) состоит из операторов, которые выполняются последовательно друг за другом. Такие программы называются программами линейной структуры.
Теперь попробуем усовершенствовать программу таким образом, чтобы она складывала любые два произвольных числа, которые пользователь введет с клавиатуры компьютера (рис. 3.9). Приведем текст усовершенствованной программы в листинге 35
[■ Листинг 3.5. Усовершенствованная программа сложения двух чисел .
program summa;
Uses Crt;
var
a,b,c:integer;
begin
ClrScr;
writein (* введите 2 числа1);
writein (1после ввода каждого числа нажимайте клавишу Enter *);
readln(а);
readln(b);
c:=a+b;
writein(1 сумма 2 чисел равна *,с); readIn
end.
■ Г utbo Ражеа!■ Г utbo Ражеа!Н <• ■• У S IН <• ■• У S I►.а пи••,у►.а пи••,у'ппгхсм 1^ ? ЧМ<.<1 о (к tt Г Л Г ППОЛЛ Я .* tl/<O' О ЧИ('ппгхсм 1^ ? ЧМ<.<1 о (к tt Г Л Г ППОЛЛ Я .* tl/<O' О ЧИ(аа
■ Г utbo Ражеа!
■ Г utbo Ражеа!
Н <• ■• У S I
Н <• ■• У S I
►.а пи••,у
►.а пи••,у
'ппгхсм 1^ ? ЧМ<.<1 о (к tt Г Л Г ППОЛЛ Я .* tl/<O' О ЧИ(
'ппгхсм 1^ ? ЧМ<.<1 о (к tt Г Л Г ППОЛЛ Я .* tl/<O' О ЧИ(
а
а
б
Рис. 3.9. Усовершенствованная программа сложения двух чисел (е) и результат ее работы (б)
В этом новом варианте программы наряду с уже знакомыми нам операторами используется оператор ввода readln. Общий вид оператора readin похож на оператор writein: он состоит из служебного слова readln и списка ввода, заключенного в скобки. Правда в отличие от списка вывода операторов write и writein в списке ввода могут содержаться только имена переменных. В данной программе использованы два оператора readin, каждый из которых в списке ввода содержит по одной переменной:
readln(а); readln(b);
С помощью операторов ввода переменным а и ь будут присвоены численные значения. Это означает, что при выполнении программы в соответствующие
переменным а и ь области памяти будут занесены те числа, которые пользователь ввел с клавиатуры. Теперь программу можно запускать на выполнение. После запуска программы появится пользовательский экран с мерцающим на нем курсором. Далее, можно вводить числовые значения переменных а и ь. Для ввода каждого из двух чисел необходимо набрать его на клавиатуре, а затем нажать клавишу <Enter>. При этом нужно помнить о том, что вводимые числа по типу должны соответствовать переменным, т. е. быть целыми. При попытке ввести дробное число программа просто прекратит свою работу. После ввода второго числа на экране появится результат работы программы ——сумма двух чисел.
Такая программа будет вполне работоспособна, но неудобна для пользователя, т. к. после ее запуска неопытному пользователю при виде "верного'' экрана не понятно, что же нужно дальше делать. Поэтому сделаем в программе следующее дополнение. Перед операторами ввода поставим операторы вывода, которые будут выводить информацию, подсказывающую пользователю дальнейший ход его действий. Например, таким образом:
writein ('введите 2 числа');
writeIn (*после ввода каждого числа нажимайте клавишу Enter1);
Пользователь будет таким образом знать, что именно ему предстоит делать даже в том случае, если он первый раз работает за компьютером. Теперь программа не только правильно работает, но и обеспечивает для пользователя дружественный интерфейс, т. е. удобный способ общения человека с программой.
В конец программы внесены еще 2 дополнения. В список вывода оператора writein вставлен еще один элемент——текст, поясняющий полученный результат. Список вывода, таким образом, будет состоять из двух элементов, причем текст будет выводиться в неизменном виде, а для переменной будет выведено не ее имя, а ее числовое значение. Кроме этого, после оператора вывода добавлен еще один "пусто而"оператор ввода readin. Этот оператор приостанавливает окончание работы программы до тех пор, пока не будет нажата клавиша <Enter>, т. е. у пользователя появляется возможность сразу ознакомиться с результатами выполнения программы, которые теперь не исчезают с экрана. Не нужно будет после запуска программы на выполнение специально открывать меню Debug и пользоваться командами User screen или Output, чтобы увидеть, что же получилось в итоге работы программы.
В описанной ранее программе использовалась только одна арифметическая операция — сложение. Но в языке Паскаль, естественно, используются и другие арифметические операции (табл. 3.1).
Таблица ЗЛ. Арифметические операции в Паскале
Операция
Описание
+
Сложение
-
Вычитание
*
Умножение
/
Деление!
х" = ехр(〃* 1п(л))
Возведение в степень
div
Целочисленное деление
mod
Нахождение остатка от целочисленного деления
Первые четыре операции выполняются так же, как и в обычной арифметике. Единственное, на что следует обратить внимание: знаки умножения н деления отличаются по написанию (вместо принятых в математике знаков х или • используется *, вместо : используется /). Кроме того, знак умножения между сомножителями нельзя опускать, как это часто делается в математике. Запись ab, которая в математике может обозначать произведение двух чисел а и ь, компилятором языка Паскаль будет воспринята как имя переменной, состоящее из двух букв, что приведет к ошибке в работе программы. Заметим, что в языке Паскаль нет стандартной функции возведения числа в степень, поэтому для этой операции пользуются формулой, приведенной в табл. 3.1. Однако в программе выражения с возведением во вторую, третью, четвертую и пятую степени чаще всего записывают в виде умножения самих на себя, столько раз, каков показатель степени.Что же касается целочисленного деления, то оно выполняется как обычное, но затем отбрасывается дробная часть получившегося при делении числа. Операции div и mod выполняются только над переменными и константами целого типа.
Пример использования действий div и mod:
П значение выражения 91 div 8 равно 11;
значение выражения 91 mod 8 равно з.
При вычислении значения арифметического выражения вначале выполняются действия, обладающие более высоким приоритетом. Слово "прнорнтет” в переводе с латыни означает первенство и, применительно к программированию, имеется в виду первенство при выполнении математических операций. Умножение, деление, целочисленное деление и нахождение остатка как раз и относятся к действиям с высоким приоритетом. Сложение и вычитание имеют более низкий приоритет. Если в выражении имеются действия с одинаковым приоритетом, то они выполняются слева направо по ходу выражения.
Если необходимо изменить порядок действий в выражении, то следует использовать круглые скобки. Действия, заключенные в скобки, обладают наиболее высоким приоритетом, т. е. выполняются в первую очередь.
Для лучшего понимания того, как действуют приоритеты, приведем следующий пример. Пусть в программе требуется вычислить значение арифметического выражения, записанного таким образом:
5 + 3*(7+2) - 40 div 4
Прежде всего, вычисляется выражение, находящееся в скобках——его значение равно 9. Затем слева направо выполняются следующие действия: умножение выражения в скобках на 3 (получаем 27) и целочисленное деление (получаем 10). На завершающем этапе складываем 5 и 27 и вычитаем из суммы 10. В итоге получаем конечный результат — 22.
Говоря об арифметических выражениях, необходимо отметить также следующее: хорошо знакомый нам оператор writein может выводить не только тексты н значения переменных, но и значения арифметических выражений, в которые могут входить переменные и константы. Эти выражения в операторе writein записываются подобно именам переменных в скобках, но без кавычек. Компьютер сперва подсчитает значение выражения, а затем покажет получившийся результат на экране. Например, если мы в какой-либо программе присвоим переменным х и у значения 20 и 30, а затем оператором writein выведем на экран компьютера выражение х+у:
х:=20;
У:=30; writein(х+у);
то в результате выполнения этого фрагмента программы компьютер сперва сложит значения двух переменных, а затем выведет получившуюся сумму на экран компьютера, т. е. в данном случае на экране мы увидим число 50.
До сих пор мы работали со сравнительно небольшими числами. Теперь составим программу, которая оперирует более масштабными величинами. Эта программа пересчитывает объем оперативной памяти компьютера, выраженный в мегабайтах, в килобайтах, байтах и битах (рис. ЗЛО). Между этими единицами измерения информации существуют следующие соотношения:
□ 1 мегабайт = 1024 килобайта;
О 1 килобайт = 1024 байта;
1 байт = 8 бит.
В программе использованы 4 переменные: mb— для объема в мегабайтах, kb — для килобайт, by— для байт, bit— для бит. При составлении данной программы можно столкнуться со следующей проблемой: результаты работы
программы будут выражены достаточно большими числами, которые нельзя обработать с помощью переменных типа integer. Этот тип используется для представления чисел в диапазоне от -32 768 до 32 767. Поэтому для описания переменных используем другой целочисленный тип данных— longint, с помощью которого можно работать с числами в диапазоне от -2 147 483 648 до 2 147 483 647. В листинге 3.6 приводится текст программы.
ClrSer;writein ( * введите о<м»п оперативной попятч 8 н*г аеам* «хЭ ; rtadltHnh);kb:-102й»лЬ; by:=1024*kb; bit:~8*by;. writelnt,объеп папагн равен '.kbJ килобайт*);'writclnCby,* еайг *); writclnCbit.* ght'); readln,end.ClrSer;writein ( * введите о<м»п оперативной попятч 8 н*г аеам* «хЭ ; rtadltHnh);kb:-102й»лЬ; by:=1024*kb; bit:~8*by;. writelnt,объеп папагн равен '.kbJ килобайт*);'writclnCby,* еайг *); writclnCbit.* ght'); readln,end.
ClrSer;
writein ( * введите о<м»п оперативной попятч 8 н*г аеам* «хЭ ; rtadltHnh);
kb:-102й»лЬ; by:=1024*kb; bit:~8*by;
. writelnt,объеп папагн равен '.kbJ килобайт*);
'writclnCby,* еайг *); writclnCbit.* ght'); readln
,end.
ClrSer;
writein ( * введите о<м»п оперативной попятч 8 н*г аеам* «хЭ ; rtadltHnh);
kb:-102й»лЬ; by:=1024*kb; bit:~8*by;
. writelnt,объеп папагн равен '.kbJ килобайт*);
'writclnCby,* еайг *); writclnCbit.* ght'); readln
,end.
Рис. 3.10. Программа, подсчитывающая объем оперативной памяти компьютера (а), и результат ее работы (б)Рис. 3.10. Программа, подсчитывающая объем оперативной памяти компьютера (а), и результат ее работы (б)
Рис. 3.10. Программа, подсчитывающая объем оперативной памяти компьютера (а), и результат ее работы (б)
Рис. 3.10. Программа, подсчитывающая объем оперативной памяти компьютера (а), и результат ее работы (б)
i U:10 =rr
aaex.rn■,犀 rwxunn—LWMJaffl^inMi凡 жп m 便 rmJmsaMflta
a
a
Листинг 3.6. Программа с использованием больших целых чисел 二 二遍
program memory;
Uses Crt;
var
mb,kbzby,bit:longint;
begin
ClrScr;
writein (•введите объем оперативной памяти в мегабайтах');
readln(mb);
kb:=1024*mb;
by:=1024*kb;
bit:=8*by;
writeIn(•объем памяти равен \ kb,* килобайт');
writein(by,* байт ,);
writein(bit,* бит');
readln
end.
Исходная информация, необходимая для вычислений ——объем памяти в мегабайтах —вводится с помощью оператора readln, как и в предыдущей программе, а все последующие результаты вычисляются в соответствии с приведенными соотношениями и затем выводятся на экран компьютера операторами writein. В данной программе список вывода каждого из операторов writein содержит не один, а два или три элемента. Каждый из этих элементов обрабатывается в соответствии с его видом. Текст, заключенный в апострофы, выводится так, как он есть, без изменений, а для переменных выводятся их текущие значения.
Для решения ряда задач, в которых используются только целые числа, удобно бывает использовать действия div и mod. В качестве примера составим программу, обслуживающую работу банкомата (листинг 3.7, рис. 3.11). Банкомат должен выдавать клиенту требуемую сумму, но при этом расходовать наименьшее количество купюр. Желательно также, чтобы на экране банкомата выводилось сообщение о том, какими именно купюрами и в каком количестве выдавалась запрошенная клиентом сумма. В банкомате имеются купюры по 1000, 500> 100 и 50 рублей. Тогда алгоритм решения данной задачи сводится к следующему. Вначале программа предлагает клиенту ввести требуемую сумму. (Так как банкомат не содержит мелочи» то попросим пользователя ввести сумму, кратную 50.) Затем эта сумма делится на 1000. Результат целочисленного деления и будет минимальным количеством банкнот по 1000 рублей. Остаток от деления разделим на 500 и получим соответственно минимальное требуемое количество банкнот по 500 рублей. Аналогичным образом найдем количество банкнот по 100 рублей. Наконец, получившийся остаток при делении на 100 разделим на 50 и получим количество банкнот по 50 рублей.
Если, например, нам нужно определить, каким минимальным количеством купюр можно выдать сумму 4750 рублей, то сперва делим эту сумму на 1000 и находим остаток от деления:
4750 div 1000 = 4; 4750 mod 1000 = 750
теперь нам известно, что минимальное количество купюр по 1000 рублей равно 4,а оставшаяся сумма составляет 750 рублей. Эту сумму делим уже на 500:
750 div 500= 1; 750 mod 500 = 250
следовательно, нам понадобится как минимум 1 купюра по 500 рублей, а сумма, которую нужно будет выдать 50- и 100-рублевыми купюрами, составит 250 рублей. Используя аналогичные вычисления, мы получим, что эту сумму можно выдать одной 50-рублевой и двумя 100-рублевыми купюрами.
Рис. 3.11. Программа 'Банкомат** (а) и результат ее работы (б)Рис. 3.11. Программа 'Банкомат** (а) и результат ее работы (б)
Рис. 3.11. Программа 'Банкомат** (а) и результат ее работы (б)
Рис. 3.11. Программа 'Банкомат** (а) и результат ее работы (б)
Листинг 3.7. Программа ''Банкомат*'
program bankomat;
Uses Crt;
var
sum, klOOOj к500, klOO, к50, vspom: integer; begin
ClrScr;
writein (* Введите сумму, кратную 50*);
readln (sum);
klOOO:=sum div 1000;
vspom:=sum mod 1000;
k500:=vspom div 500;
vspom: =vspom mod 500;
kl00:=vspom div 100;
vspom: =vspcxn mod 100;
k50: =vspom div 50;
writeln(•количество банкнот по 1000 рублей -
\kl000);
writein(* количество банкнот по 500 рублей -
■,к50О);
writeln(*количество банкнот по 100 рублей -
',к100);
writeln(* количество банкнот по 50 рублей -'
,k50);
readln
end.
При составлении программы используются следующие переменные: sum —— вводимая клиентом сумма, июоо— количество купюр по 1000 рублей; к500 — количество купюр по 500 рублей, kioo — количество купюр по 100 рублей, к50 — количество купюр по 50 рублей, vspom— вспомогательная переменная, в которой содержится остаток, получающийся при делении. Программа с помощью описанных ранее операций находит значения переменных kiooo, к500, kioo и к50, а затем выводит их на экран компьютера. При этом переменная vspom в процессе выполнения программы несколько раз меняет значение. В начале ей присваивается значение остатка от деления на 1000, затем на 500 н, наконец, на 100.
Для лучшего понимания данной программы снабдим ее комментариями. Мы уже упоминали о том, что комментарии представляют собой пояснения к тексту программы, а теперь рассмотрим их использование более подробно. Это необходимо сделать ввиду того, что комментарии являются неотъемлемой частью любой достаточно большой и сложной программы. При их отсутствии в такой программе бывает непросто разобраться даже опытному программисту.
Правила использования комментариев в программе достаточно либеральны. Они могут располагаться в любом месте программы. Комментарии могут находиться на той же строке, что и основной текст программы, либо занимать отдельную строку или несколько строчек в программе. Вне зависимости от места и способа расположения комментариев при запуске программы на выполнение компилятор игнорирует их, что показывает рис. 3.12. Хотя в про-
3 Зак 1068
грамму "Банкомат" добавлено определенное количество комментариев, результат работы программы при использовании тех же исходных данных» что и ранее, остается неизменным. Комментарии таким образом можно добавлять в программу там, где это удобно программисту, но при этом нужно помнить о том, что любой комментарий должен быть обязательно ограничен фигурными скобками или символами (* и *) с обеих сторон. При просмотре текста ранее составленной программы комментарии легко определить визуально, т. к. в отличие от основного текста программы они выделены серым цветом. В листинге 3.8 приведен текст программы, дополненный комментариями.
1U00 руьисй)1U00 руьисй)количествколичествкупюркупюр500 руьяей)500 руьяей)количестваколичествакупюркупюрпопо100 рубпе。)100 рубпе。)КОНИЧСС tBdКОНИЧСС tBd” mop” mopпопо50 рублей)50 рублей)(сычиснекие(сычиснекиеколичестваколичествабанкнот еанкао г банкнот банкнотбанкнот еанкао г банкнот банкнотпо по по попо по по поtpeлупь(□1 о») (на экран) (конп матера)tpeлупь(□1 о») (на экран) (конп матера)500 рублей - *,k5D0);100 руьпе口 - *vk100);50 р9бпей -".e50);500 рублей - *,k5D0);100 руьпе口 - *vk100);50 р9бпей -".e50);J 卄 时B*Et“— J3. "■ |】t“1 Сим"е 一 “ Хв" AM+FTU 丄“,1.1»“11. •亠щJ 卄 时B*Et“— J3. "■ |】t“1 Сим"е 一 “ Хв" AM+FTU 丄“,1.1»“11. •亠щ]百 】uiba Pascal]百 】uiba Pascal1А0П рублей - * tk1000); Спыипд>1А0П рублей - * tk1000); Спыипд>21:7 =-21:7 =-program bankomat; Uses Crt; uarsumvk10Oflrk5O0,k1DOak5Ovuspon:integer;beginClrScr ; (котжхи D4MC1RM JKpdltd)writeln(^Введите сунну, кратную 50*);read In(sum);<Rao/i нс хоаной огпичмны}program bankomat; Uses Crt; uarsumvk10Oflrk5O0,k1DOak5Ovuspon:integer;beginClrScr ; (котжхи D4MC1RM JKpdltd)writeln(^Введите сунну, кратную 50*);read In(sum);<Rao/i нс хоаной огпичмны}k1000:=sun div 1000; (вычислениеvspon:=sun nod 1UD0;kSO0:=u5pon div SOD; (вычиспениеuspom:=vspoTn mod S00;k1DU:二uspon div 100; {ьычиспснмг vspon:=vspom nod 100;k1000:=sun div 1000; (вычислениеvspon:=sun nod 1UD0;kSO0:=u5pon div SOD; (вычиспениеuspom:=vspoTn mod S00;k1DU:二uspon div 100; {ьычиспснмг vspon:=vspom nod 100;kS0:=vspom diu 50; writrlnt *колмчество writeln(*копмчсстио writeln(^количество writelht ^количество red InendkS0:=vspom diu 50; writrlnt *колмчество writeln(*копмчсстио writeln(^количество writelht ^количество red InendааРис. 3.12. Программа "Банкомат1' с комментариями (а) и результат ее работы 何Рис. 3.12. Программа "Банкомат1' с комментариями (а) и результат ее работы 何
1U00 руьисй)
1U00 руьисй)
количеств
количеств
купюр
купюр
500 руьяей)
500 руьяей)
количества
количества
купюр
купюр
по
по
100 рубпе。)
100 рубпе。)
КОНИЧСС tBd
КОНИЧСС tBd
” mop
” mop
по
по
50 рублей)
50 рублей)
(сычиснекие
(сычиснекие
количества
количества
банкнот еанкао г банкнот банкнот
банкнот еанкао г банкнот банкнот
по по по по
по по по по
tpeлупь(□1 о») (на экран) (конп матера)
tpeлупь(□1 о») (на экран) (конп матера)
500 рублей - *,k5D0);
100 руьпе口 - *vk100);
50 р9бпей -".e50);
500 рублей - *,k5D0);
100 руьпе口 - *vk100);
50 р9бпей -".e50);
J 卄 时B*Et“— J3. "■ |】t“1 Сим"е 一 “ Хв" AM+FTU 丄“,1.1»“11. •亠щ
J 卄 时B*Et“— J3. "■ |】t“1 Сим"е 一 “ Хв" AM+FTU 丄“,1.1»“11. •亠щ
]百 】uiba Pascal
]百 】uiba Pascal
1А0П рублей - * tk1000); Спыипд>
1А0П рублей - * tk1000); Спыипд>
21:7 =-
21:7 =-
program bankomat; Uses Crt; uar
sumvk10Oflrk5O0,k1DOak5Ovuspon:integer;
begin
ClrScr ; (котжхи D4MC1RM JKpdltd)
writeln(^Введите сунну, кратную 50*);
read In(sum);<Rao/i нс хоаной огпичмны}
program bankomat; Uses Crt; uar
sumvk10Oflrk5O0,k1DOak5Ovuspon:integer;
begin
ClrScr ; (котжхи D4MC1RM JKpdltd)
writeln(^Введите сунну, кратную 50*);
read In(sum);<Rao/i нс хоаной огпичмны}
k1000:=sun div 1000; (вычисление
vspon:=sun nod 1UD0;
kSO0:=u5pon div SOD; (вычиспение
uspom:=vspoTn mod S00;
k1DU:二uspon div 100; {ьычиспснмг vspon:=vspom nod 100;
k1000:=sun div 1000; (вычисление
vspon:=sun nod 1UD0;
kSO0:=u5pon div SOD; (вычиспение
uspom:=vspoTn mod S00;
k1DU:二uspon div 100; {ьычиспснмг vspon:=vspom nod 100;
kS0:=vspom diu 50; writrlnt *колмчество writeln(*копмчсстио writeln(^количество writelht ^количество red In
end
kS0:=vspom diu 50; writrlnt *колмчество writeln(*копмчсстио writeln(^количество writelht ^количество red In
end
а
а
Рис. 3.12. Программа "Банкомат1' с комментариями (а) и результат ее работы 何
Рис. 3.12. Программа "Банкомат1' с комментариями (а) и результат ее работы 何
Листинг 3.8. Программа "банкомат’ с комментариями
program bankomat;
Uses Crt;
var
sum,klOOO.к500,kTOO,к50,vspom:integer; begin
ClrScr; {команда очистки экрана} writeIn('Введите сумму, кратную 50'); readln(sum);{ввод исходной величины}
kl000:=sum div 1000; {вычисление количества vspom:«sum mod 1000;
k500:=vspom div 500; {вычисление количества vspom:Rspom mod 500;
kl00:=vspom div 100; {вычисление количества vspom:®vspam mod 100;
купюр по 1000 рублей}купюр по 500 рублей)купюр по 100 рублей}купюр по 50 рублей Jкупюр по 1000 рублей}купюр по 500 рублей)купюр по 100 рублей}купюр по 50 рублей Jwritein(* writeln(1 writein(' writein(•writein(* writeln(1 writein(' writein(•количествоколичествоколичествоколичествоколичествоколичествоколичествоколичествобанкнот банкнот банкнот банкнотбанкнот банкнот банкнот банкнотпопопопопопопопо1000 рублей - ’,kl000);500 рублей - 1,k500);100 рублей - ',kl00);50 рублей - *■k50);1000 рублей - ’,kl000);500 рублей - 1,k500);100 рублей - ',kl00);50 рублей - *■k50);{вывод} {результатов} (на экран}{компьютера}{вывод} {результатов} (на экран}{компьютера}k50:=vspom div 50;{вычисление количества
купюр по 1000 рублей}
купюр по 500 рублей)
купюр по 100 рублей}
купюр по 50 рублей J
купюр по 1000 рублей}
купюр по 500 рублей)
купюр по 100 рублей}
купюр по 50 рублей J
writein(* writeln(1 writein(' writein(•
writein(* writeln(1 writein(' writein(•
количество
количество
количество
количество
количество
количество
количество
количество
банкнот банкнот банкнот банкнот
банкнот банкнот банкнот банкнот
по
по
по
по
по
по
по
по
1000 рублей - ’,kl000);
500 рублей - 1,k500);
100 рублей - ',kl00);
50 рублей - *■k50);
1000 рублей - ’,kl000);
500 рублей - 1,k500);
100 рублей - ',kl00);
50 рублей - *■k50);
{вывод} {результатов} (на экран}
{компьютера}
{вывод} {результатов} (на экран}
{компьютера}
readln
end.
Работа с вещественными величинами
Естественно, что задачи, решаемые с помощью Turbo Pascal, не ограничиваются такими, в которых при расчетах используются только целые числа. Для того чтобы можно было использовать переменные, которые могут принимать вещественные значения (т. е. значения в виде десятичных дробей), следует в разделе описания переменных описать их с помощью типа real (вещественный).
Вещественные числа в Паскале можно записывать двумя способами —— с фиксированной точкой и с плавающей точкой. Запись с фиксированной точкой похожа на обычную запись десятичной дроби в математике, только целая часть от дробной отделяется не запятой, а точкой. Например, число 10,23 с фиксированной точкой записывается как 10.23.
Другим способом представления вещественных чисел является запись с плавающей точкой. В этом случае число представляется как произведение двух сомножителей т・10\ где m——мантисса числа, а п— порядок числа. Мантисса — это целое число или вещественное число с фиксированной точкой, которое может принимать значение в диапазоне от I до 10. Показатель может быть только целым числом. Именно в таком виде по умолчанию выводятся на экран компьютера вещественные числа, причем запись с плавающей точкой будет выглядеть следующим образом ——шЕп, где е заменяет собой основание
степени—— число 10. Перед показателем указывается его знак. Число 125.73 (далее в пособии мы будем использовать именно такую запись десятичных дробей) с плавающей точкой будет записано как 1.2573000000Е+02, т. е. 1.25 73-102, а число 0.00441 будет записано как 4.41ООООООООЕ-ОЗ, т. е. 4.41 ТО". Представление чисел с плавающей точкой, как правило, используется для записи либо очень больших, либо очень маленьких чисел, т. к. и в том н в другом случае при записи числа в обычном виде оно будет воспроизводиться с большим количеством нулей, что затрудняет восприятие данного числа. Но для представления результатов в большинстве задач все же более наглядным и удобным является вид числа с фиксированной точкой.
В качестве примера использования вещественных переменных рассмотрим задачу вычисления объема параллелепипеда, где его высота, длина и ширина——вещественные числа (рис. 3.13). В программе, написанной для решения данной задачи, используются четыре переменные. Все они описаны как вещественные. Это 1 ——длина параллелепипеда, w — его ширина, h — высота и V— искомый объем. Исходные данные вводятся с помощью операторов readin. Затем вычисляется произведение этих трех величин и присваивается переменной w, значение которой выводится оператором write in. При вводе в компьютер исходных данных не забываем отделять целую часть числа от дробной точкой. В листинге 3.9 приводится текст данной программы.
j Листинг 3.9. Вычисление объема параллелепипеда
program paral;
Uses Crt;
var l,w.h,v: real;
begin
ClrScr;
writeIn(1Введите длину параллелепипеда,);
readln (1);
writein(*Введите ширину параллелепипеда *); readln (w);
writein('Введите высоту параллелепипеда *); readln (h);
v:=l*w*h;
writein (* Объем параллелепипеда равен *rv); readln end.
При длине параллелепипеда, равной 4.2, ширине— 2.5 и высоте— 1.8, получим следующий результат: 1.8900000000Е+01.
Как и следовало ожидать, результат выведен с плавающей точкой. Хотелось бы видеть результат вычислений в более привычной нам форме. На этот случай в языке Паскаль предусмотрена возможность форматированного вывода^ т. е. программист может сам определять внешний вид выводимого значения вещественной переменной. Для этого в операторе вывода после нменн переменной нужно поставить двоеточие. После двоеточия указывается общее количество символов, отводимое под значение данной переменной, далее ставится еще одно двоеточие, а затем указывается количество цифр в дробной части числа. Не нужно забывать при этом, что одну позицию нужно оставить для точки. Например, если мы хотим, чтобы в программе выводимое на экран значение некоторой переменной t, относящейся к вещественному типу, занимало 8 позиций» из которых 3 отводится под дробную часть, 1 — под десятичную точку, а 4 — под целую часть, то мы запишем наши пожелания в операторе вывода следующим образом:
writein(t:8:3);
Следует заметить, что если фактически в вещественном числе (значении форматируемой переменной) содержится больше цифр после точки, чем указано в операторе вывода после второго двоеточия, то млишние0 цифры отбрасываются, а если число цифр после точки меньше, чем указанное, то недостающие цифры заменяются нулями.
Исходя из сказанного ранее, в нашей программе оператор вывода можно изменить следующим образом:
wri teln (* Объем параллелепипеда равен *, v: 6:2)
т. е. под значение переменной будет использовано 6 символов, в том числе 3 символа для целой части, 1 — для точки и 2 ——для дробной части. Тогда при тех же исходных данных результат будет выведен в следующем виде:
Объем параллелепипеда равен 18.90
т. е. результат будет представлен в виде, удобном для восприятия человеком (рис. 3.13).
В программе из листинга 3.9 мы использовали только переменные вещественного типа, но в дальнейшем нам придется составлять программы, в которых будут использоваться переменные как вещественного типа» так и целого, причем эти переменные будут взаимодействовать друг с другом. Взаимодействие это может проявляться и в том, что в программах будут встречаться математические выражения, в которых имеются и целые, и вещественные переменные и константы. Естественно, что возникает вопрос: к какому типу будет относиться результат вычислений с участием величин разного типа. Это важно еще и потому, что если мы, например, присвоим целой переменной вещественное значение, то при компиляции программы будет выдано
ббРис. 3.13. Программа вычисления объема параллелепипеда (а) и результат ее работы (б)Рис. 3.13. Программа вычисления объема параллелепипеда (а) и результат ее работы (б)
б
б
Рис. 3.13. Программа вычисления объема параллелепипеда (а) и результат ее работы (б)
Рис. 3.13. Программа вычисления объема параллелепипеда (а) и результат ее работы (б)
сообщение о несоответствии используемых типов. На поставленный вопрос отвечает специальный набор правил языка Паскаль.
П Если над двумя величинами целого типа производятся операции сложения, вычитания или умножения, то результатом данной операции будет величина целого типа.
Если операции сложения, вычитания или умножения производятся над двумя вещественными величинами, то результатом операции будет вещественная величина.
Если операции сложения, вычитания или умножения производятся над двумя величинами, одна из которых является целой, а другая вещественной, то результатом будет вещественная величина.
П Если над любыми числовыми величинами (целочисленными или вещественными) производится операция деления (не целочисленного), то ее результатом будет вещественная величина.
На последнее правило следует обратить особое внимание, т. к. даже если в операции деления участвуют две целые величины, то результатом нх будет величина вещественная. Проиллюстрируем это следующим простым примером. Пусть нам нужно найти частное от деления двух целых чисел — 5 разделить на 4. Результатом будет число 1.25, т. е. величина явно вещественная. И это понятно. Но если 25 разделить на 5, то получится также вещественное число 5.0 (а не просто 5, как могло бы показаться). Поэтому если, к примеру, в программе у нас имеются некие две переменные к и 1, причем обе они относятся к целому типу, но в программе может встретиться операция деления одной переменной на другую, то для хранения результата этой операции следует использовать переменную г, которая должна быть описана как вещественная.
Однако в Паскале присутствует такое явление, как совместимость типов. В соответствии с ним переменным одного типа можно присваивать значения, относящиеся к другому типу. При этом должно соблюдаться следующее правило: тип присваиваемого значения должен являться подмножеством возможных значений переменной. Например, переменной вещественного типа можно присвоить целочисленное значение, поскольку множество целых чисел является по дм ножеством вещественных чисел. Но целочисленной переменной нельзя присвоить вещественное значение, т. к. множество вещественных чисел не является подмножеством целых чисел.
В Паскале имеются специальные средства (функции), позволяющие преобразовывать одни типы данных в другие: trunc, round, chr и ord. Эти функции будут подробно рассмотрены в следующих главах книги.
Перед тем как завершить данную главу, отметим еще одно обстоятельство, связанное с работой в среде программирования Turbo Pascal. Часто у пользователя, работающего в системе, возникает необходимость не только записать на диск созданный им файл, но и открыть один из ранее созданных. Такое желание может быть обусловлено двумя причинами.
Во-первых, пользователь может использовать текст написанных ранее им или кем-либо другим программ в качестве примера и наглядного пособия для создания новых программ. Во-вторых, пользователь может неоднократно обращаться к одной из уже записанных на жесткий диск программ в целях исправления имеющихся в ней ошибок, улучшения внешнего вида и надежности работы программы.
Для выполнения указанных операций используется команда Open из меню File. После выполнения этой команды открывается диалоговое окно, которое по своей структуре сходно с тем окном, которое используется для сохранения файла на жестком диске по команде Save as. Оба окна состоят из одних и тех же элементов, аналогичным образом производится навигация (перемещение
по файловой структуре) в обоих окнах. После обнаружения и выделения искомого файла его открытие производится щелчком на экранной кнопке Open (рис. 3.14).
Рис. 3.14. Диалоговое окно открытия ранее созданного файла
Задания для самостоятельной работы
Задание 1. Составить программу, которая бы выводила на экран компьютера на светло-сером фоне фиолетовыми буквами в пять строк следующий текст:
Существуют следующие основные виды программного обеспечения персональных компьютеров:
Системные программы
Прикладные программы
Инструментальные системы или системы программирования
Задание 2. Составить программу, которая бы выводила на экран компьютера треугольник зеленого цвета, составленный из символов * (звездочка). Вершину треугольника должна составлять одна звездочка, на следующей строке должно быть три символа *, на третьей — пять и т. д. вплоть до основания треугольника, составленного из пятнадцати звездочек.
Задание 3. Составить программу, которая бы определяла разницу между двумя моментами времени, выраженными в часах и минутах. Первый момент
времени предшествует второму. Сама разница также должна быть выражена в часах н минутах. Величина как первого, так и второго моментов времени должна быть введена в компьютер с клавиатуры.
Задание 4. Составить программу, которая бы по известному радиусу окружности вычисляла бы длину окружности и площадь круга. Величина радиуса вводится в компьютер с клавиатуры.
Задание 5. Покупатель приобрел на рынке а килограммов картофеля, ь килограммов огурцов н с килограммов помидоров. Составить программу, которая бы позволила подсчитать общую сумму покупки. Цена 1 килограмма каждого из приобретенных овощей (в рублях и копейках) и приобретенное их количество (в килограммах) для каждого вида овощей вводятся в компьютер с клавиатуры.
ГЛАВА 4
Ветвление в Паскале
В жизни человеку часто приходится сталкиваться с ситуациями, когда в зависимости от складывающейся обстановки ему нужно выбирать тот или иной способ действия. При решении поставленной перед программистом задачи также нередко возникает ситуация, когда нужно выбирать один из двух или нескольких возможных вариантов дальнейшего хода программы. В этом случае в программе используется структура, называемая ветвлением. В отличие от программ линейной структуры, в которых все операторы выполняются последовательно друг за другом, в программах с ветвлением в зависимости от значений вводимых исходных данных может работать одна нз двух или нескольких ветвей, вариантов программы.
Такая структура реализуется в программе посредством условных операторов. В заголовке условного оператора содержится некоторое условие, выполнение или невыполнение которого и определяет дальнейшую работу программы. Так как программист заранее не знает, какой из вариантов будет выполняться, выбор должен производить сам компьютер. В качестве условий, истинность или ложность которых проверяется, чаще всего используются знакомые читателю по школьному курсу математики операции сравнения различных величин. В языке Паскаль используется 6 таких операций:
П < ——меньше;
> — больше;
口 = — равно;
v= — меньше или равно;
>= — больше или равно;
П о — не равно.
Написание последних 3 операций отличается от принятого в математике, где соответственно используются обозначения <, > и W, но т. к. клавиш с по-
добными обозначениями нет на клавиатуре компьютера, то используются указанные ранее сочетания из двух символов.
Начнем мы рассмотрение условных операторов с более простого случая, когда в случае истинности проверяемого соотношения выполняется один вариант действий, а в случае ложности другой вариант. Такой выбор дальнейшего хода действий реализуется с помощью условного оператора if.
Условный оператор ff
Общий вид оператора if следующий:
if условие
then вариант!
else вариант2;
служебные слова if, then и else в переводе с английского означают соответственно если, то, иначе. Оператор действует следующим образом: сначала проверяется, выполняется ли условие, находящееся после слова if. Если это условие выполняется (иначе говоря, является истинным), то осуществляется первый вариант действий, в противном случае, если условие не выполняется (является ложным)— второй, записанный после служебного слова else. В самом простом случае действие, осуществляемое в каждом из вариантов, состоит из одного оператора.
Классическим примером использования оператора if является программа, определяющая наибольшее из двух введенных чисел. Для наглядности решения данной задачи запишем предварительно алгоритм ее решения в виде графической схемы (рис. 4.1), а затем реализуем его в виде компьютерной программы.
Первоначально вводятся два числа а и ь (ввод записан в верхнем параллелограмме), затем проверяется истинность условия а>ь (проверка записана в ромбе). Если данное условие истинно, то на экран компьютера выводится число а, которое является наибольшим (выполняется операция, указанная в левом нижнем параллелограмме), если же условие ложно, то на экран выводится являющееся наибольшим число ь (осуществляется операция, записанная в правом нижнем параллелограмме).
Теперь от графической схемы перейдем к программе, изображенной на рис. 4.2. В этой программе с помощью уже знакомых нам операторов readin с клавиатуры вводятся значения переменных а и ь. Затем с помощью условного оператора if производится проверка условия а>ь и выполняется либо оператор вывода writein, записанный после служебного слова then, либо тот оператор вывода, который находится после служебного слова else. Обратите
внимание на то, что хотя конструкция if.. .then. • .else расположена на трех строчках, между этими строчками не ставится точка с запятой, т. к. вся эта конструкция представляет собой единый условный оператор, который в качестве своих элементов может включать в себя другие операторы (в данном случае операторы вывода). В листинге 4.1 приводится текст программы.
Рис. 4Л. Графическая схема определения наибольшего из двух чисел
z Листинг 4Л. Определение наибольшего из двух чисел
program maxim;
Uses Crt;
var arb:integer;
begin
ClrScr;
writein (* Введите первое число1);
readln(а);
writein('Ввелите второе число');
readln(b);
if а>Ь
then writein(а,* большее из двух чисел *)
else writein(br1 большее из двух чисел1);
readln
end.
66Рис. 4.2. Программа определения большего из двух чисел (а) и результат ее работы (6)Рис. 4.2. Программа определения большего из двух чисел (а) и результат ее работы (6)
6
6
Рис. 4.2. Программа определения большего из двух чисел (а) и результат ее работы (6)
Рис. 4.2. Программа определения большего из двух чисел (а) и результат ее работы (6)
Условный оператор if удобно использовать для составления различных программ-тестов, проверяющих знания пользователя. Например, программа, приведенная на рис. 4.3 проверяет, знает ли пользователь дату первого полета человека в космос. В случае правильного ответа на экран выводится сообщение пВы дали правильный ответ", в противном случае сообщение 11 Вы ошиб-
лнсь". В этой программе с помощью оператора writein пользователю задается вопрос, ответ на который он должен дать, введя дату с клавиатуры. Введенное пользователем значение присваивается переменной i. Затем значение этой переменной сравнивается с правильным ответом— числом 1961. Если равенство выполняется, то оператором wnteln выводится на экран сообщение о правильном ответе, если значение i не совпадает с правильной датой, выводится сообщение об ошибке. В листинге 4.2 приводится текст данной программы.
Т I utbo Pascal
В К<1 КОП f ОЦ'/ ГЛ4П CUhr |HUCtl лгрпый Hour Т MCtlOUrKd В KUtHUC ?
Кнг дм г г ”“<-““ и “.m”" **l nf сг**
1УА1
Вы доли правмпьиый от hr г
Рис. 4.3. Программа-тест (а) и результат ее работы (б)
Листинг 4.2. Пример простейшего теста
program flight;
Uses Crt;
var i:integer;
begin
Clrscr;
writein (*B каком году был совершен первый попет человека в космос?*); writein (1 Введите число и нажмите ,,EnterM *);
readln(i); if i=1961 then writein (*Вы дали правильный ответ1) else writein('Вы ошиблись');
readln;
end.
Тот вид условного оператора, который был описан нами ранее, представляет собой полную форму условного оператора, но такая форма его записи не является единственно возможной. Наряду с ней в языке Паскаль используется и сокращенный условный оператор. Такой оператор имеет следующий общий вид:
if условие then действие;
Сокращенный условный оператор работает следующим образом. Если условие, содержащееся после служебного слова if, истинно, то выполняется действие, записанное после then, а если условие ложно, то в условном операторе не выполняется никаких действий, и программа переходит к выполнению следующего оператора, расположенного вслед за данным условным оператором.
Как работают сокращенные условные операторы, разберем на примере следующей задачи: нам нужно отыскать наибольшее и наименьшее число на сей раз среди трех введенных с клавиатуры чисел. Исходный текст программы, которая решает данную задачу, приводится в листинге 43
j Листинг 4.3» Определение наибольшего и наименьшего числа
i из трех введенных чисел
LJ•&」"……^.Л..-^:,^^. 4~△•□—__・.:;..:...:..^ ...一“宀血“.:,“...“.Uli
program шахЗ;
Uses Crt;
var a,b,crinaxrmin:integer;
begin
ClrScr;
writein('Введите число1); readln(a);
writein{'Введите число*); readln(Ь);
writein(* Введите число*);
readln(с);
шах:-а;
if b>max then гпах:=Ь;
if c>max then max:=c;
min:=a;if b<minif c<min writein(* writein(* readlnend.min:=a;if b<minif c<min writein(* writein(* readlnend.then min:=b;
min:=a;
if b<min
if c<min writein(* writein(* readln
end.
min:=a;
if b<min
if c<min writein(* writein(* readln
end.
then min:=c;
Наибольшее число',max);
Рис. 4.4. Программа определения наибольшего и наименьшего числа из трех чисел (а) и результат ее работы (б)Рис. 4.4. Программа определения наибольшего и наименьшего числа из трех чисел (а) и результат ее работы (б)Наименьшее число * fmin);
Рис. 4.4. Программа определения наибольшего и наименьшего числа из трех чисел (а) и результат ее работы (б)
Рис. 4.4. Программа определения наибольшего и наименьшего числа из трех чисел (а) и результат ее работы (б)
В данной программе (рис. 4.4) операторами readln производится ввод исходных данных——трех чисел, которые присваиваются переменным а, b и с. Кроме переменных, содержащих сравниваемые числа, в программе используется еще одна переменная max. В начале переменной шах присваивается значение, представляющее собой первое число, содержащееся в переменной а.
Затем переменная max сравнивается с переменной ь с помощью сокращенного условного оператора if. Если значение ь больше, чем значение max, то переменной пах присваивается новое значение, равное ь. Если же значение ь меньше или равно значению max, то никаких действий сокращенный условный оператор больше не производит, и программа переходит к выполнению следующего оператора. В любом случае в итоге действия условного оператора мы в переменной max имеем наибольшее из двух чисел а и ь.
Следующий оператор в программе также относится к числу сокращенных: условных операторов. Этот оператор сравнивает имеющееся в переменной max наибольшее из двух чисел с третьим, содержащимся в переменной с. Если значение с больше чем шах, то значение max изменяется: ей присваивается значение с. Если с меньше или равно max, то max остается без изменений. В итоге последовательного действия двух сокращенных условных операторов мы получим в переменной max искомую величину» которая является нам- большей из трех чисел. Остается только вывести значение переменной max оператором writein на экран компьютера ——это и будет решение поставленной задачи.
Аналогичные действия производятся для нахождения наименьшего значения (min).
Используя сокращенные условные операторы, мы усовершенствуем программу-тест, приведенную на рис. 4.3. Новый, усовершенствованный вариант этой программы позволит превратить тест в настоящий виртуальный экзамен на знание истории освоения космоса (рис. 4.5). В ходе сдачи экзамена пользователь должен опветить на 3 вопроса, которые последовательно появляются на экране компьютера. Программа будет не только информировать пользователя о правильности или неправильности ответа на очередной вопрос, но и выставит за экзамен итоговую оценку. Экзаменуемый, правильно ответивший на все вопросы, получает за экзамен 5 баллов. За каждый неправильный ответ оценка снижается на 1 балл. Поэтому минимальная оценка за экзамен (при неправильном ответе на все 3 вопроса) составит двойку.
Программу мы построим теперь следующим образом. Оценка экзаменуемого будет находиться в переменной п. В начале программы присвоим этой переменной значение 5. В дальнейшем значение этой переменной будет либо оставаться неизменным в случае правильных ответов, либо изменяться в сторону уменьшения при неправильных ответах. Каждый вопрос экзамена выводится на экран компьютера оператором writein. Пользователь должен дать на него ответ, введя с клавиатуры спрашиваемую дату. Введенная дата оператором readin присваивается переменной i. Значение этой переменной сравнивается с правильной датой. Операция сравнения записывается в сокращенном условном операторе после слова if. Если введенный ответ нс равен "зталон- ной'* дате, записанной в условии, то значение переменной п уменьшается на
единицу, т. е. оценка снижается на 1 балл. Если же пользователь дал правильный ответ, то неравенство, записанное после then, выполняться не будет и значение п, т. е. оценка, не изменится. По завершении работы программы конечное значение п, т. е. итоговая оценка, будет выведено па экран компьютера. В листинге 4.4 приводится текст данной программы.единицу, т. е. оценка снижается на 1 балл. Если же пользователь дал правильный ответ, то неравенство, записанное после then, выполняться не будет и значение п, т. е. оценка, не изменится. По завершении работы программы конечное значение п, т. е. итоговая оценка, будет выведено па экран компьютера. В листинге 4.4 приводится текст данной программы.日 Т urbo Pascal日 Т urbo Pascalныснысprogran space;Uses Crt; uar i,n:integer;C IrScr;progran space;Uses Crt; uar i,n:integer;C IrScr;згite1п("В каком rrad IM i);if 101957 then writelnC ^B Rdxon readinli);if 101961 then wrlieln(*B каки口 read ln(i);if 1C19&9 thenзгite1п("В каком rrad IM i);if 101957 then writelnC ^B Rdxon readinli);if 101961 then wrlieln(*B каки口 read ln(i);if 1C19&9 thenгоду «ыл запущен первый искусственный спутник Зенах');году «ыл запущен первый искусственный спутник Зенах');п:~п 1;году состоялся первый полет человека в коспос');п:~п 1;году состоялся первый полет человека в коспос');n:=n-1 ;голу cocтоялся первый попет чеповек<> на Пуну');n:=n-1 ;голу cocтоялся первый попет чеповек<> на Пуну');п:=п-1;п:=п-1;writeIл(^лшл оценка m зкзансн равна *,n); rcddlnwriteIл(^лшл оценка m зкзансн равна *,n); rcddln=〔8:7 =='_=〔8:7 =='_'1рм Л11+ГУ С wile F5 呵屍,'1рм Л11+ГУ С wile F5 呵屍,*叫■二*叫■二аа
единицу, т. е. оценка снижается на 1 балл. Если же пользователь дал правильный ответ, то неравенство, записанное после then, выполняться не будет и значение п, т. е. оценка, не изменится. По завершении работы программы конечное значение п, т. е. итоговая оценка, будет выведено па экран компьютера. В листинге 4.4 приводится текст данной программы.
единицу, т. е. оценка снижается на 1 балл. Если же пользователь дал правильный ответ, то неравенство, записанное после then, выполняться не будет и значение п, т. е. оценка, не изменится. По завершении работы программы конечное значение п, т. е. итоговая оценка, будет выведено па экран компьютера. В листинге 4.4 приводится текст данной программы.
日 Т urbo Pascal
日 Т urbo Pascal
ныс
ныс
progran space;
Uses Crt; uar i,n:integer;
C IrScr;
progran space;
Uses Crt; uar i,n:integer;
C IrScr;
згite1п("В каком rrad IM i);
if 101957 then writelnC ^B Rdxon readinli);
if 101961 then wrlieln(*B каки口 read ln(i);
if 1C19&9 then
згite1п("В каком rrad IM i);
if 101957 then writelnC ^B Rdxon readinli);
if 101961 then wrlieln(*B каки口 read ln(i);
if 1C19&9 then
году «ыл запущен первый искусственный спутник Зенах');
году «ыл запущен первый искусственный спутник Зенах');
п:~п 1;
году состоялся первый полет человека в коспос');
п:~п 1;
году состоялся первый полет человека в коспос');
n:=n-1 ;
голу cocтоялся первый попет чеповек<> на Пуну');
n:=n-1 ;
голу cocтоялся первый попет чеповек<> на Пуну');
п:=п-1;
п:=п-1;
writeIл(^лшл оценка m зкзансн равна *,n); rcddln
writeIл(^лшл оценка m зкзансн равна *,n); rcddln
=〔8:7 =='_
=〔8:7 =='_
'1рм Л11+ГУ С wile F5 呵屍,
'1рм Л11+ГУ С wile F5 呵屍,
*叫■二
*叫■二
а
а
J I urb。PcASCulMW E3
U njRg I иду СЫН 3d"yt"t1 nr риын мс куссвоенный спугннк Jceih
IВ каг.nn r orv c”『innncя nгpиым no«rт чгповек4 n коспос
H,.“ x“n I on” с о г г онл с н пгрпый nont* т чеповгкд ил Пуну 1^69
ILiLtd ОЦГИК .) Ы Ж idnril р <1 tl N 4 S
Рис. 4.5. Программа виртуального экзамена (а) и результат ее работы (6)
I Листинг 4.4. Тест на знание истории освоения космоса
program space;
Uses Crt;
var irn:integer;
begin
ClrScr;
n:=5;
writein('В каком году был запущен первый искусственный спутник Земли *); readln(i);
if i<>1957 then n:=n-l;
writein(*B каком году состоялся первый полет человека в космос'); readln(i);
if i<>1961 then n:=n-l;
writein('В каком году состоялся первый полет человека на Луну•); readln(i);
if i<>1969 then n:=n-l;
write In (*Bauia оценка за экзамен равна 1 f n); readln
end.
Во всех рассмотренных до сих пор примерах в каждой из ветвей условного оператора совершалось не более одного действия, производимого каким-либо одним оператором. Но нередко в ходе разработки программ возникает необходимость разместить в одной или обеих ветвях условного оператора не одно, а целый ряд действий. В таком случае в качестве вариантов действий, находящихся в ветвях условного оператора, используют не простые, а составные операторы, которые помещаются в программе после служебных слов then ИЛИ else.
Составной оператор представляет собой группу операторов, размещенную между служебными словами begin и end. Слова begin и end, называемые в данном случае операторными скобками、обозначают здесь не начало и конец основной части программы, а начало и конец составного оператора. Между ними могут располагаться различные операторы: операторы ввода и вывода, присваивания, вложенные условные операторы (вложенным называется условный оператор, входящий в качестве составной части в другой условный оператор) и другие виды операторов. Количество простых операторов, входящих в составной, не ограничено.
Операторы, входящие в составной оператор, друг от друга отделяются точками с запятой. После слова begin и перед словом end точка с запятой не ставится. Не ставится в данном случае точка с запятой н после слова end (если только это слово не находится в конце всего условного оператора), т. к. end обозначает здесь лишь конец одного из вариантов, входящих в состав единого условного оператора. Таким образом, в общем виде структуру условного оператора с составными операторами в его ветвях можно представить следующим образом:
if условие then
begin
оператору!; оператор_2; ... оператор_т end
else
begin
оператор__1; оператор_2; ••・ ол^атс^с end;
Составные операторы могут использоваться как в полных, так и в сокращенных условных операторах. Кроме условных операторов составные операторы могут использоваться и в других программных структурах, которые мы рассмотрим далее.
Составной оператор можно использовать для решения следующей задачи. Администрация одного магазина для привлечения большего числа клиентов ввела правило, согласно которому каждый покупатель, который приобрел товар на сумму более 1000 рублей, имеет право на трехпроцентную скидку со стоимости покупок. Требуется составить программу, облегчающую работу кассира данного магазина. Эта программа в случае, если стоимость покупки превышает указанную сумму, должна подсчитывать величину скидки и ту сумму, которую должен оплатить покупатель с учетом скидки. В случае же если стоимость покупок меньше 1000 рублей, программа должна выдавать сообщение о том, что покупка должна быть оплачена полностью.
В программе, составленной для решения приведенной задачи, используются три переменных вещественного типа: sum ——сумма покупки без учета скидок, skidka— величина трехпроцентной скидки, sumsk— стоимость покупки с учетом скидки. В начале программы с клавиатуры вводится сумма покупки. Затем в действие вступает условный оператор. Если величина переменной sum больше чем 1000, то будет работать тот вариант программа, который находится после служебного слова then. Этот вариант представляет собой составной оператор, состоящий в свою очередь из 4 простых операторов.
В первом из этих операторов находится величина скидки путем умножения значения sum на 0.03. Найденная величина присваивается переменной skidka. Во втором операторе определяется сумма покупки со скидкой путем вычитания величины скидки из начальной суммы. Эта величина присваивается переменной sumsk. В третьем н четвертом операторах производится вывод подсчитанных в предыдущих двух операторах величин на экран компьютера. Вывод этот осуществляется в отформатированном виде. Для значения каждой выводимой переменной предусмотрено два разряда в дробной части, соответствующие копейкам. Следовательно, вывод переменных будет осуществляться таким образом, что цифры перед точкой в каждой из сумм будут соответствовать рублям, а цифры, расположенные после точки, — копейкам.
В том случае, если сумма покупки составляет меньше 1000 рублей, будет работать вариант программа, находящийся после служебного слова else. В этой ветви программы содержится только один простой оператор write in,
Рис. 4.6. Программа, определяющая скидку при покупке товаров в магазине (а), и результаты ее работы для различных исходных данных (б, в)
который выводит на экран компьютера сообщение о том, что покупатель должен оплатить покупку полностью. В листинге 4.5 приводится текст программы.
> Листинг 4.5. Программа, определяющая сумму скидки на покупку
program magazin;
Uses Crt;
var sum, sumsk,skidka:real;
begin
ClrScr;
writeln(* Введите сумму покупки'); readln(sum);
if stim>1000 then
begin
skidka: =sum*0 • 03;
sumsk:=sum-skidka;
writeln('Сумма скидки составляет 1,skidka:7:2);
writeln(1 Покупатель должен заплатить ',sumsk:7:2) end else
writeln(1 Покупатель оплачивает покупку полностью*); readln end.
На рис. 4.6 под текстом программы приведены результаты ее работы для обоих возможных случаев (рис. 4.6, б— сумма больше 1000 и рис. 4.6, 6 — сумма меньше 1000).
Логические переменные. Логические операции
Как уже известно читателю, результатом операции сравнения может быть величина, которая принимает одно из двух возможных значений: мистинно" (если указанное соотношение действительно выполняется) и "ложно11 (если соотношение не выполняется). По-английски "истинно" и “ложно" пишется соответственно true н false. Константы и переменные, значениями которых могут быть только эти две величины (true млн false), называются логическими или булевскими константами и переменными. Название это дано в честь английского математика XIX века Джона Буля, внесшего большой вклад в развитие математической логики. Для описания таких переменных в языке Паскаль существует специальный тип boolean. Пример описания логической переменной:
var logic:boolean;
Как понятно из определения логических переменных, им можно присваивать значения операций сравнения подобно тому, как мы присваиваем числовым переменным значения арифметических операций. Такая операция присваивания может выглядеть, например, следующим образом:
logic:^х>=15;
т. е. переменной логического типа logic мы присваиваем значение операции сравнения х>=15. В случае если указанное неравенство выполняется, значение переменной logic будет равно true. В противоположном случае ее значение будет равно false. Имя логической переменной, которой присвоено значение операции сравнения, можно подставлять в условный оператор вместо самой этой операции. Такой прием позволяет сделать программу более компактной в том случае, если одна и та же операция сравнения повторяется в программе несколько раз. Значения логической переменной можно выводить на экран компьютера оператором writein подобно значениям числовых переменных. Можно присваивать значения true и false логическим переменным и напрямую:
logic:=true;
Именно такой способ присваивания значений логической переменной мы и используем в следующей программе. Эта программа проверяет, имеется ли в ряду из трех целых чисел хотя бы одно положительное. Эти числа, как обычно, мы будем вводить с клавиатуры, а сообщение о результатах проверки будет выведено на экран компьютера. В программе используются 3 целочисленные переменные х, у и z для вводимых числовых значений и одна переменная логического типа flag, назначение которой в данной программе мы рассмотрим далее. В отличие от всех предыдущих программ, в каждой из которых все переменные относились к одному типу, в данной программе имеются переменные, относящиеся к разным типам (целочисленному н логическому). Описание переменной или переменных, относящихся к одному типу, составляет отдельную группу, которую от следующей группы отделяет точка с запятой. При этом слово var, открывающее раздел описания переменных, ставится только один раз.
В основной части программы переменной flag присваивается начальное значение false. Вслед за оператором присваивания в программе идут 3 однотипных блока, в каждом из которых обрабатывается одно из вводимых чисел. Каждый такой блок состоит из оператора вывода, предлагающего пользователю ввести число, оператора ввода, присваивающего введенное значение одной из переменных целого типа, и сокращенного условного оператора, проверяющего, является ли введенное число положительным или отрицательным. В случае если число положительное, переменной flag присваивается значение true. В том случае, если число отрицательное, никаких действий не производится. Таким образом, если среди вводимых чисел окажется хотя бы одно положительное, то в результате выполнения этих условных операторов итоговое значение переменной flag изменится н станет равным true. Если же положительных чисел среди введенных нет, то значение flag останется неизменным, т. е. равным false.
Далее в программе расположен полный условный оператор, который проверяет итоговое значение переменной flag. Наличие в этом операторе переменной flag (как и любой логической переменной в операторе if) означает следующее: если значение этой переменной равно true, то выполняется ветвь оператора, расположенная после слова then, а если значение переменной —— false, то выполняется та ветвь, которая расположена после else. В данной программе в одной ветви выводится сообщение о наличии среди введенных чисел хотя бы одного положительного, а в другой сообщение о том, что все введенные числа отрицательны. В листинге 4.6 приводится текст программы.
Листинг 4.6. Программа, определяющая, есть.碍 в>яду чйсел. хотя бы одно положитольноё区
program pozit;
Uses Crt;
var x,yrz:integer; flag:boolean;
begin
ClrScr;
flag:=false;
writein(1Введите первое число•);
readln(x);
if x>0 then flag:=true;
writein(1Введите второе число*);
readln(у);
if y>0 then flag:=true;
writeIn(•Введите третье число');
readln(z);
if z>0 then flag:=true;
if flag then writein('В ряду чисел имеются положительные *) else writein(*Bce числа отрицательные *);
readln
end.
На рис. 4.7 кроме текста программы показаны результаты ее работы при различных исходных данных.
Над величинами логического типа можно производить логические операции подобно тому, как над данными целого или вещественного типа производятся арифметические операции. Результатом логических операций могут быть только логические величины, т. е. величины, имеющие значения true и false. Всего в Паскале используется 4 логических операции: not (Нет — логическое отрицание), and (И — логическое умножение), or (Или — логическое сложе-
ние), хог (Исключающее Или). Эти операции подраздел яются на унарные, т. е. такие, которые производятся только над одной величиной, и бинарные, т. е. те, которые производятся сразу над двумя величинами. К первому типу операций относится not, ко второму — все остальные.
■—「♦., I ,一一 …J
Г- File EiJit YeircJ»~lun СомрПс^-^uecus1 Toils~^JpliAn— ~JfniUMT
Turbo Pascal
■回司
progran p«?it ;
[Uses Crt;
I uar m,ji,z: integer; f Uq:boolean;
‘begin
I ClrScr;
fhq:"dl$e;
fuTTT.FiT
«irilelnC *Введмге nrpuor readln(K);
if x>0 then fld9:-true;
writelh(^OnruMie ntopur
read】H y);
if y>0 thea flag:二true; writel(>( ^Введнге 1ретъе геа4ln(z);
at z>0 Ihe f]69:-true; if f】aq ttji*» writeln( #H
Чm(0@')
ра0У ЧМСГЛ |«5(^ifC4 положиггльныс *)
eIse wr ileln( *Bce унсп。отрииагспь^е*); read ;c
19:10 ==
■**■
а
■冋口■冋口匕I 1 uibi* I'avc*»!
■冋口
■冋口
KlM-HMi Г iir (kUll r *IMC*IO и
Рис. 4.7. Программа, определяющая, имеются ли в ряду чисел положительные (а), и результаты ее работы при различных исходных данных (б, е)
При выполнении логических операций соблюдается, как и для арифметических операций, определенный приоритет. Наиболее высоким приоритетом обладает операция not, т. е. она выполняется в первую очередь. Далее выпол-
няется операция and. Самый низкий приоритет нмекп операции or и хог. Если в выражении необходимо изменить порядок выполнения логических операций, то так же, как и в случае с арифметическими операциями, для этого используются скобки, потому что выражение, заключенное в скобки, обладает высшим приоритетом.
Подобно тому, как для числовых величин существуют таблицы сложения и умножения, для логических величин также существует таблица, в которой указаны результаты логических операций при различных исходных данных. Такая таблица называется таблицей истинности. В табл. 4.1 и 4.2 приведены таблицы истинности соответственно для унарных и бинарных операций.
Таблица 4.1. Унарные операции
X
not (X)
false
true
true
false
Из табл. 4J видно, что в результате операции not, производимой над любой величиной, ее значение изменяется на противоположное.
Если изучить результаты, показанные в табл. 4.2, то можно сделать вывод о том, что для операции and значение будет равно true только тогда, когда обе исходные величины х и Y, над которыми производится эта операция (такие величины называются операндами) имеют значение true. Во всех остальных случаях результатом операции будет false. Для операции or значение будет true, если хотя бы один из операндов (или х или Y)имеет значение true. Результат операции or будет равен false только тогда, когда оба операнда имеют значение false. Для операции хог значение будет true, если значения операндов не совпадают. Если же значения операндов совпадают (вне зависимости от того, будут ли эти значения равны false или true), то итог операции будет равен false.
Таблица 4.2. Бинарные операции
X
Y
X and Y
X or Y
X xor Y
false
false
false
false
false
false
true
false
true
true
true
false
false
true
true
true
true
true
true
fd 丄 wu
Логические операции используют при составлении программ, в которых требуется проверить сразу несколько условий. Например, если некоторое действие должно выполняться при условии, что значение переменной а находится в диапазоне от 5 до 20, т. е. а должно быть больше или равно 5 и меньше или равно 20, то это условие можно записать следующим образом:
(а>=5) and (а<=20)
При этом группируемые операции сравнения заключаются в скобки, как в приведенном выражении.
Рассмотрим использование логических операций на примере следующей задачи: составим программу, которая находит сумму цифр двузначного числа. Если же введенное число не является двузначным» то программа должна сообщить пользователю о его ошибке и прекратить на этом свою работу.
Основная часть программы начинается с того, что мы вводим некоторое целое двузначное число х. Далее программа должна проанализировать введенное число и в случае, если оно удовлетворяет условиям задачи, произвести необходимые вычисления, а в случае ошибочного ввода данных вывести сообщение об этом на экран компьютера. Данная задача в программе возложена на условный оператор if, в котором содержится сложное условие, состоящее из двух простых. Этими простыми условиями являются два неравенства, ограничивающие введенное число снизу (оно не может быть меньше 10) и сверху (число не может быть больше 99). Для того чтобы обеспечить проверку совместного выполнения этих двух неравенств, используется объединяющая их операция логического сложения and. Только в случае одновременного выполнения двух условий будет действовать составной оператор, расположенный после служебного слова then.
Этот составной оператор производит следующие действия. Вначале мы определяем цифры двузначного числа ci и с2. Цифра младшего разряда двузначного числа cl находится как остаток от деления числа на 10. Величину старшего разряда с2 найдем как результат целочисленного деления исходного числа х на 10. Затем останется сложить получившиеся цифры и результат их сложения ——число sum— вывести оператором writein на экран компьютера. В том же случае если число или меньше 10, или больше 99 (т. е. не выполняется хотя бы одно из поставленных в заголовке оператора if условий) работает ветвь оператора, расположенная после else, т. е. на экране появляется сообщение о неправильном вводе исходных данных. В листинге 4.7 приводится текст программы.
lh»r диf »• лпу tit.i'itioe ““спар*и,:ут» 1О«)р пьi-ясниог о 'шс пл pannu 12lh»r диf »• лпу tit.i'itioe ““спар*и,:ут» 1О«)р пьi-ясниог о 'шс пл pannu 12I uit>o PascalI uit>o Pascal吕回日吕回日66
lh»r диf »• лпу tit.i'itioe ““спа
р*и
,:ут» 1О«)р пьi-ясниог о 'шс пл pannu 12
lh»r диf »• лпу tit.i'itioe ““спа
р*и
,:ут» 1О«)р пьi-ясниог о 'шс пл pannu 12
I uit>o Pascal
I uit>o Pascal
吕回日
吕回日
6
6
I uibib I *«»x<:.i<PSlsJ ЬЗ ]
Ни г* /|М > r ,1, у I II ,l4lt<ir *«>«<: no
1>Ы ,>ur"“ 114' It <■ p ritrfe kl< Xltjtllirfl' JI ■> II tlMt*
Рис. 4.8. Программа определения суммы цифр двузначного числа (а)и результаты ее работы при различных исходных данных (6, е)
числачислаЛистинг 4.7. Программа, определяющая сумму цифр двузначного
числа
числа
program cifrsum;
Uses Crt;
var к,clrc2, sum:integer;
begin
ClrSer;
writein(введите двузначное число *);
readln(x);
if (х>=10) and (х<=99) then
begin
cl:=x mod 10;
с2:=х div 10;
sum:«=cl+c2;
writein(* Сумма цифр введенного числа равна *,sum); end
else
writein(*Вы ввели неверные исходные данные'); readln
end.
На рис. 4.8 показаны результаты работы для обоих возможных вариантов. Таким образом, данная программа не только определяет требуемый результат, но и осуществляет защиту от ошибки при вводе исходных данных (в программировании существует жаргонное наименование такой защиты——мза- щита от дурака").
Оператор множественного выбора case
При составлении программ часто возникает потребность в структуре, которая обеспечивала бы возможность рассмотреть не два, а большее количество возможных вариантов дальнейших действий. В некоторых случаях для этого используется оператор if. В одну или обе ветви оператора вставляется еще по одному условному оператору if, который позволяет разбить каждый вариант на два подварианта, т. е., как говорят, используются вложенные условные операторы. В каждый из вложенных условных операторов можно вставить следующий вложенный оператор и т. д. Такой способ создания многовариантного ветвления делает, однако, структуру программы чересчур сложной, что, понятно, может привести к появлению в программе ошибок. Поэтому в языке Паскаль предусмотрена другая конструкция, которая позволяет осуществлять выбор из множества возможных вариантов и в то же время является более простой и наглядной, чем описанная ранее. Эта конструкция реализуется с помощью оператора case.
Общий вид оператора case следующий^
case селектор of
Зна чение J: Вариант_ 1;
Зна иени j 2: Вариа н〃2 ;
Зна чете_п; Вариант_п; else Вариант_п+1 end;
где case, of, else— служебные слова языка Паскаль. Словосочетание case of переводится на русский как "в случае если".
Селектором называется переменная целого или символьного типа. Переменная-селектор может принимать различные значения.
После заголовка в операторе идет перечень возможных значений переменной-селектора. Каждому из этих значений соответствует определенный вариант действий, который реализуется в том случае, если в программе селектор принимает это значение. Этот вариант указывается после двоеточия, отделяющего его от значения, и представляет собой простой или составной оператор.
Если переменная-селектор не принимает ни одно из перечисленных в операторе case значений, то выполняется альтернативный вариант, который указан после служебного слова else. Обратипе внимание на то, что в отличие от условного оператора if в операторе case перед вариантом с else ставится точка с запятой. Эта часть оператора (else с соответствующим ему вариантом) не является обязательной ——возможен сокращенный вариант оператора. Заканчивается оператор case служебным словом end, после которого ставится точка с запятой.
Разберем следующий фрагмент программы, в которой использован оператор case:
case k of
x:=x+5;
x:=x+10;
x:=x+2G;
else x:=0
end;
В данном условном операторе в роли переменной-селектора выступает целочисленная переменная к. Если к принимает значение, равное 1 (значения переменной-селектора могут либо вводиться с клавиатуры оператором read или readin, либо присваиваться в программе оператором присваивания), то текущее значение другой целочисленной переменной х увеличивается на 5, если к принимает значение, равное 2, то текущее значение х увеличивается па 10, если к принимает значение 3, то значение х увеличивается на 20, если же переменная-селектор принимает любое другое значение, то переменная х обнуляется. Каждое из указанных после двоеточия действий производится про-
стым оператором присваивания. Составные операторы внутри данного оператора case отсутствуют.
Возможности, предоставляемые программисту оператором case, мы используем в программе, которая имитирует работу простейшего электронного калькулятора. По запросу пользователя программа выполняет одно из четырех основных арифметических действий над любыми двумя введенными им с клавиатуры целыми числами. В начале работы программы-калькулятора пользователю предлагается ввести с клавиатуры два целых числа, над которыми будет произведена одна из арифметических операций. Затем после ввода чисел операторами readln на экран компьютера операторами writein выводится текст программного меню. Этот текст сообщает пользователю программы, нажатие какой клавиши соответствует выполнению какой арифметической операции. Например, нажатие клавиши с цифрой 1 производит сложение введенных чисел, 2 ——вычитание и т. д.
Введенное пользователем значение считывается оператором readln и присваивается переменной х, которая в данной программе выступает в роли переменной-селектора. Далее в действие в программе вступает условный оператор case. В первых трех случаях (сложение, вычитание, умножение) для получения результата используется простой оператор writein. Каждый из операторов writein вначале выводит значения операндов, над которыми производится действия, а между ними указывается знак производимой арифметической операции. Затем на экран выводится знак равенства (т. к. этот знак н знак операции являются здесь фрагментами текста, то в списке вывода заключены в апострофы), а в конце указывается само вычисляемое выражение, которое подечитывается компьютером и выводится на экран. В последнем, четвертом случае мы используем составной оператор. Причина заключается в том, что в этом случае результат операции будет числом вещественным. Мы сперва подсчитаем результат деления, присвоим его вещественной переменной d, а затем в списке вывода оператора writein выведем значение переменной d в отформатированном виде, обеспечив таким образом точность выведенного вещественного числа-результата до третьего знака после запятой. В листинге 4.8 приводится текст программы.
j Листинг 4.8. Программа, моделирующая работу калькулятора
program kalkulac;
Uses Crt;
var a,brx:integer; d:real;
begin
ClrScr;
writein(* Введите первое число*);
readln(a);
writeln (* Введите второе число *);
readln(b);
writeln(•Выберите действие, производимое над числами *);
writeln(1(введите соответствующую цифру)1);
writeln (11 ~ сложение, 2 - вычитание, 3 - умножениеf 4 - деление1); readln(х);
case х of
writeln(а,* +1,b,• = *,a+b);
writeln(a,'-'.b,'='.a-b);
writeln(a,1 * *,b,*^*,a*b);
begin d:=a/b; writeln(a,'/',b,' = ', d:7:3) end end;
readln
end.
Результаты работы программы приведены на рис. 4.9.
ббРис. 4.9. Программа-калькулятор (а) и результат ее работы (6)Рис. 4.9. Программа-калькулятор (а) и результат ее работы (6)
б
б
Рис. 4.9. Программа-калькулятор (а) и результат ее работы (6)
Рис. 4.9. Программа-калькулятор (а) и результат ее работы (6)
4 Зак. 1068
Рассмотренный нами вариант оператора сазе является несколько упрощенным. В нем каждому варианту действий соответствует только одно значение переменной-селектора. Возможна, однако, и другая форма того же оператора, когда каждому варианту действий соответствует какая-либо группа значений селектора. Эта группа значений, находящаяся в операторе перед двоеточием, может представлять собой как несколько отдельных значений, перечисленных через запятую, так и целый диапазон значений. В последнем случае в соответствующем разделе оператора указывается только начальное и конечное значение диапазона, а между ними ставятся две горизонтальные точки.
Поясним сказанное на следующем примере. Перед нами фрагмент программы с условным оператором case, в котором переменной у присваиваются различные значения, представляющие собой степени х. Какое именно значение будет присвоено переменной у, зависит от значения переменной-селектора п:
case n of:
5,7: у:=х*х;
.20: у:=х***х;
.40: у;»х*х*х*х;
else у:=х end;
В случае если переменная п принимает значение, равное числам 3, 5 или 7, то значение у будет равно квадрату х. Если п примет любое целочисленное значение из диапазона от 10 до 20 (10, 119 12 и т. д. до 20 включительно), то у будет присвоено значение, равное кубу х. Если же п примет любое значение из диапазона от 30 до 40, то у получит значение, равное четвертой степени х. Наконец, если п не примет ни одно из указанных ранее значений, то у будет равно первой степени х.
Приведенную ранее форму записи оператора case мы используем для решения следующей задачи: требуется составить программу, которая запрашивала бы пользователя о том, какой сейчас месяц, и по введенному пользователем номеру месяца определяла бы текущее время года. При этом сообщение о времени года должно выводиться на экран компьютера соответствующим сезону цветом. Если сейчас зима, то сообщение об этом должно выводиться белым цветом, для весны сообщение выводится зеленым цветом, для лета —— красным цветом и для осени — желтым. В листинге 4.9 приводится текст программы.
program month;
Uses Crt;
var m: integer;
begin
ClrScr;
writein(1Введите номер месяца•);
readln (m);
case m of
1,2,12:
begin
textcolor(LightGray);
writein(*Пришла зима')
end;
3,4,5:
begin
textcolor(Green);
writein(•Пришла весна*)
end;
6,7,8:
begin
textcolor(Red);
writein(1Наступило лето')
end;
9,10,11:
begin
textcolor(Yellow);
writein(•Наступила осень•)
end;
else writein (1 Месяца с таким номера не существует *) end;
readln
end.
В данной программе используется всего одна переменная — номер текущего месяца m выступающий в роли переменной-селектора. В зависимости от вводимого пользователем значения переменной выполняется один из пяти возможных вариантов работы программы. В первом случае для зимних месяцев с номерами 1, 2 или 12 можно использовать один простой оператор writein, который выводит сообщение о том, что сейчас зима. Так как для вывода информации в Turbo Pascal по умолчанию используется белый цвет, то специально указывать цвет сообщения в данном случае нет необходимости. Следующие три варианта работы программы аналогичны друг другу. Каждый из них (для месяцев с третьего по пятый, с шестого по восьмой или с девятого по одиннадцатый) представляет собой составной оператор, который включает в себя два простых. Первый из этих операторов устанавливает цвет сообще-
ния (соответственно зеленый, красный или желтый). Вторым оператором является оператор вывода, который и выводит на экран компьютера нужным цветом соответствующий текст. Наконец последний вариант работы программы соответствует тому случаю, когда пользователь случайно ошибся (например, указал несуществующий в григорианском календаре нулевой или тринадцатый месяц). В этом случае программа сообщает пользователю о совершенной им ошибке и на этом прекращает свою работу (рис. 4.10).
Рис. 4.10. Программа, определяющая время года по номеру месяца (а), и результаты ее работы при различных исходных данных (6. в)
4.4. Безусловный оператор перехода goto
В программах, рассмотренных нами в предыдущих разделах книги, операторы либо выполнялись друг за другом последовательно (линейные программы), либо при наличии в программе условного оператора ход выполнения программы зависел от выполнения или невыполнения некоторого условия. Однако бывают и такие ситуации, когда требуется нарушить линейный ход выполнения программы без выполнения какого-либо предварительного условия. Такая ситуация возникает, например, если в определенном месте программы требуется вернуться к ее началу для того, чтобы выполнить заново находящиеся в начале программы операторы или, наоборот, перейти в конец программы для того, чтобы досрочно завершить ее выполнение.
Оператор, который позволяет производить такое действие, называется оператором безусловного перехода. Этот оператор может не только осуществлять переход в начало или конец программы, но и перемещаться практически в любое место программы и продолжать ее выполнение, начиная с любого нужного оператора (или, как говорят, передавать управление в любую точку программы). Естественно, что при выполнении оператора безусловного перехода компьютер должен знать, куда именно следует передавать управление. Для этого в начале строки, содержащей оператор, на который передается управление, ставится целое число, называемое меткой. Эта же метка указывается и в самом операторе безусловного перехода.
Общий вид оператора безусловного перехода следующий:
goto Р1мя_метки;
где goto — служебное слово, означающее в переводе с английского "перейти к", имя_метки— имя метки, ранее описанное в разделе label.
Имя метки может быть произвольным, но оно должно подчиняться тем же правилам, что и имена переменных. В качестве меток также можно использовать целые числа без знака. Для удобства работы меткам следует давать осмысленные имена: metkal, metka2 И Т. Д.
Строка, содержащая метку, должна выглядеть следующим образом:
metka: опера тор;
т. е. строка, на которую производится переход, должна обязательно начинаться с имени метки, после которого ставится двоеточие. После двоеточия в строке пишутся оператор или операторы, как и в любой обычной строке программы. Дальнейшее выполнение программы осуществляется именно с этого места.
Используя оператор безусловного перехода и соответствующую ему метку, необходимо помнить о том, что подобно константам и переменным метка
должна быть предварительно описана в разделе описаний перед ее использованием в основной части программы. Описание метки должно находиться в самом начале раздела описаний перед описанием переменных и констант.
В общем виде описание метки выглядит следующим образом:
label имя_метки;
где label— служебное слово, означающее в переводе "метка: имя_метки— имя метки, удовлетворяющее описанным ранее условиям.
Говоря о метках, необходимо обратить внимание еще н на следующее обстоятельство. Если в программе содержится некий безусловный оператор, осуществляющий переход на начало программы, то каждый раз, как только программа будет доходить до этого оператора, выполнение программы будет происходить с начала до места нахождения безусловного оператора, после чего будет вновь возвращение на начало. Программа с безусловным оператором будет в этом случае выполняться без конца или, как говорят, нзацикли- ваться", не выдавая конечных результатов работы.
Поэтому, как правило, оператор goto не используют в программе сам по себе, а вставляют его в качестве составной части в другой оператор, в частности в условный. Безусловный оператор может содержаться в одной из ветвей условного оператора. В таком случае возвращение на начало программы будет производиться не вечно, а до тех пор, пока будет выполняться или не выпол* няться условие, находящееся в заголовке условного оператора, т. е. процесс выполнения программы станет конечным, зацикливание будет преодолено. В этом своем качестве оператор может быть полезен, например, для зашиты программы от неправильного ввода данных.
В случае если исходные данные, введенные пользователем неверны, можно осуществить проверку исходных данных с помощью условного оператора и, если они неправильны, вернуться на начало программа посредством безусловного оператора. После возвращения на начало желательно, чтобы пользователь был проинформирован о том, в каком диапазоне должны находиться правильные введенные данные. Если пользователь ввел данные правильно, то ветвь условного оператора, содержащая оператор goto, не будет реализована, и программа продолжит свою работу до конца.
Как конкретно работает такая защита, мы разберем на следующем примере. Вернемся к уже рассмотренной нами программе (листинг 4. Ю), в которой мы предусмотрели "защиту от дурака** в ветви программы, находящейся после служебного слова else. Невнимательному пользователю сообщается о сделанной им ошибке (вводе несуществующего номера месяца), а затем программа завершается. Эта программа работает в принципе правильно, но ведет себя не очень корректно по отношению к пользователю, которому, для того
чтобы исправить допущенную ошибку, требуется заново запускать программу. Модифицируем программу таким образом, чтобы пользователь мог исправить свою ошибку, не выходя из программы.
Сделаем мы это следующим образом: изменим ветвь, находящуюся после else. В новой версии программы после else будет находиться не простой оператор вывода, а составной оператор, заключенный в операторные скобки begin и end. В составной оператор будут входить три простых оператора. Первый оператор — оператор вывода, идентичный тому, что был в предыдущей версии программы. Этот оператор сообщает о самом факте ввода неверных исходных данных.
Следующий оператор конкретизирует информацию. Он сообщает о том, в каких пределах может находиться вводимое данное — номер месяца. Наконец третий оператор представляет собой оператор безусловного перехода на вторую строчку основной части программы (сразу после очистки экрана), которая имеет метку 10. Закрывается составной оператор служебным словом end. За ним находится следующее служебное слово end, которое на сей раз закрывает весь условный оператор case целиком.
Строка, на которую осуществляется переход, как уже говорилось, имеет метку с номером 10. Этот номер метки ставится в начале строки вместе с двоеточием, после двоеточия находится оператор вывода, который предлагает пользователю вновь ввести исходное данное. Метка 10 указана в разделе описаний после служебного слова label. Теперь в том случае, если пользователь введет номер месяца, равный 0 или 13, его не будет "выбрасывать" из программы, а программа будет каждый раз при вводе неверных данных выдавать сообщение об ошибке и возвращать пользователя к моменту ввода данных. В листинге 4.10 приводится текст модифицированной программы.
р_^я^р_^я^4 —乙“ у-М*" ЮНИЯ времеии года ■4 —乙“ у-М*" ЮНИЯ времеии года ■
р_^я^
р_^я^
4 —乙“ у-М*" ЮНИЯ времеии года ■
4 —乙“ у-М*" ЮНИЯ времеии года ■
program monthl;
Uses Crt; label 10; var m: integer; begin
ClrScr;
10: writein(*Введите номер месяца'); readln (m);
case ni of
1,2,12: begin textcolor(LightGray);
writein(1 Пришла зима*) end;
3,4,5:
begin
textcolor(Green);
writein('Пришла весна') end;
6,7,8:
begin
textcolor(Red);
writein(*Наступило лето•) end;
9,10,11:
begin
textcolor(Yellow);
writein('Наступила осень')
end
else
begin
writein(*Месяца с таким номером не существует•);
goto 10 end end;
readln end.
На рис. 4.11 изображены текст модифицированной программы определения времени года по номеру месяца и два возможных результата ее работы: для неправильного ввода данных и для правильного ввода.
В приведенной программе был использован один оператор безусловного перехода и одна метка, но в Паскале разрешается производить ссылки на одну и ту же строку из разных мест программы несколькими операторами безусловного перехода. Использовать же несколько раз одну и ту же метку для обозначения разных строк или разных операторов недопустимо.
Использование меток и операторов безусловного перехода в ряде случаев облегчает составление программ, однако не следует злоупотреблять их применением, т. к. при наличии в программе большого количества меток и операторов се структура излишне запутывается и усложняется. В дальнейшем мы с вами убедимся, что можно избежать использования меток и операторов безусловного перехода за счет грамотного использования других стандартных операторов (в частности, операторов цикла). При этом не будет нарушаться и запутываться структура программы.
丹 ГшЬо Pascal丹 ГшЬо PascalааРис. 4.11. Модифицированная программа определения времени года по номеру месяца (а) и результат ее работы (6)Рис. 4.11. Модифицированная программа определения времени года по номеру месяца (а) и результат ее работы (6)
丹 ГшЬо Pascal
丹 ГшЬо Pascal
а
а
Рис. 4.11. Модифицированная программа определения времени года по номеру месяца (а) и результат ее работы (6)
Рис. 4.11. Модифицированная программа определения времени года по номеру месяца (а) и результат ее работы (6)
program month;
Use» Crt; label 10; var n:inleger;
begin
I ClrScr;
10: ur itelnC * Введите номер пссяцаЧ ;
readln(m);
case n of
1,2,12: wrilclnC Лриипд зина');
3,%5: begin tcxtcolor(Green); ur itelnC #Пршла весна'〉end;
6,7,8: bcgin textcolor(Red); writrlnC ^Наст^пило лето*) end;
9.10,11: begin texteolor(Ve1 low); writeln(#Нас(улипа осень') end;
begin
writf1п(*песяца с тлкмп нипероп не сущестпуг »'); «joto 10
end
Задания для самостоятельной работы
Задание 1. Составить программу, которая определяет, делится ли введенное с клавиатуры целое число на 5.
Задание 2. Составить программу, которая проверяет, является ли введенное с клавиатуры число одновременно положительным и четным.
Задание 3. Стоимость проезда одной зоны на пригородном поезде составляет 3 рубля за одну зону. Нумерация зон ведется, начиная с городского вокзала (1 зона). Составить программу, которая бы определяла стоимость проезда в один конец между станциями, расположенными в разных зонах. Номера зоны, в которой находится станция отправления н той зоны, в которой распо-
ложена конечная станция, вводятся в компьютер с клавиатуры. При составлении программы следует учесть, что пассажир может отправляться как из пригорода в город (из зоны с большим номером в зону с меньшим номером), так н из города в пригород (т. е. из зоны с меньшим номером в зону с большим номером).
Задание 4. Усовершенствовать программу, вычисляющую стоимость проезда на пригородном поезде, следующим образом. В начале работы программа должна выводить на экран компьютера меню, предлагающее пользовате^ лю следующие варианты: i — вычисление стоимости поездки в один конец, 2 — вычисление стоимости поездки в оба конца (стоимость такого билета равна удвоенной стоимости билета в один конец), 3 — вычисление стоимости месячного билета (эта стоимость равна стоимости поездки в один конец, умноженной на 15). Затем программа должна вычислять соответствующую стоимость.
ГЛАВА 5Циклы в ПаскалеГЛАВА 5Циклы в Паскале
ГЛАВА 5
Циклы в Паскале
ГЛАВА 5
Циклы в Паскале
В ходе создания программ нередко возникает ситуация, когда программисту нужно многократно использовать один и тот же оператор или группу операторов, которые аналогичны друг другу и незначительно отличаются лишь значениями некоторых переменных или вводимых исходных данных. Такая ситуация хорошо видна на следующем примере. Пусть нам необходимо разработать программу, создающую таблицу для перевода величины, выраженной в одних единицах измерения в другие.
Конкретизируем задачу следующим образом: нам требуется составить таблицу для перевода веса, выраженного в центнерах в килограммы. Созданная программой таблица должна охватывать диапазон от 1 до 50 центнеров. Для каждого целого значения, выраженного в центнерах (1, 2, 3 и т. д. вплоть до 50), процесс перевода этого веса в килограммы и создания соответствующей строки в таблице будет осуществляться с помощью двух операторов. Первый из этих операторов производит вычисление суммы в килограммах, а второй оператор выводит получившуюся величину на экран компьютера. Данная группа операторов будет выглядеть следующим образом:
kg:=c*100;
writein(с,kg);
где с—— вес, выраженный в центнерах, a kg — тот же вес, выраженный в килограммах, причем, как нетрудно понять, значение переменной kg напрямую зависит от значения с.
Для того чтобы выполнить поставленную задачу, можно конечно поступить следующим образом: повторить данную группу операторов в программе 50 раз, а перед каждой группой операторов присваивать переменной с новое значение либо с помощью оператора присваивания, либо используя оператор ввода readln. При этом начальным значением переменной с должна быть
единица, после выполнения приведенных ранее двух операторов переменная кд получит значение 50. Затем перед следующим выполнением группы из двух операторов с должно быть присвоено значение 2, а после их выполнения кд будет иметь значение 100. Последнее значение с будет равно 50, а кд соответственно 5000. Понятно, однако, что при решении данной задачи "в лобп получившаяся программа будет чересчур громоздкой за счет многократного повторения одних и тех же действий.
Поэтому естественно, что возникает вопрос, нельзя ли использовать при решении этой и других подобных задач какую-либо структуру, которая бы позволяла облегчить и сделать менее трудоемким решение этой задачи путем автоматического повторения данного оператора или группы операторов с соответствующим изменением значений переменной или переменных. Такая структура в языке Паскаль существует и называется она циклом.
В общем виде цикл состоит из двух основных блоков:
□ Заголовок цикла. В заголовке цикла содержится некоторое условие, которое определяет число повторений цикла.
П Тело цикла. Телом цикла называется простой или составной оператор (как читатель помнит, составным оператором называется группа операторов, заключенная в операторные скобки), который может многократно повторяться в ходе работы цикла. В теле цикла могут содержаться операторы различных типов — это операторы ввода и вывода, операторы присваивания, условные операторы, а также другие операторы цикла. Оператор цикла, находящийся в теле другого циклического оператора, называется вложенным.
Перед началом работы цикла производится проверка содержащегося в заголовке условия. Если условие выполняется, то происходит выполнение тела цикла, после чего программа вновь возвращается к заголовку цикла и осуществляется новая проверка условия и т. д. Если же условие в заголовке оказывается невыполненным, то работа цикла завершается и управление программой переходит к оператору, расположенному в программе вслед за циклом. При этом в правильно работающем цикле не должно происходить бесконечного повторения тела цикла, приводящего к зацикливанию программы. Поэтому условие, находящееся в заголовке, должно быть составлено таким образом, чтобы в какой-то момент в ходе выполнения программы оно становилось ложным, что приводило бы к завершению работы цикла. В нашем примере с программой перевода центнеров в килограммы таким изменением могло бы стать получение переменной с значения больше 50. В случае, когда с, напрнмер, получает значение 51, цикл должен прекращать свою работу.
Циклы могут использоваться для решения самых разнообразных задач, и соответственно структура самих циклов может несколько отличаться.
Всего в языке Паскаль используется 3 разновидности циклов.
Цикл с заранее заданным числом повторений. Его также называют циклом со счетчиком (цикл for... to).
口 Цикл с предусловием (цикл while).
Цикл С постусловием (цикл repeat. . .until).
Каждый из этих видов цикла имеет свои особенности и область применения, которые мы и рассмотрим далее. Общим для всех этих операторов является то, что они включают в себя управляющие конструкции (в операторах for.. .to и while— это строка заголовка, а в операторе repeat.. .until —— строка заголовка и завершающая строка) и тело цикла. Если количество повторений тела цикла заранее известно, то рекомендуется использовать оператор цикла for.. .to. В другом случае нужно использовать оператор repeat.. .until (если для решения поставленной задачи требуется, чтобы тело цикла выполнялось хотя бы один раз), либо оператор while (в этом случае перед выполнением тела цикла проверяется, есть ли вообще необходимость в его выполнении). Далее перейдем к более подробному рассмотрению каждого из этих видов цикла.
Цикл с заранее известным числом повторений
Общий вид данного оператора следующий:
for счетчик_цикла: =иач_значение to кон_значение do тело_цикла;
где:
for, to и do— служебные слова (for в данном случае означает "для”,to — пдои, do — "делать, выполнять1*).
счетчик_цикла — управляющая переменная цикла, значение которой изменяется от начального до конечного. При этом начальное значение должно быть меньше конечного. После того как переменная-счетчик цикла примет конечное значение, тело цикла выполнится последний раз и цикл будет завершен. Переменная-счетчик обычно относится к целочисленному типу, допускаются и некоторые другие типы, которые мы рассмотрим позднее. Категорически нельзя использовать в качестве счетчика переменные вещественного типа.
нач_значение9 кон_значение— начальное и конечное значения счетчика цикла. При этом конечное значение должно быть больше начального. Оба значения должны быть того же типа, что и счетчик цикла.
тело_цикла ——обычно в качестве тела цикла выступает составной оператор, в который входит несколько других. Однако это может быть и один оператор. В последнем случае телом цикла считается первый оператор, расположенный после служебного слова do.
Если переменная-счетчик имеет тип integer, то в ходе работы цикла ее значение при каждом выполнении тела цикла увеличивается на единицу и таким образом принимает все целочисленные значения от начального до конечного. Следует обратить внимание на то, что между заголовком цикла и телом цикла не ставится точка с запятой.
Решение задачи по переводу центнеров в килограммы, рассмотренной нами в предыдущем разделе книги, будет тогда выглядеть следующим образом:
for с:*1 to 50 do
begin
kg:=c*100;
write In (c, kg) end;
В приведенном фрагменте программы роль счетчика цикла выполняет переменная с (вес в центнерах). Начальное значение переменной цикла равно 1. Для этого начального значения выполняются действия, указанные в составном операторе, т. е. будет вычислено значение kg, равное 50, а затем значения 1 и 50 будут выведены на экран компьютера. Далее будет подсчитано значение kg для с, равного 2, и числа 2 и 100 будут выведены на экран в следующей строке, аналогичные действия будут производиться до тех пор, пока не будет выведена последняя строка со значениями с и kg — 50 и 5000. Цикл прекратит свою работу, когда переменная с достигнет конечного значения — 50. Всего действия, указанные в теле цикла, будут повторены согласно приведенной формуле 50-1+1 раз, т. е. 50 раз. Таким образом, мы решили задачу, поставленную в начале данной главы» написав фрагмент программа из 5 строк. Нетрудно подсчитать, что если решать эту задачу без использования цикла, как мы делали раньше, то такой фрагмент программы состоял бы из более 100 операторов.
Для большей наглядности решение данной задачи представлено на рис. 5.1 в виде графической схемы. На схеме внутри шестиугольника заключены параметры цикла (название переменной цикла, ее начальное н конечное значение). Такой блок в графических схемах называют также Ммодификациян. Тело цикла состоит из двух блоков. В первом блоке (блок "процесс") происходит вычисление очередного значения, выраженного в килограммах. Во втором блоке производится вывод полученных величин на экран компьютера, что изображается в виде параллелограмма. Замкнутый контур, образованный
стрелками, показывает, что в цикле повторяется одна и та же последовательность действий до тех пор, пока переменная цикла не достигнет конечного значения. После этого тело цикла выполняется в последний раз, а затем программа переходит к выполнению следующего оператора (стрелка, ведущая вниз).
Рис. 5.1. Графическая схема фрагмента программы перевода веса из центнеров в килограммы
Приведенный вариант цикла for не является единственным. Цикл типа for может иметь и такой общий вид:
for счетчик_цикла: -нач_значение downto кон^начение d。 тело_цикла;
В этом случае при каждом повторении тела цикла значение счетчика уменьшается на единицу, и, следовательно, конечное значение счетчика цикла должно быть меньше начального.
В качестве примера работы цикла типа for приведем программу, которая составляет таблицу для перевода расстояния, выраженного в милях, в километры. На экран компьютера должна быть выведена таблица для расстояний от 1 до п миль, где п — целое положительное число, вводимое с клавиатуры пользователем. 1 миля составляет 1,609 километра. Таблица, выводимая на экран
компьютера, должна иметь заголовок и состоять из двух столбцов. В левом столбце должны быть указаны расстояния в милях, а в правом — соответствующие нм расстояния в километрах. В листинге 5.1 приводится текст данной программы.
;Листинг 5.1. Программа, переводящая расстояние, выраженное в милях.
j в километры
program mi 1km;
Uses Crt;
var mile,n:integer; km: real;
begin
ClrScr;
writein(* Введите расстояние в милях *);
readln(n);
writein(*Таблица перевода расстояний из миль в километры1);
writein (* миликилометры •);
for mile:=l to n do
begin
km:=mile*l.609;
writeln(mile:3,'1,km: 7:3)
end;
readln end.
В данной программе для решения задачи используются три переменные. Это, во-первых, переменная целого типа mile, содержащая расстояния в милях, которая одновременно является счетчиком цикла. Во-вторых, это переменная п, содержащая максимальное число миль, которое нужно перевести в километры. Наконец, это переменная вещественного типа km, представляющая собой расстояние в километрах.
В программе с помощью оператора readln пользователь вводит величину п. Это требуется для определения параметров цикла. Начальное значение счетчика цикла mile равно 1, а конечное——п. Тело цикла представляет собой составной оператор, содержащий 2 оператора. Первый оператор является оператором присваивания, в котором для каждого значения mile (расстояние в милях) вычисляется соответствующее ему значение km (расстояние в километрах). Во втором операторе, входящем в состав тела цикла, операторе writein, для обеих выводимых переменных используется форматный вывод. Разница заключается только в том, что в первом случае (для целочисленной переменной mile) указывается лишь общее количество выводимых на экран
символов (здесь 3), а во втором случае (для вещественной переменной кш) указывается и общее количество символов и их количество в дробной части (здесь соответственно 7 и 3). Это делается для того, чтобы выровнять столбцы выводимых чисел. При п=Ю получаем результаты работы программы, показанные на рис. 5.2.
Рис. 5.2. Программа для пересчета расстояний из миль в километры (а) и результаты ее работы (6)
Цикл с постусловием
Общий вид оператора следующий:
repeat
тело_цикла until условие;
где repeat и until — служебные слова, repeat означает “повторять", until — идо тех пор". Цикл работает следующим образом: вначале выполняется оператор или группа операторов, входящая в тело цикла. Затем проверяется, выполняется ли условие, находящееся после until. Если условие истинно, то работа цикла на этом завершается, если условие ложно, то тело цикла выполняется снова, после чего выполняется очередная проверка и т. д. Таким образом, данный цикл будет работать до тех пор, пока условие, находящееся после слова until, ложно. Такой цикл называют циклом с постусловием (латинская приставка ,,постм означает "после"). Подобное название цикла связано с тем, что проверка условия, определяющего работу цикла, производится уже после его выполнения. По определению цикла понятно, что даже если условие вообще никогда не выполняется, то тело цикла будет выполнено хотя бы один раз.
Цикл такого типа удобно использовать для решения следующей задачи: требуется определить средний рост учеников в классе. Данные о росте каждого ученика вводятся с клавиатуры. Сколько учащихся в классе заранее не известно, но известно, что признаком окончания ввода исходных данных является ввод нуля.
Для решения данной задачи требуется произвести следующие действия: во- первых, обеспечить ввод требуемых исходных данных, представляющих собой последовательность целых чисел (условимся, что рост мы измеряем с точностью до сантиметра). Далее нужно найти среднее арифметическое этой последовательности чисел. Для этого сначала нужно найти сумму членов последовательности.
Попробуем большую часть этих действий выполнить в ходе работы цикла. Перед началом работы программы опишем следующие переменные: rest — используется для хранения роста каждого отдельного ученика; п— общее число членов последовательности, которая будет на единицу больше, чем общее число учеников в классе, т. к. последний член последовательности — это, как мы помним, не чей-либо рост, а признак конца; sum— сумма членов последовательности; sred — искомый средний рост учеников в классе (эта величина должна быть вещественной, т. к. она является результатом деления).
Перед началом работы цикла обнуляем переменные sum н п, т. к. число членов пока что должно быть равно нулю, а соответственно нулю должна быть равна и их сумма. Далее после служебного слова repeat идут операторы тела цикла. Первыми двумя операторами тела являются оператор вывода, содержащий приглашение на ввод роста очередного ученика, и оператор, напоминающий о том, что для окончания ввода требуется ввести нуль. Следующий оператор —оператор ввода — обеспечивает присваивание введенной с клавиатуры величины (роста данного ученика) переменной rost. Далее в цикле находится оператор присваивания, который увеличивает текущее значение переменной sum на величину, равную введенному росту. Таким образом, к концу работы цикла в переменной sum мы получим сумму ростов всех учеников класса (при последнем выполнении цикла будет введен еще и дополнительный нуль, но он, понятно, на общую сумму не повлияет). Но знания значения только переменной sum нам недостаточно для решения задачи, т. к. нам необходимо знать еще и число учеников. Для определения этого числа мы подсчитаем сначала число членов последовательности, которое будет лишь на единицу больше числа учеников. Для такого подсчета в цикле мы будем использовать счетчик п. Этот счетчик будет увеличиваться на единицу после ввода очередного члена последовательности.
В итоге по окончании работы цикла нам останется только определить средний рост, представляющий собой частное от деления итоговой суммы на число учеников класса. Первая величина нам уже известна, а вторую величину мы найдем, вычтя из итоговой величины п (общего числа членов последовательности) единицу. Частное от деления этих двух величин sred и будет искомой величиной, которую останется только вывести на экран компьютера оператором вывода. В листинге 5.2 приводится текст данной программы.
存..,.:,ЕЕ不二':",..,.严屮承‘■;..,一 :/.,.3«W„座厂."<."二.t…..У…….《… ..:"“?.";rИ.一,.“" L,一...;“;h:一川"
;Листййг:&2. П0Ьфймма определения среднего роста учеников класса
program srrost;
Uses Crt;
var rostf n,sum:integer;
sred:real;
begin
ClrScr;
sum:=O;
n:=0;
repeat
writein{* Введите рост очередного ученика в см*); writeln(* Для окончания ввода введите О');
readln(rost);
sum: ~sum+rost;
n:=n+l
until mst=。;
sred: =sum/ (n-1);
writein(1Средний рост учеников равен ',sred:7:2,' см'); readln
end.
aa
a
a
Рис. 5.3. Программа определения среднего роста (а) и результат ее работы (6)
Как уже говорилось, эту разновидность оператора цикла целесообразно использовать в тех случаях, когда заранее нельзя предсказать сколько раз цикл будет повторяться. В частности, с такой ситуацией часто можно столкнуться при разработке различных компьютерных игр, когда те или иные действия игрока повторяются заранее неизвестное количество раз.
Создадим собственными силами компьютерную игру со следующими правилами. Компьютер задумал некоторое целое число в диапазоне от I до 20. Игрок должен угадать задуманное число. Всего игроку дается 5 попыток угадать число. Игра продолжается до тех пор, пока игрок не угадал число или не исчерпал имеющиеся у него попытки. Игрок выигрывает в том случае, если он угадал число с любой из 5 попыток, и проигравшим, если попытки закончились, а он так и не угадал число. При этом желательно, чтобы число, которое загадал компьютер, не повторялось от игре к игре, и каждый раз было другим.
Дия того чтобы составить такую программу, нам нужно будет познакомиться с двумя новыми командами языка Паскаль, которые используются для работы с генератором случайных чисел. Генератором случайных чисел называется специальная подпрограмма, входящая в состав языка Паскаль, которая выдает случайным образом выбранные случайные числа, которые в зависимости от указанных параметров могут бьпь как целыми, так и дробными. Мы для нашей программы рассмотрим тот вариант работы генератора, когда он выдает целые числа. Для того чтобы использовать генератор случайных чисел, его следует предварительно запустить в рабочу или. как говорят, инициализировать. Инициализация генератора случайных чисел производится командой
Randomize;
Следующее, что требуется сделать, — это взять некоторое число из созданного ряда случайных чисел. Данное действие производится посредством команды random(n)
где п—указываемое пользователем целое число или имя целочисленной переменной. Команда random будет выбирать числа, которые находятся в диапазоне от 0 до n-l. Полученное командой random число можно в дальнейшем вывести на экран компьютера оператором вывода или использовать в качестве составной части арифметического выражения. Если в программе будет, например, указана команда
random(10);
то данная команда выдаст число из ряда 0, I, 2, ..., 9, т. е. первое число ряда равно 0, а последнее будет на единицу меньше, чем указанное в скобках. Ес-
ли же мы хотим, чтобы выводимое на экран компьютера посредством команды random число было натуральным однозначным числом (т. е. принимало значения I, 2,…,9), то используем прием, показанный в следующем фрагменте программы:
Randomize;
writeln(гапйсяп(9)+1);
В этом случае к выводимому значению будет добавлена единица. Поэтому минимальное из возможных выводимых чисел будет равно 1 (0+1), а максимальное будет равно 9 (8+1).
Текст программы, использующей генератор случайных чисел, приведен в листинге 5.3.
Листинг 5.3. Компьютерная игра пр угадыванию задуманного компьютером
числа
program igra;
Uses Crt;
var
x,у,n:integer;
begin
ClrScr;
Randomize;
n:=l; x:random(19)+1;
Textcolor(cyan);
writeln (1 Компьютер задумал целое число (от 1 до 20) •);
writeln(Попробуйте угадать это число (всего у Вас будет 5 попыток)•); repeat
Textcolor(green);
writeln(nf * попытка *);
writeln(1Введите число и нажмите клавишу Enter*);
readln(у); n:=n+l
until (х=у) or (n>5);
if x=y then begin Textcolor(1ight red);
writeln(Поздравляю Вас с выигрышем1) end else begin
Textcolor(lightblue);
writein (*Вы проиграли. Задуманное компьютером число равно ・,*) end;
readln end.
В данной программе после очистки экрана производится инициализация генератора случайных чисел. Затем командой random берется случайное число, которое присваивается целочисленной переменной х. Это и будет число, задуманное компьютером, но неизвестное заранее пользователю, которое он и должен угадать. В процессе угадывания числа компьютер должен фиксировать согласно условиям игры сделанное пользователем количество попыток. Это количество попыток будет содержать другая целочисленная переменная п. Так как попытки мы будем считать, начиная с первой, а не с нулевой, то мы присвоим переменной п начальное значение, равное единице.
Сам процесс угадывания числа будет производиться в цикле с постусловием. Тело цикла включает в себя следующие операции. В начале пользователю оператором вывода предлагается ввести предполагаемое значение х. Для справки указывается номер попытки, который будет равен текущему значению переменной п. Предполагаемое значение х вводится в компьютер оператором readln и присваивается переменной у. Последним оператором тела цикла является оператор присваивания, который увеличивает текущее значение переменной п на единицу, для того чтобы при следующем повторении тела цикла (если таковое будет иметь место) правильно фиксировался номер попытки.
Постусловие, которое определяет, нужно ли следующее повторение тела цикла, является сложным и состоит из двух простых условий. Необходимость повторения тела цикла отпадает, во-первых, в том случае, если пользователь угадал число, т. е. введенное им предполагаемое значение у совпало с действительным значением х. Равенство значений этих двух переменных и будет одним из возможных условий окончания цикла. Второй вариант окончания работы цикла заключается в том, что пользователь исчерпал имевшееся у него число попыток. В этом случае после завершения последней неудачной попытки (пятой по счету) переменной п будет присвоено новое значение, равное 6 (5+1). Таким образом, вторым условием окончания цикла будет превышение переменной п значения 5, т. е. п>5. Оба этих условия заключаются согласно правилам языка Паскаль в скобки и объединяются операцией or (логическое Или), т. е. работа цикла завершится в том случае, если будет выполняться или одно» или другое условие.
По завершении работы цикла остается выяснить, было ли все-таки угадано загаданное компьютером число, и вывести для пользователя соответствующее сообщение. Для такой проверки используется условный оператор if, в заголовке которого указывается проверяемое условие — это опять-таки ра-
венство значений переменных х и у. Если эти значения на данный момент равны, остается поздравить пользователя с победой и вывести сообщение об этом оператором вывода. Сообщение о победе выводится в ветви программы, находящейся после служебного слова then. Если же значения переменных не совпадают, то нужно сообщить пользователю, что он проиграл и проинформировать его о том, какое число было задумано на самом деле. Эту задачу выполняют операторы, находящиеся в условном операторе после служебного слова else.
Для того чтобы процесс игры для пользователя был менее монотонным, мы "раскрасили" выводимую программой информацию в разные цвета с помощью операторов Text color. Так начальное сообщение об условиях игры выводится на экран бирюзовым цветом, информация о номере очередной попытки и приглашение на ввод пользователем очередного числа выводится зеленым цветом. В том случае, если пользователь выиграл, информация о победе выводится светло-красным цветом, а в случае проигрыша соответствующая информация н задуманное число— голубым цветом. На рисунках приведены два возможных варианта игры: в первом случае игру выиграл компьютер (рис. 5.4, □), во втором — пользователь (рис. 5.4, б).
Еще одним заслуживающим внимание применением цикла с постусловием является защита программы от неправильного ввода данных. В главе J уже было показано, как подобную защиту можно производить с помощью оператора безусловного перехода, ио более правильным считается использование оператора цикла, т. к. при этом не происходит чрезмерного усложнения структуры программы.
В качестве примера рассмотрим уже составленную ранее программу, моделирующую работу калькулятора, рассмотренную ранее в разд. J.3. В первоначальном варианте этой программы отсутствует защита от неправильного ввода данных при выборе в меню одного из возможных вариантов действий. Напомним, что для выбора одного из действий, которое можно произвести над двумя введенными числами, в этой программе нужно ввести целое число от 1 до 4.
Для защиты программы от неверного ввода данных мы используем цикл с постусловием. Телом этого цикла будуг операторы вывода, сообщающие пользователю о том, какие числа можно вводить для выбора вариантов дальнейших действий, и оператор ввода, который присваивает значение переменной х. являющейся переменной-селектором, используемой для выбора варианта.
writein(* Выберите действие, производимое над числами *);
writein(1(введите соответствующую иифру)');
writein (* 1 - сложение, 2 - вычитание, 3 - умножение, 4 - деление1); readln(х)
£ 1 uibu PascalК«тни.г> I <' p »ад'дюп це ио г ч исял(“i I до ?U)non|i<»f. ми < r vi 4Ra <ь Mio ”i“nc ( r «■ e г с у I; ас 6” A” S nuutil n*.)£ 1 uibu PascalК«тни.г> I <' p »ад'дюп це ио г ч исял(“i I до ?U)non|i<»f. ми < r vi 4Ra <ь Mio ”i“nc ( r «■ e г с у I; ас 6” A” S nuutil n*.)■ЕШ■ЕШааI • 4 … I t< “U II II uЛ1 Г r. L. .t II I rrI • 4 … I t< “U II II uЛ1 Г r. L. .t II I rrК)iК)iг “tj“i pMjrnг “tj“i pMjrn66
£ 1 uibu Pascal
К«тни.г> I <' p »ад'дюп це ио г ч исял(“i I до ?U)
non|i<»f. ми < r vi 4Ra <ь Mio ”i“nc ( r «■ e г с у I; ас 6” A” S nuutil n*.)
£ 1 uibu Pascal
К«тни.г> I <' p »ад'дюп це ио г ч исял(“i I до ?U)
non|i<»f. ми < r vi 4Ra <ь Mio ”i“nc ( r «■ e г с у I; ас 6” A” S nuutil n*.)
■ЕШ
■ЕШ
а
а
I • 4 … I t< “U II II uЛ1 Г r. L. .t II I rr
I • 4 … I t< “U II II uЛ1 Г r. L. .t II I rr
К)i
К)i
г “tj“i pMjrn
г “tj“i pMjrn
6
6
Рис. 5.4. Возможные варианты игры "угадай число"
Это тело цикла будет повторяться до тех пора, пока не будет выполнено одно из условий, находящихся в завершающей строке цикла:
(x=l) or 《х=2) or (х=3) or (х=4)
Тогда весь оператор цикла будет выглядеть следующим образом:
repeat
writeln(* Выберите действие# производимое над числамиг);
writeln(*(введите соответствующую цифру)1);
writeln (11 - сложение, 2 - вычитание, 3 - умножение, 4 - деление1); readln(х)
until (х=1) or (х=2) or (х=3) or (к=4);
Рис. 5.5. Результаты работы программы-калькулятора с защитой от неправильного ввода данных
Теперь, если пользователь попробует ввести при выборе варианта в меню число 5 или 7, программа вновь будет возвращать его к вводу данных. Целиком же усовершенствованная программа будет выглядеть следующим образом ——листинг 5.4.
program kalkl;
Uses Crt;
var a,b,x:integer; d:real;
begin
ClrScr;
writein(*Введите первое число');
readln(a);
writein(*Введите второе число*);
readln(b);
repeat
writein(1Выберите действие, производимое над числами1);
writein(*(введите соответствующую цифру)1);
writein (11 - сложение, 2 - вычитание, 3 - умножение, 4 - деление•); readln(х)
until (х=1) or (х=2) or (х=3) or (х=4);
case х of
writeln(a, • + * rbr •=* ra+b);
writein (a, zbr *=' ra-b);
writein (а, * * *, br '-•, a*b);
4; begin d:=a/b; writ:eln(a, •,,,b,' = • .d:7:3) end end;
readln end.
На рис. 5.5 показан результат работы программы-калькулятора при попытке ввести неправильные данные н полученный результат вычислений при правильном вводе.
Цикл с предусловием
Общий вид оператора while следующий:
while условие do тело_цикла;
где while и do— служебные слова, while означает "пока”, do——нделать, вы- полнятьи.
Цикл работает следующим образом: первоначально проверяется условие, находящееся после слова while» если данное условие является ложным, то работа цикла на этом завершается. Если условие является истинным, то выполняется оператор или группа операторов, входящая в тело цикла. Затем снова производится проверка условия, содержащегося в строке заголовка н т. д. Таким образом, тело цикла выполняется пока истинно условие, содержащееся в заголовке инкла. Цикл такого типа называют циклом с предусловием. Это объясняется тем, что перед первым же выполнением цикла производится проверка истинности находящегося в заголовке условия. Если условие изначально не выполняется, то тело цикла не будет выполнено ни разу.
В качестве примера использования цикла типа while приведем программу разложения целого положительного числа на простые множители. Напомним, что простым называется целое число (кроме единицы), которое делится только на единицу и само на себя. Составным или сложным называется число, которое делится еще н на другие числа. Любое составное число можно представить единственным образом в виде произведения простых чисел, которые и называются простыми множителями.
Наиболее простой (хотя и достаточно трудоемкий для человека, но не для компьютера) алгоритм разложения числа на множители заключается в следующем. Исходное число делится на все числа, начиная с 2. Если число нацело разделилось на делитель, то этот делитель является одним из искомых простых множителей. Тогда мы определяем частное от деления этих двух чисел и делим уже его на все числа, начиная с 2. Если же исходное число или
последнее получившееся частное не делится нацело на делитель, то значение делителя увеличиваем на единицу и уже это новое значение используем при дальнейшей работе. Так мы будем действовать до тех пор, пока значение делителя не станет равным частному или самому числу (в том случае, если простых множителей для исходного числа не было найдено). На этом поиск простых множителей завершается.
В начале программы оператором вывода пользователю предлагается ввести с клавиатуры исходное число с, которое вводится оператором readin. Затем следующий оператор вывода сообщает о том, что далее будет производиться вывод простых множителей. Для этого мы будем делить введенное число на некоторое число d. Если число с разделится на число d без остатка, то d будет одним из искомых множителей, на которые нужно разложить с. Деление без остатка подразумевает, что остаток от деления будет равен нулю, т. е. должно выполняться соотношение с mod d = 0. Начинать поиск делителей мы начнем с наименьшего возможного ——числа 2. Поэтому переменной d мы присвоим начальное значение 2.
Поиск простых множителей мы будем производить в цикле. Этот цикл с предусловием будет работать до тех пор, пока значение делителя d будет меньше или равно делимому с. Как только d станет больше с, работа цикла прекратится, т. к. дальнейший поиск не имеет смысла. В теле цикла первым оператором будет условный оператор, проверяющий соотношение с mod d = о. Если данное соотношение истинно, то текущее значение d является одним из нскомь1х простых множителей, и тогда нужно будет выполнить две операции. Во-первых, надо вывести на экран компьютера текущее значение переменной d. Во-вторых, для того чтобы продолжить дальнейший поиск простых множителей, нужно найти частное от деления с на d. Это частное мы найдем посредством операции целочисленного деления с div d. Результат этой операции мы присвоим переменной с, и в дальнейшем будем работать с этим новым ее значением, ища для него возможные делители. Указанные ранее операции находятся в той ветви условного оператора, которая расположена после слова then. Если же с не разделилось на а без остатка, то работает ветвь условного оператора, которая расположена после else. В этом случае текущее значение делителя d увеличивается на единицу, и при новом выполнении тела цикла будет использоваться это новое значение делителя. В листинге 5.5 приводигся текст данной программы.
j Листинг 5.5. Программа разложения числа на простые множители
program razl;
Uses Crt;
var c,d:integer;
begin
Cluser;
writein(* введите целое положительное число•);
readln(с);
writein(1Число *,с,* можно разложить на следующие простые множители:*); d:=2;
while d<^c do
if c mod d = О
then begin write (* Id); c:=c div d end
else d:=d+l;
readln
end.
^4 I ui bo —xcM^4 I ui bo —xcMПМ«*АМ1<* “LW tlUIIO I 141ГПЪНМГ ”“《.”" I"Чм«- «io 13 rto 1 fto pa t«Iо I м 11< tta с iirjiv»«i|Mr Hpttc tuc гтно L»ttr «1 м:ПМ«*АМ1<* “LW tlUIIO I 141ГПЪНМГ ”“《.”" I"Чм«- «io 13 rto 1 fto pa t«Iо I м 11< tta с iirjiv»«i|Mr Hpttc tuc гтно L»ttr «1 м:
^4 I ui bo —xcM
^4 I ui bo —xcM
ПМ«*АМ1<* “LW tlUIIO I 141ГПЪНМГ ”“《.”" I"
Чм«- «io 13 rto 1 fto pa t«Iо I м 11< tta с iirjiv»«i|Mr Hpttc tuc гтно L»ttr «1 м:
ПМ«*АМ1<* “LW tlUIIO I 141ГПЪНМГ ”“《.”" I"
Чм«- «io 13 rto 1 fto pa t«Iо I м 11< tta с iirjiv»«i|Mr Hpttc tuc гтно L»ttr «1 м:
Рис. 5.6. Программа разложения числа на простые множители (а) и результаты ее работы (б)
Таким образом мы переберем все возможные значения простых множителей и выведем на экран те из них, которые действительно являются таковыми.
Если исходное число является простым, то в результате работы программы на экран будет выведен единственный результат— само исходное число. Если же число является составным, то простых множителей будет как минимум два. Результат работы программы показан также на рис. 5.6.
Задания для самостоятельной работы
Задание 1. В университете формируется баскетбольная команда, членами которой могут стать студенты, рост которых составляет не менее 175 сантиметров. Составить программу, которая позволила бы тренеру команды определить, сколько потенциальных кандидатов в команду имеется в студенческой группе, насчитывающей 25 человек. Данные о росте каждого из студентов группы вводятся в компьютер с клавиатуры.
Задание 2. Клиент положил в банк сроком на 5 лет некоторую денежную сумму под определенный процент. Составить программу, которая бы определяла, какую величину составит сумма вклада по истечении срока хранения данного вклада в банке, если по условиям договора о вкладе, заключенного между клиентом и банком, в течение всего срока хранения вклада банковский процент не должен изменяться. Сумма вклада и процент вводятся в компьютер с клавиатуры.
Задание 3. Известна легенда о том, как одному могущественному индийскому радже некий мудрец оказал важную услугу. В награду за услугу раджа был готов выполнить любое желание мудреца. Мудрец попросил положить перед ним шахматную доску и на первую клетку доски положить одно зерно риса, на вторую клетку два зерна, на третью клетку четыре зерна и т. д., т. е. на каждую следующую клетку должно было быть положено вдвое больше зерен, чем на предыдущую, и таким образом должны были быть заполнены все 64 клетки шахматной доски. Как оказалось при подсчете, для выполнения просьбы мудреца не хватило бы не только всех запасов риса во владениях раджи, но и всего урожая риса на всем земном шаре. Составить программу, которая определила бы, на какой по счету клетке шахматной доски количество зерен риса должно было превысить один миллион, в случае если просьба мудреца была бы выполнена.
Задание 4. Определить, исходя из условий, поставленных в предыдущем задании, сколько клеток шахматной доски нужно было бы заполнить для того, чтобы суммарное число зерен на них превысило бы один миллиард.
ГЛАВА 6
Работа с текстом в Паскале
До сих пор мы рассматривали программы, в которых производилась обработка только числовых данных (программы из разд. 3.1 не являются исключением, т. к. в них мы имели дело с текстовыми данными, но при этом производился их вывод, а не обработка). Но современный компьютер, как известно, представляет собой устройство, способное работать не только с числовой информацией, но и с другими ее видами (текстовой, графической, аудио и видеоинформацией). В языке Паскаль также предусмотрена возможность обработки текстовых данных. Для работы с ними используются типы char и string, которые соответственно применяются для работы с данными символьного и строкового типов.
6.1. Символьные величины
В программах, написанных на Паскале, широко используются символьные константы и переменные. Значениями как тех, так и других являются символы. Символами называются все буквы и цифры, пробел, знаки препинания, которые можно вводить с клавиатуры компьютера.
Как уже говорилось в начале данной книги, центральный процессор компьютера может работать только с информацией, представленной в численном виде. Любая вводимая в компьютер информация другого вида должна быть обязательно преобразована в числовую форму или, как говорят, закодирована с помощью соответствующих чисел. Так обстоит дело и при вводе в компьютер и дальнейшей обработке в нем текстовой информации. Фактически компьютер работает не с буквами, пробелами, точками и запятыми, а соответствующими им числовыми кодами. Когда пользователь при работе на компьютере использует готовые программы, такие как текстовые редакторы, электронные словари и переводчики, то ему не обязательно знать механизм
обработки текстовых данных внутри компьютера. Программисту же необходимо представлять себе взаимосвязь между символом, отображаемым на экране компьютера, и хранящимся в памяти компьютера его числовым кодом.
Понятно, что если каждый программист будет изобретать свои собственные числовые коды для используемых в компьютере символов, то применять созданные им программы для обработки текстов сможет только он сам. Поэтому возникла необходимость в создании единой, общепринятой системы представления символов числовыми кодами. Такая система была реализована в виде кодовой таблицы ASCII.
ASCII — это аббревиатура от American Standart Code for Information Interchange, что в переводе означает ^американский стандартный код для обмена информацией*1. Это используемая во всем мире таблица для кодирования вводимой в компьютер текстовой информации. Данная таблица содержит буквы латинского алфавита (прописные и строчные), цифры от 0 ло 9, символы арифметических операций и знаки препинания, а также различные специальные символы. Каждому из имеющихся в таблице символов соответствует свой числовой код. Например, прописной букве "N” латинского алфавита соответствует числовой код 78, строчной букве "п" — код 110 (строчные и прописные буквы имеют разные коды). Цифре "6” соответствует код 54, пробелу —код 32, запятой — код 44 и т. д. Кроме того, кодовая таблица содержит так называемые управляющие символы, которые при вводе не отображаются непосредственно на экране компьютера, но при этом выполняют определенные действия, например, производят перевод курсора на следующую строку при работе с текстом или выдают звуковой сигнал. Каждому из управляющих символов также соотвелствует числовой код. Всего эта таблица содержит 128 символов. Данная таблица является единой для всех IBM-PC совместимых компьютеров.
К основной таблице ASCII существует дополнение, также содержащее 128 символов. Эта вторая половина таблицы зарезервирована для символов национальных алфавитов и, соответственно, для разных стран выглядит по- разному. В России во второй половине содержатся, естественно, прописные и строчные буквы кириллицы (русского алфавита). Помимо символов кириллицы в этой части таблицы содержатся так называемые псевдографические символы, которые не имеют соответствующих им клавиш на клавиатуре компьютера, но могут быть выведены на экран путем набора их числового кода при нажатой клавише <Alt>. Содержит эта часть таблицы и некоторые специальные символы, отсутствующие в первой, международной части. К их числу, например, относится радикал (4 — знак квадратного корня).
Следовательно, всего расширенная таблица, состоящая из международной и национальной части, содержит 256 символов. Обычно числовой код записывают в привычной всем нам десятичной системе счисления, но в ряде случаев
129129Работа с текстом в Паскале
129
129
для его записи применяют и другую, шестнадцатеричную систему счисления, в которой помимо цифр от 0 до 9 используют также буквы латинского алфавита от "А" до “F", обозначающие числа от 10 до 15. Па рис. 6.1 приведены символы, входящие в таблицу ASCII, и соответствующие каждому из этих символов десятичный и шсстнадцатеричный числовой код.
-■■•_■■■ ■■ ■-■l*r\JL'1. 'АО_^м^ ■■“—2а4а“4сЛ||4ЕW ■ S676.■с—э'г567,яL _т-за ЗЗ^РЗ^ЛЗМЛЭЗ ЗЭ-ЛЯЗ - .гу-о ■,3.-,■• 7 ■,丁 12 3 ШшЯ-■■•_■■■ ■■ ■-■l*r\JL'1. 'АО_^м^ ■■“—2а4а“4сЛ||4ЕW ■ S676.■с—э'г567,яL _т-за ЗЗ^РЗ^ЛЗМЛЭЗ ЗЭ-ЛЯЗ - .гу-о ■,3.-,■• 7 ■,丁 12 3 ШшЯ,带嚣♦:,带嚣♦:?1₽ IL , [騒? 爾齡5?1₽ IL , [騒? 爾齡5117 П ■ t18 7€. ♦ "•"7 w. 礫1117 П ■ t18 7€. ♦ "•"7 w. 礫1Рис. 6.1. Символы кодовой таблицы ASCII (а — первая половина таблицы, б— вторая половина)Рис. 6.1. Символы кодовой таблицы ASCII (а — первая половина таблицы, б— вторая половина)бб
-■■•_■■■ ■■ ■-■l*r\JL'1. 'АО_^м^ ■■“—2а4а“4сЛ||4ЕW ■ S676.■с—э'г567,яL _т-за ЗЗ^РЗ^ЛЗМЛЭЗ ЗЭ-ЛЯЗ - .гу-о ■,3.-,■• 7 ■,丁 12 3 ШшЯ
-■■•_■■■ ■■ ■-■l*r\JL'1. 'АО_^м^ ■■“—2а4а“4сЛ||4ЕW ■ S676.■с—э'г567,яL _т-за ЗЗ^РЗ^ЛЗМЛЭЗ ЗЭ-ЛЯЗ - .гу-о ■,3.-,■• 7 ■,丁 12 3 ШшЯ
,带嚣♦:
,带嚣♦:
?1₽ IL , [騒? 爾齡5
?1₽ IL , [騒? 爾齡5
117 П ■ t18 7€. ♦ "•"7 w. 礫1
117 П ■ t18 7€. ♦ "•"7 w. 礫1
Рис. 6.1. Символы кодовой таблицы ASCII (а — первая половина таблицы, б— вторая половина)
Рис. 6.1. Символы кодовой таблицы ASCII (а — первая половина таблицы, б— вторая половина)
б
б
В каждом из столбцов первая запись слева обозначает десятичный код символа, вторая запись ——код этого же символа, записанный в шест»<адцатерич- ной системе счисления, широко применяемой в программировании. Справа в столбце изображен сам символ.
Знание числовых кодов символов понадобится нам в дальнейшем при составлении различных программ по обработке текстов, но большинство символов, которые не являются псевдографическими и управляющими, можно использовать в программе непосредственно в виде символьных констант. Употребляемые в программе символьные константы записываются так:
•Д*•у*•?••щ'
т. е. запись символьной константы состоит из символа, заключенного в апострофы.
5 Зак 1068
Если в вашей программе задействована символьная переменная, она должна быть предварительно указана в разделе описаний подобно числовым переменным. Описание символьной переменной выглядит следующим образом:
var имя_переменной: cha г;
где char — служебное слово, обозначающее тип данной переменной, char — это сокращение от английского слова character, означающего в переводе "символ**.
Например, если в программе в разделе описания переменных мы видим: var i,n: integer;
d: real; sim,bukv: char;
то в данной программе используются две переменных целого типа (i и п), одна ——вещественного типа (а), и две ——символьного типа (sim и bukv). Если переменной символьного типа присваивается какое-либо значение, то оно также должно быть заключено в апострофы. Например:
sim: = ,ui,;
означает, что переменной sim было присвоено значение буквы "ш". Возможен в программе и такой оператор присваивания:
cf г:=7;
наличие в программе такой записи говорит о том, что переменной cfr присваивается значение символа "7" (а не числа 7, как было бы в случае с числовой переменной).
Подобно обычным числам символьные величины можно сравнивать. При этом фактически сравниваются не сами эти величины, а соответствующие им числовые коды. Например, можно записать такую операцию сравнения:
Кн,
результат этой операции будет истинным (равен true), т. к. код символа "л" равен 171, а код символа "н" — 173. А если мы запишем следующее соотношение:
'к'>'т‘
то такое соотношение будет ложным (false), т. к. код символа "к" равен 170, а символа ”т" — 226. Можно проверять символьные величины также на равенство или неравенство друг другу. Знаки для операций сравнения символьных величин используются те же, что и для числовых величин.
В языке Паскаль для работы с символьными переменными используются специальные стандартные функции chr и ord, которые мы подробно рассмот-
рим в соответствующей главе книги. Пока же достаточно знать то, что стандартная функция по известной искодной величине, которая называется аргументом и заключается в скобки, находящиеся после имени функции, определяет некоторое значение.
Функция chr по известному числовому коду символа определяет сам этот символ. Общий вид функции:
chr(к)
где к——десятичный числовой код символа. Например, значение chr(зз)будет равно ' ! ', chr (233) — *щ* И т. д.
Составим программу, которая будет выводить соответствующую группу символов для заданного диапазона числовых кодов. Числовые коды находящихся в таблице ASCII символов могут изменяться от 0 до 255. Правда, символы с кодами от 0 до 31 являются управляющими и правильно отображаться на экране компьютера не будут. Поэтому условимся, что начальный код диапазона должен быть не менее 32, а конечный не более 255. Кроме того, для правильной работы программы необходимо, чтобы начальный код диапазона был меньше, чем конечный.
Для защиты от неправильного ввода данных используем следующий прием. После операторов, осуществляющих ввод исходных данных, ставим сокращенный условный оператор if. В условии, находящемся в заголовке этого оператора, с помощью операций or объединены все перечисленные ранее условия. Если хотя бы одно из этих условий будет нарушено, то с помощью оператора безусловного перехода управление передается на начало программы, и пользователь заново должен ввести исходные данные, соответствующие указанным в программе условиям. Если пользователь ввел правильные исходные данные, то программа переходит к следующим операторам.
Далее в программе осуществляется непосредственно процесс вывода символов. Этот процесс организован в виде цикла с заранее известным числом повторений. Начальным значением переменной цикла i является введенный пользователем начальный код диапазона, конечным значением переменной соответственно— конечный код диапазона. Тело цикла в данной программе состоит всего из одного простого оператора. Это оператор вывода, который выводит на экран компьютера очередное значение функции chr, аргументом которой является текущее значение переменной цикла i. При каждом выполнении тела цикла на экран компьютера выводится символ, код которого на единицу больше кода предыдущего выведенного символа. Чтобы вывести результат работы программы в одной строчке, используем в теле цикла оператор write. Приводим текст данной программы.
Листинг 6.1. Программа, выводящая группу символов из заданного диапазона i
program symbols;
Uses Crt;
label 10;
var i,a,b:integer;
begin
ClrScr;
10: writein(•Введите начало числового диапазона (число от 32 до 255)*); readIn(а);
writein(*Введите конец числового диапазона (яисло от 32 до 255)*); readln(b);
if (а<32) or (b<32) or (a>255) or (b>255) or (a>b) then begin
writein(*Вы ввели неверные исходные данные *);
goto 10
end;
writeln(1Числовым кодам от •г а,* до * ,Ь)
writein('соответствуют следующие символы*);
for i:=a to b do
write(chr(i)f * *);
readln
end.
Для диапазона числовых кодов, начальным из которых является 176, а конечным——215, результаты работы программы показаны на рис. 6.2. В итоге работы программы для данного диапазона мы получили строку символов псевдографики. Псевдографическими символами называются различные вертикальные и горизонтальные линии, уголки, перекрестия линий, прямоугольники, которые используются для создания рамок, таблиц, несложных рисунков и тому подобных объектов.
Действие функции 0rd противоположно функции chr. Аргументом данной функции является символ, а значением — десятичный код данного символа. Общий вид функции:
ord(*s1)
где s — символ, код которого мы определяем. Обратите внимание, что обрабатываемый функцией символ должен быть обязательно заключен в кавычки, иначе при компиляции программы с использованием данной функции будет выдано сообщение об ошибке. Поэтому запись функции должна выглядеть в программе следующим образом ord('/), 0rd('©')ит. д. Для символа "*" функция выдаст код 166, для символа "фи — 228.
Рис. 6.2. Программа, выводящая символы кодовой таблицы ASCII (а), и результаты ее работы (б)
Подобно целочисленной переменной, символьную переменную можно использовать в качестве селектора в операторе множественного выбора. Принцип использования символьной переменной тот же, что и для целочисленной переменной, только вместо числовых значений перед описанными в операторе вариантами действий ставятся любые символы.
Однако при использовании символьных переменных в операторе case.. .of необходимо учитывать один нюанс. Когда в операторе множественного выбора перед одним из вариантов указывается соответствующее ему значение символьной переменной, то это значение должно быть обязательно заключено в апострофы. Как может выглядеть такой оператор case.. .of, хорошо видно на следующем примере.
case letter of
•n*: writeIn(1привет!*);
•з': writein(1 здравствуйте!•);
'д*: writein(*добрый день!');
end;
В зависимости от значения, которое присваивается символьной переменной letter, компьютер будет выводить на экран различные варианты приветствия. Если символьной переменной присвоено значение "гГ, то на экране мы увидим слово "привет!", если значение будет равно "з", то компьютер напишет на экране слово "здравствуйте!", если значение будет равно "а", то компьютер скажет пользователю "добрый день!". Естественно, что для правильной работы данного оператора переменная letter должна быть описана в начале программы как переменная типа char.
Описанные ранее возможности символьных переменных используются в следующей задаче. Требуется составить программу, которая осуществляет ввод двух целых чисел. Над введенными числами по выбору пользователя может осуществляться одно из следующих действий: определение среднего арифметического, наибольшего общего делителя и среднего гармонического. Выбор варианта действия должен производиться путем нажатия соответствующей буквы: "а" — для среднего арифметического» нб° — для наибольшего общего делителя, нви — для среднего гармонического.
Напомним читателю, что средним гармоническим чисел 股 н 〃 называется число s, которое удовлетворяет следующему равенству:
Путем несложных математических преобразований можно определить, что среднее гармоническое вычисляется по следующей формуле:
2s=~i~Г'--+ 一т л
В листинге 6.2 приводится текст программы, которая решает поставленную задачу.
Листинг 6.2. Программа, определяющая по выбору пользователя среднее арифметическое, наибольший общий делитель или среднее гармоническое 二
program charcase; uses crt;
label 10;
var i,krm,n,d:integer; rez:real; ch,p:char; begin
ClrScr;
readln (m); readln (n);writein(1над writein(* a - writein(16 - writein('в - writein(1для readln (ch);case ch ofreadln (m); readln (n);writein(1над writein(* a - writein(16 - writein('в - writein(1для readln (ch);case ch ofwritein(1Введите два числа,);
readln (m); readln (n);
writein(1над writein(* a - writein(16 - writein('в - writein(1для readln (ch);
case ch of
readln (m); readln (n);
writein(1над writein(* a - writein(16 - writein('в - writein(1для readln (ch);
case ch of
введенными числами можно выполнить следующие операции');
определение среднего арифметического');
определение наибольшего общего делителя');
определение среднего гармонического1);
выбора операции нажмите соответствующую букву*);
'а1: begin
гег: = (т+п) /2;
writein(1 среднее арифметическое равно \rez:6:2) end;
•б*: begin
d:=l;
if m<n
then k:m
else k:=n;
for i:=l to k do
if (m mod i 工0) and (n mod i =0) then d:=i;
writeIn(•наибольший общий делитель двух чисел равен ’.d) end;
*b*: begin
rez:=2/(1/m+l/n);
writein('среднее гармоническое равно *,rez:7:3) end;
end;
writeIn(* будете продолжать вычисления (д/н)1);
readln (р);
if р=,д, then goto 10 end.
Разберем текст данной программы. После команды очистки экрана с помощью операторов readln производится ввод двух целых чисел шип. Затем на экран компьютера с помощью операторов writein выводится текст меню,
который сообщает пользователю о том, какие действия можно выполнить над введенными числами и какому действию соответствует нажатие какой буквы. Введенная пользователем буква присваивается символьной переменной ch с помощью оператора ввода readln.
Далее переменная ch используется в качестве переменной-селектора в операторе множественного выбора case... of. Оператор множественного выбора включает в себя в данном случае три возможных варианта действия, соответствующих трем возможным значениям переменной-селектора. Вычисление среднего арифметического и среднего гармонического производится по соответствующим формулам, а полученный результат присваивается переменной rez, значение которой затем выводится на экран компьютера.
Несколько сложнее производится определение наибольшего общего делителя двух чисел d. Как известно, наибольшим общим делителем двух чисел m н п называется такое число “ на которое без остатка делятся оба эти числа. Понятно, что наибольший общий делитель не может быть больше, чем меньшее из двух исходных чисел. Поэтому в программе с помощью условного оператора if определяется меньшее из двух исходных чисел. Затем этот минимум присваивается переменной к. Таким образом, значение переменной к——это максимально возможное значение наибольшего общего делителя.
Затем для нахождения наибольшего общего делителя используется цикл с заранее известным числом повторений. В этом цикле перебираются все возможные значения наибольшего общего делителя, начиная с единицы и заканчивая к. Каждое из этих значений поочередно присваивается переменной цикла i. Затем проверяется, является ли текущее значение переменной i общим делителем для m и п, т. е., делятся ли одновременно оба этих числа без остатка на i. Для обеспечения совместной проверки двух условий используется логическая операция and. Если оба условия делимости выполняются одновременно, то текущее значение i присваивается переменной & Затем переменной i присваивается новое значение, которое на единицу больше предыдущего, и для него осуществляется аналогичная проверка. Таким образом, в результате работы цикла в переменной d будет содержаться максимальное значение общего делителя двух чисел, т. е. искомая величина, которая затем выводится на экран компьютера.
В заключительной части программы компьютер запрашивает пользователя о том, хочет ли он продолжать вычисления. Для ответа пользователь должен ввести букву пд" или "н". Если пользователь дал положительный ответ ("д"), то управление программой передается на ее начало, обозначенное меткой 10. В результате производится очистка экрана и затем пользователю вновь предлагается ввести два числа, над которыми можно произвести одну из трех указанных ранее операций. Если пользователь дал отрицательный ответ, то про-
грамма завершает свою работу. На рис. 6.3 представлены результаты работы программы для одной и той же пары исходных чисел при выборе различных вариантов действий.
Рис. в.З. Результаты работы программы charcase при вычислении среднего арифметического двух чисел (а), наибольшего общего делителя (б) и среднего гармонического (е)
6.2. Строковые величины
Естественно, что для эффективной работы с текстом необходимо уметь обрабатывать не только отдельные символы, но и слова, фразы, строки, т. е. группы символов. Для обработки таких групп символов в Паскале используется строковый тип данных. Для описания символьных переменных применяется служебное слово string. Описание символьной переменной в общем виде выглядит следующим образом:
var имя_переменной: string [длина];
после слова string указывается длина описываемой переменной, т. е. максимальное количество символов, которое может содержать данная переменная. Например, если в разделе описания переменных в программе мы видим:
var i:integer;
х:real
stroke:string[25];
то это означает, что в данной программе наряду с переменными целого типа i и вещественного типа х используется и переменная строкового типа stroka, которая может содержать до 25 символов. Параметр, заключенный в квадратные скобки, не является обязательным и используется в том случае, если существуют причины, по которым необходимо жестко ограничить максимальную длину строковой переменной. Если же после имени переменной ее длина не указывается» то по умолчанию она считается равной 255 символам. В этом случае описание символьной переменной будет выглядеть так:
var stroka:string;
Значения символьных переменных так же, как и уже знакомые нам символьные константы (к текстовым константам относятся, в частности, сообщения, выводимые оператором writein), должны обязательно заключаться в апострофы. Таким образом, оператор присваивания строковой переменной stroke значения Ннабор_символов" будет выглядеть следующим образом:
stroka:^ 'набор_символов';
Подобно числовым переменным, строковые переменные можно складывать. Результат сложения также можно присваивать какой-либо символьной переменной. Например, если значение переменной siovoi равно "Турбо ”,а переменной siovo2 — "Паскаль", то в результате операции:
slove:^slovol+sLovo2;
значение переменной slovo станет равным словосочетанию "Turbo Pascal**. Можно прибавлять к строковой переменной текстовую константу.
Например, если в программе имеется следующий оператор: fraza:=slovo + ” версия 7.0й;
то в результате значение строковой переменной fraza станет равным "Turbo Pascal версия 7.0й.
Рассмотрим работу со строковыми величинами на примере программы, которая спрашивает у пользователя как его зовут, а затем здоровается с ним и желает ему успехов в изучении программирования. В листинге 6.3 приводится текст данной программы.
program privet;
uses crt;
var x:string(40};
begin
ClrScr;
writein(rКак Вас зовут *);
readln(x);
writein;
writein('Здравствуйте, •rx,1!•);
writein (* Желаю Вам успехов в изучении программирования! •); writein(*С уважением. Ваш ПК*);
readln
end.
В данной программе в разделе описания переменных присутствует только одна переменная х строкового типа. В основной части программы с помощью оператора writein пользователю задается вопрос о его имени. Затем введенное с клавиатуры имя с помощью оператора readln присваивается строковой переменной х. Максимальная длина строковой переменной принята равной 40, т. к. даже если пользователь в ответ на вопрос компьютера введет полностью свое имя, отчество и фамилию, то суммарная длина их не превысит 40 символов. Затем в программе ставится "пустой” оператор writein для того, чтобы между ответом пользователя и последующим сообщением компьютера оставалась чистая строка.
Затем на экран выводится приветствие компьютера. В операторе writein список вывода состоит из трех элементов. Первый — это заключенное в апострофы слово "Здравствуйте", т. е. текстовая константа. Второй ——это значение строковой переменной х, т. е. введенное пользователем имя. Третий— это заключенный в апострофы восклицательный знак. В следующих строках про-
граммы операторами writeln завершается вывод текста приветствия. На рис. 6.4. показан экран с текстом программы и пример ее работы.
Рис. 6.4. Текст программы, которая спрашивает у пользователя его имя, а затем здоровается с ним (а), и результат ее работы (б)
Для рабогы со строковыми переменными в языке Паскаль используются различные функции, среди которых отметим функцию length. Аргументом данной функции является имя какой-либо символьной переменной, а значением ——фактическое количество символов, которое содержится в данной переменной (эта величина может быть меньше максимальной длины, заданной при описании переменной). Так значение функции length, аргументом которой является переменная stroka после выполнения указанного ранее оператора присваивания, будет равно 14, а не 25, как указано в разделе описаний, т. к. фраза мнабор символов** содержит I4 символов.
Если есть необходимость работать не со всей переменной целиком, а с каким- либо отдельным содержащимся в ней символом, то к этому символу можно обратиться в программе непосредственно, указав имя содержащей его строковой переменной и его порядковый номер в этой переменной, заключенный в квадратные скобки. Например, если мы напишем в основной части программы (а не в разделе описаний) strcka[5], то работать мы будем с буквой ”р”, которая является пятым по счету символом в данной переменной.
При обращении к элементу строковой переменной в скобках после ее имени может указываться не только числовая константа, но и имя переменной целого типа. В этом случае номер "вызываемого11 символа будет равен значению данной целочисленной переменной. Например, если мы присвоим целочисленной переменной i значение 10, а затем укажем в программе stroka[ij, то в результате будет 'вызвана1* буква мв", которая является в строковой переменной десятой по счету.
В качестве еще одного примера использования строковых переменных рассмотрим программу, которая для введенной с клавиатуры строки символов выводит на экран компьютера последовательность соотвегствующих им числовых кодов таблицы ASCII. В листинге 6.4 приведен текст данной программы, которую мы далее будем разбирать.
Листинг 6.4. Программа, определяющая, какими числами кодируется введенная пользо^ателдц с^грокаг
,、.“.. ;£»*»&**W3“z«*An.・“ttw«・j・;d—■,;ha^..':/i“.》aJ^;A.a”43・・》.・,—;t・,》5, «*м^*M.rW.・..— ._ ■4*мма.М>аЛ1^»<й**«Д2ё*Хмммм«аи.1.““^Хм«шмм«««»мм««“》|
program naborkod;
Uses Crt;
var i,dl,n:integer;
si:string[50];
begin
Clrscr;
writein 《'Введите строку1);
readln(si);
writein(•Данная строка кодируется следующими числами:•);
dl:=length(sl);
for i:=l to dl do
begin
n:=ord(si[i]);
write(nr1 ■)
end;
readln
end.
В начале данной программы пользователю предлагается ввести некоторую строку символов, длина которой не должна превышать 50. Эта строка сим во-
лов, введенная с помощью оператора readin, присваивается строковой переменной si. Далее с помощью известной нам функции length определяется фактическая длина введенной строки. Полученное числовое значение присваивается целочисленной переменной dl.
Вывод числовых кодов, содержащихся в строке символов, мы производим с помощью цикла с заданным числом повторений. Начальным значением переменной цикла i является единица, а конечным значением переменной цикла является значение переменной dl. Таким образом, в ходе работы цикла будут выведены значения десятичных кодов для всех содержащихся в строке символов, начиная с первого и заканчивая последним, порядковый номер которого равен значению переменной dl.
Рис. 6.5. Программа определения числовых кодов для вводимой строки символов (а) и результат ее работы (б)
В теле цикла, производящего вывод десятичных значений, содержатся следующие операторы. Это, во-первых, оператор присваивания. В этом операторе целочисленной переменной п присваивается значение, которое равно числовому коду текущего символа, т. е. символа, который имеет в строке порядковый номер, равный текущему значению переменной цикла i. Числовой код определяется посредством известной нам стандартной функции ord, аргументом которой является текущий символ. Второй оператор тела цикла осуществляет вывод полученного числового кода на экран компьютера. Коды выводятся в одну строку. Для того чтобы выводимые коды не сливались друг с другом, в операторе вывода предусмотрено, чтобы после каждого выводимого числа ставился пробел. По завершении работы цикла завершается и работа всей программы.
Если в ответ на приглашение программы мы введем фразу "Мой компьютер*', то получим следующий результат, изображенный на рис. 6.5. На экран будут выведены числовые коды всех 13 символов, входящих в данную фразу, включая пробел, который является четвертым по порядку символом и имеет код 32.
Задания для самостоятельной работы
Задание 1. Составить программу, которая проверяет, является ли введенная с клавиатуры последовательность символов целым числом, записанным в двоичной системе счисления, если известно, что в данной системе счисления для записи числа используются только две цифры — нуль и единица.
Задание 2. Составить программу, которая подсчитывает число слов во введенной в компьютер с клавиатуры строке. Условимся считать словом любую последовательность символов, которая отделена от других таких же последовательностей пробелом. Например, в предложении "персональный компьютер фирмы Apple" имеются 4 слова, отделенные друг от друга 3 пробелами. Из приведенного примера видно, что количество слов в строке можно определить как сумму имеющихся в строке пробелов плюс единица.
Задание 3. Изменить предыдущую программу таким образом, чтобы она подсчитывала среднюю длину слова во введенной с клавиатуры строке.
Задание 4. Составить программу, которая зашифровывает введенный с клавиатуры в компьютер текст. Процесс шифровки производится следующим образом: из десятичного кода каждого введенного с клавиатуры символа вычитается какое-либо число (например, 10). Получившаяся в результате вычитания величина интерпретируется как десятичный код некоторого другого символа, который и выводится на экран компьютера. Таким образом, получается внешне бессмысленный набор символов, который можно расшифровать, только зная упомянутый ранее принцип шифрования исходного сообщения.
ГЛАВА 7
Массивы в Паскале
Массив представляет собой упорядоченную последовательность однородных элементов. Элементами массива могут быть различные величины, как числовые (целые и вещественные), так и символьные или строковые. Но при этом строго должно соблюдаться следующее правило: все элементы каждого отдельно взятого массива должны относиться к одному и тому же типу, что и называется однородностью массива. В массиве каждый элемент имеет свой порядковый номер, который называется индексом. Массивы бывают одномерные и двумерные. Начнем изучение массивов с более простого одномерного массива.
Одномерные массивы
Примером простейшего одномерного массива является список учеников одного школьного класса или студентов одной группы. В этом случае элементами массива будут фамилии учеников или студентов, а индексами — номера учеников или студентов в списке. Важной характеристикой массива является его диапазон т. е. пределы, в которых может изменяться значение индекса массива.
В случае использования массива в программе, он предварительно должен быть описан в разделе описания переменных. Но описывается массив иначе, чем обычная переменная. В общем виде описание массива, состоящего из элементов-переменных, выглядит следующим образом:
var имя_массива: array(a. .b] of тип_элементов;
где var, array и of — служебные слова. Array означает "массив”, предлог of в данном случае "из", а и ь ——соответственно нижняя и верхняя границы диапазона массива.
Приведем примеры описания массивов.
var a: array[1..20] of integer;
Это описание массива с именем а, который может содержать до 20 элементов, причем все эти элементы целого типа.
var st: arrayfl..10J of string(15);
В данном случае описан массив с именем st из 10 строковых элементов, каждый из которых может содержать до 15 символов.
В программе можно работать не только со всем массивом целиком, но и с отдельными его элементами. Для того чтобы обратиться в программе к какому-либо элементу массива, нужно указать имя массива и индекс содержащегося в нем элемента. Например, если вы встретите в программе следующую запись: а [10], то она означает, что мы обращаемся к элементу массива а с порядковым номером ю.
Рассмотрим программу определения максимальной и минимальной температуры за месяц. В листинге 7,1 приведем текст данной программы и разберем ее.
? Листинг 7.1. Программа определения максимальной и минимальной ;температуры месяца°'
program month; Uses Crt; var m:array(1..31] of real; i,v:integer; min,max,x:real; begin ClrScr; writein (• Введите количество дней в месяце*); readln(v); writein(* Введите температуру за 1 день•); readln(m[l]);.
minr^ll); max:=m[l]; for i:=2 to v do begin wri teln(* Введите температуру за ',i,' день *); readln(x); m[i]:=x; if m[ij<min then min:=m[i]; if m[i]>max then max:=m[i] end;
writein('Максимальная температура месяца равна *,max:7:2); writein(1Минимальная температура месяца равна •,min:7:2); readln
end.
Данные о температуре за каждый день в программе вводятся с клавиатуры и хранятся в массиве. Нижней границей диапазона массива будет 1, а верхней 31 (максимальное число дней, которое может быть в месяце). Число дней, которое фактически содержится в том месяце, данные по которому обрабатываются программой, вводится с клавиатуры и содержится в переменной v. Заполнение массива будет производиться в цикле с заданным числом повторений. Счетчик цикла i будет меняться от 2 до v, т. к. первый элемент массива заполняется не в цикле. (Почему так делается, будет объяснено далее.) В ходе работы цикла очередному элементу массива присваивается соответствующее значение, равное температуре за i-й день месяца.
Если количество дней в месяце меньше, чем 31, то массив будет заполнен не до конца. Это вполне допустимо н никак не повлияет на работоспособность программы.
Дин того чтобы определить максимальный и минимальный элементы массива (и соответственно температуры месяца), используем следующий прием. Введем две вспомогательные переменные min и max. До начала работы цикла присвоим каждой из этих переменных значение, равное первому элементу массива (температура за первый день месяца). Затем каждый вновь вводимый (в цикле) элемент массива будем сравнивать с этими двумя переменными. Если значение элемента меньше, чем min, то вспомогательной переменной присваивается новое (минимальное на текущем этапе) значение, равное этому элементу. Если же значение элемента больше или равно min, то переменная остается без изменения. Для этого используется сокращенный условный оператор. Аналогично производится работа с вспомогательной переменной шах. В итоге после завершения работы цикла переменные min и max действительно будут содержать соответственно минимальное и максимальное значения температур, которые останется только вывести на печать оператором writein.
Отметим еще две особенности массивов. Во-первых^ элементами массива могут быть не только переменные, но и константы. Подобный массив, естественно, описывается в разделе объявлений как константа, причем константы описываются перед переменными. В этом же разделе такому массиву присваиваются значения. Во-вторых, нижней границей диапазона массива необязательно должна быть единица. Важно только, чтобы значение нижней границы было меньше, чем верхней.
Работу с массивом, состоящим из констант, хорошо иллюстрирует программа, которая по введенному пользователем номеру года по европейскому летоисчислению определяет его название по традиционному восточному календарю. В восточном календаре, как известно, каждый год называется по имени какого-либо животного, причем эти годы образуют 12-летний цикл, по истечении которого названия годов цикла снова повторяются. Первым годом
ааРис. 7.1. Программа определения максимальной и минимальной температур за месяц (а) и результат ее работы (б)Рис. 7.1. Программа определения максимальной и минимальной температур за месяц (а) и результат ее работы (б)
а
а
Рис. 7.1. Программа определения максимальной и минимальной температур за месяц (а) и результат ее работы (б)
Рис. 7.1. Программа определения максимальной и минимальной температур за месяц (а) и результат ее работы (б)
восточного цикла считается год мыши. Нам предстоит составить программу, которая решает задачу для второй половины XX века и первой половины XXI века по европейскому летоисчислению. Известно, что начало очередного года мыши приходилось на 1948 год. Для решения данной задачи создадим в программе массив из строковых элементов. Элементами массива являются строковые константы, каждая из которых содержит название одного из годов 12-летнего восточного цикла. Нижней границей диапазона индекса данного массива является единица. Верхней границей 12 номер последнего года цик-
ла. Пользователь может ввести год, начиная с 1948 н заканчивая 2055 (последний год очередного цикла), м в ответ будет выведен строковый элемент массива с соответствующим индексом, т. е. название года.
Так как пользователь может ошибиться при вводе исходных данных, то в программе предусмотрена их проверка, которая производится с помощью условного оператора if. При этом проверяются сразу два условия. Вводимое число не должно быть меньше минимального или больше максимального. Для того чтобы оба условия проверялись параллельно, они объединены служебным словом or, что означает "нлн"・ Если нарушена или верхняя, или нижняя граница диапазона, пользователю сообщается о допущенной им при вводе ошибке.
Затем в программе определяется номер года в 12-летнем цикле, обозначенный переменной к. Для определения величины к воспользуемся следующим приемом. Из введенного пользователем номера года у вычтем число 1947 (число лет, прошедшее с начала нашей эры по европейскому летоисчислению до начала очередного цикла восточного календаря). Полученная разность представляет собой количество лет, которое прошло с начала очередного цикла. Затем найдем остаток от деления полученной разности на 12. Это и будет номер года в цикле. Далее останется вывести на экран компьютера элемент массива с номером, равным значению переменной к. Таким образом, мы получим искомое название года по восточному календарю. В листинге 7.2 приводим текст данной программы.
;Листинг^2^ Определение названия года по 日бётоу рму 戰瞥処且呻j
program kalend;
Uses Crt;
const vost:array [1. .12] of string = ('мыши「коровы1,‘тигра「кролика',
readln; end.
У Tuibo Pascal““de I on (t 19“V no ?l)b%)2UU2?ПП2году no pfipnnrMcr.oriy пстонсчисnriiiF) гоотвстстоуг гI UH HU1J.JMK ПО t*UC TO 4H<H1V Р.4ИГКЯ<)|»MУ Tuibo Pascal““de I on (t 19“V no ?l)b%)2UU2?ПП2году no pfipnnrMcr.oriy пстонсчисnriiiF) гоотвстстоуг гI UH HU1J.JMK ПО t*UC TO 4H<H1V Р.4ИГКЯ<)|»MЕРШЕРШ
У Tuibo Pascal
““de I on (t 19“V no ?l)b%)
2UU2
?ПП2году no pfipnnrMcr.oriy пстонсчисnriiiF) гоотвстстоуг г
I UH HU1J.JMK ПО t*UC TO 4H<H1V Р.4ИГКЯ<)|»M
У Tuibo Pascal
““de I on (t 19“V no ?l)b%)
2UU2
?ПП2году no pfipnnrMcr.oriy пстонсчисnriiiF) гоотвстстоуг г
I UH HU1J.JMK ПО t*UC TO 4H<H1V Р.4ИГКЯ<)|»M
ЕРШ
ЕРШ
Рис. 7.2. Программа, определяющая название года по восточному календарю (а),и результат ее работы (б)
Двумерные массивы
Пpocтeйши^f примером двумерного ^faccивa является всем известная таблица умножения, в которой результат умножения двух чисел определяется по номеру строки, соответствующей одному из сомножителей, и номеру столбца, соответствующему другому. Соответственно и в любом двумерном массиве элемент определяется по двум индексам.
В языке Паскаль в общем виде двумерные массивы описываются следующим образом:
var ммя』ассива: array [а. • b, с.. d] of тип_элементов;
Еде а и ь— соответственно верхняя и нижняя граница диапазона значений для первого индекса; с и d— верхняя н нижняя граница диапазона значений для второго индекса.
Двумерный массив таким образом можно представить в виде таблицы, имеющей ь-а+1 строк и с-d+i столбцов.
Пример описания двумерного массива:
var tabi: array [1..9.1..9] of integer;
таким образом описан целочисленный массив, содержащий 9 строк и 9 столбцов.
Рассмотрим основные приемы работы с двумерными массивами на примере программы arrsum, составленной для решения следующей задачи: дан двумерный массив размерностью 4x5. Элементами данного массива являются вещественные числа. Требуется: заполнить массив произвольными числами, затем вывести содержимое массива на экран компьютера, подсчитать сумму элементов для каждого столбца, имеющегося в массиве, и сформировать из этих сумм одномерный массив. В листинге 73 приводится текст программы.
■ Листинг 7.3. Программа, заполняющая двумерный массив
! произвольными числами и подсчитывающая сумму элементов для каждого столбца.
program arrsum;
Uses Crt;
var
f:array[1..4,1..5] of real; x:array[1..5] of real; i,j:integer; s:real; begin
Clrscr;
for i:=l to 4 do
for j:=l to 5 do
begin
writeln('Введите ',j, ' элемент ',i J строки*); readln(f[i, j])
end;
writeIn('элементы двумерного массива');
for il to 4 do
begin
for jxl to 5 do write (f (ir j] :7:2r 1 *);
writein
end;
writein(* элементы одномерного массива');
for j:= 1 to 5 do
begin
s:=0;
for i:=1 to 4 do
s:=s+f[i,jJ;
x[j]:=s;
write(x[j]:7:2f1 1)
end;
readln
end.
В программе arrsum в разделе описания переменных описываются два массива. Первый из них ——это двумерный массив f, который в дальнейшем будет заполнен числами вещественного типа. В данном массиве, как видно из описания, имеется 4 строки и 5 столбцов. Второй описанный в разделе массив х является одномерным и в дальнейшем будет заполнен элементами, каждый из которых представляет собой сумму элементов, содержащихся в одном из столбцов двумерного массива. Всего в одномерном массиве х должно быть 5 элементов ——по количеству столбцов в двумерном массиве f.
В начале программы производится заполнение массива f произвольными вещественными числами, вводимыми с клавиатуры компьютера. Этот процесс осуществляется с помощью двух вложенных циклов. Во внутреннем цикле производится поэлементное заполнение одной из строк массива числами. Этот цикл повторяется 5 раз в соответствии с количеством элементов в каждой строке (количество элементов двумерного массива, содержащихся в одной строке, равно количеству столбцов, имеющихся в данном массиве). Соответственно и счетчик данного цикла ——переменная j — изменяет свое значение от I до 5. Перед непосредственным вводом очередного элемента, производимым оператором read in, оператор writein выводит приглашение на ввод данного элемента, указывающее номер текущей строки и порядковый номер элемента в строке. Внешний цикл с переменной i обеспечивает повторение всех действий внутреннего цикла 4 раза (по количеству строк, имеющихся в массиве).
Чтобы наглядно убедиться в том, что двумерный массив f целиком заполнен данными, производим построчный вывод содержимого массива на экран компьютера. Эта операция, как и предыдущая, осуществляется с помощью двух циклов, один из которых вложен в другой. Внутренний цикл с переменной j обеспечивает вывод элементов одной строки. При этом, для того чтобы значения элементов массива представлялись на экране в удобном для воспри-
ятия человеком виде (а не в нормализованном), элементы выводятся в отформатированном виде. Под каждый элемент отводится по 7 позиций, в том числе 4 под целую часть, I ——под точку и 2 — под дробную часть. Внешний цикл с переменной i, как и в предыдущем случае, обеспечивает четырехкратное повторение действий внутреннего цикла.
Третья группа из двух вложенных циклов используется для подсчета сумм элементов нового одномерного массива и его формирования. Внешний цикл в данном случае повторяет всю совокупность действий, производимых во внутреннем цикле, 5 раз — ло числу элементов формируемого цикла (и, соответственно, столбцов двумерного массива). Внутренний же цикл с переменной i подсчитывает сумму элементов, содержащихся в одном из столбцов. Эта сумма подсчитывается посредством вспомогательной переменной s. Перед началом работы внутреннего цикла эта переменная обнуляется с помощью оператора присваивания ——первого оператора внешнего цикла, а затем во внутреннем цикле к ее текущему значению каждый раз прибавляется значение очередного элемента из обрабатываемого столбца. В итоге работы внутреннего цикла в переменной s мы и получаем искомую сумму. Далее следующий оператор внешнего цикла присваивает получившееся значение соответствующему элементу одномерного массива. Наконец, последний из операторов внешнего цикла выводит значение данного элемента одномерного массива на экран. Таким образом, после завершения работы этого внешнего цикла массив будет заполнен данными, и поставленная задача будет решена.
На рис. 7.3 приведены результаты работы описанной программы.
Рис. 7.3. Результат работы программы, заполняющей двумерный масхив произвольными элементами и формирующей на его основе одномерный массив
Сортировка массивов
Одной из наиболее распространенных задач, с которыми приходится сталкиваться при обработке массивов, является сортировка массивов, т. е. расположение элементов массивов определенным упорядоченным образом. Можно встретить несколько способов сортировки массивов.
口 Сортировка по возрастанию. В этом случае элементы массива располагаются таким образом, что в его начале располагается наименьший элемент, затем следующий по величине элемент и т. д. вплоть до наибольшего, т. е. каждый следующий элемент должен быть больше предыдущего.
口 Сортировка по убыванию. В данном случае после проведения сортировки в начале массива оказывается наибольший по величине элемент, затем идет следующий по величине и т. д. вплоть до наименьшего, т. е. каждый следующий элемент должен быть меньше предыдущего.
П Сортировка 〃。неубыванию. В массиве, отсортированном таким образом, каждый последующий элемент должен быть больше или равен предыдущему.
□ Сортировка по невозрастанию. В отсортироваином по невозрастанию массиве каждый последующий элемент должен быть меньше или равен предыдущему.
Существует несколько различных способов сортировки массивов, мы разберем два самых простых. Начнем со способа, который называется сортировка методом простого выбора. Если нужно упорядочить массив по возрастанию, то суть этого способа сводится к следующему: в массиве нужно найти максимальный по величине элемент и поставить его на последнее место в массиве. В результате максимальный элемент массива займет подобающее ему место. Тот элемент, который ранее находился в массиве на последнем месте, необходимо переместить на то место, которое ранее занимал в массиве максимальный элемент.
Далее работаем с группой элементов, которая начинается с первого элемента массива, а заканчивается предпоследним элементом. В этой группе также следует найти максимальный элемент и затем поставить его на последнее место в данной группе элементов, т. е. на предпоследнее место во всем массиве. Элемент, стоявший предпоследним, также помещается в массиве на освободившееся место. Затем рассматривается группа элементов без последнего и предпоследнего. В этой группе также находится максимальный элемент, который помещается на положенное ему последнее в группе место. Такие операции будут продолжаться до тех пор, пока каждый элемент массива не займет подобающее ему место. Последняя операция сведется к выбору максимального в группе из двух оставшихся элементов.
Описанный метод реализован в программе, текст которой приведен в листинге 7.4.
j Листинг 7.4. Сортировка массива методом простого выбора
program vybsort;
Uses Crt;
var
m:array[l..10] of integer; i,k,max,n:integer;
begin
ClrScr;
for i:=l to 10 do
begin
writein (• Введите ' ■ i, ' элемент массива *);
readln (m[i])
end;
for n:=10 downto 2 do
begin
max:=m(l];
k:=l;
for i:=2 to n do
begin
if m(i]>max then begin max:f [i];
k:=i
end;
end;
m[k] :==m(n];
m[n]:=max;
end;
writein;
for i:=l to 10 do write(m[ij f * 1);
readln
end.
Основная часть данной программы начинается с заполнения одномерного массива ш, состоящего из десяти элементов целого типа. Заполнение массива производится в цикле с заранее заданным числом повторений. В теле данного цикла содержится два оператора. Оператор вывода, содержащий приглашение на ввод очередного элемента массива и указывающий его номер, и оператор ввода, заполняющий данный массив.
После заполнения массива начинается собственно процесс его сортировки. Данный процесс является однотипным, но при этом он производится в соот-
везствии с приведенным ранее алгоритмом сначала для группы из десяти элементов» затем для девяти (без последнего элемента), потом для группы из восьми элементов и далее по убывающей. Поэтому процесс сортировки будет осуществляться в цикле с заранее заданным числом повторений и с убывающим значением переменной цикла п. Начальное значение данной переменной будет равно 10, а конечное — 2, т. к. на последнем этапе сортировки мы будем иметь дело с группой, состоящей только из двух элементов.
В самом теле цикла мы будем производить следующие действия. В начале вспомогательной переменной шах, которая должна содержать значение максимального элемента в рассматриваемой группе, мы присваиваем значение первого по счету элемента массива. Одновременно мы присваиваем начальное значение и другой вспомогательной переменной к. Эта переменная должна содержать индекс максимального по значению элемента в рассматриваемой группе. Так как в начале поиска максимума мы условно считаем максимальным первый элемент, то переменной к мы присваиваем значение I.
Далее для нахождения действительно максимального элемента в группе мы используем внутренний цикл, вложенный во внешний цикл с переменной п. Переменной внутреннего цикла будет переменная i, показывающая текущее значение индекса элемента. В процессе поиска максимального элемента значение этой переменной будет изменяться от 2 до п — индекса последнего по счету элемента в группе. Для каждого элемента группы, начиная со второго, мы сравниваем его значение с максимальным. Если значение данного элемента окажется больше значения переменной max, то переменной шах присваивается новое значение, которое равно значению данного элемента массива m(i], а переменной к также присваивается новое значение, которое равно i-индексу данного элемента. В итоге, по окончании работы внутреннего цикла после перебора всех элементов группы переменная шах будет содержать значение действительно максимального элемента группы, а переменная к — индекс этого элемента.
Теперь осталось в соответствии с алгоритмом поставить максимальный элемент на последнее место в группе, а последний элемент на то место, которое ранее занимал максимальный. Для этого мы элементу с номером к присваиваем значение последнего элемента массива m[n], а последнему элементу —— найденное максимальное значение. Таким образом, в результате работы двух вложенных циклов мы получим исходный массив уже в упорядоченном виде. Последний имеющийся в программе цикл с переменной i выводит на экран компьютера в одну строку элементы упорядоченного массива пи Результаты работы дайной программы приведены на рис. 7.4.
Еще одним распространенным способом сортировки массива является сортировка методом простого обмена. Суть этого метода (здесь мы также рас-
сматриваем вариант с сортировкой элементов по возрастанию) сводится к следующему: на начальном этапе берется группа, включающая в себя все элементы массива. В этой группе производится попарное сравнение всех соседних элементов массива, т. е. сравниваются первый и второй элементы массива, второй и третий, третий и четвертый ит. д. В том случае, если оказывается, что в паре первый элемент по величине больше, чем второй, то данные элементы меняются местами для того, чтобы максимальный из двух элементов находился в конце пары. Таким образом, в результате попарных сравнений и перемещений наибольший элемент массива постепенно смещается в его конец.
Рис. 7.4. Результат работы программы сортировки массива методом простого выбора
На следующем этапе обработки массива с помощью данного метода берется группа, включающая все элементы массива за исключением последнего. При обработке этой группы описанным ранее методом максимальный из оставшихся элементов также перемещается в конец группы. Далее берется следующая группа элементов (без последнего и предпоследнего) и в ней смещается в конец последний элемент, и так продолжается до тех пор, пока не останется последняя группа из двух элементов, которая также упорядочивается указанным образом.
I Листинг 7.5. Сортировка массива методом обмена
program obmsort;
Uses Crt;
var m:array[1.■10] of integer;
irnft:integer;
begin
ClrScr;
for i:=l to 10 do begin
writein(1 Введите *, i, * элемент массива*); readln(m[i]);
end;
for n:^10 downto 2 do if m[i]<m[i-l] then begin
t:=m[i];
m[i]:=m[i-l];
m[i-l]:=t end;
writein;
writein(*Массив в отсортированном виде:1);
for i:el to 10 do
write (m[i], • •);
readln
end.
Рис. 7.5. Результат работы программы сортировки массива методом простого обмена
Разберем текст программы сортировки методом обмена, приведенный в листинге 7.5. Как и предыдущая, данная программа начинается с заполнения одномерного массива, содержащего 10 элементов целого типа. Заполнение производится в цикле с переменной i. Далее вновь используем структуру, кото-
рая представляет собой два вложенных цикла. Переменной внешнего цикла является п—— количество элементов в группе, которое последовательно уменьшается с 10 (в начале работы внешнего цикла) до 2 (в конце его работы). Подобное уменьшение имеет место за счет того, что на каждом последующем этапе сортировки сокращается группа элементов, в которой производится сравнение элементов.
Во внутреннем цикле производится попарное сравнение всех элементов очередной группы. Переменной внутреннего цикла является i ——индекс текущего элемента группы. Начальное значение переменной внутреннего цикла принимаем равным 2. Второй по счету элемент группы мы сравниваем с предыдущим, т. е. с первым. Аналогичным образом каждый последующий i-й элемент мы сравниваем с предыдущим элементом с индексом, равным i-1. В случае если оказывается, что текущий элемент меньше предыдущего, производим обмен значений между этими двумя соседними элементами. Операторы, осуществляющие эту замену, расположены в сокращенном условном операторе после слова then. Обмен значениями производится с помощью вспомогательной переменной с. Для этого t первоначально присваивается значение второго элемента из пары. Затем второму элементу присваивается значение первого. Наконец, первому элементу присваивается старое значение второго, которое было сохранено во вспомогательной переменной t. В конце программы с помощью оператора цикла выводятся значения элементов массива уже в отсортированном виде. Результаты работы программы сортировки методом обмена приведены на рис. 7.5.
Приведенные ранее алгоритмы сортировки массивов можно применять не только для сортировки по возрастанию, но и по убыванию. Отличие состоит в том, что для первого способа производится поиск и помещение на последнее место в группе не максимального, а минимального элемента. Для второго же способа отличие заключается в том, что при сравнении двух соседних элементов обмен их значениями производится в том случае, если в сравниваемой паре первый элемент меньше второго.
Задания для самостоятельной работы
Задание 1. Составить программу, заполняющую массив, состоящий из п элементов (где п не больше 20), введенными с клавиатуры целыми числами. В этом массиве требуется определить число содержащихся в нем положительных элементов.
Задание 2. Составить программу, заполняющую массив из п элементов случайными целыми числами, находящимися в интервале от I до 50. Вывести на экран компьютера созданный массив и найти количество тех элементов, зна-
чения которых находятся в диапазоне от а до ь. Число элементов массива и значения а и ь вводятся с клавиатуры.
Задание 3. Составить программу, заполняющую массив, состоящий из п элементов (где п не больше 20), введенными с клавиатуры целыми числами. Требуется вывести массив на экран компьютера и найти индекс последнего по счету в массиве отрицательного элемента.
Задание 4- Составить программу, которая определяет, какие символы встречаются во вводимой с клавиатуры текстовой строке, а также определяет, сколько раз встречается во введенном тексте тот или иной символ. Признаком окончания ввода текстовой строки является ввод нуля, который сам в числе символов не учитывается. При этом в статистику символов должны быть включены наряду с буквами, цифрами и знаками препинания также и пробелы.
ГЛАВА 8
Подпрограммы в Паскале
При разработке ряда сложных программ достаточно часто приходится сталкиваться с ситуацией, когда в различных частях программы выполняется одна и та же последовательность действий. В этом случае гораздо рациональней бывает оформить эту последовательность в виде отдельной части программы, которая называется подпрограммой, а затем обращаться к ней из основной настн программы по мере необходимости.
Кроме того, сам процесс программирования значительно облегчается, если разбить одну сложную задачу на ряд более простых, а затем уже объединить эти части между собой. Данный метод разработки программ также требует использования подпрограмм, которые подразделяются на подпрограммы- функции и подпрограммы-процедуры.
Подпрограмма-функция
Такие операции, как возведение числа в квадрат, извлечение квадратного корня, определение модуля (абсолютной величины) чнсла, вычисление тригонометрических функций, округление дробного числа до ближайшего целого, определение длины строковой переменной и многие другие, используются при решении самых разнообразных задач из области программирования.
Для того чтобы облегчить процесс составления программ в языке Паскаль, предусмотрены специальные функции, которые применяются для автоматического выполнения этих действий. Такие функции называются стандартными и являются неотъемлемой частью языка Паскаль.
Каждая из этих функций по вводимым в нее исходным данным определяет некоторый результат, который далее используется в программе. Исходные данные называются аргументом функции, а вычисленный результат—— ее значением. При обращении к функции аргумент указывается в скобках.
6 Зак Ю6Я
К широко употребляемым стандартным функциям (кроме уже известных нам функций length, crd и char, используемых для работы со строковыми переменными) относятся также следующие:
口 abs(x)— определяет абсолютное значение аргумента, которым может быть число или выражение целого или вещественного типа;
arctan (х) — вычисляет арктангенс угла, значение которого выражено в радианах;
сору(х,п,1) — выделяет в строковой переменной х группу символов, начиная с позиции с номером п. Длина группы равна 1. Параметры п и 1 должны быть величинами целого типа;
cos(x) — вычисляет косинус угла, значение которого выражено в радианах;
delete(xznzl)— удаляет из строковой переменной х группу символов, начиная с позиции с номером п. Количество символов равно 1;
ехр (х)——вычисляет экспоненту аргумента, т. е. е в степени х;
П int (х) — определяет целую часть аргумента. Значением функции является величина вещественного типа;
口 1п(х)——вычисляет натуральный логарифм аргумента (т. е. логарифм по основанию е);
pi — данная функция не имеет параметров, а значением ее является число Пи;
口 round(X}——округляет значение аргумента до ближайшего целого числа;
sin(x)— вычисляет синус угла, значение которого выражено в радианах;
sqr(x)— вычисляет квадрат аргумента, которым может быть число или выражение целого или вещественного типа;
sqrt(x)— вычисляет квадратный корень из аргумента:
trunc(x)-— определяет целую часть аргумента. Значением функции является величина целого типа.
В качестве примера программы с использованием стандартных функций рассмотрим программу решения квадратичного уравнения ох' + Ах + с = 0.
j Листинг 8.1. Программа решения квадратного уравнения ;с использованием стандартных функций
program qwur;
Uses Crt;
var a,b,c,d,xl,x2:real;
begin
Clrscr;
writein(1Введите коэффициенты уравнения - a,bzc*); readIn(a);
readln(b); readln(c); d:=sqr(b)-4 *a*c;
if d<0 then writein(* корней нет*) else
begin
xl :=(~b+sqrt (d)) / (2*a);
x2: = (-b-sqrt (ci)) / (2*a);
writeln('Корни квадратного уравнения *);
writein(xl:6:2,• '■ x2:6:2) end;
readln end.
В данной задаче в начале с помощью стандартной функции sqr вычисляется дискриминант уравнения. В зависимости от значения дискриминанта выясняется, имеет ли данное уравнение решение. Если решения нет, то соответствующее сообщение выводится на экран компьютера. В случае же, если решение имеется, оно определяется с помощью стандартной функции sqrt.
При значениях коэффициентов уравнения 2, 7 и 3 получаем решение, изображенное на рис. 8.1.
Набор стандартных функций языка Паскаль достаточно обширен (он не ограничивается приведенным ранее списком), однако в ряде случаев программисту может потребоваться для решения поставленной задачи создать свою собственную функцию. Такая функция должна быть описана в тексте программы после раздела описания констант и переменных и до начала ее основной части (т. е. до слова begin). Подобную функцию часто называют функцией-подпрограммой^ т. к. она представляет собой отдельный блок внутри основной программы, который по своей структуре напоминает основную программу. Структура описания создаваемой программистом функции выглядит следующим образом: затттовок функции;
раздел описания констант и переменные, используемые: внутри функц^пп;
begin
операторы функции end;
Теперь разберем более подробно элементы этой структуры.
Рис. 8.1. Программа решения квадратичного уравнения (а) и результат ее работы (б)
Общий вид заголовка функции следующий:
function имя_функции (параметры функции) : тип функции;
где function — служебное слово, означающее "функиня". Имя функции дается по тем же правилам, что и имя переменной. В скобках указываются аргументы функции, называемые ее параметрами^ причем для каждого параметра обязательно должен быть указан его тип. Если параметры относятся к одному типу, то они перечисляются через запятую, а после двоеточия указывается их общий тип, если же параметры относятся к разным типам, то они отделяются друг от друга точкой с запятой. После скобок обязательно указывается тип значения самой функции.
Пример заголовка функции:
function beta (х,у:integer; z:real):real;
данная функция именуется beta, в ней используются 3 параметра: х и у —— целого типа, z — вещественного, а значение самой функции является вещественным.
Таким образом, заголовок функции в целом напоминает описание переменной, но следом за заголовком в описании функции указываются оператор или группа операторов, по которым вычисляется ее значение. Эти действия запн- сываются в виде составного оператора, который начинается со служебного слова begin и заканчивается словом end. В составном операторе могут использоваться свон, локальные переменные. Раздел описания этих переменных (для каждой из локальных переменных также должен быть указан ее тип) помещается между заголовком и составным оператором. Не забывайте о том, что в составном операторе обязательно должен быть оператор присваивания, который присваивает получившийся результат функции.
В основной части программы действия, указанные в разделе описания функции, выполняются тогда, когда необходимо найти ее значение. Для этого необходимо осуществить обращение к функции. Обращение к функции в основной части программы включает в себя имя функции и следующий за ним список параметров, заключенный в скобки. Параметры, указанные при обращении к функции, называются фактическими параметрами, а параметры указанные в описании функции — формальными. Фактические параметры должны быть того же типа, что и формальные.
Например, правая часть оператора присваивания
d:—beta(3,4f7.5)
представляет собой обращение к функции beta, а 3, 4 и 7.5 — фактические параметры данной функции в отличие от формальных параметров х, у и z. В качестве фактических параметров функции могут выступать и константы (как в приведенном ранее примере) и переменные. Обратите внимание, что все фактические параметры перечисляются через запятую, даже если они принадлежат к разным типам.
Для того чтобы на практике закрепить все изложенное ранее, рассмотрим программу, в которой описывается и применяется создаваемая пользователем функция. Это программа определения числа сочетаний из 〃 по т. Данное число определяется по следующей формуле:
〃!
,〃 !(〃_)〃)!
где 〃!,『〃! и (〃 一 "?)! 一 соответственно факториалы 〃, 〃? и (” 一 〃?). Факториалом числа л называется произведение всех натуральных чисел от 1 до w.
;Листинг 8.2. Программа, вычисляющая число сочетаний из n n。m
i... ..;.”.“•.“.“;….…Hi“l“..・・..№...—....宀..…...... — .....
program sochet;
Uses Crt;
var п,тп: integer;
a,brc,d:longint;
function faktor(k:integer):longint;
var i:integer; r:longint;
begin
r:-l;
for i:=1 to к do
r:=r*i;
faktor:=r;
end;
begin
Clrscr;
writeIn (* Введите 2 натуральных числа, для которых *);
writein (* определяется число возможных сочетаний1);
writein「S3 первого по второму *); readln (n,m); a:=faktor (n); b:=faktor (m); c:=faktor (n-m); d:=a div (b*c);
writein (* Число возможных сочетаний из \п,‘ по ',m, ' равно Id); readln;
end.
Разберем текст данной программы, приведенный в листинге 8.2. Так как в программе нам предстоит три раза вычислять факториал различных чисел, то в целях ее рационализации вычисление факториала оформим в виде отдельной функции faktor.
Для того чтобы было понятно, как работает данная функция, рассмотрим в начале алгоритм вычисления факториала. Проще всего начать вычисления с нахождения факториала единицы. Согласно определению факториала он будет равен произведению единицы на единицу, т. е. единице. Далее определяем факториал двух. Для этого факториал единицы умножаем на два и получаем два. Факториал трех находим путем умножения факториала двух, т. е. двойки, на число три и получаем шесть. Таким образом, алгоритм нахождения факториала некоторого числа сводится к тому, что мы последовательно умножаем каждое следующее число на факториал предыдущего. Понятно, что для многократного повторения аналогичных действий удобнее всего использовать циклическую структуру.
Следовательно, в функции вычисления факториала должны использоваться следующие переменные. Это переменная к, которой присваивается значение того натурального числа, факториал которого вычисляется. Далее будет использоваться переменная г, которой будет присвоено начальное значение, равное единице, а затем будут поочередно присваиваться значения факториалов всех чисел от единицы до к включительно. Наконец, мы используем переменную i — переменную цикла, в котором будет происходить это последовательное присваивание. Переменная к является параметром функции, а переменные г и i являются вспомогательными.
丑 Fuibo PascalЯИД
I噪产二业市良三才乏『誕Г編髙醤gЫШИГЕОПК^3? 幵『? program sochet;
Uses Crt;
var n,n: integer; d,b,c .tf: lon«<int ;
I funct ion f<)ktor(k: integer) : lonq int ; var i:integer; r:long int ;
[ begin
г : -1 ;
for I: 1 to к do
r:「r*l; fdktor:-r; end;
Clr\cr;
wr i (e In ('Виеми!? 2 натуральных viund. nnn ku■。卩зх');
wr 11 e In ( * опргмепяется чме но во)пи t.iiux < оче ганнй и j первог о по второпу'); r@udln(п,п);
•1 : f akl(»r( п); b: 1 dk tor(n) ; c: - f dktort n-m> ;
d: a div (b*c〉;
wr 11 r ln( *Число во 1Н0 4НЫХ сочетании и» ',“.' по '.m,' раз”。* ,<l); reo(l In ;
Рис. 8.2. Программа подсчета числа сочетаний из n по m (8) и результат ее работы (6)
Тело функции вычисления факториала состоит из следующих операторов. Это оператор присваивания, в котором вспомогательной переменной г присваивается начальное значение, равное 1. Далее в теле функции содержится оператор цикла с заданным числом повторений. При каждом очередном выполнении тела цикла переменная г получает новое значение, равное произведению предыдущего значения этой же переменной на текущее значение переменной цикла i (в ходе работы цикла i будет изменять значение от 1 до к). Тело функции завершается оператором присваивания, в котором функция faktor получает значение, равное конечному значению г. Так как факториалы
даже небольших натуральных чисел представляют собой достаточно большие величины (например, факториал числа Ю равен 3 628 800), то для описания значения функции используется тип longint.
В основной части программы осуществляется ввод исходных данных, затем производятся вычисления по формуле с использованием значений функции faktor. С помощью этой функции мы находим а — факториал числа п, ь — факториал числа га, и с— факториал разности этих чисел. Для вычисления этих величин в программе трижды производится обращение к функции faktor с различными фактическими параметрами. После нахождения а, ь и с мы вычисляем d— искомое число сочетаний. Полученный результат оператором writeln выводится на экран. На рис. 8.2 приведен результат работы программы при п, равном 5, и 叫 равном 3.
Подпрограмма-процедура
Процедуры по своему внешнему виду напоминают функции, но если при обращении к функции мы можем получить только один результат — значение данной функции, то процедура может вырабатывать на выходе несколько значений. Кроме того, процедуры используются в программах для выполнения ряда стандартных действий. Такие процедуры, подобно стандартным функциям, являются частью языка Паскаль. К стандартным процедурам относятся уже известные нам команды ClrScr, Textcolor и Тех七Background. Процедурами являются и операторы ввода и вывода read, readln, write и writeln. Наряду с этими стандартными процедурами в языке Паскаль широко используются также следующие:
Delay (i) — осуществляет задержку выполнения программы на i миллисекунд (тысячных долей секунды);
口 Exit — эта процедура не имеет параметров. Она осуществляет выход из процедуры или функции в основную часть программы (не путать с командой Exit меню системы программирования Turbo Pascal, которая закрывает систему программирования н производит выход в среду операционной системы);
口 GotoXY(а,ь)— переводит курсор в точку экрана с координатами а, ь;
Halt — эта процедура не имеет параметров. Она завершает выполнение программы и передает управление операционной системе;
str(xf з)——производит преобразование числовой величины х в строковую 3;
П vai(s,x,n) — производит преобразование строки s, изображающей число, в числовую величину х. В процедуре также должен присутствовать пара-
метр п, относящийся к целочисленному типу. Если преобразование было выполнено успешно, то значение п будет равно нулю. Если преобразование не может быть произведено, то в переменную п записывается номер символа, который явился причиной ошибки при преобразовании.
В качестве примера использования стандартных процедур Паскаля приведем программу пОбратный отсчет". Эта программа создает на экране компьютера Электронное табло", на котором в одном и том же месте последовательно выводятся числа от 10 до 1, т. е. производится обратный отсчет времени, как перед стартом космического корабля, а затем выводится слово "Старт".
I Листинг 8.3.. Программа "Обратйый отсчет** .= ^「蟹沁土 program obrcount; Uses Crt; var i:integer;
begin
ClrScr;
for i:=10 downto 1 do begin GotoXY(l,l); write (i);
Delay(20000);
ClrScr end; GotoXY(l,l); writeln(*Старт1); Delay(20000}; ClrScr; readln end.
Разберем программу, текст которой приведен в листинге 8.3 и рис. 8.3. В данной программе цифры выводятся с помощью цикла с уменьшающимся значением счетчика. В теле цикла используется ряд стандартных процедур. Так. перед выводом очередного числа курсор посредством стандартной процедуры GotoXY калсдый раз перемещается в левый верхний угол экрана для того, чтобы все числа выводились в одной и той же позиции. Далее, для того чтобы очередное число сразу не исчезало с экрана, а оставалось на некоторое время, используется процедура Delay. Затем экран очищается с помощью процедуры ClrScr, для того чтобы освободить место для вывода следующего числа. После завершения работы цикла с помощью тех же стандартных процедур на экран выводится слово “Старт".
丹 Tuibo PascalKBG丹 Tuibo PascalKBGUses Crt; var i:integer; begin
丹 Tuibo PascalKBG
丹 Tuibo PascalKBG
ClrScr; for i:=10 downto 1 do begin
GotoXY(1,1); writeC i);
Deldy(20OO0); ClrScr end;
GotoXV(1,1); writeln(*C rapi*); Deby(2DD00); ClrScr; readln
end.
T urbo PascalT urbo Pascalк •10:8
T urbo Pascal
T urbo Pascal
Рис. 8.3. Программа "Обратный отсчет" — исходный текст (а) и программа в действии (б)
Конечно, возможности языка Паскаль не ограничиваются применением только стандартных процедур. Программист, использующий этот язык, может создавать и свои собственные процедуры. Но для того чтобы такую процедуру можно было использовать в программе, ее, подобно вновь создаваемым функциям, следует предварительно описать. Описание процедуры, так же как и описание функции, должно содержаться в программе в разделе описаний после описания констант и переменных. Структура описания процедуры сходна со структурой основной программы, поэтому создаваемую программистом процедуру часто называют прог^едурой-подпрограммой. Описание включает в себя заголовок процедуры, раздел описаний и раздел операторов. К процедуре можно обращаться из основной части программы, из другой процедуры или из функции. Такое обращение называют также вызовом процедуры.
Общий вид описания процедуры следующий:
заголовок процедуры;
раздел Океании процедуры;
begin
раздел операторов процедуры end;
Теперь разберем более подробно составные части данного описания.
Общий вид заголовка процедуры следующий:
procedure имя_процедуры {параметры процедуры);
где procedure — служебное слово, имя процедуры дается по тем же правилам, что и имя переменной в Паскале, параметры перечисляются в скобках через запятую с указанием их типа. Эти параметры являются формальными. При вызове же процедуры в обращении к ней указываются ее фактические параметры. Тип каждого фактического параметра должен быть таким же, как тип соответствующего ему формального параметра. Количество формальных параметров, имеющихся в описании процедуры, и фактических параметров, используемых при обращении к ней, должно совпадать. При этом первому по счету формальному параметру в описании ставится в соответствие первый по счету фактический параметр в обращении, второму формальному — второй фактический н т. д.
Все формальные параметры делятся на два вида. Если перед именем параметра в заголовке процедуры стоит служебное слово var, то это — параметр- переменная. Если служебное слово var перед именем переменной в заголовке отсутствует, то данный параметр является параметром-значением. При обращении к процедуре формальному параметру-значению присваивается значение соответствующего ему фактического параметра, причем в качестве такого значения может выступать константа, переменная или выражение. Во время работы процедуры параметр-значение не может изменяться даже в том случае, если он является переменной. При обращении же к процедуре, в которой имеются формальные параметры-переменные, соответствующие им фактические параметры могут быть только переменными (не константами и не выражениями). Вызываемая процедура получает доступ к ячейкам памяти, в которых хранятся эти фактические параметры, н может изменять значения этих параметров в ходе своей работы.
Пример заголовка процедуры:
procedure vspomog(a,b:integer; var c,d:real);
где vspomog——имя процедуры, а, ь, c, d——имена формальных параметров, причем а и ь являются параметрами-значениями, а с и d— параметрами- переменными.
В разделе описаний процедуры константы и переменные описываются по тем же правилам, что и в основной программе. При этом следует иметь в виду, что эти переменные могут использоваться только внутри данной процедуры. Такие переменные называются локальными, В процедуре могут применяться и переменные, которые описаны в основной части программы. Такие переменные называются глобачьными.
Раздел операторов процедуры принципиально не отличается от такого же раздела в основной программе, он может содержать обращения к другим функциям н процедурам, но после служебного слова end ставится не точка, а точка с запятой, т. к. конец описания процедуры ——это не конец программы.
Рассмотрим программу определения максимального и минимального числа в группе из 4 чисел, текст которой приведен в листинге 8.4.
Листинг 8.4, Программа определения максимального и минимального из 4 чисел
program four;
Uses Crt;
var a,bf c, d, l,m,big, lit,mini,maxi,min2,rnax2: integer;
procedure minmax(xlfx2:integer; var min,max:integer); begin
if xl>x2
then
begin max:=xl;
min:=x2 end else
begin
max:=x2;
min:^xl end
end;
begin
ClrScr;
writein (* введите 1 число1);
readln(a};
writein (1 введите 2 число1);
readln(b);
writein (* введите 3 число *);
readln(с);
writein (1 введите 4 число*);
readln(d);
rainmax (a r b, mini, maxi);
minmax (с, d,rain2fniax2);
minmax (mini,min2, lit, 1);
minmax (maxI,niax2.m, big);
writein (* Максимальное число - ',big,'; минимальное число - • r lit);
readln
end.
Исходные значения введем с клавиатуры. Для определения максимального и минимального из них воспользуемся следующим алгоритмом. Напишем несложную процедуру minmax, которая определяет максимальное и минимальное из двух чисел. Затем разобьем введенные числа на пары н в каждой паре с помощью этой процедуры определим максимум и минимум. Далее с помощью той же процедуры minmax определим наибольший из двух максимумов и наименьший из двух минимумов. Это и будет искомый результат.
В заголовке процедуры minmax описаны 2 формальных параметра-значения х1 и к2, которые используются для ввода в процедуру исходных данных, и 2 па- раметра-переменные min н шах, используемые для вывода полученных результатов. Внугри процедуры параметры-значения сравниваются между собой и значение меньшего из них присваивается переменной min, а большего — переменной max.
В основной части программы обращение к процедуре minmax встречается 4 раза. В первых двух случаях в качестве фактических параметров выступают введенные с клавиатуры значения переменных а и ь при первом вызове процедуры и с и d — при втором. Результатами являются соответственно фактические параметры mini и maxi (минимум и максимум в первой паре чисел) и min2 и тах2 (минимум и максимум во второй паре).
При третьем обращении к процедуре в качестве исходных данных используются 2 найденных минимума, а результатом ее работы является минимальное из этих 2 значений, передаваемое в переменную lit. Вспомогательная переменная 1, в принципе, для решения данной задачи не нужна, но вводится, т. к. число фактических параметров в обращении должно соответствовать числу формальных параметров в описании. Аналогично при четвертом обращении к процедуре находится наибольший из двух максимумов big, а переменная m играет подобно переменной 1 только вспомогательную роль.
Искомые максимальное и минимальное значения выводятся на экран с помощью оператора writein.
На рис. 8.4 приводятся результаты работы данной программы при а равном 65, ь — 111, с — 678 и d — 215.
Ранее уже говорилось о том, что в процедуру могут передаваться не только значения переменных, но и числовые константы. Приведем пример програм-
Рис. 8.4. Результаты работы программы определения максимального и минимального из четырех чисел
мы, где реализована как раз такая возможность. Это программа, которая по введенному пользователем текущему числу и номеру месяца определяет дату следующего дня. Данная задача не представляет сложности (нужно только прибавить единицу к текущему числу), но лишь для всех чисел месяца кроме последнего. В этом случае следующий день будет первым числом следующего месяца, а если последний день месяца——31 декабря, то следующим днем будет первый день нового года. Необходимо также предусмотреть защиту от неверного ввода данных (чтобы пользователь случайно не ввел число, большее, чем количество дней в текущем месяце). В листинге 8.5 приводится текст программы, разработанной для решения данной задачи.
Листинг 8.5. Программа, которая определяет дату завтрашнего дня
program tomorrow;
Uses Crt;
label 100;
var
d,m:integer; otv:string[3];
procedure next(koi:integer;var mesrn:integer); begin
if n>kol then begin writein(* Вы ошиблись. Введите верное число1); Delay(60000);
Halt end;
if (n=31) and (пез=12) then begin n:=l; mes:=l;
exit end; if n=kol then begin n:=l; mes:=mes+l end else n:=n+l;
end;
begin
ClrScr;
writein(*Введите сегодняшнее число');
readln(d);
writein(1Введите номер текущего месяца*);
readln(m);
case in of
1,3.5,7,8,10.12:next(31rmr d);
6,9,11:next(30,m,d);
begin
00: write In (' Является ли текущий год високосным? (ДА/НЕТ) •); readln (otv);
if (otvo'W) and (otvo'HET') then begin
writein (1 Вы дали неверный ответ. Введите ДА или НЕТ *);
goto 100; end else
if otv=1 ДА * then next (29fm,d)
else next(28,m.d) end;
end;
writein('Завтра будет *,d,*.1,m);
readln end.
Разберем текст данной программы. Непосредственное определение числа и номера месяца следующего дня производится в процедуре next. В заголовке процедуры next описываются один параметр-значение koi— количество дней в текущем месяце, и два параметра-переменные ——mes и п. При обраще-
нии к процедуре next параметрам mes и п присваиваются значения соответственно 1'екущего месяца и номера текущего дня в месяце. На выходе процедуры зтн параметры должны получить значения, соответствующие завтрашнему месяцу и номеру дня. При этом возможны следующие варианты:
день не является последним днем месяца. В этом случае номер следующего дня (п) увеличивается на единицу. Номер месяца (mes) при этом остается без изменений;
день является последним днем месяца. В таком случае номер следующего дня становится рав^пям единице, а номер месяца увеличивается на единицу;
день является не только последним днем месяца, но и последним днем года. Тогда номер следующего дня становится равным единице. Первым становится и номер месяца, т. к. следующий день будет I января;
П при вводе данных была допущена ошибка (например, пользователь ввел номер дня в месяце, равный 32). В такой ситуации пользователю нужно сообщить о допущенной им ошибке, после чего программа в аварийном порядке должна прекратить работу.
Все эти варианты и рассмотрены в процедуре next. В начале работы данной процедуры с помощью сокращенного условного оператора if проверяется правильность введенных данных (т. е. не больше ли переданное в процедуру текущее число п, чем количество дней в текущем месяце). Если при вводе была допущена ошибка, то процедура выводит сообщение об этом и прекращает работу программы, используя стандартную процедуру Halt. Чтобы пользователь успел прочитать сообщение о допущенной им ошибке, сообщение задерживается на некоторое время на экране компьютера с помощью стандартной процедуры Delay.
Следующий сокращенный условный оператор проверяет, не является ли введенное число 31 декабря. В этом случае параметрам mes и п присваиваются значения 1 и 1, а затем работа процедуры next завершается с помощью стандартной процедуры exit, после чего происходит возвращение в основную программу.
Посредством последнего в данной процедуре оператора if определяется следующее число для любого из остальных дней года. Если число не является последним в данном месяце (nvkol), то значение параметра п увеличивается на единицу, a mes остается без изменений. В противном случае п присваивается значение 1 (следующее число ——начало нового месяца), а значение параметра mes увеличивается на единицу. На этом работа процедуры завершается, соответствующие формальным параметрам mes и п фактические параметры получают новые значения, которые передаются в основную программу.
Рис. 8.5. Результаты работы программы, определяющей дату завтрашнего дня. для последнего дня месяца (а), для обычного дня в середине месяца (6) и для 31 декабря (в)
Из всего сказанного понятно, что для правильной работы процедуры нужно передать в нее правильную величину параметра-значения, которая равна действительному количеству дней в текущем месяце. Это количество определяется в основной части программы. Так как количество дней в месяце зависит от номера текущего месяца т, то оно определяется с помощью условного one-
ратора case, в котором в роли переменной-селектора как раз и выступает т. Для т, равного 1, 3, 5, 7, 8, 10, 12 (т. е. для января, марта, мая. июля, августа, октября, декабря), данное значение равно 31. Для 叫 равного 4, 6, 9, 11 (т. е. для апреля, июня, сентября, ноября), значение будет равно 30.
Сложнее решается вопрос с февралем (т = 2), т. к. в этом случае значение, передаваемое в процедуру, зависит от того, является ли текущий год високосным или нет. В первом случае значение будет равно 29, во втором — 28. Необходимую информацию программа запрашивает у пользователя, который на вопрос о том, является ли текущий год високосным, должен дать положительный или отрицательный ответ. Для защиты от ошибочного ответа используется сокращенный условный оператор if. Если пользователь вместо "ДА" или "НЕТ" введет что-либо другое, программа выдаст сообщение об ошибке и с помощью оператора безусловного перехода вернет пользователя к тому месту программы, где вновь повторяется заданный вопрос.
При обращении из основной программы к процедуре next формальному параметру koi ставится в соответствие найденная с помощью оператора case величина, а формальным параметрам mes и п ставятся в соответствие фактические параметры mud, содержащие введенные с клавиатуры значения номера текущего дня и текущего месяца.
После обращения к процедуре и производимых процедурой расчетов полученные новые значения параметров-переменных возвращаются в основную программу. Затем на экран компьютера выводятся эти новые значения (завтрашнее число и соответствующий ему номер месяца), и программа завершает свою работу.
На рис. 8.5 приводятся результаты работы описанной программы для различных исходных данных (для обычного дня в середине месяца, для последнего дня месяца и для 31 декабря).
Рекурсия
В предыдущем разделе данного пособия мы уже рассматривали программу, в которой имеется процедура, содержащая обращения к другим процедурам. Обращения к другим функциям и процедурам (как стандартным, так и созданным программистом) могут содержать и функции. При этом возможен и такой вариант, когда какая-либо функция или процедура содержит обращение к самой себе. Такая функция или процедура называется рекуррентной (от английского слова recurrence, что в переводе означает "возвратенне” или "повтсренне"), а процесс вызова функции или процедуры из нее самой — рекурсией.
Процесс рекурсии осуществляется следующим образом: вначале происходит вызов некоторой функции (процедуры). Затем, еще до завершения своей работы, эта же функция (процедура) вызывает саму себя, и в результате в памяти компьютера появляется второй экземпляр той же функции (процедуры), второй экземпляр в ходе работы создает третий и т. д. Естественно, что подобный процесс может продолжаться до бесконечности, поэтому для решения какой-либо конкретной задачи в рекурсивной функции (процедуре) обязательно должен содержаться условный оператор, одна из ветвей которого обеспечивает прерывание этой бесконечной цепочки и завершение работы всех экземпляров функции (процедуры). Внутри этого оператора и должен находиться вызов функции.
В качестве несложного примера, наглядно иллюстрирующего процесс рекурсии, рассмотрим задачу вычисления целой положительной степени вещественного числа (F). Текст соответствующей программы приведен в листинге 8.6.
Листинг 6.6. Программа, вычисляющая степень вещественного числа
program stepint;
Uses Crt;
var x,st:real; y:integer;
function rek(a:real;k:integer):rea1;
begin if k=l then rek:=a eJse rek:-rek(a,k-1)*a end;
begin
ClrScr;
writein('Введите число');
readln(x);
writein('Введите показатель степени ');
readln(у);
st:=rek(x,y);
writein(*Степень числа равна 1rst:12:3); readln end.
В данной программе в основной ее части производится только ввод исходных данных (самого числа х и показателя степени у), вызов рекурсивной 巾ункннн rek и вывод полученного результата, а само вычисление сгепени осуществляется в функции rek. Разберем более подробно механизм действия данной функции.
Для этого нужно ответить на вопрос: чему равно любое число в первой степени. Огвет очевиден — самому этому числу. Это мы и запишем в начале условного оператора: для к=1 результат гек равен исходному числу а. Для нахождения же квадрата числа нужно это число умножить само на себя, для нахождения куба — квадрат числа умножить на это число и т. д. Таким образом, существует следующая закономерность: к степень числа равна этому числу в степени к-1, умноженному на само число.
4а""*а
Эту формулу запишем в той ветви условного оператора, которая находится после служебного слова else.
Теперь рассмотрим непосредственно работу функции. Данная функция имеет два формальных параметра а и к, которым соответствуют в основной части программы фактические параметры х и у. Значением функции является /. Для вычисления значения функции гек с параметрами к н а вызывается другой экземпляр той же функции с параметрами к-1 и а (а остается неизменным для всех экземпляров функции), затем зтот экземпляр вызывает следующий с параметром к-2 и т. д., пока процесс не доходит до обращения к экземпляру для к=1. Значение функции для к=1 уже известно, т. к. в этом случае оно равно а. Это значение передается в экземпляр для k^2 и т. п., пока не определяется значение для к. Это последнее значение передается в основную часть программы для вывода на экран компьютера.
На рис. 8.6 приведен результат работы программы для х=2,53 и у=10.
В заключение данной главы приведем еще один пример использования рекурсии для решения классической математической задачи, известной как "Числа Фибоначчи**. Эта задача была решена в XIII веке выдающимся итальянским математиком Леонардо Фибоначчи. Вот ее условия: пара кроликов каждый месяц дает потомство ——двух кроликов, которые через два месяца сами способны давать новое потомство. Сколько кроликов будет через год, если в начале года была одна пара кроликов. Текст программы, которая решает поставленную задачу, приведен в листинге 8.7.
Листинг 8.7. Программа для решения задачи Фибоначчи
program rabbit;
Uses Crt;
var ir k:integer;
function rab(n:integer):integer;
begin if n=0 then rab:=l
else
if n=l
then rab:-2
else rab:=rab(n-2)+rab(n-1)
end;
begin
ClrSer;
writeIn(*Введите количество месяцев1);
readln(i);
k:=rab(i)*2;
writein(1Число кроликов через '#i,‘ месяцев равно ', k); readln
end.
Рис. 8.6. Программа вычисления целой положительной степени вещественного числа (а) и результат ее работы (б)
Для решения данной задачи используем рекурсивную функцию rab(n), которая определяет количество пар кроликов через п месяцев после начала года. В начале года существовала только одна пара кроликов, т. е. rab(o)=i, через месяц их стало две, следовательно гаЬ(1)=2. Через 2 месяца количество пар кроликов увеличивается еще на 1, т. е. на столько, сколько их было в начале года. Таким образом rab(2)=3 ИЛИ rab(2)^rab(1) +rab(0). Продолжая наши рассуждения, получаем следующую зависимость:
rab(n)=rab(n-l)+rab(п-2)
Эту рекурсивную функцию используем в программе rabbit (рис. 8.7), которая подсчитывает и выводит на экран количество кроликов через п месяцев.
Количество кроликов через п месяцев будет равно rab(n)x2. На рис. 8.7 приведены результаты работы программы при п=12. т. е. искомое количество кроликов через год.
曰 I uibo Pascal曰回 ЕЗ '
Dil Uin I e ROULYeci" П' яцеь
Число kpHUMF.ou *icpf • 1/ net яцс« pacitc /34
б
Рис. 8.7. Программа "Числа Фибоначчи" (а) и результат ее работы (б)
Программируемые модули
В программах, которые мы ранее составляли в среде Turbo Pascal, широко использовался модуль Crt. Однако данный модуль является не единственным в этой системе программирования. Наряду с модулем crt здесь имеется еще несколько модулей. Более того, сам язык Turbo Pascal имеет модульную структуру.
При запуске на выполнение головного файла системы turbo.exe в оперативную память компьютера по умолчанию загружается основной модуль языка Turbo Pascal, который называется System. Все остальные модули подключаются к основному с помощью уже известной нам команды Uses. Если возникает необходимость подключить к основному модулю сразу несколько дополнительных модулей, то они перечисляются после слова uses через запятую. Каждый такой модуль представляет собой библиотеку, в которой содержится перечень ряда функций и процедур, а также описание каждой функции и процедуры, имеющейся в этом перечне.
Кроме уже известных нам модулей System и Crt в системе Turbo Pascal имеется еще ряд стандартных модулей. Это модуль Graph, который используется для создания рисунков, графиков и диаграмм в графическом режиме Turbo Pascal. Графический режим обеспечивает более высокое качество изображения, чем текстовый. Для использования возможностей операционной системы MS-DOS применяется модуль, который так и называется Dos. Для управления принтером, подключенным к персональному компьютеру, используется модуль Printer. Для того чтобы обеспечить совместимость версии языка 3'urbo Pascal 7.0 с более ранними версиями того же языка, используются модули тигЬоЗ и Graph3. Подоючение к основному модулю модулей тигьоз н Graph3 позволяет запускать в среде Turbo Pascal 7.0 программы, созданные в более ранних версиях Turbo Pascal. Модуль Overlay используется для разработки программ, имеющих большой объем и сложную внутреннюю структуру. Для обеспечения более быстрой и эффективной работы со стандартными модулями они объединены в специальный библиотечный файл, который называется turbo.tpl. Расширение этого файла tpl является сокращением от английского Turbo Pascal library — библиотека Turbo Pascal.
Все перечисленные ранее модули нс случайно названы стандартными, поскольку они уже имеются в системе Turbo Pascal в готовом виде и требуют лишь подключения с помощью команды Uses. Наряду с использованием готовых модулей, программист может создавать в системе Turbo Pascal свои собственные модули. Использование модулей во многих случаях оказывается более удобным и рациональным, чем создание процедур и функций внутри основной программы. Если к процедуре или функции можно обращаться
только из той программы, частью которой они являются, то обращение к модулю можно производить из любой программы, созданной в Turbo Pascal. Таким образом, один раз создав определенную функцию или процедуру и включив ее в состав модуля можно в дальнейшем многократно употреблять ее для расчетов в самых различных программах.
Модуль первоначально создается в виде исходного текста, который набира** ется с помощью встроенного редактора системы Turbo Pascal и сохраняется в файле с расширением pas. В общем виде модуль имеет такую внутреннюю структуру:
unit имя_модуля; interface
var имя_перем!: тип!; имя_перем2: тип2;...;
function г^1мя__функции1 (параметр!: тип!; параметр2:тип2; .. .> : значение; function имя_функиии2 (параметр!: тип1; параметр?: тип2; • •・):значение;
procedure имя__процелуры1 (параметр!: тип1; параметр2: тип2; ... J;
procedure имя_процедуры? (параметр!: тип】; параметр2г тип2; ...丿;
implementation
var имя_перем!:твп1; имя_перем2:тип2;...;
function имя_функции1;
список локальных переменных функцрти!;
тело функции!;
function ;^аия_функци^2;
список локальных переменных функций!2;
тело фу^нкиии2;
procedure 14мя_процелуры1;
список лекальных переменных процедуры!;
тело процедуры);
procedure 1-1мя_процелуры2;
список локальных переменных процедуры2;
тело процедуры?;
begin
оператор!; оператор?;
end.
Рассмотрим составные части приведенной структуры. Текст модуля начинается с заголовка. Заголовок состоит из служебного слова unit (что в переводе с английского и означает ммодульи) и собственного имени модуля. Имя моду-
ля дается по тем же правилам, что и имя обычной программы, но на одном моменте здесь все же следует остановиться. Как читатель помнит, в обычной программе рекомендуется указывать в заголовке то же имя, что и имя файла, в котором эта программа хранится. Для модуля это не просто рекомендация, а обязательное правило. Если имя файла с исходным текстом модуля и имя модуля, указанное в его заголовке, будут разными, то модуль не будет правильно работать.
Вслед за заголовком модуля находятся его разделы, которые часто называют секциями модуля. Первой из них по порядку является секция интерфейса^ которая начинается со служебного слова interface. Как известно, интерфейсом называются средства взаимодействия между компонентами и участниками компьютерной системы. В данном случае речь идет о программном интерфейсе, т. е. средстве взаимодействия между различными программами, входящими в состав программного обеспечения компьютера. В этом разделе перечисляются те переменные, функции и процедуры, которые входят в данный модуль и могут использоваться другими программами.
После служебного слова interface в секции интерфейса находится список внешних переменных. Этот список начинается со служебного слова var, и далее в нем перечисляются внешние переменные, для каждой из которых указывается ее тип.
Вслед за списком переменных идет список функций, содержащихся в данном модуле. Для каждой функции должен быть полностью указан ее заголовок. Этот заголовок включает служебное слово function, собственное имя функции, список ее параметров, заключенный в скобки (для каждого параметра должен быть указан его тип), и тип самой функции. Далее в секции интерфейса идет список содержащихся в модуле процедур. Заголовок каждой процедуры также должен быть приведен в этом разделе в полном виде, т. е. он должен включать в себя служебного слово procedure, собственное имя процедуры и список ее параметров.
Вслед за секцией интерфейса в модуле идет секция реализации^ которая содержит тексты тех функций и процедур, заголовки которых имеются в интерфейсной секции. Секция реализации начинается со служебного слова implementation (это слово в переводе с английского означает "выполнение1*, "осу山ествленне"). После слова implementation в разделе указывается список внутренних переменных, которые могуг использоваться только внутри данного модуля.
Далее в секции реализации находятся описания функций данного модуля. Описание функции начинается с ее заголовка. В отличие от интерфейсной секции в данном случае в заголовке можно указывать только служебное слово function и собственное имя функции. Список параметров и тип функции
здесь указывать необязательно. После заголовка функции приводится список локальных переменных, которое используются только внутри данной функции. После списка локальных переменных находится тело функции. Тело функции в модуле имеет ту же структуру, что и тело функции в обычной программе. Оно начинается со слова begin, затем идет поеледовательность операторов. отделенных друг от друга точками с запятой. Завершается тело функции словом end. после которого идет точка с запятой. После текстов функций в секции реализации расположены описания процедур. Описание процедуры по своей внутренней структуре аналогично описанию функции.
Последней по порядку в модуле является секция инш^иситзации, которая начинается со служебного слова begin, может содержать ряд операторов и заканчивается служебным словом end, после которого ставится точка. Следует сказать о том, что далеко не все перечисленные элементы модуля всегда присутствуют в нем. Часто в модуле отсутствует секция инициализации, но слово end с точкой в конце модуля должно находиться обязательно.
После того как исходный текст модуля набран, его следует сохранить в файле с расширением pas. Сохранять файл с исходным текстом модуля можно в том же каталоге prog, что и остальные файлы программ. Затем программу нужно запустить на компиляцию. Обратите внимание на то, что компиляция модуля должна производиться через меню Compile. Открыв этот раздел, нужно выполнить в нем одноименную команду. Если в модуле нет ошибок, то на экране компьютера на переднем плане вы увидите окно с сообщением об итогах компиляции. В нижней строке этого окна будет видна следующая надпись: Compile successful: Press any key. Это означает, что компиляция прошла успешно и для закрытия окна с сообщением нужно нажать любую клавишу (рис. 8.8). Запускать модуль сразу на компиляцию и на выполнение с помощью команды Run | Run. как мы это делали с обычными программами, нельзя.
После успешной компиляции система программирования создает исполняемый файл, который имеет то же имя, что и исходный, и расширение tpu. Например, если исходный файл назывался modul 1 .pas, то исполняемый файл будет называться moduli.tpu. Для того чтобы этот модуль могли использовать другие программы, нужно соответствующим образом настроить систему Turbo Pascal.
Для этого нужно открыть меню Options, а в нем выбрать команду Directories. После выполнения этой команды откроется диалоговое окно Directories (каталоги). Здесь в поле, называемом EXE & TPU directory, следует указать диск и каталог, в которых компилятор будет сохранять исполняемые файлы модулей с расширением tpu. В поле под названием Unit directories нужно указать этот же каталог для того, чтобы все программы, использующие модули, могли найти их по указанному адресу (рис. 8.9).
Рис. 8.8. Окно с сообщением об успешной компиляции модуля, созданного в системе Turbo Pascal
Если, например, на вашем компьютере папка ТР7 находится в корневом каталоге диска D:, а файлы программ вы сохраняете в папке prog, то в обоих полях нужно указать адрес d:\TP7\prog. Для подтверждения внесенных изменений нужно щелкнуть мышью экранную кнопку ОК, что приведет к закрытию диалогового окна. Теперь созданный вами модуль смогут использовать другие программы.
Т шЬп PascalТ шЬп Pascalnathen;nathen;1onq ini1onq ini\l p八卩ruq\l p八卩ruqAunits; 1:\lp?\bqAunits; 1:\lp?\bqJ:\tp7\bJ:\tp7\bQsAt directtrinQsAt directtrinprocedure var i:long iniprocedure var i:long inifunction faktl procedure step prQceduri[ A procedur procedur Г proccdvrimplement 1七 fund tunfunction faktl procedure step prQceduri[ A procedur procedur Г proccdvrimplement 1七 fund tuns: long mt); ■ ir,C$.E.s: long mt); ■ ir,C$.E.Рис. 8.9. Настройка системы Turbo Pascal, необходимая для правильного использования программных модулейРис. 8.9. Настройка системы Turbo Pascal, необходимая для правильного использования программных модулей
Т шЬп Pascal
Т шЬп Pascal
nathen;
nathen;
1onq ini
1onq ini
\l p八卩ruq
\l p八卩ruq
Aunits; 1:\lp?\bq
Aunits; 1:\lp?\bq
J:\tp7\b
J:\tp7\b
QsAt directtrin
QsAt directtrin
procedure var i:long ini
procedure var i:long ini
function faktl procedure step prQceduri[ A procedur procedur Г proccdvr
implement 1七 fund tun
function faktl procedure step prQceduri[ A procedur procedur Г proccdvr
implement 1七 fund tun
s: long mt); ■ ir,C$.E.
s: long mt); ■ ir,C$.E.
Рис. 8.9. Настройка системы Turbo Pascal, необходимая для правильного использования программных модулей
Рис. 8.9. Настройка системы Turbo Pascal, необходимая для правильного использования программных модулей
Рассмотрим создание и использование программного модуля на следующем примере. Создадим модуль под названием mathem, выполняющий те математические операции, для которых в языке Паскаль не существует стандартных функций или процедур. К таким операциям относится вычисление факториала числа, нахождение среднего арифметического, среднего геометрического и среднего гармонического двух чисел, определение наибольшего общего делителя двух чисел, возведение числа в произвольную целую степень. Заготовки для выполнения почти всех этих операций у нас уже имеются в виде функций или процедур, которые мы уже разрабатывали в предыдущих программах. Описание этих функций и процедур можно скопировать из этих программ и вставить в создаваемый нами модуль.
Исключение составляет только определение среднего геометрического, но эта задача не является сложной. Как известно, согласно определению, средним геометрическим двух чисел х и у является число z, которое удовлетворяем следующему равенству:
z =厶• у .
На языке Паскаль эту же формулу можно записать в виде оператора: z:-sqrt (х*у);
Из этого единственного оператора и будет состоять тело соответствующей процедуры. В листинге 8.8 приводится текст модуля mathem.
Листинг 8.8. Текст модуля ma them
unit inathem;
interface
function fakt(n:longint):longint;
procedure procedure procedure procedure procedureprocedure procedure procedure procedure procedurestep(of p:longint; var s:longint); sredarifm(x.y:丄ongint; var sred:real); sredgecm(x,у:longint; var sred:real); sredgarmCx^у:longint; var sred:real); nod (xr у: longint; var d: longint);
procedure procedure procedure procedure procedure
procedure procedure procedure procedure procedure
implementation function fakt;
var i,f:longint;
begin
f :=1;
for i:=1 to n do f:=f*i;
fake:^f
end;
procedure step; var i:longint; begin s:=l;
for i:=l to p do
S:=S*Q end;
procedure sredarifm;
begin
sred: = (x+y) /2 end;
procedure sredgeom;
begin
sred:=sqrt(x*y) end;
procedure sredgarm;
begin
sred:=2/(1/x+l/y);
end;
procedure nod;
var i,к:longint;
begin d:=l; if x>y then k:=x else k:=y;
for i:=l to к do
if (x mod i =0) and (y mod i =0) then d:=i;
end; encl.
Модуль начинается с заголовка, в котором указано его собственное имя —— mathem. В секции интерфейса данного модуля содержатся заголовки одной функции и пяти процедур, находящихся в данном модуле. В секции реализации содержится описание указанных функций и процедур. Функция fakt вычисляет факториал целого числа. Процедура step применяется для возведения числа в любую целую степень. Процедура sredarifm находит среднее арифметическое двух целых чисел. Процедура sredgeom вычисляет среднее геометрическое двух чисел, а процедура sredgarm находит среднее гармоническое. Наконец, процедура nod находит наибольший общий делитель двух чисел. Подробно описывать эти процедуры нет необходимости, т. к. это было
уже сделано ранее. Секция инициализации в данном модуле отсутствует. Завершается модуль служебным СЛОВОМ end с точкой.
После компиляции модуля образуется исполняемый файл, который называется mathem.lpu. Этот файл могут использовать другие программы, написанные в Turbo Pascal. В качестве примера использования возможностей созданного модуля приведем две небольшие программы. Первая программа вычисляет сумму факториалов двух введенных с клавиатуры чисел. В листинге 8.9 приводится текст данной программы.
j Листинг 8.9. Программа, вычисляющая сумму факториалов двух чисел
program suirfakt;
uses crt,mathem;
var a,b,sumf:longint;
begin
ClrScr;
writein(*Введате первое число'};
readln(a);
writein(введите второе число*);
readln(b);
sumf:=faku(a)+fakt(b);
writein(*Су№иа факториалов двух чисел равна ',sumf);
readln
end.
В данной программе после ее заголовка указываются подключаемые к программе модули. После стандартного модуля crt через запятую указывается созданный нами модуль 脸them Далее в программе после ввода исходных данных дважды идет обращение к функции fakt, содержащейся в модуле mathem. С помощью этой функции вычисляется искомый результат—— сумма факториалов двух чисел, который затем выводится на экран компьютера. Ре- зуяыаты рабогы программы для а, равного 3, и ь, равного 5, приведены на рис. 8.1(1
Следующая программа для двух введенных с клавиатуры чисел определяет их среднее арифметическое, среднее геометрическое и среднее гармоническое. В листинге 8.10 приводится текст данной программы.
! Листинг 8.10. Программа, вычисляющая среднее арифметическое,
;геометрическое и гармоническое двух чисел?
program srednee;
uses crt,mathem;
var arb: integer; a ri fm, geojn, ga rm: real;
begin
ClrScr;
writein(* Введите первое число*);
readln(а);
writeIn(* Введите второе число');
readln(b);
sredarifinta/b/arifm);
s redgeora (а, b. geom);
sredgarm (a, br garm);
writein(* Среднее арифметическое двух чисел равно 1,arifm:6:2);
writein('Среднее геометрическое равно '.gecm:7:3);
writein('Среднее гармоническое равно 1,garm:7:3); readln end.
Рис. 8.10. Результат работы программы, которая определяет сумму факториалов двух чисел
В данной программе наряду с модулем Crt также производится подключение модуля mathem. После ввода исходных данных в основной части программы трижды присутствует обращение к процедурам, содержащимся в модуле mathem. С помощью процедур определяются искомые результаты, которые затем выводятся на экран компьютера. Результат работы программы для тех же исходных данных, что и в предыдущей программе (числа 3 и 5) показан на рис. 8.11.
Простота и компактность двух приведенных ранее программ обеспечивается за счет использования в обеих программах возможностей созданного нами модуля mathem. Обращаться к этому же модулю можно и из других программ, созданных в системе Turbo Pascal, что в значительной степени облегчает их разработку.
Рис. 8.11. Результат работы программы, которая определяет для двух введенных чисел их среднее арифметическое, среднее геометрическое и среднее гармоническое
Задания для самостоятельной работы
Задание 1. Составьте программу, которая определяет площадь треугольника по формуле Герона. Данная формула выглядит следующим образом:
s = Jp(p - а)(р - b)(p - с),
где a, b к с— длины сторон треугольника, а р——половина периметра треугольника. Для извлечения квадратного корня используйте стандартную функцию sqrt.
Задание 2. Составьте программу, которая по выбору пользователя возводит введенное с клавиатуры целое число в квадрат, определяет его абсолютную величину или извлекает квадратный корень числа. В программе следует предусмотреть вывод сообщения об ошибке, если пользователь попытается извлечь квадратный корень из отрицательного числа. Используйте в программе стандартные функции abs, sqr И sqrt.
Задание 3. Дополните предыдущую программу функцией, которая определяет, действительно ли введенное с клавиатуры число является целым (целое число может содержать только цифры от 0 до 9). Результат функции должен быть логического типа, т. е. либо true, либо false. В зависимости от значения функции программа должна предложить пользователю либо произвести на выбор один из указанных ранее вариантов вычислений, либо вывести сообщение об ошибке н вернуть пользователя к вводу исходных данных.
Задание 4. Составьте программу, которая заполняет одномерный массив из 20 элементов случайными целыми числами от I до 99, а затем определяет,
сколько в массиве имеется простых чисел (простым числом называется такое, которое делится только на единицу или само на себя). Процесс определения того, является ли число простым, о(|)ормить в виде отдельной процедуры.
Задание 5. Составьте программу, которая определяет в интервале от I до 10 ООО все совершенные числа. Совершенным числом называется число, которое равно сумме всех своих делителей, включая единицу. Процесс определения того, является ли данное число совершенным, оформите в виде отдельной процедуры.
7 Зак 1068
ГЛАВА 9
Работа с файлами в Паскале
Еще на начальных этапах работы в системе Turbo Pascal (см. разд. 3.〃 мы научились сохранять в виде файлов тексты написанных на языке Паскаль программ (исходный код). Но до сих пор мы теряли результаты работы созданных нами программ. Эти результаты пропадали после выхода из системы программирования. А ведь именно получение конкретных результатов в конечном счете и является целью создания программ. Отсюда можно сделать следующий вывод: желательно предусмотреть возможность сохранения этих результатов в долговременной памяти компьютера. Как известно, именно файл является основной единицей хранения любой информации на носителях информации вне зависимости от их устройства и физической природы (к таким носителям относятся и жесткий магнитный диск — винчестер, и гибкие магнитные диски, называемые также дискетами или флоппи-дисками, и лазерные компакт-диски).
Каждый файл имеет уникальное, т. е. присущее только ему, имя и расширение, определяющее его тип. При этом имя файла от расширения отделяется точкой. Нам уже знакомы файлы с расширением pas, содержащие исходный код программ на Паскале, и файлы модулей с расширением tpu, но кроме них существуют еще десятки различных видов расширений, некоторые из них мы приведем:
ехе — такое расширение имеют готовые к выполнению программы (в том числе, как вы конечно помните, головной файл системы программирования Turbo Pascal);
doc — это расширение имеют файлы документов, созданных в текстовом процессоре Microsoft Word;
xls— данное расширение имеют файлы электронных таблиц, созданных программой Microsoft Excel;
bmp— это расширение получают файлы рисунков, созданные стандартным приложением операционной системы Windows графическим редактором Paint.
Соответствующие файлы могут иметь, например, такие имена:
progr.exe doklad.doc tabl.xls picture.bmp
Над файлами средствами языка Паскаль можно производить различные операции, которые можно разделить на две большие группы. Это операции записи информации в файл из оперативной памяти компьютера и считывания информации из файла в оперативную память. При записи информации в файл необходимо выполнить следующие операции: открытие файла для записи, собственно запись информации в файл, закрытие файла. При чтении информации из файла выполняются операции; открытие файла для чтения, собственно чтение файла и закрытие файла.
Существует два способа записи и чтения информации ——метод последовательного доступа и метод прямого доступа. Метод последовательного доступа можно сравнить с процессом записи на магнитофонную пленку и воспроизведения ее содержимого. Для того чтобы произвести одну или другую операцию, требуется предварительно перемотать пленку до нужного места. Так же и для того, чтобы добраться в файле до интересующей нас информации методом поеледовательного доступа, нужно предварительно "прокрутить" всю предшествующую ей информацию. При считывании информации методом прямого доступа можно непосредственно получить доступ к нужному нам компоненту (т. е. составной части файла) подобно тому, как можно непосредственно проиграть любую запись на лазерном диске.
Файлы, с которыми можно работать средствами языка Паскаль, делятся на три основные разновидности: текстовые, типизированные и нетипизирован- нне. Используемые файлы, подобно переменным, константам и массивам, должны быть обязательно описаны, причем для каждого из трех видов файлов существует свой способ описания.
Текстовые файлы
Начнем рассмотрение процесса работы с текстовыми файлами. Перед использованием такого файла в программе в разделе описания переменных должна быть обязательно описана связанная с ним переменная. Общий вид описания следующий:
var 必铝_ переменно荷:text;
где имя_переменной— имя переменной, которая впоследствии будет связана с файлом; text ——соответствующий тип переменной.
Пример описания:
var к:text;
Текстовые файлы состоят из строк символов. Каждая такая строка заканчивается символами возврата каретки cr (этот символ имеет в таблице ASCII код 13) и перевода строки lf (данный символ имеет в таблице код 10). Упомянутые символы относятся к так называемым управляющш^ символам, которые, как правило, при просмотре и редактировании файла не выводятся на экран компьютера. В конце файла находится признак конца файла, который сокращенно обозначается eof (сокращение от английской фразы end of file —— конец файла). Файл такого вида имеет расширение txt. Этот файл можно создавать как с помощью программы, написанной на Паскале, так и с помощью какого-либо текстового редактора. Чтобы потом не возникало проблем с чтением файла, лучше использовать редакторы, в которых по умолчанию используется кодировка букв кириллицы, принятая в MS-DOS, например встроенный редактор файловой оболочки Norton Commander или самой системы программирования Turbo Pascal.
При этом следует иметь в виду: для того чтобы с файлом можно было в дальнейшем производить какие-либо действия, необходимо выполнить еще две операции. Во-первых, связать имя файла с именем соответствующей ему переменной. Во-вторых, указать направление работы с файлом — запись в него информации или чтение информации.
Общий вид процедуры, связывающей имя файла с именем переменной, сле- пующи证:
assign (имя^еременной, гимя_фдйла,);
где assign——служебное слово, означающее в переводе "назначить"; имл_переменной— имя соответствующей файлу переменной; * имя_файла •— полное имя текстового файла. Обратите внимание, что оно должно быть заключено в апострофы. Полное имя файла содержит имя диска, на котором находится данный файл, путь к файлу, который включает в себя имена каталогов, содержаи^их данный файл, и собственное имя файла с расширением. Если текстовый файл находится на том же диске и в том же каталоге, что н вызывающая его программа, то диск и каталог можно не указывать.
Пример использования процедуры:
assign (k,'A:otchet•txt');
здесь переменной к ставится в соответствие файл otchet.txt, который находится на дискете, содержащейся в дисководе А: того компьютера, с которым работает пользователь.
Данная процедура устанавливает соответствие между описанной ранее переменной к н текстовым файлом otchet.txt. В дальнейшем в программе имя тек-
стового файла более не будет упоминаться, а при всех операциях с файлом будет указываться имя ''назначенной1* ему текстовой переменной.
Дальнейший ход работы зависит от того, какие именно действия необходимо произвести с данным файлом. Если содержимое файла необходимо прочитать, то его открытие производится следующей процедурой:
reset (имя_переменной};
где имя_переменной——имя связанной с файлом переменной.
Что касается непосредственно самого процесса чтения информации из файла в программу, то он происходит с помощью уже знакомых нам операторов read ИЛИ readln. При ЭТОМ В Скобках ПОСЛе служебного слова read ИЛИ readln, как правило, указываются имена двух переменных: первой пишется имя переменной, связанной с файлом» а за ней указывается имя какой-либо вспомогательной переменной, в которую и считывается информация. По окончании операции чтения (как и рассматриваемой далее операции записи) файл следует закрыть с помощью процедуры close.
Общий вид данной процедуры:
close (имя_^еременной);
где имя_переменной— имя связанной с файлом переменной.
Рассмотрим теперь операцию чтения информации из файла на конкретном примере.
Составим программу, которая считывает информацию из файла» созданного с помощью встроенного редактора файловой оболочки Norton Commander. Этот файл находится на логическом диске D: компьютера в каталоге obuch. (Напомним, что для того, чтобы в Norton Commander создать новый текстовый файл, нужно нажать комбинацию клавиш <Shift>+<F4>, а в дальнейшем редактировать уже существующий файл можно, выделив его курсорной рамкой и нажав клавишу <F4>.) Файл имеет имя comp.txt н содержит информацию об устройстве компьютера. Рассмотрим текст программы, выполняющей указанные действия — листинг 9Л.
「"'•”••”™7 7r;产l-5'丁行学曾二ДT:-А;"就":f" •,"^"^,Г^“j叱
.Листинг 9Л. nporpaMMaf считывающая информацию из текстового файла и выводящая ее «а экран компьютера'
program obrtext;
Uses Crt;
var t:text; In:string[80];
begin
Clrscr;
assign(tz *D:\obuch\corap.txt*);
reset(t);
while not eof(t) do begin
readln(trIn);
writein(In) end;
close(t);
readln
ЯБ^ЕЗЯБ^ЕЗTuibo Pnsc插Tuibo Pnsc插end.
ЯБ^ЕЗ
ЯБ^ЕЗ
Tuibo Pnsc插
Tuibo Pnsc插
program obrtcxt;
Uses Crl;
Udr t :trxt ; hi:striii<](on);
Clrscr;
ass isn( t, (l:\vbuch\conp. txt *); resct(t);
while not rofC t) do
redd1h(11 In);
зг 11 e I n(i n)
end;
c 1 и、f (t );
66
6
6
二 I uibu Pdscal閥]■]
lll'pt UltdHbtiUH М1Г1ПЫ-Н V P НАПЕТШ b Lh"“ C <)€ 1 dU
Рис. 9.1. Программа чтения текстового файла (а) и результат ее работы (б)
Программа называется obrtext, и в ней используются две переменные: t, которой ставится в соответствие файл comp.txt, и in— вспомогательная переменная строкового типа, в которую строка за строкой будет считываться со-
держимое текстового файла. В начале основной части программы между файлом и файловой переменной устанавливается соответствие с помощью процедуры assign. Затем файл открывается для чтения процедурой reset.
Сам процесс считывания информации производится в цикле с предусловием типа while. Условием завершения работы цикла является обнаружение признака конца файла (eof), т. е. цикл будет выполняться при условии, что конец файла в ходе считывания информации еще не найден. Это условие записывается следующим образом: not eof (t), т. е. здесь используется стандартная функция Паскаля, которая также называется eof и относится к логическим функциям, значением которых может быть только false или true. Пока не обнаружен конец файла, функция имеет значение false, а при его обнаружении она меняет значение на true. Аргументом же данной функции является имя файловой переменной. При каждом выполнении тела этого цикла из файла оператором readln считывается очередная строка и передается в строковую переменную in. Затем содержимое строковой переменной (т. е. очередная строка файла) выводится на экран компьютера оператором writein. По окончании работы цикла файл закрывается процедурой close.
Процесс записи информации в файл также имеет свои особенности. Назначение файлу соответствующей ему файловой переменной производится так же, как и в случае чтения файла, но открытие файла для записи производится либо процедурой rewrite, либо процедурой append. Общий вид этих процедур следующий:
rewrite (имя_переменной); append (имя_переменной);
г. е. он аналогичен виду процедуры reset. Надо помнить, что процедуры rewrite Н append открывают файл ДЛЯ Записи по-разному. Процедура rewrite при открытии файла очищает его, т. е. предыдущее содержимое файла (если таковое было) удаляется и вместо него записывается новый текст. Если же содержимое файла нужно сохранить, то используют процедуру append, которая дополняет текущее содержимое текстового файла новой информацией, дописывая ее в конец данного файла. Сам же процесс записи информации в файл производится либо с помощью оператора write, либо оператором writein. После служебного слова write или writein в скобках указывается имя файловой переменной, а затем имя той строковой переменно前,из которой осуществляется запись данных в файл.
Рассмотрим использование процедуры append на следующем примере. Пусть в конец файла coinp.txt необходимо дописать следующий текст:
К компьютеру также могут подключаться:
Принтер
Сканер
Колонки
Модем
Для того чтобы выполнить требуемое действие, составим соответствующую программу. Текст программы приведен в листинге 9.2.
j Листинг 9.2. Программа, которая позволяет добавлять информацию j в конец текстового файла
program doptext;
Uses Crt;
var t:text; In:string[80];
i,n:integer;
begin
Clrscr;
assign(七,'D:\obuch\cowp.txt *);
append(t);
writein(*Укажите количество вводимых строк *);
readLn(n);
v/riteln(* Вводите текст. Ввод каждой строки заканчивайте нажатием "Enter",);
for i:=I to n do
begin
readln(In);
writein (t. In)
end;
close(t);
Clrscr;
reset(t);
while not eof(t) do
begin
readln(t,In);
writein(In)
end;
close(t);
readln;
end.
В этой программе помимо тех переменных, которые мы использовали в предыдущей, нам понадобятся еще две: п— количество строк, добавляемых в конец файла, и i — счетчик цикла. Затем после открытия файла для записи указываем количество вводимых строк. Сам процесс ввода происходит в цикле с заранее заданным числом повторений (это число равно количеству вводимых строчек; в данном случае оно равно 5). В теле цикла содержатся
два оператора. В первом из них каждая вводимая строка оператором readln считывается во вспомогательную переменную in. Во втором операторе содержимое переменной in (т. е. очередная строка) переписывается в файл с помощью оператора writein. По окончании операции записи файл закрывается.
Рис. 9.2. Просмотр результатов добавления строк в текстовый файл: программа (а) и результат ее работы (б)Рис. 9.2. Просмотр результатов добавления строк в текстовый файл: программа (а) и результат ее работы (б)бб
Рис. 9.2. Просмотр результатов добавления строк в текстовый файл: программа (а) и результат ее работы (б)
Рис. 9.2. Просмотр результатов добавления строк в текстовый файл: программа (а) и результат ее работы (б)
б
б
Для того чтобы можно было проконтролировать правильность ввода в файл дополнительной информации, после записи данных произведем чтение всего
содержимого файла с выводом его на экран компьютера аналогично тому, как это было сделано в предыдущей программе. Результат выполненных опера- цм访 можно наглядно увидеть на рис. 9.2.
Типизированные файлы
Типизированным называется файл, который состоит из однородных элементов, относящихся к одному и тому же типу. Такими элементами могут быть переменные различных типов и массивы. Каждый элемент такого файла имеет свой индекс, подобно элементам массива. Но в отличие от обычного массива, который хранится в оперативной памяти компьютера и содержимое которого стирается после выхода из системы программирования, типизированный файл может длительное время сохраняться на жестком диске компьютера или на дискете. К каждому элементу такого файла возможен как прямой (по индексу элемента), так и последовательный доступ, но недостатком его является то, что в отличие от текстового файла его нельзя просматривать и редактировать с помощью обычного текстового редактора.
Для того чтобы в типизированный файл можно было производить запись или считывать из него информацию, его следует связать с помощью процедуры assign с файловой переменной подобно тому, как мы это уже делали с текстовыми файлами. Например, так:
assign(nabr *D:\inf\nabor');
Здесь мы связываем имеющуюся в программе файловую переменную nab с типизированным файлом nabor, находящимся на логическом диске D: в каталоге inf. Обратите внимание, что в отличие от текстового файла, типизированный файл необязательно должен иметь расширение.
В общем виде описание файловой переменной для типизированного файла выглядит следующим образом:
var имя^переменнойг file of тип;
где имя_переменно〃— имя переменной, связанной с типизированным файлом; file——служебное слово; тип— тип элементов, из которых состоит данный файл. Это могут быть уже известные нам типы, используемые для описания обычных переменных и массивов (integer, real, character, string, array).
Пример описания типизированного файла:
var nab: file of character;
таким образом описан файл, состоящий из элементов вещественного типа, с которым связана в программе файловая переменная nab.
Подобно текстовым файлам, типизированные файлы открываются для чтения процедурой reset и для записи процедурой rewrite, а закрываются процедурой close.
Непосредственное чтение данных из файла производится с помощью следующего оператора:
read (;шя_ пер&^еиной! г имя_переменной2);
где имя^_переменной1 — имя файловой переменно访;1^мя_переменной2 — имя обычной переменной, относящейся к тому же типу, что и элементы типизированного файла.
Пример: read (nab, г}, где г — обычная переменная вещественного типа.
Запись в файл производится оператором:
write (имя__переменной1, Р1мя_переменной2);
Операторы writein и readln для записи и чтения в типизированном файле использовать нельзя, т. к. данный файл не содержит строк. Поэтому при попытке их использования компилятор выдаст сообщение об ошибке.
Типизированные файлы, ввиду упорядоченности их структуры, удобно использовать для создания электронных справочников, что мы и рассмотрим на следующем примере.
Известно, что в математике, физике и других точных науках для обозначения различных величин широко используются буквы греческого алфавита. Составим программу, которая облегчит пользователю запоминание названий этих букв и порядка их расположения в алфавите. Эта программа должна по порядковому номеру буквы в алфавите определять ее название и, наоборот, по названию буквы указывать ее положение в алфавите.
Поставленную задачу мы будем решать в два этапа. Вначале создадим типизированный файл, элементами которого будут строковые переменные — названия букв греческого алфавита. Этот файл, имеющий имя alphabet и находящийся в каталоге obuch на логическом диске D: компьютера, мы создадим и заполним данными с помощью программы, текст которой приведен в листинге 9.3.
5 Листинг 9.3. Программа, записывающая названия букв греческого алфавита I в типизированный файл
program greek;
Uses Crt;
var
a:file of string; b:string; i,j:integer;
begin
Clrscr;
assign(a,'D:\obuch'alphabet*);
rewrite(a);
for i:=l to 24 do
begin
writein(* Введите название очередной буквы1); readln(b);
write(a,b) end;
close(a);
Clrscr;
reset(a);
for i:=l to 4 do begin writeIn;
for j:=1 to 6 do begin read (a, b);
write(b,•') end;
end;
close(a);
readln; end.
Вначале мы связываем типизированный файл с файловой переменной а с помощью процедуры assign, затем открываем файл для записи. Если файла с таким именем на диске не существовало, то он будет создан программой. Процесс заполнения созданного файла данными мы производим в цикле с заранее заданным числом повторений. Тело цикла будет повторено 24 раза (по числу букв греческого алфавита). В самом теле цикла производятся следующие действия: название очередной буквы, введенное с клавиатуры, считывается оператором readln во вспомогательную переменную строкового типа ь. Затем оператором read значение переменной ь передается файловой переменной а (т. е. в конечном счете в типизированный файл alphabet).
Для того чтобы проконтролировать правильность заполнения файла alphabet, выведем его содержимое на экран компьютера. Элементы файла выводятся на экран в 4 строки, в каждой из которых должны быть видны названия 6 букв. Такой способ вывода осуществляется с помощью двух циклов, один нз которых вложен в другой. Элементы цикла (названия букв) считываются из файла в ту же вспомогательную переменную ь. По окончании вывода данных эта программа завершает свою работу.
Рис. 9.3. Результаты работы программы создания типизированного файла, содержащего буквы греческого алфавита
Данные из файла, созданного в программе greek, мы используем во второй программе, которая уже непосредственно будет выполнять поставленную задачу. Для того чтобы разобраться в том, как работает эта вторая программа, необходимо предварительно рассмотреть используемые в ней стандартные процедуру и функцию, которые применяются для работы с типизированными файлами.
Процедура seek осуществля ст прямой доступ к элементам типизировянного файла. Общий вид данной процедуры:
seek(имя_переменной, п);
где seek — служебное слово, которое в переводе с английского означает нис- кать”; имя_переменной— имя файловой переменной; п— порядковый номер элемента в файле (необходимо иметь в виду, что нумерация элементов в типизированном файле начинается не с единицы, а с нуля).
Результатом работы данной процедуры является то, что элемент файла с номером п становится текущим. При считывании данных оператором read будет считан именно этот элемент, при записи данных оператором write они также будут записаны в этот элемент.
Если в ходе работы программы необходимо установить, какой элемент файла является текущим, то для этого используется функция filepos.
Общий вид описания данной функции:
filepos (имя_переменнсй) : longint;
аргументом данной функции является имя файловой переменной, а значением —порядковый номер текущего элемента в файле.
Теперь можно приступить к разбору второй программы, текст которой приводится в листинге 9.4.
Листинг 9.4. Программа, опредёлянэщая название буквы ^реМескргр алфавита “ j по ее порядковому номеру или номер ^уквь( в алфавите по .ее названию ; ^z\ J
program grsearch;
Uses Crt;
label 10;
var a:file of string; s:char; b,c:string; l,m, nrx:longint;
begin
assign(a,* D:\obuch\alphabet•);
reset(a);
repeat
ClrScr;
writein (* Выберите режим работы программы*);
writeln( *1 - определение названия буквы по ее номеру в алфавите•);
writein(*2 - определение порядкового номера буквы по ее названию'); readln(m); case m of
begin
writein('Введите порядковый номер буквы в алфавите*);
readln(п);
seek(а,п-1);
read(а,Ь);
writein(п,• буква греческого алфавита - •,Ь);
end;
begin
writein {• Введите название буквы1);
readln (с);
:=0;
repeat
seek(а,1);
read (a.b);
1^1+1
until c=b;
x:=filepos(a);
writein(*Буква ,,c, ' является ',x,' буквой греческого алфавита1) end;
else begin
writein(1Вы ввели неверную цифру*);
goto 10 end;
end;
writein(*Будете продолжать работу с программой(Д/Н)*);
readln(s);
until s=lH*;
close(a); end.
В начале работы данной программы открывается для чтения типизированный файл alphabet, созданный предыдущей программой. Затем в программе используется цикл с постусловием. В этом цикле после очистки экрана операторами writein на экран выводится текст меню, позволяющий выбрать один из двух вариантов работы программы ——определение названия буквы или определение порядкового номера путем ввода соответствующей цифры I или 2. Эта цифра присваивается вспомогательной переменной ш. Затем выбор варианта работы производится с помощью условного оператора case, в котором роль переменной-селектора играет т. Перед началом работы условного оператора файловая переменная а связывается с типизированным файлом alphabet, а затем файл открывается для чтения процедурой reset.
В случае если пользователь выбирает первый вариант работы программы, ему необходимо ввести порядковый номер буквы — п. Значение п используем в качестве одного из параметров процедуры seek (другим является имя файловой переменной), но при этом нужно учесть, что в алфавите нумерация букв начинается с единицы, следовательно, первой букве алфавита будет соответствовать нулевой элемент типизированного файла, второй букве ——первый элемент, n-й букве — элемент с номером п-1. Поэтому, для того чтобы правильно определить нужный нам элемент файла, содержащий название буквы, в качестве входного параметра в процедуру вводим значение п, уменьшенное на единицу. Затем найденный процедурой seek элемент типизированного файла (название буквы с порядковым номером п) передается оператором read во вспомогательную переменную ь. Затем сообщение о номере буквы и ее названии выводится на экран компьютера операторами write.
Если же пользователь выбирает второй вариант работы, то вначале он должен ввести название буквы, порядковый номер которой ему надо определить. Это название считывается во вспомогательную строковую переменную с. Далее в программе открывается цикл с постусловием repeat. В этом цикле с помощью процедуры seek последовательно перебираются все элементы типизированного файла, начиная с нулевого. Входными параметрами данной процедуры являются имя файловой переменной и значение вспомогательной переменной целого типа 1. Перед началом работы цикла переменной 1 присваи-
ваем значение 0. В теле цикла каждый найденный процедурой элемент считывается во вспомогательную строковую переменную Ь, а значение переменной 1 увеличивается на единицу. Значение ь сравнивается с ''эталонным*' значением, находящимся в переменной с.
Равенство значений этих двух переменных, свидетельствующее о том, что искомый элемент файла, соответствующий введенному названию буквы, найден, и является условием окончания работы цикла. Теперь осталось определить номер найденного элемента и увеличить его на единицу. Это и будет искомый порядковый номер буквы в алфавите. Данную операцию мы выполняем с помощью процедуры filepos, значение которой присваивается целочисленной переменной х. Введенное название буквы н соответствующий ей порядковый номер, находящийся в переменной х, будут выведены на экран компьютера с помощью оператора writein.
В случае если пользователь в ходе выбора вариантов работы ошибочно ввел не 1 или 2, а какую-либо другую цифру или иной символ, то выполняется та ветвь оператора сазе, которая находится после служебного слова else. В результате выполнения этой ветви выводится сообщение об ошибке, а затем пользователь возвращается к выбору возможных вариантов работы посредством использования оператора безусловного перехода.
После завершения работы оператора case.. .of пользователю предлагается на выбор возможность продолжить работу с программой или завершить ее. Этот выбор производится путем присваивания соответствующего значения символьной переменной s. Проверка значения этой переменной производится в
Рис. 9.4. Результаты работы электронного справочника, созданного с использованием типизированного файла
последней строке цикла с постусловием. Если значение переменной s равно "Н", то цикл завершает свою работу, а если значение иное, то происходит повторное выполнение тела цикла с возможностью выбора варианта работы программы.
По окончании работы с файлом закрываем его процедурой close (это необходимо сделать вне зависимости от того, какой вариант работы программы мы выбрали, чтобы сохранить файл для дальнейшей работы).
Используя созданный средствами языка Паскаль компьютерный справочник, нетрудно будет узнать, что десятой по счету буквой греческого алфавита является буква "каппа", а буква “пн" является шестнадцатой по счету буквой алфавита (рис. 9.4).
Нетипизированные файлы
Неттшзироватыми называются такие файлы, в которых в отличие от двух рассмотренных ранее видов, не указывается тип входящих в них элементов. Элементами одного и того же нетипизированного файла могут быть данные различных типов: целого, вещественного, символьного, строкового и других. Такие файлы используются для высокоскоростного обмена информацией между внешними файлами и программой, находящейся в оперативной памяти компьютера. При этом нетипизированные файлы, подобно типизированным, обеспечивают прямой доступ к данным.
Описание нетипизированной файловой переменной имеет следующий общий вид:
var ;4л«я_переменной: fi 1 е;
где Р1мя_переменной— имя связываемой с нетипизированным файлом файловой переменной.
Пример описания:
var unt: file;
связывание файловой переменной с файлом производится так же, как и для других файлов с помощью процедуры assign. Открытие файла для чтения и для записи производится соответственно процедурами reset и rewrite. Формат этих процедур также аналогичен формату для других видов файлов. Операторы же, используемые для непосредственной записи информации в файл и для чтения информации из файла, отличаются от обычных операторов ввода-вывода, которые мы использовали в предыдущих случаях.
Для непосредственной записи информации в нетипизированный файл используется оператор blockwrite.
Общий вид данного оператора следующий:
blockwrite (имя_переменной1. имя_переменной2, п);
где имя_переменной! — имя файловой переменной; имя_переменной2 — имя вспомогательной переменной, из которой данные передаются в файл; п — количество элементов, в которые записывается информация за одно обращение к нетипизированному файлу. Значение п должно быть целого типа.
Пример использования данного оператора:
blockwrite(unt,у,1);
где unt— файловая переменная, у— вспомогательная переменная (может относиться к любому из обычных типов), 1 — данный оператор обрабатывает один элемент.
Чтение информации из файла производится оператором blockread. Общий вид данного оператора:
blockread (имя_переменной1, Р1мя__переменной2, п);
где имя_перемениой 1 — имя файловой переменной; имя_переменной2 — имя вспомогательной переменной, в которую передаются данные из файла; п — количество элементов, из которых считывается информация за одно обращение к нетипизированному файлу. Значение п должно быть целого типа.
Нетипизированные файлы удобно использовать для долговременного хранения результатов работы программ. Эти результаты могут включать в себя как численные величины, так и тексты, комментирующие их содержание. Модифицируем уже знакомую нам по разд. 8.1 программу решения квадратичного уравнения таким образом, чтобы как вводимые пользователем исходные данные, так и получающиеся при решении уравнения результаты, а также поясняющие их тексты передавались в нетипизированный файл, находящийся в другом каталоге, откуда в случае необходимости их можно было бы прочитать. Текст модифицированной программы приведен в листинге 9.5.
Листинг 9.5. Программа, записывающая результаты решения квадратного уравнения в нетипизированиы й файл
program qwurrez;
Uses Crt;
var
r:file; a,b,crd,xl#x2:real; k,x:string;
begin
Cirscr;
assign(r,*d:\TP7\rez*);
writein(1Введите коэффициенты уравнения1);
writein(*После ввода очередного коэффициента нажимайте Enter1);
writein(*Введите а');
readln(а);
writeIn(1Введите b*);
readln(b);
writein(* Введите с');
readln(с);
к:=*Коэффициенты уравнения*;
d:=b*b-4*3*c;
if d>=0 then
begin
xl:«(-b-sqrt (d)) / (2*a);
x2:=(-b+sqrt(d))/(2*a);
x: = 'Корни уравнения *;
rewrite(г);
blockwrite(r,k,1);
blockwrite(r,a,1);
blockwrite(rz b,1);
blockwrite(r,c,1);
blockwrite(r,x,1);
blockwrite(r f xl#1);
blockwrite(r,x2,1);
writein(*Ввод данных в файл завершен *);
close(г)
end
else writein(*Уравнение не имеет решения *);
readln;
end.
В начале модифицированной программы, названной qwurrez, с помощью процедуры assign файловой переменной г "назначается" нетипизированный файл rez, находящийся на логическом диске D: в каталоге ТР7. Затем по уже известному нам алгоритму решается квадратичное уравнение ах2 + 6х + с = 0. В том случае, если уравнение имеет решение, файл rez открывается для записи процедурой rewrite. Если файла с таким именем на диске не существовало, то он будет создан данной процедурой.
Далее в этот файл с помощью операторов blockwrite производится передача данных из текущей программы. Вначале в файловую переменную г передается текстовая строка, содержащаяся в переменной к. Эта строка поясняет, что далее в эту файловую переменную, т. е. в итоге в типизированный файл rez, будут передаваться исходные данные для решения задачи ——коэффициенты уравнения. Эти коэффициенты передаются в файловую переменную из веще-
ственных переменных а, ь и с. Затем в переменную г пересылается из строковой переменной х текстовая строка, в которой сообщаегся о том, ит。далее в файл будут записаны результаты решения задачи — найденные в программе корни уравнения. Эти корни находятся в вещественных переменных х1 и х2 и таюке передаются с помощью соответствующих операторов blockwrite в файловую переменную. По окончании передачи данных оператором writein на экран компьютера выводится сообщение об этом. Завершается процесс записи в файл, как и всегда, оператором close. В случае же, если уравнение не имеет решения, процесс создания файла с последующей записью в исго данных не происходит. Результаты работы программы приведены на рис. 9.5.
Рис. 9.5. Результаты работы программы записи итогов решения квадратного уравнения в нетипизированный файл
Созданный в результате работы нетипизированный файл обладает тем же недостатком, что и типизированные файлы: его нельзя прочитать обычным текстовым редактором. Поэтому, для того чтобы проконтролировать правильность создания и заполнения информацией текстового файла, необходимо создать еще одну программу, которая позволяла бы прочитать текст созданного предыдущей программой файла rez с выводом его содержимого на экран компьютера. Эту контролирующую функцию и выполняет программа rezread, текст которой приведен в листинге 9.6.
j Листинг 9.6. Программа, считывающая данные из нетипизированного файла j
program rezread;
Uses Crt;
var r:file; x:real; k:string;
begin
Clrscr; assign(r,*d:\TP7\rez*); reset(r);
blockread(rr kr1); write(k, 1 *);
blcckread(rzx,1); write(x:7:2f1 •); blockread(r,xr1); write(x:7:2f1 1); blockread(r,xf1); write{x:7:2,1 •); writein;
blockread(rr k,1); write(k, * •); blockread(r,x,1); write(x:7:2r•"); blockread(rrxr1); write(x:7:2Z• •);} close(r);
readln end.
Уже на первый взгляд заметно, что в данной программе используется меньшее количество переменных, чем в предыдущей. Это обстоятельство объясняется тем, что если запись информации в программе qwurrez производилась нз 7 различных переменных вещественного н строкового типа, то для чтения информации из созданного предыдущей программой файла нам понадобятся всего две вспомогательные переменные: одна строкового типа и одна —— вещественного. Следует обратить внимание на то, что каждая из этих переменных будет использована в программе несколько раз. Если бы все данные, содержащиеся в файле, были одного типа, то можно было бы обойтись вообще одной вспомогательной переменной, но в данном случае в нетипизированном файле содержатся данные двух разных типов, что и требует наличия для каждого типа своей переменной. Как видно из раздела описаний программы, помимо вспомогательных переменных в программе используется еще только одна переменная — файловая переменная г.
В начале основной части программы эта файловая переменная связывается с типизированным файлом rez. Затем файл открывается для чтения процедурой reset. Сами операции чтения информации из файла с передачей ее в соответствующую по типу вспомогательную переменную производятся операторами blockread, а последующий вывод значения переменной на экран ——операторами write. Вывод информации на экран производится в две строки. В первой строке в ее начале посредством строковой переменной к выводится поясняющий текст, а затем с помощью вещественной переменной х по одному выводятся три коэффициента уравнения, т. е. данная строка содержит начальные условия задачи. Далее с помощью пустого оператора write in осуществляется перевод на следующую строку. Во вторую строку выводятся результаты решения задачи: сперва текстовый комментарий, а затем два по-
следи их элемента файла rez— корни квадратичного уравнения. Для вывода информации в эту строку используются те же переменные, что и для первой. Закрыть файл нужно в обязательном порядке и после операций чтения.
Turbo PascalTurbo Pascal18即*理^市尊垣而^^ggpj^^^Ha^E鸣斷T®*王[fIprngrdE rezread;'h“ Crt;var r:tile; x:re^l; kzstring;18即*理^市尊垣而^^ggpj^^^Ha^E鸣斷T®*王[fIprngrdE rezread;'h“ Crt;var r:tile; x:re^l; kzstring;beginClrscr; dssign(ra *d:\tp7\rc2*);beginClrscr; dssign(ra *d:\tp7\rc2*);rv^r1( г); blockread(r,k,1); blo£krcad(r,x,1); blockread(r.x,1); bluvkrradCr,x,1); write In;b lockreAtK r,k,1); bloukr?dd(r,xt1); blockrcdd(r.x.l); closefr】:rv^r1( г); blockread(r,k,1); blo£krcad(r,x,1); blockread(r.x,1); bluvkrradCr,x,1); write In;b lockreAtK r,k,1); bloukr?dd(r,xt1); blockrcdd(r.x.l); closefr】:wr ile(k,' write(x: / wr i t e(x : 7 wr11 e(x:7wr ile(k,' write(x: / wr i t e(x : 7 wr11 e(x:7wr itc<k,*wr itc<k,*•>;•>;к:7:2/ *к:7:2/ *wrilr(x:7:2,* *)wrilr(x:7:2,* *)66Рис. 9.6. Программа чтения данных из нетипизированного файла (а) и результат ее работы (б)Рис. 9.6. Программа чтения данных из нетипизированного файла (а) и результат ее работы (б)
Turbo Pascal
Turbo Pascal
18即*理^市尊垣而^^ggpj^^^Ha^E鸣斷T®*王[f
IprngrdE rezread;'
h“ Crt;
var r:tile; x:re^l; kzstring;
18即*理^市尊垣而^^ggpj^^^Ha^E鸣斷T®*王[f
IprngrdE rezread;'
h“ Crt;
var r:tile; x:re^l; kzstring;
begin
Clrscr; dssign(ra *d:\tp7\rc2*);
begin
Clrscr; dssign(ra *d:\tp7\rc2*);
rv^r1( г); blockread(r,k,1); blo£krcad(r,x,1); blockread(r.x,1); bluvkrradCr,x,1); write In;
b lockreAtK r,k,1); bloukr?dd(r,xt1); blockrcdd(r.x.l); closefr】:
rv^r1( г); blockread(r,k,1); blo£krcad(r,x,1); blockread(r.x,1); bluvkrradCr,x,1); write In;
b lockreAtK r,k,1); bloukr?dd(r,xt1); blockrcdd(r.x.l); closefr】:
wr ile(k,' write(x: / wr i t e(x : 7 wr11 e(x:7
wr ile(k,' write(x: / wr i t e(x : 7 wr11 e(x:7
wr itc<k,*
wr itc<k,*
•>;
•>;
к:7:2/ *
к:7:2/ *
wrilr(x:7:2,* *)
wrilr(x:7:2,* *)
6
6
Рис. 9.6. Программа чтения данных из нетипизированного файла (а) и результат ее работы (б)
Рис. 9.6. Программа чтения данных из нетипизированного файла (а) и результат ее работы (б)
Задания для самостоятельной работы
Задание 1. Составьте программу, которая создает на дискете текстовый файл, записывает в него построчно информацию (количество строк заранее неизвестно, а признаком окончания ввода является ввод в конце очередной строки символа *) и подсчитывает количество строк, содержащихся в этом файле.
Задание 2. Дополните предыдущую программу таким образом, чтобы она в конец текстового файла дописывала информацию об имеющемся в файле количестве строк (включая последнюю строку с данными о количестве строк).
Задание 3. Составьте программу, которая создает на дискете типизированный файл, содержащий п целочисленных элементов (количество элементов пользователь вводит с клавиатуры), записывает в файл п чисел, введенных пользователем, и подсчитывает сумму элементов, содержащихся в этом файле, а затем добавляет в файл еще один элемент — подсчитанную сумму. Для контроля правильности ввода данных предусмотреть в программе вывод всех данных из файла на экран компьютера.
Задание 4. Составьте программу, которая создает на дискете нетипизиро- ванный файл, содержащий следующую введенную пользователем информацию о прочитанной им книге: номера глав и названия этих глав, причем номера должны записываться в файл как целочисленные элементы, а названия —— как строковые. Количество глав в прочитанной книге пользователь вводит с клавиатуры. Для контроля правильности вводимых данных следует вывести содержимое файла на экран компьютера, причем номер и название каждой главы должны выводиться в отдельной строке.
ГЛАВА 10
Пользовательские типы данных в Паскале
В ходе создания различных программ на языке Паскаль мы уже познакомились с самыми различными типами данных, которые используются для описания констант, переменных, значений функций. Эти типы, как читатель уже имел возможность убедиться, весьма многочисленны и разнообразны. В программах можно встретить числовые типы, как целые, так и вещественные, символьный и строковый типы, используемые для работы с текстовой информацией, логический тип данных, специальные типы, созданные для описания файловых переменных.
Однако перечисленными типами не исчерпываются возможности Паскаля. Свобода творчества программиста в данном отношении не ограничивается рамками уже существующих в языке типов, т. к. на их базе можно создавать новые, "авторские” типы данных, которые впоследствии можно с успехом применять для решения многих задач. О том, какими могут быть эти нестандартные типы данных, для чего они применяются, как их создавать и рабо- татъ с ними рассказывается в данной главе.
Перечисляемый тип данных
Если программист хочет создать свой собственный тип данных, то один из способов создания заключается в том, чтобы перечислить все возможные значения, которые могут принимать переменные, относящиеся к данному типу. Такой тип данных и получил соответствующее название— перечисляемый.
Для того чтобы создать подобный тип данных, его следует описать в программе в разделе описаний перед описанием переменных, т. к. среди переменных, которые далее будут описаны, могут быть и переменные нового.
"авторского” типа. Описание нового перечисляемого типа, в общем виде, выглядит следующим образом:
type имя^типа -{значение!, значение2, ... значение л);
где type — служебное слово, в переводе с английского означающее "тнп"; имя_типа—ИМЯ ВНОВЬ создаваемого типа; значение!, значение2, ... значение п— перечень возможных значений для переменных нового типа (всего таких значений п).
Пример описания нового типа:
type week=(Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday);
Данный тип имеет название week (что по-английски означает "неделя"). Переменные этого типа могут принимать всего 7 значений. Эти значения являются английскими названиями дней недели. Описание переменной, относящейся к данному типу, будет выглядеть следующим образом:
var ned:week;
е. переменная с именем ned относится к типу week. Переменная ned (как и все переменные, относящнеся к перечисляемым типам) может принимать только значения, указанные в описании типа, к которому она относится. В нашем случае эта переменная может принимать значения Monday. Tuesday или Wednesday, но не может принимать, напрнмер, значение Day (по английски —"день”).
К недостаткам переменных перечисляемого типа следует отнести то, что их нельзя использовать в операторах ввода-вывода. При этом, однако, их можно использовать в ряде других операторов (в частности, в условных операторах и операторах присваивания). Переменная перечисляемого типа может использоваться в качестве переменной-селектора в операторе case. Преимущества же использования переменных перечисляемого типа следующие: во- первых, использование таких переменных в ряде случаев делает программу более наглядной; во-вторых, используя переменные такого типа, легче защитить программу от неправильного ввода данных, что мы и продемонстрируем на следующем примере.
Пользователям персональных компьютеров хорошо известно, что большинство компьютеров в нашей стране собирается из импортных комплектующих. Из-за рубежа привозится большая часть эксплуатируемых у нас материнских плат, мониторов, принтеров н т. д. Естественно, что такие устройства зачастую не имеют даже инструкций, составленных на русском языке. Отечественным пользователям приходится разбираться в документации, написанной чаще всего по-английски.
Даже людям, хорошо владеющим английским языком, бывает непросто разобраться в технической терминологии, поэтому желательно под рукой иметь
словарик по вычислительной технике, в котором содержались бы наиболее употребительные термины из данной области. Такой словарь, созданный средствами языка Turbo Pascal, можно хранить в памяти вашего компьютера в виде программного файла. Достаточно ввести с клавиатуры интересующий вас термин на английском языке, чтобы получить его русский эквивалент. Программу, решающую данную задачу, назовем vocab (сокращение от английского vocabulary——"словарь"). Текст программа приведен в листинге 10.1.
Листинг ЮЛ. Программа^ создающая англо-русский словарь•';鼻
пе вычислительной техникоЧ沱需 4 0二.:炉 績*•‘端:^?.'胃…沿吋丁除;胃
program vocab;
Uses Crt;
type
sl=(error,main,key,mouse,hard,soft,user,power,cpu,sock,freq);
var
wrd:sl; term:string;
begin
ClrScr;
writeIn(*Введите термин•);
readln(term);
if term=,mainboard' then wrd:==main;
if term^1 keyboard' then wrd:^key;
if term=*mouse* then wrd:=mouse;
if term-'hardware1 then wrd:-hard;
if term^ * software * then wrd:=soft;
if term^'user1 then wrd:=user;
if term=*power* then wrd:=power;
if terras*cpu* then wrd:=cpu;
if term=*socket * then wrd:-sock;
if term=1 frequency1 then wrd:^freq;
case wrd of
main: writein(1материнская плата');
key: writein(,клавиатура *);
mouse: writein(,мэ1шь ');
hard: writeIn(* аппаратура *);
soft: writein(* программное обеспечение■);
user: writein(* пользователь *);
power: writein('питание');
cpu: writein{1центральный процессор*);
sock: writein(•разъем1);
freq: writein(•частота');
error: writein(1Такого термина в словаре нет*) end;
readln end.
/
В данной программе перед разделом описания переменных описан новый тип данных si. Переменные данного типа могут принимать значения, представляющие собой англоязычные термины из области вычислительной техники (в ряде случаев в сокращенном виде). В случае же, если переменной данного типа не присваивается в программе никакое значение, то она получает по умолчанию первое по порядку из ряда значений, перечисленных в описании типа. В нашем случае таким значением по умолчанию будет значение error (по-английски ——мошибка"). Почему именно это значение было сделано первым, станет ясно из дальнейшего описания программы. В разделе описания переменных имеется переменная wrd, относящаяся к созданному в программе типу si. Кроме того, в том же разделе описывается вспомогательная переменная term строкового типа.
В основной части программы после соответствующего приглашения на ввод во вспомогательную переменную term заносится с клавиа^ры какой-либо термин. Затем в программе следует ряд условных операторов, каждый из которых проверяет, соответствует ли введенное слово одному из терминов, содержащихся в нашем электронном словаре. Если такой термин находится, то переменной-селектору wrd присваивается соответствующее значение из перечисленного ряда. Это значение используется в операторе case. В зависимости от значения переменной-селектора одна из ветвей зтого оператора выводит на экран компьютера русскоязычный термин, соответствующий англоязычному. Например, при вводе слова mainboard будет выдан его перевод — "ма・ теринская плата**, для слова frequency — "частота" и т. д.
Если же пользователь сделал ошибку при вводе термина или ввел тот термин, который отсутствует в словаре, то переменная-селектор сохранит свое первоначальное значение — error. В этом случае оператор case осуществит выдачу сообщения:
Такого термина в словаре нет.
Конечно, можно было бы в качестве значений переменной-селектора указать и целые числа (I, 2, 3 и т. д.) и использовать их в условном операторе, но тогда программа лишилась бы в значительной степени своей наглядности.
На рис. 10.1 показана данная программа во время работы.
Данную программу несложно дополнить, добавив в нее переводы каких-либо новых терминов. Эту операцию можно провести в три этапа.
Рис. 10.1. Программа мАнгло-русский словарь по вычислительной технике" во время ее работы
Вставить английский термин, перевод которого вы хотите добавить, в перечень значений типа si (можно в сокращенном виде).
В основную часть программы добавить новый условный оператор if, в котором проверяется равенство вспомогательной переменной term данному термину (обязательно приведенному в полном виде), а переменной- селектору wrd в случае равенства присваивается значение, вставленное в список значений si.
В оператор case вставить новую ветвь, в которой оператором writein выводится русский перевод данного термина.
Теперь в вашем электронном словаре появится перевод еще одного слова.
Ограниченный тип данных
При решении ряда задач из области программирования бывает удобно на основе уже существующего типа данных создать новый, который может принимать только строго определенный ряд значений. Например, оценка, выставленная учащемуся за контрольную или экзамен, является целым числом, но переменная, которой будет присвоено значение-оценка, может принимать далеко не все значения из ряда целых чисел. Во-первых, оценка не может быть отрицательным числом или нулем. Во-вторых, она не может быть больше 5. Поэтому было бы удобно отнести переменную для оценки к особому типу данных, который может принимать только значения 1, 2, 3, 4, 5. Такой тип данных называется ограниченным.
Основой для создания ограниченного типа данных может быть не любой стандартный тип данных, а только порядковый. Порядковыми называются такие типы данных, в которых для каждого данного можно указать предыду-
щее или последующее (либо то н другое вместе). К порядковым типам данных относятся в частности типы integer, longint, char, boolean, а также перечисляемый тип данных. В качестве ряда значений для ограниченного типа данных и берется какой-либо отрезок одного из порядковых типов. Такой ряд должен иметь начальное и конечное значение. Порядковый тип, на основе которого создается перечисляемый, является для вновь создаваемого типа базовым.
Общий вид описания ограниченного типа:
type имя_типа = диапазон;
где type— служебное слово; диапазон——диапазон возможных значений, которые могут принимать переменные и константы этого типа.
Примеры описания ограниченных типов данных:
type mark=l..5;
Базовым здесь является тип integer. Значениями переменных типа mark могут быть только целые числа от 1 до 5.
type latino*а*..*z*;
Для данного типа базовым является тип char. Значениями переменных такого типа могут быть только строчные буквы латинского алфавита.
type weekend=Friday..Sunday;
Для зтого типа базовым является перечисляемый тип ned, описанный в предыдущем разделе. Значениями переменных типа weekend могут быть только переменные Friday, Saturday И Sunday.
Соответственно используемые в программе переменные данных типов будут описаны таким образом:
otmetka:mark;
bukva:latin;
day:weekend;
Над переменными ограниченного типа можно выполнять все те же арифметические и логические операции, что и над переменными соответствующего базового типа.
Ограниченные типы данных удобно использовать в программе для контроля вводимых данных. Например, в программе переменная bukva должна принимать только значения букв латинского алфавита. Пользователь же ошибочно присвоил данной переменной значение русской буквы ис" вместо латинской "с" (такая ошибка часто встречается, т. к. эти буквы расположены на одной
клавише). В этом случае при компиляции сразу будет выдано сообщение об ошибке.
Разберем использование данных ограниченного типа на следующем примере. Нам уже известна задача нахождения факториала целого числа. Факториал представляет собой геометрическую прогрессию, значение которой с увеличением исходного числа возрастает очень быстро. Но если мы возьмем программу вычисления факториала и введем в качестве исходного значения число 40, то получим результат, равный нулю» т. е. результат явно ошибочный. В чем заключается причина того, что правильно составленная программа выдает неправильный результат? Оказывается дело в том, что при вводе достаточно больших исходных значений происходит переполнение ячеек памяти, отведенных для результата, что н приводит к ошибке. Причем это будет происходить не только, если мы опишем переменную, содержащую результат, как переменную типа integer, но и для переменной типа longint.
Для того чтобы избежать этой ошибки, следует сделать переменную, которой присваивается исходное значение» переменной ограниченного типа. Создадим в программе специальный ограниченный тип данных ogr, который может принимать только значения мз диапазона от 1 до 12. К этому типу отнесем переменную п, в которую вводится исходное значение. Тогда для указанного диапазона программа будет выдавать правильные значения, а при попытке ввести слишком большое значение компилятор прямо выдаст сообщение об ошибке. В листинге 10.2 приведен текст программы, а на рис. 10.2— результат ее работы.
program ftrl;
Uses Crt;
type ogr=1..12;
var fzi:longint;
n:ogr;
begin
ClrScr;
f:=l;
writein('Введите число');
readln(n);
for i:=l to n do
f:=f*i;
writein('Факториал числа ',n,' равен 'r f); readln end.
Рис. 10.2. Усовершенствованная программа вычисления факториала (а)Рис. 10.2. Усовершенствованная программа вычисления факториала (а)и результат ее работы (б)и результат ее работы (б)
Рис. 10.2. Усовершенствованная программа вычисления факториала (а)
Рис. 10.2. Усовершенствованная программа вычисления факториала (а)
и результат ее работы (б)
и результат ее работы (б)
Прмменанме )
Возможна ситуация, когда вы использовали в программе ограниченный тип данных, а программа все-таки ипроглатываети значения, которые выходят за границы его диапазона. Например, в программе вычисления факториала вводим исходное значение 20, а программа производит расчеты с выдачей естественно неправильного результата. Тогда нужно настроить компилятор среды Turbo Pascal таким образом, чтобы он автоматически контролировал значения переменных ограниченного типа.
Для этого нужно войти в раздел меню Options, в нем щелкнуть пункт Compiler, в открывшемся диалоговом окне найти группу флажков Runtime errors и в этой группе установить флажок Range checking, а затем щелкнуть экранную кнопку ОК для подтверждения сделанных настроек. В результате такой последовательности действий включится контроль значений переменных ограниченного
типа. Если все же режим работы компилятора не изменится, то следует выйти из системы программирования и запустить ее снова, после чего новые настройки компилятора вступят в силу.
Записи
В предыдущих главах мы уже познакомились с массивами, которые позволяют работать с большими объемами информации. Но информация, содержащаяся в массиве, должна состоять из однородных элементов. На практике же часто приходится сталкиваться с задачами, которые сводятся к обработке разнородной информации. В качестве примера возьмем работу отдела кадров какого-либо предприятия, в котором нужно обрабатывать анкеты сотрудников данного предприятия. Каждая из таких анкет содержит различные данные о сотруднике: фамилию, имя и отчество сотрудника, год и место рождения, пол, образование, общий стаж работы, стаж работы на данном предприятии, занимаемая должность и т. д.
Если перед программистом стоит задача автоматизировать процесс обработки этих анкет, то он столкнется с тем, что ему нужно будет создать некую структуру, состоящую из ряда элементов, каждый из которых в свою очередь содержит данные различных типов. Рассмотрим один такой элемент——данные о сотруднике предприятия Иванове Петре Сергеевиче, 1960 года рождения, уроженце Санкт-Петербурга, имеющем высшее образование, общий стаж работы которого составляет 20 лет, в том числе 10 лет на данном предприятии, который работает в настоящее время инженером. Для фамилии, имени, отчества, места рождения, образования понадобятся переменные строкового типа:
fam, im, otch,mestorobr: string;
где в данном случае: fam : = * Иванов*; 11л: = 'Петр‘; otch: ^ * Сергеевич •; mes to: = *Санкт-Петербург•; obr:^'высшее *;.
Для пункта анкеты "пол" можно использовать переменную символьного типа, т. к. для указания пола хватит одной буквы:
pol:char;
в нашем случае ро1:='м';・
Для работы с данными о годе рождения, общем стаже работы и стаже на данном предприятии нужны будут переменные целого типа:
god.stob,stpr:integer;
「де в нашем случае god: =1960; stob:=20; stpr:=i。;.
Если же в анкете для специалистов с высшим образованием имеется, например, дополнительный пункт о среднем балле в дипломе, то придется ввести
8 Зак 1068
еще одну переменную вещественного типа (т. к. средний балл является, как правило, дробным числом)
ball:real;
для инженера Иванова, имеющего средний балл 4,78: ball:=4.78;.
Естественно, что аналогичный набор данных разного типа будет в анкете у каждого сотрудника, работающего на предприятии. Для описания такого набора будет нужен специальный тип данных. Такой тип существует в языке Паскаль и называется записью. Запись состоит из ряда полей. Каждое поле представляет собой элемент записи, имеющий свой конкретный тип. Описание поля в общем виде выглядит следующим образом:
type ^иля_зап = record имя_поля1: тг^поля1; 1лмя_поля2: тип_поля2丿
имя_поля_п: тип^папя^п/ end;
где type, record и end — служебные слова (record в переводе с английского и означает "запись"); имя_зап——общее имя записи; ммх_поля— имя одного из полей, составляющих запись. Всего запись содержит п полей.
Возвращаясь к нашему примеру, можно сказать, что описание записи с анкетными данными по какому-либо сотруднику будет выглядеть следующим образом:
type anketa=record
god,stob.str:integer;
ball:real;
pol:char;
fam,im,otch,mesto,obr:string; end;
т. e. здесь приведена запись, имеющая имя anketa, содержащая 11 полей, относящихся к 4 различным типам. Из приведенного примера видно, что, как и в случае с описанием обычных переменных, однотипные поля можно перечислять через запятую, а после двоеточия указывать их общий тип.
Некоторые из полей, входящих в состав записи, могут в свою очередь сами быть записями, содержащими ряд полей. В частности, если в нашем примере в анкете требуется указать не просто год рождения, а точную дату рождения, включающую день, месяц и год, то эту информацию можно представить в виде записи date, содержащей поля den, mes и gr. В данном случае для описания даты и года употребим целый тип* а для месяца ——строковый.
Таким образом, описание записи date будет выглядеть следующим образом:
date:record
den, gr:integer;
mes:string;
end;
причем вся эта структура является составной частью более крупной структуры anketa. Естественно, что в этом случае поле god, содержавшее в записи anketa год рождения, становится ненужным. Теперь измененная запись будет выглядеть следующим образом:
type anketa«record
stob,stpr:integer;
ball:real;
pol:char;
fam, imr otch, mesto, obr: string;
date:record
den. gr:integer;
mes:string;
end;
end;
В данном варианте записи присутствуют два служебных слова еп“ причем первый из них закрывает запись date, а второй всю запись anketa в целом. В свою очередь запись anketa может быть элементом массива либо типизированного файла. Например, массив otdei, содержащий элементы, оформленные в виде записей анкеты сотрудников одного из отделов организации, будет описываться в программе в разделе переменных следующим образом:
var otdel:array[1..n] of anketa;
Данный массив содержит информацию о п сотрудниках отдела. Каждая запись будет содержать в общей сложности 10 полей, причем 9 полей являются простыми, а одно также является записью, содержащей 3 поля. Таким образом, с помощью типа "запнсь" можно создавать весьма сложные информационные структуры.
Информацию же обо всех сотрудниках организации можно поместить в случае необходимости в специальный типизированный файл kadry. Описание файловой переменной kad, связанной в программе с файлом kadry, будет выглядеть так:
var kad: file of anketa;
К такому типизированному файлу применимы все те же операции, что и к типизированному файлу, содержащему простые элементы. Естественно, что
в разделе описаний описание самой записи должно предшествовать описанию того массива или файловой переменной, которые включают в себя данную запись.
В программах на языке Паскаль можно работать не только со всей записью в целом, но и производить определенные действия над отдельными полями (присваивать им значения, выводить эти значения на экран компьютера, сравнивать однотипные поля и т. д.). Обращение к полю в общем виде производится следующим образом:
имя_зап. 11мя_поля
Например, если инженер П. С. Иванов отработал в данной организации еще год после занесения его данных в компьютер, и нужно прибавить этот год к его стажу, то это можно сделать следующими операторами: anketa.stob:^21;(для общего стажа)
anketa.stob:==n;(для стажа на данном предприятии)
Если же требуется в запись поместить данные о точной дате рождения сотрудника (например, 22 августа 1960 года), то соответствующие операторы присваивания будут выглядеть так:
anketa.date.den: =22; (ДЛЯ ДНЯ рождения)
anketa. date.mes: = * август';(для месяца рождения)
anketa .date.gr: =1960; (для года рождения)
Рассмотрим способы работы с записями на примере практической задачи (рис. 10.3). Создадим электронный телефонный справочник, в который пользователь сможет заносить следующие данные о своих родственниках, друзьях, знакомых, коллегах по работе: их фамилии, имена, номер телефона, домашний адрес. Далее по введенной фамилии пользователь сможет получать из справочника необходимую ему информацию: телефон и адрес. Первая часть этой задачи решаегся с помощью программы, текст которой приведен в листинге 10.3.
Листинг 10.3. Программа, заносящая данные в телефонный справочник
program telefon;
Uses Crt;
type punkt^record
fani: string; name: string; nomer:string; adres: string;
end;
var abon:file of punkt; v:punkt; k:char;
begin
Clrscr;
assign(abon.'D:\obuch\sprav*);
reset(abon);
if ioresultoO then rewrite (abon);
repeat
writeIn(1Введите фамилию абонента');
readln(v.fam);
writein(*Введите имя абонента1);
readln(v.name);
writein(введите номер телефона абонента1);
readln(v.nomer);
writein(* Введите адрес абонента *);
readln(v.adres);
write (abon, v);
writeIn(1Будете продолжать ввод данных? (Д/Н)•); readln(к)
until к= * Н *;
readln
end.
В разделе описаний программы вначале описывается вновь создаваемый тип punkt, представляющий собой запись, содержащую 4 поля: для фамилии, имени, телефона и адреса, заносимых в справочник абонента. Каждое из перечисленных полей относится к строковому типу. Затем в разделе переменных описывается файловая переменная abon. В связанном с ней типизированном файле sprav будут содержаться элементы типа punkt. Вспомогательная переменная v также относится к типу punkt. Еще одна вспомогательная переменная к является переменной строкового типа.
Далее в основной части программы после процедуры связывания файл sprav открывается процедурой reset для операций записи и чтения. В случае же, если такого файла на диске не существует, он создается заново. Для проверки факта существования файла используется встроенная функция языка Паскаль ioresult. Данная функция используется для контроля за осуществлением операций ввода-вывода при работе с файлами (в том числе открытия и закрытия файла). Значением этой функции является целое число. В случае если операция ввода-вывода была проведена успешна, функция ioresult принимает нулевое значение. В нашей программе после операции открытия файла и производится проверка на равенство или неравенство значения этой функции нулю. Если значение ioresult равно нулю, то операция открытия файла прошла успешно, и, следовательно, такой файл уже существует. Если же значение функции не равно нулю, то, вероятно, такого файла на диске нет и его нуЖНО СОЗДаТЬ командой reset.
Рис. 10.3. Программа, создающая телефонный справочник и заполняющая его данными (в), и результат ее работы (6)
После осуществления проверки можно переходить непосредственно к операциям ввода данных в файл. Процесс ввода представляет собой тело цикла repeat.. .until. В теле цикла после соответствующей подсказки, выводимой оператором writein, пользователь вводит фамилию, имя, телефон и адрес добавляемого в справочник абонента. Информация по каждому из указанных ранее пунктов оператором readln передается в соответствующее поле вспомогательной переменной v. Затем, после того как всем полям переменной- записи V присвоены значения, вся эта запись целиком передается в типизиро-
ванный файл sprav посредством записи в связанную с ним файловую переменную abon. Потом программа запрашивает пользователя, будет ли он продолжать ввод данных. Полученный ответ, которым должна быть буква или "Н* присваивается символьной переменной к. В завершающей строке цикла производится проверка условия его завершения. Этим условием является равенство значения переменной к букве ”Н"・ Таким образом можно за один сеанс работы с программой ввести данные на нескольких человек.
Программа teisprav производит считывание информации из типизированного файла sprav, который был создан н заполнен информацией с помощью предыдущей программы. В разделе описаний программы описывается уже знакомый нам тип punkt, а также файловая переменная abon типа punkt, переменная целого типа i и переменная строкового типа fff. Текст программы приведен в листинге 10.4.
恒胃^^.帮胸^碱遇碗蒞疑^^ 戀^^^彳笥編鱸騷痛卷即騷尹笠 q program teisprav;
Uses Crt;
type punkt*= record
fam: string; name: string; nomer:string; adres:string;
end;
var
abon:file of punkt; v:punkt; i:integer; fff:string; begin
Clrscr;
assign(abonr *D:\obuch\sprav*);
reset(abon);
i:=0;
writein (* Укажите фамилию абонента *);
readln(fff);
repeat
seek(abon.i);
read (abon, v);
i:®i+l;
if V.fam-fff then begin writein (* абонент \ v. fam, • • f v.name); writein (1 проживает по адресу ■ • v・ adres); writein(1телефон абонента •, v.nomer) end;
until eof(abon);
readln
end.
Основная часть программы начинается со связывания файловой переменной с внешним файлом sprav и открытия этого файла для чтения. Далее, после вывода на экран соответствующей подсказки, пользователь должен ввести фамилию абонента, по которому нужна справка. Эта фамилия считывается в переменную fff. Затем по введенной фамилии производится поиск информации, представляющей собой запись ——элемент типизированного файла.
Как и в предыдущей программе, для организации процесса используется цикл repeat.. .until, но содержание тела цикла здесь иное. Сам поиск осуществляется с помощью уже знакомой нам процедуры seek. Поиск ведется, начиная с нулевого элемента (поэтому параметру процедуры i, соответствующему номеру элемента, еще до начала работы цикла было присвоено нулевое значение). Значение каждого i-го элемента типизированного файла по очереди присваивается вспомогательной переменной-записи v. Затем в условном операторе if производится сравнение того из полей переменной v, которое соответствует фамилии (v.fam) с искомым значением, содержащимся в переменной fff. Если эти величины совпадают, то на экран компьютера операторами writein выводится содержимое всех полей, имеющихся в данной записи: фамилия, имя, телефон и адрес абонента, т. е. интересующая пользователя информация. Работа программы, однако, на этом не заканчивается, т. к. чтение и сравнение информации, содержащейся в элементах файла, будет продолжаться до тех пор, пока в ходе этой процедуры не будет обнаружен конец файла (eof). После обнаружения конца файла завершается работа цикла, а затем и работа программы. Таким образом, если в вашем справочнике имеется несколько однофамильцев, то по всем этим людям будут найдены н внве- дены их данные. Пример работы программы показан на рис. 10.4.
Рис. 10.4. Результат работы программы "Телефонный справочник"
Возвращаясь к тому примеру, с которого мы начали этот раздел, можно сказать, что аналогичным образом можно составить и программу, которая бы
создавала файл с данными по каждому из сотрудников организации и по введенному с клавиатуры запросу выдавала бы о нем всю необходимую информацию. Но в связи с тем, что в организации может быть достаточно большое количество сотрудников, среди которых может встретиться немало однофамильцев, поиск информации лучше производить по какому-либо другому параметру, который для каждого работающего в данной организации человека является уникальным. Таким параметром может служить, например, табельный номер сотрудника. В таком случае в запись с данными о сотруднике следует добавить еще одно поле целого типа, в котором и будет содержаться табельный номер.
Описание этого поля будет выглядеть так:
tabel:integer;
а присваивание ему значения так:
anketa.tabel:=4567;
Поле tabel и можно будет использовать в качестве ключевого, т. е. такого, по которому однозначно идентифицируется содержащая его запись.
Множества
При работе над различными задачами из области программирования часто возникает необходимость использования структур, которые представляют собой некий набор, состоящий из однородных элементов. При этом элементы данного набора не должны быть жестко закреплены в этой структуре в определенном порядке как в массиве или в типизированном файле, а могут компоноваться различным образом. Примером подобной структуры, с которой человек часто сталкивается в повседневной жизни, является набор букв того или иного языка. Для удобства изучения и использования в определенных целях (например, при создании справочников, энциклопедий, разного рода списков, ведомостей) буквы упорядочивают в виде алфавита, в котором за каждой буквой раз и навсегда закреплено строго определенное место. Алфавит, таким образом, представляет собой аналог массива. Но чаще буквы компонуют различным образом так, что из 33 букв кириллицы или 26 букв латинского алфавита, сочетая их по определенным правилам, можно создать деловое письмо и научный труд, техническую инструкцию и газетную статью, прозаический роман и поэму в стихах, и многое другое.
В программировании такая структура, состоящая из элементов одного типа, которые можно по-разному располагать, называется множеством. Общий вид описания переменной множественного типа в языке Паскаль следующий: var имя множества: set of тип;
где var и set ——служебные слова. Слово set в переводе с английского и означает "набор, множество11; имя_мнажества — имя создаваемого типа-множества, которое может дать по своему усмотрению программист; тип— один из уже существующих типов, к которому относятся элементы вновь создаваемого множества.
В качестве базового типа может выступать любой из порядковых типов (см, разд. 10.2). Если набор элементов множества представляет собой какой-либо отрезок значений одного из порядковых типов, то можно указать только начальное и конечное значение, а между ними поставить символ ". •"・ Если же элементы, составляющие множество, не идут подряд в базовом типе, то эти элементы нужно перечислить в скобках через запятую.
Приведем примеры описания множеств.
var triznak: set of 100..999;
Это множество натуральных трехзначных чисел. Базовый тип для данного множества — integer.
var prop: set of *A*..*£•;
Это множество прописных букв русского алфавита. Базовый тип— char. Описание множества строчных букв русского алфавита будет выглядеть сложнее, т. к. строчные буквы от *'ам до ”п" располагаются в одном месте расширенной кодовой таблицы, а буквы от "р" до "只“ 一в другом.
var с。叩on: set of (keyboard, motherboard, mouse, display)
Это множество устройств, входящих в состав персонального компьютера.
При описании множества необходимо учитывать два немаловажных момента. Во-первых, в описании элементы множества не должны повторяться. Во- вторых, если множество создается на базе числового типа данных, то значения элементов множества не должны быть с одной стороны отрицательными, а с другой — не превышать число 255.
Наряду с описанными ранее переменными типа "множество" в программах могут встречаться и постоянные множества. Элементы такого множества перечисляются в квадратных скобках: (1,2,3,4,5,6,7,8,9] —так будет выглядеть описание постоянного множества, состоящего из однозначных целых чисел. Множество может содержать несколько элементов, один элемент— [1] или вообще ни одного— []. В последнем случае множество называется пустым.
Над множествами, так же как и над обычными переменными, можно выполнять ряд операций. При этом нельзя забывать о том, что хотя некоторые из этих операций обозначаются так же, как арифметические, это особые операции, отличающиеся от обычных.
Операция, обозначающаяся знаком * (звездочка), хотя и описывается тем же значком, что и операция умножения, называется и осуществляется по- другому —пересечение двух множеств. Результатом выполнения этой операции над двумя множествами является нахождение их общих элементов, принадлежащих как одному, так и другому множеству. Например, если мы присвоим переменной типа "множество” а значение [20, зо, 40], что записывается в программе следующим образом:
А:=[20,30,40];
а переменной того же типа в присвоим значение [30,40,50], что записывается как
В:=(30,40,50];
то в результате операции с:=а*в; множество с получит значение [30,40].
Если при операции над двумя множествами используется знак +, то такая операция называется объединением двух гмножеств. Ее результатом будет множество, в которое входят все элементы, содержащиеся хотя бы в одном из исходных множеств. В качестве примера возьмем два множества: lat, значением которого будет [q,w,e,r,3y], и rus, значением которого будет [玄,и,у,к,е,н.「] (в качестве элементов данных множеств взяты буквы, составляющие название традиционной английской и русской раскладок клавиатуры компьютера). В результате операции latrus^iat+rus; множество latrus получит следующее значение: [q,wr е, г, tf yf й,ц,у, кх е,н, г].
Операция, обозначаемая знаком -, называется разностью двух множеств. В результате выполнения данной операции над двумя множествами мы получаем новое множество, содержащее те элементы первого, которые не входят во второе. Рассмотрим эту операцию на примере двух множеств: language и low. Первому нз этих множеств присвоим значение, представляющее собой перечень различных языков программирования, а второе представляет собой список только тех языков, которые не являются языками высокого уровня. К последним относится язык ассемблера и машинные коды. Операции при* сваивания будут выглядеть следующим образом:
language:=[basic,pascal,с,fortran,algol,assejnbler_language,machine_code]; low:=[assembler_language, machine_code];
Далее выполним операцию нахождения разности и результат присвоим множеству high:
high:=language~low;
В результате данной операции множество high получит следующее значение: [basiczpascal, с, fortran,algol], т. е. данное множество будет содержать перечень языков высокого уровня.
Наряду с описанными ранее операциями над множествами можно также производить сравнение множеств друг с другом. В сравнении также участвуют два множества. Для сравнения двух множеств используются операции отношения, которые обозначаются теми же знаками, что и операции сравнения обычных переменных, но имеют иной смысл. Результатом операции отношения является логическая величина, которая может принимать значения true или false. Рассмотрим более подробно данные операции.
=—равенство двух множеств (все элементы первого множества совпадают с элементами второго).
> —неравенство двух множеств (одно из множеств содержит хотя бы один элемент, отсутствующий в другом).
Пример использования данных операций: даны два множества g и н. Значение множества G—(4,5,6]. н также имеет значение (4,5,6]・ Для данных множеств результат операции сравнения G = н будет равен true, а операции G < > н будет равен false. В случае же, если мы множеству н присвоим другое значение— [6,7,8], a g оставим без изменения, то результат операции G = н будет равен faises а операции G < > н будет равен true.
—проверка на строгое вхождение первого множества во второе (т. е. все элементы первого множества должны одновременно входить во второе. Кроме того, второе множество должно содержать какие-либо дополнительные элементы).
=—проверка на нестрогое вхождение первого множества во второе (все элементы первого множества должны одновременно входить во второе. Помимо элементов первого множества второе множество может как содержать, так и не содержать какие-либо дополнительные элементы.).
—проверка на строгое вхождение второго множества в первое.
=—проверка на нестрогое вхождение второго множества в первое.
Пример использования операций вхождения: даны два множества к и L. Значение множества к равно [10,15,20], множества L— [10,15,20,25,30]. Результаты операций k<l и k<=l будут равны true. Результаты операций k>l и k>=l будут равны false. Присвоим множеству l новое значение [10,15,2。], значение к оставим без изменения. После выполнения операции присваивания результаты операций k<=l и k>=l будут равны true, а результаты операций K>L И K<L будут равны false.
При работе с множествами часто используется еще одна операция, в которой участвуют не два множества, а множество и какой-либо элемент. Такая one-
рация называется операцией определения прииадлелсности элемента множеству. Общий вид данной операции следующий:
элемент in [ зна чент^е_множества ];
где элемент— элемент, относящийся к базовому для данного множества типу; in— служебное слово, обозначающее в переводе с английского "в"; зна- чение_лшожества — список всех элементов, входящих в множество.
Операция имеет значение true, если элемент входит в данное множество (т. е. совпадает с одним из элементов множества), и false, если он в данное множество не входит.
Например, выражения d in [А. .Е) и 5 in【3,5,7,9] имеют значение true, а выражения D in [E..N] и 5 in [7,9,11] —значение false.
При осуществлении операций над множествами, так же как н при выполнении арифметических и логических операций над обычными переменными, соблюдается определенный приоритет.
Наибольшим приоритетом обладает операция *. Следующими по приоритету являются операции + н - . Наименьший приоритет имеют операции in,=, < >, <,<=,>,>=.
При необходимости изменить порядок выполнения операций над множествами, как и для обычных переменных, используют круглые скобки. Значение выражения, заключенного в скобки вычисляется в первую очередь.
Принадлежность каких-либо элементов к определенному множеству широко используется для различных статистических подсчетов. Рассмотрим работу с множествами на примере программы, которая для любого введенного с клавиатуры текста, написанного на русском языке, определяет количество имеющихся в нем гласных н согласных букв. Подобные программы могут, в частности, использоваться для исследований в области филологии. Текст программы приведен в листинге 10.5.
Листинг 10.5. Программа, подсчитывающая количество гласных и согласных букв в тексте
program filolog;
Uses Crt;
var gl,sog:integer; a:char;
begin
ClrScr;
gl:=0;
sog:=0;
writeln(1Вводите текст построчно. *);
write(*Ввод каждой строки заканчивайте нажатием клавиши Enter');
writeln(*Лля завершения ввода всего текста введите 0 и Enter*};
repeat
repeat
read(a);
if a in [*3*, 'e*, *и\ *o*, 'у*, *ы*, *э'r •ю*, *я*г
•A*, •£•, •И*, •О», ^У*, 'Ы', *Э\ *10\ ^1] then gl:=gl+l;
if a in [P‘•・'□',味',У','配・・'n\F‘,'p‘・・ У■,嘘'・・'щ‘,
'Е'・・'Д‘,'*','3・,'勿・」Н','П'・・・Т1'4'・・'1Ц'] then sog:=sog+l until eoln;
until a= * 01;
readln;
writeln(*Число гласных букв в тексте равно ',д工"
writeln(* Число согласных букв в тексте равно ’.sog);
readln
end.
В программе пользователь должен вводить текст построчно. Считывается же текст оператором read посимвольно. Процесс считывания символов, содержащихся в строке, производится во внутреннем цикле repeat.. .until. Каждый считываемый символ проверяется условным оператором if на принадлежность к множеству гласных букв. Если вводимый символ * принадлежит данному множеству, то значение переменной-счетчика gi увеличивается на единицу. (В начале программы переменной-счетчику было присвоено нулевое значение.) Второй условный оператор аналогичным образом проверяет принадлежность символа к множеству согласных букв. Переменной-счетчиком здесь является sog. Условием окончания внутреннего цикла является обнаружение признака конца строки. Нахождение конца строки осуществляется с помощью соответствующей стандартной функции eoin. Эта функция по умолчанию имеет значение false, а при обнаружении ею двух управляющих символов возврата каретки CR н перевода строки LF (см. разд. 9.1) получает значение true, что приводит к завершению работы внутреннего цикла.
Внешний цикл repeat.. .until повторяет процесс построчного ввода до тех пор, пока в ходе его работы не будет обнаружен признак конца всего текста. Таким признаком, завершающим работу цикла, является ввод нуля. По окончании работы цикла полученные статистические данные выводятся на экран компьютера операторами writeln. На рис. 10.5 показаны результаты работы программы filolog.
Множества используются при решении математических задач, особенно тех из них, в которых для получения искомого результата требуется фильтрация
данных, т. е. отсеивание ненужных данных для успешного решения задачи. В качестве примера рассмотрим задачу нахождения всех простых чисел в диапазоне от 1 до некоторого п. Как известно, простым числом называется такое число, которое делится только на единицу и само на себя. Способ решения данной задачи был разработан еще в Ш веке до нашей эры выдающимся древнегреческим ученым Эратосфеном и в честь него получил название пРешето Эратосфена*'. В принципе, составить программу решения данной задачи можно и не прибегая к множественному типу (сходная задача имеется в заданиях для самостоятельной работы к главе 8), но его использование делает создаваемую программу более простой н наглядной.
与 Tuibo Pascal曰回口
(Пппдмгг 7гкс г fine ipoMiio. Ввод строки зак^нчнвдитс HdxjTHcn 'Tnttr^1 '
IЦлЯ )<1ПГ|)иГНИЙ ОВОДд ncei О TCKCld ПВСДИ1Г U и *4 ntcr**
|Pdh"Id С IlJIOf pdmanu 'ГО UHHOnprnrtlHO и цепь , и ерг八С rno P・,601U
Minnun irpun. Ос поимся nuiit» co крененных имчис nMiriit>iiH8 i ml ten JdKUQYeHd и .)пп.)|ьпнип оыглечгнми, мо ье » ttpot рлгпниг о оъгепечеимн ома не релои^уг тся.О
Число гласных букв 6 тексте ранно 77 'iweno chi n<ii ими &уки в rest re pan но 1(12
Рис. 10.5. Результаты работы программыг подсчитывающей количествогласных и согласных букв в тексте
Алгоритм решения этой задачи сводится к следующему. В начале в последовательности натуральных чисел от 1 до п вычеркивается (или заменяется на нуль) каждое второе число, начиная с числа 2 (при этом само число 2 в последовательности остается, т. к. оно является простым). Затем из оставшихся в последовательности чисел берется первое по порядку после числа 2 ненулевое число. Это будет число 3. Далее в последовательности вычеркивается или заменяется на нуль каждое третье число, начиная с 3, кроме самого числа 3. Затем берется следующее по порядку ненулевое число (число 5) и производится аналогичная операция замены на нуль кратных ему чисел. Эти действия выполняются для всех чисел вплоть до числа, равного п/2 (если число п нечетное, то берется целая часть числа п/2). В результате в интервале натуральных чисел от 1 до п останутся невычеркнутыми (ненулевыми) только простые числа. В листинге 10.6 приводится текст программы, реализующей алгоритм "Решето Эратосфена".
! Листинг 10.6. Программа поиска прсютых чисел (мРешето Эратосфена1*)
program eratos;
Uses Crt; label 1;
var
dpn:set of 1..255; i,j.k,i.n:integer;
begin
ClrScr;
writein (1 Программа вычисления простых чисел в интервале от 1 до п*); 1: writein (* Введите число п (натуральное число не больше 255)*); readln(п);
if п>255 then goto 1;
k:= п div 2;
dpn:=[2..n];
for i:=2 to k do
for j:=2 to n do
if (j mod i =0) and (joi) then dpn:=dpn~[j];
writein;
writein(1Печатаем простые числа в интервале от 1 до ’.п);
writein;
write(1:4);
1:=2;
for j:=2 to n do
if j in dpn then
begin
write(j:4);
if 1 mod 10 =0 then writeLn;
1:=1+1 end;
readln
end.
В начале работы программы пользователь после соответствующего приглашения должен ввести число п — верхний предел диапазона, в котором будет производиться поиск простых чисел. Эта верхняя граница не может быть больше 255, т. к. в программе используется целочисленное множество. Если все же при вводе была совершена ошибка (было введено число большее, чем 255), то с помощью оператора безусловного перехода пользователь отсылается к той строке программы, где указана данная граница.
Как видно из приведенного алгоритма, одна и та же поел едовател ь н ость действий повторяется для всех чисел от 2 до целой части п/2. Последняя величина в программе обозначена через к и вычислена перед началом работы основ-
него алгоритма. Кроме того, множеству целых чисел dpn присваивается новое значение, равное диапазону, в котором далее будет производиться поиск простых чисел. В процессе дальнейшей работы программы из этого множества будут удалены все непростые числа, в итоге dpn превратится в множество простых чисел из данного диапазона.
Процесс непосредственного определения множества простых чисел производится с помощью двух вложенных друг в друга циклов. Переменной внешнего цикла является 1, которая меняет свои значения от I до к, т. е. эта величина принимает все значения, с помощью каждого из которых производится процедура вычеркивания млишнихи чисел, не относящихся к множеству простых. Сам же процесс удаления из множества этих чисел осуществляется во внутреннем цикле, переменная которого j принимает все значения из заданного в начале программы диапазона. Во внутреннем цикле производится проверка текущего значения j с помощью условного оператора. Если текущее значение j делится без остатка на текущее значение i и при этом не равно делителю, то, следовательно, оно не является простым, и его смело можно удалять из множества простых чисел, что и делает соответствующий оператор. Данный оператор присваивает множеству dpn новое значение, которое равно предыдущему за вычетом удаляемого элемента.
В итоге работы двух циклов искомое множество сформировано, и остается только вывести его элементы на экран компьютера. Данный вывод производится в цикле с переменной j, значение которой изменяется от 1 до п. Но здесь можно столкнуться со следующей проблемой. Вывод элементов осуществляется в строку оператором write (если вывод производить оператором writein, то каждый элемент будет выведен в отдельной строке, общее число которых в текстовом режиме составляет 25, н для большого диапазона все значения просто не поместятся на экране компьютера). Но т. к. мы заранее не знаем общее количество элементов и значение каждого из них, то может оказаться, что какое-либо число (элемент множества) будет при выводе празре- зано" — одна или две его цифры окажутся на одной строке, а остальные — на другой, что, естественно, затруднит восприятие пользователем результатов работы программы.
Выход из данной ситуации заключается в следующем: каждый из элементов найденного множества будет выводиться в отформатирован ном виде— под каждое из чисел будет отведено по 4 позиции, чего вполне достаточно, т. к. даже самые большие из выводимых чисел могут быть трехзначными, и, кроме того, одна позиция резервируется под пробел между числами. Числа в программе выводятся по 10 в одну строку, н в каждой строке будет занято, таким образом, по 40 позиций. Всего же в каждой строке содержится 80 позиций для записи различных символов. Разбивка элементов по 10 про-
изводится с помощью следующего приема: в теле цикла, осуществляющего вывод элементов множества, используется вспомогательная переменная-счетчик 1. Значение данной переменной увеличивается на единицу при выводе каждого очередного элемента множества. Следовательно, как только выводятся очередные 10 элементов множества, значение переменной 1 становится кратным 10. Эта кратность проверяется с помощью операции нахождения остатка при делении на 10. Если значение 1 действительно оказывается кратным 10, то курсор переводится на следующую строчку пустым оператором writein. Перед началом же работы данного цикла на экран выводится первое простое число—— единица, а переменной 1 сразу присваивается значение 2 (соответствующее второму элементу множества). Результаты работы программы как при неправильном, так и при правильном вводе исходных данных приведены на рис. 10.6.
Рис. 10.6. Результаты работы программы поиска простых чисел
Задания для самостоятельной работы
Задание 1. Составить программу, которая по названию месяца определяет текущее время года. Для описания переменной-селектора в условном операторе использовать перечисляемый тип. В программе предусмотреть защиту от неправильного ввода данных.
Задание 2. Составить программу, которая по номеру года определяет, является ли он високосным или нет. Год является високосным в том случае, если его номер делится на 4 (например, високосными являются 1996 или 2004).
Исключение составляют годы, номера которых делятся на 100. Эти годы являются високосными в том случае, если их номера делятся также на 400 (например, 1600 и 2000 годы являются високосными, а 1800 и 1900— нет). Переменную, которой присваивается значение номера года, описать как переменную ограниченного типа (значение данной переменной должно изменяться в диапазоне от 1600 до 2100). Предусмотреть в программе защиту от неверного ввода данных (вне зависимости от настроек системы Turbo Pascal).
Задание 3. Составить программу, которая создает типизированный файл и вводит в него данные о результатах сдачи экзаменов классом из п школьников. Данные по успеваемости каждого из студентов должны быть оформлены в виде записи. Каждая запись должна содержать следующие данные: фамилию и имя школьника, его имя и оценки по следующим предметам: математика, физика, литература, история. Количество учеников, сдающих экзамен, заранее не известно, поэтому после ввода очередной записи программа должна запрашивать пользователя о том, будет ли он вводить следующую запись. После завершения ввода данных на зкран должно быть выведено сообщение о количестве записей, имеющихся в файле, а затем должна быть выведена экзаменационная ведомость.
Задание 4. Составить программу, которая должна определять, является ли введенный с клавиатуры символ цифрой, прописной буквой английского ап- фавита^ прописной буквой русского алфавита, строчной буквой английского алфавита, строчной буквой русского алфавита или каким-либо другим символом. При решении задачи использовать множественный тип данных.
ГЛАВА 1 1
Turbo Pascal в Интернете
Авторы данной книги стремились дать пользователю те необходимые основы теоретических знаний и практических навыков, без которых невозможно дальнейшее совершенствование в области ал гор итм ического программирования. У многих любознательных и стремящихся к творческой деятельности людей, естественно, возникнет потребность в расширении и углублении полученных знаний путем самообразования. Важным подспорьем в осуществлении этой задачи может стать информация, которую пользователь может получить во всемирной информационной сети Интернет.
Система программирования Turbo Pascal широко используется для обучения основам программирования и для решения практических задач во всем мире уже на протяжении двух десятилетий. В течение столь продолжительного периода времени для такой бурно развивающейся науки, как информатика, было создано много различного рода теоретических трудов и учебников по программированию, а также был накоплен огромный практический опыт по разработке программ в системе Turbo Pascal. Значительная часть этих материалов нашла свое отражение в глобальной сети.
В Интернете существует значительное количество сайтов, основной тематикой которых является программирование в системе Turbo Pascal. На этих сайтах их создателями для общедоступного использования выложено много важных и полезных материалов по программированию в Turbo Pascal. В данной главе приводится обзор тех сайтов, в которых, на взгляд авторов книги, аккумулировано многое из того багажа знаний, о котором говорилось ранее. При этом особый упор авторами сделан на сайты Рунета, т. е. русскоязычного сектора Интернета.
Это объясняется двумя причинами. Во-первых, не все пользователи в достаточной мере владеют английским языком, на котором в Интернете представ-
лена большая часть информации. Во-вторых, на русскоязычных сайтах можно найти много ценных сведений по использованию русифицированных версий системы Turbo Pascal и по разработке программ применительно к потребностям пользователей в нашей стране.
Перед информацией о каждом из сайтов, указанных в данной главе, приводится его адрес в Интернете. Далее сообщается о том, какого рода сведения может почерпнуть для себя пользователь на том или ином сайте.
http://borlpasc.narod.ru — здесь можно найти самую разнообразную информацию, относящуюся к программированию на Паскале. Во-первых, как уже говорилось в главе /, с данного сайта можно скачать саму систему lurbo Pascal, причем не только Turbo Pascal 7.0, но и другие версии языка Паскаль. Во-вторых, на сайте содержится много различной документации по языку Паскаль, включая руководства для пользователей и программистов, справочники и энциклопедию, учебники, курсы лекций и практикумы по Turbo Pascal (рис. I l.l).
Рис. 11.1. Страница сайта borlpasc.narod.ru. посвященная документации по Turbo Pascal
Кроме того, на сайте имеется страница, посвященная ответам на многочисленные вопросы, возникающие у пользователей, осваивающих программирование в системе Turbo Pascal [рис. 11.2). Часто такие страницы в Интернете {в том числе и в Рунете) обозначаются англоязычным сокращением FAQ, что
расшифровывается как Frequently Asked Questions, т. e. мчасто задаваемые вопросы*'.
Рис. 11.2. Страница сайта borlpasc.narod.ru, посвященная ответам на вопросы пользователей
На сайте имеется большой архив, содержащий исходные тексты программ на языке Паскаль (рис. 11.3). Для того чтобы пользователям было удобнее ориентироваться в этом архиве, он разбит на ряд разделов. Эти разделы посвящены работе с целочисленными величинами, условными операторами, инк- вами, массивами, множествами, строковыми величинами, программированию графики, звука н др.
Сайт регулярно обновляется, поэтому здесь имеется специальный журнал, в котором сообщается о том, какая новая информация поступила на сайт в последнее время (рис. 11.4).
http://pascal.sources.ru — это адрес сайта *Т1аскальные исходники** (рис. 11.5). На сайте можно найти исходные тексты программ н&Паскале, ряд статей по программированию на Паскале, различную документацию, а также ссылку на онлайновый учебник по языку Паскаль, находящийся по адресу (рис. 11.6): http://www.kolasc.net.ru/c(]o/metod/programmerfscourse/language /index.htm#pascwil
Рис. 11.3. Страница сайта borlpasc.narod.ru. содержащая архив с текстами программ на Паскале
Рис. 11.4. Журнал новостей сайта bor1pasc.narod.ru
Ра*<;м1 Stiutcr»* Hu IltlCAdiniNaH: МС:ХП*»<МКМ CU nf.nt О СПОК! - Mll;KI«l>ll Inlrincl I «pluintВЮП
史Зл Пр/ 一k Ri» 匕x 魂— 二,产「「' ; [ q ,,二:; :|Ж
一三子к窕三"1;—苗『頂「装-滿 =君慰寸3一口 劇
Нам^ ];FU1 ■ Остлким!» Ьбмжт! ДомЖ t Лом* .一M^p*«^; Xy^in ' Почте Пвчоь‘,产-更";
1 Д«»с ⑥ htE〃P^c& w如kW—— 司-^П<Мв^ ; I рр^оц*
20 Февраля 2005г.20 Февраля 2005г.WWWMCX0
20 Февраля 2005г.
20 Февраля 2005г.
WfflWffWMfffl »й|,е* Мклаитыи
Но ci:口u”j“,Но ci:口u”j“,Прогрпнпист&н:Рвзлслы Исхоамммов [45]Рмса! FAO |Б01Статьм о Паскале (22]КомлиляторыДокументация |31]Форматы Файлов (А|АнгикварматрО]Журнала я Газеты |10|Иигересныа ссылкиАвтарскио страницы f 18]Упы6мытес^< ;4Наши ветреныПрогрпнпист&н:Рвзлслы Исхоамммов [45]Рмса! FAO |Б01Статьм о Паскале (22]КомлиляторыДокументация |31]Форматы Файлов (А|АнгикварматрО]Журнала я Газеты |10|Иигересныа ссылкиАвтарскио страницы f 18]Упы6мытес^< ;4Наши ветреныНаима мшеричныНаима мшеричныСпацмолкныВ проект:СпацмолкныВ проект:• ГМ1• ГМ1Рмсп! ПО-PyCCKMlРмсп! ПО-PyCCKMl1444208 Unix X Yflndnw м Free Ршсп1 Щ2^В Курс лекций по прогр1ммиро!анию в X ]УWindow (Unix) с использованием FPC- Г ]甫^ Прмведенм основные понятия м приемы 心• '* 二.лрограминраеаиия. примеры программ к задания для еиполнемия лабораторныхКомпилятор FPC 1 06Попообнев …Q7.D€2003 垢,tia ЭО rendering system<Ebicrpan, хорошо ептимкзироввниая грвфмческая библиотека для трехмерного рдцаермнга в реальной времени Р»алюс#»ны средства для затенения, сглаживания, т*кс1урирсванмя и(лр,ж«нм, поверхностей, коррекция перспективы.1444208 Unix X Yflndnw м Free Ршсп1 Щ2^В Курс лекций по прогр1ммиро!анию в X ]УWindow (Unix) с использованием FPC- Г ]甫^ Прмведенм основные понятия м приемы 心• '* 二.лрограминраеаиия. примеры программ к задания для еиполнемия лабораторныхКомпилятор FPC 1 06Попообнев …Q7.D€2003 垢,tia ЭО rendering system<Ebicrpan, хорошо ептимкзироввниая грвфмческая библиотека для трехмерного рдцаермнга в реальной времени Р»алюс#»ны средства для затенения, сглаживания, т*кс1урирсванмя и(лр,ж«нм, поверхностей, коррекция перспективы.Ислолники ко CDИслолники ко CDЗакажи себе компект!Закажи себе компект!Исходникм.Ни ма ССИсходникм.Ни ма ССПринимсем заказы м8 компаит>дискПринимсем заказы м8 компаит>дискI l(IIKH:f И <:",“:"ГП ГНИI l(IIKH:f И <:",“:"ГП ГНИ?4 10 2СОЗ Компания ТМТ Developminl Corporation выпускает пятую еекжо компилучова ТМТ Pascal Данная версия позволяет компилирсвйгъ для платформ DOS32. WirG2 и Unux.?4 10 2СОЗ Компания ТМТ Developminl Corporation выпускает пятую еекжо компилучова ТМТ Pascal Данная версия позволяет компилирсвйгъ для платформ DOS32. WirG2 и Unux.三一. „居京JL ю『一]三一. „居京JL ю『一]На гл w<*jio ■gttwMHXM 中тшн Ун&<тх・п Станы хмп・
Но ci:口u”j“,
Но ci:口u”j“,
Прогрпнпист&н:
Рвзлслы Исхоамммов [45]
Рмса! FAO |Б01
Статьм о Паскале (22]
Комлиляторы
Документация |31]
Форматы Файлов (А|
АнгикварматрО]
Журнала я Газеты |10|
Иигересныа ссылки
Автарскио страницы f 18]
Упы6мытес^< ;4
Наши ветрены
Прогрпнпист&н:
Рвзлслы Исхоамммов [45]
Рмса! FAO |Б01
Статьм о Паскале (22]
Комлиляторы
Документация |31]
Форматы Файлов (А|
АнгикварматрО]
Журнала я Газеты |10|
Иигересныа ссылки
Автарскио страницы f 18]
Упы6мытес^< ;4
Наши ветрены
Наима мшеричны
Наима мшеричны
СпацмолкныВ проект:
СпацмолкныВ проект:
• ГМ1
• ГМ1
Рмсп! ПО-PyCCKMl
Рмсп! ПО-PyCCKMl
1444208 Unix X Yflndnw м Free Ршсп1 Щ2^В Курс лекций по прогр1ммиро!анию в X ]УWindow (Unix) с использованием FPC- Г ]甫^ Прмведенм основные понятия м приемы 心• '* 二.лрограминраеаиия. примеры программ к задания для еиполнемия лабораторных
Компилятор FPC 1 06
Попообнев …
Q7.D€2003 垢,tia ЭО rendering system<
Ebicrpan, хорошо ептимкзироввниая грвфмческая библиотека для трехмерного рдцаермнга в реальной времени Р»алюс#»ны средства для затенения, сглаживания, т*кс1урирсванмя и(лр,ж«нм, поверхностей, коррекция перспективы.
1444208 Unix X Yflndnw м Free Ршсп1 Щ2^В Курс лекций по прогр1ммиро!анию в X ]УWindow (Unix) с использованием FPC- Г ]甫^ Прмведенм основные понятия м приемы 心• '* 二.лрограминраеаиия. примеры программ к задания для еиполнемия лабораторных
Компилятор FPC 1 06
Попообнев …
Q7.D€2003 垢,tia ЭО rendering system<
Ebicrpan, хорошо ептимкзироввниая грвфмческая библиотека для трехмерного рдцаермнга в реальной времени Р»алюс#»ны средства для затенения, сглаживания, т*кс1урирсванмя и(лр,ж«нм, поверхностей, коррекция перспективы.
Ислолники ко CD
Ислолники ко CD
Закажи себе компект!
Закажи себе компект!
Исходникм.Ни ма СС
Исходникм.Ни ма СС
Принимсем заказы м8 компаит>диск
Принимсем заказы м8 компаит>диск
I l(IIKH:f И <:",“:"ГП ГНИ
I l(IIKH:f И <:",“:"ГП ГНИ
?4 10 2СОЗ Компания ТМТ Developminl Corporation выпускает пятую еекжо компилучова ТМТ Pascal Данная версия позволяет компилирсвйгъ для платформ DOS32. WirG2 и Unux.
?4 10 2СОЗ Компания ТМТ Developminl Corporation выпускает пятую еекжо компилучова ТМТ Pascal Данная версия позволяет компилирсвйгъ для платформ DOS32. WirG2 и Unux.
三一. „居京JL ю『一]
三一. „居京JL ю『一]
Рис. 11.5. Главная страница сайта "Паскальные исходники"
Рис. 11.6. Оглавление онлайнового учебника по программированию на Паскале
f,碗:m«*йf,碗:m«*й.Сейчас не сайте: 2 | Поставит» “ксалку 1 Сделать стартовой.Сейчас не сайте: 2 | Поставит» “ксалку 1 Сделать стартовойI illllt» I'lltC.ll - <"吋“,,““・"|“ПI illllt» I'lltC.ll - <"吋“,,““・"|“ПГ«»»1.л1 Mx intoll hu,“”"l f *舟。””Г«»»1.л1 Mx intoll hu,“”"l f *舟。””таена* ] ( ивэад ]таена* ] ( ивэад ].Рассылки Aittri^^..Рассылки Aittri^^.Полный обучающий курс Turbo PascalПолный обучающий курс Turbo PascalПоппии/нтесь ха иагсылм、казн::bauj.,-n^d I ОК|Поппии/нтесь ха иагсылм、казн::bauj.,-n^d I ОК|■ипны" список сгауеН■ипны" список сгауеНЭтот раадел совдан для обучения программированию на Turbo Pascal. 公祖 Материал этого ра«дклв омень глубок, поэтому даже раабирмощийся в Г)аск&л・ — программист может влгляиуть сюда и найти что-то интересное. Хорошие анемия явыка Turbo Pascal сделан» «ашя прогрвммирсмаиие нд Delphi балав успешным м продуктивным. Так что предлагаю вам оэмакомитеж с содвржамием «того равдала.Этот раадел совдан для обучения программированию на Turbo Pascal. 公祖 Материал этого ра«дклв омень глубок, поэтому даже раабирмощийся в Г)аск&л・ — программист может влгляиуть сюда и найти что-то интересное. Хорошие анемия явыка Turbo Pascal сделан» «ашя прогрвммирсмаиие нд Delphi балав успешным м продуктивным. Так что предлагаю вам оэмакомитеж с содвржамием «того равдала.#Друаья сайта;#Друаья сайта;《плеская 日еЪскя со сгизавк。,)《плеская 日еЪскя со сгизавк。,)Вводная чистьВводная чисть』回npsF』回npsFПапх*т 1 и。。поенмтип*Папх*т 1 и。。поенмтип*Глава 1. Основные понятия системы программирования Turbo :« Pasco!Глава 1. Основные понятия системы программирования Turbo :« Pasco!ЕЕEMEM
f,碗:m«*й
f,碗:m«*й
.Сейчас не сайте: 2 | Поставит» “ксалку 1 Сделать стартовой
.Сейчас не сайте: 2 | Поставит» “ксалку 1 Сделать стартовой
I illllt» I'lltC.ll - <"吋“,,““・"|“П
I illllt» I'lltC.ll - <"吋“,,““・"|“П
Г«»»1.л1 Mx intoll hu,“”"l f *舟。””
Г«»»1.л1 Mx intoll hu,“”"l f *舟。””
таена* ] ( ивэад ]
таена* ] ( ивэад ]
.Рассылки Aittri^^.
.Рассылки Aittri^^.
Полный обучающий курс Turbo Pascal
Полный обучающий курс Turbo Pascal
Поппии/нтесь ха иагсылм、казн::
bauj.,-n^d I ОК|
Поппии/нтесь ха иагсылм、казн::
bauj.,-n^d I ОК|
■ипны" список сгауеН
■ипны" список сгауеН
Этот раадел совдан для обучения программированию на Turbo Pascal. 公祖 Материал этого ра«дклв омень глубок, поэтому даже раабирмощийся в Г)аск&л・ — программист может влгляиуть сюда и найти что-то интересное. Хорошие анемия явыка Turbo Pascal сделан» «ашя прогрвммирсмаиие нд Delphi балав успешным м продуктивным. Так что предлагаю вам оэмакомитеж с содвржамием «того равдала.
Этот раадел совдан для обучения программированию на Turbo Pascal. 公祖 Материал этого ра«дклв омень глубок, поэтому даже раабирмощийся в Г)аск&л・ — программист может влгляиуть сюда и найти что-то интересное. Хорошие анемия явыка Turbo Pascal сделан» «ашя прогрвммирсмаиие нд Delphi балав успешным м продуктивным. Так что предлагаю вам оэмакомитеж с содвржамием «того равдала.
#Друаья сайта;
#Друаья сайта;
《плеская 日еЪскя со сгизавк。,)
《плеская 日еЪскя со сгизавк。,)
Вводная чисть
Вводная чисть
』回npsF
』回npsF
Папх*т 1 и。。поенмтип*
Папх*т 1 и。。поенмтип*
Глава 1. Основные понятия системы программирования Turbo :« Pasco!
Глава 1. Основные понятия системы программирования Turbo :« Pasco!
Е
Е
EM
EM
http://delphid.dax.ru/pascal — основным направлением сайта "Development и Дельфн", как видно из его названия, является программирование в среде Delphi, но есть на сайте и раздел, посвященный программированию на классическом Паскале (рис. 11.7). В этом разделе есть возможность скачать среду програм мировая ия Borland Pascal 7.0, которая является расширенной версией Turbo Pascal 7.0. Имеющаяся на сайте среда Borland Pascal русифицирована и имеет справочную систему (help) на русском языке. Кроме того, на сайте есть учебник по Turbo Pascal, в котором вопросы программирования в этой среде рассмотрены достаточно глубоко и серьезно.
Development I 吃交'и Аелыри
◎opyx Ха~Грс Ст・тън Аобовит» ЕП»»о У7Mx №八》翻 竺4*「呼川 Прогу,*” Мчнп—нты 电叩户 Саем Гостева。
Рис. 11.7. Страница сайта "Development и Дельфи",посвященная программированию на Turbo Pascal
http://web-pascal.narod.ru ——этот сайт полностью посвящен программированию на Паскале. Здесь имеется раздел документации, содержащий различную литературу как по программированию на Паскале, так и вообще по компьютерной тематике (рис. 11.8). В разделе документации имеются многочисленные руководства по разработке программного обеспечения, выпущенные фирмой Borland, лекции и книги по программированию, включая сборники олимпиадных задач, задачники с решениями, а также литература по данной тематике на английском языке.
Кроме того, на указанном сайте есть страница, с которой можно загрузить различные версии среды программирования Turbo Pascal, начиная с самой
251
Рис. 11.8. Страница сайта '*Web~Pascar. посвященная документации по программированию
3匕,,,,:川 Wrh Site I ).f»M«IMnWHI|>>4 Mh.HIHiH llklrifwit I MploH'lР9П1 曰
尸 ASCM
IllHOME
J :: r:7》X・M
I;: Пик^гемтАинм |u_fiXMfei5 [^Кйемотйм
口 Uhiyjr。
I uJ)kjbU№^
I ;遂W£!
11^МЙШ13-ЙИИ1Й J
:::Компиляторы :::
В этом разделе собраны самые равные компиляторы Pascal,. Здесь можно скачать версии компиляторов Впходмвших в равное время наминая с 1983 г.
Основные средства разроботкм;
■脏[曲1±JZai亠e1
Borland Pascal v7.0 - самый популярный в конце XX века компилятор Паскаля. Впервые фана гм Паскаля смогли '■ одном флакон** компкпировать свои исходники не только для рванного режиме DOS, нс и для 16-битного в втащенного режима и даже для Win 16 (Windows 3.1)1 Дата выпуска: 09 марта 1993.
PatMep: 073 kb
• h:4 F4」;a";
Зто очень лехкий в испсль»овамив компилятор и имтерпиритатор Пасакля. Имев! Windows редакюр н очень эффокгибкую среду crcnr*f ■-♦ f, ♦•——»п »■»♦.▼ г—с— **4с С、”с 7 ,cr«c・rc* сс -п—,у ♦、•♦.
g^^^f 一二—..」• EFU . 一 一 F耳戸j*Mx
习
Рис. 11.9. Страница сайта "Web-Pascal", содержащая различные версии компиляторов Паскаля
Глава 11
первой версии 1.0 и заканчивая шестой, а также ряд других компиляторов языка Паскаль (рис. 11.9).
http://www.pascal.dax.ru — по этому адресу расположен сайт под названием "Все о Паскале**. Он имеет недолгую историю существования, и в настоящее время идет активное пополнение сайта новой информацией. В частности, на сайте есть раздел, содержащий исходные тексты программ на Паскале, распределенные по разделам Математика, Файлы, Целочисленная арифметика, Условный оператор, Циклы, Массивы, Множества, Графика и др. (рис. 11.10).
Не” «»Пл< ае“с • Исхиднияы Mn.nmMt IfHrincl I iiiloitMНе” «»Пл< ае“с • Исхиднияы Mn.nmMt IfHrincl I iiiloitMФ«Ал ПЙВК*Ф«Ал ПЙВК*]&ймс|融 Ы<р7/ммм,си1сЫ<1ам1и^?жмсе*]&ймс|融 Ы<р7/ммм,си1сЫ<1ам1и^?жмсе*м« r/mmiys:: AgOiMtnfa о ипброн"。©м« r/mmiys:: AgOiMtnfa о ипброн"。©一J^e^^一J^e^^Разделы сейте ::Главная ::ноиостх ::Статьи ::JlniKpaivPd ::Уроки ::Исходники ::Задача ::Ресе.ылкм ::Дисгрибушвы ::Форум ::Гостевая книга ::Ссылки ::Об авторвк ::имин ^ Поиск яо сайту |Разделы сейте ::Главная ::ноиостх ::Статьи ::JlniKpaivPd ::Уроки ::Исходники ::Задача ::Ресе.ылкм ::Дисгрибушвы ::Форум ::Гостевая книга ::Ссылки ::Об авторвк ::имин ^ Поиск яо сайту |ИсходникиИсходники■ii»w *;ы«слц■ii»w *;ы«слц6SM?GI,8IZ6SM?GI,8IZВг&О "“.кал。」瓶*о/Вг&О "“.кал。」瓶*о/Рис. 11.10. Страница сайта pascal.dax.ru. содержащая исходные тексты программ на ПаскалеРис. 11.10. Страница сайта pascal.dax.ru. содержащая исходные тексты программ на Паскале♦ Разделы Показать все "3 рд-делоо н 164 ис:одиигор]РаздЕп Матемагмка । IS】: Drkgahhk” мат®мотим©С1;и:< прогрвим^Раздел Файлы [!■>]: исмадннкн программ длл работы с Файлами.Раэдег Множестве【6] Иснсдннги пвогр^мм дпа работы с инежесте^пи.Раздел Целочисленная арифистикв〔21]: иоодрим! программ 財負 работы с цепом!tenмчней арифметикомРаздел Массивы (43У Ис<сдми1:и програм?» дпя рэботм с массивен.Ра,деп Циклы (7J: Зсксдхикн пвограим для работу с циклам».Ра>дъл Условный оператор [5]: Исходники програни для работа с условным спераюром.Раздел Игрушки [21] Исходники нв.Ралдел Звук (8] Прогу#лмнрован>1» звук *.«рт.Раздел Мышь [5]: Программ»tbOBOHMii мышиРаздел Графика [91: Пьогр*нмироеание гр«ф^кнРд|Д«л Разное [6]. Иоеаднигм раюичиых программ.Раздел Динамические структуры даиных. L-6]: списки, очереди, cieni, динамичвегпв масона и тд♦ Разделы Показать все "3 рд-делоо н 164 ис:одиигор]РаздЕп Матемагмка । IS】: Drkgahhk” мат®мотим©С1;и:< прогрвим^Раздел Файлы [!■>]: исмадннкн программ длл работы с Файлами.Раэдег Множестве【6] Иснсдннги пвогр^мм дпа работы с инежесте^пи.Раздел Целочисленная арифистикв〔21]: иоодрим! программ 財負 работы с цепом!tenмчней арифметикомРаздел Массивы (43У Ис<сдми1:и програм?» дпя рэботм с массивен.Ра,деп Циклы (7J: Зсксдхикн пвограим для работу с циклам».Ра>дъл Условный оператор [5]: Исходники програни для работа с условным спераюром.Раздел Игрушки [21] Исходники нв.Ралдел Звук (8] Прогу#лмнрован>1» звук *.«рт.Раздел Мышь [5]: Программ»tbOBOHMii мышиРаздел Графика [91: Пьогр*нмироеание гр«ф^кнРд|Д«л Разное [6]. Иоеаднигм раюичиых программ.Раздел Динамические структуры даиных. L-6]: списки, очереди, cieni, динамичвегпв масона и тд(черв! flndex)ноши рассылки*(черв! flndex)ноши рассылки*
Не” «»Пл< ае“с • Исхиднияы Mn.nmMt IfHrincl I iiiloitM
Не” «»Пл< ае“с • Исхиднияы Mn.nmMt IfHrincl I iiiloitM
Ф«Ал ПЙВК*
Ф«Ал ПЙВК*
]&ймс|融 Ы<р7/ммм,си1сЫ<1ам1и^?жмсе*
]&ймс|融 Ы<р7/ммм,си1сЫ<1ам1и^?жмсе*
м« r/mmiys:: AgOiMtnfa о ипброн"。©
м« r/mmiys:: AgOiMtnfa о ипброн"。©
一J^e^^
一J^e^^
Разделы сейте ::Главная ::ноиостх ::Статьи ::JlniKpaivPd ::Уроки ::Исходники ::Задача ::Ресе.ылкм ::Дисгрибушвы ::Форум ::Гостевая книга ::Ссылки ::Об авторвк ::имин ^ Поиск яо сайту |
Разделы сейте ::Главная ::ноиостх ::Статьи ::JlniKpaivPd ::Уроки ::Исходники ::Задача ::Ресе.ылкм ::Дисгрибушвы ::Форум ::Гостевая книга ::Ссылки ::Об авторвк ::имин ^ Поиск яо сайту |
Исходники
Исходники
■ii»w *;ы«слц
■ii»w *;ы«слц
6SM?GI,8IZ
6SM?GI,8IZ
Вг&О "“.кал。」瓶*о/
Вг&О "“.кал。」瓶*о/
Рис. 11.10. Страница сайта pascal.dax.ru. содержащая исходные тексты программ на Паскале
Рис. 11.10. Страница сайта pascal.dax.ru. содержащая исходные тексты программ на Паскале
♦ Разделы Показать все "3 рд-делоо н 164 ис:одиигор]
РаздЕп Матемагмка । IS】: Drkgahhk” мат®мотим©С1;и:< прогрвим^
Раздел Файлы [!■>]: исмадннкн программ длл работы с Файлами.
Раэдег Множестве【6] Иснсдннги пвогр^мм дпа работы с инежесте^пи.
Раздел Целочисленная арифистикв〔21]: иоодрим! программ 財負 работы с цепом!tenмчней арифметиком
Раздел Массивы (43У Ис<сдми1:и програм?» дпя рэботм с массивен.
Ра,деп Циклы (7J: Зсксдхикн пвограим для работу с циклам».
Ра>дъл Условный оператор [5]: Исходники програни для работа с условным спераюром.
Раздел Игрушки [21] Исходники нв.
Ралдел Звук (8] Прогу#лмнрован>1» звук *.«рт.
Раздел Мышь [5]: Программ»tbOBOHMii мыши
Раздел Графика [91: Пьогр*нмироеание гр«ф^кн
Рд|Д«л Разное [6]. Иоеаднигм раюичиых программ.
Раздел Динамические структуры даиных. L-6]: списки, очереди, cieni, динамичвегпв масона и тд
♦ Разделы Показать все "3 рд-делоо н 164 ис:одиигор]
РаздЕп Матемагмка । IS】: Drkgahhk” мат®мотим©С1;и:< прогрвим^
Раздел Файлы [!■>]: исмадннкн программ длл работы с Файлами.
Раэдег Множестве【6] Иснсдннги пвогр^мм дпа работы с инежесте^пи.
Раздел Целочисленная арифистикв〔21]: иоодрим! программ 財負 работы с цепом!tenмчней арифметиком
Раздел Массивы (43У Ис<сдми1:и програм?» дпя рэботм с массивен.
Ра,деп Циклы (7J: Зсксдхикн пвограим для работу с циклам».
Ра>дъл Условный оператор [5]: Исходники програни для работа с условным спераюром.
Раздел Игрушки [21] Исходники нв.
Ралдел Звук (8] Прогу#лмнрован>1» звук *.«рт.
Раздел Мышь [5]: Программ»tbOBOHMii мыши
Раздел Графика [91: Пьогр*нмироеание гр«ф^кн
Рд|Д«л Разное [6]. Иоеаднигм раюичиых программ.
Раздел Динамические структуры даиных. L-6]: списки, очереди, cieni, динамичвегпв масона и тд
(черв! flndex)
ноши рассылки*
(черв! flndex)
ноши рассылки*
http://www.karelia.ru/psu/Chairs/IMO/pascal — это страница сайта Петрозаводского государственного университета, содержащая онлайновое пособие, в котором изложены основы программирования на Паскале для начинающих, а также задания для самостоятельных и лабораторных работ по программированию (рис. 11.11).
http://www.kbsu.ru/-book ——на этом сайте находится интернет-версия издания базового учебного пособия Л. 3. Шауцуковой по информатике (рис. 11.12). Данное пособие содержит как теоретические основы информатики, включая теорию программирования, так и практикум по программированию.
Рис. 11.11. Страница сайта Петрозаводского государственного университета, посвященная программированию на Паскале
Рис. 11.12. Главная страница сайта, содержащего интернет-версию учебного пособия Л. 3. Шауцуковой по информатике
ИНЧЧП'МЛ!ИКА 11|>лвтыял amпрмтми5<м|им м п{><1грлммн|«ипм1ма - MickkaII Infetrirl f «(ilntittИНЧЧП'МЛ!ИКА 11|>лвтыял amпрмтми5<м|им м п{><1грлммн|«ипм1ма - MickkaII Infetrirl f «(ilntittНПЕЗНПЕЗПрактикум по программированию, входящий в состав пособия, содержит многочисленные демонстрационные примеры, показывающие реализацию базовых структур программирования на различных языках программировав ния, в число которых входит и Turbo Pascal (рис. 11ЛЗ). Отдельный раздел практикума посвящен программированию графики и звука в Turbo Pascal.
ИНЧЧП'МЛ!ИКА 11|>лвтыял amпрмтми5<м|им м п{><1грлммн|«ипм1ма - MickkaII Infetrirl f «(ilntitt
ИНЧЧП'МЛ!ИКА 11|>лвтыял amпрмтми5<м|им м п{><1грлммн|«ипм1ма - MickkaII Infetrirl f «(ilntitt
НПЕЗ
НПЕЗ
應哀坛ft近喚№:妄其一运■生玉м± '三1m礎田受餐您膝约J
吃 7 :=\4^5&/^-.>-W<^
/_.Й?»* 一 了噂*・« Сегшрт . О^жжвъ. Z^rtt.f.jvn^** г .Щф»^ *»мл, 1 二-山断員 iia^fBJHtp^^—
ИНФОРМАТИКА. Практика алгоритмизаиии и 工программирования
H:in?ju<r.TjU'iirMM ipaa^ntcr 〃饱乜甘必勺用口?. "нборудпимг」2]. —Л£; llfccwu^^Hitf, 2WQs.
O ICpM-ntHHr:
Предисловие,
Настройют Интеграция браузера с IDE ТшЬо Pascal и Quick Байс.I
Вюшомис: без соответствующих настроек демонстрационная часть работать не будет. 1
Глава 1. Алгоритмы линейной н разветвляющейся структуры.,
Глава 2. Алгоритмы, реализуемые с помощью циклов типа ДЛЯ.
Глава 3. Алгоришы, реализуемые с помощью вложенных циклов типа ДЛЯ.
Глава 4. Алгоритмы, реализуемые с помощью циклов типа ПОКА
Глава 5. Алгоритмы, реализуемые с поыощмо вложенных циклов тип* ПОКА.
Глава 6. Алгоритмы, реализуемые с помощью комбинащш щ<клов типа ДЛЯ и ПОКА.
Глава 7 Алгоритмы обработки символьной информации..[
SW<> ,一—丁丁尸”1;卩:'"二—RK—l -三一>♦: .-Kbfiif麻龜R 国*•*■f>•
Рис. 11.13. Страница, содержащая оглавление практикума по программированиюинтернет-издания учебного пособия Л. 3. Шауцуковой по информатике
http://trushinov.chat.ru/sp.htni — на этой странице сайта О. В. Трушина содержится ряд сборников, каждый из которых представляет собой набор программ, посвященных одному из разделов программирования в Turbo Pascal: основы работы в текстовом режиме, массивы и циклы, рекурсия, программирование графики и др. (рис. 11.14).
http://ww^Miiarkbook.chat.ru — это адрес сайта преподавателя информатики М. Б. Львовского, на котором находится методическое пособие по информатике для старшеклассн и ков Book (рис. 11.15). В данной книге имеется ряд уроков, посвященных основам программирования в системе Turbo Pascal.
http://www.belc.narod.ru/train.htm ——это страница сайта П. П. Павловского, с которой можно загрузить две обучающие программы по Turbo Pascal, а также ряд других полезных обучающих программ (рис. 11.16).
Рис. 11.14. Страница сайта О. В. Трушина, содержащая ряд сборников программ на Turbo PascalРис. 11.14. Страница сайта О. В. Трушина, содержащая ряд сборников программ на Turbo Pascal》Метшичс ек<м)ласпбмс пп мек»/〉мл1хкс ШЮК I vovikiy M・”k. ПьвооскмА Мор* Бпиилмиямамч ywr》Метшичс ек<м)ласпбмс пп мек»/〉мл1хкс ШЮК I vovikiy M・”k. ПьвооскмА Мор* Бпиилмиямамч ywrF 疯虻 а«;里и и»—: * 5«м「_* 曰….:*二.一七八口面空工里虫‘.,十昱T一ном、七三}g**0?^:雨&!?丝0 . Ла^ей [ 也丝* :叫"*С; 总也暫 0呼,.F 疯虻 а«;里и и»—: * 5«м「_* 曰….:*二.一七八口面空工里虫‘.,十昱T一ном、七三}g**0?^:雨&!?丝0 . Ла^ей [ 也丝* :叫"*С; 总也暫 0呼,.Miciatalt I.・G 口Miciatalt I.・G 口<^ПЙ«М Jrieuw**<^ПЙ«М Jrieuw**h*x 〃w*m п>мНхюк d ru/h*x 〃w*m п>мНхюк d ru/Л^ожкмА MB.Л^ожкмА MB.E・ma/〃 marMv25@fnlu-net.ruE・ma/〃 marMv25@fnlu-net.ru
Рис. 11.14. Страница сайта О. В. Трушина, содержащая ряд сборников программ на Turbo Pascal
Рис. 11.14. Страница сайта О. В. Трушина, содержащая ряд сборников программ на Turbo Pascal
》Метшичс ек<м)ласпбмс пп мек»/〉мл1хкс ШЮК I vovikiy M・”k. ПьвооскмА Мор* Бпиилмиямамч ywr
》Метшичс ек<м)ласпбмс пп мек»/〉мл1хкс ШЮК I vovikiy M・”k. ПьвооскмА Мор* Бпиилмиямамч ywr
F 疯虻 а«;里и и»—: * 5«м「_* 曰….
:*二.一七八口面空工里虫‘.,十昱T
一ном、七三}g**0?^:雨&!?丝0 . Ла^ей [ 也丝* :叫"*С; 总也暫 0呼,.
F 疯虻 а«;里и и»—: * 5«м「_* 曰….
:*二.一七八口面空工里虫‘.,十昱T
一ном、七三}g**0?^:雨&!?丝0 . Ла^ей [ 也丝* :叫"*С; 总也暫 0呼,.
Miciatalt I.・G 口
Miciatalt I.・G 口
<^ПЙ«М Jrieuw**
<^ПЙ«М Jrieuw**
h*x 〃w*m п>мНхюк d ru/
h*x 〃w*m п>мНхюк d ru/
Л^ожкмА MB.
Л^ожкмА MB.
E・ma/〃 marMv25@fnlu-net.ru
E・ma/〃 marMv25@fnlu-net.ru
Методическое пособие BOOK по информатикедля 9-11 классов
Просто и доходчиво рисмотрены многнв актуальмыо вопросы; УсгрсПство IBM PC, MS- DOS, Norton Commander, Window* Conunander и другие альтернатквмыс оболочки, Wmduwi 95. Microsoft Word, Excel, Work*. Ilinepiiex-технолопил. програмпшровшше ин QF・*k, Turbo Pascal, KTML н многое xqiyrae. Пособие оформлено в формате HTML, его просмотр воышжвн в Interntt Explorer мл» Netscape Havigator. Пособив преднаэначаяо для дкстаншшнного юучекня нмформаш«ок»ых технологий.
Пособие пернод> гческн обновляет гм п дополняет г*1
刁刁Просмотр ВООЮ
刁
刁
Рис. 11.15. Страница сайта М. Б. Львовского, содержащая методическое пособиепо информатике BOOK
Рис. 11.16. Страница сайта П. П. Павловского, с которой можно загрузить обучающие программы по Паскалю
Помимо указанных ранее страниц, полезную информацию о языке Паскаль можно найти также на ряде сайтов, посвященных программированию в системе Delphi, которой будут посвящены следующие главы данной книги.
ГЛАВА 12
Предварительные сведения о среде Delphi
После освоения программирования на языке Паскаль можно переходить к программированию в среде Delphi. Дело в том, что в системе Delphi для написания кода используется язык Object Pascal, который является дальнейшим развитием языка Turbo Pascal. Установка среды Delphi может быть осуществлена с оптического диска или из Интернета с сайта производителя этого программного продукта. Установка с оптического диска более предпочтительна, т. к. программа имеет очень большой размер.
Основные характеристики системы Delphi
В свое время система программирования Turbo Pascal была одной из ведущих систем программирования для операционной системы MS-DOS, но в 90-е годы XX столетия ведущей операционной системой для персональных компьютеров стала ОС Windows, и встал вопрос о создании мощной и в то же время достаточно простой и удобной для работы среды создания Window-приложений. К разработке такой системы и приступила компания Borland. Новый программный продукт, как уже говорилось в предисловии, получил название Delphi. Каковы же основные отличительные особенности, позволившие занять Delphi достойное место в ряду современных средств программирования?
Система программирования Delphi опирается 〃а возможности операционной системы Windows. Как и в Windows, в Delphi используется графический интерфейс, обеспечивающий взаимодействие компьютера с пользователем. Значительную часть операций в процессе программирования пользователь может выполнять с помощью мыши, что повышает его производительность
9 Зак 1068
труда (при использовании мыши производительность труда пользователя повышается в 2—3 раза по сравнению с использованием только клавиатуры).
Начав работу в системе Delphi, пользователь увидит многие элементы интерфейса, которые уже знакомы ему по работе в Windows. К их числу относятся окна, которые можно закрывать, сворачивать или, наоборот, разворачивать до полноэкранного размера. Так же как в Windows, размеры большинства окон можно изменять методом протягивания. Этот метод заключается в том, что пользователь наводит указатель мыши на границу окна с тем. чтобы указатель превратился в двунаправленную стрелку, а затем перемещает границы окна при нажатой кнопке мыши. Имеющиеся в системе программирования окна можно перемещать по экрану, нухватившисьп указателем мыши за строку заголовка, аналогично тому, как это делается в Windows. Если информация целиком не помещается в отведенное для нее окно, то справа или снизу в рабочей области окна появляются полосы прокрутки (скроллеры).
При работе в Delphi пользователю часто придется пользоваться меню, которые организованы так же, как меню в офисных приложениях Windows, т. е. имеется горизонтальная строка, содержащая ряд разделов, каждый из которых является ниспадающим вертикальным меню. В системе Borland Delphi имеются многочисленные диалоговые окна, содержащие те же элементы управления, что и в Windows. К числу таких элементов относятся флажки, переключатели, или радиокнопки, раскрывающиеся списки, палитры и др. Использование всех этих элементов точно такое же, как в Windows.
В Delphi в полном масштабе реализовано объектно-ориентированное программирование. Если при выполнении программ, созданных в Turbo Pascal, возможные действия пользователя жестко регламентировались самой программой, то в Delphi мы видим иную картину. Готовое приложение, как правило, реализуется в Delphi в виде прямоугольной формы, которая выводится на экране на передний план при запуске программы на выполнение. Данная форма содержит различные элементы, к числу которых относятся надписи, текстовые поля, экранные кнопки, различные графические объекты, а также уже упоминавшиеся радиокнопки и флажки.
В ходе работы с приложением пользователь может воспользоваться всеми имеющимися на форме элементами, а может использовать только их часть, причем он сам будет определять, какими именно элементами следует воспользоваться, задавая тем самым свой собственный режим работы. Таким образом обеспечивается больший демократизм работы с программным продуктом по сравнению с приложениями MS-DOS.
Элементы, расположенные на форме, называются объектами приложения. К числу объектов относится и сама форма или формы, имеющиеся в приложении. Каждый объект обладает определенным набором свойству которые
можно настраивать либо с помощью средств графического интерфейса, либо программным образом. Каждое из свойств может иметь различные значения. Минимальное количество значений свойства равно двум. Например, надпись на форме может быть видимой или невидимой в зависимости от значения свойства объекта нвидимость" (по английски ——Visible). Если значение свойства visible равно true (истина), то объект будет видимым, а если свойство visible имеет значение false (ложь), то объект будет невидимым. Другие свойства того же объекта могут иметь большее количество значений. К таким свойствам относится, например, цвет надписи, который может быть черным, белым, красным, синим, зеленым, желтым и т. д.
Свойства объекта не являются раз и навсегда неизменными. Они могут изменяться в ходе работы приложения при воздействии пользователя на объект. Такие действия, производимые пользователями в отношении объекта, назьь ваются событиями. Для каждого объекта существует свой перечень событий, на которые он может реагировать. К числу наиболее распространенных событий относится щелчок левой кнопкой мыши на объекте, щелчок правой кнопкой, двойной щелчок, наведение мыши на объект, нажатие клавиши <Entcr>. нажатие кнопки мыши без ее отпускания, перетаскивание объекта, изменение текста, который содержит объект н др. Помимо событий, инициированных пользователем, могут быть еще и системные события, о которых мы поговорим позже.
Поскольку ход работы приложения в значительной стененн определяется реакцией объектов на соответствующие им события, то систему программирования Delphi часто называют также системой событийно-ориентированного программирования. Реакция объекта на какое-либо событие, как правило, записывается в виде отдельной процедуры на языке программирования. В системе Delphi языком, используемым для написания кода, является Object Pascal, который представляет собой дальнейшее логическое развитие языка Turbo Pascal. Процедуру, описывающую реакцию объекта на некоторое событие, часто называют также обработчиком этого события.
Delphi является системой визуального программирования. Это означает, что в системе программирования имеются готовые библиотеки элементов, которые можно использовать для создания будущего приложения. Такие элементы называются компонентами приложена. Выбор нужного компонента не требует написания специального кода, а производится с помощью мыши, т. е. графическим или, иначе говоря, визуальным способом. Когда объект уже перенесен посредством перетаскивания на форму, то его дальнейшая настройка большей частью также производится визуальным способом с помощью мыши.
Например, если нам нужно изменить цвет объекта, то мы можем открыть раскрывающийся список и из него выбрать подходящий цвет. Изменять гео-
метрические размеры объекта можно методом протягивания, подобно тому как это делается для окон, хотя надо сказать, что система Delphi допускает и более точный способ регулировки размеров объекта пугем изменения числовых значений свойств Height и width (соответственно высота и ширина).
В некоторых случаях без использования клавиатуры все же не обойтись, например при изменении заголовка объекта. Но и в этом случае характеристики шрифта можно изменять визуальным способом. Для этого достаточно открыть диалоговое окно Font (Шрифт). В нем путем выбора значений из раскрывающихся списков можно выбрать гарнитуру шрифта, его начертание, кегль (размер шрифта). Из имеющейся в диалоговом окне палитры можно выбрать цвет шрифта, а установив щелчком мыши соответствующий флажок, можно сделать гекст подчеркнутым или зачеркнутым.
В ходе дальнейшего изложения материала мы более подробно остановимся на указанных ранее характеристиках системы н покажем, как они используются для разработки конкретных приложений.
Как установить Delphi
Понятно, что для того чтобы научиться программировать в системе Delphi, нужно эту систему иметь на компьютере. Система не будет работоспособна, если не произвести предварительно процедуру ее установки на компьютер. Установка системы программирования возможна двумя способами. Во-первых, через Интернет. Для этого нужно выйти на сайт компании Borland Inc., которая является производителем данной системы. С сайта можно установить на компьютер условно-бесплатную версию системы программирования.
Однако данный способ обладает двумя существенными недостатками. Во- первых, даже ''облегченная" версия системы программирования занимает свыше 100 Мбайт, что в условиях нашей страны, где выход в Интернет осуществляется в основном по телефонным линиям, потребует для установки очень большого количества времени и соответствующих материальных затрат. Если учесть, что передача одного мегабайта информации по отечественным телефонным линиям занимает в среднем около Ю минут, то нетрудно подсчитать, что для загрузки всех необходимых файлов системы потребуется порядка 20 часов непрерывного подключения к Интернету. Во-вторых, установленная версия системы будет иметь ограничения как по времени ее использования, так и по своим функциональным возможностям. Поэтому наиболее рациональным путем в наших условиях является установка системы программирования с компакт-диска, на котором имеется полноценная версия данной системы. Поскольку для начинающего пользователя процедура установки программного комплекса с лазерного диска может представлять определенные трудности, мы подробно опишем эту процедуру в данной главе.
На момент выхода данной книги в свет наиболее распространенными версиями системы программирования Delphi являются 5.0, 6.0 и 7.0. В данной главе мы рассмотрим установку Delphi на примере шестой версии (процесс установки пятой и седьмой версии никаких принципиальных отличий не имеет).
После установки диска в дисковод вы увидите экран оболочки, на котором вам предлагается выбрать устанавливаемую версию программного продукта.
В меню щелчком мыши выбираем английскую версию системы программирования, т. к. без ее предварительной установки нельзя будет потом установить русифицированную версию программы. После выбора версии начинается сам процесс установки. На экране компьютера появляется окно оболочки программы установки Delphi 6.0 (рис. 12.1).
Рис. 12.1. Окно оболочки программы установки Delphi
Подводя указатель мыши к каждому компоненту системы, отмеченному треугольной стрелкой, можно получить краткую информацию (на английском языке) о нем. Например, если подвести указатель мыши к надписи Delphi 6 (основное ядро системы программирования) и задержать его там на несколько секунд (при этом указатель приобретает форму человеческой руки), то вы сможете увидеть следующее сообщение: "Requires 350 mb hard disk space for full install'*. Это означает, что для полноценной установки системы программирования на ваш компьютер требуется 350 Мбайт свободного места на жестком диске компьютера. Если у вас имеется требуемое количество свободного места, то можно приступать к дальнейшей установке системы программирования. Для этого достаточно щелкнуть мышью указанную надпись.
Подготовку к процессу установки производит специальная программа- инсталлятор (Windows Installer) (рис. 12.2). Пока эта программа выполняет подготовительную работу, никаких действий производить не следует.
Рис. 12.2. Окно программы-инсталлятора
По завершении работы инсталлятора на экране появляется окно специальной программы, которая и производит непосредственную работу по установке Delphi (рис. 12.3). Эта программа называется Installation Wizard, что в переводе с английского означает 11 мастер установки".
Рис. 123 Окно мастера установки Delphi
Для перехода к следующему этапу установки программы нужно щелкнуть мышью на экранной кнопке Next (Далее). После щелчка на этой кнопке на экране появляется следующее окно, в котором нужно ввести серийный номер устанавливаемого программного продукта (Serial Number) и ключ програм-
мы (Authorization Key) (рис. 12.4). Без правильного указания этих данных дальнейшая установка системы программирования будет невозможна. Как правило, серийный номер и ключ указываются на упаковке компакт-диска.
Рис. 12.4. Окно ввода серийного номера продукта и ключа программы
Серийный номер состоит нз трех полей. После заполнения очередного поля курсор (имеющий вид вертикальной черты) переходит в следующее поле. Когда все три поля правильно заполнены, можно переходить к вводу ключа программы. Этот переход осуществляют нажатием клавиши <ТаЬ> либо щелкнув мышью первое поле для ввода ключа. Принцип ввода ключа тот же, что и для серийного номера. После того как все поля правильно заполнены, можно переходить к следующему этапу установки системы программирования щелчком на кнопке Next.
Если пользователь ошибся при вводе указанных данных, на экране компьютера появляется окно с предупреждением о том, что следует еще раз сверить введенную информацию с тем, что указано на упаковке диска, и исправить данные, содержащиеся в полях. Наиболее типичная ошибка при вводе заключается в том, что пользователь перед вводом номера и ключа забыл переключить клавиатуру с русского регистра на английский. Окно с предупреждением об ошибке следует закрыть щелчком на экранной кнопке ОК. исправить допущенные ошибки и снова нажать кнопку Next для перехода к следующему этапу установки.
Далее на экране компьютера появляется окно с текстом лицензионного соглашения об установке системы программирования (на английском языке). Так как текст лицензионного соглашения достаточно велик по объему, он целиком не помещается в окне, и для того чтобы с ним полностью ознакомиться, нужно использовать расположенную справа от текста полосу прокрутки (рис. 12.5),
Рис. 12.5. Окно с текстом лицензионного соглашения об установке Delphi
Под текстом соглашения находится группа из двух переключателей. Если пользователя не устраивают условия лицензионного соглашения, то нужно щелкнуть нижний переключатель, на котором написано I do not accept the terms in the license agreement (Я не принимаю условий лицензионного соглашения). В этом случае установка системы программирования отменяется. Если пользователь согласен с лицензионным соглашением, то нужно щелкнуть верхний переключатель с надписью I accept the terms in the license agreement (Я принимаю условия лицензионного соглашения), а затем щелкнуть на кнопке Next для продолжения процесса установки.
Далее на экране компьютера появляется окно с текстом руководства по дальнейшей установке системы программирования (рис. 12.6). Текст этого руководства также целиком не помещается в отведенном для него окне, поэтому для перемещения по тексту, как и в предыдущем случае, следует использовать полосы прокрутки. Так как текст написан на английском языке, то для пользователей, не владеющих этим языком, приведем следующую информа-
цию, содержащуюся в данном руководстве м имеющую важное значение для нормальной установки и дальнейшей работы системы программирования.
Рис. 12.6. Окно с текстом руководства по установке системы программирования
Для того чтобы систему программирования можно было установить на компьютере, он должен отвечать следующим требованиям:
компьютер должен иметь как минимум центральный процессор Pentium с тактовой частотой не менее 166 МГц (рекомендуется Pentium 2 с тактовой частотой не менее 400 МГц);
на компьютере должна быть установлена операционная система Windows 98 либо другие более новые версии той же операционной системы (Windows 2000, Windows ME и т. д.);
компьютер должен нметь оперативную память объемом не менее 64 Мбайт (рекомендуется 128 Мбайт);
компьютер должен иметь не менее 115 Мбайт свободного места на жестком диске для компактной установки системы и не менее 350 Мбайт для установки полноценной версии системы;
компьютер должен иметь дисковод для компакт-дисков;
монитор компьютера должен поддерживать разрешение не менее чем 640x480 пикселов;
компьютер должен иметь мышь или какое-либо другое координатное устройство (трекбол, сенсорную панель).
Если ваш компьютер удовлетворяет указанным требованиям, то вы можете быть уверены в том, что дальнейшая установка системы пройдет без проблем, а сама работа с системой программирования будет достаточно уверенной и ко\!форткой. В этом случае после ознакомления с руководством нужно нажать кнопку Next для продолжения процесса установки.
На следующем этапе вам нужно выбрать вариант установки системы программирования (рис. 12.7). Мастер установки предлагает на выбор три варианта: Typical (Обычный), Compact (Компактный) и Custom (Выборочная установка). В большинстве случаев рекомендуется выбирать обычный способ установки. Компактно亩 способ установки нужно использовать, когда на жестком диске компьютера мало свободного места. В этом случае устанавливаемая версия будет работоспособна, но в то же время она будет иметь ряд функциональных ограничений. Выборочная установка рекомендуется для опытных пользователей, которые уже работали с более ранними версиями той же системы программирования, и знают, какие компоненты им будут нужны для успешной работы с системой, а какие можно не устанавливать. При выборочной установке можно таюке указать диск н папку, в которую будет установлена система программирования.
Выбор наиболее подходящего пользователю варианта установки производится щелчком на соответствующем переключателе. После выбора оптимального варианта щелчком на кнопке Next переходим к следующему этапу установки программы.
Рис. 12.7. Окно выбора варианта установки системы программирования
Мастер установки запрашивает пользователя» нужно ли устанавливать дополнительный компонент VisiBroker. Выбор одного из двух возможных вариантов установки или отказ от установки компонента производится щелчком на одном из трех имеющихся в окне мастера переключателей (рис. 12.8). Поскольку данный компонент в случае необходимости можно будет установить позже, то на этом этапе можно отказаться от его установки, щелкнув переключатель No VisiBroker/CORBA Support. Затем щелчком на кнопке Next переходим к очередному этапу установки.
Рис. 12.8. Окно выбора варианта установки дополнительного компонента VisiBroker
На следующем этапе мастер установки запрашивает пользователя, какой набор элементов управления для пакета Microsoft Office следует использовать по умолчанию (рис. 12.9). В принципе система программирования обеспечивает поддержку элементов управления и для версии Office 97 и для версии Office 2000, но если у вас на компьютере установлена версия пакета Office 97, то рекомендуется щелкнуть соответствующий переключатель. Если же на компьютере установлена версия пакета Office 2000 или Office ХР, то щелкаем переключатель Office 2000. После выбора переключателя щелчком на экранной кнопке Next переходим к следующему этапу.
Далее мастер установки запрашивает, нужно ли при установке пакета также устанавливать дополнительный компонент InterBase Client (рис. 12.10). Установка данного компонента требуется для того, чтобы по окончании процесса установки можно было полностью использовать все возможности системы
Рис. 12.9. Окно выбора набора элементов управления для Microsoft Office
Рис. 12Л0. Окно выбора установки компонента InterBase Client
программирования. Для установки этого компонента требуется порядка 10 Мбайт на жестком диске компьютера, поэтому если на винчестере достаточно свободного места, то можно подтвердить его установку, отметив соот-
ветствующий флажок. Если же на винчестере имеется дефицит свободного места, то флажок можно снять щелчком мыши на нем. Затем щелчком на кнопке Next переходим к следующему этапу установки.
Далее мастер установки выводит на экран дополнительное лицензионное соглашение по установке указанного ранее компонента (рис. 12.11). Если пользователь согласен с условиями данного соглашения, то подтверждаем это щелчком на верхнем переключателе I agree with the terms of this license. Если же пользователь щелкнет нижний переключатель, на котором написано 1 do not agree. Installation will continue, but without remote data functions, то процесс установки самой системы программирования будет продолжен, но при этом указанные дополнительные компоненты устанавливаться не будут. Затем щелчком на кнопке Next переходим к дальнейшей установке системы.
Рис. 12.11. Окно, содержащее текст лицензионного соглашения по установке дополнительного компонента системы программирования
На следующем этапе мастер установки сообщает пользователю о том, на каком логическом диске и в каких папках будут установлены компоненты программы (рис. 12.12). Например, основные файлы системы программирования будут установлены на логическом диске С: в папке, находящейся по адресу Program Files\Borland\Delphi6. В принципе можно изменить логический диск и папку для установки программных файлов, щелкнув на экранной кнопке Change. Щелчок на данной кнопке открывает диалоговое окно, позволяющее
выбрать нужный диск и папку. Однако если на логическом диске имеется достаточное количество свободного места, то лучше указанные адреса не менять, а перейти щелчком на кнопке Next к следующему этапу установки.
寻 Bsland Delphi 6 EnteipMse Edition - InsUUaiion WizaE
Click Next to Install to this folder, or click Change to bstel to a dfffereht folder,Click Next to Install to this folder, or click Change to bstel to a dfffereht folder,Рис. 12.12. Окно выбора дисков и папок для установки системы программированияРис. 12.12. Окно выбора дисков и папок для установки системы программированияРис. 12.13. Окно сохранения базы данных по установке системы программированияРис. 12.13. Окно сохранения базы данных по установке системы программированияDestination Folder
Click Next to Install to this folder, or click Change to bstel to a dfffereht folder,
Click Next to Install to this folder, or click Change to bstel to a dfffereht folder,
Рис. 12.12. Окно выбора дисков и папок для установки системы программирования
Рис. 12.12. Окно выбора дисков и папок для установки системы программирования
Рис. 12.13. Окно сохранения базы данных по установке системы программирования
Рис. 12.13. Окно сохранения базы данных по установке системы программирования
Далее мастер установки запрашивает пользователя, нужно ли сохранять на жестком диске компьютера базу данных по установке системы программирования (рис. 12.13). Файлы базы данных занимают на винчестере около 5 Мбайт. Они могут понадобиться в том случае, если необходимо удалить систему программирования с компьютера, не используя при этом сам компакт-диск. Рекомендуется создать такую базу данных, для чего нужно оставить без изменений имеющийся в окне флажок. Затем щелчком на кнопке Next переходим к следующему этапу установки.
Наконец, на экране компьютера появляется окно мастера, в котором сообщается о том, что он готов к началу установки системы программирования (рис. 12.14). Для того чтобы начать процесс установки системы, необходимо щелкнуть на экранной кнопке Install (Установить), что мы и делаем.
Рис. 12.14. Окно, содержащее сообщение о том, что программа>мастер готова начать установку системы программирования
После щелчка на кнопке Install на экран компьютера выводится окно, в котором пользователю демонстрируется процесс копирования файлов, необходимых для установки программы (рис. 12.15). Для наглядности ход установки представляется в виде специальной диаграммы. Серая полоса в нижней части окна мастера постепенно заполняется прямоугольниками синего цвета. Над диаграммой в центральной части окна выводятся различные сообщения на английском языке, в которых рассказывается об основных характеристиках и достоинствах устанавливаемой системы программирования. Когда серая по-
л оса оказывается целиком заполнена синими прямоугольниками, это означает, что процесс копирования завершен.
Рис. 12.15. Окно программы-мастера, показывающее в виде диаграммы процесс копирования файлов, необходимых для установки программы
Затем мастер в автоматическом режиме удаляет вспомогательные файлы, которые более не нужны для установки программы и переходит к установке дополнительного компонента InterBase Client (рис. 12.16).
Для того чтобы начать установку этого компонента, следует щелкнуть в окне установки экранную кнопку Next. Затем на передний план выводится окно, которое содержит руководство по установке компонента InterBase Client (рис. 12.17).
Затем на передний план выводится окно, которое содержит текст лицензионного соглашения по использованию данного компонента (рис. 12.18).
Подтверждаем согласие с условиями лицензионного соглашения щелчком на экранной кнопке Yes (Да). Далее на переднем плане появляется окно, которое содержит следующую информацию (рис. 12.19). В верхней части данного окна содержится список устанавливаемых компонентов. Под ним имеется небольшое окно, в котором указаны логический диск и папка, куда по умолчанию должны быть установлены программные файлы. Список компонентов, а также указанные по умолчанию диск и папку изменять не рекомендуется. Для того чтобы приступить к непосредственной установке набора дополнительных компонентов, следует щелкнуть на экранной кнопке Install.
Рис. 12.16. Начальное окно установки компонента InterBase Client
Рис. 12.17. Окно, содержащее руководство по установке компонента InterBase Client
Далее на экране компьютера появляется окно с диаграммой, которая наглядно показывает процесс установки дополнительных компонентов. Когда процесс копирования файлов завершен, необходимо для завершения процесса установки дополнительных компонентов щелкнуть на экранной кнопке Finish (Готово) (рис. 12.20).
• .4. ,•■* ' ■ ' CW; -• .4. ,•■* ' ■ ' CW; -Software License Aqrccmcnl
• .4. ,•■* ' ■ ' CW; -
• .4. ,•■* ' ■ ' CW; -
'Q)e雖,侬;嵯:専滿讪(^o Aoroement Pre» ineFA瓚BQ麻皆to see pQe#i ;一
9 暫;也ёе^^^^Jj. ,' J 三 ■.…,二了一," •一;, '-'*
INTERBISK MDii KIT二炉名丈厘泗
tlCENSI STl^RENT AND EIMITtD'WARRANTY7京
1К>0ЮМЙТ - ЙЕАО • СmruUTf "".;,…予导您襲翻宙二' ТЫз bicenbe Statement ^nd timixed. Uarranty 'йтх? I: в cbnMtrltuors; d legal,aereesent 二 .♦ . *上』-扌,^?; ("Шеем^ 如凜евег””). tmg'— гаи gfZr R" m+落.
indxvidual pt a elngle :entifcy},
snd .Borland Sofcvare Cdr^cfeac^oh 『вА£1йй16, for 什—* 2 Ut Ei』
Ьо 冲 accept Miho terns d 网 ph^ced^ yo)meAgmmeh(7 If you cbobSNo, SMup v4dw.,6in^aB|hephd0d;youTm«tecS^坤^««^
• No • I
Рис. 12.18. Окно с текстом лицензионного соглашения по использованиюдополнительного компонента
Рис. 12.19. Окно, содержащее информацию о готовности приступить к установке компонента InterBase ClientРис. 12.19. Окно, содержащее информацию о готовности приступить к установке компонента InterBase Client
Рис. 12.19. Окно, содержащее информацию о готовности приступить к установке компонента InterBase Client
Рис. 12.19. Окно, содержащее информацию о готовности приступить к установке компонента InterBase Client
После щелчка на этой кнопке окно установки InterBase Client закрывается, и на экране компьютера появляется окно мастера установки системы программирования Delphi 6, в котором сообщается, что установка системы успешно
произведена^ и для ее корректного завершения необходимо щелкнуть кнопку Finish (рис. 12.21).
Рис. 12.20. Окно, сообщающее о завершении процесса установки InterBase Client
Рис. 12.21. Окно, сообщающее о том. что процесс установки системы программирования Delphi 6 успешно завершен
После этого на экран компьютера выводится окно, которое информирует пользователя о том, что для окончательной установки программы необходимо перезагрузить компьютер. Для подтверждения необходимости перезагрузки нужно щелкнуть экранную кнопку Yes, а для отказа от немедленной перезагрузки —щелкнуть экранную кнопку No. Рекомендуется сразу произвести перезагрузку, щелкнув кнопку Yes. Далее автоматически производится перезагрузка компьютера. По завершении перезагрузки можно извлечь компактдиск из дисковода, н на этом процесс установки системы программирования Delphi 6.0 на компьютер будет завершен.
Для того чтобы это проверить, достаточно войти в главное меню компьютера, нажав кнопку Пуск (Start), открыть раздел Программы (Programs) и убедиться, что в данном разделе появились пункты Borland Delphi и InterBase.
Для русификации имеющейся английской версии нужно вновь запустить программу-оболочку, имеющуюся на компакт-диске, н в ней выбрать кнопку Русская версия, а затем установить эту версию в соответствии с имеющимися на диске инструкциями. Однако при дальнейшем изложении основ программирования в системе Delphi мы будем все же опираться на английскую версию системы, как имеющую наиболее широкое распространение среди программистов (в том числе и в нашей стране).
Запуск среды программирования
Так как система программирования Delphi является приложением операционной системы Windows, то, подобно большинству действий в данной операционной системе, запуск системы программирования можно производить несколькими разными способами. Рассмотрим эти способы (конечно, подразумевается, что система Delphi была правильно инсталлирована на ваш компьютер в соответствии с рекомендациями, изложенными в предыдущем разделе).
□ Нужно открыть папку, содержащую головной файл, имеющий название Delphi32.exe. Для этого необходимо на компьютере найти и открыть папку Program Files (эта папка, как правило, находится в корневом каталоге диска С:), затем найти в этой папке вложенную папку Borland, открыть ее и в ней найти вложенную папку Delphi, а в той в свою очередь открыть папку bin. Эта папка и будет содержать файл Delphi32.exe. Запуск файла производится двойным щелчком на значке файла, если для данного компьютера установлен классический стиль работы с мышью, и одиночным щелчком на значке, если на компьютере используется стиль Web.
口 Открыть главное меню операционной системы нажатием клавиши Пуск. Найти в главном меню раздел Программы, а в этом разделе найти под-
раздел Borland Delphi, в котором есть пункт Delphi. Щелчок на этом пункте приводит к запуску системы программирования.
口 Если на рабочий стол Windows выведен ярлык для файла Delphi32, то систему программирования можно запустить, не открывая главное меню или какие-либо папки. Для этого достаточно два раза щелкнуть на этом ярлыке для обычного стиля работы с мышью или один раз щелкнуть в том случае, если для мыши используется стиль Web.
После выполнения одной из указанных ранее операций на зкране компьютера на некоторое время появляется специальная заставка, которая содержит надпись Borland Delphi, а также номер установленной версии Delphi. После успешного завершения процедуры запуска на экране компьютера появляется основной экран системы программирования Delphi. Рассмотрением элементов экрана мы и займемся в следующем разделе.
ГЛАВА 13
Приступаем к программированию в Delphi
Система Delphi постоянно совершенствуется, и поэтому все время появляются ее новые версии. Освоив работу в какой-либо версии, не трудно при желании перейти к более совершенной версии и продолжать в ней работать, т. к. у всех версий очень похожи основные элементы. Изучив интерфейс среды Delphi, можно приступать к написанию первой несложной программы, а после ее отладки и к запуску. Приведенные в этой главе готовые проекты должны помочь обучающемуся при выполнении самостоятельного задания в конце главы.
Элементы экрана среды Delphi
Внешний вид экрана системы программирования может несколько отличаться от версии к версии, но основные его элементы одинаковы или сходны между собой во всех версиях Delphi. В книге для сравнения приводится внешний вид основного экрана для пятой версии (рис. 13.1). шестой (рис. 13.2) и седьмой версии (рис. 13.3) среды Delphi.
Во всех этих версиях содержатся следующие элементы экрана (см. рис. 13.3):
строка заголовка;
口 главное меню системы программирования (строка меню);
панели инструментов;
палитра компонентов;
окно инспектора объектов;
口 окно формы;
окно кода.
Рис. 13.1. Экран среды программирования Delphi 5
Рис. 13.2. Экран среды программирования Delphi 6
Рис. 13.3. Экран среды программирования Delphi 7
В шестой и седьмой версиях имеется еще одно дополнительное окно со списком объектов. В пятой версии вместо него можно использовать раскрывающийся список, имеющийся в инспекторе объектов.
В строке заголовка содержится номер установленной на данном компьютере версии системы Delphi н название открытого в данный момент проекта. Проектом в Delphi называется программа, находящаяся в стадии разработки. Вновь открываемый проект по умолчанию называется Project!. Это имя мы, скорее всего, и увидим в строке заголовка после загрузки системы программирования.
Под строкой заголовка находится строка главного меню системы. Эта строка содержит ряд разделов, каждый из которых представляет собой ниспадающее меню. Для того чтобы открыть ниспадающее меню, достаточно щелкнуть мышью на названии соответствующего раздела. Каждое такое ниспадающее меню содержит ряд команд. Если справа от названия команды стоит многоточие, то при выполнении этой команды открывается диалоговое окно. Если название команды закрашено серым цветом, то эта команда в данный момент времени невыполнима. Названия же тех команд, которые можно в данный момент использовать, написаны символами черного цвета. Если справа от названия команды стоит треугольная стрелка, то это означает, что данная
команда содержит еще одно вложенное меню, в котором можно выбрать один из предложенных вариантов.
Например, если сразу после того, как будет установлен основной экран, щелкнуть раздел меню File (Файл), содержащий команды для работы с файлами в системе программирования, то в нем все команды написаны черным цветом, т. е. доступны для выполнения. Справа от пункта Save as (Сохранить как) находится многоточие, означающее, что в ходе выполнения команды появится диалоговое окно, которое позволит сохранить файл в указанной пользователем папке. Справа же от пункта New (Новый ——создание нового элемента проекта) находится треугольная стрелка, которая показывает, что при выполнении этой команды откроется меню, содержащее перечень тех элементов (приложение, форма, программный модуль и т. д.), которые можно добавить в программу.
Если же открыть другой раздел меню Edit (Редактировать— он содержит команды, используемые для редактирования текста проекта), то первоначально в этом разделе ряд команд будет закрашен серым цветом. Это команды, используемые для работы с выделенным фрагментом текста. Так как изначально ни один фрагмент текста не выделен, то использование этих команд лишено смысла. Когда в процессе работы над программой будет выделен какой-либо фрагмент текста, то команды Cut (вырезать выделенный фрагмент текста в буфер обмена). Сору (скопировать фрагмент в буфер обмена). Paste (вставить фрагмент в то место программы, на котором стоит курсор). Delete (удалить выделенный фрагмент) станут доступными и будут закрашены черным цветом.
Под строкой меню находятся панели инструментов^ каждая из которых представляет собой набор экранных кнопок. На каждой кнопке имеется пиктограмма, т. е. небольшой рисунок, который поясняет назначение данной кнопки. Кроме того, если навести на кнопку указатель мыши и задержать его на несколько секунд, то рядом с кнопкой появляется всплывающая подсказка, которая кратко поясняет назначение кнопки в словесной форме. В нерусифи- цированных версиях Delphi эта подсказка выводится на английском языке. Большинство кнопок панелей инструментов дублируют наиболее часто употребляемые команды меню.
Справа от панелей инструментов находится ncviumpa компонентов, которая содержит большое количество вкладок. Каждая из вкладок таюке фактически является панелью инструментов, состоящей из ряда экранных кнопок. Каждая из этих кнопок представляет собой заготовку для будущих экранных объектов создаваемого проекта. Переключение между вкладками производится щелчком на корешке соответствую шей вкладкн.
Ниже расположено окно формы. Форма представляет собой заготовку для окна будущей программы. Именно на форме в процессе работы над проектом
размещаются различные объекты, переносимые с вкладок панели компонентов. Эти объекты в совокупности составляют пользовательский интерфейс, т. е. средство взаимодействия между пользователем и программой. На форме имеется специальная координатная сетка, которая используется для более точного расположения объектов. При запуске программы на выполнение координатная сетка исчезает, и фон формы становится однородным.
Слева от формы находится окно, содержащее список всех объектов используемых во время работы над данным проектом. Данный список представлен в форме древовидной структуры наподобие дерева файлов в программе Проводник, являющейся стандартным приложением ОС Windows. Если какой- либо объект содержит другие, вложенные в него объекты, то слева от значка объекта имеется квадратик со знаком "плюс”. Для того чтобы узнать, какие это вложенные объекты, достаточно щелкнуть мышью на квадратике. После этого соответствующие объекты будут выведены в окне, а "плюс” изменится на "минус". Для того чтобы "спрятать" вложенные объекты, достаточно снова щелкнуть на квадратике.
Рис. 13.4. Окно инспектора объектов
Если же щелкнуть мышью на значке самого объекта, то он будет выделен синим цветом, а в расположенном ниже окне инспектора объектов можно будет ознакомиться с его свойствами. Окно инспектора объектов (рис. 13.4) содержит две вкладки. На одной из них, имеющей название Properties (Свойства), содержится перечень свойств, присущих данному объекту. Большинство свойств объекта можно изменять непосредственно в этом окне либо путем ввода соответствующего текста или числового значения, либо выбором нужного значения из раскрывающегося списка. На другой вкладке, имеющей название Events (События), содержится перечень событий, на которые может реагировать данный объект. Для того чтобы запрограммировать реакцию
объекта па произошедшее событие, как правило, нужно написать соответствующий программный код, отображаемый в окне кода.
Окно кода обычно не видно целиком на экране системы, т. к. большая его часть закрыта окном формы, и пользователь видит только нижнюю строку этого окна. Для того чтобы активизировать окно кода (т. е. вывести его на передний план), нужно щелкнуть на любом видном пользователю его фрагменте, либо, если окно закрыто целиком, использовать команды из меню View. Данное окно содержит исходный текст программы (называемый также исходным кодом), написанный на языке Object Pascal.
Элементы экрана системы Delphi расположены таким образом, что они не закрывают основные элементы управления ОС Windows. Поэтому в ходе работы всегда можно воспользоваться главным меню кнопки Пуск или панелью задач, например, для того, чтобы переключаться между Delphi и другими открытыми пользователем во время работы за компьютером приложениями, щелкая мышью соответствующие кнопки на панели задач.
Первая программа на Delphi
Как это ни странно, создание первой программы в системе Delphi начнем с того, что сохраним программу, хотя на первый взгляд кажется, что программы как гаковой еще не существует. Однако, как только пользователь войдет в систему программирования, он может убедиться, что существуют не только заготовки для экранных объектов в виде кнопок палитры компонентов, но и заготовка самой программы. Для этого достаточно активизировать окно кода так, как это было сказано в предыдущем разделе. Когда это окно выйдет на передний план, вы увидите, что в данном окне уже имеются определенные строки, содержащие текст программы. Эти строки автоматически генерируются системой программирования. В дальнейшем пользователь сам сможет по мере необходимости добавлять в окне строки, дополняющие эту основу. При этом необходимо иметь в виду, что при разработке проекта система создает целую группу связанных между собой программных файлов.
Поэтому рекомендуется каждый вновь создаваемый пользователем проекг сохранять в отдельной папке с тем, чтобы программист не путал файлы, относящиеся к разным проектам. В качестве места, где будут храниться все создаваемые в процессе программирования папки、лучше всего взять папку, уже имеющуюся в системе программирования. Эта папка так н называется Projects и расположена по следующему адресу (предполагается, что система программирования правильно инсталлирована и расположена на диске С:): CXProgram Files\Borland\Delphi. В данной папке и будут создаваться вложенные папки, сохраняющие файлы разрабатываемых пользователем проектов.
Рассмотрим конкретные шаги, которые необходимы для начального сохранения проекта.
Прежде всег'о необходимо открыть раздел File (Файл) главного меню и в нем найти команду Save as (Сохранить как). При выполнении этой команды откроется диалоговое окно Save Unitl as (сохранение модуля 1) (рис. 13.5). В данном окне будет отображаться содержимое папки Projects. Для того чтобы создать новую папку внутри папки Projects, следует щелкнуть кнопку I函| на панели инструментов данного окна. Если пользователь не может сразу обнаружить эту кнопку, то следует поочередно подводить указатель мыши ко всем кнопкам, пока на одной из них не появится всплывающая подсказка "Созданне новой папки". После щелчка по этой кнопке в окне появится папка, которая так и будет называться "Новая папка".
Рис. 13.6. Диалоговое окно сохранения файла исходного текста программы
Понятно, что такое название неинформативно, т. к. ничего не говорит о содержании данной папки. Поэтому рекомендуется дать ей какое-либо осмысленное название. Например, папку с проектом вашей первой программы можно назвать First (по-английски это слово н означает мпервыйм)- Для того чтобы переименовать вновь созданную папку, следует нажать на клавиатуре клавишу <Delete>, в результате чего исчезнет название иНовая папка*', н ввести с клавиатуры подходящее название, а затем нажать клавишу <Enter>. Затем нужно щелкнуть экранную кнопку Открыть, имеющуюся в диалоговом окне. При этом вновь созданная папка будет открыта и в окне будет видно, что папка пустая. Если щелкнуть на кнопке Сохранить, то в этой папке будет сохранен файл Unitl, содержащий исходный текст разрабатываемой вами программы. Если пользователь допустил какую-либо ошибку (например, от-
крыл не ту папку), то можно закрыть окно без сохранения изменений, щелкнув кнопку Отмена.
Следующим шагом должно стать сохранение файла Project 1, в котором будет содержаться откомпилированная и готовая к выполнению программа. Для этого следует вновь войти в меню File и использовать команду Save Project as. В результате выполнения этой команды будет открыта вложенная папка (в нашем случае это папка First) н для сохранения файла проекта останется только щелкнуть экранную кнопку Сохранить. Окно сохранения проекта показано на рис. 13.6. Остальные связанные с проектом файлы будут сохраняться автоматически. В дальнейшем изменения в проекте рекомендуется сохранять после добавления и настройки каждого нового объекта, но повторять каждый раз всю изложенную ранее последовательность действий нет необход!Iмости. Достаточно дать команду Save all все из того же меню File, и все нужные изменения будут внесены в соответствующие файлы автоматически.
Рис. 13.6. Диалоговое окно сохранения файла проекта
Теперь можно приступать к непосредственной разработке проекта. Создание программы включает в себя два взаимосвязанных компонента. Первым из них является создание графического интерфейса пользователя^ который будет представлен в виде различных объектов и элементов управления, расположенных на экране программы. К ним относятся:
выводимые на экран компьютера надписи;
口 экранные кнопки, щелкая мышью на которых можно производить различные действия;
текстовые окна, используемые для ввода текста или чисел в ходе работы программы;
различные списки и меню;
группы флажков и переключателей, используемые для выбора одного из вариантов работы программы;
панели и рисунки, используемые для оформления экрана;
другие элементы.
Вторым компонентом, который необходим для разработки приложения, является программный код, описывающий реакцию имеющихся на экране объектов и элементов управления на различные события, которые могут происходить в ходе выполнения программы. Реакция на событие описывается в виде соответствующей подпрограммы, входящей в основной программный модуль. Подобно заготовкам для экранных объектов, текстовое окно, содержащее исходный код программы, также имеет заготовки для подпрограмм. В частности, по правилам языка Object Pascal каждая подпрограмма должна иметь заголовок, начинающийся со служебного слова procedure, в начале основной части подпрограммы должно содержаться служебное слово begin, а завершаться она должна служебным словом end, после которого ставится точка с запятой. Все эти слова вам не нужно будет вводить вручную, т. к. они уже имеются в автоматически создаваемой для них заготовке.
После того как эти два компонента будут созданы, можно проверить работоспособность программы, запустив ее на выполнение. Перед запуском программы рекомендуется ее сохранить, используя для этого команду File | Save all. Если в программе обнаружатся ошибки, то текстовая строка, их содержащая, будет выделена другим цветом, что облегчит пользователю поиск ошибок и их исправление. После завершения "работы над ошибками** программист получит готовую к выполнению, работоспособную программу.
Правда при этом нужно иметь в виду, что автоматически система находит только грамматические ошибки, т. е. строки, написанные с нарушением правил языка Object Pascal. Помимо них в программе могут содержаться и семантические, т. е. смысловые ошибки. Поиск семантических ошибок составляет наиболее трудную часть работы программиста. Но н эти трудности могут быть преодолены и конечным итогом работы станет программный продукт, который будет не только правильно н грамотно работать, но и будет обеспечивать для пользователя дружественный интерфейс (т. е. будет прост и удобен в использовании) и будет удовлетворять эстетическим запросам потребителя.
Первая программа, которую мы создадим в системе Delphi, будет производить следующие действия: выводить на экран компьютера надпись нМоя первая программа**, при щелчке мышью на одной из экранных кнопок выводить на экран компьютера сведения об авторе программы и при щелчке на другой кнопке закрывать программу.
Создание графического интерфейса программы начнем с создания надписи. Перенос любого элемента графического интерфейса в форму можно производить двумя способами.
Дважды щелкнуть мышью на соответствующей кнопке на панели компонентов. В результате выбранный элемент интерфейса разместится посередине формы.
Один раз щелкнуть мышью на кнопке на панели компонентов и затем щелкнуть мышью в любом месте формы. В результате выбранный элемент интерфейса появится в указанном месте. Этот способ обладает тем преимуществом, что программист может сам определять, где размещать выбранный элемент.
В данном случае элемент, который мы выбираем, находится в палитре компонентов (она занимает всю правую часть, отведенную на экране под панели инструментов) на вкладке Standard, которая расположена на данной панели первой слева. Этим элементом является надпись, которая по-английски называется Label. На соответствующей кнопке имеется пиктограмма в виде большой буквы А — I A
Далее, нужно перенести надпись в форму любым из двух описанных ранее способов. В результате в форме вы увидите надпись под названием Labeii. Затем пользователь должен отрегулировать положение надписи в форме (она должна находиться в верхней ее части) и ее размер. Содержанием данной надписи должна быть фраза "Моа первая программа". Как изменить содержание надписи, мы разберем чуть позже, а сейчас необходимо научиться регулировать положение и размеры надписи. Наиболее простой, хотя и не очень точный способ достижения поставленной задачи заключается в использовании мыши. Перемещать надпись по форме проще всего методом перетаскивания. Для этого нужно навести указатель мыши на центральную часть созданной надписи и нажать левую кнопку мыши. Затем, не отпуская кнопку, нужно переместить указатель мыши в нужное место формы. Вслед за указателем мыши переместится и надпись. Далее нужно отпустить кнопку мыши н надпись останется на выбранном пользователем месте.
Для изменения же размеров надписи используем следующий прием. Наведем указатель мыши на надпись и установим указатель на любую из границ надписи. Границы надписи отмечены специальными черными квадратиками, которые называются маркерами. На один из маркеров н нужно поместить указатель мыши. При этом указатель мыши изменит свою форму: он приобретет вид двунаправленной стрелки. Затем нужно нажать левую кнопку мыши и, не отпуская ее, переместить указатель мыши. Вслед за указателем переместится и граница надписи. Подобный прием, часто используемый для изменения размеров экранных объектов, называется протягиванием. Размеры
объекта (в данном случае объектом является надпись) можно изменять но трем направлениям: по горизонтали, по вертикали и по диагонали. В последнем случае размеры надписи будут изменяться одновременно по горизонтали и по вертикали. Для изменения вертикальных размеров нужно поместить указатель мыши на верхний или на нижний маркер, для изменения размеров по горизонтали указатель помещаем на один из боковых маркеров, а для изменения диагональных размеров используем любой из угловых маркеров.
В принципе, размеры надписи можно было бы и не изменять вручную, т. к. они впоследствии автоматически изменятся в соответствии с содержанием надписи, но надпись является хорошим объектом для тренировки. Поупражняйтесь с изменением размеров надписи и полученные навыки в дальнейшем пригодятся вам при работе с другими объектами, размеры которых не изменяются автоматически в зависимости от их содержания.
Следующей задачей, которую необходимо решить при разработке проекта, является изменение содержания и шрифта надписи. Для этого нужно, чтобы в окне инспектора объектов был выбран объект Label 1. Соответствующая надпись должна быть в текстовом поле, расположенном в верхней части окна инспектора объектов. В инспекторе объектов может отображаться и другой объект— сама форма, имеющая имя Forml. Это возможно, например, в том случае, если пользователь, настраивая размеры надписи, случайно щелкнул мышью не на ней, а на любом свободном месте формы. Исправить такое положение очень просто — для этого достаточно один раз щелкнуть мышью на надписи, расположенной в форме.
После того, как вы убедились, что в инспекторе объектов выделена именно надпись, нужно выбрать в инспекторе вкладку Properties (Свойства). На этой вкладке в алфавитном порядке перечислены все свойства обрабатываемого объекта. Каждое свойство в этом списке представлено в виде двух полей. В левом поле черным или коричневым цветом написано название свойства, в правом поле синим цветом указано значение, которое имеет в данный момент это свойство. Нас в данном случае интересует свойство Caption, т. е. содержание надписи, называемое также ее заголовком. По умолчанию свойство caption имеет значение Labeii, которое и отображается в поле, находящемся справа от названия (по умолчанию объект получает такой же заголовок, как и его имя).
Для того чтобы изменить значение этого свойства, нужно вначале удалить старое значение Labeii. Для чего нужно один раз щелкнуть мышью в правом поле. В результате в поле появится вертикальная черта, называемая курсором. Напомним, что для удаления символа, расположенного слева от курсора, нужно нажать на клавиатуре клавишу <Backspace>, а для удаления символа, который находится справа от курсора, следует нажать клавишу <Delete>. По-
10 Зак. 1068
еле того, как правое поле очищено, вводим новое значение поля — фразу "Моя первая программа". В результате соответствующая фраза появится и в надписи, расположенной на форме.
При этом имя надписи Label 1 останется неизменным, т. к. имя надписи и ее заголовок— разные свойства объекта. В этом нетрудно убедиться, увидев значение свойства Name (имя). Для того чтобы найти это свойство в инспекторе объектов, нужно использовать скроллер (полосу прокрутки), расположенную в правой части инспектора объектов. Прокручивать же содержимое инспектора объектов удобнее всего, перетаскивая мышью расположенный на полосе прокрутки серый прямоугольник, называемый лифтом. Найдя свойство Name, убедимся, что справа от названия по-прежнему указано значение Label 1. На начальном этапе работы с системой имена объектов вообще лучше не изменять.
Взглянув на надпись, имеющуюся в форме, нетрудно убедиться, что выглядит она весьма неказисто. А ведь именно эта надпись будет основным элементом интерфейса нашей первой программы. Для того чтобы улучшить внешний вид надписи, следует использовать ее свойство, называемое Font (шрифт). Для того чтобы найти это свойство в окне инспектора объектов, мы используем уже знакомую нам полосу прокрутки с лифтом. Когда мы найдем его, то увидим, что слева от названия свойства находится квадратик с плюсом. Это означает, что свойство является не простым, а составным, т. е. оно включает в себя ряд подсвойств.
Для того чтобы ознакомиться со списком этих подсвойств, можно щелкнуть на квадратике, и ниже свойства Font в инспекторе объеклов вы увидите соответствующий список. Конечно, для того чтобы изменить внешний вид шрифта, можно изменить значения ряда подсвойств, аналогично тому, как мы это делали со свойством caption. Но в данном случае мы воспользуемся более простым и наглядным способом настройки. Если щелкнуть один раз мышью в поле значений свойства Font, то в этом поле появится кнопка, на которой изображено многоточие. Это многоточие имеет то же значение, что и соответствующий элемент в главном меню системы. Если щелкнуть на этой кнопке называемой также построителем, то откроется диалоговое окно, в котором можно изменять основные характеристики шрифта. Внешний вид данного окна показан на рис. 13.7. Подобное окно хорошо знакомо пользователям, которые работали с программой Microsoft Word или другими приложениями ОС Windows. Удобство работы с этим окном заключается еще и в том, что в отличие от большинства элементов интерфейса Delphi оно русифицировано.
В данном случае мы изменим следующие настройки. Во-первых, мы увеличим размер шрифта с 8 (по умолчанию) до 12. Во-вторых, мы изменим цвет
шрифта — заменим используемый по умолчанию черный цвет на выбранный из раскрывающегося списка темно-синий. Помимо указанных настроек лри желании можно изменить гарнитуру шрифта. Например, вместо используемого по умолчанию шрифта MS Sans Serif можно поставить шрифт Arial, Times New Roman или любой другой из числа установленных на вашем компьютере. Кроме того, можно изменить начертание шрифта, сделав его наклонным (курсив) или полужирным. Наконец, в случае необходимости, щелкнув мышью соответствующий флажок, можно сделать текст подчеркнутым. В центре диалогового окна находится окошко, называемое Образец, в котором будут отображаться внешний вид текста надписи и все сделанные пользователем изменения. В случае если пользователь удовлетворен результатами своей работы, он может сохранить произведенные настройки, щелкнув на экранной кнопке ОК. После закрытия диалогового окна все сделанные пользователем настройки вступят в сипу, и можно будет увидеть, как преобразовалась надпись.
Рис. 13.7. Диалоговое окно настройки шрифта
Следующим элементом интерфейса, который мы поместим в форму, будет закрывающая кнопка. Строго говоря, данный элемент не является для программы обязательным, т. к. созданную нами программу, как и любое приложение Windows, можно закрыть с помощью закрывающей кнопки [xj, которая находится в правом углу строки заголовка. Однако для удобства пользователя принято, чтобы в программе имелся м другой способ ее закрытия (обычно с помощью экранной кнопки или пункта меню). Для того чтобы поместить на форму экранную кнопку, следует вновь воспользоваться вкладкой
Standard палитры компонентов. Искомый элемент имеет английское название Button и выглядит следующим образом ——ЕЯ. После выбора заготовки данного объекта мы поместим его в правой нижней части формы. По умолчанию на кнопке будет выведен заголовок Buttoni.
Желательно, чтобы заголовок кнопки соответствовал производимому ею действию. Сделать это можно, как и в случае с объектом Label 1, изменив значение свойства caption (такое свойство есть и у экранных кнопок). Снова вводим текст надписи— ^Закрыть программу1'. Если внешний вид текста пользователя не удовлетворяет, то, как и в случае с надписью, можно отрегулировать свойство Font, которое имеет точно такую же внутреннюю структуру, что и у надписи. Единственное отличие в настройке свойств этого объекта заключается в том, что кнопка не °растягиваетсяп автоматически в зависимости от величины заголовка. Поэтому размеры экранной кнопки следует отрегулировать путем перетаскивания маркеров. Теперь экранная кнопка приобрела желаемый внешний вид, а полученный в результате указанных ранее действий интерфейс программы приведен на рис. 13.8.
Рис. 13.8. Интерфейс первой программы на Delphi
Если на данном этапе работы запустить программу на выполнение, то сколько мы ни будем щелкать мышью на кнопке или нажимать клавишу <Enter>, никакой реакции на наши действия не будет. Для того чтобы такую реакцию запрограммировать, нужно написать соответствующий программный код. Сам по себе код, закрывающий программу, крайне прост. Он состоит из од- ного-единственного слова Close, которое в переводе с английского и означает
''закрыть**. Вопрос состоит в том, что нужно знать в каком месте программы его нужно вставить. Для того чтобы облегчить себе работу, воспользуемся уже знакомым нам окном инспектора объектов.
Выделим в окне формы объект Buttoni и в инспекторе объектов перейдем на вкладку Events (События). В качестве события, на которое должна реагировать наша кнопка, выберем щелчок мышью (по-английски — "click”). Если мы обратимся к инспектору объектов, то увидим, что там этому событию соответствует пункт onClick. Если щелкнуть два раза мышью на поле, находящемся справа от события OnClick, то перед нами откроется окно кода с уже имеющейся заготовкой процедуры, описывающей это событие. Между служебными словами процедуры begin и end вставляем требуемое слово close. Внешний вид окна кода программы приведен на рис. 13.9.
Рис. 13.9. Окно кода программы на Delphi
В данном окне должен быть виден следующий текст процедуры Buttoniciick, описываюи^ей реакцию на щелчок мышью на кнопке Закрыть программу:
procedure TForml.ButtonlClick(Sender: TObject}; begin close;
end;
Как видно из приведенного текста, заголовок процедуры и служебные слова система программирования вставляет автоматически. Для того чтобы убе-
диться, что созданная программа работоспособна, можно произвести запуск программы на выполнение. Запуск программы можно выполнить тремя способами.
Через главное меню системы программирования. В меню нужно найти раздел Run. Открыв этот раздел, найти в нем пункт, который тоже называется Run, и щелкнуть его мышью.
С помощью клавиатуры. Нажать на клавиатуре компьютера клавишу <F9>.
С помощью панели инструментов системы программирования. Найти кнопку запуска программы в виде треугольной стрелки 図 н щелкнуть ее мышью.
После запуска программы на выполнение любым из указанных способов произойдет следующее: на переднем плане экрана появится окно созданной вами программы. О том, что это именно окно работающей программы, а не заготовка программы в виде формы, можно догадаться по отсутствию координатной сетки. Эту программу можно закрыть теперь двумя способами: либо через закрывающую кнопку в строке заголовка, либо посредством созданной нами кнопки в нижней части окна. После закрытия программы мы вновь окажемся в системе программирования Delphi.
Несмотря на то, что программа уже работоспособна, работа над ней еще не закончена. Интерфейс программы должен включать в себя еще один элемент——экранную кнопку, при щелчке на которой на экран будут выводиться сведения о создателе программы. Такие сведения о себе сообщает любой уважающий себя программист. Вторая экранная кнопка создается и настраивается точно так же, как и первая, только называться она будет не Buttonl, а Button2. Содержимое же заголовка, помещаемого на этой кнопке, будет НСведения об авторе". Разместим мы эту кнопку в левом нижнем углу формы. На этом создание графического интерфейса данной программы завершено. Получившийся в результате описанных действий интерфейс показан на рис. 13.10.
Далее мы должны составить программный код, описывающий действие, происходящее при щелчке мышью на кнопке Button2. Действие же это будет заключаться в следующем. При щелчке на кнопке Сведения об авторе на экране вместо слов "Моя первая программа1* мы увидим надпись "Программу составил..." (вместо многоточия составитель программы может поставить свое имя и фамилию). Для этого при щелчке на экранной кнопке должно изменяться свойство надписи Caption. Когда мы в программе ссылаемся на свойства какого-либо объекта, то эта ссылка должна состоять из двух частей: имени объекта и названия свойства. Между этими двумя частями ставится точка. Поэтому заголовок нашей надписи будет описываться как
Labeli.caption. Изменение свойства осушествляется путем присваивания ему нового значения. Для этого используется оператор присваивания языка Паскаль, который состоит из двоеточия и знака равенства. Если присваиваемое значение является текстом, как в нашем случае, то оно должно быть обязательно заключено в кавычки. Таким образом, код, изменяющий содержание надписи, будет выглядеть так:
Label1.Caption:=•Программу составил ・.•'
Рис. 13.10. Усовершенствованный интерфейс первой программы
Для того чтобы вставить эту строчку в нужное место программы, следует выделить объект Button2, перейти на вкладку Events и дважды щелкнуть поле справа от пункта OnClick. В открывшуюся заготовку процедуры Button2.Click следует ввести приведенную строку. Обратим внимание на следующее обстоятельство: как только мы вводим слово Labeli и ставим после него точку» появляется список слов, которые можно ввести после этой точки. Для того чтобы выбрать какое-либо слово из списка, достаточно два раза щелкнуть его мышью. В результате оно появится в текстовой строке. Эта возможность автоматизации ввода текста особенно удобна в том случае, когда пользователь сомневается в правильности написания того или иного тер^ мина. Если воспользоваться указанной возможностью, то правильное с орфографической точки зрения слово подставит в текст сама система программирования. В листинге 13.1 приводится полный текст программы, который должен находиться в окне кода.
Листинг 13.1. Текст первой программы в Delphi
unit Unitl;
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type
TForml = class(TForm)
Labell: TLabel;
Buttonl: TButton;
Button2: TButton;
procedure Buttoniclick(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations J public
{ Public declarations } end;
var
Forml: TForml;
iinplementat ion
{$R *.dfm}
procedure TForml.ButtonlClick(Sender: TObject);
begin
close;
end;
procedure TForml.Button2Click(Sender: TObject);
begin
Label1.Caption:='программу составил A.H. Маслобоев';
end;
end.
Просмотрев приведенный текст, нетрудно убедиться, что львиную долю работы по написанию программного кода берет на себя сама система програм-
мирования. П ро г рам м истом собственноручно были написаны здесь только две строчки.
После произведенного нами усовершенствования программы вновь запускаем ее на выполнение одним из трех указанных способов. Напомним, что перед запуском программы на выполнение рекомендуется сохранить все сделанные настройки и дополнения с помощью команды Save all. Внешний вид программы во время ее работы приведен на рис. 13.11. Убедившись в том. что программа работает так, как положено, можно закрыть систему программирования. Выход из системы производится либо щелчком на закрывающей кнопке в строке заголовка системы, либо с помощью главного меню. В последнем случае нужно найти раздел меню File и в нем команду Exit. Если перед выходом из системы вы забыли сохранить изменения в проекте, то на экран компьютера автоматически выводится диалоговое окно, в котором пользователю предлагается либо сохранить изменения в проекте, либо отказаться от изменений. Если же пользователь нажимает в диалоговом окне экранную кнопку Cancel, то выхода не происходит, и пользователь возвращается в систему программирования.
Рис. 13.11. Первая программа во время работы
Если проект был корректно сохранен, то созданный системой исполняемый файл будет работать и автономно от системы. Для того чтобы убедиться в этом, достаточно открыть папку проекта, не запуская систему Delphi, найти в ней исполняемый файл (в пятой и шестой версиях Delphi значок этого файла выглядит так — ©\ а в седьмой версии ——岁)" запустить его на выпол-
ненне двойным щелчком мыши. В результате программа запустится и будет работать должным образом.
Программа "Редактор"
Следующий проект, который мы будем разрабатывать в системе Delphi, отличается тем, что пользователь получит возможность самостоятельно изменять содержимое надписи, расположенной в окне программы. Для этого в окне формы должно быть предусмотрено специальное текстовое окно, в котором пользователь может вводить любой текст. Соответствующий текст будет отображаться в виде надписи, расположенной в верхней части окна программы.
Работу над проектом, как и в прошлый раз, начнем с его сохранения. Для этого в папке C:\Program Files\Borland\Delphi\Projects создадим вложенную папку Redaktor и сохраним файлы будущего проекта аналогично тому, как мы это делали в предыдущем разделе.
Как обычно, составление самой программы мы начнем с создания для нее интерфейса. Интерфейс данной программы будет включать в себя следующие элементы:
П две надписи. Одна из них——это основная надпись, значение которой можно изменять путем ввода нового текста в текстовое окно. Вторая надпись вспомогательного характера содержит пояснение к текстовому окну;
口 текстовое окно. Введенный в него текст будет дублироваться в укрупненном виде в надписи;
две экранные кнопки. Одна из них закрывает программу. Вторая выводит сведения об авторе;
сама форма, в которую мы помещаем все перечисленные компоненты.
Настройку элементов интерфейса мы начнем с формы. Форма являегся таким же объектом программы, как и все прочие ее компоненты, и имеет ряд свойств, которые можно изменять при ее настройке. Для того чтобы начать работу с формой, достаточно щелкнуть мышью на любом ее свободном месте. При этом в окне инспектора объектов будет отображаться объект по имени Formi, т. е. сама основная форма. В окне инспектора выделяем вкладку Properties (Свойства) и находим на этой вкладке свойство Caption. В данном случае это свойство отображает ту надпись, которая выводится в строке заголовка формы. Вводим вместо имеющегося в строке Caption по умолчанию слова Formi слово Редактор. Это же слово появится н в строке заголовка формы, выделенной синим цветом.
Следующим шагом станет изменение цвета формы. При создании формы по умолчанию она получает серый цвет. Для того чтобы сделать фон формы более ярким и красочным, нужно на вкладке Properties (Свойства) объекта Formi найти свойство color. Оно содержит раскрывающийся список с названиями цветов, которые можно выбрать в качестве фона для формы. Слева от названия каждого цвета в небольшом прямоугольнике показано как выглядит этот цвет. Для нашей формы выбираем цвет ciSkyBiue (небесно-голубой). Приставка С1, которую включает в себя название каждого из представлен пых в палитре цветов, представляет собой сокращение от английского слова Color (цвет). На этом работу с самой формой мы завершаем.
Затем необходимо создать надпись, которую в дальнейшем можно будет редактировать, заменяя ее своим текстом. Для создания надписи используем компонент Label, а соответствующий объект получит название Label 1. Чтобы по содержанию надписи можно было сразу понять ее назначение, свойству Caption Присваиваем значение: Здесь отображается текст, вводимый пользователем. Затем переходим к свойству Font того же объекта и щелкаем кнопку построителя. В открывшемся диалоговом окне выбираем какой-либо цвет, контрастирующий с фоном формы (например, ярко-красный) и увеличиваем размер шрифта до 14 пунктов.
Далее с помощью панели компонентов выводим на форму еще один объект—надпись. Он получит от системы наименование Label?. Расположим данный объект ниже первого. Он должен находиться примерно в середине формы по вертикали и ближе к левому ее краю по горизонтали. Содержанием данной надписи будет сообщение о том, что в окно, находящееся рядом с этой надписью, нужно вводить текст, который в укрупненном виде будет отображаться выше. Поэтому свойству caption данной надписи мы прмсва“- ваем значение Вводите текст в это окно. Цвет данной надписи мы изменять не будем (он останется по умолчанию черным), а размер ее сделаем несколько меньшим, чем у основной надписи Labeii (например, 12 пунктов).
Справа от надписи Label2 расположим то самое текстовое окно, в которое пользователь может вводить текст произвольного содержания. Для создания окна используется компонент Edit, который находится на той же стандартной вкладке панели компонентов, что и компонент Label (не путайте компонент Edit с разделам меню, имеющим то же название). Выглядит компонент Edit следующим образом — 11abI,Созданный с помощью этот компонента объекг получает имя Editi. Методом протягивания расширяем данный объект почти до правого края формы. Данный объект не имеет свойства Caption, но имеет сходное с ним свойство Text. Сразу после создания объекта данное свойство имеет значение Editi, оно совпадает с именем объекта. Мы его удалим, а новое значение вводить не будем. Таким образом, после запуска программы на
выполнение текстовое окно останется пустым и будет свободно для ввода текста. Подобно надписи, объект "текстовое окно** имеет свойство Font с таким же построителем, открывающим диалоговое окно настройки шрифта. Цвет шрифта мы в данном случае изменять не будем, а размер его сделаем равным 10.
Когда в ходе работы программы мы будем вводить в данное окно текст, то в нем будет виден курсор, имеющий форму вертикальной черты и отмечающий текущую позицию ввода текста. Текст, который мы будем вводить в данное окно, можно по ходу дела исправлять. Напомним» что для удаления отдельных символов используются клавиши <Delete> и〈Backspace〉. Если требуется удалить сразу целый фрагмент введенного текста, то можно выделить этот фрагмент клавишей <стрелка влево> или <стрелка вправо> при нажатой клавише <Shift> и затем нажать клавишу <Delete>. Для быстрого перехода в начало или конец вводимого текста достаточно нажать соответственно клавиши <Ноте> или <End>. Все описанные действия ие надо специальным образом программировать. Эту задачу берет на себя сама система Delphi.
Для завершения создания интерфейса программы осталось разместить на форме еще два объекта — командные кнопки, которые будут управлять работой приложения. Для создания этих кнопок используем компонент Button. Первый из этих объектов получит по умолчанию имя Buttonl. Мы поместим его в левой нижней части формы. Щелчок на этой кнопке будет приводить к тому, что введенная пользователем в текстовом окне фраза будет продублирована в виде надписи вверху формы. Изменим для этой кнопки свойство Caption. Вместо имеющегося по умолчанию заголовка Buttonl введем следующий: Изменить текст надписи. Воспользуемся свойством Font объекта Buttonl для того, чтобы увеличить шрифт надписи на кнопке до 10 пунктов. Кроме того, нужно увеличить методом протягивания размер объекта таким образом, чтобы надпись была целиком видна на экранной кнопке. Если этого не сделать, то при выполнении программы от надписи на кнопке будет виден только "хвост", а ее начало будет скрыто от пользователя.
После этого создаем второй объект-кнопку» которая по умолчанию получит имя Button2. Эту кнопку мы разместим в правой нижней части формы и свойству Caption присвоим значение закрыть программу. Увеличим шрифт на кнопке до 10 пунктов и увеличим размеры кнопки для нормального отображения на ней надписи. Интерфейс программы приведен на рис. 13.12.
Завершающий этап составления программы заключается в написании кода, описывающего реакцию экранных кнопок при щелчке мышью по ним. Для объекта Button2 выбираем на вкладке Events (События) событие onciick и пишем для него код, состоящий из слова Close. Эта кнопка будет закрывать программу подобно кнопке Выход из предыдущей программы. Вид создан-
Приступаем к программ叩ованмю в Delphi 301 ной процедуры также аналогичен соответствующей процедуре в предыдущем проекте.
Рис. 13.12. Интерфейс программы Тедактор"
Для того чтобы разобраться в том, какой кол нужно писать для кнопки Buttoni, необходимо прежде всего понять, что это кнопка должна делать. Как мы уже знаем, она должна изменять надпись, т. е. изменять ее свойство caption. Изменение это производится путем присвоения свойству Labeii.Caption нового значения, отличного от предыдущего. Как уже известно по предыдущей программе, операция присваивания состоит из знака равенства и двоеточия. Само же это новое значение содержится в объекте Editi, а точнее в его свойстве Text. Поэтому мы и запишем это свойство так: Editl.Text. Следовательно операция изменения заголовка надписи будет выглядеть следующим образом:
Label1.Caption:=Editl.Text;
Для того чтобы вставить эту строку в подпрограмму, описывающую реакцию кнопки Buttoni, нужно выделить эту кнопку на форме, выделить в инспекторе объектов вкладку Events (События) и найти событие OnCiick, для которого и указать этот код. В результате указанных действий процедура Buttoniciick будет выглядеть следующим образом:
procedure TForml.ButtonlClick(Sender: TObject); begin
Labell.Caption:=Edit1.Text;
end;
Теперь программа готова к запуску ее на выполнение. В листинге 13.2 приводится полный текст данной программы.
Листинг 13.2. Текст программы "Редактор"
unit Unitl;
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type
TForml = class (TFo™)
Label1: TLabel;
Label2: TLabel;
Editl: TEdit;
Buttonl: TButton;
Button2: TButcon;
procedure Button2Click(Sender: TObject);
procedure ButtonlClick(Sender: TObject);
private
{ Private declarations } public
{ Public declarations } end;
var
Fonnl: TForml;
implementation
{$R *・dfm]
procedure TFoml.ButtonlClick(Sender: TObject); begin Labell.Caption:=Editl.Text; end;
procedure TForml.Button2Click(Sender: TObject); begin close;
end;
end.
После запуска программы мы увидим в ее окне чистое окошко для ввода текста с мигающим в левой его части курсором, В это текстовое окно пользователь может вводить любой понравившийся ему текст и корректировать его указанным ранее способом, если в том есть необходимость. После щелчка на экранной кнопке Изменить текст надписи курсор в текстовом окне исчезнет, и мы увидим введенный текст, написанный вверху формы большими красными буквами (рис. 13.13).
Рис. 13.13. Программа 'Редактор" во время работы
В течение одного сеанса работы с программой содержание надписи можно изменять неоднократно. Для ввода нового текста достаточно щелкнуть мышью текстовое окно, в результате чего в нем вновь появится курсор. Тогда можно вводить в окно новый текст, который отобразится в верхней части формы после щелчка на экранной кнопке.
Программа "Хамелеон"
Следующим шагом в освоении системы Delphi станет создание программы, которая будет изменять в процессе работы свойства самой формы. Для этого мы используем еще один элемент управления, а точнее группу элементов. Элементы, относящиеся к этой группе, называются переключателями или радиокнопками (по аналогии с кнопками на старых радиоприемниках). Переключатели представляют собой группу элементов, в которой может быть включен только один из них, а остальные находятся в отключенном состоя-
ннн. Работа группы перекл ючател ей аналогична работе исправного светофора, на котором всегда горит только одна лампочка, а остальные погашены.
В нашем проекте с помощью группы переключателей мн будем изменять цвет самой формы, которая после щелчка на одном из переключателей из стандартной серебристо-серой будет превращаться в красную, зеленую, синюю и т. д. Цвет формы будет меняться по нашему желанию подобно тому, как меняет свою окраску в зависимости от окружающей обстановки хамелеон, поэтому мы и назовем наш проект "хамелеон”.
После запуска системы программирования в окне свойств объекта Forml (основная форма проекта) мы выделяем свойство caption и в поле справа вводим значение хамелеон, которое и будет отображаться в заголовке формы после запуска программы на выполнение. Затем в левом верхнем углу формы мы поместим надпись (объект Labeii) следующего содержания: Укажите цвет формы. Для чего снова используем свойство caption, только это должно быть СВОЙСТВО объекта Label 1.
Под надписью мы расположим группу радиокнопок, которые и будут изменять цвет основной формы. Создание группы переключателей производится в два этапа. На первом этапе в экранную форму нужно поместить рамку для группы переключателей, в которой в дальнейшем будут размещены сами переключатели. Заготовка для этой рамки находится на палитре компонентов на вкладке Standard. Этот компонент называется RadioGroup и выглядит следующим образом ——[§. Выберем его щелчком мыши на вкладке, а затем щелчком на форме поместим его под надписью. В результате наших действий в экранной форме появится рамка, в которую в дальнейшем можно будет помещать переключатели. Растянем с помощью мыши эту рамку таким образом, чтобы в ней хватило места для всех восьми переключателей, которые будут в нашем проекте. Рамка для радиокнопок по умолчанию получает имя RadioGroupi. Такое же название будет отображаться и в верхней части рамки в экранной форме. Это значение свойства Caption объекта RadioGroupi. Имя объекта мы, как обычно, изменять не будем, а свойство caption очистим, т. к. никакой надписи на самой рамке в нашем проекте быть не должно.
Следующим, вторым этапом создания группы элементов управления в нашем проекте станет создание самих переключателей в экранной форме. Заготовка для переключателей находится на той же вкладке Standard палитры компонентов и называется RadioButton. Выглядит же эта заготовка следующим образом—回 Выбираем этот компонент щелчком мыши и затем щелкаем мышью на экранной форме внутри рамки RadioGroupi. В результате внутри рамки появится объект с именем RadioButtoni — первый из группы переключателей. Затем таким же образом перенесем внутрь рамки еще 7 переключателей, которые получат имена, начиная с RadioButton2 и заканчивая
RadioButton8. ТаКИМ ООрЭЗОМ, ВСЯ внутренняя область рамки RadioGroupl будет заполнена переключателями.
Следующим шагом в разработке интерфейса программы должна быть настройка всех элементов RadicButton. Начнем с элемента RadioButtonl. Когда мы перенесли этот элемент на форму, то сама радиокнопка оказалась в левой части элемента, а надпись — в правой части. В нашем проекте для того, чтобы форма лучше смотрелась с точки зрения ее дизайна, мы поменяем эти части местами. Для этой цели мы в окне свойств элемента RadioButtonl найдем свойство Align (выравнивание). Это свойство имеет всего два фиксированных значения. Если его значение равно taRightJustify, то надпись выравнивается по правому краю элемента, а сам переключатель оказывается слева. Такой способ выравнивания задан по умолчанию. Если же значение свойства —— tabeftJustify, то выравнивание производится по левому краю, а переключатель находится справа. Для изменения значения этого свойства нужно щелкнуть кнопку 曰 находящуюся справа от значения в окне свойств, и из раскрывающегося списка выбрать щелчком мыши значение taLeftJustify. Такую же операцию следуют произвести для всех остальных радиокнопок, находящихся внутри рамки.
Затем необходимо изменить надписи таким образом, чтобы было понятно, какой переключатель соответствует какому цвету. Для этого нужно изменить свойство Caption всех элементов RadioBurton. Для переключателя RadioButtonl МЫ В поле Caption вместо RadioButtonl напишем Красный, ДЛЯ переключателя RadioButton2 В поле Caption МЫ напишем Травяной, для RadioButton3 — Синий» ДЛЯ RadioButton4 — Бирюзовый, ДЛЯ RadioButton5 — Желтый, ДЛЯ Rad ioButt on 6— Сиреневый, для Rad ioButton 7一 Зеленый И ДЛЯ RadioButton8 — Голубой.
Следующим шагом в создании интерфейса программы станет создание иллюстрации, демонстрирующей все цвета, в которые можно окрашивать экранную форму в данном проекте. Эту иллюстрацию мы не будем создавать сами, а возьмем ее в готовом виде из имеющейся на компьютере коллекции рисунков. Но до того как мы поместим на форме саму иллюстрацию, необходимо создать еще один объект, представляющий собой основу, на которой будет находиться эта иллюстрация. Для создания такой основы мы используем компонент Panel (панель), находящийся на вкладке Standard палитры компонентов и выглядящий следующим образом ——口. Перетащив этот компонент на форму, получаем объект Paneii, на котором впоследствии будет находиться картинка.
Затем необходимо произвести настройку свойств объекта Paneil. Во-первых, т. к. данный объект будет только фоном для другого — самого рисунка, заголовок объекта Рапе 11 не должен отображаться на экране. Поэтому на вкладке
Properties (Свойства) данного объекта находим свойство caption и очищаем его. Если размеры панели нас не устраивают, изменяем их как обычно методом перетаскивания.
Для создания визуального эффекта желательно, чтобы изображение было как бы немного вдавлено в экран. Этого можно добиться, изменив характеристики фаски, которая окружает по краям панель. По умолчанию ширина этой фаски (свойство Bevelwidth) равна I ——одному пикселу. Увеличим эту шири* иу до двух пикселов, введя в поле справа от названия свойства соответствующее число. Кроме того, изменим сам характер этой фаски. Для чего щелкнем раскрывающийся список, содержащийся в свойстве Bevelouter. Значение данного свойства определяет внешний вид фаски. Вместо имеющегося по умолчанию значения BvNone мы устанавливаем значение BvLowered. В результате создается впечатление, что панель "утоплена" в экран.
Теперь на панель поместим еще один объект— сам рисунок. Компонент для его создания находится на вкладке Additional палитры компонентов и назьь ваегся image. Выглядит компонент image так — lUtf- Перетаскивая на панель этот компонент, получаем объект под названием imagel. На следующем этапе нужно изменить расположение этого объекта на экране и его размеры таким образом, чтобы он закрывал большую часть панели н в то же время оставлял на виду фаски панели.
Для того чтобы это сделать, нужно, прежде всего, иметь в виду, что месторасположение графического объекта на экране компьютера определяется положением его верхнего левого угла. Поэтому нужно совместить верхний левый угол объекта image 1 с левым верхним углом фоновой панели Panel 1. Выделяем в окне формы объект imagel и в инспекторе объектов просматриваем вкладку свойств данного объекта (вкладка Properties). На данной вкладке нахещнм свойство тор (в переводе с английского — "верх”). Данное свойство определяет положение рисунка относительно верха панели, на которой он расположен. Задаем для свойства тор значение 2, т. е. верх рисунка будет на два пиксела ниже верха панели, для того чтобы не закрывать фаску. Затем находим на той же вкладке свойство Left (в переводе с английского — нле- выйн), которое определяет положение рисунка относительно левого края панели. Для свойства Left также устанавливаем значение, равное 2.
Теперь, когда рисунок "привязан" к верхнему левому углу панели, нужно определить его геометрические размеры. Размеры рисунка как по горизонтали, так и по вертикали должны быть на 4 пиксела меньше, чем соответствующие размеры панели» для того чтобы не закрывать фаску. Размеры же панели можно определить наведением указателя мыши на ее любое свободное место. Если задержать указатель мыши на панели на несколько секунд, то на ней
появится небольшое окно с основными характеристиками объекта, включая и его размеры. В этом окне будет информация следующего вида:
Size: 193*185
слово Size по-английски означает "размер”, первое число ——это размер панели в пикселах по горизонтали, а второе — размер по вертикали. Естественно, что у вас при разработке проекта числовые значения могут отличаться от указанных.
Для приведенного примера размер рисунка по горизонтали должен быть равен 189, а по вертикали— 181. Снова выделяем на форме объект image 1 и задаем для свойства width (ширина) значение 189. а для свойства Height (высота) значение 181. После определения геометрических размеров рисунка осталось сделать так, чтобы картинка, которую будет содержать рисунок, автоматически подгонялась под размеры рисунка, растягивалась соответственно рисунку. Для этого находим свойство stretch (растянуть). Это свойство логическое и имеет только два значения: false и true. Устанавливаем для данного свойства значение true, и растяжка картинки будет производиться автоматически.
Теперь у пользователя может возникнуть вопрос о том, где взять картинку, которая будет размещена на рисунке. Здесь возможны следующие варианты: вы можете найти подходящую картинку в Интернете, скопировать ее с одного из компакт-дисков с коллекциями рисунков, поискать подходящую иллюстрацию в коллекции картинок, входящих в состав пакета Microsoft Ofllce. либо нарисовать ее самостоятельно в любом графическом редакторе, например в Paint, являющемся стандартным приложением операционной системы Windows. В данном случае мы воспользуемся коллекцией рисунков Clipart, которая входит в состав пакета Microsoft Office 97. В настоящее время пакет Microsoft Office установлен практически на всех компьютерах, работающих под управлением ОС Windows.
Для того чтобы вставить в форму готовую картинку, мы выделяем в форме объект image 1 и на вкладке свойств объекта находим свойство Picture (картинка). По умолчанию значение этого свойства равно None (ничего), а справа от значения находится уже знакомая нам кнопка-построитель. Щелкнув мышью на построителе, мы открываем диалоговое окно Picture Editor (редактор картинок).
Затем, щелкнув в окне редактора картинок на экранной кнопке Load (загрузить), мы открываем новое диалоговое окно Load picture (загрузка картинки). В этом окне мы производим навигацию (перемещение) по файловой структуре компьютера для поиска интересующего нас рисунка. Для навигации используются элементы управления, расположенные на панели инструментов в верхней части диалогового окна. Вначале мы используем кнопку 画
(переход на один уровень вверх). Щелкая несколько раз по этой кнопке, можно подняться вверх по файловой структуре компьютера, пока не будет достигнут уровень Мой компьютер. Текущий уровень отображается в небольшом окне, расположенном в левой части панели инструментов. В основном же окне, расположенном ниже, отображаются диски, папки и файлы текущего уровня. Для того чтобы открыть диск или папку, нужно дважды щелкнуть мышью на соответствующем значке. Открываем диск, на котором находятся файлы пакета Microsoft Office (при установке данного пакета по умолчанию эти файлы записываются на диск С:). Затем находим там папку Program Files, а внутри нее открываем папку Microsoft Office.
Рис. 13.14. Диалоговое окно редактора картинок
Дальнейшая последовательность действий зависит от той версии Microsoft Office, которая установлена на данном компьютере. Для версии Microsoft Office 97 последовательность действий будет следующей. В папке Microsoft Office находим вложенную папку Clipart. Внутри папки Clipart содержится папка Popular, в которой и находятся файлы с картинками. Это графические файлы, созданные средствами векторной графики и имеющие расширение wmf. Когда мы выбираем в окне один из этих файлов, то справа от основного окна появляется изображение, находящееся в данном файле. Сверху от изображения указывается его размер в пикселах (эти сведения могут пригодиться при размещении файла внутри формы). Если изображение слишком мелкое н пользователь хочет рассмотреть его более подробно, то для этого нужно щелкнуть находящуюся также сверху кнопку || (предварительный просмотр). После щелчка на этой кнопке появляется еще одно окно, в котором
309
изображение представлено в натуральную величину. Закрыть зто окно можно обычным способом ——щелчком на закрывающей кнопке. Для нашего проекта выбираем изображение Arrows4.wmf. Данное изображение представляет собой группу стрелок восьми разных цветов, расположенных по кругу, т. е. соответствует теме нашего проекта (рис. 13.15). Для загрузки этого изображения щелкаем экранную кнопку Открыть и подтверждаем сделанный выбор щелчком на кнопке ОК в окне редактора картинок. В результате выбранное изображение в формате wnif будет размешено на объекте imagei.
Load PictuieПР :l
Дапк« I Л PopUaiДапк« I Л PopUai三倒础印IB画三倒础印IB画回AggУ Amconfus 回 Amdsasl 冃 Amhappy *]AmidM *]Aniorgdni回AggУ Amconfus 回 Amdsasl 冃 Amhappy *]AmidM *]AniorgdniЙАтроЫе Amvictor AmwmMAiiowsI wAfrows2 S]Airows3ЙАтроЫе Amvictor AmwmMAiiowsI wAfrows2 S]Airows3讨 Arrows5亠 Ahows6讨 Arrows5亠 Ahows6m]Ahow$7•JAiiowsC•OAffcwsonm]Ahow$7•JAiiowsC•OAffcwsonA((0W:4A((0W:4Bandaid Be&bap Bomb 8 nek BuildingBandaid Be&bap Bomb 8 nek Building上i上iИмя 險性..рйё^£ Г 1№Ф^而:Имя 險性..рйё^£ Г 1№Ф^而::工点》(й^Ь. |£加 jpg/. КеоЛЬтр; ico「.eml;twml]酎], ',"" 一:工点》(й^Ь. |£加 jpg/. КеоЛЬтр; ico「.eml;twml]酎], ',"" 一(362x3G3](362x3G3]
Дапк« I Л PopUai
Дапк« I Л PopUai
三倒础印IB画
三倒础印IB画
回Agg
У Amconfus 回 Amdsasl 冃 Amhappy *]AmidM *]Aniorgdni
回Agg
У Amconfus 回 Amdsasl 冃 Amhappy *]AmidM *]Aniorgdni
ЙАтроЫе Amvictor Amwm
MAiiowsI wAfrows2 S]Airows3
ЙАтроЫе Amvictor Amwm
MAiiowsI wAfrows2 S]Airows3
讨 Arrows5
亠 Ahows6
讨 Arrows5
亠 Ahows6
m]Ahow$7
•JAiiowsC
•OAffcwson
m]Ahow$7
•JAiiowsC
•OAffcwson
A((0W:4
A((0W:4
Bandaid Be&bap Bomb 8 nek Building
Bandaid Be&bap Bomb 8 nek Building
上i
上i
Имя 險性..рйё^£ Г 1№Ф^而:
Имя 險性..рйё^£ Г 1№Ф^而:
:工点》(й^Ь. |£加 jpg/. КеоЛЬтр; ico「.eml;twml]酎]
, ',"" 一
:工点》(й^Ь. |£加 jpg/. КеоЛЬтр; ico「.eml;twml]酎]
, ',"" 一
(362x3G3]
(362x3G3]
Рис. 13.16. Диалоговое окно Load Picture
Если на компьютере установлена другая версия пакета Microsoft Office, то адрес папки, содержащей изображения, которые можно вставить в проект, может быть иным. Например, для версии Microsoft Office ХР нужно в папке Microsoft Office открыть вложенную папку media, а внутри папки media открыть папку cagcatIO, которая и содержит коллекцию рисунков. Другими могут быть и сами рисунки. Однако описанные ранее методы загрузки файлов с помощью окна редактирования картинок и окна загрузки остаются при этом неизменными.
На завершающем этапе разработки графического интерфейса программы мы разместим на экранной 巾орме две кнопки. Одна из этих кнопок (Buttoni) будет выводить на форму сведения об авторе программы, а другая(Button2)будет закрывать форму и вместе с ней сам проект. Сведения об авторе будут выводиться на форме посредством надписи Labei2. Аналогичные объекты уже создавались нами в предыдущих программах, поэтому их создание не должно вызвать у читателя затруднений. Общий вид получившегося интерфейса приведен на рис. 13.16.
Рис. 13.16. Графический интерфейс программы "Хамелеон"
Далее, для того чтобы программа заработала, нужно написать программный код, описывающий действие каждого из имеющихся на форме переключателей. Событием, которое включает очередной переключатель и окрашивает форму в новый цвет, являегся обычный щелчок мышью на нем. Щелчку мыши на каком-либо из переключателей в Delphi соответствует событие RadioButtonclick. Название этого события нам не понадобится вводить вручную, соответствующая заготовка появится в окне кода после двойного щелчка на переключателе. Например, если мы щелкнем на первом переключателе в группе, то в окне кода появится заготовка процедуры RadioButtoniClick.
В эту заготовку для переключагеля нужно вставить только одну строку кода. Она должна изменить имеющийся цвет формы, т. е. свойство Form.Color. Это изменение производится путем присваивания свойству Form.Color нового значения, соответствующего одному из стандартных цветов системы. Перед названием такого стандартного цвета обязательно должна быть приставка с! (сокращение от color). Например, если мы хотим выкрасить форму в красный цвет, то для этого нужно воспользоваться следующим оператором:
Forml. Color :=clP.ed;
Целиком же эта процедура будет выглядеть так:
procedure ТForml.RadioButtonlClick{Sender: TObject); begin
Forml.Color:=clRed;
end;
Для того чтобы выкрасить экранную форму в ярко-зеленый (травяной) цвет, нужно для второго переключателя в группе написать код следующего вида:
Forml. Color: =cliine;
Таким образом необходимо будет ввести соответствующие коды для каждого из оставшихся переключателей. Наконец, необходимо ввести программные коды, которые определяют действия, осуществляемые после щелчка на одной из экранных кнопок (Buiconi или Buti.cn2). Эти коды анаюгичны таким же кодам в предыдущих программах. В результате общий вид программы, написанный на языке Object Pascal, будет следующим ——листинг 13.3.
Листинг 13.3. Код программы **Хамелеон,'
unit Unirl;
interface
uses
Windows, Messages, SysUtiis, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls;
type
TForml = class(TForm)
Label1: TLabel;
RadioGroup1: TRadioGroup;
RadioButton1: TRadioButton; RaclioButton2: TRadioButton; RadioButton3: TRadicButton; RadioButton4: TRadioButton; RadioButtonb: TRadioButton; Radi©Button6: TRadioButton; RadioButton7: TRadioButton; Rad ioButton8: TRadioButton; Panel1: TPanel;
Image1: TImage;
Buttonl: TButton;
Button2: TButton;
Label?: TLabel;
procedure procedure procedure procedure procedureprocedure procedure procedure procedure procedureRadioButtonlClick(Sender: TObject);
procedure procedure procedure procedure procedure
procedure procedure procedure procedure procedure
ButtonlClick(Sender: TObject);
RadioButton2Click(Sender: TObject);
RadioButton3Click(Sender: TObject);
RadicButton4Click(Sender: TObject);
procedure procedure procedure procedureprocedure procedure procedure procedureTObject);TObject);TObject);TObject);TObject);TObject);TObject);TObject);RadioButton5Click(Sender:
procedure procedure procedure procedure
procedure procedure procedure procedure
TObject);
TObject);
TObject);
TObject);
TObject);
TObject);
TObject);
TObject);
RadioButton6Click{Sender:
RadicBu匸ton7click(Sender:
RadioButton8Click(Sender:
procedure Button2Click(Sender: TObject);
private
{ Private declarations } public
{ Public declarations } end;
var
Forml: TForml;
implementation
{5R *.dfm}
procedure TForml.RadioButtonlClick(Sender: TObject); begin
Forml.Color:=clRed;
end;
procedure TForml.RadioButton2Click(Sender: TObject); begin
Forml.Color:=clLime;
end;
procedure TForml.RadioButron3Click(Sender: TObject); begin
Forml.Color:=clBlue;
end;
procedure TForml.RadioButton4Click(Sender: TObject); begin
Forml.Color:=clTeal;
end;
procedure TForml.RadioBunton5Click(Sender: TObject}; begin
Forml.Color:-clYellow;
end;
procedure TForml•RadioButtonbClick(Sender: TObject); begin
Forml.Color:=clFuchsia;
end;
procedure TForml.RadioButton7Click(Sender: TObject); begin
Forml ・ Color:-clGreen;
end;
procedure TForml.RadioButton8Click(Sender: TObject); begin
Forml. Color: =clAqua;
end;
procedure TForml.ButtonlClick(Sender: TObject); begin close;
end;
procedure TForml.Button2Click{Sender: TObject); begin
Labe12.Visible:-True;
end;
end.
Рис. 13.17. Программа "Хамелеон" во время работы
Для лучшего понимания текста программы приведем русскоязычные названия имеющихся в программе цветов. Цвет Red переводится как красный, Lime — это травяной цвет, Blue ——сннмй. Teal — бирюзовый. Fuchsia ——сиреневый. Yellow——желтый, Green— темно-зеленый. Aqua— голубой. Вид программы после ее запуска на выполнение показан на рис. 13.17.
Задание для самостоятельной работы
Составкпъ проект "Светофор”. В данном проекте в основной форме должна выводиться панель с тремя лампочками. Слева от панели с лампочками должна находиться группа, состоящая из трех переключателей. На ка^кдом из переключателей должен быть обозначен цвет лампочки, который включает пользователь. После щелчка на одном из переключателей на панели должна загораться лампочка соответствующего цвета (красная, желтая или зеленая), а две другие лампочки должны гаснуть. На форме необходимо предусмотреть кнопку для ее закрытия.
Указания для выполнения задания. На панель следует вывести три объекта типа Shape, которые в дальнейшем будут представлять собой лампочки светофора. Объект shape находится на вкладке Additional палитры компонентов. Этог объект представляет собой контур геомсгрической фигуры, которая в зависимости от значения свойства, тоже называемого shape, может принимать форму прямоугольника, квадрата, круга, эллипса, а таюке прямоугольника или квадрата с закругленными углами.
При этом внутренность создаваемого объекта по умолчанию не закрашивается. Для того чтобы залить внутреннюю область объекта, необходимо использовать составное свойство Brush. Это свойство содержит два подсвойства: Color — определяет цвет заливки, и style ——задает стиль заливки. Следующим важным свойством объекта shape является свойство Реп, которое также является составным. Свойство Реп содержит такие подсвойства, как color (цвет контура фигуры), style (стиль границы), width (ширина границы).
Дчя свойства shape каждого из этих объектов указать значение stcircle (в результате объект shape примет форму окружности). Границу каждого из объектов можно обозначить черным цветом с помощью подсвойства Pen.color. При начальной настройке каждого из объектов shape ему нужно придать такой же серебристо-серый цвет, как и самой панели. Для этого следует выбрать соответствующее значение для подсвойства Brush.color. При включении очередной лампочки (т. е. изменения цвета одного из объектов shape) нужно возвращать двум другим объектам их изначальный серебристосерый цвет (cisilver). Таким образом можно добиться того, чтобы на панели светофора всегда горела только одна лампочка.
ГЛАВА 14
Программы линейной структуры в Delphi
Программы, которые были ранее разработаны в системе Delphi, позволяли только выводить информацию на экран компьютера (первая программа, папка First) или вводить информацию с клавиатуры с отображением ее на экране (программа "Редактор", папка Redaktor). Однако основными задачами, ради которых были разработаны компьютеры, являются задачи по обработке информации, в том числе задачи вычислительного характера (само слово "ком・ пьютер" в переводе с английского означает "вычислитель*1). Поэтому данная глава книги посвящена составлению программ для решения вычислительных задач.
Программа "Сложение"
Программа, которую мы будем составлять, должна выполнять следующие действия: она должна обеспечивать ввод двух целых чисел с клавиатуры компьютера (введенные числа будут отображаться в двух текстовых окнах) и выводить в третьем окне сумму этих двух чисел. На примере такой несложной задачи мы и освоим основные приемы разработки программ вычислительного характера.
Для этого нам нужно ознакомиться с использованием переменных в языке Object Pascal. Основные правила работы с переменными в Object Pascal те же, что и в Turbo Pascal, но есть и некоторые особенности. Правила наименования переменных аналогичны тем же правилам в Turbo Pascal, т. е. для обозначения переменных должны использоваться только латинские буквы и цифры. Оператор присваивания в Object Pascal выглядит так же, как и в Turbo Pascal.
Так же, как и в Turbo Pascal, переменные, используемые в программе, должны быть описаны в специальном разделе программы, который начинается со
слова var. Если этого не сделать, то при запуске программы на выполнение компилятор выдаст сообщение об ошибке. Пример, показывающий, как может выглядеть сообщение об ошибке:
[Error] Unit1.pas(37): Undeclared identifier: 'x*
[Fatal Error] Projectl.dpr(5): Could not compile used unit 'Unitl.pas'
В первой строке данного сообщения указывается номер строки в тексте программы. в которой была обнаружена ошибка (в приведенном примере строка № 37). а также приводится имя той переменной, которая не была заранее описана (в примере ——это переменная х). Во второй строке говорится о том, что данная ошибка является фатальной, т. е. нз-за нее программа не может работать.
Как и в Turbo Pascal, все переменные, используемые в языке Object Pascal, подразделяются на два основных вида. Это глобальные переменные, которые могут использоваться во всей программе, и локальные переменные, которые можно использовать только внутри определенной процедуры. Практика программирования показывает, что в программе должно быть как можно меньше глобальных переменных, т. к. если программист допускает ошибку, связанную с использованием такой переменной» то для ее выявления и устранения ему приходится анализировать весь текст программы, который может быть достаточно большим по объему. Соответственно и поиск ошибки может занять много времени. Если же ошибка была допущена при работе с локальной переменной, то для ее устранения достаточно будет поработать только с текстом соответствующей процедуры, что займет значительно меньше времени.
Как помнит читатель, в программах, написанных в Turbo Pascal, значения, присваиваемые переменным, обычно вводились с клавиатуры в числовом виде. При разработке же нашего проекта нам придется столкнуться с иной си- гуаиией. Числовые величины будут вводиться с клавиатуры в текстовые окна и затем уже использоваться для вычислений. Данные же, вводимые пользователем в текстовое окно, интерпретируются системой программирования как тексг. даже в том случае, если на самом деле эти данные являются числами. Поэтому, для того чтобы перевести текстовую информацию в числовую, необходимо использовать стандартную функцию, являющуюся частью языка Object Pascal. Эта функция называется strtoint. В названии данной функции Str— это сокращение от английского слова string (строка), a Int — от integer (целое). Гаким образом, название данной функции можно расшифровать как "преобразовать строку в целое число". Аргументом данной функции является текстовая величина, а значением — соответствующая числовая величина. Функции в языке Object Pascal не являются самостоятельными операторами.
а входят составной частью в другие операторы, например оператор присваивания. Приведем пример оператора с использованием функции:
x:=StrtoInt(t);
В данном операторе происходит преобразование текстовой величины t в числовую, и эта числовая величина присваивается целочисленной переменной х. В программе же в качестве аргумента чаще всего будет выступать свойство какого-либо объекта, например свойство Text объекта Edit. Значением данного свойства, как мы уже знаем по предыдушему проекту, является текст, введенный пользователем в текстовое окно. Поэтому операция преобразования введенного в окно Editl текста в числовую величину может выглядеть следующим образом:
х:=Strtolnt(Editl.Text);
Когда введенные пользователем данные будут преобразованы в числовые величины и над ними будут произведены все необходимые действия, перед программистом встанет обратная задача: как полученный численный результат преобразовать в текст, который может быть выведен на экран компьютера. Для этой цели используется другая стандартная функция inttostr. Как нетрудно догадаться по ее названию, она выполняет операцию, обратную операции strtoint. Функция переводит числовую величину в соответствующую ей строковую величину. Значениями этой функции могут быть свойства имеющихся в проекте графических объектов. В качестве свойства, которому может присваиваться значение функции inttostr, может выступать, например, свойство Caption объекта Label или то же самое свойство Text для объекта Edit. Если мы в нашем проекте хотим вывести полученный в программе числовой результат (например, значение переменной z) в текстовом окне Edit2, то оператор, выполняющий в программе это действие, будет выглядеть так:
Edit2.Text:=InttoStr(z);
Теперь, освоив основные понятия и операторы, используемые при работе с переменными, мы можем приступать к непосредствен но му созданию нашего проекта. Как обычно, работу над программой мы начнем с создания ее графического интерфейса. Разработку интерфейса мы начнем с настройки самой формы. Изменим заголовок формы (свойство caption объекта Forroi). Теперь окно формы будет называться сложение. Для того чтобы изменить цвет формы на менее унылый, чем стандартный серый, мы откроем раскрывающийся список цветов, находящийся в свойстве Color, и выберем из списка бледнозеленый цвет, который по-английски называется CiMoneyGreen, т. е. цвет денег. Очевидно, имеется в виду цвет долларовых купюр старого образца (в 5 версии данный цвет в списке отсутствует, поэтому можно подобрать какой-либо другой неяркий цвет или оставить по умолчанию светло-серый).
Кроме основной формы, графический интерфейс данной программы будет включать в себя следующие элементы. Во-первых, это два текстовых окна, в которые будут вводиться исходные данные. Во-вторых, это третье текстовое окно, в котором будет отображаться сумма, т. е. результат работы программы. Для этого в форме нужно создать объекты Ediri, Edit2 и Edit3. Для всех трех объектов мы удаляем содержимое свойства Text, чтобы в начале работы программы текстовые окна были пустыми.
Для того чтобы пользователю было понятно, куда именно нужно вводить числа и где получится их сумма, поместим в форму три поясняющие надписи —по одной надписи к каждому текстовому окну. Это будут объекты с именами Label 1, Labe 12 и Labe 13. Создание этих элементов интерфейса не должно вызвать затруднений у пользователя, т. к. аналогичные объекты мы создавали в предыдущих программах. Размер шрифта надписей увеличиваем до 10, шрифт делаем полужирным и цвет надписей изменяем на синий. Для каждою из этих объектов изменяем свойство Caption. Для первой надписи Заголовок будет Введите первое имело, ДЛЯ второй — Введите второе число И ДЛЯ третьей — Сумма двух чисел равна.
Завершаем создание графического интерфейса выводом в форму двух экранных кнопок. При нажатии на первую кнопку Buttoni будет производиться операция сложения двух чисел, а нажатие второй кнопки Button2 будет закрывать программу. Как обычно, для экранных кнопок мы изменяем свойство Caption (надписи на кнопках). На первой кнопке должно быть написано Сложить, а на второй ——Закрыть программу. Графический интерфейс данной программы пользовагель может увидеть на рис. 14.1.
Рис. 14.1. Графический интерфейс программы мСложение"
Теперь мы можем приступить к написанию кода для данной программы. Введем в программе три переменные, значением каждой из которых будет числовое значение текстовой информации» отображаемой в одном из текстовых окон. Поэтому данные переменные мы назовем el, е2 и ез (в соответствии с окнами Editi, Edit2 и Edits). Действия с данными переменными будут производиться при нажатии экранной кнопки Buttcni. Поэтому описание этих переменных мы вставим в процедуру TFormi. Buttonidick. Данная процедура описывает реакцию кнопки на щелчок мышью по ней. Как читатель, конечно, помнит, для того чтобы создать заготовку данной процедуры, достаточно выделить в форме объект Buttoni, выделить вкладку Events (События) для данного объекта в инспекторе объектов и двансда щелкнуть мышью справа от события onciick. Описание переменных будет выглядеть так:
var el,е2,еЗ:integer;
и находиться оно будет сразу после строки заголовка процедуры TForml.ButtonlClick.
Переменным el и е2 будут присвоены значения первого и второго слагаемых, вводимых в текстовые окна Editi и Edit2. Для преобразования текста, вводимого в эти окна, в числовые значения переменных el и е2, мы воспользуемся известной нам стандартной функцией языка Object Pascal intcostr. Преобразование выполним с помощью операторов:
el:=StrtoInt{Editi.text); e2:=StrtoInt(Edit2.text);
Следующий оператор в программе производит сложение значений двух переменных и присваивает сумму переменной еЗ:
еЗ:=е1+е2;
Наконец, осталось преобразовать полученное числовое значение в текстовое, которое будет отображаться в окне Edit3. Для этого используется оператор:
Edic3.Text:=InttoStr(еЗ)
поскольку данный оператор является последним перед служебным словом end, обозначающим конец процедуры, то точку с запятой в конце оператора можно не ставить (хотя, если мы ее поставим» это таюке не будет считаться ошибкой). Целиком процедура, описывающая сложение двух чисел при нажатии экранной кнопки Сложить, будет выглядеть следующим образом:
procedure TForml.ButtonlClick(Sender: TObject); var elf e2z e3:integer;
begin
el:=strtoint(Editi.text);
e2:=strtoint(EdiС2.text);
e3:=el+e2;
Edit3.Text:=InttoStr(e3) end;
Строка заголовка процедуры, а также служебные слова begin и 6nd генерируются системой программирования автоматически. Остальные строки в процедуру мы добавили сами. Для завершения работы осталось вставить строку кода в процедуру Button2Ciick, которая выполняется при щелчке мышью на экранной кнопке Button2. Эта строка, как мы уже знаем, состоит из одного слова close. Теперь программа готова к работе. В листинге 14.1 приводится полный текст данной программы.
j Листинг 14.1. Текст программы, складывающей два числа unit Unitl;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type
TForml = class(TForm)
Labeli: TLabel;
Labe12: TLabel;
Editl: TEdit;
Edit2: TEdit;
Label3: TLabel;
Edit3: TEdit;
Buttonl: TButton;
Button?: TButton;
procedure ButtonlClick(Sender: TObject);
procedure Button2Click(Sender: TObject); private
{ Private declarations ) public
{ Public declarations }
end;
var
Forml: TForml;
implementation
($R *.dfm}
procedure TForntl.ButtonlClick(Sender: TObject);
var el,e2re3:integer;
begin
el:=strtoint(Editl.text);
e2:=strtoint(Edit2.text);
e3:=el+e2;
Edit3.Text:=InttoStr(e3) end;
procedure TForml.Button2Click(Sender: TObject);
begin
close end;
end.
В ходе работы программы исходные данные вводятся в текстовые окна, причем переход между окнами может производиться либо нажатием клавиши <ТаЬ>, либо щелчком мыши в соответствующем окне. Значения слагаемых во время работы программы можно неоднократно менять, и при каждом щелчке на кнопке Сложить в окне результата будет видна сумма, полученная с учетом этих изменений. Окно программы во время работы показано на рис. 14.2.
Рис. 14.2. Окно программы "Сложение" во время работы
11 Зак 1068
Программа "Параллелепипед"
Следующая задача, которую мы будем решать в системе Delphi, заключается в создании программы, определяющей объем параллелепипеда по известной длине, ширине и высоте данной геометрической фигуры, а также вычисляющей общую площадь его поверхности. Как читатель помнит из школьного курса математики, первая часть задачи является очень простой, т. к. объем параллелепипеда определяется путем вычисления произведения его длины, ширины и высоты. Задача нахождения общей площади поверхности чуть сложнее, но и она требует знания лишь элементарной математики, т. к. общая площадь поверхности представляет собой сумму площадей отдельных граней параллелепипеда. Однако именно на примере такой простой задачи легче всего освоить новые элементы интерфейса, которые мы в дальнейшем будем использовать в других программах.
Для начала, как всегда, мы настроим саму форму, изменив ее заголовок на Параллелепипед и цвет на бледно-зелены й. Затем поместим в форму уже знакомые нам элементы интерфейса. Это будет пять текстовых окон. В первое, второе и третье окно будут вводиться соответственно длина, ширина н высота параллелепипеда. Эти объекты именуются Editi, Edit2 и Edit3. В окне Edit4 будет отображаться вычисленный компьютером объем параллелепипеда, а в окне Edits — подсчитанная компьютером общая площадь поверхности данной фигуры. Для того чтобы все эти окна в начале работы программы оставались чистыми, мы очищаем свойство Text для всех этих объектов.
Каждому текстовому окну должна соответствовать надпись, которая поясняет его назначение. Поэтому в форме мы таюке размещаем пять надписей с именами, начиная с Label 1 и заканчивая Labels. Для каждой из этих надписей мы, как и в предыдущей программе, изменяем размер, начертание и цвет шрифта. Естественно, что у каадой надписи нужно изменить свойство Caption, чтобы их заголовки говорили о содержимом находящихся справа от надписи окон. Кроме того, добавим в форму две экранные кнопки: Buttoni и Button2. При нажатии на первой из этих кнопок будет происходить вычисление искомых величин. Поэтому мы дадим ей заголовок Подсчитать. Вторая кнопка будет закрывать программу и получит соответствующий заголовок.
Все компоненты, используемые для создания указанных ранее элементов интерфейса, хорошо известны нам по предыдущим программам. Но, помимо них, для наглядности программы хорошо было бы, чтобы в ее окне был изображен тот самый геометрический объект, характеристики которого мы рассчитываем. Поэтому в окно программы желательно поместить изображение параллелепипеда. Как и в проекте, описанном в предыдущей главе, создание изображения мы начнем с того, что в экранной форме расположим объект
Panel 1 и настроим его аналогично тому, как это было сделано в описанном ранее проекте. Затем поверх объекта-фона Panel 1 мы поместим объект image 1, который будет содержать саму иллюстрацию. После того как рисунок будет "прнвязан" к верхнему левому углу панели, нужно определить его геометрические размеры. Однако здесь необходимо учесть некоторые особенности текущего проекта.
В данном случае мы создадим рисунок в графическом редакторе Paint, т. к. картинку с изображением параллелепипеда нетрудно нарисовать самостоятельно. Созданную картинку сохраняем в той же папке, где находятся файлы нашего проекта под именем "Картннка 1". Графический редактор Paint— это стандартное приложение Windows, которое есть на всех компьютерах, где установлена данная операционная система, он прост и удобен в использовании, однако к его недостаткам следует отнести то, что он является растровым. Растровые изображения представляют собой совокупность точек, которая плохо поддается масштабированию. При изменении размеров растрового рисунка он может заметно искажаться.
Поэтому в данном проекте лучше сначала определить размеры созданного вами рисунка. Это можно сделать с помощью команды Атрибуты, которая находится в меню Рисунок редактора Paint. Затем следует под полученные размеры подогнать высоту и ширину объектов imagei и Paneii. Для объекта imagei размеры можно сделать равными размерам рисунка, а для Paneii высоту и ширину можно сделать на 4 пиксела больше, чем у рисунка (с учетом размеров фаски). В этом случае созданный нами рисунок будет воспроизводиться на форме проекта без искажений. Загрузка картинки в imagei производится путем использования свойства Picture, как и в предыдущем проекте.
В итоге нашей работы графический интерфейс программы приобретет законченный вид, который представлен на рис. 14.3. Остается дополнить проект кодом, описывающим реакцию программы на действие экранных кнопок.
Создание кода начинаем с того, что двойным щелчком справа от события OnClick ДЛЯ объекта Buttonl открываем процедуру TForml.ButtonlClick. В процедуре используются переменные а, ь, с, которые содержат числовые значения длины, ширины и высоты параллелепипеда, а также s——площадь поверхности параллелепипеда и v— объем параллелепипеда. Описание переменных вставляем после строки заголовка процедуры:
var а,Ьгс,s,v:integer;
Затем в основной части процедуры (после слова begin) вставляем группу операторов, которые преобразуют введенные в текстовые окна длину, ширину и высоту в числовые значения. Эти операторы, использующие стандартную функцию inttostr, будут выглядеть так:
a:=strtoint(Edit1.Text);
b:==strtcint (Edit2.Text);
c:=strtoint(Edit3.Text);
Рис. 14.3. Графический интерфейс программы ,,Параллелепипед,*
Следующие операторы вычисляют объем, который присваивается переменной V, и преобразуют числовое значение этой переменной в текст, выводимый В окне Edit4.
v:=a*b*c;
Edit4.Text:=inttostr(v);
Далее нужно определить общую площадь поверхности параллелепипеда, которая представляет собой сумму площадей всех его шести граней. Площади граней представляют собой произведение длины и ширины, длины и высоты, ширины и высоты, причем площади передней и задней грани, верхней и нижней, левой боковой и правой боковой граней равны между собой. Поэтому достаточно найти по отдельности площади только трех граней и каждую полученную площадь умножить на два, а затем сложить полученные произведения. После вычисления значения переменной s нужно преобразовать ее в текст, выводимый в окне Edits. Указанная последовательность действий реализуется с помощью следующих операторов:
s:=2*a*b+2*a*c+2*b*c;
Edit5.Text:=inttostr(s)
Процедура TFormi. Buttoniciick в целом будет выглядеть так:
procedure TFormi.ButtonlClick(Sender: TObject);
var a,b,c,sfv:integer;
begin
a:=strtoint(Editl.Text);
b:=strtoint(Edit2.Text);
c:=strtoint(Edit3.Text);
v:=a*b*c;
Edit4 .Text:»=inttostr (v);
s:==2*a*b+2*a*c+2*b*c;
Edit5.Text:RintEostr(s) end;
Последнее, что нам осталось сделать, — это вставить команду close, закрывающую ОКНО программы В процедуру TFormi.Button2Click, ОПИСЫВЯЮЩуЮ реакцию на щелчок мышью на экранной кнопке Button2. В листинге 14.2 приведен полный текст программы.
? Листинг 14.2. Текст программы, вычисляющей объем па рал лелеп й педа
unit Unitl;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls;
type
TFormi = class(TForm)
Labell: TLabel; Label2: TLabel; Editl: TEdit; Edit2: TEdit; Label3: TLabel; Edit3: TEdit; Label4: TLabel; Edit4: TEdit; Label5: TLabel; Edit5: TEdit; Buttonl: TButton; Button2: TButton; Panel1: TPanel; Image1: TImage;
procedure ButtonlClick(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
(Private declarations } public
(Public declarations } end;
var
Forml: TForml;
implementation
($R *.dfm}
procedure TForml.Buttoniclick(Sender: TObject); var a,b,c,s,v:integer;
begin
a:=StrtoInt(Edit1.Text);
b:=Strto!nt(Edit2.Text);
c:=Strtolnt(Edi13.Text); v:=a*b*c;
s:=2*(a*b+a*c+b*c);
Edit4.Text:^InttoStr(v);
Edit5.Text:=InttoStr(s); end;
procedure TForml.Button2Click(Sender: TObject); begin close end;
end.
Теперь программу можно запускать на выполнение. После ввода исходных данных в текстовые окна и щелчка на экранной кнопке Подсчитать программа выдаст на экран сразу два результата: объем параллелепипеда и площадь его поверхности. Экран программы в процессе ее работы показан на рис. 14.4.
Программа "Хронометр"
Как известно, хронометром называется прибор, используемый для точного измерения времени. Проект, который мы будем разрабатывать в этом разделе, также позволит измерять время. В данном случае это будет период,
Рис. 14.4. Программа "Параллелепипед1* во время работы
прошедший от одного момента времени до другого. И первый и второй моменты времени в проекте будут задаваться в часах и минутах. Период между этими двумя моментами мы также будем определять в часах и минутах.
Для того чтобы разобраться, как правильно решать поставленную задачу, необходимо использовать математические действия, имеющиеся в языке Object Pascal. Всего в этом языке над числами можно производить шесть различных математических операций, которые аналогичны соответствующим действиям в Turbo Pascal. Это четыре действия, известные из элементарной математики, а также операции целочисленного деления div и нахождения остатка от деления mod. Все операции пригодятся нам в дальнейшем при составлении кода программы, а работу над проектом мы начнем как обычно с создания его графического интерфейса.
В данном проекте интерфейс должен включать в себя следующие элементы:
шесть текстовых окон. В первом и втором окнах будут вводиться исходные данные о первом моменте времени, в третьем и четвертом окнах — данные о втором моменте. В пятом и шестом окнах должен выводиться результат работы программы — разница между двумя моментами времени;
поясняющие надписи к текстовым окнам — к каждой группе из двух окон на экране должно выводиться по три надписи. Первая из надписей к группе поясняет, что за информация содержится в данной паре окон. Вторая и третья надписи в группе указывают на используемые единицы измерения
времени — минуты и часы. Общее количество поясняющих надписей равно девяти;
П три экранные кнопки. Первая из них будет производить процесс вычисления результата. Вторая должна выводить информацию об авторе. Третья кнопка закрывает программу;
панель, на которой находится рисунок, изображающий часы (данный рисунок является декоративным элементом программы);
надпись, содержащая сведения об авторе программы.
Создание интерфейса начинаем как обычно с настройки основной формы. В начале изменяем заголовок формы. Для этого справа от свойства caption ставим его значение хронометр. Затем изменяем фоновый цвет формы. Для этого щелкаем раскрывающийся список справа от свойства color и выбираем ИЗ списка ярко-голубой цвет ——ClAqua.
Затем размещаем в форме первую группу текстовых окон с надписями. Это будут объекты Editi (сюда окно будет введено количество часов для первого момента времени) и Edit2 (количество минут для первого момента времени). Для того чтобы лучше смотрелась вводимая в окна информация, мы изменим характеристики шрифта, для чего работаем со свойством Font данных объектов. Щелкнув кнопку-построитель, открываем диалоговое окно для настройки шрифта и увеличиваем его размер до Ю пунктов, а начертание делаем полужирным.
Над описанными ранее текстовыми окнами помещаем надпись Labell, заголовок которой говорит о том, что в эти окна вводятся данные о первом моменте времени. Справа от каждого из окон размещаем надписи Labei2 и Labe 13, заголовки которых содержат информацию о единицах измерения времени, используемых в каждом из окон. Заголовок Labei2— час, а ьаЬе13 —— мин. Для всех надписей мы изменяем характеристики шрифта — увеличиваем его размер до 12 пунктов и делаем его полужирным.
Под первой группой текстовых окон и надписей размещаем вторую группу для ввода данных о втором моменте времени. Эта группа содержит окна Edit3 И Edit4 И надПИСИ Label% Label5 И Label6. НастроЙКИ ЭТИХ ОКОН И надписей аналогичны соответствующим настройкам для первой группы. Под второй группой оставляем немного свободного места для размещения экранной кнопки.
Третья группа окон и надписей размещается под второй и содержит два текстовых окна Edits и Edit6, служащие для вывода результатов работы программы. Над окнами должна находиться поясняющая надпись следующего содержания: Разница между двумя моментами времени составляет. Однако эта надпись слишком длинна для того, чтобы поместиться в форме в одну строку.
Поэтому в данном случае придется воспользоваться следующим приемом: разбить длинную надпись на две более коротких н вывести их одна под одной. Таким образом, пользователь программы увидит на экране текст, состоящий из двух строк, которым будут соответствовать надписи Label7 и Labels. Кроме того, справа от текстовых окон будут располагаться еще две вспомогательные надписи: Label9 и Labeiio, аналогичные таким же надпнсям в предыдущих двух группах. Настройки окон и надписей также производятся аналогично соответствующим настройкам в предыдущих группах.
В правой верхней части формы мы расположим панель с находящимся на ней рисунком. Для этого мы создаем в форме объект Panel 1, на котором размещаем объект imagei. Настройка данных объектов сводится к подгонке расположения и размеров рисунка (объект image 1) к расположению и размерам панели (объект Paneii). Мы производим эту операцию аналогично тому, как мы это делали при работе над проектом ,,параллелепипедм. Единственное существенное отличие заключается в следующем: мы не будем рисовать загружаемую картинку вручную, а воспользуемся уже готовой. Для этого в папке Clipart, находящейся в пакете Microsoft Office 97, мы найдем файл Clock.wmf, содержащий изображение часов, и загрузим его в объект image 1 описанным ранее способом.
Последней группой элементов интерфейса, которую необходимо разместить в форме, являются экранные кнопки. Первая из этих кнопок Buttoni отвечает за выполнение расчетов по определению искомой разницы. Вторая кнопка Button2 должна выводить на экран формы сведения об авторе программы. Сведения будут выводиться на экран в виде надписи. Так как данная надпись вновь оказывается слишком длинной для вывода ее на экран в одну строку, то мы составляем ее из двух объектов: Label 11 и Labeli2, расположенных друг под другом. Так как непосредственно после запуска программы на выполнение надпись со сведениями об авторе не должна быть видна на экране, то производим настройку объектов Labein и Label 12, которая заключается в том, что для свойства visible каждого из этих объектов устанавливаем значение False. В результате подобной настройки по умолчанию эти объекты не будут видны. Завершаем создание интерфейса помещением на форму объекта Button3——кнопки, производящей закрытие программы. Интерфейс данной программы представлен на рис. 14.5.
Теперь приступаем к написанию кода для данной программы. Начнем этот процесс с описания действий, производимых при нажатии кнопки Buttoni. В начале необходимо разобрать ход производимых вычислений, что позволит нам определить, какие переменные понадобятся при написании кода. Как читатель помнит, все используемые в процедуре переменные необходимо описать после служебного слова var. Во-первых, нам нужно описать переменные
для исходных величин. Количество часов для первого момента времени обозначим cl, а количество минут для первого момента времени обозначим ml. Количество часов и минут для второго момента времени назовем соответственно с2 и m2. Этих величин в готовом виде у нас нет, но можно воспользоваться стандартной функцией strtoint, которая преобразует текстовые величины в числовые. Тогда операторы, преобразующие значения, введенные пользователем в текстовые окна Editi, Edit2, Edit3 и Edit4, в числовые переменные, будут выглядеть так:
cl:=StrtoInt(Editl.Text);
ml :=StrtoInt(Edit2.Text);
c2:=StrtoInt(Edit3.Text);
m2 :=StrtoInt(Edit4.Text);
Рис. 14.6. Графический интерфейс программы "Хронометр**
Дальнейший ход решения задачи будет выглядеть следующим образом. Переведем первый момент времени из часов и минут только в минуты. Для этого нужно количество часов для первого момента умножить на 60 и к нему прибавить количество минут. Величину первого момента времени, выраженную только в минутах, обозначим ti. Теперь таким же образом преобразуем второй момент времени, а соответствующую величину обозначим t2. В программе эти преобразования будут выражены следующими операторами: tl:=cl*60+ml;
t2:=c2*60+m2;
Для того чтобы найти величину t3 — разницу между этими моментами времени, достаточно вычесть из второго момента первый, что делает оператор: t3:~t2-tl;
Мы получили искомый результат, но выраженный только в минутах. Желательно этот результат представить, так же как и исходные данные в часах и минутах. Получить количество целых часов, которые содержатся в этой разнице, можно использовав целочисленное деление, т. е. разделив величину t3 на 60 с помощью операции div. Обозначим найденную величину через сЗ. Для определения количества оставшихся минут m3 мы прибегнем к операции mod, которая, как известно, находит остаток при целочисленном делении. В качестве делителя будет снова выступать число 60. Таким образом, операторы, вычисляющие количество часов и минут в конечном результате, будут выглядеть так:
c3:=t3 div 60;
m3:=t3 mod 60;
Искомые величины определены, но необходимо их преобразовать в текст, который будет отображаться в текстовых окнах Edits и Edit6. Это действие, обратное тому, что мы производили в начале процедуры, можно реализовать с помощью функции inttostr. Операторы, осуществл я ющи е преобразование, будут выглядеть так:
Edit5.Text:=InttoStr(сЗ);
Edit6.Text:=InttoStr (m3);
Теперь работа над процедурой TForml. Buttonclick, описывающей реакцию на нажатие кнопки Подсчитать разницу, завершена и целиком эта процедура будет выглядеть следующим образом:
procedure TForml.ButtonlClick(Sender: TObject);
var cl,ml, c2,m2,€3,1113, zl,t2, t3:integer;
begin
cl:=StrtoInt(Editl.Text);
ml:=St rtclnt(Edi12.Text);
c2:=StrtoInt(Edit3.Text);
m2:=StrtoInt(Edit4.Text);
tl:^cl*60+ml;
t2:^c2*60+m2;
t3:=t2-tl;
c3:=t3 div 60;
m3:=t3 mod 60;
Edit5.Text:=InttoStr(c3);
Edit6.Text:=InttoStr(m3); end;
Следующим шагом в работе над программой должно стать создание процедуры, которая описывает реакцию на нажатие кнопки Buttons — сведения об авторе. Действие, описываемое в данной процедуре, должно заключаться в том, что невидимая по умолчанию надпись со сведениями об авторе должна становиться видимой. Напомним, что эта надпись фактически состоит из двух с именами Labein и Label 12. Превращение невидимого объекта в видимый, как уже известно читателю, производится путем присваивания свойству visible данного объекта значения True (вместо имевшегося по умолчанию значения False). Следовательно, процедура, описывающая эти действия, будет выглядеть так:
procedure TForml.Button2Click(Sender: TObject); begin
Labelll.Visible:=True;
Label12.Visible:=True end;
Последнее, что осталось сделать, — это записать команду закрытия программы в процедуру, описывающую реакцию на нажатие кнопки Выход. Процедура эта будет выглядеть так:
procedure TForml.Button3Click(Sender: TObject); begin
Clos© end;
Целиком же вся программа должна выглядеть следующим образом — листинг 14.3.
:Листинг 14.3. Текст программы "Хронометр"
unit Unitl;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls;
type
TForml = class(TForm)
Editl: TEdit;
Edit2: TEdit;
Label1: TLabel;
Labe12: TLabe1;
Label3: TLabe1;
Label4: TLabel;
Edit3: TEdit;
Edit4: TEdit;
Label5: TLabel;
Label6: TLabel;
Label7: TLabel;
Label8: TLabel;
Edit5: TEdit;
Edit6: TEdit;
Label9: TLabel;
Label10: TLabel;
Button1: TButton;
Panell: TPanel;
Imagel: TImage;
Button2: TButton;
Label11: TLabe1;
Labell2: TLabel;
Button3: TButton;
procedure ButtonlClick(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
(Private declarations 卜
public
{ Public declarations } end;
var
Forml: TForml;
implementation
($R *.dfm}
procedure TForml.ButtonlClick(Sender: TObject);
var cl,ml,c2,m2,c3,m3,tl.t2.t3:integer;
begin
cl:=Strto!nt(Editl.Text);
ml:=StrtoInt(Edit2.Text);
c2:=StrtcInt(Edit3.Text);
m2:-Strtolnt(Edit4.Text);
tl:^cl*60+ml;
t2:=c2*60+m2;
t3:=t2-tl;
c3:=t3 div 60;
m3:=t3 mod 60;
Edit5.Text:=InttoStr(c3);
Edit6.Text:^InttoStr(m3); end;
procedure TForml,Button2Click(Sender: TObject); begin
Label 11 ・ Visible: =True;
Label12•Visible:=True end;
procedure TForml.Button3Click(Sender: TObject); begin Close end;
end.
Обратите внимание на то, что список использованных в программе элементов графического интерфейса, а также список использованных в программе процедур система программирования создает автоматически.
После запуска готовой программы на выполнение она будет производить теперь все требуемые от нее действия, причем нажатие экранных кнопок можно выполнять в произвольном порядке и реакция на них будет правильной. Пример того, как может выглядеть экран программы во время работы, показан на рис. 14.6.
Рис. 14.6. Программа "Хронометр*' во время работы
Программа "Цилиндр"
Во всех рассмотренных нами до сих пор задачах мы работали только с целочисленными переменными, значениями которых могут быть лишь целые числа. На практике же чаще всего полученные при расчетах значения выражаются дробными, вещественными числами. Вещественные результаты часто получаются и тогда, когда исходными данными при вычислениях являются целые числа. Пример подобной задачи — это вычисление объема и площади поверхности цилиндра по его высоте н радиусу основания. Даже в том случае, если высота и радиус основания являются целыми числами, полученные результаты заведомо будут вещественными, т. к. для их вычисления используется число Пи, которое, как известно, является бесконечной дробью.
На примере этой задачи мы освоим работу с вещественными переменными, а также научимся более рационально разрабатывать графический интерфейс программы. Интерфейс данной программы будет включать следующие элементы:
два текстовых окна для ввода исходных данных (высоты и радиуса цилиндра) и две поясняющие надписи к этим окнам;
П два текстовых окна для вывода полученных результатов (объема и площади поверхности цилиндра) и две надписи с информацией о содержимом этих окон;
口 панель с рисунком, на котором должен быть изображен геометрический объект, параметры которого вычисляются в программе;
три экранные кнопки. Щелчок на первой из этих кнопок приводит к вычислению искомых величин. Щелчок на второй кнопке будет выводить на экран компьютера информацию об авторе программы. Щелчок на третьей кнопке закрывает программу;
дополнительное окно с информацией об авторе программы и кнопкой, которая закрывает это окно.
Как видно из перечисления элементов интерфейса, в целях экономии места на основной форме мы вводим дополнительную форму с информацией об авторе, которая может выводиться на экран и закрываться при отсутствии надобности в ней. Как создавать дополнительную форму, мы разберем позже, а сейчас рассмотрим процесс создания графического интерфейса основной формы.
Основная форма получит название цилиндр, для чего мы изменим свойство Caption объекта Forml, цвет же формы в данном случае оставим без изменения. На форме помещаем текстовые окна Editi и Edit2, в которые будут вводиться данные соответственно о высоте цилиндра и радиусе его основания. Объекты Labe 11 и Labe 12 будут содержать поясняющие надписи к содержа-
нию данных окон. Далее на форме размещаем объекты Edit3 и Edit4, которые будут содержать результаты вычислений. В окне Edit3 будет выводиться информация о вычисленном объеме цилиндра, а в окне Edit4 —— данные о найденной площади его поверхности. Объекты Labelз и Label 4 подобно предыдущим двум надписям служат пояснениями к окнам с соответствующими номерами.
В нижней части экрана расположим три КНОПКИ: Buttonl, Button? И Button3. При нажатии на кнопку Buttoni производятся вычисления объема и площади поверхности параллелепипеда по исходным данным, введенным в окна Editl и Edit2, а полученные результаты отображаются в окнах Edit3 и Edit4. При нажатии на вторую кнопку Buttons на экран выводится дополнительное окно, содержащее сведения об авторах программы. При нажатии на кнопку Button3 основная форма закрывается, и работа программы на этом завершается.
В правой части экрана программы должен находиться компонент Paneii, на котором размещается объект imagel, т. е. иллюстрация к данной программе, изображающая цилиндр. Рисунок, который изображает цилиндр, мы вначале создадим с помощью графического редактора Paint и разместим его в папке, содержащей проект "цилиндр**, а потом под размеры созданного рисунка подгоним размеры панели и иллюстрации.
На этом разработку графического интерфейса основной формы проекта можно считать завершенной (рис. 17.7). Далее мы должны перейти к созданию кода, описывающего действия различных объектов формы. Однако, делая это, необходимо помнить, что величины, используемые в данной программе, являются вещественными. Вещественные же величины имеют определенные особенности при их использовании в программе.
Для описания вещественных величин используется специальный тип Real, аналогичный такому же типу в Turbo Pascal. Подобно преобразованию строковых величин в целые и обратно нам придется производить подобные действия и с вещественными числами. Для преобразования строковой величины в вещественную используется стандартная функция языка Object Pascal strtoFloat. Для обратного преобразования используется стандартная функция Fioattostr. Теперь мы готовы к написанию кода данной программы.
Начнем написание программы с описания реакции на нажатие кнопки Buttoni. Эта кнопка позволяет рассчитать объем и площадь поверхности цилиндра по имеющимся исходным данным. Обозначим высоту цилиндра h, а радиус его основания — г. Искомые величины обозначим следующим образом: объем цилиндра — v, а общую площадь его поверхности — з. Все эти величины должны быть описаны в разделе описаний подпрограммы Tformi .Buttoniciick таким образом:
var h,г:integer; vrs:real;
т. е. исходные данные описываются как величины целого типа, а результаты как вещественные величины.
Для того чтобы исходные данные были представлены в числовой форме, мы должны преобразовать в числовой (в данном случае — целый) вид, те данные которые пользователь вводит в окно Editl и Edit2 в строковой форме. Это преобразование будет выполнено с помощью операторов:
h:=StrtoInt(Editl.Text);
r:=StrtoInt(Edit2.Text);
Рис. 14.7. Графический интерфейс проекта 'Цилиндр"
Следующим шагом станет вычисление значений искомых величин. Как известно из стереометрии, объем цилиндра определяется как произведение высоты цилиндра на площадь его основания, которая в свою очередь вычисляется как площадь круга с радиусом г. Площадь же круга, как известно, представляет собой квадрат его радиуса, умноженный на число Пи.
Для возведения радиуса в квадрат мы воспользуемся стандартной функцией sqr, имеющейся в языке Object Pascal. Дия определения значения числа Пи мы используем функцию pi, также входящую в состав языка Object Pascal. Эта функция в отличие от предыдущей не имеет аргумента, а значением ее является определяемое компьютером с высокой степенью точности число Пи. Следовательно, площадь основания можно представить следущим образом: pi*sqr(r). Исходя из всего сказанного ранее, на языке Object Pascal вычисление объема цилиндра можно записать следующим образом:
v:=rpi*sqr (г) *h;
Следующая величина, которую нам необходимо определить, — это площадь поверхности цилиндра. Общая площадь складывается нз трех площадей: плогцздн боковой поверхности цилиндра, площади его верхнего основания и площади нижнего основания, причем последние две величины равны между собой. Площадь одного основания, как мы уже знаем, можно записать как pi*sqr(r), а сумму площадей запишем как 2*pi*sqt(r). Можно ту же сумму записать н по-другому: 2*pi*r*r. Площадь же боковой поверхности цилиндра вычисляется как произведение длины окружности основания на высоту цилиндра. Длину окружности можно записать как 2*pi*r, а боковая поверхность цилиндра тогда определяется по формуле 2*pi*r*h. Таким образом, общая площадь поверхности цилиндра будет равна 2*pi*r*r+2*pi*r*h. Вынося общие множигели за скобки, получим следующее выражение: 2*pi*r*(h+г). Теперь осталось присвоить значение этого выражения искомой величине s:
s:=2*pi*r*(h+r);
Для того чтобы преобразовать полученные вещественные величины в строковые. которые будут отображаться в текстовых окнах Edit3 и Edit4, следует воспользоваться стандартной функцией Floattostr. Операции преобразования будут записаны в программе следующим образом:
EditJ.Text:=FloattoStr(v); Edit4.TexL:^FloattoStr(s)
Целиком подпрограмма, описывающая действия, осуществл я е м ые при нажатии кнопки Buttoni, будет выглядеть так:
procedure TForml.ButtonlClick(Sender: TObject); var h,r:integer; v,s:real;
begin
h:=Strto!nt(Edit1.Text); r:^St rtolnt(Edi t2.Text); v:=pi*sqr(r)*h;
s:^2*pi*r,r (h+r);
Edit3.Text:=FloattoStr(v);
Edit4.Text:=FloattoStr(s) end;
Следующая подпрограмма, которую мы создадим, должна описывать реакцию на кажатие кнопки Button2. Результатом такого нажатия должен стать вывод дополнительного окна, которое содержит сведения об авторе или авторах данной программы. Для того чтобы это правильно сделать, нужно знать последовательность действий, выполняемых при подключении к проекту дополнительного окна.
Создание дополнительного окна и работа с ним включает в себя следующие этапы:
Создание заготовки для нового окна. Такая заготовка представляет собой дополнительную форму. Для подключения к проекту новой формы необходимо в главном меню системы программирования открыть раздел File, в разделе File найти команду New. Если задержать указатель мыши на несколько секунд на данной команде, то справа от нее появится список элементов, которые можно добавить в проект (в 5 версии нужно один раз щелкнуть команду New мышью). Выберем из списка вариант Form. После этого в проекте появится дополнительная форма. В нашем случае это будет Form2.
Вставка оператора в основной программный модуль. В основном программном модуле (этот модуль, как правило, называется unitl) в подпрограмму, описывающую работу кнопки или другого элемента, открывающего дополнительное окно, вставить оператор следующего вида:
FormN.Show;
где n ——порядковый номер открываемого дополнительного окна. В нашем случае этот оператор будет выглядеть так:
Form2. Show;
То, что находится в данном операторе после точки, называется методом объекта. Метод— это подпрограмма, которая изменяет свойства связанного с ней объекта. В нашем примере метод show изменяет свойства вспомогательной формы, которая из невидимой становится видимой. Целиком же подпрограмма, описывающая работу второй кнопки в нашем проекте, будет выглядеть следующим образом:
procedure TForml.Button2Click(Sender: TObject);
begin
Fcrm2.Show;
end;
Создание графического интерфейса подключаемого окна. Для того чтобы вывести на экран необходимую форму, поступаем следующим образом: входим в главное меню системы программирования н выбираем в нем раздел View. В этом разделе находим команду Forms. После выполнения данной команды на экран компьютера выводится диалоговое окно, которое содержит список всех форм, используемых в данном проекте. В нашем случае поиск нужной формы не составит никаких затруднений, т. к. в проекте всего две формы. Выбираем вторую из них, после чего данная форма будет выведена на передний план. Сам же процесс создания графического интерфейса аналогичен соответствующему процессу для основной формы.
По завершении работы над графическим интерфейсом до пол нител ьное окно можно закрыть, щелкнув стандартную закрывающую кнопку, расположенную в правом верхнем углу окна.
Разработка кода, описывающего действия, производимые пользователем в дополнительном окне. Данный код будет содержаться в дополнительном модуле Unit2. Для того чтобы вывести на экран текст данного модуля, нужно открыть раздел View главного меню системы программирования, в данном разделе найти команду Units. После щелчка на этой команде открывается диалоговое окно со списком модулей, в котором выбираем нужный нам (в данном случае — это Unit2).
Сам по себе процесс написания кода аналогичен соответствующему процессу для основного окна, но нужно учесть, что модуль Unit2 должен быть подключен к основному модулю Uniti. Данное подключение производится так: в основной части программы после заголовка указывается список используемых в данной программе дополнительных модулей. Этот список начинается со служебного слова Uses, после которого через запятую перечисляются модули. В этот список следует добавить модуль Unit2. Тогда список будет выглядеть следующим образом:
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls, Menus, Unit2;
После выполнения всех указанных ранее операций дополнительное окно становится полноценной частью проекта.
Следующая кнопка Button3, которую мы используем в основной форме, закрывает эту форму. Данная операция производится с помощью команды Close, а текст подпрограммы, описывающей это действие, будет выглядеть так:
procedure TForml.Button3Click(Sender: TObject); begin Close end;
На этом мы завершаем написание программного модуля Uniti для основной формы. Целиком данный модуль будет выглядеть следующим образом — листинг 14.4.
! Листинг 14.4. Текст программы "Цилиндр" (первый модуль)
unit Uniti;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls, Menus, Unit2;
type
TForml = class(TForm)
Label1: TLabel;
Editl: TEdit;
Label2: TLabel;
Edit2: TEdit;
Label3: TLabel;
Edit3: TEdit;
Label4: TLabel;
Edit4: TEdit;
Buttonl: TButton;
Button2: TButton;
Button3: TButton;
Panel1: TPanel;
Imagel: TImage;
procedure ButtonlClick(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button2Click(Sender: TObject); private
I Private declarations } public
(Public declarations }
end;
var Forml: TForml;
implementation
($R *.dfm}
procedure TForml.ButtonlClick(Sender: TObject); var h,r:integer; v,s:real;
begin
h:=StrtoInt(Editl.Text);
r:=StrtoInt(Edit2.Text);
v:=pi*sqr(r)*h;
s:=2*pi*r*(h+r);
Edit3.Text:«FloattoStr(v);
Edit4.Text:eFloattoStr(s) end;
procedure TForml.Buttcn2Click(Sender: TObject);
begin
Form2.Show; end;
procedure TFcrml.Button3Click(Sender: TObject);
begin
Close end;
end.
Теперь нам осталось создать графический интерфейс и написать код для вспомогательного окна со сведениями об авторе проекта. Вначале переименуем саму форму Form2, изменив значение ее свойства caption на Сведения об авторе. Цвет формы мы изменять не будем, на форме же создадим следующие объекты: две надписи Labe 11 и Labe 12 со сведениями об авторе и закрывающую кнопку Buttoni. Единственный объект, выполняющий действия в данном окне ——это кнопка Buttoni. Для нее мы и напишем код, состоящий из одного оператора close. Целиком же программный модуль Unit2 будет выглядеть следующим образом ——листинг 14.5.
{ Листинг 14.5. Текст программы "Цилиндр'1 (второй модуль)
unit Unit?;
interface
uses
VJindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type
TForm2 = class(TForm)
Labe11: TLabe1;
Labe12: TLabe1;
Buttoni: TButton;
procedure ButtonlClick(Sender: TObject);
private
{ Private declarations I
public
{ Public declarations } end;
var Form2: TForm2;
implementat ion
($R *.dfm}
procedure TForm2.ButtonlClick(Sender: TObject); begin Close end; end.
После написания кода для второго окна работу над проектом можно считать завершенной. Результаты работы программы можно увидеть на рис. 14.8.
Рис. 14.8. Программа "Цилиндр" во время работы
Задание для самостоятельной работы
Разработать в системе Delphi проект "Банкомат", взяв за основу соопветст- вующую программу на языке Turbo Pascal, которая описана в главе 3. В интерфейсе формы данной программы должны присутствовать следующие элементы: текстовое окно для ввода суммы, которую хочет получить пользователь, поясняющая надпись к этому окну и экранная кнопка для ввода суммы.
Под окном ввода должны располагаться 4 текстовых окна с сообщениями о количестве купюр по 1000, 500, 100 и 50 рублей, которыми должна быть выдана сумма, и поясняющими надписями к ним. В правом нижнем углу формы должна быть предусмотрена кнопка для выхода из программы. В правой верхней части формы желательно поместить рисунок. В качестве иллюстрации к программе можно использовать графический файл Money.wmf из коллекции Clipart, входящей в состав пакета Microsoft Office 97.
ГЛАВА 15
Программы с ветвлением в Delphi
Все программы, которые мы до сих пор разрабатывали в среде Delphi, состояли из операторов, выполняющихся поеледовательно друг за другом. Такого типа программы обычно называют программами линейной структуры, т. к. в них ход решения задачи представляет собой как бы прямую линию, ведущую от постановки задачи и ввода исходных данных к получению конечного результата. Однако это не единственно возможный вид программы. Существуют так называемые программы с ветвлением, в которых используй ются операторы организации переходов, позволяющие нарушить последовательный порядок выполнения инструкций программы.
Программа "Тест11
В языке Object Pascal, как и в Turbo Pascal, широко используются условные операторы. Синтаксис условного оператора if аналогичен синтаксису этого оператора в Turbo Pascal. Так же записываются в Object Pascal операции сравнения, используемые в условных операторах.
Условный оператор if широко используется в Object Pascal Одной из облас' тей его применения является составление различных программ-тестов, проверяющих знания пользователя. В главе 4 была приведена программа, которая проверяет пользователя на знание даты первого полета человека в космос (см. листинг 4.4). Взяв ее за основу, создадим тест на эту же тему в системе Delphi.
Графический интерфейс основной формы программы "Тест" будет включать в себя следующие компоненты: во-первых, окно комментария, содержащее вопрос, на который должен дать ответ тестируемый. Во-вторых, текстовое окно, куда тестируемый вводит свой вариант ответа. Слева от текстового окна должно находиться еще одно, вспомогательное окно комментария, пояс-
няющее, куда нужно вводить ответ. Справа от текстового окна поместим иллюстрацию к тесту, п редставл я ютую собой фотографию первого искусственного спутника Земли. Под текстовым окном должна располагаться экранная кнопка, нажатием на которую вводится ответ тестируемого пользователя. Ниже экранной кнопки должна быть расположена еще одна надпись, которая сообщает пользователю о том, правильно или неправильно ответил он на заданный вопрос.
Помимо кнопки Ввод в основной форме будут находиться еще две экранные кнопки: кнопка, закрывающая окно программы, и кнопка, нажатие на которую выводит на экран компьютера дополнительное окно со сведениями об авторе. Это дополнительное окно в свою очередь должно содержать окно комментария со сведениями об авторах или авторе программы и экранную кнопку, закрывающую это дополнительное окно.
Разработку графического интерфейса мы начнем как обычно с работы над самой формой. Изменяем заголовок формы — она будет называться тест. Цвет формы изменяем на небесно-голубой. Размеры формы оставляем без изменений. В левой верхней части формы располагаем объект Memoi ——окно комментария с текстом задаваемого вопроса.
Для создания этого объекта мы используем компонент мето, который находится в палитре компонентов на вкладке Standard и представлен кнопкой 回. Использование данного компонента удобнее, чем использование компонента Label в том случае, если на экран компьютера нужно выводить текст в несколько строк. Для того чтобы ввести текст в поле комментария, нужно найти у объекта Мето свойство Lines и щелкнуть справа кнопку-построитель. После указанных действий на экране на переднем плане появится окно String List Editor, что в переводе с английского означает *'редактор строк**. Затем в рабочей области окна мы построчно вводим текст комментария, при этом нужно не забывать в конце каждой строки нажимать клавишу <Enter>. По окончании ввода текста нужно щелкнуть экранную кнопку ОК. Если требуется, чтобы окно с комментарием не выделялось на общем фоне формы, то нужно свойство Color объекта Мето привести в соответствие со свойством Color объекта Form. Затем для свойства Borderstyle (граница объекта) окна мето нужно из раскрывающегося списка выбрать значение bsNone (отсутствие границы). Текст вопроса В каком году был запущен первый искусственный спутник Земли? вводим в поле комментария в три строки, а размер шрифта (используя свойство Font) увеличиваем до 12.
Под окном комментария размещаем текстовое окно Editl. В него будет вводиться текст ответа. Для удобства контроля пользователя за вводимой им информацией размер текста в окне также увеличиваем до 12. Слева от объекта Editl помещаем вспомогательное окно комментария Мето2, содержащее пояс-
некие о том, куда нужно вводить ответ. В этом окне информацию также вводим в три строчки. Для того чтобы текст поместился в указанном месте, размер шрифта принимаем равным 9. Цвет текста в этом окне изменяем на темно-синий.
Ниже окна Editi помещаем экранную кнопку Buttonl. Заголовок этой кнопки изменяем на слово Ввод, а размер шрифта делаем равным 12. В правом нижнем углу основной формы будет расположена надпись Label 1, информирующая пользователя о результатах теста. Эта надпись будет выводиться в одну строку шрифтом красного цвета. Начертание шрифта сделаем полужирным, а размер также примем равным 12. Сразу после начала работы программы эта надпись вообще не должна быть видна, т. к. было бы абсурдно, если бы пользователь узнал о результатах теста еще до его начала. Можно было бы найти свойство visible объекта и придать ему значение False. Но такой путь усложнил бы написание кода. Поэтому поступим другим образом: найдем свойство caption объекта Labe 11 и очистим его. Тогда надпись после запуска программы не будет видна, хотя формально она будет считаться видимой.
Следующим объектом должна стать иллюстрация к тексту. Как мы это уже неоднократно делали раньше, вначале мы размещаем в форме объект Faneii, а уже затем поверх него располагаем imagei, т. е. непосредственно саму иллюстрацию. Иллюстрацию к данной программе, представляющую собой черно-белую фотографию первого спутника, авторы книги взяли из Интернета. Данная фотография находилась на Web-странице в формате JPEG. Графические изображения, созданные в данном формате, достаточно хорошо поддаются масштабированию, поэтому особых проблем, связанных с взаимной подгонкой размеров панели и самой иллюстрации, здесь возникать не должно.
Нам осталось разобраться еще с двумя элементами графического интерфейса —экранными кнопками Button2 и Buttons. Основные настройки для этих кнопок такие же, как и для кнопки Buttonl. Отличаться будут только заголовки КНОПОК: Об авторах ДЛЯ Button2 И Выход ДЛЯ Button3. Нажатие КНОПКИ Button2 должно приводить к появлению на экране компьютера дополнительной формы с именем Гогш2. Последовательность создания такой формы и подключения ее к основному проекту была описана в предыдущей главе и поэтому не должна вызывать сложностей у пользователя.
Настройка дополнительной формы будет заключаться в том, что мы изменим ее заголовок на сведения об авторах, а таюке уменьшим ее размеры, т. к. на ней будут расположены всего два объекта. Уменьшение размеров формы можно производить как путем перетаскивания мышью маркеров формы, так и посредством задания соответствующих величин для свойств Height н width. Графические объекты, которые будут расположены на вспомогатслыюй фор-
ме, — это окно комментария Memoi, которое непосредственно н будет содержать информацию об авторах программы, а также кнопка Buttoni, закрывающая вспомогательное окно. Текст комментария будет содержать надпись в две строки, имеющую размер шрифта, равный Ю, а закрывающая кнопка должна иметь заголовок ок и размер шрифта, равный 12. Как должен выглядеть созданный нами графический интерфейс, можно увидеть на рис. 15.1.
Рис. 15.1. Графический интерфейс программы 'Тести
Далее переходим к написанию кода программы. Начнем мы с написания кода для основной программной формы. В первую очередь мы оформим процедуру, которая описывает реакцию на щелчок на кнопке Buttoni. После щелчка на этой кнопке должна выполняться проверка введенных пользователем данных. Строковая информация преобразуется в числовую с помощью стандартной функции strtoint. Введенная в окно Editi строковая информация присваивается целочисленной переменной к:
k:=StrtoInt(Editi.Text);
Теперь ответ пользователя, содержащийся в переменной к, нужно проверить на совпадение с правильным ответом— числом 1957 (год запуска первого спутника). При совпадении двух этих ответов на экран выводится одна информация, при их несовпадении— “ругая, об ошибке. Такая проверка выполняется с помощью условного оператора if: if k=1957 then Label1.Caption:='Вы ответили правильно* else Labe11.Caption:^1Вы ошиблись'
Таким образом, целиком процедура, отслеживающая реакцию на нажатие кнопки Ввод после ввода ответа в текстовое окно, должна выглядеть так:
procedure TFormi.ButtonlClick(Sender: TObject); var k:integer; begin k:^Strtolnt(Editl.Text); if k=1957
then Labe11.Caption:^ * Вы ответили правильно1
else Labe11.Caption: = * Вы ошиблисьr end;
Следующая кнопка, для нажатия которой мы пишем код,——это кнопка Button2. В процедуру, описывающую реакцию на нажатие этой кнопки, вставляем всего одну команду:
Form2.Show;
При этом нужно не забыть, что в раздел Uses, находящийся в начале данного программного модуля, следует добавить ссылку на второй программный модуль, обслуживающий дополнительную форму Form2:
uses Unit2;
Наконец в процедуру, обслуживающую кнопку Buttons, нужно вставить всего одно слово:
Close;
Теперь мы можем целиком обозреть получившийся программный модуль unitl, содержащий указанные ранее элементы программного кода——листинг 15.1.
j Листинг 15.1. Текст программы иТест"' (первый модуль)|
unit Unitl;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, jpeg, ExtCtrls;
type
TFormi = class (TForm) Memol: TMemo;
Memo2: TMemo;
Editl: TEdit;
Buttonl: TButton;
Label1: TLabel;
Pane11: TPane1;
Inage1: TImage;
Button2: TBucton;
Button3: TButton;
procedure ButtonlClick(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations ) public
I Public declarations } end;
var
Forml: TForml;
implementation
uses Unit2;
{$R,.dfm}
procedure TForml.ButtonlClick(Sender: TObject);
var к:integer; begin k:=StrtoInt (Editl.Text); if k=1957
then Labe11.Caption: = * Вы ответили правильно1
else Label1.Caption: =1 Вы ошиблись * end;
procedure TForml.Button2Click(Sender: TObject); begin
Fcnn2. Show end;
procedure TForml.Button3Click{Sender: TObject); begin Close end;
end.
Последнее, что осталось сделать в плане написания кода, — это описать реакцию на нажатие кнопки Buttonl, расположенной на вспомогательной форме
Form2. Для этого нужно в списке программных модулей выделить модуль Unit2 И В процедуру TForm2.ButtonlClick добавить команду Close. ПОЛНЫЙ текст модуля Unit2 мы приводить не будем, т. к. он аналогичен такому же модулю из предыдущего проекта (см. листинг 14.5). Внешний вид программы "тест" во время работы приведен на рис. 15.2.
Рис. 152 Программа "Тест" во время работы
Программа "Квадратное уравнение"
В примере, приведенном в предыдущем разделе, каждая из ветвей условного оператора if содержала только один оператор. Но часто возникает ситуация, когда при выполнении или невыполнении некоторого условия нужно произвести не одно какое-либо действие, а целый ряд действий. Тогда в программе на языке Object Pascal внутри условного оператора используется составной оператор. Как и в языке Turbo Pascal, в Object Pascal для выделения составного оператора используются операторные скобки begin и end.
В общем случае составной оператор может находиться внутри условного оператора и после служебного слова then, н после служебного слова else, и после них вместе. Следующей нашей задачей как раз и будет разработка проекта, в котором реализуется как раз последний вариант условного оператора. Результатом разработки должна стать программа решения квадратного уравнения вида:
а? + 反 + с = 0.
По введенным с клавиатуры исходным данным программа должна либо находить корни квадратного уравнения, либо выдавать сообщение о том, что данное уравнение не имеет решения. Напомним читателю алгоритм решения данного уравнения. В начале следует вычислить дискриминант уравнения, который определяется по формуле:
d = / - 4ас*.
Затем в зависимости от величины дискриминанта определяется возможность нахождения решения данного уравнения. Если дискриминант положителен или равен нулю, то уравнение имеет решение и можно найти два его корня х! и х2 (в случае равенства дискриминанта нулю два корня будут равны между собой). Вычисление корней производится по следующим формулам:
В случае же, если найденный дискриминант отрицателен, уравнение вообще не имеет решения. Как видно из сказанного ранее, данный алгоритм хорошо подходит для реализации с помощью условного оператора if.
Как всегда, работу над проектом мы начинаем с разработки интерфейса программы. Основное окно программы должно содержать три текстовых окна для ввода исходных данных — коэффициентов а, ь и с квадратного уравнения. Слева от каждого из этих окон должна находиться надпись, которая поясняет, какой именно коэффициент вводится в то или иное окно. Таким образом, количество надписей в этой части основного окна также должно быть равно трем. Ниже текстовых окон для ввода исходных данных должны находиться два текстовых окна для вывода решения (конечно, в том случае, если такое решение имеется). Над этими текстовыми окнами также должна располагаться поясняющая надпись.
Между окнами с исходными данными и окнами с результатами в основной форме будут расположены две экранные кнопки. Слева должна находиться кнопка, нажатие на которую приводит к решению уравнения. Назовем эту кнопку Найти решение. Правее будет расположена кнопка Сброс, щелчок на которой очищает как текстовые окна с исходными данными, так и текстовые окна с результатами. Эта кнопка имеет двоякое предназначение. Во-первых, она может понадобиться в том случае, если пользователь допустил ошибку при вводе исходных данных. Пользователь может исправить ошибку, не закрывая окно программы, а только щелкнув мышью экранную кнопку. Во- вторых, если пользователь уже решил квадратное уравнение и хочет решить аналогичное уравнение, но уже при других значениях коэффициентов, ему также нет необходимости закрывать окно программы и запускать ее заново. Достаточно нажать кнопку Сброс и ввести затем эти новые коэффициенты.
Еще одним элементом основного окна программы, используемым для того, чтобы немного оживить его, станет иллюстрация юмористического характера, расположенная в правой части окна. Данная иллюстрация изображает персонажа, задумавшегося над решением сложной задачи.
Все перечисленные ранее элементы уже неоднократно использовались нами при составлении различных проектов. Но наряду с ними в этой программе будут использованы и новые элементы. Необходимость их введения объясняется следующим: для закрытия окна и вывода справочной информации мы ранее использовали специальные экранные кнопки. Это допустимо в том случае, если число элементов интерфейса в окне невелико, и, кроме того, в окне имеется достаточное количество свободного места для размещения кнопок. Если же в основном окне программы находится большое количество элементов интерфейса и к тому же ощущается дефицит свободного места в окне, то целесообразно поступить по-другому. В таком случае лучше организовать в верхней части окна программы специальное меню, с помощью пунктов которого можно производить различные операции с файлами (включая закрытие программы), получать необходимую информацию справочного характера и решать многие другие задачи. В сисгеме программирования Delphi имеются все необходимые средства для создания такого меню.
Как обычно, непосредственную работу по созданию интерфейса программы начнем с работы над самой формой. Изменим заголовок основной формы. Вместо Forml она будет называться Решение квадратного уравнения. Кроме того, изменим цвет формы, сделав его бледно-зеленым.
Затем приступим к созданию текстовых окон для ввода исходных данных с сопровождающими их надписями. Текстовые окна для ввода данных получат наименования Editi, Edit2 н Edit3. Соответствующие надписи получат имена Label 1, Labe 12 и Labei3. В окно Editl будут вводиться данные о коэффициенте а. Поле справа от свойства Text данного объекта предварительно очистим, т. к. в начале работы программы текстовое окно должно быть пустым. Шрифт для данного объекта (свойство Font) мы нзменнм, сделав его полужирным и увеличив его размер до 10 пунктов. Аналогичным образом настроим окна Edit2 и Edit3, которые используются для ввода коэффициентов ь и с.
Настройка надписи Label 1 включает в себя следующие действия. Во-первых, МЫ изменим заголовок надписи (СВОЙСТВО Caption) ка следующий: Введите коэффициент а. Во-вторых, изменим шрифт надписи. Подобно шрифту текстового окна сделаем шрифт полужирным и равным 10 пунктам. Подобные же настройки произведем и для объектов Labei2 и Label3. При этом содержание заголовка для Label2 будет Введите коэффициент Ь, а для Label3 соответственно Введите коэффициент с.
Следующими элементами интерфейса программы станут текстовые окна Edit4 и Edits, которые используются для вывода корней уравнения х! И х2. Настройка этих объектов большей частью аналогична настройке предыдущих текстовых окон, т. е. мы очищаем свойство Text, а шрифт для обоих текстовых окон делаем полужирным и равным 10 пунктам.
Есть, однако, еще момент, который надо учитывать при настройке этих окон. Дело в том, что уравнение, как мы уже знаем, может и не иметь решения. В таком случае наличие в окне программы текстовых окон с корнями уравнения лишено какого-либо смысла. Поэтому поступим с этими окнами следующим образом: изначально сделаем их невидимыми, а в том случае, если решение уравнения будет найдено, эти окна проявятся, и мы увидим в них найденный результат. Для того чтобы настроить окна соответствующим образом. мы найдем для каждого из элементов Edit4 и Edit5 свойство visible и установим для него значение False (ложно), которое скроет их от глаз пользователя. На этом настройку текстовых окон можно считать завершенной.
Надпись Labels должна содержать информацию об итогах решения уравнения (как при наличии корней, так и при их отсутствии). Поскольку эта надпись в любом случае должна появляться только после ввода исходных данных и щелчке на кнопке Найти решение, сделаем ее изначально невидимой, для чего свойству visible данного объекта присвоим значение False. Заголовок данной надписи изменим на корни уравнения, а шрифт заголовка сделаем полужирным н равным 10 пунктам. При отсутствии решения заголовок надписи будет иным, но соответствующее изменение заголовка мы обеспечим при написании кода.
Между верхней и нижней группой надписей расположим две экранные кнопки: Buttonl и Button2. Для кнопки Butroni мы изменим заголовок, который будет теперь следующим: найти решение. Размеры кнопки увеличим таким образом, чтобы данный заголовок был полностью виден. Шрифт заголовка сделаем полужирным и равным 12 пунктам. Аналогичные настройки шрифта мы произведем и для расположенной правее кнопки Button2. Заголовок же ЭТОЙ КНОПКИ будет СОСТОЯТЬ ИЗ ОДНОГО СЛОВа: Сброс.
В правой части окна поместим юмористическую иллюстрацию, которая изображает раздумья мультипликационного персонажа, ищущего решение поставленной перед ним задачи. Для размещения иллюстрации мы используем, как обычно, объект Panel 1. на котором будет помещен объект iwagel, т. е. сама иллюстрация. Картинку мы возьмем из коллекции рисунков, входящих в состав пакета Microsoft Office 97. К данной коллекции мы уже неоднократно обращались за сюжетами для иллюстраций: Искомая иллюстрация находится, как читатель уже знает, по адресу Program Files\Clipart\Popular. Сам же файл с данной иллюстрацией называется Amconfus и имеет расширение wmf. Иллю-
страция, содержащаяся в таком файле, хорошо поддается масштабированию, поэтому не требуется производить особо тщательную взаимную подгонку размеров панели и соответствующей ей иллюстрации.
Последним объектом, который осталось разместить на основной форме проекта, является главное меню программы. Этот новый для пас объект имеет более сложную структуру, нежели уже известные нам объекты. Меню может включать в свой состав ряд разделов, каждый из которых в свою очередь может состоять из одного или нескольких пунктов. Каждый из разделов и пунктов меню является особым объектом интерфейса, входящим в состав другого объекта ——самого меню.
Если вы посмотрите на список объектов, входящих в состав проекта (он находится в окне Object Tree View), то увидите, что рядом с некоторыми объектами находится значок в виде плюса. Такой значок говорит о том, что данный объект является составным, и этот значок можно увидеть, в частности, рядом с объектом MainMenui (главное меню). Если щелкнуть по значку "плюс", то можно увидеть список объектов, содержащихся в составном объекте. При этом значок "плюс" изменяется на "минус". Если щелкнуть на значке ”мн- нус", то составной объект снова свернется, и "минус" сменится на "плюс". Объекты, входящие в составной объект, сами в свою очередь тоже могут быть составными. На рис. 15.3 показан пример того, как может выглядеть список объектов проекта, где некоторые объекты являются составными.
Рис. 15.3. Список объектов проекта, содержащий составные объекты Ma inMenu 1 и Panel 1(составной объект Ma inMenu 1 представлен в развернутом виде)
Порядок создания главного меню программы следующий: вначале на панели компонентов на вкладке Standard нужно найти компонент MainMenu. который выглядит таким образом: В Выделив данный компонент, щелкаем мышью в верхней части формы, в результате чего такой же значок появляется на форме, т. е. мы получаем заготовку для создания будущего меню. Для заполнения меню разделами и пунктами необходимо дважды щелкнуть значок В (расположенный в форме), в результате чего на экране компьютера появляется диалоговое окно Forml.MainMenul (рис. 15.4). Это диалоговое окно используется для создания разделов и пунктов будущего меню.
Рис. 15.4. Диалоговое окно создания главного меню: а) диалоговое окно сразу ” после его открытия; 6) окно по окончании разработки меню
Для того чтобы создать первый раздел меню, достаточно щелкнуть в окне инспектора объектов справа от свойства caption, затем ввести название раздела (например, слово Файл) и подтвердить ввод нажатием клавиши <Enter>.
Если теперь вы посмотрите на содержимое диалогового окна ForniLMainMenul, то увидите, что в нем тоже появился пункт с именем Файл. Если же посмотреть теперь список объектов, то можно убедиться в том, что в проекте появился новый объект с именем ni. Это и есть созданный нами раздел меню.
Справа от раздела Файл появилась заготовка для создания следующего раздела меню. Выделяем эту заготовку, затем снова щелкаем свойство Caption, вводим название нового раздела (на этот раз название раздела——Справка) и получаем еще один раздел меню с именем N2. Теперь необходимо дополнить существующие разделы соответствующими пунктами.
Для того чтобы добавить пункт в раздел Файл, нужно выделить этот раздел и затем щелкнуть мышью заготовку, расположенную снизу от слова Файл. Затем снова щелкаем то же свойство caption, вводим имя раздела выход и получаем в проекте еще один объект с именем N3. Как видно, нумерация объектов продолжается в порядке их создания. Это связано с тем, что система программирования воспринимает и разделы меню, и содержащиеся в разделах пункты как объекты одного класса. Аналогичным образом в разделе меню Справка создаем пункт Об авторах. Этот пункт становится объектом по имени N4. Закрываем диалоговое окно FormLMainMenul, и на этом создание графического интерфейса основной формы программы •'квадратное урав- ненме” завершается. Создание вспомогательной формы, содержащей сведения об авторах проекта, производится аналогично тому, как мы это делали в предыдущих проектах. Получившийся в результате нашей работы графический интерфейс основной формы изображен на рис. 15.5.
Рис. 15.5. Графический интерфейс программы решения квадратного уравнения
Написание кода для этой программы мы начинаем с описания реакции на нажатие экранной кнопки Найти решение (кнопка Buttoni). Эта реакция записывается в процедуре TForml.ButtonlClick. Работу над процедурой начнем с того, что опишем используемые в ней переменные. Для решения поставленной задачи будут необходимы переменные для коэффициентов а, ь и с, для дискриминанта d н для хранения полученных корней уравнения xl и х2. Исходные данные и результаты могут быть вещественными величинами, поэтому дпя их описания используем тип real:
var a,b,c,d,xl,x2:real;
Далее в основной часта проиедурн необходимо произвести преобразование вводимых в текстовые окна исходных данных — строковых величин в соответствующие им числовые величины вещественного типа. Это преобразование осуществляется с помощью знакомой нам стандартной функции StrtoFloat:
a^StrtoFloat (Edit 1 .Text);
b^StrtcFloat (Edit2.Text); c:=StrtoFloat(Edit3.Text);
Следующим шагом в решении задачи является вычисление дискриминанта с помощью полученных в результате преобразования вещественных величин:
d: =sqr (b) -4*а*с;
Дальнейший ход решения задачи зависит от вычисленного значения дискриминанта. Если дискриминант неотрицателен, то необходимо произвести следующие действия:
Вычислить по известным формулам корни уравнения.
Сделать видимыми текстовые окна Edit4 и Edits, в которых будут выведены вычисленные корни.
Преобразовать полученные вещественные корни с помощью стандартной функции Fioattostr в текстовые величины, годные для вывода в текстовых окнах.
Вывести надпись, поясняющую полученные результаты, предварительно сделав ее видимой.
Вся перечисленная последовательность действий может быть реализована в программе с помощью следующих операторов:
xl: = (-b-sqrt (d)) / (2*а); x2:=(-b+sqrt(d))/(2*а); Edit4.Text:= FloattoStr (xl); Edit4.Visible:=True;
Edit5.Text:=FloattoStr(х2);
Edit5.Visible:=True;
Labels.Vis ible:=True;
Label4.Capt ion: = * Кории уравнения*
В том случае если найденный дискриминант отрицателен, требуемые действия сводятся к тому, чтобы:
Вывести на экран надпись, говорящую об отсутствии решения уравнения, сделав надпись перед этим видимой.
Сделать невидимыми текстовые окна для вывода результатов, т. к. в этом случае необходимость в них отсутствует.
Перечисленные действия реализуются с помощью операторов:
Label4.Visible:=True;
Labe14.Caption:=*Уравнение не имеет решения*;
Edit4.Visible:=False;
Edit5.Visible:=False
В целом условный оператор будет выглядеть следующим образом:
if d>=0 then
begin xl: = (-b-sqrt (d)) / (2*a);
x2: = (-b+sqrt (d)) / (2*a);
Edit4.Text:^FloattoStr(xl);
Edit4•Visible:=True;
Edit5.Text:«FloattoStr(x2);
Edit5.Visible:=True;
Labe14.Visible:=True;
Labe14.Caption: = *Корни уравнения * end else
begin
LabeL4 .Vis ible: ^rue;
Labe14.Caption:= * Уравнение не имеет решенияf;
Edit4.Visible:=False;
Edit5•Visible:=Fa1se end
Вся же разобранная ранее процедура в целом будет выглядеть так:
procedure TForml.ButtonlClick(Sender: TObject);
var a,b,c,d,xlf x2:real;
begin a:-StrtoFloat(Editl.Text); b:=StrtoFJoat(Edit2.Text); c:^StrtoFloat(Edi13.Text);
d:=sqr(b)-4*a*c; if d>=0
then
begin
xl :^ (-b-sqrt (d)) / (2*a);
x2:-(-b+sqrt (d)) / (2*a);
Eclit4 .Text:-FloattoStr (xl);
Edit4.Visible:=True;
Edir5.Text:=FloattoStr(x2);
Edit5.Visible:=True;
Labe14.Visible:^True;
Labe14.Caption: = * Корни уравнения * end else
begin
Labels.Visible:=True;
Labels.Caption:=*Уравнение не имеет решения';
Edit4.Visible:=False;
Edit5.Visible:=False end end;
Следующая процедура, которую мы рассматриваем, описывает реакцию на нажатие экранной кнопки Сброс (кнопка Button?). Эта процедура называется TFoj-ml .Button2ciick и в ней должны выполняться следующие действия:
ОчисI ка текстовых окон, в которые вводятся исходные данные.
Превращение окон с результатами и поясняющей надписи в невидимые окна.
Первая операция осуществляется путем присвоения свойству Text каждого из окон пустой строки, которая записывается в виде пары апострофов. Вторая операция производится путем присвоения свойству visible каждого из указанных объекгов значения False. В нтоге процедура будет выглядеть следующим образом:
procedure TForml.Button2Click(Sender: TObject); begin
EdiLl.TexE:二,,;
Edit2.Text:='*;
Edit3.Text:-* *;
Edit4.Visible:=False;
Edit5.Visible:^False;
Labe14.Visible:=False end;
Для того чтобы завершить работу над основной формой проекта, осталось запрогра^tмировать пункты меню. Написание кода для пунктов меню производится таким〉ке образом, как и для прочих объектов, т. е. вначале мы выделяем объект (например, пункт меню из. с помощью которого программа закрывается), затем выбираем вкладку Events (События) в инспекторе объектов и на вкладке находим событие OnClick. Дважды щелкнув мышью в поле справа от названия события, мы автоматически открываем соответствующую процедуру, которая для пункта N3 будет называться TFcrml.N3Click. Для закрытия программы в процедуру нужно всгавить единственную команду close, а процедура целиком будет выглядети так:
procedure TForml.N3Click(Sender: TObject);
begin close end;
Пункт меню, представленный объектом N4. должен вызывать дополнительное окно со сведениями об авторах. Данное вспомогательное окно должно содержать сведения об авторе и кнопку, которая его закрывает. Дия включения окна в состав проекта нужно его создать, а затем дополнить его необходимыми элементами интерфейса. Эта задача не вызовет у читателя никаких сложностей, потому что она выполняется точно так же, как н в предыдущих проектах. Не должно вызвать проблем и написание соответствующей подпрограммы. Подпрограмма, описывающая реакцию на выбор пункта меню Об авторах, называется TForml.N4Click и должна выглядеть следующим образом:
procedure TForml.N4Click(Sender: TObject); begin
Form2.Show end;
В целом программный модуль Uniti для основной формы проекта имеет следующий вид ——листинг 15.2.
! Листинг 15.2. Текст программы "Квадратное уравнение" (первый модуль)
unit Unitl;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ScdCtrls, ExtCtrls, Menus;
type
TFonnl = class (TForm)
Label1: TLabel;
Editi: TEdit;
Labe 12: 7'Label;
Label3: TLabel;
Edit2: TEdit;
Edit3: TEdit; Paneil: TPanel;
Image1: TImage;
Butconl: TButton; Label4: TLabel; Edit4: TEdit;
Edit5: TEdit;
Button?: TButton;
MainMenu1: TMainMenu;
Nl: TMenuItem;
N2: TMenuItein;
N3: TMenuItem;
N4: TMenuItem;
procedure procedure procedure procedure private{ Privateprocedure procedure procedure procedure private{ PrivateButtonlClick(Sender: TObject);
procedure procedure procedure procedure private
{ Private
procedure procedure procedure procedure private
{ Private
N3Click(Sender: TObject);
Button2Click(Sender: TObject);
declarations )declarations )N4Click(Sender: TObject);
declarations )
declarations )
public
{ Public declarations )
end;
var
Forml: TForml;
implementation
uses Unit2;
[$R *.dfm)
procedure TForml.ButtonlClick(Sender: TObject);
var a,b,crd,xl,x2:real;
begin
a:^StrtoFloat(Editi.Text);
b:=StrtoFloat(Edit2.Text);
c:=StrtoFloat(Edit3.Text);
d:=sqr(b)-4*a*c;
if d>=0 then
begin
xl:= (-b-sqrt (d)) / (2*a);
x2:= (-b+sqrt (d)) / (2*a);
Edit4.Text:=FloattoStr(xl);
Edit4.Visible:=True;
Edit5.Text:=FloattoStr(x2);
Edit5-Visible:=True;
Labe14.Visible:=True;
Labe14.Capt ion: =1Корни уравнения1 end else
begin
Labe14.Visible:=True;
Label4.Caption: = * Уравнение не имеет решения *;
Edit4.Visible:=False;
Edit5・ Visible:=False end
end;
procedure TForml.Button2Click(Sender: TObject); begin
Editl.Text: = *r;
Edit2.Text:=*•;
Edit3.Text:=,1;
Edit4.Visible:=False;
Edit5.Visible:=False;
Label4.Visible:=False end;
procedure TForml.N3Click(Sender: TObject); begin close
end;
procedure TForml.N4Click(Sender: TObject); begin
Form2.Show end;
end.
Рис. 156 Пример работы программы решения квадратного уравнения при положительном значении дискриминанта
Рис. 15.7. Пример работы программы решения квадратного уравнения при отрицательном значении дискриминанта
Для полного завершения работы над проектом осталось написать программ-ный код для модуля Unit2, который описывает реакцию объектов, входящихв состав второй, вспомогательной формы. Этот код аналогичен соответст-вуютему коду из предыдущих проектов, написание его также не вызовет
у читателя затруднений. После написания кода для вспомогательной(|)ормы работа над проектом завершена и его можно запускать на выполнение.
На рис. 15.6—15.7 приведены примеры, демонстрирующие, как будет выглядеть основное окно программы при различных исходных данных, дающих различные значения дискриминанта. На рис. 15.6 приведсн пример для положительного дискриминанта, на рис. 15.7—— для отрицательного дискриминанта.
Программа "Калькулятор"
Темой следующего проекта, который мы будем разрабатывать в Delphi, станет создание виртуального калькулятора, который будет производить основные арифметические операции (сложение, вычитание, умножение и деление) над двумя целыми числами. Кроме того, данный калькулятор должен иметь возможность выполнения двух дополнительных операций. Это нахождение квадрата числа и извлечение квадратного корня из числа.
Подобную задачу мы уже выполняли в Turbo Pascal. В программе, написанной в Turbo Pascal, для выбора одного из возможных вариантов использовался оператор множествеиного выбора case. В этой программе ввод и вывод данных производился в текстовом виде, а система Delphi обеспечивает графический интерфейс для ввода и вывода данных в виде спеинальных текстовых окон. Это позволяет выбрать необходимый вариант вычислений без использования ветвлений, что существенно облегчит написание и отладку программного кода. Однако полностью избежать использования условных операторов в данной программе не удастся. Эги операторы будут использоваться, во-первых, для защиты программы oi неправильного ввода данных, а во-вторых, для другой цели, о которой мы расскажем в этой главе позднее.
Графический интерфейс программы мКалькулятор" включает в себя следующие основные элементы:
口 два текстовых окна для ввода исходных данных ——двух операндов;
текстовое окно для вывода полученного результата;
П поясняющие надписи к текстовым окнам:
четыре экранные кнопки для выполнения основных арифмегичсских действий;
две экранные кнопки для выполнения дополнительных действий — возведения числа в квадрат и извлечения квадратного корня:
口 надписи, которые сообщают пользователю о сделанной им ошибке в том случае, если он неправильно ввел исходные данные (например, попытался разделить число на нуль);
О экранная кнопка Сброс, которая используется для очистки всех текстовых окон (как с исходными данными, так и окна результата);
экранная кнопка Выход, которая закрывает форму и вместе с ней сам проект.
Кроме перечисленных ранее основных элементов в форме могут присутствовать и некоторые дополнительные, к которым относятся:
иллюстрация, изображающая калькулятор и записную книжку;
口 флажок, установка которого позволяет получать результат вычислений в округленном виде (о том, что такое элемент управления пфлажок'\ для чего он нужен и как с ним работать, мы расскажем далее).
Работу над проектом мы начнем с самой формы. В заголовке формы (свойство Caption объекта Forml) мы вводим ее название— Калькулятор. Затем изменяем цвет формы на бледно-зеленый. После этого мы приступаем к выводу на форму элементов графического интерфейса. Вначале мы выводим на форму три текстовых окна. В окнах Editl и Edit2 будут вводиться исходные данные для вычислений, а в окне Edit3 будет виден результат вычислений. Рядом с каждым из упомянутых текстовых окон имеется поясняющая надпись. Эти объекты в нашей программе будут называться Labeli, Labe 12 и Label 3.
Затем мы создаем в программе ряд экранных кнопок. Кнопка Buttoni будет использоваться для выполнения операции сложения, Button2 — для вычитания чисел. Buttons — для умножения, Button4 — для деления. Buttons — для извлечения квадратного корня из числа, Button6— для возведения числа в квадрат. Для выхода из программы используется кнопка Button?, для сброса данных, т. е. для счистки всех текстовых окон ——кнопка Buttons.
Справа от текстовых окон мы поместим дополнительные надписи с сообщениями об ошибках. Справа от окна Editl расположим надписи Label4 и Labels. По умолчанию эти надписи мы сделаем невидимыми (для свойства visible мы установим значение False). В случае же, если пользователь совершил недопустимое действие (ввел в окно отрицательное число, а затем нажал кнопку Buttons для извлечения квадратного корня), эти надписи должны стать видимыми. Тогда пользователь увидит на форме сообщение следующего содержания: ^Вводимое число должно быть неотрицательнымн.
Рядом с окном Edit2 мы поместим надпись Label6, которую также по умолчанию сделаем невидимой. В том случае, если пользователь ввел какое-либо число в окно Editl, а затем ввел в окно Edit2 нуль и нажал экранную кнопку Button^ для того, чтобы произвести деление первого числа на второе, надпись Label6 станет видимой. На форме справа от окна Edit2 пользователь увидит сообщение: мДелить на нуль нельзя1'.
Еще одним элементом управления на экранной форме проекта икапькулятор,1 станет флажок checkboxi. Это новый для нас элемент. Если на форме имеется группа флажков, то в этой группе могут быть включены все флажки, может быть включена часть флажков, один флажок или вообще ни одного. Этим флажки отличаются от переключателей, в группе которых всегда должен быть включен один и только один. Флажки могут находиться на форме и по одному, как в нашем случае.
Если щелчком мыши включить флажок, то он обеспечит выполнение некоторого дополнительного действия при работе программы. В нашем проекте если флажок будет включен, то получившийся в окне Edit3 результат будет округляться до ближайшего целочисленного значения. Для того чтобы поместить флажок в форму, нужно выбрать в палитре компонентов находящийся на вкладке Standard компонент Checkbox, который выглядит следующим образом: ВО время работы программы на форме выключенный фла^кок будет отображаться в виде пустого квадратика 回,а включенный флажок будет выглядеть так:叵].
Неотъемлемой частью флажка является расположенная рядом с ним надпись. Содержание этой надписи определяется свойством caption объекта Checkbox. Сразу после создания флажка мы удалим имеющееся по умолчанию значение checkboxi и вместо него в поле справа от названия свойства введем следующий текст: Целочисленный результат. По умолчанию текст пояснительной надписи находится в элементе справа от флажка. Если же необходимо изменить взаимное расположение частей внутри объекта Checkbox, то для этого нужно использовать СВОЙСТВО Alignment объекта. Alignment — СПОСОб ВЫравнивания надписи. По умолчанию это свойство имеет значение taRightJustify, т. е. выравнивание производится по правому краю элемента. Если щелкнуть справа от Alignment раскрывающую кнопку, то из появившегося списка можно выбрать значение taLeftJustify— выравнивание по левому краю. Тогда надпись окажется слева от самого флажка, как это и сделано в нашем примере.
Еще одним, дополнительным элементом формы является иллюстрация в виде записной книжки с калькулятором. Иллюстрацию мы взяли из обучающего курса Tour98, который входит в состав операционной системы Windows 98. ДЛЯ СОЗДаНИЯ ИЛЛЮСТраЦИИ МЫ ПОМеСТИЛИ В форме фоНОВЫЙ объект Panel. Поверх него мы расположили объект image 1, т. е. саму иллюстрацию.
Однако при попытке загрузить В Image 1 иллюстрацию мы столкнулись со следующей проблемой. Указанная иллюстрация, которая называется Chckbook, была создана в графическом формате GIF, который система Delphi не понимает. Поэтому для того, чтобы все-таки вое пол ьзоваться рисунком, пришлось прибегнуть к следующему приему. Мы скопировали в буфер обмена рисунок Chckbook, запустили графический редактор Paint, являющийся стандартным
приложением Windows, и в документ Paint вставили эту копию. Затем мы сохранили документ в стандартном для программы Paint формате BMP. В папке проекта появился новый графический файл, которому мы дали название Калькулятор. Таким образом, мы сохранили иллюстрацию в том формате, который понимает система Delphi.
После этого появилась возможность загрузить данную картинку в объект imagel, используя свойство picture этого объекта. Поскольку картинка была преобразована в растровый формат, который плохо поддается масштабированию. возникла необходимость в подгонке размеров Рапе 11 и imagei под размеры картинки. Как это можно сделать, мы уже описывали ранее. На этом создание графического интерфейса программы было завершено (рис. 15.8).
Рис. 15.8. Графический интерфейс программы "Калькулятор'
Написание программного кода мы начнем с программирования действий для кнопки Buttoni, производящей сложение чисел, которые пользователь вводит в текстовые окна Editl н Edit2. Как это уже делалось в предыдущих проектах, мы преобразуем исходные строковые величины Editl.Text и Edit2.Text в вещественные переменные а и ь. Затем мы складываем значения этих переменных, и полученный текстовый результат присваиваем текстовой переменной с. Указанные действия выполняет следующий фрагмент программы:
a:^StrtoFloat(Editl.Text);
b:=StrtoFloat(Edit2.Text);
c:=a+b;
Если бы в проекте не предусматривалась возможность округления полученного результата, то далее можно было бы ограничиться обратным преобразованием с в строковую величину Edit3.Text, которая будет выводиться в окне результата. Но в данном случае перед выполнением такого преобразования следует проверить, в каком состоянии находится флажок "целочисленный результат*', т. е. проверить свойства объекта checkboxl. Данный объект имеет свойство Checked. Если флажок включен, то свойство Checked имеет значение True, а если флажок выключен, то значение False. Проверку состояния флажка можно вславить в условный оператор if в качестве условия. Если флажок включен, то будет выполняться та ветвь условного оператора, которая находится после служебного слова then, а если он выключен ——та часть, которая расположена после слова else.
В ветви оператора, находящейся после then, мы выполним следующие действия. Во-первых, мы преобразуем получившийся действительный результат с в целочисленный ок工 с помощью стандартной функции round, которая округляет вещественную величину до ближайшей целой, преобразуя ее при этом к целому типу. Во-вторых, получившуюся целочисленную величину okr мы с помощью функции inttostr преобразуем в строковое значение объекта Edit3. Указанные действия мы выполним с помощью следующих операторов:
okr:round (с);
Edit3.Text:«InttoStr(okr)
В той части условного оператора, которая находится после слова else, выполняется преобразование результата с в Edit3.Text с помощью функции FloattoStr:
Edit3-Text:=FloattoStr(с)
В целом же подпрограмма, описывающая действия, которые происходят при нажатии на кнопку Сложить, выглядит следующим образом:
procedure TForml.ButtonlClick(Sender: TObject); var a,b,c:real; okr:integer;
begin
a:^StrtoFloat(Editl.Text);
b:=StrtoFloat(Edit2.Text);
c:=a+b;
if Checkboxl.Checked then begin okr :=round{c); Edit3.Text:=InttoStr(okr) end
else Edit3.Text:®FloattoStr(c) end;
Аналогичным образом составляются подпрограммы, которые описывают действие кнопок Вычесть(Button2)и Умножить(Button4). При составлении же подпрограммы для кнопки Разделить (Button^) необходимо учесть еще один момент. Дело в том, что как уже говорилось ранее, в программе необходимо предусмотреть защиту от неправильного ввода данных. Это может произойти в том случае, если пользователь попытается разделить какое-либо число на нуль путем ввода нулевого значения в текстовое окно Edit2. Следовательно, перед выполнением дальнейших вычислений при нажатии кнопки Button4 нужно проверить, чему равно значение в текстовом окне Edit2.
Поэтому после преобразования текстовой величины Edit2.Text в вещественную величину ь в тексте подпрограммы должен находиться условный оператор. В заголовке этого условного оператора переменная ь проверяется на неравенство нулю. В случае если это неравенство ложно, выполняется та ветвь оператора, которая находится после else. В этой ветви делается видимой надпись Labe 16, которая сообщает пользователю об ошибке, допущенной им при вводе исходных данных. Если же неравенство выполняется, то после служебного слова then записывается та же последовательность действий, что и для кнопок Сложить, Вычесть и Умножить. Напомним, что указанная последовательность действий также включает в себя условна前 оператор. Таким образом, данная подпрограмма имеет более сложную структуру, чем предшествующие ей. Эта структура включает в себя условный оператор, вложенный в другой условный оператор. В целом подпрограмма, описывающая работу кнопки Разделить, выглядит следующим образом:
procedure TForml.ButtonlClick(Sender: TObject); var a,brc:real; okr:integer;
begin
a:^StrtoFloat(Edit1-Text); b:=StrtoFloat(Edit2.Text); if b<>0 then begin c:=a/b; if Checkboxl.Checked then begin okr:=round(c);
Edit3.Text:=InttoStr(okr) end
else Edit3.Text:=FloattoStr(c) end
else
begin
Label6.Visible:=True;
Edit3.Text: = * * end end;
Подпрограмма, которая описывает действия, производимые в результате щелчка на кнопке Извлечь квадратный корень (Buttons), также должна включать в себя защиту от неправильного ввода исходных данных, которая может заключаться во вводе отрицательного значения в окно Editl. В начале подпрограммы значение, введенное в текстовое окно Editl, преобразуется в вещественную величину а, а второе текстовое окно очищается. Это делается ввиду того, что данная операция является унарной, т. е. выполняется только над одним числом. Данные действия описываются следующими операторами:
a:=StrtoFloat(Editl.Text);
Edit2.Text: = * *;
Затем в подпрограмме должен быть предусмотрен условный оператор, который проверяет вещественную переменную а на неотрицательность. Если а больше нуля или равна нулю, то выполняются операторы, находящиеся после слова then, т. е. вычисляется квадратный корень с, который преобразуется затем в строковую величину Edit3.Text. Если же условие оказывается ложным (а меньше нуля), ТО становятся ВИДИМЫМИ надписи Label4 И Labels, которые сообщают об ошибке ввода. В целом данная подпрограмма выглядит так:
procedure TForml.Butron5Click(Sender: TObject); var azc:real; okr:integer; begin
a^StrtoFloat (Editl.Text);
Edit2.Text: = * *;
if a>=0 then
begin
c:=sqrt(a);
if Checkboxl.Checked then
begin
okr:= round (c);
Edit3.Text:=InttoStr(okr)
end
else Edit3.Text:=FloattoStr(с) end else
begin
Edit3.Text:=**;
Labe14.Visible:=True;
Label5.Visible:=True end end;
Подпрограмма, которая описывает реакцию на нажатие кнопки Возвести в квадрат(Button6), по своей структуре сходна с предыдущей подпрограммой, но проще ее, т. к. в данной подпрограмме не предусматривается защита от неправильного ввода данных. Текст подпрограммы для экранной кнопки Button6 следующий:
procedure TForml.Button6Click(Sender: TObject); var azc:real; okr:integer;
begin
a:=StrtoFloat(Editl.Text);
Edit2.Text:=*';
c:=sqr(a);
if Checkboxl.Checked then
begin
okr:«round(c);
Edit3.Text:^InttoStr(okr) end
else Edit3.Text:=FloattoStr(c) end;
Кнопка Выход (Button?) закрывает форму, а кнопка Сброс (Buttons) очищает все текстовые окна, имеющиеся в форме, и делает невидимыми все надписи с сообщениями об ошибках, которые могут выводиться на форме. Программирование этих кнопок никакой сложности не представляет. В листинге 15.3 приводится полный текст программного модуля для проекта "калькулятор".
,Листинг 15.3. Текст программы ^Калькулятор'*?
unit Unitl;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls;
type
TForml = class(TForm)
Label1: TLabel;
Labe12: TLabe1;
Editl: TEdit;
Edit2: TEdit;
ButConi: TButton; Button2: TButton; Button3: TButton; Button^: TButton; Buttons: TButton; Button6: TButton; Button?: TButton;
Panel1: TPanel;
Button8: TButton;
Image1: TImage;
Label3: TLabel;
Edit3: TEdit;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
CheckBoxl: TCheckBox;
procedure procedure procedure procedure procedure procedure procedure procedureprivate(Privateprocedure procedure procedure procedure procedure procedure procedure procedureprivate(Privatedeclarations }declarations }ButtonlClick(Sender: TObject); Button2clicк(Sender: TObject); Button3Click(Sender: TObject); Button4Click(Sender: TObject); Button5Click《Sender: TObject); ButtonCClick(Sender: TObject); Button7Click(Sender: TObject); Button8Click(Sender: TObject);
procedure procedure procedure procedure procedure procedure procedure procedure
private
(Private
procedure procedure procedure procedure procedure procedure procedure procedure
private
(Private
declarations }
declarations }
public
{ Public declarations } end;
var
Forml: TForml;
implementation
{$R *.dfm}
procedure TForml.ButtonlClick(Sender: TObject); var afbrc:real; okr:integer;
begin
a:=StrtoFloat(Editl.Text);
b:=St rtoFloat(Edi12.Text); c:=a+b;
if Checkboxl.Checked then
begin
okr:«round(c);
Edit3.Text:=InttoStr(okr) end
elseEdit3.Text:=FloattoStr(c)
end;
procedure TForml.Button2Click(Sender: TObject); var a,bfc:real; okr:integer;
begin
a:=StrtoFloat(Editl.Text);
b:=StrtoFloat{Edit2.Text);
c:=a-b;
if Checkboxl.Checked then
begin
okr:=round(c);
Edit3.Text:=InttoStr(okr) end
else Edit3.Text:=FloattoStr(c) end;
procedure TForml.Button3Click(Sender: TObject); var a,b,c:real; okr:integer;
begin
a:=StrtoFloat(Editl.Text);
b:=StrtoFloat(Edit2.Text);
c:=a*b;
if Checkboxl.Checked then
begin
okr:=round(c);
Edit3.Text:=InttoStr(okr) end
else Edit3.Text:=FloattoStr(c) end;
procedure TForml.Button4Click(Sender: TObject); var a,bzc:real; okr:integer;
begin
a:=StrtoFloat(Editl.Text);
b:=StrtoFloat(Edit2.Text); if b<>0 then
begin c:=a/b;
if Checkbaxl.Checked
then
begin
okr:=round(c);
Edit3.Text:=InttoStr(okr^ end
else Edit3.Text:=FlcattoStr(c) end
else
begin
Label6.Visible:-True;
Edit3.Text:=*'
end
end;
procedure TForml.Button5Click(Sender: TObject); var a,c:real; okr:integer;
begin
a:=StrtoFloat(Editl.Text);
Edit2.Text:='';
if a>=0 then
begin
c:=sqrt (a);
if Checkbox1.Checked
then
begin okr:=round(c);
Edit3.Text:=InttoStr(okr) end
else Edit3.Text:=FloattoStr(c) end
else
begin
Edit3.Text:=,1;
Labe14.Visible:=True;
Label5.Visible:=True end
end;
procedure ТFormi.Button6Click(Sender: TObject);
var a,c:real; okr:integer;
begin
a:=StrtoFloat(Editi.Text);
Edit2.Text: = * *;
c:=sqr(a);
if Checkboxl.Checked
then
begin
okr:=round(c);
Edit3.Text:=InttoStr(okr)
end
else Edi13.Text:=FloattoStr(c) end;
procedure TForml.Button7Click(Sender: TObject);
begin close end;
procedure TForml.Button8Click(Sender: TObject); begin
Editl.Text:=,';
Edit2.Text: = * *;
Edit3.Text: = * *;
Label4.Visible:=False;
Labels.Visible:=False;
Label6.Visible:=FaIse end;
end.
На рис. 15.9 показан пример работы программы "Калькулятор" прм правильном вводе исходных данных, а на рис. 15.10 показано, как реагирует данная программа на попытку неправильного ввода исходных данных (в этом случае была предпринята попытка деления числа на нуль). На рис. I5.l I приведен пример работы программы с округлением полученного результата.
Усовершенствованная программа "Светофор"
Как и в Turbo Pascal, в языке Object Pascal наряду с условным оператором if.. .then.. .else для организации ветвлений в программе используется также оператор множественного выбора case. Рассмотрим возможности приме-
нения этого оператора на примере программы "Светофор". Эта программа уже предлагалась пользователю в главе 13 для самостоятельной разработки. При этом предполагалось, что светофор будет управляться пользователем программы вручную, т. е. лампочки светофора будут включаться щелчком на соответствующем переключателе.
Рис. 15.9. Пример работы программы ,,Калькулятор,* при правильном вводе исходных данных без округления результата
Рис. 15.10. Пример работы программы "Калькулятори при неправильном вводе исходных данных
Рис. 15.11. Пример работы программы "Калькулятор" при правильном вводе исходных данных с округлением полученного результата
Как читатель, конечно, знает, светофоры, которые реально используются для регулировки уличного движения, обычно работают в автоматическом режиме. Поэтому естественно, что следующим шагом в усовершенствовании данной программы станет создание возможности автоматического переключения лампочек светофора. Для этого понадобится несколько изменить графический интерфейс программы.
Такой элемент интерфейса, как группа переключателей при отсутствии ручного режима, не нужен, поэтому в новом варианте проекта данный элемент управления можно удалить. Вместо него в форме появятся два новых элемента. Во-первых, в форме создается еще одна дополнительная панель Рапе12, на которой будет помещаться иллюстрация image 1. Эта иллюстрация будет наглядно показывать, в каком режиме работает светофор в данный момент времени. В то время, когда будет гореть красный сигнал светофора, помимо красной лампочки пользователь будет видеть на экране изображение красной автомашины, говорящее о том, что пешеходы должны остановиться и пропустить движущийся транспорт. Изображение автомашины для проекта можно взять, например, из галереи Clipart программного пакета Office 97, где имеется изображение car.wmf. Копию этого рисунка мы поместим в папку нашего проекта. Рисунок car.wmf мы и возьмем в качестве свойства Picture объекта imagei. В дальнейшем при выключении красной лампочки и включении желтой или зеленой мы будем менять изображение программным путем.
Вторым новым элементом управления в экранной форме станет таймер. Таймер относится к невизуальным компонентам, т. е. он не будет виден в экранной форме во время работы программы, а увидеть его можно только во время проектирования. Тем не менее этот невидимый компонент может оказывать существенное влияние на ход работы программы. Для того чтобы поместить таймер на форму, нужно щелкнуть на палитре компонентов вкладку System, а на ней найти значок таймера, который выглядит следующим образом: Затем щелчком в основной форме мы можем поместить таймер в любом ее свободном месте. Таким образом, у нас в форме появляется объект по имени Timer 1.
Подобно другим объектам, таймер имеет собственные свойства и события. Единственным событием для него является событие onTimer, т. е, посылка таймером сигнала, на который могут реагировать другие объекты. У таймера имеется несколько свойств, важнейшим из которых является interval — интервал, с которым таймер посылает эти сигналы. Этот интервал измеряется в миллисекундах, т. е. тысячных долях секунды. В нашем проекте по сигналу таймера будет происходить переключение лампочек светофора. Установим значение свойства interval равным 3000 для того, чтобы переключение лампочек происходило каждые 3 секунды.
Остальные элементы интерфейса в данном проекте остаются такими, как и в его начальной версии. Это панель Panel 1, на которой размещаются три объекта класса shape. Объект shape 1 соответствует красной лампочке светофора, Shape2 ——желтой лампочке, a shape3 — зеленой. В форме также сохраняется кнопка Buttonl, щелчок на которой закрывает программу. Остается в форме и надпись Labell, НО содержание ее станет ИНЫМ: Переключение сигналов светофора производится автоматически. На этом работу над графическим интерфейсом проекта можно считать завершенной. Графический интерфейс данного проекта приведен на рис. 15.12.
Написание программного кода мы начнем с описания того момента, когда программная форма будет создана и выведена на экран компьютера. Этому моменту для формы соответствует событие OnCreate. При создании формы должны происходить также следующие события: должна включаться красная лампочка светофора, в форме должно появляться изображение автомашины, причем для того, чтобы это изображение не искажалось, желательно, чтобы размеры объектов image 1 и Рапе12 подгонялись под размеры самого изображения. Поэтому для процедуры F。口nCreate мы запнсь1вае^1 следующие опера^ торы:
Shapel.Brush.Color:=clRed;
Panel2.Height:=64;
Image1.Height:=60;
Panel/ .Width: =233;
Image1.Width:=229
Напомним читателю, что для объекта shape существует составное свойство Brush, которое определяет и цвет самого объекта, и стиль его заполнения. Цвет объекта определяется с помощью подсвойства Brush.Color, которому мы и сообщаем значение ciRed (красный цвет).
,Светофор■回 В ;
Рис. 15.12. Графический интерфейс программы "Светофор'* после ее усовершенствования
Дальнейшие действия по написанию программного кода связаны с объектом ThnerL Два раза щелкнув его мышью, мы создаем процедуру TimeriTlmer, для которой и будем писать код. Для того чтобы каждый раз по истечении заданного промежутка времени происходило переключение лампочек и изменение внешнего вида иллюстрации, мы поступим следующим образом: в начале процедуры мы поместим группу из трех условных операторов if. По прошествии каждых 3 секунд происходит очередное срабатывание таймера. При посылке очередного сигнала таймера мы программным образом задаем проверку состояния всех трех лампочек светофора, которая осуществляется с помощью следующих операторов:
if Shape1.Brush.Color=clRed then n:=l;
if Shape2.Brush.Color=clYellow then ri: =2;
if Shape3.Brush.Color=clLime
then n:=3;
В зависимости от того, какая из лампочек включена (такая лампочка имеет активный красный, желтый или зеленый цвет в отличие от двух других лампочек, окрашенных в серый), программа присваивает некоторое значение вспомогательной переменной п.
Далее в процедуре находится оператор м ножественного выбора, в котором роль переменной-селектора играет упомянутая ранее п. Если текущий цвет был красным, то 口 присваивается значение, равное единице. Этому значению п соответствует следующий вариант, описанный в операторе сазе:
Ima gel. Picture. LoadFromFile (* Stop. wmf *);
Imagel.Height:=178;
Panel2.Height:=182;
Imagel.Width:=107;
Panel2•Width:=111;
Shapel.Brush.Color:=clSilver;
Shape2.Brush.Color:=clYellow;
Поясним, какие действия производит эта группа операторов. Вначале для иллюстрации image 1 мы загружаем новую картинку Stop.wmg взятую из той же электронной галереи, что и предыдущая картинка. Предварительно мы копируем картинку в папку нашего проекта. Эта картинка с изображением дорожного сигнала Stop должна соответствовать желтому сигналу светофора. Для загрузки картинки мы используем метод LoadFromFile (загрузка из файла). Обратите внимание, что имя метода должно находиться справа от того свойства, которое изменяется с помощью этого метода и должно быть отделено от него точкой. Затем мы меняем габариты объектов Panel 1 и image 1 таким образом, чтобы не искажалось загружаемое из файла изображение. Далее мы закрашиваем стандартным серебристо-серым цветом объект shape 1 (красную лампочку), а объект Shape2 (центральная лампочка) делаем ярко-желтого цвета.
Аналогичную группу операторов можно написать и в том случае, если текущий цвет светофора был зеленым, а п равно 3. Здесь будет появляться тот же рисунок, и объект shape2 также будет приобретать желтый цвет, в то время как сама зеленая лампочка (объект shapes) будет закрашиваться серебристосерым цветом.
Более сложной становится ситуация в том случае, если во время получения сигнала таймера горит лампочка желтого цвета. В этом случае дальнейший переход может производиться как к зеленому цвету (в том случае, если до этого горел красный), так и к красному цвету, если перед желтым цветом был включен зеленый. Для того чтобы избавиться от такого рода неопределенности, мы введем в программе еще одну вспомогательную переменную flag, с помощью которой можно определить, какой свет горел перед желтым.
Если при очередной проверке текущий цвет светофора оказывается красннм. то переменная flag получает значение, равное нулю. Если же текущий цвет— зеленый, то переменной flag присваивается значение, равное единице.
Когда включается желтый свет, в программе производится проверка состояния флага. Если флаг равен нулю, то после желтого цвета должен загораться зеленый и будет загружаться соответствующий рисунок. Этот рисунок взят из коллекции Microsoft Office 2000 и называется people.wmf, причем его также необходимо предварительно записать в папку проекта. Если же при проверке флаг оказывается равным единице, то после желтого света будет гореть красный, и загружаться уже знакомый нам файл Car.wm£ В программе проверка реализована с помощью условного оператора if и данный фрагмент программы выглядит следующим образом:
if flag^l then begin Shape2.Brush.Color:=clSilver; Shapel・ Brush.Color:=clRed;
Image1.Picture.LoadFromFile(*Car.wmf*);
Pane12.Height:=64;
Image1.Height:=60;
Panel2.Width:=233;
Imagel•Width:=22 9 end else
begin
Image 1 • Picture. LoadFromFile (* People.wmf');
Pane12.Height:=137;
Imagel.Height:=133;
Panel2.Width:=152;
Inagel.Width:^148;
Shape2.Brush•Color:=clSilver;
Shape3.Brush.CoLor:=clLi me end;
Обратите внимание, что при каждой загрузке новой картинки для объекта image 1 динамически изменяются размеры как зтого объекта, так и панели, на которой он расположен. Следует также отметить, что переменные flag и п являются в программе глобальными переменными, и поэтому их описание содержится в программе в разделе interface. В листинге 15.4 приводится полный текст усовершенствованной программы пСветоформ.
unit Unitl;
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms.
Dialogs, ExtCtrls, StdCtrls;
type
TFoml = class (TFom)
Panel1: TPanel;
Labell: TLabel;
Buttonl: TButton;
Shape1: TShape;
Shape2: TShape;
Shape3: TShape;
Timer1: TTimer;
Pane12: TPanel;
Image1: TImage;
Labe12: TLabe1;
procedure TimerlTimer(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure ButtonlClick(Sender: TObject); private
{ Private declarations }
public
{ Public declarations }
end;
var
Fonnl: TForml; n:integer; flag:integer;
implementation
[5R *.d£m}
procedure TForml.FormCreate(Sender: TObject); beg in
Shapel.Brush.Color:=clRed;
Panel2.Height:=64;
Imagel.Height:=60;
Panel2 .Width: ==233;
Image1.Width:=229
end;
procedure TForml.TimerlTimer (Sender: TObject);
begin
if Shape1.Brush.Color=clRed then n:=l;
if Shape2.Brush.Color=clYellow then n:=2;
if Shape3.Brush•Color=clLime then n:=3;
case n of
1:begin
Imagel.Picture.LoadFromFile(1Stop.wmf*);
Imagel.Height:=178;
Panel2.Height:=182;
Imagel .Width: ==107;
Panel2 .Width: =111;
Shapel.Brush.Color:=clSiIver;
Shape2.Brush.Color:^clYellow; flag:=0 end;
begin if flag=l then
begin
Shape2.Brush.Color:=clSiIver;
Shape1.Brush.Color:=clRed;
Imagel. Picture. LoadFromFile (*Car. wmf •);
Panel2.Height:=64;
Imagel.Height:=60;
Pane12.Width:=233;
Imagel.Width:=229 end else begin
Imagel. Picture. LoadFromFile (' People.wmf *};
Pane12•Height:^137;
Imagel.Height:=133;
Panel2.Width^152;
Imagel.Width:=148;
Shape2.Brush.Color:=clSiIver;
Shape3.Brush.Color:=clLime end;
end;
begin
Image 1. Picture. LoadFroinFile (*Stop.wmf *);
Image1.Height:=17 8;
Pane12.Height:=182;
Imagel .Width:=107;
Panel2.Width:=lll;
Shape3・ Brush.Color:=clSilver;
Shape2.Brush.Color:=clYellow; flag:=l end;
end;
end;
procedure TForml.ButtonlClick(Sender: TObject); begin close
end;
end.
На рис. 15.13 показано, как выглядит программа во время работы при включенном красном свете, на рис. 15.14 — при включенном желтом цвете и на рис. 15.15 в том случае, когда на форме горит зеленый свет.
・Г Светофор
Переключение сигналов светофора произволится автоматическиПереключение сигналов светофора произволится автоматически一 ■*一 ■*
Переключение сигналов светофора произволится автоматически
Переключение сигналов светофора произволится автоматически
一 ■*
一 ■*
Рис. 15.13. Программа "Светофор" во время работы. Горит красный свет
13 Зак 1068
Рис. 15Л4. Программа "Светофор** во время работы. Горит желтый свет
Рис. 15.15. Программа "Светофор" во время работы. Горит зеленый сеет
Задание для самостоятельной работы
Составить программу "Календарь", которая определяет, является ли данный год високосным. Определение производится по следующим правилам. Если порядковый номер года не делится без остатка на 100, то год считается висо-
косным, если его номер делится на 4 (например, 2004-й), и невисокосным, если его номер не делится на 4 (нанрнмер, 2005-й). Если же номер года делится без остатка на 100, то год считается високосным, если его порядковый номер делится на 400 (например, 2000-й), и невисокосным, если его порядковый номер не делится на 400 (например, 1900-й).
Указания для выполнения задания. В форме должны быть выведены одно текстовое поле для ввода исходных данных (номера года) и три экранные кнопки: для подтверждения ввода, для очистки текстового окна и для выхода из программы. Для того чтобы поместить в форму иллюстрацию, можно поступить следующим образом: двойным щелчком на системных часах. находящихся на панели задач, открыть диалоговое окно Свойства: дата и время, в котором имеется специальное вложенное окно с изображением календаря. Затем сделать копию экрана и в графическом редакторе Paint сохранить изображение календаря в виде отдельного рисунка. Далее этот рисунок поместить в объект Image.
При написании кода рекомендуется использовать структуру с вложенными условными операторами. В заголовке основного условного оператора следует поместить условие делимости исходной даты на 100. Затем в каждой из ветвей основного условного оператора необходимо предусмотреть свой алгоритм определения високосного года, который реализуется в виде вложенного условного оператора.
ГЛАВА 16
Программы с циклами в Delphi
В Object Pascal, как и в языке Turbo Pascal, для решения различных задач, в которых происходит многократное повторение одних и тех же действий, широко используются циклы. В данной главе рассматривается разработка проектов в системе Delphi с использованием циклических структур.
Программа "Факториал"
В качестве примера использования циклов в O»ect Pascal рассмотрим задачу вычисления факториала некоторого натурального числа. Алгоритм решения данной задачи читателю уже известен на примере Turbo Pascal. Как читатель, конечно, помнит, в данном случае для нахождения искомой величины удобнее всего использовать цикл с заранее известным числом повторений.
Теперь приступим к реализации данной задачи в среде Delphi. Для этого разработаем новый проект, который назовем faktor. Как всегда, работу над проектом мы начинаем с его сохранения и создания графического интерфейса программы. Интерфейс будет включать в себя следующие основные компо^ центы:
строка меню, содержащая разделы Файл и Справка;
口 текстовое окно для ввода исходных данных, слева от которого будет расположено поле комментария, поясняющее содержание данного окна;
кнопка Ввод、нажатие которой должно приводить к вычислению искомого результата;
текстовое окно с результатом, дополненное поясняющей надписью;
П экранная кнопка Сброс, используемая для очистки текстовых окон, и кнопка Выход» используемая для закрытия окна программы;
панель с рисунком юмористического содержания, изображающая человека, излучающего радость от того, что ему удалось добиться решения сложной задачи.
Начнем работу над интерфейсом с создания строки меню. Сам процесс создания меню не должен вызывать у пользователя затруднений, т. к. он был подробно описан в предыдущей главе. Отметим только, что каждый из разделов меню содержит по вложенному пункту. Для меню Файл (объект N1) таким пунктом является Выход (объект N3), а для раздела Правка (объект N2)— пункт Об авторе (объект N4). Выбор этого пункта меню приведет к появлению на экране компьютера дополнительного второго окна, содержащего информацию об авторах программы. Данное окно содержит поясняющую надпись и закрывается при нажатии экранной кнопки ОК.
Теперь приступаем к настройке основной формы программы. Присваиваем основной форме новый заголовок (Факториал) и изменяем цвет формы на светло-зеленый. Следующим компонентом основной формы является текстовое окно Editi. Слева от него расположим окно комментария Memoi. Для того чтобы данное окно не выделялось на общем фоне формы, поступаем так же, как н в предыдущем проекте. Цвет окна делаем светло-зеленым, как и у самой формы, а свойству Borderstyle присваиваем значение None, т. е. границу делаем невидимой. Под текстовым окном располагаем экранную кнопку (объект Burtonl), которой присваиваем заголовок Ввод.
Под кнопкой Ввод располагаем второе текстовое окно для вывода результатов (объект Edit2), а слева от него надпись, говорящую о содержимом данного окна (объект Label 1). Внизу экрана располагаем две экранные кнопки. Это кнопка Сброс (объект Button2)и кнопка Выход (объект Buttons). Назначение этих кнопок понятно из их заголовков.
В правой части формы размещаем объект Paneii, а на этом объекте поместим иллюстрацию (объект imagei). Картинку для данной иллюстрации найдем в коллекции Clipart, входящей в состав пакета Microsoft Office 97. Картинка содержится в файле под названием Am idea. Такие изображения хорошо поддаются масштабированию, поэтому производить точную подгонку объектов под размеры картинки нет необходимости. Затем к основной форме подключаем вспомогательную форму со сведениями об авторе программы и создаем ее интерфейс. На этом создание графического интерфейса программы завершается (рис. 16.1).
Следующим этапом работы над программой является написание кода для пунктов меню и экранных кнопок. Пункт меню N3 закрывает окно формы, поэтому соответствующий код будет содержать только оператор close. Для пункта меню N4 необходимо написать оператор Form2. show, который выводит на экран компьютера дополнительную форму со сведениями об авторе. При
этом нужно предварительно создать новую форму с помощью раздела меню системы программирования File | New (Файл | Новый), а также описать подключение дополнительного модуля для этой формы Unit2 в разделе основного модуля unitl. который начинается со служебного слова uses.
Рис. 16.1. Графический интерфейс программы мФакториал"
Далее нужно написать код, описывающий реакцию на нажатие экранной кнопки Ввод, которое должно приводить к вычислению факториала с отображением его в соответствующем текстовом окне. Подпрограмма, описывающая данную реакцию, должна содержать описание используемых переменных (ранее мы рассматривали, какие переменные здесь необходимы), а также, как уже говорилось, средства ввода данных и вывода результатов. Получившаяся подпрограмма должна выглядеть следующим образом:
procedure TFormi.ButtonlClick(Sender: TObject);
var i,frn:integer;
begin
n:=StrtoInt(Editl.Text);
f:=l;
for i:=l to n do f:=f*i;
Edit2•Text:=InttoStr(f) end;
Теперь нам осталось запрограммировать действия кнопки Сброс, очищающей текстовые окна, и кнопки Выход, закрывающей основную форму. Нани-
сание соответствующих кодов не должно вызвать у пользователя каких-либо затруднений, т. к. мы уже делали это в предыдущих проектах. В листинге 16.1 приводится исходный код основного модуля данного проекта.
Листинг 16.1. Текст программы вычисления факториала
unit Unitl;
interface
uses
Windov/s, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, MenusrUnit2, StdCtrls, ExtCtrls;
typeTFormltypeTFormlclass(TForm)class(TForm)
type
TForml
type
TForml
class(TForm)
class(TForm)
MainMenu1: TMainMenu;
N1: TMenuItem;
N2: TMenuItem;
N3: TMenuItem;
N4: TMenuItem;
Meirol: TMemo;
Editl: TEdit; Buttoni: TButton; Label1: TLabe1; Edit2: TEdit;
Panel1: TPanel;
Image1: TImage; Button2: TButton; Button3: TButton;
procedure procedure procedure procedure procedureprivate{ Privateprocedure procedure procedure procedure procedureprivate{ PrivateN3Click(Sender: TObject);
procedure procedure procedure procedure procedure
private
{ Private
procedure procedure procedure procedure procedure
private
{ Private
N4Click(Sender: TObject);
ButtonlClick(Sender: TObject);
Button2Click(Sender: TObject);
declarations }declarations }Button3Click(Sender: TObject);
declarations }
declarations }
public
{ Public declarations } end;
var
Fonnl: TForml;
implementation
<$R ★.dfm]
procedure TForml.N3Click(Sender: TObject);
begin close end;
procedure TForml.N4Click(Sender: TObject); begin
Fonn2. Show end;
procedure TForml.Button1Click(Sender: TObject);
var i,f,n:integer;
begin
n:=StrtoInt(Editl.Text);
£:=1; for i:=l to n do f:=f*i;
Edit2.Text:^InttoStr(f) end;
procedure TForml.Button2Click(Sender: TObject); begin
Editl.Text:='';
Edit2.Text:=*1 end;
procedure TForml.Button3Click(Sender: TObject); begin
Close end;
end.
Написание дополнительного модуля Unit2, описывающего объекты вспомогательной формы, аналогично написанию таких же модулей в предыдущих проектах и не должно вызвать у читателя затруднений. После написания этого модуля программа готова к работе.
Внешний вид программы после запуска ее на выполнение приведен на рис. 16.2. При работе с данной программой следует обратить внимание на то, что в качестве исходных данных следует вводить натуральные числа не больше 15, т. к. факториалы даже сравнительно небольших по модулю чисел являются большими величинами. Например, факториал числа 12 равен 479 001 600.
Рис. 16.2. Программа "Факториал" во время работы
Программа "Вклад"
Следующим проектом, который мы будем разрабатывать в системе Delphi с использованием циклических структур,станет "Вклаа". С помощью данного проекта вкладчик, положивший деньги в банк, сможет рассчитать, какую сумму он должен получить по окончании срока действия договора с банком, если по условиям договора вклад положен в банк на определенное количество лет под определенный процент, который не должен изменяться до окончания срока действия договора.
Таким образом, данный проект должен иметь в качестве входных параметров начальную сумму вклада, срок действия договора (для упрощения решения поставленной задачи мы считаем, что количество лет, в течение которых будет действовать договор, является целым числом) и процент по вкладу. Выходным параметром данного проекта будет сумма вклада, накопившаяся после окончания договора. Исходя из сказанного ранее, можно составить общее представление об интерфейсе программы в системе Delphi, который должен включать в себя следующие элементы:
П три текстовых окна, используемых для ввода исходных данных;
поясняющие надписи к этим окнам;
две экранные кнопки: одна служит для подтверждения ввода исходных данных (Ввод), а вторая ——для очистки всех текстовых окон (Сброс);
О два текстовых окна для вывода полученных результатов (отдельно для рублей и для копеек);
пояснительные надписи к упомянутым ранее текстовым окнам;
иллюстрацию к проекту;
кнопку, которая закрывает форму.
Создание графического интерфейса программы мы, как обычно, начнем с обработки формы. Для этого мы придаем форме стандартный бледно-зеленый цвет, а в заголовке формы пишем ее название — слово Банк. Затем создаем в форме текстовые окна Editl, Edit2 и Edit3 для ввода исходных данных. Над каждым из этих окон должна быть сделана надпись, что н реализовано в внде объектов Labell, Label? и Labels. Под окнами ввода располагаются две зк- ранные кнопки: Buttoni и Button2. Первая из ннх используется для подтверждения ввода исходных данных, а вторая ——для очистки текстовых окон.
Ниже в форме расположены два текстовых окна Edit4 и Edits, которые используются для вывода результатов. Окно Edit4 отображает количество получаемых вкладчиком рублей, а окно Edits— копеек. Над кнопками расположена общая для них пояснительная надпись, которая реализована в виде окна комментария Memoi. Кроме того, справа от каисдого из двух текстовых окон располагается по небольшой надписи, указывающей единицу измерения для данного окна. Это будут надписи Labels и Labels.
В правой верхней части формы мы расположим иллюстрацию к проекту в виде растрового рисунка (объекты Paneii и image 1). В нижней правой части формы будет расположена кнопка Выход(Button3), которая закрывает форму и завершает работу всего проекта. На этом создание графического интерфейса в данном проекте будет завершено (рис. 16.3).
Создание программного кода начинаем с написания процедуры для экранной кнопки Ввод (Buttoni). В данной процедуре мы будем использовать ряд локальных переменных целого и вещественного типа. К целому типу относятся: переменная sr ок — количество лет, на которые заключается договор, rub —— количество рублей, которое должен получить клиент банка по окончании срока действия договора, кор——количество копеек, которое должен получить клиент, i ——вспомогательная переменная цикла. К вещественному типу относятся: vki——общая сумма вклада, pro——процешы по вкладу, drob и drobl — вспомогательные переменные, назначение которых станет ясно позднее.
В начале работы процедуры мы преобразуем содержимое текстового окна с указанием суммы вклада (Editl) в вещественную величину vkl, содержимое
окна Edit2 с указанием срока действия договора —— в целую величину srok, содержимое окна Edit3 с указанием процентов по вкладу——в вещественную переменную pro. Преобразование выполняется следующими операторами:
vkl:=StrtoFloat(Editl.Text);
srok:=StrtoTnt(Edit2.Text);
pro:=StrtoFloat(Edit3.Text);
Рис. 16.3. Графический интерфейс программы "Вклад"
Далее в процедуре вычисляется общая сумма вклада по окончании срока действия договора, для чего используется оператор с заранее известным числом повторений. При каждом повторении тела цикла высчитывается прибавка к вкладу за очередной год, для чего сумма, накопившаяся за предыдущий год, умножается на процент по вкладу и делится на 100. Затем получившаяся прибавка добавляется к сумме за прошедший год. Указанные действия реализуются в процедуре следующим образом:
for i:=l to srok do vkl:=vkl+vkl*pro/100;
В полученной таким образом общей сумме вклада необходимо вначале выделить целое количество рублей. Для этой цели мы используем стандартную фунцию trunc, которая как раз и находит целую часть числа, отбрасывая все остальное. Получившаяся величина проходит теперь обратное преобразова-
ние из числовой в строковую, а затем это строковое значение присваивается текстовому окну Edit:
rub:=trune(vkl);
Edit4.Text:=InttoStr(rub);
Затем из целой части вклада вычитаем количество рублей и получаем дробную часть drb, соответствующую количеству копеек. Для того чтобы преобразовать величину drb в количество копеек, мы умножаем эту величину на 100 и получаем значение переменной drbi. Таким образом мы находим количество копеек drbi, но данная переменная содержит наряду с целой и дробную часть. Для того чтобы выделить только целое число копеек кор, мы используем функцию round, которая округляет вещественную величину до ближайшего целого по математическим правилам. Эти действия описываются с помощью следующих операторов:
drb:^vkl-mb;
drbl:=drb*100;
kop:=гоund(d rbl);
Целиком же процедура, описывающая работу кнопки Buttonl, будет выглядеть следующим образом:
procedure TForml.ButtonlClick(Sender: TObject); var i,srokr rub,kop:integer;
vkl,pro,drb,drbl:real;
begin
vkl:=StrtoFloat(Editl.Text);
srok:=StrtoInt(Edit2.Text);
pro:=StrtoFloat(Edit3.Text);
for i:=l to srok do
vkl:=vkl+vkl*pro/100;
rub:=t rune(vkl);
Edit4.Text:=InttoStr(rub);
drb: =vkl-rub;
drbl:=drb*100;
kop:=round(drb1);
Edit5.Text:^InttoStr(kop) end;
Процедура для кнопки Button?, которая очищает при сбросе все текстовые окна, и процедура для кнопки Button3, которая закрывает окно программы, аналогичны таким же процедурам, рассмотренным ранее, поэтому в детальном их описании необходимости нет. В целом же программный модуль будет выглядеть следующим образом — листинг 16.2.
Листинг 16.2. Текст программы мВклади
unit Unitl;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, SEdCtrls, ExtCtrls;
type
TForml = class(TForm)
Panel1: TPanel;
Imagel: TImage;
Label1: TLabel;
Editl: TEdit;
Labe12: TLabe1;
Edit2: TEdit;
Label3: TLatel;
Edit3: TEdit;
Meruol: TMerao;
Buttoni: TButton;
Edit4: TEdit;
Button?: TButton;
Button3: TButton;
Label4: TLabel;
Edit5: TEdit;
Label5: TLabel;
procedure ButtoniClick(Sender: TObject);
procedure ButtonSClick(Sender: TObject);
procedure Button3Click(Sende r: TObject);
private
{ Private declarations }
public
{ Public declarations ) end;
var
Forml: TForml;
implements tion
{$R *.dfm}
procedure TForml.ButtonlClick(Sender: TObject); var i, srok, rub,kop:integer;
vkl,pro,drb,drbl:real;
begin
vkl:=StrtoFloat(Editl.Text);
srok:=Strtolnt(Edit2.Text);
pro^StrtoFloat (Edit3.Text);
for i:=l to srok do
vkl:=vkl+vkl*pro/100;
rub:=trune(vkl);
Edit4.Text:=InttoStr(rub);
drb:=vkl-rub;
drbl:^drb*100;
kop:=round{drbl);
Edit5.Text:=InttoStr(kop) end;
procedure TForml.Button2Click(Sender: TObject);
begin close end;
procedure TForml.Button3Click(Sender: TObject); begin Editl.Text: = * *;
EdiE2.Text:='*;
Edit3.Text:=r';
Edit4.Text:=11;
Edit5.Text:=*'
end;
end.
Результат работы программы для клиента, который положил 5000 рублей в банк сроком на 3 года под 15%, показан на рис. 16.4.
Программа "Контрольная по математике"
Целью данного проекта является создание тестового задания по математике, с помощью которого можно было бы проверить пользователя на знание всех четырех основных арифметических действий. Для того чтобы произвести такую проверку, пользователю предлагается решить 12 примеров, т. е. по 3 примера на каждую из основных арифметических операций. Для проверки пользователя на знание им правил деления в тесте представлены примеры на нахождение среднего арифметического. Это сделано для упрощения
Рис. 16.4, Программа ''Вклад1' во время работы
разработки программы. По итогам теста пользователю должна выставляться оценка. Если он решил все примеры правильно, то пользователь получает оценку ,,oтлич!lo,,. Если были допущены одна или две ошибки, го ему ставится оценка "хорошо". За три или четыре ошибки ставится оценка иудовлетво- рительно**, за большее количество ошибок— "неудовлетворительно". По окончании теста полученная оценка должна выводиться в экранную форму.
Создание проекта, как всегда, начнем с создания графического интерфейса пользователя. На экранной форме должны присутствовать следующие элементы:
П надпись, которая сообщает пользователю о том, какой нменно пример ему предстоит решать: на сложение, вычитание, умножение или нахождение среднего арифметического;
надпись, которая выводит исходные данные для примера, т. е. два числа, над которыми будет выполнено действие;
□ текстовое поле для ввода ответа пользователя с поясняющей надписью к нему;
экранная кнопка для подтверждения ввода ответа пользователя;
экранная кнопка для закрытия формы и выхода из программы;
иллюстрация к проекту.
Вначале в экранную форму выводим надпись Label 1, которая будет иметь Содержание такого рода: Чему равна сумма?, Чему равна разность ?, Чему равно
промзведение? ИЛИ Чему равно среднее арифметическое?. Затем ПОД ней помещаем в форму надпись Labei2. Эта надпись будет содержать конкретные числа и знак арифметической операции между ними. Например: 2+5, 8-6, 5*7 и т. д. При решении задачи по нахождению среднего арифметического знак операции будет заменен предлогом "н": 4 и 7.
Под надписями мы расположим текстовое окно Editi для ввода ответа пользователя. Над этим текстовым окном будет находиться надпись Labels. Эта надпись может содержать как предписание пользователю вводить ответ именно в окно Editi, так и сообщение об ошибке в том случае, если пользователь вместо результата вычислений случайно ввел в окно другую информацию нечислового характера. Ниже текстового окна будет находиться экранная кнопка Ввод (Buttoni). При нажатии на эту кнопку программа должна сопоставлять значение, введенное пользователем, с правильным результатом вычислений, который был определен самим компьютером. В случае совпадения этих значений, программа должна добавить пользователю дополнительный балл, а в случае их несовпадения, не должна ничего добавлять к имеющейся сумме баллов. В правом нижнем углу формы будет находиться еще одна экранная кнопка Выход(Button2), щелчок на которой завершает работу всей программы.
В правой верхней части формы мы поместим панель panel 1, а поверх нее будет расположена иллюстрация imagei, о создании которой следует сказать особо. Картинка, которая использована в данной иллюстрации, содержится в справочном материале программного комплекса StudyWorks. StudyWorks — это программный комплекс, разработанный фирмой Mathsoft для обучения основам математики. Картинка не является отдельным графическим объектом, как картинки из коллекции Clipart, входящей в состав пакета Microsoft Office, а интегрирована в страницу со справочной информацией.
Для того чтобы этот рисунок можно было вставить в создаваемый проект, используем следующую технологию. Открываем страницу программы StudyWorks со справочной информацией. Создаем копию окна программы комбинацией клавиш <Alt>+<PrintScreen> (содержимое окна при этом копируется в буфер обмена).
Далее запускаем стандартное приложение Windows— программу Paint. Командой Правка | Вставить вставляем в открытый документ Paint копию окна из буфера. Затем с помощью кнопки |口 | (выделение) в окне программы Paint выделяем фрагмент, который содержит рисунок. Командой меню Правка I Копировать копируем в буфер обмена выделенный фрагмент. Затем командой Рисунок I Очистить очищаем окно программы Paint и командой Правка I Вставить вставляем в окно Paint фрагмент с рисунком. Получившийся документ Paint с помощью команды Файл | Сохранить как сохраняем в папке проекта Delphi для дальнейшего использования под именем kontrol.
Обратите внимание на то, что созданная в Paint картинка является растровым объектом и плохо поддается масштабированию. Поэтому следует определить размеры данного рисунка в пикселах с помощью команды меню Рисунок | Атрибуты, а затем, исходя из уже известных размеров, подобрать размеры объектов Panel 1 и image 1 в проекте. Объект image 1 может иметь те же размеры, что и рисунок, а объект Panel по вертикали и по горизонтали больше на 4 пиксела. Если установить указанные ранее размеры объектов, то внешний вид рисунка не будет искажен. На этом создание интерфейса программы завершено (рис. 16.5).
Рис. 16.5. Графический интерфейс программы "Контрольная по математике"
Следующим этапом работы над проектом станет написание программного кода. Для того чтобы разобраться, с чего в данном случае нужно начинать создание программы, следует обратить внимание на то обстоятельство, что сразу после запуска программы на выполнение в программной форме должен уже присутствовать текст первого примера и должен начаться отсчет как общего количества выводимых примеров, так и баллов, получаемых пользователем. Поэтому задание начальных условий целесообразно связать с созданием самой формы. Для этого в инспекторе объектов открываем для формы Formi вкладку Events (События) и на указанной вкладке находим событие OnCreate (создание формы). Дважды щелкнув мышью в поле справа от OnCreate, МЫ Открываем заготовку ДЛЯ процедуры Forecreate.
Внутри этой процедуры мы выполняем следующие действия. Во-первых, мы запускаем генератор случайных чисел. Он нам понадобится для того, чтобы
при каждом новом запуске проекта в примерах у нас не повторялись каждый раз одни и те же числа, а компьютер каждый раз генерировал новые числа для примеров. Как и в Turbo Pascal, в Object Pascal для этой цели используется процедура Randomize. Во-вторых, в проекте необходимо иметь две переменные-счетчики. Одна переменная-счетчик к будет подсчитывать общее количество выводимых программой примеров. Вторая переменная-счетчик t будет подсчитывать количество правильных ответов, данных пользователем, которому соответствует количество набранных баллов. В процедуре мы должны проинициапизировать эти переменные, т. е. присвоить им начальные значения. Причем эти начальные значения будут разными. Для переменной к начальное значение будет равно единице, т. к. сразу после создания формы мы уже выведем первый пример. Для переменной t начальное значение будет равно нулю, т. к. пользователь не дал еще ни одного ответа.
Следующие операторы процедуры выбирают случайные значения и присваивают их вспомогательным переменным х и у. Эти действия, как и в Turbo Pascal, производятся с помощью функции Random. Затем с помощью функции inttostr значения целочисленных переменных х и у преобразуются в строковые величины а и ь. Далее пользователю задается первый вопрос чему равна сумма?, для чего эта строка присваивается объекту Labeii. В заголовке надписи Labe 12 выводятся строковые величины а и ь, между которыми ставится знак "+"・ Таким образом в данной процедуре мы сформировали текст первого вопроса теста. Далее приводится текст данной процедуры:
procedure TForml.FormCreate(Sender: TObject);
begin
randomize;
k:=l; t:=0;
x:=random(9)+1;
y:^random(9)+1; a:=InttoStr(x); b:-InttoStr(y);
Label1.Capt ion: = * Чему равна сумма?1;
Labe12.Caption:=a+*+*+b; end;
После вывода формы на экран и появления в форме первого вопроса пользователь должен ввести в текстовое окно свой вариант ответа и подтвердить его нажатием кнопки Ввод. Поэтому следующая процедура, которую мы создаем в данном проекте, должна быть связана со и!елчком на кнопке Ввод. Найдя для кнопки Buttonl событие Onciick, мы открываем заготовку процедуры ButtonlClick. Именно в этой процедуре будет производиться сравнение введенных пользователем результатов с правильными, вывод новых примеров, подсчет количества набранных баллов и выставление конечной оценки.
Разберем, как реализуется указанная последовательность действий в программе. Вначале необходимо для уже созданного компьютером примера найти правильное решение и присвоить его некоторой вспомогательной переменной, которую мы назовем z. Затем следует преобразовать введенный пользователем в текстовое окно ответ из строкового значения в числовое (причем лучше, чтобы эта числовая величина была вещественной, т. к. при нахождении среднего арифметического необязательно получится целый результат). Полученную с помощью функции stx匸oFloat числовую величину с мы сравним с "зталонно^" z. Если эти величины будут равны между собой, то тестируемый получает дополнительный балл, что выражается в увеличении значения переменной t на единицу.
Далее для следующего вопроса должны быть сгенерированы новые числовые значения х и у, и они должны быть преобразованы в строковые величины а и ь для их показа в форме. Затем счетчик количества примеров к должен быть увеличен на единицу, а текстовое окно должно быть очищено для того, чтобы в него можно было вводить новые данные.
Кроме того, желательно, чтобы текстовое окно было в форме активным, т. е. чтобы в нем уже находился текстовый курсор (этот курсор имеет вид вертикальной черты) и не надо было специально щелкать окно мышью перед вводом нового ответа. Такая активизация окна или другого элемента формы называется установкой фокуса на нем. Установка фокуса производится с помощью метода setFocus, который записывается через точку после имени элемента формы, на котором этот фокус устава вл ивается. Например, для установки фокуса на Editl нужно набрать команду Editl.SetFocus. Для примера на сложение двух чисел вся описанная ранее поеледовательность действий может быть реализована с помощью следующих операторов:
z:=x+y;
c:=StrtoFloat(Editl.Text); if c=z then t:=t+l;
x:=random(9)+1;
y:=random(9)+1;
a:=InttoStr(x);
b:=InttcStr(y);
Label1.Caption:=*Чему равна сумма?*;
Label2.Caption:=a+' + *+b;
Label3.Caption:='Введите ответ в это окно*; k:=k+l;
Editl.Text:=•r;
Editl.SetFocus
Рассматривая эту последовательность операторов, следует обратить внимание на следующее обстоятельство. Она может быть реализована в приведен-
ном ранее виде только при значении счетчика к» равном 1 или 2. Данное обстоятельство объясняется следующим образом: всего в программе выводится три примера на сложение. При к, равном 1, проверяется первый пример и формируется текст второго примера, при к, равном 2, выводится второй пример и формируется текст третьего примера — последнего примера на сложение. Если же к равно 3, то проверяется третий пример, а четвертый пример, генерируемый программой, должен быть примером на другое действие, на- прнмер на вычитание. Для четвертого же и для пятого примеров проверка будет производиться уже на вычитание и генерироваться примеры будут тоже на вычитание. Для того чтобы одну и ту же конструкцию можно было использовать для третьего, четвертого и пятого примеров, можно в начале ее поставить условный оператор. Этот оператор будет проверять, не равно ли к трем. В последнем случае проверка правильности будет производиться для примера на сложение. Далее приводится описанная последовательность операторов:
if k=3 then z:=x+y else z:=x-y;
c:=StrtoFloat(Editl.Text); if c=z then t:=t+l;
x:-random(9)+1;
y:=random(9)+1;
a:=InttoStr(x);
b:=InttoStr(y);
Label1.Caption: = * Чему равна разность?*;
Label2.Caption:=a+*-*+b;
Labe13.Caption: = * Введите ответ в это окно'; k:=k+l;
Editl.Text:=••;
Editl•SetFocus
Аналогичную последовательность операторов можно написать для шестого, седьмого и восьмого вопросов (в данном случае генерируются примеры на умножение). Для девятого, десятого и одиннадцатого вопросов подобным же образом генерируются примеры на вычисление среднего арифметического. После того как все примеры сгенерированы программой, остается проверить последний двенадцатый пример, очистить ненужные больше надписи, сделать невидимым текстовое окно, а затем на основании полученных тестируемым баллов вывести ему оценку. Определение оценки производится с помощью оператора case, в котором t выполняет роль переменной-селектора. Эти действия могут быть реализованы с помощью следующих операторов: if c=z then t:=t+l;
Editl.Visible:=FaIse;
Label1.Caption: = *•;
Labe12.Caption:='';
Label3.Caption: = *'; Buttonl・ Visible:=False; Labe14.Visible:=True;
case t
of
0. .7:
Labe14.Caption:='Ваша
оценка
равна
2';
8,9:
Labe14.Caption:='Ваша
оценка
равна
з・;
10,11:
Labe14•Caption:='Ваша
оценка
равна
41;
12:
Label4.Caption:='Ваша
оценка
равна
5,
end;
Таким образом, мы рассмотрели все возможные варианты действий, которые осуществляются при щелчке на кнопке Buttonl. Как понятно из сказанного ранее, конкретный вариант действий определяется значением переменной- счетчика к. Следовательно, реакцию кнопки Ввод удобнее всего описать в виде оператора множественного выбора case с к в качестве переменной- селектора. Этот оператор множественного выбора будет выглядеть таким образом: case k of 1..2: begin z:=x+y; c:=StrtoFloat(Editl.Text); if c=z then t:=t+l; K:=random(9)+1; y:=random(9)+1;
a:=InttoStr(x); b:=InttoStr(y); Label 1 .Captions*Чему равна сумма?*; Labe12・ Caption:=a+• + *+b;
Label3.Caption: =1 Введите ответ в это окно*; k:=k+l;
Editl.Text:=*';
Editl.SetFocus end;
3..5: begin if k=3 then z:^x+y else z:=x-y; c:=StrtoFloat(Editl.Text); if c=z then t:=t+l;
x: random (9) +1; y:=random(9)+1; a:=InttoStr(x); b:=InttoStr(y);
Labe 11 • Caption: =' Чеглу равна разность ?';
Label2.Caption:=a+*-*+b;
Label3.Caption: = * Введите ответ в это окно*; k:=k+l;
Editl.Text:=*';
Editl.SetFocus end;
.8: begin
if k=6 then z:=x-y else z:=x*y;
c:=StrtoFloat(Editl.Text); if c=z then t:-t+l;
x:=random(9)+L;.
y:=random(9)+1;
a:=InttoStr(x);
b:=InttoStr(y);
Label1.Capt ion: = * Чему равно произведение? *;
Label2.Caption:=a+'■'+b;
Label3.Caption:=1Введите ответ в это окно*; k:=k+l;
Editl.Text:=r1;
Edit1.SetFocus end;
.11: begin
if k=9 then z:=x*y else z:=(x+y)/2;
c:=StrtoFloat(Editl.Text); if c=n then t:=t+l;
x: random (9)+1;
y:=random(9)+1; a:=InttoStr(x); b:=InttoStr(y};
Label1.Caption:=1Чему равно среднее арифметическое?*;
Label2.Caption:=a+ * и '+b;
Labe13.Caption: = * Введите ответ в это окно*; k:=k+l;
Editl.Text:=,1;
Editl.SetFocus end;
begin
if c=z then t:^t+1;
Editl.Visible:=False;
Labe11.Caption:=1';
Label2.Caption: = *1;
Labe13.Caption: = * *;
Buttonl .Visible :==False;
Label4.Visible:=True; case t of
0. .7:
Label4•Caption:='
'Bawa оценка равна 2 *;
8,9:
Label4.Caption:=1
'Ваша оценка равна 3*;
10,11:
Label4.Caption:=
1 Ваша оценка равна 4•;
12:
Labe14.Caption:=1
1 Ваша опенка равна 5';
end;
end;
end;
Такая процедура, описывающая реакцию экранной кнопки Ввод, будет работать правильно, но только до тех пор, пока пользователь правильно вводит исходные данные. Если же пользователь случайно ошибся при вводе данных, например, ввел вместо числового варианта ответа какой-либо словесный, то система программирования отреагирует на это тем, что приостановит работу программы и выдаст пользователю сообщение, подобное тому, которое показано на рис. 16.6.
Рис. 16.6. Сообщение об ошибке, выдаваемое системой программирования при попытке пользователя ввести неправильные исходные данные (например, в случае ввода текста в окно, в которое можно вводить только числовые величины)
Неподготовленный пользователь вряд ли поймет что-либо из этого сообщения, н, кроме того, ему скорее всего придется запускать программу на исполнение заново. Для того чтобы избежать подобной ситуации, рекомендуется в программе предусматривать перехват ошибок. Под перехватом ошибок понимается возможность обнаружения ошибок пользователя средствами самой программы до их выявления компилятором. При этом должна производиться выдача простых и понятных пользователю сообщений об ошибке и не должно быть принудительного прерывания выполнения самой программы.
Так как в нашем случае основная угроза заключается в возможности неправильного ввода данных в текстовое окно, то после ввода очередного результата необходимо проверить, можно ли его интерпретировать как число. Для этого введенный в окно Editi результат должен быть проверен посимвольно.
Для того чтобы текст можно было преобразовать в числовую величину, нужно, чтобы он содержал только цифры от 0 до 9. Кроме цифр в окне могут находиться запятые, необходимые для отделения целой части от дробной, а также знак "минус". Если хотя бы один символ не принадлежит к указанному множеству, то нужно сообщить об этом пользователю для того, чтобы он мог ввести правильные исходные данные н продолжить выполнение программы. Перехват ошибок реализован с помощью следующего фрагмента программы:
flag:=true;
s:=Editl.Text;
for i:=l to length(s) do
if (s[i]<>'0‘)and (stijo*!1) and (s[i]<>'2‘) and (s[i]<>'3')and (s[i]<>'3') and (s[i]<>・4‘) and (s[i]<>*5*) and (s[i]<>'6‘) and (s(i]<>'7‘) and (s[j.]<>'8‘)and (s[i]<>'9‘)and (s[i]<>* -1) and (s[i]<>「) then flag:=false;
if flag=false
then Label3.Caption: = * в это окно можно вводить только числа* else
В приведенном фрагменте для определения корректности или некорректности ввода данных используется вспомогательная переменная flag, которая относится к логическому типу. Изначально этой переменной присваивается значение true. Строковой переменной s присваивается значение, введенное в текстовое окно. Затем с помощью стандартной функции length определяется длина введенной строки. Далее работает цикл с заранее известным числом повторений. Для всех символов, входящих в строку, начиная с первого и заканчивая последним, порядковый номер которого равен length (s), производится проверка их на принадлежность к указанному множеству.
Если хотя бы один символ в строке не удовлетворяет заданному условию, то значение переменной flag изменяется на false. Сразу после завершения работы цикла производится проверка значения переменной flag. Если значение ее оказалось равным false, то выводится сообщение об ошибке, которое присваивается объекту Labe 13, расположенному над текстовым окном. Если значение flag оказалось равным true, т. е. ошибок ввода обнаружено не было, то выполняются действия, которые находятся после else. После else мы и расположим тот оператор множественного выбора, который был создан ранее.
Теперь осталось внести в программу еще одно усовершенствование. Если внимательно посмотреть на варианты, описанные в операторе множественного выбора, то можно увидеть, что все они (за исключением последнего) очень похожи. Начало и конец каждого варианта идентичны и только в централь-
ной части имеются некоторые отличия. Поэтому начало каждого варианта мы можем описать в виде процедуры preobri, входящей в качестве составной части в процедуру ButtonlClick, а конец варианта можно представить также в виде подчиненной процедуры preobr2. Обе эти процедуры мы опишем внутри основной процедуры ButtonlClick, а вызываться они будут по мере необходимости из основной процедуры. Данная модификация программы позволит сделать ее более компактной. В листинге 16.3 приводится полный текст программного модуля.
Г ,•…"5“…:…一"2—."...“““."""“"".“..”...““.""「
I Листинг 16.3. Текст программы ''Контрольная по математике1'
unit Unitl;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls;
type
TForml = class (TForm)
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Editl: TEdit;
Buttonl: TButton;
Labe14: TLabel;
Button?: TButton;
Panel1: TPanel;
Image1: TImage;
procedure FormCreate(Sender: TObject);
procedure ButtonlClick(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations } public
{ Public declarations } end;
var
Forml: TForml;
x, y, k, t: integer;
c,z:real;
flag:boolean; a,bzs:string;
implement at ion
{5R *.dfm}
procedure TForml.FormCreate(Sender: TObject); begin randomize;
k:=l; t:=0;
x:«random(9)+1;
y:=random(9)+l; a:=InttoStr(x); b:=InttoStr(y);
Label1.Caption: =1Чему равна сумма?*;
Label2.Caption:=a十'+*+b; end;
procedure TForml.ButtonlClick(Sender: TObject); var i:integer;
procedure preobrl;
begin
c:=StrtoFloat(Edit1.Text);
if c=z then t:=t+l;
x:=random(9)+1;
у:«random(9)+1; a:=InttoStr(x); b:=InttoStr(y);
end;
procedure preobr2;
begin
Labe13.Capt i on:* * Введите ответ в это окно*; k:=k+l;
Editl.Text:=*•;
Edi七1•SetFocus end;
begin randomize; flag:=true;
s:=Editl.Text;
for i:=l to length(s) do
if (s[i]<>'0‘)and (s[i]<>'「)and (s[i]<>'2‘)
and (s[i]<>'3f)and (s(i]<>*3*) and (s(i]<>*4 *) and (s[i]<>'5‘)and (s[i]<>* 6*) and (s[i]<>•7•; and (s[i]<>*8‘) and (s[i]<>'9‘) and (s[i]<>*-*) and (s[iJ<>*f *) then flag:=false;
if flag=false
then Label3.Caption: = * в это окно можно вводить только числа1 else case k of 1..2: begin
z:=x+y;
preobrl;
Labell.Caption:= ,Чему равна сумма?*;
Label2.Caption:=a+ * + *+b;
preobr2 end;
.5: begin
if k=3 then z:=x+y else z:=x-y; preobrl;
Labe11.Caption:=1Чему равна разность?1;
Label2.Caption:=a+'-'+b;
preobr2 end;
.8: begin
if k=6 then z:=x-y else z:=x*y; preobrl;
Labe11.Caption:='"ему равно произведение?1;
Label2.Caption:^a+ * “ ' +-b; preobr2 end;
.11: begin
if k=9 then z:=x'y else z:=(x+y)/2; preobrl;
Labe11.Caption: = 'Чему равно среднее арифметическое?';
Label2.Caption:=a+1 и •+b;
preobr2;
end;
begin
if c=z then t:=t+l;
Editl.VisLble:=FaIse;
Label1.Caption: = * *;
Label2.Caption:=1';
Labe13.Caption: = * *;
Buttonl.Visible:=False;
Label4.Visible:=True;
case t 0..7:8,9: 10,11:12: end;end;case t 0..7:8,9: 10,11:12: end;end;ofLabel4.Caption:=1Ваша Label4.Caption:='Ваша Labe14.Caption:='Ваша Labels•Caption:=1BawaofLabel4.Caption:=1Ваша Label4.Caption:='Ваша Labe14.Caption:='Ваша Labels•Caption:=1Bawaоценкаоценкаоценкаоценкаоценкаоценкаоценкаоценкаравна равна равна равнаравна равна равна равна21 3, 4*;5*;21 3, 4*;5*;
case t 0..7:
8,9: 10,11:
12: end;
end;
case t 0..7:
8,9: 10,11:
12: end;
end;
of
Label4.Caption:=1Ваша Label4.Caption:='Ваша Labe14.Caption:='Ваша Labels•Caption:=1Bawa
of
Label4.Caption:=1Ваша Label4.Caption:='Ваша Labe14.Caption:='Ваша Labels•Caption:=1Bawa
оценка
оценка
оценка
оценка
оценка
оценка
оценка
оценка
равна равна равна равна
равна равна равна равна
21 3, 4*;
5*;
21 3, 4*;
5*;
end;
end;
procedure TForml.Button2Click(Sender: TObject); begin close end;
end.
Рис. 16.7. Программа ''Контрольная по математике" во время работы при правильном вводе данныхРис. 16.7. Программа ''Контрольная по математике" во время работы при правильном вводе данных
Рис. 16.7. Программа ''Контрольная по математике" во время работы при правильном вводе данных
Рис. 16.7. Программа ''Контрольная по математике" во время работы при правильном вводе данных
Этот программный модуль включает в себя также еще одну процедуру Button2Click, которая описывает реакцию на нажатие кнопки Выход
(Button2). Эта процедура аналогична другим такнм же и поэтому не требует специальных пояснений. На рис. 16.7 показано, как выглядит программа тестирования по математике во время работы при правильном вводе данных, а на рис. 16.8 показано, что будет происходить при попытке ввода неправильных исходных данных.
Рис. 16.8. Реакция программы "Контрольная по математике*' на неправильный ввод данных
Задание для самостоятельной работы
Разработать в среде Delphi проект, который бы решал задачу Фибоначчи, описанную в разд. 8.3. Для решения задачи можно использовать тот же рекурсивный алгоритм, который был описан в главе 8.
Указания к проекту. Графический интерфейс данного проекта должен включать в себя текстовое окно для ввода исходных данных (количества месяцев), поясняющую надпись к текстовому окну и надпись для вывода результата. На форме проекта должны присутствовать три экранные кнопки: кнопка Ввод — для получения результата, Сброс — для очистки текстового окна и надписи с результатом. Выход — для завершения работы программы. В правой части формы желательно предусмотреть место для вывода иллюстрации к проекту. В качестве такой иллюстрации можно взять рисунок rabbit.wm「 который в пакете Microsoft Office 97 находится в папке Clipatl\Popular.
ГЛАВА 17
Решение математических задач в Delphi
Интегрированная среда Delphi может быть использована не только для решения задач элементарной математики. Данная среда позволяет создавать проекты для удобного и наглядного решения задач из области высшей математи* ки. Примеры таких задач и рассматриваются в данной главе.
Программа "Вычисление производной"
Согласно определению, производная некоторой функции у =貝戈)в точке х() является пределом отношения приращения функции к приращению ее аргумента при стремлении приращения аргумента к нулю:
•Ах。) = /(%)= lim 学,где Лх = х-х0, △,= /(%+Дх)-/(%).
Алгоритм вычисления производной по ее определению сводится к следующему: последовательно вычисляют величину 屮Ах с последовательным уменьшением величины Ах. Это уменьшение производится до тех пор, пока разность между последними двумя вычисленными значениями частного не станет меньше некоторой заданной величины е. Последнее полученное частное и принимают в качестве искомой величины производной.
Вычисление производной с помощью описанного ранее алгоритма мы реализуем в среде Delphi, где его конкретная реализация будет осуществлена в проекте **вычисление производной*' для функции ^ = 3-х1 - 4-х В проекте мы создадим форму с тремя текстовыми окнами. В первое из этих окон мы будем вводить значение аргумента в той точке функции, где мы будем вычислять производную. Во втором окне будем указывать требуемую точность вычислений. В третьем окне будет выводиться результат— значение производной в заданной точке.
Работу над проектом начнем, как обычно, с создания его графического интерфейса. В основной форме мы изменяем значение ее свойства Caption, введя вычисление производной. Цвет формы сделаем серебристым (cisilver). Затем в самой форме необходимо поместить надпись млн окно комментария, которое говорило бы о том, для какой именно функции мы вычисляем производную.
Здесь, однако, мы сталкиваемся со следующей проблемой: для функции у = 3・工2 - 4-х цифру 2 нужно написать в верхнем индексе. Это можно сделать в текстовом процессоре Microsoft Word, но в строковом редакторе Delphi, который употребляется для заполнения строк надписи или окна комментария, возможность использования верхних и нижних индексов отсутствует* Поэтому воспользуемся следующим приемом. Вначале мы напишем в две строки текст "Внчмсление производной функции у=3,-4х” в MS Word. В программе Word выделим цифру 2 в тексте и переведем ее в верхний индекс, для чего используем команду меню Формат | Шрифт. Эта команда открывает диалоговое окно, в котором, установив флажок верхний индекс, мы переведем в верхний индекс цифру 2. С помощью команды Вставка | Символ вставляем точку — знак умножения между сомножителями. В результате текст, набранный нами в программе Word, будет иметь следующий вид:
Вычисление производной функции у=3,х?-4・х
Далее необходимо произвести заливку созданного текста светло-серым цветом, идентичным цвету формы нашего проекта. Затем сделаем копию окна Word с помощью комбинации клавиш <Alt>+<PrintScrn>. Полученную копию можно вставить в программу Paint, являющуюся стандартным приложением Windows, где можно затем скопировать только интересующий нас фрагмент окна, т. е. две текстовые строки. Для этого командой Правка | Вставить вставляем в открытый документ Paint копию окна из буфера. Далее с помощью кнопки I口I (выделение) в окне программы Paint выделяем фрагмент, который содержит две указанные ранее текстовые строки. Командой меню Правка | Копировать копируем в буфер обмена выделенный фрагмент. Затем командой меню Рисунок | Очистить очищаем окно программы Paint и командой Правка | Вставить вставляем в окно Paint фрагмент с текстовыми строками.
Получившийся документ Paint с помощью команды Файл | Сохранить как сохраняем в папке нашего проекта под именем funct для дальнейшего использования. Затем в основной форме проекта мы создаем объект image 1. Для свойства Picture данного объекта в качестве источника мы указываем уже имеющийся в папке проекта файл ftinct, который мы и загружаем в image 1. Таким образом, мы создаем на форме необходимую надпись, но уже в виде иллюстрации.
На следующем этапе мы создаем текстовое окно Editl для ввода значения х, ОКНО Edit2 ДЛЯ ВВОДЯ Требуемой ТОЧНОСТИ вычислений И ОКНО Edit3 для вывода интересующего нас результата. Для того чтобы пользователю было понятно, что именно нужно вводить в данные окна, мы снабжаем каждое из них поясняющей надписью. Таким образом, на форме появляются надписи Label 1, Label2, Label3 И Label4(НЯДПИСИ Label2 И Label3 ОТНОСЯТСЯ К ОДНОМУ окну Edit2). Рядом С ОКНОМ Edit2 Помещаем кнопку Buttonl (Ввод). Щелчок мышью на этой кнопке должен приводить к вводу исходных данных и вычислению искомого значения производной. В правой нижней части формы мы расположим еще две экранные кнопки. Кнопка Button2 (Выход) должна закрывать форму и завершать работу программы, а кнопка Buttons (Сброс)— очищать все текстовые окна в том случае, если пользователь хочет ввести в процессе работы новые исходные данные.
В верхней правой части формы мы поместим иллюстрацию, которая наглядно показывает геометрический смысл вычисления производной. Для этого мы создаем в форме объект Paneii, на котором располагаем объект imagel. Картинка, которая использована в данной иллюстрации, содержится в справочном материале программного комплекса StudyWorks. Картинка не является отдельным графическим объектом, как картинки из коллекции Clipart, входящей в состав пакета Microsoft Office, а интегрирована в страницу со справочной информацией. Технология создания на основе этой страницы растрового графического файла и его использования в проекте аналогична той, которую мы использовали для разработки интерфейса проекта "Контрольная по математике11 (см. разд. 16.3). На этом создание интерфейса программы завершено (рис. 17.1).
Далее мы приступаем к разработке программного кода для нашего проекта. Вычисление производной будет происходить при щелчке на экранной кнопке Buttonl. Поэтому МЫ создаем В программе процедуру ButtonlClick. В этой процедуре мы используем ряд локальных переменных, к которым относятся:
口 к — значение аргумента, задаваемое пользователем с клавиатуры;
П dx — приращение значения аргумента;
□ dyi и dy2 — приращения значения функции;
П е — разница между двумя приращениями значения функции;
口 ekon ——требуемая точность вычислений, задаваемая пользователем с клавиатуры.
Кроме того, внутри процедуры создается функция dy. Параметрами функции являются iks — значение аргумента в некоторой точке, и diks — приращение значение аргумента. Значением данной функции является отношение прнра-
14 Зак 106s
щения функции у и приращения аргумента х. Приращение же функции у в свою очередь определяется как разница между значением функции в точке iks+diks и значением функции в точке iks. Тогда функция dy будет выглядеть следующим образом:,
function dy(iks,diks:real)ireal; begin
dy:^((3*(iks+diks)*(iks+diks)-4*(iks+diks))-(3*iks*iks-4*iks))/diks end;
Рис. 17.1. Графический интерфейс программы "Вычисление производной*'
В основной части программы мы сперва определяем значения х и ekon путем перевода строковых величин, введенных пользователем в текстовые окна Editi и Edit2, в вещественные. Затем задается начальное значения приращения аргумента dx, которое берется равным 0,000 L Далее из основной части программы производится обращение к функции dy, что позволяет вычислить приращение функции dyi, соответствующее начальному приращению аргумента.
Затем в программе организуется цикл с постусловием. При каждом очередном выполнении тела цикла производится уменьшение значения приращения аргумента в к раз. Коэффициент к мы берем равным 10. После уменьшения приращения аргумента мы с помощью обращения к функции dy находим соответствующее приращение значения функции dy2. После этого мы определяем разницу между двумя приращениями и присваиваем приращению dyi
значение приращения dy2. При следующем повторении тела цикла (если оно будет) мы будем сравнива i ь с последующим уже это новое значение. Цикл будет выполняться до тех пор, пока очередная разница между двумя соседними приращениями не станет меньше заданной точности вычислений. Полученное значение dy2 и будет искомой производной.
Теперь осталось вывести полученное значение переменной в текстовом окне Edit3. Для этого мы, как обычно, воспользуемся стандартной функцией Float tost г. Однако здесь мы сталкиваемся со следующей проблемой: полученное значение будет выведено со многими знаками после запятой. Практически же данным методом мы может вычислить значение до 3―4 знака после запятой. Поэтому желательно "обрезать" полученную строковую величину. Для этого мы воспользуемся еще одной стандартной функцией языка Object Pascal. Стандартная функция сору позволяет вывести только часть строковой переменной, начиная с символа, номер которого указан пользователем. В данном случае мы выведем в текстовом окне первые шесть символов cipo- ковой переменной, начиная с первого. На этом работа над процедурой закончена.
Кроме описанной ранее в программе используются еще две процедуры для кнопок Выход(Button3) и Сброс(Button2). Процедура Button3dick закрывает экранную форму и всю программу, а процедура Button2Click очищает все текстовые окна, если нужно ввести новые исходные данные. Эти процедуры аналогичны таким же процедурам, описанным в предыдущих главах. В листинге 17.1 приводится полный текст программы.
厂г■
I Листинг 17.1. Текст программы "Вычисление производнойм|
unit Unitl; interface
uses
Windows, Messages, SysUtils. Variants, Classes, Graphicsr Controls, Forms, Dialogs, StdCtrls, ExtCtrIs;
type
TForml = class (TFom) Image1: TImage;
Labe11: TLabel; Editl: TEdit; Labe12: TLabel; Label3: TLabel;
Edit2: TEdit;
Buttonl: TButton;
Label4: TLabel;
Edit3: TEdit;
Button2: TButton;
Pane11: TPanel;
Image2: TImage;
Button3: TButton;
procedure ButtonlClick(Sender: TObject);
procedure Buttcn2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Forml: TFoml;
implementation
($R *.dfm}
procedure TForml.ButtonlClick(Sender: TObject);
const
k=10;
var
dx,dyl,dy2,e,ekon,x:real;
function dy(iks,diks:real):real;
begin
dy:=((3*(iks+diks)*(iks+diks)-4*(iks+diks))-(3*iks*iks-4*iks))/diks end;
begin
x:eStrtoFloat(Editi.Text};
ekon:^StrtoFloat(Edit2.Text);
dx:=0.0001;
dyl:=dy(xrdx);
repeat
dx:=dx/k;
dy2:=dy(x,dx);
e:=dy2-dyl;
dyl:=dy2
until e<ekon;
Edit3.Text:=copy(FloattoStr(dy2),1,6)
end;
procedure TForml.Button2Click(Sender: TObject);
begin
Editl.Text^1,
Edit2.Text:=*';
Edi 13.Text:e,'
end;
procedure TForml.Button3Click(Sender: TObj ect);
begin
close
end;
end.
На рис. 17.2 показано, как выглядит окно программы ^Вычисление производ- нойм во время ее работы при вычислении производной функции для х = 2.
Рис. 17.2. Программа "Вычисление производном* во время работы
Программа "Интеграл"
Вычисление определенного интеграла геометрически можно интерпретировать как вычисление площади фигуры, которая ограничена линией графика
подинтегральной функции, осью абсцисс и двумя вертикальными линиями, соответствующими верхнему и нижнему пределам интегрирования. Такую фигуру можно разбить на ряд участков, каждый из которых по своей форме близок к трапеции. Площадь каждой такой трапеции можно вычислить, а затем сложить получившиеся площади и найти таким образом общую площадь фигуры, т. е. искомый интеграл. На этом и основан способ приближенного вычисления определенного интеграла, который так и называется методом трапеций.
ь
Вычисление значеия определенного интеграла J f(x)dx по методу трапеций
производится следующим образом: участок от а до Л разбивается на п равных по величине отрезков. Длина каждого отрезка h = (b - а)/п. Значения аргумента в точках разбиения будут соответственно равны: Ло = а, Х[ = о + 〃•…, х, = № + /Л, .... хп = h. Значения функции Дл) в точках ,v, будут соответственно обозначаться yt. Тогда согласно формуле трапеций определенный интеграл можно будет вычислить следующим образом:
J/(x)cZrи〃(先;)'"• + J] + ...у +... +у,,)-
Перед тем как приступить к разработке проекта "интеграл", составим фрагмент программы на языке Object Pascal, который реализует указанный ранее метод на компьютере. В качестве подинтегральной функции мы используем тригонометрическую функцию у = sin(x)・ В данном фрагменте будут использованы следующие обозначения:
П п— количество отрезков, на когорые разбивается участок интегрирования;
i — вспомогательная переменная цикла;
а — начальный предел интегрирования;
П b — конечный предел интегрирования;
h — длина отрезка интегрирования;
П уп — значение подинтегральной функции в начальной точке (точка а);
ук ——значение подинтегральной функции в конечной точке (точка ь);
ур — одно из промежуточных значений подиi«тсгральной функции;
s ——искомое значение определенного интеграла.
Первые две переменные должны относиться к целомислeiiному типу, а все остальные— к вещественному. Тогда описание переменных должно выглядеть следующим образом:
var i,n:integer;
a,b,s,h.x,yprynfykzreal;
Сама формула трапеции реализована на языке Object Pascal в следующем фрагменте программы, в котором для расчетов использован цикл с заранее известным числом повторений:
h:= (b-а) /п;
ур:=о;
х:=а;
for i:=l to nT do
begin
x:=x+h;
yp:=yp+sin(x)
end;
yn:=sin (a);
yk:=sin(b);
s:^((yk+yn)/2+yp)*h;
Далее мы приступаем к разработке графического интерфейса данной программы. Интерфейс программы должен включать в себя следующие элементы:
строка меню, содержащего разделы Файл и Справка. Первый раздел включает в себя пункт Выход, а второй ——пункт Об авторе. Выполнение данного пункта выводит на экран компьютера дополнительную форму со справочной информацией н закрывающей кнопкой;
текстовое окно для ввода верхнего предела интегрирования, над которым находится поле комментария, поясняющее, что вводится в текстовое окно;
текстовое окно для ввода нижнего предела интегрирования, над которым находится соответствующее поле комментария;
О текстовое окно для ввода количества участков, на которые разбивается отрезок интегрирования;
кнопка Вычислить. Щелчком на этой кнопке должно производиться вычисление определенного интеграла;
П кнопка Сброс. Щелчок на данной кнопке очищает окна, содержащие исходные данные и результат вычислений;
口 текстовое окно для вывода полученного значения интеграла с расположенным над ним окном комментария;
口 панель с иллюстрацией, поясняющей суть процесса вычисления определенного интеграла.
Создание интерфейса начинаем с работы над основной формой проекта. В начале переименовываем объект, который получает названне вычисление определенного интеграла функнии y=sin (х). Затем Изменяем ЦВСТ формы на небесно-голубой.
Далее создаем главное меню, которое имеет разделы Файл (объект N1) и Справка (объект N2). Эти разделы имеют соответственно пункты Выход (объект N3)и Об авторе (объект N4). Создание и настройка меню производится аналогично тому, как это было сделано в предыдущих проектах. Выбор пункта меню об авторе приводит к выводу на экран дополнительной формы справочного характера. Создание и настройка данного окна также производится аналогично предыдущим проектам.
Следующим этапом работы над проектом является создание трех групп аналогичных объектов, используемых для ввода исходных данных. Это текстовое окно Editl для ввода верхнего предела интегрирования н окно комментария Мемо1, текстовое окно Edit2 для ввода нижнего предела интегрирования и окно комментария Мето2, текстовое окно Edit3 для ввода количества участков, на которые разбивается отрезок интегрирования, и окно комментария МешоЗ.
Под этими объектами создаем две экранные кнопки. Это кнопка Вычислить (объект Buttoni) и кнопка Сброс (объект Button2). Первая кнопка подсчитьь вает значения определенного интеграла функции sin(x), а вторая очищает все текстовые окна, включая окно результата. Под экранными кнопками располагаем текстовое окно Edit4 для вывода полученного значения интеграла и поясняющую надпись Labell.
Последнюю группу объектов данной программы мы создаем в правой части формы. Это панель (объект Paneii), содержащая иллюстрацию к программе, поясняющую смысл указанного ранее метода вычисления (объект iniagei). На создании графического объекта остановимся подробнее.
Картинка, которая использована в данной иллюстрации, содержится в справочном материале программного комплекса StudyWorks. Для того чтобы этот рисунок можно было вставить в создаваемый проект, используем ту же технологию, что и в предыдущем проекте. На этом создание интерфейса данного проекта завершено (рис. 173).
Далее приступаем к созданию программного кода. Подпрограммы, соответствующие пунктам меню N3 и N4, аналогичны соответствующим пунктам в предыдущих проектах. В качестве основы для процедуры Buttoniciick, описывающей реакцию на нажатие кнопки Вычислить, берем фрагмент программы, приведенный в начале данной главы, н дополняем его операторами, описывающими преобразование исходных данных из строковой формы в числовую, и оператором, преобразующим полученный результат из числовой
формы в строковую. Подпрограмма Button2dick, описывающая реакцию на щелчок по кнопке Сброс, аналогична соответствующим подпрограммам в предыдущих проектах. В листинге 17.2 приводится полный текст программного кода данного проекта.
HIilQIHIilQI卜 Вычисление определенного интеграла Однкимн р=»п(х)
HIilQI
HIilQI
Ф.айл Справке. ~,
・.•"】、『••••,・:;;
.--L一 у,-.,^Введите количество участков^ на которые будет разбит отрезок интегрирования.--L一 у,-.,^Введите количество участков^ на которые будет разбит отрезок интегрирования:L—::::•:•:: <:::^• */ 一 一 :х -• -•>•<-*-• •-• •■•-:♦.::Введите конечное аночение отрезка интегрирования:L—::::•:•:: <:::^• */ 一 一 :х -• -•>•<-*-• •-• •■•-:♦.::Введите конечное аночение отрезка интегрированияВведите начальное значение отрезка интегрирования «•
.--L一 у,-.,^
Введите количество участков^ на которые будет разбит отрезок интегрирования
.--L一 у,-.,^
Введите количество участков^ на которые будет разбит отрезок интегрирования
:L—::::•:•:: <:::^
• */ 一 一 :х -• -•>•<-*-• •-• •■•-:♦.::
Введите конечное аночение отрезка интегрирования
:L—::::•:•:: <:::^
• */ 一 一 :х -• -•>•<-*-• •-• •■•-:♦.::
Введите конечное аночение отрезка интегрирования
>、■-»・•,. 7—А Хе«*・・■・Ъ>— - ■* •-- - • ■ • ■ • •
::■ Сброс
Определенный интеграл равен,•基•: ;: :' V: * г
Рис. 17.3. Графический интерфейс программы "Интеграл"
Листинг 17.2. Текст программы вычисления определенного интеграла
unit Unitl;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Menus, StdCtrls, ExtCtrlsrUnit2;
type
TForml = class(TForm)
MainMenu1: TMainMenu;
Nl: TMenuItem;
N2: TMenuItem;
N3: TMenuItem;
N4: TMenuItem;
Memol: ТМепю;
Editl: TEdit;
Memo2: TMemo;
Edit2: TEdit;
№em3: TMemo;
Edit3: TEdit;
Buttonl: TButton;
Button2: TButton;
LabelI: TLabel;
Edit4: TEdit;
Panel1: TPanel;
Image1: TImage;
procedure procedure procedure procedureprivate{ Private publicprocedure procedure procedure procedureprivate{ Private publicN3Click(Sender: TObject);
procedure procedure procedure procedure
private
{ Private public
procedure procedure procedure procedure
private
{ Private public
N4C1ick(Sender: TObject);
ButtonlClick(Sender: TObject);
declarations }declarations }Button2Click(Sender: TObject);
declarations }
declarations }
{ Public declarations } end;
var
Forml: TForml;
implement at ion
{$R *.dfm}
procedure TForml.N3C1ick(Sender: TObject); begin close end;
procedure TFoiml.N4Click(Sender: TObject);
begin
Form2.Show end;
procedure TForml.Button!Click(Sender: TObject); var a,b,s,h,x,yp,yn,yk:real; ifn:integer;
begin
a:=StrtoFloat(Editl.Text);
b:=StrtGFloat(Edit2.Text);
n:=StrtoInt(Edit3.Text); h:-(b-a)/n;
ур:=О;
х:-а;
for i:=l to n-1 do
begin
x:=x+h;
yp:=yp+sin(x) end;
yn: =sin(a);
yk:=sin (b);
sz-{(yk+yn)/2+yp)*h;
Edit4.Text:=copy(FloattoStr(s), 1,6) end;
procedure TForml.Button2Click(Sender: TObject); begin
Editi.Text:s,1;
Edit?.Text:=*';
Edit3.Text:^r *;
Edit4.Text: = * *
end;
end.
Завершающим этапом работы над программой является, как обычно, написание кода для вспомогательной формы. После этого программа готова к запуску на выполнение.
Внешний вид программы после ее запуска на выполнение приведен на рис. 17.4. При работе с программой следует обратить внимание на то, что для правильной ее работы исходные данные (верхний и нижний пределы интегрирования) нужно вводить не в градусах, а в радианах.
ГЛАВА 18
Delphi в Интернете
В настоящее время Delphi является одной из ведущих систем, используемых для разработки программного обеспечения, как в нашей стране, так и за рубежом, и, естественно, что в глобальной информационной сети имеется большое количество материалов полностью или частично посвященных программированию в Delphi. Например, в популярной поисковой системе Апорт имеется тематический каталог, в котором есть, конечно, и раздел Программирование. Внутри данного раздела имеется н специальная рубрика, посвященная программированию в Delphi. По состоянию на февраль 2005 года данная рубрика содержала ссылки на 67 различных сайтов. Исходя из этих данных, Delphi занимает по популярности первое место, опережая С (53 ссылки), Visual Basic (31 ссылка) и все прочие языки (рис. 18.1). Кроме перечисленных в каталогах, существует еще много других сайтов по этой гемагике.
Понятно, что пользователю, который только начинает осваивать программирование в Delphi, трудно сразу правильно сориентироваться в таком больиюм потоке информации. Поэтому авторы книги решили в данной главе указать те источники во всемирной сети, которые на их взгляд могут быть наиболее полезны для начинающих программистов. Естественно, что первоочередное внимание в этом обзоре будет уделено русскоязычным сайтам, содержащим важную и полезную информацию по работе в системе Delphi.
Знакомство с этими источниками мы начнем с сайта компании Borland — разработчика системы.
http://www.borland.coni — на этом сайте пользователь может найти информацию о самой компании, производимых ею программных продутах и многом другом (рис. 18.2). Информация на сайте представлена на английском языке.
2 Ало<л -Кстллюг Комш>1итарм > П (юг р лмммров«я*я> > Яшви пр гм раммырпалння ■ МюовоК Iniutnai Еаркич
生《Ал p”u fi« И>вР**«в Саренс £лр«&
□ *30
Остаквнг» ОйнаошъДо»А
па
!SflCMoJ<^] Н1р〃м1а1ои«юп ,yiWlhenM a;j»AM3584iT
■эбоогюа *^нап
АПЬбОМ IIEA£»t ROOIS MANUVA "AW11LLY DEEP-看。〃。6“・.J
QUD-C;^遮恥电池螂敦. 牧鲤 &1Мрмт・м・ Hpiom. Пши. З^амомст.,履©即.呪 АгщыНабрнт
лпдрт
ищет что нале
Пааиая ■ 06tдоы • Питт лгош< мйтм -
I e ♦ ЭТОЙ рубриг« 广 «о »сем каталог#
电C処域(13)
C,£iC*<53) 05注1(67) 及6G) Е^шаН) ЙсаСб)
Esq3(2向 Niffi⑹
А*еомгл(8|
百
迎G
Учеб»*— матеплее: Аскумвтацмл, частые во^хкы. CPAN, т*ы«. Загрума ПО для Uhh,
KU】。〉
•gfllBasKCl)
ysa<3)
KutSaJVnQIEDtfcnyi Rb«M1 (28)
S,*TT8»*? KAQ1 nporDBErtKRC 5Ъыи &iwno4 г»гиртекст> (2t)
Ф PtrLcom - азых поогроимичовдииа Peri
「по описаниям емйю»
G ПО орвннцам сайтов
1900(1) e^ae〉 如(") 2牧⑴ Prthpn W 5шдШ ⑴
ftnOPT-JOBAPbt «ктуалманс <^>сАл(нкениЯ
Xoa,w В<6~д>оа^ eaoawTKa Проголди Itofi42ASQ« 抽“ ХВЮиУГОА Нрутбуин К£К ь^коса Пгбтвоы Му№п еотс тс)
urw. vflrOZ. Настхсв. Клтжпсг омумм. смлсты оаювбсйхм. пжгтмм^ы, конД>ео«ни»*4.
1 " '、'^^TH^V ' " ' 1 —*”—■“■—,= ——丁-”"・~「—'”1.・・* ■—■ —- ■ - ^-ш^^^^^т ..***■ л«м>« . ^. -*^ма«* ».^--w—'
…个乩疗"J「;・ИятАГ
Рис. 18.1. Раздел каталога поисковой системы Апорт, посвященный языкам программирования
На сайте имеется раздел Downloads, в котором есть подраздел Delphi. В этом подразделе в заархивированном виде имеются файлы, содержащие оригинальную документацию по различным версиям Delphi (рис. 18.3). Имеющаяся документация охватывает версии, начиная с третьей и заканчивая шестой.
Рис. 18.3. Страница сайта компании Borland, содержащая файлы документации по различным версиям Delphi
Фирма Borland имеет представительство в России и странах СНГ. У этого представительства также есть свой сайт.
http://www.borland.ru — на данном сайте есть информация на русском языке, но есть и ссылки на англоязычные страницы сайта фирмы Borland (рис. 18.4).
Сайт ''Development и Дельфи*1 расположен в глобальной сети по следующему адресу http://delphid.dax.ru. Здесь имеется подборка статей по программированию в Delphi, примеры программ на Delphi, ссылки на другие сайты со сходной тематикой (рис. 18.5).
На сайте есть специальный раздел Курс начинающего программиста в Delphi (рис. 18.6). В этом разделе имеется ряд электронных книг и учебников по системе Delphi, которые можно скачать.
Сайт "Все для Delphi программиста*1 находится по адрес、 http:// www.delphi.dax.ru. Здесь можно найти ссылки на ресурсы no Delphi, приме-
jlhUmllioMlsiui
В。ГI ЭПЛроссий. СНГ.ПоиОаптниа
1 где купить
К・м» Вагруяш )С4рамсм П**д«*ж*> П—тм«*ы Им«ет м С««*лма О К*иг»ш«*я. 1>мр«**г«мм«н
О
DELIVER …, quality software ON TIME and ON BUDGE1 with
BORLAND CORE SDP
learn more
窗Ж1r^F.于-L-k—•FF 不…—丁嘗厂%^^--
I •
I勺二.
I &p<^ ⑥Т^Т^шош&км
Рис. 18.4. Сайт представительства компании Borland в России и странах СНГ
PHP
[)e«clo|intflrtl и Лппъфн i.<tAi <■ ирш рлмми(><>п<тии нс Dclplw Mn.it»«t)lt Inlcinct F iphxini
t^MKM 1 R^*HP' 1 Г Л<^ол>фов«малагк* 5.^^^^—
]г^Т^^~~I 厂 ^&£if] аыамд
]меме 5 M*a?M«AMC« j P COi-BN j 厂 |t«ccea» ||ЙИ205^寸,—±h”r -
I 至4й* йрм B« ^Мр*«в» СбР«< £^*К«
Development
I 廿弓 u АеАьви
Сейчас на сайте: 1 t Лостаонть злклшку | Слелать стартовой
«Рорук Конкурс Стать” 必話〜小 ста"2 Vuhx ДепмОм Уихк Р_с・1 Пнгракха Кохпонехты Ю・ор Сзлхн Гостеваа
[Еаенеа ] [ хазад ] 一 .РОССЫЛКМ Ы|У5Г^№
Development и Дельфи - программирование в Delphi
flaarBiiutiTGUB на рассылк”
нашнк ciai&ii
_ааз e-m疝 Q ок]
Полный crtMCQK статей
> Приветствую всех поеетителейл искаеших материалы о программировании в Delphi и Pascal. Этет сайт должен быть полевным для программистов разных уровней. Здесь подобрано много уникальных авторских статей о програнмироваиим, которым Вы не встретите на других сайтах сети}
.Друзьа с 蛆та*
|Гсяйгсоад*м:1
[•о「витойГ|
ПрсГ{ММ«
» Теперь Вы можете рааместить ВАЗУ РЕКЛАМУ у нас на сайге! (В нижней вго части). 8ы можете разместить рекламу любого формата (включая Flash и HTML) и любого раамера. Все это очень дешево!! За подробностями обращайтесь ко /не
nO4!V,
Попучм」0_00 _посстмтап・Р
。Хотите получать на свой e-mail лучшие статьи сайта 伙丫川冲由阿 旧/1&弱揄工■ а также обэор остальных новинок?? Коначмо - ДА1Н Тогда подпишитесь на рассылку сайга.
Новости "Development и Дельфи"
■^Ий^^Т; *
d
/ .“у旨."A-' Оат«нйвитъ Обновив
«3 Development м Летвм > Курс мл'хндмянсго протрлмниста о Delphi - Мюшзп" Inleinet Ехркм9t
w空.
Помс<- Нафанов 氷吗мПенге
HQQ
Development
I ^^ и Дельсрц
СНИЖЕНИЕ ЦЕН на регистрацию домена
Сейчас на сайте: S | Пвставмть эакл*л<г [ Сдесат стартовой
борун Конкурс Стеу. Добавуь еизо Учн” Аепебм Уунн Р w; hoc1rpeмщ Еагсомехта 2мбр Crwwi* Гсвеваа
[ingrau ] I назад ]巫宫小叫St业ияНея[ingrau ] I назад ]巫宫小叫St业ияНеяИСАпнщятЕсь га naccdcxvИСАпнщятЕсь га naccdcxvpauj 8-madpauj 8-madок,ок,m〃Ha〃 二飞1 二 pk ciaicRm〃Ha〃 二飞1 二 pk ciaicR—j Друзья ссйтд:—j Друзья ссйтд:Пспнчх」пап поггтхгсщАГолуткт。уод.гзше" ггопк” ]Пспнчх」пап поггтхгсщАГолуткт。уод.гзше" ггопк” ].-КонкурсПлА*«»ггякы *гпм*г*пгм>.-КонкурсПлА*«»ггякы *гпм*г*пгм>g .аз, £п9ем*4ГФ«^ч» > 勘 wa OriDbig .аз, £п9ем*4ГФ«^ч» > 勘 wa OriDbiКурс начинающего программиста в DelphiКурс начинающего программиста в DelphiДанный раадел првдназнамен для обучения лрограмнирован^^ю в среде Delphi. Здесь вы сможете наАш описание есех основных составляющих программирования на Delphi. Изумив все главы, приведенные ниже, бы сножеге написать свое первое приложение (если вы конечно мн разу не программировали на Дельфи).Данный раадел првдназнамен для обучения лрограмнирован^^ю в среде Delphi. Здесь вы сможете наАш описание есех основных составляющих программирования на Delphi. Изумив все главы, приведенные ниже, бы сножеге написать свое первое приложение (если вы конечно мн разу не программировали на Дельфи).В данном рааделв подобраны статьи и пособия для наминающих. Многие ив них состоят из нескольких страниц, 1ак что нв юропитвсь, дочмгайте до конца〕Если у Вас есть вопрос, когпрый должен быть освещен е данном разделе, го <^ШИ19 Е“е и я напишу материал по этому поводуВ данном рааделв подобраны статьи и пособия для наминающих. Многие ив них состоят из нескольких страниц, 1ак что нв юропитвсь, дочмгайте до конца〕Если у Вас есть вопрос, когпрый должен быть освещен е данном разделе, го <^ШИ19 Е“е и я напишу материал по этому поводуЗпектрпннын кнн, s н v“h6”k/ по D.elphl 二 Ьесил^тндя д<1Грузкп FlrulFirsl * поисковая снстема по Делфи с базоВ данных в 3000 доумеятов"Зпектрпннын кнн, s н v“h6”k/ по D.elphl 二 Ьесил^тндя д<1Грузкп FlrulFirsl * поисковая снстема по Делфи с базоВ данных в 3000 доумеятов"Основы программмроваим**痴н»м• Подстыв тип» данныхОсновы программмроваим**痴н»м• Подстыв тип» данных■ t・ Интернат■ t・ ИнтернатzJzJ
[ingrau ] I назад ]巫宫小叫St业ияНея
[ingrau ] I назад ]巫宫小叫St业ияНея
ИСАпнщятЕсь га naccdcxv
ИСАпнщятЕсь га naccdcxv
pauj 8-mad
pauj 8-mad
ок,
ок,
m〃Ha〃 二飞1 二 pk ciaicR
m〃Ha〃 二飞1 二 pk ciaicR
—j Друзья ссйтд:
—j Друзья ссйтд:
Пспнчх」пап поггтхгсщА
Голуткт。уод.гзше" ггопк” ]
Пспнчх」пап поггтхгсщА
Голуткт。уод.гзше" ггопк” ]
.-Конкурс
ПлА*«»ггякы *гпм*г*пгм>
.-Конкурс
ПлА*«»ггякы *гпм*г*пгм>
g .аз, £п9ем*4ГФ«^ч» > 勘 wa OriDbi
g .аз, £п9ем*4ГФ«^ч» > 勘 wa OriDbi
Курс начинающего программиста в Delphi
Курс начинающего программиста в Delphi
Данный раадел првдназнамен для обучения лрограмнирован^^ю в среде Delphi. Здесь вы сможете наАш описание есех основных составляющих программирования на Delphi. Изумив все главы, приведенные ниже, бы сножеге написать свое первое приложение (если вы конечно мн разу не программировали на Дельфи).
Данный раадел првдназнамен для обучения лрограмнирован^^ю в среде Delphi. Здесь вы сможете наАш описание есех основных составляющих программирования на Delphi. Изумив все главы, приведенные ниже, бы сножеге написать свое первое приложение (если вы конечно мн разу не программировали на Дельфи).
В данном рааделв подобраны статьи и пособия для наминающих. Многие ив них состоят из нескольких страниц, 1ак что нв юропитвсь, дочмгайте до конца〕Если у Вас есть вопрос, когпрый должен быть освещен е данном разделе, го <^ШИ19 Е“е и я напишу материал по этому поводу
В данном рааделв подобраны статьи и пособия для наминающих. Многие ив них состоят из нескольких страниц, 1ак что нв юропитвсь, дочмгайте до конца〕Если у Вас есть вопрос, когпрый должен быть освещен е данном разделе, го <^ШИ19 Е“е и я напишу материал по этому поводу
Зпектрпннын кнн, s н v“h6”k/ по D.elphl 二 Ьесил^тндя д<1Грузкп FlrulFirsl * поисковая снстема по Делфи с базоВ данных в 3000 доумеятов"
Зпектрпннын кнн, s н v“h6”k/ по D.elphl 二 Ьесил^тндя д<1Грузкп FlrulFirsl * поисковая снстема по Делфи с базоВ данных в 3000 доумеятов"
Основы программмроваим*
*痴н»м
• Подстыв тип» данных
Основы программмроваим*
*痴н»м
• Подстыв тип» данных
■ t・ Интернат
■ t・ Интернат
zJ
zJ
Рис. 18.6. Страница сайта "Development и Дельфи**,содержащая электронные книги и пособия no Delphi
ры программ, FAQ (ответы на часто задаваемые пользователями вопросы) и другую информацию (рис. 18.7).
На сайте имеется страница, содержащая учебники и справочные пособия по Delphi, которые можно скачать (рис. 18.8).
Сайт "Королевство Delphi ——виртуальный клуб программистов" расположен в сети по адресу http://www.delphikjngdom.ru. Здесь находится ряд статей и обзоров книг по программированию в Delphi, сборник решений задач, часто задаваемые вопросы, информация о ресурсах сети по программированию и многое другое (рис. 18.9).
Сайт "Delphi по-русски — Delphi for Russian1' находится в сети по адресу http://atrussk.ru/delphi. Данный сайт содержит on-line (доступный при подключении к Интернету) справочник по использованию стандартных процедур и функций в Delphi (рис. 18.10).
Сайт мМастера DELPHI** расположен в сети по адресу http://delphi.mastalcru. Здесь можно найти статьи и книги по программированию, исходные тексты программ, сборник часто задаваемых вопросов, ссылки на другие сайты (рис. 18.11). Для нахождения нужной информации на сайте имеется собственная поисковая система.
15 Зак 1068
Рис. 18.7. Главная страница сайта "Все для Delphi программиста"
Рис. 18.8. Страница сайта иВсе для Delphi программиста", содержащая учебники и справочники no Delphi
Рис. 18.9. Главная страница сайта "Королевство Delphi — виртуальный клуб программистов"
НовоствНовоствНовостиНовостиПрограммыПрограммыСпециальное предпо»<>ние1 В период эюдиеное и летней сессииСпециальное предпо»<>ние1 В период эюдиеное и летней сессии• flCMEM jTJlgpy.• flCMEM jTJlgpy.CllpArt программистеCllpArt программистеOn-line слриеочники MindowiOPt DELPHIOn-line слриеочники MindowiOPt DELPHIFAQ WindowsAPl DELPHIFAQ WindowsAPl DELPHIЭвкв> печатного справочникаDelphi си сжидаЗ 25%Эвкв> печатного справочникаDelphi си сжидаЗ 25%Добро пожаловать!Добро пожаловать!
Новоств
Новоств
Новости
Новости
Программы
Программы
Специальное предпо»<>ние1 В период эюдиеное и летней сессии
Специальное предпо»<>ние1 В период эюдиеное и летней сессии
• flCMEM jTJlgpy.
• flCMEM jTJlgpy.
CllpArt программисте
CllpArt программисте
On-line слриеочники MindowiOPt DELPHI
On-line слриеочники MindowiOPt DELPHI
FAQ WindowsAPl DELPHI
FAQ WindowsAPl DELPHI
Эвкв> печатного справочника
Delphi си сжидаЗ 25%
Эвкв> печатного справочника
Delphi си сжидаЗ 25%
Добро пожаловать!
Добро пожаловать!
ЮЕЗЮЕЗПек』” ti«>(»ч< v*w Dclptw leu fh,i、,en On lion <.1Ц>«1П<*чимк Pcljthi 4 31, Mtt.tni<>ll Inlninrl ( biiIixvi
ЮЕЗ
ЮЕЗ
酔M:g[题理*| 第丽騒Т 貝宏発2Д溶噂宅济選萱疝京二4/G2ER
Уважаемая фирма Borland, создав свои эанвчательныи продукт Delphi, как всегда обошла стороной русских поограмнистов. Проработав программистом на Delphi с самого момента появления его 1-й верочи и до того моивнта. когда наконец-то мялся 2a этот проект, я деже и не подозревал с существовании многих стандартных функций и процедур. И сколько времени было потрачено, на написание подобия того, что изначально предоставлено самими разработчикамн Deloht. Поначалу подводили >нания амгпийаого хзмка, а потом zawa привычная росси宓скал пень-натушха. Да и сколько времени нужно копаться по hdo—z, чтобы найти нужную функцию? А может такой и вообще не существует. Иногда проще написать дееяюк строк хода, чек один раз нажать (F1] (и угробить пол-маса на бесплодные поиски).
Думаем, 5。данный проект будет лопе)ан тем. хю только начал осваивать Delphi, де и облегчит жизнь "матерым программерам" Даешь больше времени ха пиво!:)
I Новости I Поиск I FAQ | Статьи [ Книги | Новое VCL | Обучение | Форумы | — I ЧАТ [О/ешни»^ Клл/ 'ивке . Сайты , СогЪа | DelphtGFX
<9 Мастера DELRII (доканаю лция. ис жад ники, скачет»] ♦ М蛇,а*<Я1 IntcmM F хркмог
Мастера DELPHI
画
Как видно иэ названия, этот сайт посвящен Delphi. Создавая его. мы поставили себе цель сделать не веще один сайт по Delphi", а мечте универсальное, что дейстеительно поможет программисту именно тогда, когда это необходимо
Смрмпты дп« дднинистрАтпра I Windaws. Специальный
Ра>.сг1гн»
Здесь не только много полезной и интересной информации (советы, стагьи. подсказки, волросы-огвети, конференция), но и еще обширней Русскоязычный каталог Delphi ресурсов. Есть универсальная поисковая система no bsmv ca〃iv. Вам не нужно больше тратить свое время на поиск в Интернете ответа на свой вопрос, затрачивая часы на перебор рез\гЛьгато& поиска какого-нибудь Рамблера. Если у Вас есть сайт по 味;“ Добавьте его е наш каталог!
Вини^лре* Вз можете подписэтъс* на назу рассылку х получать ежедневно мА csoA emeil ноеостн сдйт4, но0осп< х“р・ компонент, лучший в опрос-ответ кроке того...
новые- ксмпспеть
Над сайюм грудится цапая группа программистов, делая его интересным и полезным. На сайте ежедневно появляется uto-tq новое. Если у вас есть дос гул в internet, немного свободного времени ”
желание notnoub боатьям по cov*hq ^Delohi
PBPrevlewDlalog v.4.30.00.00 (28lcb)
PBGf#n°m、i・!rt6jrt“ и РВ0б・еРгсж~1〃|сд s-с |.сипоме»<гы днвлогл C"n'f*A・,0 е 、74>*р《 AChHZH ИрФДССМОТрОЯ ГпйПНОЙ..
пишите Г
U Hp,hQMNd“rT
CU+UZdJinClUb
」J
Рис. 18.11. Главная страница сайта "Мастера DELPHI"
Сайт DelphiN находится в Интернете по адресу http://delphinsworid.narod.ru. Здесь можно найти книги, статьи по программированию, примеры исходных кодов и готовые программы на Delphi, есть поисковая система и многое другое (рис. 18.12). Особый интерес представляет онлайновая система перевода, которая может быть очень полезна при чтении справочной системы Delphi, написанной по-английски.
Сайт "Уголок Delphi-программнста" находится по адресу http:// www.delphiiigolok.narod.nl. Целью автора данного сайта было собрать на нем в концентрированном виде наиболее интересную и полезную информацию по программированию в Delphi из уже имеющейся в сети (рис. 18.13). Информация, имеющаяся на сайте, может представлять интерес для программистов самого разного уровня: от начинающих до опытных.
Сайт "Delphi32 — все о Дельфи** расположен в сети по адресу http://delphi*- 32.narod.ru. Этот сайт посвящен программированию в различных версиях системы Delphi, начиная с первой и заканчивая шестой (рис. 18.14). Здесь в разделе Статьи наряду со статьями имеется хорошая подборка учебных и справочных пособий по Delphi.
Сайт “Borland X Portal" находится в Интернете по адресу http:// borland.xportal.ru. На данном сайте содержится много информации по рабо-
Рис. 18.12. Главная страница сайта "DelphiN"
Рис. 18.14. Страница сайта ,fDelphi32 — все о Дельфи", посвященная статьям, учебным и справочным пособиям по Delphi
те с различными программными продуктами фирмы Borland, включая, естественно, и Delphi (рис. 18.15). Особо хотелось бы отметить подборку рецензий на различную литературу по программированию.
Естественно, что перечисленным ранее не исчерпывается все богатство материалов по системе программирования Delphi, имеющихся во всемирной информационной сети. Но надеемся, что данный перечень может стать основой и путеводителем для всех желающих совершенствоваться путем самообразования в такой интересной и полезной профессии, как программирование.
ГЛАВА 19
Ответы и решения к заданиям
В данной главе приводятся ответы и решения ко всем заданиям, приведенным в книге в главах с 3 по 10 и с 13 по 16.
Глава 3
I Задание 1
program z3_l;
Uses Crt;
begin
ClrScr;
Textcolor(Magenta);
TextBackground(LightGray);
writein(•Существуют следующие основные вида программного обеспечения *);
writein('персональных компьютеров:');
writein(1) Системные программы*);
writein('2) Прикладные программы');
writein(*3) Инструментальные системы или системы программирования1); readln
end.
i Задание 2
Textcolor(green);
writein (** 1);
writein(****1);
writein(1♦****•);
writein(•*******');
writein(***********);
writein(* ************);
writein(* ****»***♦*♦*»*);
wrjtein(1 *************** т)•
readln
end.
Задание 3Задание 3
Задание 3
Задание 3
program z3_3;Uses Crt;program z3_3;Uses Crt;varcl,ml,c2,m2,c3.m3,r,tl, t2: integer;varcl,ml,c2,m2,c3.m3,r,tl, t2: integer;beginClrScr;writein('Введите writein('Введите readln(cl);writein(1Введите readln(ml);writein(* Введите writein('Введите readln(c2);write in(* Введите readln(m2);beginClrScr;writein('Введите writein('Введите readln(cl);writein(1Введите readln(ml);writein(* Введите writein('Введите readln(c2);write in(* Введите readln(m2);начальное время1);часы, затем нажмите клавишу Enter');начальное время1);часы, затем нажмите клавишу Enter');минуты, затем нажмите клавишу Enter*);минуты, затем нажмите клавишу Enter*);конечное время *};часы, затем нажмите клавишу Enter*);конечное время *};часы, затем нажмите клавишу Enter*);минуты, затем нажмите клавишу Enter');минуты, затем нажмите клавишу Enter');tl :=cl*60+inl; t2:=c2*60+m2;r:=t2-tl;c3:=r div 60; m3:=r mod 60;writein (* Между начальным и конечным моментами времени *); writein('прошло *,сЗ,* ч ',тЗ.・ мин*); readln end.tl :=cl*60+inl; t2:=c2*60+m2;r:=t2-tl;c3:=r div 60; m3:=r mod 60;writein (* Между начальным и конечным моментами времени *); writein('прошло *,сЗ,* ч ',тЗ.・ мин*); readln end.
program z3_3;
Uses Crt;
program z3_3;
Uses Crt;
var
cl,ml,c2,m2,c3.m3,r,tl, t2: integer;
var
cl,ml,c2,m2,c3.m3,r,tl, t2: integer;
begin
ClrScr;
writein('Введите writein('Введите readln(cl);
writein(1Введите readln(ml);
writein(* Введите writein('Введите readln(c2);
write in(* Введите readln(m2);
begin
ClrScr;
writein('Введите writein('Введите readln(cl);
writein(1Введите readln(ml);
writein(* Введите writein('Введите readln(c2);
write in(* Введите readln(m2);
начальное время1);
часы, затем нажмите клавишу Enter');
начальное время1);
часы, затем нажмите клавишу Enter');
минуты, затем нажмите клавишу Enter*);
минуты, затем нажмите клавишу Enter*);
конечное время *};
часы, затем нажмите клавишу Enter*);
конечное время *};
часы, затем нажмите клавишу Enter*);
минуты, затем нажмите клавишу Enter');
минуты, затем нажмите клавишу Enter');
tl :=cl*60+inl; t2:=c2*60+m2;
r:=t2-tl;
c3:=r div 60; m3:=r mod 60;
writein (* Между начальным и конечным моментами времени *); writein('прошло *,сЗ,* ч ',тЗ.・ мин*); readln end.
tl :=cl*60+inl; t2:=c2*60+m2;
r:=t2-tl;
c3:=r div 60; m3:=r mod 60;
writein (* Между начальным и конечным моментами времени *); writein('прошло *,сЗ,* ч ',тЗ.・ мин*); readln end.
Задание 4Задание 4
Задание 4
Задание 4
program z3_4;
Uses Crt;
const
p=3.1416;
var
г.l,s:real;
begin
ClrScr;
writein(•Введите ралиус окружности *);
readln(г);
1:=2*р*г;
s:=p*r*r;
writein(1 Длина окружности равна *,1:7:2);
writein('Площадь круга равна',s:7:2); readln
end.
Задание1^ 1
program z3_5;
Uses Crt;
var
kgl,kg2.kg3:integer;
rl,r2f r3r cl,c2,сЗ/stl,st2r st3rstoim:real;
begin
ClrScr;
writeIn(1 Введите количество купленного картофеля (в кг)1); readln(kgl);
writein(*Введите стоимость 1 кг картофеля в рублях и копейках,1);
writein(* сначала введите рубли и нажмите клавишу Enter,1);
writein(* затем копейки и нажмите Enter*); readln(rl); readln(cl);
writeln(1Введите количество купленных огурцов (в кг)•);
readln(kg2);
writein('Введите стоимость 1 кг огурцов в рублях и копейках,1);
writein(•сначала введите рубли и нажмите клавишу Enter,1);
writeIn(1 затем копейки и нажмите Enter1);
readln(r2); readln(с2);
writein(введите количество купленных помидоров (в кг)1);
readln(kg3);
writein('Введите стоимость 1 кг помидоров в рублях и копейках,'); writeIn('сначала введите руОли и наталите клавишу Enter,*);
writein(*затем копейки и нажмите Enter *);
readln(r3); readln(сЗ);
st1: = {rl+cl/100)* kgl;
st2:=(r2+c2/100)*kg2;
st3:=(r3+c3/100)*kg3;
stoim:^stl+st2+st3;
writein(*Общая стоимость покупки составляет '.stoim: 6:2,' руб *); reaclln
end.
Глава 4
\ Задание 1.—〔;.宁貰个囈三]
program z4_l; Uses Crt; var
n:integer;
begin
ClrScr;
writein(1Введите целое число'); readln(n);
if n mod 5 =0 then writein(1 Введенное число делится на 5*) else writeIn{1 Введенное число не делится на 5');
readln end.
i Задание 2
program z4_2;
Uses Crt;
var
n:integer;
begin
ClrScr;
writein(1Введите целое число1);
readln(n);
if (n>0) and (n mod 2 =0)
then writeLn(1число является одновременно положительным и четным*) else writein(1число не является одновременно положительным и
U четным*);
readln
end.
Задание 3
program z4_3;
Uses Crt;
var
so,sk,nfс:integer;
begin
ClrScr;
writein(* Введите номер зоны для станции отправления *); readln(so);
writein(1 Введите номер зоны хщя конечной станции *); readln(sk);
if sk>so then n:=sk-so
else n:=so-sk;
c:=n*3;
writein(1Стоимость проезда составляет •,с,1 руб*);
readln
end.
Задание 4
program z4_4;
Uses Crt;
var
so.sk,n.c,k:integer;
begin
ClrScr;
writein(1Выберите вид приобретаемого билета *);
writein('Для writein(* 1 - writein(*2 - writein(13 - readln(k);writein('Для writein(* 1 - writein(*2 - writein(13 - readln(k);осуществления выбора нажмите соответствующую цифру:');осуществления выбора нажмите соответствующую цифру:');длядляДЛЯДЛЯдлядляпокупки покупки покупкипокупки покупки покупкибилета в один конец'); билета в оба конца'); месячного билета');билета в один конец'); билета в оба конца'); месячного билета');
writein('Для writein(* 1 - writein(*2 - writein(13 - readln(k);
writein('Для writein(* 1 - writein(*2 - writein(13 - readln(k);
осуществления выбора нажмите соответствующую цифру:');
осуществления выбора нажмите соответствующую цифру:');
для
для
ДЛЯ
ДЛЯ
для
для
покупки покупки покупки
покупки покупки покупки
билета в один конец'); билета в оба конца'); месячного билета');
билета в один конец'); билета в оба конца'); месячного билета');
writein(* Введите readln(so);writein('Введите readln(sk);writein(* Введите readln(so);writein('Введите readln(sk);номер эоны для станции отправления');номер эоны для станции отправления');номер зоны для конечной станции *);номер зоны для конечной станции *);if sk>so then n:=sk-so else n:=so-sk;case k ofif sk>so then n:=sk-so else n:=so-sk;case k of1:2:3: end;1:2:3: end;c:=n*3;c:=(n*3)*2;c:=(n*3)*15;c:=n*3;c:=(n*3)*2;c:=(n*3)*15;writein(*Стоимость проезда составляет ・,с,' руб1}; readlnend.writein(*Стоимость проезда составляет ・,с,' руб1}; readlnend.
writein(* Введите readln(so);
writein('Введите readln(sk);
writein(* Введите readln(so);
writein('Введите readln(sk);
номер эоны для станции отправления');
номер эоны для станции отправления');
номер зоны для конечной станции *);
номер зоны для конечной станции *);
if sk>so then n:=sk-so else n:=so-sk;
case k of
if sk>so then n:=sk-so else n:=so-sk;
case k of
1:
2:
3: end;
1:
2:
3: end;
c:=n*3;
c:=(n*3)*2;
c:=(n*3)*15;
c:=n*3;
c:=(n*3)*2;
c:=(n*3)*15;
writein(*Стоимость проезда составляет ・,с,' руб1}; readln
end.
writein(*Стоимость проезда составляет ・,с,' руб1}; readln
end.
Uses Crt;constUses Crt;const
Uses Crt;
const
Uses Crt;
const
n=25;
var
i,k,r:integer;
begin
ClrScr;
k:=0; {к - счетчик количества студентов, удовлетворяющих заданному условию}
writein(программа подсчета количества кандидатов в баскетбольную 电 команду*);
for i:=l to n do
begin
writein(•Введите рост ',i,' студента1);
readln(г);
if r>=175 then k:=k+l
end;
writein(1 Количество кандидатов в баскетбольную команду1);
writein('в данной группе равно •,к);
readln
end.
j Задание 2j Задание 2
j Задание 2
j Задание 2
program z5_2;
Uses Crt;
const
n-5;
var
i:integer; d,sfp:real;
begin
ClrScr;
writein(1 Введите исходную сумму вклада1);
readln(s);
writein(1Введите ежегодный процент по вкладу');
readln(р);
for i:=l to n do begin
d:«s*p/100;{подсчет дохода по вкладу за год}
s:=s+d {подсчет общей суммы вклада по истечении очередного года) end;
writein(1Общая сумма вклада по истечении срока хранения1);
writein('составит •fs:8:2,' руб*); readln
end.
[Задание 3|
program z5_3;
Uses Crt;
const
s=1000000;
var
i,k:longint;
begin
ClrScr;
i:=1; {i - номер клетки на доске}
k:=l; {k - количество зерен на одной клетке доски} repeat
k:=k*2;
i:=i+l
until k>s;
writein(* Количество зерен превысит один миллион на *,i,* клетке•); writein('шахматной доски *); readln
end.
Задание 4
program z5 4;
Uses Crt;
var
i,kf s:longint;
begin
ClrScr;
i:=1; (i - номер клетки на доске}
k:=l; {k - количество зерен на одной клетке доски}
s:в1; {общее количество зерен, находящееся на i клетках}
while s<=1000000000 do
begin
k^k*2;
i:=i+l; s:=s+k end;
writein(* Количество клеток, на которых в общей сложности разместится1);
writein (* более одного миллиарда зерен, составлет 1, i-» 1); readln
end.
Глава 6
Задание 1
program z6_l;
Uses Crt;
var
integer; flag:boolean; c:char; s:string;
begin
ClrSer;
flag:=true;
writeIn(* Введите число1);
readln(s);
1:=length(s);
for i:=l to 1 do
begin
c:=s[i J;
if (c<>*0*) and (co* 11) then flag:=£alse end;
if flag=true
then writein(1 введенное число является двоичным1)
else writein(* введенное число не является двоичным*); readln
end.
;Задание 2
program z6_2;
Uses Crt;
var
i,k,ks,1:integer; c:char; s:string;
begin
ClrScr;
writein(1 Введите строку. Ввод завершите нажатием клавиши Enter*); writein;
readln(s);
1:=length(s);
k:-0;{k - счетчик количества пробелов}
for i:= 1 to 1 do
begin c:=s[i]; if c=* • then k:=k+l end;
ks:=k+l;
writein;
writeIn(1 количество слов в данной строке составляет ’.ks); readln
end.
Задание 3
program z6_3;
Uses Crt;
var
irk# ks,l,n:integer; dl:real; c:char; s:st ring;
begin
ClrScr;
writein (* Введите строку. Ввод завершите нажатием клавиши Enter1); writein;
readln(s);
l:=length(s);
k:=0;{k - счетчик количества пробелов}
for i:= 1 to 1 do begin c:=s[i];
if c=, ' then k:-k+l end;
ks:=k+l;
n:=l-k; {n - количество символов в строке, не являющихся пробелами} dl:=n/ks;
writeIn;
writein(•Средняя длина слова в строке составляет '.dl:6:2.' символа1); readln
end.
[滋礴;砲"守籬安基源费它丁:一厂茨;三一交派7
program z6_4;
Uses Crt;
var
o:integer; s:string; с.к:char;
begin
ClrScr;
writein(*Введите текст исходного сообщения*);
readln(s);
l:=length(s);
writein;
writein (1 Зашифрованный текст выглядит следующим образом; 1);
writein;
for i:=l to 1 do
begin
c:=s [i];
o:=ord(c)-10;
x:=chr(o);
write(x)
end;
writein;
readln
end.
Глава 7
program z7_l;
Uses Crt;
var
i,kf n:integer; m:array[1..20] of integer; begin
ClrScr;
writein('Введите число элементов массива•);
readln(n);
k:=0;
writein;
for i:= 1 to n do
begin
writein('Введите *#i,1 элемент массива1);
readln(m[i]);
if m[i]>0 then k:ek+l end;
writein;
writein('Число положительных элементов в данном массиве равно ,,к); readln
end.
[задание;[задание;二三:二二二江二父工:Ш1二三:二二二江二父工:Ш1
[задание;
[задание;
二三:二二二江二父工:Ш1
二三:二二二江二父工:Ш1
program z7_2;
Uses Crt;
var
a,b,i,k,n:integer; m:array[1..25] of integer;
begin
ClrScr;
Randomize;
k:=0;
writein(*Введите количество элементов массива1);
readln(n);
writein(введите a");
readln(a);
writein(1Введите b1);
readln(b);
for i:=l to n do begin
m[ij:«random(50)+1;
write(m[i], • 4;
if (m(i]>=a) and (m(i]<=b) then k:=k+l end;
writein;
writein(* Количество элементов массива, значения которых находятся *); writein(* в диапазоне от *,а,* до ',Ь.‘ равно 〜к);
readln
end.
mkL—粽濟率耍龍•丁薛寿
program z7_3;
Uses Crt;
var
i,k,n:integer; a:array(l..20] of integer;
begin
ClrScr;
k:=0;
writein(*Введите число элементов массива*);
readln(n);
writein;
for i:=l to n do
begin
writein (1 Введите ', i,' элемент массива');
readln(a[i]);
if a[i]<0 then k:=i end;
for i:=l to n do
write(a(i]r •');
writein;
writelnf1Номер последнего по счету отрицательного элемента *);
writein(*равен •,к); readln
end.
I Задание 4
program z7_4;
Uses Crt;
var
afk:char; i,g:integer; mas:array[0..255] of integer;
begin
ClrScr;
writein(* Введите текстовую строку1);
writein(*Ввод всего текста заканчивайте нажатием клавиши "О",); writein;
repeat
read(а);
i:=ord(a);
mas[i] :=^5[i]+l;
until a=•01; {признак окончания ввода текста} readln;
g:=0;
writein;
writein (*B данном тексте встречаются следующие символы •);
writein (* следующее количество раз:1);
for i:=0 to 255 do
begin
if (mas[i]<>0) and (i<>48) then
(48 - код нуля в таблице ASCII)
begin g:=g+i; k:=chr(i);
if i<>32 (32 - код пробела в таблице ASCII}
then write(•м * r k,1M - 1f mas[i]r * I •) else write (•"пробели - \rnas [i],1 | •) end;
if g mod 5=0 then
begin gxl; writein end;
end;
readln
end.
Глава 8
i^t-^ -<<rL^^^
program z8_l;
Uses Crt;
var
a,brc:integer; s,p:real;
begin
ClrScr;
writeIn(1Введите длину первой из сторон треугольника•);
readln(а);
writein;
writein('Введите длину второй стороны треугольника'};
readln(Ь);
writein;
writeln(1Ввелите длину третьей стороны треугольника*);
readln(с);
writein;
р:=(а+Ь+с)/2;
s:=sqrt (р* (р-а) * (р-b) * (р-с));
writein(1Площадь треугольника равна •,s:8:2);
readln
end.
program z8_2;Uses Crt;varn,xf rlr r2:integer; r3:real;beginClrScr;writein(*Введите целое число1);readln(n);writein;writein(*Укажите операцию, которая будет производиться *};program z8_2;Uses Crt;varn,xf rlr r2:integer; r3:real;beginClrScr;writein(*Введите целое число1);readln(n);writein;writein(*Укажите операцию, которая будет производиться *};writein(*над writein;writein (*Для writein;writein(•1 - writein(*2 - writein(* 3 - readln(x);writein;writein(*над writein;writein (*Для writein;writein(•1 - writein(*2 - writein(* 3 - readln(x);writein;введенным числом*);введенным числом*);выбора введите соответствующую цифру:*);выбора введите соответствующую цифру:*);определение абсолютной величины числа 丨); возведение числа в квадрат');определение абсолютной величины числа 丨); возведение числа в квадрат');извлечение квадратногоизвлечение квадратногокорня1);корня1);case x1:case x1:2:2:3:3:ofbeginrl:==abs (n);writein(*Абсолютная величина end;beginr2:=sqr (n);writein(•Квадрат числа равен end;beginif n>=0 thenofbeginrl:==abs (n);writein(*Абсолютная величина end;beginr2:=sqr (n);writein(•Квадрат числа равен end;beginif n>=0 thenчисла равна \ rl)числа равна \ rl)'"2)'"2)
program z8_2;
Uses Crt;
var
n,xf rlr r2:integer; r3:real;
begin
ClrScr;
writein(*Введите целое число1);
readln(n);
writein;
writein(*Укажите операцию, которая будет производиться *};
program z8_2;
Uses Crt;
var
n,xf rlr r2:integer; r3:real;
begin
ClrScr;
writein(*Введите целое число1);
readln(n);
writein;
writein(*Укажите операцию, которая будет производиться *};
writein(*над writein;
writein (*Для writein;
writein(•1 - writein(*2 - writein(* 3 - readln(x);
writein;
writein(*над writein;
writein (*Для writein;
writein(•1 - writein(*2 - writein(* 3 - readln(x);
writein;
введенным числом*);
введенным числом*);
выбора введите соответствующую цифру:*);
выбора введите соответствующую цифру:*);
определение абсолютной величины числа 丨); возведение числа в квадрат');
определение абсолютной величины числа 丨); возведение числа в квадрат');
извлечение квадратного
извлечение квадратного
корня1);
корня1);
case x
1:
case x
1:
2:
2:
3:
3:
of
begin
rl:==abs (n);
writein(*Абсолютная величина end;
begin
r2:=sqr (n);
writein(•Квадрат числа равен end;
begin
if n>=0 then
of
begin
rl:==abs (n);
writein(*Абсолютная величина end;
begin
r2:=sqr (n);
writein(•Квадрат числа равен end;
begin
if n>=0 then
числа равна \ rl)
числа равна \ rl)
'"2)
'"2)
begin
r3:=sqrt (n);
writein(1 Квадратный корень числа равен •,r3:8:3) end else begin writeIn(*Число отрицательное');
writeIn(1 квадратный корень из него не извлекается *); end;
end;
end;
readln end.
^^^^^^^^^^^^^
program z8_3;
Uses Crt;
label 10; var
flag,n,x,rl,r2:integer; r3:real; t:string;
function c(s:string):boolean;
(Данная функция определяет, является ли исходная строка символов целым числом.
Для этого определяется длина данной строки и затем для каждого символа, входящего в строку, проверяется, относится ли он к последовательности символов от 0 до 9} var
.k:integer;
begin
c:=true;
k:-length(s);
for i:=l to k do
if (s[i]<>'0‘)and (s[i]<>'l・)and (s[i]<>*2•) and (s[i]<>*3*) and (s[i]<〉'4‘) and (s[i]<>'5‘) and (5[i]<>'6‘) and (s[i]<>'7‘) and (s[i]<>*8*) and (s[i]<>*9,) then c:=false
end;
begin
ClrScr;
10: writeln(* Введите целое число');
readln(t); {число вводится как строковая величина} writein;
if с(t)«true then val(trn,flag)
{В том случае, если введенная величина деиствительно является целым числом, то она преобразуется посредством процедуры из строкового типа в целочисленный}
else
begin
writein(1Введенная величина не является целым числом*); goto 10 end;
writein(1 Укажите операцию, которая будет производиться1);
writein(*над введенным числом');
writein;
writein(*Для выбора введите соответствующую цифру:*); writein;
writein(* 1 一 определение абсолютной величины числа*);
writein(*2 - возведение числа в квадрат*);
writein(*3 - извлечение квадратного корня');
readln(х);
writein;
case х of
begin
rl:=abs(n);
writein('Абсолютная величина числа равна ’.rl) end;
begin
r2:=sqr(n);
writein(1Квадрат числа равен ‘,工2) end;
begin
if n>=0 then begin r3:=sqrt (n);
writein('Квадратный корень числа равен *, г3:8:3) end
else begin writein(* Число отрицательное *); writein(1 квадратный корень из него не извлекается1); end;
end;
end;
readln
end.
[Задание 4
program z8_4; Uses Crt;
ir k,x:integer; mas:array[1..20] of integer; flag:boolean; procedure prost(x:integer; var f:boolean);
var
j:integer;
begin
£:=true;
if (х=1) or (х=2) then exit;
{числа 1 и 2 заведомо являются простыми}
for j :=2 to х-1 do{в цикле перебираются все возможные}
if х mod j =0 then{делители числа кроме самого числа}
begin f:=false; exit end {и единицы)
end;
begin
ClrScr;
Randomize;
k:=0; (k - счетчик количества простых чисел}
writein(•Массив состоит из следующих элементов:•);
for i:=l to 20 do
begin
mas[i]:«random(99)+1;
write(raas[ij, * 1);
x:=mas [i];
prost(xz flag); {процедура определения того,) {является ли число простым} if flag=true then k:=k+l
end;
writein;
writein;
writein(1Количество элементов массива, являющихся простыми числами');
writein(•равно \ к); readln
end.
Задание 5. 一£
«...:二“х..…《^--.二; .Ь. 小..…...二зл.—““.一-«•„•«^•j.. л.....…з.........…;…….:・.二
program z8_5;
Uses Crt;
var
i:integer; flag:boolean;
procedure sov(к:integer; var f:boolean);
var
s, j:integer;
begin
f:=false;
s:=0;{s - сумма всех делителей числа}
for j:=1 to k-1 do
if к mod j =0 then s:=s+j;
(в случае нахождения очередного делителя числа прибавляем полученную величину к их общей сумме}
if k=s then f:=true
end;
begin
ClrScr;
writein(* Список совершенных чисел в интервале от 1 до 10000*); writein;
for i:=l to 10000 do
begin
sov(i,flag);
if flag=true then writein(i) end;
readln
end.
Глава 9
program z9_l;
Uses Crt;
var
k,l:integer; t:text; In:string[60];
begin
Clrscr;
k:=0;
assign (t, *A: \tekst.txt');
rewrite(t);
writein(•Вводите текст. Ввод каждой строки заканчивайте нажатием .Enter*);
writein;
writein(*Для завершения ввода текста в файл в коьще последней строки•); writein('данного текста введите символ * *); writein;
repeat
readln(In);
writein(t,In);
k:=k+l;
l:=length(ln)
until ^[1]=**•;
writein;
writein(*Ввод текста в файл на дискете завершен *);
writein(1 общее количество строк во введенном тексте равно *,к);
close (t); readlnend.close (t); readlnend.
close (t); readln
end.
close (t); readln
end.
program z9_2;
Uses Crt;
var
krl:integer; t:text; In,koi:string[80];
begin
Clrscr;
k:=0;
assign (tr • A:\tekst..txt*);
rewrite(t);
writeIn(1 Вводите текст. Ввод каждой строки заканчивайте нажатием
& Enter1);
writein;
writein(*Для завершения ввода текста в файл в конце последней строки *);
writein(*данного текста введите символ *');
writein;
repeat
readln(In);
writein(t,In);
k:=k+l;
1:*== length (In)
until ln[l]=**#;
str (k4-l, koi);
koi:=1 Количество строк в данном тексте равно *+kol;
writein(tr koi);
writein;
writein(1Ввод текста в файл на дискете завершен1);
writelnf1общее количество строк во введенном тексте равно 1гк+1);
close(t);
readln
end.
卩不麻丁丁一T》『一--一二
program z9_3;
Uses Crt;
var
i,nx s,x:integer; f:file of integer;
begin
ClrScr;
assign (f, 'A: \nurnber');
rewrite(f);
s:=0;
writein(1Укажите количество чисел, вводимых в файл•);
readln(п);
writein;
for i:=l to n do
begin
writein(* Введите ',i,' число *);
readln(x);
s:=s+x;
write(ffx)
end;
write(f,s);
writein;
writein(*Ввод данных завершен1);
writein;
writein(1В файле содержатся следующие числа1);
reset(f);
for i:=0 to n do
begin
read(f,x);
write(xf1 •)
end;
close (f);
readln
end.
I Задание 4
program z9_4;
Uses Crt;
var
irn#x:integer; g:string; u:file;
begin
ClrScr;
assign(u,*A:\contents');
rewrite (u);
writein (1 Укажите количество глав в книге *);
readln(n);
writein;
for i:=l to n do begin
writein(,Введите номер главы1);
readln(x);
blockwrite(u,x,1);
writein(* Введите название главы*);
readln(g);
blockwrite(u,g,1);
end;
close(u);
writein(•Ввод данных завершен*);
writein;
reset(u);
writein(*B файле "contents" содержится следующая информация о книге *); for i:=l to n do
begin
blcckread(u,x, 1);
write (' глава Lx,' 1);
blockread(u,g#1);
write(g);
writein
end;
close(u);
readln
end.
Глава 10
!Заданиеi' ', 丁' :"—'^,~ ".]
program zl0_l; Uses Crt;
type month= (error, jan, feb,mar, apr,inayr jun, jul, aug, sep, oct, nov, dec); var i:integer; name:string; mes:month;
begin
ClrSer;
writein('Введите название месяца *); readln(name);
if name=1 январь1 then mes:=jan;
if narae='февраль1 then mes:=feb;
if пате='март‘ then mes:=^nar; if name='апрель' then mes:=apr;
if патеп'май' then mes:may;
if name^'июнь * then mes:»jun;
if name=1 июль * then rnes:=jul;
if name= * август1 then mesi^aug;
if name=1 сентябрь * then mes:=sep;
if name=fоктябрь• then mes:=oct;
if пал1е=|ноябрь* then mes:=nov;
if name-* декабрь1 then mes:=dec;
case mes of
jan,feb,dec: writein(1На дворе зима*); шаг^арГгшау: writein(1Пришла весна1);
jun,jul^aug: writein(1Наступило лето1);
sep,oct,nov: writein(*За окном осень1);
else writein(*Такого месяца не существует *); end;
readln
end.
事痴丁一•華尹-уТ予戶《二芦广嗚产家干斐存手…]
program zl0_2;
Uses Crt;
label 10;
type
god=1600..2100;
var
n:god;
begin
CIrScr;
writein;
10: writein(*Введите номер года (с 1600 по 2100)'); readln (n};
if (n<1600) or (n>2100) then goto 10;
writein;
if n mod 100=0
then
if n mod 400=0 then writeln(*год високосный *) else writein(1 год невисокосный *)
else
if n mod 4 =0 then writein(* год високосный') else writein(1 год невисокосный');
readln
end.
国礴謬W^W 率殊蜜季S聲窶翼竊返碎鴉
program zl0_3;
Uses Crt;
label 10;
type uchen.ik= record
famr name: string;
mat,fiz,lit,ist,inos:integer end;
i,k:integer; srotvet:string; zap:uchenik; ved:file of uchenik;
begin
ClrScr;
assign (ved, *A: \vedomost');
rewrite (ved);
k:=0;
repeat
writein (* Введите фамилию ученика');
readln (zap. fam);
writein(1Введите имя ученика');
оценку по штематике');оценку по штематике');writein(*Введите readln(zap.mat); writein(•Введите readln(zap.fiz); writein(*Введите readln(zap.lit); writein(•Введитеwritein(*Введите readln(zap.mat); writein(•Введите readln(zap.fiz); writein(*Введите readln(zap.lit); writein(•Введитеreadln (zap. name);
оценку по штематике');
оценку по штематике');
writein(*Введите readln(zap.mat); writein(•Введите readln(zap.fiz); writein(*Введите readln(zap.lit); writein(•Введите
writein(*Введите readln(zap.mat); writein(•Введите readln(zap.fiz); writein(*Введите readln(zap.lit); writein(•Введите
оценку по физике');
оценку по литературе1);
оценку по истории');
readln(zap.ist); write (ved, zap);
k:=k+l;
ClrScr;
writein (1 Будете вводить данные по следующему ученику •);
writein(1 Введите "Да" или "Нет"');
readln (otvet);
if (otveto^a1) and (otveto*HeT*) then goto 10 until otvet=,HeT,;
ClrScr;
writein(•количество записей в файле равно 1,к);
writein;
writeLn(1Экзаменационная ведомость');
writein;
write(,Фамилия|Имя| Математика| Физика| ИсторияJ *);
writein(*Литература I•); write(•IIIII');
writein('I*);
reset(ved); for i:=0 to k-1 do begin read(ved,zap); write(zap.fam:11,11*,zap.name:11,*|*,zap.mat:11,*|,,zap.£iz:11.* I *); writein(zap.lit:11,•I *,zap.ist:11,•I *); end; close (ved); readln end.
Задание 4
program zl0_4;
Uses Crt; var
k:integer; c:cbar;
eng: set of *A*..*Z*; rus: set of *Ar..*Я*; cifra: set of *0'..*9*; leng: set of 'a1..*z*;
Irusl: set of *a*..*n'; lrus2: set of *р*..1 я*;
(В программе используются два множества строчных букв русского алфавита, т. к. в кодовой таблице ASCII эти буквы разбиты на две группы, находящиеся в разных частях таблицы и, следовательно, они не могут образовать единого непрерывного множества} begin
ClrScr;
cifra: = U0'・・ '9'];
eng: =「А1 • • Z J;
rus:^[•A1..*Я* ];
leng:^('a'..1z1];
lrusl:=[*3*..*n*];
lrus2:=[*p*..*h*];
writein(*Введите символ1);
readln(с);
writein;
if c in cifra then k:=l;
if c in eng then k:=2;
if c in rus then k:=3;
if с in leng then k:-4;if (c in Irusl) or (c in lrus2) then k:=5; case k ofif с in leng then k:-4;if (c in Irusl) or (c in lrus2) then k:=5; case k of1:2:3:4:5:1:2:3:4:5:writein(1данный символ wri.teln (• данный символ 2 алфавита*};writein(*данный символ & алфавита');writein(*данный символ & алфавита');writein('данный символwritein(1данный символ wri.teln (• данный символ 2 алфавита*};writein(*данный символ & алфавита');writein(*данный символ & алфавита');writein('данный символявляется цифрой1);является прописной буквой английскогоявляется прописной буквой русскогоявляется строчной буквой английскогоявляется строчной буквой русскогоявляется цифрой1);является прописной буквой английскогоявляется прописной буквой русскогоявляется строчной буквой английскогоявляется строчной буквой русскогоU алфавита,);U алфавита,);else writein(1данный символ не является ни цифрой.else writein(1данный символ не является ни цифрой.ни прописнойни прописнойend;end;readlnreadlnend.end.& буквой')& буквой')Глава 13На рис. 19.1 представлен возможный вариант графического интерфейса программы "Светофор".Глава 13На рис. 19.1 представлен возможный вариант графического интерфейса программы "Светофор".Рис. 19.1. Интерфейс программы "Светофор"Рис. 19.1. Интерфейс программы "Светофор"
if с in leng then k:-4;
if (c in Irusl) or (c in lrus2) then k:=5; case k of
if с in leng then k:-4;
if (c in Irusl) or (c in lrus2) then k:=5; case k of
1:
2:
3:
4:
5:
1:
2:
3:
4:
5:
writein(1данный символ wri.teln (• данный символ 2 алфавита*};
writein(*данный символ & алфавита');
writein(*данный символ & алфавита');
writein('данный символ
writein(1данный символ wri.teln (• данный символ 2 алфавита*};
writein(*данный символ & алфавита');
writein(*данный символ & алфавита');
writein('данный символ
является цифрой1);
является прописной буквой английского
является прописной буквой русского
является строчной буквой английского
является строчной буквой русского
является цифрой1);
является прописной буквой английского
является прописной буквой русского
является строчной буквой английского
является строчной буквой русского
U алфавита,);
U алфавита,);
else writein(1данный символ не является ни цифрой.
else writein(1данный символ не является ни цифрой.
ни прописной
ни прописной
end;
end;
readln
readln
end.
end.
& буквой')
& буквой')
Глава 13
На рис. 19.1 представлен возможный вариант графического интерфейса программы "Светофор".
Глава 13
На рис. 19.1 представлен возможный вариант графического интерфейса программы "Светофор".
Рис. 19.1. Интерфейс программы "Светофор"
Рис. 19.1. Интерфейс программы "Светофор"
16 Зак. 1068
j Программный код проекта нСветофор"
unit Unirl;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls;
type
TForml = class (TForm)
RadioGroupl: TRadioGroup;
Pane11: TPanel;
Label1: TLabel;
Label2: TLabel;
RadioButtonl: TRadioButton;
RadioButton2: TRadioButton;
RadioButton3: TRadioButton;
Buttonl: TButton;
Shape1: TShape;
Shape2: TShape;
Shape3: TShape;
procedure RadioButtonlClick(Sender: TObject); procedure RadioButton2Click(Sender: TObject); procedure RadioButton3Click(Sender: TObject); procedure ButtonlClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Forml: TForml;
implementation
{$R *.dfm}
procedure TForml.RadioButtonlClick(Sender: TObject); begin
Shape1.Brush.Color:=clRed;
Shape2.Brush.Color:=clSilver;
Shape3•Brush.Color:=clSilver;
end;
procedure TForml.RadioButton2Click(Sender: TObject); beg in
Shape2♦Brush.Color:=clYellow;
Shapel.Brush.Color:=clSiIver;
Shape3.Brush.Color:=clSilver;
end;
procedure TForml.RadioButton3Click(Sender: TObject); begin
Shape3.Brush.Color:=clGreen;
Shapel.Brush•Color:^clSilver;
Shape2.Brush•Color:=clSilver;
end;
procedure TForml.ButtonlClick(Sender: TObject); begin close
end;
end.
Глава 14
На рис. 19.2 представлен возможный вариант графического интерфейса программы "Ванкомат”.
Рис. 19.2. Интерфейс программы "Банкомат"
Программный код проекта "банкомат"
unit Unitl;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls;
type
TForml = class(TForm)
Label1: TLabe1;
Editi: TEdit;
Labe12: TLabel;
Label3: TLabel;
Panel1: TPanel;
Imagel: TImage;
Labe14: TLabe1;
Label5: TLabe1;
Label6: TLabel;
Labe17: TLabel;
Edit2: TEdit;
Edit3: TEdit;
EdiM: TEdit;
Edit5: TEdit;
Buttoni; TButton;
Button?: TButton;
Label8: TLabel;
Label9: TLabel;
procedure ButtonlClick(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
(Private declarations ) public
{ Public declarations } end;
var
Forml: TForml;
implementation
{$R *.dfm}
procedure TForml.ButtonlClick(Sender: TObject); begin close end;
procedure TForml.Button2Click(Sender: TObject); var siim, klOOO, k500, klOO, k50f
ostlOOO,ost500.ost100:integer;
begin
sum:^StrtoInt(Editl.Text);
kl000:=sum div 1000;
ostl000:=stun mod 1000;
k500:=ostl000 div 500;
ost500:=ost1000 mod 500;
kl00:=ost500 div 100;
ostlOO:^ost500 mod 100;
k50:=ostl00 div 50;
Edit2.Text:=InttoStr(kl000);
Edit3.Text:=InttoStr(k500);
Edit4.Text:=InttoStr(klOO);
Edit5.Text:=InttoStr(k50) end;
end.
Глава 15
На рис. 19.3 представлен возможный внешний вид графического интерфейса программы иКалендарь".
Программный код проекта "Календарь"
unit Unitl;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics. Controls, Forms. Dialogs, ExtCtrls, StdCtrls;
type
TForml = class (TForm)
Labe11: TLabe1;
Editl: TEdit;
Buttonl: TButton;
Label2: TLabel;
Label3: TLabel;
Panel1: TPanel;
Imagel: TImage;
Button2: TButton;
Button3: TButton;
procedure ButtonlClick(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Forml: TForml;
implementation
($R *.dfm}
procedure TForml.ButtonlClick(Sender: TObject); var k:integer;
begin
Labe 12 • Visible: =True;
Labe12.Caption: =1Данный год*;
Labe13.Visible:=True;
кi^StrtoInt(Editl.Text);
if к mod 100 <>0
then
if к mod 4 =0
then Labe13.Caption: ==1 является високосным1
else Labe13.Caption:«*не является вискосным* else
if к mod 400 =0
then Labe13.Caption:^fявляется високосным1
else Labe13.Caption: ='не является вискосным1 end;
procedure TForml.Button2Click(Sender: TObject); begin close end;
procedure TForml.Burton3Click(Sender: TObject); begin
Editl. Text: =1';
Label 2. Visible :=False;
Label 3 .Visible: =Fa Ise
end;
end.
Рис. 19.3. Интерфейс программы "Календарь"
Глава 16
На рис. 19.4 представлен возможный внешний вид графического интерфейса программы "Задача Фибоначчи1'.
Программный код проекта "Задача Фибоначчи"
unit Unitl;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls;
type
TForml = class(TFcrm)
Labe11:
TLabel;
Editl: TEdit;
Label2:
TLabel;
Label3:
TLabel;
Panel1:
TPanel;
Image 1:
T Image;
Buttonl
:TButton;
Button2
:TButton;
Button3
:TButton;
procedure ButtonlClick(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject);
private
{ Private declarations } public
{ Public declarations } encl;
var
Forml: TForml;
implementation
($R •.dfm}
procedure TForml.ButtonlClick(Sender: TObject); var k,n:integer;
function rab(m:integer):integer;
begin
if m=0
then rab:=l
else
if m=l
then rab:=2
else rab:=rab (m-2) +rab (m-1)
end;
begin
n:=StrtoInt(Editl.Text);
k:=rab(n)*2;
Label2.Visible:=True;
Label2.Width:=200;
Labe12.Caption:=•по прошествии указанного времени количество кроликов I составит *+InttoStr(к);
end;
procedure TForml.Button2Click(Sender: TObject);
begin
close
end;
procedure TForml.Button3Click(Sender: TObject);
begin
Edit1.Text:=*1;
Label2.Visible:=False;
Labe 12 .Captions"1;
end.
Рис. 19.4. Интерфейс проекта “Задача Фибоначчи"
ПРИЛОЖЕНИЕ 1
Приемы работы в среде Turbo Pascal
На начальном этапе работы в среде Turbo Pascal вполне достаточно тех приемов, которые были даны в книге, однако для эффективной работы этого бывает часто не достаточно. В таком случае следует освоить приведенные в этом приложении новые приемы, в частности, автоматический запуск среды программирования, ускоренный ввод текста, обращение и получение информации из справочной системы, а также использован^ во время работы нескольких окон.
П1.1. Автоматический запуск системы программирования
В первых главах книги мы говорили о том, как правильно запускать среду программирования Turbo Pascal. Но опытный пользователь может настроить файловую оболочку (например, Norton Commander) таким образом, что при обращении к файлу, содержащему текст программы на языке Паскаль, соответствующая среда программирования будет запускаться автоматически.
Если пользователь работает в файловой оболочке Norton Commander, то оболочку можно настроить таким образом: при двойном щелчке мышью на файле с расширением pas или при выделении этого файла мышью и нажатии клавиши <Enter> данный файл будет сразу открываться в системе Turbo Pascal. Для этого нужно вызвать меню Norton Commander (далее даны команды для русскоязычной версии), нажав функциональную клавишу <F9>. Затем в строке меню нужно с помощью курсорных стрелок выбрать раздел Команды и нажать клавишу <Entei>. После нажатия клавиши появится ниспадающее меню, в котором аналогичным образом выбираем пункт Обработка расшире* ний и нажимаем клавишу <Enter>.
После нажатия клавиши <Enter> на экране компьютера появляется диалоговое окно, которое называется Изменение обработки расширения (рис. П1.1). С помощью этого окна можно изменять список расширений файлов, для обработки которых вызывается соответствующая программа (добавлять в этот список новые пункты, удалять их, а таюке редактировать). Для добавления нового пункта в список расширений нажимаем функциональную клавишу <F6>. Диалоговое окно увеличивается в размере и в нем появляется ряд полей, которые необходимо правильно заполнить.
Рис. П1.1. Окно изменения обработки расширения файла
В верхнем поле Тип (расширение) файла нужно ввести имя расширения —— pas (без точки). В среднем поле Команда обработки расширения нужно указать путь к приложению, которое должно запускаться вместе с файлом. Путь должен включать в себя имя диска, на котором находится файл, с двоеточием, имя каталога (подкаталогов), содержащего головной файл приложения, и имя самого головного файла. Имена каталогов отделяются от имени диска и от имени файла символом "\" (backslash или обратная косая черта). Например, если головной файл приложения находится на диске D: в каталоге ТР7, ТО В ДаННОМ ПОЛе НУЖНО ВВеСТИ: d:\TP7\turbo.
Далее в нижнем поле переключатель нужно установить в положение Имя файла с расширением и подтвердить сделанные изменения щелчком на экранной кнопке ОК. Закрытие диалогового окна производится нажатием на клавиатуре компьютера клавиши <Esc>. При этом пользователю сообщается о том, что в файл были внесены изменения, н для их подтверждения нужно щелкнуть в окне экранную кнопку Запись. После выполнения всех указан-
ных ранее действий любой файл с расширением pas будет открываться в системе Turbo Pascal. После открытия можно редактировать текст файла, запускать его на компиляцию, выполнение и т. д.
П1.2. Перемещение по тексту и редактирование текста
Для ускорения и облегчения ввода текста можно воспользоваться возможностями встроенного редактора системы. Его команды находятся в меню Edit. Этот редактор позволяет не только набирать текст программы, но и быстро перемещаться по тексту, а также вносить в него необходимые исправления. Данный раздел меню в раскрытом виде представлен на рис. П1.2.
Для начала успешной работы в редакторе разберем основные команды, позволяющие перемещаться по тексту. Перемещение курсора на одну позицию влево или вправо, либо на одну строку вверх или вниз осуществляется нажатием соответствующих клавиш со стрелками на клавиатуре. Для того чтобы переместиться по тексту не на один символ, а сразу на целое слово влево, нужно использовать сочетание клавиш <С1г1>+<стрелка влево>, для перемещения на одно слово вправо— <С1г1>+<стрелка вправо>. Если нужно перейти в начало текущей строки, нажимаем клавишу <Ноте>, переход в конец текущей строки производится нажатием клавиши <End>. Нажатие клавиши <Page Up> позволяет переместиться по тексту на один экран вверх, клавиши <Page Down> — на экран вниз. Программы на языке Паскаль могут быть достаточно большими по объему и не помещаться на одном экране. В таком случае, для того чтобы попасть в начало программы, нужно нажать комбинацию клавиш <Ctrl>+<Page Up>, а для того, чтобы переместиться в конец программы, нажать комбинацию <Ctrl>+<Page Down〉.
Кроме использования перечисленных ранее клавиш и их комбинаций для перемещения по тексту программы в ряде случаев удобно пользоваться мышью. В частности, для того чтобы установить курсор в любое место в пределах текущего экрана, достаточно поместить туда указатель мыши и сделать один щелчок левой кнопкой. Если программа имеет достаточно большой объем, то для просмотра ее содержимого с помощью мыши удобно использовать скрол- леры. Скроллером или полосой прокрутки называются полосы (на экране системы Turbo Pascal они бирюзового цвета), находящиеся справа или снизу от основной рабочей области экрана. На каждом из скроллеров находится небольшой прямоугольник, называема△刀〃»〃?ои или бегунком. Ухватившись указателем мыши за лифт и перетаскивая его вдоль с кроя л ера, можно быстро прокручивать текст программы как в вертикальном, так и в горизонтальном направлении.
и»и»Я Tuibo PatcalЯ Tuibo Patcalчислочислоreadlnreadln88Cl wrCl wrOS n2 n3OS n2 n3Рис. П1.2. Меню Edit среды Turbo PascalРис. П1.2. Меню Edit среды Turbo Pascalsun:=n1*n2*n3;writeIn(*Cyrna uh屮p знспа *,к,* равна *,sun);sun:=n1*n2*n3;writeIn(*Cyrna uh屮p знспа *,к,* равна *,sun);
и»
и»
Я Tuibo Patcal
Я Tuibo Patcal
число
число
readln
readln
8
8
Cl wr
Cl wr
OS n2 n3
OS n2 n3
Рис. П1.2. Меню Edit среды Turbo Pascal
Рис. П1.2. Меню Edit среды Turbo Pascal
sun:=n1*n2*n3;
writeIn(*Cyrna uh屮p знспа *,к,* равна *,sun);
sun:=n1*n2*n3;
writeIn(*Cyrna uh屮p знспа *,к,* равна *,sun);
Следующая группа операций, которую мы рассмотрим, — это операции корректировки. Процесс корректировки сводится к трем основным операциям. Это удаление ошибочно набранных символов и строк, перемещение фрагментов текста из одной части программы в другую или даже из одной программы в другую и копирование фрагментов программы. Перед тем как производить ту или иную операцию, следует предварительно выделить удаляемый, копируемый или перемещаемый фрагмент текста.
Выделение фрагмента во всех этих случаях производится одинаково. Курсор устанавливается на какой-либо символ, относящийся к выделяемому фрагменту, а затем при нажатой клавише <Shift> нажимается нужное количество раз клавиша <стрелка влево> или <стрелка вправо>. В результате соответственно выделенный фрагмент расширяется влево или вправо. При этом выделенный текст будет отображаться не на синем, а на сером фоне. В случае если выделяемый фрагмент содержит не одну строку или часть строки, а несколько строк, следует нажать нужное количество раз клавишу <стрелка вверх> или <стрелка вннз>, в результате чего выделенный фрагмент расширится вверх или вниз. Для выделения фрагмента можно использовать и мышь. Для этого следует при нажатой левой кнопке мыши "протащить11 указатель мыши по выделяемому фрагменту, а затем, когда выделение завершено, отпустить эту кнопку.
В том случае, если выделенный фрагмент текста необходимо удалить, для этого нужно раскрыть меню Edit и выбрать в нем пункт Clear (очистить) или нажать комбинацию клавиш <Ctrl>+<Del>. Если же нужно удалить только
одну строку, то для этого достаточно поместить курсор на удаляемую строку и нажать сочетание клавиш <Ctrl>+<Y>. При необходимости вставить перед текущей строкой дополнительную пустую строку следует воспользоваться комбинацией клавиш <Ctrl>+<N>.
Если же требуется выделенный фрагмент текста переместить либо скопировать, то пользуются буфером обмена. Буфером называется специальная область оперативной памяти компьютера, используемая для временного хранения различной информации. Принцип работы с буфером заключается в следующем: сначала в него заносится какая-либо информация, в частности фрагмент текста (который должен быть перед этим предварительно выделен). При перемещении фрагмента он сначала вырезается из того места программы, где он до этого находился, и помещается в буфер. Это выполняется командой Cut, находящейся в разделе Edit (аналогичный результат получим, нажав комбинацию клавиш <Shift>+<Del>). При копировании сам фрагмент остается на месте, а в буфер отправляется лишь его копия. Копирование фрагмента в буфер выполняется командой Сору из того же меню (либо комбинацией клавиш <Ctrl>+<Ins>). Затем, по команде вставки, информация, хранящаяся в буфере, вставляется в другое место данной программы или в другую программу, причем вставка производится туда, куда в данный момент установлен курсор. Команда вставки называется Paste (ее аналогом является сочетание клавиш <Sliift>+<Ins>) и выполняется только в том случае, если буфер обмена не пустой.
При работе с буфером в системе Turbo Pascal необходимо помнить, что при копировании или перемещении в него какой-либо новой информации, она записывается в конец буфера, вслед за старой информацией, что раньше в нем хранилась. Поэтому, чтобы не запутаться, перед тем, как что-либо записывать в буфер, полезно просмотреть его содержимое командой Show clipboard (просмотр буфера). При этом на экране компьютера появится окно с находящимся в буфере текстом. Очистить содержимое буфера можно командой Clear.
Рассмотрим одну из операций редактирования на примере программы "банкомат", текст которой приведен в главе 3. Обратите внимание, что в тексте программы "банкомат" четыре строчки, содержащие операторы writein, которые выводят полученные результаты, почти идентичны друг другу. После того как мы набрали первую из четырех строчек, три раза скопируем ее, после чего останется внести в скопированные строчки минимальные изменения. Для этого нужно будет в начале выделить первую строчку. Это можно сделать как с помощью клавиатуры, так и с помощью мыши. Когда строка выделена, открываем раздел меню Edit. В разделе выбираем пункт Сору, после чего содержимое данной строки будет скопировано в буфер. Затем нажатием клавиши <Enter> перемещаем курсор на строчку ниже. После этого снова от-
крываем раздел меню Edit и выбираем в нем команду Paste, после чего хранящаяся в буфере строка будет вставлена туда, где установлен курсор. Затем еще два раза спускаем курсор на одну строку и каждый раз даем команду Paste. Таким образом, под первой строкой появятся три ее копии, которые необходимо будет только немного откорректировать.
Если в процессе редактирования вы сделали ошибку, то можно отменить последнее изменение в тексте с помощью команды Undo. Если же вы решили повторить отмененное действие, то это можно сделать командой Redo.
Говоря о редактировании текста встроенным редактором, необходимо отметить еще один момент. Ввод текста в данном редакторе может производиться в двух режимах: вставки и замены. По умолчанию используется режим вставки, в котором при вводе какого-либо текста в середину строки текст, расположенный справа от текущей позиции курсора, сдвигается, освобождая место для вставки нового текста. Если при работе в редакторе нажать клавишу <Ins>, то вместо режима вставки будет установлен режим замены, о чем свидетельствует изменение внешнего вида курсора. Курсор, имевший форму горизонтальной черты, теперь будет выглядеть как прямоугольник. При работе в режиме замены ввод нового текста в середину строки будет сопровождаться автоматическим удалением старого текста, поверх которого появляется новый. Такой режим удобнее использовать при корректировке текста, т. к. не нужно тратить время на предварительное удаление старого текста. Если необходимо снова вернуться к режиму вставки, то для этого нужно снова нажать ту же клавишу <lns>.
П1.3. Использование справочной системы
Естественно, что в процессе работы над текстом программы, при ее отладке, запуске на выполнение, сохранении созданпых файлов у пользователей, особенно на начальных этапах работы, могут возникать различные сложности и проблемы. Если рядом с вами нет опытного в вопросах программирования консультанта, то в его роли может выступить сама система програм мирова* ния, которая имеет мощную, обширную и разветвленную справочную систему, способную оказать вам своевременную и эффективную помощь при создании программ.
Единственным недостатком справочной системы для русскоязычного пользователя является то, что она не русифицирована (вся справочная информация выдается только на английском языке). Поэтому пользователям, не владеющим английским языком, для работы с данной системой желательно запастись двумя англо-русскими словарями: общего назначения н по вычислительной технике и программ ированию.
Помощь, предоставляемая справочной системой пользователю, может быть оказана несколькими способами. Во-первых, информацию можно получить через системное меню, в котором имеется раздел Help. В этом разделе есть ряд пунктов, важнейшими из которых являются Contents и Index. Contents открывает окно, содержащее основное оглавление справочной системы, включающее разделы How to Use Help (как работать со справочной системой), Menus and Hot Keys (работа с меню и использование функциональных клавиш и комбинаций клавиш). Editor Commands (справка по работе с текстовым редактором). Functions and Procedures (функции н процедуры Паскаля), Error messages (расшифровка сообщений об ошибках), Reserved Words (список зарезервированных слов с описанием их значений и применения) и др. При открытии каждого из этих разделов выводится подробная текстовая информация по соответствующей теме. Внешний вид окна содержания приведен на рис. П1.3.
Рис. П1.3. Окно содержания справочной системы
При активизации пункта Index пользователь получает доступ к окну с алфавитным списком терминов, используемых в системе программирования. Этот список похож на предметный указатель, расположенный в конце книги, но он имеет некоторые отличительные особенности. Во-первых» для того чтобы найти интересующий вас термин, не обязательно прокручивать весь список, достаточно набрать на клавиатуре начальные буквы интересующего вас слова. Во-вторых, данный список является гипертекстовым. Гипертекстом называется текст, имеющий ссылки на другие тексты. Так, если два раза щелк-
нуть мышью на любом из имеющихся в списке терминов или навести на этот термин курсорную рамку и нажать клавишу <Enter>, то в диалоговом окне Help появится подробная справочная статья о нем. Кроме того, в большинстве случаев будет приведен список разделов, связанных по содержанию с данной темой, н образцы программ, в которых этот термин используется.
Например, если мы хотим получить справку по работе с оператором read, нужно щелкнуть в меню Help мышью пункт Index, затем достаточно набрать первые буквы ге, чтобы курсорная рамка установилась в указателе на термин Read и нажать клавишу <Enter>. В результате появляется текстовое окно, в котором подробно описывается использование оператора read (в частности, из статьи можно узнать, что read — это не просто оператор, а стандартная процедура Паскаля; подробнее о том, что такое процедура, рассказано в главе 8 данной книги), приводится список ^родственных** данной теме статей справочной системы (ReadKey, Readln, Write, Writein) и указывается, что в справочной системе имеется пример программы (по-английски— Sample code), где используется оператор read. Для оператора read пример такой программы содержится в файле Eofpas. Чтобы просмотреть его текст, достаточно два раза щелкнуть мышью название файла.
Помимо описанного ранее способа получения информации через системное меню существует еще один (в ряде случаев он является более быстрым и удобным)— использование контекстной подсказки. Прилагательное "контекстная" означает 'Относящаяся к данному случаю, к данной ситуации11.
Рис. П1.4. Окно контекстной помощи
Нажав клавишу <F1>, вы можете получить справку по тому режиму работы (работа в текстовом редакторе, открытие файла, сохранение файла), который установлен в данный момент. Напрнмер, если мы сталкиваемся с какими- либо трудностями в процессе сохранения файла, то достаточно, находясь в окне сохранения файла, нажать клавишу <F1>, чтобы получить справку именно по данному вопросу (рис. П1.4).
П1.4. Работа с окнами
Все операции, которые мы производим в системе программирования, выполняются в одном из открытых окон. Окном называется прямоугольная область, используемая для вывода информации. В окнах могут содержаться исходные тексты программ, результаты работы программ, различная справочная информация, в специальных диалоговых окнах производится сохранение файлов и их открытие, а также настройка различных параметров системы программирования. Окна могут быть развернуты во весь экран или занимать его часть. Размеры окон можно изменять (исключение составляют диалоговые окна, размеры которых фиксированы).
Система программирования Turbo Pascal позволяет в течение одного сеанса работать с несколькими файлами. Если во время сеанса работы в системе вы создаете новый файл или открываете уже существующий, то при этом открывается соответствующее данному файлу новое окно. Одно из окон является активным и находится на переднем плане. Такое окно имеет два управляющих элемента, один из которых позволяет закрыть окно (квадратик в левой верхней части окна), а другой — развернуть окно во весь экран (стрелка в правой верхней части окна). Если окно уже развернуто во весь экран, то разворачивающий элемент сменяется восстанавливающим, который позволяет вернуться к исходному размеру окна. Этот элемент тоже имеет форму стрелки, но двунаправленной. Для каждого окна с программой или результатами работы в правом верхнем углу указывается его порядковый номер. Диалоговые окна, в отличие от окон программ, имеют только закрывающий элемент и не имеют порядкового номера.
Для управления расположением окон на экране, их размерами, перехода между окнами используются команды раздела меню Window. Команды этого меню позволяют располагать окна на экране двумя различными способами: каскадом (команда Cascade) и черепицей (команда Tile) (рис. ГН.5). При расположении окон каскадом одно (активное) окно находится на переднем плане, а для других окон выводятся только их заголовки. Этот способ расположения окон применяется по умолчанию. Если во время сеанса работы в системе программирования необходимо сделать активным другое окно, то следует щелкнуть мышью его заголовок, в результате чего это окно станет
активным, а от предыдущего активного окна будет виден только заголовок, хотя оно и не будет закрыто.
Turbo Pascal[File Edit Search Rim Conpike; UeMisrtools Jptions Window tielp ;program denocolor;1 Uses Crt;beginClrScr;TextBackgrounddightGray);1TextColor(Red);wr itelnt *3та nporpama представляет coTextColor(Green);writeln(^использования цветовой папнтрrogram bankomat;ar sum.k10U・k50,k1O,vspom:integer; eqin.riteln(* Введите сунм力 кратную 10');» eadln(sum);К10О:=sun div 100;spom:=sun mod IDO;50:=vspon div 50;•spom:=vspoM nod S0;\. . .Ml \ll jbHI.IMS -4 ——rogram flight;ses Crt;ar i: integer;eg inIrscr;rite In ('В каком году ьып совершен ne г ite In ('Введите число и машите "Ent eadln(i);f i二1961hen write In (*Вы дали правильный отвеprogram surma;Uses Crt; var a,b,c:integer; begin ClrScr; writein (* введите 2 числа*); write In ('nocne ввода каждого числа на readln(a); readln(b); c:=a*b;1 1 -IC1 [ П ■•lp;F*,au。• R Upe・ ;,11НУ RCwvile 上У . Иак, 61VH1II L・,・1 ruu* •■■Turbo Pascal[File Edit Search Rim Conpike; UeMisrtools Jptions Window tielp ;program denocolor;1 Uses Crt;beginClrScr;TextBackgrounddightGray);1TextColor(Red);wr itelnt *3та nporpama представляет coTextColor(Green);writeln(^использования цветовой папнтрrogram bankomat;ar sum.k10U・k50,k1O,vspom:integer; eqin.riteln(* Введите сунм力 кратную 10');» eadln(sum);К10О:=sun div 100;spom:=sun mod IDO;50:=vspon div 50;•spom:=vspoM nod S0;\. . .Ml \ll jbHI.IMS -4 ——rogram flight;ses Crt;ar i: integer;eg inIrscr;rite In ('В каком году ьып совершен ne г ite In ('Введите число и машите "Ent eadln(i);f i二1961hen write In (*Вы дали правильный отвеprogram surma;Uses Crt; var a,b,c:integer; begin ClrScr; writein (* введите 2 числа*); write In ('nocne ввода каждого числа на readln(a); readln(b); c:=a*b;1 1 -IC1 [ П ■•lp;F*,au。• R Upe・ ;,11НУ RCwvile 上У . Иак, 61VH1II L・,・1 ruu* •■■аа
Turbo Pascal
[File Edit Search Rim Conpike; UeMisrtools Jptions Window tielp ;
program denocolor;
1 Uses Crt;
begin
ClrScr;
TextBackgrounddightGray);
1TextColor(Red);
wr itelnt *3та nporpama представляет co
TextColor(Green);
writeln(^использования цветовой папнтр
rogram bankomat;
ar sum.k10U・k50,k1O,vspom:integer; eqin
.riteln(* Введите сунм力 кратную 10');
» eadln(sum);
К10О:=sun div 100;
spom:=sun mod IDO;
50:=vspon div 50;
•spom:=vspoM nod S0;
\. . .Ml \ll jbHI.IMS -4 ——
rogram flight;
ses Crt;
ar i: integer;
eg in
Irscr;
rite In ('В каком году ьып совершен ne г ite In ('Введите число и машите "Ent eadln(i);
f i二1961
hen write In (*Вы дали правильный отве
program surma;
Uses Crt; var a,b,c:integer; begin ClrScr; writein (* введите 2 числа*); write In ('nocne ввода каждого числа на readln(a); readln(b); c:=a*b;
1 1 -IC
1 [ П ■•lp;F*,au。• R Upe・ ;,11НУ RCwvile 上У . Иак, 61VH1II L・,・1 ruu* •■■
Turbo Pascal
[File Edit Search Rim Conpike; UeMisrtools Jptions Window tielp ;
program denocolor;
1 Uses Crt;
begin
ClrScr;
TextBackgrounddightGray);
1TextColor(Red);
wr itelnt *3та nporpama представляет co
TextColor(Green);
writeln(^использования цветовой папнтр
rogram bankomat;
ar sum.k10U・k50,k1O,vspom:integer; eqin
.riteln(* Введите сунм力 кратную 10');
» eadln(sum);
К10О:=sun div 100;
spom:=sun mod IDO;
50:=vspon div 50;
•spom:=vspoM nod S0;
\. . .Ml \ll jbHI.IMS -4 ——
rogram flight;
ses Crt;
ar i: integer;
eg in
Irscr;
rite In ('В каком году ьып совершен ne г ite In ('Введите число и машите "Ent eadln(i);
f i二1961
hen write In (*Вы дали правильный отве
program surma;
Uses Crt; var a,b,c:integer; begin ClrScr; writein (* введите 2 числа*); write In ('nocne ввода каждого числа на readln(a); readln(b); c:=a*b;
1 1 -IC
1 [ П ■•lp;F*,au。• R Upe・ ;,11НУ RCwvile 上У . Иак, 61VH1II L・,・1 ruu* •■■
а
а
日 Тurbo PascalMSI Q
■ \...Vfitnr\P3.FftS 1一
丨program democolor;
Uses Crt; begin (ClrScr;
TextВackqroundCLightGray);
TextCo lor(Red);
writelnC *3та nporpama представляет co TextColor(Green);
writelnC *испольэвваиия цветовой папитр
\...\rnuGQ.PflS 21 rogram bankomat;
ar sun,k1D0,kSU,k1D,uspom:integer; egxn
rite ln( ^Введите cymy# кратную ID');: eadln(sum);
100:=sum diu 100;
spon:=sun mod 100;
50:-vspon div 50;
spon: =vspon mod 50;
j=[・]■= \.. -\rn0G1 .PftS =
=3=[t]=^
\ АН
J I MH I I'”6
program surma;
Uses Crt;
uar a,b,c:integer;
begin
ClrScr;
writein (^введите 2 чиспа*);
rogram flight; ses Crt; ar i:integer; eg】n Irscr; riteIn ('В какоп
rony
был совершен ne
I и наспите "tnt!
write In ('после ввода каждого readln(a);
readln(b);
числа на
rite In ('Введите rad 1n(i); f i二1961
число
c:=a+b;
一 1:15 —=
.1/
hen write In (*Вы
nanx
правильный отвеI
mwiq^ rwi》
Рис. П1.5. Расположение окон на экране каскадом fa) и черепицей (б)
Если нужно сделать активным предыдущее по порядковому номеру окно, то используется команда Previous, если активным должно быть следующее по порядку окно, то — команда Next (здесь имеется в виду порядок открытия
окон в ходе текущего сеанса работы в системе). Если активное окно больше не нужно пользователю, то его можно закрыть командой Close. Для того чтобы просмотреть список всех открытых окон, применяется команда List (рис. П1.6). По этой команде на передний план выводится диалоговое окно, в котором перечислены все окна, причем первым в списке идет окно, которое было открыто последним. Если какое-либо из имеющихся в списке окон необходимо закрыть, то для этого его нужно выделить курсорной рамкой и щелкнуть экранную кнопку Delete, в результате чего окно будет удалено из списка и закрыто.
I Turbo PascalI Turbo Pascalproqram gin itelnproqram gin iteln二Н1з Edit ■■■“&^мп^「•啡*Iq 阪biig. ЪмИ* 电欢耻滲 哨nd叫 函】口二Н1з Edit ■■■“&^мп^「•啡*Iq 阪biig. ЪмИ* 电欢耻滲 哨nd叫 函】口peruprog;peruprog;(*Моя первая(*Моя перваяязыке Паскаль )языке Паскаль ):1:1Рис. П1.6. Диалоговое окно, содержащее список окон, открытых во время текущего сеанса работы в системе Turbo PascalРис. П1.6. Диалоговое окно, содержащее список окон, открытых во время текущего сеанса работы в системе Turbo Pascal
I Turbo Pascal
I Turbo Pascal
proqram gin iteln
proqram gin iteln
二Н1з Edit ■■■“&^мп^「•啡*Iq 阪biig. ЪмИ* 电欢耻滲 哨nd叫 函】口
二Н1з Edit ■■■“&^мп^「•啡*Iq 阪biig. ЪмИ* 电欢耻滲 哨nd叫 函】口
peruprog;
peruprog;
(*Моя первая
(*Моя первая
языке Паскаль )
языке Паскаль )
:1
:1
Рис. П1.6. Диалоговое окно, содержащее список окон, открытых во время текущего сеанса работы в системе Turbo Pascal
Рис. П1.6. Диалоговое окно, содержащее список окон, открытых во время текущего сеанса работы в системе Turbo Pascal
Режим работы с расположением окон каскадом удобен в том случае, если пользователь во время сеанса работы в каждый момент времени работает только с одним окном, но так бывает не всегда. Нередко возникают ситуации, когда пользователю нужно видеть на экране одновременно несколько окон с текстами программ. В частности, это необходимо в том случае, когда пользователь хочет использовать одну программу в качестве образца для разработки другой или напрямую скопировать фраг мент одной программы в другую. Для расположения нескольких окон таким образом, чтобы они не перекрывали друг друга, используется команда Tile (рис. П1.5, б). В данном режиме пользователю будут видны все открытые в текут啕 момент окна, каждое из которых при этом будет занимать только часть экрана. Одно из окон является активным. Его можно определить по наличию в нем управляющих элементов и скроллеров. Другое окно можно сделать активным щелчком по его заголовку
(как и при расположении окон каскадом), но при этом предыдущее активное окно остается на экране и сохраняет свои размеры и местоположение.
Если пользователю необходимо активное окно развернуть во весь экран, то для этого он должен дать команду Zoom. Если желательно видеть все открытые окна, но при этом пользователь хочет изменить их взаимное расположение либо размеры окон, то следует воспользоваться командой Sizc/Move. После выполнения этой команды система переходит в специальный режим (о чем свидетельствует изменение цвета заголовка активного окна — из белого он становится зеленым). В данном режиме можно передвигать окна по экрану клавишами <стрелка вверх>, <стрелка вниз>, <стрелка вправб>, 〈стрелка влево>. Если нужно увеличить или уменьшить размеры окна, то для этого следует использовать комбинации клавиш <Sh 111>+<стрелка вверх>, <Sh iй>+<стрелка вниз>, <Sh i Л>+<стрелка вправо>, <Shift>+<стрелка влево>. Подтверждение сделанных изменений осуществляется нажатием клавиши <Enter>. Для выхода из режима перемещения и изменения размеров окон нажимаем клавишу <Esc>.
Если пользователь хочет закрыть все открытые во время сеанса работы окна, то он должен воспользоваться командой Close all.
ПРИЛОЖЕНИЕ 2
Основные команды меню системы Delphi
Для лучшего понимания основных команд меню в англоязычных версиях системы Delphi здесь приведен их вариант в русском эквиваленте.
Меню File
New ——создать новый объект. (Таким объектом может быть: Application —— проект, Form ——экранная форма. Unit — модуль программы и др.).
Open project — открыть существующий проект.
Open — открыть форму, программный модуль или текстовый файл (этой же командой можно открыть и проект).
Save ——сохранить все изменения, которые были произведены в открытых в данный момент файлах. При этом все файлы сохраняются под текущими именами.
Save as ——сохранить изменения в открытых файлах проекта. При этом сами файлы можно сохранять под другими именами.
Save Project as — сохранить весь проект под другим именем.
Save АП ——сохранить все изменения, сделанные в проекте.
Exit — закрыть систему программирования.
Меню Edit
Undo — отменить последнее сделанное изменение.
Redo — вернуть отмененное действие.
Cut — переместить выделенный фрагмент в буфер обмена.
Сору — скопировать выделенный фрагмент в буфер обмена.
Paste ——вставить фрагмент, находящийся в буфере обмена.
Delete — удалить выделенный фрагмент.
Select all ——выделить все в активном окне (весь текст в окне модуля или все объекты в окне формы).
Меню Search
Find — открывает диалоговое окно для поиска заданной текстовой строки.
Replace ——открывает диалоговое окно для замены одной текстовой строки на другую.
Меню View
Forms — открывает диалоговое окно, в котором можно выбрать любую форму проекта и сделать ее активной.
Units ——открывает диалоговое окно, в котором можно выбрать любой модуль проекта и сделать его активным.
Toolbars ——позволяет добавлять и удалять панели инструментов.
Меню Run
Run — запуск программы на выполнение.
Program Reset ——прекращение выполнения программы в случае ее зависания.
ПРИЛОЖЕНИЕ 3
Распространенные сообщения об ошибках в Delphi и способы их устранения
Undeclared identifier——переменная не описана. Причиной появления этого сообщения может быть наличие в программе переменной, которая не была описана в разделе описаний. Другой причиной появления этого сообщения может быть ошибка в написании служебного слова, которое воспринимается компилятором как неизвестная переменная. Для устранения описать используемую переменную в разделе описаний или правильно написать служебное слово.
Not enough actual parameters— не хватает фактических параметров. При вызове функции или процедуры для нее забыли указать какой-либо параметр. Вставить недостающий параметр в вызов функции или процедуры.
Too many actual parameters — избыток фактических параметров. При вызове функции или процедуры для нее указали лишний параметр. Удалить лишний параметр в вызове функции или процедуры.
Unterminated string— незавершенная строка. Причиной ошибки обычно является отсутствие апострофа в конце текстовой строки. Для устранения вставить недостающий апостроф.
Unexpected end of file — неверный конец файла. Программист забыл закрыть скобку в комментарии к программе. Поставить недостающую фигурную скобку.
Incompatible types——несоответствие типов. Чаще всего такое сообщение появляется при попытке присвоить переменной недопустимое значение (например, присвоить переменной целого типа строковое значение). Для исправления ошибки ввести в программе дополнительную переменную того типа, который соответствует присваиваемому значению.
Missing operator or semicolon — отсутствует оператор или точка с запятой. Программист забыл поставить точку с запятой после одного из операторов. Вставить недостающую точку с запятой.
',‘ or *:* expected but *;• found——ожидается наличие запятой или двоеточия, но вместо них обнаружена точка с запятой. Причина обычно заключается в том, что в разделе описания переменных программист после имени переменной или имен группы переменных забыл указать их тип. Для исправления поставить недостающее двоеточие и после него тип переменной или переменных.
')■ expected but 丁 found — при вызове процедуры или функции после перечисления параметров забыли закрыть скобку. Добавить недостающую скобку.
Statement expected but TROCEDURE* found ——обычной причиной такого сообщения является отсутствие в конце составного оператора служебного слова end. Поставить недостающее слово end.
Declaration expected but identifier found— обычной причиной подобного сообщения является отсутствие служебного слова begin в начале составного оператора. Вставить недостающее слово begin.
Литература
Borland Delphi 6 for Windows. Developers Guide. Borland Software Corporation. Scotts Valley, CA, 2001.
Borland Delphi 6 for Windows. О切eel Pascal Language Guide. Borland Software Corporation. Scotts Valley, CA, 2001.
Borland Delphi 6 for Windows. Quick Start. Borland Software Corporation. Scotts Valley, CA, 2001.
Kent Reisdorph. Teach Yourself Borland Delphi 4 in 21 Days. Macmillan Publishing, Indianapolis, IN J 999.
Абрамов В. Г., Трифонов Н. П., Трифонова Н. Г. Введение в язык Паскаль. —М・:Наука, 1988.
Бабушкина И. А., Бушмелева Н. А., Окулова С. М., Черных С. Ю. Практикум по Turbo Pascal. — М・:АБФ, 1998.
Боон К. Паскаль для всех. — М•: Энергоатомиздат, 1988.
Васюкова Н. Д.э Тюляева В. В. Практикум по основам программирования. Язык Паскаль. — М・:Высш, шк., 1991.
ГольденбергВ. А. Введение в программирование.——Минск: ООО "Хар- вест"э 1997.
Григас Г. Начала программирования. — М.: Просвещение, 1987.
Емелина Е. И. Основы программирования на языке Паскаль.——М.: Финансы и статистика, 1997,
Епанешников А. М・,Епанешников В. А, Программирование в среде Turbo Pascal 7.0. — М: Диалог-МИФИ, 1995.
Жуков А. Изучаем Delphi. — СПб.: Питер, 2000.
Культин Н. Б. Turbo Pascal в задачах и примерах. — СПб.: БХВ- Петербург, 2000.
Культин Н. Б. Программирование в Turbo Pascal 7.0 и Delphi. — СПб.: ВХВ-Петербург, 1999.
Львовский М. Б. Методическое пособие по информатике, 1999 (электронное издание).
Малышев О. В. Основы Delphi, 1999 (электронное издание).
Молчанова С. И. Основы программирования. Турбо-Паскаль 7.0 — М.: ACT. 2000.
Немню! ин С. A. Turbo Pascal. Практикум. — СПб.: Питер, 2002.
Немнюгин С. A. Turbo Pascal. Учебник. — СПб.: Питер, 2002.
Пестри ков В. М., Маслобоев Л. Н. Turbo Pascal 7.0. Изучаем на примерах. —СПб.: Наука и техника, 2003.
Пестриков В. М., Маслобоев А. Н.5 Федоров О. К. Программирование в системе Turbo Pascal 7.0. Учебное пособие. — СПб.: СПбГТУРП, 2002.
Сергиевский М. В., Шалашов А. В. Turbo Pascal 7.0. Язык, среда программирования. —М,: Машиностроение, 1994.
Симонович С. В. и др. Информатика. Базовый курс. — СПб.: Питер, 2001.
Слабун Т. Интерактивный курс изучения Borland Delphi 6, 2001 (электронное издание).
Ставровский Л. Б. Turbo Pascal 7.0. Учебник. — К.: BHV-Киев, 2000.
Фаронов В. В. Основы Турбо-Паскаля.——М.: Учебно-инженерный центр ПМВТУ-ФЕСТО ДИДАКТИК", 1992.
Шауцукова JI. 3. Информатика. — М.: Просвещение, 2000.
Предметный указатель
D0 установка 261
О форма 258, 282
Delphi:
О запуск 276у
О интерфейс 279
0 команды меню 487
0 компоненты приложения 259
0 объекты приложения 258
0 особенности 257
0 проект 281
0 русификация 276
0 сообщения об ошибках 489
А
Алгоритм 11
0 исполнитель 13
0 свойства 13
0 форма записи 14
Алфавит 36
Б
Буфер 479
в
Вещественные числа 67, 335
Вычисление факториала 166, 223, 389
Turbo Pascal:
0 автоматический запуск 475
0 запуск 30
0 интерфейс 33, 483
0 справка 481
0 установка 24
0 файлы 2
г
Генератор случайных чисел 117
3
Запись, обращение к полю 228
и
Интерпретация 18
к
Кодовая таблица ASCII 128
Комментарий 37, 65
Компиляция 18» 47, 186
Константа 37
О символьная 129
м
Массив 227
О двумерный 150
О диапазон 145
0 индекс 145
О одномерный 145
О сортировка 154
Метка 101
Множество 233
0 операции 235
0 пустое 234
Модуль 50. 340
0 имя 184
0 использование в программах 186
0 подключение 340
0 пользовательский 183
0 секции 185
。сохранение в файле 186
0 стандартный для Паскаля 183
о
Объект 258
0 главное меню, MainMcnu 355, 361
О группа переключателей, RadioGroup 303
0 заголовок 289
0 изменение размеров 288
。изменение свойства 295
。имя 290
0 кнопка. Button 291
О метод 339, 381
0 многострочный редактор, Мето 346
0 надпись. Label 288
0 обработчик события 259
0 панель. Panel 305
0 переключатель, радиокнопка, RadioButton 304
0 перенос в форму 288
0 рисунок, Image 306
0 свойство 258, 283, 290, 294
0 событие 259, 283, 293
0 составной 355
0 таймер, Timerl 379
0 текстовое окно, редактор, Edii 299
0 установка фокуса 404
0 фигура» Shape 379
0 флажок. Checkbox 367, 369
0 форма. Form 258. 282, 298, 339, 402
Оператор 36
0 безусловного перехода 101
0 м ножест вен ного выбора 94, 376
0 присваивания 56, 295, 315
О составной 84, 351
0 условный 76, 345
0 условный, вложенный 84
0 условный, сокращенный 80
Операции:
0 арифметические 59, 327
0 логические 89
О над множествами 235
0 приоритет 60, 90, 237
п
Переменная 37, 54
0 глобальная 172, 316, 382
0 имя 37, 315
0 логическая 87
0 локальная 172, 316
0 массив записей 227
О множественного типа 233
。ограниченного типа 222
0 перечисляемого типа 218
0 символьная 130
0 строковая 138
0 тип 37
0 (|)айл записей 227
0 файловая, нетилизироваиная 210
0 файловая, текстовая 196
0 файловая, типизированная 203
Подпрограмма:
。процедура 168, 170
О функция 161
Программа 16
0 ввод кода 43, 287, 293, 477
0 ветвление 75, 345
0 заголовок 38
0 запуск на выполнение 47, 287, 294, 297
0 контроль переменных 224
0 линейной структуры 57, 315, 345
0 открытие фа曲ш 71
0 отладка 48
。отступы 52
О перехват ошибок 408
0 разделы 38
0 создание 286
0 создание файла 41
0 составление 19
О сохранение файла 44, 285
Программирование 16
О визуальное 259
0 интегрированная среда 21
О объектно-ориентированное 258
0 событийно-ориентированное 259
0 этапы 19
0 язык 16
Проект 281
0 добавление формы 339
С подключение модуля 340
0 разработка 286
О сохранение 285
Процедура: 0 вызов 170 О параметры 171 0 пользовательская 170 0 стандартная для Паскаля 168
р
Рекурсия 178
с
Селектор 95
Система программирования 21, 23
Сортировка: 0 массива 154 0 методом простого выбора 154 0 методом простого обмена ! 56 Строка 44
0 ограниченный 221
О перечисляемый 217
О пользовательский 217
0 порядковый 222
О преобразование 316, 336
О результата вычислений 70
О символьный 130
О строковый 138
Транслятор 18
ф
Файл:
О доступ к элементам типизированного файла 206
0 закрытие 198, 204
0 запись 200, 204, 210
О метод поел сдо ватсл ьн о го доступа 196
О метод прямого доступа 196
О нети лизированный 210
О операции 196
0 открытие 198, 204» 210
。проверка существования 229
0 расширение !95
。связывание с переменной 197, 203, 210
О текстовый 196
0 типизированный 203, 227
О чтение 198, 204, 211
Функция:
0 обращение 165
О параметры 164, 165
0 подпрограмма 163
О пользовательская 163
0 стандартная для Object Pascal 316,
336, 337, 369, 396, 397, 403, 409, 419
0 стандартная для Паскаля 161
О тип значения 164
Таблица истинности 91
Тип 37
0 вещественный 67, 335, 336
0 запись 226
0 логический, булевский 87
Цвета 50
Цикл 108, 389
0 с постусловием 114
0 с предусловием 123
0 со счетчиком 109
^Магаэин-сало^^Магаэин-сало^
^Магаэин-сало^
^Магаэин-сало^
■ 一,二T * - '
(二方言)/[♦•- 1: *号"' 、工•?,.气 占:^^一一士上-:■
1rHОВАЯ ТЕХНИЧЕСКАЯ КНИГА”
19000$, Санкт-Петербург, Измайловский прь 29
В магазине представлена литература покомпьютерным технологиямрадиотехнике и электроникефизике и математикеэкономикемедицинеи др.
Низкие ценыПрямые поставки от издательствЕжедневное пополнение ассортиментаПодарки и скидки покупателям
Магазин работает с 10.00 до 20.00без обеденного перерывавыходной день - воскресенье
Тел.: (812)251-41-10, e-mail: trade@techkniga.com
I В It «'J1K t «' В I <»(><!<' ”“< “" 8
Ku «'ЦИ t r I |iг I и г 4 Ml Л и
IП p >iitv u”「b“ »«ii'p> I < и
• дракона'.' змеи',‘ лошади*, 1 овцы*,1 обезьяны',1 петуха •, * собаки',' свиньи *); var krу:integer;
begin
Clrscr;
writein(1 введите год (с 194 8 по 2055)*);
readln (у);
if (y<1948)or(y>2055)
then writeln(*Вы ошиблись при вводе•) else
begin
k = (yT947) mod 12
writein (у,'году по европейскому летоисчислению соответствует•); writein (*год \vost[к]г1 по восточному календарю*);
end;
Виктор Пестриков
Артур Маслобоев
DELPHI
НА ПРИМЕРАХ
Санкт-Петербург«БХВ-Петербург»2005
УДК 681.3.06
ББК 32.973.26-018.2
П28
Псстриков В. М・,Маслобоев А. Н.
П28 Delphi на примерах. — СПб.: БХВ-Петербург, 2005. — 496 с.: ии.
ISBN 5-94157-713-3
Изложены основы программирования в среде Delphi, начиная с состав- ЛСНН51 программ в Turbo Pascal 7.0 н Object Pascal. Особое внимание уделено программам для решения задач из области высшей математики. Рассмотрены вес этапы создания проекта n Delphi, наиннп” с разработки интерфейса ■ заканчивая особенностями работы с уже написанной программой. Приведены готовые проекты, которые должны помочь обучающемуся при выполнении самостоятелыiых заданий, помещенных в книге. Ко всем приведенным в книге заданиям имеются ответы и решения.
Д/гя начинающих программистов, учащихся » студентов
УДК 681.3.06
ББК 32.973.26-018.2
Группа подготовки издания:
Главный редактор Зам. главного редактора Зав. редакиисй Редактор Компьютерная верстка КорректорДизайн обложки Зав. производствомГлавный редактор Зам. главного редактора Зав. редакиисй Редактор Компьютерная верстка КорректорДизайн обложки Зав. производствомЕкатерина Кондукова Игорь Шишигин Григории Добин Екатерина Капалыгина Ольги Сергиенко Зинаида Дмитриева Игоря Цырулъникова Николай ТверскихЕкатерина Кондукова Игорь Шишигин Григории Добин Екатерина Капалыгина Ольги Сергиенко Зинаида Дмитриева Игоря Цырулъникова Николай Тверских
Главный редактор Зам. главного редактора Зав. редакиисй Редактор Компьютерная верстка Корректор
Дизайн обложки Зав. производством
Главный редактор Зам. главного редактора Зав. редакиисй Редактор Компьютерная верстка Корректор
Дизайн обложки Зав. производством
Екатерина Кондукова Игорь Шишигин Григории Добин Екатерина Капалыгина Ольги Сергиенко Зинаида Дмитриева Игоря Цырулъникова Николай Тверских
Екатерина Кондукова Игорь Шишигин Григории Добин Екатерина Капалыгина Ольги Сергиенко Зинаида Дмитриева Игоря Цырулъникова Николай Тверских
Лицензия ИД № 02429 от 24.07.00. Подписано в печать 23.05.05.
Формат 70xl001/iB. Печать офсетная. Уел. печ. л. 39.99.
Тираж 4000 экз. Заказ № 1068
"БХВ-Пвтербург". 194354. Санкт-Петербург, ул. Есенина. 5Б.
Санитарно-эпидемиологическое заключение на продукцию
№ 77.89.02.953.Д.006421Л1.04 от 11.11.2004 г. выдано Федеральной службойпо надзору в сфере защиты прав потребителей и благополучия человека.
Отпечатано с готовых диапозитивовв ГУП "Типография "Наука"199034. Санкт-Петербург, 9 линия, 12
ISBN 5-94157-713-3ISBN 5-94157-713-3О Псстриков В. М.. Маслобоен А. Н.. 2005
ISBN 5-94157-713-3
ISBN 5-94157-713-3
О Офсрки>енне. 1«златсл1>ст1№ "БХВ-1!стср()ургг. 205
Оглавление
Предисловие7
Глава 1. От алгоритма к программе11
Что такое алгоритм?11
Программа и языки программирования16
Этапы работы над программой. Системапрограммирования18
Глава 2. Подготовка к программированию на Паскале23
Где взять Turbo Pascal23
Подготовка к запуску системы Turbo Pascal27
Запуск системы Turbo Pascal30
Экран системы Turbo Pascal33
Алфавит языка Паскаль36
Структура программы на языке Паскаль37
Глава 3. Простейшие программы в Паскале41
Первая программа на Паскале41
Цветовое оформление результатов выполнения программы49
Использование переменных в программе54
Работа с вещественнымивеличинами67
Задания для самостоятельнойработы72
Глава 4. Ветвление в Паскале75
Условный оператор if.76
Логические переменные.Логические операции87
Оператор множественного выбора case94
Безусловный оператор перехода goto.101
Задания для самостоятельной рабогы105
Глава 5. Циклы в Паскале107
Цикл с заранее известным числом повторений109
Цикл с постусловием114
Цикл с предусловием……123
Задания для самостоятельной работы126
Глава 6. Работа с текстом в Паскале127
Символьные величины127
Строковые величины 138
Задания для самостоятельной раболы143
Глава 7. Массивы в Паскале145
Одномерные массивы145
Двумерные массивы150
Сортировка массивов154
Задания для самостоятельной работы159
Глава 8. Подпрограммы в Паскале161
Подпрограмма-функция161
Подпрограмма-процедура168
Рекурсия178
Программируемые модули183
Задания для самостоятельной работы192
Глава 9. Работа с файлами в Паскале195
Текстовые файлы196
92 Типизированные файлы 203
Нетипизированные файлыt210
Задания для самостоятельной работы215
Глава 10. Пользовательские типы данных в Паскале217
Перечисляемыйтипданных217
Ограниченный тип данных 221
Записи225
Множества233
Задания для самостоятельной работы242
Глава 11. Turbo Pascal в Интернете..245
Глава 12. Предварительные сведения о среде Delphi257
Основные характеристики системы Delphi257
Как установить Delphi.....260
Запуск среды программирования276
Глава 13. Приступаем к программированию в Delphi279
Элементы экрана среды Delphi279
Первая программа на Delphi284
Программа иРедактор'*298
13.4. Программа "Хамелеон*'303
Задание для самостоятельной работы 314
Глава 14. Программы линейной структуры в Delphi 315
Программа иСложениеи315
Программа пПараллелепипед*'322
Программа "Хронометр'*326
Программа "Цилиндр'1335
Задание для самостоятельной работы343
Глава 15. Программы с ветвлением в Delphi345
Программа "Тест”345
Программа "Квадратное уравнение*'351
Программа "Калькулятор**365
Усовершенствованная программа "Светофор"376
Задание для самостоятельной работы386
Глава 16・ Программы с циклами в Delphi389
Программа *'Факториал"389
Программа "Вклад"394
Программа "Контрольная по математике"399
Задание для самостоятельной работы*414
Глава 17. Решение математических задач в Delphi415
Программа "Вычисление производнойм415
Программа "Интеграл”421
Глава 18. Delphi в Интернете429
Глава 19. Ответы и решения к заданиям441
Глава 3441
Глава 4444
Глава 5446
Глава 6448
Глава 7450
Глава 8453
Глава 9458
Глава 10461
Глава 13465
Глава 14467
Глава 15 469
Глава 16471
Приложение 1. Приемы работы в среде Turbo Pascal475
П1.1. Автоматический запуск системы программирования475
П1.2. Перемещение по тексту и редактирование текста477
П1.3. Использование справочной системы480
П1.4. Работа с окнами483
Приложение 2. Основные команды меню системы Delphi487
Меню File487
Меню Edit487
Меню Search488
Меню View 488
Меню Run488
Приложение 3. Распространенные сообщения об ошибках в Delphi и способы их устранения489
Литература491
Предметный указатель493
Предисловие
Настоящая книга посвящена основам программирования в среде Delphi, разработанной компанией Borland. Данная среда является одной из ведущих систем программирования, используемых для разработки современных программных продуктов, и в первую очередь приложений операционной системы Windows. Система программирования Delphi позволяет значительно уп- ростизъ процесс создания Windows-приложенией (до ее появления основным средством для разработки Windows-приложений был весьма сложный для изучения язык C++), а также резко повысить производительность труда программиста. Поэтому не случайно, что систему Delphi относят к категории RAD-систем программирования. RAD— Rapid Application Development, быстрая разработка приложений.
Система Delphi базируется на использовании языка программирования Object Pascal, который является логическим продолжением и развитием классического языка программирования Паскаль. В связи с этим, говоря о системе Delphi, нельзя не сказать несколько слов о языке Паскаль, его особенностях, об истории его возникновения и развития.
Созданный в начале 70-х годов XX века признанным классиком программ* рования Никлаусом Виртом, язык Паскаль был назван в честь французского ученого Блеза Паскаля (1623——1662). Великий ученый, которого современники называли французским Архимедом, вошел в историю не только как автор научных трудов, охватывающих самые различные области человеческого знания (от философии до математики), но и как изобретатель арифметической машины — первого в мире механического счетного устройства.
Изобретение Блеза Паскаля положило начало тому процессу, который, в конечном счете, привел к появлению современной вычислительной техники, ставшей одним из определяющих факторов научно-технического прогресса. Без компьютеров ныне вообще немыслимо нормальное существование и развитие цивилизованного общества. Исходя из сказанного ранее ясно, что на-
звание языка было выбрано не случайно. Паскаль был задуман как образцовый язык, который должен определенным образом формировать мышление программистов, помочь им почувствовать законы программирования, его красоту.
Первоначально Паскаль разрабатывался, прежде всего, как язык, предназначенный для эффективного обучения программированию, н успешно справлялся с этой задачей. Например, в США в 1983 году Паскаль был объявлен официальным языком программирования для учащихся средних школ, которые намерены специализироваться в области вычислительной техники и программирования в американских университетах. Но с течением времени язык Паскаль вышел за чисто учебные рамки и стал равноправным и популярным языком программирования.
В 80-е годы прошлого века позиции Паскаля еще более упрочились в связи с появлением версий языка, предназначенных для персональных компьютеров. Язык стал использоваться не только как средство обучения студентов и школьников, но и широко стал применяться как рабочий инструмент пользователей. Возникло целое семейство языков Паскаль, и ведущее место в этом семействе занял язык Turbo Pascal, разработанный программистами американской фирмы Borland International. На протяжении ряда лет (1983—1992) фирмой Borland был создан ряд новых, более совершенных версий языка, и итогом этой работы стало создание мощной системы программирования, включающей универсальную интегрированную среду, в которую "погружен*1 язык. Эта среда значительно упрощала и облегчала процесс создания программ, и в то же время предоставляла пользователю ряд новых, дополнительных возможностей.
Хотя система программирования 1'urbo Pascal создавалась как приложение операционной системы MS-DOS, она успешно работает и на компьютерах, на которых установлена операционная система Windows, и продолжает широко использоваться как в учебных целях, так и для решения практических задач. Однако с течением времени возникла настоятельная потребность в разработке системы программирования, которая бы позволяла сочетать сохранение лучших традиций программирования на Паскале с использованием всех возможностей, предоставляемых наиболее популярной сегодня для персональных компьютеров операционной системой Windows.
Поэтому в 90-е годы XX века фирма Borland завершила линию, связанную с программированием для операционной системы MS-DOS и представленную Turbo Pascal, и приступила к работе над системой программирования, ориентированной на создание приложений операционной системы Windows. Новая система программирования получила название Delphi. Она широко распространилась во всем мире и успешно развивается, а ко времени выхода этой
книги фирмой Borland была создана уже девятая по счету версия данного программного продукта.
Свое название система программирования Delphi получила по имени существовавшего в древней Греции города Дельфы, где находился знаменитый храм бога Аполлона. Аполлон почитался в древнем мире как небесный покрови- гель наук и искусств, а в храме, построенном в его честь, находился знаменитый дельфийский оракул, у которого люди стремились не только узнать о своей личной судьбе, но и получить ответы на самые сокровенные вопросы бытия. В настоящее время система Delphi представляет собой мощное орудие, которое современные ученые и инженеры используют для познания и преобразования окружающего мира.
Систему программирования Delphi, подобно системе Turbo Pascal, часто называют интегрированной средой программирования. Слово "ннтегрнрован- ныйи (от латинского integrare——восста на в л и вать, восполнять) означает в данном случае, что в системе объединены в одно целое различные средства, способствующие наиболее бысгрой и эффективной разработке программы.
Характеризуя среду программирования Delphi, о ней также говорят как о визуальной и событийно-ориентированной. Первое означает, что пользователь наглядно (визуально) может увидеть в системе те заготовки, которые в дальнейшем будут использованы для создания экранных объектов в его программе, а затем сам сконструировать ее интерфейс (внешний вид) путем переноса этих заготовок на экранную форму. Второе же означает, что программист может выбрать из имеющегося в системе программирования списка те события, на которые должны реагировать экранные объекты, и запрограммировать эту реакцию нужным ему образом.
Наконец, еше одним важным достоинством системы программирования Delphi является ее универсальность. Дело в том, что многие современные языки и соответствующие системы программирования созданы для решения узкоспециальных задач. Так язык Cobol предназначен в первую очередь для создания программ в области экономики, язык Fortran — для инженернотехнических расчетов, языки Lisp и Prolog— для работы над системами искусственного интеллекта м т. д. Система же Delphi позволяет создавать профессиональные и эффективно работающие приложения, используемые в самых различных сферах человеческой деятельности. Поэтому время, затраченное будущим специалистом на изучение данной системы программирования, будет потрачено с пользой, вне зависимости от того, какую специализацию он изберет для себя в дальнейшем. Одну из основных целей при написании данной книги авторы видели в том, чтобы в доступной форме научить специалиста основам процесса программирования в системе Borland Delphi, а также сообщить ему необходимые базовые знания в зто访 области, которые в дальнейшем он сможет пополнять путем самообразования.
ПрвАмсловме
Все представленные в пособии программы на языке Паскаль реально работают. Любой желающий, мало-мальски разбирающийся в программировании, аккуратно набрав преложенные примеры программ, после их запуска, сможет получить требуемый результат и не разочаруется. Это же относится и к рассмотренным в книге проектам в системе Delphi, которые работают в любой версии данного программного продукта, начиная с пятой и заканчивая последней. На момент завершения работы над книгой последней версией была девятая.
В. М. Пестриков, СПбГАСЭ
А. Н. Маслобоев, СПбГТУ РП