Fundamentos de la programación 3 - fdi.ucm.es · Facultad de Informática Universidad Complutense...

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

Transcript of Fundamentos de la programación 3 - fdi.ucm.es · Facultad de Informática Universidad Complutense...

3

GradoenIngenieríaInformáticaGradoenIngenieríadelSoftware

GradoenIngenieríadeComputadores

LuisHernándezYáñez

FacultaddeInformáticaUniversidadComplutense

Fundamentos de la programaciónLuis Hernández Yáñez

Fundamentos de la programación: Tipos e instrucciones II

Tipos, valores y variables 227Conversión de tipos 232Tipos declarados por el usuario 236Tipos enumerados 238Entrada/Salida

con archivos de texto 248Lectura de archivos de texto 253Escritura en archivos de texto 266

Flujo de ejecución 272Selección simple 276Operadores lógicos 282Anidamiento de if 286Condiciones 290Selección múltiple 293

La escala if‐else‐if 295La instrucción switch 302

Repetición 313El bucle while 316

El bucle for 321Bucles anidados 331

Ámbito y visibilidad 339Secuencias 349

Recorrido de secuencias 355Secuencias calculadas 363Búsqueda en secuencias 370

Arrays de datos simples 374Uso de variables arrays 379Recorrido de arrays 382Búsqueda en arrays 387Arrays no completos 393

Luis Hernández Yáñez

Página 227Fundamentos de la programación: Tipos e instrucciones II

Luis Hernández Yáñez

TipoConjuntodevaloresconsusposiblesoperaciones

ValorConjuntodebitsinterpretadoscomodeuntipoconcreto

Variable (oconstante)Ciertamemoriaconnombreparavaloresdeuntipo

DeclaraciónInstrucciónqueidentificaunnombre

DefiniciónDeclaraciónqueasignamemoriaaunavariableoconstante

Página 228Fundamentos de la programación: Tipos e instrucciones II

Luis Hernández Yáñez

Memoriasuficienteparasutipodevalores

short int i = 3;

int j = 9;

char c = 'a';

double x = 1.5;

Elsignificadodelosbitsdependedeltipodelavariable:00000000 00000000 00000000 01111000

Interpretadocomoint eselentero120

Interpretadocomochar (sólo01111000)eselcarácter'x'

Página 229Fundamentos de la programación: Tipos e instrucciones II

ii 3

jj 9

cc a

xx 1.5

Luis Hernández Yáñez

Simples

Estándar:int,float,double,char,boolConjuntodevalorespredeterminado

Definidosporelusuario:enumeradosConjuntodevaloresdefinidoporelprogramador

Estructurados(Tema5)

Coleccioneshomogéneas:arraysTodosloselementosdelacoleccióndeunmismotipo

Coleccionesheterogéneas:estructurasElementosdelacoleccióndetiposdistintos

Página 230Fundamentos de programación: Tipos e instrucciones II

Luis Hernández Yáñez

Consusposiblesmodificadores:

[unsigned] [short] int

long long int

float

[long] double

char

bool

Página 231Fundamentos de la programación: Tipos e instrucciones II

Definicióndevariables:tipo nombre [ = expresión] [, ...];

Definicióndeconstantesconnombre:const tipo nombre = expresión;

long int int

Luis Hernández Yáñez

Página 232Fundamentos de la programación: Tipos e instrucciones II

Luis Hernández Yáñez

PromocióndetiposDosoperandosdetiposdistintos:Elvalordeltipomenor sepromocionaaltipomayor

short int i = 3;

int j = 2;

double a = 1.5, b;

b = a + i * j;

Página 233Fundamentos de la programación: Tipos e instrucciones II

long double

double

float

long int

int

short int

Promoción

Promoción

Valor3 short int (2bytes) int (4bytes)Valor3 short int (2bytes) int (4bytes)

Valor6 int (4bytes) double (8bytes)Valor6 int (4bytes) double (8bytes)

b = a + 3 * 2;

b = 1.5 + 6;

Luis Hernández Yáñez

Conversiónsegura:

Deuntipomenorauntipomayorshort int int long int ...

Conversiónnosegura:

Deuntipomayorauntipomenorint entero = 1234;

char caracter;

caracter = entero; // Conversión no segura

Menormemoria:Pérdidadeinformaciónenlaconversión

Página 234Fundamentos de la programación: Tipos e instrucciones II

long double

double

float

long int

int

short int

Luis Hernández Yáñez

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)

Tienenlamayorprioridad

Página 235Fundamentos de la programación: Tipos e instrucciones II

Luis Hernández Yáñez

Página 236Fundamentos de la programación: Tipos e instrucciones II

Luis Hernández Yáñez

Describimoslosvaloresdelasvariablesdeltipotypedef descripción nombre_de_tipo;

Página 237Fundamentos de la programación: Tipos e instrucciones II

Nombresdetipospropios:

tminúsculaseguidadeunaovariaspalabrascapitalizadas

Loscolorearemosennaranja,pararemarcarquesontipos

typedef descripción tMiTipo;typedef descripción tMoneda;typedef descripción tTiposDeCalificacion;

typedef descripción tMiTipo;typedef descripción tMoneda;typedef descripción tTiposDeCalificacion;

Identificadorválido

Declaracióndetipofrenteadefinicióndevariable

Luis Hernández Yáñez

Página 238Fundamentos de la programación: Tipos e instrucciones II

Luis Hernández Yáñez

Enumeracióndelconjuntodevaloresposiblesparalasvariables:

enum { símbolo1, símbolo2, ..., símboloN }

enum { centimo, dos_centimos, cinco_centimos,diez_centimos, veinte_centimos,medio_euro, euro }

Valoresliteralesquepuedentomarlasvariables(enamarillo)

Página 239Fundamentos de la programación: Tipos e instrucciones II

enumenum

,

{ Identificador }

Luis Hernández Yáñez

typedef descripción nombre_de_tipo;

Elegimosunnombreparaeltipo:tMoneda

typedef enum { centimo, dos_centimos, cinco_centimos,diez_centimos, veinte_centimos,medio_euro, euro } tMoneda;

Página 240Fundamentos de la programación: Tipos e instrucciones II

Enelámbitodeladeclaración,sereconoceunnuevotipotMoneda

tMoneda moneda1, moneda2;

Cadavariabledeesetipocontendráalgunodelossímbolosmoneda1 = dos_centimos;moneda2 = euro;

moneda1moneda1 dos_centimos

moneda2moneda2 euro

descripcióndescripción

MejoranlalegibilidadMejoranlalegibilidad

(Internamenteseusanenteros)(Internamenteseusanenteros)

Luis Hernández Yáñez

typedef enum { enero, febrero, marzo, abril, mayo,junio, julio, agosto, septiembre, octubre,noviembre, diciembre } tMes;

tMes mes;

Lecturadelavariablemes:

cin >> mes;

SeesperaunvalorenteroNosepuedeescribirdirectamenteenero ojunio

Ysiseescribelavariableenlapantalla:cout << mes;

Severáunnúmeroentero

Códigodeentrada/salidaespecífico

Página 241Fundamentos de la programación: Tipos e instrucciones II

Luis Hernández Yáñez

typedef enum { enero, febrero, marzo, abril, mayo, junio, julio,agosto, septiembre, octubre, noviembre, diciembre } tMes;

Página 242Fundamentos de la programación: Tipos e instrucciones II

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);

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);

Luis Hernández Yáñez

typedef enum { enero, febrero, marzo, abril, mayo, junio, julio,agosto, septiembre, octubre, noviembre, diciembre } tMes;

Página 243Fundamentos de la programación: Tipos e instrucciones II

if (mes == enero) {cout << "enero";

}if (mes == febrero) {

cout << "febrero";}if (mes == marzo) {

cout << "marzo";}...if (mes == diciembre) {

cout << "diciembre";}

if (mes == enero) {cout << "enero";

}if (mes == febrero) {

cout << "febrero";}if (mes == marzo) {

cout << "marzo";}...if (mes == diciembre) {

cout << "diciembre";}

TambiénpodemosutilizarunainstrucciónswitchTambiénpodemosutilizarunainstrucciónswitch

Luis Hernández Yáñez

Conjuntodevaloresordenado(posiciónenlaenumeración)typedef enum { lunes, martes, miercoles, jueves,

viernes, sabado, domingo } tDiaSemana;

tDiaSemana dia;

...

if (dia == jueves)...

bool noLaborable = (dia >= sabado);

