Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка лаб по ООП с ИИТ.doc
Скачиваний:
17
Добавлен:
23.08.2019
Размер:
919.04 Кб
Скачать

Лабораторная работа 7.Создание числовых изображений

Задание1.

1. Поместите в форму чертежную табли­цу - компонент DrawGridl (его заготовка имеется на вкладке Additional палитры компонентов). Расположить ее нужно так, чтобы она занимала большую часть фор­мы за исключением небольшого места внизу, куда поместите еще две кнопки.

2. В паспорте DrawGridl зада­йте следующие характеристики некоторых свойств этой таблицы. Чтобы вызвать ощущение бездонности «числового космоса», сделайте цвет фона черным ­

Color: ctВlack.

3. Принятые по умолчанию ширину столб­ца таблицы DefaultColWidth и высоту ее строки Default RowHeight установите равными трем пикселям.

4. Для ото­бражения ячеек таблицы используем инструкции своей программы, поэтому откажитесь от принятых по умол­чанию средств Delphi DefaultDrawing: False.

5. Выбрав ну­левую толщину линий сетки (GridLineWidth: О), вы тем самым избавляетесь от табличной сетки.

6. Для отклю­чения обрамления таблицы установим стиль рамки: BorderStyle: bsNone.

7. Разместите в форме часы Тimeгl (вкладка System па­нели компонентов). Под DrawGridl расположите две кнопки с заголовками СТОП и ПУСК

Обработчик щелчка на первой из них содержит всего одну строку программы: Тimer1. Enabled : = fa1se;

обработчик дру­гой –

Timer1.Enabled := true.

С помощью этих кнопок вы будете останавливать часы и снова их запускать. Изображения формируется при срабатывании прерывания от этих часов через интервалы времени длительностью 1 секунда (при желании величину интервала можно из­менить).

8. У таблицы DrawGridl имеются свойства ColCount и Row Count, устанавливающие соответствен­но 'Количество (соипt) столбцов и строк (rows). Вам удобнее будет пользоваться другими обозначени­ями для них, поэтому опишете следующие глобальные переменные:

var

Form1: TForm1;

m:integer=1;

n:integer;

9. Количество строк можно рассчитать при создании формы в процедуре TForm1.FormCreate (заготовка этой процедуры откроется, если два раза щелкнуть мышью на свободном месте формы):

procedure TForm1.FormCreate(Sender: TObject);

begin

with DrawGrid1 do

begin

n := round(Height/DefaultRowHeight); // рассчитываем количество строк

RowCount := n; //и устанавливаем их в таблице

end;

end;

10. Количество столбцов необходимо увеличивать на 1 байт всякий раз при срабатывании таймера. Текст процеду­ры TForm1. TimerIТimer приводится ниже.

procedure TForm1.Timer1Timer(Sender: TObject);

var

k: integer ; // Счетчик сквозной нумерации ячеек таблицы

i, j: integer; //Счетчик циклов

Area: TRect; // Вспомогательный прямоугольник

begin

inc(m); // Увеличиваем m на 1

Caption := ' '+ IntToStr(m); // В заголовке формы высвечиваем число m

DrawGrid1.ColCount := m; // Устанавливаем в таблице m столбцов

DrawGrid1.Canvas.Brush.Color := clBlack; // "Макаем" кисть в черную краску

for i:=0 to n-1 do // цикл по строкам таблицы

for j:=0 to m-1 do // цикл по столбцам таблицы

begin

Area := DrawGrid1.CellRect(j,i);

DrawGrid1.Canvas.FillRect(Area);

end;

Выше приведена стандартная совокупность опе­раторов по закраске ячейки таблицы, стоящей на пе­ре сечении i-й строки и j-ro столбца, i=O, 1, ..., n-1; j=O, 1, ..., т.1. Обратите внимание, что при вызове функ­ции CeLlRect, определяющей прямоугольник этой ячей­ки (сеll- ячейка, rectaпgle - прямоугольник), снача­ла указывается индекс столбца, а потом - индексстроки. Закрашивание всех ячеек происходит теку­щим цветом кисти, в данном случае - черным. Это необходимо для обновления всего изображения в дальнейшем.

k := -1; // начальная инициализация к

DrawGrid1.Canvas.Brush.Color := clWhite;//"Макаем"кисть в белую краску

for i:=0 to n-1 do

for j:=0 to m-1 do

begin

inc(k); // берем следующее число

if Frac(Sqrt(k)) = 0 then // если оно является точным квадратом, то

begin

Area :=DrawGrid1.CellRect(j,i);

DrawGrid1.Canvas.FillRect(Area); //закрасим текущую яейку белой краской

end;

// перейдем к следующему числу

// и к следующей ячейке

end;

end;

Здесь использованы стандартные функции языка: Sqrt(x) - квадратныЙ корень из числа х, и Frac(x) дробная часть числа х.

В условии if Frac(Sqrt(k)) = о проверяется, извлекается ли нацело квадратный

из числа k.

Таким образом, в данной программе периодически перерисовываются белой краской те ячейки таблицы, номер k которых при сквозном подсчете ячеек по стро­кам слева направо и сверху вниз является квадратом некоторого целого числа.

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

Задание 2.

В этом задании будем отмечать различным цветом квадраты в таблице умножения n х n, если числа, попада­ющие в эти квадраты, при делении на заданное число m (модуль) дают заданный остаток rest. Изменяя число m от 2 до n2 - 1, а при каждом фиксированном m число rest О до m - 1, мы получим коллекцию причудливых орнаментов., выражающих арифметические свойства чисел.

1. Создайте форму, представленную на рисунке.

2. В качестве сцены для арифметических представлений опять используем таблицу DrawGridl. В паспорте DrawGridl уста новим следующие значения ее свойств:

+ FixedCols: 0 (число фиксированных столбцов 0);

+ FixedRows: 0 (число фиксированных строк 0);

+ ScrollBars: ssNone (отсутствие полос прокрутки);

+ DefaultDrawing: false (подключение собственных про­граммных средств отображения ячеек таблицы). ­

3. Изображение «танцующих чисел» в таблице изменять периодически при срабатывании таймера. Для этой цели в форму нужно поместить компонент Timer, установив значение его свойства Enabled в false. Этот таймер будет запускаться при щелчке на кнопке Buttonl с заголовком ПУСК. В обра­ботчике TForml.ButtonlClick этой кнопки напишем одну строчку кода:

Timerl.Enabled := true;

4. Кнопка Button2 с заголовком СТОП предназначена для остановки таймера с тем. В обработчике TForml.ButtonZ Click запишем: Timerl.Enabled := false;

5. Для подключения или отключения сетки таблицы предназ­начен компонент CheckBoxl с заголовком СЕТКА.

6. Размеры таблицы умножения зависят от натурального числа, показанного в поле рядом с надписью: «Таб­лица умножения на». Это поле — компонент SpinEditl, смещенный на форму со вкладки Samples (Образцы) компонентов. В паспорте компонента SpinEditl утановите следующие значения его свойств:

MaxValue: 80 (максимальная величина);

MinValue: 2 (минимальная величина);

Value: 10 (величина по умолчанию).

Значение величины по умолчанию Value: 10 соответствует таблице умножения чисел а х b , где каждый из Множителей а и b пробегает значения от 0 до 9.

Минимальная 2 и максимальная 80 величины задают диапазон изменения размеров таблицы от 2 х 2 до 80 х 80 (здесь измерения указаны в ячейках таблицы).

7. Компоненты класса TSpinEdit помещены после надпи­сей «модуль» (SpinEdit2), «остаток» (SрiпЕditз), «мил­лисекунды» (SpinEdit4). Параметры этих полей пред­ставлены в таблице:

SpinEdit2

SpinEdit3

SpinEdit4

MaxValue

6399

6399

10000

MinValue

2

-1

10

Value

2

0

1000

8. Чтение новых параметров изо всех размещенных в форме полей во время исполнения программы осуще­ствляется при щелчке на кнопке ВuttопЗ с надписью ПРИМЕНИТЬ. Прежде чем приступить к написанию процедуры-реакции для этой кнопки, опишете глобальные переменные в программе:

var

Form1: TForm1; // модуль

m: integer; // остаток

rest: integer; // количество строк (столбцов)

n: integer ; // в таблице умножения

9. Два раза щелкнув мышью на свободном месте фор­мы Form1, откройте заготовку процедуры TForml. Form Create и наберите в ней следующий текст:

procedure TForm1.FormCreate(Sender: TObject);

begin

n:=SpinEdit1.Value; // читаем новые значения

m:=SpinEdit2.Value;

rest:=SpinEdit2.Value;

Timer1.Interval:=SpinEdit4.Value;

with DrawGrid1 do

begin // устанавливаем параметры

DrawGrid1.

DefaultColWidth:=round(Width div n);

DefaultRowHeight:=round(Height div n);

ColCount:=n;

RowCount:=n;

if CheckBox1.Checked then GridLineWidth:=1

else GridLineWidth:=0;

end;

end;

10. Содержимое процедуры-реакции на щелчок на кноп­ке с заголовком ПРИМЕНИТЬ ничем не отличается от только что написанного кода, поэтому скопируем.

11. Ниже приводится текст процедуры-реакции на сра­батывание таймера

TForml. TimerlТimer. Ее заготовка откроется, если два раза щелкнуть мышью в форме на компоненте Timer1.

procedure TForm1.Timer1Timer(Sender: TObject);

var

c,r, // счетчики циклов

// по столбцам и строкам

i: integer ; // число в ячейке таблицы умножения

Area: TRect; //вспомогательный прямоугольник

begin

inc(rest); // увеличиваем остаток

SpinEdit2.Value:=m; //отображаем текущие значения

SpinEdit3.Value:=rest; // модуля и остатка

with DrawGrid1 do

begin

Canvas.Brush.Color:=clWhite;

for r:=0 to n-1 do //закрашиваем все ячейки таблицы

// белым цветом фона

for c:=0 to n-1 do

begin

Area:=CellRect(c,r);

Canvas.FillRect(Area);

end;

Canvas.Brush.Color:=random($1000000); // выбираем цвет по случайному коду

for r:=0 to n-1 do

for c:=0 to n-1 do

begin

i :=c*r ;

// Рассчитываем число

// в таблице умножения,

// стоящее на пересечении

// i строки и j столбца

if i mod m=rest then // Если остаток равен rest то

begin // закрашиваем ячейку

// текущим цветом

Area:=CellRect(c,r);

Canvas.FillRect(Area);

end;

end;

if rest >= m -1 then // Если остаток

//достиг предельного значения, то

begin

rest:= -1;// восстанавливаем его исходное значение

inc(m); // и переходим к следующему значению модуля

if m >= n*n then //Если модуль превысил максимальное значение, то

begin

m:=2; //восстанавливаем его исходное значение и

Timer1.Enabled:=false; // отключаем таймер

end;

end;

end;

end;

initialization //настройка датчика случайных чисел

randomize;

end.

12. Для улучшения качества работы программы в раз­деле инициализации (перед завершающим оператором end. (с точкой)) нужно настроить датчик случайных чисел random на системный таймер: I

initialization

randomize:

Запустите программу.

Задание 3.

Замените строку в программе вместо

if I mod n=rest then

напишите

If Frac(Sqrt(i))=0 then

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

Задание 4.

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