Laboratorio 3: Estructuras de control basicas y algo de logica 1 Tabla Ascii La tabla Ascii, nos muestra la relacion existente entre un caracter dado y un numero entero, puede que cuando le pidamos a scanf leer un caracter, si escribimos el caracter efectivamente sera leido, pero internamente todo se representa por numeros, y eso nos muestra la tabla ascii, por ejemplo, el caracter ‘G’ es representado por el numero 71 y el caracter ‘7’ es representado por el numero 55. hay que tener cuidado con la forma en la que escribimos las distintas constantes en C, ‘7’ no es un numero, es un caracter (ya que esta encerrado en comillas simples). printf("%d", ’8’); Si ejecutamos esa linea de codigo, veremos que imprime 56, que es la representacion decimal del caracter ‘8’ 1 Ejercicio: Realizar un programa que escanee dos numeros desde consola e imprima la suma de ambos 2 Estructuras de Control: If, Else, Else if Dentro de los lenguajes de programacion, contamos con diferentes estructuras que nos permiten modificar el flujo de ejecucion del mismo. hasta ahora se han realizado programas que realizan acciones, cada ves que ejecutamos un programa, este realiza la misma accion, leer un numero, sumar, escribir. En este caso, la palabra “if” se traduce al espaol como un “Si”, de forma que podriamos pensar que la estructura de control “if” evalua una condicion, la sintaxis basica del “if” es: if( condicion ){ Set de instrucciones } de esta forma, como vimos en laboratorios anteriores, cualquier valor distinto de 0 se interpreta como “Verdadero” y el valor 0 se interpreta como “Falso”. if( 1 ){ printf("hola mundo!"); } Si incorporaramos este ultimo pedazo de codigo dentro de algun programa, veriamos que siempre que ejecutemos el programa, se imprimira “hola mundo!”, esta claro pensar esto, la condicion del if siempre es verdadera, por lo que siempre se entrara a ejecutar el “Set de instrucciones”, en cambio: if( 0 ){ printf("hola mundo!"); } nunca ejecutara la linea de codigo que imprime “hola mundo!” ya que la condicion evaluada (0) es falsa. La idea, es obviamente realizar operaciones un poco mas complejas, por ejemplo: 2 if( x < 5 ){ printf("el valor de x es menor a 5\n"); } podemos haber leido x de la entrada estandar, y luego verificar si x es menor a 5, “x<5” sera verdadero solo si el valor de x es menor a 5, en caso de que x sea 5 o un numero mayor, la expresion sera falsa, y no se entrara a ejecutar el set de instrucciones. Ejercicio: Realizar un programa, que dado un numero, nos diga si reprobamos el ramo o no. La estructura de control if, tiene distintas formas, primero vimos aquella donde ocupamos solamente un if, pero tambien tenemos la palabra reservada “else”, para poder lograr cosas un poco mas complejas. if( x < 5 ){ printf("el valor de x es menor a 5\n"); } else { printf("el valor de x es mayor o igual a 5\n"); } en este caso, cuando nuestro programa evalue la expresion “x <5”, si la expresion es verdadera, ejecutara el set de instrucciones dentro del if, en caso de que esta expresion sea falsa, ejecutara el set de instrucciones dentro del else. Ejercicio: Realizar un programa, que dado un numero, nos diga si reprobamos el ramo o no, utilizando solo un “if” y un “else” A demas del if y el else, contamos con una tercera forma, la cual nos permite evaluar distintas condiciones if( x == 1 ){ printf("x vale 1\n"); } else if( x == 2){ printf("x vale 2\n"); 3 } else if( x == 3 ){ printf("x vale 3 \n"); } else{ printf("x tiene otro valor"); } El programa anterior se ejecuta de la siguiente forma, llega al primer if, y evalua “x==1”, en caso de ser verdadero ejecuta el primer set de instrucciones y se salta el resto del bloque (o sea, el resto de los if, else, else if ), en caso de que sea falso, llegara al else if, y evaluara “x==2”, en caso de ser verdadero ejecuta el set de instrucciones, en caso de ser falso, evaluaremos la condicion del segundo else if, “x == 3”, de la misma forma, si es verdadero se ejecuta el set de instrucciones, y en caso contrario, encontrara el else, el cual sera ejecutado solo si no se cumplio ninguna de las condiciones anteriores. Ejercicio: Realizar un programa, que lea un numero, un caracter y otro numero (en ese orden) de la entrada estandar. Si el caracter es ’+’, que imprima la suma de ambos numeros, si el caracter es ’’ que imprima la resta de los dos numeros. Extiender el programa para la multiplicacion y division. 3 Operaciones Logicas Hay ciertos operadores logicos que nos permiten realizar expresiones mas complejas para evaluar condiciones, entre ellos tenemos el AND, el OR, la igualdad, la desigualdad, la negacion. • AND && • OR —— • igualdad == • desigualdad != • negacion ! 4 if( x <= 7 ) { if( x >= 1 ) printf("entre 1 y 7"); } en el codigo anterior, verificamos que una variable sea menor o igual a 7, y luego verificamos que esta sea mayor o igual a 1, aunque podemos hacer las cosas mas faciles y “bonitas” if( x <= 7 && x >= 1 ){ printf("entre 1 y 7 ); } ambos codigos entregaran el mismo resultado, algo que se debe tomar muy en cuenta con el operador logico &&, sabemos que si alguno de los dos lados es negativo, automaticamente la expresion entera sera negativo, para optimizar el proceso de evaluar, si la primera expresion es negativa, ya no nos importa que valor de verdad tenga la segunda expresion, por lo que la segunda no se evalua. if( x > 7 || x < 1 ){ printf("no esta entre 1 y 7 ); } si negamos la expresion anterior usando la ley de morgan, obtendremos esta nueva expresion, al igual que ocurria con el AND, si una de las expresiones del OR es verdadera, de forma automatica sabemos que el valor final sera verdadero, por lo que si tenemos algo como if( 1 || x < 1 ) { printf("nunca evaluaremos x"); } nunca evaluaremos si x realmente es menor a 1, mas adelante se retomaran este tipo de expresiones y un poco mas de su utilidad dentro del codigo que escribimos. 5 De la misma forma, contamos con los operadores de igualdad y desigualdad que hemose estado ocupando hace un rato ya, sabemos que cada expresion puede de cierta forma tener un valor de verdad, si la expresion se evalua como cualquier numero distinto de 0, sabemos que es verdadera, si es 0, es falsa. if( ! x ) { printf("no x"); } el codigo anterior, se ejecutara solamente cuando x sea 0, si x es 0, el operador de negacion negara la exprecion y se evaluara como 1. if( ! (x < 7) ){ printf("x no es menor a 7"); } y este ultimo codigo, imprimira algo siempre y cuando x no sea menor a 7, o sea, cuando x sea mayor o igual a 7. la logica de estos programas funcionan igual que la logica matematica, siguiendo las reglas de las tablas de verdad para los distintos operadores logicos. 6