/*C/RCE - Trainingsaufgabe: Schwerpunkte: (1) C Code verstehen (2) Algorithmen identifizieren (3) Algorithmen entwerfen (4) C Code schreiben (1) Schaue dir den Algorithmus an und versuche zu verstehen, was er macht. Wenn es nach "zu viel" ausschaut, versuche einzelne Zeilen zu analysieren (Kommentar darber schreiben). Um anschlieend das Puzzel zusammen zu setzen. (2) Welche Bedingungen mssen gelten, damit die Ausgabe "Your kung-fu is amazing!" erscheint? Wie werden die Bedingungen herbei gefhrt? (3) Versuche eine korrekte Eingabe per Papier und Stift zu bestimmen. Fallen dir dabei Muster auf? Tipp: 4xL = ein groes L (Du wirst wissen was gemeint ist :D). (4) Implementiere deinen Algorithmus in einem C-Programm. Das Programm soll die ID entgegen nehmen und eine valide eingabe fr diese ID erzeugen.*/#include <stdio.h>#include <stdlib.h>#include <time.h>#include <string.h>void prepare(int map[8][8]);int test_map(int map[8][8]);int main(int argc, char *argv[]){ // es wird ein array der gre 8x8 angelegt int map[8][8]; //wir legen eine zeichenkette mit 64 zeichen an char input[64]; //zwei integer, ok und len int ok, len; //wir rufen prepare auf (siehe unten) prepare(map); //wir fragen den benutzer nach einer eingabe scanf("%64s",input); //und speichern die lnge in len len = strlen(input); //ok ist soweit 1 ok = 1; int i; //wir durchlaufen jeden 3. buchstaben (also den 0. , den 2., den 5. usw.) der eingabe for(i = 0; (i < len) && (ok); i+=3){ int t,x,y; t = input[i+1]-'0'; //wir ziehen vom 2. buchstaben jeder dreiergruppe den ascii-wert von 0 ab... //wir erhalten von '4' (dem zeichen 4) also 4 (die zahl 4) //wenn an der stelle '3' stand, ist t danach 3. x = (input[i]-'a') % 8; //gleiches machen wir mit buchstaben und dem 1. zeichen jeder dreiergruppe //x ist also 0, wenn der buchstabe ein a ( oder jeder 8. buchstabe danach) war. //(durch das mod) //Bsp: input[i] sei 'e' -> 'e'-'a' = 4->x = 4. y = (input[i+2]-'a') % 8; //gleiches fr y und dem letzten buchstaben jeder dreiergruppe //aus a2c wird also: //t = '2'-'0' = 2 //x = ('a'-'a')%8 = 0%8=0 //y = ('c'-'a')%8 = 2%8=0 switch(t){ case 1: //wir addieren bei bestimmte felder der matrix 1 map[x][y] += 1; map[x][y+1] += 1; map[x+1][y+1] += 1; //Folgend ein bildchen... (x = 1 addiert) //achtung... (0,0) (in dem fall (x,y)) ist oben links :D // | x x+1 //____|_______ //y | +1 +0 //y+1 | +1 +1 //da vorher alles 0 war, malen wir also ein L in die matrix break; case 2: //gleiches geschieh hier, nur ist das L gedreht // | x x+1 //____|_______ //y | +1 +1 //y+1 | +1 +0 map[x][y] += 1; map[x+1][y] += 1; map[x][y+1] += 1; break; case 3: //wieder nichts neues // | x x+1 //____|_______ //y | +1 +1 //y+1 | +0 +1 map[x][y] += 1; map[x+1][y] += 1; map[x+1][y+1] += 1; break; case 4: //und wieder gedreht // | x x+1 //____|_______ //y | +0 +1 //y+1 | +1 +1 map[x+1][y] += 1; map[x+1][y+1] += 1; map[x][y+1] += 1; break; default: ok = 0; break; } } //wenn ok 1 ist, und wenn test_map(map) 1 zurck gibt, ist ok 1 ok = ok && test_map(map); //wenn ok 0 ist, kommt bad try if(!ok) printf("Bad try.\n"); else//sonst Your kung-fu is amazing printf("Your kung-fu is amazing!\n"); return 0;}void prepare(int map[8][8]){ int i,j; //wird durchlaufen alle zellen for(i = 0; i < 8; i++) for(j = 0; j < 8; j++) // und setzen diese 0 map[i][j] = 0; //wir initialisieren den zufallsgenerator (siehe google) srand(time(NULL)); i = rand()%8; j = rand()%8; // i und j sind nun zufllige zahlen zwischen (einschlielich) 0 und 7 map[i][j] = 1; //genau die zelle mit der koordinate (i,j) von map setzen wir 1 //und benutzen i und j als ID. printf("Please insert the pin with id: %d-%d\n\n",i,j);}int test_map(int map[8][8]){ int i, j; //wir setzen ok auf 1, int ok = 1; //und durchlaufen alle zellen in map, hren aber auf, wenn ok == 0 wird for(i = 0; (i < 8) && (ok); i++) for(j = 0; (j < 8) && (ok); j++) //ok bleibt so lange 1, bis map[i][j] nicht 1 ist. ok = ok && (map[i][j] == 1); //wir geben also 1 zurck, wenn jede zelle der matrix 1 ist, sonst 0 return ok;}/* Die Ausgabe kommt, wenn zum Schluss alle Felder der Matrix map 1 sind. Sie sind 1, wenn die L-Bausteine richtig in die Matrix gesetzt wurden. Eine zufllige zelle ist von beginn an 1. Die ID sind die Koordinaten. Der Algorithmus nimmt sich immer Gruppen aus 3 Ziffern aus der Eingabe und setzt abhngig davon den L-Baustein. Es knnen maximal 63 / 3 = 21 L-Bausteine gesetzt werden. Sind am ende nicht alle Zellen 1, erscheint die Nachricht "bad try". */