NoadmitenoperadoresdeincrementoydecrementoEmulaciónconmoldes:int i = int(dia); // ¡dia no ha de valer domingo!i++;dia = tDiaSemana(i);

Página 244Fundamentos de la programación: Tipos e instrucciones II

lunes < martes < miercoles < jueves< viernes < sabado < domingo

Luis Hernández Yáñez

#include <iostream>using namespace std;

typedef enum { enero, febrero, marzo, abril, mayo,junio, julio, agosto, septiembre, octubre,noviembre, diciembre } tMes;

typedef enum { lunes, martes, miercoles, jueves,viernes, sabado, domingo } tDiaSemana;

string cadMes(tMes mes);string cadDia(tDiaSemana dia);

int main() {tDiaSemana hoy = lunes;int dia = 21;tMes mes = octubre;int anio = 2013;...

Página 245Fundamentos de la programación: Tipos e instrucciones II

Silostiposseusanenvariasfunciones,losdeclaramosantesdelosprototipos

Luis Hernández Yáñez

// Mostramos la fechacout << "Hoy es: " << cadDia(hoy) << " " << dia

<< " de " << cadMes(mes) << " de " << anio<< endl;

cout << "Pasada la medianoche..." << endl;dia++;int i = int(hoy);i++;hoy = tDiaSemana(i);

// Mostramos la fechacout << "Hoy es: " << cadDia(hoy) << " " << dia

<< " de " << cadMes(mes) << " de " << anio<< endl;

return 0;}

Página 246Fundamentos de la programación: Tipos e instrucciones II

Luis Hernández Yáñez

string cadMes(tMes mes) {string cad;

if (mes == enero) {cad = "enero";

}if (mes == febrero) {

cad = "febrero";}...if (mes == diciembre) {

cad = "diciembre";}

return cad;}

string cadDia(tDiaSemana dia);string cad;

if (dia == lunes) {cad = "lunes";

}if (dia == martes) {

cad = "martes";}...if (dia == domingo) {

cad = "domingo";}

return cad;}

Página 247Fundamentos de la programación: Tipos e instrucciones II

fechas.cppfechas.cppLuis Hernández Yáñez

Página 248Fundamentos de la programación: Tipos e instrucciones II

Luis Hernández Yáñez

Datosdelprograma:enlamemoriaprincipal(volátil)

Medios(dispositivos)dealmacenamientopermanente:

— Discosmagnéticosfijos(internos)oportátiles(externos)

— Cintasmagnéticas

— Discosópticos(CD,DVD,BlueRay)

— MemoriasUSB

Mantienenlainformaciónenarchivos

Secuenciasdedatos

Página 249Fundamentos de la programación: Tipos e instrucciones II

Luis Hernández Yáñez

Archivodetexto:secuenciadecaracteres

Archivobinario:contieneunasecuenciadecódigosbinarios

Losarchivossemanejanenlosprogramaspormediodeflujos

Archivosdetexto:flujosdetextoSimilaralaE/Sporconsola

(Másadelanteveremoselusodearchivosbinarios)

Página 250Fundamentos de la programación: Tipos e instrucciones II

A0 25 2F 04 D6 FF 00 27 6C CA 49 07 5F A4 …

T o t a l : 1 2 3 . 4 A …

(Códigosrepresentadosennotaciónhexadecimal)(Códigosrepresentadosennotaciónhexadecimal)

Luis Hernández Yáñez

TextosdispuestosensucesivaslíneasCarácterdefindelíneaentrelíneaylínea(Intro)

Posiblementevariosdatosencadalínea

Ejemplo:Comprasdelosclientes

Encadalínea,NIFdelcliente,unidadescompradas,preciounitarioydescripcióndeproducto,separadosporespacio12345678F 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

Página 251Fundamentos de la programación: Tipos e instrucciones II

Luis Hernández Yáñez

Lecturadelarchivo:flujodeentrada

Escrituraenelarchivo:flujodesalida

Nopodemosleeryescribirenunmismoflujo

Unflujodetextosepuedeutilizarparalecturaoparaescritura:

— Flujos(archivos)deentrada:variablesdetipoifstream

— Flujos(archivos)desalida:variablesdetipoofstream

Bibliotecafstream (sinespaciodenombres)

Página 252Fundamentos de la programación: Tipos e instrucciones II

#include <fstream>

Luis Hernández Yáñez

Página 253Fundamentos de la programación: Tipos e instrucciones II

Luis Hernández Yáñez

FlujosdetextodeentradaParaleerdeunarchivodetexto:

Declaraunavariabledetipoifstream

Asocialavariableconelarchivodetexto(aperturadelarchivo)

Realizalasoperacionesdelectura

Desligalavariabledelarchivodetexto(cierreelarchivo)

Página 254Fundamentos de la programación: Tipos e instrucciones II

1

2

3

4

ifstream

Luis Hernández Yáñez

AperturadelarchivoConectalavariableconelarchivodetextodeldispositivo

flujo.open(cadena_literal);

ifstream archivo;

archivo.open("abc.txt");

if (archivo.is_open()) ...

CierredelarchivoDesconectalavariabledelarchivodetextodeldispositivo

flujo.close();

archivo.close();

Página 255Fundamentos de la programación: Tipos e instrucciones II

¡Elarchivodebeexistir!is_open():true sielarchivosehapodidoabrirfalse encasocontrario

Luis Hernández Yáñez

Operacionesdelectura Extractor(>>) archivo >> variable;

Saltaprimerolosespaciosenblanco(espacio,tab,Intro,...)

Datosnuméricos:leehastaelprimercarácternoválidoCadenas(string):leehastaelsiguienteespacioenblanco

archivo.get(c)

Leeelsiguientecarácterenlavariablec,seaelquesea

getline(archivo, cadena)

Leeenlacadena todosloscaracteresquequedenenlalínea

Incluidoslosespaciosenblanco

Hastaelsiguientesaltodelínea(descartándolo)

Conlosarchivosnotieneefectolafunciónsync()

Página 256Fundamentos de la programación: Tipos e instrucciones II

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);

Página 257Fundamentos de la programación: Tipos e instrucciones II

Luis Hernández Yáñez

¿Dóndequedapendientelaentrada? Númeroleídoconelextractor

Enelprimercarácternoválido(inc.espaciosenblanco)

Carácterleídoconget()

Enelsiguientecarácter(inc.espaciosenblanco)

UnacadenaleídaconelextractorEnelsiguienteespacioenblanco

Unacadenaleídaconlafuncióngetline()

Alprincipiodelasiguientelínea

Página 258Fundamentos de la programación: Tipos e instrucciones II

Luis Hernández Yáñez

Programa

string nif, producto;

int unidades;

double precio;

char aux;

Página 259Fundamentos de la programación: Tipos e instrucciones II

7

6

5

4

3

2

1

FlujodeentradaarchivoFlujodeentradaarchivo

1 ifstream archivo;

2 archivo.open("compras.txt"); // Apertura

3 archivo >> nif >> unidades >> precio;

getline(archivo, producto);

4 archivo.close(); // Cierre

Luis Hernández Yáñez

archivo >> nif;

archivo >> unidades;

archivo >> precio;

getline(archivo, producto);

Página 260Fundamentos de la programación: Tipos e instrucciones II

productoproducto Reproductor de DVD precioprecio 123.95

unidadesunidades 2nifnif 12345678F

12345678F 2 123.95 Reproductor de DVD

EspacioEspacio

ElextractorsaltalosespaciosElextractorsaltalosespacios

getline() nosaltaespaciosgetline() nosaltaespacios

Luis Hernández Yáñez

archivo >> nif;

archivo >> unidades;

archivo >> precio;

archivo.get(aux); // Salta el espacio en blanco

getline(archivo, producto);

Página 261Fundamentos de la programación: Tipos e instrucciones II

productoproducto Reproductor de DVD precioprecio 123.95

unidadesunidades 2nifnif 12345678F

12345678F 2 123.95 Reproductor de DVD

SinespacioSinespacio

Leemoselespacio(nohacemosnadaconél)Leemoselespacio(nohacemosnadaconél)

Luis Hernández Yáñez

Cadalínea,datosdeunacompra

Mostrareltotaldecadacompraunidadesx preciomásIVA(21%)

Final:"X" comoNIF

Bucledeprocesamiento:

Cadapasodelbucle(ciclo)procesaunalínea(compra)

Podemosusarlasmismasvariablesencadaciclo

LeerprimerNIF

MientraselNIFnoseaX:

Leerunidades,precioydescripción

Calcularymostrareltotal

