Anmelden

Archiv verlassen und diese Seite im Standarddesign anzeigen : [C++] Problem mit do-while-Schleife



TomberryX
30.06.2005, 19:47
ich habe dieser kleine do-while-schleife hier die einfach nicht wiederholt wird. es soll geprüft werden ob phi und e teilerfremd sind und das macht er irgendwie nicht. bestimmt irgendein kleiner fehler den ich übersehe und gama auch(von ihm kommt auch der threadtitel)



do
{
cout<<"zu "<<phi<<" teilerfremde zahl eingeben"<<endl;
cin>>e;
if(phi>e)
{
for(int a=e;a<1;a--)
{
if(phi%a==0)
{
if(e%a==0)
z=false;
}
}
}
else
{
for(int a=phi;a<1;a--)
{
if(phi%a==0)
{
if(e%a==0)
z=false;
}
}
}
}
while(z!=true);

Latency
30.06.2005, 19:55
Ich verstehe den Algorythmus zwar nicht komplett, aber wenn ich davon ausgehe, dass du positive Integer Werte eingeben wirst, so werden deine For-Schleifen nie durchlaufen, da die Bedingung (a < 1) nicht erfüllt wird. Das bedeuted ebenfalls, dass z nie auf false gesetzt wird und die Schleife abgebrochen wird.

edit:
Es muss fast daran liegen, denn wenn du negative Int Werte eintippst werden sich deine For-Schleifen aufhängen. Deswegen versuche mal a > 1 als Abbruchbedinung der For-Schleifen.

Dingsi
30.06.2005, 19:55
Wie ist e deklariert, wie ist phi deklariert, wie ist z deklariert?

edit:
Ja, stimmt. Irgendwie ist a<1;a-- unsinnig. 0o

TomberryX
30.06.2005, 20:01
hab jetzt a>1 gemacht und nun bricht er bei teilerfremdheit nicht mehr ab. (was er ja soll)
e is ne eingabe, z is auf true gesetzt und phi ist ein positives produkt

Dingsi
30.06.2005, 20:03
hab jetzt a>1 gemacht und nun bricht er bei teilerfremdheit nicht mehr ab. (was er ja soll)
e is ne eingabe, z is auf true gesetzt und phi ist ein positives produktIch mein die Deklaration im Programm, also int e; oder bool z = false; oder sowas. :)

TomberryX
30.06.2005, 20:04
Ich mein die Deklaration im Programm, also int e; oder bool z = false; oder sowas. :)
upsa >_> *begriffe gern mal vertauscht*
int e,phi;
bool z=true;

Ineluki
30.06.2005, 21:33
Also meinem Verstaendnis nach ist
for(int a=e;a<1;a--)
absolut korrekt und auch sinvoll
Die Zahl A vird auf e gesetzt, und dann solange in einerschritten verkleinert, bis sie 0 erreicht. Ums in Pascal auszudruecken: for i:=e downto 1 do ...

Euer Fehler ist, dass es immer eine Zahl a gibt, die mit beiden Zahlen Mod a == 0 ergibt, naemlich a==1 ...

Q % 1 == 0 <- diese Aussage ist immer Wahr, wodurch euer z zwangsweise zu false wird, und euere Schleife beendet.

PS: printf ist der beste debugger, gebraucht hab ich ihn aber nicht ^^

TomberryX
01.07.2005, 12:14
hatte heut früh nenn geistesblitz durch den die schleife funktioniert.

hab das z=true in die schleife gesetzt wodurch er nicht mehr das problem hat dass nach fehlerhafter eingabe z auf false bleibt sobald die schleife wieder an den anfang geht.
*sich bei allen bedankt die hilfe anboten*

und ineluki, in der falschen variante die du kopiert hast geht er erst garnicht in die schleife rein da e>1 ist und er die schleife solange wiederholt wie a<1 was ja nicht gegeben ist. wenn man dann a>1 als wiederholungskriterium nimmt wird a zwar am ende 1,aber die er geht dann aus der schleife raus. *mal sagen musste*