Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Контр раб Ч2

.pdf
Скачиваний:
6
Добавлен:
14.03.2016
Размер:
345.34 Кб
Скачать

ОСНОВЫ ПРОГРАММИРОВАНИЯ НА OBJECT PASCAL

В СРЕДЕ DELPHI

Содержание

1.Создание заготовки для учебных программ

2.Учебные программы

2.1.Программа для умножения целых чисел INTMULT

2.2.Программа-калькулятор CALC

2.3.Программа расчета среднего арифметического AVERAGE

2.4.Программа для преобразования строчных букв UPSTRING

2.5.Программа возведения в степень POWER

2.6.Программа вывода одномерных массивов переменной длины MYARRAY

2.7.Программа вывода на экран таблицы с расчетом RELATION

2.8.Программа рекурсивного вычисления факториала FACTORIAL

1.Создание заготовки для учебных программ

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

1. Запустите среду Delphi и измените следующие свойства формы, значения которых отличаются от умалчиваемых, в окне инспектора объектов (Object Inspector).

 

Форма

Свойство

Значение

Caption

Учебная программа

Height

420

Name

fmExample

Position

poScreenCenter

Width

560

2. Со страницы Standard палитры компонентов поместите в окно формы два компонента Panel. В окне Object Inspector нужно изменить некоторые свойства этих компонентов в соответствии с таблицей.

 

Нижняя панель

Верхняя панель

Свойство

 

Значение

Свойство

Значение

Align

 

alBottom

Align

alBottom

Caption

 

 

BevelOuter

bvNone

Height

 

60

Caption

 

 

 

 

Height

60

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

Компонент Panel имеет развитые средства создания различных эффектов трехмерности за счет использующихся в нем двух кромок – внешней и внутренней. Для того чтобы убрать внешнюю кромку свойству BevelOuter (внешняя кромка) присвоено значение bvNone.

1

3. Разместите два компонента BitBtn (страница Additional) на нижней панели в окне формы. Измените некоторые свойства этих компонентов в соответствии с таблицей.

 

Кнопка OK

Кнопка Close

 

(компонент BitBtn на странице Additional)

(компонент BitBtn на странице Additional)

Свойство

 

Значение

Свойство

 

Значение

Kind

 

bkOk

Kind

 

bkClose

Left

 

80

Left

 

400

Name

 

bbRun

Name

 

bbClose

Top

 

20

Top

 

20

Компонент BitBtn является командной кнопкой с надписью и пиктограммой. Он представляет собой разновидность стандартной кнопки Button. Ее отличительная особенность – свойство Glyph, с помощью которого определяется растровое изображение, рисуемое на поверхности кнопки. Существует несколько стандартных разновидностей кнопки BitBtn, задаваемых свойством Kind. В программе используются две кнопки. Кнопка Ok предназначена для подтверждения ввода, а Close – для завершения работы программы.

Свойства Left (Слева) и Top (Сверху) определяют положение левого верхнего угла компонента относительно такого же угла своего контейнера.

4.Со страницы Standard перенесите компонент Edit на верхнюю панель в окне формы,

иизмените его свойства в соответствии с таблицей.

Строка ввода (компонент Edit на странице Standard)

Свойство

Значение

Name

edInput

Left

210

Text

 

Top

20

Width

140

Компонент Edit – стандартный управляющий элемент Windows для ввода, представляющий собой однострочный редактор текста. Он может быть использован для отображения короткого фрагмента текста и позволяет пользователю вводить текст во время выполнения программы.

Свойство Text (Текст) у компонента Edit определяет текст, который будет содержать строка ввода в момент появления на экране. Следует очистить это свойство, чтобы начальный текст не мешал вводу данных для программы.

5. Со страницы Standard перенесите компонент Label в любое свободное место над панелями в окне формы, и измените его свойства в соответствии с таблицей.

Метка

(компонент Label на странице Standard)

Свойство

Значение

Align

alBottom

Caption

 

Name

lbOutput

