/****************************************************
* *
* *
* *
* * ISRAEL CUEVA HIDALGO. *
* *wegols@hotmail.com *
* *
****************************************************/
/*
Se pretende desarrollar un directorio que contenga los datos de Nombre,
Edad, Telefono y Ciudad, y que a su vez nos permita ingresar los datos
por teclado, mostrar los registros ingresados en la pantalla y por último
realizar las mismas consultas pero ordenados por los diferentes campos
que se nombro anteriormente.
*/
#include <stdio.h>
#include <stdlib.h>
#define fichero “registro.txt”
//Declaracion de la estructura tRegistro que tendrá
//los campos del directorio
typedef struct stRegistro
{
char nombre[15];
char edad[4];
char ciudad[13];
char telefono[13];
};
//Estructura Arbol que toma la estructura de un Nodo
typedef struct Arbol
{
struct stRegistro dato;
struct Arbol* izq;
struct Arbol* der;
};
//declaración de metodos
int crearNodo(struct Arbol **nuevo, struct stRegistro valor);
int insertarHoja(struct Arbol * arbol, struct stRegistro valor);
int insertarArbol(struct Arbol **arbol, struct stRegistro valor);
void InOrden(struct Arbol * arbol);
int ordenar();
int anadir();
void Listar();
void Eliminar();
strcmp();
int clave = 0;
//——————
//MÉTODO PRINCIPAL
//——————
main()
{
char opcion[1];
int opcionCampo=0;
do
{
system(“cls”);
printf(“___________________________________\n\n”);
printf(” Estructura Datos – Elige opcion\n”);
printf(“___________________________________\n\n”);
printf(” 1) Insertar registro\n”);
printf(” 2) Mostrar Registro\n”);
printf(” 3) Ordenar por campo\n”);
printf(” 4) Eliminar registro\n”);
printf(” 0) Salir\n”);
printf(“\n\nOpcion: “);
gets(opcion);
if(opcion == 0 )
{
system(“cls”);
printf(“\n\n\n\t* * G R A C I A S * *\n\n\n”);
system(“PAUSE”);
system(“exit”);
}
switch (atoi(opcion))
{
case 1:
anadir();
break;
case 2:
system(“cls”);
printf(“____________________________________________\n\n”);
printf(” REGISTRO\n”);
printf(“____________________________________________\n\n”);
printf(” Nombre Edad Ciudad Telefono \n\n”);
//while(fread(®, sizeof(struct stRegistro), 1, fichero2))
//Listar(®);
Listar();
system(“PAUSE”);
break;
case 3:// Ordenar por campo
do
{
system(“cls”);
printf(“________________________\n\n”);
printf(” 3) Ordenar por campo\n”);
printf(“_________________________\n\n”);
printf(“\n 1) Ordenar por nombre\n”);
printf(” 2) Ordenar por edad\n”);
printf(” 3) Ordenar por ciudad\n”);
printf(” 4) Ordenar por telefono\n”);
printf(“\nOpcion: “);
scanf(“%d”,&opcionCampo);
if(opcionCampo == 1)
{
clave = 1;
system(“cls”);
printf(“\n\n\n\t\tCAMPO ORDENADO POR NOMBRE\n\n\n”);
system(“PAUSE”);
system(“cls”);
printf(“____________________________________________\n\n”);
printf(” REGISTRO\n”);
printf(“____________________________________________\n\n”);
printf(” Nombre Edad Ciudad Telefono \n\n”);
ordenar();
printf(“\n”);
system(“PAUSE”);
opcionCampo=-1;
main();
}
if(opcionCampo == 2)
{
clave = 2;
system(“cls”);
printf(“\n\n\n\t\tCAMPO ORDENADO POR EDAD\n\n\n”);
system(“PAUSE”);
system(“cls”);
printf(“____________________________________________\n\n”);
printf(” REGISTRO\n”);
printf(“____________________________________________\n\n”);
printf(” Nombre Edad Ciudad Telefono \n\n”);
ordenar();
printf(“\n”);
system(“PAUSE”);
opcionCampo=-1;
main();
}
if(opcionCampo == 3)
{
clave = 3;
system(“cls”);
printf(“\n\n\n\t\tCAMPO ORDENADO POR CIUDAD\n\n\n”);
system(“PAUSE”);
system(“cls”);
printf(“____________________________________________\n\n”);
printf(” REGISTRO\n”);
printf(“____________________________________________\n\n”);
printf(” Nombre Edad Ciudad Telefono \n\n”);
ordenar();
printf(“\n”);
system(“PAUSE”);
opcionCampo=-1;
main();
}
if(opcionCampo == 4)
{
clave = 4;
system(“cls”);
printf(“\n\n\n\t\tCAMPO ORDENADO POR TELEFONO\n\n\n”);
system(“PAUSE”);
system(“cls”);
printf(“____________________________________________\n\n”);
printf(” REGISTRO\n”);
printf(“____________________________________________\n\n”);
printf(” Nombre Edad Ciudad Telefono \n\n”);
ordenar();
printf(“\n”);
system(“PAUSE”);
opcionCampo=-1;
main();
}
}while (opcionCampo != -1);
break;
case 4:
system(“cls”);
Eliminar();
printf(“\n\n\n\t\tREGISTRO ELIMINADO\n\n\n”);
system(“PAUSE”);
break;
}
}while(atoi(opcion) != 0);
return 0;
}
//FIN DEL MÉTODO PRINCIPAL
//—————————————————————————–
// * Crea el nuevo nodo con el valor que se desea, en el caso de que no exista
//—————————————————————————–
int crearNodo(struct Arbol **nuevo, struct stRegistro valor)//nodo raiz
{
int correcto = 0;
//Reservamos espacio en memoria y lo asignamos al puntero de estrucura Nodo
*nuevo = (struct Arbol *) malloc(sizeof(struct Arbol));
//Si (*nuevo) en este caso es diferente de NULL
if ((*nuevo) != NULL)
{
(*nuevo)->dato = valor;
(*nuevo)->izq = NULL;
(*nuevo)->der = NULL;
correcto = 1;
}
return correcto;
}
//——————————————————————
/**
* Inserto el nuevo nodo como una hoja del árbol, y sirve para ordenar como
* se requiera de acuerdo al campo desaado
*/
//——————————————————————
int insertarHoja(struct Arbol * arbol, struct stRegistro valor)
{
struct Arbol * nuevo;
int correcto = 0;
if(clave ==1 )
{
//La funcion strcmp: Compara la cadena apuntada por *valor.nombre*, con la cadena
//apuntada por *arbol->dato.nombre*. Esta función retorna un entero mayor, igual o
//que cero.
//Si el valor devuelto por la función strcmp es menor que cero entro
if (strcmp(valor.nombre, arbol->dato.nombre) < 0)
{
//Si el a lo que apunta el puntero izquierdo es diferente de NULL
if (arbol->izq != NULL)
{
//Se cunple una función recursiva y se retornará el valor de correcto
//Este puede ser 1 – 0
correcto = insertarHoja(arbol->izq, valor);
}
//Caso contrario
else
{
//Si El dato es == NULL indica que no tiene una estructura de Nodo
//En este caso se indica al método crear_que lo cree
if (crearNodo(&nuevo, valor))
{
//nuevo(De estructura Nodo(Nodo)
arbol->izq = nuevo;
correcto = 1;
}
}
}
//Caso contrario: Si el valor devuelto por la función strcmp es
// mayor o igual que cero entro
else
{
//Voy por la rama derecha considerada como siguinte
//Si rama siguinte es diferente de null
if (arbol->der != NULL)
{
//recursividad, para insertar un nuevo nodo como hoja
correcto = insertarHoja(arbol->der, valor);
}
//Si es null
else
{
//Creo un nuevo nodo con estructura de Nodo
if (crearNodo(&nuevo, valor))
{
arbol->der = nuevo;
correcto = 1;
}
}
}
}
//si clave es igual a 2, aplicaremos el mismo procedimiento izquierdo
//con clave 0 a 1, simplemente va a variar en la funcion strcmp los
//parametros de comparación
//se repitira el mismo procedimiento para clave = 3 y 4. Cambiando
//únicamente el valor de busqueda.
if(clave ==2 )
{
if (strcmp(valor.edad, arbol->dato.edad) < 0)
{
if (arbol->izq != NULL)
{
correcto = insertarHoja(arbol->izq, valor);
}
else
{
if (crearNodo(&nuevo, valor))
{
arbol->izq = nuevo;
correcto = 1;
}
}
}
else
{
if (arbol->der != NULL)
{
correcto = insertarHoja(arbol->der, valor);
}
else
{
if (crearNodo(&nuevo, valor))
{
arbol->der = nuevo;
correcto = 1;
}
}
}
}
if(clave ==3 )
{
if (strcmp(valor.ciudad, arbol->dato.ciudad) < 0)
{
if (arbol->izq != NULL)
{
correcto = insertarHoja(arbol->izq, valor);
}
else
{
if (crearNodo(&nuevo, valor))
{
arbol->izq = nuevo;
correcto = 1;
}
}
}
else
{
if (arbol->der != NULL)
{
correcto = insertarHoja(arbol->der, valor);
}
else
{
if (crearNodo(&nuevo, valor))
{
arbol->der = nuevo;
correcto = 1;
}
}
}
}
if(clave ==4 )
{
if (strcmp(valor.telefono, arbol->dato.telefono) < 0)
{
if (arbol->izq != NULL)
{
correcto = insertarHoja(arbol->izq, valor);
}
else
{
if (crearNodo(&nuevo, valor))
{
arbol->izq = nuevo;
correcto = 1;
}
}
}
else
{
if (arbol->der != NULL)
{
correcto = insertarHoja(arbol->der, valor);
}
else
{
if (crearNodo(&nuevo, valor))
{
arbol->der = nuevo;
correcto = 1;
}
}
}
}
return correcto;
}
//——————————————————————-
/*
* Miro si el árbol está vacío o con nodos
*/
//——————————————————————-
int insertarArbol(struct Arbol **arbol, struct stRegistro valor)
{
struct Arbol* nuevo;
int correcto = 0;
//Los punteros son NULL
if (*arbol == NULL)
{
//Si son nulos
if (crearNodo(&nuevo, valor))
{
*arbol = nuevo;
correcto = 1;
}
}
else
{
correcto = insertarHoja(*arbol, valor);
}
return correcto;
}
//——————————————————————
/**
* Muestro el contenido del árbol mostrándolo en inorden
*/
//——————————————————————
void InOrden(struct Arbol * arbol)
{
//compruebo que la raiz sea diferente que NULL
if (arbol != NULL)
{
//Recorremos el árbol izquierdo, incluyendo su raiz
InOrden(arbol->izq);
//Presento con la estructura que aqui se expone
printf(” %s \t%s\t%s\t %s\n”, arbol->dato.nombre, arbol->dato.edad
,arbol->dato.ciudad,arbol->dato.telefono);
//Recorro el árbol derecho
InOrden(arbol->der);
//estos son métodos recursivos donde si no se encuentra un nodo se salta al
//derecho en este caso a la rama derecha (derecho)
}
}
//——————————————————————-
/**
* Recojo cada registro y lo incluyo en el árbol
*/
//——————————————————————-
int ordenar()
{
FILE *f;
struct stRegistro r;
struct Arbol* arbol = NULL;
int correcto = 0;
//Abrimos el fichero en modo lectura y le asignamos la
//la posicion al de memoria a puntero Tipo FILE f
//si f es distinto de NULL
if ((f = fopen(fichero, “r”)) != NULL)
{
//Leemos el archivo con la posicion de memoria de Campos(Datos)
//al igualemte indicamos su tamaño con la funcion sizeof y le indicamos el
//archivo de donde queremos leer
while (fread(&r, sizeof(r), 1, f))
{
//Comparo las dos cadenas que tenemos con nombre
if (strcmp(r.nombre, “*”) != 0)
{
//Si es diferente de cero el valor devuelto
insertarArbol(&arbol, r);
}
}
//Cerramos el archivo para volver a ser utilizado
fclose(f);
InOrden(arbol);
correcto = 1;
}
return correcto;
}
//——————————————————————–
/*
Añado registros al fichero
*/
//——————————————————————–
int anadir()
{
FILE *f;
//FILE *f2;//
struct stRegistro r;
int correcto = 0;
if ((f = fopen(fichero, “a”)) != NULL)
{
//f2 = fopen(fichero2, “a”);
system(“cls”);
printf(“_________________________________\n\n”);
printf(” Ingresa datos del registro\n”);
printf(“_________________________________\n\n”);
printf(“Nombre: “);
gets(r.nombre);
//fgets(reg->nombre, 15, stdin);
printf(“Edad : “);
gets(r.edad);
printf(“Ciudad: “);
gets(r.ciudad);
printf(“Telef : “);
gets(r.telefono);
//Escribimos el archivo
fwrite(&r, sizeof(r), 1, f);
//fwrite(&r, sizeof(r),1,f2);
//fclose(f2);
fclose(f);
correcto = 1;
}
return correcto;
}
void Listar()
{
FILE *f3;
struct stRegistro reg;
if ((f3 = fopen(fichero, “r”)) != NULL)
{
while (fread(®, sizeof(reg), 1, f3))
{
printf(” %s \t%s\t%s\t %s\n”, reg.nombre, reg.edad
,reg.ciudad,reg.telefono);
}
fclose(f3);
}
printf(“\n”);
}
void Eliminar()
{
FILE *f4;
if ((f4 = fopen(fichero, “w”)) != NULL)
{
fclose(f4);
}
printf(“\n”);
}
Etiquetas: arbol, arbol binario, archivo, codigo, codigo c, ic, israel cueva, israel cueva hidalgo, ordenar archivo, ordenar archivo con arbol, ordenar registro
Julio 30, 2008 a las 4:15 am |
Disculpenhe observado que usan System (“cls”), me podrian decir para que sirve…..
default:
system(“cls”);
system(“color B”);
cout<<endl;
cout<<endl;
Agosto 4, 2008 a las 11:37 pm |
Hola Denis…..soy Israel..wegols@hotmail.com
……system(”cls”) se utiliza para limpiar todo lo que actualmente tengas en pantalla, espero haber podido ayudarte, no dudes en hacer tus preguntas, gracias
Noviembre 14, 2008 a las 7:07 pm |
Hola Wegols de antemano gracias por los codigos. Mira tengo una pregunta pero como no vi en ningun lado donde plantearla pues la estoy haciendo por aquí. Mira a lo mejor es algo superfacil pero estoy batallando para validar un arreglo. Lo que hace es que genera numeros al azar pero los repite y no quiero que salgan repetidos:
1 2 5 1 5 5 6 1 <– Así me sale
0 1 3 2 5 4 6 7 <– Así lo necesito
espero tu respuesta, saludos…
Noviembre 15, 2008 a las 2:29 pm |
Hola Reedyseth.
Aqui coloco un codigo, aunque pueden haber muchas implementaciones, todo depende de ti, por ejemplo podrias comparar si el elemento esta en el arreglo, si lo esta genera otro aleatori, si no lo coloco en el arreglo.
/* Crear un array de tamaño 30 con números generados aleatoriamente y con valores
comprendidos entre 100 y 200. No puede haber ninguno repetido */
#include
#include
#include
void main(void){
int array[30], i, colision = 1, e = 0;
randomize();
for(i=0;i<30;i++){
while(colision==1){
array[i] = random(101) + 100;
colision = 0;
while(colision==0 && e<i){
if(array[i]==array[e]){
colision++;
e++;
}
e++;
}
e = 0;
}
colision = 1;
printf(“Elmento %d: %d\n”, (i+1), array[i]);
}
getch();
}
Att: Israel
wegols@hotmail.com
Noviembre 27, 2008 a las 1:25 am |
Buenísimo tu programa, de la que salvaste gracias
Noviembre 27, 2008 a las 1:59 pm |
hola me podrias decir que significa while (fread(®, sizeof(reg), 1, f3)) mas esa declaracion que es ® si me puedes ayudar gracias…
Noviembre 28, 2008 a las 11:07 pm |
hola, la verdad q nunca e utilizado con la declaración ®……pero lo que tienes dentro de los paréntesis en sizeof(reg), 1, f3)) son los parámetros q tu le envias a la funcion,por ejemplo f3 es el nombre del fichero (archivo),.los demas no recuero,…….consulta sobre las funciones en c o c++ dependiendo de en que trabajes tu
Noviembre 28, 2008 a las 11:22 pm |
while (fread(®, sizeof(reg), 1, f3)) …..la parte de ese codigo esta como comentario, puedes borrarla, quizas ese cararcter era otro
Octubre 19, 2009 a las 11:35 am |
tengo la siguiente estructura:
struct viaje{
int nroViaje;
int nroCamion;
int kmRec;
int nChofer;
char chofer[50];
}
Hasta ahora ya he podico completar todas las funciones, las que buscan, las que guardan y leen el archivo, una funcion que me permite modificar los datos, etc..pero estoy estancado en lo siguiente:
1 Informar por pantalla numero de viaje y numero de camion con menor kilometraje.
2 Guardar en un archivo todos los viajes con mas de 2500 km de recorrido.
Te agradeceria infinitamente que puedas ayudarme, yo tengo bastantes codigos para colaborar con tu pagina asi que si quieres te los puedo pasar. Muchas gracias!