C++ programozásban elakadtam. Kaphatok segítséget? (Emelt szintű érettségi szint)
A feladat azon része, amit nem tudok megoldani: bekértük egy leendő tört számlálóját, nevezőjét. Egyszerűsítenem kell a törtet, amely egyszerűsítés majdnem sikerült is, de nem működik teljesen. Mi lehet a hibám?
(beszúrom az eddigi programrészletemet).
Előre is köszi!
Ja és nem emelt érettségi előtt állok, fiatalabb vagyok és nekiálltam programozni csak úgy. Szóval legyetek szívesek ne írjatok olyanokat, hogy ezt se tudom és így akarok érettségizni, milyen béna vagyok.
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
float a,b,c;
cout<<"1. feladat Adja meg a tort szamlalojat!"<<endl;
cin>>a;
cout<<"1. feladat Adja meg a tort nevezojet!"<<endl;
cin>>b;
if(a=b){
c=a;
}else if(a>b){
c=b;
}else if(a<b){
c=a;
}
for(int i=2;i<=c/2;i++){
if(a/i==trunc(a/i) && b/i==trunc(b/i)){
a/=i;
b/=i;
i--;
}
}
cout<<a<<"/"<<b<<endl;
return 0;
}
A programodban ott a hiba, hogy az egyszerűsítés nem úgy működik, hogy leosztod minden számmal a legnagyobb feléig.
Hogy miért? Képzeld el, hogy a két számod a 4 és 8. Ennek a legnagyobb közös osztója 4. Az algoritmusod először leossza őket 2-vel. az eredmény 2,4. Innentől kezdve már 2-vel soha többet nem fogja leosztani, pedig pont erre lenne szükség ( hiszen lnko=4, ami 2*2).
Már kitalálták előtted a lnko algoritmust ~2300 évvel ezelőtt.
Két opciód van:
1) Mivel maga az algoritmus nem bonyolult, magadtól is rájöhetsz a megoldásra (én pl szeretem az ilyen kihívásokat)
2) megnézed, hogy Euklidesz hogyan is csinálta: [link]
Köszönöm a válaszokat!
Még azt nem értem kedves egyes hogy mi a baj azon részével, hogy ha mint mondtad, egyszerűsíti pl. 2-vel. akkor csökkenti is az i-t amit majd a for ciklus megnöveli tehát 2-1+1=2 marad a 2 és azzal osztja újra.
Az algoritmusod nagyjából jó, csak az a=b helyett a==b kéne és ott egyből ki is írhatnád, hogy 1.
A nem igazán elegáns része az a/i==trunc(a/i) rész, ahol két float (double) értéket hasonlítasz össze, amit nem igazán szeretünk, mert a tizedesvessző után megjelenhetnek pontatlanságok, ami miatt azt hinné a gép, hogy a két szám nem egyenlő (pedig elméletben annak kellene lennie). Ehelyett érdemes valahogy a maradékos osztással játszani és a maradékokat nézni, mert ott már cska egész számok vannak.
A programodnak csak egy részének a hibájára hívtam fel a figyelmedet.
A többi hiba javítása is szükséges. Pl. az egyenlőségvizsgálat az "==" operátor, nem a "=".
Másrészt az osztás eredménye egész szám, ha mindkét operandusa egész. így a a/b == trunc(a/b) mindig igaz lesz.
Harmadrészt ilyen módon változtatni a forciklusodban a ciklusváltozót nem épp jó tervezésre utal. (látod: én is átsiklottam felette.)
Használj függvényeket, ne mindent a main-be rakj bele. Később ha oop-t is tanulsz, könnyebb lesz átszokni, hogy darabold szét a kódot.
Stb...
Nahát. Itt abba is hagyom. Ma nem megy ez nekem. Azt sem vettem észre, hogy nem int, hanem float a változód.
(Mentségemre legyen, ha racionális számot kezelsz, gondoltam a számlálóra és nevezőre egész típust használsz.)
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, 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!