Sei sulla pagina 1di 144

1

Tecnologa de la Programacin
Ttulo de Grado en Ingeniera Informtica
Curso 2013/14

Departamento de Ingeniera de la Informacin y las Comunicaciones
Universidad de Murcia
2 Tecnologa de la Programacin
Tema 0. Introduccin a C
Temario
Tema 0. Introduccin a C

0.1 Introduccin
0.2 Manipulacin bsica de datos
0.3 Sentencias de control del flujo de ejecucin
0.4 Funciones
0.5 mbito y extensin
0.6 Estructuras de datos
0.7 Apuntadores
0.8 Asignacin dinmica de memoria
0.9 Ficheros
0.10 Gestin de errores
0.11 El preprocesador de C
0.12 Programacin modular
3 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.1.1 Historia del lenguaje y caractersticas
C es un lenguaje de programacin creado en 1972 por Dennis M.
Ritchie en los Laboratorios Bell orientado a la implementacin del
Sistema Operativo Unix.
ANSI fue la primera estandarizacin del lenguaje C con el estndar
X3.159-1989. Posteriormente, en 1990, fue ratificado como
estndar ISO (ISO/IEC 9899:1990).
A mediados de los ochenta se crea una extensin del lenguaje C
orientada a objetos, C++, el cual se convierte en estndar ISO en
1998. Tras el proceso de estandarizacin de ANSI, la
especificacin del lenguaje C permaneci relativamente estable
durante algn tiempo, mientras que C++ sigui evolucionando. Sin
embargo, el estndar continu bajo revisin hasta la publicacin del
estndar ISO 9899:1999. Este estndar se denomina habitualmente
"C99". Se adopt como estndar ANSI en marzo de 2000.
Actualmente el lenguaje C no est sujeto a ms modificaciones, ya que
es el lenguaje C++ el que incorporar nuevos cambios.
4 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.1.1 Historia del lenguaje y caractersticas

Caractersticas:
Combina la abstraccin de lenguajes de alto nivel con la eficiencia del
lenguaje mquina por lo que est considerado como un lenguaje de
"medio nivel".
Dbilmente tipado: Conversiones implcitas de tipos.
No encapsulado

Ventajas:
Altamente transportable.
Muy flexible.
Genera cdigo eficiente.
Muy expresivo.
Permite programar con mltiples estilos, siendo el estilo estructurado el
ms empleado, si bien permite ciertas licencias de ruptura.

Inconvenientes:
Poco modular.
Realiza pocas comprobaciones.
Da poca disciplina al programador.
Resulta difcil de interpretar el cdigo escrito por otros programadores.
5 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.1.2 Fases de desarrollo
1. Preprocesador
Transforma el cdigo fuente (ficheros *.c y *.h):
Elimina los comentarios.
Incluye el contenido de otros ficheros fuente.
Sustituye las macros.

2. Compilador
Analiza lxica, sintctica y semnticamente el cdigo fuente
generado por el preprocesador y lo convierte en cdigo
objeto: ficheros *.o

3. Enlazador
A partir de los cdigos objeto y las bibliotecas genera el ejecutable
binario: fichero *.exe (Windows)
6 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.1.3 Datos y sentencias
Estructuras de datos
Literales
Tipos bsicos
Tipos enumerados
Tipos estructurados
Punteros y vectores

Sentencias
Condicionales: if, switch
Iterativas: while, for, do...while
Funciones

Otros componentes (tratados por el preprocesador)
Comentarios
Inclusin de ficheros
Macros
Compilacin condicional

7 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.1.4 Estructura de un fichero fuente

La estructura tpica de un fichero fuente en C es la
siguiente:

#include <Fichero1.h>
#include <Fichero2.h>

[Declaracin de funciones]
[Definicin de funciones]
[Declaracin de variables globales]

main()
{
...
}
8 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.1.5 Comentarios

Comentarios de una lnea:

// Ejemplo de comentario en una linea

Comentarios de ms de una lnea:

/* Ejemplo de comentario
que tiene mas de
una linea.
*/

9 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.1.6 Bibliotecas estndares
El estndar de C contiene un conjunto de bibliotecas de
funciones incluidas en todo entorno de compilacin que
permiten ofrecer al programador servicios elementales
no contemplados en el lenguaje C.

Las interfaces de estos servicios se definen en sus
correspondientes ficheros de cabecera (*.h)

Ejemplos:

Entrada y salida de datos: stdio.h
Manejo de cadenas: string.h
Memoria dinmica: stdlib.h
Rutinas matemticas: math.h
10 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.1.7 Ejemplo: "Hola Mundo"

/* Incluye la libreria estandar stdio.h para poder
utilizar la funcion printf
*/
#include <stdio.h>

/* Aqui empieza el programa principal */
main()
{
/* La funcion printf escribe en pantalla
la cadena de caracteres "Hola Mundo"
*/
printf("Hola Mundo\n");
}
11 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.2.1 Literales

Son datos escritos directamente en el cdigo del programa.

Ejemplos de literales ms utilizados:

Nmero entero decimal: 34
Nmero real: 25.73, 7.38e2, 39.5e-3
Carcter: 'a'
Cadena de caracteres: "hola"

Otros literales:

Hexadecimal: 0x3A5F
Octal: 0451
12 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.2.2 Tipos bsicos
Todos los tipos son numricos.







Tipo Descripcin Ancho en Bits Rango en PC
char
Carcter 8 -128 a 127
int
Entero 16 -32678 a 32767
float
Real en coma flotante 32 -3.4E38 a -1.4E-45
y 1.4E-45 a 3.4E38
double
Real en coma flotante
de doble precisin
64 -1.8E308 a -4.9E-324
y 4.9E-324 a 1.8E308
void
Sin tipo 0 Sin valores
13 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.2.2 Tipos bsicos
Rangos y Modificadores
El rango de las variables depende de la plataforma y del compilador. Las
variables enteras en Windows suelen ser enteros de 16 bits,
mientras que en Linux son de 32 bits.
El tipo char maneja rangos de valores de 8 bits (-128 a +127 para
signed char y 0 a 256 para unsigned char). Pueden aadirse
modificadores al tipo int para alterar el rango de valores. En este
caso la palabra int se puede omitir al declarar las variables.
Modificador Significado
short
Corto
long
Largo
unsigned
Sin signo
signed
Con signo
14 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.2.2 Tipos bsicos

Tipo Ancho en Bits Rango en 16 bits
char
8 [-128,127]
unsigned char
8 [0,255]
signed char
8 [-128,127]
int
16 [-32768,32767]
unsigned int
16 [0,65535]
signed int
16 [-32768,32767]
short int
8 [-128,127]
unsigned short int
8 [0,255]
signed short int
8 [-128,127]
long int
32 [-2147483648,2147483647]
signed long int
32 [-2147483648,147483647]
unsigned long int
32 [0,4294967295]
float
32 [-3.4E38,-3.4E-38],0, [3.4E-45,3.4E38]
double
64 [-1.7E308,-1.7E-308],0,[1.7E-308,1.87308]
long double
128 [-3.4E4932,-3.4E-4932],0,[3.4E-4932,3.4E4932]
15 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.2.3 Identificadores
Los identificadores son nombres que se utilizan para definir
variables, funciones o tipos de datos definidos por el
programador.

Los identificadores deben seguir las siguientes reglas:
Un identificador debe empezar por una letra o por el
carcter de subrayado seguido de cualquier cantidad de
letras, dgitos o subrayados.
Se distinguen maysculas y minsculas
No se pueden utilizar palabras reservadas por el
compilador como int, char, while, etc.
Muchos compiladores no permiten letras acentuadas o
ees.
16 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.2.3 Identificadores
Ejemplos de identificadores vlidos:

d, f, c, caracter, Caracter, _caracter, caracter1,
caracter2

Ejemplos de identificadores no vlidos:

Carcter // El compilador no entiende la tilde
mueco // El compilador no entiende la
1c // No puede empezar por numero
int // Palabra reservada int

17 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.2.4 Declaracin de variables
En C cada variable tiene un tipo. Las variables hay que
declararlas como pertenecientes a su tipo antes de
utilizarlas

Sintaxis:
tipo identificador;

Ejemplos de declaraciones:

int d; // Se declara la variable d de tipo int
double f; // Se declara la variable f de tipo double
char c; // Se declara la variable c de tipo char

char caracter; // Variable caracter de tipo char
char Caracter; // Variable Caracter distinta de la anterior

18 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.2.5 Expresiones y operadores
Distinguiremos entre expresiones aritmticas y lgicas.
Las expresiones aritmticas combinan operadores
aritmticos junto con variables y literales numricos para
calcular valores numricos.

