lit-web Geschrieben 11. April 2010 Geschrieben 11. April 2010 Hallo Leute und einen schönen Sonntag euch allen wünsch. Ich habe grad ein Problem was ich überhaupt nicht nachvollziehen kann. Hier erst mal schnell der Code und dann die Beschreibung und Problemstellung. #include <iostream> using namespace std; class Prim{ private: int *anfZahl; //anfang zahlenbereich int *endZahl; //ende zahlenbereich int test1; public: void PrimZahlErrechnen(int *anfZahl, int *endZahl){ for(int i = *anfZahl; i <= *endZahl; i++){ test1 = (i * 2); if(i != test1){ //nur zahlen ausgeben die undgleich test1 sind cout<<i<<endl; } //testausgabe des multiplikationsergebnisses i * 2 //cout<<endl<<test1<<endl; } } }; int main(){ int zahlAnf, zahlEnd; Prim primzahlen; cout<< "Bitte erste Zahl eingeben: "; cin>> zahlAnf; cout<< "\n\nBitte zweite Zahl eingeben: "; cin>> zahlEnd; primzahlen.PrimZahlErrechnen(&zahlAnf, &zahlEnd); return 0; } Mein Ziel ich will einen kleinen Primzahlrechner programmieren zur Übung. So nun gebe ich einen Zahlenbereich von bis ein, in dem Zahlenbereich sollen mir dann erst mal nur die Zahlen ausgegeben werden die nicht in dem Ergebnis test1 drin stehen, test1 enthält die Multiplikations von i * 2. Ich habe mir extra mal eine testausgabe mit in der Schleife gemacht, also es wird auf alle Flääe gerechnet. So nun sage ich in der IF Bedingung doch ganz klar, gib nur Zahlen aus die ungleich dem Ergebnis test1 sind, das heist bei einem Zahlenbereich von 1 bis 10 dürften die Zahlen 2, 4, 6 und 8 nicht mit ausgegeben werden, dass Problem sie werden ausgegeben. Ich weis zu einem Primzahlenrechner gehört mehr, dass kommt noch, aber warum wird die Bedingung im IF nicht richtig ausgeführt? Danke für eure Hilfe mfg lit-web Zitieren
robotto7831a Geschrieben 11. April 2010 Geschrieben 11. April 2010 Hallo, bei diesem Code ist die Bedingung i != test1 immer erfüllt und somit werden alle Werte ausgegeben. Frank Zitieren
lit-web Geschrieben 11. April 2010 Autor Geschrieben 11. April 2010 Naja aber eigentlich nicht, denn wenn i im Schleifendurchlauf den Wert 4 hat und test1 auch 4 ist, dann soll die Zahl 4 Beispielsweise nicht angezeigt werden. Also ist die Bedingung doch eigentlich nicht immer wahr. Denn mindestens die Zahlen 1 und 3 müssten doch da ausgegeben werden. Zitieren
robotto7831a Geschrieben 11. April 2010 Geschrieben 11. April 2010 Wenn i = 4 ist, dann ist test1 = 8. Frank Zitieren
Klotzkopp Geschrieben 11. April 2010 Geschrieben 11. April 2010 Naja aber eigentlich nicht, denn wenn i im Schleifendurchlauf den Wert 4 hat und test1 auch 4 ist, dann soll die Zahl 4 Beispielsweise nicht angezeigt werden.i und test1 sind aber nie gleichzeitig 4. Bei dem Schleifendurchlauf, bei dem i 4 ist, setzt du test1 auf 8. 4 != 8 ist true. Du hast offenbar eine ganze Menge von Werten, die nicht ausgegeben werden sollen, dafür reicht aber nicht eine einzelne Variable, die diese Werte nacheinander annimmt. Zitieren
lit-web Geschrieben 11. April 2010 Autor Geschrieben 11. April 2010 Ja aber wenn i 2 ist dann ist i * 2 = 4 und das heist wieder, dass die Zahl 4 im Schleifendurchlauf nicht angezeigt werden darf. Entweder stelle ich mich da grad total blöd an oder ich weis es nicht. Zitieren
robotto7831a Geschrieben 11. April 2010 Geschrieben 11. April 2010 Dann ist deine Bedingung in der if-Selektion falsch. Frank Zitieren
Klotzkopp Geschrieben 11. April 2010 Geschrieben 11. April 2010 Ja aber wenn i 2 ist dann ist i * 2 = 4 und das heist wieder, dass die Zahl 4 im Schleifendurchlauf nicht angezeigt werden darf.Der Vergleich i != test1 vergleicht nicht i mit jedem Wert, den test1 irgendwann mal hatte oder haben wird. Er vergleicht den aktuellen Wert von i mit dem aktuellen Wert von test1. Und wenn i 4 ist, ist test1 8. Mit genau diesen Werten findet der Vergleich statt, nicht mit irgendwelchen Werten von früher. Dass test1 irgendwann vorher mal 4 war, ist an dieser Stelle komplett egal. Zitieren
lit-web Geschrieben 11. April 2010 Autor Geschrieben 11. April 2010 Ja ok das leuchtet mir ein, da habe ich denke ich einen gewaltigen Denkfehler. Ich werde mir da nochmal Gedanken machen und mich dann noch mal melden. Momentan weis ich zwar noch nicht recht wie ich es mache, aber mal sehen. Zitieren
flashpixx Geschrieben 11. April 2010 Geschrieben 11. April 2010 wenn ich den Code richtig verstehe, dann müsste es dieser Algorithmus sein Sieb des Eratosthenes ? Wikipedia Zitieren
lit-web Geschrieben 11. April 2010 Autor Geschrieben 11. April 2010 Ich habe nun eine kleine Teillösung. Ich habe es nun mittlerweile soweit das ich alle Nichtprimzahlen ermitteln konnte aus einem Zahlenbereich und die stehen in dem Vector drin. Ein Testdurchlauf des Vectors bestätigt mir das dies auch klappt. So nun habe ich aber ein Problem, ich will nun immer noch in einer Schleife den Zahlenbereich von 1 -10 durchlaufen und dabei eben vergleichen ob nun ein Wert aus dem Schleifendurchlauf in dem Vector steht und es sollen nur Werte ausgegeben werden die nicht in dem Vector drin stehen. Ich habe nun auch schon gesucht, aber wie kann ich das anstellen? Mein Versuch void PrimAusgabe(int *anfZahl, int *endZahl){ for(int j = *anfZahl; j <= *endZahl; j++){ if(j != keinePrims[j]){ cout<<j<<endl; } } } keinePrims ist der Vector in dem alle Nichtprimzahlen des eingegeben Zahlenbereiches drin stehen. Der hat auch alle korrekten Werte. Das klappt so aber gar nicht, es werden wieder alle Zahlen des Schleifendurchlaufes ausgegeben. Zitieren
Klotzkopp Geschrieben 11. April 2010 Geschrieben 11. April 2010 Das klappt so aber gar nicht, es werden wieder alle Zahlen des Schleifendurchlaufes ausgegeben.Und wieder aus demselben Grund. Es reicht nicht, die zu prüfende Zahl mit nur einem einzigen Element des Vectors zu vergleichen. Stell dir vor, du hast eine Liste von Namen, und willst prüfen, ob diese Leute in deiner Stadt wohnen. Wenn du so vorgehen würdest, wie dein Programm, dann würdest du den ersten Namen auf der Liste mit dem ersten (und nur dem ersten) Telefonbucheintrag vergleichen. Und wenn die nicht gleich sind, würdest du daraus schlussfolgern, dass diese Person nicht in deiner Stadt wohnt. Dann vergleichst du den zweiten Namen auf der Liste mit dem zweiten Telefonbucheintrag usw. Ich hoffe, so wird klar, warum das nicht funktionieren kann. Du musst in jedem Schleifendurchlauf j mit jedem Element des Vectors vergleichen. Ein set wäre übrigens hier besser als ein vector. Erstens werden Duplikate ausgeschlossen, und zweitens sind Suchvorgänge effizienter durchführbar. Zitieren
lit-web Geschrieben 11. April 2010 Autor Geschrieben 11. April 2010 (bearbeitet) Bitte entschuldige die Frage, aber was ist ein set? Ein Link zum nachlesen reicht mir da schon aus. Ich bin noch nicht wirklich lang in C++ unterwegs. Das einzige was ich mir so aber noch vorstellen kann, wäre eine 2 verschachtelte for Schleife wo ich den Vector durchlaufe und dann da drin den Vergleich mit den Werten mache. Bearbeitet 11. April 2010 von lit-web Zitieren
Klotzkopp Geschrieben 11. April 2010 Geschrieben 11. April 2010 Bitte entschuldige die Frage, aber was ist ein set? Ein Link zum nachlesen reicht mir da schon aus. Ich bin noch nicht wirklich lang in C++ unterwegs.C++ Sets [C++ Reference] Ein set ist ein Container der Standardbibliothek, wie vector. Ein set zeichnet sich dadurch aus, dass eingefügte Elemente automatisch sortiert werden. Dadurch werden Duplikate verhindert, und man kann sehr schnell darin suchen (Stichwort Binäre Suche). // Ein set von ints anlegen set<int> s; // Etwas einfügen s.insert(5) // Etwas suchen if( s.find(6) == s.end() ) { // 6 ist nicht drin }[/code] Das einzige was ich mir so aber noch vorstellen kann, wäre eine 2 verschachtelte for Schleife wo ich den Vector durchlaufe und dann da drin den Vergleich mit den Werten mache.Das wäre eine Lösungsmöglichkeit. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.