Free Pascalban egy háromszög típusának megállapítása?
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!





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:
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ó.
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
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!