Dev - C++ - Programa de registro de datos

 
Vista:
sin imagen de perfil

Programa de registro de datos

Publicado por Fernanda (6 intervenciones) el 02/10/2015 05:26:30
Hola chic@s
Necesito de su ayuda para realizar un programa con las siguientes caracteristicas.

Crear un archivo de datos en el que cada linea contenga la siguiente información:

COLUMNAS DATO
1 -20 Nombre
21-31 Numero de seguridad social
38-72 Dirección

Se necesita que el programa lea cada registro de datos, que el numero de seguridad se cargue a un árbol binario y utilizando el recorrido en orden, que los números de seguridad social se ordenen en forma ascendente, imprimiendo los datos a la salida en un archivo, utilizando el siguiente formato de salida.

1-11 Numero de seguridad social
25-44 Nombre
58-104 Dirección

Por favor, les agradeceria mucho si me pudieran apoyar a realizarlo.
Buena noche
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 661
Bronce
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Programa de registro de datos

Publicado por agustin (522 intervenciones) el 03/10/2015 11:01:34
No he visto aún los árboles binarios así que no puedo ayudarte.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Programa de registro de datos

Publicado por Hector (45 intervenciones) el 04/10/2015 17:41:21
El dato es una estructura:

1
2
3
4
5
6
typedef struct cliente
{
    int    numero;
    char nombre[20];
    char direccion[20];
}CLIENTE;

La estructura dinamica donde vas a registrar los datos es un arbol binario:

1
2
3
4
5
6
typedef struct nodo
{
    CLIENTE dato;
    struct nodo *der;
    struct nodo *izq;
}NODO;

Puedes enfocarte primero en crear la función que carguen los datos del cliente.

Seguidamente, crea las funciones que crean los nodos y lo ubican en un árbol.

Últimamente, te enfocas en las funciones de archivos y los menús.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

Programa de registro de datos

Publicado por Fernanda (6 intervenciones) el 07/10/2015 06:13:41
Hola Hector
Valla parece que sabes muy bien de esto, me gustaria que me apoyaras un poco mas para este programa... No me queda, no logro complementarlo, lei tu respuesta y me parecio facil pero ya para hacerlo se me complica, tengo poco tiempo practicando programas asi, por lo que se me.complica, de que otra forma lo prodria lograr hacerlo?? Lo debo tener pronto
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Programa de registro de datos

Publicado por Hector (45 intervenciones) el 06/11/2015 19:03:37
Discúlpame por no haberte ayudado en el momento, supongo que ya debiste haber terminado este tema hace mucho, de todas maneras te pondré algunas funciones básicas con lo que te comente anteriormente en caso de que aun quieras saber:

Como te dije anteriormente tienes las siguientes estructuras:

1
2
3
4
5
6
7
8
9
10
11
12
13
typedef struct cliente
{
    int    numero;
    char nombre[20];
    char direccion[20];
}CLIENTE;
 
typedef struct nodo
{
    CLIENTE dato;
    struct nodo *der;
    struct nodo *izq;
}NODO;

Estas estructuras definirán tu árbol, siendo "nodo" todos los puntos del árbol, y "cliente" el dato que contendrá cada nodo.

Lo primero que te mencione, fue crear las funciones que carguen los datos del cliente, es decir, cargar todas las variables de la estructura "CLIENTE":

1
2
3
4
5
6
7
8
9
10
11
void cargar_cliente(CLIENTE* dato)
{
    printf("Ingrese numero: ");
    scanf("%d", &dato -> numero);
 
    printf("\nIngrese nombre: ");
    scanf("%s", dato -> nombre);
 
    printf("\nIngrese direccion: ");
    scanf("%s", dato -> direccion);
}

Lo segundo era crear las funciones que te agregan los nodos al árbol, como debes saber "un árbol binario esta compuesto por un nodo raíz, seguidamente por sus demás ramas que pueden contener otros nodos".

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void agregar_nodo(NODO& *nodo)
{
    // Primero debemos de crear el nuevo nodo antes de modificar el arbol
    // Para eso, declaramos un puntero y le alojamos memoria
    NODO* nuevo = (NODO*)malloc(sizeof(NODO));
 
    // Verificamos que se haya alojado la memoria
    if(!nuevo)
    {
		printf("No se pudo alojar memoria...");
		return;
    }
    else
    {
		cargar_cliente(&nuevo -> dato);
    }
    // Y ahora enviamos nuestro nodo al arbol
    insertar_nodo(nodo, nuevo);
}

La funcion "insertar_nodo()" es la funcion que especificamente recorrera el arbol hasta ubicarse en la posicion donde se debe ingresar el nodo.

