informÁtica industrial -...

52
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 Programación Orientada a Objetos y el lenguaje C++ INFORMÁTICA INDUSTRIAL

Upload: hoangnguyet

Post on 20-Sep-2018

219 views

Category:

Documents


0 download

TRANSCRIPT

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

M.Abderrahim,A.Castro,J.C.Cas3lloDepartamentodeIngenieríadeSistemasyAutomá3ca

ProgramaciónOrientadaaObjetosyellenguajeC++

INFORMÁTICAINDUSTRIAL

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

Repasodeconceptos

•  POO:objetosquesecomunicanentresi•  Objeto=datos+métodos•  Clase:descripcióndeunconjuntodeobjetos•  Caracterís3casdelaPOO•  Abstracción:generalización•  Encapsulamiento:“cajasnegras”•  Herencia:“…esun3pode…”•  Polimorfismo

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

•  POO:objetosquesecomunicanentresi•  Objeto=datos+métodos•  Clase:descripcióndeunconjuntodeobjetos•  Caracterís3casdelaPOO•  Abstracción:generalización•  Encapsulamiento:“cajasnegras”•  Herencia:“…esun3pode…”•  Polimorfismo

Repasodeconceptos

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

ConceptosdePOO:Ejemplo1

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

•  ClaseRectangulo•  Atributos:altura(real),anchura(real)•  Métodos:

•  voiddibujar()•  voidrotar(real)•  Constructores:

•  Rectangulo(real,real)•  Rectangulo(real)

•  Instanciación:•  rect1=Rectangulo(3.3,5.6)

ConceptosdePOO:Ejemplo2

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

•  C++fuediseñadoapar3rdeC,yconpocasexcepciones,losprogramasCsonprogramasC++.

•  EldiseñodeCsebasóenexpresividadyeficiencia.•  El diseño de C++ hace énfasis en la estructuración (sin

perdereficiencia):•  Orientaciónaobjetos.•  Programacióngenérica.•  Abstraccióndedatos.•  Estructuración y modularización medianteespaciosdenombres.

•  Manejodeexcepciones(errores).

LenguajeC++

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

•  B.Stroustrup(AT&TBellLaboratories),principiosdelos80.

•  Herederode“C”,queesherederode“B”(Richards1980)ydeSimula67.•  C,especificaciónformal1997(RitchieyKernighan).

•  EstandarizaciónANSI.Terceraediciónde“TheC++ProgrammingLanguage”(1997).

Historia

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

•  HolaMundo

#include<iostream>usingnamespacestd;//miprimerprogramaC++intmain(){ cout<<"HolaMundo!"<<2014<<"\n";}

PrimerProgramaenC++

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

•  Direc3vainclude:2variantes#include<cabecera>#include“ficherofuente”

•  LasegundaformanovaríaconellenguajeC.•  LaprimeraformaesdiferenteaC.Unacabecerano3enequecorresponder

necesariamenteconunfichero,aunqueeslohabitual.#include<stdio.h>//C#include<iostream>//C++

•  C++incluyelalibreríaestándardeC#include<cstdio>

•  Sesiguepudiendousar#include<iostream.h>,peronoserecomienda.

Cabeceras

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

•  iostream:Bibliotecaestándardeentrada/salida.•  cout:Canaldesalidaestándar.•  cin:Canaldeentradaestándar.•  std:Espaciodenombresdondesedeclarantodoslosiden3ficadoresdelabibliotecaestándar.•  Parausaruniden3ficadorcomocoutsedebeescribirstd::coutencadaocurrenciaobienescribirunasolavezusingnamespacestd;alprincipiodelprograma.

•  Uso:cout<<expresión;cin>>variable;//¡¡Ojo!!Sin&.

Entrada/Salida

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

TiposdeDatosenC++

•  Tipospordefecto(int,char,etc)•  Apar3rdelosanteriores,sepuedenconstruir:•  3pospunteros(ej.int*)•  3posarray(ej.char[])•  3posreferencia(ej.double&)•  EstructurasyClases.

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

Ámbito

•  Unadeclaraciónintroduceunnombredentrodeunámbito,ysólosepuedeusarenesteámbito.

•  Operadordeaccesooresolucióndeámbito::

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

Ejemplo

•  ambito.cpp

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

•  Unespaciodenombresesunámbitoconnombre.•  Ayudaaevitarlascolisionesdenombres.•  Seusaladirec3vausingparaañadirunespaciodenombresala

listadeámbitosqueseestáusando.usingnamespacestd;

•  Relaciónentreespaciosdenombresycabeceras:#include<iostream.h>

equivalea(recomendable):#include<iostream>usingnamespacestd;

