CursoC II a2
-
Upload
ricardo-jamaica -
Category
Documents
-
view
219 -
download
0
Transcript of CursoC II a2
-
7/25/2019 CursoC II a2
1/25
1
Programacin en C 1
Programacin en C
DATSI, FI, UPM
Jos M. Pea
(Segunda Parte)
Programacin en C 2
ndice
Estructura de un programa C.
Variables bsicas.
Operaciones aritmticas.
Sentencias de control.
Arrays y Strings. Funciones.
Estructuras de datos.
Entrada/Salida bsica.
Ejemplos I.
Modificadores dembito de las variables.
Punteros y memoriadinmica.
Operadores de bit. Preprocesador C y
compilacin.
Libreras estndar.
Ejemplos II.
-
7/25/2019 CursoC II a2
2/25
2
Programacin en C 3
Programacin en C
Modificadores de mbito
Programacin en C 4
Modificadores de Variables
La declaracin de variables acepta los siguientesmodificadores: static (Local): El valor de la variable se conserve entre
llamadas. Comportamiento similar a una variable global. register : La variable es almacenada siempre (si es
posible) en un registro de la CPU (no en memoria). volatile : Un proceso exterior puede modificar la
variable. const : La variable no puede ser modificada.
-
7/25/2019 CursoC II a2
3/25
3
Programacin en C 5
Modificadores de Variables
int una_funcion(int a, int b)
{
static char last;
register int i;
const int max=12;
volatile long acc;
....
}
Programacin en C 6
Modificadores de Variables (static)
void cuenta()
{
static int cnt=0;
printf(%d\n,cnt++)
}
int main()
{
cuenta();cuenta();cuenta();cuenta();
return 0;
}
Salida:
01
23
-
7/25/2019 CursoC II a2
4/25
4
Programacin en C 7
Modificadores de Variables (const)
const int max=10;
int letra(const char* text, char l)
{
int i,acc=0;
for(i=0;i
-
7/25/2019 CursoC II a2
5/25
5
Programacin en C 9
Modificadores de Funciones
Fichero1.c:
static void func()
{
...
}
void aux()
{
func();
}
Fichero2.c:
extern void aux();
int main()
{
aux();
func(); /* NO
VISIBLE */
}
Programacin en C 10
Modificadores de Funciones
Fichero1.c
compilacincompilacin
Fichero1.o
aux Impl G
func Impl L
aux Impl G
func Impl L
enlaceenlace
Fichero2.c
compilacincompilacin
Fichero2.o
aux Undef
func Undef
main Impl G
aux Undef
func Undef
main Impl G
EJECUTABLE
-
7/25/2019 CursoC II a2
6/25
6
Programacin en C 11
Modificadores de Funciones
inline int max(int a, int b)
{
if(a>b)
return a;
else
return b;
}
....
x=max(x+1,y);
{if(x+1>y)
x=x+1;else
x=y;}
Programacin en C 12
Programacin en C
Punteros y Memoria Dinmica
-
7/25/2019 CursoC II a2
7/25
7
Programacin en C 13
Aritmtica de Punteros
Las variables de tipo puntero soportan ciertasoperaciones aritmticas.char v[]=Coleccin;
char *p=v;
C o l e c c i n \0v
v[7]
*(p+2)
for(p=v;*p;p++){printf(%c,*p)
}
Programacin en C 14
Aritmtica de Punteros
Las operaciones soportadas sobre punteros son: Suma y resta de valores enteros (+,-,++ y --).
Comparacin y relacin (,=,== y !=). Valor booleano (comparacin conNULL).
void copiar(char* dest, const char* orig)
{
if(orig && dest)
while(*orig)
*dest++=*orig++;
}
-
7/25/2019 CursoC II a2
8/25
8
Programacin en C 15
Aritmtica de Punteros
Las operaciones de suma o resta sobre punterosmodifican el valor del dependiendo del tipo del puntero:int* p_int; char* p_char; p_int=p_char;
p_int++; /* Suma sizeof(int) */
p_char++; /* Suma sizeof(char) */
p_int
3F0
p_int + 1++sizeof(int)=4
3F1 3F2 3F3 3F4 3F5 3F6 3F7 3F8 3F9 3FA 3FB
p_char ++
p_char + 1
Programacin en C 16
Punteros a Funciones
Mecanismo para pasar funciones como argumento:char (*f)(int,int);
f es un puntero a una funcin que devuelve unchar yrecibe dos enteros como argumento.
A un puntero a funcin se le puede asignar como valorcualquier identificador de funcin que tenga los mismosargumentos y resultado.
-
7/25/2019 CursoC II a2
9/25
9
Programacin en C 17
Punteros a Funciones
char* menor (char** text,
int tam,
int (*compara)(char*,char*))
{
int i;
char* min=text[0];
for(i=1;i
-
7/25/2019 CursoC II a2
10/25
10
Programacin en C 19
Memoria Dinmica
Adems de la reserva de espacio esttica (cuando sedeclara una variable), es posible reservar memoria deforma dinmica.
Funciones de gestin de memoria dinmica: void* malloc(size_t): Reserva memoria
dinmica. free(void*): Libera memoria dinmica.
void* realloc(void*,size_t): Ajusta elespacio de memoria dinmica.
Programacin en C 20
Memoria Dinmica
int a,b[2];
int* i;
char* c;
i=(int*)malloc(sizeof(int));
c=(char*)malloc(sizeof(char));
free(i);
c=(char*)realloc(c,sizeof(char)*9);
ab[0]
ic
b[1]
ab[0]
ic
b[1]
a
b[0]
ic
b[1]
*c*i
*c
Esttica Dinmica
-
7/25/2019 CursoC II a2
11/25
11
Programacin en C 21
Programacin en C
Operadores deBit
Programacin en C 22
Operadores de Bit
Adems de los operadores aritmticos y booleanosexisten operadores numricos a nivel debit:
AND: & OR: |
XOR:
NOT: ~
Desplazamientos: >
-
7/25/2019 CursoC II a2
12/25
12
Programacin en C 23
Operadores de Bit
char a=48;
char b=19;
char x,y,z,w,t,s;
x=a & b;
y=a | b;
z=a ^ b;w=~a;
t=a>>2;
s=b
-
7/25/2019 CursoC II a2
13/25
13
Programacin en C 25
Programacin en C
Preprocesador y Compilacin
Programacin en C 26
Fase de Compilacin
.c.c
Fichero Fuente
Preprocesamiento .c.c Paso a Ensamblador .s.s
.o.o
EnsamblarCompilacin
.o.o.o.o.o.o.o.oEXEEXE
Enlazado
.a.aLibreras
Fichero Ejecutable
-
7/25/2019 CursoC II a2
14/25
14
Programacin en C 27
Directrices del Preprocesador
Son expandidas en la fase de preprocesado: #define : Define una nueva constante o macro del
preprocesador. #include : Incluye el contenido de otro fichero.
#ifdef #ifndef : Preprocesamiento condicionado.
#endif : Fin de bloque condicional.
#error : Muestra un mensaje de error
Programacin en C 28
Constantes y Macros
Permite asociar valores constantes a ciertosidentificadores expandidos en fase depreprocesamiento:#definevar i ab l ev al or
Define funciones que son expandidas en fase depreprocesamiento:#definemac r o(a r gs, . . .) f unc i n
-
7/25/2019 CursoC II a2
15/25
15
Programacin en C 29
Constantes y Macros
#define PI 3.14
#defineNUM_ELEM 5
#defineAREA(rad) PI*rad*rad
#defineMAX(a,b) (a>b ? a : b)
int main()
{
int i;float vec[NUM_ELEM];
for(i=0;i
-
7/25/2019 CursoC II a2
16/25
16
Programacin en C 31
Macros vs Funciones
int func_max(int a, int b)
{ return (a>b ? a : b); }
#definemacro_max(a,b) (a>b ? a : b)
int a=2,b=3,max;
max=func_max(a++,b--);
max
3
a
3
b
2
Usando funciones
max=macro_max(a++,b--);
max
2
a
3
b
1
Usando macros
Programacin en C 32
Inclusin de Ficheros
Los prototipos de las funciones usadas por variosficheros fuente se suelen definir en fichero de cabecera.#include Cabeceras del sistema.
#include mis_func.h Ficheros de cabecera locales.
#include aux.hint main(){ ...}
#include aux.hint main(){ ...}
fich.c
int func1(int a);viod func2();
int func1(int a);viod func2();
aux.h
int func1(int a);viod func2();
int main(){ ...}
int func1(int a);viod func2();
int main(){ ...}Preprocesamiento
-
7/25/2019 CursoC II a2
17/25
17
Programacin en C 33
Inclusin de Ficheros
La inclusin de ficheros esta sujeta a las siguientesrecomendaciones:
Por lo general los ficheros de cabecera tienen comoextensin .h
En los ficheros de cabecerano se incluyenimplementacin de funciones
Las variables en un fichero de cabecera sondeclaradasextern y se encuentran declaradas en algn otrofichero.c
Programacin en C 34
Sentencias Condicionales
Para incluir cdigo cuya compilacin es dependiente deciertas opciones, se usan los bloques:#ifdefv ar i ab l e
. . .
#endif
#ifndefvar i ab l e
. . .
#endif
-
7/25/2019 CursoC II a2
18/25
18
Programacin en C 35
Ejemplo: Depuracin
#define DEBUG
int main()
{
int i,acc;
for(i=0;i
-
7/25/2019 CursoC II a2
19/25
19
Programacin en C 37
Enlace de Ficheros
.c.cextern int v;int main() {.h().}extern void k();static h() {.k().}
.c.cint k() {.l().}int l() {...}int v;
.o.o3A00: f3A08: main3B12: hv
k
.o.o1600: k17FF: l1812: v
EXE
EXE
gcc -cgcc -c
gcc -o
Compilacin
Enlace
Programacin en C 38
Programacin en C
Libreras Estndar
-
7/25/2019 CursoC II a2
20/25
20
Programacin en C 39
Manejo de Cadenas
char* strcat(char*,char*): Concatena cadenas.
char* strchr(char*,char): Busca un carcter.
int strcmp(char*,char*): Comparacin de cadenas.
char* strcpy(char*,char*): Copia cadenas.
char* strdup(char*): Duplica una cadena.
int strlen(char*): Longitud de una cadena.
char* strncpy(int,char*,char*): Copia cadenas.
char* strncat(int,char*,char*): Concatena.
...
Programacin en C 40
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): Copiamemoria hasta que encuentra un byte.
...
-
7/25/2019 CursoC II a2
21/25
21
Programacin en C 41
Entrada Salida
int fprintf(FILE*,...): Salida sobre fichero.
int fscanf(FILE*,...): Entrada desde fichero.
int sprintf(char*,...): Salida sobre un buffer.
int sscanf(char*,...): Entrada desde un buffer.
int fgetc(FILE*): Lee un carcter desde fichero.
char* fgets(char*,int,FILE*): Lee una lnea.
FILE* fopen(char*,char*): Abre un fichero.
int fclose(FILE*): Cierra un fichero.
int fflush(FILE*): Descarga un buffer de fichero.
int feof(FILE*): Indica si ha finalizado un fichero.
Programacin en C 42
Ficheros Especiales
Existen tres variables de tipo FILE* asociados a tresficheros estndar:
stdin: Entrada estndar. stdout: Salida estndar.
stdout: Salida de error estndar.
fprintf(stdout,Usuario: );
fscanf(stdin,%s,usr);
fprintf(stderr,Error:No vlido);
-
7/25/2019 CursoC II a2
22/25
22
Programacin en C 43
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*)):
Ordenacin mediante el algoritmo quicksort .
char *vec[10]={casa,.....};
qsort((void*)vec,10,sizeof(char*),strcmp);
Programacin en C 44
Conversin de Tipo
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 arraya real.
char* itoa(char*,int): Traduce un entero a array.
Como alternativa se pueden usar las funciones:
sscanf y sprintf.
-
7/25/2019 CursoC II a2
23/25
23
Programacin en C 45
Funciones Matemticas
double exp(double): Calcula ex.
double log(double): Calcula el logaritmo natural.
double log10(doubel): Calcula el logaritmo en base 10.
double pow(double,double): Calcula xy.
double sqrt(double): Calcula la raz cuadrada.
double sin(double): Calcula el seno (en radianes).
double cos(double): Calcula el coseno (en radianes).
double sinh(double): Calcula el seno hiperblico.
double atan(double): Calcula el arco tangente.
...
Programacin en C 46
Uso de Funciones de Librera
El uso de las funciones de librera estndar esta sujetoa las siguientes recomendaciones:
Estudiar la pgina del manual (man 3 sprintf
).
Incluir en el fichero fuente el fichero de cabeceraadecuado (#include ).
Enlazar la librera si es necesario (gcc .... -lm).
-
7/25/2019 CursoC II a2
24/25
24
Programacin en C 47
Programacin en C
Argumentos del Programa
Programacin en C 48
Argumentos demain
La funcin principalmain puede recibir argumentosque permiten acceder a los parmetros con los que esllamado el ejecutable.
int main(int argc, char* argv[])
int argc : Nmero de parmetros.
char* argv[] : Parmetros del ejecutable.
-
7/25/2019 CursoC II a2
25/25
Programacin en C 49
Argumentos demain
$ gcc prog.c -o prog
$ prog uno dos tres cuatro
int main(int argc, char* argv[])argc=5
argv[0]
argv[1]argv[2]argv[3]argv[4]
p r o g \0
u n o \0d o s \0
t r e s \0
c u a t \0r o
Programacin en C 50
Argumentos demain
int main(int argc, char* argv[])
{
int i=0;
printf(Ejecutable: %s\n,argv[0]);
for(i=0;i