Array



  • hi all
    könnt ihr mir helfen?
    ich soll 20 zeichen eingeben und sagen ob sich es dabei um eine ziffer handelt oder ein zeichen, so dass habe ich bereits getan.
    Nun will ich es erweitern, indem ich die Anzahl der gefundenen ziffern und zeichen ausgebe.Und die gefundenen zeichen und ziffern sollen dann nocheinmal aufgelistet werden.

    #include <iostream>
    #include <conio.h>
    #include "conioex.h"
    using namespace std;
    
     int main()
     {
    	char zeichen[20],entscheidung;
    	int zeichen1=0,ziffer=0;
    do
    {
    	system("cls");
    
    	for(int counter=0;counter<20;counter++)
    	{
    		cout<<"Geben Sie ein Zeichen ein=> ";
    		cin>>zeichen[counter];
    
    		if(zeichen[counter]>48 && zeichen[counter]<57)
    		{
    			textcolor(RED);
    			cout<<"Ziffer"<<endl;
    			textcolor(LIGHTGRAY);
    		}
    		else
    		{
    			textcolor(RED);
    			cout<<"Zeichen"<<endl;
    			textcolor(LIGHTGRAY);
    		}
    	}
    
    	cout<<endl<<endl;
    	cout<<"Wollen Sie das Programm wiederholen?(j/n)=> ";
    	cin>>entscheidung;
    }
    while(entscheidung=='j');
    
    	getch();
    	return 0;
     }
    


  • Hier ein Vorschlag von vielen Möglichkeiten.
    Erstelle Zwei weitere Array mit dem selben Grenzwert, wie dein Eingabe-Array (20).

    Ein Array für die festgestellten Zeichen und eines für die festgestellten Ziffern. Jedesmal, wenn du ein Zeichen/Ziffer feststellst, legst du es in das entsprechende Array. Am Ende kannst du beide Array wieder ausgeben. Ach ja, auf diesem Weg brauchst du nicht mal mit zählen. Du kannst am Ende den Count jedes Array ausgeben lassen.
    Viel Spass bei der Umsetzung.



  • Vielen Dank für den Typ
    freu 😋 😋 😋 😋 😋



  • hm ich glaub ich versteh dich falsch habe das jetzt gemacht.

    #include <iostream>
    #include <conio.h>
    #include "conioex.h"
    using namespace std;
    
     int main()
     {
    	char zeichen[20],ziffern[20],buchstaben[20],entscheidung;
    	int zeichen1=0,ziffer=0;
    do
    {
    	system("cls");
    
    	for(int counter=0;counter<20;counter++)
    	{
    		cout<<"Geben Sie ein Zeichen ein=> ";
    		cin>>zeichen[counter];
    
    		if(zeichen[counter]>48 && zeichen[counter]<57)
    		{
    			textcolor(RED);
    			cout<<"Ziffer"<<endl;
    			textcolor(LIGHTGRAY);
    			ziffern[counter+1]=zeichen[counter];
    
    		}
    		else
    		{
    			textcolor(RED);
    			cout<<"Zeichen"<<endl;
    			textcolor(LIGHTGRAY);
    			buchstaben[counter+1]=zeichen[counter];
    
    		}
    	}
    
    	cout<<"Es wurden "<<ziffern<<" Ziffern gefunden.";
    	cout<<"Es wurden "<<buchstaben<<" Zeichen gefunden.";
    
    	cout<<endl<<endl;
    	cout<<"Wollen Sie das Programm wiederholen?(j/n)=> ";
    	cin>>entscheidung;
    }
    while(entscheidung=='j');
    
    	getch();
    	return 0;
     }
    


  • Du hast eine kleinigkeit nicht berücksichtigt.

    Du verwendest die Count-Zählvariabele, um mit genau dieser in eines der neuen Array Einträge zu schreiben.

    Problem: Wenn du 19 Buchstaben am Stück hast - Toll klappt,
    aber wenn der 20 eine Ziffer ist, versuchst du in Ziffer[19] einzutragen, obwohl, das ja eigentlich dein erster Wert in diesem array ist.
    Überlege nochmal, ob du nicht in deine if- else Anweisung jeweils einen separaten integerwert einsetzt, den du einfach mit ++ um eins erhöchst, wenn du in den entsprechen den Abschnitt läufst und dann diese Zähler zum eintragen in den Array nutzt.



  • Sorry das ich wieder nerve mir fällt das einfach schwer und wüsste nicht weiter.
    also er gibt mir jetzt die Anzahl der buchstaben und die ziffern aus.

    Aber wie kann ich die ziffern einzlen aufrufen und die buchstaben ebenfalls.

    #include <iostream>
    #include <conio.h>
    #include "conioex.h"
    using namespace std;
    
     int main()
     {
        char zeichen[20],ziffern[20],buchstaben[20],entscheidung;
        int zeichen1=0,ziffer=0;
    do
    {
        system("cls");
    	ziffer=0;
    	zeichen1=0;
    
        for(int counter=0;counter<20;counter++)
        {
            cout<<"Geben Sie ein Zeichen ein=> ";
            cin>>zeichen[counter];
    
            if(zeichen[counter]>48 && zeichen[counter]<57)
            {
                textcolor(RED);
                cout<<"Ziffer"<<endl;
                textcolor(LIGHTGRAY);
                ziffern[zeichen1++]=zeichen[counter];
    
            }
            else
            {
                textcolor(RED);
                cout<<"Zeichen"<<endl;
                textcolor(LIGHTGRAY);
                buchstaben[ziffer++]=zeichen[counter];
    
            }
        }
    
        cout<<"Es wurden "<<zeichen1<<" Ziffern gefunden."<<endl;
    	cout<<"Ziffern waren=> "<<endl;
        cout<<"Es wurden "<<ziffern<<" Zeichen gefunden."<<endl;
    	cout<<"Zeichen waren=> ";
    
        cout<<endl<<endl;
        cout<<"Wollen Sie das Programm wiederholen?(j/n)=> ";
        cin>>entscheidung;
    }
    while(entscheidung=='j');
    
        getch();
        return 0;
     }
    


  • Hmm also ... das ganze ist eigentlich ganz einfach zu machen ... das ist deine Ausgangssache da mal in sauberen C++ geschrieben ...

    #include <iostream>
    #include <string>
    
    int main(void)
    {
    	std::cout << "Geben Sie eine Kette aus Zeichen und/oder Zahlen ein!" << std::endl;
    	std::string sInput;
    	std::getline(std::cin, sInput);
    
    	for (std::string::size_type pos = 0; pos < sInput.length(); ++pos)
    		std::cout << sInput[pos] << " ist ein" << ((sInput[pos] > 48 && sInput[pos] < 58 ? "e Zahl!" : " Zeichen!")) << std::endl;
    
    	// nimm doch kein getch ... mach es so!
    	std::cin.clear();
    	std::cin.ignore(std::cin.rdbuf()->in_avail());
    	std::cin.get();	
    
    	return 0;
    }
    

    So ... das jetzt noch um den Rest erweitern ... das geht am einfachsten mit einem std::vector<char> ...



  • achja ... du kannst es dann entweder so machen:

    std::vector< std::pair<char, bool> > chars;
    
    	for (std::string::size_type pos = 0; pos < sInput.length(); ++pos)
    		chars.push_back(std::pair<char, bool>(sInput[pos], (sInput[pos] > 48 && sInput[pos] < 58)));
    

    Wobei du dann mit chars[n].second == true gucken kannst ob es eine Zahl ist ...



  • So und um genau das zu machen was du haben wolltest ...

    #include <iostream> // Brauchen wir für std::cout usw 
    #include <string> // Da ist std::string drin ... (wesentlich schöner als char*)
    #include <sstream> // und hier std::stringstream (Brauchen wir um std::string in unsigned int umzuformen ...)
    #include <vector> // hmm std::vector (in etwa das selbe wie ein dynamischer Array)
    
    int main()
    {
    	std::cout << "Geben Sie eine Kette aus Zeichen und/oder Zahlen ein!" << std::endl; // Halt deine Ausgabe ...
    	std::string sInput; // Einen String anlegen ... ist sowas in der Art wie ein char Array ...
    	std::getline(std::cin, sInput); // ließt bis zum nächsten \n die Eingabe des Benutzers ein ... [ENTER] ;)
    
    	std::vector<char>			chars; // dynamischer Array (vereinfacht gesagt), da wir ja nicht wissen wie viele Zeichen da denn jetzt in dem String sind ...
    	std::vector<unsigned int>	numbers; // s. o.
    	std::stringstream			ss; // Brauchen wir nur um, falls es eine Zahl ist, das Char in einen Unsigned int umwandeln zu können ... eigentlich sollte man wohl eher unsigned short nehmen ... kleiner Fehler von mir ...
    	unsigned int				number; // eine temp variable ... damit wir das charinunsignedint irgendwo reintuen können ^^
    
    	for (std::string::size_type pos = 0; pos < sInput.length(); ++pos) // jedes Zeichen des strings durchgehen ... wobei std::string::size_type halt auch nurn Datentype ist ...
    	{
    
    		if (sInput[pos] > 48 && sInput[pos] < 58) // Das kennst de ja von deinem Code ...
    		{		
    			ss.clear(); // Da ja schon was im stream stehen kann den mal clearen
    			ss.str(""); // und auf "" setzen ...
    			ss << sInput[pos]; // Unseren char reingeben (vereinfacht)
    			ss >> number; // Unsere Zahl rausholen (vereinfacht)
    			numbers.push_back(number); // die Zahl an das Ende unseres dynamischen Array dranhängen (vereinfacht ^^)
    		}
    		else
    			chars.push_back(sInput[pos]); // wenn es ein Zeichen ist direkt in den array für die zeichen hinten dran setzen ...
    	}
    
    	std::cout << "Die Kette enthaelht " << numbers.size() << " Zahlen und " << chars.size() << " Zeichen!" << std::endl; // Halt ausgeben wieviele elemente in den dynamischen array 
    	std::cout << "Zahlen: " << std::flush;
    	for (size_t item = 0; item < numbers.size(); ++item) // alle zahlen durchgehen
    		std::cout << numbers[item]; // und ausgeben 
    
    	std::cout << std::endl << "Zeichen: " << std::flush;
    	for (size_t item = 0; item < chars.size(); ++item) // s.o. nur für zeichen
    		std::cout << chars[item];
        std::cout << std::endl;
    
        // Nimms einfach so wie es ist ^^ muss du nicht verstehen was jetzt kommt ^^
    	std::cin.clear();
    	std::cin.ignore(std::cin.rdbuf()->in_avail());
    	std::cin.get();	
    
    	return 0;
    }
    

    Ist zwar ein wenig Speicherverschwendung ... aber was soll's ^^

    [edit]So habs kommentiert ... aber hab es dir in einer vereinfachten version da hingeschrieben ... was genau da passiert ist ein wenig komplizierter ... [/edit]



  • sorry aber ich kann damit nicht anfangen, da ich gerade mal if else, schleifen behandelt habe

    gehts auch auf einfacher artmit arrays



  • Hmm ja ... also ... der Code den ich dir da geschrieben hab, hat halt ein paar Vorteile, wie bsw. das du nicht die Anzahl der maximal einzugebenden Zeichen festlegen musst ... ist keine Begrenzung drin 😉

    Ich kommentier es dir mal ...



  • ok dankeschön ich versuch mich mal daran



  • Wäre nett, wenn du dir mal das richtige Unterforum anguckst.
    Ich denke mal im Konsolenforum bist du besser aufgehoben. 😉



  • Dieser Thread wurde von Moderator/in estartu aus dem Forum MFC (Visual C++) in das Forum DOS und Win32-Konsole verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


Anmelden zum Antworten