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 8a248fb..0000000 Binary files a/j2-Baulwuerfe/j2 and /dev/null differ 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); }