•  Ejemplo:hxp://www.cplusplus.com/doc/oldtutorial/namespaces/

Espaciosdenombres

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

Referencias

•  Unareferenciaesunnombrealterna3voparaunobjeto.

•  Suusoprincipalestáenelpasodeparámetrosyvaloresderetornoafunciones.

•  Notación:X&esunareferenciaal3poX.

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

Referencias

•  Debeninicializarseensudeclaración:

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

•  Losoperadoresqueseaplicanaunareferenciaafectanenrealidadalobjetoreferenciado.

•  Similaraunpuntero(constante)quesederreferenciaautomá3camentecadavezqueseusa.

Referencias

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

•  Unaparámetropasadoporreferenciapermitecambiarlo.

•  Lasemán3caeslamismaqueenlainicialización.Enelejemplo,aesotronombreparax.

•  Hacemáseficienteelpasodeparámetrosyaquenosecopiaelvalordelparámetro.

Referencias

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

•  Unareferenciadevueltaporunafunciónsepuedemodificar.

•  Muyú3lparadefinirysobrecargaroperadores(ej.:cout<<“a”<<3;)yparaencadenarllamadas:fecha1.add_day(1).add_year(2);

Referencias

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

EstructurasyClases

•  Supongamosquesequieredefinirun3podedatoFechadelasiguienteforma:

structFecha{intd,m,a;

};voidinic(Fecha*f,intd1,intm1,inta1){

f->d=d1;f->m=m1;f->a=a1;

}

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

EstructurasyClases

•  SupongamosquesequieredefinirunTADFecha,ahoraconreferencias:

structFecha{intd,m,a;

};Fecha&inic(Fecha&f,int,int,int);Fecha&sumarDia(Fecha&f,int);Fecha&sumarMes(Fecha&f,int);Fecha&sumarAno(Fecha&f,int);

Fecha&sumarAno(Fecha&f,inta){

f.a+=a;//esf.a=f.a+areturnf;

}

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

EstructurasyClases

•  EnC++,sepuede(yesmásintui3vo)declararlasfuncionesdemanipulacióndentrodelaestructura:

structFecha{intd,m,a;Fecha&inic(intd1,intm1,inta1);Fecha&sumarDia(intd1);Fecha&sumarMes(intm1);Fecha&sumarAño(inta1);

};Fecha&Fecha::inic(intd1,intm1,inta1){

d=d1;m=m1;a=a1;return*this;//Operadordeámbito

}Fecha&Fecha::sumarDia(intd1){

d+=d1;return*this;

}

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

•  Lasfuncionesdeclaradasdentrodeclases(lasestructurassonun3podeclase)sellamanfuncionesmiembro,ysellamandelasiguienteforma:

Fechami_cumple,hoy;Fecha*pfecha;hoy.inic(4,10,2010);mi_cumple.inic(5,1,1984);mi_cumple.sumarDia(1);//Equivalentemi_cumple.inic(5,1,1984).sumarDia(1);Fechamanana=hoy;manana.sumarDia(1);pfecha->sumarMes(3);

EstructurasyClases

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

•  Lasclasessonmuyparecidasalasestructuras

•  Unaestructuraesunaclaseenlaquelosmiembrossonpúblicospordefecto.Enunaclaselosmiembrossonprivadospordefecto.

•  Lasestructurasnopermitenencapsulamientoniherencia

classcomplex{

doublereal;doubleimag;

voidestableceValor(floatre,floatim);floatobtenModulo(void);voidimprime();

};

EstructurasyClases

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

EstructurasyClases

●  ¿Cómo se declaran miembros públicos y privados de unaestructura/clase?

classcomplex{

doublereal;doubleimag;

voidestableceValor(floatre,floatim);floatobtenModulo(void);voidimprime();

};

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

Encapsulamiento

classlistaNumeros{private:intnum;intlista[100];public:intagregarNumero(intval);intextraerNumero(intind);intnumeroNumeros(void);listaNumeros(void);};

voidmain(){listaNumerosmilista;inti,val=1;while(val!=0){cout<<"Introduzcaunnumero(finalizarcon0):";cin>>val;if(val!=0)val=milista.agregarNumero(val);}cout<<"\nLalistadenúmeroseslasiguiente:\n";for(i=0;i<milista.numeroNumeros();i++)cout<<milista.extraerNumero(i)<<"";cout<<"\n*********FINDELPROGRAMA**********\n";}

●  Lograrquecadaobjetosecomportedeformaautónomayloquepaseensuinteriorseainvisibleparaelrestodeobjetos

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

•  Miembrospúblicos,privadosyprotegidos.•  Pordefecto:privados

