fundamentos de la programación 3 - fdi.ucm.es · facultad de informática universidad complutense...
TRANSCRIPT
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.