Está en la página 1de 39

Sistemas Operativos

Curso rpido de Lenguaje C

Curso rpido de Lenguaje C


1. Introduccin 5. Datos

2. Estructura de programa
main funciones variables macros e inclusin de ficheros

tipos, tamaos y declaraciones constantes, operadores y conversin

6. Vectores y punteros

3. Compilacin 4. Control de flujo


bucles condicionales saltos

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

Lenguaje creado por programadores para programadores EXPERTOS


Universidad de Zaragoza

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:

%c: interpreta d como un char

d = getchar(); printf(quiero imprimir la variable d : %c \n,d);


el salto de lnea
Universidad de Zaragoza T. Monreal, J.L. Briz & P. Ibez, 2003 Arquitectura y Tecnologa de Computadores - DIIS

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

En C NO se pueden declarar funciones dentro de otras funciones


Universidad de Zaragoza

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:

necesaria cuando se declaran despus del main


tipo_f nombre_f ();
c = f(i,c1);

variable = nombre_f (argumentos);


return(expresin);
char f(p1,p2) int *p1; char *p2;

Devolucin: Argumentos:
Universidad de Zaragoza

siempre por valor se pueden pasar @s de variables


5

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

main(){ incrementar(); incrementar(); incrementar(); }

incremento en 1 unidad (notacin postfija)


8
T. Monreal, J.L. Briz & P. Ibez, 2003 Arquitectura y Tecnologa de Computadores - DIIS

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

Macros e inclusin de ficheros


Sustitucin de constantes y macros
#define falso 0 #define max(a,b)
el compilador sustituye cada aparicin de la macro por su valor

(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

los de la biblioteca estndar de C mis funciones

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

cc fichero1.c fichero2.c -o fichero

cc -c fichero1.c cc fichero1.o fichero2.c -o 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; }

clusula else opcional

switch (expresin) { case ct0: instrs0; break ; case ct1: instrs1; break ; . . . default : instrsx; } goto etiqueta; ... etiqueta: sentencia;
Universidad de Zaragoza

while (cond) { instrs; } do { instrs; } while (cond)

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){ ... }

ej. bucles infinitos


while (i>0) { ... i=i-1; } do { ... i=i-1; } while (i>0)

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

bits Declaracin 8 char c;


32 int i;

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

double f; int *p; char *q;

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

sizeof(t) tamao en bytes de t

& (direccin de)


* (contenido de) - + ~ ++ -- !

&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

resto de x dividido por y


x ms y x menos y

+ -

x + y x - y

shift
relacin

<< >>
< <= > >=

x >> y
a < b a >= b

x desplazado a la drcha. y bits


1 si a menor que b; 0 cc 1 si a mayor o igual que b; 0 cc 1 si a es igual a b; 0 cc 1 si a no es igual a b; 0 cc AND entre x e y a nivel de bit XOR entre x e y a nivel de bit OR entre x e y a nivel de bit
T. Monreal, J.L. Briz & P. Ibez, 2003 Arquitectura y Tecnologa de Computadores - DIIS

igualdad

== !=

a == b a != b

bitwise AND bitwise OR excl. bitwise OR incl.

& ^ |

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:

\n nueva lnea \t tabulador horizontal

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

num = 3.0 + 1/2 (float num;)


1 divisin entera

Por asignacin Widening Explcitas (cast)

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;

/* asigno el valor 5 al elemento 0 del vector a */


20
T. Monreal, J.L. Briz & P. Ibez, 2003 Arquitectura y Tecnologa de Computadores - DIIS

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;

char M[2][5] = { {a,e,i,o,u}, {A,E,I,O,U} };

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!

char v[10], *p;

p = v; /* p apunta al primer elemento */ p = &v[0]; /* lo mismo */


23
T. Monreal, J.L. Briz & P. Ibez, 2003 Arquitectura y Tecnologa de Computadores - DIIS

Universidad de Zaragoza

Operaciones con punteros


Todas las operaciones con punteros se hacen de acuerdo a su tipo base:
int *m; m = m + 1; m = m + i; m++; /* m = m + (1*sizeof(int)) */ /* m = m + (i*sizeof(int)) */ v1[5] = c; v1[5] = *p; *p = v1[4]; p = v1; c = v1[3]; c = *(p+3);

char *p, v1[10], c;

long int *q, v2[5], i;

q = v2; i = v2[2]; i = *(q+2); i = *q + 2; ??

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

Se reserva espacio para 3 punteros a carcter

* char * char * char

v[0] v[1] v[2]

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

Funciones. Paso de argumentos


RECORDAR: el paso de argumentos siempre es por valor funcion(m[0]); /* el 1er. elemento del vector m */ PERO: Si queremos conseguir paso por referencia hay que pasar como argumentos las @s de las variables (punteros) funcion(m); /* direccin del vector */
void suma (f1, f2, d) int f1, f2, *d; { *d = f1 + f2; } main(){ int i,j,k; i=5; j=4; suma(i,j,&k); printf(%d+%d=%d,i,j,k); }
Universidad de Zaragoza

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 */

CUIDADO!! int *p( );

/* 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

Errores comunes con punteros


char caracter, cadena[10]; char *ptr1=11 espacios, *ptr2, *ptr3, *ptr4; char ch = a; char *p = a; cadena = mal; cadena[5] = A; ptr1=OK; *ptr2=bien; *ptr3 = caracter; ptr4 =a; ptr4=cadena;
Universidad de Zaragoza

ptr1[5] = B; ptr2=OK; cadena++; *ptr4=a;

caracter = *(cadena + 4);

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

Operaciones con structs (1 de 3)


Accedo a cada campo de la estructura a travs del operador .
struct fecha hoy; printf(%d: %d: %d\n, hoy.dia, hoy.mes, hoy.anyo);

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

Operaciones con structs (2 de 3)


Puedo declarar punteros a estructuras
struct fecha hoy; struct fecha *f; hoy.dia = 16; f = &hoy;
ahora el acceso a los campos se hace con el operador ->

f->mes = 10;

A una funcin se le puede pasar un puntero a una estructura (por referencia)


void imprimir_fecha(f) 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

32

T. Monreal, J.L. Briz & P. Ibez, 2003 Arquitectura y Tecnologa de Computadores - DIIS

Operaciones con structs (3 de 3)


Se pueden definir vectores cuyos elementos sean estructuras:
struct fecha semana[7]; semana[0].dia = 15; semana[1].dia = 16;
struct punto{ float x; float y; } main(){ struct punto vector_p[10]; int j; for(j=0;j<10;j++){ printf(x_%d=%f \ n,j,vector_p[j].x); printf(y_%d=%f \ n,j,vector_p[j].y); } }
Universidad de Zaragoza

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

Librera de entrada/salida (ejemplos)


printf(%c \ n, c); int i=245;

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 ); }