estructuras de datos cont. c++ y tipos de datos. ejemplo: vector de objetos #include class...
TRANSCRIPT
Estructuras de Datos
Cont. C++ y Tipos de Datos
Ejemplo: Vector de Objetos
#include <iostream.h>#include <string.h>class estudiante{ private: int aCarne; char aNombre[20]; float aNota; int aAnno_ing;
public: estudiante( int eCarne, float eNota, char eNombre[], int eAnno_ing); estudiante(); //Constructor por defecto float ver_nota(); int key(); void ver_nombre(); int ver_anno();
void asignar_nota(float eNota); void asignar_carne(int eCarne); void asignar_anno(int eAnno_ing); void asignar_nombre(char eNombre[]);};
//Constructoresestudiante::estudiante( int eCarne, float eNota, char eNombre[ ], int eAnno_ing){ aCarne=eCarne; aNota=eNota; strcpy(aNombre, eNombre); aAnno_ing=eAnno_ing;}
estudiante::estudiante(){ aCarne=0; aNota=0; aNombre[0]='\0'; aAnno_ing=0;}
float estudiante::ver_nota(){ return aNota; }
void estudiante::ver_nombre(){ cout<<aNombre; }
int estudiante::ver_anno(){ return aAnno_ing;}
int estudiante::key(){ int aKey; aKey=((aAnno_ing)*100000+aCarne); return aKey;}
void estudiante::asignar_carne(int eCarne){ aCarne=eCarne; }
void estudiante::asignar_nota(float eNota){ aNota=eNota; }
void estudiante::asignar_nombre(char eNombre[]){ strcpy(aNombre, eNombre); }
void estudiante::asignar_anno(int eAnno_ing){ aAnno_ing=eAnno_ing; }
void main(void){ estudiante grupo1[10];
int aCarne; char aNombre[20]; float aNota; int aAnno_ing; int k;
//Ciclo de Lectura de datosfor(k=0;k<10;k++){
cout<<"Estudiante #:" << k+1;cout<<"Entre Carnet:";cin>>aCarne;grupo1[k].asignar_carne(aCarne);…//Igual se hace para el nombre, la nota y el año de ingreso…}
//Ciclo para imprimir el arreglo de objetos:
for(k=0;k<10;k++){ cout<<"Estudiante:" <<k+1<<"\n";
cout<<grupo1[k].key(); grupo1[k].ver_nombre(); cout<<grupo1[k].ver_nota();
cout<<grupo1[k].ver_anno();}
}
• Usando el arreglo de estudiantes del ejemplo
anterior, se implementará una función que busca el estudiante con la mayor nota y devuelve su número de identificación y la nota
• Los dos resultados que la función debe retornar se devolverán en una estructura simple (aunque también se podría realizar con dos parámetros pasados por referencia.)
Se define antes del main la siguiente estructura y se especifica la función buscar_mejor:
struct resultado{float nota;int id;
};
void buscar_mejor( estudiante grupo[ ], resultado &result);
La implementación de la función es:
void buscar_mejor(estudiante grupo[ ], resultado &result){ float temp_nota=0.0; int temp_id;
for(int i=0; i<10; i++){ if((grupo[i].ver_nota())>temp_nota) { temp_nota=grupo[i].ver_nota(); temp_id=grupo[i].key(); } }result.nota=temp_nota;result.id=temp_id;}
Finalmente luego de tener “lleno” el vector de objetos se invoca la función y se imprimen los resultados:
struct resultado result; // Variable auxiliarbuscar_mejor(grupo1, result);cout<<"El mejor estudiante es:"<<"\n";cout<<result.id;cout<<result.nota;
Especificación de un Tipo de Datos Escalar
• Identificación: Debe tener un nombre
• Dominio: Conjunto de valores que hacen parte del tipo. Puede ser explícito o implícito
• Operaciones: Que operaciones son aplicables a los valores del tipo y que efecto tiene su aplicación. Normalmente a una operación se le asocia un símbolo
• El efecto de la operación puede ser descrito mediante:
– Mediante Pre y Post Condiciones las cuales pueden ser expresadas mediante:
• Descripciones verbales• Cálculo de Predicados• Pseudo Lenguaje de Programación
– Axiomas
Condiciones que deben cumplirse para que la operación pueda realizarse
Describen el resultado de lasacciones llevadas a cabo y el valor retornado (si lo hay)
Ejemplo: Tipo de datos ColorColor• Dominio (explícito): {rojo, amarillo, azul,
verde, naranja, violeta}*• Operaciones: Se definirán 4 operaciones:
– Mezclar: Combina 2 colores primarios y retorna otro color (secundario)
– Primario: Dice si un color es primario o no– Formado_por: Devuelve los colores que
conforman a un color secundario– Asignar: Asigna un color dado a una variable
de tipo color
*Los 3 primeros son colores primarios
Especificación de las operaciones
Color Mezclar(Color c1, Color c2) Pre: c1 y c2 son colores primarios.Post: La mezcla es un color formado por la
combinación de los colores c1 y c2 en cantidades iguales.
bool Primario(Color c)Pre: NingunaPost: Si c es un color primario, entonces Primario
devuelve verdadero, sino devuelve falso.
void Formado_por(Color c, *Color c1, *Color c2)
Pre: c es un color secundario.
Post: c1 y c2 son dos colores primarios que forman el color c.
void Asignar(*Color c1, Color c2)
Pre: Ninguna
Post: c1 tiene el valor de c2.
Nota: El símbolo * se utiliza en los parámetros para indicar que se trata de un parámetro de retorno
Especificación de un Tipo de Datos Agregado
Aparte de lo anterior se debe especificar:• Componentes: Número y tipoSe considerarán estos casos:
- Tipos de Datos con un número de componentes fijo de tipo variable (como las estructuras) Tipos Estructurados- Tipos de Datos con número variable de componentes pero todos ellos del mismo tipo Tipos iterados
• Estructura de Composición: Es la forma como están unidos los componentes. Los componentes se unen a través de enlaces.– Aridad: Número de enlaces de cada
componente– Ciclicidad: ¿Es posible recorrer la cadena de
enlaces a partir de un elemento y volver a él?
Ejemplo: tipo de dato iterado CCadena_caradena_car• Dominio: Todas las cadenas de caracteres
ASCII de tamaño 5.• Operaciones:
– Car_izq: Devuelve el primer carácter de la cadena
– Agregar: Añade un carácter al final de la cadena
– Invertir: Invierte la cadena
• Elementos componentes: Caracteres ASCII. Máximo 5.
• Estructura de composición: Relación lineal y no cíclica entre los componentes
• Especificación de las operaciones:char Car_izq(Cadena_car c)pre: El tamaño de la cadena es > 0 y < 6.post: El valor devuelto es el primer carácter de la
cadena c.
void Agregar(char l, Cadena_car c)pre: El número de elementos de la cadena c es < 5.post: La cadena c tiene una longitud mayor en una
unidad a la longitud que tenía y el carácter contenido en l es su último carácter.
void Invertir(*Cadena_car c)pre: El número de elementos de la cadena c es < 6.post: La secuencia de caracteres en la cadena c
está invertida.