C++ Umrechner ohne if, case Operatoren)?
Folgende Aufgabe: Gegeben seien 3 Berechnungsformeln für unterschiedliche Werte. Diese können z.B. ein Wechselkursrechner oder ein Rechner von Celcius zu Fahrenheit sein. Der Benutzer macht 2 Eingaben. 1. Eingabe ist der Wert der umgerechnet werden soll und der 2. Wert ist quasi der Auswahlwert (welcher auf bei if, else oder case verwendet werden könnte). Je nachdem ob ich 1, 2 oder 3, als Auswahlwert nehme, soll das Programm eine andere Umrechnungsformel nehmen.
Ich habe Tipps bekommen, mit denen man die Aufgabe eigentlich einfach lösen kann aber ich schaffe es einfach nicht und hänge hier seit Stunden rum. Ich bin froh Informatik bald abwählen zu können. Ich bitte um Hilfe. Es dürfen nur die Grundrechenart Operatoren verwendet werden.
Der Tipp bzw. Ansatz aus dem Internet:
Sei X die Auswahl den Benutzers und Y der umzurechnende Wert. Dann musst du in deinem Programm etwas haben, das ungefähr folgende Form hat:
ergebnis = f1(X)*Formel1(Y) + f2(X)*Formel2(Y) + f3(X)*Formel3(Y)
Jetzt musst du dir eine Funktion f1 ausdenken, die genau dann 1 ist, wenn X=1 ist, und 0 sonst. Ebenso muss f2 immer 0 sein außer bei X=2, usw.
Darf man Arrays verwenden?
Leider auch nicht
3 Antworten
Wenn wirklich alles außer den Grundrechenarten verboten ist, bleibt Dir kaum was anderes übrig als eine Funktion zu basteln, die für einen speziellen Wert 1 ergibt, und sonst immer 0. Aber statt drei Funktionen f₁, f₂ und f₃ reicht eine für den Wert 0:
/** liefert 1, wenn x==0, und 0 sonst.
*
* Zum Prüfen auf x==C ruft man is0(x-C) auf.
**/
int is0 ( int x )
{
// leider verboten:
// return x==0;
// funktioniert _nur_ für -2≤x≤+2:
// return (x-2)*(x-1) * (x+1)*(x+2) / 4;
// funktioniert für jedes x, nutzt aber die int-Division:
return 1 / (x*x+1);
}
Die eigentliche Berechnung läuft dann so wie vorgeschlagen:
int choice = 1; // oder Benutzereingabe
double value = 42; // oder Benutzereingabe
double result = is0(choice-1) * ( /* Formel 1 */ )
+ is0(choice-2) * ( /* Formel 2 */ )
+ is0(choice-3) * ( /* Formel 3 */ )
;
Das ist allerdings ziemlich hässlich. Wenn jemand solchen Code liest, wird er auch mit Kommentaren eine Weile brauchen, bis er versteht, was hier passiert.
Mir wäre es lieber, wenn man in einem Programmierkurs lernt, lesbaren Code zu schreiben, statt mit haarsträubenden Einschränkungen gezwungen zu werden, solche ineffizienten Krücken zu verbrechen.
Zum Beispiel:
Ist etwas künstlich und geht schief, wenn andere Werte als 1, 2 und 3 benutzt werden können, löst aber die Aufgabe ;)
Jetzt musst du dir eine Funktion f1 ausdenken, die genau dann 1 ist, wenn X=1 ist, und 0 sonst.
Mein x ist das X aus diesem Tipp, was zugleich die eingegebene Zahl ist.
Ah, und wo genau muss ich die Umrechnungsformel einbauen
Bist du dir sicher, dass du den Tipp inhaltlich verstanden hast?
ergebnis = f1(X)*Formel1(Y) + f2(X)*Formel2(Y) + f3(X)*Formel3(Y)
Meine Formel ist das f1(X) in dieser Zuweisung. f2(X) und f3(X) kannst du mit ähnlichen Überlegungen konstruieren.
Ich verstehe es leider nicht. Trotzdem danke
Eigentlich ist der Tipp gar nicht so kompliziert:
Wir haben eine Umrechnungsformel für Celsius zu Fahrenheit (nennen wir sie Formel1), eine für Meter nach Fuß (nennen wir sie Formel2) und eine für Euro nach Cent (Formel3).
Wenn der User die Zahl 1 eingibt und einen Wert y, soll das Programm Formel1 auf y anwenden:
Ergebnis(1,y) = Formel1(y).
Aber wenn der User Zahl 2 eingibt, soll stattdessen Formel2 angewendet werden:
Ergebnis(2,y) = Formel2(y).
Wir müssen also eine Funktion schreiben, die Abhängig von der Usereingabe entweder Formel1, Formel2 oder Formel3 anwendet und wir dürfen kein if/switch benutzen.
Und die Idee aus dem Tipp ist jetzt einfach: Ich kann Formel1(y) auch kompliziert schreiben als:
Formel1(y) = 1 * Formel1(y) + 0 * Formel2(y) + 0 * Formel3(y).
Analog gilt:
Formel2(y) = 0 * Formel1(y) + 1 * Formel2(y) + 0 * Formel3(y),
und entsprechend:
Formel3(y) = 0 * Formel1(y) + 0 * Formel2(y) + 1 * Formel3(y).
D.h. in jedem Fall kann man das Ergebnis in der Form
Ergebnis(x,y) = a * Formel1(y) + b * Formel2(y) + c * Formel3(y)
berechnen. Nur hängen diese Faktoren a, b und c eben von der ersten Eingabe x ab:
Ergebnis(x,y) = a(x) * Formel1(y) + b(x) * Formel2(y) + c(x) * Formel3(y).
Wie wir oben gesehen haben, muss a(x) genau dann 1 sein, wenn x = 1 ist, und 0 sonst. Und eine Beispiel-Funktion, die diese Eigenschaft hat, habe ich dir mit meinem obigen f1 gegeben.
Nun brauchst du nur noch Formeln für b(x) und c(x) zu finden, um das Problem zu lösen (und dann musst du es natürlich noch in C++ Code umformen, aber das ist i.d.R. das kleinste Problem).
Dankeschön ich probiere es mal weiter. Aber wie mache ich es es für die Formel von Grad Celsius in Fahrenheit wegen der +32. wenn ich diese mit 0 multipliziere kommt trotzdem 32 raus.
Das ist der vom User eingegebene Wert. Mir ist gerade aufgefallen, dass ich die ganze Zeit die Reihenfolge der Eingaben vertauscht hatte: bei mir ist x die Auswahl der Umrechenformel und y der Wert, der umgerechnet werden soll.
Danke für die Hilfe aber ich gebe es auf. Die Umsetzung in c++ macht es mir auch schwer
Ergebnis = (Wahl == 1) ? Ergebnis1 : ((Wahl == 2) ? Ergebnis2 : Ergebnis3);
Benutzt keine case oder if/else.
Naja, dann halt:
Ergebnis = (Wahl-2)*(Wahl-3)/6*Ergebnis1 + (Wahl-1)*(Wahl-3)/3*Ergebnis2 + (Wahl-1)*(Wahl-2)/2*Ergebnis3.
Das ist aber maximal unschön, da immer alle Ergebnisse berechnet werden müssen.
Und: Schreibe doch nächstens einfach die Aufgabe vollständig hin, dann wird das mit dem Beantworten einfacher.
Danke für die Antwort. Wofür steht das Ergebnis 1, Ergebnis 2 etc. genau?
Was in einer anderen Antwort "Formel1(x)", "Formel2(x)" und "Formel3(x)" genannt wurde.
Pass bitte auf, wenn du Lösungen einfach nur abschreibst. Ich habe den Eindruck (der ungerechtfertigt sein könnte), dass du die Antwort nicht wirklich verstehst.
Dankeschön. Steht x für die eingegeben Zahl?