Schleifen und Verzweigungen
-
Hallo!
Ich hab ma wieder Probleme!
Also, meine Aufgabenstellung lautet:
"Erstellen Sie ein Programm in dem Sie mehrzeilig Zeichen eingeben können.
Bei diesen eingegebenen Zeichen wird die Häufigkeit von Vokalen
(a/A, e/E, i/I, o/O und u/U) gezählt und in Form eines waagerechten Balkens ausgegeben. Bei dem Sonderzeichen für den Balken benutzen Sie bitte die
ALT-Taste und im numerischen Block der Tastatur die Zahlenfolge 127 (ALT + 127)."Zudem ist folgendes vorgegeben (Also so soll es aussehen)
"DAS PROGRAMM HAT FOLGENDEN ABLAUF:
Geben Sie jetzt Zeichen ein. ==> Ende mit dem Zeichen * <==
mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm
aaaaaaaaaaaaaaaaaaaaaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
pppppppppppppppppppppppppppppppppppppppppppppppp
eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
iiiiiiiIIIIIIIIIIIII
uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
*a/A ⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂ 53
e/E ⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂ 62
i/I ⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂ 18
o/O 0
u/U ⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂⌂ 34 "Ich hab mir jetzt nicht die Mühe gemacht das "⌂" zu zählen, aber dürfte etwa stimmen.
Bitte helft mir.
MFG Tray
-
Ich habe noch die waage Vermutung, dass das Programm Ähnlichkeit mit folgendem hat:
#include<iostream.h> void main() { int breite; int hoehe; int spalte; int zeile; cout << "Das Programm erzeugt einen Rahmen variabler Groesse." << endl << endl; //----------------------------------------------------------------- cout << "Rahmenhoehe: "; cin >> hoehe; cout << endl; cout << "Rahmenbreite: "; cin >> breite; cout << endl; //------------------------------------------------------------------ // cout << '+'; // for ( spalte = 1 ; spalte < breite - 1 ; spalte ++ ) { cout << '-'; } // cout << '+'; // //----------------------------------------------------------------- for ( zeile = 1 ; zeile < hoehe - 1 ; zeile ++ ) { cout << endl << '|'; for ( spalte = 1 ; spalte < breite - 1 ; spalte ++ ) { cout << ' '; } // cout << '|'; // } //----------------------------------------------------------------- // cout << endl << '+'; // for ( spalte = 1 ; spalte < breite - 1 ; spalte ++ ) { cout << '-'; } // cout << '+'; // //----------------------------------------------------------------- cout << endl << endl; }

-
Hier mein bisheriger versuch:
#include<iostream.h> void main() { double mark_a = 1; /* double mark_e; double mark_i; double mark_o; double mark_u; double stern; */ /*-------------------------------------------------------------------------------------------------------*/ cout << "Geben Sie jetzt Zeichen ein. ==> Ende mit dem Zeichen * <==" << endl; cin >> mark_a; /* cin >> mark_e; cin >> mark_i; cin >> mark_o; cin >> mark_u; cin >> stern; if ( stern == '*' ) */ for ( mark_a ; mark_a ; mark_a ++ ) cout << "¦"; /*-------------------------------------------------------------------------------------------------------*/ }
-
Punkt 1: Als Eingabe solltest du besser string's verwenden und in einer Schleife einlesen, bis du ein '*' erhältst. Dann kannst du in den Strings durchzählen, wieviele Vokale vorkommen.
Punkt 2: Deine for()-Schleife ist sinnlos (und führt sogar in eine Endlosschleife).
-
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..........