[ Foro de Pascal ]

Ejercicios con ficheros de texto

22-Jan-2014 00:59
natalia tavora
20 Respuestas

Hola a todos, estoy estudiando para rendir el final de programacion 1, la verdad es que la unica parte que me cuesta es la parte de archivos, entiendo la teoria pero me cuesta porque tengo poca practica, me seria de gran ayuda si alguien me puede enviar ejercicios para practicar, ya que cuando uno se ejercita aparecen las dudas....


22-Jan-2014 01:19
Nacho Cabanes (+31)

Aquí van unos pocos de ficheros de texto para empezar:

1.- Un programa que te pida tres nombres y los vuelque a un fichero de texto llamado "nombres.txt".

2.- Un programa que te pida nombres y los vaya volcando a un fichero de texto llamado "nombres2.txt", hasta que teclees "fin" (esa palabra no deberá volcarse a fichero).

3.- Un programa que muestre en pantalla todo el contenido del fichero "nombres2.txt".

4.- Un programa que pida al usuario una letra (por ejemplo, "a") y muestre en las líneas del fichero "nombres2.txt" que comienzan por esa letra.

5.- Un programa que pida al usuario una letra (por ejemplo, "a") y vuelque las líneas del fichero "nombres2.txt" que comienzan por esa letra a otro fichero llamado "nombres3.txt".

6.- Un programa que pida al usuario una palabra (por ejemplo, "hola") y diga cuántas veces aparece esa palabra en el fichero "nombres2.txt".

7.- Un programa que lea el contenido del fichero "nombres2.txt" (que puede estar desordenado) y lo vuelque, ordenado alfabéticamente, al fichero "nombres4.txt". En una primera aproximación, supón que todos los datos cabrán en memoria y se podrán ordenar en memoria.

8.- Un programa que lea el contenido del fichero "nombres2.txt" (que puede estar desordenado) y lo vuelque, ordenado alfabéticamente, al fichero "nombres4.txt". En esta aproximación, más lenta pero más fiable por no saturar la memoria, ordena directamente sobre fichero.

9.- Un programa que lea dos ficheros ordenados y vuelque su contenido a un nuevo fichero, que también quedará ordenado, leyendo sólo una línea de cada fichero de entrada cada vez.

10.- Un programa que pida al usuario el nombre de un fichero (de texto) y muestre en pantalla la cantidad de letras, palabras y líneas que contiene.


22-Jan-2014 16:04
Invitado (Carlos jurado)

Hola natalia,con el permiso y por supuesto la aprobacion del profesor nacho, te pido enviame tu correo donde pueda enviarte varios ejercicios de ficheros un tanto mas graficos y sus soluciones que por este medio no puedo escribirtelos por que se distorsionan, o por skype e intercambiamos ejercicios y dudas seria interesante pues de igual forma estoy en ese tema en la U, y el profesor en ese tema si que nos ha resuelto varios ejercicios yo estoy en murcia.
te dejo este que fue uno de los ejercicios con los que inicio el profesor este tema:

En un fichero ordenado, buscar el primer dato cuyo campo clave coincida con el valor suministrado en
laClave. Si existe dicho dato, se devuelve en elDato su valor, y en caso contrario true. En caso contrario,el valor devuelto en exito es falso, y el valor de elDato es indeterminado.


22-Jan-2014 22:48
natalia tavora

gracias profe, ahora me pongo a practicar :D

Carlos jurado mandamelos a [censurado]  pasame bien como es ese ejercicio porque no entiendo lo que queres decir en la ultima parte con lo de "... y en caso contrario true. En caso contrario,el valor devuelto en exito es falso, y el valor de elDato es indeterminado."


22-Jan-2014 23:34
Nacho Cabanes (+31)

Este es un foro abierto a Google y otros buscadores, así que es peligroso que dejéis aquí a la vista correos electrónicos y datos personales, puede ser una fuente de spam y de ataques. Avisadme cuando hayáis entrado en contacto y pueda editar el mensaje anterior, para que "censure" el correo de Natalia y no quede a la vista.

Por otra parte, me parecería más razonable compartir los ejercicios "en abierto" que por correo privado. La idea de un foro como éste es que pueda aprender cuanto más gente mejor, incluso los lectores ocasionales. Pero bueno... la decisión final es vuestra...


23-Jan-2014 00:37
natalia tavora

