Böse Sieben



  • Hi,

    also ich kenne das Spiel nicht, aber dein Ansatz ist doch schon ganz gut.

    #include <iostream>
    #include <sstream>
    
    int main ( void )
    {
    	for ( int i = 1; i < 101; i++ )		// Wir fangen von 1 an, denn 0 brauchst du sicher nicht, oder? Ansonsten ändern!
    	{
    		std::ostringstream MyStream;
    		MyStream << i;
    		if ( ( i % 7 != 0 ) && ( MyStream.str().find( "7" ) == std::string::npos ) ) // find liefert std::string::npos, wenn der Wert nicht enthalten ist!
    			std::cout << i << std::endl;
    	}
    
    	return 0;
    }
    

    Ich hoffe das hilft dir 🙂 Kenne das Spiel wie gesagt nicht

    Gruß

    Edit: Hab was falsch verstanden. Habe Code geändert. Hatte gedacht du willst alle Zahlen die durch 7 teilbar sind 😃 Kommentar geändert. Ich sollte mal eine Pause machen 🤡



  • Das Spiel haben wir früher immer im Physikunterricht in der Klasse gespielt 😃



  • Hmm, c++ ist echt seltsam... oder für Frauen einfach nur unlogisch.
    @ Dummie: Habe das jetzt einfach mal reinkopiert.
    Zuerst hat er mir 35 Fehler angezeigt und nachdem ich das Programm nochmal neu geöffnet hatte war es nur noch einer:
    error C1010: Unerwartetes Dateiende während der Suche nach dem vorkompilierten Header. Haben Sie möglicherweise vergessen, im Quellcode "#include "stdafx.h"" einzufügen?
    Dachte mir: "Hmm, keine Ahnung, probiers mal...". Aber natürlich ging es nicht 🕶 .



  • Ich glaube mich zu erinnern, dass es schonmal so einen Beitrag gab wo jemand ein ähnliches Problem hatte. Welchen Compiler benutzt du? Ich schätze mal Visual Studio.

    Erstelle ein neues Projekt, aber ein LEERES. Und dann fügst du eine neue Code-Datei ein und nennst diese am besten Main. Dort schreibst du dann diesen Code rein und es müsste funktionieren.

    Gruß

    Patrick

    Edit:

    Unter Visual Studio C++ 2005

    Datei -> Neu -> Projekt

    Konsolenanwendung auswählen. Projektname eingeben( Kannste dir aussuchen ).

    Auf "Weiter" drücken und bei "Zusätzliche Optionen" dann Leeres Projekt anclicken.

    Dann Projekt -> Neues Element hinzufügen

    C++-Date(.cpp) auswählen und wie gesagt Main nennen.

    Code dort einfügen.

    Strg + F5 drücken und es sollte dann klappen

    Viel Erfolg 🙂



  • Ja, wenn ich das mal wüsste, welchen Compiler ich benutze.
    Was ist Visual Studio, was ist ein Compiler?
    Ich benutze Visual C++ 2005 ExpEdition (falls du das wissen wolltest).
    Oh man, ich spür schon, wie ich mich hier unbeliebt mache.
    Aber bin auch erst seit drei Wochen dabei und ein Buch werde ich mir auch noch kaufen! 😉
    Erstmal Anweisungen befolgen und ganz lieben Dank dir!



  • Benutzername: schrieb:

    a%7 == 0 || a%10 == 7 || a/10 == 7

    so dürfte es doch schon ganz leicht mit einer if abfrage funktionieren



  • Ja, funzt perfekt, muss nur noch schauen, wo ich die Zählschleife platziere.



  • Öhm das von wegen stdafx ... das muss ein MS VC++ Compiler sein ... nur die haben so was drin 😉 Also ... es gibt ein Headerfile wo du alle inkludes reintust ... dadurch braucht das obj net immer kompiliert werden ... und musst die datei aber in jedem cpp file inkludieren ... d.h. mekert der weil du das nicht getan hast.



  • So, jetzt habe ich das mal mit der normalen if/else-Bedingung gemacht
    und jetzt sind zwei Probleme aufgetreten: Er gibt die 70er-Reihe noch unverändert aus und er gibt nach jeder veränderten Zahl die gleiche nochmal aus,
    obwohl if/else.

    #include "stdafx.h"
    #include <iostream>

    int _tmain(int argc, _TCHAR* argv[])
    {

    std::cout <<"Die boese Sieben wird mit diesem Programm simuliert."
    <<std::endl;

    for (int a=1; a<101; a++)
    {
    if (a%7 == 0 || a%10 == 7 || a/10 == 7)
    {
    std::cout << a+1 << std::endl;
    }
    else std::cout << a << "\n" ;
    }

    return 0;
    }

    Hm, okay, schon festgestellt warum das so ist mit der doppelten Ausgabe, aber ich habe keine Ahnung, wie ich das ändern kann. <- Problem gelöst, wow ging das schnell, nur das mit der 70er-Reihe steht noch aus.



  • Flugsie schrieb:

    So, jetzt habe ich das mal mit der normalen if/else-Bedingung gemacht
    und jetzt sind zwei Probleme aufgetreten: Er gibt die 70er-Reihe noch unverändert aus und er gibt nach jeder veränderten Zahl die gleiche nochmal aus,
    obwohl if/else.

    #include "stdafx.h"
    #include <iostream>

    int _tmain(int argc, _TCHAR* argv[])
    {

    std::cout <<"Die boese Sieben wird mit diesem Programm simuliert."
    <<std::endl;

    for (int a=1; a<101; a++)
    {
    if (a%7 == 0 || a%10 == 7 || a/10 == 7)
    {
    std::cout << a+1 << std::endl;
    }
    else std::cout << a << "\n" ;
    }

    return 0;
    }

    Hm, okay, schon festgestellt warum das so ist mit der doppelten Ausgabe, aber ich habe keine Ahnung, wie ich das ändern kann. <- Problem gelöst, wow ging das schnell, nur das mit der 70er-Reihe steht noch aus.

    Erstmal ein paar Tipps: Benutzt Code-Tags, bitte 🙂 Es gibt einen Button C/C++ der extra für C++ Code ist. Dann funktioniert auch die Einrückung, die du ja HOFFENTLICH benutzt.

    Benutzt doch einfach meinen Code? Dort kannst du auch ohne Probleme mehr als 100 Zahlen ausgeben (Siehe for ( int i = 1; i < 101; i++ ) ) ohne dir Sorgen machen zu müssen was umzuschreiben 😉

    #include "stdafx.h" 
    #include <iostream>
    #include <sstream>
    #include <tchar.h> // Mein Compiler brauch das... Deiner scheinbar nicht
    
    int _tmain( int argc, _TCHAR* argv[] ) 
    {
        for ( int i = 1; i < 101; i++ )
        {
            std::ostringstream MyStream;
            MyStream << i;
            if ( ( i % 7 != 0 ) && ( MyStream.str().find( "7" ) == std::string::npos ) )
                std::cout << i << std::endl;
    		else
    			std::cout << "Gehoert nicht dazu: " << i << std::endl;
        }
    
        return 0;
    }
    

    Der sollte bei dir so laufen hab ihn extra etwas umgeändert... Für dich 😃

    Gruß Patrick



  • Danke!!! Läuft perfekt. Super.
    Und da ich ja gerne dazulerne:
    Was bedeutet der Ausdruck? -> std::string::npos

    Schöne Grüße, Mareike



  • Flugsie schrieb:

    Danke!!! Läuft perfekt. Super.
    Und da ich ja gerne dazulerne:
    Was bedeutet der Ausdruck? -> std::string::npos

    Schöne Grüße, Mareike

    Hatte es auf der Seite davor schonmal geschrieben, aber jetzt nochmal:

    Edit:
    Ich schreib auch nurnoch Müll 😃

    Also nochmal:

    Wenn find() std::string::npos liefert ist der gesuchte Wert nicht enthalten.
    Wenn find() etwas anderes liefert ist das die Position wo es gefunden wurde.

    Zu der Frage, was ein Compiler ist:

    Der Compiler macht vereinfacht gesagt aus dem Code eine ausführbare Datei.

    Visual Studio ist eine IDE, also ein Programm was dich beim Programmieren unterstützt und z.B. bestimmte Begriffe farbig darstellt usw... Der Compiler ist in einer IDE normalerweise dabei.

    Gruß Patrick



  • Ups, ja, sorry, übersehen.
    Stand ja grasgrün dort. 😃
    Die zweite Erklärung war aber die bessere!!!
    cout <<" Gewissen mit dieser Aussage erleichtert."
    Gruß, Mareike



  • Dein problem mit der 70er Reihe UND der doppelten Ausgabe liegt uebrigens hier

    if (a%7 == 0 || a%10 == 7 || a/10 == 7) 
    { 
    std::cout << a+1 << std::endl; 
    }
    

    Wenn a eine der "verbotenen" Zahlen ist gib a+1 aus. Jetzt ist a 70, 70 ist verboten, also gibt er a+1=71 aus. Dann wird a 71, ist auch verboten,a lso gibt er a+1=72 aus. Usw, die ganze 70er Reihe auszer der 70 selbst.

    Doppelte Ausgabe: a ist 7. 7 ist verboten, also gibt er a+1=8 aus. a wird jetzt um 1 erhoeht, a ist 8. 8 ist nicht verboten, also wird a=8 ausgegeben. Und schon steht die 8 doppelt da.

    Funktionnieren tut es, indem du das cout da einfach weglaesst. Am besten so:

    #include <iostream> 
    
    int main()
    { 
    
    std::cout <<"Die boese Sieben wird mit diesem Programm simuliert." 
    <<std::endl; 
    
    for (int a=1; a<101; a++) 
    { 
        if (!(a%7 == 0 || a%10 == 7 || a/10 == 7)) //! bewirkt, dass es nur gemacht wird, wenn das Gegenteil von der Bedingung richtig ist 
            std::cout << a << "\n" ; 
    } 
    
    return 0; 
    }
    

Anmelden zum Antworten