Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Fundamentos de La Programacion UCM 2014 PDF
Fundamentos de La Programacion UCM 2014 PDF
UniversidadComplutense
Apuntesdeclasedelaasignatura
Fundamentosdelaprogramacin
1curso
GradoenIngenieraenInformtica
GradoenIngenieradelSoftware
GradoenIngenieradeComputadores
20132014
LuisHernndezYez
LicenciaCreativeCommons:
Reconocimiento,NocomercialyCompartirigual.
http://creativecommons.org/licenses/byncsa/3.0/
Estapublicacincontienelosapuntesdeclasedelaasignatura
Fundamentosdelaprogramacin,asignaturade1cursodelosgrados
queseimpartenenlaFacultaddeInformticadelaUCM.
Durantelostresprimeroscursosenlosquesehaimpartidolaasignatura,
estematerialhasidosometidoacontinuasrevisionesycontribuciones
porpartedelosprofesoresquehanimpartidolosdistintosgrupos
delaasignatura.Aunqueeltrabajohaquedadobastanteconsolidado,
estoysegurodequetodavacontienemuchaserratas.Siencuentrasalguna,
nodudes,porfavor,enhacrmelosaberyconseguiras
quelasiguienteversinestmejordepurada.
Quieroagradeceratodoslosprofesoresquehanimpartidolaasignatura
sucontribucineneldesarrollodelmaterial,destacandoespecialmente
lalabordePabloMorenoGeryCarlosCervignRckauer.
LuisHernndezYez
ProfesordelaFacultaddeInformticadelaUCM
Fundamentosdelaprogramacin
TC
Grado en Ingeniera Informtica
Grado en Ingeniera del Software
Grado en Ingeniera de Computadores
Luis Hernndez Yez
Facultad de Informtica
Universidad Complutense
LuisHernndezYez
Tema1
Tema2
Computadorasyprogramacin
TiposeinstruccionesI
Anexo:Detallestcnicosdelostipos
Tema3 TiposeinstruccionesII
AnexoI:Eloperadorternario?
AnexoII:Ejemplosdesecuencias
Tema4 Laabstraccinprocedimental
Anexo:Mssobresubprogramas
Tema5 Tiposdedatosestructurados
Anexo:CadenasalestilodeC
Tema6 Recorridoybsquedaenarrays
Tema7 Algoritmosdeordenacin
Anexo:Mssobreordenacin
Tema8 Programacinmodular
Anexo:Ejemplodemodularizacin
Tema9 Punterosymemoriadinmica
Anexo:Punterosymemoriadinmica
Tema10 Introduccinalarecursin
Apndice:Archivosbinarios
Fundamentosdelaprogramacin
1
48
212
225
398
402
425
496
512
580
588
649
742
755
832
847
938
981
1049
3
12
15
19
24
27
30
35
39
45
LuisHernndezYez
Informtica,computadorasyprogramacin
Lenguajemquinayensamblador
Lenguajesdeprogramacindealtonivel
Unpocodehistoria
ProgramacineIngenieradelSoftware
EllenguajedeprogramacinC++
Sintaxisdeloslenguajesdeprogramacin
UnprimerprogramaenC++
Herramientasdedesarrollo
C++:UnmejorC
LuisHernndezYez
Fundamentosdelaprogramacin
Unejemplodeprogramacin
ElprimerprogramaenC++
Laslneasdecdigodelprograma
Clculosenlosprogramas
Variables
Expresiones
Lecturadedatosdesdeelteclado
Resolucindeproblemas
Losdatosdelosprogramas
Identificadores
Tiposdedatos
Declaracinyusodevariables
Instruccionesdeasignacin
Operadores
Mssobreexpresiones
Constantes
Labibliotecacmath
Operacionesconcaracteres
Fundamentosdelaprogramacin
50
64
80
86
92
98
108
119
127
129
133
142
147
152
160
167
171
174
Operadoresrelacionales
Tomadedecisiones(if)
Bloquesdecdigo
Bucles(while)
Entrada/salidaporconsola
Funcionesdefinidas
porelprogramador
177
180
183
186
190
199
214
216
217
218
220
221
222
223
LuisHernndezYez
int
float
Notacincientfica
double
char
bool
string
Literalesconespecificacindetipo
LuisHernndezYez
Fundamentosdelaprogramacin
Tipos,valoresyvariables
Conversindetipos
Tiposdeclaradosporelusuario
Tiposenumerados
Entrada/Salida
conarchivosdetexto
Lecturadearchivosdetexto
Escrituraenarchivosdetexto
Flujodeejecucin
Seleccinsimple
Operadoreslgicos
Anidamientodeif
Condiciones
Seleccinmltiple
Laescalaifelseif
Lainstruccinswitch
Repeticin
Elbuclewhile
Fundamentosdelaprogramacin
227
232
236
238
248
253
266
272
276
282
286
290
293
295
302
313
316
Elbuclefor
Buclesanidados
mbitoyvisibilidad
Secuencias
Recorridodesecuencias
Secuenciascalculadas
Bsquedaensecuencias
Arraysdedatossimples
Usodevariablesarrays
Recorridodearrays
Bsquedaenarrays
Arraysnocompletos
321
331
339
349
355
363
370
374
379
382
387
393
399
Recorridos
Unaparcamiento
Parntesisbienemparejados?
Dossecuenciasiguales?
NmerosprimosmenoresqueN
Bsquedas
Bsquedadeunnmeroenunarchivo
Bsquedasensecuenciasordenadas
404
405
409
412
413
417
419
420
LuisHernndezYez
Eloperadorternario?
Fundamentosdelaprogramacin
LuisHernndezYez
Diseodescendente:Tareasysubtareas
Subprogramas
Subprogramasydatos
Parmetros
Argumentos
Resultadodelafuncin
Prototipos
Ejemploscompletos
Funcionesdeoperador
Diseodescendente(unejemplo)
Precondicionesypostcondiciones
Fundamentosdelaprogramacin
427
434
441
446
451
467
473
475
477
480
490
498
501
504
508
LuisHernndezYez
Archivoscomoparmetros
Lafuncinmain()
Argumentosimplcitos
Sobrecargadesubprogramas
LuisHernndezYez
Fundamentosdelaprogramacin:Laabstraccinprocedimental(Anexo)
Tiposdedatos
Arraysdenuevo
Arraysybuclesfor
Mssobrearrays
Inicializacindearrays
Enumeradoscomondices
Pasodearraysasubprogramas
Implementacindelistas
Cadenasdecaracteres
Cadenasdecaracteresdetipostring
Entrada/salidaconstring
Operacionesconstring
Estructuras
Estructurasdentrodeestructuras
Arraysdeestructuras
Arraysdentrodeestructuras
Listasdelongitudvariable
Unejemplocompleto
Elbucledo..while
Fundamentosdelaprogramacin
514
517
520
522
523
524
525
528
531
535
539
541
543
549
550
551
552
558
562
582
583
584
585
LuisHernndezYez
CadenasalestilodeC
E/SconcadenasalestilodeC
Labibliotecacstring
Ejemplo
LuisHernndezYez
Fundamentosdelaprogramacin
Recorridodearrays
Arrayscompletos
Arraysnocompletosconcentinela
Arraysnocompletosconcontador
Ejemplos
Generacindenmerosaleatorios
Bsquedasenarrays
Arrayscompletos
Arraysnocompletosconcentinela
Arraysnocompletosconcontador
Ejemplo
Recorridosybsquedasencadenas
Msejemplosdemanejodearrays
Arraysmultidimensionales
Inicializacindearraysmultidimensionales
Recorridodeunarraybidimensional
RecorridodeunarrayNdimensional
Bsquedaenunarraymultidimensional
Fundamentosdelaprogramacin
590
593
594
595
597
601
604
606
607
608
610
614
617
630
638
641
644
647
651
654
665
672
680
688
692
694
701
716
722
729
731
LuisHernndezYez
Algoritmosdeordenacin
Algoritmodeordenacinporinsercin
Ordenacindearraysporinsercin
Algoritmodeordenacinporinsercin
conintercambios
Clavesdeordenacin
Estabilidaddelaordenacin
Complejidadyeficiencia
Ordenacionesnaturales
Ordenacinporseleccindirecta
Mtododelaburbuja
Listasordenadas
Bsquedasenlistasordenadas
Bsquedabinaria
Fundamentosdelaprogramacin
LuisHernndezYez
Ordenacinporintercambio
Mezcladedoslistasordenadas
Fundamentosdelaprogramacin
744
747
LuisHernndezYez
Programasmultiarchivoycompilacinseparada
Interfazfrenteaimplementacin
Usodemdulosdebiblioteca
Ejemplo:GestindeunalistaordenadaI
Compilacindeprogramasmultiarchivo
Elpreprocesador
Cadacosaensumdulo
Ejemplo:GestindeunalistaordenadaII
Elproblemadelasinclusionesmltiples
Compilacincondicional
Proteccinfrenteainclusionesmltiples
Ejemplo:GestindeunalistaordenadaIII
Implementacionesalternativas
Espaciosdenombres
Implementacionesalternativas
Calidadyreutilizacindelsoftware
757
762
768
770
778
780
782
784
789
794
795
796
804
808
817
827
Fundamentosdelaprogramacin
LuisHernndezYez
Modularizacindeunprograma
Fundamentosdelaprogramacin
833
LuisHernndezYez
Direccionesdememoriaypunteros
Operadoresdepunteros
Punterosydireccionesvlidas
Punterosnoinicializados
Unvalorseguro:NULL
Copiaycomparacindepunteros
Tipospuntero
Punterosaestructuras
Punterosaconstantesypunterosconstantes
Punterosypasodeparmetros
Punterosyarrays
Memoriaydatosdelprograma
Memoriadinmica
Punterosydatosdinmicos
Gestindelamemoria
Errorescomunes
Arraysdedatosdinmicos
Arraysdinmicos
849
854
864
866
867
868
873
875
877
879
883
886
891
895
907
911
916
928
Fundamentosdelaprogramacin
LuisHernndezYez
Aritmticadepunteros
Recorridodearraysconpunteros
Referencias
Listasenlazadas
Fundamentosdelaprogramacin
940
953
962
964
LuisHernndezYez
Conceptoderecursin
Algoritmosrecursivos
Funcionesrecursivas
Diseodefuncionesrecursivas
Modelodeejecucin
Lapiladelsistema
Lapilaylasllamadasafuncin
Ejecucindelafuncinfactorial()
Tiposderecursin
Recursinsimple
Recursinmltiple
Recursinanidada
Recursincruzada
Cdigodelsubprogramarecursivo
Parmetrosyrecursin
Ejemplosdealgoritmosrecursivos
Bsquedabinaria
TorresdeHanoi
Recursinfrenteaiteracin
Estructurasdedatosrecursivas
983
986
987
989
990
992
994
1005
1018
1019
1020
1022
1026
1027
1032
1034
1035
1038
1043
1045
Fundamentosdelaprogramacin
LuisHernndezYez
Flujos
Archivosbinarios
Tamaodelosdatos:Eloperadorsizeof()
Aperturadearchivosbinarios
Lecturadearchivosbinarios(accesosecuencial)
Escrituraenarchivosbinarios(accesosecuencial)
Accesodirectooaleatorio
Ejemplosdeusodearchivosbinarios
Ordenacindelosregistrosdelarchivo
Bsquedabinaria
Insercinenunarchivobinarioordenado
Cargadelosregistrodeunarchivoenunatabla
Almacenamientodeunatablaenunarchivo
Fundamentosdelaprogramacin
1051
1054
1056
1059
1061
1066
1070
1078
1079
1085
1088
1092
1093
Fundamentosdelaprogramacin
RB
Grado en Ingeniera Informtica
Grado en Ingeniera del Software
Grado en Ingeniera de Computadores
Luis Hernndez Yez
Facultad de Informtica
Universidad Complutense
LuisHernndezYez
LuisHernndezYez
Fundamentosdelaprogramacin
LuisHernndezYez
Fundamentosdelaprogramacin
Fundamentosdelaprogramacin
1
Grado en Ingeniera Informtica
Grado en Ingeniera del Software
Grado en Ingeniera de Computadores
Luis Hernndez Yez
Facultad de Informtica
Universidad Complutense
LuisHernndezYez
Informtica,computadorasyprogramacin
Lenguajemquinayensamblador
Lenguajesdeprogramacindealtonivel
Unpocodehistoria
ProgramacineIngenieradelSoftware
EllenguajedeprogramacinC++
Sintaxisdeloslenguajesdeprogramacin
UnprimerprogramaenC++
Herramientasdedesarrollo
C++:UnmejorC
Fundamentosdelaprogramacin:Computadorasyprogramacin
3
12
15
19
24
27
30
35
39
45
LuisHernndezYez
Fundamentosdelaprogramacin:Computadorasyprogramacin
Pgina 3
LuisHernndezYez
Computadora
Mquina electrnica, analgica o digital,
dotada de una memoria de gran capacidad
y de mtodos de tratamiento de la informacin,
capaz de resolver problemas matemticos y lgicos
mediante la ejecucin de programas informticos
Fundamentosdelaprogramacin:Computadorasyprogramacin
Pgina 4
LuisHernndezYez
Fundamentosdelaprogramacin:Computadorasyprogramacin
Pgina 5
Hardware
Componentes que integran
la parte material
de una computadora
LuisHernndezYez
Software
Programas, instrucciones
y reglas informticas
para ejecutar tareas
en una computadora
Fundamentosdelaprogramacin:Computadorasyprogramacin
Pgina 6
Programar
Indicar a la computadora qu es lo que tiene que hacer
Programa
LuisHernndezYez
Secuencia de instrucciones
Instrucciones que entiende la computadora
Y que persiguen un objetivo: resolver un problema!
Fundamentosdelaprogramacin:Computadorasyprogramacin
LuisHernndezYez
ParqueJursico
Fundamentosdelaprogramacin:Computadorasyprogramacin
Pgina 7
Trabajo en equipo
Mltiples roles...
Gestores
Analistas
Diseadores
Programadores
Probadores
Administradores de
sistemas
...
Pgina 8
Esquema general
Memoria
temporal
UnidadCentraldeProceso
CentralProcessorUnit
LuisHernndezYez
Dispositivos
de entrada
Teclado
Ratn
Escner
Tctil
Dispositivos
de salida
C.P.U.
Almacenamiento
permanente
Fundamentosdelaprogramacin:Computadorasyprogramacin
Monitor
Impresora
Altavoz
Pgina 9
UnaALUde2bits(Wikipedia)
C.P.U. (Procesador)
LuisHernndezYez
A.L.U.
Unidad AritmticoLgica
Memoria
Unidad de Control
Fundamentosdelaprogramacin:Computadorasyprogramacin
Pgina 10
La memoria
Memoria
01
Celdas de 8 / 16 / 32 / 64 bits
02
Informacin voltil
03
04
Bus
de
datos
05
06
07
08
Direccin
Fundamentosdelaprogramacin:Computadorasyprogramacin
Pgina 11
Fundamentosdelaprogramacin:Computadorasyprogramacin
Pgina 12
LuisHernndezYez
LuisHernndezYez
...
1 Bit = 0 / 1
1 Byte = 8 bits = 1 carcter
1 Kilobyte (KB) = 1024 Bytes
1 Megabyte (MB) = 1024 KB
1 Gigabyte (GB) = 1024 MB
1 Terabyte (TB) = 1024 GB
1 Petabyte (PB) = 1024 TB
Lenguaje mquina
Cdigos hexadecimales que representan instrucciones,
registros de la CPU, direcciones de memoria o datos
Lenguajedebajonivel
LuisHernndezYez
Instruccin Significado
A02F
3E01
A030
3E02
1D
B331
Fundamentosdelaprogramacin:Computadorasyprogramacin
Pgina 13
Cdigo fuente
(lenguaje ensamblador)
Programa
ensamblador
Cdigo objeto
(lenguaje mquina)
Fundamentosdelaprogramacin:Computadorasyprogramacin
Pgina 14
LuisHernndezYez
Fundamentosdelaprogramacin:Computadorasyprogramacin
Pgina 15
LuisHernndezYez
Fundamentosdelaprogramacin:Computadorasyprogramacin
Pgina 16
Traduccin
#include<iostream>
usingnamespacestd;
Cdigo fuente
intmain()
{
cout<<"HolaMundo!"<<endl;
return0;
}
Compiladores:
Compilan y enlazan
programas completos
Compilador
Cdigo objeto
Intrpretes:
Compilan, enlazan
y ejecutan instruccin
a instruccin
0100010100111010011100
Cdigo
objeto de
biblioteca
LuisHernndezYez
Enlazador
Programa
ejecutable
Paraunaarquitecturaconcreta
yunsistemaoperativo
Fundamentosdelaprogramacin:Computadorasyprogramacin
Pgina 17
Genealoga de lenguajes
Versiones/Estndares
Prolog
COBOL
1959
PL/I
1970
1964
1995
1983
FORTRAN
1954
Java
C++
C#
CPL
2000
1971
1963
Python
ALGOL
Pascal
Modula
1958
1970
1975
BASIC
1964
LuisHernndezYez
Fuente:
http://www.levenez.com/lang/
Simula
1964
1991
Ada
Eiffel
1979
1986
Smalltalk
Ruby
1971
1993
Haskell
Lisp
Scheme
1958
1975
1987
Logo
1968
Fundamentosdelaprogramacin:Computadorasyprogramacin
Pgina 18
LuisHernndezYez
Fundamentosdelaprogramacin:Computadorasyprogramacin
Pgina 19
La prehistoria
El baco
Siglo XIX
Mquina analtica de Charles Babbage
(Wikipedia)
LuisHernndezYez
Fundamentosdelaprogramacin:Computadorasyprogramacin
Pgina 20
LuisHernndezYez
Siglo XX
1936 Mquina de Turing
1946 ENIAC: Primera computadora digital
de propsito general
1947 El transistor
1953 IBM 650: Primera
computadora a gran escala
1966 ARPANET: Origen de Internet
1967 El disquete
1970 Sistema operativo UNIX
1972 Primer virus informtico (Creeper)
Lenguaje de programacin C
1974 Protocolo TCP. Primera red local
ENIAC(Wikipedia)
Fundamentosdelaprogramacin:Computadorasyprogramacin
1975
1976
1979
1981
LuisHernndezYez
1983
1984
1985
1990
1991
Se funda Microsoft
Se funda Apple
Juego Pacman
IBM PC
Sistema operativo MSDOS
Lenguaje de programacin C++
CDROM
Windows 1.0
Lenguaje HTML
World Wide Web
Sistema operativo Linux
Fundamentosdelaprogramacin:Computadorasyprogramacin
Pgina 21
AppleII(Wikipedia)
Linux
IBMPC(Wikipedia)
Pgina 22
2001 Windows XP
Mac OS X
2002 Mozilla Firefox
2007 iPhone
2008 Android ...
Fundamentosdelaprogramacin:Computadorasyprogramacin
Pgina 23
Fundamentosdelaprogramacin:Computadorasyprogramacin
Pgina 24
LuisHernndezYez
LuisHernndezYez
Siglo XXI
Qu es programar?
Decirle a un tonto muy rpido exactamente lo que tiene que hacer
Especificar la estructura y el comportamiento de un programa,
as como probar que el programa realiza su tarea
adecuadamente y con un rendimiento aceptable
Programa: Transforma entrada en salida
LuisHernndezYez
Entrada
Programa
Salida
Pgina 25
Anlisis
Diseo
Cmo?
LuisHernndezYez
Programacin
Implementacin
Prueba y depuracin
Mantenimiento
Fundamentosdelaprogramacin:Computadorasyprogramacin
Pgina 26
LuisHernndezYez
Fundamentosdelaprogramacin:Computadorasyprogramacin
Pgina 27
#include<iostream>
usingnamespacestd;
int main()
{
cout<<"HolaMundo!"<<endl;
LuisHernndezYez
//MuestraHolaMundo!
return 0;
}
Fundamentosdelaprogramacin:Computadorasyprogramacin
Pgina 28
Instrucciones
Datos: literales, variables, tipos
Subprogramas (funciones)
Comentarios
Directivas
#include<iostream>
...
Directiva
usingnamespacestd;
int main()
Dato
{
Instruccin
cout<<"HolaMundo!"<<endl;
//MuestraHolaMundo!
Comentario
return 0;
Instruccin
Dato
}
Fundamentosdelaprogramacin:Computadorasyprogramacin
Pgina29
Fundamentosdelaprogramacin:Computadorasyprogramacin
Pgina 30
LuisHernndezYez
LuisHernndezYez
Subprograma
Semntica
Significado de cada elemento del lenguaje
Para qu sirve?
LuisHernndezYez
Fundamentosdelaprogramacin:Computadorasyprogramacin
Pgina 31
Especificacin
Lenguajes (BNF)
Diagramas
Ejemplo: Nmeros enteros (sin decimales)
BNF
LuisHernndezYez
<numeroentero>::=<signoopcional><secuenciadedgitos>
<signoopcional>::=+||<nada>
<secuenciadedgitos>::=<dgito>|<dgito><secuenciadedgitos>
<dgito>::=0|1|2|3|4|5|6|7|8|9
|significa
<nada>::=
+
0..9
Fundamentosdelaprogramacin:Computadorasyprogramacin
+23
159
1374
134
3.4
002
Pgina 32
<numeroentero>::=<signoopcional><secuenciadedgitos>
<signoopcional>::=+||<nada>
<secuenciadedgitos>::=<dgito>|<dgito><secuenciadedgitos>
<dgito>::=0|1|2|3|4|5|6|7|8|9
<nada>::=
LuisHernndezYez
+23
<numeroentero>::=<signoopcional><secuenciadedgitos>
::=+<secuenciadedgitos>::=+<dgito><secuenciadedgitos>
::=+2<secuenciadedgitos>::=+2<dgito> ::=+23
1374
<numeroentero>::=<signoopcional><secuenciadedgitos>
::=<secuenciadedgitos>::=<dgito><secuenciadedgitos>
::=1<secuenciadedgitos>::=1<dgito><secuenciadedgitos>
::=13<secuenciadedgitos>::=13<dgito><secuenciadedgitos>
::=137<secuenciadedgitos>::=137<dgito> ::=1374
134
<numeroentero>::=<signoopcional><secuenciadedgitos>
::=<secuenciadedgitos>::=<dgito><secuenciadedgitos>
::=1<secuenciadedgitos>::=ERROR ( noes<dgito>)
Fundamentosdelaprogramacin:Computadorasyprogramacin
+23
LuisHernndezYez
134
Pgina 33
+23
0..9
1374
0..9
1374
+
0..9
Fundamentosdelaprogramacin:Computadorasyprogramacin
Pgina 34
LuisHernndezYez
Fundamentosdelaprogramacin:Computadorasyprogramacin
Pgina 35
Hola Mundo!
Un programa que muestra un saludo en la pantalla:
#include<iostream>
usingnamespacestd;
int main()
//main()esdondeempiezalaejecucin
LuisHernndezYez
cout<<"HolaMundo!"<<endl;//MuestraHolaMundo!
return 0;
}
Fundamentosdelaprogramacin:Computadorasyprogramacin
Pgina 36
Espaciodenombres
#include<iostream>
usingnamespacestd;
Coloreado sintctico
Tipo
Bloquedecdigo
LuisHernndezYez
Declaracin
Palabrasreservadas
Cabeceradelafuncin
int main()
{
Variable
Cadenadecaracteres
Constante
cout<<"HolaMundo!" <<endl;
Instruccin
Operador
Operador
Datosliterales
return0;
Instruccin
Nmero
Cuerpodelafuncin
Lasinstruccionesterminanen;
Fundamentosdelaprogramacin:Computadorasyprogramacin
Pgina 37
Hola Mundo!
Casi todo es infraestructura
Slo
cout<<"HolaMundo!"<<endl
hace algo palpable
LuisHernndezYez
El estilo importa!
Fundamentosdelaprogramacin:Computadorasyprogramacin
Pgina 38
LuisHernndezYez
Fundamentosdelaprogramacin:Computadorasyprogramacin
Pgina 39
Editor
Bloc de notas, Wordpad, Word, Writer, Gedit, Kwrite,
(texto simple, sin formatos)
Editores especficos: coloreado sintctico
Recomendacin: Notepad++
LuisHernndezYez
Instalacin y uso:
Seccin
Herramientasdedesarrollo
en el Campus Virtual
Fundamentosdelaprogramacin:Computadorasyprogramacin
Pgina 40
hola.cpp
(cdigofuente)
Compilador
Cdigo objeto de
la biblioteca iostream
hola.obj
(cdigoobjeto)
Enlazador
HolaMundo!
LuisHernndezYez
Cargador
hola.exe
(ejecutable)
Fundamentosdelaprogramacin:Computadorasyprogramacin
Pgina 41
Compilador
Importante: C++ estndar
Recomendacin: GNU G++ (MinGW en Windows)
LuisHernndezYez
Instalacin y uso:
Seccin
Herramientasdedesarrollo
en el Campus Virtual
Fundamentosdelaprogramacin:Computadorasyprogramacin
Pgina 42
Entornos de desarrollo
Para editar, compilar y probar el cdigo del programa
Recomendaciones:
Windows: MS Visual Studio / C++ Express o Eclipse
Linux: Netbeans o Eclipse
LuisHernndezYez
Instalacin y uso:
Seccin
Herramientasdedesarrollo
en el Campus Virtual
Fundamentosdelaprogramacin:Computadorasyprogramacin
Pgina 43
Qu hace el programa?
La ejecucin del programa siempre empieza en main()
Se ejecutan las instrucciones en secuencia de principio a fin
LuisHernndezYez
Inicio
cout<<"HolaMundo!" <<endl;
Muestra HolaMundo!
en la pantalla y salta de lnea
return0;
Devuelve 0 como cdigo
de terminacin del programa
Pantalla(cout)
_ HolaMundo!
_
Fin
Fundamentosdelaprogramacin:Computadorasyprogramacin
Pgina 44
LuisHernndezYez
Fundamentosdelaprogramacin:Computadorasyprogramacin
Pgina 45
LuisHernndezYez
El lenguaje C
Lenguaje creado por Dennis M. Ritchie en 1972
Lenguaje de nivel medio:
Estructuras tpicas de los lenguajes de alto nivel
Construcciones para control a nivel de mquina
Lenguaje sencillo (pocas palabras reservadas)
Lenguaje estructurado (no estrictamente estructurado en bloques)
Compartimentalizacin de cdigo (funciones) y datos (mbitos)
Componente estructural bsico: la funcin (subprograma)
Programacin modular
Distingue entre maysculas y minsculas
Palabras reservadas (o clave): en minsculas
Fundamentosdelaprogramacin:Computadorasyprogramacin
Pgina 46
LuisHernndezYez
Pgina 47
Fundamentosdelaprogramacin
2
Grado en Ingeniera Informtica
Grado en Ingeniera del Software
Grado en Ingeniera de Computadores
Luis Hernndez Yez
LuisHernndezYez
Facultad de Informtica
Universidad Complutense
Unejemplodeprogramacin
ElprimerprogramaenC++
Laslneasdecdigodelprograma
Clculosenlosprogramas
Variables
Expresiones
Lecturadedatosdesdeelteclado
Resolucindeproblemas
Losdatosdelosprogramas
Identificadores
Tiposdedatos
Declaracinyusodevariables
Instruccionesdeasignacin
Operadores
Mssobreexpresiones
Constantes
Labibliotecacmath
Operacionesconcaracteres
50
64
80
86
92
98
108
119
127
129
133
142
147
152
160
167
171
174
Fundamentosdelaprogramacin:TiposeinstruccionesI
Operadoresrelacionales
Tomadedecisiones(if)
Bloquesdecdigo
Bucles(while)
Entrada/salidaporconsola
Funcionesdefinidas
porelprogramador
177
180
183
186
190
199
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 50
LuisHernndezYez
Ejemplos:
Start;
Go North3Blocks;
Stop;
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 51
Start
instruccin
Stop
avanzar
LuisHernndezYez
avanzar
direccin
direccin
Go
num
Blocks
North
East
2
num
South
West
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 52
El problema a resolver
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI
A
Bloque:
Pgina 53
El algoritmo
LuisHernndezYez
1. Arrancar
2. Ir un bloque al Norte
3. Ir dos bloques al Este
4. Ir cinco bloques al Norte
5. Ir dos bloques al Este
6. Parar
Esos pasos sirven tanto para
una persona como para una computadora.
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 54
El programa
LuisHernndezYez
Instrucciones escritas en
el lenguaje de programacin
Start;
Go North1Blocks;
Go East2Blocks;
Go North5Blocks;
Go East2Blocks;
Stop;
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 55
El programa
LuisHernndezYez
Stat;
Go North1Blocks
Go EastBlocks;
Go Noth 5Blocks;
Go West2Blocks;
Stop;
Copiamos el archivo
en una llave USB
y lo llevamos al coche
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 56
La compilacin
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI
Errores
de sintaxis
Pgina 57
Depuracin
Editamos el cdigo para corregir los errores sintcticos:
Start;
Go North1Blocks;
Go East3 Blocks;
Go North5Blocks;
Go West2Blocks;
Stop;
LuisHernndezYez
Stat;
Go North1Blocks
Go EastBlocks;
Go Noth 5Blocks;
Go West2Blocks;
Stop;
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 58
La ejecucin
Se realiza lo que pide
cada instruccin:
Start;
Go North1Blocks;
LuisHernndezYez
Go East3Blocks;
Error de ejecucin
Una instruccin no se puede ejecutar!
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 59
Depuracin
Editamos el cdigo para arreglar el error de ejecucin:
Start;
Go North1Blocks;
Go East2 Blocks;
Go North5Blocks;
Go West2Blocks;
Stop;
LuisHernndezYez
Start;
Go North1Blocks;
Go East3Blocks;
Go North5Blocks;
Go West2Blocks;
Stop;
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 60
La ejecucin
Se realiza lo que pide
cada instruccin:
?
B
LuisHernndezYez
Start;
Go North1Blocks;
Go East2Blocks;
Go North5Blocks;
Go West2Blocks;
Stop;
Error lgico
El programa no llega al resultado deseado!
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 61
Depuracin
Editamos el cdigo para arreglar el error lgico:
Start;
Go North1Blocks;
Go East2Blocks;
Go North5Blocks;
Go East 2Blocks;
Stop;
LuisHernndezYez
Start;
Go North1Blocks;
Go East2Blocks;
Go North5Blocks;
Go West2Blocks;
Stop;
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 62
La ejecucin
LuisHernndezYez
Start;
Go North1Blocks;
Go East2Blocks;
Go North5Blocks;
Go East2Blocks;
Stop;
Conseguido!
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 63
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 64
Hola Mundo!
De vuelta en el programa que muestra un saludo en la pantalla:
#include<iostream>
usingnamespacestd;
int main() //main()esdondeempiezalaejecucin
{
cout<<"HolaMundo!"<<endl;
LuisHernndezYez
return 0;
}
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 65
Hola Mundo!
La nica instruccin que produce algo tangible:
#include<iostream>
usingnamespacestd;
intmain()//main()esdondeempiezalaejecucin
{
cout<<"HolaMundo!"<<endl;
LuisHernndezYez
return0;
}
Fundamentosdelaprogramacin:TiposeinstruccionesI
cout (iostream)
Pgina 66
cout<<"HolaMundo!"<<endl;
cout <<"HolaMundo!" <<endl;
HolaMundo!
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 67
LuisHernndezYez
80caracteres
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 68
H o l a
M u n d o !
...
LuisHernndezYez
...
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 69
El insertor <<
cout<<...;
LuisHernndezYez
Recuerda:lasinstruccionesterminanen;
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 70
Lascomillasnosemuestran!
LuisHernndezYez
Nmeros literales
Con o sin decimales, con signo o no: 123, 37, 3.1416, ...
cout<<"Pi=" <<3.1416;
Se muestran los caracteres que representan el nmero
endl
Fundamentosdelaprogramacin:TiposeinstruccionesI
Puntodecimal,NOcoma!
Pgina 71
El programa principal
La funcin main(): donde comienza la ejecucin...
#include<iostream>
usingnamespacestd;
int main()
//main()esdondeempiezalaejecucin
{
cout<<"HolaMundo!"<<endl;
return 0;
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 72
El programa principal
La funcin main():
Tipo de la funcin (int = entero): Tipo de valor que devuelve
Nombre de la funcin
int main()
Es una funcin!
{
...
return 0;
LuisHernndezYez
return 0;
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 73
Documentando el cdigo...
Comentarios (se ignoran):
#include<iostream>
usingnamespacestd;
intmain()//main()esdondeempiezalaejecucin
{
cout<<"HolaMundo!"<<endl;
LuisHernndezYez
...
// Comentariodeunalnea
/* Comentariodevarias
lneasseguidas*/
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 74
La infraestructura
Cdigo para reutilizar:
#include<iostream>
usingnamespacestd;
intmain()//main()esdondeempiezalaejecucin
{
cout<<"HolaMundo!"<<endl;
return0;
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 75
Bibliotecas
Se incluyen con la directiva #include:
#include<iostream>
(Utilidades de entrada/salida por consola)
Para mostrar o leer datos hay que incluir la biblioteca iostream
Espacios de nombres
En iostream hay espacios de nombres; cul queremos?
LuisHernndezYez
#include<iostream>
usingnamespacestd;
Compilacin y enlace
hola.cpp
(cdigofuente)
Pgina 76
Amenudoenunpaso
Compilador
Cdigo objeto de
la biblioteca iostream
hola.obj
(cdigoobjeto)
Enlazador
LuisHernndezYez
HolaMundo!
Cargador
Fundamentosdelaprogramacin:TiposeinstruccionesI
hola.exe
(ejecutable)
Pgina 77
Bloquedecdigo
LuisHernndezYez
Coloreadosintctico:
usingnamespacestd;
Tipo
Declaracin
Espaciodenombres
#include<iostream>
Palabrasreservadas
Cabeceradelafuncin
int main()
{
DirectivasTipos
Palabrasreservadasgenerales
DatosliteralesComentarios
Cadenadecaracteres
Variable
Constante
cout<<"HolaMundo!" <<endl;
Instruccin
Operador
Operador
Datosliterales
return0;
Instruccin
Nmero
Cuerpodelafuncin
Lasinstruccionesterminanen;
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 78
LuisHernndezYez
#include<iostream>
usingnamespacestd;
#include<iostream>usingnamespacestd;
intmain(){cout<<"HolaMundo!"<<endl;
return0;}
intmain()
{
cout<<"HolaMundo!"<<endl;
return0;
}
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 79
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 80
LuisHernndezYez
Tu cdigo aqu!
return 0;
}
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 81
LuisHernndezYez
cout<<"nohamuchotiempoquevivaunhidalgodelosde
lanzaenastillero,..." <<endl;
return 0;
}
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 82
int main()
{
cout<<"EnunlugardelaMancha," <<endl;
cout<<"decuyonombrenoquieroacordarme," <<endl;
LuisHernndezYez
cout<<"nohamuchotiempoquevivaunhidalgodelosde
lanzaenastillero,..." <<endl;
return 0;
}
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 83
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 84
Mantenimiento y reusabilidad
Usa espacio en blanco para separar los elementos:
cout<<"EnunlugardelaMancha," <<endl;
LuisHernndezYez
mejor que
cout<<"EnunlugardelaMancha,"<<endl;
Usa sangra (indentacin) para el cdigo de un bloque:
{
Tab
cout<<"EnunlugardelaMancha," <<endl;
...
3 esp.
return 0;
}
El estilo importa!
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 85
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 86
Operadores aritmticos
+
*
/
Suma
Resta
Multiplicacin
Divisin
LuisHernndezYez
Operadores binarios
operando_izquierdo
Operacin
3 +4
2.56 3
143 *2
45.45 /3
operadoroperando_derecho
Resultado
7
0.44
286
15.15
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 87
LuisHernndezYez
Pgina 88
clculos.cpp
Ejemplo
#include<iostream>
usingnamespacestd;
LuisHernndezYez
int main()
Un texto
Un nmero
{
cout<<"133+1234=" <<133 +1234 <<endl;
cout<<"1234 111.5=" <<1234 111.5 <<endl;
cout<<"34*59=" <<34 *59 <<endl;
cout<<"3.4*5.93=" <<3.4 *5.93 <<endl;
cout<<"500/3=" <<500 /3 <<endl;//Div.entera
cout<<"500.0/3=" <<500.0 /3 <<endl;//Div.real
return 0;
}
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 89
LuisHernndezYez
Divisin entera
Divisin real
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 90
LuisHernndezYez
Divisin
500 /3
500.0 /3
500 /3.0
500.0 /3.0
Resultado
166
166.667
166.667
166.667
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 91
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 92
LuisHernndezYez
edad=19;//variableedadyliteral19
Las variables deben ser declaradas
Qu tipo de dato queremos mantener?
Valor numrico sin decimales (entero): tipo int
Valor numrico con decimales (real): tipo double
Declaracin: tipo nombre;
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 93
Declaracin de variables
int cantidad;
double precio;
tipo nombre;
Memoria
cantidad
precio
?
...
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 94
Declaracin de variables
#include<iostream>
usingnamespacestd;
int main()
{
Memoria
cantidad
precio
total
?
...
int cantidad;
LuisHernndezYez
double precio,total;
return 0;
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 95
LuisHernndezYez
Notacin cientfica
Problemas de precisin
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 96
Instruccin: termina en ;
cantidad 12
cantidad=12; //int
precio=39.95; //double
total=cantidad*precio;//Asigna479.4
LuisHernndezYez
Concordancia de tipos:
cantidad=12.5;
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 97
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 98
Expresiones
Secuencias de operandos y operadores
operando operador operandooperador operando...
total=cantidad*precio*1.18;
Expresin
LuisHernndezYez
Pgina 99
+ y
LuisHernndezYez
total=cantidad1+cantidad2*precio;
* antes que + 10 + 2 * 40,0 10 + 80,0 90,0
total=(cantidad1+cantidad2)*precio;
+ antes que * (10 + 2) * 40,0 12 * 40,0 480,0
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 100
variables.cpp
LuisHernndezYez
#include<iostream>
usingnamespacestd;
int main()
{
int cantidad;
double precio,total;
cantidad=12;
precio=39.95;
total=cantidad*precio;
cout<<cantidad<<"x"<<precio<<"="
<<total<<endl;
return 0;
}
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 101
Memoria
cantidad
precio
total
LuisHernndezYez
...
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 102
cantidad
12
precio
total
?
...
LuisHernndezYez
intmain()
{
intcantidad;
doubleprecio,total;
cantidad=12;
Memoria
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 103
cantidad
precio
12
39.95
total
?
...
LuisHernndezYez
intmain()
{
intcantidad;
doubleprecio,total;
cantidad=12;
precio=39.95;
Memoria
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 104
cantidad
12
precio
39.95
total
479.4
...
LuisHernndezYez
intmain()
{
intcantidad;
doubleprecio,total;
cantidad=12;
precio=39.95;
total=cantidad*precio;
Memoria
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 105
LuisHernndezYez
#include<iostream>
usingnamespacestd;
Memoria
cantidad
12
precio
39.95
intmain()
{
479.4
total
intcantidad;
doubleprecio,total;
...
cantidad=12;
precio=39.95;
total=cantidad*precio;
cout<<cantidad<<"x"<<precio<<"="
<<total<<endl;
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 106
LuisHernndezYez
#include<iostream>
usingnamespacestd;
intmain()
{
intcantidad;
doubleprecio,total;
cantidad=12;
precio=39.95;
total=cantidad*precio;
cout<<cantidad<<"x"<<precio<<"="
<<total<<endl;
return 0;
}
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 107
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI
cin (iostream)
Pgina 108
cin>>cantidad;
Memoria
cin
>>cantidad;
cantidad
12
?
...
12
_
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 109
El extractor >>
cin>>variable;
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 110
39.95.5abc
39.95abc
39.95
Pgina 111
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 112
LuisHernndezYez
int cantidad;
Amigable con el usuario!
double precio,total;
Qu tiene que introducir?
cout<<"Introducelacantidad:";
cin>>cantidad;
cout<<"Introduceelprecio:";
cin>>precio;
cout<<"Cantidad:" <<cantidad<<endl;
cout<<"Precio:" <<precio<<endl;
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 113
LuisHernndezYez
Lectura correcta!!!
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 114
Datos/clculos
1. Pedir el numerador
Variablenumerador (double)
2. Pedir el denominador
Variabledenominador (double)
LuisHernndezYez
4. Mostrar el resultado
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 115
EntradaProcesoSalida
Muchos programas se ajustan a un sencillo esquema:
Declaraciones
Entrada
Procesamiento
Salida
1. Leer numerador
2. Leer denominador
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 116
Leer numerador
cin>>numerador;
2.
Leer denominador
cin>>denominador;
LuisHernndezYez
3.
4.
resultado=numerador/denominador;
cout<<resultado;
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 117
divisin.cpp
Numerador:_129
_
Denominador:_
2
_
int main()
{
Declaraciones double numerador,denominador,resultado;
cout<<"Numerador:";
cin>>numerador;
Entrada
cout<<"Denominador:";
cin>>denominador;
Procesamiento resultado=numerador/denominador;
cout<<"Resultado:" <<resultado<<endl;
Salida
return0;
}
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 118
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 119
LuisHernndezYez
LuisHernndezYez
_
Resultado:_
64.5
64.5
Problema
Dadas la base y la altura de un tringulo, mostrar su rea
Refinamiento
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 120
cin
cadena literal
cout
LuisHernndezYez
cadena literal
variable
variable
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 121
Vara?
Nombre
Pantalla
Variable
cout
"Introduzcalabasedeltringulo:"
Constante
ninguno
Variable
base
Teclado
Variable
cin
"Introduzcalaalturadeltringulo:"
Constante
ninguno
Basedeltringulo
Tipo
double
double
Variable
altura
readeltringulo
double
Variable
area
LuisHernndezYez
Alturadeltringulo
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 122
Operaciones (acciones)
cout<<...
cin>>...
LuisHernndezYez
area =base*altura/2
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 123
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 124
#include<iostream>
usingnamespacestd;
int main()
{
Declaraciones
1. Mostrar en la pantalla el texto que pida la base del tringulo
Algoritmo
traducido
a cdigo
en C++
LuisHernndezYez
return 0;
}
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 125
tringulo.cpp
El programa: implementacin
tringulo?
int main()
{
double base,altura,area;//Declaraciones
cout<<"Introduzcalabasedeltringulo:";//1
cin>>base;//2
cout<<"Introduzcalaalturadeltringulo:";//3
cin>>altura;//4
area =base*altura/2;//5
//6
cout<<"Elreadeuntringulodebase" <<base
<<"yaltura"<<altura<<"es:" <<area <<endl;
return 0;
}
Pgina 126
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 127
LuisHernndezYez
LuisHernndezYez
#include<iostream>
usingnamespacestd;
Literales
Constantes
Con nombre
Datos
base,altura,area
Identificadores
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 128
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 129
LuisHernndezYez
LuisHernndezYez
Variables
Pi=3.141592653589
palabras reservadas
Para variables y constantes con nombre
Nombre de un dato (para accederlo/modificarlo)
Deben ser descriptivos
Sintaxis:
a..z,A..Z,_
0..9,a..z,A..Z,_
LuisHernndezYez
cantidadprrecio
totalbasealturaarea
numerador
Pgina 130
autoboolbreakcasecatchcharclassconst
const_cast
continuedefaultdeletedodouble
dynamic_cast
elseenumexplicitexternfalse
floatforfriendgoto
ifinlineintlong
mutablenamespacenewoperatorprivateprotected
publicregisterreinterpret_cast
LuisHernndezYez
signedsizeofstaticstatic_cast
returnshort
structswitch
templatethisthrowtruetrytypedeftypeid
typename
unionunsignedusingvirtualvoid
volatilewhile
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 131
a..z,A..Z,_
_base_imponible
__edad
valor%100
interesAnual
EDAD12
_12_meses
clculoNmina
AlgunValor
valor?
____valor
salario_1_mes
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 132
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 133
LuisHernndezYez
LuisHernndezYez
100caracteres
aos
0..9,a..z,A..Z,_
Tipos
Cada dato, de un tipo concreto
Cada tipo establece:
125
true
'a'
3.14159
"Hola"
LuisHernndezYez
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 134
int
Nmeros enteros (sin decimales)
1363, 12, 49
float
Nmeros reales
12.45, 3.1932, 1.16E+02
double
Nmeros reales (mayores intervalo y precisin)
char
Caracteres
'a' , '{', '\t'
bool
Valores lgicos (verdadero/falso)
true, false
string
Cadenas de caracteres (biblioteca string) "HolaMundo!"
void
Nada, ausencia de tipo, ausencia de dato (funciones)
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 135
Caracteres
Intervalo de valores: Juego de caracteres (ASCII)
Literales:
'a''%''\t'
1 byte
LuisHernndezYez
ISO88591
(ASCII extendido: cdigos 128..255)
ASCII (cdigos 32..127)
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 136
Valores lgicos
Slo dos valores posibles:
Verdadero (true)
Falso (false)
Literales:
truefalse
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 137
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 138
Cadenas de caracteres
"Hola""Introduceelnumerador:""X142FG5TX?%A"
"
"
char
LuisHernndezYez
Secuencias de caracteres
Programas con variables de tipo string:
#include<string>
usingnamespacestd;
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 139
tipos.cpp
LuisHernndezYez
#include<iostream>
#include<string>
usingnamespacestd;//Unsolousing...paraambasbibliotecas
int main()
{
int entero=3;//Podemosasignar(inicializar)aldeclarar
double real=2.153;
char caracter ='a';
bool cierto=true;
string cadena="Hola";
cout<<"Entero:" <<entero<<endl;
cout<<"Real:" <<real<<endl;
cout<<"Carcter:" <<caracter <<endl;
cout<<"Booleano:" <<cierto<<endl;
cout<<"Cadena:" <<cadena<<endl;
return 0;
}
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 140
Tipo
Intervalo
int
2147483648 .. 2147483647
unsignedint
0 .. 4294967295
shortint
32768 .. 32768
LuisHernndezYez
unsignedshortint 0 .. 65535
longint
2147483648 .. 2147483647
unsignedlongint
0 .. 4294967295
double
+| 2.23e308 .. 1.79e+308
longdouble
+| 3.37E4932 .. 1.18E+4932
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 141
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 142
[modificadores]tipo lista_de_variables;
Opcional
lista_de_variables
Identificador
LuisHernndezYez
,
int i,j,l;
shortintunidades;
unsignedshortintmonedas;
double balance,beneficio,perdida;
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 143
int inicio;
shortintunidades;
double balance;
inicio
01
02
03
04
unidades
05
06
balance
07
08
09
10
11
12
LuisHernndezYez
13
14
15
...
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 144
LuisHernndezYez
Identificador
Expresin
int i=0,j,l=26;
shortintunidades=100;
Fundamentosdelaprogramacin:TiposeinstruccionesI
Enparticular,unaexpresin
puedeserunliteral
Pgina 145
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 146
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 147
LuisHernndezYez
LuisHernndezYez
El operador =
Variable
Expresin
int i,j=2;
LuisHernndezYez
i=23 +j*5;//itomaelvalor33
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 148
Errores
int a,b,c;
5 =a;
//ERROR:unliteralnopuederecibirunvalor
a+23 =5;
//ERROR:nopuedehaberunaexpresinalaizda.
b="abc";
//ERROR:unenteronopuedeguardarunacadena
LuisHernndezYez
c=23
5;
//ERROR:expresinnovlida(faltaoperador)
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 149
int i,j=2;
i=23 +j*5;
Memoria
01
02
03
04
Memoria
i
23 +2 *5
08
03
07
33
02
04
05
06
01
05
06
07
08
09
09
10
10
...
LuisHernndezYez
...
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 150
3.45
127.5
aux
aux=a;
LuisHernndezYez
a=b;
b=aux;
Fundamentosdelaprogramacin:TiposeinstruccionesI
3.45
127.5
aux
3.45
127.5
127.5
aux
3.45
127.5
3.45
aux
3.45
Pgina 151
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 152
LuisHernndezYez
Pgina 153
LuisHernndezYez
float / double
int
1(monario) Prefijo
2(binario)
Infijo
Suma
2(binario)
Infijo
Resta
2(binario)
Infijo
Producto
2(binario)
Infijo
Div.entera
Divisinreal
2(binario)
Infijo
Mdulo
Noaplicable
Cambiodesigno
++
1(monario) Prefijo/postfijo
Incremento
1(monario) Prefijo/postfijo
Decremento
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 154
LuisHernndezYez
++interes
mesesj++
//1ms1menos
Operadores binarios
Operando izquierdo operador operando derecho
Operandos: literales, constantes, variables o expresiones
2 +3
a*RATIOa+b
(a%b)*(c/d)
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 155
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 156
LuisHernndezYez
Divisin entera:
No se obtienen decimales Queda un resto
123
24
123 %5
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 157
++/
int i=10,j;
j=++i;//Incrementaantesdecopiar
cout<<i<<" "<<j;//Muestra11 11
LuisHernndezYez
j=i;
i=i+1;
int i=10,j;
j=i++;//Copiaydespusincrementa
cout<<i<<" "<<j;//Muestra11 10
No mezcles ++ y con otros operadores
Fundamentosdelaprogramacin:TiposeinstruccionesI
LuisHernndezYez
#include<iostream>
usingnamespacestd;
Pgina 158
operadores.cpp
int main(){
int entero1=15,entero2=4;
double real1=15.0,real2=4.0;
cout<<"Operacionesentrelosnmeros15y4:"<<endl;
cout<<"Divisinentera(/):"<<entero1/entero2<<endl;
cout<<"Restodeladivisin(%):"<<entero1%entero2<<endl;
cout<<"Divisinreal(/):"<<real1/real2<<endl;
cout<<"Num="<<real1<<endl;
real1=real1;
cout<<"Cambiadesigno():"<<real1<<endl;
real1=real1;
cout<<"Vuelveacambiar():"<<real1<<endl;
cout<<"Seincrementaantes(++prefijo):"<<++real1<<endl;
cout<<"Semuestraantesdeincrementar(posfijo++):"
<<real1++<<endl;
cout<<"Yaincrementado:" <<real1<<endl;
return 0;
}
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 159
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 160
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 161
Precedencia
Operadores
Mayor prioridad
++ (postfijos)
++ (prefijos)
(cambio de signo)
*/%
Menor prioridad
LuisHernndezYez
3 +5 *2 /2 1 3 +10 /2 1 3 +5 1 8 1 7
Misma precedencia:
Izquierda antes
Mayor
precedencia
Misma precedencia:
Izquierda antes
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 162
* antes que
(6 1)
* antes que +
(32 +12)/4
44 /4 5
/ antes que
LuisHernndezYez
11 5
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 163
frmula.cpp
#include<iostream>
usingnamespacestd;
LuisHernndezYez
int main()
{
double x,f;
cout<<"IntroduceelvalordeX:";
cin>>x;
f=3 *x*x/5 +6 *x/7 3;
cout<<"f(x)=" <<f<<endl;
return 0;
}
Usa parntesis para mejorar la legibilidad:
f=(3 *x*x/5)+(6 *x/7) 3;
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 164
La misma
LuisHernndezYez
variable operador=op_derecho;
Asignacin
a=a+12;
a=a*3;
a=a 5;
a=a/37;
a=a%b;
Abreviatura
a+=12;
a*=3;
a=5;
a/=37;
a%=b;
Fundamentosdelaprogramacin:TiposeinstruccionesI
Igual precedencia
que la asignacin
De momento,
mejor evitarlas
Pgina 165
Bit de signo
0 1 1 1 1 1 1 1
0 = positivo
+ 0 0 0 0 0 0 0 0
1 = negativo
32767
+ 1
0 0 0 0 0 0 0 0
32768
LuisHernndezYez
1 0 0 0 0 0 0 0
1 1 1 1 1 1 1 1
Pgina 166
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 167
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI
const
Declaracindevariableconinicializador
constshortintMeses=12;
constdouble Pi=3.141592,
LuisHernndezYez
RATIO=2.179 *Pi;
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 168
vs.
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 169
constantes.cpp
int main(){
const double Pi=3.141592;
double radio=12.2,circunferencia;
circunferencia=2 *Pi*radio;
cout<<"Circunferenciadeuncrculoderadio"
<<radio<<":" <<circunferencia<<endl;
const double Euler =2.718281828459;//Nmeroe
cout<<"Nmeroealcuadrado:"<<Euler *Euler <<endl;
const int IVA=21;
int cantidad=12;
double precio=39.95,neto,porIVA,total;
neto=cantidad*precio;
porIVA =neto*IVA/100;
total=neto+porIVA;
cout<<"Totalcompra:"<<total<<endl;
return 0;
}
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 170
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 171
LuisHernndezYez
LuisHernndezYez
#include<iostream>
usingnamespacestd;
#include<cmath>
Algunas ...
abs(x)
Valor absoluto de x
LuisHernndezYez
pow(x,y) x elevado a y
sqrt(x)
Raz cuadrada de x
ceil(x)
floor(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
tan(x)
Tangente de x
round(x)
trunc(x)
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 172
mates.cpp
LuisHernndezYez
#include<iostream>
usingnamespacestd;
#include<cmath>
int main(){
double x,y,f;
pow() con argumento entero:
cout<<"ValordeX:";
Usa el molde double():
cin>>x;
pow(double(i),5)
cout<<"ValordeY:";
cin>>y;
f=2 *pow(x,5) +sqrt(pow(x,3) /pow(y,2))
/abs(x*y) cos(y);
cout<<"f(x,y)=" <<f<<endl;
return 0;
}
Pon un espacio detrs de cada coma en las listas de argumentos
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 173
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 174
char
Asignacin, ++/ y operadores relacionales
LuisHernndezYez
devuelve la mayscula de c
devuelve la minscula de c
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 175
caracteres.cpp
int main(){
char caracter1='A',caracter2='1',caracter3='&';
cout<<"Carcter1(" <<caracter1<<")."<<endl;
cout<<"Alfanumrico?"<<isalnum(caracter1)<<endl;
cout<<"Alfabtico?"<<isalpha(caracter1)<<endl;
cout<<"Dgito?"<<isdigit(caracter1)<<endl;
cout<<"Mayscula?"<<isupper(caracter1)<<endl;
caracter1=tolower(caracter1);
cout<<"Enminscula:"<<caracter1<<endl;
cout<<"Carcter2(" <<caracter2<<")."<<endl;
cout<<"Alfabtico?"<<isalpha(caracter2)<<endl;
cout<<"Dgito?"<<isdigit(caracter2)<<endl;
cout<<"Carcter3(" <<caracter3<<")."<<endl;
cout<<"Alfanumrico?"<<isalnum(caracter3)<<endl;
cout<<"Alfabtico?"<<isalpha(caracter3)<<endl;
cout<<"Dgito?"<<isdigit(caracter3)<<endl;
return 0;
1 true / 0 false
}
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 176
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 177
LuisHernndezYez
LuisHernndezYez
...
#include<cctype>
Operadores relacionales
Comparaciones (condiciones)
Condicin simple ::= Expresin Operador_relacional Expresin
LuisHernndezYez
menor que
<=
>
mayor que
>=
==
igual que
!=
distinto de
Fundamentosdelaprogramacin:TiposeinstruccionesI
Operadores(prioridad)
...
*/%
+
< <=>>=
==!=
=+==*=/=%=
Pgina 178
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 179
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 180
LuisHernndezYez
cdigoT
Condicin
false
cdigoF
if (condicin) {
cdigoT
}
else{
cdigoF
}
int num;
cout<<"Nmero:";
Opcional:puedenohaberelse
cin>>num;
if (num%2 ==0){
cout<<num<<"espar";
}
else {
cout<<num<<"esimpar";
}
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 181
seleccin.cpp
int main(){
intop1=13,op2=4;
intopcion;
cout<<"1 Sumar"<<endl;
cout<<"2 Restar"<<endl;
cout<<"Opcin:";
cin>>opcion;
if (opcion ==1){
cout<<op1+op2<<endl;
}
else {
cout<<op1 op2<<endl;
}
return0;
}
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 182
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 183
LuisHernndezYez
LuisHernndezYez
#include<iostream>
usingnamespacestd;
Agrupacin de instrucciones
Grupo de instrucciones a ejecutar en una rama del if
{
instruccin
Tab
LuisHernndezYez
3 esp.
int num,total=0;
cin>>num;
if (num>0)
{
cout<<"Positivo";
total=total+num;
}
cout<<endl;
intruccin1
intruccin2
...
intruccinN
mbito local
(declaraciones locales)
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 184
if (num>0){
cout<<"Positivo";
total=total+num;
}
cout<<endl;
LuisHernndezYez
if (num>0){
cout<<"Positivo";
}
if (num>0)
cout<<"Positivo";
Pgina 185
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 186
condicin
cuerpo
Bloque
de cdigo
true
Condicin
false
LuisHernndezYez
Cuerpo
while (condicin) {
cuerpo
}
Pgina 187
serie.cpp
LuisHernndezYez
#include<iostream>
usingnamespacestd;
int main(){
inti=1,n=0,suma=0;
while (n<=0){//Slonpositivo
cout<<"Cuntosnmerosquieressumar?";
cin>>n;
}
while(i<=n){
suma=suma+i;
i++;
}
cout<<"Sumatoriodei(1a" <<n <<")="
<<suma<<endl;
return0;
}
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 188
Iteracin condicional
while(i<=n){
suma=suma+i;
i++;
}
true
i<=n
false
6
2
3
4
5
1
suma
15
10
1
3
6
0
LuisHernndezYez
suma+=i;
i++;
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 189
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 190
#include<iostream>
usingnamespacestd;
cin
7
cout
5
Programa 1
= l a t o T
LuisHernndezYez
Flujodeentrada
>>
Variable
Insertor
Flujodesalida
<<
Expresin
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 191
cin
>>
Variable
LuisHernndezYez
Pgina 192
#include<string>
usingnamespacestd;
cin>>cadena
cin.sync()
string nombre,apellidos;
cout<<"Nombre:";
cin>>nombre;
cout<<"Apellidos:";
cin>>apellidos;
cout<<"Nombrecompleto:"
<<nombre<<""
<<apellidos<<endl;
string nombre,apellidos;
cout<<"Nombre:";
cin>>nombre;
cin.sync();
cout<<"Apellidos:";
cin>>apellidos;
cout<<...
LuisHernndezYez
Pgina 193
Pgina 194
cout
Expresin
<<
123.45
Un nmero real!
LuisHernndezYez
cout<<d;
La biblioteca iostream
define la constante endl
como un salto de lnea
5 4 . 3 2 1
Un texto!
(secuencia de caracteres)
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 195
Expresin
<<
cout
Programa
cout
int meses=7;
cout<<"Total:"<<123.45 <<endl<<"Meses:"<<meses;
cout<<123.45 <<endl<<"Meses:"<<meses;
cout<<endl<<"Meses:"<<meses;
LuisHernndezYez
cout<<"Meses:"<<meses;
Total: 123.45
Meses: 7
cout<<meses;
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 196
#include<iomanip>
Constantes y funciones a enviar a cout para ajustar el formato de salida
Biblioteca Constante/funcin
iostream
LuisHernndezYez
iomanip
Propsito
showpoint/
noshowpoint
fixed
scientific
boolalpha
left/right
setw(anchura)*
setprecision(p)
Pgina 197
bool fin=false;
cout<<fin<<">" <<boolalpha <<fin<<endl;
0>false
double d=123.45;
char c='x';
int i=62;
cout<<d<<c<<i<<endl;
123.45x62
cout<<"|" <<setw(8)<<d<<"|"<<endl;
|123.45|
cout<<"|" <<left<<setw(8)<<d<<"|"<<endl;
|123.45|
cout<<"|" <<setw(4)<<c<<"|"<<endl;
|x|
cout<<"|" <<right<<setw(5)<<i<<"|"<<endl;
|62|
cout<<e<<" "<<showpoint<<e<<endl;
96 96.0000
cout<<scientific<<d<<endl;
1.234500e+002
cout<<fixed<<setprecision(8)<<d<<endl;
123.45000000
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 198
Fundamentosdelaprogramacin:TiposeinstruccionesI
Pgina 199
LuisHernndezYez
LuisHernndezYez
double e=96;
LuisHernndezYez
tipo nombre(parmetros)//Cabecera
{
//Cuerpo
}
Fundamentosdeprogramacin:TiposeinstruccionesI
Pgina 200
LuisHernndezYez
Pgina 201
LuisHernndezYez
Fundamentosdeprogramacin:TiposeinstruccionesI
Pgina 202
Memoria
i
124
3.0
...
int main(){
int i=124;
...
double d=3;
124
funcion(i,33 *d);
99.0
LuisHernndezYez
...
...
return0;//main()devuelve0alS.O.
}
Fundamentosdeprogramacin:TiposeinstruccionesI
Pgina 203
int main(){
return x*x;
cout<<2 *cuad(16);
LuisHernndezYez
x=x*x;
}
return 0;
Esta instruccin
no se ejecutar nunca
256
Fundamentosdeprogramacin:TiposeinstruccionesI
Pgina 204
LuisHernndezYez
Pgina 205
#include<iostream>
usingnamespacestd;
#include<cmath>
LuisHernndezYez
//Prototiposdelasfunciones(exceptomain())
bool par(int num);
boolletra(char car);
intsuma(int num);
double formula(int x,inty);
int main(){
intnumero,sum,x,y;
char caracter;
double f;
cout<<"Entero:";
cin>>numero;
if (par(numero)){
cout<<"Par";
}
...
Fundamentosdeprogramacin:TiposeinstruccionesI
Pgina 206
LuisHernndezYez
else{
cout<<"Impar";
}
cout<<endl;
if (numero>1){
cout<<"Sumatoriode1a" <<numero<<":"
<<suma(numero)<<endl;
}
cout<<"Carcter:";
cin>>caracter;
if(!letra(caracter)){
cout<<"no";
}
cout<<"esunaletra" <<endl;
cout<<"f(x,y)=" <<formula(x,y)<<endl;
//Losargumentospuedenllamarseigualonoquelosparmetros
return 0;
}
...
Fundamentosdeprogramacin:TiposeinstruccionesI
Pgina 207
//Implementacindelasfuncionespropias
boolpar(int num){
bool esPar;
if (num%2==0){
esPar =true;
}
else {
esPar =false;
}
LuisHernndezYez
return esPar;
}
...
Fundamentosdeprogramacin:TiposeinstruccionesI
Pgina 208
LuisHernndezYez
Pgina 209
funciones.cpp
LuisHernndezYez
Fundamentosdeprogramacin:TiposeinstruccionesI
Pgina 210
LuisHernndezYez
Pgina 211
Fundamentosdelaprogramacin
2A
Grado en Ingeniera Informtica
Grado en Ingeniera del Software
Grado en Ingeniera de Computadores
Luis Hernndez Yez
Facultad de Informtica
Universidad Complutense
LuisHernndezYez
int
float
Notacincientfica
double
char
bool
string
Literalesconespecificacindetipo
Fundamentosdelaprogramacin:TiposeinstruccionesI(Anexo)
214
216
217
218
220
221
222
223
Nmeros enteros
Intervalo de valores:
2147483648 .. 2147483647
(*) Depende de la mquina
Bytes de memoria: 4*
4 bytes es lo ms habitual
Literales:
Se puede saber cuntos
se usan con la funcin
1363, 12, 010 , 0x1A
sizeof(int)
01
02
03
04
05
06
07
0..9
0..9
LuisHernndezYez
Notacin octal
08
09
...
Notacin hexadecimal
0..7
x
0..9,A..F
Fundamentosdelaprogramacin:TiposeinstruccionesI(Anexo)
Pgina 214
Nmeros enteros
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI(Anexo)
Pgina 215
01
02
03
04
05
06
07
+
0..9
08
0..9
09
...
LuisHernndezYez
+
0..9
0..9
e,E
0..9
Fundamentosdelaprogramacin:TiposeinstruccionesI(Anexo)
Pgina 216
5,23 x 102
0,0523
1.11e2
1,11 x 102
111,0
7.4523e04
7,4523 x 104
0,00074523
3.333.300
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI(Anexo)
Pgina 217
01
02
03
04
05
06
07
+
0..9
08
0..9
09
...
LuisHernndezYez
+
0..9
0..9
e,E
0..9
Fundamentosdelaprogramacin:TiposeinstruccionesI(Anexo)
Pgina 218
Caracteres
Intervalo de valores:
Juego de caracteres (ASCII)
Bytes de memoria: 1 (FC)
Literales:
'a', '%', '\t'
Constantes de barra invertida:
(O secuencias de escape)
Para caracteres de control
'\t' = tabulador, '\n' = salto de lnea,
\
02
03
04
05
06
07
08
09
...
n,t,v,b,r,f,a,\
'
LuisHernndezYez
01
'
Carcter
Fundamentosdelaprogramacin:TiposeinstruccionesI(Anexo)
Pgina 219
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI(Anexo)
Pgina 220
Valores lgicos
01
02
03
04
05
06
07
08
09
...
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI(Anexo)
Pgina 221
Cadenas de caracteres
"Hola", "Introduceelnumerador:", "X142FG5TX?%A"
"
Carcter
"
LuisHernndezYez
Secuencias de caracteres
Se asigna la memoria que se necesita para la secuencia concreta
Requieren la biblioteca string con el espacio de nombres std:
#include<string>
usingnamespacestd;
Ojo!
Las comillas tipogrficas (apertura/cierre) te darn problemas
al compilar. Asegrate de utilizar comillas rectas: ""
Fundamentosdelaprogramacin:TiposeinstruccionesI(Anexo)
Pgina 222
LuisHernndezYez
Pgina 223
LuisHernndezYez
Pgina 224
Fundamentosdelaprogramacin
3
Grado en Ingeniera Informtica
Grado en Ingeniera del Software
Grado en Ingeniera de Computadores
Luis Hernndez Yez
LuisHernndezYez
Facultad de Informtica
Universidad Complutense
Tipos,valoresyvariables
Conversindetipos
Tiposdeclaradosporelusuario
Tiposenumerados
Entrada/Salida
conarchivosdetexto
Lecturadearchivosdetexto
Escrituraenarchivosdetexto
Flujodeejecucin
Seleccinsimple
Operadoreslgicos
Anidamientodeif
Condiciones
Seleccinmltiple
Laescalaifelseif
Lainstruccinswitch
Repeticin
Elbuclewhile
227
232
236
238
248
253
266
272
276
282
286
290
293
295
302
313
316
Fundamentosdelaprogramacin:TiposeinstruccionesII
Elbuclefor
Buclesanidados
mbitoyvisibilidad
Secuencias
Recorridodesecuencias
Secuenciascalculadas
Bsquedaensecuencias
Arraysdedatossimples
Usodevariablesarrays
Recorridodearrays
Bsquedaenarrays
Arraysnocompletos
321
331
339
349
355
363
370
374
379
382
387
393
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 227
Tipo
Conjunto de valores con sus posibles operaciones
Valor
Conjunto de bits interpretados como de un tipo concreto
Variable (o constante)
Cierta memoria con nombre para valores de un tipo
LuisHernndezYez
Declaracin
Instruccin que identifica un nombre
Definicin
Declaracin que asigna memoria a una variable o constante
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 228
LuisHernndezYez
int j=9;
char c='a';
c a
double x=1.5;
3
9
1.5
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 229
Simples
LuisHernndezYez
Estructurados (Tema 5)
Fundamentosdeprogramacin:TiposeinstruccionesII
Pgina 230
longint int
float
[long] double
char
Definicin de variables:
tipo nombre [=expresin][,...];
Definicin de constantes con nombre:
consttipo nombre =expresin;
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 231
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 232
LuisHernndezYez
LuisHernndezYez
bool
Promocin de tipos
Dos operandos de tipos distintos:
El valor del tipo menor se promociona al tipo mayor
LuisHernndezYez
b=a+3 *2;
long double
Promocin
shortinti=3;
int j=2;
double a=1.5,b;
b=a+i*j;
double
float
long int
int
short int
b=1.5 +6;
Valor 6 int (4 bytes) double (8 bytes)
Fundamentosdelaprogramacin:TiposeinstruccionesII
Conversin segura:
De un tipo menor a un tipo mayor
shortint int longint ...
Pgina 233
long double
double
float
long int
Conversin no segura:
int
De un tipo mayor a un tipo menor
short int
intentero=1234;
char caracter;
caracter =entero;//Conversinnosegura
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 234
LuisHernndezYez
Pgina 235
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 236
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII
typedefdescripcintMiTipo;
typedefdescripcintMoneda;
typedefdescripcintTiposDeCalificacion;
Pgina 237
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 238
LuisHernndezYez
LuisHernndezYez
Identificador
enum {centimo,dos_centimos,cinco_centimos,
diez_centimos,veinte_centimos,
medio_euro,euro }
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 239
Mejoran la legibilidad
typedefdescripcinnombre_de_tipo;
Elegimos un nombre para el tipo: tMoneda
LuisHernndezYez
descripcin
typedefenum {centimo,dos_centimos,cinco_centimos,
diez_centimos,veinte_centimos,
medio_euro,euro }tMoneda;
moneda1
dos_centimos
moneda2
euro
Pgina 240
typedefenum{enero,febrero,marzo,abril,mayo,
junio,julio,agosto,septiembre,octubre,
noviembre,diciembre}tMes;
tMes mes;
LuisHernndezYez
Pgina 241
LuisHernndezYez
typedefenum {enero,febrero,marzo,abril,mayo,junio,julio,
agosto,septiembre,octubre,noviembre,diciembre} tMes;
int op;
cout<<"1 Enero"
<<endl;
cout<<"2 Febrero"
<<endl;
cout<<"3 Marzo"
<<endl;
cout<<"4 Abril"
<<endl;
cout<<"5 Mayo"
<<endl;
cout<<"6 Junio"
<<endl;
cout<<"7 Julio"
<<endl;
cout<<"8 Agosto"
<<endl;
cout<<"9 Septiembre" <<endl;
cout<<"10 Octubre"
<<endl;
cout<<"11 Noviembre" <<endl;
cout<<"12 Diciembre" <<endl;
cout<<"Numerodemes:";
cin>>op;
tMes mes=tMes(op 1);
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 242
typedefenum {enero,febrero,marzo,abril,mayo,junio,julio,
agosto,septiembre,octubre,noviembre,diciembre} tMes;
LuisHernndezYez
if (mes==enero){
cout<<"enero";
}
if (mes==febrero){
cout<<"febrero";
}
if (mes==marzo){
cout<<"marzo";
}
...
if (mes==diciembre){
cout<<"diciembre";
}
Pgina 243
if(dia ==jueves)...
bool noLaborable =(dia >=sabado);
LuisHernndezYez
Pgina 244
#include<iostream>
usingnamespacestd;
typedef enum{enero,febrero,marzo,abril,mayo,
junio,julio,agosto,septiembre,octubre,
noviembre,diciembre }tMes;
typedef enum {lunes,martes,miercoles,jueves,
viernes,sabado,domingo }tDiaSemana;
LuisHernndezYez
Pgina 245
//Mostramoslafecha
cout<<"Hoyes:" <<cadDia(hoy)<<"" <<dia
<<"de" <<cadMes(mes)<<"de"<<anio
<<endl;
LuisHernndezYez
cout<<"Pasadalamedianoche..."<<endl;
dia++;
inti=int(hoy);
i++;
hoy=tDiaSemana(i);
//Mostramoslafecha
cout<<"Hoyes:" <<cadDia(hoy)<<"" <<dia
<<"de" <<cadMes(mes)<<"de"<<anio
<<endl;
return 0;
}
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 246
fechas.cpp
string cadMes(tMes mes){
string cad;
return cad;
}
return cad;
}
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 247
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 248
LuisHernndezYez
LuisHernndezYez
if (mes==enero){
cad ="enero";
}
if (mes==febrero){
cad ="febrero";
}
...
if (mes==diciembre){
cad ="diciembre";
}
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 249
25
2F
04
D6
FF
00
27
6C
CA
49
07
5F
A4
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 250
LuisHernndezYez
Pgina 251
#include<fstream>
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 252
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 253
ifstream
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 254
flujo.close();
archivo.close();
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 255
Operaciones de lectura
LuisHernndezYez
Extractor (>>)
archivo>>variable;
Salta primero los espacios en blanco (espacio, tab, Intro, ...)
Datos numricos: lee hasta el primer carcter no vlido
Cadenas (string): lee hasta el siguiente espacio en blanco
archivo.get(c)
Lee el siguiente carcter en la variable c, sea el que sea
getline(archivo,cadena)
Lee en la cadena todos los caracteres que queden en la lnea
Incluidos los espacios en blanco
Hasta el siguiente salto de lnea (descartndolo)
Con los archivos no tiene efecto la funcin sync()
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 256
LuisHernndezYez
Qu debo leer?
Un nmero
Usa el extractor
archivo>>num;
archivo.get(c);
archivo>>cad;
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 257
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 258
string nif,producto;
int unidades;
double precio;
char aux;
1 ifstream archivo;
2 archivo.open("compras.txt");//Apertura
3 archivo>>nif >>unidades>>precio;
getline(archivo,producto);
3
2
1
Programa
LuisHernndezYez
4 archivo.close();//Cierre
Flujo de entrada
archivo
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 259
archivo>>nif;
archivo>>unidades;
archivo>>precio;
getline(archivo,producto);
getline() no salta espacios
12345678F2123.95ReproductordeDVD
El extractor salta los espacios
LuisHernndezYez
nif 12345678F
producto
ReproductordeDVD
unidades 2
precio 123.95
Espacio
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 260
archivo>>nif;
archivo>>unidades;
archivo>>precio;
archivo.get(aux);//Saltaelespacioenblanco
getline(archivo,producto);
12345678F2123.95ReproductordeDVD
Leemos el espacio
(no hacemos nada con l)
LuisHernndezYez
nif 12345678F
producto ReproductordeDVD
unidades 2
precio 123.95
Sin espacio
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 261
LuisHernndezYez
Pgina 262
LuisHernndezYez
#include<iostream>
#include<string>
usingnamespacestd;
#include<fstream>
#include<iomanip>//Formatodesalida
int main(){
const int IVA=21;
string nif,producto;
int unidades;
double precio,neto,total,iva;
char aux;
ifstream archivo;
int contador=0;
archivo.open("compras.txt");//Apertura
...
Fundamentosdelaprogramacin:TiposeinstruccionesII
LuisHernndezYez
leer.cpp
Pgina 263
if (archivo.is_open()){//Existeelarchivo
archivo>>nif;//PrimerNIF
while (nif !="X"){
archivo>>unidades>>precio;
archivo.get(aux);//Saltaelespacio
getline(archivo,producto);
contador++;
neto=unidades*precio;
iva =neto*IVA/100;
total=neto+iva;
cout<<"Compra" <<contador<<"." <<endl;
cout<<"" <<producto<<":" <<unidades
<<"x" <<fixed <<setprecision(2)
<<precio<<"=" <<neto<<" I.V.A.:"
<<iva <<" Total:" <<total<<endl;
archivo>>nif;//SiguienteNIF
}...
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 264
archivo.close();//Cierre
}
else {
cout<<"ERROR:Nosehapodidoabrirelarchivo"
<<endl;
}
return 0;
LuisHernndezYez
Pgina 265
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 266
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII
ofstream
LuisHernndezYez
Atencin!
Si el archivo ya existe, se borra todo lo que hubiera
Atencin!
Si no se cierra el archivo se puede perder informacin
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 267
int valor=999;
Programa
1 ofstream archivo;
2 archivo.open("output.txt");//Apertura
2
1
Flujo de salida
archivo
LuisHernndezYez
4 archivo.close();//Cierre
Fundamentosdelaprogramacin:TiposeinstruccionesII
o
H
Pgina 268
escribir.cpp
#include<iostream>
#include<string>
usingnamespacestd;
#include<fstream>
int main(){
string nif,producto;
int unidades;
double precio;
char aux;
ofstream archivo;
LuisHernndezYez
archivo.open("output.txt");//Apertura(creacin)
cout<<"NIFdelcliente(Xparaterminar):";
cin>>nif;
...
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 269
Pgina 270
//Escribimoselcentinelafinal...
archivo<<"X";
archivo.close();//Cierredelarchivo
return 0;
LuisHernndezYez
Pgina 271
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 272
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII
Flujo de ejecucin
LuisHernndezYez
double oper1,oper2,prod;
Instruccin1
cout<<"Operando1:";
Instruccin2
cin>>oper1;
Instruccin3
cout<<"Operando2:";
...
cout<<"Producto:" <<prod;
return 0;
InstruccinN
}
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 273
true
InstruccinT
Condicin
false
false
true
InstruccinF
false
true
false
LuisHernndezYez
if
ifelseif
switch
Diagramasdeflujo
Fundamentosdelaprogramacin:TiposeinstruccionesII
true
false
Pgina 274
Inicializacin
No
Iterar?
while
for
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 275
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 276
LuisHernndezYez
LuisHernndezYez
Cdigo
La instruccin if
LuisHernndezYez
if (condicin){
cdigoT
}
[else {
cdigoF
}]
true
BloqueT
Condicin
false
BloqueF
Opcional
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 277
signo.cpp
LuisHernndezYez
int num;
cin>>num;
if (num<0){
cout<<"Negativo";
}
cin>>num;
else{
false
true
cout<<"Positivo";
num<0
}
cout<<"Negativo";
cout<<"Positivo";
cout<<endl;
cout<<endl;
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 278
int num;
cin>>num;
1_29
129
if (num<0){
_
Positivo
_
cout<<"Negativo";
}
else{
cout<<"Positivo";
cin>>num;
false
cout<<endl;
num<0
num
129
?
LuisHernndezYez
cout<<"Positivo";
cout<<endl;
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 279
int num;
cin>>num;
if (num<0){
Negativo
cout<<"Negativo";
}
else{
cout<<"Positivo";
cin>>num;
}
cout<<endl;
true
num<0
num
LuisHernndezYez
cout<<"Negativo";
cout<<endl;
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 280
5
?
divisin.cpp
int main(){
double numerador,denominador,resultado;
cout<<"Numerador:";
cin>>numerador;
cout<<"Denominador:";
cin>>denominador;
if (denominador==0){
cout<<"Imposibledividirentre0!";
}
else{
resultado=numerador/denominador;
cout<<"Resultado:" <<resultado<<endl;
}
return 0;
}
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 281
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 282
LuisHernndezYez
LuisHernndezYez
#include<iostream>
usingnamespacestd;
NO
Monario
&&
Binario
||
Binario
Operadores(prioridad)
...
!
*/%
+
< <=>>=
LuisHernndezYez
==!=
&&
||
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 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,cond2,resultado;
int a=2,b=3,c=4;
resultado=!(a<5);//!(2<5) !true false
LuisHernndezYez
cond1=(a*b+c)>=12;//10>=12 false
cond2=(a*(b+c))>=12;//14>=12 true
resultado=cond1&&cond2;//false&&true false
resultado=cond1||cond2;//false||true true
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 284
condiciones.cpp
int main()
{
int num;
cout<<"Introduceunnmeroentre1y10:";
cin>>num;
if ((num>=1)&&(num<=10)){
cout<<"Nmerodentrodelintervalodevaloresvlidos";
}
else{
cout<<"Nmeronovlido!";
}
Condiciones equivalentes
return 0;
((num >=1)&&(num <=10))
}
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 285
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 286
LuisHernndezYez
LuisHernndezYez
#include<iostream>
usingnamespacestd;
LuisHernndezYez
diasmes.cpp
int mes,anio,dias;
cout<<"Nmerodemes:";
cin>>mes;
cout<<"Ao:";
cin>>anio;
if (mes==2){
if (bisiesto(mes,anio)){
dias =29;
}
else {
dias =28;
}
}
else{
if ((mes==1)||(mes==3)||(mes==5)||(mes==7)
||(mes==8)||(mes==10)||(mes==12)){
dias =31;
}
else{
dias =30;
}
}
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 287
LuisHernndezYez
Pgina 288
if (condicin1){
if (condicin2){...}
else {...}
}
else{
if (condicin3){
if (condicin4){...}
if (condicin5){...}
else {...}
}
else {...
if (x>0){
if (y>0){...}
else {...}
Pgina 289
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 290
LuisHernndezYez
LuisHernndezYez
Condicin simple:
num<0
car=='a'
isalpha(car)
12
LuisHernndezYez
Condicin compuesta:
Combinacin de condiciones simples y operadores lgicos
!isalpha(car)
(num<0)|| (car=='a')
(num<0)&& ((car=='a')||!isalpha(car))
No confundas el operador de igualdad (==)
con el operador de asignacin (=).
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 291
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 292
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 293
true
false
true
false
true
false
true
LuisHernndezYez
false
ifelseif
switch
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 294
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII
Ejemplo:
Calificacin (en letras)
de un estudiante en base
a su nota numrica (010)
Pgina 295
true
==10
cout<<"MH"
false
true
Si nota==10 entonces MH
si no, si nota>=9 entonces SB
si no, si nota>=7 entonces NT
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII
>=9
false
cout<<"SB"
true
>=7
false
cout<<"NT"
true
>=5
cout<<"AP"
false
cout<<"SS"
Pgina 296
LuisHernndezYez
nota.cpp
double nota;
cin>>nota;
if (nota==10){
cout<<"MH";
}
else {
if (nota>=9){
cout<<"SB";
}
else {
if (nota>=7){
cout<<"NT";
}
else {
if (nota>=5){
cout<<"AP";
}
else {
cout<<"SS";
}
}
}
}
double nota;
cin>>nota;
if (nota==10){
cout<<"MH";
}
else if (nota>=9){
cout<<"SB";
}
else if (nota>=7){
cout<<"NT";
}
else if (nota>=5){
cout<<"AP";
}
else{
cout<<"SS";
}
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 297
LuisHernndezYez
double nota;
cin>>nota;
if (nota<5){cout<<"SS";}
else if (nota<7){cout<<"AP";}
else if (nota<9){cout<<"NT";}
else if (nota<10){cout<<"SB";}
else {cout<<"MH";}
No se ejecutan nunca!
double nota;
cin>>nota;
if (nota>=5){cout<<"AP";}
else if (nota>=7){cout<<"NT";}
else if (nota>=9){cout<<"SB";}
else if (nota==10){cout<<"MH";}
else {cout<<"SS";}
Slo muestra AP o SS
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 298
SS
AP
NT
9 SB 10
MH
LuisHernndezYez
if (nota==10){cout<<"MH";}
else if ((nota<10)&&(nota>=9)){cout<<"SB";}
else if ((nota<9)&&(nota>=7)){cout<<"NT";}
else if ((nota<7)&&(nota>=5)){cout<<"AP";}
else if (nota<5){cout<<"SS";}
Siempre true: ramas else
Si no es 10, es menor que 10
if (nota==10){cout<<"MH";}
Si no es >= 9, es menor que 9
else if (nota>=9){cout<<"SB";} Si no es >= 7, es menor que 7
else if (nota>=7){cout<<"NT";}
Pgina 299
LuisHernndezYez
nivel.cpp
#include<iostream>
Sinum==4 entoncesMuyalto
usingnamespacestd;
Sinum==3 entoncesAlto
int main(){
Sinum==2 entoncesMedio
int num;
cout<<"Introduceelnivel:"; Sinum==1 entoncesBajo
cin>>num;
if (num==4){
cout<<"Muyalto" <<endl;
}
elseif (num==3){
cout<<"Alto" <<endl;
}
elseif (num==2){
cout<<"Medio" <<endl;
}
elseif (num==1){
cout<<"Bajo" <<endl;
}
else{
cout<<"Valornovlido" <<endl;
}
return 0;
}
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 300
if (num==4)cout<<"Muyalto";
elseif (num==3)cout<<"Alto";
elseif (num==2)cout<<"Medio";
elseif (num==1)cout<<"Bajo";
elsecout<<"Valornovlido";
cout<<endl;
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 301
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 302
LuisHernndezYez
LuisHernndezYez
if (num==4){cout<<"Muyalto" <<endl;}
elseif (num==3){cout<<"Alto" <<endl;}
elseif (num==2){cout<<"Medio" <<endl;}
elseif (num==1){cout<<"Bajo" <<endl;}
elsecout<<"Valornovlido" <<endl;}
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII
case constanteN:
{
cdigoN
}
[break;]
[default:
{
cdigoDefault
}]
}
Pgina 303
LuisHernndezYez
nivel2.cpp
switch (num){
case 4:
{
cout<<"Muyalto";
}
break;
case 3:
{
cout<<"Alto";
}
break;
case 2:
{
cout<<"Medio";
}
break;
case 1:
{
cout<<"Bajo";
}
break;
default:
{
cout<<"Valornovlido";
}
}
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 304
LuisHernndezYez
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII
switch (num){
...
case 3:
{
cout<<"Alto";
}
case 2:
{
cout<<"Medio";
}
case 1:
{
cout<<"Bajo";
}
default:
{
cout<<"Valornovlido";
}
}
Fundamentosdelaprogramacin:TiposeinstruccionesII
Num:3
Alto
Pgina 305
Num:3
Alto
Medio
Bajo
Valornovlido
Pgina 306
true
num==4
Muyalto
break;
false
Sin break;
true
num==3
Alto
break;
false
Sin break;
true
num==2
Medio
break;
false
Sin break;
true
num==1
LuisHernndezYez
false
Bajo
break;
Sin break;
default
Novlido
Fundamentosdelaprogramacin:TiposeinstruccionesII
int menu(){
int op =1;//Cualquieranovlida
LuisHernndezYez
Pgina 307
1 Nuevocliente
2 Editarcliente
3 Bajacliente
4 Vercliente
0 Salir
Opcin:5
Opcinnovlida!
1 Nuevocliente
2 Editarcliente
3 Bajacliente
4 Vercliente
0 Salir
Opcin:3
Pgina 308
LuisHernndezYez
int opcion;
...
opcion =menu();
switch (opcion){
case 1:
{
cout<<"Enlaopcin1..." <<endl;
}
break;
case 2:
{
cout<<"Enlaopcin2..." <<endl;
}
break;
case 3:
{
cout<<"Enlaopcin3..." <<endl;
}
break;
case 4:
{
cout<<"Enlaopcin4..." <<endl;
}//Enlaltimanonecesitamosbreak
}
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 309
int opcion;
...
opcion =menu();
while (opcion!=0){
switch (opcion){
case 1:
{
cout<<"Enlaopcin1..." <<endl;
}
break;
...
case 4:
{
cout<<"Enlaopcin4..." <<endl;
}
} //switch
...
opcion =menu();
} //while
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 310
LuisHernndezYez
nota2.cpp
int nota;//Sindecimales
cout<<"Nota(010):";
cin>>nota;
switch (nota){
case 0:
case 1:
case 2:
case 3:
case 4:
{
cout<<"Suspenso";
}
break;//De0a4:SS
case 5:
case 6:
{
cout<<"Aprobado";
}
break; //5o6:AP
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII
case
case
{
7:
8:
cout<<"Notable";
}
break;//7u8:NT
case 9:
case 10:
{
cout<<"Sobresaliente";
}
break;//9o10:SB
default:
{
cout<<"Novlida!";
}
}
Pgina 311
typedefenum {enero,febrero,marzo,abril,mayo,junio,
julio,agosto,septiembre,octubre,noviembre,diciembre}
tMes;
tMes mes;
...
switch (mes){
case enero:
{
cout<<"enero";
}
break;
case febrero:
{
cout<<"febrero";
}
break;
...
case diciembre:
{
cout<<"diciembre";
}
}
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 312
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 313
Inicializacin
Iterar?
No
LuisHernndezYez
Cuerpo
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 314
Bucle while
while(condicin)cuerpo
Ejecuta el cuerpo mientras la condicin sea true
Bucle dowhile
Comprueba la condicin al final (lo veremos ms adelante)
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 315
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 316
LuisHernndezYez
LuisHernndezYez
while.cpp
int i=1;//Inicializacindelavariablei
while(i<=100){
cout<<i<<endl;
i++;
}
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 317
int i=1;
while(i<=100){
cout<<i<<endl;
i++;
}
true
Condicin
Cuerpo
i=1
100
101
99
?
3
2
1
4
_
1
true
i<=100
LuisHernndezYez
cout<<i<<endl;
i++
Fundamentosdelaprogramacin:TiposeinstruccionesII
false
2
3
99
100
Pgina 318
false
LuisHernndezYez
int op;
cout<<"Introducelaopcin:";
cin>>op;
while((op <0)||(op >4)){
cout<<"Novlida!Intntalootravez" <<endl;
cout<<"Introducelaopcin:";
cin>>op;
}
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 319
primero.cpp
LuisHernndezYez
while(num*num<=1000){
num++;
}
Empezamosen1
Incrementamosen1
cout<<"1er.enteroconcuadradomayorque1.000:"
<<num<<endl;
return 0;
}
Pgina 320
#include<iostream>
Recorre la secuencia
usingnamespacestd;
de nmeros introducidos
int main(){
double num,suma=0,media=0;
int cont =0;
cout<<"Introduceunnmero(0paraterminar):";
cin>>num;
Leemoselprimero
while(num!=0){//0paraterminar
suma=suma+num;
cont++;
cout<<"Introduceunnmero(0paraterminar):";
cin>>num;
Leemoselsiguiente
}
if (cont >0){
media=suma/cont;
}
cout<<"Suma="<<suma<<endl;
cout<<"Media="<<media<<endl;
return 0;
}
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 321
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 322
LuisHernndezYez
LuisHernndezYez
sumamedia.cpp
LuisHernndezYez
1,2,3,4,5,...,100
for(int i=100;i>=1;i)...
100,99,98,97,...,1
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 323
for(inicializacin;condicin;paso)cuerpo
for(int i=1;i<=100;i++){
cout<<i;
}
i=1
true
i<=100
false
LuisHernndezYez
cout<<i;
i++
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 324
for1.cpp
for(int i=1;i<=100;i++){
cout<<i<<endl;
}
i
100
101
2?3
1
...
1
2
i=1
3
true
i<=100
cout<<i<<endl;
99
100
LuisHernndezYez
i++
false
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 325
La variable contadora
for2.cpp
LuisHernndezYez
Garanta de terminacin
Todo bucle debe terminar su ejecucin
Bucles for: la variable contadora debe converger al valor final
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 326
suma.cpp
#include<iostream>
usingnamespacestd;
longlong int suma(intn);
LuisHernndezYez
int main(){
int num;
cout<<"Nmerofinal:";
cin>>num;
if (num>0){//Elnmerodebeserpositivo
cout<<"Lasumadelosnmerosentre1y"
<<num<<"es:" <<suma(num);
}
return 0;
}
longlong int suma(int n){
longlong int total=0;
for(int i=1;i<=n;i++){
total=total+i;
}
Recorre la secuencia de nmeros
return total;
1, 2, 3, 4, 5, ..., n
}
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 327
LuisHernndezYez
Bucles infinitos
for(int i=1;i<=100;i)...
101234567891011...
Cada vez ms lejos del valor final (100)
Es un error de diseo/programacin
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 328
LuisHernndezYez
int i;
for(i=1;...)
Se conoce en el cuerpo del bucle y despus del mismo
mbito externo al bucle
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 329
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 330
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII
LuisHernndezYez
Pgina 331
i
1
1
1
1
1
2
2
2
2
2
3
j
1
2
3
4
5
1
2
3
4
5
1
...
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 332
tablas.cpp
#include<iostream>
usingnamespacestd;
#include<iomanip>
LuisHernndezYez
int main(){
for(int i=1;i<=10;i++){
for(int j=1;j<=10;j++){
cout<<setw(2)<<i<<"x"
<<setw(2)<<j<<"="
<<setw(3)<<i*j<<endl;
}
}
1x1=1
1x2=2
1x3=3
1x4=4
...
1x10=10
2x1=2
2x2=4
...
10x7=70
10x8=80
10x9=90
10x10=100
return 0;
}
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 333
tablas2.cpp
LuisHernndezYez
#include<iostream>
usingnamespacestd;
#include<iomanip>
int main(){
for(int i=1;i<=10;i++){
cout<<"Tabladel"<<i<<endl;
cout<<""<<endl;
for(int j=1;j<=10;j++){
cout<<setw(2)<<i<<"x"
<<setw(2)<<j<<"="
<<setw(3)<<i*j<<endl;
}
cout<<endl;
}
return 0;
}
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 334
men.cpp
#include<iostream>
usingnamespacestd;
#include<iomanip>
LuisHernndezYez
int menu();//1:Tablasdemultiplicacin;2:Sumatorio
longlong intsuma(int n);//Sumatorio
int main(){
int opcion=menu();
while (opcion!=0){
switch (opcion){
case 1:
{
for(int i=1;i<=10;i++){
for(int j=1;j<=10;j++){
cout<<setw(2)<<i<<"x"
<<setw(2)<<j<<"="
<<setw(3)<<i*j<<endl;
}
}
}
break;...
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 335
case 2:
{
int num=0;
while (num<=0){
cout<<"Hasta(positivo)?";
cin>>num;
}
cout<<"Lasumadelosnmerosdel1al"
<<num<<"es:"<<suma(num)<<endl;
}
}//switch
opcion =menu();
}//while(opcion!=0)
return 0;
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 336
LuisHernndezYez
int menu(){
int op =1;
while ((op <0)||(op >2)){
cout<<"1 Tablasdemultiplicar" <<endl;
cout<<"2 Sumatorio" <<endl;
cout<<"0 Salir" <<endl;
cout<<"Opcin:" <<endl;
cin>>op;
if ((op <0)||(op >2)){
cout<<"Opcinnovlida!"<<endl;
}
}
return op;
}
longlong int suma(int n){
longlong int total=0;
for(int i=1;i<=n;i++){
total=total+i;
}
return total;
}
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 337
while (opcion!=0){
...
for(int i=1;i<=10;i++){
for(int j=1;j<=10;j++){
...
}
}
while (num<=0){
...
suma()
}
for(int i=1;i<=n;i++){
...
}
while ((op <0)||(op >2)){
...
}
menu()
}
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 338
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 339
LuisHernndezYez
Pgina 340
LuisHernndezYez
Un identificador se conoce
en el mbito en el que est declarado
(a partir de su instruccin de declaracin)
y en los submbitos posteriores
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 341
int main(){
mbito de la variable d
double d;
if(...){
int cont=0;
for(int i=0;i<=10;i++){
...
}
}
char c;
if(...){
double x;
...
}
return 0;
}
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 342
LuisHernndezYez
int main(){
double d;
if(...){
mbito de la variable cont
int cont=0;
for(int i=0;i<=10;i++){
...
}
}
char c;
if(...){
double x;
...
}
return 0;
}
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 343
int main(){
double d;
if(...){
int cont=0;
for(int i=0;i<=10;i++){
...
}
mbito de la variable i
}
char c;
if(...){
double x;
...
}
return 0;
}
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 344
LuisHernndezYez
int main(){
double d;
if(...){
int cont=0;
for(int i=0;i<=10;i++){
...
}
}
char c;
if(...){
mbito de la variable c
double x;
...
}
return 0;
}
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 345
int main(){
double d;
if(...){
int cont=0;
for(int i=0;i<=10;i++){
...
}
}
char c;
if(...){
double x;
...
mbito de la variable x
}
return 0;
}
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 346
LuisHernndezYez
Si en un submbito se declara
un identificador con idntico nombre
que uno ya declarado en el mbito,
el del submbito oculta al del mbito
(no es visible)
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 347
int main(){
Oculta , en su mbito, a la i anterior
int i,x;
if(...){
Oculta , en su mbito, a la i anterior
int i=0;
for(int i=0;i<=10;i++){
...
}
}
char c;
if(...){
Oculta , en su mbito, a la x anterior
double x;
...
}
return 0;
}
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 348
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 349
secuencia
secuencia
(Secuencia vaca)
elemento
LuisHernndezYez
134122648718452
Comienza en un primer elemento (si no est vaca)
A cada elemento le sigue otra secuencia (vaca, si es el ltimo)
Acceso secuencial (lineal)
Se comienza siempre accediendo al primer elemento
Desde un elemento slo se puede acceder a su elemento siguiente
(sucesor), si es que existe
Todos los elementos, de un mismo tipo
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 350
Secuencias calculadas:
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 351
LuisHernndezYez
37 23
19 83 63
Fundamentosdelaprogramacin:TiposeinstruccionesII
35 17 76 15 1
Pgina 352
ltimo elemento
12
37 23
19 83 63 1 35 17 76 15
No se procesan
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 353
Recorrido
Un mismo tratamiento para todos los elementos de la secuencia
Ej. Mostrar los elementos de una secuencia, sumar los nmeros
de una secuencia, par o impar cada nmero de una secuencia?, ...
Termina al llegar al final de la secuencia
LuisHernndezYez
Bsqueda
Recorrido de la secuencia hasta encontrar un elemento buscado
Ej. Localizar el primer nmero que sea mayor que 1.000
Termina al localizar el primer elemento que cumple la condicin
o al llegar al final de la secuencia (no encontrado)
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 354
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 355
LuisHernndezYez
Inicializacin
Mientras no se llegue al final de la secuencia:
Obtener el siguiente elemento
Procesar el elemento
Finalizacin
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
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 356
Inicializacin
Al final?
true
false
Obtener elemento
LuisHernndezYez
Procesar elemento
No sabemos cuntos
elementos hay
No podemos
implementar con for
Finalizacin
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 357
Inicializacin
Obtener 1
Centinela?
true
false
Procesar elemento
LuisHernndezYez
Obtener siguiente
Finalizacin
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 358
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 359
longitud.cpp
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 360
LuisHernndezYez
cont.cpp
charbuscado,c;
intcont =0;
cout<<"Carcterabuscar:";
cin>>buscado;
cout<<"Cadena:";
cin>>c;
Primer elemento
while(c!='*'){
Mientras no el centinela
if(c==buscado){
Procesar elemento
cont++;
}
Siguiente elemento
cin>>c;
}
cout<<buscado<<"aparece" <<cont
<<"veces.";
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 361
suma2.cpp
LuisHernndezYez
Centinela: 0
intsumaSecuencia(){
doubled,suma=0;
ifstreamarchivo;//Archivodeentrada(lectura)
archivo.open("datos.txt");
if (archivo.is_open()){
archivo>>d;//Obtenerelprimero
while(d!=0){//Mientrasnoseaelcentinela
suma=suma+d; //Procesareldato
archivo>>d;//Obtenerelsiguiente
}
archivo.close();
}
return suma;
}
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 362
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 363
sumatorio.cpp
Recurrencia:
ei+1 = ei + 1
e1 = 1
12345678...
LuisHernndezYez
Pgina 364
longlong intsuma(intn){
intsumatorio=0;
for(int i=1;i<=n;i++){
sumatorio=sumatorio+i;
}
...
sumatorio=0;
int i=1;
5
?
sumatorio
15
10
01
3
6
false
i<=n
i
2
51
4
3
6
21
1
54321
4321
321
LuisHernndezYez
Secuencia
true
sumatorio+=i;
i=i+1;
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 365
Definicin
Fi = Fi1 + Fi2
F1 = 0
F2 = 1
01123581321345589...
LuisHernndezYez
Fin de la secuencia?
Primer nmero de Fibonacci mayor que un nmero dado
Ese nmero de Fibonacci acta como centinela
Si num es 50, la secuencia ser:
0112358132134
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 366
fibonacci.cpp
LuisHernndezYez
Pgina 367
LuisHernndezYez
num 100
?
fib
5
2
3
1
?
fibMenos1
3
1
2
?
fibMenos2
2
1
0
?
Fundamentosdelaprogramacin:TiposeinstruccionesII
01 1 2 3 5 ...
Pgina 368
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 369
LuisHernndezYez
Inicializacin
Mientras no se encuentre el elemento
y no se est al final de la secuencia:
Obtener el siguiente elemento
Comprobar si el elemento satisface la condicin
Finalizacin
(tratar el elemento encontrado o indicar que no se ha encontrado)
Elemento que se busca: satisfar una condicin
Dos condiciones de terminacin del bucle: se encuentra / al final
Variable lgica que indique si se ha encontrado
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 370
Al final o
encontrado?
true
false
Obtener elemento
LuisHernndezYez
Encontrado?
Finalizacin
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 371
Inicializacin
Obtener 1
Encontrado
o centinela?
false
LuisHernndezYez
Obtener siguiente
Finalizacin
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 372
true
busca.cpp
doubled,num;
boolencontrado=false;
cout<<"Encontrarprimeromayorque:";
cin>>num;
cout<<"Siguiente(1paraterminar):";
cin>>d; //Obtenerelprimerelemento
while((d!=1)&&!encontrado){
//Mientrasnoseaelcentinelaynoseencuentre
if(d>num){ //Encontrado?
encontrado=true;
}
else{
cout<<"Siguiente(1paraterminar):";
cin>>d; //Obtenerelsiguienteelemento
}
}
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 373
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 374
LuisHernndezYez
LuisHernndezYez
Centinela: 1
Colecciones homogneas
Un mismo tipo de dato para varios elementos:
Notas de los estudiantes de una clase
Ventas de cada da de la semana
Temperaturas de cada da del mes
...
En lugar de declarar N variables...
LuisHernndezYez
vLun
125.40
vMar
76.95
vMie
328.80
vJue
254.62
vVie
435.00
vSab
164.29
vDom
0.00
76.95
1
Fundamentosdelaprogramacin:TiposeinstruccionesII
0.00
6
Pgina 375
Estructura secuencial
Cada elemento se encuentra en una posicin (ndice):
Los ndices son enteros positivos
El ndice del primer elemento siempre es 0
Los ndices se incrementan de uno en uno
ventas 125.40
LuisHernndezYez
76.95
1
0.00
Acceso directo
A cada elemento se accede a travs de su ndice:
ventas[4] accede al 5 elemento (contiene el valor 435.00)
cout<<ventas[4];
ventas[4]=442.75;
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 376
LuisHernndezYez
typedef
typedef
typedef
typedef
typedef
double tTemp[7];
shortint tDiasMes[12];
char tVocales[5];
double tVentas[31];
tMoneda tCalderilla[15];//EnumeradotMoneda
Recuerda: Adoptamos el convenio de comenzar
los nombres de tipo con una t minscula, seguida
de una o varias palabras, cada una con su inicial en mayscula
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 377
typedef
typedef
typedef
typedef
tipo nombre;
double tTemp[7];
shortint tDiasMes[12];
char tVocales[5];
double tVentas[31];
Ejemplos:
tempMax ? ? ? ? ? ? ?
tTemp tempMax;
tDiasMes diasMes;
10
11
vocales ? ? ? ? ?
tVocales vocales;
LuisHernndezYez
diasMes ? ? ? ? ? ? ? ? ? ? ? ?
0
tVentas ventasFeb;
ventasFeb ? ? ? ? ? ? ? ? ? ? ? ? ?
0
9 10 11 12
Pgina 378
3
...
?
30
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 379
nombre[ndice]
Cada elemento se accede a travs de su ndice (posicin en el array)
tVocales vocales;
vocales
'a'
'e'
'i'
'o'
'u'
5 elementos, ndices de 0 a 4:
vocales[0]vocales[1]vocales[2]vocales[3]vocales[4]
cout<<vocales[4];
vocales[3]='o';
if(vocales[i]=='e')...
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 380
IMPORTANTE!
No se comprueba si el ndice es correcto!
Es responsabilidad del programador!
const int Dim =100;
typedef double tVentas[Dim];
tVentas ventas;
Pgina 381
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 382
LuisHernndezYez
LuisHernndezYez
ventas[0]ventas[1]ventas[2]...ventas[98]ventas[99]
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII
12.40
10.96
8.43
11.65
13.70
13.41
14.07
tTemp temp;
double media,total=0;
...
for(int i=0;i<Dias;i++){
total=total+temp[i];
}
Memoria
i=0
true
i<Dias
total+=temp[i]
LuisHernndezYez
Pgina 383
false
...
i++
Fundamentosdelaprogramacin:TiposeinstruccionesII
Dias
temp[0]
12.40
temp[1]
10.96
temp[2]
8.43
temp[3]
11.65
temp[4]
13.70
temp[5]
13.41
temp[6]
14.07
media
total
23.36
31.79
84.62
12.40
0.00
43.44
3
2
70
4
1
Pgina 384
mediatemp.cpp
#include<iostream>
usingnamespacestd;
const int Dias =7;
typedef double tTemp[Dias];
LuisHernndezYez
Pgina 385
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 386
constint Cuantas=15;
typedefenum {centimo,dos_centimos,cinco_centimos,
diez_centimos,veinte_centimos,medio_euro,euro }tMoneda;
typedef tMoneda tCalderilla[Cuantas];
tCalderilla bolsillo;//ExactamentellevoCuantasmonedas
bolsillo[0]=euro;
bolsillo[1]=cinco_centimos;
bolsillo[2]=medio_euro;
bolsillo[3]=euro;
bolsillo[4]=centimo;
...
for(int moneda=0;moneda<Cuantas;moneda++)
cout<<aCadena(bolsillo[moneda])<<endl;
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 387
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 388
LuisHernndezYez
LuisHernndezYez
buscaarray.cpp
Pgina 389
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 390
LuisHernndezYez
LuisHernndezYez
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 391
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 392
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 393
LuisHernndezYez
constint Max=100;
typedef doubletArray[Max];
tArray lista;
int contador=0;
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 394
lista.cpp
#include<iostream>
usingnamespacestd;
#include<fstream>
const int Max=100;
typedef double tArray[Max];
LuisHernndezYez
Pgina 395
archivo.close();
med =media(lista,contador);
cout<<"Mediadeloselementosdelalista:"<<med <<endl;
}
else {
cout<<"Nosepudoabrirelarchivo!" <<endl;
}
return 0;
LuisHernndezYez
}
double media(const tArray lista,int cont){
double med,total=0;
for (int ind =0;ind <cont;ind++){
total=total+lista[ind];
}
med =total/cont;
Slo recorremos hasta cont1
return med;
}
Fundamentosdelaprogramacin:TiposeinstruccionesII
Pgina 396
LuisHernndezYez
Pgina 397
Fundamentosdelaprogramacin
3A
Grado en Ingeniera Informtica
Grado en Ingeniera del Software
Grado en Ingeniera de Computadores
Luis Hernndez Yez
Facultad de Informtica
Universidad Complutense
LuisHernndezYez
Expresin condicional
Condicin
Exp1
Dos alternativas
Condicin: Expresin lgica
Exp1 y Exp2: Expresiones
Si Condicin se evala a true,
el resultado es Exp1;
si Condicin se evala a false,
el resultado es Exp2.
int a=5,b=3,c;
< <=>>=
c=(a+b==10)?2 :3;
==!=
c=(8
||
==10)?2 :3;
c=false
?2 :3;
Exp2
Operadores(prioridad)
++ (postfijos)
Llamadas a funciones
Moldes
++ (prefijos) !
(cambio de signo)
*/%
&&
?:
=+==*=/=%=
c=3;
Fundamentosdelaprogramacin:TiposeinstruccionesII(AnexoI)
Pgina 399
Fundamentosdelaprogramacin:TiposeinstruccionesII(AnexoI)
Pgina 400
LuisHernndezYez
Si nota==10 entonces MH
si no, si nota>=9 entonces SB
si no, si nota>=7 entonces NT
si no, si nota>=5 entonces AP
si no SS
double nota;
cin>>nota;
if (nota==10){cout<<"MH";}
else if (nota>=9){cout<<"SB";}
else if (nota>=7){cout<<"NT";}
else if (nota>=5){cout<<"AP";}
else {cout<<"SS";}
true
"MH"
==10
false
true
"SB"
>=9
false
true
"NT"
>=7
false
true
>=5
"AP"
false
Fundamentosdelaprogramacin:TiposeinstruccionesII(AnexoI)
"SS"
Pgina 401
Fundamentosdelaprogramacin
3E
Grado en Ingeniera Informtica
Grado en Ingeniera del Software
Grado en Ingeniera de Computadores
Luis Hernndez Yez
Facultad de Informtica
Universidad Complutense
LuisHernndezYez
Recorridos
Unaparcamiento
Parntesisbienemparejados?
Dossecuenciasiguales?
NmerosprimosmenoresqueN
Bsquedas
Bsquedadeunnmeroenunarchivo
Bsquedasensecuenciasordenadas
Fundamentosdelaprogramacin:TiposeinstruccionesII(AnexoII)
404
405
409
412
413
417
419
420
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII(AnexoII)
Pgina 404
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII(AnexoII)
Pgina 405
LuisHernndezYez
#include<iostream>
usingnamespacestd;
#include<fstream>
int main(){
int coches;
char c;
bool terminar=false;
ifstream archivo;
archivo.open("parking.txt");
if (!archivo.is_open()){
cout<<"Nosehapodidoabrirelarchivo!"<<endl;
}
else {
//Recorrido...
archivo.close();
}
return 0;
}
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII(AnexoII)
Pgina406
while (!terminar){
archivo>>c;
if (c=='.'){//.comoprimercarcter?(centinela)
terminar=true;
}
else {
coches=0;
while (c!='.'){//Recorridodelasecuencia
cout<<c;
if (c=='E'){
coches++;
}
elseif(c=='S'){
coches;
}
archivo>>c;
}
...
Fundamentosdelaprogramacin:TiposeinstruccionesII(AnexoII)
Pgina407
parking.cpp
if (coches>=0){
cout<<endl<<"Quedan" <<coches<<"coches.";
}
else {
cout<<endl<<"Error:Mssalidasqueentradas!";
}
cout<<endl;
}
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII(AnexoII)
Pgina408
LuisHernndezYez
Errores:
Contador 1: parntesis de cierre sin uno de apertura pendiente
abc)de(fgh(ij))#
Pgina 409
LuisHernndezYez
Pgina 410
parentesis.cpp
LuisHernndezYez
if (error){
cout<<"Error:cierresinapertura(pos." <<pos
<<")";
}
elseif(anidamiento>0){
cout<<"Error:Aperturasincierre";
}
else {
cout<<"Correcto";
}
cout<<endl;
Fundamentosdelaprogramacin:TiposeinstruccionesII(AnexoII)
Pgina 411
LuisHernndezYez
iguales.cpp
bool iguales(){
bool sonIguales =true;
double d1,d2;
ifstream sec1,sec2;
bool final=false;
sec1.open("secuencia1.txt");
sec2.open("secuencia2.txt");
sec1>>d1;
sec2>>d2;//Almenosestarnloscentinelas(0)
while (sonIguales &&!final){
sonIguales =(d1==d2);
final=((d1==0)||(d2==0));
if (!final){
sec1>>d1;
sec2>>d2;
}
}
Cambia secuencia2.txt por secuencia3.txt
sec1.close();
y por secuencia4.txt para comprobar otros casos
sec2.close();
return sonIguales;
}
Fundamentosdelaprogramacin:TiposeinstruccionesII(AnexoII)
Pgina 412
primos.cpp
LuisHernndezYez
Pgina 413
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII(AnexoII)
Pgina 414
primos2.cpp
Mejoras: probar slo impares; slo pueden ser divisibles por impares;
no pueden ser divisibles por ninguno mayor que su mitad
LuisHernndezYez
candidato=2;
cout<<candidato<<"";//Mostrarelnmeroprimo2
candidato++;//Seguimosconel3,queesprimo
while (candidato<num){
cout<<candidato<<"";//Mostrarnmeroprimo
candidato=candidato+2;//Sloprobamosimpares
while (!primo(candidato)){//Siguientenmeroprimo
candidato=candidato+2;
}
}...
bool primo(int n){
bool esPrimo =true;
for (int i=3;i<=n/2;i=i+2){
if (n%i==0){
esPrimo =false;//Esdivisiblepori
}
}...
Fundamentosdelaprogramacin:TiposeinstruccionesII(AnexoII)
Pgina 415
primos3.cpp
Pgina 416
Fundamentosdelaprogramacin:TiposeinstruccionesII(AnexoII)
Pgina 417
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII(AnexoII)
#include<iostream>
usingnamespacestd;
#include<fstream>
buscaarch.cpp
LuisHernndezYez
intmain(){
intnum,linea;
cout<<"Valoralocalizar:";
cin>>num;
linea =busca(num);
if(linea !=1){
cout<<"Encontrado(lnea" <<linea <<")" <<endl;
}
else{
cout<<"Noencontrado" <<endl;
}
return 0;
}
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII(AnexoII)
Pgina 418
Centinela
Pgina 419
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII(AnexoII)
Pgina 420
buscaord.cpp
LuisHernndezYez
Pgina 421
15
16
24
41
73
78
82
123
153
159
...
archivo>>i;
num
9
?
false
(i!=0)
&&(i<num)
true
9
5
?
2
LuisHernndezYez
cont++;
archivo>>i;
Fundamentosdelaprogramacin:TiposeinstruccionesII(AnexoII)
Pgina 422
15
16
24
41
73
78
82
123
153
159
archivo>>i;
num
No se procesa
el resto
de la secuencia
10
?
(i!=0)
&&(i<num)
...
5
2
9
?
15
false
true
LuisHernndezYez
cont++;
archivo>>i;
Fundamentosdelaprogramacin:TiposeinstruccionesII(AnexoII)
Pgina 423
LuisHernndezYez
Pgina 424
Fundamentosdelaprogramacin
4
Grado en Ingeniera Informtica
Grado en Ingeniera del Software
Grado en Ingeniera de Computadores
Luis Hernndez Yez
Facultad de Informtica
Universidad Complutense
LuisHernndezYez
Diseodescendente:Tareasysubtareas
Subprogramas
Subprogramasydatos
Parmetros
Argumentos
Resultadodelafuncin
Prototipos
Ejemploscompletos
Funcionesdeoperador
Diseodescendente(unejemplo)
Precondicionesypostcondiciones
Fundamentosdelaprogramacin:Laabstraccinprocedimental
427
434
441
446
451
467
473
475
477
480
490
LuisHernndezYez
Fundamentosdelaprogramacin:Laabstraccinprocedimental
Pgina 427
Refinamientos sucesivos
Tareas que ha de realizar un programa:
Se pueden dividir en subtareas ms sencillas
Subtareas:
Tambin se pueden dividir en otras ms sencillas...
Refinamientos sucesivos
Diseo en sucesivos pasos en los se ampla el detalle
LuisHernndezYez
Ejemplos:
Dibujar
Mostrar la cadena HOLA MAMA en letras gigantes
Fundamentosdelaprogramacin:Laabstraccinprocedimental
Pgina 428
1. Dibujar
2. Dibujar
1. Dibujar
3. Dibujar
2. Dibujar
Misma tarea
2.1. Dibujar
LuisHernndezYez
REFINAMIENTO
2.2. Dibujar
3. Dibujar
Fundamentosdelaprogramacin:Laabstraccinprocedimental
Pgina 429
1. Dibujar
2. Dibujar
2.1. Dibujar
4tareas,perodosdeellassoniguales
LuisHernndezYez
2.2. Dibujar
Nosbastaconsabercmodibujar:
3. Dibujar
Fundamentosdelaprogramacin:Laabstraccinprocedimental
Pgina 430
void dibujarCirculo()
{...}
void dibujarSecantes()
{...}
Dibujar
void dibujarLinea()
{...}
Dibujar
Dibujar
Dibujar
Dibujar
Dibujar
void dibujarTriangulo()
{
dibujarSecantes();
dibujarLinea();
}
LuisHernndezYez
int main(){
dibujarCirculo();
dibujarTriangulo();
dibujarSecantes();
return 0;
}
Fundamentosdelaprogramacin:Laabstraccinprocedimental
Pgina 431
MostrarHOLA
LuisHernndezYez
Espacioenblanco
MostrarMAMA
Tareas bsicas
H
Espacioenblanco
Fundamentosdelaprogramacin:Laabstraccinprocedimental
Pgina 432
void mostrarH(){
cout<<"**"
cout<<"**"
cout<<"*****"
cout<<"**"
cout<<"**"
}
void mostrarL()
{...}
<<endl;
<<endl;
<<endl;
<<endl;
<<endl<<endl;
void espaciosEnBlanco(){
cout<<endl<<endl<<endl;
}
void mostrarM()
{...}
int main(){
mostrarH();
mostrarO();
mostrarL();
mostrarA();
espaciosEnBlanco();
mostrarM();
mostrarA();
mostrarM();
mostrarA();
return0;
void mostrarA()
{...}
Fundamentosdelaprogramacin:Laabstraccinprocedimental
Pgina 433
Fundamentosdelaprogramacin:Laabstraccinprocedimental
Pgina 434
LuisHernndezYez
LuisHernndezYez
void mostrarO(){
cout<<"*****"
cout<<"**"
cout<<"**"
cout<<"**"
cout<<"*****"
}
<<endl;
<<endl;
<<endl;
<<endl;
<<endl<<endl;
Subprogramas
Pequeos programas dentro de otros programas
Unidades de ejecucin independientes
Encapsulan cdigo y datos
Se comunican con otros subprogramas (datos)
LuisHernndezYez
Pgina 435
Flujo de ejecucin
int main()
{
mostrarH();
mostrarO();
...
}
LuisHernndezYez
void mostrarH()
{
...
void mostrarO()
{
...
}
...
Fundamentosdelaprogramacin:Laabstraccinprocedimental
Pgina 436
Subprogramas en C++
Forma general de un subprograma en C++:
tipo nombre(parmetros)//Cabecera
{
//Cuerpo
}
Fundamentosdelaprogramacin:Laabstraccinprocedimental
Pgina 437
Tipos de subprogramas
LuisHernndezYez
Procedimientos (acciones):
NO devuelven ningn resultado de su ejecucin con return
Tipo: void
Llamada: instruccin independiente
mostrarH();
Funciones:
S devuelven un resultado con la instruccin return
Tipo distinto de void
Llamada: dentro de cualquier expresin
x=12*y+cuadrado(20) 3;
Se sustituye en la expresin por el valor que devuelve
Ya venimos utilizando funciones desde el Tema 2!
Fundamentosdelaprogramacin:Laabstraccinprocedimental
Pgina 438
Funciones
Subprogramas de tipo distinto de void
intmain()
{
...
int opcion;
opcion =menu();
...
LuisHernndezYez
...
int menu()
{
int op;
cout<<"1 Editar"<<endl;
cout<<"2 Combinar"<<endl;
cout<<"3 Publicar"<<endl;
cout<<"0 Cancelar"<<endl;
cout<<"Elija:";
cin>>op;
returnop;
}
Fundamentosdelaprogramacin:Laabstraccinprocedimental
Pgina 439
Procedimientos
LuisHernndezYez
intmain()
{
...
menu();
...
Pgina 440
LuisHernndezYez
Fundamentosdelaprogramacin:Laabstraccinprocedimental
Pgina 441
LuisHernndezYez
Fundamentosdelaprogramacin:Laabstraccinprocedimental
Pgina 442
Tema 3
LuisHernndezYez
Pgina 443
#include<iostream>
usingnamespace std;
const int MAX=100;
double ingresos;
LuisHernndezYez
...
void proc(){
int op;
double ingresos;
...
}
int main(){
int op;
...
return 0;
}
Datos globales
op de proc()
es distinta
de op de main()
Fundamentosdelaprogramacin:Laabstraccinprocedimental
Pgina 444
Excepciones:
Constantes globales (valores inalterables)
Tipos globales (necesarios en varios subprogramas)
Fundamentosdelaprogramacin:Laabstraccinprocedimental
Pgina 445
Fundamentosdelaprogramacin:Laabstraccinprocedimental
Pgina 446
LuisHernndezYez
LuisHernndezYez
Subprograma
x
5
Subprograma
x
5
Datos de entrada/salida:
Aceptados y modificados
LuisHernndezYez
cuadrado()
cuadrado()
y (=x2)
Subprograma
cuadrado()
Fundamentosdelaprogramacin:Laabstraccinprocedimental
Pgina 447
Declaracin de parmetros
Slo dos clases de parmetros en C++:
Slo de entrada (por valor)
De salida (slo salida o E/S) (por referencia / por variable)
LuisHernndezYez
&
parmetros
De salida
identificador
tipo
,
Fundamentosdelaprogramacin:Laabstraccinprocedimental
Pgina 448
LuisHernndezYez
Fundamentosdelaprogramacin:Laabstraccinprocedimental
Pgina 449
&
Misma identidad que la variable pasada como argumento
void incrementa(int&x)
void intercambia(double&x,double&y)
void proc(char&c,int&x,double&a,bool&b)
Pgina 450
LuisHernndezYez
Fundamentosdelaprogramacin:Laabstraccinprocedimental
Pgina 451
nombre(argumentos)
LuisHernndezYez
Fundamentosdelaprogramacin:Laabstraccinprocedimental
Pgina 452
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);
LuisHernndezYez
Fundamentosdelaprogramacin:Laabstraccinprocedimental
Pgina 453
Memoria
124
3.0
int main()
...
{
int i=124;
double d=3;
proc(i,33 *d);
LuisHernndezYez
...
...
x
124
99.0
...
return0;
}
Fundamentosdelaprogramacin:Laabstraccinprocedimental
Pgina 454
Memoria
void proc(int&x,double&a)
{...}
124
3.0
int main()
...
{
int i=124;
double d=3;
proc(i,d);
LuisHernndezYez
...
return0;
}
Fundamentosdelaprogramacin:Laabstraccinprocedimental
Pgina 455
proc(i,d);
proc(3*i+12,d);
proc(i,23);
proc(d,i);
proc(3.5,d);
proc(i);
LuisHernndezYez
proc(3,i,d);
Fundamentosdelaprogramacin:Laabstraccinprocedimental
Pgina 456
LuisHernndezYez
...
void divide(int op1,int op2,int&div,int&rem){
//Divideop1entreop2ydevuelveelcocienteyelresto
div =op1/op2;
rem=op1%op2;
}
int main(){
int cociente,resto;
for (int j=1;j<=4;j++){
for (int i=1;i<=4;i++){
divide(i,j,cociente,resto);
cout<<i<<"entre" <<j<<"dauncocientede"
<<cociente<<"yunrestode" <<resto<<endl;
}
}
return 0;
}
Fundamentosdelaprogramacin:Laabstraccinprocedimental
Pgina 457
...
void divide(int op1,int op2,int&div,int&rem){
//Divideop1entreop2ydevuelveelcocienteyelresto
div =op1/op2;
Memoria
rem=op1%op2;
}
cociente
?
LuisHernndezYez
int main(){
int cociente,resto;
for (int j=1;j<=4;j++){
for (int i=1;i<=4;i++){
divide(i,j,cociente,resto);
...
}
}
resto
1
...
return 0;
}
Fundamentosdelaprogramacin:Laabstraccinprocedimental
Pgina 458
...
void divide(int op1,int op2,int&div,int&rem){
//Divideop1entreop2ydevuelveelcocienteyelresto
div =op1/op2;
Memoria
rem=op1%op2;
}
?
div cociente
LuisHernndezYez
int main(){
int cociente,resto;
for (int j=1;j<=4;j++){
for (int i=1;i<=4;i++){
divide(i,j,cociente,resto);
...
}
}
rem
resto
1
...
op1
op2
1
...
return 0;
}
Fundamentosdelaprogramacin:Laabstraccinprocedimental
Pgina 459
...
void divide(int op1,int op2,int&div,int&rem){
//Divideop1entreop2ydevuelveelcocienteyelresto
div =op1/op2;
Memoria
rem=op1%op2;
}
1
div cociente
LuisHernndezYez
int main(){
int cociente,resto;
for (int j=1;j<=4;j++){
for (int i=1;i<=4;i++){
divide(i,j,cociente,resto);
...
}
}
rem
resto
1
...
op1
op2
1
...
return 0;
}
Fundamentosdelaprogramacin:Laabstraccinprocedimental
Pgina 460
...
void divide(int op1,int op2,int&div,int&rem){
//Divideop1entreop2ydevuelveelcocienteyelresto
div =op1/op2;
Memoria
rem=op1%op2;
}
cociente
1
LuisHernndezYez
int main(){
int cociente,resto;
for (int j=1;j<=4;j++){
for (int i=1;i<=4;i++){
divide(i,j,cociente,resto);
...
}
}
resto
1
...
return 0;
}
Fundamentosdelaprogramacin:Laabstraccinprocedimental
Pgina 461
...
void intercambia(double&valor1,double&valor2){
//Intercambialosvalores
double tmp;//Variablelocal(temporal)
tmp=valor1;
Memoriatemporal
valor1=valor2;
delprocedimiento
valor2=tmp;
tmp
?
}
LuisHernndezYez
...
int main(){
double num1,num2;
Memoriademain()
cout<<"Valor1:";
cin>>num1;
valor1 num1
13.6
cout<<"Valor2:";
valor2 num2
317.14
cin>>num2;
...
intercambia(num1,num2);
cout<<"Ahoraelvalor1es" <<num1
<<"yelvalor2es" <<num2<<endl;
return 0;
}
Fundamentosdelaprogramacin:Laabstraccinprocedimental
Pgina 462
LuisHernndezYez
...
//Prototipo
void cambio(double precio,double pago,int&euros,int¢50,
int¢20, int¢10,int¢5,int¢2,int¢1);
int main(){
double precio,pago;
int euros,cent50,cent20,cent10,cent5,cent2,cent1;
cout<<"Precio:";
cin>>precio;
cout<<"Pago:";
cin>>pago;
cambio(precio,pago,euros,cent50,cent20,cent10,cent5,cent2,
cent1);
cout<<"Cambio:" <<euros<<"euros," <<cent50<<"x50c.,"
<<cent20<<"x20c.," <<cent10<<"x10c.,"
<<cent5<<"x5c.," <<cent2<<"x2c.y"
<<cent1<<"x1c." <<endl;
return 0;
}
LuisHernndezYez
Fundamentosdelaprogramacin:Laabstraccinprocedimental
Pgina 463
Pgina 464
LuisHernndezYez
Pgina 465
cambio.cpp
LuisHernndezYez
Pgina 466
LuisHernndezYez
Fundamentosdelaprogramacin:Laabstraccinprocedimental
Pgina 467
int main(){
return x*x;
cout<<2 *cuad(16);
LuisHernndezYez
x=x*x;
}
Esta instruccin
no se ejecutar nunca
return 0;
256
Fundamentosdelaprogramacin:Laabstraccinprocedimental
Pgina 468
factorial.cpp
Factorial(N)=1x2x3x...x(N2)x(N1)xN
longlong int factorial(int n);//Prototipo
LuisHernndezYez
int main(){
intnum;
cout<<"Num:";
cin>>num;
cout<<"Factorialde" <<num<<":" <<factorial(num)<<endl;
return 0;
}
longlong int factorial(int n){
longlong int fact =1;
if (n<0){
fact =0;
}
else{
for (inti=1;i<=n;i++){
fact =fact *i;
}
}
return fact;
}
Fundamentosdelaprogramacin:Laabstraccinprocedimental
Pgina 469
LuisHernndezYez
Fundamentosdelaprogramacin:Laabstraccinprocedimental
Pgina 470
LuisHernndezYez
if (val1==val2){
resultado=0;
}
elseif (val1<val2){
resultado=1;
}
else{
resultado=1;
}
return resultado;
}
Fundamentosdelaprogramacin:Laabstraccinprocedimental
Pgina 471
LuisHernndezYez
Fundamentosdelaprogramacin:Laabstraccinprocedimental
Pgina 472
LuisHernndezYez
Fundamentosdelaprogramacin:Laabstraccinprocedimental
Pgina 473
LuisHernndezYez
Fundamentosdelaprogramacin:Laabstraccinprocedimental
Pgina 474
intercambia.cpp
#include<iostream>
usingnamespace std;
void intercambia(double&valor1,double&valor2);//Prototipo
int main(){
double num1,num2;
Asegrate de que los prototipos
cout<<"Valor1:";
cin>>num1;
coincidan con las implementaciones
cout<<"Valor2:";
cin>>num2;
intercambia(num1,num2);
cout<<"Ahoraelvalor1es" <<num1
<<"yelvalor2es" <<num2<<endl;
return 0;
}
LuisHernndezYez
void intercambia(double&valor1,double&valor2){
double tmp;//Variablelocal(temporal)
tmp=valor1;
valor1=valor2;
valor2=tmp;
}
Fundamentosdelaprogramacin:Laabstraccinprocedimental
Pgina 475
mates.cpp
#include<iostream>
usingnamespace std;
LuisHernndezYez
//Prototipos
longlong int factorial(int n);
int sumatorio(int n);
int main(){
intnum;
cout<<"Num:";
cin>>num;
cout<<"Factorialde"
<<num<<":"
<<factorial(num)
<<endl
<<"Sumatoriode1a"
<<num<<":"
<<sumatorio(num)
<<endl;
return fact;
}
int sumatorio(int n){
int sum =0;
for (inti=1;i<=n;i++){
sum =sum +i;
}
return 0;
}
return sum;
}
Fundamentosdelaprogramacin:Laabstraccinprocedimental
Pgina 476
LuisHernndezYez
Fundamentosdelaprogramacin:Laabstraccinprocedimental
Pgina 477
LuisHernndezYez
tipo operatorsmbolo(parmetros)
Si es un operador monario slo habr un parmetro
Si es binario habr dos parmetros
El smbolo es un smbolo de operador (uno o dos caracteres):
+, , *, /, , <<, %, ...
Fundamentosdelaprogramacin:Laabstraccinprocedimental
Pgina 478
Fundamentosdelaprogramacin:Laabstraccinprocedimental
Pgina 479
Fundamentosdelaprogramacin:Laabstraccinprocedimental
Pgina 480
LuisHernndezYez
LuisHernndezYez
LuisHernndezYez
Pgina 481
LuisHernndezYez
Paso 2.
Desarrollar un programa que muestre al usuario un men con
cuatro operaciones de conversin de medidas:
Pulgadas a centmetros
Libras a gramos
Grados Fahrenheit a centgrados
Galones a litros
Y lea la eleccin del usuario y proceda con la conversin, hasta que
el usuario decida que no quiere hacer ms
6 grandes tareas:
Men, cuatro funciones de conversin y main()
Fundamentosdelaprogramacin:Laabstraccinprocedimental
Pgina 482
Paso 2.
Conversiones
Pulgadasacm.
Librasagr.
FaC
Galonesal.
main()
LuisHernndezYez
Men
LuisHernndezYez
Fundamentosdelaprogramacin:Laabstraccinprocedimental
Pgina 483
Paso 3.
Men:
Mostrar las cuatro opciones ms una para salir
Validar la entrada y devolver la elegida
Pulgadas a centmetros:
Devolver el equivalente en centmetros del valor en pulgadas
Libras a gramos:
Devolver el equivalente en gramos del valor en libras
Grados Fahrenheit a centgrados:
Devolver el equivalente en centgrados del valor en Fahrenheit
Galones a litros:
Devolver el equivalente en litros del valor en galones
Programa principal (main())
Fundamentosdelaprogramacin:Laabstraccinprocedimental
Pgina 484
Salida
Valordevuelto
menu()
int
pulgACm()
double pulg
double
lbAGr()
double libras
double
grFAGrC()
double grF
double
galALtr()
double galones
double
main()
int
LuisHernndezYez
Funcin
Fundamentosdelaprogramacin:Laabstraccinprocedimental
Pgina 485
LuisHernndezYez
#include<iostream>
usingnamespace std;
//Prototipos
int menu();
double pulgACm(double pulg);
double lbAGr(double libras);
double grFAGrC(double grF);
double galALtr(double galones);
int main(){
double valor;
int op =1;
while(op !=0){
op =menu();
switch(op){
case 1:
{
cout<<"Pulgadas:";
cin>>valor;
cout<<"Son" <<pulgACm(valor)<<"cm." <<endl;
}
. . .
break;
Fundamentosdelaprogramacin:Laabstraccinprocedimental
Pgina 486
LuisHernndezYez
case 2:
{
cout<<"Libras:";
cin>>valor;
cout<<"Son" <<lbAGr(valor)<<"gr." <<endl;
}
break;
case 3:
{
cout<<"GradosFahrenheit:";
cin>>valor;
cout<<"Son" <<grFAGrC(valor)<<"C" <<endl;
}
break;
case 4:
{
cout<<"Galones:";
cin>>valor;
cout<<"Son" <<galALtr(valor)<<"l." <<endl;
}
break;
}
}
return 0;
}
Fundamentosdelaprogramacin:Laabstraccinprocedimental
. . .
Pgina 487
int menu(){
int op =1;
while ((op <0)||(op >4)){
cout<<"1 PulgadasaCm."<<endl;
cout<<"2 LibrasaGr."<<endl;
cout<<"3 FahrenheitaC"<<endl;
cout<<"4 GalonesaL."<<endl;
cout<<"0 Salir"<<endl;
cout<<"Elige:";
cin>>op;
if ((op <0)||(op >4)){
cout<<"Opcinnovlida"<<endl;
}
}
returnop;
LuisHernndezYez
}
double pulgACm(double pulg){
const double cmPorPulg =2.54;
return pulg *cmPorPulg;
}
Fundamentosdelaprogramacin:Laabstraccinprocedimental
. . .
Pgina 488
conversiones.cpp
double lbAGr(double libras){
constdouble grPorLb =453.6;
return libras*grPorLb;
}
double grFAGrC(double grF){
return ((grF 32)*5 /9);
}
LuisHernndezYez
. . .
Pgina 489
Fundamentosdelaprogramacin:Laabstraccinprocedimental
Pgina 490
LuisHernndezYez
Fundamentosdelaprogramacin:Laabstraccinprocedimental
LuisHernndezYez
Aserciones:
Condiciones que si no se cumplen interrumpen la ejecucin
Funcin assert()
Fundamentosdelaprogramacin:Laabstraccinprocedimental
Pgina 491
Precondiciones
Por ejemplo, no realizaremos conversiones de valores negativos:
double pulgACm(double pulg){
assert(pulg >0);
double cmPorPulg =2.54;
return pulg *cmPorPulg;
}
LuisHernndezYez
Fundamentosdelaprogramacin:Laabstraccinprocedimental
Pgina 492
Precondiciones
LuisHernndezYez
Pgina 493
Postcondiciones
LuisHernndezYez
Pgina 494
LuisHernndezYez
Pgina 495
Fundamentosdelaprogramacin
4A
Grado en Ingeniera Informtica
Grado en Ingeniera del Software
Grado en Ingeniera de Computadores
Luis Hernndez Yez
Facultad de Informtica
Universidad Complutense
LuisHernndezYez
Archivoscomoparmetros
Lafuncinmain()
Argumentosimplcitos
Sobrecargadesubprogramas
Fundamentosdelaprogramacin:Laabstraccinprocedimental(Anexo)
498
501
504
508
LuisHernndezYez
Fundamentosdelaprogramacin:Laabstraccinprocedimental(Anexo)
Pgina 498
#include<iostream>
usingnamespacestd;
#include<fstream>
LuisHernndezYez
voidsumatorio_archivo(ifstream&arch,double&suma);
int main(){
double resultado;
ifstream archivo;
archivo.open("datos.txt");
if (!archivo.is_open()){
cout<<"ERRORDEAPERTURA" <<endl;
}
else{
sumatorio_archivo(archivo,resultado)
cout<<"Suma=" <<resultado <<endl;
archivo.close();
}
return0;
}
Fundamentosdelaprogramacin:Laabstraccinprocedimental(Anexo)
Pgina 499
void sumatorio_archivo(ifstream&arch,double&suma){
double dato;
suma =0;
arch>>dato;
while (dato !=1){
suma =suma +dato;
arch>>dato;
}
}
LuisHernndezYez
Pgina 500
Fundamentosdelaprogramacin:Laabstraccinprocedimental(Anexo)
Pgina 501
LuisHernndezYez
Fundamentosdelaprogramacin:Laabstraccinprocedimental(Anexo)
LuisHernndezYez
Fundamentosdelaprogramacin:Laabstraccinprocedimental(Anexo)
Pgina 502
LuisHernndezYez
Fundamentosdelaprogramacin:Laabstraccinprocedimental(Anexo)
Pgina 503
LuisHernndezYez
Fundamentosdelaprogramacin:Laabstraccinprocedimental(Anexo)
Pgina 504
Pgina 505
p(3,9,12);//itoma3,jtoma9yktoma12
Los argumentos implcitos se declaran en el prototipo
(preferible) o en la cabecera del subprograma, pero NO en ambos
Fundamentosdelaprogramacin:Laabstraccinprocedimental(Anexo)
Pgina 506
LuisHernndezYez
return 0;
}
double f(double x,double y,int signo,double delta){
return signo*delta*x/y;
}
Fundamentosdelaprogramacin:Laabstraccinprocedimental(Anexo)
Pgina 507
LuisHernndezYez
Fundamentosdelaprogramacin:Laabstraccinprocedimental(Anexo)
Pgina 508
//argumentoint>primerafuncin
abs(2.3) //argumentodouble>segundafuncin
LuisHernndezYez
abs(3L)
//argumentolongint>tercerafuncin
Fundamentosdelaprogramacin:Laabstraccinprocedimental(Anexo)
Pgina 509
inter.cpp
#include<iostream>
usingnamespace std;
void intercambia(int&x,int&y);
void intercambia(double&x,
double&y);
void intercambia(char&x,char&y);
LuisHernndezYez
void intercambia(int&x,int&y){
int tmp;
tmp=x;
x=y;
y=tmp;
}
void intercambia(double&x,
double&y){
double tmp;
tmp=x;
x=y;
y=tmp;
}
void intercambia(char&x,char&y){
char tmp;
tmp=x;
x=y;
y=tmp;
}
int main(){
int i1=3,i2=7;
double d1=12.5,d2=35.9;
char c1='a',c2='b';
cout<<i1<<" " <<i2<<endl;
cout<<d1<<" " <<d2<<endl;
cout<<c1<<" " <<c2<<endl;
intercambia(i1,i2);
intercambia(d1,d2);
intercambia(c1,c2);
cout<<i1<<" " <<i2<<endl;
cout<<d1<<" " <<d2<<endl;
cout<<c1<<" " <<c2<<endl;
return 0;
}
Fundamentosdelaprogramacin:Laabstraccinprocedimental(Anexo)
Pgina 510
LuisHernndezYez
Pgina 511
Fundamentosdelaprogramacin
5
Grado en Ingeniera Informtica
Grado en Ingeniera del Software
Grado en Ingeniera de Computadores
Luis Hernndez Yez/Pablo Moreno Ger
LuisHernndezYez/PabloMorenoGer
Facultad de Informtica
Universidad Complutense
Tiposdedatos
Arraysdenuevo
Arraysybuclesfor
Mssobrearrays
Inicializacindearrays
Enumeradoscomondices
Pasodearraysasubprogramas
Implementacindelistas
Cadenasdecaracteres
Cadenasdecaracteresdetipostring
Entrada/salidaconstring
Operacionesconstring
Estructuras
Estructurasdentrodeestructuras
Arraysdeestructuras
Arraysdentrodeestructuras
Listasdelongitudvariable
Unejemplocompleto
Elbucledo..while
Fundamentosdelaprogramacin:Tiposdedatosestructurados
514
517
520
522
523
524
525
528
531
535
539
541
543
549
550
551
552
558
562
LuisHernndezYez/PabloMorenoGer
Fundamentosdelaprogramacin:Tiposdedatosestructurados
Pgina 514
Clasificacin de tipos
Simples
LuisHernndezYez/PabloMorenoGer
Estructurados
Fundamentosdelaprogramacin:Tiposdedatosestructurados
Pgina 515
Pgina 516
Fundamentosdelaprogramacin:Tiposdedatosestructurados
Pgina 517
LuisHernndezYez/PabloMorenoGer
LuisHernndezYez/PabloMorenoGer
Arrays (tablas)
Estructura secuencial
Cada elemento se encuentra en una posicin (ndice):
Los ndices son enteros positivos
El ndice del primer elemento siempre es 0
Los ndices se incrementan de uno en uno
LuisHernndezYez/PabloMorenoGer
ventas 125.40
0
76.95
1
0.00
[]
Acceso directo
A cada elemento se accede a travs de su ndice:
ventas[4] accede al 5 elemento (contiene el valor 435.00)
cout<<ventas[4];
ventas[4]=442.75;
Fundamentosdelaprogramacin:Tiposdedatosestructurados
Pgina 518
Pgina 519
Procesamiento de arrays
Recorridos
Bsquedas
Ordenacin
etctera...
Fundamentosdelaprogramacin:Tiposdedatosestructurados
Pgina 520
12.40
10.96
8.43
11.65
13.70
13.41
14.07
tVentas ventas;
double media,total=0;
...
for(int i=0;i<Dias;i++){
total=total+ventas[i];
}
Memoria
LuisHernndezYez/PabloMorenoGer
i=0
true
i<Dias
total+=ventas[i]
false
...
i++
Fundamentosdelaprogramacin:Tiposdedatosestructurados
Dias
ventas[0]
12.40
ventas[1]
10.96
ventas[2]
8.43
ventas[3]
11.65
ventas[4]
13.70
ventas[5]
13.41
ventas[6]
14.07
media
total
84.62
23.36
31.79
12.40
0.00
43.44
3
2
70
4
1
Pgina 521
LuisHernndezYez/PabloMorenoGer
Fundamentosdelaprogramacin:Tiposdedatosestructurados
Pgina 522
i[0]i[1]i[2]i[3]i[4]...i[9]
1
5...10
Fundamentosdelaprogramacin:Tiposdedatosestructurados
Pgina 523
LuisHernndezYez/PabloMorenoGer
constintColores=3,
typedefenum{rojo,verde, azul}tRGB;
typedefint tColor[Colores];
tColor color;
...
cout<<"Cantidadderojo(0255):";
cin>>color[rojo];
cout<<"Cantidaddeverde(0255):";
cin>>color[verde];
cout<<"Cantidaddeazul(0255):";
cin>>color[azul];
Recuerda que internamente se asignan enteros a partir de 0
a los distintos smbolos del enumerado
rojo 0 verde 1 azul 2
Fundamentosdelaprogramacin:Tiposdedatosestructurados
Pgina 524
LuisHernndezYez/PabloMorenoGer
Pgina 525
LuisHernndezYez/PabloMorenoGer
Fundamentosdelaprogramacin:Tiposdedatosestructurados
Pgina 526
Un array de constantes
LuisHernndezYez/PabloMorenoGer
Pgina 527
LuisHernndezYez/PabloMorenoGer
Fundamentosdelaprogramacin:Tiposdedatosestructurados
Pgina 528
LuisHernndezYez/PabloMorenoGer
Recorrido de la lista:
for(int i=0;i<NUM;i++){
...
Bsqueda en la lista:
while((i<NUM)&&!encontrado){
...
Fundamentosdelaprogramacin:Tiposdedatosestructurados
Pgina 529
Bsqueda en la lista:
while((i<contador)&&!encontrado){
...
Array y contador por separado? Estructuras
Fundamentosdelaprogramacin:Tiposdedatosestructurados
Pgina 530
Fundamentosdelaprogramacin:Tiposdedatosestructurados
Pgina 531
LuisHernndezYez/PabloMorenoGer
LuisHernndezYez/PabloMorenoGer
Recorrido de la lista:
Arrays de caracteres
Cadenas: secuencias de caracteres de longitud variable
LuisHernndezYez/PabloMorenoGer
"Hola""Adis""Supercalifragilstico""1234567"
10
11
12
13
14
15
16
17
18
19
20
21
21
Longitud actual: 4
Fundamentosdelaprogramacin:Tiposdedatosestructurados
Pgina 532
Longitud de la cadena
A
10
11
12
13
14
15
16
17
18
19
20
LuisHernndezYez/PabloMorenoGer
Longitud: 5
S
10
11
12
13
14
15
16
17
18
19
20
Longitud: 21
Necesidad de saber dnde terminan los caracteres relevantes:
Mantener la longitud de la cadena como dato asociado
Colocar un carcter de terminacin al final (centinela)
A
\0
Fundamentosdelaprogramacin:Tiposdedatosestructurados
10
Pgina 533
21
Cadenas al estilo de C
Anexo del tema
Arrays de tipo char con una longitud mxima
Un ltimo carcter especial al final: '\0'
Tipo string
Cadenas ms sofisticadas
Sin longitud mxima (gestin automtica de la memoria)
Multitud de funciones de utilidad (biblioteca string)
Fundamentosdelaprogramacin:Tiposdedatosestructurados
Pgina 534
Fundamentosdelaprogramacin:Tiposdedatosestructurados
Pgina 535
LuisHernndezYez/PabloMorenoGer
LuisHernndezYez/PabloMorenoGer
El tipo string
El tipo asume la responsabilidad de la gestin de memoria
Define operadores sobrecargados (+ para concatenar)
Cadenas ms eficientes y seguras de usar
LuisHernndezYez/PabloMorenoGer
Biblioteca string
Requiere establecer el espacio de nombres a std
Fundamentosdelaprogramacin:Tiposdedatosestructurados
Pgina 536
string.cpp
LuisHernndezYez/PabloMorenoGer
#include<iostream>
#include<string>
usingnamespacestd;
int main(){
string cad1("Hola");//inicializacin
string cad2="amigo";//inicializacin
string cad3;
cad3=cad1;//copia
cout<<"cad3=" <<cad3<<endl;
cad3=cad1+"";//concatenacin
cad3+=cad2;//concatenacin
cout<<"cad3=" <<cad3<<endl;
cad1.swap(cad2);//intercambio
cout<<"cad1=" <<cad1<<endl;
cout<<"cad2=" <<cad2<<endl;
return 0;
}
Fundamentosdelaprogramacin:Tiposdedatosestructurados
Pgina 537
Longitud de la cadena:
cadena.length() o cadena.size()
LuisHernndezYez/PabloMorenoGer
if(cad1<=cad2){...
Fundamentosdelaprogramacin:Tiposdedatosestructurados
Pgina 538
getline(cin,cadena)
Fundamentosdelaprogramacin:Tiposdedatosestructurados
Pgina 539
string2.cpp
LuisHernndezYez/PabloMorenoGer
#include<iostream>
#include<string>
usingnamespacestd;
int main(){
string nombre,apellidos;
cout<<"Introduzcaunnombre:";
cin>>nombre;
cout<<"Introduzcalosapellidos:";
cin.sync();
getline(cin,apellidos);
cout<<"Nombrecompleto:" <<nombre<<""
<<apellidos<<endl;
return 0;
}
Fundamentosdelaprogramacin:Tiposdedatosestructurados
Pgina 540
cadena.substr(posicin,longitud)
Subcadena de longitud caracteres desde posicin
string cad ="abcdefg";
cout<<cad.substr(2,3);//Muestracde
LuisHernndezYez/PabloMorenoGer
cadena.find(subcadena)
Posicin de la primera ocurrencia de subcadena en cadena
string cad ="Olala";
cout<<cad.find("la");//Muestra1
(Recuerda que los arrays de caracteres comienzan con el ndice 0)
cadena.rfind(subcadena)
Posicin de la ltima ocurrencia de subcadena en cadena
string cad ="Olala";
cout<<cad.rfind("la");//Muestra3
Fundamentosdelaprogramacin:Tiposdedatosestructurados
Pgina 541
cadena.erase(ini,num)
Elimina num caracteres a partir de la posicin ini
string cad ="abcdefgh";
cad.erase(3,4);//cad ahoracontiene"abch"
cadena.insert(ini,cadena2)
Inserta cadena2 a partir de la posicin ini
http://www.cplusplus.com/reference/string/string/
Fundamentosdelaprogramacin:Tiposdedatosestructurados
Pgina 542
Fundamentosdelaprogramacin:Tiposdedatosestructurados
Pgina 543
LuisHernndezYez/PabloMorenoGer
LuisHernndezYez/PabloMorenoGer
LuisHernndezYez/PabloMorenoGer
Fundamentosdelaprogramacin:Tiposdedatosestructurados
Pgina 544
typedefstruct {
...//declaracionesdecampos(comovariables)
}tTipo;//nombredetipo alfinal!
LuisHernndezYez/PabloMorenoGer
typedefstruct {
string nombre;
string apellidos;
int edad;
string nif;
}tPersona;
Campos:
Tipos estndar o previamente declarado
Fundamentosdelaprogramacin:Tiposdedatosestructurados
Pgina 545
tPersona persona;
apellidos
edad
nif
LuisHernndezYez/PabloMorenoGer
persona.apellidos //unacadena(string)
persona.edad
//unentero(int)
persona.nif //unacadena(string)
typedefstruct {
string nombre;
string apellidos;
int edad;
string nif;
}tPersona;
tPersona persona;
Pgina 546
Memoria
persona.nombre
Luis
Antonio
persona.apellidos
Hernndez
Yez
LuisHernndezYez/PabloMorenoGer
persona
nombre LuisAntonio
apellidos HernndezYez
edad
22
persona.edad
22
persona.nif
00223344F
nif 00223344F
Fundamentosdelaprogramacin:Tiposdedatosestructurados
Pgina 547
LuisHernndezYez/PabloMorenoGer
typedefstruct {
string nombre;
string apellidos;
int edad;
string nif;
}tPersona;
tPersona persona;
Fundamentosdelaprogramacin:Tiposdedatosestructurados
typedefstruct {
stringdni;
char letra;
} tNif;
typedefstruct {
...
tNif nif;
}tPersona;
tPersona persona;
tPersona
apellidos
persona.nif //Otraestructura
LuisHernndezYez/PabloMorenoGer
Pgina 548
nombre
edad
tNif
nif
dni
letra
Acceso al DNI:
persona.nif.dni
Fundamentosdelaprogramacin:Tiposdedatosestructurados
Pgina 549
personal
LuisHernndezYez/PabloMorenoGer
tPersona
const intDIM =100;
typedefstruct {
nombre
string nombre;
apellidos
string apellidos;
edad
int edad;
nif
string nif;
}tPersona;
typedeftPersona tArray[DIM];
tArray personal;
nombre
edad
nif
nombre
apellidos
edad
nif
nombre
apellidos
edad
nif
nombre
DIM1
apellidos
edad
nif
personal[11].edad
LuisHernndezYez/PabloMorenoGer
apellidos
const intMAX=100;
lista
typedefstruct {
string nombre;
string apellidos;
int edad;
string nif;
}tPersona;
typedeftPersona tArray[MAX];
typedefstruct {
tArray elementos;
int contador;
}tLista;
tLista lista;
Pgina 550
elementos
0
nombre
apellidos
edad
nif
nombre
apellidos
edad
nif
nombre
apellidos
edad
nif
MAX1
nombre
apellidos
edad
nif
contador
Pgina 551
LuisHernndezYez/PabloMorenoGer
/PabloMorenoGer
Fundamentosdelaprogramacin:Tiposdedatosestructurados
Pgina 552
LuisHernndezYez/PabloMorenoGer
elementos
12.0
2.2
5.4
0.0
36.2
35.0
contador
6
N de elementos (y primer ndice sin elemento)
Pgina 553
LuisHernndezYez/PabloMorenoGer
3
pos
12.0 2.2
0
5.4
0.0
36.2 35.0
4
Pgina 554
LuisHernndezYez/PabloMorenoGer
if(lista.contador<N){
//Abrirhueco
for(int i=lista.contador;i>pos;i){
lista.elementos[i]=lista.elementos[i 1];
}
//Insertareincrementarcontador
lista.elementos[pos]=nuevoElemento;
lista.contador++;
}
42.0
nuevo
3
pos
12.0 2.2
0
5.4
42.0
0.0
36.2 35.0
5
Fundamentosdelaprogramacin:Tiposdedatosestructurados
Pgina 555
5.4
0.0
36.2 35.0
4
LuisHernndezYez/PabloMorenoGer
Fundamentosdelaprogramacin:Tiposdedatosestructurados
Pgina 556
LuisHernndezYez/PabloMorenoGer
12.0 2.2
3
pos
12.0 2.2
3
pos
5.4
0.0
5.4
2
36.2 35.0
4
Fundamentosdelaprogramacin:Tiposdedatosestructurados
Pgina 557
LuisHernndezYez/PabloMorenoGer
Fundamentosdelaprogramacin:Tiposdedatosestructurados
Pgina 558
LuisHernndezYez/PabloMorenoGer
Descripcin
Programa que mantenga una lista de los estudiantes de una clase
De cada estudiante: nombre, apellidos, edad, NIF y nota
Se desconoce el nmero total de estudiantes (mximo 100)
La informacin de la lista se mantiene en un archivo clase.txt
Se carga al empezar y se guarda al finalizar
El programa debe ofrecer estas opciones:
Aadir un nuevo alumno
Eliminar un alumno existente
Calificar a los estudiantes
Listado de notas, identificando la mayor y la media
Fundamentosdelaprogramacin:Tiposdedatosestructurados
Pgina 559
bd.cpp
LuisHernndezYez/PabloMorenoGer
#include<iostream>
#include<string>
usingnamespacestd;
#include<fstream>
#include<iomanip>
const int MAX=100;
typedef struct {
string nombre;
string apellidos;
int edad;
string nif;
double nota;
} tEstudiante;
typedef tEstudiantetArray[MAX];
typedef struct{
tArray elementos;
int contador;
} tLista;
Declaraciones de constantes
y tipos globales
Tras las bibliotecas
LuisHernndezYez/PabloMorenoGer
Fundamentosdelaprogramacin:Tiposdedatosestructurados
Pgina 560
//Prototipos
int menu();//Mendelprograma devuelvelaopcinelegida
void cargar(tLista&lista,bool &ok); //Cargadelarchivo
void guardar(consttLista&lista); //Laguardaenelarchivo
void leerEstudiante(tEstudiante&estudiante);//Leelosdatos
void insertarEstudiante(tLista&lista,tEstudianteestudiante,
bool &ok);//Insertaunnuevoestudianteenlalista
void eliminarEstudiante(tLista&lista,intpos,bool &ok);
//Eliminaelestudianteenesaposicin
string nombreCompleto(tEstudiante estudiante);
void calificar(tLista&lista); //Notasdelosestudiantes
doublemediaClase(consttLista &lista); //Notamedia
intmayorNota(consttLista &lista);
//ndicedelestudianteconmayornota
voidmostrarEstudiante(tEstudiante estudiante);
voidlistado(consttLista &lista,doublemedia,intmayor);
//Listadodelaclase
Los prototipos, despus de los tipos globales
Fundamentosdelaprogramacin:Tiposdedatosestructurados
Pgina 561
LuisHernndezYez/PabloMorenoGer
Fundamentosdelaprogramacin:Tiposdedatosestructurados
Pgina 562
El bucle do..while
do cuerpo while(condicin);
LuisHernndezYez/PabloMorenoGer
do
cuerpo
while
int i=1;
do {
cout<<i<<endl;
i++;
}while(i<=100);
El cuerpo siempre se ejecuta al menos una vez
El cuerpo es un bloque de cdigo
Fundamentosdelaprogramacin:Tiposdedatosestructurados
Pgina 563
int i=1;
do {
cout<<i<<endl;
i++;
}while(i<=100);
Cuerpo
true
Condicin
false
LuisHernndezYez/PabloMorenoGer
i=1;
cout<<i<<endl;
i++;
true
El cuerpo
se ejecuta
al menos
una vez
i<=100
false
Fundamentosdelaprogramacin:Tiposdedatosestructurados
Pgina 564
LuisHernndezYez/PabloMorenoGer
do {
cin>>d;
if(d!=0){//Final?
suma=suma+d;
cont++;
}
}while (d!=0);
cout<<"Opcin:";
cin>>op; //Lecturadel1
while((op <0)||(op >4)){
cout<<"Opcin:";
cin>>op;
}
do {//Mssimple
cout<<"Opcin:";
cin>>op;
}while ((op <0)||(op >4));
Fundamentosdelaprogramacin:Tiposdedatosestructurados
Pgina 565
LuisHernndezYez/PabloMorenoGer
int menu(){
int op;
do {
cout<<"1 Aadirunnuevoestudiante"<<endl;
cout<<"2 Eliminarunestudiante"<<endl;
cout<<"3 Calificaralosestudiantes"<<endl;
cout<<"4 Listadodeestudiantes"<<endl;
cout<<"0 Salir"<<endl;
cout<<"Opcin:";
cin>>op;
}while((op <0)||(op >4));
return op;
}
Fundamentosdelaprogramacin:Tiposdedatosestructurados
Pgina 566
LuisHernndezYez/PabloMorenoGer
El archivo clase.txt
Un dato en cada lnea
Por cada estudiante:
Nombre (cadena)
Apellidos (cadena)
Edad (entero)
NIF (cadena)
Nota (real; 1 si no calificado)
Termina con XXX como nombre
Fundamentosdelaprogramacin:Tiposdedatosestructurados
Pgina 567
LuisHernndezYez/PabloMorenoGer
Fundamentosdelaprogramacin:Tiposdedatosestructurados
Pgina 568
Pgina 569
LuisHernndezYez/PabloMorenoGer
LuisHernndezYez/PabloMorenoGer
Fundamentosdelaprogramacin:Tiposdedatosestructurados
Pgina 570
void leerEstudiante(tEstudiante&estudiante){
cin.sync(); //Descartamoscualquierentradapendiente
cout<<"Nombre:";
getline(cin,estudiante.nombre);
cout<<"Apellidos:";
getline(cin,estudiante.apellidos);
cout<<"Edad:";
cin>>estudiante.edad;
cout<<"NIF:";
cin>>estudiante.nif;
estudiante.nota=1;//Sincalificardemomento
cin.sync(); //Descartamoscualquierentradapendiente
}
Fundamentosdelaprogramacin:Tiposdedatosestructurados
Pgina 571
LuisHernndezYez/PabloMorenoGer
voidinsertarEstudiante(tLista&lista,tEstudianteestudiante,
bool&ok){
ok=true;
if(lista.contador==MAX){
ok=false;
}
else {
lista.elementos[lista.contador]=estudiante;
//Insertamosalfinal
lista.contador++;
}
}
Fundamentosdelaprogramacin:Tiposdedatosestructurados
Pgina 572
LuisHernndezYez/PabloMorenoGer
voideliminarEstudiante(tLista&lista,intpos,bool&ok){
//Esperaelndicedelelementoenpos
if((pos<0)||(pos>lista.contador 1)){
ok=false;//Elementoinexistente
}
else {
ok=true;
for(int i=pos;i<lista.contador 1;i++){
lista.elementos[i]=lista.elementos[i+1];
}
lista.contador;
}
}
Fundamentosdelaprogramacin:Tiposdedatosestructurados
Pgina 573
LuisHernndezYez/PabloMorenoGer
voidcalificar(tLista&lista){
for(int i=0;i<lista.contador;i++){
cout<<"Notadelestudiante"
<<nombreCompleto(lista.elementos[i])<<":";
cin>>lista.elementos[i].nota;
}
}
Fundamentosdelaprogramacin:Tiposdedatosestructurados
Pgina 574
LuisHernndezYez/PabloMorenoGer
Pgina 575
LuisHernndezYez/PabloMorenoGer
Pgina 576
LuisHernndezYez/PabloMorenoGer
int main(){
tLista lista;
tEstudiante estudiante;
bool exito;
int op,pos;
cargar(lista,exito);
if (!exito){
cout<<"Nosehapodidocargarlalista!" <<endl;
}
else {
do {//Elbucledoevitatenerqueleeranteslaprimeraopcin
op =menu();
switch(op){
case1:
{
leerEstudiante(estudiante);
insertarEstudiante(lista,estudiante,exito);
if(!exito){
cout<<"Listallena:imposibleinsertar" <<endl;
}
}
break;
Fundamentosdelaprogramacin:Tiposdedatosestructurados
Pgina 577
LuisHernndezYez/PabloMorenoGer
case2:
{
cout<<"Posicin:";
cin>>pos;
eliminarEstudiante(lista,pos 1,exito);
if(!exito){
cout<<"Elementoinexistente!" <<endl;
}
}
break;
case3:
{
calificar(lista);
}
break;
case4:
{
listado(lista,mediaClase(lista),mayorNota(lista));
}
}
}while(op !=0);
guardar(lista);
}
return 0;
}
Fundamentosdelaprogramacin:Tiposdedatosestructurados
Pgina 578
LuisHernndezYez/PabloMorenoGer
Reconocimiento (Attribution):
En cualquier explotacin de la obra autorizada por la licencia
har falta reconocer la autora.
No comercial (Non commercial):
La explotacin de la obra queda limitada a usos no comerciales.
Compartir igual (Share alike):
La explotacin autorizada incluye la creacin de obras derivadas
siempre que mantengan la misma licencia al ser divulgadas.
Pgina 579
Fundamentosdelaprogramacin
5A
Grado en Ingeniera Informtica
Grado en Ingeniera del Software
Grado en Ingeniera de Computadores
Luis Hernndez Yez/Pablo Moreno Ger
Facultad de Informtica
Universidad Complutense
LuisHernndezYez/PabloMorenoGer
CadenasalestilodeC
E/SconcadenasalestilodeC
Labibliotecacstring
Ejemplo
Fundamentosdelaprogramacin:CadenasalestilodeC(Anexo)
582
583
584
585
LuisHernndezYez/PabloMorenoGer
cadena
\0
10
11
12
13
14
Pgina 582
tCadena cadena;
cin>>cadena;//Seaadeunnuloalfinal
LuisHernndezYez/PabloMorenoGer
cin>>setw(15)>>cadena;
cin.getline(cadena_estilo_C,mx):
Para leer tambin los espacios en blanco y no ms de mx1
cin.getline(cadena,15);//Hasta14caracteres
cout<<cadena<<endl;//Elnulonosemuestra
cin.getline(cad,mx) Cadenas al estilo de C
getline(cin,cad)
Cadenas de tipo string
Fundamentosdelaprogramacin:CadenasalestilodeC(Anexo)
Pgina 583
LuisHernndezYez/PabloMorenoGer
Fundamentosdelaprogramacin:CadenasalestilodeC(Anexo)
Pgina 584
cadenas.cpp
LuisHernndezYez/PabloMorenoGer
#include<iostream>
usingnamespacestd;
#include<cstring>
int main(){
const int MAX=20;
typedef chartCad[MAX];
tCad cadena="MegustaC++";
cout<<cadena<<endl;
cout<<"Cadena:";
cin>>cadena;//Leehastaelprimerespacioenblanco
cout<<cadena<<endl;
cin.sync();//Sincronizarlaentrada
cout<<"Cadena:";
cin.getline(cadena,MAX);
cout<<cadena<<endl;
cout<<"Longitud:" <<strlen(cadena)<<endl;
strcpy(cadena,"Hola");
...
Fundamentosdelaprogramacin:CadenasalestilodeC(Anexo)
Pgina 585
LuisHernndezYez/PabloMorenoGer
tCad cadena2="amigo";
strcat(cadena,cadena2);
cout<<cadena<<endl;
if(strcmp(cadena,cadena2)==0){
cout<<"Iguales";
}
elseif(strcmp(cadena,cadena2)>0){
cout<<cadena<<"esmayorque" <<cadena2;
}
else{
cout<<cadena<<"esmenorque" <<cadena2;
}
cout<<endl;
return 0;
}
Fundamentosdelaprogramacin:CadenasalestilodeC(Anexo)
Pgina 586
LuisHernndezYez/PabloMorenoGer
Reconocimiento (Attribution):
En cualquier explotacin de la obra autorizada por la licencia
har falta reconocer la autora.
No comercial (Non commercial):
La explotacin de la obra queda limitada a usos no comerciales.
Compartir igual (Share alike):
La explotacin autorizada incluye la creacin de obras derivadas
siempre que mantengan la misma licencia al ser divulgadas.
Pgina 587
Fundamentosdelaprogramacin
6
Grado en Ingeniera Informtica
Grado en Ingeniera del Software
Grado en Ingeniera de Computadores
Luis Hernndez Yez / Pablo Moreno Ger
LuisHernndezYez
Facultad de Informtica
Universidad Complutense
Recorridodearrays
Arrayscompletos
Arraysnocompletosconcentinela
Arraysnocompletosconcontador
Ejemplos
Generacindenmerosaleatorios
Bsquedasenarrays
Arrayscompletos
Arraysnocompletosconcentinela
Arraysnocompletosconcontador
Ejemplo
Recorridosybsquedasencadenas
Msejemplosdemanejodearrays
Arraysmultidimensionales
Inicializacindearraysmultidimensionales
Recorridodeunarraybidimensional
RecorridodeunarrayNdimensional
Bsquedaenunarraymultidimensional
Fundamentosdelaprogramacin:Recorridoybsquedaenarrays
590
593
594
595
597
601
604
606
607
608
610
614
617
630
638
641
644
647
LuisHernndezYez
Fundamentosdelaprogramacin:Recorridoybsquedaenarrays
Pgina 590
Esquema de recorrido
Inicializacin
Inicializacin
Al final?
true
false
Obtener elemento
LuisHernndezYez
Procesar elemento
Finalizacin
Fundamentosdelaprogramacin:Recorridoybsquedaenarrays
Pgina 591
LuisHernndezYez
Fundamentosdelaprogramacin:Recorridoybsquedaenarrays
Pgina 592
LuisHernndezYez
ventas
125.40
76.95
219.99
93.45
756.62
double elemento;
for(int i=0;i<N;i++){
elemento=ventas[i];
//Procesarelelemento...
}
Fundamentosdelaprogramacin:Recorridoybsquedaenarrays
Pgina 593
76.95
LuisHernndezYez
int i=0;
double elemento=datos[i];
while(elemento!=1){
//Procesarelelemento...
i++;
elemento=datos[i];
}
1.0
int i=0;
double elemento;
do {
elemento=datos[i];
if(elemento!=1){
//Procesarelelemento...
i++;
}
}while(elemento!=1);
Fundamentosdelaprogramacin:Recorridoybsquedaenarrays
Pgina 594
LuisHernndezYez
elementos
125.40
76.95
328.80
254.62
435.00
164.29
316.05
contador
7
N de elementos (primer ndice sin elemento)
Fundamentosdelaprogramacin:Recorridoybsquedaenarrays
Pgina 595
const intN=10;
typedefdoubletArray[N];
typedefstruct {
tArray elementos;
int contador;
}tLista;
tLista lista;
...
double elemento;
for(int i=0;i<lista.contador;i++){
elemento=lista.elementos[i];
//Procesarelelemento...
}
Fundamentosdelaprogramacin:Recorridoybsquedaenarrays
Pgina 596
Fundamentosdelaprogramacin:Recorridoybsquedaenarrays
Pgina 597
LuisHernndezYez
LuisHernndezYez
fibonacci.cpp
LuisHernndezYez
Fundamentosdelaprogramacin:Recorridoybsquedaenarrays
Pgina 598
LuisHernndezYez
const intNUM=100;
typedef inttNum[NUM];//Exactamente100nmeros
tNum numeros;
const intDIG =5;
typedef inttDig[DIG];//i>nmerosdei+1dgitos
tDig numDig ={0 };
numeros
numDig
123
46237
2345
236
11234
33
999
Fundamentosdelaprogramacin:Recorridoybsquedaenarrays
...
61
99
Pgina 599
LuisHernndezYez
Fundamentosdelaprogramacin:Recorridoybsquedaenarrays
Pgina 600
LuisHernndezYez
Fundamentosdelaprogramacin:Recorridoybsquedaenarrays
Pgina 601
digitos.cpp
LuisHernndezYez
Fundamentosdelaprogramacin:Recorridoybsquedaenarrays
Pgina 602
LuisHernndezYez
Pgina 603
LuisHernndezYez
Fundamentosdelaprogramacin:Recorridoybsquedaenarrays
Pgina 604
Esquema de bsqueda
Inicializacin
Mientras no se encuentre el elemento
y no se est al final de la secuencia:
Inicializacin / encontrado=false;
Al final o
encontrado?
false
Comprobar si el elemento
satisface la condicin
Obtener elemento
LuisHernndezYez
Finalizacin
(tratar el elemento encontrado
o indicar que no se ha encontrado)
Encontrado?
Finalizacin
Fundamentosdelaprogramacin:Recorridoybsquedaenarrays
Pgina 605
true
LuisHernndezYez
const intN=100;
typedef inttArray[N];
tArray lista;
int buscado;
bool encontrado=false;
cout<<"Valorabuscar:";
cin>>buscado;
int pos=0;
while((pos<N)&&!encontrado){
//Mientrasnoselleguealfinalynoencontrado
if(lista[pos]==buscado){
encontrado=true;
}
else{
pos++;
}
}
if(encontrado)//...
Fundamentosdelaprogramacin:Recorridoybsquedaenarrays
Pgina 606
Con centinela
LuisHernndezYez
const intN=10;
typedef inttArray[N];
tArray array;
constint centinela=1;
int buscado;
cout<<"Valorabuscar:";
cin>>buscado;
int pos=0;
bool encontrado=false;
while((array[pos]!=centinela)&&!encontrado){
if(array[pos]==buscado){
encontrado=true;
}
else{
pos++;
}
}
if(encontrado)//...
Fundamentosdelaprogramacin:Recorridoybsquedaenarrays
Pgina 607
LuisHernndezYez
Con contador
const intN=10;
typedefdoubletArray[N];
typedefstruct {
tArray elementos;
int contador;
}tLista;
tLista miLista;
int buscado;
cout<<"Valorabuscar:";
cin>>buscado;
int pos=0;
bool encontrado=false;
while((pos<miLista.contador)
&&!encontrado){
//Mientrasnoalfinalynoencontrado
if(miLista.elementos[pos]==buscado){
encontrado=true;
}
else{
pos++;
}
}
if(encontrado)//...
Fundamentosdelaprogramacin:Recorridoybsquedaenarrays
Pgina 608
LuisHernndezYez
typedefdouble tVentaMes[DIAS][SUCURSALES];
typedefstruct {
tVentaMes ventas;
int dias;
}tMes;
typedeftMes tVentaAnual[MESES];
tVentaAnual anual;
Fundamentosdelaprogramacin:Recorridoybsquedaenarrays
Pgina 609
LuisHernndezYez
Fundamentosdelaprogramacin:Recorridoybsquedaenarrays
#include<iostream>
usingnamespacestd;
#include<fstream>
Pgina 610
umbral.cpp
const intN=100;
typedefdoubletArray[N];
typedefstruct {
tArray elementos;
int contador;
}tLista;
LuisHernndezYez
Pgina 611
LuisHernndezYez
else {
double umbral;
cout<<"Valorumbral:";cin>>umbral;
boolencontrado=false;
int pos=0;
while ((pos<lista.contador)&&!encontrado){
if (lista.elementos[pos]>umbral){
encontrado=true;
}
else {
pos++;
}
}
if (encontrado){
cout<<"Valorenpos."<<pos+1 <<"("
<<lista.elementos[pos]<<")" <<endl;
}
else {
cout<<"Noencontrado!"<<endl;
}
}
return0;
}
LuisHernndezYez
Fundamentosdelaprogramacin:Recorridoybsquedaenarrays
Pgina 612
Pgina 613
LuisHernndezYez
Fundamentosdelaprogramacin:Recorridoybsquedaenarrays
Pgina 614
inversa.cpp
LuisHernndezYez
Pgina 615
busca.cpp
string cadena;
char buscado;
int pos;
bool encontrado;
//...(lecturadecadena)
cout<<"Introduceelcarcterabuscar:";
cin>>buscado;
pos=0;
encontrado=false;
while((pos<cadena.size())&&!encontrado){
if(cadena.at(pos)==buscado){
encontrado=true;
}
else {
pos++;
}
}
if(encontrado)//...
Fundamentosdelaprogramacin:Recorridoybsquedaenarrays
Pgina 616
Fundamentosdelaprogramacin:Recorridoybsquedaenarrays
Pgina 617
LuisHernndezYez
LuisHernndezYez
LuisHernndezYez
Pgina 618
vectores.cpp
void desplazar(tVector v){
int aux=v[N 1];
for (int i=N 1;i>0;i){
v[i]=v[i 1];
}
v[0]=aux;
}
LuisHernndezYez
Fundamentosdelaprogramacin:Recorridoybsquedaenarrays
Pgina 619
LuisHernndezYez
LuisHernndezYez
Fundamentosdelaprogramacin:Recorridoybsquedaenarrays
Pgina 620
Pgina 621
LuisHernndezYez
Fundamentosdelaprogramacin:Recorridoybsquedaenarrays
Pgina 622
LuisHernndezYez
Fundamentosdelaprogramacin:Recorridoybsquedaenarrays
Pgina 623
incluidos.cpp
#include<iostream>
usingnamespacestd;
const int N=3;
const int M=10;
typedef chartVector1[N];
typedefchartVector2[M];
LuisHernndezYez
Pgina 624
LuisHernndezYez
Pgina 625
LuisHernndezYez
Fundamentosdelaprogramacin:Recorridoybsquedaenarrays
Pgina 626
anagramas.cpp
#include<iostream>
#include<string>
usingnamespace std;
int buscaCaracter(string cad,char c);//ndiceo1sinoest
LuisHernndezYez
int main(){
string cad1,cad2;
bool sonAnagramas=true;
int numCar,posEnCad2;
cout<<"Introducelaprimeracadena:";
getline(cin,cad1);
cout<<"Introducelasegundacadena:";
getline(cin,cad2);
if (cad1.length()!=cad2.length()){//Nosonanagramas
sonAnagramas=false;
}
else {
numCar=0;//Contadordecaracteresdelaprimeracadena
while (sonAnagramas&&(numCar<cad1.length())){
posEnCad2=buscaCaracter(cad2,cad1.at(numCar));
Fundamentosdelaprogramacin:Recorridoybsquedaenarrays
Pgina 627
if (posEnCad2==1){//Nosehaencontradoelcaracter
sonAnagramas=false;
}
else {
cad2.erase(posEnCad2,1);
}
numCar++;
}
}
LuisHernndezYez
if (sonAnagramas){
cout<<"Laspalabrasintroducidassonanagramas" <<endl;
}
else {
cout<<"LaspalabrasintroducidasNOsonanagramas" <<endl;
}
return 0;
}
Fundamentosdelaprogramacin:Recorridoybsquedaenarrays
Pgina 628
LuisHernndezYez
while ((pos<lon)&&!encontrado){
if (cad.at(pos)==c){
encontrado=true;
}
else {
pos++;
}
}
if (!encontrado){
pos=1;
}
return pos;
}
Fundamentosdelaprogramacin:Recorridoybsquedaenarrays
Pgina 629
LuisHernndezYez
Fundamentosdelaprogramacin:Recorridoybsquedaenarrays
Pgina 630
LuisHernndezYez
...
...
...
...
...
...
...
...
...
...
48
...
49
...
Fundamentosdelaprogramacin:Recorridoybsquedaenarrays
98
99
...
...
Pgina 631
...
...
...
...
...
LuisHernndezYez
...
...
...
...
...
48
...
49
...
98
99
...
...
Fundamentosdelaprogramacin:Recorridoybsquedaenarrays
Pgina 632
LuisHernndezYez
cout<<matriz[2][9][15][6];
Fundamentosdelaprogramacin:Recorridoybsquedaenarrays
Pgina 633
LuisHernndezYez
Ahora:
temp[i][0] es la temperatura mnima del da i+1
temp[i][1] es la temperatura mxima del da i+1
Fundamentosdelaprogramacin:Recorridoybsquedaenarrays
Pgina 634
temp.cpp
LuisHernndezYez
int main(){
constint MaxDias =31;
const int MED =2;//Ndemedidas
typedef doubletTemp[MaxDias][MED];//Daxmn./mx.
tTemp temp;
double tMaxMedia =0,tMinMedia =0,
tMaxAbs =100,tMinAbs =100;
int dia =0;
double max,min;
ifstream archivo;
archivo.open("temp.txt");
if(!archivo.is_open()){
cout<<"Nosehapodidoabrirelarchivo!"<<endl;
}
else {
archivo>>min>>max;
//Elarchivoterminacon9999
...
Fundamentosdelaprogramacin:Recorridoybsquedaenarrays
Pgina 635
LuisHernndezYez
while(!((min==99)&&(max ==99))
&&(dia <MaxDias)){
temp[dia][0]=min;
temp[dia][1]=max;
dia++;
archivo>>min>>max;
}
archivo.close();
for(int i=0;i<dia;i++){
tMinMedia =tMinMedia +temp[i][0];
if(temp[i][0]<tMinAbs){
tMinAbs =temp[i][0];
}
tMaxMedia =tMaxMedia +temp[i][1];
if(temp[i][1]>tMaxAbs){
tMaxAbs =temp[i][1];
}
}
...
Fundamentosdelaprogramacin:Recorridoybsquedaenarrays
Pgina 636
Fundamentosdelaprogramacin:Recorridoybsquedaenarrays
Pgina 637
LuisHernndezYez
Para cada valor del primer ndice: todos los valores del segundo
Fundamentosdelaprogramacin:Recorridoybsquedaenarrays
Pgina 638
LuisHernndezYez
Memoria
cuads[0][0]
cuads[0][1]
cuads[1][0]
cuads[1][1]
16
cuads[2][0]
25
cuads[2][1]
cuads[3][0]
cuads[3][1]
16
cuads[4][0]
cuads[4][1]
25
int cuads[5][2]={0 };
Fundamentosdelaprogramacin:Recorridoybsquedaenarrays
Pgina 639
typedefdouble tMatriz[3][4][2][3];
tMatriz matriz=
{1,2,3,4,5,6,
LuisHernndezYez
7,8,9,10,11,12};
Memoria
matriz[0][0][0][0]
matriz[0][0][0][1]
matriz[0][0][0][2]
matriz[0][0][1][0]
matriz[0][0][1][1]
matriz[0][0][1][2]
matriz[0][1][0][0]
matriz[0][1][0][1]
matriz[0][1][0][2]
matriz[0][1][1][0]
10
matriz[0][1][1][1]
11
matriz[0][1][1][2]
12
matriz[0][2][0][0]
...
Fundamentosdelaprogramacin:Recorridoybsquedaenarrays
Pgina 640
const intFILAS=10;
const intCOLUMNAS=5;
typedefdouble tMatriz[FILAS][COLUMNAS];
tMatriz matriz;
LuisHernndezYez
Fundamentosdelaprogramacin:Recorridoybsquedaenarrays
Pgina 641
LuisHernndezYez
constint Meses=12;
constint MaxDias =31;
typedef doubletVentas[Meses][MaxDias];
tVentas ventas;//Ventasdetodoelao
typedef shortinttDiasMes[Meses];
tDiasMes diasMes;
inicializa(diasMes);//Ndedasdecadames
//Pedimoslasventasdecadadadelao...
for(int mes=0;mes<Meses;mes++){
for(int dia =0;dia <diasMes[mes];dia++){
cout<<"Ventasdelda"<<dia +1
<<"delmes"<<mes+1 <<":";
cin>>ventas[mes][dia];
}
}
Fundamentosdelaprogramacin:Recorridoybsquedaenarrays
Pgina 642
LuisHernndezYez
Meses
...
28
29
30
201
125
234
112
156
...
234
543
667
323
231
675
325
111
...
523
417
327
333
324
...
444
367
437
145
845
654
212
562
...
354
548
327
652
555
222
777
...
428
999
854
438
824
547
175
...
321
356
654
543
353
777
437
...
765
678
555
327
541
164
563
327
...
538
159
235
333
327
432
249
777
...
528
529
524
583
333
100
334
...
743
468
10
217
427
585
218
843
...
777
555
11
222
666
512
400
259
...
438
637
Fundamentosdelaprogramacin:Recorridoybsquedaenarrays
666
Celdas no
utilizadas
531
879
Pgina 643
const
const
const
const
intDIM1=10;
intDIM2=5;
intDIM3=25;
intDIM4=50;
typedefdouble tMatriz[DIM1][DIM2][DIM3][DIM4];
tMatriz matriz;
LuisHernndezYez
Pgina 644
LuisHernndezYez
const intDIAS=31;
const intSUCURSALES=4;
typedefdouble tVentaMes[DIAS][SUCURSALES];
typedefstruct {
anual tVentaAnual
tVentaMes ventas;
anual[i] tMes
int dias;
anual[i].dias int
}tMes;
anual[i].ventas tVentaMes
anual[i].ventas[j][k] double
const intMESES=12;
typedeftMes tVentaAnual[MESES];
tVentaAnual anual;
Fundamentosdelaprogramacin:Recorridoybsquedaenarrays
Pgina 645
LuisHernndezYez
const intMESES=12;
typedeftMes tVentaAnual[MESES];
tVentaAnual anual;
double total=0;
for (int mes=0;mes<MESES;mes++){
for (int dia =0;dia <anual[mes].dias;dia++){
for (int suc =0;suc <SUCURSALES;suc++){
total=total+anual[mes].ventas[dia][suc];
}
}
}
Fundamentosdelaprogramacin:Recorridoybsquedaenarrays
LuisHernndezYez
Pgina 646
Pgina 647
LuisHernndezYez
Pgina 648
Fundamentosdelaprogramacin
7
Grado en Ingeniera Informtica
Grado en Ingeniera del Software
Grado en Ingeniera de Computadores
Luis Hernndez Yez
Facultad de Informtica
Universidad Complutense
LuisHernndezYez
Algoritmosdeordenacin
Algoritmodeordenacinporinsercin
Ordenacindearraysporinsercin
Algoritmodeordenacinporinsercin
conintercambios
Clavesdeordenacin
Estabilidaddelaordenacin
Complejidadyeficiencia
Ordenacionesnaturales
Ordenacinporseleccindirecta
Mtododelaburbuja
Listasordenadas
Bsquedasenlistasordenadas
Bsquedabinaria
Fundamentosdelaprogramacin:Algoritmosdeordenacin
651
654
665
672
680
688
692
694
701
716
722
729
731
LuisHernndezYez
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 651
Ordenacin de listas
array
125.40
76.95
328.80
254.62
435.00
164.29
316.05
219.99
93.45
756.62
Algoritmo de ordenacin
(de menor a mayor)
array
76.95
0
LuisHernndezYez
array[i]<=array[i+1]
Pgina 652
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 653
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 654
LuisHernndezYez
LuisHernndezYez
Ordenacin de listas
LuisHernndezYez
6
1
3
8
2
9
4
7
5
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 655
LuisHernndezYez
6
1
3
8
2
9
4
7
5
Lista ordenada:
5
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 656
6
1
3
8
2
9
4
7
Lista ordenada:
LuisHernndezYez
5 7
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 657
6
1
3
8
2
9
4
LuisHernndezYez
Lista ordenada:
5 5
4
7 7
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 658
6
1
3
8
2
9
Lista ordenada:
LuisHernndezYez
4 5 7 9
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 659
6
1
3
8
2
LuisHernndezYez
Lista ordenada:
4 4
2
5 5
7 7
9 9
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 660
6
1
3
8
Lista ordenada:
LuisHernndezYez
2 4 5 7 8
4
9 9
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 661
6
1
3
LuisHernndezYez
Lista ordenada:
2 3
4
4 4
5 5
7 7
8 8
9 9
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 662
6
1
Lista ordenada:
LuisHernndezYez
2 2
1
3 3
4 4
5 5
7 7
8 8
9 9
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 663
LuisHernndezYez
Lista ordenada:
1 2 3 4 5 6
7 7
8 8
9 9
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 664
14
32
14
27
12
13
15
LuisHernndezYez
14
20
32
14
27
12
13
15
Parte ya ordenada
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 665
14
32
14
27
12
13
15
LuisHernndezYez
20
14
32
14
27
12
13
15
nuevo 7
Pgina 666
14
32
14
27
12
13
15
LuisHernndezYez
nuevo 7
7
20
14
32
14
27
12
13
15
nuevo 7
Fundamentosdelaprogramacin:Algoritmosdeordenacin
LuisHernndezYez
Implementacin
Pgina 667
constintN=15;
typedefinttLista[N];
tLista lista;
...
int nuevo,pos;
//Desdeelsegundoelementohastaelltimo...
for(int i=1;i<N;i++){
nuevo=lista[i];
pos=0;
while((pos<i)&&!(lista[pos]>nuevo)){
pos++;
}
//pos:ndicedelprimermayor;isinolohay
for(int j=i;j>pos;j){
lista[j]=lista[j 1];
}
lista[pos]=nuevo;
}
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 668
20
14
32
14
27
12
13
15
LuisHernndezYez
i 1
pos 0
nuevo 7
20
14
32
14
27
12
13
15
20
20
14
32
14
27
12
13
15
20
14
32
14
27
12
13
15
7
0
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 669
14
20
32
14
27
12
13
15
LuisHernndezYez
i 4
pos 0
nuevo 5
14
20
32
14
27
12
13
15
14
20
32
14
27
12
13
15
14
20
32
14
27
12
13
15
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 670
14
20
32
14
27
12
13
15
i 5
pos 3
nuevo 14
14
20
32
14
27
12
13
15
14
20
20
32
27
12
13
15
14
32
27
12
13
15
14 20
3
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 671
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 672
LuisHernndezYez
LuisHernndezYez
LuisHernndezYez
14
20
32
14
27
12
13
15
14
20
14
32
27
12
13
15
14
32
27
12
13
15
14 20
3
LuisHernndezYez
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 673
14
20
32
14
27
12
13
15
14
20
32
14
27
12
13
15
14
20
32
14
27
12
13
15
14
20
32
14
27
12
13
15
14
20
32
14
27
12
13
15
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 674
LuisHernndezYez
constintN=15;
typedefinttLista[N];
tLista lista;
...
int tmp,pos;
//Desdeelsegundoelementohastaelltimo...
for(int i=1;i<N;i++){
pos=i;
//Mientrasnoalprincipioyanteriormayor...
while((pos>0)&&(lista[pos 1]>lista[pos])){
//Intercambiar...
tmp=lista[pos];
lista[pos]=lista[pos 1];
lista[pos 1]=tmp;
pos;//Posicinanterior
}
}
Fundamentosdelaprogramacin:Algoritmosdeordenacin
#include<iostream>
usingnamespacestd;
#include<fstream>
Pgina 675
insercion.cpp
LuisHernndezYez
Pgina 676
LuisHernndezYez
archivo.open("insercion.txt");
if (!archivo.is_open()){
cout<<"Errordeaperturadearchivo!" <<endl;
}
else {
archivo>>dato;
while ((lista.contador <N)&&(dato!=1)){
//Centinela1alfinal
lista.elementos[lista.contador]=dato;
lista.contador++;
archivo>>dato;
}
archivo.close();
//SihaymsdeNignoramoselresto
cout<<"Antesdeordenar:"<<endl;
for (int i=0;i<lista.contador;i++){
cout<<lista.elementos[i]<<"";
}
cout<<endl;...
LuisHernndezYez
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 677
Pgina 678
Consideracin de implementacin
14
20
32
14
27
12
13
15
14
20
14
32
27
12
13
15
14
14
20
32
27
12
13
15
Intercambio intil!
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 679
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 680
LuisHernndezYez
LuisHernndezYez
Claves de ordenacin
Elementos que son estructuras con varios campos:
LuisHernndezYez
constintN=15;
typedefstruct {
intcodigo;
stringnombre;
doublesueldo;
} tDato;
typedeftDatotLista[N];
tListalista;
Clave de ordenacin:
Campo en el que se basan las comparaciones
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 681
Claves de ordenacin
tDato tmp;
while ((pos>0)
&&(lista[pos 1].nombre>lista[pos].nombre)){
tmp=lista[pos];
lista[pos]=lista[pos 1];
lista[pos 1]=tmp;
pos;
}
LuisHernndezYez
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 682
Claves de ordenacin
Funcin para la comparacin:
LuisHernndezYez
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 683
claves.cpp
LuisHernndezYez
Claves de ordenacin
#include<iostream>
#include<string>
usingnamespacestd;
#include<fstream>
#include<iomanip>
constint N=15;
typedef struct {
int codigo;
string nombre;
double sueldo;
}tDato;
typedef tDatotArray[N];
typedef struct {
tArray datos;
int cont;
}tLista;
...
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 684
LuisHernndezYez
void mostrar(tListalista);
bool operator>(tDato opIzq,tDato opDer);
int main(){
tListalista;
ifstreamarchivo;
lista.cont =0;
archivo.open("datos.txt");
if(!archivo.is_open()){
cout<<"Errordeaperturadelarchivo!" <<endl;
}
else {
tDato dato;
archivo>>dato.codigo;
while ((lista.cont <N)&&(dato.codigo !=1)){
archivo>>dato.nombre >>dato.sueldo;
lista.datos[lista.cont]=dato;
lista.cont++;
archivo>>dato.codigo;
}
archivo.close();...
LuisHernndezYez
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 685
cout<<"Antesdeordenar:"<<endl;
mostrar(lista);
for (int i=1;i<lista.cont;i++){
//Desdeelsegundoelementohastaelltimo
int pos=i;
while ((pos>0)
&&(lista.datos[pos1]>lista.datos[pos])){
tDatotmp;
tmp=lista.datos[pos];
lista.datos[pos]=lista.datos[pos 1];
lista.datos[pos 1]=tmp;
pos;
}
}
cout<<"Despusdeordenar:"<<endl;
mostrar(lista);
}
return 0;
}
...
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 686
Pgina 687
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 688
LuisHernndezYez
LuisHernndezYez
LuisHernndezYez
11111Durn120000
22222Fernndez120000
12345Gmez100000
10000Hernndez150000
21112Jimnez100000
11111Prez90000
12345Snchez90000
10000Sergei100000
33333Tarazona120000
12345Turgano100000
11111Urpiano90000
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 689
LuisHernndezYez
10000Sergei100000
10000Hernndez150000
11111Urpiano
90000
11111Bentez
100000
11111Prez
90000
11111Durn
120000
12345Snchez90000
12345lvarez120000
12345Turgano100000
12345Gmez100000
21112Domnguez90000
21112Jimnez100000
22222Fernndez120000
33333Tarazona120000
No estable:
Los nombres no mantienen
sus posiciones relativas
Fundamentosdelaprogramacin:Algoritmosdeordenacin
10000Hernndez150000
10000Sergei100000
11111Bentez
100000
11111Durn
120000
11111Prez
90000
11111Urpiano
90000
12345lvarez120000
12345Gmez100000
12345Snchez90000
12345Turgano100000
21112Domnguez90000
21112Jimnez100000
22222Fernndez120000
33333Tarazona120000
Estable:
Los nombres mantienen
sus posiciones relativas
Pgina 690
10000Hernndez150000
10000Sergei100000
11111Bentez100000
11111Durn120000
11111Prez90000
11111Urpiano90000
12345lvarez120000
12345Gmez100000
12345Snchez90000
12345Turgano100000
21112Domnguez90000
21112Jimnez100000
22222Fernndez120000
33333Tarazona120000
11111Prez90000
11111Urpiano90000
12345Snchez90000
21112Domnguez90000
10000
Sergei100000
11111
Bentez100000
12345
Gmez
100000
12345
Turgano
100000
21112
Jimnez100000
11111Durn120000
12345lvarez120000
22222Fernndez120000
33333Tarazona120000
10000Hernndez150000
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 691
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 692
LuisHernndezYez
LuisHernndezYez
Estable siempre que utilicemos < o > Con <= o >= no es estable
Ordenamos por sueldo:
A igual sueldo, ordenado por cdigos y a igual cdigo, por nombres
12
13
14
14
15
20
27
32
27
20
15
14
14
13
12
LuisHernndezYez
20
14
12
32
27
14
15
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 693
Ordenaciones naturales
Si el algoritmo trabaja menos cuanto ms ordenada est
inicialmente la lista, se dice que la ordenacin es natural
Ordenacin por insercin con la lista inicialmente ordenada:
Versin que busca el lugar primero y luego desplaza:
No hay desplazamientos; mismo nmero de comparaciones
Comportamiento no natural
LuisHernndezYez
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 694
LuisHernndezYez
Pgina 695
Clculo de la complejidad
LuisHernndezYez
Intercambios y comparaciones:
Tantos como ciclos realicen los correspondientes bucles
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 696
LuisHernndezYez
Clculo de la complejidad
N 1 ciclos
...
for(int i=1;i<N;i++){
N variable de ciclos
int pos=i;
while((pos>0)&&(lista[pos 1]>lista[pos])){
int tmp;
tmp=lista[pos];
lista[pos]=lista[pos 1];
lista[pos 1]=tmp;
pos;
}
}
Pgina 697
LuisHernndezYez
Clculo de la complejidad
Caso mejor: lista inicialmente ordenada
La primera comparacin falla: ningn intercambio
(N 1) * (1 comparacin + 0 intercambios) = N 1 O(N)
Caso peor: lista inicialmente ordenada al revs
Para cada pos, entre i y 1: 1 comparacin y 1 intercambio
1 + 2 + 3 + 4 + ... + (N 1)
((N 1) + 1) x (N 1) / 2
N * (N 1) / 2
(N2 N) / 2 O(N2)
Notacin O grande: orden de complejidad en base a N
El trmino en N que ms rpidamente crece al crecer N
En el caso peor, N2 crece ms rpido que N O(N2)
(Ignoramos las constantes, como 2)
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 698
LuisHernndezYez
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 699
rdenes de complejidad
LuisHernndezYez
O(log N) < O(N) < O(N log N) < O(N2) < O(N3) ...
Nlog2 NN2
101
214
4216
8364
164256
3251024
6464096
128716384
256865536
...
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 700
LuisHernndezYez
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 701
LuisHernndezYez
Lista desordenada:
5 7 4 9 2 8 3 1 6
Lista ordenada:
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 702
LuisHernndezYez
Lista desordenada:
5 7 4 9 2 8 3
Lista ordenada:
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 703
LuisHernndezYez
Lista desordenada:
5 7 4 9
Lista ordenada:
1 2
Fundamentosdelaprogramacin:Algoritmosdeordenacin
8 3
Pgina 704
LuisHernndezYez
Lista desordenada:
5 7 4 9
Lista ordenada:
1 2 3
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 705
LuisHernndezYez
Lista desordenada:
5 7
Lista ordenada:
1 2 3 4
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 706
LuisHernndezYez
Lista desordenada:
Lista ordenada:
1 2 3 4 5
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 707
LuisHernndezYez
Lista desordenada:
Lista ordenada:
1 2 3 4 5 6
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 708
LuisHernndezYez
Lista desordenada:
Lista ordenada:
1 2 3 4 5 6 7
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 709
LuisHernndezYez
Lista desordenada:
Lista ordenada:
9
1 2 3 4 5 6 7 8
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 710
Lista desordenada:
LuisHernndezYez
1 2 3 4 5 6 7 8 9
Lista ordenada:
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 711
20
14
32
14
27
12
13
15
LuisHernndezYez
im
14
32
20
14
27
12
13
15
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 712
14
32
20
14
27
12
13
15
LuisHernndezYez
12
32
20
14
27
14
13
15
12
13
20
14
27
14
32
15
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 713
seleccion.cpp
LuisHernndezYez
Implementacin
constintN=15;
typedefinttLista[N];
tLista lista;
//Desdeelprimerelementohastaelpenltimo...
for(int i=0;i<N 1;i++){
int menor=i;
//Desdei+1hastaelfinal...
for(int j=i+1;j<N;j++){
if (lista[j]<lista[menor]){
menor=j;
}
}
if (menor>i){
int tmp;
tmp=lista[i];
lista[i]=lista[menor];
lista[menor]=tmp;
}
}
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 714
Pgina 715
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 716
LuisHernndezYez
LuisHernndezYez
LuisHernndezYez
LuisHernndezYez
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 717
12
32
14
14
12
32
14
14
12
32
14
14
12
32
14
14
12
32
14
14
12
32
14
14
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 718
burbuja.cpp
LuisHernndezYez
Pgina 719
LuisHernndezYez
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)
14141412
16161214
35121616
12353535
50505050
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 720
bool inter=true;
int i=0;
//Desdeel1hastaelpenltimosihayintercambios...
while((i<N 1)&&inter){
inter=false;
//Desdeelltimohastaelsiguienteai...
for(int j=N 1;j>i;j){
if (lista[j]<lista[j 1]){
int tmp;
tmp=lista[j];
lista[j]=lista[j 1];
lista[j 1]=tmp;
inter=true;
}
}
if (inter){
i++;
}
}
Esta variacin s tiene un comportamiento natural
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 721
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 722
LuisHernndezYez
LuisHernndezYez
burbuja2.cpp
LuisHernndezYez
Casi todas las tareas se realizan igual que en listas sin orden
Operaciones que tengan en cuenta el orden:
Insercin de un nuevo elemento: debe seguir en orden
Bsquedas ms eficientes
Y la carga desde archivo?
Si los elementos se guardaron en orden: se lee igual
Si los elementos no estn ordenados en el archivo: insertar
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 723
lista.cpp
LuisHernndezYez
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 724
LuisHernndezYez
voidguardar(tLista lista);
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 725
Nuevas implementaciones:
Operadores relacionales
Insercin (mantener el orden)
Bsqueda (ms eficiente)
Se guarda la lista en orden, por lo que cargar() no cambia
booloperator>(tRegistro opIzq,tRegistro opDer){
return opIzq.nombre >opDer.nombre;
}
LuisHernndezYez
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 726
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 727
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 728
LuisHernndezYez
LuisHernndezYez
LuisHernndezYez
12
13
14
14
15
20
27
32
LuisHernndezYez
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 729
int buscado;
constintN=10;
cout<<"Valorabuscar:";
typedefinttLista[N];
cin>>buscado;
tLista lista;
int i=0;
while((i<N)&&(lista[i]<buscado)){
i++;
}
//Ahora,oestamosalfinalolista[i]>=buscado
if(i==N){//Alfinal:nosehaencontrado
cout<<"Noencontrado!" <<endl;
}
elseif (lista[i]==buscado){//Encontrado!
cout<<"Encontradoenposicin" <<i+1 <<endl;
}
else { //Hemosencontradounomayor
cout<<"Noencontrado!" <<endl;
}
Complejidad: O(N)
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 730
LuisHernndezYez
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 731
LuisHernndezYez
Buscamos el 12
5
12
14
14
15
18
20
27
32
12
14
14
15
18
20
27
32
12
14
14
15
18
20
27
32
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 732
mitad
fin
12
14
14
15
18
20
27
32
LuisHernndezYez
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 733
Buscamos el 12
ini
mitad
fin
12
14
14
15
18
20
27
32
12 <lista[mitad] fin=mitad 1
ini mitad
fin
12
14
14
15
18
20
27
32
LuisHernndezYez
12 >lista[mitad] ini=mitad+1
ini
fin
12
14
14
15
18
20
27
32
mitad
Encontrado!
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 734
mitad
ini fin
12
14
14
15
18
20
27
32
13 >lista[mitad] ini=mitad+1
LuisHernndezYez
mitad
ini
fin
5
12
14
14
15
18
20
27
32
13 <lista[mitad] fin=mitad 1 2
ini>fin !!! No hay dnde seguir buscando No est
Fundamentosdelaprogramacin:Algoritmosdeordenacin
LuisHernndezYez
Implementacin
Pgina 735
constintN=10;
typedefinttLista[N];
tLista lista;
int buscado;
cout<<"Valorabuscar:";
cin>>buscado;
int ini=0,fin=N 1,mitad;
bool encontrado=false;
while((ini<=fin)&&!encontrado){
mitad=(ini+fin)/2;//Divisinentera
if(buscado==lista[mitad]){
encontrado=true;
}
elseif(buscado<lista[mitad]){
fin=mitad 1;
}
else{
ini=mitad+1;
}
}//Sisehaencontrado,esten[mitad]
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 736
#include<iostream>
usingnamespacestd;
#include<fstream>
binaria.cpp
constint N=100;
typedef int tArray[N];
typedef struct {
tArray elementos;
int cont;
}tLista;
LuisHernndezYez
LuisHernndezYez
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 737
Pgina 738
LuisHernndezYez
Pgina 739
LuisHernndezYez
Complejidad
Qu orden de complejidad tiene la bsqueda binaria?
Caso peor:
No est o se encuentra en una sublista de 1 elemento
N de comparaciones = N de mitades que podemos hacer
N / 2, N / 4, N / 8, N / 16, ..., 8, 4, 2, 1
1, 2, 4, 8, ..., N / 16, N / 8, N / 4, N / 2
Si hacemos que N sea igual a 2k:
20, 21, 22, 23, ..., 2k4, 2k3, 2k2, 2k1
N de elementos de esa serie: k
N de comparaciones = k N = 2k k = log2 N
Complejidad: O(log2 N)
Mucho ms rpida que O(N)
Fundamentosdelaprogramacin:Algoritmosdeordenacin
Pgina 740
LuisHernndezYez
Pgina 741
Fundamentosdelaprogramacin
7A
Grado en Ingeniera Informtica
Grado en Ingeniera del Software
Grado en Ingeniera de Computadores
Luis Hernndez Yez
Facultad de Informtica
Universidad Complutense
LuisHernndezYez
Ordenacinporintercambio
Mezcladedoslistasordenadas
Fundamentosdelaprogramacin:Algoritmosdeordenacin(Anexo)
744
747
LuisHernndezYez
Fundamentosdelaprogramacin:Algoritmosdeordenacin(Anexo)
Pgina 744
LuisHernndezYez
12
32
20
14
27
13
15
14
12
32
20
14
27
13
15
14
12
32
20
14
27
13
15
Fundamentosdelaprogramacin:Algoritmosdeordenacin(Anexo)
Pgina 745
intercambio.cpp
Pgina 746
Fundamentosdelaprogramacin:Algoritmosdeordenacin(Anexo)
Pgina 747
LuisHernndezYez
LuisHernndezYez
constintN=10;
typedefinttLista[N];
tLista lista;
...
for(int i=0;i<N 1;i++){
//Desdeelprimerelementohastaelpenltimo
for(int j=i+1;j<N;j++){
//Desdei+1hastaelfinal
if (lista[j]<lista[i]){
int tmp;
tmp=lista[i];
lista[i]=lista[j];
lista[j]=tmp;
}
}
Fundamentosdelaprogramacin:Algoritmosdeordenacin(Anexo)
Pgina 748
LuisHernndezYez
Fundamentosdelaprogramacin:Algoritmosdeordenacin(Anexo)
Pgina 749
mezcla1.cpp
LuisHernndezYez
//Puedenquedardatosenalgunadelaslistas
if (pos1<lista1.cont){
while ((pos1<lista1.cont)&&(listaM.cont <N)){
listaM.elementos[listaM.cont]=lista1.elementos[pos1];
pos1++;
listaM.cont++;
}
}
else {//pos2<lista2.cont
while ((pos2<lista2.cont)&&(listaM.cont <N)){
listaM.elementos[listaM.cont]=lista2.elementos[pos2];
pos2++;
listaM.cont++;
}
}
}
Fundamentosdelaprogramacin:Algoritmosdeordenacin(Anexo)
Pgina 750
LuisHernndezYez
Fundamentosdelaprogramacin:Algoritmosdeordenacin(Anexo)
Pgina 751
LuisHernndezYez
if (dato1<dato2){
mezcla<<dato1<<endl;
archivo1>>dato1;
}else{
mezcla<<dato2<<endl;
archivo2>>dato2;
}
}//Unodelosdosarchivossehaacabado
if (dato1!=1){//Quedanenelprimerarchivo
while (dato1!=1){
mezcla<<dato1<<endl;
archivo1>>dato1;
}
}
else {//Quedanenelsegundoarchivo
while (dato2!=1){
mezcla<<dato2<<endl;
archivo2>>dato2;
}
}
...
Fundamentosdelaprogramacin:Algoritmosdeordenacin(Anexo)
Pgina 752
mezcla2.cpp
archivo2.close();
archivo1.close();
mezcla<<1 <<endl;
mezcla.close();
LuisHernndezYez
Fundamentosdelaprogramacin:Algoritmosdeordenacin(Anexo)
Pgina 753
LuisHernndezYez
Pgina 754
Fundamentosdelaprogramacin
8
Grado en Ingeniera Informtica
Grado en Ingeniera del Software
Grado en Ingeniera de Computadores
Luis Hernndez Yez
LuisHernndezYez
Facultad de Informtica
Universidad Complutense
Programasmultiarchivoycompilacinseparada
Interfazfrenteaimplementacin
Usodemdulosdebiblioteca
Ejemplo:GestindeunalistaordenadaI
Compilacindeprogramasmultiarchivo
Elpreprocesador
Cadacosaensumdulo
Ejemplo:GestindeunalistaordenadaII
Elproblemadelasinclusionesmltiples
Compilacincondicional
Proteccinfrenteainclusionesmltiples
Ejemplo:GestindeunalistaordenadaIII
Implementacionesalternativas
Espaciosdenombres
Implementacionesalternativas
Calidadyreutilizacindelsoftware
Fundamentosdelaprogramacin:Programacinmodular
757
762
768
770
778
780
782
784
789
794
795
796
804
808
817
827
LuisHernndezYez
Fundamentosdelaprogramacin:Programacinmodular
Pgina 757
Programas multiarchivo
Cdigo fuente repartido entre varios archivos (mdulos)
Cada mdulo con sus declaraciones y sus subprogramas
Mdulo: Unidad funcional (estructura de datos, utilidades, ...)
Principal
Lista
constintN=10;
typedefdoubletArray[N];
typedefstruct{
tArray elem;
intcont;
}tArray;
voidinit(tArray &lista);
voidinsert(tArray &lista,
doubleelem,bool&ok);
voidremove(tArray &lista,
intpos,bool&ok);
...
Clculos
intmain(){
tArray lista;
boolok;
init(lista);
cargar(lista,"bd.txt");
sort(lista);
doubledato;
cout<<"Dato:";
cin>>dato;
insert(lista,dato,ok);
cout<<min(lista)<<endl;
cout<<max(lista)<<endl;
cout<<sum(lista)<<endl;
guardar(lista,"bd.txt");
doublemean(tArray lista);
Archivos
boolcargar(tArray &lista,
stringnombre);
doublemin(tArray lists);
doublemax(tArray lista);
doubledesv(tArray lista);
boolguardar(tArray lista,
stringnombre);
boolmezclar(stringarch1,
stringarch2);
intminIndex(tArray lista);
intsize(stringnombre);
intmaxIndex(tArray lista);
boolexportar(stringnombre);
doublesum(tArray lista);
return0;
LuisHernndezYez
Ejecutable
Fundamentosdelaprogramacin:Programacinmodular
Pgina 758
Compilacin separada
Cada mdulo se compila a cdigo objeto de forma independiente
Lista
lista.obj
constintN=10;
typedefdoubletArray[N];
typedefstruct{
tArray elem;
intcont;
}tArray;
voidinit(tArray &lista);
voidinsert(tArray &lista,
doubleelem,bool&ok);
voidremove(tArray &lista,
intpos,bool&ok);
...
Clculos
00101110101011001010010010101
00101010010101011111010101000
10100101010101010010101010101
01100101010101010101010101001
01010101010100000101010101101
01001010101010101000010101011
11001010101010111100110010101
01101010101010010010101001111
00101010101001010100101010010
10100101010100101000010011110
10010101011001010101001010100
10101010101010010101001010101
01000010101011100101010010100
01110101011101001101010100101
01011111110101011001101010111
00001001010100101010101010110
calculos.obj
Archivos
archivos.obj
boolcargar(tArray &lista,
stringnombre);
boolguardar(tArray lista,
stringnombre);
boolmezclar(stringarch1,
stringarch2);
intsize(stringnombre);
boolexportar(stringnombre);
doublemean(tArray lista);
doublemin(tArray lists);
LuisHernndezYez
doublemax(tArray lista);
doubledesv(tArray lista);
intminIndex(tArray lista);
intmaxIndex(tArray lista);
doublesum(tArray lista);
01011001010010010101001010100
10101011111010101000101001010
10101010010101010101011001010
10101010101010101001010101010
10100000101010101101010010101
01010101000010101011110010101
01010111100110010101011010101
01010010010101001111001010101
01001010100101010010101001010
10100101000010011110100101010
11001010101001010100101010101
01010010101001010101010000101
01011100101010010100011101010
11101001101010100101010111111
10101011001101010111000010010
10100101010101010110001111010
Fundamentosdelaprogramacin:Programacinmodular
11101010110010100100101010010
10100101010111110101010001010
01010101010100101010101010110
01010101010101010101010010101
01010101000001010101011010100
10101010101010000101010111100
10101010101111001100101010110
10101010100100101010011110010
10101010010101001010100101010
01010101001010000100111101001
01010110010101010010101001010
10101010100101010010101010100
00101010111001010100101000111
01010111010011010101001010101
11111101010110011010101110000
10010101001010101010101101111
Pgina 759
Compilacin separada
Al compilar el programa principal, se adjuntan los mdulos compilados
Principal
Mdulos del programa
intmain(){
tArray lista;
boolok;
init(lista);
cargar(lista,"bd.txt");
sort(lista);
doubledato;
cout<<"Dato:";
cin>>dato;
insert(lista,dato,ok);
cout<<min(lista)<<endl;
cout<<max(lista)<<endl;
cout<<sum(lista)<<endl;
guardar(lista,"bd.txt");
lista.obj
calculos.obj
LuisHernndezYez
archivos.obj
...
return0;
}
Ejecutable
Fundamentosdelaprogramacin:Programacinmodular
Pgina 760
...
Compilacin separada
Slo los archivos fuente modificados necesitan ser recompilados!
Principal
lista.cpp
main.cpp
COMPILACIN
lista.obj
archivos.obj
...
iostream.obj
fstream.obj
main.obj
math.obj
...
ENLACE
Ejecutable
Fundamentosdelaprogramacin:Programacinmodular
Pgina 761
Fundamentosdelaprogramacin:Programacinmodular
Pgina 762
LuisHernndezYez
LuisHernndezYez
calculos.obj
LuisHernndezYez
Pgina 763
LuisHernndezYez
Fundamentosdelaprogramacin:Programacinmodular
Pgina 764
LuisHernndezYez
voidremove(tArray &lista,
intpos,bool&ok);
...
lista.cpp
Mdulo
Unidad
Biblioteca
#include"lista.h"
voidinit(tArray &lista){
lista.cont =0;
}
voidinsert(tArray &lista,
doubleelem,bool&ok){
if(lista.cont ==N){
okfalse;
}
else{
...
Fundamentosdelaprogramacin:Programacinmodular
Pgina 765
lista.h
constintN=10;
typedefdoubletArray[N];
typedefstruct{
tArray elem;
intcont;
}tArray;
Interfaz
Archivo de cabecera (.h): todo lo que necesita
conocer otro mdulo (o programa principal)
que quiera utilizar sus servicios (subprogramas)
La directiva #include aade las declaraciones del archivo
de cabecera en el cdigo del mdulo (preprocesamiento):
voidinit(tArray &lista);
voidinsert(tArray &lista,
doubleelem,bool&ok);
voidremove(tArray &lista,
intpos,bool&ok);
...
main.cpp
LuisHernndezYez
#include"lista.h"
...
Preprocesador
main.cpp
constintN=10;
typedefdoubletArray[N];
typedefstruct{
tArray elem;
intcont;
}tArray;
voidinit(tArray &lista);
voidinsert(tArray &lista,doubleelem,
bool&ok);
voidremove(tArray &lista,intpos,
bool&ok);
...
Pgina 766
lista.cpp
Implementacin
Compilar el mdulo significa compilar
su archivo de implementacin (.cpp)
Tambin necesita conocer sus propias declaraciones:
#include"lista.h"
voidinit(tArray &lista){
lista.cont =0;
}
voidinsert(tArray &lista,
doubleelem,bool&ok){
if(lista.cont ==N){
okfalse;
}
else{
...
lista.cpp
lista.obj
00101110101011001010010010101
00101010010101011111010101000
10100101010101010010101010101
01100101010101010101010101001
01010101010100000101010101101
01001010101010101000010101011
11001010101010111100110010101
01101010101010010010101001111
00101010101001010100101010010
10100101010100101000010011110
10010101011001010101001010100
10101010101010010101001010101
01000010101011100101010010100
01110101011101001101010100101
01011111110101011001101010111
00001001010100101010101010110
Pgina 767
Fundamentosdelaprogramacin:Programacinmodular
Pgina 768
LuisHernndezYez
LuisHernndezYez
#include"lista.h"
...
LuisHernndezYez
Pgina 769
Archivodecabecera
lista.h
LuisHernndezYez
#include<string>
usingnamespacestd;
const int N=100;
typedef struct {
int codigo;
string nombre;
double sueldo;
}tRegistro;
typedef tRegistro tArray[N];
typedef struct {
tArray registros;
int cont;
}tLista;
const string BD="bd.txt";
...
Documenta bien el cdigo!
Fundamentosdelaprogramacin:Programacinmodular
Pgina 770
LuisHernndezYez
voidguardar(tLista lista);
Fundamentosdelaprogramacin:Programacinmodular
Pgina 771
Implementacin
lista.cpp
LuisHernndezYez
#include <iostream>
#include <string>
usingnamespacestd;
#include <fstream>
#include <iomanip>
#include "lista.h"
tRegistro nuevo(){
tRegistro registro;
cout<<"Introduceelcdigo:";
cin>>registro.codigo;
cout<<"Introduceelnombre:";
cin>>registro.nombre;
cout<<"Introduceelsueldo:";
cin>>registro.sueldo;
return registro;
}...
Fundamentosdelaprogramacin:Programacinmodular
Pgina772
LuisHernndezYez
Pgina773
LuisHernndezYez
voideliminar(tLista&lista,intpos,bool &ok){//pos=1..
ok=true;
if ((pos<1)||(pos>lista.cont)){
ok=false;//Posicininexistente
}
else {
pos;//Pasamosandicedelarray
for (inti=pos+1;i<lista.cont;i++){
//Desplazamosalaizquierda
lista.registros[i 1]=lista.registros[i];
}
lista.cont;
}
}
...
Fundamentosdelaprogramacin:Programacinmodular
Pgina774
Programaprincipal
bd.cpp
LuisHernndezYez
intmenu();
int main(){
tLista lista;
bool ok;
int op,pos;
cargar(lista,ok);
if (!ok){
cout<<"Nosehapodidoabrirelarchivo!"<<endl;
}
else {
do {
mostrar(lista);
op =menu();...
LuisHernndezYez
Fundamentosdelaprogramacin:Programacinmodular
Pgina775
if (op ==1){
tRegistro registro=nuevo();
insertar(lista,registro,ok);
if (!ok){
cout<<"Error:Listallena!"<<endl;
}
}
elseif(op ==2){
cout<<"Posicin:";
cin>>pos;
eliminar(lista,pos,ok);
if (!ok){
cout<<"Error:Posicion inexistente!"<<endl;
}
}
elseif(op ==3){
stringnombre;
cin.sync();
cout<<"Nombre:";
cin>>nombre;
intpos=buscar(lista,nombre);
...
Fundamentosdelaprogramacin:Programacinmodular
Pgina776
if (pos==1){
cout<<"Nosehaencontrado!" <<endl;
}
else {
cout<<"Encontradoenlaposicin" <<pos<<endl;
}
}
}while (op !=0);
guardar(lista);
}
return 0;
int menu(){
cout<<endl;
cout<<"1 Insertar"<<endl;
cout<<"2 Eliminar" <<endl;
cout<<"3 Buscar" <<endl;
cout<<"0 Salir" <<endl;
int op;
do {
...
Fundamentosdelaprogramacin:Programacinmodular
Pgina777
Fundamentosdelaprogramacin:Programacinmodular
Pgina 778
LuisHernndezYez
LuisHernndezYez
G++
Archivos de cabecera e implementacin en la misma carpeta
Listamos todos los .cpp en la orden g++:
D:\FP\Tema08>g++obd.exelista.cppbd.cpp
Recuerda que slo se compilan los .cpp
Visual C++/Studio
Pgina 779
Fundamentosdelaprogramacin:Programacinmodular
Pgina 780
LuisHernndezYez
LuisHernndezYez
Directivas: #...
Antes de compilar se pone en marcha el preprocesador
Interpreta las directivas y genera un nico archivo temporal con
todo el cdigo del mdulo o programa
Como en la inclusin (directiva #include):
#include<string>
usingnamespacestd;
intmenu();
#include<string>
usingnamespacestd;
...
constintN=100;
typedefstruct{
intcodigo;
stringnombre;
doublesueldo;
}tRegistro;
typedefstruct{
intcodigo;
stringnombre;
doublesueldo;
}tRegistro;
typedeftRegistro
tArray[N];
typedeftRegistro
tArray[N];
typedefstruct{
tArray registros;
intcont;
}tLista;
...
typedefstruct{
tArray registros;
intcont;
}tLista;
...
intmenu();
...
Fundamentosdelaprogramacin:Programacinmodular
Pgina 781
Fundamentosdelaprogramacin:Programacinmodular
Pgina 782
LuisHernndezYez
LuisHernndezYez
constintN=100;
#include"lista.h"
LuisHernndezYez
Lista de registros:
Estructura tRegistro
Estructura tLista
(contiene tRegistro)
Cada estructura, en su mdulo
Fundamentosdelaprogramacin:Programacinmodular
Pgina 783
Cabecera
registro.h
LuisHernndezYez
typedef struct {
int codigo;
string nombre;
double sueldo;
}tRegistro;
tRegistro nuevo();
booloperator>(tRegistro opIzq,tRegistro opDer);
booloperator<(tRegistro opIzq,tRegistro opDer);
void mostrar(int pos,tRegistro registro);
Fundamentosdelaprogramacin:Programacinmodular
Pgina 784
Implementacin
registro.cpp
LuisHernndezYez
#include <iostream>
#include <string>
usingnamespacestd;
#include <iomanip>
#include "registro.h"
tRegistro nuevo(){
tRegistro registro;
cout<<"Introduceelcdigo:";
cin>>registro.codigo;
cout<<"Introduceelnombre:";
cin>>registro.nombre;
cout<<"Introduceelsueldo:";
cin>>registro.sueldo;
return registro;
}
booloperator>(tRegistro opIzq,tRegistro opDer){
returnopIzq.nombre >opDer.nombre;
}...
Fundamentosdelaprogramacin:Programacinmodular
Pgina 785
Cabecera
lista2.h
LuisHernndezYez
Fundamentosdelaprogramacin:Programacinmodular
Pgina 786
Implementacin
lista2.cpp
LuisHernndezYez
#include <iostream>
usingnamespacestd;
#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 enlaposicin i
for (intj=lista.cont;j>i;j){//Desplazar aladerecha
lista.registros[j]=lista.registros[j 1];
}
...
Fundamentosdelaprogramacin:Programacinmodular
Pgina 787
bd2.cpp
LuisHernndezYez
int main(){
tLista lista;
bool ok;
int op,pos;
cargar(lista,ok);
if (!ok){
cout<<"Nosepudoabrirelarchivo!"<<endl;
}
else {
do {
mostrar(lista);
op =menu();
...
Fundamentosdelaprogramacin:Programacinmodular
Pgina788
LuisHernndezYez
Fundamentosdelaprogramacin:Programacinmodular
Pgina 789
bd2.cpp
...
#include"registro.h"
#include"lista2.h"
...
registro.h
#include<string>
...
registro.cpp
...
#include"registro.h"
...
lista2.h
LuisHernndezYez
...
#include"registro.h"
...
lista2.cpp
Incluye...
...
#include"lista2.h"
...
Fundamentosdelaprogramacin:Programacinmodular
Pgina 790
#include<string>
usingnamespacestd;
typedef struct {
...
}tRegistro;
...
#include"registro.h"
#include"lista2.h"
intmenu();
#include<string>
usingnamespacestd;
#include "registro.h"
...
LuisHernndezYez
#include<string>
usingnamespacestd;
typedef struct {
...
}tRegistro;
...
Fundamentosdelaprogramacin:Programacinmodular
Pgina 791
Sustituido
#include<string>
usingnamespacestd;
#include<string>
usingnamespacestd;
typedef struct {
...
}tRegistro;
...
#include"lista2.h"
LuisHernndezYez
intmenu();
...
Fundamentosdelaprogramacin:Programacinmodular
Pgina 792
#include<string>
usingnamespacestd;
typedef struct {
...
}tRegistro;
...
intmenu();
...
LuisHernndezYez
#include<string>
usingnamespacestd;
#include<string>
usingnamespacestd;
Identificador duplicado!
typedef struct {
...
}tRegistro;
...
Fundamentosdelaprogramacin:Programacinmodular
Pgina 793
Compilacin condicional
Directivas #ifdef, #ifndef, #else y #endif
Se usan en conjuncin con la directiva #define
LuisHernndezYez
#define X
#ifdef X
...//Cdigoif
[#else
...//Cdigoelse
]
#endif
#define X
#ifndef X
...//Cdigoif
[#else
...//Cdigoelse
]
#endif
Pgina 794
Identificadores duplicados!
Cada mdulo debe incluirse una y slo una vez
Proteccin frente a inclusiones mltiples:
LuisHernndezYez
#ifndef X
#define X
...//Mdulo
#endif
Pgina 795
Cabecera
registrofin.h
LuisHernndezYez
typedef struct {
int codigo;
string nombre;
double sueldo;
}tRegistro;
tRegistro nuevo();
booloperator>(tRegistro opIzq,tRegistro opDer);
booloperator<(tRegistro opIzq,tRegistro opDer);
void mostrar(int pos,tRegistro registro);
#endif
Fundamentosdelaprogramacin:Programacinmodular
Pgina 796
Implementacin
registrofin.cpp
LuisHernndezYez
#include <iostream>
#include <string>
usingnamespacestd;
#include <iomanip>
#include "registrofin.h"
tRegistro nuevo(){
tRegistro registro;
cout<<"Introduceelcdigo:";
cin>>registro.codigo;
cout<<"Introduceelnombre:";
cin>>registro.nombre;
cout<<"Introduceelsueldo:";
cin>>registro.sueldo;
return registro;
}
booloperator>(tRegistro opIzq,tRegistro opDer){
returnopIzq.nombre >opDer.nombre;
}...
Fundamentosdelaprogramacin:Programacinmodular
Pgina 797
Cabecera
listafin.h
LuisHernndezYez
#ifndef listafin_h
#define listafin_h
#include<string>
usingnamespacestd;
#include "registrofin.h"
const int N=100;
typedef tRegistro tArray[N];
typedef struct {
tArray registros;
int cont;
}tLista;
const string BD="bd.txt";
voidmostrar(const tLista&lista);
void insertar(tLista&lista,tRegistro registro,bool&ok);
voideliminar(tLista&lista,intpos,bool&ok);//pos=1..N
intbuscar(tLista lista,stringnombre);
voidcargar(tLista&lista,bool&ok);
voidguardar(tLista lista);
#endif
Fundamentosdelaprogramacin:Programacinmodular
Pgina 798
Implementacin
listafin.cpp
LuisHernndezYez
#include <iostream>
usingnamespacestd;
#include <fstream>
#include "listafin.h"
void insertar(tLista&lista,tRegistro registro,bool &ok){
ok=true;
if (lista.cont ==N){
ok=false;//listallena
}
else {
int i=0;
while((i<lista.cont)&&(lista.registros[i]<registro)){
i++;
}
//Insertamosenlaposicini
for (intj=lista.cont;j>i;j){
//Desplazamosaladerecha
lista.registros[j]=lista.registros[j 1];
}
...
Fundamentosdelaprogramacin:Programacinmodular
Pgina799
bdfin.cpp
LuisHernndezYez
int main(){
tLista lista;
bool ok;
int op,pos;
cargar(lista,ok);
if (!ok){
cout<<"Nosepudo abrir elarchivo!" <<endl;
}
else {
do {
mostrar(lista);
op=menu();
...
Fundamentosdelaprogramacin:Programacinmodular
Pgina 800
#ifndef registrofin_h
#define registrofin_h
#include<string>
usingnamespacestd;
#include"registrofin.h"
#include"listafin.h"
typedef struct {
...
}tRegistro;
...
intmenu();
...
LuisHernndezYez
Fundamentosdelaprogramacin:Programacinmodular
Pgina 801
LuisHernndezYez
typedef struct {
...
}tRegistro;
...
#include"listafin.h"
#ifndef listafin_h
#define listafin_h
#include<string>
usingnamespacestd;
#include "registrofin.h"
const int N=100;
typedef tRegistro tArray[N];
typedef struct {
tArray registros;
int cont;
}tLista;
...
intmenu();
...
Fundamentosdelaprogramacin:Programacinmodular
Pgina 802
typedef struct {
...
}tRegistro;
...
#ifndef registrofin_h
#define registrofin_h
#include<string>
usingnamespacestd;
#define listafin_h
#include<string>
usingnamespacestd;
#include "registrofin.h"
typedef struct {
...
}tRegistro;
...
...
intmenu();
...
Fundamentosdelaprogramacin:Programacinmodular
Pgina 803
Fundamentosdelaprogramacin:Programacinmodular
Pgina 804
LuisHernndezYez
LuisHernndezYez
#include<iostream>
usingnamespacestd;
#define registrofin_h
#include<string>
usingnamespacestd;
#include<string>
usingnamespacestd;
#include "registrofin.h"
Lista
ordenada
Lista
no ordenada
LuisHernndezYez
Fundamentosdelaprogramacin:Programacinmodular
Pgina 805
LuisHernndezYez
Fundamentosdelaprogramacin:Programacinmodular
Pgina 806
LuisHernndezYez
Pgina 807
Fundamentosdelaprogramacin:Programacinmodular
Pgina 808
LuisHernndezYez
Fundamentosdelaprogramacin:Programacinmodular
LuisHernndezYez
Por ejemplo:
namespace miEspacio {
int i;
double d;
}
Fundamentosdelaprogramacin:Programacinmodular
Pgina 809
LuisHernndezYez
namespace segundo {
double x=3.1416;
}
Pgina 810
using
LuisHernndezYez
Pgina 811
usingnamespace
LuisHernndezYez
Pgina 812
LuisHernndezYez
#ifndef listaEN_h
#definelistaEN_h
#include"registrofin.h"
namespace ord {//Listaordenada
const int N=100;
typedef tRegistro tArray[N];
typedef struct {
tArray registros;
int cont;
}tLista;
const stringBD="bd.txt";
voidmostrar(const tLista&lista);
voidinsertar(tLista&lista,tRegistro registro,bool &ok);
voideliminar(tLista&lista,intpos,bool &ok);//1..N
intbuscar(tLista lista,stringnombre);
voidcargar(tLista&lista,bool &ok);
voidguardar(tLista lista);
}//namespace
#endif
Fundamentosdelaprogramacin:Programacinmodular
Pgina 813
Implementacin
#include<iostream>
#include<fstream>
usingnamespacestd;
#include"listaEN.h"
void ord::insertar(tLista&lista,tRegistro registro,bool &ok){
//...
}
LuisHernndezYez
voidord::eliminar(tLista&lista,intpos,bool &ok){
//...
}
intord::buscar(tLista lista,stringnombre){
//...
}
...
Fundamentosdelaprogramacin:Programacinmodular
Pgina 814
LuisHernndezYez
int menu();
int main(){
ord::tLista lista;
boolok;
ord::cargar(lista,ok);
if (!ok){
cout<<"Nosepudoabrirelarchivo!"<<endl;
}
else {
ord::mostrar(lista);
...
Pgina 815
LuisHernndezYez
int menu();
int main(){
tLista lista;
bool ok;
cargar(lista,ok);
if (!ok){
cout<<"Nosepudoabrirelarchivo!"<<endl;
}
else {
mostrar(lista);
...
Fundamentosdelaprogramacin:Programacinmodular
Pgina 816
Implementaciones alternativas
Distintos espacios de nombres para distintas implementaciones
Lista ordenada o lista desordenada?
LuisHernndezYez
Pgina 817
Cabecera
listaEN.h
Implementaciones alternativas
Todo lo comn puede estar fuera de la estructura namespace:
#ifndef listaEN_H
#definelistaEN_H
#include"registrofin.h"
const int N=100;
LuisHernndezYez
Pgina 818
LuisHernndezYez
Fundamentosdelaprogramacin:Programacinmodular
Pgina 819
listaEN.cpp
#include<iostream>
usingnamespacestd;
#include <fstream>
#include "listaEN.h"
//IMPLEMENTACINDELOSSUBPROGRAMASCOMUNES
void eliminar(tLista&lista,int pos,bool &ok){//...
}
LuisHernndezYez
Pgina 820
LuisHernndezYez
}
int ord::buscar(tLista lista,string nombre){
int ini=0,fin=lista.cont 1,mitad;
bool encontrado=false;
while ((ini<=fin)&&!encontrado){
mitad=(ini+fin)/2;
if (nombre==lista.registros[mitad].nombre){
encontrado=true;
}
elseif(nombre<lista.registros[mitad].nombre){
fin=mitad 1;
}
else {
ini=mitad+1;
}
}...
Fundamentosdelaprogramacin:Programacinmodular
Pgina 821
if (encontrado){
mitad++;
}
else {
mitad=1;
}
return mitad;
}
void ord::cargar(tLista&lista,bool &ok){//...
}
LuisHernndezYez
Fundamentosdelaprogramacin:Programacinmodular
Pgina 822
//IMPLEMENTACINDELOSSUBPROGRAMASDELESPACIODENOMBRESdes
LuisHernndezYez
Pgina 823
if (encontrado){
pos++;
}
else {
pos=1;
}
return pos;
}
void des::cargar(tLista&lista,bool &ok){//...
}
LuisHernndezYez
Fundamentosdelaprogramacin:Programacinmodular
Pgina 824
bdEN.cpp
Programa principal
#include<iostream>
usingnamespacestd;
#include"registrofin.h"
#include"listaEN.h"
usingnamespaceord;
LuisHernndezYez
int menu();
int main(){
tLista lista;
bool ok;
...
tRegistro registro=nuevo();
insertar(lista,registro,ok);
if (!ok){
...
Fundamentosdelaprogramacin:Programacinmodular
Pgina 825
bdEN.cpp
Programa principal
#include<iostream>
usingnamespacestd;
#include"registrofin.h"
#include"listaEN.h"
usingnamespacedes;
LuisHernndezYez
int menu();
int main(){
tLista lista;
bool ok;
...
tRegistro registro=nuevo();
insertar(lista,registro,ok);
if (!ok){
...
Fundamentosdelaprogramacin:Programacinmodular
Pgina 826
LuisHernndezYez
Fundamentosdelaprogramacin:Programacinmodular
Pgina 827
Software de calidad
LuisHernndezYez
Fundamentosdelaprogramacin:Programacinmodular
Pgina 828
LuisHernndezYez
Prueba exhaustiva
El software debe ser probado exhaustivamente
Debemos intentar descubrir todos los errores posible
Los errores deben ser depurados, corrigiendo el cdigo
Pruebas sobre listas:
Lista inicialmente vaca
Lista inicialmente llena
Lista con un nmero intermedio de elementos
Archivo no existente
Etctera...
Se han de probar todas las opciones/situaciones del programa
En las clases prcticas veremos cmo se depura el software
Fundamentosdelaprogramacin:Programacinmodular
Pgina 829
No reinventemos la rueda
Desarrollar el software pensando en su posible reutilizacin
Un software de calidad debe poder ser fcilmente reutilizado
Nuestros mdulos deben ser fcilmente usados y modificados
LuisHernndezYez
Fundamentosdelaprogramacin:Programacinmodular
Pgina 830
LuisHernndezYez
Pgina 831
Fundamentosdelaprogramacin
8A
Grado en Ingeniera Informtica
Grado en Ingeniera del Software
Grado en Ingeniera de Computadores
Luis Hernndez Yez
Facultad de Informtica
Universidad Complutense
ventas.cpp
#include<iostream>
#include<string>
usingnamespacestd;
const int NCLI=100;
const int NPROD=200;
const int NVENTAS=3000;
typedef struct {
intid_cli;
string nif;
string nombre;
string telefono;
}tCliente;
LuisHernndezYez
typedef struct {
tCliente clientes[NCLI];
int cont;
}tListaClientes;
typedef struct{
int id_prod;
string codigo;
string nombre;
double precio;
int unidades;
}tProducto;
typedef struct {
tProducto productos[NPROD];
int cont;
}tListaProductos;
typedef struct {
int id;
int id_prod;
int id_cli;
int unidades;
}tVenta;
typedef struct {
tVenta ventas[NVENTAS];
int cont;
}tListaVentas;
...
Fundamentosdelaprogramacin:Ejemplodemodularizacin
Pgina 833
LuisHernndezYez
tCliente nuevoCliente();
bool valida(tCliente cliente);//Funcininterna
bool operator<(tCliente opIzq,tCliente opDer);//PorNIF
voidmostrar(tCliente cliente);
voidinicializar(tListaClientes &lista);
voidcargar(tListaClientes &lista);
voidinsertar(tListaClientes &lista,tCliente cliente,bool &ok);
voidbuscar(const tListaClientes &lista,stringnif,tCliente &cliente,bool &ok);
voideliminar(tListaClientes &lista,stringnif,bool &ok);
voidmostrar(const tListaClientes &lista);
tProducto nuevoProducto();
boolvalida(tProducto producto);//Funcininterna
booloperator<(tProducto opIzq,tProducto opDer);//Porcdigo
voidmostrar(tProducto producto);
voidinicializar(tListaProductos &lista);
voidcargar(tListaProductos &lista);
voidinsertar(tListaProductos &lista,tProducto producto,bool &ok);
voidbuscar(const tListaProductos &lista,stringcodigo,tProducto &producto,
bool &ok);
voideliminar(tListaProductos &lista,stringcodigo,bool &ok);
...
LuisHernndezYez
Fundamentosdelaprogramacin:Ejemplodemodularizacin
Pgina 834
Fundamentosdelaprogramacin:Ejemplodemodularizacin
Pgina 835
string nombre;
double precio;
int unidades;
}tProducto;
#include<iostream>
#include<string>
usingnamespacestd;
const int NCLI=100;
const int NPROD=200;
const int NVENTAS=3000;
LuisHernndezYez
typedef struct {
intid_cli;
string nif;
string nombre;
string telefono;
}tCliente;
Cliente
Lista de clientes
typedef struct {
tCliente clientes[NCLI];
int cont;
}tListaClientes;
typedef struct{
int id_prod;
string codigo;
Producto
Lista de productos
typedef struct {
tProducto productos[NPROD];
int cont;
}tListaProductos;
typedef struct {
int id;
int id_prod;
int id_cli;
int unidades;
}tVenta;
Venta
Lista de ventas
typedef struct {
tVenta ventas[NVENTAS];
int cont;
}tListaVentas;
...
Fundamentosdelaprogramacin:Ejemplodemodularizacin
tCliente nuevoCliente();
Pgina 836
Cliente
Lista de clientes
voidmostrar(tCliente cliente);
voidinicializar(tListaClientes &lista);
voidcargar(tListaClientes &lista);
voidinsertar(tListaClientes &lista,tCliente cliente,bool &ok);
Producto
LuisHernndezYez
Fundamentosdelaprogramacin:Ejemplodemodularizacin
Pgina 837
Lista de productos
voidinicializar(tListaProductos &lista);
voidcargar(tListaProductos &lista);
voidinsertar(tListaProductos &lista,tProducto producto,bool &ok);
voidbuscar(const tListaProductos &lista,stringcodigo,tProducto &producto,
bool &ok);
voideliminar(tListaProductos &lista,stringcodigo,bool &ok);
void mostrar(const tListaProductos &lista);
tVenta nuevaVenta(int id_prod,int id_cli,intunidades);
bool valida(tVenta venta);//Funcininterna
voidmostrar(tVenta venta,consttListaClientes &clientes,
const tListaProductos &productos);
Venta
LuisHernndezYez
...
Fundamentosdelaprogramacin:Ejemplodemodularizacin
Pgina 838
Lista de ventas
voidinicializar(tListaVentas &lista);
voidcargar(tListaVentas &lista);
void insertar(tListaVentas &lista,tVenta venta,bool &ok);
voidbuscar(const tListaVentas &lista,intid,tVenta &venta,bool &ok);
void eliminar(tListaVentas &lista,intid,bool &ok);
voidventasPorClientes(const tListaVentas &lista);
voidventasPorProductos(const tListaVentas &lista);
doubletotalVentas(const tListaVentas &ventas,stringnif,
consttListaClientes &clientes,
consttListaProductos &productos);
LuisHernndezYez
Fundamentosdelaprogramacin:Ejemplodemodularizacin
Pgina 839
LuisHernndezYez
Fundamentosdelaprogramacin:Ejemplodemodularizacin
Pgina 840
Ventas
LuisHernndezYez
main.cpp
Cliente
Lista de clientes
Venta
Lista de ventas
cliente.h
cliente.cpp
listaclientes.h
listaclientes.cpp
venta.h
venta.cpp
listaventas.h
listaventas.cpp
Producto
Lista de productos
producto.h
producto.cpp
listaproductos.h
listaproductos.cpp
Fundamentosdelaprogramacin:Ejemplodemodularizacin
Pgina 841
cliente.h
string
LuisHernndezYez
typedef struct {
tCliente clientes[NCLI];
int cont;
}tListaClientes;
listaclientes.h
cliente.h
string
Fundamentosdelaprogramacin:Ejemplodemodularizacin
typedef struct{
int id_prod;
string codigo;
string nombre;
double precio;
int unidades;
}tProducto;
producto.h
Pgina 842
string
LuisHernndezYez
listaproductos.h
producto.h
string
Fundamentosdelaprogramacin:Ejemplodemodularizacin
Pgina 843
typedef struct {
int id;
int id_prod;
int id_cli;
int unidades;
}tVenta;
venta.h
listaclientes.h
listaproductos.h
LuisHernndezYez
listaventas.h
typedef struct {
tVenta ventas[NVENTAS];
int cont;
}tListaVentas;
venta.h
listaclientes.h
listaproductos.h
Pgina 844
#ifndef cliente_h
#definecliente_h
#include<string>
usingnamespacestd;
LuisHernndezYez
typedefstruct {
int id_cli;
string nif;
string nombre;
string telefono;
}tCliente;
tCliente nuevoCliente();
bool operator<(tCliente opIzq,tCliente opDer);//PorNIF
void mostrar(tCliente cliente);
#endif
Fundamentosdelaprogramacin:Ejemplodemodularizacin
Pgina 845
LuisHernndezYez
Pgina 846
Fundamentosdelaprogramacin
9
Grado en Ingeniera Informtica
Grado en Ingeniera del Software
Grado en Ingeniera de Computadores
Luis Hernndez Yez
LuisHernndezYez
Facultad de Informtica
Universidad Complutense
Direccionesdememoriaypunteros
Operadoresdepunteros
Punterosydireccionesvlidas
Punterosnoinicializados
Unvalorseguro:NULL
Copiaycomparacindepunteros
Tipospuntero
Punterosaestructuras
Punterosaconstantesypunterosconstantes
Punterosypasodeparmetros
Punterosyarrays
Memoriaydatosdelprograma
Memoriadinmica
Punterosydatosdinmicos
Gestindelamemoria
Errorescomunes
Arraysdedatosdinmicos
Arraysdinmicos
Fundamentosdelaprogramacin:Punterosymemoriadinmica
849
854
864
866
867
868
873
875
877
879
883
886
891
895
907
911
916
928
LuisHernndezYez
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 849
int i=5;
LuisHernndezYez
Direccin base
0F03:1A37
...
0F03:1A38
00000000
0F03:1A39
00000000
0F03:1A3A
00000000
0F03:1A3B
00000101
0F03:1A3C
...
Pgina 850
0F03:1A38
00
0F03:1A39
00
0F03:1A3A
00
0F03:1A3B
05
Indireccin:
Acceso indirecto a un dato
...
LuisHernndezYez
punt
0F07:0417
0F
0F07:0418
03
0F07:0419
1A
0F07:041A
38
...
punt apunta a i
punt
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 851
LuisHernndezYez
int*punt;//punt inicialmentecontieneunadireccin
//quenoesvlida(noapuntaanada)
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 852
Pgina 853
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 854
LuisHernndezYez
LuisHernndezYez
&
Obtener la direccin de memoria de ...
Operador monario y prefijo
& devuelve la direccin de memoria base del dato al que precede
int i;
cout<<&i;//Muestraladireccindememoriadei
int i;
int*punt;
LuisHernndezYez
punt=&i;//puntcontieneladireccindei
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 855
&
Obtener la direccin de memoria de ...
...
int i,j;
0F03:1A38
0F03:1A39
...
0F03:1A3A
int*punt;
0F03:1A3B
0F03:1A3C
0F03:1A3D
0F03:1A3E
0F03:1A3F
...
LuisHernndezYez
punt
0F07:0417
0F07:0418
0F07:0419
0F07:041A
...
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 856
&
Obtener la direccin de memoria de ...
...
int i,j;
0F03:1A38
00
0F03:1A39
00
...
0F03:1A3A
00
int*punt;
0F03:1A3B
05
...
0F03:1A3C
0F03:1A3D
i=5;
0F03:1A3E
0F03:1A3F
...
LuisHernndezYez
punt
0F07:0417
0F07:0418
0F07:0419
0F07:041A
...
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 857
&
Obtener la direccin de memoria de ...
...
0F03:1A38
00
0F03:1A39
00
...
0F03:1A3A
00
int*punt;
0F03:1A3B
05
int i,j;
...
0F03:1A3C
0F03:1A3D
i=5;
0F03:1A3E
punt=&i;
0F03:1A3F
...
punt
LuisHernndezYez
punt
i
0F07:0417
0F
0F07:0418
03
0F07:0419
1A
0F07:041A
38
...
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 858
*
Obtener lo que hay en la direccin ...
Operador monario y prefijo
* accede a lo que hay en la direccin de memoria a la que precede
Permite acceder a un dato a travs un puntero que lo apunte:
punt=&i;
cout<<*punt;//Muestraloquehayenladireccinpunt
*punt: lo que hay en la direccin que contiene el puntero punt
punt contiene la direccin de memoria de la variable i
LuisHernndezYez
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 859
*
Obtener lo que hay en la direccin ...
...
0F03:1A38
00
0F03:1A39
00
...
0F03:1A3A
00
int *punt;
0F03:1A3B
05
int i,j;
...
0F03:1A3D
i=5;
0F03:1A3E
punt=&i;
0F03:1A3F
j=*punt;
...
punt
LuisHernndezYez
0F03:1A3C
punt:
0F07:0417
0F
0F07:0418
03
0F07:0419
1A
0F07:041A
38
...
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 860
*
Obtener lo que hay en la direccin ...
...
int i,j;
...
int *punt;
...
i=5;
punt=&i;
Direccionamiento
indirecto
(indireccin)
Seaccedealdatoi
deformaindirecta
00
0F03:1A39
00
0F03:1A3A
00
0F03:1A3B
05
0F03:1A3C
0F03:1A3D
0F03:1A3E
0F03:1A3F
j=*punt;
...
punt
LuisHernndezYez
0F03:1A38
*punt:
0F07:0417
0F
0F07:0418
03
0F07:0419
1A
0F07:041A
38
...
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 861
*
Obtener lo que hay en la direccin ...
...
0F03:1A38
00
0F03:1A39
00
...
0F03:1A3A
00
int *punt;
0F03:1A3B
05
0F03:1A3C
00
0F03:1A3D
00
0F03:1A3E
00
0F03:1A3F
05
int i,j;
...
i=5;
punt=&i;
j=*punt;
...
LuisHernndezYez
punt
0F07:0417
0F
0F07:0418
03
0F07:0419
1A
0F07:041A
38
...
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 862
punteros.cpp
int main(){
int i =5;
int j=13;
int *punt;
punt=&i;
cout<<*punt<<endl;//Muestra elvalordei
punt=&j;
cout<<*punt<<endl;//Ahora muestra elvalordej
int *otro =&i;
cout<<*otro +*punt<<endl;//i +j
int k=*punt;
cout<<k<<endl;//Mismo valorque j
return 0;
}
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 863
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 864
LuisHernndezYez
LuisHernndezYez
#include <iostream>
usingnamespacestd;
LuisHernndezYez
Pgina 865
LuisHernndezYez
Pgina 866
punt
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 867
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 868
LuisHernndezYez
LuisHernndezYez
LuisHernndezYez
punt1
punt2
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 869
LuisHernndezYez
punt1
punt2
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 870
LuisHernndezYez
punt1
punt2
8
5
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 871
LuisHernndezYez
int x=5;
int *punt1=NULL;
int *punt2=&x;
...
if (punt1==punt2){
cout<<"Apuntanalmismodato" <<endl;
}
else{
cout<<"Noapuntanalmismodato" <<endl;
}
Slo se pueden comparar punteros con el mismo tipo base
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 872
LuisHernndezYez
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 873
tipos.cpp
LuisHernndezYez
typedefint*tIntPtr;
typedefchar*tCharPtr;
typedefdouble*tDoublePtr;
int entero=5;
tIntPtr puntI =&entero;
char caracter ='C';
tCharPtr puntC =&caracter;
double real=5.23;
tDoublePtr puntD =ℜ
cout<<*puntI <<""<<*puntC <<""<<*puntD <<endl;
Con *puntero podemos hacer lo que con otros datos del tipo base
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 874
LuisHernndezYez
puntero>nombrepuntero>sueldo
puntero>... (*puntero)....
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 875
structPtr.cpp
LuisHernndezYez
(*puntero).codigo *puntero.codigo
Pgina 876
LuisHernndezYez
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 877
constPtr.cpp
LuisHernndezYez
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 878
LuisHernndezYez
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 879
param.cpp
LuisHernndezYez
Mostrar 6 en la consola
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 880
entero
LuisHernndezYez
punt
cout<<entero<<endl;
entero
entero
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 881
Prototipo equivalente:
void foo(int *param1,double *param2,char *param3);
LuisHernndezYez
Cmo se llamara?
int entero;double real;char caracter;
//...
foo(&entero,&real,&caracter);
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 882
LuisHernndezYez
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 883
Entonces:
cout<<*dias <<endl;
LuisHernndezYez
Pgina 884
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 885
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 886
LuisHernndezYez
LuisHernndezYez
constint N=...;
void cuadrado(int arr[N]);
void cuadrado(int arr[],int size);//Arraynodelimitado
void cuadrado(int *arr,int size);//Puntero
Regiones de la memoria
El sistema operativo distingue varias regiones en la memoria:
Pila(Stack)
Montn(Heap)
Datos locales
Datos dinmicos
Datos globales
LuisHernndezYez
Cdigodel
programa
Memoria principal
S.O.
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Memoria principal
LuisHernndezYez
Pgina 887
Datos locales
Pila
Datos dinmicos
Montn
Datos globales
Cdigodelprograma
Memoria principal
S.O.
intmain(){
...
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 888
La pila (stack)
Datos locales de subprogramas:
Parmetros por valor
y variables locales
LuisHernndezYez
Datos locales
Pila
Datos dinmicos
Montn
Datos globales
Cdigodelprograma
S.O.
&resultado
func(lista,resultado)
Fundamentosdelaprogramacin:Punterosymemoriadinmica
El montn (heap)
LuisHernndezYez
Datos dinmicos
Datos que se crean y se destruyen
durante la ejecucin del programa,
a medida que se necesita
Memoria principal
Pgina 889
Datos locales
Pila
Datos dinmicos
Montn
Datos globales
Cdigodelprograma
Memoria principal
S.O.
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 890
LuisHernndezYez
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 891
Datos dinmicos
Se crean y se destruyen durante la ejecucin del programa
Se les asigna memoria del montn
Creacin
LuisHernndezYez
Datodinmico
Montn
Destruccin
Pgina 892
LuisHernndezYez
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 893
Datos estticos
Datos declarados como de un tipo concreto:
int i;
Se acceden directamente a travs del identificador:
cout<<i;
LuisHernndezYez
Datos dinmicos
Datos accedidos a travs de su direccin de memoria
Esa direccin de memoria debe estar el algn puntero
Los punteros son la base del SGMD
Los datos estticos tambin se pueden acceder a travs de punteros
int *p=&i;
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 894
LuisHernndezYez
Fundamentosdelaprogramacin:Punterosymemoriadinmica
El operador new
new tipo
Pgina 895
int *p;//Todavasinunadireccinvlida
p=new int;//Yatieneunadireccinvlida
*p=12;
LuisHernndezYez
Pgina 896
registros.cpp
LuisHernndezYez
#include<iostream>
usingnamespacestd;
#include"registro.h"
int main(){
tRegistroreg;
reg =nuevo();
tRegistro *punt =new tRegistro(reg);
mostrar(*punt);
...
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 897
El operador delete
delete puntero;
int *p;
p=new int;
*p=12;
...
delete p;//Yanosenecesitaelenteroapuntadoporp
LuisHernndezYez
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 898
dinamicas.cpp
LuisHernndezYez
#include<iostream>
usingnamespacestd;
int main(){
double a=1.5;
p1
double *p1,*p2,*p3;
p1=&a;
p2=new double;
a
*p2=*p1;
p3=new double;
*p3=123.45;
cout<<*p1<<endl; p2
cout<<*p2<<endl;
cout<<*p3<<endl;
delete p2;
delete p3;
p3
return 0;
Identificadores:
4
(a, p1, p2, p3)
1.5
Variables:
1.5
6
(+ *p2 y *p3)
123.45
Montn (heap)
}
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 899
#include<iostream>
usingnamespacestd;
LuisHernndezYez
int main(){
double a=1.5;
double *p1,*p2,*p3;
PILA
a
1.5
p1
p2
p3
MONTN
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 900
#include<iostream>
usingnamespacestd;
PILA
a
1.5
p1
p2
p3
LuisHernndezYez
int main(){
double a=1.5;
double *p1,*p2,*p3;
p1=&a;
MONTN
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 901
#include<iostream>
usingnamespacestd;
PILA
a
LuisHernndezYez
int main(){
double a=1.5;
double *p1,*p2,*p3;
p1=&a;
p2=new double;
1.5
p1
p2
p3
MONTN
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 902
#include<iostream>
usingnamespacestd;
PILA
a
1.5
p1
p2
p3
LuisHernndezYez
int main(){
double a=1.5;
double *p1,*p2,*p3;
p1=&a;
p2=new double;
*p2=*p1;
1.5
MONTN
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 903
#include<iostream>
usingnamespacestd;
PILA
a
LuisHernndezYez
int main(){
double a=1.5;
double *p1,*p2,*p3;
p1=&a;
p2=new double;
*p2=*p1;
p3=new double;
1.5
p1
p2
p3
1.5
MONTN
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 904
#include<iostream>
usingnamespacestd;
PILA
a
int main(){
double a=1.5;
double *p1,*p2,*p3;
p1=&a;
p2=new double;
*p2=*p1;
p3=new double;
*p3=123.45;
1.5
p1
p2
p3
LuisHernndezYez
123.45
1.5
MONTN
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 905
#include<iostream>
usingnamespacestd;
PILA
LuisHernndezYez
int main(){
double a=1.5;
double *p1,*p2,*p3;
p1=&a;
p2=new double;
*p2=*p1;
p3=new double;
*p3=123.45;
cout<<*p1<<endl;
cout<<*p2<<endl;
cout<<*p3<<endl;
delete p2;
1.5
p1
p2
p3
123.45
MONTN
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 906
#include<iostream>
usingnamespacestd;
PILA
1.5
p1
p2
p3
MONTN
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 907
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 908
LuisHernndezYez
LuisHernndezYez
int main(){
double a=1.5;
double *p1,*p2,*p3;
p1=&a;
p2=new double;
*p2=*p1;
p3=new double;
*p3=123.45;
cout<<*p1<<endl;
cout<<*p2<<endl;
cout<<*p3<<endl;
delete p2;
delete p3;
Pila
Montn
LuisHernndezYez
Colisin pilamontn
Los lmites de ambas regiones se encuentran
Se agota la memoria
Desbordamiento de la pila
La pila suele tener un tamao mximo establecido
Si se sobrepasa se agota la pila
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 909
LuisHernndezYez
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 910
LuisHernndezYez
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 911
LuisHernndezYez
Pgina 912
LuisHernndezYez
...
intmain(){
tRegistro *p1=new tRegistro;
*p1=nuevo();
mostrar(*p1);
tRegistro *p2;
p2=p1;
mostrar(*p2);
delete p1;
delete p2;
return 0;
}
p1
tRegistro
p2
Slo se ha creado
una variable
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 913
LuisHernndezYez
mostrar(*p1);
p1=p2;
mostrar(*p1);
tRegistro
p1
tRegistro
Perdido!
delete p1;
delete p2;
return 0;
p2
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 914
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 915
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 916
LuisHernndezYez
LuisHernndezYez
return 0;
p ha dejado de apuntar
al dato dinmico destruido
Acceso a memoria inexistente
LuisHernndezYez
typedef struct {
intcodigo;
string nombre;
double valor;
}tRegistro;
typedef tRegistro *tRegPtr;
Pgina 917
tLista lista;
lista.cont =0;
lista.cont
0
0
998
999
LuisHernndezYez
lista.registros
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 918
tLista lista;
lista.cont =0;
lista.registros[lista.cont]=new tRegistro(nuevo());
lista.cont++;
lista.cont
1
0
998
999
LuisHernndezYez
lista.registros
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 919
tLista lista;
lista.cont =0;
lista.registros[lista.cont]=new tRegistro(nuevo());
lista.cont++;
lista.registros[lista.cont]=new tRegistro(nuevo());
lista.cont++;
lista.cont
2
0
998
999
LuisHernndezYez
lista.registros
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 920
tLista lista;
lista.cont =0;
lista.registros[lista.cont]=new tRegistro(nuevo());
lista.cont++;
lista.registros[lista.cont]=new tRegistro(nuevo());
lista.cont++;
lista.registros[lista.cont]=new tRegistro(nuevo());
lista.cont++;
lista.cont
3
0
998
999
LuisHernndezYez
lista.registros
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 921
lista.cont
3
0
998
999
LuisHernndezYez
lista.registros
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 922
lista.cont
3
0
998
999
LuisHernndezYez
lista.registros
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 923
lista.h
#ifndef lista_h
#definelista_h
#include"registro.h"
LuisHernndezYez
Pgina 924
lista.cpp
LuisHernndezYez
Pgina 925
LuisHernndezYez
Pgina 926
listadinamica.cpp
#include<iostream>
usingnamespacestd;
#include"registro.h"
#include"lista.h"
return 0;
}
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 927
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 928
LuisHernndezYez
LuisHernndezYez
int main(){
tLista lista;
bool ok;
cargar(lista,ok);
if(ok){
mostrar(lista);
destruir(lista);
}
delete []p;
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 929
#include<iostream>
usingnamespacestd;
const int N=10;
LuisHernndezYez
int main(){
int*p=new int[N];
for (int i=0;i<N;i++){
p[i]=i;
}
for (int i=0;i<N;i++){
cout<<p[i]<<endl;
}
delete []p;
return 0;
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 930
listaAD.h
...
#include"registro.h"
const int N=1000;
//Lista:arraydinmico(puntero)ycontador
typedef struct {
tRegPtr registros;
int cont;
}tLista;
LuisHernndezYez
...
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 931
listaAD.cpp
LuisHernndezYez
Pgina 932
LuisHernndezYez
LuisHernndezYez
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 933
Pgina 934
ejemploAD.cpp
LuisHernndezYez
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 935
Array dinmico:
Puntero a array
7
LuisHernndezYez
Montn
Fundamentosdelaprogramacin:Punterosymemoriadinmica
Pgina 936
LuisHernndezYez
Pgina 937
Fundamentosdelaprogramacin
9A
Grado en Ingeniera Informtica
Grado en Ingeniera del Software
Grado en Ingeniera de Computadores
Luis Hernndez Yez
Facultad de Informtica
Universidad Complutense
LuisHernndezYez
Aritmticadepunteros
Recorridodearraysconpunteros
Referencias
Listasenlazadas
Fundamentosdelaprogramacin:Punterosymemoriadinmica(Anexo)
940
953
962
964
LuisHernndezYez
Fundamentosdelaprogramacin:Punterosymemoriadinmica(Anexo)
Pgina 940
LuisHernndezYez
Pgina 941
int dias[12]={31,28,31,30,31,30,
31,31,30,31,30,31};
...
dias[0]
0F03:1A39
typedef int*tIntPtr;
tIntPtr punt=dias;
0F03:1A38
0F03:1A3A
31
0F03:1A3B
dias[1]
0F03:1A3C
0F03:1A3D
0F03:1A3E
28
0F03:1A3F
dias[2]
0F03:1A40
0F03:1A41
0F03:1A42
31
0F03:1A43
...
LuisHernndezYez
dias
punt
0F07:0417
0F
0F07:0418
03
0F07:0419
1A
0F07:041A
38
0F07:041B
0F
0F07:041C
03
0F07:041D
1A
0F07:041E
38
...
Fundamentosdelaprogramacin:Punterosymemoriadinmica(Anexo)
Pgina 942
int dias[12]={31,28,31,30,31,30,
31,31,30,31,30,31};
...
dias[0]
0F03:1A39
typedef int*tIntPtr;
tIntPtr punt=dias;
punt++;
0F03:1A38
0F03:1A3A
31
0F03:1A3B
dias[1]
0F03:1A3C
0F03:1A3D
0F03:1A3E
28
0F03:1A3F
dias[2]
0F03:1A40
0F03:1A41
0F03:1A42
31
0F03:1A43
...
LuisHernndezYez
dias
punt
0F07:0417
0F
0F07:0418
03
0F07:0419
1A
0F07:041A
38
0F07:041B
0F
0F07:041C
03
0F07:041D
1A
0F07:041E
3C
...
Fundamentosdelaprogramacin:Punterosymemoriadinmica(Anexo)
Pgina 943
int dias[12]={31,28,31,30,31,30,
31,31,30,31,30,31};
...
dias[0]
0F03:1A39
typedef int*tIntPtr;
tIntPtr punt=dias;
punt =punt+2;
0F03:1A38
0F03:1A3A
31
0F03:1A3B
dias[1]
0F03:1A3C
0F03:1A3D
0F03:1A3E
28
0F03:1A3F
dias[2]
0F03:1A40
0F03:1A41
0F03:1A42
31
0F03:1A43
...
LuisHernndezYez
dias
punt
0F07:0417
0F
0F07:0418
03
0F07:0419
1A
0F07:041A
38
0F07:041B
0F
0F07:041C
03
0F07:041D
1A
0F07:041E
40
...
Fundamentosdelaprogramacin:Punterosymemoriadinmica(Anexo)
Pgina 944
int dias[12]={31,28,31,30,31,30,
31,31,30,31,30,31};
...
dias[0]
0F03:1A39
typedef int*tIntPtr;
tIntPtr punt=dias;
punt=punt+2;
0F03:1A38
0F03:1A3A
31
0F03:1A3B
dias[1]
0F03:1A3C
0F03:1A3D
0F03:1A3E
28
0F03:1A3F
dias[2]
0F03:1A40
0F03:1A41
0F03:1A42
31
0F03:1A43
...
LuisHernndezYez
dias
punt
0F07:0417
0F
0F07:0418
03
0F07:0419
1A
0F07:041A
38
0F07:041B
0F
0F07:041C
03
0F07:041D
1A
0F07:041E
3C
...
Fundamentosdelaprogramacin:Punterosymemoriadinmica(Anexo)
Pgina 945
...
shortint (2 bytes)
dias[0]
shortint dias[12]={31,28,31,30,
dias[1]
31,30,31,31,30,31,30,31};
typedef shortint*tSIPtr;
0F03:1A38
0F03:1A39
0F03:1A3A
0F03:1A3B
dias[2]
0F03:1A3C
0F03:1A3D
dias[3]
tSIPtr punt=dias;
0F03:1A3E
0F03:1A3F
dias[4]
0F03:1A40
0F03:1A41
31
28
31
30
31
...
dias
LuisHernndezYez
punt
0F07:0417
0F
0F07:0418
03
0F07:0419
1A
0F07:041A
38
0F07:041B
0F
0F07:041C
03
0F07:041D
1A
0F07:041E
38
...
Fundamentosdelaprogramacin:Punterosymemoriadinmica(Anexo)
Pgina 946
shortint dias[12]={31,28,31,30,
31,30,31,31,30,31,30,31};
...
dias[0]
typedef shortint*tSIPtr;
0F03:1A38
0F03:1A39
tSIPtr punt=dias;
dias[1]
punt++;
dias[2]
0F03:1A3A
0F03:1A3B
0F03:1A3C
0F03:1A3D
dias[3]
0F03:1A3E
0F03:1A3F
dias[4]
0F03:1A40
0F03:1A41
31
28
31
30
31
...
dias
LuisHernndezYez
punt
0F07:0417
0F
0F07:0418
03
0F07:0419
1A
0F07:041A
38
0F07:041B
0F
0F07:041C
03
0F07:041D
1A
0F07:041E
3A
...
Fundamentosdelaprogramacin:Punterosymemoriadinmica(Anexo)
Pgina 947
shortint dias[12]={31,28,31,30,
31,30,31,31,30,31,30,31};
...
dias[0]
typedef shortint*tSIPtr;
0F03:1A39
tSIPtr punt=dias;
dias[1]
punt++;
dias[2]
punt=punt+3;
0F03:1A38
0F03:1A3A
0F03:1A3B
0F03:1A3C
0F03:1A3D
dias[3]
0F03:1A3E
0F03:1A3F
dias[4]
0F03:1A40
0F03:1A41
31
28
31
30
31
...
dias
LuisHernndezYez
punt
0F07:0417
0F
0F07:0418
03
0F07:0419
1A
0F07:041A
38
0F07:041B
0F
0F07:041C
03
0F07:041D
1A
0F07:041E
40
...
Fundamentosdelaprogramacin:Punterosymemoriadinmica(Anexo)
Pgina 948
shortint dias[12]={31,28,31,30,
31,30,31,31,30,31,30,31};
...
dias[0]
typedef shortint*tSIPtr;
0F03:1A39
tSIPtr punt=dias;
dias[1]
punt++;
dias[2]
punt=punt+3;
punt;
0F03:1A38
0F03:1A3A
0F03:1A3B
0F03:1A3C
0F03:1A3D
dias[3]
0F03:1A3E
0F03:1A3F
dias[4]
0F03:1A40
0F03:1A41
31
28
31
30
31
...
dias
LuisHernndezYez
punt
0F07:0417
0F
0F07:0418
03
0F07:0419
1A
0F07:041A
38
0F07:041B
0F
0F07:041C
03
0F07:041D
1A
0F07:041E
3E
...
Fundamentosdelaprogramacin:Punterosymemoriadinmica(Anexo)
Pgina 949
shortint dias[12]={31,28,31,30,
31,30,31,31,30,31,30,31};
...
dias[0]
typedef shortint*tSIPtr;
0F03:1A39
tSIPtr punt=dias;
dias[1]
punt++;
dias[2]
punt=punt+3;
punt;
0F03:1A38
0F03:1A3A
0F03:1A3B
0F03:1A3C
0F03:1A3D
dias[3]
0F03:1A3E
0F03:1A3F
dias[4]
tSIPtr punt2;
0F03:1A40
0F03:1A41
31
28
31
30
31
...
dias
LuisHernndezYez
punt
punt2
Fundamentosdelaprogramacin:Punterosymemoriadinmica(Anexo)
0F07:0417
0F
0F07:0418
03
0F07:0419
1A
0F07:041A
38
0F07:041B
0F
0F07:041C
03
0F07:041D
1A
0F07:041E
3E
0F07:041F
Pgina 950
shortint dias[12]={31,28,31,30,
31,30,31,31,30,31,30,31};
...
dias[0]
typedef shortint*tSIPtr;
0F03:1A39
siPtr punt=dias;
dias[1]
punt++;
dias[2]
punt=punt+3;
punt;
LuisHernndezYez
0F03:1A3C
0F03:1A3D
dias[3]
0F03:1A3E
0F03:1A3F
dias[4]
0F03:1A40
0F03:1A41
31
28
31
30
31
...
dias
punt
punt2
Fundamentosdelaprogramacin:Punterosymemoriadinmica(Anexo)
0F03:1A3A
0F03:1A3B
tSIPtr punt2;
punt2=dias;
0F03:1A38
0F07:0417
0F
0F07:0418
03
0F07:0419
1A
0F07:041A
38
0F07:041B
0F
0F07:041C
03
0F07:041D
1A
0F07:041E
3E
0F07:041F
0F
Pgina 951
shortint dias[12]={31,28,31,30,
...
31,30,31,31,30,31,30,31};
dias[0]
typedef shortint*tSIPtr;
siPtr punt=dias;
punt++;
0F03:1A38
0F03:1A39
dias[1]
punt=punt+3;
punt;
dias[2]
dias[3]
0F03:1A3E
0F03:1A3F
dias[4]
0F03:1A40
0F03:1A41
...
dias
cout<<punt punt2;//3
punt
LuisHernndezYez
0F03:1A3C
0F03:1A3D
tSIPtr punt2;
punt2=dias;
0F03:1A3A
0F03:1A3B
31
28
31
30
31
punt2
0F07:0417
0F
0F07:0418
03
0F07:0419
1A
0F07:041A
38
0F07:041B
0F
0F07:041C
03
0F07:041D
1A
0F07:041E
3E
0F07:041F
0F
Pgina 952
Fundamentosdelaprogramacin:Punterosymemoriadinmica(Anexo)
Pgina 953
LuisHernndezYez
Fundamentosdelaprogramacin:Punterosymemoriadinmica(Anexo)
arraypunt.cpp
LuisHernndezYez
Fundamentosdelaprogramacin:Punterosymemoriadinmica(Anexo)
Pgina 954
...
intPtr punt=lista.elementos;
punt
lista.elementos
13
47
53
19
48
...
98
99
LuisHernndezYez
lista.cont
Fundamentosdelaprogramacin:Punterosymemoriadinmica(Anexo)
Pgina 955
...
for(int i=0;i<lista.cont;i++){
cout<<*punt <<endl;
punt++;
}
i
punt
lista.elementos
13
47
53
19
48
lista.cont
...
98
99
LuisHernndezYez
Fundamentosdelaprogramacin:Punterosymemoriadinmica(Anexo)
Pgina 956
...
for(int i=0;i<lista.cont;i++){
cout<<*punt <<endl;
punt++;
}
i
punt
lista.elementos
13
47
53
19
48
...
98
99
LuisHernndezYez
lista.cont
Fundamentosdelaprogramacin:Punterosymemoriadinmica(Anexo)
Pgina 957
...
for(int i=0;i<lista.cont;i++){
cout<<*punt <<endl;
punt++;
}
i
punt
lista.elementos
4
13
13
47
53
19
48
lista.cont
...
98
99
LuisHernndezYez
Fundamentosdelaprogramacin:Punterosymemoriadinmica(Anexo)
Pgina 958
...
for(int i=0;i<lista.cont;i++){
cout<<*punt <<endl;
punt++;
}
i
lista.cont
LuisHernndezYez
punt
lista.elementos
4
13
3
13
47
53
19
48
...
98
99
. . .
Fundamentosdelaprogramacin:Punterosymemoriadinmica(Anexo)
Pgina 959
...
for(int i=0;i<lista.cont;i++){
cout<<*punt <<endl;
punt++;
}
i
punt
lista.elementos
4
13
3
47
53
19
7
13
47
53
19
48
lista.cont
...
98
99
LuisHernndezYez
Fundamentosdelaprogramacin:Punterosymemoriadinmica(Anexo)
Pgina 960
...
for(int i=0;i<lista.cont;i++){
cout<<*punt <<endl;
punt++;
}
i
punt
lista.elementos
13
47
53
19
48
...
98
99
LuisHernndezYez
lista.cont
4
13
3
47
53
19
7
48
Fundamentosdelaprogramacin:Punterosymemoriadinmica(Anexo)
Pgina 961
LuisHernndezYez
Fundamentosdelaprogramacin:Punterosymemoriadinmica(Anexo)
Pgina 962
Fundamentosdelaprogramacin:Punterosymemoriadinmica(Anexo)
Pgina 963
LuisHernndezYez
Fundamentosdelaprogramacin:Punterosymemoriadinmica(Anexo)
Pgina 964
sig
tLista
LuisHernndezYez
Vaca
Elemento seguido de una lista
Definicin recursiva!
Fundamentosdelaprogramacin:Punterosymemoriadinmica(Anexo)
Pgina 965
LuisHernndezYez
tLista lista=NULL;//Listavaca
lista
Fundamentosdelaprogramacin:Punterosymemoriadinmica(Anexo)
Pgina 966
structtNodo;
typedef tNodo *tLista;
structtNodo {
tRegistro reg;
tLista sig;
};
LuisHernndezYez
tLista lista=NULL;//Listavaca
lista=new tNodo;
lista>reg =nuevo();
lista>sig=NULL;
lista
tem1
Fundamentosdelaprogramacin:Punterosymemoriadinmica(Anexo)
Pgina 967
tLista lista=NULL;//Listavaca
lista=new tNodo;
lista>reg =nuevo();
lista>sig=NULL;
tLista p;
p=lista;
LuisHernndezYez
lista
tem1
Fundamentosdelaprogramacin:Punterosymemoriadinmica(Anexo)
Pgina 968
tLista lista=NULL;//Listavaca
lista=new tNodo;
lista>reg =nuevo();
lista>sig=NULL;
tLista p;
p=lista;
p>sig=new tNodo;
p>sig>reg =nuevo();
p>sig>sig =NULL;
LuisHernndezYez
lista
tem1
tem2
Fundamentosdelaprogramacin:Punterosymemoriadinmica(Anexo)
Pgina 969
LuisHernndezYez
tLista lista=NULL;//Listavaca
lista=new tNodo;
lista>reg =nuevo();
lista>sig=NULL;
tLista p;
p=lista;
p>sig=new tNodo;
p>sig>reg =nuevo();
p>sig>sig =NULL;
p=p>sig;
p>sig=new tNodo;
p>sig>reg =nuevo();
p>sig>sig =NULL;
p
...
lista
tRegistro
tRegistro
Fundamentosdelaprogramacin:Punterosymemoriadinmica(Anexo)
tRegistro
Pgina 970
tRegistro
tRegistro
tRegistro
LuisHernndezYez
Fundamentosdelaprogramacin:Punterosymemoriadinmica(Anexo)
Pgina 971
listaenlazada.h
structtNodo;
typedef tNodo *tLista;
struct tNodo {
tRegistro reg;
tLista sig;
};
LuisHernndezYez
Fundamentosdelaprogramacin:Punterosymemoriadinmica(Anexo)
Pgina 972
LuisHernndezYez
listaenlazada.cpp
void insertar(tLista&lista,tRegistro registro, bool &ok){
ok=true;
tLista nuevo=new tNodo;
if (nuevo==NULL){
ok=false;//Nohaymsmemoriadinmica
}
else {
nuevo>reg =registro;
nuevo>sig=NULL;
if (lista==NULL){//Listavaca
lista
lista=nuevo;
}
nuevo
else {
tLista p=lista;
//Localizamoselltimonodo...
while (p>sig!=NULL){
nuevo
p=p>sig;
}
p
p>sig=nuevo;
}
lista
}
}...
Fundamentosdelaprogramacin:Punterosymemoriadinmica(Anexo)
Pgina 973
LuisHernndezYez
else {
lista
tLista ant=p;
p=p>sig;
bool encontrado=false;
while ((p!=NULL)&&!encontrado){
if (p>reg.codigo ==code){
ant
encontrado=true;
}
else {
lista
ant=p;
p=p>sig;
}
}...
Fundamentosdelaprogramacin:Punterosymemoriadinmica(Anexo)
Pgina 974
if (!encontrado){
ok=false;//Noexisteesecdigo
}
else {
ant>sig=p>sig;
delete p;
}
}
}
...
ant
LuisHernndezYez
lista
Fundamentosdelaprogramacin:Punterosymemoriadinmica(Anexo)
Pgina 975
LuisHernndezYez
LuisHernndezYez
Fundamentosdelaprogramacin:Punterosymemoriadinmica(Anexo)
Pgina 976
Fundamentosdelaprogramacin:Punterosymemoriadinmica(Anexo)
Pgina 977
if (lista==NULL){
lista=new tNodo;
ult =lista;
}
else {
ult>sig=new tNodo;
ult =ult>sig;
}
ult>reg =registro;
ult>sig=NULL;
archivo>>registro.codigo;
}
archivo.close();
LuisHernndezYez
}
return ok;
}...
Fundamentosdelaprogramacin:Punterosymemoriadinmica(Anexo)
Pgina 978
LuisHernndezYez
Pgina 979
LuisHernndezYez
Pgina 980
Fundamentosdelaprogramacin
10
Grado en Ingeniera Informtica
Grado en Ingeniera del Software
Grado en Ingeniera de Computadores
Luis Hernndez Yez
LuisHernndezYez
Facultad de Informtica
Universidad Complutense
Conceptoderecursin
Algoritmosrecursivos
Funcionesrecursivas
Diseodefuncionesrecursivas
Modelodeejecucin
Lapiladelsistema
Lapilaylasllamadasafuncin
Ejecucindelafuncinfactorial()
Tiposderecursin
Recursinsimple
Recursinmltiple
Recursinanidada
Recursincruzada
Cdigodelsubprogramarecursivo
Parmetrosyrecursin
Ejemplosdealgoritmosrecursivos
Bsquedabinaria
TorresdeHanoi
Recursinfrenteaiteracin
Estructurasdedatosrecursivas
Fundamentosdelaprogramacin:Introduccinalarecursin
983
986
987
989
990
992
994
1005
1018
1019
1020
1022
1026
1027
1032
1034
1035
1038
1043
1045
LuisHernndezYez
Fundamentosdelaprogramacin:Introduccinalarecursin
Pgina 983
(N >= 0)
Cada tringulo est
formado por otros
tringulos ms pequeos
LuisHernndezYez
(http://farm1.static.flickr.com/83
/229219543_edf740535b.jpg)
(wikipedia.org)
Factorial(N) = N x Factorial(N1)
El factorial se define en funcin de s mismo
Los programas no pueden manejar la recursin infinita
La definicin recursiva debe adjuntar uno o ms casos base
Caso base: aquel en el que no se utiliza la definicin recursiva
Proporcionan puntos finales de clculo:
Caso recursivo (induccin)
si N = 0
Fundamentosdelaprogramacin:Introduccinalarecursin
Pgina 985
Fundamentosdelaprogramacin:Introduccinalarecursin
Pgina 986
LuisHernndezYez
LuisHernndezYez
Factorial(N)
N x Factorial(N1) si N > 0
Funciones recursivas
Una funcin puede implementar un algoritmo recursivo
La funcin se llamar a s misma si no se ha llegado al caso base
LuisHernndezYez
Factorial(N)
si N = 0
N x Factorial(N1)
si N > 0
Pgina 987
factorial.cpp
Funciones recursivas
longlong int factorial(int n){
longlong intresultado;
if (n==0){//Caso base
resultado =1;
}
else {
resultado =n*factorial(n 1);
}
return resultado;
}
5 x 4 x 3 x factorial(2) 5 x 4 x 3 x 2 x factorial(1)
5 x 4 x 3 x 2 x 1 x factorial(0) 5 x 4 x 3 x 2 x 1 x 1
120
Caso base
Fundamentosdelaprogramacin:Introduccinalarecursin
Pgina 988
si N = 0
N x Factorial(N1)
si N > 0
Pgina 989
Fundamentosdelaprogramacin:Introduccinalarecursin
Pgina 990
LuisHernndezYez
LuisHernndezYez
Factorial(N)
LuisHernndezYez
Fundamentosdelaprogramacin:Introduccinalarecursin
Pgina 991
Montn(Heap)
Llamadas a subprogramas
Datos delprograma
LuisHernndezYez
Cdigodelprograma
Memoria principal
S.O.
Fundamentosdelaprogramacin:Introduccinalarecursin
Pgina 992
Entra
4
Entra
7
Entra
2
Sale
2
LuisHernndezYez
2
4
Fundamentosdelaprogramacin:Introduccinalarecursin
Pgina 993
LuisHernndezYez
Llamada a funcin:
Entra la direccin de vuelta
Fundamentosdelaprogramacin:Introduccinalarecursin
Pgina 994
Pila
LuisHernndezYez
Entrada en la funcin:
Se alojan los datos locales
int main(){
...
cout<<funcA(4);
<DIR1>
...
<DIR1>
Pila
Fundamentosdelaprogramacin:Introduccinalarecursin
Pgina 995
LuisHernndezYez
Llamada a funcin:
Entra la direccin de vuelta
int main(){
...
cout<<funcA(4);
<DIR1>
...
Fundamentosdelaprogramacin:Introduccinalarecursin
b
a
<DIR1>
Pila
Pgina 996
Entrada en la funcin:
Se alojan los datos locales
LuisHernndezYez
<DIR2>
b
a
int main(){
...
cout<<funcA(4);
<DIR1>
...
<DIR1>
Pila
Fundamentosdelaprogramacin:Introduccinalarecursin
Pgina 997
Vuelta de la funcin:
Se eliminan los datos locales
LuisHernndezYez
Fundamentosdelaprogramacin:Introduccinalarecursin
x
<DIR2>
b
a
<DIR1>
Pila
Pgina 998
Vuelta de la funcin:
Sale la direccin de vuelta
LuisHernndezYez
<DIR2>
b
a
int main(){
...
cout<<funcA(4);
<DIR1>
...
<DIR1>
Pila
Fundamentosdelaprogramacin:Introduccinalarecursin
Pgina 999
LuisHernndezYez
La ejecucin contina
en esa direccin
int main(){
...
cout<<funcA(4);
<DIR1>
...
Fundamentosdelaprogramacin:Introduccinalarecursin
b
a
<DIR1>
Pila
Pgina 1000
LuisHernndezYez
Vuelta de la funcin:
Se eliminan los datos locales
int main(){
...
cout<<funcA(4);
<DIR1>
...
b
a
<DIR1>
Pila
Fundamentosdelaprogramacin:Introduccinalarecursin
Pgina 1001
LuisHernndezYez
Vuelta de la funcin:
Sale la direccin de vuelta
int main(){
...
cout<<funcA(4);
<DIR1>
...
Fundamentosdelaprogramacin:Introduccinalarecursin
<DIR1>
Pila
Pgina 1002
LuisHernndezYez
Pila
La ejecucin contina
en esa direccin
Fundamentosdelaprogramacin:Introduccinalarecursin
Pgina 1003
LuisHernndezYez
V U E LTAS
int funcB(...){
...
...funcC(...)
}
int funcA(...){
...
...funcB(...)
}
int main(){
...
cout<<funcA(...);
...
Fundamentosdelaprogramacin:Introduccinalarecursin
LLAMADAS
...
int funcC(...){
...
}
funcC
funcB
funcA
Pila
Pgina 1004
LuisHernndezYez
cout<<factorial(5)<<endl;
Fundamentosdelaprogramacin:Introduccinalarecursin
Pgina 1005
factorial(5)
LuisHernndezYez
resultado=?
n=5
Pila
Fundamentosdelaprogramacin:Introduccinalarecursin
Pgina 1006
factorial(5)
factorial(4)
resultado =?
n=4
LuisHernndezYez
resultado=?
n=5
Pila
Fundamentosdelaprogramacin:Introduccinalarecursin
Pgina 1007
factorial(5)
factorial(4)
factorial(3)
resultado=?
n=3
resultado =?
n=4
LuisHernndezYez
resultado=?
n=5
Pila
Fundamentosdelaprogramacin:Introduccinalarecursin
Pgina 1008
factorial(5)
factorial(4)
factorial(3)
factorial(2)
resultado=?
n=2
resultado=?
n=3
resultado =?
n=4
LuisHernndezYez
resultado=?
n=5
Pila
Fundamentosdelaprogramacin:Introduccinalarecursin
Pgina 1009
factorial(5)
factorial(4)
factorial(3)
factorial(2)
factorial(1)
resultado=?
n=1
resultado=?
n=2
resultado=?
n=3
resultado =?
n=4
LuisHernndezYez
resultado=?
n=5
Pila
Fundamentosdelaprogramacin:Introduccinalarecursin
Pgina 1010
factorial(5)
factorial(4)
factorial(3)
factorial(2)
factorial(1)
factorial(0)
resultado=1
n=0
resultado=?
n=1
resultado=?
n=2
resultado=?
n=3
resultado =?
n=4
LuisHernndezYez
resultado=?
n=5
Pila
Fundamentosdelaprogramacin:Introduccinalarecursin
Pgina 1011
factorial(5)
factorial(4)
factorial(3)
factorial(2)
factorial(1)
factorial(0)
resultado=1
n=1
resultado=?
n=2
resultado=?
n=3
resultado =?
n=4
LuisHernndezYez
resultado=?
n=5
Pila
Fundamentosdelaprogramacin:Introduccinalarecursin
Pgina 1012
factorial(5)
factorial(4)
factorial(3)
factorial(2)
factorial(1)
factorial(0)
1
1
resultado=2
n=2
resultado=?
n=3
resultado =?
n=4
LuisHernndezYez
resultado=?
n=5
Pila
Fundamentosdelaprogramacin:Introduccinalarecursin
Pgina 1013
factorial(5)
factorial(4)
factorial(3)
factorial(2)
factorial(1)
factorial(0)
1
1
2
resultado=6
n=3
resultado =?
n=4
LuisHernndezYez
resultado=?
n=5
Pila
Fundamentosdelaprogramacin:Introduccinalarecursin
Pgina 1014
factorial(5)
factorial(4)
factorial(3)
factorial(2)
factorial(1)
factorial(0)
1
1
2
resultado =24
n=4
LuisHernndezYez
resultado=?
n=5
Pila
Fundamentosdelaprogramacin:Introduccinalarecursin
Pgina 1015
factorial(5)
factorial(4)
factorial(3)
factorial(2)
factorial(1)
factorial(0)
1
1
2
LuisHernndezYez
6
24
resultado=120
n=5
Pila
Fundamentosdelaprogramacin:Introduccinalarecursin
Pgina 1016
factorial(5)
factorial(4)
factorial(3)
factorial(2)
factorial(1)
factorial(0)
1
1
2
24
120
Pila
Fundamentosdelaprogramacin:Introduccinalarecursin
Pgina 1017
Fundamentosdelaprogramacin:Introduccinalarecursin
Pgina 1018
LuisHernndezYez
LuisHernndezYez
Fundamentosdelaprogramacin:Introduccinalarecursin
Pgina 1019
Fib(n)
si n = 0
si n = 1
Fib(n1) + Fib(n2)
si n > 1
LuisHernndezYez
Fundamentosdelaprogramacin:Introduccinalarecursin
Pgina 1020
fibonacci.cpp
LuisHernndezYez
...
int main(){
for(int i=0;i<20;i++){
cout<<fibonacci(i)<<endl;
}
return 0;
}
Fib(n)
si n = 0
si n = 1
Fib(n1) + Fib(n2)
si n > 1
Pgina 1021
Ack(m, n)
n + 1
si m = 0
Ack(m1, 1)
si m > 0 y n = 0
si m > 0 y n > 0
LuisHernndezYez
Fundamentosdelaprogramacin:Introduccinalarecursin
Pgina 1022
ackermann.cpp
LuisHernndezYez
Nmeros de Ackermann
Ack(m, n)
n + 1
si m = 0
Ack(m1, 1)
si m > 0 y n = 0
Nmeros de Ackermann
Ack(m, n)
ackermann(1,1)
Pgina 1023
n + 1
si m = 0
Ack(m1, 1)
si m > 0 y n = 0
si m > 0 y n > 0
ackermann(0,ackermann(1,0))
2
3
ackermann(0,1)
LuisHernndezYez
ackermann(0,2)
Fundamentosdelaprogramacin:Introduccinalarecursin
Pgina 1024
Nmeros de Ackermann
Ack(m, n)
ackermann(2,1)
n + 1
si m = 0
Ack(m1, 1)
si m > 0 y n = 0
si m > 0 y n > 0
ackermann(1, ackermann(2,0))
3
ackermann(1,1)
ackermann(0,ackermann(1,0))
ackermann(0,1)
ackermann(0,2)
ackermann(1,3)
ackermann(0, ackermann(1,1))
ackermann(0,ackermann(1,0))
3
ackermann(0,3)
ackermann(0,1)
ackermann(0,2)
ackermann(0,4)
Fundamentosdelaprogramacin:Introduccinalarecursin
Pgina 1025
Fundamentosdelaprogramacin:Introduccinalarecursin
Pgina 1026
LuisHernndezYez
LuisHernndezYez
ackermann(0,ackermann(1,2))
LuisHernndezYez
Pgina 1027
LuisHernndezYez
func(5);
El cdigo anterior se ejecuta
para los sucesivos valores de n (5, 4, 3, ...)
El cdigo posterior al revs (1, 2, 3, ...)
Fundamentosdelaprogramacin:Introduccinalarecursin
Pgina 1028
directo.cpp
LuisHernndezYez
}
void mostrar(tLista lista,int pos){
if (pos<lista.cont){
cout<<lista.elementos[pos]<<endl;
mostrar(lista,pos+1);
}
}
Fundamentosdelaprogramacin:Introduccinalarecursin
Pgina 1029
inverso.cpp
LuisHernndezYez
}
void mostrar(tLista lista,int pos){
if (pos<lista.cont){
mostrar(lista,pos+1);
cout<<lista.elementos[pos]<<endl;
}
}
Fundamentosdelaprogramacin:Introduccinalarecursin
Pgina 1030
LuisHernndezYez
Fundamentosdelaprogramacin:Introduccinalarecursin
Pgina 1031
LuisHernndezYez
Pgina 1032
LuisHernndezYez
Fundamentosdelaprogramacin:Introduccinalarecursin
Pgina 1033
LuisHernndezYez
Pgina 1034
LuisHernndezYez
Fundamentosdelaprogramacin:Introduccinalarecursin
Pgina 1035
LuisHernndezYez
binaria.cpp
int buscar(tLista lista,int buscado,int ini,int fin){
int pos=1;
if (ini<=fin){
int mitad=(ini+fin)/2;
if (buscado==lista.elementos[mitad]){
pos=mitad;
}
elseif(buscado<lista.elementos[mitad]){
pos=buscar(lista,buscado,ini,mitad 1);
}
else{
pos=buscar(lista,buscado,mitad+1,fin);
}
}
return pos;
}
Pgina 1036
LuisHernndezYez
Pgina 1037
LuisHernndezYez
Fundamentosdelaprogramacin:Introduccinalarecursin
Pgina 1038
LuisHernndezYez
Mover 4 discos de A a C
Fundamentosdelaprogramacin:Introduccinalarecursin
Pgina 1039
Mover 3 discos de A a B
LuisHernndezYez
Fundamentosdelaprogramacin:Introduccinalarecursin
Pgina 1040
hanoi.cpp
int main(){
int n;
cout<<"Nmerodetorres:";
cin>>n;
hanoi(n,'A','C','B');
return 0;
}
Fundamentosdelaprogramacin:Introduccinalarecursin
Pgina 1041
Fundamentosdelaprogramacin:Introduccinalarecursin
Pgina 1042
LuisHernndezYez
LuisHernndezYez
...
void hanoi(int n,char origen,char destino,char auxiliar){
if (n>0){
hanoi(n 1,origen,auxiliar,destino);
cout<<origen<<">"<<destino<<endl;
hanoi(n 1,auxiliar,destino,origen);
}
}
assert(n>=0);
assert(n>=0);
if (n==0){
fact=1;
}
else {
fact=n*factorial(n 1);
}
return fact;
LuisHernndezYez
Fundamentosdelaprogramacin:Introduccinalarecursin
Pgina 1043
LuisHernndezYez
Qu es preferible?
Cualquier algoritmo recursivo tiene uno iterativo equivalente
Los recursivos son menos eficientes que los iterativos:
Sobrecarga de las llamadas a subprograma
Si hay una versin iterativa sencilla, ser preferible a la recursiva
En ocasiones la versin recursiva es mucho ms simple
Ser preferible si no hay requisitos de rendimiento
Compara las versiones recursivas del factorial o de los nmeros
de Fibonacci con sus equivalentes iterativas
Y qu tal una versin iterativa para los nmeros de Ackermann?
Fundamentosdelaprogramacin:Introduccinalarecursin
Pgina 1044
LuisHernndezYez
Fundamentosdelaprogramacin:Introduccinalarecursin
Pgina 1045
LuisHernndezYez
Lista
(Caso base)
Pgina 1046
LuisHernndezYez
Fundamentosdelaprogramacin:Introduccinalarecursin
Pgina 1047
LuisHernndezYez
Pgina 1048
Fundamentosdelaprogramacin
AP
Grado en Ingeniera Informtica
Grado en Ingeniera del Software
Grado en Ingeniera de Computadores
Luis Hernndez Yez
Facultad de Informtica
Universidad Complutense
LuisHernndezYez
Flujos
Archivosbinarios
Tamaodelosdatos:Eloperadorsizeof()
Aperturadearchivosbinarios
Lecturadearchivosbinarios(accesosecuencial)
Escrituraenarchivosbinarios(accesosecuencial)
Accesodirectooaleatorio
Ejemplosdeusodearchivosbinarios
Ordenacindelosregistrosdelarchivo
Bsquedabinaria
Insercinenunarchivobinarioordenado
Cargadelosregistrodeunarchivoenunatabla
Almacenamientodeunatablaenunarchivo
Fundamentosdelaprogramacin:Archivosbinarios
1051
1054
1056
1059
1061
1066
1070
1078
1079
1085
1088
1092
1093
LuisHernndezYez
Fundamentosdeprogramacin:Archivosbinarios
Pgina 1051
Flujos
Canalizan la E/S entre los dispositivos y el programa
En forma de secuencias de caracteres
La entrada puede proceder de un dispositivo o de un archivo
La salida puede dirigirse a un dispositivo o a un archivo
Siempre por medio de flujos
Dispositivos/archivos
de salida
LuisHernndezYez
Dispositivos/archivos
de entrada
Programa
Fundamentosdeprogramacin:Archivosbinarios
Pgina 1052
25
2F
04
D6
FF
00
27
6C
CA
49
07
5F
A4
Fundamentosdeprogramacin:Archivosbinarios
Pgina 1053
Fundamentosdeprogramacin:Archivosbinarios
Pgina 1054
LuisHernndezYez
LuisHernndezYez
Lo que signifiquen los cdigos depender del programa que use el archivo
LuisHernndezYez
00000111011011001100000101010110Hex: 076CC156
Flujo binario
07
6C
C1
56
Fundamentosdeprogramacin:Archivosbinarios
Pgina 1055
El operador sizeof()
LuisHernndezYez
Pgina 1056
typedef struct {
int cod;
double val;
} tRegistro;
tRegistro reg;
const int SIZE=sizeof(reg);
MEMORIA
...
reg
...
SIZE
(12)
LuisHernndezYez
00
00
05
0A
37
1C
DF
03
92
Fundamentosdeprogramacin:Archivosbinarios
0F03:1A38
00
0F03:1A39
00
0F03:1A3A
00
0F03:1A3B
05
0F03:1A3C
0A
0F03:1A3D
37
0F03:1A3E
1C
0F03:1A3F
DF
0F03:1A40
03
0F03:1A41
92
0F03:1A42
99
0F03:1A43
0E
0F03:1A44
...
99
reg.cod
(4)
reg.val
(8)
0E
Pgina 1057
LuisHernndezYez
typedef struct {
char c;
int i;
} tRegistro;
const int SIZE=sizeof(tRegistro);
NOTA: El tamao de palabra y los tamaos de los tipos dependen del sistema concreto
Fundamentosdeprogramacin:Archivosbinarios
Pgina 1058
LuisHernndezYez
Fundamentosdeprogramacin:Archivosbinarios
Pgina 1059
Biblioteca fstream
LuisHernndezYez
Significado
ios::app
ios::binary
ios::in
ios::out
ios::trunc
Pgina 1060
LuisHernndezYez
Fundamentosdeprogramacin:Archivosbinarios
Pgina 1061
archivo.read(puntero_al_bfer,nmero)
bfer: variable destino de los caracteres ledos
Pasado como puntero a secuencia de caracteres
Referencia (&) a la variable destino
Molde de puntero a carcter (char *)
nmero: cantidad de caracteres a extraer del archivo
Operador sizeof()
Archivo abierto con los modos ios::in e ios::binary
LuisHernndezYez
archivo.read((char *)®istro,sizeof(tRegistro));
Fundamentosdeprogramacin:Archivosbinarios
Pgina 1062
LuisHernndezYez
Funcin gcount()
N de caracteres realmente ledos en la ltima operacin
Si coincide con el nmero que se solicitaron leer: OK
Si son menos, se ha alcanzado el final del archivo: Fallo
tRegistro registro;
fstream archivo;
archivo.open("entrada.dat",ios::in|ios::binary);
archivo.read((char *)®istro,sizeof(tRegistro));
if (archivo.gcount()<sizeof(tRegistro)){
//Falloenlalectura
}
else {
//LecturaOK
...
Fundamentosdeprogramacin:Archivosbinarios
Pgina 1063
leer.cpp
LuisHernndezYez
#include<iostream>
usingnamespacestd;
#include<fstream>
#include"registro.h"
int main(){
tRegistro registro;
fstream archivo;
archivo.open("bd.dat",ios::in |ios::binary);
archivo.read((char *)®istro,SIZE);
int cuantos=archivo.gcount();
while (cuantos==SIZE){
mostrar(registro);
archivo.read((char *)®istro,SIZE);
cuantos=archivo.gcount();
}
archivo.close();
No olvides cerrar el archivo!
return 0;
}
Fundamentosdeprogramacin:Archivosbinarios
Pgina 1064
registro.h
El tipo tRegistro
Fundamentosdeprogramacin:Archivosbinarios
Pgina 1065
Fundamentosdeprogramacin:Archivosbinarios
Pgina 1066
LuisHernndezYez
LuisHernndezYez
constint Max=80;
typedefchar tCadena[Max];
typedef struct {
int codigo;
tCadena item;
double valor;
}tRegistro;
const int SIZE=sizeof(tRegistro);
archivo.write(puntero_al_bfer,nmero)
bfer: origen de los caracteres a escribir en el archivo
Pasado como puntero a secuencia de caracteres
Referencia (&) a la variable destino
Molde de puntero a carcter (char *)
nmero: cantidad de caracteres a escribir en el archivo
Operador sizeof()
Archivo abierto con los modos ios::out e ios::binary
LuisHernndezYez
archivo.write((char *)®istro,sizeof(tRegistro));
Fundamentosdeprogramacin:Archivosbinarios
Pgina 1067
escribir.cpp
LuisHernndezYez
#include<iostream>
usingnamespace std;
#include<fstream>
#include"registro.h"
int main(){
tRegistro registro;
fstream archivo;
archivo.open("bd2.dat",ios::out |ios::binary);
bool seguir=true;
while (seguir){
cout<<"Cdigo:";
cin.sync();
cin>>registro.codigo;
cout<<"Nombre:";
cin.sync();
cin.getline(registro.item,Max);//Mx:80
...
Fundamentosdeprogramacin:Archivosbinarios
Pgina 1068
cout<<"Precio:";
cin.sync();
cin>>registro.valor;
archivo.write((char *)®istro,SIZE);
cout<<"Otro[S/N]?";
charc;
cin>>c;
if ((c=='n')||(c=='N')){
seguir=false;
}
}
archivo.close();
Fundamentosdeprogramacin:Archivosbinarios
Pgina 1069
Fundamentosdeprogramacin:Archivosbinarios
Pgina 1070
LuisHernndezYez
LuisHernndezYez
return 0;
LuisHernndezYez
Fundamentosdeprogramacin:Archivosbinarios
Pgina 1071
ios::beg
0
ios::end
SIZE
2*SIZE
3*SIZE
4*SIZE
6*SIZE
5*SIZE
SIZE
SIZE
SIZE
SIZE
SIZE
SIZE
tRegistro
tRegistro
tRegistro
tRegistro
tRegistro
tRegistro
archivo.seekg(0,ios::end);//0car.desdeelfinal>final
int pos=archivo.tellg();//Totaldecaracteresdelarchivo
int numReg =pos/SIZE;
Fundamentosdeprogramacin:Archivosbinarios
Pgina 1072
ios::beg
0
ios::end
SIZE
2*SIZE
3*SIZE
4*SIZE
6*SIZE
5*SIZE
SIZE
SIZE
SIZE
SIZE
SIZE
SIZE
tRegistro
tRegistro
tRegistro
tRegistro
tRegistro
tRegistro
LuisHernndezYez
archivo.seekg((num 1)*SIZE,ios::beg);
Fundamentosdeprogramacin:Archivosbinarios
Pgina 1073
Lecturas y escrituras
Una vez ubicado el puntero al principio de un registro,
se puede leer el registro o actualizar (escribir) el registro
Si se ubica al final, se puede aadir (escribir) un nuevo registro
Archivos binarios de lectura/escritura:
Se han de abrir con los modos ios::in, ios::out e ios::binary
archivo.open("bd.dat",ios::in |ios::out |ios::binary);
LuisHernndezYez
Fundamentosdeprogramacin:Archivosbinarios
Pgina 1074
actualizar.cpp
//Actualizacindeunregistro
#include<iostream>
usingnamespacestd;
#include<fstream>
#include"registro.h"
LuisHernndezYez
int main(){
tRegistro registro;
fstream archivo;
archivo.open("bd.dat",ios::in |ios::out |ios::binary);
archivo.seekg(0,ios::end);
int pos=archivo.tellg();
int numReg =pos/SIZE;
cout<<"Nmeroderegistros:" <<numReg <<endl;
int num;
cout<<"Registronmero?";
cin>>num;
...
LuisHernndezYez
Fundamentosdeprogramacin:Archivosbinarios
Pgina 1075
if ((num>0)&&(num<=numReg)){
archivo.seekg((num 1)*SIZE,ios::beg);
archivo.read((char *)®istro,SIZE);
mostrar(registro);
cout<<endl<<"Cambiarnombre[S/N]?";
char c;
cin.sync();
cin>>c;
if ((c=='s')||(c=='S')){
cout<<"Nombre:";
cin.sync();
cin.getline(registro.item,80);
}
cout<<endl<<"Cambiarprecio[S/N]?";
cin.sync();
cin>>c;
if ((c=='s')||(c=='S')){
cout<<"Precio:";
cin>>registro.valor;
}
...
Fundamentosdeprogramacin:Archivosbinarios
Pgina 1076
archivo.seekg((num 1)*SIZE,ios::beg);
archivo.write((char *)®istro,SIZE);
cout<<endl<<"Registroactualizado:" <<endl;
archivo.seekg((num 1)*SIZE,ios::beg);
archivo.read((char *)®istro,SIZE);
mostrar(registro);
}
archivo.close();
return 0;
LuisHernndezYez
Pgina 1077
Fundamentosdeprogramacin:Archivosbinarios
Pgina 1078
LuisHernndezYez
Fundamentosdeprogramacin:Archivosbinarios
ordenar.cpp
LuisHernndezYez
void mostrar();
...
Fundamentosdeprogramacin:Archivosbinarios
Pgina 1079
void mostrar(){
fstream archivo;
tRegistro registro;
int cuantos;
LuisHernndezYez
archivo.open(BD,ios::in |ios::binary);
archivo.read((char *)®istro,SIZE);
cuantos=archivo.gcount();
while (cuantos==SIZE){
mostrar(registro);
archivo.read((char *)®istro,SIZE);
cuantos=archivo.gcount();
}
archivo.close();
}
...
Fundamentosdeprogramacin:Archivosbinarios
Pgina 1080
int main(){
LuisHernndezYez
mostrar();
Orden inicial
fstream archivo;
archivo.open(BD,ios::in |ios::out |ios::binary);
archivo.seekg(0,ios::end);
int pos=archivo.tellg();
int numReg =pos/SIZE;
...
Fundamentosdeprogramacin:Archivosbinarios
Pgina 1081
//Ordenamosconelmtododeseleccindirecta
tRegistro regMenor,reg;
for (int i=0;i<numReg 1;i++){
int menor=i;
for (int j=i+1;j<numReg;j++){
archivo.seekg(menor*SIZE,ios::beg);
archivo.read((char *)®Menor,SIZE);
archivo.seekg(j*SIZE,ios::beg);
archivo.read((char *)®,SIZE);
if(strcmp(reg.item,regMenor.item)<0){
menor=j;
}
}
regMenor
reg
...
j
LuisHernndezYez
menor
i
Fundamentosdeprogramacin:Archivosbinarios
Pgina 1082
if (menor>i){//Intercambiamos
archivo.seekg(i*SIZE,ios::beg);
archivo.read((char *)®,SIZE);
archivo.seekg(menor*SIZE,ios::beg);
archivo.read((char *)®Menor,SIZE);
archivo.seekg(i*SIZE,ios::beg);
archivo.write((char *)®Menor,SIZE);
archivo.seekg(menor*SIZE,ios::beg);
archivo.write((char *)®,SIZE);
}
}
...
reg
Fundamentosdeprogramacin:Archivosbinarios
regMenor
LuisHernndezYez
menor
Pgina 1083
archivo.close();
cout<<endl<<"Trasordenar:"<<endl<<endl;
mostrar();
return 0;
LuisHernndezYez
Fundamentosdeprogramacin:Archivosbinarios
Pgina 1084
buscar.cpp
LuisHernndezYez
void mostrar();
int main(){
mostrar();
tRegistro registro;
fstream archivo;
...
LuisHernndezYez
Fundamentosdeprogramacin:Archivosbinarios
Pgina 1085
archivo.open(BD,ios::in|ios::binary);
archivo.seekg(0,ios::end);
int pos=archivo.tellg();
int numReg =pos/SIZE;
int buscado;
cout<<"Cdigoabuscar:";
cin>>buscado;
int ini=0,fin=numReg 1,mitad;
bool encontrado=false;
while((ini<=fin)&&!encontrado){
mitad=(ini+fin)/2;
archivo.seekg(mitad*SIZE,ios::beg);
archivo.read((char *)®istro,SIZE);
if (buscado==registro.codigo){
encontrado=true;
}
elseif(buscado<registro.codigo){
fin=mitad 1;
}
...
Fundamentosdeprogramacin:Archivosbinarios
Pgina 1086
else{
ini=mitad+1;
}
LuisHernndezYez
}
if (encontrado){
int pos=mitad+1;
cout<<"Encontradoenlaposicin" <<pos<<endl;
mostrar(registro);
}
else{
cout<<"Noencontrado!" <<endl;
}
archivo.close();
return 0;
}
...
Fundamentosdeprogramacin:Archivosbinarios
Pgina 1087
insertar.cpp
LuisHernndezYez
void mostrar();
int main(){
mostrar();
tRegistro nuevoRegistro =nuevo(),registro;
fstream archivo;
archivo.open(BD,ios::in|ios::out |ios::binary);
archivo.seekg(0,ios::end);
int pos=archivo.tellg();
int numReg =pos/SIZE;
...
Fundamentosdeprogramacin:Archivosbinarios
Pgina 1088
LuisHernndezYez
pos=0;
bool encontrado=false;
archivo.seekg(0,ios::beg);
while ((pos<numReg)&&!encontrado){
archivo.read((char *)®istro,SIZE);
if (registro.codigo >nuevoRegistro.codigo){
encontrado=true;
}
else {
pos++;
}
}
if (pos==numReg){//Debeiralfinal
archivo.seekg(0,ios::end);
archivo.write((char *)&nuevoRegistro,SIZE);
}
...
Fundamentosdeprogramacin:Archivosbinarios
Pgina 1089
else {//Hayquehacerhueco
for (int i=numReg 1;i>=pos;i){
archivo.seekg(i*SIZE,ios::beg);
archivo.read((char *)®istro,SIZE);
archivo.seekg((i+1)*SIZE,ios::beg);
archivo.write((char *)®istro,SIZE);
}
archivo.seekg(pos*SIZE,ios::beg);
archivo.write((char *)&nuevoRegistro,SIZE);
}
archivo.close();
LuisHernndezYez
mostrar();
nuevoRegistro
return 0;
}
Fundamentosdeprogramacin:Archivosbinarios
Pgina 1090
Al principio
LuisHernndezYez
Por el medio
Al final
Fundamentosdeprogramacin:Archivosbinarios
Pgina 1091
LuisHernndezYez
tabla.cpp
void cargar(tTabla &tabla,bool &ok){
ok=true;
fstream archivo;
archivo.open(BD,ios::in |ios::binary);
if (!archivo.is_open()){
ok=false;
}
else {
archivo.seekg(0,ios::end);
int pos=archivo.tellg();
int numReg =pos/SIZE;
tabla.cont =0;
tRegistroregistro;
archivo.seekg(0,ios::beg);
for (int i=0;i<numReg;i++){
archivo.read((char *)®istro,SIZE);
tabla.registros[tabla.cont]=registro;
tabla.cont++;
}
archivo.close();
}
}
Fundamentosdeprogramacin:Archivosbinarios
Pgina 1092
tabla.cpp
LuisHernndezYez
Fundamentosdeprogramacin:Archivosbinarios
Pgina 1093
bd.cpp
LuisHernndezYez
#include<iostream>
usingnamespacestd;
#include"registro.h"
#include"tabla.h"
int main(){
tTabla tabla;
tTabla ok;
cargar(tabla,ok);
if(!ok){
cout<<"Erroralabrirelarchivo!"<<endl;
}
else {
mostrar(tabla);
insertar(tabla,nuevo(),ok);
mostrar(tabla);
guardar(tabla);
}
return 0;
}
Fundamentosdeprogramacin:Archivosbinarios
Pgina 1094
LuisHernndezYez
Pgina 1095