[ Foro de C ]

Ejercicio 5.5.6

10-Aug-2014 23:34
Invitado (sara)
2 Respuestas

Buenas noches, tengo una duda en el siguiente ejercicio:
(5.6.6) Ampliar la base de datos de ficheros (ejemplo 53) para que se pueda borrar un cierto dato (habrá que "mover hacia atrás" todos los datos que había después de ese, y disminuir el contador de la cantidad de datos que tenemos).
No tengo ni idea de como "mover hace atrás"... a ver si me podían ayudar ya que llevo unas horas pensando y no sé si soy corta o que pasa que no se me ocurre nada para que mueva hacia atrás..
Os dejo el ejemplo 53 (a partir del cual hay que mover hacia atrás).
Muchas gracias por contestarme y ayudarme a todas mis dudas!!


#include <stdio.h>
#include <string.h> 
struct
{ 
	char nombreFich[41]; /* Nombre del fichero */ 
	unsigned long tamanyo; /* El tamaño en bytes */ 	
	} fichas[1000];
 int numeroFichas=0; /* Número de fichas que ya tenemos */
 int i; /* Para bucles */
 int opcion; /* La opcion del menu que elija el usuario */ 
 char textoTemporal[40]; /* Para cuando preguntemos al usuario */
 unsigned long numeroTemporal;
 int main() 
 {
	do { /* Menu principal */ 
		printf("Escoja una opción:\n");
		printf("1.- Añadir datos de un nuevo fichero\n");
		printf("2.- Mostrar los nombres de todos los ficheros\n");
		printf("3.- Mostrar ficheros que sean de mas de un cierto tamaño\n"); 
		printf("4.- Ver datos de un fichero\n");
		printf("5.- Salir\n"); /* Para evitar problemas con datos mal introducidos, leemos con "gets" y luego lo filtramos con "sscanf" */ 
		gets (textoTemporal);
		sscanf(textoTemporal, "%d", &opcion); /* Hacemos una cosa u otra según la opción escogida */
		switch(opcion) 
		{ 
			case 1: /* Añadir un dato nuevo */
			if (numeroFichas < 1000) /* Si queda hueco */ 
			{
				printf("Introduce el nombre del fichero: ");
				gets(fichas[numeroFichas].nombreFich);
				printf("Introduce el tamaño en KB: ");
				gets(textoTemporal); 
				sscanf(textoTemporal,"%d",&fichas[numeroFichas].tamanyo); /* Y ya tenemos una ficha más */ 
				numeroFichas++; 
				} else /* Si no hay hueco para más fichas, avisamos */ 
				printf("Máximo de fichas alcanzado (1000)!\n");
			break;
			case 2: /* Mostrar todos */
				for (i=0; i<numeroFichas; i++)
				printf("Nombre: %s; Tamaño: %ld Kb\n", fichas[i].nombreFich, fichas[i].tamanyo);
			break; 
			case 3: /* Mostrar según el tamaño */
				printf("¿A partir de que tamaño quieres que te muestre?");
				gets(textoTemporal); 
				sscanf(textoTemporal, "%ld", &numeroTemporal);
				for (i=0; i<numeroFichas; i++)
					if (fichas[i].tamanyo >= numeroTemporal) 
					printf("Nombre: %s; Tamaño: %ld Kb\n", fichas[i].nombreFich, fichas[i].tamanyo); 
			break;
			case 4: /* Ver todos los datos (pocos) de un fichero */
				printf("¿De qué fichero quieres ver todos los datos?");
				gets(textoTemporal);
				for (i=0; i<numeroFichas; i++) 
					if (strcmp(fichas[i].nombreFich, textoTemporal) == 0) 
					printf("Nombre: %s; Tamaño: %ld Kb\n", fichas[i].nombreFich, fichas[i].tamanyo);
			break;
			case 5: /* Salir: avisamos de que salimos */
				printf("Fin del programa\n"); 
			break;
			default: /* Otra opcion: no válida */ 
			printf("Opción desconocida!\n");
			break; 
			} 
		} while (opcion != 5); /* Si la opcion es 5, terminamos */ 
	return 0; }




12-Aug-2014 20:57
Nacho Cabanes (+83)

Quieres que el dato que estaba en la posición 3 pase a la posición 2, ¿verdad? Y el de la 4 a la posición 3. Y así sucesivamente. Por tanto:


dato[i] = dato[i+1];


La próxima actualización del curso de C incluirá ejemplos de esas operaciones, pero mientras, seguro que no te cuesta entender el equivalente en Pascal. Mira el apartado 4.1.6:
http://www.nachocabanes.com/pascal/cupas5/cupas04.php



13-Aug-2014 23:49
Invitado (sara)

Ajá!!!! Muchas gracias de nuevo!






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