Beruflich Dokumente
Kultur Dokumente
Apuntesdeclasedelaasignatura
Fundamentosdelaprogramacin
20132014
LuisHernndezYez
LicenciaCreativeCommons: Reconocimiento,NocomercialyCompartirigual.
http://creativecommons.org/licenses/byncsa/3.0/
Estapublicacincontienelosapuntesdeclasedelaasignatura Fundamentosdelaprogramacin,asignaturade1cursodelosgrados queseimpartenenlaFacultaddeInformticadelaUCM. Durantelostresprimeroscursosenlosquesehaimpartidolaasignatura, estematerialhasidosometidoacontinuasrevisionesycontribuciones porpartedelosprofesoresquehanimpartidolosdistintosgrupos delaasignatura.Aunqueeltrabajohaquedadobastanteconsolidado, estoysegurodequetodavacontienemuchaserratas.Siencuentrasalguna, nodudes,porfavor,enhacrmelosaberyconseguiras quelasiguienteversinestmejordepurada. Quieroagradeceratodoslosprofesoresquehanimpartidolaasignatura sucontribucineneldesarrollodelmaterial,destacandoespecialmente lalabordePabloMorenoGeryCarlosCervignRckauer. LuisHernndezYez ProfesordelaFacultaddeInformticadelaUCM
Fundamentosdelaprogramacin
TC
Grado en Ingeniera Informtica Grado en Ingeniera del Software Grado en Ingeniera de Computadores Luis Hernndez Yez
Tema1 Tema2
LuisHernndezYez
Computadorasyprogramacin TiposeinstruccionesI Anexo:Detallestcnicosdelostipos Tema3 TiposeinstruccionesII AnexoI:Eloperadorternario? AnexoII:Ejemplosdesecuencias Tema4 Laabstraccinprocedimental Anexo:Mssobresubprogramas Tema5 Tiposdedatosestructurados Anexo:CadenasalestilodeC Tema6 Recorridoybsquedaenarrays Tema7 Algoritmosdeordenacin Anexo:Mssobreordenacin Tema8 Programacinmodular Anexo:Ejemplodemodularizacin Tema9 Punterosymemoriadinmica Anexo:Punterosymemoriadinmica Tema10 Introduccinalarecursin Apndice:Archivosbinarios
Fundamentosdelaprogramacin
1 48 212 225 398 402 425 496 512 580 588 649 742 755 832 847 938 981 1049
Informtica,computadorasyprogramacin Lenguajemquinayensamblador Lenguajesdeprogramacindealtonivel Unpocodehistoria ProgramacineIngenieradelSoftware EllenguajedeprogramacinC++ Sintaxisdeloslenguajesdeprogramacin UnprimerprogramaenC++ Herramientasdedesarrollo C++:UnmejorC
3 12 15 19 24 27 30 35 39 45
LuisHernndezYez
Fundamentosdelaprogramacin
LuisHernndezYez
Unejemplodeprogramacin ElprimerprogramaenC++ Laslneasdecdigodelprograma Clculosenlosprogramas Variables Expresiones Lecturadedatosdesdeelteclado Resolucindeproblemas Losdatosdelosprogramas Identificadores Tiposdedatos Declaracinyusodevariables Instruccionesdeasignacin Operadores Mssobreexpresiones Constantes Labibliotecacmath Operacionesconcaracteres
50 64 80 86 92 98 108 119 127 129 133 142 147 152 160 167 171 174
Fundamentosdelaprogramacin
LuisHernndezYez
Fundamentosdelaprogramacin
LuisHernndezYez
Tipos,valoresyvariables Conversindetipos Tiposdeclaradosporelusuario Tiposenumerados Entrada/Salida conarchivosdetexto Lecturadearchivosdetexto Escrituraenarchivosdetexto Flujodeejecucin Seleccinsimple Operadoreslgicos Anidamientodeif Condiciones Seleccinmltiple Laescalaifelseif Lainstruccinswitch Repeticin Elbuclewhile
227 232 236 238 248 253 266 272 276 282 286 290 293 295 302 313 316
Elbuclefor Buclesanidados mbitoyvisibilidad Secuencias Recorridodesecuencias Secuenciascalculadas Bsquedaensecuencias Arraysdedatossimples Usodevariablesarrays Recorridodearrays Bsquedaenarrays Arraysnocompletos
321 331 339 349 355 363 370 374 379 382 387 393
Fundamentosdelaprogramacin
Eloperadorternario?
399
Fundamentosdelaprogramacin
Diseodescendente:Tareasysubtareas Subprogramas Subprogramasydatos Parmetros Argumentos Resultadodelafuncin Prototipos Ejemploscompletos Funcionesdeoperador Diseodescendente(unejemplo) Precondicionesypostcondiciones
427 434 441 446 451 467 473 475 477 480 490
LuisHernndezYez
Fundamentosdelaprogramacin
LuisHernndezYez
Fundamentosdelaprogramacin:Laabstraccinprocedimental(Anexo)
LuisHernndezYez
Tiposdedatos Arraysdenuevo Arraysybuclesfor Mssobrearrays Inicializacindearrays Enumeradoscomondices Pasodearraysasubprogramas Implementacindelistas Cadenasdecaracteres Cadenasdecaracteresdetipostring Entrada/salidaconstring Operacionesconstring Estructuras Estructurasdentrodeestructuras Arraysdeestructuras Arraysdentrodeestructuras Listasdelongitudvariable Unejemplocompleto Elbucledo..while
Fundamentosdelaprogramacin
514 517 520 522 523 524 525 528 531 535 539 541 543 549 550 551 552 558 562
LuisHernndezYez
Fundamentosdelaprogramacin
LuisHernndezYez
Recorridodearrays Arrayscompletos Arraysnocompletosconcentinela Arraysnocompletosconcontador Ejemplos Generacindenmerosaleatorios Bsquedasenarrays Arrayscompletos Arraysnocompletosconcentinela Arraysnocompletosconcontador Ejemplo Recorridosybsquedasencadenas Msejemplosdemanejodearrays Arraysmultidimensionales Inicializacindearraysmultidimensionales Recorridodeunarraybidimensional RecorridodeunarrayNdimensional Bsquedaenunarraymultidimensional
590 593 594 595 597 601 604 606 607 608 610 614 617 630 638 641 644 647
Fundamentosdelaprogramacin
Algoritmosdeordenacin Algoritmodeordenacinporinsercin Ordenacindearraysporinsercin Algoritmodeordenacinporinsercin conintercambios Clavesdeordenacin Estabilidaddelaordenacin Complejidadyeficiencia Ordenacionesnaturales Ordenacinporseleccindirecta Mtododelaburbuja Listasordenadas Bsquedasenlistasordenadas Bsquedabinaria
LuisHernndezYez
651 654 665 672 680 688 692 694 701 716 722 729 731
Fundamentosdelaprogramacin
Ordenacinporintercambio Mezcladedoslistasordenadas
744 747
LuisHernndezYez
Fundamentosdelaprogramacin
LuisHernndezYez
Programasmultiarchivoycompilacinseparada Interfazfrenteaimplementacin Usodemdulosdebiblioteca Ejemplo:GestindeunalistaordenadaI Compilacindeprogramasmultiarchivo Elpreprocesador Cadacosaensumdulo Ejemplo:GestindeunalistaordenadaII Elproblemadelasinclusionesmltiples Compilacincondicional Proteccinfrenteainclusionesmltiples Ejemplo:GestindeunalistaordenadaIII Implementacionesalternativas Espaciosdenombres Implementacionesalternativas Calidadyreutilizacindelsoftware
757 762 768 770 778 780 782 784 789 794 795 796 804 808 817 827
Fundamentosdelaprogramacin
Modularizacindeunprograma
833
LuisHernndezYez
Fundamentosdelaprogramacin
LuisHernndezYez
Direccionesdememoriaypunteros Operadoresdepunteros Punterosydireccionesvlidas Punterosnoinicializados Unvalorseguro:NULL Copiaycomparacindepunteros Tipospuntero Punterosaestructuras Punterosaconstantesypunterosconstantes Punterosypasodeparmetros Punterosyarrays Memoriaydatosdelprograma Memoriadinmica Punterosydatosdinmicos Gestindelamemoria Errorescomunes Arraysdedatosdinmicos Arraysdinmicos
849 854 864 866 867 868 873 875 877 879 883 886 891 895 907 911 916 928
Fundamentosdelaprogramacin
LuisHernndezYez
Fundamentosdelaprogramacin
LuisHernndezYez
Conceptoderecursin Algoritmosrecursivos Funcionesrecursivas Diseodefuncionesrecursivas Modelodeejecucin Lapiladelsistema Lapilaylasllamadasafuncin Ejecucindelafuncinfactorial() Tiposderecursin Recursinsimple Recursinmltiple Recursinanidada Recursincruzada Cdigodelsubprogramarecursivo Parmetrosyrecursin Ejemplosdealgoritmosrecursivos Bsquedabinaria TorresdeHanoi Recursinfrenteaiteracin Estructurasdedatosrecursivas
Fundamentosdelaprogramacin
983 986 987 989 990 992 994 1005 1018 1019 1020 1022 1026 1027 1032 1034 1035 1038 1043 1045
Flujos Archivosbinarios Tamaodelosdatos:Eloperadorsizeof() Aperturadearchivosbinarios Lecturadearchivosbinarios(accesosecuencial) Escrituraenarchivosbinarios(accesosecuencial) Accesodirectooaleatorio Ejemplosdeusodearchivosbinarios Ordenacindelosregistrosdelarchivo Bsquedabinaria Insercinenunarchivobinarioordenado Cargadelosregistrodeunarchivoenunatabla Almacenamientodeunatablaenunarchivo
LuisHernndezYez
1051 1054 1056 1059 1061 1066 1070 1078 1079 1085 1088 1092 1093
Fundamentosdelaprogramacin
Fundamentosdelaprogramacin
RB
Grado en Ingeniera Informtica Grado en Ingeniera del Software Grado en Ingeniera de Computadores Luis Hernndez Yez
Programming. Principles and Practice Using C++ B. Stroustrup. Pearson Education, 2009 C++: An Introduction to Computing (2 edicin) J. Adams, S. Leestma, L. Nyhoff. Prentice Hall, 1998 El lenguaje de programacin C++ (Edicin especial) B. Stroustrup. AddisonWesley, 2002 Programacin y resolucin de problemas con C++ N. Dale, C. Weems. McGrawHill Interamericana, 2007 Problem Solving, Abstraction, Design Using C++ (3 edicin) F.L. Friedman, E.B. Koffman. AddisonWesley, 2000. Programacin en C++ para ingenieros F. Xhafa et al. Thomson, 2006
Fundamentosdelaprogramacin
LuisHernndezYez
Del autor del lenguaje C++, la referencia absoluta sobre el lenguaje C++ en la que consultar dudas y detalles tcnicos sobre los elementos del lenguaje
Fundamentosdelaprogramacin
Fundamentosdelaprogramacin
Fundamentosdelaprogramacin
1
Grado en Ingeniera Informtica Grado en Ingeniera del Software Grado en Ingeniera de Computadores Luis Hernndez Yez
Informtica,computadorasyprogramacin Lenguajemquinayensamblador Lenguajesdeprogramacindealtonivel Unpocodehistoria ProgramacineIngenieradelSoftware EllenguajedeprogramacinC++ Sintaxisdeloslenguajesdeprogramacin UnprimerprogramaenC++ Herramientasdedesarrollo C++:UnmejorC
3 12 15 19 24 27 30 35 39 45
LuisHernndezYez
Fundamentosdelaprogramacin:Computadorasyprogramacin
LuisHernndezYez
Fundamentosdelaprogramacin:Computadorasyprogramacin
Pgina 3
Computadora
Mquina electrnica, analgica o digital, dotada de una memoria de gran capacidad y de mtodos de tratamiento de la informacin, capaz de resolver problemas matemticos y lgicos mediante la ejecucin de programas informticos
LuisHernndezYez
Fundamentosdelaprogramacin:Computadorasyprogramacin
Pgina 4
LuisHernndezYez
Fundamentosdelaprogramacin:Computadorasyprogramacin
Pgina 5
Hardware
Componentes que integran la parte material de una computadora
Software
Programas, instrucciones y reglas informticas para ejecutar tareas en una computadora
LuisHernndezYez
Fundamentosdelaprogramacin:Computadorasyprogramacin
Pgina 6
Programar
Indicar a la computadora qu es lo que tiene que hacer
Programa
Secuencia de instrucciones Instrucciones que entiende la computadora Y que persiguen un objetivo: resolver un problema!
LuisHernndezYez
Fundamentosdelaprogramacin:Computadorasyprogramacin
Pgina 7
ParqueJursico
LuisHernndezYez
Trabajo en equipo Mltiples roles... Gestores Analistas Diseadores Programadores Probadores Administradores de sistemas ...
Fundamentosdelaprogramacin:Computadorasyprogramacin
Pgina 8
Esquema general
Memoria temporal
UnidadCentraldeProceso CentralProcessorUnit
C.P.U.
LuisHernndezYez
Almacenamiento permanente
Fundamentosdelaprogramacin:Computadorasyprogramacin
Pgina 9
UnaALUde2bits(Wikipedia)
C.P.U. (Procesador)
A.L.U. Unidad AritmticoLgica
LuisHernndezYez
Memoria
Unidad de Control
Fundamentosdelaprogramacin:Computadorasyprogramacin
Pgina 10
La memoria
Memoria
01 02 03 04
Bus de datos
05 06 07 08 ...
LuisHernndezYez
Direccin
Fundamentosdelaprogramacin:Computadorasyprogramacin
Pgina 11
LuisHernndezYez
Fundamentosdelaprogramacin:Computadorasyprogramacin
Pgina 12
Lenguaje mquina
Cdigos hexadecimales que representan instrucciones, registros de la CPU, direcciones de memoria o datos Instruccin Significado
A02F 3E01 A030 3E02 1D B331 Lenguajedebajonivel Acceder a la celda de memoria 2F Dependientedelamquina Programacindifcil Copiarlo el registro 1 de la ALU Acceder a la celda de memoria 30 Copiarlo en el registro 2 de la ALU Sumar Guardar el resultado en la celda de memoria 31
Pgina 13
LuisHernndezYez
Fundamentosdelaprogramacin:Computadorasyprogramacin
Nemotcnicos para los cdigos hexadecimales: A0 READ3E REG1D ADD Mayor legibilidad: READ2F REG01 READ30 REG02 ADD WRITE31 Lenguaje de nivel medio
LuisHernndezYez
Fundamentosdelaprogramacin:Computadorasyprogramacin
Pgina 14
LuisHernndezYez
Fundamentosdelaprogramacin:Computadorasyprogramacin
Pgina 15
Ms cercanos a los lenguajes natural y matemtico resultado=dato1+dato2; Mayor legibilidad, mayor facilidad de codificacin Estructuracin de datos / abstraccin procedimental
LuisHernndezYez
Fundamentosdelaprogramacin:Computadorasyprogramacin
Pgina 16
Traduccin
Compiladores:
Compilan y enlazan programas completos
Cdigo fuente
Compilador
Intrpretes:
Compilan, enlazan y ejecutan instruccin a instruccin
LuisHernndezYez
0100010100111010011100
Programa ejecutable
Fundamentosdelaprogramacin:Computadorasyprogramacin
Pgina 17
Genealoga de lenguajes
Prolog COBOL
1959
Versiones/Estndares
1970
PL/I
1964
C++
1983
Java
1995
FORTRAN
1954
CPL
1963
C
1971
C#
2000
Python ALGOL
1958
Pascal BASIC
1964 1970
Modula
1975
1991
Ada
1979
Eiffel
1986
Fuente: http://www.levenez.com/lang/
LuisHernndezYez
Simula
1964
Smalltalk
1971
Ruby
1993
Haskell Lisp
1958
Scheme
1975
1987
Logo
1968 Fundamentosdelaprogramacin:Computadorasyprogramacin Pgina 18
LuisHernndezYez
Fundamentosdelaprogramacin:Computadorasyprogramacin
Pgina 19
La prehistoria
El baco
Siglo XIX
Mquina analtica de Charles Babbage
(Wikipedia)
Fundamentosdelaprogramacin:Computadorasyprogramacin
Pgina 20
Siglo XX
1936 Mquina de Turing 1946 ENIAC: Primera computadora digital de propsito general 1947 El transistor 1953 IBM 650: Primera computadora a gran escala 1966 ARPANET: Origen de Internet 1967 El disquete 1970 Sistema operativo UNIX 1972 Primer virus informtico (Creeper) Lenguaje de programacin C 1974 Protocolo TCP. Primera red local
Fundamentosdelaprogramacin:Computadorasyprogramacin
ENIAC(Wikipedia)
LuisHernndezYez
Pgina 21
1991
Se funda Microsoft Se funda Apple Juego Pacman IBM PC Sistema operativo MSDOS Lenguaje de programacin C++ CDROM Windows 1.0 Lenguaje HTML World Wide Web Sistema operativo Linux
AppleII(Wikipedia)
Linux
IBMPC(Wikipedia)
Fundamentosdelaprogramacin:Computadorasyprogramacin
Pgina 22
1992 Windows 3.1 1995 Lenguaje de programacin Java DVD 1998 Se funda Google 1999 MSN Messenger
Siglo XXI
2001 Windows XP Mac OS X 2002 Mozilla Firefox 2007 iPhone 2008 Android ...
LuisHernndezYez
Fundamentosdelaprogramacin:Computadorasyprogramacin
Pgina 23
LuisHernndezYez
Fundamentosdelaprogramacin:Computadorasyprogramacin
Pgina 24
Qu es programar?
Decirle a un tonto muy rpido exactamente lo que tiene que hacer Especificar la estructura y el comportamiento de un programa, as como probar que el programa realiza su tarea adecuadamente y con un rendimiento aceptable Programa: Transforma entrada en salida
Entrada Programa Salida
LuisHernndezYez
Algoritmo: Secuencia de pasos y operaciones que debe realizar el programa para resolver el problema El programa implementa el algoritmo en un lenguaje concreto
Fundamentosdelaprogramacin:Computadorasyprogramacin Pgina 25
La programacin es slo una etapa del proceso de desarrollo Modelo de desarrollo en cascada:
Planificacin Anlisis Diseo Programacin
LuisHernndezYez
LuisHernndezYez
Fundamentosdelaprogramacin:Computadorasyprogramacin
Pgina 27
return 0; }
Fundamentosdelaprogramacin:Computadorasyprogramacin
Pgina 28
Instrucciones Datos: literales, variables, tipos Subprogramas (funciones) Comentarios Directivas #include<iostream> ...
Subprograma
Directiva
usingnamespacestd;
LuisHernndezYez
Instruccin
return 0; }
Dato
Fundamentosdelaprogramacin:Computadorasyprogramacin
Pgina29
LuisHernndezYez
Fundamentosdelaprogramacin:Computadorasyprogramacin
Pgina 30
Reglas que determinan cmo se pueden construir y secuenciar los elementos del lenguaje
Semntica
LuisHernndezYez
Fundamentosdelaprogramacin:Computadorasyprogramacin
Pgina 31
Especificacin
Lenguajes (BNF) Diagramas
Ejemplo: Nmeros enteros (sin decimales) BNF
<numeroentero>::=<signoopcional><secuenciadedgitos> <signoopcional>::=+||<nada> <secuenciadedgitos>::=<dgito>|<dgito><secuenciadedgitos> <dgito>::=0|1|2|3|4|5|6|7|8|9 |significa <nada>::=
LuisHernndezYez
+ 0..9
Fundamentosdelaprogramacin:Computadorasyprogramacin
Pgina 32
+23 <numeroentero>::=<signoopcional><secuenciadedgitos> ::=+<secuenciadedgitos>::=+<dgito><secuenciadedgitos> ::=+2<secuenciadedgitos>::=+2<dgito> ::=+23 1374 <numeroentero>::=<signoopcional><secuenciadedgitos> ::=<secuenciadedgitos>::=<dgito><secuenciadedgitos> ::=1<secuenciadedgitos>::=1<dgito><secuenciadedgitos> ::=13<secuenciadedgitos>::=13<dgito><secuenciadedgitos> ::=137<secuenciadedgitos>::=137<dgito> ::=1374 134 <numeroentero>::=<signoopcional><secuenciadedgitos> ::=<secuenciadedgitos>::=<dgito><secuenciadedgitos> ::=1<secuenciadedgitos>::=ERROR ( noes<dgito>)
Fundamentosdelaprogramacin:Computadorasyprogramacin
LuisHernndezYez
Pgina 33
+23
+ 0..9
+23 1374
1374
+ 0..9
134
LuisHernndezYez
+ 0..9
Pgina 34
Fundamentosdelaprogramacin:Computadorasyprogramacin
LuisHernndezYez
Fundamentosdelaprogramacin:Computadorasyprogramacin
Pgina 35
Hola Mundo!
Un programa que muestra un saludo en la pantalla:
#include<iostream> usingnamespacestd; int main()
//main()esdondeempiezalaejecucin
{ cout<<"HolaMundo!"<<endl;//MuestraHolaMundo!
LuisHernndezYez
return 0; }
Fundamentosdelaprogramacin:Computadorasyprogramacin
Pgina 36
#include<iostream> usingnamespacestd;
int main() {
Variable
Instruccin
cout<<"HolaMundo!" <<endl;
Operador Datosliterales Operador
LuisHernndezYez
Instruccin
return0; }
Nmero Cuerpodelafuncin
Lasinstruccionesterminanen;
Fundamentosdelaprogramacin:Computadorasyprogramacin Pgina 37
Hola Mundo!
Casi todo es infraestructura Slo cout<<"HolaMundo!"<<endl hace algo palpable La infraestructura (notacin, bibliotecas y otro soporte) hace nuestro cdigo simple, completo, confiable y eficiente
LuisHernndezYez
El estilo importa!
Fundamentosdelaprogramacin:Computadorasyprogramacin
Pgina 38
LuisHernndezYez
Fundamentosdelaprogramacin:Computadorasyprogramacin
Pgina 39
Editor
Bloc de notas, Wordpad, Word, Writer, Gedit, Kwrite, (texto simple, sin formatos) Editores especficos: coloreado sintctico Recomendacin: Notepad++
LuisHernndezYez
Fundamentosdelaprogramacin:Computadorasyprogramacin
Pgina 40
hola.cpp (cdigofuente)
Compilador
hola.obj (cdigoobjeto)
Enlazador
Cargador
LuisHernndezYez
hola.exe (ejecutable)
Fundamentosdelaprogramacin:Computadorasyprogramacin
Pgina 41
Compilador
Importante: C++ estndar Recomendacin: GNU G++ (MinGW en Windows)
Fundamentosdelaprogramacin:Computadorasyprogramacin
Pgina 42
Entornos de desarrollo
Para editar, compilar y probar el cdigo del programa Recomendaciones: Windows: MS Visual Studio / C++ Express o Eclipse Linux: Netbeans o Eclipse
LuisHernndezYez
Fundamentosdelaprogramacin:Computadorasyprogramacin
Pgina 43
Qu hace el programa?
La ejecucin del programa siempre empieza en main() Se ejecutan las instrucciones en secuencia de principio a fin
Inicio
Pantalla(cout) _ HolaMundo! _
LuisHernndezYez
cout<<"HolaMundo!" <<endl; Muestra HolaMundo! en la pantalla y salta de lnea return0; Devuelve 0 como cdigo de terminacin del programa
Fin
Fundamentosdelaprogramacin:Computadorasyprogramacin
Pgina 44
LuisHernndezYez
Fundamentosdelaprogramacin:Computadorasyprogramacin
Pgina 45
El lenguaje C
Lenguaje creado por Dennis M. Ritchie en 1972 Lenguaje de nivel medio: Estructuras tpicas de los lenguajes de alto nivel Construcciones para control a nivel de mquina Lenguaje sencillo (pocas palabras reservadas) Lenguaje estructurado (no estrictamente estructurado en bloques) Compartimentalizacin de cdigo (funciones) y datos (mbitos) Componente estructural bsico: la funcin (subprograma) Programacin modular Distingue entre maysculas y minsculas Palabras reservadas (o clave): en minsculas
Fundamentosdelaprogramacin:Computadorasyprogramacin Pgina 46
LuisHernndezYez
LuisHernndezYez
Fundamentosdelaprogramacin
2
Grado en Ingeniera Informtica Grado en Ingeniera del Software Grado en Ingeniera de Computadores Luis Hernndez Yez
LuisHernndezYez
Unejemplodeprogramacin ElprimerprogramaenC++ Laslneasdecdigodelprograma Clculosenlosprogramas Variables Expresiones Lecturadedatosdesdeelteclado Resolucindeproblemas Losdatosdelosprogramas Identificadores Tiposdedatos Declaracinyusodevariables Instruccionesdeasignacin Operadores Mssobreexpresiones Constantes Labibliotecacmath Operacionesconcaracteres
50 64 80 86 92 98 108 119 127 129 133 142 147 152 160 167 171 174
Fundamentosdelaprogramacin:TiposeinstruccionesI
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 50
<instruccin> ::= <inst> ; <inst> ::= Start | Stop | <avanzar> <avanzar> ::= Go <direccin> <num> Blocks <direccin> ::= North | East | South | West <num> ::= 1 | 2 | 3 | 4 | 5
Ejemplos:
LuisHernndezYez
= Literales ;
direccin
num 1 2 num 3 4 5
Blocks
direccin
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 52
El problema a resolver
Estando el coche en la posicin A, conseguir llegar al Cine Tvoli (B) Qu pasos hay que seguir? Arrancar Ir un bloque al Norte Ir dos bloques al Este Ir cinco bloques al Norte Ir dos bloques al Este Parar
B
A Bloque:
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 53
El algoritmo
Secuencia de pasos que hay que seguir para resolver el problema 1. Arrancar 2. Ir un bloque al Norte 3. Ir dos bloques al Este 4. Ir cinco bloques al Norte 5. Ir dos bloques al Este 6. Parar
LuisHernndezYez
Esos pasos sirven tanto para una persona como para una computadora.
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 54
El programa
Instrucciones escritas en el lenguaje de programacin
B
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 55
El programa
Escribimos el cdigo del programa en un editor y lo guardamos en un archivo:
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 56
La compilacin
Introducimos la llave USB en el coche y pulsamos el botn de ejecutar el programa:
Stat; ^Unknown word. Go North1Blocks ^;missing. Go EastBlocks; ^Number missing. Go Noth 5Blocks; ^Unknown word. Go West2Blocks; Stop; There areerrors.Impossible to run the program.
Errores de sintaxis
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 57
Depuracin
Editamos el cdigo para corregir los errores sintcticos:
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 58
La ejecucin
Se realiza lo que pide cada instruccin:
B
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 59
Depuracin
Editamos el cdigo para arreglar el error de ejecucin:
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 60
La ejecucin
Se realiza lo que pide cada instruccin:
?
B
Depuracin
Editamos el cdigo para arreglar el error lgico:
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 62
La ejecucin
Se realiza lo que pide cada instruccin:
Conseguido!
Fundamentosdelaprogramacin:TiposeinstruccionesI Pgina 63
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 64
Hola Mundo!
De vuelta en el programa que muestra un saludo en la pantalla:
#include<iostream> usingnamespacestd; int main() //main()esdondeempiezalaejecucin { cout<<"HolaMundo!"<<endl; return 0;
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 65
Hola Mundo!
La nica instruccin que produce algo tangible:
#include<iostream> usingnamespacestd; intmain()//main()esdondeempiezalaejecucin { cout<<"HolaMundo!"<<endl; return0;
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 66
cout (iostream)
cout<<"HolaMundo!"<<endl;
cout <<"HolaMundo!" <<endl;
HolaMundo!
_
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 67
80caracteres
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 68
H o l a
M u n d o ! ...
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI
...
Pgina 69
El insertor <<
Inserta textos en la pantalla de modo texto Representacin textual de los datos A partir de la posicin del cursor
cout<<...;
Line wrap (contina en la siguiente lnea si no cabe) Se pueden encadenar: cout<<...<<...<<...; Recuerda:lasinstruccionesterminanen;
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 70
Lascomillasnosemuestran!
endl
Puntodecimal,NOcoma!
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 71
El programa principal
La funcin main(): donde comienza la ejecucin...
#include<iostream> usingnamespacestd; int main() { cout<<"HolaMundo!"<<endl; return 0; }
LuisHernndezYez
//main()esdondeempiezalaejecucin
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 72
El programa principal
La funcin main():
Tipo de la funcin (int = entero): Tipo de valor que devuelve Nombre de la funcin int main() { ... return 0; }
LuisHernndezYez
Es una funcin!
return 0;
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 73
Documentando el cdigo...
Comentarios (se ignoran):
#include<iostream> usingnamespacestd; intmain()//main()esdondeempiezalaejecucin { cout<<"HolaMundo!"<<endl; ...
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI
La infraestructura
Cdigo para reutilizar:
#include<iostream> usingnamespacestd; intmain()//main()esdondeempiezalaejecucin { cout<<"HolaMundo!"<<endl; return0; }
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 75
Bibliotecas
Se incluyen con la directiva #include: #include<iostream> (Utilidades de entrada/salida por consola) Para mostrar o leer datos hay que incluir la biblioteca iostream
Espacios de nombres
En iostream hay espacios de nombres; cul queremos?
#include<iostream> usingnamespacestd;
LuisHernndezYez
Siempre usaremos el espacio de nombres estndar (std) Muchas bibliotecas no tienen espacios de nombres
Fundamentosdelaprogramacin:TiposeinstruccionesI Pgina 76
Compilacin y enlace
hola.cpp (cdigofuente) Compilador
Enlazador
Cargador
hola.exe (ejecutable)
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 77
#include<iostream> usingnamespacestd;
Palabrasreservadas
Espaciodenombres Coloreadosintctico:
DirectivasTipos Palabrasreservadasgenerales DatosliteralesComentarios
int main() {
Variable
Instruccin
cout<<"HolaMundo!" <<endl;
Operador Operador Datosliterales
LuisHernndezYez
Instruccin
return0; }
Nmero Cuerpodelafuncin
Lasinstruccionesterminanen;
Fundamentosdelaprogramacin:TiposeinstruccionesI Pgina 78
#include<iostream> usingnamespacestd;
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 79
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 80
Tu cdigo aqu!
LuisHernndezYez
return 0; }
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 81
return 0; }
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 82
return 0; }
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 83
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 84
Mantenimiento y reusabilidad
Usa espacio en blanco para separar los elementos: cout<<"EnunlugardelaMancha," <<endl; mejor que cout<<"EnunlugardelaMancha,"<<endl; Usa sangra (indentacin) para el cdigo de un bloque: { Tab cout<<"EnunlugardelaMancha," <<endl; ... 3 esp. return 0; }
LuisHernndezYez
El estilo importa!
Fundamentosdelaprogramacin:TiposeinstruccionesI Pgina 85
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 86
Operadores aritmticos
+ * / Suma Resta Multiplicacin Divisin operadoroperando_derecho Resultado 7 0.44 286 15.15
Pgina 87
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI
clculos.cpp
Ejemplo
#include<iostream> usingnamespacestd; int main() Un texto Un nmero { cout<<"133+1234=" <<133 +1234 <<endl; cout<<"1234 111.5=" <<1234 111.5 <<endl; cout<<"34*59=" <<34 *59 <<endl; cout<<"3.4*5.93=" <<3.4 *5.93 <<endl; cout<<"500/3=" <<500 /3 <<endl;//Div.entera cout<<"500.0/3=" <<500.0 /3 <<endl;//Div.real
LuisHernndezYez
return 0; }
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 89
Divisin entera
LuisHernndezYez
Divisin real
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 90
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 91
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 92
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 93
Declaracin de variables
int cantidad; double precio; Se reserva espacio suficiente
tipo nombre;
Memoria cantidad precio ? ? ...
LAS VARIABLES NO SE INICIALIZAN No se deben usar hasta que se les haya dado algn valor
LuisHernndezYez
Dnde colocamos las declaraciones? Siempre, antes del primer uso Habitualmente al principio de la funcin
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 94
Declaracin de variables
#include<iostream> usingnamespacestd; int main() { int cantidad; double precio,total; cantidad precio total
Memoria ? ? ? ...
LuisHernndezYez
return 0; }
Podemos declarar varias de un mismo tipo separando los nombres con comas
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 95
Notacin cientfica
Problemas de precisin
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 96
cantidad=12.5;
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 97
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 98
Expresiones
Secuencias de operandos y operadores operando operador operandooperador operando... total=cantidad*precio*1.18;
Expresin
A igual prioridad se evalan de izquierda a derecha Parntesis para forzar ciertas operaciones total=cantidad1+cantidad2*precio; total=(cantidad1+cantidad2)*precio; Unos operadores se evalan antes que otros
Fundamentosdelaprogramacin:TiposeinstruccionesI Pgina 99
LuisHernndezYez
total=cantidad1+cantidad2*precio; * antes que + 10 + 2 * 40,0 10 + 80,0 90,0 total=(cantidad1+cantidad2)*precio; + antes que * (10 + 2) * 40,0 12 * 40,0 480,0
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 100
variables.cpp
LuisHernndezYez
Memoria
? ? ?
...
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 102
Memoria
12 ? ?
...
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 103
Memoria
12 39.95 ?
...
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 104
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 105
Memoria
12 39.95
LuisHernndezYez
intmain() { 479.4 total intcantidad; doubleprecio,total; ... cantidad=12; precio=39.95; total=cantidad*precio; cout<<cantidad<<"x"<<precio<<"=" <<total<<endl;
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 106
LuisHernndezYez
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 108
cin (iostream)
cin>>cantidad;
Memoria
cin
>>cantidad;
12 _
cantidad
12 ? ...
1
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 109
El extractor >>
cin>>variable;
Transforma los caracteres introducidos en datos Cursor parpadeante: lugar de lectura del siguiente carcter La entrada termina con Intro (cursor a la siguiente lnea) El destino del extractor debe ser SIEMPRE una variable! Se ignoran los espacios en blanco iniciales
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 110
39.95abc
39.95
Se asigna el valor 39,95 a la variable; el resto queda pendiente Recomendacin: Lee cada variable en una lnea 39.95
Fundamentosdelaprogramacin:TiposeinstruccionesI Pgina 111
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 112
LuisHernndezYez
No se puede leer un entero 0 para cantidad y Error La lectura del precio falla: precio no toma valor (basura)
Fundamentosdelaprogramacin:TiposeinstruccionesI Pgina 113
LuisHernndezYez
Lectura correcta!!!
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 114
2. Pedir el denominador
Variabledenominador (double)
4. Mostrar el resultado
Fundamentosdelaprogramacin:TiposeinstruccionesI Pgina 115
EntradaProcesoSalida
Muchos programas se ajustan a un sencillo esquema:
Declaraciones
Entrada
Procesamiento
Salida
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 116
Leer numerador
cin>>numerador;
Leer denominador
cin>>denominador;
4.
cout<<resultado;
Fundamentosdelaprogramacin:TiposeinstruccionesI Pgina 117
divisin.cpp
Numerador:_ 129
LuisHernndezYez
_ int main() { Declaraciones double numerador,denominador,resultado; cout<<"Numerador:"; cin>>numerador; Entrada cout<<"Denominador:"; cin>>denominador; Procesamiento resultado=numerador/denominador; cout<<"Resultado:" <<resultado<<endl; Salida return0; }
Fundamentosdelaprogramacin:TiposeinstruccionesI Pgina 118
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 119
Problema
Dadas la base y la altura de un tringulo, mostrar su rea
Refinamiento
Mostrar en la pantalla un texto que pida la base del tringulo. El usuario introducir el valor con el teclado. Mostrar en la pantalla un texto que pida la altura del tringulo. El usuario introducir el valor con el teclado. Se calcular el rea del tringulo y se mostrar en la pantalla.
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 120
Mostrar en la pantalla un texto que pida la base del tringulo. El usuario introducir la base con el teclado. Mostrar en la pantalla un texto que pida la altura del tringulo. El usuario introducir la altura con el teclado. Se calcular el rea del tringulo y se mostrar en la pantalla. cadena literal
LuisHernndezYez
variable variable
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 121
Tipo
double
double double
Variable Variable
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 122
Operaciones (acciones)
cout<<... cin>>...
Mostrar en la pantalla un texto que pida la base del tringulo. El usuario introducir la base con el teclado. Mostrar en la pantalla un texto que pida la altura del tringulo. El usuario introducir la altura con el teclado. Se calcular el rea del tringulo y se mostrar en la pantalla.
LuisHernndezYez
area =base*altura/2
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 123
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 124
2. Leer del teclado el valor para la base del tringulo 3. Mostrar en la pantalla el texto que pida la altura del tringulo 4. Leer del teclado el valor para la altura del tringulo 5. Calcular el rea del tringulo 6. Mostrar el rea del tringulo
return 0; }
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 125
tringulo.cpp
El programa: implementacin
#include<iostream> usingnamespacestd; tringulo?
LuisHernndezYez
int main() { double base,altura,area;//Declaraciones cout<<"Introduzcalabasedeltringulo:";//1 cin>>base;//2 cout<<"Introduzcalaalturadeltringulo:";//3 cin>>altura;//4 area =base*altura/2;//5 //6 cout<<"Elreadeuntringulodebase" <<base <<"yaltura"<<altura<<"es:" <<area <<endl; return 0; }
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 127
base,altura,area
Identificadores
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 128
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 129
palabras reservadas
Para variables y constantes con nombre Nombre de un dato (para accederlo/modificarlo) Deben ser descriptivos Sintaxis:
a..z,A..Z,_ 0..9,a..z,A..Z,_
cantidadprrecio
LuisHernndezYez
totalbasealturaarea
numerador
floatforfriendgoto
returnshort structswitch
volatilewhile
Fundamentosdelaprogramacin:TiposeinstruccionesI Pgina 131
a..z,A..Z,_
0..9,a..z,A..Z,_
interesAnual
_base_imponible
__edad valor%100
EDAD12 100caracteres
LuisHernndezYez
aos
_12_meses
Fundamentosdelaprogramacin:TiposeinstruccionesI
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 133
Tipos
Cada dato, de un tipo concreto Cada tipo establece:
Expresiones con datos de distintos tipos (compatibles): Transformacin automtica de tipos (promocin de tipo)
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 134
LuisHernndezYez
int Nmeros enteros (sin decimales) 1363, 12, 49 float Nmeros reales 12.45, 3.1932, 1.16E+02 double Nmeros reales (mayores intervalo y precisin) char Caracteres 'a' , '{', '\t' bool Valores lgicos (verdadero/falso) true, false string Cadenas de caracteres (biblioteca string) "HolaMundo!" void Nada, ausencia de tipo, ausencia de dato (funciones)
Fundamentosdelaprogramacin:TiposeinstruccionesI Pgina 135
Caracteres
Intervalo de valores: Juego de caracteres (ASCII) Literales: 'a''%''\t' Constantes de barra invertida (o secuencias de escape): Caracteres de control '\t' = tabulador '\n' = salto de lnea
1 byte
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 136
Valores lgicos
Slo dos valores posibles: Verdadero (true) Falso (false) Literales: truefalse Cualquier nmero distinto de 0 es equivalente a true El 0 es equivalente a false
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 137
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 138
Cadenas de caracteres
"Hola""Introduceelnumerador:""X142FG5TX?%A"
" char
Secuencias de caracteres Programas con variables de tipo string: #include<string> usingnamespacestd;
"
LuisHernndezYez
Las comillas tipogrficas (apertura/cierre) NO sirven Asegrate de utilizar comillas rectas: ""
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 139
tipos.cpp #include<iostream> #include<string> usingnamespacestd;//Unsolousing...paraambasbibliotecas int main() { int entero=3;//Podemosasignar(inicializar)aldeclarar double real=2.153; char caracter ='a'; bool cierto=true; string cadena="Hola"; cout<<"Entero:" <<entero<<endl; cout<<"Real:" <<real<<endl; cout<<"Carcter:" <<caracter <<endl; cout<<"Booleano:" <<cierto<<endl; cout<<"Cadena:" <<cadena<<endl; return 0; }
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI
signed / unsigned : con signo (por defecto) / sin signo short / long : menor / mayor intervalo de valores
Intervalo 2147483648 .. 2147483647 0 .. 4294967295 32768 .. 32768 2147483648 .. 2147483647 0 .. 4294967295 +| 2.23e308 .. 1.79e+308 +| 3.37E4932 .. 1.18E+4932
unsignedshortint 0 .. 65535
double longdouble
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 141
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 142
[modificadores]tipo lista_de_variables;
Opcional
lista_de_variables
Identificador
LuisHernndezYez
Programacin con buen estilo: Identificadores descriptivos Espacio tras cada coma Nombres de las variables en minsculas (Varias palabras: capitaliza cada inicial: interesPorMes)
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 143
Se reserva memoria suficiente para cada tipo de dato int inicio; shortintunidades; double balance;
Memoria
inicio
01 02 03 04
unidades balance
05 06 07 08 09 10 11 12 13
LuisHernndezYez
14 15 ...
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 144
En C++ las variables no se inicializan automticamente! Una variable debe ser haber sido inicializada antes de ser accedida! Cmo se inicializa una variable? Al leer su valor (cin>>) Al asignarle un valor (instruccin de asignacin) Al declararla Inicializacin en la propia declaracin:
LuisHernndezYez
Identificador
Expresin
Enparticular,unaexpresin puedeserunliteral
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 145
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 146
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 147
El operador =
Variable = Expresin
;
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 148
Errores
int a,b,c; 5 =a; //ERROR:unliteralnopuederecibirunvalor a+23 =5; //ERROR:nopuedehaberunaexpresinalaizda. b="abc"; //ERROR:unenteronopuedeguardarunacadena c=23
LuisHernndezYez
5;
//ERROR:expresinnovlida(faltaoperador)
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 149
i j
01 02 03 04 05 06 07 08 09 10 ...
? 2
i
23 +2 *5
01 02 03 04
33 2
...
05 06 07 08 09 10
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 150
aux=a;
b aux a
a=b;
b aux
LuisHernndezYez
b=aux;
b aux
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 151
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 152
LuisHernndezYez
int
float / double
Cambiodesigno Suma Resta Producto
1(monario) Prefijo 2(binario) 2(binario) 2(binario) 2(binario) 2(binario) Infijo Infijo Infijo Infijo Infijo
Div.entera Mdulo
Divisinreal Noaplicable
Incremento Decremento
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 154
LuisHernndezYez
Operadores binarios Operando izquierdo operador operando derecho Operandos: literales, constantes, variables o expresiones
2 +3 a*RATIOa+b (a%b)*(c/d)
Fundamentosdelaprogramacin:TiposeinstruccionesI Pgina 155
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 156
5 24
3
123 %5
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 157
++/
#include<iostream> usingnamespacestd;
operadores.cpp
LuisHernndezYez
int main(){ int entero1=15,entero2=4; double real1=15.0,real2=4.0; cout<<"Operacionesentrelosnmeros15y4:"<<endl; cout<<"Divisinentera(/):"<<entero1/entero2<<endl; cout<<"Restodeladivisin(%):"<<entero1%entero2<<endl; cout<<"Divisinreal(/):"<<real1/real2<<endl; cout<<"Num="<<real1<<endl; real1=real1; cout<<"Cambiadesigno():"<<real1<<endl; real1=real1; cout<<"Vuelveacambiar():"<<real1<<endl; cout<<"Seincrementaantes(++prefijo):"<<++real1<<endl; cout<<"Semuestraantesdeincrementar(posfijo++):" <<real1++<<endl; cout<<"Yaincrementado:" <<real1<<endl; return 0; }
Fundamentosdelaprogramacin:TiposeinstruccionesI Pgina 159
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 160
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 161
Precedencia
Mayor prioridad
Operadores
++ (postfijos) ++ (prefijos) (cambio de signo) */%
Menor prioridad
3 +5 *2 /2 1 3 +10 /2 1 3 +5 1 8 1 7
LuisHernndezYez
Mayor precedencia
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 162
((3 + 5)*4 +12)/4 (3 * 2 1) (8 *4 +12)/4 * antes que + (32 +12)/4 44 /4 5 / antes que 11 5
LuisHernndezYez
* antes que (6 1)
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 163
frmula.cpp
#include<iostream> usingnamespacestd; int main() { double x,f; cout<<"IntroduceelvalordeX:"; cin>>x; f=3 *x*x/5 +6 *x/7 3; cout<<"f(x)=" <<f<<endl; return 0; }
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 164
variable operador=op_derecho; Asignacin a=a+12; a=a*3; a=a 5; a=a/37; a=a%b; Abreviatura a+=12; a*=3; a=5; a/=37; a%=b;
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 165
1 1 1 1 1 1 1 1
0 0 0 0 0 0 0 1
32767 + 1 32768
0 0 0 0 0 0 0 0
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 166
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 167
const
LuisHernndezYez
Programacin con buen estilo: Pon en mayscula la primera letra de una constante o todo su nombre
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 168
vs.
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 169
constantes.cpp #include<iostream> usingnamespacestd; int main(){ const double Pi=3.141592; double radio=12.2,circunferencia; circunferencia=2 *Pi*radio; cout<<"Circunferenciadeuncrculoderadio" <<radio<<":" <<circunferencia<<endl; const double Euler =2.718281828459;//Nmeroe cout<<"Nmeroealcuadrado:"<<Euler *Euler <<endl; const int IVA=21; int cantidad=12; double precio=39.95,neto,porIVA,total; neto=cantidad*precio; porIVA =neto*IVA/100; total=neto+porIVA; cout<<"Totalcompra:"<<total<<endl; return 0; }
Fundamentosdelaprogramacin:TiposeinstruccionesI Pgina 170
LuisHernndezYez
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 171
#include<cmath>
Algunas ... abs(x) sqrt(x) ceil(x) floor(x) exp(x) log(x) log10(x) sin(x) cos(x)
LuisHernndezYez
Valor absoluto de x Raz cuadrada de x Menor entero que es mayor o igual que x Mayor entero que es menor o igual que x ex Ln x (logaritmo natural de x) Logaritmo en base 10 de x Seno de x Coseno de x Tangente de x Redondeo al entero ms prximo Prdida de la parte decimal (entero)
Pgina 172
pow(x,y) x elevado a y
Fundamentosdelaprogramacin:TiposeinstruccionesI
mates.cpp
#include<iostream> usingnamespacestd; #include<cmath> int main(){ double x,y,f; pow() con argumento entero: cout<<"ValordeX:"; Usa el molde double(): cin>>x; pow(double(i),5) cout<<"ValordeY:"; cin>>y; f=2 *pow(x,5) +sqrt(pow(x,3) /pow(y,2)) /abs(x*y) cos(y); cout<<"f(x,y)=" <<f<<endl; return 0; }
Pon un espacio detrs de cada coma en las listas de argumentos
Fundamentosdelaprogramacin:TiposeinstruccionesI Pgina 173
LuisHernndezYez
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 174
char
Asignacin, ++/ y operadores relacionales
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 175
caracteres.cpp ... #include<cctype> int main(){ char caracter1='A',caracter2='1',caracter3='&'; cout<<"Carcter1(" <<caracter1<<")."<<endl; cout<<"Alfanumrico?"<<isalnum(caracter1)<<endl; cout<<"Alfabtico?"<<isalpha(caracter1)<<endl; cout<<"Dgito?"<<isdigit(caracter1)<<endl; cout<<"Mayscula?"<<isupper(caracter1)<<endl; caracter1=tolower(caracter1); cout<<"Enminscula:"<<caracter1<<endl; cout<<"Carcter2(" <<caracter2<<")."<<endl; cout<<"Alfabtico?"<<isalpha(caracter2)<<endl; cout<<"Dgito?"<<isdigit(caracter2)<<endl; cout<<"Carcter3(" <<caracter3<<")."<<endl; cout<<"Alfanumrico?"<<isalnum(caracter3)<<endl; cout<<"Alfabtico?"<<isalpha(caracter3)<<endl; cout<<"Dgito?"<<isdigit(caracter3)<<endl; return 0; 1 true / 0 false }
Fundamentosdelaprogramacin:TiposeinstruccionesI Pgina 176
LuisHernndezYez
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 177
Operadores relacionales
Comparaciones (condiciones)
Condicin simple ::= Expresin Operador_relacional Expresin
menor que menor o igual que mayor que mayor o igual que igual que distinto de
>= == !=
Fundamentosdelaprogramacin:TiposeinstruccionesI
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 179
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 180
LuisHernndezYez
int num; cout<<"Nmero:"; Opcional:puedenohaberelse cin>>num; if (num%2 ==0){ cout<<num<<"espar"; } else { cout<<num<<"esimpar"; }
Fundamentosdelaprogramacin:TiposeinstruccionesI Pgina 181
seleccin.cpp
#include<iostream> usingnamespacestd; int main(){ intop1=13,op2=4; intopcion; cout<<"1 Sumar"<<endl; cout<<"2 Restar"<<endl; cout<<"Opcin:"; cin>>opcion; if (opcion ==1){ cout<<op1+op2<<endl; } else { cout<<op1 op2<<endl; } return0; }
Fundamentosdelaprogramacin:TiposeinstruccionesI Pgina 182
LuisHernndezYez
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 183
Agrupacin de instrucciones
Grupo de instrucciones a ejecutar en una rama del if
{ instruccin } {
Tab 3 esp.
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 184
if (num>0) cout<<"Positivo";
Usaremos siempre llaves por simplicidad... Evita poner el if y la instruccin objetivo en la misma lnea:
if (num>0)cout<<"Positivo";
Fundamentosdelaprogramacin:TiposeinstruccionesI Pgina 185
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 186
true Cuerpo
Condicin
false
LuisHernndezYez
serie.cpp
#include<iostream> usingnamespacestd; int main(){ inti=1,n=0,suma=0; while (n<=0){//Slonpositivo cout<<"Cuntosnmerosquieressumar?"; cin>>n; } while(i<=n){ suma=suma+i; i++; } cout<<"Sumatoriodei(1a" <<n <<")=" <<suma<<endl; return0; }
Fundamentosdelaprogramacin:TiposeinstruccionesI Pgina 188
LuisHernndezYez
Iteracin condicional
while(i<=n){ suma=suma+i; i++; }
n i true suma+=i; i++;
LuisHernndezYez
5 6 2 3 4 5 1 15 10 1 3 6 0
i<=n
false
suma
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 189
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 190
#include<iostream> usingnamespacestd;
Conectan la ejecucin del programa con los dispositivos de E/S Son secuencias de caracteres Entrada por teclado: flujo de entrada cin (tipo istream) Salida por pantalla: flujo de salida cout (tipo ostream)
cin
7 3 5 . 3 5 1
cout
Programa 1
6 = l a t o T
Extractor Insertor
Flujodeentrada Flujodesalida
>> <<
Variable Expresin
Pgina 191
Fundamentosdelaprogramacin:TiposeinstruccionesI
cin
>>
Variable
Salta los espacios en blanco (espacios, tabuladores o saltos de lnea) char Se lee un carcter en la variable int Se leen dgitos y se transforman en el valor a asignar float/double: Se leen dgitos (quiz el punto y ms dgitos) y se asigna el valor bool: Si se lee 1, se asigna true; con cualquier otro valor se asigna false
Se amigable con el usuario Lee cada dato en una lnea cout<<"Introducetuedad:"; cin>>edad;
Fundamentosdelaprogramacin:TiposeinstruccionesI Pgina 192
LuisHernndezYez
#include<string> usingnamespacestd;
cin>>cadena cin.sync()
cout
<<
Expresin
cout<<d;
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 195
cout
<<
Expresin
Programa
cout
int meses=7; cout<<"Total:"<<123.45 <<endl<<"Meses:"<<meses; cout<<123.45 <<endl<<"Meses:"<<meses; cout<<endl<<"Meses:"<<meses; cout<<"Meses:"<<meses;
LuisHernndezYez
cout<<meses;
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 196
#include<iomanip> Constantes y funciones a enviar a cout para ajustar el formato de salida Biblioteca Constante/funcin
iostream showpoint/ noshowpoint fixed scientific boolalpha left/right iomanip setw(anchura)* setprecision(p)
LuisHernndezYez
Propsito
Mostrar o no el punto decimal para reales sin decimales (34.0) Notacin de punto fijo (reales) (123.5) Notacin cientfica (reales) (1.235E+2) Valores bool como true / false Ajustar a la izquierda/derecha (por defecto) N de caracteres (anchura) para el dato Precisin: N de dgitos (en total) Con fixed o scientific, n de decimales
*setw() slo afecta al siguiente dato que se escriba, mientras que los otros afectan a todos
Fundamentosdelaprogramacin:TiposeinstruccionesI Pgina 197
bool fin=false; cout<<fin<<">" <<boolalpha <<fin<<endl; double d=123.45; char c='x'; int i=62; cout<<d<<c<<i<<endl; cout<<"|" <<setw(8)<<d<<"|"<<endl; cout<<"|" <<left<<setw(8)<<d<<"|"<<endl; cout<<"|" <<setw(4)<<c<<"|"<<endl; cout<<"|" <<right<<setw(5)<<i<<"|"<<endl; double e=96;
LuisHernndezYez
0>false
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 198
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 199
Los programas pueden incluir otras funciones adems de main() Forma general de una funcin en C++:
tipo nombre(parmetros)//Cabecera { //Cuerpo }
LuisHernndezYez
Tipo de dato que devuelve la funcin como resultado Parmetros para proporcionar datos a la funcin Declaraciones de variables separadas por comas Cuerpo: secuencia de declaraciones e instrucciones Un bloque de cdigo!
Fundamentosdeprogramacin:TiposeinstruccionesI
Pgina 200
Datos locales: declarados en el cuerpo de la funcin Datos auxiliares que utiliza la funcin (puede no haber) Parmetros: declarados en la cabecera de la funcin Datos de entrada de la funcin (puede no haber) Ambos son de uso exclusivo de la funcin y no se conocen fuera
double f(intx,int y){ //Declaracindedatoslocales: double resultado; //Instrucciones: resultado=2 *pow(x,5) +sqrt(pow(x,3) /pow(y,2)) /abs(x*y) cos(y); return resultado;//Devolucindelresultado }
Fundamentosdeprogramacin:TiposeinstruccionesI Pgina 201
LuisHernndezYez
Fundamentosdeprogramacin:TiposeinstruccionesI
Pgina 202
Fundamentosdeprogramacin:TiposeinstruccionesI
}
Esta instruccin no se ejecutar nunca
Fundamentosdeprogramacin:TiposeinstruccionesI
Pgina 204
double f(intx,int y); int funcion(int x,double a) int cuad(int x); ... main() es la nica funcin
que no hay que prototipar
Fundamentosdeprogramacin:TiposeinstruccionesI Pgina 205
#include<iostream> usingnamespacestd; #include<cmath> //Prototiposdelasfunciones(exceptomain()) bool par(int num); boolletra(char car); intsuma(int num); double formula(int x,inty); int main(){ intnumero,sum,x,y; char caracter; double f; cout<<"Entero:"; cin>>numero; if (par(numero)){ cout<<"Par"; } ...
Fundamentosdeprogramacin:TiposeinstruccionesI Pgina 206
LuisHernndezYez
else{ cout<<"Impar"; } cout<<endl; if (numero>1){ cout<<"Sumatoriode1a" <<numero<<":" <<suma(numero)<<endl; } cout<<"Carcter:"; cin>>caracter; if(!letra(caracter)){ cout<<"no"; } cout<<"esunaletra" <<endl; cout<<"f(x,y)=" <<formula(x,y)<<endl; //Losargumentospuedenllamarseigualonoquelosparmetros
LuisHernndezYez
return 0; } ...
Fundamentosdeprogramacin:TiposeinstruccionesI Pgina 207
//Implementacindelasfuncionespropias boolpar(int num){ bool esPar; if (num%2==0){ esPar =true; } else { esPar =false; } return esPar;
LuisHernndezYez
} ...
Fundamentosdeprogramacin:TiposeinstruccionesI
Pgina 208
bool letra(char car){ bool esLetra; if ((car>='a')&&(car<='z')||(car>='A')&&(car<='Z')){ esLetra =true; } else { esLetra =false; } return esLetra; } int suma(int num){ int sum =0,i=1; while (i<num){ sum =sum +i; i++; } return sum; } ...
Fundamentosdeprogramacin:TiposeinstruccionesI Pgina 209
LuisHernndezYez
funciones.cpp
LuisHernndezYez
Fundamentosdeprogramacin:TiposeinstruccionesI
Pgina 210
LuisHernndezYez
Fundamentosdelaprogramacin
2A
Grado en Ingeniera Informtica Grado en Ingeniera del Software Grado en Ingeniera de Computadores Luis Hernndez Yez
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI(Anexo)
Nmeros enteros
Intervalo de valores: 2147483648 .. 2147483647 (*) Depende de la mquina Bytes de memoria: 4* 4 bytes es lo ms habitual Literales: Se puede saber cuntos se usan con la funcin 1363, 12, 010 , 0x1A
sizeof(int)
01 02 03 04 05 06
07 08
09 ...
Notacin hexadecimal
Fundamentosdelaprogramacin:TiposeinstruccionesI(Anexo)
Pgina 214
Nmeros enteros
Nmeros en notacin octal (base 8: dgitos entre 0 y 7): 010 = 8 en notacin decimal 10 = 1 x 81 + 0 x 80 = 1 x 8 + 0 0423 = 275 en notacin decimal 423 = 4 x 82 + 2 x 81 + 3 x 80 = 4 x 64 + 2 x 8 + 3 = 256 + 16 +3 Nmeros en notacin hexadecimal (base 16): Dgitos posibles: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F 0x1F = 31 en notacin decimal 1F = 1 x 161 + F x 160 = 1 x 16 + 15 0xAD = 173 en notacin decimal AD = A x 161 + D x 160 = 10 x 16 + 13 = 160 + 13
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI(Anexo)
Pgina 215
01 02 03 04 05 06 07 08 09 ...
+ 0..9
Fundamentosdelaprogramacin:TiposeinstruccionesI(Anexo)
+ . 0..9 e,E
Pgina 216
0..9
Siempre un nmero (con o sin signo) con un solo dgito de parte entera, seguido del exponente (potencia de 10): 5.23e2 1.11e2 7.4523e04 5,23 x 102 1,11 x 102 7,4523 x 104 0,0523 111,0 0,00074523 3.333.300
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI(Anexo)
Pgina 217
01 02 03 04 05 06 07 08 09 ...
+ 0..9
Fundamentosdelaprogramacin:TiposeinstruccionesI(Anexo)
+ . 0..9 e,E
Pgina 218
0..9
Caracteres
Intervalo de valores: Juego de caracteres (ASCII) Bytes de memoria: 1 (FC) Literales: 'a', '%', '\t' Constantes de barra invertida: (O secuencias de escape) Para caracteres de control '\t' = tabulador, '\n' = salto de lnea,
\ '
LuisHernndezYez
01 02 03 04 05 06 07 08 09 ...
Fundamentosdelaprogramacin:TiposeinstruccionesI(Anexo)
Pgina 219
LuisHernndezYez
Juego de caracteres ASCII: American Standard Code for Information Interchange (1963) Caracteres con cdigos entre 0 y 127 (7 bits) Caracteres de control: Cdigos del 0 al 31 y 127 Tabulacin, salto de lnea,... Caracteres imprimibles: Cdigos del 32 al 126 Juego de caracteres ASCII extendido (8 bits): ISO88591 Multitud de codificaciones: + Cdigos entre 128 y 255 EBCDIC, UNICODE, UTF8, ...
Fundamentosdelaprogramacin:TiposeinstruccionesI(Anexo)
Pgina 220
Valores lgicos
Slo dos valores posibles: Verdadero (true) Falso (false) Bytes de memoria: 1 (FC) Literales: true, false En realidad, cualquier nmero distinto de 0 es equivalente a true y el nmero 0 es equivalente a false
LuisHernndezYez
01 02 03 04 05 06 07 08 09 ...
Fundamentosdelaprogramacin:TiposeinstruccionesI(Anexo)
Pgina 221
Cadenas de caracteres
"Hola", "Introduceelnumerador:", "X142FG5TX?%A"
" Carcter "
Secuencias de caracteres Se asigna la memoria que se necesita para la secuencia concreta Requieren la biblioteca string con el espacio de nombres std: #include<string> usingnamespacestd;
LuisHernndezYez
Ojo! Las comillas tipogrficas (apertura/cierre) te darn problemas al compilar. Asegrate de utilizar comillas rectas: ""
Fundamentosdelaprogramacin:TiposeinstruccionesI(Anexo)
Pgina 222
Por defecto un literal entero se considera un dato int longint: 35L, 1546l unsignedint: 35U, 1546u unsignedlongint: 35UL, 1546ul Por defecto un literal real se considera un dato double float: 1.35F, 15.46f longdouble: 1.35L, 15.46l
LuisHernndezYez
LuisHernndezYez
Fundamentosdelaprogramacin
3
Grado en Ingeniera Informtica Grado en Ingeniera del Software Grado en Ingeniera de Computadores Luis Hernndez Yez
LuisHernndezYez
Tipos,valoresyvariables Conversindetipos Tiposdeclaradosporelusuario Tiposenumerados Entrada/Salida conarchivosdetexto Lecturadearchivosdetexto Escrituraenarchivosdetexto Flujodeejecucin Seleccinsimple Operadoreslgicos Anidamientodeif Condiciones Seleccinmltiple Laescalaifelseif Lainstruccinswitch Repeticin Elbuclewhile
227 232 236 238 248 253 266 272 276 282 286 290 293 295 302 313 316
Elbuclefor Buclesanidados mbitoyvisibilidad Secuencias Recorridodesecuencias Secuenciascalculadas Bsquedaensecuencias Arraysdedatossimples Usodevariablesarrays Recorridodearrays Bsquedaenarrays Arraysnocompletos
321 331 339 349 355 363 370 374 379 382 387 393
Fundamentosdelaprogramacin:TiposeinstruccionesII
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 227
Tipo Conjunto de valores con sus posibles operaciones Valor Conjunto de bits interpretados como de un tipo concreto Variable (o constante) Cierta memoria con nombre para valores de un tipo Declaracin Instruccin que identifica un nombre Definicin Declaracin que asigna memoria a una variable o constante
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 228
Memoria suficiente para su tipo de valores shortinti=3; int j=9; char c='a'; double x=1.5;
i j c a x 1.5 3 9
LuisHernndezYez
El significado de los bits depende del tipo de la variable: 00000000000000000000000001111000 Interpretado como int es el entero 120 Interpretado como char (slo 01111000) es el carcter 'x'
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 229
Simples
Estndar: int, float, double, char, bool Conjunto de valores predeterminado Definidos por el usuario: enumerados Conjunto de valores definido por el programador
Estructurados (Tema 5)
Colecciones homogneas: arrays Todos los elementos de la coleccin de un mismo tipo Colecciones heterogneas: estructuras Elementos de la coleccin de tipos distintos
LuisHernndezYez
Fundamentosdeprogramacin:TiposeinstruccionesII
Pgina 230
Con sus posibles modificadores: [unsigned][short] int longlong int float [long] double char bool Definicin de variables: tipo nombre [=expresin][,...]; Definicin de constantes con nombre: consttipo nombre =expresin;
Fundamentosdelaprogramacin:TiposeinstruccionesII Pgina 231
longint int
LuisHernndezYez
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 232
Promocin de tipos
Dos operandos de tipos distintos: El valor del tipo menor se promociona al tipo mayor shortinti=3; int j=2; double a=1.5,b; b=a+i*j; b=a+3 *2;
LuisHernndezYez
long double
Promocin
b=1.5 +6;
Valor 6 int (4 bytes) double (8 bytes)
Fundamentosdelaprogramacin:TiposeinstruccionesII Pgina 233
Conversin segura: De un tipo menor a un tipo mayor shortint int longint ...
Conversin no segura: int De un tipo mayor a un tipo menor short int intentero=1234; char caracter; caracter =entero;//Conversinnosegura Menor memoria: Prdida de informacin en la conversin
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 234
Fuerzan una conversin de tipo: tipo(expresin) El valor resultante de la expresin se trata como un valor del tipo
int a=3,b=2; cout<<a/b;//Muestra1(divisinentera) cout<<double(a)/b;//Muestra1.5(divisinreal)
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 235
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 236
Describimos los valores de las variables del tipo typedefdescripcinnombre_de_tipo; Identificador vlido
Nombres de tipos propios: t minscula seguida de una o varias palabras capitalizadas Los colorearemos en naranja, para remarcar que son tipos typedefdescripcintMiTipo; typedefdescripcintMoneda; typedefdescripcintTiposDeCalificacion;
LuisHernndezYez
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 238
Enumeracin del conjunto de valores posibles para las variables: enum {smbolo1,smbolo2,...,smboloN }
enum { Identificador , }
enum {centimo,dos_centimos,cinco_centimos, diez_centimos,veinte_centimos, medio_euro,euro } Valores literales que pueden tomar las variables (en amarillo)
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 239
Mejoran la legibilidad
typedefdescripcinnombre_de_tipo; Elegimos un nombre para el tipo: tMoneda
LuisHernndezYez
En el mbito de la declaracin, se reconoce un nuevo tipo tMoneda tMoneda moneda1,moneda2; Cada variable de ese tipo contendr alguno de los smbolos moneda1=dos_centimos; moneda2=euro;
moneda1 (Internamente se usan enteros)
Fundamentosdelaprogramacin:TiposeinstruccionesII
dos_centimos euro
Pgina 240
moneda2
Lectura de la variable mes: cin>>mes; Se espera un valor entero No se puede escribir directamente enero o junio Y si se escribe la variable en la pantalla: cout<<mes;
LuisHernndezYez
typedefenum {enero,febrero,marzo,abril,mayo,junio,julio, agosto,septiembre,octubre,noviembre,diciembre} tMes; int op; cout<<"1 Enero" <<endl; cout<<"2 Febrero" <<endl; cout<<"3 Marzo" <<endl; cout<<"4 Abril" <<endl; cout<<"5 Mayo" <<endl; cout<<"6 Junio" <<endl; cout<<"7 Julio" <<endl; cout<<"8 Agosto" <<endl; cout<<"9 Septiembre" <<endl; cout<<"10 Octubre" <<endl; cout<<"11 Noviembre" <<endl; cout<<"12 Diciembre" <<endl; cout<<"Numerodemes:"; cin>>op; tMes mes=tMes(op 1);
Fundamentosdelaprogramacin:TiposeinstruccionesII Pgina 242
LuisHernndezYez
LuisHernndezYez
#include<iostream> usingnamespacestd;
Si los tipos se usan en varias funciones, los declaramos antes de los prototipos
typedef enum{enero,febrero,marzo,abril,mayo, junio,julio,agosto,septiembre,octubre, noviembre,diciembre }tMes; typedef enum {lunes,martes,miercoles,jueves, viernes,sabado,domingo }tDiaSemana; string cadMes(tMes mes); string cadDia(tDiaSemana dia); int main(){ tDiaSemana hoy=lunes; int dia =21; tMes mes=octubre; int anio =2013; ...
Fundamentosdelaprogramacin:TiposeinstruccionesII Pgina 245
LuisHernndezYez
//Mostramoslafecha cout<<"Hoyes:" <<cadDia(hoy)<<"" <<dia <<"de" <<cadMes(mes)<<"de"<<anio <<endl; cout<<"Pasadalamedianoche..."<<endl; dia++; inti=int(hoy); i++; hoy=tDiaSemana(i); //Mostramoslafecha cout<<"Hoyes:" <<cadDia(hoy)<<"" <<dia <<"de" <<cadMes(mes)<<"de"<<anio <<endl; return 0; }
Fundamentosdelaprogramacin:TiposeinstruccionesII Pgina 246
LuisHernndezYez
fechas.cpp string cadMes(tMes mes){ string cad; if (mes==enero){ cad ="enero"; } if (mes==febrero){ cad ="febrero"; } ... if (mes==diciembre){ cad ="diciembre"; }
LuisHernndezYez
string cadDia(tDiaSemana dia); string cad; if (dia ==lunes){ cad ="lunes"; } if (dia ==martes){ cad ="martes"; } ... if (dia ==domingo){ cad ="domingo"; } return cad; }
return cad; }
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 247
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 248
Datos del programa: en la memoria principal (voltil) Medios (dispositivos) de almacenamiento permanente: Discos magnticos fijos (internos) o porttiles (externos) Cintas magnticas Discos pticos (CD, DVD, BlueRay) Memorias USB Mantienen la informacin en archivos Secuencias de datos
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 249
Los archivos se manejan en los programas por medio de flujos Archivos de texto: flujos de texto Similar a la E/S por consola
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 250
Textos dispuestos en sucesivas lneas Carcter de fin de lnea entre lnea y lnea (Intro) Posiblemente varios datos en cada lnea Ejemplo: Compras de los clientes En cada lnea, NIF del cliente, unidades compradas, precio unitario y descripcin de producto, separados por espacio 12345678F2123.95ReproductordeDVD 00112233A1218.4Discoporttil 32143567J332MemoriaUSB16Gb 76329845H1134.5ModemADSL ... Normalmente terminan con un dato especial (centinela) Por ejemplo, un NIF que sea X
Fundamentosdelaprogramacin:TiposeinstruccionesII Pgina 251
LuisHernndezYez
#include<fstream>
Lectura del archivo: flujo de entrada Escritura en el archivo: flujo de salida No podemos leer y escribir en un mismo flujo Un flujo de texto se puede utilizar para lectura o para escritura:
Flujos (archivos) de entrada: variables de tipo ifstream Flujos (archivos) de salida : variables de tipo ofstream
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 252
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 253
ifstream
2 Asocia la variable con el archivo de texto (apertura del archivo) 3 Realiza las operaciones de lectura 4 Desliga la variable del archivo de texto (cierre el archivo)
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 254
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 255
Operaciones de lectura
Extractor (>>) archivo>>variable; Salta primero los espacios en blanco (espacio, tab, Intro, ...) Datos numricos: lee hasta el primer carcter no vlido Cadenas (string): lee hasta el siguiente espacio en blanco archivo.get(c) Lee el siguiente carcter en la variable c, sea el que sea getline(archivo,cadena) Lee en la cadena todos los caracteres que queden en la lnea Incluidos los espacios en blanco Hasta el siguiente salto de lnea (descartndolo) Con los archivos no tiene efecto la funcin sync()
Fundamentosdelaprogramacin:TiposeinstruccionesII Pgina 256
LuisHernndezYez
Qu debo leer?
Un nmero Usa el extractor Un carcter (sea el que sea) Usa la funcin get() Una cadena sin espacios Usa el extractor archivo>>num; archivo.get(c); archivo>>cad;
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 257
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 258
string nif,producto; int unidades; double precio; char aux; 1 ifstream archivo; 2 archivo.open("compras.txt");//Apertura 3 archivo>>nif >>unidades>>precio; getline(archivo,producto); 4 archivo.close();//Cierre
LuisHernndezYez 7 6 5 4 3 2 1
Programa
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 259
12345678F2123.95ReproductordeDVD
El extractor salta los espacios
nif 12345678F
LuisHernndezYez
producto
ReproductordeDVD
Espacio
Fundamentosdelaprogramacin:TiposeinstruccionesII Pgina 260
12345678F2123.95ReproductordeDVD
Leemos el espacio (no hacemos nada con l) nif 12345678F
LuisHernndezYez
Pgina 261
Cada lnea, datos de una compra Mostrar el total de cada compra unidades x precio ms IVA (21%) Final: "X" como NIF Bucle de procesamiento: Cada paso del bucle (ciclo) procesa una lnea (compra) Podemos usar las mismas variables en cada ciclo Leer primer NIF Mientras el NIF no sea X: Leer unidades, precio y descripcin Calcular y mostrar el total Leer el siguiente NIF
Fundamentosdelaprogramacin:TiposeinstruccionesII Pgina 262
LuisHernndezYez
#include<iostream> #include<string> usingnamespacestd; #include<fstream> #include<iomanip>//Formatodesalida int main(){ const int IVA=21; string nif,producto; int unidades; double precio,neto,total,iva; char aux; ifstream archivo; int contador=0; archivo.open("compras.txt");//Apertura ...
Fundamentosdelaprogramacin:TiposeinstruccionesII
leer.cpp
LuisHernndezYez
Pgina 263
LuisHernndezYez
if (archivo.is_open()){//Existeelarchivo archivo>>nif;//PrimerNIF while (nif !="X"){ archivo>>unidades>>precio; archivo.get(aux);//Saltaelespacio getline(archivo,producto); contador++; neto=unidades*precio; iva =neto*IVA/100; total=neto+iva; cout<<"Compra" <<contador<<"." <<endl; cout<<"" <<producto<<":" <<unidades <<"x" <<fixed <<setprecision(2) <<precio<<"=" <<neto<<" I.V.A.:" <<iva <<" Total:" <<total<<endl; archivo>>nif;//SiguienteNIF }...
Fundamentosdelaprogramacin:TiposeinstruccionesII Pgina 264
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 265
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 266
ofstream
2 Asocia la variable con el archivo de texto (crea el archivo) 3 Realiza las escrituras por medio del operador << (insertor) 4 Desliga la variable del archivo de texto (cierra el archivo)
Atencin! Si el archivo ya existe, se borra todo lo que hubiera
LuisHernndezYez
int valor=999;
Programa
2 1
! a l o H
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 268
escribir.cpp
#include<iostream> #include<string> usingnamespacestd; #include<fstream> int main(){ string nif,producto; int unidades; double precio; char aux; ofstream archivo; archivo.open("output.txt");//Apertura(creacin)
LuisHernndezYez
LuisHernndezYez
while (nif !="X"){ //QuedapendienteelIntroanterior... cin.get(aux);//LeemoselIntro cout<<"Producto:"; getline(cin,producto); cout<<"Unidades:"; cin>>unidades; cout<<"Precio:"; cin>>precio; //Escribimoslosdatosenunalneadelarchivo... //Conunespaciodeseparacinentreellos archivo<<nif <<"" <<unidades<<"" <<precio<<"" <<producto<<endl; cout<<"NIFdelcliente(Xparaterminar):"; cin>>nif; } ...
Fundamentosdelaprogramacin:TiposeinstruccionesII Pgina 270
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 271
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 272
Flujo de ejecucin
LuisHernndezYez
return 0; }
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 273
true
Condicin
false
false true
InstruccinT
InstruccinF
if
LuisHernndezYez
true false
Pgina 274
Inicializacin
Iterar?
No
Cdigo
LuisHernndezYez
while
Fundamentosdelaprogramacin:TiposeinstruccionesII
for
Pgina 275
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 276
La instruccin if
if (condicin){ cdigoT } [else { cdigoF }]
true
BloqueT Condicin
false
BloqueF Opcional
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 277
signo.cpp
int num; cin>>num; if (num<0){ cout<<"Negativo"; } cin>>num; else{ false true cout<<"Positivo"; num<0 } cout<<"Negativo"; cout<<"Positivo"; cout<<endl;
LuisHernndezYez
cout<<endl;
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 278
cin>>num;
false
num 129 ?
cout<<endl;
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 279
5 Negativo
cin>>num;
cout<<"Negativo";
LuisHernndezYez
cout<<endl;
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 280
divisin.cpp
Divisin entre dos nmeros protegida frente a intento de divisin por 0 #include<iostream> usingnamespacestd; int main(){ double numerador,denominador,resultado; cout<<"Numerador:"; cin>>numerador; cout<<"Denominador:"; cin>>denominador; if (denominador==0){ cout<<"Imposibledividirentre0!"; } else{ resultado=numerador/denominador; cout<<"Resultado:" <<resultado<<endl; } return 0; }
Fundamentosdelaprogramacin:TiposeinstruccionesII Pgina 281
LuisHernndezYez
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 282
! && ||
NO Y O
LuisHernndezYez
&& ||
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 283
|| true false
NO (Not)
Y (And)
O (Or)
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 284
condiciones.cpp #include<iostream> usingnamespacestd; int main() { int num; cout<<"Introduceunnmeroentre1y10:"; cin>>num; if ((num>=1)&&(num<=10)){ cout<<"Nmerodentrodelintervalodevaloresvlidos"; } else{ cout<<"Nmeronovlido!"; } Condiciones equivalentes return 0; ((num >=1)&&(num <=10)) }
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 286
diasmes.cpp int mes,anio,dias; cout<<"Nmerodemes:"; cin>>mes; cout<<"Ao:"; cin>>anio; if (mes==2){ if (bisiesto(mes,anio)){ dias =29; } else { dias =28; } } else{ if ((mes==1)||(mes==3)||(mes==5)||(mes==7) ||(mes==8)||(mes==10)||(mes==12)){ dias =31; } else{ dias =30; } }
Fundamentosdelaprogramacin:TiposeinstruccionesII Pgina 287
LuisHernndezYez
Calendario Gregoriano: bisiesto si divisible por 4, excepto el ltimo de cada siglo (divisible por 100), salvo que sea divisible por 400
bool bisiesto(int mes,int anio){ bool esBisiesto; if ((anio %4)==0){//Divisiblepor4 if (((anio %100)==0)&&((anio %400)!=0)){ //Peroltimodesigloynomltiplode400 esBisiesto =false; } else { esBisiesto =true;//Aobisiesto } } else { esBisiesto =false; } return esBisiesto; }
Fundamentosdelaprogramacin:TiposeinstruccionesII Pgina 288
LuisHernndezYez
Cada else se asocia al if anterior ms cercano sin asociar (mismo bloque) if (condicin1){ if (condicin2){...} else {...} } else{ if (condicin3){ if (condicin4){...} if (condicin5){...} else {...} } else {... Una mala sangra puede confundir
if (x>0){ if (y>0){...} else {...}
LuisHernndezYez
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 290
Condicin simple:
num<0 car=='a' isalpha(car) 12
Compatibilidad con el lenguaje C: 0 es equivalente a false Cualquier valor distinto de 0 es equivalente a true
LuisHernndezYez
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 292
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 293
LuisHernndezYez
ifelseif switch
Fundamentosdelaprogramacin:TiposeinstruccionesII Pgina 294
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 295
Si nota==10 entonces MH si no, si nota>=9 entonces SB si no, si nota>=7 entonces NT si no, si nota>=5 entonces AP
LuisHernndezYez
cout<<"SB"
cout<<"NT"
cout<<"AP" cout<<"SS"
si no SS
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 296
nota.cpp double nota; cin>>nota; if (nota==10){ cout<<"MH"; } else { if (nota>=9){ cout<<"SB"; } else { if (nota>=7){ cout<<"NT"; } else { if (nota>=5){ cout<<"AP"; } else { cout<<"SS"; } } } }
Fundamentosdelaprogramacin:TiposeinstruccionesII
LuisHernndezYez
double nota; cin>>nota; if (nota==10){ cout<<"MH"; } else if (nota>=9){ cout<<"SB"; } else if (nota>=7){ cout<<"NT"; } else if (nota>=5){ cout<<"AP"; } else{ cout<<"SS"; }
Pgina 297
Pgina 298
LuisHernndezYez
No se ejecutan nunca! double nota; cin>>nota; if (nota>=5){cout<<"AP";} else if (nota>=7){cout<<"NT";} else if (nota>=9){cout<<"SB";} else if (nota==10){cout<<"MH";} else {cout<<"SS";} Slo muestra AP o SS
Fundamentosdelaprogramacin:TiposeinstruccionesII
9 SB 10 MH
LuisHernndezYez
nivel.cpp #include<iostream> Sinum==4 entoncesMuyalto usingnamespacestd; Sinum==3 entoncesAlto int main(){ Sinum==2 entoncesMedio int num; cout<<"Introduceelnivel:"; Sinum==1 entoncesBajo cin>>num; if (num==4){ cout<<"Muyalto" <<endl; } elseif (num==3){ cout<<"Alto" <<endl; } elseif (num==2){ cout<<"Medio" <<endl; } elseif (num==1){ cout<<"Bajo" <<endl; } else{ cout<<"Valornovlido" <<endl; } return 0; }
Fundamentosdelaprogramacin:TiposeinstruccionesII Pgina 300
LuisHernndezYez
if (num==4){cout<<"Muyalto" <<endl;} elseif (num==3){cout<<"Alto" <<endl;} elseif (num==2){cout<<"Medio" <<endl;} elseif (num==1){cout<<"Bajo" <<endl;} elsecout<<"Valornovlido" <<endl;}
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 301
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 302
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 303
nivel2.cpp
switch (num){ case 4: { cout<<"Muyalto"; } break; case 3: { cout<<"Alto"; } break; case 2: { cout<<"Medio"; } break; case 1: { cout<<"Bajo"; } break; default: { cout<<"Valornovlido"; } }
Fundamentosdelaprogramacin:TiposeinstruccionesII
LuisHernndezYez
Pgina 304
Num:3 Alto
LuisHernndezYez
Pgina 305
LuisHernndezYez
switch (num){ ... case 3: { cout<<"Alto"; } case 2: { cout<<"Medio"; } case 1: { cout<<"Bajo"; } default: { cout<<"Valornovlido"; } }
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 306
true
num==4 Muyalto break; Sin break;
false true
num==3
false true
num==2
false true
num==1
break;
false
LuisHernndezYez
default
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 307
int menu(){ int op =1;//Cualquieranovlida while ((op <0)||(op >4)){ cout<<"1 Nuevocliente" <<endl; cout<<"2 Editarcliente" <<endl; cout<<"3 Bajacliente" <<endl; cout<<"4 Vercliente" <<endl; cout<<"0 Salir" <<endl; cout<<"Opcin:"; cin>>op; if ((op <0)||(op >4)){ cout<<"Opcinnovlida!"<<endl; } } return op; }
Fundamentosdelaprogramacin:TiposeinstruccionesII
1 Nuevocliente 2 Editarcliente 3 Bajacliente 4 Vercliente 0 Salir Opcin:5 Opcinnovlida! 1 Nuevocliente 2 Editarcliente 3 Bajacliente 4 Vercliente 0 Salir Opcin:3
LuisHernndezYez
Pgina 308
LuisHernndezYez
int opcion; ... opcion =menu(); switch (opcion){ case 1: { cout<<"Enlaopcin1..." <<endl; } break; case 2: { cout<<"Enlaopcin2..." <<endl; } break; case 3: { cout<<"Enlaopcin3..." <<endl; } break; case 4: { cout<<"Enlaopcin4..." <<endl; }//Enlaltimanonecesitamosbreak }
Fundamentosdelaprogramacin:TiposeinstruccionesII Pgina 309
LuisHernndezYez
int opcion; ... opcion =menu(); while (opcion!=0){ switch (opcion){ case 1: { cout<<"Enlaopcin1..." <<endl; } break; ... case 4: { cout<<"Enlaopcin4..." <<endl; } } //switch ... opcion =menu(); } //while
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 310
nota2.cpp int nota;//Sindecimales cout<<"Nota(010):"; cin>>nota; switch (nota){ case 0: case 1: case 2: case 3: case 4: { cout<<"Suspenso"; } break;//De0a4:SS case 5: case 6: { cout<<"Aprobado"; } break; //5o6:AP
Fundamentosdelaprogramacin:TiposeinstruccionesII
case case {
7: 8:
LuisHernndezYez
Pgina 311
LuisHernndezYez
typedefenum {enero,febrero,marzo,abril,mayo,junio, julio,agosto,septiembre,octubre,noviembre,diciembre} tMes; tMes mes; ... switch (mes){ case enero: { cout<<"enero"; } break; case febrero: { cout<<"febrero"; } break; ... case diciembre: { cout<<"diciembre"; } }
Fundamentosdelaprogramacin:TiposeinstruccionesII Pgina 312
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 313
Inicializacin
S Cuerpo
Iterar?
No
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 314
Bucle while while(condicin)cuerpo Ejecuta el cuerpo mientras la condicin sea true Bucle dowhile Comprueba la condicin al final (lo veremos ms adelante)
LuisHernndezYez
Bucle for for(inicializacin;condicin;paso)cuerpo Ejecuta el cuerpo mientras la condicin sea true Se usa una variable contadora entera
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 315
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 316
while.cpp
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 317
true Cuerpo
Condicin
false
_ 1
false
2 3 99 100
cout<<i<<endl;
LuisHernndezYez
i++
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 318
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 319
primero.cpp
Empezamosen1 Incrementamosen1
LuisHernndezYez
sumamedia.cpp #include<iostream> Recorre la secuencia usingnamespacestd; de nmeros introducidos int main(){ double num,suma=0,media=0; int cont =0; cout<<"Introduceunnmero(0paraterminar):"; cin>>num; Leemoselprimero while(num!=0){//0paraterminar suma=suma+num; cont++; cout<<"Introduceunnmero(0paraterminar):"; cin>>num; Leemoselsiguiente } if (cont >0){ media=suma/cont; } cout<<"Suma="<<suma<<endl; cout<<"Media="<<media<<endl; return 0; }
Fundamentosdelaprogramacin:TiposeinstruccionesII Pgina 321
LuisHernndezYez
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 322
1,2,3,4,5,...,100 100,99,98,97,...,1
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 323
for(inicializacin;condicin;paso)cuerpo
true
i<=100
false
cout<<i;
LuisHernndezYez
i++
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 324
for1.cpp
...
true
i=1
i<=100 false
1 2 3 99 100
cout<<i<<endl; i++
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 325
La variable contadora
El paso no tiene porqu ir de uno en uno: for(int i=1;i<=100;i=i+2) cout<<i<<endl; Este bucle for muestra los nmeros impares de 1 a 99
for2.cpp
Muy importante El cuerpo del bucle NUNCA debe alterar el valor del contador
Garanta de terminacin
LuisHernndezYez
Todo bucle debe terminar su ejecucin Bucles for: la variable contadora debe converger al valor final
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 326
suma.cpp #include<iostream> usingnamespacestd; longlong int suma(intn); int main(){ int num; cout<<"Nmerofinal:"; cin>>num; if (num>0){//Elnmerodebeserpositivo cout<<"Lasumadelosnmerosentre1y" <<num<<"es:" <<suma(num); } return 0; } longlong int suma(int n){ longlong int total=0; for(int i=1;i<=n;i++){ total=total+i; } Recorre la secuencia de nmeros return total; 1, 2, 3, 4, 5, ..., n }
Fundamentosdelaprogramacin:TiposeinstruccionesII Pgina 327
LuisHernndezYez
Bucles infinitos
for(int i=1;i<=100;i)... 101234567891011... Cada vez ms lejos del valor final (100) Es un error de diseo/programacin
Fundamentosdelaprogramacin:TiposeinstruccionesII Pgina 328
LuisHernndezYez
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 329
Los bucles for se pueden reescribir como bucles condicionados for(int i=1;i<=100;i++)cuerpo Es equivalente a: int i=1; while(i<=100){ cuerpo i++; } La inversa no es siempre posible:
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 331
Un bucle for en el cuerpo de otro bucle for Cada uno con su propia variable contadora: for(int i=1;i<=100;i++){ for(int j=1;j<=5;j++){ cuerpo } } Para cada valor de i el valor de j vara entre 1 y 5
LuisHernndezYez
i 1 1 1 1 1 2 2 2 2 2 3 ...
j 1 2 3 4 5 1 2 3 4 5 1
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 332
tablas.cpp
#include<iostream> usingnamespacestd; #include<iomanip> int main(){ for(int i=1;i<=10;i++){ for(int j=1;j<=10;j++){ cout<<setw(2)<<i<<"x" <<setw(2)<<j<<"=" <<setw(3)<<i*j<<endl; } }
LuisHernndezYez
1x1=1 1x2=2 1x3=3 1x4=4 ... 1x10=10 2x1=2 2x2=4 ... 10x7=70 10x8=80 10x9=90 10x10=100
return 0; }
Fundamentosdelaprogramacin:TiposeinstruccionesII Pgina 333
tablas2.cpp
#include<iostream> usingnamespacestd; #include<iomanip> int main(){ for(int i=1;i<=10;i++){ cout<<"Tabladel"<<i<<endl; cout<<""<<endl; for(int j=1;j<=10;j++){ cout<<setw(2)<<i<<"x" <<setw(2)<<j<<"=" <<setw(3)<<i*j<<endl; } cout<<endl; } return 0; }
Fundamentosdelaprogramacin:TiposeinstruccionesII Pgina 334
LuisHernndezYez
men.cpp #include<iostream> usingnamespacestd; #include<iomanip> int menu();//1:Tablasdemultiplicacin;2:Sumatorio longlong intsuma(int n);//Sumatorio int main(){ int opcion=menu(); while (opcion!=0){ switch (opcion){ case 1: { for(int i=1;i<=10;i++){ for(int j=1;j<=10;j++){ cout<<setw(2)<<i<<"x" <<setw(2)<<j<<"=" <<setw(3)<<i*j<<endl; } } } break;...
Fundamentosdelaprogramacin:TiposeinstruccionesII Pgina 335
LuisHernndezYez
case 2: { int num=0; while (num<=0){ cout<<"Hasta(positivo)?"; cin>>num; } cout<<"Lasumadelosnmerosdel1al" <<num<<"es:"<<suma(num)<<endl; } }//switch opcion =menu(); }//while(opcion!=0) return 0; }
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 336
LuisHernndezYez
int menu(){ int op =1; while ((op <0)||(op >2)){ cout<<"1 Tablasdemultiplicar" <<endl; cout<<"2 Sumatorio" <<endl; cout<<"0 Salir" <<endl; cout<<"Opcin:" <<endl; cin>>op; if ((op <0)||(op >2)){ cout<<"Opcinnovlida!"<<endl; } } return op; } longlong int suma(int n){ longlong int total=0; for(int i=1;i<=n;i++){ total=total+i; } return total; }
Fundamentosdelaprogramacin:TiposeinstruccionesII Pgina 337
LuisHernndezYez
while (opcion!=0){ ... for(int i=1;i<=10;i++){ for(int j=1;j<=10;j++){ ... } } while (num<=0){ ... suma() } for(int i=1;i<=n;i++){ ... } while ((op <0)||(op >2)){ ... } menu() }
Fundamentosdelaprogramacin:TiposeinstruccionesII Pgina 338
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 339
Cada bloque crea un nuevo mbito: int main(){ double d=1,suma=0; 3 mbitos anidados int cont=0; while(d!=0) { cin>>d; if(d!=0){ suma=suma+d; cont++; } } cout<<"Suma="<<suma<<endl; cout<<"Media="<<suma/cont<<endl; return 0; }
Fundamentosdelaprogramacin:TiposeinstruccionesII Pgina 340
LuisHernndezYez
Un identificador se conoce en el mbito en el que est declarado (a partir de su instruccin de declaracin) y en los submbitos posteriores
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 341
LuisHernndezYez
int main(){ mbito de la variable d double d; if(...){ int cont=0; for(int i=0;i<=10;i++){ ... } } char c; if(...){ double x; ... } return 0; }
Fundamentosdelaprogramacin:TiposeinstruccionesII Pgina 342
LuisHernndezYez
int main(){ double d; if(...){ mbito de la variable cont int cont=0; for(int i=0;i<=10;i++){ ... } } char c; if(...){ double x; ... } return 0; }
Fundamentosdelaprogramacin:TiposeinstruccionesII Pgina 343
LuisHernndezYez
int main(){ double d; if(...){ int cont=0; for(int i=0;i<=10;i++){ ... } mbito de la variable i } char c; if(...){ double x; ... } return 0; }
Fundamentosdelaprogramacin:TiposeinstruccionesII Pgina 344
LuisHernndezYez
int main(){ double d; if(...){ int cont=0; for(int i=0;i<=10;i++){ ... } } char c; if(...){ mbito de la variable c double x; ... } return 0; }
Fundamentosdelaprogramacin:TiposeinstruccionesII Pgina 345
LuisHernndezYez
int main(){ double d; if(...){ int cont=0; for(int i=0;i<=10;i++){ ... } } char c; if(...){ double x; ... mbito de la variable x } return 0; }
Fundamentosdelaprogramacin:TiposeinstruccionesII Pgina 346
Si en un submbito se declara un identificador con idntico nombre que uno ya declarado en el mbito, el del submbito oculta al del mbito (no es visible)
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 347
LuisHernndezYez
int main(){ Oculta , en su mbito, a la i anterior int i,x; if(...){ Oculta , en su mbito, a la i anterior int i=0; for(int i=0;i<=10;i++){ ... } } char c; if(...){ Oculta , en su mbito, a la x anterior double x; ... } return 0; }
Fundamentosdelaprogramacin:TiposeinstruccionesII Pgina 348
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 349
134122648718452
Comienza en un primer elemento (si no est vaca) A cada elemento le sigue otra secuencia (vaca, si es el ltimo) Acceso secuencial (lineal) Se comienza siempre accediendo al primer elemento Desde un elemento slo se puede acceder a su elemento siguiente (sucesor), si es que existe Todos los elementos, de un mismo tipo
Fundamentosdelaprogramacin:TiposeinstruccionesII Pgina 350
LuisHernndezYez
Sucesin de datos de un dispositivo (teclado, disco, sensor, ...) Frmula de recurrencia que determina el elemento siguiente
Secuencias calculadas:
Listas (ms adelante) Secuencias explcitas que manejaremos: Datos introducidos por el teclado o ledos de un archivo
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 351
Secuencia explcita leda de archivo: Detectar la marca de final de archivo (Eof End of file) Detectar un valor centinela al final Secuencia explcita leda del teclado: Preguntar al usuario si quiere introducir un nuevo dato Preguntar al usuario primero cuntos datos va a introducir Detectar un valor centinela al final Valor centinela: Valor especial al final que no puede darse en la secuencia (Secuencia de nmeros positivos centinela: cualquier negativo)
12 4 37 23 8 19 83 63 2 35 17 76 15 1
Pgina 352
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII
Debe haber algn valor que no sea un elemento vlido Secuencias numricas: Si se permite cualquier nmero, no hay centinela posible Cadenas de caracteres: Caracteres especiales (no imprimibles)? En realidad el valor centinela es parte de la secuencia, pero su significado es especial y no se procesa como el resto Significa que se ha alcanzado el final de la secuencia (Incluso aunque haya elementos posteriores)
ltimo elemento
LuisHernndezYez
12
37 23
19 83 63 1 35 17 76 15 No se procesan
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 353
Recorrido
Un mismo tratamiento para todos los elementos de la secuencia Ej. Mostrar los elementos de una secuencia, sumar los nmeros de una secuencia, par o impar cada nmero de una secuencia?, ... Termina al llegar al final de la secuencia
Bsqueda
Recorrido de la secuencia hasta encontrar un elemento buscado Ej. Localizar el primer nmero que sea mayor que 1.000 Termina al localizar el primer elemento que cumple la condicin o al llegar al final de la secuencia (no encontrado)
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 354
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 355
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 356
Inicializacin
Al final?
true
false
Obtener elemento Procesar elemento
LuisHernndezYez
Finalizacin
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 357
Centinela?
true
false
Procesar elemento Obtener siguiente
LuisHernndezYez
Finalizacin
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 358
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 359
longitud.cpp
LuisHernndezYez
int longitud(){ int l=0; char c; cout<<"Textoterminadoenpunto:"; cin>>c;//Obtenerprimercarcter while(c!='.'){//Mientrasnoelcentinela l++;//Procesar cin>>c;//Obtenersiguientecarcter } return l; }
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 360
LuisHernndezYez
charbuscado,c; intcont =0; cout<<"Carcterabuscar:"; cin>>buscado; cout<<"Cadena:"; cin>>c; Primer elemento while(c!='*'){ Mientras no el centinela if(c==buscado){ Procesar elemento cont++; } Siguiente elemento cin>>c; } cout<<buscado<<"aparece" <<cont <<"veces.";
Fundamentosdelaprogramacin:TiposeinstruccionesII Pgina 361
suma2.cpp
LuisHernndezYez
intsumaSecuencia(){ doubled,suma=0; ifstreamarchivo;//Archivodeentrada(lectura) archivo.open("datos.txt"); if (archivo.is_open()){ archivo>>d;//Obtenerelprimero while(d!=0){//Mientrasnoseaelcentinela suma=suma+d; //Procesareldato archivo>>d;//Obtenerelsiguiente } archivo.close(); } return suma; }
Fundamentosdelaprogramacin:TiposeinstruccionesII Pgina 362
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 363
sumatorio.cpp
Recurrencia:
ei+1 = ei + 1
e1 = 1
LuisHernndezYez
n sumatorio i
5 ? 15 10 1 0 3 6
i<=n
2 5 4 1 3 6 24 1 3 4 5 13 2 3 12 2 11
false
true
sumatorio+=i; i=i+1;
LuisHernndezYez
Secuencia
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 365
Definicin
Fi = Fi1 + Fi2 F1 = 0 F2 = 1 01123581321345589...
Fin de la secuencia?
Primer nmero de Fibonacci mayor que un nmero dado Ese nmero de Fibonacci acta como centinela Si num es 50, la secuencia ser: 0112358132134
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 366
fibonacci.cpp
LuisHernndezYez
01 1 2 3 5 ...
5 2 3 1 ? 3 1 2 ? 2 1 0 ?
fibMenos1 fibMenos2
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 368
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 369
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 370
Al final o encontrado?
false
Finalizacin
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 371
Encontrado o centinela?
true
false
Obtener siguiente
LuisHernndezYez
Finalizacin
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 372
busca.cpp
LuisHernndezYez
doubled,num; boolencontrado=false; cout<<"Encontrarprimeromayorque:"; cin>>num; cout<<"Siguiente(1paraterminar):"; cin>>d; //Obtenerelprimerelemento while((d!=1)&&!encontrado){ //Mientrasnoseaelcentinelaynoseencuentre if(d>num){ //Encontrado? encontrado=true; } else{ cout<<"Siguiente(1paraterminar):"; cin>>d; //Obtenerelsiguienteelemento } }
Fundamentosdelaprogramacin:TiposeinstruccionesII Pgina 373
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 374
Colecciones homogneas
Un mismo tipo de dato para varios elementos: Notas de los estudiantes de una clase Ventas de cada da de la semana Temperaturas de cada da del mes ... En lugar de declarar N variables...
vLun 125.40
LuisHernndezYez
vMar 76.95
vMie 328.80
vJue 254.62
vVie 435.00
vSab 164.29
vDom 0.00
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 375
Estructura secuencial
Cada elemento se encuentra en una posicin (ndice): Los ndices son enteros positivos El ndice del primer elemento siempre es 0 Los ndices se incrementan de uno en uno
ventas 125.40
0 76.95 1 328.80 254.62 435.00 164.29 2 3 4 5 0.00 6
LuisHernndezYez
Acceso directo A cada elemento se accede a travs de su ndice: ventas[4] accede al 5 elemento (contiene el valor 435.00)
cout<<ventas[4]; ventas[4]=442.75;
Datos de un mismo tipo base: Se usan como cualquier variable
Pgina 376
Fundamentosdelaprogramacin:TiposeinstruccionesII
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 377
tempMax ? ? ? ? ? ? ?
0 1 2 3 4 5 6
diasMes ? ? ? ? ? ? ? ? ? ? ? ?
0 1 2 3 4 5 6 7 8 9 10 11
vocales ? ? ? ? ?
0 1 2 3 ... 4
LuisHernndezYez
ventasFeb ? ? ? ? ? ? ? ? ? ? ? ? ?
0 1 2 3 4 5 6 7 8 9 10 11 12
?
30
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 379
'e'
1
'i'
2
'o'
3
'u'
4
5 elementos, ndices de 0 a 4:
vocales[0]vocales[1]vocales[2]vocales[3]vocales[4]
Procesamiento de cada elemento: Como cualquier otra variable del tipo base
cout<<vocales[4];
LuisHernndezYez
vocales[3]='o'; if(vocales[i]=='e')...
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 380
LuisHernndezYez
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 382
Arrays: tamao fijo Bucle de recorrido fijo (for) Ejemplo: Media de un array de temperaturas
const int Dias =7; typedef double tTemp[Dias]; tTemp temp; double media,total=0; ... for(int i=0;i<Dias;i++){ total=total+temp[i]; } media=total/Dias;
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 383
12.40 0
10.96 1
8.43 2
11.65 3
13.70 4
13.41 5
14.07 6
Memoria Dias temp[0] temp[1] temp[2] temp[3] temp[4] 7 12.40 10.96 8.43 11.65 13.70 13.41 14.07 ? 23.36 31.79 84.62 12.40 0.00 43.44 3 0 2 7 4 1
true i<Dias
total+=temp[i]
false
temp[5] temp[6]
...
media total i
LuisHernndezYez
i++
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 384
mediatemp.cpp #include<iostream> usingnamespacestd; const int Dias =7; typedef double tTemp[Dias]; double media(const tTemp temp); int main(){ tTemp temp; for (int i=0;i<Dias;i++){//Recorridodelarray cout<<"Temperaturadelda"<<i+1<<":"; cin>>temp[i]; } cout<<"Temperaturamedia:"<<media(temp)<<endl; return0; } Los usuarios usan de 1 a 7 para numerar los das ... La interfaz debe aproximarse a los usuarios, aunque internamente se usen los ndices de 0 a 6
Fundamentosdelaprogramacin:TiposeinstruccionesII Pgina 385
LuisHernndezYez
double media(consttTemp temp){ double med,total=0; for (int i=0;i<Dias;i++){//Recorridodelarray total=total+temp[i]; } med =total/Dias; returnmed; }
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 386
constint Cuantas=15; typedefenum {centimo,dos_centimos,cinco_centimos, diez_centimos,veinte_centimos,medio_euro,euro }tMoneda; typedef tMoneda tCalderilla[Cuantas]; string aCadena(tMoneda moneda); //Devuelvelacadenacorrespondientealvalordemoneda tCalderilla bolsillo;//ExactamentellevoCuantasmonedas bolsillo[0]=euro; bolsillo[1]=cinco_centimos; bolsillo[2]=medio_euro; bolsillo[3]=euro; bolsillo[4]=centimo; ... for(int moneda=0;moneda<Cuantas;moneda++) cout<<aCadena(bolsillo[moneda])<<endl;
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 387
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 388
buscaarray.cpp
LuisHernndezYez
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 390
La capacidad de un array no puede ser alterada en la ejecucin El tamao de un array es una decisin de diseo: En ocasiones ser fcil (das de la semana) Cuando pueda variar ha de estimarse un tamao Ni corto ni con mucho desperdicio (posiciones sin usar) STL (Standard Template Library) de C++: Colecciones ms eficientes cuyo tamao puede variar
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 391
No se pueden copiar dos arrays (del mismo tipo) con asignacin: array2=array1;//NOCOPIALOSELEMENTOS!!! Han de copiarse los elementos uno a uno: for(int i=0;i<N;i++){ array2[i]=array1[i]; }
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 392
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 393
Puede que no necesitemos todas las posiciones de un array... La dimensin del array ser el mximo de elementos Pero podremos tener menos elementos del mximo Necesitamos un contador de elementos...
constint Max=100; typedef doubletArray[Max]; tArray lista; int contador=0;
LuisHernndezYez
contador: indica cuntas posiciones del array se utilizan Slo accederemos a las posiciones entre 0 y contador1 Las dems posiciones no contienen informacin del programa
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 394
lista.cpp #include<iostream> usingnamespacestd; #include<fstream> const int Max=100; typedef double tArray[Max]; double media(const tArray lista,int cont); int main(){ tArray lista; int contador=0; double valor,med; ifstream archivo; archivo.open("lista.txt"); if (archivo.is_open()){ archivo>>valor; while ((valor!=1)&&(contador<Max)){ lista[contador]=valor; contador++; archivo>>valor; }...
Fundamentosdelaprogramacin:TiposeinstruccionesII Pgina 395
LuisHernndezYez
archivo.close(); med =media(lista,contador); cout<<"Mediadeloselementosdelalista:"<<med <<endl; } else { cout<<"Nosepudoabrirelarchivo!" <<endl; } return 0; } double media(const tArray lista,int cont){ double med,total=0; for (int ind =0;ind <cont;ind++){ total=total+lista[ind]; } med =total/cont; Slo recorremos hasta cont1 return med; }
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 396
LuisHernndezYez
Fundamentosdelaprogramacin
3A
Grado en Ingeniera Informtica Grado en Ingeniera del Software Grado en Ingeniera de Computadores Luis Hernndez Yez
Expresin condicional
Condicin
Exp1
Exp2
Dos alternativas Condicin: Expresin lgica Exp1 y Exp2: Expresiones Si Condicin se evala a true, el resultado es Exp1; si Condicin se evala a false, el resultado es Exp2.
int a=5,b=3,c; c=(a+b==10)?2 :3;
LuisHernndezYez
Operadores(prioridad) ++ (postfijos) Llamadas a funciones Moldes ++ (prefijos) ! (cambio de signo) */% + < <=>>= ==!= && || ?: =+==*=/=%=
c=(8
c=false c=3;
Fundamentosdelaprogramacin:TiposeinstruccionesII(AnexoI)
Pgina 399
Fundamentosdelaprogramacin:TiposeinstruccionesII(AnexoI)
Pgina 400
Si nota==10 entonces MH si no, si nota>=9 entonces SB si no, si nota>=7 entonces NT si no, si nota>=5 entonces AP si no SS
double nota; cin>>nota; if (nota==10){cout<<"MH";} else if (nota>=9){cout<<"SB";} else if (nota>=7){cout<<"NT";} else if (nota>=5){cout<<"AP";} else {cout<<"SS";}
true
==10 "MH"
false true
>=9 "SB"
false true
>=7 "NT"
false true
>=5 "AP"
LuisHernndezYez
false
"SS"
Fundamentosdelaprogramacin:TiposeinstruccionesII(AnexoI)
Pgina 401
Fundamentosdelaprogramacin
3E
Grado en Ingeniera Informtica Grado en Ingeniera del Software Grado en Ingeniera de Computadores Luis Hernndez Yez
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII(AnexoII)
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII(AnexoII)
Pgina 404
Secuencia de caracteres E y S en archivo E = Entra un coche; S = Sale un coche Cuntos coches quedan al final de la jornada? Varios casos, cada uno en una lnea y terminado en punto Final: lnea slo con punto
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII(AnexoII)
Pgina 405
#include<iostream> usingnamespacestd; #include<fstream> int main(){ int coches; char c; bool terminar=false; ifstream archivo; archivo.open("parking.txt"); if (!archivo.is_open()){ cout<<"Nosehapodidoabrirelarchivo!"<<endl; } else { //Recorrido... archivo.close(); } return 0; }
Fundamentosdelaprogramacin:TiposeinstruccionesII(AnexoII) Pgina406
LuisHernndezYez
LuisHernndezYez
while (!terminar){ archivo>>c; if (c=='.'){//.comoprimercarcter?(centinela) terminar=true; } else { coches=0; while (c!='.'){//Recorridodelasecuencia cout<<c; if (c=='E'){ coches++; } elseif(c=='S'){ coches; } archivo>>c; } ...
Fundamentosdelaprogramacin:TiposeinstruccionesII(AnexoII)
Pgina407
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII(AnexoII)
Pgina408
Contador del nivel de anidamiento: Al encontrar '(' incrementamos Al encontrar ')' decrementamos Al terminar, el contador deber tener el valor 0 Errores: Contador 1: parntesis de cierre sin uno de apertura pendiente abc)de(fgh(ij))#
LuisHernndezYez
Contador termina con un valor positivo Ms parntesis de apertura que de cierre Algn parntesis sin cerrar: (a(b(cd(e)f)gh(i))jk#
Fundamentosdelaprogramacin:TiposeinstruccionesII(AnexoII) Pgina 409
LuisHernndezYez
parentesis.cpp if (error){ cout<<"Error:cierresinapertura(pos." <<pos <<")"; } elseif(anidamiento>0){ cout<<"Error:Aperturasincierre"; } else { cout<<"Correcto"; } cout<<endl;
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII(AnexoII)
Pgina 411
iguales.cpp bool iguales(){ bool sonIguales =true; double d1,d2; ifstream sec1,sec2; bool final=false; sec1.open("secuencia1.txt"); sec2.open("secuencia2.txt"); sec1>>d1; sec2>>d2;//Almenosestarnloscentinelas(0) while (sonIguales &&!final){ sonIguales =(d1==d2); final=((d1==0)||(d2==0)); if (!final){ sec1>>d1; sec2>>d2; } } Cambia secuencia2.txt por secuencia3.txt sec1.close(); y por secuencia4.txt para comprobar otros casos sec2.close(); return sonIguales; }
Fundamentosdelaprogramacin:TiposeinstruccionesII(AnexoII) Pgina 412
LuisHernndezYez
primos.cpp
LuisHernndezYez
bool primo(int n){ bool esPrimo =true; for (inti=2;i<=n 1;i++){ if (n%i==0){ esPrimo =false;//Esdivisiblepori } } return esPrimo; }
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII(AnexoII)
Pgina 414
primos2.cpp
Mejoras: probar slo impares; slo pueden ser divisibles por impares; no pueden ser divisibles por ninguno mayor que su mitad
candidato=2; cout<<candidato<<"";//Mostrarelnmeroprimo2 candidato++;//Seguimosconel3,queesprimo while (candidato<num){ cout<<candidato<<"";//Mostrarnmeroprimo candidato=candidato+2;//Sloprobamosimpares while (!primo(candidato)){//Siguientenmeroprimo candidato=candidato+2; } }... bool primo(int n){ bool esPrimo =true; for (int i=3;i<=n/2;i=i+2){ if (n%i==0){ esPrimo =false;//Esdivisiblepori } }...
Fundamentosdelaprogramacin:TiposeinstruccionesII(AnexoII) Pgina 415
LuisHernndezYez
primos3.cpp
Fundamentosdelaprogramacin:TiposeinstruccionesII(AnexoII)
Pgina 416
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII(AnexoII)
Pgina 417
buscaarch.cpp
int busca(int n); //Devuelvelalneaenlaqueseencuentrao1sinoest intmain(){ intnum,linea; cout<<"Valoralocalizar:"; cin>>num; linea =busca(num); if(linea !=1){ cout<<"Encontrado(lnea" <<linea <<")" <<endl; } else{ cout<<"Noencontrado" <<endl; } return 0; }
Fundamentosdelaprogramacin:TiposeinstruccionesII(AnexoII) Pgina 418
LuisHernndezYez
int busca(int n){ int i,linea =0; bool encontrado=false; ifstream archivo; archivo.open("enteros.txt"); if (!archivo.is_open()){ linea =1; } else { archivo>>i; while ((i!=0)&&!encontrado){ linea++; if (i==n){ encontrado=true; } archivo>>i; } if (!encontrado){ linea =1; } archivo.close(); } return linea; }
Fundamentosdelaprogramacin:TiposeinstruccionesII(AnexoII)
Centinela
LuisHernndezYez
Pgina 419
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII(AnexoII)
Pgina 420
Secuencia ordenada de menor a mayor: paramos al encontrar uno mayor o igual al buscado
cout<<"Valoralocalizar:"; cin>>num; archivo>>i; while ((i!=0)&&(i<num)){ cont++; archivo>>i; } if (i==num){ cout<<"Encontrado(pos.:" <<cont <<")"; } else { cout<<"Noencontrado"; } cout<<endl; archivo.close();
Fundamentosdelaprogramacin:TiposeinstruccionesII(AnexoII)
buscaord.cpp
LuisHernndezYez
Pgina 421
15
16
24
41
73
78
82
123
153
159
...
archivo>>i;
num
9 ?
(i!=0) &&(i<num)
false
9 5 ? 2
true
cont++; archivo>>i;
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII(AnexoII)
Pgina 422
15
16
24
41
73
78
82
123
153
159
...
archivo>>i;
num
10 ?
(i!=0) &&(i<num)
false
5 2 9 ? 15
true
cont++; archivo>>i;
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII(AnexoII)
Pgina 423
LuisHernndezYez
Fundamentosdelaprogramacin
4
Grado en Ingeniera Informtica Grado en Ingeniera del Software Grado en Ingeniera de Computadores Luis Hernndez Yez
Diseodescendente:Tareasysubtareas Subprogramas Subprogramasydatos Parmetros Argumentos Resultadodelafuncin Prototipos Ejemploscompletos Funcionesdeoperador Diseodescendente(unejemplo) Precondicionesypostcondiciones
427 434 441 446 451 467 473 475 477 480 490
LuisHernndezYez
Fundamentosdelaprogramacin:Laabstraccinprocedimental
LuisHernndezYez
Fundamentosdelaprogramacin:Laabstraccinprocedimental
Pgina 427
Refinamientos sucesivos
Tareas que ha de realizar un programa: Se pueden dividir en subtareas ms sencillas Subtareas: Tambin se pueden dividir en otras ms sencillas... Refinamientos sucesivos Diseo en sucesivos pasos en los se ampla el detalle Ejemplos:
LuisHernndezYez
Fundamentosdelaprogramacin:Laabstraccinprocedimental
Pgina 428
Misma tarea
Fundamentosdelaprogramacin:Laabstraccinprocedimental
Pgina 429
2.2. Dibujar
LuisHernndezYez
Nosbastaconsabercmodibujar:
3. Dibujar
Fundamentosdelaprogramacin:Laabstraccinprocedimental
Pgina 430
Dibujar
Dibujar
Dibujar
Dibujar
Dibujar
Dibujar
void dibujarTriangulo() { dibujarSecantes(); dibujarLinea(); } int main(){ dibujarCirculo(); dibujarTriangulo(); dibujarSecantes(); return 0; }
LuisHernndezYez
Fundamentosdelaprogramacin:Laabstraccinprocedimental
Pgina 431
MostrarHOLA
Espacioenblanco
MostrarMAMA
A Tareas bsicas
LuisHernndezYez
Espacioenblanco
Fundamentosdelaprogramacin:Laabstraccinprocedimental
Pgina 432
void mostrarH(){ cout<<"**" cout<<"**" cout<<"*****" cout<<"**" cout<<"**" } void mostrarO(){ cout<<"*****" cout<<"**" cout<<"**" cout<<"**" cout<<"*****" }
LuisHernndezYez
void espaciosEnBlanco(){ cout<<endl<<endl<<endl; } void mostrarM() {...} int main(){ mostrarH(); mostrarO(); mostrarL(); mostrarA(); espaciosEnBlanco(); mostrarM(); mostrarA(); mostrarM(); mostrarA(); return0;
Fundamentosdelaprogramacin:Laabstraccinprocedimental
Pgina 433
LuisHernndezYez
Fundamentosdelaprogramacin:Laabstraccinprocedimental
Pgina 434
Subprogramas
Pequeos programas dentro de otros programas Unidades de ejecucin independientes Encapsulan cdigo y datos Se comunican con otros subprogramas (datos) Subrutinas, procedimientos, funciones, acciones, ... Realizan tareas individuales del programa Funcionalidad concreta, identificable y coherente (diseo) Se ejecutan de principio a fin cuando se llaman (invocan) Terminan devolviendo el control al punto de llamada
Aumentan el nivel de abstraccin del programa Facilitan la prueba, la depuracin y el mantenimiento
Fundamentosdelaprogramacin:Laabstraccinprocedimental Pgina 435
LuisHernndezYez
Flujo de ejecucin
int main() { mostrarH(); mostrarO(); ... } void mostrarH() { ... }
LuisHernndezYez
Fundamentosdelaprogramacin:Laabstraccinprocedimental
Subprogramas en C++
Forma general de un subprograma en C++:
tipo nombre(parmetros)//Cabecera { //Cuerpo }
Tipo de dato que devuelve el subprograma como resultado Parmetros para la comunicacin con el exterior Cuerpo: Un bloque de cdigo!
LuisHernndezYez
Fundamentosdelaprogramacin:Laabstraccinprocedimental
Pgina 437
Tipos de subprogramas
Procedimientos (acciones): NO devuelven ningn resultado de su ejecucin con return Tipo: void Llamada: instruccin independiente mostrarH(); Funciones: S devuelven un resultado con la instruccin return Tipo distinto de void Llamada: dentro de cualquier expresin x=12*y+cuadrado(20) 3; Se sustituye en la expresin por el valor que devuelve Ya venimos utilizando funciones desde el Tema 2!
Fundamentosdelaprogramacin:Laabstraccinprocedimental Pgina 438
LuisHernndezYez
Funciones
Subprogramas de tipo distinto de void
... int menu() { int op; cout<<"1 Editar"<<endl; cout<<"2 Combinar"<<endl; cout<<"3 Publicar"<<endl; cout<<"0 Cancelar"<<endl; cout<<"Elija:"; cin>>op; returnop; }
LuisHernndezYez
Fundamentosdelaprogramacin:Laabstraccinprocedimental
Pgina 439
Procedimientos
Subprogramas de tipo void
... void menu() { int op; cout<<"1 Editar"<<endl; cout<<"2 Combinar"<<endl; cout<<"0 Cancelar"<<endl; cout<<"Opcin:"; cin>>op; if(op ==1){ editar(); } elseif(op ==2){ combinar(); } }
Fundamentosdelaprogramacin:Laabstraccinprocedimental
LuisHernndezYez
Pgina 440
LuisHernndezYez
Fundamentosdelaprogramacin:Laabstraccinprocedimental
Pgina 441
LuisHernndezYez
Fundamentosdelaprogramacin:Laabstraccinprocedimental
Pgina 442
Tema 3
LuisHernndezYez
#include<iostream> usingnamespace std; const int MAX=100; double ingresos; ... void proc(){ int op; double ingresos; ... } int main(){ int op; ... return 0; } Datos globales op de proc() es distinta de op de main()
Datos locales a proc() Se conocen MAX (global), op (local) e ingresos (local que oculta la global)
LuisHernndezYez
Fundamentosdelaprogramacin:Laabstraccinprocedimental
Pgina 444
Excepciones: Constantes globales (valores inalterables) Tipos globales (necesarios en varios subprogramas)
Fundamentosdelaprogramacin:Laabstraccinprocedimental
Pgina 445
LuisHernndezYez
Fundamentosdelaprogramacin:Laabstraccinprocedimental
Pgina 446
Subprograma x cuadrado() x
Fundamentosdelaprogramacin:Laabstraccinprocedimental
Pgina 447
Declaracin de parmetros
Slo dos clases de parmetros en C++: Slo de entrada (por valor) De salida (slo salida o E/S) (por referencia / por variable)
De salida identificador ,
parmetros
tipo
Fundamentosdelaprogramacin:Laabstraccinprocedimental
Pgina 448
Reciben sus valores en la llamada del subprograma Argumentos: Expresiones en general Variables, constantes, literales, llamadas a funcin, operaciones Se destruyen al terminar la ejecucin del subprograma
LuisHernndezYez
Fundamentosdelaprogramacin:Laabstraccinprocedimental
Pgina 449
&
Misma identidad que la variable pasada como argumento
void incrementa(int&x) void intercambia(double&x,double&y) void proc(char&c,int&x,double&a,bool&b)
Reciben las variables en la llamada del subprograma: Variables! Los argumentos pueden quedar modificados No usaremos parmetros por valor en las funciones! Slo en procedimientos
Puede haber tanto por valor como por referencia
LuisHernndezYez
LuisHernndezYez
Fundamentosdelaprogramacin:Laabstraccinprocedimental
Pgina 451
nombre(argumentos)
Tantos argumentos como parmetros y en el mismo orden Concordancia de tipos argumentoparmetro Por valor: Expresiones vlidas (se pasa el resultado) Por referencia: Slo variables! Se copian los valores de las expresiones pasadas por valor en los correspondientes parmetros Se hacen corresponder los argumentos pasados por referencia (variables) con sus correspondientes parmetros
LuisHernndezYez
Fundamentosdelaprogramacin:Laabstraccinprocedimental
Pgina 452
LuisHernndezYez
Fundamentosdelaprogramacin:Laabstraccinprocedimental
Pgina 453
void proc(int x,double a) {...} int main() { int i=124; double d=3; proc(i,33 *d); ...
LuisHernndezYez
return0; }
Fundamentosdelaprogramacin:Laabstraccinprocedimental
Pgina 454
void proc(int&x,double&a) {...} int main() { int i=124; double d=3; proc(i,d); ...
LuisHernndezYez
return0; }
Fundamentosdelaprogramacin:Laabstraccinprocedimental
Pgina 455
LuisHernndezYez
Parmetro por referencia variable! Argumento double para parmetro int! Argumento double para parmetro int! N de argumentos N de para metros
Fundamentosdelaprogramacin:Laabstraccinprocedimental
Pgina 456
... void divide(int op1,int op2,int&div,int&rem){ //Divideop1entreop2ydevuelveelcocienteyelresto div =op1/op2; rem=op1%op2; } int main(){ int cociente,resto; for (int j=1;j<=4;j++){ for (int i=1;i<=4;i++){ divide(i,j,cociente,resto); cout<<i<<"entre" <<j<<"dauncocientede" <<cociente<<"yunrestode" <<resto<<endl; } } return 0; }
Fundamentosdelaprogramacin:Laabstraccinprocedimental Pgina 457
LuisHernndezYez
... void divide(int op1,int op2,int&div,int&rem){ //Divideop1entreop2ydevuelveelcocienteyelresto div =op1/op2; Memoria rem=op1%op2; } cociente ? int main(){ int cociente,resto; for (int j=1;j<=4;j++){ for (int i=1;i<=4;i++){ divide(i,j,cociente,resto); ... } }
LuisHernndezYez
resto i j ...
? 1 1
return 0; }
Fundamentosdelaprogramacin:Laabstraccinprocedimental
Pgina 458
... void divide(int op1,int op2,int&div,int&rem){ //Divideop1entreop2ydevuelveelcocienteyelresto div =op1/op2; Memoria rem=op1%op2; } ? div cociente int main(){ int cociente,resto; for (int j=1;j<=4;j++){ for (int i=1;i<=4;i++){ divide(i,j,cociente,resto); ... } }
LuisHernndezYez
rem
resto i j ...
? 1 1
1 1
return 0; }
Fundamentosdelaprogramacin:Laabstraccinprocedimental
Pgina 459
... void divide(int op1,int op2,int&div,int&rem){ //Divideop1entreop2ydevuelveelcocienteyelresto div =op1/op2; Memoria rem=op1%op2; } 1 div cociente int main(){ int cociente,resto; for (int j=1;j<=4;j++){ for (int i=1;i<=4;i++){ divide(i,j,cociente,resto); ... } }
LuisHernndezYez
rem
resto i j ...
0 1 1
1 1
return 0; }
Fundamentosdelaprogramacin:Laabstraccinprocedimental
Pgina 460
... void divide(int op1,int op2,int&div,int&rem){ //Divideop1entreop2ydevuelveelcocienteyelresto div =op1/op2; Memoria rem=op1%op2; } cociente 1 int main(){ int cociente,resto; for (int j=1;j<=4;j++){ for (int i=1;i<=4;i++){ divide(i,j,cociente,resto); ... } }
LuisHernndezYez
resto i j ...
0 1 1
return 0; }
Fundamentosdelaprogramacin:Laabstraccinprocedimental
Pgina 461
... void intercambia(double&valor1,double&valor2){ //Intercambialosvalores double tmp;//Variablelocal(temporal) tmp=valor1; Memoriatemporal valor1=valor2; delprocedimiento valor2=tmp; tmp ? }
...
LuisHernndezYez
int main(){ double num1,num2; Memoriademain() cout<<"Valor1:"; cin>>num1; valor1 num1 13.6 cout<<"Valor2:"; valor2 num2 317.14 cin>>num2; ... intercambia(num1,num2); cout<<"Ahoraelvalor1es" <<num1 <<"yelvalor2es" <<num2<<endl; return 0; }
Fundamentosdelaprogramacin:Laabstraccinprocedimental Pgina 462
... //Prototipo void cambio(double precio,double pago,int&euros,int¢50, int¢20, int¢10,int¢5,int¢2,int¢1); int main(){ double precio,pago; int euros,cent50,cent20,cent10,cent5,cent2,cent1; cout<<"Precio:"; cin>>precio; cout<<"Pago:"; cin>>pago; cambio(precio,pago,euros,cent50,cent20,cent10,cent5,cent2, cent1); cout<<"Cambio:" <<euros<<"euros," <<cent50<<"x50c.," <<cent20<<"x20c.," <<cent10<<"x10c.," <<cent5<<"x5c.," <<cent2<<"x2c.y" <<cent1<<"x1c." <<endl; return 0; }
Fundamentosdelaprogramacin:Laabstraccinprocedimental Pgina 463
LuisHernndezYez
LuisHernndezYez
void cambio(double precio,double pago,int&euros,int¢50, int¢20,int¢10,int¢5,int¢2,int¢1){ if (pago<precio){//Cantidadinsuficiente cout<<"Error:Elpagoesinferioralprecio" <<endl; } else { int cantidad=int(100.0 *(pago precio)+0.5); euros=cantidad/100; cantidad=cambio%100; cent50=cantidad/50; cantidad=cantidad%50; Explicacin en el libro de cent20=cantidad/20; Adams/Leestma/Nyhoff cantidad=cantidad%20; cent10=cantidad/10; cantidad=cantidad%10; cent5=cantidad/5; cantidad=cantidad%5; cent2=cantidad/2; cent1=cantidad%2; } }
Fundamentosdelaprogramacin:Laabstraccinprocedimental Pgina 464
En los subprogramas se pueden detectar errores Errores que impiden realizar los clculos:
void cambio(double precio,double pago,int&euros,int¢50, int¢20,int¢10,int¢5,int¢2,int¢1){ if (pago<precio){//Cantidadinsuficiente cout<<"Error:Elpagoesinferioralprecio" <<endl; } ...
Debe el subprograma notificar al usuario o al programa? Mejor notificarlo al punto de llamada y all decidir qu hacer
void cambio(double precio,double pago,int&euros,int¢50, int¢20,int¢10,int¢5,int¢2,int¢1, bool&error){ if (pago<precio){//Cantidadinsuficiente error=true; } else{ error=false; ...
Fundamentosdelaprogramacin:Laabstraccinprocedimental Pgina 465
LuisHernndezYez
cambio.cpp
Al volver de la llamada se decide qu hacer si ha habido error... Informar al usuario? Volver a pedir los datos? Etctera
int main(){ double precio,pago; int euros,cent50,cent20,cent10,cent5,cent2,cent1; bool error; cout<<"Precio:"; cin>>precio; cout<<"Pago:"; cin>>pago; cambio(precio,pago,euros,cent50,cent20,cent10,cent5,cent2, cent1,error); if (error){ cout<<"Error:Elpagoesinferioralprecio" <<endl; } else { ...
Fundamentosdelaprogramacin:Laabstraccinprocedimental Pgina 466
LuisHernndezYez
LuisHernndezYez
Fundamentosdelaprogramacin:Laabstraccinprocedimental
Pgina 467
Fundamentosdelaprogramacin:Laabstraccinprocedimental
Pgina 468
factorial.cpp
Factorial(N)=1x2x3x...x(N2)x(N1)xN
longlong int factorial(int n);//Prototipo int main(){ intnum; cout<<"Num:"; cin>>num; cout<<"Factorialde" <<num<<":" <<factorial(num)<<endl; return 0; } longlong int factorial(int n){ longlong int fact =1; if (n<0){ fact =0; } else{ for (inti=1;i<=n;i++){ fact =fact *i; } } return fact; }
Fundamentosdelaprogramacin:Laabstraccinprocedimental Pgina 469
LuisHernndezYez
int compara(int val1,int val2){ //1sival1<val2,0siiguales,+1sival1>val2 if (val1==val2){ return 0; } elseif (val1<val2){ return 1; 3 puntos de salida! } else{ return 1; } }
LuisHernndezYez
Fundamentosdelaprogramacin:Laabstraccinprocedimental
Pgina 470
int compara(int val1,int val2){ //1sival1<val2,0siiguales,+1sival1>val2 int resultado; if (val1==val2){ resultado=0; } elseif (val1<val2){ resultado=1; } else{ resultado=1; }
LuisHernndezYez
return resultado; }
Pgina 471
Fundamentosdelaprogramacin:Laabstraccinprocedimental
Procedimientos (tipo void): Al encontrar la llave de cierre que termina el subprograma o Al encontrar una instruccin return (sin resultado) Funciones (tipo distinto de void): SLO al encontrar una instruccin return (con resultado) Nuestros subprogramas siempre terminarn al final: No usaremos return en los procedimientos Funciones: slo un return y estar al final
LuisHernndezYez
Para facilitar la depuracin y el mantenimiento, codifica los subprogramas con un nico punto de salida
Fundamentosdelaprogramacin:Laabstraccinprocedimental
Pgina 472
LuisHernndezYez
Fundamentosdelaprogramacin:Laabstraccinprocedimental
Pgina 473
Dnde los ponemos? Antes de main()? Despus de main()? Los pondremos despus de main() Son correctas las llamadas a subprogramas? En main() o en otros subprogramas Existe el subprograma? Concuerdan los argumentos con los parmetros? Deben estar los prototipos de los subprogramas antes de main() Prototipo: cabecera del subprograma terminada en ;
LuisHernndezYez
void dibujarCirculo(); void mostrarM(); void proc(double&a); int cuad(int x); ...
Fundamentosdelaprogramacin:Laabstraccinprocedimental
Pgina 474
intercambia.cpp
#include<iostream> usingnamespace std; void intercambia(double&valor1,double&valor2);//Prototipo int main(){ double num1,num2; Asegrate de que los prototipos cout<<"Valor1:"; cin>>num1; coincidan con las implementaciones cout<<"Valor2:"; cin>>num2; intercambia(num1,num2); cout<<"Ahoraelvalor1es" <<num1 <<"yelvalor2es" <<num2<<endl; return 0; }
LuisHernndezYez
mates.cpp
#include<iostream> usingnamespace std; //Prototipos longlong int factorial(int n); int sumatorio(int n); int main(){ intnum; cout<<"Num:"; cin>>num; cout<<"Factorialde" <<num<<":" <<factorial(num) <<endl <<"Sumatoriode1a" <<num<<":" <<sumatorio(num) <<endl; return 0; } return sum; }
Fundamentosdelaprogramacin:Laabstraccinprocedimental Pgina 476
longlong int factorial(int n){ longlong int fact =1; if (n<0){ fact =0; } else{ for (inti=1;i<=n;i++){ fact =fact *i; } } return fact; } int sumatorio(int n){ int sum =0; for (inti=1;i<=n;i++){ sum =sum +i; }
LuisHernndezYez
LuisHernndezYez
Fundamentosdelaprogramacin:Laabstraccinprocedimental
Pgina 477
LuisHernndezYez
Fundamentosdelaprogramacin:Laabstraccinprocedimental
Pgina 478
tMatriz suma(tMatriz a,tMatriz b); tMatriz a,b,c; c=suma(a,b); tMatriz operator+(tMatriz a,tMatriz b); tMatriz a,b,c; c=a+b;
Fundamentosdelaprogramacin:Laabstraccinprocedimental
Pgina 479
LuisHernndezYez
Fundamentosdelaprogramacin:Laabstraccinprocedimental
Pgina 480
Especificacin inicial (Paso 0). Desarrollar un programa que haga operaciones de conversin de medidas hasta que el usuario decida que no quiere hacer ms Anlisis y diseo aumentando el nivel de detalle en cada paso Qu operaciones de conversin? Paso 1. Desarrollar un programa que haga operaciones de conversin de medidas hasta que el usuario decida que no quiere hacer ms Pulgadas a centmetros Libras a gramos Grados Fahrenheit a centgrados Galones a litros
Fundamentosdelaprogramacin:Laabstraccinprocedimental Pgina 481
LuisHernndezYez
Paso 2. Desarrollar un programa que muestre al usuario un men con cuatro operaciones de conversin de medidas: Pulgadas a centmetros Libras a gramos Grados Fahrenheit a centgrados Galones a litros Y lea la eleccin del usuario y proceda con la conversin, hasta que el usuario decida que no quiere hacer ms
LuisHernndezYez
Fundamentosdelaprogramacin:Laabstraccinprocedimental
Pgina 482
Paso 2.
Conversiones
Men
Pulgadasacm.
Librasagr.
FaC
Galonesal.
main()
LuisHernndezYez
Fundamentosdelaprogramacin:Laabstraccinprocedimental
Pgina 483
LuisHernndezYez
Paso 3. Men: Mostrar las cuatro opciones ms una para salir Validar la entrada y devolver la elegida Pulgadas a centmetros: Devolver el equivalente en centmetros del valor en pulgadas Libras a gramos: Devolver el equivalente en gramos del valor en libras Grados Fahrenheit a centgrados: Devolver el equivalente en centgrados del valor en Fahrenheit Galones a litros: Devolver el equivalente en litros del valor en galones Programa principal (main())
Fundamentosdelaprogramacin:Laabstraccinprocedimental
Pgina 484
Salida
Fundamentosdelaprogramacin:Laabstraccinprocedimental
Pgina 485
LuisHernndezYez
LuisHernndezYez
case 2: { cout<<"Libras:"; cin>>valor; cout<<"Son" <<lbAGr(valor)<<"gr." <<endl; } break; case 3: { cout<<"GradosFahrenheit:"; cin>>valor; cout<<"Son" <<grFAGrC(valor)<<"C" <<endl; } break; case 4: { cout<<"Galones:"; cin>>valor; cout<<"Son" <<galALtr(valor)<<"l." <<endl; } break; } } return 0; }
Fundamentosdelaprogramacin:Laabstraccinprocedimental
. . .
Pgina 487
int menu(){ int op =1; while ((op <0)||(op >4)){ cout<<"1 PulgadasaCm."<<endl; cout<<"2 LibrasaGr."<<endl; cout<<"3 FahrenheitaC"<<endl; cout<<"4 GalonesaL."<<endl; cout<<"0 Salir"<<endl; cout<<"Elige:"; cin>>op; if ((op <0)||(op >4)){ cout<<"Opcinnovlida"<<endl; } } returnop; }
LuisHernndezYez
double pulgACm(double pulg){ const double cmPorPulg =2.54; return pulg *cmPorPulg; }
Fundamentosdelaprogramacin:Laabstraccinprocedimental
. . .
Pgina 488
conversiones.cpp
double lbAGr(double libras){ constdouble grPorLb =453.6; return libras*grPorLb; } double grFAGrC(double grF){ return ((grF 32)*5 /9); } double galALtr(double galones){ constdouble ltrPorGal =4.54609; return galones*ltrPorGal; }
LuisHernndezYez
. . .
Fundamentosdelaprogramacin:Laabstraccinprocedimental Pgina 489
LuisHernndezYez
Fundamentosdelaprogramacin:Laabstraccinprocedimental
Pgina 490
Funcin assert()
Fundamentosdelaprogramacin:Laabstraccinprocedimental
Pgina 491
Precondiciones
Por ejemplo, no realizaremos conversiones de valores negativos: double pulgACm(double pulg){ assert(pulg >0); double cmPorPulg =2.54; return pulg *cmPorPulg; } La funcin tiene una precondicin: pulg debe ser positivo
LuisHernndezYez
Fundamentosdelaprogramacin:Laabstraccinprocedimental
Pgina 492
Precondiciones
Es responsabilidad del punto de llamada garantizar la precondicin:
int main(){ double valor; int op =1; while(op !=0){ op =menu(); switch(op){ case 1: { cout<<"Pulgadas:"; cin>>valor; if (valor<0){ cout<<"Novlido!" <<endl; } else{ //Secumplelaprecondicin... ...
Fundamentosdelaprogramacin:Laabstraccinprocedimental Pgina 493
LuisHernndezYez
Postcondiciones
Un subprograma puede garantizar condiciones al terminar:
int menu(){ int op =1; while ((op <0)||(op >4)){ ... cout<<"Elige:"; cin>>op; if ((op <0)||(op >4)){ cout<<"Opcinnovlida"<<endl; } } assert ((op >=0)&&(op <=4)); returnop; }
LuisHernndezYez
LuisHernndezYez
Fundamentosdelaprogramacin
4A
Grado en Ingeniera Informtica Grado en Ingeniera del Software Grado en Ingeniera de Computadores Luis Hernndez Yez
LuisHernndezYez
Fundamentosdelaprogramacin:Laabstraccinprocedimental(Anexo)
LuisHernndezYez
Fundamentosdelaprogramacin:Laabstraccinprocedimental(Anexo)
Pgina 498
#include<iostream> usingnamespacestd; #include<fstream> voidsumatorio_archivo(ifstream&arch,double&suma); int main(){ double resultado; ifstream archivo; archivo.open("datos.txt"); if (!archivo.is_open()){ cout<<"ERRORDEAPERTURA" <<endl; } else{ sumatorio_archivo(archivo,resultado) cout<<"Suma=" <<resultado <<endl; archivo.close(); } return0; }
Fundamentosdelaprogramacin:Laabstraccinprocedimental(Anexo) Pgina 499
LuisHernndezYez
void sumatorio_archivo(ifstream&arch,double&suma){ double dato; suma =0; arch>>dato; while (dato !=1){ suma =suma +dato; arch>>dato; } }
Fundamentosdelaprogramacin:Laabstraccinprocedimental(Anexo)
Pgina 500
LuisHernndezYez
Fundamentosdelaprogramacin:Laabstraccinprocedimental(Anexo)
Pgina 501
LuisHernndezYez
Fundamentosdelaprogramacin:Laabstraccinprocedimental(Anexo)
Pgina 502
Fundamentosdelaprogramacin:Laabstraccinprocedimental(Anexo)
Pgina 503
LuisHernndezYez
Fundamentosdelaprogramacin:Laabstraccinprocedimental(Anexo)
Pgina 504
Si no se proporciona argumento, el parmetro toma ese valor proc(12); i toma el valor explcito 12 proc(); i toma el valor implcito (1) Slo puede haber argumentos implcitos en los parmetros finales:
void p(int i,int j=2,int k=3);//CORRECTO
LuisHernndezYez
Se copian los argumentos en los parmetros del primero al ltimo los que no tengan correspondencia tomarn los implcitos
void p(int i,int j=2,int k=3); ... p(13);//itoma13,jyksusvaloresimplcitos p(5,7);//itoma5,jtoma7yksuvalorimplcito p(3,9,12);//itoma3,jtoma9yktoma12
LuisHernndezYez
Los argumentos implcitos se declaran en el prototipo (preferible) o en la cabecera del subprograma, pero NO en ambos
Fundamentosdelaprogramacin:Laabstraccinprocedimental(Anexo) Pgina 506
LuisHernndezYez
Fundamentosdelaprogramacin:Laabstraccinprocedimental(Anexo)
Pgina 508
//argumentoint>primerafuncin //argumentolongint>tercerafuncin
abs(2.3) //argumentodouble>segundafuncin
Fundamentosdelaprogramacin:Laabstraccinprocedimental(Anexo)
Pgina 509
inter.cpp
#include<iostream> usingnamespace std; void intercambia(int&x,int&y); void intercambia(double&x, double&y); void intercambia(char&x,char&y); void intercambia(int&x,int&y){ int tmp; tmp=x; x=y; y=tmp; } void intercambia(double&x, double&y){ double tmp; tmp=x; x=y; y=tmp; } void intercambia(char&x,char&y){ char tmp; tmp=x; x=y; y=tmp; } int main(){ int i1=3,i2=7; double d1=12.5,d2=35.9; char c1='a',c2='b'; cout<<i1<<" " <<i2<<endl; cout<<d1<<" " <<d2<<endl; cout<<c1<<" " <<c2<<endl; intercambia(i1,i2); intercambia(d1,d2); intercambia(c1,c2); cout<<i1<<" " <<i2<<endl; cout<<d1<<" " <<d2<<endl; cout<<c1<<" " <<c2<<endl; return 0; }
LuisHernndezYez
Fundamentosdelaprogramacin:Laabstraccinprocedimental(Anexo)
Pgina 510
LuisHernndezYez
Fundamentosdelaprogramacin
5
Grado en Ingeniera Informtica Grado en Ingeniera del Software Grado en Ingeniera de Computadores Luis Hernndez Yez/Pablo Moreno Ger
LuisHernndezYez/PabloMorenoGer
Tiposdedatos Arraysdenuevo Arraysybuclesfor Mssobrearrays Inicializacindearrays Enumeradoscomondices Pasodearraysasubprogramas Implementacindelistas Cadenasdecaracteres Cadenasdecaracteresdetipostring Entrada/salidaconstring Operacionesconstring Estructuras Estructurasdentrodeestructuras Arraysdeestructuras Arraysdentrodeestructuras Listasdelongitudvariable Unejemplocompleto Elbucledo..while
Fundamentosdelaprogramacin:Tiposdedatosestructurados
514 517 520 522 523 524 525 528 531 535 539 541 543 549 550 551 552 558 562
LuisHernndezYez/PabloMorenoGer
Fundamentosdelaprogramacin:Tiposdedatosestructurados
Pgina 514
Clasificacin de tipos
Simples
Estndar: int, float, double, char, bool Conjunto de valores predeterminado Definidos por el usuario: enumerados Conjunto de valores definido por el programador Colecciones homogneas: arrays Todos los elementos del mismo tipo Colecciones heterogneas: estructuras Los elementos pueden ser de tipos distintos
LuisHernndezYez/PabloMorenoGer
Estructurados
Fundamentosdelaprogramacin:Tiposdedatosestructurados
Pgina 515
Arrays (tablas)
LuisHernndezYez/PabloMorenoGer
Elementos organizados por posicin: 0, 1, 2, 3, ... Acceso por ndice: 0, 1, 2, 3, ... Una o varias dimensiones
LuisHernndezYez/PabloMorenoGer
Fundamentosdelaprogramacin:Tiposdedatosestructurados
Pgina 517
Estructura secuencial
Cada elemento se encuentra en una posicin (ndice): Los ndices son enteros positivos El ndice del primer elemento siempre es 0 Los ndices se incrementan de uno en uno
ventas 125.40
LuisHernndezYez/PabloMorenoGer
76.95 1
0.00 6
[] Acceso directo A cada elemento se accede a travs de su ndice: ventas[4] accede al 5 elemento (contiene el valor 435.00)
cout<<ventas[4]; ventas[4]=442.75;
Datos de un mismo tipo base: Se usan como cualquier variable
Pgina 518
Fundamentosdelaprogramacin:Tiposdedatosestructurados
tVentas ventas;
NO se inicializan los elementos automticamente! Es responsabilidad del programador usar ndices vlidos! No se pueden copiar arrays directamente (array1=array2) Hay que copiarlos elemento a elemento
Fundamentosdelaprogramacin:Tiposdedatosestructurados Pgina 519
Procesamiento de arrays
Recorridos Bsquedas Ordenacin etctera...
tVentas ventas; constint Dias =7; double media,total=0; typedef double tVentas[Dias]; ... for(int i=0;i<Dias;i++){ total=total+ventas[i]; } media=total/Dias;
Fundamentosdelaprogramacin:Tiposdedatosestructurados
Pgina 520
12.40
0
10.96
1
8.43
2
11.65
3
13.70
4
13.41
5
14.07
6
Memoria Dias ventas[0] ventas[1] ventas[2] ventas[3] ventas[4] ventas[5] 7 12.40 10.96 8.43 11.65 13.70 13.41 14.07 ? 84.62 23.36 31.79 12.40 0.00 43.44 3 2 7 0 4 1
true
i<Dias
false
ventas[6]
total+=ventas[i]
...
media total i
i++
Fundamentosdelaprogramacin:Tiposdedatosestructurados
Pgina 521
LuisHernndezYez/PabloMorenoGer
Fundamentosdelaprogramacin:Tiposdedatosestructurados
Pgina 522
Podemos inicializar los elementos de los arrays en la declaracin Asignamos una serie de valores al array:
const intDIM=10; typedef inttTabla[DIM]; tTabla i={1,2,3,4,5,6,7,8,9,10};
5...10
Fundamentosdelaprogramacin:Tiposdedatosestructurados
Pgina 523
LuisHernndezYez/PabloMorenoGer
constintColores=3, typedefenum{rojo,verde, azul}tRGB; typedefint tColor[Colores]; tColor color; ... cout<<"Cantidadderojo(0255):"; cin>>color[rojo]; cout<<"Cantidaddeverde(0255):"; cin>>color[verde]; cout<<"Cantidaddeazul(0255):"; cin>>color[azul];
Recuerda que internamente se asignan enteros a partir de 0 a los distintos smbolos del enumerado rojo 0 verde 1 azul 2
Fundamentosdelaprogramacin:Tiposdedatosestructurados Pgina 524
Simulacin de paso de parmetro por referencia Sin poner & en la declaracin del parmetro Los subprogramas reciben la direccin en memoria del array
const intMax=10; typedef inttTabla[Max]; void inicializa(tTabla tabla);//Sinponer&
LuisHernndezYez/PabloMorenoGer
Si inicializa() modifica algn elemento de tabla, automticamente queda modificado ese elemento de array
const intDim =10; typedef inttTabla[Dim]; void inicializa(tTabla tabla);//noseusa& void inicializa(tTabla tabla){ for (int i=0;i<Dim;i++) tabla[i]=i; } intmain(){ tTabla array; inicializa(array);//arrayquedamodificado for (int i=0;i<Dim;i++) cout<<array[i]<<""; ...
0123456789
LuisHernndezYez/PabloMorenoGer
Fundamentosdelaprogramacin:Tiposdedatosestructurados
Pgina 526
Un array de constantes
Si en el subprograma hay alguna instruccin que intente modificar un elemento del array: error de compilacin
void muestra(consttTabla tabla){ for (int i=0;i<Dim;i++){ cout<<tabla[i]<<""; //OK.Seaccede,peronosemodifica } }
Fundamentosdelaprogramacin:Tiposdedatosestructurados Pgina 527
LuisHernndezYez/PabloMorenoGer
Fundamentosdelaprogramacin:Tiposdedatosestructurados
Pgina 528
Recorrido de la lista:
LuisHernndezYez/PabloMorenoGer
Bsqueda en la lista:
while((i<NUM)&&!encontrado){ ...
Fundamentosdelaprogramacin:Tiposdedatosestructurados
Pgina 529
Recorrido de la lista:
LuisHernndezYez/PabloMorenoGer
Bsqueda en la lista:
while((i<contador)&&!encontrado){ ... Array y contador por separado? Estructuras
Fundamentosdelaprogramacin:Tiposdedatosestructurados Pgina 530
LuisHernndezYez/PabloMorenoGer
Fundamentosdelaprogramacin:Tiposdedatosestructurados
Pgina 531
Arrays de caracteres
Cadenas: secuencias de caracteres de longitud variable
"Hola""Adis""Supercalifragilstico""1234567"
LuisHernndezYez/PabloMorenoGer
Variables de cadena: contienen secuencias de caracteres Se guardan en arrays de caracteres: tamao mximo (dimensin) No todas las posiciones del array son relevantes: Longitud de la cadena: nmero de caracteres, desde el primero, que realmente constituyen la cadena:
H
0
o
1
l
2
a
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
Longitud actual: 4
Fundamentosdelaprogramacin:Tiposdedatosestructurados Pgina 532
Longitud de la cadena
A
0
d
1
i
2
s
4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
Longitud: 5
S
0
u
1
p
2
e
3
r
4
c
5
a
6
l
7
i
8
f
9
r
10
a
11
g
12
i
13
l
14
15
s
16
t
17
i
18
c
19
o
20 21
LuisHernndezYez/PabloMorenoGer
Longitud: 21 Necesidad de saber dnde terminan los caracteres relevantes: Mantener la longitud de la cadena como dato asociado Colocar un carcter de terminacin al final (centinela)
A
0
d
1
i
2
s
4
\0
5 6 7 8 9 10
Fundamentosdelaprogramacin:Tiposdedatosestructurados
Pgina 533
LuisHernndezYez/PabloMorenoGer
LuisHernndezYez/PabloMorenoGer
Fundamentosdelaprogramacin:Tiposdedatosestructurados
Pgina 535
El tipo string
El tipo asume la responsabilidad de la gestin de memoria Define operadores sobrecargados (+ para concatenar) Cadenas ms eficientes y seguras de usar Biblioteca string Requiere establecer el espacio de nombres a std
LuisHernndezYez/PabloMorenoGer
Se pueden inicializar en la declaracin Se pueden copiar con el operador de asignacin Se pueden concatenar con el operador + Multitud de funciones de utilidad
Fundamentosdelaprogramacin:Tiposdedatosestructurados
Pgina 536
string.cpp #include<iostream> #include<string> usingnamespacestd; int main(){ string cad1("Hola");//inicializacin string cad2="amigo";//inicializacin string cad3; cad3=cad1;//copia cout<<"cad3=" <<cad3<<endl; cad3=cad1+"";//concatenacin cad3+=cad2;//concatenacin cout<<"cad3=" <<cad3<<endl; cad1.swap(cad2);//intercambio cout<<"cad1=" <<cad1<<endl; cout<<"cad2=" <<cad2<<endl; return 0; }
Fundamentosdelaprogramacin:Tiposdedatosestructurados Pgina 537
LuisHernndezYez/PabloMorenoGer
Longitud de la cadena:
cadena.length() o cadena.size()
LuisHernndezYez/PabloMorenoGer
Acceso a los caracteres de una cadena: Como array de caracteres: cadena[i] Sin control de acceso a posiciones inexistentes del array Slo debe usarse si se est seguro de que el ndice es vlido Funcin at(ndice): cadena.at(i) Error de ejecucin si se accede a una posicin inexistente
Fundamentosdelaprogramacin:Tiposdedatosestructurados
Pgina 538
Se muestran en la pantalla con cout<< Lectura con cin>>: termina con espacio en blanco (inc. Intro) El espacio en blanco queda pendiente Descartar el resto de los caracteres del bfer:
cin.sync();
Guarda en la cadena los caracteres ledos hasta el fin de lnea Lectura de archivos de texto: Igual que de consola; sync() no tiene efecto
archivo>>cadenagetline(archivo,cadena)
Fundamentosdelaprogramacin:Tiposdedatosestructurados
Pgina 539
string2.cpp #include<iostream> #include<string> usingnamespacestd; int main(){ string nombre,apellidos; cout<<"Introduzcaunnombre:"; cin>>nombre; cout<<"Introduzcalosapellidos:"; cin.sync(); getline(cin,apellidos); cout<<"Nombrecompleto:" <<nombre<<"" <<apellidos<<endl; return 0; }
LuisHernndezYez/PabloMorenoGer
Fundamentosdelaprogramacin:Tiposdedatosestructurados
Pgina 540
string cad ="Olala"; cout<<cad.find("la");//Muestra1 (Recuerda que los arrays de caracteres comienzan con el ndice 0)
http://www.cplusplus.com/reference/string/string/
Fundamentosdelaprogramacin:Tiposdedatosestructurados
Pgina 542
LuisHernndezYez/PabloMorenoGer
Fundamentosdelaprogramacin:Tiposdedatosestructurados
Pgina 543
LuisHernndezYez/PabloMorenoGer
Fundamentosdelaprogramacin:Tiposdedatosestructurados
Pgina 544
typedefstruct { ...//declaracionesdecampos(comovariables) }tTipo;//nombredetipo alfinal! typedefstruct { string nombre; string apellidos; int edad; string nif; }tPersona;
LuisHernndezYez/PabloMorenoGer
Fundamentosdelaprogramacin:Tiposdedatosestructurados
Pgina 545
tPersona persona;
LuisHernndezYez/PabloMorenoGer
typedefstruct { string nombre; string apellidos; int edad; string nif; }tPersona; tPersona persona;
persona
persona.nombre
persona.apellidos
LuisHernndezYez/PabloMorenoGer
nif 00223344F
Fundamentosdelaprogramacin:Tiposdedatosestructurados
Pgina 547
typedefstruct { string nombre; string apellidos; int edad; string nif; }tPersona; tPersona persona;
LuisHernndezYez/PabloMorenoGer
Los campos no siguen ningn orden establecido Acceso directo por nombre de campo (operador .) Con cada campo se puede hacer lo que permita su tipo
Las estructuras se pasan por valor (sin &) o por referencia (con &) a los subprogramas
Fundamentosdelaprogramacin:Tiposdedatosestructurados
Pgina 548
tNif
Acceso al DNI:
persona.nif.dni
Fundamentosdelaprogramacin:Tiposdedatosestructurados
Pgina 549
tPersona const intDIM =100; typedefstruct { nombre string nombre; apellidos string apellidos; edad int edad; nif string nif; }tPersona; typedeftPersona tArray[DIM]; tArray personal;
LuisHernndezYez/PabloMorenoGer
personal
nombre
DIM1
LuisHernndezYez/PabloMorenoGer
const intMAX=100; lista typedefstruct { string nombre; string apellidos; int edad; string nif; }tPersona; typedeftPersona tArray[MAX]; typedefstruct { tArray elementos; int contador; }tLista; tLista lista;
elementos
0
nombre apellidos edad nif nombre apellidos edad nif nombre apellidos edad nif
contador
MAX1
Nombre de la tercera persona: lista.elementos[2].nombre Edad de la duodcima persona: lista.elementos[11].edad NIF de la primera persona: lista.elementos[0].nif
Fundamentosdelaprogramacin:Tiposdedatosestructurados Pgina 551
Fundamentosdelaprogramacin:Tiposdedatosestructurados
Pgina 552
12.0
0
2.2
1
5.4
2
0.0
3
36.2
4
35.0
5
X
6
X
7
X
8
X
9
contador
12.0 2.2
0 1
5.4
2
0.0
3
36.2 35.0
4 5
X
6
X
7
X
8
X
9
Hay que asegurarse de que haya sitio (contador < mximo) Operacin en 3 pasos: 1. Abrir hueco para el nuevo elemento (desde la posicin) 2. Colocar el elemento nuevo en la posicin 3. Incrementar el contador
Fundamentosdelaprogramacin:Tiposdedatosestructurados Pgina 554
12.0 2.2
0 1
5.4
2
42.0
3
0.0
4
36.2 35.0
5 6
X
7
X
8
X
9
Fundamentosdelaprogramacin:Tiposdedatosestructurados
Pgina 555
5.4
2
0.0
3
36.2 35.0
4 5
X
6
X
7
X
8
X
9
Fundamentosdelaprogramacin:Tiposdedatosestructurados
Pgina 556
5.4
2
0.0
3
36.2 35.0
4 5
X
6
X
7
X
8
X
9
5.4
2
X
6
X
7
X
8
X
9
Fundamentosdelaprogramacin:Tiposdedatosestructurados
Pgina 557
LuisHernndezYez/PabloMorenoGer
Fundamentosdelaprogramacin:Tiposdedatosestructurados
Pgina 558
Descripcin
Programa que mantenga una lista de los estudiantes de una clase De cada estudiante: nombre, apellidos, edad, NIF y nota Se desconoce el nmero total de estudiantes (mximo 100) La informacin de la lista se mantiene en un archivo clase.txt Se carga al empezar y se guarda al finalizar El programa debe ofrecer estas opciones: Aadir un nuevo alumno Eliminar un alumno existente Calificar a los estudiantes Listado de notas, identificando la mayor y la media
LuisHernndezYez/PabloMorenoGer
Fundamentosdelaprogramacin:Tiposdedatosestructurados
Pgina 559
bd.cpp #include<iostream> #include<string> usingnamespacestd; #include<fstream> #include<iomanip> const int MAX=100; typedef struct { string nombre; string apellidos; int edad; string nif; double nota; } tEstudiante; typedef tEstudiantetArray[MAX]; typedef struct{ tArray elementos; int contador; } tLista;
Fundamentosdelaprogramacin:Tiposdedatosestructurados
LuisHernndezYez/PabloMorenoGer
Pgina 560
LuisHernndezYez/PabloMorenoGer
//Prototipos int menu();//Mendelprograma devuelvelaopcinelegida void cargar(tLista&lista,bool &ok); //Cargadelarchivo void guardar(consttLista&lista); //Laguardaenelarchivo void leerEstudiante(tEstudiante&estudiante);//Leelosdatos void insertarEstudiante(tLista&lista,tEstudianteestudiante, bool &ok);//Insertaunnuevoestudianteenlalista void eliminarEstudiante(tLista&lista,intpos,bool &ok); //Eliminaelestudianteenesaposicin string nombreCompleto(tEstudiante estudiante); void calificar(tLista&lista); //Notasdelosestudiantes doublemediaClase(consttLista &lista); //Notamedia intmayorNota(consttLista &lista); //ndicedelestudianteconmayornota voidmostrarEstudiante(tEstudiante estudiante); voidlistado(consttLista &lista,doublemedia,intmayor); //Listadodelaclase Los prototipos, despus de los tipos globales
Fundamentosdelaprogramacin:Tiposdedatosestructurados Pgina 561
LuisHernndezYez/PabloMorenoGer
Fundamentosdelaprogramacin:Tiposdedatosestructurados
Pgina 562
El bucle do..while
do cuerpo while(condicin);
do cuerpo while (
LuisHernndezYez/PabloMorenoGer
int i=1; do { cout<<i<<endl; i++; }while(i<=100); El cuerpo siempre se ejecuta al menos una vez El cuerpo es un bloque de cdigo
Fundamentosdelaprogramacin:Tiposdedatosestructurados
Pgina 563
Cuerpo true
Condicin false
LuisHernndezYez/PabloMorenoGer
cout<<i<<endl; i++;
true i<=100 false
Fundamentosdelaprogramacin:Tiposdedatosestructurados
Pgina 564
LuisHernndezYez/PabloMorenoGer
Fundamentosdelaprogramacin:Tiposdedatosestructurados
Pgina 565
int menu(){ int op; do { cout<<"1 Aadirunnuevoestudiante"<<endl; cout<<"2 Eliminarunestudiante"<<endl; cout<<"3 Calificaralosestudiantes"<<endl; cout<<"4 Listadodeestudiantes"<<endl; cout<<"0 Salir"<<endl; cout<<"Opcin:"; cin>>op; }while((op <0)||(op >4)); return op; }
LuisHernndezYez/PabloMorenoGer
Fundamentosdelaprogramacin:Tiposdedatosestructurados
Pgina 566
El archivo clase.txt
Un dato en cada lnea Por cada estudiante: Nombre (cadena) Apellidos (cadena) Edad (entero) NIF (cadena) Nota (real; 1 si no calificado) Termina con XXX como nombre El archivo se supone correcto
LuisHernndezYez/PabloMorenoGer
Fundamentosdelaprogramacin:Tiposdedatosestructurados
Pgina 567
Queda pendiente de leer el Intro Hay que saltar (leer) ese carcter con get() Si no, en el siguiente nombre se leera una cadena vaca (Intro)
No leas directamente en la lista:
getline(archivo,lista.elementos[lista.contador].nombre);
void cargar(tLista&lista,bool &ok){ tEstudiante estudiante;//Variableauxiliarparaleer ifstream archivo; char aux; lista.contador=0;//Inicializamoslalista archivo.open("clase.txt"); if (!archivo.is_open()){ ok=false; } else { ok=true; getline(archivo,estudiante.nombre);//Leemoselprimernombre while ((estudiante.nombre!="XXX")&&(lista.contador<MAX)){ getline(archivo,estudiante.apellidos); archivo>>estudiante.edad; archivo>>estudiante.nif; archivo>>estudiante.nota; archivo.get(aux);//SaltamoselIntro lista.elementos[lista.contador]=estudiante;//Alfinal lista.contador++; getline(archivo,estudiante.nombre);//Siguientenombre }//SihaymsdeMAXestudiantes,ignoramoselresto archivo.close(); } }
Fundamentosdelaprogramacin:Tiposdedatosestructurados Pgina 569
LuisHernndezYez/PabloMorenoGer
LuisHernndezYez/PabloMorenoGer
LuisHernndezYez/PabloMorenoGer
void leerEstudiante(tEstudiante&estudiante){ cin.sync(); //Descartamoscualquierentradapendiente cout<<"Nombre:"; getline(cin,estudiante.nombre); cout<<"Apellidos:"; getline(cin,estudiante.apellidos); cout<<"Edad:"; cin>>estudiante.edad; cout<<"NIF:"; cin>>estudiante.nif; estudiante.nota=1;//Sincalificardemomento cin.sync(); //Descartamoscualquierentradapendiente }
Fundamentosdelaprogramacin:Tiposdedatosestructurados
Pgina 571
LuisHernndezYez/PabloMorenoGer
Fundamentosdelaprogramacin:Tiposdedatosestructurados
Pgina 572
voideliminarEstudiante(tLista&lista,intpos,bool&ok){ //Esperaelndicedelelementoenpos if((pos<0)||(pos>lista.contador 1)){ ok=false;//Elementoinexistente } else { ok=true; for(int i=pos;i<lista.contador 1;i++){ lista.elementos[i]=lista.elementos[i+1]; } lista.contador; } }
LuisHernndezYez/PabloMorenoGer
Fundamentosdelaprogramacin:Tiposdedatosestructurados
Pgina 573
string nombreCompleto(tEstudiante estudiante){ return estudiante.nombre+"" +estudiante.apellidos; } voidcalificar(tLista&lista){ for(int i=0;i<lista.contador;i++){ cout<<"Notadelestudiante" <<nombreCompleto(lista.elementos[i])<<":"; cin>>lista.elementos[i].nota; } }
LuisHernndezYez/PabloMorenoGer
Fundamentosdelaprogramacin:Tiposdedatosestructurados
Pgina 574
double mediaClase(consttLista &lista){ double total=0.0; for(int i=0;i<lista.contador;i++){ total=total+lista.elementos[i].nota; } return total/lista.contador; } int mayorNota(consttLista &lista){ double max =0; int pos=0; for(int i=0;i<lista.contador;i++){ if(lista.elementos[i].nota>max){ max =lista.elementos[i].nota; pos=i; } } return pos; }
Fundamentosdelaprogramacin:Tiposdedatosestructurados Pgina 575
LuisHernndezYez/PabloMorenoGer
void mostrarEstudiante(tEstudiante estudiante){ cout<<setw(35)<<left <<nombreCompleto(estudiante); cout<<estudiante.nif<<""; cout <<setw(2)<<estudiante.edad<<"aos"; cout<<fixed <<setprecision(1)<<estudiante.nota; } void listado(consttLista &lista,double media,int mayor){ for(int i=0;i<lista.contador;i++){ cout<<setw(3)<<i<<":"; mostrarEstudiante(lista.elementos[i]); if(i==mayor){ cout<<"<<<Mayornota!"; } cout<<endl; } cout<<"Mediadelaclase:"<<fixed <<setprecision(1) <<media<<endl<<endl; }
Fundamentosdelaprogramacin:Tiposdedatosestructurados Pgina 576
LuisHernndezYez/PabloMorenoGer
int main(){ tLista lista; tEstudiante estudiante; bool exito; int op,pos; cargar(lista,exito); if (!exito){ cout<<"Nosehapodidocargarlalista!" <<endl; } else { do {//Elbucledoevitatenerqueleeranteslaprimeraopcin op =menu(); switch(op){ case1: { leerEstudiante(estudiante); insertarEstudiante(lista,estudiante,exito); if(!exito){ cout<<"Listallena:imposibleinsertar" <<endl; } } break;
Fundamentosdelaprogramacin:Tiposdedatosestructurados Pgina 577
LuisHernndezYez/PabloMorenoGer
LuisHernndezYez/PabloMorenoGer
case2: { cout<<"Posicin:"; cin>>pos; eliminarEstudiante(lista,pos 1,exito); if(!exito){ cout<<"Elementoinexistente!" <<endl; } } break; case3: { calificar(lista); } break; case4: { listado(lista,mediaClase(lista),mayorNota(lista)); } } }while(op !=0); guardar(lista); } return 0; }
Fundamentosdelaprogramacin:Tiposdedatosestructurados Pgina 578
No comercial (Non commercial): La explotacin de la obra queda limitada a usos no comerciales. Compartir igual (Share alike): La explotacin autorizada incluye la creacin de obras derivadas siempre que mantengan la misma licencia al ser divulgadas.
Fundamentosdelaprogramacin
5A
Grado en Ingeniera Informtica Grado en Ingeniera del Software Grado en Ingeniera de Computadores Luis Hernndez Yez/Pablo Moreno Ger
LuisHernndezYez/PabloMorenoGer
Fundamentosdelaprogramacin:CadenasalestilodeC(Anexo)
Siempre hay al final un carcter nulo (cdigo ASCII 0 '\0') Indica que en esa posicin termina la cadena (exclusive)
cadena
LuisHernndezYez/PabloMorenoGer
A
0
d
1
i
2
s
4
\0
5 6 7 8 9 10 11 12 13 14
En el array caben MAX1 caracteres significativos Longitud mxima de la variable cadena: 14 No se pueden asignar cadenas literales: cadena="Hola"; Ni copiar cadenas directamente: cad2=cad1; Ni comparar con op. relacionales: if(cad1<cad2)...
Fundamentosdelaprogramacin:CadenasalestilodeC(Anexo) Pgina 582
Extractor: la lectura termina en el primer espacio en blanco No se comprueba si se leen ms caracteres de los que caben! setw(): mximo de caracteres a colocar (incluyendo el nulo)
cin>>setw(15)>>cadena;
LuisHernndezYez/PabloMorenoGer
strlen(cadena): longitud actual de la cadena cout<<"Longitud:" <<strlen(cadena); strcpy(destino,origen): copia origen en destino strcpy(cad2,cad1); strcpy(cad,"MegustaC++"); strcat(destino,origen): aade origen al final de destino tCadena cad1="Hola",cad2="Adis"; strcat(cad1,cad2);//cad1contiene"HolaAdis"
LuisHernndezYez/PabloMorenoGer
strcmp(cad1,cad2): compara lexicogrficamente las cadenas 0 si son iguales, 1 si cad1 > cad2 1 si cad1 < cad2 tCadena cad1="Hola",cad2="Adis"; strcmp(cad1,cad2)//Devuelve1("Hola">"Adis") . . .
http://www.cplusplus.com/reference/clibrary/cstring/
Fundamentosdelaprogramacin:CadenasalestilodeC(Anexo)
Pgina 584
cadenas.cpp #include<iostream> usingnamespacestd; #include<cstring> int main(){ const int MAX=20; typedef chartCad[MAX]; tCad cadena="MegustaC++"; cout<<cadena<<endl; cout<<"Cadena:"; cin>>cadena;//Leehastaelprimerespacioenblanco cout<<cadena<<endl; cin.sync();//Sincronizarlaentrada cout<<"Cadena:"; cin.getline(cadena,MAX); cout<<cadena<<endl; cout<<"Longitud:" <<strlen(cadena)<<endl; strcpy(cadena,"Hola"); ...
Fundamentosdelaprogramacin:CadenasalestilodeC(Anexo) Pgina 585
LuisHernndezYez/PabloMorenoGer
LuisHernndezYez/PabloMorenoGer
tCad cadena2="amigo"; strcat(cadena,cadena2); cout<<cadena<<endl; if(strcmp(cadena,cadena2)==0){ cout<<"Iguales"; } elseif(strcmp(cadena,cadena2)>0){ cout<<cadena<<"esmayorque" <<cadena2; } else{ cout<<cadena<<"esmenorque" <<cadena2; } cout<<endl; return 0; }
Fundamentosdelaprogramacin:CadenasalestilodeC(Anexo)
Pgina 586
No comercial (Non commercial): La explotacin de la obra queda limitada a usos no comerciales. Compartir igual (Share alike): La explotacin autorizada incluye la creacin de obras derivadas siempre que mantengan la misma licencia al ser divulgadas.
Fundamentosdelaprogramacin
6
Grado en Ingeniera Informtica Grado en Ingeniera del Software Grado en Ingeniera de Computadores Luis Hernndez Yez / Pablo Moreno Ger
LuisHernndezYez
Recorridodearrays Arrayscompletos Arraysnocompletosconcentinela Arraysnocompletosconcontador Ejemplos Generacindenmerosaleatorios Bsquedasenarrays Arrayscompletos Arraysnocompletosconcentinela Arraysnocompletosconcontador Ejemplo Recorridosybsquedasencadenas Msejemplosdemanejodearrays Arraysmultidimensionales Inicializacindearraysmultidimensionales Recorridodeunarraybidimensional RecorridodeunarrayNdimensional Bsquedaenunarraymultidimensional
590 593 594 595 597 601 604 606 607 608 610 614 617 630 638 641 644 647
Fundamentosdelaprogramacin:Recorridoybsquedaenarrays
LuisHernndezYez
Fundamentosdelaprogramacin:Recorridoybsquedaenarrays
Pgina 590
Esquema de recorrido
Inicializacin Mientras no al final de la secuencia: Obtener el siguiente elemento Procesar el elemento Finalizacin
Al final? Inicializacin
true
false
Obtener elemento Procesar elemento
LuisHernndezYez
Finalizacin
Fundamentosdelaprogramacin:Recorridoybsquedaenarrays
Pgina 591
LuisHernndezYez
Fundamentosdelaprogramacin:Recorridoybsquedaenarrays
Pgina 592
LuisHernndezYez
Fundamentosdelaprogramacin:Recorridoybsquedaenarrays
Pgina 593
LuisHernndezYez
Fundamentosdelaprogramacin:Recorridoybsquedaenarrays
0
LuisHernndezYez
contador
Fundamentosdelaprogramacin:Recorridoybsquedaenarrays
Pgina 595
LuisHernndezYez
Fundamentosdelaprogramacin:Recorridoybsquedaenarrays
Pgina 596
LuisHernndezYez
Fundamentosdelaprogramacin:Recorridoybsquedaenarrays
Pgina 597
fibonacci.cpp
LuisHernndezYez
Fundamentosdelaprogramacin:Recorridoybsquedaenarrays
Pgina 598
numeros numDig
123 0 0 0
2 1 0 1
46237 2 0 2
2345 3 0 3
236 4 0 4
11234 5 0 5
33 6
999 7
...
61 99
Fundamentosdelaprogramacin:Recorridoybsquedaenarrays
Pgina 599
LuisHernndezYez
Fundamentosdelaprogramacin:Recorridoybsquedaenarrays
Pgina 600
Fundamentosdelaprogramacin:Recorridoybsquedaenarrays
Pgina 601
digitos.cpp
LuisHernndezYez
Fundamentosdelaprogramacin:Recorridoybsquedaenarrays
Pgina 602
for (int i=0;i<NUM;i++){//Creamoslasecuencia numeros[i]=rand();//Entre0y32766 } for (int i=0;i<NUM;i++){ //Recorremoslasecuenciadeenteros numDig[digitos(numeros[i]) 1]++; } for (int i=0;i<DIG;i++){ //Recorremoslasecuenciadecontadores cout<<"De"<<i+1 <<"dg.="<<numDig[i] <<endl; } return 0; } int digitos(int dato){ ...
Fundamentosdelaprogramacin:Recorridoybsquedaenarrays Pgina 603
LuisHernndezYez
LuisHernndezYez
Fundamentosdelaprogramacin:Recorridoybsquedaenarrays
Pgina 604
Esquema de bsqueda
Inicializacin Mientras no se encuentre el elemento y no se est al final de la secuencia: Obtener el siguiente elemento Comprobar si el elemento satisface la condicin Finalizacin (tratar el elemento encontrado o indicar que no se ha encontrado)
LuisHernndezYez
Inicializacin / encontrado=false;
Al final o encontrado?
true
false
Obtener elemento Encontrado?
Finalizacin
Fundamentosdelaprogramacin:Recorridoybsquedaenarrays
Pgina 605
LuisHernndezYez
int buscado; bool encontrado=false; cout<<"Valorabuscar:"; cin>>buscado; int pos=0; while((pos<N)&&!encontrado){ //Mientrasnoselleguealfinalynoencontrado if(lista[pos]==buscado){ encontrado=true; } else{ pos++; } } if(encontrado)//...
Fundamentosdelaprogramacin:Recorridoybsquedaenarrays
Pgina 606
Con centinela
int buscado; cout<<"Valorabuscar:"; cin>>buscado; int pos=0; bool encontrado=false; while((array[pos]!=centinela)&&!encontrado){ if(array[pos]==buscado){ encontrado=true; } else{ pos++; } } if(encontrado)//...
const intN=10; typedef inttArray[N]; tArray array; constint centinela=1;
LuisHernndezYez
Fundamentosdelaprogramacin:Recorridoybsquedaenarrays
Pgina 607
Con contador
LuisHernndezYez
int buscado; cout<<"Valorabuscar:"; cin>>buscado; int pos=0; bool encontrado=false; while((pos<miLista.contador) &&!encontrado){ //Mientrasnoalfinalynoencontrado if(miLista.elementos[pos]==buscado){ encontrado=true; } else{ pos++; } } if(encontrado)//...
Fundamentosdelaprogramacin:Recorridoybsquedaenarrays
const intN=10; typedefdoubletArray[N]; typedefstruct { tArray elementos; int contador; }tLista; tLista miLista;
Pgina 608
Fundamentosdelaprogramacin:Recorridoybsquedaenarrays
Pgina 609
LuisHernndezYez
Fundamentosdelaprogramacin:Recorridoybsquedaenarrays
Pgina 610
#include<iostream> usingnamespacestd; #include<fstream> const intN=100; typedefdoubletArray[N]; typedefstruct { tArray elementos; int contador; }tLista; void cargar(tLista&lista,bool &ok);
umbral.cpp
int main(){ tLista lista; bool ok; cargar(lista,ok); if (!ok){ cout<<"Error:nohayarchivoodemasiadosdatos" <<endl; }
Fundamentosdelaprogramacin:Recorridoybsquedaenarrays Pgina 611
LuisHernndezYez
LuisHernndezYez
else { double umbral; cout<<"Valorumbral:";cin>>umbral; boolencontrado=false; int pos=0; while ((pos<lista.contador)&&!encontrado){ if (lista.elementos[pos]>umbral){ encontrado=true; } else { pos++; } } if (encontrado){ cout<<"Valorenpos."<<pos+1 <<"(" <<lista.elementos[pos]<<")" <<endl; } else { cout<<"Noencontrado!"<<endl; } } return0; }
Fundamentosdelaprogramacin:Recorridoybsquedaenarrays Pgina 612
void cargar(tLista&lista,bool &ok){ ifstreamarchivo; doubledato; boolabierto=true,overflow =false; lista.contador =0; archivo.open("datos.txt"); if(!archivo.is_open()){ abierto=false; } else { archivo>>dato; while((dato>=0)&&!overflow){ if(lista.contador ==N){ overflow =true;//Demasiados! } else { lista.elementos[lista.contador]=dato; lista.contador++; archivo>>dato; } } archivo.close(); } ok=abierto&&!overflow; }
Fundamentosdelaprogramacin:Recorridoybsquedaenarrays Pgina 613
LuisHernndezYez
LuisHernndezYez
Fundamentosdelaprogramacin:Recorridoybsquedaenarrays
Pgina 614
inversa.cpp
LuisHernndezYez
busca.cpp
LuisHernndezYez
LuisHernndezYez
Fundamentosdelaprogramacin:Recorridoybsquedaenarrays
Pgina 617
Tipo tVector para representar secuencias de N enteros: const int N=10; typedef inttVector[N]; Subprogramas: Dado un vector, mueve sus componentes un lugar a la derecha; el ltimo componente se mover al 1er lugar Dado un vector, calcula y devuelve la suma de los elementos que se encuentran en las posiciones pares del vector Dado un vector, encuentra y devuelve la componente mayor Dados dos vectores, devuelve un valor que indique si son iguales
LuisHernndezYez
Dado un vector, determina si alguno de los valores almacenados en el vector es igual a la suma del resto de los valores del mismo; devuelve el ndice del primero encontrado o 1 si no se encuentra Dado un vector, determina si alguno de los valores almacenados en el vector est repetido
Fundamentosdelaprogramacin:Recorridoybsquedaenarrays Pgina 618
vectores.cpp void desplazar(tVector v){ int aux=v[N 1]; for (int i=N 1;i>0;i){ v[i]=v[i 1]; } v[0]=aux; } int sumaPares(const tVector v){ int suma=0; for (int i=0;i<N;i=i+2){ suma=suma+v[i]; } return suma; }
LuisHernndezYez
Fundamentosdelaprogramacin:Recorridoybsquedaenarrays
Pgina 619
int encuentraMayor(const tVector v){ int max=v[0],posMayor=0; for (int i=1;i<N;i++){ if (v[i]>max){ posMayor=i; max=v[i]; } } return posMayor; } bool sonIguales(const tVector v1,const tVector v2){ //Implementacincomobsquedadelprimerelementodistinto bool encontrado=false; int i=0; while ((i<N)&&!encontrado){ encontrado=(v1[i]!=v2[i]); i++; } return !encontrado; }
Fundamentosdelaprogramacin:Recorridoybsquedaenarrays Pgina 620
LuisHernndezYez
LuisHernndezYez
int compruebaSuma(const tVector v){ //Algunoigualalasumadelresto? bool encontrado=false; int i=0; int suma; while ((i<N)&&!encontrado){ suma=0; for (int j=0;j<N;j++){ if (j!=i){ suma=suma+v[j]; } } encontrado=(suma==v[i]); i++; } if (!encontrado){ i=0; } return i 1; }
Fundamentosdelaprogramacin:Recorridoybsquedaenarrays Pgina 621
bool hayRepetidos(const tVector v){ bool encontrado=false; int i=0,j; while ((i<N)&&!encontrado){ j=i+1; while ((j<N)&&!encontrado){ encontrado=(v[i]==v[j]); j++; } i++; } return encontrado; }
LuisHernndezYez
Fundamentosdelaprogramacin:Recorridoybsquedaenarrays
Pgina 622
Dado un vector de N caracteres v1, en el que no hay elementos repetidos, y otro vector de M caracteres v2, donde N M, se quiere comprobar si todos los elementos del vector v1 estn tambin en el vector v2 Por ejemplo, si: v1= 'a' 'h' 'i' 'm' v2= 'h' 'a' 'x' 'x' 'm' 'i' El resultado sera cierto, ya que todos los elementos de v1 estn en v2
LuisHernndezYez
Fundamentosdelaprogramacin:Recorridoybsquedaenarrays
Pgina 623
incluidos.cpp
#include<iostream> usingnamespacestd; const int N=3; const int M=10; typedef chartVector1[N]; typedefchartVector2[M]; bool esta(char dato,const tVector2 v2); bool vectorIncluido(const tVector1v1,const tVector2 v2); int main(){ tVector1 v1={'a','b','c' }; tVector2 v2={'a','r','e','t','z','s','a','h','b','x' }; bool ok=vectorIncluido(v1,v2); if (ok){ cout<<"OK:v1estaincluidoenv2" <<endl; } else { cout<<"NO:v1noestaincluidoenv2" <<endl; } return 0; }
Fundamentosdelaprogramacin:Recorridoybsquedaenarrays Pgina 624
LuisHernndezYez
bool esta(chardato,const tVector2 v2){ int i=0; bool encontrado=(dato==v2[0]); while (!encontrado&&(i<M 1)){ i++; encontrado=(dato==v2[i]); } return encontrado; } bool vectorIncluido(const tVector1 v1,const tVector2 v2){ int i=0; bool encontrado=esta(v1[0],v2); while(encontrado&&(i<N 1)){ i++; encontrado=esta(v1[i],v2); } return encontrado; }
Fundamentosdelaprogramacin:Recorridoybsquedaenarrays Pgina 625
LuisHernndezYez
Un programa que lea dos cadenas del teclado y determine si una es un anagrama de la otra, es decir, si una cadena es una permutacin de los caracteres de la otra. Por ejemplo, "acre" es un anagrama de "cera" y de "arce". Ten en cuenta que puede haber letras repetidas ("carro", "llave").
LuisHernndezYez
Fundamentosdelaprogramacin:Recorridoybsquedaenarrays
Pgina 626
anagramas.cpp
#include<iostream> #include<string> usingnamespace std; int buscaCaracter(string cad,char c);//ndiceo1sinoest int main(){ string cad1,cad2; bool sonAnagramas=true; int numCar,posEnCad2; cout<<"Introducelaprimeracadena:"; getline(cin,cad1); cout<<"Introducelasegundacadena:"; getline(cin,cad2); if (cad1.length()!=cad2.length()){//Nosonanagramas sonAnagramas=false; } else { numCar=0;//Contadordecaracteresdelaprimeracadena while (sonAnagramas&&(numCar<cad1.length())){ posEnCad2=buscaCaracter(cad2,cad1.at(numCar));
Fundamentosdelaprogramacin:Recorridoybsquedaenarrays Pgina 627
LuisHernndezYez
if (posEnCad2==1){//Nosehaencontradoelcaracter sonAnagramas=false; } else { cad2.erase(posEnCad2,1); } numCar++; } } if (sonAnagramas){ cout<<"Laspalabrasintroducidassonanagramas" <<endl; } else { cout<<"LaspalabrasintroducidasNOsonanagramas" <<endl; }
LuisHernndezYez
return 0; }
Fundamentosdelaprogramacin:Recorridoybsquedaenarrays
Pgina 628
int buscaCaracter(string cad,char c){ int pos=0,lon=cad.length(); bool encontrado=false; while ((pos<lon)&&!encontrado){ if (cad.at(pos)==c){ encontrado=true; } else { pos++; } } if (!encontrado){ pos=1; }
LuisHernndezYez
return pos; }
Fundamentosdelaprogramacin:Recorridoybsquedaenarrays
Pgina 629
LuisHernndezYez
Fundamentosdelaprogramacin:Recorridoybsquedaenarrays
Pgina 630
98
99
...
...
Fundamentosdelaprogramacin:Recorridoybsquedaenarrays
Pgina 631
0 0 1 2 ...
LuisHernndezYez
98
99
...
...
...
...
...
...
48 49
Fundamentosdelaprogramacin:Recorridoybsquedaenarrays
Pgina 632
LuisHernndezYez
Fundamentosdelaprogramacin:Recorridoybsquedaenarrays
Pgina 633
Ahora: temp[i][0] es la temperatura mnima del da i+1 temp[i][1] es la temperatura mxima del da i+1
LuisHernndezYez
Fundamentosdelaprogramacin:Recorridoybsquedaenarrays
Pgina 634
temp.cpp int main(){ constint MaxDias =31; const int MED =2;//Ndemedidas typedef doubletTemp[MaxDias][MED];//Daxmn./mx. tTemp temp; double tMaxMedia =0,tMinMedia =0, tMaxAbs =100,tMinAbs =100; int dia =0; double max,min; ifstream archivo; archivo.open("temp.txt"); if(!archivo.is_open()){ cout<<"Nosehapodidoabrirelarchivo!"<<endl; } else { archivo>>min>>max; //Elarchivoterminacon9999 ...
Fundamentosdelaprogramacin:Recorridoybsquedaenarrays Pgina 635
LuisHernndezYez
LuisHernndezYez
while(!((min==99)&&(max ==99)) &&(dia <MaxDias)){ temp[dia][0]=min; temp[dia][1]=max; dia++; archivo>>min>>max; } archivo.close(); for(int i=0;i<dia;i++){ tMinMedia =tMinMedia +temp[i][0]; if(temp[i][0]<tMinAbs){ tMinAbs =temp[i][0]; } tMaxMedia =tMaxMedia +temp[i][1]; if(temp[i][1]>tMaxAbs){ tMaxAbs =temp[i][1]; } } ...
Fundamentosdelaprogramacin:Recorridoybsquedaenarrays Pgina 636
tMinMedia =tMinMedia /dia; tMaxMedia =tMaxMedia /dia; cout<<"Temperaturasmnimas." <<endl; cout<<"Media=" <<fixed<<setprecision(1) <<tMinMedia <<"CMnimaabsoluta=" <<setprecision(1)<<tMinAbs <<"C" <<endl; cout<<"Temperaturasmximas." <<endl; cout<<"Media=" <<fixed<<setprecision(1) <<tMaxMedia <<"CMximaabsoluta=" <<setprecision(1)<<tMaxAbs <<"C" <<endl; } return 0; }
LuisHernndezYez
Fundamentosdelaprogramacin:Recorridoybsquedaenarrays
Pgina 637
Se asignan en el orden en el que los elementos estn en memoria La memoria es de una dimensin: secuencia de celdas En memoria varan ms rpidamente los ndices de la derecha:
cuads[0][0]cuads[0][1]cuads[1][0]cuads[1][1]cuads[2][0]...
Para cada valor del primer ndice: todos los valores del segundo
LuisHernndezYez
Fundamentosdelaprogramacin:Recorridoybsquedaenarrays
Pgina 638
1 1 4 9 16 25
1 1 2 4 3 9 4 16 5 25
0 1 2 3 4
1 2 3 4 5
Si hay menos valores que elementos, el resto se inicializan a cero Inicializacin a cero de todo el array: int cuads[5][2]={0 };
Fundamentosdelaprogramacin:Recorridoybsquedaenarrays
Pgina 639
Memoria 1 2 3 4 5 6 7 8 9 10 11 12 0 0
Pgina 640
Para cada fila (de 0 a FILAS 1): Para cada columna (de 0 a COLUMNAS 1): Procesar el elemento en [fila][columna]
for (int fila=0;fila<FILAS;fila++){ for (int columna=0;columna<COLUMNAS;columna++){ //Procesarmatriz[fila][columna] } }
LuisHernndezYez
Fundamentosdelaprogramacin:Recorridoybsquedaenarrays
Pgina 641
LuisHernndezYez
1 125 231 417 845 652 438 543 541 327 583 427 666
2 234 675 327 654 555 824 353 164 432 333 585 512
3 112 325 333 212 222 547 777 563 249 100 218 400
4 156 111 324 562 777 175 437 327 777 334 843 259
... ... ... ... ... ... ... ... ... ... ... ... ...
28 234 444 354 428 321 765 538 528 743 777 438
29 543 367 548 999 356 678 159 529 468 555 637
201 323 523 145 327 854 654 327 333 524 217 222
Meses
Celdas no utilizadas
8 9 10 11
Fundamentosdelaprogramacin:Recorridoybsquedaenarrays
LuisHernndezYez
Pgina 645
Clculo de las ventas de todo el ao: Para cada mes... Para cada da del mes... Para cada sucursal... Acumular las ventas
const intDIAS =31; const intSUCURSALES=4; typedefdouble tVentaMes[DIAS][SUCURSALES]; typedefstruct { tVentaMes ventas; int dias; }tMes; const intMESES=12; typedeftMes tVentaAnual[MESES]; tVentaAnual anual;
LuisHernndezYez
double total=0; for (int mes=0;mes<MESES;mes++){ for (int dia =0;dia <anual[mes].dias;dia++){ for (int suc =0;suc <SUCURSALES;suc++){ total=total+anual[mes].ventas[dia][suc]; } } }
Fundamentosdelaprogramacin:Recorridoybsquedaenarrays Pgina 646
LuisHernndezYez
Primer valor > umbral boolencontrado=false; int mes=0,dia,suc; while ((mes<MESES)&&!encontrado){ dia =0; while ((dia <anual[mes].dias)&&!encontrado){ suc =0; while ((suc <SUCURSALES)&&!encontrado){ if (anual[mes].ventas[dia][suc]>umbral){ encontrado=true; } else { suc++; } } if (!encontrado){ dia++; } } if (!encontrado){ mes++; } } if (encontrado){...
Fundamentosdelaprogramacin:Recorridoybsquedaenarrays Pgina 647
LuisHernndezYez
Fundamentosdelaprogramacin
7
Grado en Ingeniera Informtica Grado en Ingeniera del Software Grado en Ingeniera de Computadores Luis Hernndez Yez
Algoritmosdeordenacin Algoritmodeordenacinporinsercin Ordenacindearraysporinsercin Algoritmodeordenacinporinsercin conintercambios Clavesdeordenacin Estabilidaddelaordenacin Complejidadyeficiencia Ordenacionesnaturales Ordenacinporseleccindirecta Mtododelaburbuja Listasordenadas Bsquedasenlistasordenadas Bsquedabinaria
LuisHernndezYez
651 654 665 672 680 688 692 694 701 716 722 729 731
Fundamentosdelaprogramacin:Algoritmosdeordenacin
LuisHernndezYez
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 651
Ordenacin de listas
array
125.40 0 76.95 1 328.80 2 254.62 3 435.00 4 164.29 5 316.05 6 219.99 7 93.45 8 756.62 9
array[i]<=array[i+1]
LuisHernndezYez
Mostrar los datos en orden, facilitar las bsquedas, ... Variadas formas de hacerlo (algoritmos)
Fundamentosdelaprogramacin:Algoritmosdeordenacin Pgina 652
Ordenacin de listas
Los datos de la lista deben poderse comparar entre s Sentido de la ordenacin: Ascendente (de menor a mayor) Descendente (de mayor a menor) Algoritmos de ordenacin bsicos: Ordenacin por insercin Ordenacin por seleccin directa Ordenacin por el mtodo de la burbuja Los algoritmos se basan en comparaciones e intercambios Hay otros algoritmos de ordenacin mejores
LuisHernndezYez
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 653
LuisHernndezYez
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 654
LuisHernndezYez
6 1 3 8 2 9 4 7 5
Baraja de nueve cartas numeradas del 1 al 9 Las cartas estn desordenadas Ordenaremos de menor a mayor (ascendente)
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 655
6 1 3 8 2 9 4 7 5
LuisHernndezYez
Lista ordenada:
5
Fundamentosdelaprogramacin:Algoritmosdeordenacin Pgina 656
6 1 3 8 2 9 4 7
LuisHernndezYez
Lista ordenada:
5 7
Fundamentosdelaprogramacin:Algoritmosdeordenacin Pgina 657
6 1 3 8 2 9 4
LuisHernndezYez
Primer elemento (5) mayor que el nuevo (4): Desplazamos todos una posicin a la derecha Insertamos el nuevo en la primera posicin
Hemos insertado el elemento en su lugar Lista ordenada:
5 5 4 7 7
Fundamentosdelaprogramacin:Algoritmosdeordenacin Pgina 658
6 1 3 8 2 9
LuisHernndezYez
Lista ordenada:
4 5 7 9
Fundamentosdelaprogramacin:Algoritmosdeordenacin Pgina 659
6 1 3 8 2
LuisHernndezYez
Primer elemento (4) mayor que el nuevo (2): Desplazamos todos una posicin a la derecha Insertamos el nuevo en la primera posicin
Lista ordenada:
4 4 2 5 5 7 7 9 9
Fundamentosdelaprogramacin:Algoritmosdeordenacin Pgina 660
6 1 3 8
El 9 es el primer elemento mayor que el nuevo (8): Desplazamos desde ese hacia la derecha Insertamos donde estaba el 9
Lista ordenada:
LuisHernndezYez
2 4 5 7 8 4 9 9
Fundamentosdelaprogramacin:Algoritmosdeordenacin Pgina 661
6 1 3
Segundo elemento (4) mayor que el nuevo (3): Desplazamos desde ese hacia la derecha Insertamos donde estaba el 4
Lista ordenada:
LuisHernndezYez
2 3 4 4 4 5 5 7 7 8 8 9 9
Fundamentosdelaprogramacin:Algoritmosdeordenacin Pgina 662
6 1
Primer elemento (2) mayor que el nuevo (1): Desplazamos todos una posicin a la derecha Insertamos el nuevo en la primera posicin
Lista ordenada:
LuisHernndezYez
2 2 1 3 3 4 4 5 5 7 7 8 8 9 9
Fundamentosdelaprogramacin:Algoritmosdeordenacin Pgina 663
El 7 es el primer elemento mayor que el nuevo (6): Desplazamos desde ese hacia la derecha Insertamos donde estaba el 7
1 2 3 4 5 6 7 7 8 8 9 9
Fundamentosdelaprogramacin:Algoritmosdeordenacin Pgina 664
7
1
14
2
32
3
5
4
14
5
27
6
12
7
13
8
15
9
A medida que insertamos: dos zonas en el array Parte ya ordenada y elementos por procesar
7
0
14
1
20
2
32
3
5
4
14
5
27
6
12
7
13
8
15
9
LuisHernndezYez
Parte ya ordenada
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 665
7
1
14
2
32
3
5
4
14
5
27
6
12
7
13
8
15
9
Desde el segundo elemento del array hasta el ltimo: Localizar el primer elemento mayor en lo ya ordenado
20
LuisHernndezYez
7
1
14
2
32
3
5
4
14
5
27
6
12
7
13
8
15
9
nuevo 7
7
1
14
2
32
3
5
4
14
5
27
6
12
7
13
8
15
9
nuevo 7 7
0
LuisHernndezYez
20
1
14
2
32
3
5
4
14
5
27
6
12
7
13
8
15
9
nuevo 7
Fundamentosdelaprogramacin:Algoritmosdeordenacin Pgina 667
Implementacin
LuisHernndezYez
... int nuevo,pos; //Desdeelsegundoelementohastaelltimo... for(int i=1;i<N;i++){ nuevo=lista[i]; pos=0; while((pos<i)&&!(lista[pos]>nuevo)){ pos++; } //pos:ndicedelprimermayor;isinolohay for(int j=i;j>pos;j){ lista[j]=lista[j 1]; } lista[pos]=nuevo; }
Fundamentosdelaprogramacin:Algoritmosdeordenacin Pgina 668
20
0
7
1
14
2
32
3
5
4
14
5
27
6
12
7
13
8
15
9
i 1 20
0
pos 0 27
6
nuevo 7 13
8
7
1
14
2
32
3
5
4
14
5
12
7
15
9
20
0
20
1
14
2
32
3
5
4
14
5
27
6
12
7
13
8
15
9
LuisHernndezYez
7
0
20
1
14
2
32
3
5
4
14
5
27
6
12
7
13
8
15
9
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 669
7
0
14
1
20
2
32
3
5
4
14
5
27
6
12
7
13
8
15
9
i 4 7
0
pos 0 27
6
nuevo 5 13
8
14
1
20
2
32
3
5
4
14
5
12
7
15
9
7
0
LuisHernndezYez
7
1
14
2
20
3
32
4
14
5
27
6
12
7
13
8
15
9
5
0
7
1
14
2
20
3
32
4
14
5
27
6
12
7
13
8
15
9
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 670
5
0
7
1
14
2
20
3
32
4
14
5
27
6
12
7
13
8
15
9
i 5 5
0
pos 3 27
6
nuevo 14 12
7
7
1
14
2
20
3
32
4
14
5
13
8
15
9
5
0
LuisHernndezYez
7
1
14
2
20
3
20
4
32
5
27
6
12
7
13
8
15
9
5
0
7
1
14
2
14 20
3 4
32
5
27
6
12
7
13
8
15
9
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 671
LuisHernndezYez
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 672
La insercin de cada elemento se puede realizar con comparaciones e intercambios Desde el segundo elemento hasta el ltimo: Desde la posicin del nuevo elemento a insertar: Mientras el anterior sea mayor, intercambiar
5
0
7
1
14
2
20
3
32
4
14
5
27
6
12
7
13
8
15
9
5
0
LuisHernndezYez
7
1
14
2
20
3
14
4
32
5
27
6
12
7
13
8
15
9
5
0
7
1
14
2
14 20
3 4
32
5
27
6
12
7
13
8
15
9
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 673
7
0
14
1
20
2
32
3
5
4
14
5
27
6
12
7
13
8
15
9
7
0
14
1
20
2
5
3
32
4
14
5
27
6
12
7
13
8
15
9
7
0
14
1
5
2
20
3
32
4
14
5
27
6
12
7
13
8
15
9
7
0
LuisHernndezYez
5
1
14
2
20
3
32
4
14
5
27
6
12
7
13
8
15
9
5
0
7
1
14
2
20
3
32
4
14
5
27
6
12
7
13
8
15
9
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 674
LuisHernndezYez
... int tmp,pos; //Desdeelsegundoelementohastaelltimo... for(int i=1;i<N;i++){ pos=i; //Mientrasnoalprincipioyanteriormayor... while((pos>0)&&(lista[pos 1]>lista[pos])){ //Intercambiar... tmp=lista[pos]; lista[pos]=lista[pos 1]; lista[pos 1]=tmp; pos;//Posicinanterior } }
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 675
insercion.cpp
const int N=100; typedef inttArray[N]; typedefstruct{ //Listadelongitudvariable tArray elementos; int contador; }tLista; int main(){ tLista lista; ifstream archivo; int dato,pos,tmp; lista.contador =0; ...
Fundamentosdelaprogramacin:Algoritmosdeordenacin Pgina 676
LuisHernndezYez
LuisHernndezYez
archivo.open("insercion.txt"); if (!archivo.is_open()){ cout<<"Errordeaperturadearchivo!" <<endl; } else { archivo>>dato; while ((lista.contador <N)&&(dato!=1)){ //Centinela1alfinal lista.elementos[lista.contador]=dato; lista.contador++; archivo>>dato; } archivo.close(); //SihaymsdeNignoramoselresto cout<<"Antesdeordenar:"<<endl; for (int i=0;i<lista.contador;i++){ cout<<lista.elementos[i]<<""; } cout<<endl;...
Fundamentosdelaprogramacin:Algoritmosdeordenacin Pgina 677
LuisHernndezYez
for (int i=1;i<lista.contador;i++){ pos=i; while ((pos>0) &&(lista.elementos[pos1]>lista.elementos[pos])) { tmp=lista.elementos[pos]; lista.elementos[pos]=lista.elementos[pos 1]; lista.elementos[pos 1]=tmp; pos; } } cout<<"Despusdeordenar:"<<endl; for (int i=0;i<lista.contador;i++){ cout<<lista.elementos[i]<<""; } cout<<endl; } return 0; }
Fundamentosdelaprogramacin:Algoritmosdeordenacin Pgina 678
Consideracin de implementacin
Operador relacional adecuado? lista[pos 1] > o >= ? lista[pos] Con >= se realizan intercambios intiles:
5
0
7
1
14
2
20
3
32
4
14
5
27
6
12
7
13
8
15
9
5
0
7
1
14
2
20
3
14
4
32
5
27
6
12
7
13
8
15
9
LuisHernndezYez
5
0
7
1
14
2
14
3
20
4
32
5
27
6
12
7
13
8
15
9
Intercambio intil!
Fundamentosdelaprogramacin:Algoritmosdeordenacin Pgina 679
LuisHernndezYez
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 680
Claves de ordenacin
Elementos que son estructuras con varios campos:
constintN=15; typedefstruct { intcodigo; stringnombre; doublesueldo; } tDato; typedeftDatotLista[N]; tListalista;
LuisHernndezYez
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 681
Claves de ordenacin
tDato tmp; while ((pos>0) &&(lista[pos 1].nombre>lista[pos].nombre)){ tmp=lista[pos]; lista[pos]=lista[pos 1]; lista[pos 1]=tmp; pos; }
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 682
Claves de ordenacin
Funcin para la comparacin:
bool operator>(tDato opIzq,tDato opDer){ return (opIzq.nombre >opDer.nombre); } tDato tmp; while ((pos>0)&&(lista[pos 1]>lista[pos])){ tmp=lista[pos]; lista[pos]=lista[pos 1]; lista[pos 1]=tmp; pos; }
LuisHernndezYez
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 683
claves.cpp
Claves de ordenacin
#include<iostream> #include<string> usingnamespacestd; #include<fstream> #include<iomanip> constint N=15; typedef struct { int codigo; string nombre; double sueldo; }tDato; typedef tDatotArray[N]; typedef struct { tArray datos; int cont; }tLista; ...
Fundamentosdelaprogramacin:Algoritmosdeordenacin Pgina 684
LuisHernndezYez
void mostrar(tListalista); bool operator>(tDato opIzq,tDato opDer); int main(){ tListalista; ifstreamarchivo; lista.cont =0; archivo.open("datos.txt"); if(!archivo.is_open()){ cout<<"Errordeaperturadelarchivo!" <<endl; } else { tDato dato; archivo>>dato.codigo; while ((lista.cont <N)&&(dato.codigo !=1)){ archivo>>dato.nombre >>dato.sueldo; lista.datos[lista.cont]=dato; lista.cont++; archivo>>dato.codigo; } archivo.close();...
Fundamentosdelaprogramacin:Algoritmosdeordenacin Pgina 685
LuisHernndezYez
LuisHernndezYez
cout<<"Antesdeordenar:"<<endl; mostrar(lista); for (int i=1;i<lista.cont;i++){ //Desdeelsegundoelementohastaelltimo int pos=i; while ((pos>0) &&(lista.datos[pos1]>lista.datos[pos])){ tDatotmp; tmp=lista.datos[pos]; lista.datos[pos]=lista.datos[pos 1]; lista.datos[pos 1]=tmp; pos; } } cout<<"Despusdeordenar:"<<endl; mostrar(lista); } return 0; }
Fundamentosdelaprogramacin:Algoritmosdeordenacin
...
Pgina 686
void mostrar(tLista lista){ for (int i=0;i<lista.cont;i++){ cout<<setw(10) <<lista.datos[i].codigo <<setw(20) <<lista.datos[i].nombre <<setw(12) <<fixed <<setprecision(2) <<lista.datos[i].sueldo <<endl; } }
LuisHernndezYez
LuisHernndezYez
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 688
11111Durn120000 22222Fernndez120000 12345Gmez100000 10000Hernndez150000 21112Jimnez100000 11111Prez90000 12345Snchez90000 10000Sergei100000 33333Tarazona120000 12345Turgano100000 11111Urpiano90000
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 689
10000Hernndez150000 10000Sergei100000 11111Bentez 100000 11111Durn 120000 11111Prez 90000 11111Urpiano 90000 12345lvarez120000 12345Gmez100000 12345Snchez90000 12345Turgano100000 21112Domnguez90000 21112Jimnez100000 22222Fernndez120000 33333Tarazona120000
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 690
LuisHernndezYez
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 691
LuisHernndezYez
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 692
7
1
12
2
13
3
14
4
14
5
15
6
20
7
27
8
32
9
27
1
20
2
15
3
14
4
14
5
13
6
12
7
7
8
5
9
20
1
7
2
14
3
12
4
32
5
27
6
14
7
5
8
15
9
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 693
Ordenaciones naturales
Si el algoritmo trabaja menos cuanto ms ordenada est inicialmente la lista, se dice que la ordenacin es natural Ordenacin por insercin con la lista inicialmente ordenada: Versin que busca el lugar primero y luego desplaza: No hay desplazamientos; mismo nmero de comparaciones Comportamiento no natural Versin con intercambios: Trabaja mucho menos; basta una comparacin cada vez Comportamiento natural
LuisHernndezYez
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 694
Operaciones que realiza el algoritmo de ordenacin: Comparaciones Intercambios Asumimos que tardan un tiempo similar
Fundamentosdelaprogramacin:Algoritmosdeordenacin Pgina 695
Clculo de la complejidad
Ordenacin por insercin (con intercambios):
... for(int i=1;i<N;i++){ int pos=i; while((pos>0)&&(lista[pos 1]>lista[pos])){ int tmp; Comparacin tmp=lista[pos]; lista[pos]=lista[pos 1]; lista[pos 1]=tmp; pos; Intercambio } }
LuisHernndezYez
Clculo de la complejidad
N 1 ciclos ... for(int i=1;i<N;i++){ N variable de ciclos int pos=i; while((pos>0)&&(lista[pos 1]>lista[pos])){ int tmp; tmp=lista[pos]; lista[pos]=lista[pos 1]; lista[pos 1]=tmp; pos; } }
LuisHernndezYez
Caso en el que el while se ejecuta ms: caso peor Caso en el que se ejecuta menos: caso mejor
Fundamentosdelaprogramacin:Algoritmosdeordenacin Pgina 697
Clculo de la complejidad
Caso mejor: lista inicialmente ordenada La primera comparacin falla: ningn intercambio (N 1) * (1 comparacin + 0 intercambios) = N 1 O(N) Caso peor: lista inicialmente ordenada al revs Para cada pos, entre i y 1: 1 comparacin y 1 intercambio 1 + 2 + 3 + 4 + ... + (N 1) ((N 1) + 1) x (N 1) / 2 N * (N 1) / 2 (N2 N) / 2 O(N2) Notacin O grande: orden de complejidad en base a N El trmino en N que ms rpidamente crece al crecer N En el caso peor, N2 crece ms rpido que N O(N2) (Ignoramos las constantes, como 2)
Fundamentosdelaprogramacin:Algoritmosdeordenacin Pgina 698
LuisHernndezYez
LuisHernndezYez
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 699
rdenes de complejidad
O(log N) < O(N) < O(N log N) < O(N2) < O(N3) ...
Nlog2 NN2 101 214 4216 8364 164256 3251024 6464096 128716384 256865536 ...
Fundamentosdelaprogramacin:Algoritmosdeordenacin Pgina 700
LuisHernndezYez
LuisHernndezYez
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 701
Lista desordenada:
5 7 4 9 2 8 3 1 6
LuisHernndezYez
Lista ordenada:
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 702
Lista desordenada:
5 7 4 9 2 8 3 1
LuisHernndezYez
Lista ordenada:
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 703
Lista desordenada:
5 7 4 9 1 2
8 3
LuisHernndezYez
Lista ordenada:
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 704
Lista desordenada:
5 7 4 9 1 2 3
LuisHernndezYez
Lista ordenada:
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 705
Lista desordenada:
5 7
LuisHernndezYez
Lista ordenada:
1 2 3 4
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 706
Lista desordenada:
LuisHernndezYez
Lista ordenada:
1 2 3 4 5
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 707
Lista desordenada:
LuisHernndezYez
Lista ordenada:
1 2 3 4 5 6
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 708
Lista desordenada:
LuisHernndezYez
Lista ordenada:
1 2 3 4 5 6 7
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 709
Lista desordenada:
9 1 2 3 4 5 6 7 8
LuisHernndezYez
Lista ordenada:
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 710
Lista desordenada:
Lista ordenada:
1 2 3 4 5 6 7 8 9
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 711
m 7
1
14
2
32
3
5
4
14
5
27
6
12
7
13
8
15
9
im
LuisHernndezYez
5
0
7
1
32
3
20
4
14
5
27
6
12
7
13
8
15
9
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 712
m 32
3
7
1
14
2
20
4
14
5
27
6
12
7
13
8
15
9
i 5
0
m 20
4
7
1
12
2
32
3
14
5
27
6
14
7
13
8
15
9
i
LuisHernndezYez
m 14
5
5
0
7
1
12
2
13
3
20
4
27
6
14
7
32
8
15
9
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 713
seleccion.cpp
Implementacin
LuisHernndezYez
//Desdeelprimerelementohastaelpenltimo... for(int i=0;i<N 1;i++){ int menor=i; //Desdei+1hastaelfinal... for(int j=i+1;j<N;j++){ if (lista[j]<lista[menor]){ menor=j; } } if (menor>i){ int tmp; tmp=lista[i]; lista[i]=lista[menor]; lista[menor]=tmp; } }
Fundamentosdelaprogramacin:Algoritmosdeordenacin Pgina 714
No es estable: intercambios a larga distancia No se garantiza que se mantenga el mismo orden relativo original Comportamiento no natural (trabaja siempre lo mismo)
Fundamentosdelaprogramacin:Algoritmosdeordenacin Pgina 715
LuisHernndezYez
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 716
9 4 3
LuisHernndezYez
9 4 3 1 6
9 4 1 3 6
9 1 4 3 6
1 9 4 3 6
Pgina 717
6 1
Fundamentosdelaprogramacin:Algoritmosdeordenacin
12
0
32
1
14
2
5
3
14
4
7
5
12
0
32
1
14
2
5
3
7
4
14
5
12
0
32
1
14
2
5
3
7
4
14
5
12
0
32
1
5
2
14
3
7
4
14
5
LuisHernndezYez
12
0
5
1
32
2
14
3
7
4
14
5
5
0
12
1
32
2
14
3
7
4
14
5 Pgina 718
Fundamentosdelaprogramacin:Algoritmosdeordenacin
burbuja.cpp
LuisHernndezYez
LuisHernndezYez
Pgina 720
burbuja2.cpp
LuisHernndezYez
bool inter=true; int i=0; //Desdeel1hastaelpenltimosihayintercambios... while((i<N 1)&&inter){ inter=false; //Desdeelltimohastaelsiguienteai... for(int j=N 1;j>i;j){ if (lista[j]<lista[j 1]){ int tmp; tmp=lista[j]; lista[j]=lista[j 1]; lista[j 1]=tmp; inter=true; } } if (inter){ i++; } } Esta variacin s tiene un comportamiento natural
Fundamentosdelaprogramacin:Algoritmosdeordenacin Pgina 721
LuisHernndezYez
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 722
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 723
lista.cpp
LuisHernndezYez
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 724
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 725
Nuevas implementaciones: Operadores relacionales Insercin (mantener el orden) Bsqueda (ms eficiente) Se guarda la lista en orden, por lo que cargar() no cambia
booloperator>(tRegistro opIzq,tRegistro opDer){ return opIzq.nombre >opDer.nombre; } booloperator<(tRegistro opIzq,tRegistro opDer){
LuisHernndezYez
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 726
LuisHernndezYez
void insertar(tLista &lista,tRegistro registro,bool &ok){ ok=true; if (lista.cont ==N){ ok=false;//listallena } else { int i=0; while ((i<lista.cont)&&(lista.registros[i]<registro)){ i++; } //Insertamosenlaposicini(primermayoroigual) for (int j=lista.cont;j>i;j){ //Desplazamosunaposicinaladerecha lista.registros[j]=lista.registros[j 1]; } lista.registros[i]=registro; lista.cont++; } }
Fundamentosdelaprogramacin:Algoritmosdeordenacin Pgina 727
LuisHernndezYez
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 728
7
1
12
2
13
3
14
4
14
5
15
6
20
7
27
8
32
9
LuisHernndezYez
Buscamos el 36: al llegar al final sabemos que no est Buscamos el 17: al llegar al 20 ya sabemos que no est Condiciones de terminacin: Se llega al final Se encuentra el elemento buscado Se encuentra uno mayor Mientras no al final y el valor sea menor que el buscado
Fundamentosdelaprogramacin:Algoritmosdeordenacin Pgina 729
LuisHernndezYez
int buscado; constintN=10; cout<<"Valorabuscar:"; typedefinttLista[N]; cin>>buscado; tLista lista; int i=0; while((i<N)&&(lista[i]<buscado)){ i++; } //Ahora,oestamosalfinalolista[i]>=buscado if(i==N){//Alfinal:nosehaencontrado cout<<"Noencontrado!" <<endl; } elseif (lista[i]==buscado){//Encontrado! cout<<"Encontradoenposicin" <<i+1 <<endl; } else { //Hemosencontradounomayor cout<<"Noencontrado!" <<endl; } Complejidad: O(N)
Fundamentosdelaprogramacin:Algoritmosdeordenacin Pgina 730
LuisHernndezYez
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 731
Bsqueda mucho ms rpida que aprovecha la ordenacin Comparar con el valor que est en el medio de la lista: Si es el que se busca, terminar Si no, si es mayor, buscar en la primera mitad de la lista Si no, si es menor, buscar en la segunda mitad de la lista Repetir hasta encontrarlo o no quede sublista donde buscar
Buscamos el 12
5
0
Elemento mitad 14
3
7
1
12
2
14
4
15
5
18
6
20
7
27
8
32
9
5
LuisHernndezYez
7
1
12
2
14
3
14
4
15
5
18
6
20
7
27
8
32
9
5
0
7
1
12
2
14
3
14
4
15
5
18
6
20
7
27
8
32
9 Pgina 732
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Vamos buscando en sublistas cada vez ms pequeas (mitades) Delimitamos el segmento de la lista donde buscar Inicialmente tenemos toda la lista:
ini 5
0
mitad 7
1
fin 15
5
12
2
14
3
14
4
18
6
20
7
27
8
32
9
ndice del elemento en la mitad: mitad=(ini+fin)/2 Si no se encuentra, dnde seguir buscando? Buscado < elemento en la mitad: fin=mitad 1 Buscado > elemento en la mitad: ini=mitad+1 Si ini > fin, no queda dnde buscar
LuisHernndezYez
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 733
Buscamos el 12
ini 5
0
mitad 7
1
fin 15
5
12
2
14
3
14
4
18
6
20
7
27
8
32
9
12 <lista[mitad] fin=mitad 1
ini mitad 5
0
fin 12
2
7
1
14
3
14
4
15
5
18
6
20
7
27
8
32
9
12 >lista[mitad] ini=mitad+1
ini
LuisHernndezYez
fin 14
3
5
0
7
1
12
2
14
4
15
5
18
6
20
7
27
8
32
9
mitad
Encontrado!
Pgina 734
Fundamentosdelaprogramacin:Algoritmosdeordenacin
7
1
14
3
14
4
15
5
18
6
20
7
27
8
32
9
13 >lista[mitad] ini=mitad+1
mitad ini fin 5
LuisHernndezYez
7
1
12
2
14
3
14
4
15
5
18
6
20
7
27
8
32
9
Implementacin
LuisHernndezYez
int buscado; cout<<"Valorabuscar:"; cin>>buscado; int ini=0,fin=N 1,mitad; bool encontrado=false; while((ini<=fin)&&!encontrado){ mitad=(ini+fin)/2;//Divisinentera if(buscado==lista[mitad]){ encontrado=true; } elseif(buscado<lista[mitad]){ fin=mitad 1; } else{ ini=mitad+1; } }//Sisehaencontrado,esten[mitad]
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 736
#include<iostream> usingnamespacestd; #include<fstream> constint N=100; typedef int tArray[N]; typedef struct { tArray elementos; int cont; }tLista; int buscar(tLista lista,int buscado);
binaria.cpp
int main(){ tLista lista; ifstream archivo; int dato; lista.cont =0; archivo.open("ordenados.txt");//Existeyescorrecto archivo>>dato; ...
Fundamentosdelaprogramacin:Algoritmosdeordenacin Pgina 737
LuisHernndezYez
LuisHernndezYez
while ((lista.cont <N)&&(dato!=1)){ lista.elementos[lista.cont]=dato; lista.cont++; archivo>>dato; } archivo.close(); for (int i=0;i<lista.cont;i++){ cout<<lista.elementos[i]<<""; } cout<<endl; int buscado,pos; cout<<"Valorabuscar:"; cin>>buscado; pos=buscar(lista,buscado); if (pos!=1){ cout<<"Encontradoenlaposicin"<<pos+1 <<endl; } else { cout<<"Noencontrado!"<<endl; } return 0; }...
Fundamentosdelaprogramacin:Algoritmosdeordenacin Pgina 738
LuisHernndezYez
int buscar(tListalista,int buscado){ int pos=1,ini=0,fin=lista.cont 1,mitad; bool encontrado=false; while ((ini<=fin)&&!encontrado){ mitad=(ini+fin)/2;//Divisinentera if (buscado==lista.elementos[mitad]){ encontrado=true; } elseif(buscado<lista.elementos[mitad]){ fin=mitad 1; } else { ini=mitad+1; } } if (encontrado){ pos=mitad; } return pos; }
Fundamentosdelaprogramacin:Algoritmosdeordenacin Pgina 739
Complejidad
Qu orden de complejidad tiene la bsqueda binaria? Caso peor: No est o se encuentra en una sublista de 1 elemento N de comparaciones = N de mitades que podemos hacer N / 2, N / 4, N / 8, N / 16, ..., 8, 4, 2, 1 1, 2, 4, 8, ..., N / 16, N / 8, N / 4, N / 2 Si hacemos que N sea igual a 2k: 20, 21, 22, 23, ..., 2k4, 2k3, 2k2, 2k1 N de elementos de esa serie: k N de comparaciones = k N = 2k k = log2 N Complejidad: O(log2 N) Mucho ms rpida que O(N)
Fundamentosdelaprogramacin:Algoritmosdeordenacin Pgina 740
LuisHernndezYez
LuisHernndezYez
Fundamentosdelaprogramacin
7A
Grado en Ingeniera Informtica Grado en Ingeniera del Software Grado en Ingeniera de Computadores Luis Hernndez Yez
Ordenacinporintercambio Mezcladedoslistasordenadas
744 747
LuisHernndezYez
Fundamentosdelaprogramacin:Algoritmosdeordenacin(Anexo)
LuisHernndezYez
Fundamentosdelaprogramacin:Algoritmosdeordenacin(Anexo)
Pgina 744
7
1
12
2
32
3
20
4
14
5
27
6
5
7
13
8
15
9
7
0
14
1
12
2
32
3
20
4
14
5
27
6
5
7
13
8
15
9
LuisHernndezYez
5
0
14
1
12
2
32
3
20
4
14
5
27
6
7
7
13
8
15
9
Fundamentosdelaprogramacin:Algoritmosdeordenacin(Anexo)
Pgina 745
intercambio.cpp constintN=10; typedefinttLista[N]; tLista lista; ... for(int i=0;i<N 1;i++){ //Desdeelprimerelementohastaelpenltimo for(int j=i+1;j<N;j++){ //Desdei+1hastaelfinal if (lista[j]<lista[i]){ int tmp; tmp=lista[i]; lista[i]=lista[j]; lista[j]=tmp; } }
LuisHernndezYez
LuisHernndezYez
Fundamentosdelaprogramacin:Algoritmosdeordenacin(Anexo)
Pgina 747
Fundamentosdelaprogramacin:Algoritmosdeordenacin(Anexo)
Pgina 748
void mezcla(tLista lista1,tLista lista2,tLista&listaM){ int pos1=0,pos2=0; listaM.cont =0; while ((pos1<lista1.cont)&&(pos2<lista2.cont) &&(listaM.cont <N)){ if (lista1.elementos[pos1]<lista2.elementos[pos2]){ listaM.elementos[listaM.cont]=lista1.elementos[pos1]; pos1++; } else { listaM.elementos[listaM.cont]=lista2.elementos[pos2]; pos2++; } listaM.cont++; } ...
LuisHernndezYez
Fundamentosdelaprogramacin:Algoritmosdeordenacin(Anexo)
Pgina 749
mezcla1.cpp //Puedenquedardatosenalgunadelaslistas if (pos1<lista1.cont){ while ((pos1<lista1.cont)&&(listaM.cont <N)){ listaM.elementos[listaM.cont]=lista1.elementos[pos1]; pos1++; listaM.cont++; } } else {//pos2<lista2.cont while ((pos2<lista2.cont)&&(listaM.cont <N)){ listaM.elementos[listaM.cont]=lista2.elementos[pos2]; pos2++; listaM.cont++; } }
LuisHernndezYez
Fundamentosdelaprogramacin:Algoritmosdeordenacin(Anexo)
Pgina 750
LuisHernndezYez
Fundamentosdelaprogramacin:Algoritmosdeordenacin(Anexo)
Pgina 751
if (dato1<dato2){ mezcla<<dato1<<endl; archivo1>>dato1; }else{ mezcla<<dato2<<endl; archivo2>>dato2; } }//Unodelosdosarchivossehaacabado if (dato1!=1){//Quedanenelprimerarchivo while (dato1!=1){ mezcla<<dato1<<endl; archivo1>>dato1; } } else {//Quedanenelsegundoarchivo while (dato2!=1){ mezcla<<dato2<<endl; archivo2>>dato2; } } ...
Fundamentosdelaprogramacin:Algoritmosdeordenacin(Anexo) Pgina 752
LuisHernndezYez
LuisHernndezYez
Fundamentosdelaprogramacin:Algoritmosdeordenacin(Anexo)
Pgina 753
LuisHernndezYez
Fundamentosdelaprogramacin
8
Grado en Ingeniera Informtica Grado en Ingeniera del Software Grado en Ingeniera de Computadores Luis Hernndez Yez
LuisHernndezYez
Programasmultiarchivoycompilacinseparada Interfazfrenteaimplementacin Usodemdulosdebiblioteca Ejemplo:GestindeunalistaordenadaI Compilacindeprogramasmultiarchivo Elpreprocesador Cadacosaensumdulo Ejemplo:GestindeunalistaordenadaII Elproblemadelasinclusionesmltiples Compilacincondicional Proteccinfrenteainclusionesmltiples Ejemplo:GestindeunalistaordenadaIII Implementacionesalternativas Espaciosdenombres Implementacionesalternativas Calidadyreutilizacindelsoftware
757 762 768 770 778 780 782 784 789 794 795 796 804 808 817 827
Fundamentosdelaprogramacin:Programacinmodular
LuisHernndezYez
Fundamentosdelaprogramacin:Programacinmodular
Pgina 757
Programas multiarchivo
Cdigo fuente repartido entre varios archivos (mdulos) Cada mdulo con sus declaraciones y sus subprogramas Mdulo: Unidad funcional (estructura de datos, utilidades, ...)
Lista
constintN=10; typedefdoubletArray[N]; typedefstruct{ tArray elem; intcont; }tArray; voidinit(tArray &lista); voidinsert(tArray &lista, doubleelem,bool&ok); voidremove(tArray &lista, intpos,bool&ok); ...
Principal
intmain(){ tArray lista; boolok; init(lista); cargar(lista,"bd.txt"); sort(lista); doubledato; cout<<"Dato:"; cin>>dato; insert(lista,dato,ok); cout<<min(lista)<<endl; cout<<max(lista)<<endl; cout<<sum(lista)<<endl; guardar(lista,"bd.txt"); return0; }
Clculos
doublemean(tArray lista); doublemin(tArray lists); doublemax(tArray lista); doubledesv(tArray lista); intminIndex(tArray lista);
Archivos
boolcargar(tArray &lista, stringnombre); boolguardar(tArray lista, stringnombre); boolmezclar(stringarch1, stringarch2); intsize(stringnombre);
LuisHernndezYez
Ejecutable
Fundamentosdelaprogramacin:Programacinmodular Pgina 758
Compilacin separada
Cada mdulo se compila a cdigo objeto de forma independiente
Lista
constintN=10; typedefdoubletArray[N]; typedefstruct{ tArray elem; intcont; }tArray; voidinit(tArray &lista); voidinsert(tArray &lista, doubleelem,bool&ok); voidremove(tArray &lista, intpos,bool&ok); ...
lista.obj
00101110101011001010010010101 00101010010101011111010101000 10100101010101010010101010101 01100101010101010101010101001 01010101010100000101010101101 01001010101010101000010101011 11001010101010111100110010101 01101010101010010010101001111 00101010101001010100101010010 10100101010100101000010011110 10010101011001010101001010100 10101010101010010101001010101 01000010101011100101010010100 01110101011101001101010100101 01011111110101011001101010111 00001001010100101010101010110
Archivos
boolcargar(tArray &lista, stringnombre); boolguardar(tArray lista, stringnombre); boolmezclar(stringarch1, stringarch2); intsize(stringnombre); boolexportar(stringnombre);
archivos.obj
11101010110010100100101010010 10100101010111110101010001010 01010101010100101010101010110 01010101010101010101010010101 01010101000001010101011010100 10101010101010000101010111100 10101010101111001100101010110 10101010100100101010011110010 10101010010101001010100101010 01010101001010000100111101001 01010110010101010010101001010 10101010100101010010101010100 00101010111001010100101000111 01010111010011010101001010101 11111101010110011010101110000 10010101001010101010101101111
Clculos
doublemean(tArray lista); doublemin(tArray lists); doublemax(tArray lista);
calculos.obj
01011001010010010101001010100 10101011111010101000101001010 10101010010101010101011001010 10101010101010101001010101010 10100000101010101101010010101 01010101000010101011110010101 01010111100110010101011010101 01010010010101001111001010101 01001010100101010010101001010 10100101000010011110100101010 11001010101001010100101010101 01010010101001010101010000101 01011100101010010100011101010 11101001101010100101010111111 10101011001101010111000010010 10100101010101010110001111010
LuisHernndezYez
Fundamentosdelaprogramacin:Programacinmodular
Pgina 759
Compilacin separada
Al compilar el programa principal, se adjuntan los mdulos compilados
Principal Mdulos del programa
lista.obj calculos.obj archivos.obj
intmain(){ tArray lista; boolok; init(lista); cargar(lista,"bd.txt"); sort(lista); doubledato; cout<<"Dato:"; cin>>dato; insert(lista,dato,ok); cout<<min(lista)<<endl; cout<<max(lista)<<endl; cout<<sum(lista)<<endl; guardar(lista,"bd.txt");
...
return0; }
...
LuisHernndezYez
Ejecutable
Fundamentosdelaprogramacin:Programacinmodular
Pgina 760
Compilacin separada
Slo los archivos fuente modificados necesitan ser recompilados!
Principal
lista.cpp main.cpp
COMPILACIN
lista.obj
iostream.obj fstream.obj
calculos.obj
archivos.obj ...
main.obj
math.obj
... ENLACE
LuisHernndezYez
Ejecutable
Fundamentosdelaprogramacin:Programacinmodular Pgina 761
LuisHernndezYez
Fundamentosdelaprogramacin:Programacinmodular
Pgina 762
LuisHernndezYez
LuisHernndezYez
Fundamentosdelaprogramacin:Programacinmodular
Pgina 764
lista.cpp
#include"lista.h" voidinit(tArray &lista){ lista.cont =0; } voidinsert(tArray &lista, doubleelem,bool&ok){ if(lista.cont ==N){ okfalse; } else{ ...
LuisHernndezYez
Si otro mdulo quiere usar algo de esa biblioteca: Debe incluir el archivo de cabecera
main.cpp
#include"lista.h" ...
Los nombres de archivos de cabecera propios (no del sistema) se encierran entre dobles comillas, no entre ngulos
Pgina 765
Fundamentosdelaprogramacin:Programacinmodular
lista.h
constintN=10; typedefdoubletArray[N]; typedefstruct{ tArray elem; intcont; }tArray; voidinit(tArray &lista); voidinsert(tArray &lista, doubleelem,bool&ok); voidremove(tArray &lista, intpos,bool&ok); ...
Interfaz Archivo de cabecera (.h): todo lo que necesita conocer otro mdulo (o programa principal) que quiera utilizar sus servicios (subprogramas) La directiva #include aade las declaraciones del archivo de cabecera en el cdigo del mdulo (preprocesamiento):
main.cpp
#include"lista.h" ...
Preprocesador
main.cpp
constintN=10; typedefdoubletArray[N]; typedefstruct{ tArray elem; intcont; }tArray; voidinit(tArray &lista); voidinsert(tArray &lista,doubleelem, bool&ok); voidremove(tArray &lista,intpos, bool&ok); ...
LuisHernndezYez
Todo lo que se necesita saber para comprobar si el cdigo de main.cpp hace un uso correcto de la lista (declaraciones y llamadas)
Fundamentosdelaprogramacin:Programacinmodular
Pgina 766
lista.cpp
#include"lista.h" voidinit(tArray &lista){ lista.cont =0; } voidinsert(tArray &lista, doubleelem,bool&ok){ if(lista.cont ==N){ okfalse; } else{ ...
lista.obj
00101110101011001010010010101 00101010010101011111010101000 10100101010101010010101010101 01100101010101010101010101001 01010101010100000101010101101 01001010101010101000010101011 11001010101010111100110010101 01101010101010010010101001111 00101010101001010100101010010 10100101010100101000010011110 10010101011001010101001010100 10101010101010010101001010101 01000010101011100101010010100 01110101011101001101010100101 01011111110101011001101010111 00001001010100101010101010110
LuisHernndezYez
Al compilar el mdulo se genera el cdigo objeto Si no se modifica no hay necesidad de recompilar Cdigo que usa el mdulo: Necesita slo el archivo de cabecera para compilar Se adjunta el cdigo objeto del mdulo durante el enlace
Fundamentosdelaprogramacin:Programacinmodular Pgina 767
LuisHernndezYez
Fundamentosdelaprogramacin:Programacinmodular
Pgina 768
LuisHernndezYez
Archivodecabecera
lista.h
LuisHernndezYez
void mostrar(int pos,tRegistro registro); voidmostrar(const tLista&lista); booloperator>(tRegistro opIzq,tRegistro opDer); booloperator<(tRegistro opIzq,tRegistro opDer); tRegistro nuevo(); void insertar(tLista&lista,tRegistro registro,bool &ok); voideliminar(tLista&lista,intpos,bool &ok);//pos=1..N intbuscar(tLista lista,stringnombre); voidcargar(tLista&lista,bool &ok); voidguardar(tLista lista);
LuisHernndezYez
Fundamentosdelaprogramacin:Programacinmodular
Pgina 771
Implementacin
lista.cpp
LuisHernndezYez
LuisHernndezYez
void insertar(tLista&lista,tRegistro registro,bool &ok){ ok=true; if (lista.cont ==N){ ok=false;//Listallena } else { int i=0; while((i<lista.cont)&&(lista.registros[i]<registro)){ i++; } //Insertamosenlaposicini for (intj=lista.cont;j>i;j){ //Desplazamosaladerecha lista.registros[j]=lista.registros[j 1]; } lista.registros[i]=registro; lista.cont++; } }...
Fundamentosdelaprogramacin:Programacinmodular Pgina773
voideliminar(tLista&lista,intpos,bool &ok){//pos=1.. ok=true; if ((pos<1)||(pos>lista.cont)){ ok=false;//Posicininexistente } else { pos;//Pasamosandicedelarray for (inti=pos+1;i<lista.cont;i++){ //Desplazamosalaizquierda lista.registros[i 1]=lista.registros[i]; } lista.cont; } }
LuisHernndezYez
...
Fundamentosdelaprogramacin:Programacinmodular
Pgina774
Programaprincipal
bd.cpp
LuisHernndezYez
LuisHernndezYez
if (op ==1){ tRegistro registro=nuevo(); insertar(lista,registro,ok); if (!ok){ cout<<"Error:Listallena!"<<endl; } } elseif(op ==2){ cout<<"Posicin:"; cin>>pos; eliminar(lista,pos,ok); if (!ok){ cout<<"Error:Posicion inexistente!"<<endl; } } elseif(op ==3){ stringnombre; cin.sync(); cout<<"Nombre:"; cin>>nombre; intpos=buscar(lista,nombre); ...
Fundamentosdelaprogramacin:Programacinmodular
Pgina776
if (pos==1){ cout<<"Nosehaencontrado!" <<endl; } else { cout<<"Encontradoenlaposicin" <<pos<<endl; } } }while (op !=0); guardar(lista); } return 0; } int menu(){ cout<<endl; cout<<"1 Insertar"<<endl; cout<<"2 Eliminar" <<endl; cout<<"3 Buscar" <<endl; cout<<"0 Salir" <<endl; int op; do { ...
LuisHernndezYez
Fundamentosdelaprogramacin:Programacinmodular
Pgina777
LuisHernndezYez
Fundamentosdelaprogramacin:Programacinmodular
Pgina 778
G++
Archivos de cabecera e implementacin en la misma carpeta Listamos todos los .cpp en la orden g++: D:\FP\Tema08>g++obd.exelista.cppbd.cpp Recuerda que slo se compilan los .cpp
Visual C++/Studio
Archivos de cabecera e implementacin en grupos distintos: A los archivos de cabecera los llama de encabezado Con Depurar>Generarsolucin se compilan todos los .cpp
Fundamentosdelaprogramacin:Programacinmodular Pgina 779
LuisHernndezYez
LuisHernndezYez
Fundamentosdelaprogramacin:Programacinmodular
Pgina 780
Directivas: #... Antes de compilar se pone en marcha el preprocesador Interpreta las directivas y genera un nico archivo temporal con todo el cdigo del mdulo o programa Como en la inclusin (directiva #include):
#include<string> usingnamespacestd; constintN=100; typedefstruct{ intcodigo; stringnombre; doublesueldo; }tRegistro; typedeftRegistro tArray[N];
#include"lista.h" intmenu(); ...
#include<string> usingnamespacestd; constintN=100; typedefstruct{ intcodigo; stringnombre; doublesueldo; }tRegistro; typedeftRegistro tArray[N]; typedefstruct{ tArray registros; intcont; }tLista; ... intmenu(); ...
LuisHernndezYez
Fundamentosdelaprogramacin:Programacinmodular
Pgina 781
LuisHernndezYez
Fundamentosdelaprogramacin:Programacinmodular
Pgina 782
Lista de registros: Estructura tRegistro Estructura tLista (contiene tRegistro) Cada estructura, en su mdulo
LuisHernndezYez
Pgina 783
Cabecera
registro.h
LuisHernndezYez
Fundamentosdelaprogramacin:Programacinmodular
Pgina 784
Implementacin
registro.cpp
LuisHernndezYez
Cabecera
lista2.h
LuisHernndezYez
Fundamentosdelaprogramacin:Programacinmodular
Pgina 786
Implementacin
lista2.cpp
LuisHernndezYez
bd2.cpp
LuisHernndezYez
LuisHernndezYez
Fundamentosdelaprogramacin:Programacinmodular
Pgina 789
bd2.cpp
... #include"registro.h" #include"lista2.h" ...
registro.cpp
... #include"registro.h" ...
lista2.h
... #include"registro.h" ...
LuisHernndezYez
lista2.cpp
Incluye...
Fundamentosdelaprogramacin:Programacinmodular
Pgina 790
LuisHernndezYez
Fundamentosdelaprogramacin:Programacinmodular
Pgina 791
Sustituido
#include<string> usingnamespacestd; #include<string> usingnamespacestd; typedef struct { ... }tRegistro; ... const int N=100; typedef tRegistro tArray[N]; typedef struct { tArray registros; int cont; }tLista; ...
...
Fundamentosdelaprogramacin:Programacinmodular
Pgina 792
const int N=100; typedef tRegistro tArray[N]; typedef struct { tArray registros; int cont; }tLista; ... intmenu(); ...
Identificador duplicado!
Fundamentosdelaprogramacin:Programacinmodular
Pgina 793
Compilacin condicional
Directivas #ifdef, #ifndef, #else y #endif Se usan en conjuncin con la directiva #define
#define X #ifdef X ...//Cdigoif [#else ...//Cdigoelse ] #endif
LuisHernndezYez
La directiva #define define un smbolo (identificador) Izquierda: se compilar el Cdigo if y no el Cdigo else Derecha: al revs, o nada si no hay else Las clusulas else son opcionales
Fundamentosdelaprogramacin:Programacinmodular Pgina 794
Identificadores duplicados! Cada mdulo debe incluirse una y slo una vez Proteccin frente a inclusiones mltiples:
#ifndef X #define X ...//Mdulo #endif
LuisHernndezYez
La primera vez no est definido el smbolo X: se incluye y define Las siguientes veces el smbolo X ya est definido: no se incluye Smbolo X: nombre del archivo con _ en lugar de . registro_h, lista2_h, ...
Fundamentosdelaprogramacin:Programacinmodular Pgina 795
Cabecera
registrofin.h
LuisHernndezYez
Implementacin
registrofin.cpp
LuisHernndezYez
Cabecera
listafin.h
LuisHernndezYez
Implementacin
listafin.cpp
LuisHernndezYez
bdfin.cpp
cargar(lista,ok); if (!ok){ cout<<"Nosepudo abrir elarchivo!" <<endl; } else { do { mostrar(lista); op=menu(); ...
Fundamentosdelaprogramacin:Programacinmodular Pgina 800
LuisHernndezYez
LuisHernndezYez
Fundamentosdelaprogramacin:Programacinmodular
Pgina 801
#ifndef listafin_h #define listafin_h #include<string> usingnamespacestd; #include "registrofin.h" const int N=100; typedef tRegistro tArray[N]; typedef struct { tArray registros; int cont; }tLista; ...
Fundamentosdelaprogramacin:Programacinmodular
#ifndef registrofin_h #define registrofin_h #include<string> usingnamespacestd; typedef struct { ... }tRegistro; ...
LuisHernndezYez
LuisHernndezYez
Fundamentosdelaprogramacin:Programacinmodular
Pgina 804
lista.h
Lista ordenada
Lista no ordenada
LuisHernndezYez
Fundamentosdelaprogramacin:Programacinmodular
Pgina 805
LuisHernndezYez
void insertar(tLista&lista,tRegistro registro,bool &ok){ ok=true; if (lista.cont ==N){ ok=false;//Listallena ... } #include "lista.h" else { lista.registros[lista.cont] =registro; void insertar(tLista&lista,tRegistro registro,bool &ok) { lista.cont++; ok=true; } if (lista.cont ==N){ } ok=false;//Lista llena ... } else { int i=0; while((i<lista.cont)&&(lista.registros[i]<registro)){ i++; } //Insertamos enlaposicin i for (intj=lista.cont;j>i;j){ //Desplazamos aladerecha lista.registros[j]=lista.registros[j 1]; } lista.registros[i]=registro; ...
Fundamentosdelaprogramacin:Programacinmodular
Pgina 806
LuisHernndezYez
Fundamentosdelaprogramacin:Programacinmodular
Pgina 807
LuisHernndezYez
Fundamentosdelaprogramacin:Programacinmodular
Pgina 808
Por ejemplo:
namespace miEspacio { int i; double d; }
LuisHernndezYez
Fundamentosdelaprogramacin:Programacinmodular
Pgina 809
Puede haber entidades con el mismo identificador en distintos mdulos o en mbitos distintos de un mismo mdulo Cada declaracin en un espacio de nombres distinto:
LuisHernndezYez
using
Introduce un nombre de un espacio de nombres en el mbito actual:
#include <iostream> usingnamespacestd; namespace primero{ int x=5; int y=10; 5 } namespace segundo{ 2.7183 double x=3.1416; 10 double y=2.7183; } 3.1416 int main(){ using primero::x; using segundo::y; cout<<x<<endl;//xesprimero::x cout<<y<<endl;//yessegundo::y cout<<primero::y<<endl;//espacioexplcito cout<<segundo::x<<endl;//espacioexplcito return 0; }
Fundamentosdelaprogramacin:Programacinmodular Pgina 811
LuisHernndezYez
usingnamespace
Introduce todos los nombres de un espacio en el mbito actual:
#include <iostream> usingnamespacestd; namespace primero{ int x=5; 5 int y=10; using [namespace] 10 } slo tiene efecto namespace segundo{ 3.1416 double x=3.1416; en el bloque 2.7183 double y=2.7183; en que se encuentra } int main(){ usingnamespace primero; cout<<x<<endl;//xesprimero::x cout<<y<<endl;//yesprimero::y cout<<segundo::x<<endl;//espacioexplcito cout<<segundo::y<<endl;//espacioexplcito return 0; }
Fundamentosdelaprogramacin:Programacinmodular Pgina 812
LuisHernndezYez
#ifndef listaEN_h #definelistaEN_h #include"registrofin.h" namespace ord {//Listaordenada const int N=100; typedef tRegistro tArray[N]; typedef struct { tArray registros; int cont; }tLista; const stringBD="bd.txt"; voidmostrar(const tLista&lista); voidinsertar(tLista&lista,tRegistro registro,bool &ok); voideliminar(tLista&lista,intpos,bool &ok);//1..N intbuscar(tLista lista,stringnombre); voidcargar(tLista&lista,bool &ok); voidguardar(tLista lista); }//namespace #endif
Fundamentosdelaprogramacin:Programacinmodular Pgina 813
LuisHernndezYez
Implementacin
#include<iostream> #include<fstream> usingnamespacestd; #include"listaEN.h" void ord::insertar(tLista&lista,tRegistro registro,bool &ok){ //... } voidord::eliminar(tLista&lista,intpos,bool &ok){ //... } intord::buscar(tLista lista,stringnombre){ //... } ...
LuisHernndezYez
Fundamentosdelaprogramacin:Programacinmodular
Pgina 814
LuisHernndezYez
LuisHernndezYez
Implementaciones alternativas
Distintos espacios de nombres para distintas implementaciones Lista ordenada o lista desordenada?
namespace ord {//Lista ordenada const int N=100; typedef tRegistro tArray[N]; ... void mostrar(const tLista&lista); void insertar(tLista&lista,tRegistro registro,bool &ok); ... }//namespace namespace des{//Lista desordenada const int N=100; typedef tRegistro tArray[N]; ... void mostrar(const tLista&lista); void insertar(tLista&lista,tRegistro registro,bool &ok); ... }//namespace
Fundamentosdelaprogramacin:Programacinmodular Pgina 817
LuisHernndezYez
Cabecera
listaEN.h
Implementaciones alternativas
Todo lo comn puede estar fuera de la estructura namespace:
#ifndef listaEN_H #definelistaEN_H #include"registrofin.h" const int N=100; typedef tRegistro tArray[N]; typedef struct { tArray registros; int cont; }tLista;
LuisHernndezYez
namespace ord {//Lista ordenada const string BD="bd.txt"; void insertar(tLista&lista,tRegistro registro,bool &ok); int buscar(tLista lista,string nombre); void cargar(tLista&lista,bool &ok); void guardar(tLista lista); }//namespace namespace des{//Lista desordenada const string BD="bddes.txt"; void insertar(tLista&lista,tRegistro registro,bool &ok); int buscar(tLista lista,string nombre); void cargar(tLista&lista,bool &ok); void guardar(tLista lista); }//namespace #endif cargar() y guardar() se distinguen porque usan su propia BD, pero se implementan exactamente igual
Pgina 819
LuisHernndezYez
Fundamentosdelaprogramacin:Programacinmodular
listaEN.cpp
#include<iostream> usingnamespacestd; #include <fstream> #include "listaEN.h" //IMPLEMENTACINDELOSSUBPROGRAMASCOMUNES void eliminar(tLista&lista,int pos,bool &ok){//... } void mostrar(const tLista&lista){//... } //IMPLEMENTACINDELOSSUBPROGRAMASDELESPACIODENOMBRESord void ord::insertar(tLista&lista,tRegistro registro,bool &ok){ ok=true; if (lista.cont ==N){ ok=false;//Listallena } else { int i=0; while ((i<lista.cont)&&(lista.registros[i]<registro)){ i++; }...
Fundamentosdelaprogramacin:Programacinmodular Pgina 820
LuisHernndezYez
for (int j=lista.cont;j>i;j){ lista.registros[j]=lista.registros[j 1]; } lista.registros[i]=registro; lista.cont++; } } int ord::buscar(tLista lista,string nombre){ int ini=0,fin=lista.cont 1,mitad; bool encontrado=false; while ((ini<=fin)&&!encontrado){ mitad=(ini+fin)/2; if (nombre==lista.registros[mitad].nombre){ encontrado=true; } elseif(nombre<lista.registros[mitad].nombre){ fin=mitad 1; } else { ini=mitad+1; } }...
Fundamentosdelaprogramacin:Programacinmodular Pgina 821
LuisHernndezYez
if (encontrado){ mitad++; } else { mitad=1; } return mitad; } void ord::cargar(tLista&lista,bool &ok){//... } void ord::guardar(tLista lista){//... } ...
LuisHernndezYez
Fundamentosdelaprogramacin:Programacinmodular
Pgina 822
//IMPLEMENTACINDELOSSUBPROGRAMASDELESPACIODENOMBRESdes void des::insertar(tLista&lista,tRegistro registro,bool &ok){ ok=true; if (lista.cont ==N){ ok=false;//Listallena } else { lista.registros[lista.cont]=registro; lista.cont++; } } int des::buscar(tLista lista,string nombre){ int pos=0; bool encontrado=false; while ((pos<lista.cont)&&!encontrado){ if (nombre==lista.registros[pos].nombre){ encontrado=true; } else { pos++; } }...
Fundamentosdelaprogramacin:Programacinmodular Pgina 823
LuisHernndezYez
if (encontrado){ pos++; } else { pos=1; } return pos; } void des::cargar(tLista&lista,bool &ok){//... } void des::guardar(tLista lista){//... }
LuisHernndezYez
Fundamentosdelaprogramacin:Programacinmodular
Pgina 824
bdEN.cpp
Programa principal
#include<iostream> usingnamespacestd; #include"registrofin.h" #include"listaEN.h" usingnamespaceord; int menu(); int main(){ tLista lista; bool ok; ... tRegistro registro=nuevo(); insertar(lista,registro,ok); if (!ok){ ...
LuisHernndezYez
Fundamentosdelaprogramacin:Programacinmodular
Pgina 825
bdEN.cpp
Programa principal
#include<iostream> usingnamespacestd; #include"registrofin.h" #include"listaEN.h" usingnamespacedes; int menu(); int main(){ tLista lista; bool ok; ... tRegistro registro=nuevo(); insertar(lista,registro,ok); if (!ok){ ...
LuisHernndezYez
Fundamentosdelaprogramacin:Programacinmodular
Pgina 826
LuisHernndezYez
Fundamentosdelaprogramacin:Programacinmodular
Pgina 827
Software de calidad
El software debe ser desarrollado con buenas prcticas de ingeniera del software que aseguren un buen nivel de calidad Los distintos mdulos de la aplicacin deben ser probados exhaustivamente, tanto de forma independiente como en su relacin con los dems mdulos La prueba y depuracin es muy importante y todos los equipos debern seguir buenas pautas para asegurar la calidad Los mdulos deben ser igualmente bien documentados, de forma que otros desarrolladores puedan aprovecharlos
LuisHernndezYez
Fundamentosdelaprogramacin:Programacinmodular
Pgina 828
Prueba exhaustiva
El software debe ser probado exhaustivamente Debemos intentar descubrir todos los errores posible Los errores deben ser depurados, corrigiendo el cdigo Pruebas sobre listas: Lista inicialmente vaca Lista inicialmente llena Lista con un nmero intermedio de elementos Archivo no existente Etctera... Se han de probar todas las opciones/situaciones del programa En las clases prcticas veremos cmo se depura el software
Fundamentosdelaprogramacin:Programacinmodular Pgina 829
LuisHernndezYez
No reinventemos la rueda
Desarrollar el software pensando en su posible reutilizacin Un software de calidad debe poder ser fcilmente reutilizado Nuestros mdulos deben ser fcilmente usados y modificados Por ejemplo: Nueva aplicacin que gestione una lista de longitud variable de registros con NIF, nombre, apellidos y edad Partiremos de los mdulos registro y lista existentes Las modificaciones bsicamente afectarn al mdulo registro
LuisHernndezYez
Fundamentosdelaprogramacin:Programacinmodular
Pgina 830
LuisHernndezYez
Fundamentosdelaprogramacin
8A
Grado en Ingeniera Informtica Grado en Ingeniera del Software Grado en Ingeniera de Computadores Luis Hernndez Yez
ventas.cpp
#include<iostream> #include<string> usingnamespacestd; const int NCLI=100; const int NPROD=200; const int NVENTAS=3000; typedef struct { intid_cli; string nif; string nombre; string telefono; }tCliente; typedef struct { tCliente clientes[NCLI]; int cont; }tListaClientes;
LuisHernndezYez
string nombre; double precio; int unidades; }tProducto; typedef struct { tProducto productos[NPROD]; int cont; }tListaProductos; typedef struct { int id; int id_prod; int id_cli; int unidades; }tVenta; typedef struct { tVenta ventas[NVENTAS]; int cont; }tListaVentas; ...
Fundamentosdelaprogramacin:Ejemplodemodularizacin
Pgina 833
LuisHernndezYez
tCliente nuevoCliente(); bool valida(tCliente cliente);//Funcininterna bool operator<(tCliente opIzq,tCliente opDer);//PorNIF voidmostrar(tCliente cliente); voidinicializar(tListaClientes &lista); voidcargar(tListaClientes &lista); voidinsertar(tListaClientes &lista,tCliente cliente,bool &ok); voidbuscar(const tListaClientes &lista,stringnif,tCliente &cliente,bool &ok); voideliminar(tListaClientes &lista,stringnif,bool &ok); voidmostrar(const tListaClientes &lista); tProducto nuevoProducto(); boolvalida(tProducto producto);//Funcininterna booloperator<(tProducto opIzq,tProducto opDer);//Porcdigo voidmostrar(tProducto producto); voidinicializar(tListaProductos &lista); voidcargar(tListaProductos &lista); voidinsertar(tListaProductos &lista,tProducto producto,bool &ok); voidbuscar(const tListaProductos &lista,stringcodigo,tProducto &producto, bool &ok); voideliminar(tListaProductos &lista,stringcodigo,bool &ok); ...
Fundamentosdelaprogramacin:Ejemplodemodularizacin Pgina 834
LuisHernndezYez
void mostrar(const tListaProductos &lista); tVenta nuevaVenta(int id_prod,int id_cli,intunidades); bool valida(tVenta venta);//Funcininterna voidmostrar(tVenta venta,consttListaClientes &clientes, const tListaProductos &productos); voidinicializar(tListaVentas &lista); voidcargar(tListaVentas &lista); void insertar(tListaVentas &lista,tVenta venta,bool &ok); voidbuscar(const tListaVentas &lista,intid,tVenta &venta,bool &ok); void eliminar(tListaVentas &lista,intid,bool &ok); voidventasPorClientes(const tListaVentas &lista); voidventasPorProductos(const tListaVentas &lista); doubletotalVentas(const tListaVentas &ventas,stringnif, consttListaClientes &clientes, consttListaProductos &productos); voidstock(const tListaVentas &ventas,consttListaClientes &clientes, consttListaProductos &productos); intmenu(); intmain(){ ...
Fundamentosdelaprogramacin:Ejemplodemodularizacin
Pgina 835
#include<iostream> #include<string> usingnamespacestd; const int NCLI=100; const int NPROD=200; const int NVENTAS=3000; typedef struct { intid_cli; string nif; string nombre; string telefono; }tCliente;
Lista de productos
Cliente
typedef struct { tProducto productos[NPROD]; int cont; }tListaProductos; typedef struct { int id; int id_prod; int id_cli; int unidades; }tVenta;
Venta
Lista de clientes
LuisHernndezYez
typedef struct { tCliente clientes[NCLI]; int cont; }tListaClientes; typedef struct{ int id_prod; string codigo;
Lista de ventas
Producto
Fundamentosdelaprogramacin:Ejemplodemodularizacin
Pgina 836
tCliente nuevoCliente(); bool valida(tCliente cliente);//Funcininterna bool operator<(tCliente opIzq,tCliente opDer);//PorNIF voidmostrar(tCliente cliente); voidinicializar(tListaClientes &lista); voidcargar(tListaClientes &lista);
Cliente
Lista de clientes
voidinsertar(tListaClientes &lista,tCliente cliente,bool &ok); voidbuscar(const tListaClientes &lista,stringnif,tCliente &cliente, bool &ok); voideliminar(tListaClientes &lista,stringnif,bool &ok); voidmostrar(const tListaClientes &lista); tProducto nuevoProducto(); boolvalida(tProducto producto);//Funcininterna booloperator<(tProducto opIzq,tProducto opDer);//Porcdigo
LuisHernndezYez
Producto
Fundamentosdelaprogramacin:Ejemplodemodularizacin
Pgina 837
Lista de productos
voidinicializar(tListaProductos &lista); voidcargar(tListaProductos &lista); voidinsertar(tListaProductos &lista,tProducto producto,bool &ok); voidbuscar(const tListaProductos &lista,stringcodigo,tProducto &producto, bool &ok); voideliminar(tListaProductos &lista,stringcodigo,bool &ok); void mostrar(const tListaProductos &lista); tVenta nuevaVenta(int id_prod,int id_cli,intunidades); bool valida(tVenta venta);//Funcininterna voidmostrar(tVenta venta,consttListaClientes &clientes, const tListaProductos &productos); ...
LuisHernndezYez
Venta
Fundamentosdelaprogramacin:Ejemplodemodularizacin
Pgina 838
Lista de ventas
voidinicializar(tListaVentas &lista); voidcargar(tListaVentas &lista); void insertar(tListaVentas &lista,tVenta venta,bool &ok); voidbuscar(const tListaVentas &lista,intid,tVenta &venta,bool &ok); void eliminar(tListaVentas &lista,intid,bool &ok); voidventasPorClientes(const tListaVentas &lista); voidventasPorProductos(const tListaVentas &lista); doubletotalVentas(const tListaVentas &ventas,stringnif, consttListaClientes &clientes, consttListaProductos &productos); voidstock(const tListaVentas &ventas,consttListaClientes &clientes, consttListaProductos &productos);
LuisHernndezYez
Fundamentosdelaprogramacin:Ejemplodemodularizacin
Pgina 839
LuisHernndezYez
Cliente: cliente.h y cliente.cpp Lista de clientes: listaclientes.h y listaclientes.cpp Producto: producto.h y producto.cpp Lista de productos: listaproductos.h y listaproductos.cpp Venta: venta.h y venta.cpp Lista de ventas: listaventas.h y listaventas.cpp Programa principal: main.cpp Distribucin del cdigo en los mdulos: Declaraciones de tipos y datos en el archivo de cabecera (.h) Prototipos en el archivo de cabecera (.h) (excepto los de los subprogramas privados internos, que irn en el .cpp) Implementacin de los subprogramas en el .cpp
Fundamentosdelaprogramacin:Ejemplodemodularizacin
Pgina 840
Ventas
main.cpp
Cliente
cliente.h cliente.cpp
Lista de clientes
listaclientes.h listaclientes.cpp
Venta
venta.h venta.cpp
Lista de ventas
listaventas.h listaventas.cpp
Producto
LuisHernndezYez
Lista de productos
listaproductos.h listaproductos.cpp
producto.h producto.cpp
Fundamentosdelaprogramacin:Ejemplodemodularizacin
Pgina 841
cliente.h
string
const int NCLI=100; typedef struct { tCliente clientes[NCLI]; int cont; }tListaClientes;
LuisHernndezYez
listaclientes.h
cliente.h string
Fundamentosdelaprogramacin:Ejemplodemodularizacin
Pgina 842
typedef struct{ int id_prod; string codigo; string nombre; double precio; int unidades; }tProducto;
producto.h
string
const int NPROD=200; typedef struct { tProducto productos[NPROD]; int cont; }tListaProductos; listaproductos.h producto.h string
LuisHernndezYez
Fundamentosdelaprogramacin:Ejemplodemodularizacin
Pgina 843
typedef struct { int id; int id_prod; int id_cli; int unidades; }tVenta;
venta.h
listaclientes.h listaproductos.h
voidmostrar(tVenta venta,consttListaClientes &clientes, const tListaProductos &productos); const int NVENTAS =3000; listaventas.h typedef struct { tVenta ventas[NVENTAS]; int cont; }tListaVentas; venta.h listaclientes.h listaproductos.h
LuisHernndezYez
#ifndef cliente_h #definecliente_h #include<string> usingnamespacestd; typedefstruct { int id_cli; string nif; string nombre; string telefono; }tCliente; tCliente nuevoCliente(); bool operator<(tCliente opIzq,tCliente opDer);//PorNIF void mostrar(tCliente cliente); #endif
LuisHernndezYez
Fundamentosdelaprogramacin:Ejemplodemodularizacin
Pgina 845
LuisHernndezYez
Fundamentosdelaprogramacin
9
Grado en Ingeniera Informtica Grado en Ingeniera del Software Grado en Ingeniera de Computadores Luis Hernndez Yez
LuisHernndezYez
Direccionesdememoriaypunteros Operadoresdepunteros Punterosydireccionesvlidas Punterosnoinicializados Unvalorseguro:NULL Copiaycomparacindepunteros Tipospuntero Punterosaestructuras Punterosaconstantesypunterosconstantes Punterosypasodeparmetros Punterosyarrays Memoriaydatosdelprograma Memoriadinmica Punterosydatosdinmicos Gestindelamemoria Errorescomunes Arraysdedatosdinmicos Arraysdinmicos
849 854 864 866 867 868 873 875 877 879 883 886 891 895 907 911 916 928
Fundamentosdelaprogramacin:Punterosymemoriadinmica
LuisHernndezYez
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 849
int i=5;
Direccin base
LuisHernndezYez
El dato (i) se accede a partir de su direccin base (0F03:1A38) Direccin de la primera celda de memoria utilizada por el dato El tipo del dato (int) indica cuntos bytes (4) requiere el dato: 00000000000000000000000000000101 5
(La codificacin de los datos puede ser diferente; y la de las direcciones tambin)
Fundamentosdelaprogramacin:Punterosymemoriadinmica Pgina 850
00 00 00 05 ...
punt
LuisHernndezYez
0F 03 1A 38 ...
De qu tipo es el dato apuntado? Cuntas celdas ocupa? Cmo se interpretan los 0/1?
Pgina 851
Fundamentosdelaprogramacin:Punterosymemoriadinmica
El puntero nombre apuntar a una variable del tipo indicado El asterisco (*) indica que es un puntero a datos de ese tipo
int*punt;//punt inicialmentecontieneunadireccin //quenoesvlida(noapuntaanada)
LuisHernndezYez
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 852
Un puntero puede apuntar a cualquier dato de su tipo base Un puntero no tiene por qu apuntar necesariamente a un dato (puede no apuntar a nada: valor NULL) Para qu sirven los punteros? Para implementar el paso de parmetros por referencia Para manejar datos dinmicos (Datos que se crean y destruyen durante la ejecucin) Para implementar los arrays
Fundamentosdelaprogramacin:Punterosymemoriadinmica Pgina 853
LuisHernndezYez
LuisHernndezYez
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 854
&
Obtener la direccin de memoria de ...
Operador monario y prefijo & devuelve la direccin de memoria base del dato al que precede
int i; cout<<&i;//Muestraladireccindememoriadei
punt i
Ahora punt ya contiene una direccin de memoria vlida punt apunta a (contiene la direccin de) la variable i (int)
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 855
&
Obtener la direccin de memoria de ...
...
punt
LuisHernndezYez
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 856
&
Obtener la direccin de memoria de ...
...
00 00 00 05
punt
LuisHernndezYez
0F07:0417 0F07:0418
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 857
&
Obtener la direccin de memoria de ...
...
00 00 00 05
punt
LuisHernndezYez
punt i
0F07:0417 0F07:0418
0F 03 1A 38
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 858
*
Obtener lo que hay en la direccin ...
Operador monario y prefijo * accede a lo que hay en la direccin de memoria a la que precede Permite acceder a un dato a travs un puntero que lo apunte:
punt=&i; cout<<*punt;//Muestraloquehayenladireccinpunt *punt: lo que hay en la direccin que contiene el puntero punt punt contiene la direccin de memoria de la variable i *punt accede al contenido de esa variable i
LuisHernndezYez
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 859
*
Obtener lo que hay en la direccin ...
...
00 00 00 05
punt
LuisHernndezYez
0F07:0417 0F07:0418
0F 03 1A 38
punt:
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 860
*
Obtener lo que hay en la direccin ...
...
00 00 00 05
punt
LuisHernndezYez
0F07:0417 0F07:0418
0F 03 1A 38
*punt:
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 861
*
Obtener lo que hay en la direccin ...
...
00 00 00 05 00 00 00 05
punt
LuisHernndezYez
0F 03 1A 38
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 862
punteros.cpp
LuisHernndezYez
LuisHernndezYez
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 864
LuisHernndezYez
Direccin de la zona de datos del programa? Podemos modificar inadvertidamente un dato del programa! Direccin de la zona de cdigo del programa? Podemos modificar el cdigo del propio programa!
LuisHernndezYez
Direccin de la zona de cdigo del sistema operativo? Podemos modificar el cdigo del propio S.O.! Consecuencias imprevisibles (cuelgue) (Los S.O. modernos protegen bien la memoria)
Fundamentosdelaprogramacin:Punterosymemoriadinmica Pgina 866
punt ha sido inicializado a NULL: No apunta a nada! Si no apunta a nada, qu significa *punt??? No tiene sentido ERROR: Acceso a un dato a travs de un puntero nulo!
LuisHernndezYez
Error de ejecucin, lo que ciertamente no es bueno Pero sabemos cul ha sido el problema, lo que es mucho Sabemos dnde y qu buscar para depurar
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 867
LuisHernndezYez
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 868
punt1
punt2
LuisHernndezYez
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 869
punt1
punt2
LuisHernndezYez
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 870
LuisHernndezYez
8 5
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 871
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 872
LuisHernndezYez
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 873
tipos.cpp
Con *puntero podemos hacer lo que con otros datos del tipo base
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 874
LuisHernndezYez
Operador flecha (>): Acceso a los campos a travs de un puntero sin usar el operador *
puntero>codigo puntero>nombrepuntero>sueldo puntero>... (*puntero)....
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 875
structPtr.cpp
LuisHernndezYez
(*puntero).codigo *puntero.codigo
LuisHernndezYez
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 877
constPtr.cpp
LuisHernndezYez
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 878
LuisHernndezYez
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 879
param.cpp
Paso por valor: El argumento (el puntero) no cambia Aquello a lo que apunta (el entero) S puede cambiar
LuisHernndezYez
punt entero 6
LuisHernndezYez
cout<<entero<<endl;
entero
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 881
Prototipo equivalente:
void foo(int *param1,double *param2,char *param3); void foo(int *param1,double *param2,char *param3){ //Alprimerargumentoseaccedecon*param1 //Alsegundoargumentoseaccedecon*param2 //Altercerargumentoseaccedecon*param3 }
LuisHernndezYez
Cmo se llamara?
int entero;double real;char caracter; //... foo(&entero,&real,&caracter);
Fundamentosdelaprogramacin:Punterosymemoriadinmica Pgina 882
LuisHernndezYez
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 883
Entonces:
cout<<*dias <<endl;
Muestra 31 en la consola, el primer elemento del array Un nombre de array es un puntero constante!
LuisHernndezYez
Siempre apunta al primer elemento (no se puede modificar) Acceso a los elementos del array: Por ndice o con aritmtica de punteros (Anexo)
Fundamentosdelaprogramacin:Punterosymemoriadinmica Pgina 884
LuisHernndezYez
Arrays no delimitados y punteros: se necesita la dimensin Elementos: se acceden con ndice (arr[i]) o con puntero (*arr) Una funcin slo puede devolver un array en forma de puntero:
intPtr inicializar();
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 885
LuisHernndezYez
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 886
Regiones de la memoria
El sistema operativo distingue varias regiones en la memoria:
Pila(Stack) Datos locales
Montn(Heap)
Datos dinmicos
LuisHernndezYez
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 887
Memoria principal
Datos globales del programa: Declarados fuera de los subprogramas
typedef struct { ... }tRegistro; const intN=1000; typedef tRegistro tArray[N]; typedef struct { tArray registros; int cont; }tLista; intmain(){ ...
Datos locales
Datos dinmicos
Memoria principal
LuisHernndezYez
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 888
La pila (stack)
Datos locales de subprogramas: Parmetros por valor y variables locales
voidfunc(tLista lista,double &total) { tLista aux; int i; ...
Datos locales
Datos dinmicos
Memoria principal
LuisHernndezYez
Y los punteros temporales que apuntan a los argumentos de los parmetros por referencia
&resultado
func(lista,resultado)
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 889
El montn (heap)
Datos dinmicos Datos que se crean y se destruyen durante la ejecucin del programa, a medida que se necesita
Datos locales
Datos dinmicos
Memoria principal
LuisHernndezYez
Sistema de gestin de memoria dinmica (SGMD) Cuando se necesita memoria para una variable se solicita El SGMD reserva espacio y devuelve la direccin base Cuando ya no se necesita ms la variable, se destruye Se libera la memoria y el SGMD cuenta de nuevo con ella
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 890
LuisHernndezYez
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 891
Datos dinmicos
Se crean y se destruyen durante la ejecucin del programa Se les asigna memoria del montn
Creacin Datodinmico Destruccin Montn
LuisHernndezYez
Por qu utilizar memoria dinmica? Almacn de memoria muy grande: datos o listas de datos que no caben en memoria principal pueden caber en el montn El programa ajusta el uso de la memoria a las necesidades de cada momento: ni le falta ni la desperdicia
Fundamentosdelaprogramacin:Punterosymemoriadinmica Pgina 892
LuisHernndezYez
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 893
Datos estticos
Datos declarados como de un tipo concreto: int i; Se acceden directamente a travs del identificador: cout<<i;
Datos dinmicos
Datos accedidos a travs de su direccin de memoria Esa direccin de memoria debe estar el algn puntero Los punteros son la base del SGMD Los datos estticos tambin se pueden acceder a travs de punteros int *p=&i;
Fundamentosdelaprogramacin:Punterosymemoriadinmica Pgina 894
LuisHernndezYez
LuisHernndezYez
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 895
El operador new
new tipo
Reserva memoria del montn para una variable del tipo y devuelve la primera direccin de memoria utilizada, que debe ser asignada a un puntero
registros.cpp
LuisHernndezYez
El operador delete
delete puntero;
Devuelve al montn la memoria usada por la variable dinmica apuntada por puntero
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 898
dinamicas.cpp #include<iostream> usingnamespacestd; int main(){ double a=1.5; p1 double *p1,*p2,*p3; p1=&a; p2=new double; a *p2=*p1; p3=new double; *p3=123.45; cout<<*p1<<endl; p2 cout<<*p2<<endl; cout<<*p3<<endl; delete p2; delete p3; p3 return 0; }
Fundamentosdelaprogramacin:Punterosymemoriadinmica Pgina 899
Identificadores:
4
1.5 (a, p1, p2, p3) Variables:
1.5
6
123.45
Montn (heap)
LuisHernndezYez
(+ *p2 y *p3)
#include<iostream> usingnamespacestd;
a
PILA 1.5 ? ? ? p1 p2 p3
LuisHernndezYez
MONTN
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 900
#include<iostream> usingnamespacestd;
a
PILA 1.5 ? ? p1 p2 p3
LuisHernndezYez
MONTN
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 901
#include<iostream> usingnamespacestd;
a
PILA 1.5 p1 p2 p3 ?
LuisHernndezYez
MONTN
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 902
#include<iostream> usingnamespacestd;
a
PILA 1.5 p1 p2 p3 ?
int main(){ double a=1.5; double *p1,*p2,*p3; p1=&a; p2=new double; *p2=*p1;
LuisHernndezYez
1.5 MONTN
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 903
#include<iostream> usingnamespacestd;
a
PILA 1.5 p1 p2 p3
int main(){ double a=1.5; double *p1,*p2,*p3; p1=&a; p2=new double; *p2=*p1; p3=new double;
LuisHernndezYez
1.5 MONTN
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 904
#include<iostream> usingnamespacestd;
a
PILA 1.5 p1 p2 p3
int main(){ double a=1.5; double *p1,*p2,*p3; p1=&a; p2=new double; *p2=*p1; p3=new double; *p3=123.45;
LuisHernndezYez
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 905
#include<iostream> usingnamespacestd;
a
PILA 1.5 ? p1 p2 p3
LuisHernndezYez
int main(){ double a=1.5; double *p1,*p2,*p3; p1=&a; p2=new double; *p2=*p1; p3=new double; *p3=123.45; cout<<*p1<<endl; cout<<*p2<<endl; cout<<*p3<<endl; delete p2;
123.45 MONTN
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 906
#include<iostream> usingnamespacestd;
a
PILA 1.5 ? ? p1 p2 p3
LuisHernndezYez
int main(){ double a=1.5; double *p1,*p2,*p3; p1=&a; p2=new double; *p2=*p1; p3=new double; *p3=123.45; cout<<*p1<<endl; cout<<*p2<<endl; cout<<*p3<<endl; delete p2; delete p3;
MONTN
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 907
LuisHernndezYez
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 908
La memoria se reparte entre la pila y el montn Crecen en direcciones opuestas Al llamar a subprogramas la pila crece Al crear datos dinmicos el montn crece Colisin pilamontn Los lmites de ambas regiones se encuentran Se agota la memoria Desbordamiento de la pila La pila suele tener un tamao mximo establecido Si se sobrepasa se agota la pila
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pila
Montn
LuisHernndezYez
Pgina 909
Y todo dato dinmico debe tener algn acceso (puntero) Es un grave error perder un dato en el montn
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 910
LuisHernndezYez
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 911
LuisHernndezYez
G++ no indicar ningn error y el programa parecer terminar correctamente, pero dejar memoria desperdiciada Visual C++ s comprueba el uso de la memoria dinmica y nos avisa si dejamos memoria sin liberar
Fundamentosdelaprogramacin:Punterosymemoriadinmica Pgina 912
p1 p2
tRegistro
return 0; }
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 913
p2
tRegistro
p1
tRegistro Perdido!
LuisHernndezYez
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 915
LuisHernndezYez
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 916
LuisHernndezYez
const int N=1000; //Arraydepunterosaregistros: typedef tRegPtr tArray[N]; typedef struct { tArray registros; int cont; Se crean a medida que se insertan }tLista; Se destruyen a medida que se eliminan
Fundamentosdelaprogramacin:Punterosymemoriadinmica Pgina 917
lista.cont lista.registros
LuisHernndezYez
0
0 1 2 3 4 5 6 998 999
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 918
lista.cont lista.registros
LuisHernndezYez
1
0 1 2 3 4 5 6 998 999
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 919
tLista lista; lista.cont =0; lista.registros[lista.cont]=new tRegistro(nuevo()); lista.cont++; lista.registros[lista.cont]=new tRegistro(nuevo()); lista.cont++;
lista.cont lista.registros
LuisHernndezYez
2
0 1 2 3 4 5 6 998 999
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 920
tLista lista; lista.cont =0; lista.registros[lista.cont]=new tRegistro(nuevo()); lista.cont++; lista.registros[lista.cont]=new tRegistro(nuevo()); lista.cont++; lista.registros[lista.cont]=new tRegistro(nuevo()); lista.cont++;
lista.cont lista.registros
LuisHernndezYez
3
0 1 2 3 4 5 6 998 999
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 921
lista.cont lista.registros
LuisHernndezYez
3
0 1 2 3 4 5 6 998 999
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 922
lista.cont lista.registros
LuisHernndezYez
3
0 1 2 3 4 5 6 998 999
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 923
lista.h #ifndef lista_h #definelista_h #include"registro.h" const int N=1000; const string BD="bd.dat"; typedef tRegPtr tArray[N]; typedef struct { tArray registros; int cont; }tLista;
LuisHernndezYez
void mostrar(const tLista&lista); voidinsertar(tLista&lista,tRegistro registro,bool &ok); voideliminar(tLista&lista,intcode,bool &ok); intbuscar(const tLista &lista,int code); void cargar(tLista&lista,bool &ok); void guardar(const tLista &lista); void destruir(tLista &lista); #endif
Fundamentosdelaprogramacin:Punterosymemoriadinmica Pgina 924
lista.cpp
void insertar(tLista&lista,tRegistro registro,bool &ok){ ok=true; if (lista.cont ==N){ ok=false; } else { lista.registros[lista.cont]=new tRegistro(registro); lista.cont++; } } void eliminar(tLista&lista,int code,bool &ok){ ok=true; int ind =buscar(lista,code); if (ind ==1){ ok=false; } else { delete lista.registros[ind]; for (int i=ind +1;i<lista.cont;i++){ lista.registros[i 1]=lista.registros[i]; } lista.cont; } }
Fundamentosdelaprogramacin:Punterosymemoriadinmica Pgina 925
LuisHernndezYez
int buscar(const tLista &lista,intcode){ //Devuelveelndiceo1sinosehaencontrado int ind =0; bool encontrado=false; while ((ind <lista.cont)&&!encontrado){ if (lista.registros[ind]>codigo ==code){ encontrado=true; } else { ind++; } if (!encontrado){ ind =1; } return ind; } void destruir(tLista &lista){ for (inti=0;i<lista.cont;i++){ delete lista.registros[i]; } lista.cont =0; } ...
Fundamentosdelaprogramacin:Punterosymemoriadinmica Pgina 926
LuisHernndezYez
listadinamica.cpp #include<iostream> usingnamespacestd; #include"registro.h" #include"lista.h" int main(){ tLista lista; bool ok; cargar(lista,ok); if(ok){ mostrar(lista); destruir(lista); }
LuisHernndezYez
return 0; }
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 927
LuisHernndezYez
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 928
Crea un array de 10 int en memoria dinmica Los elementos se acceden a travs del puntero: p[i] Destruccin del array:
delete []p;
LuisHernndezYez
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 929
#include<iostream> usingnamespacestd; const int N=10; int main(){ int*p=new int[N]; for (int i=0;i<N;i++){ p[i]=i; } for (int i=0;i<N;i++){ cout<<p[i]<<endl; } delete []p;
LuisHernndezYez
return 0; }
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 930
listaAD.h
... #include"registro.h" const int N=1000; //Lista:arraydinmico(puntero)ycontador typedef struct { tRegPtr registros; int cont; }tLista; ...
LuisHernndezYez
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 931
listaAD.cpp
void insertar(tLista&lista,tRegistro registro, bool &ok){ ok=true; if (lista.cont ==N){ ok=false; No usamos new } else { Se han creado todo lista.registros[lista.cont]=registro; el array al cargar lista.cont++; } } void eliminar(tLista&lista,int code, bool &ok){ ok=true; int ind =buscar(lista,code); No usamos delete if (ind ==1){ Se destruye todo ok=false; } el array al final else { for (int i=ind +1;i<lista.cont;i++){ lista.registros[i 1]=lista.registros[i]; } lista.cont; } }...
Fundamentosdelaprogramacin:Punterosymemoriadinmica Pgina 932
LuisHernndezYez
int buscar(tLista lista,int code){ int ind =0; bool encontrado=false; while ((ind <lista.cont)&&!encontrado){ if (lista.registros[ind].codigo ==code){ encontrado=true; } else { ind++; } } if (!encontrado){ ind =1; } return ind; } void destruir(tLista &lista){ delete []lista.registros; lista.cont =0; } ...
LuisHernndezYez
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 933
LuisHernndezYez
void cargar(tLista&lista,bool &ok){ ifstream archivo; char aux; ok=true; archivo.open(BD.c_str()); if (!archivo.is_open()){ ok=false; } else { Se crean todos a la vez tRegistro registro; lista.cont =0; lista.registros =new tRegistro[N]; archivo>>registro.codigo; while((registro.codigo !=1)&&(lista.cont <N)){ archivo>>registro.valor; archivo.get(aux);//Saltamoselespacio getline(archivo,registro.nombre); lista.registros[lista.cont]=registro; lista.cont++; archivo>>registro.codigo; } archivo.close(); } }
Fundamentosdelaprogramacin:Punterosymemoriadinmica Pgina 934
ejemploAD.cpp
Mismo programa principal que el del array de datos dinmicos Pero incluyendo listaAD.h, en lugar de lista.h
LuisHernndezYez
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 935
Array de datos dinmicos: Array de punteros a datos dinmicos Array dinmico: Puntero a array en memoria dinmica
Array de datos dinmicos: Array de punteros
0 1 2 3 4 5 6 7
LuisHernndezYez
Montn
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 936
LuisHernndezYez
Fundamentosdelaprogramacin
9A
Grado en Ingeniera Informtica Grado en Ingeniera del Software Grado en Ingeniera de Computadores Luis Hernndez Yez
LuisHernndezYez
Fundamentosdelaprogramacin:Punterosymemoriadinmica(Anexo)
LuisHernndezYez
Fundamentosdelaprogramacin:Punterosymemoriadinmica(Anexo)
Pgina 940
A la direccin de memoria actual se le suman tantas unidades como bytes (4) ocupe en memoria un dato de ese tipo (int)
Fundamentosdelaprogramacin:Punterosymemoriadinmica(Anexo) Pgina 941
31 28 31
0F 03 1A 38 0F 03 1A 38
dias[2]
dias
LuisHernndezYez
punt
Fundamentosdelaprogramacin:Punterosymemoriadinmica(Anexo)
Pgina 942
31 28 31
0F 03 1A 38 0F 03 1A 3C
dias[2]
dias
LuisHernndezYez
punt
Pgina 943
31 28 31
0F 03 1A 38 0F 03 1A 40
dias[2]
dias
LuisHernndezYez
punt
Pgina 944
int dias[12]={31,28,31,30,31,30, 31,31,30,31,30,31}; typedef int*tIntPtr; tIntPtr punt=dias; punt=punt+2; int num=punt dias;
dias[1] dias[0]
31 28 31
0F 03 1A 38 0F 03 1A 3C
dias[2]
LuisHernndezYez
punt
Fundamentosdelaprogramacin:Punterosymemoriadinmica(Anexo)
Pgina 945
... 0F03:1A38 0F03:1A39 0F03:1A3A 0F03:1A3B 0F03:1A3C 0F03:1A3D 0F03:1A3E 0F03:1A3F 0F03:1A40 0F03:1A41 ... dias 0F07:0417 0F07:0418 0F07:0419 0F07:041A punt 0F07:041B 0F07:041C 0F07:041D 0F07:041E ... 0F 03 1A 38 0F 03 1A 38
31 28 31 30 31
LuisHernndezYez
Fundamentosdelaprogramacin:Punterosymemoriadinmica(Anexo)
Pgina 946
31 28 31 30 31
LuisHernndezYez
Fundamentosdelaprogramacin:Punterosymemoriadinmica(Anexo)
Pgina 947
31 28 31 30 31
LuisHernndezYez
Fundamentosdelaprogramacin:Punterosymemoriadinmica(Anexo)
Pgina 948
shortint dias[12]={31,28,31,30, 31,30,31,31,30,31,30,31}; typedef shortint*tSIPtr; tSIPtr punt=dias; punt++; punt=punt+3; punt;
dias[1] dias[2] dias[3] dias[4] ... dias[0] 0F03:1A38 0F03:1A39 0F03:1A3A 0F03:1A3B 0F03:1A3C 0F03:1A3D 0F03:1A3E 0F03:1A3F 0F03:1A40 0F03:1A41 ... dias 0F07:0417 0F07:0418 0F07:0419 0F07:041A punt 0F07:041B 0F07:041C 0F07:041D 0F07:041E ... 0F 03 1A 38 0F 03 1A 3E
31 28 31 30 31
LuisHernndezYez
Fundamentosdelaprogramacin:Punterosymemoriadinmica(Anexo)
Pgina 949
shortint dias[12]={31,28,31,30, 31,30,31,31,30,31,30,31}; typedef shortint*tSIPtr; tSIPtr punt=dias; punt++; punt=punt+3; punt; tSIPtr punt2;
dias dias[1] dias[2] dias[3] dias[4] ... dias[0] 0F03:1A38 0F03:1A39 0F03:1A3A 0F03:1A3B 0F03:1A3C 0F03:1A3D 0F03:1A3E 0F03:1A3F 0F03:1A40 0F03:1A41 ... 0F07:0417 0F07:0418 0F07:0419 0F07:041A punt 0F07:041B 0F07:041C 0F07:041D 0F07:041E punt2 0F07:041F 0F 03 1A 38 0F 03 1A 3E ?
31 28 31 30 31
LuisHernndezYez
Fundamentosdelaprogramacin:Punterosymemoriadinmica(Anexo)
Pgina 950
shortint dias[12]={31,28,31,30, 31,30,31,31,30,31,30,31}; typedef shortint*tSIPtr; siPtr punt=dias; punt++; punt=punt+3; punt; tSIPtr punt2; punt2=dias;
dias dias[1] dias[2] dias[3] dias[4] ... dias[0] 0F03:1A38 0F03:1A39 0F03:1A3A 0F03:1A3B 0F03:1A3C 0F03:1A3D 0F03:1A3E 0F03:1A3F 0F03:1A40 0F03:1A41 ... 0F07:0417 0F07:0418 0F07:0419 0F07:041A punt 0F07:041B 0F07:041C 0F07:041D 0F07:041E punt2 0F07:041F 0F 03 1A 38 0F 03 1A 3E 0F
31 28 31 30 31
LuisHernndezYez
Fundamentosdelaprogramacin:Punterosymemoriadinmica(Anexo)
Pgina 951
shortint dias[12]={31,28,31,30, 31,30,31,31,30,31,30,31}; typedef shortint*tSIPtr; siPtr punt=dias; punt++; punt=punt+3; punt; tSIPtr punt2; punt2=dias; cout<<punt punt2;//3
punt dias dias[1] ... dias[0] 0F03:1A38 0F03:1A39 0F03:1A3A 0F03:1A3B dias[2] dias[3] dias[4] 0F03:1A3C 0F03:1A3D 0F03:1A3E 0F03:1A3F 0F03:1A40 0F03:1A41 ... 0F07:0417 0F07:0418 0F07:0419 0F07:041A 0F07:041B 0F07:041C 0F07:041D 0F07:041E punt2 0F07:041F 0F 03 1A 38 0F 03 1A 3E 0F
31 28 31 30 31
LuisHernndezYez
Fundamentosdelaprogramacin:Punterosymemoriadinmica(Anexo)
Pgina 952
LuisHernndezYez
Fundamentosdelaprogramacin:Punterosymemoriadinmica(Anexo)
Pgina 953
arraypunt.cpp
LuisHernndezYez
Fundamentosdelaprogramacin:Punterosymemoriadinmica(Anexo)
Pgina 954
punt
...
98
99
lista.elementos lista.cont
LuisHernndezYez
4 8
13
47
53
19
48
Fundamentosdelaprogramacin:Punterosymemoriadinmica(Anexo)
Pgina 955
punt
...
98
99
lista.elementos lista.cont
LuisHernndezYez
4 8
13
47
53
19
48
Fundamentosdelaprogramacin:Punterosymemoriadinmica(Anexo)
Pgina 956
punt
...
98
99
lista.elementos lista.cont
LuisHernndezYez
4 8
13
47
53
19
48
Fundamentosdelaprogramacin:Punterosymemoriadinmica(Anexo)
Pgina 957
4 13
punt
...
98
99
lista.elementos lista.cont
LuisHernndezYez
4 8
13
47
53
19
48
Fundamentosdelaprogramacin:Punterosymemoriadinmica(Anexo)
Pgina 958
4 13 3
punt
...
98
99
lista.elementos lista.cont
LuisHernndezYez
4 8
13
47
53
19
48
. . .
Fundamentosdelaprogramacin:Punterosymemoriadinmica(Anexo) Pgina 959
4 13 3 47 53 19 7
punt
...
98
99
lista.elementos lista.cont
LuisHernndezYez
4 8
13
47
53
19
48
Fundamentosdelaprogramacin:Punterosymemoriadinmica(Anexo)
Pgina 960
punt
4 13 3 47 53 19 7 48
...
98
99
lista.elementos lista.cont
LuisHernndezYez
4 8
13
47
53
19
48
Fundamentosdelaprogramacin:Punterosymemoriadinmica(Anexo)
Pgina 961
LuisHernndezYez
Fundamentosdelaprogramacin:Punterosymemoriadinmica(Anexo)
Pgina 962
Fundamentosdelaprogramacin:Punterosymemoriadinmica(Anexo)
Pgina 963
LuisHernndezYez
Fundamentosdelaprogramacin:Punterosymemoriadinmica(Anexo)
Pgina 964
tLista
Una lista (tLista) es un puntero a un nodo Si el puntero vale NULL, no apunta a ningn nodo: lista vaca Un nodo (tNodo) es un elemento seguido de una lista
LuisHernndezYez
Lista
Definicin recursiva!
Fundamentosdelaprogramacin:Punterosymemoriadinmica(Anexo)
Pgina 965
LuisHernndezYez
lista
Fundamentosdelaprogramacin:Punterosymemoriadinmica(Anexo)
Pgina 966
structtNodo; typedef tNodo *tLista; structtNodo { tRegistro reg; tLista sig; }; tLista lista=NULL;//Listavaca lista=new tNodo; lista>reg =nuevo(); lista>sig=NULL;
LuisHernndezYez
lista
tem1
Fundamentosdelaprogramacin:Punterosymemoriadinmica(Anexo)
Pgina 967
p
LuisHernndezYez
lista
tem1
Fundamentosdelaprogramacin:Punterosymemoriadinmica(Anexo)
Pgina 968
tLista lista=NULL;//Listavaca lista=new tNodo; lista>reg =nuevo(); lista>sig=NULL; tLista p; p=lista; p>sig=new tNodo; p>sig>reg =nuevo(); p>sig>sig =NULL;
p
LuisHernndezYez
lista
tem1
tem2
Fundamentosdelaprogramacin:Punterosymemoriadinmica(Anexo)
Pgina 969
LuisHernndezYez
tLista lista=NULL;//Listavaca lista=new tNodo; lista>reg =nuevo(); lista>sig=NULL; tLista p; p=lista; p>sig=new tNodo; p>sig>reg =nuevo(); p>sig>sig =NULL; p=p>sig; p>sig=new tNodo; p>sig>reg =nuevo(); p>sig>sig =NULL; p ...
lista
tRegistro tRegistro tRegistro
Fundamentosdelaprogramacin:Punterosymemoriadinmica(Anexo)
Pgina 970
Tantos elementos, tantos nodos hay en la lista Pero perdemos el acceso directo! Algunas operaciones de la lista se complican y otras no A continuacin tienes el mdulo de lista implementado como lista enlazada...
LuisHernndezYez
Fundamentosdelaprogramacin:Punterosymemoriadinmica(Anexo)
Pgina 971
listaenlazada.h structtNodo; typedef tNodo *tLista; struct tNodo { tRegistro reg; tLista sig; }; const string BD="bd.txt"; void mostrar(tLista lista); void insertar(tLista&lista,tRegistro registro, bool &ok); void eliminar(tLista&lista,int code, bool &ok); tLista buscar(tLista lista,int code);//Devuelvepuntero void cargar(tLista&lista, bool &ok); void guardar(tLista lista); void destruir(tLista &lista);//Liberarlamemoriadinmica
LuisHernndezYez
Fundamentosdelaprogramacin:Punterosymemoriadinmica(Anexo)
Pgina 972
listaenlazada.cpp
void insertar(tLista&lista,tRegistro registro, bool &ok){ ok=true; tLista nuevo=new tNodo; if (nuevo==NULL){ ok=false;//Nohaymsmemoriadinmica } else { nuevo>reg =registro; nuevo>sig=NULL; if (lista==NULL){//Listavaca lista lista=nuevo; } nuevo else { tLista p=lista; //Localizamoselltimonodo... while (p>sig!=NULL){ nuevo p=p>sig; } p p>sig=nuevo; } lista } }...
Fundamentosdelaprogramacin:Punterosymemoriadinmica(Anexo) Pgina 973
LuisHernndezYez
LuisHernndezYez
void eliminar(tLista&lista,int code,bool &ok){ ok=true; tLista p=lista; if (p==NULL){ ok=false;//Listavaca } else if (p>reg.codigo ==code){//Elprimero lista=p>sig; delete p; p } else { lista tLista ant=p; p=p>sig; bool encontrado=false; while ((p!=NULL)&&!encontrado){ if (p>reg.codigo ==code){ ant encontrado=true; } else { lista ant=p; p=p>sig; } }...
Fundamentosdelaprogramacin:Punterosymemoriadinmica(Anexo)
Pgina 974
lista
LuisHernndezYez
Fundamentosdelaprogramacin:Punterosymemoriadinmica(Anexo)
Pgina 975
tLista buscar(tLista lista,int code){ //Devuelveunpunteroalnodo,oNULLsinoseencuentra tLista p=lista; bool encontrado=false; while ((p!=NULL)&&!encontrado){ if (p>reg.codigo ==code){ encontrado=true; } else { p=p>sig; } } return p; } void mostrar(tLista lista){ cout<<endl<<"Elementosdelalista:"<<endl <<"" <<endl; tLista p=lista; while (p!=NULL){ mostrar(p>reg); p=p>sig; } }...
Fundamentosdelaprogramacin:Punterosymemoriadinmica(Anexo) Pgina 976
LuisHernndezYez
LuisHernndezYez
void cargar(tLista&lista,bool &ok){ ifstream archivo; char aux; ok=true; lista=NULL; archivo.open(BD.c_str()); if (!archivo.is_open()){ ok=false; } else { tRegistro registro; tListault =NULL; archivo>>registro.codigo; while (registro.codigo !=1){ archivo>>registro.valor; archivo.get(aux);//Saltamoselespacio getline(archivo,registro.nombre); ...
Fundamentosdelaprogramacin:Punterosymemoriadinmica(Anexo)
Pgina 977
if (lista==NULL){ lista=new tNodo; ult =lista; } else { ult>sig=new tNodo; ult =ult>sig; } ult>reg =registro; ult>sig=NULL; archivo>>registro.codigo; } archivo.close(); } return ok; }...
LuisHernndezYez
Fundamentosdelaprogramacin:Punterosymemoriadinmica(Anexo)
Pgina 978
void guardar(tLista lista){ ofstream archivo; archivo.open(BD); tLista p=lista; while (p!=NULL){ archivo<<p>registro.codigo <<""; archivo<<p>registro.valor <<""; archivo<<p>registro.nombre <<endl; p=p>sig; } archivo.close(); } void destruir(tLista &lista){ tLista p; while (lista!=NULL){ p=lista; lista=lista>sig; delete p; } }
Fundamentosdelaprogramacin:Punterosymemoriadinmica(Anexo) Pgina 979
LuisHernndezYez
LuisHernndezYez
Fundamentosdelaprogramacin
10
Grado en Ingeniera Informtica Grado en Ingeniera del Software Grado en Ingeniera de Computadores Luis Hernndez Yez
LuisHernndezYez
Conceptoderecursin Algoritmosrecursivos Funcionesrecursivas Diseodefuncionesrecursivas Modelodeejecucin Lapiladelsistema Lapilaylasllamadasafuncin Ejecucindelafuncinfactorial() Tiposderecursin Recursinsimple Recursinmltiple Recursinanidada Recursincruzada Cdigodelsubprogramarecursivo Parmetrosyrecursin Ejemplosdealgoritmosrecursivos Bsquedabinaria TorresdeHanoi Recursinfrenteaiteracin Estructurasdedatosrecursivas
Fundamentosdelaprogramacin:Introduccinalarecursin
983 986 987 989 990 992 994 1005 1018 1019 1020 1022 1026 1027 1032 1034 1035 1038 1043 1045
LuisHernndezYez
Fundamentosdelaprogramacin:Introduccinalarecursin
Pgina 983
LuisHernndezYez
La imagen del paquete aparece dentro del propio paquete,... hasta el infinito!
(wikipedia.org) Fundamentosdelaprogramacin:Introduccinalarecursin
(wikipedia.org)
Factorial(N) = N x Factorial(N1) El factorial se define en funcin de s mismo Los programas no pueden manejar la recursin infinita La definicin recursiva debe adjuntar uno o ms casos base Caso base: aquel en el que no se utiliza la definicin recursiva Proporcionan puntos finales de clculo:
Factorial(N) N x Factorial(N1) si N > 0 1
LuisHernndezYez
si N = 0
Fundamentosdelaprogramacin:Introduccinalarecursin
Pgina 985
LuisHernndezYez
Fundamentosdelaprogramacin:Introduccinalarecursin
Pgina 986
Funciones recursivas
Una funcin puede implementar un algoritmo recursivo La funcin se llamar a s misma si no se ha llegado al caso base
Factorial(N) 1 N x Factorial(N1) si N = 0 si N > 0
LuisHernndezYez
longlong int factorial(int n){ longlong intresultado; if (n==0){//Caso base resultado =1; } else { resultado =n*factorial(n 1); } return resultado; }
Fundamentosdelaprogramacin:Introduccinalarecursin Pgina 987
factorial.cpp
Funciones recursivas
longlong int factorial(int n){ longlong intresultado; if (n==0){//Caso base resultado =1; } else { resultado =n*factorial(n 1); } return resultado; }
Fundamentosdelaprogramacin:Introduccinalarecursin
Pgina 988
1 N x Factorial(N1)
si N = 0 si N > 0
Funcin factorial(): tiene caso base (N = 0), siendo correcta para N es correcta para N+1 (induccin) y se acerca cada vez ms al caso base (N1 est ms cerca de 0 que N)
Fundamentosdelaprogramacin:Introduccinalarecursin Pgina 989
LuisHernndezYez
Fundamentosdelaprogramacin:Introduccinalarecursin
Pgina 990
longlong int factorial(int n){ longlong intresultado; if (n==0){//Caso base resultado =1; } else { resultado =n*factorial(n 1); } return resultado; }
LuisHernndezYez
Cada llamada recursiva fuerza una nueva ejecucin de la funcin Cada llamada utiliza sus propios parmetros por valor y variables locales (n y resultado en este caso) En las llamadas a la funcin se utiliza la pila del sistema para mantener los datos locales y la direccin de vuelta
Fundamentosdelaprogramacin:Introduccinalarecursin
Pgina 991
Montn(Heap)
Memoria principal
S.O.
Fundamentosdelaprogramacin:Introduccinalarecursin
Pgina 992
Mantiene los datos locales de la funcin y la direccin de vuelta Estructura de tipo pila: lista LIFO (lastin firstout) El ltimo que entra es el primero que sale:
Entra 4
Entra 7
Entra 2
Sale 2
2
LuisHernndezYez
7 4 4
7 4
7 4
Fundamentosdelaprogramacin:Introduccinalarecursin
Pgina 993
Pila
Fundamentosdelaprogramacin:Introduccinalarecursin
Pgina 994
<DIR1> Pila
Fundamentosdelaprogramacin:Introduccinalarecursin
Pgina 995
Fundamentosdelaprogramacin:Introduccinalarecursin
Pgina 996
Fundamentosdelaprogramacin:Introduccinalarecursin
Pgina 997
Fundamentosdelaprogramacin:Introduccinalarecursin
Pgina 998
Fundamentosdelaprogramacin:Introduccinalarecursin
Pgina 999
Fundamentosdelaprogramacin:Introduccinalarecursin
Pgina 1000
b a <DIR1> Pila
Fundamentosdelaprogramacin:Introduccinalarecursin
Pgina 1001
Fundamentosdelaprogramacin:Introduccinalarecursin
Pgina 1002
Pila
Fundamentosdelaprogramacin:Introduccinalarecursin
Pgina 1003
Mecanismo de pila adecuado para llamadas a funciones anidadas: Las llamadas terminan en el orden contrario a como se llaman
... int funcC(...){ ... }
LLAMADAS
V U E LTAS
LuisHernndezYez
Fundamentosdelaprogramacin:Introduccinalarecursin
Pgina 1004
longlong int factorial(int n){ longlong intresultado; if (n==0){//Caso base resultado =1; } else { resultado =n*factorial(n 1); } return resultado; }
cout<<factorial(5)<<endl;
LuisHernndezYez
Fundamentosdelaprogramacin:Introduccinalarecursin
Pgina 1005
factorial(5)
LuisHernndezYez
resultado=? n=5
Pila
Fundamentosdelaprogramacin:Introduccinalarecursin
Pgina 1006
factorial(5) factorial(4)
resultado =? n=4
LuisHernndezYez
resultado=? n=5
Pila
Fundamentosdelaprogramacin:Introduccinalarecursin
Pgina 1007
resultado=? n=5
Pila
Fundamentosdelaprogramacin:Introduccinalarecursin
Pgina 1008
resultado=? n=5
Pila
Fundamentosdelaprogramacin:Introduccinalarecursin
Pgina 1009
resultado=? n=5
Pila
Fundamentosdelaprogramacin:Introduccinalarecursin
Pgina 1010
resultado=? n=5
Pila
Fundamentosdelaprogramacin:Introduccinalarecursin
Pgina 1011
resultado=? n=5
Pila
Fundamentosdelaprogramacin:Introduccinalarecursin
Pgina 1012
resultado=? n=5
Pila
Fundamentosdelaprogramacin:Introduccinalarecursin
Pgina 1013
resultado=? n=5
Pila
Fundamentosdelaprogramacin:Introduccinalarecursin
Pgina 1014
Pila
Fundamentosdelaprogramacin:Introduccinalarecursin
Pgina 1015
24
resultado=120 n=5
Pila
Fundamentosdelaprogramacin:Introduccinalarecursin
Pgina 1016
24 120
Pila
Fundamentosdelaprogramacin:Introduccinalarecursin
Pgina 1017
LuisHernndezYez
Fundamentosdelaprogramacin:Introduccinalarecursin
Pgina 1018
Slo hay una llamada recursiva Ejemplo: Clculo del factorial de un nmero entero positivo
longlong int factorial(int n){ longlong intresultado; if (n==0){//Caso base resultado =1; } else { resultado =n*factorial(n 1); } return resultado; }
LuisHernndezYez
Fundamentosdelaprogramacin:Introduccinalarecursin
Pgina 1019
Fundamentosdelaprogramacin:Introduccinalarecursin
Pgina 1020
fibonacci.cpp
... int main(){ for(int i=0;i<20;i++){ cout<<fibonacci(i)<<endl; } return 0; }
0 Fib(n) 1 Fib(n1) + Fib(n2) si n = 0 si n = 1 si n > 1
LuisHernndezYez
int fibonacci(int n){ int resultado; if (n==0){ resultado=0; } elseif (n==1){ resultado=1; } else { resultado=fibonacci(n 1)+fibonacci(n 2); } returnresultado; }
Fundamentosdelaprogramacin:Introduccinalarecursin Pgina 1021
En una llamada recursiva alguno de los argumentos es otra llamada Ejemplo: Clculo de los nmeros de Ackermann:
LuisHernndezYez
Fundamentosdelaprogramacin:Introduccinalarecursin
Pgina 1022
ackermann.cpp
Nmeros de Ackermann
n + 1 Ack(m, n) Ack(m1, 1)
si m = 0 si m > 0 y n = 0
LuisHernndezYez
Ack(m1, Ack(m, n1)) si m > 0 y n > 0 ... int ackermann(int m,int n){ intresultado; if (m==0){ resultado =n+1; } elseif(n==0){ resultado =ackermann(m 1,1); } else{ resultado =ackermann(m 1,ackermann(m,n 1)); } return resultado; } Prubalo con nmeros muy bajos:
Nmeros de Ackermann
ackermann(1,1)
ackermann(0,ackermann(1,0))
2 3
ackermann(0,1) ackermann(0,2)
LuisHernndezYez
Fundamentosdelaprogramacin:Introduccinalarecursin
Pgina 1024
Nmeros de Ackermann
ackermann(2,1)
ackermann(1, ackermann(2,0))
3 5
ackermann(1,1)
ackermann(0,ackermann(1,0)) ackermann(0,1) ackermann(0,2)
3
ackermann(1,3)
ackermann(0,ackermann(1,2))
LuisHernndezYez
ackermann(0, ackermann(1,1))
ackermann(0,ackermann(1,0)) ackermann(0,1) ackermann(0,2)
3
ackermann(0,3) ackermann(0,4)
Fundamentosdelaprogramacin:Introduccinalarecursin
Pgina 1025
LuisHernndezYez
Fundamentosdelaprogramacin:Introduccinalarecursin
Pgina 1026
El cdigo anterior se ejecuta en orden directo para las distintas entradas, mientras que el cdigo posterior lo hace en orden inverso Si no hay cdigo anterior: recursin por delante Si no hay cdigo posterior: recursin por detrs
Fundamentosdelaprogramacin:Introduccinalarecursin Pgina 1027
func(5); El cdigo anterior se ejecuta para los sucesivos valores de n (5, 4, 3, ...) El cdigo posterior al revs (1, 2, 3, ...)
LuisHernndezYez
Fundamentosdelaprogramacin:Introduccinalarecursin
Pgina 1028
directo.cpp
LuisHernndezYez
inverso.cpp
LuisHernndezYez
LuisHernndezYez
Fundamentosdelaprogramacin:Introduccinalarecursin
Pgina 1031
LuisHernndezYez
Cuando n es 0, el argumento de fact toma el valor 1 Al volver se le va multiplicando por los dems n (distintos)
Fundamentosdelaprogramacin:Introduccinalarecursin Pgina 1032
LuisHernndezYez
Fundamentosdelaprogramacin:Introduccinalarecursin
Pgina 1033
Parte el problema en subproblemas ms pequeos Aplica el mismo proceso a cada subproblema Naturaleza recursiva (casos base: encontrado o no queda lista) Partimos de la lista completa Si no queda lista... terminar (lista vaca: no encontrado) En caso contrario... Comprobar si el elemento en la mitad es el buscado Si es el buscado... terminar (encontrado) Si no... Si el buscado es menor que el elemento mitad... Repetir con la primera mitad de la lista Si el buscado es mayor que el elemento mitad... Repetir con la segunda mitad de la lista La repeticin se consigue con las llamadas recursivas
Fundamentosdelaprogramacin:Introduccinalarecursin Pgina 1034
LuisHernndezYez
Cules son los casos base? Que ya no quede sublista (ini>fin) No encontrado Que se encuentre el elemento
LuisHernndezYez
Repasa en el Tema 7 cmo funciona y cmo se implement iterativamente la bsqueda binaria (comprala con esta)
Fundamentosdelaprogramacin:Introduccinalarecursin
Pgina 1035
binaria.cpp int buscar(tLista lista,int buscado,int ini,int fin){ int pos=1; if (ini<=fin){ int mitad=(ini+fin)/2; if (buscado==lista.elementos[mitad]){ pos=mitad; } elseif(buscado<lista.elementos[mitad]){ pos=buscar(lista,buscado,ini,mitad 1); } else{ pos=buscar(lista,buscado,mitad+1,fin); } } return pos; }
LuisHernndezYez
Cuenta una leyenda que en un templo de Hanoi se dispusieron tres pilares de diamante y en uno de ellos 64 discos de oro, de distintos tamaos y colocados por orden de tamao con el mayor debajo
LuisHernndezYez
Cada monje, en su turno, deba mover un nico disco de un pilar a otro, para con el tiempo conseguir entre todos llevar la torre del pilar inicial a uno de los otros dos; respetando una nica regla: nunca poner un disco sobre otro de menor tamao Cuando lo hayan conseguido, se acabar el mundo!
[Se requieren al menos 2641 movimientos; si se hiciera uno por segundo, se terminara en ms de 500 mil millones de aos]
Fundamentosdelaprogramacin:Introduccinalarecursin Pgina 1037
Queremos resolver el juego en el menor nmero de pasos posible Qu disco hay que mover en cada paso y a dnde? Identifiquemos los elementos (torre de cuatro discos):
Cada pilar se identifica con una letra Mover del pilar X al pilar Y: Coger el disco superior de X y ponerlo encima de los que haya en Y
LuisHernndezYez
Fundamentosdelaprogramacin:Introduccinalarecursin
Pgina 1038
Resolucin del problema en base a problemas ms pequeos Mover N discos del pilar A al pilar C: Mover N1 discos del pilar A al pilar B Mover el disco del pilar A al pilar C Mover N1 discos del pilar B al pilar C Para llevar N discos de un pilar origen a otro destino se usa el tercero como auxiliar Mover N1 discos del origen al auxiliar Mover el disco del origen al destino Mover N1 discos del auxiliar al destino
Mover 4 discos de A a C
LuisHernndezYez
Fundamentosdelaprogramacin:Introduccinalarecursin
Pgina 1039
Mover N1 discos se hace igual, pero usando ahora otros origen y destino Mover N1 discos del pilar A al pilar B: Mover N2 discos del pilar A al pilar C Mover el disco del pilar A al pilar B Mover N2 discos del pilar C al pilar B Naturaleza recursiva de la solucin
Mover 3 discos de A a B
A
LuisHernndezYez
Fundamentosdelaprogramacin:Introduccinalarecursin
Pgina 1040
hanoi.cpp
LuisHernndezYez
LuisHernndezYez
Fundamentosdelaprogramacin:Introduccinalarecursin
Pgina 1042
longlong int factorial(int n){ longlong intfact; assert(n>=0); if (n==0){ fact=1; } else { fact=n*factorial(n 1); } return fact; }
longlong int factorial(int n){ longlong int fact=1; assert(n>=0); for (int i=1;i<=n;i++){ fact=fact*i; } return fact; }
LuisHernndezYez
Fundamentosdelaprogramacin:Introduccinalarecursin
Pgina 1043
Qu es preferible?
Cualquier algoritmo recursivo tiene uno iterativo equivalente Los recursivos son menos eficientes que los iterativos: Sobrecarga de las llamadas a subprograma Si hay una versin iterativa sencilla, ser preferible a la recursiva En ocasiones la versin recursiva es mucho ms simple Ser preferible si no hay requisitos de rendimiento Compara las versiones recursivas del factorial o de los nmeros de Fibonacci con sus equivalentes iterativas Y qu tal una versin iterativa para los nmeros de Ackermann?
LuisHernndezYez
Fundamentosdelaprogramacin:Introduccinalarecursin
Pgina 1044
LuisHernndezYez
Fundamentosdelaprogramacin:Introduccinalarecursin
Pgina 1045
LuisHernndezYez
La lista 1, 2, 3 consiste en el elemento 1 seguido de la lista 2, 3, que, a su vez, consiste en el elemento 2 seguido de la lista 3, que, a su vez, consiste en el elemento 3 seguido de la lista vaca (caso base) Hay otras estructuras con naturaleza recursiva (p.e., los rboles) que estudiars en posteriores cursos
Fundamentosdelaprogramacin:Introduccinalarecursin Pgina 1046
Fundamentosdelaprogramacin:Introduccinalarecursin
Pgina 1047
LuisHernndezYez
Fundamentosdelaprogramacin
AP
Grado en Ingeniera Informtica Grado en Ingeniera del Software Grado en Ingeniera de Computadores Luis Hernndez Yez
Flujos Archivosbinarios Tamaodelosdatos:Eloperadorsizeof() Aperturadearchivosbinarios Lecturadearchivosbinarios(accesosecuencial) Escrituraenarchivosbinarios(accesosecuencial) Accesodirectooaleatorio Ejemplosdeusodearchivosbinarios Ordenacindelosregistrosdelarchivo Bsquedabinaria Insercinenunarchivobinarioordenado Cargadelosregistrodeunarchivoenunatabla Almacenamientodeunatablaenunarchivo
LuisHernndezYez
1051 1054 1056 1059 1061 1066 1070 1078 1079 1085 1088 1092 1093
Fundamentosdelaprogramacin:Archivosbinarios
LuisHernndezYez
Fundamentosdeprogramacin:Archivosbinarios
Pgina 1051
Flujos
Canalizan la E/S entre los dispositivos y el programa En forma de secuencias de caracteres La entrada puede proceder de un dispositivo o de un archivo La salida puede dirigirse a un dispositivo o a un archivo Siempre por medio de flujos
Dispositivos/archivos de entrada Dispositivos/archivos de salida
LuisHernndezYez
Programa
Fundamentosdeprogramacin:Archivosbinarios
Pgina 1052
Lo que signifiquen los cdigos depender del programa que use el archivo
LuisHernndezYez
En ambos casos se trata de una secuencia de caracteres En el segundo caso se interpretan como cdigos binarios Sin contemplar caracteres especiales como \n o \t Ya hemos usado flujos de texto para E/S por consola/archivos
Fundamentosdeprogramacin:Archivosbinarios
Pgina 1053
LuisHernndezYez
Fundamentosdeprogramacin:Archivosbinarios
Pgina 1054
Flujo binario
07
6C
C1
56
Fundamentosdeprogramacin:Archivosbinarios
Pgina 1055
El operador sizeof()
En los archivos binarios se manejan cdigos binarios (bytes) sizeof() (palabra clave): bytes que ocupa en memoria algo Se aplica a un dato o a un tipo char byte
constint Max=80; typedefchar tCadena[Max]; typedef struct { int codigo; tCadena item; double valor; } tRegistro; const int SIZE=sizeof(tRegistro);
LuisHernndezYez
En un archivo binario un dato del tipo tRegistro ocupar exactamente SIZE caracteres
Fundamentosdeprogramacin:Archivosbinarios Pgina 1056
typedef struct { int cod; double val; } tRegistro; tRegistro reg; const int SIZE=sizeof(reg); ...
MEMORIA ...
reg
00 00 00 05 0A 37 1C DF 03 92 99 0E ...
reg.cod (4)
SIZE (12)
reg.val (8)
0F03:1A42 0F03:1A43
Flujo binario
00 00 00 05 0A 37 1C DF 03 92
0F03:1A44
99
0E
Fundamentosdeprogramacin:Archivosbinarios
Pgina 1057
Por eficiencia, algunos campos de una estructura se pueden forzar a ocupar un mltiplo del tamao de palabra del sistema Tamao de palabra (4, 8, 16, ... bytes): dato ms pequeo que se lee de la memoria (aunque se usen slo algunos de los bytes) As, el tamao real de las estructuras puede ser mayor que la simple suma de los tamaos de cada tipo Por ejemplo:
typedef struct { char c; int i; } tRegistro; const int SIZE=sizeof(tRegistro);
LuisHernndezYez
NOTA: El tamao de palabra y los tamaos de los tipos dependen del sistema concreto
LuisHernndezYez
Fundamentosdeprogramacin:Archivosbinarios
Pgina 1059
Biblioteca fstream
Archivos binarios: tipo fstream Apertura: funcin open(nombre,modo) Nombre: char[] (funcin c_str() para cadenas de tipo string) Modos de apertura del archivo:
Modo ios::app ios::binary ios::in ios::out ios::trunc
LuisHernndezYez
Significado Aadir: permite seguir escribiendo a partir del final Binario: tratar el archivo como archivo binario Entrada: archivo para leer de l Salida: archivo para escribir en l Truncar: borrar todo lo que haya y empezar de nuevo
LuisHernndezYez
Fundamentosdeprogramacin:Archivosbinarios
Pgina 1061
archivo.read(puntero_al_bfer,nmero)
bfer: variable destino de los caracteres ledos Pasado como puntero a secuencia de caracteres Referencia (&) a la variable destino Molde de puntero a carcter (char *) nmero: cantidad de caracteres a extraer del archivo Operador sizeof() Archivo abierto con los modos ios::in e ios::binary
archivo.read((char *)®istro,sizeof(tRegistro));
LuisHernndezYez
Fundamentosdeprogramacin:Archivosbinarios
Pgina 1062
LuisHernndezYez
leer.cpp #include<iostream> usingnamespacestd; #include<fstream> #include"registro.h" int main(){ tRegistro registro; fstream archivo; archivo.open("bd.dat",ios::in |ios::binary); archivo.read((char *)®istro,SIZE); int cuantos=archivo.gcount(); while (cuantos==SIZE){ mostrar(registro); archivo.read((char *)®istro,SIZE); cuantos=archivo.gcount(); } archivo.close(); No olvides cerrar el archivo! return 0; }
Fundamentosdeprogramacin:Archivosbinarios Pgina 1064
LuisHernndezYez
registro.h
El tipo tRegistro
constint Max=80; typedefchar tCadena[Max]; typedef struct { int codigo; tCadena item; double valor; }tRegistro; const int SIZE=sizeof(tRegistro);
LuisHernndezYez
Por qu usamos cadenas al estilo de C? string: tamao variable en memoria Requieren un proceso de serializacin Las cadenas al estilo de C siempre ocupan lo mismo en memoria
Fundamentosdeprogramacin:Archivosbinarios
Pgina 1065
LuisHernndezYez
Fundamentosdeprogramacin:Archivosbinarios
Pgina 1066
archivo.write(puntero_al_bfer,nmero)
bfer: origen de los caracteres a escribir en el archivo Pasado como puntero a secuencia de caracteres Referencia (&) a la variable destino Molde de puntero a carcter (char *) nmero: cantidad de caracteres a escribir en el archivo Operador sizeof() Archivo abierto con los modos ios::out e ios::binary
archivo.write((char *)®istro,sizeof(tRegistro));
LuisHernndezYez
Fundamentosdeprogramacin:Archivosbinarios
Pgina 1067
escribir.cpp #include<iostream> usingnamespace std; #include<fstream> #include"registro.h" int main(){ tRegistro registro; fstream archivo; archivo.open("bd2.dat",ios::out |ios::binary); bool seguir=true; while (seguir){ cout<<"Cdigo:"; cin.sync(); cin>>registro.codigo; cout<<"Nombre:"; cin.sync(); cin.getline(registro.item,Max);//Mx:80 ...
LuisHernndezYez
Fundamentosdeprogramacin:Archivosbinarios
Pgina 1068
cout<<"Precio:"; cin.sync(); cin>>registro.valor; archivo.write((char *)®istro,SIZE); cout<<"Otro[S/N]?"; charc; cin>>c; if ((c=='n')||(c=='N')){ seguir=false; } } archivo.close(); return 0;
LuisHernndezYez
Fundamentosdeprogramacin:Archivosbinarios
Pgina 1069
LuisHernndezYez
Fundamentosdeprogramacin:Archivosbinarios
Pgina 1070
LuisHernndezYez
Acceso secuencial: empezando en el primero pasando a siguiente Acceso directo (tambin llamado aleatorio): Para localizar registros individuales necesitamos otras rutinas: tellg(): lugar donde se encuentra el puntero del archivo Siguiente posicin donde se realizar una lectura o escritura seekg(desplazamiento,origen): Lleva el puntero del archivo a una posicin concreta: desplazamiento caracteres desde el origen indicado Origen: ios::beg: principio del archivo ios::cur: posicin actual ios::end: final del archivo
Fundamentosdeprogramacin:Archivosbinarios
Pgina 1071
ios::beg
0 SIZE 2*SIZE 3*SIZE 4*SIZE 5*SIZE
ios::end
6*SIZE
SIZE
SIZE
SIZE
SIZE
SIZE
SIZE
tRegistro
tRegistro
tRegistro
tRegistro
tRegistro
tRegistro
Cada registro ocupa SIZE caracteres en el archivo Cuntos registros hay en el archivo?
archivo.seekg(0,ios::end);//0car.desdeelfinal>final
LuisHernndezYez
Fundamentosdeprogramacin:Archivosbinarios
Pgina 1072
ios::beg
0 SIZE 2*SIZE 3*SIZE 4*SIZE 5*SIZE
ios::end
6*SIZE
SIZE
SIZE
SIZE
SIZE
SIZE
SIZE
tRegistro
tRegistro
tRegistro
tRegistro
tRegistro
tRegistro
LuisHernndezYez
Fundamentosdeprogramacin:Archivosbinarios
Pgina 1073
Lecturas y escrituras
Una vez ubicado el puntero al principio de un registro, se puede leer el registro o actualizar (escribir) el registro Si se ubica al final, se puede aadir (escribir) un nuevo registro Archivos binarios de lectura/escritura: Se han de abrir con los modos ios::in, ios::out e ios::binary
archivo.open("bd.dat",ios::in |ios::out |ios::binary);
Fundamentosdeprogramacin:Archivosbinarios
Pgina 1074
actualizar.cpp //Actualizacindeunregistro #include<iostream> usingnamespacestd; #include<fstream> #include"registro.h" int main(){ tRegistro registro; fstream archivo; archivo.open("bd.dat",ios::in |ios::out |ios::binary); archivo.seekg(0,ios::end); int pos=archivo.tellg(); int numReg =pos/SIZE; cout<<"Nmeroderegistros:" <<numReg <<endl; int num; cout<<"Registronmero?"; cin>>num; ...
Fundamentosdeprogramacin:Archivosbinarios Pgina 1075
LuisHernndezYez
if ((num>0)&&(num<=numReg)){ archivo.seekg((num 1)*SIZE,ios::beg); archivo.read((char *)®istro,SIZE); mostrar(registro); cout<<endl<<"Cambiarnombre[S/N]?"; char c; cin.sync(); cin>>c; if ((c=='s')||(c=='S')){ cout<<"Nombre:"; cin.sync(); cin.getline(registro.item,80); } cout<<endl<<"Cambiarprecio[S/N]?"; cin.sync(); cin>>c; if ((c=='s')||(c=='S')){ cout<<"Precio:"; cin>>registro.valor; } ...
Fundamentosdeprogramacin:Archivosbinarios Pgina 1076
LuisHernndezYez
archivo.seekg((num 1)*SIZE,ios::beg); archivo.write((char *)®istro,SIZE); cout<<endl<<"Registroactualizado:" <<endl; archivo.seekg((num 1)*SIZE,ios::beg); archivo.read((char *)®istro,SIZE); mostrar(registro); } archivo.close(); return 0; }
LuisHernndezYez
Fundamentosdeprogramacin:Archivosbinarios
Pgina 1077
LuisHernndezYez
Fundamentosdeprogramacin:Archivosbinarios
Pgina 1078
ordenar.cpp
Mediante un acceso directo a los registros del archivo Ordenaremos por el campo item
#include<iostream> usingnamespacestd; #include<fstream> #include<iomanip> #include<cstring> #include"registro.h" const char BD[]="lista.dat"; void mostrar();
LuisHernndezYez
...
Fundamentosdeprogramacin:Archivosbinarios
Pgina 1079
void mostrar(){ fstream archivo; tRegistro registro; int cuantos; archivo.open(BD,ios::in |ios::binary); archivo.read((char *)®istro,SIZE); cuantos=archivo.gcount(); while (cuantos==SIZE){ mostrar(registro); archivo.read((char *)®istro,SIZE); cuantos=archivo.gcount(); } archivo.close();
LuisHernndezYez
} ...
Fundamentosdeprogramacin:Archivosbinarios
Pgina 1080
LuisHernndezYez
fstream archivo; archivo.open(BD,ios::in |ios::out |ios::binary); archivo.seekg(0,ios::end); int pos=archivo.tellg(); int numReg =pos/SIZE; ...
Fundamentosdeprogramacin:Archivosbinarios
Pgina 1081
//Ordenamosconelmtododeseleccindirecta tRegistro regMenor,reg; for (int i=0;i<numReg 1;i++){ int menor=i; for (int j=i+1;j<numReg;j++){ archivo.seekg(menor*SIZE,ios::beg); archivo.read((char *)®Menor,SIZE); archivo.seekg(j*SIZE,ios::beg); archivo.read((char *)®,SIZE); if(strcmp(reg.item,regMenor.item)<0){ menor=j; } } regMenor reg ...
menor i
LuisHernndezYez
Fundamentosdeprogramacin:Archivosbinarios
Pgina 1082
if (menor>i){//Intercambiamos archivo.seekg(i*SIZE,ios::beg); archivo.read((char *)®,SIZE); archivo.seekg(menor*SIZE,ios::beg); archivo.read((char *)®Menor,SIZE); archivo.seekg(i*SIZE,ios::beg); archivo.write((char *)®Menor,SIZE); archivo.seekg(menor*SIZE,ios::beg); archivo.write((char *)®,SIZE); } } ...
reg regMenor
i
LuisHernndezYez
menor
Fundamentosdeprogramacin:Archivosbinarios
Pgina 1083
LuisHernndezYez
Fundamentosdeprogramacin:Archivosbinarios
Pgina 1084
buscar.cpp
LuisHernndezYez
Fundamentosdeprogramacin:Archivosbinarios
Pgina 1085
LuisHernndezYez
archivo.open(BD,ios::in|ios::binary); archivo.seekg(0,ios::end); int pos=archivo.tellg(); int numReg =pos/SIZE; int buscado; cout<<"Cdigoabuscar:"; cin>>buscado; int ini=0,fin=numReg 1,mitad; bool encontrado=false; while((ini<=fin)&&!encontrado){ mitad=(ini+fin)/2; archivo.seekg(mitad*SIZE,ios::beg); archivo.read((char *)®istro,SIZE); if (buscado==registro.codigo){ encontrado=true; } elseif(buscado<registro.codigo){ fin=mitad 1; } ...
Fundamentosdeprogramacin:Archivosbinarios Pgina 1086
else{ ini=mitad+1; } } if (encontrado){ int pos=mitad+1; cout<<"Encontradoenlaposicin" <<pos<<endl; mostrar(registro); } else{ cout<<"Noencontrado!" <<endl; } archivo.close();
LuisHernndezYez
return 0; } ...
Fundamentosdeprogramacin:Archivosbinarios
Pgina 1087
insertar.cpp
LuisHernndezYez
LuisHernndezYez
pos=0; bool encontrado=false; archivo.seekg(0,ios::beg); while ((pos<numReg)&&!encontrado){ archivo.read((char *)®istro,SIZE); if (registro.codigo >nuevoRegistro.codigo){ encontrado=true; } else { pos++; } } if (pos==numReg){//Debeiralfinal archivo.seekg(0,ios::end); archivo.write((char *)&nuevoRegistro,SIZE); } ...
Fundamentosdeprogramacin:Archivosbinarios
Pgina 1089
else {//Hayquehacerhueco for (int i=numReg 1;i>=pos;i){ archivo.seekg(i*SIZE,ios::beg); archivo.read((char *)®istro,SIZE); archivo.seekg((i+1)*SIZE,ios::beg); archivo.write((char *)®istro,SIZE); } archivo.seekg(pos*SIZE,ios::beg); archivo.write((char *)&nuevoRegistro,SIZE); } archivo.close(); mostrar();
LuisHernndezYez
nuevoRegistro
return 0; }
Fundamentosdeprogramacin:Archivosbinarios
Pgina 1090
Al principio
Por el medio
LuisHernndezYez
Al final
Fundamentosdeprogramacin:Archivosbinarios Pgina 1091
tabla.cpp void cargar(tTabla &tabla,bool &ok){ ok=true; fstream archivo; archivo.open(BD,ios::in |ios::binary); if (!archivo.is_open()){ ok=false; } else { archivo.seekg(0,ios::end); int pos=archivo.tellg(); int numReg =pos/SIZE; tabla.cont =0; tRegistroregistro; archivo.seekg(0,ios::beg); for (int i=0;i<numReg;i++){ archivo.read((char *)®istro,SIZE); tabla.registros[tabla.cont]=registro; tabla.cont++; } archivo.close(); } }
Fundamentosdeprogramacin:Archivosbinarios
LuisHernndezYez
Pgina 1092
tabla.cpp void guardar(tTabla tabla){ fstream archivo; archivo.open(BD,ios::out |ios::binary |ios::trunc); for (int i=0;i<tabla.cont;i++){ archivo.write((char *)&tabla.registros[i],SIZE); } archivo.close(); }
LuisHernndezYez
Fundamentosdeprogramacin:Archivosbinarios
Pgina 1093
bd.cpp #include<iostream> usingnamespacestd; #include"registro.h" #include"tabla.h" int main(){ tTabla tabla; tTabla ok; cargar(tabla,ok); if(!ok){ cout<<"Erroralabrirelarchivo!"<<endl; } else { mostrar(tabla); insertar(tabla,nuevo(),ok); mostrar(tabla); guardar(tabla); } return 0; }
Fundamentosdeprogramacin:Archivosbinarios Pgina 1094
LuisHernndezYez
LuisHernndezYez