All pastes #2028808 Raw Edit

Miscellany

public c v1 · immutable
#2028808 ·published 2010-12-25 10:56 UTC
rendered paste body
/*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".	*/