[C] Base de datos automática

Iniciado por CountYorga, 16 Marzo 2015, 12:20 PM

0 Miembros y 1 Visitante están viendo este tema.

CountYorga

Holas a todos. Antes que nada me presento, ya que es mi primer post, soy Count Yorga, y aunque académica y profesionalmente soy Químico, la programación me ha interesado desde siempre. Durante muchos años, programé  en BASIC en un Spectrum de 128 Kilobytes (qué tiempos) programillas de gestión sencillos, juegos de generar laberintos, aventuras conversacionales en plan "Elige tu propia aventura...". Más tarde seguí realizando algunos proyectos en los BASIC que incorporaba Windows (QuickBasic y GWBasic).

Hace poco me he puesto en serio (porque BASIC, además de estar anticuado, no es demasiado potente y tengo entendido que crea malos hábitos) a aprender otro lenguaje: decidí aprender C. Tengo un proyecto que quiero llevar a cabo en C, pero todavía estoy muy verde. De momento:
-Controlo: Entrada y salida básica (printf, scanf...). Las instrucciones de control básicas (if, for, do, do while..) así como switch.
-Tengo una idea general: de lo que son las funciones, variables, constantes.. los Array o vectores, las estructuras (struct). Conozco a nivel teoría qué es una librería, cómo se compila y ejecuta un programa en C bajo Windows...
-Ni p... idea: Sobre todo, los punteros (que me suenan a chino por ahora, ya les dedicaré tiempo) y en general, la memoria. Entiendo qué es la memoria, y entiendo por ejemplo, qué sucede cuando declaras una variable determinada, las diferencias al elegir un tipo u otro, con o sin signo... pero no alcanzo a comprender porqué es tan importante el manejo de memoria ni cómo se manipula esta por medio de C.

Sabiendo esto, os explico el proyecto en el que me gustaría embarcarme. Dejo claro desde aquí que no estoy pidiendo ningún tipo de código, y que de hecho no lo quiero; me gusta hacer las cosas por mi mismo. No soy ningún "tipo listo" de los que a veces se ven por los foros pidiéndo que se les haga tal o cual tarea. Lo que yo quisiera es saber si mi proyecto es realizable para programarlo en C, consejos generales que me puedan dar, y sobre todo, qué herramientas o sintaxis del lenguaje me pueda hacer falta controlar, de los que no me haya percatado.

El proyecto sería una especie de base de datos automatizada y autosuficiente. Explico más o menos como CREO que podría funcionar. Por favor, cualquier error o mala interpretación en el desarrollo, indicadmela.

-La base de datos tendrá espacio para introducir 20 sujetos; de cada sujeto se introducen los datos de Nombre, Teléfono y Año de nacimiento. Nada de esto es introducido por el usuario, sino de forma automática. Mi idea es que el número de teléfono se le pida al programa que introduzca números aleatorios de 9 dígitos empezados siempre por 60x xxx xxx... lo mismo para la el año de Nacimiento (números aleatorios que empiecen por 19xx o 20xx o 21xx).
Para el nombre y apellidos había pensado en tener dos ficheros, uno para cada cosa, y pedirle al programa que los escoga usando una vez el fichero Nombre y dos veces el de Apellido.

Una vez creado un sujeto, el programa calcularía su Edad (restando del año actual el año de nacimiento) y si el sujeto tiene más de 95 años lo borra de la base, aunque "traslada" sus datos a un nuevo fichero donde almacena los sujetos ya descartados, por haber pasado de cierta edad.
No solo eso, mi idea es que el programa "corra" el tiempo a partir del año presente (que puede ser introducido por el usuario) representado por ejemplo, en segundos o milisegundos (un segundo representa un año) y cuando uno de los sujetos introducidos cumpla los 95 años, lo elimine igual. Supongo que habrá funciones en la librería time.h que permitan eso, aunque no la conozco a fondo.

La generación de nuevos "usuarios" sería perpetua, es decir, nunca se detendría, el programa siempre los estaría creando, hasta llenar todo el espacio disponible, de 20 sujetos (digo 20 como ejemplo, igual pueden ser 50).

