C++ Umrechner ohne if, case Operatoren)?

ralphdieter  09.10.2022, 10:17

Darf man Arrays verwenden?

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 ;)


HilfeSchrei383 
Fragesteller
 08.10.2022, 20:47

Dankeschön. Steht x für die eingegeben Zahl?

0
MagicalGrill  08.10.2022, 20:48
@HilfeSchrei383
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.

1
MagicalGrill  08.10.2022, 20:56
@HilfeSchrei383

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.

0
MagicalGrill  08.10.2022, 21:11
@HilfeSchrei383

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).

1
HilfeSchrei383 
Fragesteller
 08.10.2022, 21:20
@MagicalGrill

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.

0
MagicalGrill  08.10.2022, 21:30
@HilfeSchrei383

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.

1
HilfeSchrei383 
Fragesteller
 08.10.2022, 22:13
@MagicalGrill

Danke für die Hilfe aber ich gebe es auf. Die Umsetzung in c++ macht es mir auch schwer

0

Ergebnis = (Wahl == 1) ? Ergebnis1 : ((Wahl == 2) ? Ergebnis2 : Ergebnis3);

Benutzt keine case oder if/else.


HilfeSchrei383 
Fragesteller
 08.10.2022, 23:14

== darf leider auch nicht benutzt werden

0
ShimaG  09.10.2022, 06:35
@HilfeSchrei383

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.

1
HilfeSchrei383 
Fragesteller
 09.10.2022, 12:06
@ShimaG

Danke für die Antwort. Wofür steht das Ergebnis 1, Ergebnis 2 etc. genau?

0
ShimaG  09.10.2022, 13:08
@HilfeSchrei383

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.

0