Beruflich Dokumente
Kultur Dokumente
2. Estructura de programa
main funciones variables macros e inclusin de ficheros
6. Vectores y punteros
7. Structs
8. Librera de entrada/salida
Universidad de Zaragoza
T. Monreal, J.L. Briz & P. Ibez, 2003 Arquitectura y Tecnologa de Computadores - DIIS
Introduccin a C (1 de 2)
Desarrollado al mismo tiempo que UNIX Lenguaje estructurado Lenguaje de nivel medio
Ms cercano al ensamblador No fuertemente tipado conversin de tipos automtica Muy permisivo (tanto en compilacin como en ejecucin)
mucha libertad
poca seguridad
T. Monreal, J.L. Briz & P. Ibez, 2003 Arquitectura y Tecnologa de Computadores - DIIS
Introduccin a C (2 de 2)
1. Tipos: 2. Variables:
Declaracin: Asignacin: char d ; d = a ; int i , j ; i=5;
char, int
3. Entrada/Salida:
Estructura de programa
Todo programa en C consta de una varias funciones ESTRUCTURADO La funcin que siempre est presente: main() Todas las funciones declaradas al mismo nivel: Pascal
f1 f2 f4
f3 definida dentro de f1
C
main f1 f2 f3 f4 ...
f3 f5
T. Monreal, J.L. Briz & P. Ibez, 2003 Arquitectura y Tecnologa de Computadores - DIIS
Funciones (1 de 2)
Definicin:
char f(a1,a2) int a1; char a2; { ... }
tipo_f nombre_f (lista argumentos) declaracin de argumentos; { declaracin de variables locales; expresiones; }
Alusin: Llamada:
Devolucin: Argumentos:
Universidad de Zaragoza
T. Monreal, J.L. Briz & P. Ibez, 2003 Arquitectura y Tecnologa de Computadores - DIIS
Funciones (2 de 2)
funcin que suma dos elementos recibidos como argumentos y devuelve el resultado
devuelve
alusin int suma(); main(){ int i,j,k; llamada i=5; j=4; k=suma(i,j); printf(%d+%d = %d \ n, i,j,k); }
int suma(a,b) int a,b; { int aux; aux=a+b; return(aux); }
argumentos
variables locales return
definicin
Universidad de Zaragoza
T. Monreal, J.L. Briz & P. Ibez, 2003 Arquitectura y Tecnologa de Computadores - DIIS
Variables (1 de 3)
Definidas fuera o dentro de funciones Fuera:
auto (defecto): variable global conocida por todas las funciones definidas en el mismo fichero o en otros static: conocida solo por las funciones definidas en el propio fichero extern: declara que una variable est definida en otro fichero
Dentro:
auto (defecto): variable local a la funcin. Se crea espacio para ella en cada llamada a la funcin y se destruye al salir static: define una variable local a la funcin. Su valor se mantiene de una llamada a otra
Universidad de Zaragoza T. Monreal, J.L. Briz & P. Ibez, 2003 Arquitectura y Tecnologa de Computadores - DIIS
Variables (2 de 3)
Otros atributos:
register: indicacin al compilador para que mapee la variable sobre un registro fsico de la mquina (si es posible) volatil: indicacin al compilador para evitar optimizaciones sobre esta variable. Se usa para variables cuyo valor puede cambiar de forma ajena al programa. Ejemplo: mapear un registro de entrada/salida que puede ser modificado por un controlador
incrementar(){ int i; auto int j=1; static int k=1; i++;j++;k++;printf }
Universidad de Zaragoza
Variables (3 de 3)
locales
main(){ int aux; aux=5; f(); } char f(){ int aux; static int i=0; register int j; volatil int k; aux=4; }
globales
declaracin
int aux; static int i; main(){ aux=5; f(); inicializacin } char f(){ aux=4; }
Universidad de Zaragoza
T. Monreal, J.L. Briz & P. Ibez, 2003 Arquitectura y Tecnologa de Computadores - DIIS
(a > b ? a : b)
expresin resultado = a si expresin CIERTA resultado = b si expresin FALSA
Inclusin de ficheros
#include <stdio.h> #include milib.h
Universidad de Zaragoza
10
T. Monreal, J.L. Briz & P. Ibez, 2003 Arquitectura y Tecnologa de Computadores - DIIS
Compilacin
ejecutables
cc fichero.c cc fichero.c -o fichero
a.out fichero
fichero1.o
Universidad de Zaragoza
11
T. Monreal, J.L. Briz & P. Ibez, 2003 Arquitectura y Tecnologa de Computadores - DIIS
Control de flujo (1 de 2)
instrucciones de seleccin
if (expr.) { instr1; } else instr2;
instrucciones de iteracin
for (inic; cond; incr){ instrs; }
switch (expresin) { case ct0: instrs0; break ; case ct1: instrs1; break ; . . . default : instrsx; } goto etiqueta; ... etiqueta: sentencia;
Universidad de Zaragoza
12
T. Monreal, J.L. Briz & P. Ibez, 2003 Arquitectura y Tecnologa de Computadores - DIIS
Control de flujo (2 de 2)
instrucciones de seleccin
if (i==0) { x=1; } else x= y/i; switch (i) { case 0: c=0; break ; case 1: c=1; break ; default : c= ; } goto etiqueta; ... etiqueta: sentencia;
Universidad de Zaragoza
instrucciones de iteracin
for (i=0; i<10; i=i+1){ ... }
for( ; ; ); while(1);
cond != 0 TRUE cond == 0 FALSE
13
T. Monreal, J.L. Briz & P. Ibez, 2003 Arquitectura y Tecnologa de Computadores - DIIS
Tipos de datos (1 de 2)
enteros No estructurados escalares aritmticos coma flotante
float, double,... int, long int,...
caracter
void punteros arrays Estructurados structs
Universidad de Zaragoza
char
14
T. Monreal, J.L. Briz & P. Ibez, 2003 Arquitectura y Tecnologa de Computadores - DIIS
Tipos de datos (2 de 2)
Tipo carcter
entero char int
Constantes
c = a; c = 48; i = -5; i = 023; i = 0x30A; i = -5; i = -5L; i = 5;
N
short int long int unsigned real float 16 32
intN_t i;
short int i; long int i; unsigned short int i; uintN_t i; float f;
32
f = -5.3;
f = -0.0;
puntero
double *
64 32
f = -5.3e2; f = -5.3;
http://en.wikipedia.org/wiki/C_data_types
Universidad de Zaragoza
15
T. Monreal, J.L. Briz & P. Ibez, 2003 Arquitectura y Tecnologa de Computadores - DIIS
Operadores (1 de 3)
Clase
primario
Operadores
() [] -> .
Uso
x[5]
Operacin
quinto elemento del vector x
x.y
x -> y
unario
elemento y de la estructura x
elemento y de la estructura apuntada por x convierte e al tipo tipo
cast, sizeof
(tipo)e
&x
*x -x ~x a++ --a
toma la direccin de x
toma el valor contenido en la @x Cambio de signo de x complemento de x a nivel de bit toma el valor de a, luego incrementa a (notacin postfija) decrementa a, luego toma el valor de a (notacin prefija)
Universidad de Zaragoza
16
T. Monreal, J.L. Briz & P. Ibez, 2003 Arquitectura y Tecnologa de Computadores - DIIS
Operadores (2 de 3)
Clase
multiplicativo
Operadores
* / % (mdulo)
Uso
x * y x / y x veces y
Operacin
x dividido por y
x % y
aditivo
+ -
x + y x - y
shift
relacin
<< >>
< <= > >=
x >> y
a < b a >= b
igualdad
== !=
a == b a != b
& ^ |
x & y x ^ y x | y
Universidad de Zaragoza
17
Operadores (3 de 3)
Clase
AND lgica OR lgica condicional asignacin
Operadores
&& || ? : = += -= *= /= %= >>= <<= &= ^= |=
Uso
a && b a || b a ? b : c a = b a += b a >>= b a ^= b
Operacin
1 si a y b ciertos; 0 cc 1 si a b cierto; 0 cc b si a cierto; c caso contrario pone en a el valor de b pone en a el valor de a+b pone en a el valor de a>>b pone en a el valor de a^b
secuencias de escape:
Universidad de Zaragoza
18
T. Monreal, J.L. Briz & P. Ibez, 2003 Arquitectura y Tecnologa de Computadores - DIIS
Conversin de tipos
Implcita o automtica
multiplicacin float debido al 2.1
suma float debido al 3.0
num = 3 * 2.1
se convierte a float
int i;
i = 2.8;
se trunca el valor a 2 y se asigna a i
char -> short -> int -> long num = 3.0 + 1/(float)2 num = 3.0 + (float)1/2
19
T. Monreal, J.L. Briz & P. Ibez, 2003 Arquitectura y Tecnologa de Computadores - DIIS
Universidad de Zaragoza
Vectores
Definicin:
conjunto de variables del mismo tipo que se referencian por un nombre comn
Declaracin:
char v[10]; /* 10 elementos (v[0]...v[9]) que ocupan posiciones consecutivas de MEM */ int a[10]; /* a[0]...a[9] */ char w[5] = {a,e,i,o,u}; int i[3] = {1,2,3};
Inicializacin:
Uso:
v[5] = z; a[0] = 5;
Universidad de Zaragoza
Vectores multidimensionales
Declaracin:
char M[2][5]; /* 10 elementos que ocupan posiciones de MEM consecutivas por filas: M[0][0],M[0][1]...M[0][4],M[1][0]...M[1][4]*/
@ donde comienza el vector en MEM M (es una constante!)
MEM
M[1][0] M[1][1] M[1][2] M[1][3] M[1][4]
M[0] M[1]
Inicializacin: Uso:
M[0][2] = i; M[0][6]= E;
Universidad de Zaragoza
21
T. Monreal, J.L. Briz & P. Ibez, 2003 Arquitectura y Tecnologa de Computadores - DIIS
Punteros
Definicin: Declaracin: Operadores:
& devuelve la @ de MEM del operando
p @ c
variable que contiene la direccin de MEM de una variable de un tipo dado char *p; /* p es un puntero a carcter */ int *q; /*OJO: sin inicializar, NO apunta a ningn sitio */ p = &c; q = &i; (char c; int i;)
MEM p apunta a c
devuelve el valor almacenado en la @ especificada d = *p; j = *q; d recibe el valor que hay en la @ a la que apunta p (char d; int j;)
Universidad de Zaragoza
22
T. Monreal, J.L. Briz & P. Ibez, 2003 Arquitectura y Tecnologa de Computadores - DIIS
Ejemplos punteros
#include <stdio.h> main(){ int dest, orig; int *m; orig=5; m=&orig; dest=*m; printf(%d,dest);
orig:10 m:20
5
10 qu ocurre con: *m = 6; y con: dest = orig;
dest:50
El nombre de un vector = puntero al primer elemento del vector = direccin del primer elemento del vector
es una constante!
Universidad de Zaragoza
Cualquier variable puntero puede indexarse como si estuviera declarada como un vector
q = v2; *(q + 1) = 100;
24
q[1] = 100;
T. Monreal, J.L. Briz & P. Ibez, 2003 Arquitectura y Tecnologa de Computadores - DIIS
Universidad de Zaragoza
Vectores de punteros
char *v[3]; v
CUIDADO!!
char v[5], m[5]; char *p, v1[10]; v = m; /* ERROR!! (v es una constante) */ v1 = p; /* lo mismo */ v++; /* lo mismo */ v[0] = m[0]; ??
T. Monreal, J.L. Briz & P. Ibez, 2003 Arquitectura y Tecnologa de Computadores - DIIS
Universidad de Zaragoza
25
26
T. Monreal, J.L. Briz & P. Ibez, 2003 Arquitectura y Tecnologa de Computadores - DIIS
Strings
Un string es un vector de char acabado con el carcter \0:
char v[6] = {L,U,N,E,S,\0};
Una constante string es una secuencia de caracteres entre comillas dobles: esto es un string /* que acaba con el carcter \0 */
char v[6] = LUNES; /* lo mismo de arriba */ char *p = LUNES; char v[5] = LUNES; char *p; p = MARTES; nooo!! char v[6]; v = MARTES; char c, *p=LUNES; c = *(p+3); /*asigna E a c */ c = p[3]; /* lo mismo */
Universidad de Zaragoza
27
T. Monreal, J.L. Briz & P. Ibez, 2003 Arquitectura y Tecnologa de Computadores - DIIS
Punteros a funciones
El nombre de una funcin es una constante cuyo valor es la @ inicial de la funcin Se puede declarar una variable para contener la @ de una funcin:
int (*p)( ); /* p es un puntero a funciones que devuelven enteros */
/* p es una funcin que devuelve un puntero a entero */ void suma(f1,f2,d);/* la misma de antes */ void (*p)(); p = suma; (*p)(i,j,&k); /*lo mismo que: suma(i,j,&k);*/
28
T. Monreal, J.L. Briz & P. Ibez, 2003 Arquitectura y Tecnologa de Computadores - DIIS
Universidad de Zaragoza
29
T. Monreal, J.L. Briz & P. Ibez, 2003 Arquitectura y Tecnologa de Computadores - DIIS
Estructuras (structs)
Estructura de datos compuesta por elementos individuales que pueden ser de distinto tipo A cada elemento de la estructura se le llama miembro/campo Definicin:
struct nombre_estructura { tipo1 campo1; tipo2 campo2; ... tipoN campoN; };
Ejemplos:
struct fecha { int mes; int dia; int anyo; }; struct fecha hoy; struct cuenta { int cuenta_no; char nombre[80]; float saldo; struct fecha ultimopago; };
Universidad de Zaragoza
30
T. Monreal, J.L. Briz & P. Ibez, 2003 Arquitectura y Tecnologa de Computadores - DIIS
Copio estructuras
struct fecha hoy, ayer; ayer = hoy;
A una funcin se le puede pasar una estructura entera o alguno de sus campos (por valor)
void imprimir_fecha (struct fecha f) { printf(Dia: %d\n, f.dia); printf(Mes: %d\n, f.mes); printf(Ao: %d\n, f.anyo); return; }
Universidad de Zaragoza
31
T. Monreal, J.L. Briz & P. Ibez, 2003 Arquitectura y Tecnologa de Computadores - DIIS
f->mes = 10;
32
T. Monreal, J.L. Briz & P. Ibez, 2003 Arquitectura y Tecnologa de Computadores - DIIS
33
T. Monreal, J.L. Briz & P. Ibez, 2003 Arquitectura y Tecnologa de Computadores - DIIS
Librera de entrada/salida
stdin, stdout, stderr
extern int printf(const char *, ...); extern int scanf(const char *, ...); extern int fprintf(FILE *, const char *, ...); extern int fscanf(FILE *, const char *, ...); extern int getchar(void); extern char *gets(char *); extern int putchar(int); extern int puts(const char *); ...
Universidad de Zaragoza
34
T. Monreal, J.L. Briz & P. Ibez, 2003 Arquitectura y Tecnologa de Computadores - DIIS
printf(%d \ n, i);
printf(%d \ n, c); printf(%f \ n, r); printf(%x \ n, i); ...
char c=a;
float r=3.1416;
Universidad de Zaragoza
35
T. Monreal, J.L. Briz & P. Ibez, 2003 Arquitectura y Tecnologa de Computadores - DIIS
Ejemplo: cinco.c
#include<stdio.h> main() { int j = 5; char ch; printf("\nIntro. un caracter: "); ch = getc(stdin); printf("\n\tEl codigo de %c es %d", ch, ch); ch += j; printf("\n\tEl codigo de %c es %d\n", ch, ch); }
Ejemplo: doce.c
#include <stdio.h> main() { static int ar[4] = {1, 2, 3, 4}; int *p; p = &ar[0]; printf("\n\tEl 1er. elemento de ar es %d \n", *p); printf("\tEl segundo es %d \n", *(p+1)); printf("\tLa direc. de comienzo de ar \ es %x, %x o %x \n\n", p, &ar[0], ar ); }
Ejemplo: trece.c
#include <stdio.h> void intercambia( x, y ) int x, y; { int tmp; tmp = x; x = y; y = tmp; } main(){ int a = 1, b = 2; intercambia( a, b ); printf("\n\ta = %d\tb = %d\n", a, b ); }