Está en la página 1de 27

Pgina1 de28 PROGRAMACINENLENGUAJEC

FCEFyN UniversidadNacionaldeCordoba

CAPTULOIII
INTRODUCCIN EllenguajeC,esunlenguajedeprogramacincreadoen1972porKenThompsonyDennisM.Ritchieen los Laboratorios Bell como evolucin del anterior lenguaje B, a su vez basado en BCPL. Al igual que B, es un lenguaje orientado a la implementacin de Sistemas Operativos, concretamente Unix. C es apreciado por la eficiencia del cdigo que produce y es el lenguaje de programacin ms popular para crear software de sistemas, aunque tambin se utiliza para crear aplicaciones y para la programacin de microcontroladoresdetodotipo. Se trata de un lenguaje dbilmente tipificado de medio nivel pero con muchas caractersticas de bajo nivel. Dispone de las estructuras tpicas de los lenguajes de alto nivel pero, a su vez, dispone de construcciones del lenguaje que permiten un control a muy bajo nivel. Los compiladores suelen ofrecer extensiones al lenguaje que posibilitan mezclar cdigo en ensamblador con cdigo C o acceder directamenteamemoriaodispositivosperifricos. La primera estandarizacin del lenguaje C fue en ANSI, con el estndar X3.1591989. El lenguaje que define este estndar fue conocido vulgarmente como ANSI C. Posteriormente, en 1990, fue ratificado como estndar ISO (ISO/IEC 9899:1990). La adopcin de este estndar es muy amplia por lo que, si los programascreadoslosiguen,elcdigoesporttilentreplataformasy/oarquitecturas.Enlaprctica,los programadores suelen usar elementos noporttiles dependientes del compilador o del sistema operativo. El presente texto tiene como objetivo hacer un extracto sobre el lenguaje, considerando su sintaxis, estructurayusodesusinstrucciones. ESTRUCTURADEUNPROGRAMAENC Un programa en C, consta de varias secciones en donde se determinarn que variables y funciones tendr el programa, as como la tarea que tendr que realizar. Su estructura est determinada por las partessiguientes: Instruccionesparaelcompilador Definicindeestructuras Definicindevariables Funciones

ProcesamientoDigitaldeSealesFCEFyNUNCPROGRAMACINENLENGUAJEC

Pgina2 de28 PROGRAMACINENLENGUAJEC Programaprincipal


FCEFyN UniversidadNacionaldeCordoba

Instruccionesparaelcompilador Laslneasqueseescribenenestaseccinindicanalcompiladorlarealizacindediferentestareascomo: ladefinicindenombres,tomasdedecisindurantelacompilacin,macroseinclusindearchivosentre otras. Todaslaslneasdelpreprocesadorinicianconelcarcter'#'.Porejemplo:


#include<stdio.h> #define PI 3.1416 /* Donde PI es el nombre de la etiqueta y su valor es 3.1416 */

Donde todos los caracteres que se encuentren entre "/*" y "*/", son tomados como comentarios y no tienenefectoparalacompilacin. Definicindeestructuras En esta rea se definen todas las estructuras que requiera el programa. Donde una estructura es la coleccindevariablesparalarepresentacindelproblemaqueseesttratando.Porejemplo:
struct esfera { float radio; float volumen; };

Definicindevariables Unavezcreadoslostiposyestructuras,seprocedealadefinicindelasvariables,quesonetiquetascon las cuales se tiene acceso a localidades de memoria para el almacenamiento de informacin durante la ejecucindelprograma. Unejemplodefinicindevariablees:
struct esfera A;

ProcesamientoDigitaldeSealesFCEFyNUNCPROGRAMACINENLENGUAJEC

Pgina3 de28 PROGRAMACINENLENGUAJEC Funciones Las funciones son conjuntos de instrucciones encargadas de la realizacin de tareas especficas. Su existenciapermitelarepresentacindelproblemaenfuncindelmodelodeprogramacinestructurada. Unafuncinquecalculaelvolumendeunaesferasepresentadelasiguientemanera:
void volum(void) { A.volumen= (4.0 / 3.0) * PI * A.radio * A.radio * A.radio; }

FCEFyN UniversidadNacionaldeCordoba

Programaprincipal El programa principal contiene las instrucciones y llamadas a funciones que se ejecutan en primera instancia. Siempre se tiene el nombre de "main". El programa principal para el clculo del volumen de unaesferapuedeserelsiguiente:
void main(void) { printf("\n\t Deme el radio de la esfera: "); scanf("%f",&A.radio); volum(); printf("\n\t El volumen de la esfera con radio %f, es: %f\n",A.radio,\ A.volumen); }

Observacin:Esdesumautilidadusartabuladoresparalaclaridaddelprograma. TIPOSYOPERADORES Tipos Las variables usadas en lenguaje C, pueden ser de varios tipos. stos, definirn el tamao en bytes de cadavariable.Lostiposqueexistentesson: void char short int Sinvalor Caracter Enterocorto Entero

ProcesamientoDigitaldeSealesFCEFyNUNCPROGRAMACINENLENGUAJEC

Pgina4 de28 PROGRAMACINENLENGUAJEC El tipo void permite declarar funciones que no regresan valores y tambin para la declaracin de apuntadoresgenricos,esdecircapacesdeapuntaracualquiertipodevariable. Ladeclaracindeunavariableemplealasintaxissiguiente:
Tipo nombre_variable, nombre_variable, nombre_variable = constante;

