Está en la página 1de 37

LENGUAJE C El lenguaje C es uno de los ms rpidos y potentes que hay hoy en da.

Algunos dicen que est des asado y que el uturo es Ja!a. No se si tendr uturo pero est claro que presente si tiene. No hay ms que decir que el sistema operati!o Linu" est desarrollado en C en su prctica totalidad. As que creo que no s#lo no perdemos nada aprendiendolo sino que ganamos mucho. $ara empe%ar nos ser!ir como &ase para aprender C'' e introducirnos en el mundo de la programaci#n (indo)s. *i optamos por Linu" e"iste una &i&lioteca llamada gt+ ,o li&rera- como pre ieras. que permite desarrollar aplicaciones estilo )indo)s con C. No de&emos con undir C con C''- que no son lo mismo. *e podra decir que C'' es una e"tensi#n de C. $ara empe%ar en C'' con!iene tener una s#lida &ase de C. E"isten otros lenguajes como /isual 0asic que son muy sencillos de aprender y de utili%ar. Nos dan casi todo hecho. $ero cuando queremos hacer algo complicado o que sea rpido de&emos recurrir a otros lenguajes ,c''- delphi-..... $ECUL1A213A3E* Una de las cosas importantes de C que de&es recordar es que es Case *ensiti!e ,sensi&le a las may4sculas o algo as.. Es decir que para C no es lo mismo escri&ir $rint que print . Con!iene indicar tam&i5n que las instrucciones se separan por 676. C89$1LA382E* 3E C Un compilador es un programa que con!ierte nuestro c#digo uente en un programa ejecuta&le. El ordenador tra&aja con : y ;. *i escri&i5ramos un programa en el lenguaje del ordenador nos !ol!eramos locos. $ara eso estn lenguajes como el C. Nos permiten escri&ir un programa de manera que sea cil entenderlo por una persona ,el c#digo uente.. Luego es el compilador el que se encarga de con!ertirlo al complicado idioma de un ordenador. En la practica a la hora de crear un programa nosotros escri&imos el c#digo uente- en nuestro caso en C- que normalmente ser un ichero de te"to normal y corriente que contiene las instrucciones de nuestro programa. Luego se lo pasamos al compilador y este se encarga de con!ertirlo en un programa. *i tenemos el c#digo uente podemos modi icar el programa tantas !eces como queramos ,s#lo tenemos que !ol!er a compilarlo.- pero si tenemos el ejecuta&le inal no podremos cam&iar nada ,realmente s se puede pero es mucho ms complicado y requiere ms conocimientos.. EL E31<82 El compilador en s mismo s#lo es un programa que traduce nuestro c#digo uente y lo con!ierte en un ejecuta&le. $ara escri&ir nuestros programas necesitamos un editor. La mayora de los compiladores al instalarse incorporan ya un editor7 es el caso de los conocidos <ur&o C- 0orland C- /isual C''-... $ero otros no lo traen por de ecto. No de&emos con undir por tanto el editor con el compilador. Estos editores suelen tener unas caractersticas que nos acilitan mucho el tra&ajo= permiten compilar y ejecutar el programa directamente- depurarlo ,corregir errores.- gestionar complejos proyectos-... *i nuestro compilador no trae editor la soluci#n ms simple en 9*>3os puede ser usar el edit- en )indo)s el notepad. $ero no son ms que editores sin ninguna otra uncionalidad. 8tra posi&ilidad es un entorno de desarrollo llamado 2?13E- un programa muy 4til que

automati%a muchas de las tareas del programador ,del estilo del <ur&o C y <ur&o $ascal.. *i queremos una herramienta muy a!an%ada podemos usar Emacs- que es un editor muy potente- aunque para algunos puede parecer muy complicado. Estos dos programas estn disponi&les tanto en Linu" como en 9*>3os.

$219E2 $28G2A9A= ?8LA 9UN38 En un alarde de originalidad !amos a hacer nuestro primer programa= hola mundo. Nadie puede llegar muy lejos en el mundo de la programaci#n sin ha&er empe%ado su carrera con este original y uncional programa. All !a= @include Astdio.hB int main,. C print ,6?ola mundoDn6 return :7 E Nota= ?ay mucha gente que programa en (indo)s que se queja de que cuando ejecuta el programa no puede !er el resultado. $ara e!itarlo se puede aFadir antes de return :7 la siguiente lnea= system,6$AU*E6 7 *i esto no unciona prue&a a aFadir getch,.7 GHu5 cil ehI Este programa lo 4nico que hace es sacar por pantalla el mensaje= ?ola mundo /amos ahora a comentar el programa lnea por lnea ,Esto no !a a ser ms que una primera apro"imaci#n.. @include Astdio.hB @include es lo que se llama una directi!a. *ir!e para indicar al compilador que incluya otro archi!o. Cuando en compilador se encuentra con esta directi!a la sustituye por el archi!o indicado. En este caso es el archi!o stdio.h que es donde est de inida la unci#n print que !eremos luego. int main,. Es la unci#n principal del programa. <odos los programas de C de&en tener una unci#n llamada main. Es la que primero se ejecuta. El int ,!iene de 1ntegerJEntero. que tiene al principio signi ica que cuando la unci#n main aca&e de!ol!er un n4mero entero. Este !alor se suele usar para sa&er c#mo ha terminado el programa. Normalmente este !alor ser : si todo ha ido &ien- o un !alor distinto si se ha producido alg4n error. *e puede usar la de inici#n K!oid main,.K- que no necesita de!ol!er ning4n !alor- pero se recomienda la orma con KintK que es ms correcta. A lo largo de la reali%aci#n de ejercicios !ers muchos ejemplos que se usan K!oid mainK y alta el return :7 del inal- el c#digo unciona correctamente pero puede dar un K)arningK al compilar. C *on las lla!es que indican el comien%o de una unci#n- en este caso la unci#n main. LM Aqu !a el cuerpo del programa ML Esto es un comentario- no se ejecuta. *ir!e para descri&ir el programa. Con!iene acostum&rarse a comentar los programas. Un comentario puede ocupar ms de una lnea. $or ejemplo el comentario=

LM Este es un comentario que ocupa dos ilas ML es per ectamente !lido. print , 6?ola mundoDn6 .7 Aqu es donde por in el programa hace algo que podemos !er al ejecutarlo. La unci#n print muestra un mensaje por la pantalla. Al inal del mensaje 6?ola mundo6 aparece el sm&olo KDnK7 este hace que despu5s de imprimir el mensaje se pase a la lnea siguiente. Njate en el 676 del inal. Es la orma que se usa en C para separar una instrucci#n de otra. *e pueden poner !arias en la misma lnea siempre que se separen por el punto y coma. return :7 Como se ha indicado el programa al inali%ar de!el!e un !alor entero. Como en este programa no se pueden producir errores la salida siempre ser :. La orma de hacer que el programa de!uel!a un : es usando return. Esta lnea signi ica K inali%a la unci#n main ha% que de!uel!a un :. E ...y cerramos lla!es con lo que termina el programa. <odos los programas inali%an cuando se llega al inal de la unci#n main.

C898 *E ?ACE $rimero de&emos crear el c#digo uente del programa. $ara nuestro primer programa el c#digo uente es el del listado anterior. Arranca el programa- crea un nue!o ichero o proyecto elige la opcion Console Application llmalo por ejemplo primero.c. y copia el c#digo anterior. Ahora- tenemos que compilar y ejecutar el programa ,NO..

ALG8 9A* *802E L8* C89EN<A218* Los comentarios se pueden poner casi en cualquier parte. E"cepto en medio de una instrucci#n. $or ejemplo lo siguiente no es !lido= priLM Esto es un comentario MLnt , 6?ola mundo6 .7 GA22ANAL No podemos cortar a print por en medio- tendramos un error al compilar. Lo siguiente no dara error ,al menos usando 3JG$$.- pero es una ea costum&re= print , LM Esto es un comentario ML 6?ola mundo6 .7 P por 4ltimo tenemos= print , 6?olaLM Esto es un comentario ML mundo6 .7 Hue no dara error- pero al ejecutar tendramos= ?ola LM Esto es un comentario ML mundo porque LM Esto es un comentario ML queda dentro de las comillas y C lo interpreta como te"to- no como un comentario. 0usca los errores en este programa= int main,. C LM Aqu !a el cuerpo del programa ML $rint , 6?ola mundoDn6 .7

