Pages - Menu

viernes, 26 de abril de 2013

Curso básico de C 3/10: Directivas, constantes y la librería stdio.h

Llegamos al tercer capítulo del curso básico de C, en el capítulo anterior pudimos aprender la estructura básica de un programa escrito en C así como de ver herramientas como la indentación o el uso de comentarios como buena práctica para hacer el código cómodo a su comprensión, también pudimos ir tomando contacto con las variables y muchos de los operadores posibles, por último vimos por encima cómo utilizar las funciones printf y scanf además de definir la librería <stdio.h>.


Foto tomas de freedigitalphotos.net
En éste tercer apartado vamos a relatar todos los tipos de variables que existen en C, también veremos todos los tipos de operadores que pueden usarse, y seguidamente veremos las directivas, definiremos la función <stdio.h> al completo y veremos el concepto de constante.

Variables en C

Ya sabemos que las variables son espacios de memoria del computador donde se almacenan valores que son susceptibles de ser modificados a lo largo de la ejecución del programa. También sabemos que las variables deben ser declaradas obligatoriamente para poder usarlas y que para declararlas tenemos que definir el tipo de dato que van a almacenar, esto es importante porque debemos tener muy claro que será capaz de almacenar una variable y no cometer errores operando, no se puede declarar una variable de tipo numérica entera e intentar almacenar valores alfanuméricos o de coma flotante.

Para poder abarcar todas las posibilidades, en C existen multitud de tipos de variables tanto numéricas como booleanas como alfanuméricas, además existen variables que almacenan direcciones de memoria o de medición del espacio lógico ocupado. Veamos un cuadro explicativo.

Tipo
Explicación
Char
Carácter, almacena un carácter perteneciente a un código concreto (como el ASCII)
short
short int
signed short
signed short int
Numérico, va desde el –32.768 a 32.767
int
signed int
Tipo de dato numérico entero, 16 bits.
unsigned
unsigned int
Lo mismo que int pero sin signo.
long
long int
signed long
signed long int
Tipo de dato numérico entero, 32 bits.
unsigned long
unsigned long int
Lo mismo que long pero sin signo.
long long
long long int
signed long long
signed long long int
Tipo de dato numérico entero, 64 bits.
unsigned long long
unsigned long long int
Lo mismo que long long pero sin signo
float
Tipo de dato numérico de coma flotante, 32 bits.
Double
Tipo de dato numérico de coma flotante, 64 bits.
long double
Tipo de dato numérico de coma flotante, 128 bits.
Char []
Arrays de caracteres de tipo char, se usa para manejar cadenas completas o Strings
Enum
Se utiliza para almacenar un conjunto reducido de valores que no se cubre con tipos de datos básicos.
&
Usado para definir punteros a memoria de tipos de datos
*
Usado para definir punteros a memoria de tipos de datos

El tipo de dato booleano (true, false) no está definido en C para declararlo como variable, no obstante se usan booleanos en las expresiones comparativas, si deseamos operar con variables siguiendo esa lógica podemos definir una variable de tipo int y que almacene 0 o 1 (esto lo controla el programador).

Como podemos comprobar hay una gran cantidad de tipos de datos en C, gracias a esto nos será posible operar como mejor veamos, lo cual nos lleva a ver de nuevo el apartado de operadores.

Nosotros nos quedaremos para el curso con los tipos de datos más comunes y usaremos los de tipo int para representar variables booleanas, a modo de resumen éste sería el cuadro explicativo de los tipos de datos que usaremos:


Tipo
Rango
Bytes
char
-128 ... 127 (ASCII)
1
int
-32.768 ... 32.767
2
long
-2.147.483.648 ... 2.147.483.647
4
float
3.4*10^-38 ... 3.4*10^38
4
double
1.7*10^-308 ... 1.7*10^308
8
void
Valor nulo
nulo

El tipo de dato void es el de valor nulo, representa una celda de memoria donde no hay ningún dato almacenado, cuando hablamos en los lenguajes de programación de un valor nulo, null, nil o void, queremos representar y trabajar con una variable o expresión vacía en valor.

