ustalanie znaków pierwiastków trójmianu kwadratoweg

0

Mam problem z napisaniem w Turbo Pascalu programu, który miałby za zadanie ustalić znaki miejsc zerowych funkcji:
f(x)=ax^2+bx+c
gdzie a musi być różne od 0

na początku trzeba podać parametry a, b, c

następnie program sprawdza, czy a faktycznie jest różne od 0

obliczenie delty

czy delta > 0? jeśli nie to koniec programu

jeśli tak to, czy c/a>0?
jeśli nie to czy c/a=0?
jeśli nie to pierwiastki mają różne znaki
jeśli tak to koniec programu

jeśli c/a bylo wieksze od 0 to czy -b/a>0?
jeśli nie to czy -b/a=0?
jeśli nie to oba pierwiastki są ujemne
jeśli tak to koniec programu

jeśli -b/a było większe od 0 to oba pierwiastki są dodatnie


uff, jak widać jest tu bardzo dużo warunków if, z którymi ja sobie raczej nie radzę. Cały program można fajnie rozrysować na wykresie algorytmu. Mam nadzieję, że to, co napisałem jest choć trochę przejrzyste.
Jeśli nie to program korzysta z warunków:

f(x)=ax^2+bx+c
gdzie a musi być różne od 0
i
delta > 0 -> x1, x2 należą do rzeczywistych

oraz ze wzorów:
x1 * x2 = c/a
x1 + x2 = -b/a

  1. Jeżeli x1 * x2 = c/a < 0 to pierwiastki mają różne znaki

  2. Jeżeli x1 * x2 = c/a > 0 to pierwiastki mają takie same znaki

  3. Jeżeli x1 * x2 = c/a > 0 i x1 + x2 = -b/a > 0 to oba pierwiastki są dodatnie

  4. Jeżeli x1 * x2 = c/a > 0 i x1 + x2 = -b/a < 0 to oba pierwiastki są ujemne


Tyle! Nad problemem głowię się od tygodnia, a Pascala znam dość słabo. Zawieszam się na wysokości sprawdzenia, czy delta jest większa od zera.
Czy ktoś umie mi pomóc [???]

0

WOW !!!
Napisałeś cały program (fakt, że jeszcze trzeba go przetłumaczyć na "Pascalski") i mówisz, że masz problem ??
Proponuję sięgnąć po jakiś kurs dla początkujących.

//Dopisane

Oraz czytać forum :-P

http://4programmers.net/Forum/viewtopic.html?id=44214

0

po pierwsze to wcale nie basic rules bo zaraz sam zobaczysz :)

potrzebujemy kilku zmiennych globalnych:

a, b, c, delta, x1, x2 : real; // dane uzywane w programie dla jasnosci globalnie
daneok : boolean; // a przyda sie pamietac czy dane sa dobre czy nie
wynikmsg1, wynikmsg2, wynik : string // do sformuowania odpowiedzi

potrzebujemy kilku procedur:

  • inicjalizacja -> init
  • pobieranie danych i sprawdzenie poprawnosci -> pobierz
  • sprawdzanie miejsc zerowych ->oblicz
  • wyswietlanie wyniku -> pokaz

Jezeli to ma bc w delphi to potrzebny formulaz z 5 labelkami:
powitanie, a=,b=,c=, wyniki, do tego 3 edit boxy do pobrania danych a,b,c i jakis button do inicjalizacji obliczen

procedure init;
begin
{ tutaj wszystkie komendy dotyczace powitania usera i wytlumaczenia mu co ma wpisac, w delphi bedzie to np:}
Form1.Label1.Caption:='Dana jest funkcja ...... podaj dane... zalozenia';
{w pascalu zdajesie jakies: writeln}
daneok:=false; // zakladamy na wstepie ze dane sa zle dopoki ktos nie poda dobrych i potem to wykorzystamy
end;

procedure pobierz;
begin
{tutaj pascalowska sekcja pobierania danych write podaj a, read a i takie tam, generalnie trzeba wziac od usera dane a,b i c i wrzucic je do zmiennych, jezeli to w delphi to:}
a:=Strtofloat(Form1.Edit2.Text);
b:=Strtofloat(Form1.Edit2.Text);
c:=Strtofloat(Form1.Edit2.Text); 
{bierzemy tekst z editboxa i konwertujemy na zmiennoprzecinkowa, nie zajalem sie wcale przypadkiem gdy ktos nie poda liczby a trzeba to przewidziec raczej}
delta:= b*b-4*a*c; // od razu sobie machniemy delte
if a=o or delta=0 then begin
{tutaj co program ma robic gdy bledne dane, jakies alerty itp, w pascalu writeln zle dane i exit, w delphi na przyklad:}
MessageDlg('Dane nie spełniają założeń !', mtError, [mbOK],0);
daneok:=false;
exit;
end else daneok:=true; // no i zatwierdzenie danych jak sa dobre
end;

procedure oblicz;
begin
if not daneok then exit; // od razu ucieka jak zle dane to nam odpadna kombinacje z else ...
if c/a < 0 then wynikmsg1:='różne' else
                      wynikmsg1:='jednakowe' ;
// liczy pierwszy warunek i zapamietuje wynik wpostaci ktora potem latwo rykorzystac
if c/a > 0 and -b/a >0 then  wynikmsg2:='dodatnie' else
                                         wynikmsg2:='ujemne';
// podobnie z drugim warunkiem, dodatkowo if w polaczeniu z and zmniejsza klopoty z zagniezdzaniam ifow

wynik:=Obliczono ze znaki pierwiastkow tego rownania sa:'+wynikmsg1;
//formuuje odpowiedz czesciowa ze wzgledu na nie/jednakowosc znakow

if wynikmsg1='różne' then 
wynik:=wynik+#10+'Dodatkowo wiadomo, ze oba są '+wynikmsg2;
// jezeli wczesniej wyszlo mu ze rozne to teraz formuuje dodatkowa odpowiedz, czyli nowa linia i druga czesc odpowiedzi
{tutaj sekcja wyswietlania wynikow, tekst jest juz w zmiennej wynik wiec wystarczy z nia pojechac na ekran, w delphi to bedzie:}
Form1.Label5.Caption:=wynik;
end;

no i masz wszystkio tylko podzielone na procedury zebys podciagnal pascala :P teraz zeby toto bylo programem to po deklaracji procedur trzeba je uruchomic w odpowiedniej kolejnosci.

Jezeli programw pascalu to poczytaj o pobieraniu liczby od usera i zapamietaniu jej do zmiennej, to bylo chyba jakies read , jezeli w delphi to konwersja z tekstu wpisanego w okienka na liczbe zmiennoprzecinkowa, dodatkowo w delphi rozdzielam inicjalizacje polegajaca na wypelnieniu formularza tekstami dla usera od czesci liczacej wiec procedura oblicz i wynik musi byc podpieta do buttona.

Jezeli nie przemawia do ciebie pascal to tylko zwrov uwage na to jak formuuje ify zeby nie sprawdzac tego samego po 3 razy bo wiekszosc twoich warunkow sie wyklucza stad najprosciej:
if delta=0 or a=0 then exit; od razu eliminuje zagniezdzanie bo wychodzi z progamu

gl hf :D

ps tam moze byc troche bykow ale chodzilo mi o schemat zajmowania sie w powazny i pokazowy sposob problemami ktore sie normalnie liczy w kilku(nastu) linijkach

0

Za pomoc dziękuję i biorę się do roboty. Jak się coś wysypie to dam później znać. :-0

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