Documente Academic
Documente Profesional
Documente Cultură
Lenguaje de programación
Unidad 1
Introducción al Lenguaje C
Unidad 2
Tipos de Datos y
Operadores en C
El lenguaje de programación C fue desarrollado en 1972 por Dennis Ritchie en los Labora-
torios Bell, de la AT&T. Fue creado para diseñar el sistema operativo UNIX, pero debido a
su potencia, pronto se extendió su uso por programadores de todo el mundo, para escribir
programas de propósito general, educativo, comercial y científico.
El lenguaje C proporciona una gran flexibilidad de programación y una muy baja compro-
bación de incorrecciones, de forma que el lenguaje deja bajo la responsabilidad y riesgo
2
del programador la detección de errores. Por ejemplo, C no comprueba que el índice de
referencia de un vector (array) no sobrepase el tamaño del mismo, que no se escriba en
zonas de memoria que no pertenecen al área de datos del programa, etc.
Cada programa en C consiste en uno o más módulos llamados funciones. Una de las fun-
ciones es la principal y siempre debe ser llamada main. El programa siempre comenzará
ejecutando la función principal main.
3
Así, cada una de estas palabras nos permite dar órdenes o instrucciones a la computa-
dora para que ésta realice actividades específicas. Sin embargo, la computadora no es
un ser humano, por lo que realmente no entiende lo que estas palabras significan hasta
que un programa especial, llamado “compilador”, traduce esta serie de instrucciones de
“lenguaje de alto nivel” a “lenguaje de máquina”, que ya es un lenguaje en código binario
(ceros y unos) que la computadora sí entiende y es capaz de ejecutar.
Es por eso que todo programa escrito en lenguaje C debe ser “compilado”, es decir, tradu-
cido a lenguaje de máquina, para que éste pueda ser ejecutado. Existen varios programas
compiladores para el lenguaje C. El que utilizaremos a lo largo de este curso será uno
llamado Dev-C++, debido a que es de código libre, es decir, de libre uso.
Para todos los ejercicios que se realizarán en esta materia deberás seguir el procedimiento
descrito en la figura 1:
4
#include
Incluye el archivo (librería), cuyo nombre se indica, para su compilación con el resto del
código. Si el nombre del archivo va entre <...>, se busca en el directorio include del siste-
ma (/usr/include). Por ejemplo, #include <stdio.h> hace que el archivo /usr/include/stdio.h
se incluya en ese punto para ser compilado con nuestro archivo fuente.
Si el nombre se puede poner entre comillas ("), el sistema lo busca en el directorio actual
(es decir, en donde se encuentra nuestro archivo fuente).
Los archivos suelen tener la extensión .h y contienen declaraciones de tipos, variables y
prototipos de funciones.
#define
Define un símbolo o una constante; cada vez que aparece ese símbolo en el código fuente,
éste es reemplazado por su definición. Por ejemplo, #define MAX 1024 hace que todas las
veces que aparezca la cadena MAX dentro del código esta palabra sea sustituida por 1024.
Ahora estamos listos para escribir y ejecutar nuestro primer programa en lenguaje C, para
esto utilizaremos el procedimiento de la figura 1:
5
2. Del menú “Archivo”, seleccionamos la opción ”Nuevo” y después la opción “Pro-
yecto”, y aparecerá la siguiente ventana de la figura 3, en la cual seleccionaremos la
opción “Console Application”; enseguida, la opción “En C”, y escribimos el nombre
que queramos, en nuestro ejemplo le pusimos “ProyectoHolaMundo”.
3. Nos aparece la figura 4, en donde deberemos seleccionar una carpeta para alojar
nuestro proyecto. En la figura aparece el nombre que elegimos (ProyectoHolaMundo)
con la extensión “.dev”.
6
4. Finalmente, aparece la ventana principal de DevC++ con el código fuente del nues-
tro proyecto. Todos los programas de C de tipo consola empiezan con las siguientes
dos directivas del precompilador:
#include <stdio.h>
#include <stdlib.h>
Estas directivas indican que se incluirán los archivos (librerías), llamadas stdio.h y
stdlib.h, las cuales contienen algunos tipos y funciones básicos del lenguaje C.
#include <stdio.h>
#include <stdlib.h>
7
int main(int argc, char *argv[ ])
{
printf (“Hola mundo”);
return 0;
}
Los programas utilizan diferentes tipos de datos para almacenar valores y hacer opera-
ciones; para almacenar estos valores y poder operar con ellos, C ofrece dos posibilida-
des: variables y constantes. Una variable es un objeto donde se guarda un valor, el cual
puede ser consultado y modificado durante la ejecución del programa; por el contrario,
una constante tiene un valor fijo que no puede ser modificado y generalmente se utiliza
para guardar valores conocidos y fijos como Pi, el diámetro de la tierra o valores que no
cambiarán durante la ejecución del programa.
8
2.1. Declaración de variables y constantes
Una variable es un objeto donde se guarda un valor, el cual puede ser consultado y
modificado durante la ejecución del programa. Para usar una variable, primero se debe
declarar en el programa. La declaración de una variable indica al compilador que debe
reservar cierto espacio en la memoria de la computadora para almacenar un dato de
tipo elemental o estructurado. Por ejemplo, la declaración siguiente indica al compilador
que debe reservar espacio en la memoria para tres variables de tipo entero, las cuales
se llaman x, y, z:
int x,y,z;
Como podemos observar, declaramos tres variables al mismo tiempo pero pudimos de-
clarar cada una de ellas de forma independiente, como en el siguiente ejemplo:
int x;
int y;
int z;
Un aspecto importante a notar es que cada una de las declaraciones termina con un pun-
to y coma “;”, dado que la sintaxis del lenguaje C así lo requiere. De ahora en adelante
no debemos olvidar que toda sentencia, instrucción o declaración completa la debemos
terminar con un punto y coma “;”.
La sintaxis para declarar dos o más variables en una sola sentencia es la siguiente:
Tipo_de_dato Nombre_de_Variable1, …,
Nombre_de_VariableN;
Finalmente, es muy útil asignar un valor a una variable desde el momento mismo de de-
clararla, a esto le llamamos “inicializar” la variable, para esto la sintaxis es:
A los nombres de las variables se les conoce como identificadores. Estos nombres pueden
9
ser casi cualquier texto pero respetando algunas reglas básicas, por ejemplo, el nombre
de una variable no puede ser igual a una de las palabras reservadas del lenguaje C (ins-
trucciones). El lenguaje C (ANSI-C) tiene las palabras reservadas mostradas en la tabla 1:
Un identificador es cualquier palabra no reservada que comience por una letra o por
un subrayado, pudiendo contener en su interior letras, números y subrayados. La lon-
gitud máxima de un identificador depende del compilador que se esté usando, pero
generalmente suelen ser de 32 caracteres, ignorándose todos aquellos caracteres que
compongan el identificador y sobrepasen la longitud máxima. El lenguaje C es sensible a
mayúsculas y minúsculas, es decir, si dos identificador difieren sólo porque una letra, es
mayúscula en uno y minúscula en otro, son dos identificadores diferentes.
Constantes
Las constantes almacenan valores que no cambiarán durante toda la ejecución del progra-
ma; para apreciar las ventajas de usar una constante, consideremos el siguiente ejemplo:
perimetro = 2 * PI * radio;
area = PI * radio * radio;
Si quisiéramos usar un valor de PI mucho más preciso como 3.14159. En el primer caso
deberíamos sustituir uno a uno cada uno de los valores de 3.14 por el nuevo valor (3.14159)
en todo el código programa. En el segundo caso, basta cambiar la definición de la cons-
tante PI con el nuevo valor.
10
Para esto, las constantes se definen con la directiva #define:
#define PI 3.14159
Así, con sólo cambiar el valor de PI en la directiva, el programa lo usa cada vez que apa-
rezca el identificador PI.
Para usar una variable en lenguaje C, la debemos declarar poniéndole un nombre (iden-
tificador) y especificando el tipo de dato que va a almacenar. En C existen cinco tipos de
datos básicos:
Ejemplos:
int x,y;
int a = 10;
float z = 2.5;
char caracter;
char caracter_2 = ‘a’;
11
Nótese que todas las declaraciones terminan con punto y coma.
Además de los tipos de datos, C cuenta con cuatro modificadores de tipo, los cuales se
aplican sobre los tipos de datos básicos. Los modificadores de tipo permiten cambiar el
tamaño, entre otras cosas, de los tipos de datos anteriormente especificados. Estos mo-
dificadores, que sintácticamente anteceden a la declaración del tipo de dato, son:
unsigned char x;
long double a;
short int z;
Así, por ejemplo, una variable entera “int” tiene una longitud de 32 bits, o sea que pue-
de almacenar valores en el rango [-32768 a 32767], pero una variable tipo entero largo
“long int” tiene una longitud de 64 bits, o sea que puede almacenar valores en el rango
[-2147483647 a 2147483648].
Es muy importante comprender cómo enviar a la pantalla el valor de una variable. Como
vimos en la sección 1.4. Programa Hola Mundo, existe una instrucción para mandar men-
sajes a la pantalla. La instrucción tiene la siguiente sintaxis:
printf (“MENSAJE”);
Sin embargo, si lo que queremos es escribir en pantalla el valor de una variable entera,
por ejemplo, la sintaxis sería la siguiente:
12
printf (“%d”,NOMBRE_DE_VARIABLE);
#include <stdio.h>
#include <stdlib.h>
Si lo que queremos es imprimir en pantalla el valor de una variable de tipo float en vez
de entera, se debe de cambiar el símbolo %d por un %f, como en el siguiente ejemplo:
#include <stdio.h>
#include <stdlib.h>
Una expresión es una fórmula matemática que se forma con constantes, variables y ope-
radores. La forma más básica de una expresión es una asignación, en donde se le asigna
un valor a una variable, por ejemplo:
a = 1;
13
Sin embargo, a veces las expresiones son mucho más complejas y se usan para calcular
un valor, al mismo tiempo que se le asigna el resultado a una variable, por ejemplo:
a = b +2;
El caso anterior se trata de una expresión en donde se suma el valor de b más dos y el
resultado se le asigna a la variable a;.
Los operadores aritméticos son aquellos que se usan para realizar las operaciones arit-
méticas de suma, resta, multiplicación y división; en el lenguaje C, los operadores son:
• Operador de Suma: +
• Operador de Resta: -
• Operador de multiplicación: *
• Operador de División: /
• Operador de Módulo: %
Una expresión de tipo lógica o booleana sólo pueden tomar los valores de falso (false) o
verdadero (true). Este tipo de expresiones se utiliza para tomar decisiones en los programas.
14
Antes de presentar un ejemplo de evaluación de expresiones lógicas, recordemos las
tablas de verdad de la conjunción y la disyunción:
15
2.5. Conversiones de tipo
Conversión automática de tipos de datos
En la vida cotidiana, los seres humanos no consideramos los números con punto decimal
como algo diferente a los números enteros, pero en el momento de realizar operaciones
matemáticas les damos un tratamiento un poco diferente a la parte decimal para no perder
precisión en nuestros resultados.
1. Todos los tipo carácter (char) y entero corto (short int) se convierten a entero (int).
16
Todos los tipo flotante de simple precisión (float) se convierten a flotante de alta
precisión (doublé).
2. Para todo par de operandos se aplica secuencialmente (con este orden de pre-
cedencia) la siguiente regla:
char car;
int ent;
float fl;
double db;
En cada operación entre paréntesis hay dos tipos diferentes, por lo que se convierte cada
operando al tipo más grande de la siguiente forma:
Al ser los dos operandos de igual tipo, realizamos la primera operación (car / i), y el re-
sultado es de tipo int. De igual forma, para la segunda operación (f * d), y el resultado es
de tipo double.
Ahora procedemos a realizar la suma de los dos primeros resultados (car * ent) + (fl * db),
como uno de ellos es de tipo int y el otro de tipo double, el int se convierte en double por
la segunda regla, y el resultado es un double.
17
Por último, realizamos la resta final, siendo los dos operandos de tipo double y el resul-
tado final; por tanto, de tipo double.
No siempre es posible que C convierta un tipo de dato a otro con el resultado que noso-
tros deseamos, o incluso a veces intentar asignar el valor de una variable de un tipo de
dato a otra con otro tipo de dato puede derivar en un error de ejecución grave. Para forzar
la conversión de una variable de un tipo a otro existe lo que en C se denomina casting,
lo cual se realiza colocando entre paréntesis el tipo de dato deseado a la izquierda de la
variable a convertir:
(tipo) expresión
int x=3,y=2;
float z;
z=x/y;
Aquí, el valor asignado a z es 1.0, y no 1.5; esto, porque al ser x y y variables enteras, el
resultado de dividirlas es un entero, y 3/2 es igual a 1. Posteriormente, el valor 1 se con-
vierte a un valor en punto flotante (float) para realizar la asignación (valor 1.0), y se asigna
a z. Si lo que se desea es que la división se realice en punto flotante, debe escribirse la
operación de la siguiente forma: z = (float) x / y;
Esta conversión forzada obliga a convertir la variable a en float, y entonces, aplicando las
reglas de conversión automática de tipos la variable, b se convierte automáticamente en
float y se realiza la división en punto flotante. Con esto, el resultado final de la operación
es 1.5, y dicho valor se asigna a la variable z.
• Signo negativo: -
• Incremento: ++
• Decremento: --
18
La expresión x-- equivale a x = x-1
Los operadores ++ y -- pueden usarse tanto de manera postfija como prefija, por
ejemplo: --x.
El hecho de que los operadores se usen de forma postfija o prefija determina si el valor
de la variable se modifica después o antes de la evaluación de la expresión en la que
aparece. Por ejemplo, la siguiente línea de código:
equivale a:
c = c + 1;
a = (c - b) % 100;
b = b - 1;
Cuando tenemos expresiones muy largas y complejas, podría ser confuso entender cómo
es que el compilador realiza cada una de las operaciones contenidas en la expresión.
Además, se debe saber el orden en que el compilador realiza las operaciones porque el
resultado puede ser completamente diferente al aplicar diferente orden.
int d=2; a = 3, b = 6;
int Resultado;
Resultado = d+b/a;
En este ejemplo, al sustituir los valores de cada variable obtenemos la siguiente ex-
presión aritmética:
Resultado = 2+6/3;
Sería un grave error pensar que primero se realiza la suma 2+6, dando como resultado
19
la expresión.
Resultado = 8/3.
La precedencia de los operadores está muy bien definida en el Lenguaje C, y cuando dos
operadores tienen la misma precedencia, se realiza primero el que está a la izquierda.
La tabla siguiente muestra la precedencia de los operadores de arriba hacia abajo, es de-
cir, tienen una prioridad mayor (precedencia) los que se encuentran en el primer renglón,
después los del segundo, y así sucesivamente; los operadores que están en el mismo
renglón tienen el mismo nivel de precedencia y se realiza primero el que esté más hacia
la izquierda de la expresión.
20