C Operator einlesen

Jinjay95

Cadet 2nd Year
Registriert
Jan. 2015
Beiträge
20
Hallo

Wie liest man in C ein Operator ein den der Anwender selbst entscheiden darf welcher das sein kann?
Ich würde gerne ein Minitaschenrechner durch switch & case programmieren.

Beispiel:

Code:
	system("CLS");
	float Zahl1, Zahl2;
	float op;
	
	printf("Dies ist ein Minitaschenrechner, bitte geben Sie ihr Operator an:\n")
	printf("\n\tHinweis:");
	printf("\n\tGeben Sie ein + ein um zu addieren.");
	printf("\n\tGeben Sie ein - ein um zu subrahieren.");
	printf("\n\tGeben Sie ein * ein um zu multiplizieren.");
	printf("\n\tGeben Sie ein / ein um zu dividieren.");
	
	scanf("%f" &op);

Ich weiß ja nicht einmal wie man die Variable anlegt, als float, int oder was?


Gruß
 
Zuletzt bearbeitet:
Ohne dir zu nahe treten zu wollen, aber ist das dein Ernst?

Sieh dir doch erstmal die Grundlagen an, bevor du hier Fragen stellst, die per Google innerhalb von 20 Sekunden zu klären sind.

Du kannst den Operator z.B. als Zahlenwert einlesen und diesen dann abfragen.
 
Zuletzt bearbeitet:
Du du überlegst einfach was + - * / letztendlich für Datentypen sein könnten (float jedenfalls nicht).
 
Ich habe in Google die Schlagwörter "Operator in C einlesen" eingegeben und es kam nichts richtiges raus.

Du du überlegst einfach was + - * / letztendlich für Datentypen sein könnten (float jedenfalls nicht).

Dann halt eben char..
 
Guck dir mal ASCII Codes an und wie sie verwendet werden.
 
char würde sich anbieten:
Code:
char op = '+'; // Plus by default
printf("Geben Sie bitte ein Operator ein: + für Addieren, - für Subtrahieren, * für Multiplizieren, / für Dividieren.\n");
scanf("%c", &op);
switch (op)
{
    case '+':
       // Code für Addieren
       break;

    case '-':
       // Code für Subtrahieren
       break;

    case '*':
       // Code für Multiplizieren
       break;

    case '/':
       // Code für Dividieren
       break;

    default:
       printf("Operator ungültig!\n");
       break;
}
 
Sculletto schrieb:
char würde sich anbieten:
Code:
char op = '+'; // Plus by default
printf("Geben Sie bitte ein Operator ein: + für Addieren, - für Subtrahieren, * für Multiplizieren, / für Dividieren.\n");
scanf(%c, &op);
switch (op)
{
    case '+':
       // Code für Addieren
       break;

    case '-':
       // Code für Subtrahieren
       break;

    case '*':
       // Code für Multiplizieren
       break;

    case '/':
       // Code für Dividieren
       break;

    default:
       printf("Operator ungültig!\n");
       break;
}

Na das ist doch mal eine Antwort die man sich erhofft, danke!
 
Wenn du gut und erfolgreich programmieren willst, müssen dir solche "Ideen" von alleine kommen. Wenn du dir nur helfen lässt, lernst du nicht viel. Deshalb bekommst du hier meistens auch nur Denkanstöße.
Ist nicht böse gemeint, sondern eher ein gut gemeinter Rat.
 
Fellor schrieb:
Wenn du gut und erfolgreich programmieren willst, müssen dir solche "Ideen" von alleine kommen. Wenn du dir nur helfen lässt, lernst du nicht viel. Deshalb bekommst du hier meistens auch nur Denkanstöße.
Ist nicht böse gemeint, sondern eher ein gut gemeinter Rat.

Ich habe aber durch das Beispiel festgestellt das man Operatoren ebenso in Switch & Case sowie als Char angeben kann, dadurch habe ich wieder etwas gelernt und weiß nun in zukunft wie ich es hin bekomme.
Es gibt verschiedene Lerntypen, ich lerne sehr gut indem ich mir das Beispiel anderer anschaue und dann bisschen damit rum teste.
 
Du musst aber lernen diese Beispiele selber zu finden. Denn geben tut es sie zu Hauf im Internet. Wenn du schon für so was einfaches einen Thread eröffnen musst um an deine Bsp zu kommen wird das nichts
 
Ich habe es mit mehreren Schlagwörtern probiert und bin nicht fündig geworden, durch einen Thread habe ich nun so ein Beispiel erhalten und habe das was ich wollte.
 
Jinjay95 schrieb:
Ich habe es mit mehreren Schlagwörtern probiert und bin nicht fündig geworden, durch einen Thread habe ich nun so ein Beispiel erhalten und habe das was ich wollte.

