Kezdőoldal » Számítástechnika » Programozás » Free Pascalban egy háromszög...

Free Pascalban egy háromszög típusának megállapítása?

Figyelt kérdés

Sziasztok!

Egy viszonylag egyszerű programról lenne szó,

megállapítani, hogy megszerkeszthető e a háromszög, ha igen akkor milyen, deréksz.,szabályos...


Szóval ott lenne a gond, hogy addig elindul a program és jól is megy, amég megvizsgálom, hogy megszerkeszthető -e , ha igen akkor pitagorasz-t segítségével megállapítom, hogy derékszögű -e ÉS azután szeretném vizsgálni a többi lehetőséget, hogy szabályos -e vagy egyszerű és itt lép fel a hiba. Lehet nem vagyok tisztában az ELSE használatával, mivel eddig csak egy feltételben 1x használtam mindig, szerintem ez a hiba, de valahogy nemtudok rájönni. Kezdő programozó vagyok. A segítségért előre is köszönet!



2018. jan. 20. 20:00
1 2
 11/12 tabaki ***** válasza:
100%

Na, végre a megszokott gépemen vagyok, így már kényelmesebb a matatás, mint online... Amit a neten találtál, az úgy is van, de ez még valamelyik régebbi hibaüzenet lehetett, talán az ELSE után IF nélkül próbálkoztál egy újabb ELSE megadásával -- de az itt közölt kódodban már nincs efféle. Ennek megfelelően az egyetlen problémás sornál...

if a=b=c then writeln('A háromszög szabályos')

...egy másik hibaüzenet jelenik meg:

Error: Incompatible types: got "Boolean" expected "Int64"

Vagyis adattípus-eltérés a probléma, a várt egész szám helyett booleant kapott, ahogyan tegnap gondoltam.


A Boole-algebráról itt olvashatsz bővebben:

[link]

Lehet, hogy most még egy kukkot sem értesz belőle, de sok hasznos dologra lehet alkalmas a későbbiekben. Fontosabb azonban, hogy -- bár erre valószínűleg nem figyeltél fel -- egy kis részét már most is használod, nem éppen jelentéktelen szerepkörben. Elgondolkodtál-e azon, hogy tulajdonképpen micsoda például az IF számára megadott feltétel? Ha mondjuk azt írod, hogy IF A = B, akkor az A és B összehasonlítása egy művelet elvégzését jelenti, hasonlóan az A + B kifejezéshez. Míg azonban a két érték összeadása egyszerűen egy újabb számértéket eredményez, az összehasonlítás láthatólag valami egészen más természetű dolgot. Ez a „más” egy logikai IGAZ (true) vagy HAMIS (false) érték, a feltételben foglalt kifejezés igazságtartalmától függően. Tehát például A := 5 és B := 5 esetén az A = B művelet értéke igaz, viszont A := 3 és B := 4 esetén hamis. Természetesen bármely két tetszőlegesen választott szám ennek a két értéknek valamelyikét eredményezi, attól függően, hogy egyenlők-e -- hasonló a helyzet az egyéb feltételvizsgálatokkal is, pl. A > B vagy bigyo <= valami szintén igaz vagy hamis értéket jelentenek.

A feltételvizsgálatok eredménye általában nem kerül a szemed elé, de adódhat olyan eset, amikor szükséges lehet a tárolása. Erre a pascal külön adattípust biztosít, amely kizárólag ezt a két értéket tárolhatja, ez a boolean típus. Hogy ez ténylegesen hogyan valósul meg, az közömbös, lényeg, hogy a pascal (némely egyéb nyelvtől eltérően) szigorúan megkülönbözteti más adattípusoktól. Emiatt -- legalábbis közvetlenül -- nem tudsz műveleteket végezni egy boolean és egy eltérő típusú változó között, például egy feltételvizsgálat eredményét hozzáadni egy egész számhoz.

Nézzük a te IF A = B = C feltételvizsgálatodat. A változók integer típusúak, az egyszerűség kedvéért legyen mindegyiknek az értéke mondjuk 5. A műveletek jobbról balra hajtódnak végre. Az első (vagyis a B = C): 5 = 5, ez rendben is van, a kapott érték IGAZ -- ezt nem tároljuk névvel ellátott változóban, de a program egy névtelen, boolean típusúként számon tartott belső tárolóban megjegyzi. Most jönne a következő vizsgálat, az A összehasonlítása ezzel az értékkel, de ennek se füle, se farka: 5 = IGAZ. Ha ezt a fordító hajlandó lenne elfogadni, azzal garantálná a hibás működést, ezért leáll.

Az általam javasolt megoldásban azonos típusokat használ a program. Mind az A = B, mind a B = C művelet logikai (esetünkben IGAZ) eredményt ad, tehát nincs akadálya a köztük végzett műveletnek (ez a logikai ÉS (vagyis az AND), amely két IGAZ értékre IGAZ, minden másra HAMIS eredményt szolgáltat). Ilyen szimpla esetben még érdemes a feltételt magyarul is megfogalmazni, akkor jobban megérthető, hogy voltaképpen pofonegyszerű dologról van szó. Tehát

if (a = b) and (b = c) then WriteLn('A haromszog egyenlo oldalu')

jelentése a következő:

Ha (igaz, hogy a = b) és (igaz, hogy b = c), akkor írd ki, hogy 'A háromszög egyenlő oldalú'.


Megjegyzés: A zárójelezés a műveletek sorrendje miatt fontos, alapesetben ugyanis az AND előbbrevaló.

2018. jan. 21. 22:09
Hasznos számodra ez a válasz?
 12/12 A kérdező kommentje:
Köszi szépen a részletes magyarázatot!:)
2018. jan. 31. 20:40
1 2

Kapcsolódó kérdések:




Minden jog fenntartva © 2025, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!