[ Foro de Pascal ]
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.
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]);
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.
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
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".
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.
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
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.
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.
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.
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...
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.)