Modulo de Liguagem
Modulo de Liguagem
Modulo de Liguagem
Un programa escrito en C está compuesto por una o más funciones. Una función es un
programa que sirve para realizar una tarea determinada, por ejemplo, la función scanf sirve
para leer datos desde el teclado.
Existe una función que está presente en todos los programas escritos en C, su misión es
marcar el inicio y fin de la ejecución de cada uno de ellos; es la función principal, la primera que
void main(void) int main()
{ {
<bloque_de_instrucciones> <bloque_de_instrucciones>
} }
los caracteres abrir llave ({) y cerrar llave (}). Los paréntesis "()" escritos después de main
1. Tipos de instrucciones
De expresión.
De control.
Compuestas.
{
<bloque_de_instrucciones>
}
Un bloque de instrucciones puede estar compuesto por una o más instrucciones, que, a su vez,
pueden ser instrucciones de expresión, de control y/o compuestas nuevamente.
El cuerpo de toda función es una instrucción compuesta. Sirva como ejemplo el cuerpo de la
función main, el cual alberga al bloque de instrucciones principal de un programa escrito en C.
<instrucción_de_expresión>;
Una instrucción de expresión es, en sí misma, una expresión. De modo que, la acción que se
ejecuta es la evaluación de dicha expresión:
<expresión>;
En cuanto a las instrucciones de control, existen de distintos tipos, y todas sirven para
modificar el flujo de control de un programa. Veremos que, algunas de ellas deben ir seguidas
del carácter punto y coma (;), pero otras no.
Mi primer programa en C
Ejemplo: Se quiere escribir un programa que muestre por pantalla un mensaje de saludo:
Hola mundo
#include <stdio.h>
int main()
{
printf( "Hola mundo" );
return 0;
}
Dentro de los paréntesis "()" de la función printf, se debe escribir, entre comillas dobles ("), el
mensaje o cadena de caracteres que se desea mostrar por pantalla.
Obsérvese que, después del carácter cerrar paréntesis ")" se ha escrito un punto y coma (;),
esto implica que la llamada a la función printf es considerada como una instrucción de
expresión.
Del código fuente preprocesado de un programa, el compilador generará un código objeto que
se debe unir (enlazar) con los códigos objeto de las funciones de la biblioteca estándar de C
que se llamen desde dicho programa. Por ejemplo, el código objeto de nuestro primer
programa se debe enlazar con el código objeto del subprograma printf.
El enlazador sabe dónde encontrar el código objeto de las funciones de la biblioteca estándar
de C que utilice un programa. Sin embargo, para poder utilizar una función (sea de la biblioteca
estándar de C o no) en un programa, la función debe ser declarada previamente, al igual que
se tienen que declarar las variables y las contantes que usa un programa.
Para que el compilador conozca la declaración de la función printf, hay que utilizar la directiva
del preprocesador #include:
#include <stdio.h>
Después de #include, el nombre del archivo de cabecera se puede escribir entre los caracteres
menor y mayor (<stdio.h>), o entre comillas dobles ("stdio.h"). Cuando se escriba entre comillas
dobles, el preprocesador buscará dicho archivo en el directorio actual de trabajo, y de no
encontrarlo ahí, entonces lo buscará en el directorio especificado por el compilador. En el caso
de escribirse entre los caracteres menor y mayor, el proceso de búsqueda será al revés.
return 0;
Esto quiere decir que la función main devuelve el valor 0. Precediendo a main se ha escrito la
palabra reservada int, indicando así, que la función retornará un valor de tipo int (entero).
int main()
return <expresión>;
[ <directivas_del_preprocesador> ]
int main()
{
<bloque_de_instrucciones>
}
Los caracteres abrir corchete ([) y cerrar corchete (]) se utilizan para indicar que lo que
contienen es opcional.
2. Tipos de Datos en C.
En C se dice que todos los datos que utilizan los programas son básicos (simples predefinidos
o estándares) o derivados. Los tipos básicos en C se clasifican en:
Un dato de tipo entero (int) es aquel que puede tomar por valor un número perteneciente al
conjunto de los números enteros (Z), el cual está formado por los números naturales, sus
opuestos (números negativos) y el cero.
Ejemplo 1: La edad de una persona y el año en que nació, son dos datos de tipo entero:
Edad...: 29
Año....: 1976
Un dato de tipo real (float o double) es aquel que puede tomar por valor un número
perteneciente al conjunto de los números reales (R), el cual está formado por los números
racionales e irracionales.
Ejemplo 2: El peso de una persona (en kilogramos) y su altura (en centímetros), son datos que
pueden considerarse de tipo real.
Peso.....: 75,3
Altura...: 172,7
Un dato de tipo carácter (char) es aquel que puede tomar por valor un carácter perteneciente
al conjunto de los caracteres que puede representar el ordenador.
En C, el valor de un dato de tipo carácter se debe representar entre comillas simples (').
Ejemplo 3: En un examen con preguntas en las que hay que seleccionar la respuesta correcta
entre varias opciones dadas (a, b, c, d, e), la respuesta correcta de cada una de las preguntas
es un dato de tipo carácter.
Un dato sin valor (void) es un dato que no puede tomar por valor nigún valor, es decir, es un
dato vacío (nulo).
{ verdadero, falso }
Los valores verdadero y falso son contrapuestos, de manera que, un dato de tipo lógico
siempre está asociado a que algo se cumpla o no se cumpla.
Ejemplo 4: El estado de una barrera de paso de trenes es un dato que puede considerarse de
tipo lógico, por ejemplo, asociando verdadero a que esté subida y falso a que esté bajada.
En C no existen datos de tipo lógico (que sí existen en otros lenguajes de programación). Ahora
bien, se pueden simular con datos de tipo entero, considerándose el valor cero (0) como falso,
y cualquier otro valor entero como verdadero (para ello, generalmente, se emplea el valor uno
(1)).
De todos los tipos de datos que no son básicos se dice que son derivados, ya que, están
basados en alguno que sí lo es. Por ejemplo, los datos de tipo cadena son aquellos que
pueden tomar por valor una secuencia de caracteres.
En C, el valor de un dato de tipo cadena se debe representar entre comillas dobles (").
Ejemplo 5: El título de un libro y el nombre de su autor, son datos de tipo cadena.
3. Identificadores
char, int, float, double y void
Ejemplo 1: Algunos identificadores válidos que pueden ser definidos por el programador son:
numero
dia_del_mes
PINGUINO1
_ciudad
Z
Ejemplo 2: Los siguientes identificadores no son válidos por incumplir la segunda regla:
123
_DÍA
numero*
lugar de nacimiento
año
int y char son identificadores predefinidos (ya existen), por tanto, no pueden ser definidos por
el programador, en cumplimiento de la tercera regla.
Por último, hay que decir que, es aconsejable que los identificadores tengan un significado afín
a lo que representan.
4. Palabras reservadas.
char, int, float, double y void
5. Variables
En C hay que escribir un punto y coma (;) después de la declaración de una o más variables.
Así pues, la sintaxis para declarar una variable es:
Ejemplo 1: La declaración de una variable para almacenar la edad de una persona se escribe:
int edad;
Ejemplo 2: Para declarar varias variables del mismo tipo de dato se puede escribir:
int edad;
int numero_de_hijos;
Ejemplo 3: O también, en la misma línea separadas por el carácter coma (,):
int edad, numero_de_hijos;
Ejemplo 4: Si se desea declarar una variable para almacenar un número entero y que,
inicialmente, contenga el valor 35, se debe escribir:
int numero = 35;
Ejemplo 5: A continuación, se muestra la declaración de una variable para almacenar una letra
del alfabeto y que, inicialmente, contenga el valor 'Z':
char letra = 'Z';
Ejemplo 6: Para declarar una variable que pueda almacenar el nombre de una persona y que,
inicialmente, contenga el valor "Isabel", escribiremos:
char nombre[7] = "Isabel";
Un dato de tipo cadena es un dato compuesto (estructurado), debido a que está formado por
una agrupación de caracteres. Pues bien, dicha agrupación se define por medio de un array.
Un array agrupa, bajo el mismo nombre de variable, a una colección de elementos (datos) del
mismo tipo.
Para declarar un array de caracteres, después del identificador de la variable, se tiene que
escribir, entre corchetes "[]", el número de caracteres que se van a almacenar en el array, más
uno. Por tanto, en este caso, puesto que "Isabel" tiene seis caracteres, hay que escribir un 7
entre los corchetes.
Se tiene que escribir un número más, porque en la memoria se va a reservar espacio para los
seis caracteres de la cadena "Isabel", más uno, conocido éste como el carácter nulo, el cual
se representa mediante una barra invertida y un cero (\0). El sistema se encarga de "poner"
dicho carácter, que indica el fin de la cadena.
<nombre_de_la_variable>[<índice>]
Por ejemplo, nombre[3] hace referencia al espacio de memoria donde está el carácter 'b'.
char nombre[7] = "June";
En memoria tendremos:
1.7 Constantes
En C, una constante puede ser de tipo entero, real, carácter, de cadena o enumerado. Las
contantes de tipo enumerado se van a estudiar más adelante. En cuanto a las demás, se
pueden expresar de dos formas diferentes:
Para expresar una constante con un nombre, la constante debe ser declarada previamente. Las
constantes que se declaran en un programa escrito en C reciben un tratamiento diferente al de
la mayoría de los lenguajes de programación. En C, para representar a las constantes, se
utilizan constantes simbólicas. Una constante simbólica representa (sustituye) a una
secuencia de caracteres, en vez de representar a un valor (dato almacenado en memoria).
Para declarar una constante simbólica, en C, se utiliza una nueva directiva del preprocesador:
#define PI 3.141592
#define NUMERO_E 2.718281
Por otra parte, no se puede declarar más de una constante simbólica en una misma línea de
código.
Por otra parte, en C, es posible declarar una variable indicando que su valor es inalterable.
Para ello, se utiliza el cualificador const.
En cuanto a las variables que utiliza un programa, su declaración puede escribirse en varios
lugares, pero, de momento las vamos a declarar inmediatemente después del carácter abrir
llave ({) de la función main.
[ <directivas_del_preprocesador> ]
int main()
{
[ <declaraciones_de_variables> ]
<lista_de_instrucciones>
}
Ejemplo 5: Si en un programa se quieren declarar dos variables (area y radio) y una constante
(PI), se puede escribir:
#define PI 3.141592
int main()
{
6. Operadores y expresiones
En un programa, el tipo de un dato determina las operaciones que se pueden realizar con él.
Por ejemplo, con los datos de tipo entero se pueden realizar operaciones aritméticas, tales
como la suma, la resta o la multiplicación.
19 - 72 (operación resta)
24 * 3 (operación multiplicación)
Todas las operaciones del ejemplo constan de dos operandos (constantes enteras) y un
operador. La mayoría de las veces es así, pero, también es posible realizar operaciones con
distinto número de operadores y/u operandos.
En las operaciones del ejemplo se puede observar que los caracteres más (+) y menos (-)
tienen dos usos:
Los operadores de signo más (+) y menos (-) son operadores monarios, también llamados
unarios, ya que, actúan, solamente, sobre un operando.
Los caracteres abrir paréntesis "(" y cerrar paréntesis ")" se utilizan para establecer la prioridad
de los operadores, es decir, para establecer el orden en el que los operadores actúan sobre los
operandos.
Un operador indica el tipo de operación a realizar sobre los operandos (datos) que actúa. Los
operandos pueden ser:
Constantes (expresadas por su valor o con un nombre (identificador)).
Variables.
Llamadas a funciones.
En este apartado se van a tratar operaciones en donde sólo aparecen constantes y variables.
Cuando se combinan uno o más operadores con uno o más operandos se obtiene una
expresión. De modo que, una expresión es una secuencia de operandos y operadores escrita
bajo unas reglas de sintaxis.
#define PI 3.141592
int numero = 2;
float radio_circulo = 3.2;
Un operador siempre forma parte de una expresión, en la cual, el operador siempre actúa sobre
al menos un operando. Por el contrario, un operando sí puede aparecer solo en una expresión.
En pseudocódigo:
entero a = 4, b = 7, c = 2
En C:
int a = 4, b = 7, c = 2;
En pseudocódigo:
-a * ( b mod c )
En C:
-a * ( b % c )
De la evaluación de esta expresión se obtiene el valor -4 (actúan en orden los operadores: (%),
El operador división
Puesto que, en C, sólo existe un operador de división, el resultado de una división dependerá
de los operandos. La regla a seguir es: "si ambos operandos son enteros, el resultado de
evaluar la expresión será entero, en caso contrario, es decir, si al menos un operando es real,
el resultado será real".
De las expresiones:
v / h
5 / h
5.0 / 2
5 / 2.
5.4 / 2.0
En C, cuando los dos operandos de una división ( /) son enteros, pero aun así, de su evaluación
se quiere obtener un valor real, hay que hacer un casting (o conversión de tipo). Su sintaxis es:
( <tipo_de_dato> ) <expresión>;
De esta forma, se consigue cambiar el tipo de dato del valor resultante de evaluar la
<expresión> a un <tipo_de_dato> deseado.
Ejemplo 6: Para cambiar el tipo de dato de los valores resultantes de las siguientes
expresiones:
5 (valor entero)
v (valor entero)
v / h
5 / h
5.0 / 2
5 / 2.
5.4 / 2.0
se puede escribir:
( float ) 5
( float ) v
( int ) 5.0
( float ) v / h
( float ) 5 / h
5 / ( int ) 2.
de tal forma que, los resultados de evaluar las expresiones anteriores son:
5 (valor entero)
La función pow
En C, para realizar operaciones con potencias se utiliza una función de su biblioteca estándar,
en concreto la función pow, a la que hay que "darle" (pasarle) dos operandos entre paréntesis.
La sintaxis de su llamada es:
En pseudocódigo:
entero numero = 9
En C:
int numero = 9;
De la expresión:
En pseudocódigo:
1 + numero ** 2
En C:
1 + pow( numero, 2 )
#include <math.h>
Expresiones lógicas.
Lógicos.
Operadores relacionales
Un operador relacional se utiliza para comparar los valores de dos expresiones. Éstas deben
ser del mismo tipo (aritméticas, lógicas o de carácter).
1. En C, el operador igual que (=) se escribe con los caracteres igual-igual (==).
(!=).
En pseudocódigo:
entero p = 45, q = 186
En C:
int p = 45, q = 186;
En pseudocódigo:
p <> q
En C:
p != q
De su evaluación se obtiene:
En pseudocódigo:
verdadero ( p es distinta de q )
En C:
1 (C simula el valor lógico verdadero con el valor entero 1)
En C, los datos de tipo lógico se simulan con datos de tipo entero, considerándose el valor 0
como falso, y cualquier otro valor entero como verdadero.
Operadores lógicos
En pseudocódigo:
entero r = 2, s = 9, t = 8
En C:
int r = 2, s = 9, t = 8;
se puede escribir
En pseudocódigo:
no( r = s o r <= t )
En C:
!( r == s || r <= t )
La expresión se evalúa a
En pseudocódigo:
falso (actúan en orden los operadores: (<=), (==), (||) y (!))
En C:
0 (C simula el valor lógico falso con el valor entero 0)
La función strcat
En C, no existe el operador concatenación ( +), que sí existe en otros lenguajes. Sin embargo,
En pseudocódigo:
cadena nombre = "Ana", apellido = "Luz"
En C:
char nombre[8] = "Ana", apellido[4] = "Luz";
En pseudocódigo:
nombre + apellido
En C:
strcat( nombre, apellido )
#include <string.h>
Operadores de asignación
nombre_de_la_variable> = <expresión>;
Existen dos diferencias:
1. En vez del símbolo reservado flecha izquierda (←), se utiliza el carácter igual (=).
#include PI 3.141592
y de las variables
float area, longitud, radio;
radio = 5.78;
Técnicamente, en C, una asignación (=) es una operación, al igual que lo es una suma ( +) o
una resta (-). En consecuencia, radio = 5.78 es una expresión de asignación, que entra dentro
de la categoría de las instrucciones de expresión.
<instrucción_de_expresión>;
Si ahora escribimos:
area = PI * pow( radio, 2 );
longitud = 2 * PI * radio;
(+), resta (-), multiplicación (*), división (/) o módulo (%), la unión de ambos se convierte en un
nuevo operador de asignación que opera de la siguiente manera:
m += 3;
m = m + 3;
m *= n += 2;
La función strcpy
operador de asignación (=). Para ello, se puede utilizar la función strcpy, que está disponible
En pseudocódigo:
cadena ciudad
En C:
char ciudad[6];
es posible escribir
En pseudocódigo:
ciudad ← "Roma" (instrucción de asignación)
En C:
strcpy( ciudad, "Roma" ) (instrucción de expresión)
#include <string.h>
r++;
s--;
r = r + 1;
s = s - 1;
++r;
--s;
j = i++;
m = ++k;
Obsérvese que, los valores de j y m son diferentes. Esto es debido a que, cuando se evalúa la
expresión j = i++, en primer lugar, se le asigna a j el valor de i (es decir, un 5) y, a continuación,
se incrementa el valor de la variable i. Por el contrario, cuando se evalúa la expresión m = ++k,
primero, se incrementa el valor de k (de 5 pasa a ser 6) y, después, este nuevo valor de k se le
asigna a m.
En resumen, cuando en una expresión el operador incremento ( ++) o decremento (--) precede
al operando sobre el que actúa (por ejemplo ++k), antes de utilizar el valor de dicho operando
para otro propósito, este se incrementa. De ser al revés, es decir, si es el operando quien
precede al operador (por ejemplo i++), el valor de dicho operando se incrementa después de
ser utilizado para otro fin.
Prioridad de operadores
Obsérvese que, en C, tanto los paréntesis " ()" que se utilizan para llamar a una función, como
los corchetes "[]" que albergan el índice de un array, también son considerados operadores.
Además, son los operadores más prioritarios y, en una expresión, se evalúan de izquierda a
derecha.
Por otra parte, los operadores incremento ( ++), decremento (--) y conversión de tipo "(
<tipo> )" entran dentro de la categoría de operadores monarios. De manera que, al igual que
los operadores signo más ( +), signo menos (-), negación (!) y de asignación, todos ellos se
evalúan de derecha a izquierda en una expresión, al revés que todos los demás.