Está en la página 1de 7

31/1/2017

ProgramacinenCCaptulo4

CAPITULO4:PROPOSICIONESPARAELCONTROLDEFLUJO
DEPROGRAMA

1.INTRODUCCION
Enloquesiguedeestecaptulo,denominaremosBLOQUEDESENTENCIASalconjuntode
sentenciasindividualesincludasdentrounpardellaves.Porejemplo:
{
sentencia1
sentencia2
.............
sentencian
}
Esteconjuntosecomportarsintacticamentecomounasentenciasimpleylallavedecierredel
bloqueNOdebeirseguidadepuntoycoma.
Unejemplodebloqueyavisto,eselcuerpodelprogramaprincipaldelafuncinmain().
main()
{
bloquedesentencias
}
Enlasproposicionesdecontroldeflujodeprograma,trabajaremosalternativamenteconsentencias
simplesybloquesdeellas.
2.PROPOSICIONIFELSE
Estaproposicinsirveparaejecutarciertassentenciasdeprograma,siunaexpresinresulta
CIERTAotrogrupodesentencias,siaquellaresultaFALSA.Suinterpretacinliteralsera:SIes
CIERTAtalcosa,hagatalotra,sinoloessaltela.
Elcasomssencillosera:
if(expresin)
sentencia

if(expresin)sentencia
CuandolasentenciaquesiguealIFesnica,lasdosformasdeescrituraexpresadasarribason
equivalentes.Lasentenciasloseejecutarsielresultadode"expresin"esdistintodecero
(CIERTO),encasocontrarioelprogramasalteardichasentencia,realizandolasiguienteensu
flujo.
Veamosunosejemplosdelasdistintasformasquepuedeadoptarla"expresin"dentrodeunIF:

http://www.pablin.com.ar/computer/cursos/c2/manc4.htm

1/7

31/1/2017

ProgramacinenCCaptulo4

if(a>b)

if((a>b)!=0)

if(a)
if(!a)

if(a!=0)
if(a==0)

if(a==b)
if(a=b)

/*Error*/

if(a)

....................

lasdosexpresionessonidnticas,aunquea
vecesresultamsclaroexpresarladelasegunda
manera,sobretodoenlosprimeroscontactoscon
ellenguaje.

Lasdossuperioressonidnticasentres,aligual
quelasdosinferioresObsrveseque(!a)darun
valorCIERTOslocuandoaseaFALSO.(ver
operadorNEGACIONenelcaptuloanterior)

Laprimeraesunaexpresincorrecta,elIFse
realizarslosiaesigualab.Encambiola
segundaesunerror,yaquenoseest
comparandoaconb,sinoASIGNANDOelvalor
deestaaaquella.Sinembargo,avecespuede
usarsecomountruco(unpocosucio)de
programacion,yaqueprimeroserealizala
asignacinyluegoseevalaelresultadodeesta
pararealizarelIF,esentoncesequivalentea
escribir:
a=b
conelahorrodeunalineadeprograma(acosta
delalegibilidaddelmismo).

Encasosmscomplejosquelosanteriores,laproposicinIFpuedeestarseguidaporunbloquede
sentencias:
if(expresion)
{
sentencia1;
sentencia2;
........
}

if(expresion){
sentencia1;
sentencia2;
........
}

Lasdosmanerassonequivalentes,porloquelaposicindelallavedeaperturadelbloquequeda
libradaalgustodelprogramador.Elindentadodelassentencias(sangra)estambinoptativo,pero
sumamenterecomendable,sobretodoparapermitirlalecturadeproposicionesmuycomplejas
anidadas,comoseverluego.ElbloqueseejecutarensuconjuntosilaexpresionresultaCIERTA.
ElusodelELSEesoptativo,ysuaplicacinresultaenlaejecucindeuna,unaseriede
sentenciasenelcasodequelaexpresindelIFresultaFALSA.
Suaplicacinpuedeverseenelejemplosiguiente:
if(expresion)
{
sentencia1;
sentencia2;
}
sentencia3;
sentencia4;
sentencia5;

http://www.pablin.com.ar/computer/cursos/c2/manc4.htm

if(expresion)
{
sentencia1;
sentencia2;
}
else
{
sentencia3;
sentencia4;
}
sentencia5;
2/7

