informÁtica industrial - uc3m

27
M. Abderrahim, A. Castro, J. C. Cas3llo / 01.10.2017 / Informá3ca Industrial M. Abderrahim, A. Castro, J. C. Cas3llo Departamento de Ingeniería de Sistemas y Automá3ca Plan3llas en C++. INFORMÁTICA INDUSTRIAL

Upload: others

Post on 17-Nov-2021

4 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 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

Page 2: INFORMÁTICA INDUSTRIAL - UC3M

M.Abderrahim,A.Castro,J.C.Cas3llo/01.10.2017/Informá3caIndustrial

AGENDA

•  Plan3llas•  Sintaxis•  Plan3llasdeFunciones•  FuncionesconPlan3llascomoParámetros•  PasarunaPlan3llaGenérica•  MiembrosEstá3cos:datosyfunciones•  BibliotecadePlan3llas

Page 3: INFORMÁTICA INDUSTRIAL - UC3M

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.

Page 4: INFORMÁTICA INDUSTRIAL - UC3M

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”;}

Page 5: INFORMÁTICA INDUSTRIAL - UC3M

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();...};

Page 6: INFORMÁTICA INDUSTRIAL - UC3M

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}

Page 7: INFORMÁTICA INDUSTRIAL - UC3M

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);

Page 8: INFORMÁTICA INDUSTRIAL - UC3M

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.

Page 9: INFORMÁTICA INDUSTRIAL - UC3M

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;}

Page 10: INFORMÁTICA INDUSTRIAL - UC3M

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

Page 11: INFORMÁTICA INDUSTRIAL - UC3M

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

Page 12: INFORMÁTICA INDUSTRIAL - UC3M

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

Page 13: INFORMÁTICA INDUSTRIAL - UC3M

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

Page 14: INFORMÁTICA INDUSTRIAL - UC3M

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

Page 15: INFORMÁTICA INDUSTRIAL - UC3M

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

Page 16: INFORMÁTICA INDUSTRIAL - UC3M

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

Page 17: INFORMÁTICA INDUSTRIAL - UC3M

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

Page 18: INFORMÁTICA INDUSTRIAL - UC3M

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

Page 19: INFORMÁTICA INDUSTRIAL - UC3M

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

Page 20: INFORMÁTICA INDUSTRIAL - UC3M

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

Page 21: INFORMÁTICA INDUSTRIAL - UC3M

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/

Page 22: INFORMÁTICA INDUSTRIAL - UC3M

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.

Page 23: INFORMÁTICA INDUSTRIAL - UC3M

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)

Page 24: INFORMÁTICA INDUSTRIAL - UC3M

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;

}

Page 25: INFORMÁTICA INDUSTRIAL - UC3M

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

Page 26: INFORMÁTICA INDUSTRIAL - UC3M

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;}

Page 27: INFORMÁTICA INDUSTRIAL - UC3M

M.Abderrahim,A.Castro,J.C.Cas3llo/01.10.2017/Informá3caIndustrial