Beruflich Dokumente
Kultur Dokumente
ga
Resolución del problema: Sistematización de una libreta de calificaciones
Método de resolución: Lista simple
Lenguaje: Microsoft Visual C++ Versión 6.0
El siguiente ejemplo es una implementación de la libreta de calificaciones vista en clase en una estructura de
datos dinámica TADs (Tipos Abstractos de Datos), el tipo de estructura es una LISTA ABIERTA caracterizado
porque cada elemento de la lista (nodo), solo dispone de un puntero que apuntará al siguiente elemento de la
lista o valdrá NULL en caso de ser el último elemento.
#include <iostream>
#include <string>
using namespace std;
const LARGO=40;
//Creación del tipo de dato _nodo, el cual es una estructura que agrupa los datos (campos con los que
trabajará //nuestro programa, tiene en la última línea un campo o puntero autoreferencial, es decir un puntero
que
//apunta a objetos del mismo tipo nodo “struct _nodo *Siguiente”.
typedef struct _nodo
{
int nRegistro;
char cMateria[LARGO];
float nNotaP1;
float nP1;
float nNotaP2;
float nP2;
float nNotaP3;
float nP3;
float nDef;
char cConcepto[LARGO];
struct _nodo *Siguiente;
}TipoNodo;
int main(void)
{//Inicio de la función principal
Lista lista=NULL;//Se crea el primer nodo de la lista y se hace igual a NULL, es decir la lista está vacia
//Ahora se hacen todos los procesos referentes al cálculo de la libreta de calificaciones
//----------------------------------------
nCantidad=0;ni=0,nMatPer=0;
cout<<"Nombre: ";
cin>>cNombre;
cout<<"Semestre: ";
cin>>cSemestre;
cout<<"Cantidad de materias: ";
cin>>nCantidad;
if((nCantidad>=3)&&(nCantidad<=10))
{//Inicio de if nCantidad >=3
for(ni=1;ni<=nCantidad;ni++)
{//Inicio for ni
//Lectura de información
cout<<"Materia: ";
cin>>cTmpMateria;
cout<<"Primer parcial: ";
cin>>nTmpNotaP1;
cout<<"Segundo parcial: ";
cin>>nTmpNotaP2;
cout<<"Tercer parcial: ";
cin>>nTmpNotaP3;
//Cálculo de datos
nTmpP1=nTmpNotaP1*0.35;
nTmpP2=nTmpNotaP2*0.35;
nTmpP3=nTmpNotaP3*0.30;
nTmpDef=nTmpP1+nTmpP2+nTmpP3;
if(nTmpDef<3)
{//Inicio de if nTmpDef<3
strcpy(cTmpConcepto,"Habilita");
nMatPer++;
}//Final de if nTmpDef<3
else
{strcpy(cTmpConcepto,"Aprueba");}
}//Final de for ni
//Una vez ha terminado el ciclo, se evalúa la cantidad de materias perdidas para asignar un mensaje a la variable
resultado
if (nMatPer==0){ strcpy(cMsjFinal,"Felcitaciones pasa en limpío");}
else
{if(nMatPer<=3){strcpy(cMsjFinal,"Habilita materias");}
else{strcpy(cMsjFinal,"Semestre especial");}
}
Linea();
cout<<"El resultado final es: "<<cMsjFinal<<endl;
Linea();
//Hasta aquí se el proceso de calculo de datos de la libreta y su inserción en la lista.
//Ahora se realizarán las principales operaciones con listas
cout<<"Operaciones con listas"<<endl;
Linea();
cout<<"Mostrar toda la lista"<<endl;
MostrarLista(lista); //Se llama la función que muestra toda la lista
Linea();
//El siguiente proceso se utiliza para borrar un nodo específico dentro de la lista, para ello se lee el número de
//registro que se quiere eliminar y se pasa por parámetro a la función BorrarNodo, recibe el nombre de la
lista //que valga la redundancia es el mismo que se inicializo en NULL al principio y el mismo que se paso
por //parámetro en la función InsertarNodo.
cout<<"Borrar un nodo de la lista"<<endl;
cout<<"Digite el número de registro que quiere eliminar:";
cin>>nNumRegistro;
BorrarNodo(&lista,nNumRegistro);
Linea();
//Una vez que se ha eliminado el nodo de la lista, se visualiza nuevamente la lista en pantalla.
cout<<"La lista ahora es:"<<endl;
void InsertarNodo(Lista *lista, int nfRegistro, char *cfMateria, char *cfConcepto, float nfNotaP1, float
nfNotaP2, float nfNotaP3, float nfP1, float nfP2, float nfP3, float nfDef)
{//Inicio de la función InsertarNodo
pNodo nuevo, anterior; //Se declaran dos variables haciendo uso del tipo definido por el usuario pNodo
//Ya declaradas las variables, se crea un nuevo nodo, para ello se hace uso de la función MALLOC //
(Memory Allocation Asignación de Memoria) y la función SIZEOF (Tamaño de)
nuevo=(pNodo)malloc(sizeof(TipoNodo));//Separa la porción de memoria en la que va el nuevo nodo
nuevo->nRegistro=nfRegistro;
strcpy(nuevo->cMateria,cfMateria);
strcpy(nuevo->cConcepto,cfConcepto);
nuevo->nNotaP1=nfNotaP1;
nuevo->nNotaP2=nfNotaP2;
nuevo->nNotaP3=nfNotaP3;
nuevo->nDef=nfDef;
//Se verifica si la lista está vacia
if(ListaVacia(*lista)||(*lista)->nRegistro>nfRegistro)
{//Inicio de if lista vacia
//Se añade el contenido de la lista a continuación del nuevo nodo
nuevo->Siguiente=*lista;
//Ahora el comienzo de la lista es el nuevo nodo
*lista = nuevo;
}//Final de if Lista vacia
else
{//Inicio del else
//Busca el nodo de menor valor a nRegistro
anterior=*lista;
//Se avanza hasta el último elemento de la lista o hasta el siguiente que tenga un valor
//mayor que nRegistro