char array in int Variable speichern.



  • Guten Tag,
    Vorab: Ich habe die Suchfunktion benutzt mir auch bei google etwaige Lösungen angeschaut. Nur leider bin ich aus diesen nicht wirklich schlau geworden. Ich bin auch im Bereich der C++ Programmierung noch ein Anfänger. Also habt bitte etwas nachsicht mit mir.

    Nun zu meinem Problem. Ich soll ein Programm schreiben, wo die Benutzereingabe überprüft wird. Es soll eine Zahl (bestehend aus 5 Ziffern) eingegeben werden, welche auf verschiedene Kriterien hin überprüft werden sollen. Eines davon besagt, dass die Zahl nicht durch 3,5 und 7 Teilbar sein darf.
    Nur habe ich diese 5 Ziffern in ein char Array gespeichert und kann so aber leider keine Berechnungen vornehmen, da im Array die Ziffern praktisch feld für feld abgespeichert sind und nicht als ganze Zahl.
    Nun weiß ich nicht so Recht, wie ich das Problem angehen soll.
    Hier mein bisheriger Code:

    #include <iostream>
    using namespace std;
    
    int main()
    {
    	//Variablendekleration//
    	char Zahl[5+1];
    	int Wert;
    	//Ende der Dekleration//
    
    	//Eingabe//
    	cout<<"Bitte geben Sie eine fuenfstellige Zahl ein. ";
    	cout<<"\n\n\n";
    	cout<<"Eingabe: ";
    	gets(Zahl);
    	cout<<"\n\n";
    	//Ende der Eingabe//
    
    	//1. Kriterium zur Überprüfung//
    
    	if(Zahl[0]==0 || Zahl[1]==0 || Zahl[2]==0 || Zahl[3]==0 || Zahl[4]==0)
    	{
    		cout<<"Falsche Eingabe! (Diese Zahl ist keine 5 stellige Zahl)";
    	}
    	//Ende des 1. Kriteriums//
    
    	//2. Kriterium zur Überprüfung//
    	Wert = static_cast<int>(Zahl[6]);
    
    	cout<<Wert;
    	//Hier wird immer was falsches ausgegegeben.//
    }
    

    Vielen Dank schonmal für jede Hilfe.

    Gruß Lukas93


  • Mod

    1.Einmal Zahl nach String und zurück
    2. Zu 1.: Du willst vermutlich lieber std::string als ein char-Array
    3. Benutz besser nicht gets. Benutze die Streams (cin). Das geht insbesondere gut, wenn du std::string benutzt.
    4. Mit Zeichen kannst du rechnen. Wenn du vom Zeichen '0' nochmal das Zeichen '0' abziehst, bekommst du das Zeichen mit dem Zahlenwert 0. Wenn du vom Zeichen '1' das Zeichen '0' abziehst, bekommst du das Zeichen mit dem Zahlenwert 1. Usw.
    5. '0' ist ein Zeichen, welches auf dem Monitor wie ein Kreis aussieht. 0 ist die Zahl Null.



  • SeppJ, vorerst vielen Dank für deine Antwort.
    Allerdings verstehe ich nicht, was du mir mit dem unter Punkt 4. beschriebenen genau sagen willst.
    Es wäre nett, wenn du das vielleicht durch einen kleinen Quellcode deutlich machen könntest.

    EDIT:
    Ich habe das jetzt mal mit einem String ausprobiert, allerdings bekomme ich schon nach der Eingabe der Ziffern eine Fehlermeldung und weiß nicht, woran es liegt.

    FM: Expression: string subscript put of range.

    #include <iostream>
    #include <string>
    using namespace std;
    
    int main()
    {
    	//Variablendekleration//
    	string Zahl;
    	//Ende der Dekleration//
    
    	//Eingabe//
    	cout<<"Bitte geben Sie eine fuenfstellige Zahl ein. ";
    	cout<<"\n\n\n";
    	cout<<"Eingabe: ";
    	cin>>Zahl;
    	cout<<"\n\n";
    	//Ende der Eingabe//
    
    	//1. Kriterium zur Überprüfung//
    
    	/*Wenn keine Eingabe in ein bestimmtes Feld vom Array vorgenommen wird,
    	erhält dieses Feld automatisch den Wert 0 und so kann man in dem Fall das
    	Array auf vollständigkeit überprüfen.*/
    	if(Zahl[0]==0 || Zahl[1]==0 || Zahl[2]==0 || Zahl[3]==0 || Zahl[4]==0)
    	{
    		cout<<"Falsche Eingabe! (Diese Zahl ist keine 5 stellige Zahl)";
    	}
    	//Ende des 1. Kriteriums//
    
    	//2. Kriterium zur Überprüfung//
    
    }
    

    Gruß Lukas93


  • Mod

    Ich sollte dich vielleicht noch da drauf aufmerksam machen, dass das Problem rein mathematisch gelöst werden kann, ohne die komplizierte und langwierige Umwandlung von Zahlen in Zeichenketten.

    #include <iostream>
    using namespace std;
    
    int main()
    {
      cout<<"Bitte geben Sie eine fuenfstellige Zahl ein. "
        "\n\n\n"
        "Eingabe: ";
      unsigned int wert;
      if (!(cin >> wert))  // So steht schon einmal fest, dass es auch tatsächlich 
                           //eine Zahl ist
        cout << "Das war keine Zahl!\n";
      else
        {
          // Prüfen, wieviele Stellen die Zahl hat
          if (wert > 99999)
            cout << "Die Zahl hat mehr als 5 Stellen!\n";
          else
            {
              // Prüfen, ob Zahl ohne Rest durch 3 teilbar ist. Dazu teilen wir 
              // sie durch 3 und gucken, was der Rest ist. Stichwort: modulo
              if ( wert % 3)
                cout << "Zahl ist nicht durch 3 teilbar\n";
              else
                cout << "Zahl ist durch 3 teilbar\n";
              // Das obige könnten wir auch für 5 und 7 hinschreiben, 
              // aber man wiederholt Code nicht. Stattdessen machen wir eine Funktion.
              // Wie das geht, erfähst du nach der nächsten Maus.
            }
        }
    }
    
    ____           ____                      
                                .'    '.       .'    '.                    
                               /        \     /        \                   
                               |        |     |        |                   
                                \_      |_____|      _/                    
                                  \_ .-'       '-. _/                      
                                   .'             '.                       
                                  /  .---.   .---.  \                      
                                 :  :_.--': :'--._:  :                     
                                 |  \ (@) : : (@) /  |                     
                               ._|   '...'   '...'   |_.                   
                               ._|--..___     ___..--|_.   __ \.           
                               ._|`''--\-=(@)=-/--''`|_.    \`\))          
                                 |``''''`.___.`''''``|      .''-..--.      
                                //                   \\   .^  ^  ."`       
                               //                     \'.(_d(_d   ;        
                              / |                    _|.-'. _     ;        
                             /  |                   (__..- \      /        
                            /   |                     |/_.'/   _.'         
                           /_  /|                     |   /   (_ |         
            ____   ___    |(_\/ |                     |  /    (__|.._      
          /`    `\'   `\  \ __) :                     : /    /`    __''-.-/
         |        '```'-.  \__)\ \                   / .    |        '-._ /
        /|          .- .-\   | |  `._             _.`  :    |      -----._/
    :  :  \      /  (o) (o)  | |    \`--.......--`     '     \     ----:_/ 
    '._|   '-._.'         \_/  /     |    |:|    |      \     '._______.-' 
       :            \         /     .|    | |    |       '.__     _.-'     
        \            `-.____.'     .:|    | |    |           ||'||         
         '.   `.   `. /          .::'|    | |    |_          || ||         
          /    |    | |    `'::::''/      | |      \      .-' / | \        
         /__nn/|__nn;_;            \_jrei_| |______/       \_/  |__\
    
    #include <iostream>
    using namespace std;
    
    void ist_teilbar(unsigned wert, unsigned teiler)
    {
      if ( wert % teiler)
        cout << "Zahl ist nicht durch " << teiler << " teilbar\n";
      else
        cout << "Zahl ist durch " << teiler << " teilbar\n";
    }
    
    int main()
    {
      cout<<"Bitte geben Sie eine fuenfstellige Zahl ein. "
        "\n\n\n"
        "Eingabe: ";
      unsigned int wert;
      if (!(cin >> wert))
        cout << "Das war keine Zahl!\n";
      else
        {
          if (wert > 99999)
            cout << "Die Zahl hat mehr als 5 Stellen!\n";
          else
            {
              ist_teilbar(wert, 3);
              ist_teilbar(wert, 5);
              ist_teilbar(wert, 7);
            }
        }
    }
    


  • Soweit versthee ich das was du meinst, aber was genau heißt das:

    unsigned int wert; //??
    if (!(cin >> wert)) //??

    Und du hast eine kleinigkeit übersehen.
    Du überprüfst nur, ob die Zahl mehr als 5 Ziffern hat, aber nicht ob sie weniger als 5 hat.
    Sie muss zwingend 5 Ziffern beinhalten.


  • Mod

    Lukas93 schrieb:

    Soweit versthee ich das was du meinst, aber was genau heißt das:

    unsigned int wert; //??
    if (!(cin >> wert)) //??

    unsigned int: Eine Ganzzahl, die positiv sein muss. Im Prinzip kannst du natürlich auch negative Zahlen mit 5 Stellen haben, aber ich nahm mal an, dass du nur positive Zahlen zulassen möchtest.

    if (!(cin >> wert)): Ok, nicht ganz so einfach, aber extrem nützlich. Ich nehme mal an, den Standardeingabestrom cin kennst du und weißt, dass cin >> wert einen Wert von der Standardeingabe einliest und in der Variable wert speichert. cin ist auch so schlau, dass es weiß, dass wert ein unsigned int ist und dass deswegen nur positive Ganzzahlen als Eingaben zulässig sind. Und nun gibt es da noch eine tolle Eigenschaft der Eingabefunktionen: Die liefern als Rückgabewert alle den Stream selbst zurück! Deshalb kann man auch cin >> wert1 >> wert2 >> wert3; schreiben. Das wird gelesen als (((cin >> wert1) >> wert2) >> wert3); . Das innerste cin >> wert1 liefert als Rückgabewert cin. Wenn dieses ausgeführt wurde, steht da also ((cin >> wert2) >> wert3); . Wenn cin >> wert2 ausgeführt wurde, steht da (cin >> wert3); und danach nur cin (macht einfach gar nix, ist aber unten noch wichtig, dass es da steht). Und daher funktioniert das so wie du kennst, dass da erst wert1, dann wert2, dann wert3 gelesen wird.
    Und jetzt kommt die zweite Eigenschaft der Streams in's Spiel: Was passiert, wenn die Eingabe ungültig war, also z.B. keine Zahl eingegeben wurde, obwohl eine Zahl erwartet wird? Dann setzen die Streams ein Fehlerflag. Im Prinzip könntest du mit cin.eof(), cin.fail() und cin.bad() herausbekommen, welches Fehlerflag genau gesetzt wurde, aber für uns ist nur interessant, ob überhaupt ein Fehlerflag gesetzt wurde oder nicht. Da kommt nun noch eine praktische Eigenschaft der Streams in's Spiel: Wenn man sie auswertet, dann geben sie entweder den Wert 0 zurück, wenn ein Fehlerflag gesetzt ist oder andernfalls einen Wert der nicht 0 ist. if (cin >> wert) heißt also, dass dort erst einmal wert gelesen wird. Dann steht da nur noch if (cin) . Jetzt wird cin ausgewertet. Ist die Eingabe fehlgeschlagen, bekommt man 0 und die if-Abfrage springt nicht an. Andernfalls bekommt man etwas, was nicht 0 ist und die Bedingung ist wahr.
    In meinem Code habe ich noch ein ! (d.h. NICHT) davor gemacht, weil ich es genau umgekehrt haben wollte, d.h. die Bdeingung sollte wahr sein, wenn ein Fehler auftritt.

    Und du hast eine kleinigkeit übersehen.
    Du überprüfst nur, ob die Zahl mehr als 5 Ziffern hat, aber nicht ob sie weniger als 5 hat.
    Sie muss zwingend 5 Ziffern beinhalten.

    Dann prüf das eben auch. Ich bin sicher, die Bedingung bekommst du selber hin.


Anmelden zum Antworten