Variablentyp float für Kommazahlenrechner


#1
Hey Leute,

ich bin erst neu in diesem Forum und habe eine kleine Frage.

Wir hatten in Informatik bisher eine Stunde mit Java und wurden von unserem Lehrer ins Nichts gestürtzt mit der Aufgabe einen Rechner für Kommazahlen zu erstellen. Die Aufgabe lautet: ,,Implementieren Sie ein Programm, dass aus der Anzahl der verkauften Flaschen den Gesamtpreis berechnet.

Gegeben ist: Ein Verkäufer verkauft eine Flasche Apfelsaft für 5€ (unrealistisch aber ja). Bei mehr als 40 gekauften Flaschen geht der Preis auf 4,50€ runter. Daneben steht ein Beispiel, wo man eine Tabelle mit 3 Rechnungen sehen kann: 12*5 = 60€ und die jeweilige Rechnung für 40 und 41 Flaschen.

Meine Frage lautet daher, ob jemand eine Ahnung hat, wie man diesen Rechner erstellen kann. Ich hab nämlich null Ahnung und im Internet habe ich bisher auch nichts dazu gefunden.

Liebe Grüße fox.
 

sheel

I love Asm
#2
Hi

wie viel Zeit hast du dafür?

Und, um dein Wissen abzuschätzen, sag uns bitte (kurz, Stichworte etc.) was ihr in der Stunde gemacht habt.
 

Technipion

Erfahrenes Mitglied
#3
Hallo foxmusic,
wie sheel schon gesagt hat wären ein paar mehr Infos hilfreich. Bitte in Zukunft immer deinen momentanen Stand mit angeben, dann können wir dir besser helfen ;)

Die Aufgabe klingt für mich nach einer klassischen Anfänger-Aufgabe. Quasi um langsam in eine Programmiersprache "rein zu kommen". Hier begegnet dir erstmals ein interessantes Konzept der Informatik: Programmiersprachen sind mehr oder weniger "nur Sprachen". Eine Sprache lässt dich einen Gedanken ausformulieren. Genau so ist es mit Programmiersprachen auch. Also ob du jetzt schlussendlich ein Programm in C++ oder Python oder Java schreibst, ist im Prinzip egal. Zuerst musst du verstanden haben, was genau du tun willst. Grundsätzlich läuft das so ab:
- Du stehst vor einem Problem und möchtest es lösen. Das kann im Grunde alles mögliche sein, z.B. einen Taschenrechner zu programmieren, ein Fahrzeug von selbst fahren zu lassen, oder ein Computerspiel zu erstellen.
- Falls dein Problem noch zu groß ist (und unlösbar erscheint), splitte es in kleinere Unterprobleme auf. Diese Häppchen sollten einfacher lösbar sein. Falls nicht, splittest du so lange weiter, bis die Probleme einfach werden (einfach heißt, du brauchst nur ein paar Stunden - oder maximal Tage - um dir eine Lösung einfallen zu lassen; sonst ist dein Problem noch zu mächtig).
- Für diese kleinen Probleme denkst du dir ein Lösungsverfahren aus - einen sogenannten Algorithmus. Das ist prinzipiell nichts anderes als ein Ablauf von Schritten, die du tun musst um dein Problem zu lösen.
- *** Bis zu diesem Punkt hatten wir noch nichts mit Programmiersprachen (und deren Logik) zu tun ***
- Dein Algorithmus ist noch relativ abstrakt (weil Menschen abstrakt denken). Du musst ihn nun in logische und mathematische Operationen übersetzen. Das was dabei rauskommt ist ein Pseudocode. In einem Pseudocode findest du Sachen wie Listen/Arrays, Zahlen, Wahrheitswerte, Funktionen, usw... (vieles davon kommt noch auf dich zu, allerdings Java-spezifisch)
- *** Bis jetzt saßen wir noch nicht am Computer ***
- Erst jetzt, wo du deinen Pseudocode ausformuliert hast (und sei es nur in deinen Gedanken), kannst du anfangen dem Computer "in der gewählten Programmiersprache zu erklären, was genau du tun willst". D.h. erst jetzt geht es in deinem Fall tatsächlich an Java.
- Als letzten Schritt lässt du deinen Code vom Computer in ausführbaren Maschinen- oder Bytecode übersetzen. Damit hast du ein ausführbares Programm, das dein Problem lösen sollte. (Falls das Programm nicht richtig läuft musst du es debuggen, aber das ist ein Thema für einen anderen Thread :D)

