¡Por favor ayúdenme con esta pregunta sobre programación en lenguaje C!
#include "stdio.h" /*Biblioteca de funciones de entrada y salida estándar*/
#include "stdlib.h" /*Biblioteca de funciones estándar*/
#include "string.h" /*Biblioteca de funciones de cadena*/
#include "conio.h" /*Biblioteca de funciones de operación de pantalla*/
#define HEADER1 " - ----------------------------ALUMNO--------------------- - ------------ \n"
#define HEADER2 " | número | nombre |Comp|Matemáticas|ing | ave |mici | >
#define ENCABEZADO3 " |---------------|---------------|----|---- | ----|--------|-------|-----| "
#define FORMATO " | %-10s |%-15s| % 4d|%4d|%4d| %4d | %.2f |%4d |\n"
#define DATOS p->datos.num,p->datos.nombre,p->datos egrade,p->data.mgrade,p->data.cgrade,p->data.total,p->data.ave,p->data.mingci
#define END "-. ------------------------------------------------- - ---------------- \n"
int saveflag=0; /*Variable de bandera si se guarda en el disco*/
/* Definir estructuras de datos relacionadas con los estudiantes*/
typedef struct Student /*marcado como estudiante*/
{
char num \n"); / *Realizar verificación de puntuación*/
} while(t>100 || t<0);
return t;
}
/*Agregar registro de estudiante*/
void Add(Link l)
{
Nodo *p,*r,*s; Agregar variable de puntero de estructura temporal para la operación*/
char ch,flag=0,num:");
scanf("%d",&select);
if(select==1) /*Consulta por número de estudiante*/
{
stringinput(searchinput,10,"ingrese el número de estudiante existente:"); p>
p=Locate(l,searchinput,"num");/*Encuentre el nodo cuyo número de estudiante es el valor de entrada de búsqueda en l y devuelva el puntero del nodo*/
if( p) /*if p!=NULL*/
{
printheader();
printdata(p);
printf (FIN);
printf("presione cualquier tecla para regresar");
getchar();
}
else
Nofind( );
getchar();
}
else if(select==2) /*Consulta por nombre*/
{
stringinput(searchinput,15,"ingrese el nombre del estudiante existente:");
p=Locate(l,searchinput,"name");
if(p)
{
printheader();
printdata(p);
printf(END); p>
printf("presione cualquier tecla para regresar");
getchar();
}
else
Nofind();
getchar();
}
else
Incorrecto();
getchar ();
}
/*Eliminar registros de estudiantes: primero busque el nodo que guarda el registro de estudiantes y luego elimine el nodo*/
void Del (Enlace l)
{
int sel;
Nodo *p,*r;
char findmess:");
scanf("%d",&sel);
if(sel==1)
{
stringinput(findmess,10 ," ingrese el número de estudiante existente:");
p=Locate(l,findmess,"num");
if(p) /*p!=NULL*/ p>
{
r=l;
while(r->siguiente!=p)
r=r->siguiente;
p>r->next=p->next;/*Eliminar el nodo señalado por p de la lista enlazada*/
free(p); espacio*/
printf("\n=====>¡eliminación exitosa!\n");
getchar();
saveflag=1 ;
}
else
Nofind();
getchar();
}
else if (sel==2) /*Primero consulta el nodo donde se encuentra el registro por nombre*/
{
stringinput(findmess,15,"input el nombre del estudiante existente");
p=Locate(l,findmess,"name");
if(p)
{
r=l;
mientras(r->siguiente!=p)
r=r->siguiente;
r->siguiente= p->siguiente;
p>libre(p);
printf("\n=====>eliminación exitosa!\n");
getchar();
saveflag=1;
}
más
Nofind();
getchar();
}
más
Wrong();
getchar();
}
/*Modificar registros de estudiantes.
Primero consulte el registro de acuerdo con el número de estudiante ingresado y luego solicite al usuario que modifique valores distintos del número de estudiante. El número de estudiante no se puede modificar*/
void Modify(Link l) p>
{
Nodo *p;
char findmess[20];
if(!l->siguiente)
{ system("cls ");
printf("\n======>¡No hay registro de estudiante!\n");
getchar();
return;
}
system("cls");
printf("modificar grabadora de estudiante");
Disp(l);
stringinput(findmess,10,"ingrese el número de estudiante existente:" /*Ingrese y verifique el número de estudiante*/
p= Locate(l,findmess,"num "); /*El nodo se encuentra*/
if(p) /*Si p!=NULL, indica que el nodo ha sido encontrado*/ p>
{
printf("Número:%s,\n",p->datos.num);
printf("Nombre:%s,", p->data.name);
stringinput(p->data.name,15,"ingrese nuevo nombre:");
printf("Puntuación del lenguaje C:%d ,",p->data.cgrade);
p->data.cgrade=numberinput("Puntuación del lenguaje C[0-100]:");
printf(" Puntuación de matemáticas:%d,",p-> data.mgrade);
p->data.mgrade=numberinput("Puntuación de matemáticas[0-100]:");
printf("Puntuación en inglés:%d", ,p->data.egrade);
p->data.egrade=numberinput("Puntuación en inglés[0-100]:"); p>
p->data.total =p->data.egrade+p->data.cgrade+p->data.mgrade;
p->data.ave=(flotante) (p->data.total/3);
p->data.mingci=0;
printf("\n=====>modificar éxito!\n ");
Disp (l);
saveflag=1;
}
else
Nofind ();
getchar ();
}
/*Insertar registro: Consulta la ubicación del nodo a insertar según el número de estudiante, y luego inserte un nuevo nodo después del número de estudiante.
*/
void Insert(Link l)
{
Enlace p,v,newinfo /*p apunta a la posición de inserción, newinfo se refiere a la registro recién insertado* /
char ch,num[10],s[10]; /*s[] guarda el número de estudiante antes de la posición del punto de inserción, num[] guarda el nuevo registro ingresado. */ p>
int flag=0;
v=l->next;
system("cls");
Disp (l);
while(1)
{ stringinput(s,10,"ingrese la ubicación de inserción después del número:");
flag= 0;v= l->next;
while(v) /*Consulta si el número de estudiante existe, flag=1 significa que el número de estudiante existe*/
{
if(strcmp(v->data.num,s)==0) {flag=1;break;}
v=v->siguiente;
}
if(flag==1)
break; /*Si el número de estudiante existe, realice la operación de entrada de insertar el nuevo registro anterior*/
else
{ getchar();
printf("\n======>El número %s no existe, ¿inténtalo de nuevo?(s/n): ",s);
scanf("%c",&ch);
if(ch=='y'||ch=='Y')
{continuar; }
más
{return;}
}
}
/ *Ingreso de los siguientes registros nuevos La operación es la misma que Add()*/
stringinput(num,10,"input new Student Number:");
v=l ->siguiente;
while(v)
{
if(strcmp(v->data.num,num)==0)
{
printf("======>Lo sentimos, ¡el nuevo número:'%s' ya existe!\n",num);
printheader ();
printdata (v);
printf("\n");
getchar();
return;
}
v=v->siguiente;
}
newinfo=(Nodo *)malloc(tamañode(Nodo)) ;
if(! newinfo)
{
printf("\n falla en la asignación de memoria "); mensaje rápido*/
retorno;
/*Regresar a la interfaz principal*/
}
strcpy(newinfo->data.num,num);
stringinput(newinfo->data. nombre, 15,"Nombre:");
newinfo->data.cgrade=numberinput("Puntuación en lenguaje C[0-100]:");
newinfo->data .mgrade =numberinput("Puntuación de matemáticas[0-100]:");
newinfo->data.egrade=numberinput("Puntuación de inglés[0-100]:");
newinfo->data.total=newinfo->data.egrade+newinfo->data.cgrade+newinfo->data.mgrade;
newinfo->data.ave=(float)(newinfo- >datos .total/3);
newinfo->data.mingci=0;
newinfo->next=NULL;
saveflag=1; *En main() tiene un juicio sobre la variable global. Si es 1, realice una operación de guardado*/
/*Asigne el puntero a p, porque el nodo al lado del nodo principal en l es. realmente guardados registros de estudiantes*/
p=l->next;
while(1)
{
if(strcmp. (p ->data.num,s)==0) /*Insertar un nodo en la lista enlazada*/
{
newinfo->next=p->next;
p->siguiente=newinfo;
pausa;
}
p=p->siguiente;
}
Disp(l);
printf("\n\n");
getchar();
} p>
/*Estadísticas sobre la puntuación total de la clase, la primera en una sola materia, y el número de personas que reprobaron en cada materia*/
void Tongji(Enlace l )
{
Nodo *pm,*pe,*pc,*pt /*Solía apuntar al nodo con la puntuación más alta*/
Nodo *r=l->next;
int countc=0,countm=0,counte=0 /*Guarda el número de personas que reprobaron en las tres materias*/
if(!r)
{ system("cls");
printf("\n=====>¡No es registro de estudiante!\n"); p>
getchar();
return ;
}
system("cls");
Disp(l );
pm=pe=pc =pt=r;
mientras(r)
{
si(r-> datos.cgrade<60) countc++;
if(r->data.mgrade<60
) countm++;
if(r->data.egrade<60) counte++;
if(r->data.cgrade>=pc->data.cgrade) pc=r ;
if(r->data.mgrade>=pm->data.mgrade) pm=r;
if(r->data.egrade>=pe->datos .egrade) pe=r;
if(r->data.total>=pt->data.total) pt=r;
r=r->siguiente;
}
printf("\n-----------------------------el TongJi resultado--------------------------------\n");
printf("Lenguaje C <60:%d (ren)\n",countc);
printf("Matemáticas <60:%d (ren)\n",countm);
printf ( "Inglés <60:%d (ren)\n",counte);
printf("---------------------- - -------------------------------------------------- ------\n");
printf("El estudiante con mayor puntuación por nombre de puntuación total:%s puntuación total:%d\n",pt->data.name,pt- > data.total);
printf("El estudiante con mayor puntuación en inglés nombre:%s puntuación total:%d\n",pe->data.name,pe->data.egrade <); /p>
printf("El estudiante con mayor puntaje en Matemáticas nombre:%s puntaje total:%d\n",pm->data.name,pm->data.mgrade);
printf("El estudiante más alto por puntaje C nombre:%s puntaje total:%d\n",pc->data.name,pc->data.cgrade);
printf("\n \ npresione cualquier tecla para regresar");
getchar();
}
/*Utilice el método de clasificación por inserción para implementar el campo de puntuación total de un lista enlazada Ordenar en orden descendente, de mayor a menor*/
void Sort(Link l)
{
Link ll;
Nodo *p ,*rr,*s;
int i=0;
if(l->next==NULL)
{ sistema( "cls") ;
printf("\n======>¡No es registro de estudiante!\n");
getchar();
regresar ;
p>}
ll=(Node*)malloc(sizeof(Node)); /*Se utiliza para crear nuevos nodos*/
if(!ll)
{
printf("\n falla en la asignación de memoria "); /*Si no se recibe la solicitud, imprima el mensaje de aviso*/
return /*Regrese a la interfaz principal. */ p>
}
ll->next=NULL;
system("cls");
Disp(l); /*Mostrar clasificación Todos los registros de los estudiantes antes*/
p=l->siguiente;
while(p) /*p!=NULL*/
{
while(p) p>
s=(Node*)malloc(sizeof(Node)); /*El nuevo nodo se utiliza para guardar la información del nodo extraída de la lista enlazada original. */
if(!s) /* s==NULL*/
{
printf("\n falla en la asignación de memoria "/*); Si no se recibe la solicitud, imprima el mensaje*/
return /*Regresar a la interfaz principal*/
}
s->data =p->data; /*Rellene el campo de datos*/
s ->next=NULL /*El campo del puntero está vacío*/
rr=ll;
/*La lista enlazada rr almacena una lista enlazada que permanece ordenada después de insertar un solo nodo. ll es este El puntero principal de la lista enlazada, busca la posición de inserción desde el principio cada vez*/ p>
while(rr->siguiente!=NULL && rr->siguiente->datos.total>=p->datos.total)
{rr=rr->siguiente;} / *Mueva el puntero a la posición del nodo donde la puntuación total es menor que la puntuación total del nodo señalado por p*/
if(rr->next ==NULL)/*Si la puntuación total de todos los nodos en la nueva lista vinculada ll es mayor que p->data.total, agregue el nodo señalado por p al final de la lista vinculada*/
rr-> next=s;
else /* De lo contrario, inserte el nodo delante del primer nodo cuyo campo de puntuación total sea menor que él*/
{
s->next= rr->next;
rr->next=s;
}
p=p->next; /*lista enlazada original El puntero en se mueve bajar un nodo*/
}
l->next=ll->next /*El puntero principal de la lista enlazada ordenada almacenada en ll*/
p=l->next; /*El puntero de encabezado ordenado se asigna a p, listo para completar la clasificación*/
while(p!=NULL) /*Cuando p Cuando no lo es vacío, realice las siguientes operaciones*/
{
i++; /*Número de serie del nodo*/
p->data.mingci=i; Asignar la clasificación*/
p=p->next; /*Mover el puntero hacia atrás*/
}
Disp(l);
p>saveflag=1;
printf("\n =====>ordenar completo
te!\n");
}
/*Guardar datos. Si el usuario no realiza esta operación específicamente y modifica los datos, se le pedirá que guarde al salir. el sistema* /
void Save(Link l)
{
ARCHIVO* fp;
Nodo *p;
int count=0;
fp=fopen("c:\\student","wb");/*Abrir archivo binario en modo de solo escritura*/
if( fp==NULL) /*Error al abrir el archivo*/
{
printf("\n=====>¡error al abrir el archivo!\n" );
getchar();
return ;
}
p=l->siguiente;
while(p)
{
if(fwrite(p,sizeof(Node),1,fp)==1)/*Escribe un registro o información de un nodo en el archivo cada vez*/
{
p=p->siguiente;
count++;
}
else
{
descanso;
}
}
if(count>0) p>
{
getchar();
printf("\n\n\n\n\n=====>guardar archivo completo, registro total guardado el número es:%d\ n",count);
getchar();
saveflag=0;
}
else
{system("cls");
printf("¡el enlace actual está vacío, no se guarda ningún registro de estudiante!\n");
getchar ();
}
fclose(fp); /*Cerrar este archivo*/
}
void main()
{
Enlace l; /*Definir lista enlazada*/
ARCHIVO *fp /*Puntero de archivo*/
int select; ; /*Guardar la variable de resultado de la selección */
char ch; /*Guardar (y,Y,n,N)*/
int count=0; de registros (o resultados) en el archivo Número de puntos)*/
Nodo *p,*r /*Definir variable de puntero de registro*/
l=(Nodo*) malloc(sizeof(Node));
if(!l)
{
printf("\n falla en la asignación de memoria "); no se recibe la solicitud, imprima el mensaje*/
return /*Regresar a la interfaz principal*/
}
l->next=NULL ;
r=l;
p>fp=fopen("C:\\student","ab+"); /*Abrir un archivo binario en modo agregar, que es legible y grabable Si el archivo no existe, se creará*/
if(fp==NULL)
{
.
printf("\n=====>¡no se puede abrir el archivo!\n");
salir(0);
}
mientras( !feof(fp))
{
p=(Nodo*)malloc(tamañode(Nodo));
if(!p)
{
printf(" ¡Error de malloc de memoria!\n"); /*La aplicación no fue exitosa*/
exit(0); p>
}
if(fread(p,sizeof(Node),1,fp)==1) /*Leer el registro de puntuación de un estudiante del archivo a la vez*/
{
p->next=NULL;
r->next=p;
r=p; el puntero hacia atrás Una posición*/
count++;
}
}
fclose(fp); /
printf("\n=====>abrir el archivo correctamente, el número total de registros es: %d.\n",count);
menu();
mientras(1)
{
sistema("cls");
menú();
p=r ;
printf("\n Ingrese su elección(0~9):"); /*Mostrar información de solicitud*/
scanf("%d" ,&select);
if(select==0)
{
if(saveflag==1) /*Si los datos de la lista enlazada son modificado y no se realiza ninguna operación de guardado, entonces este indicador es 1*/
{ getchar();
printf("\n=====>Si se guarda el registro modificado a presentar?(s/n ):");
scanf("%c",&ch);
if(ch=='y'||ch==' Y')
Save(l);
}
printf("======>¡gracias por su utilidad!"); p>
getchar() ;
romper;
}
cambiar(seleccionar)
{
case 1:Add(l );break; /*Agregar registro de estudiante*/
case 2:Del(l);break; /*Eliminar registro de estudiante*/
caso 3:Qur(l); break; /*Consultar registros de estudiantes*/
caso 4:Modify(l);break; /*Modificar registros de estudiantes*/
caso 5 :Insert(l);break; /*Insertar registro de estudiante*/
caso 6:
Tongji(l);break; /*Estadísticas de registros de estudiantes*/
caso 7:Sort(l);break; /*Ordenar registros de estudiantes*/
caso 8:Save( l);break; /*Guardar registros de estudiantes*/
case 9:system("cls");Disp(l);break /*Mostrar registros de estudiantes*/
predeterminado: Wrong();getchar();break; /*La clave es incorrecta, debe ser un valor 0-9*/
}
}
}