2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




На страницу Пред.  1, 2, 3, 4, 5  След.
 
 
Сообщение05.02.2006, 13:38 
Аватара пользователя
Вот с графическим выводом:
Код:
uses graph;

const N = 10;

type tPoint = record
    x, y: real;
    n: integer;
end; (* record *)

type tPoints = array [1..N] of tPoint;

procedure dec2pol (var p: tPoint);
    var t: tPoint;
begin (* dec2pol *)
    t. n := p. n;
    if p. x = 0 then begin
        if p. y < 0 then
            t. x := 270
        else begin
            if p. y = 0 then
                t. x := 0
            else
                t. x := 90;
        end; (* if *)
    end else
        t. x := 180 * arctan (p. y / abs (p. x)) / Pi;
    if p. x < 0 then
        t. x := 180 - t. x
    else if p. y < 0 then
        t. x := 360 + t. x;
    t. y := sqrt (sqr (p. x) + sqr (p. y));
    p := t;
end; (* dec2pol *)

var points: tPoints;
    t, p1, p2: tPoint;
    i, j: integer;
    grDriver, grMode: integer;

begin (* main program *)
    for i := 1 to N do begin
        points [i]. n := i;
        read (points [i]. x, points [i]. y);
    end; (* for *)
    for i := 1 to N - 1 do begin
        p1 := points [i];
        dec2pol (p1);
        for j := i + 1 to N do begin
            p2 := points [j];
            dec2pol (p2);
            if p2. x < p1. x then begin
                t := points [j];
                points [j] := points [i];
                points [i] := t;
            end; (* if *)
        end; (* for *)
    end; (* for *)
    for i := 1 to N - 1 do begin
        p1 := points [i];
        dec2pol (p1);
        for j := i + 1 to N do begin
            p2 := points [j];
            dec2pol (p2);
            if (p2. x = p1. x) and (p2. y < p2. y) then begin
                t := points [j];
                points [j] := points [i];
                points [i] := t;
            end; (* if *)
        end; (* for *)
    end; (* for *)
    grDriver := Detect;
    InitGraph (grDriver, grMode, 'h:\bp\bgi');
    if GraphResult = grOk then begin
        ClearDevice;
        MoveTo (trunc (points [1]. x), trunc (points [1]. y));
        for i := 2 to N do
            LineTo (trunc (points [i]. x), trunc (points [i]. y));
    end else
        writeln ('graph initialization fault');
end. (* main program *)

 
 
 
 
Сообщение05.02.2006, 13:49 
Самое большое ВАМ СПАСИБО на свете! а паскаль я выучу со временем, обязательно

 
 
 
 
Сообщение05.02.2006, 14:30 
А почему ничего не показывает, не рисует? Пишет "graph initialization fault"?

 
 
 
 
Сообщение05.02.2006, 14:44 
Аватара пользователя
Alenka_kiss писал(а):
А почему ничего не показывает, не рисует? Пишет "graph initialization fault"?

Потому что Вы текст программы не удосужились прочитать и разобрать что к чему.

 
 
 
 
Сообщение05.02.2006, 14:53 
Я вот эту строчку пробывала менять h:\bp\bgi, у меня не получается. ивообще ни одна программка с паскальной графикой не работает. может чего-то не хватает? В смысле не хватает в директории Bin?

 
 
 
 
Сообщение05.02.2006, 14:58 
Аватара пользователя
Цитата:
Я вот эту строчку пробывала менять h:\bp\bgi...

Да, правильно, если пишет "...fault". А если не пишет - перед завершением программы должна быть задержка. Если выполняете программу из Borland IDE, то после завершения программы можно нажать Alt+F5 и увидите картинку.

Или можно сделать задержку следующим образом: заменить первую строку программы "uses graph" на "uses graph, crt" и после строки "LineTo (..." добавить строку "while not KeyPressed do ;".

 
 
 
 
Сообщение05.02.2006, 15:57 
Аватара пользователя
Слушайте, народ, не надо все усложнять!

Достаточно выбрать драйвер - VGA, режим - 640х480, 16 цветов. Его все видюхи поддерживают (это стандартный VGA-режим):
Код:
   grDriver := 9;
   grMode :=2;
InitGraph (grDriver, grMode, '');

