Archivo

Archive for junio 18, 2012

Operadores de Comparación y estructura condicional if … else en C [Tutorial 4]

junio 18, 2012 13 comentarios

Hola el contenido de este 4to tutorial son los Operadores de Comparación, Operadores Lógicos y la estructura condicional if … else.

Los operadores de comparación o también conocido como operadores relacionales, sirven para tomar decisiones mediante comparaciones, y por su mayoría van complementadas con las estructuras condicionales y sentencia de control de flujo.

Cuando se evalúa una condición en los operadores de comparación, el resultado que se obtiene puede ser 1 (equivalente a verdadero) o 0 (equivalente a falso). Este resultado provocará que se ejecute el código del bloque if o el del bloque else, según corresponda.

A continuación un listado de los posibles operadores de comparación en C y su significado.

Operadores de Comparación
Operador Significado
< estrictamente menor que
> estrictamente mayor que
<= menor o igual que
>= mayor o igual que
== igual a
!= distinto de

El resultado de cualquier evaluación de este tipo es un valor «cierto» (true) o «Falso» (false). La mayoría de los lenguajes tiene algún tipo predefinido para representar estos valores (boolean, bool, etc.); sin embargo en C, se toma como falso el valor 0, y como verdadero cualquier otro valor distinto de 0, aunque normalmente se usa 1. Esto nos permite utilizar condiciones sin operador:

float division(int dividendo, int divisor)
{
        if (divisor) {
                return dividendo / divisor;
        } else {
                printf ("No se puede dividir por cero\n");
                return 0;
        }
}

Los operadores lógicos son usados para unir y evaluar varias comparaciones, combinando los posibles valores de estas, ellos producen un resultado booleano, y sus operandos son también valores lógicos o asimilables a ellos (los valores numéricos son asimilados a cierto o falso según su valor sea cero o distinto de cero respectivamente).

Operador Simbolo Ejemplo Resultado
Y (AND) && a && b True si ambos a y b son verdadero
O (OR) || a || b True si a o b son verdadero
O EXCLUSIVO (XOR) XOR a ^ b True si a es verdadero o b es verdadero, pero no ambos
NEGACION (NOT)  !  !a True si a no es verdadero

Operador Y lógico también denominado por su nombre en inglés (generalmente en mayúsculas) AND lógico. Devuelve un valor lógico true (1) si ambos operando son ciertos. En caso contrario el resultado es false (0).

expr1 && expr2

Operador O lógico también denominado por su nombre en inglés (generalmente en mayúsculas) OR lógico. Devuelve un valor lógico true (1) si al menos un operando es ciertos. Devuelve false (0) cuando ambas condiciones son falsas.

expr1 || expr2

Operador No lógico Este operador es denominado también negación lógica y se representa en el texto escrito por la palabra inglesa NOT (otros lenguajes utilizan directamente esta palabra para representar el operador en el código), esta expresión es convertido a tipo bool, con lo que solo puede ser uno de los valores cierto/falso. A continuación el operador cambia su valor:  Si es cierto es convertido a falso y viceversa.

!expr1

Un ejemplo donde se ven agrupaciones de operadores puede ser la decisión de si un año es bisiesto o no. Los años son bisiestos si son divisibles por 4, pero no si son divisibles por 100, a menos que también sean divisibles por 400.

        if ( (!(a % 4) && ((a % 100))) || !(a % 400) )  {
                printf("es un año bisiesto.\n");
        } else {
                printf("no es un año bisiesto.\n");
        }

En este caso, se utiliza la operación módulo, que obtiene el resto de la división entera de un número por otro. Cuando un número es divisible por otro, el resto de su división entera será cero. Siendo que cero es equivalente a falso, y cualquier valor distinto de cero es equivalente a verdadero, podemos usar el operador ! para verificar si el número es múltiplo de 4, de 100 o de 400.

La estructura condicional if … else

En la gran mayoría de los programas será necesario tomar decisiones sobre qué acciones realizar. Esas decisiones pueden depender de los datos que introduzca el usuario, de si se ha producido algún error o de cualquier otra cosa.

