Форум программистов, компьютерный форум, киберфорум
Pascal ABC
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
 Аватар для <<Roumen>>
6 / 6 / 0
Регистрация: 31.05.2011
Сообщений: 80

Отобразить на экране многоугольник с наибольшей площадью

22.09.2011, 12:26. Показов 1230. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Используя модуль, написать программу, которая вводит последовательность многоугольников и отображает на экране многоугольник с наибольшей площадью. Предыдущий многоугольник сохраняется, отображаясь другим цветом.

Код модуля

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
unit unit1;
interface
uses crt,graphABC;
const nmax=15;
      t=0.01;//точность для сравнения длин линий
type point=record
           x,y:real;
           end;
     mas=array[1..nmax+1] of point;
procedure Vvod(var a:mas; var n:byte);
procedure MaxStorona(a:mas; n:byte; var mxs:real;var i1,i2:byte);
procedure MaxDiagonal(a:mas; n:byte; var mxd:real;var i1,i2:byte);
procedure Vyvod(a:mas;n:byte;mxs,mxd:real;s1,s2,d1,d2:byte);
procedure Polygon(a:mas;n:byte;mxs,mxd:real);
 
implementation
//ввод данных
procedure Vvod(var a:mas; var n:byte);
var i:byte;
begin
repeat
write('Количество вершин от 4 до ',nmax,' n=');//треугольник не нужно, в нем нет диагоналей
read(n);
until n in [4..nmax];
writeln('Введите координаты вершин в порядке обхода:');
for i:=1 to n do
 begin
  writeln('Вершина ',i);
  write('X=');read(a[i].x);
  write('Y=');read(a[i].y);
 end;
a[n+1].x:=a[1].x;
a[n+1].y:=a[1].y;
write('Нажмите Enter');
readln;
end;
//определение длины стороны
Function Dlina(a,b:point):real;
begin
result:=sqrt(sqr(a.x-b.x)+sqr(a.y-b.y));
end;
function Perimetr(a:mas;n:byte):real;
var i:byte;
begin
result:=0;
for i:=2 to n+1 do
result:=result+Dlina(a[i],a[i-1]);
end;
//площадь через векторное произведение
function Ploshad(a:mas;n:byte):real;
var i:byte;
begin
result:=0;
for i:=1 to n do
result:=result+(a[i+1].y+a[i].y)*(a[i+1].x-a[i].x)/2;
result:=abs(result);//может получиться и отрицательное произведение
end;
//длинная сторона
procedure MaxStorona(a:mas; n:byte; var mxs:real;var i1,i2:byte);
var i:byte;
begin
mxs:=Dlina(a[1],a[2]);
i1:=1;
i2:=2;
for i:=3 to n+1 do
if Dlina(a[i],a[i-1])>mxs then
 begin
  mxs:=Dlina(a[i],a[i-1]);
  i1:=i-1;
  i2:=i;
 end;
end;
//длинная диагональ
procedure MaxDiagonal(a:mas; n:byte; var mxd:real;var i1,i2:byte);
var i,j:byte;
begin
mxd:=Dlina(a[1],a[3]);
i1:=1;
i2:=3;
for i:=1 to n-1 do
for j:=i+2 to n do
if Dlina(a[i],a[j])>mxd then
 begin
  mxd:=Dlina(a[i],a[j]);
  i1:=i;
  i2:=j;
 end;
end;
//вывод входных данных и результатов
procedure Vyvod(a:mas;n:byte;mxs,mxd:real;s1,s2,d1,d2:byte);
var i,j:byte;
begin
clrscr;
writeln('Координаты вершин многоугольника:');
write('X:');
for i:=1 to n do
write(a[i].x:5:1);
writeln;
write('Y:');
for i:=1 to n do
write(a[i].y:5:1);
writeln;
writeln('Длины сторон в порядке обхода:');
for i:=2 to n+1 do
 begin
  write('Сторона ',i-1,'-',i,'=');
  writeln(Dlina(a[i],a[i-1]):5:2);
 end;
