[ Foro de Pascal ]

resumen

02-Feb-2014 21:53
Invitado (Carlos Jurado)
11 Respuestas

hola buenasm profesor nacho y compañeros especialmente a luis que siempre me ayuda desde que conoci este foro.
mi inquietud y la ayuda que les pido en esta ocasion es como hago si tengo un archivo con datos enteros como :
datos.txt
1      20
 5     35
 1     10
 3     25
 1     12
  5     40
 y quiero un archivo resul.txt:
1
 1     42
3
  3    25
5
  5    75

como ven mi intencion es que se sume aquellos valores de la columna 1 que se repiten y se agrupen y ademas ordenados de menor a mayor , a traves de archivos, si me pudieran ayudar les agradezco mucho.






03-Feb-2014 18:47
Nacho Cabanes (+84)

Yo lo haría volcando los datos a un array. La forma más simple puede ser que el primer dato actúe como índice y el segundo sea el valor a guardar:


readLn(fichero, indice, valor);
dato[indice] := dato[indice]+valor;
...
for i:=1 to maximo do
  if dato[indice] > 0 then writeLn(indice, '  ', dato[indice]);



03-Feb-2014 20:12
Invitado (Carlos Jurado)

Gracias profesor por responderme, sin embargo quede en las mismas, y es que no entiendo para ti que es indice y que es valor y que hace:
dato[indice] := dato[indice]+valor;
te agradeceria si pudieras explicarme un poco mas es que estoy algo perdido en el ejercicio.


03-Feb-2014 20:16
Invitado (Carlos Jurado)

profesor ademas por que haces:for i:=1 to maximo do que es maximo si la idea del ejercicio es tratarlo con archivo de texto ???? disculpa mi inquietud y gracias una vez mas


03-Feb-2014 20:22
Nacho Cabanes (+84)

En un array, si haces


dato[5] := 20;


quiere decir que en la posición 5 (el índice) estás guardando el valor 20.

Si haces


dato[5] := 20;
dato[5] := dato[5] + 10;


vas incrementando el valor guardado en esa posición del array.

Y lo de hacer un "for" es porque tendrás que ir guardando en algún sitio lo que vas leyendo del fichero de texto, y lo más natural (al menos para alguien que está empezando a programar) es usar un "array".


03-Feb-2014 20:55
Nacho Cabanes (+84)

El fuente completo, mostrando en pantalla para no complicarlo con detalles poco importantes, podría ser:


program LeeDatos;

const
    maxArray = 10; (* Valor máximo del primer número *)

var
    fichero: text;
    indice, dato, i: integer;
    informacion: array[1..maxArray] of integer;
        
begin
    (* Inicializamos el array *)
    for i := 1 to maxArray do
        informacion[i] := 0;
        
    (* Lectura de fichero, rellenando el array *)
    assign(fichero, 'datos.txt');
    reset(fichero);
    while not eof(fichero) do
    begin
        readLn(fichero, indice, dato);
        informacion[indice] := informacion[indice] + dato;
    end;    
    close(fichero);
    
    (* Finalmente, mostramos todo el array *)
    for i := 1 to maxArray do
        if informacion[i] > 0 then 
            writeLn(i, '  ', informacion[i]);
end.



03-Feb-2014 22:23
Invitado (Carlos Jurado)

Excelente explicacion y con el programa completo mejor aun pues lo entendi y era justo lo que necesitaba muy agradecido profesor, muy bueno este foro


03-Feb-2014 23:18
Invitado (Carlos Jurado)

profesor queria expandir mi pregunta ahora , a como seria se se utilizara un record, me podrias ayudar un poco a como se transformaria tu ultimo codigo el del programa completo, utilizando un tipo de dato record y especificamente en la especificacion del array que hace la sumatoria, gracias por tu amable ayuda.


04-Feb-2014 11:40
Nacho Cabanes (+84)

Amplía tú mismo ejemplo y pregunta las dudas que te surjan al intentarlo.

Si te limitas a "mirar los programas de otros", no conseguirás coger una buena base: te parecerá que lo entiendes, pero te quedarán lagunas.

En algún punto tienes que empezar a "teclear" tú los programas, a encontrarte con los problemas y tratar de resolverlos. Se aprende mucho más si te ayudan con una duda puntual que tú has intentado solucionar y no has podido, que si alguien te da todo hecho.


04-Feb-2014 15:34
Luis Torres (+18)

Lo que dice el profesor es correcto. Yo una vez tardé una semana tratando de resolver un solo ejercicio que me tenía trabado, y yo sentí en que esa semana había aprendido más que en todo el semestre que dura la materia, me dio más ánimo para aprender más cosas y una visión más amplia de las cosas.


04-Feb-2014 16:21
Invitado (Carlos Jurado)

respondiendo a sus sugerencias, pueden tener razon en ciertas cosas no mas,, por que de hecho tambien grandes maestros y programadores por lo que he leido se han hecho no solo practicando, sino viendo distintas soluciones y aprendiendo de ellas otras estrategias que si no las ves quiza jamas se pasarian por la cabeza...de otra forma a veces no es que no se haya intentado realizar un ejercicio, simplemente que no es bueno tampoco poner codigo quiza absurdo para muchos de los que si saben...de todas formas gracias a los dos aunque difiera en opinion pues entre otras cosas a veces lo mejor es lo practico y es mejor preguntar y no quemarte la cabeza semanas...


04-Feb-2014 16:33
Nacho Cabanes (+84)

Lo del "código absurdo" no existe. Cualquier código ha tenido una razón de existir, y aunque esa razón sea haber entendido algo mal, eso no es suficiente motivo para no usar ese código como punto de partida para mejorar (y para descubrir qué es lo que se entendió mal). Por una parte, de los errores propios es de donde más se aprende. Por otra parte, mi abuela decía algo que intento recalcar a mis alumnos (presenciales): "quien pregunta una duda, quizá pase por tonto un momento; quien no se atreve a preguntar por vergüenza de lo que dirán, será tonto toda la vida".

En cuanto al tiempo que se debe dedicar... a mis alumnos (presenciales) les digo que no dediquen más de media hora a "intentar" un ejercicio. Si en media hora de hacer intentos, siguen atascados, que no tengan reparo en preguntar. Pero que la única forma (real) de aprender es intentando resolver los problemas por uno mismo.

Por supuesto, quien busca la excelencia no lo intenta resolver sólo de una forma: busca (lee) formas alternativas y las prueba. Pero insisto: las prueba. Si no pruebas (y diría más, "si no te equivocas al probar"), no aprendes. Llevo muchos años formando nuevos programadores, y la experiencia me dice que el que "estudia los apuntes" pero no intenta resolver los problemas, fracasa en los exámenes.






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