Profe ya puede editar el post.
Creo que tengo  la respuesta al primer ejercicio....

 
program ejercicio1;
var
F_nombre:text;
nombre:string;
p,i:integer;
procedure abrir_ archivo();
begin
assign(f_nombre,'c:\nombre.txt');
if (FileExists('C:\nombre.txt')=false)then
		Begin
			rewrite(f_nombre);
		end;
	end;
 
begin
abrir_ archivo();
for i:=0 to 2 do
	begin
		p:=filesize(f_nombre);
		seek(f_nombre,p);
		writeln('ingrese un nombre');
		readln(nombre);
		write(f_nombre,nombre);
	end;	
close(f_nombre);
end.
 



23-Jan-2014 00:44
natalia tavora


 
ejercicio 2
program ejercicio2;
var
F_nombre:text;
op,nombre:string;
p,i:integer;
procedure abrir_ archivo();
begin
assign(f_nombre,'c:\nombre2.txt');
if (FileExists('C:\nombre2.txt')=false)then
		Begin
			rewrite(f_nombre);
		end;
	end;
 
begin
abrir_ archivo();
writeln('presione una tecla para comenzar');
readln(op);
while (op <>'fin')do
	begin
		p:=filesize(f_nombre);
		seek(f_nombre,p);
		writeln('ingrese un nombre');
		readln(nombre);
		write(f_nombre,nombre);
		writeln('presione una tecla para cargar mas nombres');
		writeln('o escriba "fin" para terminar');
		readln(op);
	end;	
close(f_nombre);
end.
 



23-Jan-2014 01:04
Nacho Cabanes (+31)

Por ahora bien. Sólo dos mejoras: en ficheros de texto tiene sentido hacer seek: la posición avanza tras cada vez que lees o escribes; por otra parte, intenta que lo sencillo sea sencillo, no te preocupes (todavía) por si detalles más avanzadas, como si el fichero existe o no.

Yo lo simplificaría hasta algo así:

 
(*
Ficheros de texto 01;
Un programa que pida tres nombres
y los vuelque a un fichero de texto
llamado "nombres.txt".
*)
program ficheros01;
 
var
    fich:text;
    nombre:string;
 
begin
assign(fich,'nombre.txt');
rewrite(fich);
for i:= 1 to 3 do
    begin
    writeLn('ingrese un nombre');
    readln(nombre);
    writeLn(fich,nombre);
    end;    
close(fich);
end.
 



23-Jan-2014 01:08
natalia tavora


 
program ejercicio3;
var
F_nombre:text;
op,nombre:string;
p,i:integer;
procedure abrir_ archivo();
begin
assign(f_nombre,'c:\nombre2.txt');
if (FileExists('C:\nombre2.txt')=false)then
		Begin
			rewrite(f_nombre);// mi duda aca es si deberia abrirlo con reset  en esrt caso?
		end;
	end;
 
begin
abrir_ archivo();
p:=filesize(f_nombre);
 
for i:=0 to p do 
	begin
	seek(f_nombre,i);
		read(f_nombre,nombre);
		writeln(nombre);
	end;	
close(f_nombre);
end.
 



23-Jan-2014 01:08
natalia tavora


 
program ejercicio3;
var
F_nombre:text;
op,nombre:string;
p,i:integer;
procedure abrir_ archivo();
begin
assign(f_nombre,'c:\nombre2.txt');
if (FileExists('C:\nombre2.txt')=false)then
		Begin
			rewrite(f_nombre);// mi duda aca es si deberia abrirlo con reset  en esrt caso?
		end;
	end;
 
begin
abrir_ archivo();
p:=filesize(f_nombre);
 
for i:=0 to p do 
	begin
	seek(f_nombre,i);
		read(f_nombre,nombre);
		writeln(nombre);
	end;	
close(f_nombre);
end.
 



23-Jan-2014 01:11
natalia tavora

bien, mejor de lo que esperaba porque yo no vi en la facu ficheros de texto, solo vimos ficheros con tipo porque ya termianaba la cursada y el profe no llego con los temas, pero seguro que igual los toma  en el final...   viendo la correccion que hiciste ... pregunto, en los ficheros de texto no es necesario revisar si el archivo existe?


