Lenguaje-C EDITADO
Lenguaje-C EDITADO
Lenguaje-C EDITADO
Tema 1 - Introducción.
El lenguaje de programación C fue creado por Brian Kernighan y Dennis
Ritchie a mediados de los años 70. La primera implementación del mismo la realizó
Dennis Ritchie sobre un computador DEC PDP-11 con sistema operativo UNIX. C es
el resultado de un proceso de desarrollo que comenzó con un lenguaje anterior, el
BCPL, el cual influyó en el desarrollo por parte de Ken Thompson de un lenguaje
llamado B, el cual es el antecedente directo del lenguaje C. El lenguaje C es un
lenguaje para programadores en el sentido de que proporciona una gran flexibilidad de
programación y una muy baja comprobación de incorrecciones, de forma que el
lenguaje deja bajo la responsabilidad del programador acciones que otros lenguajes
realizan por si mismos. Así, por ejemplo, C no comprueba que el índice de referencia
de un vector (llamado array en la literatura informática) no sobrepase el tamaño del
mismo; que no se escriba en zonas de memoria que no pertenecen al área de datos del
programa, etc.
2.1 - Identificadores.
Antes de proceder a explicar los identificadores en C, es necesario resaltar que
C es un lenguaje sensible al contexto, a diferencia por ejemplo de Pascal, por lo cual, C
diferencia entre mayúsculas y minúsculas, y por tanto, diferencia entre una palabra
escrita total o parcialmente en mayúsculas y otra escrita completamente en
minúsculas.
float a;
int b,c;
char caracter,otro_caracter;
El lenguaje de programación C
Existen, además, cuatro modificadores de tipo, los cuales se aplican sobre los
tipos de datos anteriormente citados. Los modificadores de tipo permiten cambiar el
tamaño, etc., de los tipos de datos anteriormente especificados. Estos modificadores,
que sintácticamente anteceden a la declaración del tipo de dato, son:
unsigned char a;
long double b;
short int i;
Modificador Efecto
const Variable de valor constante
volatile Variable cuyo valor es modificado
externamente
Tabla 2.2.4: Modificadores de acceso en C.
• Fuera de todas las funciones del programa, son las llamadas variables globales,
accesibles desde cualquier parte del programa.
• Dentro de una función, son las llamadas variables locales, accesibles tan solo
por la función en las que se declaran.
• Dentro de un bloque de código del programa, accesible tan solo dentro del
bloque donde se declara. Esta forma de declaración puede interpretarse como
una variable local del bloque donde se declara.
#include <stdio.h>
int sum; /* Variable global, accesible desde cualquier parte */
/* del programa*/
void suma(int x) /* Variable local declarada como parámetro, */
/* accesible solo por la función suma*/
{
sum=sum+x;
return;
}
void intercambio(int *a,int *b)
{
if (*a>*b)
{
int inter; /* Variable local, accesible solo dentro del */
/* bloque donde se declara*/
inter=*a;
*a=*b;
*b=inter;
}
return;
}
int main(void) /*Función principal del programa*/
{
int contador,a=9,b=0; /*Variables locales, accesibles solo */
/* por main*/
sum=0;
intercambio(&a,&b);
for(contador=a;contador<=b;contador++) suma(contador);
printf(“%d\n”,suma);
return(0);
}
Especificador de Efecto
almacenamiento
auto Variable local (por
defecto)
extern Variable externa
static Variable estática
register Variable registro
Tabla 2.4.1: Especificadores de almacenamiento en C.
El lenguaje de programación C
El especificador auto se usa para declarar que una variable local existe
solamente mientras estemos dentro de la subrutina o bloque de programa donde se
declara, pero, dado que por defecto toda variable local es auto, no suele usarse.
• Para variables locales, el especificador static indica que dicha variable local
debe almacenarse de forma permanente en memoria, tal y como si fuera una
variable global, pero su alcance será el que correspondería a una variable local
declarada en la subrutina o bloque. El principal efecto que provoca la
declaración como static de una variable local es el hecho de que la variable
conserva su valor entre llamadas a la función.
• Para variables globales, el especificador static indica que dicha variable global
es local al módulo del programa donde se declara, y, por tanto, no será
conocida por ningún otro módulo del programa.
2.5 - Constantes.
En C, las constantes se refieren a los valores fijos que el programa no puede
alterar. Algunos ejemplos de constantes de C son:
Código Significado
\b Retroceso
\f Alimentación de hoja
\n Nueva línea
\r Retorno de carro
\t Tabulador horizontal
\” Doble comilla
\’ Simple comilla
\0 Nulo
\\ Barra invertida
\v Tabulador vertical
\a Alerta
\o Constante octal
\x Constante
hexadecimal
Tabla 2.5.2: Constantes de barra invertida en C.
Los operadores ++, -- y % solo pueden usarse con datos de tipo int o char. El
operador incremento (++), incrementa en una unidad el valor de la variable sobre la
que se aplica, el operador decremento (--), decrementa en una unidad el valor de la
variable, y el operador módulo (%), calcula el resto de una división de dos variables de
tipo entero o carácter.
int var1=10,var2;
var2=++var1; /* Pone 11 en var2, pues primero incrementa var1,*/
/* y luego asigna su valor a var2 */
int var1=10,var2;
var2=var1++; /* Pone 10 en var2, pues primero asigna su valor */
/* a var2, y luego incrementa var1 */
El lenguaje de programación C
Los operadores relaciónales y lógicos tiene menor prioridad que los operadores
aritméticos antes descritos, así , escribir 10>3+9 es equivalente a escribir 10>(3+9).
Si tenemos char a[20], sizeof(a) devuelve el valor 20, y si tenemos float a[6],
sizeof(a) devuelve el valor 24 (4*6).
El lenguaje C posee operadores que actúan a nivel de bits sobre los datos, estos
operadores son:
Los operadores &, | y ^ actúan sobre dos operandos, mientras que ∼ ,<< y >>
actúan sobre un solo operando. Veamos su actuación sobre dos valores cualquiera:
Donde los números que acompañan a los operadores << y >> indican cuantas
posiciones se desplaza el operando. La prioridad de los operadores sobre bits es:
• Los operadores << y >> tienen la prioridad situada entre los operadores
aritméticos y los operadores relaciónales y lógicos.
3.6 - El operador ?.
El operador ? se usa para reemplazar las sentencias if/else (que veremos con
posterioridad) de formato general:
if (condición)
expresión;
else
expresión;
int x,y;
y=(x>10) ? 100 : 200;
int t;
(t) ? f1(t)+f2() : printf(“t vale cero”);
• Todos los char y short int se convierten a int. Todos los float a double.
char ch;
int i;
float f;
double d;
( ch / i ) + ( f * d ) - ( f + i );
char int float double float int
( ch / i ) + ( f * d ) - ( f + i );
int int double double double int
Al ser los dos operandos de igual tipo, realizamos la primera operación, (ch / i),
y el resultado es de tipo int. De igual forma, para la segunda operación, (f * d), y el
resultado es de tipo double.
Para la tercera operación, y dado que las variables no son del mismo tipo, se
aplica la segunda regla, convirtiéndose el int en double, realizándose la suma (f + i)
como dos datos de tipo double, y siendo por tanto el resultado un double.
El lenguaje de programación C
Y por último, realizamos la resta final, siendo los dos operandos de tipo double
y el resultado final, por tanto, de tipo double.
(tipo)expresión
int a=3,b=2;
float c;
c=a/b;
La operación asigna a c el valor 1.0 en vez de el valor 1.5, ello se debe a que al
ser a y b variables de tipo entero, se realiza una división entre enteros, y el resultado de
3/2 es 1. A continuación ese valor 1 se convierte a un valor en coma flotante para
realizar la asignación (valor 1.0), y se asigna a c. Si lo que se desea es que la división
se realice en punto flotante, debe escribirse la operación de la siguiente forma:
c=(float)a/b;
if (condición
sentencia;
else
sentencia;
int a,b;
if (a>b)
{
b--;
a=a+5;
}
else
{
a++;
b=b-5;
}
if (b-a!=7)
b=5;
if (x)
if (y) printf(“1”);
El lenguaje de programación C
else printf(“2”);
if (x)
{
if (y)
printf(“1”);
}
else
printf(“2”);
switch(variable)
{
case const1:
sentencia;
break;
case const2:
sentencia;
break;
...
default:
sentencia;
}
Donde variable debe ser de tipo char o int, y donde const1, const2, ..., indican
constantes de C del tipo de datos de la variable. Dichas constantes no pueden repetirse
dentro del switch. El default es opcional y puede no aparecer, así como los break de los
case. La sentencia switch se ejecuta comparando el valor de la variable con el valor de
cada una de las constantes, realizando la comparación desde arriba hacia abajo. En
caso de que se encuentre una constante cuyo valor coincida con el valor de la variable,
se empieza a ejecutar las sentencias hasta encontrar una sentencia break. En caso de
que no se encuentre ningún valor que coincida, se ejecuta el default (si existe). Veamos
algunos ejemplos:
int valor;
switch(valor)
{
case 0: cont++;
break;
case 5: cont--;
break;
default: cont=-10; /* Se ejecuta si valor no es 0 o 5 */
}
char d;
El lenguaje de programación C
int cont=0;
switch(d)
{
case ‘\r’: cont++; /* Si d es un retorno de carro, se */
/* ejecuta este cont++ y el siguiente*/
/* al no aparecer un break */
case ‘\x1B’: cont++;
break;
default: cont=-1;
}
Las sentencias switch pueden aparecer unas dentro de otras, igual que sucedía
con las sentencias if. Veámoslo con un ejemplo:
char d,e;
switch(d)
{
case ‘a’:
case ‘A’: switch(e)
{
case ‘1’: d=‘z’;
e=‘+’;
break;
case ‘2’: d=‘Z’;
e=‘-’;
}
break;
case ‘b’:
case ‘B’: switch(e)
{
case ‘0’: d=‘2’;
default: e=‘+’;
}
}
for(inicialización,condición,incremento) sentencia;
En primer lugar, conviene destacar el hecho de la gran flexibilidad del bucle for
de C. En C, el bucle for puede no contener inicialización, condición o incremento, o
incluso pueden no existir dos e incluso las tres expresiones del bucle. El bucle for se
ejecuta siempre que la condición sea verdadera, es por ello que puede llegar a no
ejecutarse.
int i,suma=0;
for(i=1;i<=100;i++)
suma=suma+i;
int i,j;
El lenguaje de programación C
for(i=0,j=100;j>i;i++,j--)
{
printf(“%d\n”,j-i);
printf(“%d\n”,i-j);
}
float a=3e10;
for(;a>2;a=sqrt(a)) /* sqrt() calcula la raíz cuadrada */
printf(“%f”,a);
char d;
for(;getc(stdin)!=’\x1B’;); /* Bucle que espera hasta que se */
/* pulsa la tecla Esc */
char d;
for(;;)
{
d=getc(stdin);
printf(“%c”,d);
if (d==‘\x1B’)
break;
}
Donde la sentencia puede no existir (sentencia vacía), pero siempre debe existir
la condición. El bucle while se ejecuta mientras la condición sea verdad. Veamos
algunos ejemplos de bucles while:
int i=1,suma=0;
while (i<=100)
{
suma=suma+i;
i++;
}
do
sentencia;
while (condición);
int num;
do
scanf(“%d”,&num);
while (num>100);
int i,j;
do
{
scanf(“%d”,&i);
scanf(“%d”,&j);
}
while (i<j);
int x;
for(x=0;x<10;x++)
{
for(;;)
if (getc(stdin)==‘\x1B’)
break;
printf(“Salí del bucle infinito, el valor de x es: %d\n”,x);
}
int x;
for(x=1;x<=100;x++) /* Esta rutina imprime en pantalla los */
{ /*números pares */
El lenguaje de programación C
if (x%2)
continue;
printf(“%d\n”,x);
}
El lenguaje de programación C
tipo nombre[tamaño];
int x[100],i;
for(i=0;i<100;i++)
x[i]=i;
char letras[256];
int i;
for(i=0;i<256;i++)
letras[i]=i;
int x[10],i,suma;
for(i=0;i<10;i++)
{
printf(“Introducir un número: %d: “,i);
scanf(“%d”,&x[i]);
}
for(suma=0,i=0;i<10;i++)
suma=suma+x[i];
printf(“La suma es: “,suma);
float a[10];
int i;
for(i=0;i<100;i++) /* Este bucle es incorrecto */
a[i]=i;
char cadena[tamaño];
El lenguaje de programación C
Como toda cadena debe terminar en el carácter ‘\0’, es por ello que si se quiere
usar una cadena de 20 caracteres, debe declararse de tamaño 21 (20 caracteres +
carácter terminador).
Por lo demás, puede usarse una cadena como si fuera un array unidimensional,
pues se puede referenciar uno cualquiera de sus elementos, etc. Para manejar las
cadenas, existen un gran número de funciones de biblioteca que proporciona el
standard ANSI-C, para más información referirse al apendice A o a cualquier libro de
C.
tipo nombre[tam1][tam2]...[tamN];
float matriz[2][3];
int i,j;
for(i=0;i<2;i++)
for(j=0;j<3;j++)
{
printf(“M[%d][%d]: “,i,j);
scanf(“%f”,&matriz[i][j]);
}
tipo nombre[tam1][tam2]...[tamN]={lista_de_valores};
float vector[3]={-3.0,5.7,-7.5};
float vector[]={-3.0,5.7,-7.5};
char cadena[]=“Esto es una cadena”;
6.2 – Punteros.
Los punteros son una de las poderosas herramientas que ofrece el lenguaje C a
los programadores, sin embargo, son también una de las más peligrosas, el uso de
punteros sin inicializar, etc., es una fuente frecuente de errores en los programas de C,
y además, suele producir fallos muy difíciles de localizar y depurar.
El lenguaje de programación C
tipo *nombre;
int *a;
char *p;
float *f;
int *a,b;
Y hacemos:
a=&b;
int *a,b,c;
Si hacemos:
b=15;
a=&b;
c=*a;
int *a,*b,c;
a=&c;
b=a;
• Aritmética de punteros. Sobre las variables de tipo puntero es posible utilizar los
operadores +, -, ++ y --. Estos operadores incrementan o decrementan la posición
de memoria a la que “apunta” la variable puntero. El incremento o decremento se
realiza de acuerdo al tipo base de la variable de tipo puntero, de ahí la importancia
del tipo del que se declara la variable puntero. Veamos esto con la siguiente tabla:
Operación ++ -- +9 -5
Variable Dirección actual Nueva
dirección
int *a; 3000 3002 2998 3018 2990
float *b 3000 3004 2996 3036 2980
Tabla 6.2.1: Ejemplos de aritmética de punteros en C.
tipo *a;
Y hacemos:
a=a+num;
int *a,*b;
if (a<b)
printf(“a apunta a una dirección más baja que b”);
Existe una estrecha relación entre los punteros y los arrays. Consideremos el
siguiente fragmento de código:
char str[80],*p;
p=str;
en cuenta que el nombre del array sin índice es la dirección de comienzo del array, y, si
además, se tiene en cuenta que un puntero puede indexarse como un array
unidimensional, por lo cual, en el ejemplo anterior, podríamos referenciar ese elemento
como p[4].
int str[80],*p;
p=&str[4];
Entonces, el puntero p contiene la dirección del quinto elemento del array str.
Hasta ahora hemos declarado variables puntero aisladas. Es posible, como con
cualquier otro tipo de datos, definir un array de variables puntero. La declaración para
un array de punteros int de tamaño 10 es:
int *a[10];
Para asignar una dirección de una variable entera, llamada var, al tercer
elemento del array de punteros, se escribe:
x[2]=&var;
*x[2];
int a,*b,**c;
b=&a;
c=&b;
Tema 7 - Funciones.
El formato general de una función de C es:
Las funciones son simulares a las de cualquier otro lenguaje, pero, tal y como
citamos en la introducción, al no ser un lenguaje estructurado por bloques, no es
posible declarar funciones dentro de otras funciones.
Esa función es equivalente a otra que tuviera como última línea una sentencia
return, y funcionaría de igual forma.
Esta función, podría ser llamada desde otra función de la siguiente forma:
#include <stdio.h>
void Alfa(int *val,float pos)
{
*val=5;
pos=7.7;
return;
}
void Beta(int val,float *pos)
{
val=10;
*pos=14.7;
}
int main(void)
{
int a=6;
float b=9.87;
printf(“Al principio valen a=%d b=%f\n”,a,b);
Alfa(&a,b);
printf(“Después de Alfa valen a=%d b=%f\n”,a,b);
Beta(a,&b);
printf(“Después de Beta valen a=%d b=%f\n”,a,b);
}
Ello es, pues a Alfa se le pasa la variable a por "referencia" (se le pasa &a, o
sea, un puntero a la variable a), y la variable b por valor, mientras que en Beta sucede
al revés.
#include <stdio.h>
void PasoValorReferencia(int *array,int valor)
{
array[5]=-8.6;
valor=4;
}
int main(void)
{
int array[10]={0,0,0,0,0,0,0,0,0,0};
PasoValorReferencia(array,array[3]);
printf(“Array[5] vale: %d y array[3] vale:%d\n”,array[5],array[3]);
return 0;
}
#include <stdio.h>
int main(int argc,char *argv[],char *env[])
{
int i;
Escribirá en pantalla:
7.5 - Recursividad.
Una función de C puede llamarse a si misma. Este proceso recibe el nombre de
recursividad. Los ejemplos de recursividad abundan, siendo uno de los mas habituales
la función factorial:
return num*Factorial(num-1);
}
El lenguaje de programación C
int (*a)(int,float);
void (*b)(void);
struct nombre_estructura{
tipo nombre_variable;
tipo nombre_variable;
...
tipo nombre_variable;
}variables_estructura;
struct LISTA{
int tam;
char cadena[50];
}var_lista;
struct DATO{
int tam;
float vector[3];
struct DATO *siguiente;
};
struct {
float a,b;
unsigned long i,j;
char cadena[5];
}memo[10];
struct ALFA{
int a;
float b;
};
struct BETA{
struct ALFA alfa;
float c,d;
}variable;
variables_estructura.nombre_variable;
El lenguaje de programación C
var_lista.tam;
var_list.cadena;
var_list.cadena[7];
memo[2].a;
memo[6].cadena[3];
variable.alfa.a;
variable.c;
struct ALFA{
int a;
char b[20];
};
int main(void)
{
struct ALFA a,b[10];
El lenguaje de programación C
PasoDeElementos(a.val,a.b);
PasoDeLaEstructuraPorValor(a);
PasoDeLaEstructuraPorReferencia(&a);
PasoDeUnArrayDeEstructuras(b);
return 0;
}
struct nombre_campo_bit{
tipo nombre1 : longitud;
tipo nombre2 : longitud;
...
tipo nombreN : longitud;
}variables_campo_bit;
El tipo de un campo de bit debe declararse como unsigned int o signed int.
Veamos un ejemplo de declaración de un campo de bit:
struct ALFA{
unsigned a : 1;
signed b : 2;
unsigned : 4;
unsigned c : 1;
}campo;
struct EMP{
char nombre[20],apellido[2][20];
float sueldo;
unsigned vacaciones:1;
unsigned enfermo:1;
};
8.3 - Uniones.
En C una unión es una posición de memoria que se usa por varias variables
similares, que pueden ser de tipos diferentes. La definición de unión es:
union nombre_union{
tipo nombre1;
tipo nombre2;
...
tipo nombreN;
}var_union;
union ALFA{
int a;
char b;
}alfa;
Tendremos:
<------alfa.a------>
Byte0 Byte1
<-alfa.b->
union BETA{
unsigned short a;
char b[2];
};beta
8.4 - Enumeraciones.
Una enumeración es un conjunto de constantes enteras con nombre y especifica
todos los valores legales que pueden tener unas variables. Las enumeraciones se
declaran de la siguiente forma:
Las enumeraciones asignan una constante entera a cada uno de los símbolos de
la enumeración, empezando por el valor 0. Esto puede modificarse colocando en la
declaración el valor que deseamos tengan los elementos a partir de uno dado. Esto se
realiza de la siguiente forma:
En este caso, las constantes primero, segundo y tercero tienen los valores 0,1 y
2, las constantes cuarto_t y quinto_t los valores 100 y 101, y las constantes cuarto_e y
quinto_e los valores 200 y 201 respectivamente.
typedef struct{
unsigned codigo;
char nombre[40];
char apellido[40];
}cliente;
entero a;
cliente b,*c;
El lenguaje de programación C
Tema 9 - El preprocesador.
En un programa escrito en C, es posible incluir diversas instrucciones para el
compilador dentro del código fuente del programa. Estas instrucciones dadas al
compilador son llamadas directivas del preprocesador y, aunque realmente no son parte
del lenguaje C, expanden el ámbito del entorno de programación de C.
El preprocesador, definido por el standard ANSI de C, contiene las siguientes
directivas:
#define TRUE 1
#define FALSE 0
#define TAM 10
.......
#undef TAM
#include <stdio.h>
#include "stdio.h"
#if expresión1
secuencia de sentencias
#elif expresión2
secuencia de sentencias
......
#else
secuencia de sentencias
#endif
#if MEM>100
printf("MEM es mayor de 100");
#endif
#define VALOR 0
#if VALOR==0
c=a*b/(VALOR+1);
#else
c=a*b/VALOR;
#endif
#define VALOR 15
#if VALOR<0
b=b/(-VALOR);
#elif VALOR==0
b=b/(VALOR+1);
#else
b=b/VALOR;
#endif
#define VAL 10
#ifdef VAL
printf("VAL definido");
#else
printf("VAL no definido");
#endif
#ifndef NOVAL
printf("NOVAL no definido");
#endif
Veamos un ejemplo:
#pragma nombre
El lenguaje de programación C
int getchar(void);
Dicha función lee caracteres, de uno en uno, desde el teclado, esperando, para
leer los caracteres, la pulsación de un retorno de carro. Es por ello que es posible
escribir varios caracteres antes de que se ninguno de ellos sea leído. La función
getchar() hace eco en pantalla del carácter leído. En caso de error devuelve EOF.
#include <stdio.h>
int main(void)
{
char ch;
do
{
ch=getchar();
putchar(ch);
}
while (ch!='e' && ch!='E');
return 0;
}
Este programa lee todas las teclas pulsadas en el teclado, y las coloca en
pantalla, hasta leer una 'e' o una 'E'. Obsérvese que solo lee las teclas después de pulsar
un retorno de carro.
La función gets() lee un string desde el teclado hasta que se pulsa un retorno de
carro. El string es almacenado en la variable s, y el retorno de carro leído desde el
teclado es, automáticamente, reemplazado por un carácter de final de string ('\0').
Devuelve un puntero a la variable s si sucede de forma correcta, y NULL en caso
contrario. La función gets() permite corregir errores de teclado usando la tecla de
retroceso antes de pulsar el retorno de carro.
#include <stdio.h>
int main(void)
{
char cadena[TAM];
return 0;
}
El lenguaje de programación C
La función scanf() se usa para leer cualquier tipo de dato predefinido desde el
teclado, y convertirlo, de forma automática, al formato interno adecuado. La función se
define como:
El string formato es la cadena de control que indica los datos a leer. Dicha
cadena de control consta de tres clases de caracteres:
• Especificadores de formato.
• Caracteres de espacio en blanco.
• Caracteres que no sean espacios en blanco.
Especificado Descripción.
r
%c Leer un único carácter.
%d Leer un entero decimal.
%i Leer un entero decimal.
%e Leer un número en punto flotante.
%f Leer un número en punto flotante.
%g Leer un número en punto flotante.
%o Leer un número octal.
%s Leer una cadena de caracteres.
%x Leer un número hexadecimal.
%p Leer un puntero.
%n Recibe un valor igual al número de carácter leídos.
%u Leer un entero sin signo.
Tabla 10.1.1: Especificadores de formato de la función scanf().
Un carácter que no sea espacio en blanco da lugar a que scanf() lea y elimine el
carácter asociado. Por ejemplo, %d:%d da lugar a que scanf() lea primero un int,
El lenguaje de programación C
después lea, y descarte, los dos puntos, y luego lea otro int. Si el carácter especificado
no se encuentra, scanf() termina su ejecución.
Todas las variables utilizadas para recibir valores (si son necesarias), deben ser
pasadas por "referencia", o sea, por sus direcciones. Esto supone que los argumentos
deben ser punteros a las variables.
La presencia del signo * después del signo % y antes del código del formato
produce que scanf() lea, pero no asigne el valor leído a ninguna variable. Por ejemplo:
int x,y;
scanf("%d%*c%d",&x,&y);
La cadena apuntada por formato consta de dos tipos de elementos. El primer tipo
esta constituido por los caracteres que se mostraran en pantalla. El segundo tipo
contiene las ordenes de formato que describen la forma en que se muestran los
argumentos. Las ordenes de formato están precedidas por el signo % y le sigue el
código de formato. Estas ordenes de formato son:
Especificado Descripción
r
%c Carácter.
%d Enteros decimales con signo.
%i Enteros decimales con signo.
%e Punto flotante en notación científica (e minúscula).
%E Punto flotante en notación científica (E mayúscula).
%f Punto flotante.
%g Usar el más corto de %e y %f.
%G Usar el más corto de %E y %f.
%o Octal sin signo.
%s Cadena de caracteres.
%u Enteros decimales sin signo.
%x Hexadecimales sin signo (letras minúsculas).
%X Hexadecimales sin signo (letras mayúsculas).
%p Mostrar un puntero.
El lenguaje de programación C
#include <stdio.h>
int main(void)
{
int a,b;
if (b!=0)
printf("\nEl valor de %d dividido %d es: %f\n",
a,b,(float)a/b);
else
printf("\nError, b vale 0\n");
return 0;
}
Donde nombre es un string que contiene el nombre del archivo que queremos leer
y modo es otro string que contiene el modo de apertura deseado. Dichos modos de
apertura son:
Modo Descripción
r Abrir un archivo para lectura.
w Crear un archivo para escritura.
a Abrir un archivo para añadir.
rb Abrir un archivo binario para lectura.
wb Crear un archivo binario para escritura.
ab Abrir un archivo binario para añadir.
rt Abrir un archivo de texto para lectura.
wt Crear un archivo de texto para escritura.
at Abrir un archivo de texto para añadir.
r+ Abrir una archivo para lectura/escritura.
w+ Crear un archivo para lectura/escritura.
a+ Abrir un archivo para leer/añadir.
r+b Abrir un archivo binario para lectura/escritura.
w+b Crear un archivo binario para lectura/escritura.
a+b Abrir un archivo binario para leer/añadir.
r+t Abrir un archivo de texto para lectura/escritura.
w+t Crear un archivo de texto para lectura/escritura.
a+t Abrir un archivo de texto para leer/añadir.
Tabla 10.2.1: Modos de apertura de un fichero con la función fopen().
FILE *fp;
if ((fp=fopen("prueba","w"))==NULL)
{
puts("\nNo puedo abrir el fichero\n");
exit(1);
}
El lenguaje de programación C
Un valor devuelto de cero indica que el archivo fue cerrado con éxito.
Cualquier valor distinto de cero indica un error.
#include <stdio.h>
if (argc!=2)
{
puts("Nombre del fichero no pasado");
return 0;
}
if ((fp=fopen(argv[1],"r"))==NULL)
{
printf("Error abriendo el fichero: %s\n",argv[1]);
return 0;
}
if (fclose(fp))
{
puts("Error cerrando el fichero");
return 1;
}
return 0;
}
Una vez abierto un archivo, y hasta que se proceda a cerrarlo es posible leer,
escribir, etc., en el, según se indique en el modo de apertura. Las principales funciones
de lectura y escritura sobre un archivo son:
La función getc() lee caracteres del archivo asociado a fp. Devuelve EOF
cuando se alcanza el final del archivo.
La función fgets() funciona de igual forma que la función gets(), solo que,
además de leer del fichero asociado a fp, el parámetro n indica el número máximo de
caracteres que se pueden leer. Existe, además, una sutil diferencia, la función fgets() no
elimina el retorno de carro (si se lee) de la cadena de entrada, sino que lo conserva en
la misma,. añadiendo a continuación de dicho retorno de carro, y de forma automática,
el carácter de fin de cadena ('\0').
La función fputs() funciona igual que la función puts(), solo que, además de
escribir en el fichero asociado a fp, no añade al final del string un retorno de carro, tal
y como hacia la función puts().
#include <stdio.h>
if (argc!=3)
return 0;
if ((f_inp=fopen(argv[1],"rb"))==NULL)
return 0;
if ((f_out=fopen(argv[2],"wb"))==NULL)
exit(1);
while ((num=fread(buffer,sizeof(char),TAM,f_inp))!=0)
fwrite(buffer,sizeof(char),num,f_out);
if (fclose(f_inp) || fclose(f_out)
exit(1);
return 0;
}
#include <stdio.h>
char cadena[100];
fgets(cadena,100,stdin);
fputs(cadena,stderr);
El lenguaje de programación C
int *a;
a=(int *)malloc(sizeof(int));
*a=3;
float *a;
a=(float *)malloc(sizeof(float));
if (a==NULL) exit(0); /* Salimos del programa */
struct ALFA{
El lenguaje de programación C
unsigned a;
float b;
int *c;
}*d;
if ((d=(struct ALFA *)malloc(sizeof(struct ALFA)))==NULL)
exit(0); /Salimos del programa */
int *a;
if ((a=(int *)malloc(sizeof(int)))==NULL)
exit(0); /* Salimos del programa */
......
free(a);
struct LISTA{
tipo dato;
struct LISTA *sig;
};
Donde tipo es cualquier tipo de datos valido (float, int, long int, etc.)
El lenguaje de programación C
cabeza=CrearLista(cabeza,dato);
if ((p=BuscarLista(cabeza,dato))!=NULL)
/* El elemento ha sido encontrado */
if (cabeza!=NULL)
{
p=cabeza;
if (cabeza->dato==dato)
cabeza=cabeza->sig;
else
while (p!=NULL && p->dato!=dato)
{
q=p;
p=p->sig;
}
if (p!=NULL)
{
El lenguaje de programación C
q->sig=p->sig;
free(p);
}
}
return cabeza;
}
Siendo la llamada:
cabeza=LiberarLista(cabeza,dato);
El lenguaje de programación C
Existen muchas mas funciones de las aquí descritas, pero este pequeño conjunto de
funciones es lo suficientemente amplio como para que puedan realizarse todas las
operaciones necesarias.
feof
#include <stdio.h>
int feof(FILE *f);
ferror
#include <stdio.h>
int ferror(FILE *f);
El lenguaje de programación C
fflush
#include <stdio.h>
int fflush(FILE *f);
fgetc
#include <stdio.h>
int fgetc(FILE *f);
fgets
#include <stdio.h>
char *fgets(char *cad,int num,FILE *f);
La función fgets() lee como máximo hasta num-1 caracteres del archivo
asociado a f y los sitúa en el array apuntado por cad. Los caracteres se leen hasta que
se recibe un carácter de salto de linea, un EOF (fin de fichero) o hasta que se llega al
limite especificado. Después de leídos los caracteres, se pone automáticamente un
carácter de nulo inmediatamente después del ultimo carácter leído. Si se termina la
lectura por un carácter de salto de linea, dicho carácter se guarda como parte de cad. Si
tiene éxito, fgets() devuelve un puntero a la dirección de cad. En caso de error devuelve
un puntero nulo (NULL).
fopen
#include <stdio.h>
FILE *fopen(const char *nombre,const char *modo);
La función fopen() abre un archivo cuyo nombre viene dado por nombre y
devuelve un puntero a una estructura de tipo FILE que se le asocia en la apertura. El
El lenguaje de programación C
tipo de operaciones permitidas en el archivo están definidas por el valor de modo. Los
valores permitidos de modo son:
Modo Descripción
r Abrir un archivo para lectura.
w Crear un archivo para escritura.
a Abrir un archivo para añadir.
rb Abrir un archivo binario para lectura.
wb Crear un archivo binario para escritura.
ab Abrir un archivo binario para añadir.
rt Abrir un archivo de texto para lectura.
wt Crear un archivo de texto para escritura.
at Abrir un archivo de texto para añadir.
r+ Abrir una archivo para lectura/escritura.
w+ Crear un archivo para lectura/escritura.
a+ Abrir un archivo para leer/añadir.
r+b Abrir un archivo binario para lectura/escritura.
w+b Crear un archivo binario para lectura/escritura.
a+b Abrir un archivo binario para leer/añadir.
r+t Abrir un archivo de texto para lectura/escritura.
w+t Crear un archivo de texto para lectura/escritura.
a+t Abrir un archivo de texto para leer/añadir.
Tabla A.1.1: Modos de apertura de un fichero con la función fopen().
fprintf
#include <stdio.h>
int fprintf(FILE *f,const char *formato,...);
fputc
#include <stdio.h>
int fputc(int c,FILE *f);
fputs
#include <stdio.h>
int fputs(const char *cad,FILE *f);
fread
#include <stdio.h>
int fread(void *buf,size_t tam,sise_t cuenta, FILE *f);
La función fread() lee cuenta numero de elementos, cada uno de ellos de tam
bytes de longitud, del archivo asociado a la variable f, y los sitúa en el array apuntado
por buf. El indicador de posición del archivo se incrementa en el número de bytes
leídos. La función fread() devuelve el número de elementos realmente leídos. Si se leen
menos elementos de los pedidos en la llamada se produce un error. La función fread()
funciona de forma correcta en archivos abiertos en modo binario; en archivos abiertos
en modo texto, pueden producirse ciertos cambios de caracteres (salto de carro seguido
de salto de linea se convierte en salto de linea, etc.).
fscanf
#include <stdio.h>
int fscanf(FILE *f,const char *formato,...);
La función fscanf() lee del archivo asociado a la variable f de igual forma que la
función scanf() lo realiza del teclado. Devuelve el numero de argumentos a los que
realmente se asigna valores. Este número no incluye los campos ignorados. Si se
produce un error antes de realizar la primera asignación se devuelve el valor EOF. Para
mas información consultar la función scanf().
fseek
#include <stdio.h>
#int fseek(FILE *f,long desp,int origen);
ftell
#include <stdio.h>
long ftell(FILE *f);
La función ftell() devuelve el valor actual del indicador de posición del archivo
asociado a la variable f. Para archivos binarios, el valor devuelto es el número de bytes
desde el principio del archivo. Para archivos de texto solo debe usarse como argumento
para la función fseek(), ya que, debido a que secuencias de caracteres como retorno de
carro y salto de línea pueden sustituirse por un salto de línea, el tamaño aparente del
archivo puede variar. Si falla la función ftell() devuelve el valor -1L.
fwrite
#include <stdio.h>
int fwrite(const void *buf,size_t tam,size_t cuenta,FILE *f);
getc
#include <stdio.h>
int getc(FILE *f);
gets
El lenguaje de programación C
#include <stdio.h>
char *gets(char *cad);
perror
#include <stdio.h>
int perror(const char *cad);
printf
#include <stdio.h>
int printf(const char *formato,...);
Especificador Descripción
%c Carácter.
%d Enteros decimales con signo.
%i Enteros decimales con signo.
%e Punto flotante en notación científica (e minúscula).
%E Punto flotante en notación científica (E mayúscula).
%f Punto flotante.
%g Usar el más corto de %e y %f.
%G Usar el más corto de %E y %f.
%o Octal sin signo.
%s Cadena de caracteres.
%u Enteros decimales sin signo.
%x Hexadecimales sin signo (letras minúsculas).
El lenguaje de programación C
putc
#include <stdio.h>
int putc(int c,FILE *f);
puts
#include <stdio.h>
int puts(char *cad);
rewind
#include <stdio.h>
void rewind(FILE *f);
scanf
#include <stdio.h>
int scanf(const char *formato,...);
• Especificadores de formato.
• Caracteres de espacio en blanco.
• Caracteres que no sean espacios en blanco.
Especificador Descripción.
%c Leer un único carácter.
%d Leer un entero decimal.
%i Leer un entero decimal.
%e Leer un número en punto flotante.
%f Leer un número en punto flotante.
%g Leer un número en punto flotante.
%o Leer un número octal.
%s Leer una cadena de caracteres.
%x Leer un número hexadecimal.
%p Leer un puntero.
%n Recibe un valor igual al número de carácter
leídos.
%u Leer un entero sin signo.
Tabla A.1.4: Especificadores de formato de la función scanf().
Un carácter que no sea espacio en blanco, da lugar a que scanf() lea y elimine el
carácter asociado. Por ejemplo, %d:%d da lugar a que scanf() lea primero un int,
después lea, y descarte, los dos puntos, y luego lea otro int. Si el carácter especificado
no se encuentra, scanf() termina su ejecución.
El lenguaje de programación C
Todas las variables utilizadas para recibir valores a través de scanf() deben ser
pasadas por referencia, o sea, por sus direcciones. Esto supone que los argumentos
deben ser punteros a las funciones.
La presencia del signo * después del signo % y antes del código del formato,
produce que scanf() lea, pero no asigne el valor leído a ninguna variable, por ejemplo:
scanf("%d%*c%d",&x,&y);
setbuf
#include <stdio.h>
void setbuf(FILE *f, char *buf);
setvbuf
#include <stdio.h>
int setvbuf(FILE *f,char *buf,int modo,.size_t tam);
Modo Descripción
_IOFBF Modo normal, el buffer se vacía solo cuando se llena (en escritura), o bien,
cuando ya se ha leído todo su contenido (en lectura).
_IOLBF Igual al anterior, solo que el buffer también se vacía cuando se lee o escribe
un retorno de carro.
_IONBF Desactiva el buffer.
Tabla A.1.5: Valores del modo en la función setvbuf().
El lenguaje de programación C
sprintf
#include <stdio.h>
int sprintf(char *buf,const char *formato,...);
sscanf
#include <stdio.h>
int sscanf(const char *buf,const char *formato,...);
La función sscanf() es idéntica a la función scanf(), excepto que los datos son
leídos del array apuntado por buf. El valor devuelto por la función es igual al número
de campos que hubieran sido realmente asignados. Este número no incluye los campos
que fueron saltados al utilizar el modificador de ordenes de formato *. Para más
detalles vea la función scanf().
ungetc
#include <stdio.h>
int ungetc(int c,FILE *f);
isalpha
El lenguaje de programación C
#include <ctype.h>
int isalpha(int ch);
iscntrl
#include <ctype.h>
int iscntrl(int ch);
isdigit
#include <ctype.h>
int isdigit(int ch);
isgraph
#include <ctype.h>
int isgraph(int ch);
islower
#include <ctype.h>
int islower(int ch);
isprint
#include <ctype.h>
int isprint(int ch);
ispunct
#include <ctype.h>
El lenguaje de programación C
isspace
#include <ctype.h>
int isspace(int ch);
isupper
#include <ctype.h>
int isupper(int ch);
isxdigit
#include <ctype.h>
int isxdigit(int ch);
tolower
#include <ctype.h>
int tolower(int ch);
toupper
#include <ctype.h>
int toupper(int ch);
memcmp
#include <string.h>
int memcmp(const void *buf1,const void *buf2,size_t cuenta);
memcpy
#include <string.h>
void *memcpy(void *hacia,const void *desde,size_t cuenta);
La función memcpy() copia cuenta caracteres del array apuntado por desde en el
array apuntado por hacia. Si los arrays se superponen, el comportamiento de memcpy()
queda indefinido. La función devuelve un puntero a hacia.
memset
#include <string.h>
void *memset(void *buf,int ch,size_t cuenta);
strcat
#include <string.h>
char *strcat(char *cad1,const char *cad2);
El lenguaje de programación C
strchr
#include <string.h>
char *strchr(char *cad,int ch);
strcmp
#include <string.h>
int strcmp(const char *cad1,const char *cad2);
strcpy
#include <string.h>
char *strcpy(char *cad1,const char *cad2);
strlen
#include <string.h>
unsigned int strlen(char *cad);
strtok
#include <string.h>
char *strtok(char *cad1,const char *cad2);
El lenguaje de programación C
La función strtok() modifica la cadena apuntada por cad1, pues, cada vez que se
encuentra una palabra, se pone un carácter nulo donde esta el delimitador. De esta
forma strtok() puede continuar avanzando por la cadena.
asin
#include <math.h>
double asin(double arg);
atan
#include <math.h>
double atan(double arg);
atan2
#include <math.h>
double atan2(double y,double x);
ceil
#include <math.h>
double ceil(double num);
cos
#include <math.h>
double cos(double arg);
La función cos() devuelve el coseno de arg. El valor de arg debe venir dado en
radianes.
cosh
#include <math.h>
double cosh(double arg);
exp
#include <math.h>
double exp(double arg);
fabs
#include <math.h>
double fabs(double num);
floor
#include <math.h>
double floor(double num);
fmod
#include <math.h>
double fmod(double x,double y);
log
#include <math.h>
double log(double num);
log10
#include <math.h>
double log10(double num);
pow
#include <math.h>
double pow(double base,double exp);
sin
#include <math.h>
double sin(double arg);
La función sin() devuelve el seno de arg. El valor de arg debe venir dado en
radianes.
sinh
#include <math.h>
double sinh(double arg);
sqrt
#include <math.h>
double sqrt(double num);
tan
#include <math.h>
double tan(double arg);
La función tan() devuelve la tangente de arg. El valor de arg debe venir dado en
radianes.
tanh
#include <math.h>
double tanh(double arg);
La función calloc() asigna memoria para un array de num objetos, cada uno de
los cuales tiene tamaño tam. La memoria asignada es inicializada con el valor cero. La
función calloc() devuelve un puntero al primer byte de la región asignada. Si no existe
memoria libre suficiente para satisfacer la petición, se devuelve un puntero nulo
(NULL).
free
#include <stdlib.h>
void free(void *ptr);
La función free() libera la memoria apuntada por ptr, haciendo que dicha
memoria este disponible para futuras asignaciones. Solo se debe llamar a free() con un
puntero que haya sido previamente asignado utilizando alguna función de asignación
dinámica.
El lenguaje de programación C
malloc
#include <stdlib.h>
void *malloc(size_t tam);
realloc
#include <stdlib.h>
void *realloc(void *ptr,size_t tam);
La función abs() devuelve el valor absoluto del entero dado por num.
atof
#include <stdlib.h>
double atof(const char *cad);
El número puede terminar por cualquier carácter que no pueda formar parte de
un número válido en coma flotante. Esto incluye espacios en blanco, signos de
puntuación distintos del punto, y caracteres que no sean E o e. Así si se llama a atof()
con la cadena "100.00HOLA", devolverá el valor 100.00.
El lenguaje de programación C
atoi
#include <stdlib.h>
int atoi(const char *cad);
La función atoi() convierte la cadena apuntada por cad en un valor de tipo int.
La cadena debe contener un número entero valido. Si no es este el caso, el valor
devuelto es indefinido, aunque, la mayoría de implementaciones de la función
devuelven el valor cero.
El número puede acabar con cualquier carácter que no pueda formar parte de un
número entero. Esto incluye espacios en blanco, signos de puntuación, y cualquier
carácter que no sea la E o la e. Esto supone que si se llama a atoi() con la cadena
"123.23", devolverá el valor 123.
atol
#include <stdlib.h>
long int atol(const char *cad);
La función atol() convierte la cadena apuntada por cad en un valor de tipo long
int. Para más información consultar la función atoi().
exit
#include <stdlib.h>
void exit(int estado);
labs
#include <stdlib.h>
long labs(long num);
system
#include <stdlib.h>
int system(const char *cad);
La función system() pasa la cadena apuntada por cad como una orden al
procesador de ordenes del sistema operativo. Si se llama a system() con un puntero
nulo (NULL), devuelve un valor distinto de cero si está presente un procesador de
El lenguaje de programación C
B.1 - palindro.c.
/* Programa que calcula si una palabra es palindroma, esto es, se lee
igual de derecha a izquierda que de izquierda a derecha. */
#include <stdio.h>
#include <string.h>
i=0;
j=strlen(cadena)-1;
while (i<j && cadena[i]==cadena[j])
{
i++;
j--;
}
return (i>=j);
}
int main(void)
{
char cadena[TAM];
printf("\nIntroduce la palabra\n");
gets(cadena);
printf("La palabra: %s %s palindroma.\n",cadena,
(Palindroma(cadena)) ? "es" : "no es");
return 0;
}
B.2 - matriz.c.
/* Programa que calcula el producto de dos matrices. */
#include <stdio.h>
75
El lenguaje de programación C
char Menu(void)
{
register char d;
do
{
printf("%s",cadena);
scanf("%u",&valor);
}
while (valor==0 || valor>TAM);
return valor;
}
76
El lenguaje de programación C
if (a->columna!=b->fila)
return ERROR;
res->fila=a->fila;
res->columna=b->columna;
for(i=0;i<a->fila;i++)
for(j=0;j<b->columna;j++)
{
res->matriz[i][j]=0;
for(k=0;k<a->fila;k++)
res->matriz[i][j]+=a->matriz[i][k]*b->matriz[k][j];
}
return OK;
}
for(i=0;i<res->fila;i++)
{
for(j=0;j<res->columna;j++)
printf("Res[%u][%u]= %f\n",i,j,res->matriz[i][j]);
printf("\nPulsa Enter para continuar.\n");
getchar();
}
}
77
El lenguaje de programación C
int main(void)
{
struct MATRIZ a,b,res;
char d;
a.fila=a.columna=b.fila=b.columna=1;
a.matriz[0][0]=b.matriz[0][0]=1.0;
do
switch(d=Menu())
{
case '0':break;
case '1':PedirMatriz(&a);
break;
case '2':PedirMatriz(&b);
break;
case '3':
if (Multiplicar(&a,&b,&res)==ERROR)
printf("\nNo es posible multiplicar A*B\n");
else
Mostrar(&res);
break;
case '4':
if (Multiplicar(&b,&a,&res)==ERROR)
printf("\nNo es posible multiplicar B*A\n");
else
Mostrar(&res);
break;
}
while (d!='0');
return 0;
}
B.3 - ordenar.c.
/* Programa que ordena un fichero de cualquier tamaño mediante el
algoritmo QuickSort. El fichero contiene como primer elemento un
unsigned con el numero de elementos del fichero, y a continuacion
figuran todos los elementos a ordenar */
#include <stdio.h>
#include <stdlib.h>
78
El lenguaje de programación C
if ((fp=fopen(nombre,"rt"))==NULL)
{
printf("\nError, no puedo abrir el fichero: %s\n",nombre);
return NULL;
}
fscanf(fp,"%u\n",num);
if ((p=(float *)calloc(*num,sizeof(float)))==NULL)
{
printf("\nError, memoria insuficiente.\n");
fclose(fp);
return NULL;
}
for(i=0;i<*num;i++)
fscanf(fp,"%f\n",&p[i]);
fclose(fp);
return p;
}
if ((fp=fopen(nombre,"wt"))==NULL)
{
printf("\nError, no puedo crear el fichero: %s\n",nombre);
return;
}
fprintf(fp,"%u\n",num);
for(i=0;i<num;i++)
fprintf(fp,"%f\n",p[i]);
fclose(fp);
}
val=p[(i+j)/2];
do
{
while (p[i]<val) i++;
while (p[j]>val) j--;
if (i<=j)
79
El lenguaje de programación C
{
inter=p[i];
p[i]=p[j];
p[j]=inter;
i++;
j--;
}
}
while (i<=j);
if (izq<j) QuickSort(p,izq,j);
if (i<der) QuickSort(p,i,der);
return;
}
if (argc!=3)
{
printf("\nModo de uso: %s <fichero1> <fichero2>\n",argv[0]);
return(1);
}
if ((p=LeerFichero(argv[1],&num))==NULL)
return 1;
QuickSort(p,0,num-1);
GuardarFichero(argv[2],num,p);
free(p);
return 0;
}
B.4 - fichero.c.
/* Programa que maneja una pequeña base de datos directamente sobre el
fichero */
#include <stdio.h>
#include <string.h>
80
El lenguaje de programación C
char Menu(void)
{
register char d;
fseek(fichero,0L,SEEK_SET);
while (fread(&ficha,sizeof(struct FICHA),1,fichero)==1)
if (dni==ficha.dni)
{
if (opcion)
Mostrar(&ficha);
Return OK;
}
return ERROR;
}
81
El lenguaje de programación C
fseek(fichero,0L,SEEK_SET);
while (fread(&ficha,sizeof(struct FICHA),1,fichero)==1)
if (!strcmp(apellido,ficha.apellido[0]) ||
!strcmp(apellido,ficha.apellido[1]))
{
Mostrar(&ficha);
encontrado=1;
}
return (encontrado) ? OK : ERROR;
}
82
El lenguaje de programación C
break;
}
return ficha;
}
if (argc!=2)
{
printf("\nModo de uso: %s <fichero>\n",argv[0]);
return 1;
}
if ((fichero=fopen(argv[1],"a+b"))==NULL)
{
printf("\nError creando el fichero: %s\n",argv[1]);
return 1;
}
if (setvbuf(fichero,NULL,_IOFBF,
TAM_BUFFER*sizeof(struct FICHA))!=0)
{
printf("\nError creando el buffer para %d elementos.\n",
TAM_BUFFER);
fclose(fichero);
return 1;
}
do
switch(d=Menu())
{
case '0':break;
case '1':if (Insertar(fichero,PedirDatos(&ficha,2))==ERROR)
printf("\nNumero de dni duplicado.\n");
break;
case '2':PedirDatos(&ficha,0);
if (BuscarDni(fichero,ficha.dni,1)==ERROR)
printf("\nDni no existente.\n");
break;
case '3':PedirDatos(&ficha,1);
if (BuscarApellido(fichero,ficha.apellido[1])==ERROR)
printf("\nApellido inexistente.\n");
break;
}
while (d!='0');
fclose(fichero);
return 0;
}
B.5 - arbol.c.
/* Programa que lee las palabras de un fichero y las almacena en un
arbol binario */
#include <stdio.h>
El lenguaje de programación C
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
if ((fichero=fopen(nombre,"rt"))==NULL)
{
printf("\nError, no puedo leer el fichero: %s\n",nombre);
return(NULL);
}
while (LeerPalabra(fichero,cadena)!=NULL)
{
if ((q=(struct ARBOL *)malloc(sizeof(struct ARBOL)))==NULL)
{
84
El lenguaje de programación C
85
El lenguaje de programación C
Mostrar(p->der,cont);
free(p);
}
if (argc!=2)
{
printf("\nModo de uso: %s <fichero>\n",argv[0]);
return 1;
}
if ((p=LeerFichero(argv[1]))==NULL)
return 1;
printf("\n\n\n\n\n\n");
Mostrar(p,&cont);
return 0;
}
86