Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.04.2008, 22:54   #1
Барби
Форумчанин
 
Аватар для Барби
 
Регистрация: 19.12.2007
Сообщений: 159
Печаль многогранник в паскале

Создайте класс РАВНОСТОРОННИЙ МНОГОГРАННИК. Обязательными методами класса являются ввод/вывод параметров фигуры, изображение многогранника, вычисление площади фигуры.
Я полный ламер, поэтому ошибок естесствено налепила тьма тьмущая и прога даже не запускается. Класс создавала по примеру из лекции, попытка нарисовать в граве оказалась неудачной. Но веритьяс мне что если чутку поправить то все заработает ведь я так старалась. Если кто поможет заметить ошибки и поправить спаисбо огромное.
program mnogogr;
uses crt, graph;
type
win=object
x1,y1,r,cv:byte;
k,s,t:integer;
procedure init(xn1,yn1,rn,cvn:byte;kn,sn,tn:i nteger);
procedure makewin;
function getsizet:byte;
function getsizes:byte;
end;
procedure win.init;
var Gd, Gm: Integer;
begin
Gd:= Detect;
InitGraph(Gd, Gm,' ');
if GraphResult <> grOk then
Halt(1);}
PieSlice(100, 100, 0, 270, rn);


x1:=xn1;
y1:=yn1;
r:=rn;
cv:=cvn;
k:=kn;
t:=tn;


end;

function win.getsizet;
begin
getsizet:=2*R*sin(3.14/n);
end;
function win.getsizes;
begin
getsizes:=n/2*r*r*sin(2*3.14/n);
end;
}
var winvar:win;
begin
with winvar do
begin
init(50,50,10,1,6,1,1);
makewin;
writeln('kol stor-',k,'ploshad-',s);
end;
readkey;
end.

я исходила их того что любой правильной многогранник можно вписать в окружность r? это у меня радиус, а x1 и y1 координаты центра окружности, они постоянные. Я должна менять только количество стороно (препод сказал пусть всегда четное будет), обозначила буквой n, t это длина стороны,которую пытаюсь высчитать по формуле, s площадь фигуры тоже считаю по формуле. если еще чего разъяснить скажите
Пока ремонтируют кукольный домик, живу на форуме.
Барби вне форума Ответить с цитированием
Старый 02.04.2008, 23:25   #2
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Наверное вы все-таки пытаетесь создать не многогранник, а многоугольник.
puporev вне форума Ответить с цитированием
Старый 02.04.2008, 23:35   #3
Барби
Форумчанин
 
Аватар для Барби
 
Регистрация: 19.12.2007
Сообщений: 159
По умолчанию

ага, мне вобщем для облегчения задния сказали путсь плоским будет, а на плоскости это одно и тоже получается
Пока ремонтируют кукольный домик, живу на форуме.
Барби вне форума Ответить с цитированием
Старый 02.04.2008, 23:52   #4
Карась
Участник клуба
 
Аватар для Карась
 
Регистрация: 26.10.2007
Сообщений: 1,244
По умолчанию

А по каким параметрам строится этот многогранник?

Точто всё начинается с окружности и деления её длины дуги на равные части это очевидно. Осталось только понять что задаёт пользователь....

Если по кол-во сторон, то это одна формула, по площади, другая.... а по длине сторон - третья.
Умом Россию не понять, пока не выпито ноль пять,
А если выпито ноль пять всё делом кажется не хитрым,
Попытка глубже понимать уже попахивает литром...
Карась вне форума Ответить с цитированием
Старый 03.04.2008, 00:11   #5
Барби
Форумчанин
 
Аватар для Барби
 
Регистрация: 19.12.2007
Сообщений: 159
По умолчанию

я пытаюсь задать точку центра и радиус окружности, также ввожу количество сторон и по формуле должно расчитаться длина стороны и построиться по этим длинам,а площадь просто считается и выводится цифрой
function win.getsizet;
begin
getsizet:=2*R*sin(3.14/n);
end;
function win.getsizes;
begin
getsizes:=n/2*r*r*sin(2*3.14/n);
вот тут я вроде как считаю размер стороны и площдь. ну если в чем ошиблась попрравьтепожалуйста
Пока ремонтируют кукольный домик, живу на форуме.

Последний раз редактировалось Барби; 03.04.2008 в 00:13.
Барби вне форума Ответить с цитированием
Старый 03.04.2008, 00:42   #6
Карась
Участник клуба
 
Аватар для Карась
 
Регистрация: 26.10.2007
Сообщений: 1,244
По умолчанию

На мой взгляд программа выглядит так:
1. Пользоватеь вводит кол-во сторон многоугольника.
2. Делаем рассчёты координат всех вершин и заносим в массив.
3. По этим точкам рисуем многоугольник (например пользуя Polyline, правда это в делфи)
4. Считаем нужные величины и выводим на экран.

1 и 2) Создаём массив с координатами.
Код:
Const Pi = 3.1415926;

Var GV : array [1..10, 1..10] of Real;
      i, n, R: Integer;
      a : Real;

Begin
a := 0;
R := 30; // Radius
Readln (n);

For i := 1 To n Do
  Begin
    GV[i,1] := R * cos(a * Pi/180);
    GV[i,2] := R * sin(a * Pi/180);
    a := a + 360/n;
  End;

