Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

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

  • Autor

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.

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.
  • Autor

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.

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.

  • Autor

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.

  • Autor

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.

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.

  • Autor

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

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.

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.