Академический Документы
Профессиональный Документы
Культура Документы
Juan C. Dueas <jcduenas@dit.upm.es> Joaqun Seoane <jseoane@dit.upm.es> T. de Miguel <tmiguel@dit.upm.es> A. Gmez Flechoso <anto@dit.upm.es> Dpto. Ingeniera de Sistemas Telemticos Universidad Politcnica de Madrid
El lenguaje C, diapositiva 1 (22/08/06)
dit UPM
Objetivos
Leer y escribir programas en ANSI C 1. Tipos de datos simples 2. Estructuras de control 3. Funciones 4. Datos estructurados 5. Punteros 6. Preprocesador
dit UPM
Historia de C
BCPL (1967), B (1970) no tipados, de sistemas. C (Ritchie, 1972), tipado, para SO porttiles. Ligado a UNIX desde 1973. ANSI-C (1989). ISO-C (1990). C99 (1999) Objective C. C++ (Stroustrup-Bell Labs- 1980s), orientado a objetos. Java (Gosling, 1997), orientado a objetos. Inicialmente empotrados, reorientado hacia Internet. Independiente de la plataforma. C# (Microsoft)
dit UPM
Caractersticas de C
C no es orientado a objetos:
Bajo nivel, poco tipado, inseguro Acceso directo a primitivas del SO (llamadas al sistema) Gestin de memoria explcita en C (programador) El compilador de C hace pocas comprobaciones de tipos Los fallos suelen detectarse en tiempo de ejecucin (depurador imprescindible para programador de C)
dit UPM
Estructura de un programa
// Rutinas.java public class Rutinas { static void rutina() {} public static void main(String[]args) { int i, N; N= Integer.parseInt(args[0]); for (i=0; i<N; i++) rutina(); System.out.println(i); } /* rutinas.c */ #include <stdlib.h> #include <stdio.h> void rutina(void) {} int main(int argc,char* argv[]){ int i, N; N = atoi(argv[1]); for (i=0; i<N; i++)rutina(); printf("%d\n", i); exit(0); }
dit UPM
Tipos de datos
Fundamentales:
Derivados:
dit UPM
Tipos fundamentales
Similares en Java:
void /* representa la nada o un tipo indefinido */ char c = s; /* entero 8 bits, suele representar un carcter */ int i = 25; /* entero de 16 32 bits */ float f = 0.56; /* coma flotante de precisin simple */ double d = 0.56; /* coma flotante de doble precisin */ En C no existe boolean! (las expresiones lgicas devuelven int) (C99 tiene boolean y complex) Tamao: short, long, long long (C99) Signo: signed, unsigned (en Java no hay unsigned) sizeof(char) = 1 sizeof (short) <= sizeof (int) <= sizeof (long) <= sizeof(long long) >= 2 >= 2 >= 4 >= 8
Modificadores enteros:
dit UPM
Conversiones y operadores
x Igual que en Java:
Conversin de tipos:
Implcita, promocin al de ms rango: int + float = float Explcita: (double) integer Aritmticos (+ - * / %) Relacionales y lgicos (> >= < <= == != && || !) Manejo de bits (& | ^ << >> ~) Incremento/decremento (i++ ++i --i) Evaluacin condicional (a>b) ? a : b Son operadores: a = b + 1; x = y = z = 3; u = (v = x) + y Combinables con otros operadores: i += 2; mask <<= 3;
Operadores:
Asignaciones
dit UPM
Estructuras de control
xIgual que en Java:
Bloques:
Control de flujo:
Condicionales (if-else) Decisin mltiple (switch) Bucles while-do y do-while Bucle for En los bucles se puede utilizar break y continue
dit UPM
Evaluacin de expresiones
Devuelven valor entero (en C no existe tipo boolean) 0 es falso, el resto cierto
if (! --vueltas) exit(0);
parntesis reglas de precedencia y agrupacin de los operadores no se especifica en qu orden se evalan los operandos de un operador
x = f() + g(); /* f y g, o g y f ? */
dit UPM
Precedencia y agrupacin
Operador () [] -> . ! ~ ++ -- - (cast) * & sizeof * / % + - << >> < <= > >= == != & ^ && || ?: = += -= ,
El lenguaje C, diapositiva 11 (22/08/06)
<->
dit UPM
Ejempos
= = =
dit UPM
Funciones
dit UPM
Declaracin de funciones
La declaracin de funciones suele hacerse en ficheros .h Se utiliza void para declarar funciones sin argumentos:
int mifunc(void); /* En Java sera: int mifunc() */ () significa argumentos no especificados
dit UPM
La declaracin es:
printf(char* fmt, );
dit UPM
Tipos derivados en C
dit UPM
Enumeracin
Define un subconjunto dentro de los enteros Enumeracin con valores asignados de forma implcita o explcita. Cada elemento tiene un identificador
enum { vacio = 0, lleno = 1, borrado = 2 } var; enum { vacio, lleno, borrado } var;
dit UPM
Definicin de tipos
typedef enum { vacio = 0, lleno = 1, borrado = 2 } estado; estado var;
dit UPM
Tradicional: enum estado {vacio, lleno, borrado}; enum estado v1, v2, v3;
Ansi: typedef enum {vacio, lleno, borrado} estado; estado v1, v2, v3;
El lenguaje C, diapositiva 19 (22/08/06)
dit UPM
Matrices (vectores)
Accesibles mediante un ndice (0 .. MAX-1) Dimensin: nmero de ndices necesarios Tipo base: cualquiera Tipo ndice: expresin entera
Las cadenas de caracteres son matrices de char terminadas en \0 (no existe tipo String)
char mensaje[] = "Hola amigo\n";
dit UPM
Punteros
Apunta a una variable de tipo base En Java es implcita (excepto la reserva de memoria)
dit UPM
Punteros
Declaracin de variables
int y; int* py; (tambin int *py;)
direccin
py
6000
5000
Asignacin de valores
y = 7;
6000
dit UPM
Ejemplo
#include <stdio.h> void myStrCopy (char *dest, char *src) { while (*src != '\0') *(dest++) = *(src++); *dest = '\0'; } int main (void) { char *s = "Cadena largaaaaaaaaa"; char t[] = "Cadena corta"; printf ("%s, %s\n", s, t); myStrCopy (t, s); printf ("%s, %s\n", s, t); } Impredecibledespusdecopia!!!!
dit UPM
Ejemplo
dit UPM
Puntero NULL
Valor comn para todos los tipos puntero Porttil, definido en <stdlib.h> Asignacin
pc = pv = NULL;
dit UPM
dit UPM
Referencias en Java
// En Java no se puede pasar referencia a tipo bsico class IntValue { int n; IntValue(int x){ n = x;} static int a.n b.n } } IntValue a, b; a= new IntValue(3); IntValue.swap(a, b);
El lenguaje C, diapositiva 27 (22/08/06)
b= new IntValue(5);
dit UPM
Punteros y matrices
Matriz = puntero constante al comienzo El tamao de una matriz debe conocerse a priori (excepto parmetros) Los punteros permiten hacer matrices de tamao variable, submatrices, etc.
dit UPM
Punteros y matrices
int a[3]; int *pa; pa = & a[0]; pa = a; x = *pa; x = *(pa + 1); x = *(pa + i);
a[0]
El lenguaje C, diapositiva 29 (22/08/06)
a[1]
a[2]
dit UPM
*pi
*(pi+1)
*(pi+2)
98
*pc
El lenguaje C, diapositiva 30 (22/08/06)
*(pc+1)
*(pc+2)
dit UPM
Aritmtica de punteros
El incremento subyacente es multiplicado por el tamao del tipo base Se entiende que el puntero puede apuntar a un array indefinido de elementos del tipo base Nos da la distancia entre elementos del array
dit UPM
Argumentos de main
int main(int argc, char**argv, char** envp) int main(int argc, char* argv[], char* envp[]) /* en Java era: void main(String[])) */ > ping cuentas argv = argc = 2
ping\0 cuentas\0 NULL NULL
envp =
PATH=/home/lprs\0 INCLUDE=/usr/include\0 TMP=/tmp\0
dit UPM
Estructuras
Agregacin de elementos posiblemente heterogneos Campos accesibles mediante el nombre typedef struct { int lclave; int lvalor; int lreg; int nreg; void* dreg; } desc;
// Equivalente en Java
public class desc { int lclave; int lvalor; int lreg; int nreg; Object dreg; }
dit UPM
Punteros a estructuras
desc *pd, *pd2; (*pd2).nreg = (*pd).nreg/100 + 1; pd2->nreg = pd->nreg/100 + 1;
-> Operador especial para acceso a campos desde un puntero a la estructura, unin
dit UPM
Uniones
Superposicin de elementos heterogneos Campos excluyentes en el tiempo Ocupa la memoria del campo mayor Inseguras (no incluyen clave del tipo activo)
typedef union { int float ... } valores; i; f;
dit UPM
Punteros y funciones
Se puede apuntar a la memoria donde comienza una funcin Se define el tipo de las funciones
Las funciones definidas que lo cumplan son valores del tipo Vlido para callbacks
dit UPM
Punteros a funcin
typedef double (*freal)(double); freal f; double ident(double x) { return x;} float integral(freal f, double a, double b) { double x, i, dx; dx = (b-a)/100000.0; for (x = a, i = 0.0; x <= b; x+= dx) i = i + f(x)*dx; return i; } f= ident; printf("%5.3f\n", integral(f, 0.0, 1.0)); f= sin; printf("%5.3f\n", integral(f, 0.0, 3.141592));
El lenguaje C, diapositiva 37 (22/08/06)
dit UPM
Preprocesador
xDefinicin de constantes
#define PI 3.14159264 #define LONGCAB (4 * sizeof (int))
Macros
#define area_circulo (r) PI * r * r
y = area_circulo(a+b); y = PI * a+b * a+b;
dit UPM
Inclusin de ficheros
#include asocv.h #include <stdio.h>
dit UPM
Compilacin condicional
#ifdef MSDOS borra (c:\\TMP\\xx); #endif #ifdef UNIX borra (/tmp/xx); #endif #if MACH == MC88000 #else ... #endif ... ... #elif MACH == IAPX803386
dit UPM
Bibliografa
1. Tipos de datos simples 2. Estructuras de control 3. Funciones 4. Datos estructurados 5. Punteros 6. Preprocesador
[Kernighan],cap. 2 [Kernighan],cap. 3 [Kernighan],cap. 4 [Kernighan],cap. 5,6 [Kernighan],cap. 5 [Kernighan],cap. 4
dit UPM