informÁtica industrial - uc3m

Post on 17-Nov-2021

5 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

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

top related