FCEFyN UniversidadNacionaldeCordoba

long float double signed

Enterolargo Flotante Flotantededobleprecisin Usasigno Sinsigno

unsigned

Enladeclaracindevariablessepuedendefinirunaomsvariablesdelmismotipoenelmismorengln, porejemplo:
int numero, altura, profundidad;

Todaslaslneasterminanconpuntoycoma(;).Tambinselespuedeasignarunvalorinicialenel momentodeladefinicin.Porejemplo:
char letra_inicial = 'J'; float elevacion = 2.43, x = 4.0;

Es importante mencionar que en el nombre de la variable se pueden emplear letras minsculas, maysculasyelcarcter'_'(lneadesubrayado). Tambinsepuedendefinirarreglosunidimensionalesymultidimensionales.
char nombre[30]; unsigned char meses[2][12] = { {31,28,30,31,30,31,30,31,31,30,31,30,31}, {31,28,30,31,30,31,30,31,31,30,31,30,31} };

Las cadenas de caracteres se representan usando doble comilla, por ejemplo: "Es un da soleado", mientras que para un solo carcter se emplea la comilla, por ejemplo: 'a', 'b', 'z'. Las cadenas de

ProcesamientoDigitaldeSealesFCEFyNUNCPROGRAMACINENLENGUAJEC

Pgina5 de28 PROGRAMACINENLENGUAJEC caracteres en C, se terminan con el carcter especial '\0'. Otros caracteres especiales (tambin se les denominasecuenciasdeescape)son: Estructuras Una estructura es una coleccin de variables que se agrupan bajo un una sola referencia. La sintaxis generales:
struct nombre_estructura { elemento 1; elemento 2; . . . } variable_struct;

FCEFyN UniversidadNacionaldeCordoba

'\a' carcterdealarma '\b' retroceso '\f' '\n' '\r' '\t' '\v' '\\' '\?' '\'' '\"' '\ooo' '\xhh' '\0' avancedehoja nuevalnea regresodecarro tabuladorhorizontal tabuladorvertical diagonalinvertida interrogacin apstrofo comillas nmerooctal nmerohexadecimal carcternulo

ProcesamientoDigitaldeSealesFCEFyNUNCPROGRAMACINENLENGUAJEC

Pgina6 de28 PROGRAMACINENLENGUAJEC Donde la palabra reservada es "struct", el nombre del conjunto de variables se pone en "nombre_estructura", se abre una llave y enseguida se ponen las variables (cada elemento, usa la declaracindevariablesmostradasenlaseccinTipos);alterminardedefinirtodosloselementos,se cierra la estructura con una llave. Hasta aqu, slo se ha definido la estructura, sin embargo no hay ningunainstancia(creacinfsica)delamisma.Portantosehacenecesariodefinirunavariablecuyotipo sealaestructurapredefinida. Usemoscomoejemplounaestructurayavista:
struct esfera { float radio; float volumen; }; struct esfera A;

FCEFyN UniversidadNacionaldeCordoba

Paraaccesaruncampodelaestructura,seusaelnombredelavariable,seguidaporunpuntoydespus porelnombredelcampoquesevaausar.
A.radio = 4.0; A.volumen = 4332.8998;

Uniones Existe la posibilidad de usar de manera ms eficiente la memoria de la computadora, esto se puede lograrempleandoladefinicindeunin.Lasintxisessimilaraladelaestructura.
union nombre_de_la_union { elemento 1; elemento 2; . . . } variable_union;

Ladiferenciaestriba,enque,enestecasolasvariablessesolapan.Porejemplo:
union libros { char inicial; int num; } lib;

En este caso la unin emplea 2 bytes para la variable "num", y uno de esos bytes se emplea para la variable"inicial",portanto,nohay3bytesenladefinicin,sinoslodos. Enumeraciones ProcesamientoDigitaldeSealesFCEFyNUNCPROGRAMACINENLENGUAJEC

Pgina7 de28 PROGRAMACINENLENGUAJEC Laenumeracinesunalistadevaloresposiblesquepuedetomarunavariable.Porejemplo:


enum ciudades Mxico, Zacatecas, Guanajuato, Nayarit; enum ciudades ciud;

FCEFyN UniversidadNacionaldeCordoba

Donde"ciud"slopuedetomarcualquieradelosnombredadosenladeclaracinprevia. Modificadoresdealmacenamiento Con los modificadores de almacenamiento se altera la forma en que se crea el almacenamiento. Los modificadoresson:extern,auto,register,const,volatileystatic. Modificador"extern" Seempleacuandounprogramaseencuentradivididoenvariosarchivos.Comolasvariablesslose definenunavez,sehacenecesariohacerreferenciadeellasenlosarchivosqueaslorequieran. Lasintaxises:
extern tipo la_variable; /* Se debe indicar tambin el tipo de la variable o funcin */

Sedicequeestetipodevariablestienen"ligaexterna". Modificador"auto" Todas las variables son "auto" por omisin, y son objetos locales a un bloque y al salir de ste son descartadas. Modificador"register" Los objetos declarados como "register" son automticos y sus valores se almacenan en registros del microprocesadordelacomputadora. Modificador"const" Lasvariablesdetipo"const"nopuedencambiarseporelprogramadurantelaejecucin. Una variable "const" recibir su valor desde una inicializacin explcita o por medio de alguna dependenciadelhardware. Modificador"volatile"