Wie du siehst: Das meiste hängt komplett von dir - dem Programmierer - ab. Die Maschine kommt spielt erst relativ zum Schluss des Entwicklungsprozesses eine Rolle.
Falls du dir unsicher bist was Pseudocode ist, guckst du hier: https://de.wikipedia.org/wiki/Pseudocode

Meinst du, du kannst einen Pseudocode für dein Problem entwerfen und posten? Falls ja: Super, gehen wir daran ihn in Java zu implementieren. Falls nein: Wo ist das Problem? Was ist unklar?
Wir helfen dir gerne weiter, aber wir brauchen leider mehr als nur ein allgemeines: "Wie mache ich das?"

Gruß Technipion
 
#4
Hi

wie viel Zeit hast du dafür?

Und, um dein Wissen abzuschätzen, sag uns bitte (kurz, Stichworte etc.) was ihr in der Stunde gemacht habt.
Nunja wir haben kurz mit Java begonnen und haben erstmal gelernt, dass es Klassen gibt. Und das head Zeug wie public static void main String args usw. Und dann noch was ein Scanner ist und wie eine Einlesung vom Benutzer möglich ist (zum Beispiel bitte geben Sie ihren Namen ein. Und dann kommt eine Begrüßung mit der Eingabe drinn.)
 
#5
Erstmal vielen Dank Technipion für deine Antwort. Bist du Informatiker? Du machst einen sehr seriösen Eindruck auf mich.

Nun ich dachte mir erstmal das Standard Zeug wie oben aufgeführt zu schreiben, was man braucht, um ein Programm zu starten. Ich dachte mir erstmal eine Eingabe des Benutzers zu fordern. Da hatte ich den Ansatz einen Scanner zu erstellen, was ich schon einigermaßen kann. Dann fordere ich eine Eingabe mit system.println("Irgendein Text"); das habe ich verstanden. Doch nun habe ich die Überlegung eine Zahl als Variable zu definieren. Dass heißt zum Beispiel ich sag dem Programm: ,,Hey die Zahl1 Variable soll mit 5 multipliziert werden." Dann sage ich dem Programm: ,,Aber wenn die Zahl größer als 40 ist (41, ...) multiplizierst du diese Zahl bitte mit 4.5 . Ich muss dem Rechner also sagen, dass er mit Kommazahlen rechnen muss. Und ich muss eine Bedingung (ich glaub das wird in der Informatik Bedingung: If-Else genannt) einbauen, die festlegt, dass ab der Eingabe 40 nur noch mit 4.5 multipliziert wird. Zuletzt gebe ich wieder eine system.println("Ihr Preis ist: ergebnis") wo der Preis steht.
 
#7
Also ich hab jetzt mal was in Java ausprobiert. Wie ich das nach meinem geschilderten Plan umgesetzt habe..nunja ich glaube das geht so nicht, aber die Idee ist da.

https://prnt.sc/im9fp0:


Dort findet ihr einen Screenshot von meinem geschriebenen Programm bisher.
 
Zuletzt bearbeitet von einem Moderator:

ComFreek

Mod | @comfreek
Moderator
#8
Hallo @foxmusic,

dein Plan ist schon mal sehr schön!

,,Hey die Zahl1 Variable soll mit 5 multipliziert werden."
✔ Im Code richtig umgesetzt.

