Niezalogowany (Zaloguj się)
WItaj Gościu! Możesz się teraz zalogować lub poprosić o członkowstwo na Forum Turbo Pascal Web Pag
    • CommentAuthorpolandman
    • CommentTime30 Dec 2007
     
    Witam, Mam przeksztalcic obliczanie miejsca zerowego rownania 1-e^(sinx^cosx) z petli REPEAT na WHILE program Bisekcja; { Program rozwiązuje równania nieliniowe metodą bisekcji } var a, b, c : real; { granice przedziału i punkt podziału } eps : real; { dokładność } begin writeln('Program znajduje miejsce zerowe funkcji') writeln('w przedziale [a;b]'); write('Podaj wartosc a: '); { wprowadź granice przedziału } readln(a); write('Podaj wartosc b: '); readln(b); write('Podaj dokladnosc: '); readln(eps); repeat c := (a + b)/2; { podziel przedział na pół } if (1 - exp(sin(a)*cos(a)))*(1 - exp(sin(c)*cos(c))) < 0 then b := c { funkcja ma przeciwne znaki w a i c } else a := c; { funkcja ma przeciwne znaki w b i c } writeln(c); until abs(1 - exp(sin(c)*cos(c))) < eps; { badamy wartość bezwzględną! } writeln('Miejsce zerowe: c = ',c:12:8); readln; end. przeprawilem, i proboje, mam takie cos jednak nie dziala begin clrscr; writeln('Program znajduje miejsca zerwoe funkcji'); writeln('w przedziale a<->b'); writeln('Podaj wartosc a'); readln(a); writeln('Podaj wartosc b'); readln(b); writeln('Podaj dokladnosc'); readln(eps); c:=(a+b)/2; while abs(1-exp(sin(c)*cos(c))) < eps {badamy wartosc ezwzgledna} do begin if (1-exp(sin(a)*cos(a)))*(1-exp(sin(c)*cos(c))) < 0 then b := c {f ma przeciwne znaki w a i c} else a := c; {f ma przeciwne znaki w b i c} c := (a+b)/2; {dzieli przedzial na polowe} end; writeln('Miejsce zerowe c= ',c:12:8); readln; end. Czy moze ktos mnie naprowadzic troszke? jestem poaczatkujacy
    • CommentAuthorsteficzek
    • CommentTime30 Dec 2007 zmieniony
     
    Program Pierwszy;
    Uses Crt;
    Begin
    ClrScr;
    while True do Write('While,');
    End.

    Program Drugi;
    Uses Crt;
    Begin
    ClrScr;
    while False do Write('While,');
    End.

    Program Trzeci;
    Uses Crt;
    Begin
    ClrScr;
    repeat
    Write('Repeat,');
    until True;
    End.

    Program Czwarty;
    Uses Crt;
    Begin
    ClrScr;
    repeat
    Write('Repeat,');
    until False;
    End.


    Z pozoru wszystkie te programy powinny robić dokładnie to samo czyli
    w nieskończoność wyświetlać wyrazy na ekranie. A okazuje się że jest zgoła inaczej.

    - Program pierwszy wypisze w pętli nieskończonej wyrazy While
    - Program drugi nie wypisze żadnego wyrazu na ekranie

    - Program trzeci wypisze tylko raz wyraz Repeat
    - Program czwarty wypisze w pętli nieskończonej wyrazy Repeat

    Tak więc zmiana repeat na while lub while na repeat wiąże się ze zmianą warunku logicznego jaki zostanie użyty.
    REPEAT coś UNTIL Warunek - Powtarzaj coś aż okaże się że jest spełniony warunek
    WHILE Warunek DO coś - Dopóki jest spełniony warunek wykonuj coś

    Na pierwszy rzut oka widać że sa to całkiem odmienne pętle

    Inny przykład na dokładkę który pokazuje że trzeba użyć innego warunku w obu przypadkach
    repeat
    Dolewaj;
    until Pełno;

    while nie Pełno do
    Dolewaj;

    Polecam kombinację klawiszy Ctrl+Break przy przerywaniu programów.

    Pozdrawiam Stefan Pruszkiewicz
    • CommentAuthorpolandman
    • CommentTime3 Jan 2008
     
    Witam, Dziękuje, wystarczyło zmienić znak. Jednak dziękuje bardziej za bardzo zrozumiałą odpowiedź.