51
Tema 5 Sentencias de control de flujo Fundamentos de Informática

Tema 5 Sentencias de Control

Embed Size (px)

Citation preview

  • 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