Operador Aritmtico Significado
+
Suma
-
Resta
*
Producto
/
Divisin
%
Mdulo (Resto)
19 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.2.5 Expresiones y operadores
Las expresiones lgicas combinan operadores relacionales y/o lgicos junto con
variables y literales numricos para obtener valores numricos. Esto es as
dado que C no tiene tipo booleano. C interpreta como falso el valor 0 y
como cierto cualquier otro valor distinto de cero.
El resultado de una expresin lgica devuelve un nmero entero: 1 si la
condicin es cierta y 0 si no es cierta.
Operador
Relacional
Resultado
E1 == E2
1 si E1 es igual a E2; 0 en caso contrario.
E1 != E2
1 si E1 es distinto de E2; 0 en caso contrario.
E1 > E2
1 si E1 es mayor que E2; 0 en caso contrario.
E1 < E2
1 si E1 es menor que E2; 0 en caso contrario.
E1 >= E2
1 si E1 es mayor o igual que E2; 0 en caso contrario.
E1 <= E2
1 si E1 es menor o igual que E2; 0 en caso contrario.
20 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.2.5 Expresiones y operadores
Operador
Lgico
Resultado
E1 && E2
(AND) 1 si E1 y E2 son distintos de cero; 0 en
caso contrario.
E1 || E2
(OR) 1 si E1 o E2 son distintos de cero; 0 en
caso contrario.
! E
(NOT) 1 si E es cero; 0 en caso contrario.
21 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.2.5 Expresiones y operadores
Ejemplos:

int n,a,b; // Declaracion de varias variables del mismo tipo

3.14 // Literal
n // Variable
n+5 // Operador aritmetico suma
b+n*3 // Operadores aritmeticos suma y producto
(b+n)*3 // Parentesis para establecer precedencia
a>b // Operador relacional mayor que
(a>=b)&&(n<0) // Expresion logica
22 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.2.5 Expresiones y operadores

Reglas de precedencia

Las reglas de precedencia establecen el orden en que son
aplicados los operadores para evaluar una expresin.

La asociatividad establece el orden para operadores con
igual precedencia.

La asociatividad en C se establece de izquierda a derecha.

23 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.2.5 Expresiones y operadores
Categora / Precedencia Operadores
1. Mxima (), [], ->, .
2. Unarios !, ~, +, -, ++, --, &, *, sizeof
3. Multiplicativos *, /, %
4. Aditivos +, -
5. Rotacin <<, >>
6. Relacional <, <=, >, >=
7. Igualdad y Desigualdad ==, !=
8. Y bit a bit &
9. Oex bit a bit ^
10. O bit a bit |
11. Y lgico &&
12. O lgico | |
13. Condicional ?:
14. Asignacin =, *=, /=, %=, +=, -=, &=, ^=, |=, <<=, >>=
15. Coma ,
24 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.2.6 Operador de asignacin
Sintaxis del operador de asignacin:

variable = expresion;

El operador de asignacin puede utilizarse tambin en el
momento de la declaracin de una variable para
asignarle inicialmente un valor. Si una variable se
declara sin inicializar, contiene un valor indeterminado.

tipo variable = expresion;
25 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.2.6 Operador de asignacin
Ejemplos:

int d;
d = 5;
double f1 = 3.56;
double f2 = 5.5;
double f3;
f3 = f1 + f2;

Nota: Una asignacin es una expresin. Por tanto la asignacin x=y ,
adems de asignar a x el valor de y, devuelve el valor asignado, es
decir, el valor de y. Ejemplo:

int a = 3;
int b,c;
c = 10 (b=a); // Tras su ejecucion, b es 3 y c es 7
26 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.2.7 Declaracin de constantes: const

Una variable puede declararse de forma constante mediante
la palabra reservada const.

Las constantes no pueden modificarse a lo largo del
programa, por lo que debe asignarse su valor al mismo
tiempo que se declaran.

Ejemplo:

const double pi = 3.1416;

27 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.2.8 Ejemplo: Salida por pantalla con printf
printf ( <cadena_de_control>[, <lista_de_argumentos>] )
En la <cadena_de_control>, el programador debe indicar el formato de salida
de los datos que se van a mostrar por la pantalla. Para ello, se puede hacer
uso de:
Texto ordinario (texto normal).
Especificadores de formato.
Secuencias de escape.

Especificadores de formato ms utilizados:
%c char
%d int
%f float, double
%s char *

Secuencias de escape:
\n Salto de lnea
\t Tabulador
28 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.2.8 Ejemplo: Salida por pantalla con printf

#include <stdio.h>

main()
{
int d = 36;
double f = 3.6;
char c = 'c';
char * s = "hola";
printf("%d\n ",d); // Imprime el decimal 36
printf("%f\n ",f); // Imprime el real 3.6
printf("%c\n ",c); // Imprime el caracter 'c'
printf("%s\n ",s); // Imprime la cadena "hola"
}
29 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.2.9 Operadores avanzados
Operador Efecto Devuelve
++x (preincremento)
x = x + 1 x + 1
x++ (postincremento)
x = x + 1 x
--x (predecremento)
x = x - 1 x - 1
x-- (postdecremento)
x = x - 1 x
x += y
x = x + y x + y
x *= y
x = x * y x * y
x /= y
x = x / y x / y
x %= y
x = x % y x % y
30 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.2.9 Operadores avanzados

Ejemplo:

int a,b;

a = 3;
b = a++; // a = 4, b = 3

a = 3;
b = ++a; // a = 4, b = 4

a = 3;
b = 4;
b += a; // b = 7
31 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.2.10 Desbordamientos y redondeos

El lenguaje C no detecta desbordamientos. Si se produce
un resultado fuera del rango, no se interrumpe el
programa ni se sealiza el desbordamiento, sino que
simplemente el resultado es errneo.

Si el resultado de una expresin entera es fraccionario se
redondea al entero ms cercano a cero.

Ejemplo:

float x = 14/3; // x = 4.0000
float y = 14.0/3.0; // y = 4.6666
32 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.2.11 Conversin de tipo
Promocin: conversin a un tipo de mayor rango.
Degradacin: conversin a un tipo de menor rango.

Reglas para la conversin implcita de tipos en expresiones
aritmticas:
1. Los tipos char y short se convierten a tipo int.
2. Los tipos unsigned char y unsigned short se convierten a
unsigned.
3. Los operandos de menor rango se convierten (promueven) al
operando de mayor rango y el resultado de la expresin es de ese
tipo. El orden es el siguiente:

int < unsigned < long < unsigned long < float < double

Ejemplo: Si tenemos una variable a de tipo int y una variable b de tipo
float, para evaluar la expresin a+b, se promueve la variable a a
tipo float y el resultado de la expresin es de tipo float.

33 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.2.11 Conversin de tipo

Conversin implcita a travs del operador de asignacin:

int x = 3;
int y = 3;
float z = 4.6;

y = z; // Conversion (degradacion) implicita
// z se degrada a int
// y = 4

z = x; // Conversion (promocion) implicita
// x se promueve a float
// z = 3.0

Cuando se realiza una degradacin, es posible que exista una
prdida de informacin.
34 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.2.11 Conversin de tipo

Conversin explcita con el operador cast

Se pueden forzar las conversiones de tipo utilizando el operador cast:
El operador cast es unario.
Tiene igual prioridad que el resto de operadores unarios.


Ejemplo:

int a = 1;
int b = 2;
float c = a / b; // c = 0.0
float d = (float) a / (float) b; // d = 0.5
35 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.2.12 Tipos enumerados
Con el tipo enumerado se pueden construir tipos enteros con un
rango limitado de valores y asociar a cada valor un
nombre.

Ejemplo:

enum DiaSemanaEnumerado
{
lunes,martes,miercoles,jueves,viernes,sabado,domingo
};
enum ColoresPrimarios
{
rojo,amarillo,azul
};
enum DiaSemanaEnumerado dia = miercoles;
enum ColoresPrimarios color = rojo;
36 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.2.13 Definicin de tipos: typedef
Se puede dar un nombre nuevo a cualquier tipo de datos mediante la
palabra typedef.
Una vez declarado el tipo, su nombre puede utilizarse para la
declaracin de variables pertenecientes a ese tipo.

Sintaxis:
typedef declaracin;

La declaracin de un tipo se rige segn la sintaxis de la declaracin de
variables. Ejemplo:

typedef int Entero;
Entero n;
typedef enum DiaSemanaEnumerado DiaSemana;
DiaSemana dia = martes;
37 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.3.1 Sentencias simples y compuestas

Sentencia simple: Expresin terminada en punto y coma.

Sentencia compuesta: Varias sentencias entre llaves.

Ejemplo:

// Sentencia simple
a = b * 8;

// Sentencia compuesta
{
a = 9;
b = 3;
c = a * 9 b;
}
38 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.3.2 Sentencia if

Sentencia if: Se ejecuta el cdigo slo si una condicin es cierta.

Sintaxis: if (condicin) sentencia

donde condicin es una expresin de cualquier clase (si el resultado de
la expresin es cero, la condicin es falsa, en caso contrario es
cierta).

Ejemplo: if (a>0) b++;

if ((x+z==3)&&(a<0))
{
x--;
a += z;
}
39 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.3.2 Sentencia if
Construccin else: Se ejecuta el cdigo cuando la condicin del if es falsa.

Sintaxis: if (condicin) sentencia
else sentencia
Ejemplo:
if (a>0) b++;
else b--;

if ((x+z==3)&&(a<0))
{
x--;
a += z;
}
else
{
z--;
b = 3;
}
40 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.3.3 Bucle while
El bucle while permite ejecutar el mismo cdigo mltiples veces.

Sintaxis:
while (condicin) sentencia

