Integer Variable Sonderzeichen/Buchstaben entfernen



  • Guten Tag

    Ich würde gerne wissen wie ich aus einer integer variable wo 3a4 eingegeben wurde
    Das da integer variable = 34 rauskommt.

    Oder einfach das falls irgendein sonderzeichen/buchstabe eingegeben wurde dass das programm zum else zweig springt.

    Aus interesse würde ich gerne beides erfahren :D.

    #include <iostream>
    #include <ctime>
    #include <string>
    #include <ctype.h>
    #include <math.h>
    using namespace std;
    	// 	unsigned int *punkte  = new unsigned int[anzahl];
    int anzahl;
    
    int main(){
    	cout << "Bitte gib die Anzahl der Teilnehmer an: ";
    	cin >> anzahl;
    // HIER IST DAS PROBLEM WAS FÜR EIN BEFEHL SOLL ICH NEHMEN??
    	if (!isdigit(anzahl)) {
    		cout << "Du hast eine Zahl eingeben :V" << endl;
    		if(anzahl%2 == 0){
    				// HIER GEHTS ERST RICHTIG LOS
    	unsigned int *punkte = new unsigned int[anzahl];
    	string *teilnehmer = new string[anzahl];
    
    	for(int i=0;i<anzahl;i++){
    		cout << "Name: ";
    		cin >> teilnehmer[i];
    	}
    
    	 srand(time(NULL));
    
    	for(int i=0;i<anzahl;i++){
    		punkte[i] = rand() + 1 % 10 * 3.3; 
    	}
    
    	cout  << "Punkte" << endl;
    
    	cout << endl << "Sortierung :V" << endl;
    // Sortierung
    	double temp;
    	string temp2;
    	for(int i=0;i<anzahl;i++){
    		for(int i=0;i<anzahl;i++){
    			if(punkte[i] > punkte[i+1]){
    				temp = punkte[i];
    				temp2 = teilnehmer[i];
    
    				punkte[i] = punkte[i+1];
    				teilnehmer[i] = teilnehmer[i+1];
    
    				punkte[i+1] = temp;
    				teilnehmer[i+1] = temp2;
    
    			}else if(punkte[i] == punkte[i+1]){
    				// punkte[i] = rand() % 10 * 3.3;
    				    while (punkte[i] == punkte[i+1])
    						{
    							punkte[i] = rand() + 1 % 5000 * 3.3;
    							if(punkte[i] > punkte[i+1]){
    								temp = punkte[i];
    								temp2 = teilnehmer[i];
    								punkte[i] = punkte[i+1];
    								teilnehmer[i] = teilnehmer[i+1];
    								punkte[i+1] = temp;
    								teilnehmer[i+1] = temp2; }
    							//uuuuuuuuuuuuuuuuuuuuu
    						}
    			}
    		}
    	}
    		int stopschild = 0; 
    		cout << endl << "Partner:" << endl;
    		for(int i=0;i<anzahl;i++){
    		cout << teilnehmer[i] << " ----> ";
    		stopschild = stopschild + 1;
    
    		if(i+1 == anzahl){
    
    		} else if(stopschild == 2){
    			stopschild = 0;
    			cout << endl;
    		}
    		// cout << teilnehmer[i] << " " << punkte[i] << endl;
    	}
    		cout << teilnehmer[0] << endl;
    
    			// HIER WIRDS LAHM
    		}else{
    			cout << endl << "Tut mir leid du hast eine Person zu viel bzw. zu wenig dabei :( DUMMKOPF!!!!";
    
    		}
    	}
    	else {
    		cout<<"Du hast kkkkkkkkkkkkkkeine Zahl eingegeben!!" << endl;
    	}
    
    		system("PAUSE");
    }
    


  • Das ist - wenn man es richtig macht - so umfangreich, dass es dafuer eigene Bibliotheken gibt.

    Ohne solche Bibliotheken bleiben Dir nur Kruecken, die den Blick vom Wesentlichen ablenken.

    Ich schlage vor, Du gehst erstmal davon aus, dass keine falschen Eingaben gemacht werden und machst weiter mit Deiner Logik.

    Ein leicht abzufangener Eingabefehler ist allerdings eine ungerade Spielerzahl.
    Und wenn Du Dein Programm etwas strukturierst und entzerrst (nicht alles in eine Funktion) musst Du auch gar nicht 3 Ebenen einruecken.

    Z.B.

    #include <iostream>
    
    int get_even_num(){
      int i=-1;
      while(i<0 || i%2!=0 ){
        std::cout << "Bitte geben sie eine gerade Zahl ein: ";
        std::cin >> i;
      }
      return i;
    }
    
    int main(){
      int anzahl = get_even_num();
      // hier geht's erst richtig los
    }
    

    Viel Erfolg!



  • Und tu dir einen Gefallen und verwende nicht new[]!
    Vorallem nicht, wenn du den Speicher noch nicht einmal freigibst.
    Schau dir std::vector an, der kümmert sich um alles und wächst auch bei Bedarf.


  • Mod

    @Furble: Wie wäre es mit

    unsigned i;
    do
    {
    	std::cin.clear();
    	std::cin.ignore( std::numeric_limits<std::streamsize>::max(), '\n' );
    	std::cout << "Bitte geben sie eine gerade Zahl ein: ";
    	std::cin >> i;
    }
    while( !(std::cin >> i) || i%2 != 0 );
    

    (ungetestet)?



  • Kannst du mir bitte noch eins zwei Bibliotheken nennen mit den das geht?
    Am besten so eine Standard Bibiliothek falls es die gibt bitte :).
    Also so ein ISO Ding.

    Den Rest der Tipps habe ich befolgt außer das mit den Vektoren da muss ich mich erstmal noch einlesen.



  • Wichtelmensch schrieb:

    Kannst du mir bitte noch eins zwei Bibliotheken nennen mit den das geht?
    Am besten so eine Standard Bibiliothek falls es die gibt bitte :).
    Also so ein ISO Ding.

    Was ich meinte sind Bibliotheken fuer TUI, bzw. GUI.
    Da gibt es leider keine Internationale Norm - dafuer muessten sich viele Anbieter von "windowing systems" zusammensetzen und was ausbaldowern.

    ncurses oder QT waeren Moeglichkeiten, oder was auch immer Dein Rechner mitbringt.

    Eine solide und ansehnliche UI ist natuerlich das Sahnehaeubchen fuer ein interaktives Programm. C++ lernen geht aber auch ohne.

    Cheers

    @Arcoth: Meinetwegen. Ist aber eben so eine Kruecke, wie ich meinte.



  • Falls sich jemand für meine Lösung interessiert ^^

    #include <iostream>
    #include <ctime>
    #include <string>
    #include <stdint.h>
    
    using namespace std;
    
    int chartoint(char *text){
      int i;
      i = atoi (text);
      return i;
    }
    
    int main(){
    	cout << "Bitte gib die Anzahl der Teilnehmer an: ";
    	char Canzahl[5];
    	cin.getline(Canzahl,5);
    	int anzahl;
    	anzahl = chartoint(Canzahl);
    	while(anzahl == 0){
    		cout << "Da ist wohl was schief gelaufen bitte nur zahlen eingeben";
    		cin.getline(Canzahl,5);
    		anzahl = chartoint(Canzahl);
    	}
    
    				// HIER GEHTS ERST RICHTIG LOS
    	unsigned int *punkte = new unsigned int[anzahl];
    	string *teilnehmer = new string[anzahl];
    
    	for(int i=0;i<anzahl;i++){
    		cout << "Name: ";
    		cin >> teilnehmer[i];
    	}
    
    	 srand(time(NULL));
    
    	for(int i=0;i<anzahl;i++){
    		punkte[i] = rand() + 1 % 10 * 3.3; 
    	}
    
    	cout  << "Punkte" << endl;
    
    	cout << endl << "Sortierung :V" << endl;
    // Sortierung
    	double temp;
    	string temp2;
    	for(int i=0;i<anzahl;i++){
    		for(int i=0;i<anzahl;i++){
    			if(punkte[i] > punkte[i+1]){
    				temp = punkte[i];
    				temp2 = teilnehmer[i];
    
    				punkte[i] = punkte[i+1];
    				teilnehmer[i] = teilnehmer[i+1];
    
    				punkte[i+1] = temp;
    				teilnehmer[i+1] = temp2;
    
    			}else if(punkte[i] == punkte[i+1]){
    				// hier startet der versuch
    				    while (punkte[i] == punkte[i+1])
    						{
    							punkte[i] = rand() + 1 % 5000 * 3.3;
    							if(punkte[i] > punkte[i+1]){
    								temp = punkte[i];
    								temp2 = teilnehmer[i];
    								punkte[i] = punkte[i+1];
    								teilnehmer[i] = teilnehmer[i+1];
    								punkte[i+1] = temp;
    								teilnehmer[i+1] = temp2; }
    							//uuuuuuuuuuuuuuuuuuuuu
    						}
    			}
    		}
    	}
    		int stopschild = 0; 
    		cout << endl << "Partner:" << endl;
    		for(int i=0;i<anzahl;i++){
    		cout << teilnehmer[i] << " ----> ";
    		stopschild = stopschild + 1;
    
    		if(i+1 == anzahl){
    
    		} else if(stopschild == 2){
    			stopschild = 0;
    			cout << endl;
    		}
    
    	}
    		cout << teilnehmer[0] << endl;
    
    		delete[] teilnehmer, punkte;
    
    		system("PAUSE");
    }
    


  • Das stuerzt bei mir ab.

    Du greifst wahrscheinlich an diversen Stellen "eins hinter" die Arrays - jeweils an den Stellen mit xyz[i+1] , wenn i ==anzahl-1 .

    Ausserdem musst Du die Speicherbereiche jeweils einzeln freigeben. Aktivier die hoechste Warnstufe in Deinem Compiler, der bermerkt naemlich, dass an Zeile 93 was faul ist.

    Zudem verstehe ich nicht, wo der Unterschied zwischen char_to_int(char*) und atoi(const char*) ist. Du kannst doch gleich letzteres einsetzen.

    Ich weiss uebrigens immer noch nicht, was das Programm eigentlich machen soll!?

    Alles in allem faellt auf, dass Du ernsthaft dabei bist - es sind jedenfalls keine Riesenklopfer drin.

    //uuuuuuuuuuuuuuuuuuuuu
    FW 🙂


Log in to reply