23-Jan-2014 01:18
natalia tavora


 
program ejercicio_04;
var
F_nombre:text;
nombre:string;
letra:char;
p,i:integer;
 
 
begin
assign(f_nombre,'c:\nombre2.txt');
rewrite(f_nombre);
writeln('ingrese una letra');
readln(letra);
p:=filesize(f_nombre);
for i:=0 to p do
begin
 
		read(f_nombre,nombre);
		if (nombre[0]:=letra) then
		begin
			writeln(nombre);
		end;	
			end;	
close(f_nombre);
end.
 



23-Jan-2014 01:28
natalia tavora


 
program ejercicio_05;
var
F_nombre, f_nombre2:text;
nombre:string;
letra:char;
p,i:integer;
 
 
begin
assign(f_nombre,'c:\nombre2.txt');
 assign( f_nombre3, 'c:\nombre3.txt' );    
   {$I-}                                 (* Sin comprobación E/S *)
   reset(f_nombre);                    (* Intentamos abrir uno *)
   {$I+}                                 (* La habilitamos otra vez *)
   if ioResult = 0 then                  (* Si todo ha ido bien *)
     begin
     rewrite( f_nombre3 );                (* Abrimos el otro *)
     end;
writeln('ingrese una letra');
readln(letra);
p:=filesize(f_nombre);
for i:=0 to p do
begin
 
		read(f_nombre,nombre);
		if (nombre[0]:=letra) then
		begin
			write(f_nombre3,nombre);
		end;	
			end;	
close(f_nombre);
close(f_nombre3);
end.
 



23-Jan-2014 01:33
natalia tavora


 
program ejercicio_06; 
var 
F_nombre:text; 
palabra,nombre:string; 
p,i,veces:integer; 
 
 
begin 
assign(f_nombre,'c:\nombre2.txt'); 
rewrite(f_nombre); 
writeln('ingrese una palabra'); 
readln(palabra); 
p:=filesize(f_nombre); 
veces:=0;
for i:=0 to p do 
begin 
 
read(f_nombre,nombre); 
if (nombre:=palabra) then 
begin 
veces:=veces+1
end;	
end;	
writeln('la palabra aparece :',veces,'veces en el archivo');
close(f_nombre); 
end.
 



23-Jan-2014 16:37
Nacho Cabanes (+31)

Por una parte: en fuentes más avanzados, sí conviene comprobar si el fichero existe, especialmente al leer, pero no tanto al escribir. Pero insisto: eso se hace en una segunda aproximación, cuando la lógica básica está clara. En tu caso, prueba tu programa cuando el fichero exista y también cuando el fichero no exista. Verás que falla, porque no haces "rewrite", pero aun así intentas acceder a un fichero que no existe.

Por otra parte, el ejercicio 3 DEBE usar "reset", porque "rewrite" destruye el fichero existente, y pretendes leer de él. Inténtalo de nuevo.  ;-)

El 4 se parece bastante a lo que debería ser, pero no puedes leer con un "for", porque un fichero de texto no tiene tantas líneas como su "filesize". El 5 falla en lo mismo.

Tu solución del 6 sólo funcionará bien para las líneas que contienen exactamente esa palabra y nada más, no para las que la contienen junto con algún texto adicional.

En general, se nota que no están probados, sino tecleados en el momento, porque todos tienen erratas de poca importancia como "for i:=0 to p do" o "if (nombre:=palabra)", además de que algunos usan "rewrite" en vez de "reset" o comprueban la existencia del fichero de forma incompleta.

Y por darte alguna solución y no sólo proponerte mejoras... El ejercicio 2 está bien (salvando los detalles que ya te he comentado para el 1, de los "seek" y de la existencia del fichero). Yo lo simplificaría hasta:

 
(*
Ficheros de texto 02;
Un programa que te pida nombres
y los vaya volcando a un fichero de
texto llamado "nombres2.txt", hasta
que teclees "fin" (esa palabra
no deberá volcarse a fichero).
*)
program ficheros02;
 
var
    fich:text;
    nombre:string;
 
begin
assign(fich,'nombre.txt');
rewrite(fich);
repeat
    writeLn('ingrese un nombre');
    readln(nombre);
    if nombre <> 'fin' then
        writeLn(fich,nombre);
until nombre = 'fin';
close(fich);
end.
 


(Verás que en los ejercicios de repaso suelo intentar conservar al principio del fuente un comentario con el enunciado, para saber de qué tratan si más adelante necesito revisarlos).


23-Jan-2014 22:10
natalia tavora

