Лабораторная
работа №1
Программирование
линейных алгоритмов
Цель
лабораторной
работы: изучить
основные элементы
визуальной
среды, освоить
использование
простейших
компонентов
DELPHI для ввода/вывода
данных,
и создать приложение,
которое использует
линейный алгоритм.
1.1.Визуальная
среда DELPHI
При
запуске DELPHI на
экране появляется
панель интерфейса,
показанная
на рис. 1.1. Среда
DELPHI визуально
реализуется
в виде нескольких
одновременно
раскрытых на
экране монитора
окон. Количество,
расположение,
размер и вид
окон может
изменяться
программистом.
Главное
окно всегда
присутствует
на экране и
предназначено
для управления
процессом
создания приложения.
Главное
меню содержит
все необходимые
средства для
управления
проектом.
Пиктограммы
главного меню
облегчают
доступ к наиболее
часто применяемым
командам.
Палитра
Компонентов
обеспечивает
доступ к набору
библиотечных
программ среды
DELPHI, которые описывают
некоторый
элемент (компонент),
помещенный
программистом
в окно Формы.
Каждый компонент
имеет определенный
набор свойств,
которые программист
может выбирать
и изменять по
своему усмотрению.
Например, заголовок
окна, надпись
на кнопке, размер,
цвет и тип шрифта
и др. Свойства
компонентов
приведены в
HELP.
Окно
Инспектора
Объектов
предназначено
для изменения
свойств выбранных
компонентов
и состоит из
двух страниц.
Страница Properties
(Свойства)
предназначена
для изменения
необходимых
свойств компонента.
Страница Events
(События) – для
определения
реакции компонента
на то или иное
событие (например,
щелчок кнопки
“мыши ”).
Окно
Формы представляет
собой интерфейс
проектируемого
Windows-приложения.
В это окно на
этапе проектирования
приложения
помещаются
необходимые
компоненты,
которые разработчик
берет из Палитры
Компонентов.
Каждой Форме
проекта соответствует
модуль (Unit),
текст которого
на языке Object Pascal
размещается
в окне Редактора
Кода.
Окно
Редактора Кода
предназначено
для просмотра,
создания и
редактирования
текстов модулей
проекта. При
первоначальной
загрузке в окне
Редактора Кода
находится текст
модуля, содержащий
минимальный
набор операторов
для нормального
функционирования
пустой Формы
в качестве
Windows-приложения.
При размещении
некоторого
компонента
в окне Формы,
текст модуля
автоматически
дополняется
необходимыми
операторами.
Обо
всех происходящих
в системе событиях,
таких как создание
Формы, нажатие
кнопки мыши
или клавиатуры
и т.д., ядро Windows
информирует
окна путем
посылки соответствующих
сообщений.
Среда DELPHI
принимает и
обрабатывает
сообщения с
помощью обработчиков
событий (например,
щелчок кнопки
“мыши” – событие
OnClick, создание
Формы – OnCreate).
Наиболее часто
применяемые
события представлены
в табл. 1.1.
Таблица
1.1 |
Событие
|
Описание
события
|
OnActivate |
Возникает
при активизации
Формы |
OnCreate
|
Возникает
при создании
Формы. В обработчике
данного события
следует задавать
действия, которые
должны происходить
в момент создания
Формы, например
установка
начальных
значений. |
OnClick |
Возникает
при нажатии
кнопки мыши
в области
компонента. |
OnDblClick |
Возникает
при двойном
нажатии кнопки
мыши в области
компонента |
OnKeyPress
|
Возникает
при нажатии
клавиши на
клавиатуре.
Параметр Key
имеет тип Char
и содержит
ASCII-код нажатой
клавиши (клавиша
Enter клавиатуры
имеет код #13,
клавиша Esc - #27
и т.д.). Обычно
это событие
используется
в том случае,
когда
необходима
реакция на
нажатие одной
из клавиш. |
OnKeyDown |
Возникает
при нажатии
клавиши на
клавиатуре.
Обработчик
этого события
получает
информацию
о нажатой клавише
и состоянии
клавиш Shift,
Alt и Ctrl, а также
о нажатой кнопке
мыши. |
Для
создания обработчика
события программисту
необходимо
раскрыть список
компонентов
в верхней части
окна Инспектора
Объектов и
выбрать необходимый
компонент.
Затем, на странице
Events Инспектора
Объектов, нажатием
левой клавиши
мыши выбрать
название обработчика
и дважды щелкнуть
по его правой
(белой) части.
В ответ DELPHI
активизирует
окно Редактора
Кода модуля
и покажет заготовку
процедуры
обработки
выбранного
события. Для
каждого обрабатываемого
события в тексте
модуля организуется
процедура
(procedure), между
ключевыми
словами begin
и end которой
программист
на языке Object Pascal
записывает
требуемый
алгоритм обработки
события.
Переключение
между окном
Формы и окном
Редактора Кода
осуществляется
кнопкой главного
меню с пиктограммой
или клавишей
F12.
1.2. Пример
создания приложения
Задание:
создать Windows-приложение
для вычисления
выражения
.
Численные
значения данных
x, y и z занести
с клавиатуры
в соответствующие
поля панели
интерфейса.
Один из возможных
вариантов
панели интерфейса
создаваемого
приложения
показан на рис.
1.2.
1.2.1. Сохранение
проекта
В
процессе
проектирования
приложения
DELPHI создает
несколько
файлов - проект.
Каждый проект
целесообразно
хранить в отдельной,
заранее созданной
папке. С помощью
подходящего
приложения
Windows создадим
папку и назовем
ее, например,
LAB1.
Для
сохранения
проекта откройте
в главном меню
пункт File
и щелкните
“мышью”
на опции Save
Project As…(Сохранить
проект как…).
Сначала DELPHI
откроет панель
диалога Save
Unit1 As (Сохранить
модуль как)
для сохранения
модуля проекта.
В этой панели
найдем созданную
папку LAB1 и
сохраним в ней
модуль под
именем, например,
UnLinAlg. Обратите
внимание на
то, что DELPHI по
умолчанию
присвоит этому
файлу тип Delphi
unit c расширением
*.pas. Затем
откроется
панель диалога
Save Project1 As . Назовем
наш проект,
например, PrLinAlg
и сохраним
его в этой же
папке. Здесь
DELPHI даст файлу
тип Delphi project и расширение
*.dpr. Убедитесь
в том, что главное
окно DELPHI теперь
называется
PrLinAlg, окно главного
файла проекта-
PrLinAlg.dpr, а окно
модуля проекта-
UnLinAlg.pas.
Старайтесь
давать файлам
осмысленные
имена вместо
однообразных
Unit1 и Project1, предлагаемых
DELPHI.
Чтобы
избежать потери
файлов проекта
в аварийных
ситуациях
связанных,
например, с
выключениием
питания, зависании
системы и т.д.,
рекомендуется
периодически
сохранять
проект,
используя
пиктограмму
главного меню
или опцию
Save All в
меню File.
1.2.2. Настройка
окон
Чтобы
работать с
окном, необходимо
сделать его
активным, щелкнув
“мышью”
в любом месте
окна. У активного
окна заголовок
становится
выделенным,
например, на
рис. 1.1 активным
является окно
Редактора Кода.
Окна
Формы и Редактора
Кода модуля
в правом верхнем
углу имеют
кнопки управления,
которые предназначены:
-для свертывания
окна в пиктограмму,
-для разворачивания
окна на весь
экран и возвращения
к исходному
размеру
,
-для закрытия
окна.
С
помощью “мыши”,
захватывая
одну из кромок
окна или выделенную
строку заголовка,
отрегулируете
нужные размеры
окон Формы,
Редактора Кода,
Инспектора
Объектов и их
положение на
экране.
1.2.3.
Изменение
заголовка Формы
Новая
Форма имеет
одинаковые
имя (Name) и заголовок
(Сaption) - FORM1. Начинающим
программистам
имя Формы менять
не рекомендуется,
т.к. оно используется
в тексте модуля.
Для
изменения
заголовка
активизируйте
окно Инспектора
Объектов и на
странице Properties
в свойстве
Caption замените
заголовок Form1
на Лаб.
работа №1-Линейный
алгоритм.
Убедитесь, что
одновременно
изменился
заголовок окна
Формы.
1.2.4.
Размещение
компонентов
на Форме
Будем
размещать
компоненты
на Форме так,
чтобы они
соответствовали
панели, показанной
на рис 1.2.
Рис.1.2
Для
нанесения
надписей на
Форму используется
компонент
Label. Выберите
в Палитре Компонентов
на странице
Standard пиктограмму
компонента
Label и щелкните
на ней “мышью”.
Затем в нужном
месте Формы
щелкните “мышью”
- появится
надпись Label1. В
свойстве Caption
Инспектора
Объектов замените
надпись Label1
на Введите
значение X:.
В свойстве Font
подберите
шрифт. Аналогично
нанесите на
Форму остальные
надписи. Щелкнув
“мышью”
на любом из
размещенных
компонентов,
отрегулируйте
его местоположение
на Форме и размер.
Для
ввода/вывода
данных в простейших
случаях используются
компоненты
Edit и Memo. Компонент
Edit применяется
в тех случаях,
когда данные
представляются
одной строкой.
Если данные
представляют
собой несколько
строк, то используется
компонент Memo.
Для
создания полей
ввода численных
значений переменных
x, y
и z используем
компонент
Edit. Выберите
в Палитре Компонентов
на странице
Standard пиктограмму
и разместите
компонент Edit
в нужных местах
Формы так же,
как Вы это делали
с компонентом
Label.
Для
вывода результатов
используем
компонент Memo.
Выберите в
Палитре Компонентов
на странице
Standard пиктограмму
,
поместите
компонент Memo
на Форму и
откорректируйте
его местоположение
и размеры.
1.2.5.
Написание
процедуры
обработки
события создания
Формы (FormCreate)
Если
программист
желает, чтобы
при появлении
панели интерфейса
на экране в
соответствующих
полях находились
начальные
значения данных,
он должен учесть,
что при запуске
приложения
возникает
событие - создание
Формы (OnCreate). Создадим
процедуру
обработки этого
события, которая
занесет начальные
значения переменных
x, y, z в
поля Edit1, Edit2
и Edit3 соответственно,
а в поле Memo1
поместит строку
Лабораторная
работа №1 – Линейный
алгоритм. Для
этого дважды
щелкните мышью
на любом свободном
месте Формы.
На экране появится
текст модуля
UnLinAlg, в котором
DELPHI автоматически
создает заготовку
процедуры-обработчика
события создания
Формы:
Procedure TForm1.FormCreate(Sender:TObject).
Между операторами
begin и
end этой
процедуры
вставьте операторы,
которые выполняют
необходимые
действия
(текст модуля
приведен в
п.1.2.7).
1.2.6.
Написание
процедуры
обработки
события нажатия
кнопки Button1
(Button1Click)
Поместим
на Форму кнопку,
нажатие которой
приведет к
вычислению
выражения.
Выберите в
Палитре Компонентов
на странице
Standart пиктограмму
компонента
Button. В свойстве
Caption Инспектора
Объектов замените
надпись на
кнопке Button1
на Вычислить.
В свойстве Font
подберите
шрифт. Отрегулируйте
положение и
размер кнопки.
Затем дважды
щелкните “мышью”
на кнопке, после
чего курсор
установится
в тексте
процедуры-обработчика
события
нажатия кнопки
Button1 : Procedure
TForm1.Button1Click(Sender:TObject).
Внимательно
наберите
операторы этой
процедуры,
используя
текст модуля
UnLinAlg.
1.2.7.
Текст модуля
UnLinAlg
Unit
UnLinAlg;
interface
uses
Windows,
Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 =
class(TForm)
Label1: TLabel;
Edit1: TEdit;
Label2: TLabel;
Edit2: TEdit;
Label3: TLabel;
Edit3: TEdit;
Label4: TLabel;
Memo1: TMemo;
Button1:
TButton;
procedure
FormCreate(Sender: TObject);
procedure
Button1Click(Sender: TObject);
private
{ Private
declarations }
public
{ Public
declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
//
Процедура
обработки
события создания
Формы:
procedure
TForm1.FormCreate(Sender: TObject);
begin
Edit1.Text:='0.4';
//
начальное
значение X
Edit2.Text:='8.75e-2';
//
начальное
значение Y
Edit3.Text:='-19.63';
//
начальное
значение Z
Memo1.Clear;
//
очистка Memo1
// Вывод
строки в Memo1:
Memo1.Lines.Add('Лабораторная
работа №1 - Линейный
алгоритм');
end;
//
Процедура
обработки
события нажатия
кнопки Button1:
procedure
TForm1.Button1Click(Sender: TObject);
var
x,y,z,a,b,c,u
: extended;
//
объявление
локальных
переменных
begin
x:=StrToFloat(Edit1.Text);
//
X присваивается
содержимое
Edit1
y:=StrToFloat(Edit2.Text);
//
Y присваивается
содержимое
Edit2
z:=StrToFloat(Edit3.Text);
//
Z присваивается
содержимое
Edit3
// Вычисляется
выражение
a:=sqrt(x)-y*y*y;
b:=sin(a)/cos(a);
c:=Exp(5*Ln(b));
u:=c+exp(y/z)*sin(z*z);
Memo1.Lines.Add('X
=
'+Edit1.Text+' Y
=
'+Edit2.Text+
'
Z
=
'+Edit3.Text); //
контрольный
вывод X, Y, Z в Memo1
//
Вывод результата
в Memo1:
Memo1.Lines.Add('
U =
'+FloatToStrF(u,ffFixed,8,3));
end;
end.
Данные,
с которыми
работают компоненты
Edit и Memo, имеют тип
String. Поэтому в
процедуре
TForm1.Button1Click при
присваивании
содержимого
полей Edit1,Edit2,Edit3
переменным
X,Y,Z c помощью
функции StrToFloat
осуществляется
преобразование
данных типа
String в действительные
значения с
плавающей
точкой типа
Extended. Если
необходимо
работать с
данными целого
типа, используется
функция StrToInt.
При
выводе данных
в Memo1 используется
метод Add свойства
Lines, причем
для преобразования
данных из
действительного
значения в
строковое и
управления
формой представления
выводимого
результата
используется
функция FloatToStrF.
1.2.8.
Работа с приложением
Для
запуска созданного
приложения
нажмите пиктограмму
главного меню
или клавишу
F9. При этом
происходит
компиляция
модулей и, если
нет ошибок,
компоновка
проекта и создание
выполняемого
файла PrLinAlg.exe.
На экране появляется
панель интерфейса
приложения
(рис.1.2).
Щелкните
“мышью”
на кнопке “Вычислить”
и в поле Memo1
появляется
результат.
Измените исходные
значения x,
y, z в полях
Edit и снова
нажмите кнопку
”Вычислить”.
Убедитесь, что
в поле Memo1
отображаются
новые результаты.
Завершить
работу приложения
можно нажатием
кнопки
в правом верхнем
углу панели
интерфейса.
В
случае нештатного
функционирования
приложения
восстановить
первоначальный
режим работы
с проектом
можно путем
выбора в меню
Run опции ProgramReset или
нажать клавиши
Ctrl+F2.
1.3. Выполнение
индивидуального
задания
По
указанию
преподавателя
выберите свое
индивидуальное
задание. Уточните
условие задания,
количество
и типы исходных
данных. В соответствии
с этим оформите
дизайн панели
интерфейса
проектируемого
приложения,
установите
необходимое
количество
полей Edit,
тексты заголовков
на Форме, размеры
шрифтов, а также
типы переменных
и функции
преобразования
при вводе и
выводе результатов.
Индивидуальные
задания
1.
При
x=14.26, y=-1.22, z=3.5
t=0.564849.
2.
При
x=-4.5,
y=0.75
,z=0.845
u=-55.6848.
3.
При
x=3.74
,
y=-0.825, z=0.16
v=1.0553.
4.
При
x=0.4
,y=-0.875, z=-0.475
w=1.9873.
5.
При
x=-15.246, y=4.642
,
z=20.001
=-182.036.
Лабораторная
работа №2
Программирование
разветвляющихся
алгоритмов
Цель
лабораторной
работы: освоить
использование
простейших
компонентов-переключателей
и создать приложение,
которое использует
разветвляющийся
алгоритм.
2.1. Пример
создания приложения
Задание:
создать Windows-приложение
для вычисления
выражения
Z=
,
где
по желанию
пользователя.
В панели интерфейса
предусмотреть
возможность
управления
контрольным
выводом исходных
данных.
Один
из возможных
вариантов
панели интерфейса
создаваемого
приложения
показан на рис.
2.1.
2.1.1.
Размещение
компонентов
на Форме
Будем
размещать
компоненты
на Форме так,
чтобы они
соответствовали
панели, показанной
на рис 2.1.
Рис. 2.1
При
создании приложений
в DELPHI часто
используются
компоненты
в виде кнопок-переключателей.
Состояние такой
кнопки (включено
- выключено)
визуально
отражается
на Форме. На
панели (рис.
2.1) представлены
кнопки-переключатели
двух типов:
CheckBox и RadioGroup .
Компонент
CheckBox организует
кнопку независимого
переключателя,
с помощью которой
пользователь
может указать
свое решение
типа “да/нет”. Компонент
RadioGroup
организует
группу кнопок
- зависимых
переключателей.
При нажатии
одной из кнопок
группы все
остальные
кнопки выключаются.
Поместите
на Форму компоненты
Label, Edit и Memo
в соответствии
с рис.2.1. Выберите
в Палитре Компонентов
на странице
Standard пиктограмму
компонента
CheckBox и разместите
ее в нужном
месте Формы.
. В свойстве
Caption Инспектора
Объектов замените
надпись CheckBox1
на Контрольный
вывод данных.
. Чтобы при
запуске приложения
кнопка CheckBox
оказалась
включена,
cвойство Checked установите
равным True.
Выберите
в Палитре Компонентов
Standard пиктограмму
компонента
RadioGroup и поместите
ее в нужное
место Формы.
В свойстве
Caption измените
заголовок
RadioGroup1 на
f(x). Для
размещения
кнопок в один
столбец, свойство
Columns установите
равным 1. Дважды
щелкните “мышью”
по правой
части свойства
Items - появится
строчный редактор
списка наименований
кнопок. Наберите
2 строки
с именами:
в первой строке
- sin(x), во второй
- cos(x) и нажмите
ОК. После этого
на Форме появится
группа из двух
кнопок - переключателей
с соответствующими
надписями.
Чтобы при запуске
приложения
первая кнопка
RadioGroup оказалась
включена,
cвойство ItemIndex
установите
равным 0.
2.1.2. Создание
процедур обработки
событий FormСreate
и Button1Сlick
Технология
создания процедур
обработки
событий FormСreate и
Button1Сlick ничем
не отличается
от предыдущей
работы. Внимательно
наберите
операторы этих
процедур, используя
текст модуля
UnRazvAlg.
2.1.3.
Текст модуля
UnRazvAlg
Unit
UnRazvAlg;
interface
uses
Windows,
Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls,
ExtCtrls;
type
TForm1
= class(TForm)
Label1:
TLabel;
Edit1:
TEdit;
Label2:
TLabel;
Edit2:
TEdit;
Label4:
TLabel;
Memo1:
TMemo;
Button1:
TButton;
RadioGroup1:
TRadioGroup;
CheckBox1:
TCheckBox;
procedure
FormCreate(Sender: TObject);
procedure
Button1Click(Sender: TObject);
private
{
Private declarations }
public
{
Public declarations }
end;
var
Form1:
TForm1;
implementation
{$R
*.DFM}
//
Процедура
обработки
события создания
Формы:
procedure
TForm1.FormCreate(Sender: TObject);
begin
Edit1.Text:='0.5';
// начальное
значение X
Edit2.Text:='1.8';
//
начальное
значение Y
Memo1.Clear;
//
очистка Memo1
//
Вывод строки
в Memo1:
Memo1.Lines.Add(‘Лабораторная
работа №2 - Разветвляющийся
алгоритм’);
end;
//
Процедура
обработки
события нажатия
кнопки
Button1:
procedure
TForm1.Button1Click(Sender:
TObject);
var
x,y,z,fx
: extended; //
объявление
локальных
переменных
begin
x:=StrToFloat(Edit1.Text);
//
X присваивается
содержимое
Edit1
y:=StrToFloat(Edit2.Text);
//
Y присваивается
содержимое
Edit2
fx:=sin(x);
//
fx присваивается
начальное
значение
//
Выбор функции,
соответствующей
нажатой кнопке:
case
RadioGroup1.ItemIndex of
0:fx:=sin(x);
1:fx:=cos(x);
end;
//
Вычисление
выражения:
if
xthen
z:=fx
else
z:=y;
//
Проверка состояния
кнопки CheckBox1:
if
CheckBox1.Checked then
Memo1.Lines.Add('X
= '+Edit1.Text+
'
Y = '+Edit2.Text);
//
контрольный
вывод X, Y в Memo1
//
Вывод результата
в Memo1:
Memo1.Lines.Add('
Z = '+FloatToStrF(z,ffFixed,8,3));
end;
end.
Если
нажата первая
кнопка RadioGroup1,
в переменную
целого типа
RadioGroup1.ItemIndex заносится
нуль, если вторая
– единица. Если
кнопка CheckBox1 нажата,
логическая
переменная
CheckBox1.Checked имеет
значение True,
если нет –
False.
2.1.4.
Работа с приложением
Запустите
созданное
приложение.
Используя все
управляющие
компоненты
панели интерфейса,
убедитесь в
правильном
функционировании
приложения
во всех предусмотренных
режимах работы.
2.2. Выполнение
индивидуального
задания
По
указанию
преподавателя
выберите свое
индивидуальное
задание. Создайте
приложение
и протестируйте
его работу.
Индивидуальные
задания
Для
заданий №1-№15
на панели интерфейса
предусмотреть
возможность
выбора одной
из трех функций
f(x): sh(x), x2,
eX.
Лабораторная
работа №3
Программирование
циклических
алгоритмов
Цель
лабораторной
работы: освоить
простейшие
средства отладки
модулей проекта
и создать приложение,
которое использует
циклический
алгоритм.
3.1. Отладка
модулей проекта
Отладка
представляет
собой процесс
обнаружения,
локализации
и устранения
ошибок в проекте.
Она занимает
значительную
часть рабочего
времени программиста,
нередко большую,
чем разработка
проекта.
Практически
любой нетривиальный
проект перед
началом отладки
содержит хотя
бы одну синтаксическую
или логическую
ошибку.
3.1.1. Отладка
синтаксических
ошибок
Синтаксические
ошибки состоят
в нарушении
формальных
правил использования
операторов.
Эти ошибки
появляются
в результате
недостаточного
знания разработчиком
языка программирования
и невнимательности
при наборе
операторов
на экране дисплея.
Поиск
синтаксических
ошибок в модулях
проекта осуществляется
компилятором.
Чтобы дать
программисту
как можно больше
информации
об ошибках,
допущенных
в модуле, компилятор
отмечает ошибки
и продолжает
работу до тех
пор, пока не
будут обработаны
все операторы
модуля. Следует
иметь в виду,
что:
компилятор
распознает
не все ошибки;
некоторые
ошибки могут
повлечь за
собой то, что
правильные
операторы
будут восприниматься
компилятором
как ошибочные,
и наоборот –
ошибочные
операторы
компилятор
воспримет как
верные;
ошибка
в одном месте
модуля может
повлечь за
собой серию
диагностических
сообщений
компилятора
в других местах
модуля;
из-за
некоторых
ошибок компиляция
модуля может
вообще прекращаться
и проверка
последующих
операторов
не производится.
Информация
обо всех ошибках,
найденных в
модуле, выводится
в специальное
окно, которое
появляется
в нижней части
экрана. Каждая
строка этого
окна содержит
имя файла, номер
строки, в которой
обнаружена
ошибка и характер
ошибки. Если
дважды щелкнуть
“мышью”
на строке с
описанием
ошибки, курсор
установится
в той строке
модуля, где
обнаружена
ошибка. Следует
исправлять
ошибки последовательно,
сверху вниз
и после исправления
каждой ошибки
компилировать
программу
заново. С целью
сокращения
времени компиляции
рекомендуется
осуществлять
проверку наличия
ошибок в режимах
Syntax Check и
Compile
меню Project.
Для получения
более полной
информации
о характере
ошибки можно
обратится к
HELP нажатием
клавиши F1.
Отладка
синтаксиса
считается
завершенной,
когда после
очередной
компиляции
в режиме Build
All меню Project
отсутствуют
диагностические
сообщения об
ошибках.
3.1.2. Отладка
логических
ошибок
Логические
ошибки условно
можно разделить
на ошибки алгоритма
и семантические
ошибки. Причинами
таких ошибок
могут быть
несоответствие
алгоритма
поставленной
задаче, неправильное
понимание
программистом
смысла (семантики)
операторов
языка программирования,
нарушение
допустимых
пределов и
правил представления
данных, невнимательность
при технической
подготовке
проекта к обработке
на компьютере.
Для
выявления
ошибок служат
тесты. Тест
– это такой
набор исходных
данных, который
дает результат,
не вызывающий
сомнений.
Промежуточные
и конечные
результаты
теста используются
для контроля
правильности
выполнения
приложения.
Составление
тестов – непростая
задача. Тесты
должны быть
с одной стороны,
достаточно
простыми, чтобы
результат легко
проверялся,
с другой стороны
– достаточно
сложными, чтобы
комплексно
проверить
алгоритм.
Тесты
составляются
по схеме алгоритма
до программирования,
так как составление
тестов помогает
выявить многие
ошибки в алгоритмизации.
Количество
тестов и их
сложность
зависят от
алгоритма.
Комплекс тестов
должен быть
таким, чтобы
все ветви схемы
алгоритма были
пройдены, по
крайней мере,
по одному
разу. Несовпадение
результатов,
выдаваемых
приложением
с результатами
тестов – признак
наличия ошибок.
Эти ошибки
проявляются
в том, что результат
расчета оказывается
неверным либо
происходит
переполнение,
деление на 0 и
др.
Для
локализации
места ошибки
рекомендуется
поступать
следующим
образом. В окне
Редактора Кода
установите
курсор в строке
перед подозрительным
участком и
нажмите клавишу
F4 (выполнить
до курсора).
Выполнение
приложения
будет остановлено
на той строке
модуля, в которой
был установлен
курсор. Текущее
значение любой
переменной
можно увидеть,
если накрыть
курсором
идентификатор
переменной
на 1-2 сек. Нажимая
клавишу F8 (пошаговое
выполнение),
можно построчно
выполнять
программу,
контролируя
содержимое
переменных
и правильность
вычислений.
3.2. Пример
создания приложения
Задание:
создать Windows-приложение,
которое выводит
таблицу значений
функции
и ее разложения
в ряд в виде
суммы
для
значений x
от xn
до xk
c шагом h=(xk
- xn)/10.
В
панели интерфейса
предусмотреть
возможность
управления
выводом исходных
данных и погрешности
вычислений.
Один
из возможных
вариантов
панели интерфейса
создаваемого
приложения
показан на
рис.3.1.
3.2.1.
Размещение
компонентов
на Форме
Вместо
компонента
Edit используем
компонент
SpinEdit, который
обеспечивает
отображение
и редактирование
целого числа
с возможностью
его изменения
посредством
двойной кнопки.
Рис. 3.1
Компонент
SpinEdit находится
на странице
Samples Палитры
Компонентов.
В тех случаях,
когда объем
выводимой
информации
превышает
размер поля
компонента
Memo, целесообразно
снабдить его
линейками
прокрутки. В
свойстве ScrollBars
компонента
Memo1 установим
значение ssVertical
– появится
вертикальная
линейка прокрутки.
Присвоим
модулю имя
UnCiklAlg.
3.2.2. Текст модуля
UnCiklAlg
Unit
UnCiklAlg;
interface
uses
Windows,
Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls,
ExtCtrls, Spin;
type
TForm1
= class(TForm)
Memo1:
TMemo;
Button1:
TButton;
Label1:
TLabel;
Label2:
TLabel;
Label3:
TLabel;
Edit1:
TEdit;
Edit2:
TEdit;
SpinEdit1:
TSpinEdit;
CheckBox1:
TCheckBox;
CheckBox2:
TCheckBox;
CheckBox3:
TCheckBox;
procedure
FormCreate(Sender: TObject);
procedure
Button1Click(Sender: TObject);
private
{
Private declarations }
public
{
Public declarations }
end;
var
Form1:
TForm1;
implementation
{$R
*.DFM}
procedure
TForm1.FormCreate(Sender: TObject);
begin
SpinEdit1.text:='3';
// начальное
значение N
Edit1.text:='0.1';
// начальное
значение Xn
Edit2.text:='2.0';
// начальное
значение Xk
Memo1.Clear;
Memo1.Lines.Add('Лабораторная
работа №3 - Циклический
алгоритм');
end;
procedure
TForm1.Button1Click(Sender: TObject);
var
xn,xk,x,h,c,s,y,al,del:extended;
n,k:integer;
begin
n:=StrToInt(SpinEdit1.Text);
xn:=StrToFloat(Edit1.Text);
xk:=StrToFloat(Edit2.Text);
if
CheckBox1.Checked then
Memo1.Lines.Add(‘Исходные
данные: n=’+IntToStr(n)+
'
Xn='+FloatToStrF(xn,ffFixed,6,1)+
'
Xk='+FloatToStrF(xk,ffFixed,6,1));
h:=(xk-xn)*0.1;
// шаг
h
x:=xn;
repeat
// цикл
по x
c:=-x*x*0.5;
S:=1;
for
k:=1 to n do
begin
s:=s+c*(2*k*k+1);
c:=-c*x*x/((2*k+1)*(2*k+2));
end;
y:=(1-x*x*0.5)*cos(x)-0.5*x*sin(x);
if
CheckBox2.Checked then
if
CheckBox3.Checked then
begin
al:=s-y;
// абсолютная
погрешность
del:=abs((s-y)/y)*100;
// относительная
погрешность
Memo1.Lines.Add('x='+FloatToStrF(x,ffFixed,6,2)+
'
S='+
FloatToStrF(s,ffFixed,6,3)+
'
Y='+
FloatToStrF(y,ffFixed,6,3)+
'
A='+
FloatToStrF(al,ffFixed,6,3)+
'
D='+
FloatToStrF(del,ffFixed,6,0)+'%');
end
else
begin
al:=s-y;
Memo1.Lines.Add('x='+FloatToStrF(x,ffFixed,6,2)+
'
S='+
FloatToStrF(s,ffFixed,6,3)+
'
Y='+
FloatToStrF(y,ffFixed,6,3)+
'
A='+
FloatToStrF(al,ffFixed,6,3));
end
else
if
CheckBox3.Checked then
begin
del:=abs((s-y)/y)*100;
Memo1.Lines.Add('x='+FloatToStrF(x,ffFixed,6,2)+
'
S='+
FloatToStrF(s,ffFixed,6,3)+
'
Y='+
FloatToStrF(y,ffFixed,6,3)+
'
D='+
FloatToStrF(del,ffFixed,6,0)+'%');
end
else
Memo1.Lines.Add('x='+FloatToStrF(x,ffFixed,6,2)+
'
S='+
FloatToStrF(s,ffFixed,6,3)+
'
Y='+
FloatToStrF(y,ffFixed,6,3));
x:=x+h;
until
x>xk;
end;
end.
3.3.
Выполнение
индивидуального
задания
По
указанию
преподавателя
выберите свое
индивидуальное
задание. Создайте
приложение
и протестируйте
его работу.
Индивидуальные
задания
В
заданиях с №1
по №15 необходимо
вывести на
экран таблицу
значений функции
Y(x) и ее разложения
в ряд S(x) для значений
x от
до
с
шагом
.
Близость значений
S(x) и Y(x) во всем
диапазоне
значений x указывает
на правильность
вычисления
S(x) и Y(x).
№ |
|
|
S(x) |
n |
Y(x) |
1
|
0.1
|
1
|
|
16
|
|
2
|
0.1
|
1
|
|
10
|
|
3
|
0.1
|
1
|
|
12
|
|
4
|
0.1
|
1
|
|
8
|
|
5
|
0.1
|
1
|
|
14
|
|
6
|
0.1
|
1
|
|
8
|
|
7
|
0.1
|
1
|
|
12
|
|
8
|
0.1
|
1
|
|
10
|
|
9
|
0.1
|
1
|
|
14
|
|
10
|
0.1
|
0.5
|
|
15
|
|
11
|
0.1
|
0.8
|
|
10
|
|
12
|
0.1
|
1
|
|
8
|
|
Лабораторная
работа №4
Программирование
АЛГОРИТМОВ
с использованием
массивов
Цель
лабораторной
работы:
освоить применение
компонента
StringGrid и создать
приложение,
в котором
используются
массивы.
4.1. Пример
создания приложения
Задание:
создать Windows-приложение
для вычисления
вектора
x={x1,x2,…,xm},равного
p-й строке
матрицы A={aij}(xj=apj,
j=1,2,…,m) и вектора
y={y1,y2,…,yn},
равного q-му
столбцу матрицы
A={aij}(yi=aiq,
i=1,2,…,n) (n6,m8).
В панели интерфейса
предусмотреть
возможность
управления
размерностью
массивов.
Один
из возможных
вариантов
панели интерфейса
создаваемого
приложения
показан на
рис.4.1.
4.1.1. Размещение
компонентов
на Форме
При
работе с массивами
ввод и вывод
информации
на экран удобно
организовывать
с помощью компонента
StringGrid.
Рис. 4.1
Компонент
StringGrid используется
для отображения
информации
в виде таблицы.
Таблица содержит
две зоны –
фиксированную
и рабочую.
Фиксированная
зона служит
для вывода
наименований
строк и столбцов
рабочей зоны
и управления
их размерами
с помощью “мыши”.
Фиксированная
зона выделена
другим цветом
и в нее запрещен
ввод информации
с клавиатуры.
Количество
строк и столбцов
фиксированной
зоны устанавливается
в свойствах
FixedRows и FixedCols, соответственно.
Рабочая
зона содержит
RowCount строк и ColCount
столбцов информации,
которую можно
изменять как
программно,
так и с помощью
“мыши”
или клавиатуры.
Доступ
к информации
в программе
осуществляется
с помощью свойства
Cells[ACol, ARow: integer]: string, где
ACol-номер
столбца, а ARow –
номер строки
таблицы, причем
нумерация
начинается
с нуля.
Пиктограмма
компонента
StringGrid находится
на странице
Additional Палитры
Компонентов.
Так как в нашем
задании для
всех компонентов
StringGrid фиксированная
зона не используется,
в Инспекторе
Объектов значения
свойств FixedCols и
FixedRows установите
равными 0. В
соответствии
с заданием
установите
предельные
значения количества
строк n и
столбцов
m для компонента
StringGrid1: ColCount=8, а RowCount=6
(восемь столбцов
и шесть строк).
Для компонента
StringGrid2 ColCount=1, RowCount=8, а для
компонента
StringGrid3 ColCount=1, RowCount=6.
По
умолчанию в
компонент
StringGrid запрещен
ввод информации
с клавиатуры,
поэтому для
компонента
StringGrid1 необходимо
в Инспекторе
Объектов дважды
щелкнуть “мышью”
на символе +
свойства +Options и
в открывшемся
списке опций
установить
значение goEditing в
True.
Для
удобства работы
с компонентами
SpinEdit установите
для компонента
SpinEdit1 значения
свойств:
MinValue=1, MaxValue=6, а для
компонента
SpinEdit2: MinValue=1, MaxValue=8.
4.1.2. Создание
процедур обработки
событий SpinEdit1Change
и SpinEdit2Change
События
SpinEdit1Change и SpinEdit2Change
возникают
при любом изменении
значения в поле
редактора
SpinEdit1 и SpinEdit2
соответственно.
Создадим процедуры
обработки этих
событий, в которых
присвоим значения
n и m,
полученные
из полей редакторов
SpinEdit, свойствам
ColCount и
RowCount компонентов
StringGrid. Это позволит
управлять
размерами
таблиц StringGrid
с помощью компонентов
SpinEdit без
дополнительных
кнопок, так
как изменение
значений в поле
редактора
SpinEdit сразу приведет
к изменению
размера таблиц
StringGrid. Дважды
щелкните “мышью”
на компоненте
SpinEdit1 – курсор
установится
в тексте
процедуры-обработчика
события SpinEdit1Change:
procedure TForm1.SpinEdit1Change(Sender:
TObject). Внимательно
наберите операторы
этой процедуры,
используя текст
модуля UnMas(см.
п.4.1.3). Аналогичным
образом создайте
процедуру-обработчик
события SpinEdit2Change:
procedure TForm1.SpinEdit2Change(Sender: TObject).
4.1.3. Текст
модуля UnMas
Unit
UnMas;
interface
uses
Windows, Messages,
SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Spin,
Grids;
type
TForm1 =
class(TForm)
Label1: TLabel;
SpinEdit1:
TSpinEdit;
SpinEdit2:
TSpinEdit;
Label8:
TLabel;
StringGrid1:
TStringGrid;
StringGrid2:
TStringGrid;
StringGrid3:
TStringGrid;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
SpinEdit3:
TSpinEdit;
SpinEdit4:
TSpinEdit;
Label6: TLabel;
Label7: TLabel;
Button1:
TButton;
procedure
FormCreate(Sender: TObject);
procedure
SpinEdit1Change(Sender: TObject);
procedure
SpinEdit2Change(Sender:
TObject);
procedure
Button1Click(Sender: TObject);
private
{
Private declarations }
public
{ Public
declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
var
A:array[1..6,1..8]
of extended;// объявление
двумерного
массива A
X:array[1..8]
of extended; // объявление
одномерного
массива X
Y:array[1..6]
of extended; // объявление
одномерного
массива Y
n,m,p,q:integer;
// объявление
глобальных
переменных
procedure
TForm1.FormCreate(Sender: TObject);
begin
SpinEdit1.Text:='4';
//
начальное
значение n
SpinEdit2.Text:='6';
// начальное
значение m
SpinEdit3.Text:='2';
// начальное
значение p
SpinEdit4.Text:='3';
// начальное
значение q
StringGrid1.RowCount:=4;
// количество
строк массива
A
StringGrid1.ColCount:=6;
//
количество
столбцов массива
A
StringGrid2.RowCount:=6;
// количество
строк массива
X
StringGrid3.RowCount:=4;
//
количество
строк массива
Y
end;
procedure
TForm1.SpinEdit1Change(Sender: TObject);
begin
n:=StrToInt(SpinEdit1.Text);//
n
присваивается
содержимое
поля редактора
StringGrid1.RowCount:=n;
// устанавливается
количество
строк массива
A
StringGrid3.RowCount:=n;
// устанавливается
количество
строк массива
Y
end;
procedure
TForm1.SpinEdit2Change(Sender: TObject);
begin
m:=StrToInt(SpinEdit2.Text);//
m
присваивается
содержимое
поля редактора
StringGrid1.ColCount:=m;
//
устанавливается
количество
столбцов массива
A
StringGrid2.RowCount:=m;
//
устанавливается
количество
строк массива
X
end;
procedure
TForm1.Button1Click(Sender:
TObject);
var
i,j:integer;
// объявление
локальных
переменных
begin
n:=StrToInt(SpinEdit1.Text);
StringGrid1.RowCount:=n;
StringGrid3.RowCount:=n;
m:=StrToInt(SpinEdit2.Text);
StringGrid1.ColCount:=m;
StringGrid2.RowCount:=m;
p:=StrToInt(SpinEdit3.Text);
q:=StrToInt(SpinEdit4.Text);
// Ввод
значений из
таблицы в массив
A
for i:=1 to n do
for j:=1 to m do
A[i,j]:=StrToFloat(StringGrid1.Cells[j-1,i-1]);
for
j:=1 to m do
//
формирование
массива X и вывод
его значений
в таблицу
begin
X[j]:=A[p,j];
StringGrid2.Cells[0,j-1]:=FloatToStrF(X[j],ffFixed,3,1);
end;
for
i:=1 to n do
//
формирование
массива Y и вывод
его значений
в таблицу
begin
Y[i]:=A[i,q];
StringGrid3.Cells[0,i-1]:=FloatToStrF(Y[i],ffFixed,3,1);
end;
end;
end.
4.1.4.
Работа с
приложением
Запустите
созданное
приложение.
Занесите числовые
значения в
элементы матрицы
A и убедитесь
в том, что приложение
функционирует
в соответствии
с заданием.
4.2.
Выполнение
индивидуального
задания
Изучите
в приложении
2 описание
компонентов
StringGrid и DrawGrid.
По указанию
преподавателя
выберите свое
индивидуальное
задание.
Создайте
приложение
и протестируйте
его работу.
Индивидуальные
задания
1. Задана
целочисленная
матрица A
размером NxM.
Получить массив
B, присвоив
его k-му элементу
значение 0,
если все элементы
k-го столбца
|