[ Foro de Pascal ]

minimo en fila de matriz sin inlcuir los valores cero...

17-Mar-2012 18:29
oscar gomez
4 Respuestas

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.


18-Mar-2012 12:15
Nacho Cabanes (+84)

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


19-Mar-2012 16:50
oscar gomez

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.


19-Mar-2012 21:16
oscar gomez

Gracias profesor, ya pude lograrlo gracias como siempre.


20-Mar-2012 16:22
Luis Torres (+18)

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.)