Ayúdame a escribir un programa en C
//Hola amigos, simplemente pueden modificar el siguiente programa. Los comentarios son muy claros
Título:
Personas en universidades Divididas en tres categorías: estudiantes. , docentes y personal, su información básica es la siguiente:
Estudiantes: nombre, edad, número de estudiante, grado, calificaciones
Docentes: nombre, edad, cédula de identidad, cargo , salario
Personal: nombre, edad, número de identificación, salario
Ahora necesitamos administrar la información de varios miembros del personal, utilice el método orientado a objetos para diseñar una lista enlazada heterogénea , utilizado para almacenar su información.
/*Implementación de lista enlazada heterogénea: hay tres clases: estudiante, profesor y personal, y luego define una clase de lista enlazada
. Esta clase se utiliza para almacenar objetos de estos diferentes. clases, y declarar la lista de clases de la lista vinculada como amiga de todas estas clases para que puedan acceder a sus miembros privados.
*/
#include lt;iostream.hgt;
#include lt;string.hgt
#include lt;conio.hgt; >
class person{ //Definir una clase base diferente con miembros de datos públicos
lista de clases amigas; //La clase de lista enlazada sirve como amiga de esta clase
protegida; :
char name[20]; //Definir nombre
int age; //Definir edad
char add[40 ] //Definir dirección
char tele[20]; //Definir número de teléfono
persona estática *ptr; //Definir un puntero estático que apunta al objeto de clase persona
persona *next ; //Puntero al siguiente objeto
public:
person(char *name, int age, char *add, char *tele); p>virtual void print(); //Descripción de la función virtual
virtual void insert(){} //Definir la función virtual y no hacer nada, solo definir una interfaz
} ;
estudiante de clase: persona pública{ // Estudiante de clase derivada
lista de clases de amigos // Clase de lista vinculada como amiga de esta clase
int nivel; ; //Definir calificación
float grade_point_average; //Definir puntaje promedio
public:
estudiante(char *nombre, int edad, char *add, char *tele, int level,
float grade_point_average); //Declarar el constructor
void print() //Redefinir la función print()
void insert (); //Redefinir la función insert()
};
//
profesor de clase: persona pública{ //Profesor de clase derivado
lista de clases de amigos; //La clase de la lista enlazada sirve como amiga de esta clase
salario flotante; //Definir salario
public:
teacher(char *nombre, int edad, char *add, char *tele, salario flotante
//Declarar el constructor
void print (); función print()
void insert(); //Redefinir la función insert()
}
//
clase staff: public person{ // Clase derivada staff
lista de clases de amigos; //La clase de la lista vinculada es amiga de esta clase
float hourly_wages // Definir salarios por hora
p>
publi
c:
staff(char *name, int age, char *add, char *tele,
float hourly_wages); //Declarar el constructor
void); print(); //Redefinir la función print()
void insert(); //Redefinir la función insert()
};
lista de clases{ //Definir clase de lista enlazada heterogénea
persona *root; //Puntero de encabezado de lista
público:
lista (){ root=0 } //Constructor de lista vinculada, el valor inicial es 0
void insert_person(person *node); //Inserta un nodo de objeto en la lista vinculada
void remove (char *name); //Eliminar un nodo de objeto de la lista enlazada
void print_list() //Generar toda la lista enlazada
};
/ /
persona::persona(char *nombre, int edad, char *add, char *tele)
{ //Constructor de persona
strcpy (persona::nombre, nombre);
strcpy(persona::añadir, añadir);
strcpy(persona::tele,tele
);persona::edad=edad;
next=0;
}
void persona::print() //Función miembro virtual de la base versión de clase print(), salida de miembros de datos de clase base
{
coutlt;lt;"\nname: "lt;lt;namelt;lt;"\n" ; p>
coutlt;lt;"age: "lt;lt;agelt;lt;"\n";
coutlt;lt;"dirección: "lt;lt;addlt;lt;" \n" ;
coutlt;lt;"número de teléfono: "lt;lt;tellt;lt;lt;"\n";
}
//
estudiante::estudiante(char *nombre, int edad, char *add, char *tele, int nivel,
float grade_point_average): persona(nombre, edad, agregar , tele)
float grade_point_average)
p>{ //student Al constructor de la clase derivada se le debe agregar el constructor de la clase base
student ::level=level;
student::grade_point_average=grade_point_average ;
}
void Student::print() //Nueva versión de la función miembro print () del estudiante de clase derivada
{
persona::print()
coutlt;lt;"promedio de calificaciones: "lt;lt;grade_point_
Averagelt;lt;"\n";
}
void Student::insert()
{ //Asignar un objeto de la clase de estudiante a ptr. Puntero de clase base, esto está permitido
ptr=nuevo estudiante(nombre, edad, agregar, tele, nivel, promedio_calificación
}
// <); /p>
profesor::profesor(char *nombre, int edad, char *add, char *tele, salario flotante)
:persona(nombre, edad, agregar, tele) // profesor Al constructor de la clase derivada se le debe agregar
//Constructor de la clase base
{
teacher::salary=salary
}
void profesor::print() //Nueva versión de la función miembro print() de la clase derivada profesor
{
persona: :print ();
coutlt;lt;"salario: "lt;lt;salarylt;lt;"\n";
}
vacío profesor :: insert()
{ //Asigna un objeto de la clase profesor al puntero de clase base ptr, lo cual está permitido
ptr=new profesor(nombre, edad, agregar, tele, salario);
}
//
staff::staff(char *nombre, int edad, char *add, char *tele, float) salarios_horas)
:persona(nombre, edad, agregar, tele) //personal Es necesario agregar el constructor de la clase derivada
//El constructor de la clase base
//El constructor de la clase base p>
{
staff::hourly_wages=hourly_wages;
}
void staff::print() //La función miembro print() del personal de clase derivada es la nueva versión
{
person::print()
coutlt;lt;"hourly_wages: "lt;lt;hourly_wageslt; ;lt;"\n" ;
}
void staff::insert()
{ //Asigna un objeto de la clase staff al ptr puntero de clase base, que está permitido
ptr=new staff(name, age, add, tele, hourly_wages
}
//
lista vacía: :insert_person(persona *nodo)
{ //Inserta un objeto en la lista enlazada heterogénea, que puede ser estudiante, profesor o personal
char key [20];
strcpy(key, node-gt; name); //Asigna el nombre del objeto a insertar a la clave
person *curr_node=root
p>p>
persona *previous=0; //Definir dos punteros de búsqueda
while(curr_node !=0 amp; amp; strcmp(curr_node-gt; name, key)lt; 0) < / p>
{ //Utilice curr_node al frente, anterior al final y la tecla para realizar un bucle para encontrar la posición de inserción, ordenar por nombre
//Las cadenas se ordenan en orden ascendente, strcmp (cadena 1, cadena 2)lt; 0 significa cadena 1lt; cadena 2, continúa buscando
previous=curr_node
curr_node=curr_node-gt; >}
node-gt; insert(); //Dado que insert() es una función virtual, se llamará según el objeto del puntero del nodo
//Usar diferentes versiones: ptr=new lt; tres clases derivadas Uno de los nombres es gt; (tabla de variables del miembro de datos),
//Las variables del miembro de datos son asignadas por el constructor, usando el nuevo atributo: int *s;
// s =new int(20); abrirá espacio y le dará el valor 20, entonces:
//Llame a la función virtual para asignar. el objeto que se insertará en la unidad señalada por ptr
node-gt;ptr-gt;next=curr_node
if(previous==0)
root=node-gt;ptr;
else
anterior-gt; next=node-gt; tres oraciones insertan el nodo señalado por ptr en la cadena, aquí: node-gt; ptr, anterior -gt;ptr,
//curr_node-gt;ptr son todos iguales, es decir, equivalentes a person::ptr indica que ptr está restringido
//El objeto es stu: :ptr o tea::ptr o sta::ptr, por lo que node-gt;ptr-gt;next se puede escribir como
// (node-gt;ptr)-gt;next o persona::ptr -gt;siguiente pero node-gt;el nombre no se puede escribir como
// persona: :nombre, solo puede aparecer en el constructor
}
void list::remove(char *name)
{ //Eliminar un objeto del lista enlazada heterogénea Este objeto coincide con el nombre de la palabra clave
person *curr_node=root
person *previous=0; 0 amp; amp; strcmp(curr_node-gt; nombre, nombre)!=0)
{ //Utiliza un bucle para encontrar este objeto
previous=curr_node
curr_node=curr_node-gt; next;
}
if(curr_node!=0 amp; amp; anterior==0) //Si este objeto es el nodo principal en la lista vinculada
{
root=curr_node-gt; next
eliminar curr_node
}
p>
else if(curr_node!=0 amp; amp; anterior!=0) //Este objeto es un nodo no principal en la lista vinculada
{
previous-gt; =curr_node -gt; siguiente;
eliminar curr_node;
}
}
lista vacía::print_list()
{
person *cur=root; //Asigna el puntero principal a cur primero
while(cur!=0) //Recorre el contenido del nodo y mueve el puntero
{
cur-gt; print(); //Llama a diferentes versiones de print() según el objeto señalado por cur
cur=cur -gt ;siguiente;
}
}
//
persona *persona::ptr=0; variables Valor inicial
int main()
{
char c;
lista de personas //Definir el objeto de la lista; clase, al mismo tiempo, se llama al constructor de la lista,
// Es decir, root=0
student stu("Liu Ying liuying", 20, "Shanghai shanghai ", "03578395-456", 3, 80.0);
//Defina el objeto stu de la clase de estudiante y llame al constructor del estudiante al mismo tiempo,
// Es decir, primero el constructor persona de la clase base, y luego su propio
teacher tea("李明liming", 35, "Beijing beijing", "0105918695-106", 560.50 ); p>
personal personal("陈林chenling", 40,"Qingdao qingdao ", "05325895944-335",
people.insert_person(amp;stu
);people.insert_person(amp;tea);
people.insert_person(amp;sta);
coutlt;lt;"¡Fin de la inserción!\n"; p>
people.print_list();
coutlt; "\n¡Lo anterior imprime la lista enlazada original! Presione c lt; Ingrese gt; Continuar..."; >
cingt; gt;
personas.remove( "陈林chenling");
personas.remove("李明liming");
people.remove("王迢wangchong");
coutlt;lt;"¡Eliminación completa!\n";
people.print_list();
coutlt;lt;"\n¡Lo anterior imprime la lista enlazada eliminada!\n"
return 0;