INTRODUCCIÓN AL LENGUAJE DE PROGRAMACIÓN C · PDF fileCómo programar en...

34
Programación en Entornos Multitarea Curso 2006/2007 INTRODUCCIÓN AL LENGUAJE DE PROGRAMACIÓN C Departamento de Enxeñería Telemática Universidade de Vigo

Transcript of INTRODUCCIÓN AL LENGUAJE DE PROGRAMACIÓN C · PDF fileCómo programar en...

Programación en Entornos MultitareaCurso 2006/2007

INTRODUCCIÓN AL LENGUAJE DE PROGRAMACIÓN C

Departamento de Enxeñería TelemáticaUniversidade de Vigo

Curso 06/07 Programación en Entornos Multitarea 2

Introducción

Departamento de Enxeñería TelemáticaUniversidade de Vigo

C: lenguaje de medio nivel32 palabras claveEficiencia de ejecución del códigogeneradoPortabilidadApenas impone restricciones

Curso 06/07 Programación en Entornos Multitarea 3

Introducción

Departamento de Enxeñería TelemáticaUniversidade de Vigo

Permite programación estructuradaProgramador experimentadoProgramación en Entornos Multitarea:

MultiusuarioMultitarea

Tiempocompartido

Curso 06/07 Programación en Entornos Multitarea 4

Generalidades de C

Departamento de Enxeñería TelemáticaUniversidade de Vigo

Sentencias simples finalizadas en ;Sentencias compuestas entre llaves {...}Símbolo de asignación =Comentarios /* */Sentencias de la forma:

variable = variable operador expresion;

se pueden escribir también:variable operador = expresion;

Curso 06/07 Programación en Entornos Multitarea 5

#include <stdio.h>

/* Mi primer programa */

int main() {printf(“Bienvenido a C!\n”);exit(0);

}

Ejemplo 1. Primer programa en C

Departamento de Enxeñería TelemáticaUniversidade de Vigo

#include <stdio.h>

/* Mi primer programa */

int main() {printf(“Bienvenido a C!\n”);exit(0);

}

#include <stdio.h>

/* Mi primer programa */

int main() {printf(“Bienvenido a C!\n”);exit(0);

}

#include <stdio.h>

/* Mi primer programa */

int main() {printf(“Bienvenido a C!\n”);exit(0);

}

Curso 06/07 Programación en Entornos Multitarea 6

Ejemplo 2. Programa suma

Departamento de Enxeñería TelemáticaUniversidade de Vigo

/* Programa suma */#include <stdio.h>int main() {

int entero1, entero2, suma; /* declaración var */printf(“Introduzca el primer entero:\n”);scanf(“%d”, &entero1);printf(“Introduzca el segundo entero:\n”);scanf(“%d”, &entero2);suma = entero1 + entero2;printf(“La suma de %d y %d es %d\n”,

entero1, entero2, suma);exit(0);

}

/* Programa suma */#include <stdio.h>int main() {

int entero1, entero2, suma; /* declaración var */printf(“Introduzca el primer entero:\n”);scanf(“%d”, &entero1);printf(“Introduzca el segundo entero:\n”);scanf(“%d”, &entero2);suma = entero1 + entero2;printf(“La suma de %d y %d es %d\n”,

entero1, entero2, suma);exit(0);

}

Curso 06/07 Programación en Entornos Multitarea 7

Palabras clave en el lenguaje ANSI C

Departamento de Enxeñería TelemáticaUniversidade de Vigo

whilestaticifdovolatilesizeofgotodefaultvoidsignedforcontinueunsignedshortfloatconstunionreturnexternchartypedefregisterenumcaseswitchlongelsebreakstructintdoubleauto

Curso 06/07 Programación en Entornos Multitarea 8

Conjunto de operadores en C

Departamento de Enxeñería TelemáticaUniversidade de Vigo

&&, ||, !Operadores lógicos

>, >=, <, <=Operadores relacionales

==, !=Operadores de igualdad

++, --Operadores incrementales y decrementales

+, -, *, /, %Operadores aritméticos

=,+=,-=,*=,/=,%=Operadores de asignación

Curso 06/07 Programación en Entornos Multitarea 9

Ejemplos de utilización de operadores aritméticos

Departamento de Enxeñería TelemáticaUniversidade de Vigo

int x=5, y=2, z;float f=2.0, g;

z = x – y; z = x * y; g = x / y; g = x / f; g = x / 4.0; g = x / 4; z = x % y; x++; ++y; z--; x = 5; y = ++x;

x = 5; y = x++; /* y = 5, x = 6 *//* asignación e incremento */

/* z = 3 y z = 10 *//* g = 2.0 y g = 2.5 */

/* g = 1.25 y g = 1.0 */

/* z = 1 */

/* y = 6, x = 6 *//* incremento y asignación */

/* x = 6, y = 3 y z = 0 */

Curso 06/07 Programación en Entornos Multitarea 10

Tipos básicos de datos en C

Departamento de Enxeñería TelemáticaUniversidade de Vigo

3.4e-4932 a 3.4e+493212long double1.7e-308 a 1.7e+3088double3.4e-38 a 3.4e+384float0 a 42949672954unsigned long int-2147483648 a 21474836474long int (int en UNIX)0 a 655352unsigned short int-32768 a 327672short int (int en DOS)0 a 2551unsigned char-128 a 1271charRangoBytesTipo

Curso 06/07 Programación en Entornos Multitarea 11

Ejemplos de punteros en C

Departamento de Enxeñería TelemáticaUniversidade de Vigo

/* Supongamos que la variable nu *//* ocupa la posición de memoria 1000 */

int nu, q, *m;

nu = 20;m = &nu;

q = *m;

/* m vale 1000 (almacenamos en m ladirección de nu) */

/* q vale 20 (contenido de la dirección de m) */

Curso 06/07 Programación en Entornos Multitarea 12

Departamento de Enxeñería TelemáticaUniversidade de Vigo

Control de flujo en C: estructuras de selecciónif: una sola selección

if (expresion) sentencia;

if / else: doble selecciónif (expresion)sentencia1;

elsesentencia2;

(condicion) ? (sentencia1) : sentencia2:doble selección

Curso 06/07 Programación en Entornos Multitarea 13

Departamento de Enxeñería TelemáticaUniversidade de Vigo

switch: selección múltipleswitch (expresion) {

case constante_1: sentencia_11;sentencia_12;...

case constante_2: sentencia_21;sentencia_22;...

case constante_n: sentencia_n1;sentencia_n2;...

default: sentencia_default1;sentencia_default2;...

}

Curso 06/07 Programación en Entornos Multitarea 14

Departamento de Enxeñería TelemáticaUniversidade de Vigo

Control de flujo en C: estructuras de repetición

whilewhile (condicion_continuacion)sentencia;

do / whiledosentencia;

while (condicion_continuacion);

Curso 06/07 Programación en Entornos Multitarea 15

Departamento de Enxeñería TelemáticaUniversidade de Vigo

Control de flujo en C: estructuras de repeticiónforfor (inicializacion; condicion_continuacion; actualizacion)

sentencia;

Enunciados break y continue. Se emplean para modificar el flujo de control:

break: causa la salida inmediata de la estructura while, for, do/while, switchcontinue: salta los enunciados restantes del cuerpo de la estructura (for, while, do/while) y ejecuta lasiguiente iteración del ciclo

Curso 06/07 Programación en Entornos Multitarea 16

Estructuras de datos en C

Departamento de Enxeñería TelemáticaUniversidade de Vigo

La creación de tipos nuevos de datos en C se puede hacer de las siguientes formas:

Combinando un conjunto de variables en una únicavariable (estructura)Permitiendo que la misma zona de memoria seacompartida por varias variables (unión)Mediante la enumeración de los distintos valores que puede tomar una variable (tipo enumerado)Mediante la palabra clave typedef

Curso 06/07 Programación en Entornos Multitarea 17

Formato de definición de estructura

Departamento de Enxeñería TelemáticaUniversidade de Vigo

struct nombre_estructura {tipo_1 elemento_1;tipo_2 elemento_2;...tipo_n elemento_n;

} variable_struct_1, variable_struct_2,...;

Curso 06/07 Programación en Entornos Multitarea 18

Formato de definición de unión

Departamento de Enxeñería TelemáticaUniversidade de Vigo

union nombre_union {tipo_1 elemento_1;tipo_2 elemento_2;...tipo_n elemento_n;

} variable_union_1, variable_union_2,...;

Curso 06/07 Programación en Entornos Multitarea 19

Departamento de Enxeñería TelemáticaUniversidade de Vigo

Formato de definición de enumeraciones

enum etiqueta {lista_enumeraciones}lista_variables;

Creación de tipos mediante typedef

typedef tipo_existente nombre_tipo;

Curso 06/07 Programación en Entornos Multitarea 20

Departamento de Enxeñería TelemáticaUniversidade de Vigo

Definición de arraystipo_elemento nombre_array[TAM];

No se pueden asignar arrays entre sí ni compararseAcceso elemento a elemento mediante un índiceEl índice del primer elemento es 0 y el del último es TAM-1C no realiza comprobaciones de índicesDefinición de arrays multidimensionales:

Ejemplo definición: int matriz[4][2];

Para acceder a un elemento:matriz[0][1] (elemento de la primera fila y

segunda columna)

Curso 06/07 Programación en Entornos Multitarea 21

Departamento de Enxeñería TelemáticaUniversidade de Vigo

Memoria dinámicaEmpleo de punteros y mecanismos de gestión de memoria

dinámica: malloc() y free()Ejemplo:int *arrayEnteros;

int i; int numElementos;

numElementos=10;

arrayEnteros=(int*)malloc(numElementos*sizeof(int));

for (i=0; i<numElementos; i++) {

arrayEnteros[i]=0;

}

free(arrayEnteros);

Curso 06/07 Programación en Entornos Multitarea 22

Departamento de Enxeñería TelemáticaUniversidade de Vigo

Cadenas de caracteres o stringsUna cadena de caracteres se representa como un array decaracteres finalizado con el carácter nulo (‘\0’)Ejemplo: “Hola” está representada por:

‘H’ ‘o’ ‘l’ ‘a’ ‘\0’

La longitud de la cadena “Hola” es igual a 4 caracteres, sin embargo, la cadena ocupa en memoria el espacio de 5caracteres

Definición: char cadena[10];

char cadena[5] = {‘H’,‘o’,‘l’,‘a’,‘\0’};

char cadena[] = “Hola”;

Curso 06/07 Programación en Entornos Multitarea 23

Departamento de Enxeñería TelemáticaUniversidade de Vigo

Principales bibliotecas estándar de CBiblioteca de funciones de conversión de cadenas: stdlib.h

atoi(), atof()

Biblioteca de funciones de entrada/salida: stdio.hgetchar(), gets(), putchar(), puts(), printf(),sprintf(), scanf(), sscanf(), fopen(), fclose(),fgets(), fscanf(), fprintf()

Biblioteca de funciones de manipulación de cadenas: string.h

strcpy(), strncpy(), strcat(), strncat(),

strcmp(), strncmp(), strlen()

Curso 06/07 Programación en Entornos Multitarea 24

Funciones en C

Departamento de Enxeñería TelemáticaUniversidade de Vigo

C no dispone de procedimientos, sólo permite el uso de funcionesLas funciones deben estar en el mismo nivel (no se permite anidamiento)Siempre debe existir una función denominada main() que se ejecuta cuando arranca el programa

Curso 06/07 Programación en Entornos Multitarea 25

Departamento de Enxeñería TelemáticaUniversidade de Vigo

Definición de funcionesTipoRetorno NombreFuncion (TipoParam1 Param1,...,

TipoParamN ParamN) {secuencia de definición de variablessecuencia de instrucciones

}

NombreFuncion (ExprParam1,...,ExprParamN);Llamadas a funciones

TipoRetorno NombreFuncion (tipoParam1,...,tipoParamN);

Declaración de funciones: prototipos

Curso 06/07 Programación en Entornos Multitarea 26

Paso de parámetros a una función

Departamento de Enxeñería TelemáticaUniversidade de Vigo

Paso de parámetros por valor: se efectúa una copia del argumento y ésta se le pasa a la función. Las modificaciones sobre la copia no afectan alvalor original de la variablePaso de parámetros por referencia: la función puede modificar el valor original de la variable.Provoca efectos colateralesEn C: paso por valor. Se simula el paso por referencia mediante el uso de punteros(operadores de dirección e indirección)

Curso 06/07 Programación en Entornos Multitarea 27

Ejemplo: definición de prototipos y funciones

Departamento de Enxeñería TelemáticaUniversidade de Vigo

/* Programa que calcula el máximo de tres enteros */

#include <stdio.h>int maximo(int, int, int); /* Prototipo de la función */

int main() {int a, b, c; /* declaración de variables */

printf(“Introduzca tres enteros:\n”);scanf(“%d %d %d”, &a, &b, &c);printf(“El máximo de los tres es: %d\n”,

maximo(a,b,c));exit(0);

}

Curso 06/07 Programación en Entornos Multitarea 28

Ejemplo: definición de prototipos y funciones

Departamento de Enxeñería TelemáticaUniversidade de Vigo

/* Definición de la función maximo() */int maximo(int x, int y, int z) {int max = x;

if (y > max)max = y;

if (z > max)max = z;

return max;

}

Curso 06/07 Programación en Entornos Multitarea 29

Errores comunes

Departamento de Enxeñería TelemáticaUniversidade de Vigo

Olvidar finalizar en ; cada sentencia o cerrar un conjuntode sentencias con }Comentarios anidadosProblemas con las mayúsculas y minúsculasUso de ; en la directiva #defineNo utilizar el operador de dirección en la llamada a scanfIncluir un ; junto a la sentencia de control de estructurasde selección o de repeticiónConfusiones entre asignación y comparación de igualdadOlvido de la sentencia break en el switch

Curso 06/07 Programación en Entornos Multitarea 30

Errores comunes

Departamento de Enxeñería TelemáticaUniversidade de Vigo

No inicializar punterosSobrepasar la memoria reservadaNo comprobar el resultado de la función mallocUtilizar la función free con punteros no obtenidos conmalloc

No liberar memoria obtenida con malloc cuando ya no seempleaNo declarar prototipos o declararlos malConfundir variables globales con locales que tienen elmismo nombre

Curso 06/07 Programación en Entornos Multitarea 31

Errores comunes

Departamento de Enxeñería TelemáticaUniversidade de Vigo

Olvidar que el primer índice de un array es 0Acceder a una posición del array fuera de rangoDefinir un puntero y no reservar memoriaUsar comillas simples para representar cadenas decaracteresComparar estructurasComparar cadenas usando el operador == o !=Asignar cadenas usando el operador =Utilizar el operador . con punteros a estructurasNo cerrar los archivos cuando no se utilicen

Curso 06/07 Programación en Entornos Multitarea 32

Bibliografía de la asignatura

Departamento de Enxeñería TelemáticaUniversidade de Vigo

De F. García, A. Calderón y otrosProblemas Resueltos de Programación

en Lenguaje C1ª edición, Editorial Thomson 2002

De H. M. Deitel y P. J. DeitelCómo programar en C/C++ y Java

Editorial Pearson Educacion, 2004. 4ª ed.

Curso 06/07 Programación en Entornos Multitarea 33

Bibliografía de la asignatura

Departamento de Enxeñería TelemáticaUniversidade de Vigo

De Jack Tacket y David GunterUtilizando LINUX

Editorial Prentice Hall, 1996

De Neil MatthewBeginning Linux Programming

Editorial Wrox Press. 1999

Programación en Entornos MultitareaCurso 2006/2007

INTRODUCCIÓN AL LENGUAJE DE PROGRAMACIÓN C

Departamento de Enxeñería TelemáticaUniversidade de Vigo