La estructura condicional if … else es la que nos permite tomar ese tipo de decisiones. Traducida literalmente del inglés, se la podría llamar la estructura «si…si no», es decir, «si se cumple la condición, haz esto, y si no, haz esto otro».

Un ejemplo sencillo sería el siguiente (no se trata de un programa completo, sino tan sólo una porción de código):

        if (edad < 18){
                printf("No eres mayor de edad.\n");
        }else {
                printf("Eres mayor de edad.\n");
        }

Este código de ejemplo dice que si edad es menor que 18 se imprimirá «No eres mayor de edad.\n», mientras que en caso contrario se imprimirá «Eres mayor de edad.\n».

Como se ve en el ejemplo, la estructura de un condicional es bastante simple:

        if (condición) {
                sentencias_si_verdadero;
        } else {
                sentencias_si_falso;
        }

Cuando la condición sea verdadera, se ejecutarán las sentencias dentro del primer bloque de código, cuando la condición sea falsa, se ejecutarán las sentencias del segundo bloque de código.

La indentación (los espacios al comienzo de las líneas) no es necesaria, pero ayuda a la claridad del código. La utilización de las llaves {…} es obligatoria cuando se quiere utilizar más de una instrucción por bloque, y optativa cuando sólo se quiere escribir una instrucción. Por claridad, sin embargo, es recomendable utilizarlas aún cuando sólo vaya a haber una instrucción.

El bloque del else es opcional. Si no se lo encuentra, sólo se realizará la acción correspondiente al bloque if.

A continuación, un ejemplo de una función que lea un numero y permita decir si es par ó impar:

void Paridad(int a)
{
   if (a % 2 == 0) {
     printf("El numero es par\n");
   } else {
     printf("El numero es Impar\n");
   }
}

Haremos un programa que permita leer un numero por teclado y que nos diga que si es par o impar, para ello hacemo lo siguiente Archivo -> Nuevo -> Proyecto:

Creamos un nuevo proyecto que sea Console Application, seleccionamos C Project y le ponemos el nombre que queramos, que en este caso es: Tutorial_4.

A continuación indicamos donde queremos guardar el proyecto que hemos creado.

Por defecto, Dev-C++ crea el archivo main.c, pero lo borramos ya que queremos aprender a programar desde el principio.

Compilamos y Guardamos el main con el nombre que tu quieras, en mi caso le pongo main_Paridad, ya que es el primer ejemplo que vamos hacer.

ahora si procedemos a borrar lo que tiene el main ya que queremos aprender a programar desde el principio.

Ahora ya podemos escribir nuestro código que seria el siguiente:

#include <stdio.h>

int numero1 = 0;

main(void)
{
    printf("Introduzca un Numero: ");
    scanf("%i",&numero1);
    fflush(stdin);
    if (numero1 % 2 == 0) {
        printf("El numero es par\n");
    } else {
        printf("El numero es Impar\n");
    }
    system("PAUSE");
}

Nuestro código debe quedar de la siguiente manera:

Compilamos y ejecutamos el programa para comprobar que todo es correcto.

El resultado es el siguiente:

Como se puede observar, el valor introducido era 3,  por lo tanto el numero es Impar.

Bien algo que hace falta saber es que dentro de una estructura if puede haber otra estructura if tantos veces como sea necesario. Es decir la estructura de un condicional if … else puede aplicar de forma anidada:

        if (condición) { // Esta es la condición a cumplir
         sentencias_si_verdadero;
        } else if (condición) { // Esta es la condición a cumplir
                sentencias_si_verdadero;
        } else {
                sentencias_si_falso;
        }

¿Y como para qué me sirve esto? Pues hay algunas situaciones que así lo requieren.

Por ejemplo: Se quiere saber el precio de una matricula o colegiatura para el siguiente periodo académico de un alumno, el precio esta sujeto a estas condiciones: Si el alumno tiene un promedio mayor o igual a 9 se le hara un 20% de descuento en la colegiatura, si tiene un promedio mayor o igual a 8 pero menor que 9 el descuento será del 10%, si su promedio es menor que 8 pero mayor o igual a 7 el descuento será del 5% y si promedia con 7 o menos no tendrá descuento, el precio de la colegiatura es de 1500 BsF.

