Anda di halaman 1dari 112

PROCESO LTDA.

Tecnologia Que Capacita



Curso de Lenguaje C

Por: Anibal G. Martinez Arcia
Ingeniero de Sistemas (UNAL)
E-Mail: anibal_m@hotmail.com

VARIABLES, CONSTANTES, OPERADORES Y EXPRESIONES

IDENTIFICADORES

Un i dent i f i cador est const i t u do de car act er es al f abt i cos y
numr i cos, adems es posi bl e hacer uso del car act er subr ayado.
El pr i mer car act er del i dent i f i cador debe ser obl i gat or i ament e una
l et r a o un subr ayado.

Par a el lenguaje C l as l et r as mi nscul as son t ot al ment e di f er ent es de
l as mayscul as.

Son si gni f i cat i vos l os pr i mer os 32 car act er es ( TURBO C - Microsoft C) .

Son si gni f i cat i vos l os pr i mer os 8 car act er es ( Latice C Ver. 3.0 y
UNIX C) .

Toda pal abr a r eser vada se escr i be en mi nscul a.


TIPOS DE DATOS ( Mi cr osof t C)

Tipo Significado bits Rango
char car act er 8
- 128
a
127
i nt ent er o 16
- 32768
a
32767
f l oat f l ot ant e 32 - 3. 4e+48 a 3. 4e+48
doubl e dobl e 64 - 1. 7e+308 a 1. 7e+308
voi d vaci o 0 si n val or

MODIFICADORES DE TIPO

Los modi f i cador es o cal i f i cador es de t i po, se apl i can a l os ent er os y
car act er . si n embar go es posi bl e apl i car long al t i po de dat os doubl e.


Cur so de Lenguaj e C - Por : I ng. Ani bal Mar t i nez Ar ci a. 1
char 8 - 128 a 127
signed char 8 - 128 a 127
unsigned char 8 0 a 255
int 16 - 32768 a 32767
short 16 - 32768 a 32767
unsigned int 16 0 a 65535
long int 32 - 2147483648 a 2147483647
unsigned long 32 0 a 4294967295

l ong equi val e a l ong i nt
unsi gned equi val e a unsi gned i nt
unsi gned l ong equi val e a unsi gned l ong i nt


DECLARACION DE VARIABLES

For mat o: t i po l i st a_de_var i abl es;
t i po var i abl e1 [ , var i abl e2, . . . var i abl e_n] ;


Ej empl o:
i nt a, b; f l oat f , g; doubl e d;
char ch; l ong l , k; si gned char ca;

SITIOS DONDE SE DECLARAN VARIABLES

1. Fuer a de t odas l as f unci ones i ncl uyendo mai n( ) .
2. Dent r o de una f unci n.
3. En l os par met r os f or mal es de una f unci n.

EJEMPLOS DE CONSTANTES
char ' a' ' \ n' ' 9'
int 12000 - 354
long 1236377 - 6775774
unsigned 292999 0
float o double 12432. 89 - 0. 89 1. 0E100

CONSTANTES HEXADECIMALES Y OCTALES

Las const ant es hexadeci mal es comi enzan por : 0x ( cer o x) .
Una const ant e oct al comi enza por : 0 ( cer o) .

Ej empl o:
i nt h; i nt oc;
h=0xFF / * 255 en deci mal */
oc=011 / * 9 en deci mal */

CONSTANTES DE CADENA

