2. PROG-I /27PROG-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
4. PROG-I /27
printf
int printf(const char * format, ...);
Ej1:
#include <stdio.h>
printf("%s, %s %4d, %.2d:%.2dn",
weekday, month, day, hour, min);
Martes, Enero 15, 20:03
Ej2:
#include <math.h>
#include <stdio.h>
printf("pi = %.5fn", 4 * atan(1.0));
pi = 3.14159
<stdio.h>
imprimir con formato
char weekday[] = "Martes";
char month[] = "Enero";
int day = 15;
int hour = 20;
int min = 3;
Curso 2009-10 4Tema 2 – Programación básica
5. PROG-I /27PROG-I
printf
ABC. Sección 11.1, pag. 493
%<flags><ancho><precision><long>conversion
Cero o más flags
- justifica a la izquierda la conversión
+ fuerza a que aparezca el signo (+ ó -)
# notación alternativa para octal y hexadecimales
0 Rellena con ceros hasta el ancho del campo
"espacio" si el signo es positivo deja un espacio inicial.
ancho: mínimo de caracteres que ocupará la conversión
precisión: comienza con . Depende de la conversión. En
números enteros determina el número mínimo de dígitos. En
números reales, la cantidad de decimales. En cadena de
caracteres indica el número máximo de caracteres a escribir.
longitud: modificar que puede ser h, l ó L. h – short, l – long y
L – long double
Curso 2009-10 5Tema 2 – Programación básica
6. PROG-I /27PROG-I
printf
Símbo
lo
Conversión Precisió
n
por
defecto
d,i Entero con signo 1
u Entero sin signo 1
o octal (sin 0 al principio) 1
x, X hexadecimal (sin 0x ó 0X) al principio 1
f Real con doble precisión 6
e, E Real con doble precisión en notación
científica
6
c Imprime un caracter -
s Imprime un cadena de caracteres -
Curso 2009-10 6Tema 2 – Programación básica
7. PROG-I /27PROG-I
Problema (Salida con formato)
Realizar una programa que pida la distancia entre dos ciudades
(km), la cantidad de combustible necesario para realizar el viaje (l),
y el coste de la unidad de combustible (euros/l). Imprimir por
pantalla un resumen de los datos anteriores, más el consumo
medio a los 100 km. y el coste del viaje. Asumir que la distancia y
la cantidad de combustible son números enteros.
distancia ← 740
combustible ← 60
precioCombustible ← 1.145
consumoMedio ← combustible*100 / distancia
precioViaje ← distancia * precioCombustible
imprime distancia
imprime combustible
imprime precioCombustible
imprime consumoMedio
imprime precioViaje
Curso 2009-10 7Tema 2 – Programación básica
8. Primeraaproximación
#include <stdio.h>
int main(){
int distancia, /* km */
combustible; /* litros consumidos en el viaje */
float precioCombustible, /* euro/litros */
consumoMedio, /* litros a los 100km */
precioViaje; /* coste total del viaje */
distancia = 740;
combustible = 60;
precioCombustible = 1.145;
consumoMedio = combustible *100 / distancia;
precioViaje = combustible * precioCombustible;
printf("Distancia:%d km.n", distancia);
printf("Combustible gastado:%d l.n", combustible);
printf("Precio combustible:%f euros/ln", precioCombustible);
printf("Consumo medio:%f l.n", consumoMedio);
printf("Coste:%f eurosn", precioViaje);
return 0;
}
9. PROG-I /27PROG-I
Salida con formato
Entrada:
740
60
1.145
Salida:
Distancia:740 km.
Combustible gastado:60 l.
Precio combustible:1.145000 euros/l
Consumo medio:8.000000 l.
Coste:68.699997 euros
Nueva Salida buscada:
Distancia:_____________740 km.
Combustible gastado:____60 l.
Precio combustible:1.145000 euros/l
Consumo medio:8.000000 l.
Coste:68.699997 euros
10 car. (‘Distancia:’) + X car. = 20 car. (‘Combustible gastado:’) + Y car.
Curso 2009-10 9Tema 2 – Programación básica
10. #include <stdio.h>
int main(){
int distancia, /* km */
combustible; /* litros consumidos en el viaje */
float precioCombustible, /* euro/litros */
consumoMedio, /* litros a los 100km */
precioViaje; /* coste total del viaje */
distancia = 740;
combustible = 60;
precioCombustible = 1.145;
consumoMedio = combustible *100 / distancia;
precioViaje = combustible * precioCombustible;
printf("Distancia:%16d km.n", distancia);
printf("Combustible gastado:%6d l.n", combustible);
printf("Precio combustible:%f euros/ln", precioCombustible);
printf("Consumo medio:%f l.n", consumoMedio);
printf("Coste:%f eurosn", precioViaje);
return 0;
}
Segundaaproximación
11. PROG-I /27
Salida con formato
Salida buscada:
Distancia:_____________740 km.
Combustible gastado:____60 l.
Precio combustible:______1.145 euros/l
Consumo medio:___________8.00 l.
Coste:__________________68.70 euros
19 car. (‘Precio combustible:’) car. + Z car. = 26
Z car. = 7
Si queremos alinear parte entera con parte entera => 7 + 3 decimales + ‘.’ =
11 car.
Distancia: 740 km.
Combustible gastado: 60 l.
Precio combustible:1.145000 euros/l
Consumo medio:8.000000 l.
Coste:68.699997 euros
Salida:
Curso 2009-10 11Tema 2 – Programación básica
12. Terceraaproximación
#include <stdio.h>
int main(){
int distancia, /* km */
combustible; /* litros consumidos en el viaje */
float precioCombustible, /* euro/litros */
consumoMedio, /* litros a los 100km */
precioViaje; /* coste total del viaje */
distancia = 740;
combustible = 60;
precioCombustible = 1.145;
consumoMedio = combustible *100 / distancia;
precioViaje = combustible * precioCombustible;
printf("Distancia:%16d km.n", distancia);
printf("Combustible gastado:%6d l.n", combustible);
printf("Precio combustible:%11.3f euros/ln", precioCombustible);
printf("Consumo medio:%15.2f l.n", consumoMedio);
printf("Coste:%23.2f eurosn", precioViaje);
return 0;
}
14. PROG-I /27
scanf
int scanf(const char * format, ...);
Ej1:
int dia, anio;
char nombremes [20];
scanf("%d %s %d", &dia, nombremes, &anio); /*20 Ene 2009 */
Ej2:
int dia, mes, anio;
scanf("%d/%d/%d", &dia, &mes, &anio); /* 20/01/2009 */
Lectura con formato
Se para cuando se empareja todo el formato, o cuando se produce un
error.
Devuelve el número de argumentos que ha sido capaz de emparejar.
Curso 2009-10 14Tema 2 – Programación básica
15. PROG-I /27PROG-I
Formato scanf
ABC. Sección 11.2, pag. 499
Contenido
Espacio en blanco
Carácter ordinario
Especificación de conversión (%). Indica el formato en que se va
almacenar en la variable que le corresponda casar. Si se añade
un * despue´s del % significa que se consume pero no se
almacena. Se puede especificar el número máximo de
caracteres a consumir.
Conversión
d i o u x : convierte al entero correspondiente.
e f : convierte a float.
s : lee hasta el siguiente carácter blanco y almacena lo
consumido en una cadena de caracteres.
c : lee un carácter (cuentan también los blancos)
Modificadores h, l, L : similar a printf
Curso 2009-10 15Tema 2 – Programación básica
16. PROG-I /27PROG-I
Entrada de datos
Reglas a tener en cuenta
enteros: salta todos los ‘blancos’, y consume el siguiente
número entero.
reales: salta todos los ‘blancos’, y consume el siguiente número
real.
char: consume el siguiente carácter.
string: Consume todos los caracteres hasta el siguiente blanco.
cualquier otro tipo de dato: no se puede leer directamente!
(* caracteres blancos: espacio, tabuladores, saltos de línea y
retornos de carro)
Curso 2009-10 16Tema 2 – Programación básica
17. PROG-I /27PROG-I
Ejercicio
Modificar el programa anterior para emplear la entrada estándar como
suministradora de los valores iniciales.
Curso 2009-10 17Tema 2 – Programación básica
19. PROG-I /27PROG-I
Operadores
Operador: tipo especial de función perteneciente al lenguaje que por similitud
con el lenguaje matemático se expresa mediante caracteres particulares.
Todo operador:
Recibe un o más operandos (argumentos)
Devuelve el resultado de la operación como salida.
El resultado tiene un tipo (int, long, float…)
¿Si los operandos son de distinto tipo? véase ABC, Sección 3.11, pag.131
Tipos
En cuanto al número de operandos
Unarios: requieren un único operando
Binarios: requieren dos operandos
En cuanto al tipo de operación
Aritméticos
Relacionales
Lógicos
Asignación
Incremento/Posdecremento
Bits
Curso 2009-10 19Tema 2 – Programación básica
20. PROG-I /27PROG-I
Operadores Aritméticos
Unarios
Binarios
Ejemplos
Operador Tipo de datos Explicación
+ - int, float, double Cambian el signo
Operador Tipo de datos Explicación
+ -* / int, float, double
% int módulo
int a,b;
a = 20;
b = -a; /* a=20, b=-20 */
a = a - b; /* a=40, b=-20 */
b = a % b; /* a=40, b=0 */
int a, b;
float x;
a = 30;
b = a / 20;
x = a / 20;
printf("a=%d, b=%d, c=%.2fn",a,b,x);
/* ¿qué aparece por pantalla? */
Curso 2009-10 20Tema 2 – Programación básica
21. PROG-I /27PROG-I
Todos son binarios
El resultado de la operación será un entero:
0 si la relación es falsa
1, si la relación es verdadera
Operadores relacionales
Operador Explicación
> Mayor que
< Menor que
== Igual a
>= Menor o igual a
<= Mayor o igual a
!= Distinto a
Ej:
int a,b;
a = 20;
b = 30;
printf("%d", a == b);
printf("%d", a <= b);
printf("%d", a >= b);
printf("%d", a != b);
Curso 2009-10 21Tema 2 – Programación básica
22. PROG-I /27PROG-I
Operadores lógicos
Lógica booleana: véase Unidad 2 de FC (Operaciones y
expresiones booleanas. Leyes y reglas del álgebra de Boole)
Operadores lógicos:
Unario: not (!)
Binario: and (&&), or (||)
Tabla de verdad: A y B expresiones que devuelven un número
entero
V significa 0≠
F significa = 0
A B ! A A && B A || B
F F T F F
F T T F T
T F F F T
T T F T T
Curso 2009-10 22Tema 2 – Programación básica
23. PROG-I /27PROG-I
Asignación
¡Es un operador!
identificador_variable = expresión ó literal
dias = edad * 365;
a = b = 5;
expr1 op= expr2
expr1 = (expr1) op (expr2)
op puede ser + - * / % << >> & ^ |
i += 2; es eq. i = i + 2;
x *= y + 1; es eq. x = x * (y+1);
Curso 2009-10 23Tema 2 – Programación básica
24. PROG-I /27PROG-I
Incremento y decremento
Unarios: ++ y --
++n, --n, n++, n--
(++n) Preincremento: se incrementa la variable, y se emplea
como resultado el nuevo valor.
(n++) Postincremento: se emplea como resultado el valor
actual de la variable, y se incrementa.
Efecto lateral: se modifica la variable!
Ej:
x = ++n ; /* si n = 10 ¿x y n? */
x = n++; /* si n = 10 ¿x y n? */
n++; /* es válido e idéntico a ++n */
Curso 2009-10 24Tema 2 – Programación básica
25. PROG-I /27PROG-I
Operadores a nivel de bit.
Operan sobre la representación
binaria
de la variable
& AND
| OR
^ OR exclusivo (XOR)
<< desplazamiento izquierda
>> desplazamiento derecha
~ complemento a uno
(NOT)n = n & 0177; /* int n = 23, ¿n? */
x = x | SET_ON; /* long x = 4350, SET_ON 1, ¿x? */
x = x & ~077; /* short x = 76, ¿x? */
x=1 y y = 2, /* ¿x & y es distinto de x && y? */
x << 2; /* char x = 125, ¿x? */
1001 & 0111 = 0001
1001 | 0111 = 1111
1001 ^ 0111 = 1110
1001 << 2 = 0100
1001 >> 2 = 0010
~1001 = 0110
Curso 2009-10 25Tema 2 – Programación básica
26. ¿Qué operadores se evalúan
primero?
x = 4 + (5 * 3); /* ¿x? */
x = (4 + 5) * 3; /* ¿x? */
x = 4 + 5 * 3; /* ¿x? */
Paréntesis implícitos:
i < lim-1
i < (lim-1)
(i < lim)-1
Otro ejemplo:
x && y == 0
(x && y) ==0)
x && (y ==0)
Asociación:
Izq. a derch.
x * y * 2; => (x * y) * 2;
Derch. a izq.
x = y = 2; => x = (y = 2);
Operador Asoc.
() [] -> . izq a
dch
! ~ ++ -- + - * (tipo) sizeof dch a
izq
* / % izq a
dch
+ - izq a
dch
<< >> izq a
dch
< <= > >= izq a
dch
== != izq a
dch
& izq a
dch
Precedencia
27. PROG-I /27PROG-I
Conversión de tipos
Conversión de tipos en expresiones.
Implícita. Se convierte de un tipo más restrictivo a otro menos
restrictivo sin problemas. Al revés supone perdida de
representación.
Explícita. Haciendo un casting (cambio de tipo temporal):
(tipo) expresión
int a;
float x = 24.6;
a = (int) x;
int a = 34, b = 25;
float x;
x = a / b; /* ¿x? */
x = (float) a / b; /* ¿x? */
x = a / (float) b; /* ¿x? */
x = (float) a / (float) b; /* ¿x? */
Curso 2009-10 27Tema 2 – Programación básica