530 likes | 846 Views
El lenguaje C. Introducción. Palabras claves. Estructura de un programa. # include <stdio.h> // variables externas a usar int main() { printf(“Hello, world."); return 0; }. Directiva al preprocesador. Estructura de un programa. # include < stdio.h >
E N D
El lenguaje C Introducción
Estructura de un programa # include <stdio.h> // variables externas a usar int main() { printf(“Hello, world."); return 0; } Directiva al preprocesador
Estructura de un programa #include <stdio.h> intmain(){ /* Thisis a commentignoredbythecompiler */ intindex; /*con definicion del lugar de almacenamiento sería: intindex @0x00c1;*/ index = 13; printf("Thevalue of theindexis %d\n", index); index = 27; printf("Thevalue of theindexis %d\n", index); return 0; }
Estructura de un programa «grande» • Uso de archivos cabecera (.h) por lo general sólo contienen definiciones de tipos de datos, prototipos de funciones y comandos del preprocesador de C • Uso de varios archivos .c por lo general con un preámbulo consistente de las definiciones de constantes, cabeceras a incluir, definición de tipos de datos, declaración de variables globales y externas (e inicializacion), y una o más funciones
Estructura de un programa «grande» • División en directorios Por lo general agrupando los archivos relacionados o bajo cierta lógica • Uso de make y makefile Para una fácil y consistente compilación • Uso de macros en make típicamente usadas para guardar nombres de archivos fuente, nombres de archivos objeto, opciones del compilador o links a bibliotecas
Tipos de datos • char (1 byte) • int (2 bytes) • float (4 bytes) • double (8 bytes) • void • short – long – signed - unsigned
Constantes • 2323 int • 5656L long • 78.56 float • 89e-2 float • 56.9L double • 033 octal • 0xf1 hexadecimal • 0xFUL unsigned long (15 en decimal)
Constantes • ‘n’ caracter • ‘\000’ carácter (representado en octal) • ‘\xhh’ carácter (representado en hexa)
Constantes • Enumeración: es una lista de valores enteros constantes. Es una opcion al #define. enum opcion {SI,NO,TALVEZ}; //SI vale 1, NO vale2, y así sucesivamente. enum dia {LUNES=1, MARTES=2, ...DOMINGO=‘F’} dia k; k=LUNES; k=3;
Identificadores • El primer carácter debe ser una letra, después puede haber letras, números o guión bajo. • Es sensible a mayúsculas y minúsculas. • Hasta 31 caracteres.
Variables • Deben declararse antes de utilizarse y pueden ser: • externas: se definen sólo una vez, fuera de toda función y se declaran extern (implícita o explicitamente) en cada función que las vaya a utilizar, siendo comunes a todas. Son inicializadas a 0 por omisión. • internas (o automáticas): son declaradas dentro de una función y solo existen en ellas. No tienen una inicialización por omisión, quedan indefinidas en su valor inicial si no se las inicializa explícitamente.
Variables • Las variables pueden ser: • estáticas: son visibles sólo dentro del archivo fuente (externas) o función (internas) en donde se declaran. Las estáticas internas mantienen su valor en sucesivos llamados a la función. Son inicializadas a 0 por omisión. Se deben inicializar con un valor o una expresión constante. • register: le indica al compilador que la variable será muy usada. El compilador decidirá si será almacenada en un registro. No poseen inicialización por omisión.
Calificadores de tipo • Sirven para dar características especiales a los objetos (variables) que están siendo declarados: • const: se puede inicializar, pero después no puede cambiarse el valor • volatile: le indica al complilador que su contenido puede variar mas allá del flujo del programa (no son optimizables)
Calificador de tipo volatile int z=8; intmain(){ for (int k=1;k<=100;k++){ printf("Z vale%d\n", z); } } ¿Y si Z cambia su valor por factores externos?
Ejemplos const y volatile La comillas dobles definen una cadena constdouble e = 2.7182 constcharmsg [] = “warning:” intstrlen (constchar []); constinthex = 0x80A; /* 2058 en decimal */ constint oct = 012; /* 10 en decimal */ volativeint k=2; volativeunsignedchar puerto1 @0x00000002
Arreglos y Cadenas intdigitos [10]; int valores[] = {3,4,5,6,7}; // longitud 5 charpatron [] = “salida”; es equivalente a: charpatron [] = {‘s’, ‘a’, ‘l’, ‘i’, ‘d’, ‘a’, ‘\0’} // longitud 7
Sentencias de control • while • do...while • for • if ..else • break • continue • switch
Funciones • En general un programa en C son muchas funciones de pequeño tamaño, y no pocas funciones de gran tamaño. • La comunicación entre las funciones es por los argumentos, valores de retorno y a través de variables externas. • Los argumentos son pasados por valor.
rótulo opcional Estructuras de datos • struct: Colección de variables de distinto tipo, agrupadas bajo un nombre. En memoria puedo almacenar cualquier variable del tipo struct que se defina
Estructuras • Las estructuras se pueden anidar : struct rect { struct point p; struct point z; } ; ... struct rect ventana; ventana.p.x =25;
Estructuras y funciones • Las estructuras se puede pasar como argumentos de funciones. structpoint pt = {3,5}; structpoint *pp; pp = &pt; • pasar la estructura completa (pt): voidfuncion( structpointw) • pasar un componente de la estructura (pt.x): voidfuncion( int w) • pasar un puntero a una estructura (pp) voidfuncion( structpoint*w)
Arreglos de estructuras structmessage { int emisor; int receptor ; char datos [50]; } structmessagebuffer[50]; buffer[0].emisor=0;
Uniones • Es semejante a una estructura, pero los campos que declaramos en una unión ocupan todos la misma posición de memoria. • Solo se puede almacenar un campo por vez. • Cuando se define una unión solo se reserva espacio para almacenar el campo de mayor tamaño. • Permite manejar distintos tipos de datos en una misma área de almacenamiento • El programador es responsable del uso debiendo asignar y recuperar coherentemente.
Uniones union ejemplo { int entero; //16 bits charcaracter; //8 bits } mi_var; mi_var. entero =0; // solo se puede incializar mediante el primer miembro mi_var. caracter =‘A’; //(como el carácter ASCII de A es 65, mi_var.enterovale 65, es decir 000000001000001) mi_var. entero= 65; // pero no es seguro que mi_var.caracter sea una ‘A’
Puede ser cualquier numero de bits Campo de bits • Es un conjunto de bits adyacentes, agrupados, en una palabra. • Los bits se manipulan según su tipo declarado struct { unsigned int ctrl_compresor :1; unsigned int ctrl_cinta :1; unsigned int ctrl_quemador :1; } control; ... control.ctrl_compresor=1; //enciende el compresor
Creación de tipos de datos • La instrucción typedef crea una definicion de un tipo de datos: typedef int Longitud; hace que Longitud sea un sinónimo de int. Luego se puede hacer: Longitud k; lo que declara k del tipo Longitud, con todas sus características.
Ejemplos de creación de tipos de datos typedef struct { int coor_x; int coor_y; } Complejo; crea el tipo Complejo que es análogo a la estructura definida en este caso.
Ejemplos de creación de tipos de datos typedef unsigned char byte; //crea el tipo byte typedef union { byte Byte; struct { byte b0 :1; byte b1 :1; byte b2 :1; byte b3 :1; } Bits; } Control; //crea el tipo Control luego: Control Z; Z.Byte= 4; Z.Bits.b2=˜Z.Bits.b2;
Entrada/Salida • El C no tiene instrucciones específicas para I/O. • Existen un conjunto de funciones para I/O desarrolladas y agrupadas en la biblioteca (library) estándar (ANSI): stdio.h #include <stdio.h> //incluye en el programa todas las funciones de la librería.
Salida con formato • intprintf(“Cadena de control”, variables, operaciones, ...); printf(“La salida es %6.1f:”,temp); campo
Entrada con formato • int scanf(“Cadena de control”, variable, variable, ...); • La variable o variables que se van a introducir tendrán que ir acompañadas delante del nombre por el signo & (son punteros).
Ejemplo E/S #include <stdio.h> main() { int edad; char nombre[20]; printf(“Introduce nombre: \n“); scanf(“%s”, nombre); printf(“Introduce edad: \n”); scanf(“%d”, &edad); printf(“Tu nombre es %s y tienes %d años. \n”, nombre, edad); } debe ser lo suficientemente grande
Caracteres de control • d entero decimal • c carácter • s tira de caracteres • f número de punto flotante con notación decimal • e número de punto flotante con notación exponencial • u entero decimal sin signo • o entero octal sin signo • x entero hexadecimal sin signo (minúsculas) • X entero hexadecimal sin signo (mayúsculas) • p puntero
Funciones para manejar caracteres • int getchar(void ): captura caracteres uno a uno desde la entrada estándar char variable; variable=getchar();
Funciones para manejar caracteres • int putchar(int): imprime caracteres uno a uno en la salida estandar y devuelve el carácter escrito o EOF si hubo error. char variable=‘m’; putchar(variable);
Proceso de compilación • La compilación de un programa C se realiza en varias fases que normalmente son automatizadas y ocultadas por los entornos de desarrollo: • Preprocesado: consistente en modificar el código en C según una serie de directivas de preprocesador. simplificando de esta forma el trabajo del compilador. • Compilación: que genera el código objeto a partir del código ya preprocesado. • Enlazado: que une los códigos objeto de los distintos módulos y bibliotecas externas (como las bibliotecas del sistema) para generar el programa ejecutable final.
Directivas al preprocesador • Facilidad del lenguaje: • Inclusión de archivos include • Definición de macros define • Operador ## • Inclusion condicional # if !defined ......
Directivas al preprocesador • Inclusión de archivos: #include “nombrearchivo” o #include <nombrearchivo> • Incluye el contenido del archivo en donde se encuentra el include • El proceso es recursivo
Directivas al preprocesador • Sustitución de macros: #define nombre texto_de_reemplazo • Reemplza nombre por texto_de_reemplazo en todo el codigo subsiguiente • Puede manejar argumentos • La sintaxis debe manejarse con mucho cuidado
Directivas al preprocesador • Ejemplo: #define PI 3.1416 #define max(A,B) ((A)>(B)?(A):(B)) Si mas adelante en el código en el código dice: x=max(p+g,PI); Quedará: x=((p+g) > (3.1416) ? (p+g) : (3.1416)); Antes de compilar.
Directivas al preprocesador #undef nombre • asegura que nombre no será sustituido ## • Concatena argumentos reales durante la sustitucion Ejemplo: #define unir(inicio,fin) inicio ## fin Hace que: A[unir(zapa,tero)]; Pase a ser: A[zapatero];
Directivas al preprocesador • Inclusión condicional: #if MICRO == INTEL #define LIBRERIA “intel.h” #elif MICRO == AMD #define LIBRERÍA “amd.h” #else #define LIBRERÍA ... /*aquí va la definicion de la librería generica*/ ... #endif #include LIBRERIA
Directivas al preprocesador • #IFDEF, #IFNDEF • Son If especializados que testean si un nombre está definido #ifndef LIBRERÍA #define LIBRERÍA .... #endif