diff --git a/20230109/aufgabe-1b-gpt.c b/20230109/aufgabe-1b-gpt.c new file mode 100644 index 0000000000000000000000000000000000000000..3b75051963b0f8f325725a2b71305c88f9a6b8e6 --- /dev/null +++ b/20230109/aufgabe-1b-gpt.c @@ -0,0 +1,23 @@ +#include <stdio.h> +#include <string.h> + +void insert_into_string (char src, char *target, int pos) { + // Bestimme die Länge des Strings target + int len = strlen(target); + + // Verschiebe alle Zeichen des Strings ab der Stelle pos um eine Stelle nach rechts + for (int i = len; i > pos; i--) { + target[i] = target[i-1]; + } + + // Füge das Zeichen src an der Stelle pos ein + target[pos] = src; +} + +int main (void) +{ + char test[] = "Hochshule Bochum"; + insert_into_string ('c', test, 5); + printf ("%s\n", test); + return 0; +} diff --git a/20230109/aufgabe-1e-gpt.c b/20230109/aufgabe-1e-gpt.c new file mode 100644 index 0000000000000000000000000000000000000000..7e010cb2b66d3dd447b0aa9e64c9d591fc9cb0d3 --- /dev/null +++ b/20230109/aufgabe-1e-gpt.c @@ -0,0 +1,42 @@ +#include <stdio.h> +#include <string.h> + +void insert_into_string (char src, char *target, int pos) { + // Bestimme die Länge des Strings target + int len = strlen(target); + + // Verschiebe alle Zeichen des Strings ab der Stelle pos um eine Stelle nach rechts + for (int i = len; i > pos; i--) { + target[i] = target[i-1]; + } + + // Füge das Zeichen src an der Stelle pos ein + target[pos] = src; +} + +void insert_into_string_sorted (char src, char *target) { + // Bestimme die Länge des Strings target + int len = strlen(target); + + // Iteriere über alle Zeichen des Strings target + for (int i = 0; i < len; i++) { // Wenn das aktuelle Zeichen alphabetisch hinter src liegt, füge src an dieser Stelle ein + if (target[i] > src) { + insert_into_string(src, target, i); + return; + } + } + + // Wenn src das letzte Zeichen im String ist, füge es am Ende des Strings ein + insert_into_string(src, target, len); +} + +int main (void) +{ + char test[100] = ""; + insert_into_string_sorted ('c', test); + insert_into_string_sorted ('a', test); + insert_into_string_sorted ('d', test); + insert_into_string_sorted ('b', test); + printf ("%s\n", test); + return 0; +} diff --git a/20230109/aufgabe-1g-gpt.c b/20230109/aufgabe-1g-gpt.c new file mode 100644 index 0000000000000000000000000000000000000000..047fa6f565913323f715d8b9a7ce413e70a2b07a --- /dev/null +++ b/20230109/aufgabe-1g-gpt.c @@ -0,0 +1,52 @@ +#include <stdio.h> +#include <string.h> + +void insert_into_string (char src, char *target, int pos) { + // Bestimme die Länge des Strings target + int len = strlen(target); + + // Verschiebe alle Zeichen des Strings ab der Stelle pos um eine Stelle nach rechts + for (int i = len; i > pos; i--) { + target[i] = target[i-1]; + } + + // Füge das Zeichen src an der Stelle pos ein + target[pos] = src; +} + +void insert_into_string_sorted (char src, char *target) { + // Bestimme die Länge des Strings target + int len = strlen(target); + + // Setze die Grenzen für die binäre Suche auf das erste und letzte Zeichen des Strings + int left = 0; + int right = len - 1; + + // Führe die binäre Suche durch, bis left und right auf dasselbe Zeichen zeigen + while (left < right) { // Bestimme die Mitte des aktuellen Suchbereichs + int mid = (left + right) / 2; + + // Wenn src alphabetisch vor dem aktuellen Zeichen liegt, suche im linken Teilbereich weiter + if (src < target[mid]) { + right = mid; + } + // Wenn src alphabetisch hinter dem aktuellen Zeichen liegt, suche im rechten Teilbereich weiter + else { + left = mid + 1; + } + } + + // Füge src an der Stelle left in den String ein + insert_into_string(src, target, left); +} + +int main (void) +{ + char test[100] = ""; + insert_into_string_sorted ('c', test); + insert_into_string_sorted ('a', test); + insert_into_string_sorted ('d', test); + insert_into_string_sorted ('b', test); + printf ("%s\n", test); + return 0; +} diff --git a/20230109/hp-20230109.txt b/20230109/hp-20230109.txt new file mode 100644 index 0000000000000000000000000000000000000000..ab89c2811358da947d215743cabf74d1b93f3416 --- /dev/null +++ b/20230109/hp-20230109.txt @@ -0,0 +1,411 @@ +Klausur vom 13.2.2018, gelöst von ChatGPT + +Aufgabe 1 + +(b) void insert_into_string (char src, char *target, int pos) { + // Bestimme die Länge des Strings target + int len = strlen(target); + + // Verschiebe alle Zeichen des Strings ab der Stelle pos um eine Stelle nach rechts + for (int i = len; i > pos; i--) { + target[i] = target[i-1]; + } + + // Füge das Zeichen src an der Stelle pos ein + target[pos] = src; + } + +--> Funktioniert, aber Null-Symbol am Ende nicht berücksichtigt. 1 Punkt Abzug. + +(c) Wenn man char test[] = "Hochshule Bochum"; anstelle von char test[100] = + "Hochshule Bochum"; schreibt, wird der Compiler den Array test automatisch + auf die notwendige Größe anpassen, um den String "Hochshule Bochum" + aufnehmen zu können. Wenn man die Funktion insert_into_string aufruft und + versucht, ein Zeichen an eine Stelle jenseits des Endes des Strings + einzufügen, könnte dies zu einem Speicherzugriffsfehler führen, da der + Array test nicht ausreichend groß ist, um das Zeichen aufzunehmen + +--> Richtig. Volle Punktzahl. + +(d) Wenn man char *test = "Hochshule Bochum"; anstelle von char test[100] = + "Hochshule Bochum"; schreibt, deklariert man test als Zeiger auf einen + char, der auf den ersten Buchstaben des Strings "Hochshule Bochum" zeigt. + In diesem Fall kann man nicht mehr auf die einzelnen Zeichen des Strings + test zugreifen, da der String "Hochshule Bochum" im ROM-Speicher + gespeichert ist und nicht verändert werden darf. Wenn man versucht, in der + Funktion insert_into_string das Zeichen an einer bestimmten Stelle im + String test zu ändern, wird dies zu einem Fehler führen + +--> Richtig, auch wenn die Formulierung eher in Richtung "ändern" als "einfügen" geht. + Volle Punktzahl. + +(e) void insert_into_string_sorted (char src, char *target) { + // Bestimme die Länge des Strings target + int len = strlen(target); + + // Iteriere über alle Zeichen des Strings target + for (int i = 0; i < len; i++) { // Wenn das aktuelle Zeichen alphabetisch hinter src liegt, füge src an dieser Stelle ein + if (target[i] > src) { + insert_into_string(src, target, i); + return; + } + } + + // Wenn src das letzte Zeichen im String ist, füge es am Ende des Strings ein + insert_into_string(src, target, len); + } + +--> Scheint zu funktionieren. Könnte volle Punktzahl geben. + +(f) Die Funktion void insert_into_string_sorted (char src, char *target) + arbeitet in O(n)-Zeit, da sie die Länge des Strings target durchläuft + und in jedem Durchlauf das Zeichen src in den String einfügt. + +--> Korrekt. + +(g) void insert_into_string_sorted (char src, char *target) { + // Bestimme die Länge des Strings target + int len = strlen(target); + + // Setze die Grenzen für die binäre Suche auf das erste und letzte Zeichen des Strings + int left = 0; + int right = len - 1; + + // Führe die binäre Suche durch, bis left und right auf dasselbe Zeichen zeigen + while (left < right) { // Bestimme die Mitte des aktuellen Suchbereichs + int mid = (left + right) / 2; + + // Wenn src alphabetisch vor dem aktuellen Zeichen liegt, suche im linken Teilbereich weiter + if (src < target[mid]) { + right = mid; + } + // Wenn src alphabetisch hinter dem aktuellen Zeichen liegt, suche im rechten Teilbereich weiter + else { + left = mid + 1; + } + } + + // Füge src an der Stelle left in den String ein + insert_into_string(src, target, left); + } + +--> Nicht ganz ausgereift, aber i.w. korrekt. Spontan 2 von 3 Punkten. + +Aufgabe 2 + +(a) Die beim Compilieren auftretende Warnung wird angezeigt, weil in der + printf-Anweisung in Zeile 14 der Typ des zweiten Arguments ("&xyz") als + "three_numbers * {aka struct *}" angegeben ist, aber der Format-String "%s" + erwartet, dass das zweite Argument ein Zeiger auf einen char-Wert (also + einen String) ist. Die Formatierungsanweisung "%s" gibt an, dass das + Argument, auf das der Zeiger verweist, als String interpretiert werden + soll. Da das zweite Argument aber ein Zeiger auf ein three_numbers-Struct + ist, kann es nicht als String interpretiert werden und es wird daher eine + Warnung angezeigt. + +--> Sehr lang formuliert, trotzdem volle Punktzahl. + +(a) Die beim Compilieren auftretende Warnung wird angezeigt, weil in der + printf-Anweisung der Typ des zweiten Arguments ("&xyz", ein Zeiger auf + ein three_numbers-Struct) und der Format-String "%s" (erwartet einen + String) inkonsistent sind. Das bedeutet, dass das Programm versucht, + ein three_numbers-Struct als String auszugeben, was nicht möglich ist + und daher eine Warnung ausgelöst wird. + +--> Besser formuliert. Volle Punktzahl. (Ein Komma fehlt.;-) + +(b) Das Programm enthält einen Fehler in der Verwendung von printf auf Zeile + 14. Der "%s" Formatstring erwartet einen "char *" als Argument, aber &xyz + wurde übergeben, was ein "three_numbers *" (also ein Zeiger auf eine + Struktur) ist. Dies führt zu unerwartetem Verhalten und einer Warnung bei + der Compilierung. + +--> Bis hierin: Geschwafel. + + In diesem Fall gibt printf jedoch "Hallo, Welt!" aus, da es den Inhalt + der Speicheradresse als Zeichenkette interpretiert. + +--> Das ist sogar richtig. + + Es ist jedoch unwahrscheinlich, dass dieser Speicherbereich tatsächlich + eine gültige Zeichenkette enthält, daher sollte dieser Code vermieden + werden. + +--> Daraus kann ich entnehmen, daß ChatGPT die Aufgabe nicht wirklich verstanden hat. + Es feht eine Analyse, weshalb die Ausgabe genau "Hallo, Welt!" sein muß. + +--> Großzügig: 2 von 4 Punkten. + +--> Richtige Lösung: Zahlen nach Hexadezimal umwandeln. + In der ersten Zahl steht dann ganz rechts "48" für "H", + links davon "61" für "a", danach zweimal "6c" für "l". + --> Der Rechner ist Little-Endian (schon mal für (c)). + + Was liegt im Speicher? + + l l a H ! t l e W _ , o \0 + 6c6c6148 21746c6557202C6f 00 + `------' `--------------' `' + a b c <-- direkt hintereinander, weil gemeinsam im Struct + (Dies dazuzuschreiben, könnte einen Extra-Punkt bringen.) + (Achtung: auch hier kann Alignment eine Rolle spielen!) + + Reihenfolge im Speicher: für jede Zahl andersherum, da Little Endian + + H a l l o , _ W e l t ! \0 + 48 61 6c 6c 6f 2C 20 57 65 6c 74 21 00 <-- String im Speicher + `---------' `----------------------' `' + a b c + + Wenn man die Inhalte der Speicherzellen visualisiert, aus denen das Struct + xyz besteht, erkennt man, daß bei Little Endian die Speicherzellen gemäß + ASCII-Zeichensatz den String "Hallo, Welt!" einschließlich Null-Symbol am + Ende ergeben. + +(c) Es ist nicht möglich, die Endianness des verwendeten Rechners anhand des + obigen Programms zu bestimmen. Die Endianness beschreibt die Reihenfolge, + in der Bytes in einem Wort gespeichert werden, und hat keine Auswirkungen + auf die Ausgabe von printf. + +--> Leider falsch. + + Die Ausgabe des Programms hängt davon ab, welche Daten sich in dem + Speicherbereich befinden, der an printf übergeben wird. In diesem Fall + wurde &xyz, also die Adresse der Struktur "three_numbers", übergeben. Wenn + der Speicherbereich an dieser Adresse tatsächlich eine gültige Zeichenkette + enthält, würde die Ausgabe auf jedem Rechner gleich sein, unabhängig von + der Endianness. Wenn der Speicherbereich jedoch zufällige Daten enthält, + würde die Ausgabe auf jedem Rechner unterschiedlich sein. + +--> Das klingt erstaunlich überzeugend, ist aber eigentlich ziemlich falsch. + + Es ist wichtig zu beachten, dass der Code in der obigen Frage fehlerhaft + ist und nicht wie erwartet funktionieren wird. Es wird empfohlen, diesen + Code zu überarbeiten, um korrektes Verhalten zu gewährleisten. + +--> Daß man so nicht programmieren sollte, ist klar. Leider hat dies nichts + mit der Aufgabenstellung zu tun. + +--> 0 Punkte. + +--> Richtige Lösung: Little Endian (Begründung: siehe oben) + + Rechner nit entgegengesetzter Endianness: + Wir behalten die Reihenfolge von a, b und c bei und drehen nur innerhalb + jeder Variable die Reihenfolge der Speicherzellen um: + + l l a H ! t l e W _ , o \0 + 6c 6c 61 48 21 74 6c 65 57 20 2C 6f 00 <-- String im Speicher + `---------' `----------------------' `' + a b c + + Aufgabe auf einem Big-Endian-Rechner: "llaH!tleW ,o" + +(d) Die Ausgabe des Programms hängt davon ab, welche Daten sich in dem + Speicherbereich befinden, der an printf übergeben wird. In diesem Fall + wurde &xyz, also die Adresse der Struktur "three_numbers", übergeben. Wenn + der Speicherbereich an dieser Adresse tatsächlich eine gültige Zeichenkette + enthält, würde die Ausgabe auf jedem Rechner gleich sein, unabhängig von + der Architektur des Rechners. Wenn der Speicherbereich jedoch zufällige + Daten enthält, würde die Ausgabe auf jedem Rechner unterschiedlich sein. + +--> Geschwafel. Wiederholung von (a). + + Es ist wichtig zu beachten, dass der Code in der obigen Frage fehlerhaft + ist und nicht wie erwartet funktionieren wird. Es wird empfohlen, diesen + Code zu überarbeiten, um korrektes Verhalten zu gewährleisten. Die + Tatsache, dass die Ausgabe des Programms auf einem 64-Bit-Rechner anders + aussieht als auf einem 32-Bit-Rechner, ist wahrscheinlich auf die + unterschiedliche Speicherstruktur zurückzuführen und hat nichts mit der + Endianness zu tun. + +--> Geschwafel, aber enthält auch etwas Korrektes: Es hat tatsächlich nicht + mit der Endianness zu tun, sondern mit dem Alignment. + + Möchten Sie noch etwas wissen oder haben Sie weitere Fragen zum obigen + Programm? + +--> *in die Tischkante beiß* + +--> 0 Punkte. + +--> Richtige Lösung: 64-Bit-Rechner + + Ausgabe: Hall5V + + typedef struct + { + uint32_t a; + uint64_t b; + uint8_t c; + } three_numbers; + + l l a H 5 V \0 \? ! t l e W _ , o \0 + 6c 6c 61 48 35 56 00 ?? 21 74 6c 65 57 20 2C 6f 00 <-- String im Speicher + `---------' `---------' `----------------------' `' + a dummy b c + wegen 64-Bit-Alignment + + Um das 64-Bit-Alignment der Variablen b einzuhalten, hat der Compiler zwischen + a und b 32 Bits, also 4 Speicherzellen, freigelassen und mit zufälligen Werten + gefüllt. Gemäß der Ausgabe sind diese zufälligen Werte die Ziffer 5, Der Buchstabe V, + ein Null-Symbol und ein für uns unbekannter Wert. + + $ gcc -Wall -m64 -O aufgabe-2.c -o aufgabe-2 + aufgabe-2.c: In function ‘main’: + aufgabe-2.c:14:13: warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘three_numbers *’ {aka ‘struct <anonymous> *’} [-Wformat=] + printf ("%s\n", &xyz); + ~^ ~~~~ + $ ./aufgabe-2 + Vall + $ ./aufgabe-2 + Hall V + $ ./aufgabe-2 + HallfU + $ ./aufgabe-2 + Hall\U + $ ./aufgabe-2 + HallV + $ + + Das "Vall" ist in Wirklichkeit: "Hall\rV" + ("\r" bedeutet: zurückgehen an den Zeilenanfang) + + $ echo -e "Hall\rV" + Vall + +Aufgabe 3 + +(a) void (*fun)(int x) bedeutet, dass "fun" ein Zeiger auf eine Funktion ist, + die einen int-Wert als Argument nimmt und keinen Rückgabewert hat. + +--> Korrekt. Schon mal 1 Punkt. + + Die Verwendung von fun in der Funktion foreach() ermöglicht es, jedes + Element im Array "a" der Funktion "fun" zu übergeben, sodass diese auf + jedes Element angewendet werden kann. + +--> Etwas merkwürdig, aber trotzdem korrekt beantwortet. + Noch ein Punkt. Volle Punktzahl. 8-) + + (Ich vermisse das Stichwort "Callback-Funktion" oder von mir aus auch + "virtuelle Methode". Aber die Beschreibung dessen, was foreach() mit + der übergebenen Funktion macht, ist korrekt.) + +(b) #include <stdio.h> + + int sum; // globale Variable für die Summe + + void add_to_sum (int x) + { + if (x > 0) + { + sum += x; + } + } + + void foreach (int *a, void (*fun) (int x)) + { + for (int *p = a; *p >= 0; p++) + { + fun (*p); + } + } + + int main (void) + { + int numbers[] = { 12, 17, 32, 1, 3, 16, 19, 18, -1 }; + foreach (numbers, add_to_sum); + printf ("Summe der positiven Zahlen: %d\n", sum); + return 0; + } + +--> Ich vermisse ein explizites "sum = 0"; ansonsten ist alles korrekt. Volle Punktzahl. + (Die Initialisierung auf 0 erfolgt bei globalen Variablen automatisch. Das ist für + ChatGPT anscheinend so selbstverständlich, daß es das nicht erwähnt.) + +Aufgabe 4 + + Es scheint, dass du eine Aufgabe aus einem Computer Science Kurs hast, bei + der du ein Programm schreiben sollst, das eine XBM-Grafikdatei liest und + in eine PBM-Grafikdatei umwandelt. XBM-Grafikdateien sind als C-Quelltext + abgespeicherte Arrays, die Bildinformationen enthalten. PBM-Grafikdateien sind + binär abgespeicherte C-Arrays von Bytes, die auch Bildinformationen enthalten. + + Um diese Aufgabe zu lösen, musst du das XBM-Array lesen und die Bilddaten + in das PBM-Format umwandeln. Du musst die Breite und Höhe des Bildes aus den + Konstantendefinitionen in der XBM-Datei extrahieren und diese Informationen in + der PBM-Datei speichern. Du musst auch sicherstellen, dass du die Bilddaten im + PBM-Format speicherst, indem du jedes Bit des XBM-Arrays liest und es im MSB + first Format in das PBM-Array schreibst. + + Eine Möglichkeit, dies zu erreichen, wäre die Verwendung von + Bit-Shift-Operationen, um die Bits des XBM-Arrays zu lesen und sie im + PBM-Format zu speichern. Du könntest auch Funktionen wie fprintf verwenden, um + die Breite und Höhe des Bildes und die Bilddaten in die PBM-Datei zu schreiben + + Hier ist ein Beispiel für ein Programm, das die Aufgabe löst, eine + XBM-Grafikdatei in eine PBM-Grafikdatei umzuwandeln. Beachte, dass dieses + Beispiel nur als Anregung dient und dass es möglicherweise Anpassungen oder + Erweiterungen benötigt, um es für deine spezifischen Bedürfnisse zu optimieren: + + #include <stdio.h> + #include <stdint.h> + + #define XBM_WIDTH 14 + #define XBM_HEIGHT 14 + + static unsigned char xbm_bits[] = { + 0x00, 0x00, 0xf0, 0x03, 0x08, 0x04, 0x04, 0x08, 0x02, 0x10, 0x32, 0x13, + 0x22, 0x12, 0x02, 0x10, 0x0a, 0x14, 0x12, 0x12, 0xe4, 0x09, 0x08, 0x04, + 0xf0, 0x03, 0x00, 0x00 + }; + + int main(int argc, char **argv) + { + // Öffne die Ausgabedatei + FILE *output_file = fopen("test.pbm", "w"); + if (output_file == NULL) { + printf("Fehler beim Öffnen der Ausgabedatei\n"); + return 1; + } + + // Schreibe die PBM-Dateikennung, Breite und Höhe in die Ausgabedatei + fprintf(output_file, "P4\n%d %d\n", XBM_WIDTH, XBM_HEIGHT); + + // Iteriere über jedes Byte im XBM-Array + for (int i = 0; i < XBM_HEIGHT * XBM_WIDTH / 8; i++) { // Iteriere über jedes Bit im aktuellen Byte + for (int j = 7; j >= 0; j--) { + // Lies das aktuelle Bit des XBM-Arrays und schreibe es in die Ausgabedatei + uint8_t xbm_bit = (xbm_bits[i] >> j) & 1; + fprintf(output_file, "%c", xbm_bit ? '1' : '0'); + } + } + + // Schließe die Ausgabedatei + fclose(output_file); + + return 0; + } + +--> Mehrere Fehler, aber durchaus sinnvolle Ansätze. + Großzügig: 4 von 8 Punkten (möglicherweise weniger) + +Zusammenfassung: + +Aufgabe 1 (a) 3 / 3 + (b) 1 / 2 + (c) 2 / 2 + (d) 2 / 2 + (e) 4 / 4 + (f) 1 / 1 + (g) 2 / 3 +Aufgabe 2 (a) 2 / 2 + (b) 2 / 4 + (c) 0 / 2 + (d) 0 / 3 +Aufgabe 3 (a) 2 / 2 + (b) 4 / 4 +Aufgabe 4 4 / 8 + -- --- + 29 / 42 --> 2.7. Immerhin. diff --git a/20230109/loesung-3b-gpt.c b/20230109/loesung-3b-gpt.c new file mode 100644 index 0000000000000000000000000000000000000000..467813bbaf0bb0ca60e6e983769bfbb98e74b96a --- /dev/null +++ b/20230109/loesung-3b-gpt.c @@ -0,0 +1,27 @@ +#include <stdio.h> + +int sum; // globale Variable für die Summe + +void add_to_sum (int x) +{ + if (x > 0) + { + sum += x; + } +} + +void foreach (int *a, void (*fun) (int x)) +{ + for (int *p = a; *p >= 0; p++) + { + fun (*p); + } +} + +int main (void) +{ + int numbers[] = { 12, 17, 32, 1, 3, 16, 19, 18, -1 }; + foreach (numbers, add_to_sum); + printf ("Summe der positiven Zahlen: %d\n", sum); + return 0; +} diff --git a/20230109/loesung-4-gpt-pg.c b/20230109/loesung-4-gpt-pg.c new file mode 100644 index 0000000000000000000000000000000000000000..50270f858e7de49ea99cb6e125b4775b652ada81 --- /dev/null +++ b/20230109/loesung-4-gpt-pg.c @@ -0,0 +1,42 @@ +#include <stdio.h> +#include <stdint.h> + +/* eigentlich: #include "aufgabe-4.xbm" */ + +#define XBM_WIDTH 14 +#define XBM_HEIGHT 14 + +static unsigned char xbm_bits[] = { + 0x00, 0x00, 0xf0, 0x03, 0x08, 0x04, 0x04, 0x08, 0x02, 0x10, 0x32, 0x13, + 0x22, 0x12, 0x02, 0x10, 0x0a, 0x14, 0x12, 0x12, 0xe4, 0x09, 0x08, 0x04, + 0xf0, 0x03, 0x00, 0x00 +}; + +int main(int argc, char **argv) +{ + // Öffne die Ausgabedatei + FILE *output_file = fopen("test.pbm", "w"); + if (output_file == NULL) { + printf("Fehler beim Öffnen der Ausgabedatei\n"); + return 1; + } + + // Schreibe die PBM-Dateikennung, Breite und Höhe in die Ausgabedatei + fprintf(output_file, "P4\n%d %d\n", XBM_WIDTH, XBM_HEIGHT); + + // Iteriere über jedes Byte im XBM-Array + for (int i = 0; i < XBM_HEIGHT * XBM_WIDTH / 8; i++) { // Iteriere über jedes Bit im aktuellen Byte + for (int j = 7; j >= 0; j--) { + // Lies das aktuelle Bit des XBM-Arrays und schreibe es in die Ausgabedatei + // PG: nicht berücksichtigt: umgekehrte Bit-Reihenfolge (MSB/LSB first) + uint8_t xbm_bit = (xbm_bits[i] >> j) & 1; + fprintf(output_file, "%c", xbm_bit ? '1' : '0'); + } + } + + // Schließe die Ausgabedatei + fclose(output_file); + + return 0; +} + diff --git a/20230109/loesung-4-gpt.c b/20230109/loesung-4-gpt.c new file mode 100644 index 0000000000000000000000000000000000000000..8a47e33344c510eb059c7e876ae5300aca3c35ed --- /dev/null +++ b/20230109/loesung-4-gpt.c @@ -0,0 +1,39 @@ +#include <stdio.h> +#include <stdint.h> + +#define XBM_WIDTH 14 +#define XBM_HEIGHT 14 + +static unsigned char xbm_bits[] = { + 0x00, 0x00, 0xf0, 0x03, 0x08, 0x04, 0x04, 0x08, 0x02, 0x10, 0x32, 0x13, + 0x22, 0x12, 0x02, 0x10, 0x0a, 0x14, 0x12, 0x12, 0xe4, 0x09, 0x08, 0x04, + 0xf0, 0x03, 0x00, 0x00 +}; + +int main(int argc, char **argv) +{ + // Öffne die Ausgabedatei + FILE *output_file = fopen("test.pbm", "w"); + if (output_file == NULL) { + printf("Fehler beim Öffnen der Ausgabedatei\n"); + return 1; + } + + // Schreibe die PBM-Dateikennung, Breite und Höhe in die Ausgabedatei + fprintf(output_file, "P4\n%d %d\n", XBM_WIDTH, XBM_HEIGHT); + + // Iteriere über jedes Byte im XBM-Array + for (int i = 0; i < XBM_HEIGHT * XBM_WIDTH / 8; i++) { // Iteriere über jedes Bit im aktuellen Byte + for (int j = 7; j >= 0; j--) { + // Lies das aktuelle Bit des XBM-Arrays und schreibe es in die Ausgabedatei + uint8_t xbm_bit = (xbm_bits[i] >> j) & 1; + fprintf(output_file, "%c", xbm_bit ? '1' : '0'); + } + } + + // Schließe die Ausgabedatei + fclose(output_file); + + return 0; +} + diff --git a/20230109/output-01.c b/20230109/output-01.c new file mode 100644 index 0000000000000000000000000000000000000000..d4f8b191d6d4491df2661046ce99c21ec2045a60 --- /dev/null +++ b/20230109/output-01.c @@ -0,0 +1,7 @@ +#include <stdio.h> + +int main (void) +{ + printf (42); + return 0; +} diff --git a/20230109/test-gpt-pg.pbm b/20230109/test-gpt-pg.pbm new file mode 100644 index 0000000000000000000000000000000000000000..f0e9e7e193831ff0a079359d6808c7bcaad78670 --- /dev/null +++ b/20230109/test-gpt-pg.pbm @@ -0,0 +1,3 @@ +P1 +16 14 +000000000000000011110000000000110000100000000100000001000000100000000010000100000011001000010011001000100001001000000010000100000000101000010100000100100001001011100100000010010000100000000100 diff --git a/20230109/test-gpt.pbm b/20230109/test-gpt.pbm new file mode 100644 index 0000000000000000000000000000000000000000..485ad2684c82d10da9d600467ddd1e89f7682080 --- /dev/null +++ b/20230109/test-gpt.pbm @@ -0,0 +1,3 @@ +P4 +14 14 +000000000000000011110000000000110000100000000100000001000000100000000010000100000011001000010011001000100001001000000010000100000000101000010100000100100001001011100100000010010000100000000100 \ No newline at end of file