Sunteți pe pagina 1din 20

Semana 1

Lenguaje de programación

Unidad 1
Introducción al Lenguaje C

Unidad 2
Tipos de Datos y
Operadores en C

Material compilado con fines académicos, se prohíbe su


reproducción total o parcial sin la autorización de cada autor.
1. INTRODUCCIÓN AL LENGUAJE C
De acuerdo con Hernández Mendoza (2003, p. 23):

Programación es elaborar una lista de instrucciones, es decir, escribir un programa.


Diseñar un programa de computadora es muy similar a describir a alguien las reglas
de un juego que nunca ha jugado. En ambos casos se requiere de un lenguaje de
descripción que entiendan las partes involucradas en el fenómeno comunicativo.
Los lenguajes utilizados para la comunicación entre el hombre y la computadora son
llamados de programación. Las instrucciones dadas a la computadora deben ser
representadas y combinadas de acuerdo con las reglas de sintaxis del lenguaje de
programación. Las reglas de un lenguaje de programación son muy precisas y no
permiten excepciones o ambigüedades.

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.

En 1989 se estableció el estándar ANSI C. Actualmente, cualquier compilador moderno


soporta ANSI C. El lenguaje C debe su nombre a su predecesor, el lenguaje B, desarro-
llado por Ken Thompson, también en los Laboratorios Bell.

1.1. Fundamentos del lenguaje C


De acuerdo con Byron (1996):

C es un lenguaje de programación estructurado de propósito general. Sus instruccio-


nes consisten en términos que se asemejan a expresiones algebraicas, aumentadas
por ciertas palabras clave en inglés como if, else, for, do y while. En este sentido, C se
parece a otros lenguajes de programación estructurados de alto nivel, como Pascal
y Fortran. Sin embargo, C también contiene ciertas características adicionales que
permiten su uso en un nivel inferior, lo que reduce la brecha entre el lenguaje de
máquina y los lenguajes de alto nivel más convencionales. Esta flexibilidad permite
que C se utilice para la programación de sistemas (por ejemplo, para escribir sistemas
operativos), así como para la programación de aplicaciones (por ejemplo, para escribir
un programa para resolver un complicado sistema de ecuaciones matemáticas o para
escribir un programa para facturar a los clientes).

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.

El lenguaje C es un lenguaje estructurado, pero no es estructurado por bloques, o sea, no


es posible declarar subrutinas (pequeños trozos de programa) dentro de otras subrutinas,
a diferencia de como sucede con otros lenguajes estructurados, tales como el Pascal.

Además, el lenguaje C es flexible en la comprobación de tipos de datos, y permite fácil-


mente la conversión entre diferentes tipos de datos, por ejemplo:

float a; // Declaro una variable para de tipo “número real”


int b; // Declaro otra variable de tipo “número entero”
b=a; // Asigno a la variable b el número real

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.

Toda función en C se compone de los siguientes elementos:

• Un encabezado de función, que consiste en el nombre de la función, seguido de


una lista opcional de argumentos entre paréntesis.
• Una lista de declaraciones de argumentos, sólo si los argumentos están incluidos
en el encabezado.
• Una declaración compuesta, que comprende el resto de la función, a la cual se le
llama también “definición de la función”.

1.2. Compilación de un programa


El lenguaje C es un lenguaje de alto nivel, lo que significa que sus instrucciones son
palabras del lenguaje que utilizan las personas para comunicarse entre sí. En este caso
específico, las palabras del lenguaje C son palabras correspondientes al idioma inglés,
por ejemplo:

• If-else (si, sino)


• while (mientras)
• for (para)
• do (hacer)
• printf (imprimir) (en este caso se agregó la letra ƒ al final de print)
• switch-case (selecciona-según el caso)

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:

1.3. Directivas del precompilador


Las directivas son palabras clave o sentencias que se colocan al inicio de un programa
(en las primeras líneas del código fuente). Las directivas se pueden utilizar con diferentes
fines, a continuación se describirán las directivas más comunes del lenguaje C.

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.

1.4. Programa Hola Mundo

Ahora estamos listos para escribir y ejecutar nuestro primer programa en lenguaje C, para
esto utilizaremos el procedimiento de la figura 1:

1. Ejecutaremos el programa Dev C++, previamente instalado en tu computadora.


Deberá aparecer la imagen de la figura 2.

Figura 2. Imagen que aparece después de ejecutar Dev C++.

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”.

Figura 3. Selección del tipo de proyecto.

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”.

Figura 4. Selección de la carpeta de trabajo.

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.

A continuación podemos identificar un comentario que es totalmente ignorado por


el compilador (todos los comentarios son ignorados por el compilador):

/* run this program using the console pauser or add your


own getch, system("pause") or input loop */

Por el momento también ignoraremos este comentario, y sólo resaltaremos que


cualquier segmento de código que esté empiece con los símbolos /* y termine con
los símbolos */ es totalmente ignorado por el compilador, por lo que el programador
utiliza estos segmentos para colocar comentarios de cualquier índole.

Finalmente, el código termina con las siguientes líneas:

int main(int argc, char *argv[]) {


return 0;
}

Todo programa de C consta, básicamente, de un conjunto de funciones y una fun-


