C/C++ Anfängerfrage

mazzaker

Grünschnabel
Schönen guten Tag,

studiere Informatik und bin absoluter Neuling in C.
Habe die Aufgabe bekommen einen kleinen Rechner zu programmieren. Meiner ersten Meinung nach nicht schwer nur habe ich ein kleines Problem.


Schreiben Sie ein Programm calculator.cpp, welches folgender Spezifikation entspricht:
1.1 Nach einer Eingabehilfe soll am Beginn der nächsten Zeile eine 0 (Null) ausgegeben werden.

1.2 Anschließend sollen paarweise Operator und Operand mit abschließendem <ret> eingelesen werden und
das Ergebnis berechnet und am Beginn der nächsten Zeile ausgegeben werden. (siehe Beispiel unten)

1.3 Eingabe und Berechnung sollen solange wiederholt werden, bis als Operator ein e eingegeben wird;
anschließend soll das Programm ohne weitere Aktivitäten (also auch ohne weitere Eingabe) terminieren.

1.4 Gültige Operatoren sind +, -, * und /. Die Division durch Null soll ignoriert werden. (In diesem Fall
soll eine Fehlermeldung ausgegeben und das Programm fortgesetzt werden.)
Bei Eingabe von c (für clear) soll das Ergebnis auf 0 zurückgesetzt und ausgegeben werden.
Achtung: die clear-Operation enthält keinen Operanden, also keine weitere Eingabe.

1.5 Bei Eingabe ungültiger Operatoren soll eine Fehlermeldung ausgegeben und das Programm fortgesetzt
werden.
Beachten Sie, daß bei Eingabe eines falschen Operators nach der Fehlerausgabe das "alte" Ergebnis
ausgegeben werden muß und daß der auf den falschen Operator (siehe unten %) folgende Operand
(siehe unten 3) gegebenenfalls auch als Operator zu interpretieren versucht wird.

1.6 Beachten Sie, daß hier eine typische Mehrfachentscheidung vorliegt; verwenden Sie die geeignete
Anweisung.
Beispiel: Ausgaben Eingaben
Bitte ... (e = ende)
0+3
3*5
15%3
->%: falsche Operation
15 ->3: falsche Operation
15-16
-1e

Mit dem Programm habe ich keine Probleme, nur würde ich die Eingabe verteilen, also erst Operator dann Operant, was laut Aufgabenstellung jedoch nicht gewünscht ist. Meine Frage wie löse ich das Problem am elegantesten? Dachte schon über einen String nach, finde es aber unschön gelöst.

Vielen Dank
 
Hallo,

als Vorschlag: verwende doch printf und scanf abwechselnd.

char op = 0;
int value_a = 0, value_b = 0;

printf("Bitte den Operator eingeben: ");
scanf( "%c", &op );

oder auch
printf("Bitte eine ganze Zahl eingeben: ");
scanf( "%d", &value_a );

usw...

in c++ entsprchend mit cin, cout.

Gruß
 
Dann werden sie aber nicht paarweise eingelesen. Also mir faellt auch nur das mit dem String einlesen ein. Und dann aufteilen in Operant und Zahl.
 
Hi.

Was ist daran so schlecht? Lies die komplette Zeile erstmal ein.

Dann kannst du mit sscanf(zeile, "%d %[+-*/] %d", &a, &op, &b) die Variablen befüllen.

Gruß
 
Zuletzt bearbeitet:
Erstmal Danke für deine Antwort.
Leider wäre es in deinem Beispiel so, dass ich 2 Eingaben hätte, was leider nicht (laut Aufgabenstellung) erwünscht ist. Das Programm soll später so aussehen, dass am Anfang eine 0 steht, nun gibt der Benutzer "+3" ein und drückt Enter. Dann erscheint die 3 und der Benutzer gibt "*5" ein (Enter), so erscheint in der nächsten Zeile eine 15 usw. usw..
Das Trennen der Eingabe hätte ich normal auch gemacht ist ja auch einfacher, nur wie löse ich das Problem so wie in der Aufgabe.

Zu deepthroat:
kannst du mir diese Zeile nocheinmal genauer erklären?

sscanf(zeile, "%d $[+-*/] %d", &a, &op, &b)

