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: + - * / % << >> & ^ | ~
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.
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:
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. */
/ *** * 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