Existen dos formas de recorrer el arbol, recursiva y con bucles, la recursiva es la mas utilizada ya que es mas corta que la de bucles:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
// Metodo recursivo
void insertar_nodo(NODO* &raiz, NODO* &nuevo)
{
	// Primero debemos establecer la condicion de parada de la 
	// funcion, que sera cuando no pueda seguir recorriendo el arbol.
	if(raiz == null)
	{
		// Al estar en una posicion vacia, insertamos nuestro nodo y salimos
		raiz = nuevo;
		printf("Nodo agregado\n");
		return;
	}
	else // Si todavia estamos en una posicion del arbol que contiene un nodo
	{
		// Debemos movernos a la izquierda o a la derecha, dependiendo del numero del registro
		if(nuevo -> dato.numero < raiz -> dato.numero) 	// Si el registro del nuevo nodo es menor
														// al de la posicion del arbol
		{
			// Haremos la llamada de la funcion recursivamente y nos moveremos a la izquierda
			insertar_nodo(raiz -> izq, nuevo);
		}
		else if(nuevo -> dato.numero > raiz -> dato.numero) // De ser mayor
		{
			// Haremos la llamada de la funcion recursivamente y nos moveremos a la derecha
			insertar_nodo(raiz -> der, nuevo);
		}
		else // En caso de que caiga en esta condicion, esto significa que ambos numeros son iguales 
			 // y que ya existe un registro con ese numero social
		{
			printf("Numero ya existente\n");
			return;
		}
        }
}

Ahora faltaría recorrer el árbol para que pueda imprimir de forma ascendente los registros.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
// Funcion que imprime el registro del cliente
void imprimir_registro(CLIENTE dato)
{
	printf("Numero social: \t%d\n", dato.numero);
	printf("Nombre: \t%s\n", dato.nombre);
	printf("Direccion: \t%s\n", dato.direccion);
	printf("------------------------------");
}
// Lo vamos a recorrer recursivamente
void imprimir_arbol(NODO* raiz)
{
	// Primero establecemos la condicion de parada
	if(raiz == NULL)
	{
		return;
	}
	else // Aqui imprimiremos los registros 
	{
		// Ya que debe ser de forma ascendente (menor a mayor),
		// recorreremos el arbol en formato in-orden.
 
		// 1) Iremos a toda la rama izquierda del arbol
		imprimir_arbol(raiz -> izq);
		// 2) Una vez recorrido todo el lado izq, imprimimos los datos
		imprimir_registro(raiz -> dato);
		// 3) Por ultimo recorremos el lado derecho del arbol
		imprimir_arbol(raiz -> der);
	}
}

Es buena idea separar el código que imprime el registro con el código que recorre el árbol, en caso de querer modificar el formato de impresión, te ubicas mas rápido en el área del código que te interesa.

Lo ultimo que te queda es imprimir los nodos del árbol en un archivo, lo cual lo puedes hacer en el mismo imprimir_arbol usando una condición:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
// Modificaremos la funcion imprimir_arbol para que tenga la capacidad de ejecutar otra funcion
void imprimir_arbol(NODO* raiz, bool guardar)
{
	// Primero establecemos la condicion de parada
	if(raiz == NULL)
	{
		return;
	}
	else // Aqui imprimiremos los registros 
	{
		// Ya que debe ser de forma ascendente (menor a mayor),
		// recorreremos el arbol en formato in-orden.
 
		// 1) Iremos a toda la rama izquierda del arbol
		imprimir_arbol(raiz -> izq, guardar);
		// 2) Una vez recorrido todo el lado izq, imprimimos los datos
		if(guardar == true)
			guardar_registro(raiz -> dato)
		else
			imprimir_registro(raiz -> dato);
		// 3) Por ultimo recorremos el lado derecho del arbol
		imprimir_arbol(raiz -> der, guardar);
	}
}
 
void guardar_registro(NODO* raiz)
{
	FILE* fp = fopen("registro.txt", "a"); // a De append
	fprintf(fp, "Numero social: \t%d\n
				 Nombre: \t%s\n
				 Direccion: \t%s\n
				 ---------------------------------\n",
				 raiz -> dato.numero, raiz -> dato.nombre, raiz -> dato.direccion);
	fclose(fp);
}

Con esas funciones se puede crear el programa, lo que faltaría seria crear el menú que te permita administrar todo.

Si no pudiste entender una papa (algo que yo entiendo porque arboles no es sencillo), me puedes contactar que yo te explico sin problemas, una vez mas perdona por no atenderte antes jaja.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Programa de registro de datos

Publicado por Emilio (1 intervención) el 13/10/2017 01:35:34
Hola.
Quiero hacer un sistema de registros y ocupé el programa base de este hilo,, pero al compilarlo me dieron ciertos errores y el único que no he podido corregir es este:
[Error] ´guardar_registro´ was not declared in this scope
Si pudieras ayudarme te estaría agradecido. Aquí está el código con algunos cambios. Muy pocos cambios.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
using namespace std;
 
typedef struct alumno
{
    int    numero;
    char nombre[20];
    char direccion[20];
}ALUMNO;
typedef struct nodo
{
    ALUMNO dato;
    struct nodo *der;
    struct nodo *izq;
}NODO;
 
