const int MaxLen = 200//Puede almacenar hasta 200 información de contacto.
char fName[20]= " tel . dat ";//Archivo de disco: nombre de archivo de la libreta de direcciones
int Len//Variable global, el número total de contactos actuales en el libreta de direcciones
//1 Diseño de la estructura de datos de la libreta de direcciones
estructura typedef número de teléfono
{
nombre char[20] ;// nombre
int grupo; //Grupo: 1. Amigos 2. colega 3. Familia 4. Otros
char home[15];//número de teléfono particular
char mobile phone[15]; //mobile phone
char email[20]; / /Correo electrónico
char add[20]; //Dirección
char memo[20] //Observaciones
}Teléfono;
// Estructura de matriz de punteros, utilizada para ordenar.
índice de estructura typedef
{
int len//longitud de la matriz
tel * tel[MaxLen] //matriz de punteros,
}Índice;
//Mostrar módulo xuanshi.cpp
Lista vacía (tel [], índice lianx ren);// Según el puntero en lianxren La clasificación de la matriz muestra todos los contactos.
void Oferta diaria (void); //Imprimir título
void Oferta diaria (void); //Imprimir pie de página
void PrintOne (Tel r, int) I); //Imprime únicamente la información del contacto R con número de serie I.
Desactivar impresión (número de teléfono); //Imprimir encabezado e información de contacto.
anillo negativo nulo (); //Interfaz de bienvenida
menú int (void); //Menú principal, muestra el menú de primer nivel: Ver libreta de direcciones (1), actualizar dirección libreta (2), libreta de direcciones de respaldo (3), salida (0).
int menu 2(void); //Actualiza el submenú de la libreta de direcciones, mostrando: agregar contactos (21), editar contactos (22), eliminar contactos (23), regresar al menú principal (20) .
//Módulo de procesamiento de archivos wenjiancl.cpp
void New(número de teléfono[], índice * lianx ren); //Agregar contacto. Agregado a la primera posición vacía de la matriz. Después de eso, debes reordenar
void Edit(Tel tel[], Index * lianx ren); //Editar el contacto. Necesita reordenar
void Delete(Tel tel[], Index * lianx ren); //Eliminar el contacto. Eliminación lógica, asignando solo nombres a cadenas vacías. Es necesario reordenarlo después de eliminarlo.
void input (Tel *r, Tel tel[], int menu); //Introduce los datos del contacto e identifícalo a través del menú: añade (11) o modifica (13).
int chongcha(char *name, Tel tel[], char *original); //Comprueba el peso. Antes de agregar o editar empleados, verifique si hay nombres duplicados.
int Select(); //Selecciona el número de serie del contacto para evitar errores.
int Load(Tel tel[], Índice * lianx ren); //Leer. Lea el archivo de la libreta de direcciones fName en la memoria. Categoría
int Guardar(Tel Tel[]); //Guardar. Guarde la libreta de direcciones en el disco con el nombre fName (variable global). La eliminación física se realiza en este momento: un contacto con una cadena vacía indica que el contacto se ha eliminado y no se almacenará en el archivo de la libreta de direcciones.
int Copy(void); //Hacer copia de seguridad de la libreta de direcciones. Copie el archivo de la libreta de direcciones.
void pingypaix(phone[], index * lianx ren); //Ordenar por orden de sonido.
void Xuan paixi(Index * p); //Seleccione la clasificación de la matriz de punteros
//Módulo de archivo principal zhuwenjian.cpp
# include & ltstdio.h & gt
#incluye & ltstdlib.h & gt
#incluye & ltconio.h & gt
#incluye & ltstring.h & gt p>
#Contiene "chuangyong. h"
#Contiene "xuanshi.cpp"
#Contiene "wenjiancl.cpp"
int principal ()
{
Anillo yin ();
int select = 0;
tel tel[MaxLen] // Máximo almacena 200 contactos.
Index lianxren //Matriz de punteros ordenados por orden de voz
Load(phone & amplianx ren //Leer información del archivo de la libreta de direcciones
/ /Recorre los menús para que los usuarios elijan.
Haga {
if(select<10 || select==20) // Elemento del menú principal < 10, o devuelva 20 desde el submenú. Luego se muestra el menú principal.
select = Menu();
else if(select & gt20 & amp& amp select & lt30) //Seleccione el elemento del submenú 2 y continúe mostrando el submenú 2.
select = menu 2();
Cambiar (seleccionar)
{
Caso 1://Ver comunicaciones en orden alfabético registro.
Lista (teléfono, lianx ren);
printf(" \ n \ n \ tPresione cualquier tecla para continuar..."); ); //Esperar a que el usuario vea la pantalla con claridad, conio.h
Pausa;
Caso 21: //Añadir un contacto.
Nuevo(Teléfono&lianxren);
Pausa;
Caso 22: //Editar Contacto
Editar(Teléfono& amplianx ren);
Pausa;
Caso 23: //Eliminar contacto
Eliminar (teléfono & amplianx ren);
Pausa;
Caso 20: //Volver al menú principal
Pausa;
Caso 3: //Hacer copia de seguridad de la libreta de direcciones
Sistema ( "cls" ); //Si no hay un submenú, primero borre el menú anterior stdlib.h
Guardar (teléfono); //Es posible que el usuario haya actualizado. Primero guarde el número de teléfono actual en el archivo de la libreta de direcciones.
copiar();
Break;
Caso 0: //Salir del programa
Break; > }
}Y (select!=0);
Guardar (teléfono); // Antes de salir del sistema, almacene los datos de la memoria en el archivo de la libreta de direcciones.
Devuelve 0;
}
//módulo de menú xuanshi.cpp. Independiente de otros módulos del programa. El código de menú devuelto corresponde a la acción.
//Sección de bienvenida
Anillo Yin no válido ()
{
Char A[100]={ "Bienvenido a este boletín libro.
¡Este programa fue escrito por Fei Yao, o(∩_∩)o...! ¡Sube al coche! "};
int i, j, k;
for(I = 0; i<6;i++)
{
printf (" \ n ");
}
puts(" * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * \ n ");
printf(" \ t \ t ");
for(I = 0; a[i]!='\0';i++)
{
if(I = = 49)printf( " \ n \ n \ t \ t ");
printf("%c ",A[I]);
for(j = 0; j & lt10000;j++ )
for(k = 0; k & lt2000;k++)
;
}
Puts ("\ n \ n \ n \ t \ t 07 Wang, Departamento de Ciencias de la Computación, Clase C");
puts(" \ n * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * \ a ");
getch();
}
//Menú principal, que muestra el menú de primer nivel: Ver libreta de direcciones (1), actualizar libreta de direcciones (2), hacer copia de seguridad de libreta de direcciones (3), salir (0)
<.p>menú int (no válido){
int I;
menú char;
Hacer {
system("cls"); // borrar pantalla, stdlib.h
for(i = 0;i<6;i++)
{
printf(" \ n ");
}
Puts ("\ n * * * * * * *Menú principal* * * * * * * * ") ;
p>puts(" * * ");
Puts(" * 1. Ver libreta de direcciones* ";
Puts(" * 2. Actualizar libreta de direcciones* " ;
Puts(" * 3. Copia de seguridad de libreta de direcciones * ";
Puts(" * 0.
Salir del programa * ";
puts(" * * ");
puts(" * * * * * * * * * * * * * * * * * * * * * * * * \ n ");
printf(" \ tPor favor seleccione: ");
menu = getche();
Cambiar (menú)
{
Caso "0":
puts("\n\n\t¡Salga del programa!");
menú =Menú-' 0 ';
Break; // Salir del bucle
Caso "1":
Caso "3":
menú = menú-'0';
Pausa;
Caso "2":
menú = menú 2();
Interrupción;
Predeterminado:
puts("\n\n\tEleccion incorrecta!");
menu = ' 9
}
} while(menu == ' 9 '); //Regresar código de menú, '0', '1', 20, 21, 22, 23 y '3' son todos Valor válido
Volver al menú
}
//Actualizar el submenú de la libreta de direcciones, mostrando: Agregar contacto (21), Editar contacto (22). ), eliminar contacto (23), devolver (20)
int Menu2()
{
char menu;
int I ;
do {
system("cls"); // borrar pantalla, stdlib.h
for(I = 0; i<6 ;i++)
{
printf(" \ n ");
}
Puts ("\ n * * * * * *Actualizar dirección libro* * * * * * ");
puts(" * * ");
Puts(" * 1. Agregar contacto * ";
puts(" * * ");
p>
Puts(" * 2. Editar contacto * ";
Puts(" * 3. Eliminar contacto * ";
Puts(" * 0. Volver Menú principal * ";
puts(" * * ");
puts(" * * * * * * * * * * * * * * * * * * * * * * * * \ n ");
printf(" \ tPor favor seleccione: ");
menu = getche( ); // Ingresa un carácter sin eco, no es necesario Presionar la tecla Enter, conio.h
Cambiar (menú)
{
Caso "0" :
Cambiar (" \ n\n\¡Volver al menú principal! ");
Romper; // Salir del bucle
Caso "1":
Caso "2":
Caso "3" ":
Interrupción;
Predeterminado:
puts("\n\n\tElección incorrecta!");
menu = ' 9
}
} while(menu = = ' 9 '); //Para devolver el código del menú, "0", "1", "2 " y "3" son valores válidos.
Menú Volver 2 - '0';
}
//Sección de exploración
Voidlist (tel tel [], index lianxren) // Muestra todos los nodos según el método de clasificación de lianx ren.
{
int I; //i: subíndice de matriz
if(Len==0)
{
printf("\n\tSin contacto");
Devolver;
}
Oferta por día ();
p>for(I = 0;I<LenI++) //Recorre todos los contactos en orden alfabético, número de serie i+1.
PrintOne( *(lianxren.tel[i]), I+1
dayingbiaowei()
}
; Void dayingbiaotou(void) //Imprimir encabezado
{
printf(" \ n \ n \ tLibro de direcciones * Contacto"); n \ t-");
printf(" \ n \ t %-10s %-6s %-10s %-10s ", "Nombre", "Grupo", "Teléfono residencial", "Móvil teléfono");
printf(" %-10s %-10s %-10s ", "Correo electrónico", "Dirección", "Observaciones");
printf( " \ n \ t-");
}
Void dayingbiaowei(void)//Imprimir pie de página
{
printf (" \ n \ t-\ n ");
}
Void PrintOne(Tel r, int i) //Solo imprime un contacto r con información del número de serie I.
{
If (I!=0) //El contacto va precedido de un número de serie.
printf("\n%6d\t%-10s ", I, r . name);
De lo contrario // no agregue el número de serie antes del contacto.
printf("\n\t%-10s ", r . nombre);
//Grupo: 1. Amigos 2. colega 3. Familia 4. Otros
Cambiar (grupo derecho)
{
Caso 1:
Printf("%-6s", "Friends" ) ;
Descanso;
Caso 2:
Printf("%-6s ", "Colegas"); /p>
Caso 3:
Printf("%-6s", "family");
Pausa;
Valor predeterminado: p>
Printf("%-6s ", "Otro");
}
printf(" %-10s %-10s %-10s ", r. inicio , r.mobile, r.email);
printf("%-10s%-10s", r.add, r.memo);
}
Void Print(Tel r) //Imprimir encabezado e información de contacto.
{
Oferta por día ();
PrintOne(r, 0); //Solo imprime una persona, no genera el número de serie (la segunda). parámetro es 0).
dayingbiaowei();
}
//Módulo de procesamiento de archivos wenjiancl.cpp
//Parte de procesamiento de archivos
Intload (teltel [], índice * lianxren) // leer. Lea el archivo de la libreta de direcciones fName en la memoria.
Clasificación
{
ARCHIVO * fin
int I = 0;
fin=fopen(fName, " Rb ");
if(!fin)
{
printf("\n\tLa libreta de direcciones no existe, ¡agregue el contacto primero!\n\n\ Presione cualquier tecla para continuar... ");
getch();
Devuelve 0;
}
while(1 )
{
Fred(&tel[i],sizeof(Tel),1,fin);
if(feof(fin))
p>
Romper;
i++;
}
fclose(fin);
len = I ; //Actualizar el número total de personas en la libreta de direcciones
pingypaix (teléfono, lianx ren // Ordenar por orden de sonido
Regresar I;
}
Int Guardar(Tel tel[]) // guardar. Guarde la libreta de direcciones en el disco con el nombre fName (variable global). La eliminación física se realiza en este momento: un contacto con una cadena vacía indica que el contacto se ha eliminado y no se almacenará en el archivo de la libreta de direcciones.
{
ARCHIVO * fout
int i, j; //I: subíndice de matriz de teléfonos, j: número real de personas en la libreta de direcciones (excluyendo Elemento TEL con un nombre vacío).
fout=fopen(fName, "WB");
if (!fout)
{
printf(" \ n \tLa libreta de direcciones no se puede guardar correctamente. Presione cualquier tecla para continuar... ");
getch();
Devuelve 0;
}
//i es el subíndice de la matriz de teléfonos, j es el número real de personas (hay contactos lógicamente eliminados en la matriz de teléfonos y los nombres están vacíos).
for(i=0,j=0;j<Len)
{
//Encuentra un contacto válido y expulsa la lápida (llamada cadena vacía).
mientras( strcmp(tel[i].nombre, " " " == 0)
i++;
fwrite(& tel[i] , tamañode (Tel), 1, fout);
i++;
j++;
}
fclose(fout);
Return j;
}
Int Copy(void) //Copia el archivo de la libreta de direcciones
{
p><. p>FILE *fout, * finTel * p = (Tel *)malloc(sizeof(Tel)); // Almacena datos temporales leídos de la libreta de direcciones
char. nombre[20];fin=fopen(fNombre, "Rb");
if (! fin)
{ p>
printf("\n\t¡Sin conexión!");
Devuelve 0;
}
Haz {
printf(" \ n \ tIngrese el nombre del archivo de respaldo: ");
scanf("%s ", nombre);
strcat(name.
bak");
fout=fopen(name, "WB");
if (!fout)
printf(" \tNombre o ruta del archivo no válido !\n ");
}mientras(!fout);
mientras(1)
{
fread(p , tamaño de (Tel), 1, fin);
if(feof(fin))
Descanso
fwrite(p, tamaño de (Tel), 1 , fout);
}
printf("\n\t¡Copia de seguridad exitosa!");
Gratis (p);
Return 1;
}
//Parte de operación básica
Voidnew (tel tel [], index * lianxren)//Agregar contacto al primer vacío. posición en la matriz. Después de eso, debe reordenar
{
int t = 0; //Encuentre la primera posición vacía en tel para almacenar. p>
if(Len>=MaxLen)
{
printf("\n\n\tLa libreta de direcciones está llena. ! ");
Return;
}
//Encuentra la primera posición vacía t en tel.
while( strcmp(tel[t]).name, " "! =0 )
t++;
Input(&Telephone[t],Telephone,21);//Agregar persona de contacto (21), ingresar información de contacto
len++; //Contacto agregado por 1
pingypaix (teléfono, lianx ren); //Reordenando
}
Voidededit (tel tel [], index * lianx ren) //El contacto editado debe reordenarse
{
int I;
p>Lista (teléfono, * lianx ren /); /Modificar según el orden de clasificación de los símbolos fonéticos
if(Len==0) devuelve;
I = Select() ;
print(*(lianx. ren-& gt; tel[I])); //Muestra el contacto que seleccioné por el usuario
Ingrese (lianxren-& gt; número de teléfono. [i], teléfono, 23); /Ingrese la información de contacto (23) al editar
pingypaix (teléfono, lianx ren); //Reordenar
}
Anular eliminación (tel tel [], index *lianx ren)//Eliminar el contacto. Eliminación lógica, asignando solo nombres a cadenas vacías. Es necesario reordenarlo después de eliminarlo.
{
int I;
Selección de carácter; //Elección del usuario: si continúa ingresando información además del nombre.
List(phone, *lianx ren); //Eliminar en orden alfabético
if(Len==0) regresa;
I = Select() ;
print(*(lianx ren-& gt;tel[I])); //Muestra el contacto que seleccioné por el usuario.
printf(" \ n \ t¿Estás seguro de que deseas eliminar a esta persona? (y/n)");
select = getche()
if(select=='Y' || select=='y ')
{
strcpy(lianx ren-& gt; número de teléfono [I]-& gt; name, ""; //Eliminar información de contacto (eliminación lógica): asigne el nombre a una cadena vacía, indicando ninguno.
len-; //Contacto menos 1
pingypaix (teléfono, lianx ren); //Reordenar
}
}
Ingreso nulo (tel * r, tel tel [], int menu)//Ingrese la información de un contacto, el menú reconocerá: agregar (11) o modificar (13).
{
int select
nombre de carácter[20], original[20];
If(menu==21)/ /añadió, originalmente no tenía nombre.
strcpy(original, " ");
De lo contrario //Editor, alguna vez tuvo un nombre
strcpy(original, r-& gt; nombre) ;
printf(" \ n \ n \ tIngrese el nombre del contacto: "
Haga {
scanf("%s ", nombre) ;
} while(chongcha(nombre, tel, original)); //Comprobación de nombre duplicado. Cuando se modifica, puede ser el mismo que el nombre original.
strcpy(r-& gt; nombre, nombre);
printf("\t¿Quieres seguir escribiendo (y/n)?");
select = getche();
if(select=='y' || select=='Y ')
{
//Grupo
Printf("\n\t Grupo (1. Amigos 2. Colegas 3. Familia 4. Otros), ingrese el número de serie:
scanf("%); d ", &(r->grupo));
mientras(r->grupo<1 | | r->grupo>4)
{
printf( " \ n \ tError de entrada. Vuelva a ingresar el número de serie del grupo (1. Amigos 2. Colegas 3. Familia 4. Otros):)"
scanf("%d " ,&(r) ->grupo));
}
printf("\tPhone:");
scanf("%s ", r->Inicio );
printf("\tMóvil:");
scanf("%s ",r->Móvil);
printf("\ tEmail:");
scanf("%s ",r-& gt;Email);
Printf("\tDirección :");
scanf("%s ",r-> agregar);
printf("\tmark:");
scanf("%s ", r-& gt; nota );
}
Else if(menu==21) //Al agregar un contacto (menu=21), sin la entrada del usuario, se establece un valor predeterminado.
{
r->group = 4; //Grupo predeterminado: otro
strcpy(r->home, "";
strcpy(r-& gt; mover, "";
strcpy(r-& gt; buzón, "";
strcpy(r-& gt ;Agregar , "";
strcpy(r-& gt;Nota, "";
}
}
Intchongcha ( char * nombre, tel tel [], char * original) // Buscar duplicados Antes de agregar o editar un contacto, verifique si hay nombres duplicados.
{
int i, j; //i: subíndice de matriz j: el número real de personas, excepto el nombre, es una cadena vacía.
int dup = 0; //Indicador de nombre duplicado: 1 para nombres duplicados, 0 para nombres no duplicados.
if(strcmp(name,original)!=0)//name no es el nombre original.
for(i=0, j = 0; j & ltLen)//Recorrer todos los contactos
{
//Encontrar contactos válidos, desalojar la lápida ( el nombre es una cadena vacía).
mientras( strcmp(tel[i].nombre, " " " == 0)
i++;
If (strcmp (nombre, tel[I] ].name) = = 0)//name no es el nombre original, pero es el mismo nombre en la libreta de direcciones
{
dup = 1;
printf(" \ n \ t nombre! Vuelva a ingresar: ");
Descanso
}
i++;
j++ ;
}
Volver a dup
}
Int Select() //Selecciona el número de serie del contacto a evitar errores
} p>
{
int I = 0;
int c; la entrada es 1 si la entrada es exitosa; de lo contrario, se devuelve 0.
printf(" \ n \ tSeleccione el contacto por número de serie: "); scanf("%d ", & ampI);
while(I<1||I>Len)
{
printf("\n\tError de entrada ! Seleccione un contacto por número de serie :");
if(c == 0)fflush(stdin); //Error de entrada, borre el contenido del búfer de entrada relacionado con el flujo de entrada stdin, stdio. h
c=scanf("%d ", & ampI);
}
Devolver I-1;
}
// Ordenar parte
Void pingy paix (tel tel [], index * lianx ren) // Ordenar por orden de sonido
int i, j / /i: subíndice de matriz j: el número real de personas, excepto el nombre, es una cadena vacía
if( Len==0)
Return; //Inicializa la matriz de punteros de clasificación
lianx ren-& gt; len = 0
for(i=0, j = 0; j & ltLen)
<; p >{//Buscar un contacto válido y expulsar la eliminación lógica (el nombre es una cadena vacía)
while( strcmp(tel[i].name, " " " = = 0)
i++;
lianx ren-& gt;Teléfono[j]= &Teléfono[I];
j++;
i++;
lianx ren-& gt;len++;
}
//Seleccionar orden
Xuanpaixi (lianx ren) ;
}
void Xuan paixi(Index * p)//Seleccione y ordene la matriz de punteros.
{
int i, j, n = p->>len
int min
Teléfono * temperatura;
p>
if(n==0) return; //No hay contacto, por lo que no es necesario realizar ninguna clasificación.
//Clasificación de selección
for(I = 0;i<n-1;i++)
{
//Elemento mínimo encontrado
min = I;
for(j = I+1; j & ltn; j++)
{
if(strcmp (p->Número de teléfono[j]->Nombre, p->Teléfono[minuto]->Nombre)<0)
min = j;
}
//Intercambia el elemento mínimo min, el primer elemento I de la secuencia desordenada actual.
if (min!=i)
{
temp = p-& gt; teléfono[I];
p- >;tel[I]= p->Teléfono[minuto];
p->;tel[min]= temp;
}
} //Fin de I
}