writeln('Периметр=',Perimetr(a,n):0:2);
writeln('Площадь=',Ploshad(a,n):0:2);
writeln('Сторона с максимальной длиной ',s1,'-',s2,' длина=',mxs:0:2);
writeln('Длины диагоналей в порядке обхода:');
for i:=1 to n-1 do//от первой до предпоследней=начало
for j:=i+2 to n do//от i+2 до последней=конец
if (i=1)and(j=n) then continue//первую с последней не нужно, это сторона
else
 begin
  write('Диагональ ',i,'-',j,'=');
  writeln(Dlina(a[i],a[j]):5:2);
 end;
writeln('Диагональ с максимальной длиной ',d1,'-',d2,' длина=',mxd:0:2);
write('Нажмите Enter');
readln;
end;
//рисование
procedure Polygon(a:mas;n:byte;mxs,mxd:real);
var xc,yc,x0,y0,i,j:integer;
    xmx,xmn,ymx,ymn,mx,my,m:real;
begin
hidecursor;
//установим графическое окно и его центр
setwindowsize(500,550);
clearwindow;
xc:=windowwidth div 2;
yc:=50+(windowheight-50) div 2;
//найдем максимальные и минимальные значения для рисования
xmn:=a[1].x;xmx:=a[1].x;
ymn:=a[1].y;ymx:=a[1].y;
for i:=1 to n do
 begin
  if a[i].x<xmn then xmn:=a[i].x;
  if a[i].x>xmx then xmx:=a[i].x;
  if a[i].y<ymn then ymn:=a[i].y;
  if a[i].y>ymx then ymx:=a[i].y;
 end;
//масштаб для перевода в экранные координаты
//по Х
if xmn>=0 then mx:=(2*xc-60)/xmx
else if xmx<=0 then mx:=(2*xc-60)/abs(xmn)
else if xmn*xmx<0 then mx:=(2*xc-60)/abs(xmx-xmn) ;
//по У
if ymn>=0 then my:=(2*xc-60)/ymx
else if ymx<=0 then my:=(2*xc-60)/abs(ymn)
else if ymn*ymx<0 then my:=(2*xc-60)/abs(ymx-ymn);
if mx<=my then m:=mx else m:=my;//выберем больший
//определим начало координат
if xmx<0 then x0:=2*xc-30
else if xmn>=0 then x0:=30
else if xmn*xmx<0 then  x0:=2*xc-round(2*xc*xmx/(xmx-xmn));
if ymx<=0 then y0:=80
else if ymn>=0 then y0:=windowheight-30
else if ymn*ymx<0 then y0:=50+round((2*xc-60)*ymx/(ymx-ymn));
//рисуем координатне оси(если нужно, то можно и деления нарисовать)
setpencolor(clGreen);
line(0,y0,2*xc,y0);
textout(2*xc-10,y0-20,'X');
line(x0,55,x0,2*yc);
textout(x0-15,55,'Y');
//рисуем многоугольник
setpenwidth(3);
for i:=1 to n do
 begin
  if abs(Dlina(a[i],a[i+1])-mxs)<t then setpencolor(clRed)//максимальные стороны красным
  else setpencolor(clBlack);//остальные черным
  line(x0+round(a[i].x*m),y0-round(a[i].y*m),x0+round(a[i+1].x*m),y0-round(a[i+1].y*m));
 end;
//рисуем диагонали, соединяем каждую вершину с каждой кроме соседних
setpenwidth(1);
for i:=1 to n-1 do//от первой до предпоследней=начало
for j:=i+2 to n do//от i+2 до последней=конец
if (i=1)and(j=n) then continue//первую с последней не нужно, это сторона
else
 begin
  if abs(Dlina(a[i],a[j])-mxd)<t then setpencolor(clBlue)//максимальные диагонали синим
  else setpencolor(clBlack);//остальные черным
  line(x0+round(a[i].x*m),y0-round(a[i].y*m),x0+round(a[j].x*m),y0-round(a[j].y*m));
 end;
