Está en la página 1de 88

Lenguaje C

Enrique Vicente Bonet Esteban


El lenguaje de programacin C
Tema 1 - Introduccin.
El lenguaje de programacin C fue creado por Brian Kernighan y Dennis
Ritchie a mediados de los aos 70. a primera implementacin del mismo la reali!
Dennis Ritchie so"re un computador DEC #D#$%% con sistema operati&o '()*. C es
el resultado de un proceso de desarrollo +ue comen! con un lenguaje anterior, el
BC#, el cual influy en el desarrollo por parte de Ken -hompson 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 +ue proporciona una gran fle.i"ilidad de
programacin y una muy "aja compro"acin de incorrecciones, de forma +ue el
lenguaje deja "ajo la responsa"ilidad del programador acciones +ue otros lenguajes
reali!an por si mismos. /s0, por ejemplo, C no comprue"a +ue el 0ndice de referencia
de un &ector 1llamado array en la literatura inform2tica3 no so"repase el tamao del
mismo4 +ue no se escri"a en !onas de memoria +ue no pertenecen al 2rea de datos del
programa, etc.
El lenguaje C es un lenguaje estructurado, en el mismo sentido +ue lo son otros
lenguajes de programacin tales como el lenguaje #ascal, el /da o el 5odula$6, pero
no es estructurado por "lo+ues, o sea, no es posi"le declarar su"rutinas 1pe+ueos
tro!os de programa3 dentro de otras su"rutinas, a diferencia de como sucede con otros
lenguajes estructurados tales como el #ascal. /dem2s, el lenguaje C no es r0gido en la
compro"acin de tipos de datos, permitiendo f2cilmente la con&ersin entre diferentes
tipos de datos y la asignacin entre tipos de datos diferentes, por ejemplo la e.presin
siguiente es &2lida en C7
float a; /*Declaro una variable para numeros reales*/
int b; /*Declaro otra variable para numero enteros*/
b=a; /*Asigno a la variable para entera el numero real*/
-odo programa de C consta, "2sicamente, de un conjunto de funciones, y una
funcin llamada main, la cual es la primera +ue se ejecuta al comen!ar el programa,
llam2ndose desde ella al resto de funciones +ue compongan nuestro programa.
Desde su creacin, surgieron distintas &ersiones de C, +ue inclu0an unas u otras
caracter0sticas, pala"ras reser&adas, etc. Este hecho pro&oco la necesidad de unificar el
lenguaje C, y es por ello +ue surgi un standard de C, llamado /(8)$C, +ue declara
una serie de caracter0sticas, etc., +ue de"e cumplir todo lenguaje C. #or ello, y dado
+ue todo programa +ue se desarrolle siguiendo el standard /(8) de C ser2 f2cilmente
porta"le de un modelo de ordenador a otro modelo de ordenador, y de igual forma de
un modelo de compilador a otro, en estos apuntes e.plicaremos un C "asado en el
standard /(8)$C.
El lenguaje C posee un n9mero reducido de pala"ras reser&adas 1tan solo :63
+ue define el standard /(8)$C. Estas pala"ras reser&adas pueden &erse en la ta"la
siguiente7
auto break case char const continue default
do double else enum extern float for
goto if int long register return short
El lenguaje de programacin C
signed sizeof static struct switch typedef union
unsigned void volatile while
Tabla 1.1: Palabras reservadas del lenguaje C.
El lenguaje de programacin C
Tema 2 - Identificadores, tios de datos, !ariab"es
# constantes.
2.1 - Identificadores.
/ntes de proceder a e.plicar los identificadores en C, es necesario resaltar +ue
C es un lenguaje sensi"le al conte.to, a diferencia por ejemplo de #ascal, por lo cual, C
diferencia entre may9sculas y min9sculas, y por tanto, diferencia entre una pala"ra
escrita total o parcialmente en may9sculas y otra escrita completamente en
min9sculas.
En el lenguaje C, un identificador es cual+uier pala"ra no reser&ada +ue
comience por una letra o por un su"rayado, pudiendo contener en su interior letras,
n9meros y su"rayados. a longitud m2.ima de un identificador depende del
compilador +ue se este usando, pero, generalmente, suelen ser de :6 caracteres,
ignor2ndose todos a+uellos caracteres +ue compongan el identificador y so"repasen la
longitud m2.ima. Recu;rdese, adem2s, +ue al ser C sensi"le al conte.to, un
identificador escrito como esto_es_un_ident y otra &e! como Esto_Es_Un_Ident ser2
interpretado como dos identificadores completamente distintos.
2.2 - Tios de datos, modificadores de tio # modificadores
de acceso.
En C, toda &aria"le, antes de poder ser usada, de"e ser declarada, especificando
con ello el tipo de dato +ue almacenara. -oda &aria"le en C se declara de la forma7
tipo de dato! nombre de variable! "# nombre de variable$;
En C e.isten cinco tipos de datos seg9n puede &erse en la ta"la siguiente7
Tio de dato $escricin.
char
Car2cter o entero pe+ueo 1"yte3
int
Entero
float
#unto flotante
double
#unto flotante 1mayor rango +ue
float3
void
8in tipo 1uso especial3
Tabla 2.2.1: Tipos de datos en C.
/lgunos ejemplos de &aria"les de C ser0an7
float a;
int b#c;
char caracter#otro%caracter;
El lenguaje de programacin C
E.isten, adem2s, cuatro modificadores de tipo, los cuales se aplican so"re los
tipos de datos anteriormente citados. os modificadores de tipo permiten cam"iar el
tamao, etc., de los tipos de datos anteriormente especificados. Estos modificadores,
+ue sint2cticamente anteceden a la declaracin del tipo de dato, son7
%odificador Tios de actuacin $escricin
signed char int
Con signo 1por defecto3
unsigned char int
8in signo
long int double
argo
short int
Corto
Tabla 2.2.2: Modifiadores de los tipos de datos en C.
Es por ello, +ue podemos declarar &aria"les como7
unsigned char a;
long double b;
short int i;
Es posi"le, adem2s, aplicar dos modificadores seguidos a un mismo tipo de
datos, as0, es posi"le definir una &aria"le de tipo unsigned long int 1entero largo sin
signo3. El rango de &alores de +ue permite cada &aria"le depende del sistema operati&o
so"re el cual se tra"aje 158$D<8, =indo>s?@A?BA(-A6000, '()*Ainu.3, por lo cual
con&iene referirse al manual del compilador para conocerlo. De forma general, los
sistemas operati&os de %C "its 158$D<8, =indo>s %C "its3 poseen un rango y los de
:6 "its 1=indo>s :6 "its, '()*Ainu.3 otro.
&ango de !a"ores osib"es en 'notacin matem(tica)
Tio de !ariab"e dec"arada 1* bits +2 bits
char / signed char D$%6B , %67E D$%6B , %67E
unsigned char D0 , 6@@E D0 , 6@@E
int / signed int D$:67CB , :67C7E D$6%F7FB:CF7 , 6%F7FB:CFBE
unsigned int D0 , C@@:@E D0 , F6?F?C76?@E
short int / signed short
int
D$:67CB , :67C7E D$:67CB , :67C7E
unsigned short int D0 , C@@:@E D0 , C@@:@E
long int / signed long
int
D$6%F7FB:CF7 , 6%F7FB:CFBE D$6%F7FB:CF7 , 6%F7FB:CFBE
unsigned long int D0 , F6?F?C76?@E D0 , F6?F?C76?@E
float D$:.FEG:B , $:.FE$:BE, 0 ,
D:.FE$:B , :.FEG:BE
D$:.FEG:B , $:.FE$:BE, 0 ,
D:.FE$:B , :.FEG:BE
double D$%.7EG:0B , $%.7E$:0BE, 0 ,
D%.7E$:0B , %.7EG:0BE
D$%.7EG:0B , $%.7E$:0BE, 0 ,
D%.7E$:0B , %.7EG:0BE
long double D$:.FEGF?:6 , $%.%E$F?:6E, 0 ,
D:.FE$F?:6 , %.%EGF?:6E
D$:.FE$F?:6 , $%.%EGF?:6E, 0 ,
D:.FE$F?:6 , %.%EGF?:6E
Tabla 2.2.!: "ango de valores de las variables en C.
/dem2s de los modificadores de tipo e.isten modificadores de acceso. os
modificadores de acceso limitan el uso +ue puede reali!arse de las &aria"les
declaradas. os modificadores de acceso anteceden a la declaracin del tipo de dato de
la &aria"le y son los siguientes7
El lenguaje de programacin C
%odificador Efecto
const
Haria"le de &alor constante
volatile
Haria"le cuyo &alor es modificado
e.ternamente
Tabla 2.2.#: Modifiadores de aeso en C.
a declaracin de una &aria"le como onst permite asegurarse de +ue su &alor
no ser2 modificado por el programa, e.cepto en el momento de su declaracin, en el
cual de"e asign2rsele un &alor inicial. /s0, si declaramos la siguiente &aria"le7
const int x=&'(;
Cual+uier intento posterior de modificar el &alor de $, tal como $%$&'(,
producir2 un error en tiempo de compilacin.
a declaracin de una &aria"le como volatile, indica al compilador +ue dicha
&aria"le puede modificarse por un proceso e.terno al propio programa 1tal como la
hora del sistema3, y por ello, +ue no trate de optimi!ar dicha &aria"le suponi;ndole un
&alor constante, etc. Ello fuer!a a +ue cada &e! +ue se usa la &aria"le, se realice una
compro"acin de su &alor.
os modificadores onst y volatile pueden usarse de forma conjunta en ciertos
casos, por lo cual no son e.cluyentes el uno del otro. Ello es posi"le si se declara una
&aria"le +ue actuali!ara el reloj del sistema, 1proceso e.terno al programa3, y +ue no
+ueremos pueda modificarse en el interior del programa. #or ello, podremos declarar7
volatile const unsigned long int hora;
2.+ - $ec"aracin de !ariab"es # a"cance.
En C, las &aria"les pueden ser declaradas en cuatro lugares del mdulo del
programa7
Iuera de todas las funciones del programa, son las llamadas &aria"les glo"ales,
accesi"les desde cual+uier parte del programa.
Dentro de una funcin, son las llamadas &aria"les locales, accesi"les tan solo
por la funcin en las +ue se declaran.
Como par2metros a la funcin, accesi"les de igual forma +ue si se declararan
dentro de la funcin.
Dentro de un "lo+ue de cdigo del programa, accesi"le tan solo dentro del
"lo+ue donde se declara. Esta forma de declaracin puede interpretarse como
una &aria"le local del "lo+ue donde se declara.
#ara un mejor comprensin, &eamos un pe+ueo programa de C con &aria"les
declaradas de las cuatro formas posi"les7
El lenguaje de programacin C
)include stdio*h!
int sum; /* +ariable global# accesible desde cual,uier parte */
/* del programa*/
void suma-int x. /* +ariable local declarada como par/metro# */
/* accesible solo por la funci0n suma*/
1
sum=sum2x;
return;
3
void intercambio-int *a#int *b.
1
if -*a!*b.
1
int inter; /* +ariable local# accesible solo dentro del */
/* blo,ue donde se declara*/
inter=*a;
*a=*b;
*b=inter;
3
return;
3
int main-void. /*4unci0n principal del programa*/
1
int contador#a=5#b=6; /*+ariables locales# accesibles solo */
/* por main*/
sum=6;
intercambio-7a#7b.;
for-contador=a;contador=b;contador22. suma-contador.;
printf-89d:n;#suma.;
return-6.;
3
2., - Esecificadores de a"macenamiento de "os tios de
datos.
'na &e! e.plicada la declaracin de &aria"les y su alcance, &amos a proceder a
e.plicar como es posi"le modificar el alcance del almacenamiento de los datos. Ello es
posi"le reali!arlo mediante los especificadores de almacenamiento. E.isten cuatro
especificadores de almacenamiento. Estos especificadores de almacenamiento, cuando
se usan, de"en preceder a la declaracin del tipo de dato de la &aria"le. Estos
especificadores de almacenamiento son7
Esecificador de
a"macenamiento
Efecto
auto
Haria"le local 1por
defecto3
extern
Haria"le e.terna
static
Haria"le est2tica
register
Haria"le registro
Tabla 2.#.1: Espeifiadores de almaenamiento en C.
El lenguaje de programacin C
El especificador auto se usa para declarar +ue una &aria"le local e.iste
solamente mientras estemos dentro de la su"rutina o "lo+ue de programa donde se
declara, pero, dado +ue por defecto toda &aria"le local es auto, no suele usarse.
El especificador e$tern se usa en el desarrollo de programas compuestos por
&arios mdulos. El modificador e$tern se usa so"re las &aria"les glo"ales del mdulo,
de forma +ue si una &aria"le glo"al se declara como e$tern, el compilador no crea un
almacenamiento para ella en memoria, sino +ue, tan solo tiene en cuenta +ue dicha
&aria"le ya ha sido declarada en otro modulo del programa y es del tipo de dato +ue se
indica.
El especificador stati act9a seg9n el alcance de la &aria"le7
#ara &aria"les locales, el especificador stati indica +ue dicha &aria"le local
de"e almacenarse de forma permanente en memoria, tal y como si fuera una
&aria"le glo"al, pero su alcance ser2 el +ue corresponder0a a una &aria"le local
declarada en la su"rutina o "lo+ue. El principal efecto +ue pro&oca la
declaracin como stati de una &aria"le local es el hecho de +ue la &aria"le
conser&a su &alor entre llamadas a la funcin.
#ara &aria"les glo"ales, el especificador stati indica +ue dicha &aria"le glo"al
es local al mdulo del programa donde se declara, y, por tanto, no ser2
conocida por ning9n otro mdulo del programa.
El especificador register se aplica solo a &aria"les locales de tipo )ar e int.
Dicho especificador indica al compilador +ue, caso de ser posi"le, mantenga esa
&aria"le en un registro de la C#' y no cree por ello una &aria"le en la memoria. 8e
pueden declarar como register cuantas &aria"les se deseen, pues el compilador ignorara
dicha declaracin caso de no poder ser satisfecha. El uso de &aria"les con
especificador de almacenamiento register permite colocar en registros de la C#'
&aria"les muy frecuentemente usadas, tales como contadores de "ucles, etc.
/lgunos ejemplos de uso de los especificadores de almacenamiento son7
register unsigned int a;
static float b;
extern int c;
static const unsigned long int d;
2.- - Constantes.
En C, las constantes se refieren a los &alores fijos +ue el programa no puede
alterar. /lgunos ejemplos de constantes de C son7
Tio de dato Constantes de ejem"o
char
JaK J?K LML
int
% $:F 6%000
long int
$:F C7B@C F@C
short int
%0 $%6 %@00
El lenguaje de programacin C
unsigned int
F@C00' :F@ :
float
%6.F@ F.:Fe$: $6.Be?
double
$:F.C@7 $6.6e$7 %.0e%00
Tabla 2.'.1: Tipos de onstantes en C.
E.isten, adem2s, algunos tipos de constantes, distintos a los anteriores, +ue es
necesario resaltar de forma particular. Estos tipos de constantes son las constantes
he.adecimales y octales, las constantes de cadena, y las constantes de "arra in&ertida.
as constantes he.adecimales y octales son constantes enteras, pero definidas
en "ase %C 1constantes he.adecimales3 o en "ase B 1constantes octales3. as constantes
de tipo he.adecimal comien!an por los caracteres *$ seguidas del n9mero deseado. as
constantes de tipo octal comien!an por un cero 1*3. #or ejemplo, son constantes
he.adecimales *$!# 1@6 decimal3, *$++++ 1C@@:@ decimal34 y constantes octales *11
1? decimal3, *1,! 1%6: decimal3
as constantes de cadena son conjuntos de caracteres +ue se encierran entre
comillas do"les. #or ejemplo, son constantes de cadena -Esto es una onstante de
adena., -Estos son unos apuntes de C., etc.
as constantes de caracteres de "arra in&ertida se usan para introducir
caracteres +ue es imposi"le introducir por el teclado 1tales como retorno de carro, etc.3.
Estas constantes son proporcionadas por C para +ue sea posi"le introducir dichas
caracteres como constantes en los programas en los cuales sea necesario. Estas
constantes de caracteres de "arra in&ertida son7
Cdigo .ignificado
:b
Retroceso
:f
/limentacin de hoja
:n
(ue&a l0nea
:r
Retorno de carro
:t
-a"ulador hori!ontal
:;
Do"le comilla
:<
8imple comilla
:6
(ulo
::
Barra in&ertida
:v
-a"ulador &ertical
:a
/lerta
:o
Constante octal
:x
Constante
he.adecimal
Tabla 2.'.2: Constantes de barra invertida en C.
El uso de las constantes de "arra in&ertida es igual +ue el de cual+uier otro
car2cter, as0, si ) es una &aria"le de tipo )ar, podemos hacer7 )%/0t1, o )%/0$2*1
1car2cter espacio3, etc., de igual forma +ue reali!ar0amos con cual+uier otra constante
de car2cter. /dem2s, las constantes de "arra in&ertida pueden usarse en el interior de
constantes de cadena como un car2cter m2s, por ello, podemos poner escri"ir la
constante de cadena7 2Esto es una linea0n2.
El lenguaje de programacin C
Tema + - /eradores aritm0ticos, re"acina"es #
"gicos1 oerador asignacin1 oerador si2eof #
oeradores a!an2ados 'oeradores sobre bits #
oerador 3).
+.1 - /eradores aritm0ticos.
os operadores aritm;ticos e.istentes en C son, ordenados de mayor a menor
precedencia7
/erador /erador /erador
44 )ncremento -- Decremento
- 5enos unario
5 5ultiplicacin. 6 Di&isin 7 5dulo
4 8uma - Resta
Tabla !.1.1: 3peradores aritm4tios en C.
os operadores GG, $$ y N solo pueden usarse con datos de tipo int o )ar. El
operador incremento 1GG3, incrementa en una unidad el &alor de la &aria"le so"re la
+ue se aplica, el operador decremento 1$$3, decrementa en una unidad el &alor de la
&aria"le, y el operador mdulo 1N3, calcula el resto de una di&isin de dos &aria"les de
tipo entero o car2cter.
'n aspecto +ue con&iene e.plicar es el hecho de +ue los operadores incremento
y decremento pueden preceder o posceder a su operando, lo cual permite escri"ir, si $
es una &aria"le de tipo int, las e.presiones GG$ o $GG. 'sado de forma aislada no
presenta ninguna diferencia, sin em"argo, cuando se usa en una e.presin e.iste una
diferencia en el orden de ejecucin del mismo. Cuando el operador incremento 1o
decremento3 precede al operando, C primero reali!a el incremento 1o decremento3, y
despu;s usa el &alor del operando, reali!2ndose la operacin al contrario si el operador
poscede al operando. /s0, consid;rense el siguiente cdigo de un programa7
int var===6#var&;
var&=22var=; /* >one == en var&# pues primero incrementa var=#*/
/* y luego asigna su valor a var& */
5ientras +ue el siguiente cdigo funciona de forma distinta7
int var===6#var&;
var&=var=22; /* >one =6 en var&# pues primero asigna su valor */
/* a var&# y luego incrementa var= */
El lenguaje de programacin C
+.2 - /eradores re"acina"es # "gicos.
os operadores relacinales y lgicos de C, ordenados de mayor a menor
prioridad son7
/erador /erador /erador /erador
O (ot
P 5ayor
+ue
PQ 5ayor o
igual
+ue
R 5enor
+ue
RQ 5enor
o igual
+ue
QQ )gual OQ (o igual
SS /nd
TT <r
Tabla !.2.1: 3peradores relaionales 5 l6gios en C.
os operadores relacinales y lgicos tiene menor prioridad +ue los operadores
aritm;ticos antes descritos, as0 , escri"ir 1*7!&8 es e+ui&alente a escri"ir 1*79!&8:.
+.+ - /erador asignacin.
El lenguaje C, a diferencia de otros lenguajes tales como #ascal, no diferencia
la asignacin de cual+uier otro operador del lenguaje. #ara C, la asignacin es un
operador, el llamado operador asignacin 1Q3, el cual posee la prioridad m2s "aja de
todos los operadores. Es por ello +ue en C podemos escri"ir e.presiones del tipo7
if --c=a*b.6. /* if es la comprobaci0n condicional de ?# ,ue */
/* se vera con posterioridad */
Esta e.presin asigna a la &aria"le el &alor de a;b y de&uel&e su &alor para
compararlo con el &alor constante *. os par;ntesis son necesarios pues el operador
asignacin tiene la prioridad mas "aja de todos los operadores.
+., - /erador si2eof.
El operador si<eof es un operador en tiempo de compilacin. El operador si<eof
de&uel&e el tamao de una &aria"le o tipo de dato durante la compilacin, no durante la
ejecucin del programa. Heamos algunos ejemplos7
si<eof9int: de&uel&e el &alor 6 en los sistemas operati&os de %C "its y F en los de
:6 "its.
8i tenemos )ar a=2*>, si<eof9a: de&uel&e el &alor 60, y si tenemos float a=?>,
si<eof9a: de&uel&e el &alor 6F 1FUC3.
+.- - /eradores sobre bits.
El lenguaje de programacin C
El lenguaje C posee operadores +ue act9an a ni&el de "its so"re los datos, estos
operadores son7
/erador 8ombre /eracin