Компонента Label (метка) предназначены для размещения на форме различного рода текстовых надписей. Для этого служит свойство Caption. В учебной программе метка предназначена для размещения коротких сообщений, которые будет формировать программа.

6. Со страницы Standard перенесите компонент Memo в любое свободное место над панелями в окне формы, и измените его свойства в соответствии с таблицей.

2

Многострочный редактор (компонент Memo на странице Standard)

Свойство

Значение

Align

alClient

Lines

 

ScrollBars

ssBoth

Name

mmOutput

Wordwrap

False

Компонент Memo предназначен для ввода, редактирования и/или отображения достаточно длинного текста (32 Кб, 10–20 страниц). Текст хранится в свойстве Lines класса TStrings и представляет собой пронумерованный набор строк (нумерация начинается с нуля).

Чтобы в окне Memo не было текста, мешающего выводу программой требуемой информации необходимо очистить свойство Lines. Для этого щелкните по этому свойству в окне Инспектора объектов и вызовите диалоговое окно изменения свойства. Затем удалите текст Memo1 (или mmOutput), если к этому моменту вы уже дали компоненту рекомендуемое имя) и закройте окно.

Свойство ScrollBars позволяет поместить в редактор полосы прокрутки, вертикальную, горизонтальную или обе сразу, для того, чтобы можно было увидеть текст, отсекаемый границами компонента. В учебной программе значение ssBoth (оба) свойства ScrolBars помещает в окно компонента Memo две полосы прокрутки – горизонтальную и вертикальную.

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

False.

Значение alClient свойства Align означает, что компонент Memo займет всю оставшуюся не заполненной часть формы.

7. Сохраните модуль формы в файле с именем Example.pas (File/Save As) в каталоге репозитория Delphi. Этот каталог имеет имя Objrepos и размещается в каталоге размещения

Delphi (например – c:\Program Files\Borland\Delphi4).

Чтобы вызвать диалоговое окно регистрации формы в архиве, щелкните по форме правой кнопкой мыши и в появившемся вспомогательном меню выберите продолжение Add To Repository. Не рекомендуется пользоваться опцией меню Project/Add То Repository, так как в этом случае в репозиторий будет добавлен проект, а не форма. Проекты из репозитория копируются целиком вместе с многочисленными родительскими классами, что замедляет время создания нового проекта и приводит к неоправданным затратам дисковой памяти.

3

В строке Title напишите имя формы fmExample, в строке Description - пояснение, например, «Прототип главной формы для учебной программы». Раскройте список Page и выберите в нем Forms и закройте окно регистрации кнопкой ОК. Теперь форма зарегистрирована и ее в любой момент можно выбрать с помощью опции File/New главного меню Delphi.

8. С помощью опции меню Tools/Repository вызовите диалоговое окно и установите выбор в переключателях New Form (новая форма) и Main Form (главная форма). Закройте диалоговое окно клавишей OK.

Закройте созданное окно заготовки учебной программы (File/Close All).

2. Учебные программы

2.1Программа для умножения целых чисел INTMULT

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

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

С помощью опции File/New Application главного меню Delphi откройте новый проект. Сохраните проект под именем Intmult.dpr в папке С:\Projects\Intmult\, а модуль под именем Main.pas в той же папке.

Поместите на форму fmExample новую кнопку BitBtn так, чтобы она полностью закрыла собой bbRun. Назовите новую кнопку bbResult (свойство Name), установите для нее свойство Kind в bbОК и сделайте ее временно невидимой (свойство Visible – значение False). После такой подготовки в момент начала работы новая кнопка не будет видна и не помешает пользователю щелкнуть по кнопке bbRun. В обработчике события bbRun-Click следует спрятать кнопку bbRun и показать кнопку bbResult, чтобы пользователь смог подтвердить ввод второго операнда.

Чтобы пользователь не мог случайно ввести строку, которая не содержит правильного представления целого числа, удалите из формы редактор edInput и поместите на его место компонент MaskEdit (страница Additional). Дайте ему прежнее имя edInput (свойство Name) и раскройте диалоговое окно свойства EditMask. Это свойство указывает маску компонента, т. е. определяет, какие символы и в какой последовательности может набирать пользователь в окне ввода. В строке Input Mask введите

