Übungen zu "Programmieren in C mit dem z88dk"

Software-Entwicklung, Compiler, Interpreter, ...
Benutzeravatar
bbock
Beiträge: 242
Registriert: 08.02.2015, 15:31

Übungen zu "Programmieren in C mit dem z88dk"

Beitrag von bbock »

Ü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
Paul
Beiträge: 138
Registriert: 17.09.2017, 22:27
Wohnort: Germanys west end

Re: Übungen zu "Programmieren in C mit dem z88dk"

Beitrag von Paul »

Wie kann ich auf der Joyce und der CP/M Box das @ eingeben?
kurt
Beiträge: 166
Registriert: 26.10.2019, 20:11

Re: Übungen zu "Programmieren in C mit dem z88dk"

Beitrag von kurt »

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:
PCW8xxx_Boot-Disks-Versions.pdf
(35.03 KiB) 274-mal heruntergeladen
joyce-cpm3-varianten.zip
(144.52 KiB) 247-mal heruntergeladen
Benutzeravatar
bbock
Beiträge: 242
Registriert: 08.02.2015, 15:31

Re: Übungen zu "Programmieren in C mit dem z88dk"

Beitrag von bbock »

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
        }
    }
}
Paul
Beiträge: 138
Registriert: 17.09.2017, 22:27
Wohnort: Germanys west end

Re: Übungen zu "Programmieren in C mit dem z88dk"

Beitrag von Paul »

Ich habe Form3 verwendet.
Wenn ich zurück bin poste ich meine Lösung mal. Bin momentan in Franken
Paul
Beiträge: 138
Registriert: 17.09.2017, 22:27
Wohnort: Germanys west end

Re: Übungen zu "Programmieren in C mit dem z88dk"

Beitrag von Paul »

UE1.zip
(52.25 KiB) 231-mal heruntergeladen
Ich war zwischendurch zuhause, hatte das upload nur vergessen.
Benutzeravatar
bbock
Beiträge: 242
Registriert: 08.02.2015, 15:31

Re: Übungen zu "Programmieren in C mit dem z88dk"

Beitrag von bbock »

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:
lesson01.zip
(1.31 KiB) 278-mal heruntergeladen

Kompiliert wird mit

Code: Alles auswählen

zcc +cpm -subtype=pcw80 lesson01.c -o lesson01.com
Benutzeravatar
bbock
Beiträge: 242
Registriert: 08.02.2015, 15:31

Re: Übungen zu "Programmieren in C mit dem z88dk"

Beitrag von bbock »

Ü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.
Paul
Beiträge: 138
Registriert: 17.09.2017, 22:27
Wohnort: Germanys west end

Re: Übungen zu "Programmieren in C mit dem z88dk"

Beitrag von Paul »

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
Benutzeravatar
bbock
Beiträge: 242
Registriert: 08.02.2015, 15:31

Re: Übungen zu "Programmieren in C mit dem z88dk"

Beitrag von bbock »

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.
Antworten