From b88a169b566780338d846120b8e28e72dafce709 Mon Sep 17 00:00:00 2001 From: MrGeorgen Date: Mon, 23 Nov 2020 22:32:42 +0100 Subject: [PATCH] j2 docs --- j2-Baulwuerfe/README.md | 40 ++++++++++++++++++++++++++++++++ j2-Baulwuerfe/j2 | Bin 21920 -> 0 bytes j2-Baulwuerfe/src/main.c | 49 +++++++++++++++++++++------------------ 3 files changed, 67 insertions(+), 22 deletions(-) create mode 100644 j2-Baulwuerfe/README.md delete mode 100755 j2-Baulwuerfe/j2 diff --git a/j2-Baulwuerfe/README.md b/j2-Baulwuerfe/README.md new file mode 100644 index 0000000..78a7e45 --- /dev/null +++ b/j2-Baulwuerfe/README.md @@ -0,0 +1,40 @@ +# Verwendung + +Als Argument nimmt das Programm beliebig viele Dateipfade mit Maulwurfkarten an.
+z. B. `./j2 beispieldaten/karte0.txt beispieldaten/karte1.txt`
+Als Ausgabe erhält man: +``` +beispieldaten/karte0.txt: 3 +beispieldaten/karte1.txt: 37 +``` + +# Funktionsweise + +Mein Programm verwendet eine for-Schleife, die über Zeilen iteriert.
+` for(char *i = textRest; (uintptr_t)i <= (uintptr_t)textRest + ((height - 4) * (width + 1)); i += width + 1) {`
+Für das Iterieren über die einzelen Zeichen verwende ich wieder eine for-Schleife.
+` for(char *j = i; (uintptr_t)j < (uintptr_t)i + width - 1; ++j) {`
+Um zu überprüfen, ob die vierer Zeilen eines Baulwurfhügel existieren habe ich eine Funktion geschrieben. +``` +bool checkRow(char *row) { + for(uint8_t i = 0; i < 4; ++i) { + if(row[i * (width + 1)] == keinBaulwurfhuegel) return false; + } + return true; +} +``` +Diese Funktion wird zweimal aufgerufen.
+`checkRow(j) && checkRow(j + 2)`
+Außerdem wird überprüft, ob in der Mitte oben und unten Maulwurfshügel vorhanden sind.
+`j[1] == baulwurfhuegel && j[1 + 3 * (width + 1)] == baulwurfhuegel && j[1 + 2 * (width +1)] == keinBaulwurfhuegel && j[1 + (width + 1)] == keinBaulwurfhuegel;`
+Wenn die Maulwurfshügelfomration vorhanden ist, dann wird ein Counter um eins erhöht. +Nachdem die for-Schleifen fertig gelaufen sind wird die Anzahl der Baulwurfhügel ausgegeben. + +# Beispiel + +Als Beispiel schauen wir uns mal `karte0.txt` an. +An der ersten Position oben links wird gleich ein Baulwurfshügel erkannt und gezählt. +Danach wird Zeichen für Zeichen und Zeile für Zeile auf Baulwurfshügel überprüft. +Es wird erst wieder in Zeile 2, Zeichen 12 ein Baulwurfshügel gezählt sowie in Zeile 3, Zeichen 14. +Schließlich wird das Ergebnis ausgegeben.
+`beispieldaten/karte0.txt: 3` diff --git a/j2-Baulwuerfe/j2 b/j2-Baulwuerfe/j2 deleted file mode 100755 index 8a248fb955c09f8cf7f07805a6b817bfa1b576b0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21920 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 diff --git a/j2-Baulwuerfe/src/main.c b/j2-Baulwuerfe/src/main.c index b7e7c95..e78752f 100644 --- a/j2-Baulwuerfe/src/main.c +++ b/j2-Baulwuerfe/src/main.c @@ -5,17 +5,18 @@ #include #include -enum baulwurfhuegel{baulwurfhuegel = 'X', keinBaulwurfhuegel = ' '}; +enum baulwurfhuegel{baulwurfhuegel = 'X', keinBaulwurfhuegel = ' '}; // enums um die Lesbarkeit zu verbessern. int width, height; -void pointerCheck(void *pointer) { +void pointerCheck(void *pointer) {// Funktion um auf NULL Pointer zu checken und den Fehler auszugeben. if(pointer == NULL) { perror("Error: "); exit(-1); } } +// Funktion die überprüft ob relativ zur angegebenen Position eine Spalte mit 4 Maulwurfhügel ist. bool checkRow(char *row) { for(uint8_t i = 0; i < 4; ++i) { if(row[i * (width + 1)] == keinBaulwurfhuegel) return false; @@ -24,25 +25,29 @@ bool checkRow(char *row) { } int main(int argc, char *argv[]) { - if(argc != 2) printf("file argument required"); - bool sucess; - FILE *fp = fopen(argv[1], "rb"); - char *input = acl_ReadTextFile(fp, &sucess); - fclose(fp); - pointerCheck(input); - char *heightText; - char *textRest; - width = strtol(input, &heightText, 10); - ++heightText; // height points does not point to \n anymore - height = strtol(heightText, &textRest, 10); - ++textRest; - printf("height: %d width: %d\n", height, width); - unsigned baulwurfhuegelCounter = 0; - for(char *i = textRest; (uintptr_t)i <= (uintptr_t)textRest + ((height - 4) * (width + 1)); i += width + 1) { - for(char *j = i; (uintptr_t)j < (uintptr_t)i + width - 1; ++j) { - baulwurfhuegelCounter += checkRow(j) && checkRow(j + 2) && j[1] == baulwurfhuegel && j[1 + 3 * (width + 1)]; - } + if(argc == 1) { // das Programm wird beendet wenn die Anzahl der Argumente falsch ist. + printf("file argument required"); + exit(-1); + } + for(int filePath = 1; filePath < argc; ++filePath) { + bool sucess; + FILE *fp = fopen(argv[filePath], "rb"); // Datei wird im binären Modus geöffent, um die Geschwindigkeit zu verbessern. + char *input = acl_ReadTextFile(fp, &sucess); + fclose(fp); + pointerCheck(input); + char *heightText; + char *textRest; + width = strtol(input, &heightText, 10); + ++heightText; // Das nächste Zeichen nach der Breite ist \n. Danach das Zeichen ist erst die Höhe. + height = strtol(heightText, &textRest, 10); // Der Rest der Textdatei ist die Karte mit den Maulwurfhügeln. + ++textRest; // wieder damit der Pointer auf \n zeigt + unsigned baulwurfhuegelCounter = 0; + for(char *i = textRest; (uintptr_t)i <= (uintptr_t)textRest + ((height - 4) * (width + 1)); i += width + 1) { // iteriert über die Zeilen der Karte. + for(char *j = i; (uintptr_t)j < (uintptr_t)i + width - 1; ++j) { // iteriert immer ein Schritt nach rechts. + baulwurfhuegelCounter += checkRow(j) && checkRow(j + 2) /* überprüft ob sich die beiden 4er Zeilen der Baulwurfhügelformation stimmen */ && j[1] == baulwurfhuegel && j[1 + 3 * (width + 1)] == baulwurfhuegel /* überprüft die Maulwurfhügel oben und unten in der Mitte da sind */ && j[1 + 2 * (width +1)] == keinBaulwurfhuegel && j[1 + (width + 1)] == keinBaulwurfhuegel; // überprüft ob in der Mitte keine Maulwurfhügel sind + } + } + free(input); + printf("%s: %u\n", argv[filePath], baulwurfhuegelCounter); // gibt den Dateipfad und die Anzahl der Baulwürfe aus } - free(input); - printf("Baulwurfhuegel: %u", baulwurfhuegelCounter); }