Вместо строки пути можно поставить 2 апострофа - пустую строку. Тогда файл драйвера будет искатся в текущей директории. После этого, что бы программа работала, нужно будет просто в папку с файлом программы (файл prj1.exe или как там он у Вас называется) скопировать файл графического драйвера egavga.bgi (он лежит в папке [диск]:\bp\bgi). И все будет работать, но не очень хорошо - будет отображатся только одна четверть. :) Дело в том, что у экрана начало координат расположено в левом верхнем углу. Положительное направление оси Y - вниз, оси X - как и положено, слева направо. Для корректного отображения Вам надо сместить начало координат в центр экрана и заменить направление оси у, т.е. выполнить следующие преобразования координат:

new_x := x + 640/2;
new_y := -y + 480/2;

 
 
 
 
Сообщение05.02.2006, 16:07 
Аватара пользователя
Alenka_kiss писал(а):
Самое большое ВАМ СПАСИБО на свете! а паскаль я выучу со временем, обязательно


Паскаль мёртв, учите лучше OOP или гибрид

 
 
 
 
Сообщение05.02.2006, 16:14 
Аватара пользователя
Capella писал(а):
Паскаль мёртв, учите лучше OOP или гибрид


Интересно знать, каковы основания для столь категоричного заявления? ;)

 
 
 
 
Сообщение05.02.2006, 16:23 
Аватара пользователя
Паскаль в прямом смысле слова динозавр из прошлого века. Скажите мне, что сейчас делается в Паскале и вообще кто на нём работает, кроме бедных студентов российских ВУЗов? Так конечно хороший (с точки зрения структуры алгоритмов) язык... Но конкуренцию с Java, C++/C, Visual Basic проигрыват. Ну просто уже не распространнён :wink: (конечно всё моё личное мнение, после некоторого времени, проведённого в изучении современного программирования)

 
 
 
 
Сообщение05.02.2006, 16:31 
Аватара пользователя
DOS Navigator - одна из лучших программ-оболочек, написана на Паскале. Это то, что мне в голову сразу пришло. DOS Navigator до сих пор улучшают, не помню какая версия последняя, да и называется он сейчас как-то иначе. Можете просто зайти на sourceforge.net - там куча open-source софта, исходники которого доступны (например, OpenOffice), скачайте несколько штук наугад, и посмотрите на чем они написаны. К примеру, неплохая оболочка для GCC (DEV-C++), с виду смахивающая на Borland C++ Builder, написана (по-моему, я не уверен на 100%) на Delphi, а это тот же Паскаль, с некоторыми расширениями (по-моему, добавлены только динамические массивы, даже арифметики указателей вроде бы нет).

 
 
 
 
Сообщение05.02.2006, 16:38 
Аватара пользователя
Ну с Вами, как с профессионалом, мне тягаться конечно трудновато :wink: , но всё-же за свои 2 года проведённых за клавиатурой я слово Паскаль ни разу не слышала :wink: (хотя один раз видела - на второй странице в скрипте по SE нам он был преподан как "дедушка современного рока" (с), т.е. программирования).

 
 
 
 1) Ошибка. 2) Графические драйверы.
Сообщение05.02.2006, 17:03 
Аватара пользователя
Мне внезапно пришло в голову, что программа не всегда будет работать правильно. Если разность полярных углов для последовательных точек окажется $\geqslant 180^o$, то может получиться самопересекающаяся линия.
Исправить можно так: найдём наименьшее значение координаты $x$ для всех заданных точек (пусть это $x_m$), а потом в качестве полюса возьмём точку $(x_m-1,0)$.
Это сильно упростит и вычисление угла. Не нужно проверять никаких условий, нужен только один оператор

Код:
t.x:=180*arctan(p.y/(p.x-x_m+1))/Pi;


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

А драйвер можно пристыковать к прогамме, тогда не будет проблем с его поиском:

Код:
{************************************************}
{                                                }
{   BGI Demo Program                             }
{   Copyright (c) 1992 by Borland International  }
{                                                }
{************************************************}

unit BGIDriv;

{
  Sample unit to accompany BGILINK.PAS. This unit links the BGI graphics
  driver into a single TPU file. This makes it easy to link the driver files
  directly into an .EXE file. See BGILINK.PAS for more information.
}

interface

procedure ATTDriverProc;
procedure CgaDriverProc;
procedure EgaVgaDriverProc;
procedure HercDriverProc;
procedure PC3270DriverProc;

implementation

procedure ATTDriverProc; external;
{$L ATT.OBJ }

procedure CgaDriverProc; external;
{$L CGA.OBJ }

procedure EgaVgaDriverProc; external;
{$L EGAVGA.OBJ }

procedure HercDriverProc; external;
{$L HERC.OBJ }

