Nachdem ich nun einige Tage sowohl hier als auch im IRC genervt habe, möchte ich nun endlich mal ein Ergebnis zeigen.
Zur Information:
Ich arbeite seit knapp einer Woche mit c++, dies ist mein erstes Programm, wenn man von Tests der Ein und Ausgabefunktionen absieht. Ich habe das bankautomaten Thema gewählt als ich davon hier gelesen habe:
Ich hoffe auf (nicht allzu harte) Kritik und Verbesserungsvorschläge und auch darauf irgendjemandem damit weiterhelfen zu können und sei es nur als schlechtes Beispiel.
Du solltest nicht so viele gloable Variablen verwenden. Das kann man schöner lösen. Versuche möglichst lokal zu bleiben. Da du noch ein Anfänger bist, schätze ich, dass Du noch keine Klassen kennst. Sonst könnte man daraus eine wunderbare Klasse machen.
Och für eine Woche finde ich das vollkommen OK! Zwar sind die Einrückungen an manchen Stellen echt pervers, aber für einen ersten Anfang finde ich das (verhältnissmäßig) ordentlich.
Ich habs nur kurz überflogen.
Was mir sofort aufgefallen ist, ist der switch-Abschnitt ganz am Anfang. Dort steht drei mal exakt der gleiche Code. Warum nimmst du nicht die Kontonummer als Dateinamen und sparst dir die Unterscheidung im Code? Dann ist es auch ganz einfach um weitere Konten zu erweitern.
Auch der restliche Code ist teilweise mehrfach vorhanden - lagere doch das Lesen der Kontodaten in eine eigene Funktion aus, die du an den richtigen Stellen aufrufst, dann wird der Code gleich viel schlanker.
Wie freakC++ schon sagte, weniger globale Variablen. Versuch es mal ganz ohne globale Variablen.
Das feste Einbauen der vorhandenen Konten im Programm ist ziemlich unelegant, könntest du die Kontoinformationen aus einer Datei lesen?
Einigen deiner Variablennamen könnten ein paar Vokale gut tun. Lieber etwas mehr Schreibarbeit auf sich nehmen, wenn es dadurch verständlicher wird.
Etwas Schreibarbeit sparen, könntest du dir, indem du dir mal anguckst, was die Operatoren +=, -=, *= und /= machen.
kontoabf in Zeile 231 wird nirgends benutzt.
abheben und ueberweisen haben als Rückgabewert int, geben aber nix zurück.
Da beim Aufruf von abheben und ueberweisen der Rückgabewert nicht verwendet wird, vermute ich mal, dass du eigentlich void als Rückgabewert haben willst.
Ein guter Compiler kann dich übrigens auf manche dieser Sachen schon hinweisen, du musst ihm nur beibringen, dass er etwas mitteilsamer sein soll.
Zuletzt bearbeitet von SeppJ am 19:34:27 25.10.2009, insgesamt 2-mal bearbeitet
innerhalb einer Funktion ungünstig, da die Funktion dadurch stark unterbrochen wird, die Übersicht leidet und infolge dessen das Lesen erschwert wird. Ich präferiere
Dass die beiden Funktionen abheben und überweisen vom Typ int sind, hat den Grund dass ich es ursprünglich so konzipiert hatte sie die Kundennummer zurückgeben zu lassen, was sich dann aber als schwachsinnig herausgestellt hat.
Als Compiler verwende ich g++.
Der Vorschlag, das Lesen und Schreiben in eine eigenständige Funktion zu packen ist super und wird sofort umgesetzt.
Wo liegt das Problem der globalen Variablen, ich dachte dabei an den Umstand sie nicht für jeden Block neu zuweißen zu müssen.
Was heißt neuzuweisen? Du kannst Parameter verwenden oder mit Zeiger / Referenzen arbeiten (wobei Du das wahrscheinlich nocht nicht kennst).
Natürlich sind globale Variablen nicht "böse", aber es ist ein schlechter Stil, wenn der Programmierer aus Bequemlichkeit alle Variablen einfach als global deklariert.
Diese werden nämlich erst beim Programmende zerstört, es kann zu Namenskonflikten kommen (da man bei einem Programm immer ein bestimmtes Namensschema hat) und nicht die Variablen wahllos benennt.
Gewöhne dir es gleich wieder ab, nur globale Variablen zu verwenden. Ich hatte leider ein nicht so gutes Buch, weshalb dieses Forum mir letzendlich den ständigen Gebrauch von globalen Variablen wieder herausgeprügelt hat
Natürlich sind globale Variablen nicht "böse", aber es ist ein schlechter Stil, wenn der Programmierer aus Bequemlichkeit alle Variablen einfach als global deklariert.
Sie können durchaus böse sein, schliesslich hat der schlechte Stil auch einen Grund. Meist zeigen sich die Auswirkungen aber erst in grösseren Projekten und sind Anfängern daher nicht bewusst.
Globale Variablen verleiten dazu, sich keine Überlegungen mehr über modulare Programmierung und Zugehörigkeit der einzelnen Programmbestandteile zu machen. Entsprechend kann das gesamte Design darunter leiden. Eine Lösung nur aus Bequemlichkeit zu bevorzugen ist meist eine schlechte Idee. Die Vorteile sind nur von kurzer Dauer, hingegen schlagen die Probleme erst mit der Zeit hinterrücks zu.
Zu diesen gehört in erster Linie die grosse Abhängigkeit, die zwischen globalen Variablen und den deren Nutzern entstehen. Das wirkt sich einerseits negativ auf die Kompilierzeit aus, andererseits verletzt es die Kapselung. Da der Zugriff auf globale Variablen von überall (zumindest in den inkludierenden Dateien) her erfolgen kann, wird es schwierig, die Benutzung zurückzuverfolgen und Fehler einzuschränken. Je weniger Informationen eine Klasse oder Funktion über ihre Umgebung hat, desto weniger Seiteneffekte kann sie haben. Durch ein strukturiertes Design bleiben die Aufgabenbereiche lokal und sauber voneinander getrennt, was die Wartung erleichtert, da beispielsweise schnell ersichtlich ist, wo eine Änderung durchgeführt werden muss. Potenzielle Fehler haben zudem eine grössere Chance, an Ort und Stelle behandelt werden zu können.
Ich wollte mit "böse" sagen, dass es durchaus manchmal angebracht eine globale Variable zu definieren. Dann sind sie nützlich, doch sollte dies nicht zur Gewohnheit werden, denn dann werden sie "böse".
Nächstes Thema anzeigen Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben. Sie können auf Beiträge in diesem Forum antworten. Sie können Ihre Beiträge in diesem Forum nicht bearbeiten. Sie können Ihre Beiträge in diesem Forum nicht löschen. Sie können an Umfragen in diesem Forum nicht mitmachen.
c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums
für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de
Werbekostenerstattung verdient werden kann.
Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info, www.c-sar.de, www.c-plusplus.net und www.baeckmann.de
enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt
(vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in
privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden.
Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere
übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.