Erst ein Wort, dann ein Zeichen einlesen

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
elec
Beiträge: 19
Registriert: Di Jul 19, 2022 2:16 pm

Erst ein Wort, dann ein Zeichen einlesen

Beitrag von elec » Do Jul 21, 2022 12:21 pm

KONTEXT: Ich bin derzeit in einem einführenden C++-Kurs. Leider war ich die meiste Zeit gesundheitlich nicht in Topform. Der Dozent ist nett und erklärt für die meisten sehr nachvollziehbar und klar. Ich denke, Ende nächster Woche, wenn der C++-Kurs endet, werde ich garantiert nicht in C++ programmieren können, weil der Unterricht in Anfangsgründen herumdümpelt.

Heute früh wurden uns zwei Aufgaben gestellt, die erste, einfachere verlangt, dass man erst ein Wort vom Benutzer bekommt, dann ein Zeichen und damit etwas macht. Obwohl ich letzte Nacht kaum geschlafen habe, habe ich die Aufgabe gelöst, IMO eher schlecht, aber es funktioniert -- fast solide.

Ich kann meine bisherige Lösung hier anhängen. Letztlich habe ich mich in so vielen Programmiersprachen schon versucht, dass ich mit jeder irgendwie etwas hinbekomme, wenn ich ein wenig Zeit habe. Aber meine Lösung ist mir verdächtig, ich halte sie für umständlich und für irgendwie grausig.

Ich bin vor allem daran interessiert, wie ein erfahrener C++-Programmierer das schreiben und wie er die Eingaben abholen würde.
Aufgabe 1 (Lernziel: String):

Schreibt ein Programm, dass erst ein Wort und dann ein Zeichen einliest. Anschließend soll eine Funktion die Häufigkeit des Buchstaben in dem eingegebenen Wort bestimmen.
BTW: Das Ergebnis wird vom Dozenten nicht angeguckt, er fragt erfahrungsgemäß höchstens, ob wir klargekommen sind. Es geht also nicht darum, dass irgendwer "meine Hausaufgaben" macht. Das wäre mir auch entschieden zu billig.
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8858
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Erst ein Wort, dann ein Zeichen einlesen

Beitrag von Xin » Do Jul 21, 2022 2:08 pm

elec hat geschrieben:
Do Jul 21, 2022 12:21 pm
KONTEXT: Ich bin derzeit in einem einführenden C++-Kurs. Leider war ich die meiste Zeit gesundheitlich nicht in Topform. Der Dozent ist nett und erklärt für die meisten sehr nachvollziehbar und klar. Ich denke, Ende nächster Woche, wenn der C++-Kurs endet, werde ich garantiert nicht in C++ programmieren können, weil der Unterricht in Anfangsgründen herumdümpelt.
Niemand kann nach einem Kurs C++ programmieren. Egal ob der 4 Wochen dauert oder oder 4 Monate.
C++ zu lernen ist eine Dauerbeschäftigung für Dekaden. Aber irgendwann wird man dafür bezahlt.
elec hat geschrieben:
Do Jul 21, 2022 12:21 pm
Heute früh wurden uns zwei Aufgaben gestellt, die erste, einfachere verlangt, dass man erst ein Wort vom Benutzer bekommt, dann ein Zeichen und damit etwas macht. Obwohl ich letzte Nacht kaum geschlafen habe, habe ich die Aufgabe gelöst, IMO eher schlecht, aber es funktioniert -- fast solide.

Ich kann meine bisherige Lösung hier anhängen. Letztlich habe ich mich in so vielen Programmiersprachen schon versucht, dass ich mit jeder irgendwie etwas hinbekomme, wenn ich ein wenig Zeit habe. Aber meine Lösung ist mir verdächtig, ich halte sie für umständlich und für irgendwie grausig.
Ich hänge Deinen Quellcode mal am Stück rein, damit man ihn sich angucken kann:

Code: Alles auswählen

#include <iostream>
#include <string>
using namespace std;

/* Aufgabe 1 (Lernziel: String):
 *
 * Schreibt ein Programm, das erst ein Wort und dann ein Zeichen einliest. 
 * Anschließend soll eine Funktion die Häufigkeit des Buchstaben in dem 
 * eingegebenen Wort bestimmen.
 */

