Test Foro de elhacker.net SMF 2.1

Programación => Programación General => Ejercicios => Mensaje iniciado por: Traspuesto en 26 Diciembre 2007, 22:03 PM

Título: Pascal: Buscar en una matriz.
Publicado por: Traspuesto en 26 Diciembre 2007, 22:03 PM
¡Hola a todos!

Tengo un ejercicio de informática y sólo me queda un apartado para terminarlo (el escrito en rojo), 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.


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:
(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.
Título: Re: Pascal: Buscar en una matriz.
Publicado por: Traspuesto en 7 Enero 2008, 17:36 PM
Ya conseguí hacer el apartado ese y terminar el programa :P. Si alguien quiere saber cómo lo hice, que me lo pida y le paso el apartado ese del buscador xD

¡Hasta otra!
Título: Re: Pascal: Buscar en una matriz.
Publicado por: barbate en 21 Abril 2008, 23:21 PM
Cita de: Traspuesto en  7 Enero 2008, 17:36 PM
Ya conseguí hacer el apartado ese y terminar el programa :P. Si alguien quiere saber cómo lo hice, que me lo pida y le paso el apartado ese del buscador xD

¡Hasta otra!

podrias pegar el codigo terminado, seguro que a muchos nos viene bien.

un saludo