bien intente de nuevo el ejercicio 3 pero tengo una duda....

 
//3- Un programa que muestre en pantalla todo el contenido del fichero "nombres2.txt". 
program ejercicio3;
var
F_nombre:text;
nombre:string;
BEGIN
	assign(f_nombre,'c:\nombre2.txt');
	reset(f_nombre);
while (not eof) do // mi duda es como avanza al proximo nombre?... 
	begin
		read(f_nombre,nombre);
		writeln(nombre);
	end;	
close(f_nombre);
END. 
 



24-Jan-2014 12:20
Nacho Cabanes (+31)

Está casi perfecto. Para que avance a la siguiente línea, basta con que leas con "readLn" en vez de con "read".


24-Jan-2014 21:37
natalia tavora


 
//4.- Un programa que pida al usuario una letra (por ejemplo, "a") y muestre en las líneas del fichero "nombres2.txt" que comienzan por esa letra. 
program ejercicio_04;
var
F_nombre:text;
nombre:string;
letra:char;
begin
assign(f_nombre,'c:\nombre2.txt');
rewrite(f_nombre);
writeln('ingrese una letra');
readln(letra);
p:=filesize(f_nombre);
while ( not eof) do
	begin
		readln(f_nombre,nombre);
		if (nombre[0]:=letra) then
			begin
				writeln(nombre);
			end;	
	end;	
close(f_nombre);
end.
 



24-Jan-2014 21:42
natalia tavora


 
//Un programa que pida al usuario una letra (por ejemplo, "a") y vuelque las líneas del fichero "nombres2.txt" que comienzan por esa letra a otro fichero llamado "nombres3.txt". 
 
program ejercicio_05;
var
F_nombre, f_nombre2:text;
nombre:string;
letra:char;
begin
assign(f_nombre,'c:\nombre2.txt');
 assign( f_nombre3, 'c:\nombre3.txt' );
   {$I-}
   reset(f_nombre);
   {$I+} 
   if ioResult = 0 then
     begin
     rewrite( f_nombre3 );
     end;
writeln('ingrese una letra');
readln(letra);
while (not eof) do
begin
 
		readln(f_nombre,nombre);
		if (nombre[0]:=letra) then
		begin
			write(f_nombre3,nombre);
		end;	
			end;	
close(f_nombre);
close(f_nombre3);
end.
 



24-Jan-2014 22:01
natalia tavora


 
//06 Un programa que pida al usuario una palabra (por ejemplo, "hola") y diga cuántas veces aparece esa palabra en el fichero "nombres2.txt". 
program ejercicio_06; 
var 
F_nombre:text; 
palabra,nombre:string; 
veces:integer; 
 begin 
assign(f_nombre,'c:\nombre2.txt'); 
rewrite(f_nombre); 
writeln('ingrese una palabra'); 
readln(palabra); 
veces:=0;
while (not eof) do
begin 
 
readln(f_nombre,nombre); 
if (nombre:=palabra) then 
begin 
veces:=veces+1;
end;	
end;	
writeln('la palabra aparece :',veces,'veces en el archivo');
close(f_nombre); 
end.
 


mi duda es... use readln para guardar los nombres en el archivo ,entonces, no deberia guardar un nombre por linea??
a no ser que el usuario ingrese dos nombres juntos por ejemplo juan jose, para el caso en mi opinion este programa funciona
igual porque el usuario busca una palabra.... creo que en el caso de que el usuario ingrese para ver cuantas veces aparece juan
ignoraria los nombres compuestos como juan alberto, juan jose, juan pablo, etc por que los toma como uno solo...


26-Jan-2014 02:32
Nacho Cabanes (+31)

El 4 está bien, salvo algún pequeño detalle puntual, como el "filesize" (que es innecesario) y alguna error de sintaxis poco importante como "if (nombre[0]:=letra)"

Lo mismo ocurre con el 5, pero cuidado con el control de errores: si el fichero no existe, aun así, intentas leer de él y escribir en el otro.

El 6 tiene algún error más. Por una parte, usas "rewrite", con lo que destruirías el fichero en vez de leer de él. Por otra parte, hay algún error de sintaxis como "if (nombre:=palabra) then". Finalmente, sólo estás contando las palabras que coincidan exactamente con una frase. Si buscas "hola" y la frase es "hola hola", deberías contar 2, pero tu programa cuenta 0.  (Efectivamente, ésa es la parte difícil ;-D ).






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