Dann sage ich dem Programm: ,,Aber wenn die Zahl größer als 40 ist (41, ...) multiplizierst du diese Zahl bitte mit 4.5.
Das ist im Code noch nicht ganz richtig. Warum hast du einen else-if-Zweig für genau 41? Aus deinem Text lese ich nur zwei Fälle ab: <= 40 und > 40. Außerdem ist die Zeile im else-Zweig auch noch nicht ganz richtig: warum multiplizierst du mit 41?

Und ich muss eine Bedingung (ich glaub das wird in der Informatik Bedingung: If-Else genannt) einbauen, die festlegt, dass ab der Eingabe 40 nur noch mit 4.5 multipliziert wird.
✔ Genau so ist es! Genau so muss es der Code auch widerspiegeln ;)

Zuletzt gebe ich wieder eine system.println("Ihr Preis ist: ergebnis") wo der Preis steht.
Deinem Code sehe ich noch etwas Verwirrung zwischen den einzelnen Variablen an: wo ist der Unterschied zwischen preis, zahl1 und ergebnis? Kannst du diese drei in Worten differenzieren?

zahl1 ⇒ umbennen zu anzahlFlaschen oder requestedBottles
preis, ergebnis ⇒ zu einer Variable preis, price

Kannst du auch die jeweiligen Datentypen in Worten rechtfertigen? Warum ist zahl1 bei dir ein double? Warum preis ein float?

PS: Beim nächsten Mal bitte den Code in Textform mit Codetags posten (siehe meine Signatur). Damit bleibt der Coden permanent erhalten und es ist auch barrierefrei, etwa für Screenreader oder auch Suchmaschinen.
 
#9
Hey @ComFreek danke für deine Antwort!

Zu Beginn erstmal die Multiplikation mit 41 ist nur ein Versehen, habe da zu viel getippt.

Zu der float und dem double (Keine Ahnung wie es richtig ist). In der Aufgabe war vorgegeben, dass float = preis sein soll(anscheinend für Kommazahlen). Das mit dem double hab hat mir ein Freund gesagt, er hat in einem Taschenrechner zahl1 gedoubelt und meinte ich müsse das auch tun, was nicht so ganz stimmt.

Zu der If-Else Verzweigung. Ich hatte ausprobiert die Bedingungen wie du sie geschrieben hast, zu setzen was ohne Erfolg war. Daher habe ich eine else-if gemacht.

Ich werde gleich den Code umschreiben und spätestens gegen Mittag diesen hier posten.

Schönen Sonntag

Habe eben den Code mal überarbeitet:


Java:
import java.util.Scanner;

public class Fuchs {
 
  public static void main(String[] args) {
   
    Scanner scannerVariable = new Scanner(System.in);
    String preis = new String();
   
    System.out.println("Bitte geben Sie die Anzahl ihrer Flaschen ein");
    anzahlFlaschen=scannerVariable.nextDouble();

Ich glaube das anzahlFlaschen=scannerVariable.nextDouble(); muss noch weg, aber was kommt da hin? .nextLine?



Hier der überarbeitete If-Zweig, wo ich die Bedingung auf Zahl kleiner 41 = Multiplikation mit 5 und irgendeine andere Zahl (Größer 41 dann) mit 4,5 geändert habe.



Code:
if (anzahlFlaschen < 41) {
        preis=anzahlFlaschen*5.0f;
     
    }
     
    } else {
        preis=anzahlFlaschen*4.50f;
 
    }


Und der Schluss:


Code:
ergebnis=anzahlFlaschen*preis;
   
    System.out.println("Ihr zu zahlender Betrag beträgt " + ergebnis);
   
  }
 
}



 
Zuletzt bearbeitet:

ComFreek

Mod | @comfreek
Moderator
#10
zu setzen was ohne Erfolg war.
Für die Zukunft: Bitte immer den Fehler nennen. :rolleyes:

Ich glaube das anzahlFlaschen=scannerVariable.nextDouble(); muss noch weg, aber was kommt da hin? .nextLine?
Warum glaubst du das? Es ist nämlich richtig so ;) (Nicht ohne Grund habe ich oben oft nach deinen Begründungen für die Typen oder Verzweigungen gefragt. Dann gibt es nämlich kein 'glauben' mehr, sondern nur definitive Aussagen über den Code. Mir persönlich hilft diese Methode auch sehr oft.)

