3 Fragen zu meinem Programm
-
Hallo,
ich sollte unten stehendes Programm schreiben, bei dem Strings "verwaltet" werden.
Hierzu hätte ich 3 Fragen:
1. Wie bekomme ich eine vernünftige Eingabe mit z. b. getline hin, damit ich auch mehrere Wörter eingeben kann? (siehe Bsp. ausgeklammert)
2. Wie bekomme ich den Standardkonstruktor (ausgeklammert) vernünftig hin?
3. Hättet ihr noch Verbesserungsvorschläge für mich, damit das ganze "professioneller" wird?Das Programm funkioniert in dieser Form. Compiler war der Bloodshed Dev C++.
#include <iostream> #include <stdlib.h> #include <string> #include <iomanip> using namespace std; class Stringverwaltung { private: string OrgString; string VerString; string ZwiString; public: // Stringverwaltung(); void Eingabe(); void Ausgabe(); void Wiederherstellen(); void Umdrehen(); void Ersetzen(); void Loeschen(); void Einfuegen(); void Programmende(); }; //------------------------------------------------------------------------------ //Stringverwaltung::Stringverwaltung() <<Wie geht das? //{ // strcpy (OrgString,""); // strcpy (VerString,""); // } //------------------------------------------------------------------------------ void Stringverwaltung::Eingabe() //Originalstring eingeben { cout<<"Geben Sie einen String ein: "; cin>>OrgString; //getline(cin, OrgString, '\n'); <<Wie geht das? //cin.getline(OrgString,10); <<Wie geht das? VerString=OrgString; //Veraenderter Str. = Original Str. system ("cls"); } //------------------------------------------------------------------------------ void Stringverwaltung::Ausgabe() //Menue Ausgabe Orig. Str. & Ver. Str. { cout<<setw(37)<<"String ausgeben <Originalstring: "<<OrgString<<" >"<<endl; cout<<setw(42)<<"<Veraenderter String: "<<VerString<<" >"<<endl<<endl; } //------------------------------------------------------------------------------ void Stringverwaltung::Wiederherstellen() //Teilstring = Originalstring { VerString=OrgString; system ("cls"); } //------------------------------------------------------------------------------ void Stringverwaltung::Umdrehen() //Teilstring Buchstaben umdrehen { ZwiString=""; for (int i=VerString.length();i>=0; i=i-1)//String von hinten nach vorne { //Buchstabenweiße runterzaehlen VerString[i]; //Position des Veraenderten Str. ZwiString+=VerString[i]; //Buchstabe des Ver. Str. wird } //an Zwi. Str. angehaengt VerString=ZwiString; //Ver. Str. = Umgedrehter Zwi. Str. system ("cls"); } //------------------------------------------------------------------------------ void Stringverwaltung::Ersetzen() //Ver. String durch Zwi. String ersetzen { int pos; cout<<"String: "<<VerString<<endl; //aktueller Ver. String cout<<"Geben Sie den Teilstring ein: "; cin>>ZwiString; //Ver. String ersetzten durch cout<<endl<<"An welcher Stelle soll der Originalstring durch den Teilstring " "ersetzt werden? "<<endl; cin>>pos; //Position an der Ver. Str. durch Zwi. Str. ersetzt wird VerString.replace(pos, ZwiString.length(), ZwiString); //Im Ver. String werden ab Pos hoechstens Anz=ZwiString entfernt und durch //Zwi. String ersetzt system ("cls"); } //------------------------------------------------------------------------------ void Stringverwaltung::Loeschen() //Zeichen aus Ver. String loeschen { int pos, Anzahl; cout<<"Wie viele Zeichen sollen geloscht werden?"; cin>>Anzahl; //Anzahl der Zeichen die geloescht werden sollen cout<<"An welcher Stelle soll der Originaltstring geloescht werden?: "; cin>>pos; //Position ab der Loeschen des Ver. String beginnen soll VerString.erase(pos,Anzahl); //Im Ver. String werden ab "Pos" hoechstens "Anzahl" der Zeichen entfernt system ("cls"); } //------------------------------------------------------------------------------ void Stringverwaltung::Einfuegen() //Zeichen in Ver. String einfuegen { int pos; cout<<"String: "<<VerString<<endl; cout<<"Geben Sie den Teilstring ein: "; cin>>ZwiString; //Zwi. String der eingefuegt werden soll cout<<endl<<"An welcher Stelle soll der Teilstring in den Originalstring" "eingefuegt werden? "; cin>>pos; //Position in der Zwi. String in Ver. String eingefuegt wird VerString.insert(pos,ZwiString); //Im Ver. String wird ab "Pos" der "ZwiString" eingefuegt system ("cls"); } //------------------------------------------------------------------------------ void Stringverwaltung::Programmende() { system ("cls"); cout<<"Vielen Dank fuer ihre Eingabe"<<endl; system ("Pause"); } //------------------------------------------------------------------------------ int main() { Stringverwaltung stringverwaltung; short int Auswahl; do { cout<<setw(35)<<"Stringverwaltung"<<endl; cout<<"[1] String eingeben"<<endl<<endl; stringverwaltung.Ausgabe(); cout<<"[2] String wiederherstellen"<<endl; cout<<"[3] String umdrehen"<<endl; cout<<"[4] Originalstring durch Teilstring ab Pos x ersetzen"<<endl; cout<<"[5] x Zeichen ab Position y loeschen"<<endl; cout<<"[6] Teilstring in Originaltstring ab Position x einfuegen"<<endl; cout<<"[7] Programm beenden"<<endl; cout<<"Ihre Wahl: "; cin>>Auswahl; switch (Auswahl) { case 1: stringverwaltung.Eingabe();break; case 2: stringverwaltung.Wiederherstellen();break; case 3: stringverwaltung.Umdrehen();break; case 4: stringverwaltung.Ersetzen();break; case 5: stringverwaltung.Loeschen();break; case 6: stringverwaltung.Einfuegen();break; case 7: stringverwaltung.Programmende();break; default: cout << "Achtung gueltigen Menupunkt auswaehlen"<<endl; system ("Pause"); system ("cls"); } } while (Auswahl != 7); return 1; }
-
BennyS schrieb:
1. Wie bekomme ich eine vernünftige Eingabe mit z. b. getline hin, damit ich auch mehrere Wörter eingeben kann? (siehe Bsp. ausgeklammert)
Hast du doch schon.
std::string text; std::getline( std::cin, text );BennyS schrieb:
2. Wie bekomme ich den Standardkonstruktor (ausgeklammert) vernünftig hin?
Stringverwaltung::Stringverwaltung() : OrgString( "" ) , VerString( "" ) , ZwiString( "" ) {}BennyS schrieb:
3. Hättet ihr noch Verbesserungsvorschläge für mich, damit das ganze "professioneller" wird?
Ohje... da müsstest du sehr viel ändern!

