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.
- Diseñar un subalgoritmo que devuelva el valor más bajo de la imagen.
- 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.
- 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.
- 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.
------------------------------------------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.