Se ejecutar sentencia mientras condicin sea cierta.

Ejemplo:
int x=0;
while(x<10)
{
printf("%d ",x);
x++;
}
41 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.3.4 Bucle for
El bucle for permite ejecutar el mismo cdigo mltiples veces.

Sintaxis:

for ( expresin_inicial ; condicin ; expresin_actualizacin )
sentencia

expresin_inicial se ejecuta antes de empezar el bucle.
sentencia se ejecutar mientras condicin sea cierta.
expresin_actualizacin se ejecuta despus de sentencia en cada
iteracin del bucle.

Ejemplo:
for(int x=0; x<10; x++)
printf("%d ",x);
42 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.3.4 Bucle for
Las tres expresiones del bucle for pueden omitirse:
Si se omite la expresin inicial, no se ejecuta nada antes
del bucle.
Si se omite condicin, la condicin de continuacin ser
siempre cierta.
Si se omite la expresin de actualizacin, no se hace
nada despus de cada iteracin.

Ejemplo:

for(;x!=10;)
{
...
}
43 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.3.5 Bucle do while
Similar al bucle while, pero itera al menos una vez.

Sintaxis:
do
sentencia
while (condicin)

Ejemplo:
int x = 1;
do
{
printf("%d ",x);
x++;
}
while(x<10);
44 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.3.6 Consideraciones sobre bucles

Resulta conveniente y buena prctica de programacin no
terminar los bucles con sentencias del tipo break, continue,
goto o return, que permiten modificar el flujo de control de
ejecucin, pero violan las normas de la programacin
estructurada. En cualquier caso, siempre es posible terminar
un bucle de forma adecuada sin la utilizacin de estas
instrucciones.

Aunque est permitido por el lenguaje, no es adecuado
modificar la variable de control del bucle for dentro del cuerpo
del bucle, sino que su modificacin debe realizarse slo en la
expresin de actualizacin.
45 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.3.7 Construccin switch
Se utiliza para ejecutar distintas sentencias segn el valor de una expresin
entera.

Sintaxis:
switch ( expresin )
{
case valor1 : sentencias1
case valor2 : sentencias2

case valorN : sentenciasN
default: sentenciasD
}

La sentencia break se utiliza frecuentemente para terminar el procesamiento de
un caso particular dentro de una construccin switch.

La clusula default puede omitirse, en cuyo caso no se ejecutar cdigo por
defecto.
46 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.3.7 Construccin switch
Ejemplo:
int x;
switch (x)
{
case 1: a++; printf("%d",a); break;
case 2: b--; break;
case 3:
case 4: c = 3;
case 5: printf("%d",c); break;
default: d = 0;
}

char y;
switch (y)
{
case 'a': printf("%c",y); break;
case 'b': printf("%c\n",y); break;
}
47 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.4.1 Definicin de funciones
En el lenguaje C, una funcin se define de la siguiente forma:
Tipo de datos devuelto.
Nombre de la funcin.
Lista de parmetros formales.
Cuerpo de la funcin.

Sintaxis:

tipo_devuelto nombre_funcin ( < lista de parmetros formales > )
{
cuerpo de la funcin
}

donde < lista de parmetros formales >puede contener cero, uno o
ms parmetros formales. Cada parmetro formal se especifica
como la declaracin de una variable.
48 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.4.1 Definicin de funciones
El cuerpo de la funcin debe contener una sentencia return que
devuelve el resultado de la funcin.

Sintaxis:
return expresin;

Ejemplo:
double area_triangulo(double base, double altura)
{
return base*altura/2;
}

Ntese que main es una funcin cuyo nombre est reservado por el
compilador con la particularidad de que es el punto de inicio del
programa.

49 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.4.2 Llamadas a funcin
Una llamada a una funcin es una expresin. Para llamar a una funcin
se escribe su nombre y entre parntesis los valores de los
parmetros actuales (tambin llamados argumentos).

Sintaxis:
nombre_funcin ( <lista de expresiones> )

Cada expresin en la lista se evala y su resultado se pasa como
argumento a la funcin. Las expresiones deben tener el mismo tipo
que el del parmetro formal correspondiente o un tipo compatible.

El resultado de la funcin puede ser recogido en una variable, aunque el
lenguaje C no obliga a ello. Por ejemplo, printf es una funcin
que devuelve un entero.

50 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.4.2 Llamadas a funcin
Ejemplos:

double base = 10.0;
double altura = 5.6;

double area1 = area_triangulo(base,altura);
double area2 = area_triangulo(8.3,7.2);

printf("El area1 es: %lf\n",area1);
printf("El area2 es: %lf\n",area2);
printf("El area es: %lf\n",area_triangulo(base,altura));
printf("El area es: %lf\n",area_triangulo(3.8,9.2));




51 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.4.3 Declaracin adelantada
Las funciones pueden declararse de forma adelantada indicando
nicamente el prototipo de la funcin.
De esta forma se podra utilizar la funcin en una zona de cdigo anterior
a la definicin de la funcin.

Ejemplo:

double area_triangulo(double base, double altura);
double volumen_prisma_triangular(double b,double h,double h_prisma)
{
return area_triangulo(b,h)*h_prisma;
}
double area_triangulo(double base, double altura)
{
return base*altura;
}
52 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.4.4 Funciones sin parmetros formales
Si una funcin se declara sin parmetros formales, el lenguaje no impide
que en su llamada puedan utilizarse argumentos. Para forzar a que
una funcin se defina y se invoque sin argumentos, la funcin debe
declararse con void en la lista de parmetros formales.

Sintaxis:
tipo_devuelto nombre_funcin ( void )

Ejemplo:

double valor_pi(void)
{
return 3.1415;
}
double area_circulo(double radio)
{
return valor_pi()*radio*radio;
}
53 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.4.5 Procedimientos
El lenguaje C slo permite definir funciones. Un procedimiento
puede definirse como una funcin que no devuelve ningn valor. A
estas funciones se les denomina funciones void. En una funcin
void no es obligatoria la sentencia return, aunque puede
utilizarse sin argumentos para terminar la funcin.
Sintaxis:
void nombre_funcin( <lista de parmetros formales>)
Ejemplo:
void ImprimeRango(int a, int b)
{
for(int i=a;i<=b;i++) printf("%d ",i);
}
main()
{
ImprimeRango(4,13);
}
54 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.4.6 Paso de argumentos
Los argumentos en C se pasan por valor, por tanto las funciones no
pueden alterar las variables pasadas como argumentos.

Ejemplo:
void incrementa(int n)
{
n++;
}
main()
{
int numero = 6;
incrementa(numero); // numero sigue valiendo 6
printf("numero = %d\n", numero);
}
Para conseguir que una variable pasada como argumento pueda
modificarse hay que recurrir a los apuntadores, que se vern
ms adelante.
55 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.4.6 Paso de argumentos const
Aunque la modificacin de un parmetro formal desde el interior de
la funcin no tiene efecto sobre el parmetro actual, debido a
que el paso es por valor, sin embargo el compilador no lo
prohbe.

Para que el compilador impida la modificacin de los parmetros
formales, stos pueden declararse como const.

Ejemplo:

void incrementa(const int n)
{
n++; // Error de compilacin
}
56 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.4.7 Funciones no anidadas

En C no se pueden anidar funciones, es decir, declarar unas
funciones dentro de otras. Todas las funciones se
declaran como globales.
57 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.5 mbito y extensin
mbito

El mbito de un identificador de variable, tipo o funcin es el
contexto del programa en el que este identificador
puede ser utilizado.

Extensin

La extensin de una variable es el periodo de tiempo
desde que la variable empieza a existir ocupando
espacio de memoria hasta que deja de existir
liberndose el espacio de memoria que ocupaba.
58 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.5.1 mbito de variables, tipos y funciones
mbito de variables
Existen tres tipos de variables:
1. Variables globales
Declaradas fuera de cualquier bloque del programa.
Su mbito es desde el punto en el que se declara hasta el final del
programa.
2. Variables locales
Declaradas en el interior de un bloque.
Su mbito es desde el punto en el que se declara hasta el final del bloque
en el que se ha declarado.
Una variable local oculta a una variable global del mismo nombre.
El mbito de una variable local a una funcin es, por tanto, desde el punto
en el que se declara hasta el final de la funcin. Los parmetros de una
funcin actan como variables locales a la funcin en cuanto a su
mbito.
3. Variables dinmicas
Accesibles mediante el uso de apuntadores, se construyen y destruyen en
tiempo de ejecucin.
Su mbito es el correspondiente a la variable apuntador que la apunta.
59 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.5.1 mbito de variables, tipos y funciones
mbito de tipos de datos

El mbito de los tipos de datos es similar al de las variables, es decir,
los tipos de datos globales se declaran fuera de todo bloque y los
declarados dentro de un bloque son locales al bloque.

Un tipo de datos local oculta a un tipo de datos global definido con el
mismo nombre.

mbito de las funciones

