/************************************************************************************************************** * Schreiben Sie ein Programm, das einen Text einliest, diesen dabei zeilenweise in einer Tabelle speichert * * und anschließend codiert ausgibt, indem es ihn spaltenweise ausliest. Die Zeilen- und Spaltenzahlen sind * * vom Benutzer festzulegen. Überschüssige Zeichen in der Tabelle werden zufällig mit Kleinbuchstaben belegt. * * Überlegen Sie sich, wie Sie einen codierten Text decodieren könnten, wenn Sie die Zeilen- und Spaltenzahl * * der Codierung kennen. * * * * 1. Hinweis: * * Die Aufgabe ist ohne scanf und Strings zu lösen. * * * * 2. Hinweis: * * Im untenstehenden Beispiel wird der Text "Das ist ein Text." folgendermaßen in einer Tabelle mit vier * * Zeilen und fünf Spalten abgelegt: * * |D|a|s| |i| * * |s|t| |e|i| * * |n| |T|e|x| * * |t|.|?|?|?| * * * * Die Stellen mit Fragezeichen sind überschüssig und werden mit zufälligen Kleinbuchstaben belegt. * * * * Beispielhafter Ablauf: * * * * Die maximale Laenge der Nachricht ergibt sich aus dem Produkt der beiden Codes. * * * * >> Geben Sie die Anzahl an Zeilen ein: 4 * * >> Geben Sie die Anzahl an Spalten ein: 5 * * >> Geben Sie Ihren Text ein (max. 20 Zeichen): Das ist ein Text. * * Der umgeformte Text lautet: Dsntat .s Tr eekiixq * * * **************************************************************************************************************/ #include #include #include #define MAX_ZEILEN 10 #define MAX_SPALTEN 10 int gibZahlEin(int min, int max); void fuelleTabelleZufall(char tabelle[MAX_ZEILEN][MAX_SPALTEN], unsigned int zeilen, unsigned int spalten); void fuelleTabelle(char tabelle[MAX_ZEILEN][MAX_SPALTEN], unsigned int zeilen, unsigned int spalten); void gibTabelleAus(const char tabelle[MAX_ZEILEN][MAX_SPALTEN], unsigned int zeilen, unsigned int spalten); void gibCodeAus(const char tabelle[MAX_ZEILEN][MAX_SPALTEN], unsigned int zeilen, unsigned int spalten); int main() { char tabelle[MAX_ZEILEN][MAX_SPALTEN] = {0}; unsigned int spalten = 0; unsigned int zeilen = 0; srand(time(NULL)); printf("Wie viele Zeilen (max. %d): ", MAX_ZEILEN); zeilen = gibZahlEin(1, MAX_ZEILEN); printf("Wie viele Spalten (max. %d): ", MAX_SPALTEN); spalten = gibZahlEin(1, MAX_SPALTEN); fuelleTabelleZufall(tabelle, zeilen, spalten); printf("Text: "); fuelleTabelle(tabelle, zeilen, spalten); printf("Tabelle:\n"); gibTabelleAus(tabelle, zeilen, spalten); printf("Code: "); gibCodeAus(tabelle, zeilen, spalten); return 0; } void fuelleTabelleZufall(char tabelle[MAX_ZEILEN][MAX_SPALTEN], unsigned int zeilen, unsigned int spalten) { for(unsigned int i = 0; i < zeilen; i++) { for(unsigned int j = 0; j < spalten; j++) { tabelle[i][j] = rand() % ('z' - 'a' + 1) + 'a'; } } } void gibCodeAus(const char tabelle[MAX_ZEILEN][MAX_SPALTEN], unsigned int zeilen, unsigned int spalten) { for(unsigned int j = 0; j < spalten; j++) { for(unsigned int i = 0; i < zeilen; i++) { printf("%c", tabelle[i][j]); } } } void fuelleTabelle(char tabelle[MAX_ZEILEN][MAX_SPALTEN], unsigned int zeilen, unsigned int spalten) { char eingabe = '\0'; for(unsigned int i = 0; i < zeilen && eingabe != '\n'; i++) { for(unsigned int j = 0; j < spalten && eingabe != '\n'; j++) { eingabe = getchar(); if(eingabe != '\n') tabelle[i][j] = eingabe; else j--; } } } void gibTabelleAus(const char tabelle[MAX_ZEILEN][MAX_SPALTEN], unsigned int zeilen, unsigned int spalten) { for(unsigned int i = 0; i < zeilen; i++) { for(unsigned int j = 0; j < spalten; j++) { printf("%c", tabelle[i][j]); } printf("\n"); } } int gibZahlEin(int min, int max) { int zahl, geleseneWerte; do { geleseneWerte = scanf("%d", &zahl); while(getchar() != '\n') {} if(geleseneWerte != 1) printf("Keine Zahl! Erneute Eingabe: "); else if(zahl < min) printf("Zahl zu klein! Erneute Eingabe: "); else if(zahl > max) printf("Zahl zu gross! Erneute Eingabe: "); } while(geleseneWerte != 1 || zahl < min || zahl > max); return zahl; }