Na ja, so speziell formuliert ist es nicht verwunderlich, daß die Suchanfrage keine guten Ergebnisse geliefert hast. Du hättest schon ein wenig verallgemeinern müssen. Letztlich wolltest du ja eigentlich bloß Text/ Strings / Zeichenketten in C einlesen. Daß es sich bei dem Textinhalt um einen arithmetischen Operator handelt, ist dabei erst mal nebensächlich.
 
Wow, Leute. Wollt ihr echt einem Programmierneuling verbieten Fragen zu stellen, nur weil er sich die Antwort auch irgendwie im Netz "zusammensuchen" könnte? Ist ja in Ordnung, wenn man jemandem erstmal nur einen Hinweis geben möchte (Wenn es funktioniert ist Hilfe zur Selbsthilfe ist ein super Konzept), aber dann gleich nen Vorwurf draus zu machen, wenn er sich nicht damit zufrieden gibt finde ich etwas übertrieben.

Wenn man bedenkt, dass es extra Funktionen gibt um Zahlen einzulesen (obwohl man diese ja theoretisch auch als ASCII Zeichenketten handhaben kann) ist es vielleicht garnicht so abwegig, zu denken, dass es so etwas auch für Operatoren geben könnte.
Genauso mag es für jemanden, der die Antwort schon kennt, offensichtlich sein, wie man die Frage stellen müsste um von Google eine passende Antwort zu erhalten, aber auch das ist etwas das man erstmal (z.B. anhand von Beispielen) lernen muss.
 
Miuwa schrieb:
Wow, Leute. Wollt ihr echt einem Programmierneuling verbieten Fragen zu stellen, nur weil er sich die Antwort auch irgendwie im Netz "zusammensuchen" könnte?
Habe hier niemandem irgendjemandem irgendetwas verbieten gesehen. Zielführende Ratschläge sind nachhaltiger, als Antworten hinzuknallen, denn das macht sehr schnell faul und hält einen davon ab, Kompetenz zu erlangen.

Solche Fragen mit etwas anderem, als Hinweisen zur Verbesserung der Recherchekompetenz zu beantworten ist unsozial und letztendlich schädlich.

€: Um eine Antwort zu geben, wie Miuwa sie gern hätte:
Lieber Herr Jinjay95: Hier findest du meinen allgemeinen Evaluator für beliebige Ausdrücke.

https://github.com/SirDzstic/libisp

Die vorliegende Implementierung nimmt S-Expressions an, kann aber leicht für arithmetische Ausdrücke mit Infixnotation abgeändert werden. Dazu den Reader (src/read.c) einfach entsprechend ändern.

LG asdfman.
 
Zuletzt bearbeitet:
Jinjay95 schrieb:
Ich habe aber durch das Beispiel festgestellt das man Operatoren ebenso in Switch & Case sowie als Char angeben kann, dadurch habe ich wieder etwas gelernt und weiß nun in zukunft wie ich es hin bekomme.
Es gibt verschiedene Lerntypen, ich lerne sehr gut indem ich mir das Beispiel anderer anschaue und dann bisschen damit rum teste.

Genau das ist es was angesprochen wurde, wenn einfach nur eine Lösung angegeben wird. Du hast nichts gelernt, oder aber du kannst es nicht richtig ausdrücken was ich nicht glaube.
Du liest weder einen Operator ein, noch kann man Operatoren als Switch & Case oder Char angeben!

Was du machst bzw. was Sculletto gemacht hat ist..

es wird ein Textzeichen eingelesen und das soll interpretiert werden. Für Textzeichen kann man in C/C++ den Typ char verwenden. Intern ist es auch nur ein Integertyp, da allen Textzeichen durch einem Code (meist ASCII) ein eindeutiger Ganzzahlwert zugeordnet werden kann. Die Switch-Anweisung kann man für Verzweigungen verwenden.
Somit wird in Sculetto zuerst ein Textzeichen eingelesen und danach geprüft was eigentlich eingegeben wurde. Anschließend können für die verschiedenen Verzweigungen seperate Befehle ausgeführt werden.
 
asdfman schrieb:
Die vorliegende Implementierung nimmt S-Expressions an, kann aber leicht für arithmetische Ausdrücke mit Infixnotation abgeändert werden. Dazu den Reader (src/read.c) einfach entsprechend ändern.
Ja, das wird sicherlich helfen wenn man gerade noch bei den absoluten Basics wie Datentypen, scanf und printf ist :freaky:
 