Las funciones en C tienen siempre mbito global, ya que se definen
siempre fuera de cualquier bloque (C no permite anidamiento de
funciones).
60 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.5.2 Extensin de las variables
1. Variables globales
Existen permanentemente mientras el programa se ejecuta.
La asignacin de memoria de las variables globales se realiza en tiempo de
compilacin. Por esta razn se denominan tambin variables
estticas. Su espacio de almacenamiento es el segmento de datos
(data segment).
2. Variables locales
Existen mientras se est ejecutando el cdigo del bloque en las que se han
declarado. Por esta razn se denominan tambin variables
automticas. Su espacio de almacenamiento es el segmento de pila
(stack segment).
Una variable local a una funcin se crea cuando se llama a la funcin y se
destruye o libera cuando la funcin retorna.
Los parmetros de una funcin actan como variables locales a la funcin
en cuanto a su extensin.
3. Variables dinmicas
Existen desde que se construyen hasta que se destruyen con instrucciones
explcitas del lenguaje. Su espacio de almacenamiento es el segmento
montn (heap segment).
61 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.5.3 Variables locales static
La palabra reservada static permite definir variables locales con
extensin permanente; se alojan en el segmento de datos (data
segment).
La inicializacin de una variable static se realiza una sola vez al
comienzo del programa.

Ejemplo: int contador(void)
{
static int cuenta = 0;
return cuenta++;
}

La variable cuenta es local a la funcin contador, pero no desaparece
al retornar la funcin, por lo que cada vez que se invoca a contador,
la variable cuenta se incrementa.
62 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.5 mbito y extensin: Ejemplo
typedef double Real; // Tipo global

Real t; // Variable global

Real a; // Variable global

Real mitad(Real t){ // El parametro t enmascara la variable t global
Real a; // La variable a local, enmascara la variable a global
a = t / 2;
return a;
}
main() {
for(int i=0;i<10;i++) { // La variable i es local al bucle for
t = (Real)i;
a = mitad(t);
printf("Numero = %lf, Mitad = %lf\n",t,a);
}
}
63 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.6.1 Arrays
Declaracin de arrays

Un array permite representar colecciones de elementos del mismo tipo.

Sintaxis:

tipo nombre [ tamao ];

Declara nombre como un array de tamao elementos del tipo tipo.
tamao es una expresin que devuelve un resultado entero (mayor que
cero).

Ejemplo:
int vector[100];
int tam = 60;
int v2[tam];
64 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.6.1 Arrays
Declaracin e inicializacin de arrays

Sintaxis: tipo nombre [ N ] = { valor1, valor2, , valorN };

Se puede omitir el tamao N del array ya que su tamao viene implcito
por el nmero de valores inicializados.

Sintaxis: tipo nombre [ ] = { valor1, valor2, , valorN };

Ejemplo:

int vector[3] = {3, 4, 5};
float v[2] = {3.5, 6.8};
double d[] = {3.6, 9.8, 0.5, 9.2}; // Vector d de tamao 4
65 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.6.1 Arrays
Acceso a los elementos de un array

Para acceder al elemento i-simo de un array se utiliza la expresin:

nombre [ i ]

En C un array de tamao n se indexa desde el ndice 0 hasta n-1.

Ejemplo:
int vector[100];
for(int i=0;i<100;i++) vector[i] = i;
int tam = 60;
int v2[tam];
for(int i=0;i<tam;i++) v2[i] = vector[i]*2;

66 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.6.1 Arrays
Declaracin de arrays de mltiples dimensiones

Se pueden declarar arrays con N igual a 2 ms
dimensiones.

Sintaxis:

tipo nombre [ tamao1 ] [ tamao2 ] [ tamaoN ]

Ejemplo:
double matriz[5][10];
int tam1 = 3;
int tam2 = 7;
int m2[tam1][tam2][2];
67 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.6.1 Arrays
Acceso a arrays de mltiples dimensiones

En un array de N dimensiones, para acceder al elemento (i
1
, i
2
,,i
N
) se utiliza la
expresin:

nombre [ i
1
] [ i
2
] [ i
N
]
Ejemplo:
double matriz[5][10];
for(int i=0;i<5;i++)
for(int j=0;j<10;j++)
matriz[i][j] = i*j;
int tam1 = 3;
int tam2 = 7;
int m2[tam1][tam2][2];
for(int i=0;i<tam1;i++)
for(int j=0;j<tam2;j++)
for(int k=0;k<2;k++)
m2[i][j][k] = matriz[i][j]*k;
68 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.6.1 Arrays
Consideraciones sobre arrays:

El lenguaje C no detecta ndices fuera de rango.
Si a y b son arrays, la expresin a=b es ilegal.
Si a es un array de dos dimensiones, la expresin
a[i,j] no provoca un error de compilacin, pero no
es vlida (equivale a a[j]).
Los arrays pueden declararse tambin mediante
apuntadores, que se vern ms adelante.
Ntese que un array declarado como global puede
dimensionarse nicamente mediante un literal,
conocido por tanto en tiempo de compilacin.

69 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.6.2 Cadenas de caracteres
Declaracin de cadenas

En C las cadenas de caracteres se declaran como un array
de caracteres:

Sintaxis: char nombre [ tamao ];

Toda cadena termina con el carcter especial 0 para
detectar el final de la cadena. Por tanto, una cadena de
tamao N es capaz de almacenar, como mximo, un
texto de tamao N-1, ya que el ltimo elemento siempre
contendr el valor 0.

Ejemplo: char miCadena[10];
70 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.6.2 Cadenas de caracteres
Declaracin e inicializacin de cadenas

Existen dos formas de inicializar una cadena:

a) Mediante un literal de tipo cadena entre comillas.

char saludo[5] = "hola";

b) Como una inicializacin de array de char.

char saludo[5] = {'h','o','l','a',0};

En estos dos casos es frecuente omitir el tamao de la cadena:

char saludo[] = "hola";
char saludo[] = {'h','o','l','a',0};

71 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.6.2 Cadenas de caracteres
Asignacin de cadenas

Existen dos formas de asignar valores a una cadena:

a) Como una asignacin de array de char:

char saludo[5];
saludo[0] = 'h';
saludo[1] = 'o';
saludo[2] = 'l';
saludo[3] = 'a';
saludo[4] = 0;

b) Utilizando las funciones especiales de la librera
<string.h>

72 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.6.2 Cadenas de caracteres
Librera <string.h>

La librera <string.h> ofrece una serie de funciones de
utilidad para trabajar con cadenas. Las ms utilizadas
son las siguientes:

void strcpy(s1, s2); // Copia s2 en s1
void strcat(s1, s2); // Concatena s2 a s1
int strlen(s); // Devuelve la longitud de s
int strcmp(s1, s2); // Devuelve 0 (falso) si s1 y s2 son
iguales y un valor distinto de cero (cierto) en caso
contrario
73 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.6.2 Cadenas de caracteres
Librera <string.h>

Ejemplo:

char cadena1[5] = "hola";
char cadena2[7] = " mundo";
char saludo[11];
strcpy(saludo,cadena1);
strcat(saludo,cadena2);

Se puede asignar a una cadena otra cadena que contenga
menos letras que su tamao (el valor 0 marca el final de
la cadena), pero puede resultar en un error la accin
contraria, es decir, asignar a una cadena otra de mayor
tamao, lo cual adems no es detectado por el
compilador.

74 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.6.2 Cadenas de caracteres
Lectura de cadenas de caracteres

La funcin gets de la librera <stdio.h> lee del teclado una cadena
de caracteres.

Sintaxis: gets ( cadena );
donde cadena es el identificador de la cadena de caracteres.

Ejemplo: #include <stdio.h>
char cadena[5];
gets(cadena);

La funcin gets no comprueba el tamao de la cadena, destruyendo los
caracteres sobrantes en caso de leer ms caracteres que el tamao
establecido en la definicin de la cadena.
Otras alternativas para leer cadenas de caracteres son las funciones
fgets, scanf y fscanf que se vern ms adelante.
75 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.6.2 Cadenas de caracteres
Visualizacin de cadenas de caracteres

La funcin printf de la librera <stdio.h> con %s visualiza por
pantalla una cadena de caracteres .

Sintaxis: printf ( "%s", cadena);
donde cadena es el identificador de la cadena de caracteres.

Ejemplo: #include <stdio.h>
char cadena[5];
printf("La cadena es: %s",cadena);

El formato %s admite modificadores. Ejemplos:
printf("La cadena es: %10s",cadena); // Texto alineado a la
derecha ocupando 10 caracteres
printf("La cadena es: %-10s",cadena); // Texto alineado a
la izquierda ocupando 10 caracteres
76 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.6.2 Cadenas de caracteres
Visualizacin de cadenas de caracteres

La funcin puts de la librera <stdio.h> visualiza por pantalla una
cadena de caracteres seguida por un salto de lnea.

Sintaxis: puts ( cadena );

donde cadena es el identificador de la cadena de caracteres.

Ejemplo: #include <stdio.h>
char cadena[5];
puts(cadena);

Otras alternativas para visualizar cadenas de caracteres son las
funciones fputs y fprintf que se vern ms adelante.
77 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.6.3 Tipos estructurados: struct
Declaracin de tipos estructurados

La construccin struct permite definir producto de tipos (tipos
compuestos por varios elementos o campos de otros tipo).

