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?
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;
}
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;
}
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.
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.
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.
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.
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.
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.
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.
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.
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:
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.
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.