Seite 2 von 14
Verfasst: Mittwoch 13. Mai 2009, 14:28
von OverNord
Aufgeben, so lernt man es am besten.
Verfasst: Mittwoch 13. Mai 2009, 14:35
von numerix
KlaliB hat geschrieben:ich sags einem freund au smeinem kurs einfach das ers machen soll
Geniale Idee. Hättest du gleich so machen sollen ...
Verfasst: Mittwoch 13. Mai 2009, 15:18
von BlackJack
Ich habe gerade folgendes auf meinem C64 gehackt:
Code: Alles auswählen
10 rem
20 rem geldautomat
30 rem -----------
40 rem
50 rem nw() - notenwerte
60 rem az() - anzahl scheine im automaten
70 rem z() - anzahl scheine fuer die ausgabe
80 rem gs - gesamtsumme im automaten
90 rem
100 rem notenwerte
110 data 500,200,100,50,20,5
120 dim nw(6):for i=1 to 6:read nw(i):next
130 dim az(6):for i=1 to 6:az(i)=1000:next
140 dim z(6)
150 rem
160 rem hauptschleife
170 rem
180 print:print:print "geldautomat":print "-----------":print
190 gs=0:for i=1 to 6:gs=gs+az(i)*nw(i):next:print "inhalt =";gs;"euro":print
200 input "auszahlbetrag";b
210 if b>gs then print "nicht genug geld vorhanden":goto 180
220 for i=1 to 6:z(i)=0:next
230 for i=1 to 6
240 n=int(b/nw(i)):if n>az(i) then n=az(i)
250 az(i)=az(i)-n:z(i)=n:b=b-n*nw(i)
260 next i
270 if b>0 then print "kann nicht passend auszahlen":goto 180
280 print "auszahlung:"
290 for i=1 to 6
300 if z(i)>0 then print " ";z(i);"x";nw(i)
310 next i:goto 180
@KlaliB: Wenn Du etwas programmieren willst, solltest Du von den *Grundlagen* der Programmiersprache auch alles lernen. Objektorientierung könnte man für diese Aufgabe weglassen, obwohl sich das für's modellieren eines Bankautomaten natürlich auch anbietet.
Wieso weisst Du nicht *was* Du programmieren sollst? Gibt's keine schriftliche Aufgabenstellung? Keine Vereinbarung mit dem Lehrer was den Umfang des Referats angeht?
Verfasst: Mittwoch 13. Mai 2009, 19:15
von sma
BlackJack, in einem echten Basic-Programm hätte man niemals so umfangreich kommentiert und mit Leerzeichen so um sich geschmissen ;) Ein "10FORI=1TO6:PRINTI:NEXT" wäre realistischer. Leerzeichen landen IIRC beim C64 nämlich (im Gegensatz z.B. zum Schneider CPC, der das bessere Basic hatte) im Programm und müssen jedes Mal mit interpretiert werden.
Schließlich muss ich sagen, dass das Basic-Programm auf triviale Weise in ein Python-Programm konvertiert werden kann. Eine Lösung in Factor wäre hier besser gewesen ;)
Stefan
Verfasst: Mittwoch 13. Mai 2009, 19:43
von BlackJack
@sma: Ich hätte auch in einem "echten" C64-BASIC-Programm so mit den Leerzeichen um mich geworfen. Ich hatte damals immer zwei Varianten von meinen Programmen -- eine zum bearbeiten und eine, bei der mit einem Programm alle überflüssigen Leerzeichen und Kommentare entfernt wurden und auch so viel wie möglich zu laaaangen Zeilen zusammengefasst wurden.
Ausserdem habe ich absichtlich (*hust*) einen Fehler eingebaut.

Verfasst: Mittwoch 13. Mai 2009, 23:10
von Leonidas
sma hat geschrieben:Schließlich muss ich sagen, dass das Basic-Programm auf triviale Weise in ein Python-Programm konvertiert werden kann. Eine Lösung in Factor wäre hier besser gewesen