Sintaxis: struct nombre_estructura
{
tipo1 nombre1;
tipo2 nombre2;

tipoN nombreN;
};
Ejemplo: struct FechaEstructura
{
int dia, mes;
char nombre[20];
};
78 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.6.3 Tipos estructurados: struct
Declaracin de variables estructuradas

Sintaxis:

struct nombre_estructura nombre_variable;


Ejemplo:

struct FechaEstructura
{
int dia, mes;
char nombre[20];
};

struct FechaEstructura f;
79 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.6.3 Tipos estructurados: struct
Acceso de variables estructuradas
Para acceder a los campos de una variable estructurada se utiliza la
siguiente sintaxis:
nombre_variable . nombre_campo
Ejemplo:

struct FechaEstructura
{
int dia, mes;
char nombre[20];
};
struct FechaEstructura f;
f.dia = 14;
f.mes = 2;
strcpy(f.nombre, "San Valentin ");
printf(" %s : %d / %d\n ",f.nombre, f.dia, f.mes);
80 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.6.3 Tipos estructurados: struct
Inicializacin de variables estructuradas

Una variable estructurada se puede inicializar en su
declaracin.


Ejemplo:

struct FechaEstructura
{
int dia, mes;
char nombre[20];
};

struct FechaEstructura f = {14,2,"San Valentin"};
81 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.6.3 Tipos estructurados: struct
Asignacin de variables estructuradas

Una variable estructurada puede asignarse a otra variable
estructurada de su mismo tipo mediante el operador
asignacin. En este caso, la asignacin realiza una copia
campo a campo de la estructura origen a la destino. Si un
campo es un array de dimensin constante, tambin
copia el contenido de los elementos del array.

Ejemplo:

struct FechaEstructura f1 = {14,2,"San Valentin"};

struct FechaEstructura f2 = f1;


82 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.6.3 Tipos estructurados: struct
Definicin de tipos estructurados con typedef

Se puede utilizar typedef para dar un nuevo nombre a cualquier tipo y
particularmente a los tipos estructurados.

Ejemplo:

struct FechaEstructura
{
int dia, mes;
char nombre[20];
};

typedef struct FechaEstructura Fecha;

Fecha f = {14,2,"San Valentin"};
83 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.6.3 Tipos estructurados: struct
Definicin de tipos estructurados con typedef

Otra alternativa es utilizar typedef directamente en la definicin de los
tipos estructurados. De esta forma se evita darle un nombre a la
estructura (estructura annima).

Ejemplo:

typedef struct
{
int dia, mes;
char nombre[20];
} Fecha;

Fecha f = {14,2,"San Valentin"};
84 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.6.3 Tipos estructurados: struct
Consideraciones

Aunque el lenguaje C es dbilmente tipado, no permite la asignacin de
variables struct de distinto nombre, aunque su estructura interna
fuera compatible. Ni siquiera haciendo un casting explcito la
construccin sera correcta.

Ejemplo:

typedef struct { int x,y; } EstructuraA;
typedef struct { int x,y; } EstructuraB;

EstructuraA varA;
EstructuraB varB;
varA = varB; // Error de compilacion
varA = (EstructuraA)varB; // Error de compilacion

85 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.6.3 Tipos estructurados: struct


Consideraciones

Paso de struct como parmetros a funciones: Cuando
una variable struct se pasa como parmetro en una
funcin, el contenido de todos sus campos se transfiere
por valor, es decir, se realiza una asignacin del
parmetro actual al parmetro formal.

Devolucin de struct: Si una funcin devuelve una
variable struct, tambin se realiza una asignacin
entre el valor devuelto por la funcin y la variable
utilizada en la llamada a la funcin.


86 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.7 Apuntadores
Definicin de apuntador

Un apuntador es una variable que contiene una direccin
de memoria donde se encuentra otra variable de
cualquier tipo.

Algunas de las utilidades de los apuntadores en C son:
El paso por referencia de variables a funciones.
Manipulacin de estructuras enlazadas.
Manejo de arrays y cadenas de caracteres.
87 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.7.1 Operadores bsicas: Declaracin

La declaracin de un apuntador a un tipo tipo se realiza con
la siguiente sintaxis:

tipo * nombre_variable_apuntador;

Ejemplo:

double * p;

En este caso se dice que p es una variable apuntador que
apunta a una variable de tipo double.
88 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.7.1 Operadores bsicas: Asignacin
La operacin & devuelve la direccin de una variable. Por tanto la
operacin & puede utilizarse para extraer direcciones de variables y
asignarlas a variables apuntador segn la siguiente sintaxis:

nombre_variable_apuntador = & nombre_variable_apuntada;

Podemos asignar tambin a una variable apuntador el valor de otra
variable apuntador. Ejemplo:
double d; // Declara una variable d de tipo double
double * p1; // Declara un apuntador p1 a double
double * p2; // Declara un apuntador p2 a double
p1 = & d; // Asigna a p1 la direccion de la variable d
p2 = p1; // Asigna a p2 el valor de p1

En este caso las dos variables apuntador p1 y p2 apuntan a la misma
variable d. Finalmente se pueden asignar direcciones de memoria a
la variable apuntador mediante el uso de asignacin dinmica de
memoria, que se ver ms adelante.

89 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.7.1 Operadores bsicas: Desreferencia
El operador de desreferencia * devuelve el contenido de la variable
apuntada por un apuntador. Sintaxis:

* nombre_variable_apuntada;

Ejemplo:

double d; // Declara una variable d de tipo double
double * p1; // Declara un apuntador p1 a double
double * p2; // Declara un apuntador p2 a double
p1 = & d; // Asigna a p1 la direccion de la variable d
p2 = p1; // Asigna a p2 el valor de p1
* p1 = 3.6; // Asigna 3.6 a la variable d
// Mismo efecto que d = 3.6
double e = * p2;// Asigna a e el valor de la variable d
// Mismo efecto que e = d

90 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.7.2 El apuntador nulo
El apuntador nulo es un caso especial de apuntador, su valor es 0.

En la librera <stdio.h> se define la constante NULL con valor 0 para
representar al apuntador nulo.

Suele utilizarse para inicializar apuntadores y como marca de fin en
estructuras enlazadas (se ver ms adelante).

Ejemplo:

#include <stdio.h>

double * p1;
p1 = NULL; // Mismo efecto que p1 = 0
double * p2 = NULL; // Mismo efecto que double * p2 = 0
91 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.7.3 Parmetros de entrada salida
Aunque el paso de parmetros en C es siempre por valor,
se puede realizar un paso por referencia mediante el
uso de apuntadores.

Para ello:

1. El parmetro formal en la funcin se declara como un
apuntador al tipo de la variable que se va a pasar por
referencia.
2. Se pasa la direccin de la variable con el operador &.
3. En el cdigo de la funcin se accede al contenido de la
variable mediante el operador *.
92 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.7.3 Parmetros de entrada salida
Ejemplo:

// El parametro formal a se declara como un apuntador a int
void suma(int * a, int b)
{
*a+=b; // Se suma el valor de b a la variable apuntada por a
}
// El parametro formal a se declara como un apuntador a int
void decrementa(int * a)
{
(*a)--; // Se decrementa el valor de la variable apuntada por a
}
main()
{
int n = 1; // variable que actuara de entrada/salida en suma
int m = 2;
suma(&n,m); // se pasa la direccion de n; n vale 3
decrementa(&n); // se pasa la direccion de n; n vale 2
}
93 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.7.4 Ejemplo: funcin scanf
La funcin scanf de la librera <stdio.h> permite leer desde el
teclado datos con formato. Sintaxis de llamada:

scanf ( formato, & arg1, & arg2, , & argN );

El formato es el mismo que en la funcin printf:
%c char
%d int
%f float
%lf double
%s char *

En el caso de lectura de cadenas de caracteres no se pone el
operador & ya que una cadena de caracteres es ya un
apuntador.
94 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.7.4 Ejemplo: funcin scanf

Ejemplo:

#include <stdio.h>

int a;
float f;
double d;
char c;
char cadena[10];

/* Lee desde el teclado un entero, un real, un real
de doble precision, un caracter y una cadena de
caracteres. */

scanf("%d %f %lf %c %s", &a, &f, &d, &c, cadena);
95 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.7.5 Consideraciones sobre apuntadores
1. Es necesario que los apuntadores estn correctamente inicializados
antes de acceder a la zona de memoria a la que apuntan. C no
inicializa los apuntadores al declararlos.

int * p;
*p = 3; // Se accede a una zona desconocida de memoria

2. Es posible que un apuntador a un tipo determinado apunte a una
variable de cualquier otro tipo. El compilador da un aviso, pero no un
error. En general no deben realizarse este tipo de acciones.

3. Los apuntadores que apuntan a variables automticas no deben
utilizarse cuando el bloque de la variable local ha terminado, ya que
la variable local ha sido eliminada de la pila.
96 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.7.6 Aritmtica de apuntadores
El lenguaje C permite sumar o restar cantidades enteras a un apuntador.
Se pueden utilizar cualquier operacin de suma y resta:
Operadores binarios: +, -
Operadores unarios: ++, -- (pre y post)
Operadores de asignacin: +=, -=
Si p es un apuntador, la expresin p+i es un apuntador que apunta a la
direccin de p sumndole i veces el tamao del tipo apuntado por p.
Esto se utiliza normalmente para el acceso a arrays. Ejemplo:

int v[10]; // Array de 10 enteros
int * p = &v[0]; // p apunta al principio del array v
*p = 3; // Mismo efecto que v[0] = 3
*(p+1)=5; // Mismo efecto que v[1] = 5
*(p+2)=7; // Mismo efecto que v[2] = 7
97 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.7.7 Apuntadores, arrays y cadenas de
caracteres
Si p es un apuntador, la expresin p[i] es equivalente a *(p+i) por
lo que se puede trabajar con apuntadores como si se tratase de
arrays. Ejemplo:
int v[10]; // Array de 10 enteros
int * p = v; // Mismo efecto que p = &v[0]
for(int i=0;i<10;i++)
p[i] = 3; // Mismo efecto que *(p+i) = 3
// Mismo efecto que v[i] = 3

Esto es as porque un array es internamente un apuntador al primer
elemento. El nombre de un array puede utilizarse por tanto como
un apuntador al que se le puede aplicar aritmtica de
apuntadores, excepto que no puede alterarse su valor inicial
constante cuando se ha declarado de la forma:
<tipo> <identificador>[<literal|constante>]

98 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.7.7 Apuntadores, arrays y cadenas de
caracteres

De igual forma, dado que una cadena de caracteres es un
array de char, si p es un apuntador a char, la
expresin p[i] es equivalente a *(p+i), es decir,
accede al carcter i-simo de la cadena de caracteres.
Ejemplo:

char c[10]; // Cadena de caracteres de tamao 10
char * p = c; // Mismo efecto que p = &c[0]
for(int i=0;i<9;i++)
p[i] = 'a'; // Mismo efecto que *(p+i) = 'a'
// Mismo efecto que c[i] = 'a'
p[9] = 0; // Mismo efecto que *(p+9) = 0
// Mismo efecto que c[9] = 0
99 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.7.8 Paso de arrays como parmetros a
funciones

Cuando un array se pasa como parmetro a una funcin, el parmetro formal
puede definirse de alguna de las siguientes sintaxis:
1) tipo * identificador
2) tipo identificador [ ]
3) tipo identificador [ literal | constante ]

Sin embargo, no es posible conocer el nmero de elementos del array en el
mbito de la funcin, por lo que en estos casos se debe parametrizar
tambin el tamao del array como un entero. Ejemplo:

void inicia(int * v, int n)
{
for(int i=0;i<n;i++)
v[i] = i;// Mismo efecto que *(v+i) = i;
}
main() { int v[5]; inicia(v,5); }
100 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.7.8 Paso de arrays como parmetros a
funciones

El paso de arrays se realiza siempre por referencia, es decir, se
pasa por valor la direccin inicial del array. Por tanto, una
modificacin del contenido del array sobre el parmetro formal
tiene efecto en el parmetro actual.
Ejemplo:
/* Ordena el array v de n elementos */
void ordena(int * v, int n) {...}
void ordena(int v[], int n) {...}
/* Ordena el array v de 10 elementos */
void ordena(int v[10]) {...}

La siguiente declaracin NO es vlida:

void inicia(int v[n], int n) {...}

101 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.7.9 Ejemplo: paso de parmetros a la funcin
main
La funcin main es una funcin especial que debe estar en todo programa C. Se
invoca desde el sistema operativo cuando comienza la ejecucin del
programa. La funcin main puede contener argumentos que se le pueden
pasar al programa en la orden de ejecucin y puede devolver un valor
entero que informe cmo ha terminado la ejecucin.
La funcin main puede entonces tener una serie de parmetros formales
opcionales. Tambin es opcional devolver un entero o no devolver nada.

Formato de main

// argc es el numero de argumentos (el nombre de la aplicacion se
considera como un argumento mas)

// argv es un array de cadenas de caracteres de tamao argc que
contiene los argumentos (el nombre de la aplicacion se ubica
en argv[0])

// devuelve un entero con el resultado de la ejecucion

int main ( int argc, char * argv [ ] )

102 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.7.9 Ejemplo: paso de parmetros a la funcin
main
Ejemplo:

int main ( int argc, char * argv [ ] )
{
printf("%d\n",argc);
for(int i=0;i<argc;i++) printf("%s ",argv[i]);
return 1;
}

Si en la lnea de comandos ejecutamos:
nombre_programa esto es una prueba

se imprimira por pantalla lo siguiente:
5
nombre_programa esto es una prueba
103 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.7.10 Apuntadores y estructuras
Un apuntador puede apuntar a una estructura. Ejemplo:

struct FechaEstructura
{
int dia, mes;
char nombre[20];
};
typedef struct FechaEstructura Fecha;
typedef Fecha * PunteroFecha;
Fecha f;

PunteroFecha pf;
pf = & f;
(*pf).dia = 31; // Mismo efecto que f.dia = 31;
(*pf).mes = 10; // Mismo efecto que f.mes = 10;
strcpy((*pf).nombre,"Halloween"); // Mismo efecto que
// strcpy(f.nombre, "Halloween");
104 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.7.10 Apuntadores y estructuras
El operador ->

Para acceder a los campos de una estructura mediante un apuntador de
forma ms cmoda para el programador, el lenguaje C dispone del
operador -> con la siguiente sintaxis:
ptr -> campo
que es equivalente a:
(*ptr).campo
En el ejemplo anterior, las instrucciones:
(*pf).dia = 31;
(*pf).mes = 10;
strcpy((*pf).nombre,"Halloween");
son equivalentes a:
pf->dia = 31;
pf->mes = 10;
strcpy(pf->nombre,"Halloween");
105 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.7.10 Apuntadores y estructuras
Consideraciones

Aunque el lenguaje C no permite la asignacin de variables struct de
distinto nombre, s permite la asignacin de variables apuntadores a
variables struct de distinto nombre, incluso aunque sus
estructuras internas no fuesen compatibles.
La asignacin de variables struct de distinto nombre requiere realizar
un casting explcito, aunque si no se hiciese, el compilador dara un
aviso (warning), pero no un error.

Ejemplo:
typedef struct { int x,y; } EstructuraA;
typedef struct { int x,y; } EstructuraB;
EstructuraA * punA;
EstructuraB * punB;
punB = (EstructuraB *)punA; // Asignacin correcta
punB = punA; // Aviso
106 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.7.10 Apuntadores y estructuras
Consideraciones

Ejemplo:

typedef struct { int x; } EstructuraA;
typedef struct { int n,m; } EstructuraB;

EstructuraA varA;
EstructuraB varB;
EstructuraA * punA;
EstructuraB * punB;
varA.x = 1;
punA = &varA;
punB = punA;
printf("%d\n",punB->n); // Imprime 1
printf("%d\n",punB->m); // Imprime valor no valido
107 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.8 Asignacin dinmica de memoria

En esta seccin introduciremos los mecanismos de
asignacin dinmica de memoria.

Esta tcnica de programacin permitir tratar con
estructuras dinmicas de memoria que, al contrario de
las estructuras estticas, se almacenan en reas de
memoria de tamao variable, el cual puede crecer o
decrecer en funcin de las necesidades de la
aplicacin.
108 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.8.1 Concepto de variable dinmica
Diremos que una variable es dinmica cuando su espacio
de almacenamiento se asigna y se libera en tiempo de
ejecucin mediante instrucciones explcitas del
lenguaje de programacin.
No hay que confundir variables dinmicas con variables
automticas, ya que las variables automticas, aunque
tambin se crean y se destruyen en tiempo de
ejecucin, este proceso se realiza de forma automtica
controlado por el compilador cuando comienza o
termina un bloque.
Las variables dinmicas se almacenan en un segmento de
memoria distinto al de las variables estticas y
automticas, denominado segmento heap o segmento
montn.
109 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.8.2 mbito y extensin de las variables
dinmicas

Las variables dinmicas no tienen nombre. Se accede a
ellas a travs de apuntadores, los cuales s pueden
poseer un identificador.

El mbito de una variable dinmica es el mbito de la
variable apuntador que apunta a ella.

La extensin de una variable dinmica es desde que la
variable se crea en tiempo de ejecucin hasta que se
destruye, ambas operaciones mediante instrucciones
del lenguaje.
110 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.8.3 Asignacin de memoria: funcin malloc
Existen varias funciones de la librera estndar <stdlib.h> que
permiten reservar o liberar memoria dinmicamente.

La funcin malloc sirve para reservar un bloque de memoria del
tamao dado como parmetro. Devuelve un apuntador al
inicio de la zona de memoria asignada.

Sintaxis: void * malloc( unsigned numero_bytes );

El tamao se especifica en bytes y se garantiza que la zona de
memoria asignada no est ocupada por ninguna otra variable
dinmica. Si malloc no puede reservar un bloque porque no
hay memoria suficiente devuelve el apuntador nulo (NULL).

111 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.8.4 Apuntadores a void
La funcin malloc devuelve un apuntador a un tipo no especificado,
declarado en C como void *. Un apuntador a void puede
convertirse a un apuntador a cualquier otro tipo.

Ejemplo:
int * p = (int *)malloc(4*100);

Esta instruccin reserva una variable dinmica de 400 bytes para
albergar a 100 enteros (cada entero ocupa 4 bytes).

