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

практика

.pdf
Скачиваний:
18
Добавлен:
13.03.2015
Размер:
665.99 Кб
Скачать

3. Обеспечьте возможность удаления любого товара из корзины, ис-

пользуя метод 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