ProcesamientoDigitaldeSealesFCEFyNUNCPROGRAMACINENLENGUAJEC

Pgina8 de28 PROGRAMACINENLENGUAJEC Las variables modificadas por "volatile" indican que stas pueden ser modificadas de forma no explcita por el programa. Por ejemplo: se podra guardar la hora exacta en una variable y que la asignacin la hicieralarutinadeatencinalainterrupcindelreloj. Modificador"static" Se usa para mantener una variable local en existencia durante la ejecucin de un programa, de manera quenosetienequecrearydestruircadavezqueseencuentraalarutinadondeestdeclarada. Operadores Lostiposdeoperadoresqueexistenson:aritmticos,derelacinylgicos,deincrementoydecremento, paramanejodebits,deasignacinyexpresiones,expresionescondicionales. Operadoresaritmticos Losoperadoresaritmticosbinariosson'+','','*','/'y'%'.Susignificadosemuestraacontinaucin: + Sumadedosoperandos Restaentredosoperandos
FCEFyN UniversidadNacionaldeCordoba

* Multiplicacindedosoperandos / Divisinentredosoperandos

% Mdulo entre dos operandos. Da el residuo de la divisin resultante entre el operando1 (numerador)yeloperando2(denominador).

Lasistxises:
operando1 operador operando2

Ladivisinenteratrucacualquierpartefraccionaria. Operadoresderelacinylgicos Losoperadoresderelacinson:'>',">=",'<',"<=","=="y"!=". > Mayorque >= Mayoroigual < Menorque

ProcesamientoDigitaldeSealesFCEFyNUNCPROGRAMACINENLENGUAJEC

Pgina9 de28 PROGRAMACINENLENGUAJEC <= Menoroigual == Idntico != Diferentea


FCEFyN UniversidadNacionaldeCordoba

Losoperadoreslgicosson:"&&"y"||" && || Y

El resultado del uso de estos operadores puede ser falso o verdadero. Se considera como falso el valor decero,ycomoverdadero,todoaquelvalordiferentedecero. Lasistxises:
operando1 operador operando2

Operadoresdeincrementoydecremento Los operadores de incremento y decremento, aaden o quitan una unidad al operando que estn afectando,respectivamente.Detalmaneraque: ++i;esequivalentea:i=i+1;ydespusseempleaelvalordei i++;esequivalentea:seusaelvalordei,enseguidaseincrementa i; i; significa:i=i1;ydespusseusaelvalordei significa:seusaelvalordei,enseguidasedecrementaenuno

Comonotaimportantesedebeponernfasisenlaprecedenciadecadaexpresin. Operadoresparamanejodebits Losoperadoresparamanejodebitsson: & ANDdebits. Ejemplo:0x0F&0xFE=>0x0E Ejemplo:0x1E|0x01=>0x1F Ejemplo:0xF0^0x02=>0xF2 Ejemplo0x02<<2=>0x08 Ejemplo0x04>>2=>0x01

| ORinclusivodebits. ^ ORexlusivodebits.

<< Corrimientoalaizquierda. >> Corriemintoaladerecha.

ProcesamientoDigitaldeSealesFCEFyNUNCPROGRAMACINENLENGUAJEC

Pgina10 de28 PROGRAMACINENLENGUAJEC ~ Complementoauno(unario). Ejemplo~0xF0=>0x0F


FCEFyN UniversidadNacionaldeCordoba

Operadoresdeasignacinyexpresiones Eloperadordeasignacin'=',seusacomosemuestraenseguida:
x = 5 + 4;

Ypuedeintrepetarsecomo:elresultadodesumar5+4seasignaalavariablex. Tambin se puede usar para la suma de dos variables y que el resultado quede en una tercera. Por ejemplo:
x = y / z;

Supongamos,
x = 4;

Cuandosetienex=x+5,primerosesumaaxel5queimplicaqueseobtengaelnmero9,ydespusse asignaax.Portantoelvalorfinaldexesidnticoa9(x==9). Otra forma de expresar lo anterior es: x += 5 que es equivalente a x = x + 5. De esta manera "+=" es un operadordeasignacin. Engeneralsepuededecirque:
expresin1 op= expresin2

equivalea
expresin1 = (expresin1) op (expresin2)

Precedenciayasociatividaddeoperadores Laprecedenciayasociatividaddelosoperadoressemuestraenlatablasiguiente. Nota: Los operadores que estn en la misma lnea tienen la misma precedencia; los renglones estn en ordendeprecendenciadecreciente,porejemplo,'*','/',y'%'todostienenlamismaprecedencia,lacual esmsaltaquelade'+'y''binarios.El"operador"()serefierealallamadaaunafuncin. Operadores Asociatividad

ProcesamientoDigitaldeSealesFCEFyNUNCPROGRAMACINENLENGUAJEC

Pgina11 de28 PROGRAMACINENLENGUAJEC ()[] izquierdaaderecha derechaaizquierda izquierdaaderecha izquierdaaderecha izquierdaaderecha izquierdaaderecha izquierdaaderecha izquierdaaderecha izquierdaaderecha izquierdaaderecha izquierdaaderecha izquierdaaderecha derechaaizquierda derechaaizquierda izquierdaaderecha
FCEFyN UniversidadNacionaldeCordoba

!~+++*&(tipo)sizeof */% + <<>>

<<=>>= ==!= & ^ | && || ?:

=+==*=/=%=&=^=|=<<=>>= ,

Conversindetipos Cuando un operador tiene operandos de tipos diferentes, stos se convierten a un tipo comn de acuerdoconunreducidonmerodereglas.Estasreglasson: Sicualquieroperandoeslongdouble,convirtaseelotroalongdouble. Deotramanera,sicualquieroperandoesdouble,convirtaseelotroadouble. Deotramanera,sicualquieroperandoesfloat,convirtaseelotroafloat. Deotramanera,convirtasecharyshortaint. Despus,sicualquieroperandoeslong,convirtaseelotroalong.

Tambinsepuedeconvertirdeuntipo aotrousandoeloperador"cast".Que consisteenanteponerala variableofuncineltipoquesedesea.Paraelloseusanparntesis.Porejemplo:

ProcesamientoDigitaldeSealesFCEFyNUNCPROGRAMACINENLENGUAJEC

Pgina12 de28 PROGRAMACINENLENGUAJEC


char caracter; int entero; entero = (int) caracter;

FCEFyN UniversidadNacionaldeCordoba

CONTROLDEFLUJO Mediante las proposiciones de control de flujo se indica el orden en que se realizar el proceso. Las expresionesvistasanteriormente,sevuelvenproposicionescuandoseterminanconpuntoycoma';'.Las llaves '{', '}' se emplean para agrupar declaraciones y proposiciones dentro de una proposicin compuesta o bloque. Para el control del programa existen las proposiciones siguientes: ifelse, elseif, switch,while,forydowhile. ifelse Laproposicinifelseseusaparaexpresardecisiones.Lasintxises:
if(expresin) proposicin1; else proposicin2;

Si la expresin es verdadera, se ejecuta la proposicin1, de lo contrario se realiza la proposicin 2. No es indispensableelelse,esdecir,sepuedetenerunaproposicindelaforma:


if (expresin) proposicin1;

Se debe hacer notar que la proposicin1 o la proposicin2, pueden ser proposiciones compuestas o bloques.Porejemplo:
if( x == 1 ) { y = r*j; printf("El resultado de y es: %u", y); } else { printf("Se tiene un valor incorrecto de x"); printf("Vuelva a repetir los pasos 1 al 8"); }

Expresionescondicionales Otraformadeescribirlaproposicinifelseesusandounaexpresincondicional.
expresin1 ? expresin2 : expresin 3

ProcesamientoDigitaldeSealesFCEFyNUNCPROGRAMACINENLENGUAJEC

Pgina13 de28 PROGRAMACINENLENGUAJEC Queesequivalentea:


if( expresin1 ) expresin2; else expresin3;

FCEFyN UniversidadNacionaldeCordoba

Nota:Silasexpresiones2y3soncompuestas,cadaproposicindebeestarseparadaporcoma','.Por ejemplo:
(A.radio > 4) ? printf("\n Funciona\n"), printf("A ver??\n") : printf("\n Es ms pequeo");

elseif Conestaexpresinsecomplementalaexpresinvistaenelpuntoanterior.Susintaxises:
if( expresin ) proposicin; else if( expresin ) proposicin; else if( expresin ) proposicin; else if( expresin ) proposicin; else proposicin;

Mediante esta expresin se puede seleccionar una condicin muy especfica dentro de un programa, es decir,queparallegaraellasehayatenidolanecesidaddelcumplimientodeotrascondiciones. switch La proposicin switch, permite la decisin mltiple que prueba si una expresin coincide con uno de los valoresconstantesenterosquesehayandefinidopreviamente. Susintxises:
switch( expresin ) { case exp-const: proposiciones break; case exp-const: proposiciones break; case exp-const: case exp-const: proposiciones

ProcesamientoDigitaldeSealesFCEFyNUNCPROGRAMACINENLENGUAJEC

Pgina14 de28 PROGRAMACINENLENGUAJEC


break; default: proposiciones }

FCEFyN UniversidadNacionaldeCordoba

Secomparala"expresin"concadaunadelasopciones"expconst",yenel momentodeencontraruna constate idntica se ejecutan las proposiciones correspondientes a ese caso. Al terminar de realizar las proposicionesdelcaso,sedebeusarlapalabrareservada"break"paraquevayaalfinaldelswitch. Si ninguno de los casos cumplen con la expresin, se puede definir un caso por omisin, que tambin puedetenerproposiciones. En todos los casos pueden ser proposiciones simples o compuestas. En las compuestas se usan llaves paradefinirelbloque. while La proposicin "while" permite la ejecucin de una proposicin simple o compuesta, mientras la "expresin"seaverdadera.Susintaxises:
while( expresin ) proposicin

Porejemplo,
while( (c = getchar()) == 's' || c == 'S' ) printf("\nDesea salir del programa?"); while( (c = getchar()) == 's' || c == 'S' ) { printf("\nDesea salir del programa?"); ++i; printf("\nNmero de veces que se ha negado a salir: %u",i); }

for La proposicin "for" requiere tres expresiones como argumento. Las expresin1 y la expresin3 comnmente se emplean para asignaciones, mientras que la expresin2 es la condicin que se debe cumplirparaqueelciclo"for"sesigaejecutando. Lasintxises:
for(expresin1; expresin2; expresin3) proposicin

Ejemplo:
for(i=0; i <= 500; ++i) printf("\nEl nmero par # %i, es: %i", (2*i), i);