ción llamada main, la cual es la primera que se ejecuta al comenzar el programa, y
el código del usuario (programador) se agregará entre las primera llave “{“ y antes
de la frase “return 0”.

Siguiendo estas indicaciones, agregaremos la siguiente línea a nuestro programa:

printf (“Hola mundo”);



Si borramos el comentario (que no tiene ninguna utilidad), el código completo de
nuestro programa es el siguiente:

#include <stdio.h>
#include <stdlib.h>

7
int main(int argc, char *argv[ ])
{
printf (“Hola mundo”);
return 0;
}

A continuación, compila el programa (con la tecla F9) y finalmente ejecútalo con la


tecla F10.

El resultado será una pantalla idéntica a la de la figura 5.

Hemos escrito, compilado y ejecutado nuestro primer programa en Lenguaje C.

2. TIPOS DE DATOS Y OPERADORES EN C

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.

Existen diferentes tipos de valores. No es lo mismo un valor numérico que un número de


personas, que, por lo tanto, siempre será un número entero, que un número cuyo valor
podría tener varios puntos decimales, o bien, un valor de tipo cadena para representar
nombres de personas. En la sección 2.2 se revisarán los diferentes tipos de datos que
tiene el lenguaje C para almacenar valores.

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 una variable es la siguiente:



Tipo_de_dato Nombre_de_Variable;

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:

Tipo_de_dato Nombre_de_Variable = Valor;

De esta forma, la variable ya contiene un valor inicial.

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:

Tabla 1. Palabras reservadas del lenguaje C.

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:

El código para calcular el perímetro de una circunferencia y el área de un círculo sería:

perimetro = 2 * 3.14 * radio;


area = 3.14 * radio * radio;

Si se define una constante de nombre PI y valor 3.14, el código cambia a:

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.

2.2. Tipos y tamaños de datos

El lenguaje C es flexible en la comprobación de tipos de datos, y permite fácilmente la


conversión entre diferentes tipos de datos, por ejemplo:

float a; // Declaro una variable para de tipo “número real”


int b; // Declaro otra variable de tipo “número entero”
b=a; // Asigno a la variable b el número real*/

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’;

En los ejemplos anteriores la variable a se está inicializando con el valor 10 al momento de


declararla, así como la variable caracter_2 se está inicializando con el valor a (la letra 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:

Algunos ejemplos de cómo aplicarlos serían:

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”);

En donde MENSAJE se refiere a cualquier combinación de letras, números y caracteres


(excepto los caracteres especiales, los cuáles se tratarán en el Bloque 2).

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);

En donde NOMBRE_DE_VARIABLE es el identificador de la variable a imprimir. Por ejem-


plo, el siguiente código:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])


{
int a = 3;
printf (“%d”,a);
return 0;
}

Escribe en la pantalla el número 3.

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>

int main(int argc, char *argv[])


{

float promedio = 6.77;
printf (“%f”,promedio);
return 0;
}

El código anterior escribe en la pantalla el número 6.77.

2.3. Operadores aritméticos

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: %

2.4. Operadores de relación y lógicos

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.

En este tipo de expresiones (lógicas) el resultado de su evaluación es un valor lógico (falso


o verdadero) en donde el operador principal debe ser un operador lógico o relacional.
También, en estas expresiones es posible emplear operadores o funciones aritméticas,
variables o constantes numéricas y operadores de asociación. El conjunto de operadores
lógicos y relacionales que se pueden utilizar en las expresiones se presenta en las tablas
2 y 3, respectivamente.

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:

A continuación se presenta un conjunto de instrucciones en donde se ocupan expresio-


nes lógicas que se asignan a una variable booleana (las variables booleanas reciben el
valor de falso o verdadero):

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.

En el lenguaje C es posible combinar variables de diferentes tipos de datos siempre y


cuando estemos plenamente conscientes de lo que esto implica para el resultado final.
Si en una expresión combinamos diferentes tipos de datos, el compilador convertirá to-
dos los operandos al tipo de dato más grande que esté presente. Esto se resume en las
siguientes:

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:

• Si uno de los operandos es un long double, el otro se convierte en long double.


• Si no, si uno de los operandos es double, el otro se convierte a double.
• Si no, si uno de los operandos es long, el otro se convierte a long.
• Si no, si uno de los operandos es unsigned, el otro se convierte a unsigned.

Veamos el siguiente ejemplo:

char car;
int ent;
float fl;
double db;

( car * ent ) + ( fl / db ) - ( fl - ent );


char int float double float int

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:

car pasa de char a int.


fl pasa de float a double.
( car * ent ) + ( fl / db ) - ( fl - ent );
int int double double double double

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.

( car * ent ) + ( fl / db ) - ( fl - ent );


Int double 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.

Conversión automática de tipos de datos.

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

Veamos el siguiente ejemplo:

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.

2.6. Incremento y decremento

Además de las operaciones aritméticas, C proporciona los siguientes operadores unarios:

• Signo negativo: -
• Incremento: ++
• Decremento: --

La expresión x++ equivale a x = x+1

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:

a = ((++c) - (b--)) % 100;

equivale a:

c = c + 1;
a = (c - b) % 100;
b = b - 1;

Es decir, la variable c se decrementa antes de realizar la expresión, después se realiza la


expresión y finalmente la variable b se incrementa.

2.7. Precedencia y orden de evaluación

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.

Comencemos con un ejemplo sencillo del siguiente código:

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; //Esto no ocurre

Debido a la precedencia de operadores, el compilador siempre ejecuta primero las divi-


sión y después la suma, dando como resultado la expresión:

Resultado = 2+2; //Esto sí ocurre.

Si quisiéramos cambiar la precedencia anterior y hacer que se realice primero la suma,


deberíamos colocar paréntesis para “aislar” la suma, de la siguiente forma:
Resultado = (2+6)/3

Esto se convierte en 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

S-ar putea să vă placă și