Połączenie dwóch kodów w jeden i zamiana main na procedurę

0

Witam. Mam wielką prośbę. Mógłby ktoś połączyć te dwa programy w jeden oraz te rzeczy które robić się w main wsadzić do procedury? W Pascalu bardzo dawno nic nie robiłem a bardzo tego potrzebuję. Dla sprawnego w tym języku powinno to zająć parę minut, bo kody programów nie są skomplikowane.

uses
  SysUtils;

var i:Byte;
    a,b,E,xp,x0,Fxp,Fx0:real48;

function FNC(x:real48):real48;
begin
FNC:=EXP(X)-10*x+7;
end;

function POCH1(x:Real48):Real48;
Begin
  POCH1:=EXP(x)-10;
End;

function POCH2(x:Real48):Real48;
Begin
  POCH2:=EXP(x);
End;

begin
 writeln('Rozwiazywanie rownan nieliniowych f(x)=0');
 writeln('Metoda statycznych (met Newtona)');
 writeln;
 writeln('Dane wejsciowe');
 writeln('Przedzial poszukiwan');
 write('a=');readln(a);
 write('b=');readln(b);
 writeln;
 writeln('Dokladnosc obliczen');
 write('E=');readln(E);
 writeln;

//wybor punktu startowego

 //sprawdzaanie zalozen;

 if FNC(a) * FNC(b) > 0
  THEN x0:=a
  ELSE x0:=b;

if POCH1(x0)=0 then
  begin
    writeln('Nie mozna zastosowac metody stycznych');
    readln;
  end
else
  begin
    i:=0;
      repeat
      inc(i);
      xp:=x0-FNC(x0)/POCH1(x0);
      Fxp:=FNC(xp);
      Fx0:=FNC(x0);
      writeln('i=', i:2,' x0= ', x0:10:6,'  Fxo=', Fx0:10:6, ' xp= ', xp:10:6,'  Fxp=', Fxp:10:6);
      x0:=xp;
      until ABS(Fxp)<=E;
 writeln;
 writeln('Wyniki');
 writeln('Pierwiastek x=',xp:9:6);
 writeln('Wartosc funkcji f(x)=',Fxp:12:8);
 writeln('Liczba iteracji i=',i);
readln;

readln;
  end;
END.

 
uses
  SysUtils;
var i:SmallInt;
    a,b,E,xp,pp,kp,Fa,Fb,Fx,Fxp,Fpp:real48;

function FNC(x:real48):real48;
begin

//FNC:=SQRt(SIN(X))+LN(SQR(x)+SQR(SQR(x)));
FNC:=x*SQR(X)-10*x-5;
end;

begin
 writeln('Rozwiazywanie rownan nieliniowych d(x)=0');
 writeln('Metoda bisekcji (przedzialu polowkowego)');
 writeln;
 writeln('Dane wejsciowe');
 writeln('Przedzial poszukiwan');
 write('a=');readln(a);
 write('b=');readln(b);
 writeln;
 writeln('Dokladnosc obliczen');
 write('E=');readln(E);
 writeln;
 Fa:=FNC(a);
 Fb:=FNC(b);

 //sprawdzaanie zalozen;

 if Fa*Fb >0 then
 begin
 writeln('NIE MOZNA ZASTOSOWAC METODY BISEKCJI');
 readln;
 halt
 end;

 if Fa=0 then
 begin
 writeln('Rozwiazanie dokladne');
 writeln('Pierwiastek x=',a:9:6);
 halt
 end;

 if Fb=0 then
 begin
 writeln('Rozwiazanie dokladne');
 writeln('Pierwiastek x=',b:9:6);
 readln;
 halt
 end;

 //iteracyjne zmniejszanie przedzialu
 i:=0;
 pp:=a;
 kp:=b;

 repeat
 i:=i+1;    //inc(i)
 xp:=(pp+kp)/2;
 Fxp:=FNC(xp);
 Fpp:=FNC(pp);

 if Fpp*Fxp<0 then
 begin
 kp:=xp;
 end
 else
 begin
 pp:=xp;
 end;

 until (kp-pp<=E) or (Fxp=0);
 //wyswietlenie wynikow

 writeln;
 writeln('Wyniki');
 writeln('Pierwiastek x=',xp:9:6);
 writeln('Wartosc funkcji f(x)=',Fxp:12:8);
 writeln('Liczba iteracji i=',i);
 readln;

readln;
end. 
0

100zł

0
program combo;

{$APPTYPE CONSOLE}

uses
  SysUtils;

var i:Byte;
    a,b,E,xp,x0,Fxp,Fx0:real48;

function FNC(x:real48):real48;
begin
FNC:=EXP(X)-10*x+7;
end;

function POCH1(x:Real48):Real48;
Begin
  POCH1:=EXP(x)-10;
End;

function POCH2(x:Real48):Real48;
Begin
  POCH2:=EXP(x);
End;

procedure styczne(a:Real48; b:Real48);
  var e:real48;
begin
 writeln('Przedzial poszukiwan');
 writeln;
 writeln('Dokladnosc obliczen');
 write('E=');readln(E);
 writeln;
 if FNC(a) * FNC(b) > 0
  THEN x0:=a
  ELSE x0:=b;