•  Interfazpúblicadeunaclase:miembrospúblicos(datosymétodos).•  Sepuedeninvocardesdefueradelaclase.

•  Ejemplo(claseRectangulo)•  Datos:

•  privadoaltura(real)•  privadoancho(real)

•  Métodos:•  públicovoiddibujar()•  públicovoidgirar(real)

•  Constructores:•  públicoRectangulo(real,real)•  públicoRectangulo(real)

Encapsulamiento

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

Encapsulamiento

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

CreaciónyDestruccióndeObjetos

•  Equivalenciadeconceptosconprogramaciónclásica:•  Tipo⇔Clase•  Dato⇔Objeto•  Variable:existeenambos3posdeprogramación.

•  Creación(usodelconstructor):•  Ejemplo:

•  rect1=Rectangulo(1,2),rect2=Rectangulo(3.5)•  Destrucción(usodeldestructor)•  Explícita(heap)oautomá3ca(stack)(C++).•  Automá3ca(JavaoPython,Garbagecollec5on).

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

•  Constructores•  Funcióninicializadora•  Esunafunciónquenodevuelvenadayquesellamaigualquelaclase.

•  Nosehereda.•  Existentres3posfundamentales(sobrecarga):

•  Constructorvacio•  Constructorparametrizado

•  Sirveparaasignarunvaloralosatributosenlacreación.•  Constructordecopia

•  Sirveparacrearunobjetoqueseacopiadeotro.•  Destructores•  Funcióndeeliminación

CreaciónyDestruccióndeObjetos

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

Constructores

•  El uso de métodos como inic() es pocoeleganteypropensoaerrores.

•  Constructor: un método con el propósito deinicializar un objeto. Tiene el nombre de laclase

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

Constructores

classFecha{intd,m,a;

public:Fecha(intdd,intmm,intaa);

};Fecha::Fecha(intdd,intmm,intaa){

d=dd;m=mm;a=aa;

}intmain(){

Fechan=Fecha(10,2,1986);Fecham(10,2,1986);Fecha*k=newFecha(10,9,2003);…………..deletek;

}

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

CopiadeObjetos

•  Pordefecto,losobjetossepuedencopiar.•  Se puede inicializar un objeto con la copiadeotro.

•  Pordefectosecopiacadaatributo: Fechahoy=m;

•  Sinoesloquesequiere,sehadedefinirunconstructorcopia.

•  También se llama en argumentos demétodosyvaloresderetorno

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

classFecha{intd,m,a;

public:Fecha(intdd,intmm,intaa);Fecha(constFecha&fe);

};Fecha::Fecha(constFecha&fe){

d=fe.d+1;// se puede introducir modificaciones al // copiar elementos

m=fe.m;a=fe.a;

}intmain(){

Fecham(10,2,1986);Fechahoy=m;// También: Fecha m(hoy);

}

CopiadeObjetos

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

•  ¿Cómopodemosevitarqueunobjetosepuedacopiar?Esdecir,evitarexpresionesdel3po:

Fechahoy=m;

¿Solución?

CopiadeObjetos

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

Solución