LeerelsiguienteNIF

Página 262Fundamentos de la programación: Tipos e instrucciones II

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...

Página 263Fundamentos de la programación: Tipos e instrucciones II

leer.cppleer.cpp

Luis Hernández Yáñez

if (archivo.is_open()) { // Existe el archivoarchivo >> nif; // Primer NIFwhile (nif != "X") {

archivo >> unidades >> precio;archivo.get(aux); // Salta el espaciogetline(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} ...

Página 264Fundamentos de la programación: Tipos e instrucciones II

Luis Hernández Yáñez

archivo.close(); // Cierre}else {

cout << "ERROR: No se ha podido abrir el archivo"<< endl;

}return 0;

}

Página 265Fundamentos de la programación: Tipos e instrucciones II

Luis Hernández Yáñez

Página 266Fundamentos de la programación: Tipos e instrucciones II

Luis Hernández Yáñez

FlujosdetextodesalidaParacrearunarchivodetextoyescribirenél:

Declaraunavariabledetipoofstream

Asocialavariableconelarchivodetexto(creaelarchivo)

Realizalasescrituraspormediodeloperador<< (insertor)

Desligalavariabledelarchivodetexto(cierraelarchivo)

Página 267Fundamentos de la programación: Tipos e instrucciones II

1

2

3

4

¡Atención!Sielarchivoyaexiste,seborratodoloquehubiera

¡Atención!Sinosecierraelarchivosepuedeperderinformación

ofstream

Luis Hernández Yáñez

int valor = 999;

Página 268Fundamentos de la programación: Tipos e instrucciones II

2

1

!

a

l

o

H

X

FlujodesalidaarchivoFlujodesalidaarchivo

Programa

1 ofstream archivo;

2 archivo.open("output.txt"); // Apertura

3 archivo << 'X' << " Hola! " << 123.45

<< endl << valor << "Bye!";

4 archivo.close(); // Cierre

Luis Hernández Yáñez

#include <iostream>#include <string>using namespace std;#include <fstream>

int main() {string nif, producto;int unidades;double precio;char aux;ofstream archivo;

archivo.open("output.txt"); // Apertura (creación)

cout << "NIF del cliente (X para terminar): ";cin >> nif;...

Página 269Fundamentos de la programación: Tipos e instrucciones II

escribir.cppescribir.cppLuis Hernández Yáñez

while (nif != "X") {// Queda pendiente el Intro anterior...cin.get(aux); // Leemos el Introcout << "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 ellosarchivo << nif << " " << unidades << " "

<< precio << " " << producto << endl;cout << "NIF del cliente (X para terminar): ";cin >> nif;

}...

Página 270Fundamentos de la programación: Tipos e instrucciones II

Luis Hernández Yáñez

// Escribimos el centinela final...archivo << "X";archivo.close(); // Cierre del archivo

return 0;}

Página 271Fundamentos de la programación: Tipos e instrucciones II

Luis Hernández Yáñez

Página 272Fundamentos de la programación: Tipos e instrucciones II

Luis Hernández Yáñez

Página 273Fundamentos de la programación: Tipos e instrucciones II

{

double oper1, oper2, prod;

cout << "Operando 1: ";

cin >> oper1;

cout << "Operando 2: ";

...

cout << "Producto: " << prod;

return 0;

}

Flujodeejecución

Flujodeejecución

Instrucción N

Instrucción 3

Instrucción 2

Instrucción 1

Luis Hernández Yáñez

UnoentredosomáscaminosdeejecuciónSelecciónsimple(2caminos) Selecciónmúltiple(>2caminos)

Página 274Fundamentos de la programación: Tipos e instrucciones II

Instrucción T Instrucción F

Condicióntruetrue falsefalse

truetrue

truetrue

truetrue

truetrue

falsefalse

falsefalse

falsefalse

falsefalse

Diagramas de flujoDiagramas de flujo

ififif‐else‐if

switch

if‐else‐if

switch

Luis Hernández Yáñez

Repetirlaejecucióndeunaomásinstrucciones

Acumular,procesarcolecciones,...

Página 275Fundamentos de la programación: Tipos e instrucciones II

Código

¿Iterar?SíSí NoNo

Inicialización

whilewhile forfor

Luis Hernández Yáñez

Página 276Fundamentos de la programación: Tipos e instrucciones II

Luis Hernández Yáñez

Lainstrucciónif

if (condición) {

códigoT

}

[else {

códigoF

}]

condición:expresiónboolCláusulaelse opcional

Página 277Fundamentos de la programación: Tipos e instrucciones II

BloqueT BloqueF

Condicióntruetrue falsefalse

OpcionalOpcional

Luis Hernández Yáñez

int num;

cin >> num;

if (num < 0) {

cout << "Negativo";

}

else {

cout << "Positivo";

}

cout << endl;

Página 278Fundamentos de la programación: Tipos e instrucciones II

cout << "Negativo";

truetrue

cout << "Positivo";

falsefalse

cout << endl;

num < 0

cin >> num;

signo.cppsigno.cpp

Luis Hernández Yáñez

int num;

cin >> num;

if (num < 0) {

cout << "Negativo";

}

else {

cout << "Positivo";

}

cout << endl;

Página 279Fundamentos de la programación: Tipos e instrucciones II

cout << endl;

cout << "Positivo";

falsefalsenum < 0

cin >> num;

__129129

PositivoPositivo

_

num ?num 129

Luis Hernández Yáñez

truetrue

cout << "Negativo";

int num;

cin >> num;

if (num < 0) {

cout << "Negativo";

}

else {

cout << "Positivo";

}

cout << endl;

Página 280Fundamentos de la programación: Tipos e instrucciones II

cout << endl;

num < 0

cin >> num;

‐5‐5

NegativoNegativo

_

num ?num ‐5

Luis Hernández Yáñez

Divisiónentredosnúmerosprotegidafrenteaintentodedivisiónpor0

#include <iostream>using namespace std;

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;

}

Página 281Fundamentos de la programación: Tipos e instrucciones II

división.cppdivisión.cppLuis Hernández Yáñez

Página 282Fundamentos de la programación: Tipos e instrucciones II

Luis Hernández Yáñez

Seaplicanavaloresbool (condiciones)

Elresultadoesdetipobool

Página 283Fundamentos de la programación: Tipos e instrucciones II

! NO Monario&& Y Binario|| O Binario

Operadores (prioridad)

...

!

* / %

+ ‐

< <= > >=

== !=

&&

||

Luis Hernández Yáñez

Página 284Fundamentos de la programación: Tipos e instrucciones II

!

true false

false true

&& true false

true true false

false false false

|| true false

true true true

false true false

NO(Not)NO(Not) Y(And)Y(And) O(Or)O(Or)

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

resultado = cond1 && cond2;  // false && true  false

resultado = cond1 || cond2;  // false || true  true

Luis Hernández Yáñez

Página 285Fundamentos de la programación: Tipos e instrucciones II

#include <iostream>using namespace std;

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!";}return 0;

}

condiciones.cppcondiciones.cpp

((num >= 1) && (num <= 10))((num > 0) && (num < 11))((num >= 1) && (num < 11))((num > 0) && (num <= 10))

¡Encierralascondicionessimplesentreparéntesis!¡Encierralascondicionessimplesentreparéntesis!

CondicionesequivalentesCondicionesequivalentes

Luis Hernández Yáñez

Página 286Fundamentos de la programación: Tipos e instrucciones II

Luis Hernández Yáñez

Página 287Fundamentos de la programación: Tipos e instrucciones II

diasmes.cppdiasmes.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;}

}

Luis Hernández Yáñez

CalendarioGregoriano:bisiestosidivisiblepor4,exceptoelúltimodecadasiglo(divisiblepor100),salvoqueseadivisiblepor400

Página 288Fundamentos de la programación: Tipos e instrucciones II

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 400esBisiesto = false;

}else {

esBisiesto = true; // Año bisiesto}

}else {

esBisiesto = false;}return esBisiesto;

}

Luis Hernández Yáñez

Cadaelse seasociaalif anteriormáscercanosinasociar(mismobloque)

if (condición1) { 

if (condición2) {...}

else {...}

}

