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
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.