return :7 E *oluci#n= *i lo compilamos posi&lemente o&tendremos un error que nos indicar que no hemos de inido la unci#n K$rint K. Esto es porque no hemos includo la dichosa directi!a K@include Astdio.hBK. ,En algunos compiladores no es necesario incluir esta directi!a- pero es una &uena costum&re hacerlo.. *i lo corregimos y !ol!emos a compilar o&tendremos un nue!o error. 8tra !e% nos dice que desconoce K$rint K. Esta !e% el pro&lema es el de las may4sculas que hemos indicado antes. Lo correcto es poner Kprint K con min4sculas. $arece una tontera- pero seguro que nos da ms de un pro&lema. 19$21912 EN $AN<ALLA= print La unci#n print - sir!e para sacar in ormaci#n por pantalla. $ara utili%ar la unci#n print en nuestros programas de&emos incluir la directi!a= @include Astdio.hB al principio de programa. Como hemos !isto en el programa hola mundo. *i s#lo queremos imprimir una cadena &asta con hacer ,no ol!ides el 676 al inal.= print , 6Cadena6 .7 Esto resultar por pantalla= Cadena Lo que pongamos entre las comillas es lo que !amos a sacar por pantalla. *i !ol!emos a usar otro print - por ejemplo= @include Astdio.hB int main,. C print , 6Cadena6 .7 print , 6*egunda6 .7 return :7 E 8&tendremos= Cadena*egunda Este ejemplo nos muestra c#mo unciona print . $ara escri&ir en la pantalla se usa un cursor que no !emos. Cuando escri&imos algo el cursor !a al inal del te"to. Cuando el te"to llega al inal de la ila- lo siguiente que pongamos ir a la ila siguiente. *i lo que queremos es sacar cada una en una lnea de&eremos usar 6Dn6. Es el indicador de retorno de carro. Lo que hace es saltar el cursor de escritura a la lnea siguiente= @include Astdio.hB int main,. C print , 6CadenaDn6 .7 print , 6*egunda6 .7 return :7 E

y tendremos= Cadena *egunda <am&i5n podemos poner ms de una cadena dentro del print = print , 6$rimera cadena6 6*egunda cadena6 .7 Lo que no podemos hacer es meter cosas entre las cadenas= print , 6$rimera cadena6 te"to en medio 6*egunda cadena6 .7 esto no es !lido. Cuando el compilador intenta interpretar esta sentencia se encuentra 6$rimera cadena6 y luego te"to en medio- no sa&e qu5 hacer con ello y da un error. $ero Gqu5 pasa si queremos imprimir el sm&olo 6 en pantallaI $or ejemplo imaginemos que queremos escri&ir= Esto es 6e"traFo6 *i para ello hacemos= print , 6Esto es 6e"traFo66 .7 o&tendremos unos cuantos errores. El pro&lema es que el sm&olo 6 se usa para indicar al compilador el comien%o o el inal de una cadena. As que en realidad le estaramos dando la cadena 6Esto es6- luego e"traFo y luego otra cadena !aca 66. $ues resulta que print no admite esto y de nue!o tenemos errores. La soluci#n es usar D6. /eamos= print , 6Esto es D6e"traFoD66 .7 Esta !e% todo ir como la seda. Como !emos la contra&arra KDK sir!e para indicarle al compilador que escri&a caracteres que de otra orma no podramos. Esta contra&arra se usa en C para indicar al compilador que queremos meter sm&olos especiales. $ero GP si lo que queremos es usar KDK como un carcter normal y poner por ejemplo ?olaDAdi#sI $ues muy cil- !ol!emos a usar KDK= print , 6?olaDDAdi#s6 .7 y esta do&le KDK indica a C que lo que queremos es mostrar una KDK. Esto no ha sido mas que una introducci#n a print .

$8*1C18NAN38 EL CU2*82= goto"y Esta unci#n s#lo est disponi&le en compiladores de C que dispongan de la &i&lioteca Aconio.hB ?emos !isto que cuando usamos print se escri&e en la posici#n actual del cursor y se mue!e el cursor al inal de la cadena que hemos escrito. $ero Gqu5 pasa cuando queremos escri&ir en una posici#n determinada de la pantallaI La soluci#n est en la unci#n goto"y. *upongamos que queremos escri&ir K?olaK en la ila ;:- columna Q: de la pantalla= @include Astdio.hB @include Aconio.hB int main,. C goto"y, Q:- ;: .7 print , 6?ola6 .7 return :7

E ,Nota= para usar goto"y hay que incluir la &i&lioteca conio.h.. Njate que primero se pone la columna ,". y luego la ila ,y.. La esquina superior i%quierda es la posici#n ,;- ;..

0822A2 LA $AN<ALLA= clrscr Es necesario sa&er c#mo se &orra la pantalla. $ues es tan cil como usar= clrscr,. ,clear screen- &orrar pantalla.. Esta unci#n n# solo &orra la pantalla- sino que adems sit4a el cursor en la posici#n ,;;.- en la esquina superior i%quierda. @include Astdio.hB @include Aconio.hB int main,. C clrscr,.7 print , 6?ola6 .7 return :7 E Este m5todo s#lo !ale para compiladores que incluyan el ichero stdio.h.

Ejercicio ;= 0usca los errores en el programa. @include Astdio.hB int main,. C Clr*cr,.7 goto"y, ;:- ;: . print , Estoy en la ila ;: columna ;: .7 return :7 E *oluci#n= R Clr*cr est mal escrito- de&e ponerse todo en min4sculas- recordemos una !e% ms que el C di erencia las may4sculas de las min4sculas. Adems no hemos includo la directi!a @include Aconio.hB- que necesitamos para usar clrscr,. y goto"y,.. R <ampoco hemos puesto el punto y coma , despu5s del goto"y, ;:- ;: .. 3espu5s de cada instrucci#n de&e ir un punto y coma. R El 4ltimo allo es que el te"to del print no lo hemos puesto entre comillas. Lo correcto sera= print , 6Estoy en la ila ;: columna ;:6 .7 Ejercicio Q. Escri&e un programa que &orre la pantalla y escri&a en la primera lnea su nom&re y en la segunda su apellido= *oluci#n=

@include Astdio.hB @include Aconio.hB int main,. C clrscr,.7 print , 6Gor+aDn6 .7 print , 6Urrutia6 .7 return :7 E <am&i5n se poda ha&er hecho todo de golpe= @include Astdio.hB @include Aconio.hB int main,. C clrscr,.7 print , 6Gor+aDnUrrutia6 .7 return :7 E Ejercicio S. Escri&a un programa que &orre la pantalla y muestre el te"to 6estoy aqui6 en la ila ;:- columna Q: de la pantalla= *oluci#n= @include Astdio.hB @include Aconio.hB int main,. C clrscr,.7 goto"y, Q:- ;: .7 print , 6Estoy aqui6 .7 return :7 E 1N<283UCC1TN AL <2A0AJ8 C8N <1$8 3E 3A<8* Cuando usamos un programa es muy importante manejar datos. En C podemos almacenar los datos en !aria&les. El contenido de las !aria&les se puede !er o cam&iar en cualquier momento. Estas !aria&les pueden ser de distintos tipos dependiendo del tipo de dato que queramos meter. No es lo mismo guardar un nom&re que un n4mero. ?ay que recordar tam&i5n que la memoria del ordenador es limitada- as que cuando guardamos un dato- de&emos usar s#lo la memoria necesaria. $or ejemplo si queremos almacenar el n4mero U:: usaremos una !aria&le tipo int que ocupa s#lo ;V &its- y no una de tipo long que ocupa SQ &its. *i tenemos un ordenador con SQ9& de 2am parece una tontera ponernos a ahorrar &its ,;9&J;:QUW&- ;W&J;:QU&ytes- ;&yteJX&its.- pero si tenemos un programa que maneja muchos datos puede no ser una cantidad desprecia&le. Adems

