[ Foro de Pascal ]

Duda: Buscar en Arrays

30-Dec-2007 17:57
Alberto Olid Sampedro
2 Respuestas

¡Hola a todos!

Tengo un ejercicio de informática y sólo me queda un apartado para terminarlo (el escrito en el segundo punto), pero no sé cómo diablos se hace. A ver si me podéis echar una mano vosotros. Os dejo el enunciado completo del ejercicio y el programa que llevo realizado hasta ahora:

-------------------------------------------------Ejercicio------------------------------------------------

Se desea diseñar un sistema de reconocimiento de imágenes para un satélite. El software asociado debe realizar distintos tipos de operaciones con imágenes almacenadas en matrices de m x n elementos. Cada punto de la imagen está representado por un color codificado mediante un entero en el rango 0-255.

  1. Diseñar un subalgoritmo que devuelva el valor más bajo de la imagen.
  2. Diseñar un subalgoritmo que cree un vector con todos los colores utilizados en la imagen y otro vector con las veces que ha aparecido dicho color.
  3. Diseñar un algoritmo al que se le de una imagen y le sume el valor más bajo (usar la función del primer apartado) a todos los elementos de la misma, excepto a aquellos que estén en el borde.
  4. Diseñar un subalgoritmo que lea una imagen y muestre en pantalla las coordenadas de aquellos puntos que, no siendo puntos del borde, tienen un color por debajo de la media.

Hacer un menú en el programa principal con las opciones que se han indicado y llamar a los procedimientos a partir de ese menú. Además este menú se podrá ejecutar un número ilimitado de veces (hasta que el usuario introduzca 0).
Además deberemos implementar las siguientes funciones:

  • Inicializar matriz, dado un número de filas y columnas (habrá un Máximo de filas y columnas que será constante).
  • Mostrar matriz.
    (Estos dos módulos también pueden incluírse en el menú).

------------------------------------------------Programa------------------------------------------------


Program Matriz;

Uses Crt;

Const
  MaxFil=3;
  MaxCol=3;

Type
  a=Array[1..MaxFil,1..MaxCol] of Integer;
  b=Array[1..255] of Integer;

Var
  k,z,Inf,Opcion: Integer;
  vector: a;
  colores,buscador: b;

{----------------------------------------------------------------------------}
  Procedure Escribir(var vector: a);

    Begin

      For k:=1 To MaxFil Do
        Begin

          For z:=1 To MaxCol Do
            Begin

              Repeat
                writeln('Introduzca un valor, para el elemento la imagen, comprendido entre 0 y 255.');  {Se le pide al usuario que introduzca los valores de la imagen en la matriz}
                readln(vector[k][z]);

                If ((vector[k][z] > 255) Or (vector[k][z] < 0))
                  Then
                    Begin
                      writeln('El número introducido no es válido. Por favor, escriba un valor dentro del rango aceptado.');
                    End;

              Until ((vector[k][z] >= 0) and (vector[k][z] <= 255));

            End;

        End;

      writeln;
    End;

{----------------------------------------------------------------------------}
  Procedure Mostrar(var vector: a);

    Begin

      For k:=1 To MaxFil Do
        Begin

          For z:=1 To MaxCol Do
            Begin
              write(vector[k][z]);  {Escribe la matriz en la pantalla}
              write(' ');
            End;
          writeln;

        End;

    End;
{----------------------------------------------------------------------------}

  Function Valor_Inferior(var vector:a): Integer;

    Begin

      Inf:=vector[1][1];  {Mínimo valor introducido en la matriz}

      Repeat

        For k:=1 To MaxFil Do
          Begin

            For z:=1 To MaxCol Do
              Begin

                If vector[k,z] < Inf
                  Then
                    Begin
                      Inf:=vector[k][z];  {Si el valor del elemento a[i,j] es menor que el de Inf, éste último pasará a valer lo del primero}
                    End;

              End;

          End;

      Until vector[k][z]=vector[MaxFil][MaxCol];  {Se repite la búsqueda del valor mínimo hasta que ya se hayan comparado todos los elementos de la matriz}

      writeln;
      writeln('El valor más bajo de la imagen es (', Inf,')');  {Escribe en la pantalla el valor mínimo de la matriz}
      Valor_Inferior:= Inf;
    End;
{----------------------------------------------------------------------------}

[Aquí es donde iría el subalgoritmo del segundo punto.]

