Folgend finden Sie einen kleinen Taschenrechner, ein typisches erstes Einsteigerprogramm!
Bei diesem Rechner sollten möglichst alle Kontrollstrukturen zu Übungszwecken verarbeitet werden.
Es handelt sich um eines der ersten typischen Übungen innerhalb einer Fachinformatiker-Ausbildung.
Aufgabenstellung:
Erstellen Sie einen Taschenrechner mit 4 Grundrechenarten und folgenden Zusätzen:
1) Bauen Sie, wenn möglich, jede Kontrollstruktur in den Programmcode ein
2) Verwenden Sie mindestens ein Unterprogramm
3) Kommentieren Sie den Quelltext ausführlich
4) Optionale Zusatzerweiterungen: Division durch 0, Plausibilisierungen, "hübsche" Ausgabe, natürliche Eingabe
// ************************************************************************************************
// Autor/en: http://www.online-vba.de - Anika Wershoven
// Verwendung der Quelltexte auf eigene Gefahr!
// Es gelten die Nutzungsbedingungen von www.Online-VBA.de!
// Original-Quelltext: www.online-vba.de/cpp_rechner2.php
// ************************************************************************************************
//Include bedeutet das Hinzfügen von Standardbibliotheken (sozusagen neue nutzbare Befehle)
#include "stdafx.h" //wurde von Mirosoft® Visual Studio Express eingefügt
#include <iostream> //wird für CIN und COUT benötigt
using namespace std; //Die normale Klassenschreibweise std::cin wird nun abgekürzt mit cin
//Funktionen und Unterprogramme
double substrahiere(double z1, double z2)
{
return z1-z2;
}
/* Wichtiger Hinweis: Diese Funktion wird im Hauptproramm nicht verwendet und
dient lediglich der Darstellung der Verwendung einer For-Schleife.
Begründung: Eine Multiplikation via einfacher For-Schleife gilt nur für positive Ganzzahlen!
Negative oder Fließkommazahlen innerhalb der Division können nicht via einer einfachen
Zählschleife berechnet werden. */
double multipliziere(double z1, double z2)
{
//return z1*z2;
double erg=0;
//int i=0; Man kann in der For Schleife eine Direktdeklaration durchführen
for(int i=0;i<=z2;i++) //Abkürzung: i++ bedeutet soviel wie i = i + 1;
{
erg+=z1; //Abkürzung: += bedeutet soviel wie erg = erg + z1;
}
return erg;
}
double dividiere(double z1, double z2)
{
return z1/z2;
}
double zahleingeben()
{
double dzahl2;
cout << "Bitte geben Sie die zweite Zahl ein: ";
cin >> dzahl2;
return dzahl2;
}
//Hauptprogramm
int _tmain(int argc, _TCHAR* argv[])
{
//Hauptprogrammablauf nach Schema EVA
//Variablendeklaration und Initialisierung
(Deklaration=Anlage;Initialisierung=Ersten Wert setzen)
bool bweiter=true; //Kennzeichnung, ob erneuter Programmdurchlauf oder Ende
int ieingabemodus=0;
char cantwort=' '; //Einzelzeichen werden mit einfachen ',
//Zeichenketten mit " Zeichen dargestellt
double dzahl1=0; //Variablen werden immer initialisiert!!!
double dzahl2=0;
char coperator=' ';
double dergebnis=0;
do //Wiederholung des Programms, bis Benutzer das Ende wünscht
{
//E-ingabe
//Begrüßung
cout << "*******************************************************\n";
// \n bedeutet ein Zeilenumbruch
cout << "Herzlich Willkommen bei meinem ersten Taschenrechner!\n";
cout << "*******************************************************\n\n";
//Wir fragen den Nutzer, ob er Einzeleingaben oder eine natürliche Eingabe machen möchte
cout << "Moechten Sie die Eingabe mit Einzelwerten (1)\n";
cout << "oder eine natuerliche Eingabe (2) vornehmen?";
cin >> ieingabemodus;
// != bedeutet ungleich/nicht gleich, && ist eine UND Verknüpfung
while (ieingabemodus!=1 && ieingabemodus!=2)
{
cout << "Bitte machen Sie eine korrekte Angabe (Moegliche Eingaben 1 oder 2): ";
cin >> ieingabemodus;
}
//Unterscheidung der 2 Eingabemöglichkeiten
if (ieingabemodus==1)
{
//Einzelwertemodus
cout << "Bitte geben Sie die erste Zahl ein: ";
cin >> dzahl1;
//Alternative Eingabe über eine Funktion / Unterprogramm
//cout << "Bitte geben Sie die zweite Zahl ein: ";
//cin >> dzahl2;
dzahl2 = zahleingeben();
//Rechenart abfragen
do
{
cout << "Bitte eine Rechenart eingeben. Moegliche Eingaben sind +, -, *, /: ";
cin >> coperator;
} while(coperator!='+' && coperator!='-' && coperator!='*' && coperator!='/');
}
else //ieingabemodus
{
//Optionale natürliche Eingabe
cout << "Bitte geben Sie die durchzuführende Berechnung wie folgt ein (5+7): ";
//Einlesen der einzelnen Eingabeströme in separate Variablen
cin >> dzahl1 >> coperator >> dzahl2;
}
//Division durch 0 abfangen
if (coperator=='/')
{
while(dzahl2==0)
{
cout << "Bitte geben Sie die zweite Zahl ein, welche keine 0 sein darf: ";
cin >> dzahl2;
}
}
//V-erarbeitung
switch(coperator) //switch: Mehrfachverzweigung, cases für die einzelnen Fälle
{
case '+':
dergebnis = dzahl1 + dzahl2;
//dergebnis = addiere(dzahl1, dzahl2); ist die alternative Berechnung
//über ein Unterprogramm bzw. Funktion über ein Unterprogramm bzw. Funktion
break; //Ans Ende der Switch Anweisung gehen,
//ohne break würden alle weiteren Anweisungen ausgeführt werden!
case '-':
//dergebnis = dzahl1 - dzahl2; ist die Standard-Berechnung im Hauptprogramm
dergebnis = substrahiere(dzahl1, dzahl2);
break;
case '*':
dergebnis = dzahl1 * dzahl2;
//dergebnis = multipliziere(dzahl1, dzahl2);
break;
case '/':
//dergebnis = dzahl1 / dzahl2;
dergebnis = dividiere(dzahl1, dzahl2);
break;
/* Das letzte break könnte man theoretisch weglassen,
da keine weiteren Anweisungen folgen!
Default technisch nicht möglich, da Plausis verhindern das ein ungültiges
Operatorzeichen eingegeben werden kann
*/
}
//A-usgabe
cout << "Ihr Ergebnis lautet: " << dergebnis << "\n"; //Verkettete Ausgabe durch erneutes <<
//Benutzerabfrage: Noch eine Runde?
cout << "Moechten Sie noch eine Rechnung durchfuehren (J/N)?";
cin >> cantwort;
while (cantwort!='j' && cantwort!='J'&& cantwort!='n' && cantwort!='N')
{
cout << "Bitte machen Sie eine korrekte Eingabe (J/N): ";
cin >> cantwort;
}
// || ist die ODER Verknüfung, Kurzschreibweise ohne {} da jeweils nur eine Anweisung if/else
if (cantwort=='j' || cantwort=='J')
bweiter=true;
else
bweiter=false;
cout << "\n";
} while (bweiter==true);
return 0; //Rückgabewert an das Betriebssystem, Programm beendet mit Rückwert 0
}