nur 4stellige Integer Zahl zwischen 1 und 6 zulassen, wie?



  • c++ problemchen...

    hi , ich hab folgende kleinigkeit und weiss grad net auf die schnelle wie ich das hinbekomm.

    ich möchte eine 4 stellige Zahl als benutzereingabe einlesen, allerdings darf
    derjenige nur die zahlen von 1-6 verwenden, keine 0.. und es MUSS 4stellig sein.
    d.h.
    erlaubt 1356..1111. 6666

    nicht erlaubt
    1722 oder 7222 oder 0133 oder -1117

    könnt ein cleverer mir auf die schnelle eine kleine funktion bzw. schleife basteln 😉

    danke im Voraus 😃



  • Hallo

    Du hast doch schon die Bedingungen, dann wirst wohl noch eine entsprechende Abfrage hinkriegen (immer schön Schritt für Schritt).

    chrische



  • Lies die Zahl als String ein und prüf dann jede Stelle einzeln.



  • char *p;
    
    int Wert=1234;
    
    itoa(p);
    
    for(int i=0; i< 4; i++){
      if(atoi(p[i]) < 0 && atoi(p[i]) > 6)
         //Fehler
    }
    


  • BorisDieKlinge schrieb:

    char *p;
    
    int Wert=1234;
    
    itoa(p);
    
    for(int i=0; i< 4; i++)
      if(itoa(p[i]) < 0 && itoa(p[i]) > 6)
         //Fehler
    

    Das wird nicht klappen ... mit atoi() wohl eher. 😉
    Aber wofür brauchst Du "Wert" ?

    EDIT: Aha, den ersten Fehler hast Du schon bemerkt. ...

    Gruß,

    Simon2.



  • Nix für ungut Boris, aber was soll uns das sagen?

    BorisDieKlinge schrieb:

    char *p;
    
    int Wert=1234;
    
    itoa(p); // Aha... Das Ergebnis wird ignoriert? Oder wolltest Du damit die Funktion itoa nur vorstellen?
    
    for(int i=0; i< 4; i++)
      if(itoa(p[i]) < 0 && itoa(p[i]) > 6) // atoi (welches Du vermutlich meintest) arbeitet nicht auf Zeichen, sondern auf C-Strings.
         //Fehler
    

    Also wenn Du schon ein Stück Quellcode ohne jegliche Erläuterung ablegst, dann doch bitte wenigstens funktionsfähig. 😉



  • Wenn du die Eingabe von falschen Zahlen überhaupt verhindern möchtest hast du mit Standard C++ ein Problem. Dann bitte darum ins Konsolenforum verschoben zu werden.

    Wenn du es erst im Programm prüfen möchtest ist der String-Weg der Richtige.

    MfG SideWinder



  • int zahl1 = 1111; //Ginge auch
    int zahl2 = 6666; //ohne die beiden
    
    cin >> zahl3; //Benutzer gibt zahl ein
    if(zahl3 <= zahl2 && zahl3 >= zahl1) 
    {
        zahl4 = zahl3; //die zahl mit der du weiterarbeitest
    }
    else {cerr << "Fehler bei der Eingabe"}
    

    ^= stimmt doch nicht aber mit einem array und gaaaaaaaaaaaaaaaanz vielen ifs würde es gehen:

    if(a[0] ==1 && a[1] == 1 && a[2] == 1 && a[3] ==1) {
     b =1111;
    }
    

    ist aber viel tippaufwand und trägt nicht grad zu nemm schnellen prog bei



  • std::string eingabe;
    std::cin >> eingabe;
    
    if (eingabe.length() != 4)
    {
      std::cout << "Error. Laenge ungleich 4." << std::endl;
      // Abbrechen lassen
    }
    
    // Okay, Länge ist also gleich 4. Weitermachen.
    for (int i = 0; i < 4; i++)
    {
      if (eingabe[i] < '1' || eingabe[i] > '6')
      {
        std::cout << "Error. Falsches Zeichen '" << eingabe[i] << "' an Stelle " << i << " gefunden." << std::endl;
        // Abbrechen.
      }
    }
    


  • nein ein array darf ich leider net verwenden es muss ein integer sein
    die funktion atoi() geht leider auch net hab ich schon probiert 😞

    char    *str = NULL;
        int     computerNumber = 0;
    
        // An example of the atoi function.
        cin>>str;
        computerNumber = atoi( str );
    

    runtime fehler mit folgender ausgabe
    Expression : invalid null pointer
    und falls ich nicht initialisiere wisst ja schon was passiert , ebenfalls runtimefehler!!.
    hmm ich überlege grad ,der integer muss ja die Zahlen basis 6 sein allerdings ohne die 0 ... oh mann das iss sau kompliziert.. falls ihr noch nee idee habt.



  • Verwende statt deines C-Strings dem du keinen Speicher zugwiesen hast doch lieber std::string - kümmert sich dann nämlich selbständig um Speicher 😉

    #include <sstream>
    #include <string>
    using namespace std;
    
    ...
    
    bool str_is_ok (const string& str);
    
    ...
    
    do
    {
        string myStr;
        getline(cin, myStr);
    }
    while( !str_is_ok(myStr) );
    
    stringstream converter;
    converter << myStr;
    int number;
    converter >> number;
    
    ...
    
    bool str_is_ok (const string& str)
    {
        if(str.length() != 4) return false;
    
        for(int i = 0; i < 4; ++i)
           if(str[i] < '0' || str[i] > '6')
               return false;
    
        return true;
    }
    

    MfG SideWinder



  • Ja, das wäre eine Idee, aber vermutlich noch komplizierter (die eingebauten IO-Streams verstehen nur Basis 8, 10 und 16). Also entweder du denkst über die Lösung von "gsdrhgreh" nach oder du liest das als Zahl ein und zerlegst es hinterher in seine Ziffern (dazu gab's hier auch kürzlich einen Thread).

    PS: Daß das Programm abstürtzt, wenn du nach NULL schreiben willst, ist nicht wirklich überraschend 😉 Du solltest doch zumindest genug Speicher anfordern, wo die Eingabe hingeschrieben werden könnte.



  • ähm? imho wäre das alles einfacher, wenn man nur mit zahlen arbeiten würde, statt strings hinundherzuschieben und partiell in ziffer umzuwandeln usw...

    ⚠ korrigiert

    bool gueltigkeitPruefen(int i){
    int ziffer;
    
     if(i<1111 || i>6666){ 
      return false; 
     }else{ 
      for(int divisor=1000; divisor>0; divisor/=10){ 
       ziffer=i/divisor;
       i-=ziffer*divisor;
       if(ziffer<1 || ziffer>6){ return false;} 
      } 
      return true; 
     } 
    }
    

    hab nicht getestet, sollte imho gehn 🤡

    edit: CStoll war mit dem vorschlag natürlich schneller... oder kam die idee schon früher hier irgendwo, und ich hab die übersehen? 😃

    edit2: w8 ein moment mal, das ist müll, sry ⚠

    edit3: habs korrigiert, funzt jez, sry 🙄



  • ok ok 🙂 die zeilen

    itoa(p);
    

    mit

    char p[5];
    itoa (Wert,p,10);
    

    ersetzen..

    wohl zu schnell hingerotzt *fg*



  • sten schrieb:

    ich möchte eine 4 stellige Zahl als benutzereingabe einlesen, allerdings darf
    derjenige nur die zahlen von 1-6 verwenden, keine 0.. und es MUSS 4stellig sein.

    In Standard-C++ gibt es die Möglichkeit für jede Klasse oder Struktur eine eigene Eingabe-Funktion zu schreiben. Dadrin kann man dann machen was man will. Das sähe etwa so aus:

    #include <iostream>
    #include <streambuf>
    
    struct Zahl4
    {
        Zahl4() : m_value(0) {}
    
        int get() const { return m_value; }
    
        friend std::istream& operator>>( std::istream& in, Zahl4& z )
        {
            std::istream::sentry ok( in );
            if( ok )
            {
                typedef std::istream::traits_type traits_type;
                int zahl = 0;
                int cnt = 0;
                for( std::istream::int_type m
                    ; !traits_type::eq_int_type( m = in.rdbuf()->sgetc(), traits_type::eof() )
                    ; in.rdbuf()->sbumpc(), ++cnt )
                {
                    const char c = traits_type::to_char_type( m );
                    if( c < '1' || c > '6' )    // nur Ziffern von 1 bis 6 verwenden
                        break;
                    (zahl *= 10) += c - '0';
                }
                if( cnt == 4 ) // und es MUSS 4stellig sein
                {
                    z.m_value = zahl;
                }
                else
                {
                    in.setstate( std::ios_base::failbit );
                }
            }
            return in;
        }
    private:
        int m_value;
    };
    
    int main()
    {
        using namespace std;
        for( int n = 0; n < 5; ++n, cin.clear(), cin.ignore( 999, '\n' ) )
        {
            cout << "Eingabe > ";
            Zahl4 z;
            if( cin >> z )
            {
                cout << "Gelesen: " << z.get() << endl;
            }
            else
                cerr << "Fehler " << endl;
        }
        return 0;
    }
    

    Gruß
    Werner



  • thx @ all,
    ichhabs hinbekommen 🙂



  • Sorry nur eine Seite gelesen.


Anmelden zum Antworten