2014 dxdy logo

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

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




Начать новую тему Ответить на тему На страницу Пред.  1, 2, 3, 4, 5  След.
 
 
Сообщение05.02.2006, 13:38 
Аватара пользователя


20/01/06
64
оттуда
Вот с графическим выводом:
Код:
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 


06/01/06
66
Самое большое ВАМ СПАСИБО на свете! а паскаль я выучу со временем, обязательно

 Профиль  
                  
 
 
Сообщение05.02.2006, 14:30 


06/01/06
66
А почему ничего не показывает, не рисует? Пишет "graph initialization fault"?

 Профиль  
                  
 
 
Сообщение05.02.2006, 14:44 
Основатель
Аватара пользователя


11/05/05
4312
Alenka_kiss писал(а):
А почему ничего не показывает, не рисует? Пишет "graph initialization fault"?

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

 Профиль  
                  
 
 
Сообщение05.02.2006, 14:53 


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

 Профиль  
                  
 
 
Сообщение05.02.2006, 14:58 
Аватара пользователя


20/01/06
64
оттуда
Цитата:
Я вот эту строчку пробывала менять h:\bp\bgi...

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

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

 Профиль  
                  
 
 
Сообщение05.02.2006, 15:57 
Заслуженный участник
Аватара пользователя


12/10/05
478
Казань
Слушайте, народ, не надо все усложнять!

Достаточно выбрать драйвер - 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 
Заслуженный участник
Аватара пользователя


09/10/05
1142
Alenka_kiss писал(а):
Самое большое ВАМ СПАСИБО на свете! а паскаль я выучу со временем, обязательно


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

 Профиль  
                  
 
 
Сообщение05.02.2006, 16:14 
Заслуженный участник
Аватара пользователя


12/10/05
478
Казань
Capella писал(а):
Паскаль мёртв, учите лучше OOP или гибрид


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

 Профиль  
                  
 
 
Сообщение05.02.2006, 16:23 
Заслуженный участник
Аватара пользователя


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

 Профиль  
                  
 
 
Сообщение05.02.2006, 16:31 
Заслуженный участник
Аватара пользователя


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

 Профиль  
                  
 
 
Сообщение05.02.2006, 16:38 
Заслуженный участник
Аватара пользователя


09/10/05
1142
Ну с Вами, как с профессионалом, мне тягаться конечно трудновато :wink: , но всё-же за свои 2 года проведённых за клавиатурой я слово Паскаль ни разу не слышала :wink: (хотя один раз видела - на второй странице в скрипте по SE нам он был преподан как "дедушка современного рока" (с), т.е. программирования).

 Профиль  
                  
 
 1) Ошибка. 2) Графические драйверы.
Сообщение05.02.2006, 17:03 
Заслуженный участник
Аватара пользователя


23/07/05
17973
Москва
Мне внезапно пришло в голову, что программа не всегда будет работать правильно. Если разность полярных углов для последовательных точек окажется $\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 
Аватара пользователя


20/01/06
64
оттуда
Capella писал(а):
...
Паскаль мёртв, учите лучше OOP или гибрид

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

 Профиль  
                  
 
 
Сообщение05.02.2006, 17:38 
Заслуженный участник
Аватара пользователя


12/10/05
478
Казань
Capella писал(а):
Ну с Вами, как с профессионалом, мне тягаться конечно трудновато :wink: , но всё-же за свои 2 года проведённых за клавиатурой я слово Паскаль ни разу не слышала :wink: (хотя один раз видела - на второй странице в скрипте по SE нам он был преподан как "дедушка современного рока" (с), т.е. программирования).


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

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

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

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 64 ]  На страницу Пред.  1, 2, 3, 4, 5  След.

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group