Nota: El casting explcito no es necesario, ya que se hace un casting
implcito al evaluar la expresin. La siguiente instruccin sera por
tanto equivalente a la anterior:

int * p = malloc(400);

A partir de este momento no se realizar casting explcito en estos
casos.
112 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.8.5 El operador sizeof
El operador sizeof devuelve el nmero de bytes de un tipo
dado, con la expresin:

Sintaxis: sizeof ( tipo )

Este operador se puede utilizar en conjuncin con la funcin
malloc para conocer el nmero de bytes que se
quieren reservar.

Ejemplo: La siguiente instruccin reserva 100 enteros (de
tipo int).

int * p = malloc(sizeof(int)*100);

113 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.8.6 La funcin free
Cuando una zona de memoria reservada con malloc ya no se requiere,
puede liberarse mediante la funcin free.

Sintaxis: free ( void * apuntador );

donde apuntador es un apuntador de cualquier tipo que apunta a un
rea de memoria reservada previamente por malloc. Ejemplo:

#include <stdlib.h>

int * p = malloc(sizeof(int)*100);
... //Codigo que utiliza la variable dinamica apuntada por p
free(p);

Nota: Si apuntador apunta a una zona de memoria no reservada, los
efectos pueden ser desastrosos.
114 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.8.7 Asignacin dinmica de arrays y cadenas
Como vimos en las secciones anteriores, un apuntador a un
tipo es equivalente a un array de ese tipo. Por tanto, una
vez asignada una variable dinmica de n elementos de
un tipo mediante malloc, el apuntador devuelto puede
tratarse como un vector de n elementos de ese tipo.

Ejemplo:

#include <stdlib.h>

int n = 10; // Numero de elementos
int * p = malloc(sizeof(int)*n);
for(int i=0;i<n;i++) p[i] = i;
free(p);

115 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.8.7 Asignacin dinmica de arrays y cadenas
Lo mismo ocurre con las cadenas de caracteres.

Ejemplo:

#include <stdlib.h>
#include <stdio.h>