ProcesamientoDigitaldeSealesFCEFyNUNCPROGRAMACINENLENGUAJEC

Pgina15 de28 PROGRAMACINENLENGUAJEC dowhile La proposicin "dowhile" es similar a la proposicin "while", se ejecuta el ciclo mientras se cumpla la condicindadaen"expresin". La diferencia estriba en que en el "dowhile" siempre se evala al menos una vez su "proposicin", mientrasqueenel"while"sinosecumplela"expresin"noentraalciclo. Sintxis:
do proposicin while( expresin );

FCEFyN UniversidadNacionaldeCordoba

Ejemplo:
i=0; do { printf("\nEl nmero par ++i; } while( i < 500 ); # %i, es: %i", (2*i), i);

breakycontinue Cuando se quiere abandonar un ciclo en forma prematura debido a que ciertas condiciones ya se cumplieron, se puede usar la proposicin "break". sta sirve par las proposiciones "for", "while" y "do while". Tambinsetieneotraproposicinrelacionada,yestaesel"continue";sufuncinesladeocasionarla prximaiteracindelciclo. Ejemplos:
for(h=1; h <= 1000; ++h) { if( h%5 == 0 ) continue; printf("Nmero que no es mltiplo de 5: %i", h); } while(1) { if( getchar() == '$' ) break; printf("\nNo puedo parar, hasta que presione \'$\'"); }

ProcesamientoDigitaldeSealesFCEFyNUNCPROGRAMACINENLENGUAJEC

Pgina16 de28 PROGRAMACINENLENGUAJEC FUNCIONES Lasfuncionessonfragmentosdeunprogramaquerealizantareasespecficas.Estopermitedarclaridad alprogramayfacilitasumantenimiento. Lasintxisdelasfuncioneses:


tipo nombre_funcin (tipo argumento) { expresin1: expresin2; expresin3; . . }

FCEFyN UniversidadNacionaldeCordoba

El"tipo"determinalaclasedevariable queregresarlafuncin. Lostiposdefinidosparalasvariablesen laseccin3.1sonaplicablesalasfunciones. El "nombre_funcin" deber ser nico en todo el programa y no se podrn usar ni palabras reservadas dellenguaje,nifuncionesyapreestablecidasenlaslibrerasdelcompilador. A una funcin se le pueden pasar argumentos, con el fin de que con esos valores se realicen clculos especficos.Losargumentosseseparanporcomas.Porejemplo:
void integra(float x, float dx, float lim_inf, float lim_sup) { . . }

El paso de argumentos entre funciones puede ser por valor o por direccin. Finalmente, las funciones puedenregresarunresultado,esdecir,quealfinalizarlaejecucindelafuncinseprodujoundatoque se va a usar posteriormente dentro del programa y por ello es necesario que sea dado como respuesta. Pararealizarestoseemplealapalabrareservada"return".Porejemplo:
float cuadrado(float x) { float y; y = x * x; return(y); } void main(void) { float xx, yy, rr; . . . rr = sqrt( (cuadrado(xx) + cuadrado(yy)) );

ProcesamientoDigitaldeSealesFCEFyNUNCPROGRAMACINENLENGUAJEC

Pgina17 de28 PROGRAMACINENLENGUAJEC


printf("\nEl valor de la hipotenusa es: %f", rr); }

FCEFyN UniversidadNacionaldeCordoba

La funcin "main", es la rutina principal de un programa en C. A partir de ella se llaman al resto de las funciones. Nota:Unafuncinpuedellamaraotrafuncin.EnlenguajeCexistelarecursin. APUNTADORESOPUNTEROS Una variable puede ser usada por su nombre o por la direccin donde est el contenido de la variable. Cmosepuedenusarlasdireccionesdelasvariables?Bueno,medianteapuntadores. Sintxis:
tipo *nombre_variable;

Ladiferenciaentreunadeclaracindeunavariablenormalyunpunteroeselusodelasterisco.Paraque quedeclaroqueesunpunterosepresentalasiguienteanaloga: Imagneseunlibro,ste,tienehojasycadaunadeellasestnumerada.Ahora,supongamosquetieneun ndicealfinaldelmismoysedeseahallarinformacinrelacionadaconelajedrez.Alencontrarlapalabra ajedrez en el ndice se tiene el nmero de pgina; en ese momento se cae en la cuenta de la necesidad deuna hoja para escribir esa informacin; enseguida se toma la hoja y se anota la pgina. Acto seguido se va a la pgina marcada con el nmero encontrado y se lee la informacin. En este caso el apuntador serlahojaconelnmeroescritoenella. Bien,regresandoallenguajeC,cuandosedeclara"nombre_variable"seindicaquesetienenecesidadde un lugar donde se pueda escribir y que ste sea de tipo determinado (que en el ejemplo precedente pudiera ser un pizarrn, una hoja, la pared, etc.). Sin embargo el objeto no est disponible an, por ello se requiere de una instruccin adicional que indique la accin de tomar la hoja y tenerla dispuesta para suuso. Unejemploconcretosera:
#include <stdlib.h> char *caracter; void main(void) {

ProcesamientoDigitaldeSealesFCEFyNUNCPROGRAMACINENLENGUAJEC

Pgina18 de28 PROGRAMACINENLENGUAJEC


. caracter = (char *)malloc(sizof(char)); . *caracter = 'O'; }

FCEFyN UniversidadNacionaldeCordoba

