Лабораторная работа 2
.pdf
11
Этот оператор прекращает дальнейшую работу обработчика в случае, если в окне ввода компонента edInput нет текста.
Окно программы INTMULT показано на рисунке.
Сохраните проект (File/Save All).
3.3. Разработка программы CALC
Данная программа, имитирует работу микрокалькулятора. Программа вводит два операнда и знак математического действия, после чего показывает результат.
С помощью опции File/New Application главного меню Delphi откройте новый проект. Сохраните проект под именем Calc.pas в папке С:\Projects\Calc\, а модуль под именем Main.pas в той же папке.
Переименуйте компонент lbInput в lbInput1. Справа от компонента lbInput1 поместите компонент ComboBox, назовите его cbSign (свойство Name). Раскройте диалоговое окно свойства Items этого компонента и введите четыре строки со знаками математических действий в следующей последовательности:
+
–
*
/
Компонент 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-го операнда
12
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
lbOutput.Caption := IbOutput.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.
13
Окно программы CALC показано на рисунке.
Сохраните проект (File/Save All).
3.4. Учебная программа AVERAGE
Эта программа создает массив из N случайных целых чисел, равномерно распределенных в диапазоне от 0 до MAX_VALUE – 1, подсчитывает среднее арифметическое этих чисел,
атакже определяет и выводит на экран минимальное и максимальное из них.
Спомощью опции File/New Application главного меню Delphi откройте новый проект. Сохраните проект под именем Average.pas в папке С:\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[l]; min := m[l];
//Цикл вычисления суммы всех случайных чисел и поиска
//минимального и максимального
for i := 2 to N do begin
sum := sum + m[i];
14
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;
Окно программы AVERAGE показано на рисунке.
Сохраните проект (File/Save All).
3.5. Учебная программа UPSTRING
В данной программе используется процедура, в которой преобразуется некоторая символьная строка таким образом, чтобы все строчные буквы заменялись соответствующими прописными. В Object Pascal имеется стандартная функция UpCase, которая выполняет аналогичные действия над одиночным символом. Данная процедура (UpString) будет преобразовывать сразу все символы строки, причем она пригодна не только для латинских букв, но и для букв русского алфавита.
С помощью опции File/New Application главного меню Delphi откройте новый проект. Сохраните проект под именем UpStr_P.pas в папке С:\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
|
15 |
SI, S2: String; |
|
begin |
// Получаем исходную строку |
SI := edInput.Text; |
|
UpString(SI,S2); |
// Преобразуем ее |
lbOutput.Caption := S2; |
// Выводим результат |
edInput.Text := ''; |
|
edInput.SetFocus; |
|
end; |
|
В этой программе используется замещение процедуры UpString «заглушкой», в которой на самом деле не осуществляется нужных действий, а выходная строка просто копирует входную.
При разработке алгоритма процедуры необходимо учесть, что в соответствии с принятой в Windows ANSI-кодировкой, символы кириллицы располагаются сплошным массивом от «А» до «я», за исключением «ё» и «Ё», которые предшествуют «А». Кроме того, символ «я» имеет внутренний код 255, т. е. максимально возможное значение одного байта.
Возможный вариант процедуры:
procedure UpString (stInp: String; var stOut: String);
//Эта процедура преобразует все буквы строки stInp в прописные
//и помешает результат в выходную строку stOut
var
k: Integer; // Параметр цикла begin
StOut := stInp;
// Цикл no-буквенного преобразования
for k : = 1 to Length(stOut) {Length - длина строки} do begin
stOut[k] := |
UpCase (stOut[k]); |
// Преобразуем латиницу |
|||
if |
stOut[k] |
>= 'a' |
then // Строчная |
буква кириллицы? |
|
|
stOut[k] |
:= // Да: преобразуем ее |
|
||
|
Chr(ord('A') + |
ordtstOut[k]) - ord('a')); |
|||
if stOut[k]='ё' then |
// Преобразуем ё |
|
|||
end; |
stOut[k] |
:= 'Ё'; |
в Ё |
||
// UpString |
|
|
|
||
end; |
|
|
|
||
Сохраните проект (File/Save All).
Рассмотрим способ реализации той же программы в виде функции.
С помощью опции File/New Application главного меню Delphi откройте новый проект. Сохраните проект под именем UpStr_F.pas в папке С:\Projects\UpStr_F\, а модуль под именем Main.pas в той же папке. Код функции, преобразующей строчные буквы кириллицы в прописные, представлен ниже.
procedure TfmExample.bbRunClick(Sender: TObject); function UpString(stlnp: String): String;
//Эта функция преобразует все буквы строки stlnp в прописные
//и помещает результат в выходную строку Result
var
k: Integer; // Параметр цикла begin
Result := stInp;
// Цикл по-буквенного преобразования
|
16 |
|
for k := 1 to Length(Result) do |
|
|
begin |
|
|
|
Result[k] := UpCase(Result[k]); // Преобразуем латиницу |
|
|
if Result[k] >= 'a' then // Строчная буква кириллицы? |
|
|
Result[k] := |
// Да: преобразуем ее |
|
Chr(ord('A') + ord(Result[k]) - ord('a')); |
|
|
if Result[k] = 'ё' then |
|
|
Result[k] := 'Ё'; // Преобразуем ё в Ё |
|
end; |
|
|
end; |
// UpString |
|
begin
//В следующем операторе исходная строка edInput.Text
//преобразуется и помещается в выходную строку lbOutput.Caption: lbOutput.Caption := UpString(edInput.Text);
edInput.Text := '';
edInput.SetFocus;
end;
Окно программы Upstring показано на рисунке
Сохраните проект (File/Save All).