La interacción con el usuario se produciría solo en dos ocasiones:
-Al iniciarse el programa, el usuario escribe el nombre del año presente, en base al cual se hacen todos los cálculos para descartar usuarios de más de 95 años y contar el tiempo. Puede ser el año actual real, o no.
-Cuando la base de datos esté llena: Cuando se hayan llenado los 20 espacios de la base, se interrumpe la creación aleatoria, y se manda un mensaje al usuario pidiéndole que determine el número de "sujetos" que elimina para hacer hueco. El usuario no elige CUALES eliminar, solo un número del 1 al 20 que serán eliminados. Los eliminados por falta de espacio no irán al fichero donde se almacenan los mayores De 95, sino que se borrarán definitivamente.

La idea es que la base sea automática, lo más autosuficiente posible, que se produzcan las menos interrupciones y peticiones al usuario posibles, de tal forma que las "entradas" (sujetos generados aleatoriamente) y las "salidas" (sujetos borrados por haber pasado los 95 años) estén equilibrados. En fin... ¿es realizable programar esto en C? ¿He cometido algún error en el planteamiento? ¿Necesito conocer especialmente algo que se me haya pasado por alto? Yo entiendo que el manejo de ficheros y del tiempo será esencial...
Agradeceré cualquier ayuda, consejo o comentario  :)

rir3760

Cita de: CountYorga en 16 Marzo 2015, 12:20 PMLa idea es que la base sea automática, lo más autosuficiente posible, que se produzcan las menos interrupciones y peticiones al usuario posibles, de tal forma que las "entradas" (sujetos generados aleatoriamente) y las "salidas" (sujetos borrados por haber pasado los 95 años) estén equilibrados. En fin... ¿es realizable programar esto en C? ¿He cometido algún error en el planteamiento? ¿Necesito conocer especialmente algo que se me haya pasado por alto? Yo entiendo que el manejo de ficheros y del tiempo será esencial.
Es posible utilizando solo C estándar, las partes de la biblioteca estandar en las que te debes enfocar  son:
* <stdlib.h>
Por las funciones que permiten la generación de números aleatorios (srand y rand) así como funciones que te permitan obtener enteros de cadenas (atoi, atol, strtol, etc.).

* <time.h>
Para la obtención y generación de fechas (time en particular como semilla de srand).

* <stdio.h>
Lo mas pesado. Para el almacenamiento en archivos la aproximación mas sencilla son los archivos de texto plano (cada uno de los campos de cada registro se almacena en una linea), estos los lees linea por linea con fgets y se imprimen en el archivo con fprintf.

Por ultimo ya que el numero de registros es pequeño te conviene, al principio del programa, leer todo en memoria (en arrays) realizando ahí todo el proceso (solo los resultados finales los envías al archivo).

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

CountYorga

Gracias por contestar! Conforme tenga algo de código lo iré poniendo aquí. Antes tengo que ejercitar las funciones de esas bibliotecas, que algunas nunca las he tocado. Lo único que no he entendido muy bien es este comentario:

"Por ultimo ya que el numero de registros es pequeño te conviene, al principio del programa, leer todo en memoria (en arrays) realizando ahí todo el proceso (solo los resultados finales los envías al archivo)."

¿Que quieres decir con leer todo en memoria?  :o

rir3760

Cita de: CountYorga en 19 Marzo 2015, 10:13 AM"Por ultimo ya que el numero de registros es pequeño te conviene, al principio del programa, leer todo en memoria (en arrays) realizando ahí todo el proceso (solo los resultados finales los envías al archivo)."

¿Que quieres decir con leer todo en memoria?
A que declares en tu programa un array con capacidad para veinte elementos, a continuación abres el archivo y lees todos los registros almacenándolos en el array. La idea es un proceso mas rápido y evitar la validación de las operaciones (en el caso de archivos hay que tomar precauciones en caso de error o fin de archivo).

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language