int main() {

  string word = "";
  string tmp = "";
  char sign;
  unsigned short counter = 0;

  cout << "Bitte geben Sie ein Wort ein: ";
  getline(cin, word);  
  cout << "Bitte geben Sie ein einzelnes Zeichen, einen Buchstaben ein: ";
  cin >> tmp;
  sign = tolower( tmp.front() );

  for (unsigned int i=0; i<word.length(); i++)
  {
    if ( tolower( word.at(i) ) == sign )
      counter++;
  }

  cout << endl << "Der Buchstabe " << sign << " kommt " <<
  counter << "-mal im Wort \"" << word << "\" vor." << endl;
}
Ich finde sie jetzt nicht schlecht.
elec hat geschrieben:
Do Jul 21, 2022 12:21 pm
Ich bin vor allem daran interessiert, wie ein erfahrener C++-Programmierer das schreiben und wie er die Eingaben abholen würde.
Ich würde statt unsigned short ein size_t verwenden, was aber hier eigentlich keinen Unterschied macht.

Relevanter wäre, dass ich die For-Schleife anders formulieren würde - für jeden Buchstaben aus Wort...

Code: Alles auswählen

  for (char c : word )
    if ( tolower( c ) == sign )
      counter++;
Dieser Code drückt eher aus, was man eigentlich sagen will.

Wenn man es allerdings noch etwas etwas dreister macht, wird der Code eigentlich schlechter, aber kürzer.

Code: Alles auswählen

  for (char c : word )
    counter += tolower( c ) == sign;
Da bool in C implizit 0 (false) oder 1 (true) ist, wird hier entsprechend addiert. Es wird also auch dann addiert, wenn es nix zu addieren gibt - dafür stellt dieser Code aber keine Fragen. Im obigen Code wird nur 1 addiert, wenn auch was zu addieren ist. Dafür muss ein Vergleich gemacht werden, ob addiert werden soll. Was da (bei relevant großen Datenmengen) jetzt schneller ist, müsste man messen.

Bei einer auf Performance ausgerichteten Anwendung, würde ich das aber tatsächlich messen.
Eventuell würde ein optimiert kompiliertes Programm aber keinen Unterschied mehr machen, dann würde ich den oberen Code mit dem if bevorzugen, weil er leichter zu verstehen ist.


Was die Eingaben angeht... entweder als Aufrufparameter

Code: Alles auswählen

zaehle.exe e "Der Text"
So könnte man ein Skript schreiben und die Ausgabe vieler Aufrufen automatisch vergleichen. Wenn also jemand da was verändert, fällt das direkt in den Tests auf.
elec hat geschrieben:
Do Jul 21, 2022 12:21 pm
BTW: Das Ergebnis wird vom Dozenten nicht angeguckt, er fragt erfahrungsgemäß höchstens, ob wir klargekommen sind. Es geht also nicht darum, dass irgendwer "meine Hausaufgaben" macht. Das wäre mir auch entschieden zu billig.
Du hast Deine Hausaufgaben ja schon erfolgreich gemacht.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

elec
Beiträge: 19
Registriert: Di Jul 19, 2022 2:16 pm

Re: Erst ein Wort, dann ein Zeichen einlesen

Beitrag von elec » Do Jul 21, 2022 2:20 pm

Xin hat geschrieben:
Do Jul 21, 2022 2:08 pm
Relevanter wäre, dass ich die For-Schleife anders formulieren würde - für jeden Buchstaben aus Wort...

Code: Alles auswählen

  for (char c : word )
    if ( tolower( c ) == sign )
      counter++;
Dieser Code drückt eher aus, was man eigentlich sagen will.
Das klappt, wenn ich es richtig verstehe, weil C typischerweise einen String als Array of Chars versteht.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8858
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Erst ein Wort, dann ein Zeichen einlesen

Beitrag von Xin » Do Jul 21, 2022 3:01 pm

elec hat geschrieben:
Do Jul 21, 2022 2:20 pm
Xin hat geschrieben:
Do Jul 21, 2022 2:08 pm
Relevanter wäre, dass ich die For-Schleife anders formulieren würde - für jeden Buchstaben aus Wort...

Code: Alles auswählen

  for (char c : word )
    if ( tolower( c ) == sign )
      counter++;
Dieser Code drückt eher aus, was man eigentlich sagen will.
Das klappt, wenn ich es richtig verstehe, weil C typischerweise einen String als Array of Chars versteht.
Das klappt für alle STL-Container und solche, die sich vergleichbar verhalten. Aber auch für C-Strings. In dem Fall ist es der Container std::string.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

elec
Beiträge: 19
Registriert: Di Jul 19, 2022 2:16 pm

Re: Erst ein Wort, dann ein Zeichen einlesen

Beitrag von elec » Do Jul 21, 2022 3:16 pm