Operadores en C

Como en el anterior capítulo hemos visto los operadores más comunes vamos a incluir otra tabla de igual forma que con las variables con el fin de resumir todos los operadores entre variables y expresiones.

Operadores aritméticos:

Operador
Símbolo
Ejemplo
Significado
Suma
+
a + b
a más b
Resta
-
a - b
a menos b
Multiplicación
*
a * b
a por b
División
/
a / b
a dividido b
Residuo
 %
a % b
a residuo de b
Signo (negativo)
-
-a
a negativo

Operadores relacionales:

Operador
Símbolo
Ejemplo
Significado
Igual
==
x == y
x es igual a y
Diferente
 !=
x != y
x es diferente de y
Mayor que
> 
x > y
x es mayor que y
Mayor o igual que
>=
x >= y
x es mayor o igual que y
Menor que
< 
x < y
x es menor que y
Menor o igual que
<=
x <= y
x es menor o igual que y

Operadores lógicos (booleanos):

Operador
Símbolo
Ejemplo
Significado
Y (AND)
&&
(a>b) && (c<d)
a es mayor que b y c es menor que d
O (OR)
||
(a>b) || (c<d)
a es mayor que b o c es menor que d
NEGACION (NOT)
 !
 !(a>b)
a no es mayor que b

Operadores de incremento o decremento:

Ejemplo
Significado
Variable++
El valor de la variable incrementa después de una operación
++Variable
El valor de la variable incrementa antes de una operación
Variable--
El valor de la variable disminuye después de una operación
--Variable
El valor de la variable disminuye antes de una operación

Tanto en éste curso como en el resto de programas que realicemos utilizaremos siempre esta clase de operadores, aunque es posible que debido a características específicas del lenguaje que utilicemos algunos operadores no los usemos o los usemos con distinta representación.

Una vez realizado éste repaso entremos en un nuevo concepto muy importante en la programación en C, las constantes.

Constantes.

Las constantes son espacios de memoria que almacenan valores cuyo valor NO se  puede alterar a lo largo de la ejecución del programa.

A efectos de tratamiento en programación son idénticos a las variables, salvo que como no se puede alterar su valor los operadores donde las constantes reciban un valor no están permitidos.

Ejemplos de constantes son por ejemplo la fuerza de la gravedad, el número Pi o la velocidad de la luz. También se pueden añadir constantes en nuestro programa datos como el número máximo de alumnos de una clase, el stock máximo de una tienda, etc.

Las constantes son invariables a lo largo de todo el programa y para declarar una constante tenemos dos posibilidades:

1 - Con la palabra reservada const seguida del tipo de dato y el nombre de la constante y su valor:

const float pi = 3.14;

2 – Con la directiva #define (ver siguiente apartado, las directivas).

#define PI 3.14

Veamos un ejemplo de uso de constantes en los dos casos:

1 –

#include <stdio.h>

int main(void)
{
const float pi = 3.14;
float a;

a=pi;
           
return 0;
}

2 –

#define PI 3.14

int main(void)
{
int numero;
numero = PI;

return 0;
}


Directivas #include y #define

Como hemos dicho en el anterior apartado, para poder trabajar con una constante es necesario hacer uso de la directiva #define.

Una directiva son palabras que empiezan por el carácter especial # y es completamente invisible al compilador, es decir, no lo tendrá en cuenta.

¿Qué quiere decir eso? Pues quiere decir que el compilador hará como en los comentarios, no tenerlos en cuenta, no obstante es otra de las partes implicadas en la compilación y construcción de un programa la que se encarga de manejarlas, éste es el preprocesador.

El preprocesador es un programa independiente, el cual hace que interprete esas palabras especiales y realice funciones específicas dependiendo de la palabra que sea, en el caso del #include lo que hace es sustituir esa palabra por la librería al completo dentro de nuestro programa, de esa forma no es necesario escribirlo todo de nuevo.

#define