#99999999;1;

Вокошке Character for Blanks вместо умалчиваемого символа-заполнителя «_» укажите пробел и закройте окно кнопкой ОК.

TMaskEdit – аналог TEdit, но с возможностью форматированного ввода. Формат определяется в свойстве EditMask в виде некоторого шаблона. Шаблон состоит из трех частей, отделенных друг от друга символами «;». Первая часть задает маску ввода, вторая – это символ «0» или «1», определяющий, записывается ли в Text результат наложения маски или исходный текст («0» – исходный текст). В третьей части указывается символ, который в окне редактора будет стоять в полях, предназначенных для ввода символов. В редакторе свойств для EditMask есть заготовки некоторых форматов: даты, валюты и т.п.

Маска состоит из описателей полей ввода, специальных символов и литералов. Описатель указывает, какой именно символ может ввести пользователь в данное поле (описатель

4

всегда описывает поле единичной длины, т.е. рассчитанное на ввод одного символа). Так запись #99999999 означает, что в водимой строке первый символ (#) может содержать цифру, или знак «+» или «–», а на месте символов «9» может находится любая цифра, ни какие другие символы кроме указанных не могут вводится в данные поля. Благодаря этому максимальный размер множителя составляет девятизначное число без знака, или восьмизначное со знаком. Сформированная таким образом маска заставит компонент автоматически контролировать ввод пользователя и отвергать любые символы, кроме знаков "+" или "–" в первой позиции (элемент маски «#») и цифр (элементы «9»).

Дважды щелкните по кнопке bbResult и введите такой код для обработчика события OnClick этой кнопки:

procedure TfmExample.bbResultClick(Sender: TObject); // Обработка ввода 2-го операнда

begin // Преобразуем текст из edInput в целое число

Y := StrToInt(Trim(edInput.Text));

// Сообщаем в Memo о вводе 2-го операнда

mmOutput.Lines.Add('2-ой операнд: '+edInput.Text); // Вычисляем и показываем результат

mmOutput.Lines.Add('Результат: ' +

IntToStr(X)+'*'+IntToStr(Y)+'='+IntToStr(X*Y)); edInput.Text:=''; // Очищаем ввод edInput.SetFocus; // и возвращаем ему фокус

lbOutput.Caption:='Введите 1-й операнд:'; // Приглашаем к вводу

bbResult.Hide; // Прячем кнопку bbResult bbRun.Show; // и показываем bbRun

end;

Выражение StrToInt(Trim(edInput.Text)) состоит из вызова стандартных для Object Pascal функций: сначала вызывается функция Trim, которая возвращает строку-аргумент (в нашем случае edInput.Texf) без обрамляющих ее (т. е. ведущих и ведомых) пробелов; затем с помощью вызова StrToInt строка символов преобразуется к целому числу.

Для ввода обработчика события OnClick кнопки bbRun нужно сначала с помощью списка выбора в верхней части окна Инспектора Объектов отыскать и выбрать компонент bbRun, так как он полностью закрыт кнопкой bbResult, затем дважды щелкнуть в правом столбце строки OnClick на странице Events и ввести такой код:

procedure TfmExample.bbRunClick(Sender: TObject); // Обработка ввода 1-го операнда

begin

// Преобразуем текст из edInput в целое число

X := StrToInt(Trim(edInput.Text));

// Сообщаем в Memo о вводе 1-го операнда

mmOutput.Lines.Add('1-ый операнд: '+edInput.Text); edInput.Text := ''; // Очищаем ввод edInput.SetFocus; // и возвращаем ему фокус

lbOutput.Caption := 'Введите 2-й операнд:'; //Приглашаем к вводу bbResult.Show; // Показываем кнопку bbResult

bbRun.Hide;

//и прячем bbRun

end;

 

