¡Una pregunta de programación!
#include "stdio.h" /*Función de E/S*/
#include "stdlib.h" /*función de biblioteca estándar*/
#include "string.h"/*Función de cadena*/
#include "ctype.h" /*Función de operación de caracteres*/
#define M 50 /*Definir constante Representa el número de registros*/
typedef struct /*definir estructura de datos*/
{
char name[20] /*name*/; p >
char unidades[30]; /*unidades*/
char tele[10] /*teléfono*/
}DIRECCIÓN;
/******El siguiente es el prototipo de función*******/
int enter(ADDRESS t[] /*Input record*/
lista vacía (DIRECCIÓN t[], int n); /*Mostrar registros*/
búsqueda vacía(DIRECCIÓN t[], int n /*Buscar registros mostrados por nombre*/
int eliminar(DIRECCIÓN t[], int n); /*Eliminar registro*/
int add(DIRECCIÓN t[], int n); /*Insertar registro*/
void save(DIRECCIÓN t[], int n); /*Guardar registros como archivos*/
int load(DIRECCIÓN t[] /*Leer registros de archivos*/ p>
void display(ADDRESS t[]); /*Buscar registros de visualización por número de serie*/
void sort(ADDRESS t[], int n /*Ordenar por nombre*/
void qseek(ADDRESS t[], int n); /*Buscar registros rápidamente*/
void copy() /*Copia de archivo*/
void print (DIRECCIÓN temp); /*Mostrar un solo registro*/
int find(DIRECCIÓN t[], int n, char *s); p>int menu_select (); /*Función del menú principal*/
/******Se inicia la función principal*******/
main()
{
int i;
DIRECCIÓN adr[M]; /*Definir matriz de estructura*/
int longitud; longitud del registro* /
clrscr(); /*Borrar pantalla*/
for(;;)/*Bucle infinito*/
{
switch(menu_select()) /*Llama a la función del menú principal y devuelve el número entero como condición para la declaración de cambio*/
{
caso 0: longitud= enter(adr); break ;/*Ingresar registros*/
caso 1: list(adr, length /*Mostrar todos los registros*/
caso 2: sea);
rch(adr, longitud); /*Buscar registro*/
caso 3: longitud=eliminar(adr, longitud) /*Eliminar registro*/
4: longitud=add(dirección, longitud); romper /*insertar registro*/
caso 5: guardar(dirección, longitud) /*guardar archivo*/
caso 6: longitud=carga(adr); /*leer archivo*/
caso 7: mostrar(adr); p > caso 8: sort(adr, longitud); /*Ordenar por nombre*/
caso 9: qseek(adr, longitud) /*Buscar registros rápidamente*/
caso 10: copiar(); break; /*Copiar archivo*/
caso 11: salida(0); /*Si el valor de retorno es 11, el programa finaliza*/ p>
}
}
}
/*Función de menú, el valor de retorno de la función es un número entero que representa el elemento de menú seleccionado*/
menu_select()
{
char s[80];
int c
gotoxy(1; , 25); /*Establezca el cursor en la línea 25, columna 1*/
printf("presione cualquier tecla para ingresar al menú...\n"); /
getch(); /*Leer cualquier carácter*/
clrscr(); /*Borrar la pantalla*/
gotoxy(1, 1) ;
printf("************************MENÚ*************** **** ***\n\n");
printf(" 0. Ingrese el registro\n");
printf(" 1. Enumere el archivo\n ");
printf(" 2. Buscar registro por nombre\n");
printf(" 3. Eliminar un registro\n");
printf(" 4. agregar registro \n");
printf(" 5. Guardar el archivo\n"); ");
printf(" 7. mostrar registro en el pedido\n");
printf("
8. ordenar para crear un archivo nuevo\n");
printf(" 9. Registro de búsqueda rápida\n");
printf(" 10. copiar el archivo a un archivo nuevo \n");
printf(" 11. Salir\n");
printf("***************** ***** ****************************\n");
hacer{
printf("\n Ingrese su elección(0~11):"); /*Solicitar opciones de entrada*/
scanf("s", s /*Ingrese selecciones* / p>
c=atoi(s); /*Convertir la cadena de entrada en un número entero*/
} while(clt;0||cgt;11); No volver a ingresar entre 0 y 11*/
return c; /*Volver a la selección, el programa principal llama a la función correspondiente según el número*/
}
/***Registro de entrada, el parámetro formal es una matriz de estructura, el tipo de retorno del valor de la función es un número entero que representa la longitud del registro*/
int enter(ADDRESS t[])
{
int i, n;
char *s;
clrscr() /*borrar pantalla*/ p>
printf( "\npor favor ingrese num \n"); /*Mensaje rápido*/
scanf("d",amp;n); /*Ingrese número de registro*/ p>
printf( "por favor ingrese el registro \n"); /*Solicitar el registro de entrada*/
printf("nombre del teléfono de la unidad\n");
printf ("------ ------------------------------------------ \n");
for(i=0;ilt;n;i)
{
scanf("sss",t[i]. nombre,t[i].units , t[i].tele /*Registro de entrada*/
printf("-----------------); -------- ---------------------\n");
}
regresar n; /*Devuelve el número de registros */
}
/*Mostrar registros, los parámetros son la matriz de registros y el número de registros*/
lista vacía(DIRECCIÓN t[], int n)
{
int i
clrscr()
printf( "\n\n******* ************DIRECCIÓN******************\n"); p>
printf("nombre
teléfono de la unidad\n");
printf("--------------------------------- ---------------\n");
for(i=0; ilt; n; i )
printf("- 20s-30s-10s\n", t[i].nombre, t[i].unidades, t[i].tele);
if((i 1)10==0) / *Juzga si la salida alcanza los 10 registros*/
{
printf("Presiona cualquier tecla para continuar...\n"); /*Mensaje rápido*/
getch(); /*Presione cualquier tecla para continuar*/
}
printf("**************** ****** *******fin************************\n");
}
/*Registro de búsqueda*/
búsqueda vacía(DIRECCIÓN t[], int n)
{
char s[20] ; /*Guardar la cadena de nombre a buscar */
int i; /*Guardar el número de serie del nodo encontrado*/
clrscr(); */
printf(" busque nombre\n");
scanf("s", s /*Ingrese el nombre que desea encontrar*/
);i=find(t, n, s); /*Llama a la función de búsqueda y obtiene un número entero*/
if(igt;n-1) /*Si el valor del número entero i es mayor que n-1, significa que no se encuentra*/
printf ("no encontrado\n");
else
print(t[ i]); /* Encontrado, llame a la función de visualización para mostrar el registro*/
}
/*Mostrar un registro específico*/
void print (DIRECCIÓN temporal)
{
clrscr();
printf("\n\n*************** *************************** *******\n");
printf("nombre teléfono de la unidad\n");
printf("---------- ----------------------- -----------\n");
printf("-20s-30s-10s\n", temp.nombre, temp.unidades, temp.tele);
printf("*************** ********end****************** ******\n");
}
/*Función de búsqueda, los parámetros son matriz de registros, número de registros y nombres */
int buscar(DIRECCIÓN t[], int n, char *s)
p>
{
int i;
for(i=0; ilt; n; i)/*Empieza desde el primer registro hasta el último*/< / p>
{
if(strcmp(s,t[i].name)==0) /*Si el nombre en el registro y el nombre a comparar son iguales*/ p>
return i; /*Si son iguales, se devolverá el número de subíndice del registro y el programa finalizará antes de tiempo*/
}
return i ; /*Devuelve el valor de i*/
}
/*Eliminar función, los parámetros son la matriz de registros y el número de registros*/
int eliminar(DIRECCIÓN t[], int n)
{
char s[20] /*Nombre del registro que se eliminará*/
int ch=0;
int i, j ;
printf("por favor elimine el nombre\n"); /*Mensaje rápido*/
scanf(" s", s); /*Ingrese el nombre*/
i=find(t, n, s); /*Llame a la función de búsqueda*/
if(igt;n -1) /*Si igt;n-1 excede la longitud de la matriz */
printf("no encontrado no eliminado\n"); */
else
{ p>
print(t[i] /*Llame a la función de salida para mostrar la información del registro*/
printf("¿Estás seguro de eliminarlo?(1/0)\n"); /*Confirma si deseas eliminarlo*/
scanf("d", amp; ch /*Enter); un número entero 0 o 1*/
if(ch==1) /*Si el número entero confirmado para ser eliminado es 1*/
{
for (j=i 1; jlt; n; j) /*Elimine el registro y los registros posteriores reales avanzarán* /
{
strcpy(t[j- 1].name, t[j].name); /*Copiar el nombre del siguiente registro al anterior*/
strcpy(t[j-1].units, t[j] .units); /*Copiar la unidad del siguiente registro al anterior*/
strcpy(t[ j-1].tele, t[j].tele /*Copiar el teléfono); número del registro siguiente al anterior*/
}
n-- /* Disminuir el número de registros en 1*/
}
}
return n; /*Devuelve el número de registros*/
}
/*Insertar función de registro, los parámetros son matriz de estructura y número de registro*/
int add(ADDRESS t[], int n)/*Insertar función, los parámetros son matriz de estructura y número de registro Número*/
{
DIRECCIÓN temp; /*Información del registro recién insertado*/
int i, j;
char s [20
]; /*Determine qué registro insertar antes*/
printf("ingrese el registro\n");
printf("********** ** ************************************\n");
printf("nombre de la unidad teléfono\n");
printf("----------------------------- ---------------------\n");
scanf("sss", temp.nombre, temp.units, temp.tele ); /*Ingresar información de inserción*/
printf("-------------------------------) --- ------------------\n");
printf("ingrese el nombre de ubicación \n");
scanf( "s", s); /*Ingrese el nombre en la posición de inserción*/
i=find(t, n, s); /*Llame a buscar para determinar la posición de inserción* /
for(j=n-1;jgt;=i;j--) /*Retroceder una línea comenzando desde el último nodo*/
{
strcpy(t [j 1].name, t[j].name); /*Copiar el nombre del registro actual al siguiente*/
strcpy(t[j 1] .units, t[j].units ); /*La unidad del registro actual se copia al siguiente*/
strcpy(t[j 1].tele, t[j].tele ); /*El número de teléfono del registro actual se copia al siguiente* /
}
strcpy(t[i].name, temp.name /*); Copie el nombre del registro recién insertado en la posición i-ésima*/
strcpy(t[i].units, temp.units /*Copie la unidad del registro recién insertado en la i); -ésima posición*/
strcpy(t[i].tele, temp .tele /*Copie el número de teléfono del registro recién insertado en la i-ésima posición*/
<); p> n; /*Agregar 1 al número de registros*/return n /*Devolver número de registros*/
}
/* Función guardar, los parámetros son la matriz de estructura y el número de registros*/
void save(ADDRESS t[], int n)
{
int i;
ARCHIVO *fp; /*Puntero al archivo*/
if((fp =fopen("record.txt", "wb"))==NULL) / *Abra el archivo y determine si la apertura es normal*/
{
printf("can not open file\n");
exit(1); /*Salir*/
}
printf("\nGuardando archivo\n"); /*Información de solicitud de salida*/
fpr
intf(fp, "d", n); /*Escribe el número de registros en el archivo*/
fprintf(fp, "\r\n"); archivo*/
for(i=0;ilt;n;i)
{
fprintf(fp, "-20s-30s-10s", t[i ].name, t[i].units, t[i].tele); /*Escribir registro en formato*/
fprintf(fp, "\r\n"); *Los símbolos de línea de ajuste se escriben en el archivo*/
}
fclose(fp); /*Cerrar el archivo*/
printf("** **guardado exitoso** *\n"); /*Mostrar guardado exitoso*/
}
/*Función de lectura, el parámetro es una matriz de estructura*/
int load (DIRECCIÓN t[])
{
int i, n;
ARCHIVO *fp /*Puntero al archivo*/
if((fp=fopen("record.txt", "rb"))==NULL)/*Abrir el archivo*/
{
printf("no se puede abrir el archivo\n"); /*No se puede abrir*/
exit(1 /*Salir*/
}
fscanf(fp," d", amp; n); /*Número de registros leídos*/
for(i=0; ilt; n; i)
fscanf( fp, "20s30s10s", t[i].name, t[i].units, t[i].tele /*Leer registros según formato*/
fclose(fp); *Cerrar el archivo*/
printf("¡¡Has leído correctamente los datos del archivo!!!\n"); /*Mostrar guardado exitoso*/
return n; Devuelve el número de registros*/ p>
}
/*Mostrar funciones de registro por número de serie*/
visualización nula(DIRECCIÓN t[])
{
int id, n;
ARCHIVO *fp; /*Puntero al archivo*/
if((fp=fopen(" record.txt", "rb") )==NULL) /*Abrir archivo*/
{
printf("no se puede abrir el archivo\n"); /*No se puede open file*/
exit(1); /*Salir*/
}
printf("Ingrese el número de pedido...\n"); /*Mostrar información*/
scanf("d", amp; id /*Ingrese el número de serie*/
fscanf(fp, "d", amp; n); /*Leer el número de registros del archivo* /
if(idgt;=0amp;amp;idlt;n) /*Juzgar si el número de serie está dentro del rango de registros*/); p>
{
fseek(fp,(id-1)*s
izeof(ADDRESS), 1); /*Mover el puntero del archivo a la posición del registro*/
print(t[id]); >
printf("\r\n");
}
else
printf("¡¡¡no hay registro de número d!!!\n " , id) ; /*Mostrar información si el número de serie no es razonable*/
fclose(fp); /*Cerrar el archivo*/
}
/*Función de clasificación, parámetros Es la matriz de estructura y el número de registros*/
void sort(ADDRESS t[], int n)
{
int i, j, flag;
DIRECCIÓN temp; /*Las variables temporales se utilizan para intercambiar datos*/
for(i=0; ilt; n; i) p>
{
flag=0; /*Establece el indicador para determinar si se ha producido un intercambio*/
for(j=0;jlt;n-1; j)
if((strcmp (t[j].name, t[j 1].name))gt; 0) /*Comparar tallas*/
{ p>
flag=1;
strcpy(temp.name, t[j].name); /*Intercambiar registros*/
strcpy(temp.units, t [j].units);
strcpy(temp.tele, t[j].tele);
strcpy(t[j].nombre, t[j 1]. nombre);
strcpy(t [j].units, t[j 1].units);
strcpy(t[j].tele, t[j 1]. tele);
strcpy(t [j 1].nombre, temp.nombre);
strcpy(t[j 1].units, temp.units);
strcpy(t[j 1].tele , temp.tele);
}
if(flag==0)break /*Si la bandera es 0; , significa que no se ha producido el final del ciclo de intercambio*/
}
printf("sort sucess!!!\n"); /*Mostrar clasificación exitosa*/
}
/*Búsqueda rápida, los parámetros son la matriz de estructura y el número de registros*/
void qseek(ADDRESS t[], int n )
{
char s[20];
int l, r, m;
printf("\nPor favor, ordene antes qseek!\n"); /*Preguntar para confirmar si los registros se han ordenado antes de realizar la búsqueda*/
printf("Ingrese el nombre para qseek\n"); /*Pedir entrada*/
scanf("
s", s); /*Ingrese el nombre a encontrar*/
l=0; r=n-1; /*Establezca los valores iniciales de los límites izquierdo y derecho*/
while(llt;=r) /*Cuando el límite izquierdo lt;=límite derecho*/
{
m=(l r)/2; *Calcular la posición media */
if(strcmp(t[m].name, s)==0) /*Comparar con el campo de nombre del nodo intermedio para determinar si son iguales*/
{
print(t[m]); /*Si es igual, llame a la función de impresión para mostrar la información del registro*/
return; Retorno*/
}
if(strcmp(t[m].name, s)lt; 0) /*Si el nodo del medio es pequeño*/
l=m 1; /*Modificar el límite izquierdo */
else
r=m-1; /*De lo contrario, el nodo medio es grande, modificar el límite derecho */
}
if(lgt; r) /*Si el borde izquierdo es más grande que el borde derecho*/
printf("no encontrado\ n"); /*Pantalla no encontrada*/
}
/*Copiar archivo*/
copia nula()
{
char outfile[20]; /*Nombre del archivo de destino*/
int i, n;
DIRECCIÓN temp[M]; variables*/
ARCHIVO *sfp, *tfp; / *Definir puntero al archivo*/
clrscr() /*Borrar pantalla*/
if ((sfp=fopen("record.txt", "rb")) ==NULL) /*Abrir el archivo de registro*/
{
printf("no se puede abrir file\n"); /*Muestra la información del archivo que no se puede abrir*/
exit(1); /*Salir*/
}
printf("Ingrese el nombre del archivo de salida, por ejemplo c:\\f1\\te.txt:\ n"); /*Mensaje de solicitud*/
scanf("s", archivo de salida); el nombre del archivo de destino*/
if((tfp=fopen(outfile, "wb"))==NULL) /*Abrir el archivo de destino*/
{
printf("no se puede abrir el archivo\n"); /*Mostrar el mensaje de que el archivo no se puede abrir */
exit(1 /*Salir*/
}
fscanf(sfp, "d", amp; n); /*Leer número de registros del archivo de salida*/
fprintf(tfp, "d", n); /*Número de archivos de destino escritos*/
fprintf(tfp, "\r\n" ); /*Escribir carácter de nueva línea*/
for(i=0;ilt; n;i)
{
fscanf(sfp, "2
0s30s10s\n", temp[i].name, temp[i].units,
temp[i].tele); /*Leer el registro*/
fprintf( tfp, "-20s-30s-10s\n", temp[i].nombre,
temp[i].units, temp[i].tele /*Escribir registro*/< / p>
fprintf(tfp, "\r\n"); /*Escribir carácter de nueva línea*/
}
fclose(sfp); */
fclose(tfp); /*Cerrar el archivo de destino*/
printf("¡¡¡Has copiado el archivo correctamente!!!\n"); */
}