sscanf entspricht auch cin unter c++?
 
Zuletzt bearbeitet:
Das Programm soll später so aussehen, dass am Anfang eine 0 steht, nun gibt der Benutzer "+3" ein und drückt Enter. Dann erscheint die 3 und der Benutzer gibt "*5" ein (Enter), so erscheint in der nächsten Zeile eine 15 usw. usw..
Ah, jetzt hab ich das verstanden. (die farbige Schrift in deinem ersten Beitrag kann man aber auch wirklich schlecht lesen; und ein besserer Titel wäre gut gewesen - jede zweite Frage ist hier eine Anfängerfrage.)

kannst du mir diese Zeile nocheinmal genauer erklären?

sscanf(zeile, "%d $[+-*/] %d", &a, &op, &b)

sscanf entspricht auch cin unter c++?
Nein. In C++ würde man dafür einen istringstream verwenden.

Im Grunde ist es ja so, dass du 6 Operatoren hast (+, -, *, /, e, c).

D.h. du solltest erstmal den Operator einlesen und entscheiden was zu tun ist. Ist es ein arithmetischer Operator liest du noch den Operanden ein. Falls nicht durch 0 dividiert werden soll, führst du die Operation durch usw.

Gruß
 
So habe das Problem gelöst. Sieht recht gut aus denke ich werde es so morgen abgeben:

C++:
#include <iostream>
using namespace std;

int main()	
{
	char eingabeoperator;
	
	double ausgabeoperand = 0, eingabeoperand;


	cout << "\nFolgende Operatoren werden unterstuetzt:+-*/ c setzt die Rechnung                 zurueck und e beendet das Programm";
	
	do {
	
		cout << "\n" << ausgabeoperand;
		cin >> eingabeoperator;

		switch (eingabeoperator) {

			case '+': cin >> eingabeoperand;
				     ausgabeoperand += eingabeoperand;
				     break;

			case '-': cin >> eingabeoperand;
				    ausgabeoperand -=  eingabeoperand;
				    break;

			case '*': cin >> eingabeoperant;
				    ausgabeoperant = ausgabeoperant * eingabeoperant;
				    break;

			case '/': if (eingabeoperand == 0) {
				          cout << "\nTeilen durch 0 ist nicht gestattet";
				    }

				   else {
					cin >> eingabeoperand;
					ausgabeoperand = ausgabeoperand / eingabeoperand;
				   }
				   break;

			case 'c':	ausgabeoperand = (0);
						break;

			case 'e':	cout << "Programm wird beendet";
						break;

			default:	cout << "\nOperator nicht bekannt!";
			
		}	



	} while (eingabeoperator != 'e');
}

Vielen Dank für eure Hilfe, dieses Forum wird mich öfters sehen.
 
Zuletzt bearbeitet:
Hi.

Ja, das sieht schon ganz gut aus. Aber

1. Operand schreibt man mit d
2. die main Funktion muss int zurückgeben
3. du könntest die Kurzschreibweise für die Zuweisungen verwenden:
C++:
a += b;
// statt:
a = a + b;
4. Es ist vielleicht etwas merkwürdig, das die Eingabe ein int, die Ausgabe allerdings ein double ist..

Und bitte verwende immer die richtigen Code Tags wenn du Code postest!

Gruß
 
Zuletzt bearbeitet:
So habe es geändert. zu 1. peinlich Danke

2. Was meinst du damit

3. bin ich noch nicht so vertraut mit ;)

4. Eingabe ist jetzt auch ein double, bin aus irgendeinem nicht ersichtlichen Grund davon ausgegangen, dass nur Ganzezahlen eingegeben werden dürfen.

Sind die Codetags nicht richtig? Leider wurde beim Einfügen alle Tabs gelöscht, oder versteh ich dich falsch?
 
Du musst code mit
[ CODE] .. code ... [ /CODE]
einfuegen :D (ohne die Leerzeichen natuerlich)
Dann hast du auch formatierungen und es sieht aus wie bei deepthroat

Oder besser:
Bei java
[ JAVA] .. code ... [ /JAVA]

Bei c++
[ CPP] .. code ... [ /CPP]
 
Zurück