Xin hat geschrieben:
Do Jul 21, 2022 2:08 pm

Niemand kann nach einem Kurs C++ programmieren. Egal ob der 4 Wochen dauert oder oder 4 Monate.
C++ zu lernen ist eine Dauerbeschäftigung für Dekaden. Aber irgendwann wird man dafür bezahlt.
Stimmt freilich. Ich habe vor der Jahrtausendwende 2 Jahre intensiv mit Allegro C, einem bibliographischen Datenbanksystem gearbeitet, und habe das am Ende auch einmal erfolgreich unterrichtet. Der Dozent, bei dem ich in dieser Zeit einen umfassenden Microsoft-Office-Kurs gemacht hatte, hatte mich einfach bei der IT-Schule vorgeschlagen, weil er merkte, dass ich im Stoff stehe, täglich, intensiv damit arbeite. Damals habe ich beim Abendbrot 22-seitige Ausdrucke von Import- oder Export-Scripten gelesen und dann am Ende eine umfassend optimierte Version geschrieben.

Leider hat man in Deutschland in Bibliotheken als Quereinsteiger, selbst wenn ein Spezialist einem vielleicht beste Referenzen ausgestellt hat, keine Chance. Wenn man nicht mindestens Bibliothekswissenschaften oder Informatik studiert hat, lassen die auf Dauer höchstens zu, dass man die Regale auswischt.

Ähnlich bei Corel Photo Paint, mit dem ich mich einige Jahre lang sehr intensiv beschäftig habe, um es eventuell nebenher unterrichten zu können. Ein VHS-Kurs, den ich dann mal zu dem Thema besucht habe, einfach, um unter halbwegs gleich interessierte Leute zu kommen, wurde von einem routinierten Berufschullehrer geleitet, der zwar sympathisch und didaktisch geschickt war, aber von Corel Photo Paint nur begrenzt Ahnung hatte. Immer, wenn er etwas nicht wusste, sagte er steroetyp: "Aber Photoshop kann das."

Einmal erklärte er, dass Photo Paint etwas nicht könne, Photoshop aber "selbstverständlich" doch; er habe sogar einen Freund, der Corel Photo Paint an der Universität unterrichtet, einmal danach gefragt. Ergebnis: Photo Paint könne das nicht. Ich meldete mich und gab ihm zwei einfache Bedienhinweise mit dem Ergebnis, dass Photo Paint das offensichtlich konnte und es darin sogar besser umgesetzt ist als in Photoshop. Als ich das meinem ältesten Freund -- Wir kennen uns aus der ersten Klasse und er ist Altgeselle in der Orthopädieschumacherei. -- erzählte, hielt er kurz inne, und sagte wie eigentlich fast immer, etwas Grundsolides und Vernünftiges: "Weißt du, was der Unterschied ist? Der unterrichtet das nur; aber Du arbeitest damit." Volltreffer. ;-)

nufan
Wiki-Moderator
Beiträge: 2557
Registriert: Sa Jul 05, 2008 3:21 pm

Re: Erst ein Wort, dann ein Zeichen einlesen

Beitrag von nufan » Do Jul 21, 2022 4:00 pm

elec hat geschrieben:
Do Jul 21, 2022 12:21 pm
Ich bin vor allem daran interessiert, wie ein erfahrener C++-Programmierer das schreiben und wie er die Eingaben abholen würde.
Mein Vorschlag:

Code: Alles auswählen

auto counter = std::count(word.begin(), word.end(), sign);
In einem Anfängerkurs ist der Lerneffekt aber wesentlich geringer als bei den bisher gezeigten Varianten.

elec
Beiträge: 19
Registriert: Di Jul 19, 2022 2:16 pm

Re: Erst ein Wort, dann ein Zeichen einlesen

Beitrag von elec » Do Jul 21, 2022 5:29 pm

Hab 's ausprobiert:

Code: Alles auswählen

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;

int main() {
  string word = "Hannes";
  char sign = 'n';

  auto counter = std::count(word.begin(), word.end(), sign);
  cout << "\"" << sign << "\" kommt " << counter <<"-mal in \"" << word << "\" vor." << endl;
}

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8858
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Erst ein Wort, dann ein Zeichen einlesen

Beitrag von Xin » Do Jul 21, 2022 7:09 pm

nufan hat geschrieben:
Do Jul 21, 2022 4:00 pm
Mein Vorschlag:

Code: Alles auswählen

auto counter = std::count(word.begin(), word.end(), sign);
Angeber... :-D
Aber hast ja recht. :D
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Antworten