-
David_pb schrieb:
Stringverwaltung::Stringverwaltung() : OrgString( "" ) , VerString( "" ) , ZwiString( "" ) {}Aber eigentlich ist das überflüssig, da die Konstruktoren der String-Objekte ja auch aufgerufen werden...
.David_pb schrieb:
Ohje... da müsstest du sehr viel ändern!

*g*... das dacht ich auch, als ich den Code das erste Mal gesehen hab... @BennyS, hier vllt mal eine Methode 'korrigiert':
bool Stringverwaltung::Einfuegen() // Zeichen in Ver. String einfuegen { using namespace std; // Sollte man nicht in einem Header verwenden...lieber lokal cout << "String: " << VerString << endl; cout << "Geben Sie den Teilstring ein: " << flush; cin >> ZwiString; // reicht es nicht, wenn dieses Objekt Methoden-lokal angelegt wird ? cout << endl << "An welcher Stelle soll der Teilstring in den " << "Originalstring eingefuegt werden? " << flush; int iInsertPos; if(!(cin >> iInsertPos)) // Position in der Zwi. String in Ver. String eingefuegt wird return (false); // oder mit Exceptions, evtl. sogar besser // Falls Du mit Exceptions arbeitest, solltest Du hier damit rechnen, dass es hier kracht (wenn der Benutzer Mist eingibt :D ...) // Falls keine Exceptions verwendet werden, dann: try { VerString.insert(iInsertPos, ZwiString); } catch(...) { return (false); } // Auf Eingabe warten; system(...) ist murks: cin.clear(); cin.ignore(cin.rdbuf()->in_avail()); cin.get(); return (true); // wie schon gesagt, falls Exceptions verwendet, kannst Du beim Return-Typ 'void' bleiben }
-
CodeFinder schrieb:
David_pb schrieb:
Stringverwaltung::Stringverwaltung() : OrgString( "" ) , VerString( "" ) , ZwiString( "" ) {}Aber eigentlich ist das überflüssig, da die Konstruktoren der String-Objekte ja auch aufgerufen werden...
.Ja, stimmt. Ich meine aber mal gelesen zu haben das, im Falle der Objektinitialisation per Initialisationsliste, der Aufruf des Konstruktors wegoptimiert werden kann! Man würde also wahnsinnig viel Zeit gewinnen!

-
*g*, joar, das wär ein Sprint nach vorne^^...kay dann habsch nix gesagt
.
-
Hi,
erstmal danke für eure Antworten.
Nur:
Das mit getline:std::string text; std::getline( std::cin, text );funktioniert nicht, wenn ich es in mein Programm eingebe. Dann blinkt kurz die Ausgabe ""Geben Sie einen String ein: " auf, springt jedoch zum Menue zurück. Mit cin>>OrgString passiert dies nicht.
Gibt es für den Standardkonstruktor eine Möglichkeit, dass in dieser Schreibweiße:
strcpy (OrgString,"");
zu realisieren (das ist die Version, die wir in der Schule nutzen)?Den ZwiString werde ich dann lokal anlegen und nicht in der Klasse.
Was die übrigen Vorschläge angeht, muss ich erstmal noch gucken, ob ich die so überhaupt verstehe und "verkaufen" kann

-
Die str*() Funktionen sind für char-arrays gemacht, auf std::strings sollte bzw. kann man sie nicht anwenden.
Aber ich finde, dass std::strings den char-arrays vorzuziehen sind. Deswegen denke ich, du wolltest bei deiner Methode bleiben.