Readln;
End.
3) Рисование по точкам можно и без меня сделать.
Умом Россию не понять, пока не выпито ноль пять,
А если выпито ноль пять всё делом кажется не хитрым,
Попытка глубже понимать уже попахивает литром...
Карась вне форума Ответить с цитированием
Старый 03.04.2008, 07:41   #7
Барби
Форумчанин
 
Аватар для Барби
 
Регистрация: 19.12.2007
Сообщений: 159
По умолчанию

спасибо,но можно парочку уточняющих вопросиков? зачем вводить массив данных?для расчету координат по оси x и y новых точек для построения? a это и есть координата новой точки?
Пока ремонтируют кукольный домик, живу на форуме.
Барби вне форума Ответить с цитированием
Старый 03.04.2008, 08:59   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Барбара, если проблема только с рисованием, то позволь подарить примерчик с моей контрольной из колледжа:
Код:
 uses Graph;
var
  grDriver: Integer;
  grMode: Integer;
  x,y,a,b,ErrCode,i: longint;
  ang:real;
procedure mgran;
const n=6 ;
var i:byte;rx,ry,rang,angle,ang:real;
 atp:array[0..n] of pointtype;
 atp2:array[0..n] of pointtype;
begin
 ang:=2*pi/n;
 angle:=(2*pi*ang)/360;
 angle:=ang;
 rang:=angle;
 for i:=0 to n do begin
  rx:=cos(angle);
  ry:=sin(angle);
  atp[i].x:=round(x+100*rx);
  atp[i].y:=round(y+100*ry);
  atp2[i].x:=atp[i].x+100;
  atp2[i].y:=atp[i].y+100;
  moveto(atp[i].x,atp[i].y);
  lineto(atp2[i].x,atp2[i].y);

  angle:=angle+rang;
 end;
 drawpoly(n+1,atp);{}
 drawpoly(n+1,atp2);{}

end;
begin
  grDriver := Detect;
  InitGraph(grDriver, grMode,'');{}
  ErrCode := GraphResult;
  if ErrCode = grOk then
  begin  { Do graphics }
   x:=200;y:=200; a:=200;b:=300;
    mgran;
    readln;
    CloseGraph;
  end
  else
    Writeln('Graphics error:', GraphErrorMsg(ErrCode));
end.
Я там конечно равносторонность не проверял (задача другая стояла) но отрисовывает многогранник он правильно.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 03.04.2008, 18:25   #9
Карась
Участник клуба
 
Аватар для Карась
 
Регистрация: 26.10.2007
Сообщений: 1,244
По умолчанию

Можно обойтись и без массива. Но так как я пишу не в паскале то мне проще вывести все данные для дальнейших действий. Рисовать не я буду

Программа создаёт массив координат всех точек многограника, считает длину стороны и площадь фигуры.

Код:
Const Pi = 3.1415926;

Var GV : array [1..100, 1..100] of Real;
      i, n, R : Integer;
      a, L, S : Real;

Begin
a := 0;
R := 50; // Radius
Readln (n);

For i := 1 To n Do
  Begin
    GV[i,1] := R * cos(a * Pi/180);
    GV[i,2] := R * sin(a * Pi/180);
    a := a + 360/n;
  End;

Writeln;

L := SQRT(sqr(R * sin(360/n * Pi/180)) + sqr(R - R * cos(360/n * Pi/180)));
S := n * SQRT(((2*R+L)/2) * ((2*R+L)/2 - R) * ((2*R+L)/2 - R) * ((2*R+L)/2 - L));
Writeln('Kol-vo storon = ', n);
Writeln('Dlinna storoni = ', L:4:2);
Writeln('Ploshad = ', S:4:2);
Readln;
End.
Умом Россию не понять, пока не выпито ноль пять,
А если выпито ноль пять всё делом кажется не хитрым,
Попытка глубже понимать уже попахивает литром...
Карась вне форума Ответить с цитированием
Старый 03.04.2008, 23:02   #10
Alter
Старожил
 
Аватар для Alter
 
Регистрация: 06.08.2007
Сообщений: 2,183
Лампочка

Вот когда-то делал на Pascal(минимум углов 1):

Код:
USES GRAPH, CRT;
VAR X0,Y0,X,Y, I,N,R :LongInt; GD,GM :Integer; Alfa :REAL;
begin
 Repeat

  ClrScr;
 Write(' Vvedite kollichestvo yglov: '); Readln(N);
  Alfa:=360/N;
 Write(' Vvedite radiys figyri: '); Readln(R);
 GD:=DETECT; InitGraph(GD, GM, '');

    X:=Round( R*Cos(1* ((Alfa*Pi)/180) ) +GetMaxX/2);
    Y:=Round( R*Sin(1* ((Alfa*Pi)/180) ) +GetMaxY/2);
 MoveTo(X, Y);
  For I:=2 To N+1 DO
  begin
    X:=Round( R*Cos(I* ((Alfa*Pi)/180) ) +GetMaxX/2);
    Y:=Round( R*Sin(I* ((Alfa*Pi)/180) ) +GetMaxY/2);
   LineTo(X, Y);
  end;

 Readln;
CloseGraph;
 Write(' CHTOBI VIYTI NAZHMITE ESC ...');
 Until ReadKey=#27;
end.
___________________________________ _______
+++me
Alter вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задачи в Паскале vitekbest Помощь студентам 1 06.04.2008 19:35
ДОС в паскале nikleb Паскаль, Turbo Pascal, PascalABC.NET 2 07.03.2008 22:50
На Паскале Bagsi Помощь студентам 13 21.11.2007 21:40