classFecha{intd,m,a;

public:Fecha(intdd,intmm,intaa);

private:Fecha(constFecha&fe);

};Fecha::Fecha(constFecha&fe){

d=fe.d+1;// se puede introducir modificaciones al copiar // elementos

m=fe.m;a=fe.a;

}intmain(){

Fecham(10,2,1986);Fechahoy=m;//error no se puede acceder

//al miembro privado}

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

Múl3plesconstructores

classFecha{intd,m,a;

public:Fecha(intdd,intmm=1,intaa=2014):d(dd),m(mm),a(aa){}Fecha():d(0),m(0),a(0){}Fecha(floatdd);

};

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

ConstructoresParámetrospordefecto,inicialización,conversionesimplícitas

#include<iostream>usingnamespacestd;

classFecha{intd,m,a;

public:Fecha(intdd,intmm=1,intaa=2014):d(dd),m(mm),a(aa){}Fecha(intdd,intmm=1,intaa=a);//¿válido?

};intmain(){

Fechan=2;//EquivalenteaFechan(2);Fechap(5,6);Fecham(3);Fechaq=Fecha(2);

}

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

Destructores

•  Sellamancuandounobjetosedestruye,ysirvenporejemploparaliberarmemoriaquesehayareservadodurantelavidadelobjeto.

•  Normalmenteelcompiladorlosllamaimplícitamente.

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

#include<iostream>usingnamespacestd;classBloque{inttamano_b;char*b;public:Bloque(inttam):tamano_b(tam){b=newchar[tam];cout<<"constructor1"<<endl;}Bloque(constBloque&bl){b=newchar[tamano_b=bl.tamano_b];cout<<"constructor2"<<endl;}~Bloque(){//destructordelete[]b;cout<<"Dstructor"<<endl;}};

voidmain(){Bloque*b=newBloque(10);Bloquec=*b;deleteb;cout<<"Adios!"<<endl;}

Destructores

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

Ejecucióndemétodosmiembro

•  Un método es una definición de unafunciónpertenecienteaunaclase.•  Sedicequeunmétodoseejecutacuandoelobjeto recibe un mensaje de ejecución delmétodo.

•  Puedeaccederaotrosmiembros (públicosoprivados)delaclase.

•  Ejemplo.Objetorect1(Rectangulo):

Rectangulorect1=Rectangulo(3.5,2.9);rect1.girar(30.5);

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

ClasesInvocacióndeMétodos

•  objeto.metodo(args),siobjetonoesunpuntero:Fechaf(1,10,1492);

f.sumarAño(515);

•  p_objeto->metodo(args),sip_objetoesunpuntero:Fecha*d=newFecha(1,10,1492);d->sumarAño(515);

•  objetooperadorargumentoFechad(1,10,1492);cout<<“unafecha“<<d+1<<endl;

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

OrganizacióndeFicheros

•  DeclaracióndeunaclaseXen“X.h”.•  Definicióndesusfuncionesmiembroen“X.cpp”.

•  Regladedefiniciónunasolavez:inclusióncondicionaldecódigoparaevitarerrores.

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

Ejemplo:ClaseDado

/*Dado.h*Createdon:17/05/2010*Author:wladimir*/#ifndefDADO_H_#defineDADO_H_classDado{public:

voidlanzar();intgetValorCara();

private:intvalorCara;

};#endif/*DADO_H_*/

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

Ejemplo:DefiniciónmétodosmiembrosdelaClaseDado

/*Dados.cpp*Createdon:17/05/2010*Author:wladimir*/#include“Dado.h“#include<stdlib.h>voidDado::lanzar(){

valorCara=((rand()%6)+1);}intDado::getValorCara(){

returnvalorCara;}

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

Ejemplo:ClaseJuegoDados

/*JuegoDados.h*Createdon:17/05/2010*Author:wladimir*/#include“Dado.h"

#ifndefJUEGODADOS_H_#defineJUEGODADOS_H_

classJuegoDados{public:

booljugar();private:

Dadodado1;Dadodado2;

};

#endif/*JUEGODADOS_H_*/

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

Ejemplo:DefiniciónmétodosmiembrosdelaClaseJuegoDados

/*JuegoDados.cpp*Createdon:17/05/2010*Author:wladimir*/#include“JuegoDados.h"#include“Dado.h"

boolJuegoDados::jugar(){dado1.lanzar();dado2.lanzar();return((dado1.getValorCara()+dado2.getValorCara())==7?true:false);}

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

Ejemplo:ProgramadePrueba

/*JugarDado.cpp*/#include<iostream>#include<stdio.h>#include"JuegoDados.h”usingnamespacestd;intmain(){boolganarPartida,continuarJuego=true;chartecla;JuegoDadoselJuego;cout<<"\nJuegodedados,lanzardosdadosysumar7paraganar\n";while(continuarJuego){cout<<"\nPulsarcualquierteclaparalanzardados\n";cin>>tecla;ganarPartida=elJuego.jugar();if(ganarPartida)cout<<"Haganado.\n";elsecout<<"Haperdido.\n";cout<<"\nDeseajugarotravez,pulseC\n";cin>>tecla;continuarJuego=(tecla=='c')||(tecla=='C')?true:false;}cout<<"Seterminoeljuegodedados.Unsaludo\n”}

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

Funcionesinline

•  Op3mizacióndelaeficienciaacostadeltamañodelprogramaejecutable.

•  Si se puede se sus3tuyen directamente en elcódigo;noserealizalallamadaalafunción.

•  Los métodos definidos dentro de la definicióndeclasesetomancomoinline.

•  Estosedebereservaramétodospequeñosqueseusanfrecuentemente.

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

Ejemplo

inline int f(int x) { return x * (x+1); }

int main () { int x = 2;int y = f(x);int z = f(y);

}

int main () { int x = 2;int y = x*(x+1); // Pero no es una simple sustitución de texto int z = y*(y+1);

}

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

•  Seaconsejasuusoenlugarde#define•  Ventajas:– nodanlugaraerroressintác3cos

ej:#definedoble(a)a+a

– Hacencomprobaciónde3pos

Funcionesinline

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