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);
}