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 = ν
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