Sie sind auf Seite 1von 5

UNIDAD 2.

RAMIFICACIONES Y CICLOS DE REPETICIÓN

Prácticamente todo algoritmo requiere de generar distintos caminos a seguir


(ramificaciones) de acuerdo a condiciones que evalúan el estado de las variables
que participan en él; por ejemplo imagine un programa donde se calcule la raíz
cuadrada de un número, si ese número es negativo el cálculo no puede hacerse
de manera directa, por lo que sería necesario evaluar esa condición y llevar a
cabo el cálculo de maneras distintas dependiendo si es o no negativo.

Por otro lado los ciclos de repetición permiten que un grupo de líneas de código
sean ejecutadas varias veces, sin necesidad de reescribirlas 2, 3, 4 o n veces de
acuerdo a la cantidad de veces que se requiriera repetirlas, haciendo factible la
generación de algoritmos generales, es decir algoritmos no limitados a una cierta
cantidad de repeticiones, ya que si no existiera forma de hacerlo, seguramente
habría que indicar que el algoritmo se limita a solucionar casos para un máximo
numero de repeticiones, ya que sería imposible escribir un numero infinito de
líneas para abarcar cualquier caso.

A continuación veremos más a detalle las ramificaciones y los ciclos de repetición


y su codificación en lenguaje C.

RAMIFICACIONES - TOMA DE DECISIÓN (IF-ELSE) CON LENGUAJE C

La gran mayoría de los algoritmos requieren de evaluar una condición y llevar a


cabo ciertos pasos si esta condición es cierta y otros si la condición es falsa, ya
lo hemos utilizado en la elaboración de algunos diagramas de flujo en los
ejemplos anteriores, sin embargo no sabemos aún como codificarlos. Las tomas
de decisión en los diagramas de flujo como recordará quedan expresadas
aproximadamente de la siguiente manera:

CONDICION

PASOS A SEGUIR
PASOS A SEGUIR
SI LA CONDICIÓN
SI LA CONDICIÓN
NO ES CIERTA
ES CIERTA
(FALSA)

Dentro del símbolo en forma de rombo va una condición a evaluar, si esta es


cierta, el camino a seguir en el algoritmo se desvía hacia la derecha, si no lo es
entonces se desvía hacia la izquierda. Al desviarse hacía uno u otro lado se puede
generar procesos distintos dependiendo de esa condición.
La forma de codificar en lenguaje C una toma de decisión es a través de la
sentencia if – else cuya sintaxis general es la siguiente:
if (condición)
{
Código de los pasos a seguir en caso de que la condición sea cierta;
}
else
{
Código de los pasos a seguir en caso de que la condición sea falsa;
}
Cabe mencionar que es opcional el uso de “else” en esta sintaxis, es decir, puede
encontrarse una condición evaluada por “if” pero no necesariamente llevará un
“else”, con lo que podrá encontrarse una sintaxis más simple como la siguiente:
if (condición)
{
Código de los pasos a seguir en caso de que la condición sea cierta;
}
Por otro lado dentro de la sintaxis observe el uso de llaves que delimitan el código
a ejecutar tanto en el caso de que la condición sea cierta, como cuando es falsa.
Como ya se menciono en temas anteriores, tome en cuenta las sugerencias de
identar el código para evitar cometer errores de sintaxis y de semántica causadas
por el incorrecto uso de estas llaves.

Además hay una regla más en la sintaxis de if-else, que dice, que si el código a
ejecutar en caso de que la condición sea cierta o falsa, es una sola línea de
código, entonces el conjunto de llaves correspondiente es opcional.

if (condición)
Una línea de código en caso de que la condición sea cierta;
else
Una línea de código en caso de que la condición sea falsa;

La parte más sensible de la sintaxis de if-else será el escribir correctamente la


semántica de la condición a evaluar. Para ello deberá tener bien presentes los
operadores lógicos que se mencionaron en la Unidad 1.

Ejemplo 1: evaluar si una variable es igual a 5, si es así, a otra variable se le debe


asignar un valor de 1, en caso contrario asignarle un 0.

a) if(x==5) b) if(x==5)
{ z=1;
z=1; else
} z=0;
else
{
z=0;
}
Observaciones: cualquiera de las dos opciones anteriores es válida, en la opción
b), se han suprimido las llaves, ya que como se mencionó, si el código a ejecutar,
es solo una instrucción, entonces es opcional utilizarlas. Por otro lado observe que
en la condición se utiliza el doble símbolo de igual (x==5), que indica comparación,
pero si por error se utiliza un solo símbolo de igual (x=5), esto no es un error de
sintaxis, pero generará un “bug”, ya que lo que se está indicando es que se le
asigne un valor de 5 a la variable x, y por otro lado tiene un efecto tal que siempre
se tomará como verdadera la condición.

