Obliczanie całki dwoma sposobami.

0

Witam.
mam problem z programem, który ma obliczyć całkę 2 sposobami. Koniecznie muszę używać procedur.
Czy mógłby mi ktoś powiedzieć co jest źle i jak to naprawić jestem naprawdę słaby w tym. Coś takiego udało mi się wyskrobać

program calka;

{$APPTYPE CONSOLE}

uses
  SysUtils;

var
a,b:real48;
N:integer;


//funkcje
function FNC(x:real48):real48;
begin
FNC:=x*sqr(x)*sqr(sqr(x));
end;

//procedury

procedure prostokat(  var xi,  S_P, S_NP:real48);
var 
H,B,A,Q1:real48;
i,k:integer;
begin
for k:=1 to 10 do begin
    N:=N*2;
    H:=(B-A)/N;
    S_P:=0;
    S_NP:=0;
    for i:=1 to N-1 do begin
      xi:=a+i*H;
      if odd(i) then
        S_NP:=S_NP+FNC(xi)
      else
        S_P:=S_P+FNC(xi);end;
Q1:=(FNC(a)+S_NP+S_P)*H;
end;
 end;
procedure parabol( var xi,  S_P,  S_NP:real48);
var
H,B,A,Q2:real48;
i,k:integer;
begin
for k:=1 to 10 do begin
    N:=N*2;
    H:=(B-A)/N;
    S_P:=0;
    S_NP:=0;
    for i:=1 to N-1 do begin
      xi:=a+i*H;
      if odd(i) then
        S_NP:=S_NP+FNC(xi)
      else
        S_P:=S_P+FNC(xi);end;
 Q2:=(FNC(a)+FNC(b)+4*S_NP+2*S_P)*H/3;end;

//blok glowny programu
begin
writeln('Calkowanie numeryczne');
  writeln('Metoda prostokatow i parabol');
writeln; writeln('podaj a=');readln(A);
writeln; writeln('podaj b=');readln(B);
writeln; writeln('podaj N=');readln(N);

prostokat(Q1);
parabol(Q2);


readln;
end;
end.

dodanie znacznika <code class="delphi"> - fp

0

Przede wszystkim złe jest formatowanie, które bardzo skutecznie odbija jakąkolwiek chęć czytania tego kodu.

0

Nie wiem czy o to chodziło ?

program nowy;

{$APPTYPE CONSOLE}

uses
  SysUtils;

var  a,b:real48;
N:integer;


//funkcje
function FNC(x:real48):real48;
begin
FNC:=x*sqr(x)*sqr(sqr(x));
end;

//procedury

procedure prostokat( var Q1:real48);
var 
H,xi,S_P,S_NP:real48;
i:integer;

  
begin

    begin
    N:=N*2;
    H:=(B-A)/N;
    S_P:=0; S_NP:=0;
    for i:=1 to N-1 do
     begin
      xi:=a+i*H;
      IF ODD(i) then S_NP:=S_P+FNC(xi)
                else S_P:=S_P+FNC(xi);
     end; //koniec petli po i

    Q1:=(FNC(a)+S_NP+S_P)*H;  //metoda prostokatow

     end;


//blok glowny programu
begin
writeln('Calkowanie numeryczne');
  writeln('Metoda prostokatow ');
writeln; writeln('podaj a=');readln(A);
writeln; writeln('podaj b=');readln(B);
writeln; writeln('podaj N=');readln(N);


prostokat(Q1);

   readln;

  end;
   end;

end.

dodanie znacznika <code class="delphi"> - fp

2

Ech, jeżeli chodzi o formatowanie kodu to temat wałkowany tutaj przynajmniej 69346834 razy. Chyba jednak ktoś się musi przemóc i machnąc dla "leniwców niegooglowców" arta pod kątem Delphi po polsku. Nie umiesz sformatować kodu samodzielnie to jeżeli używasz Delphi, ściągnij dodatek GExperts, zainstaluj, następnie pogoogluj za jego alternatywną wersją. Przy wyłączonym Delphi nadpisz jego dllki dla odpowiedniej wersji Delphi, wersją alternatywną. Wersja ta posiada wbufowany formatter. Poza tym użyteczne Ctrl+G.

Inny sposób to użycie JEDI Code Formatter lub sformatowanie kodu pod Lazarusem. I poza samym formatowaniem należy kod jeszcze wstawić w odpowiednie tagi, tutaj delphi. Wiem, wiem. Sam jak zaczynałem kodzić miałem taki idiotyczny nawyk, że nawet celowo usuwałem formatowanie, bo kod wcięty wydawał mi się dla mnie nieczytelny. Ale to było dawno. I między innymi po to ktoś kiedyś popełnia błedy, żeby po czasie przejrzeć na oczy, nauczyć się czegoś i móc to doradzać innym. Żeby nawet, jeżeli zaczynają przygodę z danym językiem, to nie powielali błędów kogoś z początków jego nauki programowania.

0

Dziękuje za wszystkie podpowiedzi co do formatowania. Nie chciałem korzystać z programów więc sam postanowiłem spróbować to formatować

program Całka;

{$APPTYPE CONSOLE}

uses
  SysUtils;

var  a,b:real48;
N:integer;


//funkcje
function FNC(x:real48):real48;
begin
FNC:=x*sqr(x)*sqr(sqr(x));
end;

//procedury

procedure prostokat( var Q1:real48);
var 
H,xi,S_P,S_NP:real48;
i,k:integer;


begin

       for k:=1 to 10 do
         begin
         N:=N*2;
         H:=(b-a)/N;
         S_P:=0;
         S_NP:=0;
         for i:=1 to  N-1 do
          begin
           xi:=a+i*H;
           if odd(i) then
           S_NP:=S_NP+FNC(xi)
           else
           S_P:=S_P+FNC(xi);
          end;
Q1:=(FNC(a)+S_NP+S_P)*H;

        end;
 end;


procedure parabol( var Q2:real48);
var
H,xi,S_P,S_NP:real48;
i,k:integer;
begin

   for k:=1 to 10 do
     begin
      N:=N*2;
      H:=(b-a)/N;
      S_P:=0;
      S_NP:=0;
      for i:=1 to N-1 do
       begin
       xi:=a+i*H;
       if odd(i) then
       S_NP:=S_NP+FNC(xi)
       else
        S_P:=S_P+FNC(xi);
       end;
 Q2:=(FNC(a)+FNC(b)+4*S_NP+2*S_P)*H/3;

end;

//blok glowny programu
begin
writeln('Calkowanie numeryczne');
  writeln('Metoda prostokatow i parabol');
writeln; writeln('podaj a=');readln(A);
writeln; writeln('podaj b=');readln(B);
writeln; writeln('podaj N=');readln(N);

prostokat(Q1);
parabol(Q2);
   readln;
   readln;
  

end;
end.

dodanie znacznika <code class="delphi"> - fp

0

Co jest źle:

  • nie stosuj real48 tylko double lub extended (większa dokładność)
  • wyświetl gdzieś wynik, najlepiej zaraz po

Q1:=(FNC(a)+S_NP+S_P)*H;

http://docwiki.embarcadero.com/RADStudio/XE5/en/Delphi_Data_Types

(musiałem usunąć poprzedni post, ze względu na nieusuwalny załącznik)

0

samo real jest w delphi aliasem na double. skąd ten upór na real48, które istnieje tylko dla kompatybilności z archaicznym Turbo Pascalem?

pisz po prostu real.

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