Проект № 1.
Движение на дороге
1. Изучите материал § 48 учебника (создание объектов в программе).
2. Постройте программу, которая описана в тексте параграфа. Используя выбранную среду программирования, изобразите движение машин по дороге в текстовом или графическом режиме. Для этого дополните класс TCar.
3. program 1;
uses Crt;
{---------------------------------------------
Класс TRoad - модель дороги
---------------------------------------------}
type TRoad = class
Length: real;
Width: integer;
constructor Create(length0: real; width0: integer);
end;
{--------------------------------------------
Класс TCar - модель автомашины
---------------------------------------------}
type TCar = class
X, V: real;
P: integer;
road: TRoad;
procedure show; { + метод для показа машины на экране }
procedure hide; { + метод для скрытия машины с экрана }
procedure move;
constructor Create(road0: TRoad;
p0: integer; v0: real);
end;
{---------------------------------------------
Класс TRoad - модель дороги
Реализация методов.
---------------------------------------------}
constructor TRoad.Create(length0: real; width0: integer);
begin
if length0 > 0 then
Length := length0
else Length := 1;
if width0 > 0 then
Width := width0
else Width := 1;
end;
{---------------------------------------------
Класс TCar - модель автомашины
Реализация методов.
---------------------------------------------}
constructor TCar.Create(road0: TRoad;
p0: integer; v0: real);
begin
road := road0; P := p0; V := v0;
end;
{ + TCar.show: показать машину на экране }
procedure TCar.show;
begin
GotoXY(Round(X+1), P);
write('->');
end;
{ + TCar.hide: скрыть машину с экрана }
procedure TCar.hide;
begin
GotoXY(Round(X+1), P);
write(' ');
end;
procedure TCar.move;
begin
hide;
X := X + V;
if X > road.Length then X := 0;
show;
end;
{---------------------------------------------
Основная программа
---------------------------------------------}
const N = 3;
var road: TRoad;
cars: array [1..N] of TCar;
i: integer;
begin
ClrScr;
road := TRoad.Create(60, N);
for i:=1 to N do begin
cars[i] := TCar.Create(road, i, 2.0*i);
cars[i].show; { + показать машины в исходном положении }
end;
repeat
for i:=1 to N do begin
cars[i].move;
end;
delay(200);
until keypressed;
end.
4.
5. *Добавьте в модель светофор, который переключается автоматически по программе (например, 5 с горит красный свет, затем 1 с – жёлтый, потом 5 с – зеленый и т.д.). Измените классы так, чтобы машина запрашивала у объекта Дорога местоположение ближайшего светофора, а затем обращалась к светофору для того, чтобы узнать, какой сигнал горит. Машины должны останавливаться у светофора с запрещающим сигналом
6.
program 2;
uses Crt;
{---------------------------------------------
Класс TLight - модель светофора
---------------------------------------------}
type TLightColor = (green = 10, red = 12, yellow = 14);
type TLight = class
color: TLightColor; { текущий цвет светофора }
X: integer; { координата светофора }
stateCounter: integer;
constructor Create(X0: integer);
procedure timeStep; { увеличить счётчик времени светофора }
procedure show; { показать светофор }
end;
{---------------------------------------------
Класс TRoad - модель дороги
---------------------------------------------}
type TRoad = class
Length: real;
Width: integer;
light: TLight; { ссылка на светофор }
constructor Create(length0: real; width0: integer);
procedure addLight(light0: TLight); { добавить светофор }
function nextLight(X: integer): TLight; { запрос следующего светофора }
end;
{--------------------------------------------
Класс TCar - модель автомашины
---------------------------------------------}
type TCar = class
X, V: real;
P: integer;
road: TRoad;
procedure show;
procedure hide;
procedure move;
constructor Create(road0: TRoad;
p0: integer; v0: real);
end;
{---------------------------------------------
Класс TRoad - модель дороги
Реализация методов.
---------------------------------------------}
constructor TRoad.Create(length0: real; width0: integer);
begin
if length0 > 0 then
Length := length0
else Length := 1;
if width0 > 0 then
Width := width0
else Width := 1;
end;
{ + добавить светофор }
procedure TRoad.addLight(light0: TLight);
begin
light := light0; { лучше сделать массив светофоров... }
end;
{ + запрос следующего светофора }
function TRoad.nextLight(X: integer): TLight;
begin
Result := light;
if (light <> nil) and (light.X < X) then
Result := nil;
end;
{---------------------------------------------
Класс TCar - модель автомашины
Реализация методов.
---------------------------------------------}
constructor TCar.Create(road0: TRoad;
p0: integer; v0: real);
begin
road := road0; P := p0; V := v0;
end;
procedure TCar.show;
begin
GotoXY(Round(X+1), P+1);
write('->');
end;
procedure TCar.hide;
begin
GotoXY(Round(X+1), P+1);
write(' ');
end;
procedure TCar.move;
var light: TLight;
begin
hide;
light := road.nextLight(trunc(X));
X := X + V;
if (light <> nil) and (light.color <> green)
and (X+2 > light.X) then
X := light.X-2;
if X > road.Length then X := 0;
show;
end;
{---------------------------------------------
Класс TLight - модель светофора
Реализация методов.
---------------------------------------------}
constructor TLight.Create(X0: integer);
begin
X := X0;
stateCounter := 0;
color := red;
end;
procedure TLight.timeStep;
begin
Inc(stateCounter);
case stateCounter of
50: color := yellow;
60: color := green;
110: color := yellow;
120: begin
color := red;
stateCounter := 0;
end;
end;
show;
end;
procedure TLight.show;
begin
GotoXY(X, 1);
TextBackground( integer(color) );
write(' ');
TextBackground(black);
end;
{---------------------------------------------
Основная программа
---------------------------------------------}
const N = 3;
var road: TRoad;
cars: array [1..N] of TCar;
light: TLight; { + светофор }
i: integer;
begin
ClrScr;
road := TRoad.Create(60, N);
light := TLight.Create(30);
light.show;
road.addLight(light); { + связать светофор с дорогой }
for i:=1 to N do begin
cars[i] := TCar.Create(road, i, 2.0*i);
cars[i].show;
end;
repeat
for i:=1 to N do
cars[i].move;
light.timeStep;
delay(100);
until keypressed;
end.
7. .
1.
Измените построенную ранее программу моделирования движения автомашин по
дороге так, чтобы все поля у объектов были закрытыми. Используйте свойства для
доступа к данным.
Проект № 2.
Логические элементы
(иерархия)
1. Используя материалы § 50 учебника, постройте модуль, описывающий иерархию классов логических элементов. Для проверки его работы напишите программу, которая строит таблицу истинности последовательного соединения логических элементов «И» и «НЕ».
2. Добавьте в иерархию классов элементы «исключающее ИЛИ», «И-НЕ» и «ИЛИ-НЕ». Вынесите всю построенную систему классов логических элементов в отдельный модуль LogElement.
3. «Соберите» в программе RS-триггер из двух логических элементов «ИЛИ-НЕ», постройте его таблицу истинности (обратите внимание на вариант, когда оба входа нулевые).
program Project_2_6;
uses LogElement;
{---------------------------------------------
Класс TDecoder - дешифратор "2 в 4"
---------------------------------------------}
type
TDecoder = class(TLog2In)
protected
procedure calc; override;
public
function Output(no: integer): boolean;
end;
{---------------------------------------------
Класс TDecoder - дешифратор "2 в 4"
Реализация методов.
---------------------------------------------}
procedure TDecoder.calc;
begin
FRes:= not In1 and not In2;
end;
function TDecoder.Output(no: integer): boolean;
begin
Result := Res;
case no of
1: Result := not In2 and In1;
2: Result := In2 and not In1;
3: Result := In2 and In1;
end;
end;
{---------------------------------------------
Основная программа
---------------------------------------------}
var decoder: TDecoder;
C0, C1: boolean;
begin
decoder := TDecoder.Create;
writeln('| C1| C0|| X3| X2| X1| X0');
writeln('--------------------------');
for C1:=False to True do
for C0:=False to True do begin
decoder.In1 := C0;
decoder.In2 := C1;
writeln('| ', integer(C1), ' | ', integer(C0),
' || ', integer(decoder.Output(3)),
' | ', integer(decoder.Output(2)),
' | ', integer(decoder.Output(1)),
' | ', integer(decoder.Output(0)));
end;
End.
DC
С1 0011
C0 0101
Х3 0001
Х2 0010
Х1 0100
Х0 1000
1. Постройте программу с графической формой, описание которой приведено в § 52 учебника.
2. Определите обработчики событий
OnShow (вывод формы на экран) – установить размеры формы 400 на 100 пикселей;
OnClick (щелчок мыши по форме) – уменьшить ширину и высоту формы на 10 пикселей, если соответствующий размер больше, чем 100 пикселей;
OnResize (изменение размеров формы) – вывести размеры формы в заголовке окна.
3. *[Для
Delphi] Найдите в Интернете, как ограничить
пределы изменения размеров формы (то есть установить минимальную и максимальную
ширину и высоту). Добавьте эти возможности в программу.
1. Постройте программу для просмотра рисунков, описание которой приведено в § 53 учебника.
2.
1. Дополните предыдущую программу так, чтобы рисунок, размер которого меньше, чем отведенное для его поле, центрировался в рамках этого поля.
Подсказка: нужно «подложить» под компонент TImage панель (компонент TPanel), у компонента TImage отключить принудительное выравнивание, и менять положение и размеры этого компонента при изменении размеров формы (можно использовать обработчик события OnResize панели, на которой лежит TImage).
1. Постройте программу с компонентом TIntEdit, описание которой приведено в § 54 учебника.
2.
*Найдите в Интернете информацию по установке нового компонента в палитру
компонентов среды Lazarus (или Delphi) и выполните такую установку. Измените программу
так, чтобы она использовала компонент TIntEdit из
палитры компонентов. Учтите, что при установке компонента в Lazarus потребуется пересборка всей среды (в Delphi – нет).
Проект № 3.
Модель
и представление
Измените программу представленную в учебнике так, чтобы она вычисляла:
а)дробную часть чисел.
б)произведение чисел меньших 30
1. в) сумму чисел которые попадают в промежуток от 10 до 50( включительно оба).
© ООО «Знанио»
С вами с 2009 года.