Documentos de Académico
Documentos de Profesional
Documentos de Cultura
FP PDF
FP 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
Tema1 Computadorasyprogramacin 1
Tema2 TiposeinstruccionesI 48
Anexo:Detallestcnicosdelostipos 212
Tema3 TiposeinstruccionesII 225
AnexoI:Eloperadorternario? 398
AnexoII:Ejemplosdesecuencias 402
Tema4 Laabstraccinprocedimental 425
Anexo:Mssobresubprogramas 496
Tema5 Tiposdedatosestructurados 512
Anexo:CadenasalestilodeC 580
Tema6 Recorridoybsquedaenarrays 588
Tema7 Algoritmosdeordenacin 649
Anexo:Mssobreordenacin 742
Tema8 Programacinmodular 755
Anexo:Ejemplodemodularizacin 832
LuisHernndezYez
Fundamentosdelaprogramacin
Informtica,computadorasyprogramacin 3
Lenguajemquinayensamblador 12
Lenguajesdeprogramacindealtonivel 15
Unpocodehistoria 19
ProgramacineIngenieradelSoftware 24
EllenguajedeprogramacinC++ 27
Sintaxisdeloslenguajesdeprogramacin 30
UnprimerprogramaenC++ 35
Herramientasdedesarrollo 39
C++:UnmejorC 45
LuisHernndezYez
Fundamentosdelaprogramacin
Constantes 167
Labibliotecacmath 171
Operacionesconcaracteres 174
Fundamentosdelaprogramacin
int 214
float 216
Notacincientfica 217
double 218
char 220
bool 221
string 222
Literalesconespecificacindetipo 223
LuisHernndezYez
Fundamentosdelaprogramacin
Lainstruccinswitch 302
Repeticin 313
Elbuclewhile 316
Fundamentosdelaprogramacin
Eloperadorternario? 399
Recorridos 404
Unaparcamiento 405
Parntesisbienemparejados? 409
Dossecuenciasiguales? 412
NmerosprimosmenoresqueN 413
Bsquedas 417
Bsquedadeunnmeroenunarchivo 419
Bsquedasensecuenciasordenadas 420
LuisHernndezYez
Fundamentosdelaprogramacin
Diseodescendente:Tareasysubtareas 427
Subprogramas 434
Subprogramasydatos 441
Parmetros 446
Argumentos 451
Resultadodelafuncin 467
Prototipos 473
Ejemploscompletos 475
Funcionesdeoperador 477
Diseodescendente(unejemplo) 480
Precondicionesypostcondiciones 490
LuisHernndezYez
Fundamentosdelaprogramacin
Archivoscomoparmetros 498
Lafuncinmain() 501
Argumentosimplcitos 504
Sobrecargadesubprogramas 508
LuisHernndezYez
Fundamentosdelaprogramacin:Laabstraccinprocedimental(Anexo)
Tiposdedatos 514
Arraysdenuevo 517
Arraysybuclesfor 520
Mssobrearrays 522
Inicializacindearrays 523
Enumeradoscomondices 524
Pasodearraysasubprogramas 525
Implementacindelistas 528
Cadenasdecaracteres 531
Cadenasdecaracteresdetipostring 535
Entrada/salidaconstring 539
Operacionesconstring 541
Estructuras 543
Estructurasdentrodeestructuras 549
Arraysdeestructuras 550
LuisHernndezYez
Arraysdentrodeestructuras 551
Listasdelongitudvariable 552
Unejemplocompleto 558
Elbucledo..while 562
Fundamentosdelaprogramacin
CadenasalestilodeC 582
E/SconcadenasalestilodeC 583
Labibliotecacstring 584
Ejemplo 585
LuisHernndezYez
Fundamentosdelaprogramacin
Recorridodearrays 590
Arrayscompletos 593
Arraysnocompletosconcentinela 594
Arraysnocompletosconcontador 595
Ejemplos 597
Generacindenmerosaleatorios 601
Bsquedasenarrays 604
Arrayscompletos 606
Arraysnocompletosconcentinela 607
Arraysnocompletosconcontador 608
Ejemplo 610
Recorridosybsquedasencadenas 614
Msejemplosdemanejodearrays 617
Arraysmultidimensionales 630
Inicializacindearraysmultidimensionales 638
LuisHernndezYez
Recorridodeunarraybidimensional 641
RecorridodeunarrayNdimensional 644
Bsquedaenunarraymultidimensional 647
Fundamentosdelaprogramacin
Algoritmosdeordenacin 651
Algoritmodeordenacinporinsercin 654
Ordenacindearraysporinsercin 665
Algoritmodeordenacinporinsercin
conintercambios 672
Clavesdeordenacin 680
Estabilidaddelaordenacin 688
Complejidadyeficiencia 692
Ordenacionesnaturales 694
Ordenacinporseleccindirecta 701
Mtododelaburbuja 716
Listasordenadas 722
Bsquedasenlistasordenadas 729
Bsquedabinaria 731
LuisHernndezYez
Fundamentosdelaprogramacin
Ordenacinporintercambio 744
Mezcladedoslistasordenadas 747
LuisHernndezYez
Fundamentosdelaprogramacin
Programasmultiarchivoycompilacinseparada 757
Interfazfrenteaimplementacin 762
Usodemdulosdebiblioteca 768
Ejemplo:GestindeunalistaordenadaI 770
Compilacindeprogramasmultiarchivo 778
Elpreprocesador 780
Cadacosaensumdulo 782
Ejemplo:GestindeunalistaordenadaII 784
Elproblemadelasinclusionesmltiples 789
Compilacincondicional 794
Proteccinfrenteainclusionesmltiples 795
Ejemplo:GestindeunalistaordenadaIII 796
Implementacionesalternativas 804
Espaciosdenombres 808
Implementacionesalternativas 817
LuisHernndezYez
Calidadyreutilizacindelsoftware 827
Fundamentosdelaprogramacin
Modularizacindeunprograma 833
LuisHernndezYez
Fundamentosdelaprogramacin
Direccionesdememoriaypunteros 849
Operadoresdepunteros 854
Punterosydireccionesvlidas 864
Punterosnoinicializados 866
Unvalorseguro:NULL 867
Copiaycomparacindepunteros 868
Tipospuntero 873
Punterosaestructuras 875
Punterosaconstantesypunterosconstantes 877
Punterosypasodeparmetros 879
Punterosyarrays 883
Memoriaydatosdelprograma 886
Memoriadinmica 891
Punterosydatosdinmicos 895
Gestindelamemoria 907
LuisHernndezYez
Errorescomunes 911
Arraysdedatosdinmicos 916
Arraysdinmicos 928
Fundamentosdelaprogramacin
Aritmticadepunteros 940
Recorridodearraysconpunteros 953
Referencias 962
Listasenlazadas 964
LuisHernndezYez
Fundamentosdelaprogramacin
Conceptoderecursin 983
Algoritmosrecursivos 986
Funcionesrecursivas 987
Diseodefuncionesrecursivas 989
Modelodeejecucin 990
Lapiladelsistema 992
Lapilaylasllamadasafuncin 994
Ejecucindelafuncinfactorial() 1005
Tiposderecursin 1018
Recursinsimple 1019
Recursinmltiple 1020
Recursinanidada 1022
Recursincruzada 1026
Cdigodelsubprogramarecursivo 1027
Parmetrosyrecursin 1032
Ejemplosdealgoritmosrecursivos 1034
LuisHernndezYez
Bsquedabinaria 1035
TorresdeHanoi 1038
Recursinfrenteaiteracin 1043
Estructurasdedatosrecursivas 1045
Fundamentosdelaprogramacin
Flujos 1051
Archivosbinarios 1054
Tamaodelosdatos:Eloperadorsizeof() 1056
Aperturadearchivosbinarios 1059
Lecturadearchivosbinarios(accesosecuencial) 1061
Escrituraenarchivosbinarios(accesosecuencial) 1066
Accesodirectooaleatorio 1070
Ejemplosdeusodearchivosbinarios 1078
Ordenacindelosregistrosdelarchivo 1079
Bsquedabinaria 1085
Insercinenunarchivobinarioordenado 1088
Cargadelosregistrodeunarchivoenunatabla 1092
Almacenamientodeunatablaenunarchivo 1093
LuisHernndezYez
Fundamentosdelaprogramacin
Fundamentosdelaprogramacin
RB
Grado en Ingeniera Informtica
Grado en Ingeniera del Software
Grado en Ingeniera de Computadores
Fundamentosdelaprogramacin
Programming. Principles and Practice Using C++
Del autor del lenguaje C++, un amplio tutorial que ensea a programar
en C++; hace un uso temprano de conceptos de orientacin a objetos y
de la STL, que quedan fuera del temario de este curso
lenguaje
Fundamentosdelaprogramacin
Fundamentosdelaprogramacin
Fundamentosdelaprogramacin
1
Grado en Ingeniera Informtica
Grado en Ingeniera del Software
Grado en Ingeniera de Computadores
Informtica,computadorasyprogramacin 3
Lenguajemquinayensamblador 12
Lenguajesdeprogramacindealtonivel 15
Unpocodehistoria 19
ProgramacineIngenieradelSoftware 24
EllenguajedeprogramacinC++ 27
Sintaxisdeloslenguajesdeprogramacin 30
UnprimerprogramaenC++ 35
Herramientasdedesarrollo 39
C++:UnmejorC 45
LuisHernndezYez
Fundamentosdelaprogramacin:Computadorasyprogramacin
LuisHernndezYez
Fundamentosdelaprogramacin:Computadorasyprogramacin Pgina 3
Computadora
Mquina electrnica, analgica o digital,
dotada de una memoria de gran capacidad
y de mtodos de tratamiento de la informacin,
capaz de resolver problemas matemticos y lgicos
LuisHernndezYez
Fundamentosdelaprogramacin:Computadorasyprogramacin Pgina 4
En todas partes y con muchas formas
LuisHernndezYez
Fundamentosdelaprogramacin:Computadorasyprogramacin Pgina 5
Hardware
Componentes que integran
la parte material
de una computadora
Software
Programas, instrucciones
y reglas informticas
para ejecutar tareas
en una computadora
LuisHernndezYez
Fundamentosdelaprogramacin:Computadorasyprogramacin Pgina 6
Programar
Indicar a la computadora qu es lo que tiene que hacer
Programa
Secuencia de instrucciones
Instrucciones que entiende la computadora
Y que persiguen un objetivo: resolver un problema!
LuisHernndezYez
Fundamentosdelaprogramacin:Computadorasyprogramacin Pgina 7
Trabajo en equipo
Mltiples roles...
Gestores
Analistas
ParqueJursico Diseadores
Programadores
Probadores
Administradores de
sistemas
...
LuisHernndezYez
Fundamentosdelaprogramacin:Computadorasyprogramacin Pgina 8
Esquema general
Memoria
temporal
UnidadCentraldeProceso
CentralProcessorUnit
Dispositivos Dispositivos
C.P.U.
de entrada de salida
Teclado Monitor
Ratn Impresora
Escner Altavoz
LuisHernndezYez
Tctil Almacenamiento
permanente
Fundamentosdelaprogramacin:Computadorasyprogramacin Pgina 9
Dispositivos de E/S
UnaALUde2bits(Wikipedia)
C.P.U. (Procesador)
A.L.U.
Unidad AritmticoLgica
Memoria
LuisHernndezYez
Unidad de Control
Fundamentosdelaprogramacin:Computadorasyprogramacin Pgina 10
La memoria
Memoria Cada celda en una direccin
01 Celdas de 8 / 16 / 32 / 64 bits
02
03
Informacin voltil
04
Bus 05 1 Bit = 0 / 1
de 06 1 Byte = 8 bits = 1 carcter
datos 07
1 Kilobyte (KB) = 1024 Bytes
08
1 Megabyte (MB) = 1024 KB
...
1 Gigabyte (GB) = 1024 MB
1 Terabyte (TB) = 1024 GB
1 Petabyte (PB) = 1024 TB
LuisHernndezYez
Direccin
210 =1024 1000
Fundamentosdelaprogramacin:Computadorasyprogramacin Pgina 11
LuisHernndezYez
Fundamentosdelaprogramacin:Computadorasyprogramacin Pgina 12
Los procesadores trabajan con ceros y unos (bits)
Unidad de memoria bsica: Byte (8 bits)
(2 dgitos hexadecimales: 01011011 0101 1011 5B)
Lenguaje mquina
Cdigos hexadecimales que representan instrucciones,
registros de la CPU, direcciones de memoria o datos
Instruccin Significado Lenguajedebajonivel
A02F Acceder a la celda de memoria 2F Dependientedelamquina
3E01 Copiarlo el registro 1 de la ALU Programacindifcil
A030 Acceder a la celda de memoria 30
LuisHernndezYez
Fundamentosdelaprogramacin:Computadorasyprogramacin Pgina 13
Mayor legibilidad:
READ2F Cdigo fuente
REG01 (lenguaje ensamblador)
READ30
REG02
ADD Programa
WRITE31 ensamblador
(lenguaje mquina)
Fundamentosdelaprogramacin:Computadorasyprogramacin Pgina 14
LuisHernndezYez
Fundamentosdelaprogramacin:Computadorasyprogramacin Pgina 15
Fundamentosdelaprogramacin:Computadorasyprogramacin Pgina 16
Traduccin #include<iostream>
usingnamespacestd;
Cdigo fuente intmain()
{
cout<<"HolaMundo!"<<endl;
Compiladores: }
return0;
Programa Paraunaarquitecturaconcreta
ejecutable yunsistemaoperativo
Fundamentosdelaprogramacin:Computadorasyprogramacin Pgina 17
Haskell
Lisp Scheme 1987
1958 1975
Logo
1968
Fundamentosdelaprogramacin:Computadorasyprogramacin Pgina 18
LuisHernndezYez
Fundamentosdelaprogramacin:Computadorasyprogramacin Pgina 19
La prehistoria
El baco
Fundamentosdelaprogramacin:Computadorasyprogramacin Pgina 20
Siglo XX
1936 Mquina de Turing
1946 ENIAC: Primera computadora digital
de propsito general
1947 El transistor
ENIAC(Wikipedia)
1953 IBM 650: Primera
computadora a gran escala
1966 ARPANET: Origen de Internet
1967 El disquete
1970 Sistema operativo UNIX
1972 Primer virus informtico (Creeper)
LuisHernndezYez
Lenguaje de programacin C
1974 Protocolo TCP. Primera red local
Fundamentosdelaprogramacin:Computadorasyprogramacin Pgina 21
IBMPC(Wikipedia)
1991 Sistema operativo Linux
Fundamentosdelaprogramacin:Computadorasyprogramacin Pgina 22
1992 Windows 3.1
1995 Lenguaje de programacin Java
DVD
1998 Se funda Google
1999 MSN Messenger
Siglo XXI
2001 Windows XP
Mac OS X
2002 Mozilla Firefox
2007 iPhone
LuisHernndezYez
Fundamentosdelaprogramacin:Computadorasyprogramacin Pgina 23
LuisHernndezYez
Fundamentosdelaprogramacin:Computadorasyprogramacin Pgina 24
Qu es programar?
Decirle a un tonto muy rpido exactamente lo que tiene que hacer
Especificar la estructura y el comportamiento de un programa,
as como probar que el programa realiza su tarea
adecuadamente y con un rendimiento aceptable
Fundamentosdelaprogramacin:Computadorasyprogramacin Pgina 25
Anlisis Qu?
Diseo Cmo?
Programacin Implementacin
Prueba y depuracin
LuisHernndezYez
Mantenimiento
Fundamentosdelaprogramacin:Computadorasyprogramacin Pgina 26
LuisHernndezYez
Fundamentosdelaprogramacin:Computadorasyprogramacin Pgina 27
#include<iostream>
usingnamespacestd;
int main()
{
cout<<"HolaMundo!"<<endl;
//MuestraHolaMundo!
LuisHernndezYez
return 0;
}
Fundamentosdelaprogramacin:Computadorasyprogramacin Pgina 28
Instrucciones
Datos: literales, variables, tipos
Subprogramas (funciones)
Comentarios
Directivas Directiva
#include<iostream>
...
usingnamespacestd;
Comentario
Dato
Instruccin return 0;
}
Fundamentosdelaprogramacin:Computadorasyprogramacin Pgina29
LuisHernndezYez
Fundamentosdelaprogramacin:Computadorasyprogramacin Pgina 30
Sintaxis y semntica de los lenguajes
Sintaxis
Reglas que determinan cmo se pueden construir
y secuenciar los elementos del lenguaje
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
<numeroentero>::=<signoopcional><secuenciadedgitos>
<signoopcional>::=+||<nada>
<secuenciadedgitos>::=<dgito>|<dgito><secuenciadedgitos>
<dgito>::=0|1|2|3|4|5|6|7|8|9 +23
<nada>::= |significa
159
1374
134
+
3.4
LuisHernndezYez
0..9 002
Fundamentosdelaprogramacin:Computadorasyprogramacin Pgina 32
<numeroentero>::=<signoopcional><secuenciadedgitos>
<signoopcional>::=+||<nada>
<secuenciadedgitos>::=<dgito>|<dgito><secuenciadedgitos>
<dgito>::=0|1|2|3|4|5|6|7|8|9
<nada>::=
+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
LuisHernndezYez
134
<numeroentero>::=<signoopcional><secuenciadedgitos>
::=<secuenciadedgitos>::=<dgito><secuenciadedgitos>
::=1<secuenciadedgitos>::=ERROR ( noes<dgito>)
Fundamentosdelaprogramacin:Computadorasyprogramacin Pgina 33
+23 +
0..9 +23
1374 +
0..9 1374
134 + ?
0..9 1
LuisHernndezYez
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
{
cout<<"HolaMundo!"<<endl;//MuestraHolaMundo!
LuisHernndezYez
return 0;
}
Fundamentosdelaprogramacin:Computadorasyprogramacin Pgina 36
Anlisis del programa
Biblioteca
Instruccin usingnamespacestd;
Coloreado sintctico
Tipo Palabrasreservadas
{
Bloquedecdigo
Instruccin
Nmero
} Cuerpodelafuncin
Lasinstruccionesterminanen;
Fundamentosdelaprogramacin:Computadorasyprogramacin Pgina 37
Hola Mundo!
Casi todo es infraestructura
Slo
cout<<"HolaMundo!"<<endl
hace algo palpable
El estilo importa!
LuisHernndezYez
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++
Instalacin y uso:
Seccin
Herramientasdedesarrollo
en el Campus Virtual
LuisHernndezYez
Fundamentosdelaprogramacin:Computadorasyprogramacin Pgina 40
hola.cpp Compilador hola.obj
(cdigofuente) (cdigoobjeto)
Cdigo objeto de
Enlazador
la biblioteca iostream
HolaMundo!
Cargador hola.exe
LuisHernndezYez
(ejecutable)
Fundamentosdelaprogramacin:Computadorasyprogramacin Pgina 41
Compilador
Importante: C++ estndar
Recomendacin: GNU G++ (MinGW en Windows)
Instalacin y uso:
Seccin
Herramientasdedesarrollo
en el Campus Virtual
LuisHernndezYez
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
Instalacin y uso:
Seccin
Herramientasdedesarrollo
en el Campus Virtual
LuisHernndezYez
Fundamentosdelaprogramacin:Computadorasyprogramacin Pgina 43
Qu hace el programa?
La ejecucin del programa siempre empieza en main()
Se ejecutan las instrucciones en secuencia de principio a fin
Inicio
Pantalla(cout)
_ HolaMundo!
cout<<"HolaMundo!" <<endl; _
Muestra HolaMundo!
en la pantalla y salta de lnea
return0;
Devuelve 0 como cdigo
LuisHernndezYez
Fundamentosdelaprogramacin:Computadorasyprogramacin Pgina 44
LuisHernndezYez
Fundamentosdelaprogramacin:Computadorasyprogramacin Pgina 45
El lenguaje C
Lenguaje creado por Dennis M. Ritchie en 1972
Lenguaje de nivel medio:
Estructuras tpicas de los lenguajes de alto nivel
Fundamentosdelaprogramacin:Computadorasyprogramacin Pgina 46
Licencia CC (Creative Commons)
Este tipo de licencias ofrecen algunos derechos a terceras personas
bajo ciertas condiciones.
Este documento tiene establecidas las siguientes:
Reconocimiento (Attribution):
En cualquier 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.
LuisHernndezYez
Fundamentosdelaprogramacin:Computadorasyprogramacin Pgina 47
Fundamentosdelaprogramacin
2
Grado en Ingeniera Informtica
Grado en Ingeniera del Software
Grado en Ingeniera de Computadores
Constantes 167
Labibliotecacmath 171
Operacionesconcaracteres 174
Fundamentosdelaprogramacin:TiposeinstruccionesI
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI Pgina 50
Go North3Blocks;
Stop;
Fundamentosdelaprogramacin:TiposeinstruccionesI Pgina 51
Sintaxis del lenguaje de programacin
= Literales
Start
instruccin Stop ;
avanzar
North 1
East 2
LuisHernndezYez
direccin num 3
South
4
West
5
Fundamentosdelaprogramacin:TiposeinstruccionesI Pgina 52
N
El problema a resolver
Estando el coche en la posicin A,
conseguir llegar al Cine Tvoli (B) B
Fundamentosdelaprogramacin:TiposeinstruccionesI Pgina 53
N
El algoritmo
Secuencia de pasos que hay que
seguir para resolver el problema
1. Arrancar
2. Ir un bloque al Norte
3. Ir dos bloques al Este
4. Ir cinco bloques al Norte
5. Ir dos bloques al Este
6. Parar
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI Pgina 54
N
El programa
Instrucciones escritas en
el lenguaje de programacin B
Start;
Go North1Blocks;
Go East2Blocks;
Go North5Blocks;
A
Go East2Blocks;
Stop;
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI Pgina 55
El programa
Escribimos el cdigo del programa en un editor
y lo guardamos en un archivo:
Stat;
Go North1Blocks Copiamos el archivo
Go EastBlocks; en una llave USB
Go Noth 5Blocks; y lo llevamos al coche
Go West2Blocks;
LuisHernndezYez
Stop;
Fundamentosdelaprogramacin:TiposeinstruccionesI Pgina 56
La compilacin
Introducimos la llave USB en el coche
y pulsamos el botn de ejecutar el programa:
Stat;
^Unknown word.
Go North1Blocks
^;missing.
Go EastBlocks; Errores
^Number missing.
de sintaxis
Go Noth 5Blocks;
^Unknown word.
Go West2Blocks;
LuisHernndezYez
Stop;
There areerrors.Impossible to run the program.
Fundamentosdelaprogramacin:TiposeinstruccionesI Pgina 57
Depuracin
Editamos el cdigo para corregir los errores sintcticos:
Stat; Start;
Go North1Blocks Go North1Blocks;
Go EastBlocks; Go East3 Blocks;
Go Noth 5Blocks; Go North5Blocks;
Go West2Blocks; Go West2Blocks;
Stop; Stop;
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI Pgina 58
N
La ejecucin
Se realiza lo que pide
cada instruccin: B
Start;
Go North1Blocks;
Go East3Blocks;
!
Error de ejecucin
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI Pgina 59
Depuracin
Editamos el cdigo para arreglar el error de ejecucin:
Start; Start;
Go North1Blocks; Go North1Blocks;
Go East3Blocks; Go East2 Blocks;
Go North5Blocks; Go North5Blocks;
Go West2Blocks; Go West2Blocks;
Stop; Stop;
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI Pgina 60
N
La ejecucin
Se realiza lo que pide ?
cada instruccin: B
Start;
Go North1Blocks;
Go East2Blocks;
Go North5Blocks;
Go West2Blocks;
Stop;
LuisHernndezYez
Error lgico
El programa no llega al resultado deseado!
Fundamentosdelaprogramacin:TiposeinstruccionesI Pgina 61
Depuracin
Editamos el cdigo para arreglar el error lgico:
Start; Start;
Go North1Blocks; Go North1Blocks;
Go East2Blocks; Go East2Blocks;
Go North5Blocks; Go North5Blocks;
Go West2Blocks; Go East 2Blocks;
Stop; Stop;
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI Pgina 62
N
La ejecucin
Se realiza lo que pide
cada instruccin:
Start;
Go North1Blocks;
Go East2Blocks;
Go North5Blocks;
Go East2Blocks;
Stop;
LuisHernndezYez
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;
return 0;
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI Pgina 65
Hola Mundo!
La nica instruccin que produce algo tangible:
#include<iostream>
usingnamespacestd;
intmain()//main()esdondeempiezalaejecucin
{
cout<<"HolaMundo!"<<endl;
return0;
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI Pgina 66
cout<<"HolaMundo!"<<endl;
HolaMundo!
_
Fundamentosdelaprogramacin:TiposeinstruccionesI Pgina 67
Pantalla en modo texto
Lneas de 80 caracteres (textos)
Aplicacinenmodotexto
80caracteres
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI Pgina 68
H o l a M u n d o !
...
LuisHernndezYez
...
Fundamentosdelaprogramacin:TiposeinstruccionesI Pgina 69
El insertor << cout<<...;
Inserta textos en la pantalla de modo texto
Representacin textual de los datos
A partir de la posicin del cursor
Line wrap (contina en la siguiente lnea si no cabe)
Se pueden encadenar:
cout<<...<<...<<...;
Recuerda:lasinstruccionesterminanen;
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI Pgina 70
endl Puntodecimal,NOcoma!
Fundamentosdelaprogramacin:TiposeinstruccionesI Pgina 71
El programa principal
La funcin main(): donde comienza la ejecucin...
#include<iostream>
usingnamespacestd;
Fundamentosdelaprogramacin:TiposeinstruccionesI Pgina 72
El programa principal
La funcin main():
Fundamentosdelaprogramacin:TiposeinstruccionesI Pgina 73
Documentando el cdigo...
Comentarios (se ignoran):
#include<iostream>
usingnamespacestd;
intmain()//main()esdondeempiezalaejecucin
{
cout<<"HolaMundo!"<<endl;
...
Hasta el final de la lnea: // Comentariodeunalnea
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI Pgina 74
La infraestructura
Cdigo para reutilizar:
#include<iostream> Una directiva: empieza por #
usingnamespacestd;
intmain()//main()esdondeempiezalaejecucin
{
cout<<"HolaMundo!"<<endl;
return0;
}
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI Pgina 75
Bibliotecas
Se incluyen con la directiva #include:
#include<iostream>
(Utilidades de entrada/salida por consola)
Para mostrar o leer datos hay que incluir la biblioteca iostream
Espacios de nombres
En iostream hay espacios de nombres; cul queremos?
#include<iostream>
usingnamespacestd; Es una instruccin: termina en ;
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI Pgina 76
Compilacin y enlace
Amenudoenunpaso
Cdigo objeto de
Enlazador
la biblioteca iostream
HolaMundo!
LuisHernndezYez
Cargador hola.exe
(ejecutable)
Fundamentosdelaprogramacin:TiposeinstruccionesI Pgina 77
Elementos del programa
Biblioteca
{
Bloquedecdigo
Nmero
} Cuerpodelafuncin
Lasinstruccionesterminanen;
Fundamentosdelaprogramacin:TiposeinstruccionesI Pgina 78
intmain()
{ Cul se lee mejor?
cout<<"HolaMundo!"<<endl;
LuisHernndezYez
return0;
}
Fundamentosdelaprogramacin:TiposeinstruccionesI Pgina 79
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI Pgina 80
int main()
{
Tu cdigo aqu!
LuisHernndezYez
return 0;
}
Fundamentosdelaprogramacin:TiposeinstruccionesI Pgina 81
... recitado en la consola
Mostrar los textos con cout<<:
#include<iostream>
usingnamespacestd;
int main()
{
cout<<"EnunlugardelaMancha," <<endl;
cout<<"decuyonombrenoquieroacordarme," <<endl;
cout<<"nohamuchotiempoquevivaunhidalgodelosde
lanzaenastillero,..." <<endl;
LuisHernndezYez
return 0;
}
Fundamentosdelaprogramacin:TiposeinstruccionesI Pgina 82
return 0;
}
Fundamentosdelaprogramacin:TiposeinstruccionesI Pgina 83
Introduccin del cdigo del programa
No hay que partir una cadena literal entre dos lneas:
cout<<"nohamuchotiempoquevivaunhidalgode
losde lanzaenastillero,..." <<endl;
Fundamentosdelaprogramacin:TiposeinstruccionesI Pgina 84
Mantenimiento y reusabilidad
Usa espacio en blanco para separar los elementos:
cout<<"EnunlugardelaMancha," <<endl;
mejor que
cout<<"EnunlugardelaMancha,"<<endl;
}
El estilo importa!
Fundamentosdelaprogramacin:TiposeinstruccionesI Pgina 85
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI Pgina 86
Operadores aritmticos
+ Suma
Resta
* Multiplicacin
/ Divisin
Operadores binarios
operando_izquierdo operadoroperando_derecho
Operacin Resultado
3 +4 7
2.56 3 0.44
LuisHernndezYez
143 *2 286
45.45 /3 15.15
Fundamentosdelaprogramacin:TiposeinstruccionesI Pgina 87
Nmeros literales (concretos)
Enteros: sin parte decimal
Signo negativo (opcional) + secuencia de dgitos
314312673211234
Fundamentosdelaprogramacin:TiposeinstruccionesI Pgina 88
clculos.cpp
Ejemplo
#include<iostream>
usingnamespacestd;
int main()
Un texto Un nmero
{
cout<<"133+1234=" <<133 +1234 <<endl;
cout<<"1234 111.5=" <<1234 111.5 <<endl;
cout<<"34*59=" <<34 *59 <<endl;
cout<<"3.4*5.93=" <<3.4 *5.93 <<endl;
cout<<"500/3=" <<500 /3 <<endl;//Div.entera
cout<<"500.0/3=" <<500.0 /3 <<endl;//Div.real
LuisHernndezYez
return 0;
}
Fundamentosdelaprogramacin:TiposeinstruccionesI Pgina 89
Divisin entera
LuisHernndezYez
Divisin real
Fundamentosdelaprogramacin:TiposeinstruccionesI Pgina 90
Divisin Resultado
500 /3 166
500.0 /3 166.667
500 /3.0 166.667
500.0 /3.0 166.667
Fundamentosdelaprogramacin:TiposeinstruccionesI Pgina 91
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI Pgina 92
Fundamentosdelaprogramacin:TiposeinstruccionesI Pgina 93
Declaracin de variables tipo nombre;
int cantidad;
Memoria
double precio; cantidad ?
Se reserva espacio suficiente precio ?
...
LAS VARIABLES NO SE INICIALIZAN
No se deben usar hasta que se les haya dado algn valor
Fundamentosdelaprogramacin:TiposeinstruccionesI Pgina 94
#include<iostream> cantidad ?
usingnamespacestd;
precio ?
int main()
total ?
{
int cantidad; ...
double precio,total;
Fundamentosdelaprogramacin:TiposeinstruccionesI Pgina 95
Capacidad de las variables
int
2.147.483.648 ... 2.147.483.647
2147483648 .. 2147483647
double
2,23 x10308 ... 1,79 x 10+308 y sus negativos
Problemas de precisin
Fundamentosdelaprogramacin:TiposeinstruccionesI Pgina 96
Fundamentosdelaprogramacin:TiposeinstruccionesI Pgina 97
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI Pgina 98
Expresiones
Secuencias de operandos y operadores
operando operador operandooperador operando...
total=cantidad*precio*1.18;
Expresin
A igual prioridad se evalan de izquierda a derecha
Fundamentosdelaprogramacin:TiposeinstruccionesI Pgina 99
Precedencia de los operadores
cantidad1=10;
cantidad2=2;
precio=40.0;
total=cantidad1+cantidad2*precio;
* antes que + 10 + 2 * 40,0 10 + 80,0 90,0
total=(cantidad1+cantidad2)*precio;
+ antes que * (10 + 2) * 40,0 12 * 40,0 480,0
LuisHernndezYez
variables.cpp
int main()
{
int cantidad;
double precio,total;
cantidad=12;
precio=39.95;
total=cantidad*precio;
cout<<cantidad<<"x"<<precio<<"="
<<total<<endl;
LuisHernndezYez
return 0;
}
#include<iostream> cantidad ?
usingnamespacestd;
precio ?
intmain()
{
total ?
int cantidad;
double precio,total;
...
LuisHernndezYez
#include<iostream> cantidad 12
usingnamespacestd;
precio ?
intmain()
{
total ?
intcantidad;
doubleprecio,total;
cantidad=12; ...
LuisHernndezYez
#include<iostream> cantidad 12
usingnamespacestd;
precio 39.95
intmain()
{
total ?
intcantidad;
doubleprecio,total;
cantidad=12; ...
precio=39.95;
LuisHernndezYez
#include<iostream> cantidad 12
usingnamespacestd;
precio 39.95
intmain()
{
total 479.4
intcantidad;
doubleprecio,total;
cantidad=12; ...
precio=39.95;
total=cantidad*precio;
LuisHernndezYez
#include<iostream> cantidad 12
usingnamespacestd;
precio 39.95
intmain()
{
total 479.4
intcantidad;
doubleprecio,total;
cantidad=12; ...
precio=39.95;
total=cantidad*precio;
cout<<cantidad<<"x"<<precio<<"="
<<total<<endl;
LuisHernndezYez
intmain()
{
intcantidad;
doubleprecio,total;
cantidad=12;
precio=39.95;
total=cantidad*precio;
cout<<cantidad<<"x"<<precio<<"="
<<total<<endl;
LuisHernndezYez
return 0;
}
cin>>cantidad;
Memoria
cin >>cantidad; cantidad 12
?
...
12
1 2 _
LuisHernndezYez
12 para cantidad
No se puede leer un real
0 para precio y Error
12 para cantidad
.5 0,5 para precio
Lo dems queda pendiente
Lectura correcta!!!
LuisHernndezYez
resultado=numerador/denominador
4. Mostrar el resultado
1. Leer numerador
2. Leer denominador
4. Mostrar resultado
cin>>numerador;
2. Leer denominador
cin>>denominador;
3. Calcular divisin en resultado
resultado=numerador/denominador;
LuisHernndezYez
4. Mostrar resultado
cout<<resultado;
#include<iostream> Numerador:_129
usingnamespacestd; _
Denominador:_
2
_
Resultado:_
64.5
64.5
int main() _
{
Declaraciones double numerador,denominador,resultado;
cout<<"Numerador:";
cin>>numerador;
Entrada
cout<<"Denominador:";
cin>>denominador;
Procesamiento resultado=numerador/denominador;
LuisHernndezYez
Refinamiento
Operaciones (acciones)
cout<<... cin>>...
area =base*altura/2
LuisHernndezYez
#include<iostream>
usingnamespacestd;
int main()
{
Declaraciones
1. Mostrar en la pantalla el texto que pida la base del tringulo
return 0;
}
El programa: implementacin
#include<iostream>
usingnamespacestd; 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
cout<<"Elreadeuntringulodebase" <<base //6
<<"yaltura"<<altura<<"es:" <<area <<endl;
LuisHernndezYez
return 0;
} Recuerda: las instrucciones terminan en ;
Literales
Constantes
Con nombre
Datos
Pi=3.141592653589
Variables
LuisHernndezYez
base,altura,area Identificadores
Sintaxis:
a..z,A..Z,_
0..9,a..z,A..Z,_
typename unionunsignedusingvirtualvoid
volatilewhile
balance interesAnual
_base_imponible aos
EDAD12 salario_1_mes
clculoNmina
__edad
valor%100 AlgunValor
100caracteres valor?
LuisHernndezYez
_12_meses
____valor
Fundamentosdelaprogramacin:TiposeinstruccionesI Pgina 132
LuisHernndezYez
int
Nmeros enteros (sin decimales)
float
1363, 12, 49
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!"
LuisHernndezYez
void
Nada, ausencia de tipo, ausencia de dato (funciones)
ISO88591
LuisHernndezYez
Valores lgicos
Slo dos valores posibles:
Verdadero (true)
Falso (false)
Literales:
truefalse
Cadenas de caracteres
"Hola""Introduceelnumerador:""X142FG5TX?%A"
" "
char
Secuencias de caracteres
Programas con variables de tipo string:
#include<string>
usingnamespacestd;
#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;
LuisHernndezYez
cout<<"Cadena:" <<cadena<<endl;
Tipo Intervalo
int 2147483648 .. 2147483647
unsignedint 0 .. 4294967295
shortint 32768 .. 32768
unsignedshortint 0 .. 65535
longint 2147483648 .. 2147483647
unsignedlongint 0 .. 4294967295
+| 2.23e308 .. 1.79e+308
LuisHernndezYez
double
longdouble +| 3.37E4932 .. 1.18E+4932
[modificadores]tipo lista_de_variables;
Opcional
lista_de_variables Identificador
int i,j,l; ,
shortintunidades;
unsignedshortintmonedas;
double balance,beneficio,perdida;
shortintunidades; inicio
02
03
double balance; 04
05
unidades
06
07
balance
08
09
10
11
12
13
LuisHernndezYez
14
15
...
Al declararla
int i=0,j,l=26;
LuisHernndezYez
Enparticular,unaexpresin
shortintunidades=100; puedeserunliteral
int i,j=2;
i=23 +j*5;//itomaelvalor33
LuisHernndezYez
Errores
int a,b,c;
5 =a;
//ERROR:unliteralnopuederecibirunvalor
a+23 =5;
//ERROR:nopuedehaberunaexpresinalaizda.
b="abc";
//ERROR:unenteronopuedeguardarunacadena
c=23 5;
//ERROR:expresinnovlida(faltaoperador)
LuisHernndezYez
Memoria Memoria
01 01
i i
02
03
04
? 23 +2 *5
02
03
04
33
05 05
j j
2 2
06 06
07 07
08 08
09 09
10 10
... ...
LuisHernndezYez
a 3.45 a 3.45
b 127.5 aux=a; b 127.5
aux ? aux 3.45
a 127.5
a=b; b 127.5
aux 3.45
a 127.5
LuisHernndezYez
b=aux; b 3.45
aux 3.45
Operadores aritmticos
Asignacin (=)
Operadores binarios
Operando izquierdo operador operando derecho
Operandos: literales, constantes, variables o expresiones
LuisHernndezYez
2 +3 a*RATIOa+b
(a%b)*(c/d)
Divisin entera:
No se obtienen decimales Queda un resto
123 5
3 24
LuisHernndezYez
123 %5
#include<iostream> operadores.cpp
usingnamespacestd;
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++):"
LuisHernndezYez
<<real1++<<endl;
cout<<"Yaincrementado:" <<real1<<endl;
return 0;
}
3 +5 *2 /2 1 3 +10 /2 1 3 +5 1 8 1 7
44 /4 5
/ antes que
11 5 Pon espacio antes y despus
de cada operador binario
LuisHernndezYez
#include<iostream>
usingnamespacestd;
int main()
{
double x,f;
cout<<"IntroduceelvalordeX:";
cin>>x;
f=3 *x*x/5 +6 *x/7 3;
cout<<"f(x)=" <<f<<endl;
return 0;
}
LuisHernndezYez
Asignacin Abreviatura
a=a+12; a+=12;
Igual precedencia
a=a*3; a*=3; que la asignacin
a=a 5; a=5;
a=a/37; a/=37; De momento,
mejor evitarlas
LuisHernndezYez
a=a%b; a%=b;
const Declaracindevariableconinicializador
constshortintMeses=12;
La constante no podr volver a
constdouble Pi=3.141592,
aparecer a la izquierda de un =
RATIO=2.179 *Pi;
double total=compra1+compra2;
cout<<total<<"(IVA:"<<IVA<<"%)" <<endl;
#include<iostream>
usingnamespacestd;
int main(){
const double Pi=3.141592;
double radio=12.2,circunferencia;
circunferencia=2 *Pi*radio;
cout<<"Circunferenciadeuncrculoderadio"
<<radio<<":" <<circunferencia<<endl;
const double Euler =2.718281828459;//Nmeroe
cout<<"Nmeroealcuadrado:"<<Euler *Euler <<endl;
const int IVA=21;
int cantidad=12;
double precio=39.95,neto,porIVA,total;
neto=cantidad*precio;
porIVA =neto*IVA/100;
LuisHernndezYez
total=neto+porIVA;
cout<<"Totalcompra:"<<total<<endl;
return 0;
}
tan(x)
round(x) Redondeo al entero ms prximo
trunc(x) Prdida de la parte decimal (entero)
mates.cpp
#include<iostream>
usingnamespacestd;
#include<cmath>
int main(){
double x,y,f; pow() con argumento entero:
cout<<"ValordeX:"; Usa el molde double():
cin>>x; pow(double(i),5)
cout<<"ValordeY:";
cin>>y;
f=2 *pow(x,5) +sqrt(pow(x,3) /pow(y,2))
/abs(x*y) cos(y);
cout<<"f(x,y)=" <<f<<endl;
return 0;
LuisHernndezYez
}
Pon un espacio detrs de cada coma en las listas de argumentos
char
Asignacin, ++/ y operadores relacionales
...
#include<cctype>
int main(){
char caracter1='A',caracter2='1',caracter3='&';
cout<<"Carcter1(" <<caracter1<<")."<<endl;
cout<<"Alfanumrico?"<<isalnum(caracter1)<<endl;
cout<<"Alfabtico?"<<isalpha(caracter1)<<endl;
cout<<"Dgito?"<<isdigit(caracter1)<<endl;
cout<<"Mayscula?"<<isupper(caracter1)<<endl;
caracter1=tolower(caracter1);
cout<<"Enminscula:"<<caracter1<<endl;
cout<<"Carcter2(" <<caracter2<<")."<<endl;
cout<<"Alfabtico?"<<isalpha(caracter2)<<endl;
cout<<"Dgito?"<<isdigit(caracter2)<<endl;
cout<<"Carcter3(" <<caracter3<<")."<<endl;
cout<<"Alfanumrico?"<<isalnum(caracter3)<<endl;
LuisHernndezYez
cout<<"Alfabtico?"<<isalpha(caracter3)<<endl;
cout<<"Dgito?"<<isdigit(caracter3)<<endl;
return 0;
} 1 true / 0 false
Fundamentosdelaprogramacin:TiposeinstruccionesI Pgina 176
LuisHernndezYez
Operadores(prioridad)
< menor que
...
<= menor o igual que
*/%
> mayor que
+
>= mayor o igual que
LuisHernndezYez
< <=>>=
== igual que
==!=
!= distinto de
=+==*=/=%=
}
else {
cout<<num<<"esimpar";
}
Fundamentosdelaprogramacin:TiposeinstruccionesI Pgina 181
seleccin.cpp
#include<iostream>
usingnamespacestd;
int main(){
intop1=13,op2=4;
intopcion;
cout<<"1 Sumar"<<endl;
cout<<"2 Restar"<<endl;
cout<<"Opcin:";
cin>>opcion;
if (opcion ==1){
cout<<op1+op2<<endl;
}
else {
cout<<op1 op2<<endl;
LuisHernndezYez
}
return0;
}
{ instruccin } {
intruccin1
Tab intruccin2
3 esp. ...
int num,total=0; intruccinN
cin>>num; }
if (num>0)
{
cout<<"Positivo"; mbito local
total=total+num; (declaraciones locales)
LuisHernndezYez
}
cout<<endl;
true false
Condicin
while (condicin) {
Cuerpo cuerpo
}
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 <<")="
LuisHernndezYez
<<suma<<endl;
return0;
}
Iteracin condicional
while(i<=n){
suma=suma+i;
i++;
}
n 5
i 6
2
3
4
5
1
true false suma 15
10
1
3
60
i<=n
suma+=i;
i++;
LuisHernndezYez
#include<iostream>
Flujos de texto (streams) usingnamespacestd;
Conectan la ejecucin del programa con los dispositivos de E/S
Son secuencias de caracteres
Entrada por teclado: flujo de entrada cin (tipo istream)
Salida por pantalla: flujo de salida cout (tipo ostream)
cin cout
7 3 5 . 3 5 1 Programa 1 6 = l a t o T
cout<<"Introducetuedad:";
cin>>edad;
#include<string>
usingnamespacestd;
Recuerda:
Espacios en blanco son espacios, tabuladores, saltos de lnea, ...
cout<<d;
5 4 . 3 2 1
La biblioteca iostream
LuisHernndezYez
T o t a l : 1 2 3 . 4 5 M e s e s : 7 Programa
cout
int meses=7;
cout<<"Total:"<<123.45 <<endl<<"Meses:"<<meses;
cout<<123.45 <<endl<<"Meses:"<<meses;
cout<<endl<<"Meses:"<<meses;
cout<<"Meses:"<<meses;
Total: 123.45
LuisHernndezYez
Meses: 7 cout<<meses;
#include<iomanip>
cout<<scientific<<d<<endl; 1.234500e+002
cout<<fixed<<setprecision(8)<<d<<endl; 123.45000000
//Instrucciones:
resultado=2 *pow(x,5) +sqrt(pow(x,3)
/pow(y,2)) /abs(x*y) cos(y);
LuisHernndezYez
return resultado;//Devolucindelresultado
}
int valor=f(2,3);
return0;//main()devuelve0alS.O.
}
Los argumentos no se modifican
} return 0; 256
Esta instruccin }
no se ejecutar nunca
//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;
LuisHernndezYez
if (par(numero)){
cout<<"Par";
}
...
else{
cout<<"Impar";
}
cout<<endl;
if (numero>1){
cout<<"Sumatoriode1a" <<numero<<":"
<<suma(numero)<<endl;
}
cout<<"Carcter:";
cin>>caracter;
if(!letra(caracter)){
cout<<"no";
}
cout<<"esunaletra" <<endl;
cout<<"f(x,y)=" <<formula(x,y)<<endl;
//Losargumentospuedenllamarseigualonoquelosparmetros
LuisHernndezYez
return 0;
}
...
boolpar(int num){
bool esPar;
if (num%2==0){
esPar =true;
}
else {
esPar =false;
}
return esPar;
}
LuisHernndezYez
...
}
return sum;
}
...
f=2 *pow(x,5)+sqrt(pow(x,3)/pow(y,2))
/abs(x*y) cos(y);
return f;
}
LuisHernndezYez
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.
LuisHernndezYez
2A
Grado en Ingeniera Informtica
Grado en Ingeniera del Software
Grado en Ingeniera de Computadores
int 214
float 216
Notacincientfica 217
double 218
char 220
bool 221
string 222
Literalesconespecificacindetipo 223
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesI(Anexo)
Nmeros enteros
Intervalo de valores:
2147483648 .. 2147483647
Bytes de memoria: 4* (*) Depende de la mquina 01
4 bytes es lo ms habitual 02
Literales: Se puede saber cuntos 03
Nmeros enteros
Intervalo de valores:
+/ 1.18e38 .. 3.40e+38
Bytes de memoria: 4* (*) sizeof(float) 01
+ +
0..9 . 0..9 e,E 0..9
Intervalo de valores:
+/ 2.23e308 .. 1.79e+308
Bytes de memoria: 8* (*) sizeof(double) 01
+ +
0..9 . 0..9 e,E 0..9
Caracteres
Intervalo de valores:
Juego de caracteres (ASCII)
Bytes de memoria: 1 (FC) 01
Literales: 02
03
'a', '%', '\t' 04
Constantes de barra invertida: 05
(O secuencias de escape) 06
Carcter
Valores lgicos
Falso (false) 01
02
Bytes de memoria: 1 (FC) 03
Literales: 04
05
true, false 06
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!
LuisHernndezYez
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.
LuisHernndezYez
3
Grado en Ingeniera Informtica
Grado en Ingeniera del Software
Grado en Ingeniera de Computadores
Lainstruccinswitch 302
Repeticin 313
Elbuclewhile 316
Fundamentosdelaprogramacin:TiposeinstruccionesII
LuisHernndezYez
Tipo
Conjunto de valores con sus posibles operaciones
Valor
Conjunto de bits interpretados como de un tipo concreto
Variable (o constante)
Cierta memoria con nombre para valores de un tipo
Declaracin
Instruccin que identifica un nombre
Definicin
Declaracin que asigna memoria a una variable o constante
LuisHernndezYez
int j=9; j 9
char c='a'; c a
Simples
Estndar: int, float, double, char, bool
Conjunto de valores predeterminado
Estructurados (Tema 5)
Colecciones homogneas: arrays
Todos los elementos de la coleccin de un mismo tipo
Promocin
double
double a=1.5,b; float
long int
b=a+i*j;
int
short int
b=a+3 *2;
Valor 3 shortint (2 bytes) int (4 bytes)
LuisHernndezYez
b=1.5 +6;
Valor 6 int (4 bytes) double (8 bytes)
int a=3,b=2;
cout<<a/b;//Muestra1(divisinentera)
cout<<double(a)/b;//Muestra1.5(divisinreal)
Identificador vlido
typedefdescripcintMiTipo;
typedefdescripcintMoneda;
typedefdescripcintTiposDeCalificacion;
LuisHernndezYez
enum { Identificador }
enum {centimo,dos_centimos,cinco_centimos,
diez_centimos,veinte_centimos,
medio_euro,euro }
Valores literales que pueden tomar las variables (en amarillo)
LuisHernndezYez
Mejoran la legibilidad
typedefdescripcinnombre_de_tipo;
Elegimos un nombre para el tipo: tMoneda descripcin
typedefenum {centimo,dos_centimos,cinco_centimos,
diez_centimos,veinte_centimos,
medio_euro,euro }tMoneda;
moneda1 dos_centimos
moneda2 euro
(Internamente se usan enteros)
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;
LuisHernndezYez
if (mes==enero){
cout<<"enero";
}
if (mes==febrero){
cout<<"febrero";
}
if (mes==marzo){
cout<<"marzo";
}
...
if (mes==diciembre){
cout<<"diciembre";
LuisHernndezYez
i++;
dia =tDiaSemana(i);
typedef enum{enero,febrero,marzo,abril,mayo,
junio,julio,agosto,septiembre,octubre,
noviembre,diciembre }tMes;
int main(){
tDiaSemana hoy=lunes;
LuisHernndezYez
//Mostramoslafecha
cout<<"Hoyes:" <<cadDia(hoy)<<"" <<dia
<<"de" <<cadMes(mes)<<"de"<<anio
<<endl;
cout<<"Pasadalamedianoche..."<<endl;
dia++;
inti=int(hoy);
i++;
hoy=tDiaSemana(i);
//Mostramoslafecha
cout<<"Hoyes:" <<cadDia(hoy)<<"" <<dia
<<"de" <<cadMes(mes)<<"de"<<anio
<<endl;
LuisHernndezYez
return 0;
}
} }
Cintas magnticas
Memorias USB
...
Normalmente terminan con un dato especial (centinela)
Por ejemplo, un NIF que sea X
Fundamentosdelaprogramacin:TiposeinstruccionesII Pgina 251
#include<fstream>
archivo.close();
Operaciones de lectura
Extractor (>>) archivo>>variable;
Salta primero los espacios en blanco (espacio, tab, Intro, ...)
Datos numricos: lee hasta el primer carcter no vlido
Cadenas (string): lee hasta el siguiente espacio en blanco
archivo.get(c)
Lee el siguiente carcter en la variable c, sea el que sea
getline(archivo,cadena)
Lee en la cadena todos los caracteres que queden en la lnea
Incluidos los espacios en blanco
LuisHernndezYez
1 ifstream archivo; 7
6
Flujo de entrada
2 archivo.open("compras.txt");//Apertura 5
archivo
4
3 archivo>>nif >>unidades>>precio; 3
2
getline(archivo,producto); 1
Programa
4 archivo.close();//Cierre
LuisHernndezYez
archivo>>nif;
archivo>>unidades;
archivo>>precio;
getline(archivo,producto);
Espacio
12345678F2123.95ReproductordeDVD
Leemos el espacio
(no hacemos nada con l)
Sin espacio
int main(){
const int IVA=21;
string nif,producto;
int unidades;
double precio,neto,total,iva;
char aux;
ifstream archivo;
int contador=0;
LuisHernndezYez
archivo.open("compras.txt");//Apertura
...
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.:"
LuisHernndezYez
Atencin!
Si el archivo ya existe, se borra todo lo que hubiera
LuisHernndezYez
Atencin!
Si no se cierra el archivo se puede perder informacin
int valor=999;
Programa
2
1 ofstream archivo; 1
Flujo de salida
2 archivo.open("output.txt");//Apertura ! archivo
a
l
3 archivo<<'X' <<"Hola!" <<123.45 o
<<endl<<valor<<"Bye!"; H
X
4 archivo.close();//Cierre
LuisHernndezYez
#include<iostream>
#include<string>
usingnamespacestd;
#include<fstream>
int main(){
string nif,producto;
int unidades;
double precio;
char aux;
ofstream archivo;
archivo.open("output.txt");//Apertura(creacin)
LuisHernndezYez
cout<<"NIFdelcliente(Xparaterminar):";
cin>>nif;
...
cin>>nif;
}
...
return 0;
}
LuisHernndezYez
Instruccin1 cout<<"Operando1:";
Flujo de ejecucin
Instruccin2 cin>>oper1;
Instruccin3 cout<<"Operando2:";
...
cout<<"Producto:" <<prod;
LuisHernndezYez
InstruccinN return 0;
true
false
InstruccinT InstruccinF
true
false
if true
ifelseif
LuisHernndezYez
false
switch
Diagramasdeflujo
Inicializacin
S No
Iterar?
Cdigo
LuisHernndezYez
while for
signo.cpp
int num;
cin>>num;
if (num<0){
cout<<"Negativo";
} cin>>num;
else{
true false
cout<<"Positivo"; num<0
}
cout<<"Negativo"; cout<<"Positivo";
cout<<endl;
LuisHernndezYez
cout<<endl;
cout<<"Positivo";
LuisHernndezYez
cout<<endl;
int num;
cin>>num; 5
if (num<0){ Negativo
cout<<"Negativo"; _
}
else{
cout<<"Positivo"; cin>>num;
}
cout<<endl; true
num<0 num 5
?
cout<<"Negativo";
LuisHernndezYez
cout<<endl;
int main(){
double numerador,denominador,resultado;
cout<<"Numerador:";
cin>>numerador;
cout<<"Denominador:";
cin>>denominador;
if (denominador==0){
cout<<"Imposibledividirentre0!";
}
else{
resultado=numerador/denominador;
LuisHernndezYez
cout<<"Resultado:" <<resultado<<endl;
}
return 0;
}
Fundamentosdelaprogramacin:TiposeinstruccionesII Pgina 281
LuisHernndezYez
Operadores(prioridad)
! NO Monario
...
&& Y Binario
!
|| O Binario
*/%
+
< <=>>=
==!=
LuisHernndezYez
&&
||
bool cond1,cond2,resultado;
int a=2,b=3,c=4;
resultado=!(a<5);//!(2<5) !true false
cond1=(a*b+c)>=12;//10>=12 false
cond2=(a*(b+c))>=12;//14>=12 true
LuisHernndezYez
resultado=cond1&&cond2;//false&&true false
resultado=cond1||cond2;//false||true true
#include<iostream>
usingnamespacestd;
int main()
{
int num;
cout<<"Introduceunnmeroentre1y10:";
cin>>num;
if ((num>=1)&&(num<=10)){
cout<<"Nmerodentrodelintervalodevaloresvlidos";
}
else{
cout<<"Nmeronovlido!";
}
return 0; Condiciones equivalentes
((num >=1)&&(num <=10))
LuisHernndezYez
}
((num >0)&&(num <11))
Encierra las condiciones ((num >=1)&&(num <11))
simples entre parntesis! ((num >0)&&(num <=10))
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;
LuisHernndezYez
}
else{
dias =30;
}
}
Fundamentosdelaprogramacin:TiposeinstruccionesII Pgina 287
esBisiesto =false;
}
return esBisiesto;
}
}
LuisHernndezYez
else {...
Condicin compuesta:
Combinacin de condiciones simples y operadores lgicos
!isalpha(car)
(num<0)|| (car=='a')
(num<0)&& ((car=='a')||!isalpha(car))
LuisHernndezYez
true
false
true
false
true
false
true
false
LuisHernndezYez
ifelseif
switch
Ejemplo:
Calificacin (en letras)
de un estudiante en base
a su nota numrica (010) ==10
true
cout<<"MH"
false
true
>=9 cout<<"SB"
Si nota==10 entonces MH false
true
si no, si nota>=9 entonces SB >=7 cout<<"NT"
false
si no, si nota>=7 entonces NT >=5
true
cout<<"AP"
si no, si nota>=5 entonces AP false
cout<<"SS"
si no SS
LuisHernndezYez
cout<<"SS";
} else{
} cout<<"SS";
} }
}
Fundamentosdelaprogramacin:TiposeinstruccionesII Pgina 297
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";}
if (nota>=5){cout<<"AP";}
else if (nota>=7){cout<<"NT";}
LuisHernndezYez
else if (nota>=9){cout<<"SB";}
else if (nota==10){cout<<"MH";}
else {cout<<"SS";}
Slo muestra AP o SS
Fundamentosdelaprogramacin:TiposeinstruccionesII Pgina 298
Simplificacin de las condiciones
0 SS 5 AP 7 NT 9 SB 10
if (nota==10){cout<<"MH";} 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
LuisHernndezYez
else if (nota>=7){cout<<"NT";}
else if (nota>=5){cout<<"AP";} true &&X X
else {cout<<"SS";}
nivel.cpp
else{
cout<<"Valornovlido" <<endl;
}
return 0;
}
Fundamentosdelaprogramacin:TiposeinstruccionesII Pgina 300
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;}
if (num==4)cout<<"Muyalto";
elseif (num==3)cout<<"Alto";
elseif (num==2)cout<<"Medio";
elseif (num==1)cout<<"Bajo";
LuisHernndezYez
elsecout<<"Valornovlido";
cout<<endl;
...
nivel2.cpp
switch (num){
case 4:
Si num==4 Muy alto
{ Si num==3 Alto
}
cout<<"Muyalto"; Si num==2 Medio
break; Si num==1 Bajo
case 3:
{
cout<<"Alto";
}
break;
case 2:
{
cout<<"Medio";
}
break;
case 1:
{
cout<<"Bajo";
}
break;
LuisHernndezYez
default:
{
cout<<"Valornovlido";
}
}
...
}
switch (num){
...
case 3:
{
cout<<"Alto";
}
case 2:
{ Num:3
cout<<"Medio"; Alto
} Medio
case 1: Bajo
{ Valornovlido
cout<<"Bajo";
}
default:
LuisHernndezYez
{
cout<<"Valornovlido";
}
}
Fundamentosdelaprogramacin:TiposeinstruccionesII 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 Bajo break;
false Sin break;
Novlido
LuisHernndezYez
default
return op;
}
{
cout<<"Enlaopcin4..." <<endl;
}//Enlaltimanonecesitamosbreak
}
int opcion;
...
opcion =menu();
while (opcion!=0){
switch (opcion){
case 1:
{
cout<<"Enlaopcin1..." <<endl;
}
break;
...
case 4:
{
cout<<"Enlaopcin4..." <<endl;
}
} //switch
...
LuisHernndezYez
opcion =menu();
} //while
cout<<"Aprobado"; }
}
break; //5o6:AP
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;
...
LuisHernndezYez
case diciembre:
{
cout<<"diciembre";
}
}
Fundamentosdelaprogramacin:TiposeinstruccionesII Pgina 312
LuisHernndezYez
Inicializacin
S No
Iterar?
Cuerpo
int i=1;//Inicializacindelavariablei
while(i<=100){
cout<<i<<endl;
i++;
}
Muestra los nmeros del 1 al 100
LuisHernndezYez
int i=1;
true false
while(i<=100){ Condicin
cout<<i<<endl; Cuerpo
i++;
}
i=1
i 100
101
99
?3
2
1
4 _
1
true false 2
i<=100
3
cout<<i<<endl;
99
100
LuisHernndezYez
i++ _
primero.cpp
cout<<"1er.enteroconcuadradomayorque1.000:"
<<num<<endl;
LuisHernndezYez
return 0;
}
Recorre la secuencia de nmeros 1, 2, 3, 4, 5, ...
Fundamentosdelaprogramacin:TiposeinstruccionesII Pgina 320
sumamedia.cpp
#include<iostream>
usingnamespacestd; Recorre la secuencia
int main(){ de nmeros introducidos
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;
}
LuisHernndezYez
cout<<"Suma="<<suma<<endl;
cout<<"Media="<<media<<endl;
return 0;
}
for(inicializacin;condicin;paso)cuerpo
for(int i=1;i<=100;i++){
cout<<i;
}
i=1
true false
i<=100
cout<<i;
i++
LuisHernndezYez
for(int i=1;i<=100;i++){
cout<<i<<endl;
}
i 2?3
100
101
1
1
... i=1 2
3
true false
i<=100
99
cout<<i<<endl; 100
_
i++
LuisHernndezYez
Muy importante
El cuerpo del bucle NUNCA debe alterar el valor del contador
Garanta de terminacin
Todo bucle debe terminar su ejecucin
LuisHernndezYez
#include<iostream>
usingnamespacestd;
longlong int suma(intn);
int main(){
int num;
cout<<"Nmerofinal:";
cin>>num;
if (num>0){//Elnmerodebeserpositivo
cout<<"Lasumadelosnmerosentre1y"
<<num<<"es:" <<suma(num);
}
return 0;
}
longlong int suma(int n){
longlong int total=0;
LuisHernndezYez
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
Bucles infinitos
for(int i=1;i<=100;i)...
101234567891011...
LuisHernndezYez
Es un error de diseo/programacin
3 1
...
#include<iostream>
usingnamespacestd; 1x1=1
#include<iomanip> 1x2=2
1x3=3
1x4=4
int main(){
...
for(int i=1;i<=10;i++){ 1x10=10
for(int j=1;j<=10;j++){ 2x1=2
cout<<setw(2)<<i<<"x" 2x2=4
<<setw(2)<<j<<"=" ...
10x7=70
<<setw(3)<<i*j<<endl; 10x8=80
} 10x9=90
} 10x10=100
LuisHernndezYez
return 0;
}
tablas2.cpp
#include<iostream>
usingnamespacestd;
#include<iomanip>
int main(){
for(int i=1;i<=10;i++){
cout<<"Tabladel"<<i<<endl;
cout<<""<<endl;
for(int j=1;j<=10;j++){
cout<<setw(2)<<i<<"x"
<<setw(2)<<j<<"="
<<setw(3)<<i*j<<endl;
}
cout<<endl;
LuisHernndezYez
return 0;
}
Fundamentosdelaprogramacin:TiposeinstruccionesII Pgina 334
men.cpp
#include<iostream>
usingnamespacestd;
#include<iomanip>
int menu();//1:Tablasdemultiplicacin;2:Sumatorio
longlong intsuma(int n);//Sumatorio
int main(){
int opcion=menu();
while (opcion!=0){
switch (opcion){
case 1:
{
for(int i=1;i<=10;i++){
for(int j=1;j<=10;j++){
cout<<setw(2)<<i<<"x"
<<setw(2)<<j<<"="
LuisHernndezYez
<<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
total=total+i;
}
return total;
}
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)){
LuisHernndezYez
...
} menu()
}
Fundamentosdelaprogramacin:TiposeinstruccionesII Pgina 338
LuisHernndezYez
cout<<"Media="<<suma/cont<<endl;
return 0;
}
int main(){
double d; mbito de la variable d
if(...){
int cont=0;
for(int i=0;i<=10;i++){
...
}
}
char c;
if(...){
double x;
...
LuisHernndezYez
}
return 0;
}
}
return 0;
}
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;
...
LuisHernndezYez
}
return 0;
}
}
return 0;
}
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
LuisHernndezYez
}
return 0;
}
int main(){
int i,x; Oculta , en su mbito, a la i anterior
if(...){
int i=0; Oculta , en su mbito, a la i anterior
for(int i=0;i<=10;i++){
...
}
}
char c;
if(...){
double x; Oculta , en su mbito, a la x anterior
...
LuisHernndezYez
}
return 0;
}
elemento secuencia
secuencia o
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
LuisHernndezYez
1341226487184521
Valor centinela:
Valor especial al final que no puede darse en la secuencia
(Secuencia de nmeros positivos centinela: cualquier negativo)
LuisHernndezYez
12 4 37 23 8 19 83 63 2 35 17 76 15 1
12 4 37 23 8 19 83 63 1 35 17 76 15
No se procesan
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
LuisHernndezYez
true
Al final?
false No sabemos cuntos
elementos hay
Obtener elemento
No podemos
Procesar elemento implementar con for
LuisHernndezYez
Finalizacin
Obtener siguiente
LuisHernndezYez
Finalizacin
}
cout<<"Suma="<<suma<<endl; Finalizacin
int longitud(){
int l=0;
char c;
cout<<"Textoterminadoenpunto:";
cin>>c;//Obtenerprimercarcter
while(c!='.'){//Mientrasnoelcentinela
l++;//Procesar
cin>>c;//Obtenersiguientecarcter
}
LuisHernndezYez
return l;
}
}
cout<<buscado<<"aparece" <<cont
<<"veces.";
Fundamentosdelaprogramacin:TiposeinstruccionesII Pgina 361
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
}
LuisHernndezYez
archivo.close();
}
return suma;
}
Fundamentosdelaprogramacin:TiposeinstruccionesII Pgina 362
LuisHernndezYez
sumatorio.cpp
Recurrencia: ei+1 = ei + 1 e1 = 1
12345678...
Suma de los nmeros de la secuencia calculada:
intmain(){
intnum;
cout<<"N=";
cin>>num;
cout<<"Sumatorio:" <<suma(num);
return 0;
}
longlong intsuma(intn){
intsumatorio=0;
for(int i=1;i<=n;i++){
LuisHernndezYez
sumatorio=sumatorio+i;
}
return sumatorio;
ltimo elemento de la secuencia: n
}
Fundamentosdelaprogramacin:TiposeinstruccionesII Pgina 364
longlong intsuma(intn){
intsumatorio=0;
for(int i=1;i<=n;i++){
sumatorio=sumatorio+i;
}
...
sumatorio=0;
int i=1;
n 5
?
sumatorio 15
10
01
3
6 false
i<=n
i 2
51
4
3
6 21
1
54321
4321
321
true
sumatorio+=i;
Secuencia
LuisHernndezYez
i=i+1;
Definicin
Fi = Fi1 + Fi2
F1 = 0
F2 = 1
01123581321345589...
Fin de la secuencia?
Primer nmero de Fibonacci mayor que un nmero dado
Ese nmero de Fibonacci acta como centinela
Si num es 50, la secuencia ser:
LuisHernndezYez
0112358132134
}
Demasiados comentarios?
Para no oscurecer el cdigo, mejor una explicacin al principio
fibMenos1 3
1
2
?
LuisHernndezYez
fibMenos2 2
1
0
?
Inicializacin / encontrado=false;
Al final o true
encontrado?
false
Obtener elemento
Encontrado?
LuisHernndezYez
Finalizacin
Obtener siguiente
LuisHernndezYez
Finalizacin
Centinela: 1
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{
LuisHernndezYez
cout<<"Siguiente(1paraterminar):";
cin>>d; //Obtenerelsiguienteelemento
}
}
Fundamentosdelaprogramacin:TiposeinstruccionesII Pgina 373
LuisHernndezYez
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 76.95 328.80 254.62 435.00 164.29 0.00
0 1 2 3 4 5 6
Acceso directo
A cada elemento se accede a travs de su ndice:
ventas[4] accede al 5 elemento (contiene el valor 435.00)
LuisHernndezYez
cout<<ventas[4];
ventas[4]=442.75; Datos de un mismo tipo base:
Se usan como cualquier variable
Ejemplos:
typedef double tTemp[7];
typedef shortint tDiasMes[12];
typedef char tVocales[5];
typedef double tVentas[31];
typedef tMoneda tCalderilla[15];//EnumeradotMoneda
Ejemplos:
tTemp tempMax; tempMax ? ? ? ? ? ? ?
0 1 2 3 4 5 6
ventasFeb ? ? ? ? ? ? ? ? ? ? ? ? ? ... ?
tVentas ventasFeb;
LuisHernndezYez
0 1 2 3 4 5 6 7 8 9 10 11 12 30
nombre[ndice]
Cada elemento se accede a travs de su ndice (posicin en el array)
tVocales vocales; typedef char tVocales[5];
5 elementos, ndices de 0 a 4:
vocales[0]vocales[1]vocales[2]vocales[3]vocales[4]
Procesamiento de cada elemento:
Como cualquier otra variable del tipo base
cout<<vocales[4];
LuisHernndezYez
vocales[3]='o';
if(vocales[i]=='e')...
tTemp temp;
double media,total=0; Memoria
... Dias 7
for(int i=0;i<Dias;i++){ temp[0] 12.40
total=total+temp[i];
temp[1] 10.96
}
temp[2] 8.43
i=0 temp[3] 11.65
temp[4] 13.70
i++ i 3
70
2
4
1
#include<iostream>
usingnamespacestd;
int main(){
tTemp temp;
for (int i=0;i<Dias;i++){//Recorridodelarray
cout<<"Temperaturadelda"<<i+1<<":";
cin>>temp[i];
}
cout<<"Temperaturamedia:"<<media(temp)<<endl;
LuisHernndezYez
return0;
} Los usuarios usan de 1 a 7 para numerar los das
... La interfaz debe aproximarse a los usuarios,
aunque internamente se usen los ndices de 0 a 6
returnmed;
}
tCalderilla bolsillo;//ExactamentellevoCuantasmonedas
bolsillo[0]=euro;
bolsillo[1]=cinco_centimos;
bolsillo[2]=medio_euro;
bolsillo[3]=euro;
bolsillo[4]=centimo;
...
LuisHernndezYez
for(int moneda=0;moneda<Cuantas;moneda++)
cout<<aCadena(bolsillo[moneda])<<endl;
if (!encontrado){
ind =1;
}
returnind;
}
Fundamentosdelaprogramacin:TiposeinstruccionesII Pgina 389
LuisHernndezYez
#include<iostream>
usingnamespacestd;
#include<fstream>
int main(){
tArray lista;
int contador=0;
double valor,med;
ifstream archivo;
archivo.open("lista.txt");
if (archivo.is_open()){
archivo>>valor;
LuisHernndezYez
while ((valor!=1)&&(contador<Max)){
lista[contador]=valor;
contador++;
archivo>>valor;
}...
Fundamentosdelaprogramacin:TiposeinstruccionesII Pgina 395
archivo.close();
med =media(lista,contador);
cout<<"Mediadeloselementosdelalista:"<<med <<endl;
}
else {
cout<<"Nosepudoabrirelarchivo!" <<endl;
}
return 0;
}
med =total/cont;
return med;
}
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.
LuisHernndezYez
3A
Grado en Ingeniera Informtica
Grado en Ingeniera del Software
Grado en Ingeniera de Computadores
?:
c=false ?2 :3; =+==*=/=%=
c=3;
Es equivalente a:
if(a+b==10)c=2;
else c=3;
Se pueden concatenar:
cout<<(nota==10 ?"MH" :(nota>=9 ?"SB" :
(nota>=7 ?"NT" :(nota>=5 ?"AP" :"SS"))))
Esto es equivalente a la escala ifelseif de la siguiente seccin.
LuisHernndezYez
"SS"
else if (nota>=5){cout<<"AP";}
else {cout<<"SS";}
3E
Grado en Ingeniera Informtica
Grado en Ingeniera del Software
Grado en Ingeniera de Computadores
Recorridos 404
Unaparcamiento 405
Parntesisbienemparejados? 409
Dossecuenciasiguales? 412
NmerosprimosmenoresqueN 413
Bsquedas 417
Bsquedadeunnmeroenunarchivo 419
Bsquedasensecuenciasordenadas 420
LuisHernndezYez
Fundamentosdelaprogramacin:TiposeinstruccionesII(AnexoII)
LuisHernndezYez
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();
LuisHernndezYez
}
return 0;
}
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;
}
LuisHernndezYez
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
if (!error){
cin>>c;
}
}
Fundamentosdelaprogramacin:TiposeinstruccionesII(AnexoII) Pgina 410
parentesis.cpp
if (error){
cout<<"Error:cierresinapertura(pos." <<pos
<<")";
}
elseif(anidamiento>0){
cout<<"Error:Aperturasincierre";
}
else {
cout<<"Correcto";
}
cout<<endl;
LuisHernndezYez
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
LuisHernndezYez
primos.cpp
}
}
return 0;
}
Fundamentosdelaprogramacin:TiposeinstruccionesII(AnexoII) Pgina 413
bool primo(int n){
bool esPrimo =true;
return esPrimo;
}
LuisHernndezYez
primos2.cpp
Mejoras: probar slo impares; slo pueden ser divisibles por impares;
no pueden ser divisibles por ninguno mayor que su mitad
candidato=2;
cout<<candidato<<"";//Mostrarelnmeroprimo2
candidato++;//Seguimosconel3,queesprimo
while (candidato<num){
cout<<candidato<<"";//Mostrarnmeroprimo
candidato=candidato+2;//Sloprobamosimpares
while (!primo(candidato)){//Siguientenmeroprimo
candidato=candidato+2;
}
}...
bool primo(int n){
bool esPrimo =true;
for (int i=3;i<=n/2;i=i+2){
LuisHernndezYez
if (n%i==0){
esPrimo =false;//Esdivisiblepori
}
}...
Fundamentosdelaprogramacin:TiposeinstruccionesII(AnexoII) Pgina 415
primos3.cpp
int i=3;
while ((i<=n/2)&&esPrimo){
if (n%i==0){
esPrimo =false;
}
i=i+2;
}
return esPrimo;
}
LuisHernndezYez
intmain(){
intnum,linea;
cout<<"Valoralocalizar:";
cin>>num;
linea =busca(num);
if(linea !=1){
cout<<"Encontrado(lnea" <<linea <<")" <<endl;
}
else{
LuisHernndezYez
cout<<"Noencontrado" <<endl;
}
return 0;
}
}
archivo.close();
}
return linea;
}
Fundamentosdelaprogramacin:TiposeinstruccionesII(AnexoII) Pgina 419
LuisHernndezYez
cout<<"Noencontrado";
}
cout<<endl;
archivo.close();
Fundamentosdelaprogramacin:TiposeinstruccionesII(AnexoII) Pgina 421
Si el elemento est: procesamiento similar a secuencias desordenadas
archivo>>i;
num 9
?
(i!=0) false
&&(i<num)
i 9
5
?
2 true
cont++;
archivo>>i;
LuisHernndezYez
No se procesa
2 5 9 15 16 24 41 73 78 82 123 153 159 ...
el resto
de la secuencia
archivo>>i;
num 10
?
(i!=0) false
&&(i<num)
i 5
2
9
?
15 true
cont++;
archivo>>i;
LuisHernndezYez
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.
LuisHernndezYez
4
Grado en Ingeniera Informtica
Grado en Ingeniera del Software
Grado en Ingeniera de Computadores
Diseodescendente:Tareasysubtareas 427
Subprogramas 434
Subprogramasydatos 441
Parmetros 446
Argumentos 451
Resultadodelafuncin 467
Prototipos 473
Ejemploscompletos 475
Funcionesdeoperador 477
Diseodescendente(unejemplo) 480
Precondicionesypostcondiciones 490
LuisHernndezYez
Fundamentosdelaprogramacin:Laabstraccinprocedimental
LuisHernndezYez
Refinamientos sucesivos
Tareas que ha de realizar un programa:
Se pueden dividir en subtareas ms sencillas
Subtareas:
Tambin se pueden dividir en otras ms sencillas...
Refinamientos sucesivos
Diseo en sucesivos pasos en los se ampla el detalle
Ejemplos:
Dibujar
LuisHernndezYez
2. Dibujar 1. Dibujar
Misma tarea
3. Dibujar 2. Dibujar
2.1. Dibujar
3. Dibujar
1. Dibujar
2. Dibujar
2.1. Dibujar
4tareas,perodosdeellassoniguales
2.2. Dibujar Nosbastaconsabercmodibujar:
3. Dibujar
LuisHernndezYez
void dibujarSecantes()
Dibujar
{...}
void dibujarLinea()
{...}
Dibujar Dibujar Dibujar
void dibujarTriangulo()
{
dibujarSecantes();
dibujarLinea();
Dibujar Dibujar }
int main(){
dibujarCirculo();
LuisHernndezYez
dibujarTriangulo();
dibujarSecantes();
return 0;
}
MostrarHOLAMAMA
H O L A M A
Tareas bsicas
LuisHernndezYez
H O L A Espacioenblanco M
{...}
return0;
void mostrarA() }
{...}
Flujo de ejecucin
int main()
{
mostrarH();
mostrarO();
...
}
void mostrarH()
{
}
...
void mostrarO()
LuisHernndezYez
{
}
...
...
Tipos de subprogramas
Procedimientos (acciones):
NO devuelven ningn resultado de su ejecucin con return
Tipo: void
Llamada: instruccin independiente
mostrarH();
Funciones:
S devuelven un resultado con la instruccin return
Tipo distinto de void
Llamada: dentro de cualquier expresin
x=12*y+cuadrado(20) 3;
LuisHernndezYez
Procedimientos
Subprogramas de tipo void
...
void menu() intmain()
{
{
int op;
cout<<"1 Editar"<<endl; ...
cout<<"2 Combinar"<<endl; menu();
cout<<"0 Cancelar"<<endl; ...
cout<<"Opcin:";
cin>>op;
if(op ==1){
editar();
}
LuisHernndezYez
elseif(op ==2){
combinar();
}
}
#include<iostream>
usingnamespace std;
int main(){
int op;
Datos locales a main()
LuisHernndezYez
...
return 0; Se conocen MAX (global), op (local)
} e ingresos (global)
Excepciones:
Constantes globales (valores inalterables)
LuisHernndezYez
Datos de entrada/salida:
Subprograma
Aceptados y modificados
LuisHernndezYez
Declaracin de parmetros
Slo dos clases de parmetros en C++:
Slo de entrada (por valor)
&
De salida
LuisHernndezYez
&
Misma identidad que la variable pasada como argumento
void incrementa(int&x)
void intercambia(double&x,double&y)
void proc(char&c,int&x,double&a,bool&b)
Reciben las variables en la llamada del subprograma: Variables!
Los argumentos pueden quedar modificados
No usaremos parmetros por valor en las funciones!
Slo en procedimientos
Puede haber tanto por valor como por referencia
nombre(argumentos)
Tantos argumentos como parmetros y en el mismo orden
Concordancia de tipos argumentoparmetro
Por valor: Expresiones vlidas (se pasa el resultado)
Por referencia: Slo variables!
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
{...} i 124
d 3.0
int main() ...
{
int i=124;
...
double d=3; x 124
proc(i,33 *d); a 99.0
... ...
return0;
LuisHernndezYez
return0;
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);
cout<<i<<"entre" <<j<<"dauncocientede"
<<cociente<<"yunrestode" <<resto<<endl;
}
}
LuisHernndezYez
return 0;
}
...
void divide(int op1,int op2,int&div,int&rem){
//Divideop1entreop2ydevuelveelcocienteyelresto
div =op1/op2;
rem=op1%op2; Memoria
} cociente ?
resto ?
int main(){
int cociente,resto; i 1
for (int j=1;j<=4;j++){ j 1
for (int i=1;i<=4;i++){ ...
divide(i,j,cociente,resto);
...
}
}
LuisHernndezYez
return 0;
}
return 0; ...
}
...
void divide(int op1,int op2,int&div,int&rem){
//Divideop1entreop2ydevuelveelcocienteyelresto
div =op1/op2;
rem=op1%op2; Memoria
} div cociente 1
rem resto 0
int main(){
int cociente,resto; i 1
for (int j=1;j<=4;j++){ j 1
for (int i=1;i<=4;i++){ ...
divide(i,j,cociente,resto);
...
} op1 1
}
op2 1
LuisHernndezYez
return 0; ...
}
return 0;
}
...
void intercambia(double&valor1,double&valor2){
//Intercambialosvalores
double tmp;//Variablelocal(temporal)
tmp=valor1; Memoriatemporal
valor1=valor2; delprocedimiento
valor2=tmp; tmp ?
}
...
int main(){
double num1,num2;
cout<<"Valor1:"; Memoriademain()
cin>>num1; valor1 num1 13.6
cout<<"Valor2:";
valor2 num2 317.14
cin>>num2;
intercambia(num1,num2); ...
LuisHernndezYez
cout<<"Ahoraelvalor1es" <<num1
<<"yelvalor2es" <<num2<<endl;
return 0;
}
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"
LuisHernndezYez
<<cent1<<"x1c." <<endl;
return 0;
}
cent2=cantidad/2;
cent1=cantidad%2;
}
}
error=true;
}
else{
error=false;
...
Fundamentosdelaprogramacin:Laabstraccinprocedimental Pgina 465
cambio.cpp
if (error){
cout<<"Error:Elpagoesinferioralprecio" <<endl;
}
else {
...
Fundamentosdelaprogramacin:Laabstraccinprocedimental Pgina 466
LuisHernndezYez
no se ejecutar nunca }
Factorial(N)=1x2x3x...x(N2)x(N1)xN
longlong int factorial(int n);//Prototipo
int main(){
intnum;
cout<<"Num:";
cin>>num;
cout<<"Factorialde" <<num<<":" <<factorial(num)<<endl;
return 0;
}
}
elseif (val1<val2){
return 1; 3 puntos de salida!
}
else{
return 1;
}
}
LuisHernndezYez
if (val1==val2){
resultado=0;
}
elseif (val1<val2){
resultado=1;
}
else{
resultado=1;
#include<iostream>
usingnamespace std;
void intercambia(double&valor1,double&valor2);//Prototipo
int main(){
double num1,num2;
cout<<"Valor1:"; Asegrate de que los prototipos
cin>>num1; coincidan con las implementaciones
cout<<"Valor2:";
cin>>num2;
intercambia(num1,num2);
cout<<"Ahoraelvalor1es" <<num1
<<"yelvalor2es" <<num2<<endl;
return 0;
}
void intercambia(double&valor1,double&valor2){
LuisHernndezYez
double tmp;//Variablelocal(temporal)
tmp=valor1;
valor1=valor2;
valor2=tmp;
}
mates.cpp
//Prototipos if (n<0){
longlong int factorial(int n); fact =0;
int sumatorio(int n); }
else{
int main(){ for (inti=1;i<=n;i++){
intnum; fact =fact *i;
cout<<"Num:"; }
cin>>num; }
cout<<"Factorialde"
<<num<<":" return fact;
<<factorial(num) }
<<endl
<<"Sumatoriode1a" int sumatorio(int n){
<<num<<":" int sum =0;
<<sumatorio(num)
<<endl; for (inti=1;i<=n;i++){
LuisHernndezYez
+, , *, /, , <<, %, ...
Paso 1.
Desarrollar un programa que haga operaciones de conversin
de medidas hasta que el usuario decida que no quiere hacer ms
Pulgadas a centmetros
Libras a gramos
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:
LuisHernndezYez
Conversiones
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
LuisHernndezYez
int main(){
double valor;
int op =1;
while(op !=0){
op =menu();
switch(op){
case 1:
{
LuisHernndezYez
cout<<"Pulgadas:";
cin>>valor;
cout<<"Son" <<pulgACm(valor)<<"cm." <<endl;
}
. . .
break;
Fundamentosdelaprogramacin:Laabstraccinprocedimental Pgina 486
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;
}
LuisHernndezYez
break;
}
}
return 0;
} . . .
Fundamentosdelaprogramacin:Laabstraccinprocedimental Pgina 487
int menu(){
int op =1;
returnop;
}
LuisHernndezYez
. . .
Fundamentosdelaprogramacin:Laabstraccinprocedimental Pgina 489
LuisHernndezYez
Aserciones:
Condiciones que si no se cumplen interrumpen la ejecucin
LuisHernndezYez
Funcin assert()
Precondiciones
Por ejemplo, no realizaremos conversiones de valores negativos:
double pulgACm(double pulg){
assert(pulg >0);
}
else{ //Secumplelaprecondicin...
...
Postcondiciones
Un subprograma puede garantizar condiciones al terminar:
int menu(){
int op =1;
while ((op <0)||(op >4)){
...
cout<<"Elige:";
cin>>op;
if ((op <0)||(op >4)){
cout<<"Opcinnovlida"<<endl;
}
}
assert ((op >=0)&&(op <=4));
LuisHernndezYez
returnop;
}
El subprograma debe asegurarse de que se cumpla
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.
LuisHernndezYez
4A
Grado en Ingeniera Informtica
Grado en Ingeniera del Software
Grado en Ingeniera de Computadores
Archivoscomoparmetros 498
Lafuncinmain() 501
Argumentosimplcitos 504
Sobrecargadesubprogramas 508
LuisHernndezYez
Fundamentosdelaprogramacin:Laabstraccinprocedimental(Anexo)
LuisHernndezYez
#include<iostream>
usingnamespacestd;
#include<fstream>
voidsumatorio_archivo(ifstream&arch,double&suma);
int main(){
double resultado;
ifstream archivo;
archivo.open("datos.txt");
if (!archivo.is_open()){
cout<<"ERRORDEAPERTURA" <<endl;
}
else{
sumatorio_archivo(archivo,resultado)
cout<<"Suma=" <<resultado <<endl;
archivo.close();
LuisHernndezYez
return0;
}
suma =0;
arch>>dato;
Parmetros de main():
argc: nmero de argumentos que se proporcionan
Unavezasignadounvalorimplcito,todoslosquesiguen
handetenertambinvalorimplcito
Fundamentosdelaprogramacin:Laabstraccinprocedimental(Anexo) Pgina 505
Parmetros y argumentos implcitos
void p(int i,int j=2,int k=3);
Se copian los argumentos en los parmetros del primero al ltimo
los que no tengan correspondencia tomarn los implcitos
void p(int i,int j=2,int k=3);
...
p(13);//itoma13,jyksusvaloresimplcitos
p(5,7);//itoma5,jtoma7yksuvalorimplcito
p(3,9,12);//itoma3,jtoma9yktoma12
LuisHernndezYez
#include<iostream>
usingnamespace std;
int main(){
double x,y;
cout<<"X="; No podemos dejar signo por defecto
cin>>x; y concretar delta
cout<<"Y=";
cin>>y;
cout<<"signoydeltapordefecto:" <<f(x,y)<<endl;
cout<<"signo1ydeltapordefecto:" <<f(x,y,1)<<endl;
cout<<"signoydeltaconcretos:" <<f(x,y,1,1.25)<<endl;
return 0;
}
LuisHernndezYez
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.
LuisHernndezYez
5
Grado en Ingeniera Informtica
Grado en Ingeniera del Software
Grado en Ingeniera de Computadores
Tiposdedatos 514
Arraysdenuevo 517
Arraysybuclesfor 520
Mssobrearrays 522
Inicializacindearrays 523
Enumeradoscomondices 524
Pasodearraysasubprogramas 525
Implementacindelistas 528
Cadenasdecaracteres 531
Cadenasdecaracteresdetipostring 535
Entrada/salidaconstring 539
LuisHernndezYez/PabloMorenoGer
Operacionesconstring 541
Estructuras 543
Estructurasdentrodeestructuras 549
Arraysdeestructuras 550
Arraysdentrodeestructuras 551
Listasdelongitudvariable 552
Unejemplocompleto 558
Elbucledo..while 562
Fundamentosdelaprogramacin:Tiposdedatosestructurados
LuisHernndezYez/PabloMorenoGer
Clasificacin de tipos
Simples
Estndar: int, float, double, char, bool
Conjunto de valores predeterminado
Definidos por el usuario: enumerados
Conjunto de valores definido por el programador
Estructurados
LuisHernndezYez/PabloMorenoGer
Acceso directo []
A cada elemento se accede a travs de su ndice:
ventas[4] accede al 5 elemento (contiene el valor 435.00)
cout<<ventas[4];
ventas[4]=442.75; Datos de un mismo tipo base:
Se usan como cualquier variable
tVentas ventas;
NO se inicializan los elementos automticamente!
Es responsabilidad del programador usar ndices vlidos!
No se pueden copiar arrays directamente (array1=array2)
Hay que copiarlos elemento a elemento
double media,total=0;
... typedef double tVentas[Dias];
for(int i=0;i<Dias;i++){
total=total+ventas[i];
}
media=total/Dias;
tVentas ventas;
Memoria
double media,total=0;
Dias 7
...
ventas[0] 12.40
for(int i=0;i<Dias;i++){
ventas[1] 10.96
total=total+ventas[i];
} ventas[2] 8.43
ventas[3] 11.65
i=0 ventas[4] 13.70
LuisHernndezYez/PabloMorenoGer
ventas[5] 13.41
true false ventas[6] 14.07
i<Dias
media ?
... total 84.62
23.36
31.79
12.40
0.00
43.44
total+=ventas[i]
i 3
2
70
4
1
i++
1 2 3 4 5...10
cout<<"Cantidaddeazul(0255):";
cin>>color[azul];
inicializa(array);
Si inicializa() modifica algn elemento de tabla,
automticamente queda modificado ese elemento de array
inicializa(array);//arrayquedamodificado
for (int i=0;i<Dim;i++)
cout<<array[i]<<"";
...
0123456789
Recorrido de la lista:
for(int i=0;i<NUM;i++){
LuisHernndezYez/PabloMorenoGer
...
Bsqueda en la lista:
while((i<NUM)&&!encontrado){
...
...
Bsqueda en la lista:
while((i<contador)&&!encontrado){
...
H o l a
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
Longitud actual: 4
Longitud de la cadena
A d i s
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
Longitud: 5
S u p e r c a l i f r a g i l s t i c o
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
Longitud: 21
LuisHernndezYez/PabloMorenoGer
Tipo string
Cadenas ms sofisticadas
Sin longitud mxima (gestin automtica de la memoria)
Multitud de funciones de utilidad (biblioteca string)
string.cpp
#include<iostream>
#include<string>
usingnamespacestd;
int main(){
string cad1("Hola");//inicializacin
string cad2="amigo";//inicializacin
string cad3;
cad3=cad1;//copia
cout<<"cad3=" <<cad3<<endl;
cad3=cad1+"";//concatenacin
LuisHernndezYez/PabloMorenoGer
cad3+=cad2;//concatenacin
cout<<"cad3=" <<cad3<<endl;
cad1.swap(cad2);//intercambio
cout<<"cad1=" <<cad1<<endl;
cout<<"cad2=" <<cad2<<endl;
return 0;
}
#include<iostream>
#include<string>
usingnamespacestd;
int main(){
string nombre,apellidos;
cout<<"Introduzcaunnombre:";
cin>>nombre;
cout<<"Introduzcalosapellidos:";
cin.sync();
getline(cin,apellidos);
LuisHernndezYez/PabloMorenoGer
cout<<"Nombrecompleto:" <<nombre<<""
<<apellidos<<endl;
return 0;
}
cadena.substr(posicin,longitud)
Subcadena de longitud caracteres desde posicin
string cad ="abcdefg";
cout<<cad.substr(2,3);//Muestracde
cadena.find(subcadena)
Posicin de la primera ocurrencia de subcadena en cadena
string cad ="Olala";
cout<<cad.find("la");//Muestra1
LuisHernndezYez/PabloMorenoGer
http://www.cplusplus.com/reference/string/string/
typedefstruct {
...//declaracionesdecampos(comovariables)
}tTipo;//nombredetipo alfinal!
typedefstruct {
string nombre;
string apellidos;
int edad;
string nif;
}tPersona;
LuisHernndezYez/PabloMorenoGer
Campos:
Tipos estndar o previamente declarado
typedefstruct {
string nombre;
string apellidos; Memoria
int edad;
string nif; Luis
}tPersona; persona.nombre
Antonio
tPersona persona;
persona
Hernndez
persona.apellidos
Yez
nombre LuisAntonio
LuisHernndezYez/PabloMorenoGer
persona.edad 22
apellidos HernndezYez
persona.nif 00223344F
edad 22
nif 00223344F
typedefstruct { typedefstruct {
stringdni; ...
char letra; tNif nif;
} tNif; }tPersona;
nif
Acceso a la letra del NIF: dni
letra
persona.nif.letra
Acceso al DNI:
persona.nif.dni
}tPersona; 2
nombre
apellidos
edad
typedeftPersona tArray[MAX]; nif
typedefstruct {
tArray elementos;
LuisHernndezYez/PabloMorenoGer
tLista lista;
Nombre de la tercera persona: lista.elementos[2].nombre
Edad de la duodcima persona: lista.elementos[11].edad
NIF de la primera persona: lista.elementos[0].nif
Fundamentosdelaprogramacin:Tiposdedatosestructurados Pgina 551
/PabloMorenoGer
LuisHernndezYez/PabloMorenoGer
elementos
LuisHernndezYez/PabloMorenoGer
contador 6
42.0
12.0 2.2 5.4 0.0 36.2 35.0 X X X X
nuevo
0 1 2 3 4 5 6 7 8 9
3 6
pos
Operacin en 3 pasos:
1. Abrir hueco para el nuevo elemento (desde la posicin)
2. Colocar el elemento nuevo en la posicin
3. Incrementar el contador
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++;
}
LuisHernndezYez/PabloMorenoGer
42.0
12.0 2.2 5.4 42.0 0.0 36.2 35.0 X X X
nuevo
0 1 2 3 4 5 6 7 8 9
3 7
pos
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:
LuisHernndezYez/PabloMorenoGer
#include<iostream>
#include<string>
usingnamespacestd;
#include<fstream>
#include<iomanip>
//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
LuisHernndezYez/PabloMorenoGer
El bucle do..while
do cuerpo while(condicin); Condicin al final del bucle
int i=1;
do {
cout<<i<<endl;
LuisHernndezYez/PabloMorenoGer
i++;
}while(i<=100);
i=1;
El cuerpo
LuisHernndezYez/PabloMorenoGer
cout<<i<<endl;
se ejecuta
i++;
al menos
true una vez
i<=100
false
cout<<"Opcin:"; do {//Mssimple
cin>>op; //Lecturadel1 cout<<"Opcin:";
while((op <0)||(op >4)){ cin>>op;
cout<<"Opcin:"; }while ((op <0)||(op >4));
cin>>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;
LuisHernndezYez/PabloMorenoGer
return op;
}
El archivo clase.txt
Un dato en cada lnea
Por cada estudiante:
Nombre (cadena)
Apellidos (cadena)
Edad (entero)
NIF (cadena)
LuisHernndezYez/PabloMorenoGer
Nota (real; 1 si no calificado)
Termina con XXX como nombre
archivo>>estudiante.nif;
archivo>>estudiante.nota;
archivo.get(aux);//SaltamoselIntro
lista.elementos[lista.contador]=estudiante;//Alfinal
lista.contador++;
getline(archivo,estudiante.nombre);//Siguientenombre
}//SihaymsdeMAXestudiantes,ignoramoselresto
archivo.close();
}
}
Fundamentosdelaprogramacin:Tiposdedatosestructurados Pgina 569
Simplemente, un dato en cada lnea y en orden:
void guardar(consttLista&lista){
ofstream archivo;
archivo.open("clase.txt");
for (int i=0;i<lista.contador;i++){
archivo<<lista.elementos[i].nombre<<endl;
archivo<<lista.elementos[i].apellidos<<endl;
archivo<<lista.elementos[i].edad<<endl;
archivo<<lista.elementos[i].nif <<endl;
archivo<<lista.elementos[i].nota<<endl;
LuisHernndezYez/PabloMorenoGer
}
archivo<<"XXX" <<endl; //Centinelafinal
archivo.close();
}
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
LuisHernndezYez/PabloMorenoGer
cin.sync(); //Descartamoscualquierentradapendiente
}
ok=true;
if(lista.contador==MAX){
ok=false;
}
else {
lista.elementos[lista.contador]=estudiante;
//Insertamosalfinal
lista.contador++;
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];
}
LuisHernndezYez/PabloMorenoGer
lista.contador;
}
}
voidcalificar(tLista&lista){
for(int i=0;i<lista.contador;i++){
cout<<"Notadelestudiante"
<<nombreCompleto(lista.elementos[i])<<":";
cin>>lista.elementos[i].nota;
}
LuisHernndezYez/PabloMorenoGer
for(int i=0;i<lista.contador;i++){
if(lista.elementos[i].nota>max){
max =lista.elementos[i].nota;
pos=i;
}
}
return pos;
}
if(i==mayor){
cout<<"<<<Mayornota!";
}
cout<<endl;
}
cout<<"Mediadelaclase:"<<fixed <<setprecision(1)
<<media<<endl<<endl;
}
int main(){
tLista lista;
tEstudiante estudiante;
bool exito;
int op,pos;
cargar(lista,exito);
if (!exito){
cout<<"Nosehapodidocargarlalista!" <<endl;
}
else {
do {//Elbucledoevitatenerqueleeranteslaprimeraopcin
op =menu();
LuisHernndezYez/PabloMorenoGer
switch(op){
case1:
{
leerEstudiante(estudiante);
insertarEstudiante(lista,estudiante,exito);
if(!exito){
cout<<"Listallena:imposibleinsertar" <<endl;
}
}
break;
case4:
{
listado(lista,mediaClase(lista),mayorNota(lista));
}
}
}while(op !=0);
guardar(lista);
}
return 0;
}
Fundamentosdelaprogramacin:Tiposdedatosestructurados Pgina 578
Reconocimiento (Attribution):
En cualquier explotacin de la obra autorizada por la licencia
har falta reconocer la autora.
No comercial (Non commercial):
LuisHernndezYez/PabloMorenoGer
5A
Grado en Ingeniera Informtica
Grado en Ingeniera del Software
Grado en Ingeniera de Computadores
CadenasalestilodeC 582
E/SconcadenasalestilodeC 583
Labibliotecacstring 584
Ejemplo 585
LuisHernndezYez/PabloMorenoGer
Fundamentosdelaprogramacin:CadenasalestilodeC(Anexo)
Arrays de caracteres terminados en nulo
constMax=15;
typedefchar tCadena[Max];
tCadena cadena="Adis";//Inicializacinaldeclarar
Siempre hay al final un carcter nulo (cdigo ASCII 0 '\0')
Indica que en esa posicin termina la cadena (exclusive)
cadena A d i s \0
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
LuisHernndezYez/PabloMorenoGer
tCadena cadena;
cin>>cadena;//Seaadeunnuloalfinal
Extractor: la lectura termina en el primer espacio en blanco
No se comprueba si se leen ms caracteres de los que caben!
setw(): mximo de caracteres a colocar (incluyendo el nulo)
cin>>setw(15)>>cadena;
cin.getline(cadena_estilo_C,mx):
Para leer tambin los espacios en blanco y no ms de mx1
LuisHernndezYez/PabloMorenoGer
cin.getline(cadena,15);//Hasta14caracteres
cout<<cadena<<endl;//Elnulonosemuestra
cadenas.cpp
#include<iostream>
usingnamespacestd;
#include<cstring>
int main(){
const int MAX=20;
typedef chartCad[MAX];
tCad cadena="MegustaC++";
cout<<cadena<<endl;
cout<<"Cadena:";
cin>>cadena;//Leehastaelprimerespacioenblanco
LuisHernndezYez/PabloMorenoGer
cout<<cadena<<endl;
cin.sync();//Sincronizarlaentrada
cout<<"Cadena:";
cin.getline(cadena,MAX);
cout<<cadena<<endl;
cout<<"Longitud:" <<strlen(cadena)<<endl;
strcpy(cadena,"Hola");
...
}
cout<<endl;
return 0;
}
Reconocimiento (Attribution):
En cualquier explotacin de la obra autorizada por la licencia
har falta reconocer la autora.
No comercial (Non commercial):
LuisHernndezYez/PabloMorenoGer
6
Grado en Ingeniera Informtica
Grado en Ingeniera del Software
Grado en Ingeniera de Computadores
Recorridodearrays 590
Arrayscompletos 593
Arraysnocompletosconcentinela 594
Arraysnocompletosconcontador 595
Ejemplos 597
Generacindenmerosaleatorios 601
Bsquedasenarrays 604
Arrayscompletos 606
Arraysnocompletosconcentinela 607
Arraysnocompletosconcontador 608
Ejemplo 610
Recorridosybsquedasencadenas 614
Msejemplosdemanejodearrays 617
Arraysmultidimensionales 630
Inicializacindearraysmultidimensionales 638
LuisHernndezYez
Recorridodeunarraybidimensional 641
RecorridodeunarrayNdimensional 644
Bsquedaenunarraymultidimensional 647
Fundamentosdelaprogramacin:Recorridoybsquedaenarrays
LuisHernndezYez
Esquema de recorrido
Inicializacin Inicializacin
Procesar elemento
LuisHernndezYez
Finalizacin
double elemento;
for(int i=0;i<N;i++){
elemento=ventas[i];
LuisHernndezYez
//Procesarelelemento...
}
int i=0;
int i=0; double elemento;
double elemento=datos[i]; do {
while(elemento!=1){ elemento=datos[i];
LuisHernndezYez
//Procesarelelemento... if(elemento!=1){
//Procesarelelemento...
i++; i++;
elemento=datos[i]; }
} }while(elemento!=1);
contador 7
0 1 2 3 4 5 6 7 99
numDig 0 0 0 0 0 0
0 1 2 3 4 5
...
numeros[0]=rand();//Entre0y32766
int main(){
const intNUM=100;
typedef inttNum[NUM];//Exactamente100nmeros
const intDIG =5;
typedef inttDig[DIG];
tNum numeros;
tDig numDig ={0 };//Inicializatodoelarraya0
LuisHernndezYez
srand(time(NULL)); //Inicialasecuenciaaleatoria
...
Esquema de bsqueda
Inicializacin / encontrado=false;
Inicializacin
Mientras no se encuentre el elemento
true
y no se est al final de la secuencia: Al final o
encontrado?
Obtener el siguiente elemento false
Comprobar si el elemento
Obtener elemento
satisface la condicin
Finalizacin Encontrado?
(tratar el elemento encontrado
o indicar que no se ha encontrado)
LuisHernndezYez
Finalizacin
}
if(encontrado)//...
Con centinela
const intN=10;
typedef inttArray[N];
int buscado; tArray array;
cout<<"Valorabuscar:"; constint centinela=1;
cin>>buscado;
int pos=0;
bool encontrado=false;
while((array[pos]!=centinela)&&!encontrado){
if(array[pos]==buscado){
encontrado=true;
}
else{
pos++;
}
}
LuisHernndezYez
if(encontrado)//...
}
}
if(encontrado)//...
anual[2].ventas[3][0]
#include<iostream> umbral.cpp
usingnamespacestd;
#include<fstream>
const intN=100;
typedefdoubletArray[N];
typedefstruct {
tArray elementos;
int contador;
}tLista;
int main(){
tLista lista;
bool ok;
LuisHernndezYez
cargar(lista,ok);
if (!ok){
cout<<"Error:nohayarchivoodemasiadosdatos"
<<endl;
}
Fundamentosdelaprogramacin:Recorridoybsquedaenarrays Pgina 611
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 {
LuisHernndezYez
cout<<"Noencontrado!"<<endl;
}
}
return0;
}
Fundamentosdelaprogramacin:Recorridoybsquedaenarrays Pgina 612
}
archivo.close();
}
ok=abierto&&!overflow;
}
Fundamentosdelaprogramacin:Recorridoybsquedaenarrays Pgina 613
LuisHernndezYez
inversa.cpp
inversa=car+inversa;//Insertacaralprincipio
pos++;
}//...
pos++;
}
}
if(encontrado)//...
vectores.cpp
return suma;
}
i++;
}
return !encontrado;
}
Fundamentosdelaprogramacin:Recorridoybsquedaenarrays Pgina 620
}
return i 1;
}
while ((i<N)&&!encontrado){
j=i+1;
while ((j<N)&&!encontrado){
encontrado=(v[i]==v[j]);
j++;
}
i++;
}
return encontrado;
}
LuisHernndezYez
#include<iostream>
usingnamespacestd;
int main(){
tVector1 v1={'a','b','c' };
tVector2 v2={'a','r','e','t','z','s','a','h','b','x' };
bool ok=vectorIncluido(v1,v2);
if (ok){
cout<<"OK:v1estaincluidoenv2" <<endl;
}
LuisHernndezYez
else {
cout<<"NO:v1noestaincluidoenv2" <<endl;
}
return 0;
}
return encontrado;
}
while(encontrado&&(i<N 1)){
i++;
LuisHernndezYez
encontrado=esta(v1[i],v2);
}
return encontrado;
}
anagramas.cpp
#include<iostream>
#include<string>
usingnamespace std;
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;
}
LuisHernndezYez
else {
numCar=0;//Contadordecaracteresdelaprimeracadena
while (sonAnagramas&&(numCar<cad1.length())){
posEnCad2=buscaCaracter(cad2,cad1.at(numCar));
if (sonAnagramas){
cout<<"Laspalabrasintroducidassonanagramas" <<endl;
}
else {
cout<<"LaspalabrasintroducidasNOsonanagramas" <<endl;
}
LuisHernndezYez
return 0;
}
while ((pos<lon)&&!encontrado){
if (cad.at(pos)==c){
encontrado=true;
}
else {
pos++;
}
}
if (!encontrado){
pos=1;
}
return pos;
LuisHernndezYez
0 1 2 3 ... 98 99
0 ...
1 ...
2 ...
... ... ... ... ... ... ... ...
LuisHernndezYez
48 ...
49 ...
temp.cpp
int main(){
constint MaxDias =31;
const int MED =2;//Ndemedidas
typedef doubletTemp[MaxDias][MED];//Daxmn./mx.
tTemp temp;
double tMaxMedia =0,tMinMedia =0,
tMaxAbs =100,tMinAbs =100;
int dia =0;
double max,min;
ifstream archivo;
archivo.open("temp.txt");
if(!archivo.is_open()){
cout<<"Nosehapodidoabrirelarchivo!"<<endl;
}
LuisHernndezYez
else {
archivo>>min>>max;
//Elarchivoterminacon9999
...
tMaxAbs =temp[i][1];
}
}
...
return 0;
}
LuisHernndezYez
Para cada valor del primer ndice: todos los valores del segundo
LuisHernndezYez
cuads[0][0] 1 0 1 1
1 2 4
cuads[0][1] 1
2 3 9
cuads[1][0] 2
3 4 16
cuads[1][1] 4
4 5 25
cuads[2][0] 3
cuads[2][1] 9 Si hay menos valores que elementos,
cuads[3][0] 4 el resto se inicializan a cero
cuads[3][1] 16 Inicializacin a cero de todo el array:
LuisHernndezYez
matriz[0][1][1][1] 11
matriz[0][1][1][2] 12
matriz[0][2][0][0] 0
... 0
const intFILAS=10;
const intCOLUMNAS=5;
typedefdouble tMatriz[FILAS][COLUMNAS];
tMatriz matriz;
for(int mes=0;mes<Meses;mes++){
for(int dia =0;dia <diasMes[mes];dia++){
cout<<"Ventasdelda"<<dia +1
LuisHernndezYez
<<"delmes"<<mes+1 <<":";
cin>>ventas[mes][dia];
}
}
Fundamentosdelaprogramacin:Recorridoybsquedaenarrays Pgina 642
0 1 2 3 4 ... 28 29 30
0 201 125 234 112 156 ... 234 543 667
1 323 231 675 325 111 ...
2 523 417 327 333 324 ... 444 367 437
3 145 845 654 212 562 ... 354 548
4 327 652 555 222 777 ... 428 999 666
Celdas no
5 854 438 824 547 175 ... 321 356
Meses utilizadas
6 654 543 353 777 437 ... 765 678 555
7 327 541 164 563 327 ... 538 159 235
8 333 327 432 249 777 ... 528 529
LuisHernndezYez
typedefdouble tMatriz[DIM1][DIM2][DIM3][DIM4];
tMatriz matriz;
Bucles anidados, desde la primera dimensin hasta la ltima:
for (int n1=0;n1<DIM1;n1++){
for (int n2=0;n2<DIM2;n2++){
for (int n3=0;n3<DIM3;n3++){
for (int n4=0;n4<DIM4;n4++){
//Procesarmatriz[n1][n2][n3][n4]
}
LuisHernndezYez
}
}
}
anual[i].ventas[j][k] double
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];
LuisHernndezYez
}
}
}
if (!encontrado){
mes++;
}
}
if (encontrado){...
Fundamentosdelaprogramacin:Recorridoybsquedaenarrays Pgina 647
Licencia CC (Creative Commons)
Este tipo de licencias ofrecen algunos derechos a terceras personas
bajo ciertas condiciones.
Este documento tiene establecidas las siguientes:
Reconocimiento (Attribution):
En cualquier 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.
LuisHernndezYez
7
Grado en Ingeniera Informtica
Grado en Ingeniera del Software
Grado en Ingeniera de Computadores
Algoritmosdeordenacin 651
Algoritmodeordenacinporinsercin 654
Ordenacindearraysporinsercin 665
Algoritmodeordenacinporinsercin
conintercambios 672
Clavesdeordenacin 680
Estabilidaddelaordenacin 688
Complejidadyeficiencia 692
Ordenacionesnaturales 694
Ordenacinporseleccindirecta 701
Mtododelaburbuja 716
Listasordenadas 722
Bsquedasenlistasordenadas 729
Bsquedabinaria 731
LuisHernndezYez
Fundamentosdelaprogramacin:Algoritmosdeordenacin
LuisHernndezYez
Ordenacin de listas
array
125.40 76.95 328.80 254.62 435.00 164.29 316.05 219.99 93.45 756.62
0 1 2 3 4 5 6 7 8 9
Algoritmo de ordenacin
(de menor a mayor)
array
76.95 93.45 125.40 164.29 219.99 254.62 316.05 328.80 435.00 756.62
0 1 2 3 4 5 6 7 8 9
array[i]<=array[i+1]
LuisHernndezYez
6
1 Baraja de nueve cartas numeradas del 1 al 9
3
8
2
9
Las cartas estn desordenadas
4
7
LuisHernndezYez
6
1 Colocamos el primer elemento en la lista vaca
3
8
2
9
4
7
5 Lista ordenada:
5
LuisHernndezYez
6
1 El 7 es mayor que todos los elementos de la lista
3
8 Lo insertamos al final
2
9
4
7
Lista ordenada:
5 7
LuisHernndezYez
6
1 Primer elemento (5) mayor que el nuevo (4):
3
8 Desplazamos todos una posicin a la derecha
2
9
Insertamos el nuevo en la primera posicin
Lista ordenada:
5 5
4 7 7
LuisHernndezYez
6
1 9 es mayor que todos los elementos de la lista
3
8 Lo insertamos al final
2
9
Lista ordenada:
4 5 7 9
LuisHernndezYez
6
1 Primer elemento (4) mayor que el nuevo (2):
3
8 Desplazamos todos una posicin a la derecha
2 Insertamos el nuevo en la primera posicin
Lista ordenada:
4 4
2 5 5
7 7
9 9
LuisHernndezYez
6
1 El 9 es el primer elemento mayor que el nuevo (8):
3
8 Desplazamos desde ese hacia la derecha
Insertamos donde estaba el 9
Lista ordenada:
2 4 5 7 8
4 9 9
LuisHernndezYez
6
1 Segundo elemento (4) mayor que el nuevo (3):
3 Desplazamos desde ese hacia la derecha
Insertamos donde estaba el 4
Lista ordenada:
2 3
4 4 4
5 5
7 7
8 8
9 9
LuisHernndezYez
6
1 Primer elemento (2) mayor que el nuevo (1):
Desplazamos todos una posicin a la derecha
Insertamos el nuevo en la primera posicin
Lista ordenada:
2 2
1 3 3
4 4
5 5
7 7
8 8
9 9
LuisHernndezYez
1 2 3 4 5 6
7 7
8 8
9 9
LuisHernndezYez
7 14 20 32 5 14 27 12 13 15
0 1 2 3 4 5 6 7 8 9
20 7 14 32 5 14 27 12 13 15
0 1 2 3 4 5 6 7 8 9
LuisHernndezYez
nuevo 7
Primer elemento mayor o igual: ndice 0
20 7 14 32 5 14 27 12 13 15
0 1 2 3 4 5 6 7 8 9
nuevo 7
7 20 14 32 5 14 27 12 13 15
LuisHernndezYez
0 1 2 3 4 5 6 7 8 9
nuevo 7
Implementacin 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];
LuisHernndezYez
}
lista[pos]=nuevo;
}
i 1 pos 0 nuevo 7
20 7 14 32 5 14 27 12 13 15
0 1 2 3 4 5 6 7 8 9
20 20 14 32 5 14 27 12 13 15
0 1 2 3 4 5 6 7 8 9
7 20 14 32 5 14 27 12 13 15
LuisHernndezYez
0 1 2 3 4 5 6 7 8 9
7 14 20 32 5 14 27 12 13 15
0 1 2 3 4 5 6 7 8 9
i 4 pos 0 nuevo 5
7 14 20 32 5 14 27 12 13 15
0 1 2 3 4 5 6 7 8 9
7 7 14 20 32 14 27 12 13 15
0 1 2 3 4 5 6 7 8 9
5
LuisHernndezYez
7 14 20 32 14 27 12 13 15
0 1 2 3 4 5 6 7 8 9
i 5 pos 3 nuevo 14
5 7 14 20 32 14 27 12 13 15
0 1 2 3 4 5 6 7 8 9
5 7 14 20 20 32 27 12 13 15
0 1 2 3 4 5 6 7 8 9
14 20
LuisHernndezYez
5 7 14 32 27 12 13 15
0 1 2 3 4 5 6 7 8 9
5 7 14 20 32 14 27 12 13 15
0 1 2 3 4 5 6 7 8 9
5 7 14 20 14 32 27 12 13 15
0 1 2 3 4 5 6 7 8 9
LuisHernndezYez
5 7 14 14 20 32 27 12 13 15
0 1 2 3 4 5 6 7 8 9
7 14 20 32 5 14 27 12 13 15
0 1 2 3 4 5 6 7 8 9
7 14 20 5 32 14 27 12 13 15
0 1 2 3 4 5 6 7 8 9
7 14 5 20 32 14 27 12 13 15
0 1 2 3 4 5 6 7 8 9
7 5 14 20 32 14 27 12 13 15
0 1 2 3 4 5 6 7 8 9
LuisHernndezYez
5 7 14 20 32 14 27 12 13 15
0 1 2 3 4 5 6 7 8 9
}
}
#include<iostream> insercion.cpp
usingnamespacestd;
#include<fstream>
int main(){
tLista lista;
ifstream archivo;
LuisHernndezYez
int dato,pos,tmp;
lista.contador =0;
...
cout<<endl;
}
return 0;
}
Fundamentosdelaprogramacin:Algoritmosdeordenacin Pgina 678
Consideracin de implementacin
Operador relacional adecuado?
lista[pos 1] > o >= ? lista[pos]
Con >= se realizan intercambios intiles:
5 7 14 20 32 14 27 12 13 15
0 1 2 3 4 5 6 7 8 9
5 7 14 20 14 32 27 12 13 15
0 1 2 3 4 5 6 7 8 9
LuisHernndezYez
5 7 14 14 20 32 27 12 13 15
0 1 2 3 4 5 6 7 8 9
Intercambio intil!
Clave de ordenacin:
LuisHernndezYez
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;
}
tDato tmp;
while ((pos>0)&&(lista[pos 1]>lista[pos])){
tmp=lista[pos];
lista[pos]=lista[pos 1];
lista[pos 1]=tmp;
pos;
LuisHernndezYez
claves.cpp
Claves de ordenacin
#include<iostream>
#include<string>
usingnamespacestd;
#include<fstream>
#include<iomanip>
constint N=15;
typedef struct {
int codigo;
string nombre;
double sueldo;
}tDato;
typedef tDatotArray[N];
typedef struct {
tArray datos;
LuisHernndezYez
int cont;
}tLista;
...
lista.cont++;
archivo>>dato.codigo;
}
archivo.close();...
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;
LuisHernndezYez
mostrar(lista);
}
return 0;
} ...
Fundamentosdelaprogramacin:Algoritmosdeordenacin Pgina 686
void mostrar(tLista lista){
for (int i=0;i<lista.cont;i++){
cout<<setw(10)
<<lista.datos[i].codigo
<<setw(20)
<<lista.datos[i].nombre
<<setw(12)
<<fixed
<<setprecision(2)
<<lista.datos[i].sueldo
<<endl;
}
}
10000Sergei100000
33333Tarazona120000
12345Turgano100000
11111Urpiano90000
10000Sergei100000 10000Hernndez150000
10000Hernndez150000 10000Sergei100000
11111Urpiano 90000 11111Bentez 100000
11111Bentez 100000 11111Durn 120000
11111Prez 90000 11111Prez 90000
11111Durn 120000 11111Urpiano 90000
12345Snchez90000 12345lvarez120000
12345lvarez120000 12345Gmez100000
12345Turgano100000 12345Snchez90000
12345Gmez100000 12345Turgano100000
21112Domnguez90000 21112Domnguez90000
21112Jimnez100000 21112Jimnez100000
22222Fernndez120000 22222Fernndez120000
33333Tarazona120000 33333Tarazona120000
No estable: Estable:
LuisHernndezYez
21112Domnguez90000 12345lvarez120000
21112Jimnez100000 22222Fernndez120000
22222Fernndez120000 33333Tarazona120000
33333Tarazona120000 10000Hernndez150000
Ordenaciones naturales
Si el algoritmo trabaja menos cuanto ms ordenada est
inicialmente la lista, se dice que la ordenacin es natural
Ordenacin por insercin con la lista inicialmente ordenada:
Versin que busca el lugar primero y luego desplaza:
No hay desplazamientos; mismo nmero de comparaciones
Comportamiento no natural
Versin con intercambios:
Trabaja mucho menos; basta una comparacin cada vez
Comportamiento natural
LuisHernndezYez
Intercambios
Asumimos que tardan un tiempo similar
Clculo de la complejidad
Ordenacin por insercin (con intercambios):
...
for(int i=1;i<N;i++){
int pos=i;
while((pos>0)&&(lista[pos 1]>lista[pos])){
int tmp; Comparacin
tmp=lista[pos];
lista[pos]=lista[pos 1];
lista[pos 1]=tmp;
pos; Intercambio
}
LuisHernndezYez
}
Intercambios y comparaciones:
Tantos como ciclos realicen los correspondientes bucles
... N 1 ciclos
for(int i=1;i<N;i++){
int pos=i; N variable de ciclos
while((pos>0)&&(lista[pos 1]>lista[pos])){
int tmp;
tmp=lista[pos];
lista[pos]=lista[pos 1];
lista[pos 1]=tmp;
pos;
}
LuisHernndezYez
}
Caso en el que el while se ejecuta ms: caso peor
Caso en el que se ejecuta menos: caso mejor
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
LuisHernndezYez
rdenes de complejidad
O(log N) < O(N) < O(N log N) < O(N2) < O(N3) ...
Nlog2 NN2
101
214
4216
8364
164256
3251024
6464096
LuisHernndezYez
128716384
256865536
...
Lista desordenada: 5 7 4 9 2 8 3 1 6
Lista ordenada:
LuisHernndezYez
Lista desordenada: 5 7 4 9 2 8 3 6
Lista ordenada: 1
LuisHernndezYez
Lista desordenada: 5 7 4 9 8 3 6
Lista ordenada: 1 2
LuisHernndezYez
Lista desordenada: 5 7 4 9 8 6
Lista ordenada: 1 2 3
LuisHernndezYez
Lista desordenada: 5 7 9 8 6
Lista ordenada: 1 2 3 4
LuisHernndezYez
Lista desordenada: 7 9 8 6
Lista ordenada: 1 2 3 4 5
LuisHernndezYez
Lista desordenada: 7 9 8
Lista ordenada: 1 2 3 4 5 6
LuisHernndezYez
Lista desordenada: 9 8
Lista ordenada: 1 2 3 4 5 6 7
LuisHernndezYez
Lista desordenada: 9
Lista ordenada: 1 2 3 4 5 6 7 8
LuisHernndezYez
Lista desordenada:
Lista ordenada: 1 2 3 4 5 6 7 8 9
LuisHernndezYez
20 7 14 32 5 14 27 12 13 15
0 1 2 3 4 5 6 7 8 9
im
Slo intercambiamos si no es la misma posicin
LuisHernndezYez
5 7 14 32 20 14 27 12 13 15
0 1 2 3 4 5 6 7 8 9
5 7 14 32 20 14 27 12 13 15
0 1 2 3 4 5 6 7 8 9
i m
5 7 12 32 20 14 27 14 13 15
0 1 2 3 4 5 6 7 8 9
i m
LuisHernndezYez
5 7 12 13 20 14 27 14 32 15
0 1 2 3 4 5 6 7 8 9
seleccion.cpp
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];
LuisHernndezYez
lista[i]=lista[menor];
lista[menor]=tmp;
}
}
Fundamentosdelaprogramacin:Algoritmosdeordenacin Pgina 714
Complejidad de la ordenacin por seleccin directa
Cuntas comparaciones se realizan?
Bucle externo: N 1 ciclos
Tantas comparaciones como elementos queden en la lista:
(N 1) + (N 2) + (N 3) + ... + 3 + 2 + 1 =
N x (N 1) / 2 = (N2 N) / 2 O(N2)
Mismo nmero de comparaciones en todos los casos
Complejidad: O(N2) Igual que el mtodo de insercin
Algo mejor (menos intercambios; uno en cada paso)
No es estable: intercambios a larga distancia
LuisHernndezYez
9 9 9 9 1
4 4 4 1 9
3 3 1 4 4
6 1 3 3 3
LuisHernndezYez
1 6 6 6 6
12 32 14 5 14 7
0 1 2 3 4 5
12 32 14 5 7 14
0 1 2 3 4 5
12 32 14 5 7 14
0 1 2 3 4 5
12 32 5 14 7 14
0 1 2 3 4 5
12 5 32 14 7 14
LuisHernndezYez
0 1 2 3 4 5
5 12 32 14 7 14
0 1 2 3 4 5
... constintN=10;
int tmp; typedefinttLista[N];
//Delprimeroalpenltimo... tLista lista;
for(int i=0;i<N 1;i++){
//Desdeelltimohastaelsiguienteai...
for(int j=N 1;j>i;j){
if (lista[j]<lista[j 1]){
tmp=lista[j];
lista[j]=lista[j 1];
LuisHernndezYez
lista[j 1]=tmp;
}
}
}
14141412
16161214
La lista ya est ordenada
35121616
LuisHernndezYez
bool inter=true;
int i=0;
//Desdeel1hastaelpenltimosihayintercambios...
while((i<N 1)&&inter){
inter=false;
//Desdeelltimohastaelsiguienteai...
for(int j=N 1;j>i;j){
if (lista[j]<lista[j 1]){
int tmp;
tmp=lista[j];
lista[j]=lista[j 1];
lista[j 1]=tmp;
inter=true;
}
}
if (inter){
LuisHernndezYez
i++;
}
} Esta variacin s tiene un comportamiento natural
lista.cpp
typedef struct {
int codigo;
string nombre;
double sueldo;
}tRegistro;
typedef struct {
tArray registros;
int cont;
}tLista;
LuisHernndezYez
Nuevas implementaciones:
Operadores relacionales
Insercin (mantener el orden)
Bsqueda (ms eficiente)
Se guarda la lista en orden, por lo que cargar() no cambia
lista.registros[i]=registro;
lista.cont++;
}
}
5 7 12 13 14 14 15 20 27 32
0 1 2 3 4 5 6 7 8 9
cout<<"Noencontrado!" <<endl;
}
Complejidad: O(N)
5 7 12 14 14 15 18 20 27 32
LuisHernndezYez
0 1 2 3 4 5 6 7 8 9
5 7 12
14 14 15 18 20 27 32
0 1 2 3 4 5 6 7 8 9
5 7 12 14 14 15 18 20 27 32
0 1 2 3 4 5 6 7 8 9
Buscamos el 12
5 7 12 14 14 15 18 20 27 32
0 1 2 3 4 5 6 7 8 9
12 <lista[mitad] fin=mitad 1
ini mitad fin
5 7 12 14 14 15 18 20 27 32
0 1 2 3 4 5 6 7 8 9
12 >lista[mitad] ini=mitad+1
ini fin
LuisHernndezYez
5 7 12 14 14 15 18 20 27 32
0 1 2 3 4 5 6 7 8 9
mitad Encontrado!
Fundamentosdelaprogramacin:Algoritmosdeordenacin Pgina 734
Si el elemento no est, nos quedamos sin sublista: ini>fin
Para el 13: mitad
ini fin
5 7 12 14 14 15 18 20 27 32
0 1 2 3 4 5 6 7 8 9
13 >lista[mitad] ini=mitad+1
mitad
ini
fin
5 7 12 14 14 15 18 20 27 32
0 1 2 3 4 5 6 7 8 9
LuisHernndezYez
13 <lista[mitad] fin=mitad 1 2
ini>fin !!! No hay dnde seguir buscando No est
Implementacin constintN=10;
typedefinttLista[N];
int buscado; tLista lista;
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{
LuisHernndezYez
ini=mitad+1;
}
}//Sisehaencontrado,esten[mitad]
constint N=100;
typedef int tArray[N];
typedef struct {
tArray elementos;
int cont;
}tLista;
int main(){
tLista lista;
ifstream archivo;
LuisHernndezYez
int dato;
lista.cont =0;
archivo.open("ordenados.txt");//Existeyescorrecto
archivo>>dato;
...
Fundamentosdelaprogramacin:Algoritmosdeordenacin Pgina 737
cout<<"Noencontrado!"<<endl;
}
return 0;
}...
pos=mitad;
}
return pos;
}
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
LuisHernndezYez
N de comparaciones = k N = 2k k = log2 N
Complejidad: O(log2 N) Mucho ms rpida que O(N)
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.
LuisHernndezYez
7A
Grado en Ingeniera Informtica
Grado en Ingeniera del Software
Grado en Ingeniera de Computadores
Ordenacinporintercambio 744
Mezcladedoslistasordenadas 747
LuisHernndezYez
Fundamentosdelaprogramacin:Algoritmosdeordenacin(Anexo)
LuisHernndezYez
14 7 12 32 20 14 27 5 13 15
0 1 2 3 4 5 6 7 8 9
7 14 12 32 20 14 27 5 13 15
0 1 2 3 4 5 6 7 8 9
LuisHernndezYez
5 14 12 32 20 14 27 7 13 15
0 1 2 3 4 5 6 7 8 9
constintN=10;
typedefinttLista[N];
tLista lista;
...
for(int i=0;i<N 1;i++){
//Desdeelprimerelementohastaelpenltimo
for(int j=i+1;j<N;j++){
//Desdei+1hastaelfinal
if (lista[j]<lista[i]){
int tmp;
tmp=lista[i];
lista[i]=lista[j];
lista[j]=tmp;
}
}
LuisHernndezYez
}
Igual nmero de comparaciones, muchos ms intercambios
No es estable
Fundamentosdelaprogramacin:Algoritmosdeordenacin(Anexo) Pgina 746
LuisHernndezYez
while ((pos1<lista1.cont)&&(pos2<lista2.cont)
&&(listaM.cont <N)){
if (lista1.elementos[pos1]<lista2.elementos[pos2]){
listaM.elementos[listaM.cont]=lista1.elementos[pos1];
pos1++;
}
else {
listaM.elementos[listaM.cont]=lista2.elementos[pos2];
pos2++;
}
listaM.cont++;
LuisHernndezYez
}
...
//Puedenquedardatosenalgunadelaslistas
if (pos1<lista1.cont){
while ((pos1<lista1.cont)&&(listaM.cont <N)){
listaM.elementos[listaM.cont]=lista1.elementos[pos1];
pos1++;
listaM.cont++;
}
}
else {//pos2<lista2.cont
while ((pos2<lista2.cont)&&(listaM.cont <N)){
listaM.elementos[listaM.cont]=lista2.elementos[pos2];
pos2++;
listaM.cont++;
}
}
}
LuisHernndezYez
//Losarchivosexistenysoncorrectos
archivo1.open(nombre1.c_str());
archivo2.open(nombre2.c_str());
mezcla.open(nombreM.c_str());
archivo1>>dato1;
archivo2>>dato2;
LuisHernndezYez
while ((dato1!=1)&&(dato2!=1)){
//Mientrasquedealgoenambosarchivos
...
mezcla<<dato2<<endl;
archivo2>>dato2;
}
}
...
Fundamentosdelaprogramacin:Algoritmosdeordenacin(Anexo) Pgina 752
mezcla2.cpp
archivo2.close();
archivo1.close();
mezcla<<1 <<endl;
mezcla.close();
}
LuisHernndezYez
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.
LuisHernndezYez
8
Grado en Ingeniera Informtica
Grado en Ingeniera del Software
Grado en Ingeniera de Computadores
Programasmultiarchivoycompilacinseparada 757
Interfazfrenteaimplementacin 762
Usodemdulosdebiblioteca 768
Ejemplo:GestindeunalistaordenadaI 770
Compilacindeprogramasmultiarchivo 778
Elpreprocesador 780
Cadacosaensumdulo 782
Ejemplo:GestindeunalistaordenadaII 784
Elproblemadelasinclusionesmltiples 789
Compilacincondicional 794
Proteccinfrenteainclusionesmltiples 795
Ejemplo:GestindeunalistaordenadaIII 796
Implementacionesalternativas 804
Espaciosdenombres 808
Implementacionesalternativas 817
LuisHernndezYez
Calidadyreutilizacindelsoftware 827
Fundamentosdelaprogramacin:Programacinmodular
LuisHernndezYez
Programas multiarchivo
Cdigo fuente repartido entre varios archivos (mdulos)
Cada mdulo con sus declaraciones y sus subprogramas
Mdulo: Unidad funcional (estructura de datos, utilidades, ...)
Lista Principal Clculos Archivos
constintN=10; intmain(){ doublemean(tArray lista); boolcargar(tArray &lista,
typedefdoubletArray[N]; tArray lista; stringnombre);
typedefstruct{ boolok; doublemin(tArray lists);
tArray elem; init(lista); boolguardar(tArray lista,
intcont; cargar(lista,"bd.txt"); doublemax(tArray lista); stringnombre);
}tArray; sort(lista);
doubledato; doubledesv(tArray lista); boolmezclar(stringarch1,
voidinit(tArray &lista); cout<<"Dato:"; stringarch2);
cin>>dato; intminIndex(tArray lista);
voidinsert(tArray &lista, insert(lista,dato,ok); intsize(stringnombre);
doubleelem,bool&ok); cout<<min(lista)<<endl; intmaxIndex(tArray lista);
cout<<max(lista)<<endl; boolexportar(stringnombre);
voidremove(tArray &lista, cout<<sum(lista)<<endl; doublesum(tArray lista);
intpos,bool&ok); guardar(lista,"bd.txt");
...
return0;
}
LuisHernndezYez
Ejecutable
Fundamentosdelaprogramacin:Programacinmodular Pgina 758
Compilacin separada
Cada mdulo se compila a cdigo objeto de forma independiente
Lista lista.obj
constintN=10; 00101110101011001010010010101
typedefdoubletArray[N]; 00101010010101011111010101000
typedefstruct{ 10100101010101010010101010101
tArray elem; 01100101010101010101010101001
intcont; 01010101010100000101010101101
}tArray; 01001010101010101000010101011
11001010101010111100110010101
voidinit(tArray &lista);
voidinsert(tArray &lista,
01101010101010010010101001111
00101010101001010100101010010
10100101010100101000010011110
Archivos archivos.obj
doubleelem,bool&ok); 10010101011001010101001010100
10101010101010010101001010101 11101010110010100100101010010
boolcargar(tArray &lista,
voidremove(tArray &lista, 01000010101011100101010010100 10100101010111110101010001010
stringnombre);
intpos,bool&ok); 01110101011101001101010100101 01010101010100101010101010110
... 01011111110101011001101010111 01010101010101010101010010101
boolguardar(tArray lista,
00001001010100101010101010110 01010101000001010101011010100
stringnombre);
10101010101010000101010111100
boolmezclar(stringarch1, 10101010101111001100101010110
stringarch2); 10101010100100101010011110010
Compilacin separada
Al compilar el programa principal, se adjuntan los mdulos compilados
Principal
Mdulos del programa intmain(){
tArray lista;
Bibliotecas del sistema
boolok;
init(lista);
cargar(lista,"bd.txt");
sort(lista);
lista.obj doubledato; iostream.obj
cout<<"Dato:";
cin>>dato;
insert(lista,dato,ok);
calculos.obj cout<<min(lista)<<endl;
cout<<max(lista)<<endl;
fstream.obj
cout<<sum(lista)<<endl;
guardar(lista,"bd.txt");
archivos.obj ... }
return0; math.obj ...
LuisHernndezYez
Ejecutable
lista.cpp main.cpp
COMPILACIN
lista.obj iostream.obj
calculos.obj
fstream.obj
archivos.obj
main.obj
math.obj
... ...
ENLACE
LuisHernndezYez
Ejecutable
Fundamentosdelaprogramacin:Programacinmodular Pgina 761
LuisHernndezYez
Etctera
+ Implementacin de los subprogramas (cmo se hace)
voidinsert(tArray &lista,
Biblioteca
voidinit(tArray &lista); doubleelem,bool&ok){
if(lista.cont ==N){
voidinsert(tArray &lista, okfalse;
doubleelem,bool&ok); }
else{
voidremove(tArray &lista, ...
intpos,bool&ok);
...
main.cpp
#include"lista.h"
Los nombres de archivos de cabecera
... propios (no del sistema) se encierran
entre dobles comillas, no entre ngulos
Interfaz
typedefdoubletArray[N];
typedefstruct{
tArray elem;
intcont;
}tArray;
voidinsert(tArray &lista,
voidremove(tArray &lista,
voidinit(tArray &lista);
Implementacin #include"lista.h"
voidinit(tArray &lista){
lista.cont =0;
voidinsert(tArray &lista,
doubleelem,bool&ok){
01000010101011100101010010100
01110101011101001101010100101
01011111110101011001101010111
00001001010100101010101010110
Archivodecabecera lista.h
}tLista;
const string BD="bd.txt";
...
Documenta bien el cdigo!
Implementacin lista.cpp
tRegistro nuevo(){
tRegistro registro;
cout<<"Introduceelcdigo:";
cin>>registro.codigo;
cout<<"Introduceelnombre:";
cin>>registro.nombre;
LuisHernndezYez
cout<<"Introduceelsueldo:";
cin>>registro.sueldo;
return registro;
}...
Fundamentosdelaprogramacin:Programacinmodular Pgina772
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];
}
LuisHernndezYez
lista.registros[i]=registro;
lista.cont++;
}
}...
Fundamentosdelaprogramacin:Programacinmodular Pgina773
voideliminar(tLista&lista,intpos,bool &ok){//pos=1..
ok=true;
if ((pos<1)||(pos>lista.cont)){
ok=false;//Posicininexistente
}
else {
pos;//Pasamosandicedelarray
for (inti=pos+1;i<lista.cont;i++){
//Desplazamosalaizquierda
lista.registros[i 1]=lista.registros[i];
}
lista.cont;
}
}
LuisHernndezYez
...
Fundamentosdelaprogramacin:Programacinmodular Pgina774
Programaprincipal bd.cpp
intmenu();
int main(){
tLista lista;
bool ok;
int op,pos;
cargar(lista,ok);
if (!ok){
cout<<"Nosehapodidoabrirelarchivo!"<<endl;
}
LuisHernndezYez
else {
do {
mostrar(lista);
op =menu();...
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();
LuisHernndezYez
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;
LuisHernndezYez
Fundamentosdelaprogramacin:Programacinmodular Pgina777
LuisHernndezYez
Visual C++/Studio
Archivos de cabecera e implementacin en grupos distintos:
Con Depurar>Generarsolucin
se compilan todos los .cpp
typedefstruct{ typedefstruct{
intcodigo; intcodigo;
stringnombre; stringnombre;
doublesueldo; doublesueldo;
}tRegistro; }tRegistro;
typedeftRegistro typedeftRegistro
tArray[N]; tArray[N];
LuisHernndezYez
typedefstruct{ typedefstruct{
tArray registros; tArray registros;
intcont; intcont;
}tLista; }tLista;
... ...
intmenu();
...
typedef struct {
Cada estructura, en su mdulo
tArray registros;
int cont;
}tLista;
Cabecera registro.h
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);
LuisHernndezYez
tRegistro nuevo(){
tRegistro registro;
cout<<"Introduceelcdigo:";
cin>>registro.codigo;
cout<<"Introduceelnombre:";
cin>>registro.nombre;
cout<<"Introduceelsueldo:";
cin>>registro.sueldo;
return registro;
}
LuisHernndezYez
Cabecera lista2.h
voidmostrar(const tLista&lista);
voidcargar(tLista&lista,bool &ok);
voidguardar(tLista lista);
bd2.cpp
intmenu();
int main(){
tLista lista;
No intentes compilar este ejemplo!
bool ok; Tiene errores
int op,pos;
cargar(lista,ok);
if (!ok){
cout<<"Nosepudoabrirelarchivo!"<<endl;
}
LuisHernndezYez
else {
do {
mostrar(lista);
op =menu();
...
Fundamentosdelaprogramacin:Programacinmodular Pgina788
LuisHernndezYez
...
registro.h #include"registro.h"
#include"lista2.h"
#include<string>
...
...
registro.cpp
...
#include"registro.h"
... lista2.h
...
#include"registro.h"
...
lista2.cpp
LuisHernndezYez
...
Incluye... #include"lista2.h"
...
intmenu(); #include<string>
#include<string> usingnamespacestd;
... usingnamespacestd;
#include "registro.h" typedef struct {
...
const int N=100; }tRegistro;
typedef tRegistro tArray[N]; ...
typedef struct {
LuisHernndezYez
tArray registros;
int cont;
}tLista;
...
#include<string> ...
usingnamespacestd;
#include<string>
usingnamespacestd;
typedef struct {
Identificador duplicado!
LuisHernndezYez
...
}tRegistro;
...
Compilacin condicional
Directivas #ifdef, #ifndef, #else y #endif
Se usan en conjuncin con la directiva #define
#define X #define X
#ifdef X #ifndef X
...//Cdigoif ...//Cdigoif
[#else [#else
...//Cdigoelse ...//Cdigoelse
] ]
#endif #endif
La directiva #define define un smbolo (identificador)
Izquierda: se compilar el Cdigo if y no el Cdigo else
LuisHernndezYez
Cabecera registrofin.h
typedef struct {
int codigo;
string nombre;
double sueldo;
}tRegistro;
tRegistro nuevo();
LuisHernndezYez
tRegistro nuevo(){
tRegistro registro;
cout<<"Introduceelcdigo:";
cin>>registro.codigo;
cout<<"Introduceelnombre:";
cin>>registro.nombre;
cout<<"Introduceelsueldo:";
cin>>registro.sueldo;
return registro;
}
LuisHernndezYez
Cabecera listafin.h
intbuscar(tLista lista,stringnombre);
voidcargar(tLista&lista,bool&ok);
voidguardar(tLista lista);
#endif
for (intj=lista.cont;j>i;j){
//Desplazamosaladerecha
lista.registros[j]=lista.registros[j 1];
}
...
Fundamentosdelaprogramacin:Programacinmodular Pgina799
bdfin.cpp
intmenu();
int main(){
tLista lista;
bool ok; Ahora ya puedes compilarlo!
int op,pos;
cargar(lista,ok);
if (!ok){
cout<<"Nosepudo abrir elarchivo!" <<endl;
}
LuisHernndezYez
else {
do {
mostrar(lista);
op=menu();
...
Fundamentosdelaprogramacin:Programacinmodular Pgina 800
Gestin de una lista ordenada III
Preprocesamiento de #include en bdfin.cpp:
#include<iostream> #ifndef registrofin_h
usingnamespacestd;
#define registrofin_h
#include<string>
#include"registrofin.h" usingnamespacestd;
intmenu();
...
intmenu(); registrofin_h ya est definido!
...
i++; lista.registros[lista.cont]=registro;
} lista.cont++;
//Insertamos enlaposicin i }
for (intj=lista.cont;j>i;j){ }
//Desplazamos aladerecha
lista.registros[j]=lista.registros[j 1];
...
for (intj=lista.cont;j>i;j){
//Desplazamos aladerecha
lista.registros[j]=lista.registros[j 1];
}
lista.registros[i]=registro;
...
}
Variables i y d declaradas en el espacio de nombres miEspacio
} }
Ahora se distingue entre primero::x y segundo::x
cout<<y<<endl;//yessegundo::y
cout<<primero::y<<endl;//espacioexplcito
cout<<segundo::x<<endl;//espacioexplcito
return 0;
}
Fundamentosdelaprogramacin:Programacinmodular Pgina 811
usingnamespace
Introduce todos los nombres de un espacio en el mbito actual:
#include <iostream>
usingnamespacestd;
namespace primero{
int x=5; 5
int y=10;
} using [namespace] 10
namespace segundo{ slo tiene efecto 3.1416
double x=3.1416; en el bloque
double y=2.7183; en que se encuentra 2.7183
}
int main(){
usingnamespace primero;
cout<<x<<endl;//xesprimero::x
cout<<y<<endl;//yesprimero::y
LuisHernndezYez
cout<<segundo::x<<endl;//espacioexplcito
cout<<segundo::y<<endl;//espacioexplcito
return 0;
}
voidguardar(tLista lista);
}//namespace
#endif
Implementacin
#include<iostream>
#include<fstream>
usingnamespacestd;
#include"listaEN.h"
voidord::eliminar(tLista&lista,intpos,bool &ok){
//...
}
intord::buscar(tLista lista,stringnombre){
//...
LuisHernndezYez
...
int menu();
int main(){
ord::tLista lista;
boolok;
ord::cargar(lista,ok);
if (!ok){
cout<<"Nosepudoabrirelarchivo!"<<endl;
}
LuisHernndezYez
else {
ord::mostrar(lista);
...
O usar una instruccin usingnamespace ord;
Fundamentosdelaprogramacin:Programacinmodular Pgina 815
int menu();
int main(){
tLista lista;
bool ok;
cargar(lista,ok);
if (!ok){
cout<<"Nosepudoabrirelarchivo!"<<endl;
LuisHernndezYez
}
else {
mostrar(lista);
...
Cabecera listaEN.h
Implementaciones alternativas
Todo lo comn puede estar fuera de la estructura namespace:
#ifndef listaEN_H
#definelistaEN_H
#include"registrofin.h"
void mostrar(consttLista&lista);
void eliminar(tLista&lista,int pos,bool &ok);//pos =1..N
...
listaEN.cpp
#include<iostream>
usingnamespacestd;
#include <fstream>
#include "listaEN.h"
//IMPLEMENTACINDELOSSUBPROGRAMASCOMUNES
void eliminar(tLista&lista,int pos,bool &ok){//...
}
//IMPLEMENTACINDELOSSUBPROGRAMASDELESPACIODENOMBRESord
void ord::insertar(tLista&lista,tRegistro registro,bool &ok){
ok=true;
if (lista.cont ==N){
ok=false;//Listallena
}
LuisHernndezYez
else {
int i=0;
while ((i<lista.cont)&&(lista.registros[i]<registro)){
i++;
}...
}
else {
ini=mitad+1;
}
}...
if (encontrado){
mitad++;
}
else {
mitad=1;
}
return mitad;
}
}
else {
pos++;
}
}...
if (encontrado){
pos++;
}
else {
pos=1;
}
return pos;
}
Programa principal
#include<iostream>
usingnamespacestd;
#include"registrofin.h"
#include"listaEN.h"
usingnamespaceord;
int menu();
int main(){
tLista lista;
bool ok;
...
tRegistro registro=nuevo();
insertar(lista,registro,ok);
if (!ok){
LuisHernndezYez
...
bdEN.cpp
Programa principal
#include<iostream>
usingnamespacestd;
#include"registrofin.h"
#include"listaEN.h"
usingnamespacedes;
int menu();
int main(){
tLista lista;
bool ok;
...
tRegistro registro=nuevo();
insertar(lista,registro,ok);
if (!ok){
LuisHernndezYez
...
Software de calidad
El software debe ser desarrollado con buenas prcticas de
ingeniera del software que aseguren un buen nivel de calidad
Los distintos mdulos de la aplicacin deben ser probados
exhaustivamente, tanto de forma independiente como en su
relacin con los dems mdulos
La prueba y depuracin es muy importante y todos los equipos
debern seguir buenas pautas para asegurar la calidad
Los mdulos deben ser igualmente bien documentados, de
forma que otros desarrolladores puedan aprovecharlos
LuisHernndezYez
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
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.
LuisHernndezYez
8A
Grado en Ingeniera Informtica
Grado en Ingeniera del Software
Grado en Ingeniera de Computadores
ventas.cpp
int cont;
typedef struct{ }tListaVentas;
int id_prod;
string codigo; ...
intmenu();
intmain(){
...
int cont;
typedef struct{ Producto }tListaVentas;
int id_prod;
string codigo; ...
voidmostrar(tProducto producto);
...
Lista de ventas
voidinicializar(tListaVentas &lista);
voidcargar(tListaVentas &lista);
void insertar(tListaVentas &lista,tVenta venta,bool &ok);
voidbuscar(const tListaVentas &lista,intid,tVenta &venta,bool &ok);
void eliminar(tListaVentas &lista,intid,bool &ok);
voidventasPorClientes(const tListaVentas &lista);
voidventasPorProductos(const tListaVentas &lista);
doubletotalVentas(const tListaVentas &ventas,stringnif,
consttListaClientes &clientes,
consttListaProductos &productos);
voidstock(const tListaVentas &ventas,consttListaClientes &clientes,
consttListaProductos &productos);
intmenu();
LuisHernndezYez
intmain(){
...
Ventas
main.cpp
producto.cpp listaproductos.cpp
typedef struct{
int id_prod;
string codigo;
string nombre; producto.h string
double precio;
int unidades;
}tProducto;
#ifndef cliente_h
#definecliente_h
#include<string>
usingnamespacestd;
typedefstruct {
int id_cli;
string nif;
string nombre;
string telefono;
}tCliente;
tCliente nuevoCliente();
bool operator<(tCliente opIzq,tCliente opDer);//PorNIF
LuisHernndezYez
#endif
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.
LuisHernndezYez
9
Grado en Ingeniera Informtica
Grado en Ingeniera del Software
Grado en Ingeniera de Computadores
Direccionesdememoriaypunteros 849
Operadoresdepunteros 854
Punterosydireccionesvlidas 864
Punterosnoinicializados 866
Unvalorseguro:NULL 867
Copiaycomparacindepunteros 868
Tipospuntero 873
Punterosaestructuras 875
Punterosaconstantesypunterosconstantes 877
Punterosypasodeparmetros 879
Punterosyarrays 883
Memoriaydatosdelprograma 886
Memoriadinmica 891
Punterosydatosdinmicos 895
Gestindelamemoria 907
LuisHernndezYez
Errorescomunes 911
Arraysdedatosdinmicos 916
Arraysdinmicos 928
Fundamentosdelaprogramacin:Punterosymemoriadinmica
LuisHernndezYez
El tipo del dato (int) indica cuntos bytes (4) requiere el dato:
00000000000000000000000000000101 5
(La codificacin de los datos puede ser diferente; y la de las direcciones tambin)
&
Obtener la direccin de memoria de ...
...
i 0F03:1A38
int i,j;
0F03:1A39
... 0F03:1A3A
int*punt; 0F03:1A3B
j 0F03:1A3C
0F03:1A3D
0F03:1A3E
0F03:1A3F
...
punt 0F07:0417
LuisHernndezYez
0F07:0418
0F07:0419
0F07:041A
...
i 0F03:1A38 00
int i,j;
0F03:1A39 00
... 0F03:1A3A 00
int*punt; 0F03:1A3B 05
... j 0F03:1A3C
0F03:1A3D
i=5;
0F03:1A3E
0F03:1A3F
...
punt 0F07:0417
LuisHernndezYez
0F07:0418
0F07:0419
i 5
0F07:041A
...
&
Obtener la direccin de memoria de ...
...
i 0F03:1A38 00
int i,j;
0F03:1A39 00
... 0F03:1A3A 00
int*punt; 0F03:1A3B 05
... j 0F03:1A3C
0F03:1A3D
i=5;
0F03:1A3E
punt=&i;
0F03:1A3F
...
0F07:0418 03
i 0F07:0419 1A
5
0F07:041A 38
...
*
Obtener lo que hay en la direccin ...
...
i 0F03:1A38 00
int i,j;
0F03:1A39 00
... 0F03:1A3A 00
int *punt; 0F03:1A3B 05
... j 0F03:1A3C
0F03:1A3D
i=5;
0F03:1A3E
punt=&i;
0F03:1A3F
j=*punt; ...
punt 0F07:0417 0F
LuisHernndezYez
0F07:0418 03
0F07:0419 1A
punt:
0F07:041A 38
...
i 0F03:1A38 00
int i,j;
0F03:1A39 00
... 0F03:1A3A 00
Direccionamiento
int *punt; indirecto 0F03:1A3B 05
punt 0F07:0417 0F
LuisHernndezYez
0F07:0418 03
0F07:0419 1A
*punt:
0F07:041A 38
...
*
Obtener lo que hay en la direccin ...
...
i 0F03:1A38 00
int i,j;
0F03:1A39 00
... 0F03:1A3A 00
int *punt; 0F03:1A3B 05
... j 0F03:1A3C 00
0F03:1A3D 00
i=5;
0F03:1A3E 00
punt=&i;
0F03:1A3F 05
j=*punt; ...
punt 0F07:0417 0F
LuisHernndezYez
0F07:0418 03
0F07:0419 1A
0F07:041A 38
...
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;
LuisHernndezYez
cout<<k<<endl;//Mismo valorque j
return 0;
}
int i;
int *q;//qnotieneanunadireccinvlida
int *p=&i;//ptomaunadireccinvlida
LuisHernndezYez
q=p;//ahoraqyatieneunadireccinvlida
q=NULL;//otradireccinvlidaparaq
punt1 X punt2
LuisHernndezYez
x 5
punt1 punt2
LuisHernndezYez
x 5
punt1 punt2
tipos.cpp
Con *puntero podemos hacer lo que con otros datos del tipo base
puntero>codigo puntero>nombrepuntero>sueldo
puntero>... (*puntero)....
structPtr.cpp
Punteros a constantes:
typedefconstint*tIntCtePtr;//Punteroaconstante
int entero1=5,entero2=13;
tIntCtePtr punt_a_cte =&entero1;
(*punt_a_cte)++;//ERROR: Datonomodificable!
LuisHernndezYez
punt_a_cte =&entero2;//OK:Elpunteronoescte.
constPtr.cpp
Punteros constantes:
typedefint*consttIntPtrCte;//Punteroconstante
int entero1=5,entero2=13;
tIntPtrCte punt_cte =&entero1;
(*punt_cte)++;//OK:Elpunteronoapuntaacte.
LuisHernndezYez
param.cpp
S puede cambiar
cout<<entero<<endl;
Mostrar 6 en la consola
cout<<entero<<endl; entero 6
Prototipo equivalente:
void foo(int *param1,double *param2,char *param3);
intPtr inicializar();
Datos globales
Cdigodel
Memoria principal
programa
LuisHernndezYez
S.O.
S.O.
typedef struct {
...
}tRegistro;
const intN=1000;
typedef tRegistro tArray[N];
typedef struct {
tArray registros;
int cont;
}tLista;
LuisHernndezYez
intmain(){
...
S.O.
voidfunc(tLista lista,double &total)
{
tLista aux;
int i;
...
func(lista,resultado)
Datos dinmicos
Se crean y se destruyen durante la ejecucin del programa
Se les asigna memoria del montn
Creacin
Montn
Datodinmico
Destruccin
Datos dinmicos
En el montn cuando el programa lo solicita
LuisHernndezYez
Datos estticos
Datos declarados como de un tipo concreto:
int i;
Se acceden directamente a travs del identificador:
cout<<i;
Datos dinmicos
Datos accedidos a travs de su direccin de memoria
Esa direccin de memoria debe estar el algn puntero
Los punteros son la base del SGMD
LuisHernndezYez
//estticai(accesibleconiocon*p1)
p2=new int;//Punteroquedaaccesoaunavariable
//dinmica(accesiblesloatravsdep2)
int main(){
tRegistroreg;
reg =nuevo();
LuisHernndezYez
El operador delete
delete puntero; Devuelve al montn la memoria usada por
la variable dinmica apuntada por puntero
int *p;
p=new int;
*p=12;
...
delete p;//Yanosenecesitaelenteroapuntadoporp
#include<iostream>
usingnamespacestd;
int main(){
double a=1.5; p1 Identificadores:
double *p1,*p2,*p3;
p1=&a; 4
p2=new double; (a, p1, p2, p3)
*p2=*p1; a 1.5
p3=new double;
*p3=123.45;
cout<<*p1<<endl; p2 1.5 Variables:
cout<<*p2<<endl;
cout<<*p3<<endl; 6
delete p2; (+ *p2 y *p3)
LuisHernndezYez
#include<iostream>
usingnamespacestd; PILA
a 1.5
int main(){ p1 ?
double a=1.5;
p2 ?
double *p1,*p2,*p3;
p3 ?
LuisHernndezYez
MONTN
MONTN
#include<iostream>
usingnamespacestd; PILA
a 1.5
int main(){ p1
double a=1.5;
p2
double *p1,*p2,*p3;
p1=&a; p3 ?
p2=new double;
LuisHernndezYez
MONTN
1.5
MONTN
#include<iostream>
usingnamespacestd; PILA
a 1.5
int main(){ p1
double a=1.5;
p2
double *p1,*p2,*p3;
p1=&a; p3
p2=new double;
*p2=*p1;
p3=new double;
LuisHernndezYez
1.5
MONTN
123.45
LuisHernndezYez
1.5
MONTN
#include<iostream>
usingnamespacestd; PILA
a 1.5
int main(){ p1
double a=1.5;
p2 ?
double *p1,*p2,*p3;
p1=&a; p3
p2=new double;
*p2=*p1;
p3=new double;
*p3=123.45;
cout<<*p1<<endl;
cout<<*p2<<endl;
cout<<*p3<<endl;
delete p2; 123.45
LuisHernndezYez
MONTN
delete p3;
MONTN
Colisin pilamontn
Los lmites de ambas regiones se encuentran
Se agota la memoria
Desbordamiento de la pila
LuisHernndezYez
return 0;
Slo se ha creado
LuisHernndezYez
}
una variable
mostrar(*p);
delete p;
...
mostrar(*p); p ha dejado de apuntar
al dato dinmico destruido
return 0; Acceso a memoria inexistente
}
LuisHernndezYez
int cont;
}tLista; Se crean a medida que se insertan
Se destruyen a medida que se eliminan
tLista lista;
lista.cont =0;
lista.cont 0
0 1 2 3 4 5 6 998 999
lista.registros
LuisHernndezYez
lista.cont 1
0 1 2 3 4 5 6 998 999
lista.registros
LuisHernndezYez
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 1 2 3 4 5 6 998 999
lista.registros
LuisHernndezYez
lista.cont 3
0 1 2 3 4 5 6 998 999
lista.registros
LuisHernndezYez
lista.cont 3
0 1 2 3 4 5 6 998 999
lista.registros
LuisHernndezYez
lista.cont 3
0 1 2 3 4 5 6 998 999
lista.registros
LuisHernndezYez
lista.h
#ifndef lista_h
#definelista_h registro.h con el tipo puntero:
#include"registro.h"
typedef tRegistro *tRegPtr;
const int N=1000;
const string BD="bd.dat";
typedef tRegPtr tArray[N];
typedef struct {
tArray registros;
int cont;
}tLista;
void mostrar(const tLista&lista);
voidinsertar(tLista&lista,tRegistro registro,bool &ok);
voideliminar(tLista&lista,intcode,bool &ok);
intbuscar(const tLista &lista,int code);
void cargar(tLista&lista,bool &ok);
LuisHernndezYez
#endif
}
lista.cont;
}
}
delete lista.registros[i];
}
lista.cont =0;
}
...
#include<iostream>
usingnamespacestd;
#include"registro.h"
#include"lista.h"
int main(){
tLista lista;
bool ok;
cargar(lista,ok);
if(ok){
mostrar(lista);
destruir(lista);
}
return 0;
LuisHernndezYez
#include<iostream>
usingnamespacestd;
const int N=10;
int main(){
int*p=new int[N];
for (int i=0;i<N;i++){
p[i]=i;
}
for (int i=0;i<N;i++){
cout<<p[i]<<endl;
}
delete []p;
No olvides destruir el array dinmico!
LuisHernndezYez
return 0;
}
...
#include"registro.h"
//Lista:arraydinmico(puntero)ycontador
typedef struct {
tRegPtr registros;
int cont;
}tLista;
...
LuisHernndezYez
listaAD.cpp
lista.registros[i 1]=lista.registros[i];
}
lista.cont;
}
}...
lista.cont =0;
}
...
archivo>>registro.codigo;
}
archivo.close();
}
}
0 1 2 3 4 5 6 7
LuisHernndezYez
Montn
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.
LuisHernndezYez
9A
Grado en Ingeniera Informtica
Grado en Ingeniera del Software
Grado en Ingeniera de Computadores
Aritmticadepunteros 940
Recorridodearraysconpunteros 953
Referencias 962
Listasenlazadas 964
LuisHernndezYez
Fundamentosdelaprogramacin:Punterosymemoriadinmica(Anexo)
LuisHernndezYez
punt 0F07:041B 0F
0F07:041C 03
0F07:041D 1A
0F07:041E 38
...
punt 0F07:041B 0F
0F07:041C 03
punt 0F07:041B 0F
0F07:041C 03
0F07:041D 1A
Restando pasamos a elementos anteriores 0F07:041E 40
...
punt 0F07:041B 0F
0F07:041C 03
0F07:041D 1A
0F07:041E 3C
...
shortint (2 bytes)
dias[0] 0F03:1A38
0F03:1A39 31
shortint dias[12]={31,28,31,30, dias[1] 0F03:1A3A
28
0F03:1A3B
31,30,31,31,30,31,30,31}; dias[2] 0F03:1A3C
0F03:1A3D 31
typedef shortint*tSIPtr; dias[3] 0F03:1A3E
tSIPtr punt=dias; 0F03:1A3F 30
dias[4] 0F03:1A40
0F03:1A41 31
...
dias 0F07:0417 0F
0F07:0418 03
0F07:0419 1A
0F07:041A 38
punt 0F07:041B 0F
LuisHernndezYez
0F07:041C 03
0F07:041D 1A
0F07:041E 38
...
shortint dias[12]={31,28,31,30,
...
31,30,31,31,30,31,30,31};
dias[0] 0F03:1A38
typedef shortint*tSIPtr; 0F03:1A39 31
dias[1] 0F03:1A3A
tSIPtr punt=dias; 0F03:1A3B 28
punt++; dias[2] 0F03:1A3C
31
0F03:1A3D
dias[3] 0F03:1A3E
0F03:1A3F 30
dias[4] 0F03:1A40
0F03:1A41 31
...
dias 0F07:0417 0F
0F07:0418 03
0F07:0419 1A
0F07:041A 38
punt 0F07:041B 0F
LuisHernndezYez
0F07:041C 03
0F07:041D 1A
0F07:041E 3A
...
0F07:041C 03
0F07:041D 1A
0F07:041E 40
...
shortint dias[12]={31,28,31,30,
...
31,30,31,31,30,31,30,31};
dias[0] 0F03:1A38
typedef shortint*tSIPtr; 0F03:1A39 31
dias[1] 0F03:1A3A
tSIPtr punt=dias; 0F03:1A3B 28
punt++; dias[2] 0F03:1A3C
0F03:1A3D 31
punt=punt+3; dias[3] 0F03:1A3E
punt; 0F03:1A3F 30
dias[4] 0F03:1A40
0F03:1A41 31
...
dias 0F07:0417 0F
0F07:0418 03
0F07:0419 1A
0F07:041A 38
punt 0F07:041B 0F
LuisHernndezYez
0F07:041C 03
0F07:041D 1A
0F07:041E 3E
...
punt; 0F03:1A3F 30
dias[4] 0F03:1A40
tSIPtr punt2; 0F03:1A41 31
...
dias 0F07:0417 0F
0F07:0418 03
0F07:0419 1A
0F07:041A 38
punt 0F07:041B 0F
LuisHernndezYez
0F07:041C 03
0F07:041D 1A
0F07:041E 3E
punt2 0F07:041F ?
shortint dias[12]={31,28,31,30,
...
31,30,31,31,30,31,30,31};
dias[0] 0F03:1A38
typedef shortint*tSIPtr; 0F03:1A39 31
dias[1] 0F03:1A3A
siPtr punt=dias; 0F03:1A3B 28
punt++; dias[2] 0F03:1A3C
0F03:1A3D 31
punt=punt+3; dias[3] 0F03:1A3E
punt; 0F03:1A3F 30
dias[4] 0F03:1A40
tSIPtr punt2; 0F03:1A41 31
...
punt2=dias; dias 0F07:0417 0F
0F07:0418 03
0F07:0419 1A
0F07:041A 38
punt 0F07:041B 0F
LuisHernndezYez
0F07:041C 03
0F07:041D 1A
0F07:041E 3E
punt2 0F07:041F 0F
punt; 0F03:1A3F 30
dias[4] 0F03:1A40
tSIPtr punt2; 0F03:1A41 31
...
punt2=dias; dias 0F07:0417 0F
0F07:041C 03
0F07:041D 1A
0F07:041E 3E
punt2 0F07:041F 0F
punt++;
}
...
intPtr punt=lista.elementos;
punt
0 1 2 3 4 5 6 7 8 ... 98 99
lista.elementos 4 13 3 47 53 19 7 48
lista.cont 8
LuisHernndezYez
i 0 punt
0 1 2 3 4 5 6 7 8 ... 98 99
lista.elementos 4 13 3 47 53 19 7 48
lista.cont 8
LuisHernndezYez
...
for(int i=0;i<lista.cont;i++){ 4
cout<<*punt <<endl;
punt++;
}
i 1 punt
0 1 2 3 4 5 6 7 8 ... 98 99
lista.elementos 4 13 3 47 53 19 7 48
lista.cont 8
LuisHernndezYez
i 2 punt
0 1 2 3 4 5 6 7 8 ... 98 99
lista.elementos 4 13 3 47 53 19 7 48
lista.cont 8
LuisHernndezYez
...
for(int i=0;i<lista.cont;i++){ 4
13
cout<<*punt <<endl; 3
punt++;
}
i 3 punt
0 1 2 3 4 5 6 7 8 ... 98 99
lista.elementos 4 13 3 47 53 19 7 48
lista.cont 8
LuisHernndezYez
. . .
i 7 punt
0 1 2 3 4 5 6 7 8 ... 98 99
lista.elementos 4 13 3 47 53 19 7 48
lista.cont 8
LuisHernndezYez
...
for(int i=0;i<lista.cont;i++){ 4
13
cout<<*punt <<endl; 3
punt++; 47
} 53
19
7
48
i 8 punt
0 1 2 3 4 5 6 7 8 ... 98 99
lista.elementos 4 13 3 47 53 19 7 48
lista.cont 8
LuisHernndezYez
Vaca
Lista Definicin recursiva!
Elemento seguido de una lista
lista
structtNodo;
typedef tNodo *tLista;
structtNodo {
tRegistro reg;
tLista sig;
};
tLista lista=NULL;//Listavaca
lista=new tNodo;
lista>reg =nuevo();
lista>sig=NULL;
LuisHernndezYez
lista tem1
p
LuisHernndezYez
lista tem1
tLista lista=NULL;//Listavaca
lista=new tNodo;
lista>reg =nuevo();
lista>sig=NULL;
tLista p;
p=lista;
p>sig=new tNodo;
p>sig>reg =nuevo();
p>sig>sig =NULL;
p
LuisHernndezYez
structtNodo;
typedef tNodo *tLista;
struct tNodo {
tRegistro reg;
tLista sig;
};
listaenlazada.cpp
} p
p>sig=nuevo;
}
lista
}
}...
else {
ant=p; lista
p=p>sig;
}
}...
if (!encontrado){
ok=false;//Noexisteesecdigo
}
else {
ant>sig=p>sig;
delete p;
}
}
}
...
ant p
lista
LuisHernndezYez
while (p!=NULL){
mostrar(p>reg);
p=p>sig;
}
}...
...
lista=lista>sig;
delete p;
}
}
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.
LuisHernndezYez
10
Grado en Ingeniera Informtica
Grado en Ingeniera del Software
Grado en Ingeniera de Computadores
Conceptoderecursin 983
Algoritmosrecursivos 986
Funcionesrecursivas 987
Diseodefuncionesrecursivas 989
Modelodeejecucin 990
Lapiladelsistema 992
Lapilaylasllamadasafuncin 994
Ejecucindelafuncinfactorial() 1005
Tiposderecursin 1018
Recursinsimple 1019
Recursinmltiple 1020
Recursinanidada 1022
Recursincruzada 1026
Cdigodelsubprogramarecursivo 1027
Parmetrosyrecursin 1032
Ejemplosdealgoritmosrecursivos 1034
LuisHernndezYez
Bsquedabinaria 1035
TorresdeHanoi 1038
Recursinfrenteaiteracin 1043
Estructurasdedatosrecursivas 1045
Fundamentosdelaprogramacin:Introduccinalarecursin
LuisHernndezYez
(wikipedia.org)
La imagen del paquete
LuisHernndezYez
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;
}
factorial(5) 5 x factorial(4) 5 x 4 x factorial(3)
5 x 4 x 3 x factorial(2) 5 x 4 x 3 x 2 x factorial(1)
LuisHernndezYez
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
Datos delprograma
S.O.
2
7 7 7
LuisHernndezYez
4 4 4 4
... Pila
Llamada a funcin:
<DIR1> cout<<funcA(4);
Entra la direccin de vuelta
...
... Pila
<DIR1> cout<<funcA(4);
...
... Pila
<DIR1> cout<<funcA(4);
...
... Pila
<DIR1> cout<<funcA(4);
...
... Pila
<DIR1> cout<<funcA(4);
...
... Pila
<DIR1> cout<<funcA(4);
...
... Pila
<DIR1> cout<<funcA(4);
...
... Pila
<DIR1> cout<<funcA(4);
...
... Pila
<DIR1> cout<<funcA(4);
...
... Pila
<DIR1> cout<<funcA(4); La ejecucin contina
en esa direccin
...
...funcC(...)
}
int funcA(...){ funcC
...
...funcB(...) funcB
}
int main(){ funcA
LuisHernndezYez
...
cout<<funcA(...); Pila
...
cout<<factorial(5)<<endl;
LuisHernndezYez
factorial(5)
resultado=?
LuisHernndezYez
n=5
Pila
resultado =?
n=4
resultado=?
LuisHernndezYez
n=5
Pila
factorial(5)
factorial(4)
factorial(3)
resultado=?
n=3
resultado =?
n=4
resultado=?
LuisHernndezYez
n=5
Pila
resultado=?
n=2
resultado=?
n=3
resultado =?
n=4
resultado=?
LuisHernndezYez
n=5
Pila
factorial(5)
factorial(4)
factorial(3)
factorial(2)
factorial(1)
resultado=?
n=1
resultado=?
n=2
resultado=?
n=3
resultado =?
n=4
resultado=?
LuisHernndezYez
n=5
Pila
factorial(0) resultado=?
n=1
resultado=?
n=2
resultado=?
n=3
resultado =?
n=4
resultado=?
LuisHernndezYez
n=5
Pila
factorial(5)
factorial(4)
factorial(3)
factorial(2)
factorial(1)
factorial(0) resultado=1
n=1
resultado=?
1
n=2
resultado=?
n=3
resultado =?
n=4
resultado=?
LuisHernndezYez
n=5
Pila
resultado=2
1
n=2
1 resultado=?
n=3
resultado =?
n=4
resultado=?
LuisHernndezYez
n=5
Pila
factorial(5)
factorial(4)
factorial(3)
factorial(2)
factorial(1)
factorial(0)
1
1 resultado=6
n=3
2
resultado =?
n=4
resultado=?
LuisHernndezYez
n=5
Pila
1
1
2
resultado =24
6 n=4
resultado=?
LuisHernndezYez
n=5
Pila
factorial(5)
factorial(4)
factorial(3)
factorial(2)
factorial(1)
factorial(0)
1
1
2
6
24 resultado=120
LuisHernndezYez
n=5
Pila
1
1
2
6
24
LuisHernndezYez
120
Pila
0 si n = 0
Fib(n) 1 si n = 1
Fib(n1) + Fib(n2) si n > 1
... 0 si n = 0
int main(){ Fib(n) 1 si n = 1
for(int i=0;i<20;i++){ Fib(n1) + Fib(n2) si n > 1
cout<<fibonacci(i)<<endl;
}
return 0;
}
n + 1 si m = 0
n + 1 si m = 0
Nmeros de Ackermann Ack(m, n) Ack(m1, 1) si m > 0 y n = 0
}
Prubalo con nmeros muy bajos:
Se generan MUCHAS llamadas recursivas
n + 1 si m = 0
Nmeros de Ackermann Ack(m, n) Ack(m1, 1) si m > 0 y n = 0
Ack(m1, Ack(m, n1)) si m > 0 y n > 0
ackermann(1,1)
ackermann(0,ackermann(1,0))
2
3 ackermann(0,1)
ackermann(0,2)
LuisHernndezYez
2
ackermann(0,1)
3
ackermann(0,2)
ackermann(1,3)
ackermann(0,ackermann(1,2))
ackermann(0, ackermann(1,1))
4 ackermann(0,ackermann(1,0))
5
LuisHernndezYez
2
ackermann(0,1)
3
ackermann(0,2)
ackermann(0,3)
ackermann(0,4)
func(5);
int main(){
tLista lista;
lista.cont =0;
//Cargadelarray...
mostrar(lista,0);
return 0;
}
cout<<lista.elementos[pos]<<endl;
mostrar(lista,pos+1);
}
}
inverso.cpp
int main(){
tLista lista;
lista.cont =0;
//Cargadelarray...
mostrar(lista,0);
return 0;
}
mostrar(lista,pos+1);
cout<<lista.elementos[pos]<<endl;
}
}
}
Cuando n es 0, el argumento de fact toma el valor 1
Al volver se le va multiplicando por los dems n (distintos)
Fundamentosdelaprogramacin:Introduccinalarecursin Pgina 1032
LuisHernndezYez
binaria.cpp
A B C
a problemas ms pequeos
Mover N discos del pilar A al pilar C:
Mover N1 discos del pilar A al pilar B A B C
A B C
LuisHernndezYez
int main(){
int n;
cout<<"Nmerodetorres:";
cin>>n;
hanoi(n,'A','C','B');
LuisHernndezYez
return 0;
}
assert(n>=0); assert(n>=0);
return fact;
}
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?
LuisHernndezYez
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.
LuisHernndezYez
AP
Grado en Ingeniera Informtica
Grado en Ingeniera del Software
Grado en Ingeniera de Computadores
Flujos 1051
Archivosbinarios 1054
Tamaodelosdatos:Eloperadorsizeof() 1056
Aperturadearchivosbinarios 1059
Lecturadearchivosbinarios(accesosecuencial) 1061
Escrituraenarchivosbinarios(accesosecuencial) 1066
Accesodirectooaleatorio 1070
Ejemplosdeusodearchivosbinarios 1078
Ordenacindelosregistrosdelarchivo 1079
Bsquedabinaria 1085
Insercinenunarchivobinarioordenado 1088
Cargadelosregistrodeunarchivoenunatabla 1092
Almacenamientodeunatablaenunarchivo 1093
LuisHernndezYez
Fundamentosdelaprogramacin:Archivosbinarios
LuisHernndezYez
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
Dispositivos/archivos de salida
de entrada
Programa
LuisHernndezYez
Lo que signifiquen los cdigos depender del programa que use el archivo
Flujo binario 07 6C C1 56
LuisHernndezYez
El operador sizeof()
En los archivos binarios se manejan cdigos binarios (bytes)
sizeof() (palabra clave): bytes que ocupa en memoria algo
Se aplica a un dato o a un tipo char byte
constint Max=80;
typedefchar tCadena[Max];
typedef struct {
int codigo;
tCadena item;
double valor;
} tRegistro;
LuisHernndezYez
... 0F03:1A3C 0A
0F03:1A3D 37
Posiciones de memoria usadas SIZE
0F03:1A3E 1C
(12)
0F03:1A3F DF
reg.val
0F03:1A40 03
(8)
0F03:1A41 92
0F03:1A44 ...
Flujo binario
00 00 00 05 0A 37 1C DF 03 92 99 0E
Biblioteca fstream
archivo.read(puntero_al_bfer,nmero)
bfer: variable destino de los caracteres ledos
Pasado como puntero a secuencia de caracteres
Referencia (&) a la variable destino
Molde de puntero a carcter (char *)
nmero: cantidad de caracteres a extraer del archivo
Operador sizeof()
Archivo abierto con los modos ios::in e ios::binary
archivo.read((char *)®istro,sizeof(tRegistro));
LuisHernndezYez
else {
//LecturaOK
...
leer.cpp
#include<iostream>
usingnamespacestd;
#include<fstream>
#include"registro.h"
int main(){
tRegistro registro;
fstream archivo;
archivo.open("bd.dat",ios::in |ios::binary);
archivo.read((char *)®istro,SIZE);
int cuantos=archivo.gcount();
while (cuantos==SIZE){
mostrar(registro);
archivo.read((char *)®istro,SIZE);
cuantos=archivo.gcount();
LuisHernndezYez
}
archivo.close(); No olvides cerrar el archivo!
return 0;
}
El tipo tRegistro
constint Max=80;
typedefchar tCadena[Max];
typedef struct {
int codigo;
tCadena item;
double valor;
}tRegistro;
const int SIZE=sizeof(tRegistro);
Por qu usamos cadenas al estilo de C?
string: tamao variable en memoria
Requieren un proceso de serializacin
LuisHernndezYez
escribir.cpp
#include<iostream>
usingnamespace std;
#include<fstream>
#include"registro.h"
int main(){
tRegistro registro;
fstream archivo;
archivo.open("bd2.dat",ios::out |ios::binary);
bool seguir=true;
while (seguir){
cout<<"Cdigo:";
cin.sync();
cin>>registro.codigo;
cout<<"Nombre:";
LuisHernndezYez
cin.sync();
cin.getline(registro.item,Max);//Mx:80
...
ios::beg ios::end
0 SIZE 2*SIZE 3*SIZE 4*SIZE 5*SIZE 6*SIZE
SIZE SIZE SIZE SIZE SIZE SIZE
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
//Actualizacindeunregistro
#include<iostream>
usingnamespacestd;
#include<fstream>
#include"registro.h"
int main(){
tRegistro registro;
fstream archivo;
int num;
cout<<"Registronmero?";
cin>>num;
...
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;
LuisHernndezYez
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
void mostrar();
...
LuisHernndezYez
void mostrar(){
fstream archivo;
tRegistro registro;
int cuantos;
archivo.open(BD,ios::in |ios::binary);
archivo.read((char *)®istro,SIZE);
cuantos=archivo.gcount();
while (cuantos==SIZE){
mostrar(registro);
archivo.read((char *)®istro,SIZE);
cuantos=archivo.gcount();
}
archivo.close();
}
LuisHernndezYez
...
fstream archivo;
archivo.open(BD,ios::in |ios::out |ios::binary);
archivo.seekg(0,ios::end);
LuisHernndezYez
int pos=archivo.tellg();
int numReg =pos/SIZE;
...
//Ordenamosconelmtododeseleccindirecta
tRegistro regMenor,reg;
for (int i=0;i<numReg 1;i++){
int menor=i;
for (int j=i+1;j<numReg;j++){
archivo.seekg(menor*SIZE,ios::beg);
archivo.read((char *)®Menor,SIZE);
archivo.seekg(j*SIZE,ios::beg);
archivo.read((char *)®,SIZE);
if(strcmp(reg.item,regMenor.item)<0){
menor=j;
}
}
... regMenor reg
menor
i j
LuisHernndezYez
i
menor j
LuisHernndezYez
archivo.close();
cout<<endl<<"Trasordenar:"<<endl<<endl;
mostrar();
return 0;
}
LuisHernndezYez
void mostrar();
int main(){
mostrar();
tRegistro registro;
fstream archivo;
LuisHernndezYez
...
archivo.open(BD,ios::in|ios::binary);
archivo.seekg(0,ios::end);
int pos=archivo.tellg();
int numReg =pos/SIZE;
int buscado;
cout<<"Cdigoabuscar:";
cin>>buscado;
int ini=0,fin=numReg 1,mitad;
bool encontrado=false;
while((ini<=fin)&&!encontrado){
mitad=(ini+fin)/2;
archivo.seekg(mitad*SIZE,ios::beg);
archivo.read((char *)®istro,SIZE);
if (buscado==registro.codigo){
encontrado=true;
}
LuisHernndezYez
elseif(buscado<registro.codigo){
fin=mitad 1;
}
...
return 0;
LuisHernndezYez
...
insertar.cpp
void mostrar();
int main(){
mostrar();
tRegistro nuevoRegistro =nuevo(),registro;
fstream archivo;
archivo.open(BD,ios::in|ios::out |ios::binary);
LuisHernndezYez
archivo.seekg(0,ios::end);
int pos=archivo.tellg();
int numReg =pos/SIZE;
...
Fundamentosdeprogramacin:Archivosbinarios Pgina 1088
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);
LuisHernndezYez
}
...
else {//Hayquehacerhueco
for (int i=numReg 1;i>=pos;i){
archivo.seekg(i*SIZE,ios::beg);
archivo.read((char *)®istro,SIZE);
archivo.seekg((i+1)*SIZE,ios::beg);
archivo.write((char *)®istro,SIZE);
}
archivo.seekg(pos*SIZE,ios::beg);
archivo.write((char *)&nuevoRegistro,SIZE);
}
archivo.close();
mostrar(); nuevoRegistro
return 0;
LuisHernndezYez
Por el medio
LuisHernndezYez
Al final
tabla.cpp
tabla.registros[tabla.cont]=registro;
tabla.cont++;
}
archivo.close();
}
}
Fundamentosdeprogramacin:Archivosbinarios Pgina 1092
tabla.cpp
bd.cpp
#include<iostream>
usingnamespacestd;
#include"registro.h"
#include"tabla.h"
int main(){
tTabla tabla;
tTabla ok;
cargar(tabla,ok);
if(!ok){
cout<<"Erroralabrirelarchivo!"<<endl;
}
else {
mostrar(tabla);
insertar(tabla,nuevo(),ok);
mostrar(tabla);
LuisHernndezYez
guardar(tabla);
}
return 0;
}
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.
LuisHernndezYez