C :: Aufgabe #131 :: Lösung #1

1 Lösung Lösung öffentlich
#131

Erzeugen einer Text-Spirale

Anfänger - C von hak - 08.10.2016 um 20:06 Uhr
Schreibe ein Programm das einen beliebigen Text in Spiralform ausgibt!

Für den Input "123456789" sollte das Programm ausgeben:
543
612
789

Beispiel im Anhang: das Alphabet in Spiralform (Python)
#1
vote_ok
von devnull (8870 Punkte) - 16.11.2016 um 16:24 Uhr
Die Ausgabe enthält noch Debugzeilen, welche die Moves des Spiral-Algorithmus anzeigen.

Konsolenausgabe:

$ ./spirale 1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ
...
try regular move to ( -1 , -3)
not vacant, move to ( -3 , -5)
try regular move to ( -3 , -3)
not vacant, move to ( -5 , -5)
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . Z Y X W V U . . .
. . . G F E D C T . . .
. . . H 5 4 3 B S . . .
. . . I 6 1 2 A R . . .
. . . J 7 8 9 0 Q . . .
. . . K L M N O P . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .

Quellcode ausblenden C-Code
/********************************************
 * spirale.c  Textspirale
 ********************************************/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#define SIZE 12
char grid[SIZE][SIZE];

/* auxiliary functions */

int p2i(int x) { 
/* convert position to index */
	return (x>>1) + SIZE/2; 
}

int vacant(int x, int y) {
/* return true if grid position is vacant */
    return (grid[p2i(x)][p2i(y)]) ? 0 : 1;
}

void fill(int x, int y, char c) {
/* set character on grid position */
    grid[p2i(x)][p2i(y)] = c;
}

void pr(int x, int y) {
/* debug */
    printf("try regular move to (%3d ,%3d)\n", x, y);
}

void pc(int x, int y) {
/* debug */
    printf("not vacant, move to (%3d ,%3d)\n", x, y);
}

void show_grid(void) {
    int x, y;

    for (y=0; y<SIZE; y++) {
      for (x=0; x<SIZE; x++)
        printf(" %c", (grid[x][y]) ? grid[x][y]:'.');
      printf("\n");
    }
}

/*** main ***/
int main(int argc, char **argv) {
    int x1, x2, y1, y2;
    int i, len=0;

    if (argc < 2) return 0;
    len = strlen(argv[1]);
    if (len == 0) return 0;
    
    /* Init */
    memset(grid, 0, sizeof(grid));
    x1 = -1;
    y1 =  1;
    fill(x1, y1, argv[1][0]);

	/* loop through string */
    for (i=1; i<len; i++) {
        if (x1 > 0 && y1 < 0) {
            /* Quadrant I */
            x2 = x1 - 2;
            y2 = y1;
            pr(x2, y2);
            if (!vacant(x2,y2)) {
                x2 = x1;
                y2 = y1 - 2;
                pc(x2, y2);
            }
        }
        else if (x1 < 0 && y1 < 0) {
            /* Quadrant II */
            x2 = x1;
            y2 = y1 + 2;
            pr(x2, y2);
            if (!vacant(x2,y2)) {
                x2 = x1 - 2;
                y2 = y1;
                pc(x2, y2);
            }
        }
        else if (x1 < 0 && y1 > 0) {
            /* Quadrant III */
            x2 = x1 + 2;
            y2 = y1;
            pr(x2, y2);
            if (!vacant(x2,y2)) {
                x2 = x1;
                y2 = y1 + 2;
                pc(x2, y2);
            }
        }
        else {
            /* Quadrant IV */
            x2 = x1;
            y2 = y1 - 2;
            pr(x2, y2);
            if (!vacant(x2,y2)) {
                x2 = x1 + 2;
                y2 = y1;
                pc(x2, y2);
            }
        }
        x1 = x2;
        y1 = y2;
        fill(x1, y1, argv[1][i]);
    }
    show_grid();
    return 0;
}

Kommentare:

Für diese Lösung gibt es noch keinen Kommentar

Bitte melden Sie sich an um eine Kommentar zu schreiben.
Kommentar schreiben
1827041

Du scheinst einen AdBlocker zu nutzen. Ich würde mich freuen, wenn du ihn auf dieser Seite deaktivierst und dich davon überzeugst, dass die Werbung hier nicht störend ist.