tema 5 sentencias de control
TRANSCRIPT
-
Tema5Sentenciasdecontroldeflujo
FundamentosdeInformtica
-
2DepartamentodeSistemasInformticosEscuelaTcnicaSuperiordeIngenieraICAISentenciasdecontroldeflujo
SentenciasdeControl
Tiposdesentenciasdecontrol: Comprobacinlgicaparabifurcarelflujodeunprograma.
Sentenciasdecontrolcondicionaloalternativo
ComprobacinlgicapararepetirunconjuntodeinstruccionesSentenciasdecontrol repetitivo
-
3DepartamentodeSistemasInformticosEscuelaTcnicaSuperiordeIngenieraICAISentenciasdecontroldeflujo
SentenciasdeControl Paracdigoalternativo
Sentenciaifelse Sentenciaswitch
Paracdigorepetivo Buclefor Buclewhile Bucledowhile
-
1Sentenciaifelse
-
5DepartamentodeSistemasInformticosEscuelaTcnicaSuperiordeIngenieraICAISentenciasdecontroldeflujo
Sentenciaif...else Realizaunacomprobacinlgicay
dirigeelflujodelprogramaenfuncindelresultadoobtenidoendichacomprobacin.
Condicinverdadera: Ejecutalaramacorrespondientealif.
Condicinfalsa: Ejecutalaramacorrespondientealelse.
Formatogeneral:
if (condicin) {Accion1;
} else {Accion2;
}
CONDICION
ACCION1
CIERTO
FALSO
Programa
Continua el programa
ACCION2
Donde Accion1 y Accion2 pueden ser tanto sentencias simples como sentencias compuestas.
-
6DepartamentodeSistemasInformticosEscuelaTcnicaSuperiordeIngenieraICAISentenciasdecontroldeflujo
Sentenciaif...else
Laclusulaelseesopcionaly,portanto,otraconstruccinvlidaes:
if (condicin) {Accion;
}DondeACCIONpuede
ejecutarseuomitirse.
CONDICION
ACCION
CIERTO
FALSO
Programa
Continua el programa
-
7DepartamentodeSistemasInformticosEscuelaTcnicaSuperiordeIngenieraICAISentenciasdecontroldeflujo
Ejemplos/* Programa que evita realizar una divisin por cero */
#include
int main(void){
int a;int b;
printf(Introduzca un numero: );scanf(%d, &a);printf(Introduzca otro numero: );scanf(%d, &b);
if (b != 0) {printf(%d\n, a/b);
} else {printf(No se puede dividir por cero\n);
}return(0);
}
-
8DepartamentodeSistemasInformticosEscuelaTcnicaSuperiordeIngenieraICAISentenciasdecontroldeflujo
Ejemplos
Instruccin simple o compuesta:#include
int main(void){
int a;int b;int res; //resultado
printf(Introduzca un numero: );scanf(%d, &a);printf(Introduzca otro numero: );scanf(%d, &b);
if (b != 0) {res=a/b;printf(El resultado es %d\n, res);
} else printf(No se puede dividir por cero\n);
return(0);}
-
9DepartamentodeSistemasInformticosEscuelaTcnicaSuperiordeIngenieraICAISentenciasdecontroldeflujo
Ejemplos
Comentarios sobre claridad de cdigo#include
int main(void){
int a;int b;
printf(Introduzca dos nmeros: );scanf(%d%d, &a, &b);
if (b) printf(%d\n, a/b);
else printf(no se puede dividir por cero\n);
return(0);}
Confuso para el usuarioConfuso para el programador
Es peligroso omitir las llaves
-
10DepartamentodeSistemasInformticosEscuelaTcnicaSuperiordeIngenieraICAISentenciasdecontroldeflujo
Sentenciaif...else:Anidamiento
Consisteenincluirsentenciasif..elsecomosentenciasaejecutardentrodeunif..else.
Laideasebasaenhacerqueciertascondicionessloseancomprobadasenfuncindelosresultadoslgicosdeotrascondiciones
Ejemplo: Sepideimplementarunprogramadondeselepidaalusuariosihahechoelserviciomilitaronoy,encasodenohaberlohecho,sisuedadessuperiora30aos,elprogramadeber informarledequeyanodebepreocuparseporlamili,mientrasquesisuedadesmenoroiguala30,elprogramadeber informarlequeseprepareparahacerloalaosiguiente
-
11DepartamentodeSistemasInformticosEscuelaTcnicaSuperiordeIngenieraICAISentenciasdecontroldeflujo
Sentenciaif...else:Anidamiento Qu elsesecorrespondeconqu if?
Elelseseasociaalifmsprximoquenotengaunelseasociadoal.
Siquierocambiarelordennaturaldelosifelseanidadosdeboutilizarlasllaves
LOMEJOR:USARSIEMPRELASLLAVESYAS NOHAYDUDA
if (x)if (y)printf(1);else printf(2);
if (x != 0) {if (y != 0){
printf(1);} else {
printf(2);}
}
Ambos cdigos son equivalentes
Mejor esta
versin
-
12DepartamentodeSistemasInformticosEscuelaTcnicaSuperiordeIngenieraICAISentenciasdecontroldeflujo
Sentenciaif...else:Anidamiento Existenmltiplesformasdeanidarif...else:
Dependedelosrequerimientosdelprograma Fundamentaltenerunaideaclarabienplasmadamedianteeldiagramadeflujo
if (expresin1){ACCION1;
} else {if (expresin2) {
ACCION2;} else {
if (expresin3) {ACCION3;
} else {ACCION4;
}}
}
if-else-if compacto
if (expresin1){ACCION1;} else if (expresin2) {ACCION2;} else if (expresin3) {ACCION3;} else {ACCION4;}
-
2switchcase
-
14DepartamentodeSistemasInformticosEscuelaTcnicaSuperiordeIngenieraICAISentenciasdecontroldeflujo
Sentenciaswitch
expresin selector
expresin 1 expresin 2 expresin 3 default
T1 T2 T3 T4
Control de Salida
Control de Entrada
-
15DepartamentodeSistemasInformticosEscuelaTcnicaSuperiordeIngenieraICAISentenciasdecontroldeflujo
#include int main(void) /* Programa que cambia de base un nmero */{
int opcion;int valor;
printf( Transformar:\n);printf( 1: decimal en hexadecimal\n);printf( 2: hexadecimal en decimal\n);printf( 3: decimal en octal\n);printf(escriba su opcin:\n);scanf(%d, &opcion);
if (opcion == 1) {printf(Introduzca un valor en decimal: );scanf(%d, &valor);printf(%d en hexadecimal es %x,valor, valor);
} else {if (opcion == 2) {
printf(Introduzca un valor en hexadecimal: );scanf(%x, &valor);printf(%x en decimal es %d,valor, valor);
} else {if (opcion == 3) {
printf(Introduzca un valor en decimal: );scanf(%d, &valor);printf(%d en octal es %o,valor, valor);
} else {printf(Opcion no valida );
}}
}}
Versi
n IF
-
16DepartamentodeSistemasInformticosEscuelaTcnicaSuperiordeIngenieraICAISentenciasdecontroldeflujo
Sentenciaswitch Realizaunapruebamltipleequivalenteaanidarvariosif...else.
Muytilpararealizarmens Seleccionaungrupodeinstruccionesentreunconjuntodisponible Laexpresin condicindelswitchdebedevolverunvalorentero(untipocharestambinenterodebidoasucdigoASCII)
Formato:switch (expresin) {
case expresin1: secuencia de sentencias;break;
case expresin2: secuencia de sentencias;break;
case expresin3: secuencia de sentencias;break;
.................default: secuencia de sentencias;
}
-
17DepartamentodeSistemasInformticosEscuelaTcnicaSuperiordeIngenieraICAISentenciasdecontroldeflujo
Sentenciaswitch
Laexpresinevaluadadeber devolverunvalorordinal.Estoincluyecomovlidasexpresionesdondeaparezcandatosdetipochar.
Sielvalordelaexpresincoincideconlaexpresindeunadelasopcionesdeuncase seejecutanlassentenciasasociadashastallegaraldelimitadorbreak.
Sinoseencuentraningunacoincidenciaseejecutar lasentenciaasociadaadefault.Elusodedefault noesobligatorio,peroesunabuenaprcticaponerlosiempre
Nosepuedehaberdoscase conelmismovalor. Lainstruccinbreak hacequesetransfieraelcontrolfueradela
instruccinswitch,evitandoqueseejecutemsdeungrupodesentencias.
Usonecesarioperosintcticamenteopcional Siseomite,elswitch continuaevaluandolossiguientescasoshastaencontrarunbreak ollegaralfinaldelswitch.
-
18DepartamentodeSistemasInformticosEscuelaTcnicaSuperiordeIngenieraICAISentenciasdecontroldeflujo
Ejemplos
eleccion = getchar();switch (eleccion) {
case R: printf(Rojo);break;
case B: printf(Blanco);break;
case A: printf(Azul);break;
default: printf(Error);
}
scanf(%d, &indicador);switch ( indicador) {
case -1: y = fabs(x);break;
case 0: y = sqrt(x);break;
case 1: y = x;break;
case 2:case 3: y = (x-1);
break;
default: y = 0;
}
-
19DepartamentodeSistemasInformticosEscuelaTcnicaSuperiordeIngenieraICAISentenciasdecontroldeflujo
#include int main(void) /* Programa que cambia de base un nmero */{
int opcion;int valor;printf( Transformar:\n);printf( 1: decimal en hexadecimal\n);printf( 2: hexadecimal en decimal\n);printf( 3: decimal en octal\n);printf(escriba su opcion:\n);scanf(%d, &opcion);switch (opcion) {
case 1: printf(Introduzca un valor en decimal: );scanf(%d, &valor);printf(%d en hexadecimal es %x,valor, valor);break;
case 2: printf(Introduzca un valor en hexadecimal: ); scanf(%x, &valor);printf(%x en decimal es %d,valor, valor);break;
case 3: printf(Introduzca un valor en decimal: );scanf(%d, &valor);printf(%d en octal es %o,valor, valor);break;
default: printf(Esa opcion no es correcta.);printf(Vuelva a intentarlo\n);
}}
Versi
n SW
ITCH
-
3Buclefor
-
21DepartamentodeSistemasInformticosEscuelaTcnicaSuperiordeIngenieraICAISentenciasdecontroldeflujo
Sentenciafor Sirvepararepetirunbloquedesentenciasenfuncindeunadeterminadacondicin:
Formato:
for (inicializacin;condicin;modificacin){ACCION;
}
Donde ACCION puede ser una sentencia simple o compuesta.
-
22DepartamentodeSistemasInformticosEscuelaTcnicaSuperiordeIngenieraICAISentenciasdecontroldeflujo
Sentenciafor Inicializacin: sentencia de asignacin que fija la variable decontroldelbucledndoleunvalorinicial.
Condicin: expresin relacional que mientras sea cierta, sesiguerealizandoelbucle.
Modificacin: determina la forma en que va a cambiar lavariabledecontroldelbucle.
Inicializacin, condicin ymodificacin deben ir separadas conunpuntoycoma.
Elbucleseguir ejecutndosemientrasseaciertalacondicin. El bucle for es particularmente adecuado cuando se conozcaantesdeempezarelnmeroderepeticiones.
-
23DepartamentodeSistemasInformticosEscuelaTcnicaSuperiordeIngenieraICAISentenciasdecontroldeflujo
Sentenciafor
(Antonakos,97)
-
24DepartamentodeSistemasInformticosEscuelaTcnicaSuperiordeIngenieraICAISentenciasdecontroldeflujo
EjemplosEjemplo 1: /* Imprime los ns de 1 a 100 */#include
int main(void)
{
int x;
for(x=1; x1; x--) {
printf(%d, x);
}
}
//Mejor empezar en 0
for(x=0; x
-
25DepartamentodeSistemasInformticosEscuelaTcnicaSuperiordeIngenieraICAISentenciasdecontroldeflujo
Ejemplos Se puede modificar la variable de control del bucle como se desee.
Ejemplo 3: /*Imprime los ns de 1 hasta 96 de 5 en 5*/#include int main(void){
int x;for (x =1; x
-
26DepartamentodeSistemasInformticosEscuelaTcnicaSuperiordeIngenieraICAISentenciasdecontroldeflujo
EjemplosEjemplo 5:#include int main(void) /* Calcular la media de n nmeros*/{
int n;int cont;float x;float media;float suma;
/* Valores iniciales */suma = 0;
printf( Cuantos nmeros va a introducir? );scanf(%d, &n);
for (cont=1; cont
-
27DepartamentodeSistemasInformticosEscuelaTcnicaSuperiordeIngenieraICAISentenciasdecontroldeflujo
Sentenciafor:Variaciones
Esposibleutilizardosomsvariablesdecontrolenelbucle. Seutilizancomasparaseparardentrodelassentenciasde
inicializaciny/odemodificacinlasdistintasvariables.LacomaesenrealidadunoperadordeCypermitequeaparezcandosexpresionesdondenormalmentesloseutilizauna.
/* Imprimir los ns de 0 a 98 de 2 en 2*/
#include int main(void)
{
int x;
int y;
for (x = 0, y = 0; x+y
-
28DepartamentodeSistemasInformticosEscuelaTcnicaSuperiordeIngenieraICAISentenciasdecontroldeflujo
EjemplosPueden existir varias condiciones de terminacin
Ejemplo 6:#include /* Ayuda para aprender a sumar */int main (void){
int i;int j;int respuesta;char hecho;
/* Valores iniciales */hecho = S;
for (i=1; i
-
29DepartamentodeSistemasInformticosEscuelaTcnicaSuperiordeIngenieraICAISentenciasdecontroldeflujo
EjemplosSintcticamente,noesnecesarioqueestnpresentes lastrespartesdelbuclefor,pero
lospuntosycomasdebenaparecer
Ejemplo 7:#include
int main(void) /* Bucle que concluye cuando se introduce */
{ /* el nmero 10 */
int x;
for(x =0; x !=10; ) {
scanf(%d, &x);
}
}
Ejemplo 8: Bucle infinito#include
int main(void)
{
for ( ; ; ) {
printf(Se ejecutar indefinidamente.\n);
}
}
-
30DepartamentodeSistemasInformticosEscuelaTcnicaSuperiordeIngenieraICAISentenciasdecontroldeflujo
EjemplosEjemplo 9: /* Escribe del 0 al 9 cada uno en una lnea */#include
int main(void) /*Visualizar nmeros versin1*/{
int digito;
for (digito=0; digito
-
4Buclewhile
-
32DepartamentodeSistemasInformticosEscuelaTcnicaSuperiordeIngenieraICAISentenciasdecontroldeflujo
Sentenciawhile Suformatogenerales:
while (condicin){ACCION;
}
Elbucleseguir repitindosemientraslacondicin seacierta. Laaccinpuedeserunasentenciavaca,unasolasentenciaoungrupodesentencias(sentenciacompuesta).
Conelfindesalirdelbucleesnecesario incluirenestealgunasentenciaquealterelacondicinencadaunadelasiteracionesdelbucle.
Igualqueelbucle for,enelbuclewhile lacomprobacinde lacondicinsehaceen lapartesuperiordelbucle.Por tanto,enalgunoscasoselbuclepuedenoejecutarsenisiquieraunavez.
-
33DepartamentodeSistemasInformticosEscuelaTcnicaSuperiordeIngenieraICAISentenciasdecontroldeflujo
Sentenciawhile
(Antonakos,97)
-
34DepartamentodeSistemasInformticosEscuelaTcnicaSuperiordeIngenieraICAISentenciasdecontroldeflujo
EjemplosEjemplo 1:#include /* Visualizar los nmeros de 0 a 100 */
int main(void)
{
int digito;
digito = 0; /* Valor inicial */
while (digito
-
35DepartamentodeSistemasInformticosEscuelaTcnicaSuperiordeIngenieraICAISentenciasdecontroldeflujo
Ejemplos
Ejemplo 3:#include /* Solicitar un nmero positivo */
int main(void)
{
int digito;
printf(Introduzca un numero positivo (mayor que 0): );
scanf(%d, &digito);
while (digito < 1) {
printf(\nEl digito a introducir debe ser positivo: );
scanf(%d, &digito);
}
printf(El digito positivo es %d, digito);
}
-
5Bucledowhile
-
37DepartamentodeSistemasInformticosEscuelaTcnicaSuperiordeIngenieraICAISentenciasdecontroldeflujo
Sentenciado...while Suformatogenerales:
do {ACCION;
}while (condicin);
y La comprobacin de la condicin se realiza al final de cadapasadadelbucle.
y Elbucledo...while seejecutasiemprealmenosunavez.y Laaccindelbuclepuedesersimpleocompuesta.y Hayqueincluirunelementoparaalterarlacondicindelbucle.
-
38DepartamentodeSistemasInformticosEscuelaTcnicaSuperiordeIngenieraICAISentenciasdecontroldeflujo
Sentenciado...while
(Antonakos,97)
-
39DepartamentodeSistemasInformticosEscuelaTcnicaSuperiordeIngenieraICAISentenciasdecontroldeflujo
Ejemplos
Ejemplo 1:#include
int main(void) /* Control de la accin pulsada */
{
int opcion;
do {
printf(Transformar:\n);
printf(1: decimal en hexadecimal\n);
printf(2: hexadecimal en decimal\n);
printf(3: decimal en octal\n);
printf(4: octal en decimal\n);
printf(escriba su opcin:\n);
scanf(%d, &opcion);
} while (opcion4);
}
-
40DepartamentodeSistemasInformticosEscuelaTcnicaSuperiordeIngenieraICAISentenciasdecontroldeflujo
EjemplosEjemplo 2:
#include /* Solicitar un nmero positivo */
int main(void)
{
int digito;
do {
printf("\nIntroduzca un numero positivo: ");
scanf("%d", &digito);
} while (digito < 1);
printf("El digito positivo es %d", digito);
}
-
6Resume
-
42DepartamentodeSistemasInformticosEscuelaTcnicaSuperiordeIngenieraICAISentenciasdecontroldeflujo
Qu sentenciadecontrolutilizar? switch
escasiexclusivoparamens if,ifelse:
permiteejecutaronoseccionesdecdigo Nuncavalepararepetircdigo
Buclefor: Repiteunaseccindecdigounnmerodevecespredeterminado
while,dowhile Repitenunaseccindecdigo. Elnmeroderepeticionesnoesconocidoapriori Lasvariablesdelacondicinsedebenmodificardentrodelbucle
-
7Anexo
-
44DepartamentodeSistemasInformticosEscuelaTcnicaSuperiordeIngenieraICAISentenciasdecontroldeflujo
Buclesanidados/* Programa que muestra una tabla de las cuatro primeras
potencias de los ns del 1 al 9 */
#include
int main(void)
{
int i;
int j;
int k;
int temp;
printf( i i^2 i^3 i^4\n);
for (i = 1; i < 10; i++) {
for ( j = 1; j
-
45DepartamentodeSistemasInformticosEscuelaTcnicaSuperiordeIngenieraICAISentenciasdecontroldeflujo
Instruccinbreak Fuerza la salida del bucle en el que se encuentra El control, una vez ejecutado el break, se transfiere a la
sentencia que siga al bucle. EN ESTE CURSO NO SE DEBE utilizar el break dentro
de un bucle.
#include
int main(void)
{
int t;
for ( t = 0; t< 100; t++) {
printf(%d, t);
if (t == 10) {
break;
}
}
}
SE DEBE HACER:#include
int main(void)
{
int t;
for ( t = 0; t
-
46DepartamentodeSistemasInformticosEscuelaTcnicaSuperiordeIngenieraICAISentenciasdecontroldeflujo
Instruccinbreak/* Este bucle termina cuando
detecta un valor negativo */
#include
int main(void)
{
float x;
scanf(%f, &x);
while (x
-
47DepartamentodeSistemasInformticosEscuelaTcnicaSuperiordeIngenieraICAISentenciasdecontroldeflujo
Instruccinbreak Sisonbuclesanidados,lasentenciabreak dalugaralasalidadelbuclemsinterno.
#include
int main(void)
{ Ejercicio:int t; Cmo se debera hacer sin usar break?int contador;
for (t = 0; t< 100; t++) {
contador = 1;
for ( ; ; ) {
printf(%d, contador);
contador++;
if ( contador == 10) {
break;
}
}
}
}
-
48DepartamentodeSistemasInformticosEscuelaTcnicaSuperiordeIngenieraICAISentenciasdecontroldeflujo
Instruccinbreak:Ejemplo
/* Bucle que finaliza cuando encuentra un carcter A*/
#include
int main(void)
{
char x;
for ( ; ; ) {
x = getchar(); /*se lee un carcter*/
if (x == A) {
break; /*se sale del bucle*/
}
}
printf(Ha escrito una A);
}
-
49DepartamentodeSistemasInformticosEscuelaTcnicaSuperiordeIngenieraICAISentenciasdecontroldeflujo
Instruccincontinue Obligaaquetengalugarlasiguienteiteracindelbucle.
Ignoratodoloquevieneacontinuacindeldentrodelbucle Bucleswhileydo...while:
Elcontrolpasadirectamentealacomprobacin Buclefor:
Primeroseincrementayluegosepasaalacomprobacin MEJOREVITARLA,utilizarelcondicionalif
/* Programa que solo muestra los nm. pares */#include int main(void) {
int x;
for (x = 0; x< 100; x++) {if ((x%2)!= 0) {
continue;}printf(%d , x);
}}
#include int main(void){
int x; /* SIN USAR CONTINUE */for (x = 0; x< 100; x++) {
if ((x%2)== 0) {printf(%d , x);
}}
}
-
50DepartamentodeSistemasInformticosEscuelaTcnicaSuperiordeIngenieraICAISentenciasdecontroldeflujo
Ejemplos
#include
int main (void)
{
float x;
do {
scanf(%f, &x);
if (x < 0) {
printf(Error: Valor negativo de x);
continue;
}
/* Procesar el valor no negativo de x */
.....
} while (x 0) {
/*Procesar valor no neg */
.....
}
} while (x
-
EscuelaTcnicaSuperiordeIngenieraICAIAlbertoAguilera2528015MadridTel+34915422800Fax+34915423176Iwww.icai.upcomillas.es
www.upcomillas.es