if POCH1(x0)=0 then
  begin
    writeln('Nie mozna zastosowac metody stycznych');
    readln;
  end
else
  begin
    i:=0;
      repeat
      inc(i);
      xp:=x0-FNC(x0)/POCH1(x0);
      Fxp:=FNC(xp);
      Fx0:=FNC(x0);
      writeln('i=', i:2,' x0= ', x0:10:6,'  Fxo=', Fx0:10:6, ' xp= ', xp:10:6,'  Fxp=', Fxp:10:6);
      x0:=xp;
      until ABS(Fxp)<=E;
       writeln('Pierwiastek x=',xp:9:6);
 writeln('Wartosc funkcji f(x)=',Fxp:12:8);
 writeln('Liczba iteracji i=',i);
end;
end;


procedure bisekcji(var a:Real48; var b:Real48);
  var e,fa,fb,pp,kp,fpp:real48;
  begin
  writeln('Przedzial poszukiwan');
 writeln;
 writeln('Dokladnosc obliczen');
 write('E=');readln(E);
 writeln;
 Fa:=FNC(a);
 Fb:=FNC(b);

 //sprawdzaanie zalozen;

 if Fa*Fb >0 then
 begin
 writeln('NIE MOZNA ZASTOSOWAC METODY BISEKCJI');
 readln;
 halt
 end;

 if Fa=0 then
 begin
 writeln('Rozwiazanie dokladne');
 writeln('Pierwiastek x=',a:9:6);
 halt
 end;

 if Fb=0 then
 begin
 writeln('Rozwiazanie dokladne');
 writeln('Pierwiastek x=',b:9:6);
 readln;
 halt
 end;

 //iteracyjne zmniejszanie przedzialu
 i:=0;
 pp:=a;
 kp:=b;

 repeat
 i:=i+1;    //inc(i)
 xp:=(pp+kp)/2;
 Fxp:=FNC(xp);
 Fpp:=FNC(pp);

 if Fpp*Fxp<0 then
 begin
 kp:=xp;
 end
 else
 begin
 pp:=xp;
 end;

 until (kp-pp<=E) or (Fxp=0);
 writeln('Pierwiastek x=',xp:9:6);
 writeln('Wartosc funkcji f(x)=',Fxp:12:8);
 writeln('Liczba iteracji i=',i);
 end;

begin
 writeln('Rozwiazywanie rownan nieliniowych f(x)=0');
 writeln('Metoda statycznych (met Newtona)');
 writeln;
 writeln('Dane wejsciowe');
 writeln('Przedzial poszukiwan');
 write('a=');readln(a);
 write('b=');readln(b);
 writeln('Metoda stycznych');
 styczne(a,b);
 writeln('Metoda bisekcji');
 bisekcji(a,b);
 writeln;
readln;
readln;

END.

Zrobiłem coś takiego. Nie jestem pewien czy jest dobrze, program to liczy. Najwięcej wątpliwości mam przy przedziale poszukiwań. W main wczytuje a oraz b i nie wiem czy te zmienne dobrze docierają do tych dwóch procedur co stworzyłem.

zamiana znacznika <pre> na <code class="delphi"> - fp

1

Whoa, whoa - powoli.
Zacznijmy od początku:
Te programy są beznadziejnie sformatowane.
Na tym też póki co zakończymy.

0

Te programy było robione przez moją wykładowczynię, więc muszą takie zostać. Program zrobiony przeze mnie działa, tylko nie wiem do końca czy dobrze to zrobiłem.

1

Jak działa poprawnie w każdym przypadku to może tak zostać.
Na temat czy dobrze zrobiłeś to już otrzymałeś odpowiedź od @Patryk27 - nie dobrze, brak formatowania.
Jeżeli chcesz dalszej analizy to popraw formatowania i wklej sformatowany kod.

0
Skuska napisał(a)

Te programy było robione przez moją wykładowczynię, więc muszą takie zostać.

Więc czas powiedzieć wykładowczyni, że lepsze programy (nie tylko lepiej sformatowane) piszą dzieciaki w TI; Boisz się poprawić ten program na lepsze, żeby Cię wykładowczyni nie opierniczyła? Żaden wstyd napisać coś lepszego od prowadzącej - wręcz przeciwnie;

@Skuska - było by w miarę Ok, gdyby nie to:

uses
  SysUtils;
 
var i:Byte;
    a,b,E,xp,x0,Fxp,Fx0:real48;

Nie dość, że używasz zmiennych globalnych, to jeszcze deklarujesz je na samej górze programu, przez co są widoczne w calutkim module... Po co więc przekazujesz parametry w procedurach i funkcjach, skoro i tak wszystkie zmienne są w nich widoczne? Niepotrzebnie robisz sobie bałagan w programie;

Poza tym formatowanie bardzo słabe - brak sensownych wcięć i do tego wszystko lowercase... Popraw to, a kod stanie się czytelniejszy i zauważysz co można zmienić/skrócić;

Tymczasem wątek przenoszę do działu Newbie, bo dotyczy podstaw programowania w Pascalu.

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