char * cadena = malloc(sizeof(char)*5);
strcpy(cadena,"hola);
printf("cadena = %s",cadena);
free(cadena);

116 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.8.7 Asignacin dinmica de arrays y cadenas
Funciones que devuelven arrays o cadenas de
caracteres.

Cuando una funcin devuleve un array o una cadena de caracteres, su sintaxis
debe ser la siguiente:

Sintaxis: tipo * nombreFuncion(<lista de parametros>)

En estos casos, el array o cadena de caracteres debe construirse en el interior
de la funcin y finalmente devolverse. Esta construccin debe realizarse
mediante asignacin dinmica de memoria mediante la funcin malloc.

117 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.8.7 Asignacin dinmica de arrays y cadenas
Funciones que devuelven arrays o cadenas de
caracteres.

Ejemplo correcto:
int * creaVector(int n) {
int * v = malloc(sizeof(int)*n); // La memoria del array
// se alberga en el heap
return v; // Retorna un apuntador al heap
}
Ejemplo incorrecto:
int * creaVector(int n) {
int v[n]; // La memoria del array se alberga en la pila
return v; // Retorna un apuntador a la pila, lo que producir un
// fallo ya que al retornar la funcin, su memoria en
// pila se libera.
}





118 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.8.7 Consideraciones sobre asignacin
dinmica de memoria

Es importante no dejar nunca una zona de memoria
reservada con malloc sin ningn apuntador que la
apunte, ya que esta zona se perdera y no podra ser
recuperada ni liberada.

El programador es responsable de liberar la memoria
cuando sea necesario utilizando free.

Si una zona liberada por free estaba apuntada por
otros apuntadores, estos otros apuntadores pasarn
ahora a apuntar a una zona incorrecta (no reservada).
119 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.9 Ficheros
La biblioteca <stdio.h> contiene funciones de entrada/salida, es decir,
lectura y escritura de datos. La lectura y escritura de datos puede
realizarse a ficheros.

Un fichero se declara como un apuntador a un tipo FILE que ofrece
<stdio.h>

Ejemplo:
#include <stdio.h>
FILE * fd;

Una vez declarado, el proceso bsico para manejar un fichero consiste en:
1. Apertura del fichero.
2. Manipulacin del fichero (lectura/escritura/acceso).
3. Cierre del fichero.
120 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.9.1 Abrir y cerrar un fichero
Para abrir un fichero se utiliza la funcin fopen con la siguiente
sintaxis:
fd = fopen ( nombre , modo );
donde nombre es una cadena de caracteres que contiene el nombre del fichero
externo, y modo es una cadena de caracteres que define el modo de
apertura:
r: slo lectura; el fichero debe existir
w: escritura; se crea un fichero nuevo o se sobrescribe si ya existe
a: aadir; se abre para escritura, el puntero para escritura se sita al final del
fichero; si el fichero no existe, se crea
r+: lectura y escritura; el fichero debe existir
w+: lectura y escritura; se crea un fichero nuevo o se sobrescribe si ya existe
a+: aadir, lectura y escritura; se abre para escritura, el puntero para lectura y
escritura se sita al final del fichero; si el fichero no existe, se crea
t: fichero de texto; si no se especifica t ni b, se asume por defecto que es t
b: fichero binario
La funcin open devuelve NULL si no se ha podido abrir el fichero (por ejemplo,
porque no se ha encontrado).

121 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.9.1 Abrir y cerrar un fichero
Para cerrar un fichero previamente abierto se utiliza la funcin
fclose con la siguiente sintaxis:

fclose ( FILE * fd );

Ejemplo:

FILE * f;
char[] nombre = "Datos.txt";
f = fopen(nombre,"w"); // Abre f para escritura
... // Instrucciones de escritura a f
fclose(f); // Cierra f

f = fopen(nombre,"r"); // Abre f para lectura
... // Instrucciones de lectura de f
fclose(f); // Cierra f
122 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.9.2 Leer desde un fichero
La lectura desde un fichero puede hacerse con distintas funciones. Por
ejemplo, la funcin fgets lee una lnea de caracteres con la
siguiente sintaxis:

fgets ( char * cadena , int n , FILE * fd );

donde cadena es una cadena de caracteres en la cual se guardar la
lnea leda, n-1 es el nmero mximo de caracteres que se leern, y
fd es el descriptor de fichero desde el que se lee. Internamente
existe un puntero de fichero que apunta a la posicin del fichero
donde se va a leer el siguiente dato.

Otra funcin que permite realizar la lectura desde un fichero
reconociendo el formato de los datos es fscanf, que se utiliza de
igual forma que la funcin scanf aadiendo el descriptor de
fichero:

fscanf ( FILE * fd, formato, & arg1, & arg2, , & argN );
123 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.9.3 Escribir a un fichero
La escritura a un fichero tambin puede hacerse con distintas funciones.
Por ejemplo, la funcin fputs escribe una lnea de caracteres con
la siguiente sintaxis:

fputs ( char * cadena , FILE * fd );

donde cadena es una cadena de caracteres que contiene la lnea a
escribir en el fichero, y fd es el descriptor de fichero en el que se
va a escribir. Las lneas se van escribiendo en el fichero una detrs
de otra, desde el principio del fichero (w) o desde el final (a). Existe
tambin un puntero de fichero interno para escritura.

Para realizar la escritura a un fichero con formato de los datos se puede
utilizar fprintf de igual forma que la funcin printf aadiendo
el descriptor de fichero:

fprintf ( FILE * fd , formato , arg1 , arg2 , , argN );
124 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.9.4 Detectar el final de un fichero

La funcin feof, con la siguiente sintaxis:

feof ( FILE * fd );

devuelve un 1 (cierto) si se ha llegado al final del fichero fd
o un 0 (false) en caso contrario. Se utiliza para saber
cundo se ha llegado al final del fichero para dejar de
leer.

125 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.9.5 Acceso aleatorio
La funcin rewind, con la siguiente sintaxis:
rewind ( FILE * fd );
mueve el puntero de lectura/escritura del fichero fd al comienzo.

La funcin fseek, con la siguiente sintaxis:
fseek ( FILE * fd, long int desplazamiento, int origen );
mueve el puntero de lectura/escritura del fichero fd a una posicin con un
desplazamiento respecto a origen:
SEEK_SET: desde el principio del fichero.
SEEK_CUR: desde la posicin del puntero.
SEEK_END: desde el final del fichero.

Ejemplo:
fseek(fd,-5L,SEEK_END); // Posicion 5 lineas desde el final
fgets(cadena,5,fd); // Lee los primeros 4 char
fseek(fd,5L,SEEK_SET); // Posicion 5 lineas desde el inicio
fgets(cadena,5,fd); // Lee los primeros 4 char
126 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.9.6 Flujos estndares: pantalla y teclado
Los flujos o streams son los ficheros de donde se lee o se
escribe utilizando las funciones de <stdio.h>. Un flujo
puede ser un fichero, el teclado (slo lectura) o la pantalla
(slo escritura). Se establecen los siguientes flujos
estndares:
stdin: entrada estndar (normalmente teclado).
stdout: salida estndar (normalmente pantalla).
stderr: error estndar (normalmente pantalla).

Se pueden utilizar las funciones de acceso a ficheros utilizando
los flujos estndar. Ejemplo:

fprintf(stdout,"Hola"); // Equivale a printf("Hola");
fscanf(stdin,"%s",c); // Equivale a scanf("%s",c);
127 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.9.7 Ejemplos
void escribeArray(char * file, int v[], int n) {
FILE * f = fopen(file,"w");
for(int i=0;i<n;i++) fprintf(f,"%d ",v[i]);
fclose(f);
}
void leeArray(char * file, int v[], int n) {
FILE * f = fopen(file,"r");
for(int i=0;i<n;i++) fscanf(f,"%d",&v[i]);
fclose(f);
}
int main() {
int n = 10;
int v[n];
for(int i=0;i<n;i++) v[i] = i;
char * file = "prueba.txt";
escribeArray(file,v,n);
int w[n];
leeArray(file,w,n);
return 0;
}
128 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.9.7 Ejemplos
typedef struct { int * a; int n; } Vector;
Vector leeVector(char * file) {
FILE * f = fopen(file,"r");
Vector v = {NULL,0};
while(!feof(f)) { int c; if (fscanf(f,"%d",&c)==1) v.n++; }
rewind(f);
v.a = malloc(sizeof(int)*v.n);
int i=0; while(i<v.n) if (fscanf(f,"%d",&(v.a[i]))==1) i++;
fclose(f);
return v;
}
void escribeVector(char * file, Vector v) {
FILE * f = fopen(file, "w");
for(int i=0;i<v.n;i++) fprintf(f,"%d ",v.a[i]);
fclose(f);
}
int main() { char * file = "prueba.txt";
Vector v = leeVector(file);
escribeVector(file,v);
free(v.a);
return 0;
}
129 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.10 Gestin de errores
Muchas de las funciones de las bibliotecas de C
devuelven un -1 NULL cuando ocurre un error
en la ejecucin.

La variable errno de la librera <errno.h>
contiene un cdigo de error relativo al ltimo
error producido.

Adicionalmente existe la funcin strerror(int
errnum) de la librera <string.h> que
devuelve una cadena de caracteres con
informacin (en ingls) sobre el error producido.
130 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.10 Gestin de errores
Ejemplo:

#include <errno.h>
#include <string.h>

int leeEnteroError(char * file, int * n) {
FILE * f = fopen(file,"r");
if(f == NULL) return -1;
fscanf(f,"%d",n);
fclose(f);
return 0;
}

int main() {
int m;
char * file = "prueba.txt";
if (leeEnteroError(file,&m)==0) printf("m = %d\n",m);
else {
printf("No se puede abrir el archivo %s\n",file);
printf("Error numero %i\n",errno);
printf("Descripcion: %s \n", strerror(errno));
}
return 0;
}
131 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.11 El preprocesador de C

El preprocesador de C, previo al compilador,
reconoce una serie de rdenes bsicas que
permiten:
1. Incluir ficheros.
2. Definir macros.
3. Dirigir la compilacin posterior (compilacin
condicional).

El preprocesador tiene su propio lenguaje
independiente del lenguaje C y todas sus
rdenes comienzan con el carcter #.
132 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.11.1 Inclusin de ficheros
Sintaxis:
#include <fichero>
#include "fichero"
Se inserta el cdigo del fichero dentro del cdigo fuente actual. Si
el nombre del fichero se escribe entre < >, el fichero se busca
en directorios prefijados para ficheros cabeceras.

Ejemplo:
#include <stdio.h>
int main()
{
printf ("Hola, mundo\n");
return 0;
}
133 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.11.2 Definicin y eliminacin de macros
Sintaxis:

#define nombre_macro ( arg1, arg2, ... ) codigo_sustituto
#undef nombre_macro


Ejemplo:

#define MAX 100
#define MULTIPLICA(x,y) (x)*(y)
...
#undef MAX
#undef MULTIPLICA

134 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.11.3 Compilacin condicional
Sintaxis:

#ifdef nombre_macro
#else
#endif
Ejemplo:

int a,b,c;

#ifdef MULTIPLICA
c = MULTIPLICA(a,b);
#else
c = a*b;
#endif
135 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.11.3 Compilacin condicional
Sintaxis:

#ifndef nombre_macro
#else
#endif
Ejemplo:

int a,b,c;

#ifndef MULTIPLICA
c = a*b;
#else
c = MULTIPLICA(a,b);
#endif
136 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.11.3 Compilacin condicional
Ejemplo para evitar la inclusin mltiple de un mismo fichero de
cabecera.

Fichero "Ejemplo.h"

#ifndef __EJEMPLO_H
#define __EJEMPLO_H
...
#endif

Fichero "Ejemplo.c"

#include "Ejemplo.h"


El preprocesador incluir el fichero "Ejemplo.h" en el fichero "Ejemplo.c"
solamente si no se ha incluido anteriormente.

137 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.12 Programacin modular
En C, una aplicacin puede estar compuesta por
varios mdulos, cada uno de los cuales ofrece
un conjunto de recursos (funciones, tipos de
datos, variables, etc.) los cuales pueden ser
utilizados por otros mdulos.
Un mdulo es un fichero fuente con extensin .c
el cual puede ser compilado por separado
creando un fichero .o.
Una aplicacin compuesta de varios mdulos
requiere compilar todos los mdulos y
posteriormente enlazarlos generando el
fichero ejecutable .exe (en windows).
138 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.12.1 Ficheros Cabecera
Por cada fichero de mdulo .c podemos asociar un
fichero cabecera .h, que contendr la
declaracin de todas las funciones, tipos y
variables que se hacen pblicas al resto de
mdulos (interface).

Los mdulos que vayan a utilizar recursos de un
mdulo .c podrn hacerlo incluyendo el fichero
.h asociado:

#include "Fichero.h"
139 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.12.1 Ficheros Cabecera
Fichero "Suma.c"

int suma(int a, int b) { return a+b; }

Fichero "Suma.h"

#ifndef __SUMA_H
#define __SUMA_H
int suma(int a, int b);
#endif

Fichero "Main.c"

#include "Suma.h"
int main() { int a = suma(3,5); return 0; }
140 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.12.1 Ficheros Cabecera
Fichero "Vector.h" (Vector como estructura)

#ifndef __VECTOR_H
#define __VECTOR_H

typedef struct { int * a; int n; } Vector;
Vector LeeVector();
void EscribeVector(Vector v);

#endif


Fichero "Main.c"

#include "Vector.h"
int main()
{
Vector v = LeeVector();
EscribeVector(v);
free(v.a);
return 0;
}
141 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.12.1 Ficheros Cabecera
Fichero "Vector.c" (Vector como estructura)

#include <stdlib.h>
#include <stdio.h>
#include "Vector.h"

Vector LeeVector()
{
Vector v;
scanf("%d",&v.n);
v.a = malloc(sizeof(int)*v.n);
for(int i=0;i<v.n;i++) scanf("%d",&v.a[i]);
return v;
}

void EscribeVector(Vector v)
{
for(int i=0;i<v.n;i++) printf("%d ",v.a[i]);
}


142 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.12.1 Ficheros Cabecera
Fichero "Vector.h" (Vector como apuntador a una estructura)

#ifndef __VECTOR_H
#define __VECTOR_H
typedef struct { int * a; int n; } VectorEstructura;
typedef VectorEstructura * Vector;
Vector LeeVector();
void EscribeVector(Vector v);
void LiberaVector(Vector v);
#endif


Fichero "Main.c"

#include "Vector.h"
int main()
{
Vector v = LeeVector();
EscribeVector(v);
LiberaVector(v);
return 0;
}
143 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.12.1 Ficheros Cabecera
Fichero "Vector.c" (Vector como apuntador a una estructura)

#include <stdlib.h>
#include <stdio.h>
#include "Vector.h"

Vector LeeVector() {
Vector v = malloc(sizeof(VectorEstructura));
scanf("%d",&v->n);
v->a = malloc(sizeof(int)*v->n);
for(int i=0;i<v->n;i++) scanf("%d",&v->a[i]);
return v;
}
void EscribeVector(Vector v) {
for(int i=0;i<v->n;i++) printf("%d ",v->a[i]);
}
void LiberaVector(Vector v) {
free(v->a);
free(v);
}


144 Tecnologa de la Programacin
Tema 0. Introduccin a C
0.12.2 Variables globales static y extern
Relacionado con la programacin modular, el lenguaje C ofrece dos
tipos de almacenamiento de variables globales mediante el
uso de las palabras reservadas extern y static.

extern: Permite que una variable sea global a varias unidades
de compilacin. Para ello la variable se define en el espacio
global de uno de los ficheros y despus se declaran como
extern al comienzo de los dems mdulos (usualmente dentro
de los ficheros de cabecera).

static: El significado vara segn se aplique a una variable
local o global. En ambos casos, la variable es esttica
(extensin permanente) y su inicializacin se hace una sola vez,
al comienzo de la ejecucin del programa.
Cuando la variable es local, su efecto es que dicha variable
sigue teniendo mbito local, pero tiene extensin
permanente.
Cuando la variable es global, su efecto es que el mbito se
limita al fichero donde est definida.

Potrebbero piacerti anche