¡Urgente! Cómo programar una interfaz hombre-computadora en lenguaje C
Puede consultar este programa, aprobado bajo tc2.0, derivado de la "Compilación de casos de diseño de cursos de lenguaje C";
/******Archivo de encabezado (.h )**********/
#include "stdio.h" /*Función de E/S*/
#include "stdlib.h" / * Funciones de biblioteca estándar*/
#include "string.h"/*Funciones de cadena*/
#include "ctype.h" /*Funciones de operación de caracteres*/ p>
#define M 50 /*Definir constante para representar el número de registros*/
typedef struct /*Definir estructura de datos*/
{
char nombre[20]; /*nombre*/
char unidades[30] /*unidad*/
char tele[10] /*número de teléfono*/ p>
}DIRECCIÓN;
/******El siguiente es el prototipo de función************/
int enter (DIRECCIÓN t[]); /* Registros de entrada*/
void list(DIRECCIÓN t[],int n); /*Mostrar registros*/
void search(DIRECCIÓN t); [],int n); /* Buscar y mostrar registros por nombre*/
int delete(ADDRESS t[],int n /*Eliminar registros*/
int); add(DIRECCIÓN t[],int n) /*Insertar registro*/
void save(DIRECCIÓN t[],int n /*Guardar registro como archivo*/
int load(ADDRESS t[]); /*Leer registros del archivo*/
void display(ADDRESS t[]); /*Buscar y mostrar registros por número de serie*/
void sort(ADDRESS t[],int n); /*Ordenar por nombre*/
void qseek(ADDRESS t[],int n); /*Buscar registros rápidamente*/ p>
void copy(); /* Copia de archivo*/
void print(ADDRESS temp); /*Mostrar un solo registro*/
int find(ADDRESS t); [],int n,char *s); /* Función de búsqueda*/
int menu_select() /*Función del menú principal*/
/****** La función principal comienza*******/ p>
main()
{
int i;
DIRECCIÓN adr[M ]; /*definir matriz de estructura*/
int length; /*Guardar longitud del registro*/
clrscr() /*Borrar pantalla*/
for(;;)/*Bucle infinito*/
{
switch(menu_select()) /*Llama a la función del menú principal y devuelve un número entero como condición para la declaración de cambio */
{
caso 0:length=enter(adr);break;/*Registros de entrada*/
caso 1:list(adr,length );break; /*Mostrar todos los registros*/
case 2:search(adr,length);break /*Buscar registros*/
caso 3:longitud=eliminar(adr,longitud);break; /*Eliminar registro*/
case 4:length=add(adr,length); >
caso 5:save(adr,length);break; /*Guardar archivo*/
case 6:length=load(adr); >
case 7:display(adr);break; /*Mostrar registros por número de serie*/
case 8:sort(adr,length);break /*Ordenar por nombre*/< / p>
case 9:qseek(adr,length);break; /*Buscar registros rápidamente*/
case 10:copy();break /*Copiar archivos*/
case 11:exit(0); /*Si el valor de retorno es 11, el programa finaliza*/
}
}
}
/*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");/*Solicitud de presionar cualquier tecla para continuar*/
getch() /*Leer cualquier carácter*/ p >
clrscr(); /*Borrar pantalla*/
gotoxy(1,1);
printf("************ *********MENÚ************************\n\n");
printf(" 0 Ingrese el registro\n");
printf(" 1. Listar el archivo\n");
printf(" 2. Buscar registro por nombre\n");
p>printf(" 3. Eliminar un registro\n");
printf(" 4. agregar registro \n");
printf(" 5. Guarde el archivo\n");
printf(" 6. Cargue el archivo\n");
printf(" 7. mostrar registro en el pedido\n") ;
p>printf(" 8. ordenar para crear un nuevo archivo\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");
do{
printf("\n Introduzca su elección(0~11):" /*
Solicitar opciones de entrada*/
scanf("%s",s); /*Ingresar selecciones*/
c=atoi(s); Convertir a entero */
} while(c<0||c>11); /*La selección no está entre 0 y 11.*/
return c /* Devuelve 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 y la función se devuelve el valor El tipo es un número entero que representa la longitud del registro*/
int enter(ADDRESS t[])
{
int i,n;
char *s;
clrscr(); /*Borrar pantalla*/
printf("\npor favor ingrese num \n"); */
scanf("%d",&n); /*Ingrese el número de registro*/
printf("por favor ingrese el registro \n"); */
printf("nombre unidad teléfono\n");
printf("-------------------- ------ -----------------------\n");
for(i=0;i { scanf("%s%s%s",t[i].nombre,t[i].unidades,t[i].tele) ; /*Ingresar registros*/ printf("--------------------------------- --------------- ------\n"); } return n; /*Devuelve el número de registros*/ } /*Mostrar registros, los parámetros son matriz de registros y número de registro*/ lista vacía(DIRECCIÓN t[],int n ) { int i; clrscr(); printf("\n\n****** *******************DIRECCIÓN** ****************\n"); printf ("nombre teléfono de la unidad\n"); printf("- ----------------------------- ---------------------\n" ); for(i=0;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"); } /*Buscar registros*/ búsqueda vacía(DIRECCIÓN t[],int n) { char s[20]; /*Guardar la cadena de nombre a encontrar*/ int i;*Guardar el número de secuencia del nodo encontrado*/ p> clrscr(); /*Borrar pantalla*/ printf("busque nombre\n"); scanf("%s",s); /* Ingrese el nombre a encontrar*/ i=find(t,n,s); /*Llame a la función de búsqueda y obtenga un número entero*/ if(i); >n-1) /*Si el valor entero i es mayor que n-1, significa que no se encontró*/ printf("not found\n"); else print( t[i]); /*Buscar, llame a la función de visualización para mostrar el registro*/ } /*Mostrar el registro especificado*/ void print (ADDRESS temp) { clrscr(); printf("\n\ n****************** ******************************* \n"); printf("nombre de la unidad teléfono\ n"); printf("----------------- ---------------------- ------------\n"); printf("%-20s%-30s%-10s\n",temp.nombre,temp.units,temp. tele); printf("********* ***************fin****************** **********\n"); p> } /*Función de búsqueda, los parámetros son matriz de registros, número de registros y nombres */ int find(ADDRESS t[],int n,char *s) { int i; for(i=0; i { if(strcmp(s,t[i].name)== 0) /*Si el nombre en el registro y el nombre a comparar son igual*/ 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 i*/ } /*Eliminar función, los parámetros son la matriz de registros y el número de registros*/ int delete(ADDRESS t[],int n) { char s[20] /*El nombre del registro que se eliminará*/ p > 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); /*Llamar a la función de búsqueda*/ si(i>n-1) /*si i> ;n-1 excede la longitud de la matriz*/ printf("no encontrado no eliminado\n" /*Muestra que el registro a eliminar no se encuentra*/ else { print(t[i]); /*Llame a la función de salida para mostrar la información del registro*/ printf("Son seguro que lo eliminas( 1/0)\n"); /*Confirma si deseas eliminar*/ scanf("%d",&ch); /*Ingresa 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;j { strcpy(t[j-1].name,t[j ].name); /*Mover el siguiente registro Copiar el nombre del siguiente registro al anterior*/ strcpy(t[j-1].units,t[j].units); /*Copiar la unidad del siguiente registro al anterior*/ p> strcpy(t[j-1].tele,t[j].tele /*Copiar el número de teléfono del siguiente); grabar al anterior*/ } n-- /*Disminuir el número de registros en 1*/ } } return n; /*Devuelve el número de registros*/ p> } /*Inserta la función de registro, los parámetros son la matriz de estructura y el número de registros*/ int add(ADDRESS t[],int n)/*Insertar función, los parámetros son la matriz de estructura y el número de registros*/ { DIRECCIÓN temp; /*Información del registro recién insertado*/ int i,j char s[20]; insertar antes*/ printf("por favor ingrese el registro\n"); printf( "****************** ******************************\ n"); printf("nombre de la unidad teléfono\n "); printf("----------------- ------------------- -------------\n"); scanf("%s% s%s",temp.name,temp.units,temp.tele); / *Ingrese la información de inserción*/ printf("--------------- ------------------- ---------------\n"); printf("ingrese el nombre de ubicación \n"); scanf("% s",s); /*Ingrese el nombre de la ubicación de inserción*/ i=find(t,n,s) ; /*Llame a find para determinar la posición de inserción*/ for(j=n-1;j>=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); /*Copiar la unidad del registro actual al siguiente*/ strcpy(t[j]. +1] .tele,t[j].tele); /*Copiar el número de teléfono actualmente grabado 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); unidad del registro recién insertado en la posición i-ésima posición i*/ strcpy(t[i].tele,temp.tele /*Copie el número de teléfono grabado recién insertado en el i-); ª posición*/ n++ ; /*Aumentar el número de registros en 1*/ return n /*Devolver el número de registros*/ } /*Guardar la función, los parámetros son estructuras Número de arrays y 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("no se puede abrir el archivo\n");/ *No abierto*/ exit(1); /*Salir */ } printf("\nGuardando archivo\n"); Información del mensaje de salida*/ fprintf(fp,"%d" ,n /*Escribe el número de registros en el archivo*/ fprintf(fp,"\r); \n"); /*Escribe el símbolo de nueva línea en el archivo*/ for(i=0;i { fprintf(fp,"%-20s%-30s%-10s",t[i].name, t[i].units,t[i].tele);/*Escribir registro en formato*/ fprintf(fp,"\r\n"); /*Escribir símbolo de nueva línea en el archivo */ } fclose(fp);/*Cerrar el archivo* / printf("****guardado exitoso***\n" ); /*Mostrar guardado exitoso*/ } /*Leer función, el parámetro es matriz de estructura*/ int load(ADDRESS t[ ]) { int i,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 abrir*/ exit(1); } fscanf(fp,"%d", &n); /*Número de registros leídos*/ for(i=0;i fscanf(fp,"%20s%30s%10s", t[i].name,t[i].units,t[i].tele /*Leer registros según formato*); / p> fclose(fp); /*Cerrar el archivo*/ printf("¡¡¡Has leído correctamente los datos del archivo!!!\n"); return n; /*Devuelve el número de registros*/ } /*Mostrar la función de registro por número de serie*/ void display( 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 abrir el archivo*/ exit(1); /*Salir*/ } printf("Ingrese el número de pedido ... \n"); /*Mostrar información*/ scanf("%d",&id); /*Ingrese el número de serie*/ fscanf(fp, "%d", &n); /*Leer el número de registros del archivo*/ if(id>=0&&id { p> fseek(fp,(id-1)*sizeof(ADDRESS),1 /*Mover el puntero del archivo a la posición del registro*/ print(t[id]); / *Llame a la función de salida para mostrar el registro*/ printf("\r\n"); } else printf ("¡¡¡no hay %d registro de número!!!\n ",id /*Mostrar información si el número de secuencia no es razonable*/ fclose); (fp); /*Cerrar el archivo*/ } /*Función de clasificación, los parámetros son la matriz de estructura y el número de registros*/ void sort(DIRECCIÓN t[],int n) { int i,j,flag; DIRECCIÓN temp /*Se utilizan variables temporales; para intercambiar datos*/ for(i=0;i< n;i++) { flag=0 /*Establece la bandera para determinar; si se ha producido un intercambio*/ for(j=0;j if((strcmp(t[j].name,t[j +1].name))>0) /*Comparar tamaños*/ { flag=1; strcpy(temp.name,t[ j].nombre); /*Intercambiar registros*/ strcpy(temp. unit,t[j].units); strcpy(temp.tele,t[j] .tele); strcpy(t[j].nombre,t[j +1].nombre); strcpy(t[j].units,t[j+ 1].unidades); strcpy(t[j].tele,t [j+1].tele); strcpy(t[j+1].nombre, temp.nombre);< /p> strcpy(t[j+1].units,temp.units); strcpy(t[j+1].tele,temp.tele); } if(flag==0)break; /*Si el flag es 0, significa que no se ha producido el final del ciclo de intercambio*/ } printf("¡¡ordenación exitosa!!!\n"); /*Mostrar clasificación exitosa*/ } /*Búsqueda rápida, los parámetros son los matriz de estructura y el número de registros*/ void qseek(ADDRESS t[],int n) { char s[20]; p> int l,r ,m; printf("\n¡Ordene antes de qseek!\n"); /*Pregunte para confirmar si los registros se han ordenado antes de buscar*/ p> printf("por favor ingrese el nombre para qseek\n"); /*Solicitar entrada*/ scanf("%s",s /*Ingrese el nombre a buscar); */ l=0 ;r=n-1; /*Establece los valores iniciales de los límites izquierdo y derecho*/ while(l<=r) / *Cuando el límite izquierdo <= el límite derecho*/ { m=(l+r)/2 /*Calcular la posición media*/ { print(t[m]); /*Si son iguales, llame a la función de impresión para mostrar la información del Registro*/ return /*Return*/ } if(strcmp(t[m].name,s)<0) / *Si el nodo del medio es pequeño*/ l=m+1 /*Modificar el límite izquierdo*/ else r=m-1; / *De lo contrario, si el nodo del medio es grande, modifique el límite derecho*/ } if(l>r) /*Si el límite izquierdo es mayor que el límite derecho*/ printf("not found\n"); / } /*Copiar archivo*/ copia nula( ) { archivo de salida char [20]; /*nombre del archivo de destino*/ int i,n; DIRECCIÓN temp [M] /*Definir variables temporales*/ ARCHIVO *sfp,*tfp; /*Definir punteros a archivos*/ clrscr();/*Borrar pantalla* / if((sfp=fopen("record.txt) ","rb"))==NULL) /*Abrir el archivo de registro*/ { printf("no se puede abrir el archivo\n"); /*Mostrar el información del archivo que no se puede abrir*/ exit(1); /*Salir*/ } p> printf("Ingrese el nombre del archivo de salida, por ejemplo c :\\f1\\te.txt:\n"); /*Mensaje rápido*/ scanf("%s", outfile); /*Ingrese el texto de destino Nombre de archivo*/ if((tfp=fopen(outfile,"wb"))==NULL) /*Abrir el archivo de destino*/ { printf("no se puede abrir el archivo\n"); /*Mostrar la información del archivo que no se puede abrir*/ exit(1) /*Salir*/ } fscanf(sfp,"%d",&n); /*Número de registros de archivos leídos*/ 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;i { fscanf(sfp,"%20s%30s%10s\n",temp[i].nombre,temp[i].units, temp [i].tele); /*Leer registros*/ fprintf(tfp,"%-20s%-30s%-10s\n",temp[i].name, temp[i].units,temp[i].tele); /*Escribir registro*/ fprintf(tfp,"\r\n"); carácter */ } fclose(sfp); /*Cerrar el archivo de origen*/ fclose(tfp); / p> printf("¡¡¡Has copiado el archivo correctamente!!!\n"); /*Mostrar copia exitosa*/ }