Sunteți pe pagina 1din 22

Programación

El lenguaje C
___________________________________________________________________

El lenguaje C es uno de los más rápidos y potentes que hay hoy en dia. Algunos
dicen que está desfasado y que el futuro es Java. No se si tendrá futuro pero está
claro que presente si tiene. No hay más que decir que el sistema operativo Linux
está desarrollado en C en su práctica totalidad. Así que creo que no sólo no
perdemos nada aprendiéndolo sino que ganamos mucho. Para empezar nos servirá
como base para aprender C++ e introducirnos en el mundo de la programación
Windows. Si optamos por Linux existe una biblioteca llamada gtk (o librería, como
prefieras) que permite desarrollar aplicaciones estilo windows con C.

No debemos confundir C con C++, que no son lo mismo. Se podría decir que C++
es una extensión de C. Para empezar en C++ conviene tener una sólida base de C.

Existen otros lenguajes como Visual Basic que son muy sencillos de aprender y de
utilizar. Nos dan casi todo hecho. Pero cuando queremos hacer algo complicado o
que sea rápido debemos recurrir a otros lenguajes (c++, delphi,...).

Una de las cosas importantes de C que debes recordar es que es Case Sensitive
(sensible a las mayúsculas o algo así). Es decir que para C no es lo mismo escribir
Printf que printf.

Conviene indicar también que las instrucciones se separan por ";".

El entorno de Borland C++


__________________________________________________________________________
El entorno de Borland C++ facilita la edición, compilación y el enlazado de los
programas, ya que incluye un editor y herramientas para compilar y enlazar los
programas, para configurar el entorno de Turbo C, primero hay que conocerlo, a
continuación se explican las características más importantes del entorno...

El editor o Entorno de Desarrollo Integrado

Al ejecutar el Borland C++, se encontrará frente a una ventana en blanco en la cual


iniciará el trabajo con un proyecto (la ventana inicial depende de cómo fue
configurado con anterioridad el programa). Para iniciar el proyecto presione en el
menú Project - New –Project... En la ventana que se abre configure lo siguiente:

Prof: Fredy Tunarosa 1


Programación

Figura Nº1. Ventana de creación de proyectos

Esto genera un proyecto llamado “curso.ide”. Los componentes principales del IDE
son un escritorio con una barra de menú sobre la línea superior, iconos de
herramientas (también conocidos como barra rápida) sobre la siguiente línea, y una
línea de estado en la parte inferior del escritorio. El área primaria es el espacio de
trabajo de Borland que sirve como un telón para varias ventanas. Hay varios tipos
diferentes de ventanas. Entre estos tipos de ventanas están las ventanas de edición
para crear el código C, ventanas de inspección para mirar dentro de un objeto, una
ventana de proyecto para manejar múltiples archivos que pertenecen a un proyecto
(parte superior derecha), y una ventana de mensaje para reportar errores (parte
inferior, al compilar).

En la ventana de proyecto aparece la estructura del proyecto a construir,


inicialmente solo contiene un archivo de edición llamado “curso.cpp”, y por ahora es
todo lo que se necesitará, ya que en él se desarrollaran en esencia las aplicaciones
en C.

El escritorio puede contener muchas ventanas abiertas al mismo tiempo. Sin


embargo, sólo una de las ventanas puede ser activa a la vez. La ventana activa es
indicada por el color de su barra de título. Los iconos sobre la barra rápida
dependen del tipo de la ventana activa ya que los diferentes tipos de ventanas
pueden hacer cosas diferentes.

Prof: Fredy Tunarosa 2


Programación

Fases de un programa en Turbo C


Las fases de un programa en Turbo C se pueden resumir en:
· Edición
· Compilación
· Enlazado
· Ejecución

El primer paso en el desarrollo de un programa consiste en utilizar el editor para


crear el archivo con el código fuente (inicialmente los archivos con extensión .cpp).
Como segundo paso, se compila el código fuente para crear un archivo objeto
(proceso en el que se toma el lenguaje de alto nivel y se convierte en códigos
binarios que entiende el procesador). El tercer paso consiste en enlazar
(encadenar) el código compilado para crear un archivo ejecutable (es decir, se
agregan las bibliotecas de las funciones). El cuarto y último paso consiste en
ejecutar el programa, y verificar que realmente hace lo que se desea que haga.

Creación del código fuente

El código fuente es una serie de comandos que le dan instrucciones al computador


para que realice la tarea que se desea. Nosotros utilizaremos las instrucciones
correspondientes al lenguaje C, pero bien puede hacerse en otro lenguaje.

En nuestro caso, el compilador lleva consigo un editor integrado (hoy en día esto es
lo normal con cualquier software que compile algún lenguaje de programación), y
aunque se puede utilizar cualquier editor de texto, es muy conveniente utilizar el
del IDE.
Cuando se guarda un archivo fuente se le debe dar un nombre (recuerden el
archivo fuente de nuestro primer proyecto, “curso.cpp”). Como regla general, el
nombre debe describir lo que hace el programa, aunque se puede agregar una
descripción más detallada como comentarios al interior del archivo. La extensión
por defecto de los programas en C es *.C, en nuestro caso utilizamos *.CPP debido
al IDE que utilizamos, recuerde que esta diseñado para C++.

Compilación

Aunque nuestra labor es llegar a entender el código fuente del C, el computador no


lo entiende. Un procesador digital contiene en su CPU un determinado número de
comandos básicos grabados en una ROM, cada uno identificado por un código
numérico único. Un programa escrito directamente con estos códigos (lo que se
conoce como lenguaje máquina) es ejecutado por el procesador sin ningún
problema, sin embargo, para el ser humano es más difícil aprender éste lenguaje
(lenguaje assembler o ensamblador), además de que las instrucciones son muy
básicas, y una simple función seno sería un verdadero problema al programarla en
ensamblador. Por esto, se utilizan lenguajes de alto nivel como el C, que el ser
humano puede entender fácilmente, y este se compila para producir el lenguaje
máquina que entiende el procesador.
El compilador toma el archivo de código fuente como entrada y produce un archivo
que contiene las instrucciones de lenguaje máquina que corresponden a los
enunciados del código fuente. Las instrucciones del lenguaje de máquina creadas
por el compilador son llamadas código objeto, y el archivo que las contiene, archivo
objeto.

Prof: Fredy Tunarosa 3


Programación

Después de que se compile, se tiene un archivo objeto normalmente con la


extensión *.OBJ. Esta extensión es reconocida por el enlazador.

Enlazado (encadenado, link)

Parte del lenguaje C es una biblioteca de funciones que contiene el código objeto
para funciones predefinidas. Una función predefinida contiene código C que ya ha
sido escrito, y se proporciona en una forma lista para usarse con el paquete del
compilador. Este proceso es llamado enlazado y es ejecutado por el enlazador.

Editor Compilador Enlazador

Programa en C Archivo objeto Ejecutable

Finalización

Una vez compilado y enlazado el programa, se puede ejecutar como cualquier otra
aplicación. Si se reciben resultados diferentes a lo esperado, hay que regresar al
primer paso, identificando el problema y corrigiéndolo. Cuando se hace un cambio
al código fuente, se debe volver a compilar y enlazar el programa.

Muchos compiladores realizan el compilado y el enlazado en un solo paso, en el


caso de Borlan C++, con el comando Compile se crea el archivo objeto, y con Make
project se crea el objeto y el ejecutable. Es muy difícil sentarse y escribir un
programa, y al compilarlo y enlazarlo obtener exactamente lo que se necesitaba de
una. Aún los programadores más expertos cometen errores que deben corregir
como parte del proceso de desarrollo del programa, es decir, que el ciclo antes
mencionado se verificará muchas veces durante el desarrollo de un programa.

El primer programa: Hola Mundo


______________________________________________________________________

En un alarde de originalidad vamos a hacer nuestro primer programa: hola


mundo. Nadie puede llegar muy lejos en el mundo de la programación sin haber
empezado su carrera con este original y funcional programa. Allá va:

#include <stdio.h>

int main() {
printf("Hola mundo\n");
return 0;
}

Nota: Hay mucha gente que programa en Windows que se queja de que cuando
ejecuta el programa no puede ver el resultado. Para evitarlo se puede añadir
antes de return 0; la siguiente línea:

system("PAUSE");

Prof: Fredy Tunarosa 4


Programación

Si esto no funciona prueba a añadir getch();

¿Qué fácil eh? Este programa lo único que hace es sacar por pantalla el mensaje:

Hola mundo

Vamos ahora a comentar el programa línea por línea (Esto no va a ser más que
una primera aproximación).

#include <stdio.h>

#include es lo que se llama una directiva. Sirve para indicar al compilador que
incluya otro archivo. Cuando en compilador se encuentra con esta directiva la
sustituye por el archivo indicado. En este caso es el archivo stdio.h que es donde
está definida la función printf, que veremos luego.

int main()

Es la función principal del programa. Todos los programas de C deben tener una
función llamada main. Es la que primero se ejecuta. El int (viene de
Integer=Entero) que tiene al principio significa que cuando la función main acabe
devolverá un número entero. Este valor se suele usar para saber cómo ha
terminado el prorama. Normalmente este valor será 0 si todo ha ido bien, o un
valor distinto si se ha producido algún error (pero esto lo decidimos nosotros, ya
lo veremos). De esta forma si nuestro programa se ejecuta desde otro el
programa 'padre' sabe como ha finalizado, si ha habido errores o no.

Se puede usar la definición 'void main()', que no necesita devolver ningún valor,
pero se recomienda la forma con 'int' que es más correcta. A lo largo de este
curso verás muchos ejemplos que uso 'void main' y falta el return 0; del final, el
código funciona correctamente pero puede dar un 'warning' al compilar. En estos
momentos estoy intentando corregir esto, pido perdón por las molestias.

Son las llaves que indican el comienzo de una función, en este caso la función
main.

/* Aquí va el cuerpo del programa */

Esto es un comentario, no se ejecuta. Sirve para describir el programa. Conviene


acostumbrarse a comentar los programas. Un comentario puede ocupar más de
una línea. Por ejemplo el comentario:

/* Este es un comentario
que ocupa dos filas */

es perfectamente válido.

printf( "Hola mundo\n" );

Aquí es donde por fin el programa hace algo que podemos ver al ejecutarlo. La
función printf muestra un mensaje por la pantalla. Al final del mensaje "Hola
mundo" aparece el símbolo '\n'; este hace que después de imprimir el mensaje se
pase a la línea siguiente.

Prof: Fredy Tunarosa 5


Programación

Fíjate en el ";" del final. Es la forma que se usa en C para separar una instrucción
de otra. Se pueden poner varias en la misma línea siempre que se separen por el
punto y coma.

return 0;

Como he indicado antes el programa al finalizar develve un valor entero. Como en


este programa no se pueden producir errores (nunca digas nunca jamás) la salida
siempre será 0. La forma de hacer que el programa devuelva un 0 es usando
return. Esta línea significa 'finaliza la función main haz que devuelva un 0.

...y cerramos llaves con lo que termina el programa. Todos los programas
finalizan cuando se llega al final de la función main.

Guarde el programa, y presione el tercer botón de la barra de herramientas


(Compile). Si todo funciona bien debe recibir la siguiente ventana:

Figura Nº2. Compilado exitoso

Para generar el ejecutable presione el cuarto botón de la barra de herramientas,


Make project. Y listo, solo falta ejecutar el programa para verificar que hace lo
que deseamos, es decir, mostrar en pantalla el mensaje “Hola mundo”

Prof: Fredy Tunarosa 6


Programación

Ejercicios

Ejercicio 1.

Busca los errores en este programa:

int main()
{
/* Aquí va el cuerpo del programa */
Printf( "Hola mundo\n" );
return 0;
}

a. Mencione cuales son y como los solucionaría.


b. ¿Qué archivos debo copiar en otro computador para ejecutar el
programa?
c. ¿Qué hace el compilador?

Realice los siguientes ejercicios en forma de pseudocodigo

Ejercicio 2. Diseñar un conjunto de instrucciones para calcular la longitud y el área de


una circunferencia.

Ejercicio 3. Diseñar un conjunto de instrucciones para calcular el área y el perímetro de


un terreno rectangular (ancho B largo A)

Ejercicio 4. Diseñar un conjunto de instrucciones para calcular el área de un trapecio.

Ejercicio 5. Diseñar un conjunto de instrucciones para calcular el área y el volumen de


na esfera de radio R

Prof: Fredy Tunarosa 7


Programación

Tipos de Datos

El tipo Int

En una variable de este tipo se almacenan números enteros (sin decimales). El


rango de valores que admite es -32767 a 32767. Cuando definimos una variable
lo que estamos haciendo es decirle al compilador que nos reserve una zona de la
memoria para almacenar datos de tipo int. Para guardarla necesitaremos 16 bits
de la memoria del ordenador (216=32767). Para poder usar una variable primero
hay que declararla (definirla). Hay que decirle al compilador que queremos crear
una variable y hay que indicarle de qué tipo. Por ejemplo:

int numero;

Esto hace que declaremos una variable llamada numero que va a contener un
número entero.

¿Pero dónde se declaran las variables?

Tenemos dos posibilidades, una es declararla como global y otra como local. Por
ahora vamos a decir que global es aquella variable que se declara fuera de la
funcón main y local la que se declara dentro:

Variable Global Variable Local


#include <stdio.h>
#include <stdio.h>
int x;
int main()
int main() {
{ int x;
} }

La diferencia práctica es que las variables globales se pueden usar en cualquier


procedimiento. Las variables locales sólo pueden usarse en el procedimiento en el
que se declaran. Como por ahora sólo tenemos el procedimiento (o función, o
rutina, o subrutina, como prefieras) main esto no debe preocuparnos mucho por
ahora. Cuando estudiemos cómo hacer un programa con más funciones aparte de
main volveremos sobre el tema. Sin embargo debes saber que es buena
costumbre usar variables locales que globales. Ya veremos por qué.

Podemos declarar más de una variable en una sola línea:

int x, y;

Prof: Fredy Tunarosa 8


Programación

Mostrar variables por pantalla

Vamos a ir u poco más allá con la función printf. Supongamos que queremos
mostrar el contenido de la variable x por pantalla:

printf( "%i", x );

Asignar valores a variables de tipo int

int x = 15;

También se pueden inicializar varias variables en una sola línea:

int x = 15, y = 20;

Hay que tener cuidado con lo siguiente:

int x, y = 20;

Podríamos pensar que x e y son igual a 20, pero no es así. La variable x está sin
valor inicial y la variable 'y' tiene el valor 20.

Veamos un ejemplo para resumir todo:

#include <stdio.h>

int main()
{
int x = 10;

prinft( "El valor inicial de x es %i\n", x );


x = 50;
printf( "Ahora el valor es %i\n", x );
}

Cuya salida será:

El valor inicial de x es 10
Ahora el valor es 50

El tipo Char

Las variables de tipo char sirven para almacenar caracteres. Los caracteres se
almacenan en realidad como números del 0 al 255. Los 128 primeros (0 a 127)
son el ASCII estándar. El resto es el ASCII extendido y depende del idioma y del
ordenador.

Para declarar una variable de tipo char hacemos:

Prof: Fredy Tunarosa 9


Programación

char letra;

En una variable char sólo podemos almacenar solo una letra, no podemos
almacenar ni frases ni palabras. Eso lo veremos más adelante (strings, cadenas).
Para almacenar un dato en una variable char tenemos dos posibilidades:

letra = 'A';
o
letra = 65;

En ambos casos se almacena la letra 'A' en la variable. Esto es así porque el


código ASCII de la letra 'A' es el 65.

Para imprimir un char usamos el símbolo %c (c de character=caracter en inglés):

letra = 'A';
printf( "La letra es: %c.", letra );

resultado:

La letra es A.

También podemos imprimir el valor ASCII de la variable usando %i en vez de %c:

letra = 'A';
printf( "El número ASCII de la letra %c es: %i.", letra,
letra );

resultado:

El código ASCII de la letra A es 65.

Como vemos la única diferencia para obtener uno u otro es el modificador (%c ó
%i) que usemos.

El modificador Unsigned

Este modificador (que significa sin signo) modifica el rango de valores que puede
contener una variable. Sólo admite valores positivos. Si hacemos:

unsigned char variable;

Esta variable en vez de tener un rango de -128 a 128 pasa a tener un rango de 0
a 255.

Prof: Fredy Tunarosa 10


Programación

El tipo Float

En este tipo de variable podemos almacenar números decimales, no sólo enteros


como en los anteriores. El rango de posibles valores es del 3,4E-38 al 3,4E38.

Declaración de una variable de tipo float:

float numero;

Para imprimir valores tipo float Usamos %f.

float num=4060.80;
printf( "El valor de num es : %f", num );

Resultado:

El valor de num es: 4060.80

Si queremos escribirlo en notación exponencial usamos %e:

float num = 4060.80;


printf( "El valor de num es: %e", num );

Que da como resultado:

El valor de num es: 4.06080e003

El tipo Double

En las variables tipo double se almacenan números reales del 1,7E-307 al


1,7E308. Se declaran como double:

double numero;

Para imprimir se usan los mismos modificadores que en float.

Prof: Fredy Tunarosa 11


Programación

Resumen de los tipos de datos en C

TIPOS DE DATOS ENTEROS


Tipo de Dato Bytes Valor Mínimo Valor Máximo
Int 2 -32768 32767
Short 2 32768 32767
unsigned int 2 0 65535
unsigned short 2 0 65535
long int 4 -2.147’483.648 2.147’483.647
unsigned long int 4 0 4.294’967.295

TIPOS DE DATOS DE PUNTO FLOTANTE


Tipo de dato Bytes Valor Mínimo Valor Máximo
float 4 1.17549435e-38 3.40282347e+38
double 8 2.2250738585072014e- 1.7976931348623157e+308
308
long 12 3.362103e-4932 1.189731e+4932
double

TIPOS DE DATOS PARA CADENAS DE CARACTERES


Tipo de Dato Bytes Valor Mínimo Valor Máximo
char 1 -128 127
unsigned char 1 0 255

Prof: Fredy Tunarosa 12


Programación

Ejercicios

Ejercicio 1. Busque los errores:

#include <stdio.h>

int main()
{
int número;

número = 2;

return 0;
}

#include <stdio.h>

int main()
{
int numero;

numero = 2;

printf( "El valor es %i" Numero );

return 0;
}

Ejercicio 2. Cómo calcular el máximo valor que admite un tipo de datos?

Lo primero que tenemos que conocer es el tamaño en bytes de ese tipo de dato.
Vamos a ver un ejemplo con el tipo INT. Hagamos el siguiente programa:

#include <stdio.h>

int main()
{
int num1;

printf( "El tipo int ocupa %i bytes\n", sizeof(int) );


}

el resultado es:

El tipo int ocupa 4 bytes.

Prof: Fredy Tunarosa 13


Programación

Como sabemos 1byte = 8bits. Por lo tanto el tipo int ocupa 4*8=32 bits.

Ahora para calcular el máximo número debemos elevar 2 al número de bits


obtenido. En nuestro ejemplo: 2^32=4.294.967.296. Es decir en un int se podría
almacenar un número entre 0 y 4.294.967.296.

Sin embargo esto sólo es cierto si usamos un tipo unsigned (sin signo, se hace
añadiendo la palabra unsigned antes de int). Para los tipos normales tenemos que
almacenar números positivos y negativos. Así que de los 4.294.967.296 posibles
números la mitad serán positivos y la mitad negativos. Por lo tanto tenemos que
dividir el número anterior entre 2 = 2.147.483.648. Como el 0 se considera
positivo el rango de números posibles que se pueden almacenar en un int sería:
-2.147.483.648 a 2.147.483.647.

Resumen:

1. Obtenemos el número de bytes.


2. Multiplicamos por ocho (ya lo tenemos en bits).
3. Elevamos 2 al número de bits.
4. Dividimos entre 2.

Ejercicio 3. Pase los ejercicios de pseudocodigo que realizamos en clase, al editor de


Borland c ++

Ejercicio 4. Que significa el termino Overflow ? y como influye en su programa?

Prof: Fredy Tunarosa 14


Programación

OPERADORES
___________________________________________________________________

1. INTRODUCCION

Si analizamos la sentencia siguiente:

var1 = var2 + var3;

estamos diciéndole al programa, por medio del operador +, que compute la suma
del valor de dos variables , y una vez realizado ésto asigne el resultado a otra
variable var1. Esta última operación (asignación) se indica mediante otro
operador, el signo =.
El lenguaje C tiene una amplia variedad de operadores, y todos ellos caen dentro
de 6 categorias , a saber : aritméticos , relacionales, lógicos, incremento y
decremento, manejo de bits y asignacion. Todos ellos se irán describiendo en los
párrafos subsiguientes.

2. OPERADORES ARITMETICOS

Tal como era de esperarse los operadores aritméticos ,mostrados en la TABLA 4 ,


comprenden las cuatro operaciones basicas , suma , resta , multiplicación y
división , con un agregado , el operador módulo .

TABLA 4 OPERADORES ARITMETICOS

SIMBOLO DESCRIPCION EJEMPLO ORDEN DE EVALUACION


+ SUMA a+b 3
- RESTA a-b 3
* MULTIPLICACION a * b 2
/ DIVISION a/b 2
% MODULO a%b 2
- SIGNO -a 2

El operador módulo ( % ) se utiliza para calcular el resto del cociente entre dos
ENTEROS , y NO puede ser aplicado a variables del tipo float ó double .
Si bien la precedencia (orden en el que son ejecutados los operadores) se
analizará más adelante, en este capítulo, podemos adelantar algo sobre el orden
que se realizan las operaciones aritméticas.
En la TABLA 4, última columna, se da el orden de evaluación de un operador
dado. Cuanto más bajo sea dicho número mayor será su prioridad de ejecución. Si
en una operación existen varios operadores, primero se evaluarán los de
multiplicación , división y módulo y luego los de suma y resta . La precedencia de
los tres primeros es la misma , por lo que si hay varios de ellos, se comenzará a
evaluar a aquel que quede más a la izquierda . Lo mismo ocurre con la suma y la
resta .

Prof: Fredy Tunarosa 15


Programación

Para evitar errores en los cálculos se pueden usar paréntesis , sin limitación de
anidamiento, los que fuerzan a realizar primero las operaciones incluidas en ellos .
Los paréntesis no disminuyen la velocidad a la que se ejecuta el programa sino
que tan sólo obligan al compilador a realizar las operaciones en un orden dado
dado, por lo que es una buena costumbre utilizarlos ampliamente .
Los paréntesis tienen un orden de precedencia 0, es decir que antes que nada se
evalúa lo que ellos encierran .
Se puede observar que no existen operadores de potenciación, radicación,
logaritmación, etc, ya que en el lenguaje C todas estas operaciones ( y muchas
otras ) se realizan por medio de llamadas a Funciones.
El último de los operadores aritméticos es el de SIGNO . No debe confundirselo
con el de resta, ya que este es un operador unitario que opera sobre una única
variable cambiando el signo de su contenido númerico. Obviamente no existe el
operador + unitario, ya que su operación sería DEJAR el signo de la variable, lo
que se consigue simplemente por omisión del signo.

3. OPERADORES RELACIONALES

Todas las operaciones relacionales dan sólo dos posibles resultados : VERDADERO
ó FALSO . En el lenguaje C, Falso queda representado por un valor entero nulo
(cero) y Verdadero por cualquier número distinto de cero En la TABLA 5 se
encuentra la descripción de los mismos .

TABLA 5 OPERADORES RELACIONALES

SIMBOLO DESCRIPCION EJEMPLO ORDEN DE EVALUACION


< menor que (a < b) 5
> mayor que (a >b) 5
<= menor o igual que (a < = b) 5
>= mayor o igual que ( a >>= b ) 5
== igual que ( a = = b) 6
!= distinto que ( a != b) 6

Uno de los errores más comunes es confundir el operador relacional IGUAL QUE
(= =) con el de asignacion IGUAL A (=). La expresión a=b copia el valor de b en
a, mientras que a = = b retorna un cero , si a es distinto de b ó un número
distinto de cero si son iguales.
Los operadores relacionales tiene menor precedencia que los aritméticos , de
forma que a < b + c se interpreta como a < ( b + c ), pero aunque sea superfluo
recomendamos el uso de paréntesis a fin de aumentar la legilibilidad del texto.
Cuando se comparan dos variables tipo char el resultado de la operación
dependerá de la comparación de los valores ASCII de los caracteres contenidos en
ellas. Asi el caracter a ( ASCII 97 ) será mayor que el A (ASCII 65 ) ó que el 9
(ASCII 57).

4. OPERADORES LOGICOS

Hay tres operadores que realizan las conectividades lógicas Y (AND) , O (OR) y
NEGACION (NOT) y están descriptos en la TABLA 6 .

Prof: Fredy Tunarosa 16


Programación

TABLA 6 OPERADORES LOGICOS

SIMBOLO DESCRIPCION EJEMPLO ORDEN DE EVALUACION


&& Y (AND) (a>b) && (c < d) 10
|| O (OR) (a>b) || (c < d) 11
! NEGACION (NOT) !(a>b) 1

Los resultados de la operaciones lógicas siempre adoptan los valores CIERTO ó


FALSO. La evaluación de las operaciones lógicas se realiza de izquierda a derecha
y se interrumpe cuando se ha asegurado el resultado .
El operador NEGACION invierte el sentido lógico de las operaciones , así será

!( a >> b ) equivale a ( a < b )


!( a == b ) " " ( a != b )
etc.

En algunas operaciones suele usárselo de una manera que se presta a confusión ,


por ejemplo : ( !i ) donde i es un entero. Esto dará un resultado CIERTO si i tiene
un valor 0 y un resultado FALSO si i es distinto de cero .

5. OPERADORES DE INCREMENTO Y DECREMENTO

Los operadores de incremento y decremento son sólo dos y están descriptos en la


TABLA 7

TABLA 7 OPERADORES DE INCREMENTO Y DECREMENTO

SIMBOLO DESCRIPCION EJEMPLO ORDEN DE EVALUACION


++ incremento ++i ó i++ 1
-- decremento --i ó i-- 1

Para visualizar rapidamente la función de los operadores antedichos , digamos


que las sentencias :

a = a + 1 ;
a++ ;

tienen una acción idéntica , de la misma forma que

a = a - 1 ;
a-- ;

es decir incrementa y decrementa a la variable en una unidad


Si bien estos operadores se suelen emplear con variables int , pueden ser usados
sin problemas con cualquier otro tipo de variable . Así si a es un float de valor
1.05 , luego de hacer a++ adoptará el valor de 2.05 y de la misma manera si b es
una variable del tipo char que contiene el caracter 'C' , luego de hacer b-- su valor

Prof: Fredy Tunarosa 17


Programación

será 'B' .
Si bien las sentencias

i++ ;
++i ;

son absolutamente equivalentes, en la mayoria de los casos la ubicación de los


operadores incremento ó decremento indica CUANDO se realiza éste .
Veamos el siguiente ejemplo :

int i = 1 , j , k ;
j = i++ ;
k = ++i ;

acá j es igualado al valor de i y POSTERIORMENTE a la asignación i es


incrementado por lo que j será igual a 1 e i igual a 2 , luego de ejecutada la
sentencia . En la siguiente instrucción i se incrementa ANTES de efectuarse la
asignacion tomando el valor de 3 , él que luego es copiado en k .

6. OPERADORES DE ASIGNACION

En principio puede resultar algo futil gastar papel en describir al operador IGUAL A
( = ) , sin embargo es necesario remarcar ciertas características del mismo .
Anteriormente definimos a una asignación como la copia del resultado de una
expresión ( rvalue ) sobre otra ( lvalue ) , esto implica que dicho lvalue debe
tener LUGAR (es decir poseer una posición de memoria ) para alojar dicho valor .
Es por lo tanto válido escribir

a = 17 ;

pero no es aceptado , en cambio

17 = a ; /* incorrecto */

ya que la constante numérica 17 no posee una ubicación de memoria donde alojar


al valor de a .
Aunque parezca un poco extraño al principio las asignaciones , al igual que las
otras operaciones , dan un resultado que puede asignarse a su vez a otra
expresión .
De la misma forma que (a + b) es evaluada y su resultado puedo copiarlo en otra
variable : c = (a + b) ; una asignación (a = b) da como resultado el valor de b ,
por lo que es lícito escribir

c = ( a = b ) ;

Debido a que las asignaciones se evalúan de derecha a izquierda , los paréntesis


son superfluos , y podrá escribirse entonces :

c = a = b = 17 ;

con lo que las tres variables resultarán iguales al valor de la contante .


El hecho de que estas operaciones se realicen de derecha a izquierda también
permite realizar instrucciones del tipo :

Prof: Fredy Tunarosa 18


Programación

a = a + 17 ;

significando esto que al valor que TENIA anteriormente a , se le suma la constante


y LUEGO se copia el resultado en la variable .
Como este último tipo de operaciones es por demás común , existe en C un
pseudocódigo , con el fín de abreviarlas .
Asi una operación arítmetica o de bit cualquiera (simbolizada por OP )

a = (a) OP (b) ;

puede escribirse en forma abreviada como :

a OP= b ;

Por ejemplo

a += b ; /* equivale : a = a + b */
a -= b ; /* equivale : a = a - b */
a *= b ; /* equivale : a = a * b */
a /= b ; /* equivale : a = a / b */
a %= b ; /* equivale : a = a % b */

Nótese que el pseudooperador debe escribirse con los dos símbolos seguidos , por
ejemplo += , y no será aceptado +(espacio) = .
Los operadores de asignación estan resumidos en la TABLA 8 .

TABLA 8 OPERADORES DE ASIGNACION

SIMBOLO DESCRIPCION EJEMPLO ORDEN DE EVALUACION


= igual a a=b 13
op= pseudocodigo a += b 13
=?: asig.condicional a = (c>b)?d:e 12

Vemos de la tabla anterior que aparece otro operador denominado ASIGNACION


CONDICIONAL . El significado del mismo es el siguiente :

lvalue = ( operación relacional ó logica ) ? (rvalue 1) : (rvalue 2) ;

de acuerdo al resultado de la operación condicional se asignará a lvalue el valor


de rvalue 1 ó 2 . Si aquella es CIERTA será lvalue = rvalue 1 y si diera FALSO ,
lvalue = rvalue 2 .
Por ejemplo, si quisiéramos asignar a c el menor de los valores a ó b , bastará con
escribir :

c = ( a < b ) ? a : b ;

7. ORDEN DE EVALUACIÓN DE OPERADORES

Prof: Fredy Tunarosa 19


Programación

Debemos tener cuidado al usar operadores pues a veces podemos tener


resultados no esperados si no tenemos en cuenta su orden de evaluación. Vamos
a ver la lista de precedencias, cuanto más arriba se evalúa antes:

Precedencia
( ) [ ] -> .
! ~ ++ -- (molde) * & sizeof (El * es el de puntero)
* / % (El * de aquí es el de multiplicación)
+-
<< >>
< <= > >=
== !=
&
^
|
&&
||
?:
= += -= *= /=
,

Por ejemplo imaginemos que tenemos la siguiente operación:

10 * 2 + 5

Si vamos a la tabla de precedencias vemos que el * tiene un orden superior al +,


por lo tanto primero se hace el producto 10*2=20 y luego la suma 20+5=25.
Veamos otra:

10 * ( 2 + 5 )

Ahora con el paréntesis cambia el orden de evaluación. El que tiene mayor


precedencia ahora es el paréntesis, se ejecuta primero. Como dentro del
paréntesis sólo hay una suma se evalúa sin más, 2+5=7. Ya solo queda la
multiplicación 10*7=70. Otro caso:

10 * ( 5 * 2 +3 )

Como antes, el que mayor precedencia tiene es el paréntesis, se evalúa primero.


Dentro del paréntesis tenemos producto y suma. Como sabemos ya se evalúa
primero el producto, 5*2=10. Seguimos en el paréntesis, nos queda la suma

Prof: Fredy Tunarosa 20


Programación

10+3=13. Hemos acabado con el paréntesis, ahora al resto de la expresión.


Cogemos la multiplicación que queda: 10*13=130.

Otro detalle que debemos cuidar son los operadores ++ y --. Estos tienen mayor
precedencia que las demás operaciones aritméticas (+, -, *, /, %). Por ejemplo:

10 * 5 ++

Puede parecer que primero se ejecutará la multiplicación y luego el ++. Pero si


vamos a la tabla de precedencias vemos que el ++ está por encima de * (de
multiplicación), por lo tanto se evaluará primero 5++=6. 10*6=60.

Es mejor no usar los operadores ++ y -- mezclados con otros, pues a veces


obtenemos resultados inesperados. Por ejemplo:

#include <stdio.h>

int main()
{
int a, b;

a = 5;
b = a++;
printf( "a = %i, b = %i\n", a, b );
}

Este ejemplo en unos compiladores dará a = 6, b = 5 y en otros a = 6 y b = 6.


Por favor si podeis, escribidme diciendo qué valores os salen a vosotros y qué
compilador usais.

Para asegurarse lo mejor sería separar la línea donde se usa el ++ y el =:

#include <stdio.h>

int main()
{
int a, b;

a = 5;
a++;
b = a;
printf( "a = %i, b = %i\n", a, b );
}

Prof: Fredy Tunarosa 21


Programación

Ejercicios

Ejercicio 1: En este programa hay un fallo muy gordo y muy habitual en


programación. A ver si lo encuentras:

#include <stdio.h>

int main()
{
int a, c;

a = 5;
c += a +5;
}

Ejercicio 2: ¿Cual será el resultado del siguiente programa?

#include <conio.h>
#include <stdio.h>

int main()
{
int a, b, c;

a = 5;
b = ++a;
c = ( a + 5 * 2 ) * ( b + 6 / 2 ) + ( a * 2 );
printf( "%i, %i, %i", a, b, c );
}

Ejercicio 3: Escribir un programa que compruebe si un número es par o impar.

Para comprobar si un número es par o impar podemos usar el operador '%'. Si al


calcular el resto de dividir un número por 2 el resultado es cero eso indica que el
número es par. Si el resto es distinto de cero el número es impar.

Ejercicio 4:

a. ¿Qué efecto tienen los espacios y las líneas en blanco sobre la ejecución de un
programa?
b. ¿Los números negativos son considerados verdaderos o falsos?
c. ¿Qué es una expresión?
d. ¿Cuál es el resultado de la expresión 10 % 3?
e. ¿Cuál es el resultado de la expresión 5 + 3 * 8 / 2?
f. ¿Cuál es el resultado de las siguientes expresiones?
(1 + 2 * 3)
10 % 3 * 3 – (1 + 2)
((1 + 2) * 3)
(5 == 5)
(x = 5)

Prof: Fredy Tunarosa 22