практика
.pdf3. Обеспечьте возможность удаления любого товара из корзины, ис-
пользуя метод ListBox3.Items.Delete(номер_элемента). Отме-
тим, что цикл for… в данном случае использовать нельзя, так как число элементов в списке будет меняться в ходе выполнения цикла. Воспользуйтесь циклом while…. Не забудьте, что при удалении товара должна удаляться и его цена.
Программа должна выглядеть примерно так: i:=0;
while I <= ListBox3.Count-1 do begin
{просматриваем весь список товаров в корзине} if ListBox3.Selected[i] then
{если очередной товар выделен} begin
ListBox3.Items.Delete(i);
{удаляем его из «корзину»}
ListBox4.Items.Delete(i);
{и удаляем его цену из списка цен}
end
else i:=i+1;
{в противном случае переходим к следующему} end;
4. Подготовьте программу формирования кассового чека, содержащего список выбранных товаров с ценами и итоговую сумму. Программа должна выглядеть примерно так:
sum :=0;
for i:=0 to ListBox3.Count-1 do
{просматриваем корзину} begin
Memo1.Lines.Add(ListBox3.Items[i]+ ' '+ ListBox4.Items[i]);
{добавляем в чек название и цену} sum:=sum+StrToInt(ListBox4.Items[i]);
{подсчитываем сумму, считая, что цена выражается целым числом}
end;
Memo1.Lines.Add('Итого '+IntToStr(sum);
{добавляем итоговую сумму к чеку}
5. Добавьте к проекту еще одну форму File New Form. На ней поместите кнопку Найти и объект ComboBox1. На первой форме поместите кнопку Поиск для перехода ко второй форме. Программа для этой кнопки:
Form2.Show;
21
Form2.ComboBox1.Items.LoadFromFile(список товаров);
Обратите внимание, если в программном модуле, относящемся к одной форме, есть обращение к объекту, расположенному на другой форме, перед именем объекта следует указать имя формы.
Кроме того, следует добавить в программный модуль unit1 после строки implementation
следующую строку
uses Unit2;
{присоединение программного модуля второй формы}
Отметим, что в версиях Delphi 6.0 и выше, если этого не сделать, система при запуске программы запросит разрешения сделать это автоматически. Достаточно только подтвердить разрешение и повторить запуск.
Кнопка Найти должна обеспечить вывод цены выбранного в списке ComboBox1 товара. Для этого потребуется следующая программа:
Edit1.Text:=Form1.ListBox2.Items[ComboBox1.ItemIndex]
{из списка цен на первой форме выбирается элемент с тем номером, который был выбран на второй форме}
Задания для самостоятельного выполнения
1.Добавьте на второй форме кнопку возврата к первой форме.
2.Обеспечьте вывод чека во внешний текстовый файл.
3.Обеспечьте при нажатии кнопки Найти на второй форме вывод сообщения «Товар не найден» вместо вывода цены, если товар отсутствует в списке.
Лабораторная работа 11
Алгоритмы сортировки
Задача: усовершенствовать проект «Интернет-магазин», добавив следующие возможности:
–сортировать список товаров в магазине по алфавиту, а также по убыванию цены;
–добавлять новый товар, не нарушая алфавитного порядка.
Порядок выполнения работы 1. Добавьте на форму кнопку с надписью «Сортировать по алфавиту». Про-
грамма обработки нажатия этой кнопки должна реализовать алгоритм сорти-
22
ровки списка товаров методом пузырька и согласованное изменение списка цен. (Отметим, что использование свойства Sorted для объекта ListBox проблемы не решает, так как не позволяет обеспечить соответствие товаров и цен).
Сортировка массива методом пузырька подробно описана в §11 [1].
В данной задаче особенность применения этого метода заключается в том, что вместо массива используется свойство ListBox1.Items и цикл будет выглядеть примерно так
…
repeat
c:=FALSE; {пусть в текущем цикле нет обменов} for k:=0 to ListBox1.Count-2 do
if ListBox1.Items[k] > ListBox1.Items[k+1] then begin {обменяем k-й и k+1-й элементы}
buf := ListBox1.Items [k]; ListBox1.Items[k] := ListBox1.Items[k+1]; ListBox1.Items[k+1] := buf;
c := TRUE; end;
until not c;
{если не было обменов, значит массив отсортирован}
…
2.Добавьте на форму кнопку с надписью «Сортировать по цене». Программа обработки нажатия этой кнопки должна реализовать алгоритм сортировки списка цен методом пузырька и согласованное изменение списка товаров. Обратите внимание, что сортировка должна выполняться по убыванию числовых, а не строковых значений (для чисел 20<100, а для строк '20'>'100').
3.Добавьте на форму два окна для ввода наименования и цены нового товара, а также кнопку с надписью «Добавить товар». Кнопка должна быть активной только при отсортированном по алфавиту списке товаров, и неактивной
впротивном случае. Программа обработки нажатия этой кнопки должна реализовать алгоритм сортировки включением, т.е. находить в списке товаров нужную позицию и вставлять туда новый товар, вставляя при этом цену в такую же позицию списка цен.
Проверьте правильность работы программы, добавляя товар в середину, начало и конец списка.
Задания для самостоятельного выполнения
1*. Добавьте к проекту возможность объединять два отсортированных по алфавиту списка товаров, не нарушая алфавитного порядка. Используйте алгоритм сортировки слиянием.
23
Лабораторная работа 12. Проект «Вычисления в таблице»
Задача: создать программу, выполняющую
−заполнение таблицы случайными целыми числами в диапазоне от -20 до 20;
−возможность изменения данных вручную;
−нахождение сумм, средних, минимальных и максимальных значений по строкам, столбцам и таблице в целом с заполнением таблицы результатов.
Рис. 8
Впроекте использованы:
–главная форма приложения – объект класса TForm;
–таблицы – объекты класса TStringGrid (вкладка Additional);
–объекты класса TSpinEdit (вкладка Samples);
–надписи – объекты класса TLabel (вкладка Standard);
–кнопки – объекты класса TButton (вкладка Standard).
Порядок выполнения работы 1. Подготовьте внешний вид формы, как показано на рис. 8. Для на-
стройки внешнего вида таблицы результатов необходимо написать следующую программу, которая будет выполняться при запуске приложения, т.е. при наступлении события onCreate для объекта Form1:
with StringGrid2 do begin
Cells[0,1]:='Сумма';
24
Cells[0,2]:='Среднее'; Cells[0,3]:='Минимум'; Cells[0,4]:='Максимум'; Cells[1,0]:='По строке'; Cells[2,0]:='По столбцу'; Cells[3,0]:='По таблице';
end;
Запись with StringGrid2 do используется для сокращения записи, вместо того, чтобы несколько раз указывать имя объекта. То же самое дает запись
StringGrid2.Cells[0,1]:='Сумма'; StringGrid2.Cells[0,2]:='Среднее'; StringGrid2.Cells[0,3]:='Минимум'; StringGrid2.Cells[0,4]:='Максимум';
…
2.Обеспечьте возможность ручного ввода данных в таблицу. Для этого
вObject Inspector раскройте список опций в свойстве Options и установите опцию goEditing в значение True.
3.Подготовьте программу заполнения таблицы числовыми данными. Программа должна выглядеть примерно так:
with StringGrid1 do begin
ColCount := SpinEdit2.Value;
RowCount := SpinEdit1.Value;
for i:=0 to SpinEdit2.Value-1 do for j:=0 to SpinEdit1.Value-1 do
Cells[i,j]:=IntToStr(random(21)-10);
end;
Программа устанавливает размеры таблицы, указанные пользователем, и заполняет таблицу случайными числами в нужном диапазоне.
5. Подготовьте программу для вычисления суммы элементов таблицы и занесения ее в таблицу результатов.
with StringGrid1 do begin
for i:=0 to ColCount-1 do
for j:=0 to RowCount-1 do
sum := sum+StrToInt(Cells[i,j]);
end;
25
{запись в нужную позицию таблицы результатов} StringGrid2.Cells[3,1]:=IntToStr(sum);
6. Добавьте к предыдущему коду программу для вычисления максимального элемента строки, номер которой указан пользователем, и занесения его в таблицу результатов.
with StringGrid1 do begin
m := StrToInt(Cells[0,SpinEdit3.Value]); for i:=0 to ColCount-1 do
if StrToInt(Cells[i,SpinEdit3.Value]) > m then m:=StrToInt(Cells[i,SpinEdit3.Value]);
end;
{запись результата в нужную позицию таблицы} StringGrid2.Cells[1,4]:=IntToStr(m);
Задания для самостоятельного выполнения
1.Допишите программу для вычисления остальных значений таблицы результатов.
2.Обеспечьте устойчивую работу программы в случае ошибочного ввода данных в таблицу (например, вместо цифр могут быть введены буквы, или ячейка может быть пустой). Программа должна игнорировать такую ячейку (аналогично табличному процессору MS Excel).
Указание: воспользуйтесь обработкой исключительных ситуаций try … except …
Лабораторная работа 13
Проект «Часовые пояса»
Задача: создать программу, позволяющую
–отображать на экране текущее время в формате ЧЧ:ММ:СС
–переключать часы на любой из 24 часовых поясов Земли.
Рис. 9
Впроекте использованы:
–главная форма приложения – объект класса TForm;
–таймер – объект класса TTimer (вкладка System);
–надписи – объекты класса TLabel (вкладка Standard);
–выпадающий список – объект класса TComboBox (вкладка Standard).
26
Порядок выполнения работы 1. Подготовьте нужные объекты на форме, как показано на рис. 9. Устано-
вите для объекта Timer1 свойство Interval в значение 1000 (1000мс=1с). Для отображения текущего времени необходимо написать следующую программу, которая будет выполняться истечении интервала таймера, равного 1 секунде, т.е. при наступлении события onTimer для объекта Timer1:
Label1.Caption:=TimeToStr(Time);
При запуске программы должны появиться часы, отображающие текущее время. Оно должно изменяться каждую секунду.
2. Подготовьте в объекте ComboBox1 (свойство Items) список числовых значений от -12 до 11, соответствующий всем 24 часовым поясам Земли. Можно сделать это вручную, а можно с помощью программы выполняемой при запуске приложения (событие OnCreate объекта Form1):
for i:=0 to 23 do ComboBox1.Items.Add(IntToStr(i-12));
3. Обеспечьте возможность перевода часов на другой часовой пояс. Для этого в начало программы обработки события onTimer для объекта Timer1 нужно добавить следующий код:
d:=StrToInt(ComboBox1.Text);
{разница во времени, первоначально должна быть равна 0, нужно установить через Object Inspector}
DecodeTime(time,h,m,s,ms);
{выделить из текущего времени часы, минуты, секунды, мс} h := h+d; {вычислить час для выбранного пояса}
time1 := EncodeTime(h,m,s,ms); {сформировать время в выбранном поясе}
Кроме того, не забудьте, что на экран должно выводиться время Time1 (в выбранном часовом поясе) вместо Time.
Описание переменных (блок Var) должно выглядеть так:
i,d |
: |
integer; |
time1 |
: |
TDateTime; |
h,m,s,ms : word;
Проверьте правильность работы программы, переведя часы на 1 или 2 часа назад и вперед.
27
Задания для самостоятельного выполнения
Проверьте правильность работы приложения для всех часовых поясов. В некоторых случаях произойдет аварийное завершение приложения. Это объясняется тем, что в выбранном вами часовом поясе сейчас могут быть другие сутки (вчерашние или завтрашние). При этом вычисленный час окажется отрицательным или большим 24. Например, ваши часы показывают 9 часов, а вы хотите перевести их на 11 часов назад. Должно получиться 22 часа, а вычисленное значение h = 9 – 11 = –2. Измените код программы, чтобы она корректно работала во всех ситуациях.
Лабораторная работа 14
Проект «Анимация»
Задача: смоделировать движение тела, брошенного под углом к горизонту. Математическая модель процесса:
1)время считаем дискретным с интервалом 50 мс;
2)сопротивление воздуха не учитываем, считаем, что на тело действует только сила тяжести;
3)входные данные – угол α и начальная скорость движения v0.
Результатом должна быть визуализация движения от момента броска до падения на землю. Для этого потребуется вычислять координаты тела в каждый момент времени. Они вычисляются по формулам:
x0 = 0; y0 = 0
vгориз = v0 cos α vвертик 0= v0 sin α
xi+1 = xi + vгориз t yi+1 = yi + vвертик t
vвертик i+1 = vвертик i -g t
Переходим к компьютерной модели. Для визуализации движения в проекте используются:
–главная форма приложения – объект класса TForm;
–таймер – объект класса TTimer (вкладка System);
–кнопка – объект класса TButton (вкладка Standard)
–движущееся тело, земля – объекты класса TShape (вкладка
Additional).
28
Порядок выполнения работы 1. С помощью инспектора объектов настройте визуальные компоненты, как
показано на рис. 11. Установите для таймера интервал равный 50, а свойство Enabled равным false (первоначально таймер неактивен)
Рис. 11
2. Для запуска процесса используется кнопка. По событию OnClick выполняется присваивание начальных значений нужным переменным и включение таймера. Возьмем следующие значения исходных данных (подобраны для на-
глядного изображения): α=45°, v0=15, g=0,5, t=1.
procedure TForm1.Button1Click(Sender: TObject); begin
x:=0; y:=0;
alpha:=pi/4; {угол задается в радианах, pi – стандартная функция в паскале}
v0:=15;
v_gor :=v0*cos(alpha); v_vert:=v0*sin(alpha); g:=0.5;
dt:=1;
Timer1.Enabled := true;
end;
29
3. Для моделирования движения потребуется обработать событие OnTimer для таймера. Обработка может выглядеть примерно так:
procedure TForm1.Timer1Timer(Sender: TObject); begin
x:=x+v_gor*dt; y:=y+v_vert*dt; v_vert:=v_vert-g*dt;
{вычисления на основании описанной выше математической модели} Shape1.Left:=round(x); Shape1.Top:=round(shape2.Top-Shape1.Height-y);
{визуализация движения, функция round(округление) необходима, т.к. все данные могут принимать дробные значения и имеют тип real, а координаты объектов на экране (Left и Top) целые}
{Shape1 – движущееся тело, Shape2 - земля}
if shape1.Top>shape2.Top {если тело достигло земли} then Timer1.Enabled:=false; {останавливаем процесс}
end;
Добавьте к программе описание переменных и проверьте правильность работы. При нажатии кнопки тело должно начать двигаться.
Задания для самостоятельного выполнения
1.Обеспечьте пользователю возможность «прицеливаться» – задавать значение угла.
2.Добавьте к проекту еще один компонент – мишень (объект класса TShape) и проверку, поразил ли снаряд мишень.
Лабораторная работа 15 Графическая подсистема Delphi
Задача 1: по нажатию кнопки изобразить на форме прямоугольник 50x100 пикселей с зеленым контуром толщиной 5 пикселей и желтой сплошной заливкой. Программа может выглядеть примерно так:
Form1.Canvas.Brush.Color:=clYellow;
{задаем цвет заливки}
Form1.Canvas.Brush.Style:=bsSolid;
30