Prosty program w pascalu - mała wątpliwość

0

Witam,
Mam zadanie domowe w stylu:
Napisać program tak aby wczytywał 3 zmienne A, B oraz K (krok narastania) - wszystkie typu real. Należy wprowadzić wartość A oraz wartość B, a następnie wypisywać wartości od A co KROK w zwyż tak aby nie przekroczyć B. Mam zrobić to zadanie za pomocą WHILE i UNTIL.
No więc wydziargałem sobie prosty bzdet:

PROGRAM petla;
USES CRT;
VAR
    i,a,b,k:real;
    
BEGIN
CLRSCR;
  REPEAT
    WRITE('Podaj a: '); READLN(a);
    WRITE('Podaj b: '); READLN(b);
        if a>=b THEN 
                WRITELN('Zmienna a musi byc mniejsza od zmiennej b !')                                                         ;
  UNTIL a<b;
  REPEAT
     WRITE('Podaj krok narastania: '); READLN(k);
     if k<=0 THEN 
             WRITELN('Krok narastania musi byc liczba dodatnia!');
  UNTIL k>0;

  WRITELN('Pokazuje petle REPEAT');
  i:=a;
  REPEAT
      WRITELN(i:3:3);
      i:=i+k; 
  UNTIL i>b; 
  WRITELN('Nacisnij dowolny klawisz aby kontynuowac...'); READKEY;
  i:=a;
  WRITELN('Pokazuje petle WHILE');
  WHILE i<=b DO
    BEGIN       
      WRITELN(i:3:3);
      i:=i+k;
    END;
  WRITELN('Nacisnij dowolny klawisz aby kontynuowac...'); READKEY;
END.

Jednak mam pewną wątpliwość. Program działa na pozór dobrze:

Podaj a: 0
Podaj b: 5
Podaj krok narastania: 1
Pokazuje petle REPEAT
0.000
1.000
2.000
3.000
4.000
5.000
Nacisnij dowolny klawisz aby kontynuowac...
Pokazuje petle WHILE
0.000
1.000
2.000
3.000
4.000
5.000
Nacisnij dowolny klawisz aby kontynuowac...

Wypisał idealnie tak jak chciałem. To samo w przypadku:

Podaj a: 3
Podaj b: 4
Podaj krok narastania: 0.3
Pokazuje petle REPEAT
3.000
3.300
3.600
3.900
Nacisnij dowolny klawisz aby kontynuowac...
Pokazuje petle WHILE
3.000
3.300
3.600
3.900
Nacisnij dowolny klawisz aby kontynuowac...

Ale dziwactwa zaczynają się tutaj:

Podaj a: 1   
Podaj b: 2
Podaj krok narastania: 0.01
Pokazuje petle REPEAT
1.000
1.010
....
Tu wycinam
....
1.980
1.990
Nacisnij dowolny klawisz aby kontynuowac...

Wycinku z WHILE już nie wklejam, bo wychodzi dokładnie tak samo jak w przypadku REPEAT. Dlaczego nie wyświetla 2.000 ? Skoro w przypadku innych liczb (na innych normalnie działa, problem zauważyłem z 0.01 jako krok) gdy wynik "i" jest równe wartości B to jeszcze wyświetla?
Dziwne jest to, że teraz według matematyki powinno "i" mieć wartość 2 więc w zakresie nadal się mieści więc powinno zostać wyświetlone. Nie wiem czy gdzieś zrobiłem błąd (ale gdzie skoro w przypadku innych liczb działa ok?). Możecie mi pomóc? Z góry dziękuje.

0

dlatego, że to liczby zmiennoprzecinkowe i 100*0,01 niekoniecznie jest równe 1. zmień warunek
WHILE i<=b DO
na
WHILE i<b+k DO

0

Tak, wtedy będzie zachowywał się ok tylko, że dla "tych wyjątków". Jak natomiast wpisze A=3 B=10 K=4 to while pokaże:

Pokazuje petle WHILE
3.000
7.000
11.000
Nacisnij dowolny klawisz aby kontynuowac..

Więc przekroczy zakres.

Dziękuje za odpowiedź :) czekam jeszcze na inne propozycje

0
x=min
while x<=max
    costam(x)
    x:=x+h

to jest zły sposób, 

np. 1/10 jest liczbą okresową, więc komputer pmięta ją z ograniczoną dokładnścią
błędy narastają, mogą pzekroczyć 100%
znacznie lepiej napisać tak:

i=0 
x=min
while x<=max
    costam(x)
    i=i+1
    x=min + i*h
0

oo dziękuje bardzo! Bardzo dobry sposób, że też o tym nie pomyślałem. Jeszcze raz bardzo dziękuje [browar] i dziękuje za pomoc .

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