Problem z pascalem


(Fraterfrater) #1

Mam problem. Kompiluje mi program (który ma policzyć wartość, miejsca zerowe i punkt przecięcia z osią Y funkcji liniowej lub kwadratowej), ale nie może go odpalić (Przez ułamek sekundy pojawia się czarny ekran i potem wraca do tego co było). Nie mam pojęcia, co zrobić. Kod poniżej:

program funkcje;                                                              

uses crt;                                                                     

var a,b,c,x,delta,y,x1,x2,x0,f0,l,k:real;                                     

    znak:char;                                                                


procedure liniowa;                                                            


  begin                                                                       

  writeln('Podaj a');                                                         

  readln(a);                                                                  

  writeln('Podaj b');                                                         

  readln(b);                                                                  

  writeln('Podaj x');                                                        

  readln(x);                                                                  


  y:=a*x+b;                                                                   

  writeln('y=',y:2:2);                                                        

  x0:=-b/a;                                                                   

  writeln('x0=',x0:2:2);                                                      

  f0:=b;                                                                      

  writeln('f(0)=');                                                           

  end;


procedure kwadratowa;


  function delta(a,b,c:real):real;

  begin

  delta:=sqr(b)-4*a*c;


  if delta<0 then

  begin

  writeln('Brak miejsc zerowych');

  end;


  if delta=0 then

  begin

  x0:=-b/2*a;

  writeln('x0='x0:2:2);

  end;


  if delta>0 then

  begin

  x1:=(-b-sqrt(delta(a,b,c)))/(2*a);

  writeln('x1=',x1:2:2);

  x2:=(-b+sqrt(delta(a,b,c)))/(2*a);

  writeln('x2=',x2:2:);

  end;


  writeln('Podaj a');

  redaln(a);

  writeln('Podaj b');

  readln(b);

  writeln('Podaj c');

  readln(c);

  writeln('Podaj x');

  readln(x);


  y:=a*sqr(x)+b*x+c;

  wrtieln('y=',y:2:2);

  f0:=c;

  writeln('f(0)=',f0:2:2);

  end;


begin

writeln('Wybierz rodzaj funkcji. Wpisz l dla liniowej lub k dla kwadratowej');

readln(z);

case z of

'l': liniowa;

'k': kwadratowa;

end;


readkey;

end.

(Bikerman) #2

Nie uruchamiaj go bezpośrednio! Wejdź w linię komend (menu start -> Uruchom -> wpisz: cmd

W linii poleceń wejdź do katalogu gdzie jest program i go tam uruchom.


(Popek010) #3
program funkcje;

uses crt;

var a,b,c,x,delta:real;

    l,k,znak:char;


procedure liniowa;


  begin

  writeln('Podaj a');

  readln(a);

  writeln('Podaj b');

  readln(b);

  writeln('Podaj x');

  readln(x);

  writeln('y=',(a*x+b):2:2);

  writeln('x0=',(-b/a):2:2);

  writeln('f(0)=',b:2:2);

  end;


procedure kwadratowa;


  begin

  {podstawianie wartosci pod zmienne}

  writeln('Podaj a');

  readln(a);

  writeln('Podaj b');

  readln(b);

  writeln('Podaj c');

  readln(c);

  writeln('Podaj x');

  readln(x);

  {obliczanie wartosci funkcji (y)}

  writeln('y=',(a*sqr(x)+b*x+c):2:2);

  writeln('f(0)=',c:2:2);

  {obliczanie miejsc zerowych}

  delta:=sqr(b)-4*a*c;


  if delta<0 then writeln('Brak miejsc zerowych') else

  if delta=0 then writeln('x0=',(-b/2*a):2:2) else

  if delta>0 then

  begin

  writeln('x1=',(-b-sqrt(delta)/(2*a)):2:2);

  writeln('x2=',(-b+sqrt(delta)/(2*a)):2:2);

  end;

  end;



begin clrscr;

writeln('Wybierz rodzaj funkcji. Wpisz l dla liniowej lub k dla kwadratowej');

readln(znak);

case znak of

'l': liniowa;

'k': kwadratowa;

end;


readkey;

end.

Zoptymalizowałem trochę (primo - kilku zmiennym powiedziałem 'adios').

PS. W funkcjach nie używamy żadnych writeln'ów, readln'ów.


(Bikerman) #4

Problemów w kodzie jest znacznie więcej...

Na początek:

(30,11) Error: Incompatible types: got "local delta(Double, Double, Double):Double" expected "LongInt"

(30,11) Fatal: There were 1 errors compiling module, stopping

(30,11) Fatal: Compilation aborted

* funkcja delta nie zwraca zdefiniowanej wartości

* funkcję delta wyrzuć poza procedurę kwadratowa

* sprawdź bloki begin-end, bo nie wszystkie są pozamykane

* zmienna delta jest nazwana tak samo jak funkcja!

* literówki!

* niezdefiniowane wszystkie zmienne (z)

* zbyt dużo zdefiniowanych zmiennych (niewykorzystane): (znak,l,k)

Poniżej coś - dalekie od ideału, ale się kompiluje:

program funkcje;

uses crt;

var a,b,c,x,d,y,x1,x2,x0,f0:real;

    znak:char;


procedure liniowa;


  begin

  writeln('Podaj a');

  readln(a);

  writeln('Podaj b');

  readln(b);

  writeln('Podaj x');

  readln(x);


  y:=a*x+b;

  writeln('y=',y:2:2);

  x0:=-b/a;

  writeln('x0=',x0:2:2);

  f0:=b;

  writeln('f(0)=');

  end;


function delta(a,b,c:real):real;

  begin

    delta:=sqr(b)-4*a*c;

  end;


procedure kwadratowa;

  begin

  writeln('Podaj a');

  readln(a);

  writeln('Podaj b');

  readln(b);

  writeln('Podaj c');

  readln(c);

  writeln('Podaj x');

  readln(x);


  d:=delta(a,b,c);


    if d<0 then

    begin

    writeln('Brak miejsc zerowych');

    end;


    if d=0 then

    begin

    x0:=-b/2*a;

    writeln('x0=',x0:2:2);

    end;


    if d>0 then

    begin

    x1:=(-b-sqrt(d))/(2*a);

    writeln('x1=',x1:2:2);

    x2:=(-b+sqrt(d))/(2*a);

    writeln('x2=',x2:2:2);

    end;


  y:=a*sqr(x)+b*x+c;

  writeln('y=',y:2:2);

  f0:=c;

  writeln('f(0)=',f0:2:2);

  end;


begin

writeln('Wybierz rodzaj funkcji. Wpisz l dla liniowej lub k dla kwadratowej');

readln(znak);

case znak of

'l': liniowa;

'k': kwadratowa;

end;


readkey;

end.

(Fraterfrater) #5

Dzięki wielkie