La etiqueta "caracter" es el lugar en el que se puede escribir la direccin donde est la informacin que requerimos, (char *) indica el tipo de variable que va a ser, es decir apuntador a char (en nuestro ejemplo del libro: tipo hoja que tendr nmeros de pgina),mientras que "*caracter" apunta directamentealcontenidodelavariable(lahojaconelnmerodepgina). Para tomar un espacio de memoria de la computadora que sirva para fines de almacenar direcciones se debe incluir la cabecera o "header" stdlib.h, despus se declara la variable y luego se asigna memoria mediantelafuncin"malloc". La funcin malloc asigna memoria y usa como argumento el nmero de bytes que se quieran usar. Por eso se pone sizeof(char), donde la funcin sizeof, regresa el tamao del tipo que se pone como argumento. Finalmente, para que exista consistencia entre tipos, se usa el operador cast (char *) para indicarquelavariablecontendrdireccionesparaencontrarunchar. Si se ha definido una variable de manera "normal" (que no se haya definido como apuntador), tambin sepuedeusarsudireccin.Paraelloseanteponeelcaracter'&'alavariableusada. Porejemplo:
float x, *y; void main(void) { x = 4.3; y = &x; printf("El valor de y es: %f", *y); }

Elresultadodelprintfserquey=4.3; ELPREPROCESADORDEC Unindelneas Laslneasqueterminanconelcarcterdiagonalinvertida'/'seempalmaneliminandoladiagonalinversa yelcarcternuevalnea.

ProcesamientoDigitaldeSealesFCEFyNUNCPROGRAMACINENLENGUAJEC

Pgina19 de28 PROGRAMACINENLENGUAJEC Definicinyexpansindemacros Medianteunamacrosepuedendefiniretiquetasquevansersustituidasentiempodecompilacin dentrodelprograma. Lasintxisescomosigue:


# define identificador secuencia-de-tokens # define identificador (lista-de-identificadores) secuencia-de-tokens # undef identificador

FCEFyN UniversidadNacionaldeCordoba

Estaltimadefinicinhacequeelpreprocesadorolvideladefinicindelidentificador. Ejemplos:
#define TABSIZE 100 #define ABSDIFF(a,b) ((a)>(b) ? (a)-(b) : (b)-(a))

Enelcasodelpreprocesadorlasexpresionesnoterminanconpuntoycoma. Inclusindearchivos Medianteestasdirectivasunarchivocompletoseincluyeenelprogramaactual.


# include <nombre-de-archivo> /* Pone el archivo segn la ruta indicada por el sistema */ # include "nombre-de-archivo" /* Busca el archivo en el directorio actual, y si no lo encuentra busca en la ruta indicada por el sistema */ # include secuencia-de-tokens /* Expande la secuencia de tokens como texto normal */

Compilacincondicional Estas directivas permiten tomar acciones al preprocesador en funcin de condiciones iniciales de ambiente. Uno de los usos ms frecuentes de las macros es para establecer bloques de compilacin opcionales.Comandos#ifdef,#ifndef,#else,#endif,#undef.Porejemplo:
preprocesador-condicional: lnea-if texto partes-elif parte-else opt #endif

ProcesamientoDigitaldeSealesFCEFyNUNCPROGRAMACINENLENGUAJEC

Pgina20 de28 PROGRAMACINENLENGUAJEC


lnea-if: # if expresin-constante # ifdef identificador # ifndef identificador partes-elif: lnea-elif texto partes-elif (opt) lnea-elif: # elif expresin-constante parte-else: # lnea-else texto lnea-else: #else

FCEFyN UniversidadNacionaldeCordoba

Ejemplo1:
#define NUMERO 2 #ifdef NUMERO #define #define #else #define #define #endif == 1 VAR_TOKEN conver(x) VAR_TOKEN conver(x) 100 (x + 5) 200 (x +6)

Ejemplo2:
#define COMP_HOLA void main() { // si est definida la macro llamada COMP_HOLA #ifdef COMP_HOLA printf("hola"); #else // si no es as printf("adios"); #endif }

En el caso del Ejemplo 2, el cdigo que se compilar ser printf("hola") en caso de estar definida la macroCOMP_HOLA;encasocontrario,secompilarlalneaprintf("adios").Estacompilacincondicional seutilizaconfrecuenciaparadesarrollarcdigoportableavariosdistintostiposdecomputadores;segn de qu computador se trate, se compilan unas lneas u otras. Para eliminar una macro definida previamenteseutilizaelcomando#undef:

ProcesamientoDigitaldeSealesFCEFyNUNCPROGRAMACINENLENGUAJEC

Pgina21 de28 PROGRAMACINENLENGUAJEC


#undef COMP_HOLA

FCEFyN UniversidadNacionaldeCordoba

Deformasimilar,elcomando#ifndefpreguntaporlanodefinicindelamacrocorrespondiente.Unuso muy importante de los comandos #ifdef y #ifndef es para evitar comandos #include del mismo fichero repetidosvariasvecesenunmismoprograma. Controldelnea Ocasiona que el compilador suponga que el nmero de lndea de la siguiente lnea fuente est dado por la constante entera decimal y que el archivo actual de entrada est nombrado por el identificador, todo estoparpropsitodediagnsticodeerrores.
# line constante "nombre-de-archivo" # line constante

Generacindeerrores Ocasionaqueelpreprocesadorescribaunmansajedediagnsticoqueincluyela"secuenciadetokens".
# error secuencia-de-tokens (opt)

