Fundamentos de la programación 3 GradoenIngenieríaInformática GradoenIngenieríadelSoftware GradoenIngenieríadeComputadores LuisHernándezYáñez Luis Hernández Yáñez FacultaddeInformática UniversidadComplutense Tipos, valores y variables Conversión de tipos Tipos declarados por el usuario Tipos enumerados Entrada/Salida con archivos de texto Lectura de archivos de texto Escritura en archivos de texto Flujo de ejecución Selección simple Operadores lógicos Anidamiento de if Condiciones Selección múltiple La escala if‐else‐if La instrucción switch Repetición El bucle while 227 232 236 238 248 253 266 272 276 282 286 290 293 295 302 313 316 Fundamentos de la programación: Tipos e instrucciones II El bucle for Bucles anidados Ámbito y visibilidad Secuencias Recorrido de secuencias Secuencias calculadas Búsqueda en secuencias Arrays de datos simples Uso de variables arrays Recorrido de arrays Búsqueda en arrays Arrays no completos 321 331 339 349 355 363 370 374 379 382 387 393 Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones II Página 227 Tipo Conjuntodevaloresconsusposiblesoperaciones Valor Conjuntodebitsinterpretadoscomodeuntipoconcreto Variable (oconstante) Ciertamemoriaconnombreparavaloresdeuntipo Luis Hernández Yáñez Declaración Instrucciónqueidentificaunnombre Definición Declaraciónqueasignamemoriaaunavariableoconstante Fundamentos de la programación: Tipos e instrucciones II Página 228 Luis Hernández Yáñez Memoriasuficienteparasutipodevalores short int i = 3; i int j = 9; j char c = 'a'; c a double x = 1.5; x 3 9 1.5 Elsignificadodelosbitsdependedeltipodelavariable: 00000000 00000000 00000000 01111000 Interpretadocomoint eselentero120 Interpretadocomochar (sólo01111000)eselcarácter'x' Fundamentos de la programación: Tipos e instrucciones II Página 229 Simples Estándar:int,float,double,char,bool Conjuntodevalorespredeterminado Definidosporelusuario:enumerados Conjuntodevaloresdefinidoporelprogramador Luis Hernández Yáñez Estructurados(Tema5) Coleccioneshomogéneas:arrays Todosloselementosdelacoleccióndeunmismotipo Coleccionesheterogéneas:estructuras Elementosdelacoleccióndetiposdistintos Fundamentos de programación: Tipos e instrucciones II Página 230 Consusposiblesmodificadores: [unsigned] [short] int long long int long int int float [long] double char Definicióndevariables: tipo nombre [ = expresión] [, ...]; Definicióndeconstantesconnombre: const tipo nombre = expresión; Fundamentos de la programación: Tipos e instrucciones II Página 231 Fundamentos de la programación: Tipos e instrucciones II Página 232 Luis Hernández Yáñez Luis Hernández Yáñez bool Promocióndetipos Dosoperandosdetiposdistintos: Elvalordeltipomenor sepromocionaaltipomayor Luis Hernández Yáñez b = a + 3 * 2; long double Promoción short int i = 3; int j = 2; double a = 1.5, b; b = a + i * j; double float long int int short int Valor3 short int (2bytes) int (4bytes) b = 1.5 + 6; Valor6 int (4bytes) double (8bytes) Fundamentos de la programación: Tipos e instrucciones II Conversiónsegura: Deuntipomenorauntipomayor short int int long int ... Página 233 long double double float long int Conversiónnosegura: int Deuntipomayorauntipomenor short int int entero = 1234; char caracter; caracter = entero; // Conversión no segura Luis Hernández Yáñez Menormemoria:Pérdidadeinformaciónenlaconversión Fundamentos de la programación: Tipos e instrucciones II Página 234 Fuerzanunaconversióndetipo: tipo(expresión) Elvalorresultantedelaexpresión setratacomounvalordeltipo int a = 3, b = 2; cout << a / b; // Muestra 1 (división entera) cout << double(a) / b; // Muestra 1.5 (división real) Luis Hernández Yáñez Tienenlamayorprioridad Página 235 Fundamentos de la programación: Tipos e instrucciones II Página 236 Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones II Describimoslosvaloresdelasvariablesdeltipo typedef descripción nombre_de_tipo; Identificadorválido Nombresdetipospropios: t minúsculaseguidadeunaovariaspalabrascapitalizadas typedef descripción tMiTipo; typedef descripción tMoneda; typedef descripción tTiposDeCalificacion; Declaracióndetipofrenteadefinicióndevariable Fundamentos de la programación: Tipos e instrucciones II Página 237 Fundamentos de la programación: Tipos e instrucciones II Página 238 Luis Hernández Yáñez Luis Hernández Yáñez Loscolorearemosennaranja,pararemarcarquesontipos Enumeracióndelconjuntodevaloresposiblesparalasvariables: enum { símbolo1, símbolo2, ..., símboloN } enum { Identificador } , enum { centimo, dos_centimos, cinco_centimos, diez_centimos, veinte_centimos, medio_euro, euro } Luis Hernández Yáñez Valoresliteralesquepuedentomarlasvariables(enamarillo) Fundamentos de la programación: Tipos e instrucciones II Página 239 Mejoranlalegibilidad typedef descripción nombre_de_tipo; Elegimosunnombreparaeltipo:tMoneda Luis Hernández Yáñez descripción typedef enum { centimo, dos_centimos, cinco_centimos, diez_centimos, veinte_centimos, medio_euro, euro } tMoneda; Enelámbitodeladeclaración,sereconoceunnuevotipotMoneda tMoneda moneda1, moneda2; Cadavariabledeesetipocontendráalgunodelossímbolos moneda1 = dos_centimos; moneda2 = euro; (Internamenteseusanenteros) Fundamentos de la programación: Tipos e instrucciones II moneda1 dos_centimos moneda2 euro Página 240 typedef enum { enero, febrero, marzo, abril, mayo, junio, julio, agosto, septiembre, octubre, noviembre, diciembre } tMes; tMes mes; Lecturadelavariablemes: cin >> mes; Seesperaunvalorentero Nosepuedeescribirdirectamenteenero ojunio Luis Hernández Yáñez Ysiseescribelavariableenlapantalla: cout << mes; Severáunnúmeroentero Códigodeentrada/salidaespecífico Fundamentos de la programación: Tipos e instrucciones II Página 241 Luis Hernández Yáñez typedef enum { enero, febrero, marzo, abril, mayo, junio, julio, agosto, septiembre, octubre, noviembre, diciembre } tMes; int op; cout << " 1 ‐ Enero" << endl; cout << " 2 ‐ Febrero" << endl; cout << " 3 ‐ Marzo" << endl; cout << " 4 ‐ Abril" << endl; cout << " 5 ‐ Mayo" << endl; cout << " 6 ‐ Junio" << endl; cout << " 7 ‐ Julio" << endl; cout << " 8 ‐ Agosto" << endl; cout << " 9 ‐ Septiembre" << endl; cout << "10 ‐ Octubre" << endl; cout << "11 ‐ Noviembre" << endl; cout << "12 ‐ Diciembre" << endl; cout << "Numero de mes: "; cin >> op; tMes mes = tMes(op ‐ 1); Fundamentos de la programación: Tipos e instrucciones II Página 242 typedef enum { enero, febrero, marzo, abril, mayo, junio, julio, agosto, septiembre, octubre, noviembre, diciembre } tMes; Luis Hernández Yáñez if (mes == enero) { cout << "enero"; } if (mes == febrero) { cout << "febrero"; } if (mes == marzo) { cout << "marzo"; } ... if (mes == diciembre) { cout << "diciembre"; } Tambiénpodemosutilizarunainstrucciónswitch Fundamentos de la programación: Tipos e instrucciones II Página 243 Conjuntodevaloresordenado(posiciónenlaenumeración) typedef enum { lunes, martes, miercoles, jueves, viernes, sabado, domingo } tDiaSemana; tDiaSemana dia; ... lunes < martes < miercoles < jueves < viernes < sabado < domingo if (dia == jueves)... bool noLaborable = (dia >= sabado); Luis Hernández Yáñez Noadmitenoperadoresdeincrementoydecremento Emulaciónconmoldes: int i = int(dia); // ¡dia no ha de valer domingo! i++; dia = tDiaSemana(i); Fundamentos de la programación: Tipos e instrucciones II Página 244 #include <iostream> using namespace std; Silostiposseusanenvariasfunciones, losdeclaramosantesdelosprototipos typedef enum { enero, febrero, marzo, abril, mayo, junio, julio, agosto, septiembre, octubre, noviembre, diciembre } tMes; typedef enum { lunes, martes, miercoles, jueves, viernes, sabado, domingo } tDiaSemana; Luis Hernández Yáñez string cadMes(tMes mes); string cadDia(tDiaSemana dia); int main() { tDiaSemana hoy = lunes; int dia = 21; tMes mes = octubre; int anio = 2013; ... Fundamentos de la programación: Tipos e instrucciones II Página 245 // Mostramos la fecha cout << "Hoy es: " << cadDia(hoy) << " " << dia << " de " << cadMes(mes) << " de " << anio << endl; Luis Hernández Yáñez cout << "Pasada la medianoche..." << endl; dia++; int i = int(hoy); i++; hoy = tDiaSemana(i); // Mostramos la fecha cout << "Hoy es: " << cadDia(hoy) << " " << dia << " de " << cadMes(mes) << " de " << anio << endl; return 0; } Fundamentos de la programación: Tipos e instrucciones II Página 246 fechas.cpp string cadMes(tMes mes) { string cad; string cadDia(tDiaSemana dia); string cad; if (dia == lunes) { cad = "lunes"; } if (dia == martes) { cad = "martes"; } ... if (dia == domingo) { cad = "domingo"; } return cad; } return cad; } Fundamentos de la programación: Tipos e instrucciones II Página 247 Fundamentos de la programación: Tipos e instrucciones II Página 248 Luis Hernández Yáñez Luis Hernández Yáñez if (mes == enero) { cad = "enero"; } if (mes == febrero) { cad = "febrero"; } ... if (mes == diciembre) { cad = "diciembre"; } Datosdelprograma:enlamemoriaprincipal(volátil) Medios(dispositivos)dealmacenamientopermanente: — Discosmagnéticosfijos(internos)oportátiles(externos) — Cintasmagnéticas — Discosópticos(CD,DVD,BlueRay) — MemoriasUSB … Luis Hernández Yáñez Mantienenlainformaciónenarchivos Secuenciasdedatos Fundamentos de la programación: Tipos e instrucciones II Página 249 Archivodetexto:secuenciadecaracteres T o t a l : 1 2 3 . 4 A … Archivobinario:contieneunasecuenciadecódigosbinarios A0 25 2F 04 D6 FF 00 27 6C CA 49 07 5F A4 … (Códigosrepresentadosennotaciónhexadecimal) Luis Hernández Yáñez Losarchivossemanejanenlosprogramaspormediodeflujos Archivosdetexto:flujosdetexto SimilaralaE/Sporconsola (Másadelanteveremoselusodearchivosbinarios) Fundamentos de la programación: Tipos e instrucciones II Página 250 Luis Hernández Yáñez Textosdispuestosensucesivaslíneas Carácterdefindelíneaentrelíneaylínea(Intro) Posiblementevariosdatosencadalínea Ejemplo:Comprasdelosclientes Encadalínea,NIFdelcliente,unidadescompradas,precio unitarioydescripcióndeproducto,separadosporespacio 12345678F 2 123.95 Reproductor de DVD↲ 00112233A 1 218.4 Disco portátil↲ 32143567J 3 32 Memoria USB 16Gb↲ 76329845H 1 134.5 Modem ADSL↲ ... Normalmenteterminanconundatoespecial(centinela) Porejemplo,unNIFqueseaX Fundamentos de la programación: Tipos e instrucciones II Página 251 #include <fstream> Lecturadelarchivo:flujodeentrada Escrituraenelarchivo:flujodesalida Nopodemosleeryescribirenunmismoflujo Unflujodetextosepuedeutilizarparalecturaoparaescritura: — Flujos(archivos)deentrada:variablesdetipoifstream — Flujos(archivos)desalida:variablesdetipoofstream Luis Hernández Yáñez Bibliotecafstream (sinespaciodenombres) Fundamentos de la programación: Tipos e instrucciones II Página 252 Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones II Flujosdetextodeentrada Página 253 ifstream Paraleerdeunarchivodetexto: 1 Declaraunavariabledetipoifstream 2 Asocialavariableconelarchivodetexto(aperturadelarchivo) 3 Realizalasoperacionesdelectura Luis Hernández Yáñez 4 Desligalavariabledelarchivodetexto(cierreelarchivo) Fundamentos de la programación: Tipos e instrucciones II Página 254 Aperturadelarchivo Conectalavariableconelarchivodetextodeldispositivo flujo.open(cadena_literal); ifstream archivo; archivo.open("abc.txt"); if (archivo.is_open()) ... Cierredelarchivo ¡Elarchivodebeexistir! is_open(): true sielarchivo sehapodidoabrir false encasocontrario Desconectalavariabledelarchivodetextodeldispositivo Luis Hernández Yáñez flujo.close(); archivo.close(); Fundamentos de la programación: Tipos e instrucciones II Página 255 Operacionesdelectura Luis Hernández Yáñez Extractor(>>) archivo >> variable; Saltaprimerolosespaciosenblanco(espacio,tab,Intro,...) Datosnuméricos:leehastaelprimercarácternoválido Cadenas(string):leehastaelsiguienteespacioenblanco archivo.get(c) Leeelsiguientecarácterenlavariablec,seaelquesea getline(archivo, cadena) Leeenlacadena todosloscaracteresquequedenenlalínea Incluidoslosespaciosenblanco Hastaelsiguientesaltodelínea(descartándolo) Conlosarchivosnotieneefectolafunciónsync() Fundamentos de la programación: Tipos e instrucciones II Página 256 Luis Hernández Yáñez ¿Quédeboleer? Unnúmero Usaelextractor archivo >> num; Uncarácter(seaelquesea) Usalafunciónget() archivo.get(c); Unacadenasinespacios Usaelextractor archivo >> cad; Unacadenaposiblementeconespacios Usalafuncióngetline() getline(archivo, cad); Fundamentos de la programación: Tipos e instrucciones II Página 257 ¿Dóndequedapendientelaentrada? Númeroleídoconelextractor Enelprimercarácternoválido(inc.espaciosenblanco) Carácterleídoconget() Enelsiguientecarácter(inc.espaciosenblanco) Luis Hernández Yáñez Unacadenaleídaconelextractor Enelsiguienteespacioenblanco Unacadenaleídaconlafuncióngetline() Alprincipiodelasiguientelínea Fundamentos de la programación: Tipos e instrucciones II Página 258 string nif, producto; int unidades; double precio; char aux; 1 ifstream archivo; 7 2 archivo.open("compras.txt"); // Apertura 5 6 4 3 archivo >> nif >> unidades >> precio; getline(archivo, producto); 3 2 1 Programa Luis Hernández Yáñez 4 archivo.close(); // Cierre Flujodeentrada archivo Fundamentos de la programación: Tipos e instrucciones II Página 259 archivo >> nif; archivo >> unidades; archivo >> precio; getline(archivo, producto); getline() nosaltaespacios 12345678F 2 123.95 Reproductor de DVD Elextractorsaltalosespacios Luis Hernández Yáñez nif 12345678F producto Reproductor de DVD unidades 2 precio 123.95 Espacio Fundamentos de la programación: Tipos e instrucciones II Página 260 archivo >> nif; archivo >> unidades; archivo >> precio; archivo.get(aux); // Salta el espacio en blanco getline(archivo, producto); 12345678F 2 123.95 Reproductor de DVD Leemoselespacio (nohacemosnadaconél) Luis Hernández Yáñez nif 12345678F producto Reproductor de DVD unidades 2 precio 123.95 Sinespacio Fundamentos de la programación: Tipos e instrucciones II Página 261 Luis Hernández Yáñez Cadalínea,datosdeunacompra Mostrareltotaldecadacompra unidadesx preciomásIVA(21%) Final:"X" comoNIF Bucledeprocesamiento: Cadapasodelbucle(ciclo)procesaunalínea(compra) Podemosusarlasmismasvariablesencadaciclo LeerprimerNIF MientraselNIFnoseaX: Leerunidades,precioydescripción Calcularymostrareltotal LeerelsiguienteNIF Fundamentos de la programación: Tipos e instrucciones II Página 262 Luis Hernández Yáñez #include <iostream> #include <string> using namespace std; #include <fstream> #include <iomanip> // Formato de salida int main() { const int IVA = 21; string nif, producto; int unidades; double precio, neto, total, iva; char aux; ifstream archivo; int contador = 0; archivo.open("compras.txt"); // Apertura ... Fundamentos de la programación: Tipos e instrucciones II Luis Hernández Yáñez leer.cpp Página 263 if (archivo.is_open()) { // Existe el archivo archivo >> nif; // Primer NIF while (nif != "X") { archivo >> unidades >> precio; archivo.get(aux); // Salta el espacio getline(archivo, producto); contador++; neto = unidades * precio; iva = neto * IVA / 100; total = neto + iva; cout << "Compra " << contador << ".‐" << endl; cout << " " << producto << ": " << unidades << " x " << fixed << setprecision(2) << precio << " = " << neto << " ‐ I.V.A.: " << iva << " ‐ Total: " << total << endl; archivo >> nif; // Siguiente NIF } ... Fundamentos de la programación: Tipos e instrucciones II Página 264 archivo.close(); // Cierre } else { cout << "ERROR: No se ha podido abrir el archivo" << endl; } return 0; Luis Hernández Yáñez } Página 265 Fundamentos de la programación: Tipos e instrucciones II Página 266 Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones II ofstream Flujosdetextodesalida Paracrearunarchivodetextoyescribirenél: 1 Declaraunavariabledetipoofstream 2 Asocialavariableconelarchivodetexto(creaelarchivo) 3 Realizalasescrituraspormediodeloperador<< (insertor) 4 Desligalavariabledelarchivodetexto(cierraelarchivo) Luis Hernández Yáñez ¡Atención! Sielarchivoyaexiste,seborratodoloquehubiera ¡Atención! Sinosecierraelarchivosepuedeperderinformación Fundamentos de la programación: Tipos e instrucciones II Página 267 int valor = 999; Programa 1 ofstream archivo; 2 archivo.open("output.txt"); // Apertura 2 1 ! Flujodesalida archivo Luis Hernández Yáñez a 3 archivo << 'X' << " Hola! " << 123.45 << endl << valor << "Bye!"; l 4 archivo.close(); // Cierre X Fundamentos de la programación: Tipos e instrucciones II o H Página 268 escribir.cpp #include <iostream> #include <string> using namespace std; #include <fstream> int main() { string nif, producto; int unidades; double precio; char aux; ofstream archivo; Luis Hernández Yáñez archivo.open("output.txt"); // Apertura (creación) cout << "NIF del cliente (X para terminar): "; cin >> nif; ... Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones II Página 269 while (nif != "X") { // Queda pendiente el Intro anterior... cin.get(aux); // Leemos el Intro cout << "Producto: "; getline(cin, producto); cout << "Unidades: "; cin >> unidades; cout << "Precio: "; cin >> precio; // Escribimos los datos en una línea del archivo... // Con un espacio de separación entre ellos archivo << nif << " " << unidades << " " << precio << " " << producto << endl; cout << "NIF del cliente (X para terminar): "; cin >> nif; } ... Fundamentos de la programación: Tipos e instrucciones II Página 270 // Escribimos el centinela final... archivo << "X"; archivo.close(); // Cierre del archivo return 0; Luis Hernández Yáñez } Página 271 Fundamentos de la programación: Tipos e instrucciones II Página 272 Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones II { Flujodeejecución Luis Hernández Yáñez double oper1, oper2, prod; Instrucción 1 cout << "Operando 1: "; Instrucción 2 cin >> oper1; Instrucción 3 cout << "Operando 2: "; ... cout << "Producto: " << prod; return 0; Instrucción N } Fundamentos de la programación: Tipos e instrucciones II Página 273 Unoentredosomáscaminosdeejecución Selecciónsimple(2caminos) Selecciónmúltiple(>2caminos) true true Instrucción T Condición false false true Instrucción F false true false Luis Hernández Yáñez if if‐else‐if switch Diagramas de flujo Fundamentos de la programación: Tipos e instrucciones II true false Página 274 Repetirlaejecucióndeunaomásinstrucciones Acumular,procesarcolecciones,... Inicialización Sí No ¿Iterar? while for Fundamentos de la programación: Tipos e instrucciones II Página 275 Fundamentos de la programación: Tipos e instrucciones II Página 276 Luis Hernández Yáñez Luis Hernández Yáñez Código Lainstrucciónif Luis Hernández Yáñez if (condición) { códigoT } [else { códigoF }] true BloqueT Condición false BloqueF Opcional condición:expresiónbool Cláusulaelse opcional Fundamentos de la programación: Tipos e instrucciones II Página 277 signo.cpp Luis Hernández Yáñez int num; cin >> num; if (num < 0) { cout << "Negativo"; } cin >> num; else { false true cout << "Positivo"; num < 0 } cout << "Negativo"; cout << "Positivo"; cout << endl; cout << endl; Fundamentos de la programación: Tipos e instrucciones II Página 278 int num; cin >> num; 1_29 129 if (num < 0) { _ Positivo _ cout << "Negativo"; } else { cout << "Positivo"; cin >> num; } false cout << endl; num < 0 num 129 ? Luis Hernández Yáñez cout << "Positivo"; cout << endl; Fundamentos de la programación: Tipos e instrucciones II Página 279 int num; cin >> num; ‐5 if (num < 0) { Negativo _ cout << "Negativo"; } else { cout << "Positivo"; cin >> num; } cout << endl; true num < 0 num Luis Hernández Yáñez cout << "Negativo"; cout << endl; Fundamentos de la programación: Tipos e instrucciones II Página 280 ‐5 ? división.cpp Divisiónentredosnúmerosprotegidafrenteaintentodedivisiónpor0 int main() { double numerador, denominador, resultado; cout << "Numerador: "; cin >> numerador; cout << "Denominador: "; cin >> denominador; if (denominador == 0) { cout << "Imposible dividir entre 0!"; } else { resultado = numerador / denominador; cout << "Resultado: " << resultado << endl; } return 0; } Fundamentos de la programación: Tipos e instrucciones II Página 281 Fundamentos de la programación: Tipos e instrucciones II Página 282 Luis Hernández Yáñez Luis Hernández Yáñez #include <iostream> using namespace std; Seaplicanavaloresbool (condiciones) Elresultadoesdetipobool ! NO Monario && Y Binario || O Binario Operadores (prioridad) ... ! * / % + ‐ < <= > >= Luis Hernández Yáñez == != && || Fundamentos de la programación: Tipos e instrucciones II ! Página 283 && true false || true false true false true true false true true true false true false false false false true false NO(Not) Y(And) O(Or) bool cond1, cond2, resultado; int a = 2, b = 3, c = 4; resultado = !(a < 5); // !(2 < 5) !true false Luis Hernández Yáñez cond1 = (a * b + c) >= 12; // 10 >= 12 false cond2 = (a * (b + c)) >= 12; // 14 >= 12 true resultado = cond1 && cond2; // false && true false resultado = cond1 || cond2; // false || true true Fundamentos de la programación: Tipos e instrucciones II Página 284 condiciones.cpp int main() { int num; cout << "Introduce un número entre 1 y 10: "; cin >> num; if ((num >= 1) && (num <= 10)) { cout << "Número dentro del intervalo de valores válidos"; } else { cout << "Número no válido!"; } Condicionesequivalentes return 0; ((num >= 1) && (num <= 10)) } ¡Encierralascondiciones simplesentreparéntesis! ((num > 0) && (num < 11)) ((num >= 1) && (num < 11)) ((num > 0) && (num <= 10)) Fundamentos de la programación: Tipos e instrucciones II Página 285 Fundamentos de la programación: Tipos e instrucciones II Página 286 Luis Hernández Yáñez Luis Hernández Yáñez #include <iostream> using namespace std; Luis Hernández Yáñez diasmes.cpp int mes, anio, dias; cout << "Número de mes: "; cin >> mes; cout << "Año: "; cin >> anio; if (mes == 2) { if (bisiesto(mes, anio)) { dias = 29; } else { dias = 28; } } else { if ((mes == 1) || (mes == 3) || (mes == 5) || (mes == 7) || (mes == 8) || (mes == 10) || (mes == 12)) { dias = 31; } else { dias = 30; } } Fundamentos de la programación: Tipos e instrucciones II Página 287 Luis Hernández Yáñez CalendarioGregoriano:bisiestosidivisiblepor4,exceptoelúltimo decadasiglo(divisiblepor100),salvoqueseadivisiblepor400 bool bisiesto(int mes, int anio) { bool esBisiesto; if ((anio % 4) == 0) { // Divisible por 4 if (((anio % 100) == 0) && ((anio % 400) != 0)) { // Pero último de siglo y no múltiplo de 400 esBisiesto = false; } else { esBisiesto = true; // Año bisiesto } } else { esBisiesto = false; } return esBisiesto; } Fundamentos de la programación: Tipos e instrucciones II Página 288 if (condición1) { if (condición2) {...} else {...} } else { if (condición3) { if (condición4) {...} if (condición5) {...} else {...} } else { ... Unamalasangríapuedeconfundir if (x > 0) { if (y > 0) {...} else {...} if (x > 0) { if (y > 0) {...} else {...} Lasangríaayudaaasociarloselse consusif Fundamentos de la programación: Tipos e instrucciones II Página 289 Fundamentos de la programación: Tipos e instrucciones II Página 290 Luis Hernández Yáñez Luis Hernández Yáñez Cadaelse seasociaalif anteriormáscercanosinasociar(mismobloque) • Condiciónsimple: num < 0 car == 'a' isalpha(car) 12 Expresiónlógica(true/false) Sinoperadoreslógicos CompatibilidadconellenguajeC: 0 esequivalenteafalse Cualquiervalordistintode0 esequivalenteatrue Luis Hernández Yáñez • Condicióncompuesta: Combinacióndecondicionessimplesyoperadoreslógicos !isalpha(car) (num < 0) || (car == 'a') (num < 0) && ((car == 'a') || !isalpha(car)) Noconfundaseloperadordeigualdad(==) coneloperadordeasignación(=). Fundamentos de la programación: Tipos e instrucciones II Página 291 ShortcutBooleanEvaluation true || X true (n == 0) || (x >= 1.0 / n) Sin es0:¿divisiónporcero?(segundacondición) Comolaprimeraseríatrue:¡noseevalúalasegunda! Luis Hernández Yáñez false && X false (n != 0) && (x < 1.0 / n) Sin es0:¿divisiónporcero?(segundacondición) Comolaprimeraseríafalse:¡noseevalúalasegunda! Fundamentos de la programación: Tipos e instrucciones II Página 292 Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones II Página 293 true false true false true false true Luis Hernández Yáñez false if‐else‐if switch Fundamentos de la programación: Tipos e instrucciones II Página 294 Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones II Ejemplo: Calificación(enletras) deunestudianteenbase asunotanumérica(0‐10) Página 295 true == 10 cout << "MH" false true Si nota == 10 entoncesMH sino,si nota >= 9 entoncesSB sino,si nota >= 7 entoncesNT Luis Hernández Yáñez sino,si nota >= 5 entoncesAP sino SS Fundamentos de la programación: Tipos e instrucciones II >= 9 false cout << "SB" true >= 7 false cout << "NT" true >= 5 cout << "AP" false cout << "SS" Página 296 Luis Hernández Yáñez nota.cpp double nota; cin >> nota; if (nota == 10) { cout << "MH"; } else { if (nota >= 9) { cout << "SB"; } else { if (nota >= 7) { cout << "NT"; } else { if (nota >= 5) { cout << "AP"; } else { cout << "SS"; } } } } double nota; cin >> nota; if (nota == 10) { cout << "MH"; } else if (nota >= 9) { cout << "SB"; } else if (nota >= 7) { cout << "NT"; } else if (nota >= 5) { cout << "AP"; } else { cout << "SS"; } Fundamentos de la programación: Tipos e instrucciones II Página 297 ¡Cuidadoconelordendelascondiciones! Luis Hernández Yáñez double nota; cin >> nota; if (nota < 5) { cout << "SS"; } else if (nota < 7) { cout << "AP"; } else if (nota < 9) { cout << "NT"; } else if (nota < 10) { cout << "SB"; } else { cout << "MH"; } ¡Noseejecutannunca! double nota; cin >> nota; if (nota >= 5) { cout << "AP"; } else if (nota >= 7) { cout << "NT"; } else if (nota >= 9) { cout << "SB"; } else if (nota == 10) { cout << "MH"; } else { cout << "SS"; } SólomuestraAPoSS Fundamentos de la programación: Tipos e instrucciones II Página 298 Simplificacióndelascondiciones 0 SS 5 AP 7 NT 9 SB 10 MH Luis Hernández Yáñez if (nota == 10) { cout << "MH"; } else if ((nota < 10) && (nota >= 9)) { cout << "SB"; } else if ((nota < 9) && (nota >= 7)) { cout << "NT"; } else if ((nota < 7) && (nota >= 5)) { cout << "AP"; } else if (nota < 5) { cout << "SS"; } Siempretrue:ramaselse Sinoes10,esmenorque10 if (nota == 10) { cout << "MH"; } Sinoes>=9,esmenorque9 else if (nota >= 9) {cout << "SB"; } Sinoes>=7,esmenorque7 else if (nota >= 7) { cout << "NT"; } … else if (nota >= 5) { cout << "AP"; } true && X X else { cout << "SS"; } Fundamentos de la programación: Tipos e instrucciones II Página 299 Luis Hernández Yáñez nivel.cpp #include <iostream> Si num == 4 entonces Muy alto using namespace std; Si num == 3 entonces Alto int main() { Si num == 2 entonces Medio int num; cout << "Introduce el nivel: "; Si num == 1 entonces Bajo cin >> num; if (num == 4) { cout << "Muy alto" << endl; } else if (num == 3) { cout << "Alto" << endl; } else if (num == 2) { cout << "Medio" << endl; } else if (num == 1) { cout << "Bajo" << endl; } else { cout << "Valor no válido" << endl; } return 0; } Fundamentos de la programación: Tipos e instrucciones II Página 300 if (num == 4) cout << "Muy alto"; else if (num == 3) cout << "Alto"; else if (num == 2) cout << "Medio"; else if (num == 1) cout << "Bajo"; else cout << "Valor no válido"; cout << endl; Fundamentos de la programación: Tipos e instrucciones II Página 301 Fundamentos de la programación: Tipos e instrucciones II Página 302 Luis Hernández Yáñez Luis Hernández Yáñez if (num == 4) { cout << "Muy alto" << endl; } else if (num == 3) { cout << "Alto" << endl; } else if (num == 2) { cout << "Medio" << endl; } else if (num == 1) { cout << "Bajo" << endl; } else cout << "Valor no válido" << endl; } Luis Hernández Yáñez Selecciónentrevaloresposiblesdeunaexpresión switch (expresión) { case constante1: { código1 } [break;] case constante2: { código2 } [break;] ... Fundamentos de la programación: Tipos e instrucciones II case constanteN: { códigoN } [break;] [default: { códigoDefault }] } Página 303 Luis Hernández Yáñez nivel2.cpp switch (num) { case 4: { cout << "Muy alto"; } break; case 3: { cout << "Alto"; } break; case 2: { cout << "Medio"; } break; case 1: { cout << "Bajo"; } break; default: { cout << "Valor no válido"; } } Fundamentos de la programación: Tipos e instrucciones II Sinum == 4 Muyalto Sinum == 3 Alto Sinum == 2 Medio Sinum == 1 Bajo Página 304 Luis Hernández Yáñez Interrumpe elswitch;continúaenlainstrucciónquelesiga switch (num) { ... case 3: { cout << "Alto"; } break; case 2: { cout << "Medio"; } break; ... } Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones II switch (num) { ... case 3: { cout << "Alto"; } case 2: { cout << "Medio"; } case 1: { cout << "Bajo"; } default: { cout << "Valor no válido"; } } Fundamentos de la programación: Tipos e instrucciones II Num: 3 Alto Página 305 Num: 3 Alto Medio Bajo Valor no válido Página 306 true num==4 Muy alto break; false Sinbreak; true num==3 Alto break; false Sinbreak; true num==2 Medio break; false Sinbreak; true num==1 Luis Hernández Yáñez false Bajo break; Sinbreak; default No válido Fundamentos de la programación: Tipos e instrucciones II int menu() { int op = ‐1; // Cualquiera no válida Luis Hernández Yáñez while ((op < 0) || (op > 4)) { cout << "1 ‐ Nuevo cliente" << endl; cout << "2 ‐ Editar cliente" << endl; cout << "3 ‐ Baja cliente" << endl; cout << "4 ‐ Ver cliente" << endl; cout << "0 ‐ Salir" << endl; cout << "Opción: "; cin >> op; Página 307 1 ‐ Nuevo cliente 2 ‐ Editar cliente 3 ‐ Baja cliente 4 ‐ Ver cliente 0 ‐ Salir Opción: 5 ¡Opción no válida! 1 ‐ Nuevo cliente 2 ‐ Editar cliente 3 ‐ Baja cliente 4 ‐ Ver cliente 0 ‐ Salir Opción: 3 if ((op < 0) || (op > 4)) { cout << "¡Opción no válida!" << endl; } } return op; } Fundamentos de la programación: Tipos e instrucciones II Página 308 Luis Hernández Yáñez int opcion; ... opcion = menu(); switch (opcion) { case 1: { cout << "En la opción 1..." << endl; } break; case 2: { cout << "En la opción 2..." << endl; } break; case 3: { cout << "En la opción 3..." << endl; } break; case 4: { cout << "En la opción 4..." << endl; } // En la última no necesitamos break } Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones II Página 309 int opcion; ... opcion = menu(); while (opcion != 0) { switch (opcion) { case 1: { cout << "En la opción 1..." << endl; } break; ... case 4: { cout << "En la opción 4..." << endl; } } // switch ... opcion = menu(); } // while Fundamentos de la programación: Tipos e instrucciones II Página 310 Luis Hernández Yáñez nota2.cpp int nota; // Sin decimales cout << "Nota (0‐10): "; cin >> nota; switch (nota) { case 0: case 1: case 2: case 3: case 4: { cout << "Suspenso"; } break; // De 0 a 4: SS case 5: case 6: { cout << "Aprobado"; } break; // 5 o 6: AP Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones II case case { 7: 8: cout << "Notable"; } break; // 7 u 8: NT case 9: case 10: { cout << "Sobresaliente"; } break; // 9 o 10: SB default: { cout << "¡No válida!"; } } Página 311 typedef enum { enero, febrero, marzo, abril, mayo, junio, julio, agosto, septiembre, octubre, noviembre, diciembre } tMes; tMes mes; ... switch (mes) { case enero: { cout << "enero"; } break; case febrero: { cout << "febrero"; } break; ... case diciembre: { cout << "diciembre"; } } Fundamentos de la programación: Tipos e instrucciones II Página 312 Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones II Página 313 Inicialización Sí ¿Iterar? No Luis Hernández Yáñez Cuerpo Bucleswhile yfor Fundamentos de la programación: Tipos e instrucciones II Página 314 Númerodeiteracionescondicionado(recorridovariable): — — Buclewhile while (condición) cuerpo Ejecutaelcuerpo mientraslacondición seatrue Bucledo‐while Compruebalacondiciónalfinal(loveremosmásadelante) Númerodeiteracionesprefijado(recorridofijo): Buclefor for (inicialización; condición; paso) cuerpo Ejecutaelcuerpo mientraslacondición seatrue Seusaunavariablecontadoraentera Fundamentos de la programación: Tipos e instrucciones II Página 315 Fundamentos de la programación: Tipos e instrucciones II Página 316 Luis Hernández Yáñez Luis Hernández Yáñez — while.cpp Mientraslacondiciónseacierta,ejecutaelcuerpo while (condición) { cuerpo } Condiciónalprincipiodelbucle int i = 1; // Inicialización de la variable i while (i <= 100) { cout << i << endl; i++; } Luis Hernández Yáñez Muestralosnúmerosdel1al100 Fundamentos de la programación: Tipos e instrucciones II Página 317 int i = 1; while (i <= 100) { cout << i << endl; i++; } true Condición Cuerpo i = 1 i 100 101 99 ? 3 2 1 4 _ 1 true i <= 100 Luis Hernández Yáñez cout << i << endl; i++ Fundamentos de la programación: Tipos e instrucciones II false 2 3 99 100 _ Página 318 false ¿Ysilacondiciónesfalsaalcomenzar? Noseejecutaelcuerpodelbucleningunavez Luis Hernández Yáñez int op; cout << "Introduce la opción: "; cin >> op; while ((op < 0) || (op > 4)) { cout << "¡No válida! Inténtalo otra vez" << endl; cout << "Introduce la opción: "; cin >> op; } Sielusuariointroduceunnúmeroentre0y4: Noseejecutaelcuerpodelbucle Fundamentos de la programación: Tipos e instrucciones II Página 319 primero.cpp Primerenterocuyocuadradoesmayorque1.000 #include <iostream> using namespace std; int main() { int num = 1; Luis Hernández Yáñez while (num * num <= 1000) { num++; } ¡Ejecutaelprogramapara sabercuálesesenúmero! Empezamos en 1 Incrementamos en 1 cout << "1er. entero con cuadrado mayor que 1.000: " << num << endl; return 0; } Recorrelasecuencia denúmeros1,2,3,4,5,... Fundamentos de la programación: Tipos e instrucciones II Página 320 #include <iostream> Recorrelasecuencia using namespace std; denúmerosintroducidos int main() { double num, suma = 0, media = 0; int cont = 0; cout << "Introduce un número (0 para terminar): "; cin >> num; Leemos el primero while (num != 0) { // 0 para terminar suma = suma + num; cont++; cout << "Introduce un número (0 para terminar): "; cin >> num; Leemos el siguiente } if (cont > 0) { media = suma / cont; } cout << "Suma = " << suma << endl; cout << "Media = " << media << endl; return 0; } Fundamentos de la programación: Tipos e instrucciones II Página 321 Fundamentos de la programación: Tipos e instrucciones II Página 322 Luis Hernández Yáñez Luis Hernández Yáñez sumamedia.cpp Númerodeiteracionesprefijado Variablecontadoraquedeterminaelnúmerodeiteraciones: for ([int] var = ini; condición; paso) cuerpo Luis Hernández Yáñez Lacondición comparaelvalordevar conunvalorfinal Elpaso incrementaodecrementaelvalordevar Elvalordevar debeiraproximándosealvalorfinal for (int i = 1; i <= 100; i++)... 1, 2, 3, 4, 5, ..., 100 for (int i = 100; i >= 1; i‐‐)... 100, 99, 98, 97, ..., 1 Tantoscicloscomovalorestomalavariablecontadora Fundamentos de la programación: Tipos e instrucciones II Página 323 for (inicialización; condición; paso) cuerpo for (int i = 1; i <= 100; i++) { cout << i; } i = 1 true i <= 100 false Luis Hernández Yáñez cout << i; i++ Fundamentos de la programación: Tipos e instrucciones II Página 324 for1.cpp for (int i = 1; i <= 100; i++) { cout << i << endl; } i 100 101 2?3 1 ... 1 2 i = 1 3 true i <= 100 cout << i << endl; 99 100 _ Luis Hernández Yáñez i++ false Fundamentos de la programación: Tipos e instrucciones II Página 325 Lavariablecontadora for2.cpp Elpaso notieneporquéirdeunoenuno: for (int i = 1; i <= 100; i = i + 2) cout << i << endl; Estebuclefor muestralosnúmerosimparesde1a99 Muyimportante ElcuerpodelbucleNUNCA debealterarelvalordelcontador Luis Hernández Yáñez Garantíadeterminación Todobucledebeterminarsuejecución Buclesfor:lavariablecontadoradebeconvergeralvalorfinal Fundamentos de la programación: Tipos e instrucciones II Página 326 suma.cpp #include <iostream> using namespace std; long long int suma(int n); Luis Hernández Yáñez int main() { int num; cout << "Número final: "; cin >> num; if (num > 0) { // El número debe ser positivo cout << "La suma de los números entre 1 y " << num << " es: " << suma(num); } return 0; } long long int suma(int n) { long long int total = 0; for (int i = 1; i <= n; i++) { total = total + i; } Recorrelasecuencia denúmeros return total; 1,2,3,4,5,...,n } Fundamentos de la programación: Tipos e instrucciones II Página 327 ¿Incremento/decrementoprefijoopostfijo? Esindiferente Estosdosbuclesproducenelmismoresultado: for (int i = 1; i <= 100; i++) ... for (int i = 1; i <= 100; ++i) ... Luis Hernández Yáñez Buclesinfinitos for (int i = 1; i <= 100; i‐‐) ... 1 0 ‐1 ‐2 ‐3 ‐4 ‐5 ‐6 ‐7 ‐8 ‐9 ‐10 ‐11 ... Cadavezmáslejosdelvalorfinal(100) Esunerrordediseño/programación Fundamentos de la programación: Tipos e instrucciones II Página 328 Declaradaenelpropiobucle for (int i = 1; ...) Sóloseconoceenelcuerpodelbucle(suámbito) Nosepuedeusareninstruccionesquesiganalbucle Declaradaantesdelbucle Luis Hernández Yáñez int i; for (i = 1; ...) Seconoceenelcuerpodelbucleydespuésdelmismo Ámbitoexternoalbucle Fundamentos de la programación: Tipos e instrucciones II Página 329 Losbuclesfor sepuedenreescribircomobuclescondicionados for (int i = 1; i <= 100; i++) cuerpo Esequivalentea: int i = 1; while (i <= 100) { cuerpo i++; } Luis Hernández Yáñez Lainversanoessiempreposible: int i; cin >> i; while (i != 0) { cuerpo cin >> i; } ¿Buclefor equivalente? ¡Nosabemoscuántosnúmeros introduciráelusuario! Fundamentos de la programación: Tipos e instrucciones II Página 330 Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones II Luis Hernández Yáñez Unbuclefor enelcuerpodeotrobuclefor Cadaunoconsupropiavariablecontadora: for (int i = 1; i <= 100; i++) { for (int j = 1; j <= 5; j++) { cuerpo } } Paracadavalordei elvalordej varíaentre1 y5 j varíamásrápido quei Página 331 i 1 1 1 1 1 2 2 2 2 2 3 j 1 2 3 4 5 1 2 3 4 5 1 ... Fundamentos de la programación: Tipos e instrucciones II Página 332 tablas.cpp #include <iostream> using namespace std; #include <iomanip> Luis Hernández Yáñez int main() { for (int i = 1; i <= 10; i++) { for (int j = 1; j <= 10; j++) { cout << setw(2) << i << " x " << setw(2) << j << " = " << setw(3) << i * j << endl; } } 1 x 1 = 1 1 x 2 = 2 1 x 3 = 3 1 x 4 = 4 ... 1 x 10 = 10 2 x 1 = 2 2 x 2 = 4 ... 10 x 7 = 70 10 x 8 = 80 10 x 9 = 90 10 x 10 = 100 return 0; } Fundamentos de la programación: Tipos e instrucciones II Página 333 tablas2.cpp Luis Hernández Yáñez #include <iostream> using namespace std; #include <iomanip> int main() { for (int i = 1; i <= 10; i++) { cout << "Tabla del " << i << endl; cout << "‐‐‐‐‐‐‐‐‐‐‐‐‐‐" << endl; for (int j = 1; j <= 10; j++) { cout << setw(2) << i << " x " << setw(2) << j << " = " << setw(3) << i * j << endl; } cout << endl; } return 0; } Fundamentos de la programación: Tipos e instrucciones II Página 334 menú.cpp #include <iostream> using namespace std; #include <iomanip> Luis Hernández Yáñez int menu(); // 1: Tablas de multiplicación; 2: Sumatorio long long int suma(int n); // Sumatorio int main() { int opcion = menu(); while (opcion != 0) { switch (opcion) { case 1: { for (int i = 1; i <= 10; i++) { for (int j = 1; j <= 10; j++) { cout << setw(2) << i << " x " << setw(2) << j << " = " << setw(3) << i * j << endl; } } } break; ... Fundamentos de la programación: Tipos e instrucciones II Página 335 case 2: { int num = 0; while (num <= 0) { cout << "Hasta (positivo)? "; cin >> num; } cout << "La suma de los números del 1 al " << num << " es: " << suma(num) << endl; } } // switch opcion = menu(); } // while (opcion != 0) return 0; Luis Hernández Yáñez } Fundamentos de la programación: Tipos e instrucciones II Página 336 Luis Hernández Yáñez int menu() { int op = ‐1; while ((op < 0) || (op > 2)) { cout << "1 ‐ Tablas de multiplicar" << endl; cout << "2 ‐ Sumatorio" << endl; cout << "0 ‐ Salir" << endl; cout << "Opción: " << endl; cin >> op; if ((op < 0) || (op > 2)) { cout << "¡Opción no válida!" << endl; } } return op; } long long int suma(int n) { long long int total = 0; for (int i = 1; i <= n; i++) { total = total + i; } return total; } Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones II Página 337 while (opcion != 0) { ... for (int i = 1; i <= 10; i++) { for (int j = 1; j <= 10; j++) { ... } } while (num <= 0) { ... suma() } for (int i = 1; i <= n; i++) { ... } while ((op < 0) || (op > 2)) { ... } menu() } Fundamentos de la programación: Tipos e instrucciones II Página 338 Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones II Página 339 Luis Hernández Yáñez Cadabloquecreaunnuevoámbito: int main() { double d = ‐1, suma = 0; 3ámbitosanidados int cont = 0; while (d != 0) { cin >> d; if (d != 0) { suma = suma + d; cont++; } } cout << "Suma = " << suma << endl; cout << "Media = " << suma / cont << endl; return 0; } Fundamentos de la programación: Tipos e instrucciones II Página 340 Luis Hernández Yáñez Unidentificadorseconoce enelámbitoenelqueestádeclarado (apartirdesuinstruccióndedeclaración) yenlossubámbitosposteriores Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones II Página 341 int main() { Ámbitodelavariabled double d; if (...) { int cont = 0; for (int i = 0; i <= 10; i++) { ... } } char c; if (...) { double x; ... } return 0; } Fundamentos de la programación: Tipos e instrucciones II Página 342 Luis Hernández Yáñez int main() { double d; if (...) { Ámbitodelavariablecont int cont = 0; for (int i = 0; i <= 10; i++) { ... } } char c; if (...) { double x; ... } return 0; } Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones II Página 343 int main() { double d; if (...) { int cont = 0; for (int i = 0; i <= 10; i++) { ... } Ámbitodelavariablei } char c; if (...) { double x; ... } return 0; } Fundamentos de la programación: Tipos e instrucciones II Página 344 Luis Hernández Yáñez int main() { double d; if (...) { int cont = 0; for (int i = 0; i <= 10; i++) { ... } } char c; if (...) { Ámbitodelavariablec double x; ... } return 0; } Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones II Página 345 int main() { double d; if (...) { int cont = 0; for (int i = 0; i <= 10; i++) { ... } } char c; if (...) { double x; ... Ámbitodelavariablex } return 0; } Fundamentos de la programación: Tipos e instrucciones II Página 346 Luis Hernández Yáñez Sienunsubámbitosedeclara unidentificadorconidénticonombre queunoyadeclaradoenelámbito, eldelsubámbitooculta aldelámbito (noesvisible) Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones II Página 347 int main() { Oculta,ensuámbito,alai anterior int i, x; if (...) { Oculta,ensuámbito,alai anterior int i = 0; for(int i = 0; i <= 10; i++) { ... } } char c; if (...) { Oculta,ensuámbito,alax anterior double x; ... } return 0; } Fundamentos de la programación: Tipos e instrucciones II Página 348 Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones II Página 349 Sucesióndeelementosdeunmismotipoqueseaccedenlinealmente elemento secuencia secuencia o (Secuenciavacía) elemento Luis Hernández Yáñez 1 34 12 26 4 87 184 52 Comienzaenunprimer elemento(sinoestávacía) Acadaelementolesigueotrasecuencia(vacía,sieselúltimo) Accesosecuencial(lineal) Secomienzasiempreaccediendoalprimerelemento Desdeunelementosólosepuedeaccederasuelementosiguiente (sucesor),siesqueexiste Todosloselementos,deunmismotipo Fundamentos de la programación: Tipos e instrucciones II Página 350 Notratamossecuenciasinfinitas:siemprehayunúltimoelemento Secuenciasexplícitas: — Sucesióndedatosdeundispositivo(teclado,disco,sensor,...) Secuenciascalculadas: — Fórmuladerecurrenciaquedeterminaelelementosiguiente Listas(másadelante) Secuenciasexplícitasquemanejaremos: Luis Hernández Yáñez Datosintroducidosporeltecladooleídosdeunarchivo Conunelementoespecialalfinaldelasecuencia(centinela) 1 34 12 26 4 87 184 52 ‐1 Fundamentos de la programación: Tipos e instrucciones II Página 351 Secuenciaexplícitaleídadearchivo: — Detectarlamarcadefinaldearchivo(Eof ‐ End offile) — Detectarunvalorcentinelaalfinal Luis Hernández Yáñez Secuenciaexplícitaleídadelteclado: — Preguntaralusuariosiquiereintroducirunnuevodato — Preguntaralusuarioprimerocuántosdatosvaaintroducir — Detectarunvalorcentinelaalfinal Valorcentinela: Valorespecialalfinalquenopuededarseenlasecuencia (Secuenciadenúmerospositivos centinela:cualquiernegativo) 12 4 37 23 8 19 83 63 Fundamentos de la programación: Tipos e instrucciones II 2 35 17 76 15 ‐1 Página 352 Debehaberalgúnvalorquenoseaunelementoválido Secuenciasnuméricas: Sisepermitecualquiernúmero,nohaycentinelaposible Cadenasdecaracteres: ¿Caracteresespeciales(noimprimibles)? Enrealidadelvalorcentinelaespartedelasecuencia, perosusignificadoesespecialynoseprocesacomoelresto Significaquesehaalcanzadoelfinaldelasecuencia (Inclusoaunquehayaelementosposteriores) Luis Hernández Yáñez Últimoelemento 12 4 37 23 8 19 83 63 ‐1 35 17 76 15 Noseprocesan Fundamentos de la programación: Tipos e instrucciones II Página 353 Tratamientodeloselementosunoaunodesdeelprimero Recorrido Unmismotratamientoparatodosloselementosdelasecuencia Ej.‐ Mostrarloselementosdeunasecuencia,sumarlosnúmeros deunasecuencia,¿paroimparcadanúmerodeunasecuencia?,... Terminaalllegaralfinaldelasecuencia Luis Hernández Yáñez Búsqueda Recorridodelasecuenciahastaencontrarunelementobuscado Ej.‐ Localizarelprimernúmeroqueseamayorque1.000 Terminaallocalizarelprimerelementoquecumplelacondición oalllegaralfinaldelasecuencia(noencontrado) Fundamentos de la programación: Tipos e instrucciones II Página 354 Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones II Página 355 Unmismotratamientoatodosloselementos Luis Hernández Yáñez Inicialización Mientrasnoselleguealfinaldelasecuencia: Obtenerelsiguienteelemento Procesarelelemento Finalización Alempezarseobtieneelprimerelementodelasecuencia Enlossiguientespasosdelbuclesevanobteniendo lossiguienteselementosdelasecuencia Fundamentos de la programación: Tipos e instrucciones II Página 356 Inicialización ¿Alfinal? true false Obtenerelemento Luis Hernández Yáñez Procesarelemento Nosabemoscuántos elementoshay Nopodemos implementarconfor Finalización Fundamentos de la programación: Tipos e instrucciones II Página 357 Implementaciónconwhile Inicialización Obtenerelprimerelemento Mientrasnoseaelcentinela: Procesarelelemento Obtenerelsiguienteelemento Finalización Inicialización Obtener1º ¿Centinela? true false Procesarelemento Luis Hernández Yáñez Obtenersiguiente Finalización Fundamentos de la programación: Tipos e instrucciones II Página 358 Secuenciadenúmerospositivos Luis Hernández Yáñez Siempreserealizaalmenosunalectura Centinela:‐1 double d, suma = 0; Inicialización cout << "Valor (‐1 termina): "; Primerelemento cin >> d; while (d != ‐1) { Mientrasnoelcentinela suma = suma + d; Procesarelemento cout << "Valor (‐1 termina): "; Siguienteelemento cin >> d; } cout << "Suma = " << suma << endl; Finalización Fundamentos de la programación: Tipos e instrucciones II Longituddeunasecuenciadecaracteres Página 359 longitud.cpp Luis Hernández Yáñez Centinela:carácterpunto(.) int longitud() { int l = 0; char c; cout << "Texto terminado en punto: "; cin >> c; // Obtener primer carácter while (c != '.') { // Mientras no el centinela l++; // Procesar cin >> c; // Obtener siguiente carácter } return l; } Fundamentos de la programación: Tipos e instrucciones II Página 360 ¿Cuántasvecesapareceuncarácterenunacadena? Luis Hernández Yáñez Centinela:asterisco(*) cont.cpp char buscado, c; int cont = 0; cout << "Carácter a buscar: "; cin >> buscado; cout << "Cadena: "; cin >> c; Primerelemento while (c != '*') { Mientrasnoelcentinela if (c == buscado) { Procesarelemento cont++; } Siguienteelemento cin >> c; } cout << buscado << " aparece " << cont << " veces."; Fundamentos de la programación: Tipos e instrucciones II Sumadelosnúmerosdelasecuencia Página 361 suma2.cpp Luis Hernández Yáñez Centinela:0 int sumaSecuencia() { double d, suma = 0; ifstream archivo; // Archivo de entrada (lectura) archivo.open("datos.txt"); if (archivo.is_open()) { archivo >> d; // Obtener el primero while (d != 0) { // Mientras no sea el centinela suma = suma + d; // Procesar el dato archivo >> d; // Obtener el siguiente } archivo.close(); } return suma; } Fundamentos de la programación: Tipos e instrucciones II Página 362 Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones II Página 363 sumatorio.cpp Recurrencia: ei+1 =ei +1 e1 =1 1 2 3 4 5 6 7 8 ... Luis Hernández Yáñez Sumadelosnúmerosdelasecuenciacalculada: int main() { int num; cout << "N = "; cin >> num; cout << "Sumatorio:" << suma(num); return 0; } long long int suma(int n) { int sumatorio = 0; for (int i = 1; i <= n; i++) { sumatorio = sumatorio + i; } return sumatorio; Últimoelementodelasecuencia:n } Fundamentos de la programación: Tipos e instrucciones II Página 364 long long int suma(int n) { int sumatorio = 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 2 1 1 5 4 3 2 1 4 3 2 1 3 2 1 Luis Hernández Yáñez Secuencia true sumatorio += i; i = i + 1; Fundamentos de la programación: Tipos e instrucciones II Página 365 Definición Fi =Fi‐1 +Fi‐2 F1 =0 F2 =1 0 1 1 2 3 5 8 13 21 34 55 89 ... Luis Hernández Yáñez ¿Findelasecuencia? PrimernúmerodeFibonaccimayorqueunnúmerodado EsenúmerodeFibonacciactúacomocentinela Sinum es50,lasecuenciaserá: 0 1 1 2 3 5 8 13 21 34 Fundamentos de la programación: Tipos e instrucciones II Página 366 fibonacci.cpp Luis Hernández Yáñez Recorridodelasecuenciacalculada int num, fib, fibMenos2 = 0, fibMenos1 = 1; // 1º y 2º fib = fibMenos2 + fibMenos1; // Calculamos el tercero cout << "Hasta: "; cin >> num; if (num >= 1) { // Ha de ser entero positivo cout << "0 1 "; // Los dos primeros son <= num while (fib <= num) { // Mientras no mayor que num cout << fib << " "; fibMenos2 = fibMenos1; // Actualizamos anteriores fibMenos1 = fib; // para obtener... fib = fibMenos2 + fibMenos1; // ... el siguiente } } ¿Demasiadoscomentarios? Paranooscurecerelcódigo,mejorunaexplicaciónalprincipio Fundamentos de la programación: Tipos e instrucciones II Página 367 Elbuclecalculaadecuadamentelasecuencia: while (fib <= num) { cout << fib << " "; fibMenos2 = fibMenos1; fibMenos1 = fib; fib = fibMenos2 + fibMenos1; } Luis Hernández Yáñez num 100 ? fib 5 2 3 1 ? fibMenos1 3 1 2 ? fibMenos2 2 1 0 ? Fundamentos de la programación: Tipos e instrucciones II 0 1 1 2 3 5 ... Página 368 Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones II Página 369 Localizacióndelprimerelementoconunapropiedad Luis Hernández Yáñez Inicialización Mientrasnoseencuentreelelemento y noseestéalfinaldelasecuencia: Obtenerelsiguienteelemento Comprobarsielelementosatisfacelacondición Finalización (tratarelelementoencontradooindicarquenosehaencontrado) Elementoquesebusca:satisfaráunacondición Doscondicionesdeterminacióndelbucle:seencuentra/alfinal Variablelógicaqueindiquesisehaencontrado Fundamentos de la programación: Tipos e instrucciones II Página 370 Localizacióndelprimerelementoconunapropiedad Inicialización/encontrado = false; ¿Alfinalo encontrado? true false Obtenerelemento Luis Hernández Yáñez ¿Encontrado? Finalización Fundamentos de la programación: Tipos e instrucciones II Página 371 Implementaciónconwhile Inicialización Obtenerelprimerelemento Mientrasniencontradonielcentinela: Obtenerelsiguienteelemento Finalización(¿encontrado?) Inicialización Obtener1º ¿Encontrado ocentinela? false Luis Hernández Yáñez Obtenersiguiente Finalización Fundamentos de la programación: Tipos e instrucciones II Página 372 true Primernúmeromayorqueunodado busca.cpp double d, num; bool encontrado = false; cout << "Encontrar primero mayor que: "; cin >> num; cout << "Siguiente (‐1 para terminar): "; cin >> d; // Obtener el primer elemento while ((d != ‐1) && !encontrado) { // Mientras no sea el centinela y no se encuentre if (d > num) { // ¿Encontrado? encontrado = true; } else { cout << "Siguiente (‐1 para terminar): "; cin >> d; // Obtener el siguiente elemento } } Fundamentos de la programación: Tipos e instrucciones II Página 373 Fundamentos de la programación: Tipos e instrucciones II Página 374 Luis Hernández Yáñez Luis Hernández Yáñez Centinela:‐1 Coleccioneshomogéneas Unmismotipodedatoparavarioselementos: Notas de los estudiantes de una clase Ventas de cada día de la semana Temperaturas de cada día del mes ... EnlugardedeclararN variables... Luis Hernández Yáñez vLun 125.40 vMar 76.95 vMie 328.80 vJue 254.62 vVie 435.00 vSab 164.29 vDom 0.00 ...declaramosunatabladeN valores: ventas 125.40 Índices 0 76.95 1 328.80 254.62 435.00 164.29 2 3 4 5 Fundamentos de la programación: Tipos e instrucciones II 0.00 6 Página 375 Estructurasecuencial Cadaelementoseencuentraenunaposición(índice): Losíndicessonenterospositivos Elíndicedelprimerelementosiemprees0 Losíndicesseincrementandeunoenuno ventas 125.40 Luis Hernández Yáñez 0 76.95 1 328.80 254.62 435.00 164.29 2 3 4 0.00 5 6 Accesodirecto Acadaelementoseaccedeatravésdesuíndice: ventas[4] accedeal5ºelemento(contieneelvalor435.00) cout << ventas[4]; ventas[4] = 442.75; Datosdeunmismotipobase: Seusancomocualquiervariable Fundamentos de la programación: Tipos e instrucciones II Página 376 Declaracióndetiposdearrays typedef tipo_base nombre_tipo[tamaño]; Ejemplos: Luis Hernández Yáñez typedef typedef typedef typedef typedef double tTemp[7]; short int tDiasMes[12]; char tVocales[5]; double tVentas[31]; tMoneda tCalderilla[15]; // Enumerado tMoneda Recuerda: Adoptamoselconveniodecomenzar losnombresdetipoconunat minúscula,seguida deunaovariaspalabras,cadaunaconsuinicialenmayúscula Fundamentos de la programación: Tipos e instrucciones II Página 377 Declaracióndevariablesarrays typedef typedef typedef typedef tipo nombre; double tTemp[7]; short int tDiasMes[12]; char tVocales[5]; double tVentas[31]; Ejemplos: tempMax ? ? ? ? ? ? ? tTemp tempMax; 0 tDiasMes diasMes; 1 2 1 2 3 5 6 4 5 6 7 8 9 10 11 vocales ? ? ? ? ? tVocales vocales; 0 Luis Hernández Yáñez 4 diasMes ? ? ? ? ? ? ? ? ? ? ? ? 0 tVentas ventasFeb; 3 1 2 ventasFeb ? ? ? ? ? ? ? ? ? ? ? ? ? 0 1 2 3 4 5 6 7 8 9 10 11 12 NOseinicializanloselementosautomáticamente Fundamentos de la programación: Tipos e instrucciones II Página 378 3 ... 4 ? 30 Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones II Página 379 nombre[índice] Cadaelementoseaccedeatravésdesuíndice(posiciónenelarray) tVocales vocales; vocales typedef char tVocales[5]; 'a' 'e' 'i' 'o' 'u' 0 1 2 3 4 5elementos,índicesde0a4: vocales[0] vocales[1] vocales[2] vocales[3] vocales[4] Procesamientodecadaelemento: Comocualquierotravariabledeltipobase Luis Hernández Yáñez cout << vocales[4]; vocales[3] = 'o'; if (vocales[i] == 'e') ... Fundamentos de la programación: Tipos e instrucciones II Página 380 ¡IMPORTANTE! ¡Nosecompruebasielíndiceescorrecto! ¡Esresponsabilidaddelprogramador! const int Dim = 100; typedef double tVentas[Dim]; tVentas ventas; Índicesválidos:enterosentre0yDim‐1 ¿Quéesventas[100]?¿Oventas[‐1]?¿Oventas[132]? ¡Memoriadealgunaotravariabledelprograma! Definelostamañosdelosarraysconconstantes Fundamentos de la programación: Tipos e instrucciones II Página 381 Fundamentos de la programación: Tipos e instrucciones II Página 382 Luis Hernández Yáñez Luis Hernández Yáñez ventas[0] ventas[1] ventas[2] ... ventas[98] ventas[99] Arrays:tamañofijo Buclederecorridofijo(for) Ejemplo:Mediadeunarraydetemperaturas Luis Hernández Yáñez const int Dias = 7; typedef double tTemp[Dias]; tTemp temp; double media, total = 0; ... for (int i = 0; i < Dias; i++) { total = total + temp[i]; } media = total / Dias; Fundamentos de la programación: Tipos e instrucciones II 12.40 10.96 8.43 11.65 13.70 13.41 14.07 0 1 2 3 4 5 6 tTemp temp; double media, total = 0; ... for (int i = 0; i < Dias; i++) { total = total + temp[i]; } Memoria i = 0 true i<Dias total+=temp[i] Luis Hernández Yáñez Página 383 false ... i++ Fundamentos de la programación: Tipos e instrucciones II Dias 7 temp[0] 12.40 temp[1] 10.96 temp[2] 8.43 temp[3] 11.65 temp[4] 13.70 temp[5] 13.41 temp[6] 14.07 media ? total 23.36 31.79 84.62 12.40 0.00 43.44 i 3 2 70 4 1 Página 384 mediatemp.cpp #include <iostream> using namespace std; const int Dias = 7; typedef double tTemp[Dias]; Luis Hernández Yáñez double media(const tTemp temp); int main() { tTemp temp; for (int i = 0; i < Dias; i++) { // Recorrido del array cout << "Temperatura del día " << i + 1 << ": "; cin >> temp[i]; } cout << "Temperatura media: " << media(temp) << endl; return 0; } Losusuariosusande1a7paranumerarlosdías ... Lainterfazdebeaproximarsealosusuarios, aunqueinternamenteseusenlosíndicesde0a6 Fundamentos de la programación: Tipos e instrucciones II Página 385 double media(const tTemp temp) { double med, total = 0; for (int i = 0; i < Dias; i++) { // Recorrido del array total = total + temp[i]; } med = total / Dias; return med; } Luis Hernández Yáñez Losarrayssepasanalasfuncionescomoconstantes Lasfuncionesnopuedendevolverarrays Fundamentos de la programación: Tipos e instrucciones II Página 386 const int Cuantas = 15; typedef enum { centimo, dos_centimos, cinco_centimos, diez_centimos, veinte_centimos, medio_euro, euro } tMoneda; typedef tMoneda tCalderilla[Cuantas]; tCalderilla bolsillo; // Exactamente llevo Cuantas monedas bolsillo[0] = euro; bolsillo[1] = cinco_centimos; bolsillo[2] = medio_euro; bolsillo[3] = euro; bolsillo[4] = centimo; ... for (int moneda = 0; moneda < Cuantas; moneda++) cout << aCadena(bolsillo[moneda]) << endl; Fundamentos de la programación: Tipos e instrucciones II Página 387 Fundamentos de la programación: Tipos e instrucciones II Página 388 Luis Hernández Yáñez Luis Hernández Yáñez string aCadena(tMoneda moneda); // Devuelve la cadena correspondiente al valor de moneda buscaarray.cpp ¿Quédíalasventassuperaronlos1.000€? int busca(const tVentas ventas) { // Índice del primer elemento mayor que 1000 (‐1 si no hay) bool encontrado = false; int ind = 0; while ((ind < Dias) && !encontrado) { // Esquema de búsqueda if (ventas[ind] > 1000) { encontrado = true; } else { ind++; } } if (!encontrado) { ind = ‐1; } return ind; } Fundamentos de la programación: Tipos e instrucciones II Página 389 Fundamentos de la programación: Tipos e instrucciones II Página 390 Luis Hernández Yáñez Luis Hernández Yáñez const int Dias = 365; // Año no bisiesto typedef double tVentas[Dias]; Luis Hernández Yáñez Lacapacidaddeunarraynopuedeseralteradaenlaejecución Eltamañodeunarrayesunadecisióndediseño: Enocasionesseráfácil(díasdelasemana) Cuandopuedavariarhadeestimarseuntamaño Nicortoniconmuchodesperdicio(posicionessinusar) STL (StandardTemplateLibrary)deC++: Coleccionesmáseficientescuyotamañopuedevariar Fundamentos de la programación: Tipos e instrucciones II Página 391 Nosepuedencopiardosarrays(delmismotipo)conasignación: array2 = array1; // ¡¡¡ NO COPIA LOS ELEMENTOS !!! Luis Hernández Yáñez Handecopiarseloselementosunoauno: for (int i = 0; i < N; i++) { array2[i] = array1[i]; } Fundamentos de la programación: Tipos e instrucciones II Página 392 Luis Hernández Yáñez Fundamentos de la programación: Tipos e instrucciones II Página 393 Puedequenonecesitemostodaslasposicionesdeunarray... Ladimensióndelarrayseráelmáximodeelementos Peropodremostenermenoselementosdelmáximo Necesitamosuncontadordeelementos... Luis Hernández Yáñez const int Max = 100; typedef double tArray[Max]; tArray lista; int contador = 0; contador:indicacuántasposicionesdelarrayseutilizan Sóloaccederemosalasposicionesentre0ycontador‐1 Lasdemásposicionesnocontieneninformacióndelprograma Fundamentos de la programación: Tipos e instrucciones II Página 394 lista.cpp #include <iostream> using namespace std; #include <fstream> const int Max = 100; typedef double tArray[Max]; Luis Hernández Yáñez double media(const tArray lista, int cont); int main() { tArray lista; int contador = 0; double valor, med; ifstream archivo; archivo.open("lista.txt"); if (archivo.is_open()) { archivo >> valor; while ((valor != ‐1) && (contador < Max)) { lista[contador] = valor; contador++; archivo >> valor; } ... Fundamentos de la programación: Tipos e instrucciones II Página 395 archivo.close(); med = media(lista, contador); cout << "Media de los elementos de la lista: " << med << endl; } else { cout << "¡No se pudo abrir el archivo!" << endl; } return 0; Luis Hernández Yáñez } double media(const tArray lista, int cont) { double med, total = 0; for (int ind = 0; ind < cont; ind++) { total = total + lista[ind]; } med = total / cont; Sólorecorremoshastacont‐1 return med; } Fundamentos de la programación: Tipos e instrucciones II Página 396 LicenciaCC(Creative Commons) Estetipodelicenciasofrecenalgunosderechosaterceraspersonas bajociertascondiciones. Estedocumentotieneestablecidaslassiguientes: Reconocimiento(Attribution): Encualquierexplotacióndelaobraautorizadaporlalicencia haráfaltareconocerlaautoría. Luis Hernández Yáñez Nocomercial(Noncommercial): Laexplotacióndelaobraquedalimitadaausosnocomerciales. Compartirigual(Sharealike): Laexplotaciónautorizadaincluyelacreacióndeobrasderivadas siemprequemantenganlamismalicenciaalserdivulgadas. Pulsaenlaimagendearribaaladerechaparasabermás. Fundamentos de la programación: Tipos e instrucciones II Página 397