Facultad de Informática 
Universidad Complutense 
 
 
 
Apuntes de clase de la asignatura 

Fundamentos de la programación 

1º curso 

Grado en Ingeniería en Informática 
Grado en Ingeniería del Software 
Grado en Ingeniería de Computadores 

2013‐2014 
 
 
Luis Hernández Yáñez 
 
 
   

Licencia Creative Commons: 
Reconocimiento, No comercial y Compartir igual. 
http://creativecommons.org/licenses/by‐nc‐sa/3.0/ 

 
 
 
Esta publicación contiene los apuntes de clase de la asignatura 
Fundamentos de la programación, asignatura de 1º curso de los grados 
que se imparten en la Facultad de Informática de la UCM. 
 
Durante los tres primeros cursos en los que se ha impartido la asignatura, 
este material ha sido sometido a continuas revisiones y contribuciones 
por parte de los profesores que han impartido los distintos grupos 
de la asignatura. Aunque el trabajo ha quedado bastante consolidado, 
estoy seguro de que todavía contiene muchas erratas. Si encuentras alguna, 
no dudes, por favor, en hacérmelo saber y conseguir así 
que la siguiente versión esté mejor depurada. 
 
Quiero agradecer a todos los profesores que han impartido la asignatura 
su contribución en el desarrollo del material, destacando especialmente 
la labor de Pablo Moreno Ger y Carlos Cervigón Rückauer. 
 
Luis Hernández Yáñez 
Profesor de la Facultad de Informática de la UCM 

Fundamentos de la programación

TC
Grado en Ingeniería Informática
Grado en Ingeniería del Software
Grado en Ingeniería de Computadores

Luis Hernández Yáñez
Facultad de Informática
Universidad Complutense

Tema 1 Computadoras y programación 1
Tema 2 Tipos e instrucciones I 48
Anexo: Detalles técnicos de los tipos 212
Tema 3 Tipos e instrucciones II 225
Anexo I: El operador ternario ? 398
Anexo II: Ejemplos de secuencias 402
Tema 4 La abstracción procedimental 425
Anexo: Más sobre subprogramas 496
Tema 5 Tipos de datos estructurados 512
Anexo: Cadenas al estilo de C 580
Tema 6 Recorrido y búsqueda en arrays 588
Tema 7 Algoritmos de ordenación 649
Anexo: Más sobre ordenación 742
Tema 8 Programación modular 755
Anexo: Ejemplo de modularización 832
Luis Hernández Yáñez

Tema 9 Punteros y memoria dinámica 847
Anexo: Punteros y memoria dinámica 938
Tema 10 Introducción a la recursión 981
Apéndice: Archivos binarios 1049

Fundamentos de la programación

Informática, computadoras y programación 3
Lenguaje máquina y ensamblador 12
Lenguajes de programación de alto nivel 15
Un poco de historia 19
Programación e Ingeniería del Software 24
El lenguaje de programación C++ 27
Sintaxis de los lenguajes de programación  30
Un primer programa en C++ 35
Herramientas de desarrollo 39
C++: Un mejor C 45
Luis Hernández Yáñez

Fundamentos de la programación

Un ejemplo de programación 50 Operadores relacionales 177
El primer programa en C++ 64 Toma de decisiones (if) 180
Las líneas de código del programa 80 Bloques de código 183
Cálculos en los programas 86 Bucles (while) 186
Variables 92 Entrada/salida por consola 190
Expresiones 98 Funciones definidas
Lectura de datos desde el teclado 108 por el programador 199
Resolución de problemas 119
Los datos de los programas 127
Identificadores 129
Tipos de datos 133
Declaración y uso de variables 142
Instrucciones de asignación 147
Operadores 152
Más sobre expresiones 160
Luis Hernández Yáñez

Constantes 167
La biblioteca cmath 171
Operaciones con caracteres 174

Fundamentos de la programación

int 214
float 216
Notación científica 217
double 218
char 220
bool 221
string 222
Literales con especificación de tipo 223
Luis Hernández Yáñez

Fundamentos de la programación

Tipos, valores y variables 227 El bucle for 321
Conversión de tipos 232 Bucles anidados 331
Tipos declarados por el usuario 236 Ámbito y visibilidad 339
Tipos enumerados 238 Secuencias 349
Entrada/Salida Recorrido de secuencias 355
con archivos de texto 248 Secuencias calculadas 363
Lectura de archivos de texto 253 Búsqueda en secuencias 370
Escritura en archivos de texto 266 Arrays de datos simples 374
Flujo de ejecución 272 Uso de variables arrays 379
Selección simple 276 Recorrido de arrays 382
Operadores lógicos 282 Búsqueda en arrays 387
Anidamiento de if 286 Arrays no completos 393
Condiciones 290
Selección múltiple 293
La escala if‐else‐if 295
Luis Hernández Yáñez

La instrucción switch 302
Repetición 313
El bucle while 316

Fundamentos de la programación

El operador ternario ? 399

Recorridos 404
Un aparcamiento 405
¿Paréntesis bien emparejados? 409
¿Dos secuencias iguales? 412
Números primos menores que N 413
Búsquedas 417
Búsqueda de un número en un archivo 419
Búsquedas en secuencias ordenadas 420
Luis Hernández Yáñez

Fundamentos de la programación

Diseño descendente: Tareas y subtareas  427
Subprogramas 434
Subprogramas y datos 441
Parámetros 446
Argumentos 451
Resultado de la función 467
Prototipos 473
Ejemplos completos 475
Funciones de operador 477
Diseño descendente (un ejemplo) 480
Precondiciones y postcondiciones 490
Luis Hernández Yáñez

Fundamentos de la programación

Archivos como parámetros 498
La función main() 501
Argumentos implícitos 504
Sobrecarga de subprogramas 508
Luis Hernández Yáñez

Fundamentos de la programación: La abstracción procedimental (Anexo)

Tipos de datos 514
Arrays de nuevo 517
Arrays y bucles for 520
Más sobre arrays 522
Inicialización de arrays 523
Enumerados como índices 524
Paso de arrays a subprogramas 525
Implementación de listas 528
Cadenas de caracteres 531
Cadenas de caracteres de tipo string 535
Entrada/salida con string 539
Operaciones con string 541
Estructuras 543
Estructuras dentro de estructuras 549
Arrays de estructuras 550
Luis Hernández Yáñez

Arrays dentro de estructuras 551
Listas de longitud variable 552
Un ejemplo completo 558
El bucle do..while 562

Fundamentos de la programación

Cadenas al estilo de C 582
E/S con cadenas al estilo de C 583
La biblioteca cstring 584
Ejemplo 585
Luis Hernández Yáñez

Fundamentos de la programación

Recorrido de arrays 590
Arrays completos 593
Arrays no completos con centinela 594
Arrays no completos con contador 595
Ejemplos 597
Generación de números aleatorios 601
Búsquedas en arrays 604
Arrays completos 606
Arrays no completos con centinela 607
Arrays no completos con contador 608
Ejemplo 610
Recorridos y búsquedas en cadenas 614
Más ejemplos de manejo de arrays 617
Arrays multidimensionales 630
Inicialización de arrays multidimensionales 638
Luis Hernández Yáñez

Recorrido de un array bidimensional 641
Recorrido de un array N‐dimensional 644
Búsqueda en un array multidimensional 647

Fundamentos de la programación

Algoritmos de ordenación 651
Algoritmo de ordenación por inserción 654
Ordenación de arrays por inserción 665
Algoritmo de ordenación por inserción
con intercambios 672
Claves de ordenación 680
Estabilidad de la ordenación 688
Complejidad y eficiencia 692
Ordenaciones naturales 694
Ordenación por selección directa 701
Método de la burbuja 716
Listas ordenadas 722
Búsquedas en listas ordenadas 729
Búsqueda binaria 731
Luis Hernández Yáñez

Fundamentos de la programación

Ordenación por intercambio 744
Mezcla de dos listas ordenadas 747
Luis Hernández Yáñez

Fundamentos de la programación

Programas multiarchivo y compilación separada  757
Interfaz frente a implementación 762
Uso de módulos de biblioteca 768
Ejemplo: Gestión de una lista ordenada I 770
Compilación de programas multiarchivo 778
El preprocesador 780
Cada cosa en su módulo 782
Ejemplo: Gestión de una lista ordenada II 784
El problema de las inclusiones múltiples 789
Compilación condicional 794
Protección frente a inclusiones múltiples 795
Ejemplo: Gestión de una lista ordenada III 796
Implementaciones alternativas 804
Espacios de nombres 808
Implementaciones alternativas 817
Luis Hernández Yáñez

Calidad y reutilización del software 827

Fundamentos de la programación

Modularización de  un programa 833
Luis Hernández Yáñez

Fundamentos de la programación

Direcciones de memoria y punteros 849
Operadores de punteros 854
Punteros y direcciones válidas 864
Punteros no inicializados 866
Un valor seguro: NULL 867
Copia y comparación de punteros 868
Tipos puntero 873
Punteros a estructuras 875
Punteros a constantes y punteros constantes 877
Punteros y paso de parámetros 879
Punteros y arrays 883
Memoria y datos del programa 886
Memoria dinámica 891
Punteros y datos dinámicos 895
Gestión de la memoria 907
Luis Hernández Yáñez

Errores comunes 911
Arrays de datos dinámicos 916
Arrays dinámicos 928

Fundamentos de la programación

Aritmética de punteros 940
Recorrido de arrays con punteros 953
Referencias 962
Listas enlazadas 964
Luis Hernández Yáñez

Fundamentos de la programación

Concepto de recursión 983 Algoritmos recursivos 986 Funciones recursivas 987 Diseño de funciones recursivas 989 Modelo de ejecución 990 La pila del sistema 992 La pila y las llamadas a función 994 Ejecución de la función factorial() 1005 Tipos de recursión 1018 Recursión simple 1019 Recursión múltiple 1020 Recursión anidada 1022 Recursión cruzada 1026 Código del subprograma recursivo 1027 Parámetros y recursión 1032 Ejemplos de algoritmos recursivos 1034 Luis Hernández Yáñez Búsqueda binaria 1035 Torres de Hanoi 1038 Recursión frente a iteración 1043 Estructuras de datos recursivas 1045 Fundamentos de la programación Flujos 1051 Archivos binarios 1054 Tamaño de los datos: El operador sizeof() 1056 Apertura de archivos binarios 1059 Lectura de archivos binarios (acceso secuencial) 1061 Escritura en archivos binarios (acceso secuencial) 1066 Acceso directo o aleatorio 1070 Ejemplos de uso de archivos binarios 1078 Ordenación de los registros del archivo 1079 Búsqueda binaria 1085 Inserción en un archivo binario ordenado 1088 Carga de los registro de un archivo en una tabla 1092 Almacenamiento de una tabla en un archivo 1093 Luis Hernández Yáñez Fundamentos de la programación .

Xhafa et al.B. Dale. 2007  Problem Solving. Koffman. Nyhoff. Leestma. Prentice Hall. Stroustrup. Stroustrup. Principles and Practice Using C++ B. 2000. Addison‐Wesley. 1998  El lenguaje de programación C++ (Edición especial) B. Adams. Design Using C++ (3ª edición) F. Abstraction. 2002  Programación y resolución de problemas con C++ N. Weems. L. C. Luis Hernández Yáñez  Programación en C++ para ingenieros F. Addison‐Wesley. Friedman.L. E. Thomson. Fundamentos de la programación RB Grado en Ingeniería Informática Grado en Ingeniería del Software Grado en Ingeniería de Computadores Luis Hernández Yáñez Facultad de Informática Universidad Complutense  Programming. 2006 Fundamentos de la programación . S. Pearson Education. 2009  C++: An Introduction to Computing (2ª edición) J. McGraw‐Hill Interamericana.

buena organización de los contenidos. la referencia absoluta sobre el lenguaje C++ en la que consultar dudas y detalles técnicos sobre los elementos del Luis Hernández Yáñez lenguaje Fundamentos de la programación Programación y resolución de problemas con C++ Un enfoque práctico al desarrollo de programas con C++ con numerosos ejemplos Problem Solving. Abstraction. hace un uso temprano de conceptos de orientación a objetos y de la STL. que quedan fuera del temario de este curso C++: An Introduction to Computing (2ª edición) Buena introducción a la programación en C++. Principles and Practice Using C++ Del autor del lenguaje C++. Programming. bien desarrollado y con secciones prácticas El lenguaje de programación C++ (Edición especial) Del autor del lenguaje C++. un amplio tutorial que enseña a programar en C++. Design Using C++ (3ª edición) Introducción a la programación en C++ con un enfoque de desarrollo de software y numerosos casos de estudio Programación en C++ para ingenieros Introducción a la programación en C++ con explicaciones sencillas y una organización clara Luis Hernández Yáñez Fundamentos de la programación .

 computadoras y programación 3 Lenguaje máquina y ensamblador 12 Lenguajes de programación de alto nivel 15 Un poco de historia 19 Programación e Ingeniería del Software 24 El lenguaje de programación C++ 27 Sintaxis de los lenguajes de programación  30 Un primer programa en C++ 35 Herramientas de desarrollo 39 C++: Un mejor C 45 Luis Hernández Yáñez Fundamentos de la programación: Computadoras y programación . Fundamentos de la programación 1 Grado en Ingeniería Informática Grado en Ingeniería del Software Grado en Ingeniería de Computadores Luis Hernández Yáñez Facultad de Informática Universidad Complutense Informática.

analógica o digital. dotada de una memoria de gran capacidad y de métodos de tratamiento de la información.Luis Hernández Yáñez Fundamentos de la programación: Computadoras y programación Página 3 Informática (Ciencia de la computación) Conjunto de conocimientos científicos y técnicas que hacen posible el tratamiento automático de la información por medio de ordenadores Computadora Máquina electrónica. capaz de resolver problemas matemáticos y lógicos Luis Hernández Yáñez mediante la ejecución de programas informáticos Fundamentos de la programación: Computadoras y programación Página 4 .

instrucciones y reglas informáticas para ejecutar tareas en una computadora Luis Hernández Yáñez Fundamentos de la programación: Computadoras y programación Página 6 . En todas partes y con muchas formas Luis Hernández Yáñez Fundamentos de la programación: Computadoras y programación Página 5 Hardware Componentes que integran la parte material de una computadora Software Programas.

.  Gestores  Analistas Parque Jurásico  Diseñadores  Programadores  Probadores  Administradores de sistemas . Luis Hernández Yáñez Fundamentos de la programación: Computadoras y programación Página 8 . 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! Luis Hernández Yáñez Fundamentos de la programación: Computadoras y programación Página 7 Trabajo en equipo Múltiples roles....

U.U. de entrada de salida Teclado Monitor Ratón Impresora Escáner Altavoz Luis Hernández Yáñez Táctil Almacenamiento … … permanente Fundamentos de la programación: Computadoras y programación Página 9 La arquitectura de Von Neumann Dispositivos de E/S Una ALU de 2 bits (Wikipedia) C.P. Esquema general Memoria temporal Unidad Central de Proceso Central Processor Unit Dispositivos Dispositivos C.U.P. Unidad Aritmético‐Lógica Memoria Luis Hernández Yáñez Unidad de Control Fundamentos de la programación: Computadoras y programación Página 10 . (Procesador) A.L.

1 Gigabyte (GB) = 1024 MB 1 Terabyte (TB) = 1024 GB 1 Petabyte (PB) = 1024 TB Luis Hernández Yáñez Dirección 210 = 1024  1000 Fundamentos de la programación: Computadoras y programación Página 11 Luis Hernández Yáñez Fundamentos de la programación: Computadoras y programación Página 12 . . La memoria Memoria Cada celda en una dirección 01 Celdas de 8 / 16 / 32 / 64 bits 02 03 Información volátil 04 Bus  05 1 Bit = 0 / 1 de  06 1 Byte = 8 bits = 1 carácter datos 07 1 Kilobyte (KB) = 1024 Bytes 08 1 Megabyte (MB) = 1024 KB . .

registros de la CPU. direcciones de memoria o datos Instrucción Significado Lenguaje de bajo nivel A0 2F Acceder a la celda de memoria 2F Dependiente de la máquina 3E 01 Copiarlo el registro 1 de la ALU Programación difícil A0 30 Acceder a la celda de memoria 30 Luis Hernández Yáñez 3E 02 Copiarlo en el registro 2 de la ALU 1D Sumar B3 31 Guardar el resultado en la celda de memoria 31 Fundamentos de la programación: Computadoras y programación Página 13 Nemotécnicos para los códigos hexadecimales: A0  READ   3E  REG   1D  ADD   … Mayor legibilidad: READ 2F Código fuente REG 01  (lenguaje ensamblador) READ 30 REG 02  ADD    Programa WRITE 31 ensamblador Lenguaje de nivel medio Código objeto Luis Hernández Yáñez (lenguaje máquina) Fundamentos de la programación: Computadoras y programación Página 14 . Los procesadores trabajan con ceros y unos (bits) Unidad de memoria básica: Byte (8 bits) (2 dígitos hexadecimales: 01011011  0101 1011  5B) Lenguaje máquina Códigos hexadecimales que representan instrucciones.

Luis Hernández Yáñez Fundamentos de la programación: Computadoras y programación Página 15  Más cercanos a los lenguajes natural y matemático resultado = dato1 + dato2. mayor facilidad de codificación  Estructuración de datos / abstracción procedimental Luis Hernández Yáñez Fundamentos de la programación: Computadoras y programación Página 16 .  Mayor legibilidad.

enlazan y ejecutan instrucción Código Enlazador objeto de a instrucción biblioteca Luis Hernández Yáñez Programa Para una arquitectura concreta ejecutable y un sistema operativo Fundamentos de la programación: Computadoras y programación Página 17 Genealogía de lenguajes Versiones / Estándares Prolog 1970 Java COBOL PL/I C++ 1959 1995 1964 1983 FORTRAN C# 1954 CPL C 2000 1963 1971 Python ALGOL Pascal Modula 1991 1958 1970 1975 BASIC 1964 Ada Eiffel 1979 1986 Simula Fuente: 1964 Smalltalk http://www. Código fuente int main() { cout << "Hola Mundo!" << endl. Compiladores: } return 0. Compilan y enlazan Compilador programas completos Intérpretes: Código objeto 0100010100111010011100… Compilan.com/lang/ Ruby 1971 1993 Luis Hernández Yáñez Haskell Lisp Scheme 1987 1958 1975 Logo 1968 Fundamentos de la programación: Computadoras y programación Página 18 . Traducción #include <iostream> using namespace std.levenez.

Luis Hernández Yáñez Fundamentos de la programación: Computadoras y programación Página 19 La prehistoria El ábaco Siglo XIX (Wikipedia) Máquina analítica de Charles Babbage Lady Ada Lovelace es considerada la primera programadora Luis Hernández Yáñez Fundamentos de la programación: Computadoras y programación Página 20 .

0 1990 Lenguaje HTML World Wide Web Linux Luis Hernández Yáñez IBM PC (Wikipedia) 1991 Sistema operativo Linux Fundamentos de la programación: Computadoras y programación Página 22 . Siglo XX 1936 Máquina de Turing 1946 ENIAC: Primera computadora digital de propósito general 1947 El transistor ENIAC (Wikipedia) 1953 IBM 650: Primera computadora a gran escala 1966 ARPANET: Origen de Internet 1967 El disquete 1970 Sistema operativo UNIX 1972 Primer virus informático (Creeper) Luis Hernández Yáñez Lenguaje de programación C 1974 Protocolo TCP. Primera red local Fundamentos de la programación: Computadoras y programación Página 21 1975 Se funda Microsoft 1976 Se funda Apple 1979 Juego Pacman 1981 IBM PC Sistema operativo MS‐DOS Apple II (Wikipedia) 1983 Lenguaje de programación C++ 1984 CD‐ROM 1985 Windows 1.

1 1995 Lenguaje de programación Java DVD 1998 Se funda Google 1999 MSN Messenger Siglo XXI 2001 Windows XP Mac OS X 2002 Mozilla Firefox 2007 iPhone Luis Hernández Yáñez 2008 Android .. 1992 Windows 3. Fundamentos de la programación: Computadoras y programación Página 23 Luis Hernández Yáñez Fundamentos de la programación: Computadoras y programación Página 24 ..

así como probar que el programa realiza su tarea adecuadamente y con un rendimiento aceptable Programa: Transforma entrada en salida Entrada Programa Salida Algoritmo: Secuencia de pasos y operaciones que debe realizar Luis Hernández Yáñez el programa para resolver el problema El programa implementa el algoritmo en un lenguaje concreto Fundamentos de la programación: Computadoras y programación Página 25 La programación es sólo una etapa del proceso de desarrollo Modelo de desarrollo “en cascada”: Planificación Recursos necesarios. plan. … Análisis ¿Qué? Diseño ¿Cómo? Programación Implementación Prueba y depuración Luis Hernández Yáñez Mantenimiento Fundamentos de la programación: Computadoras y programación Página 26 . presupuesto. ¿Qué es programar? Decirle a un tonto muy rápido exactamente lo que tiene que hacer Especificar la estructura y el comportamiento de un programa.

// Muestra Hola Mundo! Luis Hernández Yáñez return 0. int main() { cout << "Hola Mundo!" << endl. } Fundamentos de la programación: Computadoras y programación Página 28 .Luis Hernández Yáñez Fundamentos de la programación: Computadoras y programación Página 27 Bjarne Stroustrup (1983) Hola Mundo! #include <iostream> using namespace std.

// Muestra Hola Mundo! Luis Hernández Yáñez Comentario Dato Instrucción return 0. tipos Subprogramas (funciones) Comentarios Directivas Directiva #include <iostream> . Subprograma int main() { Dato Instrucción cout << "Hola Mundo!" << endl. using namespace std... } Fundamentos de la programación: Computadoras y programación Página 29 Luis Hernández Yáñez Fundamentos de la programación: Computadoras y programación Página 30 . Instrucciones Datos: literales. variables.

 9 002    ‐ Fundamentos de la programación: Computadoras y programación Página 32 .4    Luis Hernández Yáñez 0 . Sintaxis y semántica de los lenguajes Sintaxis — Reglas que determinan cómo se pueden construir y secuenciar los elementos del lenguaje Semántica — Significado de cada elemento del lenguaje ¿Para qué sirve? Luis Hernández Yáñez Fundamentos de la programación: Computadoras y programación Página 31 Especificación  Lenguajes (BNF)  Diagramas Ejemplo: Números enteros (sin decimales) BNF <numero entero> ::= <signo opcional><secuencia de dígitos> <signo opcional> ::= +|‐|<nada> <secuencia de dígitos> ::= <dígito>|<dígito><secuencia de dígitos> <dígito> ::= 0|1|2|3|4|5|6|7|8|9 +23    <nada> ::=  | significa ó ‐159   1374   1‐34   + 3..

<numero entero> ::= <signo opcional><secuencia de dígitos> <signo opcional> ::= +|‐|<nada> <secuencia de dígitos> ::= <dígito>|<dígito><secuencia de dígitos> <dígito> ::= 0|1|2|3|4|5|6|7|8|9 <nada> ::=  +23 <numero entero> ::= <signo opcional><secuencia de dígitos> ::= +<secuencia de dígitos> ::= +<dígito><secuencia de dígitos>  ::= +2<secuencia de dígitos> ::= +2<dígito> ::= +23 1374  <numero entero> ::= <signo opcional><secuencia de dígitos>  ::= <secuencia de dígitos> ::= <dígito><secuencia de dígitos>  ::= 1<secuencia de dígitos> ::= 1<dígito><secuencia de dígitos>  ::= 13<secuencia de dígitos> ::= 13<dígito><secuencia de dígitos>   ::= 137<secuencia de dígitos> ::= 137<dígito> ::= 1374 Luis Hernández Yáñez 1‐34 <numero entero> ::= <signo opcional><secuencia de dígitos> ::= <secuencia de dígitos> ::= <dígito><secuencia de dígitos>  ::= 1<secuencia de dígitos> ::= ERROR (‐ no es <dígito>)  Fundamentos de la programación: Computadoras y programación Página 33 +23 + ‐ 0 .... 9 1‐  Luis Hernández Yáñez ‐ Fundamentos de la programación: Computadoras y programación Página 34 . 9 +23  1374 + ‐ 0 . 9 1374  1‐34 + ? 0 .

int main() // main() es donde empieza la ejecución { cout << "Hola Mundo!" << endl. } Fundamentos de la programación: Computadoras y programación Página 36 . // Muestra Hola Mundo! Luis Hernández Yáñez return 0.Luis Hernández Yáñez Fundamentos de la programación: Computadoras y programación Página 35 Hola Mundo! Un programa que muestra un saludo en la pantalla: #include <iostream> using namespace std.

Coloreado sintáctico Tipo Palabras reservadas Declaración int main() Cabecera de la función { Bloque de código Variable Cadena de caracteres Constante Instrucción cout << "Hola Mundo!" << endl. bibliotecas y otro soporte) hace nuestro código simple. Operador Operador Datos literales return 0. Luis Hernández Yáñez Instrucción Número } Cuerpo de la función Las instrucciones terminan en . Fundamentos de la programación: Computadoras y programación Página 37 Hola Mundo! Casi todo es infraestructura Sólo cout << "Hola Mundo!" << endl hace algo palpable La infraestructura (notación. completo. confiable y eficiente ¡El estilo importa! Luis Hernández Yáñez Fundamentos de la programación: Computadoras y programación Página 38 . Análisis del programa Biblioteca Directiva #include <iostream> Espacio de nombres Instrucción using namespace std.

Word. Writer.Luis Hernández Yáñez Fundamentos de la programación: Computadoras y programación Página 39 Editor  Bloc de notas. Wordpad. … (texto simple. sin formatos)  Editores específicos: coloreado sintáctico  Recomendación: Notepad++ Instalación y uso: Sección Herramientas de desarrollo en el Campus Virtual Luis Hernández Yáñez Fundamentos de la programación: Computadoras y programación Página 40 . Kwrite. Gedit.

cpp Compilador hola.exe Luis Hernández Yáñez (ejecutable) Fundamentos de la programación: Computadoras y programación Página 41 Compilador  Importante: C++ estándar  Recomendación: GNU G++ (MinGW en Windows) Instalación y uso: Sección Herramientas de desarrollo en el Campus Virtual Luis Hernández Yáñez Fundamentos de la programación: Computadoras y programación Página 42 .obj (código fuente) (código objeto) Código objeto de Enlazador la biblioteca iostream Hola Mundo! Cargador hola. hola.

_ Muestra Hola Mundo! en la pantalla y salta de línea return 0. Devuelve 0 como código Luis Hernández Yáñez de terminación del programa Fin Fundamentos de la programación: Computadoras y programación Página 44 . Entornos de desarrollo  Para editar. compilar y probar el código del programa  Recomendaciones: — Windows: MS Visual Studio / C++ Express o Eclipse — Linux: Netbeans o Eclipse Instalación y uso: Sección Herramientas de desarrollo en el Campus Virtual Luis Hernández Yáñez Fundamentos de la programación: Computadoras y programación Página 43 ¿Qué hace el programa?  La ejecución del programa siempre empieza en main()  Se ejecutan las instrucciones en secuencia de principio a fin Inicio Pantalla (cout) _ Hola Mundo! cout << "Hola Mundo!" << endl.

Ritchie en 1972  Lenguaje de nivel medio: — Estructuras típicas de los lenguajes de alto nivel — Construcciones para control a nivel de máquina  Lenguaje sencillo (pocas palabras reservadas)  Lenguaje estructurado (no estrictamente estructurado en bloques)  Compartimentalización de código (funciones) y datos (ámbitos)  Componente estructural básico: la función (subprograma)  Programación modular Luis Hernández Yáñez  Distingue entre mayúsculas y minúsculas  Palabras reservadas (o clave): en minúsculas Fundamentos de la programación: Computadoras y programación Página 46 .Luis Hernández Yáñez Fundamentos de la programación: Computadoras y programación Página 45 El lenguaje C  Lenguaje creado por Dennis M.

Licencia CC (Creative Commons) Este tipo de licencias ofrecen algunos derechos a terceras personas bajo ciertas condiciones. Compartir igual (Share alike): La explotación autorizada incluye la creación de obras derivadas siempre que mantengan la misma licencia al ser divulgadas. Fundamentos de la programación: Computadoras y programación Página 47 . Este documento tiene establecidas las siguientes: Reconocimiento (Attribution): En cualquier explotación de la obra autorizada por la licencia hará falta reconocer la autoría. No comercial (Non commercial): La explotación de la obra queda limitada a usos no comerciales. Luis Hernández Yáñez Pulsa en la imagen de arriba a la derecha para saber más.

Fundamentos de la programación 2 Grado en Ingeniería Informática Grado en Ingeniería del Software Grado en Ingeniería de Computadores Luis Hernández Yáñez Facultad de Informática Universidad Complutense Un ejemplo de programación 50 Operadores relacionales 177 El primer programa en C++ 64 Toma de decisiones (if) 180 Las líneas de código del programa 80 Bloques de código 183 Cálculos en los programas 86 Bucles (while) 186 Variables 92 Entrada/salida por consola 190 Expresiones 98 Funciones definidas Lectura de datos desde el teclado 108 por el programador 199 Resolución de problemas 119 Los datos de los programas 127 Identificadores 129 Tipos de datos 133 Declaración y uso de variables 142 Instrucciones de asignación 147 Operadores 152 Más sobre expresiones 160 Luis Hernández Yáñez Constantes 167 La biblioteca cmath 171 Operaciones con caracteres 174 Fundamentos de la programación: Tipos e instrucciones I .

<inst> ::= Start | Stop | <avanzar> <avanzar> ::= Go <dirección> <num> Blocks <dirección> ::= North | East | South | West <num> ::= 1 | 2 | 3 | 4 | 5 Ejemplos: Start. Stop. Luis Hernández Yáñez Go North 3 Blocks. Fundamentos de la programación: Tipos e instrucciones I Página 51 .Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones I Página 50 Una computadora de un coche Instrucciones que entiende: <instrucción> ::= <inst> .

Sintaxis del lenguaje de programación = Literales Start instrucción Stop . avanzar avanzar Go dirección num Blocks North 1 East 2 Luis Hernández Yáñez dirección num 3 South 4 West 5 Fundamentos de la programación: Tipos e instrucciones I Página 52 N El problema a resolver Estando el coche en la posición A. conseguir llegar al Cine Tívoli (B) B ¿Qué pasos hay que seguir? Arrancar Ir un bloque al Norte Ir dos bloques al Este Ir cinco bloques al Norte A Ir dos bloques al Este Parar Bloque: Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones I Página 53 .

Go North 5 Blocks. A Go East 2 Blocks.‐ Parar Luis Hernández Yáñez Esos pasos sirven tanto para una persona como para una computadora. Go North 1 Blocks. Go East 2 Blocks. Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones I Página 55 .‐ Ir cinco bloques al Norte 5. Stop. N El algoritmo Secuencia de pasos que hay que  seguir para resolver el problema 1. Fundamentos de la programación: Tipos e instrucciones I Página 54 N El programa Instrucciones escritas en el lenguaje de programación B Start.‐ Ir un bloque al Norte 3.‐ Arrancar 2.‐ Ir dos bloques al Este 4.‐ Ir dos bloques al Este 6.

Fundamentos de la programación: Tipos e instrucciones I Página 56 La compilación Introducimos la llave USB en el coche y pulsamos el botón de ejecutar el programa: Stat. Impossible to run the program. El programa Escribimos el código del programa en un editor y lo guardamos en un archivo: Stat. There are errors. en una llave USB Go Noth 5 Blocks. de sintaxis Go Noth 5 Blocks. Go East Blocks. Go West 2 Blocks. Fundamentos de la programación: Tipos e instrucciones I Página 57 . Luis Hernández Yáñez Stop. Go North 1 Blocks Copiamos el archivo Go East Blocks. Go North 1 Blocks ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐^ . ‐‐‐‐‐‐‐^ Unknown word. y lo llevamos al coche Go West 2 Blocks. ‐‐‐‐^ Unknown word. missing. Errores ‐‐‐‐‐‐‐‐^ Number missing. Luis Hernández Yáñez Stop.

! Error de ejecución Luis Hernández Yáñez ¡Una instrucción no se puede ejecutar! Fundamentos de la programación: Tipos e instrucciones I Página 59 . Go North 1 Blocks. Go East Blocks. Go North 1 Blocks Go North 1 Blocks. Go West 2 Blocks. Stop. Go East 3 Blocks. Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones I Página 58 N La ejecución Se realiza lo que pide cada instrucción: B Start. Depuración Editamos el código para corregir los errores sintácticos: Stat. Go Noth 5 Blocks. Go North 5 Blocks. Stop. Start. Go East 3 Blocks. Go West 2 Blocks.

Go West 2 Blocks. Go North 1 Blocks. Go West 2 Blocks. Stop. Go West 2 Blocks. Go North 5 Blocks. Go East 2 Blocks. Depuración Editamos el código para arreglar el error de ejecución: Start. Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones I Página 60 N La ejecución Se realiza lo que pide ? cada instrucción: B Start. Stop. Go North 1 Blocks. Go East 3 Blocks. Luis Hernández Yáñez Error lógico ¡El programa no llega al resultado deseado! Fundamentos de la programación: Tipos e instrucciones I Página 61 . Start. Go North 5 Blocks. Go East 2 Blocks. Stop. Go North 1 Blocks. Go North 5 Blocks.

Go North 1 Blocks. Go North 1 Blocks. Go West 2 Blocks. Depuración Editamos el código para arreglar el error lógico: Start. Go East 2 Blocks. Go East 2 Blocks. Stop. Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones I Página 62 N La ejecución  Se realiza lo que pide cada instrucción: Start. Go East 2 Blocks. Go East 2 Blocks. Start. Stop. Go North 1 Blocks. Go North 5 Blocks. Stop. Go East 2 Blocks. Go North 5 Blocks. Luis Hernández Yáñez ¡Conseguido! Fundamentos de la programación: Tipos e instrucciones I Página 63 . Go North 5 Blocks.

Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones I Página 64 Hola Mundo! De vuelta en el programa que muestra un saludo en la pantalla: #include <iostream> using namespace std. int main() // main() es donde empieza la ejecución { cout << "Hola Mundo!" << endl. return 0. Luis Hernández Yáñez } Fundamentos de la programación: Tipos e instrucciones I Página 65 .

Luis Hernández Yáñez } Fundamentos de la programación: Tipos e instrucciones I Página 66 cout (iostream) character output stream Visualización en la pantalla: operador << (insertor) cout << "Hola Mundo!" << endl. return 0. int main() // main() es donde empieza la ejecución { cout << "Hola Mundo!" << endl.  cout << "Hola Mundo!" << endl. Hola Mundo! _ endl  end line Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones I Página 67 . Hola Mundo! La única instrucción que produce algo tangible: #include <iostream> using namespace std.

Fundamentos de la programación: Tipos e instrucciones I Página 69 .. Cursor parpadeante: Donde se colocará el siguiente carácter... Pantalla en modo texto  Líneas de 80 caracteres (textos) Aplicación en modo texto 80 caracteres Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones I Página 68 Ventanas de consola o terminal Las aplicaciones en modo texto se ejecutan dentro de ventanas:  Windows: ventanas de consola (Símbolo del sistema)  Linux: ventanas de terminal H o l a M u n d o ! .. Luis Hernández Yáñez .

.  Inserta textos en la pantalla de modo texto Representación textual de los datos A partir de la posición del cursor Line wrap (continúa en la siguiente línea si no cabe) Se pueden encadenar: cout << . ¡Las comillas no se muestran!  Números literales Con o sin decimales.. 3.. .1416.." cout << "Hola Mundo!". << .. Recuerda: las instrucciones terminan en ... Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones I Página 70 Con el insertor << podemos mostrar...1416. El insertor << cout << ... Se muestran los caracteres que representan el número Luis Hernández Yáñez  endl ¡Punto decimal. << . cout << "Pi = " << 3....  Cadenas de caracteres literales Textos encerrados entre comillas dobles: ".. ‐37. NO coma! Fundamentos de la programación: Tipos e instrucciones I Página 71 .. con signo o no: 123.

return 0. int main() // main() es donde empieza la ejecución { cout << "Hola Mundo!" << endl. Devuelve el resultado (0) de la función Fundamentos de la programación: Tipos e instrucciones I Página 73 . return 0. #include <iostream> using namespace std. } Luis Hernández Yáñez Contiene las instrucciones que hay que ejecutar Fundamentos de la programación: Tipos e instrucciones I Página 72 El programa principal La función main(): Tipo de la función (int = entero): Tipo de valor que devuelve Nombre de la función int main() ¡Es una función! { . El programa principal La función main(): donde comienza la ejecución.. Cuerpo de la función (bloque de código) } Luis Hernández Yáñez return 0....

} Luis Hernández Yáñez Bibliotecas de funciones a nuestra disposición Fundamentos de la programación: Tipos e instrucciones I Página 75 . int main()   // main() es donde empieza la ejecución { cout << "Hola Mundo!" << endl. int main()   // main() es donde empieza la ejecución { cout << "Hola Mundo!" << endl.. Hasta el final de la línea: // Comentario de una línea Luis Hernández Yáñez De varias líneas: /* Comentario de varias líneas seguidas */ Fundamentos de la programación: Tipos e instrucciones I Página 74 La infraestructura Código para reutilizar: #include <iostream> Una directiva: empieza por # using namespace std.. Comentarios (se ignoran): #include <iostream> using namespace std. Documentando el código..  return 0.. .

Luis Hernández Yáñez Siempre usaremos el espacio de nombres estándar (std) Muchas bibliotecas no tienen espacios de nombres Fundamentos de la programación: Tipos e instrucciones I Página 76 Compilación y enlace A menudo en un paso hola.cpp Compilador hola. ¿cuál queremos? #include <iostream> using namespace std.exe (ejecutable) Fundamentos de la programación: Tipos e instrucciones I Página 77 . Es una instrucción: termina en . 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.obj (código fuente) (código objeto) Código objeto de Enlazador la biblioteca iostream Hola Mundo! Luis Hernández Yáñez Cargador hola.

Luis Hernández Yáñez return 0. Elementos del programa Biblioteca Directiva #include <iostream> Espacio de nombres Instrucción using namespace std. Fundamentos de la programación: Tipos e instrucciones I Página 78 Uso de espacio en blanco Separación de elementos por uno o más espacios en blanco (espacios. int main() {   ¿Cuál se lee mejor? cout << "Hola Mundo!" << endl. Operador Operador Datos literales Instrucción return 0. tabuladores y saltos de línea) El compilador los ignora #include <iostream> using namespace std. Coloreado sintáctico: Directivas              Tipos Palabras reservadas generales Tipo Palabras reservadas Datos literales   Comentarios Declaración int main() Cabecera de la función { Bloque de código Variable Cadena de caracteres Constante Instrucción cout << "Hola Mundo!" << endl. int main(){cout<<"Hola Mundo!"<<endl.} #include <iostream> using namespace std.  return 0. Luis Hernández Yáñez Número } Cuerpo de la función Las instrucciones terminan en . } Fundamentos de la programación: Tipos e instrucciones I Página 79 .

int main() { ¡Tu código aquí! Luis Hernández Yáñez return 0. } Fundamentos de la programación: Tipos e instrucciones I Página 81 .Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones I Página 80 Programa con E/S por consola Una plantilla para empezar: #include <iostream> using namespace std.

int main() { cout << "En un lugar de la Mancha. . ." << endl." << endl. ." << endl... ↲ ↲ int main() ↲ {↲ cout << "En un lugar de la Mancha. ↲ cout << "no ha mucho tiempo que vivía un hidalgo de los de  lanza en astillero. cout << "no ha mucho tiempo que vivía un hidalgo de los de  lanza en astillero. Luis Hernández Yáñez return 0. ↲ }↲ Fundamentos de la programación: Tipos e instrucciones I Página 83 . } Fundamentos de la programación: Tipos e instrucciones I Página 82 Introducción del código del programa Terminamos cada línea de código con un salto de línea (↲): #include <iostream> ↲ using namespace std. recitado en la consola Mostrar los textos con cout <<: #include <iostream> using namespace std." << endl.. ↲ cout << "de cuyo nombre no quiero acordarme.." << endl..." << endl. ↲ Luis Hernández Yáñez return 0. cout << "de cuyo nombre no quiero acordarme.

3 esp. mejor que cout<<"En un lugar de la Mancha..." << endl...  Usa sangría (indentación) para el código de un bloque: { Tab cout << "En un lugar de la Mancha. ó . Fundamentos de la programación: Tipos e instrucciones I Página 84 Mantenimiento y reusabilidad  Usa espacio en blanco para separar los elementos: cout << "En un lugar de la Mancha." << endl. .."<<endl. Introducción del código del programa No hay que partir una cadena literal entre dos líneas: cout << "no ha mucho tiempo que vivía un hidalgo de ↲ los de lanza en astillero. ↲ ¡La cadena no termina (1ª línea)! ¡No se entiende los (2ª línea)! Luis Hernández Yáñez Veamos cómo nos muestra los errores el compilador. Luis Hernández Yáñez } ¡El estilo importa! Fundamentos de la programación: Tipos e instrucciones I Página 85 . return 0." << endl..

56 ‐ 3 ‐0.15 Fundamentos de la programación: Tipos e instrucciones I Página 87 .Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones I Página 86 Operadores aritméticos + Suma ‐ Resta * Multiplicación / División Operadores binarios operando_izquierdo operador   operando_derecho Operación Resultado 3 + 4 7 2.44 Luis Hernández Yáñez 143 * 2 286 45.45 / 3 15.

cout << "34 * 59 = " << 34 * 59 << endl. cout << "500 / 3 = " << 500 / 3 << endl.93 << endl.1416).1416  357.0  ‐1.4 * 5. Números literales (concretos)  Enteros: sin parte decimal Signo negativo (opcional) + secuencia de dígitos 3   143   ‐12   67321   ‐1234 No se usan puntos de millares  Reales: con parte decimal Signo negativo (opcional) + secuencia de dígitos + punto decimal + secuencia de dígitos 3. // Div.1416) Fundamentos de la programación: Tipos e instrucciones I Página 88 cálculos. real Luis Hernández Yáñez return 0.0 / 3 << endl.0 / 3 = " << 500.4 * 5.1 Luis Hernández Yáñez Punto decimal (3.333  2345. // Div.93 = " << 3. cout << "1234 ‐ 111.5 << endl.cpp Ejemplo #include <iostream> using namespace std. entera cout << "500. NO coma (3. int main() Un texto Un número { cout << "133 + 1234 = " << 133 + 1234 << endl.6789  ‐404.5 = " << 1234 ‐ 111. cout << "3. } Fundamentos de la programación: Tipos e instrucciones I Página 89 .

667 500 / 3.0 166.667 Comprueba siempre que el tipo de división sea el que quieres Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones I Página 91 .0 / 3 166.0 166.0 / 3.667 500. División entera Luis Hernández Yáñez División real Fundamentos de la programación: Tipos e instrucciones I Página 90 ¿División entera o división real? Ambos operandos enteros  División entera Algún operando real  División real División Resultado 500 / 3 166 500.

 // variable edad y literal 19 Las variables deben ser declaradas ¿Qué tipo de dato queremos mantener?  Valor numérico sin decimales (entero): tipo int  Valor numérico con decimales (real): tipo double Luis Hernández Yáñez Declaración: tipo nombre. Fundamentos de la programación: Tipos e instrucciones I Página 93 .Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones I Página 92 Datos que se mantienen en memoria Variable: dato que se accede por medio de un nombre Dato literal: un valor concreto Variable: puede cambiar de valor (variar) edad = 19.

 total. separando los nombres con comas Luis Hernández Yáñez } Fundamentos de la programación: Tipos e instrucciones I Página 95 . antes del primer uso Luis Hernández Yáñez Habitualmente al principio de la función Fundamentos de la programación: Tipos e instrucciones I Página 94 Declaración de variables Memoria #include <iostream> cantidad ? using namespace std. Podemos declarar varias de un mismo tipo return 0. .. LAS VARIABLES NO SE INICIALIZAN No se deben usar hasta que se les haya dado algún valor ¿Dónde colocamos las declaraciones? Siempre.. Declaración de variables tipo nombre.. Memoria double precio. int cantidad.. double precio. cantidad ? Se reserva espacio suficiente precio ? . precio ? int main() total ? { int cantidad.

cantidad = 12. // double total = cantidad * precio.23e‐308 .. Capacidad de las variables int ‐2..4 Concordancia de tipos: cantidad = 12.5. // Asigna 479.648 . 2. 1.23 x 10‐308 ..147. 2147483647 double 2.483.95. // int cantidad  12 precio = 39...647 ‐2147483648 .147.483.. Instrucción: termina en .79 x 10+308 y sus negativos [+|‐] 2. Luis Hernández Yáñez ¡¡¡A la izquierda del = debe ir siempre una variable!!! Fundamentos de la programación: Tipos e instrucciones I Página 97 .79e+308 Notación científica Luis Hernández Yáñez Problemas de precisión Fundamentos de la programación: Tipos e instrucciones I Página 96 Asignación de valores a las variables (operador =) variable = expresión. 1.

.Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones I Página 98 Expresiones Secuencias de operandos y operadores operando operador operando operador operando .  Luis Hernández Yáñez Unos operadores se evalúan antes que otros Fundamentos de la programación: Tipos e instrucciones I Página 99 . total = cantidad * precio * 1. total = (cantidad1 + cantidad2) * precio. Expresión A igual prioridad se evalúan de izquierda a derecha Paréntesis para forzar ciertas operaciones total = cantidad1 + cantidad2 * precio..18.

total = cantidad * precio. precio = 39. * antes que +  10 + 2 * 40. Luis Hernández Yáñez return 0. total. } Fundamentos de la programación: Tipos e instrucciones I Página 101 . cout << cantidad << " x " << precio << " = " << total << endl. int main() { int cantidad. double precio. cantidad = 12.0 total = (cantidad1 + cantidad2) * precio.0 Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones I Página 100 variables.cpp Ejemplo de uso de variables y expresiones #include <iostream> using namespace std. * y / se evalúan antes que + y ‐ total = cantidad1 + cantidad2 * precio.0  12 * 40.95.0. cantidad2 = 2.0  480.0  10 + 80.0  90. + antes que *  (10 + 2) * 40. Precedencia de los operadores cantidad1 = 10. precio = 40.

. total. precio ? int main() { total ? int cantidad. total.. double precio. Ejemplo de uso de variables Memoria #include <iostream> cantidad ? using namespace std.. precio ? int main() { total ? int cantidad. double precio.. cantidad = 12. Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones I Página 102 Ejemplo de uso de variables Memoria #include <iostream> cantidad 12 using namespace std.. . Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones I Página 103 .

precio = 39.95. cantidad = 12. Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones I Página 104 Ejemplo de uso de variables Memoria #include <iostream> cantidad 12 using namespace std. Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones I Página 105 .95 int main() { total 479.. .. precio 39. total = cantidad * precio. precio 39. total.. double precio. Ejemplo de uso de variables Memoria #include <iostream> cantidad 12 using namespace std.95. precio = 39. cantidad = 12.. . total.4 int cantidad. double precio.95 int main() { total ? int cantidad.

 total. precio = 39. cantidad = 12.4 int cantidad..95 int main() { total 479. total = cantidad * precio. cout << cantidad << " x " << precio << " = " << total << endl. precio = 39. cantidad = 12. Luis Hernández Yáñez return 0. } Fundamentos de la programación: Tipos e instrucciones I Página 107 . Ejemplo de uso de variables Memoria #include <iostream> cantidad 12 using namespace std. cout << cantidad << " x " << precio << " = " << total << endl. precio 39. .95. int main() { int cantidad. double precio. double precio.. total. total = cantidad * precio. Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones I Página 106 Ejemplo de uso de variables #include <iostream> using namespace std.95.

cantidad 12 ? .Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones I Página 108 cin (iostream) character input stream Lectura de valores de variables: operador >> (extractor) cin >> cantidad. 12 1 2 ↲ _ Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones I Página 109 .  Memoria cin >> cantidad...

95 a la variable.95.95↲ Luis Hernández Yáñez Se asigna el valor 39.  Transforma los caracteres introducidos en datos Cursor parpadeante: lugar de lectura del siguiente carácter La entrada termina con Intro (cursor a la siguiente línea) ¡El destino del extractor debe ser SIEMPRE una variable! Se ignoran los espacios en blanco iniciales Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones I Página 110 Lectura de valores enteros (int) Se leen dígitos hasta encontrar un carácter que no lo sea 12abc↲ 12 abc↲ 12   abc↲ 12↲ Se asigna el valor 12 a la variable El resto queda pendiente para la siguiente lectura Recomendación: Lee cada variable en una línea 12↲ Lectura de valores reales (double) Se leen dígitos. el punto decimal y otros dígitos 39. el resto queda pendiente Recomendación: Lee cada variable en una línea 39.95 abc↲ 39. El extractor >> cin >> variable.5abc↲ 39.95↲ Fundamentos de la programación: Tipos e instrucciones I Página 111 .

 total. cout << "Precio: " << precio << endl. cin >> precio. lee cada dato en una instrucción aparte Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones I Página 112 ¿Qué pasa si el usuario se equivoca? int cantidad. ¿Qué tiene que introducir? cout << "Introduce la cantidad: ". Luis Hernández Yáñez No se puede leer un entero  0 para cantidad y Error La lectura del precio falla: precio no toma valor (basura) Fundamentos de la programación: Tipos e instrucciones I Página 113 . cin >> cantidad. ¿Qué pasa si el usuario se equivoca? El dato no será correcto Aplicación profesional: código de comprobación y ayuda Aquí supondremos que los usuarios no se equivocan En ocasiones añadiremos comprobaciones sencillas Para evitar errores. ¡Amigable con el usuario! double precio. cout << "Cantidad: " << cantidad << endl. cout << "Introduce el precio: ".

5 para precio Lo demás queda pendiente ¡¡¡Lectura correcta!!! Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones I Página 114 División de dos números Pedir al usuario dos números y mostrarle el resultado de dividir el primero entre el segundo Algoritmo. Pedir el numerador Variable numerador (double) 2.‐ Datos / cálculos 1. ¿Qué pasa si el usuario se equivoca? 12 para cantidad No se puede leer un real  0 para precio y Error 12 para cantidad . Pedir el denominador Variable denominador (double) 3. Realizar la división. guardando el resultado Variable resultado (double) Luis Hernández Yáñez resultado = numerador / denominador 4. Mostrar el resultado Fundamentos de la programación: Tipos e instrucciones I Página 115 .5  0.

Mostrar resultado cout << resultado. Leer denominador 3. Calcular división en resultado resultado = numerador / denominador. Fundamentos de la programación: Tipos e instrucciones I Página 117 . Luis Hernández Yáñez 4. 2. 3. Entrada‐Proceso‐Salida Muchos programas se ajustan a un sencillo esquema: Declaraciones Entrada Procesamiento Salida 1. Mostrar resultado Fundamentos de la programación: Tipos e instrucciones I Página 116 División de dos números Pedir al usuario dos números y mostrarle el resultado de dividir el primero entre el segundo. 1. Leer numerador 2. Leer denominador cin >> denominador. Leer numerador cin >> numerador. Calcular división en resultado Luis Hernández Yáñez 4.

cin >> denominador.5 64. return 0.cpp #include <iostream> Numerador: _129 using namespace std. cin >> numerador. Procesamiento resultado = numerador / denominador.5 int main() _ { Declaraciones double numerador. denominador. resultado. Luis Hernández Yáñez Salida cout << "Resultado: " << resultado << endl. _ Denominador: _ 2 _ Resultado: _ 64. Entrada cout << "Denominador: ". cout << "Numerador: ". } Fundamentos de la programación: Tipos e instrucciones I Página 118 Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones I Página 119 . División de dos números división.

mostrar su área Refinamiento Mostrar en la pantalla un texto que pida la base del triángulo. cadena literal variable variable Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones I Página 121 . El usuario introducirá el valor con el teclado. El usuario introducirá la base con el teclado. El usuario introducirá el valor con el teclado. Se calculará el área del triángulo y se mostrará en la pantalla. Mostrar en la pantalla un texto que pida la altura del triángulo. Mostrar en la pantalla un texto que pida la altura del triángulo. Se calculará el área del triángulo y se mostrará en la pantalla. Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones I Página 120 Objetos: Datos que maneja el programa variable cin cout cadena literal Mostrar en la pantalla un texto que pida la base del triángulo. Problema Dadas la base y la altura de un triángulo. El usuario introducirá la altura con el teclado.

Mostrar en la pantalla un texto que pida la base del triángulo. El usuario introducirá la altura con el teclado. area = base * altura / 2 Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones I Página 123 .. Datos que maneja el programa: tipos Objeto Tipo ¿Varía? Nombre Pantalla Variable cout "Introduzca la base del triángulo: " Constante ninguno Base del triángulo double Variable base Teclado Variable cin "Introduzca la altura del triángulo: " Constante ninguno Altura del triángulo double Variable altura Área del triángulo double Variable area Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones I Página 122 Operaciones (acciones) cout << . Se calculará el área del triángulo y se mostrará en la pantalla.. Mostrar en la pantalla un texto que pida la altura del triángulo. El usuario introducirá la base con el teclado.. cin >> ..

Mostrar en la pantalla el texto que pida la base del triángulo 2. Mostrar en la pantalla el texto que pida la altura del triángulo a código 4. Secuencia de acciones que ha de realizar el programa para conseguir resolver el problema 1. Leer del teclado el valor para la base del triángulo traducido 3. Mostrar en la pantalla el texto que pida la base del triángulo Algoritmo 2. Calcular el área del triángulo 6. } Fundamentos de la programación: Tipos e instrucciones I Página 125 . int main() { Declaraciones 1. Leer del teclado el valor para la base del triángulo 3. Leer del teclado el valor para la altura del triángulo 5. Calcular el área del triángulo 6. Mostrar el área del triángulo Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones I Página 124 #include <iostream> using namespace std. Leer del teclado el valor para la altura del triángulo en C++ 5. Mostrar en la pantalla el texto que pida la altura 4. Mostrar el área del triángulo Luis Hernández Yáñez return 0.

} Recuerda: las instrucciones terminan en .                // Declaraciones cout << "Introduzca la base del triángulo: ".       // 3 cin >> altura.cpp El programa: implementación #include <iostream> using namespace std. Luis Hernández Yáñez return 0. triángulo. Fundamentos de la programación: Tipos e instrucciones I Página 126 Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones I Página 127 . ¿triβngulo? int main() { double base. altura.                                          // 2 cout << "Introduzca la altura del triángulo: ". area.         // 1 cin >> base.                                        // 4 area = base * altura / 2.                             // 5 cout << "El área de un triángulo de base " << base // 6 << " y altura " << altura << " es: " << area << endl.

141592653589 Variables Luis Hernández Yáñez base. area Identificadores Fundamentos de la programación: Tipos e instrucciones I Página 128 Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones I Página 129 . Variabilidad de los datos "Introduzca la base del triángulo: " 3.141592653589 Literales Constantes Con nombre Datos Pi = 3. altura.

 _ cantidad  prrecio total  base  altura  area numerador Luis Hernández Yáñez Al menos 32 caracteres significativos ¡Ni eñes ni vocales acentuadas! Fundamentos de la programación: Tipos e instrucciones I Página 130 Palabras reservadas del lenguaje C++ asm auto  bool  break  case  catch  char  class  const   const_cast continue  default  delete  do  double   dynamic_cast else  enum  explicit  extern  false   float  for  friend  goto if  inline  int  long   mutable  namespace  new  operator  private  protected   public  register  reinterpret_cast return  short   signed  sizeof  static  static_cast struct  switch   template  this  throw  true  try  typedef  typeid Luis Hernández Yáñez typename union  unsigned  using  virtual  void   volatile  while Fundamentos de la programación: Tipos e instrucciones I Página 131 .Z..  palabras reservadas Para variables y constantes con nombre — Nombre de un dato (para accederlo/modificarlo) — Deben ser descriptivos Sintaxis: a.Z. a.9.z.... A.z. _ 0.. A.

z.Z.9.Z. A.z.. A. a..... _ balance  interesAnual  _base_imponible  años  EDAD12  salario_1_mes  cálculoNómina  __edad  valor%100  AlgunValor  100caracteres  valor?  Luis Hernández Yáñez _12_meses  ____valor  Fundamentos de la programación: Tipos e instrucciones I Página 132 Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones I Página 133 . a. _ ¿Qué identificadores son válidos? 0.

‐3. de un tipo concreto 'a' 3. 49  Números reales 12. ausencia de dato (funciones) Fundamentos de la programación: Tipos e instrucciones I Página 135 .14159 Cada tipo establece: "Hola" — El conjunto (intervalo) de valores válidos — El conjunto de operaciones que se pueden realizar Expresiones con datos de distintos tipos (compatibles): Transformación automática de tipos (promoción de tipo) Luis Hernández Yáñez Anexo del Tema 2: detalles técnicos Fundamentos de la programación: Tipos e instrucciones I Página 134 int Números enteros (sin decimales) float 1363. 1. ausencia de tipo.45. '\t' bool Valores lógicos (verdadero/falso) true. '{'.16E+02 double Números reales (mayores intervalo y precisión) char  Caracteres 'a' . ‐12. false string Cadenas de caracteres (biblioteca string) "Hola Mundo!" Luis Hernández Yáñez void Nada.1932. Tipos 125 true Cada dato.

127) Fundamentos de la programación: Tipos e instrucciones I Página 136 Valores lógicos Sólo dos valores posibles: — Verdadero (true) — Falso (false) Literales: true   false Cualquier número distinto de 0 es equivalente a true El 0 es equivalente a false Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones I Página 137 .255) ASCII (códigos 32... Caracteres Intervalo de valores: Juego de caracteres (ASCII) 1 byte Literales: 'a'   '%'   '\t' Constantes de barra invertida (o secuencias de escape): Caracteres de control '\t' = tabulador '\n' = salto de línea … ISO‐8859‐1 Luis Hernández Yáñez (ASCII extendido: códigos 128.

INT o inT no son palabras reservadas de C++ true: palabra reservada de C++ para el valor verdadero True o TRUE no son palabras reservadas de C++ Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones I Página 138 Cadenas de caracteres "Hola"  "Introduce el numerador: "  "X142FG5TX?%A" " " char Secuencias de caracteres Programas con variables de tipo string: #include <string> using namespace std. C++ distingue entre mayúsculas y minúsculas int: palabra reservada de C++ para declarar datos enteros Int. Las comillas tipográficas (apertura/cierre) “…” NO sirven Luis Hernández Yáñez Asegúrate de utilizar comillas rectas: "…" Fundamentos de la programación: Tipos e instrucciones I Página 139 .

2147483647 unsigned long int 0 . cout << "Booleano: " << cierto << endl. cout << "Entero: " << entero << endl. 4294967295 +|‐ 2. tipos.23e‐308 .37E‐4932 ..cpp #include <iostream> #include <string> using namespace std. bool cierto = true. para ambas bibliotecas int main() { int entero = 3. cout << "Carácter: " << caracter << endl. return 0. char caracter = 'a'.. // Un solo using. ¿Cuántos números hay en total en el programa? } ¿Y caracteres? ¿Y cadenas? ¿Y booleanos? Fundamentos de la programación: Tipos e instrucciones I Página 140 — signed / unsigned : con signo (por defecto) / sin signo — short / long : menor / mayor intervalo de valores Tipo Intervalo int ‐2147483648 ... 1. 32768 unsigned short int 0 .79e+308 Luis Hernández Yáñez double long double +|‐ 3.. 65535 long int ‐2147483648 . cout << "Real: " << real << endl.18E+4932 Fundamentos de la programación: Tipos e instrucciones I Página 141 .. Luis Hernández Yáñez cout << "Cadena: " << cadena << endl.153. string cadena = "Hola".. 1. 4294967295 short int ‐32768 .. // Podemos asignar (inicializar) al declarar double real = 2... 2147483647 unsigned int 0 .

short int unidades.Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones I Página 142 [modificadores] tipo lista_de_variables. j. . Programación con buen estilo: Identificadores descriptivos Espacio tras cada coma Luis Hernández Yáñez Nombres de las variables en minúsculas (Varias palabras: capitaliza cada inicial: interesPorMes) Fundamentos de la programación: Tipos e instrucciones I Página 143 . Opcional lista_de_variables Identificador int i. l. double balance. unsigned short int monedas. beneficio. perdida.

 . Luis Hernández Yáñez En particular. . Memoria 01 short int unidades. inicio 02 03 double balance. Se reserva memoria suficiente para cada tipo de dato int inicio. j. una expresión  short int unidades = 100. l = 26. puede ser un literal Fundamentos de la programación: Tipos e instrucciones I Página 145 . 04 05 unidades 06 07 balance 08 09 10 11 12 13 Luis Hernández Yáñez 14 15 . Fundamentos de la programación: Tipos e instrucciones I Página 144 ¡En C++ las variables no se inicializan automáticamente! ¡Una variable debe ser haber sido inicializada antes de ser accedida! ¿Cómo se inicializa una variable? — Al leer su valor (cin >>) — Al asignarle un valor (instrucción de asignación) — Al declararla Inicialización en la propia declaración: … Identificador = Expresión Expresión: valor compatible int i = 0.

cout << interesPorMes * meses / 100. Modificación del valor de una variable  Nombre de la variable a la izquierda del = balance = 1214. Las variables han de haber sido previamente declaradas Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones I Página 146 Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones I Página 147 . Obtención del valor de una variable  Nombre de la variable en una expresión cout << balance. porcentaje = valor / 30.

 // i toma el valor 33 Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones I Página 148 Errores int a.   // ERROR: un entero no puede guardar una cadena c = 23 5. 5 = a. i = 23 + j * 5.       // ERROR: un literal no puede recibir un valor a + 23 = 5.  // ERROR: no puede haber una expresión a la izda. c. j = 2. A la izquierda. b = "abc". SIEMPRE una variable int i.   // ERROR: expresión no válida (falta operador) Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones I Página 149 . b. El operador = Variable = Expresión .

b 3. aux.45 aux 3. Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones I Página 150 Necesitamos una variable auxiliar double a = 3.45 b 127. . b 127.45 Fundamentos de la programación: Tipos e instrucciones I Página 151 .45. .5 a = b.45 a 3. .45 a 127. b = 127. Memoria Memoria 01 01 i i 02 03 04 ? 23 + 2 * 5 02 03 04 33 05 05 j j 2 2 06 06 07 07 08 08 09 09 10 10 .5 aux ? aux 3. . .45 a 127.5 aux = a. i = 23 + j * 5. a 3. j = 2. b 127.5 Luis Hernández Yáñez b = aux.5 aux 3. int i.5.

. igual.) Fundamentos de la programación: Tipos e instrucciones I Página 153 .. O. mayor..Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones I Página 152 Operaciones sobre valores de los tipos Cada tipo determina las operaciones posibles Tipos de datos numéricos (int. .) Tipo de datos bool: — Asignación (=) — Operadores lógicos (Y.. NO) Tipos de datos char y string: Luis Hernández Yáñez — Asignación (=) — Operadores relacionales (menor. igual. mayor. float y double): — Asignación (=) — Operadores aritméticos — Operadores relacionales (menor. .

Operadores para tipos de datos numéricos Operador Operandos Posición int float / double ‐ 1 (monario) Prefijo Cambio de signo + 2 (binario) Infijo Suma ‐ 2 (binario) Infijo Resta * 2 (binario) Infijo Producto / 2 (binario) Infijo Div. constante o expresión entre paréntesis ‐saldo     ‐RATIO     ‐(3 * a ‐ b) — Incremento/decremento (sólo variables) (prefijo/postfijo): ++interes ‐‐meses     j++ // 1 más ó 1 menos Operadores binarios — Operando izquierdo operador operando derecho Operandos: literales. constantes. variables o expresiones Luis Hernández Yáñez 2 + 3 a * RATIO     ‐a + b (a % b) * (c / d) Fundamentos de la programación: Tipos e instrucciones I Página 155 . entera División real % 2 (binario) Infijo Módulo No aplicable ++ 1 (monario) Prefijo / postfijo Incremento ‐‐ 1 (monario) Prefijo / postfijo Decremento Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones I Página 154 Operadores monarios y operadores binarios Operadores monarios (unarios) — Cambio de signo (‐): Delante de variable.

cout << i % j.5 Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones I Página 156 Módulo (resto de la división entera) % Ambos operandos han de ser enteros int i = 123. // Muestra 3 División entera: No se obtienen decimales  Queda un resto 123 5 3 24 Luis Hernández Yáñez 123 % 5 Fundamentos de la programación: Tipos e instrucciones I Página 157 . j = 5. cout << i / j. double j = 2. // Muestra 11 Algún operando real: división real int i = 23. cout << i / j. // Muestra 11. ¿División entera o división real? / Ambos operandos enteros: división entera int i = 23. j = 2.

 entero2 = 4. cout << "Operaciones entre los números 15 y 4:" << endl.0. cout << i << " ‐ " << j. real1 = ‐real1. cout << "Resto de la división (%): " << entero1 % entero2 << endl. i=i+1. cout << "Vuelve a cambiar (‐): " << real1 << endl. cout << "Num = " << real1 << endl. j=i.cpp using namespace std. return 0. j = i++. cout << "Cambia de signo (‐): " << real1 << endl. cout << "Ya incrementado: " << real1 << endl. // Muestra 11 ‐ 11 Postfijo: Después de acceder int i = 10. cout << "Se incrementa antes (++ prefijo): " << ++real1 << endl. // Copia y después incrementa i=i+1. // Incrementa antes de copiar j=i. } Fundamentos de la programación: Tipos e instrucciones I Página 159 . // Muestra 11 ‐ 10 Luis Hernández Yáñez No mezcles ++ y ‐‐ con otros operadores Fundamentos de la programación: Tipos e instrucciones I Página 158 #include <iostream> operadores. real1 = ‐real1. j. cout << i << " ‐ " << j. int main() { int entero1 = 15. cout << "División entera (/): " << entero1 / entero2 << endl. real2 = 4. j. Operadores de incremento y decremento ++/‐‐ Incremento/decremento de la variable numérica en una unidad Prefijo: Antes de acceder int i = 10. cout << "Se muestra antes de incrementar (posfijo ++): "  Luis Hernández Yáñez << real1++ << endl. double real1 = 15. j = ++i.0. cout << "División real (/): " << real1 / real2 << endl.

de izquierda a derecha Luis Hernández Yáñez Paréntesis: fuerzan a evaluar su subexpresión Fundamentos de la programación: Tipos e instrucciones I Página 161 .Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones I Página 160 ¿En qué orden se evalúan los operadores? 3 + 5 * 2 / 2 ‐ 1 ¿De izquierda a derecha? ¿De derecha a izquierda? ¿Unos antes que otros? Precedencia de los operadores (prioridad): Se evalúan antes los de mayor precedencia ¿Y si tienen igual prioridad? Normalmente.

los paréntesis. * antes que ‐ (8 * 4 + 12) / 4 ‐ (6 ‐ 1) * antes que + (32 + 12) / 4 ‐ 5 44 / 4 ‐ 5 / antes que ‐ 11 ‐ 5 Pon espacio antes y después de cada operador binario Luis Hernández Yáñez 6 Fundamentos de la programación: Tipos e instrucciones I Página 163 ... Precedencia Operadores Mayor prioridad ++ ‐‐ (postfijos) ++ ‐‐ (prefijos) ‐ (cambio de signo) * / % Menor prioridad + ‐ 3 + 5 * 2 / 2 ‐ 1  3 + 10 / 2 ‐ 1  3 + 5 ‐ 1  8 ‐ 1  7 Misma precedencia: Mayor Misma precedencia: Luis Hernández Yáñez Izquierda antes precedencia Izquierda antes Fundamentos de la programación: Tipos e instrucciones I Página 162 ((3 + 5) * 4 + 12) / 4 ‐ (3 * 2 ‐ 1) Primero.

De momento. return 0. que la asignación a = a ‐ 5. f = 3 * x * x / 5 + 6 * x / 7 ‐ 3. Fundamentos de la programación: Tipos e instrucciones I Página 165 . a /= 37. cout << "Introduce el valor de X: ". Igual precedencia a = a * 3. Asignación Abreviatura a = a + 12. int main() { double x. a %= b. a ‐= 5. cout << "f(x) = " << f << endl. f. mejor evitarlas Luis Hernández Yáñez a = a % b. Fundamentos de la programación: Tipos e instrucciones I Página 164 variable = variable operador op_derecho. fórmula. cin >> x. } Luis Hernández Yáñez Usa paréntesis para mejorar la legibilidad: f = (3 * x * x / 5) + (6 * x / 7) ‐ 3. a = a / 37.cpp #include <iostream> using namespace std. La misma  variable operador= op_derecho. a += 12. a *= 3.

¿Valor siguiente al máximo? Valor mayor del máximo (o menor del mínimo) del tipo short int i = 32767. // 32768 no cabe en un short int cout << i. // Valor máximo para short int i++. // Muestra ‐32768 Bit de signo 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 32767 0 = positivo + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 + 1 1 = negativo 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ‐32768 Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones I Página 166 Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones I Página 167 .

const int IVA = 18.141592. Programación con buen estilo: Luis Hernández Yáñez Pon en mayúscula la primera letra de una constante o todo su nombre Fundamentos de la programación: Tipos e instrucciones I Página 168  Aumentan la legibilidad del código cambioPoblacion = (0. cout << total << " (IVA: " << 18 << "%)" << endl. vs. double compra2 = bruto2 * IVA / 100. Fundamentos de la programación: Tipos e instrucciones I Página 169 . 1 cambio Luis Hernández Yáñez double total = compra1 + compra2. aparecer a la izquierda de un = RATIO = 2. cout << total << " (IVA: " << IVA << "%)" << endl.1758 ‐ 0.1257) * poblacion. ¿Cambio del IVA al 21%? double compra1 = bruto1 * IVA / 100. Declaración de constantes Modificador de acceso const Variables inicializadas a las que no dejamos variar const Declaración de variable con inicializador const short int Meses = 12. 3 cambios double total = compra1 + compra2. cambioPoblacion = (RatioNacimientos ‐ RatioMuertes) * poblacion.179 * Pi.  Facilitan la modificación del código double compra1 = bruto1 * 18 / 100. La constante no podrá volver a const double Pi = 3. double compra2 = bruto2 * 18 / 100.

95. neto. double radio = 12. int main() { const double Pi = 3. Luis Hernández Yáñez total = neto + porIVA. cout << "Circunferencia de un círculo de radio "  << radio << ": " << circunferencia << endl. porIVA = neto * IVA / 100.cpp #include <iostream> using namespace std. cout << "Total compra: " << total << endl. total.2. const int IVA = 21. double precio = 39. porIVA. circunferencia. neto = cantidad * precio. return 0. // Número e cout << "Número e al cuadrado: " << Euler * Euler << endl. constantes. const double Euler = 2. circunferencia = 2 * Pi * radio. int cantidad = 12.141592. } Fundamentos de la programación: Tipos e instrucciones I Página 170 Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones I Página 171 .718281828459.

#include <cmath> Algunas . return 0. y) x elevado a y sqrt(x) Raíz cuadrada de x ceil(x) Menor entero que es mayor o igual que x floor(x) Mayor entero que es menor o igual que x exp(x) ex log(x) Ln x (logaritmo natural de x) log10(x) Logaritmo en base 10 de x sin(x) Seno de x cos(x) Coseno de x Tangente de x Luis Hernández Yáñez tan(x) round(x) Redondeo al entero más próximo trunc(x) Pérdida de la parte decimal (entero) Fundamentos de la programación: Tipos e instrucciones I Página 172 mates. Luis Hernández Yáñez } Pon un espacio detrás de cada coma en las listas de argumentos Fundamentos de la programación: Tipos e instrucciones I Página 173 . 3) / pow(y. abs(x) Valor absoluto de x pow(x. pow(double(i).. #include <cmath> int main() { double x. 5) cout << "Valor de Y: ". f. 2)) / abs(x * y) ‐ cos(y). cin >> y. Usa el molde double(): cin >> x.. y) = " << f << endl. f = 2 * pow(x. cout << "f(x. 5) + sqrt(pow(x.cpp #include <iostream> using namespace std. y. pow() con argumento entero: cout << "Valor de X: ".

++/‐‐ y operadores relacionales Funciones para caracteres (biblioteca cctype) isalnum(c) true si c es una letra o un dígito isalpha(c) true si c es una letra isdigit(c) true si c es un dígito islower(c) true si c es una letra minúscula isupper(c) true si c es una letra mayúscula false en caso contrario toupper(c) devuelve la mayúscula de c Luis Hernández Yáñez tolower(c) devuelve la minúscula de c … Fundamentos de la programación: Tipos e instrucciones I Página 175 .Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones I Página 174 char Asignación.

cout << "Mayúscula? " << isupper(caracter1) << endl. } 1  true / 0  false Fundamentos de la programación: Tipos e instrucciones I Página 176 Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones I Página 177 . cout << "En minúscula: " << caracter1 << endl. cout << "Alfanumérico? " << isalnum(caracter1) << endl. cout << "Alfanumérico? " << isalnum(caracter3) << endl.‐" << endl. return 0. caracter2 = '1'.. cout << "Carácter 3 (" << caracter3 << ").‐" << endl. caracteres. cout << "Dígito? " << isdigit(caracter2) << endl. cout << "Alfabético? " << isalpha(caracter1) << endl. caracter3 = '&'.cpp . cout << "Alfabético? " << isalpha(caracter2) << endl. cout << "Dígito? " << isdigit(caracter1) << endl.‐" << endl.. #include <cctype> int main() { char caracter1 = 'A'. cout << "Carácter 2 (" << caracter2 << "). Luis Hernández Yáñez cout << "Alfabético? " << isalpha(caracter3) << endl. cout << "Dígito? " << isdigit(caracter3) << endl. cout << "Carácter 1 (" << caracter1 << "). caracter1 = tolower(caracter1).

             // 2 != 3  true resultado = a * b > c + 5.              // 2 < 5  true resultado = a * b + c >= 12.      // 6 > 9  false resultado = a + b == c + 1.. c = 4.     // 5 == 5  true No confundas el operador de igualdad (==) Luis Hernández Yáñez con el operador de asignación (=) Fundamentos de la programación: Tipos e instrucciones I Página 179 . <= menor o igual que * / % > mayor que + ‐ >= mayor o igual que Luis Hernández Yáñez < <= > >= == igual que == != != distinto de = += ‐= *= /= %= Fundamentos de la programación: Tipos e instrucciones I Página 178 Menor prioridad que los operadores aditivos y multiplicativos bool resultado.    // 10 >= 12  false resultado = a * (b + c) >= 12.. int a = 2. resultado = a < 5.  // 14 >= 12  true resultado = a != b. Operadores relacionales Comparaciones (condiciones) Condición simple ::= Expresión Operador_relacional Expresión Concordancia de tipo entre las expresiones Resultado: bool (true o false) Operadores (prioridad) < menor que . b = 3.

} Fundamentos de la programación: Tipos e instrucciones I Página 181 . if (num % 2 == 0) { cout << num << " es par". Luis Hernández Yáñez } else { cout << num << " es impar".Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones I Página 180 Selección: bifurcación condicional if (condición) { true false códigoT Condición } códigoT códigoF else { códigoF int num. } cout << "Número: ". Opcional: puede no haber else cin >> num.

 op2 = 4. Luis Hernández Yáñez } return 0. cout << "2 ‐ Restar" << endl. if (opcion == 1) { cout << op1 + op2 << endl. } else { cout << op1 ‐ op2 << endl. cin >> opcion. int opcion. } Fundamentos de la programación: Tipos e instrucciones I Página 182 Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones I Página 183 . selección.cpp #include <iostream> using namespace std. cout << "1 ‐ Sumar" << endl. int main() { int op1 = 13. cout << "Opción: ".

cout << "Positivo". } if (num > 0)  { cout << "Positivo".. No necesitamos las llaves si sólo hay una instrucción if (num > 0) { if (num > 0) cout << "Positivo". } Luis Hernández Yáñez Usaremos siempre llaves por simplicidad. Evita poner el if y la instrucción objetivo en la misma línea: if (num > 0) cout << "Positivo". (declaraciones locales) Luis Hernández Yáñez } cout << endl. Ámbito local total = total + num.  cout << "Positivo".. total = total + num. } } cout << endl. . Fundamentos de la programación: Tipos e instrucciones I Página 185 . cout << endl... Fundamentos de la programación: Tipos e instrucciones I Página 184 Posición de las llaves: cuestión de estilo if (num > 0) if (num > 0) { { cout << "Positivo". Agrupación de instrucciones Grupo de instrucciones a ejecutar en una rama del if { instrucción } { intrucción1 Tab ó intrucción2 3 esp. int num. intrucciónN cin >> num. total = total + num. total = 0.

Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones I Página 186 Repetición o iteración condicional while ( condición ) cuerpo Bloque de código true false Condición while (condición) { Cuerpo cuerpo } Luis Hernández Yáñez Si la condición es false al empezar. no se ejecuta el cuerpo ninguna vez Fundamentos de la programación: Tipos e instrucciones I Página 187 .

} while (i <= n) { suma = suma + i. } n 5 i 6 2 3 4 5 1 true false suma 15 10 1 3 60 i <= n suma += i. } cout << "Sumatorio de i (1 a " << n << ") = "  Luis Hernández Yáñez << suma << endl. } Fundamentos de la programación: Tipos e instrucciones I Página 188 Iteración condicional while (i <= n) { suma = suma + i. Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones I Página 189 .cpp #include <iostream> using namespace std. while (n <= 0) { // Sólo n positivo cout << "¿Cuántos números quieres sumar? ". cin >> n. i++. return 0. serie. n = 0. int main() { int i = 1. i++. i++. suma = 0.

3 5 1 Programa 1 6 = l a t o T Biblioteca iostream con espacio de nombres std Luis Hernández Yáñez Extractor Flujo de entrada >> Variable Insertor Flujo de salida << Expresión Fundamentos de la programación: Tipos e instrucciones I Página 191 .Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones I Página 190 #include <iostream> Flujos de texto (streams) using namespace std. Conectan la ejecución 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 cout 7 3 5 .

cin >> cadena termina con el primer espacio en blanco cin.. cout << "Nombre completo: " cin >> apellidos.. cin >> edad.. cout << "Nombre: ". string nombre. Fundamentos de la programación: Tipos e instrucciones I Página 193 . cout << "Apellidos: ". cin >> nombre. se asigna true. cout << "Nombre: ". cin >> nombre. cout << "Apellidos: ".sync() descarta la entrada pendiente string nombre.sync(). Fundamentos de la programación: Tipos e instrucciones I Página 192 #include <string> using namespace std. cin. cin >> Variable Salta los espacios en blanco (espacios. << nombre << " " cout << . con cualquier otro valor se asigna false Se amigable con el usuario Lee cada dato en una línea Luis Hernández Yáñez cout << "Introduce tu edad: ". apellidos. apellidos recibe "Antonio" Luis Hernández Yáñez ¿Cómo leer varias palabras? Siguiente página. tabuladores o saltos de línea) — char Se lee un carácter en la variable — int Se leen dígitos y se transforman en el valor a asignar — float/double: Se leen dígitos (quizá el punto y más dígitos) y se asigna el valor — bool: Si se lee 1. apellidos. << apellidos << endl.. cin >> apellidos.

Lee todo lo que haya hasta el final de la línea (Intro) Luis Hernández Yáñez Recuerda: Espacios en blanco son espacios. d 123.. cout << "Total: " << 123.función(argumentos) Lectura de un carácter sin saltar espacios en blanco: cin. 5 4 .. Fundamentos de la programación: Tipos e instrucciones I Página 194 cout << Expresión Representación textual de los datos int meses = 7. cad). 3 2 1 La biblioteca iostream Luis Hernández Yáñez define la constante endl ¡Un texto! como un salto de línea (secuencia de caracteres) Fundamentos de la programación: Tipos e instrucciones I Página 195 . El valor double 123. Lectura sin saltar los espacios en blanco iniciales Llamada a funciones con el operador punto (. .45 << endl << " Meses: " << meses.get(c).45 ¡Un número real! cout << d.' '4' '5' double d = 123.) : El operador punto permite llamar a una función sobre una variable variable.45. tabuladores. // Lee el siguiente carácter Lectura de cadenas sin saltar los espacios en blanco: getline(cin. saltos de línea.45 se guarda en memoria en binario Su representación textual es:'1' '2' '3' '.

nº de decimales Luis Hernández Yáñez *setw() sólo afecta al siguiente dato que se escriba. cout        << " Meses: " << meses. cout << "Total: " << 123.5) scientific Notación científica (reales) (1. cout << Expresión T o t a l : 1 2 3 . mientras que los otros afectan a todos Fundamentos de la programación: Tipos e instrucciones I Página 197 .45 << endl << " Meses: " << meses. 4 5  M e s e s : 7 Programa cout int meses = 7.235E+2) boolalpha Valores bool como true / false left / right Ajustar a la izquierda/derecha (por defecto) iomanip setw(anchura)* Nº de caracteres (anchura) para el dato Precisión: Nº de dígitos (en total) setprecision(p) Con fixed o scientific.45 << endl << " Meses: " << meses. cout        << endl << " Meses: " << meses. Fundamentos de la programación: Tipos e instrucciones I Página 196 #include <iomanip> Constantes y funciones a enviar a cout para ajustar el formato de salida Biblioteca Constante/función Propósito showpoint / Mostrar o no el punto decimal para reales sin iostream noshowpoint decimales (34.45 Luis Hernández Yáñez Meses: 7 cout           << meses.0) fixed Notación de punto fijo (reales) (123. Total: 123. cout       << 123.

0000 Luis Hernández Yáñez cout << scientific << d << endl. int i = 62. bool fin = false. cout << e << " ‐ " << showpoint << e << endl.45. |  123. 123. |123. 123. |   62| double e = 96. cout << d << c << i << endl.45  | cout << "|" << setw(4) << c << "|" << endl. 0‐>false double d = 123. |x   | cout << "|" << right << setw(5) << i << "|" << endl. 96 ‐ 96.45x62 cout << "|" << setw(8) << d << "|" << endl.45| cout << "|" << left << setw(8) << d << "|" << endl.234500e+002 cout << fixed << setprecision(8) << d << endl. cout << fin << "‐>" << boolalpha << fin << endl. char c = 'x'.45000000 Fundamentos de la programación: Tipos e instrucciones I Página 198 Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones I Página 199 . 1.

 3) / pow(y. 2)) / abs(x * y) ‐ cos(y). // Instrucciones: resultado = 2 * pow(x. 5) + sqrt(pow(x. Luis Hernández Yáñez return resultado. int y) { // Declaración de datos locales: double resultado. Los programas pueden incluir otras funciones además de main() Forma general de una función en C++: tipo nombre(parámetros) // Cabecera { // Cuerpo }  Tipo de dato que devuelve la función como resultado  Parámetros para proporcionar datos a la función Declaraciones de variables separadas por comas  Cuerpo: secuencia de declaraciones e instrucciones ¡Un bloque de código! Luis Hernández Yáñez Fundamentos de programación: Tipos e instrucciones I Página 200  Datos locales: declarados en el cuerpo de la función Datos auxiliares que utiliza la función (puede no haber)  Parámetros: declarados en la cabecera de la función Datos de entrada de la función (puede no haber) Ambos son de uso exclusivo de la función y no se conocen fuera double f(int x. // Devolución del resultado } Fundamentos de programación: Tipos e instrucciones I Página 201 .

.0 . Fundamentos de programación: Tipos e instrucciones I Página 202 Se copian los argumentos en los parámetros int funcion(int x..O. double  d = 3.. double a) { Memoria .0 . 33 * d). a 99.. x 124 funcion(i.. Luis Hernández Yáñez return 0..... // main() devuelve 0 al S. } Los argumentos no se modifican Fundamentos de programación: Tipos e instrucciones I Página 203 . int main() { int i = 124. .  i 124 } d 3. Llamada a una función con parámetros Nombre(Argumentos) Al llamar a la función: — Tantos argumentos entre los paréntesis como parámetros — Orden de declaración de los parámetros — Cada argumento: mismo tipo que su parámetro — Cada argumento: expresión válida (se pasa el resultado) Se copian los valores resultantes de las expresiones en los correspondientes parámetros Llamadas a la función: en expresiones de otras funciones Luis Hernández Yáñez int valor = f(2.. 3)..

cout << 2 * cuad(16). La función ha de devolver un resultado La función termina su ejecución devolviendo un resultado La instrucción return (sólo una en cada función) — Devuelve el dato que se pone a continuación (tipo de la función) — Termina la ejecución de la función El dato devuelto sustituye a la llamada de la función: int cuad(int x) { int main() { return x * x. Luis Hernández Yáñez } return 0. . int y). 256 Esta instrucción } no se ejecutará nunca Fundamentos de programación: Tipos e instrucciones I Página 204 ¿Qué funciones hay en el programa? Colocaremos las funciones después de main() ¿Son correctas las llamadas a funciones del programa? — ¿Existe la función? — ¿Concuerdan los argumentos con los parámetros?  Prototipos tras las inclusiones de bibliotecas Prototipo de función: Cabecera de la función terminada en . double f(int x. int funcion(int x. x = x * x... main() es la única función que no hay que prototipar Fundamentos de programación: Tipos e instrucciones I Página 205 . double a)  Luis Hernández Yáñez int cuad(int x).

 int y). y) = " << formula(x. sum... } cout << endl. cin >> caracter. cout << "Entero: ". } cout << "Carácter: ". } . bool letra(char car). #include <iostream> using namespace std. #include <cmath> // Prototipos de las funciones (excepto main()) bool par(int num). // Los argumentos pueden llamarse igual o no que los parámetros Luis Hernández Yáñez return 0. Luis Hernández Yáñez if (par(numero)) { cout << "Par". Fundamentos de programación: Tipos e instrucciones I Página 206 else { cout << "Impar". if (numero > 1) { cout << "Sumatorio de 1 a " << numero << ": " << suma(numero) << endl. y.. x. cin >> numero. if (!letra(caracter)) { cout << "no ". int main() { int numero. } cout << "es una letra" << endl. Fundamentos de programación: Tipos e instrucciones I Página 207 .. int suma(int num). double f. y) << endl. double formula(int x. } . char caracter. cout << "f(x.

. } return esLetra. // Implementación de las funciones propias bool par(int num) { bool esPar... Fundamentos de programación: Tipos e instrucciones I Página 209 . } int suma(int num) { int sum = 0. i++. while (i < num) { sum = sum + i.. Fundamentos de programación: Tipos e instrucciones I Página 208 bool letra(char car) { bool esLetra. i = 1. } else { esPar = false. } return esPar. } Luis Hernández Yáñez . Luis Hernández Yáñez } return sum. if ((car >= 'a') && (car <= 'z') || (car >= 'A') && (car <= 'Z')) { esLetra = true. } . if (num % 2 == 0) { esPar = true. } else { esLetra = false.

return f. 2))  / abs(x * y) ‐ cos(y). Fundamentos de la programación: Tipos e instrucciones I Página 211 . f = 2 * pow(x. } Luis Hernández Yáñez Fundamentos de programación: Tipos e instrucciones I Página 210 Licencia CC (Creative Commons) Este tipo de licencias ofrecen algunos derechos a terceras personas bajo ciertas condiciones. Compartir igual (Share alike): La explotación autorizada incluye la creación de obras derivadas siempre que mantengan la misma licencia al ser divulgadas. funciones. No comercial (Non commercial): La explotación de la obra queda limitada a usos no comerciales. Este documento tiene establecidas las siguientes: Reconocimiento (Attribution): En cualquier explotación de la obra autorizada por la licencia hará falta reconocer la autoría. Luis Hernández Yáñez Pulsa en la imagen de arriba a la derecha para saber más.cpp double formula(int x. int y) { double f. 3) / pow(y. 5) + sqrt(pow(x.

Fundamentos de la programación 2A Grado en Ingeniería Informática Grado en Ingeniería del Software Grado en Ingeniería de Computadores Luis Hernández Yáñez Facultad de Informática Universidad Complutense int 214 float 216 Notación científica 217 double 218 char 220 bool 221 string 222 Literales con especificación de tipo 223 Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones I (Anexo) .

9 09 . 1. E. F 0x1F = 31 en notación decimal 1F = 1 x 161 + F x 160 = 1 x 16 + 15 0xAD = 173 en notación decimal Luis Hernández Yáñez AD = A x 161 + D x 160 = 10 x 16 + 13 = 160 + 13 Fundamentos de la programación: Tipos e instrucciones I (Anexo) Página 215 .7 Luis Hernández Yáñez Notación hexadecimal x 0...F Fundamentos de la programación: Tipos e instrucciones I (Anexo) Página 214 Números enteros Números en notación octal (base 8: dígitos entre 0 y 7): ‐010 = ‐8 en notación decimal 10 = 1 x 81 + 0 x 80 = 1 x 8 + 0 0423 = 275 en notación decimal 423 = 4 x 82 + 2 x 81 + 3 x 80 = 4 x 64 + 2 x 8 + 3 = 256 + 16 +3 Números en notación hexadecimal (base 16): Dígitos posibles: 0. 9. Números enteros Intervalo de valores: ‐2147483648 . D.. 0x1A se usan con la función 04 sizeof(int) 05 06 + 07 0. 4. 2147483647 Bytes de memoria: 4* (*) Depende de la máquina 01 4 bytes es lo más habitual 02 Literales: Se puede saber cuántos 03 1363.. B. . 2. 010 . 6.A.. 5. 7. ‐12. 8. Notación octal 0 0. C. . 3. A.9..9 08 ‐ 0.

333.9 . Precisión: 7 dígitos 02 03 Literales (punto decimal): 04  Notación normal: 134.  Notación científica: 1.. 3. 0. seguido del exponente (potencia de 10): ‐5.0 7. Números reales (con decimales) Intervalo de valores: +/‐ 1.00074523 ‐3.9 e..4E2.4523e‐04  7.E 0.9 .23 x 10‐2  ‐0.3333 x 106  ‐3.23e‐02 Luis Hernández Yáñez + + 0.300 Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones I (Anexo) Página 217 .18e‐38 .45.3333e+06  ‐3.9 09 ‐ . ‐1.11 x 102  111.40e+38 Bytes de memoria: 4* (*) sizeof(float) 01 Punto flotante. ‐5. .. 0.4523 x 10‐4  0.23e‐2  ‐5..11e2  1... .9 ‐ ‐ Fundamentos de la programación: Tipos e instrucciones I (Anexo) Página 216 Siempre un número (con o sin signo) con un solo dígito de parte entera.1764 05 06 07 + 08 0.0523 1.

1764 05 06 07 + 08 0. 0.9 . . t.4E2.23e‐02 Luis Hernández Yáñez + + 0.79e+308 Bytes de memoria: 8* (*) sizeof(double) 01 Punto flotante. b.. Precisión: 15 dígitos 02 03 Literales (punto decimal): 04  Notación normal: 134...9 09 ‐ . ‐5.9 e. '\t' 04 Constantes de barra invertida: 05 (O secuencias de escape) 06 Para caracteres de control 07 08 '\t' = tabulador. … 09 . '\n' = salto de línea. f. . r. '%'.45. v. 1. a. .  Notación científica: 1.9 .9 ‐ ‐ Fundamentos de la programación: Tipos e instrucciones I (Anexo) Página 218 Caracteres Intervalo de valores: Juego de caracteres (ASCII) Bytes de memoria: 1 (FC) 01 Literales: 02 03 'a'.23e‐308 . \ ' ' Luis Hernández Yáñez Carácter Fundamentos de la programación: Tipos e instrucciones I (Anexo) Página 219 . Números reales (con decimales) Intervalo de valores: +/‐ 2.E 0.... . 0. \ n. ‐1.

. cualquier número 07 distinto de 0 es equivalente a true 08 09 y el número 0 es equivalente a false . UNICODE.. false 06 En realidad. Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones I (Anexo) Página 221 . salto de línea... . Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones I (Anexo) Página 220 Valores lógicos Sólo dos valores posibles: — Verdadero (true) — Falso (false) 01 02 Bytes de memoria: 1 (FC) 03 Literales: 04 05 true. — Caracteres imprimibles: Códigos del 32 al 126 Juego de caracteres ASCII extendido (8 bits): ISO‐8859‐1 Multitud de codificaciones: + Códigos entre 128 y 255 EBCDIC. UTF‐8. . . Juego de caracteres ASCII: American Standard Code for Information Interchange (1963) Caracteres con códigos entre 0 y 127 (7 bits) — Caracteres de control: Códigos del 0 al 31 y 127 Tabulación..

Asegúrate de utilizar comillas rectas: "…" Fundamentos de la programación: Tipos e instrucciones I (Anexo) Página 222 Por defecto un literal entero se considera un dato int — long int: 35L. ¡Ojo! Luis Hernández Yáñez Las comillas tipográficas (apertura/cierre) “…” te darán problemas al compilar. 15. 15. 1546ul Por defecto un literal real se considera un dato double — float: 1. "Introduce el numerador: ". 1546l — unsigned int: 35U. "X142FG5TX?%A" " Carácter " 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> using namespace std.35L.46f — long double: 1. Cadenas de caracteres "Hola".35F.46l Abreviaturas para modificadores de tipos short  short int long  long int Es preferible evitar el uso de tales abreviaturas: Luis Hernández Yáñez Minimizar la cantidad de información a recordar sobre el lenguaje Fundamentos de la programación: Tipos e instrucciones I (Anexo) Página 223 . 1546u — unsigned long int: 35UL.

Fundamentos de la programación: Tipos e instrucciones I (Anexo) Página 224 . Luis Hernández Yáñez Pulsa en la imagen de arriba a la derecha para saber más. Compartir igual (Share alike): La explotación autorizada incluye la creación de obras derivadas siempre que mantengan la misma licencia al ser divulgadas. Licencia CC (Creative Commons) Este tipo de licencias ofrecen algunos derechos a terceras personas bajo ciertas condiciones. No comercial (Non commercial): La explotación de la obra queda limitada a usos no comerciales. Este documento tiene establecidas las siguientes: Reconocimiento (Attribution): En cualquier explotación de la obra autorizada por la licencia hará falta reconocer la autoría.

 valores y variables 227 El bucle for 321 Conversión de tipos 232 Bucles anidados 331 Tipos declarados por el usuario 236 Ámbito y visibilidad 339 Tipos enumerados 238 Secuencias 349 Entrada/Salida Recorrido de secuencias 355 con archivos de texto 248 Secuencias calculadas 363 Lectura de archivos de texto 253 Búsqueda en secuencias 370 Escritura en archivos de texto 266 Arrays de datos simples 374 Flujo de ejecución 272 Uso de variables arrays 379 Selección simple 276 Recorrido de arrays 382 Operadores lógicos 282 Búsqueda en arrays 387 Anidamiento de if 286 Arrays no completos 393 Condiciones 290 Selección múltiple 293 La escala if‐else‐if 295 Luis Hernández Yáñez La instrucción switch 302 Repetición 313 El bucle while 316 Fundamentos de la programación: Tipos e instrucciones II . Fundamentos de la programación 3 Grado en Ingeniería Informática Grado en Ingeniería del Software Grado en Ingeniería de Computadores Luis Hernández Yáñez Facultad de Informática Universidad Complutense Tipos.

Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones II Página 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 Declaración Instrucción que identifica un nombre Definición Declaración que asigna memoria a una variable o constante Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones II Página 228 .

bool Conjunto de valores predeterminado  Definidos por el usuario: enumerados Conjunto de valores definido por el programador  Estructurados (Tema 5)  Colecciones homogéneas: arrays Todos los elementos de la colección de un mismo tipo  Colecciones heterogéneas: estructuras Luis Hernández Yáñez Elementos de la colección de tipos distintos Fundamentos de programación: Tipos e instrucciones II Página 230 . double. float. c a double x = 1. i 3 int j = 9. Memoria suficiente para su tipo de valores short int i = 3.5. x 1.5 El significado de los bits depende del tipo de la variable: 00000000 00000000 00000000 01111000 Interpretado como int es el entero 120 Luis Hernández Yáñez Interpretado como char (sólo 01111000) es el carácter 'x' Fundamentos de la programación: Tipos e instrucciones II Página 229  Simples  Estándar: int. char. j 9 char c = 'a'.

.]. Con sus posibles modificadores: [unsigned] [short] int long long int long int  int float [long] double char bool Definición de variables: tipo nombre [ = expresión] [. Fundamentos de la programación: Tipos e instrucciones II Página 231 Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones II Página 232 . Luis Hernández Yáñez Definición de constantes con nombre: const tipo nombre = expresión.. .

 b. int short int b = a + 3 * 2. char caracter. long double int j = 2. Promoción double double a = 1.. Promoción de tipos Dos operandos de tipos distintos: El valor del tipo menor se promociona al tipo mayor short int i = 3. Valor 6 int (4 bytes)  double (8 bytes) Fundamentos de la programación: Tipos e instrucciones II Página 233 Conversión segura: long double De un tipo menor a un tipo mayor double short int  int  long int  .5. Valor 3 short int (2 bytes)  int (4 bytes) Luis Hernández Yáñez b = 1. float long int Conversión no segura: int De un tipo mayor a un tipo menor short int int entero = 1234. // Conversión no segura Menor memoria: Pérdida de información en la conversión Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones II Página 234 . float long int b = a + i * j.5 + 6. caracter = entero..

 b = 2. // Muestra 1. Fuerzan una conversión de tipo: tipo(expresión) El valor resultante de la expresión se trata como un valor del tipo int a = 3.         // Muestra 1 (división entera) cout << double(a) / b. cout << a / b.5 (división real) Tienen la mayor prioridad Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones II Página 235 Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones II Página 236 .

Describimos los valores de las variables del tipo typedef descripción nombre_de_tipo. typedef descripción tTiposDeCalificacion. Luis Hernández Yáñez Declaración de tipo frente a definición de variable Fundamentos de la programación: Tipos e instrucciones II Página 237 Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones II Página 238 . typedef descripción tMoneda. para remarcar que son tipos typedef descripción tMiTipo. Identificador válido Nombres de tipos propios: t minúscula seguida de una o varias palabras capitalizadas Los colorearemos en naranja.

 moneda2. dos_centimos. medio_euro. euro } tMoneda. cinco_centimos. diez_centimos. Enumeración del conjunto de valores posibles para las variables: enum { símbolo1. Elegimos un nombre para el tipo: tMoneda descripción typedef enum { centimo. veinte_centimos. diez_centimos. símbolo2. En el ámbito de la declaración.. cinco_centimos. veinte_centimos. se reconoce un nuevo tipo tMoneda tMoneda moneda1. euro } Valores literales que pueden tomar las variables (en amarillo) Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones II Página 239 Mejoran la legibilidad typedef descripción nombre_de_tipo.. moneda2 = euro. símboloN } enum { Identificador } . enum { centimo. . dos_centimos. medio_euro. Cada variable de ese tipo contendrá alguno de los símbolos moneda1 = dos_centimos. Luis Hernández Yáñez moneda1 dos_centimos moneda2 euro (Internamente se usan enteros) Fundamentos de la programación: Tipos e instrucciones II Página 240 ..

cout << " 5 ‐ Mayo" << endl. cout << " 3 ‐ Marzo" << endl. tMes mes. octubre. octubre. septiembre. cout << " 9 ‐ Septiembre" << endl. noviembre. marzo. agosto. cout << "Numero de mes: ". julio. cout << "10 ‐ Octubre" << endl. tMes mes = tMes(op ‐ 1). septiembre. cout << "11 ‐ Noviembre" << endl. cout << " 4 ‐ Abril" << endl. mayo. cout << " 6 ‐ Junio" << endl. cin >> op. mayo. abril. typedef enum { enero. Se espera un valor entero No se puede escribir directamente enero o junio Y si se escribe la variable en la pantalla: cout << mes. marzo. noviembre. int op. diciembre } tMes. junio. cout << " 7 ‐ Julio" << endl. Luis Hernández Yáñez cout << "12 ‐ Diciembre" << endl. julio. febrero. cout << " 1 ‐ Enero" << endl. junio. cout << " 2 ‐ Febrero" << endl. Fundamentos de la programación: Tipos e instrucciones II Página 242 . agosto. Se verá un número entero Luis Hernández Yáñez  Código de entrada/salida específico Fundamentos de la programación: Tipos e instrucciones II Página 241 typedef enum { enero. diciembre } tMes. cout << " 8 ‐ Agosto" << endl. abril. Lectura de la variable mes: cin >> mes. febrero.

bool noLaborable = (dia >= sabado). sabado. typedef enum { enero. if (mes == diciembre) { cout << "diciembre".. octubre. jueves. } if (mes == marzo) { cout << "marzo". domingo } tDiaSemana. marzo. No admiten operadores de incremento y decremento Emulación con moldes: int i = int(dia). lunes < martes < miercoles < jueves . } .. dia = tDiaSemana(i). < viernes < sabado < domingo if (dia == jueves). agosto.. julio. martes. abril. diciembre } tMes. febrero. septiembre. tDiaSemana dia.. // ¡dia no ha de valer domingo! Luis Hernández Yáñez i++.. miercoles. noviembre. if (mes == enero) { cout << "enero". } if (mes == febrero) { cout << "febrero". junio. Luis Hernández Yáñez } También podemos utilizar una instrucción switch Fundamentos de la programación: Tipos e instrucciones II Página 243 Conjunto de valores ordenado (posición en la enumeración) typedef enum { lunes. mayo. viernes. Fundamentos de la programación: Tipos e instrucciones II Página 244 ..

viernes. junio. int i = int(hoy). #include <iostream> Si los tipos se usan en varias funciones. domingo } tDiaSemana. // Mostramos la fecha cout << "Hoy es: " << cadDia(hoy) << " " << dia << " de " << cadMes(mes) << " de " << anio << endl. julio. tMes mes = octubre. } Fundamentos de la programación: Tipos e instrucciones II Página 246 . Luis Hernández Yáñez return 0. miercoles." << endl. cout << "Pasada la medianoche. typedef enum { lunes. martes. Fundamentos de la programación: Tipos e instrucciones II Página 245 // Mostramos la fecha cout << "Hoy es: " << cadDia(hoy) << " " << dia << " de " << cadMes(mes) << " de " << anio << endl... jueves. noviembre. septiembre. marzo. sabado. abril. dia++. agosto. int anio = 2013. febrero. string cadDia(tDiaSemana dia). Luis Hernández Yáñez int dia = 21. . using namespace std... i++. los declaramos antes de los prototipos typedef enum { enero. string cadMes(tMes mes). int main() { tDiaSemana hoy = lunes. octubre. hoy = tDiaSemana(i). mayo. diciembre } tMes.

. if (mes == enero) { if (dia == lunes) { cad = "enero"... fechas. } } .cpp string cadMes(tMes mes) { string cadDia(tDiaSemana dia). cad = "martes". return cad. Luis Hernández Yáñez } } Fundamentos de la programación: Tipos e instrucciones II Página 247 Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones II Página 248 . } } if (mes == febrero) { if (dia == martes) { cad = "febrero". string cad. } } return cad. cad = "lunes". cad = "domingo". if (mes == diciembre) { if (dia == domingo) { cad = "diciembre"... string cad.

Datos del programa: en la memoria principal (volátil) Medios (dispositivos) de almacenamiento permanente: — Discos magnéticos fijos (internos) o portátiles (externos) — Cintas magnéticas — Discos ópticos (CD. 4  A … Archivo binario: contiene una secuencia de códigos binarios A0 25 2F 04 D6 FF 00 27 6C CA 49 07 5F A4 … (Códigos representados en notación hexadecimal) Los archivos se manejan en los programas por medio de flujos Archivos de texto: flujos de texto Similar a la E/S por consola (Más adelante veremos el uso de archivos binarios) Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones II Página 250 . DVD. BlueRay) — Memorias USB … Mantienen la información en archivos Secuencias de datos Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones II Página 249 Archivo de texto: secuencia de caracteres T o t a l : 1 2 3 .

NIF del cliente. unidades compradas..95 Reproductor de DVD↲ 00112233A 1 218.4 Disco portátil↲ 32143567J 3 32 Memoria USB 16Gb↲ 76329845H 1 134. precio unitario y descripción de producto. Normalmente terminan con un dato especial (centinela) Por ejemplo. Textos dispuestos en sucesivas líneas Carácter de fin de línea entre línea y línea (Intro) Posiblemente varios datos en cada línea Ejemplo: Compras de los clientes En cada línea.5 Modem ADSL↲ Luis Hernández Yáñez . un NIF que sea X Fundamentos de la programación: Tipos e instrucciones II Página 251 #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 Biblioteca fstream (sin espacio de nombres) Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones II Página 252 . separados por espacio 12345678F 2 123..

Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones II Página 253 Flujos de texto de entrada ifstream Para leer de un archivo de texto: 1 Declara una variable de tipo 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) Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones II Página 254 .

Intro. Salta primero los espacios en blanco (espacio. ¡El archivo debe existir! ifstream archivo.txt"). cadena) Lee en la cadena todos los caracteres que queden en la línea Incluidos los espacios en blanco Luis Hernández Yáñez Hasta el siguiente salto de línea (descartándolo) Con los archivos no tiene efecto la función sync() Fundamentos de la programación: Tipos e instrucciones II Página 256 .open("abc. tab.close()..close(). se ha podido abrir false en caso contrario Cierre del archivo Desconecta la variable del archivo de texto del dispositivo flujo..is_open()) . is_open(): archivo..get(c) Lee el siguiente carácter en la variable c. sea el que sea  getline(archivo.. . Fundamentos de la programación: Tipos e instrucciones II Página 255 Operaciones de lectura  Extractor (>>) archivo >> variable.) Datos numéricos: lee hasta el primer carácter no válido Cadenas (string): lee hasta el siguiente espacio en blanco  archivo. true si el archivo if (archivo. Apertura del archivo Conecta la variable con el archivo de texto del dispositivo flujo.open(cadena_literal). Luis Hernández Yáñez archivo.

get(c).  Una cadena posiblemente con espacios Usa la función getline() getline(archivo. Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones II Página 257 ¿Dónde queda pendiente la entrada?  Número leído con el extractor En el primer carácter no válido (inc. ¿Qué debo leer?  Un número Usa el extractor archivo >> num.  Un carácter (sea el que sea) Usa la función get() archivo. espacios en blanco)  Una cadena leída con el extractor En el siguiente espacio en blanco  Una cadena leída con la función getline() Al principio de la siguiente línea Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones II Página 258 .  Una cadena sin espacios Usa el extractor archivo >> cad. cad). espacios en blanco)  Carácter leído con get() En el siguiente carácter (inc.

1 ifstream archivo. 7 6 Flujo de entrada 2 archivo. 1 Programa 4 archivo. archivo >> precio. 3 2 getline(archivo.95 Espacio Fundamentos de la programación: Tipos e instrucciones II Página 260 .close(). archivo >> unidades.open("compras. // Apertura 5 archivo 4 3 archivo >> nif >> unidades >> precio. producto). char aux. double precio. string nif. getline(archivo.txt"). getline() no salta espacios 12345678F 2 123.95 Reproductor de DVD El extractor salta los espacios nif 12345678F unidades 2 Luis Hernández Yáñez producto Reproductor de DVD precio 123. producto). // Cierre Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones II Página 259 archivo >> nif. int unidades. producto.

95 Reproductor de DVD Leemos el espacio (no hacemos nada con él) nif 12345678F unidades 2 Luis Hernández Yáñez producto Reproductor de DVD precio 123. archivo >> nif.95 Sin espacio Fundamentos de la programación: Tipos e instrucciones II Página 261 Cada línea. archivo. precio y descripción Luis Hernández Yáñez Calcular y mostrar el total Leer el siguiente NIF Fundamentos de la programación: Tipos e instrucciones II Página 262 .get(aux). producto). 12345678F 2 123. archivo >> unidades. datos de una compra Mostrar el total de cada compra unidades x precio más IVA (21%) Final: "X" como NIF Bucle de procesamiento:  Cada paso del bucle (ciclo) procesa una línea (compra)  Podemos usar las mismas variables en cada ciclo Leer primer NIF Mientras el NIF no sea X: Leer unidades. archivo >> precio. // Salta el espacio en blanco getline(archivo.

 // Siguiente NIF } . // Salta el espacio getline(archivo. neto.is_open()) { // Existe el archivo archivo >> nif. ifstream archivo. producto.cpp #include <string> using namespace std. iva = neto * IVA / 100.open("compras. int contador = 0.txt"). Fundamentos de la programación: Tipos e instrucciones II Página 264 .get(aux). total = neto + iva. Luis Hernández Yáñez archivo.‐" << endl. archivo. double precio. producto). char aux. iva. archivo >> nif.V... contador++. #include <iostream> leer. neto = unidades * precio. Fundamentos de la programación: Tipos e instrucciones II Página 263 if (archivo.. int unidades. // Apertura . #include <fstream> #include <iomanip> // Formato de salida int main() { const int IVA = 21. total. cout << "Compra " << contador << ".: " Luis Hernández Yáñez << iva << " ‐ Total: " << total << endl.. cout << "   " << producto << ": " << unidades << " x " << fixed << setprecision(2) << precio << " = " << neto << " ‐ I.A. // Primer NIF while (nif != "X") { archivo >> unidades >> precio. string nif.

 // Cierre } else { cout << "ERROR: No se ha podido abrir el archivo" << endl. } return 0. archivo.close(). } Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones II Página 265 Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones II Página 266 .

open("output. se borra todo lo que hubiera Luis Hernández Yáñez ¡Atención! Si no se cierra el archivo se puede perder información Fundamentos de la programación: Tipos e instrucciones II Página 267 int valor = 999. Flujos de texto de salida ofstream Para crear un archivo de texto y escribir en él: 1 Declara una variable de tipo 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) ¡Atención! Si el archivo ya existe.txt").close(). H X 4 archivo. // Apertura ! archivo a l 3 archivo << 'X' << " Hola! " << 123.45 o << endl << valor << "Bye!". // Cierre Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones II Página 268 . 1 Flujo de salida 2 archivo. Programa 2 1 ofstream archivo.

cout << "NIF del cliente (X para terminar): ".open("output. escribir. cin >> nif... // Apertura (creación) Luis Hernández Yáñez cout << "NIF del cliente (X para terminar): ".. #include <fstream> int main() { string nif.. archivo. cin >> precio. . ofstream archivo. cout << "Unidades: ". Fundamentos de la programación: Tipos e instrucciones II Página 270 .get(aux). // Escribimos los datos en una línea del archivo. int unidades. // Leemos el Intro cout << "Producto: ". cin. Fundamentos de la programación: Tipos e instrucciones II Página 269 while (nif != "X") { // Queda pendiente el Intro anterior.txt"). Luis Hernández Yáñez cin >> nif. getline(cin. } . char aux. double precio.. producto. cin >> unidades. producto). cout << "Precio: "..cpp #include <iostream> #include <string> using namespace std... // Con un espacio de separación entre ellos archivo << nif << " " << unidades << " " << precio << " " << producto << endl.

// Escribimos el centinela final.. // Cierre del archivo return 0. } Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones II Página 271 Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones II Página 272 . archivo.. archivo << "X".close().

.. Instrucción 1 cout << "Operando 1: ". Instrucción 3 cout << "Operando 2: ". Luis Hernández Yáñez Instrucción N return 0. } Fundamentos de la programación: Tipos e instrucciones II Página 273 Uno entre dos o más caminos de ejecución Selección simple (2 caminos) Selección múltiple (> 2 caminos) true true false false Condición true false Instrucción T Instrucción F true false if true if‐else‐if Luis Hernández Yáñez false switch Diagramas de flujo Fundamentos de la programación: Tipos e instrucciones II Página 274 . cout << "Producto: " << prod. oper2. prod. Flujo de ejecución Instrucción 2 cin >> oper1. . { double oper1.

.. procesar colecciones. . Inicialización Sí No ¿Iterar? Código Luis Hernández Yáñez while for Fundamentos de la programación: Tipos e instrucciones II Página 275 Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones II Página 276 . Repetir la ejecución de una o más instrucciones Acumular.

cpp int num. cin >> num. La instrucción if if (condición) { true false Condición códigoT } BloqueT BloqueF Opcional [else { códigoF }] condición: expresión bool Cláusula else opcional Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones II Página 277 signo. else { true false cout << "Positivo". num < 0 } cout << "Negativo". cout << endl. cout << "Positivo". Luis Hernández Yáñez cout << endl. } cin >> num. if (num < 0) { cout << "Negativo". Fundamentos de la programación: Tipos e instrucciones II Página 278 .

int num. cin >> num. Luis Hernández Yáñez cout << endl. _ } else { cout << "Positivo". } cout << endl. ‐5 if (num < 0) { Negativo cout << "Negativo". 1_29 129 if (num < 0) { _ Positivo cout << "Negativo". Luis Hernández Yáñez cout << endl. Fundamentos de la programación: Tipos e instrucciones II Página 280 . true num < 0 num ‐5 ? cout << "Negativo". cin >> num. Fundamentos de la programación: Tipos e instrucciones II Página 279 int num. num < 0 num 129 ? cout << "Positivo". } false cout << endl. cin >> num. _ } else { cout << "Positivo". cin >> num.

 resultado. cout << "Denominador: ". denominador. if (denominador == 0) { cout << "Imposible dividir entre 0!". división. } else { resultado = numerador / denominador.cpp División entre dos números protegida frente a intento de división por 0 #include <iostream> using namespace std.  cin >> numerador. int main() { double numerador. cout << "Numerador: ". } return 0. Luis Hernández Yáñez cout << "Resultado: " << resultado << endl.  cin >> denominador. } Fundamentos de la programación: Tipos e instrucciones II Página 281 Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones II Página 282 .

 cond2. resultado. b = 3.   // 10 >= 12  false cond2 = (a * (b + c)) >= 12. resultado = !(a < 5).  // false || true  true Fundamentos de la programación: Tipos e instrucciones II Página 284 .. Se aplican a valores bool (condiciones) El resultado es de tipo bool Operadores (prioridad) ! NO Monario . int a = 2.  // false && true  false resultado = cond1 || cond2.        // !(2 < 5)  !true  false cond1 = (a * b + c) >= 12. c = 4.. // 14 >= 12  true Luis Hernández Yáñez resultado = cond1 && cond2. && Y Binario ! || O Binario * / % + ‐ < <= > >= == != Luis Hernández Yáñez && || Fundamentos de la programación: Tipos e instrucciones II Página 283 ! && true false || true false true false true true false true true true false true false false false false true false NO (Not) Y (And) O (Or) bool cond1.

cout << "Introduce un número entre 1 y 10: ". Condiciones equivalentes ((num >= 1) && (num <= 10)) Luis Hernández Yáñez } ((num > 0) && (num < 11)) ¡Encierra las condiciones ((num >= 1) && (num < 11)) simples entre paréntesis! ((num > 0) && (num <= 10)) Fundamentos de la programación: Tipos e instrucciones II Página 285 Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones II Página 286 . } return 0. int main() { int num. } else { cout << "Número no válido!". condiciones. if ((num >= 1) && (num <= 10)) { cout << "Número dentro del intervalo de valores válidos".cpp #include <iostream> using namespace std. cin >> num.

salvo que sea divisible por 400 bool bisiesto(int mes. if (mes == 2) { if (bisiesto(mes. Luis Hernández Yáñez } else { dias = 30. } } else { if ((mes == 1) || (mes == 3) || (mes == 5) || (mes == 7)  || (mes == 8) || (mes == 10) || (mes == 12)) { dias = 31.cpp int mes.  cin >> mes. } Fundamentos de la programación: Tipos e instrucciones II Página 288 . excepto el último de cada siglo (divisible por 100). } } Fundamentos de la programación: Tipos e instrucciones II Página 287 Calendario Gregoriano: bisiesto si divisible por 4. if ((anio % 4) == 0) { // Divisible por 4 if (((anio % 100) == 0) && ((anio % 400) != 0)) { // Pero último de siglo y no múltiplo de 400 esBisiesto = false. } else { dias = 28. dias. } else { esBisiesto = true. } return esBisiesto. diasmes. anio. cout << "Número de mes: ". cout << "Año: ". int anio) { bool esBisiesto.  cin >> anio. // Año bisiesto } } else { Luis Hernández Yáñez esBisiesto = false. anio)) { dias = 29.

} if (y > 0) {..} else {.} else { if (condición3) { if (condición4) {.. La sangría ayuda a asociar los else con sus if Fundamentos de la programación: Tipos e instrucciones II Página 289 Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones II Página 290 ...} else {..} } Luis Hernández Yáñez else { .} if (x > 0) { if (condición5) {. Cada else se asocia al if anterior más cercano sin asociar (mismo bloque) if (condición1) {  if (condición2) {..} if (y > 0) {...} } else {.} Una mala sangría puede confundir if (x > 0) { else {.............

0 / n) Si n es 0: ¿división por cero? (segunda condición) Como la primera sería true: ¡no se evalúa la segunda! false && X  false (n != 0) && (x < 1.0 / n) Si n es 0: ¿división por cero? (segunda condición) Luis Hernández Yáñez Como la primera sería false: ¡no se evalúa la segunda! Fundamentos de la programación: Tipos e instrucciones II Página 292 . • Condición simple: Expresión lógica (true/false) Sin operadores lógicos num < 0 car == 'a' Compatibilidad con el lenguaje C: isalpha(car) 0 es equivalente a false 12 Cualquier valor distinto de 0 es equivalente a true • Condición compuesta: Combinación de condiciones simples y operadores lógicos !isalpha(car) (num < 0) || (car == 'a') (num < 0) && ((car == 'a') || !isalpha(car)) Luis Hernández Yáñez No confundas el operador de igualdad (==) con el operador de asignación (=). Fundamentos de la programación: Tipos e instrucciones II Página 291 Shortcut Boolean Evaluation true || X  true (n == 0) || (x >= 1.

Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones II Página 293 true false true false true false true false Luis Hernández Yáñez if‐else‐if switch Fundamentos de la programación: Tipos e instrucciones II Página 294 .

si nota >= 9 entonces SB >= 7 cout << "NT" false si no. si nota >= 5 entonces AP false cout << "SS" si no SS Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones II Página 296 .Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones II Página 295 Ejemplo: Calificación (en letras) de un estudiante en base a su nota numérica (0‐10) == 10 true cout << "MH" false true >= 9 cout << "SB" Si nota == 10 entonces MH false true si no. si nota >= 7 entonces NT >= 5 true cout << "AP" si no.

 if (nota >= 5) { cout << "AP". double nota. else { } if (nota >= 5) { cout << "AP". else if (nota >= 5) { } cout << "AP". if (nota == 10) { } cout << "MH". } else { cout << "SS". ¡No se ejecutan nunca! cin >> nota. cin >> nota. cin >> nota. } double nota. cin >> nota. } Sólo muestra AP o SS Fundamentos de la programación: Tipos e instrucciones II Página 298 . else { } Luis Hernández Yáñez cout << "SS". } else if (nota < 10) { cout << "SB". else { } if (nota >= 9) { cout << "SB".  if (nota < 5) { cout << "SS". if (nota == 10) { cout << "MH". } else if (nota >= 7) { cout << "NT". } else { } cout << "SS". } else if (nota < 7) { cout << "AP". } else if (nota == 10) { cout << "MH". } Luis Hernández Yáñez else if (nota >= 9) { cout << "SB". else { } if (nota >= 7) { cout << "NT". } } } Fundamentos de la programación: Tipos e instrucciones II Página 297 ¡Cuidado con el orden de las condiciones! double nota.cpp double nota. } else if (nota < 9) { cout << "NT". } else { cout << "MH". else if (nota >= 9) {  } cout << "SB". nota.  else if (nota >= 7) { } cout << "NT".

Simplificación de las condiciones 0 SS 5 AP 7 NT 9 SB 10 if (nota == 10) { cout << "MH". } return 0. } else if ((nota < 7) && (nota >= 5)) { cout << "AP". } Fundamentos de la programación: Tipos e instrucciones II Página 299 nivel. } else if (num == 1) { cout << "Bajo" << endl. Si num == 3 entonces Alto int main() { int num. } else if (num == 2) { cout << "Medio" << endl.cpp #include <iostream> Si num == 4 entonces Muy alto using namespace std. } Si no es >= 9. } Luis Hernández Yáñez else { cout << "Valor no válido" << endl. es menor que 9 else if (nota >= 9) {cout << "SB". } Siempre true: ramas else Si no es 10. } Fundamentos de la programación: Tipos e instrucciones II Página 300 . es menor que 7 Luis Hernández Yáñez else if (nota >= 7) { cout << "NT". } true && X  X else { cout << "SS". Si num == 1 entonces Bajo cin >> num. } else if (num == 3) { cout << "Alto" << endl. if (num == 4) { cout << "Muy alto" << endl. } … else if (nota >= 5) { cout << "AP". } else if ((nota < 9) && (nota >= 7)) { cout << "NT". } MH else if ((nota < 10) && (nota >= 9)) { cout << "SB". Si num == 2 entonces Medio cout << "Introduce el nivel: ". } Si no es >= 7. } else if (nota < 5)  { cout << "SS". es menor que 10 if (nota == 10) { cout << "MH".

 } if (num == 4) cout << "Muy alto". else if (num == 1) cout << "Bajo". } else cout << "Valor no válido" << endl. } else if (num == 3) { cout << "Alto" << endl. else if (num == 2) cout << "Medio". cout << endl. } else if (num == 1) { cout << "Bajo" << endl. else if (num == 3) cout << "Alto". if (num == 4) { cout << "Muy alto" << endl. Luis Hernández Yáñez else cout << "Valor no válido". } else if (num == 2) { cout << "Medio" << endl. Fundamentos de la programación: Tipos e instrucciones II Página 301 Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones II Página 302 .

} } Fundamentos de la programación: Tipos e instrucciones II Página 304 . Si num == 2  Medio break..] [break. case 1: { cout << "Bajo". case 2: { cout << "Medio"..cpp switch (num) { case 4: Si num == 4  Muy alto { Si num == 3  Alto } cout << "Muy alto".] Luis Hernández Yáñez . } break. Selección entre valores posibles de una expresión switch (expresión) { case constanteN: case constante1: { { códigoN código1 } } [break.] [default: case constante2: { { códigoDefault código2 }] } } [break. } break. Si num == 1  Bajo case 3: { cout << "Alto". } break. Fundamentos de la programación: Tipos e instrucciones II Página 303 nivel2. Luis Hernández Yáñez default: { cout << "Valor no válido".

. continúa en la instrucción que le siga switch (num) { ... Alto } Medio case 1: Bajo { Valor no válido cout << "Bajo". case 2: { cout << "Medio". Num: 3 } Alto break. case 3: { cout << "Alto".. } default: Luis Hernández Yáñez { cout << "Valor no válido". Luis Hernández Yáñez .. } } Fundamentos de la programación: Tipos e instrucciones II Página 306 . } break. } case 2: { Num: 3 cout << "Medio".. Interrumpe el switch. case 3: { cout << "Alto". } Fundamentos de la programación: Tipos e instrucciones II Página 305 switch (num) { .

true num==2 Medio break. if ((op < 0) || (op > 4)) { cout << "¡Opción no válida!" << endl. 1 ‐ Nuevo cliente 2 ‐ Editar cliente cout << "4 ‐ Ver cliente" << endl. true num==3 Alto break. // Cualquiera no válida 2 ‐ Editar cliente 3 ‐ Baja cliente 4 ‐ Ver cliente while ((op < 0) || (op > 4)) { 0 ‐ Salir cout << "1 ‐ Nuevo cliente" << endl. Opción: 5 cout << "2 ‐ Editar cliente" << endl. false Sin break. } Fundamentos de la programación: Tipos e instrucciones II Página 308 . true num==1 Bajo break. false Sin break. false Sin break. No válido Luis Hernández Yáñez default Fundamentos de la programación: Tipos e instrucciones II Página 307 int menu() { 1 ‐ Nuevo cliente int op = ‐1. false Sin break. 0 ‐ Salir Opción: 3 cin >> op. } Luis Hernández Yáñez } return op. ¡Opción no válida! cout << "3 ‐ Baja cliente" << endl. true num==4 Muy alto break. 3 ‐ Baja cliente cout << "0 ‐ Salir" << endl. 4 ‐ Ver cliente cout << "Opción: ".

." << endl. case 3: { cout << "En la opción 3." << endl..." << endl.. Luis Hernández Yáñez opcion = menu()... . } break. } break.. .. case 2: { cout << "En la opción 2. } break... } // while Fundamentos de la programación: Tipos e instrucciones II Página 310 . case 4: { cout << "En la opción 4. } break. while (opcion != 0) { switch (opcion) { case 1: { cout << "En la opción 1... opcion = menu(). } } // switch . int opcion. } // En la última no necesitamos break } Fundamentos de la programación: Tipos e instrucciones II Página 309 int opcion.." << endl. opcion = menu()......" << endl.. .. case 4: Luis Hernández Yáñez { cout << "En la opción 4. switch (opcion) { case 1: { cout << "En la opción 1." << endl.

 // Sin decimales case 7: cout << "Nota (0‐10): ". } } Fundamentos de la programación: Tipos e instrucciones II Página 312 . Luis Hernández Yáñez case diciembre: { cout << "diciembre". cout << "Suspenso". agosto.. . julio. .  case febrero: { cout << "febrero". septiembre. case 0: } case 1: break. } } break. // 5 o 6: AP Fundamentos de la programación: Tipos e instrucciones II Página 311 typedef enum { enero. } } break. noviembre. marzo. switch (mes) { case enero: { cout << "enero". case 8: cin >> nota.. octubre. tMes mes. mayo. // 7 u 8: NT case 2: case 9: case 3: case 10: case 4: { { cout << "Sobresaliente". nota2.cpp int nota.. febrero. // De 0 a 4: SS default: case 5: { case 6: cout << "¡No válida!".. abril. } break. { } Luis Hernández Yáñez cout << "Aprobado". { switch (nota) { cout << "Notable". // 9 o 10: SB break. } break. junio. diciembre } tMes.

Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones II Página 313 Inicialización Sí No ¿Iterar? Cuerpo Bucles while y for Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones II Página 314 .

 paso) cuerpo Luis Hernández Yáñez Ejecuta el cuerpo mientras la condición sea true Se usa una variable contadora entera Fundamentos de la programación: Tipos e instrucciones II Página 315 Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones II Página 316 .  Número de iteraciones condicionado (recorrido variable): — Bucle while while (condición) cuerpo Ejecuta el cuerpo mientras la condición sea true — Bucle do‐while Comprueba la condición al final (lo veremos más adelante)  Número de iteraciones prefijado (recorrido fijo): — Bucle for for (inicialización. condición.

cpp Mientras la condición sea cierta. } Muestra los números del 1 al 100 Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones II Página 317 int i = 1. while. // Inicialización de la variable i while (i <= 100) { cout << i << endl. } i = 1 i 100 101 99 ?3 2 1 4 _ 1 true false 2 i <= 100 3 cout << i << endl. 99 100 Luis Hernández Yáñez i++ _ Fundamentos de la programación: Tipos e instrucciones II Página 318 . i++.  Cuerpo i++. ejecuta el cuerpo while (condición) { cuerpo Condición al principio del bucle } int i = 1. true false while (i <= 100) { Condición cout << i << endl.

000: " << num << endl. Empezamos en 1 while (num * num <= 1000) { num++. cout << "Introduce la opción: ".000 #include <iostream> ¡Ejecuta el programa para using namespace std. Fundamentos de la programación: Tipos e instrucciones II Página 320 . Incrementamos en 1 } cout << "1er. Luis Hernández Yáñez return 0. 3.. } Si el usuario introduce un número entre 0 y 4: No se ejecuta el cuerpo del bucle Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones II Página 319 primero. 4. cin >> op. 2.cpp Primer entero cuyo cuadrado es mayor que 1. ¿Y si la condición es falsa al comenzar? No se ejecuta el cuerpo del bucle ninguna vez int op. entero con cuadrado mayor que 1. cout << "Introduce la opción: ". 5.. } Recorre la secuencia de números 1. saber cuál es ese número! int main() { int num = 1. . while ((op < 0) || (op > 4)) { cout << "¡No válida! Inténtalo otra vez" << endl. cin >> op.

cpp #include <iostream> using namespace std. return 0. sumamedia. Leemos el primero while (num != 0) { // 0 para terminar suma = suma + num. cin >> num. cout << "Media = " << media << endl. Recorre la secuencia int main() { de números introducidos double num. cout << "Introduce un número (0 para terminar): ". int cont = 0. cin >> num. } Fundamentos de la programación: Tipos e instrucciones II Página 321 Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones II Página 322 . } Luis Hernández Yáñez cout << "Suma = " << suma << endl. cout << "Introduce un número (0 para terminar): ". Leemos el siguiente } if (cont > 0) { media = suma / cont. suma = 0. media = 0. cont++.

1. 100.. 97... 2. . 5. i <= 100. paso) cuerpo for (int i = 1. i++) { cout << i.. Número de iteraciones prefijado Variable contadora que determina el número de iteraciones: for ([int] var = ini. 99. i <= 100.. 1 Tantos ciclos como valores toma la variable contadora Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones II Página 323 for (inicialización. . 3... i++ Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones II Página 324 .. } i = 1 true false i <= 100 cout << i. paso) cuerpo La condición compara el valor de var con un valor final El paso incrementa o decrementa el valor de var El valor de var debe ir aproximándose al valor final for (int i = 1. i‐‐). condición. 100 for (int i = 100. i >= 1. condición. 98. 4.. i++)..

} i 2?3 100 101 1 1 . 100 _ i++ Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones II Página 325 La variable contadora for2. i = 1 2 3 true false i <= 100 99 cout << i << endl. i <= 100. i++) { cout << i << endl.. i <= 100. i = i + 2) cout << i << endl.cpp for (int i = 1. for1. Este bucle for muestra los números impares de 1 a 99 Muy importante El cuerpo del bucle NUNCA debe alterar el valor del contador Garantía de terminación Todo bucle debe terminar su ejecución Luis Hernández Yáñez Bucles for: la variable contadora debe converger al valor final Fundamentos de la programación: Tipos e instrucciones II Página 326 ..cpp El paso no tiene porqué ir de uno en uno: for (int i = 1.

 i <= 100. ++i) .. 5. n } Fundamentos de la programación: Tipos e instrucciones II Página 327 ¿Incremento/decremento prefijo o postfijo? Es indiferente Estos dos bucles producen el mismo resultado: for (int i = 1. for (int i = 1..cpp #include <iostream> using namespace std. 1 0 ‐1 ‐2 ‐3 ‐4 ‐5 ‐6 ‐7 ‐8 ‐9 ‐10 ‐11 .. } long long int suma(int n) { long long int total = 0.. i <= 100. cout << "Número final: ". i++) {  total = total + i. i++) . 4. i <= n. if (num > 0) { // El número debe ser positivo cout << "La suma de los números entre 1 y "  << num << " es: " << suma(num). } Recorre la secuencia de números return total. 2.. long long int suma(int n)... i <= 100. suma. Bucles infinitos for (int i = 1.. i‐‐) . .. } return 0. 3... Luis Hernández Yáñez for (int i = 1. 1.  cin >> num. Luis Hernández Yáñez Cada vez más lejos del valor final (100) Es un error de diseño/programación Fundamentos de la programación: Tipos e instrucciones II Página 328 . int main() { int num.

 i <= 100.) Sólo se conoce en el cuerpo del bucle (su ámbito) No se puede usar en instrucciones que sigan al bucle Declarada antes del bucle int i.) Se conoce en el cuerpo del bucle y después del mismo Ámbito externo al bucle Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones II Página 329 Los bucles for se pueden reescribir como bucles condicionados for (int i = 1.. . while (i <= 100) { cuerpo i++.. introducirá el usuario! } Fundamentos de la programación: Tipos e instrucciones II Página 330 . Declarada en el propio bucle for (int i = 1.. for (i = 1. cin >> i.. ¿Bucle for equivalente? while (i != 0) { Luis Hernández Yáñez cuerpo ¡No sabemos cuántos números cin >> i. . } La inversa no es siempre posible: int i. i++) cuerpo Es equivalente a: int i = 1.

 i++) { i j for (int j = 1.Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones II Página 331 Un bucle for en el cuerpo de otro bucle for Cada uno con su propia variable contadora: for (int i = 1. Fundamentos de la programación: Tipos e instrucciones II Página 332 . i <= 100.. j++) { 1 1 cuerpo 1 2 1 3 } 1 4 } 1 5 Para cada valor de i 2 1 2 2 el valor de j varía entre 1 y 5 2 3 j varía más rápido que i 2 4 2 5 Luis Hernández Yáñez 3 1 . j <= 5..

} Fundamentos de la programación: Tipos e instrucciones II Página 333 tablas2. i <= 10. i <= 10.cpp #include <iostream> using namespace std. j++) { 2 x  1 =   2 cout << setw(2) << i << " x " 2 x  2 =   4 << setw(2) << j << " = " . j <= 10. #include <iomanip> int main() { for (int i = 1.. for (int i = 1. for (int j = 1. i++) { cout << "Tabla del " << i << endl.... Luis Hernández Yáñez } return 0. 1 x  1 =   1 #include <iomanip> 1 x  2 =   2 1 x  3 =   3 1 x  4 =   4 int main() { . 10 x  7 =  70 << setw(3) << i * j << endl. 10 x  8 =  80 } 10 x  9 =  90 } 10 x 10 = 100 Luis Hernández Yáñez return 0. tablas. cout << "‐‐‐‐‐‐‐‐‐‐‐‐‐‐" << endl. i++) { 1 x 10 =  10 for (int j = 1. j <= 10.cpp #include <iostream> using namespace std. } Fundamentos de la programación: Tipos e instrucciones II Página 334 . j++) { cout << setw(2) << i << " x " << setw(2) << j << " = " << setw(3) << i * j << endl. } cout << endl.

. } cout << "La suma de los números del 1 al " << num << " es: " << suma(num) << endl. while (opcion != 0) { switch (opcion) { case 1: { for (int i = 1. i <= 10. Fundamentos de la programación: Tipos e instrucciones II Página 335 case 2: { int num = 0. 2: Sumatorio long long int suma(int n). } Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones II Página 336 . j <= 10. // Sumatorio int main() { int opcion = menu(). menú.cpp #include <iostream> using namespace std. #include <iomanip> int menu(). . j++) { cout << setw(2) << i << " x " << setw(2) << j << " = " Luis Hernández Yáñez << setw(3) << i * j << endl. i++) { for (int j = 1. } // while (opcion != 0) return 0.. while (num <= 0) { cout << "Hasta (positivo)? ". } } // switch opcion = menu(). } } } break. // 1: Tablas de multiplicación.  cin >> num.

. } while ((op < 0) || (op > 2)) { Luis Hernández Yáñez . i++) { . cin >> op. } return total. for (int i = 1.. int menu() { int op = ‐1. } long long int suma(int n) { long long int total = 0. if ((op < 0) || (op > 2)) { cout << "¡Opción no válida!" << endl. i <= n. while ((op < 0) || (op > 2)) { cout << "1 ‐ Tablas de multiplicar" << endl. cout << "Opción: " << endl.. i <= 10.. } Fundamentos de la programación: Tipos e instrucciones II Página 337 while (opcion != 0) { . } } return op. for (int i = 1. j++) { . i <= n. } suma() for (int i = 1. cout << "0 ‐ Salir" << endl.. } menu() } Fundamentos de la programación: Tipos e instrucciones II Página 338 . i++) { for (int j = 1. j <= 10... cout << "2 ‐ Sumatorio" << endl.. i++) {  Luis Hernández Yáñez total = total + i. } } while (num <= 0) { ...

Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones II Página 339 Cada bloque crea un nuevo ámbito: int main() { double d = ‐1. suma = 0. return 0. } Fundamentos de la programación: Tipos e instrucciones II Página 340 . } } cout << "Suma = " << suma << endl. cont++. while (d != 0) { cin >> d. if (d != 0) { suma = suma + d. 3 ámbitos anidados int cont = 0. Luis Hernández Yáñez cout << "Media = " << suma / cont << endl.

Un identificador se conoce en el ámbito en el que está declarado (a partir de su instrucción de declaración) y en los subámbitos posteriores Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones II Página 341 int main() { double d....) { int cont = 0.) { double x. i++) { . } } char c.. if (. Ámbito de la variable d if (. i <= 10. for (int i = 0. Luis Hernández Yáñez } return 0.. ... } Fundamentos de la programación: Tipos e instrucciones II Página 342 ..

 i <= 10. if (. i++) { ..) { int cont = 0.. int main() { double d... if (... if (.) { double x. i <= 10.. } } char c.... } Fundamentos de la programación: Tipos e instrucciones II Página 344 ..) { int cont = 0.. . } Ámbito de la variable i } char c. Ámbito de la variable cont for (int i = 0.. Luis Hernández Yáñez } return 0. i++) { .. for (int i = 0. } Fundamentos de la programación: Tipos e instrucciones II Página 343 int main() { double d.. if (.) { double x. .. Luis Hernández Yáñez } return 0.

. . } Fundamentos de la programación: Tipos e instrucciones II Página 346 . i <= 10.... Ámbito de la variable x Luis Hernández Yáñez } return 0. int main() { double d. } } char c. if (. if (. } } char c... i <= 10. for (int i = 0... if (..) { int cont = 0.. . } Fundamentos de la programación: Tipos e instrucciones II Página 345 int main() { double d.. Luis Hernández Yáñez } return 0... i++) { .. i++) { .) { double x. for (int i = 0. if (.) { Ámbito de la variable c double x.) { int cont = 0...

Si en un subámbito se declara un identificador con idéntico nombre que uno ya declarado en el ámbito. } Fundamentos de la programación: Tipos e instrucciones II Página 348 . i <= 10. i++) { ... a la i anterior for(int i = 0. en su ámbito. Oculta . a la i anterior if (. en su ámbito.. en su ámbito. a la x anterior . Oculta . el del subámbito oculta al del ámbito (no es visible) Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones II Página 347 int main() { int i. if (..... Oculta . Luis Hernández Yáñez } return 0.) { int i = 0. } } char c. x..) { double x.

de un mismo tipo Fundamentos de la programación: Tipos e instrucciones II Página 350 . si es que existe Todos los elementos.Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones II Página 349 Sucesión de elementos de un mismo tipo que se acceden linealmente elemento secuencia secuencia o (Secuencia vacía) elemento 1 34 12 26 4 87 184 52 Comienza en un primer elemento (si no está vacía) A cada elemento le sigue otra secuencia (vacía. si es el último) Acceso secuencial (lineal) Se comienza siempre accediendo al primer elemento Desde un elemento sólo se puede acceder a su elemento siguiente Luis Hernández Yáñez (sucesor).

.)  Secuencias calculadas: — Fórmula de recurrencia que determina el elemento siguiente  Listas (más adelante) Secuencias explícitas que manejaremos: Datos introducidos por el teclado o leídos de un archivo Con un elemento especial al final de la secuencia (centinela) Luis Hernández Yáñez 1 34 12 26 4 87 184 52 ‐1 Fundamentos de la programación: Tipos e instrucciones II Página 351  Secuencia explícita leída de archivo: — Detectar la marca de final de archivo (Eof ‐ End of file) — Detectar un valor centinela al final  Secuencia explícita leída del teclado: — Preguntar al usuario si quiere introducir un nuevo dato — Preguntar al usuario primero cuántos 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 números positivos  centinela: cualquier negativo) Luis Hernández Yáñez 12 4 37 23 8 19 83 63 2 35 17 76 15 ‐1 Fundamentos de la programación: Tipos e instrucciones II Página 352 . No tratamos secuencias infinitas: siempre hay un último elemento  Secuencias explícitas: — Sucesión de datos de un dispositivo (teclado. sensor.. disco..

.. sumar los números de una secuencia. . Debe haber algún valor que no sea un elemento válido Secuencias numéricas: Si se permite cualquier número. Termina al llegar al final de la secuencia Búsqueda Recorrido de la secuencia hasta encontrar un elemento buscado Ej. 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 Luis Hernández Yáñez 12 4 37 23 8 19 83 63 ‐1 35 17 76 15 No se procesan Fundamentos de la programación: Tipos e instrucciones II Página 353 Tratamiento de los elementos uno a uno desde el primero Recorrido Un mismo tratamiento para todos los elementos de la secuencia Ej.000 Termina al localizar el primer elemento que cumple la condición Luis Hernández Yáñez o al llegar al final de la secuencia (no encontrado) Fundamentos de la programación: Tipos e instrucciones II Página 354 .‐ Localizar el primer número que sea mayor que 1.‐ Mostrar los elementos de una secuencia. no hay centinela posible Cadenas de caracteres: ¿Caracteres especiales (no imprimibles)? En realidad el valor centinela es parte de la secuencia. ¿par o impar cada número de una secuencia?.

Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones II Página 355 Un mismo tratamiento a todos los elementos Inicialización Mientras no se llegue al final de la secuencia: Obtener el siguiente elemento Procesar el elemento Finalización Al empezar se obtiene el primer elemento de la secuencia En los siguientes pasos del bucle se van obteniendo los siguientes elementos de la secuencia Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones II Página 356 .

Inicialización true ¿Al final? false No sabemos cuántos elementos hay Obtener elemento  No podemos Procesar elemento implementar con for Luis Hernández Yáñez Finalización Fundamentos de la programación: Tipos e instrucciones II Página 357 Implementación con while Inicialización Inicialización Obtener el primer elemento Obtener 1º Mientras no sea el centinela: Procesar el elemento true ¿Centinela? Obtener el siguiente elemento false Finalización Procesar elemento Obtener siguiente Luis Hernández Yáñez Finalización Fundamentos de la programación: Tipos e instrucciones II Página 358 .

Luis Hernández Yáñez } cout << "Suma = " << suma << endl.            // Procesar cin >> c. cout << "Texto terminado en punto: ".') { // Mientras no el centinela l++.       // Obtener siguiente carácter } Luis Hernández Yáñez return l. Secuencia de números positivos Siempre se realiza al menos una lectura Centinela: ‐1 double d. while (d != ‐1) { Mientras no el centinela suma = suma + d. Primer elemento cin >> d.          // Obtener primer carácter while (c != '. cin >> c. Finalización Fundamentos de la programación: Tipos e instrucciones II Página 359 Longitud de una secuencia de caracteres longitud. } Fundamentos de la programación: Tipos e instrucciones II Página 360 . Procesar elemento cout << "Valor (‐1 termina): ".cpp Centinela: carácter punto (. suma = 0. Siguiente elemento cin >> d. Inicialización cout << "Valor (‐1 termina): ".) int longitud() { int l = 0. char c.

Primer elemento while (c != '*') { Mientras no el centinela if (c == buscado) { cont++. cin >> c.close(). cin >> buscado. Fundamentos de la programación: Tipos e instrucciones II Página 361 Suma de los números de la secuencia suma2. int cont = 0. if (archivo.txt"). cout << "Cadena: ".cpp char buscado. } Fundamentos de la programación: Tipos e instrucciones II Página 362 . c. // Obtener el primero while (d != 0) { // Mientras no sea el centinela suma = suma + d. // Procesar el dato archivo >> d.is_open()) { archivo >> d.cpp Centinela: 0 int sumaSecuencia() { double d. // Obtener el siguiente } Luis Hernández Yáñez archivo.open("datos. // Archivo de entrada (lectura) archivo. } return suma.". cout << "Carácter a buscar: ". ifstream archivo. ¿Cuántas veces aparece un carácter en una cadena? Centinela: asterisco (*) cont. Siguiente elemento Luis Hernández Yáñez } cout << buscado << " aparece " << cont << " veces. suma = 0. Procesar elemento } cin >> c.

} return sumatorio.Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones II Página 363 sumatorio.. cout << "Sumatorio:" << suma(num). Último elemento de la secuencia: n } Fundamentos de la programación: Tipos e instrucciones II Página 364 .. } long long int suma(int n) { int sumatorio = 0. i++) { Luis Hernández Yáñez sumatorio = sumatorio + i. Suma de los números de la secuencia calculada: int main() { int num. for (int i = 1. i <= n.cpp Recurrencia: ei+1 = ei + 1 e1 = 1 1  2  3  4  5  6  7  8  . return 0. cin >> num. cout << "N = ".

 i++) { sumatorio = sumatorio + i. sumatorio = 0. int i = 1. long long int suma(int n) { int sumatorio = 0.. for (int i = 1. i <= n.. n 5 ? sumatorio 15 10 01 3 6 false i <= n i 2 51 4 3 6 2  1 1 5  4  3  2  1 4  3  2  1 3  2  1 true sumatorio += i.. Fundamentos de la programación: Tipos e instrucciones II Página 365 Definición Fi = Fi‐1 + Fi‐2 F1 = 0 F2 = 1 0 1 1 2 3 5 8 13 21 34 55 89 . la secuencia será: Luis Hernández Yáñez 0 1 1 2 3 5 8 13 21 34  Fundamentos de la programación: Tipos e instrucciones II Página 366 .. } . Secuencia Luis Hernández Yáñez i = i + 1.  ¿Fin de la secuencia? Primer número de Fibonacci mayor que un número dado Ese número de Fibonacci actúa como centinela Si num es 50.

. // 1º y 2º fib = fibMenos2 + fibMenos1. fibMenos1 = fib.. } num 100 ? 0 1 1 2 3 5 . // Calculamos el tercero cout << "Hasta: ". fibonacci. cin >> num. fibMenos2 = fibMenos1. fibMenos2 = 0. fib = fibMenos2 + fibMenos1. if (num >= 1) { // Ha de ser entero positivo cout << "0 1 ". fib = fibMenos2 + fibMenos1.. fib 5 2 3 1 ? fibMenos1 3 1 2 ? Luis Hernández Yáñez fibMenos2 2 1 0 ? Fundamentos de la programación: Tipos e instrucciones II Página 368 . // Actualizamos anteriores fibMenos1 = fib. el siguiente } Luis Hernández Yáñez } ¿Demasiados comentarios? Para no oscurecer el código.. fib. // para obtener. // Los dos primeros son <= num while (fib <= num) { // Mientras no mayor que num cout << fib << " ". mejor una explicación al principio Fundamentos de la programación: Tipos e instrucciones II Página 367 El bucle calcula adecuadamente la secuencia: while (fib <= num) { cout << fib << " ". fibMenos2 = fibMenos1.. fibMenos1 = 1.cpp Recorrido de la secuencia calculada int num.. // .

Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones II Página 369 Localización del primer elemento con una propiedad Inicialización 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 condición Finalización (tratar el elemento encontrado o indicar que no se ha encontrado) Elemento que se busca: satisfará una condición Dos condiciones de terminación del bucle: se encuentra / al final Luis Hernández Yáñez Variable lógica que indique si se ha encontrado Fundamentos de la programación: Tipos e instrucciones II Página 370 .

Localización del primer elemento con una propiedad Inicialización / encontrado = false. ¿Al final o true encontrado? false Obtener elemento ¿Encontrado? Luis Hernández Yáñez Finalización Fundamentos de la programación: Tipos e instrucciones II Página 371 Implementación con while Inicialización Inicialización Obtener el primer elemento Obtener 1º Mientras ni encontrado ni el centinela: Obtener el siguiente elemento ¿Encontrado true Finalización (¿encontrado?) o centinela? false Obtener siguiente Luis Hernández Yáñez Finalización Fundamentos de la programación: Tipos e instrucciones II Página 372 .

// Obtener el primer elemento while ((d != ‐1) && !encontrado) { // Mientras no sea el centinela y no se encuentre if (d > num) { // ¿Encontrado? encontrado = true. } else { Luis Hernández Yáñez cout << "Siguiente (‐1 para terminar): ". num. cout << "Encontrar primero mayor que: ". bool encontrado = false. cout << "Siguiente (‐1 para terminar): ". cin >> d.cpp Centinela: ‐1 double d. cin >> num. Primer número mayor que uno dado busca. // Obtener el siguiente elemento } } Fundamentos de la programación: Tipos e instrucciones II Página 373 Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones II Página 374 . cin >> d.

80 254.62 435. Colecciones homogéneas Un mismo tipo de dato para varios elementos:  Notas de los estudiantes de una clase  Ventas de cada día de la semana  Temperaturas de cada día del mes .. declaramos una tabla de N valores: Luis Hernández Yáñez ventas 125. vLun vMar vMie vJue vVie vSab vDom 125.00 0 1 2 3 4 5 6 Acceso directo A cada elemento se accede a través de su índice: ventas[4] accede al 5º elemento (contiene el valor 435.95 328..75..80 254.00 164..29 0.95 328.29 0.40 76. ventas[4] = 442. Datos de un mismo tipo base: Se usan como cualquier variable Fundamentos de la programación: Tipos e instrucciones II Página 376 . En lugar de declarar N variables.62 435.40 76.40 76.62 435..29 0.00 Índices 0 1 2 3 4 5 6 Fundamentos de la programación: Tipos e instrucciones II Página 375 Estructura secuencial Cada elemento se encuentra en una posición (índice):  Los índices son enteros positivos  El índice del primer elemento siempre es 0  Los índices se incrementan de uno en uno ventas 125.00 .80 254.00 164.95 328.00) Luis Hernández Yáñez cout << ventas[4].00 164..

cada una con su inicial en mayúscula Fundamentos de la programación: Tipos e instrucciones II Página 377 Declaración de variables arrays typedef typedef double tTemp[7]. typedef short int tDiasMes[12]. short int tDiasMes[12]. seguida de una o varias palabras. typedef tMoneda tCalderilla[15].. tempMax ? ? ? ? ? ? ? 0 1 2 3 4 5 6 tDiasMes diasMes. // Enumerado tMoneda Recuerda: Adoptamos el convenio de comenzar Luis Hernández Yáñez los nombres de tipo con una t minúscula. Ejemplos: tTemp tempMax. vocales ? ? ? ? ? 0 1 2 3 4 ventasFeb ? ? ? ? ? ? ? ? ? ? ? ? ? . typedef double tVentas[31]. ? tVentas ventasFeb.. diasMes ? ? ? ? ? ? ? ? ? ? ? ? 0 1 2 3 4 5 6 7 8 9 10 11 tVocales vocales. typedef char tVocales[5]. tipo nombre. Declaración de tipos de arrays typedef tipo_base nombre_tipo[tamaño]. typedef char tVocales[5]. Luis Hernández Yáñez 0 1 2 3 4 5 6 7 8 9 10 11 12 30 NO se inicializan los elementos automáticamente Fundamentos de la programación: Tipos e instrucciones II Página 378 . Ejemplos: typedef double tTemp[7]. typedef double tVentas[31].

. Luis Hernández Yáñez vocales[3] = 'o'. í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]. vocales 'a' 'e' 'i' 'o' 'u' 0 1 2 3 4 5 elementos. typedef char tVocales[5].. if (vocales[i] == 'e') . Fundamentos de la programación: Tipos e instrucciones II Página 380 .Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones II Página 379 nombre[índice] Cada elemento se accede a través de su índice (posición en el array) tVocales vocales.

. ¡IMPORTANTE! ¡No se comprueba si el índice es correcto! ¡Es responsabilidad del programador! const int Dim = 100. typedef double tVentas[Dim]. Índices válidos: enteros entre 0 y Dim‐1 ventas[0]  ventas[1]  ventas[2] . tVentas ventas.. ventas[98]  ventas[99] ¿Qué es ventas[100]? ¿O ventas[‐1]? ¿O ventas[132]? ¡Memoria de alguna otra variable del programa! Luis Hernández Yáñez Define los tamaños de los arrays con constantes Fundamentos de la programación: Tipos e instrucciones II Página 381 Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones II Página 382 .

for (int i = 0.96 8. Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones II Página 383 12..41 14.70 true false temp[5] 13.07 0 1 2 3 4 5 6 tTemp temp. total 23. i < Dias. i < Dias.40 10.07 media ? total+=temp[i] .. Arrays: tamaño fijo  Bucle de recorrido fijo (for) Ejemplo: Media de un array de temperaturas const int Dias = 7.40 0.44 Luis Hernández Yáñez i++ i 3 70 2 4 1 Fundamentos de la programación: Tipos e instrucciones II Página 384 . i++) { temp[0] 12. total = 0.36 31.65 temp[4] 13. double media. } media = total / Dias.. tTemp temp. total = 0.70 13.96 } temp[2] 8...62 12.65 13. Dias 7 for (int i = 0. temp[1] 10.40 total = total + temp[i].41 i<Dias temp[6] 14.00 43. i++) { total = total + temp[i].  Memoria .  .. double media.43 i = 0 temp[3] 11.43 11.79 84. typedef double tTemp[Dias].

cpp #include <iostream> using namespace std. i < Dias.  for (int i = 0. aunque internamente se usen los índices de 0 a 6 Fundamentos de la programación: Tipos e instrucciones II Página 385 double media(const tTemp temp) { double med. i++) { // Recorrido del array total = total + temp[i]. Luis Hernández Yáñez return 0. int main() { tTemp temp. double media(const tTemp temp). for (int i = 0. i++) { // Recorrido del array cout << "Temperatura del día " << i + 1 << ": ". mediatemp. cin >> temp[i]. return med.. } cout << "Temperatura media: " << media(temp) << endl. typedef double tTemp[Dias]. } med = total / Dias. const int Dias = 7. i < Dias. } Los usuarios usan de 1 a 7 para numerar los días .. total = 0. La interfaz debe aproximarse a los usuarios. } Los arrays se pasan a las funciones como constantes Las funciones no pueden devolver arrays Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones II Página 386 .

const int Cuantas = 15. euro } tMoneda. medio_euro. Fundamentos de la programación: Tipos e instrucciones II Página 387 Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones II Página 388 . veinte_centimos.. // Devuelve la cadena correspondiente al valor de moneda tCalderilla bolsillo. bolsillo[2] = medio_euro. string aCadena(tMoneda moneda). typedef enum { centimo. bolsillo[4] = centimo. bolsillo[3] = euro. bolsillo[1] = cinco_centimos.. moneda++) cout << aCadena(bolsillo[moneda]) << endl. typedef tMoneda tCalderilla[Cuantas]. Luis Hernández Yáñez for (int moneda = 0. diez_centimos. . cinco_centimos. moneda < Cuantas. // Exactamente llevo Cuantas monedas bolsillo[0] = euro. dos_centimos.

} } Luis Hernández Yáñez if (!encontrado) { ind = ‐1. } return ind. buscaarray.  int ind = 0. } Fundamentos de la programación: Tipos e instrucciones II Página 389 Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones II Página 390 .cpp ¿Qué día las ventas superaron los 1. } else { ind++. int busca(const tVentas ventas) { // Índice del primer elemento mayor que 1000 (‐1 si no hay) bool encontrado = false. while ((ind < Dias) && !encontrado) { // Esquema de búsqueda if (ventas[ind] > 1000) { encontrado = true.000 €? const int Dias = 365. // Año no bisiesto typedef double tVentas[Dias].

 i++) { array2[i] = array1[i]. } Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones II Página 392 . La capacidad de un array no puede ser alterada en la ejecución El tamaño de un array es una decisión de diseño:  En ocasiones será fácil (días de la semana)  Cuando pueda variar ha de estimarse un tamaño Ni corto ni con mucho desperdicio (posiciones sin usar) STL (Standard Template Library) de C++: Colecciones más eficientes cuyo tamaño puede variar Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones II Página 391 No se pueden copiar dos arrays (del mismo tipo) con asignación: array2 = array1. // ¡¡¡ NO COPIA LOS ELEMENTOS !!! Han de copiarse los elementos uno a uno: for (int i = 0. i < N.

const int Max = 100....Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones II Página 393 Puede que no necesitemos todas las posiciones de un array. La dimensión del array será el máximo de elementos Pero podremos tener menos elementos del máximo Necesitamos un contador de elementos.. tArray lista. typedef double tArray[Max]. contador: indica cuántas posiciones del array se utilizan Sólo accederemos a las posiciones entre 0 y contador‐1 Las demás posiciones no contienen información del programa Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones II Página 394 . int contador = 0.

. Luis Hernández Yáñez while ((valor != ‐1) && (contador < Max)) { lista[contador] = valor.. } else { cout << "¡No se pudo abrir el archivo!" << endl. contador). double media(const tArray lista.is_open()) { archivo >> valor. typedef double tArray[Max]. } double media(const tArray lista. return med. lista. cout << "Media de los elementos de la lista: " << med << endl. archivo >> valor. for (int ind = 0. #include <fstream> const int Max = 100. int cont) { double med.open("lista. } Fundamentos de la programación: Tipos e instrucciones II Página 396 . } . archivo.txt"). med. contador++. ifstream archivo. double valor. int main() { tArray lista. int contador = 0. ind < cont. if (archivo.close(). } return 0. Fundamentos de la programación: Tipos e instrucciones II Página 395 archivo. } Sólo recorremos hasta cont‐1 Luis Hernández Yáñez med = total / cont. total = 0. ind++) { total = total + lista[ind].cpp #include <iostream> using namespace std. med = media(lista. int cont).

Fundamentos de la programación: Tipos e instrucciones II Página 397 . Compartir igual (Share alike): La explotación autorizada incluye la creación de obras derivadas siempre que mantengan la misma licencia al ser divulgadas. Este documento tiene establecidas las siguientes: Reconocimiento (Attribution): En cualquier explotación de la obra autorizada por la licencia hará falta reconocer la autoría. Licencia CC (Creative Commons) Este tipo de licencias ofrecen algunos derechos a terceras personas bajo ciertas condiciones. Luis Hernández Yáñez Pulsa en la imagen de arriba a la derecha para saber más. No comercial (Non commercial): La explotación de la obra queda limitada a usos no comerciales.

= += ‐= *= /= %= c = 3. + ‐ int a = 5. ++ ‐‐ (prefijos) ! el resultado es Exp1. Fundamentos de la programación  3A Grado en Ingeniería Informática Grado en Ingeniería del Software Grado en Ingeniería de Computadores Luis Hernández Yáñez Facultad de Informática Universidad Complutense Expresión condicional Condición ? Exp1 : Exp2 Dos alternativas — Condición: Expresión lógica Operadores (prioridad) ++ ‐‐ (postfijos) — Exp1 y Exp2: Expresiones Llamadas a funciones Moldes Si Condición se evalúa a true. c. Fundamentos de la programación: Tipos e instrucciones II (Anexo I) Página 399 . b = 3. ‐ (cambio de signo) si Condición se evalúa a false. * / % el resultado es Exp2. && c = (  8 == 10) ? 2 : 3. < <= > >= == != c = (a + b == 10) ? 2 : 3. || Luis Hernández Yáñez ?: c =     false ? 2 : 3.

Equivalencia con un if‐else c = (a + b == 10) ? 2 : 3. } Luis Hernández Yáñez "SS" else if (nota >= 5) { cout << "AP". else c = 3. } true >= 5 "AP" else if (nota >= 9) { cout << "SB". false if (nota == 10) { cout << "MH". si nota >= 5 entonces AP >= 9 true "SB" si no SS false true double nota... Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones II (Anexo I) Página 400 Escala if .. si nota >= 7 entonces NT false si no. } false else if (nota >= 7) { cout << "NT".. } Fundamentos de la programación: Tipos e instrucciones II (Anexo I) Página 401 . else if . } else { cout << "SS". >= 7 "NT" cin >> nota. Se pueden concatenar: cout << (nota == 10 ? "MH" : (nota >= 9 ? "SB" :  (nota >= 7 ? "NT" : (nota >= 5 ? "AP" : "SS")))) Esto es equivalente a la escala if‐else‐if de la siguiente sección. si nota >= 9 entonces SB == 10 "MH" si no. equivalente cout << (nota == 10 ? "MH" : (nota >= 9 ? "SB" :  (nota >= 7 ? "NT" : (nota >= 5 ? "AP" : "SS")))) Si nota == 10 entonces MH true si no. Es equivalente a: if (a + b == 10) c = 2.

Fundamentos de la programación 3E Grado en Ingeniería Informática Grado en Ingeniería del Software Grado en Ingeniería de Computadores Luis Hernández Yáñez Facultad de Informática Universidad Complutense Recorridos 404 Un aparcamiento 405 ¿Paréntesis bien emparejados? 409 ¿Dos secuencias iguales? 412 Números primos menores que N 413 Búsquedas 417 Búsqueda de un número en un archivo 419 Búsquedas en secuencias ordenadas 420 Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones II (Anexo II) .

S = Sale un coche ¿Cuántos coches quedan al final de la jornada? Varios casos.Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones II (Anexo II) Página 404 Secuencia de caracteres E y S en archivo E = Entra un coche. cada uno en una línea y terminado en punto Final: línea sólo con punto Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones II (Anexo II) Página 405 .

} .. char c. #include <fstream> int main() { int coches.txt"). } Fundamentos de la programación: Tipos e instrucciones II (Anexo II) Página 406 while (!terminar) { archivo >> c. while (c != '.is_open()) { cout << "¡No se ha podido abrir el archivo!" << endl.. if (c == 'E') { coches++. } else { coches = 0.. if (!archivo. archivo. } else { // Recorrido. #include <iostream> using namespace std.') { // Recorrido de la secuencia cout << c.open("parking. archivo. } else if (c == 'S') { coches‐‐. bool terminar = false. if (c == '. Fundamentos de la programación: Tipos e instrucciones II (Anexo II) Página 407 . } Luis Hernández Yáñez archivo >> c..') { // . como primer carácter? (centinela) terminar = true.close(). Luis Hernández Yáñez } return 0. ifstream archivo.

con su pareja Secuencia de caracteres terminada en # y con parejas de paréntesis: ab(c(de)fgh((i(jk))lmn)op)(rs)# Contador del nivel de anidamiento: Al encontrar '(' incrementamos – Al encontrar ')' decrementamos Al terminar. parking. } else { cout << endl << "Error: Más salidas que entradas!". } } Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones II (Anexo II) Página 408 Cada paréntesis.". el contador deberá tener el valor 0 Errores: — Contador ‐1: paréntesis de cierre sin uno de apertura pendiente abc)de(fgh(ij))# Luis Hernández Yáñez — Contador termina con un valor positivo Más paréntesis de apertura que de cierre Algún paréntesis sin cerrar: (a(b(cd(e)f)gh(i))jk# Fundamentos de la programación: Tipos e instrucciones II (Anexo II) Página 409 . } cout << endl.cpp if (coches >= 0) { cout << endl << "Quedan " << coches << " coches.

cpp if (error) { cout << "Error: cierre sin apertura (pos. } } Fundamentos de la programación: Tipos e instrucciones II (Anexo II) Página 410 parentesis. Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones II (Anexo II) Página 411 . } else if (c == ')') { anidamiento‐‐. } else { cout << "Correcto". } if (anidamiento < 0) { error = true. int anidamiento = 0. cin >> c. pos = 0. " << pos  << ")". } Luis Hernández Yáñez if (!error) { cin >> c. } else if (anidamiento > 0) { cout << "Error: Apertura sin cierre". while ((c != '#') && !error) { pos++. Un error puede interrumpir el recorrido: char c. if (c == '(') { anidamiento++. bool error = false. } cout << endl.

while (!primo(candidato)) { // Siguiente primo candidato++.txt Luis Hernández Yáñez sec1. // Mostrar número primo candidato++. final = ((d1 == 0) || (d2 == 0)). bool primo(int n). sec2. if (num > 1) { candidato = 2.txt"). d2. } Fundamentos de la programación: Tipos e instrucciones II (Anexo II) Página 413 . sec2. double d1. sec1. return sonIguales.txt").txt por secuencia3. // El 1 no se considera un número primo while (candidato < num) { cout << candidato << " ". } Fundamentos de la programación: Tipos e instrucciones II (Anexo II) Página 412 primos. sec1 >> d1. // Al menos estarán los centinelas (0) while (sonIguales && !final) { sonIguales = (d1 == d2).cpp Secuencia calculada: números divisibles sólo por 1 y ellos mismos (< N) #include <iostream> using namespace std.txt para comprobar otros casos sec2.open("secuencia2.close(). } } Cambia secuencia2.cpp bool iguales() { bool sonIguales = true. candidato.open("secuencia1. y por secuencia4. ifstream sec1. sec2 >> d2. cout << "Entero en el que parar (>1): ". bool final = false. if (!final) { sec1 >> d1. int main() { int num. iguales. sec2 >> d2. } Luis Hernández Yáñez } } return 0. cin >> num.close().

sólo pueden ser divisibles por impares. cout << candidato << " ". // Seguimos con el 3.   // Mostrar número primo candidato = candidato + 2. } } . } Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones II (Anexo II) Página 414 primos2. for (int i = 2.  // Sólo probamos impares while (!primo(candidato)) { // Siguiente número primo candidato = candidato + 2. i <= n / 2. i <= n ‐ 1. Fundamentos de la programación: Tipos e instrucciones II (Anexo II) Página 415 . no pueden ser divisibles por ninguno mayor que su mitad candidato = 2. for (int i = 3. bool primo(int n) { bool esPrimo = true. bool primo(int n) { bool esPrimo = true. i++) { if (n % i == 0) { esPrimo = false.. i = i + 2) { Luis Hernández Yáñez if (n % i == 0) { esPrimo = false. // Es divisible por i } } return esPrimo.. // Es divisible por i } }.. // Mostrar el número primo 2 candidato++. que es primo while (candidato < num) { cout << candidato << " ".cpp Mejoras: probar sólo impares..

while ((i <= n / 2) && esPrimo) { if (n % i == 0) { esPrimo = false. int i = 3. } return esPrimo. } i = i + 2. } Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones II (Anexo II) Página 416 Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones II (Anexo II) Página 417 .cpp Otra mejora más: Paramos al encontrar el primer divisor bool primo(int n) { bool esPrimo = true. primos3.

cin >> num. archivo. Centinela } if (!encontrado) { linea = ‐1. bool encontrado = false.is_open()) { linea = ‐1. cout << "Valor a localizar: ". if (linea != ‐1) { cout << "Encontrado (línea " << linea << ")" << endl. } else { Luis Hernández Yáñez cout << "No encontrado" << endl.txt"). } return 0. // Devuelve la línea en la que se encuentra o ‐1 si no está int main() { int num. if (i == n) { encontrado = true. } return linea.close(). if (!archivo.open("enteros. ifstream archivo. } else { archivo >> i. while ((i != 0) && !encontrado) { linea++. } archivo >> i. Luis Hernández Yáñez } archivo. linea = busca(num).cpp using namespace std. #include <iostream> buscaarch. linea = 0. #include <fstream> int busca(int n). } Fundamentos de la programación: Tipos e instrucciones II (Anexo II) Página 419 . } Fundamentos de la programación: Tipos e instrucciones II (Anexo II) Página 418 int busca(int n) { int i. linea.

Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones II (Anexo II) Página 420 Secuencia ordenada de menor a mayor: buscaord.cpp paramos al encontrar uno mayor o igual al buscado Los que resten serán seguro mayores: ¡no puede estar el buscado! cout << "Valor a localizar: ". Fundamentos de la programación: Tipos e instrucciones II (Anexo II) Página 421 . } if (i == num) { cout << "Encontrado (pos. archivo >> i. archivo >> i. while ((i != 0) && (i < num)) { cont++.close(). archivo.: " << cont << ")". cin >> num. } cout << endl. } else { Luis Hernández Yáñez cout << "No encontrado".

. archivo >> i. num 9 ? (i != 0)  false && (i < num) i 9 5 ? 2 true cont++. Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones II (Anexo II) Página 422 Si el elemento no está: evitamos buscar en el resto de la secuencia No se procesa 2 5 9 15 16 24 41 73 78 82 123 153 159 ... num 10 ? (i != 0)  false && (i < num) i 5 2 9 ? 15 true cont++. Si el elemento está: procesamiento similar a secuencias desordenadas 2 5 9 15 16 24 41 73 78 82 123 153 159 . archivo >> i. archivo >> i. el resto de la secuencia archivo >> i. Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones II (Anexo II) Página 423 ..

Fundamentos de la programación: Tipos e instrucciones II (Anexo II) Página 424 . Luis Hernández Yáñez Pulsa en la imagen de arriba a la derecha para saber más. Licencia CC (Creative Commons) Este tipo de licencias ofrecen algunos derechos a terceras personas bajo ciertas condiciones. No comercial (Non commercial): La explotación de la obra queda limitada a usos no comerciales. Compartir igual (Share alike): La explotación autorizada incluye la creación de obras derivadas siempre que mantengan la misma licencia al ser divulgadas. Este documento tiene establecidas las siguientes: Reconocimiento (Attribution): En cualquier explotación de la obra autorizada por la licencia hará falta reconocer la autoría.

Fundamentos de la programación 4 Grado en Ingeniería Informática Grado en Ingeniería del Software Grado en Ingeniería de Computadores Luis Hernández Yáñez Facultad de Informática Universidad Complutense Diseño descendente: Tareas y subtareas  427 Subprogramas 434 Subprogramas y datos 441 Parámetros 446 Argumentos 451 Resultado de la función 467 Prototipos 473 Ejemplos completos 475 Funciones de operador 477 Diseño descendente (un ejemplo) 480 Precondiciones y postcondiciones 490 Luis Hernández Yáñez Fundamentos de la programación: La abstracción procedimental .

Luis Hernández Yáñez Fundamentos de la programación: La abstracción procedimental Página 427 Refinamientos sucesivos Tareas que ha de realizar un programa: Se pueden dividir en subtareas más sencillas Subtareas: También se pueden dividir en otras más sencillas...  Refinamientos sucesivos Diseño en sucesivos pasos en los se amplía el detalle Ejemplos:  Dibujar Luis Hernández Yáñez  Mostrar la cadena HOLA MAMA en letras gigantes Fundamentos de la programación: La abstracción procedimental Página 428 .

Dibujar 1. Dibujar 4 tareas.1. Dibujar 2. Dibujar Luis Hernández Yáñez 3. Dibujar Luis Hernández Yáñez Fundamentos de la programación: La abstracción procedimental Página 430 . Dibujar 2. Dibujar 2. Dibujar Misma tarea 3. Dibujar Fundamentos de la programación: La abstracción procedimental Página 429 1.1. Dibujar 2. Dibujar 2. 1. pero dos de ellas son iguales 2. Dibujar Nos basta con saber cómo dibujar: 3. Dibujar REFINAMIENTO 2.2.2.

dibujarSecantes(). } void dibujarLinea() { ... Dibujar  Dibujar  } int main() { dibujarCirculo().. return 0... void dibujarCirculo() { . Luis Hernández Yáñez dibujarTriangulo(). dibujarLinea(). } Dibujar  Dibujar  Dibujar  void dibujarTriangulo() { dibujarSecantes().. } Fundamentos de la programación: La abstracción procedimental Página 431 Mostrar la cadena HOLA MAMA en letras gigantes Mostrar HOLA MAMA Mostrar HOLA Espacio en blanco Mostrar MAMA H O L A M A Tareas básicas Luis Hernández Yáñez H O L A Espacio en blanco  M Fundamentos de la programación: La abstracción procedimental Página 432 . } void dibujarSecantes() Dibujar  { .

... mostrarM().} Fundamentos de la programación: La abstracción procedimental Página 433 Luis Hernández Yáñez Fundamentos de la programación: La abstracción procedimental Página 434 . cout << "*   *" << endl. { . void mostrarA() } { . void mostrarL() mostrarA(). void mostrarM() cout << "*   *" << endl << endl. mostrarA().. cout << "*****" << endl << endl. cout << endl << endl << endl.} } int main() { void mostrarO() { mostrarH(). Luis Hernández Yáñez { . } cout << "*****" << endl. } return 0. void mostrarH() { void espaciosEnBlanco() { cout << "*   *" << endl. mostrarO(). cout << "*   *" << endl. espaciosEnBlanco(). cout << "*   *" << endl. mostrarM().. cout << "*****" << endl. } mostrarA().. cout << "*   *" << endl. cout << "*   *" << endl. mostrarL().

Subprogramas
Pequeños programas dentro de otros programas
 Unidades de ejecución independientes
 Encapsulan código y datos
 Se comunican con otros subprogramas (datos)
Subrutinas, procedimientos, funciones, acciones, ...
 Realizan tareas individuales del programa
 Funcionalidad concreta, identificable y coherente (diseño)
 Se ejecutan de principio a fin cuando se llaman (invocan)
 Terminan devolviendo el control al punto de llamada
Luis Hernández Yáñez

Aumentan el nivel de abstracción del programa
Facilitan la prueba, la depuración y el mantenimiento

Fundamentos de la programación: La abstracción procedimental Página 435

Flujo de ejecución
int main()
{
mostrarH();

mostrarO();
... 
}

void mostrarH()
{

}
...

void mostrarO()
Luis Hernández Yáñez

{
 }
...

...

Fundamentos de la programación: La abstracción procedimental Página 436

Subprogramas en C++
Forma general de un subprograma en C++:
tipo nombre(parámetros) // Cabecera
{
// Cuerpo
}

 Tipo de dato que devuelve el subprograma como resultado
 Parámetros para la comunicación con el exterior
 Cuerpo: ¡Un bloque de código!
Luis Hernández Yáñez

Fundamentos de la programación: La abstracción procedimental Página 437

Tipos de subprogramas
Procedimientos (acciones):
NO devuelven ningún resultado de su ejecución con return
Tipo: void
Llamada: instrucción independiente
mostrarH();

Funciones:
SÍ devuelven un resultado con la instrucción return
Tipo distinto de void
Llamada: dentro de cualquier expresión
x = 12 * y + cuadrado(20) ‐ 3;
Luis Hernández Yáñez

Se sustituye en la expresión por el valor que devuelve
¡Ya venimos utilizando funciones desde el Tema 2!

Fundamentos de la programación: La abstracción procedimental Página 438

Funciones
Subprogramas de tipo distinto de void
...
int menu() int main()
{
{
int op;
cout << "1 – Editar" << endl; ...
cout << "2 – Combinar" << endl; int opcion;
cout << "3 – Publicar" << endl; opcion = menu() ;
cout << "0 – Cancelar" << endl; ...
cout << "Elija: ";
cin >> op;
return op;
}
Luis Hernández Yáñez

Fundamentos de la programación: La abstracción procedimental Página 439

Procedimientos
Subprogramas de tipo void
...
void menu() int main()
{
{
int op;
cout << "1 – Editar" << endl; ...
cout << "2 – Combinar" << endl; menu();
cout << "0 – Cancelar" << endl; ...
cout << "Opción: ";
cin >> op;
if (op == 1) {
editar();
}
Luis Hernández Yáñez

else if (op == 2) {
combinar();
}
}

Fundamentos de la programación: La abstracción procedimental Página 440

Luis Hernández Yáñez

Fundamentos de la programación: La abstracción procedimental Página 441

De uso exclusivo del subprograma
tipo nombre(parámetros) // Cabecera
{
Declaraciones locales // Cuerpo
}

 Declaraciones locales de tipos, constantes y variables
Dentro del cuerpo del subprograma

 Parámetros declarados en la cabecera del subprograma
Comunicación del subprograma con otros subprogramas
Luis Hernández Yáñez

Fundamentos de la programación: La abstracción procedimental Página 442

Datos en los programas
 Datos globales: declarados fuera de todos los subprogramas
Existen durante toda la ejecución del programa
 Datos locales: declarados en algún subprograma
Existen sólo durante la ejecución del subprograma

Ámbito y visibilidad de los datos Tema 3
— Ámbito de los datos globales: resto del programa
Se conocen dentro de los subprogramas que siguen
— Ámbito de los datos locales: resto del subprograma
No se conocen fuera del subprograma
Luis Hernández Yáñez

— Visibilidad de los datos
Datos locales a un bloque ocultan otros externos homónimos

Fundamentos de la programación: La abstracción procedimental Página 443

#include <iostream>
using namespace std;

const int MAX = 100;
double ingresos; Datos globales op de proc()
es distinta
... de op de main()
void proc() {
int op;
Datos locales a proc()
double ingresos;
... Se conocen MAX (global), op (local)
} e ingresos (local que oculta la global)

int main() {
int op;
Datos locales a main()
Luis Hernández Yáñez

...
return 0; Se conocen MAX (global), op (local)
} e ingresos (global)

Fundamentos de la programación: La abstracción procedimental Página 444

Sobre el uso de datos globales en los subprogramas
NO SE DEBEN USAR datos globales en subprogramas
 ¿Necesidad de datos externos?
Define parámetros en el subprograma
Los datos externos se pasan como argumentos en la llamada
 Uso de datos globales en los subprogramas:
Riesgo de efectos laterales
Modificación inadvertida de esos datos afectando otros sitios

Excepciones:
 Constantes globales (valores inalterables)
Luis Hernández Yáñez

 Tipos globales (necesarios en varios subprogramas)

Fundamentos de la programación: La abstracción procedimental Página 445
Luis Hernández Yáñez

Fundamentos de la programación: La abstracción procedimental Página 446

Datos de entrada, datos de salida y datos de entrada/salida

Datos de entrada: Aceptados Subprograma
Subprograma que dado un número x
muestra en la pantalla su cuadrado: cuadrado()
5

Datos de salida: Devueltos Subprograma
Subprograma que dado un número x y (=x2)
devuelve su cuadrado: cuadrado()
5

Datos de entrada/salida:
Subprograma
Aceptados y modificados
Luis Hernández Yáñez

Subprograma que dada una variable x x
numérica la eleva al cuadrado: cuadrado()

Fundamentos de la programación: La abstracción procedimental Página 447

Declaración de parámetros
Sólo dos clases de parámetros en C++:
— Sólo de entrada (por valor)

— De salida (sólo salida o E/S) (por referencia / por variable)

Lista de parámetros formales
Entre los paréntesis de la cabecera del subprograma
tipo nombre(parámetros)

&
De salida
Luis Hernández Yáñez

parámetros tipo identificador

,

Fundamentos de la programación: La abstracción procedimental Página 448

Reciben copias de los argumentos usados en la llamada
int cuadrado(int num)
double potencia(double base, int exp)
void muestra(string nombre, int edad, string nif)
void proc(char c, int x, double a, bool b)
Reciben sus valores en la llamada del subprograma
Argumentos: Expresiones en general
Variables, constantes, literales, llamadas a función, operaciones
Se destruyen al terminar la ejecución del subprograma
Luis Hernández Yáñez

¡Atención! Los arrays se pasan por valor como constantes:
double media(const tArray lista)

Fundamentos de la programación: La abstracción procedimental Página 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 parámetros por valor en las funciones!
Sólo en procedimientos
Puede haber tanto por valor como por referencia

¡Atención! Los arrays se pasan por referencia sin utilizar &
Luis Hernández Yáñez

void insertar(tArray lista, int &contador, double item)
El argumento de lista (variable tArray) quedará modificado

Fundamentos de la programación: La abstracción procedimental Página 450

Luis Hernández Yáñez

Fundamentos de la programación: La abstracción procedimental Página 451

nombre(argumentos)
— Tantos argumentos como parámetros y en el mismo orden
— Concordancia de tipos argumento‐parámetro
— Por valor: Expresiones válidas (se pasa el resultado)
— Por referencia: ¡Sólo variables!

Se copian los valores de las expresiones pasadas por valor
en los correspondientes parámetros

Se hacen corresponder los argumentos pasados por referencia
(variables) con sus correspondientes parámetros
Luis Hernández Yáñez

Fundamentos de la programación: La abstracción procedimental Página 452

Expresiones válidas con concordancia de tipo:
void proc(int x, double a)  proc(23 * 4 / 7, 13.5);

 double d = 3; 
proc(12, d);

 double d = 3; 
int i = 124; 
proc(i, 33 * d);

 double d = 3; 
int i = 124; 
proc(cuad(20) * 34 + i, i * d);
Luis Hernández Yáñez

Fundamentos de la programación: La abstracción procedimental Página 453

void proc(int x, double a) Memoria

{ ... } i 124
d 3.0
int main() ...
{
int i = 124;
...
double  d = 3; x 124
proc(i, 33 * d); a 99.0
... ...

return 0;
Luis Hernández Yáñez

}

Fundamentos de la programación: La abstracción procedimental Página 454

void proc(int &x, double &a) Memoria
x i 124
{ ... }
a d 3.0
int main() ...
{
int i = 124;
double  d = 3;
proc(i, d);
...

return 0;
Luis Hernández Yáñez

}

Fundamentos de la programación: La abstracción procedimental Página 455

Dadas las siguientes declaraciones:
int i;
double d;
void proc(int x, double &a);
¿Qué pasos de argumentos son correctos? ¿Por qué no?
proc(3, i, d);  Nº de argumentos ≠ Nº de pará metros
proc(i, d); 
proc(3 * i + 12, d); 
proc(i, 23);  Parámetro por referencia  ¡variable!
proc(d, i);  ¡Argumento double para parámetro int!
proc(3.5, d);  ¡Argumento double para parámetro int!
Luis Hernández Yáñez

proc(i);  Nº de argumentos ≠ Nº de pará metros

Fundamentos de la programación: La abstracción procedimental Página 456

 i++) { . resto. cociente. for (int j = 1.. cout << i << " entre " << j << " da un cociente de " << cociente << " y un resto de " << resto << endl. } Fundamentos de la programación: La abstracción procedimental Página 457 . i <= 4. j <= 4. int &rem) { // Divide op1 entre op2 y devuelve el cociente y el resto div = op1 / op2. j. resto. int op2.. j.. j++) { j 1 for (int i = 1. Memoria } cociente ? resto ? int main() { int cociente. resto).. void divide(int op1. void divide(int op1. } Fundamentos de la programación: La abstracción procedimental Página 458 . } } Luis Hernández Yáñez return 0.. j <= 4. int &rem) { // Divide op1 entre op2 y devuelve el cociente y el resto div = op1 / op2. j++) { for (int i = 1. int &div. int &div. } } Luis Hernández Yáñez return 0. cociente. i++) { divide(i. rem = op1 % op2. i 1 for (int j = 1... } int main() { int cociente. .. rem = op1 % op2. divide(i. resto). . i <= 4. int op2.

i 1 for (int j = 1. i++) { ... i <= 4. int &rem) { // Divide op1 entre op2 y devuelve el cociente y el resto div = op1 / op2.. resto.. } op1 1 } op2 1 Luis Hernández Yáñez return 0.. cociente. Memoria } div cociente 1 rem resto 0 int main() { int cociente. int &rem) { // Divide op1 entre op2 y devuelve el cociente y el resto div = op1 / op2. } op1 1 } op2 1 Luis Hernández Yáñez return 0. divide(i. void divide(int op1. j++) { j 1 for (int i = 1.. int op2. cociente.. void divide(int op1. .. } Fundamentos de la programación: La abstracción procedimental Página 459 . j <= 4. . j. i <= 4. rem = op1 % op2. resto). } Fundamentos de la programación: La abstracción procedimental Página 460 .. j++) { j 1 for (int i = 1. Memoria } div cociente ? rem resto ? int main() { int cociente.. j <= 4. . rem = op1 % op2... divide(i. .. i++) { . resto.. . int &div. int &div. int op2.. resto). j. i 1 for (int j = 1..

 i++) { . num2).. resto. Luis Hernández Yáñez cout << "Ahora el valor 1 es " << num1  << " y el valor 2 es " << num2 << endl. return 0. . Memoria } cociente 1 resto 0 int main() { int cociente. valor1 num1 13. divide(i. j++) { j 1 for (int i = 1. int &rem) { // Divide op1 entre op2 y devuelve el cociente y el resto div = op1 / op2. void intercambia(double &valor1.14 cin >> num2.. int &div.. // Variable local (temporal) tmp = valor1... int main() { double num1. Memoria de main() cin >> num1. } } Luis Hernández Yáñez return 0. cociente. num2. . valor2 num2 317. void divide(int op1.. tmp ? } . } Fundamentos de la programación: La abstracción procedimental Página 461 . j <= 4... cout << "Valor 1: ". Memoria temporal valor1 = valor2. . del procedimiento valor2 = tmp. } Fundamentos de la programación: La abstracción procedimental Página 462 .. rem = op1 % op2. i 1 for (int j = 1. intercambia(num1. resto). int op2. double &valor2) { // Intercambia los valores double tmp. j..6 cout << "Valor 2: ".. i <= 4..

 cent5. euros. " << cent10 << " x 10c. cent20. double pago. int &cent2. int euros. int &cent10.0 * (pago ‐ precio) + 0. cambio(precio. cantidad = cantidad % 10. Explicación en el libro de cent20 = cantidad / 20. cantidad = cambio % 100. cout << "Pago: ". int &euros. double pago. // Prototipo void cambio(double precio.. cent50.. int &cent50. cent10.. pago. int &cent20.. cantidad = cantidad % 5. cin >> pago.   return 0. cent2. int &cent1) { if (pago < precio) { // Cantidad insuficiente cout << "Error: El pago es inferior al precio" << endl. cent5  = cantidad / 5. int &cent5. int &cent1). cent20. } else { int cantidad = int(100." << endl. cout << "Cambio: " << euros << " euros. " << cent50 << " x 50c. int main() { double precio. cent50 = cantidad / 50. int &cent2. cantidad = cantidad % 50.. cent10. . " << cent2 << " x 2c. Adams/Leestma/Nyhoff cent10 = cantidad / 10. cent1. cantidad = cantidad % 20. cent5. int &cent10. cout << "Precio: ". int &cent5..5). int &cent20. cent1). " << cent20 << " x 20c. int &euros. y " Luis Hernández Yáñez << cent1 << " x 1c. Luis Hernández Yáñez cent2  = cantidad / 2. cent50. } } Fundamentos de la programación: La abstracción procedimental Página 464 . cin >> precio. cent2. cent1  = cantidad % 2. euros  = cantidad / 100. } Fundamentos de la programación: La abstracción procedimental Página 463 void cambio(double precio. pago. " << cent5 << " x 5c. int &cent50.

 cent2. cent20... int &cent1.. Fundamentos de la programación: La abstracción procedimental Página 465 cambio. double pago. pago. cambio(precio. int &cent10.. cent2. En los subprogramas se pueden detectar errores Errores que impiden realizar los cálculos: void cambio(double precio. cent50. int &cent50. bool &error) { if (pago < precio) { // Cantidad insuficiente Luis Hernández Yáñez error = true. euros. int euros.. cent5.. cent10. int &cent2.  ¿Informar al usuario?  ¿Volver a pedir los datos?  Etcétera int main() { double precio. int &cent20. int &cent20. int &cent50. error). cent20. int &cent10. } .. } else { . cent10. int &euros.cpp Al volver de la llamada se decide qué hacer si ha habido error. cent1. int &cent2. cout << "Pago: ". cout << "Precio: ". int &cent5. cin >> precio. . cent50. cent5. int &cent5. cent1. int &cent1) { if (pago < precio) { // Cantidad insuficiente cout << "Error: El pago es inferior al precio" << endl. double pago. int &euros. } else { error = false. bool error. Fundamentos de la programación: La abstracción procedimental Página 466 . Luis Hernández Yáñez if (error) { cout << "Error: El pago es inferior al precio" << endl. pago. ¿Debe el subprograma notificar al usuario o al programa?  Mejor notificarlo al punto de llamada y allí decidir qué hacer void cambio(double precio.. cin >> pago.

cout << 2 * cuad(16).Luis Hernández Yáñez Fundamentos de la programación: La abstracción procedimental Página 467 Una función ha de devolver un resultado La función ha de terminar su ejecución devolviendo el resultado La instrucción return: — Devuelve el dato que se indica a continuación como resultado — Termina la ejecución de la función El dato devuelto sustituye a la llamada de la función en la expresión int cuad(int x) { int main() { return x * x. x = x * x. } Esta instrucción return 0. 256 Luis Hernández Yáñez no se ejecutará nunca } Fundamentos de la programación: La abstracción procedimental Página 468 .

} Fundamentos de la programación: La abstracción procedimental Página 469 int compara(int val1.. } else { for (int i = 1. cout << "Factorial de " << num << ": " << factorial(num) << endl. cin >> num. i++) { Luis Hernández Yáñez fact = fact * i. 0 si iguales. int val2) { // ‐1 si val1 < val2.cpp Factorial (N) = 1  x  2  x  3  x . // Prototipo int main() { int num.  } else if (val1 < val2) { return ‐1.. if (n < 0) { fact = 0. cout << "Num: ". i <= n. ¡3 puntos de salida! } else { return 1. } long long int factorial(int n) { long long int fact = 1. return 0. factorial. } } return fact. } } Luis Hernández Yáñez Fundamentos de la programación: La abstracción procedimental Página 470 . +1 si val1 > val2 if (val1 == val2) { return 0. x  (N‐2)  x  (N‐1)  x  N long long int factorial(int n).

} else if (val1 < val2) { resultado = ‐1. +1 si val1 > val2 int resultado. int val2) { // ‐1 si val1 < val2. 0 si iguales. codifica los subprogramas con un único punto de salida Fundamentos de la programación: La abstracción procedimental Página 472 . if (val1 == val2) { resultado = 0. Punto de salida único Luis Hernández Yáñez } Fundamentos de la programación: La abstracción procedimental Página 471 Procedimientos (tipo void): — Al encontrar la llave de cierre que termina el subprograma o — Al encontrar una instrucción return (sin resultado) Funciones (tipo distinto de void): — SÓLO al encontrar una instrucción return (con resultado) Nuestros subprogramas siempre terminarán al final:  No usaremos return en los procedimientos  Funciones: sólo un return y estará al final Luis Hernández Yáñez Para facilitar la depuración y el mantenimiento. int compara(int val1.  } return resultado. } else { resultado = 1.

. que no hay que prototipar int cuad(int x). void mostrarM(). Fundamentos de la programación: La abstracción procedimental Página 474 .Luis Hernández Yáñez Fundamentos de la programación: La abstracción procedimental Página 473 ¿Dónde los ponemos? ¿Antes de main()? ¿Después de main()?  Los pondremos después de main() ¿Son correctas las llamadas a subprogramas? En main() o en otros subprogramas — ¿Existe el subprograma? — ¿Concuerdan los argumentos con los parámetros? Deben estar los prototipos de los subprogramas antes de main() Prototipo: cabecera del subprograma terminada en . main() es el único subprograma Luis Hernández Yáñez void proc(double &a).. void dibujarCirculo()..

<< sumatorio(num) << endl. } } return sum. } cin >> num. num2).cpp #include <iostream> using namespace std. cout << "Num: ". // Prototipos if (n < 0) { long long int factorial(int n). void intercambia(double &valor1. } Fundamentos de la programación: La abstracción procedimental Página 476 . } else { int main() { for (int i = 1. } void intercambia(double &valor1. fact = 0. valor2 = tmp. long long int fact = 1. valor1 = valor2. return 0. num2. for (int i = 1. fact = fact * i. i++) { Luis Hernández Yáñez sum = sum + i. << factorial(num) } << endl << "Sumatorio de 1 a " int sumatorio(int n) { << num << ": " int sum = 0. // Variable local (temporal) tmp = valor1. int sumatorio(int n). i++) { int num. // Prototipo int main() { double num1. Asegúrate de que los prototipos cin >> num1.cpp #include <iostream> long long int factorial(int n) { using namespace std. cout << "Ahora el valor 1 es " << num1  << " y el valor 2 es " << num2 << endl. i <= n. } cout << "Factorial de " << num << ": " return fact. cin >> num2. return 0. coincidan con las implementaciones cout << "Valor 2: ". } Fundamentos de la programación: La abstracción procedimental Página 475 mates. double &valor2). i <= n. double &valor2) { Luis Hernández Yáñez double tmp. cout << "Valor 1: ". intercambia(num1. intercambia.

Luis Hernández Yáñez Fundamentos de la programación: La abstracción procedimental Página 477 Notación infija (de operador) operandoIzquierdo operador operandoDerecho a + b Se ejecuta el operador con los operandos como argumentos Los operadores se implementan como funciones: tipo operatorsímbolo(parámetros) Si es un operador monario sólo habrá un parámetro Si es binario habrá dos parámetros El símbolo es un símbolo de operador (uno o dos caracteres): Luis Hernández Yáñez +. . Fundamentos de la programación: La abstracción procedimental Página 478 . %... ‐. ‐‐. /. <<. *.

tMatriz operator+(tMatriz a. ¡La implementación será exactamente la misma! Luis Hernández Yáñez Mayor aproximación al lenguaje matemático Fundamentos de la programación: La abstracción procedimental Página 479 Luis Hernández Yáñez Fundamentos de la programación: La abstracción procedimental Página 480 . c. tMatriz a. tMatriz a. b. tMatriz suma(tMatriz a. b. tMatriz b). c = suma(a. c = a + b. b). tMatriz b). c.

cuatro funciones de conversión y main() Fundamentos de la programación: La abstracción procedimental Página 482 . hasta que el usuario decida que no quiere hacer más 6 grandes tareas: Luis Hernández Yáñez Menú.‐ Desarrollar un programa que haga operaciones de conversión de medidas hasta que el usuario decida que no quiere hacer más Análisis y diseño aumentando el nivel de detalle en cada paso ¿Qué operaciones de conversión? Paso 1.‐ Desarrollar un programa que muestre al usuario un menú con cuatro operaciones de conversión de medidas:  Pulgadas a centímetros  Libras a gramos  Grados Fahrenheit a centígrados  Galones a litros Y lea la elección del usuario y proceda con la conversión. Especificación inicial (Paso 0).‐ Desarrollar un programa que haga operaciones de conversión de medidas hasta que el usuario decida que no quiere hacer más  Pulgadas a centímetros  Libras a gramos Luis Hernández Yáñez  Grados Fahrenheit a centígrados  Galones a litros Fundamentos de la programación: La abstracción procedimental Página 481 Paso 2.

‐  Menú: Mostrar las cuatro opciones más una para salir Validar la entrada y devolver la elegida  Pulgadas a centímetros: Devolver el equivalente en centímetros del valor en pulgadas  Libras a gramos: Devolver el equivalente en gramos del valor en libras  Grados Fahrenheit a centígrados: Devolver el equivalente en centígrados del valor en Fahrenheit  Galones a litros: Devolver el equivalente en litros del valor en galones Luis Hernández Yáñez  Programa principal (main()) Fundamentos de la programación: La abstracción procedimental Página 484 .‐ Conversiones Menú Pulgadas a cm. ºF a ºC Galones a l. main() Luis Hernández Yáñez Fundamentos de la programación: La abstracción procedimental Página 483 Paso 3. Libras a gr. Paso 2.

Fundamentos de la programación: La abstracción procedimental Página 486 . Paso 3.‐ Cada tarea. switch (op) { case 1: { Luis Hernández Yáñez cout << "Pulgadas: ". int op = ‐1. // Prototipos int menu()." << endl. cin >> valor. } . double lbAGr(double libras). int main() { double valor. double grFAGrC(double grF). while (op != 0) { op = menu(). double galALtr(double galones). . . cout << "Son " << pulgACm(valor) << " cm. break. double pulgACm(double pulg). un subprograma Comunicación entre los subprogramas: Función Entrada Salida Valor devuelto menu() ― ― int pulgACm() double pulg ― double lbAGr() double libras ― double grFAGrC() double grF ― double galALtr() double galones ― double main() ― ― int Luis Hernández Yáñez Fundamentos de la programación: La abstracción procedimental Página 485 Paso 4.‐ Algoritmos detallados de cada subprograma  Programar #include <iostream> using namespace std.

cout << "2 ‐ Libras a Gr. while ((op < 0) || (op > 4)) { cout << "1 ‐ Pulgadas a Cm. } Luis Hernández Yáñez break." << endl." << endl. cin >> valor. Fundamentos de la programación: La abstracción procedimental Página 488 . cout << "4 ‐ Galones a L. case 2: { cout << "Libras: ". if ((op < 0) || (op > 4)) { cout << "Opción no válida" << endl. case 4: { cout << "Galones: ". cout << "Elige: ". } . } } return 0." << endl. return pulg * cmPorPulg. } } return op. . cout << "0 ‐ Salir" << endl. cin >> valor. case 3: { cout << "Grados Fahrenheit: ". cout << "Son " << grFAGrC(valor) << " ºC" << endl. cout << "Son " << lbAGr(valor) << " gr. } Luis Hernández Yáñez double pulgACm(double pulg) { const double cmPorPulg = 2. . cin >> valor." << endl.54. Fundamentos de la programación: La abstracción procedimental Página 487 int menu() { int op = ‐1. cin >> op. ." << endl. cout << "Son " << galALtr(valor) << " l. } . } break. } break. . cout << "3 ‐ Fahrenheit a ºC" << endl.

cpp double lbAGr(double libras) { const double grPorLb = 453.6. } double galALtr(double galones) { const double ltrPorGal = 4. return galones * ltrPorGal. conversiones.54609. . return libras * grPorLb. } double grFAGrC(double grF) { return ((grF ‐ 32) * 5 / 9). Fundamentos de la programación: La abstracción procedimental Página 489 Luis Hernández Yáñez Fundamentos de la programación: La abstracción procedimental Página 490 . } Luis Hernández Yáñez . .

Integridad de los subprogramas Condiciones que se deben dar antes de comenzar su ejecución  Precondiciones  Quien llame al subprograma debe garantizar que se satisfacen Condiciones que se darán cuando termine su ejecución  Postcondiciones  En el punto de llamada se pueden dar por garantizadas Aserciones: Condiciones que si no se cumplen interrumpen la ejecución Luis Hernández Yáñez Función assert() Fundamentos de la programación: La abstracción procedimental Página 491 Precondiciones Por ejemplo. double cmPorPulg = 2. no realizaremos conversiones de valores negativos: double pulgACm(double pulg) { assert(pulg > 0). } La función tiene una precondición: pulg debe ser positivo assert(pulg > 0). return pulg * cmPorPulg. interrumpirá la ejecución si no es cierto Luis Hernández Yáñez Fundamentos de la programación: La abstracción procedimental Página 492 .54.

switch (op) { case 1: { cout << "Pulgadas: ". .... Fundamentos de la programación: La abstracción procedimental Página 493 Postcondiciones Un subprograma puede garantizar condiciones al terminar: int menu() { int op = ‐1. cin >> op. while ((op < 0) || (op > 4)) { . Luis Hernández Yáñez return op. Luis Hernández Yáñez } else { // Se cumple la precondición. if (valor < 0) { cout << "¡No válido!" << endl. Precondiciones Es responsabilidad del punto de llamada garantizar la precondición: int main() { double valor. int op = ‐1. } } assert ((op >= 0) && (op <= 4)).. cout << "Elige: ".. } El subprograma debe asegurarse de que se cumpla Fundamentos de la programación: La abstracción procedimental Página 494 . while (op != 0) { op = menu(). if ((op < 0) || (op > 4)) { cout << "Opción no válida" << endl.. cin >> valor.

Licencia CC (Creative Commons)
Este tipo de licencias ofrecen algunos derechos a terceras personas
bajo ciertas condiciones.
Este documento tiene establecidas las siguientes:

Reconocimiento (Attribution):
En cualquier explotación de la obra autorizada por la licencia
hará falta reconocer la autoría.
No comercial (Non commercial):
La explotación de la obra queda limitada a usos no comerciales.
Compartir igual (Share alike):
La explotación autorizada incluye la creación de obras derivadas
siempre que mantengan la misma licencia al ser divulgadas.
Luis Hernández Yáñez

Pulsa en la imagen de arriba a la derecha para saber más.

Fundamentos de la programación: La abstracción procedimental Página 495

Fundamentos de la programación

4A
Grado en Ingeniería Informática
Grado en Ingeniería del Software
Grado en Ingeniería de Computadores

Luis Hernández Yáñez
Facultad de Informática
Universidad Complutense

Archivos como parámetros 498
La función main() 501
Argumentos implícitos 504
Sobrecarga de subprogramas 508
Luis Hernández Yáñez

Fundamentos de la programación: La abstracción procedimental (Anexo)

Luis Hernández Yáñez

Fundamentos de la programación: La abstracción procedimental (Anexo) Página 498

#include <iostream>
using namespace std;
#include <fstream>
void sumatorio_archivo(ifstream &arch, double &suma);
int main() {
double resultado;
ifstream archivo;
archivo.open("datos.txt");
if (!archivo.is_open()) {
cout << "ERROR DE APERTURA" << endl;
}
else {
sumatorio_archivo(archivo, resultado)
cout << "Suma = " << resultado << endl;
archivo.close();
Luis Hernández Yáñez

}

return 0;
}

Fundamentos de la programación: La abstracción procedimental (Anexo) Página 499

void sumatorio_archivo(ifstream &arch, double &suma) {
double dato;

suma = 0;
arch >> dato;

while (dato != ‐1) {
suma = suma + dato;
arch >> dato;
}
}

Los archivos siempre se pasan por referencia
Luis Hernández Yáñez

Fundamentos de la programación: La abstracción procedimental (Anexo) Página 500
Luis Hernández Yáñez

Fundamentos de la programación: La abstracción procedimental (Anexo) Página 501

Comunicación con el sistema operativo
Parámetros opcionales de la función main():
int main(int argc, char *argv[])

Para obtener datos proporcionados al ejecutar el programa:
C:###BOT_TEXT###gt;prueba cad1 cad2 cad3
Ejecuta prueba.exe con tres argumentos (cadenas)

Parámetros de main():
— argc: número de argumentos que se proporcionan

4 en el ejemplo (primero: nombre del programa con su ruta)
Luis Hernández Yáñez

— argv: array con las cadenas proporcionadas como argumentos

Fundamentos de la programación: La abstracción procedimental (Anexo) Página 502

¿Cómo ha ido la función?
La función main() devuelve al S.O. un código de terminación
— 0: Todo OK

— Distinto de 0: ¡Ha habido un error!

Si la ejecución llega al final de la función main(), todo OK:
...
return 0; // Fin del programa
}
Luis Hernández Yáñez

Fundamentos de la programación: La abstracción procedimental (Anexo) Página 503

Luis Hernández Yáñez

Fundamentos de la programación: La abstracción procedimental (Anexo) Página 504

Valores predeterminados para parámetros por valor
Valor por defecto para un parámetro:
Tras un = a continuación del nombre del parámetro:
void proc(int i = 1);

Si no se proporciona argumento, el parámetro toma ese valor
proc(12); i toma el valor explícito 12
proc(); i toma el valor implícito (1)

Sólo puede haber argumentos implícitos en los parámetros finales:
void p(int i, int j = 2, int k = 3); // CORRECTO
Luis Hernández Yáñez

void p(int i = 1, int j, int k = 3); // INCORRECTO

Una vez asignado un valor implícito, todos los que siguen
han de tener también valor implícito
Fundamentos de la programación: La abstracción procedimental (Anexo) Página 505

Parámetros y argumentos implícitos
void p(int i, int j = 2, int k = 3);
Se copian los argumentos en los parámetros del primero al último
 los que no tengan correspondencia tomarán los implícitos
void p(int i, int j = 2, int k = 3);
...
p(13); // i toma 13, j y k sus valores implícitos
p(5, 7); // i toma 5, j toma 7 y k su valor implícito
p(3, 9, 12); // i toma 3, j toma 9 y k toma 12
Luis Hernández Yáñez

Los argumentos implícitos se declaran en el prototipo
(preferible) o en la cabecera del subprograma, pero NO en ambos

Fundamentos de la programación: La abstracción procedimental (Anexo) Página 506

Por defecto, signo +
Por defecto, Δ es 1

#include <iostream>
using namespace std;

double f(double x, double y, int signo = 1, double delta = 1.0);

int main() {
double x, y;
cout << "X = "; No podemos dejar signo por defecto
cin >> x; y concretar delta
cout << "Y = ";
cin >> y;
cout << "signo y delta por defecto: " << f(x, y) << endl;
cout << "signo ‐1 y delta por defecto: " << f(x, y, ‐1) << endl;
cout << "signo y delta concretos: " << f(x, y, 1, 1.25) << endl;

return 0;
}
Luis Hernández Yáñez

double f(double x, double y, int signo, double delta) {
return signo * delta * x / y;
}

Fundamentos de la programación: La abstracción procedimental (Anexo) Página 507

Luis Hernández Yáñez

Fundamentos de la programación: La abstracción procedimental (Anexo) Página 508

Igual nombre, distintos parámetros
Funciones o procedimientos con igual nombre y distintos parámetros:
int abs(int n);
double abs(double n);
long int abs(long int n);
Se ejecutará la función que corresponda al tipo de argumento:
abs(13)  // argumento int ‐‐> primera función
abs(‐2.3)  // argumento double ‐‐> segunda función
abs(3L)  // argumento long int ‐‐> tercera función
Luis Hernández Yáñez

Para indicar que es un literal long int, en lugar de int

Fundamentos de la programación: La abstracción procedimental (Anexo) Página 509

inter.cpp

#include <iostream> void intercambia(char &x, char &y) {
using namespace std; char tmp;
tmp = x;
void intercambia(int &x, int &y); x = y;
void intercambia(double &x, y = tmp;
double &y); }
void intercambia(char &x, char &y);
int main() {
void intercambia(int &x, int &y) { int i1 = 3, i2 = 7;
int tmp; double d1 = 12.5, d2 = 35.9;
tmp = x; char c1 = 'a', c2 = 'b';
x = y; cout << i1 << " ‐ " << i2 << endl;
y = tmp; cout << d1 << " ‐ " << d2 << endl;
} cout << c1 << " ‐ " << c2 << endl;
intercambia(i1, i2);
void intercambia(double &x, intercambia(d1, d2);
double &y) { intercambia(c1, c2);
double tmp; cout << i1 << " ‐ " << i2 << endl;
Luis Hernández Yáñez

tmp = x; cout << d1 << " ‐ " << d2 << endl;
x = y; cout << c1 << " ‐ " << c2 << endl;
y = tmp; return 0;
} }

Fundamentos de la programación: La abstracción procedimental (Anexo) Página 510

Licencia CC (Creative Commons)
Este tipo de licencias ofrecen algunos derechos a terceras personas
bajo ciertas condiciones.
Este documento tiene establecidas las siguientes:

Reconocimiento (Attribution):
En cualquier explotación de la obra autorizada por la licencia
hará falta reconocer la autoría.
No comercial (Non commercial):
La explotación de la obra queda limitada a usos no comerciales.
Compartir igual (Share alike):
La explotación autorizada incluye la creación de obras derivadas
siempre que mantengan la misma licencia al ser divulgadas.
Luis Hernández Yáñez

Pulsa en la imagen de arriba a la derecha para saber más.

Fundamentos de la programación: La abstracción procedimental (Anexo) Página 511

Fundamentos de la programación

5
Grado en Ingeniería Informática
Grado en Ingeniería del Software
Grado en Ingeniería de Computadores

Luis Hernández Yáñez/Pablo Moreno Ger
Facultad de Informática
Universidad Complutense

Tipos de datos 514
Arrays de nuevo 517
Arrays y bucles for 520
Más sobre arrays 522
Inicialización de arrays 523
Enumerados como índices 524
Paso de arrays a subprogramas 525
Implementación de listas 528
Cadenas de caracteres 531
Cadenas de caracteres de tipo string 535
Entrada/salida con string 539
Luis Hernández Yáñez/Pablo Moreno Ger

Operaciones con string 541
Estructuras 543
Estructuras dentro de estructuras 549
Arrays de estructuras 550
Arrays dentro de estructuras 551
Listas de longitud variable 552
Un ejemplo completo 558
El bucle do..while 562

Fundamentos de la programación: Tipos de datos estructurados

Luis Hernández Yáñez/Pablo Moreno Ger

Fundamentos de la programación: Tipos de datos estructurados Página 514

Clasificación de tipos
 Simples
 Estándar: int, float, double, char, bool
Conjunto de valores predeterminado 
 Definidos por el usuario: enumerados
Conjunto de valores definido por el programador 
 Estructurados
Luis Hernández Yáñez/Pablo Moreno Ger

Colecciones homogéneas: arrays


Todos los elementos del mismo tipo
 Colecciones heterogéneas: estructuras
Los elementos pueden ser de tipos distintos

Fundamentos de la programación: Tipos de datos estructurados Página 515

.. Luis Hernández Yáñez/Pablo Moreno Ger  Una o varias dimensiones Estructuras (tuplas. 3... registros)  Elementos (campos) sin orden establecido  Acceso por nombre Fundamentos de la programación: Tipos de datos estructurados Página 516 Luis Hernández Yáñez/Pablo Moreno Ger Fundamentos de la programación: Tipos de datos estructurados Página 517 .. 2. Colecciones o tipos aglomerados Agrupaciones de datos (elementos):  Todos del mismo tipo: array o tabla  De tipos distintos: estructura. registro o tupla Arrays (tablas)  Elementos organizados por posición: 0. 2. 3. 1.  Acceso por índice: 0. . 1.

¡NO se inicializan los elementos automáticamente! ¡Es responsabilidad del programador usar índices válidos! No se pueden copiar arrays directamente (array1 = array2) Hay que copiarlos elemento a elemento Fundamentos de la programación: Tipos de datos estructurados Página 519 . typedef tipo_base tNombre[Dimensión].62 435. Declaración de variables de tipos array: como cualquier otra Luis Hernández Yáñez/Pablo Moreno Ger tVentas ventas.. Datos de un mismo tipo base: Se usan como cualquier variable Fundamentos de la programación: Tipos de datos estructurados Página 518 Declaración de tipos de arrays const int Dimensión = ..75. typedef double tVentas[Dias]. Ejemplo: const int Dias = 7.29 0.95 328. Estructura secuencial Cada elemento se encuentra en una posición (índice):  Los índices son enteros positivos  El índice del primer elemento siempre es 0  Los índices se incrementan de uno en uno ventas 125.00 164.40 76. ventas[4] = 442.00) cout << ventas[4].00 0 1 2 3 4 5 6 Luis Hernández Yáñez/Pablo Moreno Ger Acceso directo [] A cada elemento se accede a través de su índice: ventas[4] accede al 5º elemento (contiene el valor 435.80 254..

43 ventas[3] 11.44 total+=ventas[i] i 3 2 70 4 1 i++ Fundamentos de la programación: Tipos de datos estructurados Página 521 . Fundamentos de la programación: Tipos de datos estructurados Página 520 12..70 Luis Hernández Yáñez/Pablo Moreno Ger ventas[5] 13.07 i<Dias media ? . const int Dias = 7.  ..43 11.41 14. Recorrido de arrays con bucles for Arrays: tamaño fijo  Bucles de recorrido fijo (for) tVentas ventas.70 13.00 43.40 0. Memoria double media. i < Dias...40 for (int i = 0.79 12.36 31.. Procesamiento de arrays  Recorridos  Búsquedas  Ordenación etcétera.96 total = total + ventas[i]. i++) { ventas[1] 10.07 0 1 2 3 4 5 6 tVentas ventas.65 13.. typedef double tVentas[Dias].  Dias 7 .65 i = 0 ventas[4] 13.40 10. } media = total / Dias. total = 0. Luis Hernández Yáñez/Pablo Moreno Ger double media.62 23. total = 0. ventas[0] 12. i++) { total = total + ventas[i]. i < Dias.41 true false ventas[6] 14. total 84.96 8.. for (int i = 0. } ventas[2] 8..

 10 }.. 8. 6. typedef int tTabla[DIM]. 4. 2. los restantes se ponen a 0 tTabla i = { 0 }. 5.. i[9] Luis Hernández Yáñez/Pablo Moreno Ger 1º 2º 3º 4º 5º  . // Pone todos los elementos a 0 Fundamentos de la programación: Tipos de datos estructurados Página 523 .  10º Si hay menos valores que elementos. 7. Se asignan los valores por su orden: i[0] i[1] i[2] i[3] i[4] . 9..Luis Hernández Yáñez/Pablo Moreno Ger Fundamentos de la programación: Tipos de datos estructurados Página 522 Podemos inicializar los elementos de los arrays en la declaración Asignamos una serie de valores al array: const int DIM = 10. tTabla i = { 1. 3..

typedef enum { rojo.. // Sin poner & Las modificaciones del array quedan reflejadas en el argumento Luis Hernández Yáñez/Pablo Moreno Ger inicializa(array). void inicializa(tTabla tabla). cin >> color[rojo]. typedef int tTabla[Max]. Si inicializa() modifica algún elemento de tabla. automáticamente queda modificado ese elemento de array ¡Son el mismo array! Fundamentos de la programación: Tipos de datos estructurados Página 525 . cout << "Cantidad de rojo (0‐255): ". typedef int tColor[Colores]. tColor color. cout << "Cantidad de verde (0‐255): ". Luis Hernández Yáñez/Pablo Moreno Ger cout << "Cantidad de azul (0‐255): ". . Recuerda que internamente se asignan enteros a partir de 0 a los distintos símbolos del enumerado rojo  0 verde  1 azul  2 Fundamentos de la programación: Tipos de datos estructurados Página 524 Simulación de paso de parámetro por referencia Sin poner & en la declaración del parámetro Los subprogramas reciben la dirección en memoria del array const int Max = 10. const int Colores = 3. azul } tRGB. verde. cin >> color[azul].. cin >> color[verde].

} int main() { tTabla array. // no se usa & void inicializa(tTabla tabla) { for (int i = 0. pero no se modifica } } Fundamentos de la programación: Tipos de datos estructurados Página 527 . El argumento se tratará como un array de constantes Si en el subprograma hay alguna instrucción que intente modificar un elemento del array: error de compilación Luis Hernández Yáñez/Pablo Moreno Ger void muestra(const tTabla tabla) { for (int i = 0. 0 1 2 3 4 5 6 7 8 9 Fundamentos de la programación: Tipos de datos estructurados Página 526 ¿Cómo evitar que se modifique el array? Usando el modificador const en la declaración del parámetro: const tTabla tabla Un array de constantes void muestra(const tTabla tabla). const int Dim = 10. i++) { cout << tabla[i] << " ". i < Dim. i < Dim. // array queda modificado for (int i = 0. typedef int tTabla[Dim]. i++) tabla[i] = i. i++) cout << array[i] << " ".. i < Dim. Luis Hernández Yáñez/Pablo Moreno Ger inicializa(array).. . // OK. void inicializa(tTabla tabla). Se accede.

 i++) { Luis Hernández Yáñez/Pablo Moreno Ger .. Recorrido de la lista: for (int i = 0. typedef double tLista[NUM]. i < NUM.Luis Hernández Yáñez/Pablo Moreno Ger Fundamentos de la programación: Tipos de datos estructurados Página 528 Listas con un número fijo de elementos Array con el nº de elementos como dimensión const int NUM = 100... Búsqueda en la lista: while ((i < NUM) && !encontrado) {  . Fundamentos de la programación: Tipos de datos estructurados Página 529 .. // Exactamente 100 double tLista lista.

 // Se incrementa al insertar Recorrido de la lista: for (int i = 0.. i++) { Luis Hernández Yáñez/Pablo Moreno Ger ..  int contador = 0. Listas con un número variable de elementos Array con un máximo de elementos + Contador de elementos const int MAX = 100.. i < contador.. typedef double tLista[MAX]. ¿Array y contador por separado?  Estructuras Fundamentos de la programación: Tipos de datos estructurados Página 530 Luis Hernández Yáñez/Pablo Moreno Ger Fundamentos de la programación: Tipos de datos estructurados Página 531 . Búsqueda en la lista: while ((i < contador) && !encontrado) { . // Hasta 100 elementos tLista lista.

Arrays de caracteres Cadenas: secuencias de caracteres de longitud variable "Hola" "Adiós" "Supercalifragilístico" "1234 56 7" Variables de cadena: contienen secuencias de caracteres Se guardan en arrays de caracteres: tamaño máximo (dimensión) No todas las posiciones del array son relevantes:  Longitud de la cadena: número de caracteres. que realmente constituyen la cadena: Luis Hernández Yáñez/Pablo Moreno Ger H o l a 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 Longitud actual: 4 Fundamentos de la programación: Tipos de datos estructurados Página 532 Longitud de la cadena A d i ó s 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 Longitud: 5 S u p e r c a l i f r a g i l í s t i c o 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 Longitud: 21 Luis Hernández Yáñez/Pablo Moreno Ger Necesidad de saber dónde terminan los caracteres relevantes:  Mantener la longitud de la cadena como dato asociado  Colocar un carácter de terminación al final (centinela) A d i ó s ###BOT_TEXT### 0 1 2 3 4 5 6 7 8 9 10 Fundamentos de la programación: Tipos de datos estructurados Página 533 . desde el primero.

Cadenas de caracteres en C++ Dos alternativas para el manejo de cadenas:  Cadenas al estilo de C (terminadas en nulo)  Tipo string Cadenas al estilo de C Anexo del tema  Arrays de tipo char con una longitud máxima  Un último carácter especial al final: '###BOT_TEXT###' Luis Hernández Yáñez/Pablo Moreno Ger Tipo string  Cadenas más sofisticadas  Sin longitud máxima (gestión automática de la memoria)  Multitud de funciones de utilidad (biblioteca string) Fundamentos de la programación: Tipos de datos estructurados Página 534 Luis Hernández Yáñez/Pablo Moreno Ger Fundamentos de la programación: Tipos de datos estructurados Página 535 .

swap(cad2). // inicialización string cad3.   // inicialización string cad2 = "amigo".cpp #include <iostream> #include <string> using namespace std. cad3 = cad1.  // intercambio cout << "cad1 = " << cad1 << endl.      // concatenación cout << "cad3 = " << cad3 << endl. // concatenación Luis Hernández Yáñez/Pablo Moreno Ger cad3 += cad2. // copia cout << "cad3 = " << cad3 << endl. int main() { string cad1("Hola"). El tipo string  El tipo asume la responsabilidad de la gestión de memoria  Define operadores sobrecargados (+ para concatenar)  Cadenas más eficientes y seguras de usar Biblioteca string Requiere establecer el espacio de nombres a std  Se pueden inicializar en la declaración Luis Hernández Yáñez/Pablo Moreno Ger  Se pueden copiar con el operador de asignación  Se pueden concatenar con el operador +  Multitud de funciones de utilidad Fundamentos de la programación: Tipos de datos estructurados Página 536 string. cad3 = cad1 + " ". cout << "cad2 = " << cad2 << endl. return 0. cad1. } Fundamentos de la programación: Tipos de datos estructurados Página 537 .

 Lectura incluyendo espacios en blanco: getline(cin. Intro) El espacio en blanco queda pendiente  Descartar el resto de los caracteres del búfer: cin. cadena) Fundamentos de la programación: Tipos de datos estructurados Página 539 . Longitud de la cadena: cadena.size() Se pueden comparar con los operadores relacionales: if (cad1 <= cad2) { . sync() no tiene efecto archivo >> cadena      getline(archivo. cadena) Luis Hernández Yáñez/Pablo Moreno Ger Guarda en la cadena los caracteres leídos hasta el fin de línea  Lectura de archivos de texto: Igual que de consola..length() o cadena. Acceso a los caracteres de una cadena:  Como array de caracteres: cadena[i] Sin control de acceso a posiciones inexistentes del array Luis Hernández Yáñez/Pablo Moreno Ger Sólo debe usarse si se está seguro de que el índice es válido  Función at(índice): cadena.sync().at(i) Error de ejecución si se accede a una posición inexistente Fundamentos de la programación: Tipos de datos estructurados Página 538  Se muestran en la pantalla con cout <<  Lectura con cin >>: termina con espacio en blanco (inc..

} Fundamentos de la programación: Tipos de datos estructurados Página 540  cadena. cout << "Introduzca los apellidos: ".find("la"). 3). int main() { string nombre. apellidos). // Muestra 3 Fundamentos de la programación: Tipos de datos estructurados Página 541 .cpp #include <iostream> #include <string> using namespace std.substr(posición. string2.find(subcadena) Posición de la primera ocurrencia de subcadena en cadena string cad = "Olala". longitud) Subcadena de longitud caracteres desde posición string cad = "abcdefg". cin >> nombre. apellidos. cout << cad. cout << cad. cout << "Introduzca un nombre: ".substr(2. return 0. // Muestra 1 Luis Hernández Yáñez/Pablo Moreno Ger (Recuerda que los arrays de caracteres comienzan con el índice 0)  cadena.sync().rfind(subcadena) Posición de la última ocurrencia de subcadena en cadena string cad = "Olala". // Muestra cde  cadena. cin. Luis Hernández Yáñez/Pablo Moreno Ger cout << "Nombre completo: " << nombre << " " << apellidos << endl.rfind("la"). cout << cad. getline(cin.

cad. 4).com/reference/string/string/ Fundamentos de la programación: Tipos de datos estructurados Página 542 Luis Hernández Yáñez/Pablo Moreno Ger Fundamentos de la programación: Tipos de datos estructurados Página 543 . "123").erase(3. cad.erase(ini. // cad ahora contiene "abch"  cadena.  cadena.insert(3.cplusplus. cadena2) Inserta cadena2 a partir de la posición ini string cad = "abcdefgh". num) Elimina num caracteres a partir de la posición ini string cad = "abcdefgh".insert(ini. // cad ahora contiene "abc123defgh" Luis Hernández Yáñez/Pablo Moreno Ger http://www.

 // declaraciones de campos (como variables) } tTipo.. string nif. Colecciones heterogéneas (tuplas. Luis Hernández Yáñez/Pablo Moreno Ger Campos: Tipos estándar o previamente declarado Fundamentos de la programación: Tipos de datos estructurados Página 545 . // nombre de tipo ‐ ¡al final! typedef struct { string nombre. int edad.. registros) Elementos de (posiblemente) distintos tipos: campos Campos identificados por su nombre Información relacionada que se puede manejar como una unidad Acceso a cada elemento por su nombre de campo (operador.) Luis Hernández Yáñez/Pablo Moreno Ger Fundamentos de la programación: Tipos de datos estructurados Página 544 typedef struct { . } tPersona. string apellidos.

edad // un entero (int) persona. persona2. string nif.apellidos Yáñez nombre Luis Antonio Luis Hernández Yáñez/Pablo Moreno Ger persona. Luis  } tPersona. .edad 22 apellidos Hernández Yáñez persona. persona.nombre Antonio tPersona persona. tPersona persona. persona2 = persona1. Las variables de tipo tPersona contienen cuatro datos (campos): nombre apellidos edad nif Acceso a los campos con el operador punto (. Memoria int edad... Se copian todos los campos a la vez Fundamentos de la programación: Tipos de datos estructurados Página 546 typedef struct { string nombre. string apellidos.nif 00223344F edad 22 nif 00223344F Fundamentos de la programación: Tipos de datos estructurados Página 547 .apellidos // una cadena (string) persona.): persona.nombre // una cadena (string) persona. persona Hernández  persona.nif // una cadena (string) Luis Hernández Yáñez/Pablo Moreno Ger Podemos copiar dos estructuras directamente: tPersona persona1.

) Luis Hernández Yáñez/Pablo Moreno Ger 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 Fundamentos de la programación: Tipos de datos estructurados Página 548 typedef struct { typedef struct {  string dni. int edad..letra Acceso al DNI: persona.dni Fundamentos de la programación: Tipos de datos estructurados Página 549 . tNif nif. . tPersona persona. } tPersona.. string nif. typedef struct { string nombre. char letra.nif. tPersona nombre Acceso al NIF completo: apellidos persona. tPersona persona.nif // Otra estructura edad tNif Luis Hernández Yáñez/Pablo Moreno Ger nif Acceso a la letra del NIF: dni letra persona.nif. Los campos no siguen ningún orden establecido Acceso directo por nombre de campo (operador . } tNif. } tPersona. string apellidos.

0 edad apellidos nif string apellidos. Luis Hernández Yáñez/Pablo Moreno Ger int contador.elementos[11].nombre Edad de la duodécima persona: lista.nif Fundamentos de la programación: Tipos de datos estructurados Página 550 const int MAX = 100. nif apellidos 1 string nif. edad nombre int edad.nif Fundamentos de la programación: Tipos de datos estructurados Página 551 . Nombre de la tercera persona: lista. edad nif } tPersona. lista elementos contador typedef struct { nombre apellidos string nombre.elementos[0]. nombre typedef tPersona tArray[DIM].elementos[2].nombre nombre Edad de la duodécima persona: apellidos DIM‐1 edad nif personal[11]. const int DIM = 100. nif Luis Hernández Yáñez/Pablo Moreno Ger Nombre de la tercera persona: personal[2]. nif tLista lista.edad NIF de la primera persona: lista. nif } tPersona. 2 nombre apellidos edad typedef tPersona tArray[MAX]. 1 apellidos edad string nif. MAX‐1 nombre apellidos edad } tLista. tPersona personal typedef struct { nombre nombre apellidos string nombre. 0 edad nif string apellidos. nif typedef struct { tArray elementos.edad NIF de la primera persona: personal[0]. nombre int edad. 2 apellidos edad tArray personal.

0 X X X X 0 1 2 3 4 5 6 7 8 9 contador 6 Nº de elementos (y primer índice sin elemento) Operaciones principales: inserción y eliminación de elementos Fundamentos de la programación: Tipos de datos estructurados Página 553 .0 ‐2. elementos Luis Hernández Yáñez/Pablo Moreno Ger 12.2 5.0 36. } tLista. / Pablo Moreno Ger Luis Hernández Yáñez/Pablo Moreno Ger Fundamentos de la programación: Tipos de datos estructurados Página 552 Estructura que agrupe el array y el contador: const int MAX = 10.4 0. (datos basura) int contador. typedef struct { Elementos sin usar tArray elementos.2 35. typedef double tArray[MAX].

‐ Abrir hueco para el nuevo elemento (desde la posición) 2.0 X X X nuevo 0 1 2 3 4 5 6 7 8 9 3 7 pos Fundamentos de la programación: Tipos de datos estructurados Página 555 .elementos[i ‐ 1].2 5.contador++.2 35.‐ Colocar el elemento nuevo en la posición 3.2 5.0 36.0 12.elementos[pos] = nuevoElemento.‐ Incrementar el contador Fundamentos de la programación: Tipos de datos estructurados Página 554 if (lista. i‐‐) { lista.0 ‐2. lista.0 0.contador < N) { // Abrir hueco for (int i = lista.contador.0 ‐2.0 36. Insertar un nuevo elemento en una posición Posiciones válidas: 0 a contador 42.4 0.2 35. i > pos. } // Insertar e incrementar contador lista. } Luis Hernández Yáñez/Pablo Moreno Ger 42.0 12.4 42.0 X X X X nuevo 0 1 2 3 4 5 6 7 8 9 3 6 pos Hay que asegurarse de que haya sitio (contador < máximo) Luis Hernández Yáñez/Pablo Moreno Ger Operación en 3 pasos: 1.elementos[i] = lista.

2 35.0 X X X X 3 0 1 2 3 4 5 6 7 8 9 pos 6 Desplazar a la izquierda desde el siguiente y decrementar el contador: Luis Hernández Yáñez/Pablo Moreno Ger for (int i = pos.2 35.0 36.2 5.elementos[i] = lista.2 5. i++) { lista.elementos[i] = lista.0 X X X X 3 0 1 2 3 4 5 6 7 8 9 pos 5 Fundamentos de la programación: Tipos de datos estructurados Página 557 .4 0. 12. } lista.2 35. } lista.4 36.0 35.contador ‐ 1 . Eliminar el elemento en una posición Posiciones válidas: 0 a contador‐1 12. i < lista.4 0.2 5.0 X X X X 3 0 1 2 3 4 5 6 7 8 9 pos 6 Luis Hernández Yáñez/Pablo Moreno Ger 12.0 36. i < lista.elementos[i + 1].0 ‐2. i++) { lista.0 ‐2.0 ‐2.contador ‐ 1 .contador‐‐. Fundamentos de la programación: Tipos de datos estructurados Página 556 for (int i = pos.elementos[i + 1].contador‐‐.

apellidos. identificando la mayor y la media Fundamentos de la programación: Tipos de datos estructurados Página 559 . NIF y nota  Se desconoce el número total de estudiantes (máximo 100)  La información 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: Luis Hernández Yáñez/Pablo Moreno Ger — Añadir un nuevo alumno — Eliminar un alumno existente — Calificar a los estudiantes — Listado de notas.Luis Hernández Yáñez/Pablo Moreno Ger Fundamentos de la programación: Tipos de datos estructurados Página 558 Descripción Programa que mantenga una lista de los estudiantes de una clase De cada estudiante: nombre. edad.

 // Menú del programa ‐ devuelve la opción elegida void cargar(tLista &lista. // Carga del archivo void guardar(const tLista &lista). void calificar(tLista &lista). Tras las bibliotecas typedef struct { tArray elementos. y tipos globales typedef tEstudiante tArray[MAX]. // Índice del estudiante con mayor nota void mostrarEstudiante(tEstudiante estudiante). typedef struct { string nombre. string apellidos.cpp #include <iostream> #include <string> using namespace std. // Nota media int mayorNota(const tLista &lista). void listado(const tLista &lista. double media. } tLista. // Listado de la clase Los prototipos. string nif. int contador. // Lee los datos void insertarEstudiante(tLista &lista. #include <fstream> #include <iomanip> const int MAX = 100. bool &ok). Declaraciones de constantes } tEstudiante. bool &ok). bool &ok). Fundamentos de la programación: Tipos de datos estructurados Página 560 // Prototipos int menu(). // La guarda en el archivo void leerEstudiante(tEstudiante &estudiante). // Elimina el estudiante en esa posición string nombreCompleto(tEstudiante estudiante). int mayor). Luis Hernández Yáñez/Pablo Moreno Ger double nota. bd. int edad. int pos. // Inserta un nuevo estudiante en la lista void eliminarEstudiante(tLista &lista. después de los tipos globales Fundamentos de la programación: Tipos de datos estructurados Página 561 . tEstudiante estudiante. // Notas de los estudiantes Luis Hernández Yáñez/Pablo Moreno Ger double mediaClase(const tLista &lista).

Luis Hernández Yáñez/Pablo Moreno Ger i++. do { cout << i << endl. int i = 1. El cuerpo siempre se ejecuta al menos una vez El cuerpo es un bloque de código Fundamentos de la programación: Tipos de datos estructurados Página 563 .Luis Hernández Yáñez/Pablo Moreno Ger Fundamentos de la programación: Tipos de datos estructurados Página 562 El bucle do. } while (i <= 100). Condición al final del bucle do cuerpo while ( condición ) ..while do cuerpo while (condición).

al menos true una vez i <= 100 false Fundamentos de la programación: Tipos de datos estructurados Página 564 ¿Ha de ejecutarse al menos una vez el cuerpo del bucle? cin >> d. do { Cuerpo cout << i << endl. false i = 1. Luis Hernández Yáñez/Pablo Moreno Ger cout << "Opción: ". } Fundamentos de la programación: Tipos de datos estructurados Página 565 . cont++. suma = suma + d.  do { // Más simple cin >> op. cout << "Opción: ". El cuerpo Luis Hernández Yáñez/Pablo Moreno Ger cout << i << endl. cin >> op. while ((op < 0) || (op > 4)) { cin >> op. // Lectura del 1º do { while (d != 0) { cin >> d. // Lectura del 1º  cout << "Opción: ".  se ejecuta i++. } } } while (d != 0).  } while ((op < 0) || (op > 4)). suma = suma + d. i++. int i = 1. if (d != 0) { // ¿Final? cont++. true Condición } while (i <= 100). cin >> d.

do { cout << "1 ‐ Añadir un nuevo estudiante" << endl. cout << "0 ‐ Salir" << endl. Luis Hernández Yáñez/Pablo Moreno Ger } while ((op < 0) || (op > 4)). } Fundamentos de la programación: Tipos de datos estructurados Página 566 El archivo clase. cout << "2 ‐ Eliminar un estudiante" << endl. cout << "3 ‐ Calificar a los estudiantes" << endl. return op. cout << "Opción: ".txt Un dato en cada línea ↲ ↲ ↲ Por cada estudiante: ↲ ↲ ↲  Nombre (cadena) ↲ ↲ ↲  Apellidos (cadena) ↲ ↲ ↲  Edad (entero) ↲ ↲ ↲  NIF (cadena) ↲ ↲ Luis Hernández Yáñez/Pablo Moreno Ger ↲  Nota (real. int menu() { int op. cout << "4 ‐ Listado de estudiantes" << endl. cin >> op. ‐1 si no calificado) ↲ ↲ Termina con XXX como nombre ↲ ↲ ↲ ↲ ↲ El archivo se supone correcto Fundamentos de la programación: Tipos de datos estructurados Página 567 .

en el siguiente nombre se leería una cadena vacía (Intro) No leas directamente en la lista: getline(archivo. } } Fundamentos de la programación: Tipos de datos estructurados Página 569 . archivo >> estudiante. // Leemos el primer nombre while ((estudiante.nif. // Siguiente nombre } // Si hay más de MAX estudiantes. // Saltamos el Intro lista.nombre != "XXX") && (lista.contador] = estudiante. // Variable auxiliar para leer ifstream archivo.contador < MAX)) { getline(archivo.elementos[lista. // Al final lista. lista.contador].contador = 0.elementos[lista. ignoramos el resto archivo. estudiante.contador++.apellidos). Lectura de la información de un estudiante Nombre y apellidos: Puede haber varias palabras  getline() Edad  extractor (>>) NIF: Una sola palabra  extractor (>>) Nota  extractor (>>) Queda pendiente de leer el Intro Luis Hernández Yáñez/Pablo Moreno Ger Hay que saltar (leer) ese carácter con get() Si no. Lee en una variable auxiliar de tipo tEstudiante Fundamentos de la programación: Tipos de datos estructurados Página 568 void cargar(tLista &lista.nota.close().nombre).nombre). Luis Hernández Yáñez/Pablo Moreno Ger archivo >> estudiante. getline(archivo.edad. archivo >> estudiante.get(aux).is_open()) { ok = false.nombre). lista. // Inicializamos la lista archivo. estudiante. bool &ok) { tEstudiante estudiante.  getline(archivo. if (!archivo. archivo. estudiante. } else { ok = true. char aux.txt").open("clase.

txt"). cout << "Apellidos: ".nota << endl.contador.apellidos << endl.nombre). cin >> estudiante.sync(). Luis Hernández Yáñez/Pablo Moreno Ger } archivo << "XXX" << endl. estudiante. // Descartamos cualquier entrada pendiente } Fundamentos de la programación: Tipos de datos estructurados Página 571 .edad << endl. // Descartamos cualquier entrada pendiente cout << "Nombre: ". } const tLista &lista  Referencia constante Paso por referencia pero como constante  Paso por valor Evita la copia del argumento en el parámetro (estructuras grandes) Fundamentos de la programación: Tipos de datos estructurados Página 570 void leerEstudiante(tEstudiante &estudiante) { cin.nota = ‐1.elementos[i].nombre << endl. cin >> estudiante. archivo << lista.nif << endl.open("clase.edad. archivo << lista. getline(cin.elementos[i]. // Centinela final archivo.elementos[i]. archivo.nif. cout << "Edad: ". archivo << lista. estudiante. archivo << lista. i++) { archivo << lista. i < lista.apellidos). un dato en cada línea y en orden: void guardar(const tLista &lista) { ofstream archivo. Simplemente. estudiante. getline(cin. // Sin calificar de momento Luis Hernández Yáñez/Pablo Moreno Ger cin.elementos[i].sync(). cout << "NIF: ". for (int i = 0.close().elementos[i].

bool &ok) { ok = true.elementos[i] = lista.contador‐‐.contador ‐ 1)) { ok = false. int pos. i < lista. tEstudiante estudiante.elementos[lista. } else { lista. // Elemento inexistente } else { ok = true.contador ‐ 1. } } Fundamentos de la programación: Tipos de datos estructurados Página 573 .contador == MAX) { ok = false. i++) { lista. if (lista. // Insertamos al final lista.elementos[i + 1]. bool &ok) { // Espera el índice del elemento en pos if ((pos < 0) || (pos > lista. } Luis Hernández Yáñez/Pablo Moreno Ger lista. Luis Hernández Yáñez/Pablo Moreno Ger } } Fundamentos de la programación: Tipos de datos estructurados Página 572 void eliminarEstudiante(tLista &lista.contador++. for (int i = pos. void insertarEstudiante(tLista &lista.contador] = estudiante.

nombre + " " + estudiante.contador. pos = i. } return total / lista.elementos[i]) << ": ". } void calificar(tLista &lista) { for (int i = 0.contador. } int mayorNota(const tLista &lista) { double max = 0. Luis Hernández Yáñez/Pablo Moreno Ger for (int i = 0.contador.elementos[i]. for (int i = 0. } Luis Hernández Yáñez/Pablo Moreno Ger } Fundamentos de la programación: Tipos de datos estructurados Página 574 double mediaClase(const tLista &lista) { double total = 0. i++) { if (lista. int pos = 0. i < lista.nota. string nombreCompleto(tEstudiante estudiante) { return estudiante.nota > max) { max = lista. } Fundamentos de la programación: Tipos de datos estructurados Página 575 . i < lista. } } return pos. i++) { cout << "Nota del estudiante " << nombreCompleto(lista.apellidos.0.elementos[i].elementos[i]. i < lista.contador.nota.elementos[i].nota. i++) { total = total + lista. cin >> lista.

} } break. cout << setw(2) << estudiante. Luis Hernández Yáñez/Pablo Moreno Ger switch (op) { case 1: { leerEstudiante(estudiante). pos. mostrarEstudiante(lista. } Fundamentos de la programación: Tipos de datos estructurados Página 576 int main() { tLista lista. exito).contador. void mostrarEstudiante(tEstudiante estudiante) { cout << setw(35) << left << nombreCompleto(estudiante). tEstudiante estudiante. } cout << "Media de la clase: " << fixed << setprecision(1) << media << endl << endl. estudiante. double media. } void listado(const tLista &lista. insertarEstudiante(lista. cargar(lista. i < lista. exito).nota. } cout << endl. if (!exito) { cout << "No se ha podido cargar la lista!" << endl. Fundamentos de la programación: Tipos de datos estructurados Página 577 . cout << estudiante.elementos[i]).nif << " ".edad << " años ". Luis Hernández Yáñez/Pablo Moreno Ger if (i == mayor) { cout << " <<< Mayor nota!". i++) { cout << setw(3) << i << ": ". int mayor) { for (int i = 0. cout << fixed << setprecision(1) << estudiante. bool exito. } else { do { // El bucle do evita tener que leer antes la primera opción op = menu(). int op. if (!exito) { cout << "Lista llena: imposible insertar" << endl.

Compartir igual (Share alike): La explotación autorizada incluye la creación de obras derivadas siempre que mantengan la misma licencia al ser divulgadas. Pulsa en la imagen de arriba a la derecha para saber más. eliminarEstudiante(lista. case 2: { cout << "Posición: ". } break. } } break. guardar(lista). Fundamentos de la programación: Tipos de datos estructurados Página 579 . cin >> pos. } Fundamentos de la programación: Tipos de datos estructurados Página 578 Licencia CC (Creative Commons) Este tipo de licencias ofrecen algunos derechos a terceras personas bajo ciertas condiciones. No comercial (Non commercial): Luis Hernández Yáñez/Pablo Moreno Ger La explotación de la obra queda limitada a usos no comerciales. } return 0. } } } while (op != 0). exito). mayorNota(lista)). pos ‐ 1. Este documento tiene establecidas las siguientes: Reconocimiento (Attribution): En cualquier explotación de la obra autorizada por la licencia hará falta reconocer la autoría. Luis Hernández Yáñez/Pablo Moreno Ger case 4: { listado(lista. mediaClase(lista). if (!exito) { cout << "Elemento inexistente!" << endl. case 3: { calificar(lista).

Fundamentos de la programación 5A Grado en Ingeniería Informática Grado en Ingeniería del Software Grado en Ingeniería de Computadores Luis Hernández Yáñez/Pablo Moreno Ger Facultad de Informática Universidad Complutense Cadenas al estilo de C 582 E/S con cadenas al estilo de C 583 La biblioteca cstring 584 Ejemplo 585 Luis Hernández Yáñez/Pablo Moreno Ger Fundamentos de la programación: Cadenas al estilo de C (Anexo) .

typedef char tCadena[Max].. // Hasta 14 caracteres cout << cadena << endl. Fundamentos de la programación: Cadenas al estilo de C (Anexo) Página 582 tCadena cadena. máx) Cadenas al estilo de C getline(cin. Arrays de caracteres terminados en nulo const Max = 15. // Se añade un nulo al final Extractor: la lectura termina en el primer espacio en blanco ¡No se comprueba si se leen más caracteres de los que caben! setw(): máximo de caracteres a colocar (incluyendo el nulo) cin >> setw(15) >> cadena. Ni copiar cadenas directamente: cad2 = cad1. // El nulo no se muestra cin.getline(cadena_estilo_C. 15). Ni comparar con op. máx): Para leer también los espacios en blanco y no más de máx‐1 Luis Hernández Yáñez/Pablo Moreno Ger cin. cin. cin >> cadena. cad) Cadenas de tipo string Fundamentos de la programación: Cadenas al estilo de C (Anexo) Página 583 . // Inicialización al declarar Siempre hay al final un carácter nulo (código ASCII 0 – '###BOT_TEXT###') Indica que en esa posición termina la cadena (exclusive) cadena A d i ó s ###BOT_TEXT### 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 Luis Hernández Yáñez/Pablo Moreno Ger En el array caben MAX‐1 caracteres significativos Longitud máxima de la variable cadena: 14 No se pueden asignar cadenas literales: cadena = "Hola".. relacionales: if (cad1 < cad2) .getline(cad. tCadena cadena = "Adiós".getline(cadena.

 "Hola").com/reference/clibrary/cstring/ Fundamentos de la programación: Cadenas al estilo de C (Anexo) Página 584 cadenas. .getline(cadena. . 1 si cad1 > cad2 ó ‐1 si cad1 < cad2 tCadena cad1 = "Hola". cad2): compara lexicográficamente las cadenas Luis Hernández Yáñez/Pablo Moreno Ger 0 si son iguales. strcpy(cadena. strcpy(cad.. cad2) // Devuelve 1 ("Hola" > "Adiós") . origen): copia origen en destino strcpy(cad2. origen): añade origen al final de destino tCadena cad1 = "Hola". tCad cadena = "Me gusta C++".sync(). strcat(cad1. #include <cstring> int main() { const int MAX = 20. cout << cadena << endl. MAX).  strcat(destino.cplusplus. cin. strcmp(cad1. cad2 = "Adiós". cin >> cadena. cout << "Cadena: ". http://www. // Sincronizar la entrada cout << "Cadena: ". . cad2 = "Adiós". cin. cout << "Longitud: " << strlen(cadena) << endl.  strcpy(destino. "Me gusta C++"). // cad1 contiene "HolaAdiós"  strcmp(cad1. // Lee hasta el primer espacio en blanco Luis Hernández Yáñez/Pablo Moreno Ger cout << cadena << endl. Fundamentos de la programación: Cadenas al estilo de C (Anexo) Página 585 . typedef char tCad[MAX].  strlen(cadena): longitud actual de la cadena cout << "Longitud: " << strlen(cadena).. cad2).cpp #include <iostream> using namespace std. cad1). cout << cadena << endl.

Fundamentos de la programación: Cadenas al estilo de C (Anexo) Página 587 . return 0. strcat(cadena. Luis Hernández Yáñez/Pablo Moreno Ger } cout << endl. Compartir igual (Share alike): La explotación autorizada incluye la creación de obras derivadas siempre que mantengan la misma licencia al ser divulgadas. Pulsa en la imagen de arriba a la derecha para saber más. } else { cout << cadena << " es menor que " << cadena2. No comercial (Non commercial): Luis Hernández Yáñez/Pablo Moreno Ger La explotación de la obra queda limitada a usos no comerciales. } else if (strcmp(cadena. cadena2) == 0) { cout << "Iguales". cout << cadena << endl. if (strcmp(cadena. } Fundamentos de la programación: Cadenas al estilo de C (Anexo) Página 586 Licencia CC (Creative Commons) Este tipo de licencias ofrecen algunos derechos a terceras personas bajo ciertas condiciones. tCad cadena2 = " amigo". cadena2) > 0) { cout << cadena << " es mayor que " << cadena2. Este documento tiene establecidas las siguientes: Reconocimiento (Attribution): En cualquier explotación de la obra autorizada por la licencia hará falta reconocer la autoría. cadena2).

Fundamentos de la programación 6 Grado en Ingeniería Informática Grado en Ingeniería del Software Grado en Ingeniería de Computadores Luis Hernández Yáñez / Pablo Moreno Ger Facultad de Informática Universidad Complutense Recorrido de arrays 590 Arrays completos 593 Arrays no completos con centinela 594 Arrays no completos con contador 595 Ejemplos 597 Generación de números aleatorios 601 Búsquedas en arrays 604 Arrays completos 606 Arrays no completos con centinela 607 Arrays no completos con contador 608 Ejemplo 610 Recorridos y búsquedas en cadenas 614 Más ejemplos de manejo de arrays 617 Arrays multidimensionales 630 Inicialización de arrays multidimensionales 638 Luis Hernández Yáñez Recorrido de un array bidimensional 641 Recorrido de un array N‐dimensional 644 Búsqueda en un array multidimensional 647 Fundamentos de la programación: Recorrido y búsqueda en arrays .

Luis Hernández Yáñez Fundamentos de la programación: Recorrido y búsqueda en arrays Página 590 Esquema de recorrido Inicialización Inicialización Mientras no al final de la secuencia: Obtener el siguiente elemento true ¿Al final? Procesar el elemento false Finalización Obtener elemento Procesar elemento Luis Hernández Yáñez Finalización Fundamentos de la programación: Recorrido y búsqueda en arrays Página 591 .

Luis Hernández Yáñez // Procesar el elemento .29 316... i++) { elemento = ventas[i]. Recorrido de secuencias en arrays  Todas las posiciones ocupadas: Tamaño del array = longitud de la secuencia N elementos en un array de N posiciones: Recorrer el array desde la primera posición hasta la última  Posiciones libres al final del array: Tamaño del array > longitud de la secuencia  Con centinela: Recorrer el array hasta encontrar el valor centinela  Con contador de elementos: Luis Hernández Yáñez Recorrer el array hasta el índice contador – 1 Fundamentos de la programación: Recorrido y búsqueda en arrays Página 592 Recorrido de arrays completos Todas las posiciones del array ocupadas const int N = 10.05 219.45 756. .99 93.95 328.00 164. typedef double tVentas[N]. i < N. for (int i = 0. } Fundamentos de la programación: Recorrido y búsqueda en arrays Página 593 .62 435. tVentas ventas. ventas 125.40 76..80 254.62 0 1 2 3 4 5 6 7 8 9 double elemento..

i++. datos 125.. } tLista..62 435. Fundamentos de la programación: Recorrido y búsqueda en arrays Página 594 Recorrido de arrays no completos – con contador Array y contador íntimamente relacionados: estructura const int N = 10. Luis Hernández Yáñez // Procesar el elemento .80 254. do { while (elemento != ‐1) { elemento = datos[i]... int contador.29 316.80 254.40 76. typedef double tArray[N].00 164. elemento = datos[i].00 164. Recorrido de arrays no completos – con centinela No todas las posiciones del array están ocupadas const int N = 10.95 328..40 76.0 0 1 2 3 4 5 6 7 8 9 int i = 0. int i = 0.62 435. } } } while (elemento != ‐1).95 328. typedef double tArray[N]. tArray datos. double elemento = datos[i].29 316.05 ‐1. // Datos positivos: centinela = ‐1 . Listas de elementos de longitud variable elementos 125.. i++. if (elemento != ‐1) { // Procesar el elemento.05 0 1 2 3 4 5 6 7 8 9 Luis Hernández Yáñez contador 7 Nº de elementos (primer índice sin elemento) Fundamentos de la programación: Recorrido y búsqueda en arrays Página 595 . double elemento. typedef struct { tArray elementos.

. i < lista. Luis Hernández Yáñez } Fundamentos de la programación: Recorrido y búsqueda en arrays Página 596 Luis Hernández Yáñez Fundamentos de la programación: Recorrido y búsqueda en arrays Página 597 . } tLista. i++) { elemento = lista..contador. double elemento.elementos[i]. tLista lista. typedef struct { tArray elementos. typedef double tArray[N]. int contador. for (int i = 0.. . Recorrido de arrays no completos – con contador const int N = 10. // Procesar el elemento..

. for (int i = 2. cuántos de 2 dígitos. 61 Luis Hernández Yáñez 0 1 2 3 4 5 6 7 99 numDig 0 0 0 0 0 0 0 1 2 3 4 5 Fundamentos de la programación: Recorrido y búsqueda en arrays Página 599 . fib[0] = 1.. i++) { cout << fib[i] << "   ". fibonacci. i < N. fib[1] = 1. typedef int tNum[NUM]. etcétera (hasta 5 dígitos) 2 arrays: array con los números y array de contadores const int NUM = 100. } Luis Hernández Yáñez Fundamentos de la programación: Recorrido y búsqueda en arrays Página 598 Cuenta de valores con k dígitos Recorrer una lista de N enteros contabilizando cuántos son de 1 dígito. i++) { fib[i] = fib[i ‐ 1] + fib[i ‐ 2]. typedef long long int tFibonacci[N]. } for (int i = 0.cpp Array con los N primeros números de Fibonacci const int N = 50. // Exactamente 100 números tNum numeros. i < N. // i ‐‐> números de i+1 dígitos tDig numDig = { 0 }. numeros 123 2 46237 2345 236 11234 33 999 . const int DIG = 5. typedef int tDig[DIG]. // 50 números tFibonacci fib.

Cuenta de valores con k dígitos Función que devuelve el número de dígitos de un entero: int digitos(int dato) { int n_digitos = 1. } return n_digitos... while (dato >= 10) { dato = dato / 10. numeros[0] = rand(). n_digitos++. // Inicia la secuencia Luis Hernández Yáñez . // Entre 0 y 32766 Fundamentos de la programación: Recorrido y búsqueda en arrays Página 601 . que en nuestro caso será NULL srand(time(NULL))... } Luis Hernández Yáñez Fundamentos de la programación: Recorrido y búsqueda en arrays Página 600 Generación de números pseudoaleatorios Probemos con una secuencia de enteros generada aleatoriamente Función rand() (cstdlib): entero aleatorio entre 0 y 32766 srand() (cstdlib): inicia la secuencia de números aleatorios Acepta un entero que usa como semilla para iniciar la secuencia ¿Qué valor usar? Uno distinto en cada ejecución  El instante de tiempo actual (diferente cada vez) Función time() (ctime): segundos transcurridos desde 1970 Requiere un argumento. // Al menos tiene un dígito // Recorremos la secuencia de dígitos.

 // Inicializa todo el array a 0 Luis Hernández Yáñez srand(time(NULL)).. = " << numDig[i]  << endl. tDig numDig = { 0 }. // Exactamente 100 números const int DIG = 5. Luis Hernández Yáñez } int digitos(int dato) { . i < NUM. i < DIG. i++) { // Recorremos la secuencia de enteros numDig[digitos(numeros[i]) ‐ 1]++. Fundamentos de la programación: Recorrido y búsqueda en arrays Página 603 . i < NUM. typedef int tDig[DIG]. } return 0. typedef int tNum[NUM]. i++) { // Recorremos la secuencia de contadores cout << "De " << i + 1 << " díg. i++) { // Creamos la secuencia numeros[i] = rand().. digitos.. // Entre 0 y 32766 } for (int i = 0. } for (int i = 0. #include <cstdlib> // srand() y rand() #include <ctime> // time() int digitos(int dato). Fundamentos de la programación: Recorrido y búsqueda en arrays Página 602 for (int i = 0. tNum numeros. // Inicia la secuencia aleatoria .cpp Cuenta de valores con k dígitos #include <iostream> using namespace std. int main() { const int NUM = 100..

Luis Hernández Yáñez Fundamentos de la programación: Recorrido y búsqueda en arrays Página 604 Esquema de búsqueda Inicialización / encontrado = false. Inicialización Mientras no se encuentre el elemento true y no se esté al final de la secuencia: ¿Al final o encontrado? Obtener el siguiente elemento false Comprobar si el elemento Obtener elemento satisface la condición Finalización ¿Encontrado? (tratar el elemento encontrado o indicar que no se ha encontrado) Luis Hernández Yáñez Finalización Fundamentos de la programación: Recorrido y búsqueda en arrays Página 605 .

const int centinela = ‐1. while ((pos < N) && !encontrado) { // Mientras no se llegue al final y no encontrado if (lista[pos] == buscado) { encontrado = true. while ((array[pos] != centinela) && !encontrado) { if (array[pos] == buscado) { encontrado = true.. Fundamentos de la programación: Recorrido y búsqueda en arrays Página 606 Con centinela const int N = 10. Todas las posiciones ocupadas const int N = 100. typedef int tArray[N].. cin >> buscado.. cout << "Valor a buscar: ". tArray lista. cout << "Valor a buscar: ". cin >> buscado. bool encontrado = false. bool encontrado = false. } } Luis Hernández Yáñez if (encontrado) // . int buscado. tArray array. int buscado.. } else { pos++. } else { pos++. int pos = 0. } Luis Hernández Yáñez } if (encontrado) // . typedef int tArray[N]. Fundamentos de la programación: Recorrido y búsqueda en arrays Página 607 . int pos = 0.

Ventas del cuarto día del tercer mes en la primera sucursal: Luis Hernández Yáñez anual[2].. Con contador const int N = 10. tLista miLista. int pos = 0. typedef struct { tVentaMes ventas. while ((pos < miLista. cin >> buscado. int contador.ventas[3][0] Fundamentos de la programación: Recorrido y búsqueda en arrays Página 609 . typedef double tArray[N]. Luis Hernández Yáñez } } if (encontrado) // . int dias. } tMes.elementos[pos] == buscado) { encontrado = true.. su acceso es directo typedef double tVentaMes[DIAS][SUCURSALES]. } tLista. Fundamentos de la programación: Recorrido y búsqueda en arrays Página 608 Acceso directo a cualquier posición Acceso directo: array[posición] Si se puede calcular la posición del elemento. bool encontrado = false. typedef tMes tVentaAnual[MESES]. } else { pos++.contador) && !encontrado) { // Mientras no al final y no encontrado if (miLista. tArray elementos. tVentaAnual anual. typedef struct { cout << "Valor a buscar: ". int buscado.

} Fundamentos de la programación: Recorrido y búsqueda en arrays Página 611 . int main() { tLista lista. bool ok. Luis Hernández Yáñez cargar(lista. bool &ok). typedef struct { tArray elementos. void cargar(tLista &lista. ok). typedef double tArray[N]. #include <fstream> const int N = 100.Luis Hernández Yáñez Fundamentos de la programación: Recorrido y búsqueda en arrays Página 610 #include <iostream> umbral. int contador. if (!ok) { cout << "Error: no hay archivo o demasiados datos" << endl. } tLista.cpp using namespace std.

bool abierto = true.contador) && !encontrado) { if (lista.contador = 0. cin >> umbral.contador] = dato. } ok = abierto && !overflow.contador == N) { overflow = true. lista.open("datos. bool &ok) { ifstream archivo. archivo >> dato. // ¡Demasiados! } else { lista. archivo. } Luis Hernández Yáñez } archivo. while ((dato >= 0) && !overflow) { if (lista. bool encontrado = false. while ((pos < lista.elementos[lista. int pos = 0. } } if (encontrado) { cout << "Valor en pos. } Fundamentos de la programación: Recorrido y búsqueda en arrays Página 613 .close(). " << pos + 1 << " ("  << lista. } else { Luis Hernández Yáñez cout << "¡No encontrado!" << endl. if (!archivo.elementos[pos] << ")" << endl. else { double umbral. } } return 0. cout << "Valor umbral: ".contador++. overflow = false.is_open()) { abierto = false. } else { archivo >> dato. } Fundamentos de la programación: Recorrido y búsqueda en arrays Página 612 void cargar(tLista &lista. lista. } else { pos++.elementos[pos] > umbral) { encontrado = true.txt"). double dato.

Luis Hernández Yáñez Fundamentos de la programación: Recorrido y búsqueda en arrays Página 614 inversa. } // . // Inserta car al principio pos++.. // . inversa = "". Luis Hernández Yáñez inversa = car + inversa..cpp Recorridos y búsquedas en cadenas de caracteres Longitud de la cadena: size() o length() Caso similar a los arrays con contador de elementos Ejemplo: Recorrido de una cadena generando otra invertida string cadena. (lectura de cadena) pos = 0. Fundamentos de la programación: Recorrido y búsqueda en arrays Página 615 .size()) { // Mientras no se llegue al final de la cadena car = cadena. char car. while (pos < cadena.. int pos.at(pos)..

int pos. (lectura de cadena) cout << "Introduce el carácter a buscar: ". } else { Luis Hernández Yáñez pos++.at(pos) == buscado) { encontrado = true. busca... char buscado. } } if (encontrado) // . // . Fundamentos de la programación: Recorrido y búsqueda en arrays Página 616 Luis Hernández Yáñez Fundamentos de la programación: Recorrido y búsqueda en arrays Página 617 . encontrado = false. cin >> buscado.. bool encontrado..cpp Búsqueda de un carácter en una cadena string cadena.size()) && !encontrado) { if (cadena. while ((pos < cadena. pos = 0.

cpp void desplazar(tVector v) { int aux = v[N ‐ 1]. } int sumaPares(const tVector v) { int suma = 0. determina si alguno de los valores almacenados en el vector está repetido Fundamentos de la programación: Recorrido y búsqueda en arrays Página 618 vectores. i > 0. Luis Hernández Yáñez devuelve el índice del primero encontrado o ‐1 si no se encuentra  Dado un vector. Subprogramas:  Dado un vector. for (int i = N ‐ 1. calcula y devuelve la suma de los elementos que se encuentran en las posiciones pares del vector  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. Tipo tVector para representar secuencias de N enteros: const int N = 10. devuelve un valor que indique si son iguales  Dado un vector. i < N. } Fundamentos de la programación: Recorrido y búsqueda en arrays Página 619 . el último componente se moverá al 1er lugar  Dado un vector. typedef int tVector[N]. mueve sus componentes un lugar a la derecha. i = i + 2) { suma = suma + v[i]. } Luis Hernández Yáñez return suma. encuentra y devuelve la componente mayor  Dados dos vectores. i‐‐) { v[i] = v[i ‐ 1]. for (int i = 0. } v[0] = aux.

 j < N. j++) { if (j != i) { suma = suma + v[j]. } } encontrado = (suma == v[i]). i < N. for (int i = 1. int suma. int i = 0. } if (!encontrado) { i = 0. Luis Hernández Yáñez } return i ‐ 1. } Fundamentos de la programación: Recorrido y búsqueda en arrays Página 621 . max = v[i]. const tVector v2) { //Implementación como búsqueda del primer elemento distinto bool encontrado = false. while ((i < N) && !encontrado) { suma = 0. posMayor = 0. i++. int encuentraMayor(const tVector v) { int max = v[0]. } return !encontrado. while ((i<N) && !encontrado) { encontrado = (v1[i] != v2[i]). Luis Hernández Yáñez i++. for (int j = 0. } bool sonIguales(const tVector v1. int i = 0. i++) { if (v[i] > max) { posMayor = i. } Fundamentos de la programación: Recorrido y búsqueda en arrays Página 620 int compruebaSuma(const tVector v) { // ¿Alguno igual a la suma del resto? bool encontrado = false. } } return posMayor.

} return encontrado. se quiere comprobar si todos los elementos del vector v1 están también en el vector v2 Por ejemplo. while ((j < N) && !encontrado) { encontrado = (v[i] == v[j]). j++. } i++. donde N ≤ M. j. int i = 0. bool hayRepetidos(const tVector v) { bool encontrado = false. y otro vector de M caracteres v2. si: v1= 'a' 'h' 'i' 'm' v2= 'h' 'a' 'x' 'x' 'm' 'i' El resultado sería cierto. en el que no hay elementos repetidos. while ((i < N) && !encontrado) { j = i + 1. } Luis Hernández Yáñez Fundamentos de la programación: Recorrido y búsqueda en arrays Página 622 Dado un vector de N caracteres v1. ya que todos los elementos de v1 están en v2 Luis Hernández Yáñez Fundamentos de la programación: Recorrido y búsqueda en arrays Página 623 .

encontrado = (dato == v2[i]). int main() { tVector1 v1 = { 'a'. 'r'. v2). } return encontrado. const int N = 3. tVector2 v2 = { 'a'. 'b'. } Fundamentos de la programación: Recorrido y búsqueda en arrays Página 625 . v2). typedef char tVector2[M]. bool ok = vectorIncluido(v1. } Luis Hernández Yáñez else { cout << "NO: v1 no esta incluido en v2" << endl. while (encontrado && (i < N ‐ 1)) { i++. bool encontrado = (dato == v2[0]). const int M = 10. while (!encontrado && (i < M ‐ 1)) { i++. 'c' }. 'a'. 'h'. } return 0. const tVector2 v2). const tVector2 v2) { int i = 0. 'e'. Luis Hernández Yáñez encontrado = esta(v1[i]. 'z'. } return encontrado. } Fundamentos de la programación: Recorrido y búsqueda en arrays Página 624 bool esta(char dato. 'b'. typedef char tVector1[N]. bool encontrado = esta(v1[0]. v2). 's'. const tVector2 v2). } bool vectorIncluido(const tVector1 v1. bool esta(char dato. 't'. bool vectorIncluido(const tVector1 v1. 'x' }.cpp #include <iostream> using namespace std. const tVector2 v2) { int i = 0. if (ok) { cout << "OK: v1 esta incluido en v2" << endl. incluidos.

cpp #include <iostream> #include <string> using namespace std. Fundamentos de la programación: Recorrido y búsqueda en arrays Página 627 . getline(cin. Luis Hernández Yáñez Fundamentos de la programación: Recorrido y búsqueda en arrays Página 626 anagramas. Ten en cuenta que puede haber letras repetidas ("carro". cout << "Introduce la primera cadena: ".at(numCar)). if (cad1. getline(cin.length() != cad2. cad1. int numCar. cout << "Introduce la segunda cadena: ". Un programa que lea dos cadenas del teclado y determine si una es un anagrama de la otra. // Contador de caracteres de la primera cadena while (sonAnagramas && (numCar < cad1. bool sonAnagramas = true. char c). int buscaCaracter(string cad. Por ejemplo.length()) { // No son anagramas sonAnagramas = false. "acre" es un anagrama de "cera" y de "arce". cad1).length())) { posEnCad2 = buscaCaracter(cad2. // Índice o ‐1 si no está int main() { string cad1. cad2. cad2). posEnCad2. } Luis Hernández Yáñez else { numCar = 0. "llave"). es decir. si una cadena es una permutación de los caracteres de la otra.

at(pos) == c) { encontrado = true. lon = cad. } else { pos++. } else { cad2. 1). char c) { int pos = 0.length().erase(posEnCad2. } Luis Hernández Yáñez return 0. while ((pos < lon) && !encontrado) { if (cad. } } if (sonAnagramas) { cout << "Las palabras introducidas son anagramas" << endl. } } if (!encontrado) { pos = ‐1. Luis Hernández Yáñez } Fundamentos de la programación: Recorrido y búsqueda en arrays Página 629 . } Fundamentos de la programación: Recorrido y búsqueda en arrays Página 628 int buscaCaracter(string cad. if (posEnCad2 == ‐1) { //No se ha encontrado el caracter sonAnagramas = false. bool encontrado = false. } else { cout << "Las palabras introducidas NO son anagramas" << endl. } numCar++. } return pos.

.... tantas como tamaños se indiquen typedef double tMatriz[50][100].....Luis Hernández Yáñez Fundamentos de la programación: Recorrido y búsqueda en arrays Página 630 Arrays de varias dimensiones Varios tamaños en la declaración: cada uno con sus corchetes typedef tipo_base nombre[tamaño1][tamaño2]. .... .. . 2 .. 1 ........ 48 ....... . . Luis Hernández Yáñez . tMatriz matriz. 49 . Fundamentos de la programación: Recorrido y búsqueda en arrays Página 631 .[tamañoN]... Tabla bidimensional de 50 filas por 100 columnas: 0 1 2 3 . 98 99 0 . .. .. Varias dimensiones.

Fundamentos de la programación: Recorrido y búsqueda en arrays Página 632 Arrays de varias dimensiones Podemos definir tantas dimensiones como necesitemos typedef double tMatriz[5][10][20][10]. . Arrays de varias dimensiones typedef double tMatriz[50][100]. .. 1 .... . 2 ...... . 0 1 2 3 . Luis Hernández Yáñez 48 ..... tMatriz matriz.. Luis Hernández Yáñez Fundamentos de la programación: Recorrido y búsqueda en arrays Página 633 . . 98 99 0 ... tMatriz matriz.. .. .... Cada elemento se localiza con dos índices.. Necesitaremos tantos índices como dimensiones: cout << matriz[2][9][15][6]. uno por dimensión cout << matriz[2][98].. 49 . ......

tMaxAbs = ‐100. if (!archivo.. const int MED = 2. // Día x mín./máx. Fundamentos de la programación: Recorrido y búsqueda en arrays Página 635 . archivo.is_open()) { cout << "No se ha podido abrir el archivo!" << endl. // Día x mín. tMinAbs = 100. int dia = 0. Ahora:  temp[i][0] es la temperatura mínima del día i+1  temp[i][1] es la temperatura máxima del día i+1 Luis Hernández Yáñez Fundamentos de la programación: Recorrido y búsqueda en arrays Página 634 temp.open("temp. double tMaxMedia = 0. // Nº de medidas typedef double tTemp[MaxDias][MED]. // Nº de medidas typedef double tTemp[MaxDias][MED]. // El archivo termina con ‐99 ‐99 ../máx. const int MED = 2. double max. tMinMedia = 0. ifstream archivo.cpp int main() { const int MaxDias = 31.txt"). tTemp temp. tTemp temp. min. Ejemplo de array bidimensional Temperaturas mínimas y máximas Matriz bidimensional de días y mínima/máxima: const int MaxDias = 31. } Luis Hernández Yáñez else { archivo >> min >> max.

 i++) { tMinMedia = tMinMedia + temp[i][0]. if (temp[i][0] < tMinAbs) { tMinAbs = temp[i][0].. if (temp[i][1] > tMaxAbs) { Luis Hernández Yáñez tMaxAbs = temp[i][1].close(). Fundamentos de la programación: Recorrido y búsqueda en arrays Página 636 tMinMedia = tMinMedia / dia. i < dia.. } tMaxMedia = tMaxMedia + temp[i][1]. cout << "   Media = " << fixed << setprecision(1)  << tMaxMedia << " C   Máxima absoluta = " << setprecision(1) << tMaxAbs << " C" << endl. archivo >> min >> max.‐" << endl. tMaxMedia = tMaxMedia / dia. } return 0.‐" << endl. dia++. } Luis Hernández Yáñez Fundamentos de la programación: Recorrido y búsqueda en arrays Página 637 . } archivo. temp[dia][1] = max. cout << "   Media = " << fixed << setprecision(1)  << tMinMedia << " C   Mínima absoluta = " << setprecision(1) << tMinAbs << " C" << endl. cout << "Temperaturas máximas. for (int i = 0. cout << "Temperaturas mínimas. while (!((min == ‐99) && (max == ‐99))  && (dia < MaxDias)) { temp[dia][0] = min. } } .

tArray cuads = {1. 4. cuads[3][0] 4 el resto se inicializan a cero cuads[3][1] 16 Inicialización a cero de todo el array: Luis Hernández Yáñez cuads[4][0] 5 int cuads[5][2] = { 0 }. 3.16. 3.9.25}.1.25}. 5.. 2.4. 4. 2. Se asignan en el orden en el que los elementos están en memoria La memoria es de una dimensión: secuencia de celdas En memoria varían más rápidamente los índices de la derecha: cuads[0][0] cuads[0][1] cuads[1][0] cuads[1][1] cuads[2][0].16. tArray cuads = {1.4.9. Podemos dar valores a los elementos de un array al declararlo Arrays bidimensionales: typedef int tArray[5][2]. Memoria 0 1 cuads[0][0] 1 0 1 1 1 2 4 cuads[0][1] 1 2 3 9 cuads[1][0] 2 3 4 16 cuads[1][1] 4 4 5 25 cuads[2][0] 3 cuads[2][1] 9 Si hay menos valores que elementos.1. Para cada valor del primer índice: todos los valores del segundo Luis Hernández Yáñez Fundamentos de la programación: Recorrido y búsqueda en arrays Página 638 Inicialización de un array bidimensional typedef int tArray[5][2].. cuads[4][1] 25 Fundamentos de la programación: Recorrido y búsqueda en arrays Página 639 . 5.

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. 12}. 3. 11. tMatriz matriz =  {1. 5. 6. 8. const int COLUMNAS = 5. 2. 9. columna++) { // Procesar matriz[fila][columna] } Luis Hernández Yáñez } Fundamentos de la programación: Recorrido y búsqueda en arrays Página 641 . matriz[0][0][0][1] 2 matriz[0][0][0][2] 3 matriz[0][0][1][0] 4 matriz[0][0][1][1] 5 matriz[0][0][1][2] 6 matriz[0][1][0][0] 7 matriz[0][1][0][1] 8 matriz[0][1][0][2] 9 matriz[0][1][1][0] 10 Luis Hernández Yáñez matriz[0][1][1][1] 11 matriz[0][1][1][2] 12 matriz[0][2][0][0] 0 .. fila < FILAS. typedef double tMatriz[FILAS][COLUMNAS]. fila++) { for (int columna = 0. tMatriz matriz. 10. columna < COLUMNAS. 4.  Memoria matriz[0][0][0][0] 1 7.. typedef double tMatriz[3][4][2][3]. 0 Fundamentos de la programación: Recorrido y búsqueda en arrays Página 640 const int FILAS = 10.

2 523 417 327 333 324 . 354 548 4 327 652 555 222 777 .... const int MaxDias = 31. 28 29 30 0 201 125 234 112 156 . mes++) { for (int dia = 0. } } Fundamentos de la programación: Recorrido y búsqueda en arrays Página 642 Ventas de todos los meses de un año Días 0 1 2 3 4 . // Nº de días de cada mes // Pedimos las ventas de cada día del año. Ventas de todos los meses de un año const int Meses = 12.. 765 678 555 7 327 541 164 563 327 . for (int mes = 0...... // Ventas de todo el año typedef short int tDiasMes[Meses].... mes < Meses..... 444 367 437 3 145 845 654 212 562 . tDiasMes diasMes. 743 468 531 10 217 427 585 218 843 ... dia < diasMes[mes].. 428 999 666 Celdas no 5 854 438 824 547 175 . 777 555 11 222 666 512 400 259 .. tVentas ventas. 321 356 Meses utilizadas 6 654 543 353 777 437 .. 234 543 667 1 323 231 675 325 111 ... typedef double tVentas[Meses][MaxDias]. 538 159 235 8 333 327 432 249 777 .. 528 529 Luis Hernández Yáñez 9 524 583 333 100 334 .. inicializa(diasMes). dia++) { cout << "Ventas del día " << dia + 1 Luis Hernández Yáñez << " del mes " << mes + 1 << ": ". 438 637 879 Fundamentos de la programación: Recorrido y búsqueda en arrays Página 643 .... cin >> ventas[mes][dia].

anual[i]. anual  tVentaAnual anual[i]  tMes int dias. n2 < DIM2. Bucles anidados. const int DIM1 = 10. tVentaAnual anual.dias  int } tMes. n4 < DIM4. n2++) { for (int n3 = 0. const int DIM4 = 50. tMatriz matriz.ventas  tVentaMes Luis Hernández Yáñez anual[i]. Fundamentos de la programación: Recorrido y búsqueda en arrays Página 645 . n1++) { for (int n2 = 0. const int DIM2 = 5. n3 < DIM3. n3++) { for (int n4 = 0. typedef struct { tVentaMes ventas. typedef tMes tVentaAnual[MESES]. desde la primera dimensión hasta la última: for (int n1 = 0. n1 < DIM1. n4++) { // Procesar matriz[n1][n2][n3][n4] } Luis Hernández Yáñez } } } Fundamentos de la programación: Recorrido y búsqueda en arrays Página 644 Ventas diarias de cuatro sucursales Cada mes del año: ingresos de cada sucursal cada día del mes Meses con distinto nº de días  junto con la matriz de ventas mensual guardamos el nº de días del mes concreto  estructura const int DIAS = 31. const int SUCURSALES = 4. typedef double tMatriz[DIM1][DIM2][DIM3][DIM4]. typedef double tVentaMes[DIAS][SUCURSALES]. anual[i].ventas[j][k]  double const int MESES = 12. const int DIM3 = 25.

 suc. } } if (encontrado) { . Cálculo de las ventas typedef double tVentaMes[DIAS][SUCURSALES]. Primer valor > umbral int mes = 0. while ((suc < SUCURSALES) && !encontrado) { if (anual[mes]. } else { suc++.ventas[dia][suc]. tVentaMes ventas.... } } Luis Hernández Yáñez if (!encontrado) { mes++..dias) && !encontrado) { suc = 0.ventas[dia][suc] > umbral) { encontrado = true. dia.. while ((dia < anual[mes].dias. } } if (!encontrado) { dia++. Acumular las ventas tVentaAnual anual. Fundamentos de la programación: Recorrido y búsqueda en arrays Página 647 . suc < SUCURSALES.. mes < MESES. const int DIAS = 31. while ((mes < MESES) && !encontrado) { dia = 0. double total = 0. de todo el año: typedef struct { Para cada mes. Luis Hernández Yáñez } } } Fundamentos de la programación: Recorrido y búsqueda en arrays Página 646 bool encontrado = false. } tMes. suc++) { total = total + anual[mes]. int dias.. const int MESES = 12. typedef tMes tVentaAnual[MESES]. Para cada día del mes. for (int mes = 0. mes++) { for (int dia = 0. Para cada sucursal. dia < anual[mes].. const int SUCURSALES = 4. dia++) { for (int suc = 0.

Licencia CC (Creative Commons) Este tipo de licencias ofrecen algunos derechos a terceras personas bajo ciertas condiciones. Compartir igual (Share alike): La explotación autorizada incluye la creación de obras derivadas siempre que mantengan la misma licencia al ser divulgadas. Luis Hernández Yáñez Pulsa en la imagen de arriba a la derecha para saber más. Fundamentos de la programación: Recorrido y búsqueda en arrays Página 648 . Este documento tiene establecidas las siguientes: Reconocimiento (Attribution): En cualquier explotación de la obra autorizada por la licencia hará falta reconocer la autoría. No comercial (Non commercial): La explotación de la obra queda limitada a usos no comerciales.

Fundamentos de la programación 7 Grado en Ingeniería Informática Grado en Ingeniería del Software Grado en Ingeniería de Computadores Luis Hernández Yáñez Facultad de Informática Universidad Complutense Algoritmos de ordenación 651 Algoritmo de ordenación por inserción 654 Ordenación de arrays por inserción 665 Algoritmo de ordenación por inserción con intercambios 672 Claves de ordenación 680 Estabilidad de la ordenación 688 Complejidad y eficiencia 692 Ordenaciones naturales 694 Ordenación por selección directa 701 Método de la burbuja 716 Listas ordenadas 722 Búsquedas en listas ordenadas 729 Búsqueda binaria 731 Luis Hernández Yáñez Fundamentos de la programación: Algoritmos de ordenación .

facilitar las búsquedas.Luis Hernández Yáñez Fundamentos de la programación: Algoritmos de ordenación Página 651 Ordenación de listas array 125.80 254.62  316.40 76.29  219.05  328.95  93. .62 435. Variadas formas de hacerlo (algoritmos) Fundamentos de la programación: Algoritmos de ordenación Página 652 .62  0 1 2 3 4 5 6 7 8 9 array[i] <= array[i + 1] Luis Hernández Yáñez Mostrar los datos en orden..62 0 1 2 3 4 5 6 7 8 9 Algoritmo de ordenación (de menor a mayor) array 76.99 93.05 219..45  125.00  756.45 756.95 328.99  254.80  435.00 164.40  164.29 316.

Ordenación de listas Los datos de la lista deben poderse comparar entre sí Sentido de la ordenación:  Ascendente (de menor a mayor)  Descendente (de mayor a menor) Algoritmos de ordenación básicos:  Ordenación por inserción  Ordenación por selección directa  Ordenación por el método de la burbuja Los algoritmos se basan en comparaciones e intercambios Luis Hernández Yáñez Hay otros algoritmos de ordenación mejores Fundamentos de la programación: Algoritmos de ordenación Página 653 Luis Hernández Yáñez Fundamentos de la programación: Algoritmos de ordenación Página 654 .

Algoritmo de ordenación por inserción Partimos de una lista vacía Vamos insertando cada elemento en el lugar que le corresponda 6 1 Baraja de nueve cartas numeradas del 1 al 9 3 8 2 9 Las cartas están desordenadas 4 7 Luis Hernández Yáñez Ordenaremos de menor a mayor (ascendente) 5 Fundamentos de la programación: Algoritmos de ordenación Página 655 Algoritmo de ordenación por inserción 6 1 Colocamos el primer elemento en la lista vacía 3 8 2 9 4 7 5 Lista ordenada: 5 Luis Hernández Yáñez Fundamentos de la programación: Algoritmos de ordenación Página 656 .

Algoritmo de ordenación por inserción 6 1 El 7 es mayor que todos los elementos de la lista 3 8 Lo insertamos al final 2 9 4 7 Lista ordenada: 5 7 Luis Hernández Yáñez Fundamentos de la programación: Algoritmos de ordenación Página 657 Algoritmo de ordenación por inserción 6 1 Primer elemento (5) mayor que el nuevo (4): 3 8 Desplazamos todos una posición a la derecha 2 9 Insertamos el nuevo en la primera posición 4 Hemos insertado el elemento en su lugar Lista ordenada: 5 5 4 7 7 Luis Hernández Yáñez Fundamentos de la programación: Algoritmos de ordenación Página 658 .

Algoritmo de ordenación por inserción 6 1 9 es mayor que todos los elementos de la lista 3 8 Lo insertamos al final 2 9 Lista ordenada: 4 5 7 9 Luis Hernández Yáñez Fundamentos de la programación: Algoritmos de ordenación Página 659 Algoritmo de ordenación por inserción 6 1 Primer elemento (4) mayor que el nuevo (2): 3 8 Desplazamos todos una posición a la derecha 2 Insertamos el nuevo en la primera posición Lista ordenada: 4 4 2 5 5 7 7 9 9 Luis Hernández Yáñez Fundamentos de la programación: Algoritmos de ordenación Página 660 .

Algoritmo de ordenación por inserción 6 1 El 9 es el primer elemento mayor que el nuevo (8): 3 8 Desplazamos desde ese hacia la derecha Insertamos donde estaba el 9 Lista ordenada: 2 4 5 7 8 4 9 9 Luis Hernández Yáñez Fundamentos de la programación: Algoritmos de ordenación Página 661 Algoritmo de ordenación por inserción 6 1 Segundo elemento (4) mayor que el nuevo (3): 3 Desplazamos desde ese hacia la derecha Insertamos donde estaba el 4 Lista ordenada: 2 3 4 4 4 5 5 7 7 8 8 9 9 Luis Hernández Yáñez Fundamentos de la programación: Algoritmos de ordenación Página 662 .

Algoritmo de ordenación por inserción 6 1 Primer elemento (2) mayor que el nuevo (1): Desplazamos todos una posición a la derecha Insertamos el nuevo en la primera posición Lista ordenada: 2 2 1 3 3 4 4 5 5 7 7 8 8 9 9 Luis Hernández Yáñez Fundamentos de la programación: Algoritmos de ordenación Página 663 Algoritmo de ordenación por inserción 6 El 7 es el primer elemento mayor que el nuevo (6): Desplazamos desde ese hacia la derecha Insertamos donde estaba el 7 ¡¡¡ LISTA ORDENADA !!! Lista ordenada: 1 2 3 4 5 6 7 7 8 8 9 9 Luis Hernández Yáñez Fundamentos de la programación: Algoritmos de ordenación Página 664 .

Ordenación de arrays por inserción El array contiene inicialmente la lista desordenada: 20 7 14 32 5 14 27 12 13 15 0 1 2 3 4 5 6 7 8 9 A medida que insertamos: dos zonas en el array Parte ya ordenada y elementos por procesar 7 14 20 32 5 14 27 12 13 15 0 1 2 3 4 5 6 7 8 9 Parte ya ordenada Elementos por insertar Luis Hernández Yáñez Siguiente elemento a insertar en la parte ya ordenada Fundamentos de la programación: Algoritmos de ordenación Página 665 Ordenación de arrays por inserción Situación inicial: Lista ordenada con un solo elemento (primero) 20 7 14 32 5 14 27 12 13 15 0 1 2 3 4 5 6 7 8 9 Desde el segundo elemento del array hasta el último: Localizar el primer elemento mayor en lo ya ordenado 20 7 14 32 5 14 27 12 13 15 0 1 2 3 4 5 6 7 8 9 Luis Hernández Yáñez nuevo 7 Primer elemento mayor o igual: índice 0 Fundamentos de la programación: Algoritmos de ordenación Página 666 .

Ordenación de arrays por inserción . Desplazar a la derecha los ordenados desde ese lugar Insertar el nuevo en la posición que queda libre 20 7 14 32 5 14 27 12 13 15 0 1 2 3 4 5 6 7 8 9 nuevo 7 7 20 14 32 5 14 27 12 13 15 Luis Hernández Yáñez 0 1 2 3 4 5 6 7 8 9 nuevo 7 Fundamentos de la programación: Algoritmos de ordenación Página 667 Implementación const int N = 15. // Desde el segundo elemento hasta el último. . int nuevo.. } // pos: índice del primer mayor... Luis Hernández Yáñez } lista[pos] = nuevo. i si no lo hay for (int j = i. typedef int tLista[N]. tLista lista. for (int i = 1. } Fundamentos de la programación: Algoritmos de ordenación Página 668 . while ((pos < i) && !(lista[pos] > nuevo)) { pos++. j‐‐) { lista[j] = lista[j ‐ 1].. i++) { nuevo = lista[i]. . . pos. i < N. j > pos. pos = 0.

20 7 14 32 5 14 27 12 13 15 0 1 2 3 4 5 6 7 8 9 i 1 pos 0 nuevo 7 20 7 14 32 5 14 27 12 13 15 0 1 2 3 4 5 6 7 8 9 20 20 14 32 5 14 27 12 13 15 0 1 2 3 4 5 6 7 8 9 7 20 14 32 5 14 27 12 13 15 Luis Hernández Yáñez 0 1 2 3 4 5 6 7 8 9 Fundamentos de la programación: Algoritmos de ordenación Página 669 7 14 20 32 5 14 27 12 13 15 0 1 2 3 4 5 6 7 8 9 i 4 pos 0 nuevo 5 7 14 20 32 5 14 27 12 13 15 0 1 2 3 4 5 6 7 8 9 7 7 14 20 32 14 27 12 13 15 0 1 2 3 4 5 6 7 8 9 5 Luis Hernández Yáñez 7 14 20 32 14 27 12 13 15 0 1 2 3 4 5 6 7 8 9 Fundamentos de la programación: Algoritmos de ordenación Página 670 .

5 7 14 20 32 14 27 12 13 15 0 1 2 3 4 5 6 7 8 9 i 5 pos 3 nuevo 14 5 7 14 20 32 14 27 12 13 15 0 1 2 3 4 5 6 7 8 9 5 7 14 20 20 32 27 12 13 15 0 1 2 3 4 5 6 7 8 9 14 20 Luis Hernández Yáñez 5 7 14 32 27 12 13 15 0 1 2 3 4 5 6 7 8 9 Fundamentos de la programación: Algoritmos de ordenación Página 671 Luis Hernández Yáñez Fundamentos de la programación: Algoritmos de ordenación Página 672 .

La inserción de cada elemento se puede realizar con comparaciones e intercambios Desde el segundo elemento hasta el último: Desde la posición del nuevo elemento a insertar: Mientras el anterior sea mayor. intercambiar 5 7 14 20 32 14 27 12 13 15 0 1 2 3 4 5 6 7 8 9 5 7 14 20 14 32 27 12 13 15 0 1 2 3 4 5 6 7 8 9 Luis Hernández Yáñez 5 7 14 14 20 32 27 12 13 15 0 1 2 3 4 5 6 7 8 9 Fundamentos de la programación: Algoritmos de ordenación Página 673 7 14 20 32 5 14 27 12 13 15 0 1 2 3 4 5 6 7 8 9 7 14 20 5 32 14 27 12 13 15 0 1 2 3 4 5 6 7 8 9 7 14 5 20 32 14 27 12 13 15 0 1 2 3 4 5 6 7 8 9 7 5 14 20 32 14 27 12 13 15 0 1 2 3 4 5 6 7 8 9 Luis Hernández Yáñez 5 7 14 20 32 14 27 12 13 15 0 1 2 3 4 5 6 7 8 9 Fundamentos de la programación: Algoritmos de ordenación Página 674 .

tmp = lista[pos]. } tLista. i++) { pos = i.. #include <fstream> const int N = 100.cpp using namespace std. lista.. int contador. int tmp... . for (int i = 1. // Posición anterior Luis Hernández Yáñez } } Fundamentos de la programación: Algoritmos de ordenación Página 675 #include <iostream> insercion.contador = 0... int main() { tLista lista. tLista lista. pos. Fundamentos de la programación: Algoritmos de ordenación Página 676 .. const int N = 15. ifstream archivo. typedef int tLista[N].. pos. pos‐‐. while ((pos > 0) && (lista[pos ‐ 1] > lista[pos])) { // Intercambiar. . typedef struct { // Lista de longitud variable tArray elementos.. i < N.. tmp. lista[pos] = lista[pos ‐ 1]. // Desde el segundo elemento hasta el último. Luis Hernández Yáñez int dato. typedef int tArray[N]. // Mientras no al principio y anterior mayor. lista[pos ‐ 1] = tmp.

while ((pos > 0) && (lista.contador < N) && (dato != ‐1)) { // Centinela ‐1 al final lista. } Fundamentos de la programación: Algoritmos de ordenación Página 678 .elementos[pos ‐ 1] = tmp. i < lista.contador. lista.contador++.      . Fundamentos de la programación: Algoritmos de ordenación Página 677 for (int i = 1.contador.elementos[pos]))  { tmp = lista. for (int i = 0. Luis Hernández Yáñez for (int i = 0.elementos[i] << "  ". i++) { pos = i. archivo >> dato. } cout << endl. } Luis Hernández Yáñez cout << endl. } } cout << "Después de ordenar:" << endl. i < lista. while ((lista. lista.elementos[pos]. } archivo. archivo. pos‐‐.is_open()) { cout << "Error de apertura de archivo!" << endl.elementos[pos‐1] > lista.elementos[lista. i++) { cout << lista.open("insercion. } else { archivo >> dato.elementos[i] << "  ".. lista.txt"). if (!archivo.contador] = dato.. i++) { cout << lista. i < lista.contador.elementos[pos] = lista.close(). // Si hay más de N ignoramos el resto cout << "Antes de ordenar:" << endl. } return 0.elementos[pos ‐ 1].

Consideración de implementación ¿Operador relacional adecuado? lista[pos ‐ 1]   ¿ > o >= ? lista[pos] Con >= se realizan intercambios inútiles: 5 7 14 20 32 14 27 12 13 15 0 1 2 3 4 5 6 7 8 9 5 7 14 20 14 32 27 12 13 15 0 1 2 3 4 5 6 7 8 9 Luis Hernández Yáñez 5 7 14 14 20 32 27 12 13 15 0 1 2 3 4 5 6 7 8 9 ¡Intercambio inútil! Fundamentos de la programación: Algoritmos de ordenación Página 679 Luis Hernández Yáñez Fundamentos de la programación: Algoritmos de ordenación Página 680 .

typedef tDato tLista[N]. double sueldo. Clave de ordenación: Luis Hernández Yáñez Campo en el que se basan las comparaciones Fundamentos de la programación: Algoritmos de ordenación Página 681 Claves de ordenación tDato tmp. pos‐‐. Claves de ordenación Elementos que son estructuras con varios campos: const int N = 15.nombre)) { tmp = lista[pos].nombre > lista[pos]. } Comparación: campo concreto Intercambio: elementos completos Luis Hernández Yáñez Fundamentos de la programación: Algoritmos de ordenación Página 682 . lista[pos] = lista[pos ‐ 1]. } tDato. while ((pos > 0) && (lista[pos ‐ 1]. typedef struct { int codigo. lista[pos ‐ 1] = tmp. string nombre. tLista lista.

cpp Claves de ordenación #include <iostream> #include <string> using namespace std. Luis Hernández Yáñez int cont. . string nombre.nombre). pos‐‐. } tDato. typedef struct { int codigo. } tDato tmp. double sueldo. #include <fstream> #include <iomanip> const int N = 15. Fundamentos de la programación: Algoritmos de ordenación Página 684 . typedef struct { tArray datos. lista[pos] = lista[pos ‐ 1]. tDato opDer) { return (opIzq.. Claves de ordenación Función para la comparación: bool operator>(tDato opIzq.nombre > opDer. } tLista. while ((pos > 0) && (lista[pos ‐ 1] > lista[pos])) { tmp = lista[pos]. typedef tDato tArray[N].. lista[pos ‐ 1] = tmp. Luis Hernández Yáñez } Fundamentos de la programación: Algoritmos de ordenación Página 683 claves.

mostrar(lista).cont < N) && (dato.open("datos.cont = 0.datos[pos] = lista. Luis Hernández Yáñez lista. lista.. archivo.        .datos[pos])) { tDato tmp.cont++.close().cont... i < lista.codigo. } } cout << "Después de ordenar:" << endl..datos[pos ‐ 1] = tmp. for (int i = 1.codigo != ‐1)) { archivo >> dato. Fundamentos de la programación: Algoritmos de ordenación Página 685 cout << "Antes de ordenar:" << endl. lista.txt"). bool operator>(tDato opIzq. tDato opDer). pos‐‐. lista. tmp = lista.cont] = dato. ifstream archivo. i++) { // Desde el segundo elemento hasta el último int pos = i.datos[pos]. archivo >> dato.nombre >> dato.sueldo. Fundamentos de la programación: Algoritmos de ordenación Página 686 . } archivo. Luis Hernández Yáñez mostrar(lista).datos[pos‐1] > lista. void mostrar(tLista lista).codigo.datos[pos ‐ 1]. while ((pos > 0) && (lista. } else { tDato dato. int main() { tLista lista. if (!archivo. lista. archivo >> dato. } .datos[lista. while ((lista. } return 0.is_open()) { cout << "Error de apertura del archivo!" << endl.

} } bool operator>(tDato opIzq.nombre).nombre  << setw(12)  << fixed << setprecision(2) << lista.datos[i]. i < lista.datos[i].datos[i]. } Cambia a codigo o sueldo para ordenar por otros campos Fundamentos de la programación: Algoritmos de ordenación Página 687 Luis Hernández Yáñez Fundamentos de la programación: Algoritmos de ordenación Página 688 . i++) { cout << setw(10)  << lista.sueldo  << endl.nombre > opDer.cont. void mostrar(tLista lista) { for (int i = 0. tDato opDer) { Luis Hernández Yáñez return (opIzq.codigo << setw(20)  << lista.

la segunda ordenación preserva el orden de la primera tDato: tres posibles claves de ordenación (campos) Codigo 12345   Álvarez       120000 Nombre 11111   Benítez       100000 Sueldo 21112   Domínguez      90000 11111   Durán         120000 22222   Fernández     120000 12345   Gómez         100000 Lista ordenada por Nombre  10000   Hernández     150000 21112   Jiménez       100000 11111   Pérez          90000 12345   Sánchez        90000 Luis Hernández Yáñez 10000   Sergei        100000 33333   Tarazona      120000 12345   Turégano      100000 11111   Urpiano        90000 Fundamentos de la programación: Algoritmos de ordenación Página 689 Ordenamos ahora por el campo Codigo: 10000   Sergei        100000 10000   Hernández     150000 10000   Hernández     150000 10000   Sergei        100000 11111   Urpiano 90000 11111   Benítez 100000 11111   Benítez 100000 11111   Durán 120000 11111   Pérez 90000 11111   Pérez 90000 11111   Durán 120000 11111   Urpiano 90000 12345   Sánchez        90000 12345   Álvarez       120000 12345   Álvarez       120000 12345   Gómez         100000 12345   Turégano      100000 12345   Sánchez        90000 12345   Gómez         100000 12345   Turégano      100000 21112   Domínguez      90000 21112   Domínguez      90000 21112   Jiménez       100000 21112   Jiménez       100000 22222   Fernández     120000 22222   Fernández     120000 33333   Tarazona      120000 33333   Tarazona      120000 No estable: Estable: Luis Hernández Yáñez Los nombres no mantienen Los nombres mantienen sus posiciones relativas sus posiciones relativas Fundamentos de la programación: Algoritmos de ordenación Página 690 . Algoritmos de ordenación estables Al ordenar por otra clave una lista ya ordenada.

por nombres 10000   Hernández     150000 11111   Pérez          90000 10000   Sergei        100000 11111   Urpiano        90000 11111   Benítez       100000 12345   Sánchez        90000 11111   Durán         120000 21112   Domínguez      90000 11111   Pérez          90000 10000 Sergei        100000 11111   Urpiano        90000 11111 Benítez       100000 12345   Álvarez       120000 12345 Gómez 100000 12345   Gómez         100000 12345 Turégano 100000 12345   Sánchez        90000 21112 Jiménez       100000 12345   Turégano      100000 11111   Durán         120000 Luis Hernández Yáñez 21112   Domínguez      90000 12345   Álvarez       120000 21112   Jiménez       100000 22222   Fernández     120000 22222   Fernández     120000 33333   Tarazona      120000 33333   Tarazona      120000 10000   Hernández     150000 Fundamentos de la programación: Algoritmos de ordenación Página 691 Luis Hernández Yáñez Fundamentos de la programación: Algoritmos de ordenación Página 692 . ordenado por códigos y a igual código. Ordenación por inserción Estable siempre que utilicemos < o > Con <= o >= no es estable Ordenamos por sueldo: A igual sueldo.

basta una comparación cada vez Comportamiento natural Luis Hernández Yáñez Fundamentos de la programación: Algoritmos de ordenación Página 694 . se dice que la ordenación es natural Ordenación por inserción con la lista inicialmente ordenada:  Versión que busca el lugar primero y luego desplaza: No hay desplazamientos. mismo número de comparaciones Comportamiento no natural  Versión con intercambios: Trabaja mucho menos. más o igual la ordenación en cada caso? Fundamentos de la programación: Algoritmos de ordenación Página 693 Ordenaciones naturales Si el algoritmo trabaja menos cuanto más ordenada está inicialmente la lista. Casos de estudio para los algoritmos de ordenación  Lista inicialmente ordenada 5 7 12 13 14 14 15 20 27 32 0 1 2 3 4 5 6 7 8 9  Lista inicialmente ordenada al revés 32 27 20 15 14 14 13 12 7 5 0 1 2 3 4 5 6 7 8 9  Lista con disposición inicial aleatoria 13 20 7 14 12 32 27 14 5 15 0 1 2 3 4 5 6 7 8 9 Luis Hernández Yáñez ¿Trabaja menos.

for (int i = 1. while ((pos > 0) && (lista[pos ‐ 1] > lista[pos])) { int tmp. pos‐‐. Comparación tmp = lista[pos].. lista[pos] = lista[pos ‐ 1].. Elección de un algoritmo de ordenación ¿Cómo de bueno es cada algoritmo? ¿Cuánto tarda en comparación con otros algoritmos? Algoritmos más eficientes: los de menor complejidad Tardan menos en realizar la misma tarea Comparamos en orden de complejidad: O() En función de la dimensión de la lista a ordenar: N O() = f (N) Operaciones que realiza el algoritmo de ordenación:  Comparaciones Luis Hernández Yáñez  Intercambios Asumimos que tardan un tiempo similar Fundamentos de la programación: Algoritmos de ordenación Página 695 Cálculo de la complejidad Ordenación por inserción (con intercambios): . lista[pos ‐ 1] = tmp. i < N. i++) { int pos = i. Intercambio } Luis Hernández Yáñez } Intercambios y comparaciones: Tantos como ciclos realicen los correspondientes bucles Fundamentos de la programación: Algoritmos de ordenación Página 696 .

lista[pos] = lista[pos ‐ 1]. i++) { int pos = i. Nº variable de ciclos while ((pos > 0) && (lista[pos ‐ 1] > lista[pos])) { int tmp... pos‐‐. como 2) Fundamentos de la programación: Algoritmos de ordenación Página 698 . N ‐ 1 ciclos for (int i = 1. lista[pos ‐ 1] = tmp. } Luis Hernández Yáñez } Caso en el que el while se ejecuta más: caso peor Caso en el que se ejecuta menos: caso mejor Fundamentos de la programación: Algoritmos de ordenación Página 697 Cálculo de la complejidad  Caso mejor: lista inicialmente ordenada La primera comparación falla: ningún intercambio (N ‐ 1) * (1 comparación + 0 intercambios) = N ‐ 1  O(N)  Caso peor: lista inicialmente ordenada al revés Para cada pos. + (N ‐ 1) ((N ‐ 1) + 1) x (N ‐ 1) / 2 N * (N ‐ 1) / 2 (N2 ‐ N) / 2  O(N2) Notación O grande: orden de complejidad en base a N Luis Hernández Yáñez El término en N que más rápidamente crece al crecer N En el caso peor.. tmp = lista[pos].. entre i y 1: 1 comparación y 1 intercambio 1 + 2 + 3 + 4 + . N2 crece más rápido que N  O(N2) (Ignoramos las constantes. Cálculo de la complejidad . i < N.

... Ordenación por inserción (con intercambios)  Caso mejor: O(N)  Caso peor: O(N2) Caso medio (distribución aleatoria de los elementos): O(N2) Hay algoritmos de ordenación mejores Luis Hernández Yáñez Fundamentos de la programación: Algoritmos de ordenación Página 699 Órdenes de complejidad O(log N) < O(N) < O(N log N) < O(N2) < O(N3) . N       log2 N          N2 ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ 1         0             1 2         1             4 4         2            16 8         3            64 16         4           256 32         5          1024 64         6          4096 Luis Hernández Yáñez 128         7         16384 256         8         65536 . Fundamentos de la programación: Algoritmos de ordenación Página 700 ..

Luis Hernández Yáñez Fundamentos de la programación: Algoritmos de ordenación Página 701 Algoritmo de ordenación por selección directa Seleccionar el siguiente elemento menor de los que queden Lista desordenada: 5 7 4 9 2 8 3 1 6 Lista ordenada: Luis Hernández Yáñez Fundamentos de la programación: Algoritmos de ordenación Página 702 .

Algoritmo de ordenación por selección directa Seleccionar el siguiente elemento menor de los que queden Lista desordenada: 5 7 4 9 2 8 3 6 Lista ordenada: 1 Luis Hernández Yáñez Fundamentos de la programación: Algoritmos de ordenación Página 703 Algoritmo de ordenación por selección directa Seleccionar el siguiente elemento menor de los que queden Lista desordenada: 5 7 4 9 8 3 6 Lista ordenada: 1 2 Luis Hernández Yáñez Fundamentos de la programación: Algoritmos de ordenación Página 704 .

Algoritmo de ordenación por selección directa Seleccionar el siguiente elemento menor de los que queden Lista desordenada: 5 7 4 9 8 6 Lista ordenada: 1 2 3 Luis Hernández Yáñez Fundamentos de la programación: Algoritmos de ordenación Página 705 Algoritmo de ordenación por selección directa Seleccionar el siguiente elemento menor de los que queden Lista desordenada: 5 7 9 8 6 Lista ordenada: 1 2 3 4 Luis Hernández Yáñez Fundamentos de la programación: Algoritmos de ordenación Página 706 .

Algoritmo de ordenación por selección directa Seleccionar el siguiente elemento menor de los que queden Lista desordenada: 7 9 8 6 Lista ordenada: 1 2 3 4 5 Luis Hernández Yáñez Fundamentos de la programación: Algoritmos de ordenación Página 707 Algoritmo de ordenación por selección directa Seleccionar el siguiente elemento menor de los que queden Lista desordenada: 7 9 8 Lista ordenada: 1 2 3 4 5 6 Luis Hernández Yáñez Fundamentos de la programación: Algoritmos de ordenación Página 708 .

Algoritmo de ordenación por selección directa Seleccionar el siguiente elemento menor de los que queden Lista desordenada: 9 8 Lista ordenada: 1 2 3 4 5 6 7 Luis Hernández Yáñez Fundamentos de la programación: Algoritmos de ordenación Página 709 Algoritmo de ordenación por selección directa Seleccionar el siguiente elemento menor de los que queden Lista desordenada: 9 Lista ordenada: 1 2 3 4 5 6 7 8 Luis Hernández Yáñez Fundamentos de la programación: Algoritmos de ordenación Página 710 .

Algoritmo de ordenación por selección directa Seleccionar el siguiente elemento menor de los que queden Lista desordenada: ¡¡¡ LISTA ORDENADA !!! Lista ordenada: 1 2 3 4 5 6 7 8 9 Luis Hernández Yáñez Fundamentos de la programación: Algoritmos de ordenación Página 711 Ordenación de un array por selección directa Desde el primer elemento (i = 0) hasta el penúltimo (N‐2): Menor elemento (en m) entre i + 1 y el último (N‐1) Intercambiar los elementos en i y m si no son el mismo i m 20 7 14 32 5 14 27 12 13 15 0 1 2 3 4 5 6 7 8 9 im Sólo intercambiamos si no es la misma posición Luis Hernández Yáñez 5 7 14 32 20 14 27 12 13 15 0 1 2 3 4 5 6 7 8 9 Fundamentos de la programación: Algoritmos de ordenación Página 712 .

Ordenación de un array por selección directa i m 5 7 14 32 20 14 27 12 13 15 0 1 2 3 4 5 6 7 8 9 i m 5 7 12 32 20 14 27 14 13 15 0 1 2 3 4 5 6 7 8 9 i m Luis Hernández Yáñez 5 7 12 13 20 14 27 14 32 15 0 1 2 3 4 5 6 7 8 9 Fundamentos de la programación: Algoritmos de ordenación Página 713 seleccion.. } } Fundamentos de la programación: Algoritmos de ordenación Página 714 . // Desde i + 1 hasta el final. // Desde el primer elemento hasta el penúltimo. i++) { int menor = i.cpp Implementación const int N = 15. j++) { if (lista[j] < lista[menor]) { menor = j.. j < N. for (int i = 0. for (int j = i + 1. } } if (menor > i) { int tmp. i < N ‐ 1.. tLista lista. lista[menor] = tmp. typedef int tLista[N]. Luis Hernández Yáñez lista[i] = lista[menor].. tmp = lista[i].

. Complejidad de la ordenación por selección directa ¿Cuántas comparaciones se realizan? Bucle externo: N ‐ 1 ciclos Tantas comparaciones como elementos queden en la lista: (N ‐ 1) + (N ‐ 2) + (N ‐ 3) + . + 3 + 2 + 1 = N x (N ‐ 1) / 2 = (N2 ‐ N) / 2  O(N2) Mismo número de comparaciones en todos los casos Complejidad: O(N2) Igual que el método de inserción Algo mejor (menos intercambios.. uno en cada paso) No es estable: intercambios “a larga distancia” Luis Hernández Yáñez No se garantiza que se mantenga el mismo orden relativo original Comportamiento no natural (trabaja siempre lo mismo) Fundamentos de la programación: Algoritmos de ordenación Página 715 Luis Hernández Yáñez Fundamentos de la programación: Algoritmos de ordenación Página 716 .

Algoritmo de ordenación por el método de la burbuja Variación del método de selección directa El elemento menor va ascendiendo hasta alcanzar su posición 9 9 9 9 1 4 4 4 1 9 3 3 1 4 4 6 1 3 3 3 Luis Hernández Yáñez 1 6 6 6 6 Fundamentos de la programación: Algoritmos de ordenación Página 717 12 32 14 5 14 7 0 1 2 3 4 5 12 32 14 5 7 14 0 1 2 3 4 5 12 32 14 5 7 14 0 1 2 3 4 5 12 32 5 14 7 14 0 1 2 3 4 5 12 5 32 14 7 14 Luis Hernández Yáñez 0 1 2 3 4 5 5 12 32 14 7 14 0 1 2 3 4 5 Fundamentos de la programación: Algoritmos de ordenación Página 718 .

. } } } Fundamentos de la programación: Algoritmos de ordenación Página 719 Algoritmo de ordenación por el método de la burbuja Complejidad: O(N2) Comportamiento no natural Estable (mantiene el orden relativo) Mejora: Si en un paso del bucle exterior no ha habido intercambios: La lista ya está ordenada (no es necesario seguir) 14      14      14      12 16      16      12      14 La lista ya está ordenada 35      12      16      16 Luis Hernández Yáñez No hace falta seguir 12      35      35      35 50      50      50      50 Fundamentos de la programación: Algoritmos de ordenación Página 720 .... for (int j = N ‐ 1. j > i.. intercambiarlos . hasta el penúltimo (N ‐ 2): Desde el último (j = N – 1). Luis Hernández Yáñez lista[j ‐ 1] = tmp. int tmp.. hasta i + 1: Si elemento en j < elemento en j ‐ 1. for (int i = 0. i < N ‐ 1. const int N = 10.cpp Ordenación de un array por el método de la burbuja Desde el primero (i = 0). i++) { // Desde el último hasta el siguiente a i. // Del primero al penúltimo. lista[j] = lista[j ‐ 1]. tLista lista. j‐‐) { if (lista[j] < lista[j ‐ 1]) { tmp = lista[j]. typedef int tLista[N]. burbuja.

. j‐‐) { if (lista[j] < lista[j ‐ 1]) { int tmp.. // Desde el 1º hasta el penúltimo si hay intercambios.. burbuja2. for (int j = N ‐ 1. int i = 0.cpp bool inter = true. // Desde el último hasta el siguiente a i. j > i. lista[j ‐ 1] = tmp. } } if (inter) { Luis Hernández Yáñez i++. tmp = lista[j].. inter = true. while ((i < N ‐ 1) && inter) { inter = false. lista[j] = lista[j ‐ 1]. } } Esta variación sí tiene un comportamiento natural Fundamentos de la programación: Algoritmos de ordenación Página 721 Luis Hernández Yáñez Fundamentos de la programación: Algoritmos de ordenación Página 722 .

string nombre. typedef tRegistro tArray[N]. double sueldo. Gestión de listas ordenadas Casi todas las tareas se realizan igual que en listas sin orden Operaciones que tengan en cuenta el orden:  Inserción de un nuevo elemento: debe seguir en orden  Búsquedas más eficientes ¿Y la carga desde archivo?  Si los elementos se guardaron en orden: se lee igual  Si los elementos no están ordenados en el archivo: insertar Luis Hernández Yáñez Fundamentos de la programación: Algoritmos de ordenación Página 723 lista. Luis Hernández Yáñez Fundamentos de la programación: Algoritmos de ordenación Página 724 .cpp Declaraciones: Iguales que para listas sin orden const int N = 20. typedef struct { int codigo. typedef struct { tArray registros. } tLista. } tRegistro. int cont.

. tRegistro opDer). por lo que cargar() no cambia bool operator>(tRegistro opIzq. Luis Hernández Yáñez Fundamentos de la programación: Algoritmos de ordenación Página 725 Nuevas implementaciones:  Operadores relacionales  Inserción (mantener el orden)  Búsqueda (más eficiente) Se guarda la lista en orden. void cargar(tLista &lista. int pos.nombre > opDer. Subprogramas: Misma declaración que para listas sin orden void mostrarDato(int pos. tRegistro nuevo(). void mostrar(tLista lista). bool &ok). tRegistro opDer) { return opIzq. // pos = 1. tRegistro registro. bool &ok). void insertar(tLista &lista. Luis Hernández Yáñez } Fundamentos de la programación: Algoritmos de ordenación Página 726 . tRegistro registro). void guardar(tLista lista).nombre. } bool operator<(tRegistro opIzq. void eliminar(tLista &lista. tRegistro opDer).nombre. bool operator>(tRegistro opIzq. bool &ok). tRegistro opDer) { return opIzq. string nombre).N int buscar(tLista lista.nombre < opDer. bool operator<(tRegistro opIzq.

cont) && (lista. // lista llena } else { int i = 0. void insertar(tLista &lista. } // Insertamos en la posición i (primer mayor o igual) for (int j = lista.registros[i] < registro)) { i++. if (lista.cont == N) { ok = false. lista. bool &ok) { ok = true. tRegistro registro.cont. j > i.registros[j ‐ 1].registros[j] = lista. j‐‐) { // Desplazamos una posición a la derecha lista. } Luis Hernández Yáñez lista. } } Fundamentos de la programación: Algoritmos de ordenación Página 727 Luis Hernández Yáñez Fundamentos de la programación: Algoritmos de ordenación Página 728 .cont++.registros[i] = registro. while ((i < lista.

while ((i < N) && (lista[i] < buscado)) { i++. tLista lista. } else if (lista[i] == buscado) { // Encontrado! cout << "Encontrado en posición " << i + 1 << endl. o estamos al final o lista[i] >= buscado if (i == N) { // Al final: no se ha encontrado cout << "No encontrado!" << endl. int i = 0. typedef int tLista[N]. cin >> buscado. const int N = 10. } else { // Hemos encontrado uno mayor Luis Hernández Yáñez cout << "No encontrado!" << endl. Búsqueda de un elemento en una secuencia No ordenada: recorremos hasta encontrarlo o al final Ordenada: recorremos hasta encontrarlo o mayor / al final 5 7 12 13 14 14 15 20 27 32 0 1 2 3 4 5 6 7 8 9 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 terminación:  Se llega al final  Se encuentra el elemento buscado Luis Hernández Yáñez  Se encuentra uno mayor  Mientras no al final y el valor sea menor que el buscado Fundamentos de la programación: Algoritmos de ordenación Página 729 int buscado. } Complejidad: O(N) Fundamentos de la programación: Algoritmos de ordenación Página 730 . cout << "Valor a buscar: ". } // Ahora.

terminar Si no.Luis Hernández Yáñez Fundamentos de la programación: Algoritmos de ordenación Página 731 Búsqueda mucho más rápida que aprovecha la ordenación Comparar con el valor que esté en el medio de la lista: Si es el que se busca. buscar en la primera mitad de la lista Si no. si es mayor. si es menor. buscar en la segunda mitad de la lista Repetir hasta encontrarlo o no quede sublista donde buscar Buscamos el 12 Elemento mitad 5 7 12 14 14 15 18 20 27 32 0 1 2 3 4 5 6 7 8 9 5 7 12 14 14 15 18 20 27 32 Luis Hernández Yáñez 0 1 2 3 4 5 6 7 8 9 5 7 12  14 14 15 18 20 27 32 0 1 2 3 4 5 6 7 8 9 Fundamentos de la programación: Algoritmos de ordenación Página 732 .

no queda dónde buscar Fundamentos de la programación: Algoritmos de ordenación Página 733 Buscamos el 12 ini mitad fin 5 7 12 14 14 15 18 20 27 32 0 1 2 3 4 5 6 7 8 9 12 < lista[mitad]  fin = mitad – 1 ini mitad fin 5 7 12 14 14 15 18 20 27 32 0 1 2 3 4 5 6 7 8 9 12 > lista[mitad]  ini = mitad + 1 ini fin Luis Hernández Yáñez 5 7 12 14 14 15 18 20 27 32 0 1 2 3 4 5 6 7 8 9 mitad ¡Encontrado! Fundamentos de la programación: Algoritmos de ordenación Página 734 . Vamos buscando en sublistas cada vez más pequeñas (mitades) Delimitamos el segmento de la lista donde buscar Inicialmente tenemos toda la lista: ini mitad fin 5 7 12 14 14 15 18 20 27 32 0 1 2 3 4 5 6 7 8 9 Índice del elemento en la mitad: mitad = (ini + fin) / 2 Si no se encuentra. ¿dónde seguir buscando? Buscado < elemento en la mitad: fin = mitad ‐ 1 Luis Hernández Yáñez Buscado > elemento en la mitad: ini = mitad + 1 Si ini > fin.

tLista lista. typedef int tLista[N]. fin = N – 1. bool encontrado = false. int ini = 0. Si el elemento no está. int buscado. cin >> buscado. } else { Luis Hernández Yáñez ini = mitad + 1. // División entera if (buscado == lista[mitad]) { encontrado = true. } } // Si se ha encontrado. while ((ini <= fin) && !encontrado) { mitad = (ini + fin) / 2. mitad. nos quedamos sin sublista: ini > fin Para el 13: mitad ini fin 5 7 12 14 14 15 18 20 27 32 0 1 2 3 4 5 6 7 8 9 13 > lista[mitad]  ini = mitad + 1 mitad ini fin 5 7 12 14 14 15 18 20 27 32 0 1 2 3 4 5 6 7 8 9 Luis Hernández Yáñez 13 < lista[mitad]  fin = mitad – 1  2 ¡¡¡ ini > fin !!! No hay dónde seguir buscando  No está Fundamentos de la programación: Algoritmos de ordenación Página 735 Implementación const int N = 10. } else if (buscado < lista[mitad]) { fin = mitad ‐ 1. está en [mitad] Fundamentos de la programación: Algoritmos de ordenación Página 736 . cout << "Valor a buscar: ".

 pos. typedef struct { tArray elementos. Fundamentos de la programación: Algoritmos de ordenación Página 737 while ((lista.close(). archivo.elementos[i] << "  ". pos = buscar(lista.open("ordenados.. int cont. for (int i = 0. buscado). Fundamentos de la programación: Algoritmos de ordenación Página 738 . int buscado).cont < N) && (dato != ‐1)) { lista.cont = 0.elementos[lista. #include <iostream> binaria. } archivo. } else { Luis Hernández Yáñez cout << "No encontrado!" << endl. } tLista. }   return 0. lista.. #include <fstream> const int N = 100. i < lista.cont] = dato.. i++) { cout << lista. Luis Hernández Yáñez int dato.txt"). .cpp using namespace std. lista.cont++. int buscado. int main() { tLista lista. typedef int tArray[N]. } cout << endl. cout << "Valor a buscar: ". if (pos != ‐1) { cout << "Encontrado en la posición " << pos + 1 << endl.. // Existe y es correcto archivo >> dato.cont. cin >> buscado. archivo >> dato. int buscar(tLista lista. } . ifstream archivo.

} } if (encontrado) { Luis Hernández Yáñez pos = mitad. . } Fundamentos de la programación: Algoritmos de ordenación Página 739 Complejidad ¿Qué orden de complejidad tiene la búsqueda 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 / 8. while ((ini <= fin) && !encontrado) { mitad = (ini + fin) / 2.. 2k‐2. 21. 2k‐1 Nº de elementos de esa serie: k Luis Hernández Yáñez Nº de comparaciones = k N = 2k  k = log2 N Complejidad: O(log2 N) Mucho más rápida que O(N) Fundamentos de la programación: Algoritmos de ordenación Página 740 .cont ‐ 1. 4... N / 16. 2. N / 8. N / 4.. int buscar(tLista lista. fin = lista. int buscado) { int pos = ‐1. mitad. 22.. 2k‐4.. 23. N / 4. 8. .. .. } else if (buscado < lista. } return pos. } else { ini = mitad + 1. N / 16. N / 2 Si hacemos que N sea igual a 2k: 20. 2k‐3. ini = 0.elementos[mitad]) { encontrado = true. // División entera if (buscado == lista..elementos[mitad]) { fin = mitad ‐ 1. 8. 1  1. bool encontrado = false. 2. 4.

Luis Hernández Yáñez Pulsa en la imagen de arriba a la derecha para saber más. Licencia CC (Creative Commons) Este tipo de licencias ofrecen algunos derechos a terceras personas bajo ciertas condiciones. No comercial (Non commercial): La explotación de la obra queda limitada a usos no comerciales. Compartir igual (Share alike): La explotación autorizada incluye la creación de obras derivadas siempre que mantengan la misma licencia al ser divulgadas. Fundamentos de la programación: Algoritmos de ordenación Página 741 . Este documento tiene establecidas las siguientes: Reconocimiento (Attribution): En cualquier explotación de la obra autorizada por la licencia hará falta reconocer la autoría.

Fundamentos de la programación 7A Grado en Ingeniería Informática Grado en Ingeniería del Software Grado en Ingeniería de Computadores Luis Hernández Yáñez Facultad de Informática Universidad Complutense Ordenación por intercambio 744 Mezcla de dos listas ordenadas 747 Luis Hernández Yáñez Fundamentos de la programación: Algoritmos de ordenación (Anexo) .

Luis Hernández Yáñez Fundamentos de la programación: Algoritmos de ordenación (Anexo) Página 744 Algoritmo de ordenación por intercambio Variación del método de selección directa Se intercambia el elemento de la posición que se trata en cada momento siempre que se encuentra uno que es menor: 14 7 12 32 20 14 27 5 13 15 0 1 2 3 4 5 6 7 8 9 7 14 12 32 20 14 27 5 13 15 0 1 2 3 4 5 6 7 8 9 Luis Hernández Yáñez 5 14 12 32 20 14 27 7 13 15 0 1 2 3 4 5 6 7 8 9 Fundamentos de la programación: Algoritmos de ordenación (Anexo) Página 745 .

for (int i = 0. } } Luis Hernández Yáñez } Igual número de comparaciones. j++) { // Desde i+1 hasta el final if (lista[j] < lista[i]) { int tmp.cpp const int N = 10.. tLista lista.. intercambio. lista[j] = tmp. i < N ‐ 1. muchos más intercambios No es estable Fundamentos de la programación: Algoritmos de ordenación (Anexo) Página 746 Luis Hernández Yáñez Fundamentos de la programación: Algoritmos de ordenación (Anexo) Página 747 . i++) { // Desde el primer elemento hasta el penúltimo for (int j = i + 1. j < N. . tmp = lista[i]. typedef int tLista[N]. lista[i] = lista[j].

Luis Hernández Yáñez } . pos2++.cont] = lista1.elementos[pos1]. Un índice para cada lista. pos2 = 0.cont) && (pos2 < lista2. pos1++..elementos[pos2]. int cont. } listaM. } else { listaM..cont) && (listaM. inicializados a 0 (principio de las listas) Mientras que no lleguemos al final de alguna de las dos listas: Elegimos el elemento menor de los que tienen los índices Lo copiamos en la lista resultado y avanzamos su índice una posición Luis Hernández Yáñez Copiamos en la lista resultado los que queden en la lista no acabada Fundamentos de la programación: Algoritmos de ordenación (Anexo) Página 748 void mezcla(tLista lista1.cont++. tLista lista2. tLista &listaM) { int pos1 = 0.elementos[listaM.elementos[listaM. } tLista.cont] = lista2.elementos[pos1] < lista2.elementos[pos2]) { listaM. Mezcla de dos listas ordenadas en arrays const int N = 100.cont < N)) { if (lista1. listaM. while ((pos1 < lista1. Fundamentos de la programación: Algoritmos de ordenación (Anexo) Página 749 .cont = 0. typedef struct { int elementos[N].

int dato1. } } } Luis Hernández Yáñez Fundamentos de la programación: Algoritmos de ordenación (Anexo) Página 750 Mezcla de dos listas ordenadas en archivos void mezcla(string nombre1.cont while ((pos2 < lista2.cpp // Pueden quedar datos en alguna de las listas if (pos1 < lista1. listaM.. string nombreM) { // Mezcla las secuencias en los archivos nombnre1 y nombre2 // generando la secuencia mezclada en el archivo nombreM ifstream archivo1.cont) && (listaM.cont) { while ((pos1 < lista1.cont] = lista2. // Los archivos existen y son correctos archivo1.cont < N)) { listaM. mezcla1. pos2++. } } else { // pos2 < lista2.open(nombre1.c_str()). pos1++.c_str()). dato2. archivo2 >> dato2.elementos[listaM. Fundamentos de la programación: Algoritmos de ordenación (Anexo) Página 751 .open(nombre2.open(nombreM.cont) && (listaM.cont < N)) { listaM.elementos[listaM. archivo2..cont++. Luis Hernández Yáñez while ((dato1 != ‐1) && (dato2 != ‐1)) { // Mientras quede algo en ambos archivos . archivo2.cont] = lista1. string nombre2. mezcla.c_str()).elementos[pos1].elementos[pos2]. archivo1 >> dato1.cont++. ofstream mezcla. listaM.

close().. } Luis Hernández Yáñez Fundamentos de la programación: Algoritmos de ordenación (Anexo) Página 753 . } } else { // Quedan en el segundo archivo while (dato2 != ‐1) { Luis Hernández Yáñez mezcla << dato2 << endl. } } // Uno de los dos archivos se ha acabado if (dato1 != ‐1) { // Quedan en el primer archivo while (dato1 != ‐1) { mezcla << dato1 << endl. archivo1 >> dato1. archivo2 >> dato2.cpp archivo2..close(). mezcla. Fundamentos de la programación: Algoritmos de ordenación (Anexo) Página 752 mezcla2. archivo2 >> dato2. } else { mezcla << dato2 << endl. archivo1. archivo1 >> dato1. if (dato1 < dato2) { mezcla << dato1 << endl. } } . mezcla << ‐1 << endl.close().

Este documento tiene establecidas las siguientes: Reconocimiento (Attribution): En cualquier explotación de la obra autorizada por la licencia hará falta reconocer la autoría. Luis Hernández Yáñez Pulsa en la imagen de arriba a la derecha para saber más. Compartir igual (Share alike): La explotación autorizada incluye la creación de obras derivadas siempre que mantengan la misma licencia al ser divulgadas. Fundamentos de la programación: Algoritmos de ordenación (Anexo) Página 754 . Licencia CC (Creative Commons) Este tipo de licencias ofrecen algunos derechos a terceras personas bajo ciertas condiciones. No comercial (Non commercial): La explotación de la obra queda limitada a usos no comerciales.

Fundamentos de la programación 8 Grado en Ingeniería Informática Grado en Ingeniería del Software Grado en Ingeniería de Computadores Luis Hernández Yáñez Facultad de Informática Universidad Complutense Programas multiarchivo y compilación separada  757 Interfaz frente a implementación 762 Uso de módulos de biblioteca 768 Ejemplo: Gestión de una lista ordenada I 770 Compilación de programas multiarchivo 778 El preprocesador 780 Cada cosa en su módulo 782 Ejemplo: Gestión de una lista ordenada II 784 El problema de las inclusiones múltiples 789 Compilación condicional 794 Protección frente a inclusiones múltiples 795 Ejemplo: Gestión de una lista ordenada III 796 Implementaciones alternativas 804 Espacios de nombres 808 Implementaciones alternativas 817 Luis Hernández Yáñez Calidad y reutilización del software 827 Fundamentos de la programación: Programación modular .

cout << min(lista) << endl. guardar(lista. void remove(tArray &lista. string nombre). bool exportar(string nombre). sort(lista).  cout << sum(lista) << endl. cout << max(lista) << endl. string arch2). tArray elem. bool &ok). bool mezclar(string arch1. cargar(lista. dato. "bd..txt"). int pos.) Lista Principal Cálculos Archivos const int N = 10. typedef struct { bool ok. . cin >> dato..  insert(lista. } Luis Hernández Yáñez Ejecutable Fundamentos de la programación: Programación modular Página 758 . return 0.. double max(tArray lista).  typedef double tArray[N]. init(lista). .Luis Hernández Yáñez Fundamentos de la programación: Programación modular Página 757 Programas multiarchivo Código fuente repartido entre varios archivos (módulos) Cada módulo con sus declaraciones y sus subprogramas  Módulo: Unidad funcional (estructura de datos. double sum(tArray lista). "bd. double desv(tArray lista).  int maxIndex(tArray lista). utilidades. bool cargar(tArray &lista. ok). int main() { double mean(tArray lista). cout << "Dato: ".  int cont.. bool guardar(tArray lista. void insert(tArray &lista. int minIndex(tArray lista). double dato. bool &ok). tArray lista. } tArray. string nombre). int size(string nombre).  void init(tArray &lista). double elem.txt"). double min(tArray lists).

 ok). dato.  10101010101111001100101010110 string arch2). 01011111110101011001101010111 01010101010101010101010010101 bool guardar(tArray lista.. 01001010100101010010101001010 10100101000010011110100101010 int maxIndex(tArray lista).  void remove(tArray &lista. 11001010101001010100101010101 01010010101001010101010000101 double sum(tArray lista).  00001001010100101010101010110 01010101000001010101011010100 string nombre). insert(lista.obj const int N = 10. "bd.  01101010101010010010101001111 00101010101001010100101010010 10100101010100101000010011110 Archivos archivos. 00101110101011001010010010101 typedef double tArray[N]. int pos. bool &ok). lista. 01100101010101010101010101001 int cont. 01010101010100000101010101101 } tArray.obj ..obj int size(string nombre). cin >> dato. 10101010100101010010101010100 double mean(tArray lista). archivos. 10101010101010000101010111100 bool mezclar(string arch1.. Bibliotecas del sistema bool ok. 10010101011001010101001010100 10101010101010010101001010101 11101010110010100100101010010 bool cargar(tArray &lista.. calculos.. iostream. sort(lista).obj cout << "Dato: ". 01011001010010010101001010100 00101010111001010100101000111 10101011111010101000101001010 01010111010011010101001010101 double min(tArray lists). 01110101011101001101010100101 01010101010100101010101010110 .obj double elem. "bd. 10101010010101001010100101010 01010101001010000100111101001 01010110010101010010101001010 bool exportar(string nombre). } return 0. math.obj double dato. cargar(lista.txt").  01000010101011100101010010100 10100101010111110101010001010 string nombre). Luis Hernández Yáñez Ejecutable Fundamentos de la programación: Programación modular Página 760 . bool &ok). void insert(tArray &lista. 10101010010101010101011001010 11111101010110011010101110000 10101010101010101001010101010 10010101001010101010101101111 double max(tArray lista).obj cout << sum(lista) << endl. guardar(lista. fstream.obj cout << min(lista) << endl.obj . 01011100101010010100011101010 11101001101010100101010111111 10101011001101010111000010010 10100101010101010110001111010 Fundamentos de la programación: Programación modular Página 759 Compilación separada Al compilar el programa principal. 10101010100100101010011110010 Cálculos calculos. 00101010010101011111010101000 typedef struct { 10100101010101010010101010101 tArray elem. 01001010101010101000010101011 11001010101010111100110010101 void init(tArray &lista). 10100000101010101101010010101 01010101000010101011110010101 Luis Hernández Yáñez double desv(tArray lista).  cout << max(lista) << endl. init(lista)..txt"). 01010111100110010101011010101 01010010010101001111001010101 int minIndex(tArray lista). Compilación separada Cada módulo se compila a código objeto de forma independiente Lista lista. se adjuntan los módulos compilados Principal Módulos del programa int main() { tArray lista.

. Compilación separada ¡Sólo los archivos fuente modificados necesitan ser recompilados! Principal lista..obj iostream.obj  main. .obj  fstream.obj archivos.obj math..obj .. ENLACE Luis Hernández Yáñez Ejecutable Fundamentos de la programación: Programación modular Página 761 Luis Hernández Yáñez Fundamentos de la programación: Programación modular Página 762 .cpp main.cpp COMPILACIÓN lista.obj calculos.

cpp Luis Hernández Yáñez Repartimos el código entre ambos archivos (lista. Archivo de cabecera: extensión . tipos y prototipos indican cómo se usa: Interfaz  Estructura de datos con los subprogramas que la gestionan  Conjunto de utilidades (subprogramas) de uso general Luis Hernández Yáñez  Etcétera + Implementación de los subprogramas (cómo se hace) Fundamentos de la programación: Programación modular Página 763 Creación de módulos de biblioteca Interfaz: Definiciones/declaraciones de datos y prototipos ¡Todo lo que el usuario de la unidad funcional necesita saber! Implementación: Código de los subprogramas que hacen el trabajo No hay que conocerlo para usarlo: ¡Seguro que es correcto! Interfaz e implementación en dos archivos separados:  Cabecera: Definiciones/declaraciones de datos y prototipos  Implementación: Implementación de los subprogramas.h/lista. Creación de módulos de biblioteca Código de un programa de un único archivo:  Definiciones de constantes  Declaraciones de tipos de datos  Prototipos de los subprogramas  Implementación de los subprogramas  Implementación de la función main() Constantes.cpp) Fundamentos de la programación: Programación modular Página 764 .h Mismo nombre Archivo de implementación: extensión .

.h" Los nombres de archivos de cabecera . comprobar si el código de main.  bool &ok). propios (no del sistema) se encierran entre dobles comillas. hace un uso correcto de la lista void remove(tArray &lista. no entre ángulos Fundamentos de la programación: Programación modular Página 765 Creación de módulos de biblioteca lista... double elem.. typedef struct { tArray elem. void remove(tArray &lista.. bool &ok) { if (lista. #include "lista..cpp main. Unidad int cont. typedef struct { tArray elem. typedef struct { tArray elem. La directiva #include añade las declaraciones del archivo de cabecera en el código del módulo (preprocesamiento): main. bool &ok). } tArray.. bool &ok).cpp Preprocesador #include "lista. Interfaz typedef double tArray[N].. } tArray.. .. (declaraciones y llamadas) . Archivo de cabecera (. } void insert(tArray &lista. int cont. void init(tArray &lista) { lista. int pos.cont = 0.cpp void insert(tArray &lista. double elem. double elem. int cont.cont == N) { void insert(tArray &lista. } else { void remove(tArray &lista. typedef double tArray[N]. Todo lo que se necesita saber para } tArray.cpp #include "lista.  que quiera utilizar sus servicios (subprogramas) int pos. Si otro módulo quiere usar algo de esa biblioteca: Debe incluir el archivo de cabecera Luis Hernández Yáñez main.h const int N = 10. bool &ok).h" Módulo typedef double tArray[N].  ok false. void insert(tArray &lista..h" const int N = 10. int pos.  .. bool &ok).cpp const int N = 10. Fundamentos de la programación: Programación modular Página 766 . .  Biblioteca void init(tArray &lista). Luis Hernández Yáñez void init(tArray &lista).  conocer otro módulo (o programa principal) double elem.h lista. Creación de módulos de biblioteca Interfaz frente a implementación lista.h): todo lo que necesita void init(tArray &lista).  bool &ok). .

..h" lista. Creación de módulos de biblioteca lista.  double elem. Compilar el módulo significa compilar } void insert(tArray &lista.cont == N) { ok false. } else { ..cont = 0. bool &ok) { su archivo de implementación (..h" void init(tArray &lista) { lista.obj .cpp #include "lista. 00101110101011001010010010101 00101010010101011111010101000 Al compilar el módulo se genera el código objeto 10100101010101010010101010101 01100101010101010101010101001 01010101010100000101010101101 01001010101010101000010101011 11001010101010111100110010101 Si no se modifica no hay necesidad de recompilar 01101010101010010010101001111 00101010101001010100101010010 10100101010100101000010011110 10010101011001010101001010100 10101010101010010101001010101 Código que usa el módulo: Luis Hernández Yáñez 01000010101011100101010010100 01110101011101001101010100101 01011111110101011001101010111 00001001010100101010101010110  Necesita sólo el archivo de cabecera para compilar  Se adjunta el código objeto del módulo durante el enlace Fundamentos de la programación: Programación modular Página 767 Luis Hernández Yáñez Fundamentos de la programación: Programación modular Página 768 .cpp) if (lista. También necesita conocer sus propias declaraciones: lista.cpp Implementación #include "lista.

} tRegistro. ¡Documenta bien el código! Fundamentos de la programación: Programación modular Página 770 . const string BD = "bd. typedef struct { tArray registros. string nombre.cpp como bd. const int N = 100. . typedef tRegistro tArray[N]. Uso de módulos de biblioteca Ejemplo: Gestión de una lista ordenada (Tema 7) Todo lo que tenga que ver con la lista estará en su propio módulo Ahora el código estará repartido en tres archivos:  lista..txt".h Módulo propio: dobles comillas en la directiva #include #include "lista.h Fundamentos de la programación: Programación modular Página 769 Archivo de cabecera lista.cpp: programa principal que usa la lista Tanto lista. double sueldo.h: archivo de cabecera del módulo de lista  lista.h" Luis Hernández Yáñez Archivos de cabecera de bibliotecas del sistema: entre ángulos Y no tienen necesariamente que llevar extensión . typedef struct { int codigo. int cont.cpp: implementación del módulo de lista  bd. Luis Hernández Yáñez } tLista.cpp deben incluir al principio lista..h Módulo: Gestión de una lista ordenada I #include <string> using namespace std.

cpp Módulo: Gestión de una lista ordenada I #include <iostream> #include <string> using namespace std. tRegistro opDer). Cada prototipo. bool &ok). cout << "Introduce el código: ". return registro. void mostrar(int pos. Luis Hernández Yáñez cout << "Introduce el sueldo: ". void eliminar(tLista &lista. bool &ok). con un comentario que explique su utilidad/uso Luis Hernández Yáñez (Aquí se omiten por cuestión de espacio) Fundamentos de la programación: Programación modular Página 771 Implementación lista. #include <fstream> #include <iomanip> #include "lista. void guardar(tLista lista). bool operator<(tRegistro opIzq.. cin >> registro. tRegistro registro. tRegistro opDer).. Fundamentos de la programación: Programación modular Página 772 .. void cargar(tLista &lista. tRegistro registro).codigo. string nombre).nombre. int pos. cin >> registro.N int buscar(tLista lista. } . bool operator>(tRegistro opIzq.sueldo. cin >> registro. void mostrar(const tLista &lista).h" tRegistro nuevo() { tRegistro registro. void insertar(tLista &lista. bool &ok). tRegistro nuevo(). // pos = 1. cout << "Introduce el nombre: ".

 bool &ok) { ok = true. while ((i < lista. tRegistro registro.registros[i ‐ 1] = lista.registros[i]. // Lista llena } else { int i = 0. ok = true.cont)) { ok = false.cont) && (lista. if (lista. i++) { // Desplazamos a la izquierda lista..registros[j] = lista. // Pasamos a índice del array for (int i = pos + 1. } } . lista. bool &ok) { // pos = 1. // Posición inexistente } else { pos‐‐. } Luis Hernández Yáñez lista. Fundamentos de la programación: Programación modular Página 774 .. j > i. i < lista..registros[i] < registro)) { i++.cont == N) { ok = false.. j‐‐) { // Desplazamos a la derecha lista.cont++. void insertar(tLista &lista. if ((pos < 1) || (pos > lista.registros[i] = registro. } // Insertamos en la posición i for (int j = lista.cont.cont‐‐. int pos. } lista. Fundamentos de la programación: Programación modular Página 773 void eliminar(tLista &lista.registros[j ‐ 1].cont.. } } Luis Hernández Yáñez .

 . op = menu(). Fundamentos de la programación: Programación modular Página 775 if (op == 1) { tRegistro registro = nuevo()... int op. if (!ok) { cout << "No se ha podido abrir el archivo!" << endl. pos. cargar(lista. #include "lista. insertar(lista. . Programa principal bd. ok). cin. } Luis Hernández Yáñez else { do { mostrar(lista)..sync(). cin >> nombre. } } else if (op == 2) { cout << "Posición: ". nombre). Fundamentos de la programación: Programación modular Página 776 .cpp Módulo: Gestión de una lista ordenada I #include <iostream> using namespace std. ok). registro. bool ok. cin >> pos. if (!ok) { cout << "Error: Lista llena!" << endl. } } else if (op == 3) { string nombre. pos. int pos = buscar(lista. int main() { tLista lista. Luis Hernández Yáñez cout << "Nombre: ". if (!ok) { cout << "Error: Posicion inexistente!" << endl.h" int menu(). eliminar(lista.. ok).

if (pos == ‐1) {
cout << "No se ha encontrado!" << endl;
}
else {
cout << "Encontrado en la posición " << 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;
Luis Hernández Yáñez

cout << "0 ‐ Salir" << endl;
int op;
do {
...

Fundamentos de la programación: Programación modular Página 777
Luis Hernández Yáñez

Fundamentos de la programación: Programación modular Página 778

G++
Archivos de cabecera e implementación en la misma carpeta
Listamos todos los .cpp en la orden g++:
D:\FP\Tema08>g++ ‐o bd.exe lista.cpp bd.cpp
Recuerda que sólo se compilan los .cpp

Visual C++/Studio
Archivos de cabecera e implementación en grupos distintos:

A los archivos de cabecera
los llama de encabezado
Luis Hernández Yáñez

Con Depurar ‐> Generar solución
se compilan todos los .cpp

Fundamentos de la programación: Programación modular Página 779
Luis Hernández Yáñez

Fundamentos de la programación: Programación modular Página 780

Directivas: #...
Antes de compilar se pone en marcha el preprocesador
Interpreta las directivas y genera un único archivo temporal con
todo el código del módulo o programa
Como en la inclusión (directiva #include):
#include "lista.h"
#include <string> #include <string>
using namespace std; int menu(); using namespace std;

const int N = 100; ... const int N = 100;

typedef struct { typedef struct {
int codigo; int codigo;
string nombre; string nombre;
double sueldo; double sueldo;
} tRegistro; } tRegistro;

typedef tRegistro typedef tRegistro
tArray[N]; tArray[N];
Luis Hernández Yáñez

typedef struct { typedef struct {
tArray registros; tArray registros;
int cont; int cont;
} tLista; } tLista;
... ...

int menu();
...

Fundamentos de la programación: Programación modular Página 781
Luis Hernández Yáñez

Fundamentos de la programación: Programación modular Página 782

Distribuir la funcionalidad del programa en módulos
Encapsulación de un conjunto de subprogramas relacionados:
 Por la estructura de datos sobre la que trabajan
 Subprogramas de utilidad
A menudo las estructuras de datos contienen otras estructuras:
const int N = 100;
typedef struct {
int codigo; Lista de registros:
string nombre;
 Estructura tRegistro
double sueldo;
} tRegistro;  Estructura tLista
typedef tRegistro tArray[N]; (contiene tRegistro)
Luis Hernández Yáñez

typedef struct {
Cada estructura, en su módulo
tArray registros;
int cont;
} tLista;

Fundamentos de la programación: Programación modular Página 783

Cabecera registro.h

Gestión de una lista ordenada II
#include <string>
using namespace std;

typedef struct {
int codigo;
string nombre;
double sueldo;
} tRegistro;

tRegistro nuevo();
bool operator>(tRegistro opIzq, tRegistro opDer);
bool operator<(tRegistro opIzq, tRegistro opDer);
void mostrar(int pos, tRegistro registro);
Luis Hernández Yáñez

Fundamentos de la programación: Programación modular Página 784

Implementación registro.cpp

Gestión de una lista ordenada II
#include <iostream>
#include <string>
using namespace std;
#include <iomanip>
#include "registro.h"

tRegistro nuevo() {
tRegistro registro;
cout << "Introduce el código: ";
cin >> registro.codigo;
cout << "Introduce el nombre: ";
cin >> registro.nombre;
cout << "Introduce el sueldo: ";
cin >> registro.sueldo;
return registro;
}
Luis Hernández Yáñez

bool operator>(tRegistro opIzq, tRegistro opDer) {
return opIzq.nombre > opDer.nombre;
} ...

Fundamentos de la programación: Programación modular Página 785

Cabecera lista2.h

Gestión de una lista ordenada II
#include <string>
using namespace std;
#include "registro.h"

const int N = 100;
typedef tRegistro tArray[N];
typedef struct {
tArray registros;
int cont;
} tLista;
const string BD = "bd.txt";

void insertar(tLista &lista, tRegistro registro, bool &ok);
void eliminar(tLista &lista, int pos, bool &ok); // pos = 1..N
int buscar(tLista lista, string nombre);
Luis Hernández Yáñez

void mostrar(const tLista &lista);
void cargar(tLista &lista, bool &ok);
void guardar(tLista lista);

Fundamentos de la programación: Programación modular Página 786

Implementación lista2.cpp

Gestión de una lista ordenada II
#include <iostream>
using namespace std;
#include <fstream>
#include "lista2.h"

void insertar(tLista &lista, tRegistro registro, bool &ok) {
ok = true;
if (lista.cont == N) {
ok = false; // Lista llena
}
else {
int i = 0;
while ((i < lista.cont) && (lista.registros[i] < registro)) {
i++;
}
// Insertamos en la posición i
Luis Hernández Yáñez

for (int j = lista.cont; j > i; j‐‐) {// Desplazar a la derecha
lista.registros[j] = lista.registros[j ‐ 1];
}
...

Fundamentos de la programación: Programación modular Página 787

bd2.cpp

Gestión de una lista ordenada II
#include <iostream>
using namespace std;
#include "registro.h"
#include "lista2.h"

int menu();

int main() {
tLista lista;
¡No intentes compilar este ejemplo!
bool ok; Tiene errores
int op, pos;

cargar(lista, ok);
if (!ok) {
cout << "No se pudo abrir el archivo!" << endl;
}
Luis Hernández Yáñez

else {
do {
mostrar(lista);
op = menu();
...
Fundamentos de la programación: Programación modular Página 788

Luis Hernández Yáñez

Fundamentos de la programación: Programación modular Página 789

Gestión de una lista ordenada II
2 módulos y el programa principal: bd2.cpp

...
registro.h #include "registro.h"
#include "lista2.h"
#include <string>
...
...

registro.cpp

...
#include "registro.h"
... lista2.h

...
#include "registro.h"
...

lista2.cpp
Luis Hernández Yáñez

...
Incluye... #include "lista2.h"
...

Fundamentos de la programación: Programación modular Página 790

Gestión de una lista ordenada II
Preprocesamiento de #include: #include <string>
#include <iostream> using namespace std;
using namespace std;
typedef struct {
#include "registro.h" ...
} tRegistro;
#include "lista2.h" ...

int menu(); #include <string>
#include <string> using namespace std;
... using namespace std;
#include "registro.h" typedef struct {
...
const int N = 100; } tRegistro;
typedef tRegistro tArray[N]; ...
typedef struct {
Luis Hernández Yáñez

tArray registros;
int cont;
} tLista;
...

Fundamentos de la programación: Programación modular Página 791

Gestión de una lista ordenada II
Preprocesamiento de #include:
Sustituido
#include <iostream>
using namespace std;
#include <string>
#include <string> using namespace std;
using namespace std; #include <string>
using namespace std;
typedef struct {
... typedef struct {
} tRegistro; ...
... } tRegistro;
...
#include "lista2.h"
const int N = 100;
int menu(); typedef tRegistro tArray[N];
typedef struct {
Luis Hernández Yáñez

... tArray registros;
int cont;
} tLista;
...

Fundamentos de la programación: Programación modular Página 792

Gestión de una lista ordenada II
#include <iostream>
using namespace std; const int N = 100;
typedef tRegistro tArray[N];
#include <string> typedef struct {
using namespace std; tArray registros;
int cont;
typedef struct { } tLista;
... ...
} tRegistro;
... int menu();

#include <string> ...
using namespace std;
#include <string>
using namespace std;

typedef struct {
¡Identificador duplicado!
Luis Hernández Yáñez

...
} tRegistro;
...

Fundamentos de la programación: Programación modular Página 793

Compilación condicional
Directivas #ifdef, #ifndef, #else y #endif
Se usan en conjunción con la directiva #define
#define X #define X
#ifdef X #ifndef X
... // Código if ... // Código if
[#else [#else
... // Código else ... // Código else
] ]
#endif #endif
La directiva #define define un símbolo (identificador)
Izquierda: se compilará el “Código if” y no el “Código else”
Luis Hernández Yáñez

Derecha: al revés, o nada si no hay else
Las cláusulas else son opcionales

Fundamentos de la programación: Programación modular Página 794

Protección frente a inclusiones múltiples
lista2.cpp y bd2.cpp incluyen registro.h
 ¡Identificadores duplicados!
Cada módulo debe incluirse una y sólo una vez
Protección frente a inclusiones múltiples:
#ifndef X
#define X El símbolo X debe ser único
... // Módulo para cada módulo de la aplicación
#endif
La primera vez no está definido el símbolo X: se incluye y define
Las siguientes veces el símbolo X ya está definido: no se incluye
Luis Hernández Yáñez

Símbolo X: nombre del archivo con _ en lugar de .
registro_h, lista2_h, ...

Fundamentos de la programación: Programación modular Página 795

Cabecera registrofin.h

Gestión de una lista ordenada III
#ifndef registrofin_h
#define registrofin_h
#include <string>
using namespace std;

typedef struct {
int codigo;
string nombre;
double sueldo;
} tRegistro;

tRegistro nuevo();
Luis Hernández Yáñez

bool operator>(tRegistro opIzq, tRegistro opDer);
bool operator<(tRegistro opIzq, tRegistro opDer);
void mostrar(int pos, tRegistro registro);
#endif

Fundamentos de la programación: Programación modular Página 796

Implementación registrofin.cpp

Gestión de una lista ordenada III
#include <iostream>
#include <string>
using namespace std;
#include <iomanip>
#include "registrofin.h"

tRegistro nuevo() {
tRegistro registro;
cout << "Introduce el código: ";
cin >> registro.codigo;
cout << "Introduce el nombre: ";
cin >> registro.nombre;
cout << "Introduce el sueldo: ";
cin >> registro.sueldo;
return registro;
}
Luis Hernández Yáñez

bool operator>(tRegistro opIzq, tRegistro opDer) {
return opIzq.nombre > opDer.nombre;
} ...

Fundamentos de la programación: Programación modular Página 797

Cabecera listafin.h

Gestión de una lista ordenada III
#ifndef listafin_h
#define listafin_h
#include <string>
using namespace std;
#include "registrofin.h"

const int N = 100;
typedef tRegistro tArray[N];
typedef struct {
tArray registros;
int cont;
} tLista;
const string BD = "bd.txt";
void mostrar(const tLista &lista);
void insertar(tLista &lista, tRegistro registro, bool &ok);
void eliminar(tLista &lista, int pos, bool &ok); // pos = 1..N
Luis Hernández Yáñez

int buscar(tLista lista, string nombre);
void cargar(tLista &lista, bool &ok);
void guardar(tLista lista);
#endif

Fundamentos de la programación: Programación modular Página 798

} Luis Hernández Yáñez else { do { mostrar(lista).h" void insertar(tLista &lista. } . pos.cont) && (lista. ¡Ahora ya puedes compilarlo! int op. Fundamentos de la programación: Programación modular Página 799 bdfin. cargar(lista.cont == N) { ok = false.. bool &ok) { ok = true. ok).. Implementación listafin. while ((i < lista. j‐‐) { // Desplazamos a la derecha lista. if (!ok) { cout << "No se pudo abrir el archivo!" << endl.cpp Gestión de una lista ordenada III #include <iostream> using namespace std. #include <fstream> #include "listafin. op = menu()... #include "registrofin.registros[i] < registro)) { i++. j > i. tRegistro registro.registros[j ‐ 1]. } // Insertamos en la posición i Luis Hernández Yáñez for (int j = lista. bool ok. Fundamentos de la programación: Programación modular Página 800 . if (lista. // lista llena } else { int i = 0. int main() { tLista lista. .registros[j] = lista.cont.h" int menu().h" #include "listafin.cpp Gestión de una lista ordenada III #include <iostream> using namespace std.

h" typedef struct { . Luis Hernández Yáñez int menu().. } tLista..cpp: #include <iostream> using namespace std. } tRegistro... #include "listafin.h" . int cont.. #include "listafin. #include "registrofin. #define registrofin_h #include <string> #include "registrofin. using namespace std. . . listafin_h no se ha definido todavía Fundamentos de la programación: Programación modular Página 802 . int menu()... . tArray registros. registrofin_h no se ha definido todavía Luis Hernández Yáñez Fundamentos de la programación: Programación modular Página 801 Gestión de una lista ordenada III Preprocesamiento de #include en bdfin.h" using namespace std. . #ifndef listafin_h #define listafin_h #define registrofin_h #include <string> #include <string> using namespace std..h" typedef struct { const int N = 100.cpp: #include <iostream> #ifndef registrofin_h using namespace std. Gestión de una lista ordenada III Preprocesamiento de #include en bdfin. typedef struct { } tRegistro... ..... typedef tRegistro tArray[N].

. Luis Hernández Yáñez #include "registrofin. } tRegistro. #define listafin_h typedef struct { #include <string> . using namespace std. #define registrofin_h #include <string> using namespace std... #include <string> ... Gestión de una lista ordenada III Preprocesamiento de #include en bdfin. int menu().. ¡registrofin_h ya está definido! . #define registrofin_h } tRegistro..cpp: #include <iostream> using namespace std. Fundamentos de la programación: Programación modular Página 803 Luis Hernández Yáñez Fundamentos de la programación: Programación modular Página 804 .h" . using namespace std.. ..... typedef struct { #ifndef registrofin_h .

else { int i = 0. lista. j‐‐) { } // Desplazamos a la derecha lista. bool &ok) { ok = false. #include "registrofin..cont.h" void insertar(tLista &lista. // Insertamos en la posición i } for (int j = lista.cont == N) { else { ok = false. // Lista llena } } . void insertar(tLista &lista. if (lista.registros[i] = registro. listaORD. } // Insertamos en la posición i Luis Hernández Yáñez for (int j = lista..registros[j] = lista.h using namespace std. } #include "lista. bool &ok) { ok = true. if (lista.cont++.. Lista int cont. while ((i < lista. j > i. Lista } tLista.cont) && (lista.cont. j > i. Misma interfaz. implementación alternativa #include <string> lista. } if (lista.cpp: Lista no ordenada . } lista. Fundamentos de la programación: Programación modular Página 806 ..registros[j ‐ 1].registros[lista. tRegistro registro.. bool &ok). bool &ok) { ok = true. bool &ok) { ok = true. } lista. void insertar(tLista &lista.. #include "lista. . } else { while ((i < lista. lista.cpp: Lista ordenada if (lista..cont] = registro. ordenada no ordenada void insertar(tLista &lista.cont == N) { ok = false..cont] = registro. // Lista llena int i = 0.cont) && (lista.registros[lista. tRegistro registro. tRegistro registro.h" else { lista.registros[j ‐ 1]. typedef tRegistro tArray[N]. // Lista llena ok = true.cont++. j‐‐) { // Desplazamos a la derecha lista. tRegistro registro. typedef struct { tArray registros.cont == N) { } ok = false. implementación alternativa listaDES. Fundamentos de la programación: Programación modular Página 805 Misma interfaz.cont == N) { void insertar(tLista &lista.. // Lista llena ..registros[i] < registro)) { Luis Hernández Yáñez i++. .registros[i] < registro)) { i++.h" const int N = 100.registros[j] = lista. tRegistro registro.

cpp .. Incluye la implementación de la lista con ordenación g++ ‐o programa.. implementación alternativa Al compilar.cpp .exe registrofin. Misma interfaz.cpp listaORD..exe registrofin.cpp listaDES.. incluimos un archivo de implementación u otro: ¿Programa con lista ordenada o con lista desordenada? g++ ‐o programa. Incluye la implementación de la lista sin ordenación Luis Hernández Yáñez Fundamentos de la programación: Programación modular Página 807 Luis Hernández Yáñez Fundamentos de la programación: Programación modular Página 808 .

datos. double d. Agrupaciones lógicas de declaraciones Espacio de nombres: agrupación de declaraciones (tipos. Luis Hernández Yáñez } Variables i y d declaradas en el espacio de nombres miEspacio Fundamentos de la programación: Programación modular Página 809 Acceso a miembros de un espacio de nombres Operador de resolución de ámbito (::) Acceso a las variables del espacio de nombres miEspacio: Nombre del espacio y operador de resolución de ámbito miEspacio::i miEspacio::d Puede haber entidades con el mismo identificador en distintos módulos o en ámbitos distintos de un mismo módulo Cada declaración en un espacio de nombres distinto: namespace primero { namespace segundo { int x = 5. double x = 3. subprogramas) bajo un nombre distintivo Forma de un espacio de nombres: namespace nombre { // Declaraciones } Por ejemplo: namespace miEspacio { int i.1416. Luis Hernández Yáñez } } Ahora se distingue entre primero::x y segundo::x Fundamentos de la programación: Programación modular Página 810 .

  } Fundamentos de la programación: Programación modular Página 811 using namespace Introduce todos los nombres de un espacio en el ámbito actual: #include <iostream>  using namespace std.  cout << x << endl.7183. // espacio explícito return 0.7183 double x = 3.  namespace primero {  int x = 5.  using segundo::y.1416 int main() {  using primero::x.1416.  }  5 namespace segundo {  2. // x es primero::x Luis Hernández Yáñez cout << y << endl.  int y = 10. // espacio explícito return 0.  } Fundamentos de la programación: Programación modular Página 812 . // y es segundo::y cout << primero::y << endl. // x es primero::x cout << y << endl. // y es primero::y Luis Hernández Yáñez cout << segundo::x << endl.  double y = 2. // espacio explícito cout << segundo::y << endl.  }  using [namespace] 10 namespace segundo {  sólo tiene efecto 3.  en que se encuentra 2.  cout << x << endl. // espacio explícito cout << segundo::x << endl.1416. using Introduce un nombre de un espacio de nombres en el ámbito actual: #include <iostream>  using namespace std.  namespace primero {  int x = 5.1416 double x = 3.  5 int y = 10.  10 }  3.  en el bloque double y = 2.7183 }  int main() {  using namespace primero.7183.

. typedef tRegistro tArray[N].h" namespace ord { // Lista ordenada const int N = 100..h" void ord::insertar(tLista &lista. tRegistro registro. string nombre) { // . Luis Hernández Yáñez void guardar(tLista lista). bool &ok).. bool &ok).txt".N int buscar(tLista lista. } void ord::eliminar(tLista &lista. void insertar(tLista &lista.. bool &ok) { // . #ifndef listaEN_h #define listaEN_h #include "registrofin. const string BD = "bd. // 1. #include "listaEN. int pos. } // namespace #endif Fundamentos de la programación: Programación modular Página 813 Implementación #include <iostream> #include <fstream> using namespace std. bool &ok). Fundamentos de la programación: Programación modular Página 814 . } int ord::buscar(tLista lista.. void mostrar(const tLista &lista). void cargar(tLista &lista. Luis Hernández Yáñez } ... int pos. bool &ok) { // . tRegistro registro. void eliminar(tLista &lista. string nombre). } tLista. int cont.. typedef struct { tArray registros..

if (!ok) { cout << "No se pudo abrir el archivo!" << endl. . Luis Hernández Yáñez } else { mostrar(lista).h" using namespace ord.h" #include "listaEN... ok). Uso del espacio de nombres Quien utilice listaEN. cargar(lista.h" int menu(). Fundamentos de la programación: Programación modular Página 815 Uso del espacio de nombres #include <iostream> using namespace std. if (!ok) { cout << "No se pudo abrir el archivo!" << endl. bool ok. int main() { ord::tLista lista. #include "registrofin.h" #include "listaEN. ord::cargar(lista. #include "registrofin. Fundamentos de la programación: Programación modular Página 816 . . O usar una instrucción using namespace ord.. int main() { tLista lista. bool ok.h debe poner el nombre del espacio: #include <iostream> using namespace std. ok). int menu().. } Luis Hernández Yáñez else { ord::mostrar(lista).

 tRegistro registro. void mostrar(const tLista &lista). bool &ok)... void eliminar(tLista &lista. } tLista.. // pos = 1... . bool &ok). int pos. typedef struct { tArray registros. ... typedef tRegistro tArray[N]. void insertar(tLista &lista.h" const int N = 100. Luis Hernández Yáñez void mostrar(const tLista &lista). Luis Hernández Yáñez void mostrar(const tLista &lista). bool &ok). typedef tRegistro tArray[N]. Implementaciones alternativas Distintos espacios de nombres para distintas implementaciones ¿Lista ordenada o lista desordenada? namespace ord { // Lista ordenada const int N = 100.. . } // namespace namespace des { // Lista desordenada const int N = 100. typedef tRegistro tArray[N].N . .. tRegistro registro.h Implementaciones alternativas Todo lo común puede estar fuera de la estructura namespace: #ifndef listaEN_H #define listaEN_H #include "registrofin. } // namespace Fundamentos de la programación: Programación modular Página 817 Cabecera listaEN. int cont... void insertar(tLista &lista. Fundamentos de la programación: Programación modular Página 818 .

. tRegistro registro. while ((i < lista. bool &ok) { ok = true.txt". void guardar(tLista lista). bool &ok) { // . bool &ok). void guardar(tLista lista). namespace ord { // Lista ordenada const string BD = "bd. int buscar(tLista lista. bool &ok). tRegistro registro. void cargar(tLista &lista. } // namespace namespace des { // Lista desordenada const string BD = "bddes.txt". #include <fstream> #include "listaEN.. Fundamentos de la programación: Programación modular Página 820 .. } // IMPLEMENTACIÓN DE LOS SUBPROGRAMAS DEL ESPACIO DE NOMBRES ord void ord::insertar(tLista &lista. int buscar(tLista lista. int pos. string nombre). } void mostrar(const tLista &lista) { // . if (lista.. } // namespace Luis Hernández Yáñez #endif cargar() y guardar() se distinguen porque usan su propia BD. void insertar(tLista &lista.cont) && (lista.cpp #include <iostream> using namespace std. string nombre).cont == N) { ok = false..registros[i] < registro)) { i++. void insertar(tLista &lista. pero se implementan exactamente igual Fundamentos de la programación: Programación modular Página 819 listaEN.h" // IMPLEMENTACIÓN DE LOS SUBPROGRAMAS COMUNES void eliminar(tLista &lista. tRegistro registro.. bool &ok). } . bool &ok). void cargar(tLista &lista. // Lista llena } Luis Hernández Yáñez else { int i = 0.

. bool &ok) { // .nombre) { fin = mitad ‐ 1. bool encontrado = false. } void ord::cargar(tLista &lista.registros[j ‐ 1].nombre) { encontrado = true.. } } int ord::buscar(tLista lista. for (int j = lista. while ((ini <= fin) && !encontrado) { mitad = (ini + fin) / 2... mitad. } else if (nombre < lista. Luis Hernández Yáñez Fundamentos de la programación: Programación modular Página 822 . j > i. if (nombre == lista.registros[i] = registro. j‐‐) { lista..cont. fin = lista..registros[mitad]. lista.registros[mitad]. } else { mitad = ‐1. } return mitad. Luis Hernández Yáñez } else { ini = mitad + 1. Fundamentos de la programación: Programación modular Página 821 if (encontrado) { mitad++. } lista.registros[j] = lista. } } .cont++. } void ord::guardar(tLista lista) { // .. string nombre) { int ini = 0. } ..cont ‐ 1.

 tRegistro registro.. } Luis Hernández Yáñez Fundamentos de la programación: Programación modular Página 824 .. Fundamentos de la programación: Programación modular Página 823 if (encontrado) { pos++. bool &ok) { ok = true.cont) && !encontrado) { if (nombre == lista.cont] = registro. // Lista llena } else { lista... } else { pos = ‐1. string nombre) { int pos = 0.registros[pos].. } void des::cargar(tLista &lista. } return pos. bool encontrado = false.cont++. Luis Hernández Yáñez } else { pos++. while ((pos < lista. if (lista.. // IMPLEMENTACIÓN DE LOS SUBPROGRAMAS DEL ESPACIO DE NOMBRES des void des::insertar(tLista &lista. } void des::guardar(tLista lista) { // .nombre) { encontrado = true. } } int des::buscar(tLista lista. bool &ok) { // . } } .registros[lista.cont == N) { ok = false. lista.

. insertar(lista. int menu()..cpp Programa principal #include <iostream> using namespace std. bool ok. #include "registrofin.. bool ok. if (!ok) { Luis Hernández Yáñez ... tRegistro registro = nuevo(). insertar(lista.h" using namespace des.. registro. registro. ok). if (!ok) { Luis Hernández Yáñez .h" #include "listaEN.. int main() { tLista lista. Fundamentos de la programación: Programación modular Página 826 .. .. bdEN. tRegistro registro = nuevo(). Fundamentos de la programación: Programación modular Página 825 bdEN.cpp Programa principal #include <iostream> using namespace std. int menu(). ok).h" using namespace ord.h" #include "listaEN. int main() { tLista lista. #include "registrofin.

tanto de forma independiente como en su relación con los demás módulos La prueba y depuración es muy importante y todos los equipos deberán seguir buenas pautas para asegurar la calidad Los módulos deben ser igualmente bien documentados.Luis Hernández Yáñez Fundamentos de la programación: Programación modular Página 827 Software de calidad El software debe ser desarrollado con buenas prácticas de ingeniería del software que aseguren un buen nivel de calidad Los distintos módulos de la aplicación deben ser probados exhaustivamente. de forma que otros desarrolladores puedan aprovecharlos Luis Hernández Yáñez Fundamentos de la programación: Programación modular Página 828 .

Prueba exhaustiva El software debe ser probado exhaustivamente Debemos intentar descubrir todos los errores posible Los errores deben ser depurados. nombre. corrigiendo el código Pruebas sobre listas:  Lista inicialmente vacía  Lista inicialmente llena  Lista con un número intermedio de elementos  Archivo no existente Etcétera. Luis Hernández Yáñez Se han de probar todas las opciones/situaciones del programa En las clases prácticas veremos cómo se depura el software Fundamentos de la programación: Programación modular Página 829 No reinventemos la rueda Desarrollar el software pensando en su posible reutilización Un software de calidad debe poder ser fácilmente reutilizado Nuestros módulos deben ser fácilmente usados y modificados Por ejemplo: Nueva aplicación que gestione una lista de longitud variable de registros con NIF.. apellidos y edad Partiremos de los módulos registro y lista existentes Las modificaciones básicamente afectarán al módulo registro Luis Hernández Yáñez Fundamentos de la programación: Programación modular Página 830 ..

Este documento tiene establecidas las siguientes: Reconocimiento (Attribution): En cualquier explotación de la obra autorizada por la licencia hará falta reconocer la autoría. Licencia CC (Creative Commons) Este tipo de licencias ofrecen algunos derechos a terceras personas bajo ciertas condiciones. Luis Hernández Yáñez Pulsa en la imagen de arriba a la derecha para saber más. Fundamentos de la programación: Programación modular Página 831 . No comercial (Non commercial): La explotación de la obra queda limitada a usos no comerciales. Compartir igual (Share alike): La explotación autorizada incluye la creación de obras derivadas siempre que mantengan la misma licencia al ser divulgadas.

int id_cli. int id_prod. tProducto productos[NPROD]. int unidades. string codigo. const int NPROD = 200. typedef struct { } tVenta. #include <string> double precio.. Luis Hernández Yáñez int cont. tVenta ventas[NVENTAS]. int id_prod. const int NCLI = 100. string nif. int cont. } tProducto.cpp #include <iostream> string nombre.. int id. typedef struct { } tListaVentas. string telefono. int id_cli. using namespace std. tCliente clientes[NCLI]. Fundamentos de la programación 8A Grado en Ingeniería Informática Grado en Ingeniería del Software Grado en Ingeniería de Computadores Luis Hernández Yáñez Facultad de Informática Universidad Complutense ventas. typedef struct { const int NVENTAS = 3000. int cont. typedef struct { } tListaClientes. typedef struct { } tListaProductos. Fundamentos de la programación: Ejemplo de modularización Página 833 . . int unidades. } tCliente. typedef struct { string nombre.

 bool &ok). void mostrar(const tListaClientes &lista). // Por código void mostrar(tProducto producto). void eliminar(tListaClientes &lista.  const tListaClientes &clientes. void ventasPorClientes(const tListaVentas &lista). bool &ok). void insertar(tListaProductos &lista. int unidades). void inicializar(tListaClientes &lista). void insertar(tListaVentas &lista. bool &ok). . bool valida(tVenta venta). string codigo. string nif. void buscar(const tListaVentas &lista. void cargar(tListaProductos &lista). void cargar(tListaClientes &lista).. tCliente cliente. void eliminar(tListaVentas &lista. bool valida(tCliente cliente). Luis Hernández Yáñez void buscar(const tListaProductos &lista. tProducto &producto. Fundamentos de la programación: Ejemplo de modularización Página 835 . void insertar(tListaClientes &lista. void buscar(const tListaClientes &lista. bool &ok).  const tListaProductos &productos). void cargar(tListaVentas &lista). bool &ok). tProducto nuevoProducto(). // Por NIF void mostrar(tCliente cliente). const tListaProductos &productos). int id_cli. bool &ok). const tListaClientes &clientes. tProducto producto. tProducto opDer). string nif. bool &ok). tCliente opDer). double totalVentas(const tListaVentas &ventas. void inicializar(tListaProductos &lista). tCliente nuevoCliente().. Luis Hernández Yáñez int menu(). bool valida(tProducto producto). bool &ok). void stock(const tListaVentas &ventas. tVenta &venta.. int main() { . // Función interna bool operator<(tProducto opIzq. bool &ok). int id. // Función interna bool operator<(tCliente opIzq. void ventasPorProductos(const tListaVentas &lista). tCliente &cliente. void inicializar(tListaVentas &lista).. string nif. const tListaClientes &clientes.  const tListaProductos &productos). int id. string codigo. tVenta venta. tVenta nuevaVenta(int id_prod. Fundamentos de la programación: Ejemplo de modularización Página 834 void mostrar(const tListaProductos &lista). void eliminar(tListaProductos &lista. // Función interna void mostrar(tVenta venta.

void insertar(tListaClientes &lista. int unidades. void buscar(const tListaClientes &lista. typedef struct { Cliente } tListaProductos. int id_prod. const int NCLI = 100. string codigo.. int cont. // Función interna Producto bool operator<(tProducto opIzq. // Por NIF void mostrar(tCliente cliente). . Fundamentos de la programación: Ejemplo de modularización Página 836 tCliente nuevoCliente(). tCliente &cliente. typedef struct { } tListaClientes. tCliente opDer). bool &ok). bool valida(tProducto producto). typedef struct { Producto } tListaVentas. int id_cli. Lista de ventas tCliente clientes[NCLI]. #include <string> double precio. Lista de productos const int NPROD = 200. string nif. typedef struct { } tVenta. Cliente bool valida(tCliente cliente). Luis Hernández Yáñez int cont. Lista de clientes void inicializar(tListaClientes &lista). int id_prod. void cargar(tListaClientes &lista). Lista de clientes int unidades. typedef struct { const int NVENTAS = 3000.. } tCliente. tVenta ventas[NVENTAS]. int id_cli. bool &ok). . void mostrar(const tListaClientes &lista). string nif. typedef struct { Venta string nombre.. bool &ok).. int cont. tProducto productos[NPROD]. void eliminar(tListaClientes &lista. string nif. // Por código Luis Hernández Yáñez void mostrar(tProducto producto). tProducto opDer). Fundamentos de la programación: Ejemplo de modularización Página 837 . string telefono. tCliente cliente. int id. } tProducto. tProducto nuevoProducto(). using namespace std. #include <iostream> string nombre. // Función interna bool operator<(tCliente opIzq.

 tVenta &venta. const tListaClientes &clientes.  const tListaClientes &clientes. bool &ok). void buscar(const tListaVentas &lista. int id. void buscar(const tListaProductos &lista. void cargar(tListaVentas &lista). void mostrar(const tListaProductos &lista). bool &ok). string nif. bool &ok). int unidades).. tProducto &producto. int menu(). tVenta venta. void insertar(tListaVentas &lista.  const tListaProductos &productos). Lista de productos void inicializar(tListaProductos &lista). double totalVentas(const tListaVentas &ventas. bool &ok)... string codigo. bool &ok). string codigo. tVenta nuevaVenta(int id_prod. int id_cli. // Función interna void mostrar(tVenta venta. Luis Hernández Yáñez Fundamentos de la programación: Ejemplo de modularización Página 838 Lista de ventas void inicializar(tListaVentas &lista). const tListaClientes &clientes. int id. void stock(const tListaVentas &ventas.  const tListaProductos &productos). Venta const tListaProductos &productos). void ventasPorClientes(const tListaVentas &lista). Luis Hernández Yáñez int main() { . bool &ok). . void eliminar(tListaProductos &lista. tProducto producto. void insertar(tListaProductos &lista.. bool valida(tVenta venta). void eliminar(tListaVentas &lista. void ventasPorProductos(const tListaVentas &lista). Fundamentos de la programación: Ejemplo de modularización Página 839 . void cargar(tListaProductos &lista).

cpp) Luis Hernández Yáñez  Implementación de los subprogramas en el .h y listaventas.cpp  Lista de clientes: listaclientes.h Luis Hernández Yáñez producto.cpp  Lista de productos: listaproductos.h)  Prototipos en el archivo de cabecera (.cpp listaproductos.cpp Fundamentos de la programación: Ejemplo de modularización Página 840 Ventas main.cpp listaventas.cpp Distribución del código en los módulos:  Declaraciones de tipos y datos en el archivo de cabecera (.cpp Producto Lista de productos producto.h listaproductos.h listaventas.h venta.cpp  Lista de ventas: listaventas.h y listaclientes.h y venta.h cliente.cpp venta.  Cliente: cliente.cpp  Programa principal: main.cpp Fundamentos de la programación: Ejemplo de modularización Página 841 .cpp  Venta: venta.h) (excepto los de los subprogramas privados –internos–.cpp listaclientes.cpp Cliente Lista de clientes Venta Lista de ventas cliente.h y producto.h y cliente.cpp  Producto: producto. que irán en el .h listaclientes.h y listaproductos.

} tProducto. Luis Hernández Yáñez void buscar(const tListaClientes &lista. bool &ok). Fundamentos de la programación: Ejemplo de modularización Página 843 . Luis Hernández Yáñez void buscar(const tListaProductos &lista. } tCliente. Inclusiones (además de otras bibliotecas del sistema) typedef struct { int id_cli.h producto. string codigo. string nif. int cont.h typedef struct { tProducto productos[NPROD]. string nombre. listaproductos. const int NPROD = 200. const int NCLI = 100. string codigo. bool &ok). tCliente &cliente. string int cont. string nif. string nombre. tProducto &producto. string } tListaClientes.h string string telefono.h string double precio.h tCliente clientes[NCLI]. typedef struct { listaclientes.h cliente. producto. int unidades. cliente. } tListaProductos. Fundamentos de la programación: Ejemplo de modularización Página 842 typedef struct { int id_prod.

int id_prod.h typedef struct { tVenta ventas[NVENTAS]. typedef struct { int id_cli.h Luis Hernández Yáñez double totalVentas(const tListaVentas &ventas. } tListaVentas. tCliente opDer). Fundamentos de la programación: Ejemplo de modularización Página 844 #ifndef cliente_h #define cliente_h #include <string> using namespace std. #endif Fundamentos de la programación: Ejemplo de modularización Página 845 . string nif. string telefono.h } tVenta. typedef struct { int id. listaproductos.h venta. const int NVENTAS = 3000. string nombre. tCliente nuevoCliente(). bool operator<(tCliente opIzq.  const tListaProductos &productos). int unidades. string nif. listaventas. listaclientes. venta. const tListaProductos &productos). const tListaClientes &clientes.h int id_cli.h listaclientes. } tCliente. void mostrar(tVenta venta.h int cont.  const tListaClientes &clientes. listaproductos. // Por NIF Luis Hernández Yáñez void mostrar(tCliente cliente).

Luis Hernández Yáñez Pulsa en la imagen de arriba a la derecha para saber más. Fundamentos de la programación: Ejemplo de modularización Página 846 . Compartir igual (Share alike): La explotación autorizada incluye la creación de obras derivadas siempre que mantengan la misma licencia al ser divulgadas. No comercial (Non commercial): La explotación de la obra queda limitada a usos no comerciales. Licencia CC (Creative Commons) Este tipo de licencias ofrecen algunos derechos a terceras personas bajo ciertas condiciones. Este documento tiene establecidas las siguientes: Reconocimiento (Attribution): En cualquier explotación de la obra autorizada por la licencia hará falta reconocer la autoría.

Fundamentos de la programación 9 Grado en Ingeniería Informática Grado en Ingeniería del Software Grado en Ingeniería de Computadores Luis Hernández Yáñez Facultad de Informática Universidad Complutense Direcciones de memoria y punteros 849 Operadores de punteros 854 Punteros y direcciones válidas 864 Punteros no inicializados 866 Un valor seguro: NULL 867 Copia y comparación de punteros 868 Tipos puntero 873 Punteros a estructuras 875 Punteros a constantes y punteros constantes 877 Punteros y paso de parámetros 879 Punteros y arrays 883 Memoria y datos del programa 886 Memoria dinámica 891 Punteros y datos dinámicos 895 Gestión de la memoria 907 Luis Hernández Yáñez Errores comunes 911 Arrays de datos dinámicos 916 Arrays dinámicos 928 Fundamentos de la programación: Punteros y memoria dinámica .

...Luis Hernández Yáñez Fundamentos de la programación: Punteros y memoria dinámica Página 849 Los datos en la memoria Todo dato se almacena en memoria: Varios bytes a partir de una dirección 0F03:1A37 . y la de las direcciones también) Fundamentos de la programación: Punteros y memoria dinámica Página 850 .. 0F03:1A39 00000000 0F03:1A3A 00000000 Dirección base 0F03:1A3B 00000101 0F03:1A3C . i 0F03:1A38 00000000 int i = 5. El dato (i) se accede a partir de su dirección base (0F03:1A38) Dirección de la primera celda de memoria utilizada por el dato Luis Hernández Yáñez El tipo del dato (int) indica cuántos bytes (4) requiere el dato: 00000000 00000000 00000000 00000101  5 (La codificación de los datos puede ser diferente.

 // Puntero a entero Fundamentos de la programación: Punteros y memoria dinámica Página 852 .. 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 inicialmente contiene una dirección // que no es válida (no apunta a nada) Luis Hernández Yáñez El puntero punt apuntará a una variable entera (int) int i. Los punteros contienen direcciones de memoria Un puntero sirve para acceder a través de él a otro dato El valor del puntero es la dirección de memoria base de otro dato . // Dato entero  vs... ¿Cómo se interpretan los 0/1? Fundamentos de la programación: Punteros y memoria dinámica Página 851 Los punteros contienen direcciones de memoria ¿De qué tipo es el dato apuntado? La variable a la que apunta un puntero será de un tipo concreto ¿Cuánto ocupa? ¿Cómo se interpreta? El tipo de variable apuntado se establece al declarar el puntero: tipo *nombre. int *punt. Indirección: i 0F03:1A38 00 Acceso indirecto a un dato 0F03:1A39 00 0F03:1A3A 00 punt punt apunta a i 0F03:1A3B 05 .... i 5 punt 0F07:0417 0F 0F07:0418 03 Luis Hernández Yáñez 0F07:0419 1A ¿De qué tipo es el dato apuntado? 0F07:041A 38 ¿Cuántas celdas ocupa? .

 // punt inicialmente contiene una dirección // que no es válida (no apunta a nada) 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 parámetros por referencia Luis Hernández Yáñez  Para manejar datos dinámicos (Datos que se crean y destruyen durante la ejecución)  Para implementar los arrays Fundamentos de la programación: Punteros y memoria dinámica Página 853 Luis Hernández Yáñez Fundamentos de la programación: Punteros y memoria dinámica Página 854 . Los punteros contienen direcciones de memoria Las variables puntero tampoco se inicializan automáticamente Al declararlas sin inicializador contienen direcciones no válidas int *punt.

. & Obtener la dirección de memoria de .. Operador monario y prefijo & devuelve la dirección de memoria base del dato al que precede int i.... int *punt. cout << &i.... i punt = &i.... j.. 0F03:1A39 . // Muestra la dirección de memoria de i Un puntero puede recibir la dirección de datos de su tipo base punt int i. 0F03:1A3B j 0F03:1A3C 0F03:1A3D 0F03:1A3E 0F03:1A3F . punt 0F07:0417 Luis Hernández Yáñez 0F07:0418 0F07:0419 0F07:041A . Fundamentos de la programación: Punteros y memoria dinámica Página 856 . // punt contiene la dirección de i Ahora punt ya contiene una dirección de memoria válida Luis Hernández Yáñez punt apunta a (contiene la dirección de) la variable i (int) Fundamentos de la programación: Punteros y memoria dinámica Página 855 & Obtener la dirección de memoria de . i 0F03:1A38 int i. 0F03:1A3A int *punt. .

0F03:1A3A 00 int *punt.. j. punt 0F07:0417 Luis Hernández Yáñez 0F07:0418 0F07:0419 i 5 0F07:041A . 0F03:1A39 00 ... j 0F03:1A3C 0F03:1A3D i = 5.... . j. . i 0F03:1A38 00 int i. 0F03:1A3A 00 int *punt.. Fundamentos de la programación: Punteros y memoria dinámica Página 858 . 0F03:1A3E punt = &i. Fundamentos de la programación: Punteros y memoria dinámica Página 857 & Obtener la dirección de memoria de . punt punt 0F07:0417 0F Luis Hernández Yáñez 0F07:0418 03 i 0F07:0419 1A 5 0F07:041A 38 . 0F03:1A3B 05 ... 0F03:1A3E 0F03:1A3F .... 0F03:1A39 00 ..... j 0F03:1A3C 0F03:1A3D i = 5. i 0F03:1A38 00 int i. 0F03:1A3B 05 .. & Obtener la dirección de memoria de .. 0F03:1A3F .......

 // Muestra lo que hay en la dirección punt *punt: lo que hay en la dirección que contiene el puntero punt punt contiene la dirección de memoria de la variable i *punt accede al contenido de esa variable i Acceso indirecto al valor de i Luis Hernández Yáñez Fundamentos de la programación: Punteros y memoria dinámica Página 859 * Obtener lo que hay en la dirección .. i 0F03:1A38 00 int i.. 0F03:1A3E punt = &i.. 0F03:1A3F j = *punt. cout << *punt.. 0F03:1A3A 00 int *punt. 0F03:1A39 00 . 0F03:1A3B 05 .. j. punt 0F07:0417 0F Luis Hernández Yáñez 0F07:0418 03 0F07:0419 1A punt: 0F07:041A 38 ..... Operador monario y prefijo * accede a lo que hay en la dirección de memoria a la que precede Permite acceder a un dato a través un puntero que lo apunte: punt = &i.... j 0F03:1A3C 0F03:1A3D i = 5.. Fundamentos de la programación: Punteros y memoria dinámica Página 860 . .. * Obtener lo que hay en la dirección . .

0F03:1A3B 05 . 0F03:1A39 00 . 0F03:1A3F j = *punt.. 0F03:1A3F 05 j = *punt. 0F03:1A3E 00 punt = &i... punt 0F07:0417 0F Luis Hernández Yáñez 0F07:0418 03 0F07:0419 1A *punt: 0F07:041A 38 .. 0F03:1A3A 00 Direccionamiento int *punt. Fundamentos de la programación: Punteros y memoria dinámica Página 862 ... 0F03:1A3A 00 int *punt. i 0F03:1A38 00 int i. de forma indirecta 0F03:1A3E punt = &i. i 0F03:1A38 00 int i. ... * Obtener lo que hay en la dirección .. j 0F03:1A3C 00 0F03:1A3D 00 i = 5... j. indirecto  0F03:1A3B 05 ... ... . Fundamentos de la programación: Punteros y memoria dinámica Página 861 * Obtener lo que hay en la dirección .... j.... punt 0F07:0417 0F Luis Hernández Yáñez 0F07:0418 03 0F07:0419 1A 0F07:041A 38 ... 0F03:1A39 00 . (indirección) j 0F03:1A3C Se accede al dato i 0F03:1A3D i = 5. ..

punt = &i. // Ahora muestra el valor de j int *otro = &i. int main() { int i = 5. } Fundamentos de la programación: Punteros y memoria dinámica Página 863 Luis Hernández Yáñez Fundamentos de la programación: Punteros y memoria dinámica Página 864 . Luis Hernández Yáñez cout << k << endl. // i + j int k = *punt. // Mismo valor que j return 0. punteros. cout << *otro + *punt << endl. cout << *punt << endl. // Muestra el valor de i punt = &j. int j = 13. int *punt.cpp Ejemplo de uso de punteros #include <iostream> using namespace std. cout << *punt << endl.

 // p toma una dirección válida Luis Hernández Yáñez q = p. // q no tiene aún una dirección válida int *p = &i.. Un puntero no inicializado contiene una dirección desconocida int *punt.. Todo puntero ha de tener una dirección válida Un puntero sólo debe ser utilizado si tiene una dirección válida Un puntero NO contiene una dirección válida tras ser definido Un puntero obtiene una dirección válida:  Asignando la dirección de otro dato (operador &)  Asignando otro puntero (mismo tipo base) que ya sea válido  Asignando el valor NULL (puntero nulo. // No inicializado *punt = 12.O. // ¿A qué dato se está asignando el valor? ¿Dirección de la zona de datos del programa? ¡Podemos modificar inadvertidamente un dato del programa! ¿Dirección de la zona de código del programa? ¡Podemos modificar el código del propio programa! ¿Dirección de la zona de código del sistema operativo? ¡Podemos modificar el código del propio S. // otra dirección válida para q Fundamentos de la programación: Punteros y memoria dinámica Página 865 Punteros que apuntan a saber qué. no apunta a nada) int i. modernos protegen bien la memoria) Fundamentos de la programación: Punteros y memoria dinámica Página 866 .O. int *q. // ahora q ya tiene una dirección válida q = NULL.! Luis Hernández Yáñez  Consecuencias imprevisibles (cuelgue) (Los S.

. . punt X *punt = 13. Punteros que no apuntan a nada Inicializando los punteros a NULL podemos detectar errores: int *punt = NULL. punt ha sido inicializado a NULL: ¡No apunta a nada! Si no apunta a nada. lo que es mucho Sabemos dónde y qué buscar para depurar Fundamentos de la programación: Punteros y memoria dinámica Página 867 Luis Hernández Yáñez Fundamentos de la programación: Punteros y memoria dinámica Página 868 . ¿¿¿qué significa *punt??? No tiene sentido  ERROR: ¡Acceso a un dato a través de un puntero nulo! Error de ejecución. lo que ciertamente no es bueno Luis Hernández Yáñez Pero sabemos cuál ha sido el problema..

 // punt2 apunta a la variable x punt1 X punt2 Luis Hernández Yáñez x 5 Fundamentos de la programación: Punteros y memoria dinámica Página 869 Apuntando al mismo dato Al copiar un puntero en otro. // ambos apuntan a la variable x punt1 punt2 Luis Hernández Yáñez x 5 Fundamentos de la programación: Punteros y memoria dinámica Página 870 . Apuntando al mismo dato Al copiar un puntero en otro. // punt2 apunta a la variable x punt1 = punt2. ambos apuntarán al mismo dato: int x = 5. int *punt1 = NULL. // punt1 no apunta a nada int *punt2 = &x. int *punt1 = NULL. // punt1 no apunta a nada int *punt2 = &x. ambos apuntarán al mismo dato: int x = 5.

int *punt1 = NULL. int *punt1 = NULL.. ambos apuntarán al mismo dato: int x = 5.. // punt2 apunta a la variable x punt1 = punt2. if (punt1 == punt2) { cout << "Apuntan al mismo dato" << endl. // ambos apuntan a la variable x *punt1 = 8. int *punt2 = &x. // punt1 no apunta a nada int *punt2 = &x. Apuntando al mismo dato Al copiar un puntero en otro. } else { cout << "No apuntan al mismo dato" << endl. } Luis Hernández Yáñez Sólo se pueden comparar punteros con el mismo tipo base Fundamentos de la programación: Punteros y memoria dinámica Página 872 . punt1 punt2 Al dato x ahora se puede Luis Hernández Yáñez acceder de tres formas: x 8 5 x  *punt1  *punt2 Fundamentos de la programación: Punteros y memoria dinámica Página 871 ¿Apuntan al mismo dato? Operadores relacionales == y !=: int x = 5. .

int entero = 5. typedef char *tCharPtr. tCharPtr puntC = &caracter. cout << *puntI << "  " << *puntC << "  " << *puntD << endl. char caracter = 'C'. typedef double *tDoublePtr.cpp Declaración de tipos puntero Declaramos tipos para los punteros con distintos tipos base: typedef int *tIntPtr. double real = 5. Luis Hernández Yáñez Con *puntero podemos hacer lo que con otros datos del tipo base Fundamentos de la programación: Punteros y memoria dinámica Página 874 . tDoublePtr puntD = &real.Luis Hernández Yáñez Fundamentos de la programación: Punteros y memoria dinámica Página 873 tipos. tIntPtr puntI = &entero.23.

. } tRegistro.codigo puntero sería una estructura con campo codigo de tipo puntero Fundamentos de la programación: Punteros y memoria dinámica Página 876 . Acceso a estructuras a través de punteros Los punteros pueden apuntar también a estructuras: typedef struct { int codigo.  (*puntero). tRegistro registro. string nombre. Fundamentos de la programación: Punteros y memoria dinámica Página 875 structPtr. cout << puntero‐>codigo << "  " << puntero‐>nombre  << "  " << puntero‐>sueldo << endl. double sueldo.. registro..sueldo = 95000.nombre = "Javier". typedef tRegistro *tRegistroPtr. tRegistroPtr puntero = &registro. tRegistro registro. registro. Luis Hernández Yáñez puntero‐>codigo  (*puntero).codigo  *puntero. string nombre. typedef tRegistro *tRegistroPtr. Operador flecha (‐>): Acceso a los campos a través de un puntero sin usar el operador * Luis Hernández Yáñez puntero‐>codigo puntero‐>nombre    puntero‐>sueldo puntero‐>. } tRegistro.codigo = 12345..cpp Acceso a estructuras a través de punteros typedef struct { int codigo. double sueldo. registro.. tRegistroPtr puntero = &registro.

Punteros a constantes y punteros constantes El efecto del modificador de acceso const depende de su sitio: const tipo *puntero.cpp Punteros a constantes y punteros constantes El efecto del modificador de acceso const depende de su sitio: const tipo *puntero. // Puntero constante int entero1 = 5. // Puntero a constante int entero1 = 5. tIntPtrCte punt_cte = &entero1. Puntero a una constante tipo *const puntero. (*punt_a_cte)++. Puntero constante Punteros constantes: typedef int *const tIntPtrCte. Puntero a una constante tipo *const puntero. // ERROR: ¡Dato no modificable! Luis Hernández Yáñez punt_a_cte = &entero2. Puntero constante Punteros a constantes: typedef const int *tIntCtePtr. // OK: El puntero no es cte. // OK: El puntero no apunta a cte. tIntCtePtr punt_a_cte = &entero1. // ERROR: ¡Puntero constante! Fundamentos de la programación: Punteros y memoria dinámica Página 878 . Fundamentos de la programación: Punteros y memoria dinámica Página 877 constPtr. (*punt_cte)++. Luis Hernández Yáñez punt_cte = &entero2. entero2 = 13. entero2 = 13.

Luis Hernández Yáñez SÍ puede cambiar cout << entero << endl. void incrementa(int *punt) { (*punt)++.. } Paso por valor: .Luis Hernández Yáñez Fundamentos de la programación: Punteros y memoria dinámica Página 879 param.cpp Paso de parámetros por referencia o variable En el lenguaje C no hay mecanismo de paso por referencia (&) Sólo se pueden pasar parámetros por valor ¿Cómo se simula el paso por referencia? Por medio de punteros: void incrementa(int *punt).. Mostrará 6 en la consola Fundamentos de la programación: Punteros y memoria dinámica Página 880 . El argumento (el puntero) no cambia int entero = 5. Aquello a lo que apunta (el entero) incrementa(&entero).

. double real. } entero 6 Luis Hernández Yáñez cout << entero << endl. double *param2. entero 5 punt recibe la dirección de entero void incrementa(int *punt) { punt (*punt)++. Paso de parámetros por referencia o variable int entero = 5. entero 6 Fundamentos de la programación: Punteros y memoria dinámica Página 881 Paso de parámetros por referencia o variable ¿Cuál es el equivalente en C a este prototipo de C++? void foo(int &param1. Fundamentos de la programación: Punteros y memoria dinámica Página 882 . char *param3) { // Al primer argumento se accede con *param1 // Al segundo argumento se accede con *param2 // Al tercer argumento se accede con *param3 } ¿Cómo se llamaría? Luis Hernández Yáñez int entero. &caracter). void foo(int *param1. double *param2. char *param3). foo(&entero.. incrementa(&entero). &real. double &param2. Prototipo equivalente: void foo(int *param1. //. char caracter. char &param3).

 31. 31}. el primer elemento del array ¡Un nombre de array es un puntero constante! Siempre apunta al primer elemento (no se puede modificar) Luis Hernández Yáñez Acceso a los elementos del array: Por índice o con aritmética de punteros (Anexo) Fundamentos de la programación: Punteros y memoria dinámica Página 884 . 31. 31. Entonces: cout << *dias << endl. 30. si tenemos: int dias[12] =  {31.Luis Hernández Yáñez Fundamentos de la programación: Punteros y memoria dinámica Página 883 Una íntima relación Variable array  Puntero al primer elemento del array Así. Muestra 31 en la consola. 31. 31. 30. 30. 28. 30.

 int size). Fundamentos de la programación: Punteros y memoria dinámica Página 885 Luis Hernández Yáñez Fundamentos de la programación: Punteros y memoria dinámica Página 886 .. // Puntero Arrays no delimitados y punteros: se necesita la dimensión Elementos: se acceden con índice (arr[i]) o con puntero (*arr) Una función sólo puede devolver un array en forma de puntero: Luis Hernández Yáñez intPtr inicializar(). int size). void cuadrado(int arr[]... Paso de arrays a subprogramas ¡Esto explica por qué no usamos & con los parámetros array! El nombre del array es un puntero: ya es un paso por referencia Prototipos equivalentes para parámetros array: const int N = . void cuadrado(int arr[N]). // Array no delimitado void cuadrado(int *arr.

Fundamentos de la programación: Punteros y memoria dinámica Página 887 Memoria principal Pila Datos locales Datos globales del programa: Montón Datos dinámicos Declarados fuera Datos globales de los subprogramas Código del programa Memoria principal S... typedef tRegistro tArray[N]. const int N = 1000. typedef struct { . Regiones de la memoria El sistema operativo distingue varias regiones en la memoria: Pila (Stack) Datos locales Montón (Heap) Datos dinámicos Datos globales Código del  Memoria principal programa Luis Hernández Yáñez S..O. Fundamentos de la programación: Punteros y memoria dinámica Página 888 . Luis Hernández Yáñez int main() { . typedef struct { tArray registros.O. } tRegistro.. } tLista. int cont.

 double &total) { tLista aux..O. resultado) Fundamentos de la programación: Punteros y memoria dinámica Página 889 El montón (heap) Pila Datos locales Datos dinámicos Montón Datos dinámicos Datos que se crean y se destruyen Datos globales durante la ejecución del programa. . void func(tLista lista.. se destruye Se libera la memoria y el SGMD cuenta de nuevo con ella Luis Hernández Yáñez Fundamentos de la programación: Punteros y memoria dinámica Página 890 . Sistema de gestión de memoria dinámica (SGMD) Cuando se necesita memoria para una variable se solicita El SGMD reserva espacio y devuelve la dirección base Cuando ya no se necesita más la variable.O. Código del programa Memoria principal a medida que se necesita S. Y los punteros temporales &resultado que apuntan a los argumentos de los parámetros por referencia Luis Hernández Yáñez func(lista. La pila (stack) Pila Datos locales Datos locales de subprogramas: Montón Datos dinámicos Parámetros por valor Datos globales y variables locales Código del programa Memoria principal S. int i.

Luis Hernández Yáñez Fundamentos de la programación: Punteros y memoria dinámica Página 891 Datos dinámicos Se crean y se destruyen durante la ejecución del programa Se les asigna memoria del montón Creación Montón Dato dinámico Destrucción ¿Por qué utilizar memoria dinámica?  Almacén de memoria muy grande: datos o listas de datos que no caben en memoria principal pueden caber en el montón Luis Hernández Yáñez  El programa ajusta el uso de la memoria a las necesidades de cada momento: ni le falta ni la desperdicia Fundamentos de la programación: Punteros y memoria dinámica Página 892 .

¿Cuándo se asigna memoria a los datos?  Datos globales En memoria principal al comenzar la ejecución del programa Existen durante toda la ejecución del programa  Datos locales de un subprograma En la pila al ejecutarse el subprograma Existen sólo durante la ejecución de su subprograma  Datos dinámicos En el montón cuando el programa lo solicita Luis Hernández Yáñez Existen a voluntad del programa Fundamentos de la programación: Punteros y memoria dinámica Página 893 Datos estáticos  Datos declarados como de un tipo concreto: int i. Datos dinámicos  Datos accedidos a través de su dirección de memoria Esa dirección de memoria debe estar el algún puntero Los punteros son la base del SGMD Luis Hernández Yáñez Los datos estáticos también se pueden acceder a través de punteros int *p = &i.  Se acceden directamente a través del identificador: cout << i. Fundamentos de la programación: Punteros y memoria dinámica Página 894 .

 // Ya tiene una dirección válida *p = 12. La variable dinámica se accede exclusivamente por punteros No tiene identificador asociado int i. que debe ser asignada a un puntero int *p. // Puntero que da acceso a una variable // dinámica (accesible sólo a través de p2) Fundamentos de la programación: Punteros y memoria dinámica Página 896 . // Todavía sin una dirección válida p = new int.Luis Hernández Yáñez Fundamentos de la programación: Punteros y memoria dinámica Página 895 Devuelve NULL si no queda memoria suficiente El operador new new tipo Reserva memoria del montón para una variable del tipo y devuelve la primera dirección de memoria utilizada. *p2. // i es una variable estática int *p1. p1 = &i. // Puntero que da acceso a la variable Luis Hernández Yáñez // estática i (accesible con i o con *p1) p2 = new int.

#include "registro. *p = 12.. delete p. p = new int(12).cpp Inicialización con el operador new El operador new admite un valor inicial para el dato creado: int *p. mostrar(*punt). y se inicializa con el valor 12 #include <iostream> using namespace std. Luis Hernández Yáñez tRegistro *punt = new tRegistro(reg). reg = nuevo(). registros.h" int main() { tRegistro reg. de tipo int. .. Se crea la variable.. // Ya no se necesita el entero apuntado por p ¡El puntero deja de contener una dirección válida! Luis Hernández Yáñez Fundamentos de la programación: Punteros y memoria dinámica Página 898 .. p = new int. Devuelve al montón la memoria usada por la variable dinámica apuntada por puntero int *p. Fundamentos de la programación: Punteros y memoria dinámica Página 897 El operador delete delete puntero. .

a 1.5 Variables: cout << *p2 << endl. 4 p2 = new double. (+ *p2 y *p3) Luis Hernández Yáñez delete p3. dinamicas.5. *p3. p3 ? Luis Hernández Yáñez MONTÓN Fundamentos de la programación: Punteros y memoria dinámica Página 900 . p3) *p2 = *p1.5 p3 = new double.5 int main() { p1 ? double a = 1. p2 ? double *p1. (a. int main() { double a = 1. *p2. Montón (heap) } Fundamentos de la programación: Punteros y memoria dinámica Página 899 #include <iostream> using namespace std. 6 delete p2. p3 123.45. p1 = &a. *p3 = 123. p2 1. PILA a 1.45 return 0. cout << *p1 << endl. p1 Identificadores: double *p1. *p2. *p3.cpp #include <iostream> using namespace std. p2. cout << *p3 << endl. p1.5.

#include <iostream> using namespace std. *p2. p3 ? Luis Hernández Yáñez MONTÓN Fundamentos de la programación: Punteros y memoria dinámica Página 901 #include <iostream> using namespace std.5. *p3. PILA a 1. Luis Hernández Yáñez MONTÓN Fundamentos de la programación: Punteros y memoria dinámica Página 902 . *p3.5. p3 ? p2 = new double. p1 = &a. p2 ? double *p1. *p2.5 int main() { p1 double a = 1. PILA a 1. p2 double *p1. p1 = &a.5 int main() { p1 double a = 1.

5.5 int main() { p1 double a = 1. *p3. *p3. p1 = &a. p2 double *p1.5 MONTÓN Fundamentos de la programación: Punteros y memoria dinámica Página 904 . *p2 = *p1. p3 = new double. *p2. #include <iostream> using namespace std. PILA a 1. p3 ? p2 = new double. Luis Hernández Yáñez 1. p1 = &a.5 int main() { p1 double a = 1. *p2 = *p1. *p2.5 MONTÓN Fundamentos de la programación: Punteros y memoria dinámica Página 903 #include <iostream> using namespace std. PILA a 1. Luis Hernández Yáñez 1. p2 double *p1.5. p3 p2 = new double.

p3 = new double. cout << *p1 << endl. p3 p2 = new double. p3 p2 = new double.5 MONTÓN Fundamentos de la programación: Punteros y memoria dinámica Página 905 #include <iostream> using namespace std.45. *p2.5. p3 = new double. *p3. PILA a 1.5. delete p2. cout << *p3 << endl. 123.45 Luis Hernández Yáñez MONTÓN Fundamentos de la programación: Punteros y memoria dinámica Página 906 . 123. p2 double *p1. p1 = &a. *p3 = 123. *p3. cout << *p2 << endl. *p3 = 123. #include <iostream> using namespace std. PILA a 1. *p2 = *p1.5 int main() { p1 double a = 1.5 int main() { p1 double a = 1.45. p2 ? double *p1. p1 = &a. *p2 = *p1. *p2.45 Luis Hernández Yáñez 1.

5 int main() { p1 double a = 1. *p2. cout << *p2 << endl. #include <iostream> using namespace std. cout << *p1 << endl. p1 = &a.5. *p3 = 123.45. p3 ? p2 = new double. Luis Hernández Yáñez delete p3. *p2 = *p1. MONTÓN Fundamentos de la programación: Punteros y memoria dinámica Página 907 Luis Hernández Yáñez Fundamentos de la programación: Punteros y memoria dinámica Página 908 . p2 ? double *p1. delete p2. PILA a 1. cout << *p3 << endl. p3 = new double. *p3.

como el lenguaje Java ¡Hay que devolver toda la memoria solicitada! Deben ejecutarse tantos delete como new se hayan ejecutado La memoria disponible en el montón debe ser exactamente la misma antes y después de la ejecución del programa Y todo dato dinámico debe tener algún acceso (puntero) Luis Hernández Yáñez Es un grave error perder un dato en el montón Fundamentos de la programación: Punteros y memoria dinámica Página 910 . La memoria se reparte entre la pila y el montón Pila Crecen en direcciones opuestas Al llamar a subprogramas la pila crece Al crear datos dinámicos el montón crece Montón Colisión pila‐montón Los límites de ambas regiones se encuentran Se agota la memoria Desbordamiento de la pila Luis Hernández Yáñez La pila suele tener un tamaño máximo establecido Si se sobrepasa se agota la pila Fundamentos de la programación: Punteros y memoria dinámica Página 909 Gestión del montón Sistema de Gestión de Memoria Dinámica (SGMD) Gestiona la asignación de memoria a los datos dinámicos Localiza secciones adecuadas y sigue la pista de lo disponible No dispone de un recolector de basura.

*p = nuevo(). Falta delete p.. p = new tRegistro. mostrar(*p). int main() { tRegistro *p. pero dejará memoria desperdiciada Luis Hernández Yáñez Visual C++ sí comprueba el uso de la memoria dinámica y nos avisa si dejamos memoria sin liberar Fundamentos de la programación: Punteros y memoria dinámica Página 912 .Luis Hernández Yáñez Fundamentos de la programación: Punteros y memoria dinámica Página 911 Olvido de destrucción de un dato dinámico . } G++ no indicará ningún error y el programa parecerá terminar correctamente. return 0..

delete p2. mostrar(*p2). delete p2. Luis Hernández Yáñez return 0. int main() { tRegistro *p1.  p2 = new tRegistro(nuevo()). return 0. Intento de destrucción de un dato inexistente . delete p1. *p1 = nuevo(). Sólo se ha creado Luis Hernández Yáñez } una variable Fundamentos de la programación: Punteros y memoria dinámica Página 913 Pérdida de un dato dinámico . Se pierde un dato en el montón } Se intenta eliminar un dato ya eliminado Fundamentos de la programación: Punteros y memoria dinámica Página 914 . p1 = new tRegistro(nuevo()).  p1 = p2... p2 tRegistro mostrar(*p1).  p1 tRegistro mostrar(*p1).. p2 tRegistro *p2.. mostrar(*p1).  ¡Perdido! delete p1. int main() { p1 tRegistro tRegistro *p1 = new tRegistro. *p2. p2 = p1.

mostrar(*p). p ha dejado de apuntar al dato dinámico destruido return 0. ..  Acceso a memoria inexistente } Luis Hernández Yáñez Fundamentos de la programación: Punteros y memoria dinámica Página 915 Luis Hernández Yáñez Fundamentos de la programación: Punteros y memoria dinámica Página 916 . delete p. p = new tRegistro(nuevo()).. Intento de acceso a un dato tras su eliminación . mostrar(*p)... int main() { tRegistro *p.

estarán en el montón const int N = 1000.registros Luis Hernández Yáñez Fundamentos de la programación: Punteros y memoria dinámica Página 918 . Los punteros ocupan double valor. Se crean a medida que se insertan Se destruyen a medida que se eliminan Fundamentos de la programación: Punteros y memoria dinámica Página 917 tLista lista. Los datos a los que apunten typedef tRegistro *tRegPtr.cont = 0.cont 0 0 1 2 3 4 5 6 998 999 lista. // Array de punteros a registros: typedef tRegPtr tArray[N]. lista. typedef struct { tArray registros. muy poco en memoria } tRegistro. } tLista. lista. Luis Hernández Yáñez int cont. Arrays de punteros a datos dinámicos typedef struct { int codigo. string nombre.

lista. lista.registros[lista.cont = 0. lista.cont++.cont] = new tRegistro(nuevo()).registros Luis Hernández Yáñez Fundamentos de la programación: Punteros y memoria dinámica Página 920 .cont] = new tRegistro(nuevo()).cont = 0. lista. lista. lista.registros[lista. lista.cont 2 0 1 2 3 4 5 6 998 999 lista.cont 1 0 1 2 3 4 5 6 998 999 lista.cont] = new tRegistro(nuevo()).cont++. lista.registros[lista.cont++. lista.registros Luis Hernández Yáñez Fundamentos de la programación: Punteros y memoria dinámica Página 919 tLista lista. tLista lista. lista.

registros[lista. lista. lista. lista.cont 3 0 1 2 3 4 5 6 998 999 lista.registros[lista. lista. lista. lista.cont] = new tRegistro(nuevo()). lista. lista. lista.cont = 0.registros[0]‐>nombre.registros[lista.cont++.cont++. tLista lista.registros Luis Hernández Yáñez Fundamentos de la programación: Punteros y memoria dinámica Página 922 .registros Luis Hernández Yáñez Fundamentos de la programación: Punteros y memoria dinámica Página 921 Los registros se acceden a través de los punteros (operador ‐>): cout << lista.cont] = new tRegistro(nuevo()).cont] = new tRegistro(nuevo()).cont 3 0 1 2 3 4 5 6 998 999 lista.cont++.

typedef struct { tArray registros. i < lista. void cargar(tLista &lista. int cont. Luis Hernández Yáñez void guardar(const tLista &lista). void insertar(tLista &lista. const string BD = "bd.h #ifndef lista_h #define lista_h registro. } tLista. typedef tRegPtr tArray[N].cont. int code).cont 3 0 1 2 3 4 5 6 998 999 lista. void destruir(tLista &lista). i++) { delete lista. } lista.h con el tipo puntero: #include "registro. int buscar(const tLista &lista.h" typedef tRegistro *tRegPtr. int code. void eliminar(tLista &lista. No hay que olvidarse de devolver la memoria al montón: for (int i = 0. bool &ok). bool &ok).registros Luis Hernández Yáñez Fundamentos de la programación: Punteros y memoria dinámica Página 923 lista.dat". bool &ok). const int N = 1000.registros[i]. void mostrar(const tLista &lista). tRegistro registro. #endif Fundamentos de la programación: Punteros y memoria dinámica Página 924 .

} void destruir(tLista &lista) { for (int i = 0. lista. } if (!encontrado) { ind = ‐1... int code.cpp void insertar(tLista &lista.registros[lista.registros[ind]‐>codigo == code) { encontrado = true. } else { lista. if (ind == ‐1) { ok = false.registros[ind]. } } void eliminar(tLista &lista.cont] = new tRegistro(registro). Luis Hernández Yáñez } lista. code). } else { delete lista. lista. bool &ok) { ok = true.cont‐‐. for (int i = ind + 1. while ((ind < lista.registros[i].registros[i]. } . if (lista. i < lista. bool &ok) { ok = true. int code) { // Devuelve el índice o ‐1 si no se ha encontrado int ind = 0. int ind = buscar(lista.registros[i ‐ 1] = lista. } lista. i++) { lista.cont == N) { ok = false. i < lista.cont++. } else { ind++. } } Fundamentos de la programación: Punteros y memoria dinámica Página 925 int buscar(const tLista &lista.cont. Fundamentos de la programación: Punteros y memoria dinámica Página 926 . i++) { Luis Hernández Yáñez delete lista.cont = 0. } return ind.cont. bool encontrado = false.cont) && !encontrado) { if (lista. tRegistro registro.

 ok). } return 0. bool ok. cargar(lista. destruir(lista).cpp #include <iostream> using namespace std. Luis Hernández Yáñez } Fundamentos de la programación: Punteros y memoria dinámica Página 927 Luis Hernández Yáñez Fundamentos de la programación: Punteros y memoria dinámica Página 928 . if (ok) { mostrar(lista).h" int main() { tLista lista.h" #include "lista. listadinamica. #include "registro.

} delete [] p. ¡No olvides destruir el array dinámico! Luis Hernández Yáñez return 0. const int N = 10. int *p = new int[10]. } Fundamentos de la programación: Punteros y memoria dinámica Página 930 . for (int i = 0. int main() { int *p = new int[N]. i++) { cout << p[i] << endl. Creación y destrucción de arrays dinámicos Array dinámico: array que se ubica en la memoria dinámica Creación de un array dinámico: tipo *puntero = new tipo[dimensión]. i < N. i++) { p[i] = i. Crea un array de 10 int en memoria dinámica Los elementos se acceden a través del puntero: p[i] Destrucción del array: delete [] p. } for (int i = 0. i < N. Luis Hernández Yáñez