else {

if (condición3) {

if (condición4) {...}

if (condición5) {...}

else {...}

}

else { ...

Página 289Fundamentos de la programación: Tipos e instrucciones II

Lasangríaayudaaasociarloselse consusif

Unamalasangríapuedeconfundirif (x > 0) {

if (y > 0) {...}

else {...}

if (x > 0) {

if (y > 0) {...}

else {...}

Unamalasangríapuedeconfundirif (x > 0) {

if (y > 0) {...}

else {...}

if (x > 0) {

if (y > 0) {...}

else {...}

Luis Hernández Yáñez

Página 290Fundamentos de la programación: Tipos e instrucciones II

Luis Hernández Yáñez

• Condiciónsimple: Expresiónlógica(true/false)Sinoperadoreslógicos

num < 0

car == 'a'

isalpha(car)

12

• Condicióncompuesta:Combinacióndecondicionessimplesyoperadoreslógicos!isalpha(car)

(num < 0) || (car == 'a')

(num < 0) && ((car == 'a') || !isalpha(car))

Página 291Fundamentos de la programación: Tipos e instrucciones II

Noconfundaseloperadordeigualdad(==)coneloperadordeasignación(=).

CompatibilidadconellenguajeC:0 esequivalenteafalseCualquiervalordistintode0 esequivalenteatrue

CompatibilidadconellenguajeC:0 esequivalenteafalseCualquiervalordistintode0 esequivalenteatrue

Luis Hernández Yáñez

ShortcutBooleanEvaluation

true || X true

(n == 0) || (x >= 1.0 / n)

Sin es0:¿divisiónporcero?(segundacondición)Comolaprimeraseríatrue:¡noseevalúalasegunda!

false && X false

(n != 0) && (x < 1.0 / n)

Sin es0:¿divisiónporcero?(segundacondición)Comolaprimeraseríafalse:¡noseevalúalasegunda!

Página 292Fundamentos de la programación: Tipos e instrucciones II

Luis Hernández Yáñez

Página 293Fundamentos de la programación: Tipos e instrucciones II

Luis Hernández Yáñez

Página 294Fundamentos de la programación: Tipos e instrucciones II

truetrue

truetrue

truetrue

truetrue

falsefalse

falsefalse

falsefalse

falsefalse

if‐else‐if

switch

if‐else‐if

switch

Luis Hernández Yáñez

Página 295Fundamentos de la programación: Tipos e instrucciones II

Luis Hernández Yáñez

Ejemplo:Calificación(enletras)deunestudianteenbaseasunotanumérica(0‐10)

Página 296Fundamentos de la programación: Tipos e instrucciones II

truetruecout << "MH"

truetruecout << "SB"

truetruecout << "NT"

truetruecout << "AP"

falsefalse

cout << "SS"

falsefalse

>= 5

falsefalse

>= 7

falsefalse

>= 9

== 10

Si nota == 10 entoncesMH

sino,si nota >= 9 entoncesSB

sino,si nota >= 7 entoncesNT

sino,si nota >= 5 entoncesAP

sino SS

Luis Hernández Yáñez

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";}

}}

}

Página 297Fundamentos de la programación: Tipos e instrucciones II

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";}

nota.cppnota.cppLuis Hernández Yáñez

¡Cuidadoconelordendelascondiciones!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"; }

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"; }

Página 298Fundamentos de la programación: Tipos e instrucciones II

SólomuestraAPoSSSólomuestraAPoSS

¡Noseejecutannunca!¡Noseejecutannunca!

Luis Hernández Yáñez

Simplificacióndelascondiciones

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"; }

Página 299Fundamentos de la programación: Tipos e instrucciones II

00 55 77 99 1010

MHMH

SBSBNTNTAPAPSSSS

Siempretrue:ramaselseSinoes10,esmenorque10Sinoes>=9,esmenorque9Sinoes>=7,esmenorque7…

true && X  X

Siempretrue:ramaselseSinoes10,esmenorque10Sinoes>=9,esmenorque9Sinoes>=7,esmenorque7…

true && X  X

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"; }

Luis Hernández Yáñez

Página 300Fundamentos de la programación: Tipos e instrucciones II

Si num == 4 entonces Muy altoSi num == 3 entonces AltoSi num == 2 entonces MedioSi num == 1 entonces Bajo

nivel.cppnivel.cpp

#include <iostream>using namespace std;int main() {

int num;cout << "Introduce el nivel: ";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;

}

Luis Hernández Yáñez

Página 301Fundamentos de la programación: Tipos e instrucciones II

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; }

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;

Luis Hernández Yáñez

Página 302Fundamentos de la programación: Tipos e instrucciones II

Luis Hernández Yáñez

Selecciónentrevaloresposiblesdeunaexpresión

Página 303Fundamentos de la programación: Tipos e instrucciones II

switch (expresión) {case constante1:

{código1

}[break;]

case constante2:{

código2}[break;]

...

case constanteN:{

códigoN}[break;]

[default:{

códigoDefault}]

}

switch (expresión) {case constante1:

{código1

}[break;]

case constante2:{

código2}[break;]

...

case constanteN:{

códigoN}[break;]

[default:{

códigoDefault}]

}

Luis Hernández Yáñez

Página 304Fundamentos de la programación: Tipos e instrucciones II

nivel2.cppnivel2.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";}

}

Sinum == 4MuyaltoSinum == 3 AltoSinum == 2MedioSinum == 1 Bajo

Luis Hernández Yáñez

Interrumpe elswitch;continúaenlainstrucciónquelesiga

Num: 3AltoNum: 3Alto

Página 305Fundamentos de la programación: Tipos e instrucciones II

switch (num) {...case 3:

{cout << "Alto";

}break;

case 2:{

cout << "Medio";}break;

...}

Luis Hernández Yáñez

Página 306Fundamentos 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";

}}

Num: 3AltoMedioBajoValor no válido

Num: 3AltoMedioBajoValor no válido

Luis Hernández Yáñez

Página 307Fundamentos de la programación: Tipos e instrucciones II

num==4 Muy altotruetrue

Altotruetrue

Mediotruetrue

Bajotruetrue

num==3

falsefalse

num==2

falsefalse

num==1

falsefalse

falsefalse

No válidodefaultdefault

break;

break;

break;

break;

Sinbreak;

Sinbreak;

Sinbreak;

Sinbreak;

Luis Hernández Yáñez

int menu() {int op = ‐1; // Cualquiera no válida

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;

if ((op < 0) || (op > 4)) {cout << "¡Opción no válida!" << endl;

}}

return op;}

Página 308Fundamentos de la programación: Tipos e instrucciones II

1 ‐ Nuevo cliente2 ‐ Editar cliente3 ‐ Baja cliente4 ‐ Ver cliente0 ‐ SalirOpción: 5¡Opción no válida!1 ‐ Nuevo cliente2 ‐ Editar cliente3 ‐ Baja cliente4 ‐ Ver cliente0 ‐ SalirOpción: 3

1 ‐ Nuevo cliente2 ‐ Editar cliente3 ‐ Baja cliente4 ‐ Ver cliente0 ‐ SalirOpción: 5¡Opción no válida!1 ‐ Nuevo cliente2 ‐ Editar cliente3 ‐ Baja cliente4 ‐ Ver cliente0 ‐ SalirOpción: 3

1 ‐ Nuevo cliente2 ‐ Editar cliente3 ‐ Baja cliente4 ‐ Ver cliente0 ‐ SalirOpción: 5¡Opción no válida!1 ‐ Nuevo cliente2 ‐ Editar cliente3 ‐ Baja cliente4 ‐ Ver cliente0 ‐ SalirOpción: 3

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

}

Página 309Fundamentos de la programación: Tipos e instrucciones II

Luis Hernández Yáñez

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

Página 310Fundamentos de la programación: Tipos e instrucciones II

Luis Hernández Yáñez

int nota; // Sin decimalescout << "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

case 7:case 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 311Fundamentos de la programación: Tipos e instrucciones II

nota2.cppnota2.cppLuis Hernández Yáñez

Página 312Fundamentos de la programación: Tipos e instrucciones II

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";

}}

Luis Hernández Yáñez

Página 313Fundamentos de la programación: Tipos e instrucciones II

Luis Hernández Yáñez

Página 314Fundamentos de la programación: Tipos e instrucciones II

Cuerpo

SíSí NoNo

Bucleswhile yfor

¿Iterar?¿Iterar?

Inicialización

Luis Hernández Yáñez

Númerodeiteracionescondicionado(recorridovariable):

— Buclewhile

while (condición) cuerpo

Ejecutaelcuerpomientraslacondición seatrue

— Bucledo‐while

Compruebalacondiciónalfinal(loveremosmásadelante)

Númerodeiteracionesprefijado(recorridofijo):

— Buclefor

for (inicialización; condición; paso) cuerpo