Ejemplo2: evaluar si una variable es diferente de 0.

a) if(x!=0) b) if(x!=0)
{ {
z=1; x=1;
m=2; m=2;
} }
Else else
{ z=0;
z=0;
}

Observaciones: note como en la opción b), ahora solo se han suprimido las llaves
en el código a ejecutar en el caso de que la condición sea falsa (else), pues este
código es una sola instrucción, y no se pueden suprimir las llaves cuando es
verdadera ya que son dos instrucciones. Observe también el uso del operador
para denotar “distinto de” (!=).

Ejemplo 3: En caso de que una variable sea idéntica a un valor de 2 y otra mas
tenga un valor de 3, mostrar un mensaje en pantalla de “condición encontrada”,
de no ser así en otra variable calcular la suma de las dos variables de la
condición.

a) if (x==2) b) if(x==2)
{ if(z==3)
if(z==3) printf(“Condición encontrada”);
{ else
printf(“Condición encontrada”); s=x+z;
}
}
else c) if ( (x==2) && (z==3))
{ printf(“Condición encontrada”);
s=x+z; else
} s=x+z;
Observaciones: aquí vemos tres soluciones al problema descrito, la opción a)
representa el código mas amplio, donde no se ha buscado omitir llaves aún
cuando sea posible (una sola instrucción). En la opción b) y c) se han omitido ya
todas las llaves posibles. Note como en los códigos de a) y b) dentro del código a
ejecutar cuando la condición del primer “if” sea cierta, se encuentra otro “if”, esto
se conoce como anidamiento y es muy importante tener cuidado con las llaves
que se abren ({) y cierran (}), para no cometer errores de sintaxis o peor aún, de
semántica. Note también como en este segundo “if” en las opciones a) y b) no ha
sido utilizado con “else”, que como ya se dijo es opcional. El “else” que aparece
en la opción a) y b) corresponde al primer “if”. Ahora observe el código de la
opción c), la condición dentro del “if”, es una condición múltiple, que utiliza un
conector lógico entre condiciones simples, aquí el conector lógico utilizado es una
“AND” “Y”. Para que una condición múltiple unida con conector “AND” sea cierta
todas las condiciones simples deben serlo también, lo puede entender si analiza el
enunciado: “si x es igual a 2 y z es igual a 3”. Note como es quizás más fácil la
codificación de esta manera, que separando en dos “if”, sin embargo hay que
tener cuidado de armar la condición múltiple con los conectores lógicos
adecuados, y el uso de paréntesis para agrupar las condiciones simples.

Ejemplo 4: Se desea tomar una decisión en base a un par de variables,


averiguando si una de ellas tiene un valor mayor o igual a 10 u otra variable
cuenta con un valor menor que 20. En caso de que esta condición no se cumpla,
se deben intercambiar los valores de las variables. .

La solución a este problema la obtenemos analizando bien el enunciado del


mismo, se requiere de evaluar dos condiciones simples “ x mayor o igual a 10” ,
“z menor que 20”, pero en este caso estas dos condiciones simples, deben ligarse
por un conector lógico “OR” “O”. Por otro lado note que lo que se quiere averiguar
es cuando esta condición NO se cumple, entonces lo que deberemos de hacer es
negar la condición completa, por lo que obtendremos lo siguiente:

If ( ! ( (x>=10) || (z<20) ) )
{
temporal= x;
x=z;
z=temporal;
}

Observaciones: note el símbolo ”!” que indica negar toda la condición escrita
entre paréntesis después de este símbolo, por lo que si el enunciado “ x es mayor
o igual a 10, ó ,z es menor que 20” es cierto, toda la condición global es falsa, por
la negación, y viceversa.

Observamos el uso de || para el conector lógico “OR”, una condición múltiple unida
por este conector será cierta si al menos una de las condiciones simples lo es.
Por otro lado podemos analizar también el intercambio de valores entre las dos
variables, que de manera descuidada podríamos en primera instancia haberlo
pensarlo simplemente como:
x=z;
z=x;

Sin embargo, si analizamos al hacerlo de esta forma, vea que al momento de


ejecutar la asignación del valor de z a x, en ese momento se pierde cualquier valor
que haya contenido x, y luego al asignar x a z, simplemente x ya tiene el valor de
z, por lo que z no cambiará. Por ello es necesario almacenar temporalmente el
valor de x en otra variable, y así ya no importa si lo pierde al asignarle el valor de z
a x, y luego ese valor guardado temporalmente es el que habrá que asignarle a z.

Das könnte Ihnen auch gefallen