Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Transparencias C PDF
Transparencias C PDF
1. Introduccion 5
2. Fundamentos de C 15
3. Operadores y expresiones 30
4. Sentencias de control 51
5. Funciones y programacion estructurada 79
6. Punteros y ambito de las variables 97
7. Cadena de caracteres 123
8. Vectores 136
9. Estructuras de datos 156
10. Entrada/Salida 181
Introducci
on al Lenguaje 11. Aspectos avanzados de C 192
de Programacion C 12. Herramientias para el desarrollo de pro- 215
gramas en UNIX
Bibliografa
3 4
Introducci
on al lenguaje C
Historia de C
Introducci
on al lenguaje C Introducci
on al lenguaje C
ecientes.
Estrechamente asociado con el sistema operativo UNIX:
{ UNIX y su software fueron escritos en C.
B Es un lenguaje adecuado para programacion de sis-
(Ken Thompson, 1970) temas por su utilidad en la escritura de sistemas oper-
ativos.
Es adecuado tambien para cualquier otro tipo de apli-
cacion.
Lenguaje peque~no: solo ofrece sentencias de control sen-
cillas y funciones.
UNIX C
1ª versión (1969) (Dennis Ritchie, 1972)
Ken Thompson
Dennis Ritchie
7 8
Introducci
on al lenguaje C Introducci
on al lenguaje C
9 10
Introducci
on al lenguaje C Introducci
on al lenguaje C
11 12
Introducci
on al lenguaje C Introducci
on al lenguaje C
Un compilador de C permite:
{ Analizar y detectar errores en el codigo fuente. Código fuente
Código ejecutable
13 14
Fundamentos de C
Comentarios
#include <stdio.h>
main()
{
/*********************************/
/* Esto es un comentario */
FUNDAMENTOS DE C /*********************************/
16
Fundamentos de C Fundamentos de C
17 18
Fundamentos de C Fundamentos de C
Ejemplos: \b
\r
backspace
retorno de carro
\" comillas
printf("Hola mundo\n");
\' apostrofo
printf("El numero 28 es %d\n", 28);
\\ backslash
printf("Imprimir %c %d %f\n", a', 28, 3.0e+8);
\? signo de interrogacion
Especicadores de formato: Especicadores de ancho de campo:
Caracter Argumentos Resultado
d, i entero entero decimal con signo printf("Numero entero = %5d \n", 28);
u entero entero decimal sin signo
o entero entero octal sin signo produce la salida:
x,X entero entero hexadecimal sin signo
f real real con punto y con signo Numero entero = 28
e, E real notacion exponencial con signo
g, G printf("Numero real = %5.4f \n", 28.2);
c caracter un caracter
s cadena de caracteres cadena de caracteres produce la salida:
% imprime %
p void Dependiente implementacion Numero entero = 28.2000
ld,lu,lx,lo entero entero largo
19 20
Fundamentos de C Fundamentos de C
Identicador utilizado para representar un cierto tipo Una declaracion asocia un tipo de datos determinado a
de informacion. una o mas variables.
Cada variable es de un tipo de datos determinado. El formato de una declaracion es:
Una variable puede almacenar diferentes valores en dis- tipo_de_datos var1, var2, ..., varN;
tintas partes del programa.
Debe comenzar con una letra o el caracter Ejemplos:
El resto solo puede contener letras, numeros o int a, b, c;
float numero_1, numero_2;
Ejemplos de variables validas: char letra;
numero unsigned long entero;
_color
identificador_1
Deben declararse todas las variables antes de su uso.
Deben asignarse a las variables nombres signicativos.
C es sensible a mayusculas y minusculas. Las siguientes
variables son todas distintas: int temperatura;
int k;
pi PI Pi pI
21 22
Fundamentos de C Fundamentos de C
Una expresion representa una unidad de datos simple, El operador de asignacion (=) asigna un valor a una
tal como un numero o caracter. variable.
Tambien puede estar formados por identicadores y op- Puede asignarse valor inicial a una variable en su
eradores: declaracion.
a + b #include <stdio.h>
num1 * num2 main()
{
Una sentencia controla el
ujo de ejecucion de un pro- int a = 1;
grama. float b = 4.0;
{ Sentencia simple: int c, d;
char letra;
temperatura = 4 + 5;
{ Sentencia compuesta: c = 10;
{ letra = a';
temperatura_1 = 4 + 5; d = a + c;
temperatura_2 = 8 + 9;
} printf("a = %d \n", a);
printf("b = %f \n", b);
printf("c = %d \n", c);
printf("d = %d \n", d);
printf("La letra es %c \n", letra);
}
23 24
Fundamentos de C Fundamentos de C
Permite leer datos del usuario. Programa que lee un numero entero y lo eleva al
La funcion devuelve el numero de datos que se han ledo cuadrado:
correctamente.
Formato: #include <stdio.h>
main()
scanf(formato, argumentos); {
Especicadores de formato igual que printf(). int numero;
int cuadrado;
Ejemplos:
printf("Introduzca un numero:");
scanf("%f", &numero); scanf("%d", &numero);
25 26
Fundamentos de C Fundamentos de C
Permite denir constantes simbolicas en el programa. Programa que lee el radio de un circulo y calcula su
area.
#define nombre texto
#include <stdio.h>
nombre representa un nombre simbolico que suele es- #define PI 3.141593
cribirse en mayusculas.
main()
texto no acaba en ; {
nombre es sustituido por texto en cualquier lugar del float radio;
float area;
programa.
Ejemplos: printf("Introduzca el radio: ");
scanf("%f", &radio);
#define PI 3.141593
area = PI * radio * radio;
printf("El area del circulo es %5.4f \n", area);
#define CIERTO 1
exit(0);
#define FALSO 0 }
#define AMIGA "Marta"
27 28
Fundamentos de C
29
El operador % requiere que los dos operandos sean en- Expresion Valor
teros. a +b 8
La mayora de las versiones de C asignan al resto el a
a
b
b
14
-33
mismo signo del primer operando.
-3
Valores negativos con el signo
a=b
. Ejemplo: 4 a % b 2
31 32
Operadores y expresiones Operadores y expresiones
Ejemplo:
( (int) 5.5 % 4)
33 34
La prioridad indica el orden en el que se realizan las Operador de incremento ++ incrementa en uno el
operaciones aritmeticas. operando.
Las operaciones con mayor precedencia se realiza antes. Operador de decremento decrementa en uno el
operando.
Prioridad Operacion
Primero ( ) Variantes:
Segundo Negacion (signo menos) { Postincremento =) i + +
Tercero ; =; % { Preincremento =) + + i
Cuarto +;
{ Postdecremento =) i
Dentro de cada grupo las operaciones se realizan de { Predecremento =) i
izquierda a derecha.
Ejemplos:
Ejemplo 1: { La expresion i + +; () i = i + 1
a - b / c * d { La expresion + + i; () i = i + 1
{ La expresion i ; () i = i 1
es equivalente a
{ La expresion i; () i = i 1
a - ((b/c) * d)
Si el operador precede al operando el valor del operando
Ejemplo2: se modicara antes de su utilizacion.
(a - b) / c * (a + c)
Si el operador sigue al operando el valor del operando
se modicara despues de su utilizacion.
(a - b) / (c * d)
35 36
Operadores y expresiones Operadores y expresiones
37 38
Prioridad Operacion
Operadores logicos en C:
Primero ( ) Operador Funcion
Segundo > < =
> < = && Y logica (AND)
Tercero == != jj O logica (OR)
! NO logico (NOT)
Los operadores aritmeticos tienen mayor prioridad que Actuan sobre operandos que son a su vez expresiones
los operadores relacionales.
logicas que se interpretan como:
Dentro de cada grupo las operaciones se realizan de
{ cierto, cualquier valor distinto de 0
izquierda a derecha.
{ falso, el valor 0
Ejemplo: Si a =1y b = 2 =)
Se utilizan para formar expresiones logicas.
Expresion Valor Interpretacion El resultado es un valor entero que puede ser:
== a > b 0 falso
{ cierto se representa con un 1
a < b
39 40
Operadores y expresiones Operadores y expresiones
41 42
Ejemplos: si a = 7 y b = 3 =)
43 44
Operadores y expresiones Operadores y expresiones
1. A j se le asigna 5
2. A i se le asigna el valor de j
45 46
47 48
Operadores y expresiones Operadores y expresiones
k = (a < 0) ? 0 : 100;
{ Primero se evalua (a < 0)
{ Como es falso el operador condicional devuelve 100
{ Este valor se asigna a k. Es decir k toma el valor
100
49 50
Sentencias de control
Introduccion
NO SI NO
SENTENCIAS DE CONTROL A C C
SI
B A B A
52
Sentencias de control Sentencias de control
Sentencia if Sentencia if
53 54
Ejemplo 1 Ejemplo 2
Programa que lee un numero e indica si es par. Programa que lee un numero y lo eleva al cuadrado si
#include <stdio.h>
es par.
#include <stdio.h>
main()
{ main()
int numero; {
int numero;
/* leer el numero */ int cuadrado;
printf("Introduzca un numero: ");
scanf("%d", &numero); /* leer el numero */
printf("Introduzca un numero: ");
if ((numero % 2) == 0) scanf("%d", &numero);
printf("El numero %d es par.\n", numero);
} if ((numero % 2) == 0)
{
cuadrado = numero * numero;
printf("El cuadrado de %d es %d.\n", numero,
cuadrado);
}
}
55 56
Sentencias de control Sentencias de control
57 58
/* Leer el numero */
expresion 2 es una condicion que debe ser cierta para
printf("Introduzca un numero: "); que se ejecute sentencia.
scanf("%d", &numero); expresion 3 se utiliza para modicar el valor del
parametro.
if ((numero % 2) == 0)
printf("El numero %d es par.\n", numero); El bucle se repite mientras expresion 2 no sea cero
else (falso).
printf("El numero %d es impar.\n", numero);
Si sentencia es compuesta se encierra entre { }
} expresion 1 y expresion 3 se pueden omitir.
Si se omite expresion 2 se asumira el valor perma-
nente de 1 (cierto) y el bucle se ejecutara de forma in-
denida.
59 60
Sentencias de control Sentencias de control
main()
expresion 1 {
int numero;
SI numero = 0
NO
sentencia numero <= 100
SI
printf("%d\n",numero)
expresion 3
numero++
61 62
while (expresion)
{
sentencia 1
sentencia 2 sentencia
.
.
sentencia N
}
63 64
Sentencias de control Sentencias de control
do
{
/* se lee el numero */
printf("Introduzca un numero: ");
scanf("%d", &numero);
SI
expresion > 0 if ((numero % 2) == 0)
printf("El numero %d es par.\n", numero);
else
NO printf("El numero %d es par.\n", numero);
} while (numero != 0)
}
67 68
Sentencias de control Sentencias de control
case exp N:
case exp M: exp1 exp2 exp N
sentencia N1;
sentencia N2;
.
.
sentencia 1 sentencia 2 sentencia N
break;
default:
sentencia D;
.
}
69 70
switch(letra)
{
case a':
case A':
printf("Vocal %c\n", letra);
break;
case e':
case E':
printf("Vocal %c\n", letra);
break;
case ':
case I':
printf("Vocal %c\n", letra);
break;
case o':
case O':
printf("Vocal %c\n", letra);
break;
case u':
case U':
71 72
Sentencias de control Sentencias de control
Los bucles se pueden anidar unos en otros. Se utiliza para terminar la ejecucion de bucles o salir de
Se pueden anidar diferentes tipos de bucles. una sentencia switch.
73 74
#include <stdio.h>
if (error)
printf("Error en la lectura de los datos\n");
#define TRUE 1
else
#define FALSE 0
{
if (total > 0)
main()
{
{
media = suma / total;
float valor;
printf("Media = %f\n", media);
float suma = 0.0;
}
float media;
else
int cont;
printf("El numero de datos es 0\n");
int total;
}
int error = FALSE;
}
int leidos;
75 76
Sentencias de control Sentencias de control
Version estructurada
#include <stdio.h>
if (error)
printf("Error en la lectura de los datos\n");
#define TRUE 1
else
#define FALSE 0
{
if (total > 0)
main()
{
{
media = suma / total;
float valor;
printf("Media = %f\n", media);
float suma = 0.0;
}
float media;
else
int cont = 0;
printf("El numero de datos es 0\n");
int total;
}
int error = FALSE;
}
int leidos;
77 78
Funciones y programaci
on estructurada
Introduccion
80
Funciones y programacion estructurada Funciones y programaci
on estructurada
Programa que calcula el maximo de dos numeros. Programa que dice si un numero es cuadrado un per-
#include <stdio.h>
fecto.
int maximo(int a, int b); /* prototipo de funcion */ #include <stdio.h>
#include <math.h>
main()
{ #define TRUE 1
int x, y; #define FALSE 0
int max;
void explicacion(void);
printf("Introduzca dos numeros: "); int cuadrado_perfecto(int x);
scanf("%d %d", &x, &y);
main()
max = maximo(x,y); /* llamada a la funcion */ {
printf("El maximo es %d\n", max); int n;
} int perfecto;
81 82
83 84
Funciones y programacion estructurada Funciones y programaci
on estructurada
Ejemplo: funcion que calcula x elevado a y (con y en- En una llamada habra un argumento real por cada ar-
tero). gumento formal.
85 86
if (a > b) c = getchar();
2 max = a; while (c != EOF)
else
la funcion max = b; {
devuelve el valor cont = cont + 1;
de max (8) return(max);
}
c = getchar();
}
return(cont);
}
87 88
Funciones y programacion estructurada Funciones y programaci
on estructurada
Recursividad Macros
Una funcion se llama a s misma de forma repetida hasta La sentencia #define se puede utilizar para denir
que se cumpla alguna condicion. macros.
Ejemplo: el factorial de un numero: Una macro es un identicador equivalente a una ex-
8
>< 1 presion, sentencia o grupo de sentencias.
si n =0
f (n) = >
:n (
f n 1) si n > 0 Ejemplo: programa que calcula el maximo de dos
numeros.
Funcion que calcula el factorial de forma recursiva:
#include <stdio.h>
89 90
91 92
Funciones y programacion estructurada Funciones y programaci
on estructurada
NO SI NO
A C C
SI
B A B A
93 94
95 96
Punteros y
ambito de las variables
Introduccion
98
main()
{
int x; /* variable de tipo entero */
int y; /* variable de tipo entero */
int *px; /* variable de tipo
puntero a entero */
x = 5;
px = &x; /* asigna a px la direccion de x */
y = *px; /* asigna a y el contenido de la
direccion almacenada en px */
N
printf("x = %d\n", x);
printf("y = %d\n", y);
printf("*px = %d\n", *px);
}
99 100
Punteros y ambito de las variables Punteros y
ambito de las variables
101 102
letra =
a'; n1 = *p1 + *p2;
p = &letra;
103 104
Punteros y ambito de las variables Punteros y
ambito de las variables
105 106
#include <stdio.h>
main()
{
int x = 2;
void funcion(int *a, int *b); /* prototipo */
int y = 5;
main()
printf("Antes x = %d, y = %d\n", x, y); {
int x = 2;
funcion(x, y);
int y = 5;
printf("Despues x = %d, y = %d\n", x, y); 1
} printf("Antes x = %d, y = %d\n", x, y);
funcion(&x, &y);
return;
}
107 108
Punteros y ambito de las variables Punteros y
ambito de las variables
return;
}
109 110
Cuando se asigna 0 a un puntero, este no apunta a Devuelve el tama~no en bytes que ocupa un tipo o vari-
ningun objeto o funcion. able en memoria.
La constante simbolica NULL denida en stdio.h #include <stdio.h>
tiene el valor 0 y representa el puntero nulo.
main()
Es una buena tecnica de programacion asegurarse de {
que todos los punteros toman el valor NULL cuando float num;
no apuntan a ningun objeto o funcion.
printf(
un int ocupa %d bytes\n", sizeof(int));
int *p = NULL; printf(
un char ocupa %d bytes\n", sizeof(char));
printf(
un float ocupa %d bytes\n", sizeof(float));
Para ver si un puntero no apunta a ningun objeto o printf(
un double ocupa %d bytes\n", sizeof(double));
funcion: printf("num ocupa %d bytes\n", sizeof(num));
}
if (p == NULL)
printf("El puntero es nulo\n");
else
printf("El contenido de *p es\n", *p);
111 112
Punteros y ambito de las variables Punteros y
ambito de las variables
Ambito de las variables y tipos de almacenamiento Variables locales
Existen dos formas de caracterizar una variable: Solo se reconocen dentro de la funcion donde se denen.
Son invisibles al resto.
{ Por su tipo de datos.
{ Por su tipo de almacenamiento. Una variable local normalmente no conserva su valor
una vez que el control del programa se transere fuera
El tipo de dato se reere al tipo de informacion que de la funcion.
representa la variable (int, char, . . . ).
#include <stdio.h>
El tipo de almacenamiento se reere a su permanencia void funcion1(void);
y a su ambito.
main()
El ambito de una variable es la porcion del programa {
en la cual se reconoce la variable. int a = 1; /* variable local */
Segun el ambito, las variables pueden ser: int b = 2; /* variable local */
113 114
Se declaran fuera de las funciones y antes de su uso. Mantienen los valores que se les asignan en las funciones.
Pueden ser accedidas desde cualquier funcion. Es mejor hacer uso de variables locales para evitar efec-
tos secundarios o laterales.
#include <stdio.h>
void funcion1(void); #include <stdio.h>
int a = 1000; /* variable global */ void funcion1(void);
int a; /* variable global */
main()
{ main()
int b = 2; /* variable local */ {
115 116
Punteros y ambito de las variables Punteros y
ambito de las variables
El uso de variables globales puede causar errores ines- Las variables locales que se denen en las funciones.
perados. Su ambito es local.
Cualquier funcion puede cambiar el valor de una vari- Su vida se restringe al tiempo en el que esta activa la
able global =)efectos secundarios o laterales. funcion.
Recomendaciones: Los parametros formales se tratan como variables au-
{ Evitar el uso de variables globales. tomaticas.
{ Mantener las variables lo mas locales que se pueda. Se pueden especicar con la palabra reservada auto
{ Cuando se precise hacer accesible el valor de una aunque no es necesario.
variable a una funcion se pasara como argumento. #include <stdio.h>
main()
{
auto int valor; /* equivalente a int valor */
valor = 5;
printf("El valor es %d\n", valor);
}
117 118
veces = veces + 1;
printf("Se ha llamado %d veces a funcion\n",
veces);
}
119 120
Punteros y ambito de las variables Punteros y
ambito de las variables
121 122
Cadenas de caracteres
Introduccion
124
Cadenas de caracteres Cadenas de caracteres
125 126
127 128
Cadenas de caracteres Cadenas de caracteres
La funcion gets lee una lnea completa hasta que en- Programa que lee lneas hasta n de chero y cuenta el
cuentre el retorno de carro incluyendo los blancos. numero de caracteres de cada lnea:
La funcion puts escribe una cadena de caracteres junto #include <stdio.h>
con un salto de lnea. #define TAM_LINEA 80
129 130
Cuando se pasa una cadena a una funcion se pasa la di- Programa que lee lneas hasta n de chero y cuenta el
reccion de comienzo de la misma =)la cadena se puede numero de caracteres de cada lnea:
modicar en la funcion.
#include <stdio.h>
Ejemplo: #define TAM_LINEA 80
int longitud(char cadena[]);
#include <stdio.h>
main()
#define TAM_LINEA 80
{
void leer_linea(char linea[]);
char linea[TAM_LINEA];
int num_car;
main()
{
while (gets(linea) != NULL)
char linea[TAM_LINEA];
{
num_car = longitud(linea);
leer_linea(linea);
printf("Esta linea tiene %d caracteres\n",
puts("La linea es");
num_car);
puts(linea);
}
}
}
int longitud(char cadena[])
void leer_linea(char linea[])
{
{
int j = 0;
gets(linea);
return;
while (cadena[j] != '\0')
}
j++;
return(j);
}
131 132
Cadenas de caracteres Cadenas de caracteres
133 134
Cadenas de caracteres
En <string.h>
Funcion Signicado
strcpy Copia una cadena en otra
strlen Longitud de la cadena
strcat Concatenacion de cadenas
strcmp Comparacion de dos cadenas
strchr Buscar un caracter dentro de una cadena
strstr Buscar una cadena dentro de otra
En <stdlib.h>
Funcion Signicado VECTORES Y MATRICES
atoi Convierte una cadena a un entero (int)
atol Convierte una cadena a un entero largo
(long)
atof Convierte una cadena a un real (double)
135
Vectores y matrices Vectores y matrices
137 138
Procesamiento de un vector
/* leer el vector a */
for (j = 0; j < TAM_VECTOR; j++)
{
printf("Elemento %d: ", j);
scanf("%d", &vector_a[j]);
}
139 140
Vectores y matrices Vectores y matrices
Un vector se pasa a una funcion especicando su nombre Programa que calcula la media de los componentes de
sin corchetes. un vector.
El nombre representa la direccion del primer elemento #include <stdio.h>
del vector =)los vectores se pasan por referencia y #define MAX_TAM 4
se pueden modicar en las funciones.
void leer_vector(int vector[]);
El argumento formal correspondiente al vector se escribe int media_vector(int vector[]);
con un par de corchetes cuadrados vacos. El tama~no
no se especica. main()
{
int v_numeros[MAX_TAM];
int media;
leer_vector(v_numeros);
media = media_vector(v_numeros);
141 142
Punteros y vectores
void leer_vector(int vector[])
{
int j;
El nombre del vector representa la direccion del primer
elemento del vector
for(j=0; j<MAX_TAM; j++)
float vector[MAX_TAM];
{
printf("Elemento %d: ", j);
scanf("%d", &vector[j]); vector == &vector[0]
}
return; El nombre del vector es realmente un puntero al primer
} elemento del vector.
&x[0] ()x
int media_vector(int vector[])
&x[1] ()(x+1)
{ &x[2] ()(x+2)
int j; &x[i] ()(x+i)
int media = 0;
Es decir, &x[i] y (x+i) representan la direccion del
for(j=0; j<MAX_TAM; j++) i-esimo elemento del vector x =)
media = media + vector[j];
x[i] y *(x+1) representan el contenido del i-esimo el-
return(media/MAX_TAM); emento del vector x.
}
143 144
Vectores y matrices Vectores y matrices
145 146
147 148
Vectores y matrices Vectores y matrices
return(media/dim);
}
149 150
151 152
Vectores y matrices Vectores y matrices
Programa que dene de forma dinamica una matriz (me- float **crear_matriz(int fil, int col)
diante punteros). {
int j;
#include <stdio.h> float **mat;
#include <stdlib.h>
mat = (float **) malloc(fil * sizeof(float *));
float **crear_matriz(int fil, int col); for (j = 0; j < fil; j++)
void destruir_matriz(float **mat, int fil); mat[j] = (float *) malloc(col * sizeof(float));
void leer_matriz(float **mat, int fil, int col);
void imprimir_matriz(float **mat, int fil, int col); return(mat);
}
main()
{ void destruir_matriz(float **mat, int fil)
float **matriz; {
int fil, col; int j;
153 154
Vectores y matrices
155
Estructuras de datos Estructuras de datos
Estructuras Ejemplos
157 158
ayer = hoy;
159 160
Estructuras de datos Estructuras de datos
printf("Dia: ");
scanf("%d", &(f.dia));
printf("Mes: ");
scanf("%d", &(f.mes));
printf("Anno: ");
161 162
punto_1.x = 2.0;
punto_1.y = 4.0;
punto_2 = &punto_1;
163 164
Estructuras de datos Estructuras de datos
leer_punto(p1);
imprimir_punto(*p1);
free(p1);
}
165 166
Se pueden denir vectores cuyos elementos sean estruc- Una union contiene miembros cuyos tipos de datos
turas: pueden ser diferentes (igual que las estructuras).
main() Su declaracion es similar a las estructuras:
{
union nombre_estructura
struct punto vector_puntos[10];
{
int j;
tipo1 miembro_1;
tipo2 miembro_2;
for(j = 0; j < 10; j++)
.
{
.
printf("x_%d = %f\n", j, vector_puntos[j].x);
tipoN miembro_N;
printf("y_%d = %f\n", j, vector_puntos[j].y);
};
}
} Todos los miembros que componene la union comparten
la misma zona de memoria
Una variable de tipo union solo almacena el valor de
uno de sus miembros.
167 168
Estructuras de datos Estructuras de datos
169 170
171 172
Estructuras de datos Estructuras de datos
173 174
scanf("%d", &numero);
while(numero != 0)
lista {
insertar(&lista, numero);
Una lista es una estructura de datos dinamica que puede }
scanf("%d", &numero);
crecer segun las necesidades del programa (a diferencia
mostrar(lista);
de los vectores). borrar(lista);
}
175 176
Estructuras de datos Estructuras de datos
177 178
4. Insertar(&lista, 5);
lista 2 3
p1
p2 5 NULL
179 180
Entrada/salida
ENTRADA/SALIDA
182
Entrada/salida Entrada/salida
Ejemplo
Modo Signicado
"r" Abre un archivo existente para lec-
#include <stdio.h>
tura.
"w" Abre un nuevo archivo para escritura. main()
Si existe el archivo se borra su con- {
tenido. Si no existe se crea. FILE *desc;
"a" Abre un archivo existente para a~nadir
datos al nal. Si no existe se crea. desc = fopen("ejemplo.txt", "w");
"r+" Abre un archivo existente para lectura if (desc == NULL)
{
y escritura.
printf("Error, no se puede abrir el archivo\n");
"w+" Abre un archivo nuevo para escritura }
y lectura. Si existe lo borra. Si no else
existe lo crea. {
"a+" Abre un archivo para leer y a~nadir. /* se procesa el archivo */
183 184
Entrada/salida Entrada/salida
185 186
Entrada/salida Entrada/salida
}
exit(0); El prototipo de la funcion main es el siguiente:
main(int argc, char *argv[])
187 188
Entrada/salida Entrada/salida
Programa que recibe como argumento el nombre de dos main(int argc, char *argv[])
{
archivos compuestos de numeros enteros:
FILE *fent;
copiar_enteros archivo_entrada archivo_salida FILE *fsal;
int num;
el programa copia archivo_entrada en
if (argc != 3)
archivo_salida.
{
printf(Uso: %s fich_entrada fich_salida\n",
argv[0]);
exit(0);
}
189 190
Entrada/salida
fclose(fent);
fclose(fsal);
exit(0);
}
ASPECTOS AVANZADOS
191
Aspectos avanzados Aspectos avanzados
Permiten manejar los bits individuales en una palabra Operador de complemento a uno =)(~).
de memoria. Invierte los bits de su operando =)los unos se transfor-
Categoras: man en ceros y los ceros en unos.
{ Operador de complemento a uno. Ejemplo:
{ Operadores logicos binarios. #include <stdio.h>
{ Operadores de desplazamiento.
main()
{
unsigned int n = 0x4325;
193 194
195 196
Aspectos avanzados Aspectos avanzados
Expresion Valor
main() a << 1 16
{ a << 2 32
int n; a << 3 64
a >> 3 1
printf("Introduzca n: ");
scanf("%d", &n);
printf("bits menos signif. = %d\n",
n & MASCARA ); Operadores de asignacion binarios
}
&= ^= |= <<= >>=
197 198
199 200
Aspectos avanzados Aspectos avanzados
main()
{
int (*operacion)(int a, int b);
int a, b, oper, error, res;
printf("a, b: ");
scanf("%d %d", &a, &b);
printf("Operacion (0=suma, 1=resta): ");
scanf("%d", &oper);
201 202
203 204
Aspectos avanzados Aspectos avanzados
En C se pueden pasar funciones como argumentos a int ejecutar(int (*f)(int a, int b),
int a, int b)
otras funciones.
{
Cuando una funcion acepta el nombre de otra como int res;
argumento, la declaracion formal debe identicar este res = (*f)(a,b);
argumento como un puntero a otra funcion. return(res);
}
Ejemplo: main()
{
#define FALSE 0 int a, b, oper, error, res;
#define TRUE 1
int sumar(int a, int b) printf("a, b: ");
{ scanf("%d %d", &a, &b);
return(a+b); printf("Operacion (0=suma, 1=resta): ");
scanf("%d", &oper);
}
error = FALSE;
switch(oper)
int restar(int a, int b) {
{ case 0: res = ejecutar(sumar, a, b); break;
return(a-b); case 1: res = ejecutar(restar, a, b); break;
} default: error = TRUE;
}
if (!error)
printf("Resultado = %d\n", res);
}
205 206
C permite la declaracion de funciones con un numero Funcion que suma un numero variable de enteros.
de argumentos variable.
int sumar(int contador, ...)
Ejemplo: printf(), scanf(). {
El prototipo de estas funciones es: va_list ap;
int arg;
int sumar(int contador, ...); int total = 0;
El primer argumento es jo y obligatorio. int i = 0;
Hay que utilizar las funciones y macros denidas en va_start(ap, contador);
<stdarg.h> for (i = 0; i < contador; i++)
va_list, variable local utilizada para acceder a los {
parametros. arg = va_arg(ap, int);
total = total + arg;
va_start, inicializa los argumentos. }
va_arg, obtiene el valor del siguiente parametro. va_end(ap);
va_end, debera ser llamada una vez procesados todos return(total);
los argumentos. }
207 208
Aspectos avanzados Aspectos avanzados
Ejemplo Ejemplo
Funcion que imprime un conjunto indeterminado de ca- Funcion para imprimir argumentos.
denas de caracteres: #include <stdio.h>
#include <stdarg.h>
#include <stdio.h>
#include <stdarg.h> enum tipos_arg {INTARG, FLOATARG, NULO};
void miprint(enum tipos_arg *args, ...)
void imprimir(char *s1, ...) {
{ va_list ap;
va_list ap; int tipo;
char *arg;
va_start(ap, args);
while((tipo = *args++) != NULO)
va_start(ap, s1); {
printf("%s\n", s1); switch(tipo)
while ((arg = va_arg(ap, char *)) != NULL) {
printf("%s\n", arg); case INTARG:
va_end(ap); printf("int %d\n", va_arg(ap,int));
break;
return;
case FLOATARG:
} printf("float %f\n", va_arg(ap,double));
main() break;
{ default:
printf("Tipo desconocido\n");
imprimir("1", "2", "3", NULL); }
} }
va_end(ap);
return;
}
209 210
Compilacion condicional
main()
{
enum tipos_arg args[6] = {INTARG,
Las siguientes lneas:
INTARG, #ifdef identificador
FLOATARG,
#ifndef identificador
INTARG,
NULO};
indican la compilacion condicional del texto que las
miprint(&args[0], 5, 2, 3.4, 6);
sigue hasta encontrar la lnea:
}
#endif
211 212
Aspectos avanzados Aspectos avanzados
Ejemplo main()
{
#include <stdio.h> int suma;
#include <stdarg.h>
suma = sumar(4, 1, 2, 3, 4);
int sumar(int contador, ...) printf("suma = %d\n", suma);
{ }
va_list ap;
int arg;
int total = 0;
int i = 0;
va_start(ap, contador);
for (i = 0; i < contador; i++)
{
arg = va_arg(ap, int);
#ifdef DEBUG
printf("total = %d\n", total);
printf("arg = %d\n", arg);
#endif
total = total + arg;
}
va_end(ap);
return(total);
}
213 214
Herramientas para el desarrollo de programas en Unix Herramientas para el desarrollo de programas en Unix
{ step: Ejecuta la siguiente lnea. Si se trata de una make: Herramienta para el mantenimiento de programas
llamada a funcion, ejecuta solo la llamada y se para
al principio de la misma. Facilita el proceso de generacion y actualizacion de un
{ quit: Termina la ejecucion del depurador programa.
Determina automaticamente que partes de un programa
deben recompilarse ante una actualizacion de algunos
modulos y las recompila.
Para realizar este proceso, make debe conocer las depen-
dencias entre los cheros: Un chero debe actualizarse
si alguno de los que depende es mas nuevo.
make consulta un chero (Makefile) que contiene las
reglas que especican las dependencias de cada chero
objetivo y los mandatos para actualizarlo.
Formato de una regla:
objetivo: dep1 dep2 ...
TABmandato1
TABmandato2
TABmandato3
...
Formato del mandato:
make objetivo
Que implica:
1. Encontrar la regla correspondiente a objetivo
219 220
Herramientas para el desarrollo de programas en Unix Herramientas para el desarrollo de programas en Unix
221 222