Ach, eine Whitespace-Lösung wäre optimal, insbesondere wenn der Quelltext dann auch noch auf die Handouts soll.
Letztendlich geht doch so ein Programm ganz einfach, lieber KlaliB, ist sogar ein Einzeiler:
Code: Alles auswählen
print 'U29ycnksIGljaCBnZWJlIGF1Zg==\n'.decode('base64')
Da programmieren ja immens schwer ist erkläre ich dir mal was das Programm tut:
- Zuerst wird der Speicher mit dem Unsigned Integer Wert 29 überschrieben (U29)
- Dann wird mit 'y' ein Speicherabbild angelegt.
- 'cnks' steht für Current Next Key Sequence erstellt eine Liste der Sequenzen die nun noch weiterverarbeitet werden muss.
- 'I' steht für Integer, also Ganzzahlen. Wie N in der Mathematik
- 'G' definiert Geldbeträge. Nun weiß der Computer dass es um Geldbeträge geht und er kann die nun besser berechnen.
- 'lj' ist eine recht alte Funktion, die stand ursprünglich für LaserJet, das ist sind alte Laserdrucker von HP, die ist nicht zwingend nötig, ist aber Aufgrund der Kompatibilität zu älteren Programmen dringend angeraten!
- 'CB' ist 'Change Binary', damit wechselt der Computer vom Binärmodus (du weißt schon, 01011101, wie in den ganzen Filmen) in den Dezimalmodus. Deine Geldbeträge werden automatisch konvertiert.
- 'n' sagt aus dass es 'n' Zahlen sind. Wir wollen ja eine allgemeine Lösung.
- 'ZWJ' sind die Initialen von JWZ einem recht bekannten Programmierer rückwährts geschrieben. Er hat beim Optimieren geholfen, und diese Optimierunen werden nun eben durch 'ZWJ' aktiviert.
- 'l' schaltet die Ausgabe auf 'Lang' um (englisch 'long')
- 'IGF' steht für "Identity Governance Framework" und stellt sicher dass die Ausgabe des Programms in einer für ihn verständlichen Weise ausgegeben wird.
- '1Z' ist die Anzahl von Stellen.
- 'g' ist 'go' und bedeutet dass die Eingabe abgeschlossen ist, und dass der Computer nun losrechnen soll.
- '==' bedeutet, dass die Korrektheit des Ergebnisses zweimal geprüft werden soll. Passiert ja ab und zu dass Software falsche Werte ausgibt, das kommt davon wenn man die Daten nicht mindestens doppelt nachprüfen lässt.
- '\n' bedeutet dass eine neue Zeile angefangen werden soll.
- 'print' zeigt schließlich das Ergebnis auf dem Bildschirm an.
Falls du den Quelltext nicht auf Anhieb verstehst ist das ok, aber die Ergebnisse sind auf jeden Fall richtig, da doppelt geprüft!!!
So, und nun ist höchste Zeit zum Duschen.
Verfasst: Mittwoch 13. Mai 2009, 23:32
von birkenfeld
Leonidas hat geschrieben:
[*]Dann wird mit 'y' ein Speicherabbild angelegt.
Daran erkennt man übrigens auch gut, dass Python von vi abstammt.
So, und nun ist höchste Zeit zum Duschen.
Wasser marsch!
Verfasst: Mittwoch 13. Mai 2009, 23:59
von BlackJack
@birkenfeld: Naja, Python stammt nicht direkt von vi ab, sondern wohl eher von dem Emacs-Mode, der den vi emuliert. Der heisst viper.

Verfasst: Donnerstag 14. Mai 2009, 06:27
von DasIch
Oh, nein. BlackJack ein Ketzer