31/1/2017

ProgramacinenCCaptulo4

sentencia6;

EnelejemplodelaizquierdanoseusaelELSEyporlotantolassentencias3,4y5seejecutan
siempre.Enelsegundocaso,lassentencias1y2seejecutansolosilaexpresinesCIERTA,en
esecasolas3y4NOseejecutarnparasaltarsedirectamenteala5,enelcasodequela
expresinresulteFALSAserealizarnlas3y4enlugardelasdosprimerasyfinalmentela5.
LaproposicinELSEquedasiempreasociadaalIFmscercano,arribadel.
Escomntambin,encasodedecisionesmltiples,elusodeanidamientosELSEIFdelaforma
indicadaabajo:
if(exp.1)
sentencia1;
elseif(exp.2)
sentencia2;
elseif(exp.3)
sentencia3;
else
sentencia5;

if(exp.1)
sentencia1;
elseif(exp.2)
sentencia2;
elseif(exp.3)
sentencia3;
else
sentencia5;

Sibinsesueleescribirsegnlamodalidaddelaizquierda,aladerechahemosexpresadolas
asociacionesentrelosdistintosELSEIFpormediodelindentadodeltexto.

3.PROPOSICIONSWITCH
ElSWITCHesunaformasencilladeevitarlargos,tediososyconfusosanidamientosdeELSEIF.
SupongamosqueestamosimplementandounMenu,convariaseleccionesposibles.Elesqueleto
deunaposiblesolucinalproblemausandoifelsepodraserelsiguiente:
#include<<stdio.h>>
main()
{
intc;
printf("\nMENU:");
printf("\nA=ADICIONARALALISTA");
printf("\nB=BORRARDELALISTA");
printf("\nO=ORDENARLALISTA");
printf("\nI=IMPRIMIRLALISTA");
printf("\n\nESCRIBASUSELECCION,YLUEGO<<ENTER>>:");
if((c=getchar())!='\n')
{
if(c=='A')
printf("\nUD.SELECCIONOAGREGAR");
else
if(c=='B')
printf("\nUD.SELECCIONOBORRAR");
else
if(c=='O')
printf("\nUD.SELECCIONOORDENAR");
else
if(c=='I')
printf("\nUD.SELECCIONOIMPRIMIR");
else
printf("\n\a\aUD.APRETOUNCARACTERILEGAL");
}
else
printf("\nUD.NOHASELECCIONADONADA!");
}

http://www.pablin.com.ar/computer/cursos/c2/manc4.htm

3/7

31/1/2017

ProgramacinenCCaptulo4

Comoesfcildever,cuandolasopcionessonmuchas,eltextocomienzaahacersedifcilde
entenderyengorrosodeescribir.
Elmismoprograma,utilizandounSWITCH,quedaramuchomsclarodeleer,ysencillodeescribir,
comoseapreciaenelEJEMPLOsiguiente.
#include<stdio.h>
#include<conio.h>
main()
{
intc;
printf("\nMENU:");
printf("\nA=ADICIONARALALISTA");
printf("\nB=BORRARDELALISTA");
printf("\nO=ORDENARLALISTA");
printf("\nI=IMPRIMIRLALISTA");
printf("\n\nESCRIBASUSELECCION,YLUEGO<<ENTER>>:");
c=getchar();
switch(c)
{
case'A':
printf("\nUD.SELECCIONOAGREGAR");
break;
case'B':
printf("\nUD.SELECCIONOBORRAR");
break;
case'O':
printf("\nUD.SELECCIONOORDENAR");
break;
case'I':
printf("\nUD.SELECCIONOIMPRIMIR");
break;
case'\n':
printf("\nUD.NOHASELECCIONADONADA!");
break;
default:
printf("\n\a\aUD.APRETOUNCARACTERILEGAL");
break;
}
}

