delphi/pascal - macierze, wykresy

0

witam,

mój problem polega na tym iż chce z kodu pascal (mam kod w pascalu w aplikacji konsolowej jednak nie pozwala ona na wykonanie mojego zadania) utworzyć program w delphi, który obliczał by dane i wpisywał je do macierzy (to już mam). Nie znam delphi więc proszę o pomoc. Jak w delphi używać narzędzia StringGrid (chodzi o wpisanie wyników z macierzy czy jest coś lepszego) oraz jak z tych danych utworzyć wykres??


program prac_przejsc_2;

{$APPTYPE CONSOLE}

uses
  SysUtils, math, crt;

type typ1=array[1..360,1..3]of double;
     typ2=array[1..3]of string;

var n, v1, v2, v, v4, p1, p2, p, pmax, a, c, eps, ms, mr, alfa:double;
    i, b:integer;
    x:typ1;

procedure wypisz(var y:typ1); //procedura wypisywania macierzy
var i, j:integer;
begin
 for i:=1 to 360 do
  begin
   for j:=1 to 3 do
    write(x[i,j]:10:2,' ');
    writeln;
  end;
end;

begin
n:=0;
v1:=25.6235;
p1:=88;
v2:=1.6015;
v:=v1;
eps:=16;
ms:=1.34;
mr:=1.2;
alfa:=1.8;
writeln('objetosc w DMP ',v1:3:2,' kat obrotu ',n:3:2);
  for i:=1 to 180 do

   begin
    v:=v-(v1-v2)/180;
    a:=v1/v;
    p:=p1*pow(a,ms);
    writeln('objetosc ',v:3:2,' kat obrotu ',i,' cisnienie ',p:3:2);
    x[i, 1]:=v;
    x[i, 2]:=i;
    x[i, 3]:=p;
   end;

writeln;
p2:=p1*pow(eps,ms);
writeln('cisnienie p2 = ',p2:0:2,' kPa');
pmax:=alfa*p2;
writeln('cisnienie pmax = ',pmax:0:2,' kPa');

writeln('#################################');
writeln;

readln;
clrscr;
writeln('objetosc w gmp',v);

v4:=1.8;

 for i:=181 to 360 do

  begin
   v:=v+(v1-v2)/180;

    if v<=v4 then
    begin
     p:=pmax;
     writeln('objetosc ',v:3:2,' kat obrotu ',i,' cisnienie ',p:3:2 )
     end;
    if v>v4 then
    begin
     c:=(v4/v);
     p:=pmax*pow(c,mr);
     writeln('objetosc ',v:3:2,' kat obrotu ',b,' cisnienie ',p:3:2);
  end;
    x[i, 1]:=v;
    x[i, 2]:=i;
    x[i, 3]:=p;
 end;

readln;

wypisz(x);

readln;
end.

Program na razie działa i oblicza, oczywiście potrzeba jeszcze kilka szlifów.

Macierz jest postaci 3 kolumny-(mają być dwa wykresy p(v) i p(fi)) 360 wierszy, oczywiście jeden przykład wystarczy.

0

Hallo Jozus!

Czy to ma byc cos takiego jak ponizej?

user image

(Jezeli obrazka nie widac, to uzyj ten link)

Pozdrawiam
Markus</url>

0

zalozmy ze mamy maciez x 3 kolumny i 360 wierszy

to robisz tak

for i := low(x) to high(x) do
for j = low(x[i]) to high(X[i]) do
  stringGrid1.cells[i,j] := FloatToStr(X[i,j])

potem komponent TChart

var Chart : Tchart;

if not Assigned(Chart) then Chart := TChart.create();

Chart.series..... //dawni nie uzywalem wiec nie pamietam (poszukaj bo nie mam delphi zainstalowanego)

pamietaj w destroy zrobic

if Assigned(Char) then FreeAndNill(Char)
0

Wielkie dzięki,

MarkusB, no o coś takiego by mi chodziło. Mógł byś może podać jakiegoś linka, który mi powie jak się dowiedzieć jak to zrobić, bo z tych co aktualnie znalazłem nie wiele wynika.

crowa pomimo najszczerszych chęci dalej za bardzo tego nie rozumiem - btw niestety nie studiuje informatyki, ale mechanikę i mamy tylko pascala w tym semestrze, na następny ma być delphi, a ten program muszę oddać w tym.
Podejrzewam, iż pierwszy kod z pętlą for odnosi się do wpisania do narzędzia StringGrid. W pascalu wypisywanie wygląda tak, ale jak to odnieść to powyższego


procedure wypisz(var x:typ1); //procedura wypisywania macierzy
var i, j:integer;
begin
 for i:=1 to n do             //w moim przypadku n bedzie równe 360
  begin
   for j:=1 to m do         //jw m=3
    write(x[i,j]:10:2,' ');
    writeln;
  end;
end;

a Tchart służy do wykresów, tak ?

Dzięki jeszcze raz
Jozus

0

Hallo Jozus!

<font size="4">Obrazek</span> i troche codu (quick & dirty):

procedure TForm1.Button1Click(Sender: TObject);
var
  i, j, PosX, PosY:integer;
  StepX, StepY: double;
begin
  policz;      //Twoja procedura obliczajaca wartosci cisnienia i objetosci w zaleznosci od kata obrotu

  try
    StepX := Image1.Width / 360;
    StepY := Image1.Height / pmax;
  finally

  end;

  Image1.Canvas.MoveTo(0, Image1.Height);

  StringGrid1.Cells[1, 0] := 'Objetosc';
  StringGrid1.Cells[2, 0] := 'Kat';
  StringGrid1.Cells[3, 0] := 'Cisnienie';

  for i:=1 to 360 do
  begin
    for j:=1 to 3 do
    begin
      StringGrid1.Cells[j, i] := FloatToStrF(x[i,j], ffNumber, 10, 2);
      if j = 3 then
      begin
        PosX := Trunc(i*StepX);
        PosY := Image1.Height - Trunc(x[i,j]*StepY);
        Image1.Canvas.LineTo(PosX, PosY);
      end;
    end;
  end;

  Chart1.BottomAxis.Minimum := 0.0;
  Chart1.BottomAxis.Maximum := 360;
  Chart1.LeftAxis.Minimum   := 0.0;
  Chart1.LeftAxis.Maximum   := alfa*p2;

  Series1.Clear;
  Chart1.Title.Text.Text := 'Wykres indykatorowy maszyny tlokowej';

  for i:=1 to 360 do
  begin
    for j:=1 to 3 do
    begin
      if j = 3 then
      begin
        Series1.AddXY(Trunc(i), Trunc(x[i,j]), '', clRed);
      end;
    end;
  end;
end;

Pozdrawiam
Markus
:-)

1 użytkowników online, w tym zalogowanych: 0, gości: 1