(ot Complemento a uno 1(<-3


RR Despla!amiento i!+uierda Despla!amiento i!+uierda
PP Despla!amiento derecha Despla!amiento derecha
S /nd V
W *or < e.clusi&o 1*<R3
T <r <
Tabla !.'.1: 3peradores sobre bits en C.
os operadores S, T y W act9an so"re dos operandos, mientras +ue ,RR # >>
act9an so"re un solo operando. Heamos su actuacin so"re dos &alores cual+uiera7
/erador /erando 1 /erando 2 &esu"tado

0.B6 0.FD
RR: 0.B6 0.?0
PP6 0.B6 0.6C
S 0.B6 0.7? 0.:0
W 0.B6 0.7? 0.CB
T 0.B6 0.7? 0.IB
Tabla !.'.2: Ejemplos de operaiones sobre bits en C.
Donde los n9meros +ue acompaan a los operadores RR y PP indican cuantas
posiciones se despla!a el operando. a prioridad de los operadores so"re "its es7
El operador tiene la misma prioridad +ue los operadores GG y .--.
os operadores RR y PP tienen la prioridad situada entre los operadores
aritm;ticos y los operadores relacinales y lgicos.
os operadores S, W y T tienen la prioridad situada entre los operadores
relacinales y los operadores lgicos 1SS y TT3.
+.* - E" oerador 3.
El operador X se usa para reempla!ar las sentencias if@else 1+ue &eremos con
posterioridad3 de formato general7
if -condici0n.
expresi0n;
else
expresi0n;
Donde e.presin de"e ser una e.presin sencilla y no otra sentencia de C.
El operador X es un operador ternario cuyo formato general es7
El lenguaje de programacin C
@xp= A @xp& B @xp';
Donde E$p1, E$p2 y E$p! son e.presiones. El operador X e&al9a la e.presin
E$p1, si es cierta se e&al9a E$p2 y si es falsa se e&al9a E$p!. Heamos algunos
ejemplos7
int x#y;
y=-x!=6. A =66 B &66;
/signara el &alor %00 a 5 si $ es mayor de %0, y el &alor 600 en caso contrario.
int t;
-t. A f=-t.2f&-. B printf-8t vale cero;.;
Ejecutara las funciones f19: y f29: si t es distinto de cero, y la funcin printf si t
&ale cero.
El lenguaje de programacin C
Tema , - Con!ersin de tios de datos.
,.1 - Con!ersin autom(tica de tios de datos.
El lenguaje C permite +ue en una misma e.presin apare!can diferentes tipos
de datos, encarg2ndose el compilador de reali!ar las operaciones de forma correcta. El
compilador del lenguaje C, cuando en una misma e.presin aparecen dos o m2s tipos
de datos, con&ierte todos los operandos al tipo del operando m2s grande e.istente de
acuerdo con las dos reglas siguientes7
-odos los )ar y s)ort int se con&ierten a int. -odos los float a double.
#ara todo par de operandos, lo siguiente ocurre en secuencia7
o 8i uno de los operandos es un long double, el otro se con&ierte en long
double.
o 8i uno de los operandos es double, el otro se con&ierte a double.
o 8i uno de los operandos es long, el otro se con&ierte a long.
o 8i uno de los operandos es unsigned, el otro se con&ierte a unsigned.
Despu;s de +ue el compilador apli+ue estas reglas de con&ersin, cada par de
operandos ser2 del mismo tipo, y el resultado ser2 del tipo de los operandos. Heamos
un ejemplo7
char ch;
int i;
float f;
double d;
- ch / i . 2 - f * d . C - f 2 i .;
char int float double float int
De"ido a +ue en la operacin e.isten diferentes tipos se aplica la primera
con&ersin7
ch de char pasa a int*
f de float pasa a double*
- ch / i . 2 - f * d . C - f 2 i .;
int int double double double int
/l ser los dos operandos de igual tipo, reali!amos la primera operacin, 9) @ i:,
y el resultado es de tipo int. De igual forma, para la segunda operacin, 9f ; d:, y el
resultado es de tipo double.
#ara la tercera operacin, y dado +ue las &aria"les no son del mismo tipo, se
aplica la segunda regla, con&irti;ndose el int en double, reali!2ndose la suma 9f & i:
como dos datos de tipo double, y siendo por tanto el resultado un double.
El lenguaje de programacin C
/hora procedemos a reali!ar la suma de los dos primeros resultados 9) @ i: & 9f
; d:, como uno de ellos es de tipo int, y el otro de tipo double, el int se con&ierte en
double por la segunda regla, y el resultado es un double.
V por 9ltimo, reali!amos la resta final, siendo los dos operandos de tipo double
y el resultado final, por tanto, de tipo double.
,.2 - Con!ersin for2ada de tios datos.
En C, e.iste, adem2s, de la con&ersin autom2tica de tipos de datos, la
posi"ilidad de for!ar la con&ersin de un tipo de datos en otro tipo de datos. Esta
con&ersin de un tipo de datos en otro se llama YcastsZ, y su sinta.is es7
-tipo.expresi0n
8u utilidad +ueda claramente e.presada en el ejemplo siguiente7
int a='#b=&;
float c;
c=a/b;
a operacin asigna a el &alor 1.* en &e! de el &alor 1.', ello se de"e a +ue al
ser a y b &aria"les de tipo entero, se reali!a una di&isin entre enteros, y el resultado de
!@2 es 1. / continuacin ese &alor 1 se con&ierte a un &alor en coma flotante para
reali!ar la asignacin 1&alor 1.*3, y se asigna a . 8i lo +ue se desea es +ue la di&isin
se realice en punto flotante, de"e escri"irse la operacin de la siguiente forma7
c=-float.a/b;
Esta con&ersin for!ada o"liga a con&ertir la &aria"le a en float, y entonces,
aplicando las reglas de con&ersin autom2tica de tipos, se reali!a la di&isin en coma
flotante. Este proceso da lugar a +ue el resultado de la operacin sea 1.', y dicho &alor
sea el asignado a la &aria"le .
El lenguaje de programacin C
Tema - - .entencias de contro" # buc"es.
-.1 - .entencia de contro" if.
/ntes de empe!ar a e.plicar las sentencias de control del lenguaje C, con&iene
e.plicar los conceptos de &erdaderoAfalso y de sentencia +ue posee el lenguaje C.
El lenguaje C posee un concepto muy amplio de lo +ue es &erdadero. #ara C,
cual+uier &alor +ue sea distinto de cero es &erdadero, siendo por tanto falso solo si el
&alor cero. Es por ello +ue una e.presin del tipo if9$: ser2 &erdad siempre +ue el &alor
de la &aria"le 9 sea distinto de cero, sea cual sea el tipo de la &aria"le $.
El concepto de sentencia en C es igual +ue el de otros muchos lenguajes. #or
sentencia se entiende en C cual+uier instruccin simple o "ien, cual+uier conjunto de
instrucciones simples +ue se encuentren encerradas entre los caracteres [ y \, +ue
marcan respecti&amente el comien!o y el final de una sentencia.
a forma general de la sentencia if es7
if -condici0n
sentencia;
else
sentencia;
8iendo el else opcional. 8i la ondii6n es &erdadera se ejecuta la sentenia
asociada al if, en caso de +ue sea falsa la ondii6n se ejecuta la sentenia asociada al
else 1si e.iste el else3. Heamos algunos ejemplos de sentencias if7
int a#b;
if -a!b.
1
bCC;
a=a2D;
3
else
1
a22;
b=bCD;
3
if -bCaE=(.
b=D;
as sentencias de control if pueden ir anidadas. 'n if anidado es una sentencia
if +ue es el o"jeto de otro if o else. Esta anidacin de if@else puede presentar la
pro"lem2tica de decidir +ue else &a asociado a cada if. Considerese el siguiente
ejemplo7
if -x.
if -y. printf-8=;.;
El lenguaje de programacin C
else printf-8&;.;
]/ +ue if se refiere el elseX. C soluciona este pro"lema asociando cada else al if
m2s cercano posi"le y +ue toda&0a no tiene ning9n else asociado. Es por ello +ue en
este caso el if asociado al else es el if95:. 8i +ueremos +ue el else este asociado al if9$:,
de"er0amos escri"irlo de la siguiente forma7
if -x.
1
if -y.
printf-8=;.;
3
else
printf-8&;.;
-.2 - .entencia de contro" s:itc;.
a forma general de la sentencia sAit) es7
switch-variable.
1
case const=B
sentencia;
break;
case const&B
sentencia;
break;
***
defaultB
sentencia;
3
Donde variable de"e ser de tipo )ar o int, y donde onst1, onst2, ..., indican
constantes de C del tipo de datos de la variable. Dichas constantes no pueden repetirse
dentro del sAit). El default es opcional y puede no aparecer, as0 como los breaB de los
ase. a sentencia sAit) se ejecuta comparando el &alor de la &aria"le con el &alor de
cada una de las constantes, reali!ando la comparacin desde arri"a hacia a"ajo. En
caso de +ue se encuentre una constante cuyo &alor coincida con el &alor de la &aria"le,
se empie!a a ejecutar las sentencias hasta encontrar una sentencia breaB. En caso de
+ue no se encuentre ning9n &alor +ue coincida, se ejecuta el default 1si e.iste3. Heamos
algunos ejemplos7
int valor;
switch-valor.
1
case 6B cont22;
break;
case DB contCC;
break;
defaultB cont=C=6; /* Fe eGecuta si valor no es 6 o D */
3
char d;
El lenguaje de programacin C
int cont=6;
switch-d.
1
case H:r<B cont22; /* Fi d es un retorno de carro# se */
/* eGecuta este cont22 y el siguiente*/
/* al no aparecer un break */
case H:x=I<B cont22;
break;
defaultB cont=C=;
3
as sentencias sAit) pueden aparecer unas dentro de otras, igual +ue suced0a
con las sentencias if. He2moslo con un ejemplo7
char d#e;
switch-d.
1
case Ha<B
case HA<B switch-e.
1
case H=<B d=Hz<;
e=H2<;
break;
case H&<B d=HJ<;
e=HC<;
3
break;
case Hb<B
case HI<B switch-e.
1
case H6<B d=H&<;
defaultB e=H2<;
3
3
-.+ - Buc"e for.
a sinta.is del "ucle for es7
for-inicializaci0n#condici0n#incremento. sentencia;
En primer lugar, con&iene destacar el hecho de la gran fle.i"ilidad del "ucle for
de C. En C, el "ucle for puede no contener iniiali<ai6n, ondii6n o inremento, o
incluso pueden no e.istir dos e incluso las tres e.presiones del "ucle. El "ucle for se
ejecuta siempre +ue la ondii6n sea &erdadera, es por ello +ue puede llegar a no
ejecutarse.
Heamos algunos ejemplos de "ucles for7
int i#suma=6;
for-i==;i==66;i22.
suma=suma2i;
int i#G;
El lenguaje de programacin C
for-i=6#G==66;G!i;i22#GCC.
1
printf-89d:n;#GCi.;
printf-89d:n;#iCG.;
3
float a='e=6;
for-;a!&;a=s,rt-a.. /* s,rt-. calcula la raKz cuadrada */
printf-89f;#a.;
char d;
for-;getc-stdin.E=<:x=I<;.; /* Iucle ,ue espera hasta ,ue se */
/* pulsa la tecla @sc */
char d;
for-;;.
1
d=getc-stdin.;
printf-89c;#d.;
if -d==H:x=I<.
break;
3
Como se o"ser&a en este 9ltimo ejemplo, el "ucle for no posee ninguna
e.presin. #ara salir de el se usa la sentencia breaB, dicha sentencia 1ya &ista junto con
la sentencia de control sAit)3 se e.plicara mas detalladamente con posterioridad.
-., - Buc"e :;i"e.
a sinta.is del "ucle A)ile es7
while -condici0n. sentencia;
Donde la sentenia puede no e.istir 1sentencia &ac0a3, pero siempre de"e e.istir
la ondii6n. El "ucle A)ile se ejecuta mientras la condicin sea &erdad. Heamos
algunos ejemplos de "ucles A)ile7
int i==#suma=6;
while -i==66.
1
suma=suma2i;
i22;
3
while -getc-stdin.E=H:x=I<.; /* Iucle ,ue espera hasta ,ue se */
/* pulse la tecla @sc */
while -=. /* Lecordar ,ue en ? lo ,ue no es cero es verdad */
1
d=getc-stdin.;
printf-89c;#d.;
if -d==H:x=I<.
break;
3
El lenguaje de programacin C
-.- - Buc"e do6:;i"e.
/l contrario +ue los "ucles for y A)ile +ue comprue"an la condicin en lo alto
de la misma, el "ucle do@A)ile comprue"a la condicin en la parte "aja del mismo, lo
cual pro&oca +ue el "ucle se ejecute como m0nimo una &e!. a sinta.is del "ucle
do@A)ile es7
do
sentencia;
while -condici0n.;
El "ucle do@A)ile se ejecuta mientras la ondii6n sea &erdad. Heamos algunos
ejemplos de "ucle do@A)ile7
int num;
do
scanf-89d;#7num.;
while -num!=66.;
int i#G;
do
1
scanf-89d;#7i.;
scanf-89d;#7G.;
3
while -iG.;
-.* - .entencias de contro" brea< # continue .
as sentencias de control breaB y ontinue permiten modificar y controlar la
ejecucin de los "ucles anteriormente descritos.
a sentencia breaB pro&oca la salida del "ucle en el cual se encuentra y la
ejecucin de la sentencia +ue se encuentra a continuacin del "ucle.
a sentencia ontinue pro&oca +ue el programa &aya directamente a compro"ar
la condicin del "ucle en los "ucles A)ile y do@A)ile, o "ien, +ue ejecute el incremento
y despu;s comprue"e la condicin en el caso del "ucle for.
Heamos algunos ejemplos de uso de breaB y de ontinue7
int x;
for-x=6;x=6;x22.
1
for-;;.
if -getc-stdin.==H:x=I<.
break;
printf-8FalK del bucle infinito# el valor de x esB 9d:n;#x.;
3
int x;
for-x==;x==66;x22. /* @sta rutina imprime en pantalla los */
1 /*nMmeros pares */
El lenguaje de programacin C
if -x9&.
continue;
printf-89d:n;#x.;
3
El lenguaje de programacin C
Tema * - =rra#s, cadenas # unteros.
*.1 > =rra#s # cadenas .
En C, un array unidimensional se declara como7
tipo nombre"tamaNo$;
En C, el primer elemento de un array es el +ue posee el 0ndice 0, por lo tanto, un
array de 60 elementos posee sus elementos numerados de 0 a %?. Heamos unos
ejemplos de declaracin y manejo de algunos arrays7
int x"=66$#i;
for-i=6;i=66;i22.
x"i$=i;
char letras"&DO$;
int i;
for-i=6;i&DO;i22.
letras"i$=i;
int x"=6$#i#suma;
for-i=6;i=6;i22.
1
printf-8Pntroducir un nMmeroB 9dB 8#i.;
scanf-89d;#7x"i$.;
3
for-suma=6#i=6;i=6;i22.
suma=suma2x"i$;
printf-8Qa suma esB 8#suma.;
8in em"argo, el lenguaje C no comprue"a el tamao de los arrays, por lo cual,
es posi"le construir una rutina como la siguiente, la cual ocasionara un incorrecto
funcionamiento del programa7
float a"=6$;
int i;
for-i=6;i=66;i22. /* @ste bucle es incorrecto */
a"i$=i;
Es por ello, +ue es misin del programador compro"ar +ue no se produ!ca el
des"ordamiento de los arrays.
'na cadena, tam"i;n llamada string, es un tipo especial de array
unidimensional. 'na cadena es un array de caracteres 1)ar3 +ue termina con un
car2cter especial 1el car2cter /0*13. Es por ello, +ue la declaracin de una cadena de
caracteres se reali!a e.actamente igual +ue la declaracin de un array unidimensional
de caracteres7
char cadena"tamaNo$;
El lenguaje de programacin C
Como toda cadena de"e terminar en el car2cter /0*1, es por ello +ue si se +uiere
usar una cadena de 60 caracteres, de"e declararse de tamao 6% 160 caracteres G
car2cter terminador3.
#or lo dem2s, puede usarse una cadena como si fuera un array unidimensional,
pues se puede referenciar uno cual+uiera de sus elementos, etc. #ara manejar las
cadenas, e.isten un gran n9mero de funciones de "i"lioteca +ue proporciona el
standard /(8)$C, para m2s informacin referirse al apendice / o a cual+uier li"ro de
C.
a declaracin de arrays de m2s de una dimensin se reali!a de forma parecida
a la de una dimensin, la sinta.is de la declaracin de un array multidimensional es7
tipo nombre"tam=$"tam&$***"tamR$;
V su inde.acin, etc., se reali!a de forma similar al array unidimensional.
Heamos un ejemplo7
float matriz"&$"'$;
int i#G;
for-i=6;i&;i22.
for-G=6;G';G22.
1
printf-8S"9d$"9d$B 8#i#G.;
scanf-89f;#7matriz"i$"G$.;
3
/dem2s, es posi"le iniciali!ar los arrays en el momento de declararlos. 8u
sinta.is es7
tipo nombre"tam=$"tam&$***"tamR$=1lista%de%valores3;
#or lo cual, podemos escri"ir7
float vector"'$=1C'*6#D*(#C(*D3;
-am"i;n es posi"le iniciali!ar arrays sin ponerles el tamao, el compilador
cuenta el n9mero de caracteres de iniciali!acin y reser&a el tamao necesario de
forma autom2tica. #or ejemplo7
float vector"$=1C'*6#D*(#C(*D3;
char cadena"$=8@sto es una cadena;;
*.2 > ?unteros.
os punteros son una de las poderosas herramientas +ue ofrece el lenguaje C a
los programadores, sin em"argo, son tam"i;n una de las m2s peligrosas, el uso de
punteros sin iniciali!ar, etc., es una fuente frecuente de errores en los programas de C,
y adem2s, suele producir fallos muy dif0ciles de locali!ar y depurar.
El lenguaje de programacin C
'n puntero es una &aria"le +ue contiene una direccin de memoria.
(ormalmente esa direccin es una posicin de memoria de otra &aria"le, por lo cual se
suele decir +ue el puntero YapuntaZ a la otra &aria"le.
a sinta.is de la declaracin de una &aria"le puntero es7
tipo *nombre;
El tipo "ase de la declaracin sir&e para conocer el tipo de datos al +ue
pertenece la &aria"le a la cual apunta la &aria"le de tipo puntero. Esto es fundamental
para poder leer el &alor +ue almacena la !ona de memoria apuntada por la &aria"le
puntero y para poder reali!ar ciertas operaciones aritm;ticas so"re los mismos.
/lgunos ejemplos de declaracin de &aria"les puntero son7
int *a;
char *p;
float *f;
E.isten dos operadores especiales de los punteros, el operador ; y el operador
C.
El operador C es un monario +ue de&uel&e la direccin de una &aria"le de
memoria. /s0, si declaramos7
int *a#b;
V hacemos7
a=7b;
a &aria"le puntero a contendr2 la direccin de memoria de la &aria"le b.
El operador ; es un operador monario +ue de&uel&e el &alor de la &aria"le
situada en la direccin +ue sigue. He2moslo con un ejemplo7
int *a#b#c;
8i hacemos7
b==D;
a=7b;
c=*a;
Entonces la &aria"le contendr2 el &alor 1', pues ;a de&uel&e el &alor de la
direccin +ue sigue 1a la +ue YapuntaZ la &aria"le puntero3, y con anterioridad hemos
hecho +ue a contenga la direccin de memoria de la &aria"le b usando para ello el
operador C.
Con las &aria"les de tipo puntero es posi"le reali!ar algunas operaciones7
El lenguaje de programacin C
/signacin de punteros. Es posi"le asignar el &alor de una &aria"le de tipo puntero
a otra &aria"le de tipo puntero. #or ejemplo7
int *a#*b#c;
a=7c;
b=a;
Entonces b contiene el &alor de a, y por ello, b tam"i;n YapuntaZ a la &aria"le .
/ritm;tica de punteros. 8o"re las &aria"les de tipo puntero es posi"le utili!ar los
operadores G, $, GG y $$. Estos operadores incrementan o decrementan la posicin
de memoria a la +ue YapuntaZ la &aria"le puntero. El incremento o decremento se
reali!a de acuerdo al tipo "ase de la &aria"le de tipo puntero, de ah0 la importancia
del tipo del +ue se declara la &aria"le puntero. Heamos esto con la siguiente ta"la7
/eracin GG $$ G? $@
Variab"e $ireccin actua" 8ue!a
direccin
int Ua4 :000 :006 6??B :0%B 6??0
float U" :000 :00F 6??C :0:C 6?B0
Tabla ?.2.1: Ejemplos de aritm4tia de punteros en C.
#or lo tanto, si tenemos7
tipo *a;
V hacemos7
a=a2num;
a posicin a la +ue apunta a se incrementa en num;si<eof9tipo:. #ara la resta
se decrementa de igual forma en num;si<eof9tipo:. os operadores GG y $$ son
e+ui&alentes a reali!ar num%1, y con ello +uedan o"&iamente e.plicados.
Comparaciones de punteros. 8o"re las &aria"les de tipo puntero es posi"le reali!ar
operaciones de comparacin entre ellas. Heamos un ejemplo7
int *a#*b;
if -ab.
printf-8a apunta a una direcci0n m/s baGa ,ue b;.;
E.iste una estrecha relacin entre los punteros y los arrays. Consideremos el
siguiente fragmento de cdigo7
char str"T6$#*p;
p=str;
Este fragmento de cdigo pone en la &aria"le puntero p la direccin del primer
elemento del array str. Entonces, es posi"le acceder al &alor de la +uinta posicin del
array mediante str=#> y ;9p&#: 1recu;rdese +ue los 0ndices de los arrays empie!an en
03. Esta estrecha relacin entre los arrays y los punteros +ueda m2s e&idente si se tiene
El lenguaje de programacin C
en cuenta +ue el nom"re del array sin 0ndice es la direccin de comien!o del array, y, si
adem2s, se tiene en cuenta +ue un puntero puede inde.arse como un array
unidimensional, por lo cual, en el ejemplo anterior, podr0amos referenciar ese elemento
como p=#>.
Es posi"le o"tener la direccin de un elemento cual+uiera del array de la
siguiente forma7
int str"T6$#*p;
p=7str"U$;
Entonces, el puntero p contiene la direccin del +uinto elemento del array str.
^asta ahora hemos declarado &aria"les puntero aisladas. Es posi"le, como con
cual+uier otro tipo de datos, definir un array de &aria"les puntero. a declaracin para
un array de punteros int de tamao 1* es7
int *a"=6$;
#ara asignar una direccin de una &aria"le entera, llamada var, al tercer
elemento del array de punteros, se escri"e7
x"&$=7var;
V para encontrar el &alor de var7
*x"&$;
Dado, adem2s, +ue un puntero es tam"i;n una &aria"le, es posi"le definir un
puntero a un puntero. 8upongamos +ue tenemos lo siguiente7
int a#*b#**c;
b=7a;
c=7b;
V entonces, ;; tiene el &alor de la &aria"le a, pues es un puntero a una
&aria"le +ue ya es de tipo puntero.
Este concepto de puntero a puntero podr0a e.tenderse a puntero a puntero a
puntero, etc., pero no nos ocuparemos de ello. /dem2s, e.iste el concepto de puntero a
una funcin, al cual nos referiremos en el tema dedicado a las funciones.
El lenguaje de programacin C
Tema @ - Aunciones.
El formato general de una funcin de C es7
tipo nombre-lista de par/metros.
1
cuerpo de la funci0n
3
as funciones son simulares a las de cual+uier otro lenguaje, pero, tal y como
citamos en la introduccin, al no ser un lenguaje estructurado por "lo+ues, no es
posi"le declarar funciones dentro de otras funciones.
@.1 - La sentencia return.
/ntes de empe!ar la e.plicacin de las funciones, con&iene e.plicar la
sentencia return. a sentencia return permite, en primer lugar, salir de la funcin desde
cual+uier punto de la misma, y en segundo lugar, de&ol&er un &alor del tipo de la
funcin, si ello es necesario 1no se de&uel&e ning9n &alor si la funcin es de tipo void3.
Heamos un ejemplo7
int ?omparacion-int a#int b.
1
if -a!b. return =; /* a es mayor ,ue b */
if -ab. return C=; /* a es menor ,ue b */
return 6; /* a y b son iguales */
3
Como se o"ser&a en el ejemplo, una funcin puede contener m2s de una
sentencia return. Ello permite, la posi"ilidad de poder salir de la funcin desde
distintos puntos de la misma. 'n aspecto +ue con&iene resaltar es el hecho de +ue una
funcin tam"i;n termina su ejecucin si llega al final de la misma sin encontrar
ninguna sentencia return. Ello es posi"le en toda funcin de tipo void. Heamos un
ejemplo7
void A-int *a.
1
*a=D;
3
Esa funcin es e+ui&alente a otra +ue tu&iera como 9ltima l0nea una sentencia
return, y funcionar0a de igual forma.
@.2 - =rgumentos de "as funciones, ""amada or !a"or # or
BreferenciaB.
'na &e! conocido el uso de la funcin return, podemos introducirnos en la
e.plicacin de las funciones. En primer lugar, si una funcin usa argumentos, es
El lenguaje de programacin C
necesario declarar &aria"les +ue acepten los argumentos de la funcin. Heamos un
ejemplo7
int @sta@n-char *cad#char c. /* Devuelve = si el car/cter c */
1 /* esta en el string cad */
while -*cadE=H:6<.
1
if -*cad==c.
return =;
cad22;
3
return 6;
3
Esta funcin, podr0a ser llamada desde otra funcin de la siguiente forma7
char cadena"$=8@sta es una cadena de prueba;;
if -@sta@n-cadena#<a<..
printf-8@sta;.;
else
printf-8Ro esta;.;
/ diferencia de otros lenguaje, el lenguaje C, solo permite pasar par2metros a
las funciones por &alor. 8i se desea +ue los cam"ios efectuados en una funcin so"re
una &aria"le afecten fuera del alcance de la funcin, es posi"le simular un paso por
referencia mediante el uso de punteros. En efecto, si a una funcin le pasamos como
argumento la direccin de una &aria"le, cual+uier modificacin +ue se realice en esa
direccin, afectara, lgicamente, al &alor +ue tiene la &aria"le original, y con ello,
conseguiremos el mismo efecto +ue un paso por referencia. He2moslo con un ejemplo7
)include stdio*h!
void Alfa-int *val#float pos.
1
*val=D;
pos=(*(;
return;
3
void Ieta-int val#float *pos.
1
val==6;
*pos==U*(;
3
int main-void.
1
int a=O;
float b=5*T(;
printf-8Al principio valen a=9d b=9f:n;#a#b.;
Alfa-7a#b.;
printf-8DespuVs de Alfa valen a=9d b=9f:n;#a#b.;
Ieta-a#7b.;
printf-8DespuVs de Ieta valen a=9d b=9f:n;#a#b.;
3
Este programa mostrara en pantalla7
El lenguaje de programacin C
Al principio valen a=O b=5*T(
DespuVs de Alfa valen a=D b=5*T(
DespuVs de Ieta valen a=D b==U*(
Ello es, pues a Dlfa se le pasa la &aria"le a por _referencia_ 1se le pasa Ca, o
sea, un puntero a la &aria"le a3, y la &aria"le b por &alor, mientras +ue en Eeta sucede
al re&;s.
@.+ - =rra#s como argumentos de funciones.
'n aspecto a tener muy en cuenta es +ue C no permite el paso de un array por
&alor a una funcin, un array es siempre pasado por _referencia_, pues en la llamada, lo
+ue se pasa es la direccin del primer elemento del array 1recu;rdese +ue el nom"re de
un array es un puntero al primer elemento3. #or &alor tan solo es posi"le pasar por
&alor elementos indi&iduales del array, pero no el array completo. He2moslo en un
ejemplo7
)include stdio*h!
void >aso+alorLeferencia-int *array#int valor.
1
array"D$=CT*O;
valor=U;
3
int main-void.
1
int array"=6$=16#6#6#6#6#6#6#6#6#63;
>aso+alorLeferencia-array#array"'$.;
printf-8Array"D$ valeB 9d y array"'$ valeB9d:n;#array"D$#array"'$.;
return 6;
3
Colocara en pantalla en el mensaje7
Array"D$ valeB T*O y array"'$ valeB 6
@., - =rgumentos de "a funcin main.
a funcin main9:, como toda funcin de C, acepta argumentos. os
argumentos +ue acepta la funcin main9: son un entero 1int arg3, un array de punteros
a strings 1)ar ;argv=>3, y otro array de punteros a strings 1)ar ;env=>3. /un+ue los
nom"res de dichos argumentos no tienen por+ue ser arg, argv, y env, en toda la
literatura de C se usan dichos nom"res, y a+u0 los respetaremos. El significado de los
par2metros arg, argv y env es el siguiente7
El par2metro arg contiene el n9mero de argumentos en la l0nea de ordenes de
la llamada al programa.
El par2metro argv contiene un puntero a cada uno de los argumentos 1strings3
de la l0nea de ordenes de la llamada al programa.
El lenguaje de programacin C
El par2metro env contiene un puntero a cada una de las &aria"les de am"iente
1strings3 del sistema operati&o.
Heamos un ejemplo de programa +ue use argumentos en la l0nea de ordenes7
)include stdio*h!
int main-int argc#char *argv"$#char *env"$.
1
int i;
printf-8@l valor de argc esB 9d:n;#argc.;
for-i=6;iargc;i22.
printf-8@l argumento 9d esB 9s:n;#i#argv"i$.;
for-i=6;env"i$E=RWQQ;i22.
printf-XQa variable de ambiente 9d esB 9s:nX#i#env"i$.;
return 6;
3
8upongamos +ue el programa lo hemos llamado prueba.e$e, entonces, llamando
al programa con la siguiente l0nea7
prueba*exe @ste%es%el%argumento%= @ste%es%el%argumento%&
Escri"ir2 en pantalla7
@l valor de argc esB '
@l argumento 6 esB prueba*exe
@l argumento = esB @ste%es%el%argumento%=
@l argumento & esB @ste%es%el%argumento%&
Qa variable de ambiente 6 esB ?YSF>@?=?B:DYF:?YSSARD*?YS
Qa variable de ambiente = esB Z@S>=?B:[PRDY[F:Z@S>
Qa variable de ambiente & esB >LYS>Z=\>\]
Como se puede o"ser&ar, e.isten : argumentos, numerados de 0 a 6, siendo el
argumento 0, siempre, el nom"re del programa, y siendo el resto de argumentos los
argumentos del programa. El n9mero y &alor de las &aria"les de am"iente depende,
tanto de +ue sistema operati&o se trate 158$D<8, '()*, etc.3, como de la
configuracin, etc., del procesador de comandos de dicho sistema operati&o.
@.- - &ecursi!idad.
'na funcin de C puede llamarse a si misma. Este proceso reci"e el nom"re de
recursi&idad. os ejemplos de recursi&idad a"undan, siendo uno de los mas ha"ituales
la funcin factorial7
unsigned 4actorial-unsigned num.
1
if -num==6. return =;
return num*4actorial-numC=.;
3
El lenguaje de programacin C
a recursi&idad es una poderosa herramienta de programacin, sin em"argo,
presenta dos pro"lemas7
a &elocidad de ejecucin de un algoritmo programado de forma recursi&a es
mucho mas lento +ue el programado de forma iterati&a.
a recursi&idad, si es e.cesi&a, puede ocasionar el des"ordamiento de la pila, y
con ello, el fallo en la ejecucin del programa.
8in em"argo, el uso de la recursi&idad es frecuente en campos como la
inteligencia artificial, etc., y en la implementacin de ciertos algoritmos tales como el
algoritmo de ordenacin _Muic`8ort_, muy dif0cil de implementar de forma iterati&a,
pero relati&amente sencillo de forma recursi&a.
@.* - ?unteros a funciones.
/l igual +ue cual+uier otro tipo de dato, una funcin ocupa una direccin de
memoria, y por tanto, puede ser apuntada por un puntero. a declaracin de un puntero
a una funcin es7
tipo de dato -*nombre de la variable.-prototipo.;
Heamos algunos ejemplos7
int -*a.-int#float.;
void -*b.-void.;
aeneralmente, los punteros a funciones se usan en la programacin de "ajo
ni&el, tal como modificacin de interrupciones, creacin de controladores de
dispositi&os, etc.
@.@ - E" modificador de a"macenamiento static a"icado a
funciones.
/l igual +ue en el caso de las &aria"les glo"ales, es posi"le aplicar delante de
una funcin el modificador de almacenamiento stati. Dicho modificador hace +ue la
funcin so"re la +ue se aplica sea local al mdulo donde se encuentra, y no pueda ser
conocida por los restantes mdulos del programa, de igual forma a como suced0a con
las &aria"les glo"ales. Esta modificacin del alcance de una funcin permite reali!ar
un mejor encapsulado del cdigo y simplificar la programacin en proyectos de gran
en&ergadura.
El lenguaje de programacin C
Tema C - Estructuras, camos de bit, uniones #
enumeraciones.
C.1 - Estructuras.
'na estructura es un conjunto de &aria"les +ue se referencian "ajo el mismo
nom"re. a sinta.is de la declaracin de una estructura en lenguaje C es7
struct nombre%estructura1
tipo nombre%variable;
tipo nombre%variable;
***
tipo nombre%variable;
3variables%estructura;
Es posi"le no poner el nom"re de la estructura 1nombre_estrutura3, o "ien, no
crear en el momento de declarar la estructura ninguna &aria"le de la estructura
1variables_estrutura3, pero no es posi"le eliminar la aparicin de am"os elementos.
Heamos algunos ejemplos de declaracin de estructuras7
struct QPFZA1
int tam;
char cadena"D6$;
3var%lista;
struct DAZY1
int tam;
float vector"'$;
struct DAZY *siguiente;
3;
struct 1
float a#b;
unsigned long i#G;
char cadena"D$;
3memo"=6$;
struct AQ4A1
int a;
float b;
3;
struct I@ZA1
struct AQ4A alfa;
float c#d;
3variable;
#ara referenciar un elemento de una estructura se reali!a de la siguiente forma7
variables%estructura*nombre%variable;
El lenguaje de programacin C
/s0, pod0amos referenciar los elementos de las estructuras anteriores de la
siguiente forma7
var%lista*tam;
var%list*cadena;
var%list*cadena"($;
memo"&$*a;
memo"O$*cadena"'$;
variable*alfa*a;
variable*c;
'n aspecto +ue es necesario aclarar es el paso de estructuras como par2metros
a las funciones. / una funcin es posi"le pasarle un elemento de los +ue componen la
estructura, una estructura entera, e incluso, un array de estructuras. En caso de pasarle
un elemento de la estructura, el paso se hace siguiendo las reglas del tipo del cual sea
ese elemento4 en el caso de una estructura entera, C la pasa, a no ser +ue se le indi+ue
lo contrario, por &alor, y en el caso de un array de estructuras, como todo array, lo
pasara por _referencia_. Con&iene aclarar en este momento +ue si la estructura posee
en su interior un array de elementos, la estructura puede ser pasada por &alor a una
funcin, pero el array ser2 pasado siempre por referencia. En concreto a la funcin se
le pasara por &alor un puntero al primer elemento del array. Heamos todo esto en un
ejemplo7
struct AQ4A1
int a;
char b"&6$;
3;
void >asoDe@lementos-int val#char *cadena.
1
val==D;
cadena"($=Ha<;
3
void >asoDeQa@structura>or+alor-struct AQ4A a.
1
a*val==U;
a*cadena"O$=Hb<;
3
void >asoDeQa@structura>orLeferencia-struct AQ4A *a.
1
*-a*val.==';
*-a*cadena."D$=Hc<;
3
void >asoDeWnArrayDe@structuras-struct AQ4A *a.
1
a"U$*val==&;
a"D$*cadena"U$=Hd<;
3
int main-void.
1
struct AQ4A a#b"=6$;
El lenguaje de programacin C
>asoDe@lementos-a*val#a*b.;
>asoDeQa@structura>or+alor-a.;
>asoDeQa@structura>orLeferencia-7a.;
>asoDeWnArrayDe@structuras-b.;
return 6;
3
En el paso de una estructura por referencia, se ha usado una construccin
;9variable_estrutura.nombre_variable:, esta construccin asigna el &alor +ue se desea
a esa &aria"le de la estructura, pues variable_estrutura.nombre_variable es un puntero
a la &aria"le. El uso de los par;ntesis es necesario, pues el operador . tiene menor
prioridad +ue el operador U. Es por ello +ue C introduce un nue&o operador, el operador
$P. Este operador es e+ui&alente al otro, pero m2s cmodo y f2cil de escri"ir y de usar.
Entonces, podr0amos ha"er escrito la funcin de paso de una estructura por referencia
de la forma siguiente7
void >asoDeQa@structura>orLeferencia-struct AQ4A *a.
1
aC!val==';
aC!cadena"D$=Hc<;
3
C.2 - Camos de bit.
'n campo de "it es un m;todo predefinido por C para poder acceder a un "it de
un "yte. /un+ue dicho acceso siempre es posi"le mediante operaciones el uso de los
operadores so"re "its, e.plicados con anterioridad, el uso de campos de "it puede
aadir claridad al programa.
El m;todo de declaracin de un campo de "it se "asa en la estructura, pues un
campo de "it no es mas +ue un tipo especial de estructura. El formato de declaracin
de un campo de "it es7
struct nombre%campo%bit1
tipo nombre= B longitud;
tipo nombre& B longitud;
***
tipo nombreR B longitud;
3variables%campo%bit;
El tipo de un campo de "it de"e declararse como unsigned int o signed int.
Heamos un ejemplo de declaracin de un campo de "it7
struct AQ4A1
unsigned a B =;
signed b B &;
unsigned B U;
unsigned c B =;
3campo;
En dicho ejemplo, se declara un campo de "it de tamao F al cual no se le da
nom"re, eso es &alido, y su efecto es +ue esos cuatro "its no podr0an ser referenciados.
El lenguaje de programacin C
Es posi"le me!clar en la declaracin elementos normales de estructura con
elementos de campo de "it. Heamos un ejemplo7
struct @S>1
char nombre"&6$#apellido"&$"&6$;
float sueldo;
unsigned vacacionesB=;
unsigned enfermoB=;
3;
C.+ - Dniones.
En C una unin es una posicin de memoria +ue se usa por &arias &aria"les
similares, +ue pueden ser de tipos diferentes. a definicin de unin es7
union nombre%union1
tipo nombre=;
tipo nombre&;
***
tipo nombreR;
3var%union;
Como puede o"ser&arse su declaracin, etc., es parecida a la declaracin de una
estructura. 8in em"argo, en una unin, todos los tipos de datos comparten la misma
direccin de memoria. /s0, si declaramos7
union AQ4A1
int a;
char b;
3alfa;
-endremos7
CCCCCCalfa*aCCCCCC!
Iyte6 Iyte=
Calfa*bC!
#or lo tanto, b tendr2 en com9n con a el "yte m2s "ajo.
'n ejemplo mas 9til de una unin es el siguiente7
union I@ZA1
unsigned short a;
char b"&$;
3;beta
Entonces beta.b=*> contendr2 el "yte "ajo de beta.a, y beta.b=1> contendr2 el
"yte alto de beta.a. Ello permite acceder a la parte alta o "aja de dicho unsigned s)ort
sin necesidad de usar operadores so"re "its.
El lenguaje de programacin C
C., - Enumeraciones.
'na enumeracin es un conjunto de constantes enteras con nom"re y especifica
todos los &alores legales +ue pueden tener unas &aria"les. as enumeraciones se
declaran de la siguiente forma7
enum nombre%enum1lista%de%enumeraci0n3 lista%de%variables;
Donde, al igual +ue en las estructuras, puede no aparecer nombre_enum o
lista_de_variables. Heamos un ejemplo de enumeracin7
enum SYR@DAF1 peseta# duro# diez# cinco# cincuenta# cien# doscientas#
,uinientas3 monedas%espana;
as enumeraciones asignan una constante entera a cada uno de los s0m"olos de
la enumeracin, empe!ando por el &alor *. Esto puede modificarse colocando en la
declaracin el &alor +ue deseamos tengan los elementos a partir de uno dado. Esto se
reali!a de la siguiente forma7
enum ?WLFY1 primero# segundo# tercero# cuarto%t==66# ,uinto%t#
cuarto%e=&66# ,uinto%e3;
En este caso, las constantes primero, segundo y terero tienen los &alores *,1 y
2, las constantes cuartobt y +uintobt los &alores 1** y %0%, y las constantes uarto_e y
Fuinto_e los &alores 2** y 2*1 respecti&amente.
C.- - La a"abra reser!ada t#edef.
El lenguaje C permite mediante el uso de la pala"ra reser&ada t5pedef definir
nue&os nom"res para los tipos de datos e.istentes, esto no de"e confundirse con la
creacin de un nue&o tipo de datos. a pala"ra cla&e t5pedef permite solo asignarle un
nue&o nom"re a un tipo de datos ya e.istente. a sinta.is general de uso de t5pedef es7
typedef tipo nombre;
Donde tipo es cual+uier tipo de datos permitido, y nombre es el nue&o nom"re
+ue se desea tenga ese tipo. Heamos algunos ejemplos7
typedef int entero;
typedef struct1
unsigned codigo;
char nombre"U6$;
char apellido"U6$;
3cliente;
V entonces podr0an crearse nue&as &aria"les de la forma7
entero a;
cliente b#*c;
El lenguaje de programacin C
Tema E - E" rerocesador.
En un programa escrito en C, es posi"le incluir di&ersas instrucciones para el
compilador dentro del cdigo fuente del programa. Estas instrucciones dadas al
compilador son llamadas directi&as del preprocesador y, aun+ue realmente no son parte
del lenguaje C, e.panden el 2m"ito del entorno de programacin de C.
El preprocesador, definido por el standard /(8) de C, contiene las siguientes
directi&as7
)if )ifdef )ifndef )else
)elif )endif )include )define
)undef )line )error )pragma
Tabla 8.1: Giretivas del preproesador en C.
E.1 - $irecti!a Fdefine.
a directi&a define se usa para definir un identificador y una cadena +ue el
compilador sustituir2 por el identificador cada &e! +ue se encuentre en el archi&o
fuente. El standard /(8) llama al identificador _nom"re de macro_ y al proceso de
sustitucin _sustitucin de macro_. #or ejemplo7
)define ZLW@ =
)define 4AQF@ 6
El compilador, cada &e! +ue &ea el identificador T"UE, lo sustituir2 por el
&alor 1, e igual con +DHIE. El uso mas com9n de la directi&a Jdefine es la definicin
de &alores constantes en el programa, tamaos de arrays, etc.
'na caracter0stica +ue posee la directi&a Jdefine es +ue el _nom"re de macro_
puede contener argumentos. Cada &e! +ue el compilador encuentra el _nom"re de
macro_, los argumentos reales encontrados en el programa reempla!an los argumentos
asociados con el nom"re de macro. Heamos un ejemplo7
)define SPR-a#b. -ab. A a B b
8i tenemos ahora en el programa7
printf-X@l valor mKnimo esB 9d:nX#SPR-=6#&6..;
El compilador sustituye el _nom"re de macro_ y sus argumentos en tiempo de
compilacin, y ello e+ui&ale a ha"er escrito el cdigo7
printf-X@l valor mKnimo esB 9d:nX#-=6&6. A =6 B &6.;
El lenguaje de programacin C
E.2 - $irecti!a Fundef.
a directi&a Jundef permite +uitar una definicin de _nom"re de macro_ +ue se
reali!o con anterioridad. Heamos un ejemplo7
)define ZAS =6
*******
)undef ZAS
/ partir de Jundef TDM, el _nom"re de macro_ TDM deja de e.istir, ello
permite locali!ar los _nom"re de macro_ donde sea necesario.
E.+ - $irecti!a Ferror.
a directi&a Jerror fuer!a a parar la compilacin del programa, a la &e! +ue
muestra un mensaje de error. El mensaje de error no aparecer2 entre comillas do"les.
Heamos un ejemplo7
)error Detenida compilaci0n
8u principal uso &iene asociado a detener la compilacin en ciertas condiciones
en asociacin con las directi&as Jif, etc., e.plicadas con posterioridad.
E., - $irecti!a Finc"ude.
a directi&a Jinlude fuer!a al compilador a incluir otro archi&o fuente en el
archi&o +ue tiene la directi&a Jinlude, y a compilarlo. El nom"re del archi&o fuente a
incluir se colocara entre comillas do"les o entre par;ntesis de 2ngulo. #or ejemplo7
)include stdio*h!
)include Xstdio*hX
os archi&os incluidos mediante Jinlude pueden a su &e! poseer otras
directi&as Jinlude. a diferencia e.istente entre encerrar el archi&o entre par;ntesis de
2ngulo o entre comillas do"les, es +ue, en el primer caso, se "usca el archi&o en los
directorios de la linea de ordenes de compilacin, y, despu;s en los directorios
standard de C, pero nunca en el directorio de tra"ajo4 y en el segundo caso el primer
sitio donde se "usca el archi&o a incluir es en el directorio actual de tra"ajo,
pas2ndose, caso de no ha"er sido encontrado, a "uscar en los mismos sitios +ue el caso
anterior.
E.- - $irecti!as Fif, Fifdef, Fifndef, Fe"se, Fe"if # Fendif.
as directi&as Jif, Jifdef, Jifndef, Jelse, Jelif y Jendif son directi&as
condicionales de compilacin. Estas directi&as permiten decirle al compilador +ue
partes del programa de"e compilar "ajo distintas condiciones.
El lenguaje de programacin C
a idea general de la directi&a Jif es +ue si es &erdad la e.presin +ue se
encuentra despu;s del Jif, se compilara el cdigo +ue figura entre el Jif y el Jendif se
compilara. a directi&a Jelse funciona de igual forma +ue el else del lenguaje C. a
directi&a Jelif funciona como el escalonado de if del lenguaje C. a definicin formal
es7
)if expresi0n=
secuencia de sentencias
)elif expresi0n&
secuencia de sentencias
******
)else
secuencia de sentencias
)endif
Heamos algunos ejemplos7
)define S@S &66
)if S@S!=66
printf-XS@S es mayor de =66X.;
)endif
)define +AQYL 6
)if +AQYL==6
c=a*b/-+AQYL2=.;
)else
c=a*b/+AQYL;
)endif
Compilara el cdigo para el caso de KDH3"%%*.
)define +AQYL =D
)if +AQYL6
b=b/-C+AQYL.;
)elif +AQYL==6
b=b/-+AQYL2=.;
)else
b=b/+AQYL;
)endif
Compilara el cdigo para el 9ltimo caso.
a directi&as Jifdef y Jifndef se usan tam"i;n para compilacin condicional,
solo +ue no e&al9an e.presin alguna, solo comprue"a si esta definido 1Jifdef3 o si no
esta definido 1Jifndef3 alg9n nom"re de macro. 8u sinta.is general es7
)ifdef nombre de macro
secuencia de sentencias
)else
secuencia de sentencias
)endif
El lenguaje de programacin C
E igual para Jifndef. Heamos algunos ejemplos7
)define +AQ =6
)ifdef +AQ
printf-X+AQ definidoX.;
)else
printf-X+AQ no definidoX.;
)endif
)ifndef RY+AQ
printf-XRY+AQ no definidoX.;
)endif
Compilara el cdigo para el caso de KDH definido y, adem2s, compilara el
cdigo de L3KDH, al no estar definida dicha macro. Como se o"ser&a no se comprue"a
el &alor de KDH, o el de L3KDH, solo se comprue"a si est2n definidos o no.
E.* - $irecti!a F"ine.
a directi&a Jline permite cam"iar la cuenta de lineas del compilador y el
nom"re del archi&o. 8u sinta.is es7
)line nMmero "Xnombre de archivoX$
Heamos un ejemplo7
)line =66 /* Pnicializa el contador de lineas a =66 */
/* =6 lineas */
)error Detenida compilaci0n
)ndicara el mensaje de error en la linea 11* del programa, y no en la +ue suceda
realmente.
E.@ - $irecti!a Fragma.
a directi&a Jpragma es una directi&a +ue permite dar instrucciones al
compilador so"re como de"e reali!ar la compilacin del cdigo fuente. 8u sinta.is es7
)pragma nombre
El lenguaje de programacin C
Tema 1G - Entrada # sa"ida.
/ntes de empe!ar a e.plicar la entrada y salida en C, es necesario reali!ar dos
pe+ueos comentarios7
En primer lugar, para el correcto funcionamiento de la entrada y salida en C, y
dado +ue las funciones de EA8, estructuras de datos usadas por esas funciones, etc., se
encuentran declaradas en el archi&o de ca"ecera Mstdio.)7, es necesario incluir dicho
archi&o, mediante la directi&a del preprocesador Jinlude, para +ue la EA8 funcione
correctamente, pues en caso contrario, puede funcionar de forma incorrecta, e incluso,
puede llegar a dar errores de compilacin.
En segundo lugar, aparte de la EA8 por consola y la EA8 de fichero mediante
"uffer intermedio, +ue ser2n e.plicadas en este tema, e.iste una EA8 de fichero sin
"uffer intermedio, pro&eniente de la primiti&a implementacin de C en m2+uinas
'()*., y +ue el standard /(8) de C no ha estandari!ado, por lo cual, no es
recomenda"le su uso. #or este moti&o, y dada su similitud en la mayor0a de apartados
con el sistema de EA8 de fichero mediante "uffer intermedio, no ser2 e.plicado en el
presente tema.
1G.1 - Entrada # sa"ida desde conso"a.
a entrada y salida desde consola se refiere a las operaciones +ue se producen
en el teclado y la pantalla del ordenador. Dichos dispositi&os son autom2ticamente
a"iertos y cerrados al comen!ar y terminar el programa, por lo cual, no de"en ser
a"iertos ni cerrados por el propio programa. E.isten, "2sicamente, seis funciones de
entrada y salida desde consola, tres de entrada y tres de salida. He2moslas7
a funcin get)ar9:, lee un car2cter desde el teclado. Dicha funcin se define
como7
int getchar-void.;
Dicha funcin lee caracteres, de uno en uno, desde el teclado, esperando, para
leer los caracteres, la pulsacin de un retorno de carro. Es por ello +ue es posi"le
escri"ir &arios caracteres antes de +ue se ninguno de ellos sea le0do. a funcin
get)ar9: hace eco en pantalla del car2cter le0do. En caso de error de&uel&e E3+.
a funcin put)ar9: escri"e un car2cter a la pantalla del ordenador. Dicha
funcin se define como7
int putchar-int c.;
a funcin put)ar9:, si sucede de forma correcta, de&uel&e el car2cter escrito.
En caso de error de&uel&e el car2cter E3+.
Heamos un ejemplo de uso de get)ar9: y put)ar9:7
El lenguaje de programacin C
)include stdio*h!
int main-void.
1
char ch;
do
1
ch=getchar-.;
putchar-ch.;
3
while -chE=^e^ 77 chE=^@^.;
return 6;
3
Este programa lee todas las teclas pulsadas en el teclado, y las coloca en
pantalla, hasta leer una NeN o una NEN. <"s;r&ese +ue solo lee las teclas despu;s de pulsar
un retorno de carro.
a funcin gets9: lee un string desde el teclado. a funcin se define como7
char *gets-char *s.;
a funcin gets9: lee un string desde el teclado hasta +ue se pulsa un retorno de
carro. El string es almacenado en la &aria"le s, y el retorno de carro le0do desde el
teclado es, autom2ticamente, reempla!ado por un car2cter de final de string 1N0*N3.
De&uel&e un puntero a la &aria"le s si sucede de forma correcta, y LUHH en caso
contrario. a funcin gets9: permite corregir errores de teclado usando la tecla de
retroceso antes de pulsar el retorno de carro.
a funcin puts9: escri"e un string en pantalla. a funcin se define como7
int puts-const char *s.;
a funcin puts9: escri"e en pantalla el string almacenado en s, y aade al final
un retorno de carro. De&uel&e un entero no negati&o si sucede de forma correcta, y
E3+ en caso de error.
Heamos un ejemplo de uso de gets9: y puts9:7
)include stdio*h!
)define ZAS =66
int main-void.
1
char cadena"ZAS$;
puts-XPntroduce una cadenaBX.;
gets-cadena.;
return 6;
3
El lenguaje de programacin C
a funcin sanf9: se usa para leer cual+uier tipo de dato predefinido desde el
teclado, y con&ertirlo, de forma autom2tica, al formato interno adecuado. a funcin se
define como7
int scanf-const char *formato"#direcci0n#***$.;
El string formato es la cadena de control +ue indica los datos a leer. Dicha
cadena de control consta de tres clases de caracteres7
Especificadores de formato.
Caracteres de espacio en "lanco.
Caracteres +ue no sean espacios en "lanco.
os especificadores de formato est2n precedidos por el signo O, y dicen a la
funcin +ue tipo de datos &an a ser le0dos a continuacin. os especificadores de
formato &alidos son7
Esecificado
r
$escricin.
Nc eer un 9nico car2cter.
Nd eer un entero decimal.
Ni eer un entero decimal.
Ne eer un n9mero en punto flotante.
Nf eer un n9mero en punto flotante.
Ng eer un n9mero en punto flotante.
No eer un n9mero octal.
Ns eer una cadena de caracteres.
N. eer un n9mero he.adecimal.
Np eer un puntero.
Nn Reci"e un &alor igual al n9mero de car2cter le0dos.
Nu eer un entero sin signo.
Tabla 1*.1.1: Espeifiadores de formato de la funi6n sanf9:.
/dem2s, es posi"le utili!ar los modificadores ) 1s)ort3, l 1long3 y H. El
modificador ) se puede aplicar a los tipo d, i, o, u y $, e indica +ue el tipo de dato es
s)ort int o unsigned s)ort int seg9n el caso. El modificador l se puede aplicar a los
casos anteriores, indicando +ue el tipo de dato es long int o unsigned long int, pero,
adem2s, se puede aplicar a los tipos e, f y g, indicando, en tal caso, +ue el tipo de dato
es double. #or 9ltimo, el modificador H se puede aplicar a los tipos e, f y g, e indica +ue
el tipo de dato es long double.
os caracteres de espacio en "lanco en la cadena de control dan lugar a +ue
sanf9: lea y salte so"re cual+uier n9mero 1incluido cero3 de espacios en "lanco. 'n
espacio en "lanco es, adem2s del car2cter espacio, un ta"ulador o un salto de l0nea.
'n car2cter +ue no sea espacio en "lanco da lugar a +ue sanf9: lea y elimine el
car2cter asociado. #or ejemplo, Od:Od da lugar a +ue sanf9: lea primero un int,
El lenguaje de programacin C
despu;s lea, y descarte, los dos puntos, y luego lea otro int. 8i el car2cter especificado
no se encuentra, sanf9: termina su ejecucin.
-odas las &aria"les utili!adas para reci"ir &alores 1si son necesarias3, de"en ser
pasadas por _referencia_, o sea, por sus direcciones. Esto supone +ue los argumentos
de"en ser punteros a las &aria"les.
a presencia del signo U despu;s del signo N y antes del cdigo del formato
produce +ue sanf9: lea, pero no asigne el &alor le0do a ninguna &aria"le. #or ejemplo7
int x#y;
scanf-X9d9*c9dX#7x#7y.;
#ro&oca +ue, si la entrada es 1*@2*, se le asigne el &alor 1* a la &aria"le $, se
lea, y se descarte el signo @, y despu;s se asigne el &alor 2* a la &aria"le 5.
a funcin sanf9: de&uel&e un n9mero igual al de campos +ue han sido
asignados correctamente, este n9mero no incluye los campos +ue fueron le0dos, pero
no asignados, utili!ando el modificador U para eliminar la asignacin. En caso de error
de&uel&e E3+.
a funcin printf9: se usa para escri"ir cual+uier tipo de dato a la pantalla. 8u
formato es7
int printf-const char *formato"#argumento#***$.;
a cadena apuntada por formato consta de dos tipos de elementos. El primer tipo
esta constituido por los caracteres +ue se mostraran en pantalla. El segundo tipo
contiene las ordenes de formato +ue descri"en la forma en +ue se muestran los
argumentos. as ordenes de formato est2n precedidas por el signo O y le sigue el
cdigo de formato. Estas ordenes de formato son7
Esecificado
r
$escricin
Nc Car2cter.
Nd Enteros decimales con signo.
Ni Enteros decimales con signo.
Ne #unto flotante en notacin cient0fica 1e min9scula3.
NE #unto flotante en notacin cient0fica 1E may9scula3.
Nf #unto flotante.
Ng 'sar el m2s corto de Ne y Nf.
Na 'sar el m2s corto de NE y Nf.
No <ctal sin signo.
Ns Cadena de caracteres.
Nu Enteros decimales sin signo.
N. ^e.adecimales sin signo 1letras min9sculas3.
N* ^e.adecimales sin signo 1letras may9sculas3.
Np 5ostrar un puntero.
El lenguaje de programacin C
Nn El argumento asociado es un puntero a un entero, el cual reci"ir2 el
n9mero de caracteres escritos.
NN )mprimir el signo N.
Tabla 1*.1.2: Espeifiadores de formato de la funi6n printf9:.
/dem2s, e igual +ue con la funcin sanf9:, e.isten los modificadores ), l y H.
#ara su uso consultar la funcin sanf9:.
a funcin printf9: de&uel&e el n9mero de car2cteres escritos. En caso de error
de&uel&e el &alor E3+.
Heamos un ejemplo de uso de las funciones sanf9: y printf9:7
)include stdio*h!
int main-void.
1
int a#b;
printf-X:nPntroduce el valor de aB X.;
scanf-X9dX#7a.;
printf-X:nPntroduce el valor de bB X.;
scanf-X9dX#7b.;
if -bE=6.
printf-X:n@l valor de 9d dividido 9d esB 9f:nX#
a#b#-float.a/b.;
else
printf-X:n@rror# b vale 6:nX.;
return 6;
3
1G.2 - Entrada # sa"ida desde fic;ero.
/ntes de e.plicar la entrada y salida desde fichero, con&iene e.plicar el tipo de
dato +IHE ;. Dicho tipo de dato es el _puntero de fichero_, y es, realmente, una
estructura +ue contiene la informacin so"re el nom"re del fichero a"ierto, su modo de
apertura 1lectura, escritura, etc.3, estado, etc. Dicho _puntero de fichero_, por tanto,
especifica el fichero +ue se esta usando y es, la forma +ue poseen las funciones de
entrada y salida desde fichero de conocer so"re +ue archi&o act9an.
8o"re un archi&o es necesario, antes de poder usarlo, reali!ar una operacin, la
apertura del mismo4 una &e! terminado su uso, es necesaria otra operacin, cerrar el
archi&o. De esto se encargan dos funciones de C. Dichas funciones son fopen9: y
flose9:. He2moslas con detalle7
a funcin fopen9: se encarga de a"rir un archi&o. 8u definicin es7
4PQ@ *fopen-char *nombre#char *modo.;
El lenguaje de programacin C
Donde nombre es un string +ue contiene el nom"re del archi&o +ue +ueremos leer
y modo es otro string +ue contiene el modo de apertura deseado. Dichos modos de
apertura son7
%odo $escricin
r /"rir un archi&o para lectura.
> Crear un archi&o para escritura.
a /"rir un archi&o para aadir.
r" /"rir un archi&o "inario para lectura.
>" Crear un archi&o "inario para escritura.
a" /"rir un archi&o "inario para aadir.
rt /"rir un archi&o de te.to para lectura.
>t Crear un archi&o de te.to para escritura.
at /"rir un archi&o de te.to para aadir.
rG /"rir una archi&o para lecturaAescritura.
>G Crear un archi&o para lecturaAescritura.
aG /"rir un archi&o para leerAaadir.
rG" /"rir un archi&o "inario para lecturaAescritura.
>G" Crear un archi&o "inario para lecturaAescritura.
aG" /"rir un archi&o "inario para leerAaadir.
rGt /"rir un archi&o de te.to para lecturaAescritura.
>Gt Crear un archi&o de te.to para lecturaAescritura.
aGt /"rir un archi&o de te.to para leerAaadir.
Tabla 1*.2.1: Modos de apertura de un fi)ero on la funi6n fopen9:.
En todos los casos de aadir, si el archi&o especificado no e.iste, se procede a
crearlo.
8i no se especifica en modo si la apertura se reali!a para un archi&o "inario o
te.to, depender2 de la configuracin del sistema +ue la apertura sea en "inario o en
te.to, siendo en la mayor0a de los casos en modo te.to. a diferencia fundamental
entre modo te.to y modo "inario es +ue en modo te.to, secuencias de lectura tales
como retorno de carroAalimentacin de l0nea se traducen en un 9nico car2cter nue&a
l0nea, mientras +ue en modo te.to eso no sucede4 el efecto contrario sucede en
escritura.
a funcin fopen9: de&uel&e un puntero de tipo +IHE a la estructura +ue
representa el archi&o a"ierto. En caso de +ue no pueda a"rir o crear el archi&o
especificado, se de&uel&e un puntero LUHH, por lo cual, siempre +ue se a"ra un
archi&o, de"er2 compro"arse +ue el &alor de&uelto no es LUHH, y entonces, el cdigo
de"er2 ser7
4PQ@ *fp;
if --fp=fopen-XpruebaX#XwX..==RWQQ.
1
puts-X:nRo puedo abrir el fichero:nX.;
exit-=.;
3
El lenguaje de programacin C
a funcin flose9: cierra un archi&o. 8u definicin es7
int fclose-4PQ@ *fp.;
Donde fp es el puntero al fichero a"ierto mediante la funcin fopen9:.
a funcin flose9: cierra el archi&o, lo cual da lugar a +ue el "uffer de archi&o
e.istente en memoria se li"ere, escri"i;ndose en el fichero si es necesario, adem2s,
li"era el "lo+ue de control de archi&o, lo cual lo hace disponi"le para otro archi&o 1el
sistema operati&o limita el n9mero de ficheros a"iertos simult2neamente3.
'n &alor de&uelto de cero indica +ue el archi&o fue cerrado con ;.ito.
Cual+uier &alor distinto de cero indica un error.
Heamos un ejemplo de uso de fopen9: y flose9:7
)include stdio*h!
int main-int argc#char *argv"$.
1
4PQ@ *fp;
if -argcE=&.
1
puts-XRombre del fichero no pasadoX.;
return 6;
3
if --fp=fopen-argv"=$#XrX..==RWQQ.
1
printf-X@rror abriendo el ficheroB 9s:nX#argv"=$.;
return 6;
3
if -fclose-fp..
1
puts-X@rror cerrando el ficheroX.;
return =;
3
return 6;
3
'na &e! a"ierto un archi&o, y hasta +ue se proceda a cerrarlo es posi"le leer,
escri"ir, etc., en el, seg9n se indi+ue en el modo de apertura. as principales funciones
de lectura y escritura so"re un archi&o son7
int getc-4PQ@ *fp.;
int putc-int ch#4PQ@ *fp.;
char *fgets-char *str#int n#4PQ@ *fp.;
int fputs-const char *str#4PQ@ *fp.;
int fscanf-4PQ@ *fp#const char *formato"#direcci0n#***$.;
int fprintf-4PQ@ *fp#const char *formato"#argumento#***$.;
int fread-void *memoria#int num#int cont#4PQ@ *fp.;
int fwrite-void *memoria#int num#int cont#4PQ@ *fp.;
El lenguaje de programacin C
a funcin get9: lee caracteres del archi&o asociado a fp. De&uel&e E3+
cuando se alcan!a el final del archi&o.
a funcin put9: escri"e el car2cter ) en el archi&o asociado a fp. De&uel&e el
car2cter escrito si funciona de forma correcta, y E3+ en caso de error.
a funcin fgets9: funciona de igual forma +ue la funcin gets9:, solo +ue,
adem2s de leer del fichero asociado a fp, el par2metro n indica el n9mero m2.imo de
caracteres +ue se pueden leer. E.iste, adem2s, una sutil diferencia, la funcin fgets9: no
elimina el retorno de carro 1si se lee3 de la cadena de entrada, sino +ue lo conser&a en
la misma,. aadiendo a continuacin de dicho retorno de carro, y de forma autom2tica,
el car2cter de fin de cadena 1N0*N3.
a funcin fputs9: funciona igual +ue la funcin puts9:, solo +ue, adem2s de
escri"ir en el fichero asociado a fp, no aade al final del string un retorno de carro, tal
y como hacia la funcin puts9:.
as funciones fsanf9: y fprintf9: funcionan de forma similar a sus e+ui&alentes
so"re la consola sanf9: y printf9:, solo +ue leen o escri"en del archi&o asociado a fp.
as funcin fread9: permite leer un "lo+ue de datos. 8u declaracin es7
int fread-void *memoria#int num#int cont#4PQ@ *fp.;
Donde memoria es un puntero a la !ona de memoria donde se almacenaran los
datos le0dos, num es el tamao 1en "ytes3 de cada uno de los "lo+ues a leer, ont es el
n9mero de "lo+ues 1cada uno de num "ytes de tamao3 a leer, y fp es el puntero al
fichero desde donde se lee.
a funcin fread9: de&uel&e el n9mero de "lo+ues 1no "ytes3 realmente le0dos.
a funcin fArite9: es la funcin dual a fread9:. a funcin fArite9: permite
escri"ir un "lo+ue de datos. 8u declaracin es7
int fwrite-void *memoria#int num#int cont#4PQ@ *fp.;
Donde memoria es un puntero a la !ona de memoria donde se encuentran los
datos a escri"ir, num es el tamao 1en "ytes3 de cada uno de los "lo+ues a escri"ir,
ont es el n9mero de "lo+ues 1cada uno de num "ytes de tamao3 a escri"ir, y fp es el
puntero al fichero desde donde se escri"e.
a funcin fArite9: de&uel&e el n9mero de "lo+ues 1no "ytes3 realmente
escritos.
'n aspecto a resaltar de las funciones fread9: y fArite9: es el hecho de +ue no
reali!an ning9n tipo de con&ersin con los datos le0dos o escritos, as0 , la secuencia
retorno de carroAalimentacin de l0nea, no es con&ertida en el car2cter nue&a l0nea en la
escritura, y &ice&ersa para la lectura. Es por ello, +ue dichas funciones son,
generalmente, usadas con archi&os a"iertos en modo "inario.
El lenguaje de programacin C
Heamos un ejemplo de uso de fread9: y fArite9:7
)include stdio*h!
)define ZAS =666
int main-int argc#char *argv"$.
1
4PQ@ *f%inp#*f%out;
char buffer"ZAS$;
int num;
if -argcE='.
return 6;
if --f%inp=fopen-argv"=$#XrbX..==RWQQ.
return 6;
if --f%out=fopen-argv"&$#XwbX..==RWQQ.
exit-=.;
while --num=fread-buffer#sizeof-char.#ZAS#f%inp..E=6.
fwrite-buffer#sizeof-char.#num#f%out.;
if -fclose-f%inp. __ fclose-f%out.
exit-=.;
return 6;
3
/dem2s de las funciones de entrada y salida de datos desde archi&o, descritas
con anterioridad, e.isten tres funciones +ue no son de entrada y salida de datos y +ue
con&iene e.plicar. Dichas funciones son7
int ferror-4PQ@ *fp.;
void rewind-4PQ@ *fp.;
int fseek-4PQ@ *fp#long num#int origen.;
a funcin ferror9: de&uel&e si durante la 9ltima operacin reali!ada so"re el
archi&o asociado a fp se produjo o no un error. De&uel&e el &alor cero si no se produjo
error, y un &alor distinto de cero si se produjo error.
a funcin reAind9: posiciona el indicador de posicin del archi&o fp al
principio del mismo.
a funcin fseeB9: se usa para operaciones de entrada y salida de acceso
aleatorio. a funcin fseeB9: despla!a el indicador de posicin del archi&o fp un tamao
num desde la posicin especificada por origen. os &alores &alidos para origen son7
/rigen 8ombre de "a constante Va"or
Comien!o del archi&o 8EEKb8E- 0
#osicin actual 8EEKbC'R %
Iinal del archi&o 8EEKbE(D 6
Tabla 1*.2.2: Kalores del origen en la funi6n fseeB9:.
El lenguaje de programacin C
a funcin fseeB9: de&uel&e un &alor de cero si funciona correctamente. 'n
&alor distinto de cero indica un error en la 9ltima operacin de posicionamiento en el
fichero.
a funcin fseeB9: solo funciona correctamente en archi&os a"iertos en modo
"inario, pues, dadas las con&ersiones +ue se reali!an en ciertas transacciones de
caracteres en los archi&os a"iertos en modo te.to, se producir0an errores en el
posicionamiento en el fichero al usar dicha funcin. Heamos un ejemplo de uso de
fseeB9:7
)include stdio*h!
int Qee?aracter-4PQ@ *fp#long pos#int origen.
1
if -fseek-fp#pos#origen..
return-@Y4.;
return-getc-fp..;
3
/ntes de terminar este tema, es necesario comentar la e.istencia de tres
ficheros +ue son a"iertos de forma autom2tica al comen!ar la ejecucin del programa,
y cerrados, tam"i;n de forma autom2tica, al terminar la misma. Estos archi&os son la
entrada standard 1stdin3, la salida standard 1stdout3 y la salida standard de error
1stderr3. (ormalmente estas ficheros est2n asociados a la consola, pero pueden
redireccionarse a cual+uier otro dispositi&o. /dem2s, dado +ue son e.actamente igual
+ue ficheros, pueden usarse sus nom"res en los mismos lugares +ue se usan las
&aria"les de tipo +IHE ;, por lo cual, cual+uier funcin de fichero puede usarse con la
consola usando estos archi&os standard a"iertos al comen!ar el programa. Es por ello,
+ue podemos leer, por ejemplo, una cadena desde el teclado de la siguiente forma7
char cadena"=66$;
fgets-cadena#=66#stdin.;
V escri"ir dicha cadena, por ejemplo en la salida standard de error, de la forma7
fputs-cadena#stderr.;
El lenguaje de programacin C
Tema 11 - =signacin din(mica de memoria.
/ntes de empe!ar con el desarrollo del tema, es necesario aclarar +ue el mismo
no pretende e.plicar las estructuras de datos din2micas, sino tan solo dar unas ligeras
nociones "2sicas so"re la posi"ilidad de asignar memoria de forma din2mica, esto es,
en tiempo de ejecucin, y por tanto de crear nue&as &aria"les.
as funciones +ue reali!an un manejo acti&o de la memoria del sistema
re+uieren todas ellas para su correcto funcionamiento la inclusin, mediante la
directi&a del prepocesador Jinlude del archi&o de ca"ecera Mstdlib.)7.
11.1 - &eser!a din(mica de memoria.
En C, la reser&a din2mica de memoria se reali!a mediante el uso de funciones,
e.isten &arias funciones de reser&a de memoria 1&er ap;ndice /3, pero a+u0 solo
e.plicaremos la reser&a din2mica de memoria mediante la funcin mallo9:. a funcin
mallo9: tiene la forma7
void *malloc-unsigned num%bytes.;
8iendo num_b5tes el n9mero de "ytes +ue se desean reser&ar. a funcin
mallo9: de&uel&e un puntero al tipo de datos void 1sin tipo3. Dicho puntero puede ser
asignado a una &aria"le puntero de cual+uier tipo "ase mediante una con&ersin
for!ada de tipo de datos 1casts3. Heamos un ejemplo7
int *a;
a=-int *.malloc-sizeof-int..;
V ahora podr0amos reali!ar la siguiente asignacin7
*a=';
a funcin mallo9:, y en general, cual+uier funcin de reser&a din2mica de
memoria, de&uel&e un puntero nulo 1LUHH3 si la reser&a de memoria no puede
reali!arse, generalmente por falta de memoria disponi"le. #or ello, antes de usar un
puntero de&uelto por la funcin mallo9: o por cual+uier otra funcin de reser&a
din2mica de memoria es imprescindi"le, con el fin de e&itar posi"les fallos en la
ejecucin del programa, compro"ar +ue dicho puntero no es nulo 1LUHH3. Heamos
algunos ejemplos de reser&a din2mica de memoria7
float *a;
a=-float *.malloc-sizeof-float..;
if -a==RWQQ. exit-6.; /* Falimos del programa */
unsigned long int*b;
if --b=-unsigned long int.malloc-sizeof-unsigned long int...==RWQQ.
exit-6.; /* Falimos del programa */
struct AQ4A1
El lenguaje de programacin C
unsigned a;
float b;
int *c;
3*d;
if --d=-struct AQ4A *.malloc-sizeof-struct AQ4A...==RWQQ.
exit-6.; /Falimos del programa */
11.2 - Liberacin din(mica de memoria.
a memoria din2mica reser&ada es eliminada siempre al terminar la ejecucin
del programa por el propio sistema operati&o. 8in em"argo, durante la ejecucin del
programa puede ser interesante, e incluso necesario, proceder a li"erar parte de la
memoria reser&ada con anterioridad y +ue ya ha dejado de ser necesario tener
reser&ada. Esto puede reali!arse mediante la funcin free9:. a funcin free9: tiene la
forma7
void free-void *p.;
Donde p es la &aria"le de tipo puntero cuya !ona de memoria asignada de forma
din2mica +ueremos li"erar. Heamos un ejemplo de li"eracin de memoria7
int *a;
if --a=-int *.malloc-sizeof-int...==RWQQ.
exit-6.; /* Falimos del programa */
******
free-a.;
'n aspecto a tener en cuenta es el hecho de +ue el puntero a li"erar no de"e
apuntar a nulo 1LUHH3, pues en tal caso se producir2 un fallo en el programa. Es por
ello +ue co"ra a9n m2s sentido la necesidad de compro"ar al reser&ar memoria de
forma din2mica +ue la reser&a se ha reali!ado de forma correcta, tal y como se e.plico
en el apartado anterior.
11.+ - Ejem"o de asignacin # "iberacin din(mica de
memoria.
Hamos a &er un sencillo ejemplo pr2ctico de como asignar y li"erar memoria.
#ara ello construiremos las funciones necesarias para crear, manejar y li"erar de forma
din2mica una lista ligada.
En primer lugar, definiremos la estructura de datos necesaria para ello. Esta
estructura de datos es7
struct QPFZA1
tipo dato;
struct QPFZA *sig;
3;
Donde tipo es cual+uier tipo de datos &alido 1float, int, long int, etc.3
El lenguaje de programacin C
as &aria"les necesarias para crear la lista son las siguientes7
struct QPFZA *cabeza=RWQQ#*p;
tipo dato;
El cdigo de la funcin de creacin de la lista, con insercin por la ca"e!a7
struct QPFZA *?rearQista-struct QPFZA *cabeza#tipo dato.
1
struct QPFZA *p;
if --p=-struct QPFZA *.malloc-sizeof-struct QPFZA...==RWQQ.
exit-6.; /* Falimos del programa */
pC!dato=dato;
pC!sig=cabeza;
return p;
3
8iendo la llamada para la creacin de la forma7
cabeza=?rearQista-cabeza#dato.;
a funcin para o"tener un elemento de la lista es7
struct QPFZA *IuscarQista-struct QPFZA *p#tipo dato.
1
while -pE=RWQQ 77 pC!datoE=dato.
p=pC!sig;
return p;
3
8iendo la llamada de la forma7
if --p=IuscarQista-cabeza#dato..E=RWQQ.
/* @l elemento ha sido encontrado */
V por 9ltimo, la funcin para li"erar un elemento de la memoria es7
struct QPFZA *QiberarQista-struct QPFZA *cabeza#tipo dato.
1
struct QPFZA p,,;
if -cabezaE=RWQQ.
1
p=cabeza;
if -cabezaC!dato==dato.
cabeza=cabezaC!sig;
else
while -pE=RWQQ 77 pC!datoE=dato.
1
,=p;
p=pC!sig;
3
if -pE=RWQQ.
1
El lenguaje de programacin C
,C!sig=pC!sig;
free-p.;
3
3
return cabeza;
3
8iendo la llamada7
cabeza=QiberarQista-cabeza#dato.;
El lenguaje de programacin C
=0ndice = - Aunciones de bib"ioteca de"
standard =8.I de C.
/ntes de comen!ar a descri"ir las funciones de "i"lioteca del standard /(8) de C,
unos pe+ueos comentarios7
E.isten muchas mas funciones de las a+u0 descritas, pero este pe+ueo conjunto de
funciones es lo suficientemente amplio como para +ue puedan reali!arse todas las
operaciones necesarias.
as funciones se encuentran clasificadas de acuerdo a la funcin +ue reali!an 1entradaA
salida de datos, etc.3, con el fin de facilitar su uso.
as funciones se presentan de la siguiente forma7
(om"re de la funcin7 flose
Iichero de includes donde se encuentra su prototipo7 Jinlude Mstdio.)7
Iormato de la funcin7 int flose9+IHE ;f:(
Bre&e descripcin de la funcin.
=.1 - Aunciones de entrada # sa"ida de datos.
fclose
)include stdio*h!
int fclose-4PQ@ *f.;
a funcin flose9: cierra el archi&o asociado a la &aria"le f y &uelca su "uffer
al disco. Despu;s de un flose9:, la &aria"le f +ueda desligada del archi&o y cual+uier
"uffer +ue tu&iera asignado se li"era. 8i flose9: se ejecuta de forma correcta, de&uel&e
el &alor cero, en cual+uier otro caso de&uel&e un &alor distinto de cero.
feof
)include stdio*h!
int feof-4PQ@ *f.;
a funcin feof9: comprue"a el indicador de posicin del archi&o para
determinar si se ha alcan!ado el final del archi&o asociado a f. 'n &alor distinto de
cero supone +ue el indicador de posicin del archi&o esta en el final del mismo, en caso
contrario se de&uel&e el &alor cero.
ferror
)include stdio*h!
int ferror-4PQ@ *f.;
El lenguaje de programacin C
a funcin ferror9: comprue"a si e.isten errores en alguna operacin reali!ada
so"re el archi&o asociado a f. 'n &alor de&uelto de cero indica +ue no hay errores, un
&alor distinto de cero indica la e.istencia de errores. os indicadores de error
asociados a f permanecen acti&os hasta +ue se cierra el archi&o o se llama a las
funciones reAind9: o perror9:.
fflush
)include stdio*h!
int fflush-4PQ@ *f.;
a funcin fflus)9: &ac0a el "uffer asociado a la &aria"le f. 8i el archi&o ha sido
a"ierto para escritura, fflus)9: &ac0a el contenido del "uffer de salida en el archi&o. 8i
el archi&o ha sido a"ierto para lectura, fflus)9: tan solo &ac0a el contenido del "uffer de
entrada. 'n &alor de cero indica +ue el "uffer se ha &aciado de forma correcta, un &alor
distinto de cero indica un error. -odos los "uffers se &uelcan autom2ticamente cuando
un programa termina de forma correcta, cuando est2n llenos, o cuando se cierra el
archi&o 1&er flose9:3.
fgetc
)include stdio*h!
int fgetc-4PQ@ *f.;
a funcin fget9: de&uel&e el car2cter del archi&o de entrada asociado a f, e
incrementa el indicador de posicin del archi&o. El car2cter se lee como unsigned )ar
y se con&ierte a int, por lo cual no e.iste ning9n pro"lema en asignarle el &alor
de&uelto por fget9: a una &aria"le de tipo car2cter 1)ar3.
fgets
)include stdio*h!
char *fgets-char *cad#int num#4PQ@ *f.;
a funcin fgets9: lee como m2.imo hasta numP1 caracteres del archi&o
asociado a f y los sit9a en el array apuntado por ad. os caracteres se leen hasta +ue
se reci"e un car2cter de salto de linea, un E3+ 1fin de fichero3 o hasta +ue se llega al
limite especificado. Despu;s de le0dos los caracteres, se pone autom2ticamente un
car2cter de nulo inmediatamente despu;s del ultimo car2cter le0do. 8i se termina la
lectura por un car2cter de salto de linea, dicho car2cter se guarda como parte de ad. 8i
tiene ;.ito, fgets9: de&uel&e un puntero a la direccin de ad. En caso de error de&uel&e
un puntero nulo 1LUHH3.
fopen
)include stdio*h!
4PQ@ *fopen-const char *nombre#const char *modo.;
a funcin fopen9: a"re un archi&o cuyo nom"re &iene dado por nombre y
de&uel&e un puntero a una estructura de tipo +IHE +ue se le asocia en la apertura. El
El lenguaje de programacin C
tipo de operaciones permitidas en el archi&o est2n definidas por el &alor de modo. os
&alores permitidos de modo son7
%odo $escricin
r /"rir un archi&o para lectura.
> Crear un archi&o para escritura.
a /"rir un archi&o para aadir.
r" /"rir un archi&o "inario para lectura.
>" Crear un archi&o "inario para escritura.
a" /"rir un archi&o "inario para aadir.
rt /"rir un archi&o de te.to para lectura.
>t Crear un archi&o de te.to para escritura.
at /"rir un archi&o de te.to para aadir.
rG /"rir una archi&o para lecturaAescritura.
>G Crear un archi&o para lecturaAescritura.
aG /"rir un archi&o para leerAaadir.
rG" /"rir un archi&o "inario para lecturaAescritura.
>G" Crear un archi&o "inario para lecturaAescritura.
aG" /"rir un archi&o "inario para leerAaadir.
rGt /"rir un archi&o de te.to para lecturaAescritura.
>Gt Crear un archi&o de te.to para lecturaAescritura.
aGt /"rir un archi&o de te.to para leerAaadir.
Tabla D.1.1: Modos de apertura de un fi)ero on la funi6n fopen9:.
8i fopen9: tiene ;.ito en a"rir el archi&o, de&uel&e un puntero de tipo +IHE, en
caso contrario de&uel&e un puntero nulo 1LUHH3.
fprintf
)include stdio*h!
int fprintf-4PQ@ *f#const char *formato#***.;
a funcin fprintf9: escri"e en el archi&o asociado a f los &alores de los
argumentos +ue componen su lista de argumentos seg9n se especifica en la cadena
formato. De&uel&e un n9mero +ue indica el n9mero de caracteres escritos. 8i se
produce un error se de&uel&e un &alor negati&o. #ara una e.plicacin so"re sus
argumentos cons9ltese la funcin printf9:.
fputc
)include stdio*h!
int fputc-int c#4PQ@ *f.;
a funcin fput9: escri"e el car2cter especificado por en el archi&o
especificado por f a partir de la posicin actual del archi&o, y entonces incrementa el
indicador de posicin del archi&o. /un+ue tradicionalmente se declara de tipo int, es
con&ertido por fput9: a unsigned )ar, por lo cual en lugar de un int se puede usar
como argumento un )ar o unsigned )ar. 8i se utili!a un int, la parte alta del mismo
El lenguaje de programacin C
ser2 ignorada y no se escri"ir2. 8i se ejecuta de forma correcta, fput9: de&uel&e el
&alor , en caso de error de&uel&e el &alor E3+.
fputs
)include stdio*h!
int fputs-const char *cad#4PQ@ *f.;
a funcin fputs9: escri"e el contenido de la cadena de caracteres apuntada por
ad en el archi&o especificado por f. El car2cter nulo de terminacin de la cadena no es
escrito. En caso de error fputs9: de&uel&e el &alor E3+.
fread
)include stdio*h!
int fread-void *buf#size%t tam#sise%t cuenta# 4PQ@ *f.;
a funcin fread9: lee uenta numero de elementos, cada uno de ellos de tam
"ytes de longitud, del archi&o asociado a la &aria"le f, y los sit9a en el array apuntado
por buf. El indicador de posicin del archi&o se incrementa en el n9mero de "ytes
le0dos. a funcin fread9: de&uel&e el n9mero de elementos realmente le0dos. 8i se leen
menos elementos de los pedidos en la llamada se produce un error. a funcin fread9:
funciona de forma correcta en archi&os a"iertos en modo "inario4 en archi&os a"iertos
en modo te.to, pueden producirse ciertos cam"ios de caracteres 1salto de carro seguido
de salto de linea se con&ierte en salto de linea, etc.3.
fscanf
)include stdio*h!
int fscanf-4PQ@ *f#const char *formato#***.;
a funcin fsanf9: lee del archi&o asociado a la &aria"le f de igual forma +ue la
funcin sanf9: lo reali!a del teclado. De&uel&e el numero de argumentos a los +ue
realmente se asigna &alores. Este n9mero no incluye los campos ignorados. 8i se
produce un error antes de reali!ar la primera asignacin se de&uel&e el &alor E3+. #ara
mas informacin consultar la funcin sanf9:.
fsee`
)include stdio*h!
)int fseek-4PQ@ *f#long desp#int origen.;
a funcin fseeB9: coloca el indicador de posicin del archi&o asociado a la
&aria"le f de acuerdo a los &alores dados por origen y desp. 8u o"jeti&o es dar soporte
a las operaciones de EA8 de acceso directo. El &alor de origen de"e ser una de estas
constantes, definidas en stdio.)7
/rigen 8ombre de "a constante Va"or
Comien!o del archi&o 8EEKb8E- 0
#osicin actual 8EEKbC'R %
El lenguaje de programacin C
Iinal del archi&o 8EEKbE(D 6
Tabla D.1.2: Kalores del origen en la funi6n fseeB9:.
a funcin fseeB9: de&uel&e un &alor de cero si sucede correctamente, en caso
contrario el &alor de&uelto es distinto de cero.
#uede utili!arse fseeB9: para mo&er el indicador de posicin en el archi&o a
cual+uier lugar del mismo, incluso mas alla del final del mismo, pero es un error
intentar situarse antes del comien!o del archi&o.
ftell
)include stdio*h!
long ftell-4PQ@ *f.;
a funcin ftell9: de&uel&e el &alor actual del indicador de posicin del archi&o
asociado a la &aria"le f. #ara archi&os "inarios, el &alor de&uelto es el n9mero de "ytes
desde el principio del archi&o. #ara archi&os de te.to solo de"e usarse como argumento
para la funcin fseeB9:, ya +ue, de"ido a +ue secuencias de caracteres como retorno de
carro y salto de l0nea pueden sustituirse por un salto de l0nea, el tamao aparente del
archi&o puede &ariar. 8i falla la funcin ftell9: de&uel&e el &alor P1H.
f>rite
)include stdio*h!
int fwrite-const void *buf#size%t tam#size%t cuenta#4PQ@ *f.;
a funcin fArite9: escri"e uenta numero de elementos, cada uno de ellos de
tam "ytes de longitud, del array apuntado por buf al archi&o asociado a la &aria"le f. El
indicador de posicin del archi&o se incrementa en el n9mero de "ytes escritos. a
funcin fArite9: de&uel&e el n9mero de elementos realmente escritos. 8i se escri"en
menos elementos de los pedidos en la llamada se produce un error. a funcin fArite9:
funciona de forma correcta en archi&os a"iertos en modo "inario4 en archi&os a"iertos
en modo te.to, pueden producirse ciertos cam"ios de caracteres 1salto de carro seguido
de salto de linea se con&ierte en salto de linea, etc.3.
getc
)include stdio*h!
int getc-4PQ@ *f.;
a funcin get9: de&uel&e del archi&o de entrada asociado a la &aria"le f el
siguiente car2cter desde la posicin actual e incrementa el indicador de posicin del
archi&o. El car2cter se lee como unsigned )ar y se transforma en un int. 8i se alcan!a
el final de archi&o de&uel&e el car2cter E3+. De"ido a +ue E3+ es un &alor &alido
para archi&os a"iertos en modo "inario, de"e utili!arse la funcin feof9: para
compro"ar el final del fichero en dichos archi&os.
gets
El lenguaje de programacin C
)include stdio*h!
char *gets-char *cad.;
a funcin gets9: lee caracteres desde stdin 1entrada standard, normalmente el
teclado3, y los sit9a en el array de caracteres apuntado por ad. 8e leen caracteres
hasta +ue se reci"e un car2cter de salto de l0nea o una marca de E3+. El car2cter de
terminacin se transforma, autom2ticamente, en el car2cter nulo para terminar la
cadena. 8i se ejecuta correctamente, gets9: de&uel&e un puntero a ad. En caso de error
se de&uel&e un puntero nulo 1LUHH3. (o e.iste l0mite al n9mero de caracteres +ue
leer2 gets9:, por lo cual le corresponde al programador asegurarse de +ue no se
so"repasa el tamao del array apuntado por ad.
perror
)include stdio*h!
int perror-const char *cad.;
a funcin perror9: con&ierte el &alor de la &aria"le glo"al errno en una cadena
de caracteres y escri"e esta cadena en stderr 1salida standard de error3. 8i el &alor de
ad no es nulo 1LUHH3, se escri"e primero la cadena apuntada por ad, seguida de dos
puntos y el mensaje de error asociado.
printf
)include stdio*h!
int printf-const char *formato#***.;
a funcin printf9: escri"e en stdout 1salida standard, generalmente la pantalla3,
los argumentos +ue componen la lista de argumentos "ajo el control de la cadena
apuntada por formato. a cadena apuntada por formato consta de dos tipos de
elementos. El primer tipo esta constituido por los caracteres +ue se mostraran en
pantalla. El segundo tipo contiene las ordenes de formato +ue descri"en la forma en
+ue se muestran los argumentos. 'na orden de formato comien!a por el signo O, y le
sigue el cdigo de formato. as ordenes de formato son7
Esecificador $escricin
Nc Car2cter.
Nd Enteros decimales con signo.
Ni Enteros decimales con signo.
Ne #unto flotante en notacin cient0fica 1e min9scula3.
NE #unto flotante en notacin cient0fica 1E may9scula3.
Nf #unto flotante.
Ng 'sar el m2s corto de Ne y Nf.
Na 'sar el m2s corto de NE y Nf.
No <ctal sin signo.
Ns Cadena de caracteres.
Nu Enteros decimales sin signo.
N. ^e.adecimales sin signo 1letras min9sculas3.
El lenguaje de programacin C
N* ^e.adecimales sin signo 1letras may9sculas3.
Np 5ostrar un puntero.
Nn El argumento asociado es un puntero a un entero, el cual reci"ir2 el
n9mero de caracteres escritos.
NN )mprimir el signo N.
Tabla D.1.!: Espeifiadores de formato de la funi6n printf9:.
E.isten ademas los modificadores ) 1s)ort3, l 1long3 y H. El modificador )
1s)ort3 se puede aplicar a los tipos d, i, o, u., $ y Q, y le dice +ue el tipo de datos es
s)ort int o unsigned s)ort int seg9n el caso. El modificador l 1long3, se puede aplicar a
los casos anteriores, significando +ue el tipo de datos es long int o unsigned long int,
pero, adem2s, se puede aplicar a los tipos e, E, f y g, indicando +ue el tipo de datos es
double. El modificador H se puede aplicar a los tipos e, E, f y g, y dice +ue el tipo de
datos es long double.
a funcin printf9: de&uel&e el n9mero de caracteres realmente escritos. 'n
&alor negati&o indica +ue se ha producido un error.
putc
)include stdio*h!
int putc-int c#4PQ@ *f.;
a funcin put9: escri"e el car2cter contenido en el "yte menos significati&o
de c en el archi&o apuntado por f. Dado +ue los argumentos de tipo )ar son
transformados en argumentos de tipo int en el momento de la llamada, se pueden
utili!ar &aria"les de tipo )ar para el argumento de put9:. a funcin put9:
de&uel&e el car2cter escrito. En caso de error de&uel&e E3+, y, dado +ue E3+ es un
&alor &alido en archi&os a"iertos en modo "inario, se recomienda en dicho tipo de
archi&os el uso de la funcin ferror9: para la compro"acin de errores.
puts
)include stdio*h!
int puts-char *cad.;
a funcin puts9: escri"e la cadena apuntada por ad en el dispositi&o de salida
standard. El car2cter nulo de terminacin de cadena se transforma en un car2cter de
salto de l0nea. 8i tiene ;.ito, se de&uel&e un &alor no negati&o. En caso de error se
de&uel&e el &alor E3+.
re>ind
)include stdio*h!
void rewind-4PQ@ *f.;
a funcin reAind9: mue&e el indicador de posicin del archi&o apuntado por f
al principio del mismo. a funcin reAind9: iniciali!a tam"i;n los indicadores de error
y de fin de archi&o asociados a la &aria"le f. (ing9n &alor es de&uelto.
El lenguaje de programacin C
scanf
)include stdio*h!
int scanf-const char *formato#***.;
a funcin sanf9: es una rutina de propsito general +ue lee de stdin
1dispositi&o standard de entrada, normalmente el teclado3. #uede leer los tipos de datos
+ue haya y transformarlos en el formato interno adecuado. Es la in&ersa de la funcin
printf9:. a cadena de control especificada por formato consiste en tres clases de
caracteres7
Especificadores de formato.
Caracteres de espacio en "lanco.
Caracteres +ue no sean espacios en "lanco.
os especificadores de formato de entrada est2n precedidos por el signo O, y dicen
a sanf9: +ue tipo de datos &an a ser le0dos a continuacin. os especificadores de
formato &alidos son7
Esecificador $escricin.
Nc eer un 9nico car2cter.
Nd eer un entero decimal.
Ni eer un entero decimal.
Ne eer un n9mero en punto flotante.
Nf eer un n9mero en punto flotante.
Ng eer un n9mero en punto flotante.
No eer un n9mero octal.
Ns eer una cadena de caracteres.
N. eer un n9mero he.adecimal.
Np eer un puntero.
Nn Reci"e un &alor igual al n9mero de car2cter
le0dos.
Nu eer un entero sin signo.
Tabla D.1.#: Espeifiadores de formato de la funi6n sanf9:.
/dem2s, es posi"le utili!ar los modificadores ) 1s)ort3, l 1long3 y H de igual
forma +ue en la funcin printf9:.
'n espacio en "lanco en la cadena de control da lugar a +ue sanf9: salte so"re
uno o mas espacios de la cadena de entrada, un espacio en "lanco puede ser un espacio,
un ta"ulador o un salto de l0nea. /dem2s, un espacio en "lanco da lugar, tam"i;n, a
+ue sanf9: lea, pero no guarde cual+uier n9mero de espacios en "lanco, incluso cero.
'n car2cter +ue no sea espacio en "lanco, da lugar a +ue sanf9: lea y elimine el
car2cter asociado. #or ejemplo, Od:Od da lugar a +ue sanf9: lea primero un int,
despu;s lea, y descarte, los dos puntos, y luego lea otro int. 8i el car2cter especificado
no se encuentra, sanf9: termina su ejecucin.
El lenguaje de programacin C
-odas las &aria"les utili!adas para reci"ir &alores a tra&;s de sanf9: de"en ser
pasadas por referencia, o sea, por sus direcciones. Esto supone +ue los argumentos
de"en ser punteros a las funciones.
a presencia del signo ; despu;s del signo O y antes del cdigo del formato,
produce +ue sanf9: lea, pero no asigne el &alor le0do a ninguna &aria"le, por ejemplo7
sanf92OdO;Od2RC$RC5:(
#ro&oca, si la entrada es 1*@2*, +ue se le asigne el &alor 1* a la &aria"le $, se
lea y descarte el signo @, y despu;s se asigne el &alor 2* a la &aria"le 5.
a funcin sanf9: de&uel&e un n9mero igual al de campos +ue han sido
asignados correctamente, este n9mero no incluye los campos +ue fueron le0dos, pero
no asignados, utili!ando el modificador ; para eliminar la asignacin.
set"uf
)include stdio*h!
void setbuf-4PQ@ *f# char *buf.;
a funcin setbuf9: se utili!a para determinar el "uffer del archi&o asociado a la
&aria"le f +ue se utili!ara, o "ien, si se llama con buf a nulo 1LUHH3, para desacti&ar el
"uffer. 8i un "uffer &a a ser definido por el programador, su tamao de"e ser EU+IIS,
siendo EU+IIS una constante definida en el archi&o stdio.). a funcin setbuf9: no
de&uel&e ning9n &alor.
set&"uf
)include stdio*h!
int setvbuf-4PQ@ *f#char *buf#int modo#*size%t tam.;
a funcin setvbuf9: permite al programador especificar el "uffer, el tamao y
el modo para el archi&o asociado a la &aria"le f. El array de caracteres apuntado por
buf se utili!a como "uffer de f para las operaciones de entrada y salida. 8i buf es nulo
1LUHH3, setvbuf9: creara su propio "uffer, de tamao tam, mediante una llamada a la
funcin mallo9:. El tamao del "uffer se fija mediante el &alor de tam, +ue de"e ser
siempre mayor de cero. a &aria"le modo determina el uso del "uffer. os &alores
legales de modo, definidos en stdio.), son7
%odo $escricin
b)<IBI 5odo normal, el "uffer se &ac0a solo cuando se llena 1en escritura3, o "ien,
cuando ya se ha le0do todo su contenido 1en lectura3.
b)<BI )gual al anterior, solo +ue el "uffer tam"i;n se &ac0a cuando se lee o escri"e
un retorno de carro.
b)<(BI Desacti&a el "uffer.
Tabla D.1.': Kalores del modo en la funi6n setvbuf9:.
El lenguaje de programacin C
a funcin setvbuf9: de&uel&e un &alor de cero si se ejecuta con ;.ito. En caso
de error, un &alor distinto de cero ser2 de&uelto.
sprintf
)include stdio*h!
int sprintf-char *buf#const char *formato#***.;
a funcin sprintf9: es id;ntica a la funcin printf9:, e.cepto +ue la salida
generada se sit9a en el array apuntado por buf. El &alor de&uelto por la funcin es igual
al n9mero de caracteres realmente situados en el array. #ara una mayor e.plicacin
refi;rase a la funcin printf9:.
sscanf
)include stdio*h!
int sscanf-const char *buf#const char *formato#***.;
a funcin ssanf9: es id;ntica a la funcin sanf9:, e.cepto +ue los datos son
le0dos del array apuntado por buf. El &alor de&uelto por la funcin es igual al n9mero
de campos +ue hu"ieran sido realmente asignados. Este n9mero no incluye los campos
+ue fueron saltados al utili!ar el modificador de ordenes de formato ;. #ara m2s
detalles &ea la funcin sanf9:.
ungetc
)include stdio*h!
int ungetc-int c#4PQ@ *f.;
a funcin unget9: de&uel&e el car2cter especificado por el "yte menos
significati&o de al archi&o especificado por f. Este car2cter ser2 de&uelto en la
siguiente operacin de lectura so"re el archi&o. 'na llamada a fflus)9: o a fseeB9:
deshace una operacin unget9: y deshecha el car2cter pre&iamente de&uelto a la
secuencia de entrada. (o se de"e usar unget9: so"re una marca de E3+. El &alor
de&uelto por la funcin es igual a , si la funcin ha tenido ;.ito, e igual a E3+, si ha
fallado.
=.2 -Aunciones de caracteres.
isalnum
)include ctype*h!
int isalnum-int ch.;
a funcin isalnum9: de&uel&e un &alor distinto de cero si ) es una letra del
alfa"eto o un d0gito. En caso contrario, se de&uel&e un &alor distinto de cero.
isalpha
El lenguaje de programacin C
)include ctype*h!
int isalpha-int ch.;
a funcin isalp)a9: de&uel&e un &alor distinto de cero si ) es una letra del
alfa"eto, en cual+uier otro caso de&uel&e cero.
iscntrl
)include ctype*h!
int iscntrl-int ch.;
a funcin isntrl9: de&uel&e un &alor distinto de cero si ) se encuentra entre *
y *$1+ o si ) es igual a *$,+ 1tecla DE3, en cual+uier otro caso de&uel&e cero.
isdigit
)include ctype*h!
int isdigit-int ch.;
a funcin isdigit9: de&uel&e un &alor distinto de cero si ) es un d0gito 1*..83,
en cual+uier otro caso de&uel&e el &alor cero.
isgraph
)include ctype*h!
int isgraph-int ch.;
a funcin isgrap)9: de&uel&e un &alor distinto de cero si ) es cual+uier
car2cter imprimi"le distinto del espacio, en cual+uier otro caso de&uel&e cero.
islo>er
)include ctype*h!
int islower-int ch.;
a funcin isloAer9: de&uel&e un &alor distinto de cero si ) es una car2cter
min9scula, en cual+uier otro caso de&uel&e cero.
isprint
)include ctype*h!
int isprint-int ch.;
a funcin isprintf9: de&uel&e un &alor distinto de cero si ) es cual+uier
car2cter imprimi"le, incluyendo el espacio, en cual+uier otro caso de&uel&e cero.
ispunct
)include ctype*h!
El lenguaje de programacin C
int ispunct-int ch.;
a funcin ispunt9: de&uel&e un &alor distinto de cero si ) es un car2cter de
puntuacin, e.cluyendo el espacio, en cual+uier otro caso de&uel&e el &alor cero.
isspace
)include ctype*h!
int isspace-int ch.;
a funcin isspae9: de&uel&e un &alor distinto de cero si ) es un espacio,
ta"ulador, o car2cter de salto de l0nea, en cual+uier otro caso de&uel&e el &alor cero.
isupper
)include ctype*h!
int isupper-int ch.;
a funcin isupper9: de&uel&e un &alor distinto de cero si ) es una letra
may9scula, en cual+uier otro caso de&uel&e cero.
is.digit
)include ctype*h!
int isxdigit-int ch.;
a funcin is$digit9: de&uel&e un &alor distinto de cero si ) es un d0gito
he.adecimal, en cual+uier otro caso de&uel&e cero. 'n d0gito he.adecimal est2 en uno
de estos rangos7 * hasta 8, D hasta + y a hasta f.
tolo>er
)include ctype*h!
int tolower-int ch.;
a funcin toloAer9: de&uel&e el e+ui&alente en min9scula de ), si ) es una
letra may9scula, en cual+uier otro caso se de&uel&e ) sin modificar.
toupper
)include ctype*h!
int toupper-int ch.;
a funcin toupper9: de&uel&e el e+ui&alente en may9sculas de ), si ) es una
letra min9scula, en cual+uier otro caso se de&uel&e ) sin modificar.
El lenguaje de programacin C
=.+ - Aunciones de cadenas.
memchr
)include string*h!
void *memchr-const void *buffer#int ch#size%t cuenta.;
a funcin mem)r9: "usca en buffer la primera ocurrencia de ) en los
primeros uenta caracteres. a funcin de&uel&e un puntero a la primera ocurrencia del
car2cter ) en buffer. 8i no encuentra ch, de&uel&e un puntero nulo 1LUHH3.
memcmp
)include string*h!
int memcmp-const void *buf=#const void *buf&#size%t cuenta.;
a funcin memmp9: compara los primeros cuenta caracteres de los arrays
apuntados por buf1 y buf2. a comparacin se hace le.icogr2ficamente. a funcin
de&uel&e un entero +ue es interpretado seg9n se indica a continuacin7
Va"or de!ue"to $escricin
5enor +ue cero "uf% es menor +ue "uf6
)gual a cero "uf% es igual a "uf6
5ayor +ue cero "uf% es mayor +ue "uf6
Tabla D.!.1: Interpretai6n de los valores devueltos por la funi6n memmp9:.
memcpy
)include string*h!
void *memcpy-void *hacia#const void *desde#size%t cuenta.;
a funcin memp59: copia uenta caracteres del array apuntado por desde en el
array apuntado por )aia. 8i los arrays se superponen, el comportamiento de memp59:
+ueda indefinido. a funcin de&uel&e un puntero a )aia.
memset
)include string*h!
void *memset-void *buf#int ch#size%t cuenta.;
a funcin memset9: copia el "yte menos significati&o de ) en los primero
uenta caracteres del array apuntado por buf. De&uel&e buf. 8u uso m2s com9n es
iniciali!ar una regin de memoria con alg9n &alor conocido.
strcat
)include string*h!
char *strcat-char *cad=#const char *cad&.;
El lenguaje de programacin C
a funcin strat9: concatena una copia de ad2 en ad1, y aade al final de
ad1 un car2cter nulo 1N0*N3. El car2cter nulo de terminacin, +ue originalmente ten0a
ad1, es sustituido por el primer car2cter de ad2. a cadena ad2 no se modifica en
esta operacin. a funcin strat9: de&uel&e ad1.
strchr
)include string*h!
char *strchr-char *cad#int ch.;
a funcin str)r9: de&uel&e un puntero a la primera ocurrencia del "yte menos
significati&o de ) en la cadena apuntada por ad. 8i no sucede, de&uel&e un puntero
nulo 1LUHH3.
strcmp
)include string*h!
int strcmp-const char *cad=#const char *cad&.;
a funcin strmp9: compara le.icogr2ficamente dos cadenas +ue finali!an con
el car2cter nulo, y de&uel&e un entero +ue se interpreta de la siguiente forma7
Va"or de!ue"to $escricin
5enor +ue cero cad% es menor +ue cad6
)gual a cero cad% es igual a cad6
5ayor +ue cero cad% es mayor +ue
cad6
Tabla D.!.2: Interpretai6n de los valores devueltos por la funi6n strmp9:.
strcpy
)include string*h!
char *strcpy-char *cad=#const char *cad&.;
a funcin strp59: se utili!a para copiar el contenido de ad2 en ad1. El
elemento ad2 de"e ser un puntero a una cadena +ue finalice con un car2cter nulo. a
funcin de&uel&e un puntero a ad1.
strlen
)include string*h!
unsigned int strlen-char *cad.;
a funcin strlen9: de&uel&e el n9mero de caracteres de la cadena apuntada por
ad +ue finali!a con un car2cter nulo. El car2cter nulo no se conta"ili!a.
strto`
)include string*h!
char *strtok-char *cad=#const char *cad&.;
El lenguaje de programacin C
a funcin strtoB9: de&uel&e un puntero a la siguiente pala"ra de la cadena
apuntada por ad1. os caracteres +ue constituyen la cadena apuntada por ad2 son los
delimitadores +ue identifican la pala"ra. De&uel&e un puntero nulo 1LUHH3 cuando no
e.iste ninguna pala"ra +ue de&ol&er.
a primera &e! +ue se llama a strtoB9: se utili!a realmente ad1 en la llamada.
as llamadas posteriores utili!an un puntero nulo 1LUHH3 como primer argumento.
a funcin strtoB9: modifica la cadena apuntada por ad1, pues, cada &e! +ue se
encuentra una pala"ra, se pone un car2cter nulo donde esta el delimitador. De esta
forma strtoB9: puede continuar a&an!ando por la cadena.
=., - Aunciones matem(ticas.
acos
)include math*h!
double acos-double arg.;
a funcin aos9: de&uel&e el arcocoseno de arg. El argumento de aos9: de"e
estar en el rango de P1 a 1, en cual+uier otro caso se produce un error de dominio.
asin
)include math*h!
double asin-double arg.;
a funcin asin9: de&uel&e el arcoseno de arg. El argumento de asin9: de"e
estar en el rango de P1 a 1, en cual+uier otro caso se produce un error de dominio.
atan
)include math*h!
double atan-double arg.;
a funcin atan9: de&uel&e el arcotangente de arg.
atan6
)include math*h!
double atan&-double y#double x.;
a funcin atan29: de&uel&e el arcotangente de 5@$. 'tili!a el signo de sus
argumentos para o"tener el cuadrante del &alor de&uelto.
El lenguaje de programacin C
ceil
)include math*h!
double ceil-double num.;
a funcin eil9: de&uel&e el menor entero mayor o igual +ue num y lo
representa como double. #or ejemplo, dado 1.*2, eil9: de&uel&e 2.*, dado P1.*2, eil9:
de&uel&e P1.*.
cos
)include math*h!
double cos-double arg.;
a funcin os9: de&uel&e el coseno de arg. El &alor de arg de"e &enir dado en
radianes.
cosh
)include math*h!
double cosh-double arg.;
a funcin os)9: de&uel&e el coseno hiper"lico de arg. El &alor de arg de"e
&enir dado en radianes.
e.p
)include math*h!
double exp-double arg.;
a funcin e$p9: de&uel&e el n9mero e ele&ado a la potencia de arg.
fa"s
)include math*h!
double fabs-double num.;
a funcin fabs9: de&uel&e el &alor a"soluto de num.
floor
)include math*h!
double floor-double num.;
a funcin floor9: de&uel&e el mayor entero, representado como double, +ue no
es mayor +ue num. #or ejemplo, dado 1.*2, floor9: de&uel&e 1.*, dado P1.*2, floor9:
de&uel&e P2.*.
El lenguaje de programacin C
fmod
)include math*h!
double fmod-double x#double y.;
a funcin fmod9: de&uel&e el resto de la di&isin entera $@5.
log
)include math*h!
double log-double num.;
a funcin log9: de&uel&e el logaritmo neperiano de num. 8e produce un error
de dominio si num es negati&o, y un error de rango si el argumento es cero.
log%0
)include math*h!
double log=6-double num.;
a funcin log1*9: de&uel&e el logaritmo en "ase 1* de num. 8e produce un
error de dominio si num es negati&o, y un error de rango si el argumento es cero.
po>
)include math*h!
double pow-double base#double exp.;
a funcin poA9: de&uel&e base ele&ada a e$p. 8e produce un error de dominio
si base es cero y e$p es menor o igual a cero. -am"i;n puede ocurrir si base es
negati&o y e$p no es entero. 'n des"ordamiento produce un error de rango.
sin
)include math*h!
double sin-double arg.;
a funcin sin9: de&uel&e el seno de arg. El &alor de arg de"e &enir dado en
radianes.
sinh
)include math*h!
double sinh-double arg.;
a funcin sin)9: de&uel&e el seno hiper"lico de arg. El &alor de arg de"e
&enir dado en radianes.
El lenguaje de programacin C
s+rt
)include math*h!
double s,rt-double num.;
a funcin sFrt9: de&uel&e la ra0! cuadrada de num. 8i se llama con un n9mero
negati&o, se produce un error de dominio.
tan
)include math*h!
double tan-double arg.;
a funcin tan9: de&uel&e la tangente de arg. El &alor de arg de"e &enir dado en
radianes.
tanh
)include math*h!
double tanh-double arg.;
a funcin tan)9: de&uel&e la tangente hiper"lica de arg. El &alor de arg de"e
&enir dado en radianes.
=.- - =signacin din(mica de memoria.
calloc
)include stdlib*h!
void *calloc-size%t num#size%t tam.;
a funcin allo9: asigna memoria para un array de num o"jetos, cada uno de
los cuales tiene tamao tam. a memoria asignada es iniciali!ada con el &alor cero. a
funcin allo9: de&uel&e un puntero al primer "yte de la regin asignada. 8i no e.iste
memoria li"re suficiente para satisfacer la peticin, se de&uel&e un puntero nulo
1LUHH3.
free
)include stdlib*h!
void free-void *ptr.;
a funcin free9: li"era la memoria apuntada por ptr, haciendo +ue dicha
memoria este disponi"le para futuras asignaciones. 8olo se de"e llamar a free9: con un
puntero +ue haya sido pre&iamente asignado utili!ando alguna funcin de asignacin
din2mica.
El lenguaje de programacin C
malloc
)include stdlib*h!
void *malloc-size%t tam.;
a funcin mallo9: de&uel&e un puntero al primer "yte de una regin de
memoria de tamao tam +ue se encuentra li"re. 8i no e.iste memoria suficiente para
satisfacer la peticin, se de&uel&e un puntero nulo 1LUHH3.
realloc
)include stdlib*h!
void *realloc-void *ptr#size%t tam.;
a funcin reallo9: cam"ia el tamao de la memoria apuntada por ptr al +ue
esta especificado por tam. El &alor de tam puede ser mayor o menor +ue el original.
De&uel&e un puntero al nue&o "lo+ue de memoria, ya +ue puede ser necesario +ue
reallo9: traslade el "lo+ue de posicin al incrementar su tamao. 8i esto sucede, el
contenido del antiguo "lo+ue se copia en el nue&o "lo+ue, por lo cual, la informacin
no se pierde.
8i ptr es un puntero nulo 1LUHH3, reallo9: simplemente asigna tam "ytes de
memoria y de&uel&e un puntero a dicha memoria. 8i tam es cero, la memoria asignada
se li"era. 8i no e.iste memoria suficiente para satisfacer la peticin, reallo9: de&uel&e
un puntero nulo 1LUHH3, y el "lo+ue de memoria original se deja sin cam"iar.
=.* - Aunciones !arias.
a"s
)include stdlib*h!
int abs-int num.;
a funcin abs9: de&uel&e el &alor a"soluto del entero dado por num.
atof
)include stdlib*h!
double atof-const char *cad.;
a funcin atof9: con&ierte la cadena apuntada por ad en un &alor de tipo
double. a cadena de"e contener un n9mero &alido en coma flotante. En caso contrario
el &alor de&uelto es indefinido.
El n9mero puede terminar por cual+uier car2cter +ue no pueda formar parte de
un n9mero &2lido en coma flotante. Esto incluye espacios en "lanco, signos de
puntuacin distintos del punto, y caracteres +ue no sean E o e. /s0 si se llama a atof9:
con la cadena 21**.**T3HD2, de&ol&er2 el &alor 1**.**.
El lenguaje de programacin C
atoi
)include stdlib*h!
int atoi-const char *cad.;
a funcin atoi9: con&ierte la cadena apuntada por ad en un &alor de tipo int.
a cadena de"e contener un n9mero entero &alido. 8i no es este el caso, el &alor
de&uelto es indefinido, aun+ue, la mayor0a de implementaciones de la funcin
de&uel&en el &alor cero.
El n9mero puede aca"ar con cual+uier car2cter +ue no pueda formar parte de un
n9mero entero. Esto incluye espacios en "lanco, signos de puntuacin, y cual+uier
car2cter +ue no sea la E o la e. Esto supone +ue si se llama a atoi9: con la cadena
212!.2!2, de&ol&er2 el &alor 12!.
atol
)include stdlib*h!
long int atol-const char *cad.;
a funcin atol9: con&ierte la cadena apuntada por ad en un &alor de tipo long
int. #ara m2s informacin consultar la funcin atoi9:.
e.it
)include stdlib*h!
void exit-int estado.;
a funcin e$it9: da lugar inmediatamente a la terminacin normal de un
programa. El &alor de estado se pasa al proceso +ue llamo a este programa,
normalmente el sistema operati&o, si el entorno lo soporta. #or con&enio, si el &alor de
estado es cero, se supone +ue se ha producido una terminacin normal del programa.
'n &alor distinto de cero puede utili!arse para indicar un error definido por la
implementacin.
la"s
)include stdlib*h!
long labs-long num.;
a funcin labs9: de&uel&e el &alor a"soluto de num.
system
)include stdlib*h!
int system-const char *cad.;
a funcin s5stem9: pasa la cadena apuntada por ad como una orden al
procesador de ordenes del sistema operati&o. 8i se llama a s5stem9: con un puntero
nulo 1LUHH3, de&uel&e un &alor distinto de cero si est2 presente un procesador de
El lenguaje de programacin C
ordenes, en otro caso, se de&uel&e un &alor distinto de cero. 8i ad no es un puntero
nulo 1LUHH3, s5stem9: de&uel&e el &alor cero si la orden ha sido correctamente
ejecutada, y un &alor distinto de cero en caso contrario.
El lenguaje de programacin C
=0ndice BH Ejem"os de rogramas en C.
En este ap;ndice se incluyen algunos programas de ejemplo escritos en lenguaje
C. os programas han sido reali!ados de forma +ue puedan ser compilados en la
mayor0a de compiladores e.istentes para los sistemas operati&os 58$D<8 y '()* sin
+ue e.ista la necesidad de reali!ar ning9n tipo de cam"io en los mismos.
B.1 - a"indro.c.
/* >rograma ,ue calcula si una palabra es palindroma# esto es# se lee
igual de derecha a iz,uierda ,ue de iz,uierda a derecha* */
)include stdio*h!
)include string*h!
)define ZAS =66
/* Lutina ,ue calcula si una palabra es palindroma*
>arametrosB char *cadena >untero al string con la palabra*
LeturnB int 6 no palindroma# !6 palindroma* */
int >alindroma-char *cadena.
1
register int i#G;
i=6;
G=strlen-cadena.C=;
while -iG 77 cadena"i$==cadena"G$.
1
i22;
GCC;
3
return -i!=G.;
3
int main-void.
1
char cadena"ZAS$;
printf-X:nPntroduce la palabra:nX.;
gets-cadena.;
printf-XQa palabraB 9s 9s palindroma*:nX#cadena#
->alindroma-cadena.. A XesX B Xno esX.;
return 6;
3
B.2 - matri2.c.
/* >rograma ,ue calcula el producto de dos matrices* */
)include stdio*h!
7@
El lenguaje de programacin C
/* Definicion del tamaNo maximo */
)define ZAS =6
/* Definicion de los codigos de error */
)define Y` 6
)define @LLYL =
/* Definicion de la estructura de datos */
struct SAZLPJ
1
unsigned fila#columna;
float matriz"ZAS$"ZAS$;
3;
/* Lutina ,ue muestra un menu y pide una opcion del menu*
>arametrosB Ringuno*
LeturnB char Ypcion del menu elegida* */
char Senu-void.
1
register char d;
printf-X:n@lige la opcion deseadaB:nX.;
printf-X:t6 CC Falir del programa*:nX.;
printf-X:t= CC ?ambiar la matriz A*:nX.;
printf-X:t& CC ?ambiar la matriz I*:nX.;
printf-X:t' CC ?alcular A*I:nX.;
printf-X:tU CC ?alcular I*A:nX.;
while --d=getchar-..^6^ __ d!^U^.;
return d;
3
/* Lutina ,ue pide el numero de filas o de columnas de una matriz*
>arametrosB char *cadena >untero al string a mostrar*
LeturnB unsigned Rumero de filas o de columnas* */
unsigned >edirZamano-const char *cadena.
1
unsigned valor;
do
1
printf-X9sX#cadena.;
scanf-X9uX#7valor.;
3
while -valor==6 __ valor!ZAS.;
return valor;
3
/* Lutina ,ue cambia una matriz*
>arametrosB struct SAZLPJ *a >untero a la matriz ,ue vamos a cambiar*
LeturnB Ringuno* */
void >edirSatriz-struct SAZLPJ *a.
1
register unsigned i#G;
float valor;
7C
El lenguaje de programacin C
aC!fila=>edirZamano-X:nRumero de filas de la matrizB X.;
aC!columna=>edirZamano-X:nRumero de columnas de la matrizB :nX.;
for-i=6;iaC!fila;i22.
for-G=6;GaC!columna;G22.
1
printf-XS"9u$"9u$B X#i#G.;
scanf-X9fX#7valor.;
aC!matriz"i$"G$=valor;
3
3
/* Lutina ,ue multiplica dos matrices* Qas matrices se pasan por
puntero pues ello es mas rapido# aun,ue no se modifican en toda la
funcion*
>arametrosB struct SAZLPJ *a >untero a la estructura con la primera
matriz a multiplicar*
struct SAZLPJ *b >untero a la estructura con la segunda
matriz a multiplicar*
struct SAZLPJ *res >untero a la estructura ,ue contendra
el resultado*
LeturnB int ?odigo de error* */
int Sultiplicar-const struct SAZLPJ *a#const struct SAZLPJ *b#struct
SAZLPJ *res.
1
register unsigned i#G#k;
if -aC!columnaE=bC!fila.
return @LLYL;
resC!fila=aC!fila;
resC!columna=bC!columna;
for-i=6;iaC!fila;i22.
for-G=6;GbC!columna;G22.
1
resC!matriz"i$"G$=6;
for-k=6;kaC!fila;k22.
resC!matriz"i$"G$2=aC!matriz"i$"k$*bC!matriz"k$"G$;
3
return Y`;
3
/* Lutina ,ue muestra en pantalla el resultado de la operacion*
>arametrosB struct SAZLPJ *res >untero a la estructura con el
resultado*
LeturnB Ringuno* */
void Sostrar-const struct SAZLPJ *res.
1
register unsigned i#G;
for-i=6;iresC!fila;i22.
1
for-G=6;GresC!columna;G22.
printf-XLes"9u$"9u$= 9f:nX#i#G#resC!matriz"i$"G$.;
printf-X:n>ulsa @nter para continuar*:nX.;
getchar-.;
3
3
77
El lenguaje de programacin C
int main-void.
1
struct SAZLPJ a#b#res;
char d;
a*fila=a*columna=b*fila=b*columna==;
a*matriz"6$"6$=b*matriz"6$"6$==*6;
do
switch-d=Senu-..
1
case ^6^Bbreak;
case ^=^B>edirSatriz-7a.;
break;
case ^&^B>edirSatriz-7b.;
break;
case ^'^B
if -Sultiplicar-7a#7b#7res.==@LLYL.
printf-X:nRo es posible multiplicar A*I:nX.;
else
Sostrar-7res.;
break;
case ^U^B
if -Sultiplicar-7b#7a#7res.==@LLYL.
printf-X:nRo es posible multiplicar I*A:nX.;
else
Sostrar-7res.;
break;
3
while -dE=^6^.;
return 6;
3
B.+ - ordenar.c.
/* >rograma ,ue ordena un fichero de cual,uier tamaNo mediante el
algoritmo auickFort* @l 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!
/* Lutina ,ue lee el fichero de datos y devuelve un puntero al array
de la memoria reservada*
>arametrosB char *nombre Rombre del fichero a leer*
unsigned *num >untero al unsigned ,ue contendra el numero
de elementos del array*
LeturnB float * >untero al array de float# RWQQ si sucede un error* */
float *Qeer4ichero-const char *nombre# unsigned *num.
1
4PQ@ *fp;
float *p;
register unsigned i;
7B
El lenguaje de programacin C
if --fp=fopen-nombre#XrtX..==RWQQ.
1
printf-X:n@rror# no puedo abrir el ficheroB 9s:nX#nombre.;
return RWQQ;
3
fscanf-fp#X9u:nX#num.;
if --p=-float *.calloc-*num#sizeof-float...==RWQQ.
1
printf-X:n@rror# memoria insuficiente*:nX.;
fclose-fp.;
return RWQQ;
3
for-i=6;i*num;i22.
fscanf-fp#X9f:nX#7p"i$.;
fclose-fp.;
return p;
3
/* Lutina ,ue escribe el fichero de datos ordenado*
>arametrosB char *nombre Rombre del fichero donde guardar los datos*
unsigned num Rumero de elementos del array*
float *p >untero al array ordenado*
LeturnB Ringuno* */
void ]uardar4ichero-const char *nombre#const unsigned num#const float
*p.
1
4PQ@ *fp;
register unsigned i;
if --fp=fopen-nombre#XwtX..==RWQQ.
1
printf-X:n@rror# no puedo crear el ficheroB 9s:nX#nombre.;
return;
3
fprintf-fp#X9u:nX#num.;
for-i=6;inum;i22.
fprintf-fp#X9f:nX#p"i$.;
fclose-fp.;
3
/* Lutina ,ue ordena un array segun el algoritmo auickCFort*
>arametrosB float *p >untero al array a ordenar*
unsigned iz, @lemento de la iz,uierda a ordenar*
unsigned der @lemento de la derecha a ordenar*
LeturnB Ringuno* */
void auickFort-float *p#unsigned iz,#unsigned der.
1
register unsigned i=iz,#G=der;
float val#inter;
val=p"-i2G./&$;
do
1
while -p"i$val. i22;
while -p"G$!val. GCC;
if -i=G.
7?
El lenguaje de programacin C
1
inter=p"i$;
p"i$=p"G$;
p"G$=inter;
i22;
GCC;
3
3
while -i=G.;
if -iz,G. auickFort-p#iz,#G.;
if -ider. auickFort-p#i#der.;
return;
3
int main-int argc#char *argv"$.
1
float *p;
unsigned num;
if -argcE='.
1
printf-X:nSodo de usoB 9s fichero=! fichero&!:nX#argv"6$.;
return-=.;
3
if --p=Qeer4ichero-argv"=$#7num..==RWQQ.
return =;
auickFort-p#6#numC=.;
]uardar4ichero-argv"&$#num#p.;
free-p.;
return 6;
3
B., - fic;ero.c.
/* >rograma ,ue maneGa una pe,ueNa base de datos directamente sobre el
fichero */
)include stdio*h!
)include string*h!
/* Definicion de las constantes del programa */
)define ZAS '6
)define ZAS%IW44@L =6
/* Definicion de los codigos de error */
)define Y` 6
)define @LLYL =
/* Definicion de las estructuras de datos del programa */
struct 4P?bA
1
unsigned long dni;
char nombre"ZAS$;
char apellido"&$"ZAS$;
3;
B0
El lenguaje de programacin C
/* Lutina ,ue muestra un menu en pantalla*
>arametrosB Ringuno*
LeturnB char Ypcion elegida* */
char Senu-void.
1
register char d;
printf-X:n@lige una opcionB:nX.;
printf-X:t6 CC Falir del programa*:nX.;
printf-X:t= CC Pnsertar un nuevo elemento*:nX.;
printf-X:t& CC Iuscar un elemento por su dni*:nX.;
printf-X:t' CC Iuscar un elemento por su apellido*:nX.;
while --d=getchar-..^6^ __ d!^'^.;
return d;
3
/* Lutina ,ue muestra un elemento en pantalla*
>arametrosB struct 4P?bA *ficha >untero a la estructura con los datos
a mostrar*
LeturnB Ringuno* */
void Sostrar-const struct 4P?bA *ficha.
1
printf-X:n:nDRPB 9lu:nX#fichaC!dni.;
printf-XRYSIL@B 9s:nX#fichaC!nombre.;
printf-X>LPS@L A>@QQPDYB 9s:nX#fichaC!apellido"6$.;
printf-XF@]WRDY A>@QQPDYB 9s:nX#fichaC!apellido"=$.;
printf-X:n>ulsa @nter para continuar:nX.;
getchar-.;
3
/* Lutina ,ue busca un elemento dado su dni*
>arametrosB 4PQ@ *fichero >untero al fichero de trabaGo*
unsigned long dni Rumero de dni a buscar*
char opcion Ypcion de eGecucion# = mostrar# 6 no mostrar*
LeturnB int ?odigo de error* */
int IuscarDni-4PQ@ *fichero#const unsigned long dni#const char opcion.
1
struct 4P?bA ficha;
fseek-fichero#6Q#F@@`%F@Z.;
while -fread-7ficha#sizeof-struct 4P?bA.#=#fichero.===.
if -dni==ficha*dni.
1
if -opcion.
Sostrar-7ficha.;
Leturn Y`;
3
return @LLYL;
3
/* Lutina ,ue busca por apellidos*
>arametrosB 4PQ@ *fichero >untero al fichero de trabaGo*
char *apellido Apellido a buscar*
LeturnB int ?odigo de error**/
B%
El lenguaje de programacin C
int IuscarApellido-4PQ@ *fichero#char *apellido.
1
struct 4P?bA ficha;
char encontrado=6;
fseek-fichero#6Q#F@@`%F@Z.;
while -fread-7ficha#sizeof-struct 4P?bA.#=#fichero.===.
if -Estrcmp-apellido#ficha*apellido"6$. __
Estrcmp-apellido#ficha*apellido"=$..
1
Sostrar-7ficha.;
encontrado==;
3
return -encontrado. A Y` B @LLYL;
3
/* Lutina ,ue inserta un nuevo elemento en el fichero*
>arametrosB 4PQ@ *fichero >untero al fichero de trabaGo*
struct 4P?bA *ficha >untero a la ficha a insertar*
LeturnB int ?odigo de error* */
int Pnsertar-4PQ@ *fichero#const struct 4P?bA *ficha.
1
if -IuscarDni-fichero#fichaC!dni#6.E=@LLYL.
return @LLYL;
fseek-fichero#6Q#F@@`%@RD.;
fwrite-ficha#sizeof-struct 4P?bA.#=#fichero.;
return Y`;
3
/* Lutina ,ue pide los datos de una ficha*
>arametrosB struct 4P?bA *ficha >untero a la ficha ,ue contendra los
datos*
char opcion Ypcion de eGecucion -6**&.*
LeturnB struct 4P?bA * >untero a la ficha ,ue contiene los datos* */
struct 4P?bA *>edirDatos-struct 4P?bA *ficha#
const char opcion.
1
switch-opcion.
1
case 6B printf-X:nDRPB X.;
scanf-X9luX#7fichaC!dni.;
fflush-stdin.;
break;
case =B fflush-stdin.;
printf-XA>@QQPDYB X.;
strupr-gets-fichaC!apellido"=$..;
break;
case &B printf-X:nDRPB X.;
scanf-X9luX#7fichaC!dni.;
fflush-stdin.;
printf-XRYSIL@B X.;
strupr-gets-fichaC!nombre..;
printf-X>LPS@L A>@QQPDYB X.;
strupr-gets-fichaC!apellido"6$..;
printf-XF@]WRDY A>@QQPDYB X.;
strupr-gets-fichaC!apellido"=$..;
B6
El lenguaje de programacin C
break;
3
return ficha;
3
int main-int argc#char *argv"$.
1
4PQ@ *fichero;
struct 4P?bA ficha;
register char d;
if -argcE=&.
1
printf-X:nSodo de usoB 9s fichero!:nX#argv"6$.;
return =;
3
if --fichero=fopen-argv"=$#Xa2bX..==RWQQ.
1
printf-X:n@rror creando el ficheroB 9s:nX#argv"=$.;
return =;
3
if -setvbuf-fichero#RWQQ#%PY4I4#
ZAS%IW44@L*sizeof-struct 4P?bA..E=6.
1
printf-X:n@rror creando el buffer para 9d elementos*:nX#
ZAS%IW44@L.;
fclose-fichero.;
return =;
3
do
switch-d=Senu-..
1
case ^6^Bbreak;
case ^=^Bif -Pnsertar-fichero#>edirDatos-7ficha#&..==@LLYL.
printf-X:nRumero de dni duplicado*:nX.;
break;
case ^&^B>edirDatos-7ficha#6.;
if -IuscarDni-fichero#ficha*dni#=.==@LLYL.
printf-X:nDni no existente*:nX.;
break;
case ^'^B>edirDatos-7ficha#=.;
if -IuscarApellido-fichero#ficha*apellido"=$.==@LLYL.
printf-X:nApellido inexistente*:nX.;
break;
3
while -dE=^6^.;
fclose-fichero.;
return 6;
3
B.- - arbo".c.
/* >rograma ,ue lee las palabras de un fichero y las almacena en un
arbol binario */
)include stdio*h!
El lenguaje de programacin C
)include ctype*h!
)include string*h!
)include stdlib*h!
/* Definicion de la longitud maxima de una palabra */
)define ZAS '6
/* Definicion de las estructuras de datos del programa */
struct ALIYQ
1
char pal"ZAS2=$;
struct ALIYQ *iz,#*der;
3;
/* Lutina ,ue lee una palabra del fichero*
>arametrosB 4PQ@ *fichero >untero al fichero de donde se leen las
palabras*
char *cadena Array de caracteres donde almacenar las
palabras*
LeturnB char * >untero a la cadena con la palabra leida# RWQQ si
error* */
char *Qeer>alabra-4PQ@ *fichero#char *cadena.
1
register char d#i=6;
while --d=fgetc-fichero..E=@Y4 77 Eisalpha-d..;
if -d==@Y4.
return RWQQ;
do
cadena"i22$=d;
while -iZAS 77 -isalpha-d=fgetc-fichero.. __ isdigit-d. __
d==^%^..;
cadena"i$=^:6^;
return cadena;
3
/* Lutina ,ue crea el arbol binario# leyendo para ello el fichero*
>arametrosB char *nombre Rombre del fichero a leer*
LeturnB struct ALIYQ * >untero a la raiz del arbol creado# RWQQ si
error* */
struct ALIYQ *Qeer4ichero-char *nombre.
1
4PQ@ *fichero;
char cadena"ZAS2=$#insertado;
int val;
struct ALIYQ *cab=RWQQ#*p#*,;
if --fichero=fopen-nombre#XrtX..==RWQQ.
1
printf-X:n@rror# no puedo leer el ficheroB 9s:nX#nombre.;
return-RWQQ.;
3
while -Qeer>alabra-fichero#cadena.E=RWQQ.
1
if --,=-struct ALIYQ *.malloc-sizeof-struct ALIYQ...==RWQQ.
1
BF
El lenguaje de programacin C
printf-X:n@rror reservando memoria*:nX.;
fclose-fichero.;
return RWQQ;
3
strcpy-,C!pal#cadena.;
,C!iz,=,C!der=RWQQ;
if -cab==RWQQ.
cab=,;
else
1
p=cab;
insertado=6;
while -Einsertado.
if --val=strcmp-cadena#pC!pal..6.
if -pC!iz,==RWQQ.
1
pC!iz,=p;
insertado==;
3
else
p=pC!iz,;
else
if -val!6.
if -pC!der==RWQQ.
1
pC!der=,;
insertado==;
3
else
p=pC!der;
else
insertado==;
3
3
fclose-fichero.;
return cab;
3
/* Lutina ,ue muestra por pantalla el arbol ordenado a la vez ,ue
libera la memoria*
>arametrosB struct ALIYQ *p >untero al nodo a mostrar*
unsigned *cont >untero al contador de elementos para
permitir parar la visualizacion*
LeturnB Ringuno*
*/
void Sostrar-struct ALIYQ *p#unsigned *cont.
1
if -pC!iz,E=RWQQ.
Sostrar-pC!iz,#cont.;
puts-pC!pal.;
if -22*cont!&=.
1
*cont==;
printf-X:n>ulsa @nter para continuar*:nX.;
getchar-.;
3
if -pC!derE=RWQQ.
B@
El lenguaje de programacin C
Sostrar-pC!der#cont.;
free-p.;
3
int main-int argc#char *argv"$.
1
struct ALIYQ *p;
unsigned cont==;
if -argcE=&.
1
printf-X:nSodo de usoB 9s fichero!:nX#argv"6$.;
return =;
3
if --p=Qeer4ichero-argv"=$..==RWQQ.
return =;
printf-X:n:n:n:n:n:nX.;
Sostrar-p#7cont.;
return 6;
3
BC

También podría gustarte