Schleifen und Verzweigungen



  • Sorry, aber was sind Strings?



  • std::string ist die C++ Version zum Umgang mit Zeichenketten 😉

    (eine Erklärung findest du z.B. in meinem Magazin-Artikel "Stringverarbeitung in C++" oder in jedem guten C++ Tutorial)



  • Alles schön und gut, ich hab auch noch in nem Buch nachgelesen, aber das hilft mir persönlich auch bei der Aufgabe net weiter!!!



  • Nun gut, aber warum funktioniert das jetzt nicht?????

    #include<iostream.h>
    
    void main()
    
    {
    
    	char zeichen;
    	int kon_a = 0, 
    		kon_e = 0, 
    		kon_i = 0,
    		kon_o = 0,
    		kon_u = 0;
    
    /*-------------------------------------------------------------------------------------------------------*/
    
    cout << "Geben Sie jetzt Zeichen ein. ==> Ende mit dem Zeichen * <==" << endl;
    
    		while ( zeichen != '*' )
    
    		{
    			cin >> zeichen;
    
    				switch (zeichen)
    
    				{
    				case 'a':
    				case 'A': kon_a++;
    					break;
    
    				case 'e':
    				case 'E': kon_e++;
    					break;
    
    				case 'i':
    				case 'I': kon_i++;
    					break;
    
    				case 'o':
    				case 'O': kon_o++;
    					break;
    
    				case 'u':
    				case 'U': kon_u++;
    					break;
    				}
    
    		}
    
    	cout << "a/A";
    
    	for (kon_a; kon_a < zeichen; kon_a++)
    		cout << " ° ";
    
    	cout << endl << endl;
    /*-------------------------------------------------------------------------------------------------------*/
    
    		cout << "e/E";
    
    	for (kon_e; kon_e < zeichen; kon_e++)
    		cout << " ° ";
    
    	cout << endl << endl;
    /*-------------------------------------------------------------------------------------------------------*/
    
    		cout << "i/I";
    
    	for (kon_i; kon_i < zeichen; kon_i++)
    		cout << " ° ";
    
    	cout << endl << endl;
    /*-------------------------------------------------------------------------------------------------------*/
    
    		cout << "o/O";
    
    	for (kon_o; kon_o < zeichen; kon_o++)
    		cout << " ° ";
    
    	cout << endl << endl;
    /*-------------------------------------------------------------------------------------------------------*/
    
    		cout << "u/U";
    
    	for (kon_u; kon_u < zeichen; kon_u++)
    		cout << " ° ";
    
    	cout << endl << endl;
    
    }
    


  • Hallo

    Es heißt #include <iostream> ohne .g und int main und nicht void main.

    chrische



  • Weil deine Ausgabeschleifen (kurz gesagt) Käse sind - du zeichnest nicht kon_a Blöcke, sondern '*' - kon_a Blöcke. Besser sieht es so aus:

    for(int i=0;i<kon_a;++i) cout<<"°";
    

    PS: Und fünfmal fast der selbe Code? Das lässt sich doch zusammenfassen 😉

    void print_block(const string& praefix,int count)
    {
      cout<<preafix<<' ';
      for(int i=0;i<count;++i) cout<<"°";
      cout<<endl;
    }
    
    ...
    print_block("a/A",kon_a);
    print_block("e/E",kon_e);
    ...
    


  • sprichst du in einem andern C?

    Wir haben es gelernt mit #include<iostream.h> und void main

    nach dem MAGNUM wird es auch ohne .h und mit void main(void) inclusive using namespace std gemacht.

    Aber alle anderen Programme funktionieren so.

    Das ist nicht der Fehler!!!!!



  • Tray schrieb:

    sprichst du in einem andern C?

    Ja, von Standard C++ - und dort ist offiziell nur "int main()" erlaubt (und die <iostream.h> gilt als veraltet).

    Das ist nicht der Fehler!!!!!

    Und was ist der Fehler? (bzw. worüber beschwert sich dein Compiler?)



  • Hmmm also hab eben was zusammengeschustert 🤡
    Funktioniert ist aber nicht schön aber vielleicht kannst du doch paar gewinnbringende Sachen übernehmen.

    #include <iostream>
    #include <string>
    #include <cctype>
    
    using namespace std;
    
    void draw(int num)
    {
    	for(int i=0;i<num;i++)
    		cout << "°";
    	cout << num << endl;
    }
    
    void find_char(string& str, string& searchstr)
    {
    	int cnt = 0;
    	for(int i = 0;i<=str.length();i++)
    	{
    		if(toupper(searchstr[0])  == toupper(str[i]))
    			cnt++;
    	}
    	cout << (char)tolower(searchstr[0]) << "/" << (char)toupper(searchstr[0]);
    	draw(cnt);
    }
    
    int main()
    {
    
        char *buf = new char[256];
    	string tmp,text;
    
    	cout << "Geben Sie jetzt Zeichen ein. ==> Ende mit dem Zeichen * <==" << endl;
    	tmp = "";
    
        while (1)        
        {
    			cin >> buf;
    			tmp += buf;
    			if(tmp.find("*") != -1)
    				break;
        }
    
    	text = tmp.substr(0, tmp.find("*"));
    	find_char(text, string("a"));
    	find_char(text, string("e"));
    	find_char(text, string("i"));
    	find_char(text, string("o"));
    	find_char(text, string("u"));
    
    	return 0;
    }
    


  • bliblablub schrieb:

    Hmmm also hab eben was zusammengeschustert 🤡
    [...]

    *grübelt* Soll ich wirklich...? Ja, ich sollte 😉

    Für einen Anfänger ist das schonmal recht nett, aber:

    • das zu suchende Zeichen solltest du als char an find_char() übergeben
    • die Zählung würde ich nicht selber übernehmen, sondern std::count() verwenden
    • wenn du einen Parameter nicht ändern willst, ist es eine gute Idee, ihn als 'const string&' zu übergeben
    • der Umgang mit nackten char-Zeigern ist nicht besonders sicher (und unnötig, da cin auch direkt nach std::string einlesen kann
    • Ich würde die Aufgaben eher nach logischen Gesichtpunkten aufteilen - eine Funktion zum Zählen der Werte, eine zur Ausgabe
    • und last but not least - da fehlt ein delete[]buf;


  • Ich hab noch nie was von "praefix" oder "printblock" etc gehört!

    Es muss eine andere Lösung geben!!!

    Ich glaube ich habe meinen Fehler!!!

    Und zwar hier:

    cout << "a/A";
    
        for (/*Es kann ja nur die Schleife sein*/kon_a; kon_a < zeichen; kon_a++)
            cout << " ° ";
    
        cout << endl << endl;
    


  • Tray schrieb:

    Ich hab noch nie was von "praefix" oder "printblock" etc gehört!

    Du weißt aber schon, dass man eigene Funktionen anlegen kann?

    Es muss eine andere Lösung geben!!!

    Es gibt sowieso nicht "die Lösung". Wenn du spezifische Anforderungen an die Lösung stellst (z.B. keine Verwendung der Standardbibliothek), dann solltest du das sagen.

    Ich glaube ich habe meinen Fehler!!!

    Ja, dass die Schleife kompletter Käse ist, wurde dir ja nun schon mehrfach gesagt.

    #include <algorithm>
    #include <iostream>
    #include <string>
    #include <map>
    using namespace std;
    
    int main()
    {
    	string line;
    	map<char, string::size_type> counter;
    	while( getline( cin, line ) && line != "*" )
    	{
    		counter['a'] += count( line.begin(), line.end(), 'a' )
    		              + count( line.begin(), line.end(), 'A' );
    		counter['e'] += count( line.begin(), line.end(), 'e' )
    		              + count( line.begin(), line.end(), 'E' );
    		counter['i'] += count( line.begin(), line.end(), 'i' )
    		              + count( line.begin(), line.end(), 'I' );
    		counter['o'] += count( line.begin(), line.end(), 'o' )
    		              + count( line.begin(), line.end(), 'O' );
    		counter['u'] += count( line.begin(), line.end(), 'u' )
    		              + count( line.begin(), line.end(), 'U' );
    	}
    
    	for( map<char, string::size_type>::const_iterator i = counter.begin();
    		 i != counter.end();
    		 ++i )
    	{
    		cout << i->first << ' ' 
    			 << string( i->second, '' ) << ' ' 
    			 << i->second << '\n';
    	}
    }
    


  • Tut mir echt leid Leute!

    Aber ich versteh da nur Bahnhof!

    counter['a'] += count( line.begin(), line.end(), 'a' )
                          + count( line.begin(), line.end(), 'A' );
    

    Dürfte etwa das selbe sein wie

    switch (zeichen)
    
                    {
                    case 'a':
                    case 'A': kon_a++;
                        break;
    

    oder?
    dann...

    for( map<char, string::size_type>::const_iterator i = counter.begin();
             i != counter.end();
             ++i )
        {
            cout << i->first << ' ' 
                 << string( i->second, '' ) << ' ' 
                 << i->second << '\n';
    

    Hab ich noch nie gehört!!!!

    Und was ne Bibliothek ist bekamen wir auch nicht beigebracht!

    Hey ich würde mich doch nicht an ein Forum wenden, wenn mein Wissen
    ausreichen oder wenn ich mich nicht bemühen würde! Ihr stellt mich alle so hin, als hätte ich die ganze Zeit gefehlt oder blau gemacht!!!!

    Aber das ist nicht der Fall!!!!

    Ich weiß net wie oft ich in diesem Forum schon gehört habe

    "Das ist Käse"
    "Schwänzt du die Ausbildung?"
    "Programmierst du einen bullshit zusammen"
    e.t.c.

    Wofür ist dieses Forum gedacht?
    Damit ihr euch als Profis mit dem Unwissen der Anfänger aufwerten könnt?

    Sicher nicht!

    😡 😡 😡 😡 😡 😡 😡 😡 😡 😡



  • Tray schrieb:

    counter['a'] += count( line.begin(), line.end(), 'a' )
                          + count( line.begin(), line.end(), 'A' );
    

    Dürfte etwa das selbe sein wie

    switch (zeichen)
                
                    {
                    case 'a':
                    case 'A': kon_a++;
                        break;
    

    oder?

    Ja. Da wird gezählt. Ich benutze eben die count-Funktion aus <algorithm>, dadurch brauch ich keine Schleife.

    Hab ich noch nie gehört!!!!

    Dafür können wir ja nichts. Offenbar möchtest du eine Lösung deines Problems, die nur die Dinge enthält, die du kennst. Was du kennst, wissen wir aber nicht, da helfen auch die vielen Ausrufezeichen nicht.

    Hey ich würde mich doch nicht an ein Forum wenden, wenn mein Wissen
    ausreichen oder wenn ich mich nicht bemühen würde!

    Es geht hier nicht um Wissen oder Mühe, du scheiterst ja schon am LESEN! CStoll hat dir doch schon längst gesagt, dass deine Schleifen falsch sind, und er hat dir auch gesagt, wie sie richtig aussehen müssen. Das ist bei dir aber offenbar nicht angekommen.

    Wofür ist dieses Forum gedacht?

    Damit man Hilfe bei konkreten Problem bekommt. Man sollte aber schon in der Lage sein, die Hilfe auch umzusetzen.



  • Tray schrieb:

    Tut mir echt leid Leute!

    Aber ich versteh da nur Bahnhof!

    counter['a'] += count( line.begin(), line.end(), 'a' )
                          + count( line.begin(), line.end(), 'A' );
    

    Dürfte etwa das selbe sein wie

    switch (zeichen)
                
                    {
                    case 'a':
                    case 'A': kon_a++;
                        break;
    

    oder?

    In etwa ja, aber wesentich flexibler 😉
    (und das kann man wesentlich leichter erweitern:

    string such = "aeiou";
    
    ...
    while( getline( cin, line ) && line != "*" )
    {
      for(int i=0;i<suchzeichen.size();++i)
        counter[such[i]] += count(line.begin(),line.end(),tolower(such[i]))
                         +  count(line.begin(),line.end(),toupper(such[i]));
    }
    
    for( map<char, string::size_type>::const_iterator i = counter.begin();
             i != counter.end();
             ++i )
        {
            cout << i->first << ' ' 
                 << string( i->second, '' ) << ' ' 
                 << i->second << '\n';
    

    Hab ich noch nie gehört!!!!

    In Kurzfassung: Das gibt alle Einträge der map 'counter' aus ( string(n,c) erzeugt einen String, der n Kopien des Zeichen c enthält).

    Hey ich würde mich doch nicht an ein Forum wenden, wenn mein Wissen
    ausreichen oder wenn ich mich nicht bemühen würde! Ihr stellt mich alle so hin, als hätte ich die ganze Zeit gefehlt oder blau gemacht!!!!

    Aber das ist nicht der Fall!!!!

    Wenn du das entsprechende Wissen schon nicht in der Schule vermittelt bekommen hast, solltest du wenigstens in der Lage sein, die ankommenden Tips zu erkennen - und zu beherzigen.

    Ich weiß net wie oft ich in diesem Forum schon gehört habe

    "Das ist Käse"
    "Schwänzt du die Ausbildung?"
    "Programmierst du einen bullshit zusammen"

    Mag sein, daß manche Profis (mich eingeschlossen) etwas allergisch auf Noob-Codes reagieren. Aber zumindest ich versuche immer, konstruktiv zu sein. Und in meinem obigen Beitrag (in dem tatsächlich das Wort "Käse" vorkam), habe ich auch erklärt, was an deiner Schleife falsch war - und wie du es besser machen kannst.
    Lesen und daraus lernen mußt du allerdings schon selber 😉



  • Ich mach ne Ausbildung zum Informatikkaufmann und nicht zum Informatiker!
    Zudem hab ich jetzt oft genug dargestellt, dass euer C nicht das selbe ist wie unsers!

    Zudem, wie soll ich ankommende Tips beispielsweise von CSTOLL
    annehmen, wenn der mich als Schwänzer e.t.c. ansieht und trotz
    mehrerer Infos immer noch einen drauf setzt!

    Informationen umsetzen? Kein Problem!!!
    Aber Chinesisch an einem Tag lernen schon!

    Und das der Eine oder Andere ja angeblich schon am LESEN scheitert,
    ist eine Aussage die sich erübrigt! Da müssen wir gar nicht drüber diskutieren!

    Ich klemme mich nicht denn ganzen Tag hinter ein C Buch! Deshalb suche ich hier Hilfe! Und zwar keine destruktive!

    Wenn ihr dem nicht gewachsen seit, lass ich euch die Ruhe!

    Kein Problem..........



  • Tray schrieb:

    Ich mach ne Ausbildung zum Informatikkaufmann und nicht zum Informatiker!

    Ach so, dann ist sinnentnehmendes Lesen natürlich nicht so wichtig.

    Tray schrieb:

    Zudem hab ich jetzt oft genug dargestellt, dass euer C nicht das selbe ist wie unsers!

    Es gibt nicht "euer" und "unser" C. C ist standardisiert. Und nur nebenbei: Hier ist C++, nicht C.

    Tray schrieb:

    Zudem, wie soll ich ankommende Tips beispielsweise von CSTOLL
    annehmen, wenn der mich als Schwänzer e.t.c. ansieht und trotz
    mehrerer Infos immer noch einen drauf setzt!

    Geht's noch? Leg dir mal ein dickeres Fell zu. Nimmst du Hilfe nur an, wenn sie in Wohlfühlpädagogik verpackt daherkommt? Armer Tray, das erklären wir dir jetzt noch mal ganz ganz langsam.

    Tray schrieb:

    Informationen umsetzen? Kein Problem!!!

    Offenbar doch. Zeig doch mal deine Umsetzung von CStolls Tip.

    Tray schrieb:

    Ich klemme mich nicht denn ganzen Tag hinter ein C Buch! Deshalb suche ich hier Hilfe! Und zwar keine destruktive!

    Naja, wenn du zeigst, dass du konstruktive Hilfe nicht umsetzen kannst, dann ändert sich der Ton halt.

    Tray schrieb:

    Wenn ihr dem nicht gewachsen seit, lass ich euch die Ruhe!

    Du hast eine Schnallbremse. Zu "seit" sage ich jetzt mal nichts 😉



  • Wenn du einen SINN erkennen würdest, hättest du folgendes von mir aufgenommen:

    "Aber Chinesisch an einem Tag lernen schon!"

    Sorry, dass ich nicht bis tief in die Nach und das ganze Wochenende "voll cool" durch am Rechner sitze und mir dieses Zeug eintrichtere! Deshalb mich ich mir eure Destruktivität nicht gefallen lassen!

    Jeder hat seine Stärken, deine MFK scheinen wohl in der Ironie und im Saddismus und Sarkasmus zu liegen!

    Zudem sagt man umgangssprachlich immer C! Das ich in nem C++ Forum bin, habe ich auch gemerkt, das hat man mir pädagogisch beigebracht!

    Sind wir jetzt hier um uns zu zoffen?

    Ist ne schöne Zeitbeschäftigung! Hat übrigens überhaupt keinen Pädagogischen "Wohlfühl-" Wert!

    Ich würde eher auf Neurologischen Psychoterror tippen!

    Aber armer kleiner MFK! Du kennst es ja nicht anders! Oder?

    Noch ne rhetorische Frage:

    Zufrieden mit deinem Leben? Glaube ich nicht, sonst würdest du deine Wut und hass nicht an einem Unwissenden ablassen!

    Ist vielleicht auch besser so, dass du erst mal nichts mehr sagts, sonst hört das nie auf!

    Ich mach euch nen Vorschlag:

    Ich melde mich hier ab und konzentriert euch auf nicht-NOOBS!

    Okay?



  • Tray schrieb:

    Zudem, wie soll ich ankommende Tips beispielsweise von CSTOLL
    annehmen, wenn der mich als Schwänzer e.t.c. ansieht und trotz
    mehrerer Infos immer noch einen drauf setzt!

    Nur am Rande: Ich sehe dich nicht als Schwänzer an, nur als extrem lernresistent 😉 (was du in der Schule machst, kann ich nicht beurteilen - aber von den Tips, die hier schon gekommen sind, ist scheinbar noch nichts bei dir angekommen)

    Ich klemme mich nicht denn ganzen Tag hinter ein C Buch! Deshalb suche ich hier Hilfe! Und zwar keine destruktive!

    Wenn du erwartest, daß wir dir deine Programme schreiben, bist du im falschen Board gelandet (du kannst gerne dein Taschengeld des Monats zusammenkratzen und im Projekte-Board bieten, damit jemand deine Hausaufgaben für dich macht - mit etwas Glück findest du jemanden, der das Geld nötig hat). Ich hoffe immer noch, daß du in der Lage bist, mit einigen Hilfestellungen selber etwas zu fabrizieren.



  • Ich habe nie verlangt, dass mir hier jemand die Programme schreibt!!!!

    Zudem leben wir in der falschen Zeit, als dass ich mir so ein beklopptes pseudo Hausaufgaben geschehen leisten könnte!

    Ich kann aber trotz allem respekt vor Unwissen verlangen und die Tips nehme ich von allen war. Ich habe immer nachgefragt, falls ich in den Tips nichts verstanden habe! Und was soll ich tun, wenn die Ausbildung unser C++ vorgibt und keine anderen Lösungen annimmt!

    Zudem, wie soll ich noch erklären, dass ich die meisten Begriffe von euch nicht kenne? Das ist einfach chinesisch!!!


Anmelden zum Antworten