Ejecutaelcuerpomientraslacondición seatrue

Seusaunavariablecontadoraentera

Página 315Fundamentos de la programación: Tipos e instrucciones II

Luis Hernández Yáñez

Página 316Fundamentos de la programación: Tipos e instrucciones II

Luis Hernández Yáñez

Mientraslacondiciónseacierta,ejecutaelcuerpowhile (condición) {

cuerpo}

int i = 1; // Inicialización de la variable i

while (i <= 100) {

cout << i << endl;

i++;

}

Muestralosnúmerosdel1al100

Página 317Fundamentos de la programación: Tipos e instrucciones II

while.cppwhile.cpp

CondiciónalprincipiodelbucleCondiciónalprincipiodelbucle

Luis Hernández Yáñez

int i = 1;while (i <= 100) {

cout << i << endl; i++;

}

Página 318Fundamentos de la programación: Tipos e instrucciones II

Cuerpo

CondiciónCondicióntruetrue falsefalse

falsefalse

cout << i << endl;

truetrue

i++

i <= 100

i = 1

i ?123

_

_11

22

100100

33

4

9999

99100101

Luis Hernández Yáñez

¿Ysilacondiciónesfalsaalcomenzar?Noseejecutaelcuerpodelbucleningunavez

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

Página 319Fundamentos de la programación: Tipos e instrucciones II

Luis Hernández Yáñez

Primerenterocuyocuadradoesmayorque1.000#include <iostream>using namespace std;

int main() {int num = 1;

while (num * num <= 1000) {num++;

}

cout << "1er. entero con cuadrado mayor que 1.000: "<< num << endl;

return 0;}

Página 320Fundamentos de la programación: Tipos e instrucciones II

¡Ejecutaelprogramaparasabercuálesesenúmero!¡Ejecutaelprogramaparasabercuálesesenúmero!

primero.cppprimero.cpp

Recorrelasecuencia denúmeros1,2,3,4,5,...Recorrelasecuencia denúmeros1,2,3,4,5,...

Empezamos en 1

Incrementamos en 1

Luis Hernández Yáñez

Página 321Fundamentos de la programación: Tipos e instrucciones II

sumamedia.cppsumamedia.cpp

#include <iostream>using namespace std;int main() {

double num, suma = 0, media = 0;int cont = 0;cout << "Introduce un número (0 para terminar): ";cin >> num;while (num != 0) { // 0 para terminar

suma = suma + num;cont++;cout << "Introduce un número (0 para terminar): ";cin >> num;

}if (cont > 0) {

media = suma / cont;}cout << "Suma = " << suma << endl;cout << "Media = " << media << endl;return 0;

}

RecorrelasecuenciadenúmerosintroducidosRecorrelasecuencia

denúmerosintroducidos

Leemos el primero

Leemos el siguiente

Luis Hernández Yáñez

Página 322Fundamentos de la programación: Tipos e instrucciones II

Luis Hernández Yáñez

NúmerodeiteracionesprefijadoVariablecontadoraquedeterminaelnúmerodeiteraciones:

for ([int] var = ini; condición; paso) cuerpo

Lacondición comparaelvalordevar conunvalorfinal

Elpaso incrementaodecrementaelvalordevar

Elvalordevar debeiraproximándosealvalorfinal

for (int i = 1; i <= 100; i++)...

for (int i = 100; i >= 1; i‐‐)...

Tantoscicloscomovalorestomalavariablecontadora

Página 323Fundamentos de la programación: Tipos e instrucciones II

1, 2, 3, 4, 5, ..., 1001, 2, 3, 4, 5, ..., 100

100, 99, 98, 97, ..., 1100, 99, 98, 97, ..., 1

Luis Hernández Yáñez

for (inicialización; condición; paso) cuerpo

for (int i = 1; i <= 100; i++) {cout << i;

}

Página 324Fundamentos de la programación: Tipos e instrucciones II

falsefalse

cout << i;

truetrue

i++

i <= 100

i = 1

Luis Hernández Yáñez

for (int i = 1; i <= 100; i++) {cout << i << endl;

}

Página 325Fundamentos de la programación: Tipos e instrucciones II

_

11

i ?

falsefalsetruetrue

cout << i << endl;

i++

12

22

3

......

9999

100

100100

101

33

i <= 100i <= 100

i = 1

for1.cppfor1.cppLuis Hernández Yáñez

LavariablecontadoraElpaso notieneporquéirdeunoenuno:for (int i = 1; i <= 100; i = i + 2)

cout << i << endl;

Estebucleformuestralosnúmerosimparesde1a99

GarantíadeterminaciónTodobucledebeterminarsuejecuciónBuclesfor:lavariablecontadoradebeconvergeralvalorfinal

Página 326Fundamentos de la programación: Tipos e instrucciones II

MuyimportanteElcuerpodelbucleNUNCA debealterarelvalordelcontador

for2.cppfor2.cpp

Luis Hernández Yáñez

Página 327Fundamentos de la programación: Tipos e instrucciones II

suma.cppsuma.cpp

#include <iostream>using namespace std;

long long int suma(int n);

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;}return total;

}

Recorrelasecuencia denúmeros1,2,3,4,5,...,n

Recorrelasecuencia denúmeros1,2,3,4,5,...,n

Luis Hernández Yáñez

¿Incremento/decrementoprefijoopostfijo?Esindiferente

Estosdosbuclesproducenelmismoresultado:

for (int i = 1; i <= 100; i++) ...

for (int i = 1; i <= 100; ++i) ...

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

Página 328Fundamentos de la programación: Tipos e instrucciones II

Luis Hernández Yáñez

Declaradaenelpropiobuclefor (int i = 1; ...)

Sóloseconoceenelcuerpodelbucle(suámbito)

Nosepuedeusareninstruccionesquesiganalbucle

Declaradaantesdelbucleint i;

for (i = 1; ...)

Seconoceenelcuerpodelbucleydespuésdelmismo

Ámbitoexternoalbucle

Página 329Fundamentos de la programación: Tipos e instrucciones II

Luis Hernández Yáñez

Losbuclesfor sepuedenreescribircomobuclescondicionados

for (int i = 1; i <= 100; i++) cuerpo

Esequivalentea:

Lainversanoessiempreposible:int i;cin >> i;while (i != 0) {

cuerpocin >> i;

}

Página 330Fundamentos de la programación: Tipos e instrucciones II

int i = 1;while (i <= 100) {

cuerpoi++;

}

¿Buclefor equivalente?

¡Nosabemoscuántosnúmerosintroduciráelusuario!

¿Buclefor equivalente?

¡Nosabemoscuántosnúmerosintroduciráelusuario!

Luis Hernández Yáñez

Página 331Fundamentos 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

}

}

Paracadavalordeielvalordej varíaentre1 y5

j varíamásrápido quei

Página 332Fundamentos de la programación: Tipos e instrucciones II

i j1 11 21 31 41 52 12 22 32 42 53 1...

Luis Hernández Yáñez

Página 333Fundamentos de la programación: Tipos e instrucciones II

1 x  1 =   11 x  2 =   21 x  3 =   31 x  4 =   4...1 x 10 =  102 x  1 =   22 x  2 =   4...

10 x  7 =  7010 x  8 =  8010 x  9 =  9010 x 10 = 100

1 x  1 =   11 x  2 =   21 x  3 =   31 x  4 =   4...1 x 10 =  102 x  1 =   22 x  2 =   4...

10 x  7 =  7010 x  8 =  8010 x  9 =  9010 x 10 = 100

1 x  1 =   11 x  2 =   21 x  3 =   31 x  4 =   4...1 x 10 =  102 x  1 =   22 x  2 =   4...

10 x  7 =  7010 x  8 =  8010 x  9 =  9010 x 10 = 100

tablas.cpptablas.cpp

#include <iostream>

using namespace std;

#include <iomanip>

int main() {

for (int i = 1; i <= 10; i++) {

for (int j = 1; j <= 10; j++) {

cout << setw(2) << i << " x "

<< setw(2) << j << " = "

<< setw(3) << i * j << endl;

}

}

return 0;

}

Luis Hernández Yáñez

Página 334Fundamentos de la programación: Tipos e instrucciones II

tablas2.cpptablas2.cpp

#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;}

Luis Hernández Yáñez

Página 335Fundamentos de la programación: Tipos e instrucciones II

#include <iostream>using namespace std;#include <iomanip>

int menu(); // 1: Tablas de multiplicación; 2: Sumatoriolong 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; ...

menú.cppmenú.cppLuis Hernández Yáñez

Página 336Fundamentos de la programación: Tipos e instrucciones II

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;}

} // switchopcion = menu();

} // while (opcion != 0)return 0;

}

Luis Hernández Yáñez

Página 337Fundamentos de la programación: Tipos e instrucciones II

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

while (opcion != 0) {...

for (int i = 1; i <= 10; i++) {for (int j = 1; j <= 10; j++) {

...}

}

while (num <= 0) {...

}

for (int i = 1; i <= n; i++) {...

}while ((op < 0) || (op > 2)) {

...}

}

Página 338Fundamentos de la programación: Tipos e instrucciones II

menu()menu()

suma()suma()

Luis Hernández Yáñez

Página 339Fundamentos de la programación: Tipos e instrucciones II

Luis Hernández Yáñez

Cadabloquecreaunnuevoámbito:

int main() {

double d = ‐1, suma = 0;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;

}

Página 340Fundamentos de la programación: Tipos e instrucciones II

3ámbitosanidados3ámbitosanidados

Luis Hernández Yáñez

Unidentificadorseconoceenelámbitoenelqueestádeclarado

(apartirdesuinstruccióndedeclaración)yenlossubámbitosposteriores

Página 341Fundamentos de la programación: Tipos e instrucciones II

Luis Hernández Yáñez

ÁmbitodelavariabledÁmbitodelavariabledint main() {

double d;if (...) {

int cont = 0;for (int i = 0; i <= 10; i++) {

...}

}char c;if (...) {

double x;...

}return 0;

}

Página 342Fundamentos de la programación: Tipos e instrucciones II

Luis Hernández Yáñez

int main() {double d;if (...) {

int cont = 0;for (int i = 0; i <= 10; i++) {

...}

}char c;if (...) {

double x;...

}return 0;

}

ÁmbitodelavariablecontÁmbitodelavariablecont

Página 343Fundamentos de la programación: Tipos e instrucciones II

Luis Hernández Yáñez

int main() {double d;if (...) {

int cont = 0;for (int i = 0; i <= 10; i++) {

...}

}char c;if (...) {

double x;...

}return 0;

}

ÁmbitodelavariableiÁmbitodelavariablei

Página 344Fundamentos de la programación: Tipos e instrucciones II

Luis Hernández Yáñez

ÁmbitodelavariablecÁmbitodelavariablec

int main() {double d;if (...) {

int cont = 0;for (int i = 0; i <= 10; i++) {

...}

}char c;if (...) {

double x;...

}return 0;

}

Página 345Fundamentos de la programación: Tipos e instrucciones II

Luis Hernández Yáñez

ÁmbitodelavariablexÁmbitodelavariablex

int main() {double d;if (...) {

int cont = 0;for (int i = 0; i <= 10; i++) {

...}

}char c;if (...) {

double x;...

}return 0;

}

Página 346Fundamentos de la programación: Tipos e instrucciones II

Luis Hernández Yáñez

Sienunsubámbitosedeclaraunidentificadorconidénticonombrequeunoyadeclaradoenelámbito,eldelsubámbitooculta aldelámbito

(noesvisible)

Página 347Fundamentos de la programación: Tipos e instrucciones II

Luis Hernández Yáñez

int main() {int i, x;if (...) {

int i = 0;for(int i = 0; i <= 10; i++) {

...}

}char c;if (...) {

double x;...

}return 0;

}

Página 348Fundamentos de la programación: Tipos e instrucciones II

Oculta,ensuámbito,alai anteriorOculta,ensuámbito,alai anterior

Oculta,ensuámbito,alai anteriorOculta,ensuámbito,alai anterior

Oculta,ensuámbito,alax anteriorOculta,ensuámbito,alax anterior

Luis Hernández Yáñez

Página 349Fundamentos de la programación: Tipos e instrucciones II

Luis Hernández Yáñez

Sucesióndeelementosdeunmismotipoqueseaccedenlinealmente

Página 350Fundamentos de la programación: Tipos e instrucciones II

elemento secuenciasecuenciasecuencia

(Secuenciavacía)(Secuenciavacía)

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

elemento

oo

Luis Hernández Yáñez

Notratamossecuenciasinfinitas:siemprehayunúltimoelemento

Secuenciasexplícitas:

— Sucesióndedatosdeundispositivo(teclado,disco,sensor,...)

Secuenciascalculadas:

— Fórmuladerecurrenciaquedeterminaelelementosiguiente

Listas(másadelante)

Secuenciasexplícitasquemanejaremos:

Datosintroducidosporeltecladooleídosdeunarchivo

Conunelementoespecialalfinaldelasecuencia(centinela)

1 34 12 26 4 87 184 52 ‐1

Página 351Fundamentos de la programación: Tipos e instrucciones II

Luis Hernández Yáñez

Secuenciaexplícitaleídadearchivo:— Detectarlamarcadefinaldearchivo(Eof ‐ End offile)

— Detectarunvalorcentinelaalfinal

Secuenciaexplícitaleídadelteclado:

— Preguntaralusuariosiquiereintroducirunnuevodato

— Preguntaralusuarioprimerocuántosdatosvaaintroducir

— Detectarunvalorcentinelaalfinal

Valorcentinela:

Valorespecialalfinalquenopuededarseenlasecuencia(Secuenciadenúmerospositivos centinela:cualquiernegativo)

Página 352Fundamentos de la programación: Tipos e instrucciones II

12 4 37 23 8 19 83 63 2 35 17 76 15 ‐1

Luis Hernández Yáñez

Página 353Fundamentos de la programación: Tipos e instrucciones II

12 4 37 23 8 19 83 63 ‐1 35 17 76 15

ÚltimoelementoÚltimoelemento

NoseprocesanNoseprocesan

Debehaberalgúnvalorquenoseaunelementoválido

Secuenciasnuméricas:

Sisepermitecualquiernúmero,nohaycentinelaposible

Cadenasdecaracteres:

¿Caracteresespeciales(noimprimibles)?

Enrealidadelvalorcentinelaespartedelasecuencia,perosusignificadoesespecialynoseprocesacomoelresto

Significaquesehaalcanzadoelfinaldelasecuencia(Inclusoaunquehayaelementosposteriores)

Luis Hernández Yáñez

Tratamientodeloselementosunoaunodesdeelprimero

RecorridoUnmismotratamientoparatodosloselementosdelasecuencia

Ej.‐ Mostrarloselementosdeunasecuencia,sumarlosnúmerosdeunasecuencia,¿paroimparcadanúmerodeunasecuencia?,...

Terminaalllegaralfinaldelasecuencia

BúsquedaRecorridodelasecuenciahastaencontrarunelementobuscado

Ej.‐ Localizarelprimernúmeroqueseamayorque1.000

Terminaallocalizarelprimerelementoquecumplelacondiciónoalllegaralfinaldelasecuencia(noencontrado)

Página 354Fundamentos de la programación: Tipos e instrucciones II

Luis Hernández Yáñez

Página 355Fundamentos de la programación: Tipos e instrucciones II

Luis Hernández Yáñez

Unmismotratamientoatodosloselementos

InicializaciónMientrasnoselleguealfinaldelasecuencia:ObtenerelsiguienteelementoProcesarelelemento

Finalización

Alempezarseobtieneelprimerelementodelasecuencia

Enlossiguientespasosdelbuclesevanobteniendolossiguienteselementosdelasecuencia

Página 356Fundamentos de la programación: Tipos e instrucciones II

Luis Hernández Yáñez

Página 357Fundamentos de la programación: Tipos e instrucciones II

falsefalse

Procesarelemento

Obtenerelemento

truetrue

Finalización

¿Alfinal?

Inicialización

Nosabemoscuántoselementoshay Nopodemos

implementarconfor

Luis Hernández Yáñez

ImplementaciónconwhileInicialización

Obtenerelprimerelemento

Mientrasnoseaelcentinela:

Procesarelelemento

Obtenerelsiguienteelemento

Finalización

Página 358Fundamentos de la programación: Tipos e instrucciones II

falsefalse

Procesarelemento

Obtenersiguiente

truetrue

Finalización

¿Centinela?

Inicialización

Obtener1º

Luis Hernández Yáñez

SecuenciadenúmerospositivosSiempreserealizaalmenosunalecturaCentinela:‐1

double d, suma = 0;

cout << "Valor (‐1 termina): ";

cin >> d;

while (d != ‐1) {

suma = suma + d;

cout << "Valor (‐1 termina): ";

cin >> d;

}

cout << "Suma = " << suma << endl;

Página 359Fundamentos de la programación: Tipos e instrucciones II

InicializaciónInicialización

PrimerelementoPrimerelemento

MientrasnoelcentinelaMientrasnoelcentinela

ProcesarelementoProcesarelemento

SiguienteelementoSiguienteelemento

FinalizaciónFinalización

Luis Hernández Yáñez

LongituddeunasecuenciadecaracteresCentinela:carácterpunto(.)

Página 360Fundamentos de la programación: Tipos e instrucciones II

longitud.cpplongitud.cpp

int longitud() {int l = 0;char c;cout << "Texto terminado en punto: ";cin >> c;          // Obtener primer carácterwhile (c != '.') { // Mientras no el centinela

l++;            // Procesarcin >> c;       // Obtener siguiente carácter

}return l;

}

Luis Hernández Yáñez

¿Cuántasvecesapareceuncarácterenunacadena?Centinela:asterisco(*)

Página 361Fundamentos de la programación: Tipos e instrucciones II

cont.cppcont.cpp

char buscado, c;int cont = 0;cout << "Carácter a buscar: ";cin >> buscado;cout << "Cadena: ";cin >> c;while (c != '*') {

if (c == buscado) {cont++;

}cin >> c;

}cout << buscado << " aparece " << cont

<< " veces.";

MientrasnoelcentinelaMientrasnoelcentinela

ProcesarelementoProcesarelemento

SiguienteelementoSiguienteelemento

PrimerelementoPrimerelemento

Luis Hernández Yáñez

SumadelosnúmerosdelasecuenciaCentinela:0

Página 362Fundamentos de la programación: Tipos e instrucciones II

suma2.cppsuma2.cpp

int sumaSecuencia() {double d, suma = 0;ifstream archivo; // Archivo de entrada (lectura)archivo.open("datos.txt");if (archivo.is_open()) {

archivo >> d; // Obtener el primerowhile (d != 0) { // Mientras no sea el centinela

suma = suma + d; // Procesar el datoarchivo >> d; // Obtener el siguiente

}archivo.close();

}return suma;

}

Luis Hernández Yáñez

Página 363Fundamentos de la programación: Tipos e instrucciones II

Luis Hernández Yáñez

Recurrencia: ei+1 =ei +1 e1 =11  2  3  4  5  6  7  8  ...

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;

}

Página 364Fundamentos de la programación: Tipos e instrucciones II

sumatorio.cppsumatorio.cpp

Últimoelementodelasecuencia:nÚltimoelementodelasecuencia:n

Luis Hernández Yáñez

long long int suma(int n) {int sumatorio = 0;for (int i = 1; i <= n; i++) {

sumatorio = sumatorio + i;}...

Página 365Fundamentos de la programación: Tipos e instrucciones II

n ?

sumatorio 0

i 1

i <= n01

2

5

3

3

6

4

10

5

15

6 12  13  2  14  3  2  15  4  3  2  1

SecuenciaSecuencia

falsefalse

truetrue

i = i + 1;

sumatorio += i;

int i = 1;

sumatorio = 0;

Luis Hernández Yáñez

DefiniciónFi =Fi‐1 +Fi‐2F1 =0

F2 =10 1 1 2 3 5 8 13 21 34 55 89 ... 

¿Findelasecuencia?PrimernúmerodeFibonaccimayorqueunnúmerodado

EsenúmerodeFibonacciactúacomocentinelaSinum es50,lasecuenciaserá:

0 1 1 2 3 5 8 13 21 34 

Página 366Fundamentos de la programación: Tipos e instrucciones II

Luis Hernández Yáñez

Recorridodelasecuenciacalculada

Página 367Fundamentos de la programación: Tipos e instrucciones II

fibonacci.cppfibonacci.cpp

¿Demasiadoscomentarios?Paranooscurecerelcódigo,mejorunaexplicaciónalprincipio

int num, fib, fibMenos2 = 0, fibMenos1 = 1; // 1º y 2ºfib = fibMenos2 + fibMenos1; // Calculamos el tercerocout << "Hasta: ";cin >> num;if (num >= 1) { // Ha de ser entero positivo

cout << "0 1 "; // Los dos primeros son <= numwhile (fib <= num) { // Mientras no mayor que num

cout << fib << " ";fibMenos2 = fibMenos1; // Actualizamos anterioresfibMenos1 = fib; // para obtener...fib = fibMenos2 + fibMenos1; // ... el siguiente

}}

Luis Hernández Yáñez

Elbuclecalculaadecuadamentelasecuencia:

while (fib <= num) {

cout << fib << " ";

fibMenos2 = fibMenos1;

fibMenos1 = fib;

fib = fibMenos2 + fibMenos1;

}

Página 368Fundamentos de la programación: Tipos e instrucciones II

num ?100

fib ?1

fibMenos1 ?1

fibMenos2 ?0

0 1 1

1

1

22

2

33

2

3

55 ...

Luis Hernández Yáñez

Página 369Fundamentos de la programación: Tipos e instrucciones II

Luis Hernández Yáñez

LocalizacióndelprimerelementoconunapropiedadInicialización

Mientrasnoseencuentreelelementoy noseestéalfinaldelasecuencia:

Obtenerelsiguienteelemento

Comprobarsielelementosatisfacelacondición

Finalización(tratarelelementoencontradooindicarquenosehaencontrado)

Página 370Fundamentos de la programación: Tipos e instrucciones II

Elementoquesebusca:satisfaráunacondición

Doscondicionesdeterminacióndelbucle:seencuentra/alfinal

Variablelógicaqueindiquesisehaencontrado

Luis Hernández Yáñez

Localizacióndelprimerelementoconunapropiedad

falsefalse

¿Encontrado?

Obtenerelemento

truetrue

Finalización

Página 371Fundamentos de la programación: Tipos e instrucciones II

Inicialización/encontrado = false;

¿Alfinaloencontrado?¿Alfinalo

encontrado?

Luis Hernández Yáñez

ImplementaciónconwhileInicialización

Obtenerelprimerelemento

Mientrasniencontradonielcentinela:

Obtenerelsiguienteelemento

Finalización(¿encontrado?)

Página 372Fundamentos de la programación: Tipos e instrucciones II

falsefalse

Obtenersiguiente

truetrue

Finalización

¿Encontradoocentinela?¿Encontradoocentinela?

Obtener1º

Inicialización

Luis Hernández Yáñez

PrimernúmeromayorqueunodadoCentinela:‐1double d, num;bool encontrado = false;cout << "Encontrar primero mayor que: ";cin >> num;cout << "Siguiente (‐1 para terminar): ";cin >> d; // Obtener el primer elementowhile ((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

}}

Página 373Fundamentos de la programación: Tipos e instrucciones II

busca.cppbusca.cpp

Luis Hernández Yáñez

Página 374Fundamentos de la programación: Tipos e instrucciones II

Luis Hernández Yáñez

ColeccioneshomogéneasUnmismotipodedatoparavarioselementos: Notas de los estudiantes de una clase Ventas de cada día de la semana Temperaturas de cada día del mes

...

EnlugardedeclararN variables...

Página 375Fundamentos de la programación: Tipos e instrucciones II

125.40

vLunvLun

76.95

vMarvMar

328.80

vMievMie

254.62

vJuevJue

435.00

vVievVie

164.29

vSabvSab

0.00

vDomvDom

ventas 125.40 76.95 328.80 254.62 435.00 164.29 0.00

0 1 2 3 4 5 6

...declaramosunatabladeN valores:

ÍndicesÍndices

Luis Hernández Yáñez

EstructurasecuencialCadaelementoseencuentraenunaposición(índice):

Losíndicessonenterospositivos

Elíndicedelprimerelementosiemprees0

Losíndicesseincrementandeunoenuno

Accesodirecto

Acadaelementoseaccedeatravésdesuíndice:ventas[4] accedeal5ºelemento(contieneelvalor435.00)cout << ventas[4];

ventas[4] = 442.75;

Página 376Fundamentos de la programación: Tipos e instrucciones II

ventas 125.40 76.95 328.80 254.62 435.00 164.29 0.00

0 1 2 3 4 5 6

Datosdeunmismotipobase:SeusancomocualquiervariableDatosdeunmismotipobase:Seusancomocualquiervariable

Luis Hernández Yáñez

Declaracióndetiposdearraystypedef tipo_base nombre_tipo[tamaño];

Ejemplos:typedef double tTemp[7];

typedef short int tDiasMes[12];

