Obliczanie pól figur

0

Otóż dopiero się uczę pisać w pascalu ; ) Z góry przepraszam jeśli zaśmiecam forum, lecz wolę wiedzieć dlaczego tak jest, a nie inaczej.

Otóż chodzi o to:
Aplikacja oblicza pole 3 figur, które zaprogramowałem.
Podaję ID figury, wprowadzam dane i wyświetla się wynik, aczkolwiek podany wynik nie ignoruje "kropki" oraz wygląda to tak: 1.50000000+E00 (powinno wyjść w wyniku TYLKO 15.)

A więc, po co te zera i "E" i dlaczego kropka "nie przesuwa" się ?

Czy mogę jakoś zmodyfikować kod, aby było, tak jak być powinno ? : ))

program Figury;

var 
	figura: integer;
	z1,z2,z3,pole: real;
	
BEGIN
	writeln('Podaj rodzaj figury');
	writeln('1 kwadrat, 2 - trojkat, 3 - trapez');
	read(figura);

	case figura of
		1: begin
			writeln('Podaj bok kwadratu');
			read(z1);
			pole :=z1 * z1;
			writeln('Pole kwadratu wonosi: ',pole)
		   end;
		2: begin
			writeln('Podaj podstawe i wysokosc');
			read(z1,z2);
			pole := (z1 * z2)/2;
			writeln('Pole trojkata wynosi: ', pole)
		   end;
		3: begin
			writeln('Podaj podstawy i wysokosc trapezu');
			read(z1,z2,z3);
			pole := ((z1 + z2)/2) / z3;
			writeln('Pole trapezu wynosi: ', pole)
		   end;
	else
		writeln('Blad danych')
	end;
readln;
readln;	
END.
 

PS: Uczę się z książki Nauka Programowania Dla Początkujących Turbo Pascal (Anna Struzińska-Walczak & Krzysztof
Walczak).

0

E to po prostu błąd i nie da się wyświetlić dalej tylu cyfr. Może użyj zamiast real typu single?

0

Nauka Programowania Dla Początkujących Turbo Pascal

Turbo Pascal?
Kup jakąś aktualną książkę, a w każdym razie używaj Free Pascala.

0
writeln('Pole kwadratu wonosi: ', pole: 0: 0)

Dla wartości z1 = 15, wyświetli 225.

writeln('Pole kwadratu wonosi: ', pole: 0: 2)

Dla wartości z1 = 15, wyświetli 225.00.

writeln('Pole kwadratu wonosi: ', pole)

Dla wartości z1 = 15, wyświetli 2.25000000000000E+0002.

wzór:
liczba_rzeczywista : liczba_cyfr_ogółem : liczba_cyfr_po_przecinku

Poza tym możesz użyć różnych funkcji typu: Round(), Trunc(), Int(), Frac(). O ile są one w TP.

Precyzja zmiennych (liczba cyfr znaczących):

Single:    7
Real:     15
Double:   15
Extended: 19
0
Szarp napisał(a)
writeln('Pole kwadratu wonosi: ', pole: 0: 0)

Dla wartości z1 = 15, wyświetli 225.

writeln('Pole kwadratu wonosi: ', pole: 0: 2)

Dla wartości z1 = 15, wyświetli 225.00.

writeln('Pole kwadratu wonosi: ', pole)

Dla wartości z1 = 15, wyświetli 2.25000000000000E+0002.

wzór:
liczba_rzeczywista : liczba_cyfr_ogółem : liczba_cyfr_po_przecinku

Poza tym możesz użyć różnych funkcji typu: Round(), Trunc(), Int(), Frac(). O ile są one w TP.

Precyzja zmiennych (liczba cyfr znaczących):

Single:    7
Real:     15
Double:   15
Extended: 19

pole: 0: 0 | pole: 0: 2 | pole
Co to daje ? Jakiś stosunek czy jak ? :)
Przepraszam, ale dopiero zaczynam przygodę z programowaniem, a Pascal nauczy mnie dobrych nawyków, i nie za bardzo to rozumiem, mogę prosić o wyjaśnienie ?? ; )

0

Nie, to nie stosunek, pamiętaj nie zawsze to co piszemy w języku programowania przekłada się na "logikę" czy to co uczymy się na matematyce itd. Pascal ma po prostu taką składnię. Przy typie real, możemy zapisać właśnie takie argumenty, które definiują "zachowanie" tego typu.

0
xeo545x39 napisał(a)

Nie, to nie stosunek, pamiętaj nie zawsze to co piszemy w języku programowania przekłada się na "logikę" czy to co uczymy się na matematyce itd. Pascal ma po prostu taką składnię. Przy typie real, możemy zapisać właśnie takie argumenty, które definiują "zachowanie" tego typu.