{----------------------------------------------------------------------------}

  Function Combinacion(var vector:a; Inf:Integer): Integer;  {La función sumará, a todos los elementos que no estén el los extremos, el menor valor de la matriz}

    Begin

      For k:=2 To MaxFil-1 Do  {Para evitar las filas de los extremos, comenzamos el bucle a partir de la segunda fila y lo finalizamos en la penúltima fila}
        Begin

          For z:=2 To MaxCol-1 Do  {Para evitar las columnas de los extremos, comenzamos el bucle a partir de la segunda columna y lo finalizamos en la penúltima columna}
            Begin
              vector[k][z]:=vector[k][z]+Inf;  {A cada elemento de la matriz, que esté situado en el extremo de la misma, le sumamos el menor valor que contiene ésta}
            End;

        End;

      writeln('La matriz final queda de la siguiente forma:');
      writeln;

      Mostrar(vector);  {Muestra en pantalla la matriz final}

      Combinacion:= vector[k][z];
    End;
{----------------------------------------------------------------------------}

  Function Coordenadas(var vector:a): Integer;  {Este procedimiento debe mostrar por pantalla las coordenadas de aquellos valores de la matriz que, no estando en el borde, sean inferiores a la media}

    Var
      Media: Real;
      Suma:Integer;

    Begin

      Suma:=0;  {Como "Suma" es un contador,la igualamos a 0 antes de comenzar el bucle}

      For k:=1 To MaxFil Do
        Begin

          For z:=1 To MaxCol Do
            Begin
              Suma:=Suma+vector[k][z];  {"Suma" pasa a tener el valor anterior más el del elemento de la matriz por el que vaya el bucle}
            End;

        End;

      Media:=(Suma) DIV (MaxFil*MaxCol);  {"Media" es el resultado de dividir "Suma" entre el máximo de filas por el de columnas, ya que estos últimos indican el total de elementos que posee la matriz}
      writeln('El valor medio es:', Media:2:4);
      writeln;
      writeln('Las coordenadas de los puntos que no están en el borde y tienen un valor inferior a la media son:');
      writeln;
      For k:=2 To MaxFil-1 Do
        Begin

          For z:=2 To MaxCol-1 Do
            Begin

              If vector[k][z] < Media Then
                Begin
                  writeln('(',k,',',z,')');  {Aquí se muestran por pantallas las coordenadas de los puntos que tienen un valor inferior al de la media y no están en el borde}
                End;

            End;

        End;

    End;
{----------------------------------------------------------------------------}

Begin

  ClrScr;

  Escribir(vector);
  Mostrar(vector);

  Repeat

    writeln;
    writeln('El programa le ofrece la posibilidad de realizar cualquiera de las siguientes operaciones:');
    writeln;
    writeln('1.- El programa devuelve el valor más bajo de la imagen introducida.');
    writeln('2.- El programa crea una matriz con los colores usados por la imagen y otra con el número de veces que ese color aparece en la imagen.');
    writeln('3.- El programa suma, a todos los elementos de la imagen que no estén en los bordes, el valor más bajo de la imagen.');
    writeln('4.- El programa muestra las coordenadas de los valores que no estan en los bordes de la imagen y tienen un valor inferior al de la media.');
    writeln('0.- Pulse 0 si no desea realizar ninguna opción del programa.');
    writeln;
    writeln('Indique la operación que desea realizar con el programa.');
    readln(Opcion);

    Case Opcion Of
      1:
          Begin
            writeln;
            Inf:= Valor_Inferior(vector);  {Llama a la función para que averigüe cuál es el valor mínimo de los elementos de la matriz}
            writeln;
          End;
      2:
          Begin
            writeln;
          End;
      3:
          Begin
            writeln;
            vector[k][z]:= Combinacion(vector, Valor_Inferior(vector));  {Llama a la función para que le sume el valor más bajo de los elementos de la matriz a aquellos valores que no están en los bordes de la misma}
            writeln;
          End;
      4:
          Begin
            writeln;
            Coordenadas(vector);  {Llama a la función para que muestre por pantalla las coordenadas de aquellos elementos de la matriz que tienen un valor más bajo que la media}
            writeln;
          End;

    End;
    writeln;

  Until Opcion=0;
  writeln('Pulse INTRO para salir del programa');
  readln;

End.


-------------------------------------------------------------------------------------------------------------

Os agradezco la ayuda de antemano y, si creéis que debería corregir algo o comentar más cosas en el programa, decídmelo, por favor.


02-Jan-2008 00:09
Nacho Cabanes (+31)


Diseñar un subalgoritmo que cree un vector con todos los colores utilizados en la imagen y otro vector con las veces que ha aparecido dicho color.


Se podría hacer incluso con un sólo array. Como los colores son de 0 a 255, bastaría con un

cantidadColor: array[0..255] of longint;

Se inicializa el array a ceros, y luego se da un barrido por todos los puntos de la imagen:

For k:=1 To MaxFil Do
Begin

For z:=1 To MaxCol Do
Begin
inc( cantidadColor[ vector[k][z] ]);
End;

End;


Si quieren que lo hagas con dos arrays, puede que sea para obligarte a trabajar con un triple "for" (revisar cada fila, cada columna y comparar con todos los colores):

CantidadColores = 0
Para cada fila K
--Para cada columna Z
----ColorExistia = Falso
----Para cada color C en primer array
------Si el color de [K,Z] coincide con C
--------Aumentar contador de C en segundo array
--------ColorExistia = Verdadero
-------Fin Si
-----Fin Para C
-----Si ColorExistia = Falso
------Aumentar CantidadColores
------Añadir nuevo color en primer array
------Contador de C en segundo array = 1


Suerte con ello!

(Y feliz año)


07-Jan-2008 17:34
Alberto Olid Sampedro

Muchas gracias por la ayuda, me fue muy útil y conseguí terminar el programa^-).

¡Hasta otra!






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)