Vokale auslesen aus Satz bzw. Wort
-
Hallo,
habe ein Programm aus eigener Übung, zu If-/else Anweisungen und Schleifen, schreiben wollen. Also man soll ein Satz oder ein Wort eingeben und der zählt die darin enthalten Vokale und gibt die Anzahl für jenes Vokal aus.Das Programm sieht bisher so aus:
#include <cstdlib> #include <iostream> #include <string.h> #include <conio.h> using namespace std; int main(int argc, char *argv[]) { string eingabe; char vokale[10] = {'a','e','i','o','u','A','E','I','O','U'}; int vokcount[10] = {0,0,0,0,0,0,0,0,0,0}; int laenge; cout << "Bitte geben Sie einen Satz oder ein Wort ein!" << endl; cin >> eingabe; laenge = eingabe.length(); for (int i = 0;i <= 9; i++) { for (int k = 0;k <= laenge; k++) { if(vokale[i] == eingabe[k]) vokcount[i]++; } } cout << endl; cout << "Enthaltene Vokale: \n"; for (int i = 0;i <= 4; i++) { cout << vokale[i+5] << ": " << vokcount[i]+vokcount[i+5] << endl; } system("PAUSE"); return EXIT_SUCCESS; }
Jedoch klappt es bisher nur mit einem Wort und nicht mit einem Satz und wollte mal fragen woran dies liegt?
Mit freundlichen Grüßen,
chris89
-
Zum Problem:
Weilcin >> eingabe;
nur ein Wort einliest. Wenn du einen ganzen Satz, bzw. die ganze Zeile, einlesen möchtest, dann musst dugetline
verwenden:
http://www.cplusplus.com/reference/string/getline/Noch ein paar Anmerkungen zu deinem Code:
<string.h>
ist kein C++ Header und noch der falsche dazu. Du willst die C++ Strings verwenden, dann brauchst du<string>
. Um die C String Funktionen zu verwenden, heisst der Header<cstring>
.<conio.h>
ist kein C++ Header und du brauchst gar nichts von diesem Header in deinem Programm. Unnötige Header sollte man nicht einbinden.using namespace
kann gefährlich sein, passt damit bitte auf.
4. Aufstd::system
sollte man verzichten. Wieso steht hier:
http://www.c-plusplus.net/forum/viewtopic-var-t-is-39453.html
Um das automatische schliessen zu verhinden gibt es oft Möglichkeiten von der IDE aus oder man startet die Konsolenanwendung von der Konsole aus, wie es sich eigentlich gehört
Oder man schaut mal diesen FAQ Eintrag an: http://www.c-plusplus.net/forum/viewtopic-var-t-is-111042.html
Ansonsten kann man wohl den Rest so stehen lassen, da du Anfänger bist
Grüssli
-
Unabhängig von der gestellten Anfrage:
for (int k = 0;k <= laenge; k++)
muss natürlich korrekt
for (int k = 0; k < laenge; k++)
lauten, sonst greifst Du "hinter" den string!!
-
Hey,
Danke für die schnelle Antwort! Ja, daran hats gelegen klappt so. Benutze grad den Dev-C++ und der erstellt das mit std::system automatisch deswegen hab ichs erstmal stehen lassen aber danke für die hilfreichen tipps und infos.Wäre noch schön zu wissen warum denn
using namespace
gefährlich sein kann?
Könnte man denn noch was besser machen, weil du meintest da ich ein Anfänger bin kann man den rest so stehen lassen. Das hört sich so an als wenn man den Code noch effizienter machen könnte, wenn du ideen hast her damit^^ so lernt man direkt auch wie man es noch kompakter/effizienter hinkriegt. Weil hab durch die schleifen und arrays schon probiert den Code so kompakt zu machen wie es mit meinem Wissen möglich ist aber wenn du ideen hast wie es noch besser wäre es cool sowas mal zu sehen.
Nochmals Danke
MFG
chris89
-
chris89 schrieb:
Benutze grad den Dev-C++ ...
Ich verweise mal auf die Compiler/IDE FAQ:
http://www.c-plusplus.net/forum/viewtopic-var-t-is-237002.htmlchris89 schrieb:
Wäre noch schön zu wissen warum denn
using namespace
gefährlich sein kann?
Naja, überleg mal was
using namespace
macht. Es hebelt den Namensraum aus und macht ihn global. Dadurch wird der Namensraum unsinnig. Bei einfachsten Fehlern kommt es einfach zu doppelten Definitionen von gewissen Namen, also Klassen oder Funktionen.
Es gibt allerdings durchaus schlimmere Szenarien, welche allerdings zugegebenermassen eher seltener auftreten. So kann es möglichsein, dass falsche Variablen, falsche Klassen oder falsche Funktionen verwendet werden. Es wird also alles korrekt kompiliert, aber bei der Ausführung passieren plötzlich seltsame Fehler.
Auch sollte einusing namespace
niemals in einen Header rein. Überall wo man den Header inkludiert, wäre der entsprechende Namensraum global verfügbar, egal ob man dies möchte oder nicht. Programmierer, welche einusing namespace
in den Header schreiben, laufen Gefahr über kurz oder lang von anderen Programmierer getö ... eh, an einem tödlichen Unfall zu sterbenchris89 schrieb:
Könnte man denn noch was besser machen, weil du meintest da ich ein Anfänger bin kann man den rest so stehen lassen. Das hört sich so an als wenn man den Code noch effizienter machen könnte, wenn du ideen hast her damit^^ so lernt man direkt auch wie man es noch kompakter/effizienter hinkriegt. Weil hab durch die schleifen und arrays schon probiert den Code so kompakt zu machen wie es mit meinem Wissen möglich ist aber wenn du ideen hast wie es noch besser wäre es cool sowas mal zu sehen.
Es ginge nicht unbedingt um Effizienz, sondern eher um bessere Lesbarkeit. Die C++ Standardbibliothek bietet da viele viele Möglichkeiten.
Man könnte das Buchstabenzählen über eine std::map lösen. Oder ein std::count aus den Algorithmen.
Auch sollte man die Verwendung von magischen Zahlen unterlassen:
http://de.wikipedia.org/wiki/Magische_Zahl_(Informatik)#Magische_Zahlen_in_Code
http://en.wikipedia.org/wiki/Magic_number_(programming)#Unnamed_numerical_constantsEs gäbe sicher viele weitere Möglichkeiten, man müsste sich das mal genau überlegen. Dazu bin ich aber gerade ein wenig zu faul ... *hüstel*
Grüssli
-
Ah soo meintest du das, danke für die vielen tollen Infos und Anregungen um Codes besser lesbar zu machen. Super Hilfe!
Werd mir alles in ruhe mal anschaun.