• short (2 bytes): número entero corto con signo. [-215, 215-1], esto es [-32768,
32767]
• int (4 bytes): número entero con signo. El estándar ANSI C especifica que este
tipo nunca ocupa menos que short ni más que long, que aparece más adelante. [-
231, 231-1], esto es [-2147483648, 2147483647]
• long (8 bytes): número entero largo con signo. [-263, 263-1], esto es [-
9223372036854775808, 9223372036854775807]
• float (4 bytes): número con parte decimal representado en punto flotante con
precisión simple (hasta 8 cifras decimales y 4 bytes). [1.17549e–38, 3.40282e+38]
• double (8 bytes): número con parte decimal representado en punto flotante con
precisión doble (hasta 16 cifras decimales y 8 bytes). [2.22507e-308,
1.79769e+308]
• char (1 byte): carácter del juego estándar de caracteres que puede ser con signo
o sin signo, dependiendo de la implementación. Consulte la macro CHAR_MIN del
archivo de cabecera . [-128, 127]
• void: del que no se pueden declarar variables. Este tipo se utiliza, por ejemplo,
para especificar que una función no acepta argumentos.
%[alineacion][anchura][.precision][longitud]tipo
• Longitud: un carácter o más que indican que el valor que se representa tiene un
tipo más largo o más corto que el especificado por el tipo (%hd, %ld, %lld). Algunos
modificadores son: hh, h, l, ll y L.
1.3 Operadores en C
Símbolo Significado
++ Incremento sufijo
-- Decremento sufijo
() Llamada a función
[] Elemento de tabla
-> Acceso a miembro desde un puntero
. Acceso a miembro
++ Incremento prefijo
-- Decremento prefijo
! Negación lógica
~ Complemento a uno
- Cambio de signo (operador unario)
+ Identidad (operador unario)
& Dirección
* Seguir un puntero (indirection en inglés)
Sizeof() Tamaño en bytes
(tipo) Conversión explícita de tipos
* Multiplicación
/ División
% Resto de la división entera
+ Suma
- Resta
<< Desplazamiento de bits a la izquierda
>> Desplazamiento de bits a la derecha
< Menor que
<= Menor o igual
> Mayor que
>= Mayor o igual
== Igual
!= Desigual
& Conjunción (Y) de bits
^ O exclusivo de bits
| O inclusivo de bits
&& Conjunción (Y) lógica
|| Disyunción (O) lógica
= Asignación simple
*=, /=, %=, +=, -=, <<=, >>=, &=, Asignaciones compuestas
^=, |=
?: Expresión condicional
, Separador de expresiones
2. Funciones
2.1 Main
Todo programa comienza por la función main, Ejem:
Int main(){
/*funciones a ejecutar*/
Return 0;
}
Int aa;
Scanf(“%d”, &aa);
Nota: a las variables tipo char, se les puede asignar caracteres directamente o en
ASCI. Ejem:
Char car;
Car=‘A’;
Car=65;
3.1 Macros
Se utiliza para establecer constantes, y para declararlas hay que utilizar #define.
Ejem:
#define pi 3,14
Int main(){
Int num;
Num= 5 * pi;
Return 0;
}
Typedef struct{
Char autor[30];
Char titulo[80];
Int fecha;
}Libro;
Int main(){
Libro novela;
Printf(“Introduzca la fecha del libro: “);
scanf(“%d”, &novela.fecha);
Return 0;
}
Nota: Igual que declaramos tablas de int, double o char, podemos declarar tablas de
tipos estructurados.
4. Instrucciones de control
4.1 Operadores relacionales o de igualdad
*Mirar tabla.
Switch:
Switch (variable){
Case dolares: /* o “case 1:” */
Instruciones;
Break;
Case yenes: /* o “case 2:” */
Instruciones;
Break;
Case libras: /* o “case 3:” */
Instruciones;
Break;
Default: /* es opcional */
Instrucciones si no es ninguna de las opciones;
While (condición){
Instrucciones;}
La sintaxis del bucle for es más complicada que la del bucle while pero podemos
traducirlo fácilmente a un bucle while equivalente.
5. Funciones y punteros
5.1 Funciones
Cuando una función necesita información para ejecutar sus instrucciones, esta
información se ha de pasar a través de sus argumentos, estos se guardan en
variables de nuestra función, no modifican las de main.
Ejem:
Double media (double x, double y){
Return (x+y)/2;}
Int main(){
double m;
m=media( 4, 6)
printf(“la media es: %.0lf”, m);
return 0;}
5.2 Punteros
Los punteros son un tipo de dato que va a jugar un papel clave en el paso de
información de las funciones. Apuntan a la dirección de memoria donde esta una
variable. Se definen de la siguiente manera: Int *p, double *p….
& es el operador que devuelve la dirección de una variable, y * el que devuelve el
valor al que apunta un puntero. Por tanto, si “p” apunta a la dirección de “numero”,
podemos decir que: *p= *&numero= numero y p= &numero.
Los punteros permiten que una función altere el valor de variables declaradas dentro
de otras funciones. Pasando la dirección donde esta la variable en vez de su valor.
Ejem:
Void incrementar( int *p){
(*p)++;}
Int main(){
Int num=2;
Incrementar(&num);
Printf(“%d%”, num); /*por pantalla se imprimiría un 3 */
Return 0;}
Los punteros también se pueden aumentar para que apunten a la siguiente dirección
de memoria, por ejemplo en tablas o cadenas:
Int main(){
Int tabla[3]={54,4,9};
Int *p;
P=&tabla[0];
P++;
Printf(“%d”, *p); /*estaríamos imprimiendo tabla[1]*/
Reuturn 0;}
Además, en las tablas y cadenas, para pasar el primer elemento, basta con pasarel
nombre sin especificar el elemento, ya que es un puntero al primero, por ejemplo, en
el ejemplo anterior seria: p=tabla.
Por último, si queremos acceder al valor de un dato estructurado, basta con poner
“flechitas” en vez de puntos. Por ejemplo si “p” es un puntero a fecha y queremos
acceder al valor de dia: fecha->dia.
#include <stdlib.h>
Int main(){
Int *tabla;
Tabla = (int*)malloc (3*sizeof(int));
If (tabla == NULL){
Printf(“Error al reservar memoria”);
Return 1;}
/*progama*/
Free(tabla);
Return 0;}
6. Archivos de texto
#include <stdlib.h>
Int main(){
FILE* f;
Int i;
Char nombre[20];
Double nota, media;
f=fopenf(“archivo.txt”, ”r”);
if (f==NULL){
printf(“Error abriendo el archivo”);
return 1;}
for (i=0; fscanf(f, “%s”, nombre); i++){
fscanf(f, “%lf”, ¬a);
media +=nota;}
printf(“La nota media es %.2lf”, media/i);
fclose (f);
return 0;
FILE *salida;
Salida=fopenf(“salida.txt”, “w”);
If (salida==NULL){
printf(“Error abriendo el archivo”);
return 1;}
fprintf (salida, “la nota media es %lf \n”, media/i);
fclose (salida);
7. Estructura de un programa
Compilación de programas en C:
Valgrind
Ayuda a la identificación de los errores más comunes en la gestión de memoria
dinámica como son: lagunas de memoria, errores en la liberación de punteros,
acceso a memoria del heap no reservada previamente o no inicializada.
Para analizar este programa bajo la herramienta Valgrind hay que seguir los
siguientes pasos:
1- Compilar con la opción –g: gcc –g programa.c –o programa
Otras funciones:
Strcmp (cadena caracteres 1, cadena caracteres 2 ): devuelve 0 si ambas cadenas
son iguales.
Atoi(): recive como argumento una cadena de caracteres y devuelve una variable
de tipo int. Ejemplo:
Char cadena []= “123” ;
Int num;
Num = atoi (cadena);
La función fgets
Se trata de una función que exige información sobre la longitud de la cadena en la
que queremos guardar los datos leídos. Los argumentos de fgets() son los
siguientes:
• El primer argumento es el nombre de la cadena de caracteres.
• La longitud de la cadena se pasa como segundo argumento.
• Para leer del teclado, el tercer argumento debe ser stdin.
fgets() lee caracteres hasta que encuentra un salto de línea o DIM – 1 caracteres (4
caracteres), lo que ocurra primero (puede leer los espacios). De esta forma se
asegura de que queda espacio para el carácter final de cadena.
Ejemplo:
#include <stdio.h>
#define DIM 5
int main () {
char nombre [DIM];
char * p;
printf ("Teclea tu nombre, por favor: ");
fgets(nombre, DIM, stdin);
printf ("Buenos días, %s.", nombre);
return 0; }
Si introduces Francisco Soria, te imprimiría: “Buenos días Fran.”
Función strtok
La primera vez que se llama a strtok hay que pasarle como primer argumento el
nombre de la cadena de caracteres que queremos partir. Las siguientes veces hay
que pasarle NULL. El segundo argumento de la función es siempre la lista de
delimitadores.
Si ya no quedan más subcadenas, strtok() devuelve un puntero nulo, es decir, NULL.
Ejemplo:
#include <stdio.h>
#include <string.h>
int main() {
char cadena[] = "subcadena 1;subcadena 2|subcadena tres";
char delimitadores[] = "|;";
char * p;
p = strtok(cadena, delimitadores);
while (p!=NULL){
printf("%s\n", p);
p = strtok(NULL, delimitadores);}
return 0;}