• Lenguaje

    Pascal

  • Descripción

    Pide el número de renglones y columnas de una matriz de números enteros y la rellena en forma de espiral o caracol.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
program espiral;
uses crt;

type
    enumdireccion  = (DERECHA, ABAJO, IZQUIERDA, ARRIBA);
    integerarray   = array[0..0] of integer;
    pintegerarray  = ^integerarray;
    integermatrix  = array[0..0] of pintegerarray;
    pintegermatrix = ^integermatrix;
var
    renglones, columnas, renglon, columna, i : integer;
    direccion : enumdireccion;
    matriz : pintegermatrix;
    tecla : char;

begin
    i := 1;
    direccion := DERECHA;
    write ('Ingrese el n'#163'mero de renglones: ');
    readln (renglones);
    write ('Ingrese el n'#163'mero de columnas : ');
    readln (columnas);
    getmem (matriz, sizeof (pintegerarray) * renglones);
    for renglon := 0 to renglones - 1 do
        begin
            getmem (matriz^[renglon], sizeof (integer) * columnas);
            for columna := 0 to columnas - 1 do
                matriz^[renglon]^[columna] := -1;
        end;
    renglon := 0;
    columna := 0;
    while matriz^[renglon]^[columna] = -1 do
        begin
            matriz^[renglon]^[columna] := i;
            inc (i);
            case direccion of
                DERECHA:
                    if (columna+1<columnas) and (matriz^[renglon]^[columna+1]=-1) then
                        inc (columna)
                    else
                        begin
                            direccion := ABAJO;
                            inc (renglon);
                        end;
                ABAJO:
                    if (renglon+1<renglones) and (matriz^[renglon+1]^[columna]=-1) then
                        inc (renglon)
                    else
                        begin
                            direccion := IZQUIERDA;
                            dec (columna);
                        end;
                IZQUIERDA:
                    if (columna>0) and (matriz^[renglon]^[columna-1]=-1) then
                        dec (columna)
                     else
                        begin
                            direccion := ARRIBA;
                            dec (renglon);
                        end;
                ARRIBA:
                    if (renglon>0) and (matriz^[renglon-1]^[columna]=-1) then
                        dec (renglon)
                    else
                        begin
                            direccion := DERECHA;
                            inc (columna);
                        end;
            end;
        end;
    writeln (#10#13'Resultado:');
    for renglon := 0 to renglones - 1 do
        begin
            write ('[');
            for columna := 0 to columnas - 1 do
                write ('  ', matriz^[renglon]^[columna]:3);
            writeln ('  ]');
        end;
    write (#10#13'Presione una tecla para terminar . . . ');
    tecla := readkey;
end.