Pragmas Realizaaccionesdependiendodelaimplantacin.
# pragma secuencia-de-tokens (opt)

Directivanula Unalneadelpreprocesadordelaforma
#

notieneefecto. Nombrespredefinidos __LINE__ __FILE__ compilando. __DATE__ ddaaaa". Constantedecimalquecontieneelnmerodelneaactual. Cadenaliteralquecontieneelnombredelarchivoqueseest

Cadenaliteralquecontienelafechadecompilacin,enlaforma"Mmm

ProcesamientoDigitaldeSealesFCEFyNUNCPROGRAMACINENLENGUAJEC

Pgina22 de28 PROGRAMACINENLENGUAJEC __TIME__ "hh:mm:ss". Cadenaliteralquecontienelahoradelacompilacin,enlaforma


FCEFyN UniversidadNacionaldeCordoba

__STDC__ Laconstante1.Esteidentificadorserdefinidocomo1sloen implantacionesqueconformanelestndar.

OTROSASPECTOSDELLENGUAJEC Typedef Esta palabra reservada del lenguaje C sirve para la creacin de nuevos nombres de tipos de datos. Mediante esta declaracin es posible que el usuario defina una serie de tipos de variables propios, no incorporados en el lenguaje y que se forman a partir de tipos de datos ya existentes. Por ejemplo, la declaracin:
typedef int ENTERO;

defineuntipodevariablellamadoENTEROquecorrespondeaint. Comoejemplomscompleto,sepuedendeclararmediantetypedeflassiguientesestructuras:
#define MAX_NOM 30 #define MAX_ALUMNOS 400 struct s_alumno { // se define la estructura s_alumno char nombre[MAX_NOM]; short edad; }; typedef struct s_alumno ALUMNO; // ALUMNO es un nuevo tipo de variable typedef struct s_alumno *ALUMNOPTR; struct clase { ALUMNO alumnos[MAX_ALUMNOS]; char nom_profesor[MAX_NOM]; }; typedef struct clase CLASE; typedef struct clase *CLASEPTR;

Con esta definicin se crean las cuatro palabras reservadas para tipos, denominadas ALUMNO (una estructura), ALUMNOPTR (un puntero a una estructura), CLASE y CLASEPTR. Ahora podra definirse una funcindelsiguientemodo:
int anade_a_clase(ALUMNO un_alumno, CLASEPTR clase) { ALUMNOPTR otro_alumno; otro_alumno = (ALUMNOPTR) malloc(sizeof(ALUMNO)); otro_alumno->edad = 23;

ProcesamientoDigitaldeSealesFCEFyNUNCPROGRAMACINENLENGUAJEC

Pgina23 de28 PROGRAMACINENLENGUAJEC


... clase->alumnos[0]=alumno; ... return 0; }

FCEFyN UniversidadNacionaldeCordoba

Elcomandotypedefayudaaparametrizarunprogramacontraproblemasdeportabilidad.Generalmente seutilizatypedefparalostiposdedatosquepuedenserdependientesdelainstalacin.Tambinpuede ayudaradocumentarelprograma(esmuchomsclaroparaelprogramadoreltipoALUMNOPTR,queun tipodeclaradocomounpunteroaunaestructuracomplicada),hacindolomslegible. Funcionesrecursiva Larecursividadeslaposibilidaddequeunafuncinsellameasmisma,biendirectaoindirectamente. Unejemplotpicoeselclculodelfactorialdeunnmero,definidoenlaforma:


N! = N * (N-1)! = N * (N-1) (N-2)! = N * (N-1)*(N-2)*...*2*1

Lafuncinfactorial,escritadeformarecursiva,seracomosigue:
unsigned long factorial(unsigned long numero) { if ( numero == 1 || numero == 0 ) return 1; else return numero*factorial(numero-1); }

SupngaselallamadaaestafuncinparaN=4,esdecirfactorial(4).Cuandosellameporprimeravezala funcin, la variable numero valdr 4, y por tanto devolver el valor de 4*factorial(3); pero factorial(3) devolver 3*factorial(2); factorial(2) a su vez es 2*factorial(1) y dado que factorial(1) es igual a 1 (es importante considerar que sin ste u otro caso particular, llamado caso base, la funcin recursiva no terminaranuncadellamarseasmisma),elresultadofinalser4*(3*(2*1)). Por lo general la recursividad no ahorra memoria, pues ha de mantenerse una pila7 con los valores que estn siendo procesados. Tampoco es ms rpida, sino ms bien todo lo contrario, pero el cdigo recursivoesmscompactoyamenudomssencillodeescribirycomprender. Gestindinmicadelamemoria Segn lo visto hasta ahora, la reserva o asignacin de memoria para vectores y matrices se hace de forma automtica con la declaracin de dichas variables, asignando suficiente memoria para resolver el problema de tamao mximo, dejando el resto sin usar para problemas ms pequeos. As, si en una funcin encargada de realizar un producto de matrices, stas se dimensionan para un tamao mximo

ProcesamientoDigitaldeSealesFCEFyNUNCPROGRAMACINENLENGUAJEC