Kanibal schrieb:
Ja, das wird sicherlich helfen wenn man gerade noch bei den absoluten Basics wie Datentypen, scanf und printf ist :freaky:
Wie jetzt? Willst du etwa behaupten, eine umfangreiche Lösung vor die Nase gelegt zu bekommen, ohne intellektuelle Eigenleistung zu bringen, gäbe keinen Lerneffekt?
Dann würde mein Beispiel ja zu meiner Argumentation passen. Kann also nicht sein. :(
 
Jinjay95 schrieb:
Ich habe aber durch das Beispiel festgestellt das man Operatoren ebenso in Switch & Case sowie als Char angeben kann
Korrektur: das hast du nicht festgestellt. Du vermeinst es festgestellt zu haben. Festgestellt haben kannst du es nicht, da es nämlich nicht stimmt. Aus Sicht der Sprache C sind das, was du hier "Operatoren" nennst, nämlich gar keine Operatoren, sondern ganz einfache Zeichen, also Chars. Zumindest im Rahmen der von dir implementierten Einleseroutine, bei der Anwender eines der Zeichen '+', '-', '*', '/' eingeben soll.

Um Operatoren handelt es sich dabei nur in der Logik der von dir selbst definierten Sprache deines Taschenrechners, nicht in der Logik der Sprache C. Du hast also selbst eine (freilich sehr rudimentäre) Sprache definiert und implementierst durch das von dir geschriebene C-Programm einen (ebenfalls sehr rudimentären) Interpreter für diese Sprache. Dieser Interpreter bildet intern die Symbole deiner selbstdefinierten Sprache, also die Symbole '+', '-', '*', '/' auf die C-eigenen Operatoren +,-,*,/ ab, nämlich innerhalb der case-Blöcke. Nimm an, der Code für dein Programm sieht letztendlich so aus:

Code:
float operand1, operand2;
float result;
char operation;

printf("Operand 1 (Dezimalzahl):\n");
scanf("%.2f", &operand1);
printf("Operator (+,-,*,/):\n");
scanf("%c", &operation);
printf("Operand 2 (Dezimalzahl):\n");
scanf("%.2f", &operand2);

switch(operation)
{
   case '+':
       result = operand1 + operand2;
       break;

   //... andere case-Blöcke
}
Durch den case '+' Block wird das Symbol '+' deiner Sprache auf den C-Operator + abgebildet.

Anmerkung: Dass die char-Variable operation heißt und nicht operator, hat den Hintergrund, dass die meisten C-Compiler heutzutage Kombicompiler für C und C++ sind und operator in C++ ein Schlüsselwort ist, es also sein könnte, dass der Compiler meckert, wenn man eine Variable operator nennt.
Ergänzung ()

TrebuTurbo schrieb:
Genau das ist es was angesprochen wurde, wenn einfach nur eine Lösung angegeben wird. Du hast nichts gelernt, oder aber du kannst es nicht richtig ausdrücken was ich nicht glaube.
Das ist zwar richtig, dass er so nicht wirklich was gelernt hat. Aber: es hat uns gesagt wie er es verstanden hat, und hat damit deutlich gemacht, dass er es falsch verstanden ist, und vor allem, was genau er falsch verstanden hat. Dadurch wurde es möglich, ihm gezielt zu erklären, wo sein Verständnisfehler lag.

Die Alternative wäre gewesen, vorab abzuschätzen, was er vermutlich falsch verstehen würde, und eine darauf abzielende Erklärung zu schreiben. Damit hätte man aber leicht daneben liegen können, da er ja auch etwas ganz anderes hätte falsch verstehen können. Das ist eine Erfahrung, die ich schon viele Mal in Internetforen gemacht habe: man kann noch so sehr versuchen, eine Erklärung so zu verfassen, dass dem Leser das richtige Verständnis liefert, der Leser kann trotzdem immer noch etwas falsch verstehen. Deswegen ist es nützlich, erst einmal die Resonanz des Lesers abzuwarten, und dann erst auf Verständnisfehler einzugehen.
 
Zuletzt bearbeitet:
Sculletto schrieb:
Deswegen ist es nützlich, erst einmal die Resonanz des Lesers abzuwarten, und dann erst auf Verständnisfehler einzugehen.

Auf den ersten Blick ein nachvollziehbarer Ansatz. Leider sieht die Reaktion in der Realität in der überwiegenden Zahl der Fälle so aus: "Geht jetzt. Danke ihr vorauseilend gehorsamen Schnuckipupsies" (falls überhaupt eine Reaktion kommt) und 2 Stunden später gibt es einen neuen Thread, dass die nächste Idee, die er gerade hatte schon wieder nicht geht und sich selbst nach 10 Minuten Däumchendrehen keine Lösung manifestiert hat.
 
Zurück
Oben