In der Aufgabe war vorgegeben, dass float = preis sein soll(anscheinend für Kommazahlen). Das mit dem double hab hat mir ein Freund gesagt, er hat in einem Taschenrechner zahl1 gedoubelt und meinte ich müsse das auch tun, was nicht so ganz stimmt.
Für Kommazahlen kannst du float (einfache Genauigkeit) oder double (doppelte Genauigkeit) einsetzen. Behalte im Hinterkopf, dass man in der realen Welt für Währungseinheiten aufgrund von Rundungsfehlern vielleicht weder float noch double einsetzen möchte.

ergebnis=anzahlFlaschen*preis;
In preis hast du doch bereits anzahlFlaschen hineinmultipliziert. Darauf wollte ich oben mit Folgendem anspielen:
Deinem Code sehe ich noch etwas Verwirrung zwischen den einzelnen Variablen an: wo ist der Unterschied zwischen preis, zahl1 und ergebnis? Kannst du diese drei in Worten differenzieren?
 
#11
@ComFreek Dankeschön! Ich hab auch den glaube, dass der Rechner funktioniert, weil meine Motivation mir sagt ich schaffe das. Es ist nur die Unsicherheit da ich erst neu bin.

Ich habe ja die Anzahl der Flachen in den Preis hineinmultipliziert ja, aber xD brauche auch ein Ergebnis was den Gesamtpreis anzeigt. Heißt es dann ergebnis=preis ? Eig ja weil der Preis in der Verzweigung Bedingungen hat und mit dem jeweiligen Faktor multipliziert wird. Sonst ist alles richtig da bin ich mir eig sicher.
 

ComFreek

Mod | @comfreek
Moderator
#12
Heißt es dann ergebnis=preis ?
So würde dein Programm korrekt funktionieren, sehr schön! Jetzt erkenne ich, warum du überhaupt zwei Variablen hast: Konzeptionell hast du zwar zwei verschiedene Begriffe (Preis und Ergebnis), aber programmiertechnisch brauchst du nur eins von denen, denn der Preis ist das Ergebnis. Zwei Variablen dafür zu verwenden ist kein Hals- und Beinbruch, ich würde empfehlen, immer die Variante zu nehmen, die leserlicher ist.
Bei deinem Code ist es für die meisten Programmierer wohl leserlicher, nur eine Variable zu nehmen. Es mag durchaus Situationen bei komplizierteren Algorithmnen geben, wo der Einsatz mehrere Variablen die Lesbarkeit sehr stark erhöht.
 
#13
@ComFreek Dass heißt ich nenne meine Variable Ergebnis. Und daraufhin schreibe ich ergebnis=anzahlFlaschen*Ergebnis? Richtig?

Und ja das sagt unser Informatik Tutor immer, dass wir ebenfalls alles gerade rücken sollen damit es übersichtlicher ist.
 

ComFreek

Mod | @comfreek
Moderator
#14
Und daraufhin schreibe ich ergebnis=anzahlFlaschen*Ergebnis? Richtig?
Warum *Ergebnis? Was steht vorher in Ergebnis?

Und ja das sagt unser Informatik Tutor immer, dass wir ebenfalls alles gerade rücken sollen damit es übersichtlicher ist.
Das meinte ich zwar nicht, aber ja, das ist auch sinnvoll. Idealerweise verwendet man einen Editor, der bei Enterdruck und Klammern automatisch einrückt, sodass uneingerückter Code gar nicht erst entstehen kann. Tut er das doch mal, nutzt man eben Autoformat ;)
 

ComFreek

Mod | @comfreek
Moderator
#16
Du könntest die Dinge auch einfach mal ausprobieren. Das Tolle an Software ist, dass du sie immer wieder neubauen und ausführen kannst.