Hallo,
ich habe hier eine Übungsaufgabe:
Realisieren Sie ein Tankfüllmessgerät. Pro dm Länge(Höhe) erhäht sich
die Spannung um 0,5V.
Der Durchmesser beträgt 20 dm.
Geben Sie die Füllmenge in Liter als BCD-Wert aus.
1
V=D^2 * Pi / 4 * h
Wenn ich D einsetze kommt raus:
1
V = 400/4 * Pi * h = 314 * h
Wenn ich 5V als U_max annehme ist h_max = 10
somit gilt für V_max = 3140 Liter
Das Struktogramm dazu soll wie folgt aussehen:
1
Initialisierung
2
Messwert einlesen
3
6-Stellen nach rechts
4
*3140D
5
:1023D
6
:1000D
7
Ergebnis in A
8
:100D
9
Akku 4 Stellen nach links
10
Ergebnis mit A verodern
11
An P5 ausgeben
12
Rest :10D
13
Akku 4 Stellen nach links
14
Verodern von A und B
15
An P6 ausgeben
Meine Fragen dazu sind:
Wie kommt man auf die Zahlen?
Was berechnetman da überhaupt?
@ Fabian Tetzert (hayruh)
>Realisieren Sie ein Tankfüllmessgerät. Pro dm Länge(Höhe) erhäht sich>die Spannung um 0,5V.>Der Durchmesser beträgt 20 dm.>Geben Sie die Füllmenge in Liter als BCD-Wert aus.>V=D^2 * Pi / 4 * h
Wo sit das Problem?
>Wenn ich D einsetze kommt raus: V = 400/4 Pi h = 314 * h
Stimmt, aber viel zu einfach.
>Wenn ich 5V als U_max annehme ist h_max = 10>somit gilt für V_max = 3140 Liter
Klingt logisch.
>Das Struktogramm dazu soll wie folgt aussehen:
das ist kein Struktogramm, das ist Kauderwelsch.
>Wie kommt man auf die Zahlen?
siehe Festkommaarithmetik>Was berechnetman da überhaupt?
Was weißt du überhaupt von den Grundlagen der Programmierung?
Fabian Tetzert schrieb:> Wenn ich D einsetze kommt raus: V = 400/4 Pi h = 314 * h> Wenn ich 5V als U_max annehme ist h_max = 10> somit gilt für V_max = 3140 Liter
Schön.
Jetzt liefert aber deine 'Messwert einlesen' aber offenbar nicht die
Spannung direkt, sondern
> :1023D
als Buchteil von 1023. (Im Grunde eine Prozentrechnung. Nur nicht mit
100% sondern mit 1023% [eigentlich 1024%])
D.h. wenn dein Messwert 1023 war, dann lagen am Messeingang 5V an.
> Wie kommt man auf die Zahlen?
Ich versteh die Frage nicht.
Ganz offensichtlich wird hier mit Fix Point Arithmetik gerechnet, um
sich Fliesskomma zu ersparen.
Vereinfacht gesagt: Anstatt in Euro €2.80 plus €3.45 zu rechnen (und
dazu Fliesskomma zu benötigen), rechnet man einfach in der kleineren
Einheit Cent, und berechnet dort 280 + 345 gleich 625. Man erhält ein
Ergebnis ausgedrückt in Cent, welches man zu Anzeigezwecke wieder in
Euros verwenadelt, indem man durch 100 dividiert um das gedachte Komma
wieder an die richtige Stelle zu kriegen. Auf der Anzeige steht dann
wieder €6.25
Für den Benutzer sieht es so aus, als ob mit Kommazahlen gerechnet
wurde. Intern hat man aber nur mit ganzen Zahlen hantiert. Aber: an
geeigneten Stellen sind dann ein paar Multiplikationen bzw. Divisionen
mit 10, 100, 1000, etc. fällig. Je nachdem was gerechnet wird.
Fabian Tetzert schrieb:> Bin gerade am Durchrechnen mit 1V> 1V = 204D>> 204*3140=640560> 640560/1023=626> 626/1000=0 ???> habe ich was falsch gemacht?
Nein, stimmt schon. Rechne weiter.
200 ist ca. 1/5 von 1023. D.h. dein Ergebnis ist ca. 1/5 von 3140.
Offenbar wird das Ergebnis aber nicht in Liter ausgegeben, denn bei nur
2 Anzeigestellen wäre das recht schnell überlaufen. Das Ergebnis wird
offenbar in m^3 (Kubikmeter) ausgegeben. 1000l sind 1 m^3. Und 1/5 von
3140 ist daher weniger als 1 m^3. Circa 600 Liter, oder eben 0.6 m^3
Wenn du nur 2 Anzeigestellen hast, muss eben irgendwas auf der Strecke
bleiben.
Fabian Tetzert schrieb:> Bin gerade am Durchrechnen mit 1V> 1V = 204D>> 204*3140=640560> 640560/1023=626> 626/1000=0 ???> habe ich was falsch gemacht?
0 in A ablegen
0:100=0
0 um 4 Stellen nach links, bleit doch 0 oder nicht?
Ergebnis mit A verodern, also 0 mit 0 verodern 0
0 an P5
0:10=0
0 um 4 Stellen nach links, ist immer noch 0
Verodern bleibt 0
0 an P6
Fabian Tetzert schrieb:> 0:100=0> 0 um 4 Stellen nach links, bleit doch 0 oder nicht?
0 durch irgendwas ergibt wieder 0
Das Problem in deinem 'Struktogram' ist, das das kein Struktogram ist,
sondern ein Sauhaufen.
Da tauchen auf einmal A und B auf und kein Mensch weiß, welche Werte A
bzw. B eigentlich darstellen sollen. D.h. welches Ergebnis in A bzw.
welches Ergebnis in B abgelegt wurde und womit weiter gerechnet werden
soll.
Mit viel Phantasie kann man ungefähr erahnen, wie das ganze gedacht ist.
Allerdings auch nur, wenn man das Prinzip verstanden hat.
Und ich seh gerade, dass da 2 Ausgaben stattfinden. Einmal an P6 und
einmal an P5. D.h. du hast wohl doch 4 Ausgabestellen. Vergiss also
bitte die m^3 wieder. Die waren ein Schnellschuss, der sich mit dem
erweiterten Hintergrund von 4 Stellen als Schuss in den Ofen entpuppte.
Fabian Tetzert schrieb:> [code]> Initialisierung> Messwert einlesen> 6-Stellen nach rechts> *3140D> :1023D
Hier an dieser Stelle ist offenbar das Volumen ermittelt.
Der Rest des Codes beschäftigt sich nur noch damit, die einzelnen
Stellen zu ermitteln. Die Zahl 2487 in die Ziffern 2, 4, 8 und 7 zu
zerlegen und die geordnet in 2-er Gruppen für die Ausgabe
zusammenzubauen.
Zumindest sollte er das, wenn er korrekt geschrieben wäre. Welches
Teilergebnis in weiterer Folge dann an welcher Stelle weiter verwendet
wird, damit sich etwas annähernd sinnvolles ergibt, darfst du dir selber
raussuchen.
genau,
ich habe 4 Ausgabestellen.
In der Vorlesung habe ich das "Struktogramm" einfach abgeschrieben wegen
dem Zeitdruck, aber jetzt macht es halt keinen Sinn, wie man sieht.
Fabian Tetzert schrieb:> genau,> ich habe 4 Ausgabestellen.> In der Vorlesung habe ich das "Struktogramm" einfach abgeschrieben wegen> dem Zeitdruck, aber jetzt macht es halt keinen Sinn, wie man sieht.
Richtig. Das ist auch kein Struktogram, sondern maximal eine schnell
hingekritzelte Skizze.
Dann schreib es eben neu.
Eine 4 stellige Zahl in die 4 Ziffern zu zerlegen ist ja nicht gerade
Raketentechnik.
1
2487 / 1000 -> 2 Tausenderstelle
2
2487 % 1000 -> 487 (Rest bei der Division durch 1000)
3
|
4
+--------------+
5
v
6
487 / 100 -> 4 Hunderterstelle
7
487 % 100 -> 87
8
|
9
+--------------+
10
v
11
87 / 10 -> 8 Zehnerstelle
12
87 % 10 -> 7 (Rest bei der Division, gleichzeitig Einerstelle)
Alles was du brauchst, ist Rechnen wie in der Grundschule:
Eine Mutter hat 14 Äpfel und 3 Kinder. Wenn jedes Kind gleich viele
Äpfel kriegt, wieviele kriegt dann jedes Kind und wieviele Äpfel bleiben
der Mutter.
1
14 / 3 -> 4 Jedes Kind kriegt 4 Äpfel
2
14 % 3 -> 2 und 2 Äpfel bleiben übrig
Du hast eben nicht 3 Kinder, sondern 10 :-)
Die ganzen Divisionen aus deinem Code finden sich hier wieder. Und sogar
die, die entweder dein Dozent vergessen hat aufzuschreiben, oder die du
nicht abgeschrieben hast.
Denst du das passt so?
Initialisierung
Messwert einlesen
6-Stellen nach rechts
*3140D (Maximalwert)
:1023D (wg. 10-bit)
:1000D
Ergebnis in A
A 4 Stellen nach links
Rest in B
B:100
Ergebnis mit A verodern
An P5 ausgeben
Rest in B
B:10D
Ergebnis in A
A 4 Stellen nach links
Rest in B
A mit B verodern
An P6 ausgeben
Solange du es auf dieser Ebene beschreibst (also noch nicht zu konkret
in eine Programmiersprache gehst), würde ich ehrlich gesagt dringenst zu
der Notation raten, dass arithmetische Ausdrücke immer aus 3 'Teilen'
bestehen, die sich mit den 3 großen W-s zusammenfassen lassen:
mit Wem wird Welche operation gemacht und Was passier mit dem Ergebnis
Also irgendwas in der Form
1
A <- A / 1000
oder
1
B <- A / 100
ob du jetzt einen Pfeil benutzt um anzudeuten, an wen das Ergebnis einer
Berechnung zugewiesen wird, oder ob du schreibst
1
B = A / 100
ist eher zweitrangig. Auch die Tradition, dass das "Wohin" als erstes
(also links vom Ausdruck) genannt wird, ist nicht wirklich in Stein
gemeisselt.
Man kann auch schreiben
1
A / 100 -> B
solange nur klar ist, dass hier mit dem Inhalt von A die Division
gemacht wird und das Ergebnis dieser Division in B abgelegt wird.
Aber solche Impliziten namentlichen Erwähnungen, wie zb
1
Ergebnis in A
2
A 4 Stellen nach links
3
Rest in B
sind einfach nur ein Graus und ganz schwer und schlecht
nachzuvollziehen. Ich lese das mal so, dass A um 4 Stellen geschoben
wird (also durch 10? dividiert wird) und der Rest dieser Division in B
landen soll. So weit so gut (was passiert eigentlich mit dem Ergebnis
der Verschiebung, wird das wieder in A abgelegt?). Hier hat also die
Phrase 'Rest in B' die Bedeutung dort kommt ein Ergebnis hin, in B wird
etwas abgespeichert
Aber was ist hier?
1
Ergebnis mit A verodern
2
An P5 ausgeben
3
Rest in B
Da kommt schon wieder die Phrase 'Rest in B' vor. Aber ganz
offensichtlich hat es vorher keine arithmetische Operation gegeben. Was
ist dieser Rest, der in B gespeichert werden soll.
Oder sollte hier gar nichts in B gespeichert werden, sondern gemeint war
eigentlich: Nimm den Inhalt von B her, der weiter oben als Rest einer
Operation entstanden ist.
Nun, das weiter oben eine Operation war, deren Rest in B gespeichert
wurde, ist hier im 'Code' uninteressant. Hier wird mit dem Inhalt von B
weiter gerechnet, egal wie der entstanden ist. Maximal kann man das noch
in einem Kommentar dazugeben, um sich selbst eine Merkhilfe zu geben,
welchen erwarteten Wert den B an dieser Stelle eigentlich hat.
Fazit: Eines der um und auf in der Programmierung ist eine klare,
konsistente Sprache. Wenn du eine Phrase für einen Zweck benutzt, dann
kannst du nicht 3 Zeilen weiter dieselbe Phrase für einen anderen Zweck
benutzen.
Und sieh zu, dass in deinen Berechnungen immer klar ist, was die 3 'W'-s
sind: Wer, Was, Wohin (Wer - also mit wem, wird was gerechnet und
wohin geht das Ergebnis). Damit vermeidest du derartige Stolperfallen
(auch für dich selbst!) von vorne herein.
Eine eigene Frage?
Dieser Thread ist über 12 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.