[ Foro de Pascal ]
¡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.
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:
------------------------------------------------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.
For k:=1 To MaxFil Do
Begin
For z:=1 To MaxCol Do
Begin
inc( cantidadColor[ vector[k][z] ]);
End;
End;
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.)