Escolar Documentos
Profissional Documentos
Cultura Documentos
Programacin en C
Estructura de un programa C.
Variables bsicas.
Operaciones arit. y lgicas
Sentencias de control.
Arrays y Strings.
Funciones.
Estructuras de datos.
Entrada/Salida bsica.
Ejemplos I.
Programacin en C
Modificadores de
mbito de las variables.
Punteros y memoria
dinmica.
Preprocesador C y
compilacin.
Libreras estndar.
Ejemplos II.
Programacin en C
Estructura de un programa en C
Funcin main():
Programacin en C
int main()
{
printf(Hola mundo!!\n);
return(0);
}
Estructura de un programa en C
Programacin en C
Estructura de un programa en C
Programacin en C
holamundo.c
Compilacin
Ejecucin
Programacin en C
Consideraciones sobre C
Caractersticas de C
Sensible a maysculas y minsculas: sum y Sum
Programacin en C
Caractersticas de C
Comentarios
Programacin en C
int main()
{
/* Esto es un comentario de varias
lineas.*/
return(0); //Comentario de una lnea
}
COMENTAR LOS PROGRAMAS
Programacin en C
11
Tipos de variables
Los tipos elementales de variables en C son:
Programacin en C
Variables bsicas
Enteros (int).
Reales (float, double).
Caracteres (char).
Punteros (*).
12
Programacin en C
13
Modificadores de tipos
Datos Enteros
Ejemplos:
unsigned int
signed char
long int (usualmente representado como long)
unsigned long int
Datos Reales
signed char
(char) [8bits]
unsigned char
signed int
(int) [32 bits]
unsigned int
(unsigned)
14
Programacin en C
Declaracin de variables
Identificadores
Nombre de una variable o funcin. Reglas
Declaracin simple:
char c;
unsigned int i;
Declaracin mltiple:
char c,d;
unsigned int i,j,k;
Declaracin y asignacin:
16
Llamada sizeof()
Ejemplos NO vlidos
1_valor, tiempo-total, dolares$, %final
Programacin en C
17
int a;
num_bytes_a = sizeof(a);
num_bytes_int = sizeof(unsigned int);
Programacin en C
15
18
Programacin en C
19
Expresiones constantes
El formato de las expresiones constantes es;
int x,y;
int main()
{
float x,z;
/* Aqu x y z son reales e y un entero */
}
20
Expresiones constantes
21
Expresiones constantes
Las constantes enteras se pueden representar en
diferentes bases numricas:
Programacin en C
ASCII 10
ASCII 9
ASCII 7
ASCII 13
ASCII 92
ASCII 39
ASCII 34
ASCII 0
Base octal:
\101 (para el carcter A)
0210 (comienza por cero).
char c='A', d='\x41', e='\101', f=0x41, g=0101, h=65; Todo A
Programacin en C
22
Programacin en C
23
int a;
float b;
char c;
b=65.0;
a=(int)b;
c=(char)a;
En las asignaciones
/* a vale 65 */
/* c vale 65 (Cdigo ASCII
de A) */
Programacin en C
Programacin en C
25
Punteros
Punteros
/* px es un puntero a entero e y
un entero */
26
Programacin en C
Programacin en C
Punteros
int main()
{
int *px,y=3;
Punteros
Direccin Contenido
px-> 35:
y -> 39:
?
0
?
0
?
0
px=&y;
/* px apunta a y */
px-> 35:
y -> 39:
0
0
0
0
0 39
0 3
*px=5;
/* y vale 5 */
px-> 35:
y -> 39:
0
0
0
0
0 39
0 5
?
3
Grfica
px
?
px
39
px
39
y
3
p = &34; //
p =&(i+1);//
&i = p;
//
//
p = 17654;//
//
y
3
y
5
}
Programacin en C
28
29
Aritmtica de punteros
void *px,v;
Punteros
int
*p;
//
float *q;
//
void *r;
//
p = q;
//
p = (int *) q; //
p = r = q;
//
27
30
31
Operaciones aritmticas
El operador de asignacin es el igual (=).
Los operadores aritmticos son:
Programacin en C
Suma (+)
Resta (-)
Multiplicacin (*)
Divisin (/)
Mdulo o resto de la divisin entera (%)
Slo aplicable a operandos entero: 24 % 3 es 3.
32
Programacin en C
Programacin en C
Operaciones aritmticas
Expresiones
33
Conjunto de variables/constantes/expresiones
relacionadas mediante operandos
entero
real
real
real
Programacin en C
34
Programacin en C
Pre/post-incrementos
Operaciones de asignacin
a+=3;
/* Equivalente a a=a+3 */
a*=c+d; /* Equivalente a a=a*(c+d) */
a/=a+1; /* Equivalente a a=a/(a+1) */
35
a=(int)(x/2.34);
36
Programacin en C
37
Operadores de comparacin
Operadores lgicos
Igual (==)
Distinto (!=)
Mayor (>) y Mayor o igual (>=)
Menor (<) y Menor o igual (<=)
Ejemplo
a=(3>2 || 5==4) && !1 /* Falso */
Programacin en C
Programacin en C
Asociatividad
( ) [ ] -> .
<=
>
==
!=
+=
>=
||
*=
/=
~ Complemento a 1 (not)
Programacin en C
40
Operadores de Bit
41
00010000 x = 16
00110011 y = 51
00100011 z = 35
11001111 w = 207
00001100 t = 12
10011000 s = 152
Programacin en C
Programacin en C
char a=48;
00110000 a
char b=19;
00010011 b
char x,y,z,w,t,s;
x=a & b;
y=a | b;
z=a ^ b;
w=~a;
t=a>>2;
s=b<<3;
&&
-=
?:
=
Operadores de Bit
ES 11!!
Precedencia
39
42
Programacin en C
43
Sentencias
Las sentencias contienen expresiones
Expresiones aritmticas, lgicas o generales.
Tipos de sentencias
Programacin en C
Sentencias de control
Programacin en C
if
if ... else
int main()
{
int a=3,b;
if(a>2)
{
b=100+a;
printf(parte if);
}
45
Programacin en C
int main()
{
int a=3,b;
a>2
if(a>2)
{
b=100+a;
printf(parte if);
}
else
printf(parte else);
<if>
a>2
<else>
<if>
}
46
Programacin en C
if(a>2)
<if>
{
printf(parte if);
}
else if (a>0)
printf(parte else if);
else
printf(parte else);
a>2
if anidados
int main()
{
int a=3,b;
<if>
0
<else>
a>2
a>4
1
<if2>
0
<else>
Programacin en C
if(a>2)
printf(parte if);
if (a>4)
printf(parte if2);
else
printf(parte else);
a>0
1
47
Programacin en C
48
Programacin en C
49
Operador ?
while
i=0
int main()
{
int i=0,ac=0;
int main()
{
int a,b=4,c=5;
i<100
while(i<100)
{
printf(%d,i*i);
ac+=i;
i++;
}
a=b>0 ? c : c+1;
/* Equivalente a
if(b>0)
a=c;
else
a=c+1; */
for
i=0
for(i=0;i<100;i++)
{
printf(%d,i*i);
ac+=i;
}
i++
printf(%d,i*i);
ac+=i;
i++;
}
while(i<100);
i<100
int main()
{
int i;
float pe, a[100], b[100];
2
i<100
<while>
Sintaxis:
for(inicializacin;condicin_permanencia;incremento)
Programacin en C
53
i=0
3
i++
<for>
Programacin en C
2
i<100
Sintaxis: 1
3
2
for(inicializacin;condicin_permanencia;incremento)
52
Programacin en C
3
i++
i=0
int main()
{
int i,ac=0;
<do>
do
{
51
Programacin en C
do ... while
int main()
{
int i=0,ac=0;
<while>
50
Programacin en C
i++
54
1
3
4
2
7
5
6
3
5
8
3
9
1
2
3
1
55
break y continue
switch
int main()
{
int i;
for(i=0;i<100;i++)
{
if(i%2==0)
continue;/*Comienza la sig. iter.*/
if(i%17==0)
break;
/*Sale del bucle*/
printf(%d,i);
}
56
}
Programacin en C
switch(ch)
{
case A: printf(A);
break;
case B:
case C: printf(B o C);
case D: printf(B, C o D);
break;
default: printf(Otra letra);
}
Programacin en C
57
Definicin de Arrays
La definicin de una variable de tipo array (vector) se
realiza indicando la dimensin entre corchetes:
Programacin en C
Arrays y Strings
Programacin en C
58
Indexacin de arrays
int a[6];
a[0]=23;
a[3]=a[0]+5;
for(i=0;i<6;i++) printf(%d,a[i]);
// No se puede operar con el array entero
// Por ejemplo a=23; MAL
23
59
Programacin en C
28
60
Programacin en C
61
10
Strings
Asignacin de Strings
char x[20],n[50]=Chema;
/*equivalente a
char n[50]={C,h,e,m,a,\0}*/
char n[50]=Chema;
n=Otro nombre;
\0
Carcter
nulo
62
Programacin en C
Arrays y punteros
Programacin en C
/* Correcto */
/* Error: no es
declaracin */
char v[]=Coleccin;
char *p ;
p=v; //char *p=v;
a 10 20 30 40 50
pb
pc
*(p+2)
a 11 20 30 40 50
pb
pc
v C o l e c c i n \0
a 11 20 30 44 50
pb
for(p=v;*p;p++)
{
printf(%c,*p)
}
pc
v[7]
Programacin en C
64
65
Resumiendo
int
for
for
for
for
Programacin en C
suma, i, *p;
suma=0; i<n; i++) suma += a[i] // 1
suma=0; i<n; i++) suma += *(a+i) // 2
i=0, suma=0; i<n; i++) suma += p[i] // 3
suma=0; p<&a[n]; p++) suma += *p // 4
Programacin en C
66
67
11
Aritmtica de Punteros
Las operaciones de suma o resta sobre punteros
modifican el valor del dependiendo del tipo del puntero:
Programacin en C
int*
p_int; char* p_char; (p_int=p_char;)
p_int++; /* Suma sizeof(int) */
p_char++; /* Suma sizeof(char) */
++
Funciones
p_char + 1
p_char
3F0 3F1 3F2 3F3
p_int
++
sizeof(int)=4
p_int + 1
68
Programacin en C
Programacin en C
Header
(Cabecera)
71
Funcin de ejemplo
Programacin en C
72
Declaracin de funciones
Para poder hacer uso de una funcin es necesario que
sta est definida o declarada con antelacin.
int factorial(int n)
{
int ret=1;
while (n>1)
ret*=n--;
return(ret);
}
int main()
{
printf(%d!=%d\n,5,factorial(5));
}
Programacin en C
70
Programacin en C
73
Programacin en C
74
12
/* Prototipo */
int main()
{
printf(%d!=%d\n,5,factorial(5));
}
int factorial(int n)
{
...
}
/* Definicin */
int x=2,y=2;
reiniciar(&x,y); /* x valdr 0 e y 2 */
75
Programacin en C
Programacin en C
76
y 2
x 2
y 2
b 2
x 0
y 2
b 0
Programacin en C
Programacin en C
78
Tipos de estructuras
El lenguaje C tiene tres tipos de estructuras de datos:
Registro o estructura (struct).
Unin de campos (union).
Tipo enumerado (enum).
Programacin en C
Estructuras de datos
Programacin en C
79
Programacin en C
80
13
struct
struct
Un struct es un tipo de datos complejo conformado
por un conjunto de campos de otros tipos (bsicos o
complejos) asociados a un identificador:
struct [etiqueta]
{
tipo campo;
tipo campo;
...
};
struct persona
{
char nombre[20];
int
edad;
float peso;
} yo,tu,ellos[10];
struct persona el={Antonio Lpez,31,80};
struct persona *ella, todos[20];
Programacin en C
81
struct
union
Un union es similar a un struct, pero todos los
campos comparten la misma memoria.
struct datos
{
int a,b;
int x[2];
char c;
} d;
82
Programacin en C
83
d.a
d.b
d.x[0]
d.x[1]
d.c
union datos
{
int a,b;
int x[2];
char c;
} d;
d.a
d.x
d.b
d.c
Programacin en C
84
Uso de union
Estructuras y funciones
struct empleado
Los union se usan para
diferentes representaciones de {
char nombre[40];
los datos o para informacin
int tipo_contrato;
condicionada:
union
{
int integer;
char oct[4];
} data;
union
{
int nomina;
int pts_hora;
} sueldo;
} p;
Programacin en C
85
Programacin en C
86
14
enum
Programacin en C
87
Programacin en C
88
Funciones de entrada/salida
Las funcionalidades de entrada/salida en C no
pertenecen a las palabras reservadas del lenguaje.
Son funciones de librera, por ejemplo:
Programacin en C
Entrada: scanf().
Salida: printf().
Entrada/salida bsica
Programacin en C
89
Programacin en C
90
printf()
printf()
El formato de llamada de printf()es:
Ejemplo:
int a=3;
float x=23.0;
char c=A;
printf(Hola mundo!!\n);
donde:
format : Es el string de formato de salida de los datos.
expi : Es la expresin a incluir dentro del formato.
Programacin en C
91
Programacin en C
92
15
printf()
Formato
Expresin Resultado
%d %i
%u
%o
%x %X
%f
%e %E %g %G
%c
%p
%s
%ld %lu ...
entero
entero
entero
entero
real
real
carcter
puntero
string
entero largo
printf()
Otras opciones de formato:
Programacin en C
93
Programacin en C
scanf()
scanf()
Ejemplo
int a,*pa;
float x;
char c;
donde:
format : Es el string de formato de entrada de los datos.
diri : Es la direccin donde se almacena el resultado.
Programacin en C
94
95
96
Programacin en C
scanf(%s,pc); /* PELIGROSO */
Ejemplos I
97
Programacin en C
98
16
Ejemplos I-1
Programacin en C
99
printf(Mnimo:\n);
imprimir_empleado(&emp[min]);
printf(Mximo:\n);
imprimir_empleado(&emp[max]);
printf(Media:%9.2f\n,
med);
return(0);
min=buscar_min(emp,10);
max=buscar_max(emp,10);
med=buscar_med(emp,10);
Programacin en C
101
*pe);
es[],
tam);
es[],
tam);
es[],
tam);
*pe);
Programacin en C
102
void leer_empleado
(empleado_t *pe)
{
printf("Nombre y Apellidos: ");
scanf("%s %[^\n]",
pe->nombre,pe->apellidos);
printf("NIF: ");
scanf("%s",pe->nif);
printf("Sueldo: ");
scanf("%ld",&pe->sueldo);
printf("-------------\n");
}
Programacin en C
100
Programacin en C
int
buscar_min
(empleado_t es[],
int
tam)
{
int candidato=0,i;
for(i=1;i<tam;i++)
if(es[i].sueldo<es[candidato].sueldo)
candidato=i;
return(candidato);
}
103
Programacin en C
104
17
buscar_max
(empleado_t es[],
int
tam)
float buscar_med
(empleado_t es[],
int
tam)
{
int candidato=0,i;
int i;
float acc=0;
for(i=0;i<tam;i++)
acc+=(float)es[i].sueldo;
return(acc/(float)tam);
for(i=1;i<tam;i++)
if(es[i].sueldo>es[candidato].sueldo)
candidato=i;
return(candidato);
}
Programacin en C
105
Programacin en C
106
Programacin en C
107
Modificadores de Variables
Modificadores de mbito
Programacin en C
108
Modificadores de Variables
Programacin en C
109
110
18
void cuenta()
Salida:
{
static int cnt=0;
0
printf(%d\n,cnt++)
1
2
}
3
int main()
{
cuenta();cuenta();cuenta();cuenta();
return 0;
}
Programacin en C
Modificadores de Funciones
Modificadores de Funciones
Fichero1.c
Fichero2.c
compilacin
compilacin
compilacin
compilacin
Fichero1.o
Fichero2.o
aux
Impl
aux
Impl GG
func
func Impl
Impl LL
aux
Undef
aux
Undef
func
func Undef
Undef
main
Impl
main Impl GG
Fichero1.c:
static void func()
{
...
}
void aux()
{
func();
}
Fichero2.c:
extern void aux();
int main()
{
aux();
func(); /* NO
VISIBLE */
}
Programacin en C
114
Modificadores de Funciones
inline int max(int a, int b)
{
if(a>b)
{
return a;
if(x+1>y)
else
x=x+1;
else
return b;
x=y;
}
}
....
x=max(x+1,y);
enlace
enlace
EJECUTABLE
Programacin en C
112
Modificadores de Funciones
Programacin en C
Programacin en C
115
Programacin en C
116
19
Punteros a Funciones
Mecanismo para pasar funciones como argumento:
char (*f)(int,int);
Programacin en C
Punteros y Memoria Dinmica
Programacin en C
Punteros a Funciones
Punteros a Funciones
int main()
{
char *palabras[]={hola,casa,perro,
coche,rio};
printf(Menor:%s,
menor(palabras,5,alfabetico));
return 0;
}
int alfabetico(char* a,char* b)
{ .... }
119
120
Programacin en C
Memoria Dinmica
Memoria Dinmica
118
Programacin en C
int
int*
char*
Esttica
a,b[2];
i;
c;
Dinmica
a
b[0]
b[1]
i
c
i=(int*)malloc(sizeof(int));
c=(char*)malloc(sizeof(char));
a
b[0]
b[1]
i
c
*i
*c
free(i);
a
c=(char*)realloc(c,sizeof(char)*9); b[0]
b[1]
i
c
121
Programacin en C
*c
122
20
Fase de Compilacin
.c
Programacin en C
Preprocesamiento
Fichero Fuente
.c
Compilacin
Enlazado
Preprocesador y Compilacin
E
EX
Fichero Ejecutable
Programacin en C
123
.s
Paso a Ensamblador
Ensamblar
.o
.o
.o
.o
.o
.a
Libreras
Programacin en C
124
Constantes y Macros
Programacin en C
125
Constantes y Macros
126
Constantes y Macros
Tras la fase de prerpocesamiento
#define PI
3.14
#define NUM_ELEM 5
#define AREA(rad) PI*rad*rad
#define MAX(a,b) (a>b ? a : b)
int main()
{
int
i;
float vec[NUM_ELEM];
for(i=0;i<NUM_ELEM;i++)
vec[i]=MAX((float)i*5.2,AREA(i));
}
Programacin en C
Programacin en C
int main()
{
int
i;
float vec[5];
for(i=0;i<5;i++)
vec[i]=((float)i*5.2>3.14*i*i ?
(float)i*5.2 :
3.14*i*i);
}
127
Programacin en C
128
21
Inclusin de Ficheros
Inclusin de Ficheros
int
int func1(int
func1(int a);
a);
void
void func2();
func2();
fich.c
Preprocesamiento
int
int main()
main()
{{ ...}
...}
Programacin en C
130
Sentencias Condicionales
#ifdef variable
<bloque de sentencias>
...
#endif
#ifndef variable
<bloque de sentencias>
...
#endif
#ifndef _AUX_H_
#define _AUX_H_
<definiciones>
#endif
#define DEBUG
int main()
{
int i,acc;
for(i=0;i<10;i++)
acc=i*i-1;
#ifdef DEBUG
printf(Fin bucle acumulador: %d,acc);
#endif
return 0;
}
132
133
Programacin en C
Enlace de Ficheros
extern int v;
int main() {.h().}
extern void k();
static h() {.k().}
Evita la redefinicin de
funciones y variables
.c
gcc -c
#include aux.h
#include aux.h
int main()
{
...
}
Programacin en C
131
Programacin en C
Ejemplo: Depuracin
Programacin en C
3A00: f
3A08: main
3B12: h
v <undef>
k <undef>
Compilacin
.o
.c
gcc -c
1600: k
17FF: l
1812: v
.o
gcc -o
Enlace
E
EX
134
Programacin en C
135
22
Manejo de Cadenas
Programacin en C
Libreras Estndar
Programacin en C
char*
char*
int
char*
char*
int
char*
char*
...
136
Programacin en C
Manejo de Buffers
void* memcpy(void*,void*,int): Copia memoria.
void* memmove(void*,void*,int): Copia memoria.
int
memcmp(void*,void*,int): Compara memoria.
void* memset(void*,int,int): Rellena memoria.
void bzero(void*,int): Pone a cero la memoria.
void bcopy(void*,void*,int): Copia memoria.
void* memccpy(void*,void*,int,int): Copia
memoria hasta que encuentra un byte.
...
138
Ficheros Especiales
int
int
int
int
int
char*
FILE*
int
int
int
139
Ordenacin y Bsqueda
void* bsearch(void*,void*,int,int,
int (*)(void*,void*)):
Bsqueda binaria sobre lista ordenada.
void qsort(void*,int,int,
int (*)(void*,void*)):
fprintf(stdout,Usuario: );
fscanf(stdin,%s,usr);
fprintf(stderr,Error:No vlido);
Programacin en C
137
Entrada Salida
Programacin en C
140
char *vec[10]={casa,.....};
qsort((void*)vec,10,sizeof(char*),strcmp);
Programacin en C
141
23
Conversin de Tipo
Funciones Matemticas
int
atoi(char*): Traduce de string a entero.
long
atol(char*): Traduce de string a un entero largo.
double atof(char*): Traduce de string a real.
long
strtol(char*,char**,int): Traduce de array a
entero (en diferentes bases).
double strtod(char*,char**): Traduce de array a real.
char* itoa(char*,int): Traduce un entero a array.
Programacin en C
142
double
double
double
double
double
double
double
double
double
...
143
Programacin en C
Programacin en C
Estudiar la pgina del manual (man 3 sprintf).
Incluir en el fichero fuente el fichero de cabecera
adecuado (#include <stdio.h>).
Enlazar la librera si es necesario (gcc .... -lm).
Programacin en C
144
Argumentos de main
145
Programacin en C
Argumentos de main
Programacin en C
argv[0]
argv[1]
argv[2]
argv[3]
argv[4]
146
pr
un
do
tr
cu
Programacin en C
o g \0
o \0
s \0
e s \0
a t r o \0
147
24
Argumentos de main
int main(int argc, char* argv[])
{
int i=0;
printf(Ejecutable: %s\n,argv[0]);
for(i=0;i<argc;i++)
printf(Argumento[%d]: %s\n,i,argv[i]);
return 0;
}
Programacin en C
148
25