[ Foro de Pascal ]

Ejercicio Ficheros con tipo

05-Jul-2010 21:28
Javier Mena Mena
2 Respuestas

Hola a todos. Tenia una pequeña duda con los ficheros con tipo en pascal, mi pregunta era como se puede hallar el minimo y el máximo en un fichero, recorriendolo solo una vez. Es que tengo que hallar la media aritmética de los de valores aleatorios entre 1 y 10  que hay en el fichero, y al hallar esa media tengo que excluir todos los maximos y el minimos. Yo me quede aki:

procedure Calculo (var Fichero : Tfichero; nombref : string; var contador : integer; var resultado : real);
var
  suma, divide : integer;
  lectura : Tinfo;
begin
  suma := 0;
  divide := 0;
  abrir (Fichero, nombref, false);
  while (not eof (Fichero)) do
  begin
     read (Fichero, lectura);
     if (lectura.nota >= 1) and (lectura.nota <= 10) then
     begin
        suma := suma + lectura.nota;
        divide := divide + 1;
     end;
  end;
  if divide <> 0 then
     resultado := suma/divide
  else
     writeln('   ERROR: No tiene solucion. ');
  close (Fichero);
end;

Si alguien me puede ayudar Gracias:


06-Jul-2010 12:41
Antonio P.G.

Hola Javier.

Se me ocurren dos formas de resolverlo, de forma que se recorra el fichero sólo UNA VEZ. La primera:

a) Usar un array en el almacenemos las notas leídas, y luego tratar el array, eliminando los máximos y los mínimos, y teniendo en otra variable el número de elementos que hay en el array. Bueno, esto es con memoria estática, por lo que tendríamos el posible problema de "y qué pasa si tengo más notas que casillas de array". En ese caso, usaría una lista.

b) Ir leyendo las notas, como en el programa de arriba, lo único que tendríamos 4 variables auxiliares, a las que yo denominaría así:

-- mini  (el mínimo en sí).
-- n_mini (número de veces leído el mínimo).
-- maxi  (el máximo en sí).
-- n_maxi (número de veces leído el máximo).

Reconozco que este método se me acaba de ocurrir ahora. Pondré un ejemplo, y si no se entiende, se me dice, por favor, y lo escribo en pseudocódigo. Imaginemos la lista de notas siguiente:

2 2 2 1 1 3 4 5 8 8 10 10

Lo adjunto esto como un .txt (hecho en Word), porque aquí iba a tardar mucho.
Se basa en, por un lado, llevar la cuenta de los mínimos y de los máximos, y de por otro, añadir al futuro cálculo de la media los que veamos que no son ni máximos ni mínimos. Si una nueva lectura es mayor que el máximo que habíamos leído hasta ahora, metemos en la media lo que teníamos acumulado, e iniciamos un nuevo máximo con el número que acabamos de leer. Lo mismo con el mínimo.

Espero que se haya entendido. Si no, que se me avise, por fa.

¡Ciao!


11-Jul-2010 14:14
Nacho Cabanes (+31)

Hola, Javier.

Las respuestas de Antonio, como siempre, son buenas. Aun así, yo descartarúa lo de guardar los datos en un array o una lista, porque generalmente si te hablan de recorrer sólo una vez es porque no quieren que almacenes los datos en memoria, sino que vayas calculando "al vuelo" los valores que necesitas.

Apenas un par de pinceladas:

- Calcular el máximo y el mínimo en una sola pasada es fácil

* Lees el primer dato
* Lo tomas como máximo provisional y como mínimo provisional
* Para cada nuevo dato que leas
+ Lo comparas con el máximo provisional; si el nuevo dato es mayor que el máximo, ése será el nuevo máximo.
+ Lo comparas con el mínimo provisional; si el nuevo dato es menor que el mínimo, ése será el nuevo mínimo.

- Calcular la media en una pasada también es fácil:

* Valor inicial de la suma = 0
* Valor inicial del contador de datos = 0
* Lees un dato
* Lo añades al valor de la suma
* Aumentas el contador de datos
* Cuando hayas leido todos los datos, divides la suma entre el contador.

- Si esos dos casos se entienden, aplicarlo a tu problema no es difícil. En tu caso, tienes que fundir ambos problemas en uno, de la forma que dice Antonio: Antes de dividir la suma entre el contador de datos para calcular la media, deberás restar al contador de datos la cantidad de veces que aparece el máximo y la cantidad de veces que aparece el mínimo, y deberás restar a la suma todos esos máximos (su valor multiplicado por el número de veces que aparece) y todos esos mínimos (de la misma forma).

Suerte!






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