No dobrze ; )
To może tak: Co zmienia w programie " 0: 2" ?? Co powoduje. Bo jak tego nie dodam w kodzie, np. przy kwadracie, to pokazuje sam wynik, ale jak w trójkącie to tak jak było. ;)

1

To takie jakby zaokrąglanie. Lewa strona to liczby przed przecinkiem, a prawa strona to liczby po przecinku - np. 0: 2 - 0 nie zmienia niczego, więc całości będą bez zmian, a 2 oznacza, że będą 2 liczby po przecinku, reszta zostanie usunięta.

liczba = 255,55555
liczba 0: 2 to bedzie 255,55

0
qeeepek napisał(a)

To takie jakby zaokrąglanie. Lewa strona to liczby przed przecinkiem, a prawa strona to liczby po przecinku - np. 0: 2 - 0 nie zmienia niczego, więc całości będą bez zmian, a 2 oznacza, że będą 2 liczby po przecinku, reszta zostanie usunięta.

liczba = 255,55555
liczba 0: 2 to bedzie 255,55

Dziękuje bardzo ;) W książce tego nie było. Aplikacja działa jak powinna ;)
Nawet kod napisałem ; D Trapez źle zapisałem.... hehe ^^ Ale grunt, że wiem o co chodzi ;)
Jeszcze raz dzięki.

1
kostisx napisał(a)

1.50000000+E00 (powinno wyjść w wyniku TYLKO 15.)
A więc, po co te zera i "E" i dlaczego kropka "nie przesuwa" się ?
Czy mogę jakoś zmodyfikować kod, aby było, tak jak być powinno ? : ))

No właśnie. Program napisany w Pascalu domyślnie przedstawia liczby rzeczywiste jako liczby zmiennoprzecinkowe zapisane w notacji naukowej. Link do Wikipedii: http://pl.wikipedia.org/wiki/Notacja_naukowa Jednak autorowi nie podoba się taki zapis i wolałby, aby liczby rzeczywiste były przedstawiane w formacie stałoprzecinkowym, czyli "aby było tak, jak być powinno". Oczywiście jest na to rada, o czym pisali już poprzednicy, ale...
... zacznijmy od początku.

Procedury standardowe Writeln i Write służą do wyprowadzania wyników na ekran (ale też np. na drukarkę). Można te procedury zapisać w jednej z poniższych postaci:

Writeln(Wyrażenie)
Writeln(Wyrażenie:Długość)
Writeln(Wyrażenie:Długość:MiejscaDziesiętne)

Cytat z dobrej książki do Pascala, w której to było ;)

Wyrażenie powinno być typu znakowego (Char), całkowitego (Byte, ShortInt, Integer, Word, LongInt), rzeczywistego (Real, Comp, Single, Double, Extended), łańcuchowego (string) lub łańcuchowego spakowanego (array of Char). W szczególnym przypadku wyrażenie może być literałem lub zmienną.

Parametr Długość określa minimalną długość pola wyjściowego i powinien być wyrażeniem typu całkowitego o wartości większej od zera. Jeżeli do wyprowadzenia wyrażenia wyjściowego potrzeba większego pola niż to określa parametr Długość, to wyprowadzana jest taka liczba znaków, jaka jest niezbędna do przedstawienia tego wyrażenia.

Parametr MiejscaDziesiętne określa liczbę miejsc dziesiętnych po kropce w stałoprzecinkowym przedstawieniu wartości typu rzeczywistego i może zostać podany tylko dla typów rzeczywistych i tylko w przypadku, gdy podany jest także parametr Długość.

Tekst tekstem, ale nie ma to jak dobry przykład:

{Liczby rzeczywiste}
Writeln(27/32);            // Wynik:□8.43750000000000E-0001
Writeln(27/32:4);          // Wynik:□8.4E-0001
Writeln(27/32:12);         // Wynik:□8.438E-0001
Writeln(27/32:30);         // Wynik:□□□□□8.43750000000000000E-0001
Writeln(27/32:3:3);        // Wynik:0.844
Writeln(27/32:5:5);        // Wynik:0.84375
Writeln(27/32:10:5);       // Wynik:□□□0.84375

{Można również łańcuchy!}
Writeln('Tekst');          // Wynik:Tekst
Writeln('Tekst':3);        // Wynik:Tekst
Writeln('Tekst':8);        // Wynik:□□□Tekst

Te kwadraciki □□□ oznaczają niewidoczny znak odstępu, czyli po prostu spację

PS. Pozwoliłem sobie napisać ten krótki tekst, bo po przeczytaniu całego wątku mam wrażenie, że nie do końca jest jasne co, jak i dlaczego. Może komuś się przyda.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.