void cargar_alumno(ALUMNO* dato)
{
    printf("Ingrese numero: ");
    scanf("%d", &dato -> numero);
 
    printf("\nIngrese nombre: ");
    scanf("%s", dato -> nombre);
 
    printf("\nIngrese direccion: ");
    scanf("%s", dato -> direccion);
}
void insertar_nodo(NODO* &raiz, NODO* &nuevo){
	// Primero debemos establecer la condicion de parada de la 
	// funcion, que sera cuando no pueda seguir recorriendo el arbol.
	if(raiz == 0)
	{
		// Al estar en una posicion vacia, insertamos nuestro nodo y salimos
		raiz = nuevo;
		printf("Nodo agregado\n");
		return;
	}
	else // Si todavia estamos en una posicion del arbol que contiene un nodo
	{
		// Debemos movernos a la izquierda o a la derecha, dependiendo del numero del registro
		if(nuevo -> dato.numero < raiz -> dato.numero) 	// Si el registro del nuevo nodo es menor
														// al de la posicion del arbol
		{
			// Haremos la llamada de la funcion recursivamente y nos moveremos a la izquierda
			insertar_nodo(raiz -> izq, nuevo);
		}
		else if(nuevo -> dato.numero > raiz -> dato.numero) // De ser mayor
		{
			// Haremos la llamada de la funcion recursivamente y nos moveremos a la derecha
			insertar_nodo(raiz -> der, nuevo);
		}
		else // En caso de que caiga en esta condicion, esto significa que ambos numeros son iguales 
			 // y que ya existe un registro con ese numero social
		{
			printf("Numero ya existente\n");
			return;
		}
        }
}
void agregar_nodo(NODO* &nodo)
{
    // Primero debemos de crear el nuevo nodo antes de modificar el arbol
    // Para eso, declaramos un puntero y le alojamos memoria
    NODO* nuevo = (NODO*)malloc(sizeof(NODO));
 
    // Verificamos que se haya alojado la memoria
    if(!nuevo)
    {
		printf("No se pudo alojar memoria...");
		return;
    }
    else
    {
		cargar_alumno(&nuevo -> dato);
    }
    // Y ahora enviamos nuestro nodo al arbol
 
insertar_nodo(nodo, nuevo);
 
}
// Metodo recursivo
 
// Funcion que imprime el registro del alumno
void imprimir_registro(ALUMNO dato)
{
	printf("Numero del alumno: \t%d\n", dato.numero);
	printf("Nombre: \t%s\n", dato.nombre);
	printf("Direccion: \t%s\n", dato.direccion);
	printf("------------------------------");
}
 
// Lo vamos a recorrer recursivamente
void imprimir_arbol(NODO* raiz)
{
	// Primero establecemos la condicion de parada
	if(raiz == NULL)
	{
		return;
	}
	else // Aqui imprimiremos los registros 
	{
		// Ya que debe ser de forma ascendente (menor a mayor),
		// recorreremos el arbol en formato in-orden.
 
		// 1) Iremos a toda la rama izquierda del arbol
		imprimir_arbol(raiz -> izq);
		// 2) Una vez recorrido todo el lado izq, imprimimos los datos
		imprimir_registro(raiz -> dato);
		// 3) Por ultimo recorremos el lado derecho del arbol
		imprimir_arbol(raiz -> der);
	}
}
// Modificaremos la funcion imprimir_arbol para que tenga la capacidad de ejecutar otra funcion
 
void imprimir_arbol(NODO* raiz, bool guardar)
{
 
	// Primero establecemos la condicion de parada
	if(raiz == NULL)
	{
		return;
	}
	else // Aqui imprimiremos los registros 
	{
		// Ya que debe ser de forma ascendente (menor a mayor),
		// recorreremos el arbol en formato in-orden.
		// 1) Iremos a toda la rama izquierda del arbol
		imprimir_arbol(raiz -> izq, guardar);
		// 2) Una vez recorrido todo el lado izq, imprimimos los datos
		if(guardar == true)
		guardar_registro(raiz->dato);
		else
			imprimir_registro(raiz -> dato);
		// 3) Por ultimo recorremos el lado derecho del arbol
		imprimir_arbol(raiz -> der, guardar);
	}
}
void guardar_registro(NODO* raiz){
	FILE* fp = fopen("registro.txt", "a"); // a De append
	fprintf(fp, "Numero del alumno: \t%d\n Nombre: \t%s\n Direccion: \t%s\n ---------------------------------\n", raiz -> dato.numero, raiz -> dato.nombre, raiz -> dato.direccion);
	fclose(fp);
}

PD: Si pudieras ayudarme en cuanto al uso de manejo de excepciones con los siguientes mensajes, te lo agradecería.
Mensaje: “No puedes inscribirte en la materia X porque nuestros registros indican que eres del semestre Y”

Este y otros mensajes quisiera que lleve, que sean pocos pero que alerten en cuanto al sistema de registros. Entre más mejor, cinco mensajes es la cantidad que recomiendo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar