Sei sulla pagina 1di 132

PROGRAMACIN AVANZADA (C/C++)

Febrero/Marzo 2011

BIBLIOGRAFIA

A Book on C Cmo Programar en C/C++.

Objetivos y Contenido del Curso


Revisar los conceptos principales de la programacin estructurada mediante el uso del lenguaje C. C Revisar los conceptos principales de la POO mediante el uso del lenguaje C++. C++ Se utilizar como plataforma el Qt (modo consola) El tipo de programacin que se consola). impartir sirve para muchas plataformas, no solo Windows.

CARACTERSTICAS DEL C

Es un lenguaje de propsito general. general Este lenguaje se ha utilizado para el desarrollo de aplicaciones tan dispares como: hojas de clculos, gestores de bases de datos, compiladores, sistemas operativos, etc. Es un lenguaje potente y eficiente. Usando C, un programador puede casi alcanzar la eficiencia del cdigo ensamblador, aunque se sacrifica algo la simplicidad del cdigo de otros lenguajes.

CARACTERSTICAS DEL C

Es un lenguaje de nivel medio. medio Este lenguaje permite programar a alto nivel (pensando a nivel lgico y no en la mquina fsica) y a bajo nivel (con lo que se puede obtener la mxima eficiencia y un control absoluto de cuanto sucede en el interior del ordenador). Es un lenguaje porttil. Los programas escritos en C son fcilmente transportables a otros sistemas.

DESVENTAJAS DEL C

Como desventajas habra que resear que es ms complicado de aprender que otros lenguajes como Pascal o Basic y que requiere una cierta experiencia para poder aprovecharlo a fondo. fondo

USO DEL C

Escribirlo en un editor Compilarlo en un compilador E l Enlazarlo l en un enlazador l d Ejecutarlo Podemos encontrar ambientes de desarrollo integrados (IDE) que realizan estos pasos automticamente.

Programacin estructurada

La programacin estructurada es un g que se basa en el estilo de programacin llamado a funciones y procedimientos j principal. p p desde un lazo de ejecucin

EL 1 1 EJEMPLO EN C
#include <stdio <stdio.h> h> main () { printf ("Mi ( Mi primer programa en C."); C. ); } La salida de este programa por pantalla es:
Mi primer programa en C C.

ANALISIS

Los programas en C estn compuestos de unidades de programa llamadas funciones, las cuales son los mdulos bsicos del programa. programa En este caso, el programa est compuesto por una sola l funcin f i llamada ll d main. i Todos los programas C deben tener una funcin main() pues es la primera funcin que se ejecuta cuando se hace funcionar el programa.

ANALISIS

Los parntesis L t i que siguen i a main i identifican id tifi a main como nombre de funcin. U mtodo Un t d de d comunicacin i i de d datos d t entre t funciones es el uso de argumentos. Los argumentos son los datos que se les pasa a las funciones. Estos se encierran entre parntesis; main es una funcin sin argumentos, lo que se indica mediante (). Siempre que se pueda se debe hacer uso de argumentos. g

ANALISIS

La funcin: main () { printf ("Mi primer programa en C."); } tambin se poda haber escrito as: main(){printf("Mi main(){printf( Mi primer programa en C C.");} );} pero en este caso el cdigo es menos legible para el usuario.

ANALISIS

La lnea: printf ("Mi primer programa en C."); realiza una llamada a una funcin denominada printf, con el argumento Mi primer programa en C.; printf es una funcin de biblioteca que realiza una escritura en la salida estndar. Normalmente la salida estndar es el monitor. La funcin printf se utiliza para salida con formato y es muy poderosa. En este caso escribe esc be u una a cade cadena a (secue (secuencia c a de ca caracteres). ac e es)

ANALISIS

printf es una funcin de biblioteca del lenguaje. lenguaje El prototipo de las funciones de biblioteca (y de las nuestras) se definen en un tipo de fichero llamado cabecera o header. En este caso es el fichero stdio.h (standard input/output header) Para utilizar este tipo de funciones es header). necesario incluir el correspondiente fichero de cabecera antes de utilizarla. Por o eje ejemplo: po #include <stdio.h>

ANALISIS

Las lneas que empiezan con # son lneas para ser manipuladas por el preprocesador. El preprocesador realiza algunas tareas antes de empezar a actuar el compilador. compilador La lnea: #include <stdio.h> lo que hace es incluir la informacin que hay en el fichero stdio.h stdio h en nuestro programa. programa

ANALISIS

Cada instruccin en C termina con un punto y coma. La lnea del main() no va seguida de punto y coma porque no se trata de una llamada a una funcin sino de la definicin de una funcin. La definicin de una funcin especifica las instrucciones (bloque de cdigo) que posee dicha funcin as como los argumentos que tiene. El C es case se sensitive s t e. No o es lo o mismo s o pa para a el C printf que PRINTF o que Printf.

EL 2 2 EJEMPLO EN C
#include <stdio <stdio.h> h> main () { printf ("Mi segundo programa en C.\n"); printf ("Pulsa la tecla RETURN para terminar."); getchar t h (); () }

La salida por pantalla de este programa es: Mi segundo g p programa g en C. Pulsa la tecla RETURN para terminar.

ANALISIS

Hay dos novedades con respecto al primer ejemplo: La primera es la aparicin del cdigo \n dentro de la cadena del primer printf. La segunda es la aparicin de una nueva funcin de librera: getchar (). La secuencia \n es un carcter especial que denota el carcter de nueva lnea. Al ser \n un carcter se puede incluir en cualquier parte de una cadena como cualquier otro carcter.

ANALISIS

Si no se hubiese incluido \n, \n la salida habra sido:

Mi segundo programa en C C. Pulsa la tecla RETURN para terminar.

Veamos algunas variantes equivalentes al ejemplo anterior. i


ANALISIS
#include <stdio <stdio.h> h> main () { printf i tf ("Mi segundo d programa en C C."); ") printf ("\nPulsa la tecla RETURN para terminar."); getchar t h () (); }

ANALISIS
#include <stdio <stdio.h> h> main i () { printf("Mi segundo programa en C.\nPulsa la tecla RETURN para terminar."); getchar(); }

ANALISIS
#include <stdio <stdio.h> h> main () { printf ( p ("Mi segundo g p programa g en C."); ); printf ("\n"); printf ( ("Pulsa la tecla RETURN para terminar."); ) getchar (); }

COMENTARIOS ADICIONALES.

A todos los caracteres empezados por \ se les llaman secuencias de escape. Las secuencias de escape son mecanismos para representar caracteres no imprimibles. Otras secuencias de escape son \r para el retorno de carro, \t para el tabulador, \b para retroceso, , \" p para la comilla, , \' p para el apstrofe p y \\ para la barra diagonal invertida. En la bibliografa g del curso se p puede encontrar un listado completo de las secuencias escape y su uso.

ANALISIS

getchar() () es una funcin f que espera la pulsacin de la tecla return por parte del usuario.Esta i E f funcin i no necesita i argumentos pero los parntesis son necesarios puesto que se trata de d una funcin. f i E.I: E I Estudiar E di getchar() h () getchar() se encuentra en la librera stdio.h, por lo tanto, siempre que utilicemos esta funcin en un programa es necesario incluir la lnea: #include <stdio.h>

EL 3 3 EJEMPLO EN C
#include <stdio.h> main () /* Tercer ejemplo */ { int gramos, kilogramos; kilogramos = 3; gramos = 1000 * kilogramos; printf ("%d gramos equivalen a %d kilogramos.", gramos, kilogramos); getchar (); } 3000 gramos equivalen a 3 kilogramos.

ANALISIS

En C, C todo aquello que vaya entre un / /* y un */ / es ignorado. Las secuencias /* y */ denotan el principio y el final de un comentario en C. Se deben utilizar comentarios en los programas para hacerlos ms comprensibles. Tambin se pueden usar // pero solo tienen el alcance de la linea donde se encuentran.

La lnea: int gramos, kilogramos; es una sentencia de declaracin.

ANALISIS

En este caso se declaran dos cosas: 1) En algn sitio de la funcin se utilizarn las "variables variables gramos y kilogramos. 2) Estas dos variables son de tipo entero (integer). El punto y coma final de la lnea de declaracin la identifican como una sentencia o instruccin C. Tambin se podra haber escrito: int gramos; int kilogramos;

ANALISIS

Las variables son posiciones de memoria donde el valor de su contenido puede variar a lo largo del programa.

En C, todas las variables utilizadas han de ser d l d antes declaradas t d de su uso. L Las l lneas: kilogramos = 3; gramos = 1000 * kilogramos; son sentencias de asignacin.

ANALISIS

La lnea: kilogramos = 3; significa: "dar dar a la variable kilogramos el valor 3". La lnea: gramos = 1000 * kilogramos; significa: "dar dar a la variable gramos el resultado de multiplicar 1000 por kilogramos". En la lnea: int gramos,kilogramos; g , g ; se reserva espacio en memoria para las variables gramos y kilogramos.

ANALISIS

En las lneas: kilogramos = 3; gramos = 1000 * kilogramos; se les da valor a dichas variables (al contenido de los espacios reservados). Posteriormente se les puede asignar a estas variables valores diferentes = es el l operador d d de asignacin i i y * es el l operador d d de multiplicacin.

ANALISIS

Otros operadores son: + (nmero positivo usado como operador unario y suma usado como operador p binario). ) - (nmero negativo usado como operador unario y substraccin usado como operador binario). / (operador de divisin). Se debe tener cuidado al manejarlo pues puede devolver la parte entera de la divisin. divisin %(operador mdulo, esto es, resto de la divisin de dos nmeros enteros).

ANALISIS

La lnea: printf ("%d gramos equivalen a %d kilogramos.", gramos kilogramos); gramos, escribe: 3000 gramos equivalen a 3 kilogramos.
Como

se ve los dos %d no se han escrito y sin embargo se ha escrito en su lugar los valores de l variables las i bl gramos y kilogramos. kil

ANALISIS

El smbolo % le indica a la funcin printf que se va a imprimir una variable en esta posicin; la letra d informa que la variable a imprimir es entera (digit). printf significa escritura (print) con formato (format) porque nos permite formatear la salida a nuestro gusto.

DATOS

Los programas funcionan con datos. datos Los datos son los nmeros y los caracteres que contienen la informacin a utilizar. Una primera divisin de los datos la podemos hacer en constantes y variables. Las constantes son datos con valores fijos que no pueden ser alterados por el programa. Las variables son datos cuyo valor se puede cambiar a lo largo del programa.

DATOS

Una segunda divisin de los datos la podemos hacer segn los tipos que sean. Algunos ejemplos de datos simples del C son: Tipo Descripcin Longitud en bytes Rango ------ ------------------ ----------------- ------------------------char carcter 1 0 a 255 int t entero e te o 2 -32768 3 68 a 3 32767 6 float coma flotante 4 aproxim. 6 dgitos de precisin double coma flotante de doble precisin 8 aproxim aproxim. 12 dgitos de precisin void sin valor 0 sin valor

Datos.

La longitud en bytes, bytes y por consiguiente, consiguiente tambin el rango, de la tabla anterior, dependen de cada tipo de procesador y de cada compilador de C. En C, los caracteres se definen con apstrofes. apstrofes Ejemplos vlidos de constantes tipo carcter: 'T' T , 'l' l , '1' 1. Ejemplos invlidos de constantes tipo carcter: 'TT', , l, , 1.

TIPO CARACTER

'TT' es incorrecto porque hay dos caracteres entre los apstrofes; l es incorrecto porque el compilador lo interpreta como una variable; el 1 lo interpreta el compilador como un nmero y no como un carcter. El valor de una constante carcter es el valor numrico del carcter en el conjunto de caracteres del sistema. Por ejemplo, j p , en el conjunto j ASCII, , el carcter cero, , o '0', es 48

TIPO CARACTER

char ch1, ch2; /* declaracin de las variables ch1 y ch2 */ ch1 = 'A'; /* a la variable ch1 se le asigna el valor ASCII de 'A': A : 65 */ / ch2 = 65; /* a la variable ch2 se le asigna el cdigo ASCII 65 que es 'A'*/

TIPO ENTERO

Es un nmero sin parte fraccionaria. fraccionaria Las constantes enteras se pueden escribir de uno de los tres modos siguientes: g En decimal: escribiendo el nmero sin empezar por 0 (a excepcin de que sea el propio 0). Ejemplos: 1, 0, 2. En hexadecimal: empezando el nmero por 0x. Ejemplos: 0xE 0xE, 0x1d 0x1d, 0x8 0x8. En octal: empezando el nmero por 0. Ejemplos: 02, 010.

TIPOS FLOAT Y DOUBLE


Las constantes de este tipo tienen parte real y parte fraccionaria. El tipo double tiene el doble de precisin que el tipo float. Por lo dems, los dos tipos son iguales. La sintaxis correcta de las constantes de estos dos tipos es: [signo] [dgitos] [.] [dgitos] [exponente [signo] dgitos] Donde: signo es + o dgitos es una secuencia de dgitos . es el punto decimal exponente es E o e Algunos ejemplos de este tipo: 1.0e9, 1 0e9 -3E-8, 3E 8 -10.1 10 1

TIPO VOID

Significa sin valor valor, sin tipo tipo. Uno de los usos de void se puede observar al comparar estos dos programas: #include <stdio.h> main () { printf ( ("Versin Versin 1. 1 "); ); getchar (); } #include <stdio.h> void main (void) { printf ( ("Versin Versin 2. 2 "); ); getchar (); }

TIPO VOID

Al poner void entre los parntesis de la definicin de una funcin, se define a sta como funcin que no tiene argumentos. No confundir con llamada a funcin, en cuyo caso no se puede utilizar el void. Del mismo modo, al poner void antes del nombre de la funcin en la definicin de sta, se est declarando como funcin que no devuelve nada.

PROGRAMA EJEMPLO
#include <stdio.h> stdio.h void main (void) { int i = 1; char c = 'c'; float f = 2.0; ; int a = 3; float x= i/a; double d = 1e-1; printf (" i =%d\n %d\n c =%c\n %c\n f =%f\n %f\n d =%lf\n %lf\n a a=%f %f i/a i/a=%f", %f" i i, c c, f f, d,a,i/a); printf("\n %f",x); getchar (); }

ANALISIS

Algunas sentencias son: int i = 1; char h c = ''c'; ' float f = 2.0; int a = 3; Como se puede observar en el programa, se puede asignar un valor a una variable en el momento de la declaracin.

ANALISIS

Anteriormente ya se dijo que %d indica a la funcin printf el lugar en que se ha de escribir una variable de tipo entera. Los cdigos %c, %f y %lf indican a la funcin printf el lugar en la cadena de caracteres en la que se han de escribir variables de tipo char, float y double respectivamente.

MODIFICADORES

A excepcin del tipo void, void los tipos de datos bsicos pueden tener varios modificadores precedindolos. Hay modificadores de tipo y de acceso. Un modificador de tipo se usa para alterar el significado del tipo base para que se ajuste ms precisamente a las necesidades de cada momento. p

MODIFICADORES DE TIPO
Modificadores de tipo: Modif. Desc. Tipos a los se les puede aplicar ----------- -------------------------------------------------------signed con signo int int, char unsigned sin signo int, char long largo int, int char, char double short corto int, char

MODIFICADORES DE TIPO

El uso de signed con enteros es redundante aunque est permitido, ya que la declaracin implcita de entero asume un nmero con signo. El estndar ANSI elimina el long float por ser equivalente al double. printf: %lf; que significa: long float. float Se puede utilizar un modificador de tipo sin tipo; en este caso, , el tipo p se asume q que es int.

MODIFICADORES DE TIPO
Tipo Long. en bytes ------------------ ---------------------char 1 unsigned char 1 signed char 1 int 2 unsigned int 2 signed int 2 short h int i 1 unsigned short int 1 signed short int 1 long int 4 signed long int 4 unsigned long int 4 float 4 d bl double 8 long double 16 Rango --------------------------------------Caracteres ASCII 0 a 255 -128 128 a 127 -32768 a 32767 0 a 65535 -32768 a 32767 -128 128 a 12 127 0 a 255 -128 a 127 -2147483648 2147483648 a 2147483649 -2147483648 a 2147483649 0 a 4294967296 Aprox. 6 dgitos de precisin Aprox. A 12 d dgitos it de d precisin i i Aprox. 24 dgitos de precisin

MODIFICADORES DE ACCESO

Como su propio nombre indica indica, estos modificadores modifican el acceso a los tipos. Estos modificadores son: M difi d Modificador D Descripcin i i --------------- ---------------const constante volatile voltil

MODIFICADORES DE ACCESO

Las variables de tipo const son aqullas a las que se les asigna un valor inicial y este valor no puede ser cambiado a lo largo del programa. Se utilizan para declarar constantes. Ejemplo de declaracin de una constante: const unsigned g int hola; ;

MODIFICADORES DE ACCESO

Las variables de tipo volatile previenen al compilador que dicha variable puede ser cambiada por medios no explcitamente especificados en el programa. Obsrvese las siguientes sentencias C: int v; v = 1; v = 2; En estos casos, casos los compiladores suelen optimizar el cdigo y la primera sentencia de asignacin se desecha y no se genera cdigo para ella ya que es redundante.

MODIFICADORES DE ACCESO

Si se hubiese declarado la variable v como volatile: volatile v;

la optimizacin p descrita no se realizara sobre la variable v, generndose cdigo para las dos asignaciones. El mayor uso que puede d tener t es en multitarea. ltit C d Cada referencia a la variable genera una instruccin de carga g desde memoria p por p parte del compilador p (y no de un registro).

CADENAS DE CARACTERES

Una cadena de caracteres (tambin conocido por el nombre de string) es una secuencia de caracteres encerrados entre comillas. Ejemplos de cadenas: Esto es una cadena. abc a \n a \n b \n c \n Las comillas no forman parte de la secuencia. Sirven para especificar el comienzo y final de sta, al igual que los apstrofos marcaban los caracteres individuales.

CADENAS DE CARACTERES

Las cadenas son tratadas por el C como un array de caracteres. Un array (conocido tambin con el nombre de vector) es una secuencia de datos que se encuentran almacenados en memoria de una forma consecutiva. Un array de caracteres es una secuencia de caracteres. El array: "abc" se almacenara en memoria como: a b c \0

CADENAS DE CARACTERES

El carcter '\0' \0 se llama carcter nulo, nulo y es utilizado por el C para marcar el final de la cadena en memoria. El carcter nulo ('\0') no es la cifra 0 (cuyo cdigo ASCII es 48), sino un carcter no imprimible, cuyo cdigo ASCII es 0. A este tipo de cadena se le suele llamar ASCIIZ. Teniendo en cuenta el carcter nulo en la cadena "abc", esta cadena es un array de tamao 4 (tres caracteres ms el carcter nulo).

CADENAS DE CARACTERES
Ejemplo: j p void main (void) { char ch1, ch2, ch3, ch4; ch1 = '\0'; /* en memoria, ch1 tiene el valor 0 que es el valor ASCII correspondiente al carcter '\0 \0 */ / ch2 = 0; /* en memoria, ch2 tiene el valor 0 */ ch3 = '0'; /* en memoria, ch3 tiene el valor 48 que es el l valor l ASCII correspondiente di t al l carcter t '0 */ ch4 = 48; /* en memoria, ch4 tiene el valor 48 */ }

CADENAS DE CARACTERES
#include <stdio <stdio.h> h> void main (void) { printf ("\n Esta cadena est separada en dos.\n(%s)", dos.\n(%s) , y esta es la segunda parte"); parte ); }

CADENAS DE CARACTERES

En este ejemplo podemos observar la aparicin de dos cosas nuevas: la divisin de una cadena de caracteres en varias lneas y el cdigo de formato %s. El cdigo %s le indica a la funcin printf que escriba una cadena en su lugar. Una cadena de caracteres se p puede escribir en varias lneas de fichero cerrando las comillas al final de la lnea y volvindolas a abrir en la lnea siguiente. Hacindolo de este modo, , el compilador p lo interpreta p como una sola cadena de caracteres escrita en varias lneas.

CADENAS DE CARACTERES

Conviene hacer la observacin que 'x' x es distinto de "x". 'x' es una constante carcter. "x" es una cadena de caracteres. 'x' pertenece a un tipo bsico (char). "x" es de un tipo d i d (array derivado ( compuesto t de d elementos l t d l tipo del ti bsico char). "x", en realidad, contiene dos caracteres, a saber, , 'x' y '\0'.

OPERADORES

Un operador es un smbolo que realiza una determinada operacin sobre sus operandos. Un operando es el dato que va a ser manipulado por el operador. Los operadores en C se pueden dividir en cuatro grupos: a) Operadores aritmticos. b) Operadores relacionales y lgicos lgicos. c) Operadores a nivel de bits. d) ) Operadores p especiales. p

OPERADORES ARITMETICOS
Operador -------------+ * / % -++ Accin -----------------------------Resta tambin menos monario Resta, Suma, tambin suma monaria Multiplicacin p Divisin Divisin en mdulo Decremento Incremento

OPERADORES ARITMETICOS

Los operadores de incremento y decremento solo se pueden aplicar a variables, no constantes. El de incremento aade 1 a su operando y el de decremento resta 1, 1 es decir: ++x; o x++; es lo mismo que x = x + 1; --x; x; o x--; x ; es lo mismo que x = x - 1; Los operadores de incremento y decremento pueden preceder o seguir p g al operando. p Si el operador p precede al p operando, C lleva a cabo la operacin antes de utilizar el valor del operando. Si el operador sigue al operando, C utilizar su valor antes de incrementarlo o decrementarlo.

OPERADORES ARITMETICOS
ejemplos: int x, y; x = 2; y = ++x; x; /* ahora x tiene el valor 3, 3 y tiene el valor 3 */

int x, y; x = 2; y=x x++; ; /* ahora x tiene el valor 3 , y tiene el valor 2 */

OPERADORES ARITMETICOS

La precedencia de los operadores aritmticos es la siguiente: MAYOR ++ -+ (ms monario) - (menos monario) * / % MENOR + Los operadores del mismo nivel de precedencia son evaluados l d por el l compilador il d d de i izquierda i d ad derecha. h Se puede alterar el orden de evaluacin utilizando p parntesis.

OPERADORES ARITMETICOS
Ejemplo: void main (void) { , x2, , x3, , x4, , x5, , x6; ; int x1, /* Asignaciones */ x1 = 2 + 3 * 4; x2 = (2 + 3) * 4; x3 = -4 - (-1); x4 = 10 / 2 % 3; x5 = ++x3 - x4; x6 = x3++ - x4;

/* Orden de asignaciones /* x1 = 14; /* x2 = 20; /* x3 = -3; /* x4 = 2; /* x3 = -2; x5 = -4; /* x6 = -4; x3 = -1;

*/ */ */ */ */ */ */

OPERADORES ARITMETICOS
x1 1 = -x1; 1 x2 = (x1 + x2) / x3; x3 = ((x1++) + (x2++)) - x3; x4 = -(-(-x3)); x5 = (x6 * x6 + x6 / x6); x6 = ( (x1++) )+( (++x2) )-( (++x6); ); x1++; --x2; } /* x1 1 = -14; 14 */ /* x2 = -6; */ /* x3 = -19; x1 = -13; x2 = -5; */ /* x4 = 19; */ /* x5 = 17; */ /* x2 = -4; ; x6 = -3; ; x6 = -14; ; x1 = -12; ; */ /* x1 = -11; */ /* x2 = -5; */

OP. RELACIONALES Y LOGICOS


La palabra relacional se refiere a la relacin entre unos valores y otros. La palabra lgico se refiere a las formas en q que esas relaciones pueden conectarse entre s. Los veremos j juntos p porque q ambos operadores p se basan en la idea de cierto (true en ingls) y falso (false en ingls). En C, cualquier valor distinto de cero es cierto, y el valor 0 es falso. Las expresiones que son ciertas toman el valor de 1 y las que son falsas toman el valor de 0 0.

OP. RELACIONALES Y LOGICOS


Operadores relacionales Operadores lgicos Operador Accin Operador Accin ---------------------------------------- ----------> Mayor que && AND >= Mayor o igual que || OR < Menor que ! NOT <= Menor o igual que == Igual ! != No N igual i l

OP. RELACIONALES Y LOGICOS


Tabla de verdad para los operadores lgicos: p q p && q p || q 00 0 0 01 0 1 10 0 1 11 1 1 !p 1 1 0 0

OP. RELACIONALES Y LOGICOS


Precedencia de estos operadores: MAYOR ! > >= < <= == != ! && ||

MENOR

OP. RELACIONALES Y LOGICOS


Ejemplo: void main (void) { int x1, x2, x3, x4, x5, x6;" /* Asignaciones */ /* Orden de asignaciones */ x1 1 = 10 < 12 12; /* x1 1=1 1; */ x2 = 10 > 12; /* x2 = 0; */ x3 = -1 1 && 5; /* / x3 = 1; */ / x4 = 0 || x3; /* x4 = 1; */

OP. RELACIONALES Y LOGICOS


Una particularidad interesante del C es que la evaluacin de una expresin se termina en cuanto se sabe el resultado de dicha expresin. Por ejemplo: 0 && x 1 || x En las dos expresiones anteriores NO se evala x puesto que es superfluo: fl en la l primera i expresin i al l ser uno de d los l dos d operandos d 0, el otro no hace falta mirarlo; con la segunda expresin podemos decir lo mismo. Como los operadores && y || se evalan de izquierda a derecha, derecha podemos asegurar aseg rar que q e es el segundo seg ndo operando (el que q e contiene la x) el que no se evala. Si la expresin fuera: x && 0, se evaluara la x, y si sta es cierta se evaluara el 0, y si la x fuera falsa no se evaluara el 0. falsa, 0

OP. RELACIONALES Y LOGICOS


x5 = x1 >= x2 <= x3; x6 = x1 == x2 || x3 != x4; x1 = !x1; x2 = ! (!x1 || x3 <= x3); x3 = 1 && 0; ; x4 = 1 || 0; x5 = !(-10); ( ) x6 = !!x4; } /* / x5 = 1; /* x6 = 0; /* / x1 = 0; /* x2 = 0; /* x3 = 0; ; /* x4 = 1; /* x5 = 0; /* x6 = 1; */ / */ */ / */ */ */ */ */

OPERADORES A NIVEL DE BITS


Estos operandos p realizan operaciones p sobre los bits de un byte o una palabra (dos bytes). Slo se pueden utilizar con los tipos char e int. Operador Accin ------------- ----------------------------------------& AND | OR ^ OR exclusivo l i (XOR) ~ Complemento a uno (NOT) >> Desplazamiento a la derecha << Desplazamiento a la izquierda

OPERADORES A NIVEL DE BITS


Tabla de verdad: p q p & q p | q ~p p 00 0 0 1 01 0 1 1 10 0 1 0 11 1 1 0 p^q 0 1 1 0

OPERADORES A NIVEL DE BITS


Ntese que los operadores relacionales y lgicos siempre producen un resultado que es 0 1, mientras que las operaciones entre bits producen cualquier valor arbitrario de acuerdo con la operacin especfica. especfica Por ejemplo: char x, y, z1, z2; z1 = 2 && 3; z2 = 2 & 3; /* z1 = 1; z2 = 2 */ Por q qu ( (2 && 3) ) es 1 y ( (2 & 3) ) es 2? 2&&3: compilador evala la expresin 1 && 1 es 1. 2&3: el compilador evala 00000010 & 00000011 es 00000010 (2 en decimal)

OPERADORES A NIVEL DE BITS


Sintaxis para los operadores de desplazamiento: expresin >> nmero de bits a desplazar a la derecha expresin << nmero de bits a desplazar a la izquierda Dos observaciones sobre los operadores de desplazamiento: 1) Un desplazamiento no es una rotacin. rotacin O sea, sea los bits que salen por un extremo no se introducen por el otro. 2) Normalmente, Normalmente a medida que se desplaza los bits hacia un extremo se va rellenando con ceros por el extremo opuesto. PERO NO EN TODOS LOS ORDENADORES ES ASI. Si queremos introducir ceros y que el programa sea porttil lo tenemos que h hacer explcitamente l it t con una operacin i and. d

OPERADORES A NIVEL DE BITS


Tabla de precedencia: MAYOR ~ << >> & ^ MENOR |

OPERADORES A NIVEL DE BITS


Ejemplos: void main (void) { , y;" y; char x, /* Asignaciones x en bits /* ------------------ ---------------x = 2; y = 3; /* 0000 0010 y = y << 1; /* 0000 0010 y = x | 9; /* 0000 0010 y = y << 3; /* 0000 0010 x = ~x; /* 1111 1101 x = 4 ^ 5 & 6; /* 0000 0000 }

y en bits valor de x valor de y */ -------------- ------------- ------------- */ 0000 0011 2 3 */ 0000 0110 2 6 */ 0000 1011 2 11 */ 0101 1000 2 88 */ 0101 1000 -3 88 */ 0101 1000 0 88 */

OPERADORES ESPECIALES

Bajo este apartado se recogen una serie de operadores no agrupables en ninguno de los grupos anteriores. Estos operadores son los siguientes: ? &* sizeof , . -> () []

OPERADOR CONDICIONAL (?)


El operador ? tiene la forma general: expresion_1 ? expresion_2 : expresion_3 donde expresion_1, expresion 1 expresion_2 expresion 2 y expresion expresion_3 3 son expresiones C. El operador ? acta de la siguiente forma: Evala expresion_1. Si es cierta, evala expresion_2 y toma ese valor p para la expresin. p Si expresion p _1 es falsa, , evala expresion_3 y toma su valor para la expresin.

OPERADOR CONDICIONAL (?)


Ejemplo: int x, y; x=2<3?4:5 5; /* a x se l le asigna i el l valor l 4 4: x = 4; */ y=2>3?4:5 5; /* a y se l le asigna i el l valor l 5 5: x = 5; */ x = 1 < 2 ? (4 > 3 ? 2 : 3) : 5 5; /* a x se l le asigna i el valor 2: x = 2;

DIRECCION (&) Y CONTENIDO ( (*). ).


Estos dos operadores operan con punteros punteros. Los dos son monarios. Un puntero es una variable que contiene una direccin de memoria. El significado que tiene en este caso el operador * no ti tiene absolutamente b l t t nada d que ver con el l que ti tiene el l operador aritmtico *. En el cdigo fuente no hay confusin entre uno y otro pues p el aritmtico es binario y el de punteros es monario. Lo mismo ocurre con el operador &.

OPERADOR sizeof
El operador sizeof es un operador monario que toma el valor de la longitud, en bytes, de una expresin o de un tipo; en este ltimo caso, el tipo ha de estar entre parntesis. Ejemplo: #include <stdio.h>

void main (void) { double a; printf ("La cantidad de bytes de un doble en memoria es %d" ,sizeof(a)); }

OPERADOR COMA (,)


La coma (,) tiene dos usos muy y distintos en C: 1) Para representar una lista de elementos, por ejemplo: int a, b, c; printf ("%d%d%d", ("%d%d%d" 1 1, 2 2, 3); 2) Como operador. Como operador, la coma encadena varias expresiones. Estas expresiones son evaluadas de izquierda a derecha y el valor de la expresin total es el valor de la expresin ms a la derecha. Por ejemplo: int x; x = (2, 3, 4); /* a x se le asigna el valor 4: x = 4; */

OP. PUNTO (.) Y FLECHA ( (->) >)


Estos dos operadores se utilizan con dos tipos compuestos: estruct (estructura) y union (unin). (unin) El significado, tanto de los tipos compuestos struct y union, como de los operadores . y ->, se estudiarn en clases posteriores.

PARENTESIS () Y CORCHETES []

Los parntesis se pueden considerar como operadores que aumentan la precedencia de las operaciones que contienen. Ejemplo: int x = 1 - 2 * 3; /* a x se le asigna el valor -5: x = -5; */ int y = (1 - 2) * 3; /* a y se le asigna el valor -3: x = -3; */ Los parntesis tambin se usan usan, dentro de una expresin, para especificar la llamada a una funcin.

PARENTESIS () Y CORCHETES []

Los corchetes llevan a cabo el indexamiento de arrays. Ya hemos hablado anteriormente un poco de ellos y se estudiar ms adelante. Ejemplo: float f[3]; / /* reserva memoria para tres float: f[0], f[0] f[1] y f[2] */ f[0] = 1.1; 1 1; f[1] = 2.2; 2 2; f[2] = 3.3; 3 3; / /* tres asignaciones */

SENTENCIAS DE ASIGNACION

Una sentencia de asignacin g es una sentencia C en la que se asigna un valor a una variable. La forma general de la sentencia de asignacin es: nombre variable operador nombre_variable operador_de_asignacin de asignacin expresin; donde operador_de_asignacin es uno de los operadores siguientes: =, *=, /=, %=, +=, -=, <<=, >>=, &=, ^=, |=. Una sentencia de asignacin es una expresin. El valor de esta expresin es el valor que se le asigna a la variable. El operador de asignacin se evala de derecha a izquierda.

SENTENCIAS DE ASIGNACION

Ejemplo: int x, y; x = y = 2; /* el 2 se asigna primero a la y y luego a la x */ Con el operador =, el significado de la asignacin es dar el valor de la expresin de la parte derecha a la variable que se encuentra en la parte izquierda del operador =. . Ejemplo: int a a, b b, c; a = 5; b = 4 + a; c = (a * b) - 1;

SENTENCIAS DE ASIGNACION
Sentencia de asignacin --------------------------------x *= y; x /= y; x %= y; x += y; x -= y; x <<= y; x >>= y; x &= y; x ^= y; x |= y; Sentencia equivalente ----------------------------------x = x * y; x = x / y; x = x % y; x = x + y; x = x - y; x = x << y; x = x >> y; x = x & y; x = x ^ y; x = x | y;

INICIALIZACION DE VARIABLES

La forma de inicializacin es: tipo nombre_variable = expresin; Ejemplo: fl t f = 3.0; float 30 Tambin T bi se pueden d i inicializar i i li varias i variables i bl separadas por comas en una misma sentencia.

INICIALIZACION DE VARIABLES

int x = 1; / /* declaracin e inicializacin de x */ / char ch1 = 'a', ch2 = 'b'; /* declaracin e inicializacin de ch1 y ch2 */ fl t f1 = 2.2, float 2 2 f2 = 3e3; 3 3 /* declaracin d l i e inicializacin i i i li i de f1 y f2 */ int x, , y = 3, z; ; /* / declaracin dec a ac de x, , y, z inicializacin c a ac de y */ double d = 1.1 - 2.2; /* declaracin e inicializacin de d */ / int a = 1 + 2, b = 4, c; /* declaracin de a, b, c pero esta ltima no se inicializa */

PRECEDENCIA DE OPERADORES

Mayor () [] -> . ! ~ ++ -- - (tipo) * & sizeof * / % << >> < <= > >= == != & ^ | && || ? = += -= *= /= %= &= ^= |= <<= >>= Menor ,

Ejemplos
Expresin 1: 10 < 5 && 8 >= 3 Paso 1: 0 && 8 >= 3 Paso 2: 0 && 1 Paso 3: 0 Expresin 2: x = (y = 3), y Paso 1: a la variable y se le asigna el valor 3 Paso 2: el valor de la expresin coma es y, o sea, 3 P Paso 3: 3 a la l variable i bl x se le l asigna i el l valor l 3 Paso 4: el valor de toda la expresin es x, es decir, 3

Ejemplos
Expresin 3: 1 + 2 < 3 || 4 + 5 > 2 Paso 1: 3 < 3 || 4 + 5 > 2 Paso 2: 0 || 4 + 5 > 2 Paso 3: 0 || 9 > 2 Paso 4: 0 || 1 Paso 5: 1 Expresin 4: (-3 < !2) >> (~-3) P Paso 1: 1 ( (-3 3 < 0 ) >> ( (~-3) 3) Paso 2: 1 >> (~-3) Paso 3: 1 >> 2 Paso 4: 0

Ejemplos
Expresin 5: 2 < 3 < ((4 - 1) / !3) Paso 1: 1 < ((4 - 1) / !3) Paso 2: 1 < ( 3 / !3) Paso 3: 1 <( 3 /0) Paso 4: Error: Divisin por cero.

SENTENCIAS DE CONTROL

La mayora de las sentencias de control de cualquier lenguaje estn basadas en condiciones Una condicin es una expresin condiciones. cuya resolucin da como resultado cierto (true) o falso (false). (false) Muchos lenguajes de programacin incorporan los valores true y false; en C cualquier valor distinto de cero es true, y el valor cero es false.

Sentencias de Control

Las sentencias de control son las que controlan el flujo de programa, pues pueden cambiar el orden de ejecucin secuencial que se sigue en el programa. Hay varios tipos de estructuras de control de programa, cada una de utilidad en determinada situacin:

SENTENCIAS CONDICIONALES

C posee dos sentencias condicionales: if y switch. Adems, el operador ? es una posible alternativa para if en ciertas situaciones.

SENTENCIA IF
SINTAXIS if (expresin) sentencia o if (expresin) sentencia 1 sentencia_1 else sentencia_2

SENTENCIA IF

DESCRIPCION Si expresin es cierta se ejecuta la sentencia correspondiente al if. Si expresin es falsa se ejecuta la sentencia correspondiente al y else si lo hay. En la segunda sintaxis se ejecuta sentencia_1 o sentencia_2, pero nunca ambas. EJEMPLOS if (contador < 50) contador++;

if (x < y) z = x; else z = y;

if (ch == '\n') { #_de_lineas++; #_de_caracteres++; }

SENTENCIA IF
OBSERVACIONES 1) Lo siguiente es incorrecto: if (expresin) { sentencias }; else sentencia puesto que entre el if y el else slo puede haber una sentencia y aqu hay dos: { } y ;.

SENTENCIA IF
2) Al ser la sentencia if una sentencia simple, la sentencias if se pueden anidar: /* a la variable numero_menor se le asigna la variable con menor valor entre x, y, z */ / if (x <= y) if (x <= z) numero menor = x; numero_menor else numero_menor = z; else if (y <= z) numero_menor = y; else numero_menor = z;

SENTENCIA IF
3) El else siempre est asociado al if ms cercano cercano. Los dos siguientes ejemplos son distintos: /* Ejemplo j p 1: */ /* Ejemplo j p 2: */ if (n > 0) if (n > 0) if (a > b) { z = a; if (a > b) else z = a; z = b; } else ( puede (z d no tomar valor) l ) z = b; b // siempre i l toma lo

SENTENCIA IF
4) Un constructor comn en programacin es la escala if-else-if if else if. Tiene la forma siguiente: if (expresin_1) /* Ejemplo: numero_menor sentencia_1 t i 1 t toma el l valor l d de l la variable i bl else if (expresin_2) menor entre x, y, z */ sentencia_2 _ if ( (x <= y && x <= z) ) . numero_menor = x; . else if (y <= z && y <= z) . numero menor = y; numero_menor else else sentencia_n numero_menor = z;

SENTENCIA IF
5) El operador ? se puede utilizar para reemplazar las sentencias ifif else. /* Ejemplo 1 con if-else */ /* Ejemplo 1 con ?: */ if (x <= y) z = x <= y ? x : y; z = x; else z = y; /* Ejemplo 2 con if-else */ /* Ejemplo 2 con ?: */ if (n == 1) n == 1 ? printf ("Mensaje 1") 1"); printf ("Mensaje 1") 1"): else printf ("Mensaje 2"); printf ("Mensaje 2");

SENTENCIA SWITCH
SINTAXIS switch (expresin) { p _constante_1: case expresin sentencias_1 break; case expresin_constante_2: sentencias_2 break; case expresin_constante_3: sentencias_3 break; default: sentencias_n t i }

SENTENCIA SWITCH

DESCRIPCION En muchas ocasiones es ms elegante utilizar la sentencia switch que la escala if-else-if. Una expresin constante es una expresin en la que todos los operandos son constantes. El switch evala expresin expresin. A continuacin evala cada una de las expresiones constantes hasta que encuentra una que coincida con expresin. Cuando la encuentra ejecuta las sentencias correspondientes a ese case case. Si no ha hay ning ninguna na e expresin presin case que coincida con expresin, se ejecuta las sentencias correspondientes al default.

SENTENCIA SWITCH
OBSERVACIONES 1) La sentencia default es opcional. Si fallan todas las comprobaciones de los case y no hay default, no se ejecuta ninguna accin en el switch switch. Incluso el default puede ir en cualquier posicin y no obligatoriamente al final. 2) La sentencia switch se diferencia de la escala if-else-if en dos cosas: A) En la sentencia switch slo se puede comprobar la igualdad entre las expresiones constantes y expresin. B) Las expresiones de los case han de ser constantes.

SENTENCIA SWITCH
EJEMPLO switch (operando) { case 1: x *= y; break; case 2: x /= / y; break; case 3: x += y; break; default: printf ("-ERROR!"); ( -ERROR! ); }

SENTENCIA SWITCH

3) Las sentencias break en el switch son opcionales. El break hace que se produzca una salida inmediata de la instruccin switch. switch Si no hay una sentencia break en un case, al ejecutarse j las sentencias q que corresponden p a ese case, tambin se ejecutaran las sentencias correspondientes al siguiente case y as sucesivamente hasta encontrar un break o llegar al final del switch.

SENTENCIA SWITCH
4) Asociado a cada case puede haber ninguna, una o varias sentencias. case 1: /* case sin sentencias directas*/ case 2: /* case con dos sentencias */ ; ++x; break; case 3: x++; break; y++;/*est sentencia nunca se ejecuta*/ case 4: /* case con tres sentencias */ x++; y++; break;

SENTENCIAS ITERATIVAS

Los bucles o sentencias iterativas permiten que un conjunto de instrucciones sea ejecutado hasta que se alcance una cierta condicin. Las sentencias iterativas son: while, for y do.

SENTENCIA WHILE
SINTAXIS while (expresin) sentencia DESCRIPCION Se S evala l expresin. i Si es cierta, i t se ejecuta j t sentencia t i y se vuelve a evaluar expresin. El ciclo contina hasta que expresin es falsa falsa, momento en que la ejecucin contina con lo que est despus de sentencia.

SENTENCIA WHILE
EJEMPLOS /* el bucle termina cuando encuentra un carcter distinto de blanco en vector s */ i = 0; while (s[i] == ' ') i i++; /* /* imprime los cinco prial ; del while no meros nmeros naturales se llega nunca ya */ que el bucle no i = 1; hace ninguna while (i <= 5) iteracin. { */ printf ("\ni = %d", i); int condicion = 0; i++; while (condicion) } ;

SENTENCIA FOR
FORMA GENERAL for (expresin_1; expresin_2; expresin_3) sentencia DESCRIPCION En la sentencia for, a la expresin_1 se le llama i i i li inicializacin, i a l la expresin_2 i 2 se l le ll llama condicin, y a la expresin_3 se le llama incremento. incremento

SENTENCIA FOR
La forma descrita de la sentencia for es equivalente q a: expresin_1 while (expresin_2) (expresin 2) { La forma de actuar del bucle for se observa sentencia claramente en su equivalente del while. expresin_3; } Las tres expresiones de la sentencia for son opcionales, aunque los puntos y coma siempre deben aparecer. Si no aparece expresin_2 se asume que es 1 1.

SENTENCIA FOR
EJEMPLOS #include <stdio.h> void main (void) { printf ("Lista de los 100 primeros" "nmeros naturales:\n); int x; for (x = 1; x <= 100; x++) printf ("%d ", x); } #include <stdio.h> void main (void) { int i, s; for (s = 0, i = 1; i < 100; i++) s += i; printf ("La suma de los" primeros 100 nmeros t l es %d.",s); naturales %d " ) }

SENTENCIA FOR
Nota: (s = 0, 0 i = 1) es una expresin, expresin ms concretamente concretamente, es una expresin formada por el operador coma, cuyos operandos son expresiones de asignacin. OBSERVACION La instruccin: for (;;) sentencia t i es un bucle infinito.

SENTENCIA DO

SINTAXIS do sentencia while (expresin); DESCRIPCION En la instruccin do, primero se ejecuta sentencia y a continuacin se evala expresin. En caso de ser cierta, i t se ejecuta j t sentencia t i de d nuevo y as sucesivamente. La iteracin termina cuando la expresin p se convierte en falsa.

SENTENCIA DO
EJEMPLO /* imprime los 50 primeros nmeros naturales */ #include <stdio <stdio.h> h> void main (void) { i ti=1 int 1; do { printf ("%d ", i++); } while (i <= 50); }

SENTENCIA DO

Las llaves en el ejemplo anterior no son necesarias al tratarse de una sola sentencia; pero en el caso de la sentencia do, se recomienda que siempre se pongan las llaves para hacer el programa ms legible (para el lector, no para el compilador). Observe el mismo ejemplo sin llaves: i = 1; 1 do printf ( ("%d %d ", i++); while (i <= 50);

SENTENCIA WHILE
SINTAXIS while (expresin) sentencia DESCRIPCION Se S evala l expresin. i Si es cierta, i t se ejecuta j t sentencia t i y se vuelve a evaluar expresin. El ciclo contina hasta que expresin es falsa falsa, momento en que la ejecucin contina con lo que est despus de sentencia.

SENTENCIA WHILE
EJEMPLOS /* /* /* el bucle termina imprime los cinco prial ; del while no cuando encuentra meros nmeros naturales se llega nunca ya un carcter dis*/ que el bucle no to de blanco en i = 1; nace ninguna vector s while (i <= 5) iteracin. */ { */ i = 0; printf ("\ni = %d", i); int condicion = 0; while (s[i] == ' ') i++; while (condicion) i i++; } ;

SENTENCIA BREAK

Sintaxis break; Descripcin Esta sentencia provoca la salida inmediata de las sentencias switch, switch while while, for y do do. Por lo tanto tanto, su uso slo es correcto dentro de un bloque de una estas sentencias. Observacin Una sentencia break obliga a una salida inmediata del ciclo (o switch) ms interior.

SENTENCIA BREAK
Ejemplo

for (i = 0; i < 10; i++) for (j = 0; j < i; j++) if (j == 5) break; ; La ejecucin j de la sentencia break provoca una salida del bucle for de la variable j, pero no tiene ningn efecto sobre el bucle for de la variable i.

SENTENCIA CONTINUE

Sintaxis continue; Descripcin La sentencia continue funciona de una forma algo similar a break. En vez de forzar la terminacin, continue fuerza una nueva iteracin del bucle y salta cualquier cdigo que exista entre medias.

SENTENCIA CONTINUE
Ejemplo j p /* este bucle imprime todos los nmeros no negativos del vector vector_de_numeros */ for (i = 0; i < 100; i++) { numero = vector_de_numeros [ [i]; ]; if (numero < 0) continue; printf i tf ("%d " ", vector_de_numeros t d [i]) [i]); }

SENTENCIA CONTINUE

Observacin En los E l ciclos i l while hil y d do-while, hil una sentencia t i continue da lugar a que el control pase directamente a la evaluacin de la condicin y prosiga el proceso del bucle. En el caso de un for primero se ejecuta la parte incremento del for, bucle, a continuacin se ejecuta la evaluacin de condicin, , y finalmente el bucle prosigue. p g

Conclusiones

Captulos 1-4 1 4 libro Como programar en C/C++. C/C++ Ejercicios resueltos y propuestos de estos captulos. Realizar los ejercicios vistos en clases y comprobar las observaciones hechas a lo largo de la misma.

Potrebbero piacerti anche