INFORMÁTICA INDUSTRIAL - UC3M
Transcript of INFORMÁTICA INDUSTRIAL - UC3M
M.Abderrahim,A.Castro,J.C.Cas3llo/01.10.2017/Informá3caIndustrial
M.Abderrahim,A.Castro,J.C.Cas3lloDepartamentodeIngenieríadeSistemasyAutomá3ca
Plan3llasenC++.
INFORMÁTICAINDUSTRIAL
M.Abderrahim,A.Castro,J.C.Cas3llo/01.10.2017/Informá3caIndustrial
AGENDA
• Plan3llas• Sintaxis• Plan3llasdeFunciones• FuncionesconPlan3llascomoParámetros• PasarunaPlan3llaGenérica• MiembrosEstá3cos:datosyfunciones• BibliotecadePlan3llas
M.Abderrahim,A.Castro,J.C.Cas3llo/01.10.2017/Informá3caIndustrial
Plan3llas• Según va aumentando la complejidad de nuestros
programasysobretodo,delosproblemasalosquenosenfrentamos,descubrimosquetenemosquerepe3runayotravezlasmismasestructuras.
• Por ejemplo, a menudo tendremos que implementararraysdinámicosparadiferentes3posdeobjetos,olistasdinámicas,pilas,colas,árboles,etc.
• El código es similar siempre, pero estamos obligados arescribirciertasfuncionesquedependendel3poodelaclasedelobjetoquesealmacena.
• Las plan3llas (templates) nos permiten parametrizarestasclasesparaadaptarlasacualquier3podedato.
M.Abderrahim,A.Castro,J.C.Cas3llo/01.10.2017/Informá3caIndustrial
Sintaxis • C++permitecrearplan3llasdefuncionesyplan3llasde
clases.• La sintaxis para declarar una plan3lla de función es
parecidaaladecualquierotrafunción,peroseañadealprincipiounapresentacióndelaclasequeseusarácomoreferenciaenlaplan3lla:
template<class|typename<id>[,...]><3po_retorno><iden3ficador>(<lista_de_parámetros>){//Declaracióndefunción};
template<typenameT>voidf(Ts){std::cout<<s<<“\n”;}
M.Abderrahim,A.Castro,J.C.Cas3llo/01.10.2017/Informá3caIndustrial
Sintaxis • Lasintaxisparadeclararunaplan3lladeclaseesparecida
a la de cualquier otra clase, pero se añade al principiouna presentación de la clase que se usará comoreferenciaenlaplan3lla:
template<class|typename<id>[,...]>class<iden3ficador_de_plan3lla>{//Declaracióndefunciones//ydatosmiembrodelaplan3lla};
template<classT1>classTabla{public:Tabla();~Tabla();...};
M.Abderrahim,A.Castro,J.C.Cas3llo/01.10.2017/Informá3caIndustrial
Sintaxis • Del mismo modo, cuando tengamos que definir una
función miembro fuera de la declaración de la clase,tendremos que incluir la parte del template y comonombredelaclaseincluirlaplan/llaantesdeloperadordeámbito(::).Porejemplo:
template<classT1>Tabla<T1>::Tabla(){//Definicióndelconstructor}
M.Abderrahim,A.Castro,J.C.Cas3llo/01.10.2017/Informá3caIndustrial
Plan3llasdeFunciones • Un ejemplo de plan3lla de función puede ser esta que
devuelveelvalormáximo:
• Lapodemosu3lizarcondatosdediferentes3pos:
template<classT>Tmax(Tx,Ty){return(x>y)?x:y;};
inta=3,b=5,c;charf='a',g='k',h;c=max(a,b);h=max(f,g);
M.Abderrahim,A.Castro,J.C.Cas3llo/01.10.2017/Informá3caIndustrial
Plan3llasparaTablas • Ahora estamos en disposición de crear una plan3lla a
par3rdelaclaseTablaquehemosdefinidoantes.
• Esta vez podremosusar esa plan3lla para definir Tablasdecualquier3podeobjeto.
M.Abderrahim,A.Castro,J.C.Cas3llo/01.10.2017/Informá3caIndustrial
Plan3llasparaTablas template<classT>classTabla{public:Tabla(intnElem);~Tabla();T&operator[](intindice){returnpT[indice];}private:T*pT;intnElementos;};//Definición:template<classT>Tabla<T>::Tabla(intnElem):nElementos(nElem){pT=newT[nElementos];}template<classT>Tabla<T>::~Tabla(){delete[]pT;}
M.Abderrahim,A.Castro,J.C.Cas3llo/01.10.2017/Informá3caIndustrial
Plan3llasparaTablas • Para declarar Tablas del 3po que queramos. La sintaxis
es:
• Lapodemosu3lizarcondatosdediferentes3pos:
<iden3ficador_de_plan3lla><<3po/clase>><iden3ficador/constructor>;
Tabla<int>TablaInt(32);//Tablade32enterosTabla<float>TablaFloat(12);//Tablade12floatsTabla<bool>TablaBool(10);//Tablade10bools
M.Abderrahim,A.Castro,J.C.Cas3llo/01.10.2017/Informá3caIndustrial
// Tabla.h: definición de la plantilla tabla: #ifndef T_TABLA #define T_TABLA template <class T> class Tabla { public: Tabla(int nElem); ~Tabla(); T& operator[](int indice) { return pT[indice]; } int NElementos() const { return nElementos; } private: T *pT; int nElementos; };
// Definición: template <class T> Tabla<T>::Tabla(int nElem) : nElementos(nElem) { pT = new T[nElementos]; } template <class T> Tabla<T>::~Tabla() { delete[] pT; } #endif
Ejemplodeusodelaplan3llaTabla
M.Abderrahim,A.Castro,J.C.Cas3llo/01.10.2017/Informá3caIndustrial
//Tabla.cpp:ejemplodeTabla#include<iostream>#include"Tabla.h”usingnamespacestd;constintnElementos=10;intmain(){Tabla<int>TablaInt(nElementos);Tabla<float>TablaFloat(nElementos);for(inti=0;i<nElementos;i++)TablaInt[i]=nElementos-i;for(inti=0;i<nElementos;i++)TablaFloat[i]=1/(1+i);for(inti=0;i<nElementos;i++){cout<<"TablaInt["<<i<<"]=“<<TablaInt[i]<<endl;cout<<"TablaFloat["<<i<<"]=“<<TablaFloat[i]<<endl;}return0;}
Ejemplodeusodelaplan3llaTabla
M.Abderrahim,A.Castro,J.C.Cas3llo/01.10.2017/Informá3caIndustrial
• Es posible crear funciones que admitan parámetros queseanunaplan3lla.Haydosmodosdepasarlasplan3llas:sepuedepasar• unainstanciadeterminadadelaplan/llao• laplan/llagenérica.
• Si declaramos y definimos una función que tome comoparámetro una instancia concreta de una plan3lla, esafunción no estará́ disponible para el resto de las posiblesinstancias. Por ejemplo, si creamos una función para unatabla de enteros, esa función no podrá aplicarse a unatabladecaracteres.
Funcionesconplan3llascomoparámetros
M.Abderrahim,A.Castro,J.C.Cas3llo/01.10.2017/Informá3caIndustrial
// F_Tabla.cpp:// ejemplo de función de plantilla para // Tabla para enteros:
#include <iostream>#include "Tabla.h"using namespace std;const int nElementos = 5;
void Incrementa(Tabla<int> &t); // (1)
int main() { Tabla<int> TablaInt(nElementos); Tabla<char> TablaChar(nElementos); for(int i = 0; i < nElementos; i++) { TablaInt[i] = 0; TablaChar[i] = 0; }
Incrementa(TablaInt); // (2) // Incrementa(TablaChar); // <-- Ilegal
for(int i = 0; i < nElementos; i++) cout << "TablaInt[" << i << "] = ” << TablaInt[i] << endl; return 0;}
void Incrementa(Tabla<int> &t) { // (3) for(int i = 0; i < t.NElementos(); i++) t[i]++; }
Ejemplodefuncionesconplan3llascomoparámetros
M.Abderrahim,A.Castro,J.C.Cas3llo/01.10.2017/Informá3caIndustrial
• Si declaramos y definimos una función quetomecomoparámetrounainstanciacualquiera,tendremos que crear una función de plan3lla.Paraello,comoyahemosvisto,hayqueañadira la declaración de la función la partetemplate<classT>.
Pasarunaplan3llagenérica
M.Abderrahim,A.Castro,J.C.Cas3llo/01.10.2017/Informá3caIndustrial
// F_Tabla2.cpp:// ejemplo de función de plantilla // Tabla genérica:
#include <iostream> #include <cstdio> #include "Tabla.h" #include "CCadena.h”
using namespace std;
const int nElementos = 5;
template<class T>void Mostrar(Tabla<T> &t); // (1)
int main() { Tabla<int> TablaInt(nElementos); Tabla<Cadena> TablaCadena(nElementos); // Cadena es una clase
definida por el usuario char cad[20];
for(int i = 0; i < nElementos; i++) TablaInt[i] = i;
for(int i = 0; i < nElementos; i++) { sprintf(cad, "Cad no.: %2d", i); TablaCadena[i] = cad; } Mostrar(TablaInt); // (2) Mostrar(TablaCadena); // (3) return 0;}
template<class T>void Mostrar(Tabla<T> &t) { // (4) for(int i = 0; i < t.NElementos(); i++) cout << t[i] << endl;}
Ejemplodeplan3llagenérica
M.Abderrahim,A.Castro,J.C.Cas3llo/01.10.2017/Informá3caIndustrial
• Igual que con las clases normales, es posible declarar datosmiembroo funcionesestá3casdentrodeunaplan3lla.Enestecasoexis3ráunacopiadecadaunodeellosparacada3podeinstanciaquesecree.
• Por ejemplo, si añadimos un miembro sta3c en nuestradeclaración de "Tabla", se creará una única instancia demiembroestá3copara todas las instanciasdeTabla<int>, otroparalasinstanciasdeTabla<Cadena>,etc.
• Hayunpuntoimportanteatenerencuenta.Tantositrabajamosconclasesnormales comoconplan3llas,debemos reservarunespacio {sico para las variables está3cas, de otro modo elcompiladornolesasignarámemoria,yseproduciráunerrorsiintentamosaccederaesosmiembros.
Miembrosestá3cos:datosyfunciones
M.Abderrahim,A.Castro,J.C.Cas3llo/01.10.2017/Informá3caIndustrial
//Esposibleleer/escribirmiembrosestá3cos//sininstanciarobjetosdelaclasetemplate<classT>classMyClass{//sta3cmemberdeclara3onsta3cintcount;...};//sta3cmemberdefini3ontemplate<classT>intMyClass<T>::count=0;
Ejemplodemiembrosestá3cos
M.Abderrahim,A.Castro,J.C.Cas3llo/01.10.2017/Informá3caIndustrial
//Ficherodecabecera:prueba.h#ifndefT_PRUEBA#defineT_PRUEBAtemplate<classT>classEjemplo{public:Ejemplo(Tobj){objeto=obj;esta3co++;}~Ejemplo(){esta3co--;}sta/cintLeeEsta3co(){returnesta3co;}
private:sta/cintesta3co;//(1)Tobjeto;};#endif
Ejemplodemiembrosestá3cos
M.Abderrahim,A.Castro,J.C.Cas3llo/01.10.2017/Informá3caIndustrial
//Ficherodeprueba:prueba.cpp#include<iostream>#include"prueba.h”usingnamespacestd;//Estoesnecesarioparaqueexistaunainstanciadelavariable:template<classT>intEjemplo<T>::esta3co;voidmain(){Ejemplo<int>EjemploInt1(10);cout<<"Ejemplo<int>:"<<EjemploInt1.LeeEsta3co()<<endl;Ejemplo<char>EjemploChar1('g');cout<<"Ejemplo<char>:”<<EjemploChar1.LeeEsta3co()<<endl;
Ejemplo<int>EjemploInt2(20);cout<<"Ejemplo<int>:”<<EjemploInt2.LeeEsta3co()<<endl;//Ejemplo<float>EjemploFloat1(32.12);cout<<"Ejemplo<float>:”<<Ejemplo<float>::LeeEsta3co()<<endl;Ejemplo<int>EjemploInt3(30);cout<<"Ejemplo<int>:”<<EjemploInt3.LeeEsta3co()<<endl;}
Ejemplodemiembrosestá3cos
M.Abderrahim,A.Castro,J.C.Cas3llo/01.10.2017/Informá3caIndustrial
BibliotecadePlan3llas
• ElANSIdeC++defineciertasbibliotecasdeplan3llasconocidascomo STL (Standard Template Library), que con3ene muchasdefiniciones de plan3llas para crear estructuras como listas,colas,pilas,árboles,tablasHASH,mapas,etc.
• Está fueradelobje3vodeestecursoexplicarestasbibliotecas,peroesconvenientesaberqueexistenyqueporsupuesto,sesuelenincluirconloscompiladoresdeC++.
• Aunquesetratadebibliotecasestándar,lociertoesqueexistenvarias implementaciones, que, al menos en teoría, deberíancoincidirencuantoasintaxisycomportamiento.
• h|p://www.cplusplus.com/reference/stl/
M.Abderrahim,A.Castro,J.C.Cas3llo/01.10.2017/Informá3caIndustrial
BibliotecadePlan3llas:Ventajas
• Disponibleportodosloscompiladoresyplataformas.• El uso de una librería de componentes reu3lizables incrementa la
produc3vidad ya que los programadores no 3enen que escribir suspropiosalgoritmos.
• Libre de errores: reduce el 3empo de desarrollo, incrementa larobustezdelaaplicación.
• Lasaplicacionespuedenescribirserápidamenteyaqueseconstruyenapar3rdealgoritmos.
• Se incrementa la legibilidad del código, lo que hará que éste seamuchomásfácildemantener.
• Proporciona su propia ges3ón de memoria. El almacenamiento dememoria es automá3co y portá3l, así el programador ignoraráproblemastalescomolaslimitacionesdelmodelodememoriadelPC.
M.Abderrahim,A.Castro,J.C.Cas3llo/01.10.2017/Informá3caIndustrial
BibliotecadePlan3llas
• Contenedoresdesecuencias:• array:Arrayclass(classtemplate)• vector:Vector(classtemplate)• deque:Doubleendedqueue(classtemplate)• forward_list:Forwardlist(classtemplate)• list:List(classtemplate)
• Contenedoresdesecuenciaespeciales• stack:LIFOstack(classtemplate)• queue:FIFOqueue(classtemplate)• priority_queue:Priorityqueue(classtemplate)
• Contenedoresasocia3vos :• set:Set(classtemplate)• mul3set:Mul3ple-keyset(classtemplate)• map:Map(classtemplate)• mul3map:Mul3ple-keymap(classtemplate)
M.Abderrahim,A.Castro,J.C.Cas3llo/01.10.2017/Informá3caIndustrial
EjemplodeVector #include<vector>#include<iostream>intmain(){
std::vector<int>mi_vector;mi_vector.push_back(4);mi_vector.push_back(2);mi_vector.push_back(5);//pararecorrerunvectorpodemosu3lizarlositeradoresolosíndicesfor(std::size_ti=0;i<mi_vector.size();++i)std::cout<<mi_vector[i]<<'’;std::cout<<std::endl;std::vector<int>mi_vector(5,69);//creaelvector69,69,69,69,69v[0]=5;v[1]=3;v[2]=7;v[3]=4;v[4]=8;return0;
}
M.Abderrahim,A.Castro,J.C.Cas3llo/01.10.2017/Informá3caIndustrial
BibliotecadePlan3llas:Iteradores
• Un iterador es un objeto que apunta a un elemento dentro de unrango(porejeplounarrayouncontenedor)yqueescapazdeiterarentre los elementos del rango usando un conjunto de operadores(incremento(++)yreferencia(*)).
• La formamás sencilla de iterador es un puntero: Puede apuntar aelementos de un array y desplazarse por ellos usando el operadorincremento(++).
• En el caso de los contenedores, es necesario usar otro 3po deiteradores. Por ejemplo, el contenedor vector 3ene un iteradorespecíficodiseñadoparaop3mizarelaccesoasuselementos.
• container::iteratorprovidesaread/writeiterator• container::const_iteratorprovidesaread-onlyiterator
M.Abderrahim,A.Castro,J.C.Cas3llo/01.10.2017/Informá3caIndustrial
Ejemplodeiterador #include<iostream>#include<vector>intmain(){usingnamespacestd;vector<int>vect;for(intnCount=0;nCount<6;nCount++)vect.push_back(nCount);vector<int>::const_iteratorit;//declareanread-onlyiteratorit=vect.begin();//assignittothestartofthevectorwhile(it!=vect.end())//whileithasn'treachtheend{cout<<*it<<"";//printthevalueoftheelementitpointstoit++;//anditeratetothenextelement}cout<<endl;}
M.Abderrahim,A.Castro,J.C.Cas3llo/01.10.2017/Informá3caIndustrial