Shpild
Сообщений: 1
Оценки: 0
Присоединился: 2011-05-30 19:10:49.673333
|
Исходные данные Дано: • динамический список, каждый элемент которого содержит данные для построения графических объектов; • меню, содержащее следующие позиции: «Создать», «Сохранить», «Загрузить», «Просмотр», «Информация», «Выход». Задание При входе в программу появляется меню, содержащее следующие позиции: "Создать", "Загрузить", "Сохранить", "Просмотр", "Информация", "Выход". Тип меню - горизонтальное со строкой подсказки. В центре экрана должна быть выведена информация о варианте и авторе курсовой работы. При выборе позиции "Создать" программа генерирует в памяти одно-связный список из N элементов, каждый элемент которого содержит данные для построения графических объектов. Количество объектов каждого типа, координаты, размеры, цвет выбираются случайно, но все объекты должны целиком помещаться на экране и быть видимыми (площадь объектов не должна быть нулевой). Красный цвет использовать запрещается. После генерации списка в центре экрана появляется окно с сообщением о завершении формирования списка. При выборе позиции "Сохранить" программа запрашивает имя файла и сохраняет в нем список графических объектов. При этом должна предусматриваться проверка наполненности списка. Если список пуст, программа должна выдавать соответствующее предупреждение и запрос на продолжение или прекращение операции сохранения. При выборе позиции «Загрузить» программа загружает из файла, имя которого запрашивается, ранее сохраненный список. Если текущий список непустой, необходимо предусмотреть его сохранение в каком-либо файле или очистку (по выбору пользователя). Кроме того, должны быть предусмотрены проверки: перед загрузкой - действительно ли в данном файле находится ранее сохраненная информация о графических объектах, в процессе загрузки – корректности данных. При выборе позиции "Просмотр" программа устанавливает графический режим и отображает на экране элементы списка. Фигуры изображаются не закрашенными (только контуры). Текущая (активная) фигура рисуется заштрихованной. При нажатии клавиш “+” и “-” должен осуществляться переход между элементами списка (активным становится соответствующий графический объект). При нажатии на кнопки навигации ( ) осуществляется соответствующее перемещение активной фигуры. Дополнительные функции выполняются при нажатии функциональных клавиш, указанных в табл. 4. Нажатие клавиши ESC возвращает к основному меню программы. При выборе позиции "Информация" программа запрашивает имя файла, в который затем записывает в табличной форме информацию о списке объектов. При выборе позиции "Выход" программа запрашивает подтверждение на сохранение текущего списка, сохраняет список в указанном файле (если пользователь подтвердил сохранение), очищает динамическую память и заканчивает работу. 25-30 фигур, Прямоугольники, окружности F5 – вписать площадь в 10 наибольших по площади объектов Shift-F5 – удалить из списка прямоугольники, целиком лежащие внутри окружности Не могу сделать переключение между объектами + вписывание и удаление… Заранее спасибо за помощь…
Program Kyrs;
Uses crt,Graph; {Подключаем модуль CRT и Graph}
type
mass=^Phigur; {Указатель на элемент типа ^Phigur}
Phigur=record {Phigur-запись}
x1,x2,y1,y2,r,j,i,n:integer; {Переменные типа Integer в записи}
next:mass; {Указатель на следующий элемент динамического списка в записи}
end;
var int,i,j,n,p:integer; {Переменные типа Integer}
nach,tek,tmp:mass; {Переменные типа Mass(Mass в Type)}
Stroka,Str,Nazv:string; {Переменные типа String}
c:char; {Переменные типа char}
f:text; {Переменные типа text(текстовый документ)}
{-----------------------------------------------------------------------------}
procedure DisposeRec; {Удаление всего динамического списка}
Begin
tek:=nach; {Указатель ставим на начало}
while tek <> nil do {Пока tek не пустой повторяем}
begin
tmp:=tek^.Next; {В TMP записать 2 элемент}
Dispose(tek); {Удалить 1 элемент}
tek:=tmp; {Указатель ставим на 1 элемент(до этого был 2)}
end;
end;
{-----------------------------------------------------------------------------}
procedure OsnOkno; {Прорисовка основного окна}
Begin
textbackground(0); {Черный фон}
window(1,1,80,26); {Окно такого размера}
ClrScr;
write(' &#9556;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9559;');
write(' &#9553; Создать &#9553; Сохранить &#9553; Загрузить &#9553; Просмотр &#9553; Информация &#9553; Выход &#9553;');
write(' &#9562;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9552;&#9565;');
gotoxy(26,6);
writeln(' Курсовая работа ');
gotoxy(26,7);
writeln('Муслимова Эльдара Ривгатевича');
gotoxy(26,8);
writeln(' вариант 4,5 ');
end;
{-----------------------------------------------------------------------------}
Procedure menu(i_m:byte); {Прорисовка активного меню}
Begin
TextBackGround(0); {Черный фон}
gotoxy(6,2); writeln('Создать'); {Закрашиваем фон менюшки черным}
gotoxy(20,2); writeln('Сохранить'); {Чтобы закрасить преведущее активное окно}
gotoxy(36,2); writeln('Загрузить');
gotoxy(50,2); writeln('Просмотр');
gotoxy(61,2); writeln('Информация');
gotoxy(74,2); writeln('Выход');
TextBackGround(5); {Текст для активного окна фиолетовый}
case i_m of {Если i_m}
1: begin {1 тогда}
gotoxy(6,2); {Идем на эту координату}
write('Создать'); {Пишем Новый с фиолетовым фоном}
end;
2: begin {2 тогда}
gotoxy(20,2); {И т.д.}
write('Сохранить');
end;
3: begin
gotoxy(36,2);
write('Загрузить');
end;
4: begin
gotoxy(50,2);
write('Просмотр');
end;
5: begin
gotoxy(61,2);
write('Информация');
end;
6:begin
gotoxy(74,2);
write('Выход');
end;
end;
end;
{-------------------------------------------------------------------------}
Function klavish(i_m:byte):byte; {Меню-считывание клавиши}
const
right=#77;
left=#75;
enter=#13;
Begin
repeat
c:=readkey;
case c of
right:if i_m=6 then i_m:=1 else inc(i_m);
left :if i_m=1 then i_m:=6 else dec(i_m);
enter:klavish:=i_m;
end;
menu(i_m); {После вcех вычислений идем прорисовывать}
until c=enter; {Выходим из меню если нажат ENTER}
end;
{-------------------------------------------------------------------------}
{11111111111111111111111111111111111111111111111111111111111111111111111111111}
Procedure Vvod; {Выводит то что хранится в переменных Nazv и Stroka}
Begin
OsnOkno; {Прорисовываем основное окно}
gotoxy(3,18);
Write(Nazv); {Выводим то что храниться в переменной Nazv}
gotoxy(3,20);
Write(Stroka);{Выводим то что храниться в переменной Stroka}
gotoxy(3,22);{Ставим курсор на координаты третей строчки где будет ввод}
end;
{111111111111111111111111111111111111111111111111111111111111111111111111111}
procedure DinSpis;
var i:integer;
begin
randomize;
DisposeRec;
tek:=nil;
for i:=1 to n do begin
new(Nach);
Nach^.x1:=random(580)+20;
Nach^.x2:=random(580)+20;
Nach^.y1:=random(380)+30;
Nach^.y2:=random(400)+20;
Nach^.r:=random(30)+10;
Nach^.j:=random(2);
Nach^.next:=tek;
tek:=Nach;
end;
end;
Procedure soxranenie;
begin
Nazv:='Сохранение списка в указанный файл';
Stroka:='Введите путь куда будет сохранен файл';
Vvod;
readln(Str);
assign(f,Str);
rewrite(f);
if Nach=nil then
begin
Stroka:='Список пуст! Продолжить ? (y-да,n-нет)';
Vvod;
c:=readkey;
case c of
#121: writeln(f,'Список пуст');
#110: exit;
end;
end;
tek:=nach;
repeat
writeln(f,tek^.x1);
writeln(f,tek^.x2);
writeln(f,tek^.y1);
writeln(f,tek^.y2);
writeln(f,tek^.r);
writeln(f,tek^.j);
tek:=tek^.Next;
until tek=nil;
close(f);
Stroka:='Файл записан';
Vvod;
readkey;
end;
procedure zagruzit;
begin
if Nach<>nil then
begin
nazv:='Загрузка списка из файла';
Stroka:='Текуший список не пуст, сохранить?! (y-да,n-нет)';
vvod;
c:=readkey;
case c of
#121: soxranenie;
#110:
end;
end;
DisposeRec;
Stroka:='Введите путь файла';
Vvod;
readln(Str);
assign(f,Str);
reset(f);
new(Nach);
tek:=Nach;
repeat
readln(f,tek^.x1);
readln(f,tek^.x2);
readln(f,tek^.y1);
readln(f,tek^.y2);
readln(f,tek^.r);
readln(f,tek^.j);
if (tek^.j>=0) and (tek^.j<2) then
tek:=tek^.next else
begin
Stroka:='В файле некорректные данные';
Vvod;
p:=1;
exit;
end;
until eof;
tek^.Next:=nil;
close(f);
if p=0 then
begin
Stroka:='Список загружен';
Vvod;
readkey;
end
else zagruzit;
end;
procedure risovanie;
begin
tek:=Nach;
repeat
case tek^.j of
0:Rectangle(tek^.x1,tek^.y1,tek^.x2,tek^.y2);{Прямоугольник}
1:Circle(tek^.x1,tek^.y1,tek^.r); {Окружность}
end;
tek:=tek^.Next;
until tek=nil;
end;
procedure prosmotr;
const step=5;
Instr='For remove press arrows, Exit - ESC';
var grDr,grMd:integer;
begin
grDr:=VGA;
grMd:=2;
InitGraph(grDr,grMd,'c:\BPASCAL');
Rectangle(50, 425, 600, 460); {рисование рамки }
OutTextXY(120, 440, Instr);
risovanie; {рисование всех объектов}
repeat {цикл работы программы до прерывания по клавише ESC}
c:=readkey;
Case c of
#75: if (Nach^.x1>0) and (Nach^.x2<640) then begin Nach^.x1:=Nach^.x1-Step; Nach^.x2:=Nach^.x2-Step; end;
#77: if (Nach^.x1>0) and (Nach^.x2<640) then begin Nach^.x1:=Nach^.x1+Step; Nach^.x2:=Nach^.x2+Step; end;
#72: if (Nach^.y1>0) and (Nach^.y1<480) then begin Nach^.y1:=Nach^.y1-Step; Nach^.y2:=Nach^.y2-Step; end;
#80: if (Nach^.y2>0) and (Nach^.y2<480) then begin Nach^.y2:=Nach^.y2+Step; Nach^.y2:=Nach^.y2+Step; end;
end;
ClearViewPort; { очистка графического экрана }
SetColor(LightGray); {восстановление рамки с надписью}
Rectangle(50, 425, 600, 460);
OutTextXY(120, 440, Instr);
risovanie; {рисование всех объктов в текущих координатах}
until c=#27;
closegraph;
OsnOkno;
end;
procedure inform;
begin
Nazv:='Сохранение информации о списке в табличной форме';
Stroka:='Введите путь куда будет сохранен файл';
Vvod;
readln(str);
assign(f,str);
rewrite(f);
writeln(f,'-----------------------------------------------------');
writeln(f,'| x1 | y1 | x2 | y2 | r | vid phiguri |');
writeln(f,'-----------------------------------------------------');
tek:=Nach;
repeat
if tek^.j=0 then
begin
writeln(f,'|',tek^.x1:6,'|',tek^.y1:6,'|',tek^.x2:6,'|',tek^.y2:6,'| |',' priamoygolnik |');
end;
if tek^.j=1 then
begin
writeln(f,'|',tek^.x1:6,'|',tek^.y1:6,'| |',' |',tek^.r:6,'| okrugnost |');
end;
tek:=tek^.next;
until tek=nil;
writeln(f,'----------------------------------------------------|');
close(f);
Stroka:='Файл записан успешно.Нажмите любую клавишу для выхода в меню';
vvod;
Readkey;
end;
begin
clrscr;
repeat
OsnOkno;
menu(i);
i:=klavish(i);
if i=1 then
repeat
Nazv:='Сколько фигур будет в списке?';
Stroka:='Введите число от 25 до 30';
Vvod;
readln(n);
if (n>=25) and (n<=30) then
begin
DinSpis;
Nazv:='Список сформирован';
Stroka:='Нажмите любую клавишу для выхода в меню';
Vvod;
readkey;
p:=1;
end
else
begin
Stroka:='Ошибка ввода,попробуйте еще раз';
Vvod;
readkey;
p:=0;
end;
until p=1;
if i=2 then soxranenie;
if i=3 then zagruzit;
if i=4 then prosmotr;
if i=5 then inform;
if i=6 then
begin
if Nach<>nil then
begin
Stroka:='Сохранить текущий список?! (y-да,n-нет)';
vvod;
c:=readkey;
case c of
#121: begin soxranenie; DisposeRec; c:=#27; end;
#110: begin DisposeRec; c:=#27; end;
end;
end
else c:=#27;
end;
until c=#27;
End.
|