Welch schrecklicher Tag.
Verfasst: Donnerstag 14. Mai 2009, 15:48
von KlaliB
BlackJack hat geschrieben:Ich habe gerade folgendes auf meinem C64 gehackt:
Code: Alles auswählen
10 rem
20 rem geldautomat
30 rem -----------
40 rem
50 rem nw() - notenwerte
60 rem az() - anzahl scheine im automaten
70 rem z() - anzahl scheine fuer die ausgabe
80 rem gs - gesamtsumme im automaten
90 rem
100 rem notenwerte
110 data 500,200,100,50,20,5
120 dim nw(6):for i=1 to 6:read nw(i):next
130 dim az(6):for i=1 to 6:az(i)=1000:next
140 dim z(6)
150 rem
160 rem hauptschleife
170 rem
180 print:print:print "geldautomat":print "-----------":print
190 gs=0:for i=1 to 6:gs=gs+az(i)*nw(i):next:print "inhalt =";gs;"euro":print
200 input "auszahlbetrag";b
210 if b>gs then print "nicht genug geld vorhanden":goto 180
220 for i=1 to 6:z(i)=0:next
230 for i=1 to 6
240 n=int(b/nw(i)):if n>az(i) then n=az(i)
250 az(i)=az(i)-n:z(i)=n:b=b-n*nw(i)
260 next i
270 if b>0 then print "kann nicht passend auszahlen":goto 180
280 print "auszahlung:"
290 for i=1 to 6
300 if z(i)>0 then print " ";z(i);"x";nw(i)
310 next i:goto 180
@KlaliB: Wenn Du etwas programmieren willst, solltest Du von den *Grundlagen* der Programmiersprache auch alles lernen. Objektorientierung könnte man für diese Aufgabe weglassen, obwohl sich das für's modellieren eines Bankautomaten natürlich auch anbietet.
Wieso weisst Du nicht *was* Du programmieren sollst? Gibt's keine schriftliche Aufgabenstellung? Keine Vereinbarung mit dem Lehrer was den Umfang des Referats angeht?
was ist mit diesen zahlen? und was heist rem?
Verfasst: Donnerstag 14. Mai 2009, 15:50
von DasIch
Die Zahlen geben die Zeile an, wobei man 10er Schritte nutzt um später einfacher Zeilen dazwischen packen zu können.
Verfasst: Donnerstag 14. Mai 2009, 16:04
von kbr
... und "rem" steht für "remark".
Verfasst: Donnerstag 14. Mai 2009, 16:48
von HerrHagen
ich kenn es als remember...
Verfasst: Donnerstag 14. Mai 2009, 16:52
von Hyperion
HerrHagen hat geschrieben:ich kenn es als remember...
Aber nicht beim Commodore Basic V2.0! Hab grad selber noch mal in mein Bedieungshandbuch vom C64 geguckt und auf Seite 124 steht ganz klar, dass es für Remark steht

Verfasst: Donnerstag 14. Mai 2009, 18:11
von HerrHagen
@Hyperion: Nix da, das Handbuch zu meinem KC87 sagt REMember.

Verfasst: Donnerstag 14. Mai 2009, 18:17
von Hyperion
HerrHagen hat geschrieben:@Hyperion: Nix da, das Handbuch zu meinem KC87 sagt REMember.

Das war dann aber kein Basic wie oben erwähnt

Verfasst: Donnerstag 14. Mai 2009, 18:25
von HerrHagen
Klar war es das. Mal abgesehen davon, dass alle Befehle groß geschrieben waren, ist alles dabei was in den Beispiel enthalten ist.

Verfasst: Donnerstag 14. Mai 2009, 19:34
von wuf
Hallo BASIC-Freunde
Ich habe ein Buch vor mir, welches ich in den 80er Jahren eingekauft habe:
Titel: BASIC für Tischcomputer
Autor: K.L.Boon
Verlag: Pflaum Verlag München
Jahr: 1983
Da steht auf Seite 94:
REM ist vom englischen Wort remark abgeleitet zu Deutsch Bemerkung.
Gruss wuf

Verfasst: Donnerstag 14. Mai 2009, 20:38
von problembär
In dem für mich in dieser Frage seit frühester Jugend maßgeblichen Dokument
http://www.worldofspectrum.org/ZXBasicM ... chap2.html
steht:
Sinclair Research Limited hat geschrieben:REM ... stands for remark, or reminder, and is there solely to remind you of what the program does.
Scheint also tatsächlich beides zu geben

.
Gruß
Verfasst: Donnerstag 14. Mai 2009, 21:08
von BlackJack
In einem Text von Thomas Kurtz, in dem er über Entwurfsentscheidungen von Dartmouth BASIC schreibt, steht "remark". Dartmouth BASIC war das erste BASIC und Kurtz einer der Entwickler.