Далее необходимо передать фокус ввода компоненту edInput в момент старта программы и определить переменные X и Y для хранения операндов. Разыщите в окне кода программы описание класса TfmExample и отредактируйте его следующим образом:

5

private

{ Private declarations }

X,Y: Integer;

Затем с помощью списка выбора в окне Инспектора Объектов выберите форму fmExample и после двойного щелчка на строке ОпActivate страницы Events введите такой обработчик события:

procedure TfmExample.FormActivate(Sender: TObject); // Подготовка к началу работы

begin

edInput.SetFocus; // Передаем фокус ввода редактору edInput lbOutput.Caption := 'Введите 1-й операнд:';

end;

Программа аварийно завершится, если при щелчке по кнопкам bbRun или bbResult редактор не содержит текста. Чтобы избежать того, перед каждым вызовом функции StrToInt вставьте оператор

if Trim(edInput.Text) = '' then Exit;

Этот оператор прекращает дальнейшую работу обработчика в случае, если в окне ввода компонента edInput нет текста.

Сохраните проект (File/Save All). Скомпилируйте и запустите программу INTMULT. Ее окно показано на рисунке.

Закройте проект командой главного меню File/Close All.

2.2. Программа-калькулятор CALC

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

С помощью опции File/New Application главного меню Delphi откройте новый проект. Сохраните проект под именем Calc.dpr в папке С:\Projects\Calc\, а модуль под именем Main.pas в той же папке.

Переименуйте компонент edInput в edInput1. Справа от компонента edInput1 поместите компонент ComboBox, назовите его cbSign (свойство Name). Раскройте диалоговое окно свойства Items этого компонента и введите четыре строки со знаками математических действий в следующей последовательности:

6

+

*

/

Компонент ComboBox во многом напоминает ListBox, за исключением того, что позволяет вводить информацию в маленьком поле ввода сверху ListBox. Есть несколько типов ComboBox, но наиболее популярен выпадающий вниз (drop-down combo box), который можно видеть внизу окна диалога выбора файла.

Справа, от cbSign разместите еще один компонент Edit и назовите его edInput2. Очистите свойства Text у всех трех компонентов.

Для обработчика события bbRunClick введите такой текст:

procedure TfmExample.bbRunClick(Sender: TObject); var

X, Y, Z: Real; begin

//Блокируем работу, если не введены операнды и не выбрано действие if (edInput1.Text='') or (edInput2.Text='')

or (cbSign.ItemIndex<0) then Exit;

// Проверяем правильность ввода 1-го операнда try // Начало защищенного блока

X := StrToFloat(Trim(edInput1.Text)); except // Обработка ошибки

ShowMessage('Ошибочная запись числа:'+edInput1.Text); edInput1.SetFocus;

Exit;

end; // Конец защищенного блока

// Проверяем правильность ввода 2-го операнда try // Начало защищенного блока

Y := StrToFloat(Trim(edInput2.Text)); except // Обработка ошибки

ShowMessage('Ошибочная запись числа:'+edInput2.Text); edInput2.SetFocus;

Exit;

end; // Конец защищенного блока // Все правильно: вычисляем результат case cbSign.ItemIndex of

0:Z := X + Y;

1:Z := X - Y;

2:Z := X * Y;

3:try

Z := X / Y; except

Z := 1.1e+38; // Бесконечность при делении на О end;

end;

// Показываем результат

lbOutput.Caption := Trim(edInput1.Text)+' '+ cbSign.Items[cbSign.ItemIndex]+' '+Trim(edInput2.Text)+' = '; if Z >= 1.1e+38 then

7

lbOutput.Caption := lbOutput.Caption+'бесконечность' else

lbOutput.Caption := lbOutput.Caption+FloatToStr(Z);

mmOutput.Lines.Add(lbOutput.Caption); // Очищаем ввод

edInput1.Text := ''; edInput2.Text := ''; cbSign.ItemIndex := -1; edInput1.SetFocus;

end;

Обработчики исключений строятся в виде таких конструкций:

try

<защищенный блок операторов> except

<обработка исключения> end;

Все операторы, располагающиеся между зарезервированными словами try и except относятся к защищенному блоку. Если при выполнении любого из них возникнет исключение, управление будет передано в блок операторов, располагающихся между except и end, но если обработка защищенного блока пройдет без ошибок, блок <обработка исключения> игнорируется и правление передается оператору, следующему за end.

Сохраните проект (File/Save All). Скомпилируйте и запустите программу CALC. Ее окно показано на рисунке.

Закройте проект командой главного меню File/Close All.

8

2.3. Программа расчета среднего арифметического AVERAGE

Эта программа создает массив из N случайных целых чисел, равномерно распределенных в диапазоне от 0 до MAX_VALUE – 1, подсчитывает среднее арифметическое этих чисел,

атакже определяет и выводит на экран минимальное и максимальное из них.

Спомощью опции File/New Application главного меню Delphi откройте новый проект. Сохраните проект под именем Average.dpr в папке С:\Projects\Average\, а модуль под именем Main.pas в той же папке.

Для создания массива используется встроенная функция Random(Max), которая возвращает случайное целое число, равномерно распределенное в диапазоне от 0 до Max – 1 (Max – параметр обращения).

procedure TfmExample.bbRunClick(Sender: TObject);

const

N = 1000; // Количество элементов массива MAX_VALUE =100+1;// Диапазон значений случайных чисел

var

 

Массив

чисел

m: array [1..N] of Integer;

//

i: Integer;

//

Индекс

массива

max,min: Integer; // Максимальное и минимальное число sum: Real; // Сумма чисел

begin

// Наполняем массив случайными числами: for i := 1 to N do

m[i] := Random(MAX_VALUE);

//Задаем начальные значения переменных sum := m[1];

max := m[1]; min := m[1];

//Цикл вычисления суммы всех случайных чисел и поиска

//минимального и максимального

for i := 2 to N do begin

sum := sum + m[i]; if m[i] < min then

min := m[i]

else if m[i] > max then max := m[i]

end;

// Вычисляем среднее значение и выводим результат lbOutput.Caption := 'Мин = '+IntToStr(min)+' Макс = '+ IntToStr(max)+' Среднее = '+FloatToStr(sum/N);

end;

Сохраните проект (File/Save All). Скомпилируйте и запустите программу AVERAGE. Ее окно показано на рисунке.

9

Закройте проект командой главного меню File/Close All.

2.4.Программа для преобразования строчных букв UPSTRING

Вданной программе используется процедура, в которой преобразуется некоторая символьная строка таким образом, чтобы все строчные буквы заменялись соответствующими прописными. В Object Pascal имеется стандартная функция UpCase, которая выполняет аналогичные действия над одиночным символом. Данная процедура (UpString) будет преобразовывать сразу все символы строки, причем она пригодна не только для латинских букв, но и для букв русского алфавита.

С помощью опции File/New Application главного меню Delphi откройте новый проект. Сохраните проект под именем UpStr_P.dpr в папке С:\Projects\UpStr_P\, а модуль под именем Main.pas в той же папке.

Разработка программы проводится в два этапа. Сначала сконструируем основную (вызывающую) часть программы. Она должна получить входную строку из компонента edInput, преобразовать ее с помощью процедуры UpString в выходную строку и поместить результат в lbOutput.Text. Это нужно запрограммировать в обработчике bbRunClick:

procedure TfmExample.bbRunClick(Sender: TObject); procedure UpString(stInp: String; var stOut: String);

//Эта процедура преобразует все буквы строки stInp в прописные

//и помещает результат в выходную строку stOut

begin

 

 

stOut := stInp;

 

end;

// UpString

 

var

 

 

SI, S2: String;

 

begin

 

// Получаем исходную строку

SI := edInput.Text;

UpString(SI,S2);

// Преобразуем ее

lbOutput.Caption := S2;

// Выводим результат

edInput.Text := '';

 

edInput.SetFocus;

end;

10