Wie eine Entscheidung zu treffen, ohne eine if-Anweisung
Ich bin dabei, einen Kurs in Java und wir haben noch nicht offiziell gelernt, wenn Aussagen noch. Ich studierte und sah diese Frage:
Schreiben Sie eine Methode namens zu bezahlen, akzeptiert zwei Parameter: eine reelle Zahl für eine TA-Gehalt, und eine ganze Zahl für die Anzahl Stunden die TA gearbeitet in dieser Woche. Die Methode soll zurückgeben, wie viel Geld für die TA. Zum Beispiel den Anruf zahlen(5.50, 6) sollte die Rückkehr 33.0. Der TA erhalten sollten, die "überstunden" bezahlen das 1,5-fache der normalen Lohn für alle Stunden über der 8. Zum Beispiel den Anruf zahlen(4.00, 11) zurückgeben sollte (4.00 * 8) + (6.00 * 3) oder 50,0.
Wie lösen Sie dies ohne Verwendung von if-Anweisungen? Bisher habe ich dieses, aber ich bin stecken geblieben auf regelmäßige Bezahlung:
public static double pay (double salary, int hours) {
double pay = 0;
for (int i = hours; i > 8; i --) {
pay += (salary * 1.5);
}
}
- Wenn Sie bereits gelernt haben loops, aber nicht, wenn-Aussagen (was schon seltsam ist, btw), die Sie verwenden können
for(; condition; ) { …; break; }
wieif (condition) { … }
- Recht, wenn das soll ein Rätsel sein mit dem Frager die Hände gebunden, dann ist das ein guter Weg, um zu lösen, Sie innerhalb der Regeln. Wenn es nicht sein soll, dass Art von puzzle -, dann, ohne zu wissen, was vermittelt worden ist, ich bin ein bisschen ratlos, herauszufinden, welche Antwort der Fragende Lehrer, der erwartet wird. Hoffentlich ist es nicht. Es gibt einige gute Vermutungen in die Antworten 🙂
- Ich bin mir nicht sicher, was all die Aufregung ist nicht mit einem
if
- Anweisung. Ich sehe die Frage und denken: Warum sollte ich einenif
, dass nur mein code länger/komplizierter. Wenn ichif
ich effektiv neu erstellenmin
undmax
. Diese Art der Berechnung ist, wasmin
undmax
sind für. In vielen Situationen (z.B. ein Arbeitsblatt), diese sind auf jeden Fall die bevorzugte Lösung. - Ich habe eine harte Zeit, herauszufinden, warum jemand würde Fragen, dies zu lösen, ohne zu erklären
if
, doch mit erklärtfor
Schleifen und Funktionen (mit Argumenten). Warum nicht erklären, der mehr grundlegende Dinge zuerst? Rätselhaft. - Haben Sie nicht nur vermissen einen Vortrag? Schleifen, bevor ifs sind Sie sicher, dass seltsam.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Vermeiden Sie die direkte Verwendung der Flusskontrolle Aussagen wie
if
oderwhile
können SieMath.min
undMath.max
. Für dieses spezielle problem mit einem loop nicht effizient wäre entweder.Können Sie technisch verwenden Sie eine if-Anweisungen oder das äquivalent, aber so tun, viele andere standard-Bibliothek ruft Sie schon:
Da hast du benutzt eine for-Schleife, hier ist eine Lösung nur mit zwei for-Schleifen.
Diese Summen die Gehälter für die regulären Stunden bis zu 8, und addiert das Gehalt für die überstunden, in denen die überstunden bezahlt werden, bei 1,5 * Gehalt.
Wenn es keine überstunden, die zweite for-Schleife wird nicht mehr betreten werden und wird keine Wirkung haben.
i < hours && i < 8
in die erste Schleife undsalary * 1.5
im zweiten klarer wäre.final double overtimeSalary = salary * 1.5;
vor der zweiten Schleife und nutzen, dass man, statt über die Multiplikation mit jeder Schleife.Gibt es ein paar Möglichkeiten, wie Sie Vorgehen können, aber es ist schwer zu wissen, was erlaubt ist (wenn Sie nicht selbst verwenden
if
).Ich würde empfehlen, mit einem
while
Schleife:Der Grund, warum dies funktioniert, ist es verringert Ihre
hoursWorked
auf einen Wert, der garantiert wird, weniger als oder gleich8
(vorausgesetzthoursWorked
undsalary
sind beide größer als0
). WennhoursWorked <= 8
, dann wird es nie geben Sie diewhile
Schleife.while
- Schleife ist im Grunde eine if-Anweisung, nur mit einem Sprung wieder am Ende. Sie könnte auch tun:int otherHours = hoursWorked - 8; while(otherHours > 0) { pay += otherHours * salary * 1.5; break; } ...
if
in diesen Antworten. Gibt es nicht richtig Antwort, aber diese Arten von Fragen sind nur versuchen, um Sie kreativ zu sein, mit anderen Ansätzen.Wenn Sie wirklich wollen, zu bekommen, hacky, Sie könnte verwenden von bit-Operatoren:
Also im Grunde, wenn
otherHours
negativ ist, sollte es nicht zu viel bezahlen. Wir tun dies, indem Sie das Vorzeichen-bit derotherHours
und verschieben Sie ihn nach least significant bit (mit 0-padding) bedeuten entweder 1 oder 0. Nach ersten negieren (wenn Vorzeichen-bit 1 ist, wird Multiplikator sollte 0 sein).Wenn Sie multiplizieren Sie diese mit
otherHours
es wird0
in dem Fall sind es weniger als 8 Stunden, so dass Sie nicht versehentlich abziehen, alle zahlen, wenn Sie die Letzte Berechnung.Nur für das Protokoll, hier ist eine Lösung, die ganz in der Nähe, wo Sie gestoppt wurden :
Können Sie einfach ein ternärer operator
?:
:— zahlen ein standard Gehalt für die ganze Zeit gearbeitet, plus 50% für die Zeit über 8 Stunden (wenn überhaupt).
Einem Guss zu
int
können missbraucht werden für diesen Zweck.Beachten Sie, dass die Funktion
ist zwischen 0 und 1 (exklusive) für
0 <= x < 8
und zwischen1
und1.2
fürx >= 8
. Gießen Sie diesen Wert aufint
Ergebnisse0
fürx < 8
und in1
fürx >= 8
.Dies kann verwendet werden, in die Berechnung des Ergebnisses:
Hier ist ein Weg, es zu tun mit
truncation from integer division
, etwas, das Sie wahrscheinlich gelernt haben, die beim start von java-Kurse. Im wesentlichen die Lösung ist ein Einzeiler, die nichtif
,loops
,comparisons
,libraries
.Einer Lösung, welche nicht mit den bedingten(implizite oder explizite)
Praktisch, Sie brauchen, um zu berechnen
hours * rate
aber wenn du die überstunden dann müssen Sie einen bonus von der formovertime_hours * overtime_rate
in pseudo-code:
wo
Also nehmen wir an, wir haben (17 Stunden, 4 Gehalt)
17-8=9 überstunden
9*4*1.5 + 8*4 = 9*6 + 32 = 54 + 32 = 86
hours
war weniger als 8, Sie würde sich negativ viel bezahlen.Konnten Sie schöpferisch nutzen einer while-Anweisung als eine if-Anweisung
Viele gute und effizienter Antworten bereits, aber hier ist eine weitere einfache Möglichkeit, mit Hilfe einer while-Schleife und der ternäre operator:
Mit
tanh
zu entscheiden, ob diehours
sind unten8
oder nicht:Den
decider
Variablen ist 0, wennhours
ist weniger als 8, sonst 1. Die Gleichung enthält im Grunde zwei Teile: der erstehours * (1 - decider)
wäre fürhours < 8
, und(8 + (hours - 8) * overtimeCompensation) * decider
wennhours >= 8
. Wennhours < 8
, dann1 - decider
1 unddecider
0 ist, ist also die Gleichungen ersten Teil. Und wennhours >= 8
,1 - decider
ist 0 unddecider
1 ist, also das Gegenteil passiert, der erste Teil der Gleichung ist 0 und die zweite mit 1 multipliziert.public static double-zahlen (double Gehalt, int Stunden) {
Können Sie ternären operator.
public static double pay(double salary, int hours){
//get the salary and hours
return hours>8?(1.5*hours-4)*salary:hours*salary;
}
Einige Programmiersprachen mit expliziter pattern-matching-Funktionen. So zum Beispiel in XSLT, eine bestimmte Vorlage wird ausgelöst, wenn der Knoten verarbeitet wird, entspricht einem bestimmten XPATH-Abfrage, die besser als andere Vorlagen in Ihrem Programm.
Diese Art von "deklarative" Programmierung ist eine Abstraktionsebene höher als das, was Sie in Java, aber Sie haben noch die Schalter - Anweisung, die Ihnen die Fähigkeit zu Steuern Sie Ihre Strömung mit einer "matching" - Ansatz, anstatt durch explizite if-else-Konstrukte.
Having said that, für Ihr Beispiel, was Sie wirklich tun müssen, ist eine if-Anweisung. Die
switch
Ansatz funktionieren wird, aber es ist ein bisschen gekünstelt.In Tsql
DECLARE @Menge float = 4.00
@STD int = 11
DECLARE @int überstunden
@overeight bit
SET @overeight = ((@h/8) ^ 1)
SET @überstunden = CEILING((@hrs%8) /((@hrs%8) + 1.0)) * ~@overeight
--SELECT @STD * @Menge
SELECT ((@hrs-(@hrs - %8 * ~@overeight)) * @Menge) + ( @überstunden * (@hrs - %8 * (@amount * 1.5)))
(von Valentin oben)