ahorrar memoria es una &uena costum&re. ,$or si alguno tiene dudas= No hay que con undir la memoria con el espacio en el disco duro. *on dos cosas distintas. La capacidad de am&os se mide en &ytes- y la del disco duro suele ser mayor que la de la memoria 2am. La in ormaci#n en la 2am se pierde al apagar el ordenador- la del disco duro permanece. Cuando queremos guardar un ichero lo que necesitamos es espacio en el disco duro. Cuando queremos ejecutar un programa lo que necesitamos es memoria 2am. /A21A0LE* A las !aria&les no se les puede dar cualquier nom&re. No se pueden poner ms que letras de la KaK a la K%K ,la F no !ale.- n4meros y el sm&olo KYK. No se pueden poner signos de admiraci#n- ni de interrogaci#n... El nom&re de una !aria&le puede contener n4merospero su primer carcter no puede serlo. Ejemplos de nom&res !lidos= camiones numero &u er a; j;:holaQO numYalumnos Ejemplos de nom&res no !lidos= ;a&c nom&reI numLalumnos <ampoco !alen como nom&res de !aria&le las pala&ras reser!adas que usa el compilador. $or ejemplo= or- main- do- )hile. $or 4ltimo es interesante seFalar que el C distingue entre may4sculas y min4sculas. $or lo tanto= Nom&re nom&re N8902E seran tres !aria&les distintas. EL <1$8 int En una !aria&le de este tipo se almacenan n4meros enteros ,sin decimales.. El rango de !alores que admite es >SQZVZ a SQZVZ. Cuando de inimos una !aria&le lo que estamos haciendo es decirle al compilador que nos reser!e una %ona de la memoria para almacenar datos de tipo int. $ara guardarla necesitaremos ;V &its de la memoria del ordenador ,Q;VJSQZVZ.. $ara poder usar una !aria&le primero hay que declararla ,de inirla.. ?ay que decirle al compilador que queremos crear una !aria&le y hay que indicarle de qu5 tipo. $or ejemplo= int numero7 Esto hace que declaremos una !aria&le llamada numero que !a a contener un n4mero entero. G$ero d#nde se declaran las !aria&lesI <enemos dos posi&ilidades- una es declararla como glo&al y otra como local. $or ahora !amos a decir que glo&al es aquella !aria&le que se declara uera de la unci#n main y local la que se declara dentro=

/aria&le Glo&al /aria&le Local @include Astdio.hB int "7 int main,. C E @include Astdio.hB int main,. C int "7 E La di erencia prctica es que las !aria&les glo&ales se pueden usar en cualquier procedimiento. Las !aria&les locales s#lo pueden usarse en el procedimiento en el que se declaran. Como por ahora s#lo tenemos el procedimiento ,o unci#n- o rutina- o su&rutinacomo pre ieras. main esto no de&e preocuparnos mucho por ahora. Cuando estudiemos c#mo hacer un programa con ms unciones aparte de main !ol!eremos so&re el tema. *in em&argo de&es sa&er que es &uena costum&re usar !aria&les locales que glo&ales. Pa !eremos por qu5. $odemos declarar ms de una !aria&le en una sola lnea= int "- y7 9ostrar !aria&les por pantalla /amos a ir u poco ms all con la unci#n print . *upongamos que queremos mostrar el contenido de la !aria&le " por pantalla= print , 6[i6- " .7 *uponiendo que " !alga ;: ,"J;:. en la pantalla tendramos= ;: Empie%a a complicarse un poco GnoI /amos poco a poco. G2ecuerdas el sm&olo 6D6 que us&amos para sacar ciertos caracteresI 0ueno- pues el uso del 6[6 es parecido. 6[i6 no se muestra por pantalla- se sustituye por el !alor de la !aria&le que !a detrs de las comillas. , [i- de integerJentero en ingl5s.. $ara !er el contenido de dos !aria&les- por ejemplo " e y- podemos hacer= print , 6[i 6- " .7 print , 6[i6- y .7 resultado ,suponiendo "J;:- yJQ:.= ;: Q: $ero hay otra orma mejor= print , 6[i [i6- "- y .7 ... y as podemos poner el n4mero de !aria&les que queramos. 8&tenemos el mismo resultado con menos tra&ajo. No ol!idemos que por cada !aria&le hay que poner un [i

dentro de las comillas. <am&i5n podemos me%clar te"to con enteros= print , 6El !alor de " es [i- \que &ien]Dn6- " .7 que quedar como= El !alor de " es ;:- \que &ien] Como !emos [i al imprimir se sustituye por el !alor de la !aria&le. Asignar !alores a !aria&les de tipo int La asignaci#n de !alores es tan sencilla como= " J ;:7 <am&i5n se puede dar un !alor inicial a la !aria&le cuando se de ine= int " J ;^7 <am&i5n se pueden iniciali%ar !arias !aria&les en una sola lnea= int " J ;^- y J Q:7 ?ay que tener cuidado con lo siguiente= int "- y J Q:7 $odramos pensar que " e y son igual a Q:- pero no es as. La !aria&le " est sin !alor inicial y la !aria&le KyK tiene el !alor Q:. /eamos un ejemplo para resumir todo= @include Astdio.hB int main,. C int " J ;:7 prin t, 6El !alor inicial de " es [iDn6- " .7 " J ^:7 print , 6Ahora el !alor es [iDn6- " .7 E Cuya salida ser= El !alor inicial de " es ;: Ahora el !alor es ^: 1mportante] *i imprimimos una !aria&le a la que no hemos dado ning4n !alor no o&tendremos ning4n error al compilar pero la !aria&le tendr un !alor cualquiera. $rue&a el ejemplo anterior quitando int " J ;:7 $uede que te imprima el !alor ;: o puede que no. El tipo Char Las !aria&les de tipo char sir!en para almacenar caracteres. Los caracteres se almacenan en realidad como n4meros del : al Q^^. Los ;QX primeros ,: a ;QZ. son el A*C11 estndar. El resto es el A*C11 e"tendido y depende del idioma y del ordenador. Consulta la ta&la A*C11 en el ane"o. $ara declarar una !aria&le de tipo char hacemos= char letra7 En una !aria&le char s#lo podemos almacenar solo una letra- no podemos almacenar ni rases ni pala&ras. Eso lo !eremos ms adelante ,strings- cadenas.. $ara almacenar un dato en una !aria&le char tenemos dos posi&ilidades= letra J KAK7 o

letra J V^7 En am&os casos se almacena la letra KAK en la !aria&le. Esto es as porque el c#digo A*C11 de la letra KAK es el V^. $ara imprimir un char usamos el sm&olo [c ,c de characterJcaracter en ingl5s.= letra J KAK7 print , 6La letra es= [c.6- letra .7 resultado= La letra es A. <am&i5n podemos imprimir el !alor A*C11 de la !aria&le usando [i en !e% de [c= letra J KAK7 print , 6El n4mero A*C11 de la letra [c es= [i.6- letra- letra .7 resultado= El c#digo A*C11 de la letra A es V^. Como !emos la 4nica di erencia para o&tener uno u otro es el modi icador ,[c # [i. que usemos. Las !aria&les tipo char se pueden usar ,y de hecho se usan mucho. para almacenar enteros. *i necesitamos un n4mero pequeFo ,entre >;QZ y ;QZ. podemos usar una !aria&le char ,X&its. en !e% de una int ,;V&its.- con el consiguiente ahorro de memoria. <odo lo dems dicho para los datos de tipo int se aplica tam&i5n a los de tipo char . Una curiosidad= letra J KAK7 print , 6La letra es= [c y su !alor A*C11 es= [iDn6- letra- letra .7 letra J letra ' ;7 print , 6Ahora es= [c y su !alor A*C11 es= [iDn6- letra- letra .7 En este ejemplo letra comien%a con el !alor KAK- que es el c#digo A*C11 V^. Al sumarle ; pasa a tener el !alor VV- que equi!ale a la letra K0K ,c#digo A*C11 VV.. La salida de este ejemplo sera= La letra es A y su !alor A*C11 es V^ Ahora es 0 y su !alor A*C11 es VV El modi icador Unsigned Este modi icador ,que signi ica sin signo. modi ica el rango de !alores que puede contener una !aria&le. *#lo admite !alores positi!os. *i hacemos= unsigned char !aria&le7 Esta !aria&le en !e% de tener un rango de >;QX a ;QX pasa a tener un rango de : a Q^^.

El tipo Nloat En este tipo de !aria&le podemos almacenar n4meros decimales- no s#lo enteros como en los anteriores. El rango de posi&les !alores es del S-UE>SX al S-UESX. 3eclaraci#n de una !aria&le de tipo loat= loat numero7 $ara imprimir !alores tipo loat Usamos [ . loat numJU:V:.X:7 print , 6El !alor de num es = [ 6- num .7

2esultado= El !alor de num es= U:V:.X: *i queremos escri&irlo en notaci#n e"ponencial usamos [e= loat num J U:V:.X:7 print , 6El !alor de num es= [e6- num .7 Hue da como resultado= El !alor de num es= U.:V:X:e::S El tipo 3ou&le En las !aria&les tipo dou&le se almacenan n4meros reales del ;-ZE>S:Z al ;-ZES:X. *e declaran como dou&le= dou&le numero7 $ara imprimir se usan los mismos modi icadores que en loat. C#mo calcular el m"imo !alor que admite un tipo de datos Lo primero que tenemos que conocer es el tamaFo en &ytes de ese tipo de dato. /amos a !er un ejemplo con el tipo 1N<. ?agamos el siguiente programa= @include Astdio.hB int main,. C int num;7 print , 6El tipo int ocupa [i &ytesDn6- si%eo ,int. .7 E En mi ordenador el resultado es= El tipo int ocupa U &ytes. Como sa&emos ;&yte J X&its. $or lo tanto el tipo int ocupa UMXJSQ &its. Ahora para calcular el m"imo n4mero de&emos ele!ar Q al n4mero de &its o&tenido. En nuestro ejemplo= Q_SQJU.QOU.OVZ.QOV. Es decir en un int se podra almacenar un n4mero entre : y U.QOU.OVZ.QOV. *in em&argo esto s#lo es cierto si usamos un tipo unsigned ,sin signo- se hace aFadiendo la pala&ra unsigned antes de int.. $ara los tipos normales tenemos que almacenar n4meros positi!os y negati!os. As que de los U.QOU.OVZ.QOV posi&les n4meros la mitad sern positi!os y la mitad negati!os. $or lo tanto tenemos que di!idir el n4mero anterior entre Q J Q.;UZ.UXS.VUX. Como el : se considera positi!o el rango de n4meros posi&les que se pueden almacenar en un int sera= >Q.;UZ.UXS.VUX a Q.;UZ.UXS.VUZ. 2esumen= ;. 8&tenemos el n4mero de &ytes. Q. 9ultiplicamos por ocho ,ya lo tenemos en &its.. S. Ele!amos Q al n4mero de &its. U. 3i!idimos entre Q. 8!er lo)= Hu5 pasa cuando nos saltamos el rango El o!er lo) es lo que se produce cuando intentamos almacenar en una !aria&le un n4mero mayor del m"imo permitido. El comportamiento es distinto para !aria&lesde n4meros enteros y para !aria&les de n4meros en coma lotante.

Con n4meros enteros En mi ordenador y usando 3JG$$ &ajo 3os el tamaFo del tipo int es de U&ytes,UMXJSQ&its.. El n4mero m"imo que se puede almacenar en una !aria&le tipo int es por tanto Q.;UZ.UXS.VUZ ,!er apartado anterior.. *i nos pasamos de este n4mero el que se guardar ser el siguiente pero empe%ando desde el otro e"tremo- es decir- el >Q.;UZ.UXS.VUX. El compilador seguramente nos dar un a!iso ,)arning. de que nos hemos pasado. @include Astdio.hB int main,. C int num;7 num; J Q;UZUXSVUX7 print , 6El !alor de num; es= [iDn6- num; .7 E El resultado que o&tenemos es= El !alor de num; es= >Q;UZUXSVUX Comprue&a si quieres que con el n4mero anterior ,Q.;UZ.UXS.VUZ. no pasa nada. Con n4meros en coma lotante El comportamiento con n4meros en coma lotante es distinto. 3ependiendo del ordenador si nos pasamos del rango al ejecutar un programa se puede producir un error y detenerse la ejecuci#n. Con estos n4meros tam&i5n e"iste otro error que es el under lo). Este error se produce cuando almacenamos un n4mero demasiado pequeFo ,S-UE>SX en loat..

2esumen de los tipos de datos en C Esto es algo orientati!o- depende del sistema. <ipo 3atos almacenados N` de 0its /alores posi&les ,2ango. 2ango usando unsigned char Caracteres X >;QX a ;QX : a Q^^ int enteros ;V >SQ.ZVZ a SQ.ZVZ : a V^.^S^ long enteros largos SQ >Q.;UZ.UXS.VUZ a Q.;UZ.UXS.VUZ : a U.QOU.OVZ.QO^ loat Nums. reales ,coma lotante. SQ S-UE>SX a S-UESX dou&le Nums. reales ,coma lotante do&le. VU ;-ZE>S:Z a ;-ZES:X Esto no siempre es cierto- depende del ordenador y del compilador. $ara sa&er en nuestro caso qu5 tamaFo tienen nuestros tipos de datos de&emos hacer lo siguiente. Ejemplo para int= @include Astdio.hB int main,. C print , 6<amaFo ,en &its. de int J [iDn6- si%eo , int .MX .7 return :7 E Pa !eremos ms tarde lo que signi ica si%eo . $or ahora &asta con sa&er que nos dice cual es el tamaFo de una !aria&le o un tipo de dato.

Ejercicios Ejercicio ;. 0usque los errores= @include Astdio.hB int main,. C int n4mero7 n4mero J Q7 return :7 E

*oluci#n= Los nom&res de !aria&les no pueden lle!ar acentos- luego al compilar n4mero dar error. @include Astdio.hB int main,. C int numero7 numero J Q7 print , 6El !alor es [i6 Numero .7 return :7 E *oluci#n= Nalta la coma despu5s de 6El !alor es [i6. Adems la segunda !e% numero est escrito con may4sculas. Constantes con nom&re Las constantes son aquellos datos que no pueden cam&iar a lo largo de la ejecuci#n de un programa. @include Astdio.hB int main,. C int radio- perimetro7 radio J Q:7 perimetro J Q M S.;U;V M radio7

print , 6El permetro es= [i6- perimetro .7 return :7

E radio y perimetro son !aria&les- su !alor puede cam&iar a lo largo del programa. *in em&argo Q:- Q y S.;U;V son constantes- no hay manera de cam&iarlas. El !alor S.;U;V no cam&ia a lo largo del programa - ni entre ejecuci#n y ejecuci#n. *#lo cam&iar cuando edites el programa y lo cam&ies tu mismo. Esto es o&!io- y no tiene ning4n misterio as que no le des !ueltas. *#lo quera indicarlo porque en algunos li&ros le dan muchas !ueltas. *upongamos que tenemos que hacer un programa en el que haya que escri&ir unas cuantas !eces S.;U;V ,como todos sa&reis es $1.. Es muy cil que nos con undamos alguna !e% al teclearlo y al compilar el programa no tendremos ning4n error- sin em&argo el programa no dar resultados correctos. $ara e!itar esto usamos las constantes con nom&re. Al de inir una constante con nom&re estamos dando un nom&re al !alor- a S.;U;V le llamamos $1.

Estas constantes se de inen de la manera siguiente= @de ine nom&reYdeYlaYconstante !alorYdeYlaYconstante Ejemplo= @include Astdio.hB @de ine $1 S.;U;V int main,. C int radio- perimetro7 radio J Q:7 perimetro J Q M $1 M radio7 print , 6El permetro es= [i6- perimetro .7 return :7 E 3e esta orma cada !e% que el compilador encuentre el nom&re $1 lo sustituir por S.;U;V. A una constante no se le puede dar un !alor mientras se ejecuta- no se puede hacer $1 J Q:7. *#lo se le puede dar un !alor con @de ine- y s#lo una !e%. <ampoco podemos usar el scan para dar !alores a una constante= @de ine C8N*<AN<E ;U int main,. C ... scan , 6[i6- C8N*<AN<E .7 ... E eso sera como hacer= scan , 6[i6- ;U .7

Esto es muy gra!e- estamos diciendo que el !alor que escri&amos en scan se almacene en la posici#n ;U de la memoria- lo que puede &loquear el ordenador. Las constantes se suelen escri&ir en may4sculas s#lo se puede de inir una constante por ila. No se pone 676 al inal. Las constantes nos proporcionan una mejor comprensi#n del c#digo uente. 9ira el siguiente programa= @include Astdio.hB int main,. C int precio7 precio J , U M Q^ M ;:: . M , ;.;V .7 print , 6El precio total es= [i6- precio .7 return :7 E GHuien entiende lo que quiere decir este programaI Es di cil si no imposi&le. ?agmoslo de otra orma. @include Astdio.hB @de ine CAJA* U @de ine UN13A3E*Y$82YCAJA Q^ @de ine $2EC18Y$82YUN13A3 ;:: @de ine 19$UE*<8* ;.;V int main,. C int precio7 precio J , CAJA* M UN13A3E*Y$82YCAJA M $2EC18Y$82YUN13A3 . M , 19$UE*<8* .7 print , 6El precio total es= [i6- precio .7 return :7 E GA que ahora se entiende mejorI Claro que s. Los n4meros no tienen mucho signi icado y si re!isamos el programa un tiempo ms tarde ya no nos acordaremos qu5 cosa era cada n4mero. 3e la segunda orma nos enteraremos al momento. <am&i5n podemos de inir una constante usando el !alor de otras. $or supuesto las otras tienen que estar de inidas antes= @include Astdio.hB @de ine CAJA* U @de ine UN13A3E*Y$82YCAJA Q^ @de ine $2EC18Y$82YUN13A3 ;::

@de ine $2EC18Y$82YCAJA UN13A3E*Y$82YCAJA M $2EC18Y$82YUN13A3 @de ine 19$UE*<8* ;.;V int main,. C int precio7 precio J , CAJA* M $2EC18Y$82YCAJA . M , 19$UE*<8* .7 print , 6El precio total es= [i6- precio .7 return :7 E @de ine tiene ms usos aparte de 5ste- ya los !eremos en el captulo de directi!as.

GHu5 es un operadorI Un operador sir!e para manipular datos. Los hay de !arios tipos= de asignaci#n- de relaci#n- l#gicos- aritm5ticos y de manipulaci#n de &its. En realidad los nom&res tampoco importan mucho7 aqu lo que queremos es aprender a programar- no aprender un mont#n de nom&res. 8perador de asignaci#n Este es un operador que ya hemos !isto en el captulo de <ipos de 3atos. *ir!e para dar un !alor a una !aria&le. Este !alor puede ser un n4mero que tecleamos directamente u otra !aria&le= a J S7 LM 9etemos un !alor directamente ML o a J &7 LM Le damos el !alor de una !aria&le ML $odemos dar !alores a !arias !aria&les a la !e%= a J & J c J ;:7 LM 3amos a las !aria&les a-&-c el !alor ;: ML <am&i5n podemos asignar a !arias !aria&les el !alor de otra de un s#lo golpe= a J & J c J d7 LM a-&-c toman el !alor de d ML 8peradores aritm5ticos Los operadores aritm5ticos son aquellos que sir!en para reali%ar operaciones tales como suma- resta- di!isi#n y multiplicaci#n. *i quieres sa&er c#mo usar unciones matemticas ms complejas ,e"ponentes- racestrigonom5tricas. !ete al captulo correspondiente.

8perador ,'. = *uma Este operador permite sumar !aria&les= @include Astdio.hB int main,. C int a J Q7 int & J S7

int c7 c J a ' &7 print , 62esultado J [iDn6- c .7 E El resultado ser ^ o&!iamente. $or supuesto se pueden sumar !arias !aria&les o !aria&les ms constantes= @include Astdio.hB int main,. C int a J Q7 int & J S7 int c J ;7 int d7 d J a ' & ' c ' U7 print , 62esultado J [iDn6- c .7 E El resultado es ;:. $odemos utili%ar este operador para incrementar el !alor de una !aria&le= " J " ' ^7 $ero e"iste una orma a&re!iada= " 'J ^7 Esto suma el !alor ^ al !alor que tena la !aria&le ". /eamos un ejemplo= @include Astdio.hB int main,. C int "- y7 " J S7 y J ^7 " 'J Q7 print , 6" J [iDn6- " .7 " 'J y7 LM esto equi!ale a " J " ' y ML print , 6" J [iDn6- " .7 E 2esultado= "J^ " J ;:

8perador ,''. = 1ncremento Este operador equi!ale a sumar uno a la !aria&le= @include Astdio.hB

int main,. C int " J ^7 print , 6/alor de " J [iDn6- " .7 "''7 print , 6/alor de " J [iDn6- " .7 E 2esultado= /alor de " J ^ /alor de " J V *e puede poner antes o despu5s de la !aria&le.

8perador ,>. = 2estaLNegati!o Este operador tiene dos usos- uno es la resta que unciona como el operador suma y el otro es cam&iar de signo. 2esta= " J " > ^7 $ara la operaci#n resta se aplica todo lo dicho para la suma. *e puede usar tam&i5n como= " >J ^7. $ero tam&i5n tiene el uso de cam&iar de signo. $oniendolo delante de una !aria&le o constante equi!ale a multiplicarla por >;. @include Astdio.hB int main,. C int a- &7 a J ;7 & J >a7 print , 6a J [i- & J [iDn6- a- & .7 E 2esultado= a J ;- & J >;. No tiene mucho misterio. 8perador ,>>. = 3ecremento Es equi!alente a '' pero en !e% de incrementar disminuye el !alor de la !aria&le. Equi!ale a restar uno a la !aria&le. 8perador ,M. = 9ultiplicaci#n y punteros Este operador sir!e para multiplicar y unciona de manera parecida a los anteriores. <am&i5n sir!e para de inir y utili%ar punteros- pero eso lo !eremos ms tarde. 8perador ,L. = 3i!isi#n Este unciona tam&i5n como los anteriores pero hay que tener cuidado. *i di!idimos dos n4mero en coma lotante ,tipo loat. tenemos las di!isi#n con sus correspondientes decimales. $ero si di!idimos dos enteros o&tenemos un n4mero entero. Es decir que si di!idimos ULS tenemos como resultado ;. El redondeo se hace por truncamientosimplemente se eliminan los decimales y se deja el entero. *i di!idimos dos enteros el resultado es un n4mero entero- aunque luego lo saquemos por

pantalla usando [ o [d no o&tendremos la parte decimal. Cuando di!idimos dos enteros- si queremos sa&er cual es el resto ,o m#dulo. usamos el operador [- que !emos ms a&ajo. 8perador ,[. = 2esto *i con el anterior operador o&tenamos el m#dulo o cociente de una di!isi#n entera con 5ste podemos tener el resto. No unciona ms que con enteros- no !ale para n4meros loat o dou&le. C#mo se usa= @include Astdio.hB int main,. C int a- &7 a J ;X7 & J ^7 print , 62esto de la di!isi#n= [d Dn6- a [ & .7 E 8peradores de comparaci#n Los operadores de condici#n se utili%an para compro&ar las condiciones de las sentencias de control de lujo ,las estudiaremos en el captulo sentencias.. Cuando se e!al4a una condici#n el resultado que se o&tiene es : si no se cumple y un n4mero distinto de : si se cumple. Normalmente cuando se cumplen de!uel!en un ;. Los operadores de comparaci#n son= JJ igual que se cumple si son iguales ]J distinto que se cumple ; si son di erentes B mayor que se cumple si el primero es mayor que el segundo A menor que se cumple si el primero es menor que el segundo BJ mayor o igual que se cumple si el primero es mayor o igual que el segundo AJ menor o igual que se cumple si el primero es menor o igual que el segundo /eremos la aplicaci#n de estos operadores en el captulo *entencias. $ero ahora !amos a !er unos ejemplos= @include Astdio.hB int main,. C print , 6;: B ^ da como resultado [iDn6- ;:B^ .7 print , 6;: B ^ da como resultado [iDn6- ;:B^ .7 print , 6^JJ ^ da como resultado [iDn6- ^JJ^ .7 print , 6;:JJ^ da como resultado [iDn6- ;:JJ^ .7 E No s#lo se pueden comparar constantes- tam&i5n se pueden comparar !aria&les.

8peradores l#gicos Estos son los que nos permiten unir !arias comparaciones= ;:B^ y VJJV. Los operadores l#gicos son= AN3 ,aa - 82 ,bb.- N8<,]..

8perador aa ,AN3- en castellano P.= 3e!uel!e un ; si se cumplen dos condiciones. print , 62esultado= [i6- ,;:JJ;: aa ^BQ .7 8perador bb ,82- en castellano 8.= 3e!uel!e un ; si se cumple una de las dos condiciones. 8perador ] ,N8<- negaci#n.= *i la condici#n se cumple N8< hace que no se cumpla y !ice!ersa. /er el captulo *entencias- secci#n Notas so&re las condiciones para ms in ormaci#n. 1ntroducci#n a los &its y &ytes En esta secci#n !oy a descri&ir lo que son los &ytes y los &its. No !oy a descu&rir nada nue!o- as que la mayora se podrn saltar esta secci#n. *upongo que todo el mundo sa&e lo que son los &ytes y los &its- pero por si acaso all !a. Los &its son la unidad de in ormaci#n ms pequeFa- digamos que son la &ase para almacenar la in ormaci#n. *on como los tomos a las mol5culas. Los !alores que puede tomar un &it son : # ;. *i juntamos ocho &its tenemos un &yte. Un &yte puede tomar Q^V !alores di erentes ,de : a Q^^.. GC#mo se consigue estoI 1maginemos nuestro lamante &yte con sus ocho &its. *upongamos que los ocho &its !alen cero. Pa tenemos el !alor : en el &yte. Ahora !amos a darle al 4ltimo &yte el !alor ;. :::::::; >B ; Este es el uno para el &yte. Ahora !amos a por el dos y el tres= ::::::;: >B Q ::::::;; >B S y as hasta Q^^. Como !emos con ocho &its podemos tener Q^V !alores di erentes- que en &yte corresponden a los !alores entre : y Q^^. 8peradores de &its Pa hemos !isto que un &yte son ocho &its. $ues &ien- con los operadores de &its podemos manipular las !aria&les por dentro. Los di erentes operadores de &its son= 8perador 3escripci#n b 82 ,8. a AN3 ,P. _ c82 ,8 e"clusi!o. d Complemento a uno o negaci#n BB 3espla%amiento a la derecha AA 3espla%amiento a la i%quierda 8perador b ,82.= <oma los !alores y hace con ellos la operaci#n 82. /amos a !er un ejemplo= @include Astdio.hB int main,. C print , 6El resultado de la operaci#n QS^ b ;US es= [iDn6- QS^ b ;US .7 E *e o&tiene= El resultado de la operaci#n QS^ b ;US es= QSO /eamos la operaci#n a ni!el de &its= QS^ >B ;;;:;:;; ;US >B ;:::;;;; b QSO >B ;;;:;;;;

La operaci#n 82 unciona de la siguiente manera= <omamos los &its dos a dos y los comparamos si alguno de ellos es uno- se o&tiene un uno. *i am&os son cero el resultado es cero. $rimero se compara los dos primeros ,el primero de cada uno de los n4meros- ; y ; >B ;.- luego la segunda pareja ,; y : >B ;. y as sucesi!amente. 8perador a ,AN3.= Este operador compara los &its tam&i5n dos a dos. *i am&os son ; el resultado es ;. *i no- el resultado es cero. @include Astdio.hB int main,. C print , 6El resultado de la operaci#n ;Z: a ;^^ es= [iDn6- ;Z: a ;^^ .7 E <enemos= El resultado de la operaci#n ;Z: a ;^^ es= ;SX A ni!el de &its= ;Z: >B ;:;:;:;: ;^^ >B ;::;;:;; a ;SX >B ;:::;:;: 8perador _ ,c82.= Compara los &its y los pone a unos si son distintos. QS^ >B ;;;:;:;; ;US >B ;:::;;;; _ ;:: >B :;;::;:: 8perador d ,Complemento a uno.= Este operador acepta un s#lo dato ,operando. y pone a : los ; y a ; los :- es decir los in!ierte. *e pone delante del operando. @include Astdio.hB int main,. C print , 6El resultado de la operaci#n d;^Q es= [iDn6- d;^Q .7 E El resultado de la operaci#n d;^Q es= ;:S ;^Q >B ;::;;::: d ;:S >B :;;::;;; 8perador BB ,3espla%amiento a la derecha.= Este operador mue!e cada &it a la derecha. El &it de la i%quierda se pone a cero- el de la derecha se pierde. *i reali%amos la operaci#n in!ersa no recuperamos el n4mero original. El ormato es= !aria&le o dato BB n4mero de posiciones a despla%ar El n4mero de posiciones a despla%ar indica cuantas !eces hay que mo!er los &its hacia la derecha. Ejemplo= @include Astdio.hB int main,. C

print , 6El resultado de la operaci#n ;^: BB Q es= [iDn6- d;^Q .7 E El resultado de la operaci#n ;^: BB Q es= SZ /eamos la operaci#n paso a paso. Esta operaci#n equi!ale a hacer dos despla%amientos a la derecha= ;^: >B ;::;:;;: N4mero original Z^ >B :;::;:;; $rimer despla%amiento. Entra un cero por la i%quierdael cero de la derecha se pierde y los dems se mue!en a la derecha. SZ >B ::;::;:; *egundo despla%amiento. N8<A= Un despla%amiento a la i%quierda equi!ale a di!idir por dos. Esto es muy interesante porque el despla%amiento es ms rpido que la di!isi#n. *i queremos optimi%ar un programa esta es una &uena idea. *#lo sir!e para di!idir entre dos. *i hacemos dos despla%amientos sera di!idir por dos dos !eces- no por tres. 8perador AA ,3espla%amiento a la i%quierda.= Nunciona igual que la anterior pero los &its se despla%an a la i%quierda. Esta operaci#n equi!ale a multiplicar por Q. 8perador *i%eo Este es un operador muy 4til. Nos permite conocer el tamaFo en &ytes de una !aria&le. 3e esta manera no tenemos que preocuparnos en recordar o calcular cuanto ocupa. Adems el tamaFo de una !aria&le cam&ia de un compilador a otro- es la mejor orma de asegurarse. *e usa poniendo el nom&re de la !aria&le despu5s de si%eo y separado de un espacio= @include Astdio.hB int main,. C int !aria&le7 print , 6<amaFo de la !aria&le= [iDn6- si%eo !aria&le .7 E <am&en se puede usar con los especi icadores de tipos de datos ,char- int- loatdou&le..... $ero en 5stos se usa de manera di erente- hay que poner el especi icador entre par5ntesis= @include Astdio.hB int main,. C print , 6Las !aria&les tipo int ocupan= [iDn6- si%eo ,int. .7 E 8tros operadores E"isten adems de los que hemos !isto otros operadores. *in em&argo ya !eremos en sucesi!os captulos lo que signi ica cada uno. 8rden de e!aluaci#n de 8peradores 3e&emos tener cuidado al usar operadores pues a !eces podemos tener resultados no esperados si no tenemos en cuenta su orden de e!aluaci#n. /amos a !er la lista de precedencias- cuanto ms arri&a se e!al4a antes= $recedencia

,. ef >B . ] d '' >> ,molde. M a si%eo ,El M es el de puntero. M L [ ,El M de aqu es el de multiplicaci#n. '> AA BB A AJ B BJ JJ ]J a _ b aa bb I= J 'J >J MJ LJ $or ejemplo imaginemos que tenemos la siguiente operaci#n= ;: M Q ' ^ *i !amos a la ta&la de precedencias !emos que el M tiene un orden superior al '- por lo tanto primero se hace el producto ;:MQJQ: y luego la suma Q:'^JQ^. /eamos otra= ;: M , Q ' ^ . Ahora con el par5ntesis cam&ia el orden de e!aluaci#n. El que tiene mayor precedencia ahora es el par5ntesis- se ejecuta primero. Como dentro del par5ntesis s#lo hay una suma se e!al4a sin ms- Q'^JZ. Pa solo queda la multiplicaci#n ;:MZJZ:. 8tro caso= ;: M , ^ M Q 'S . Como antes- el que mayor precedencia tiene es el par5ntesis- se e!al4a primero. 3entro del par5ntesis tenemos producto y suma. Como sa&emos ya se e!al4a primero el producto- ^MQJ;:. *eguimos en el par5ntesis- nos queda la suma ;:'SJ;S. ?emos aca&ado con el par5ntesis- ahora al resto de la e"presi#n. Cogemos la multiplicaci#n que queda= ;:M;SJ;S:. 8tro detalle que de&emos cuidar son los operadores '' y >>. Estos tienen mayor precedencia que las dems operaciones aritm5ticas ,'- >- M- L- [.. $or ejemplo= ;: M ^ '' $uede parecer que primero se ejecutar la multiplicaci#n y luego el ''. $ero si !amos a la ta&la de precedencias !emos que el '' est por encima de M ,de multiplicaci#n.- por lo tanto se e!aluar primero ^''JV. ;:MVJV:. Es mejor no usar los operadores '' y >> me%clados con otros- pues a !eces o&tenemos resultados inesperados. $or ejemplo= @include Astdio.hB int main,. C int a- &7 a J ^7 & J a''7 print , 6a J [i- & J [iDn6- a- & .7 E Este ejemplo en unos compiladores dar a J V- & J ^ y en otros a J V y & J V. $or a!or si

podeis- escri&idme diciendo qu5 !alores os salen a !osotros y qu5 compilador usais. $ara asegurarse lo mejor sera separar la lnea donde se usa el '' y el J= @include Astdio.hB int main,. C int a- &7 a J ^7 a''7 & J a7 print , 6a J [i- & J [iDn6- a- & .7 E

Ejercicios Ejercicio ;= En este programa hay un allo muy gordo y muy ha&itual en programaci#n. A !er si lo encuentras= @include Astdio.hB int main,. C int a- c7 a J ^7 c 'J a '^7 E *oluci#n= Cuando calculamos el !alor de KcK sumamos a'^ , J;: . al !alor de KcK. $ero resulta que KcK no tena ning4n !alor indicado por nosotros. Estamos usando la !aria&le KcK sin ha&erle dado !alor. En algunos compiladores el resultado ser inesperado. Este es un allo &astante ha&itual- usar !aria&les a las que no hemos dado ning4n !alor. Ejercicio Q= GCual ser el resultado del siguiente programaI @include Aconio.hB @include Astdio.hB int main,. C int a- &- c7 a J ^7 & J ''a7 c J , a ' ^ M Q . M , & ' V L Q . ' , a M Q .7 print , 6[i- [i- [i6- a- &- c .7 E *oluci#n= El resultado es ;^V. En la primera a !ale ^. $ero en la segunda se ejecuta & J ''a J ''^ J V. <enemos a J & J V.

Ejercicio S= Escri&ir un programa que comprue&e si un n4mero es par o impar. *oluci#n= @include Astdio.hB int main,. C char pala&rae;::f7 int a7 a J ;QU7 i , a [ Q JJ : . print , 6[d es parDn6- a .7 else print , 6[d es imparDn6- a .7 print , 6Dn6 .7 system, 6pause6 .7 return :7 E Nichero= cap^YejercicioS.c $ara compro&ar si un n4mero es par o impar podemos usar el operador K[K. *i al calcular el resto de di!idir un n4mero por Q el resultado es cero eso indica que el n4mero es par. *i el resto es distinto de cero el n4mero es impar.

Este es un operador que ya hemos !isto en el captulo de <ipos de 3atos. *ir!e para dar un !alor a una !aria&le. Este !alor puede ser un n4mero que tecleamos directamente u otra !aria&le= a J S7 LM 9etemos un !alor directamente ML o a J &7 LM Le damos el !alor de una !aria&le ML $odemos dar !alores a !arias !aria&les a la !e%= a J & J c J ;:7 LM 3amos a las !aria&les a-&-c el !alor ;: ML <am&i5n podemos asignar a !arias !aria&les el !alor de otra de un s#lo golpe= a J & J c J d7 LM a-&-c toman el !alor de d ML 8peradores aritm5ticos Los operadores aritm5ticos son aquellos que sir!en para reali%ar operaciones tales como suma- resta- di!isi#n y multiplicaci#n. *i quieres sa&er c#mo usar unciones matemticas ms complejas ,e"ponentes- racestrigonom5tricas. !ete al captulo correspondiente. 8perador ,'. = *uma Este operador permite sumar !aria&les= @include Astdio.hB int main,. C int a J Q7 int & J S7 int c7

c J a ' &7 print , 62esultado J [iDn6- c .7 E El resultado ser ^ o&!iamente. $or supuesto se pueden sumar !arias !aria&les o !aria&les ms constantes= @include Astdio.hB int main,. C int a J Q7 int & J S7 int c J ;7 int d7 d J a ' & ' c ' U7 print , 62esultado J [iDn6- c .7 E El resultado es ;:. $odemos utili%ar este operador para incrementar el !alor de una !aria&le= " J " ' ^7 $ero e"iste una orma a&re!iada= " 'J ^7 Esto suma el !alor ^ al !alor que tena la !aria&le ". /eamos un ejemplo= @include Astdio.hB int main,. C int "- y7 " J S7 y J ^7 " 'J Q7 print , 6" J [iDn6- " .7 " 'J y7 LM esto equi!ale a " J " ' y ML print , 6" J [iDn6- " .7 E 2esultado= "J^ " J ;:

8perador ,''. = 1ncremento Este operador equi!ale a sumar uno a la !aria&le= @include Astdio.hB int main,.

C int " J ^7 print , 6/alor de " J [iDn6- " .7 "''7 print , 6/alor de " J [iDn6- " .7 E 2esultado= /alor de " J ^ /alor de " J V *e puede poner antes o despu5s de la !aria&le. 8perador ,>. = 2estaLNegati!o Este operador tiene dos usos- uno es la resta que unciona como el operador suma y el otro es cam&iar de signo. 2esta= " J " > ^7 $ara la operaci#n resta se aplica todo lo dicho para la suma. *e puede usar tam&i5n como= " >J ^7. $ero tam&i5n tiene el uso de cam&iar de signo. $oniendolo delante de una !aria&le o constante equi!ale a multiplicarla por >;. @include Astdio.hB int main,. C int a- &7 a J ;7 & J >a7 print , 6a J [i- & J [iDn6- a- & .7 E 2esultado= a J ;- & J >;. No tiene mucho misterio.

8perador ,>>. = 3ecremento Es equi!alente a '' pero en !e% de incrementar disminuye el !alor de la !aria&le. Equi!ale a restar uno a la !aria&le. 8perador ,M. = 9ultiplicaci#n y punteros Este operador sir!e para multiplicar y unciona de manera parecida a los anteriores. <am&i5n sir!e para de inir y utili%ar punteros- pero eso lo !eremos ms tarde. 8perador ,L. = 3i!isi#n Este unciona tam&i5n como los anteriores pero hay que tener cuidado. *i di!idimos dos n4mero en coma lotante ,tipo loat. tenemos las di!isi#n con sus correspondientes decimales. $ero si di!idimos dos enteros o&tenemos un n4mero entero. Es decir que si di!idimos ULS tenemos como resultado ;. El redondeo se hace por truncamientosimplemente se eliminan los decimales y se deja el entero. *i di!idimos dos enteros el resultado es un n4mero entero- aunque luego lo saquemos por pantalla usando [ o [d no o&tendremos la parte decimal.

Cuando di!idimos dos enteros- si queremos sa&er cual es el resto ,o m#dulo. usamos el operador [- que !emos ms a&ajo. 8perador ,[. = 2esto *i con el anterior operador o&tenamos el m#dulo o cociente de una di!isi#n entera con 5ste podemos tener el resto. No unciona ms que con enteros- no !ale para n4meros loat o dou&le. C#mo se usa= @include Astdio.hB int main,. C int a- &7 a J ;X7 & J ^7 print , 62esto de la di!isi#n= [d Dn6- a [ & .7 E 8peradores de comparaci#n Los operadores de condici#n se utili%an para compro&ar las condiciones de las sentencias de control de lujo ,las estudiaremos en el captulo sentencias.. Cuando se e!al4a una condici#n el resultado que se o&tiene es : si no se cumple y un n4mero distinto de : si se cumple. Normalmente cuando se cumplen de!uel!en un ;. Los operadores de comparaci#n son= JJ igual que se cumple si son iguales ]J distinto que se cumple ; si son di erentes B mayor que se cumple si el primero es mayor que el segundo A menor que se cumple si el primero es menor que el segundo BJ mayor o igual que se cumple si el primero es mayor o igual que el segundo AJ menor o igual que se cumple si el primero es menor o igual que el segundo /eremos la aplicaci#n de estos operadores en el captulo *entencias. $ero ahora !amos a !er unos ejemplos= @include Astdio.hB int main,. C print , 6;: B ^ da como resultado [iDn6- ;:B^ .7 print , 6;: B ^ da como resultado [iDn6- ;:B^ .7 print , 6^JJ ^ da como resultado [iDn6- ^JJ^ .7 print , 6;:JJ^ da como resultado [iDn6- ;:JJ^ .7 E No s#lo se pueden comparar constantes- tam&i5n se pueden comparar !aria&les. 8peradores l#gicos

Estos son los que nos permiten unir !arias comparaciones= ;:B^ y VJJV. Los operadores

l#gicos son= AN3 ,aa

- 82 ,bb.- N8<,]..

8perador aa ,AN3- en castellano P.= 3e!uel un ; si se cumplen dos condiciones. print , 62esultado= [i6- ,;:JJ;: aa ^BQ .7 8perado bb ,82- en castellano 8.= 3e!uel!e un ; si se cumple una de las dos condiciones. 8perador ] N8<- negaci#n.= *i la condici#n se cumple N8< hace que no se cumpla y !ice!ersa. /er l captulo *entencias- secci#n tas so&re las condiciones para ms in ormaci#n. 1ntroducci#n a los &its y &ytes En esta secci#n !oy a descri&ir lo que son los &ytes y los &its No !oy a descu&rir nada nue!o- as que la mayora se podrn saltar esta secci#n. *upongo ue todo el mundo sa&e lo que son los &ytes y los &its- pero por si acaso all !a . Los &its son la unidad de in ormaci#n ms pequeFa- digamos que son la &ase para alm acenar la in ormaci#n. *on como los tomos a las mol5culas. Lo !alores que puede tomar un &it son : # ;. *i juntamos ocho &its tenemos un &yte. Un &yte puede tomar Q^V !alores di erentes ,de : a Q^^.. GC#mo se consigue estoI 1maginemos nuestro lamante &yte con sus ocho &its. *upongamos que los ocho &its !alen ce ro Pa tenemos el alor : en el &yte. Ahora !amos a darle al 4ltimo &yte el !alor ; :::::::; >B Este es el u para el &yte. Ahora !amos a por el dos y el tres= ::::::;: >B Q ::::::;; >B S y as hasta Q^^. Como !emos con ocho &its podemos t er Q^V !alores di entes- que en &yte corresponden a los !alores entre : y Q^^. 8peradores de &its Pa hemos !isto que un &yte son ocho &its. $ues &ien- con los operadores de &its demos manipular las ria&les r dentro. os di erentes opera res de &its son= 8perador 3es ipci#n b 82 ,8. a AN3 ,P. _ 82 ,8 e"clusi!o. d Complemento uno o negaci#n 3espla%amiento a la derecha AA 3espla%amiento a la i%quierda 8perador b 82.= <oma los !al s y hace c los la operaci#n 82. /amos a !er un ejemplo= @include Astdio.hB int i . C print 6El resultado de la operaci#n QS^ b ;US es= [ n6- QS^ b ;US .7 E *e o&tiene= El esultado de la eraci#n QS^ b ;US s= QSO /eamos operaci#n a ni!el de &its=

QS^ >B ;;;:;:;; ;US >B ;:::;;;; b QSO >B ;;;:;;;; La operaci#n 82 unciona de la siguiente manera= <omamos los &its dos a dos y los comparamos si alguno de ellos es uno- se o&tiene un uno. *i am&os son cero el resultado es cero. $rimero se compara los dos primeros ,el primero de cada uno de los n4meros- ; y ; >B ;.- luego la segunda pareja ,; y : >B ;. y as sucesi!amente. 8perador a ,AN3.= Este operador compara los &its tam&i5n dos a dos. *i am&os son ; el resultado es ;. *i no- el resultado es cero. @include Astdio.hB int main,. C print , 6El resultado de la operaci#n ;Z: a ;^^ es= [iDn6- ;Z: a ;^^ .7 E <enemos= El resultado de la operaci#n ;Z: a ;^^ es= ;SX A ni!el de &its= ;Z: >B ;:;:;:;: ;^^ >B ;::;;:;; a ;SX >B ;:::;:;: 8perador _ ,c82.= Compara los &its y los pone a unos si son distintos. QS^ >B ;;;:;:;; ;US >B ;:::;;;; _ ;:: >B :;;::;:: 8perador d ,Complemento a uno.= Este operador acepta un s#lo dato ,operando. y pone a : los ; y a ; los :- es decir los in!ierte. *e pone delante del operando. @include Astdio.hB int main,. C print , 6El resultado de la operaci#n d;^Q es= [iDn6- d;^Q .7 E El resultado de la operaci#n d;^Q es= ;:S ;^Q >B ;::;;::: d ;:S >B :;;::;;; 8perador BB ,3espla%amiento a la derecha.= Este operador mue!e cada &it a la derecha. El &it de la i%quierda se pone a cero- el de la derecha se pierde. *i reali%amos la operaci#n in!ersa no recuperamos el n4mero original. El ormato es= !aria&le o dato BB n4mero de posiciones a despla%ar El n4mero de posiciones a despla%ar indica cuantas !eces hay que mo!er los &its hacia la derecha. Ejemplo= @include Astdio.hB

int main,. C print , 6El resultado de la operaci#n ;^: BB Q es= [iDn6- d;^Q .7 E El resultado de la operaci#n ;^: BB Q es= SZ /eamos la operaci#n paso a paso. Esta operaci#n equi!ale a hacer dos despla%amientos a la derecha= ;^: >B ;::;:;;: N4mero original Z^ >B :;::;:;; $rimer despla%amiento. Entra un cero por la i%quierdael cero de la derecha se pierde y los dems se mue!en a la derecha. SZ >B ::;::;:; *egundo despla%amiento. N8<A= Un despla%amiento a la i%quierda equi!ale a di!idir por dos. Esto es muy interesante porque el despla%amiento es ms rpido que la di!isi#n. *i queremos optimi%ar un programa esta es una &uena idea. *#lo sir!e para di!idir entre dos. *i hacemos dos despla%amientos sera di!idir por dos dos !eces- no por tres. 8perador AA ,3espla%amiento a la i%quierda.= Nunciona igual que la anterior pero los &its se despla%an a la i%quierda. Esta operaci#n equi!ale a multiplicar por Q. 8perador *i%eo Este es un operador muy 4til. Nos permite conocer el tamaFo en &ytes de una !aria&le. 3e esta manera no tenemos que preocuparnos en recordar o calcular cuanto ocupa. Adems el tamaFo de una !aria&le cam&ia de un compilador a otro- es la mejor orma de asegurarse. *e usa poniendo el nom&re de la !aria&le despu5s de si%eo y separado de un espacio= @include Astdio.hB int main,. C int !aria&le7 print , 6<amaFo de la !aria&le= [iDn6- si%eo !aria&le .7 E <am&en se puede usar con los especi icadores de tipos de datos ,char- int- loatdou&le..... $ero en 5stos se usa de manera di erente- hay que poner el especi icador entre par5ntesis= @include Astdio.hB int main,. C print , 6Las !aria&les tipo int ocupan= [iDn6- si%eo ,int. .7 E 8tros operadores E"isten adems de los que hemos !isto otros operadores. *in em&argo ya !eremos en sucesi!os captulos lo que signi ica cada uno. 8rden de e!aluaci#n de 8peradores 3e&emos tener cuidado al usar operadores pues a !eces podemos tener resultados no

esperados si no tenemos en cuenta su orden de e!aluaci#n. /amos a !er la lista de precedencias- cuanto ms arri&a se e!al4a antes= $recedencia ,. ef >B . ] d '' >> ,molde. M a si%eo ,El M es el de puntero. M L [ ,El M de aqu es el de multiplicaci#n. '> AA BB A AJ B BJ JJ ]J a _ b aa bb I= J 'J >J MJ LJ $or ejemplo imaginemos que tenemos la siguiente operaci#n= ;: M Q ' ^ *i !amos a la ta&la de precedencias !emos que el M tiene un orden superior al '- por lo tanto primero se hace el producto ;:MQJQ: y luego la suma Q:'^JQ^. /eamos otra= ;: M , Q ' ^ . Ahora con el par5ntesis cam&ia el orden de e!aluaci#n. El que tiene mayor precedencia ahora es el par5ntesis- se ejecuta primero. Como dentro del par5ntesis s#lo hay una suma se e!al4a sin ms- Q'^JZ. Pa solo queda la multiplicaci#n ;:MZJZ:. 8tro caso= ;: M , ^ M Q 'S . Como antes- el que mayor precedencia tiene es el par5ntesis- se e!al4a primero. 3entro del par5ntesis tenemos producto y suma. Como sa&emos ya se e!al4a primero el producto- ^MQJ;:. *eguimos en el par5ntesis- nos queda la suma ;:'SJ;S. ?emos aca&ado con el par5ntesis- ahora al resto de la e"presi#n. Cogemos la multiplicaci#n que queda= ;:M;SJ;S:. 8tro detalle que de&emos cuidar son los operadores '' y >>. Estos tienen mayor precedencia que las dems operaciones aritm5ticas ,'- >- M- L- [.. $or ejemplo= ;: M ^ '' $uede parecer que primero se ejecutar la multiplicaci#n y luego el ''. $ero si !amos a la ta&la de precedencias !emos que el '' est por encima de M ,de multiplicaci#n.- por lo tanto se e!aluar primero ^''JV. ;:MVJV:. Es mejor no usar los operadores '' y >> me%clados con otros- pues a !eces o&tenemos resultados inesperados. $or ejemplo= @include Astdio.hB int main,. C int a- &7 a J ^7 & J a''7

print , 6a J [i- & J [iDn6- a- & .7 E Este ejemplo en unos compiladores dar a J V- & J ^ y en otros a J V y & J V. $or a!or si podeis- escri&idme diciendo qu5 !alores os salen a !osotros y qu5 compilador usais. $ara asegurarse lo mejor sera separar la lnea donde se usa el '' y el J= @include Astdio.hB int main,. C int a- &7 a J ^7 a''7 & J a7 print , 6a J [i- & J [iDn6- a- & .7 E Ejercicios Ejercicio ;= En este programa hay un allo muy gordo y muy ha&itual en programaci#n. A !er si lo encuentras= @include Astdio.hB int main,. C int a- c7 a J ^7 c 'J a '^7 E *oluci#n= Cuando calculamos el !alor de KcK sumamos a'^ , J;: . al !alor de KcK. $ero resulta que KcK no tena ning4n !alor indicado por nosotros. Estamos usando la !aria&le KcK sin ha&erle dado !alor. En algunos compiladores el resultado ser inesperado. Este es un allo &astante ha&itual- usar !aria&les a las que no hemos dado ning4n !alor. Ejercicio Q= GCual ser el resultado del siguiente programaI @include Aconio.hB @include Astdio.hB int main,. C int a- &- c7 a J ^7 & J ''a7 c J , a ' ^ M Q . M , & ' V L Q . ' , a M Q .7 print , 6[i- [i- [i6- a- &- c .7 E *oluci#n= El resultado es ;^V. En la primera a !ale ^. $ero en la segunda se ejecuta & J ''a J ''^

J V. <enemos a J & J V. Ejercicio S= Escri&ir un programa que comprue&e si un n4mero es par o impar. *oluci#n= @include Astdio.hB int main,. C char pala&rae;::f7 int a7

También podría gustarte