[ Foro de Pascal ]
Cordial saludo profesor Nacho Cabanes y compañeros.
queria preguntarles por un problemita que tengo en un programa que estoy realizando, y referente a que de alguna manera para resumirlo, necesito encontrar el minimo en una matriz para una fila de ella cualquiera que se pasa como parametro , pero con la particularidad que debo hacerlo solo para los valores que contenga en dicha fila direntes a cero.
ejemplo
supongamos que la fila pssada como parametor es la 1 y los valores de la matriz en esa fila son:
18 2 25 0 7 15 0 9 3
como vemos para este caso el valor minimo seria 2, sin tener encuenta los valores de la posicion (1,4) y (1,7) que como vemos son cero y no deben tenerse encuenta para el calculo del minimo valor para esta fila de la matriz.
cualquier ayuda u orientacion sera bienvenida, ojala profesor nacho, intervengas con tu siempre valiosa ayuda.
mil gracias, y cada dia mejorando un poco mas.
Buscar un mínimo de un vector / matriz / array / lista entre una serie de datos que no estén ordenados se hace siempre de la misma forma: tomas el primer dato como mínimo provisional y vas comparando todos los siguientes con el que en cada momento sea el mínimo actual:
- Minimo = primer dato
- Para datos = segundo hasta último
- Si datos[i] < minimo entonces minimo = datos[i]
- FinPara
Una alternativa es no tomar el primer dato sino un valor que claramente es incorrecto y que con total seguridad será reemplazado por el valor real. Por ejemplo, con tus datos, que son números enteros pequeños, podrías tomar una valor muy grande (pero que siga siendo un entero válido), por ejemplo:
- Minimo = 30000
- Para datos = primero hasta último
- Si datos[i] < minimo entonces minimo = datos[i]
- FinPara
En tu caso, la primera solución es arriesgada, porque quizá el primer dato sea un cero, que no deberías tomar, así que puedes mejorar esa solución para que siga mirando los siguientes valores hasta encontrar uno que no sea cero, o bien directamente usar la segunda forma de buscar.
Sólo tendrías que añadir la condición de que el dato no sea cero:
- Minimo = 30000
- Para datos = primero hasta último
- Si datos[i]<>0 y datos[i] < minimo entonces minimo = datos[i]
- FinPara
cordial saludo profesor Nacho.
profesor respecto a las posibles alternativas que me indicas he realizado el programa que estaba haciendo con la alternativa dos
es decir:
Minimo = 30000
para datos = primero hasta último
Si datos[i]<>0 y datos[i] < minimo entonces minimo = datos[i]
FinPara
y me funciona segun lo esperado, sin embargo me gustaria saber el planteamiento que me indicas en el caso de utilizar la alternativa uno es decir:
Minimo = primer dato
- Para datos = segundo hasta último
- Si datos[i] < minimo entonces minimo = datos[i]
- FinPara
para cuando el primer valor del vector sea cero, porejemplo:
0 18 24 0 5 9 0 2 6
o para el caso:
18 0 24 0 5 9 2 0 6
como podria ser la forma de resolverlo con esta alternativa??
gracias.
Gracias profesor, ya pude lograrlo gracias como siempre.
Bueno, revisa este código a ver si hace lo que pides:
program EncontrarMinimo;
uses Crt;
var
Minimo, i, cont: integer;
datos: array[1..10] of integer;
Begin
ClrScr;
(* Asignamos los valores de tu ejemplo en el e-mail *)
datos[1]:=0;
datos[2]:=12;
datos[3]:=3;
datos[4]:=5;
datos[5]:=0;
datos[6]:=25;
datos[7]:=18;
datos[8]:=0;
datos[9]:=9;
datos[10]:=34;
(* encuentra el primer subíndice (de izquierda a derecha) para el cual el array no es cero *)
cont:= 1;
while datos[cont]=0 do
begin
cont:= cont + 1;
end;
if cont=11 then
write('Todos ceros.')
else
begin
(* se inicializa Minimo con el primer elemento distinto de cero *)
Minimo:= datos[cont];
(* comenzamos a contar desde el primer elemento distinto de cero y aplicamos el proceso ya conocido *)
for i:=cont to 10 do
if datos[i] <> 0 then
if datos[i] < Minimo then
Minimo:= datos[i];
writeln('El Valor Minimo es: ',Minimo);
end;
readln;
End.
Saludos.
(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.)