setpenwidth(3);
setpencolor(clRed);
line(5,10,30,10);
textout(35,10,'Стороны максимальной длины');
setpenwidth(1);
setpencolor(clBlue);
line(5,30,30,30);
textout(35,30,'Диагонали максимальной длины');
end;
end.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
22.09.2011, 12:26
Ответы с готовыми решениями:

Найти треугольник с наибольшей площадью
Задана таблица из N чисел. Сколько треугольников можно составить из этих чисел? Найти треугольник с наибольшей площадью.

Поиск ромба с наибольшей площадью
В разделе С++ очередная простая задачка, как раз для трех строчек на Haskell :) Дано множество точек на плоскости в виде списка пар их...

Поиск ромба с наибольшей площадью
Дано множество точек на плоскости в виде: x: 0 5 3 3 ... y: 1 1 0 2 ... Нужно найти среди них ромбы и вычислить площадь наибольшего,...

3
Почетный модератор
 Аватар для Puporev
64315 / 47611 / 32743
Регистрация: 18.05.2008
Сообщений: 115,167
22.09.2011, 14:41
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Написать не проблема, только небольшие баги вроде есть в модуле.
Pascal
1
2
3
4
5
6
7
8
9
10
11
uses unit1;
var a:mas;
    n,i1,i2,s1,s2,d1,d2:byte;
    mxs,mxd:real;
begin
Vvod(a,n);
MaxStorona(a,n,mxs,i1,i2);
MaxDiagonal(a,n,mxd,i1,i2);
Vyvod(a,n,mxs,mxd,s1,s2,d1,d2);
Polygon(a,n,mxs,mxd);
end.
Добавлено через 2 минуты
Кстати до боли знакомый модуль, только у меня вроде без этих багов было...

Добавлено через 3 минуты
Так это я тебе и писал это..
Написать модуль, определяющий для произвольного выпуклого многоугольника максимальную длину стороны и диагонали
с головой что ли поплохело?
0
 Аватар для <<Roumen>>
6 / 6 / 0
Регистрация: 31.05.2011
Сообщений: 80
23.09.2011, 12:33  [ТС]
Да прости конечно... но проблемма в программе... Надо чтоб не один треугольник был а несколько
0
Почетный модератор
 Аватар для Puporev
64315 / 47611 / 32743
Регистрация: 18.05.2008
Сообщений: 115,167
23.09.2011, 12:40
Так это совсем другую программу писать нужно и другой модуль, какое отношение этот модуль имеет к этому?
Цитата Сообщение от <<Roumen>> Посмотреть сообщение
вводит последовательность многоугольников и отображает на экране многоугольник с наибольшей площадью. Предыдущий многоугольник сохраняется, отображаясь другим цветом.
Добавлено через 1 минуту
Там же совсем другая задача была, про один многоугольник.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
23.09.2011, 12:40
Помогаю со студенческими работами здесь

напечатать номер треугольника с наибольшей площадью
задано n треугольников координатами своих вершин на плоскости. напечатать номер треугольника с наибольшей площадью. вычисление сторон и...

Найти треугольник с наибольшей (наименьшей) площадью
Заданы площади равнобедренных треугольников, найти треугольник с наибольшей (наименьшей) площадью и вывести во сколько раз сторона большего...

Найти треугольники с наибольшей и наименьшей площадью
Элементы массива X=(X1,X2,...,Xn) представляет собой дляни отрезков Определить, можно ли из отрезков (1,2,3),(2,3,4),(3,4,5,), построить...

Напечатать координаты треугольника с наибольшей площадью
Даны координаты вершин 2 треугольников. Напечатать координаты треугольника с наибольшей площадью и эту площадь

Вывести страну с выходом к морю и с наибольшей площадью
Помогите пожалуйста. Программа должна выводить страну с выходом к морю и с наибольшей площадью.Но она не правильно выдает ответ. Я думаю...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru