Вы находитесь на странице: 1из 87

Fundamentosdelaprogramacin

3
Grado en Ingeniera Informtica Grado en Ingeniera del Software Grado en Ingeniera de Computadores Luis Hernndez Yez

Facultad de Informtica Universidad Complutense

LuisHernndezYez

Tipos,valoresyvariables Conversindetipos Tiposdeclaradosporelusuario Tiposenumerados Entrada/Salida conarchivosdetexto Lecturadearchivosdetexto Escrituraenarchivosdetexto Flujodeejecucin Seleccinsimple Operadoreslgicos Anidamientodeif Condiciones Seleccinmltiple Laescalaifelseif Lainstruccinswitch Repeticin Elbuclewhile

227 232 236 238 248 253 266 272 276 282 286 290 293 295 302 313 316

Elbuclefor Buclesanidados mbitoyvisibilidad Secuencias Recorridodesecuencias Secuenciascalculadas Bsquedaensecuencias Arraysdedatossimples Usodevariablesarrays Recorridodearrays Bsquedaenarrays Arraysnocompletos

321 331 339 349 355 363 370 374 379 382 387 393

Fundamentosdelaprogramacin:TiposeinstruccionesII

LuisHernndezYez

Fundamentosdelaprogramacin:TiposeinstruccionesII

Pgina 227

Tipo Conjunto de valores con sus posibles operaciones Valor Conjunto de bits interpretados como de un tipo concreto Variable (o constante) Cierta memoria con nombre para valores de un tipo Declaracin Instruccin que identifica un nombre Definicin Declaracin que asigna memoria a una variable o constante

LuisHernndezYez

Fundamentosdelaprogramacin:TiposeinstruccionesII

Pgina 228

Memoria suficiente para su tipo de valores shortinti=3; int j=9; char c='a'; double x=1.5;
i j c a x 1.5 3 9

LuisHernndezYez

El significado de los bits depende del tipo de la variable: 00000000000000000000000001111000 Interpretado como int es el entero 120 Interpretado como char (slo 01111000) es el carcter 'x'

Fundamentosdelaprogramacin:TiposeinstruccionesII

Pgina 229

Simples

Estndar: int, float, double, char, bool Conjunto de valores predeterminado Definidos por el usuario: enumerados Conjunto de valores definido por el programador

Estructurados (Tema 5)

Colecciones homogneas: arrays Todos los elementos de la coleccin de un mismo tipo Colecciones heterogneas: estructuras Elementos de la coleccin de tipos distintos

LuisHernndezYez

Fundamentosdeprogramacin:TiposeinstruccionesII

Pgina 230

Con sus posibles modificadores: [unsigned][short] int longlong int float [long] double char bool Definicin de variables: tipo nombre [=expresin][,...]; Definicin de constantes con nombre: consttipo nombre =expresin;
Fundamentosdelaprogramacin:TiposeinstruccionesII Pgina 231

longint int

LuisHernndezYez

LuisHernndezYez

Fundamentosdelaprogramacin:TiposeinstruccionesII

Pgina 232

Promocin de tipos
Dos operandos de tipos distintos: El valor del tipo menor se promociona al tipo mayor shortinti=3; int j=2; double a=1.5,b; b=a+i*j; b=a+3 *2;
LuisHernndezYez

long double

Promocin

double float long int int short int

Valor 3 shortint (2 bytes) int (4 bytes)

b=1.5 +6;
Valor 6 int (4 bytes) double (8 bytes)
Fundamentosdelaprogramacin:TiposeinstruccionesII Pgina 233

Conversin segura: De un tipo menor a un tipo mayor shortint int longint ...

long double double float long int

Conversin no segura: int De un tipo mayor a un tipo menor short int intentero=1234; char caracter; caracter =entero;//Conversinnosegura Menor memoria: Prdida de informacin en la conversin
LuisHernndezYez

Fundamentosdelaprogramacin:TiposeinstruccionesII

Pgina 234

Fuerzan una conversin de tipo: tipo(expresin) El valor resultante de la expresin se trata como un valor del tipo
int a=3,b=2; cout<<a/b;//Muestra1(divisinentera) cout<<double(a)/b;//Muestra1.5(divisinreal)

Tienen la mayor prioridad

LuisHernndezYez

Fundamentosdelaprogramacin:TiposeinstruccionesII

Pgina 235

LuisHernndezYez

Fundamentosdelaprogramacin:TiposeinstruccionesII

Pgina 236

Describimos los valores de las variables del tipo typedefdescripcinnombre_de_tipo; Identificador vlido
Nombres de tipos propios: t minscula seguida de una o varias palabras capitalizadas Los colorearemos en naranja, para remarcar que son tipos typedefdescripcintMiTipo; typedefdescripcintMoneda; typedefdescripcintTiposDeCalificacion;

LuisHernndezYez

Declaracin de tipo frente a definicin de variable


Fundamentosdelaprogramacin:TiposeinstruccionesII Pgina 237

LuisHernndezYez

Fundamentosdelaprogramacin:TiposeinstruccionesII

Pgina 238

Enumeracin del conjunto de valores posibles para las variables: enum {smbolo1,smbolo2,...,smboloN }
enum { Identificador , }

enum {centimo,dos_centimos,cinco_centimos, diez_centimos,veinte_centimos, medio_euro,euro } Valores literales que pueden tomar las variables (en amarillo)
LuisHernndezYez

Fundamentosdelaprogramacin:TiposeinstruccionesII

Pgina 239

Mejoran la legibilidad
typedefdescripcinnombre_de_tipo; Elegimos un nombre para el tipo: tMoneda

descripcin typedefenum {centimo,dos_centimos,cinco_centimos, diez_centimos,veinte_centimos, medio_euro,euro }tMoneda;

LuisHernndezYez

En el mbito de la declaracin, se reconoce un nuevo tipo tMoneda tMoneda moneda1,moneda2; Cada variable de ese tipo contendr alguno de los smbolos moneda1=dos_centimos; moneda2=euro;
moneda1 (Internamente se usan enteros)
Fundamentosdelaprogramacin:TiposeinstruccionesII

dos_centimos euro
Pgina 240

moneda2

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

Lectura de la variable mes: cin>>mes; Se espera un valor entero No se puede escribir directamente enero o junio Y si se escribe la variable en la pantalla: cout<<mes;
LuisHernndezYez

Se ver un nmero entero Cdigo de entrada/salida especfico


Fundamentosdelaprogramacin:TiposeinstruccionesII Pgina 241

typedefenum {enero,febrero,marzo,abril,mayo,junio,julio, agosto,septiembre,octubre,noviembre,diciembre} tMes; int op; cout<<"1 Enero" <<endl; cout<<"2 Febrero" <<endl; cout<<"3 Marzo" <<endl; cout<<"4 Abril" <<endl; cout<<"5 Mayo" <<endl; cout<<"6 Junio" <<endl; cout<<"7 Julio" <<endl; cout<<"8 Agosto" <<endl; cout<<"9 Septiembre" <<endl; cout<<"10 Octubre" <<endl; cout<<"11 Noviembre" <<endl; cout<<"12 Diciembre" <<endl; cout<<"Numerodemes:"; cin>>op; tMes mes=tMes(op 1);
Fundamentosdelaprogramacin:TiposeinstruccionesII Pgina 242

LuisHernndezYez

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

LuisHernndezYez

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

Tambin podemos utilizar una instruccin switch


Fundamentosdelaprogramacin:TiposeinstruccionesII Pgina 243

Conjunto de valores ordenado (posicin en la enumeracin)


typedefenum{lunes,martes,miercoles,jueves, viernes,sabado,domingo}tDiaSemana; tDiaSemana dia; ... if(dia ==jueves)... bool noLaborable =(dia >=sabado);
lunes <martes <miercoles <jueves <viernes <sabado <domingo

No admiten operadores de incremento y decremento Emulacin con moldes:


LuisHernndezYez

int i=int(dia);//dia nohadevalerdomingo! i++; dia =tDiaSemana(i);


Fundamentosdelaprogramacin:TiposeinstruccionesII Pgina 244

#include<iostream> usingnamespacestd;

Si los tipos se usan en varias funciones, los declaramos antes de los prototipos

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; ...
Fundamentosdelaprogramacin:TiposeinstruccionesII Pgina 245

LuisHernndezYez

//Mostramoslafecha cout<<"Hoyes:" <<cadDia(hoy)<<"" <<dia <<"de" <<cadMes(mes)<<"de"<<anio <<endl; cout<<"Pasadalamedianoche..."<<endl; dia++; inti=int(hoy); i++; hoy=tDiaSemana(i); //Mostramoslafecha cout<<"Hoyes:" <<cadDia(hoy)<<"" <<dia <<"de" <<cadMes(mes)<<"de"<<anio <<endl; return 0; }
Fundamentosdelaprogramacin:TiposeinstruccionesII Pgina 246

LuisHernndezYez

fechas.cpp string cadMes(tMes mes){ string cad; if (mes==enero){ cad ="enero"; } if (mes==febrero){ cad ="febrero"; } ... if (mes==diciembre){ cad ="diciembre"; }
LuisHernndezYez

string cadDia(tDiaSemana dia); string cad; if (dia ==lunes){ cad ="lunes"; } if (dia ==martes){ cad ="martes"; } ... if (dia ==domingo){ cad ="domingo"; } return cad; }

return cad; }

Fundamentosdelaprogramacin:TiposeinstruccionesII

Pgina 247

LuisHernndezYez

Fundamentosdelaprogramacin:TiposeinstruccionesII

Pgina 248

Datos del programa: en la memoria principal (voltil) Medios (dispositivos) de almacenamiento permanente: Discos magnticos fijos (internos) o porttiles (externos) Cintas magnticas Discos pticos (CD, DVD, BlueRay) Memorias USB Mantienen la informacin en archivos Secuencias de datos
LuisHernndezYez

Fundamentosdelaprogramacin:TiposeinstruccionesII

Pgina 249

Archivo de texto: secuencia de caracteres


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

Archivo binario: contiene una secuencia de cdigos binarios


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

(Cdigos representados en notacin hexadecimal)

Los archivos se manejan en los programas por medio de flujos Archivos de texto: flujos de texto Similar a la E/S por consola
LuisHernndezYez

(Ms adelante veremos el uso de archivos binarios)

Fundamentosdelaprogramacin:TiposeinstruccionesII

Pgina 250

Textos dispuestos en sucesivas lneas Carcter de fin de lnea entre lnea y lnea (Intro) Posiblemente varios datos en cada lnea Ejemplo: Compras de los clientes En cada lnea, NIF del cliente, unidades compradas, precio unitario y descripcin de producto, separados por espacio 12345678F2123.95ReproductordeDVD 00112233A1218.4Discoporttil 32143567J332MemoriaUSB16Gb 76329845H1134.5ModemADSL ... Normalmente terminan con un dato especial (centinela) Por ejemplo, un NIF que sea X
Fundamentosdelaprogramacin:TiposeinstruccionesII Pgina 251

LuisHernndezYez

#include<fstream>

Lectura del archivo: flujo de entrada Escritura en el archivo: flujo de salida No podemos leer y escribir en un mismo flujo Un flujo de texto se puede utilizar para lectura o para escritura:

Flujos (archivos) de entrada: variables de tipo ifstream Flujos (archivos) de salida : variables de tipo ofstream

Biblioteca fstream (sin espacio de nombres)


LuisHernndezYez

Fundamentosdelaprogramacin:TiposeinstruccionesII

Pgina 252

LuisHernndezYez

Fundamentosdelaprogramacin:TiposeinstruccionesII

Pgina 253

Flujos de texto de entrada


Para leer de un archivo de texto: 1 Declara una variable de tipo ifstream

ifstream

2 Asocia la variable con el archivo de texto (apertura del archivo) 3 Realiza las operaciones de lectura 4 Desliga la variable del archivo de texto (cierre el archivo)

LuisHernndezYez

Fundamentosdelaprogramacin:TiposeinstruccionesII

Pgina 254

Apertura del archivo


Conecta la variable con el archivo de texto del dispositivo
flujo.open(cadena_literal); ifstream archivo; archivo.open("abc.txt"); if(archivo.is_open())...

El archivo debe existir!


is_open(): true si el archivo se ha podido abrir false en caso contrario

Cierre del archivo


flujo.close();
LuisHernndezYez

Desconecta la variable del archivo de texto del dispositivo


archivo.close();

Fundamentosdelaprogramacin:TiposeinstruccionesII

Pgina 255

Operaciones de lectura
Extractor (>>) archivo>>variable; Salta primero los espacios en blanco (espacio, tab, Intro, ...) Datos numricos: lee hasta el primer carcter no vlido Cadenas (string): lee hasta el siguiente espacio en blanco archivo.get(c) Lee el siguiente carcter en la variable c, sea el que sea getline(archivo,cadena) Lee en la cadena todos los caracteres que queden en la lnea Incluidos los espacios en blanco Hasta el siguiente salto de lnea (descartndolo) Con los archivos no tiene efecto la funcin sync()
Fundamentosdelaprogramacin:TiposeinstruccionesII Pgina 256

LuisHernndezYez

Qu debo leer?
Un nmero Usa el extractor Un carcter (sea el que sea) Usa la funcin get() Una cadena sin espacios Usa el extractor archivo>>num; archivo.get(c); archivo>>cad;

LuisHernndezYez

Una cadena posiblemente con espacios Usa la funcin getline() getline(archivo,cad);

Fundamentosdelaprogramacin:TiposeinstruccionesII

Pgina 257

Dnde queda pendiente la entrada?


Nmero ledo con el extractor En el primer carcter no vlido (inc. espacios en blanco) Carcter ledo con get() En el siguiente carcter (inc. espacios en blanco) Una cadena leda con el extractor En el siguiente espacio en blanco Una cadena leda con la funcin getline() Al principio de la siguiente lnea

LuisHernndezYez

Fundamentosdelaprogramacin:TiposeinstruccionesII

Pgina 258

string nif,producto; int unidades; double precio; char aux; 1 ifstream archivo; 2 archivo.open("compras.txt");//Apertura 3 archivo>>nif >>unidades>>precio; getline(archivo,producto); 4 archivo.close();//Cierre
LuisHernndezYez 7 6 5 4 3 2 1

Flujo de entrada archivo

Programa

Fundamentosdelaprogramacin:TiposeinstruccionesII

Pgina 259

archivo>>nif; archivo>>unidades; archivo>>precio; getline(archivo,producto);


getline() no salta espacios

12345678F2123.95ReproductordeDVD
El extractor salta los espacios

nif 12345678F
LuisHernndezYez

unidades 2 precio 123.95

producto

ReproductordeDVD

Espacio
Fundamentosdelaprogramacin:TiposeinstruccionesII Pgina 260

archivo>>nif; archivo>>unidades; archivo>>precio; archivo.get(aux);//Saltaelespacioenblanco getline(archivo,producto);

12345678F2123.95ReproductordeDVD
Leemos el espacio (no hacemos nada con l) nif 12345678F
LuisHernndezYez

unidades 2 precio 123.95

producto ReproductordeDVD Sin espacio


Fundamentosdelaprogramacin:TiposeinstruccionesII

Pgina 261

Cada lnea, datos de una compra Mostrar el total de cada compra unidades x precio ms IVA (21%) Final: "X" como NIF Bucle de procesamiento: Cada paso del bucle (ciclo) procesa una lnea (compra) Podemos usar las mismas variables en cada ciclo Leer primer NIF Mientras el NIF no sea X: Leer unidades, precio y descripcin Calcular y mostrar el total Leer el siguiente NIF
Fundamentosdelaprogramacin:TiposeinstruccionesII Pgina 262

LuisHernndezYez

#include<iostream> #include<string> usingnamespacestd; #include<fstream> #include<iomanip>//Formatodesalida int main(){ const int IVA=21; string nif,producto; int unidades; double precio,neto,total,iva; char aux; ifstream archivo; int contador=0; archivo.open("compras.txt");//Apertura ...
Fundamentosdelaprogramacin:TiposeinstruccionesII

leer.cpp

LuisHernndezYez

Pgina 263

LuisHernndezYez

if (archivo.is_open()){//Existeelarchivo archivo>>nif;//PrimerNIF while (nif !="X"){ archivo>>unidades>>precio; archivo.get(aux);//Saltaelespacio getline(archivo,producto); contador++; neto=unidades*precio; iva =neto*IVA/100; total=neto+iva; cout<<"Compra" <<contador<<"." <<endl; cout<<"" <<producto<<":" <<unidades <<"x" <<fixed <<setprecision(2) <<precio<<"=" <<neto<<" I.V.A.:" <<iva <<" Total:" <<total<<endl; archivo>>nif;//SiguienteNIF }...
Fundamentosdelaprogramacin:TiposeinstruccionesII Pgina 264

archivo.close();//Cierre } else { cout<<"ERROR:Nosehapodidoabrirelarchivo" <<endl; } return 0; }

LuisHernndezYez

Fundamentosdelaprogramacin:TiposeinstruccionesII

Pgina 265

LuisHernndezYez

Fundamentosdelaprogramacin:TiposeinstruccionesII

Pgina 266

Flujos de texto de salida


Para crear un archivo de texto y escribir en l: 1 Declara una variable de tipo ofstream

ofstream

2 Asocia la variable con el archivo de texto (crea el archivo) 3 Realiza las escrituras por medio del operador << (insertor) 4 Desliga la variable del archivo de texto (cierra el archivo)
Atencin! Si el archivo ya existe, se borra todo lo que hubiera
LuisHernndezYez

Atencin! Si no se cierra el archivo se puede perder informacin


Fundamentosdelaprogramacin:TiposeinstruccionesII Pgina 267

int valor=999;
Programa

1 ofstream archivo; 2 archivo.open("output.txt");//Apertura 3 archivo<<'X' <<"Hola!" <<123.45 <<endl<<valor<<"Bye!"; 4 archivo.close();//Cierre

2 1

! a l o H

Flujo de salida archivo

LuisHernndezYez

Fundamentosdelaprogramacin:TiposeinstruccionesII

Pgina 268

escribir.cpp

#include<iostream> #include<string> usingnamespacestd; #include<fstream> int main(){ string nif,producto; int unidades; double precio; char aux; ofstream archivo; archivo.open("output.txt");//Apertura(creacin)
LuisHernndezYez

cout<<"NIFdelcliente(Xparaterminar):"; cin>>nif; ...


Fundamentosdelaprogramacin:TiposeinstruccionesII Pgina 269

LuisHernndezYez

while (nif !="X"){ //QuedapendienteelIntroanterior... cin.get(aux);//LeemoselIntro cout<<"Producto:"; getline(cin,producto); cout<<"Unidades:"; cin>>unidades; cout<<"Precio:"; cin>>precio; //Escribimoslosdatosenunalneadelarchivo... //Conunespaciodeseparacinentreellos archivo<<nif <<"" <<unidades<<"" <<precio<<"" <<producto<<endl; cout<<"NIFdelcliente(Xparaterminar):"; cin>>nif; } ...
Fundamentosdelaprogramacin:TiposeinstruccionesII Pgina 270

//Escribimoselcentinelafinal... archivo<<"X"; archivo.close();//Cierredelarchivo return 0; }

LuisHernndezYez

Fundamentosdelaprogramacin:TiposeinstruccionesII

Pgina 271

LuisHernndezYez

Fundamentosdelaprogramacin:TiposeinstruccionesII

Pgina 272

{ double oper1,oper2,prod; cout<<"Operando1:"; cin>>oper1; cout<<"Operando2:"; ... cout<<"Producto:" <<prod;


InstruccinN

Flujo de ejecucin

Instruccin1 Instruccin2 Instruccin3

LuisHernndezYez

return 0; }

Fundamentosdelaprogramacin:TiposeinstruccionesII

Pgina 273

Uno entre dos o ms caminos de ejecucin


Seleccin simple (2 caminos) Seleccin mltiple (> 2 caminos)
true

true

Condicin

false

false true

InstruccinT

InstruccinF

false true false

if
LuisHernndezYez

ifelseif switch Diagramasdeflujo


Fundamentosdelaprogramacin:TiposeinstruccionesII

true false

Pgina 274

Repetir la ejecucin de una o ms instrucciones


Acumular, procesar colecciones, ...

Inicializacin

Iterar?

No

Cdigo
LuisHernndezYez

while
Fundamentosdelaprogramacin:TiposeinstruccionesII

for
Pgina 275

LuisHernndezYez

Fundamentosdelaprogramacin:TiposeinstruccionesII

Pgina 276

La instruccin if
if (condicin){ cdigoT } [else { cdigoF }]
true
BloqueT Condicin

false
BloqueF Opcional

LuisHernndezYez

condicin: expresin bool Clusula else opcional

Fundamentosdelaprogramacin:TiposeinstruccionesII

Pgina 277

signo.cpp

int num; cin>>num; if (num<0){ cout<<"Negativo"; } cin>>num; else{ false true cout<<"Positivo"; num<0 } cout<<"Negativo"; cout<<"Positivo"; cout<<endl;
LuisHernndezYez

cout<<endl;

Fundamentosdelaprogramacin:TiposeinstruccionesII

Pgina 278

int num; cin>>num; if (num<0){ cout<<"Negativo"; } else{ cout<<"Positivo"; } cout<<endl;


num<0
cout<<"Positivo";
LuisHernndezYez

_29 1 129 _ Positivo _

cin>>num;

false
num 129 ?

cout<<endl;

Fundamentosdelaprogramacin:TiposeinstruccionesII

Pgina 279

int num; cin>>num; if (num<0){ cout<<"Negativo"; } else{ cout<<"Positivo"; } cout<<endl; true


num<0
num ? 5

5 Negativo

cin>>num;

cout<<"Negativo";
LuisHernndezYez

cout<<endl;

Fundamentosdelaprogramacin:TiposeinstruccionesII

Pgina 280

divisin.cpp

Divisin entre dos nmeros protegida frente a intento de divisin por 0 #include<iostream> usingnamespacestd; int main(){ double numerador,denominador,resultado; cout<<"Numerador:"; cin>>numerador; cout<<"Denominador:"; cin>>denominador; if (denominador==0){ cout<<"Imposibledividirentre0!"; } else{ resultado=numerador/denominador; cout<<"Resultado:" <<resultado<<endl; } return 0; }
Fundamentosdelaprogramacin:TiposeinstruccionesII Pgina 281

LuisHernndezYez

LuisHernndezYez

Fundamentosdelaprogramacin:TiposeinstruccionesII

Pgina 282

Se aplican a valores bool (condiciones) El resultado es de tipo bool

! && ||

NO Y O

Monario Binario Binario

Operadores(prioridad) ... ! */% + < <=>>= ==!=

LuisHernndezYez

&& ||

Fundamentosdelaprogramacin:TiposeinstruccionesII

Pgina 283

! true false false true

&& true false

true true false

false false false

|| true false

true true true

false true false

NO (Not)

Y (And)

O (Or)

bool cond1,cond2,resultado; int a=2,b=3,c=4; resultado=!(a<5);//!(2<5) !true false cond1=(a*b+c)>=12;//10>=12 false


LuisHernndezYez

cond2=(a*(b+c))>=12;//14>=12 true resultado=cond1&&cond2;//false&&true false resultado=cond1||cond2;//false||true true

Fundamentosdelaprogramacin:TiposeinstruccionesII

Pgina 284

condiciones.cpp #include<iostream> usingnamespacestd; int main() { int num; cout<<"Introduceunnmeroentre1y10:"; cin>>num; if ((num>=1)&&(num<=10)){ cout<<"Nmerodentrodelintervalodevaloresvlidos"; } else{ cout<<"Nmeronovlido!"; } Condiciones equivalentes return 0; ((num >=1)&&(num <=10)) }

LuisHernndezYez

Encierra las condiciones simples entre parntesis!

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


Pgina 285

Fundamentosdelaprogramacin:TiposeinstruccionesII

LuisHernndezYez

Fundamentosdelaprogramacin:TiposeinstruccionesII

Pgina 286

diasmes.cpp int mes,anio,dias; cout<<"Nmerodemes:"; cin>>mes; cout<<"Ao:"; cin>>anio; if (mes==2){ if (bisiesto(mes,anio)){ dias =29; } else { dias =28; } } else{ if ((mes==1)||(mes==3)||(mes==5)||(mes==7) ||(mes==8)||(mes==10)||(mes==12)){ dias =31; } else{ dias =30; } }
Fundamentosdelaprogramacin:TiposeinstruccionesII Pgina 287

LuisHernndezYez

Calendario Gregoriano: bisiesto si divisible por 4, excepto el ltimo de cada siglo (divisible por 100), salvo que sea divisible por 400
bool bisiesto(int mes,int anio){ bool esBisiesto; if ((anio %4)==0){//Divisiblepor4 if (((anio %100)==0)&&((anio %400)!=0)){ //Peroltimodesigloynomltiplode400 esBisiesto =false; } else { esBisiesto =true;//Aobisiesto } } else { esBisiesto =false; } return esBisiesto; }
Fundamentosdelaprogramacin:TiposeinstruccionesII Pgina 288

LuisHernndezYez

Cada else se asocia al if anterior ms cercano sin asociar (mismo bloque) if (condicin1){ if (condicin2){...} else {...} } else{ if (condicin3){ if (condicin4){...} if (condicin5){...} else {...} } else {... Una mala sangra puede confundir
if (x>0){ if (y>0){...} else {...}

if (x>0){ if (y>0){...} else {...}

LuisHernndezYez

La sangra ayuda a asociar los else con sus if


Fundamentosdelaprogramacin:TiposeinstruccionesII Pgina 289

LuisHernndezYez

Fundamentosdelaprogramacin:TiposeinstruccionesII

Pgina 290

Condicin simple:
num<0 car=='a' isalpha(car) 12

Expresin lgica (true/false) Sin operadores lgicos

Compatibilidad con el lenguaje C: 0 es equivalente a false Cualquier valor distinto de 0 es equivalente a true

Condicin compuesta: Combinacin de condiciones simples y operadores lgicos


!isalpha(car) (num<0)|| (car=='a') (num<0)&& ((car=='a')||!isalpha(car)) No confundas el operador de igualdad (==) con el operador de asignacin (=).
Fundamentosdelaprogramacin:TiposeinstruccionesII Pgina 291

LuisHernndezYez

Shortcut Boolean Evaluation


true || X true (n==0)||(x>=1.0 /n) Si n es 0: divisin por cero? (segunda condicin) Como la primera sera true: no se evala la segunda! false && X false (n!=0)&&(x<1.0 /n) Si n es 0: divisin por cero? (segunda condicin) Como la primera sera false: no se evala la segunda!

LuisHernndezYez

Fundamentosdelaprogramacin:TiposeinstruccionesII

Pgina 292

LuisHernndezYez

Fundamentosdelaprogramacin:TiposeinstruccionesII

Pgina 293

true false true false true false true false

LuisHernndezYez

ifelseif switch
Fundamentosdelaprogramacin:TiposeinstruccionesII Pgina 294

LuisHernndezYez

Fundamentosdelaprogramacin:TiposeinstruccionesII

Pgina 295

Ejemplo: Calificacin (en letras) de un estudiante en base a su nota numrica (010)

true ==10 false true cout<<"MH"

Si nota==10 entonces MH si no, si nota>=9 entonces SB si no, si nota>=7 entonces NT si no, si nota>=5 entonces AP
LuisHernndezYez

>=9 false true >=7 false true >=5 false

cout<<"SB"

cout<<"NT"

cout<<"AP" cout<<"SS"

si no SS

Fundamentosdelaprogramacin:TiposeinstruccionesII

Pgina 296

nota.cpp double nota; cin>>nota; if (nota==10){ cout<<"MH"; } else { if (nota>=9){ cout<<"SB"; } else { if (nota>=7){ cout<<"NT"; } else { if (nota>=5){ cout<<"AP"; } else { cout<<"SS"; } } } }
Fundamentosdelaprogramacin:TiposeinstruccionesII

LuisHernndezYez

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

Cuidado con el orden de las condiciones!


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


Pgina 298

LuisHernndezYez

No se ejecutan nunca! double nota; cin>>nota; if (nota>=5){cout<<"AP";} else if (nota>=7){cout<<"NT";} else if (nota>=9){cout<<"SB";} else if (nota==10){cout<<"MH";} else {cout<<"SS";} Slo muestra AP o SS
Fundamentosdelaprogramacin:TiposeinstruccionesII

Simplificacin de las condiciones


0 SS 5 AP 7 NT

if (nota==10){cout<<"MH";} else if ((nota<10)&&(nota>=9)){cout<<"SB";} else if ((nota<9)&&(nota>=7)){cout<<"NT";} else if ((nota<7)&&(nota>=5)){cout<<"AP";} else if (nota<5){cout<<"SS";}


Siempre true: ramas else Si no es 10, es menor que 10 if (nota==10){cout<<"MH";} Si no es >= 9, es menor que 9 else if (nota>=9){cout<<"SB";} Si no es >= 7, es menor que 7 else if (nota>=7){cout<<"NT";}

9 SB 10 MH

LuisHernndezYez

else if (nota>=5){cout<<"AP";} true &&X X else {cout<<"SS";}


Fundamentosdelaprogramacin:TiposeinstruccionesII Pgina 299

nivel.cpp #include<iostream> Sinum==4 entoncesMuyalto usingnamespacestd; Sinum==3 entoncesAlto int main(){ Sinum==2 entoncesMedio int num; cout<<"Introduceelnivel:"; Sinum==1 entoncesBajo cin>>num; if (num==4){ cout<<"Muyalto" <<endl; } elseif (num==3){ cout<<"Alto" <<endl; } elseif (num==2){ cout<<"Medio" <<endl; } elseif (num==1){ cout<<"Bajo" <<endl; } else{ cout<<"Valornovlido" <<endl; } return 0; }
Fundamentosdelaprogramacin:TiposeinstruccionesII Pgina 300

LuisHernndezYez

if (num==4){cout<<"Muyalto" <<endl;} elseif (num==3){cout<<"Alto" <<endl;} elseif (num==2){cout<<"Medio" <<endl;} elseif (num==1){cout<<"Bajo" <<endl;} elsecout<<"Valornovlido" <<endl;}

LuisHernndezYez

if (num==4)cout<<"Muyalto"; elseif (num==3)cout<<"Alto"; elseif (num==2)cout<<"Medio"; elseif (num==1)cout<<"Bajo"; elsecout<<"Valornovlido"; cout<<endl;

Fundamentosdelaprogramacin:TiposeinstruccionesII

Pgina 301

LuisHernndezYez

Fundamentosdelaprogramacin:TiposeinstruccionesII

Pgina 302

Seleccin entre valores posibles de una expresin


switch (expresin){ case constante1: { cdigo1 } [break;] case constante2: { cdigo2 } [break;] ... case constanteN: { cdigoN } [break;] [default: { cdigoDefault }] }

LuisHernndezYez

Fundamentosdelaprogramacin:TiposeinstruccionesII

Pgina 303

nivel2.cpp
switch (num){ case 4: { cout<<"Muyalto"; } break; case 3: { cout<<"Alto"; } break; case 2: { cout<<"Medio"; } break; case 1: { cout<<"Bajo"; } break; default: { cout<<"Valornovlido"; } }
Fundamentosdelaprogramacin:TiposeinstruccionesII

Si num==4 Muy alto Si num==3 Alto Si num==2 Medio Si num==1 Bajo

LuisHernndezYez

Pgina 304

Interrumpe el switch; contina en la instruccin que le siga


switch (num){ ... case 3: { cout<<"Alto"; } break; case 2: { cout<<"Medio"; } break; ... }
Fundamentosdelaprogramacin:TiposeinstruccionesII

Num:3 Alto

LuisHernndezYez

Pgina 305

LuisHernndezYez

switch (num){ ... case 3: { cout<<"Alto"; } case 2: { cout<<"Medio"; } case 1: { cout<<"Bajo"; } default: { cout<<"Valornovlido"; } }
Fundamentosdelaprogramacin:TiposeinstruccionesII

Num:3 Alto Medio Bajo Valornovlido

Pgina 306

true
num==4 Muyalto break; Sin break;

false true
num==3

Alto break; Sin break;

false true
num==2

Medio break; Sin break; Bajo Sin break;


Novlido

false true
num==1

break;

false
LuisHernndezYez

default

Fundamentosdelaprogramacin:TiposeinstruccionesII

Pgina 307

int menu(){ int op =1;//Cualquieranovlida while ((op <0)||(op >4)){ cout<<"1 Nuevocliente" <<endl; cout<<"2 Editarcliente" <<endl; cout<<"3 Bajacliente" <<endl; cout<<"4 Vercliente" <<endl; cout<<"0 Salir" <<endl; cout<<"Opcin:"; cin>>op; if ((op <0)||(op >4)){ cout<<"Opcinnovlida!"<<endl; } } return op; }
Fundamentosdelaprogramacin:TiposeinstruccionesII

1 Nuevocliente 2 Editarcliente 3 Bajacliente 4 Vercliente 0 Salir Opcin:5 Opcinnovlida! 1 Nuevocliente 2 Editarcliente 3 Bajacliente 4 Vercliente 0 Salir Opcin:3

LuisHernndezYez

Pgina 308

LuisHernndezYez

int opcion; ... opcion =menu(); switch (opcion){ case 1: { cout<<"Enlaopcin1..." <<endl; } break; case 2: { cout<<"Enlaopcin2..." <<endl; } break; case 3: { cout<<"Enlaopcin3..." <<endl; } break; case 4: { cout<<"Enlaopcin4..." <<endl; }//Enlaltimanonecesitamosbreak }
Fundamentosdelaprogramacin:TiposeinstruccionesII Pgina 309

LuisHernndezYez

int opcion; ... opcion =menu(); while (opcion!=0){ switch (opcion){ case 1: { cout<<"Enlaopcin1..." <<endl; } break; ... case 4: { cout<<"Enlaopcin4..." <<endl; } } //switch ... opcion =menu(); } //while

Fundamentosdelaprogramacin:TiposeinstruccionesII

Pgina 310

nota2.cpp int nota;//Sindecimales cout<<"Nota(010):"; cin>>nota; switch (nota){ case 0: case 1: case 2: case 3: case 4: { cout<<"Suspenso"; } break;//De0a4:SS case 5: case 6: { cout<<"Aprobado"; } break; //5o6:AP
Fundamentosdelaprogramacin:TiposeinstruccionesII

case case {

7: 8:

LuisHernndezYez

cout<<"Notable"; } break;//7u8:NT case 9: case 10: { cout<<"Sobresaliente"; } break;//9o10:SB default: { cout<<"Novlida!"; } }

Pgina 311

LuisHernndezYez

typedefenum {enero,febrero,marzo,abril,mayo,junio, julio,agosto,septiembre,octubre,noviembre,diciembre} tMes; tMes mes; ... switch (mes){ case enero: { cout<<"enero"; } break; case febrero: { cout<<"febrero"; } break; ... case diciembre: { cout<<"diciembre"; } }
Fundamentosdelaprogramacin:TiposeinstruccionesII Pgina 312

LuisHernndezYez

Fundamentosdelaprogramacin:TiposeinstruccionesII

Pgina 313

Inicializacin

S Cuerpo

Iterar?

No

LuisHernndezYez

Bucles while y for

Fundamentosdelaprogramacin:TiposeinstruccionesII

Pgina 314

Nmero de iteraciones condicionado (recorrido variable):

Bucle while while(condicin)cuerpo Ejecuta el cuerpo mientras la condicin sea true Bucle dowhile Comprueba la condicin al final (lo veremos ms adelante)

Nmero de iteraciones prefijado (recorrido fijo):

LuisHernndezYez

Bucle for for(inicializacin;condicin;paso)cuerpo Ejecuta el cuerpo mientras la condicin sea true Se usa una variable contadora entera

Fundamentosdelaprogramacin:TiposeinstruccionesII

Pgina 315

LuisHernndezYez

Fundamentosdelaprogramacin:TiposeinstruccionesII

Pgina 316

while.cpp

Mientras la condicin sea cierta, ejecuta el cuerpo


while(condicin){ cuerpo } Condicin al principio del bucle

int i=1;//Inicializacindelavariablei while(i<=100){ cout<<i<<endl; i++; }


LuisHernndezYez

Muestra los nmeros del 1 al 100

Fundamentosdelaprogramacin:TiposeinstruccionesII

Pgina 317

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


i=1

true Cuerpo

Condicin

false

100 101 99 ? 3 2 1 4 true


i<=100

_ 1

false

2 3 99 100

cout<<i<<endl;
LuisHernndezYez

i++

Fundamentosdelaprogramacin:TiposeinstruccionesII

Pgina 318

Y si la condicin es falsa al comenzar?


No se ejecuta el cuerpo del bucle ninguna vez
int op; cout<<"Introducelaopcin:"; cin>>op; while((op <0)||(op >4)){ cout<<"Novlida!Intntalootravez" <<endl; cout<<"Introducelaopcin:"; cin>>op; }
LuisHernndezYez

Si el usuario introduce un nmero entre 0 y 4: No se ejecuta el cuerpo del bucle

Fundamentosdelaprogramacin:TiposeinstruccionesII

Pgina 319

primero.cpp

Primer entero cuyo cuadrado es mayor que 1.000


#include<iostream> usingnamespacestd; int main(){ int num=1; while(num*num<=1000){ num++; } Ejecuta el programa para saber cul es ese nmero!

Empezamosen1 Incrementamosen1

LuisHernndezYez

cout<<"1er.enteroconcuadradomayorque1.000:" <<num<<endl; return 0; }

Recorre la secuencia de nmeros 1, 2, 3, 4, 5, ...


Fundamentosdelaprogramacin:TiposeinstruccionesII Pgina 320

sumamedia.cpp #include<iostream> Recorre la secuencia usingnamespacestd; de nmeros introducidos int main(){ double num,suma=0,media=0; int cont =0; cout<<"Introduceunnmero(0paraterminar):"; cin>>num; Leemoselprimero while(num!=0){//0paraterminar suma=suma+num; cont++; cout<<"Introduceunnmero(0paraterminar):"; cin>>num; Leemoselsiguiente } if (cont >0){ media=suma/cont; } cout<<"Suma="<<suma<<endl; cout<<"Media="<<media<<endl; return 0; }
Fundamentosdelaprogramacin:TiposeinstruccionesII Pgina 321

LuisHernndezYez

LuisHernndezYez

Fundamentosdelaprogramacin:TiposeinstruccionesII

Pgina 322

Nmero de iteraciones prefijado


Variable contadora que determina el nmero de iteraciones: for ([int]var =ini;condicin;paso)cuerpo La condicin compara el valor de var con un valor final El paso incrementa o decrementa el valor de var El valor de var debe ir aproximndose al valor final
for(int i=1;i<=100;i++)... for(int i=100;i>=1;i)...
LuisHernndezYez

1,2,3,4,5,...,100 100,99,98,97,...,1

Tantos ciclos como valores toma la variable contadora

Fundamentosdelaprogramacin:TiposeinstruccionesII

Pgina 323

for(inicializacin;condicin;paso)cuerpo

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


i=1

true

i<=100

false

cout<<i;
LuisHernndezYez

i++

Fundamentosdelaprogramacin:TiposeinstruccionesII

Pgina 324

for1.cpp

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


i
? 100 101 2 1 3

...
true

i=1
i<=100 false

1 2 3 99 100

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

Fundamentosdelaprogramacin:TiposeinstruccionesII

Pgina 325

La variable contadora
El paso no tiene porqu ir de uno en uno: for(int i=1;i<=100;i=i+2) cout<<i<<endl; Este bucle for muestra los nmeros impares de 1 a 99

for2.cpp

Muy importante El cuerpo del bucle NUNCA debe alterar el valor del contador

Garanta de terminacin
LuisHernndezYez

Todo bucle debe terminar su ejecucin Bucles for: la variable contadora debe converger al valor final

Fundamentosdelaprogramacin:TiposeinstruccionesII

Pgina 326

suma.cpp #include<iostream> usingnamespacestd; longlong int suma(intn); int main(){ int num; cout<<"Nmerofinal:"; cin>>num; if (num>0){//Elnmerodebeserpositivo cout<<"Lasumadelosnmerosentre1y" <<num<<"es:" <<suma(num); } return 0; } longlong int suma(int n){ longlong int total=0; for(int i=1;i<=n;i++){ total=total+i; } Recorre la secuencia de nmeros return total; 1, 2, 3, 4, 5, ..., n }
Fundamentosdelaprogramacin:TiposeinstruccionesII Pgina 327

LuisHernndezYez

Incremento/decremento prefijo o postfijo?


Es indiferente Estos dos bucles producen el mismo resultado: for(int i=1;i<=100;i++)... for(int i=1;i<=100;++i)...

Bucles infinitos
for(int i=1;i<=100;i)... 101234567891011... Cada vez ms lejos del valor final (100) Es un error de diseo/programacin
Fundamentosdelaprogramacin:TiposeinstruccionesII Pgina 328

LuisHernndezYez

Declarada en el propio bucle


for(int i=1;...) Slo se conoce en el cuerpo del bucle (su mbito) No se puede usar en instrucciones que sigan al bucle

Declarada antes del bucle


int i; for(i=1;...) Se conoce en el cuerpo del bucle y despus del mismo mbito externo al bucle

LuisHernndezYez

Fundamentosdelaprogramacin:TiposeinstruccionesII

Pgina 329

Los bucles for se pueden reescribir como bucles condicionados for(int i=1;i<=100;i++)cuerpo Es equivalente a: int i=1; while(i<=100){ cuerpo i++; } La inversa no es siempre posible:
LuisHernndezYez

int i; cin>>i; while(i!=0){ cuerpo cin>>i; }

Bucle for equivalente? No sabemos cuntos nmeros introducir el usuario!


Pgina 330

Fundamentosdelaprogramacin:TiposeinstruccionesII

LuisHernndezYez

Fundamentosdelaprogramacin:TiposeinstruccionesII

Pgina 331

Un bucle for en el cuerpo de otro bucle for Cada uno con su propia variable contadora: for(int i=1;i<=100;i++){ for(int j=1;j<=5;j++){ cuerpo } } Para cada valor de i el valor de j vara entre 1 y 5
LuisHernndezYez

j vara ms rpido que i

i 1 1 1 1 1 2 2 2 2 2 3 ...

j 1 2 3 4 5 1 2 3 4 5 1

Fundamentosdelaprogramacin:TiposeinstruccionesII

Pgina 332

tablas.cpp

#include<iostream> usingnamespacestd; #include<iomanip> 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; } }
LuisHernndezYez

1x1=1 1x2=2 1x3=3 1x4=4 ... 1x10=10 2x1=2 2x2=4 ... 10x7=70 10x8=80 10x9=90 10x10=100

return 0; }
Fundamentosdelaprogramacin:TiposeinstruccionesII Pgina 333

tablas2.cpp

#include<iostream> usingnamespacestd; #include<iomanip> int main(){ for(int i=1;i<=10;i++){ cout<<"Tabladel"<<i<<endl; cout<<""<<endl; for(int j=1;j<=10;j++){ cout<<setw(2)<<i<<"x" <<setw(2)<<j<<"=" <<setw(3)<<i*j<<endl; } cout<<endl; } return 0; }
Fundamentosdelaprogramacin:TiposeinstruccionesII Pgina 334

LuisHernndezYez

men.cpp #include<iostream> usingnamespacestd; #include<iomanip> int menu();//1:Tablasdemultiplicacin;2:Sumatorio longlong intsuma(int n);//Sumatorio int main(){ int opcion=menu(); while (opcion!=0){ switch (opcion){ case 1: { for(int i=1;i<=10;i++){ for(int j=1;j<=10;j++){ cout<<setw(2)<<i<<"x" <<setw(2)<<j<<"=" <<setw(3)<<i*j<<endl; } } } break;...
Fundamentosdelaprogramacin:TiposeinstruccionesII Pgina 335

LuisHernndezYez

case 2: { int num=0; while (num<=0){ cout<<"Hasta(positivo)?"; cin>>num; } cout<<"Lasumadelosnmerosdel1al" <<num<<"es:"<<suma(num)<<endl; } }//switch opcion =menu(); }//while(opcion!=0) return 0; }
LuisHernndezYez

Fundamentosdelaprogramacin:TiposeinstruccionesII

Pgina 336

LuisHernndezYez

int menu(){ int op =1; while ((op <0)||(op >2)){ cout<<"1 Tablasdemultiplicar" <<endl; cout<<"2 Sumatorio" <<endl; cout<<"0 Salir" <<endl; cout<<"Opcin:" <<endl; cin>>op; if ((op <0)||(op >2)){ cout<<"Opcinnovlida!"<<endl; } } return op; } longlong int suma(int n){ longlong int total=0; for(int i=1;i<=n;i++){ total=total+i; } return total; }
Fundamentosdelaprogramacin:TiposeinstruccionesII Pgina 337

LuisHernndezYez

while (opcion!=0){ ... for(int i=1;i<=10;i++){ for(int j=1;j<=10;j++){ ... } } while (num<=0){ ... suma() } for(int i=1;i<=n;i++){ ... } while ((op <0)||(op >2)){ ... } menu() }
Fundamentosdelaprogramacin:TiposeinstruccionesII Pgina 338

LuisHernndezYez

Fundamentosdelaprogramacin:TiposeinstruccionesII

Pgina 339

Cada bloque crea un nuevo mbito: int main(){ double d=1,suma=0; 3 mbitos anidados 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; }
Fundamentosdelaprogramacin:TiposeinstruccionesII Pgina 340

LuisHernndezYez

Un identificador se conoce en el mbito en el que est declarado (a partir de su instruccin de declaracin) y en los submbitos posteriores

LuisHernndezYez

Fundamentosdelaprogramacin:TiposeinstruccionesII

Pgina 341

LuisHernndezYez

int main(){ mbito de la variable d double d; if(...){ int cont=0; for(int i=0;i<=10;i++){ ... } } char c; if(...){ double x; ... } return 0; }
Fundamentosdelaprogramacin:TiposeinstruccionesII Pgina 342

LuisHernndezYez

int main(){ double d; if(...){ mbito de la variable cont int cont=0; for(int i=0;i<=10;i++){ ... } } char c; if(...){ double x; ... } return 0; }
Fundamentosdelaprogramacin:TiposeinstruccionesII Pgina 343

LuisHernndezYez

int main(){ double d; if(...){ int cont=0; for(int i=0;i<=10;i++){ ... } mbito de la variable i } char c; if(...){ double x; ... } return 0; }
Fundamentosdelaprogramacin:TiposeinstruccionesII Pgina 344

LuisHernndezYez

int main(){ double d; if(...){ int cont=0; for(int i=0;i<=10;i++){ ... } } char c; if(...){ mbito de la variable c double x; ... } return 0; }
Fundamentosdelaprogramacin:TiposeinstruccionesII Pgina 345

LuisHernndezYez

int main(){ double d; if(...){ int cont=0; for(int i=0;i<=10;i++){ ... } } char c; if(...){ double x; ... mbito de la variable x } return 0; }
Fundamentosdelaprogramacin:TiposeinstruccionesII Pgina 346

Si en un submbito se declara un identificador con idntico nombre que uno ya declarado en el mbito, el del submbito oculta al del mbito (no es visible)

LuisHernndezYez

Fundamentosdelaprogramacin:TiposeinstruccionesII

Pgina 347

LuisHernndezYez

int main(){ Oculta , en su mbito, a la i anterior int i,x; if(...){ Oculta , en su mbito, a la i anterior int i=0; for(int i=0;i<=10;i++){ ... } } char c; if(...){ Oculta , en su mbito, a la x anterior double x; ... } return 0; }
Fundamentosdelaprogramacin:TiposeinstruccionesII Pgina 348

LuisHernndezYez

Fundamentosdelaprogramacin:TiposeinstruccionesII

Pgina 349

Sucesin de elementos de un mismo tipo que se acceden linealmente


elemento secuencia (Secuencia vaca) secuencia o elemento

134122648718452
Comienza en un primer elemento (si no est vaca) A cada elemento le sigue otra secuencia (vaca, si es el ltimo) Acceso secuencial (lineal) Se comienza siempre accediendo al primer elemento Desde un elemento slo se puede acceder a su elemento siguiente (sucesor), si es que existe Todos los elementos, de un mismo tipo
Fundamentosdelaprogramacin:TiposeinstruccionesII Pgina 350

LuisHernndezYez

No tratamos secuencias infinitas: siempre hay un ltimo elemento Secuencias explcitas:

Sucesin de datos de un dispositivo (teclado, disco, sensor, ...) Frmula de recurrencia que determina el elemento siguiente

Secuencias calculadas:

Listas (ms adelante) Secuencias explcitas que manejaremos: Datos introducidos por el teclado o ledos de un archivo
LuisHernndezYez

Con un elemento especial al final de la secuencia (centinela) 1341226487184521

Fundamentosdelaprogramacin:TiposeinstruccionesII

Pgina 351

Secuencia explcita leda de archivo: Detectar la marca de final de archivo (Eof End of file) Detectar un valor centinela al final Secuencia explcita leda del teclado: Preguntar al usuario si quiere introducir un nuevo dato Preguntar al usuario primero cuntos datos va a introducir Detectar un valor centinela al final Valor centinela: Valor especial al final que no puede darse en la secuencia (Secuencia de nmeros positivos centinela: cualquier negativo)
12 4 37 23 8 19 83 63 2 35 17 76 15 1
Pgina 352

LuisHernndezYez

Fundamentosdelaprogramacin:TiposeinstruccionesII

Debe haber algn valor que no sea un elemento vlido Secuencias numricas: Si se permite cualquier nmero, no hay centinela posible Cadenas de caracteres: Caracteres especiales (no imprimibles)? En realidad el valor centinela es parte de la secuencia, pero su significado es especial y no se procesa como el resto Significa que se ha alcanzado el final de la secuencia (Incluso aunque haya elementos posteriores)
ltimo elemento
LuisHernndezYez

12

37 23

19 83 63 1 35 17 76 15 No se procesan

Fundamentosdelaprogramacin:TiposeinstruccionesII

Pgina 353

Tratamiento de los elementos uno a uno desde el primero

Recorrido
Un mismo tratamiento para todos los elementos de la secuencia Ej. Mostrar los elementos de una secuencia, sumar los nmeros de una secuencia, par o impar cada nmero de una secuencia?, ... Termina al llegar al final de la secuencia

Bsqueda
Recorrido de la secuencia hasta encontrar un elemento buscado Ej. Localizar el primer nmero que sea mayor que 1.000 Termina al localizar el primer elemento que cumple la condicin o al llegar al final de la secuencia (no encontrado)

LuisHernndezYez

Fundamentosdelaprogramacin:TiposeinstruccionesII

Pgina 354

LuisHernndezYez

Fundamentosdelaprogramacin:TiposeinstruccionesII

Pgina 355

Un mismo tratamiento a todos los elementos


Inicializacin Mientras no se llegue al final de la secuencia: Obtener el siguiente elemento Procesar el elemento Finalizacin
Al empezar se obtiene el primer elemento de la secuencia En los siguientes pasos del bucle se van obteniendo los siguientes elementos de la secuencia

LuisHernndezYez

Fundamentosdelaprogramacin:TiposeinstruccionesII

Pgina 356

Inicializacin

Al final?

true

false
Obtener elemento Procesar elemento

No sabemos cuntos elementos hay No podemos implementar con for

LuisHernndezYez

Finalizacin

Fundamentosdelaprogramacin:TiposeinstruccionesII

Pgina 357

Implementacin con while


Inicializacin Obtener el primer elemento Mientras no sea el centinela: Procesar el elemento Obtener el siguiente elemento Finalizacin
Inicializacin Obtener 1

Centinela?

true

false
Procesar elemento Obtener siguiente

LuisHernndezYez

Finalizacin

Fundamentosdelaprogramacin:TiposeinstruccionesII

Pgina 358

Secuencia de nmeros positivos


Siempre se realiza al menos una lectura Centinela: 1 double d,suma=0; Inicializacin cout<<"Valor(1termina):"; Primer elemento cin>>d; while(d!=1){ Mientras no el centinela suma=suma+d; Procesar elemento cout<<"Valor(1termina):"; Siguiente elemento cin>>d; } cout<<"Suma="<<suma<<endl; Finalizacin

LuisHernndezYez

Fundamentosdelaprogramacin:TiposeinstruccionesII

Pgina 359

Longitud de una secuencia de caracteres


Centinela: carcter punto (.)

longitud.cpp

LuisHernndezYez

int longitud(){ int l=0; char c; cout<<"Textoterminadoenpunto:"; cin>>c;//Obtenerprimercarcter while(c!='.'){//Mientrasnoelcentinela l++;//Procesar cin>>c;//Obtenersiguientecarcter } return l; }

Fundamentosdelaprogramacin:TiposeinstruccionesII

Pgina 360

Cuntas veces aparece un carcter en una cadena?


Centinela: asterisco (*)
cont.cpp

LuisHernndezYez

charbuscado,c; intcont =0; cout<<"Carcterabuscar:"; cin>>buscado; cout<<"Cadena:"; cin>>c; Primer elemento while(c!='*'){ Mientras no el centinela if(c==buscado){ Procesar elemento cont++; } Siguiente elemento cin>>c; } cout<<buscado<<"aparece" <<cont <<"veces.";
Fundamentosdelaprogramacin:TiposeinstruccionesII Pgina 361

Suma de los nmeros de la secuencia


Centinela: 0

suma2.cpp

LuisHernndezYez

intsumaSecuencia(){ doubled,suma=0; ifstreamarchivo;//Archivodeentrada(lectura) archivo.open("datos.txt"); if (archivo.is_open()){ archivo>>d;//Obtenerelprimero while(d!=0){//Mientrasnoseaelcentinela suma=suma+d; //Procesareldato archivo>>d;//Obtenerelsiguiente } archivo.close(); } return suma; }
Fundamentosdelaprogramacin:TiposeinstruccionesII Pgina 362

LuisHernndezYez

Fundamentosdelaprogramacin:TiposeinstruccionesII

Pgina 363

sumatorio.cpp

Recurrencia:

ei+1 = ei + 1

e1 = 1

12345678... Suma de los nmeros de la secuencia calculada:


intmain(){ intnum; cout<<"N="; cin>>num; cout<<"Sumatorio:" <<suma(num); return 0; } longlong intsuma(intn){ intsumatorio=0; for(int i=1;i<=n;i++){ sumatorio=sumatorio+i; } return sumatorio; ltimo elemento de la secuencia: n }
Fundamentosdelaprogramacin:TiposeinstruccionesII Pgina 364

LuisHernndezYez

longlong intsuma(intn){ intsumatorio=0; for(int i=1;i<=n;i++){ sumatorio=sumatorio+i; } ...

sumatorio=0; int i=1;

n sumatorio i

5 ? 15 10 1 0 3 6

i<=n
2 5 4 1 3 6 24 1 3 4 5 13 2 3 12 2 11

false

true
sumatorio+=i; i=i+1;

LuisHernndezYez

Secuencia

Fundamentosdelaprogramacin:TiposeinstruccionesII

Pgina 365

Definicin
Fi = Fi1 + Fi2 F1 = 0 F2 = 1 01123581321345589...

Fin de la secuencia?
Primer nmero de Fibonacci mayor que un nmero dado Ese nmero de Fibonacci acta como centinela Si num es 50, la secuencia ser: 0112358132134

LuisHernndezYez

Fundamentosdelaprogramacin:TiposeinstruccionesII

Pgina 366

fibonacci.cpp

Recorrido de la secuencia calculada


int num,fib,fibMenos2=0,fibMenos1=1;//1y2 fib =fibMenos2+fibMenos1;//Calculamoseltercero cout<<"Hasta:"; cin>>num; if (num >=1){//Hadeserenteropositivo cout<<"01";//Losdosprimerosson<=num while(fib <=num){//Mientrasnomayorquenum cout<<fib <<""; fibMenos2=fibMenos1;//Actualizamosanteriores fibMenos1=fib;//paraobtener... fib =fibMenos2+fibMenos1;//...elsiguiente } }
Demasiados comentarios? Para no oscurecer el cdigo, mejor una explicacin al principio
Fundamentosdelaprogramacin:TiposeinstruccionesII Pgina 367

LuisHernndezYez

El bucle calcula adecuadamente la secuencia:


while(fib <=num){ cout<<fib<<""; fibMenos2=fibMenos1; fibMenos1=fib; fib =fibMenos2+fibMenos1; }
num 100 ? fib
LuisHernndezYez

01 1 2 3 5 ...

5 2 3 1 ? 3 1 2 ? 2 1 0 ?

fibMenos1 fibMenos2

Fundamentosdelaprogramacin:TiposeinstruccionesII

Pgina 368

LuisHernndezYez

Fundamentosdelaprogramacin:TiposeinstruccionesII

Pgina 369

Localizacin del primer elemento con una propiedad


Inicializacin Mientras no se encuentre el elemento y no se est al final de la secuencia: Obtener el siguiente elemento Comprobar si el elemento satisface la condicin Finalizacin (tratar el elemento encontrado o indicar que no se ha encontrado) Elemento que se busca: satisfar una condicin Dos condiciones de terminacin del bucle: se encuentra / al final Variable lgica que indique si se ha encontrado

LuisHernndezYez

Fundamentosdelaprogramacin:TiposeinstruccionesII

Pgina 370

Localizacin del primer elemento con una propiedad


Inicializacin / encontrado=false; true

Al final o encontrado?

false

Obtener elemento Encontrado?


LuisHernndezYez

Finalizacin

Fundamentosdelaprogramacin:TiposeinstruccionesII

Pgina 371

Implementacin con while


Inicializacin Obtener el primer elemento Mientras ni encontrado ni el centinela: Obtener el siguiente elemento Finalizacin (encontrado?)
Inicializacin Obtener 1

Encontrado o centinela?

true

false
Obtener siguiente

LuisHernndezYez

Finalizacin

Fundamentosdelaprogramacin:TiposeinstruccionesII

Pgina 372

Primer nmero mayor que uno dado


Centinela: 1

busca.cpp

LuisHernndezYez

doubled,num; boolencontrado=false; cout<<"Encontrarprimeromayorque:"; cin>>num; cout<<"Siguiente(1paraterminar):"; cin>>d; //Obtenerelprimerelemento while((d!=1)&&!encontrado){ //Mientrasnoseaelcentinelaynoseencuentre if(d>num){ //Encontrado? encontrado=true; } else{ cout<<"Siguiente(1paraterminar):"; cin>>d; //Obtenerelsiguienteelemento } }
Fundamentosdelaprogramacin:TiposeinstruccionesII Pgina 373

LuisHernndezYez

Fundamentosdelaprogramacin:TiposeinstruccionesII

Pgina 374

Colecciones homogneas
Un mismo tipo de dato para varios elementos: Notas de los estudiantes de una clase Ventas de cada da de la semana Temperaturas de cada da del mes ... En lugar de declarar N variables...
vLun 125.40
LuisHernndezYez

vMar 76.95

vMie 328.80

vJue 254.62

vVie 435.00

vSab 164.29

vDom 0.00

... declaramos una tabla de N valores:


ventas 125.40 ndices 0
76.95 1 328.80 254.62 435.00 164.29 2 3 4 5 0.00 6

Fundamentosdelaprogramacin:TiposeinstruccionesII

Pgina 375

Estructura secuencial
Cada elemento se encuentra en una posicin (ndice): Los ndices son enteros positivos El ndice del primer elemento siempre es 0 Los ndices se incrementan de uno en uno
ventas 125.40
0 76.95 1 328.80 254.62 435.00 164.29 2 3 4 5 0.00 6

LuisHernndezYez

Acceso directo A cada elemento se accede a travs de su ndice: ventas[4] accede al 5 elemento (contiene el valor 435.00)
cout<<ventas[4]; ventas[4]=442.75;
Datos de un mismo tipo base: Se usan como cualquier variable
Pgina 376

Fundamentosdelaprogramacin:TiposeinstruccionesII

Declaracin de tipos de arrays


typedef tipo_base nombre_tipo[tamao]; Ejemplos:
typedef typedef typedef typedef typedef double tTemp[7]; shortint tDiasMes[12]; char tVocales[5]; double tVentas[31]; tMoneda tCalderilla[15];//EnumeradotMoneda
Recuerda: Adoptamos el convenio de comenzar los nombres de tipo con una t minscula, seguida de una o varias palabras, cada una con su inicial en mayscula

LuisHernndezYez

Fundamentosdelaprogramacin:TiposeinstruccionesII

Pgina 377

Declaracin de variables arrays


tipo nombre; Ejemplos:
tTemp tempMax; tDiasMes diasMes; tVocales vocales; tVentas ventasFeb;

typedef typedef typedef typedef

double tTemp[7]; shortint tDiasMes[12]; char tVocales[5]; double tVentas[31];

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

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

vocales ? ? ? ? ?
0 1 2 3 ... 4

LuisHernndezYez

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

?
30

NO se inicializan los elementos automticamente


Fundamentosdelaprogramacin:TiposeinstruccionesII Pgina 378

LuisHernndezYez

Fundamentosdelaprogramacin:TiposeinstruccionesII

Pgina 379

nombre[ndice] Cada elemento se accede a travs de su ndice (posicin en el array)


tVocales vocales;
vocales 'a'
0

typedef char tVocales[5];

'e'
1

'i'
2

'o'
3

'u'
4

5 elementos, ndices de 0 a 4:
vocales[0]vocales[1]vocales[2]vocales[3]vocales[4]

Procesamiento de cada elemento: Como cualquier otra variable del tipo base
cout<<vocales[4];
LuisHernndezYez

vocales[3]='o'; if(vocales[i]=='e')...

Fundamentosdelaprogramacin:TiposeinstruccionesII

Pgina 380

IMPORTANTE! No se comprueba si el ndice es correcto! Es responsabilidad del programador!


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

ndices vlidos: enteros entre 0 y Dim1


ventas[0]ventas[1]ventas[2]...ventas[98]ventas[99]

LuisHernndezYez

Qu es ventas[100]? O ventas[1]? O ventas[132]? Memoria de alguna otra variable del programa!


Define los tamaos de los arrays con constantes
Fundamentosdelaprogramacin:TiposeinstruccionesII Pgina 381

LuisHernndezYez

Fundamentosdelaprogramacin:TiposeinstruccionesII

Pgina 382

Arrays: tamao fijo Bucle de recorrido fijo (for) Ejemplo: Media de un array de temperaturas
const int Dias =7; typedef double tTemp[Dias]; tTemp temp; double media,total=0; ... for(int i=0;i<Dias;i++){ total=total+temp[i]; } media=total/Dias;
LuisHernndezYez

Fundamentosdelaprogramacin:TiposeinstruccionesII

Pgina 383

12.40 0

10.96 1

8.43 2

11.65 3

13.70 4

13.41 5

14.07 6

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


i=0

Memoria Dias temp[0] temp[1] temp[2] temp[3] temp[4] 7 12.40 10.96 8.43 11.65 13.70 13.41 14.07 ? 23.36 31.79 84.62 12.40 0.00 43.44 3 0 2 7 4 1

true i<Dias
total+=temp[i]

false

temp[5] temp[6]

...

media total i

LuisHernndezYez

i++

Fundamentosdelaprogramacin:TiposeinstruccionesII

Pgina 384

mediatemp.cpp #include<iostream> usingnamespacestd; const int Dias =7; typedef double tTemp[Dias]; double media(const tTemp temp); int main(){ tTemp temp; for (int i=0;i<Dias;i++){//Recorridodelarray cout<<"Temperaturadelda"<<i+1<<":"; cin>>temp[i]; } cout<<"Temperaturamedia:"<<media(temp)<<endl; return0; } Los usuarios usan de 1 a 7 para numerar los das ... La interfaz debe aproximarse a los usuarios, aunque internamente se usen los ndices de 0 a 6
Fundamentosdelaprogramacin:TiposeinstruccionesII Pgina 385

LuisHernndezYez

double media(consttTemp temp){ double med,total=0; for (int i=0;i<Dias;i++){//Recorridodelarray total=total+temp[i]; } med =total/Dias; returnmed; }

Los arrays se pasan a las funciones como constantes


LuisHernndezYez

Las funciones no pueden devolver arrays

Fundamentosdelaprogramacin:TiposeinstruccionesII

Pgina 386

constint Cuantas=15; typedefenum {centimo,dos_centimos,cinco_centimos, diez_centimos,veinte_centimos,medio_euro,euro }tMoneda; typedef tMoneda tCalderilla[Cuantas]; string aCadena(tMoneda moneda); //Devuelvelacadenacorrespondientealvalordemoneda tCalderilla bolsillo;//ExactamentellevoCuantasmonedas bolsillo[0]=euro; bolsillo[1]=cinco_centimos; bolsillo[2]=medio_euro; bolsillo[3]=euro; bolsillo[4]=centimo; ... for(int moneda=0;moneda<Cuantas;moneda++) cout<<aCadena(bolsillo[moneda])<<endl;

LuisHernndezYez

Fundamentosdelaprogramacin:TiposeinstruccionesII

Pgina 387

LuisHernndezYez

Fundamentosdelaprogramacin:TiposeinstruccionesII

Pgina 388

buscaarray.cpp

Qu da las ventas superaron los 1.000 ?


constint Dias =365;//Aonobisiesto typedef doubletVentas[Dias]; int busca(const tVentas ventas){ //ndicedelprimerelementomayorque1000(1sinohay) bool encontrado=false; int ind =0; while ((ind <Dias)&&!encontrado){//Esquemadebsqueda if (ventas[ind]>1000){ encontrado=true; } else { ind++; } } if (!encontrado){ ind =1; } returnind; }
Fundamentosdelaprogramacin:TiposeinstruccionesII Pgina 389

LuisHernndezYez

LuisHernndezYez

Fundamentosdelaprogramacin:TiposeinstruccionesII

Pgina 390

La capacidad de un array no puede ser alterada en la ejecucin El tamao de un array es una decisin de diseo: En ocasiones ser fcil (das de la semana) Cuando pueda variar ha de estimarse un tamao Ni corto ni con mucho desperdicio (posiciones sin usar) STL (Standard Template Library) de C++: Colecciones ms eficientes cuyo tamao puede variar

LuisHernndezYez

Fundamentosdelaprogramacin:TiposeinstruccionesII

Pgina 391

No se pueden copiar dos arrays (del mismo tipo) con asignacin: array2=array1;//NOCOPIALOSELEMENTOS!!! Han de copiarse los elementos uno a uno: for(int i=0;i<N;i++){ array2[i]=array1[i]; }

LuisHernndezYez

Fundamentosdelaprogramacin:TiposeinstruccionesII

Pgina 392

LuisHernndezYez

Fundamentosdelaprogramacin:TiposeinstruccionesII

Pgina 393

Puede que no necesitemos todas las posiciones de un array... La dimensin del array ser el mximo de elementos Pero podremos tener menos elementos del mximo Necesitamos un contador de elementos...
constint Max=100; typedef doubletArray[Max]; tArray lista; int contador=0;

LuisHernndezYez

contador: indica cuntas posiciones del array se utilizan Slo accederemos a las posiciones entre 0 y contador1 Las dems posiciones no contienen informacin del programa

Fundamentosdelaprogramacin:TiposeinstruccionesII

Pgina 394

lista.cpp #include<iostream> usingnamespacestd; #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; }...
Fundamentosdelaprogramacin:TiposeinstruccionesII Pgina 395

LuisHernndezYez

archivo.close(); med =media(lista,contador); cout<<"Mediadeloselementosdelalista:"<<med <<endl; } else { cout<<"Nosepudoabrirelarchivo!" <<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; Slo recorremos hasta cont1 return med; }

LuisHernndezYez

Fundamentosdelaprogramacin:TiposeinstruccionesII

Pgina 396

Licencia CC (Creative Commons)


Este tipo de licencias ofrecen algunos derechos a terceras personas bajo ciertas condiciones. Este documento tiene establecidas las siguientes:
Reconocimiento (Attribution): En cualquier explotacin de la obra autorizada por la licencia har falta reconocer la autora. No comercial (Non commercial): La explotacin de la obra queda limitada a usos no comerciales. Compartir igual (Share alike): La explotacin autorizada incluye la creacin de obras derivadas siempre que mantengan la misma licencia al ser divulgadas.

LuisHernndezYez

Pulsa en la imagen de arriba a la derecha para saber ms.


Fundamentosdelaprogramacin:TiposeinstruccionesII Pgina 397

Вам также может понравиться