Pgina24 de28 PROGRAMACINENLENGUAJEC (100, 100), con dicha funcin se podr calcular cualquier producto de un tamao igual o inferior, pero aun en el caso de que el producto sea por ejemplo de tamao (3, 3), la memoria reservada corresponder al tamao mximo (100, 100). Es muy til el poder reservar ms o menos memoria en tiempodeejecucin,segneltamaodelcasoconcretoquesevayaaresolver.Aestosellamareservao gestindinmicadememoria. ExistenenCdosfuncionesquereservanlacantidaddememoriadeseadaentiempodeejecucin.Dichas funciones devuelven es decir, tienen como valor de retorno un puntero a la primera posicin de la zona de memoria reservada. Estas funciones se llaman malloc() y calloc(), y sus declaraciones, que estn enlalibrerastdlib.h,soncomosigue:
void *malloc(int n_bytes) void *calloc(int n_datos, int tamao_dato)

FCEFyN UniversidadNacionaldeCordoba

Lafuncinmalloc()buscaenlamemoriaelespaciorequerido,loreservaydevuelveunpunteroalprimer elementodelazonareservada.Lafuncincalloc()necesitadosargumentos: elndeceldasdememoriadeseadasyeltamaoenbytesdecadacelda;sedevuelveunpunteroala primeraceldadememoria.Lafuncincalloc()tieneunapropiedadadicional:inicializatodoslosbloques acero. Existetambinunafuncinllamadafree()quedejalibrelamemoriareservadapormalloc()ocalloc()y queyanosevaautilizar.Estafuncinusacomoargumentoelpunterodevueltoporcalloc()omalloc(). Lamemorianoseliberapordefecto,sinoqueelprogramadortienequeliberarlaexplcitamenteconla funcinfree().Elprototipodeestafuncineselsiguiente:


void free(void *)

Acontinuacinsepresentaunejemplodegestindinmicadememoriaparaelproductodematrizpor vector{y}=[a]{x}.Hayquetenerencuentaquereservandomemoriaporseparadoparacadafiladela matriz,nosegarantizaquelasfilasestncontiguasenlamemoria.Porotraparte,deestaformase puedenconsiderarfilasdedistintotamao.Elnombredelamatrizsedeclaracomopunteroavectorde punteros,ylosnombresdelosvectorescomopunteros(recurdeselafigura6.1).SupngasequeNes unaconstantesimblicapredefinidaconelnmerodefilas.


// declaraciones double **a, *x, *y; void prod(int , double **, double *, double *); ... // reserva de memoria para la matriz a a = calloc(N, sizeof(double *)); for (i=0; i<N; i++) a[i]=calloc(N, sizeof(double)); ...

ProcesamientoDigitaldeSealesFCEFyNUNCPROGRAMACINENLENGUAJEC

Pgina25 de28 PROGRAMACINENLENGUAJEC


// reserva de x = calloc(N, y = calloc(N, ... prod(N, a, x, ... // definicion void prod(int {...} memoria para los vectores x e y sizeof(double); sizeof(double); y); de la funcion prod() N, double **mat, double *x, double *y)

FCEFyN UniversidadNacionaldeCordoba

Congestindinmicadememoriaesmsfcilutilizarmatricesdefinidascomovectoresdepunterosque matrices autnticas (tambin stas podran utilizarse con memoria dinmica: bastara reservar memoria para las N filas a la vez y asignar convenientemente los valores al vector de punteros a[i]). El ejemplo anteriorquedaradelsiguientemodo:
// declaraciones double **a, *x, *y; void prod(int , double **, double *, double *); ... // reserva de memoria para el vector de punteros a[] a = calloc(N, sizeof(double *)); // reserva de memoria para toda la matriz a[][] a[0] = calloc(N*N, sizeof(double)); // asignacin de valor para los elementos del vector de punteros a[] for (i=1; i<N; i++) a[i] = a[i-1]+N; // el resto del programa sera idntico ...

LASLIBRERASDELLENGUAJEC Acontinuacinseincluyenenformadetablaalgunasdelasfuncionesdelibreramsutilizadasenel lenguajeC.

ProcesamientoDigitaldeSealesFCEFyNUNCPROGRAMACINENLENGUAJEC

Pgina26 de28 PROGRAMACINENLENGUAJEC


FCEFyN UniversidadNacionaldeCordoba

Nota:Lacolumnatiposerefierealtipodelacantidaddevueltaporlafuncin.Unasteriscodenota puntero,ylosargumentosqueaparecenenlatablatienenelsignificadosiguiente: cdenotaunargumentodetipocarcter. ddenotaunargumentodedobleprecisin. fdenotaunargumentoarchivo.

ProcesamientoDigitaldeSealesFCEFyNUNCPROGRAMACINENLENGUAJEC

Pgina27 de28 PROGRAMACINENLENGUAJEC BIBLIOGRAFA Kernighan, B. W. and Ritchie, D. M., 1998. The C Programming Language. 2nd Edition. Prentice Hall SoftwareSeries. EstndarInternacionalISO/IEC9899:TC3EstandarANSIC99. http://www.openstd.org/JTC1/SC22/WG14/www/docs/n1256.pdf LenguajedeprogramacinC.Wikipedia.http://es.wikipedia.org/wiki/Biblioteca_C#Biblioteca_C idenotaunargumentoentero. ldenotaunargumentoenterolargo. pdenotaunargumentpuntero. sdenotaunargumentocadena. udenotaunargumentoenterosinsigno.
FCEFyN UniversidadNacionaldeCordoba

ProcesamientoDigitaldeSealesFCEFyNUNCPROGRAMACINENLENGUAJEC

También podría gustarte