lenguaje C
Indice
Funciones
Tablas y punteros
Cadenas de caracteres
El computador
dest,src
dest,src
dest
dest,src
; m = x1
; m = m+x2 = x1+x2
; m = m+x3 = x1+x2+x3
; m = m/3 = (x1+x2+x3)/3
2
El computador
Codificacin de datos
Una misma cantidad (ej. 23) se puede expresar en mltiples
sistemas de numeracin:
101 100
Codificacin ponderada en base 10 (decimal):
Nmeros romanos:
2 3
XXIII
24 23 22 21 20
10111
23
18
+ 10010
10111
41
101001
Misma cantidad expresada
en sistemas de numeracin diferentes
El computador
01101100
00101110
11111100
...
Inst1:
Inst2:
11101100
MOV X,3
01101101
MOV Z,X
Inst3:
11101011
ADD Z,Y
...
X:
Y:
Z:
00000000
0
00000111
7
00000010
2
Instrucciones codificadas
en binario
Datos codificados en
binario
...
El computador
<
CMP dest,src
Flags
; [ZF, CF,OF,SF]= (dest- src)
JIFLE Inst1
0?
El computador
y=x!:
Bucle:
MOV y , 1
MOV n , x
MUL y , n
SUB n , 1
CMP n , 1
JIFG Bucle
;y=1
;n=x
;y=y*n
;n=n-1
; [ZF,CF,] = (n 1) { >, , <, } 0
; Si el resultado fue >, salta a Bucle
El computador
SUB
n,1
El computador
El computador
Ms informacin:
Presentacin ms detallada (con animaciones) del
funcionamiento interno del computador:
http://isa.uniovi.es/~ialvarez/Curso/descargas/Funcionamiento%20Computador.pps
Ensamblador
Lenguaje C
MOV
ADD
ADD
ADD
DIV
m=(x1+x2+x3+x4)/4;
m,x1
m,x2
m,x3
m,x4
m,4
11
Declaraciones previas:
#include, #define, etc.
Dentro de main() { }:
Declaracin de las variables con sus tipos.
Cdigo para obtener datos de partida del
exterior (teclado, archivo, sensor, ).
Cdigo para procesar los datos.
Cdigo para enviar datos resultado hacia el
exterior (pantalla, archivo, accionador, ).
expresin se termina en ;
#include <stdio.h>
#include <stdlib.h>
#define N 4
main()
{
int x1,x2,x3,x4; // Datos
float m; /* Media */
printf("Introduzca
scanf("%d",&x1);
printf("Introduzca
scanf("%d",&x2);
printf("Introduzca
scanf("%d",&x3);
printf("Introduzca
scanf("%d",&x4);
x1: ");
x2: ");
x3: ");
x4: ");
m=(x1+x2+x3+x4)/N;
printf("La media es %f\n",m);
}
12
%d: entero
%f: real (float)
%c: carcter
%s: cadena de caracteres
Ejemplo:
Resultado en pantalla:
int alumnos;
Hay 12 alumnos, nota media 7.25
float nota_media;
_
alumnos=12;
nota_media=7.25;
printf("Hay %d alumnos, nota media %f\n",alumnos,nota_media);
13
Ejemplo:
int alumnos;
float nota_media;
printf("Introduzca alumnos y nota media: ");
scanf("%d%f",&alumnos,¬a_media);
printf("Hay %d alumnos, nota media %f\n",alumnos,nota_media);
14
Ejercicios propuestos
1)
2)
3)
4)
5)
6)
(http://es.wikipedia.org/wiki/Congruencia_de_Zeller).
NOTAS: Algunas operaciones matemticas en C (incluir <math.h>)
x2 = x*x
= sqrt(x)
Operaciones trigonomtricas: sin(x),cos(x),tan(x),atan(x)
Divisin entera. Cociente = a/b ; Resto = a%b
15
Indice
Funciones
Tablas y punteros
Cadenas de caracteres
16
Tipos de datos
3.1416
17
Tipos de datos
int mes;
mes=FEBRERO;
1
2
18
Sentencias y expresiones
Ejemplo de sentencia:
z = 3*y + (2*cos(PI/4));
Expresiones
r1
r2
r3
r4
r5
r6
20
Expresiones
r(int)
r(float)
r(float)
r(float)
Ejemplo:
int x=4,y=8;
float z;
z=x/y;
// Resultado esperado: z=0.5
Ejecucin:
x(=4 int) / y(=8 int)
z = r1(=0,int)
r1 (=0, int)
r2 (=0,float) (z pasa a valer 0)
21
Expresiones
r (tipo)
r es lo ms parecido posible a op en el nuevo tipo
Ejemplo:
int profes=4,alumnos=8;
// El n de profesores y alumnos es entero
float ratio;
ratio=(float) profes/(float) alumnos;
Ejecucin:
(float) profes(=4 int)
(float) alumnos(=8 int)
r1(=4 float) / r2(=8 float)
ratio = r3(=0.5,float)
r1 (=4, float)
r2 (=8, float)
r3 (=0.5, float)
r4 (=0.5,float)
22
Sentencias de control
Alternativa:
if (condicion)
sentenciaSiTRUE;
else
sentenciaSiFALSE;
Bucle while:
while (condicion)
sentenciaARepetir; // Repite sentencia mientras se cumpla condicin
Bucle for:
for (inicializacion ; condicion_continuidad ; paso )
sentenciaARepetir;
23
Sentencias de control
Ejemplo: y = | x |
if (x>=0)
y = x;
else
y = -x;
24
Sentencias de control
Ejemplo: y = min ( | x | , 4 )
if ((x>4) || (x<-4))
y = 4;
else
{
if (x>=0)
y = x;
else
y = -x;
}
25
Algoritmos
Algoritmos
Algoritmo:
fact=1
Repetir desde i=1 hasta n
fact=fact*i
Al final, fact=n!
Lenguaje C:
int n,i,fact;
printf("Introd n: ");
scanf("%d",&n);
fact=1;
for (i=1;i<=n;i++)
fact=fact*i;
printf("%d! = %d\n",n,fact);
27
Algoritmos
Diagrama de bloques:
fact=1
i=1
F
i<=n ?
T
fact=fact*i
i=i+1
28
Algoritmos
=0 !
// Algoritmo completo
exp_x=0
Repetir desde n=0 hasta nmax
exp_x=exp_x + xn / n!
// x_n=xn
x_n=1
Repetir desde i=1 hasta n
x_n=x_n*x;
// fact_n=n!
fact_n=1
Repetir desde i=1 hasta n
fact_n=fact_n*i
29
Algoritmos
Aprovechamos que:
xn=x*xn-1
n!=n*(n-1)!
=0 !
// Algoritmo completo
exp_x=1
x_n=1
fact_n=1
Repetir desde n=1 hasta nmax
x_n = x_n * x
fact_n = fact_n * n
exp_x=exp_x + x_n / fact_n
Algoritmos
31
N bits
mn
N bits
VC++
char
255
-128
127
short
>=char
16
65535
-32768
32767
32
32
int
long
>char
>=short
>short
>=int
32
N bits
VC++
float
32
32
double
>=float
64
long double
>float
>=double
Codificacin partes
Capacidad de
representacin
Mx
Resolucin
Exp.
Mant.
8 bits
23 bits
1.Mant
3.4x1038
>=6 dgitos
decimales
11 bits
52 bits
1.Mant
1.8x10308
>=15 dgitos
decimales
exceso a 127
exceso a 1023
id. a double
33
Declaracin:
struct nombre
{
tipoA campo1A,campo2A;
tipoB campo1B;
} ;
Uso:
struct nombre vble;
vble.campo1A=;
if (vble.campo1B==)
;
34
Declaracin:
struct nombre
{
tipoA campo1A,campo2A;
tipoB campo1B;
} ;
Uso:
struct nombre vble;
vble.campo1A=;
if (vble.campo1B==)
;
35
36
Ejercicios propuestos
1)
4
2
2)
3)
4)
5)
Indice
Funciones
Tablas y punteros
Cadenas de caracteres
38
Funciones
Ej: calcular
=
!
!
// Algoritmo
comb_m_n = m! / (m-n)!
// fact_m=m!
fact_m=1
Repetir desde i=1 hasta m
fact_m=fact_m*i
// fact_m_n=(m-n)!
fact_m_n=1
Repetir desde i=1 hasta m-n
fact_m_n=fact_m_n*i
39
Funciones
Vbles
locales
Cdigo
Factorial
n
i
fact
fact=1
Repetir desde i=1 hasta n
fact=fact*i
fact=n!
40
Funciones en C
Parmetros
Cabecera
Declaracin variables locales
Cdigo de la funcin
return resultado;
}
int Factorial(int n)
// Calcula y devuelve n!
{
int fact;
int i;
fact=1;
for (i=1;i<=n;i++)
fact=fact*i;
return fact;
}
41
Invocacin de funciones
...
// En otra zona del programa (funcin llamante)
int m, n,comb;
... Damos valores a m,n ...
comb=Factorial(m)/Factorial(m-n);
... Usamos comb ...
42
Funcionamiento interno
http://isa.uniovi.es/~ialvarez/Curso/descargas/Funcionamiento%20Computador.pps
43
Uso de funciones
Funciones y estructuras
45
Ejercicios propuestos
La escala A cada 12 m
La escala B cada 18 m
La escala C cada 30 m
4)
Indice
Funciones
Tablas y punteros
Cadenas de caracteres
47
Tablas (arrays)
media=(x1+x2+x3+x4)/4;
48
Tablas (arrays)
int x1,x2,x3,x4;
int m;
int x[4];
int m,suma,i;
m=(x1+x2+x3+x4)/4;
suma=0;
for (i=0;i<4;i++)
suma=suma+x[i];
m=suma/4;
Tablas (arrays)
Tablas (arrays)
//
//
//
//
Tablas (arrays)
52
Punteros (pointers)
3000
27
3010
x
y
53
Punteros (pointers)
Ej:
int x=5,y=27;
int* pt;
pt=&x;
*pt=44;
pt=&y;
*pt=44;
x
y
pt
3000
27
3010
3000
3016
54
Punteros (pointers)
Ej:
int x=5,y=27;
int* pt;
pt=&x;
*pt=44;
pt=&y;
*pt=44;
x
y
pt
44
3000
27
3010
3000
3016
55
Punteros (pointers)
Ej:
int x=5,y=27;
int* pt;
pt=&x;
*pt=44;
pt=&y;
*pt=44;
x
y
pt
44
3000
27
3010
3010
3016
56
Punteros (pointers)
Ej:
int x=5,y=27;
int* pt;
pt=&x;
*pt=44;
pt=&y;
*pt=44;
x
y
pt
El mismo cdigo
afecta a variables diferentes
gracias al puntero
44
3000
44
3010
3010
3016
57
Punteros (pointers)
Para qu sirven los punteros?
x
f
3000
3010
58
Punteros (pointers)
Para qu sirven los punteros?
x
fact
2900
2908
3000
3010
}
...
// Funcin llamadora
int x=4,f;
f=Fact_con_Inc(x);
...
x
f
59
Punteros (pointers)
Para qu sirven los punteros?
x
fact
2900
120
2908
3000
3010
}
...
// Funcin llamadora
int x=4,f;
f=Fact_con_Inc(x);
...
x
f
60
Punteros (pointers)
Para qu sirven los punteros?
x
fact
2900
120
2908
3000
120
3010
}
...
// Funcin llamadora
int x=4,f;
f=Fact_con_Inc(x);
...
x
f
61
Punteros (pointers)
Para qu sirven los punteros?
x
f
3000
3010
62
Punteros (pointers)
Para qu sirven los punteros?
pt
fact
3000
2900
2908
3000
3010
}
...
// Funcin llamadora
int x=4,f;
f=Fact_con_Inc(&x);
...
*ptx
f
63
Punteros (pointers)
Para qu sirven los punteros?
pt
fact
3000
2900
2908
3000
3010
}
...
// Funcin llamadora
int x=4,f;
f=Fact_con_Inc(&x);
...
*ptx
f
64
Punteros (pointers)
Para qu sirven los punteros?
pt
fact
3000
2900
120
2908
3000
3010
}
...
// Funcin llamadora
int x=4,f;
f=Fact_con_Inc(&x);
...
*ptx
f
65
Punteros (pointers)
Para qu sirven los punteros?
pt
fact
3000
2900
120
2908
3000
120
3010
}
...
// Funcin llamadora
int x=4,f;
f=Fact_con_Inc(&x);
...
x
f
66
Punteros (pointers)
67
Punteros (pointers)
n_alumnos
nota_media
notas
3
?
8.5
9.3
7.1
?
?
3000
3004
3008
68
Punteros (pointers)
3008
3
?
?
?
3
?
8.5
9.3
7.1
?
?
2900
2904
2908
2912
2916
3000
3004
3008
69
Punteros (pointers)
3008
3
8.3
24.9
3
3
?
8.5
9.3
7.1
?
?
2900
2904
2908
2912
2916
3000
3004
3008
70
Punteros (pointers)
t
n
media
suma
i
n_alumnos
nota_media
notas
3008
3
8.3
24.9
3
3
8.3
8.5
9.3
7.1
?
?
2900
2904
2908
2912
2916
3000
3004
3008
71
Punteros y tablas
72
Punteros y tablas
// CORRECTO
void FuncionDevuelveTabla(int t[],int n)
{
... Dar valores a t[i]...
}
Punteros y tablas
10
...
int t[NMAX];
int n;
...
74
Punteros y tablas
75
ATENCION !!!
De esta manera, se puede conseguir que una funcin reciba o
devuelva una tabla completa.
Ejercicios propuestos
2)
3)
4)
5)
6)
( )
Indice
Funciones
Tablas y punteros
Cadenas de caracteres
79
Codificacin de texto
b 98
c 99
. 46 0 48
1 49 \n 10
80
81
char getchar();
// Pide un carcter por consola
putchar(char c);
// Escribe un carcter en consola
Se utiliza %c en printf() y scanf()
int isalpha(char c); // Devuelve Verdadero si c est entre az A..Z
char toupper(char c); // Devuelve mayscula si era minscula.
82
83
txt[0]
txt[1]
txt[2]
txt[3]
txt[4]
txt[5]
'H'
'o'
'l'
'a'
0
?
3000 = txt
3001
3002
3003
3004
3005
// En nuestro programa
int x=3,z=2;
printf("x vale %d, y vale %d\n",x,y);
84
txt[0]
txt[1]
txt[2]
txt[3]
txt[4]
txt[5]
'H'
'o'
'l'
'a'
0
?
3000 = txt
nom[0]
3001
nom[1]
3002
nom[2]
3003
nom[3]
3004
nom[4]
3005
nom[5]
// Correcto
// Incorrecto, equivale a 3100=4000 !
// Incorrecto, equivale a 3100=3000 !
?
?
?
?
?
?
3100 = nom
3101
3102
3103
3104
3105
'P'
'e'
'p'
'e'
0
?
4000 = "Pepe"
4001
4002
4003
4004
4005
85
iguales=1;
for (i=0;txt[i]!=0;i++)
iguales=iguales && (txt[i]==nom[i]);
// Aqu: iguales (V F) indica si son iguales
86
Ejemplo:
char nombre[20];
char apellido[20];
printf("Nombre: ");
gets(nombre);
printf("Apellido: ");
gets(apellido);
printf("Nombre completo: %s %s\n",nombre,apellido);
87
88
Funciones ms utilizadas
int strcmp(const char* str1,const char* str2); // Compara a nivel de
cdigos ASCII. Devuelve: 0 iguales, <0 str1 es anterior, >0 str1
es posterior.
int strncmp(const char* str1,const char* src,int n);
// Id. con mximo n caracteres
char* strchr(const char* str,char c); // Busca caracter c en cadena cad
char* strstr(const char* str,const char* substr); // Busca subcadena
substr en cadena str
Otras funciones de bsqueda (ver ayuda VC++): strcspn(), strpbrk(),
strtok(), strspn(),
89
91
92
Cadenas de caracteres
Ejercicios propuestos
1)
2)
3)
4)
5)
94
Indice
Funciones
Tablas y punteros
Cadenas de caracteres
95
000010111
int x=23;
96
valor=77;
// 26+23+22+20
~ entA entR
BITi(entR)= BITi(entA)
Ejemplos:
int v1=77;
int v2=23;
v1 & v2
v1 | v2
v1 ^ v2
~v1
->
->
->
->
00..01001101
00..00010111
00..00000101
00..01011111
00..01011010
11..10110010
(=5)
(=95)
(=90)
(=-78)
98
Binarios (2 operandos):
<< (desplazamiento a izquierda):
i=entB..n-1
i=0..entB-1
BITi(entR)= BITi-entB(entA)
BITi(entR)= 0
A
A
i=0..entB-1
i=entB..n-1
peso 2n-1
int x=26
0000 00011010
x<<3=
=208=
=26x23
0000 11010000
peso 20
peso 2n-1
int x=26
0000 00011010
x>>3=
=3=
=26/23
0000 00000011
peso 20
99
1h=0001b
2h=0010b
3h=0011b
4h=0100b
5h=0101b
6h=0110b
7h=0111b
8h=1000b
9h=1001b
Ah=1010b
Bh=1011b
Ch=1100b
Dh=1101b
Eh=1110b
Fh=1111b
// 26+23+22+20
// 4h=0100b, Dh=1101b
valor
// v = zzyxxx
// Extraer vx,vy,vz de v
Dar valor a v
vx= v & 0x7;
vy= (v & 0x8) >> 3;
vz= (v & 0x30) >> 4;
Mscara Z
// vx= 000xxx
// vy= 00000y
// vz= 0000zz
Rotacin Z
bitstart_z = 4, nbits_z=2
Rotacin = bitstart_z
2n
(1<<n)
(1<<n)-1
= 0001000000
= 0000111111
Mscara
00111111
#define
#define
#define
#define
#define
#define
#define
#define
#define
BITSTART_X
NBITS_X
MASK_X
BITSTART_Y
NBITS_Y
MASK_Y
BITSTART_Z
NBITS_Z
MASK_Z
11110000
00110000
0
3
(((1<<(BITSTART_X+NBITS_X))-1) & ~((1<<BITSTART_X)-1))
(BITSTART_X+NBITS_X)
1
(((1<<(BITSTART_Y+NBITS_Y))-1) & ~((1<<BITSTART_Y)-1))
(BITSTART_Y+NBITS_Y)
2
(((1<<(BITSTART_Z+NBITS_Z))-1) & ~((1<<BITSTART_Z)-1))
// vz= 0000zz
103
Ejercicios propuestos
1)
2)
Indice
Funciones
Tablas y punteros
Cadenas de caracteres
105
Pasos en la obtencin
de cdigo mquina:
Editor
.C
main()
{
int i;
...
printf(x=%d..
}
.OBJ
_main:
00011100
00010100
exports _main
extern _printf
00011100
00010100
11011100
11010100
.LIB
_printf:
11011100
11010100
extern _main
exports _printf
.EXE
...
106
Ejecucin de un programa:
El programa Cargador
(Loader) vuelca en memoria
el archivo ejecutable.
El cargador pone en el PC
(Contador de Programa) la
direccin de la 1 instruccin
del programa (el resto se
ejecutan secuencialmente).
O bien cargar en memoria y
ejecutar paso a paso con un
programa depurador.
00011100
00010100
11011100
11010100
.EXE
...
Cargador
00011100
00010100
11011100
11010100
. . .
. . .
. . .
107
Compilacin separada
uno.c
main()
{
x=FnDos();
y=FnTres();
Comp
dos.c
int FnDos()
{
dos.obj
Comp
_FnDos:
01010100
exports _FnDos
Enlazador
tres.c
int FnTres()
{
_main:
00011100
exports _main
extern _printf
extern _FnDos
extern _FnTres
_printf:
11011100
11010100
extern _main
exports _printf
tres.obj
Comp
_FnTres:
11001100
exports _FnTres
00011100
01010100
11001100
11011100
11010100
.EXE
108
El preprocesador
#pragma
// Indicaciones al compilador
#ifxxx
#else
#endif
// Directivas de
// compilacin
// condicional
#error
El preprocesador
Las directivas del preprocesador actan sobre el texto
que va a ser compilado, no en tiempo de ejecucin.
Ejemplo:
miprog.c
#include <stdio.h>
#define N 5
Pre
pro
cesa
dor
main()
{
int i,t[N];
miprog.obj
/***
*stdio.h definitions
*
main()
{
float t[5];
int i;
for (i=0;i<N;i++)
00010100111
11010010011
01001010111
Com
pila
dor
for (i=0;i<5;i++)
stdio.h
/***
*stdio.h - definitions/declarations for standard I/O routines
*
110
uno.c
uno.obj
int FnDos();
#include "dos.h"
main()
{
float x=PI/4;
if (FnDos(x,))
Pre pro
cesador
main()
{
float x=3.1416/4;
if (FnDos(x,))
Com
pila
dor
00010100111
11010010011
01001010111
dos.h
#define PI 3.1416
int FnDos();
dos.c
#include "dos.h"
int FnDos()
{
if (x>PI)
return 1;
return 0;
}
dos.obj
int FnDos();
Pre pro
cesador
int FnDos()
{
if (x>3.1416)
return 1;
return 0;
}
Com
pila
dor
11010010011
00010100111
01001010111
111
El preprocesador
#define
50
Con parmetros:
#define
MIN(a,b) (a>b) ? a : b
#define
El preprocesador
Compilacin condicional:
#if condicin_evaluable_en_tiempo_de_compilacin
Alternativas a #if:
#ifdef
#ifndef
identif_constante
identif_constante
Diferenciar entre:
#if :
if () :
El preprocesador
// cambiar por 1 2
El preprocesador
miprog.c
#include matrices.h
#include determinante.h
...
Error compilacin:
Declaracin doble
de struct matriz
miprog.c
#include matrices.h
#include determinante.h
...
matrices.h
struct matriz
{
...
};
determinante.h
#include matrices.h
...
...
matrices.h
#ifndef _INC_MATRICES_H
#define _INC_MATRICES_H
struct matriz
{
...
};
...
#endif
determinante.h
#ifndef _INC_DETERM_H
#define _INC_DETERM_H
#include matrices.h
...
#endif
116
Ejercicios propuestos
1)
2)
3)
117
Indice
Funciones
Tablas y punteros
Cadenas de caracteres
118
Interrupcin
Programa
usuario
Intercambio
datos
Sistema Operativo
Driver
dispositivo
Driver
dispositivo
Driver
dispositivo
Puertos E/S
Puertos E/S
Puertos E/S
Puertos E/S
Dispositivo
perifrico
Dispositivo
perifrico
Dispositivo
perifrico
Dispositivo
perifrico119
SOFTWARE
HARDWARE
Programa
usuario
PROGRAMA
Solicitud
acceso dispositivo
Id. de stream
Solicitud
lectura id.
Datos
ledos
S.O.
Comprueba
si existe y est
libre
Asigna
identificador
Busca driver
asignado
Compone
resultado
DRIVER
Inicializa
Compone
Estado
Comprueba
Puertos y estado
Devolver
resultado?
Lee puertos
y compone
estado
DISPOSITIVO
Acciones al
acceder a puertos
Acciones al
acceder a puertos
Genera
interrupcin
120
121
122
// Lee 1 carcter
// Escribe 1 carcter
E/S de cadenas:
char *fgets(char *str,int n,FILE *fid); // Lee 1 lnea
int fputs(const char* str,FILE* fid); // Escribe 1 lnea
123
Escritura de datos:
int fwrite(const void* buffer, size_t size, size_t count, FILE *fid);
// Enva al stream un conjunto de count*size bytes indicados
// a partir de la direccin de memoria buffer
En ambos casos:
Las funciones devuelven el n de elementos (bytes/size)
realmente escritos o ledos.
125
126
127
128
Ejercicios propuestos
1)
x0,1
x1,1
x0,m-1
x1,m-1
2)
3)
4)
5)
Indice
Funciones
Tablas y punteros
Cadenas de caracteres
130
Operadores y expresiones:
Operadores con asignacin: += -= *= ++ -- (enlace)
Operador alternativa ? : (enlace)
Operador de separacin , (enlace)
Seguir correctamente las reglas de evaluacin de expresiones. (enlace)
132
133
Al escribir el programa:
Realizar funciones y probar por separado, antes de incluirlas
en el programa definitivo.
Las funciones deben ser lo ms genricas posible,
dependiendo nicamente de sus entradas para producir los
resultados:
No incluir printf() o scanf() habitualmente en funciones.
Las funciones deben devolver cdigos de error si no pueden hacer su
trabajo con los parmetros recibidos.
No usar en lo posible variables globales en funciones.
134
135