typedef char tVocales[5];

typedef double tVentas[31];

typedef tMoneda tCalderilla[15]; // Enumerado tMoneda

Página 377Fundamentos de la programación: Tipos e instrucciones II

Recuerda: Adoptamoselconveniodecomenzarlosnombresdetipoconunatminúscula,seguidadeunaovariaspalabras,cadaunaconsuinicialenmayúscula

Recuerda: Adoptamoselconveniodecomenzarlosnombresdetipoconunatminúscula,seguidadeunaovariaspalabras,cadaunaconsuinicialenmayúscula

Luis Hernández Yáñez

Declaracióndevariablesarraystipo nombre;

Ejemplos:

Página 378Fundamentos de la programación: Tipos e instrucciones II

NOseinicializanloselementosautomáticamenteNOseinicializanloselementosautomáticamente

tempMax ? ? ? ? ? ? ?0 1 2 3 4 5 6

typedef double tTemp[7];typedef short int tDiasMes[12];typedef char tVocales[5];typedef double tVentas[31];

ventasFeb ? ? ? ? ? ? ? ? ? ? ? ? ? ... ?0 1 2 3 4 5 6 7 8 9 10 11 12 30

vocales ? ? ? ? ?0 1 2 3 4

diasMes ? ? ? ? ? ? ? ? ? ? ? ?0 1 2 3 4 5 6 7 8 9 10 11

tTemp tempMax;

tDiasMes diasMes;

tVocales vocales;

tVentas ventasFeb;

Luis Hernández Yáñez

Página 379Fundamentos de la programación: Tipos e instrucciones II

Luis Hernández Yáñez

nombre[índice]

Cadaelementoseaccedeatravésdesuíndice(posiciónenelarray)tVocales vocales;

5elementos,índicesde0a4:vocales[0]   vocales[1]   vocales[2]   vocales[3]   vocales[4]

Procesamientodecadaelemento:

Comocualquierotravariabledeltipobasecout << vocales[4];

vocales[3] = 'o';

if (vocales[i] == 'e') ...

Página 380Fundamentos de la programación: Tipos e instrucciones II

vocales 'a' 'e' 'i' 'o' 'u'

0 1 2 3 4

typedef char tVocales[5];

Luis Hernández Yáñez

¡IMPORTANTE!

¡Nosecompruebasielíndiceescorrecto!

¡Esresponsabilidaddelprogramador!

const int Dim = 100;typedef double tVentas[Dim];tVentas ventas;

Índicesválidos:enterosentre0yDim‐1ventas[0]  ventas[1]  ventas[2] ... ventas[98]  ventas[99]

¿Quéesventas[100]?¿Oventas[‐1]?¿Oventas[132]?

¡Memoriadealgunaotravariabledelprograma!

Página 381Fundamentos de la programación: Tipos e instrucciones II

DefinelostamañosdelosarraysconconstantesDefinelostamañosdelosarraysconconstantes

Luis Hernández Yáñez

Página 382Fundamentos de la programación: Tipos e instrucciones II

Luis Hernández Yáñez

Arrays:tamañofijo Buclederecorridofijo(for)

Ejemplo:Mediadeunarraydetemperaturasconst 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;

Página 383Fundamentos de la programación: Tipos e instrucciones II

Luis Hernández Yáñez

tTemp temp;double media, total = 0; ...for (int i = 0; i < Dias; i++) {

total = total + temp[i];}

Memoria

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 0.00

i 0

12.40

1

23.36

2

31.79

3

43.44

4

84.62

7

Página 384Fundamentos 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

falsefalsetruetrue

total+=temp[i]

i++

i<Dias

i = 0

......

Luis Hernández Yáñez

Losusuariosusande1a7paranumerarlosdíasLainterfazdebeaproximarsealosusuarios,

aunqueinternamenteseusenlosíndicesde0a6

#include <iostream>using namespace std;

const int Dias = 7;typedef double tTemp[Dias];

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;

}...

Página 385Fundamentos de la programación: Tipos e instrucciones II

mediatemp.cppmediatemp.cppLuis Hernández Yáñez

double media(const tTemp temp) {double med, total = 0; 

for (int i = 0; i < Dias; i++) { // Recorrido del arraytotal = total + temp[i];

}med = total / Dias;

return med;}

Página 386Fundamentos de la programación: Tipos e instrucciones II

Losarrayssepasanalasfuncionescomoconstantes

Lasfuncionesnopuedendevolverarrays

Losarrayssepasanalasfuncionescomoconstantes

Lasfuncionesnopuedendevolverarrays

Luis Hernández Yáñez

const int Cuantas = 15;

typedef enum { centimo, dos_centimos, cinco_centimos,diez_centimos, veinte_centimos, medio_euro, euro } tMoneda;

typedef tMoneda tCalderilla[Cuantas];

string aCadena(tMoneda moneda);// Devuelve la cadena correspondiente al valor de moneda

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;

Página 387Fundamentos de la programación: Tipos e instrucciones II

Luis Hernández Yáñez

Página 388Fundamentos de la programación: Tipos e instrucciones II

Luis Hernández Yáñez

¿Quédíalasventassuperaronlos1.000€?const int Dias = 365; // Año no bisiestotypedef double tVentas[Dias];

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;

}

Página 389Fundamentos de la programación: Tipos e instrucciones II

buscaarray.cppbuscaarray.cppLuis Hernández Yáñez

Página 390Fundamentos de la programación: Tipos e instrucciones II

Luis Hernández Yáñez

Lacapacidaddeunarraynopuedeseralteradaenlaejecución

Eltamañodeunarrayesunadecisióndediseño:

Enocasionesseráfácil(díasdelasemana)

CuandopuedavariarhadeestimarseuntamañoNicortoniconmuchodesperdicio(posicionessinusar)

STL (StandardTemplateLibrary)deC++:Coleccionesmáseficientescuyotamañopuedevariar

Página 391Fundamentos de la programación: Tipos e instrucciones II

Luis Hernández Yáñez

Nosepuedencopiardosarrays(delmismotipo)conasignación:array2 = array1; // ¡¡¡ NO COPIA LOS ELEMENTOS !!!

Handecopiarseloselementosunoauno:for (int i = 0; i < N; i++) {

array2[i] = array1[i];}

Página 392Fundamentos de la programación: Tipos e instrucciones II

Luis Hernández Yáñez

Página 393Fundamentos de la programación: Tipos e instrucciones II

Luis Hernández Yáñez

Puedequenonecesitemostodaslasposicionesdeunarray...

Ladimensióndelarrayseráelmáximodeelementos

Peropodremostenermenoselementosdelmáximo

Necesitamosuncontadordeelementos...const int Max = 100;typedef double tArray[Max];tArray lista;int contador = 0;

contador:indicacuántasposicionesdelarrayseutilizan

Sóloaccederemosalasposicionesentre0ycontador‐1

Lasdemásposicionesnocontieneninformacióndelprograma

Página 394Fundamentos de la programación: Tipos e instrucciones II

Luis Hernández Yáñez

#include <iostream>using namespace std;#include <fstream>

const int Max = 100;typedef double tArray[Max];

double media(const tArray lista, int cont);

int main() {tArray lista;int contador = 0;double valor, med;ifstream archivo;archivo.open("lista.txt");if (archivo.is_open()) {

archivo >> valor;while ((valor != ‐1) && (contador < Max)) {

lista[contador] = valor;contador++;archivo >> valor;

} ...

Página 395Fundamentos de la programación: Tipos e instrucciones II

lista.cpplista.cppLuis Hernández Yáñez

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;}

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;return med;

}

Página 396Fundamentos de la programación: Tipos e instrucciones II

Sólorecorremoshastacont‐1Sólorecorremoshastacont‐1

Luis Hernández Yáñez

LicenciaCC(Creative Commons)Estetipodelicenciasofrecenalgunosderechosaterceraspersonasbajociertascondiciones.

Estedocumentotieneestablecidaslassiguientes:

Pulsaenlaimagendearribaaladerechaparasabermás.

Fundamentos de la programación: Tipos e instrucciones II Página 397

Reconocimiento(Attribution):Encualquierexplotacióndelaobraautorizadaporlalicenciaharáfaltareconocerlaautoría.

Nocomercial(Noncommercial):Laexplotacióndelaobraquedalimitadaausosnocomerciales.

Compartirigual(Sharealike):Laexplotaciónautorizadaincluyelacreacióndeobrasderivadassiemprequemantenganlamismalicenciaalserdivulgadas.