Übungen zu "Programmieren in C mit dem z88dk"
Übungen zu "Programmieren in C mit dem z88dk"
Übung 1
Der Benutzer soll die Adresse einer Person eingeben. Diese wird anschließend in einer Textdatei namens adressen.txt gespeichert. Nach dem Speichern erscheint eine Abfrage, ob eine weitere Adresse eingegeben werden soll. Wird die Abfrage bejaht, dann wird eine weitere Adresse eingegeben, die dann an die Textdatei adressen.txt angehängt wird. Wird sie verneint, dann wird das Programm beendet.
Einzugebende Felder:
Name
Vorname
Straße
PLZ
Wohnort
Telefon
E-Mail
Darstellung in der Textdatei (Beispiel):
Hugo Hirsch
Schloßallee 3
67118 Frankfurt
069 12345678
hugo.hirsch@pappnase.de
Der Benutzer soll die Adresse einer Person eingeben. Diese wird anschließend in einer Textdatei namens adressen.txt gespeichert. Nach dem Speichern erscheint eine Abfrage, ob eine weitere Adresse eingegeben werden soll. Wird die Abfrage bejaht, dann wird eine weitere Adresse eingegeben, die dann an die Textdatei adressen.txt angehängt wird. Wird sie verneint, dann wird das Programm beendet.
Einzugebende Felder:
Name
Vorname
Straße
PLZ
Wohnort
Telefon
Darstellung in der Textdatei (Beispiel):
Hugo Hirsch
Schloßallee 3
67118 Frankfurt
069 12345678
hugo.hirsch@pappnase.de
Re: Übungen zu "Programmieren in C mit dem z88dk"
Wie kann ich auf der Joyce und der CP/M Box das @ eingeben?
Re: Übungen zu "Programmieren in C mit dem z88dk"
hmm, bei CPM-Box (V1.92) tatsächlich komplette Fehlanzeige. Auf meiner Joyce geht es mit SHIFT-3. Wenn Du kannst (und hast), versuch eine andere CPM3-Version zu booten. Bei mir hatte ich mit der J15CPM3 auf vielen Tasten keine Reaktion, mit der J18CPM3 ergaben fast alle Tasten was aufgedruckt war, bis auf ÄÖÜ und + etc. Da kommt eckige und geschweifte Klammer etc. Die verwendete CPM3-Version ist meistens schuld, wenn Tastaturzeichenprobleme auftreten, da länderspezifisch (John Elliott hat auf seiner Homepage zur Joyce eine Tabelle hierzu).
Hier ein paar Varianten zur Auswahl:
Hier ein paar Varianten zur Auswahl:
Re: Übungen zu "Programmieren in C mit dem z88dk"
Solltet ihr Schwierigkeiten haben die Eingabe benutzerfreundlich hinzubekommen, dann hilft euch vmtl. folgende Eingaberoutine:
Code: Alles auswählen
#include <stdio.h>
#include <conio.h>
#define CH_BEEP 7
#define CH_BACKSPACE 8
#define CH_RETURN 10
#define CH_AT 22
#define CH_SZ 126
#define CH_DEL_LEFT 127
/* Input a string with up to maxlen characters via keyboard.
Parameters: cp pointer to character buffer
maxlen maximum input length allowed
*/
void inputString(char *cp, int maxlen) {
char key;
char *ptrBuf;
int numChars;
ptrBuf = cp;
*ptrBuf = '\0'; // we start with an empty string
numChars = 0;
for (;;) {
key = getch();
if (key == CH_RETURN) { // finish input if <return> pressed
putchar('\n');
break;
}
if (numChars < maxlen) {
if (key > 31 && key < 126 || // regular characters
key > 90 && key < 94 || // uppercase Umlaut
key > 122 && key < 126 || // lowercase Umlaut
// key == CH_AT ||
key == CH_SZ)
{
putchar(key); // print character on screen
*ptrBuf++ = key; // write key to buffer
*ptrBuf = '\0'; // finalise string and point to the '\0' character
++numChars;
}
else {
if (key == CH_DEL_LEFT && *cp != '\0') { // delete left and characters available
putchar(CH_BACKSPACE); // move left
putchar(' '); // overwrite with blank
putchar(CH_BACKSPACE); // move left again
*--ptrBuf = '\0'; // shortens the string by 1 char
--numChars;
}
else {
putchar(CH_BEEP); // invalid key typed => beep
}
}
}
else {
putchar(CH_BEEP); // maximum number of characters reached => beep
}
}
}
Re: Übungen zu "Programmieren in C mit dem z88dk"
Ich habe Form3 verwendet.
Wenn ich zurück bin poste ich meine Lösung mal. Bin momentan in Franken
Wenn ich zurück bin poste ich meine Lösung mal. Bin momentan in Franken
Re: Übungen zu "Programmieren in C mit dem z88dk"
Ich war zwischendurch zuhause, hatte das upload nur vergessen.
Re: Übungen zu "Programmieren in C mit dem z88dk"
Immerhin eine Lösung; die Verwendung der forms3-Bibliothek ist schon etwas für Fortgeschrittene.
Hier nun die Musterlösung mit der o.g. Eingabefunktion inputString:
Kompiliert wird mit
Hier nun die Musterlösung mit der o.g. Eingabefunktion inputString:
Kompiliert wird mit
Code: Alles auswählen
zcc +cpm -subtype=pcw80 lesson01.c -o lesson01.com
Re: Übungen zu "Programmieren in C mit dem z88dk"
Übung 2
Der Kaiser von China und der Reis
Der Kaiser von China spielt mit einem Bauern Schach. Nachdem er das Spiel verloren hat, ist der Kaiser großzügig und will dem Bauern jeden Wunsch erfüllen. Der Bauer gibt sich bescheiden und verlangt für das erste Schachfeld ein Reiskorn, für das zweite zwei Reiskörner, für das dritte vier Reiskörner usw. Er verlangt also für jedes Schachfeld doppelt so viele Reiskörner wie für das vorhergehende.
Das C-Programm soll das Schachfeld als zweidimensionalen float-Array abbilden. Jedes Element, also jeder float-Wert, soll die Anzahl der Reiskörner enthalten. Am Ende sollen die Reiskörner aller Felder aufsummiert und die Summe ausgegeben werden.
Nehmen wir ferner an, dass ein Reiskorn ca. 30 Milligramm wiegt, also 0,03 Gramm. Das Programm soll das Gesamtgewicht aller Reiskörner in Tonnen ausgeben.
Die Erntemenge an Reis weltweit beträgt heutzutage ca. 510 Millionen Tonnen. Das Programm soll auch die Anzahl Jahre ausgeben, die auf der ganzen Welt Reis geerntet werden muss, um den Wunsch des Bauern zu erfüllen.
Hinweis: Da wir float-Werte verwenden, benötigen wir die zcc-Option -lm.
Der Kaiser von China und der Reis
Der Kaiser von China spielt mit einem Bauern Schach. Nachdem er das Spiel verloren hat, ist der Kaiser großzügig und will dem Bauern jeden Wunsch erfüllen. Der Bauer gibt sich bescheiden und verlangt für das erste Schachfeld ein Reiskorn, für das zweite zwei Reiskörner, für das dritte vier Reiskörner usw. Er verlangt also für jedes Schachfeld doppelt so viele Reiskörner wie für das vorhergehende.
Das C-Programm soll das Schachfeld als zweidimensionalen float-Array abbilden. Jedes Element, also jeder float-Wert, soll die Anzahl der Reiskörner enthalten. Am Ende sollen die Reiskörner aller Felder aufsummiert und die Summe ausgegeben werden.
Nehmen wir ferner an, dass ein Reiskorn ca. 30 Milligramm wiegt, also 0,03 Gramm. Das Programm soll das Gesamtgewicht aller Reiskörner in Tonnen ausgeben.
Die Erntemenge an Reis weltweit beträgt heutzutage ca. 510 Millionen Tonnen. Das Programm soll auch die Anzahl Jahre ausgeben, die auf der ganzen Welt Reis geerntet werden muss, um den Wunsch des Bauern zu erfüllen.
Hinweis: Da wir float-Werte verwenden, benötigen wir die zcc-Option -lm.
Re: Übungen zu "Programmieren in C mit dem z88dk"
So überschlagen etwa 1085 Jahre.
Im Kopf geht das einfach, aber auf 8Bit?
Eigentlich benötigen wir gar kein float, nur große Ganzzahlen. Leider kenne ich keine int128 Implementierung für 8 Bitter
Im Kopf geht das einfach, aber auf 8Bit?
Eigentlich benötigen wir gar kein float, nur große Ganzzahlen. Leider kenne ich keine int128 Implementierung für 8 Bitter
Re: Übungen zu "Programmieren in C mit dem z88dk"
Deswegen float - damit geht's ganz einfach. Die Grundrechenarten mit langen Ganzzahlen zu implementieren wäre zwar auch möglich, ist aber wesentlich aufwändiger.