ElSWITCHempiezaconlasentencia:switch(expresin).Laexpresincontenidaporlosparntesis
debeserENTERA,ennuestrocasouncaracterluegomedianteunallaveabreelbloquedelas
sentenciasdecomparacin.Cadaunadeellasserepresentaporlapalabraclave"case"seguidapor
elvalordecomparacinyterminadapordospuntos.Seguidamenteseubicanlassentenciasquese
quierenejecutar,enelcasoquelacomparacinresulteCIERTA.EnelcasoderesultarFALSA,se
realizarlasiguientecomparacin,yassucesivamente.
PrestemosatencintambienalasentenciaBREAKconlaqueseterminacadaCASE.Una
caractersticapocoobviadelSWITCH,esquesiseeliminanlosBREAKdelprogramaanterior,al
resultarCIERTAunasentenciadecomparacin,seejecutarnlassentenciasdeeseCASEparticular
peroTAMBIENladetodoslosCASEpordebajodelqueharesultadoverdadero.Quizsseaclare
estodiciendoque,lassentenciaspropiasdeunCASEseejecutarnsisucomparacinotra
comparacinANTERIORresultaCIERTA.Laraznparaestepoco"juicioso"comportamientodel
SWITCHesqueassepermitequevariascomparacionescompartanlasmismassentenciasde
programa,porejemplo:
.................
case'X':
case'Y':
http://www.pablin.com.ar/computer/cursos/c2/manc4.htm

4/7

31/1/2017

ProgramacinenCCaptulo4

case'Z':
printf("UD.ESCRIBIOX,Y,Z");
break;
..................

LaformadeinterrumpirlaejecucinluegodehaberencontradounCASEciertoespormediodel
BREAK,elquedporterminadoelSWITCH.
AlfinaldelbloquedesentenciasdelSWITCH,apareceunaoptativallamadaDEFAULT,queimplica
:sinosehacumplidoningunCASE,ejecuteloquesigue.EsalgosuperfluoponerelBREAKeneste
caso,yaquenohaymssentenciasdespuesdelDEFAULT,sinembargo,comoelordenenque
aparecenlascomparacionesnotieneimportanciaparalaejecucindelainstruccin,puedesuceder
queenfuturascorreccionesdelprogramaseagreguealgnnuevoCASEluegodelDEFAULT,porlo
queesconvenientepreveerlo,agregandoelBREAK,paraevitarerroresdelaboriosaubicacin.
MsadelantevolveremossobreotrosusosdelBREAK.
4.LAITERACIONWHILE
ElWHILEesunadelastresiteracionesposiblesenC.Susintaxispodraexpresarsedelasiguiente
forma:

while(expresion)
proposicion1;

while(expresion){
proposicion1;
proposicion2;
........
proposicionx;
}

Estasintaxisexpresadaenpalabrassignificaria:mientras(expresin)dunresultadoCIERTO
ejecteselaproposicin1,enelcasodelaizquierdaejecteseelbloquedesentencias,enel
casodeladerecha.
Porlogeneral,dentrodelaproposicindelbloquedeellas,semodificantrminosdelaexpresin
condicional,paracontrolarladuracindelaiteracin.
5.LAITERACIONDOWHILE
Susintaxisser:
do{
proposicin1;
proposicin2;
...............
}while(expresin);

Expresadoenpalabras,estosignifica:ejecutelasproposiciones,luegorepitalaejecucinmientras
laexpresindunresultadoCIERTO.Ladiferenciafundamentalentreestaiteracinylaanteriores
queelDOWHILEseejecutasiempreALMENOSunavez,seacualseaelresultadodeexpresin.
6.ITERACIONFOR
ElFORessimplementeunamaneraabreviadadeexpresarunWHILE,veamossusintaxis:
for(expresin1;expresin2;expresion3){
proposicin1;
proposicin2;
........
}

Estoesequivalentea:
http://www.pablin.com.ar/computer/cursos/c2/manc4.htm

5/7

31/1/2017

ProgramacinenCCaptulo4

expresin1;
while(expresin2){
proposicin1;
proposicin2;
........
expresion3;
}

Laexpresin1esunaasignacindeunamsvariables,(equivaleaunainicializacindelas
mismas),laexpresin2esunarelacindealguntipoque,mientrasdunvalorCIERTO,permitela
iteracindelaejecucinyexpresin3esotraasignacin,quecomunmentevaraalgunadelas
variablescontenidaenexpresin2.
Todasestasexpresiones,contenidasenelparntesisdelFORdebenestarseparadasporPUNTOY
COMAyNOporcomassimples.
NoesimprescindiblequeexistanTODASlasexpresionesdentrodelparntesisdelFOR,
pudiendosedejarenblancoalgunasdeellas,porejemplo:
for(;exp2;exp3)
for(exp1;;)
for(;;)