Las const ant es de cadena se ent r ecomi l l an con comi l l a dobl e ( " ) .

Cur so de Lenguaj e C - Por : Ani bal Mar t i nez Ar ci a. 2
Las const ant es de car act er se ent r ecomi l l an con comi l l a si mpl e ( ' ) .

Ej empl o: " Est o es una cadena"
" a"
' a'

Not a: " a" es di f er ent e de ' a'

La r epr esent aci n de ' a' como car act er y " a" como cadena en l a memor i a
ser i a:
car act er cadena
a a\ 0

Cur so de Lenguaj e C - Por : I ng. Ani bal Mar t i nez Ar ci a. 3
CONSTANTES DE BARRA INVERTIDA

\ b Ret r oceso
\ a Al ar ma
\ f Al i ment aci n de pgi na
\ n Nueva l i nea
\ r Ret or no de car r o
\ t Tabul ador hor i zont al
\ " Dobl e comi l l a
\ ' Comi l l a si mpl e
\ \ Bar r a i nver t i da
\ v Tabul ador ver t i cal ( I mpr esor a)
\ x Const ant e hexadeci mal
\ N Const ant e oct al donde N es una
const ant e oct al

Ej empl o: ch = ' \ n'

INICIALIZACION DE VARIABLES

For mat o: t i po var i abl e = const ant e;

Ej empl o : char ch = ' a' ;
f l oat f = 123. 675;

CONSTANTES SIMBOLICAS

#def i ne nombr e_const ant e val or

Ej empl o:
#def i ne PI 3. 1416
#def i ne ERR_1 pr i nt f ( " Er r or 26\ n" )

OPERADORES

Operadores aritmticos
+ Suma
- Rest a
* Mul t i pl i caci n
/ Di vi si n
% Modul o
++ I ncr ement o
- - decr ement o
( ) Agr upar

Pr ecedenci a
++ - - ( )
* / %
+ -

Cur so de Lenguaj e C - Por : Ani bal Mar t i nez Ar ci a. 4


Operadores relacionales y lgicos:

Oper ador es de r el aci n :
> >= < <=
== ! =

Oper ador es l gi cos :
&& | | !

and or not


Pr esedenci a de l os oper ador es r el aci onal es y l gi cos
!
> >= < <=
== ! =
&&
| |
Ej empl o de al gunas expr esi ones:

1 && ! 0 | | 1 / * r esul t a 1 */
1 && ! ( 0 | | 1) / * r esul t a 0 */
El oper ador si zeof ( ) : Devuel ve el t amao de un t i po de dat o o
de una var i abl e en byt es.

EXPRESIONES

Conver si n de t i po
char y shor t . . . . . . . . . . . . . i nt
f l oat . . . . . . . . . . . . . . . . . doubl e

Ej empl o:
char ch;
i nt i ;
f l oat f ;
doubl e d;

r = ( ch / i ) + ( f * d) - ( f + i ) ;
| | | | | |
i nt doubl e f l oat
| | |
| / /
\ / /
\ / /
doubl e
|
doubl e

CAST : For za a una expr esi n a ser de un t i po espec f i co.

Cur so de Lenguaj e C - Por : I ng. Ani bal Mar t i nez Ar ci a. 5
For mat o:
( t i po) expr esi n


Ej empl o:
i nt x; f l oat r ;
x = 35;
r = ( f l oat ) x / 2; / * r esul t a 17. 5 */
r = ( f l oat ) ( x / 2) / * r esul t a 17. 0 */

OPERADORES Y EXPRESIONES DE ASIGNACION

For mat o :
var i abl e op= exp;

op es uno de l os si gui ent es oper ador es:
+ - * / % << >> & ^ | ~

Ej empl o :
x *= y + 1; a - = 4;

y es equi val ent e a :

x = x * ( y + 1) ; a = a - 4;


TABLA COMPLETA DE PRESEDENCIA DE OPERADORES

( ) [ ] - > . . . . . . . . I zq. a der echa
! ~ ++ - - ( t i po) * & si zeof . . . . . " " "
* / % . . . . . . . . " " "
<< >> . . . . . . . . " " "
< <= > >= . . . . . . . . " " "
== ! = . . . . . . . . " " "
& . . . . . . . . " " "
^ . . . . . . . . " " "
| . . . . . . . . " " "
&& . . . . . . . . " " "
| | . . . . . . . . " " "
?: . . . . . . . . Der echa a i zq.
= += - = et c. . . . . . . . . " " "
, . . . . . . . . I zq. a der echa

ENTRADA Y SALIDA DE CONSOLA FORMATEADA

printf() : Escr i be dat os en di ver sos f or mat os, por l o t ant o se
denomi na t ambi n sal i da f or mat eada.
printf() escr i be dat os en l a consol a.

For mat o:
pr i nt f ( " cadena_de_ct r l " , l i st a_de_ar gument os) ;

Cur so de Lenguaj e C - Por : Ani bal Mar t i nez Ar ci a. 6


cadena_de_ct r l : Comi enza con un si gno de por cent aj e ( %) y l uego l e
si gue el cdi go de f or mat o.

l i st a_de_ar gument os : Son var i abl es, const ant es o expr esi ones a
vi sual i zar .

Tabla de ordenes de formato de printf()
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Codi go Si gni f i cado
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
%c vi sual i za un car act er
%d vi sual i za deci mal
%i vi sual i za deci mal
%e vi sual i za en not aci n ci ent i f i ca
%f vi sual i za dat os en punt o f l ot ant e
%g usa %e %f l a que sea ms cor t a
%o vi sual i za oct al
%s vi sual i za cadena de car act er es
%u vi sual i za deci mal si n si gno
%x vi sual i za hexadeci mal
%% i mpr i me si gno %
%p vi sual i za un punt er o

Ej empl o:
pr i nt f ( " Dat os %c %d %s\ n" , ' a' , 100, " car act er es" ) ;

/ * vi sul i za : Dat os a 100 car act er es */

/ *****
*
* suma de val or es
*
*****/

mai n( )
{
i nt a, b;

a = 10; b = 40;

pr i nt f ( " Suma de a + b = %d\ n" , a+b) ;
}

ESPECIFICADOR DE ANCHO DE CAMPO

Compl et a l a sal i da con bl ancos o cer os par a asegur ar que es al menos
l a l ongi t ud m ni ma.


Cur so de Lenguaj e C - Por : I ng. Ani bal Mar t i nez Ar ci a. 7
Si una cadena o nmer o es mayor que el m ni mo ancho especi f i cado, est a
se i mpr i mi r compl et a.

El r el l eno por def ect o es bl anco. Si se desea un r el l eno con cer os se
debe poner cer o ant es del especi f i cador de ancho de campo.



Ej empl o:
pr i nt f ( " %05d" , 48) ; / * vi sual i za : 00048 */
pr i nt f ( " %5d" , 48) ; / * vi sual i za : 48 */



Si se desea especi f i car posi ci ones deci mal es par a un val or en punt o
f l ot ant e, se pone un punt o deci mal segui do por el nmer o de deci mal es.

Ej empl o:
pr i nt f ( " %10. 2f " , 123. 1283) ;
/ * vi sual i za : 123. 12 */

Not a : Tenga en cuent a que el val or que apar ece ant es del punt o
especi f i ca el ancho t ot al de campo i ncl uyendo l as posi ci ones deci mal es
y el punt o deci mal . Lo ant er i or se podr a l eer como campo de t amao
di ez de l os cual es si et e se t omar n par a l a par t e ent er a, dos par a
deci mal es y uno par a el punt o.

Por def ect o t oda sal i da f or mat eada se j ust i f i ca a l a der echa; si se
desea un ef ect o cont r ar i o ent onces se debe col ocar un gui n despus
del si gno por ci ent o.
Ej empl o:
pr i nt f ( " %- 5d" , 48) ; / * vi sual i za : 48 */
pr i nt f ( " %- 5. 2f " , 48) ; / * vi sual i za : 48. 00 */

Cuando se usa el punt o en una cadena; el val or que l e si gue al punt o
i ndi ca el mxi mo ancho de l a cadena.

Ej empl o:
pr i nt f ( " %5. 7s" , " J os per ez" ) ;

El ci nco i ndi ca que l a cadena t endr al menos ci nco car act er es y un
mxi mo de si et e.

Si l a cadena es ms l ar ga que el ancho mxi mo especi f i cado, l os
car act er es adi ci onal es se t r uncan por l a der echa.

Ej er ci ci o:

/ *****
*
* f or mat eo de l a sal i da

Cur so de Lenguaj e C - Por : Ani bal Mar t i nez Ar ci a. 8
*
*****/

mai n( )
{
i nt i = 100;
f l oat f = 3. 5;

pr i nt f ( " i = %4d, f = %2. 2f \ n" , i , f ) ;
}
MODIFICADORES DE FORMATO PARA printf() QUE PERMITEN VISUALIZAR ENTEROS
CORTOS Y LARGOS

l . . . . . . . . . . . . . . . . . . . dat o l ong
h . . . . . . . . . . . . . . . . . . . dat o shor t

Los ant er i or es modi f i cador es se pueden apl i car a l os cdi gos de
f or mat o : d, i , o, u y x.

Ej empl o :
pr i nt f ( " %l d" , p) ; / * vi sul i za un l ong i nt */

scanf() : Funci n de ent r ada de pr opsi t o gener al que l ee l a cor r i ent e
st di n.

For mat o :
scanf ( " cadena_de_ct r l " , l i st a_de_ar gument os) ;

cadena_de_ct r l : Const a de t r es cl asi f i caci ones de car act er es:

1. Especi f i cador es de f or mat o
2. Car act er es de espaci o en bl anco
3. Car act er es de no espaci o en bl anco

El cdi go de f or mat o l e di ce a scanf() que t i po de dat os se l ee a
cont i nuaci n.

Tabla de cdigos de formato de scanf()
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Codi go Si gni f i cado
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
%c l ee un car act er
%d l ee un deci mal ent er o
%i l ee un deci mal ent er o
%e l ee un nmer o en punt o f l ot ant e
%f l ee un nmer o en punt o f l ot ant e
%o l ee un nmer o oct al
%s l ee una cadena
%x l ee un nmer o hexadeci mal
%p l ee un punt er o


Cur so de Lenguaj e C - Por : I ng. Ani bal Mar t i nez Ar ci a. 9
Un car act er de espaci o en bl anco en l a cadena de cont r ol pr ovoca que
scanf() sal t e sobr e uno o ms car act er es de espaci o en bl anco t abul ado
o r et ur n en l a cor r i ent e de ent r ada.

Ej empl o:
scanf ( " %d %f %s" , &i , &f , &st r ) ;
/ * l a ent r ada podr i a ser : 20 3. 5 mar i a */

Un car act er de no espaci o en bl anco pr ovoca que scanf() l ea y descar t e
un car act er que no encaj e.

Ej empl o:
scanf ( " %d, %d" , &x, &y) ;
/ * l a ent r ada podr i a ser : 20, 50 */

Si no se encuent r a el car act er especi f i cado t er mi nar scanf().

Supr esi n de l a asi gnaci n con *.


Si en un scanf() se especi f i ca el car act er %*, el campo de ent r ada no
ser t omado en cuent a.

Ej empl o:
scanf ( " %d%*c%d" , &x, &y) ;
/ * l a ent r ada podr i a ser : 20/ 40 */
/ * x = 20 y = 40 */

En l as or denes de f or mat o se puede especi f i car el modi f i cador mxi mo
ancho de campo.

Ej empl o :
scanf ( " 20s" , st r ) ; / * l ee mxi mo 20 car act er es */
Si l a ent r ada t i ene ms de 20 car act er es, el si gui ent e scanf() o
cual qui er l l amada a una post er i or ent r ada comenzar donde qued l a
ant er i or .

Sea cui dadoso, l a ent r ada par a un campo puede t er mi nar ant es de
compl et ar l a l ongi t ud mxi ma de l a mi sma al encont r ar un espaci o en
bl anco. scanf() se mover al pr xi mo campo.

Ej empl o:
scanf ( " %2d %f %*d %2s" , &i , &f , &nom) ;
/ * al l eer : 5674 139 49abc74 quedar :
i = 56 f = 74. 00 sal t ar 139 nom= " 49" */

La si gui ent e l l amada a cual qui er f unci n de ent r ada comenzar a par t i r
de a.


EJERCICIOS DE APLICACION

Cur so de Lenguaj e C - Por : Ani bal Mar t i nez Ar ci a. 10

Desar r ol l e una ser i e de ej er ci ci os par a poner en pr ct i ca t odo l o
est udi ado hast a el moment o.

Pr ogr amas ej empl o

/ *****
*
* l ee un val or y devuel ve su cuadr ado
*
*****/

mai n( )
{
i nt a;

pr i nt f ( " Tecl ea un val or : " ) ; scanf ( " %d" , &a) ;
pr i nt f ( " Cuadr ado de %d es i gual a %d\ n" , a, a*a) ;
}


/ *****
*
* conver si on de gr ados cel ci us a f ahr enhei t
* C = ( 5/ 9) ( f - 32)
*
*****/

mai n( )
{
f l oat f ahr , cel ci us;

pr i nt f ( " Gar dos f ahr enhei t : " ) ; scanf ( " %f " , &f ahr ) ;
cel ci us = ( 5. 0 / 9. 0) * ( f ahr - 32) ;
pr i nt f ( " %6. 2f gr ados f ahr enhei t equi val en a %6. 2f cel ci us\ n" ,
f ahr , cel ci us) ;
}


ARCHIVOS DE INCLUSION O CABECERA

Los ar chi vos de i ncl usi n cont i enen def i ni ci ones y decl ar aci ones que
pueden ser i ncor por ados en un pr ogr ama espec f i co que as l o r equi er a.

Par a l l amar un ar chi vo de i ncl usi n o cabecer a es necesar i o hacer uso
de l a di r ect i va #include l a cul t i ene el si gui ent e f or mat o:

#i ncl ude nombr e_de_ar chi vo_cabecer a


Cur so de Lenguaj e C - Por : I ng. Ani bal Mar t i nez Ar ci a. 11
Donde nombr e_de_ar chi vo_cabecer a es el nombr e de un ar chi vo que
cont i ene l as decl ar aci ones y def i ni ci ones par a un pr opsi t o
espec f i co. Est e ar chi vo se di st i ngue por t ener l a ext enci n . h.

El nombr e_de_ar chi vo_cabecer a se debe encer r ar ent r e comi l l as ( " " ) o
si gnos menor y mayor que ( < >) .

Ej empl o:
#i ncl ude " st di o. h"
#i ncl ude <st di o. h>

Las comi l l as l e di cen a C que busque pr i mer o en el di r ect or i o de
t r abaj o act ual el ar chi vo de i ncl usi n, si no l o encuent r a, busca
ent onces en el di r ect or i o especi f i cado en l a l i nea de or denes, y
f i nal ment e si an no l o ha encont r ado, ent onces busca en el di r ect or i o
st andar d que se hal l a def i ni do dur ant e l a i nst al aci n.

Si el ar chi vo de i ncl usi n se enci er r a ent r e si gnos menor y mayor qu,
el compi l ador busca pr i mer o en el di r ect or i o especi f i cado en l a l i nea
de or denes. si no l o encuent r a busca ent onces en el di r ect or i o
st andar d. J ams busca en el di r ect or i o de t r abaj o.

S en l a i ncl usi n se especi f i ca nombr e de r ut a o cami no, ent onces
busca en di cho di r ect or i o.



Ej empl o :
#i ncl ude " c: \ caber cer a\ st di o. h"
#i ncl ude <c: \ i ncl ude\ ct ype. h>

Dent r o de un ar chi vo cabecer a se pueden t ener ot r os #i ncl ude ani dados.

ENTRADA Y SALIDA DE CONSOLA

Par a el uso de est as f unci ones es necesar i o i ncl ui r el ar chi vo
" st di o. h" .

Funci n get char ( ) : Lee un car act er desde el t ecl ado; esper a por
el r et or no de car r o.
Funci n get che( ) : Lee un car act er del t ecl ado; no esper a por
r et or no de car r o.
Funci n get ch( ) : Le un car act er del t ecl ado, no hace eco y
no esper a por r et or no de car r o.
Funci n put char ( ) : Escr i be un car act er en l a pant al l a.
Funci n get s( ) : Lee una cadena desde el t ecl ado.
Funci n put s( ) : Escr i be una cadena en l a pant al l a.
Funci n cpr i nt f ( ) : Escr i be car act er f or mat eado.
Funci on kbhi t ( ) : Esper a por l a pul saci n de una t ecl a.
Funci n f get s( ) : Lee una cadena de t amao espec f i co y l a
al macena en una var i abl e.

Cur so de Lenguaj e C - Por : Ani bal Mar t i nez Ar ci a. 12
Funci n f put s( ) : Funci n cont r ar i a a f get s( ) .



Ej empl o:
#i ncl ude " st di o. h"
mai n( )
{
char ch;

pr i nt f ( " Di gi t a un car act er : " ) ; ch=get che( ) ;
pr i nt f ( " %c\ n" , t oupper ( ch) ) ;
}

SENTENCIAS DE CONTROL

La sent enci a i f ( ) / ?:

For mat o:
i f ( <expL>) sent enci a;
[ el se sent enci a; ]

Cuando se desea ej ecut ar un gr upo de i nst r ucci ones en un i f ( ) es
necesar i o f or mar un bl oque usando l l aves.

Ej empl o:
i f ( <expL>) {
sent enci a_1;
sent enci a_2;
.
.
sent enci a_n;
}
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
i f ( <expL>)
sent enci a;
el se {
sent enci a_1;
sent enci a_2;
.
.
sent enci a_n;
}
- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
i f ( <expL>) {
sent enci a_1;
.
.
sent enci a_n;
}
el se {

Cur so de Lenguaj e C - Por : I ng. Ani bal Mar t i nez Ar ci a. 13
sent enci a_1;
.
.
sent enci a_n;
}



?: For mat o:
( <expL>) ? <exp1> : <exp2>
<expL> : Es l a condi ci n a ser eval uada.
<exp1> : Se ej ecut a si <expL> es ver dader a.
<exp2> : Se ej ecut a si <expL> es f al sa.

Cur so de Lenguaj e C - Por : Ani bal Mar t i nez Ar ci a. 14
Ej empl o:
z = ( a > b) ? a : b;
m= ( mes > 6) ? 8 : 2;

#i ncl ude " st di o. h"
mai n( ) / * convi er t e l et r a a t i po cont r ar i o */
{
char ch;

put s( " Di gi t a un car act er : " ) ; ch=get che( ) ;
pr i nt f ( " %c\ n" , ( i sl ower ( ch) ? t oupper ( ch) : t ol ower ( ch) ) ;
}

i f ( ) el se i f ( )

i f ( <expL>)
sent enci a;
el se i f ( <expL>)
sent enci a;
el se i f ( <expL>)
sent enci a;
.
.
.
el se
sent enci a;

LA EXPRESION CONDICIONAL

Cuando el r esul t ado de una condi ci n es ver dader o su val or es uno y
cundo st e es f al so su val or es cer o. De est a maner a una expr esi n
condi ci onal podr a t ener el si gui ent e aspect o:

i f ( co)
sent enci a;
el se
sent enci a;

co ser eval uado como ver dader o si su val or es di f er ent e de cer o, de
l o cont r ar i o ser f al so.

Ej empl o:

mai n( )
{
i nt i
pr i nt f ( " Numer o ent er o : " ) ; scanf ( " %d" , &i ) ;
i f ( i )
pr i nt f ( " %d\ n" , i / 2) ;
el se
pr i nt f ( " No puedo di vi di r por cer o\ n" ) ;

Cur so de Lenguaj e C - Por : I ng. Ani bal Mar t i nez Ar ci a. 15
}

LA SENTENCIA switch()

Sel eci ona ent r e var i as al t er nat i vas dependi endo del val or de una
var i abl e.
For mat o:
swi t ch( <var >) {
case const ant e_1:
secuenci a_de_sent enci as
br eak;

case const ant e_2:
secuenci a_de_sent enci as
br eak;
.
.
.
def aul t :
secuenci a_de_sent enci as
}

Ej empl o:


SENTENCIAS switch() ANIDADAS

Se pueden ani dar sent enci as switch() con el f i n de i mpl ement ar r ut i nas
donde l as opci ones t i enen subdi vi si ones.

BUCLES

EL BUCLE for()

For mat o:
f or ( i ni ci al i zaci n; <expL>; var i aci n) sent enci a;

i ni ci al i zaci n : Es nor mal ment e una asi gnaci n par a dar un val or
i ni ci al a l a var i abl e cont r ol ador a de ci cl o.

<expL> : La expr esi n l gi ca det er mi na hast a cuando ha de r epet i r el
bucl e.

var i aci n : For ma o maner a en que debe cambi ar l a var i abl e del ci cl o.

Cur so de Lenguaj e C - Por : Ani bal Mar t i nez Ar ci a. 16
Ej empl o: #def i ne MAXN 10
mai n( )
{
i nt i ;

f or ( i =0; i <MAXN; i ++) pr i nt f ( " %d " , i ) ;
}

mai n( )
{
i nt i ;

f or ( i = 10; i > 0; i - - ) pr i nt f ( " %d " , i ) ;
}


mai n( )
{
i nt x;

f or ( x=0; x<10; x +=2) pr i nt f ( " %d " , x) ;
}


mai n( )
{
i nt x, y;

f or ( x=0, y=0; x<10; x++, y++)
pr i nt f ( " x=%d, y=%d\ n" , x, y) ;
}

#i ncl ude <st di o. h>
mai n( )
{
char ch;

f or ( ; ; ) {
pr i nt f ( Di gi t a un car act er : " ) ; ch=get che( ) ;
i f ( ch==' $' ) br eak; / * r ompe el ci cl o */
}
}


mai n( )
{
i nt x;

f or ( x=0; x ! = 100; ) {
pr i nt f ( " I nt r oduce un nmer o 100 par a sal i r " ) ;
scanf ( " %d" , &x) ;

Cur so de Lenguaj e C - Por : I ng. Ani bal Mar t i nez Ar ci a. 17
}
}


#i ncl ude <st di o. h>
#i ncl ude <ct ype. h>
mai n( )
{
i nt i , j , r esp;
char done = ' ' ;

f or ( i =1; i <=100 && done ! = ' N' ; i ++) {
f or ( j =1; j <=10; j ++) {
pr i nt f ( " Cunt o es %d + %d ?" , i , j ) ;
scanf ( " %d" , &r esp) ;
i f ( r esp ! = i +j )
pr i nt f ( " \ nEr r ado\ n" ) ;
el se
pr i nt f ( " \ nOk\ n" ) ;
}
pr i nt f ( " Si gue ( S/ N) ? " ) ;
done = t oupper ( get che( ) ) ;
}
}

BUCLES for() SIN CUERPO

Un bucl e si n cuer po consi st e en col ocar en el si t i o donde v l a
sent enci a un punt o y coma.

Ej empl o:
f or ( t =0; t <NMAX; ++t )
;

EL BUCLE while()

Desar r ol l a un ci cl o mi ent r as una condi ci n sea ver dader a.

For mat o: whi l e ( <expL>) sent enci a;

Ej empl o:
#def i ne FI N ' *'
#i ncl ude <st di o. h>

mai n( )
{
char ch = ' \ 0' ;
whi l e( ch ! = FI N) ch=get che( ) ;
}

#i ncl ude " st di o. h"

Cur so de Lenguaj e C - Por : Ani bal Mar t i nez Ar ci a. 18

mai n( )
{
i nt c;

whi l e( ( c=get char ( ) ) ! = EOF)
put char ( c) ;
}
#i ncl ude " st di o. h"

mai n( )
{
i nt c, nc=1;

pr i nt f ( " %4d : " , nc) ;
whi l e( ( c=get char ( ) ) ! = EOF) {
i f ( c == ' \ n' ) {
++nc;
put char ( c) ;
pr i nt f ( " %4d : " , nc) ;

} el se
put char ( c) ;
}
}

EL BUCLE do/while()

Ej ecut a un gr upo de i nst r ucci ones al menos una vez mi nt r as se cumpl a
una condi ci n debi do a que el chequeo de l a condi ci n se l l eva a cabo
al f i nal del bl oque de i nst r ucci ones.

For mat o :
do {
sent enci a;
.
.
.
} whi l e( <expL>) ;

Ej empl o:
#i ncl ude <st di o. h>

mai n( )
{
char opc;

pr i nt f ( " Desea segui r ( S/ N) ? " ) ;

do {
opc=t oupper ( get che( ) ) ;

Cur so de Lenguaj e C - Por : I ng. Ani bal Mar t i nez Ar ci a. 19
} whi l e( opc ! = ' S' && opc ! = ' N' ) ;
}

LA SENTENCIA continue

continue : obl i ga a ej ecut ar l a si gui ent e i t er aci n y sal t a
cual qui er cdi go ent r e medi as.

Ej empl o:
mai n( ) / * i mpr i me nr os. par es */
{
i nt x;

f or ( x=1; x<100; x++)
i f ( x%2)
cont i nue;
pr i nt f ( " %d\ n" , x) ;
}

ETIQUETAS y goto

Una et i quet a es un nombr e de i dent i f i cador vl i do par a C que t er mi na
en dos punt os ( : ) .

Una et i quet a debe est ar en l a mi sma f unci n donde est el got o que l a
ut i l i za.

Ej empl o:

l oop:
x++;
i f ( x<100) got o l oop;


got o puede ser apr opi ado cuando se desea sal i r de var i os ni vel es de
ani daci n.


ARRAYS Y CADENAS

Ar r ays uni di mensi onal es:

For mat o: t i po nombr e_ar r ay[ <expN>] [ , nombr e_ar r ay[ <expN>] , . . . ] ;

Los ndi ces de l os ar r ays deben ar r ancar desde cer o ( 0) y que el
pr i mer el ement o comi enza en esa posi ci n.

Ej empl o: #def i ne N 10
mai n( )
{
i nt i , t em, j =N- 1, a[ N] ;

Cur so de Lenguaj e C - Por : Ani bal Mar t i nez Ar ci a. 20

f or ( i =0; i <N; ++i )
a[ i ] = i ;

f or ( i =0; i < N/ 2; i ++, j - - ) {
t em = a[ i ] ;
a[ i ] = a[ j ] ;
a[ j ] = t em;
}
f or ( i =0; i <N; i ++)
pr i nt f ( " %d " , a[ i ] ) ;
}
Nota: El l enguaj e C no har compr obaci ones de cont or nos en l os ar r ays
por l o t ant o es r eponsabi l i dad del pr ogr amador el manej o
adecuado de l os ar r egl os evi t ando el desbor dami ent o de l os
mi smos escr i bi endo o l eyendo f uer a de l os l i mi t es.

CADENAS O STRING

Una cadena es un ar r egl o de t i po car act er .

Ej empl o:
char nombr e[ 30] ;
/ * decl ar a l a var i abl e nombr e de 30 car act er es */

Toda cadena de car act er es t er mi na en un nul o ' \ 0' .

Ej empl o:
#def i ne TM 5
#i ncl ude " st di o. h"

mai n( )
{
char s[ TM] ;
put s( " Escr i be hol a" ) ;
get s( s) ;
pr i nt f ( " %s\ n" , s) ;
}

La cadena s quedar as en memor i a:


/ * convi er t e una cadena en mayscul a */
#i ncl ude <st di o. h>
#i ncl ude <ct ype. h>

mai n( )
{
char st r i ng[ 80] ;

Cur so de Lenguaj e C - Por : I ng. Ani bal Mar t i nez Ar ci a. 21
i nt i ;

pr i nt f ( " I nt r oduce una f r ase en mi nscul a : " ) ;
get s( st r i ng) ;

f or ( i =0; st r i ng[ i ] ; i ++)
cpr i nt f ( " %c" , t oupper ( st r i ng[ i ] ) ) ;
}


Cur so de Lenguaj e C - Por : Ani bal Mar t i nez Ar ci a. 22

#i ncl ude " st di o. h"

mai n( )
{
char s[ 80] ;
i nt i ;

pr i nt f ( " Escr i be una f r ase : " ) ; get s( s) ;

f or ( i =0; s[ i ] ; i ++)
pr i nt f ( " %c" , ( s[ i ] == ' ' ) ? ' \ n' : s[ i ] ) ;
}


FUNCIONES DE CADENA DE LA BIBLIOTECA

Est as f unci ones se hal l an def i ni das en el ar chi vo " st r i ng. h" .


st r cpy( ) : Copi a el cont eni do de l a cadena or i gen en l a cadena dest i no.

For mat o : st r cpy( dest i no, or i gen) ;

Ej empl o:
#i ncl ude " st r i ng. h"
mai n( )
{
char a[ 80] ;

st r cpy( a, " hol a mundo" ) ;
pr i nt f ( " %s\ n" , a) ;
}

st r cat ( ) : Concat ena dos cadenas.

For mat o : st r cat ( cadena1, cadena2) ;

Concat ena l a cadena2 al f i nal de l a cadena1.

Ej empl o:
#i ncl ude <st r i ng. h>
#i ncl ude <st di o. h>

mai n( )
{
char a1[ 80] , a2[ 40] ;

st r cpy( a1, " car t agena" ) ;
st r cpy( a2, " col ombi a" ) ;
st r cat ( a1, a2) ;

Cur so de Lenguaj e C - Por : I ng. Ani bal Mar t i nez Ar ci a. 23

put s( a1) ;
}
st r cmp( ) : Compar a dos cadenas y devuel ve cer o si son i gual es.

For mat o : st r cmp( cadena1, cadena2) ;

Si cadena1 es mayor que cadena2 devuel ve un val or mayor que cer o.
Si cadena1 es menor que cadena2 devuel ve un val or negat i vo.

Ej empl o:
#i ncl ude <st r i ng. h>
#i ncl ude <st di o. h>

mai n( )
{
char s[ 80] ;

put s( " Passwor d : " ) ; get s( s) ;
i f ( ( st r cmp( s, " pass" ) ) == 0)
put s( " Ok. . . " ) ;
el se {
put s( " Passwor d equi vocado" ) ;
exi t ( 0) ;
}
}

st r l en( ) : Devuel ve l a l ongi t ud de una cadena.

For mat o : st r l en( cadena) ;

Ej empl o :
#i ncl ude <st r i ng. h>
#i ncl ude <st di o. h>
mai n( )
{
i nt s[ 80] ;

st r cpy( s, " Hel l o. . . " ) ;
pr i nt f ( " %d\ n" , st r l en( s) ) ;
get che( ) ;
}

st r chr ( )
st r st r ( ) : Ver su f unci onal i dad l uego de haber t r at ado el t ema de
punt er os.




FUNCIONES DE CARACTER

Cur so de Lenguaj e C - Por : Ani bal Mar t i nez Ar ci a. 24

Las f unci ones de car act er hacen uso de el ar chi vo cabecer a " ct ype. h" .

i sal num( ) Devuel ve di f er ent e de cer o ( 0) si el car act er es una
l et r a o un d gi t o.

For mat o : i sal num( ch) ;
Ej empl o :
#i ncl ude <st di o. h>
#i ncl ude <ct ype. h>

mai n( )
{
char ch;

f or ( ; ; ) {
ch=get che( ) ;
i f ( ch==' ' )
br eak;
i f ( i sal num( ch) ) pr i nt f ( " %c\ n" , ch) ;
}
}

i scnt r l ( ) : Devuel ve di f er ent e de cer o ( 0) si el car act er es un
car act er de cont r ol . Los car act er es de cont r ol est an
compr endi dos ent r e 0 . . . 0x1F y 0x7F ( DEL) .

For mat o : i scnt r l ( ch) ;

Ej empl o : #i ncl ude <ct ype. h>
#i ncl ude <st di o. h>

mai n( )
{
char ch;

f or ( ; ; ) {
ch=get che( ) ;
i f ( ch==' ' )
br eak;
i f ( i scnt r l ( ch) ) pr i nt f ( " %c\ n" ) ;
}
}

i sdi gi t ( ) : Devuel ve di f er ent e de cer o ( 0) si el car act er es un
d gi t o.

For mat o : i sdi gi t ( ch) ;

Ej empl o :
#i ncl ude <ct ype. h>

Cur so de Lenguaj e C - Por : I ng. Ani bal Mar t i nez Ar ci a. 25
#i ncl ude <st di o. h>

mai n( )
{
char ch;

f or ( ; ; ) {
ch=get che( ) ;
i f ( ch==' ' )
br eak;
i f ( i sdi gi t ( ch) )
pr i nt f ( " %c\ n" , ch) ;
}
}

i sgr aph( ) : Devuel ve di f er ent e de cer o si el car act er es i mpr i mi bl e y
di st i nt o de espaci o.

For mat o : i sgr aph( ch) ;

i sl ower ( ) : Devuel ve di f er ent e de cer o si se t r at a de un car act er
mi nscul a.

For mat o : i sl ower ( ch) ;

i supper ( ) : Devuel ve di f er ent e de cer o si el car act er es mayscul a.

For mat o : i supper ( ch) ;

i spr i nt ( ) : Devuel ve di f er ent e de cer o si el car act er es i mpr i mi bl e
i ncl uyendo el espaci o.

For mat o : i spr i nt ( ch) ;

i spunct ( ) : Devuel ve di f er ent e de cer o si el car act er es un car act er de
punt uaci n. Nos r ef er i mos a un car act er de punt uaci n como t odos
aquel l os di f er ent es de l os al f abt i cos y numr i cos.

For mat o : i spunt ( ch) ;

i sspace( ) : Devuel ve di f er ent e de cer o si el car act er es un espaci o.

For mat o : i sspace( ch) ;

Ej empl o :
#i ncl ude <ct ype. h>
#i ncl ude <st di o. h>
#def i ne NMAX 80

mai n( )
{

Cur so de Lenguaj e C - Por : Ani bal Mar t i nez Ar ci a. 26
char s[ NMAX] ;
i nt i ;

pr i nt f ( " I nt r oduce una f r ase : " ) ; get s( s) ;
f or ( i =0; s[ i ] ; ++i )
pr i nt f ( " %c" , ( i sspace( s[ i ] ) ? ' \ n' : s[ i ] ) ;
}

i sxdi gi t ( ) : Devuel ve di f er ent e de cer o si el car act er es un
d gi t o hexadeci mal . Un d gi t o hexadeci mal es:
0 . . . 9 A . . . F, a . . . f .

For mat o : i sxdi gi t ( ch) ;


ARRAYS BIDIMENSIONALES

For mat o : t i po nombr e_ar r ay[ nr o_f i l as] [ nr o_col ] ;

Ej empl o : i nt a[ 2] [ 4] ;

Def i ne un ar r egl o con l a si gui ent e est r uct ur a:

0 1 2 3


Haci endo uso de l a si gui ent e f r mul a podemos aver i guar el nmer o de
byt es de memor i a usados por un ar r ay:

byt es = f i l as * col umnas * si zeof ( t i po_de_dat os)

Ej empl o : 2 * 10 * 2 = 40 byt es

Ej empl o :
#def i ne NMAX 4

mai n( )
{
i nt a[ NMAX] [ NMAX] , i , x;

f or ( i =0; i <NMAX; i ++)
f or ( x=0; x<NMAX; x++)
a[ i ] [ x] = i * x;
f or ( i =0; i <NMAX; ++i )
pr i nt f ( " %d " , a[ i ] [ i ] ) ;
}

Cur so de Lenguaj e C - Por : I ng. Ani bal Mar t i nez Ar ci a. 27
ARRAYS DE CADENAS

Ej empl o : char l i neas[ 30] [ 80] ;

Def i ne un ar r ay de 30 cadenas cada una con un mxi mo de 80 car act er es.

Par a acceder a una cadena i ndi vi dual ment e, se especi f i ca el i ndi ce de
l a f i l a.

Ej empl o : get s( l i neas[ 0] ) ;


ARRAYS DE MULTIPLES DIMENSIONES

For mat o : t i po nombr e_ar r ay[ <expN1>] [ <expN2>] [ expN3>] . . . [ expNn>] ;

Ej empl o : i nt a[ 2] [ 3] [ 3] ;


INICIALIZACION DE ARRAYS

En lenguaje C se pueden i ni ci al i zar ar r ays gl obal es.
Par a i ni ci al i zar un ar r ay l ocal , es necesar i o decl ar ar l o como static.

For mat o :

especi f i cador de t i po nombr e_de_ar r ay[ <expN1>] . . . [ <expNn>] = {
l i st a_de_val or es};

l i st a_de_val or es : Es una l i st a de const ant es que son del t i po
compat i bl e con el t i po base del ar r ay separ ada por comas.

Ej empl o : i nt i [ 10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

Los ar r ays de cadenas per mi t en ser i ni ci al i zados segn el si gui ent e
f or mat o:

char nombr e_de_ar r ay[ <expN>] = " cadena" ;
Ej empl o : char st r [ 6] = " hol a" ;

char st r 1[ 6] = {' h' , ' o' , ' l ' , ' a' , ' \ 0' };

Ej empl o : i nt pad[ 10] [ 2] = {
1, 1,
2, 4,
3, 5,
6, 4,
8, 9,
1, 0,
4, 6,
7, 6,

Cur so de Lenguaj e C - Por : Ani bal Mar t i nez Ar ci a. 28
8, 5,
0, 3
};

INICIALIZACION DE ARRAYS SIN TAMAO

Ej empl os :

char e1[ ] = " Er r or de l ect ur a" ;
char e2[ ] = " Ar chi vo no hal l ado" ;
char e3[ ] = " Dat os no di sponi bl es" ;

Se puede ver i f i car el t amao en byt es de cual qui er a de l as ant er i or es
cadenas as :

pr i nt f ( " %s t i ene %d car act er es\ n" , e1, si zeof ( e1) ) ;

Par a ar r ays mul t i di mensi onal es se deben especi f i car t odas l as
di mensi ones except o l a de ms a l a i zqui er da.

Ej empl o : i nt dat os[ ] [ 2] = {
1, 3,
5, 6,
7, 4,
9, 1,
0, 8,
4, 0,
5, 8
};


MODOS DE ALMACENAMIENTO ( ESPECI FI CADORES DE ALMACENAMI ENTO)

For mat o: especi f i cador t i po_name

Variables Automticas: Toda var i abl e decl ar ada dent r o de una ( aut o)
f unci n por def ect o es aut omt i ca.
Si se desea dej ar cl ar a l a i nt enci n se empl ea l a pal abr a auto al
f r ent e de l a decl ar aci n de var i abl e. Toda var i abl e l ocal es
aut omt i ca. Cundo no se especi f ca ni nguna cl ase de al macenami ent o,
se supone que l a var i abl e es aut omt i ca.

Ej empl o:
mai n( )
{
aut o i nt a, b;
aut o char ch;
aut o f l oat f = 4. 5;
}



Cur so de Lenguaj e C - Por : I ng. Ani bal Mar t i nez Ar ci a. 29
Variables Estticas : Son var i abl es l ocal es a l a f unci n o bl oque
donde f uer on decl ar adas . La di f er enci a r adi ca en que sus val or es
per si st en ent r e l l amadas, de t al maner a que encont r ar emos en el l as
cada vez que ent r emos al bl oque o f unci n, el l t i mo val or al macenado,
l a l t i ma vez que se l l am l a f unci n.
Las var i abl es est t i cas que no se i ni ci al i zan, cont i enen un val or 0 l a
pr i mer a vez, o nul o si es t i po char .
Nor mal ment e l as var i abl es que cont i enen val or es f i j os par a una
det er mi nada f unci n, se decl ar an y se i ni ci al i zan static.



Ej empl o
mai n( )
{
cuent a( ) ;
cuent a( ) ;
cuent a( ) ;
}

cuent a( )
{
st at i c i nt x=0;
pr i nt f ( " %d\ n" , x) ;
x++;
}

Variables Externas: Las var i abl es que se decl ar an f uer a de una
( ext er n) f unci n son consi der adas ext er nas, per o adems se pueden
decl ar ar var i abl es ext er nas dent r o de una f unci n que l a empl ea
ut i l i zando l a pal abr a extern. Cuando una var i abl e es decl ar ada en
ar chi vos di f er ent es t ambi n se puede decl ar ar extern par a i ndi car que
y esa var i abl e f ue decl ar ada en el pr i mer ar chi vo. Las var i abl es
ext er n son el medi o par a est abl ecer comuni caci n ent r e mdul os
compi l ados separ adament e.

Ej empl o:
i nt a=4;
mai n( )
{
pr i nt f ( " %d\ n" , a) ;
f unc( ) ;
}
f unc( )
{
pr i nt f ( " %d\ n" , a) ;
}


ext er n i nt x;
mai n( )

Cur so de Lenguaj e C - Por : Ani bal Mar t i nez Ar ci a. 30
{
ext er n i nt x;
.
}


Ej empl o:

i nt i ; / * var i abl es ext er nas */
char ch;
mai n( )
{
ext er n i nt i ; / * f ue decl ar ada ext er n */
aut o char ch; / *no es ch ext er n */

Ej empl o:
i nt i ;
mai n( )
{
i nt i ;
.
.
.
}

ot r a( )
{
aut o i nt i ;
}

Variables registro: Son var i abl es que se al macenan en r egi st r os de
C. P. U por l o t ant o ser n r pi das a di f er enci a de var i abl es
al macenadas en memor i a.

No debemos decl ar ar demasi adas var i abl es r egi st r o par a evi t ar que el
compi l ador nos col oque l as que no puedan al macenar se en C. P. U en
memor i a como cual qui er ot r a var i abl e.
Nunca debe t omar l a di r ecci n de una var i abl e register r ecuer de que
r esi den en r egi st r os de l a C. P. U y no en RAM. Las var i abl es r egi st er
son si empr e ent er as.

Ej empl o:
mai n( )
{
r egi st er i nt a, b;
.
.
.
}



Cur so de Lenguaj e C - Por : I ng. Ani bal Mar t i nez Ar ci a. 31

Ej empl o:

mai n( )
{
r egi st er i nt i _r pi da;
.
.
.
}

MODIFICADORES DE ACCESO

For mat o: modi f i cador t i po var _name;

CONST : Son var i abl es que no pueden ser cambi adas por el pr ogr ama
dur ant e l a ej ecuci n.
Es posi bl e dar l es un val or i ni ci al .

Ej empl o:

Const f l oat f =48. 5

FUNCIONES

Una f unci n se puede def i ni r como un subpr ogr ama l a cul nos per mi t e
descomponer un pr ogr ama en sus m ni mos component es.

Par a def i ni r una f unci n se debe hacer uso de un i dent i f i cador de t i po
vl i do con el cul dar emos nombr e a l a f unci n, l uego se deben col ocar
dent r o de par ent esi s l os ar gument os si es que exi st en. Cuando l os
ar gument os no exi st en l os par ent esi s deben quedar vac os. Debemos
r ecor dar que l os ar gument os deben def i ni r se del t i po de dat os vl i dos
que se ha pasado a l a f unci n.

For mat o de una f unci n:
t i po_de_f unci n nombr e_f unci n( l i st a_de_ar gument os) ;
decl ar aci n de ar gument os_o_par met r os;
{
cuer po_de_l a_f unci n
}

Por def ect o t oda f unci n devuel ve un val or ent er o a menos que se
especi f i que ot r a cosa.

SALIENDO DE UNA FUNCION

Exi st en dos f or mas de sal i r de una f unci n:
1. Al encont r ar l a l t i ma l l ave que ci er r a l a f unci n.
2. Haci endo uso de l a sent enci a return.


Cur so de Lenguaj e C - Por : Ani bal Mar t i nez Ar ci a. 32
Cuando una f unci n encuent r a l a l t i ma l l ave de l a mi sma o cuando
encuent r a una sent enci a return aut omt i cament e t er mi na l a ej ecuci n.

LA SENTENCIA return

return puede t er mi nar una f unci n si n r et or nar ni ngn val or . En caso
de que l a f unci n devuel va al gn val or , l a expr esi n o el val or debe
ser col ocado al f r ent e de return.



LLAMANDO A UNA FUNCION

Par a l l amar a una f unci n se escr i be en si t i o adecuado el nombr e de l a
f unci n segui do de par ent esi s abi er t o y cer r ado. Si se pasan
par met r os, est os deben col ocar se dent r o de l os par ent esi s separ ados
por coma.

Ej empl o:
mai n( )
{
i nt a = 10, b = 20;

pr i nt f ( " suma de a + b = %d\ n" , suma( a, b) ) ;
}

suma( x, y)
i nt x, y;
{
r et ur n( x + y) ;
}

Ej empl o :

mai n( )
{
i nt a = 10, b = 20;

pr i nt f ( " %d\ n" , max( a, b) ) ;
}

max( x, y)
i nt x, y;
{
r et ur n( ( x > y) ? x : y) ;
}

Ej empl o:

mai n( )
{

Cur so de Lenguaj e C - Por : I ng. Ani bal Mar t i nez Ar ci a. 33
i nt x=10;

i mpr i me_cadena( x) ;
}

i mpr i me_cadena( n) ;
i nt n;
{
i nt i ;

f or ( i =0; i <n; ++i )
pr i nt f ( " %c" , 45) ;
}




PARAMETROS POR VALOR

Se l e conoce como paso de par met r os por val or al hecho de envi ar
val or es a una f unci n, est os val or es ser n r eci bi dos en var i abl es
t empor al es de t al maner a que si se l l evan a cabo modi f i caci ones, l os
cambi os no se r ef l ej ar an en l as var i abl es or i gi nal es.

Ej empl o:

mai n( )
{
pr i nt f ( " %d\ n" , power ( 4, 2) ) ;
}

power ( n, x)
i nt n, x;
{
i nt p;

f or ( p=1; x>0; x- - )
p *= n;
r et ur n( p) ;
}

/ * f unci on xt ol ower ( ) */

xt ol ower ( s)
char ch;
{
i f ( s > 65 && s < 91)
s += 32;
r et ur n( s) ;
}


Cur so de Lenguaj e C - Por : Ani bal Mar t i nez Ar ci a. 34

AMBITO DE LAS VARIABLES

Una var i abl e puede ser conoci da sol o dent r o de una f unci n especi f ca
l o cul no debe cr ear conf l i ct os con ot r as var i abl es que t i enen el
mi smo nombr e dent r o de ot r as f unci ones.

FUNCIONES Y ARRAYS

Es posi bl e pasar el ement os i ndi vi dual es o un ar r ay compl et o a una
f unci n l o cul se i l ust r ar a cont i nuaci n:

/ *****
*
* ej empl o de una cl asi f i caci on de ar r ay por met odo de shel l
* y busqueda bi nar i a.
*
*****/
#def i ne SALI DA 0
#def i ne MAXNUM 10

i nt l i st a[ MAXNUM] = {1, 5, 4, 2, 8, 3, 9, 10, 7, 6};

mai n( ) / * mai n pr ogr am*/
{
i nt x, a, i ndex;

/ * most r ar val or es del ar r ay en desor eden */
put s( " l i st a desor denada . . . " ) ;
f or ( x = 0; x < MAXNUM; x++)
pr i nt f ( " %d " , l i st a[ x] ) ;
cpr i nt f ( " %c" , ' \ n' ) ;

shel l ( l i st a, MAXNUM) ; / * cl asi f i car l i st a */

/ * most r ar val or es del ar r ay ya or denados */
put s( " l i st a or denada . . . " ) ;
f or ( x = 0; x < MAXNUM; x++)
pr i nt f ( " %d " , l i st a[ x] ) ;
cpr i nt f ( " %c" , ' \ n' ) ;

/ * buscar un val or dado en el ar r ay l i st a hast a SALI DA */
put s( " \ nval or a buscar " ) ;
scanf ( " %d" , &a) ;
whi l e( a ! = SALI DA) {
i ndex = bi nar y( a, l i st a, MAXNUM) ;
pr i nt f ( " \ n%d\ n" , ( i ndex ! = - 1) ? l i st a[ i ndex] : i ndex) ;
scanf ( " %d" , &a) ;
}

} / * end of mai n( ) */

Cur so de Lenguaj e C - Por : I ng. Ani bal Mar t i nez Ar ci a. 35


/ *****
*
* udf shel l ( v, n)
* cl asi f i ca un ar r ay de ent er os por met odo de shel l
*
*****/

shel l ( v, n)
i nt v[ ] , n;
{
i nt gap, i , j , t em;

f or ( gap = n/ 2; gap > 0; gap / = 2)
f or ( i = gap; i < n; ++i )
f or ( j = i - gap; j >=0 && v[ j ] >v[ j + gap] ; j - = gap) {
t em= v[ j ] ;
v[ j ] = v[ j + gap] ;
v[ j + gap] = t em;
}
} / * end of f unct i on shel l */


/ *****
*
* udf bi nar y( x, v, n)
* busqueda bi nar i a
* busca a x en v[ 0] . . . v[ n- 1]
*
*****/

bi nar y( x, v, n)
i nt x, v[ ] , n;
{
i nt l ow, hi gh, mi d;

l ow = 0;
hi gh = n - 1;
whi l e( l ow <= hi gh) {
mi d = ( l ow + hi gh) / 2;
i f ( x < v[ mi d] )
hi gh = mi d - 1;
el se i f ( x > v[ mi d] )
l ow = mi d + 1;
el se
r et ur n( mi d) ; / * l o encont r o */
}
r et ur n( - 1) ; / * x no f ue hal l ado */

} / * end of f unct i on bi nar y( ) */

Cur so de Lenguaj e C - Por : Ani bal Mar t i nez Ar ci a. 36

val ( s)
char s[ ] ;
{
i nt i , n;

n = 0;
f or ( i = 0; s[ i ] >= ' 0' && s[ i ] <= ' 9' ; ++i )
n = 10 * n + s[ i ] - ' 0' ;
r et ur n( n) ;
}

FUNCIONES QUE DEVUELVEN VALORES NO ENTEROS

Par a cr ear f unci ones que devuel ven val or es no ent er os, se deben t ener
en cuent a l os dos si gui ent es pasos:
1. Se debe especi f i car el t i po de f unci n.
2. Se i dent i f i ca el t i po de f unci n ant es del pr i mer l l amado.

For mat o:
t i po nombr e_de_f unci n( ) ;


Ej empl o:

f l oat suma( ) ; / * i dent i f i camos l a f unci n */
mai n( )
{
f l oat a, b;
a=35. 8; b=56. 5;
pr i nt f ( " %f " , suma( a, b) ) ;
}

f l oat suma( x, y)
f l oat x, y;
{
r et ur n( x + y) ;
}


FUNCIONES DE TIPO void

Una f unci n se decl ar a de t i po void par a evi t ar que l a mi sma devuel va
al gn val or .

Ej empl o:
voi d i mpr i me_col ( s)
char s[ ] ;
{
i nt i ;
f or ( i =0; s[ i ] ; ++i )

Cur so de Lenguaj e C - Por : I ng. Ani bal Mar t i nez Ar ci a. 37
pr i nt f ( " %c\ n" , s[ i ] ) ;
}
PROTOTIPOS DE FUNCION

Se l e conoce con el nombr e de pr ot ot i pos de f unci n al hecho de
decl ar ar el nmer o y t i po de par met r os en una f unci n.

Al hacer uso de l os pr ot ot i pos de f unci n, se habi l i t a al lenguaje C
par a que haga una compr obaci n r i gur osa.

Not a : No son par t e del or i gi nal UNI X.



PUNTEROS

Son var i abl es que cont i enen l a di r ecci n de memor i a de ot r a var i abl e.

Ej empl o:

Local i zaci n de memor i a Var i abl e
+- - - - - - - +
1000 - - - - - - - - - - - - - - - - - - - - > | 003 | - - +
+- - - - - - - + |
1001 - - - - - - - - - - - - - - - - - - - - > | | |
+- - - - - - - + |
1002 - - - - - - - - - - - - - - - - - - - - > | | |
+- - - - - - - + |
1003 - - - - - - - - - - - - - - - - - - - - > | | <- +
+- - - - - - - +
1004 - - - - - - - - - - - - - - - - - - - - > | |
+- - - - - - - +
1005 - - - - - - - - - - - - - - - - - - - - > | |
+- - - - - - - +

MEMORI A

For mat o:
t i po *nombr e_de_var i abl e;

Ej empl o:
i nt *m;
char *ch;


OPERADORES DE PUNTERO

*, &

El si gno ( &) i ndi ca l a di r ecci n de memor i a apunt ada.
El si gno ( *) i ndi ca el val or cont eni do en l a di r ecci n apunt ada.

Cur so de Lenguaj e C - Por : Ani bal Mar t i nez Ar ci a. 38

IMPORTANCIA DEL TIPO BASE DE UN PUNTERO

Es i mpor t ant e t ener en cuent a el t i po base par a def i ni r un punt er o y
que de acuer do a el l o en un i ncr ement o o decr ement o det er mi na el
nmer o de posi ci ones a avanzar o r et r oceder .

Un punt er o sl o per mi t e oper aci ones de suma y r est a.

Ej empl o:
/ * sumando a un punt er o */
mai n( )
{
i nt ar r 1[ 5] , *p1, i ;
f l oat ar r 2[ 5] , *p2;

f or ( i = 0; i < 5; i ++) {
ar r 1[ i ] = i ;
ar r 2[ i ] = i ;
}
p1 = ar r 1;
p2 = ar r 2;
f or ( i = 0; i < 5; i ++)
pr i nt f ( " val or punt er os + %d = %u %u\ n" , i , p1+i , p2+i ) ;
}

El r esul t ado del ant er i or pr ogr ama podr i a ser :

val or punt er os + 0 = 2708 2720
val or punt er os + 1 = 2710 2724
val or punt er os + 2 = 2712 2728
val or punt er os + 3 = 2714 2732
val or punt er os + 4 = 2716 2736

est o se debe a que cada punt er o int es de dos byt es y cada punt er o
float es de cuat r o byt es y al sumar l e una uni dad, si mpl ement e
di r ecci ona l a posi ci n de comi enzo del pr xi mo el ement o de su t i po en
l a memor i a.

ARITMETICA DE PUNTEROS

Ant er i or ment e se di j o que l as ni cas oper aci ones ar i t mt i cas que se
pueden l l evar a cabo son suma y r est a.

Si se ha def i ni do pt como punt er o, pt ++ ++pt hace que pt apunt e al
si gui ent e el ement o y pt += i hace que pt apunt e al i - esi mo el ement o.
Si pt apunt a al a[ 0]
*( pt +1) se r ef i er e al cont eni do de a[ 1] .

*++pt es equi val ent e a l o ant er i or .


Cur so de Lenguaj e C - Por : I ng. Ani bal Mar t i nez Ar ci a. 39
a + 2 == &a[ 2] / * se t r at a de l a mi sma di r ecci n */
*( a + 2) == a[ 2] / * se t r at a del mi smo val or */

*( a + 2) / * t er cer el ement o de a */
*a + 2 / * suma 2 al val or del pr i mer el ement o */

OPERACIONES QUE SE PUDEN REALIZAR CON PUNTEROS

1. ASIGNACION. Se puede asi gnar una di r ecci n de memor i a a un
punt er o. Comunment e se usa con el nombr e de un ar r ay o con el
si gno &.


2. ACCEDER AL VALOR GUARDADO EN UNA DIRECCION DE MEMORIA. El
oper ador * devuel ve el val or al macenado en una posi ci n de memor i a
apunt ada.

3. SE PUEDE OBTENER DIRECCION DE UN PUNTERO. Es posi bl e obt ener l a
di r ecci n de memor i a de un punt er o. Con el oper ador & podemos
hal l ar l a di r ecci n de un punt er o.

4. INCREMENTAR UN PUNTERO. Y sabemos que al i ncr ement ar un
punt er o obt enemos l a di r ecci n del pr xi mo el ement o de su t i po.

5. DECREMENTO. Al decr ement ar un punt er o r et r ocedemos o seal amos a
l a posi ci n de memor i a del ant er i or el ement o de su t i po.

APUNTADORES Y ARGUMENTOS DE FUNCIONES

La ni ca f or ma de pasar a una f unci n par met r os por r ef er enci a, es
haci endo uso de punt er os. Si deseamos que una f unci n l l amada al t er e
l as var i abl es pasadas a el l a, debemos pasar l a di r ecci n de memor i a de
di cha var i abl e.

Ej empl o:

mai n( ) / * demost r aci on de par met r os por r ef er enci a */
{
i nt a = 10, b = 20;

pr i nt f ( " Val or es act ual es de a=%d, b=%d\ n" , a, b) ;
swap( &a, &b) ;
pr i nt f ( " Val or es de a=%d, b=%d despus del l l amado a swap\ n" , a, b) ;

}

/ *****
*
* f unci on swap( )
* i nt er cambi a val or es de var i abl es
*

Cur so de Lenguaj e C - Por : Ani bal Mar t i nez Ar ci a. 40
*****/
swap( x, y)
i nt *x, *y;
{
i nt t em;

t em= *x;
*x = *y;
*y = t em;
}

APUNTADORES Y ARRAYS

Exi st e una est r echa r el aci n ent r e ar r egl os y apunt ador es que es
posi bl e acceder a un ar r egl o medi ant e un i ndi ce o medi ant e un punt er o.
Aunque es ms r pi do acceder a un ar r egl o usando punt er os, puede ser
ms di f ci l de ent ender par a un pr ogr amador i ni ci ado.

A cont i nuaci n most r amos al gunas f or mas de acceder al pr i mer el ement o
de un ar r egl o ver si n punt er o.

i nt a[ 10] , *pt ;

pt = &a[ 0] ; / * copi a en pt l a di r ecci n de memor i a de a[ 0] */

Ot r a f or ma podr i a ser :

pt = a; / * copi a en pt l a di r ecci n de memor i a de a[ 0] */

PASANDO ARRAYS A FUNCIONES

Al pasar un ar r ay a una f unci n, r eal ment e est amos pasando l a
di r ecci n de memor i a del pr i mer el ement o.

Ej empl o:

#def i ne NMAX 10

mai n( ) / * i mpr i me l os val or es de un ar r ay */
{
i nt a[ NMAX] , i ;

f or ( i =0; i <NMAX; i ++)
a[ i ] =i ;
di spl ay( a) ;
}

di spl ay( s)
i nt s[ ] ;
{
i nt j ;

Cur so de Lenguaj e C - Por : I ng. Ani bal Mar t i nez Ar ci a. 41
f or ( j =0; j <NMAX; j ++)
pr i nt f ( " %d " , s[ j ] ) ;
get che( ) ;
}
/ ****
*
* i nvi er t e un ar r ay
*
****/

voi d _ar ever se( ) ;
#i ncl ude " st di o. h"
#def i ne NMAX 4

mai n( )
{
i nt a[ NMAX] , i ;

f or ( i =0; i <NMAX; i ++)
a[ i ] = i ;

_ar ever se( a) ;

f or ( i =0; i <NMAX; i ++)
pr i nt f ( " %d\ n" , a[ i ] ) ;


pr i nt f ( " . . . . . . . . %d\ n" , si zeof ( a) ) ;
get che( ) ;
}

voi d _ar ever se( x)
i nt x[ ] ;
{
i nt j = NMAX / 2, l = NMAX - 1, t , k;

pr i nt f ( " - - - - - - %d\ n" , si zeof ( x) ) ;
f or ( k=0; k<j ; k++, l - - ) {
t =x[ k] ;
x[ k] =x[ l ] ;
x[ l ] =t ;
}
}

i nt medi a( ) ;

mai n( )
{
i nt ar r [ 5] , x;

f or ( x = 0; x < 5; x++)

Cur so de Lenguaj e C - Por : Ani bal Mar t i nez Ar ci a. 42
ar r [ x] = x;
pr i nt f ( " La medi a ar i t met i ca es %d\ n" , medi a( ar r , 5) ) ;
}
/ *****
*
* medi a( ar r ay, n)
*
*****/

i nt medi a( a_vl r s, n)
i nt *a_vl r s, n;
{
i nt i ;
i nt suma;

i f ( n > 0) {
f or ( i = 0, suma = 0; i < n; ++i )
suma += *( a_vl r s + i ) ;
r et ur n( ( i nt ) ( suma / n) ) ;
}
el se {
pr i nt f ( " El ement os no hal l ados\ n" ) ;
r et ur n( 0) ;
}
}

Obser ve que *a_vl r s es un punt er o al pr i mer el ement o del ar r ay y
adems pudo haber se decl ar ado como a_vl r s[ ] .

ARREGLOS DE APUNTADORES

Al hacer una decl ar aci n como l a si gui ent e :

char *l i neas[ MAX_LI NE] ;

se obt i ene un ar r ay de apunt ador es, o cuando hacemos decl ar aci ones
como:

char s[ ] ; char *s;

INICIALIZACION DE ARREGLOS DE APUNTADORES

A cont i nuaci n encont r amos un ej empl o de ar r ays de apunt ador es y su
i ni ci al i zaci n.


Ej empl o :

/ * encont r ando el nombr e del mes a par t i r de su numer o */

char *mont h_name( ) ;

Cur so de Lenguaj e C - Por : I ng. Ani bal Mar t i nez Ar ci a. 43

mai n( )
{
i nt x = 6;

pr i nt f ( " mes de %s\ n" , mont h_name( x) ) ;
}

/ *****
*
* mont h_name( n)
* devuel ve el nombr e del mes
*
*****/

char *mont h_name( n)
i nt n;
{
st at i c char *name[ ] = {
" mes f uer a de r ango" ,
" Ener o" ,
" Febr er o" ,
" Mar zo" ,
" Abr i l " ,
" Mayo" ,
" J uni o" ,
" J ul i o" ,
" Agost o" ,
" Sept i embr e" ,
" Oct ubr e" ,
" Novi embr e" ,
" Di ci embr e"
};
r et ur n( ( n < 1 | | n > 12) ? name[ 0] : name[ n] ) ;
}

APUNTADORES A CARACTERES Y FUNCIONES

Una const ant es de cadena como :

" Hol a mundo. . . "

es un ar r egl o de car act er es a l a cul el compi l ador aade i nt er nament e
el car act er t er mi nador nul o ( \ 0) . De est a maner a es posi bl e que un
pr ogr ama pueda encont r ar el f i nal de l a cadena.

Ej empl o :

mai n( ) / * demost r aci n de apunt ador es a car act er es */
{
char *mensaj e = " est o es una pr ueba" ;

Cur so de Lenguaj e C - Por : Ani bal Mar t i nez Ar ci a. 44

whi l e( *mensaj e)
pr i nt f ( " %c" , *mensaj e++) ;
}
El t amao de una cadena es uno ms que el nmer o de car act er es que
apar ecen ent r e comi l l as.
Si hacemos uso de una f unci n como l a si gui ent e en un pr ogr ama:

pr i nt f ( " El poder del l enguaj e C\ n" ) l

La f unci n printf r eci be un punt er o de t i po car act er al pr i mer
el ement o de l a cadena de car act er es.

Tambi n es posi bl e decl ar ar var i abl es como punt er os a cadenas como:

char *mensaj e;
Luego es posi bl e hacer una asi gnaci n de l a si gui ent e f or ma:

mensaj e = " er r or de e/ s" ;

Recuer de que mensaj e no cont i ene l a copi a de l a cadena, si no que
apunt a al pr i mer car act er de l a cadena. El lenguaje C no t i ene maner a
de mani pul ar cadenas como una ent i dad.

Ej empl os:

mai n( ) / * demost r aci n de apunt ador es a car act er es */
{
char *mensaj e = " est o es una pr ueba" ;

pr i nt f ( " %s\ n" , mensaj e) ;
}


#i ncl ude " st di o. h"
mai n( ) / * ej empl o de st r cpy( ) */
{
char a[ 20] ;

st r cpy( a, " cadena de pr ueba" ) ;
put s( a) ;
}

/ *****
*
* f unci on xst r cpy( )
* copi a cadena or i gen en dest i no
*
*****/

xst r cpy( dest , or i g)

Cur so de Lenguaj e C - Por : I ng. Ani bal Mar t i nez Ar ci a. 45
char *dest , *or i g;
{
whi l e( *dest ++ = *or i g++)
;
}

FUNCIONES DE TIPO PUNTERO

Ot r a de l as posi bi l i dades que t enemos al pr ogr amar en lenguaje C es
hacer uso de f unci ones que devuel ven punt er os.

Ej empl o:

/ *****
*
* STRI NG. C
* devuel ve n car act er es
*
*****/

char *st r i ng( ) ;

mai n( )
{
pr i nt f ( " %s" , st r i ng( ' *' , 5) ) ;
}

/ *****
*
* st r i ng( <expC>, <expN>)
*
*****/

char *st r i ng( ch, n)
char ch;
i nt n;
{
i nt i ;
char x_st r [ 200] ;

f or ( i =0; i <n; ++i )
x_st r [ i ] =ch;

x_st r [ i ] =' \ 0' ;
r et ur n( x_st r ) ;
}

LOS ARGUMENTOS DE main()


Cur so de Lenguaj e C - Por : Ani bal Mar t i nez Ar ci a. 46
La f unci n main() t i ene 3 ar gument os de l os cual es est udi ar emos dos.
Est os ar gument os hacen posi bl e que un pr ogr ama per mi t a ar gument os al
moment o de ej ecut ar l o.

Los dos ar gument o ms i mpor t ant es de main() son argv y argc que
est udi ar emos a cont i nuaci n.

argv : Es un ar r egl o de punt er os de t i po char donde cada uno seal a
al comi enzo de cada ar gument o dado al f r ent e del nombr e de un pr ogr ama
al moment o de ej ecut ar l o.

argc : Es un cont ador de t i po int que nos di ce cunt os ar gument os
f uer on pasados a main().

Ej empl o:

/ * vi sual i za ar gument os */
mai n( ar gc, ar gv)
i nt ar gc;
char *ar gv[ ] ;
{
whi l e( - - ar gc > 0)
pr i nt f ( " %s%c" , *++ar gv, ( ar gc > 1) ? ' ' : ' \ n' ) ;
}

Cur so de Lenguaj e C - Por : I ng. Ani bal Mar t i nez Ar ci a. 47
ASIGNACION DINAMICA DE MEMORIA

malloc y free

mal l oc: Asi gna memor i a del mont cul o

For mat o:
voi d *mal l oc ( unsi gned i nt n)

n : t amao de l a memor i a a asi gnar
Devuel ve el punt er o al pr i mer Byt e.
Si no hay suf i ci ent e memor i a di sponi bl e se pr oduce un f al l o y
devuel ve nul o

Ej empl o:
f l oat *f ;
f =( f l oat *) mal l oc ( si zeof ( f l oat ) ) ;
i f ( ! f ) {
pr i nt f ( " er r or de asi gnaci n \ n" ) ;
exi t ( 1) ;
}


f r ee: Devuel ve o l i ber a l a memor i a pr evi ament e asi gnada.

For mat o:
f r ee ( voi d *p) ;

Recomendacin: I ncl uye el ar chi vo " st dl i b. h" .

Cur so de Lenguaj e C - Por : Ani bal Mar t i nez Ar ci a. 48
Ej empl o:

#i ncl ude " st dl i b. h"

mai n( ) / * demost r aci n de asi gnaci n di nmi ca */
{
i nt *p, t ;
p= ( i nt *) mal l oc ( 40 * si zeof ( i nt ) ) ;
i f ( ! p) {
pr i nt f ( " er r or de asi gnaci n \ n" ) ;
exi t ( 1) ;
}

f or ( t =0; t <40; ++t ) *( p++) =t ;
f or ( t =0; t <40; ++t ) pr i nt f ( " %d " , *( p+t ) ) ;
}

Cur so de Lenguaj e C - Por : I ng. Ani bal Mar t i nez Ar ci a. 49
ESTRUCTURAS

Una est r uct ur a se puede def i ni r como un conj unt o de campos l os cual es
conf or man una uni dad de i nf or maci n.

Cada campo o mi embr o de l a est r uct ur a puede ser de di f er ent e t i po.

For mat o:

st r uct [ i dent i f i cador ] {
t i po i dent i f i cador ;
.
.
.
}[ i dent i f i cador [ , i dent i f i cador , . . . ] ] ;

Ej empl o:

st r uct usr {
i nt nr o_usr ;
char nombr e[ 35] ;
f l oat cuot a;
} r eg_usr ;

Ot r a posi bl e f or ma ser i a:

st r uct usr {
i nt nr o_usr ;
char nombr e[ 35] ;
f l oat cuot a;
};

st r uct usr r eg_usr ;


ESTRUCTURAS ANIDADAS

Una est r uct ur a puede cont ener mi embr os compuest os por ot r as
est r uct ur as en t al caso se di ce que hay una est r uct ur a ani dada.

Ej empl o:

st r uct dat e {
i nt day;
i nt mont h;
i nt year ;
};

st r uct usr _dat e {
i nt nr o_usr ;
char nombr e[ 35] ;

Cur so de Lenguaj e C - Por : Ani bal Mar t i nez Ar ci a. 50
st r uct dat e dat e_i n;
st r uct dat e dat e_out ;
} r eg_usr ;
REFERENCIANDO MIEMBROS DE UNA ESTRUCTURA

Par a r ef er enci ar l os mi embr os de una est r uct ur a es necesar i o hacer uso
de el oper ador punt o ( . ) f l echa ( - >) .

Ej empl o:

r eg_usr . nr o_usr = 453;

pr i nt f ( " %s\ n" , r eg_usr . nombr e) ;

r eg_usr . dat e_i n. day = 15;

Los mi embr os de una est r uct ur a pueden ser apunt ador es.

Ej empl o:

st r uct usr {
char *name;
char *keywor d;
};

/ * Un ej empl o ms */
st r uct dat a {
i nt i dent ;
char *t ext ;
} Xdat ;

mai n( )
{
Xdat . i dent = 454;
Xdat . t ext = " cadena" ;

pr i nt f ( " %d %s\ n" , Xdat . i dent , Xdat . t ext ) ;

}

ARRAYS DE ESTRUCTURAS

Es posi bl e cr ear ar r egl os de est r uct ur as, a cont i nuaci n i l ust r amos
est e aspect o.

#def i ne NMAX 100

st r uct key {
i nt nr o;
char *keywor d;
} l st _key[ NMAX] ;

Cur so de Lenguaj e C - Por : I ng. Ani bal Mar t i nez Ar ci a. 51

En el ej empl o ant er i or se ha decl ar ado un ar r ay de 100 est r uct ur as.


INICIALIZACION DE ESTRUCTURAS

/ ***
* pr ogr ama de demost r aci on de i ni ci al i zaci on
* ( ar r ays de est r uct ur as)
*
*/

st r uct dat e {
char *cmont h;
i nt nmont h;
} mont h[ 12] = { " Ene" , 1,
" Feb" , 2,
" Mar " , 3,
" Abr " , 4,
" May" , 5,
" J un" , 6,
" J ul " , 7,
" Ago" , 8,
" Sep" , 9,
" Oct " , 10,
" Nov" , 11,
" Di c" , 12
};

mai n( )
{
i nt i ;

f or ( i = 0; i <= 11; ++i )
pr i nt f ( " %s %2d\ n" , mont h[ i ] . cmont h, mont h[ i ] . nmont h) ;

}

PASO DE ESTRUCTURAS Y MIEMBROS DE ESTRUCTURA A NUNA FUNCION


PASANDO ELEMENTOS INDIVIDUALES A UNA FUNCION

De i gual maner a que se pasa una var i bl e no est r uct ur ada a una f unci n
es posi bl e pasar cada campo si mpl e de una est r uct ur a.

Ej empl o:

/ ***
* demost r aci on de est r uct ur as
* pasando el ement os de una est r uct ur a a una f unci on

Cur so de Lenguaj e C - Por : Ani bal Mar t i nez Ar ci a. 52
* pasa par amet r os por r ef er enci a
*/

/ * i nt er cambi o de val or es de l os campos de una est r uct ur a */

mai n( )
{
st at i c st r uct {
i nt a;
i nt b;
} d = { 4, 8};

pr i nt f ( " a = %d b = %d ant es del cambi o\ n" , d. a, d. b) ;
swap( &d. a, &d. b) ;
pr i nt f ( " a = %d b = %d despues del cambi o\ n" , d. a, d. b) ;
}

/ ***
* udf swap( )
* r eci be : punt er os a cada campo de est r uct ur a
* devuel ve: dat os i nt er cambi ados
*/

swap( x, y)
i nt *x, *y;
{
i nt t ;

t = *x;
*x = *y;
*y = t ;
}

PUNTEROS A ESTRUCTURAS

Par a pasar una est r uct ur a a una f unci n se puede pr oceder envi ando
cada uno de sus el ement os i ndi vi dual ment e o envi ando un apunt ador a l a
est r uct ur a.

Ej empl o:

/ ***
* demost r aci on del paso de est r uct ur as a una f unci on
*/

#i ncl ude <st di o. h>

st r uct {
char *name;
i nt nr o_ct a;
f l oat sal do;

Cur so de Lenguaj e C - Por : I ng. Ani bal Mar t i nez Ar ci a. 53
} r eg;

mai n( )
{
voi d aj ust e( st r uct r eg *pt ) ; / * pr ot ot i po */

st at i c st r uct r eg usr = { " Mar i a" ,
3423,
555860. 5
};

pr i nt f ( " %10s %4d %9. 2f \ n" , usr . name, usr . nr o_ct a, usr . sal do) ;
aj ust e( &usr ) ;
pr i nt f ( " %10s %4d %9. 2f \ n" , usr . name, usr . nr o_ct a, usr . sal do) ;
}

/ ***
* udf aj ust e( )
*/

voi d aj ust e( st r uct r eg *pt )
{
pt - >name = " Sef er i no" ;
pt - >nr o_ct a = 5000;
pt - >sal do = 2000;
}

El oper ador f l echa ( - > ) es comunment e usado cuando se t r abaj a con
punt er os a est r uct ur as ya que es ms comodo que l a not aci n
( *var est ) . mi embr o.

ESTRUCTURAS AUTOREFERENCIALES

Una est r uct ur a es aut or ef er enci al cuando uno de sus mi embr os es
Est e t i po de est r uct ur a es ut i l i zado par a cr eaci n de est r uct ur as de
dat os t al es como l i st as.

Ej empl o:

/ ***
* cr ea una l i st a
*/

#i ncl ude <st di o. h>
#def i ne LOCALI ZAR ( st r uct nodo *) mal l oc( si zeof ( st r uct nodo) )

st r uct nodo {
i nt i nf o;
st r uct nodo *si g;
};


Cur so de Lenguaj e C - Por : Ani bal Mar t i nez Ar ci a. 54
mai n( )
{
st r uct nodo *cab, *q;
i nt i = 10;

cab = NULL;
whi l e( i > 0) {
q = LOCALI ZAR;
q- >i nf o = i ;
q- >si g = cab;
cab = q;
i - - ;
}
}

Cur so de Lenguaj e C - Por : I ng. Ani bal Mar t i nez Ar ci a. 55
TIPOS DE DATOS DEFINIDOS POR EL USUARIO typedef

typedef es usado par a def i ni r nuevos t i pos de dat os que l os
pr ogr amador es r equi er en con f r ecuenci a par a dar mayor cl ar i dad en
cuant o a document aci n de un pr ogr ama.

Ej empl o:

t ypedef i nt ENTERO;

y l uego decl ar ar :

ENTERO a, i , j ;

Ej empl o:

t ypedef char *CADENA;

y l uego decl ar ar :

CADENA ch, l i neas[ NMAX] ;

Ej empl o:

t ypedef st r uct usr {
i nt nr o;
char name[ 35] ;
} REGI STRO;

REGI STRO usr _r eg;

Cur so de Lenguaj e C - Por : Ani bal Mar t i nez Ar ci a. 56
CAMPOS BIT

Los campos bi t son un medi o adecuado par a mani pul ar dat os bi t a bi t en
un byt e.

Exi st en var i as r azones que hacen de l os campos bi t una her r ami ent a de
pr ogr amaci n de ext r ema ut i l i dad. Al gunas de est as r azones son l as
si gui ent es:

Los campos bi t nos per mi t en al macenar en un mi smo byt e dat os de t i po
bool eano ( Ver dader o/ Fal so) l o cual si gni f i ca un ahor r o de espaci o.

Al gunos di sposi t i vos t r ansmi t en i nf or maci n codi f i cada en bi t s de un
byt e.

Es posi bl e encr i pt ar i nf or maci n mani pul ando l os bi t s de cada byt e
par a hacer de est a maner a un encr i pt ado ms ef i ci ent e e i mpenet r abl e.

El f or mat o par a l a def i ni ci n de campos bi t es:

st r uct [ i dent i f i cador ] {
t i po i dent i f i cador : l ongi t ud;
.
.
.
}[ i dent i f i cador [ , i dent i f i cador , . . . ] ] ;

Ej empl o:

st r uct bi t s {
unsi gned a: 1;
unsi gned b: 1;
unsi gned c: 1;
unsi gned d: 1;
unsi gned e: 1;
unsi gned f : 1;
unsi gned g: 1;
unsi gned h: 1;
} byt e;

Ust ed puede apr eci ar que l os campos bi t son decl ar ados como unsi gned
debi do a que cada bi t de l a pal abr a debe ser 1 0 si n t ener en cuent a
el si gno.

Al gunos compi l ador es or denan l os campos bi t de der echa a i zqui er da
mi ent r as que ot r os l o hacen en sent i do cont r ar i o.

Nosot r os asumi r emos l a or denaci n de der echa a i zqui er da.

Cur so de Lenguaj e C - Por : I ng. Ani bal Mar t i nez Ar ci a. 57
En el ej empl o ant er i or l os campos bi t s pueden i l ust r ar se as :

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

- - - - - - - - - - - - - - - - - - - - h g f e d c b a
Si n usar

podr i amos decl ar ar ot r a est r uct ur a de campos bi t como:

st r uct {
unsi gned a : 1;
unsi gned b : 1;
unsi gned c : 5;
unsi gned d : 2;
unsi gned e : 3;
unsi gned f : 4;
} wor d;

En est e ej empl o est amos haci endo uso de t oda l a pal abr a y podr i amos
esquemat i zar l a as :

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - b a
f e d c


Cur so de Lenguaj e C - Por : Ani bal Mar t i nez Ar ci a. 58
UNIONES

Las uni ones se t r at an de est r uct ur as donde el mi smo ar ea de
al macenami ent o es compar t i do por var i os mi embr os.

Ej empl o :

uni on wor d {
char w[ 2] ;
i nt i ;
0 Xwor d;

Est o podr i a ser esquemat i zado de l a si gui ent e maner a:

Xwor d
+- - - - - - - - - - - - - - - - - - +
w
- - - - - - - +- - - - - - - -
w[ 0] w[ 1]
+- - - - - - +- - - - - - +
i
+- - - - - - - - - - - - - - - - - +

A cont i nuaci n most r amos un ej empl o que cubr e uni ones y campos bi t :

/ ***
* t oma car act er es del t ecl ado y l os vi sual i za en bi nar i o ( ASCI I )
*/

#i ncl ude <st di o. h>
#i ncl ude <coni o. h>

/ * est r uct ur a de campos bi t ( un byt e) */
st r uct byt e {
unsi gned a : 1;
unsi gned b : 1;
unsi gned c : 1;
unsi gned d : 1;
unsi gned e : 1;
unsi gned f : 1;
unsi gned g : 1;
unsi gned h : 1;
};

Cur so de Lenguaj e C - Por : I ng. Ani bal Mar t i nez Ar ci a. 59
/ * se compar t e l a mi sma ar ea de memor i a
como un car act er ( ch) o como ocho bi t s que
pueden manej ar se i ndi vi dual ment e ( bi t )
*/

uni on bi t s {
char ch;
st r uct byt e bi t ;
} asci i ;

voi d decodi f i ca( uni on bi t s b) ; / * pr ot ot i po */

mai n( )
{
whi l e( ( asci i . ch = get che( ) ) ! = ' q' ) {
pr i nt f ( " : " ) ;
decodi f i ca( asci i ) ;
}
}

/ ***
* udf decodi f i ca( )
* r eci be : uni on del t i po bi t s
* devuel ve : nada
*/

voi d decodi f i ca( uni on bi t s b)
{
pr i nt f ( " %d " , ( b. bi t . h) ? 1 : 0) ;
pr i nt f ( " %d " , ( b. bi t . g) ? 1 : 0) ;
pr i nt f ( " %d " , ( b. bi t . f ) ? 1 : 0) ;
pr i nt f ( " %d " , ( b. bi t . e) ? 1 : 0) ;
pr i nt f ( " %d " , ( b. bi t . d) ? 1 : 0) ;
pr i nt f ( " %d " , ( b. bi t . c) ? 1 : 0) ;
pr i nt f ( " %d " , ( b. bi t . b) ? 1 : 0) ;
pr i nt f ( " %d " , ( b. bi t . a) ? 1 : 0) ;
pr i nt f ( " \ n" ) ;
}

/ ***
* demost r aci on de campos bi t
*/

#i ncl ude <st di o. h>

mai n( )
{
unsi gned m, d, a;

st at i c st r uct {
unsi gned a : 2;

Cur so de Lenguaj e C - Por : Ani bal Mar t i nez Ar ci a. 60
unsi gned b : 2;
unsi gned c : 3;
unsi gned d : 1;
} cbi t = { 3, 5, 7, 1};

pr i nt f ( " %d %d %d %d\ n" , cbi t . d, cbi t . c, cbi t . b, cbi t . a) ;
/ * sal i da : 1 7 1 3 */
}

Anal i ce l a sal i da del ant er i or pr ogr ama. Pr est e at enci n especi al en
el cont eni do del campo b.

Cur so de Lenguaj e C - Por : I ng. Ani bal Mar t i nez Ar ci a. 61
ENUMERACIONES

La enumer aci n es un t i po de dat os si mi l ar a l a est r uct ur a o l a uni n.
Si n embar go sus mi embr os son const ant es con val or es est abl eci dos.

For mat o:

enum[ i dent i f i cador ] {
i dent i f i cador ,
.
.
.
} [ i dent i f i cador [ , i dent i f i cador , . . . ] ] ;

Ej empl o:

enumcol or es {negr o,
azul ,
cyan,
ver de,
magent a,
r oj o,
bl anco,
amar i l l o
};

enumcol or es f ondo, pr i mer pl ano;

Se puede hacer l a mi sma def i ni ci n de l a si gui ent e f or ma:

enum{negr o,
azul ,
cyan,
ver de,
magent a,
r oj o,
bl anco,
amar i l l o
} f ondo, pr i mer pl ano;

Aut omat i cament e l os val or es par a cada const ant e de l a enumer aci n
ser i an:

negr o 0
azul 1
cyan 2
ver de 3
magent a 4
r oj o 5
bl anco 6
amar i l l o 7

Cur so de Lenguaj e C - Por : Ani bal Mar t i nez Ar ci a. 62

Los val or es aut omat i cos que se l e asi gnan a l as const ant es de l a
enumer aci n pueden ser modi f i cados.
Ej empl o:

enum{negr o,
azul = 4,
cyan,
ver de,
magent a,
r oj o,
bl anco,
amar i l l o
} f ondo, pr i mer pl ano;

Los val or es par a l as const ant es de enumer aci n son ahor a:

negr o 0
azul 4
cyan 5
ver de 6
magent a 7
r oj o 8
bl anco 9
amar i l l o 10

Podr i amos hacer asi gnaci nes como l as si gui ent es;

pr i mer pl ano = bl anco;


Es posi bl e condi ci onar l as cost ant es de enumer aci n:

i f ( f ondo == azul )
pr i mer pl ano = bl anco;
el se
pr i mer pl ano = azul ;

Ot r a f or ma val i da podr i a ser :

swi t ch( f ondo) {
case negr o:
pr i mer pl ano = bl anco;
br eak;

case azul :
cyan:
ver de:
magent a:
r oj o:
pr i mer pl ano = amar i l l o;

Cur so de Lenguaj e C - Por : I ng. Ani bal Mar t i nez Ar ci a. 63
br eak;

case bl anco:
pr i mer pl ano = negr o;
br eak;

case amar i l l o:
pr i mer pl ano = azul ;
br eak;

def aul t :
put s( " Er r or en sel ecci n del col or de f ondo" ) ;
}

Cur so de Lenguaj e C - Por : Ani bal Mar t i nez Ar ci a. 64
OPERADORES AVANZADOS

OPERADORES DE BITS

En al gunas apl i caci ones puede ser necesar i o el manej o de l os bi t s
i ndi vi dual es de una pal abr a. Fr ecuent ement e se hace uso del l enguaj e
Ensamblador par a t al pr oposi t o. Si n embar go el l enguaj e C di spone de
un conj unt o de oper ador es que mani pul an ef i ci ent ement e l os bi t s.

OPERADOR DE COMPLEMENTO A UNO (~)

Est e oper ador se apl i ca a un sol o oper ando y su f unci n es l a de negar
es deci r , l os bi t s que est an en uno ( 1) se convi er t en en cer o ( 0) y
l os bi t s cer o ( 0) se combi er t en en uno( 1) . El oper ando debe ser un
ent er o ( char , i nt , l ong, unsi gned, shor t ) .

Ej empl o:


OPERADOR LOGICO Y (&) A NIVEL DE BITS

Da como r esul t ado un uno ( 1) si el bi t del pr i mer oper ando y el
segundo oper ando es uno ( 1) . En ot r o caso el r esul t ado ser a cer o ( 0) .

Ej empl o:


OPERADOR LOGICO O (|) A NIVEL DE BITS

Da como r esul t ado un uno ( 1) si por l o menos el bi t del pr i mer o o
segundo oper ando est a en uno ( 1) .

Ej empl o:


OPERADOR LOGICO O EXCLUSIVO (^) A NIVEL DE BITS

Da como r esul t ado un uno ( 1) si el bi t del pr i mer opr ando est a en uno
( 1) y el bi t del segundo oper ando est a en cer o ( 0) o l o cont r ar i o. En
cual qui er ot r o caso da como r esul t ado cer o ( 0) .

Ej empl o:

OPERADOR DE DESPLAZAMIENTO DE BITS A LA DERECHA ( >> )

Despl za o mueve t odos l os bi t s a l a der echa el nmer o de posi ci ones
especi f i cado.

Si el opr ando es de t i po unsi gned se asegur a que l as posi ci ones a l a
i zqui er da se l l enar an con cer o ( 0) .


Cur so de Lenguaj e C - Por : I ng. Ani bal Mar t i nez Ar ci a. 65

Ej empl o:

OPERADOR DE DESPLAZAMIENTO A LA IZQUIERDA ( << )

Despl za o mueve t odos l os bi t s a l a i zqui er da el nmer o de posi ci ones
especi f i cado.

Ej empl o:
ENTRADA Y SALIDA (ARCHIVOS)

/ ***
* copi a cual qui er ar chi vo
*/

#i ncl ude <st di o. h>
#i ncl ude <st dl i b. h>

mai n( ar gc, ar gv)
i nt ar gc;
char *ar gv[ ] ;
{
FI LE *i n, *out ;
char ch;

i f ( ar gc ! = 3) {
put s( " Er r or en par amet r os. . . " ) ;
exi t ( 1) ;
}

i f ( ( i n=f open( ar gv[ 1] , " r b" ) ) ==NULL) {
put s( " No puedo abr i r ar chi vo. . . " ) ;
exi t ( 1) ;
}

i f ( ( out =f open( ar gv[ 2] , " wb" ) ) ==NULL) {
put s( " No puedo abr i r ar chi vo. . . " ) ;
exi t ( 1) ;
}

whi l e( ! f eof ( i n) )
put c( get c( i n) , out ) ;

f cl ose( i n) ; f cl ose( out ) ;
}



/ ***
*
* l as f unci ones f get s( ) y f put s( )

Cur so de Lenguaj e C - Por : Ani bal Mar t i nez Ar ci a. 66
* char *f get s( char *st r , FI LE *f p) ;
* char *f put s( char *st r , i nt l ong, FI LE *f p) ;
*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* f get s( ) : l ee una cadena desde l a cor r i ent e especi f i cada
* hast a que encuent r a el car act er de nueva l i nea
* f put s( ) : escr i be una cadena en l a cor r uent e especi f i cada
*/

#def i ne TAM 100
#i ncl ude <st di o. h>
#i ncl ude <st r i ng. h>

mai n( ar gc, ar gv)
i nt ar gc;
char *ar gv[ ] ;
{
FI LE *f p;
i nt x;
char Xst r i ng[ TAM] ;

i f ( ar gc ! = 2) {
put s( " Uso : pr og <f i l e>" ) ;
exi t ( 1) ;
}

i f ( ( f p=f open( ar gv[ 1] , " w" ) ) ==NULL) {
put s( " Er r or en aper t ur a de dat os" ) ;
exi t ( 1) ;
}

pr i nt f ( " - => " ) ; get s( Xst r i ng) ;

whi l e( st r l en( Xst r i ng) ! = 0) {
f put s( Xst r i ng, f p) ;
pr i nt f ( " - => " ) ; get s( Xst r i ng) ;
}
f cl ose( f p) ;
}



/ ***
*
* l as f unci ones f get s( ) y f put s( )
* char *f get s( char *st r , FI LE *f p) ;
* char *f put s( char *st r , i nt l ong, FI LE *f p) ;
*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* f get s( ) : l ee una cadena desde l a cor r i ent e especi f i cada
* hast a que encuent r a el car act er de nueva l i nea
* f put s( ) : escr i be una cadena en l a cor r uent e especi f i cada
*/

Cur so de Lenguaj e C - Por : I ng. Ani bal Mar t i nez Ar ci a. 67

#def i ne TAM 100
#i ncl ude <st di o. h>
#i ncl ude <st r i ng. h>

mai n( ar gc, ar gv)
i nt ar gc;
char *ar gv[ ] ;
{
FI LE *f p;
i nt x;
char Xst r i ng[ TAM] ;

i f ( ar gc ! = 2) {
put s( " Uso : pr og <f i l e>" ) ;
exi t ( 1) ;
}

i f ( ( f p=f open( ar gv[ 1] , " r " ) ) ==NULL) {
put s( " Er r or en aper t ur a de dat os" ) ;
exi t ( 1) ;
}

whi l e( ( f get s( Xst r i ng, TAM, f p) ) ! = NULL)
pr i nt f ( " %s" , Xst r i ng) ;

f cl ose( f p) ;
}



/ ***
*
* l a f unci on f seek( )
* i nt f seek( FI LE *f p, l ong num_byt es, i nt or i gen) ;
* est abl ece el l ocal i zador de posi ci on en un byt e especi f i co
* num_byt e : numer o de byt es desde el or i gen a al canzar l a nueva
* posi ci on
*
* or i gen :
* comi enzo del ar chi vo SEEK_SET 0
* posi ci on act ual SEEK_CUR 1
* f i n de ar chi vo SEEK_END 2
*/

#i ncl ude <st di o. h>
#def i ne SI ZE 20

mai n( )
{
FI LE *f p;

Cur so de Lenguaj e C - Por : Ani bal Mar t i nez Ar ci a. 68
char ch;

i f ( ( f p = f open( " t ext o" , " r b" ) ) == NULL) {
put s( " Er r or en aper t ur a de ar chi vo" ) ;
exi t ( 1) ;
}

f seek( f p, SI ZE, 0) ;
ch = get c( f p) ;
put char ( ch) ;

f cl ose( f p) ;
}

Cur so de Lenguaj e C - Por : I ng. Ani bal Mar t i nez Ar ci a. 69
INTERRUPCIONES

LA ROM-BIOS

Est act i va dur ant e t odo el t i empo que est t r abaj ando el comput ador .
La ROM- BI OS pr opor ci ona t odos l os ser vi ci os f undament al es que se
necesi t an par a que puedan l l evar se a cabo t odas l as oper aci ones del
comput ador . Por l o gener al el BI OS cont r ol a l os di sposi t i vos
per i f er i cos t al es como l a pant al l a, el t ecl ado y cont r ol ador es de
di sco. Dent r o del BI OS se encuent r an l os pr ogr amas encar gados de
r eal i zar el cont r ol de di sposi t i vos.

Los pr ogr amas r esi dent es en BI OS t r ansf or man un si mpl e comando de
un pr ogr ama en t oda l a secuenci a de pasos necesar i os par a que se
desar r ol l e en f or ma ef ect i va di cha acci n. ROM- BI OS guar da ademas
l a hor a y el di a.

VECTORES DE I NTERRUPCI ON

Los comput ador es I BM PC como t odos l os basados en l a f ami l i a de
mi cr opr ocesador es 8086 de I NTEL se cont r ol an a t r aves del uso de
i nt er r upci ones, que se pueden gener ar o bi en por har dwar e o bi en por
sof t war e. Cada vez que se necesi t a un ser vi ci o se debe i ndi car en l a
i nt er r upci on el nmer o asoci ado a el l a.

Cuando ocur r e una i nt er r upci n, el cont r ol del comput ador pasa a
l a r ut i na de t r at ami ent o de l a i nt er r upci on.

Las di r ecci ones segment adas ut i l i zadas par a l ocal i zar l a r ut i nas de
t r at ami ent o de i nt er r upci ones se l l aman vect or es de i nt er r upci on.

Los vect or es de i nt er r upci on se est abl ecen en el moment o en que se
car ga el si st ema oper at i vo.

Las i nt er r upci ones quedan al macenadas en RAM como t abl as f or mando una
especi e de par es de pal abr as, con l a por ci on de l a di r ecci on r el at i va,
en pr i mer l ugar , y l a por ci on del segment o en segundo
l ugar .

El pr ogr ama de gest i on de l a i nt er r upci n se l l ama car gando su
di r ecci n segment ada en el r egi st r o que cont r ol a el f l uj o del pr ogr ama
: Regi st r o CS ( segment o de codi go) y el r egi st r o I P ( punt er o de
i nst r ucci ones) o par CS: I P.

Cada i nt er r upci n t i ene un gr upo asoci ado de opci ones. Las
i nt er r upci ones del PC se pueden di vi di r en si et e cat egor i as l as cual es
son:
1. Mi cr opr ocesador
2. Har dwar e
3. Sof t war e
4. DOS

Cur so de Lenguaj e C - Por : Ani bal Mar t i nez Ar ci a. 70
5. BASI C
6. Di r ecci onami ent o
7. Gener al es
I NTERRUPCI ONES DEL MI CROPROCESADOR: Se conocen t ambi en como
i nt er r upci ones l ogi cas, est an i nt egr adas en el pr opi o mi cr opr ocesador ,
cuat r o de el l as son ( 0, 1, 3, 4) son gener adas por el pr opi o
mi cr opr ocesador .

La i nt er r upci on 2 o i nt er r upci on no enmascar abl e se act i va medi ant e
una seal que envi a un di sposi t i vo ext er no.

I NTERRUPCI ONES HARDWARE : Est an i mpl ement adas en el har dwar e del PC.
Ocho de est as i nt er r upci ones est an cabl eadas en el i nt er i or del
mi cr opr ocesador , o en l a pl aca pr i nci pal ( t ar j et a madr e) y no pueden
ser modi f i cadas. Todas l as i nt er r upci ones har dwar e son super vi sadas
por el chi p 8259A PI C. Los codi gos r eser vados son 2, 8, 9 y del 11 al
15.

I NTERRUPCI ONES SOFTWARE : Est an i ncor por adas dent r o del di seo del PC
y son par t e de l os pr ogr amas de l a ROM- BI OS. Las r ut i nas del BI OS no
pueden cambi ar se, per o l os vect or es que aput an a esas r ut i nas pueden
ser al t er adas par a que apunt en a r ut i nas di f er ent es. Los codi gos
r eser vados son: 5, 16 al 28 y 72.

I NTERRUPCI ONES DOS : Se encuent r an si empr e di sponi bl es cuando el DOS
est a en uso. Al gunos l enguaj es y pr ogr amas hacen uso de est os
ser vi ci os a t r aves de i nt er r upci ones DOS par a manej ar sus oper aci ones
basi cas de ent r ada y sal da del di sco. Los codi gos r eser vados van del
32 al 255 ( se aconsej a usar del 32 al 96 el r est o no convi ene
t ocar l os) .

I NTERRUPCI ONES BASI C : Son asi gnadas por el BASI C y est an di sponi bl es
cuando se ut i l i za BASI C. Los codi gos r eser vados van del 128 al 240.

I NTERRUPCI ONES DE DI RECI ONAMI ENTO : Son una par t e de l a t abl a de l os
vect or es de i nt er r upci on y se ut i l i zan par a al macenar di r ecci ones
segment adas. No hay r ut i nas de t r at ami ent o asoci adas a est as
i nt er r upci ones. En par t i cul ar est an asoci adas con t r es t abl as muy
i mpor t ant es :

1. La i ni ci al i zaci n de vi deo
2. La t abl a base de di sco
3. La t abl a de car act er es gr af i cos

Est as t abl as cont i enen par amet r os que ut i l i za l a ROM- BI OS en
pr ocedi mi ent os de puest a en mar cha y ademas par a l a gener aci on de
car act er es gr af i cos. Los codi gos r eser vados van del 29 al 31, 68 y el
73 ( 78 y 63 sol o par a PCJ r ) .

I NTERRUPCI ONES DE USO GENERAL : Est n est abl eci das par a l os pr ogr amas
par a su uso t empor al . Los codi gos r eser vados van del 96

Cur so de Lenguaj e C - Por : I ng. Ani bal Mar t i nez Ar ci a. 71
al 103.

Los vect or es de i nt er r upci n est an al macenados en l as l ocal i zaci ones
ms baj as de memor i a.

La pr i mer a l ocal i zaci n de memor i a cont i ene el vect or par a l a
i nt er r upci on numer o 0 ( cer o) y asi sucesi vament e.

Par a encont r ar l a l ocal i zaci n de cual qui er a i nt er r upci on se
mul t i pl i ca el numer o de i nt er r upci n por cuat r o, debi do a que cada
vect or t i ene una l ongi t ud de dos pal abr as. por ej empl o el vect or par a
i nt er r upci on 5 ( i nt er r upci on de ser vi ci o de escr i t ur a en pant al l a)
t endr a el byt e de di r ecci on r el at i va 20 ( 5 x 4 =20) .
Con l a ayuda del depuador del si st ema DEBUG y dando est e val or en
hexadeci mal podemos exami nar el vect or de i nt er r upci on del mi smo.

Ej empl o:
20 deci mal es i gual a 14 hexadeci mal
de est a maner a podr i amos escr i bi r :

DEBUG <cr >
D 0000: 0014 L 4 <cr >

La r espuest a ser i a:

54 FF 00 F0

Convi r t i endo est e r esul t ado en una di r ecci on segment ada y t eni endo en
cuent a el al macenami ent o " back wor d" ( pal abr a i nver t i da) , se puede
apr eci ar que el vect or de i nt er r upci on par a el punt o de ent r ada en l a
ROM de l a r ut i na es F000: FF54.

EL MI CROPROCESADOR 8088

El 8088 es un mi cr opr ocesador de 16 bi t s ( CPU) .
El 8088 cont r ol a l as oper aci ones basi cas del or denador , envi a y r eci be
seal es de cont r ol , di r ecci ones de memor i a y dat os de una par t e a ot r a
del comput ador a t r aves de l a r ed el ect r oni ca de i nt er conecci ones
l l amadas bus.
A l o l ar go del bus se encuent r an l os puer t os de E/ S, l as di ver sas
memor i as y l os chi ps de sopor t e.

Dent r o del 8088 exi st en 14 r egi st r os, que pr opor ci onan un ar ea
edecuada par a poder r eal i zar l a t r ansf er enci a de l os dat os y su
pr ocesami et o. Los 14 r egi st r os del 8088 f or man una memor i a de 28 byt es
y pueden al macenar dat os, di r ecci ones de memor i a, punt er os de
i nst r ucci n e i ndi cador es de est ado y cont r ol .

LOS CHI PS DE SOPORTE


Cur so de Lenguaj e C - Por : Ani bal Mar t i nez Ar ci a. 72
El mi cr opr ocesador por si sol o no es capaz de cont r ol ar t odo el
comput ador par a l o cual del ega al gunas f unci ones a ot r os chi ps,
pudi endo de est a maner a encar gar se de su pr opi o t r abaj o.
Aunque exi st en muchos chi ps de sopor t e en nuest r o est udi o sol o
t r at ar emos el cont r ol ador de i nt er r upci ones 8259.

EL CONTROLADOR 8259 ( Cont r ol ador de i nt er r upci ones)

Est e chi p super vi sa l a r eal i zaci n de l as i nt er r upci ones. Las
i nt er r upci ones son seal es envi adas a l a CPU por el har dwar e par a
r equer i r su at enci n, o r esponder a al guan acci n.
Est e chi p i nt er cept a l as seal es, det er mi na su ni vel de pr i or i dad con
r el aci n a ot r as seal es que se est en r eci bi endo y act i va una seal de
i nt er r upci n de l a CPU en f unci n de su desi ci n. En cuant o l a CPU
r eci be l a seal de i nt er r upci n, l l ama a un pr ogr ama especi f i co
asoci ado con el di sposi t i vo per i f er i co i nvol ucr ado en el pr oceso. Es
est e pr ogr ama el que l l evar a cabo l a acci n especi f i ca. Luego de
haber t er mi nado l a ej ecuci n de l a r ut i na l l amada en l a i nt er r upci n,
el cont r ol vuel ve nuevament e al si t i o donde est aba cuando ocur r i o l a
i nt er r upci n.
Hay t r es cat egor i as pr i nci pal es de i nt er r upci ones.

I nt er r upci ones gener adas por l a ci r cui t er i a del or denador en r espuest a
a al gun acont eci mi ent o, t al como l a pul saci n de una t ecl a. Est as
i nt er r upci ones son manej adas por el chi p 8259, el cual l e d pr i or i dad
en or den de i mpor t anci a ant es de envi ar l as a l a CPU.
I nt er r upci ones gener adas por l a CPU como r esul t ado de al guna oper aci n
i nusual pr oduci da por el pr ogr ama por ej empl o di vi si n por cer o.
I nt er r upci ones gener adas por l os pr ogr amas como un cami no par a i nvocar
ser vi ci os al macenados en ROM o RAM est as i nt er r upci ones r eci ben el
nombr e de i nt er r upci ones por sof t war e y ser n nuest r o t ema pr i nci pal
par a l ogr ar al gunas f unci ones como el bor r ado de l a pant al l a y ot r as
en nuest r o cur so de l enguaj e C.

Es posi bl e cr ear nuevas r ut i nas de i nt er r upci n y hacer que l os
vect or es de i nt er r upci n apunt en a el l as par a que as puedan ser
ej ecut adas en el moment o que se r equi er an.
Las i nt er r upci ones guar dan aut omat i cament e l os val or es cont eni dos en
l os r egi st r os ( CS) e ( I P) . De est a f or ma el comput ador puede vol ver al
si t i o donde est aba cuando se pr oduj o l a i nt er r upci n.

COMO DI RECCI ONA LA MEMORI A EL 8088?

El 8088 di r ecci ona l a memor i a de t r es maner as:
- For ma di r ect a o i ndi r ect a
- A t r aves de punt er os.
- Medi ant e i nt er r upci ones

La memor i a puede ser ut i l i zada par a l eer o escr i bi r .
Los dat os se al macenan en l ocal i zaci ones que se i dent i f i can a t r aves
de un nmer o l l amado di r ecci n de memor i a.

Cur so de Lenguaj e C - Por : I ng. Ani bal Mar t i nez Ar ci a. 73
Se puede acceder di r ect ament e a l a memor i a por medi o del chi p 8237A, o
cont r ol ador de acceso di r ect o a memor i a ( DMA) o i ndi r ect ament e a
t r aves de l os r egi st r os i nt er nos del 8088. El cont r ol ador de di sco y
puer t os en ser i e pueden acceder di r ect ament e a l a memor i a a t r aves del
cont r ol ador ( DMA) el r est o de di sposi t i vos t r ansf i er e dat os a y desde
l a memor i a haci endo uso de r egi st r os del 8088.

USO DE LOS RECURSOS DEL SI STEMA

Per mi t en:

1. Acceso di r ect o a l os r ecur sos del si st ema oper at i vo.
2. Acceso al ent or no del comput ador .
3. Acceso a r ut i nas st andar d de bi bl i ot eca.
4. Manej ar una f unci n por uno mi smo.

FAMI LI A DE MI CROPROCESADORES I NTEL 8086

Cont i ene 14 r egi st r os en l os que pone l a i nf or maci n par a pr ocesar o
el pr ogr ama de cont r ol .

Los r egi st r os se di vi den en 4 cat egor i as:
1. De pr oposi t o gener al .
2. De base de punt er o i ndi ce.
3. De segment o.
4. De pr oposi t o especi al .

Cada r egi st r o t i ene una l ongi t ud de 16 bi t s ( 2 Byt es) .

1. Regi st r os de pr oposi t o gener al
Son r egi st r os de t r abaj o de l a CPU. En el l os se ponen l os val or es par a
su pr ocesami ent o. El pr ocesami ent o i ncl uye : Sumar , r est ar ,
mul t i pl i car , di vi di r , compar aci ones, bi f ur caci ones.
A cada r egi st r o de pr oposi t o gener al se accede de dos f or mas:
- Como r egi st r o de 16 bi t s.
- Como r egi st r o de 8 bi t s.

2. Regi st r os base de punt er o e i ndi ce.
Pr opor ci onan sopor t e a cosas como di r ecci onami ent o r el at i vo, punt er o
de pi l a e i nst r ucci ones par a mover un bl oque.

3. Regi st r os de segment o.
Sopor t an el esquema de memor i a segment ada del 8086.
CS : Segment o de codi go act ual .
DS : Segment o de dat os act ual .
ES : Segment o ext r a.
ES : Segment o de pi l a.

4. Regi st r os de pr oposi t o especi al .
Regi st r o de i ndi cador es. Guar dan el est ado de l a CPU.

Cur so de Lenguaj e C - Por : Ani bal Mar t i nez Ar ci a. 74
Regi st r o punt er o de i nst r ucci ones. Apunt a a l a si gui ent e i nst r ucci n
en l a CPU.

UNA VI SI ON DETALLADA DE LOS REGI STROS DEL 8088.

Regi st r os de pr oposi t o gener al


Regi st r os de punt er o e i ndi ce

SP SI
Punt er o de pi l a Punt er o i ndi ce

BP DI
Punt er o base I ndi ce dest i no

Regi st r os de segment o

CS SS
Segment o de codi go Segment o de pi l a

DS ES
Segment o de dat o Segment o ext r a
r egi st r os de pr oposi t o especi al

I P
Regi st r o i ndi ce Punt er o de i nst r ucci ones

Las interrupciones del 8086 y PC-DOS

Una i nt er r upci n es un t i po de i nst r ucci n especi al que pr ovoca l a
par ada en l a ej ecuci n del pr ogr ama, guar ada el est ado act ual del
si st ema en l a pi l a y sal t a a l a r ut i na de manej o de l a i nt er r upci n
que se det er mi na por el nmer o de i nt er r upci n.
Luego r egr esa de vuel t a de l a i nt er r upci n y r eanuda l a ej ecuci n del
pr ogr ama.
Exi st en dos t i pos de i nt er r upci n:
1. Por har dwar e
2. Por sof t war e

La i nst r ucci n I NT es usada par a l l evar a cabo i nt er r upci ones.

Ej empl o : I NT 21h

El nmer o de i nt er r upci n es usado par a hal l ar el manej ador de
adecuado de i nt er r upci n.

Cur so de Lenguaj e C - Por : I ng. Ani bal Mar t i nez Ar ci a. 75

Se r eser va el pr i mer Ki l o Byt e de memor i a par a usar l o con una t abl a de
vect or es de i nt er r upcn. Esa t abl a cont i ene l as di r ecci ones de l os
manej ador es de i nt er r upci n, en f or ma de segment o/ despl azami ent o.

Cada di r ecci n r equi er e de cuat r o Byt es.
256 vect or es de i nt er r upci n. I NT 5 - => 5 x 4 = 20 0014h.
El si st ema oper at i vo ha asi gnado una ser i e de est os vect or es par a usar
con el ROM- BI OS y DOS.
Medi ant e i nt er r upci ones accedemos a f unci ones del si st ema oper at i vo.
La f unci n accedi da es det er mi nada por el r egi st r o AH, l a i nf or maci n
adi ci onal se pasa en l os r egi st r os AL, AX, CX y DX.
El si st ema oper at i vo PC- DOS se di vi de en ROM- BI OS y DOS.


/ ***
* I NTER1. C
* i nt er r upci on ROM- BI OS 19h
* act i vaci on de l a r ut i na de ar r anque del si st ema
* ( boot st r ap)
*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* Obj et i vo : Ut i l i zo f r ecuent ement e est a i nt er r upci on par a dos
* cosas:
* 1. El i nmedi at o ci er r e de l as oper aci ones del
* comput ador cuando se encuent r a una si t uaci on
* i nt ol er abl e, por ej empl o el i nt ent o de copi a de
* un sof t war e.
* 2. Par a hacer un ar r anque del si st ema si n hacer
* l as oper aci ones de r eset y r est ar t .
*/

#i ncl ude <dos. h>

voi d boot ( ) ;

mai n( )
{
boot ( ) ;
}

voi d boot ( )
{
uni on REGS r ;

i nt 86( 0x19, &r , &r ) ;
}



/ ***
* I NTER2. C

Cur so de Lenguaj e C - Por : Ani bal Mar t i nez Ar ci a. 76
* i nt er r upci on DOS ( 21h)
* Ser vi ci o : 35h Capt ar el vect or de i nt er r upci on
* Ent r ada:
* AH = 35
* AL = nr o de i nt er r upci on
* Sal i da:
* ES Segment o
* BX Despl azami ent o
*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
*/

#i ncl ude <dos. h>

voi d showvec( ) ;

mai n( )
{
showvec( ) ;
}

voi d showvec( )
{
i nt i ;
uni on REGS r ;
st r uct SREGS sr ;

f or ( i = 0; i < 256; ++i ) {
r . h. ah = 0x35;
r . h. al = i ;
i nt dosx( &r , &r , &sr ) ;
pr i nt f ( " I nt er r upci on %3d, Segment o %8x Of f set %8x\ n" ,
i , sr . es, r . x. bx) ;
}
}



/ ***
* I NTER3. C
* i nt er r upci on DOS ( 21h)
* escr i bi r car act er es en l a i mpr esor a
*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* Ent r ada:
* AH = 5h
* AL = car act er
* Devuel ve:
* none
*/

#i ncl ude <dos. h>


Cur so de Lenguaj e C - Por : I ng. Ani bal Mar t i nez Ar ci a. 77
voi d escr i car ( ) ;

char *out put = " pr ueba" ;
mai n( )
{
whi l e( *out put )
escr i car ( *out put ) ;
}

voi d escr i car ( c)
i nt c;
{
uni on REGS r ;

r . h. ah = 0x5;
r . h. al = c;
i nt dos( &r , &r ) ;
}



/ ***
* I NTER4. C
* i nt er r upci on ROM- BI OS 13h
* si st ema de di sco
* ser vi ci o : 1
* obt i ene st at us del di sco
*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* Ent r ada:
* AH = 1
* Devuel ve:
* AL : 1 comando i ncor r ect o
* 2 mar ca de di r ecci on no encont r ada
* 3 i nt ent o de escr i t ur a en di sco pr ot egi do
* 4 sect or no encont r ado
* 6 di sco r et i r ado
* 8 r ebasar el l i mi t e del DMA
* 9 DMA mas al l a de l os 64K
* 10 mal CRC
* 20 f al l o del cont r ol ador NEC
* 40 f al o de busqueda
* 80 t i me out
*/

#i ncl ude <dos. h>

dr i ve_st ( ) ;

mai n( )
{
i nt i ;

Cur so de Lenguaj e C - Por : Ani bal Mar t i nez Ar ci a. 78

i = dr i ve_st ( ) ;
pr i nt f ( " %d\ n" , i ) ;
}

dr i ve_st ( )
{
uni on REGS r ;

r . h. ah = 0x1;
r et ur n( i nt 86( 0x13, &r , &r ) ) ;
}





/ * WHEREX. C obt i ene l a col umna act ual del cur sor */
/ * Uso : wher ex( ) ; */
/ * Ej empl o : x = wher ex( ) ; */

#i ncl ude <dos. h>

uni on REGS r egs;

wher ex( )
{
r egs. h. ah = 3; / * obt ener posi ci on del cur sor */
r egs. h. bh = 0; / * par a l a pagi na 0 */
i nt 86( 0x10, &r egs, &r egs) ;
r et ur n( r egs. h. dl ) ; / * col umna act ual */
}


/ * WHEREY. C obt i ene l a f i l a act ual del cur sor */
/ * Uso : wher ey( ) ; */
/ * Ej empl o : y = wher ey( ) ; */

#i ncl ude <dos. h>

uni on REGS r egs;

wher ey( )
{
r egs. h. ah = 3; / * obt ener posi ci on del cur sor */
r egs. h. bh = 0; / * par a l a pagi na 0 */
i nt 86( 0x10, &r egs, &r egs) ;
r et ur n( r egs. h. dh) ; / * f i l a act ual */
}



Cur so de Lenguaj e C - Por : I ng. Ani bal Mar t i nez Ar ci a. 79
/ * GOTOXY. C posi ci ona el cur sor en un si t i o de l a pant al l a */
/ * Uso : got oxy( x, y) ; */
/ * Ej empl o : got oxy( 10, 2) ; col 10, f i l 2 */

#i ncl ude " dos. h"

got oxy( col , r ow)
i nt col , r ow;
{
uni on REGS r egs;

r egs. h. ah = 2; / * est abl ece l a posi ci on del cur sor */
r egs. h. bh = 0; / * pagi na de vi deo 0 */
r egs. h. dh = r ow; / * f i l a */
r egs. h. dl = col ; / * col umna */
i nt 86( 0x10, &r egs, &r egs) ;
}


Cur so de Lenguaj e C - Por : Ani bal Mar t i nez Ar ci a. 80
EL SISTEMA EXTENDIDO DE CLIPPER

Est e capi t ul o cont i ene t oda l a i nf or maci n que ust ed necesi t a par a
escr i bi r f unci ones de usuar i o en ot r os l enguaj es como C o Assembl er .

Temas a cubr i r :

1. Descr i pci n del si st ema ext endi do de Cl i pper

2. Sumar i o de f unci ones ext endi das

3. Haci endo l a i nt er f ace con C

4. Ej empl o de f unci ones C

5. Compi l ando y enl azando sus f unci ones C

6. Ej er ci ci os de demost r aci n

DESCRIPCION DEL SISTEMA EXTENDIDO DE CLIPPER

La ar qui t ect ur a abi er t a de Cl i pper per mi t e escr i bi r f unci ones en ot r os
l enguaj es y ademas di spone de her r ami ent as par a pasar y r eci bi r
par amet r os a o desde di chas f unci ones.
Las f unci ones pueden ser l l amadas desde cual qui er pr ogr ama Cl i pper que
as l o r equi er a. Por ej empl o, el val or que devuel ve una f unci n puede
ser al macenado en una var i abl e, empl eado en un cal cul o o despl egado en
l a pant al l a.

Ej empl o:

Xvar _mem= f unci on( <exp>)

Es posi bl e escr i bi r f unci ones en Lenguaj e C o Assembl er 8088 medi ant e
el si st ema ext endi do de Cl i pper , l uego puede enl azar est as f unci ones a
sus pr ogr amas de apl i caci on Cl i pper compi l ados de ant emano.

Las f unci ones escr i t as en C o Assembl er pueden ser usadas par a obt ener
l a i nf or maci n necesar i a por un pr ogr ama Cl i pper o par a r eal i zar
al guna t ar ea pr ocedi ment al . No se debe i nt er nt ar hacer manej o de
ar chi vos usando f unci ones de ent r ada y sal i da como f open( ) , open( ) ,
pr i nt f ( ) et c. como t ampoco es posi bl e acceder a l a est r uct ur a de l os
ar chi vos de base de dat os at r avez de l a f or ma convenci onal . Par a
l ogr ar t odo l o ant er i or se debe hacer uso de l as i nt er r upci ones del
DOS.

Las f unci ones de usuar i o cr eadas en C o Assembl er deben ser l l amadas
usando el mi smo nombr e con el cual f uer on decl ar adas. No se per mi t en
abr evi at ur as si n embar go l a f unci n puede ser l l amada usando
mi nuscul as o mayuscul as.


Cur so de Lenguaj e C - Por : I ng. Ani bal Mar t i nez Ar ci a. 81
Est as f unci ones de usuar i o pueden ser decl ar adas expl i ci t ament e en el
pr ogr ama de apl i caci n o decl ar adas EXTERNAL al moment o de compi l ar l as
par a l uego ser i ncl ui das como si mbol os al moment o de enl azar l as. Las
f unci ones de usuar i o en un REPORT, LABEL FORMs o expr esi n INDEX,
deben ser decl ar adas como EXTERNAL.

Ej empl o:

EXTERNAL f unc_1, f unc_2

Cur so de Lenguaj e C - Por : Ani bal Mar t i nez Ar ci a. 82
SUMARIO DE FUNCIONES EXTENDIDAS

Ti po de dat o Pr ot ot i po C Assembl er
Cl i pper
________________________________________________________________
char act er char *_par c( i nt [ , i nt ] ) __PARC
dat echar *_par ds( i nt [ , i nt ] ) __PARDS
l ogi cal i nt _par l ( i nt [ , i nt ] ) __PARL
numer i ci nt _par ni ( i nt [ , i nt ] ) __PARNI
numer i cl ong _par nl ( i nt [ , i nt ] ) __PARNL
numer i cdoubl e _par nd( i nt [ , i nt ] ) __PARND


i nt _par cl en( i nt [ , i nt ] ) __PARLEN
i nt _par csi z( i nt [ , i nt ] ) __PARCSI Z
i nt _r et cl en( i nt ) __RETCLEN



char act er voi d_r et c( char *) __RETC
dat evoi d _r et ds( char *) __RETDS
l ogi cal voi d _r et l ( i nt ) __RETL
numer i cvoi d _r et ni ( i nt ) __RETNI
numer i cvoi d _r et nl ( l ong) __RETNL
numer i cvoi d _r et nd( doubl e) __RETND
( no r et ur n val ue) voi d_r et ( voi d) __RET

HACIENDO LA INTERFACE CON C

Cl i pper per mi t e l a escr i t ur a de f unci ones de usuar i o en Lenguaj e C
medi ant e si st ema ext endi do. Est e mecani smo es el cami no par a l l amar
f unci ones especi al i zadas que sopor t an el paso de par amet r os en ambos
sent i dos Cl i pper a C, C a Cl i pper .

Est as f unci ones se hal l an en l a l i br er i a Cl i pper . Las f unci ones de
usuar i o en C pueden ser decl ar adas despues de i ncl ui r el ar chi vo
NANDEF. H y EXTEND. H. En est os ar chi vos se encuent r an l as decl ar aci ones
y def i ni ci ones necesar i as par a escr i bi r f unci ones de usuar i o en C.

RECIBIENDO PARAMETROS EN C

El concept o de par amet r os f or mal es C desapar ece de est e punt o. Todos
l os par amet r os pueden ser accedi dos usando l as f unci ones _par ( ) .

DEVOLVIENDO VALORES DESDE C

Las f unci ones _r et ( ) son usadas par a devol ver val or es a Cl i pper .
Est as f unci ones como t oda f unci n sol o devuel ven un val or . El uso de
una de l as f unci ones _r et depende del t i po de dat o que se qui er a
devol ver .


Cur so de Lenguaj e C - Por : I ng. Ani bal Mar t i nez Ar ci a. 83


EJEMPLO DE FUNCIONES C

Est e es el esquema de una f unci on de usuar i o t i pi ca par a enl azar con
Cl i pper .

En C:

CLI PPER <f unct i on_name>( )
/ * par amet r os f or mal es C omi t i dos */
{
<decl ar aci n de var i abl es l ocal es>

i f ( <par amet r os son val i dos>
{
<codi go a ej ecut ar >
}
el se
{
<codi go a ej ecut ar par a par amet r os i ndef i ni dos>
r et ur n;
}
}

Cur so de Lenguaj e C - Por : Ani bal Mar t i nez Ar ci a. 84
En Cl i pper :

DECLARE ar r [ 3]
ar r [ 1] = " Devor ah"
ar r [ 2] = 456. 56
ar r [ 3] = CTOD( " 09/ 01/ 87" )
Ar r f unc( ar r )

En C:

#i ncl ude " ext end. h" / * Decl ar as Si st ema Ext endi do */
#i ncl ude " st di o. h" / * l i br er i a st andar d i o */
#i ncl ude " mat h. h" / * l i br er i a st andar d mat h */

CLI PPER ar r f unc( ) / * especi f i ca CLI PPER */
/ * t ypedef voi d pascal */
{
i nt i ;

f or ( x = 1; x <= 3; ++x)
{
/ * var i abl es st r i ng */
i f ( _par i nf a( 1, x) == CHARACTER)
{
cpr i nt f ( " %s\ n" , _par c( 1, x) ) ;
}

/ * ent er o o de punt o f l ot ant e */
i f ( _par i nf a( 1, X) == NUMERI C)
{
cpr i nt f ( " %f \ n" , _par nd( 1, x) ) ;
}
el se
/ * f echa */
i f ( _par i nf a( 1, x) == DATE)
{
cpr i nt f ( " %s\ n" , _par ds( 1, i ) ) ;
}
}
_r et ( ) ;
}

Nota: El uso de cpr i nt f ( ) es uni cament e par a pr oposi t o de
demost r aci on. Le r ecomi endo que t oda l a ent r ada y sal i da l a r eal i ce
desde Cl i pper o l a haga medi ant e el uso de i nt er r upci ones.

COMPILANDO Y ENLAZANDO SUS FUNCIONES C

Si l a f unci n o f unci ones que desaean enl azar con sus pr ogr amas
Cl i pper f uer on escr i t as en Mi cr osof t C 5. 0, es necesar i o que l a

Cur so de Lenguaj e C - Por : I ng. Ani bal Mar t i nez Ar ci a. 85
compi l aci n se haga est abl eci endo l os swi t chs de compi l aci n adecuados
l os cual es se descr i ben a cont i nuaci n:

CL / c / AL / Zl / Oal t / FPa / Gs <nombr e_ar chi vo>. c
Donde:

CL = I nvoca el compi l ador CL. EXE
/ c = Compi l ar si n hacer enl ace
/ AL = Gener a codi go par a model o l ar go de memor i a ( L) ar ge
/ Zl = No hace busqueda en l as l i br er i as por def ect o
( l ) i br ar y- sear ch
/ Oal t = cont r ol de opt i mi zaci n

Donde:

a = No chequea al i as
l = Habi l i t a l a opt i mi zaci n de l os l oop
t = Ej ecut a a l a maxi ma vel oci dad

/ FPa = Manej o de punt o f l ot ant e usando l a l i br er i a al t er na.
( a) l t er nat e l i br ar y
/ Gs = Qui t a l as l l amadas a r ut i nas par a chequeo de pi l a
( s) t ack- checki ng r out i ne


Par a Mi cr osof t Qui ck C l a compi l aci n es l a si gui ent e:

QCL / c / AL / Zl / Oal t / FPi / Gs <nombr e_ar chi vo>. c

/ FPi = Manej o de punt o f l ot ant e emul ada por sof t war e si no est
pr esent e el 8087 en caso de encont r ar l o, est e ser ut i l i zado.
/ FPi 87 = Manej o de punt o f l ot ant e por Har dwar e 8087.

ENLACE DE UNA FUNCION C CON UN PROGRAMA CLIPPER

Par a hacer el enl ace se debe usar el enl azador que ms l e si mpat i ce.
Par t i cul ar ment e me gust a t r abaj ar con TURBO LINK de Bor l and ( TLI NK) .

Ej empl o:

Suponga que desea enl azar una f unci n C que se encuent r a en un ar chi vo
l l amado udf _c. obj con un pr ogr ama Cl i pper que se encuent r a en el
ar chi vo pr og. obj . I magi ne ademas que Cl i pper se encuent r a en el
di r ect or i o CLI PPER que se despr ende del r ai z:

Las l i br er i as Qui ck C se encuent r an en el di r ect or i o QC25\ LI B,
ent onces l a l i nea de or den podr i a ser :

TLI NK pr og + udf _c, , , \ CLI PPER\ CLI PPER+\ CLI PPER\ EXTEND+\ QC25\ LI B\ LLI BCE

MACROS C PREDEFINIDOS

Cur so de Lenguaj e C - Por : Ani bal Mar t i nez Ar ci a. 86

Par a si mpl i f i car l a si nt axi s y hacer ms l egi bl e el codi go, se ha
col ocado en el ar chi vo EXTEND.H una ser i e de macr os que per mi t en hacer
el chequeo o val i daci n de l os par amet r os pasados a l a f unci n de
usuar i o:

#def i nes en EXTEND. H

Ti po Devuel ve
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
i ndef i ni do = UNDEF
car act er = CHARACTER
numer i co = NUMERI C
l ogi co = LOGI CAL
f echa = DATE
por r ef er enci a = MPTR
memo = MEMO
ar r egl o = ARRAY


MACROS C INTERFACE PREDEFINIDOS

EXTEND. H Macr oDef i ni do como
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
PCOUNT( _par i nf o( 0) )
I SCHAR( or der ) ( _par i nf o( or der ) & CHARACTER)
I SNUM( or der ) ( _par i nf o( or der ) & NUMERI C)
I SLOG( or der ) ( _par i nf o( or der ) & LOGI CAL)
I SDATE( or der ) ( _par i nf o( or der ) & DATE)
I SMEMO( or der ) ( _par i nf o( or der ) & MEMO)
I SBYREF( or der ) ( _par i nf o( or der ) & MPTR)
I SARRAY( or der ) ( _par i nf o( or der ) & ARRAY)
ALENGTH( or der ) ( _par i nf a( or der , 0) )

En una f unci n de usuar i o, ust ed puede usar el macr o PCOUNT y
cual qui er a de l os macr os I S<t i po> par a det er mi nar cuant os par amet r os
se han pasado y de que t i po. Est o l e per mi t e val i dar par a asegur ar se
de que si se han pasado l os par amet r os cor r ect os y el nmer o esper ado.


REFERENCIA - FUNCIONES C INTERFACE DEL SISTEMA EXTENDIDO

_par c( )

Pasa un punt er o a una cadena de car act er es Cl i pper .

Si nt axi s de uso:

#i ncl ude <ext end. h>

char *_par c( or der , i ndex)

Cur so de Lenguaj e C - Por : I ng. Ani bal Mar t i nez Ar ci a. 87

i nt or der ; Si t i o que ocupa el par amet r o en l a l i st a de par amet r os
pasados desde Cl i pper .

i nt i ndex; I ndi ce par a par amet r os t i po ar r ay.

Descr i pci n:

_par c( ) es usado par a r eci bi r par amet r os car act er que se pasan desde
Cl i pper .
Si se pasa par amet r o por val or , se har una copi a de t i po char *. Si
se pasa par amet r o por r ef er enci a, est ar t r abaj ando sobr e el par amet r o
act ual Cl i pper ( La mi sma di r ecci n de memor i a) .


_par cl en( )

Devuel ve l a l ongi t ud de una cadena en car act er es.

Si nt axi s de uso:

#i ncl ude <ext end. h>

i nt _par cl en( or der , i ndex)

i nt or der ; Si t i o que ocupa el par amet r o en l a l i st a de par amet r os
pasados desde Cl i pper .

i nt i ndex; I ndi ce par a par amet r os t i po ar r ay.

Descr i pci n:

_par cl en( ) devuel ve l a l ongi t ud de una cadena de car act er es pasada
desde Cl i pper .

_par cl en( ) Obt i ene l a l ongi t ud de l a cadena si n cont ar el t er mi nador
nul o.
_par csi z( )

Devuel ve el t amao de una cadena.

Si nt axi s de uso:

#i ncl ude <ext end. h>

i nt _par csi z( or der , i ndex)

i nt or der ; Si t i o que ocupa el par amet r o en l a l i st a de par amet r os
pasados desde Cl i pper .

i nt i ndex; I ndi ce par a par amet r os t i po ar r ay.

Cur so de Lenguaj e C - Por : Ani bal Mar t i nez Ar ci a. 88

Descr i pci n:

_par csi z( ) Devuel ve el nmer o de byt es en memor i a que ocupa una cadena
especi f i ca i ncl uyendo el t er mi nador nul o.
_par si ze( ) Devuel ve cer o par a cuando se pasan const ant es.
Ej empl o:

DO <pr oces> WI TH " ABC"

_par ds( )

Pasa un punt er o car act er a una f echa Cl i pper .

Si nt axi s de uso:

#i ncl ude <ext end. h>

char *_par ds( or der , i ndex)

i nt or der ; si t i o que ocupa el par amet r o en l a l i st a de par amet r os
pasados desde Cl i pper .

i nt i ndex; I ndi ce par a par amet r os t i po ar r ay.

Descr i pci n:

_par ds( ) Pasa un punt er o char * a una f echa que se r eci be desde
Cl i pper . La f echa queda r epr esent ada como una cadena en el f or mat o
YYYYMMDD.


_par i nf a( )

Per mi t e chequear t i pos de el ement os de un ar r egl o que se ha pasado
como par amet r o.

Si nt axi s de uso:

#i ncl ude <ext end. h>

i nt _par i nf a( or der , i ndex)

i nt or der ; Si t i o que ocupa el par amet r o en l a l i st a de par amet r os
pasados desde Cl i pper .

i nt i ndex; I ndi ce par a par amet r os t i po ar r ay.

Descr i pci n:


Cur so de Lenguaj e C - Por : I ng. Ani bal Mar t i nez Ar ci a. 89
_par i nf a( ) Devuel ve el t i po al cual per t enece un el ement o de un
ar r egl o. _par i nf a( <n>, 0) devuel ve el nmer o de el ement os del ar r ay.

Ej empl o:

La si gui ent e f unci n, ar r f unc( ) , t oma un ar r ay def i ni do en Cl i pper y
muest r a t odos l os el ement os f or mat eados de acuer do al t i po de dat o.

En Cl i pper :

DECLARE ar r ay[ 2]
ar r ay[ 1] = " Devor ah"
ar r ay[ 2] = 456. 56
Ar r Func( ar r ay)

En C:

f or ( x = 1; x <= _par i nf a( 1, 0) ; ++x)

{ / * var i abl es st r i ng */
i f ( _par i nf a( 1, x) == CHARACTER)
{
cpr i nt f ( " %s\ n" , _par c( 1, x) ) ;
}

/ * ent er o o punt o f l ot ant e */
i f ( _par i nf a( 1, x) == NUMERI C)
{
cpr i nt f ( " %f \ n" , _par nd( 1, x) ) ;
}
}




_par i nf o( )

Chequea el t i po de par amet r o.

Si nt axi s de uso:

#i ncl ude <ext end. h>

i nt _par i nf o( or der )

i nt or der ; Si t i o que ocupa el par amet r o en l a l i st a de par amet r os
pasados desde Cl i pper . par amet er s t o t ype- check

Descr i pci n:

_par i nf o( ) Es usado par a chequear el t i po de par amet r o pasado.

Cur so de Lenguaj e C - Por : Ani bal Mar t i nez Ar ci a. 90
_par i nf o( 0) Devuel ve el nmer o de par amet r os pasados y _par i nf o( <n>)
Devuel ve el t i po de par amet r o <n> donde <n> es l a posi ci n en l a l i st a
de par amet r os. El val or devuel t o es uno de l os si gui ent es:

/ * _par i nf o t ypes f r omext end. h*/
#def i ne UNDEF 0
#def i ne CHARACTER 1
#def i ne NUMERI C 2
#def i ne LOGI CAL 4
#def i ne DATE 8
#def i ne ALI AS 16
#def i ne MPTR 32
#def i ne MEMO 64
#def i ne WORD 128
#def i ne ARRAY 512

Ej empl o:

La si gui ent e f unci n de usuar i o, cf unc( ) , r eci be cuat r o par amet r os
desde Cl i pper , un t i po car act er , un t i po numer i co, un t i po l ogi co y un
t i po f echa; decl ar a l as var i abl es C que deben r eci bi r l os val or e, y
despues val i da l os par amet r os:

CLI PPER cf unc( )
{
char *par m1;
doubl e par m2;
i nt par m3; / * l ogi co decl ar ado como i nt */
char *par m4; / * f echa decl ar ado como char ( YYYYMMDD) */

i f ( PCOUNT == 4 && I SCHAR( 1) && I SNUM( 2) && I SLOG( 3) && I SDATE( 4) )

{
<codi go a ej ecut ar si l os par amet r os son val i dos>
}
el se
{
<codi go a ej ecut ar si l os par amet r os son i nval i dos>
}

}



_par l ( )

Pasa un ent er o como val or l gi co, 1 = . T. , 0 = . F.

Si nt axi s de uso:

#i ncl ude <ext end. h>

Cur so de Lenguaj e C - Por : I ng. Ani bal Mar t i nez Ar ci a. 91

i nt _par l ( or der , i ndex)

i nt or der ; Si t i o que ocupa el par amet r o en l a l i st a de par amet r os
pasados desde Cl i pper .

i nt i ndex; I ndi ce par a par amet r os t i po ar r ay.

Descr i pt i on:

_par l ( ) Reci be un par amet r o l gi co desde Cl i pper y l o combi er t e en
ent er o donde ( 1 = . T. and 0 = . F. ) .

_par nd( )

Pasa un dat o numer i co dobl e.

Si nt axi s de uso:

#i ncl ude <ext end. h>
doubl e _par nd( or der , i ndex)

i nt or der ; Si t i o que ocupa el par amet r o en l a l i st a de par amet r os
pasados desde Cl i pper .

i nt i ndex; I ndi ce par a par amet r os t i po ar r ay.

Descr i pci n:

_par nd( ) Reci be un par amet r o numer i co desde Cl i pper y l o convi er t e en
dobl e.


_par ni ( )

Pasa un dat o numer i co ent er o.

Si nt axi s de uso:

#i ncl ude <ext end. h>

i nt _par ni ( or der , i ndex)

i nt or der ; Si t i o que ocupa el par amet r o en l a l i st a de par amet r os
pasados desde Cl i pper .

i nt i ndex; I ndi ce par a par amet r os t i po ar r ay.

Descr i pci n:


Cur so de Lenguaj e C - Por : Ani bal Mar t i nez Ar ci a. 92
_par ni ( ) Reci be un dat o numer i co ent er o desde Cl i pper y l o convi er t e
en ent er o.


_par nl ( )

Pasa un dat o numer i co l ar go.

Si nt axi s de uso:

#i ncl ude <ext end. h>

l ong _par nl ( or der , i ndex)

i nt or der ; Si t i o que ocupa el par amet r o en l a l i st a de par amet r os
pasados desde Cl i pper .
i nt i ndex; I ndi ce par a par amet r os t i po ar r ay.


Descr i pci n:

_par nl ( ) Reci be un par amet r o numer i co desde Cl i pper y l o convi er t e en
l ar go ( l ong) .

_exmgr ab( )


Asi gna memor i a.

Si nt axi s de uso:

#i ncl ude <ext end. h>

unsi gned char * _exmgr ab( byt es)

unsi gned i nt byt es; Tamao de l a memor i a a asi gnar .

Descr i pci n:

_exmgr ab( ) Asi gna memor i a del t amao sol i ci t ado. Si l a asi gnaci n
t i ene exi t o, devuel ve un punt er o char * a l a di r ecci n de comi enzo de
l a memor i a asi gnada; de ot r a maner a, devuel ve NULL.

Ej empl o:

si ze = 512
buf f = _exmgr ab( si ze) / * asi gnar memor i a */
i f ( buf f ) / * si t odo sal i o bi en ( ! nul l ) */
check = TRUE;



Cur so de Lenguaj e C - Por : I ng. Ani bal Mar t i nez Ar ci a. 93

_exmback( ) Li ber a l a memor i a asi gnada por _exmgr ab( ) .

Ej empl o:

si ze = 512
buf f = _exmgr ab( si ze) / * asi gna memor i a */
i f ( buf f ) / * si t odo sal i o bi en ( ! nul l ) */
check = TRUE;
i f ( check)
_exmback( buf f , si ze) ; / * l i ber a memor i a */


_exmback( )

Li ber a l a memor i a asi gnada.

Si nt axi s uso:

#i ncl ude <ext end. h>

voi d * _exmback( poi nt er , byt es)

unsi gned char *poi nt er ; Punt er o de _exmgr ab( )
unsi gned i nt byt es; Tamao pasado a _exmgr ab( )

Descr i pci n:

Li ber a l a memor i a asi gnada por _exmgr ab( ) .


DEVOLVIENDO VALORES DESDE C

_r et ( )

No devuel ve ni ngun val or a Cl i pper :

#i ncl ude <ext end. h>

voi d _r et ( voi d)

Descr i pci n:

_r et ( ) No devuel ve ni ngun val or a Cl i pper . Es ut i l i zado en f unci ones
que devuel ven nada. Funci ones pr ocedi ment al es.


_r et c( )

Pasa una cadena de car act er es a Cl i pper .


Cur so de Lenguaj e C - Por : Ani bal Mar t i nez Ar ci a. 94
Si nt axi s de uso:

#i ncl ude <ext end. h>

voi d _r et c( st r i ng)

char *st r i ng; Punt er o a st r i ng

Descr i pci n:

_r et c( ) Devuel ve una cadena de car act er es a Cl i pper .


_r et cl en( )

Pasa l a l ongi t ud de un st r i ng a Cl i pper .

Si nt axi s de uso:

#i ncl ude <ext end. h>

voi d _r et cl en( st r i ng, i nt )

char *st r i ng; Cadena de car act er es a l a cual se l e qui er e cal cul ar su
l ongi t ud.
i nt ; l ongi t ud de l a cadena.

Descr i pci n:

_r et cl en( ) Devuel ve l a l ongi t ud de una cadena i ncl uyendo CHR( 0) s.

_r et ds( )

Pasa una cadena f echa a Cl i pper convi r t i endol a en t i po DATE

Si nt axi s de uso:

#i ncl ude <ext end. h>

voi d _r et ds( st r i ng)

char *st r i ng; Fecha como cadena ( YYYYMMDD)

Descr i pci n:

_r et ds( ) Pasa a Cl i pper una cadena como f echa char * YYYYMMDD. La
cadena es conver t i da al f or mat o DATE de Cl i pper .


_r et l ( )


Cur so de Lenguaj e C - Por : I ng. Ani bal Mar t i nez Ar ci a. 95
Pasa un ent er o a Cl i pper como val or l gi i co.

Si nt axi s de uso:

#i ncl ude <ext end. h>

voi d _r et l ( f l ag)

i nt f l ag; Val or Bool ean

Descr i pci n:

_r et l ( ) Pasa a unent er o a Cl i pper como un val or l gi co, donde 1 es
t r ue ( . T. ) y 0 es f al se ( . F. ) .


_r et nd( )

Pasa un doubl e a Cl i pper .

Si nt axi s de uso:

#i ncl ude <ext end. h>

voi d _r et nd( x) ;

doubl e x; Expr esi n numer i ca

Descr i pci n:

_r et nd( ) Pasa un doubl e a Cl i pper . El val or es conver t i do al t i po
NUMERI C de Cl i pper .


_r et ni ( )

Pasa un ent er o a Cl i pper .

Si nt axi s de uso:

#i ncl ude <ext end. h>

voi d _r et ni ( n)

i nt n; Expr esi n numer i ca

Descr i pci n:

_r et ni ( ) pasa un ent er o a Cl i pper como dat o NUMERI C.



Cur so de Lenguaj e C - Por : Ani bal Mar t i nez Ar ci a. 96
_r et nl ( )

Pasa un dat o numer i co l ar go a Cl i pper .

Si nt axi s de uso:

#i ncl ude <ext end. h>

voi d _r et nl ( n)

l ong n; Expr esi n numer i ca l ong

Descr i pci n:

_r et nl ( ) Pasa un ent er o l ar go a Cl i pper como dat o de t i po NUMERI C.

Cur so de Lenguaj e C - Por : I ng. Ani bal Mar t i nez Ar ci a. 97
EJERCICIOS DE DEMOSTRACION

/ ***
*
* DI RE. C
* Funci ones de usuar i o par a manej o de di r ect or i os.
* Not a : Par a enl azar con CLI PPPER/ SUMMER ' 87.
* Est as f unci ones deben ser compi l adas con Mi cr osof t C 5. 0 .
* Fecha: Car t agena, Novi embr e 22 De 1991.
* Copyr i ght ( c) 1991. Ani bal G. Mar t i nez Ar ci a.
* ( Especi al i st a en Lenguaj e C) .
*
*
*
*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* Cont eni do:
* ==========
* FUNCI ON PROPOSI TO
*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* get _dr i ve( ) Obt i ene l a uni dad por def ect o.
* set _dr i ve( ) Est abl ece l a uni dad por def ect o.
* makedi r ( ) Cr ea di r ect or i o.
* changedi r ( ) Cambi a de di r ect or i o.
*/

#i ncl ude <dos. h>
#i ncl ude <nandef . h>
#i ncl ude <ext end. h>
#i ncl ude <di r ect . h>
/ ***
* get _dr i ve( )
* I nt DOS. ( 21h) .
* ser vi ci o 19h. Capt ar uni dad de di sco act ual .
* AH : 19h
* AL : devuel ve uni dad de di sco act ual
* : 0 = A, 1 = B, 2 = C, Et c.
* Pr oposi t o : Capt ar uni dad de di sco act ual .
* Ej . Uso : var = get _dr i ve( )
*
*/
CLI PPER get _dr i ve( )
{
st at i c char *dr v_name[ ] = {" A: " , " B: " , " C: " , " D: " , " E: " , " F: " };

uni on REGS r ;

r . h. ah = 0x19;
i nt dos( &r , &r ) ;
_r et c( dr v_name[ r . h. al ] ) ;
}


Cur so de Lenguaj e C - Por : Ani bal Mar t i nez Ar ci a. 98


/ ****
* set _dr i ve( )
* I nt DOS. ( 21h) .
* Ser vi ci o 0Eh. Sel ecci ona l a uni dad de di sco i mpl i ci t a.
* AH : 0xE
* DL : Uni dad de di sco deseada 0=A, 1=B, 2=C, et c.
* AL : Sal i da - > numer o t ot al de uni dades de di sco
* pr esent e.
* Pr oposi t o : Est abl ecer uni dad de di sco i mpl i ci t a.
* Ej . Uso : set _dr i ve( 1)
*/
CLI PPER set _dr i ve( )
{
i nt dr i ve = _par ni ( 1) ;

uni on REGS r egs;

r egs. h. ah = 0x0E;
r egs. h. dl = dr i ve;
i nt dos( &r egs, &r egs) ;
/ * r et ur n( r egs. h. al ) ; */
_r et ( ) ; / * no debuel va nada */
}

/ ***
* makedi r ( <pat h>)
* Pr oposi t o : Cr ear di r ect or i o.
* Reci be : Pat h.
* Devuel ve : 0 = Exi t o. - 1 = Er r or .
* Ej . Uso : var = makedi r ( " \ usr " )
*/
CLI PPER makedi r ( )
{
i nt er r or ;
char *pat h = _par c( 1) ;

er r or = mkdi r ( pat h) ;
_r et ni ( er r or ) ;
}

/ ***
* changedi r ( <pat h>)
* Pr oposi t o : Cambi ar de di r ect or i o.
* Reci be : Pat h.
* Devul eve : 0 = exi t o. - 1 = Er r or .
* Uso : vas = changedi r ( " \ usr " )
*/
CLI PPER changedi r ( )
{

Cur so de Lenguaj e C - Por : I ng. Ani bal Mar t i nez Ar ci a. 99
char *pat h = _par c( 1) ;
i nt er r or ;

er r or = chdi r ( pat h) ;
_r et ni ( er r or ) ;
}

/ ***
*
* STRI NG. C
* Funci ones de usuar i o par a manej o de cadenas.
* Not a : Par a enl azar con CLI PPPER/ SUMMER ' 87.
* Est as f unci ones deben ser compi l adas con Mi cr osof t C 5. 0 .
* Fecha: Car t agena, Novi embr e 22 De 1991.
* Copyr i ght ( c) 1991. Ani bal G. Mar t i nez Ar ci a.
* ( Especi al i st a en Lenguaj e C) .
*
*
*
*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* Cont eni do:
* ==========
* FUNCI ON PROPOSI TO
*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* cnt _cadena( ) Devuel ve el numer o de veces que una subcadena se *
encuent r a en una cadena.
*/

#i ncl ude <dos. h>
#i ncl ude <nandef . h>
#i ncl ude <ext end. h>

/ ***
* cnt _cadena( <expC1>, <expC2>)
* Pr oposi t o : Devuel ve el numer o de veces que una subcadena se
* encuent r a
* en una cadena.
* <expC1> : Cadena.
* <expC2> : Subcadena.
* Ej . Uso : var = cnt _cadena( " est o es una pr ueba" , " es" )
*/
CLI PPER cnt _cadena( )
{
char *st r i ng = _par c( 1) ; / * cadena */
char *sub_st r i ng = _par c( 2) ; / * subcadena */
i nt i , j , k, cont a = 0;

f or ( i = 0; st r i ng[ i ] ; i ++)
f or ( j = i , k = 0; sub_st r i ng[ k] == st r i ng[ j ] ; k++, j ++)
i f ( sub_st r i ng[ k+1] ) {
cont a++; / * encont r o l a cadena y se i ncr ement a */

Cur so de Lenguaj e C - Por : Ani bal Mar t i nez Ar ci a. 100
br eak;
/ * i ni ci a busqueda de l a si gui ent e ocur r enci a */
}
_r et ni ( cont a) ;
}

Cur so de Lenguaj e C - Por : I ng. Ani bal Mar t i nez Ar ci a. 101
/ ***
* exampl ec. c
*
* Exampl e " C" f unct i ons usi ng t he CLI PPER Ext end i nt er f ace.
*
* The CLI PPER cal l abl e f unct i ons ar e. . . . .
*
* SOUNDEX( )
* STUFF( )
* DI SKSPACE( )
*
**/


/ ***
* SOUNDEX( )
* kevi n j . shepher d, NANTUCKET Cor por at i on.
* 09/ 14/ 87
*
* Pr oduces a code based on t he " Soundex" met hod or i gi nal l y
* evel oped by M. K. Odel l and R. C. Russel l . Al gor i t hmcan
* be f ound on page 392 of Knut hs' book ' Sor t i ng and
* Sear chi ng' , vol ume 3 of ' The Ar t of Comput er
* Pr ogr ammi ng" , Addi son/ Wesl ey publ i sher .
*
* code = SOUNDEX( name)
*
* code - char act er st r i ng.
* name - char act er st r i ng.
*
* Non- al phabet i c char act er s i n i nput st r eamwi l l cause t he
* f unct i on t o abor t and r et ur n a NULL poi nt er .
*
**/

#i ncl ude " nandef . h"
#i ncl ude " ext end. h"

#def i ne I SALPHA( c) ( ( c) >= ' a' && ( c) <= ' z' | |
( c) >= ' A' && ( c) <= ' Z' )
#def i ne UPPER( c) ( ( c) >= ' a' && ( c) <= ' z' ? ( c) - 32 : ( c) )

#def i ne MAX_OMI TS 9 / ** char act er s t o be i gnor ed **/
#def i ne MAX_GROUPS 6
/ ** +1 f or NULL poi nt er i n st at i c decl ar e/ i ni t **/
#def i ne MAX_DI GI TS 4 / ** number of di gi t s i n code sequence **/
#def i ne CODE_ALLOC 5 / ** si ze of code sequence **/

st at i c byt e omi t _l et t er [ MAX_OMI TS] = " AEHI OUWY" ;
st at i c byt e *code_gr oup[ MAX_GROUPS + 1] = {
" BFPV" ,

Cur so de Lenguaj e C - Por : Ani bal Mar t i nez Ar ci a. 102
" CGJ KQSXZ" ,
" DT" ,
" L" ,
" MN" ,
" R" ,
NULL
};
ext er n Bool ean name_2_code( ) ;
ext er n byt e t r ansl at e( ) ;
ext er n Bool ean omi t ( ) ;

/ ***
*
* soundex( )
* kj s
* 09/ 14/ 87
*
* Mai n soundex f unct i on, does par amchecki ng, al l ocat i on,
* st r i ng pr ep, and deal l ocat i on.
*
**/

CLI PPER SOUNDEX( )

{
Bool ean er r or ;

quant i ;
quant name_si ze;

byt e *name;
byt e *code;

code = NULL;
er r or = ( PCOUNT ! = 1 | | ! I SCHAR( 1) | | _par cl en( 1) == 0) ;

i f ( ! er r or )
{
name = _par c( 1) ;
name_si ze = ( quant ) ( _par cl en( 1) + 1) ;
/ ** +1 f or NI L byt e **/
code = _exmgr ab( name_si ze >= CODE_ALLOC
? name_si ze : CODE_ALLOC) ;
/ ** make upper case **/
f or ( i = 0; i < name_si ze; i ++)
name[ i ] = UPPER( name[ i ] ) ;

er r or = name_2_code( name, name_si ze, code) ;
}

i f ( ! er r or )

Cur so de Lenguaj e C - Por : I ng. Ani bal Mar t i nez Ar ci a. 103
_r et c( code) ;
el se
_r et c( " " ) ;
i f ( code)
_exmback( code, name_si ze >= CODE_ALLOC
? name_si ze : CODE_ALLOC) ;
}

/ ***
*
* name_2_code( )
* kj s
* 09/ 14/ 87
*
* Conver t s a name i nt o 4 uni t code ( al pha, di gi t , di gi t , di gi t )
* as per t he SOUNDEX met hod r ul es.
*
* er r or = name_2_code( sour ce, sour ce_si ze, t ar get )
*
**/

Bool ean name_2_code( sour ce, sour ce_si ze, t ar get )

byt e *sour ce;
quant sour ce_si ze;
byt e *t ar get ;

{
Bool ean er r or ;

quant i ;
quant j ;

er r or = FALSE;

/ ** f i r st char act er not t r ansl at ed **/
t ar get [ 0] = sour ce[ 0] ;
i = 1;
j = 1;

/ ** copy whi l e f i l t er i ng unwant ed char act er s **/
whi l e ( i < ( sour ce_si ze - 1) && ! er r or )
{
i f ( ( t ar get [ j - 1] ! = sour ce[ i ] ) && ! omi t ( sour ce[ i ] ) )
{
er r or = ! I SALPHA( sour ce[ i ] ) ;

i f ( ! er r or )
{
t ar get [ j ] = sour ce[ i ] ;
j ++;

Cur so de Lenguaj e C - Por : Ani bal Mar t i nez Ar ci a. 104
}
}

i ++;
}

/ ** t r uncat e st r i ng **/
i f ( j > MAX_DI GI TS)
j = MAX_DI GI TS;

t ar get [ j ] = NI L;
i f ( ! er r or )
{
/ ** t r ansl at i on **/
f or ( i = 1; i < j ; i ++)
t ar get [ i ] = t r ansl at e( t ar get [ i ] ) ;

/ ** zer o f i l l **/
f or ( i = j ; i < MAX_DI GI TS; i ++)
t ar get [ i ] = ' 0' ;

t ar get [ i ] = NI L;
}

r et ur n ( er r or ) ;
}


/ ***
*
* t r ansl at e( )
*
* Tr ansl at es a char act er i nt o a code di gi t .
*
* di gi t = t r ansl at e( chr )
*
**/

byt e t r ansl at e( chr )

byt e chr ;

{
Bool ean f ound;

quant i ;
quant j ;

byt e di gi t ;

f ound = FALSE;

Cur so de Lenguaj e C - Por : I ng. Ani bal Mar t i nez Ar ci a. 105

i = 0;
j = 0;

di gi t = NI L;

/ ** scan gr oups unt i l mat ch i s f ound **/
whi l e ( i < MAX_GROUPS && ! f ound)
{
/ ** scan t he l i st of char act er i n t hi s gr oup **/
j = 0;
whi l e ( j < st r l en( code_gr oup[ i ] ) && ! f ound)
{
f ound = ( chr == code_gr oup[ i ] [ j ] ) ;
j ++;
}

i f ( ! f ound)
i ++;
}

di gi t = ( i + 1) + 48; / ** conver t t he subscr i pt t o asci **/

r et ur n ( di gi t ) ;
}


/ ***
*
* omi t ( )
*
* Check t he char act er i f i t i s on t he omi t l i st .
*
* st at us = omi t ( chr )
*
**/

Bool ean omi t ( chr )

byt e chr ;

{
quant i ;

Bool ean f ound;

f ound = FALSE;

f or ( i = 0; ( i < MAX_OMI TS && ! f ound) ; i ++)
f ound = ( chr == omi t _l et t er [ i ] ) ;


Cur so de Lenguaj e C - Por : Ani bal Mar t i nez Ar ci a. 106
r et ur n ( f ound) ;
}

/ ***
* STUFF( )
* kevi n j . shepher d, NANTUCKET Cor por at i on.
* 09/ 13/ 87
*
* Repl ace LENGTH number of char act er s i n SOURCE st ar t i ng at START
* wi t h t he ent i r e MODI FI ER st r i ng.
*
* t ar get = STUFF( sour ce, st ar t , l engt h, modi f i er )
*
* t ar get - char act er st r i ng.
* sour ce - char act er st r i ng.
* st ar t - numer i c.
* l engt h - numer i c.
* modi f i er - char act er st r i ng.
*
**/
CLI PPER STUFF( )
{
quant i ;
quant j ;
quant s_max;
quant m_max;
quant buf f er _si ze;

quant st ar t ;
quant l engt h;

byt e *sour ce;
byt e *modi f i er ;
byt e *buf f er ;

/ ** par amet er OK? **/
i f ( PCOUNT == 4 && I SCHAR( 1) && I SNUM( 2) && I SNUM( 3)
&& I SCHAR( 4) &&
_par cl en( 1) + _par cl en( 4) > 0)
{
/ ** l ocal copi es **/
sour ce = _par c( 1) ;
modi f i er = _par c( 4) ;
st ar t = ( quant ) ( _par nl ( 2) >= 0 ? _par nl ( 2) : 0) ;
l engt h = ( quant ) ( _par nl ( 3) >= 0 ? _par nl ( 3) : 0) ;

/ ** st r i ng si zes **/
s_max = ( quant ) _par cl en( 1) ;
m_max = ( quant ) _par cl en( 4) ;

/ ** al l ocat e a wor k buf f er . **/

Cur so de Lenguaj e C - Por : I ng. Ani bal Mar t i nez Ar ci a. 107
buf f er _si ze = _par cl en( 1) + _par cl en( 4) + 1;
buf f er = _exmgr ab( buf f er _si ze) ;

/ ** adj ust dBASE st r i ng base val ues t o ' C'
base, of f - by- one, yea! **/
st ar t = ( st ar t > 0 ? st ar t - 1 : 0) ;

/ ** get f i r st par t of sour ce st r i ng. **/
j = 0;
whi l e ( j < st ar t && j < s_max)
{
buf f er [ j ] = sour ce[ j ] ;
j ++;
}

/ ** i nser t **/
i = 0;
whi l e ( i < m_max)
{
buf f er [ j ] = modi f i er [ i ] ;
j ++;
i ++;
}

/ ** copy t he r est of t he sour ce st r i ng. **/
i = st ar t + l engt h;
whi l e ( i < s_max)
{
buf f er [ j ] = sour ce[ i ] ;
j ++;
i ++;
}

buf f er [ j ] = NI L;

_r et cl en( buf f er , j ) ;

_exmback( buf f er , buf f er _si ze) ;
}
el se
{
_r et c( " " ) ;
}
}


/ ***
* DI SKSPACE( )
* TomRet t i g, Br i an Russel l
* 11/ 01/ 85
*

Cur so de Lenguaj e C - Por : Ani bal Mar t i nez Ar ci a. 108
* Byt es of empt y space on a di sk dr i ve. The dr i ve i s speci f i ed
* by t he dr i ve_code par amet er . DRI VE_CODE i s a numer i c
* f r om0 t o n. 0 i s t he def aul t i f code i s omi t t ed and
* i ndi cat es t he cur r ent l y sel ect ed dr i ve. 1 t o n r ef er ence
* dr i ves A t o x.
*
* count = DI SKSPACE( [ dr i ve_code] )
*
* count - numer i c.
* dr i ve_code - numer i c.
*
* Pl aced i n t he publ i c domai n by TomRet t i g Associ at es.
*
**/

#def i ne DEFAULT 0

CLI PPER DI SKSPACE( )
{
st r uct / * st r uct ur e t o hol d di sk i nf o */
{
unsi gned no_cl ust s; / * number of f r ee cl ust er s */
unsi gned secs_cl ust s; / * sect or s per cl ust er */
unsi gned cl ust s_dr v; / * t ot al cl ust er s per dr i ve */
} dr v_i nf o;

/ * i f t her e i s one par amet er and i t i s numer i c */
i f ( PCOUNT == 1 && I SNUM( 1) )
{
_dspace( _par ni ( 1) , &dr v_i nf o) ; / * speci f i ed dr i ve */
}
el se
_dspace( DEFAULT, &dr v_i nf o) ; / * def aul t dr i ve */

/ * byt es : : = number of cl ust er s t i mes sect or s
per cl ust er t i mes 512 */
_r et nl ( 512L * ( l ong) dr v_i nf o. secs_cl ust s *
( l ong) dr v_i nf o. no_cl ust s) ;
}


Cur so de Lenguaj e C - Por : I ng. Ani bal Mar t i nez Ar ci a. 109
ARCHIVOS ENCABEZADO DEL SISTEMA EXTENDIDO
/ ***
* nandef . h
*
* Nant ucket def i nes
*/

#def i ne FALSE 0
#def i ne TRUE 1

#def i ne NI L ' \ 0'
#def i ne NULL 0L

t ypedef unsi gned char byt e;
t ypedef unsi gned i nt quant ;
t ypedef i nt Bool ean;


/ ***
*ext end. h
*
*DEFI NEs and EXTERNs f or i nt er f aci ng wi t h Cl i pper f r omC.
*
*Lar ge model C onl y ( doubl e wor d poi nt er s t o code and dat a)
*
*Copyr i ght ( c) Nant ucket Cor por at i on 1987
*/

#def i ne CLI PPERvoi d pascal

/ * _par i nf o t ypes */
#def i ne UNDEF 0
#def i ne CHARACTER 1
#def i ne NUMERI C 2
#def i ne LOGI CAL 4
#def i ne DATE 8
#def i ne ALI AS 16
#def i ne MPTR 32
/ * or ' ed wi t h t ype when passed by r ef er ence */
#def i ne MEMO 64
#def i ne WORD 128
#def i ne ARRAY 512 / * par amet er count / t ype */
ext er n i nt _par i nf o( i nt ) ;
ext er n i nt _par i nf a( i nt , i nt ) ;

/ * par amet er val ues */
ext er n char *_par c( i nt , . . . ) ;
ext er n i nt _par csi z( i nt , . . . ) ;
ext er n i nt _par cl en( i nt , . . . ) ;
ext er n i nt _par ni ( i nt , . . . ) ;
ext er n l ong _par nl ( i nt , . . . ) ;

Cur so de Lenguaj e C - Por : Ani bal Mar t i nez Ar ci a. 110
ext er n doubl e _par nd( i nt , . . . ) ;
ext er n i nt _par l ( i nt , . . . ) ;
ext er n char *_par ds( i nt , . . . ) ;
/ * one and onl y one of t he _r et ?? f unct i ons must used */

/ * Cl i pper - f unct i on r et ur n val ues */
ext er n voi d _r et c( char *) ;
ext er n voi d _r et cl en( char *, i nt ) ;
ext er n voi d _r et ni ( i nt ) ;
ext er n voi d _r et nl ( l ong) ;
ext er n voi d _r et nd( doubl e) ;
ext er n voi d _r et l ( i nt ) ;
ext er n voi d _r et ds( char *) ;

/ * pr ocedur e ( DO) r et ur n */
ext er n voi d _r et ( voi d) ;


/ * al l ocat e memor y */
/ * par amet er : r equest ed si ze i n byt es */
/ * r et ur ns: f ar poi nt er t o memor y or NULL */
ext er n unsi gned char *_exmgr ab( unsi gned) ;

/ * f r ee al l ocat ed memor y */
/ * par amet er s: poi nt er f r om_exmgr ab( ) ,
same si ze passed t o _exmgr ab( ) */
ext er n voi d _exmback( unsi gned char *, unsi gned) ;

/ * mi sc. */
ext er n unsi gned st r l en( unsi gned char *) ;


/ * par amet er check macr os */
#def i ne PCOUNT( _par i nf o( 0) )
#def i ne I SCHAR( n) ( _par i nf o( n) & CHARACTER)
#def i ne I SNUM( n) ( _par i nf o( n) & NUMERI C)
#def i ne I SLOG( n) ( _par i nf o( n) & LOGI CAL)
#def i ne I SDATE( n) ( _par i nf o( n) & DATE)
#def i ne I SMEMO( n) ( _par i nf o( n) & MEMO)
#def i ne I SBYREF( n) ( _par i nf o( n) & MPTR)
#def i ne I SARRAY( n) ( _par i nf o( n) & ARRAY)
#def i ne ALENGTH( n) ( _par i nf a( n, 0) )

/ * Header st r uct ur e */
t ypedef st r uct
{
byt e si gnat ur e; / * 03 = dbf , 83 dbf +dbt */
byt e ymd[ 3] ; / * y+1900 md */
l ong l ast _r ec;
quant dat a_of f ;
quant r ec_si ze;

Cur so de Lenguaj e C - Por : I ng. Ani bal Mar t i nez Ar ci a. 111
byt e pad[ 20] ;
} DBF_HEADER;


ext er n DBF_HEADER *_dbf head( ) ;
ext er n i nt _dbf open( ) ;

Cur so de Lenguaj e C - Por : Ani bal Mar t i nez Ar ci a. 112

Anda mungkin juga menyukai