procedure PC3270DriverProc; external;
{$L PC3270.OBJ }

end.


Код:
{************************************************}
{                                                }
{   BGI Demo Program                             }
{   Copyright (c) 1992 by Borland International  }
{                                                }
{************************************************}

unit BGIFont;

{ Sample unit to accompany BGILINK.PAS. This unit links all the BGI graphics
  fonts into a single TPU file. This makes it easy to incorporate the font
  files directly into an .EXE file. See BGILINK.PAS for more information.
}

interface

procedure GothicFontProc;
procedure SansSerifFontProc;
procedure SmallFontProc;
procedure TriplexFontProc;

implementation

procedure GothicFontProc; external;
{$L GOTH.OBJ }

procedure SansSerifFontProc; external;
{$L SANS.OBJ }

procedure SmallFontProc; external;
{$L LITT.OBJ }

procedure TriplexFontProc; external;
{$L TRIP.OBJ }

end.


Код:
Unit BGILink;
  {$B-,D-,E-,G+,I-,L-,N-,O-,Q-,R-,S-,V-,X+}
Interface
  Var
    GraphDriver,GraphMode:Integer;
Implementation
  Uses Graph,BGIDriv,BGIFont;
  {$B-,F+,I-,Q-,S-,V-}
  Procedure Abort(Msg:String);
  Begin
    WriteLn(Msg,': ',GraphErrorMsg(GraphResult));
    Halt(1);
  End;
Begin
  {Регистрация всех драйверов.}
  If RegisterBGIDriver(@CGADriverProc) < 0 then Abort('CGA');
  If RegisterBGIDriver(@EGAVGADriverProc) < 0 then Abort('EGA/VGA');
  If RegisterBGIDriver(@HercDriverProc) < 0 then Abort('Herc');
  If RegisterBGIDriver(@ATTDriverProc) < 0 then Abort('AT&T');
  If RegisterBGIDriver(@PC3270DriverProc) < 0 then Abort('PC 3270');
  {Регистрация всех шрифтов.}
  If RegisterBGIFont(@GothicFontProc) < 0 then Abort('Gothic');
  If RegisterBGIFont(@SansSerifFontProc) < 0 then Abort('SansSerif');
  If RegisterBGIFont(@SmallFontProc) < 0 then Abort('Small');
  If RegisterBGIFont(@TriplexFontProc) < 0 then Abort('Triplex');
  {Проверка работоспособности графического режима.}
  GraphDriver:=Detect;
  InitGraph(GraphDriver,GraphMode,'');
  If GraphResult<>grOk then
    Begin
      Writeln('Graphics init error: ',GraphErrorMsg(GraphDriver));
      Halt(1);
    End;
  CloseGraph;
End.


В строке Uses нужно добавить BGILink. Из приведённых модулей можно выкинуть всё ненужное, в частности, все шрифты, поскольку они не русифицированные (и тогда ссылка на BGIFont не нужна), и из всех драйверов оставить только EGAVGA.

 
 
 
 
Сообщение05.02.2006, 17:07 
Аватара пользователя
Capella писал(а):
...
Паскаль мёртв, учите лучше OOP или гибрид

Это не к вопрошающему на форуме студенту (?). Но с утверждением я согласен :)

 
 
 
 
Сообщение05.02.2006, 17:38 
Аватара пользователя
Capella писал(а):
Ну с Вами, как с профессионалом, мне тягаться конечно трудновато :wink: , но всё-же за свои 2 года проведённых за клавиатурой я слово Паскаль ни разу не слышала :wink: (хотя один раз видела - на второй странице в скрипте по SE нам он был преподан как "дедушка современного рока" (с), т.е. программирования).


:oops: Я не профессионал, конечно... Просто давно пытаюсь программы писать... До Си я писал на Паскале (2 года) и довольно долго (где-то год) не знал, что существуют:
1) отладчики
2) ошибки времени выполнения :)

А сейчас, чем больше я узнаю о C++, тем больше мне хочется изучать Аду :) Надежду вселяет еще то, что есть такая штука как GNAT (GNU Native Ada), и не только для писюхи, но и для контроллеров (для ATMega вроде бы есть).

Кстати, я по образованию не программист, но очень всем этим интересуюсь, в частности, почему один язык считается лучше другого... Что об этом говорят те, кто учит профессиональных программистов?

 
 
 [ Сообщений: 64 ]  На страницу Пред.  1, 2, 3, 4, 5  След.


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group