PROG-I /24PROG-I
Objetivos
Semana 2
2.1 Aplicar las directivas de preprocesador de C para incluir ficheros de
cabecera
2.2 Utilizar los tipos de datos definidos de forma estándar en C para
declarar variables
2.3 Declarar, definir y llamar funciones para implementar modularidad en
un programa
Semana 3
2.4 Hacer uso de las funciones de entrada/salida
2.5 Realizar operaciones de asignación, aritméticas y lógicas en C
Semana 4
2.6 Escribir sentencias de control y repetición
Curso 2009-10Tema - 2 Programación básica 2
PROG-I /24PROG-I
Resumen operadores relacionales y lógicos
Curso 2009-10Tema - 2 Programación básica 4
Operador Explicación V F
> Mayor que 1 0
< Menor que 1 0
== Igual a 1 0
>= Menor o igual a 1 0
<= Mayor o igual a 1 0
!= Distinto a 1 0
A B ! A A && B A || B
0 0 1 0 0
0 ≠0 1 0 1
≠0 0 0 0 1
≠0 ≠0 0 1 1
Op. relaciones y lógicos:
Verdadero ≠ 0, Falso = 0
Operadores Lógicos
Se evalúan en cortocircuito:
en cuanto se sabe el resultado de
la expresión se deja de evaluar.
Ej;
a = 3;
x = ((a == 3) || (b = 2));
x = ((a < 1) && b = sqrt(2)))
PROG-I /24PROG-I
Sentencia if (expr) sentencia [else sentencia]
Permite ejecutar distintas instrucciones dependiendo de
la evaluación de expresión condicional.
if ( expr )
sentencia
Expresión condicional: V ≠ 0, F = 0
Variable: if (encontrado)…
Expresión con operadores lógicos y relacionales:
if ((n > 0) && (n % 3 == 0)) …
Función que devuelve entero: if (! esPrimo(a)) …
else
if ( expr )
sentencia
else
sentencia
Ej:
if (a > b)
z = a;
else
z = b;
Ej:
si a > b
z ← a
si no
z ← b
Curso 2009-10 5Tema - 2 Programación básica
PROG-I /24PROG-I
Sentencia if (expr) sentencia [else sentencia]
Ejs.
if (distancia <= radio)
printf("PUNTO INTERIOR");
else
printf("PUNTO EXTERIOR");
scanf("%f", &x);
if (x < 0)
x = -x;
printf("%.2f",x);
11
22 scanf("%c", &c);
if (('A' <= c) && (c <= 'Z'))
{
desp = 'a'-'A';
c += desp;
}
printf("%cn", c);
33
if (x > max)
{
printf("Nuevo max. %fn", x);
max = x;
}
else
{
printf("Seguimos probando");
i++;
}
44
Curso 2009-10 6Tema - 2 Programación básica
PROG-I /24
if (salario/2 > letramensual)
printf("Prestamo concedido: %un", prestamo);
else if (salario > letramensual)
printf("Prestamo al 80%%: %.1fn", prestamo*0.8);
else
printf("Prestamo denegadon");
Sentencias condicionales anidadas
si salario/2 > letramensual
Prestamo concedido
si no si salario > letramensual
Prestamo concedido al 80%
si no
Prestamo denegado
Curso 2009-10 7Tema - 2 Programación básica
PROG-I /24
Sentencias condicionales anidadas (ej2)
if (tieneTrabajo)
if (salario/2 > letramensual)
printf("Prestamo concedido: %un", prestamo);
else if (salario > letramensual)
printf("Prestamo al 80%%: %.1fn", prestamo*0.8);
else
printf("Prestamo denegadon");
else
printf("Prestamo denegadon");
cada else se asocia con el if más cercano
Cuidado con la indentación
Curso 2009-10 8Tema - 2 Programación básica
PROG-I /24
Sentencias condicionales anidadas (ej3)
Incorrecto
if (x > 0)
if (x < 20)
printf("esta entre 0 y 20n");
else
printf("no esta entre 0 y 20n");
else
printf("no esta entre 0 y 20n");
Correcto
if ((0 < x) && (x < 20))
printf("esta entre 0 y 20n");
else
printf ("no esta entre 0 y 20n");
Curso 2009-10 9Tema - 2 Programación básica
PROG-I /24PROG-I
Condicional múltiple (switch)
Cada caso se etiqueta por uno entero (int, char, enum).
Si se cumple que la expresión se corresponde con alguna de las
etiquetas comienza la ejecución en ese punto.
break: punto de salida de la sentencia
default: opción por defecto
switch (expresión)
{
case const-expr: sentencias
[break;]
case const-expr: sentencias
[break;]
[default: sentencias]
}
switch (cantidad)
{
case 1: descuento = 0;
break;
case 2:
case 3:
case 4: descuento = 0.05;
break;
case 5:
case 6: descuento = 0.10;
break;
default:
descuento = 0.25;
}
Curso 2009-10 11Tema - 2 Programación básica
PROG-I /24PROG-I
Operador condicional
Operador trinario
expr1 ? expr2 : expr3
El valor devuelto depende del resultado expr1
Si expr ≠ 0 (verdadero) el resultado coincide con el resultado de la
expr2
Si expr = 0 (falso) el resultado coincide con el resultado de la expr3
El tipo del resultado depende del tipo de expr2 y expr3,
independientemente de cual se evalue
Curso 2009-10Tema - 2 Programación básica 12
Ej:
z = (a > b) ? a : b; /* z = max(a, b) */
printf("%fn", (y > 0) ? y : -y);
PROG-I /24PROG-I
Bucles
Bucles definidos: aquellos que conocemos a priori
cuantas iteraciones se van a realizar. Ej. Imprimir los 10
primeros números impares.
desde...hasta
Bucles indefinidos: aquellos que a priori no
conocemos el número de iteraciones. Se necesita
especificar una condición de parada. Ej. Calcular la suma
de una lista de números enteros hasta que un operando
sea negativo.
cero o más iteraciones: mientras...haz
una o más iteraciones: haz...mientras
Curso 2009-10 14Tema - 2 Programación básica
PROG-I /24PROG-I
Bucles definidos: desde...hasta
Se utiliza para implementar bucles definidos
for (expr1; expr2; expr3)
sentencia
expr1 y expr3 son asignaciones o llamadas a función
expr1: se evalúa antes de comenzar el bucle
expr3: se evalúa al final de cada iteración.
expr2 es un expresión relacional
Se comprueba antes de cada iteración para decidir si se el bucle
continua.
expr1: inicialización, expr2: condición parada, expr3:
incremento Ej:.
int i;
for (i = 0; i < MAX; i++) {
printf("%d ", i);
}
Ej:.
desde i ← 0 hasta MAX
imprime i
Curso 2009-10 15Tema - 2 Programación básica
PROG-I /24PROG-I
Ejemplo 1:
#include <stdio.h>
/* Imprimir los n primeros
números pares:*/
/* 2,4,6,8,10,12,14 …*/
int main(void)
{
int n, i;
scanf("%d", &n);
for (i = 1; i <= n; i++)
printf("%d ", 2*i);
printf("n");
}
Pas
o
Instruccion i n salid
a
1 scanf(…); ? 7
2 printf("%d…); 1 7 2
3 printf("%d…); 2 7 4
4 printf("%d…); 3 7 6
5 printf("%d…); 4 7 8
6 printf("%d…); 5 7 10
7 printf("%d…); 6 7 12
8 printf("%d…); 7 7 14
9 printf("n"); 8 7 salto
bucle for
Curso 2009-10 16Tema - 2 Programación básica
PROG-I /24PROG-I
Ejemplo 2:
/* Imprimir los números
enteros dentro de un
intervalo dado de mayor a
menor:*/
int main(void)
{
int a, b, i;
scanf("%d%d", &a, &b);
for (i = a; i <= b; i--)
printf("%d ", i);
printf("n");
}
Pas
o
Instrucci
on
i a b salid
a
1 scanf(…); ? 2 -3
2 printf(%d…)
;
2 2 -3 2
3 printf(%d…)
;
1 2 -3 1
4 printf(%d…)
;
0 2 -3 0
5 printf(%d…)
;
1 2 -3 1
6 printf(%d…)
;
-1 2 -3 -1
7 printf(%d…)
;
-2 2 -3 -2
8 printf(%d…)
;
-3 2 -3 -3
printf(%d…)
bucle for
Curso 2009-10 17Tema - 2 Programación básica
PROG-I /24PROG-I
Anidar bucles for
#include <stdio.h>
/* Imprimir la tabla de multiplicar del 0 al 9:
*/
int main(void)
{
int i, j;
for (i = 0; i<=9; i++) {
for (j = 0; j<=9; j++)
printf("%2d ", i*j);
printf("n");
}
return 0;
}
se repite
10 veces
se repite
10 veces
¿cuántas veces
se ejecuta?
¿cuántas veces
se ejecuta?
Curso 2009-10 18Tema - 2 Programación básica
PROG-I /24PROG-I
while: es una de las dos realizaciones de un bucle indefinido.
while (expr)
sentencia
Mientras se cumpla la condición (<expr> ≠ 0) se ejecutará el bucle
Un bucle while se ejecutará cero o más veces.
Bucles indefinidos
Ej:
int main(void)
{
int n, suma = 0;
scanf("%d",&n);
while (n >= 0) {
suma += n;
scanf("%d",&n);
}
printf("suma=%dn", suma);
return 0;
}
Ej:
suma ← 0
lee n
mientras n >= 0
suma ← suma + n
lee n
imprime suma
Curso 2009-10 19Tema - 2 Programación básica
PROG-I /24PROG-I
Ejemplo 1:
/* Calcular la suma de una
secuencia de números
introducido por teclado hasta
que uno de los
números sea negativo */
*
#include <stdio.h>
int main(void)
{
int n, suma = 0;
scanf("%d",&n);
while (n >= 0) {
suma += n;
scanf("%d",&n);
}
printf("suma=%dn", suma);
}
Pas
o
Instruccion suma n
1 suma=0 0 ?
2 scanf 0 4
3 suma += n 4 4
4 scanf 4 2
6 suma += n 6 2
7 scanf 6 5
8 suma += n 11 5
9 scanf 11 2
10 suma += n 13 2
11 scanf 13 -1
bucle while
11
22
33
44
Curso 2009-10 20Tema - 2 Programación básica
PROG-I /24PROG-I
do:Es una de las dos realizaciones de un bucle indefinido
do
sentencia
while (expr) ;
Haz sentencia mientras se cumpla la condición (<expr> ≠ 0)
Un bucle do..while se ejecutará una o más veces.
Bucle indefinidos
Ej:
n ← 0
suma ← 0
haz
suma ← suma + n
lee n
mientras n >= 0
imprime suma
Ej:
int main(void)
{
int n = 0, suma = 0;
do {
suma += n;
scanf("%d",&n);
}while( n >= 0);
printf("suma=%dn", suma);
return0;
}
Curso 2009-10 21Tema - 2 Programación básica
PROG-I /24PROG-I
Break y continue
break: termina la ejecución de un bucle en el punto en
el que aparezca. Si hubiera varios bucles anidados sólo
afecta al más interior.
continue: continua con la siguiente iteración.
while (!(x == vbuscado))
{
scanf("%lf", &x);
if (x < 0.0)
break;
}
for (i = 0; i < TOTAL; ++i)
{
c = getchar();
if (isdigit(c))
continue;
c = toupper(c);
…
}for (nc = 0; ; nc++)
{
c = getchar();
if (c == EOF)
break;
}
Curso 2009-10 22Tema - 2 Programación básica
PROG-I /24PROG-I
Consideraciones generales
Bucle for
Aunque es posible realizar bucles indefinidos (break), pensar en
utilizarlo con definido.
La variables que se utilizen dentro de la definición del bucle no
se deberían modificar dentro del mismo.
Se puede emplear el operador ,
Bucle while y do
Aunque es posible realizar bucles definidos, pensar en utilizarlo
siempre con definido.
while: se ejecuta cero o más veces
do: se ejecuta una o más veces
Empler break y continue cuando sea extrictamente
necesario. Repensar la definición del bucle.
Curso 2009-10 23Tema - 2 Programación básica
Notas del editor
Preguntar en clase que pasaría con a &lt;= b &lt;= c
Preguntar: que hace el codigo 1 y 2