Estasdosltimasexpresinessoninteresantesdesdeelpuntodevistadesufaltadetrmino
relacional,loqueimplicaqueelprogramadordeberhaberprevistoalgunamaneraalternativade
salirdellazo(probablementemedianteBREAKRETURNcomoveremosmsadelante)yaque
sin,laejecucindelmismoesinfinita(tanlargacomosemantengaencendidalacomputadora).
7.LASENTENCIABREAK
ElBREAK,yabrevementedescriptoconelSWITCH,sirvetambinparaterminarloopsproducidos
porWHILE,DOWHILEyFORantesquesecumplalacondicinnormaldeterminacin.Enel
EJEMPLOsiguientevemossuusoparaterminarunWHILEindeterminado.
#include<stdio.h>
#include<conio.h>
main()
{
charc;
printf("ESTEESUNLOOPINDEFINIDO");
while(1){
printf("DENTRODELLOOPINDEFINIDO(aprieteunatecla):");
if((c=getch())=='Q')
break;
printf("\nNOFUELATECLACORRECTAPARAABANDONARELLOOP");
}
printf("\nTECLACORRECTA:FINDELWHILE");
}

Obsrvesequelaexpresinwhile(1)SIEMPREescierta,porloqueelprogramacorrerimparable
hastaqueeloperadoroprimalatecla"secreta"Q.EstoseconsigueenelIF,yaquecuandoces
igualalASCIIQseejecutalainstruccinBREAK,dandoporfinalizadoelWHILE.
ElmismocriteriopodraaplicarseconelDOWHILEconFOR,porejemplohaciendo
for(;;){/*loopindefinido*/
............
if(expresin)
break;/*rupturadelloopcuandoexpresinseaverdadera*/
}
http://www.pablin.com.ar/computer/cursos/c2/manc4.htm

6/7

31/1/2017

ProgramacinenCCaptulo4

8.LASENTENCIACONTINUE
LasentenciaCONTINUEessimilaralBREAKconladiferenciaqueenvezdeterminarviolentamente
unloop,terminaconlarealizacindeunaiteracinparticularypermitiendoalprogramacontinuar
conlasiguiente.
9.LAFUNCIONEXIT()
LafuncinEXIT()tieneunaoperatoriamuchomsdrasticaquelasanteriores,envezdesaltearuna
iteracinabandonarunlazodeprograma,estaabandonadirectamentealprogramamismo
dndoloporterminado.Realizatambinunaseriedeoperacionestilescomoser,elcerradode
cualquierarchivoqueelprogramahubieraabierto,elvaciadodelosbuffersdesalida,etc.
Normalmenteselautilizaparaabortarlosprogramasencasodequeseestporcometerunerror
fatalinevitable.Medianteelvalorqueselepongaensuargumentoselepuedeinformaraquien
hayallamadoalprograma(SistemaOperativo,archivo.bat,uotroprograma)eltipodeerrorque
secometi.
10SENTENCIAGOTO
SiUd.sehaadmiradodequeCtengalaoperacinGOTO,recuerdequeelhechodeexistirNOlo
obligaausarla,enelmismosentidoqueportenerpuertaslosavionesnoestobligadoasaltarpor
ellasenplenovuelo.
ElusodelGOTOimplicaunsaltoincondicionaldeunlugaraotrodelprograma.Estaprcticahace
quelosprogramasseanmuydificilesdecorregirmantener.
Sinoquedaramsremedioqueusarlo,(yenprogramacinestructuradaSIEMPREhayremedio)
debemarcarseeldestinodelsaltomedianteunnombreseguidopordospuntos.
if(c==0)gotoOTRO_LADO;
.............................
OTRO_LADO:
printf(........

Enestecasosicescerosesalteantodaslassentenciasentreelifyeldestino,continuandosecon
laejecucindelprintf().EldestinopuedesertantoposteriorcomoanterioralGOTOinvocante.

CAPITULOANTERIORDELCURSO
PROXIMOCAPITULODELCURSO

http://www.pablin.com.ar/computer/cursos/c2/manc4.htm

7/7