Wiederhole Eingabe solange Eingabe korrekt??



  • Hallo,

    ich möchte ein einfaches Prgramm schreiben, das eine Binärzahl in ein char array einliest und eine Dezimalzahl ausgibt.

    Ich hab jetzt Probleme wie ich die eingegebene Binärzahl kontrolliere und die Eingabe solange wiederholen lasse bis eine korrekte Binärzahl eingegeben wurde.

    Untenstehender Code funktioniert nicht.

    Bitte um Hilfe!!!

    Danke! Clementis

    #include <iostream>
    using namespace std;
    
    int main(){
    	const int ilen = 11;
    	char cBin[ilen];
    	int iDec = -1;
    	bool bf = 1;
    
    	while(bf==0){
    
    		cout << "Eingabe einer Binaerzahl.\n";
    		cin >> cBin;
    
    		for( int i=0; i < ilen; ++i){
    			if(cBin[i]=='0' || cBin[i]=='1'){
    				switch(cBin[i]){
    					case 0:
    					case 1: break;
    					default: bf = 0;
    							 break;
    				}
    			}
    		}
    	}
    	for( int i=0; i < ilen; ++i ){
    		iDec += cBin[i] * 2^(ilen-1-i);
    	}
    	cout << iDec << endl;
    
    	return 0;
    
    }
    


  • ich würde die schleifen tauschen, das die kontrollschleife innerhalb der
    for-schleife liegt:

    #include <iostream>
    
    int main()
    {
        const unsigned maxlen = 11;
        char bin[maxlen];
    
        std::cout << "Eingabe einer Binaerzahl." << std::endl;
    
        for (unsigned i = 0; i  < maxlen; ++i)
        {
            do
            {
                char buffer;
                std::cin >> buffer;
                if (buffer == '0' || buffer == '1')
                    bin[ i] = buffer - '0';
            }
            while (buffer != '0' && buffer != '1');
        }
    
        unsigned dec_num = 0;
    
        for (unsigned i = 0; i < maxlen; ++i)
            dec_num += bin[ i] * (1 << (maxlen - i - 1));
    
        std::cout << dec_num << std::endl;
    }
    

    ^ ist der xor operator 😉

    natürlich ist es unschön immer eine zeile zu verwenden.

    mit std::cin::getline bekommst du die ganze zeile.

    MfG tippgeber



  • Ungetestet, ich hab nur mal geändert, was mir so auf Anhieb aufgefallen ist:

    clementis schrieb:

    #include <iostream>
    using namespace std;
    
    int main(){
    	const int ilen = 11;
    	char cBin[ilen];
    	int iDec = -1;
    	bool bf = 0;       // hier!
    
    	while(bf==0){
                    bf = 1; // hier!
    		cout << "Eingabe einer Binaerzahl.\n";
    		cin >> cBin;
    
    		for( int i=0; i < ilen; ++i){
    			if(cBin[i]=='0' || cBin[i]=='1')
    			  continue; // hier!
    				
    			else
                              bf = 0; // hier!
    		}
    	}
    	for( int i=0; i < ilen; ++i ){
    		iDec += cBin[i] * 2^(ilen-1-i);
    	}
    	cout << iDec << endl;
    
    	return 0;
    
    }
    


  • Danke für Eure Antworten.

    @tippgeber:
    Ich möchte die gesamte Zeichenkette einlesen, dann prüfen und gegebenenfalls nochmals einlesen, wenn keine Binärzahl.

    Die Version von Belli endet in einer endlosen Eingabe.

    Danke!

    Hat bitte noch jemand einen Tipp für mich?


  • Administrator

    #include <bitset>
    #include <string>
    #include <iostream>
    
    int main()
    {
    	std::bitset<32> bitset;
    
    	std::cout << "Geben sie eine Bitzahl ein:" << std::endl;
    
    	for(;;)
    	{
    		std::cin.clear();
    		std::cin.ignore(std::cin.rdbuf()->in_avail());
    
    		std::string line;
    		std::getline(std::cin, line);
    
    		try
    		{
    			bitset = std::bitset<32>(line);
    			break;
    		}
    		catch(std::invalid_argument&)
    		{
    			std::cout << "Fehlerhafte eingabe. Nochmal: " << std::endl;
    		}
    	}
    
    	std::cout << "Die Zahl lautet: " << bitset.to_ulong() << std::endl;
    
    	return 0;
    }
    

    😃

    http://www.cplusplus.com/reference/
    http://www.cplusplus.com/reference/stl/bitset/

    Grüssli



  • try und catch
    bah pfui !

    wenn schon dann mit schleifen 🙂



  • clementis schrieb:

    Die Version von Belli endet in einer endlosen Eingabe.
    Hat bitte noch jemand einen Tipp für mich?

    Ersetze:
    for( int i=0; i < ilen; ++i){

    durch:
    for( int i=0; i < strlen(cBin); ++i){



  • Danke Belli, das hat geholfen!

    Warum hat es vorher nicht funktioniert?



  • Vorher wurden immer alle 11 (ilen) Stellen von cBin untersucht, auch wenn man nur 3 eingegeben hatte. Was dann ab Stelle 4 drinstand, war undefiniert und deshalb nicht zu gebrauchen.

    Übrigens klappt Dein Umformen in eine Integerzahl so wohl auch nicht, oder?
    Aber für heute habe ich Feierabend, übrigens solltest Du ruhig versuchen, Draveres Lösung zu verstehen, das ist C++ in Reinkultur - ich vermute aber, Du willst selbst ein bißchen rumexperimentieren, um was zu lernen, deshalb habe ich versucht, Deinen Code so wenig wie nötig zu ändern, beim Umrechnen wird das allerdings schwierig ...



  • Danke!
    Du hast Recht. Das Umwandeln in einen int Wert funktioniert auch nicht.
    Ich werd mal stöbern, wie das so funktioniert.
    Vlt kannst du mir ja nach Feierabend bei der Berechnung helfen.

    Die Loesung von Draveres werd ich mir auch zu Gemüte führen, aber ich befürchte, dass wir ein wenig länger dauern.

    Danke nochmals an alle!

    lg, Clementis


Anmelden zum Antworten