#include<stdio.h>

int main()
{
   float promedio=0,descuento=0,colegiatura=1500,total=0;
   printf("\n\tCual fue tu promedio en el ultimo semestre Escala 1..10: ");scanf("%f",&promedio);
   if(promedio>=9)
   {
      descuento=0.2;
   }
   else if(promedio>=8 && promedio <9)
   {
      descuento=0.1;
   }
   else if(promedio>=7 && promedio <8)
   {
      descuento=0.05;
   }
   else
   {
      descuento=0;
   }
   total=colegiatura-colegiatura*descuento;
   printf("\n\tEl precio de tu colegiatura sera de %.2f BsF.\n\n\t",total);
   system("PAUSE");
}

Nuestro código debe quedar de la siguiente manera:

Compilamos y ejecutamos el programa para comprobar que todo es correcto.

Una vez introducidos todos los valores, se muestran por pantalla el siguiente resultado:

Como se puede observar, el nota introducida de la escala del 1 … 10 era 8,  por lo tanto el descuento era del 10% lo que significaría 150 BsF, y el precio de la matricula del alumno ahora es 1350 BsF.

Ahora queremos hacer un programa nos pida la medida de tres lados de un triángulo y que nos devuelva el tipo de triangulo que es (equiláteroisósceles o escaleno).

Para esto vamos a usar estructuras condicionales anidadas para comparar los lados de nuestro triángulo.

Un tríangulo equilátero tiene sus tres lados iguales, por tanto, la condición quedaría así:

“si el lado 1 es igual al lado 2 y el lado 2 es igual al lado 3, entonces es equilátero”

Un tríangulo isósceles tiene solo dos lados iguales, por tanto, la condición quedaría así:

“si el lado 1 es igual al lado 2 y el lado 2 es diferente al lado 3, o
el lado 2 es igual al lado 3 y el lado 3 es diferente al lado 1, o
el lado 3 es igual al lado 1 y el lado 1 es diferente al lado 2 entonces es isósceles”

Un tríangulo escaleno tiene sus tres lados diferentes, por tanto, la condición quedaría así:

“si el lado 1 es diferente al lado 2 y el lado 2 es diferente al lado 3 y el lado 3 es diferente al lado 1, entonces es escaleno”

Pero vamos al código. El programa completo en C, sería así:

#include<stdio.h>
#include<conio.h>
int main()
{
  //Declaracion de variables
  int lado1=0,lado2=0,lado3=0;

  //Pedir los datos
  printf("TIPOS DE TRIANGULOS");
  printf("\nIntroduce el lado 1: ");scanf("%i",&lado1);
  printf("\nIntroduce el lado 2: ");scanf("%i",&lado2);
  printf("\nIntroduce el lado 3: ");scanf("%i",&lado3);

  //Hacer comparaciones
  if(lado1==lado2 && lado2==lado3)
  { printf("\n\tEs equilatero"); }
  if(lado1==lado2 && lado2!=lado3 || lado2==lado3 && lado3!=lado1 || lado3==lado1 && lado1!=lado2)
  { printf("\n\tEs isosceles"); }
  if(lado1!=lado2 && lado2!=lado3 && lado3!=lado1)
  { printf("\n\tEs escaleno"); }

  //Pausa
  system("PAUSE");
}

Nuestro el programa debe quedar de la siguiente manera:

Aprovecho para explicarles un detalle más. \n (alt+92 n) dentro de un printf(); indica un salto de línea, y \t(alt+92 t) indica una sangría o tabulado o algo de espacio.

Nuevamente compilamos y ejecutamos el programa para comprobar que todo es correcto.

Una vez introducidos todos los valores, se muestran por pantalla el siguiente resultado:

Como podemos observar, el valor de los lados introducido es de 5 cada uno, lo que nos queda que el triangulo que tenemos es un equilatero.

Bien este es todo el Tutorial, nos veremos en la siguiente entrega… Chao 🙂