Hallo zusammen,
ich habe ein Programm geschrieben, welches Eingaben entgegennehmen und
diese dann auswerten soll. Die Eingabe soll z.B. so erfolgen: 2,3p;
daraufhin wird die Permutation aus 2 und 3 errechnet. Ob die Berechnung
richtig ausgeführt wird, soll erstmal nicht wichtig sein. Mir gehts in
erster Linie um eine Fehlerbehandlung die scheinbar ignoriert wird. Ich
prüfe ob die erste Zahl größer als die zweite ist, ist dies der Fall,
dann soll das Programm eine Fehlermeldung ausgeben und beendet werden.
Hier der Code, ich hoffe ihr könnt mir da helfen:
1
/*
2
Das Programm soll:
3
den Benutzer auffordern zwei Zahlen einzugeben
4
abfragen, ob die Anzahl der möglichen Permutationen oder Kombinationen berechnet werden soll
5
und schließlich das Ergebnis ausgeben.
6
7
Diese Aufgabe besteht aus mehreren Teilen:
8
Zuerst analysieren Sie die obigen Anforderungen.
9
Schreiben Sie genau auf, was das Programm tun muss.
10
11
Gehen Sie dann zur Entwurfsphase über:
12
Schreiben Sie Pseudocode für das Programm und zerlegen Sie ihn in Teilkomponenten.
13
14
Das Programm sollte auch über eine vernünftige Fehlerbehandlung verfügen:
15
Stellen Sie sicher, dass für fehlerhafte Eingaben nützliche Fehlermeldungen ausgegeben werden
Compilieren von o.g. Code liefert hier Warnungen, weil comma, semicolon
usw. in Klasse PermComb als Konstanten definiert sind und erst später
initialisiert werden. Ich habe das in private-Variablen geändert, die im
Konstruktor auf ihre Sollwerte gesetzt werden. Dann funktioniert auch
die Eingabe-Fehlerabfrage. Zudem: Wertrückgabe in PermComb::calculate()
fehlt. std_lib_facilities.h habe ich von stroustrup.com kopiert, kann
ich nicht gebrauchen wg. Fehlern, die ich nicht beseitigen kann. Für
exception handling includiere ich Header <stdexcept> und habe auch mal
in der Eingabe-Abfrage anstatt Ausgaben mit error() Ausnahmen mit throw
(char*)"Fehlermeldung" geworfen und mit catch (char *e){...} abgefangen.
Funktioniert ebenfalls. LG
Ist das eine Übungsaufgabe eines C++-Kurses?
Neben einigen Fragwürdigkeiten ist schlecht, das SRP (Single
Responsibility Principle) nicht eingehalten wird: was hat die Klasse
PermComb mit der Benutzereingabe zu tun? Nichts.
Der Kommentar im ctor
1
// entweder über die Memberinitialiererliste initialisieren oder direkt hier drin, beide richtig
ist falsch, denn initialisieren macht man für primitive DT (am besten)
als in-class-initializer, oder (wie hier) in der
Elementinitialisierungsliste. Aber zuweisen (wie ctor-Rumpf als
Kommentar) ist keine Initialisierung und bei const-Membern nicht
möglich! Bei primitiven DT mag der Unterschied klein erscheinen, bei UDT
kann er gewaltig sein bis hin zu schlicht unmöglich (wenn der DT nicht
kopier-/verschiebzuweisbar ist.
Und noch ein Tipp: liefere kleinere und vollständige Beispiele, die auch
direkt so compiliert werden können, ohne weitere Files zu benötigen.
Hallo Rainer, habe es jetzt auch ohne "const" gemacht und alles im
Konstruktor initialisiert, jetzt funktioniert die Fehlerbehandlung auch,
mir ist allerdings immernoch unklar warum das mit dem "const" ein
Problem war. Wenn ich z.B. folgendes mache (siehe Code), dann
funktioniert das Programm zwar, aber der Compiler gibt Warnmeldungen
aus:
1
...
2
// Konstanten
3
constcharcomma=',';
4
constcharsemicolon=';';
5
constcharpermutation='p';
6
constcharcombination='c';
7
...
Wanrmeldung des Compilers:
"non-static data-memebr initializer only available with C++11"
Hallo Wilhelm, so in der Art, es handelt sich um eine Übungsaufgabe aus
dem Buch "Einführung in die Programmierung mit C++ - Stroustrup".
Dass die Klasse nicht sinnvoll aufgebaut ist, hat damit zu tun, dass ich
Anfänger bin und wie es aussieht Übung brauche um besser zu werden, an
dieser Stelle danke für den Hinweis, habe es mir zu Herzen genommen.
Mein Kommentar im Konstruktor ist in der Tat unsinnig, da habe ich die
Memberinitialisierungsliste mit ganz normaler Initialisierung von
Variablen gleichgesetzt. Aber ich muss Konstanten doch einen Wert
zuweisen können, wie wird das dann richtig gemacht?
Memberinitialisierungsliste scheint ja nicht zu funktionieren und wenn
ich die Konstanten sofort bei der deklaration definiere - also einen
Wert übergebe - dann bekomme ich Warnmeldungen vom Compiler...
wulga schrieb:> Aber ich muss Konstanten doch einen Wert> zuweisen können, wie wird das dann richtig gemacht?
Ups da habe ich jetzt blödsinn geschrieben, wenn ich die Konstanten nur
deklariere und dann im Konstruktor initialisiere, dann funzt es
einwandfrrei, habe es eben getestet.
wulga schrieb:> Diese Aufgabe besteht aus mehreren Teilen:> Zuerst analysieren Sie die obigen Anforderungen.> Schreiben Sie genau auf, was das Programm tun muss.>> Gehen Sie dann zur Entwurfsphase über:> Schreiben Sie Pseudocode für das Programm und zerlegen Sie ihn in> Teilkomponenten.
Dein Code sieht nicht danach aus, dass du diesen Teil der Aufgabe schon
bewältigt hast.
Mark B. schrieb:> Wozu jetzt einen zweiten Thread?
Ist nur ein wenig dumm gelaufen, in diesem Beitrag sollte nur
behandelt werden warum die Fehlerbehandlung nicht funktioniert,
letztendlich sind wir dann bei den Konstanten gelandet die ich in einem
anderen Beitrag erwähnt habe, das Problem wurde dort ja aber behoben.
Von dem her ist dieser Beitrag also abgeschlossen.
@beric
Analyse und Programmablauf mache ich im Kopf. Pseudocode macht man doch
nur wenn das Problem wirklich komplex und unübersichtlich wird? Aus
meiner Sicht alles eingehalten.