Como hemos comentado, la directiva #define se encarga de definir las constantes que se utilizarán dentro del programa, éstas son invariables y no se pueden modificar.

#include

La directiva include se encarga de importar una librería concreta a nuestro programa, de ésta forma podremos trabajar con funciones ya creadas sin necesidad de tener que importarlas.

C cuenta con una biblioteca estándar de ficheros donde podemos encontrar herramientas para la gestión de la pantalla, de funciones matemáticas extra, comparación de cadenas, análisis de errores o tratamiento de formatos de fecha y hora. A continuación os pongo las librerías estándares de C.

<assert.h>
<complex.h>
<cstring>
<ctype.h>
<errno.h>
<fenv.h>
<float.h>
<inttypes.h>
<iso646.h>
<limits.h>
<locale.h>
<math.h>
<setjmp.h>
<signal.h>
<stdarg.h>
<stdbool.h>
<stdint.h>
<stddef.h>
<stdio.h>
<stdlib.h>
<string.h>
<tgmath.h>
<time.h>
<wchar.h>
<wctype.h>

Evidentemente con el paso del tiempo y los nuevos IDEs se han ido añadiendo muchas más, pero éstas son las más básicas. De momento nosotros usaremos la librería <stdio.h>.

<stdio.h>

Como hemos definido en el capítulo anterior, stdio.h es la librería perteneciente a la biblioteca estándar de C y se encarga de todo lo referente a operaciones de entrada y salida, es necesaria incluirla mediante la directiva #include para poder usar funciones como printf o scanf para escritura y lectura de datos.

Algunas de las funciones que trae son las siguientes:

Funciones para el tratamiento de ficheros:


Nombre
Descripción
fclose
Cierra un fichero.
fopen,freopen,fdopen
Abre un fichero.
remove
Elimina un fichero.
rename
Cambia el nombre del fichero.
rewind
Coloca el indicador de posición de fichero al comienzo.
tmpfile
Crea y abre un fichero temporal.


Para el tratamiento de entrada y salida de datos algunas de las funciones son las siguientes:

Nombre
Descripción
clearerr
Despeja los indicadores de final y posición de fichero.
feof
Comprueba el final del fichero.
ferror
Comprueba los errores.
fflush
Envía cualquier dato aún sin escribir al entorno local o a ser escrito en el fichero.
fgetpos
Posición actual del fichero.
fgetc
Devuelve un carácter de un fichero.
fgets
Devuelve una cadena de caracteres de un fichero.
fputc
Escribe un carácter en un fichero.
fputs
Escribe una cadena de caracteres en un fichero.
getc
Devuelve un carácter desde un fichero.
getchar
Similar a getc.
printf,fprintf,sprintf
snprintf
Imprimir datos.
putc
Devuelve un carácter de un fichero.
putchar,fputchar
Igual que putc(stdout).
scanf,fscanf,sscanf
Utilizado para introducir entradas.
vfscanf,vscanf,vsscanf
También utilizado para introducir entradas.
puts
Imprime una de cadena de caracteres.

Ejemplos de uso de la librería stdio.h:

#include <stdio.h>

int main ( void )
{
int numero=22;
            printf("En la clase hay %d alumnos \n", numero);
           
return 0;
}

#include <stdio.h>

int main ( void )
{
int numero;

printf ("Introduce el número de alumnos de la clase ");
scanf ("%d",&numero); 
            printf("En la clase hay %d alumnos \n", numero);
           
return 0;
}

Conclusiones

Ya tenemos lo básico para poder construir perfectamente un programa en C, conocemos los elementos básicos que estructuran un programa y podemos ir realizando operaciones, solicitando y escribiendo datos, trabajar con variables y constantes, incluir librerías y manejar distintos tipos de datos.

En la próxima entrega se entrará de lleno en las estructuras de control de flujo de ejecución, veremos las estructuras selectivas (if, else, case, etc.) y las estructuras iterativas (while, for, do...while, etc.) con el fin de poder realizar programas que controlen valores o que hagan acciones repetidas.

¿Qué os parece va pareciendo el curso?