Zum Inhalt springen

Problem mit IF Anweisung in eine for Schleife


Empfohlene Beiträge

Geschrieben

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

Geschrieben

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.

Geschrieben
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.
Geschrieben

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.

Geschrieben
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.

Geschrieben

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.

Geschrieben

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.

Geschrieben
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.

Geschrieben (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 von lit-web
Geschrieben
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.

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...