SlideShare una empresa de Scribd logo
1 de 218
El Lenguaje de programaci´onC
Sistemas Operativos
Sistemas Operativos El Lenguaje de programaci´on C 1 / 218
Universidade daCorun˜a
El Lenguaje de programaci´onC I
Sistemas Operativos El Lenguaje de programaci´on C 2 / 218
Introducci´on
Caracter´ısticasdel lenguaje C
Estructura deun programa C
Primeros ejemplos
Compilaci´on deun programa
Directivas del precompilador
Depuraci´on
make
Ejercicios
Tipos, operadores y expresiones
Nombresdevariables
Tipos y taman˜osdedatos
Constantes
Declaracionesdevariables
Operadoresaritm´eticos
Operadoresderelaci´ony l´ogicos
El Lenguaje de programaci´onC II
Funciones y estructura deun programa
Sistemas Operativos El Lenguaje de programaci´on C 3 / 218
Conversiones detipo
Operadoresdebit
Incremento y decremento, asignaci´on y expresiones
Expresi´on condicional
Precedencia y ordeneevaluaci´on
Ejercicios
Control deflujo
Sentencias y bloques
if else
else-if
switch
bucleswhile, for ydo..while
break ycontinue
gotoy etiquetas
Ejercicios
El Lenguaje de programaci´onC III
Sistemas Operativos El Lenguaje de programaci´on C 4 / 218
funciones
funciones queno devuelven enteros
Variables externas
Variables est´aticas
Variables registro
Inicializaci´on
Recursividad
EL preprocesadorC
Ejercicios
Arrays y punteros
Punteros ydirecciones
Punteros y argumentosafunciones
Operacionessobrepunteros
Arrays y punteros
Arrays de punteros
Arrays multidimensionales
El Lenguaje de programaci´onC IV
Sistemas Operativos El Lenguaje de programaci´on C 5 / 218
Punteros y arraysmultidimensionales
Argumentos enla l´ıneadecomando
Punteros afunciones
Ejercicios
Estructuras
Estructuras
Operacionessobreestructuras
Punteros aestructuras
Arrays deestructuras
Estructuras autoreferenciadas
Uniones
Camposdebits
typedef
Ejercicios
Biblioteca C
Biblioteca C
El Lenguaje de programaci´onC V
Sistemas Operativos El Lenguaje de programaci´on C 6 / 218
Documentaci´on enl´ınea
Asignaci´on dememoria
Funciones decaracteres
Cadenasdecaracteres
Entrada/salida con formato
Entrada/salida conformato afichero
Entrada/salida conformato amemoria
Entrada/salida sin formato
Ejercicios
Herramientas
Valgrind
Introducci´on
Tipos, operadores yexpresiones
Control deflujo
Funciones y estructura deunprograma
Arrays y punteros
Estructuras
Biblioteca C
Herramientas
Sistemas Operativos El Lenguaje de programaci´on C 7 / 218
Introducci´on
Sistemas Operativos El Lenguaje de programaci´on C 8 / 218
Caracter´ısticasdel lenguaje C
Estructura deun programa C
Primeros ejemplos
Compilaci´on deun programa
Directivas del precompilador
Depuraci´on
make
Ejercicios
Caracter´ısticas del lenguaje C
Sistemas Operativos El Lenguaje de programaci´on C 9 / 218
► Esel lenguaje deprogramaci´ondeprop´ositogeneralasociado al
sistemaoperativo UNIX
► Esun lenguaje demedio nivel. Trata conobjetos b´asicos como
car´acteres,nu´meros. . . ; tambi´enconbits y direcciones de
memoria
► Poseeunagranportabilidad
► Seutiliza parala programaci´ondesistemas:construcci´onde
interpretes, compiladores, editores detexto, etc
► El lenguaje Cconsta de
► El lenguaje Cpropiamente dicho: tipos dedatos, expresiones y
estructuras decontrol
► Extensionesenforma demacrosy un amplio conjunto de
librer´ıas predefinidas
Sistemas Operativos El Lenguaje de programaci´on C 10 / 218
Introducci´on
Sistemas Operativos El Lenguaje de programaci´on C 11 / 218
Caracter´ısticasdel lenguaje C
Estructura deun programa C
Primeros ejemplos
Compilaci´on deun programa
Directivas del precompilador
Depuraci´on
make
Ejercicios
Estructura de un programa C
Sistemas Operativos El Lenguaje de programaci´on C 12 / 218
► Un programa eCconsta deuno om´asm´odulos(ficheros
fuentes)
► Cadam´odulopuedecontener
► directivas del precompilador, p.e para“incluir” otros ficheros
(#include) y “definir” constantesy macros (#define)
► declaracionesdevariables y prototipos defunciones
► una o m´asfunciones
► comentarios
► Cadafunci´onpuedecontener
► directivas delprecompilador
► declaraciones
► uno om´asbloques
► comentarios
► Cadabloque puede contener
► directivas del precompilador
► declaraciones
► una om´assentencias
► comentarios
Sistemas Operativos El Lenguaje de programaci´on C 13 / 218
► Cadasentencia debeestarterminada por ;
► Cadabloque desentencias seencierra entre llaves {.. . }
► La funci´ondenominada main esla queprimero seejecuta
► Loscomentarios puedenaparecerencualquier lugar del c´odigo y
seinsertan entre /* y */ as´ı
/* esto es un comentario*/
► oentre // y final de l´ınea
// esto es otro comentario
Sistemas Operativos El Lenguaje de programaci´on C 14 / 218
Introducci´on
Sistemas Operativos El Lenguaje de programaci´on C 15 / 218
Caracter´ısticasdel lenguaje C
Estructura deun programa C
Primeros ejemplos
Compilaci´on deun programa
Directivas del precompilador
Depuraci´on
make
Ejercicios
Primeros ejemplos
Sistemas Operativos El Lenguaje de programaci´on C 16 / 218
#include <stdio.h>
main()
{
printf("hola, primer programa en Cn");
}
#include <stdio.h>
main()
{
int fahr, celsius;
int lower, upper, step;
lower=0;
upper=300;
step=20;
fahr=lower;
while(fahr<=upper)
{
celsius=5*(fahr-32)/9;
printf("%dt%dn",fahr,celsius);
fahr=fahr+step;
}
}
Sistemas Operativos El Lenguaje de programaci´on C 17 / 218
Introducci´on
Sistemas Operativos El Lenguaje de programaci´on C 18 / 218
Caracter´ısticasdel lenguaje C
Estructura deun programa C
Primeros ejemplos
Compilaci´on deun programa
Directivas del precompilador
Depuraci´on
make
Ejercicios
Compilacio´n de un programa
Sistemas Operativos El Lenguaje de programaci´on C 19 / 218
► Normalmente invocamos al compilador concc ogcc (el
compilador degnu)
► Cuandotecleamoscc programa.c paragenerarun ejecutable
apartir deun fichero fuente obtenemosun ejecutable,
t´ıpicamentedenominado a.out.Sin embargoserealizan tres
tareas
► Pasopor el preprocesadorC. Esel queprocesalas l´ıneasque
comienzan con # (pe #include, #define. . . ). Puede
invocarse directamente con cpp
► La compilaci´onpropiamente dicha. Generaficheros objeto (.o) a
partir delos ficheros fuente. Puedeinvocarse como cc -c
► El enlazado. Realizado por ld
Introducci´on
Sistemas Operativos El Lenguaje de programaci´on C 20 / 218
Caracter´ısticasdel lenguaje C
Estructura deun programa C
Primeros ejemplos
Compilaci´on deun programa
Directivas del precompilador
Depuraci´on
make
Ejercicios
Directivas del precompilador
Sistemas Operativos El Lenguaje de programaci´on C 21 / 218
#include Incluye el fichero, cuyo nombre seindica, para sucompilaci´on
con el resto delc´odigo
► Si el nombre del fichero va entre <...> se busca en el
directorio include del sistema (/usr/include). Por ejemplo
#include <stdio.h>
hace que el fichero /usr/include/stdio.h se incluya en ese
punto para ser compilado con nuestro fichero fuente
► El nombre se puede poner entre comillas (“) y el sistema lo
buscar´a en el directorio actual (tambi´en se puede poner una
ruta absoluta)
► Los ficheros se suelen denominar .h y contienen declaraciones
de tipos, variables y prototipos de funciones (son ficheros
fuente que pueden verse)
#define Define un s´ımbolo,esdecir cadaocurrencia deeses´ımboloes
sustituida por sudefinici´on. Porejemplo
Sistemas Operativos El Lenguaje de programaci´on C 22 / 218
► El C distingue entre mayu´sculasy minu´sculas, aunque la
costumbre es utilizar mayu´sculaspara los s´ımbolosdefinidos
por el preprocesador
► ejemplo
#define M
A
X 1024
hace que todas las ocurrencias de la cadena MAX dentro del
c´odigo son sustituidas por 1024
► El c´odigo que se compila lleva 1024 donde iba MAX
► Si MAX iba dentro de comillas ’ ’ . . . ‘ ‘ , no sesustituye
#include <stdio.h>
#define UPPER 300
#define LOWER 0
#define STEP 20
main()
{
int fahr, celsius;
fahr=LOWER;
while(fahr<=UPPER)
{
celsius=5*(fahr-32)/9;
printf("%dt%dn",fahr,celsius);
fahr=fahr+STEP;
}
}
Sistemas Operativos El Lenguaje de programaci´on C 23 / 218
Introducci´on
Sistemas Operativos El Lenguaje de programaci´on C 24 / 218
Caracter´ısticasdel lenguaje C
Estructura deun programa C
Primeros ejemplos
Compilaci´on deun programa
Directivas del precompilador
Depuraci´on
make
Ejercicios
Depuracio´n
Sistemas Operativos El Lenguaje de programaci´on C 25 / 218
► Paradepurar programasdisponemos del depurador,quenos
permite ejecutar los programasenun entorno controlado
► Para usareldepurador
a. Compilamos con cc -g
$gcc -g ejercicio1.c
b. Invocamos el depuradorpas´andoleel ejecutable como
par´ametro
antonio@abyecto:~$ gdb a.out
GNU gdb (GDB) 7.3-debian
Copyright (C) 2011 Free Software Foundation, Inc.
.......
(gdb)
► Dentro del depuradorpodemosestablecer puntos deruptura con
break (break numerol´ınea o break nombrefunci´on),
ejecutar pasoapasocon step o next,ver variables con
display . . . . El depurador dispone deayudaenl´ınea, mediante
help
Introducci´on
Sistemas Operativos El Lenguaje de programaci´on C 26 / 218
Caracter´ısticasdel lenguaje C
Estructura deun programa C
Primeros ejemplos
Compilaci´on deun programa
Directivas del precompilador
Depuraci´on
make
Ejercicios
make
Sistemas Operativos El Lenguaje de programaci´on C 27 / 218
► Facilita el procesodegeneraci´on y actualizaci´ondeun
programa.
► Determina autom´aticamentequ´epartesdeun programa deben
recompilarseante una actualizaci´ondealgunosm´odulos y las
recompila.
► Secreanun archivo Makefile conlas dependenciasentre los
ficheros: un fichero debeactualizarse si alguna desus
dependenciasesm´asreciente
► El Makefile define tambi´enlos mandatos necesarios para
actualizar cadaarchivo enbaseasus dependencias
► El Makefile estaformadopor unaseriedereglas.Donde
cadaregla tiene el siguiente formato
objetivo: dependencia1dependencia2. . .
mandato1
mandato2
mandato3
...
► N´otesequeantesdecadamandato hayun caracter tab
► Para compilar usamosla orden‘‘make objetivo’’ que
► Encuentra la regla correspondiente aobjetivo
► Trata susdependenciascomo objetivos y lasresuelve
recursivamente
► Dentro del Makefile sepuedendefinir variables (y accedera
susvalores) comoenel shell:VAR=valor paradefinir la
variable y ${VAR} o$(VAR) paraaccederasuvalor. $
@se
refiere al nombredelobjetivo
Sistemas Operativos El Lenguaje de programaci´on C 28 / 218
Ejemplo muy sencillo de make
Sistemas Operativos El Lenguaje de programaci´on C 29 / 218
► Consideremos el siguiente programa (programa.c)
#include "funcion1.h"
#include "funcion2.h"
main()
{
int a=MAX1,b=MAX2;
funcion1();
funcion2();
}
► Donde funcion1.h
#define MAX1 1000
void funcion1(void);
► y funcion2.h
#define MAX2 2000
void funcion2(void);
Ejemplo muy sencillo de make
Sistemas Operativos El Lenguaje de programaci´on C 30 / 218
► Adem´as,funcion1.c es
#include "funcion1.h"
void funcion1(void)
{
int i=MAX1;
return;
}
► y funcion2.c es
#include "funcion2.h"
void funcion2(void)
{
int j=MAX2;
return;
}
Ejemplo muy sencillo de make
Sistemas Operativos El Lenguaje de programaci´on C 31 / 218
► si queremoscompilarlo, y generarun programa llamado
programa.out
1. Compilar´ıamos funcion1.c
gcc -c funcion1.o funcion1.c
2. Compilar´ıamos funcion2.c
gcc -c funcion2.o funcion2.c
3. Compilar´ıamosprograma.c dela siguiente manera
gcc -o programa.out programa.c funcion2.o funcion1.o
► Cadavezquesemodificase uno delos archivos habr´ıaque
repetir alguna (o todas) delas anteriores compilaciones
Ejemplo muy sencillo de make
Sistemas Operativos El Lenguaje de programaci´on C 32 / 218
► El siguiente archivo Makefile seocupa dedecidir quehay
quecompilar y hacerlo
programa.out: programa.c funcion1.h funcion2.h funcion1.o funcion2.o
gcc -o programa.out programa.c funcion2.o funcion1.o
funcion1.o: funcion1.h funcion1.c
gcc -c funcion1.o funcion1.c
funcion2.o: funcion2.h funcion2.c
gcc -c funcion2.o funcion2.c
limpiar:
rm programa.out funcion1.o funcion2.o
Otro ejemplo de make
Sistemas Operativos El Lenguaje de programaci´on C 33 / 218
CC=gcc
CFLAGS=-g
OBJS2=prac2.o aux1.o
all: prac1 prac2
prac1: prac1.o aux1.o
gcc -g -o prac1 prac1.o aux1.o
prac2: $(OBJS2)
${CC} ${CFLAGS} -o $@ ${OBJS2}
prac1.o prac2.o: prac.h
clean:
rm -f prac1.o aux1.o ${OBJS2}
Introducci´on
Sistemas Operativos El Lenguaje de programaci´on C 34 / 218
Caracter´ısticasdel lenguaje C
Estructura deun programa C
Primeros ejemplos
Compilaci´on deun programa
Directivas del precompilador
Depuraci´on
make
Ejercicios
Ejercicios
Sistemas Operativos El Lenguaje de programaci´on C 35 / 218
► Compilar los programasdeejemplo deesta secci´on
► Observar las salida del preprocesador de cada uno deellos
► Usarel depurador paraejecutar pasoapasolos dosu´ltimos y
ver comocambian devalor las variables enel bucle
► Crearun Makefile paraun archivo y compilarlo conmake
Introducci´on
Tipos, operadores yexpresiones
Control deflujo
Funciones y estructura deunprograma
Arrays y punteros
Estructuras
Biblioteca C
Herramientas
Sistemas Operativos El Lenguaje de programaci´on C 36 / 218
Tipos, operadores y expresiones
Sistemas Operativos El Lenguaje de programaci´on C 37 / 218
Nombresdevariables
Tipos y taman˜osdedatos
Constantes
Declaracionesdevariables
Operadoresaritm´eticos
Operadoresderelaci´ony l´ogicos
Conversiones detipo
Operadoresdebit
Incremento y decremento, asignaci´on y expresiones
Expresi´oncondicional
Precedencia y ordeneevaluaci´on
Ejercicios
Nombres de variables
► los nombresdevariables puedentener letras, nu´merosy el
s´ımbolo’ ’.
► Deben empezarpor unaletra (pueden empezarpor ’ ’ pero no
esrecomendable puesesel criterio queusanlas rutinas dela
biblioteca)
► Puedenllevar mayu´sculasy minu´sculas.El Cdistingue entre
mayu´sculasy minu´sculas
► La costumbreesquelas variables van enminu´sculay las
constantesenmayu´scula
► Laspalabrasreservadas if,else ...no puedenusarsecomo
nombresde variables
Sistemas Operativos El Lenguaje de programaci´on C 38 / 218
Tipos, operadores y expresiones
Sistemas Operativos El Lenguaje de programaci´on C 39 / 218
Nombresdevariables
Tipos y taman˜osdedatos
Constantes
Declaracionesdevariables
Operadoresaritm´eticos
Operadoresderelaci´ony l´ogicos
Conversiones detipo
Operadoresdebit
Incremento y decremento, asignaci´on y expresiones
Expresi´oncondicional
Precedencia y ordeneevaluaci´on
Ejercicios
Tipos y taman˜osde datos
Sistemas Operativos El Lenguaje de programaci´on C 40 / 218
► El Ctiene pocostipos dedatos
char Un byte. Contiene un caracter (o un nu´meroentre 0 y 255) int
Un entero. El taman˜o dependedel sistema dondeestemos
float Un real
double Un real endoble precisi´on
► Adem´asint puedesershort o long y tanto int como char
puedensersigned o unsigned
► unsignedlong int, unsingedlong,
► El taman˜odepende del compilador pero int no esmenor que
short ni mayorquelong
► Existe tambi´enel long long int conmayorrango y el long
double conprecisi´onextendida paralos reales
Tipos, operadores y expresiones
Sistemas Operativos El Lenguaje de programaci´on C 41 / 218
Nombresdevariables
Tipos y taman˜osdedatos
Constantes
Declaracionesdevariables
Operadoresaritm´eticos
Operadoresderelaci´ony l´ogicos
Conversiones detipo
Operadoresdebit
Incremento y decremento, asignaci´on y expresiones
Expresi´oncondicional
Precedencia y ordeneevaluaci´on
Ejercicios
Constantes
Sistemas Operativos El Lenguaje de programaci´on C 42 / 218
► Una constante entera esint (ejemplo 12714)
► Si queremosquesealong le ponemosel sufijo ’l’ o ’L’.
(ejemplo 12714L)
► Una constante con un punto decimal o un exponente es un
double (ejemplos 3.141516, 1e-5)
► Si queremosqueseafloat le ponemosel sufijo ’f’ o ’F’
(ejemplos 3.141516f,1e-5F)
► Si una constanteenteracomienzapor 0seentiende queest´a en
octal y si comienzapor 0x o0X enhexadecimal
► Ejemplos 034892(octal) 0xffff4000(hexadecimal)
► Una constante car´actersepone entre comillas simples
(ejemplo ’a’). Puedeaparecerenoperaciones y suvalor esel
c´odigodedicho caracter
► Una constante car´actertambi´ensepuedeexpresar por su
c´odigoenoctal ohexadecimal. Ejemplos: ’077’ (octal) o
’x3f’ (hexadecimal)
► Algunas constantes especiales:’t’ (tab) ’n’ (fin del´ınea’)
’r’ retorno decarro . . .
► Una constante cadenaseencierra entre comillas dobles
(”. . . “). LascadenasenCest´anterminadaspor el caracter
’0’,
Sistemas Operativos El Lenguaje de programaci´on C 43 / 218
► Una expresi´onconstante esuna expresi´onquesolo incluye
constantes.Puedeserevaluada entiempo decompilaci´on y
serutilizada enlugar deuna constante
#define MAXIMO 1024
char linea[MAXIMO/2 +20];
► Un casoparticular deconstantes sonlos tipos enumerados. Un
tipo enumeradoesuna lista devalores enterosconstantes
enum boolean {FALSE, TRUE};
► Salvo queseespecifique otra cosa,comienzanen0, as´ıFALSE
ser´ıa0y TRUE 1
► Tambi´enpuedeespecificarse el valor de comienzo
enum dias {LUNES=1, MARTES, MIERCOLES,
JUEVES, VIERNES, SABADO, DOMINGO};
Sistemas Operativos El Lenguaje de programaci´on C 44 / 218
Tipos, operadores y expresiones
Sistemas Operativos El Lenguaje de programaci´on C 45 / 218
Nombresdevariables
Tipos y taman˜osdedatos
Constantes
Declaracionesdevariables
Operadoresaritm´eticos
Operadoresderelaci´ony l´ogicos
Conversiones detipo
Operadoresdebit
Incremento y decremento, asignaci´on y expresiones
Expresi´oncondicional
Precedencia y ordeneevaluaci´on
Ejercicios
Declaraciones de variables
Sistemas Operativos El Lenguaje de programaci´on C 46 / 218
► Todas las variables deben ser declaradas antes de su uso.
► Lasdeclaraciones debenapareceral principio decadafunci´on o
bloque de sentencias
► La declaraci´on consta deun tipo devariable y unalista de
variables separadasporcoma
int i,j;
float x,pi;
unsigned long longitud, contador;
► Lasvariables puedeninicializarse enla declaraci´on
float pi=3.1416;
unsigned long contador=0;
► Puede utilizarse el simbol const paraindicar quela variable no
puedeser cambiada
const float e=2.7182;
Tipos, operadores y expresiones
Sistemas Operativos El Lenguaje de programaci´on C 47 / 218
Nombresdevariables
Tipos y taman˜osdedatos
Constantes
Declaracionesdevariables
Operadoresaritm´eticos
Operadoresderelaci´ony l´ogicos
Conversiones detipo
Operadoresdebit
Incremento y decremento, asignaci´on y expresiones
Expresi´oncondicional
Precedencia y ordeneevaluaci´on
Ejercicios
Operadores aritm´eticos
Sistemas Operativos El Lenguaje de programaci´on C 48 / 218
+ suma
- resta
* multiplicaci´on
/ divisi´on. Si los operandos sonenterosla divisi´onesentera
% resto entero. No admite operandos float odouble
#include <stdio.h>
#define UPPER 300
#define LOWER 0
#define STEP 20
main()
{
float fahr, celsius;
fahr=LOWER;
while(fahr<=UPPER)
{
celsius=5.0/9.0*(fahr-32)
printf("%ft%fn",fahr,celsius);
fahr=fahr+STEP;
}
}
Sistemas Operativos El Lenguaje de programaci´on C 49 / 218
Tipos, operadores y expresiones
Sistemas Operativos El Lenguaje de programaci´on C 50 / 218
Nombresdevariables
Tipos y taman˜osdedatos
Constantes
Declaracionesdevariables
Operadoresaritm´eticos
Operadoresderelaci´ony l´ogicos
Conversiones detipo
Operadoresdebit
Incremento y decremento, asignaci´on y expresiones
Expresi´oncondicional
Precedencia y ordeneevaluaci´on
Ejercicios
Operadores de relaci´onylo´gicos
Sistemas Operativos El Lenguaje de programaci´on C 51 / 218
► Operadoresderelaci´on
< menor que
<= menoro igual que
> mayor que
>= mayoroigual que
= = igual a
! = distinto
► Operadores l´ogicos
&& AND
|| OR
! NOT
► Losoperadoresl´ogicosseevalu´andeizquierda aderecha,y se
detiene la evaluaci´on tan pronto como se conoce elresultado.
Por ejemplo
i<MAXIMO && (linea[i]=getchar())!=’n’ && linea[i]!=EOF
Comprobar´ıa primero quei esmenorqueMAXIMO; si lo es
asigna el valor quedevuelve getchar() alinea[i] y comprueba
queesdistinto defin de l´ınea.y enesecasocompruebaque
linea[i] no es EOF
Sistemas Operativos El Lenguaje de programaci´on C 52 / 218
Tipos, operadores y expresiones
Sistemas Operativos El Lenguaje de programaci´on C 53 / 218
Nombresdevariables
Tipos y taman˜osdedatos
Constantes
Declaracionesdevariables
Operadoresaritm´eticos
Operadoresderelaci´ony l´ogicos
Conversiones detipo
Operadoresdebit
Incremento y decremento, asignaci´on y expresiones
Expresi´oncondicional
Precedencia y ordeneevaluaci´on
Ejercicios
Conversiones de tipo
Sistemas Operativos El Lenguaje de programaci´on C 54 / 218
► Cuandoenunaoperaci´onaparecentipos distintos, el C
convierte el tipo demenorrango al tipo demayorantesde
realizar laoperaci´on
► Podemosforzar la conversi´ondetipos poniendo antesdela
variable el tipo al quequeremosconvertir.
► Por ejemplo, la funci´onsin esperaun argumento detipo
double. Podemospasarleuna variable entera haciendo una
conversi´on de tipo
double seno; int n;
seno= sin ((double) n);
...
double centigrados, fahrenheit=55.3;
centigrados = 5/9 * (fahrenheit - 32); //77F = 25C
centigrados = 5.0/9 * (fahrenheit - 32);
Tipos, operadores y expresiones
Sistemas Operativos El Lenguaje de programaci´on C 55 / 218
Nombresdevariables
Tipos y taman˜osdedatos
Constantes
Declaracionesdevariables
Operadoresaritm´eticos
Operadoresderelaci´ony l´ogicos
Conversiones detipo
Operadoresdebit
Incremento y decremento, asignaci´on y expresiones
Expresi´oncondicional
Precedencia y ordeneevaluaci´on
Ejercicios
Operadores de bit
Sistemas Operativos El Lenguaje de programaci´on C 56 / 218
► Podemosoperar sobrelos bits deuna variable entera (las
variables char sonun tipo deenteros). Todossonoperadores
binarios, excepto el complemento a 1
& AND bit abit
| ORbit a bit
ˆ XOR bit abit
<< Desplazamiento debits ala izquierda
>> Desplazamiento debits ala derecha
˜ Complemento a1
Tipos, operadores y expresiones
Sistemas Operativos El Lenguaje de programaci´on C 57 / 218
Nombresdevariables
Tipos y taman˜osdedatos
Constantes
Declaracionesdevariables
Operadoresaritm´eticos
Operadoresderelaci´ony l´ogicos
Conversiones detipo
Operadoresdebit
Incremento y decremento, asignaci´on y expresiones
Expresi´oncondicional
Precedencia y ordeneevaluaci´on
Ejercicios
Incremento y decremento, asignaci´on y expresiones
Sistemas Operativos El Lenguaje de programaci´on C 58 / 218
► Losoperadoresincremento (++) y decremento(−−) pueden
usarsedentro deexpresiones.Si precedenala variable, el
incremento odecrementoseproduce antesdeusarla, encaso
contrario despu´es.Ejemplo:
linea[i++]=’a’;
asigna alinea[i] el valor ’a’ y luego incrementael valor dei,
mientras que
linea[--i]=’z’
primero decrementael valor dei y luego le asigna alinea[i] el
valor ’z’
► Cuandosemodifica el valor deunavariable apartir deun
valor anterior, puedeescribirsedeforma m´ascompacta
► xOPERADOR =expresi´on;equivale ax=x OPERADOR
(expresi´on);
x+=expresion; equivale a x=x+expresi´on;
x-=expresi´on; equivale a x=x-expresi´on;
x*=expresion; equivale a x=x*expresi´on;
Sistemas Operativos El Lenguaje de programaci´on C 59 / 218
. . .
x>> =expresion; equivale a x=x>>expresi´on;
x&=expresi´on; equivale a x=x&expresi´on;
. . .
x+=2; /*x=x+2*/
x*=4+y; /*x=x*(4+y)*/
Tipos, operadores y expresiones
Sistemas Operativos El Lenguaje de programaci´on C 60 / 218
Nombresdevariables
Tipos y taman˜osdedatos
Constantes
Declaracionesdevariables
Operadoresaritm´eticos
Operadoresderelaci´ony l´ogicos
Conversiones detipo
Operadoresdebit
Incremento y decremento, asignaci´on y expresiones
Expresi´oncondicional
Precedencia y ordeneevaluaci´on
Ejercicios
Expresi´on condicional
Sistemas Operativos El Lenguaje de programaci´on C 61 / 218
► Esdela forma expre1?expre2: expre3
► Seevalu´anexpre1, si escierta (distinta de0) el resultadoeslo
quevalga expre2
► Si es0, el resultado eslo quevalga expre3
► Ejemplos
char * a;
a= (p==NULL)? "cadena1": gets(p);
int n;
n= i*j*k ? 2567: (int) sqrt (pi);
printf ("Resultado: %sn" (p!=NULL)? p:" error");
Tipos, operadores y expresiones
Sistemas Operativos El Lenguaje de programaci´on C 62 / 218
Nombresdevariables
Tipos y taman˜osdedatos
Constantes
Declaracionesdevariables
Operadoresaritm´eticos
Operadoresderelaci´ony l´ogicos
Conversiones detipo
Operadoresdebit
Incremento y decremento, asignaci´on y expresiones
Expresi´oncondicional
Precedencia y ordeneevaluaci´on
Ejercicios
Precedencia y orden e evaluaci´on
Sistemas Operativos El Lenguaje de programaci´on C 63 / 218
► El Cno especificaenqueordenseevalu´anlos operandos de una
expresi´on. Por ejemplo, enla expresi´onx = f() + g () no
sabemossi seevaluar´aprimero f() og()
► El Ctampoco especifica enqueordenseevalu´anlos
par´ametrosaunafunci´on,
printf (‘‘%d %d’’,++i,i)
produce un resultado indeterminado
► Lasoperacionesl´ogicasseevalu´andeizquierda aderechay se
detiene la evaluaci´ontan pronto comoseconozca elresultado
► El Cs´ıdefine unaprecedencia entre distintos operadores,
Adem´ascadaoperador tiene unaasociatividad, comopuede
verseenla tabla siguiente
OPERADORES asociatividad
() [] -> . izquierda aderecha
! ~ ++ -- - * & (tipo) sizeof derechaaizquierda
* / izquierda aderecha
+ - izquierda aderecha
<< >> izquierda aderecha
< <= > >= izquierda aderecha
== != izquierda aderecha
& izquierda aderecha
^ izquierda aderecha
| izquierda aderecha
&& izquierda aderecha
|| izquierda aderecha
?: derechaaizquierda
= += -= *= /= %= &= |= etc derechaaizquierda
, izquierda aderecha
Sistemas Operativos El Lenguaje de programaci´on C 64 / 218
Tipos, operadores y expresiones
Sistemas Operativos El Lenguaje de programaci´on C 65 / 218
Nombresdevariables
Tipos y taman˜osdedatos
Constantes
Declaracionesdevariables
Operadoresaritm´eticos
Operadoresderelaci´ony l´ogicos
Conversiones detipo
Operadoresdebit
Incremento y decremento, asignaci´on y expresiones
Expresi´oncondicional
Precedencia y ordeneevaluaci´on
Ejercicios
Ejercicios
Sistemas Operativos El Lenguaje de programaci´on C 66 / 218
► Escribir un programa enCquenosimprima los taman˜osde
todos los tipos dedatos
► Escribir una funci´onInvierteBitsC queinvierte los bits deun
caractersinsigno
► Escribir una funci´onInvierteBitsS queinvierte los bits deun
entero corto sin signo.
► Escribir una funci´onInvierteBitsL queinvierte los bits deun
entero largo sin signo
► Hacer un programa queimprima los enterosdel 0al 100y el
resultado deinvertir losbits
► Considerando los nu´merosdel 0 al 100 como caracteressin
signo
► Considerando los nu´merosdel 0 al 100 como enteros cortos sin
signo
► Considerando los nu´meros del 0 al 100 como enteros largos sin
signo
Introducci´on
Tipos, operadores yexpresiones
Control deflujo
Funciones y estructura deunprograma
Arrays y punteros
Estructuras
Biblioteca C
Herramientas
Sistemas Operativos El Lenguaje de programaci´on C 67 / 218
Control de flujo
Sistemas Operativos El Lenguaje de programaci´on C 68 / 218
Sentencias y bloques
if else
else-if
switch
bucleswhile, for y do..while
break y continue
gotoy etiquetas
Ejercicios
► Una expresi´onseguidaenun ; esunasentencia
► Toda sentencia debeir terminada con;
► Puedenir varias sentencias enuna misma l´ınea
► Lasllaves{}seempleanparaagrupar sentencias.enlo que se
denomina bloque
► Un bloque essint´acticamenteequivalente auna sentencia
► Dentro deun bloque puedehaber sentencias y declaraciones
Sistemas Operativos El Lenguaje de programaci´on C 69 / 218
Control de flujo
Sistemas Operativos El Lenguaje de programaci´on C 70 / 218
Sentencias y bloques
if else
else-if
switch
bucleswhile, for y do..while
break y continue
gotoy etiquetas
Ejercicios
if else
Sistemas Operativos El Lenguaje de programaci´on C 71 / 218
if (expresi´on)
sentencia1
else
sentencia2
► Seevalu´aexpresi´on.Si esdistinta de0 (cierta) seejecuta
sentencia1, si es0seejecutasentencia2
► El elsees opcional
► Tanto sentencia1 comosentencia2 puedenserun bloque se
sentencias entre llaves {}
► Expresi´onno termina con ;
► Dado queel elseesopcional, unasentencia elsesiempreva
conel if inmediatamente anterior
► El siguiente c´odigoesincorrecto
if (n>0)
if (a>b)
printf ("a es mayor que bn");
else
printf ("n es menor que 0n");
► La versi´oncorrectaser´ıa
if (n>0) {
if (a>b)
printf ("a es mayor que bn");
}
else
printf ("n es menor que 0n");
Sistemas Operativos El Lenguaje de programaci´on C 72 / 218
Control de flujo
Sistemas Operativos El Lenguaje de programaci´on C 73 / 218
Sentencias y bloques
if else
else-if
switch
bucleswhile, for y do..while
break y continue
gotoy etiquetas
Ejercicios
else-if
Sistemas Operativos El Lenguaje de programaci´on C 74 / 218
if (expresi´on1)
sentencia1
elseif(expresi´on2)
sentencia2
elseif(expresi´on3)
sentencia3
. ..
else
sentencian
► Permite tomar decisionesmu´ltiples
► Seevalu´anen orden
Control de flujo
Sistemas Operativos El Lenguaje de programaci´on C 75 / 218
Sentencias y bloques
if else
else-if
switch
bucleswhile, for y do..while
break y continue
gotoy etiquetas
Ejercicios
switch
Sistemas Operativos El Lenguaje de programaci´on C 76 / 218
switch(expresi´on){
case constante1: sentencias
case constante2: sentencias
caseconstante3: sentencias
. ..
default: sentencias
}
► Permite tomar una decisi´onmu´ltiple basadaenuna expresi´on
quepuedetomar un nu´merodevalores constantes enteros (los
char sonun tipo de entero)
► El valor deexpresi´onseva comparandoconlas constantes por
ordeny una vezquecoincide con unadeellas seejecutan todas
las sentencias (incluidas las delos cases siguientes) hasta quese
encuentra la sentencia break
► Esto permite agrupar varios valores constantesquecompartan
una mismaacci´on
► Si no queremosquepasedeun case al siguiente, debemos
terminarlo conbreak
#include <stdio.h>
main() /* count digits, white space, others */
{
int c, i, nwhite, nother, ndigit[10];
nwhite = nother = 0;
for (i = 0; i < 10; i++)
ndigit[i] = 0;
while ((c = getchar()) != EOF) {
switch (c) {
case ’0’: case ’1’: case ’2’: case ’3’: case ’4’:
case ’5’: case ’6’: case ’7’: case ’8’: case ’9’:
ndigit[c-’0’]++;
break;
case ’ ’:
case ’n’:
case ’t’:
nwhite++;
break;
default:
nother++;
break;
}
}
printf("digits =");
for (i = 0; i < 10; i++)
printf(" %d", ndigit[i]);
printf(", white space = %d, other = %dn", nwhite, nother);
return 0;
}
Sistemas Operativos El Lenguaje de programaci´on C 77 / 218
Control de flujo
Sistemas Operativos El Lenguaje de programaci´on C 78 / 218
Sentencias y bloques
if else
else-if
switch
bucleswhile, for y do..while
break y continue
gotoy etiquetas
Ejercicios
bucleswhile, for ydo..while
Sistemas Operativos El Lenguaje de programaci´on C 79 / 218
while (expresi´on)
sentencia
► Seevalu´aexpresi´on, y si esdistinta de0 seejecutasentencia
► sentencia debeestarterminada por ;
► sentencia puedeserun bloque sesentencias entre llaves { }
int strlen(char s[])
{
int i;
i=0;
while (s[i]!= ’0’)
++i;
return i;
}
Sistemas Operativos El Lenguaje de programaci´on C 80 / 218
for (expr1; expr2;expr3)
sentencia
► Equivale exactamente a
expr1;
while (expr2){
sentencia
expr3;
}
► La expresiones del for, adiferencia deotros lenguajes, no
tienen por queserreferidas aenteros, puedenserexpresiones
decualquier tipo
Sistemas Operativos El Lenguaje de programaci´on C 81 / 218
int atoi(char s[])
{
int i, n;
n=0;
for(i=0; s[i]>=’0’ && s[i]<=’9’; ++i)
n=10*n+(s[i]-’0’);
return n;
}
Sistemas Operativos El Lenguaje de programaci´on C 82 / 218
do
sentencia
while (expresi´on)
► Seejecutasentencia y despu´esseevalu´aexpresi´on, conlo que
sentencia seejecuta al menosuna vez
► sentencia debeestarterminada por ;
► sentencia puedeserun bloque sesentencias entre llaves { }
Sistemas Operativos El Lenguaje de programaci´on C 83 / 218
Control de flujo
Sistemas Operativos El Lenguaje de programaci´on C 84 / 218
Sentencias y bloques
if else
else-if
switch
bucleswhile, for y do..while
break y continue
gotoy etiquetas
Ejercicios
break ycontinue
Sistemas Operativos El Lenguaje de programaci´on C 85 / 218
► Cproporciona dosmodosdesalida delos bucles: break y
continue
break Provoca la salida del bucle. Si hayvarios bucles anidados
provoca la salida deaquel dondeseencuentra
continue Provoca la salida dela presenteiteraci´on del bucle. Sevuelve ala
condici´on.
► break seutiliza tambi´enparala salida del switch
int i;
for (i=1;i<10;i++) {
if (i)
continue; //break;
printf("n i vale %d",i);
}
Control de flujo
Sistemas Operativos El Lenguaje de programaci´on C 86 / 218
Sentencias y bloques
if else
else-if
switch
bucleswhile, for y do..while
break y continue
gotoy etiquetas
Ejercicios
goto yetiquetas
Sistemas Operativos El Lenguaje de programaci´on C 87 / 218
► Aunque no sonformalmente necesarias,ni convenientes, C
disponedeuna sentencia goto y etiquetas
► Unaetiqueta tiene el mismo formato queun nombrede
variable, seguidadedos puntos
► Debeestarenla mismafunci´onendonde seencuentra el goto
for ( ... )
for ( ... ) {
for ( ... ) {
...
if (disaster)
goto error;
}
...
error:
/* clean up the mess */
Control de flujo
Sistemas Operativos El Lenguaje de programaci´on C 88 / 218
Sentencias y bloques
if else
else-if
switch
bucleswhile, for y do..while
break y continue
gotoy etiquetas
Ejercicios
Ejercicios
Sistemas Operativos El Lenguaje de programaci´on C 89 / 218
► Escribir una funci´onenCConvierteAEnt, queapartir deuna
cadenadecaracteresquecontiene la representaci´on deun
entero enunabase,y dicha basenosdevuelve elentero
► Escribir una funci´on en C ConvierteACad, que a partir de un
entero y una base nos devuelve una representaci´on de entero
endicha base
► Comprobar quesoncorrectas
► Podemossuponer quela longitud m´aximadela cadenaes16
► hacer un programa en Cque a imprima todos los enteros del 32
al 64 en todas las basesde 2 a 16. Imprime un entero (en las 16
bases)por l´ınea
Introducci´on
Tipos, operadores yexpresiones
Control deflujo
Funciones y estructura deunprograma
Arrays y punteros
Estructuras
Biblioteca C
Herramientas
Sistemas Operativos El Lenguaje de programaci´on C 90 / 218
Funciones y estructura de un programa
Sistemas Operativos El Lenguaje de programaci´on C 91 / 218
funciones
funciones queno devuelven enteros
Variables externas
Variablesest´aticas
Variables registro
Inicializaci´on
Recursividad
EL preprocesadorC
Ejercicios
funciones
► Un programa eCesuna colecci´onde funciones.
► Una deesasfuncionessellama main y esla primeraen
ejecutarse
► Lasfuncionespuedenresidir enuno ovarios ficheros fuente
► Cadafunci´ontiene la forma
tipo dedato nombrefuncion (declaraciones argumentos)
{
declaraciones y sentencias
}
► Sepuedeomitir el tipo dedato quedevuelve la funci´on(en
esecasoseasumequeesint
Sistemas Operativos El Lenguaje de programaci´on C 92 / 218
► Una funci´onpuedeno tener argumentosono tener
declaraciones o sentencias
funcion_simple()
{
}
► Cuandounafunci´onno lleva par´ametrosono devuelve ningu´n
valor seusael t´ermino void
void funcion_nada(void)
Sistemas Operativos El Lenguaje de programaci´on C 93 / 218
#include <stdio.h>
#define MAXLINE 1000 /* maximum input line length */
int getline(char line[], int max)
int strindex(char source[], char searchfor[]);
char pattern[] = "ould"; /* pattern to search for */
/* find all lines matching pattern */
main()
{
char line[MAXLINE];
int found = 0;
while (getline(line, MAXLINE) > 0)
if (strindex(line, pattern) >= 0) {
Sistemas Operativos El Lenguaje de programaci´on C 94 / 218
printf("%s", line);
found++;
}
return found;
}
/* getline: get line into s, return length */
int getline(char s[], int lim)
{
int c, i;
i = 0;
while (--lim > 0 && (c=getchar()) != EOF && c != ’n’)
s[i++] = c;
if (c == ’n’)
s[i++] = c;
s[i] = ’0’;
return i;
Sistemas Operativos El Lenguaje de programaci´on C 95 / 218
}
/* strindex: return index of t in s, -1 if none */
int strindex(char s[], char t[])
{
int i, j, k;
for (i = 0; s[i] != ’0’; i++) {
for (j=i, k=0; t[k]!=’0’ && s[j]==t[k]; j++, k++)
;
if (k > 0 && t[k] == ’0’)
return i;
}
return -1;
}
Sistemas Operativos El Lenguaje de programaci´on C 96 / 218
► Lasfuncionesdevuelven valores mediante la sentenciareturn
► El formato es
return expresi´on;
o
return (expresi´on);
► expresi´onseconvierte al tipo dedato quedevuelvela funci´on
► Puedeaparecerencualquier parte deuna funci´ony provoca la
inmediata salida de ella
► Si dicha sentencia aparecedentro deun bucle provoca la salida
dela funci´ony por tanto del bucle
Sistemas Operativos El Lenguaje de programaci´on C 97 / 218
Funciones y estructura de un programa
Sistemas Operativos El Lenguaje de programaci´on C 98 / 218
funciones
funciones queno devuelven enteros
Variables externas
Variablesest´aticas
Variables registro
Inicializaci´on
Recursividad
EL preprocesadorC
Ejercicios
funciones que no devuelven enteros
Sistemas Operativos El Lenguaje de programaci´on C 99 / 218
► Casumequetoda funci´on,salvoqueseespecifiqueen
contrario, devuelve un entero
► Si tenemosunafunci´onquedevuelve un valor queno esun
entero, y sobretodo, si la definici´ondedicha funci´onaparece
enel c´odigodespu´esdela primeravezqueesllamada, debemos
declararla
► Esto sehacedeclarando el tipo quedevuelve la funci´on.
► Podemosdeclarar tambi´enlos par´ametrosquerecibe, as´ıel
compilador podr´acomprobar la sintaxis cuandoes llamada
► En el ejemplo siguiente podemos ver quesedeclaran los
valores devueltos por las funciones llamadas desde main
#include <stdio.h>
#include <ctype.h>
#define MAXLINE 100
/* rudimentary calculator */
main()
{
double sum, atof(char []); //<-- Declaraci´on funci´on
char line[MAXLINE];
int getline(char line[], int max);
sum = 0;
while (getline(line, MAXLINE) > 0)
printf("t%gn", sum += atof(line));
return 0;
}
Sistemas Operativos El Lenguaje de programaci´on C 100 / 218
double atof(char s[])
{ double val, power; int i, sign;
for (i = 0; isspace(s[i]); i++) /* skip white space */
;
sign = (s[i] == ’-’) ? -1 : 1;
if (s[i] == ’+’ || s[i] == ’-’)
i++;
for (val = 0.0; isdigit(s[i]); i++)
val = 10.0 * val + (s[i] - ’0’);
if (s[i] == ’.’)
i++;
for (power = 1.0; isdigit(s[i]); i++) {
val = 10.0 * val + (s[i] - ’0’);
power *= 10;
}
return sign * val / power;
}
Sistemas Operativos El Lenguaje de programaci´on C 101 / 218
Funciones y estructura de un programa
Sistemas Operativos El Lenguaje de programaci´on C 102 / 218
funciones
funciones queno devuelven enteros
Variables externas
Variablesest´aticas
Variables registro
Inicializaci´on
Recursividad
EL preprocesadorC
Ejercicios
Variables externas
Sistemas Operativos El Lenguaje de programaci´on C 103 / 218
► Variables externas sonlas queest´andefinidas fuera del cuerpo
decualquier funci´on
► Soncompartidas por todos las funciones enmismofichero
fuente desdedonde est´adefinida la variable hasta el final del
fichero
► En C, las variables definidasdentro debloquessellaman
autom´aticas, secreanautom´aticamentecuandocomienzala
ejecuci´on del bloque y sedesasignan al terminar dicha
ejecuci´on
► El dominio (zona donde se reconoce el nombre) de las
variables autom´aticas se reduce al bloque donde est´an
declaradas
► El dominio delos argumentosaunafunci´onesdicha funci´on
► Si enun bloque interior sedeclaraunavariable conel mismo
nombrequeunaenun bloque masexterior (o unaexterna)
dentro dedicho bloque el nombreserefiere ala declarada en´el
► Si queremosqueuna variable externa seacompartida por
varios ficherosfuente distintos, debedefinirseenuno deellos y
enlos otros declararla conelidentificador extern
Sistemas Operativos El Lenguaje de programaci´on C 104 / 218
Funciones y estructura de un programa
Sistemas Operativos El Lenguaje de programaci´on C 105 / 218
funciones
funciones queno devuelven enteros
Variables externas
Variablesest´aticas
Variables registro
Inicializaci´on
Recursividad
EL preprocesadorC
Ejercicios
Variables est´aticas
Sistemas Operativos El Lenguaje de programaci´on C 106 / 218
► Una variable est´aticaesunavariable local deunafunci´onque
no secreay destruye al llamar ala funci´on
► Sedeclarananteponiendo la palabra static ala declaraci´on
void funcioncilla (void)
{
static int veces=0;
++veces
printf ("Esta funcion ha sido llamada %dn" veces);
}
► Desdeel punto devista del almacenamiento,unavariable
est´aticaesenrealidad unavariable externa, y el termino static la
haceprivada alafunci´on
► Si una variable externa (o unafunci´on)la declaramos static la
hacemosprivada parael fichero fuente dondeest´adefinida
Funciones y estructura de un programa
Sistemas Operativos El Lenguaje de programaci´on C 107 / 218
funciones
funciones queno devuelven enteros
Variables externas
Variablesest´aticas
Variables registro
Inicializaci´on
Recursividad
EL preprocesadorC
Ejercicios
Variables registro
Sistemas Operativos El Lenguaje de programaci´on C 108 / 218
► La declaraci´on register antes del nombre de una variable indica
al compilador que esa variable va a usarse intensamente y que
seria conveniente almacenarla enun registro dela m´aquina
register int indice;
► El compilador tiene libertad decolocarla enun registro ono
► Solo esaplicable avariables autom´aticasy par´ametrosdelas
funciones
► No puedepreguntarsepor la direcci´on deunavariable
registro, aunquedehechono sealmaceneenunregistro
Funciones y estructura de un programa
Sistemas Operativos El Lenguaje de programaci´on C 109 / 218
funciones
funciones queno devuelven enteros
Variables externas
Variablesest´aticas
Variables registro
Inicializaci´on
Recursividad
EL preprocesadorC
Ejercicios
Inicializaci´on
Sistemas Operativos El Lenguaje de programaci´on C 110 / 218
► Cpermite quelas variables seaninicializadas enla declaraci´on
► Lasvariables externasy est´aticasseinicializan unasola vez
durante lacompilaci´on
► Lasinicializaciones devariables autom´aticassonsentencias de
asignaci´on (se ejecutan)
► Lasexpresionesdeinicializaci´on debenserconocidas enel
momento dela inicializaci´on: Lasvariables externas y
est´aticassolopuedeninicializarse avalores constantes
► Losarraystambi´enpuedeninicializarse medianteuna lista de
suselementosentre llaves y separadospor,
int dias_por_mes[] = { 31, 28, 31, 30, 31, 30,
31, 31, 30, 31, 30, 31 }
► En estecasono esnecesariodeclarar la dimensi´on del array
Funciones y estructura de un programa
Sistemas Operativos El Lenguaje de programaci´on C 111 / 218
funciones
funciones queno devuelven enteros
Variables externas
Variablesest´aticas
Variables registro
Inicializaci´on
Recursividad
EL preprocesadorC
Ejercicios
Recursividad
Sistemas Operativos El Lenguaje de programaci´on C 112 / 218
► Cpermite recursividad enlas funciones,tanto directa como
indirecta
► No esnecesaria ninguna declaraci´on especial
#include <stdio.h>
/* printd: print n in decimal */
void printd(int n)
{
if (n < 0) {
putchar(’-’);
n = -n;
}
if (n / 10)
printd(n / 10);
putchar(n % 10 + ’0’);
}
Funciones y estructura de un programa
Sistemas Operativos El Lenguaje de programaci´on C 113 / 218
funciones
funciones queno devuelven enteros
Variables externas
Variablesest´aticas
Variables registro
Inicializaci´on
Recursividad
EL preprocesadorC
Ejercicios
EL preprocesador C
Sistemas Operativos El Lenguaje de programaci´on C 114 / 218
► Adem´as de la directiva #include y el uso elementaldel
#define, el preprocesador C tiene otrasfuncionalidades
► Usode#define paradefinirmacros
#define CUBO(x) x*x*x /*incorrecto CUBO (x+2)
#define CUBO(x) (x)*(x)*(x)
#define MAX(a,b) ((a>b)?a:b)
#define MAX(a,b,R) if (a > b) R=a; else R=b;
► Con#ifdef e#ifndef podemossabersi un s´ımboloha sido
definido ono. Ejemplo: prevenir queun fichero includese
incluya variasveces,(lo quedar´ıas´ımbolosduplicados)
#ifndef _UNISTD_H
#define _UNISTD_H
.....
#endif
► Puede dejarsesin efecto unadefinici´on
#undef MAXIMO
► Puedecomprobarsesi sehandefinido s´ımbolosconalgu´n
valor concreto, parahacerconstrucciones m´ascomplejas
#if SYSTEM == SYSV
#define HDR "sysv.h"
#elif SYSTEM == BSD
#define HDR "bsd.h"
#elif SYSTEM == MSDOS
#define HDR "msdos.h"
#else
#define HDR "default.h"
#endif
#include HDR
Sistemas Operativos El Lenguaje de programaci´on C 115 / 218
Funciones y estructura de un programa
Sistemas Operativos El Lenguaje de programaci´on C 116 / 218
funciones
funciones queno devuelven enteros
Variables externas
Variablesest´aticas
Variables registro
Inicializaci´on
Recursividad
EL preprocesadorC
Ejercicios
Ejercicios
Sistemas Operativos El Lenguaje de programaci´on C 117 / 218
► Repartir los programasdeejemplo deestetema envarios
ficherosfuente (uno paracadafunci´on), demaneraquese
puedan compilar separadamente.Hacer los ficherosinclude
correspondientes
► Declarar unavariable externa conel mismonombreencada
fichero fuente y comprobar si eso no la misma
► Declarar todas las variables locales comoregister y compilarlo
► Hacer quela variable externa declaradaenel apartado
anterior seala mismaparatodos los ficheros
► Hacer enCuna funci´onrecursiva quecalcula enfactorial de
un nu´mero.Imprimir los 20 primerosfactoriales
Introducci´on
Tipos, operadores yexpresiones
Control deflujo
Funciones y estructura deunprograma
Arrays y punteros
Estructuras
Biblioteca C
Herramientas
Sistemas Operativos El Lenguaje de programaci´on C 118 / 218
Arrays y punteros
Sistemas Operativos El Lenguaje de programaci´on C 119 / 218
Punteros y direcciones
Punteros y argumentosafunciones
Operacionessobrepunteros
Arrays y punteros
Arrays depunteros
Arrays multidimensionales
Punteros y arraysmultidimensionales
Argumentos enla l´ıneadecomando
Punteros afunciones
Ejercicios
► Un punteroesuna variable quecontiene la direcci´on deun
dato. Cproporcionadosoperadoresrelacionados conlas
direcciones dememoria
* Operadorindirecci´on. A partir deuna variable tipo puntero
nosproporciona el dato apuntado
& Operador direcci´on.A partir deuna variable nosdala
direcci´on dememoriadondesealmacenadicha variable
► Para declarar un puntero sedeclarael tipo dedato apuntado
int *p;
double *pf;
declaraque*p esun entero, por tanto p esun puntero a
entero
*pf esun double, por tanto pf esun puntero aun double
Sistemas Operativos El Lenguaje de programaci´on C 120 / 218
► Organizaci´ondeMemoria: Ejemplo
Sistemas Operativos El Lenguaje de programaci´on C 121 / 218
► La declaraci´on del puntero reservamemoriaparala variable
puntero NO PARA EL OBJETO APUNTADO. Enel
ejemplo anterior sereservamemoriaparap, El accesoa*p
tiene un resultado indefinido, pudiendo resultar enun error en
tiempo deejecuci´on
► Antes deusarun puntero debemosasegurarnosqueapunta un
unadirecci´on correcta
► Asign´andolela direcci´on deuna variable. Por ejemplo
p=&i;
► Asign´andoleel valor quedevuelva una funci´onquereserve
memoriapara´el.Por ejemplo
p=(int *) malloc (sizeof (int));
► Tras utilizar el puntero, siempresedebeliberar la memoria
reservadacon malloc utilizando la funci´onfree
free(p);
Sistemas Operativos El Lenguaje de programaci´on C 122 / 218
Arrays y punteros
Sistemas Operativos El Lenguaje de programaci´on C 123 / 218
Punteros y direcciones
Punteros y argumentosafunciones
Operacionessobrepunteros
Arrays y punteros
Arrays depunteros
Arrays multidimensionales
Punteros y arraysmultidimensionales
Argumentos enla l´ıneadecomando
Punteros afunciones
Ejercicios
Punteros y argumentos a funciones
Sistemas Operativos El Lenguaje de programaci´on C 124 / 218
► enCtodas las llamadas afunci´onsonpor valor: La funci´on
recibe siempreunacopia delo quesele pasacomo
argumento. Lasmodificaciones serealizan sobrela copia
► Lassiguiente funci´onno afecta alos argumentosquesele
pasan
void intercambia (int x, int y) /* INCORRECTA */
{
int temp;
temp = x;
x = y;
y = temp;
}
Una llamada aintercambia (a,b) no intercambiar´ıalos
valores dea y b, solo desuscopias
► Si queremosquela funci´onseallamada por referencia,lo que
hacemosesquela funci´onreciba las direcciones delas variables
quequeremosmodificar, y atrav´esdeellas accedaa las
variables
void intercambia(int *px, int *py)
{
int temp;
temp = *px;
*px = *py;
*py = temp;
}
► Para intercambiar dosvariables a y b la llamar´ıamos
intercambia(&a,&b);
Sistemas Operativos El Lenguaje de programaci´on C 125 / 218
Arrays y punteros
Sistemas Operativos El Lenguaje de programaci´on C 126 / 218
Punteros y direcciones
Punteros y argumentosafunciones
Operacionessobrepunteros
Arrays y punteros
Arrays depunteros
Arrays multidimensionales
Punteros y arraysmultidimensionales
Argumentos enla l´ıneadecomando
Punteros afunciones
Ejercicios
Operaciones sobre punteros
Sistemas Operativos El Lenguaje de programaci´on C 127 / 218
► Cpermite las siguientes operaciones sobre punteros
► puntero + entero La suma (y la resta), tienen en cuenta el
taman˜o del objeto apuntado de manera que si p apunta a un
entero, p+1 apuntar´ıaal siguiente entero
► puntero - entero
► puntero = puntero Asignaci´on entre punteros
► puntero = NULL
► puntero = = NULL Comparaci´oncon NULL
► puntero != NULL
► puntero ==puntero La comparaci´onentre punteros tiene
restricciones
Arrays y punteros
Sistemas Operativos El Lenguaje de programaci´on C 128 / 218
Punteros y direcciones
Punteros y argumentosafunciones
Operacionessobrepunteros
Arrays y punteros
Arrays depunteros
Arrays multidimensionales
Punteros y arraysmultidimensionales
Argumentos enla l´ıneadecomando
Punteros afunciones
Ejercicios
Arrays y punteros
► La declaraci´on enCdeun array es
tipo nombre array[dimension]
► La siguiente declaraci´on declaraun array de10 enteros
int a [10];
► Loselementosseaccedencomoa[0], a[1] . . .a[9]
► Loselementosdeun array sealmacenan consecutivamente en
memoria
► El nombredel array esla direcci´on del primer elemento del
array
Sistemas Operativos El Lenguaje de programaci´on C 129 / 218
,
► Consideremos ahoralosiguiente
int *pa;
pa=&a[0];
► los elementosdel array a[0], a[1]...a[9] est´an
almacenadosenlas direcciones dememoria
pa,pa+1,...pa+9 por lo quepuedenseraccedidos como
*pa, *(pa+1),. ..*(pa+9)
► Dado queel nombredel array esla direcci´on del primer
elemento del array,podr´ıamoshaber hechopa=a enlugar de
pa=&a[0];
Sistemas Operativos El Lenguaje de programaci´on C 130 / 218
,
► Ctambi´enadmite el accesoalos elementosdel array deesta
manera
pa[0], pa[1] pa[9]
► Hay quetener encuenta que,aunque el nombredel array esla
direcci´on del primer elementodel array,no esunavariable, sino
una constante, por lo que una sentencia del tipo
a=pb;
producir´aun error entiempo de compilaci´on
Sistemas Operativos El Lenguaje de programaci´on C 131 / 218
,
► Si queremospasarun subarrayaunafunci´onpodemoshacerlo
demaneramuy sencilla. Conlas declaraciones anteriores
f(a+3);
f(&a[3]);
pasar´ıanun subarraycomenzando enel tercer elemento del
array.
► La declaraci´on delos par´ametrosenla funci´onquerecibe el
array puedeser(suponiendo queno devuelvenada)
void f (int ar[]) { ....}
o
void f (int *ar) { ....}
Sistemas Operativos El Lenguaje de programaci´on C 132 / 218
#include <stdio.h>
char a[2][5] = {{11,12,13,14,15},
{21,22,23,24,25}};
main() {
char *p; // puntero a char
char (*q)[5]; // puntero a un array de 5
chars char *r[5]; // array
de 5 punteros a char
p = &(a[0][0]);
printf("%dn", p[0]);
p++;
printf("%dn", p[0]);
q = &(a[0]);
Sistemas Operativos El Lenguaje de programaci´on C 133 / 218
printf("%d == %d n", q[0][0], (*q)[0]); // equivalentes
q++;
printf("%dn", q[0][0]);
p = *a;
printf("a = %ld t *a = %ld t **a = %ld n", a, *a,
**a); printf("p = %ld t *p = %ld n", p, *p);
}
Arrays y punteros
Sistemas Operativos El Lenguaje de programaci´on C 134 / 218
Punteros y direcciones
Punteros y argumentosafunciones
Operacionessobrepunteros
Arrays y punteros
Arrays depunteros
Arrays multidimensionales
Punteros y arraysmultidimensionales
Argumentos enla l´ıneadecomando
Punteros afunciones
Ejercicios
Arrays de punteros
Sistemas Operativos El Lenguaje de programaci´on C 135 / 218
► En Cun puntero escomocualquier otra variable (en concreto es
un tipo de entero)
► Puedenhacersearrays de punteros.
► La declaraci´on
int * ar[MAX]
declaraquear esun array deMAX punteros aenteros. Los
elementosar[i] sonpunteros. El accesoa*ar[i], mientras
no inicialicemos adecuadamente los ar[i] produce un
resultado indefinido
► Dela mismamaneraqueenel apartadoanterior exist´ıauna
relaci´onmuy estrechaentre el puntero y el array,aqu´ıel
puntero equivalente al array ar se declarar´ıa
int **par;
Arrays y punteros
Sistemas Operativos El Lenguaje de programaci´on C 136 / 218
Punteros y direcciones
Punteros y argumentosafunciones
Operacionessobrepunteros
Arrays y punteros
Arrays depunteros
Arrays multidimensionales
Punteros y arraysmultidimensionales
Argumentos enla l´ıneadecomando
Punteros afunciones
Ejercicios
Arrays multidimensionales
► Cproporciona arrays multidimensionales, aunqueseusanm´as
los arraysdepunteros.
► La declaraci´on deun arraydedosdimensioneses
tipo nombre array[dim1][dim2]
int matriz [FILAS][COLUMNAS];
► El accesoal elemento i,j esmatriz[i][j]
Sistemas Operativos El Lenguaje de programaci´on C 137 / 218
static char daytab[2][13] = {
{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
{0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
};
/* day_of_year: set day of year from month & day */
int day_of_year(int year, int month, int day)
{
int i, leap;
leap = year%4 == 0 && year%100 != 0 || year%400 == 0;
for (i = 1; i < month; i++)
day += daytab[leap][i];
return day;
}
Sistemas Operativos El Lenguaje de programaci´on C 138 / 218
/* month_day: set month, day from day of year */
void month_day(int year, int yearday, int *pmonth,
int *pday)
{
int i, leap;
leap = year%4 == 0 && year%100 != 0 || year%400 == 0;
for (i = 1; yearday > daytab[leap][i]; i++)
yearday -= daytab[leap][i];
*pmonth = i;
*pday = yearday;
}
Sistemas Operativos El Lenguaje de programaci´on C 139 / 218
Arrays y punteros
Sistemas Operativos El Lenguaje de programaci´on C 140 / 218
Punteros y direcciones
Punteros y argumentosafunciones
Operacionessobrepunteros
Arrays y punteros
Arrays depunteros
Arrays multidimensionales
Punteros y arraysmultidimensionales
Argumentos enla l´ıneadecomando
Punteros afunciones
Ejercicios
Punteros y arrays multidimensionales
Sistemas Operativos El Lenguaje de programaci´on C 141 / 218
► Aunque enCexisten los arrays multidimensionales, no suelen
usarsepuesesmasconveniente usarlos arrays depunteros.
La declaraci´on
int a[10][20];
declaraun array de10x20enteros(10 filas y 20columnas).
► a esla direcci´on deun bloque dondehay200 enteros. Para
accederal elementoa[1][3] tengo quesaberquecadafila tiene 20
columnas
► Si quiero pasardicho array auna funci´ontendr´ıaquepasarlela
segundadimensi´onara quepudieseaccedercorrectamente a los
enteros
int func (int arr[][20])
► Consideremos ahoraestaotra declaraci´on
int * p[10];
declaraun array de10punterosa entero
► Si acadauno delos punteros le asigno memoriapara 20 enteros,
tengo denuevo una matriz de10x20 enteros ala que puedo
accedercomop[i][j].
► En memoriatengo 10bloques de20enteros cadauno (no
necesariamenteconsecutivos) (mas 10punteros)
► El accesoesm´asr´apidopuesno necesito multiplicaciones para
determinar adondeaccedo(solo sumaseindirecciones)
► A una funci´onno tendr´ıaquepasarlela segundadimensi´on
para quepudieseaccederalosenteros
► Esmasflexible, puesno todos los bloques tienen queserdel
mismotaman˜o. Esto esespecialmente interesante cuando
queremoscadenasdecaracteres
Sistemas Operativos El Lenguaje de programaci´on C 142 / 218
► Enlas siguientes figuras vemosla diferencia enla disposici´on
de memoria
► Array depunteros
► Array multidimensional
Sistemas Operativos El Lenguaje de programaci´on C 143 / 218
► Conestaotradeclaraci´on
int **p;
creamosun array multidimensional basado enpunteros.
► Si queremoscrearunamatriz de4filas por 6columnas,
debemosreservarmemoria parafilas y columnas
p = (int **) malloc (4 * sizeof(int *));
for (i = 0; i < 4; i++)
{
p[i] = (int *) malloc (6 * size(int));
}
Sistemas Operativos El Lenguaje de programaci´on C 144 / 218
// Equivalentes
Sistemas Operativos El Lenguaje de programaci´on C 145 / 218
► Accesoaelementosdela matriz
for (i = 0; i < 4; i++)
{
for (j = 0; j < 6; j++)
{
p[i][j] = 0;
*(p[i] + j) = 0;
*(*(p + i) + j) = 0;
}
}
► Para liberar la matriz
for (i = 0; i < 4; i++)
free(p[i]);
free(p);
Arrays y punteros
Sistemas Operativos El Lenguaje de programaci´on C 146 / 218
Punteros y direcciones
Punteros y argumentosafunciones
Operacionessobrepunteros
Arrays y punteros
Arrays depunteros
Arrays multidimensionales
Punteros y arraysmultidimensionales
Argumentos enla l´ıneadecomando
Punteros afunciones
Ejercicios
Argumentos en la l´ıneadecomando
Sistemas Operativos El Lenguaje de programaci´on C 147 / 218
► Cproporciona un m´etodoparaaccederalos argumentosdela
l´ıneadecomando, atrav´esdelos par´ametrosdemain
1 Declaramosquemain tiene dospar´ametros;uno un entero y
otro un array depunteros acar´acter,dela siguiente manera
int main(int argv, char argv[])
2 Al ejecutar el programa,argc tendr´ael nu´merodeargumentos y
los argv[i] (hasta argv[argc-1])sonlos argumentosdel´ınea de
comando
► argv[0] esel nombre del programaqueseejecuta por lo quesi
argc es1, no sele han pasadoargumentos
#include <stdio.h>
/* echo command-line arguments; 1st version */
int main(int argc, char *argv[])
{
int i;
for (i = 1; i < argc; i++)
printf("%s%s", argv[i], (i < argc-1) ? " " : "");
printf("n");
return 0;
}
Sistemas Operativos El Lenguaje de programaci´on C 148 / 218
Arrays y punteros
Sistemas Operativos El Lenguaje de programaci´on C 149 / 218
Punteros y direcciones
Punteros y argumentosafunciones
Operacionessobrepunteros
Arrays y punteros
Arrays depunteros
Arrays multidimensionales
Punteros y arraysmultidimensionales
Argumentos enla l´ıneadecomando
Punteros afunciones
Ejercicios
Punteros a funciones
Sistemas Operativos El Lenguaje de programaci´on C 150 / 218
► Aunque una funci´on no es una variable, si podemos usar
punteros a funciones, de manera que podemos usarlos en
arrayso pasarloscomopar´ametrosaotras funciones
► La siguientedeclaraci´on
double (*pfunc)(int,double)
declaraquepfunc esun puntero aunafunci´onquedevuelve
un double y querecibe dospar´ametros;un int y un double
char * (*pfunc)(char **)
ahorapfunc esun puntero aunafunci´onfunci´onquedevuelve un
puntero acaractery querecibe comoargumentoun array de
punteros acar´acter
► El siguiente ejemplo lo ilustramos con la funci´on qsort que
hace una ordenaci´on de l´ıneas y recibe como par´ametro un
puntero ala funci´onquecomparaunal´ıneacon otra
/* Qsort: sort v[left]...v[right] into increasing order */
void Qsort(void *v[], int left, int right,
int (*comp)(void *, void *))
{
int i, last;
void swap(void *v[], int, int);
if (left >= right) /* do nothing if array contains */
return; /* fewer than two elements */
swap(v, left, (left + right)/2);
last = left;
for (i = left+1; i <= right; i++)
if ((*comp)(v[i], v[left]) < 0)
swap(v, ++last, i);
Sistemas Operativos El Lenguaje de programaci´on C 151 / 218
swap(v, left, last);
qsort(v, left, last-1, comp);
qsort(v, last+1, right, comp);
}
Sistemas Operativos El Lenguaje de programaci´on C 152 / 218
► Si quisi´esemosutilizar la siguiente funci´onparacomparar
l´ıneas
int numcmp(char *s1, char *s2)
{
double v1, v2;
v1 = atof(s1); v2 = atof(s2);
if (v1 < v2)
return -1;
else if (v1 > v2)
return 1;
else
return 0;
}
teniendo encuenta queel nombredela funci´onesun puntero a
la funci´on,la llamada ser´ıa
Qsort (lineas,MAXLINEAS, numcmp);
Sistemas Operativos El Lenguaje de programaci´on C 153 / 218
Arrays y punteros
Sistemas Operativos El Lenguaje de programaci´on C 154 / 218
Punteros y direcciones
Punteros y argumentosafunciones
Operacionessobrepunteros
Arrays y punteros
Arrays depunteros
Arrays multidimensionales
Punteros y arraysmultidimensionales
Argumentos enla l´ıneadecomando
Punteros afunciones
Ejercicios
Ejercicios
Sistemas Operativos El Lenguaje de programaci´on C 155 / 218
► Escribir un programa enCqueimprime todas las l´ıneasdesu
entrada est´andarquecontienen una palabra quesele pasa
como argumento
► Escribir un programa enCqueadmite comopar´ametroun
nu´meroenteroN; si el nu´meroespositivo imprime las N
primerasl´ıneasdesuentrada, y si esnegativo las (-)N u´ltimas.
► Escribir un programa enCqueordenetodas las l´ıneasquelee de
suentrada usandola funci´onqsort. Si recibe el par´ametro
-n las ordenapor longitud, encasocontrario lo hace
alfab´eticamente
Introducci´on
Tipos, operadores yexpresiones
Control deflujo
Funciones y estructura deunprograma
Arrays y punteros
Estructuras
Biblioteca C
Herramientas
Sistemas Operativos El Lenguaje de programaci´on C 156 / 218
Estructuras
Sistemas Operativos El Lenguaje de programaci´on C 157 / 218
Estructuras
Operacionessobreestructuras
Punteros aestructuras
Arrays deestructuras
Estructuras autoreferenciadas
Uniones
Camposdebits
typedef
Ejercicios
Estructuras
► Una estructura esuna colecci´ondeuna o masvariables, no
necesariamente del mismo tipo, agrupadasbajo un solo
nombre
► Esel equivalente al registro (record) del pascal
► La declaraci´onesdela forma
struct nombre estructura {lista variables} nombre variable ;
► El nombre dela estructura puedeomitirse. Lassiguientes
declaracionesson(casi) equivalentes: todas declaran dos
estructuras (p1 y p2) cada una delas cualescontiene dos
enteros
a. struct COORDENADAS {
int x;
int y;
} p1, p2;
b. struct COORDENADAS {
int x;
int y;
};
struct COORDENADAS p1, p2;
Sistemas Operativos El Lenguaje de programaci´on C 158 / 218
c struct {
int x;
int y;
} p1 , p2;
► Enlas modalidades a) y b) la estructura tiene un nombre
(struct COORDENADAS) quenospodr´ıaservir paradeclarar
m´asestructuras del mismo tipo (o par´ametrosaunafunci´on)
enotra parte delprograma
► Lasestructuras puedeninicializarse enla declaraci´on al igual
queotros tipos devariables, Losvalores desusmiembros
separadospor , y entre llaves ({})
struct COORDENADAS p1={ 5,9 };
Sistemas Operativos El Lenguaje de programaci´on C 159 / 218
Estructuras
Sistemas Operativos El Lenguaje de programaci´on C 160 / 218
Estructuras
Operacionessobreestructuras
Punteros aestructuras
Arrays deestructuras
Estructuras autoreferenciadas
Uniones
Camposdebits
typedef
Ejercicios
Operaciones sobre estructuras
Sistemas Operativos El Lenguaje de programaci´on C 161 / 218
► Cpermite las siguientes operaciones sobre estructuras
► copia oasignaci´on
► accesoasusmiembros
► obtener sudirecci´on con &
► Pasarlascomo argumentosa funciones
► Serdevueltas porfunciones
► Lasestructuras no sepuedencomparar
► Para accederalos miembrosdeunaestructura usamosel
operador .
Conlas declaraciones del apartadoanterior
p1.x=3
p1.y=9;
p2.x=p2.y=0
► Una estructura puedetener miembrosqueseanasuvez
estructuras
Estructuras
Sistemas Operativos El Lenguaje de programaci´on C 162 / 218
Estructuras
Operacionessobreestructuras
Punteros aestructuras
Arrays deestructuras
Estructuras autoreferenciadas
Uniones
Camposdebits
typedef
Ejercicios
Punteros a estructuras
Sistemas Operativos El Lenguaje de programaci´on C 163 / 218
► Ctambi´enpermite punteros aestructuras.
► La declaraci´on deun puntero aunaestructura escomola de un
puntero acualquier otra variable. Sedeclarael objeto
apuntado.
►Tambi´ensonv´alidaslas distintas modalidades vistas a
struct COORDENADAS {
int x;
int y;
} *p1, *p2;
b struct COORDENADAS {
int x;
int y;
};
struct COORDENADAS *p1, *p2;
c struct {
int x;
int y;
Sistemas Operativos El Lenguaje de programaci´on C 164 / 218
} *p1 , *p2;
► Podemosaccederalos miembrosdeuna estructura atrav´es
del puntero dedosmaneras
► Accediendo alaestructura
(*p1).x
Lospar´entesis() sonnecesariospuesel operador . tiene
precedenciasobrela indirecci´on *
► Directamente desdeel puntero mediante el operador ->
p1->x
En general estesistema esel preferido, sobretodo cuando
usamosvariables tipo struct paracrear estructuras dedatos
(listas, pilas, ´arboles. . . )
p->siguiente->siguiente->siguiente
(*(*(*p).siguiente).siguiente).siguiente
► Al igual queconlos otros punteros, la declaraci´on deun puntero
aunaestructura reservaespacioparael puntero pero NO
PARA LA ESTRUCTURA APUNTADA POR E´Lpor lo
queel accesoadicha estructura produceun resultado indefinido
(incluso un error entiempo deejecuci´on)
► Antes deaccederala estructura apuntada debemosinicializar
el puntero
► Asign´andolela direcci´on deunavariable
► Reserv´andolememoriacon alguna funci´on(p.e. malloc)
► Enel siguiente ejemplo reservamosmemoriaparaMAX
estructuras struct COORD y lo asignamosaun puntero. El
operador sizeof nosdevuelve el taman˜odela estructura
► El taman˜o deuna estructura no esnecesariamentela sumadel
taman˜o desusmiembros
struct CORD *p;
p=(struct CORD *) malloc (MAX * sizeof (struct CORD));
Sistemas Operativos El Lenguaje de programaci´on C 165 / 218
Estructuras
Sistemas Operativos El Lenguaje de programaci´on C 166 / 218
Estructuras
Operacionessobreestructuras
Punteros aestructuras
Arrays deestructuras
Estructuras autoreferenciadas
Uniones
Camposdebits
typedef
Ejercicios
Arrays de estructuras
Sistemas Operativos El Lenguaje de programaci´on C 167 / 218
► Cpermite tambi´en hacer arrays de estructuras, la sintaxis es la
misma quepara cualquier otro tipo de variable
► Los arrays de estructuras tambi´en se puede inicializar en la
declaraci´on usando llaves para cada estructura y llaves para
cadaelemento del array
struct PARNUMEROS {
int i;
double x;
} array[]={
{0, 1000.0},
{1, 3.14},
........
{100, 2.5}
};
aunque a veces por comodidad se omiten las llaves de cada
estructura
► En el siguiente ejemplo vemos una funci´on que usaun array de
estructuras para contar el nu´mero de palabras reservadas de C
queseutilizan enunfichero
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#define MAXWORD 100
struct key {
char *word;
int count;
} keytab[] = {
"auto", 0,
"break", 0,
"case", 0,
"char", 0,
"const", 0,
"continue", 0,
"default", 0,
/* ... */
"unsigned", 0,
"void", 0,
"volatile", 0,
"while", 0
};
int getword(char *, int);
int binsearch(char *, struct key *, int);
Sistemas Operativos El Lenguaje de programaci´on C 168 / 218
/* count C keywords */
main()
{
int n;
char word[MAXWORD];
while (getword(word, MAXWORD) != EOF)
if (isalpha(word[0]))
if ((n = binsearch(word, keytab, NKEYS)) >= 0)
keytab[n].count++;
for (n = 0; n < NKEYS; n++)
if (keytab[n].count > 0)
printf("%4d %sn", keytab[n].count, keytab[n].word);
return 0;
}
Sistemas Operativos El Lenguaje de programaci´on C 169 / 218
/* binsearch: find word in tab[0]...tab[n-1] */
int binsearch(char *word, struct key tab[], int n)
{
int cond;
int low, high, mid;
low = 0;
high = n - 1;
while (low <= high) {
mid = (low+high) / 2;
if ((cond = strcmp(word, tab[mid].word)) < 0)
high = mid - 1;
else if (cond > 0)
low = mid + 1;
else
return mid;
}
return -1;
}
Sistemas Operativos El Lenguaje de programaci´on C 170 / 218
Estructuras
Sistemas Operativos El Lenguaje de programaci´on C 171 / 218
Estructuras
Operacionessobreestructuras
Punteros aestructuras
Arrays deestructuras
Estructuras autoreferenciadas
Uniones
Camposdebits
typedef
Ejercicios
Estructuras autoreferenciadas
Sistemas Operativos El Lenguaje de programaci´on C 172 / 218
► Una estructura no puedereferenciarseasi mismaesdecir,
tener unaestructura del mismotipo comomiembro, puesto
queesto dar´ıalugar aunarecursi´oninfinita.
► Lo quesi puedetener comomiembro esuno ovarios punteros a
unaestructura desumismotipo
► Esto nospermite realizar estructuras dedatos enmemoria
struct TNODO{
struct INFO info;
struct TNODO *izq;
struct TNODO *der;
};
Estructuras
Sistemas Operativos El Lenguaje de programaci´on C 173 / 218
Estructuras
Operacionessobreestructuras
Punteros aestructuras
Arrays deestructuras
Estructuras autoreferenciadas
Uniones
Camposdebits
typedef
Ejercicios
Uniones
Sistemas Operativos El Lenguaje de programaci´on C 174 / 218
► Unauni´onesunavariable quecontiene tipos dedatos
distintos eninstantes distintos
► Permite manipular distintos tipos dedatos enla mismazona
de memoria
► Sedeclarademanerasimilar aunaestructura pero conla
palabra union
► El accesoalos miembrosdela union esconel operador . (o
conel operador -> si accedemosatrav´esdeun puntero)
union VARIOS {
int entero;
char bytes[4];
float real;
} u;
► Una union puedecontener arraysy/o estructuras. Una
estructura tambi´enpuedecontener uniones. Est´anpermitidos
tambi´enlos arrays de uniones.
Estructuras
Sistemas Operativos El Lenguaje de programaci´on C 175 / 218
Estructuras
Operacionessobreestructuras
Punteros aestructuras
Arrays deestructuras
Estructuras autoreferenciadas
Uniones
Camposdebits
typedef
Ejercicios
Campos de bits
Sistemas Operativos El Lenguaje de programaci´on C 176 / 218
► Permiten, con unavariable detipo struct tener accesodirecto a
los bits deunentero
► Conunadeclaraci´ondeestetipo
struct {
unsigned int is_keyword : 1;
unsigned int is_extern : 1;
unsigned int is_static : 1;
} flags;
podemosaccederalos bits individualmente como
flags.is_keyword=1;
flags.is_extern=0;
..
if (flags.is_static) {..
► Si los bits comienzanaasignarse por la izquierda opor la
derechay otros detalles sondependientesdela
implementaci´on,por lo queesmasusualusarm´ascarasy
enterospararealizar dichastareas
#define KEYWORD 01
#define EXTRENAL 02
#define STATIC 04
int flags;
flags|=KEYWORD |EXTERN;
if (flags & STATIC) {...
Sistemas Operativos El Lenguaje de programaci´on C 177 / 218
Estructuras
Sistemas Operativos El Lenguaje de programaci´on C 178 / 218
Estructuras
Operacionessobreestructuras
Punteros aestructuras
Arrays deestructuras
Estructuras autoreferenciadas
Uniones
Camposdebits
typedef
Ejercicios
typedef
Sistemas Operativos El Lenguaje de programaci´on C 179 / 218
► Cproporciona una herramienta paraponerle nombresa tipos:
typedef
► Suusoessimilar aunadeclaraci´on devariable precedidadela
palabra typedef. Lo queir´ıaenel lugar del nombredela
variable esel nombredel tipo
typedef int * punteroEntero;
typedef struct NUEVA nueva_t;
Si ahoraquisi´eramos declarar unavariable puntero aentero y
otra detipo struct NUEVA podr´ıamoshacer
punteroEntero p;
nueva_t n;
Estructuras
Sistemas Operativos El Lenguaje de programaci´on C 180 / 218
Estructuras
Operacionessobreestructuras
Punteros aestructuras
Arrays deestructuras
Estructuras autoreferenciadas
Uniones
Camposdebits
typedef
Ejercicios
Ejercicios
Sistemas Operativos El Lenguaje de programaci´on C 181 / 218
► Implementar e C un programa que lee enteros de su entrada
est´andar y los imprime en orden inverso, utilizando una pila.
Implementar lapila
► Conun array
► Conun array de punteros
► De maneradin´amica
► Implementar una lista enCdonde cadaelemento dela lista
contiene una palabra y un entero. El programa leesuentrada
(cada l´ıneatiene unapalabra y un entero) y almacenalos
elementosenla lista ordenadospor el valor del entero.
Introducci´on
Tipos, operadores yexpresiones
Control deflujo
Funciones y estructura deunprograma
Arrays y punteros
Estructuras
Biblioteca C
Herramientas
Sistemas Operativos El Lenguaje de programaci´on C 182 / 218
Biblioteca C
Sistemas Operativos El Lenguaje de programaci´on C 183 / 218
Biblioteca C
Documentaci´on enl´ınea
Asignaci´on dememoria
Funciones decaracteres
Cadenasdecaracteres
Entrada/salida conformato
Entrada/salida conformato afichero
Entrada/salida conformato amemoria
Entrada/salida sinformato
Ejercicios
Biblioteca C
Sistemas Operativos El Lenguaje de programaci´on C 184 / 218
► El lenguaje Cesmuy pequen˜o,sin embargo,muchasdelas
tareaspodemos hacerlas por medio dela biblioteca C. por
ejemplo, usamosfuncionesdela biblioteca C para
► asignar y desasignar memoria
► manipulado decadenasy caracteres
► funciones matem´aticas
► entrada salida
► . ..
► Enlos sistemastipo UNIX la informaci´onsobrelas funciones de
la biblioteca Cest´adisponible enla documentaci´on en l´ınea
(secci´on3delas p´aginasdemanual). Por ejemplo, para obtener
informaci´onsobre printf
$ man 3 printf
oenotrossistemas
$ man -s 3 printf
Biblioteca C
Sistemas Operativos El Lenguaje de programaci´on C 185 / 218
Biblioteca C
Documentaci´on enl´ınea
Asignaci´on dememoria
Funciones decaracteres
Cadenasdecaracteres
Entrada/salida conformato
Entrada/salida conformato afichero
Entrada/salida conformato amemoria
Entrada/salida sinformato
Ejercicios
Documentaci´on enl´ınea
Sistemas Operativos El Lenguaje de programaci´on C 186 / 218
► La informaci´onenl´ıneadeunafunci´onnosindica, adem´asde la
sintaxis dedicha funci´on,si esnecesarioalgu´nfichero includeo
hayqueindicarle alguna librer´ıa adicional
► Por ejemplo, si miramos la p´agina de manual de la funci´on
sqrt, vemos que es necesario incluir el fichero <math.h> y
queadem´ashayqueenlazarcon-lm
SQRT(3) Linux Programmer’s Manual
N
A
M
E
s q r t , s q r t f , s q r t l - square root function
SYNOPSIS
#include <math.h>
double sqrt(double x);
f l o a t s q r t f ( f l o a t x);
long double sqrtl(long double x);
Link with -lm.
. . . . .
Biblioteca C
Sistemas Operativos El Lenguaje de programaci´on C 187 / 218
Biblioteca C
Documentaci´on enl´ınea
Asignaci´on dememoria
Funciones decaracteres
Cadenasdecaracteres
Entrada/salida conformato
Entrada/salida conformato afichero
Entrada/salida conformato amemoria
Entrada/salida sinformato
Ejercicios
Asignacio´ndememoria
Sistemas Operativos El Lenguaje de programaci´on C 188 / 218
► Para asignar memoria tenemos
void *malloc(size_t size);
► Le pasamoscomo argumento la cantidad debytes que
queremosreservar (t´ıpicamente usamossizeof para
determinarlo)
► Nos devuelve una direcci´on dememoria, como un puntero
gen´erico(void *), donde hay disponible dicha cantidad de
bytes (no m´as).Si no queremosque el compilador deun aviso al
asignarlo a, por ejemplo, un puntero aentero, debemos hacer
una conversi´onde tipo
► Cuandoya no necesitemosla memoria asignada con malloc
podemos desasignarla con
void free(void *ptr);
► Utilizar m´asmemoria dela asignada o hacer freesobreuna
direcci´onqueno ha sido obtenida con malloc produce
resultados indefinidos, t´ıpicamente un error entiempo de
ejecuci´on
► Otras funciones relacionadas: calloc, realloc
Biblioteca C
Sistemas Operativos El Lenguaje de programaci´on C 189 / 218
Biblioteca C
Documentaci´on enl´ınea
Asignaci´on dememoria
Funciones decaracteres
Cadenasdecaracteres
Entrada/salida conformato
Entrada/salida conformato afichero
Entrada/salida conformato amemoria
Entrada/salida sinformato
Ejercicios
Funciones de caracteres
Sistemas Operativos El Lenguaje de programaci´on C 190 / 218
► La biblioteca Cproporcionaunaseriedefuncionesque
permiten tratar concaracteres.Susprototipos est´an
declarados e<ctype.h>
int isalnum(int c);
int isalpha(int c);
int isascii(int c);
int isblank(int c);
int iscntrl(int c);
int isdigit(int c);
int isgraph(int c);
int islower(int c);
int isprint(int c);
int ispunct(int c);
int isspace(int c);
int isupper(int c);
int isxdigit(int c);
Biblioteca C
Sistemas Operativos El Lenguaje de programaci´on C 191 / 218
Biblioteca C
Documentaci´on enl´ınea
Asignaci´on dememoria
Funciones decaracteres
Cadenasdecaracteres
Entrada/salida conformato
Entrada/salida conformato afichero
Entrada/salida conformato amemoria
Entrada/salida sinformato
Ejercicios
Cadenas de caracteres
Sistemas Operativos El Lenguaje de programaci´on C 192 / 218
► EnCno existen las variable tipo cadenas(strings). Existen
► arrays decaracteres
► punteros acar´acter
► Cuandosealmacena unacadena decaracteresdebeestar
terminada por el car´actercuyo c´odigoes0(’0’) yaqueeslo
queesperanencontrar las funciones de cadenas
► Lasfuncionesdecadenasesperanunadirecci´on dememoria
(char *); comoel nombredeun array esla direcci´on donde se
almacenael array,las funciones decadenaspuedenrecibir tanto
un array comoun puntero
► Hay algunas diferencias sutiles entre el array y el puntero a
car´acter
► Consideremos la siguiente declaraci´on
char a[MAX]="esto es una cadena";
► Sedeclaraun array deMAX caracteresy seinicializa a
‘‘esto es una cadena’’
► El siguiente c´odigoproduce un error de compilaci´on
a="la cadena ha cambiado de valor";
puesto queel nombredel array esla direcci´on dondecomienza el
array,y ´estano puedecambiarse
► Podr´ıamoscambiar el valor del array conuna delas funciones de
cadena
strcpy(a,"la cadena ha cambiado de valor");
Sistemas Operativos El Lenguaje de programaci´on C 193 / 218
► Consideremos la siguiente declaraci´on
char *a="esto es una cadena";
► Sedeclaraun puntero y seinicializa ala direcci´on dememoria
donde est´ala constante literal ‘‘esto es unacadena’’
► El siguiente c´odigoNO produceerror decompilaci´on ni en
tiempo deejecuci´on
a="la cadena ha cambiado de valor";
seasigna al puntero la direcci´on dememoriadonde est´ala
constante literal ‘‘la cadena ha cambiado de valor’’
► Si intentamos cambiar el valor depuntero conunadelas
funciones decadena
strcpy(a,"la cadena ha cambiado de valor");
el resultado esindefinido puesto queestamosintentando
sobreescribir la cadena‘‘esto es una cadena’’ queest´a
donde el compilador hapuesto las constantes literales con
otra cadena,queadem´asesdemayorlongitud
Sistemas Operativos El Lenguaje de programaci´on C 194 / 218
► Consideremos la siguiente declaraci´on
char *a;
a=(char *) malloc (MAX*sizeof (char));
asigna al puntero aunadirecci´on dememoria donde hay
espacioparaMAXcaracteres
► La sentencias
strcpy(a,"esto es una cadena");
strcpy(a,"la cadena ha cambiado de valor");
sonperfectamentecorrectas siemprey cuandoMAX sea
mayorquela longitud de‘‘la cadena ha cambiado de
valor’’ +1
► Sin embargola asignaci´on
a="la cadena ha cambiado de valor";
hacequeel valor del puntero seaahorael dela direcci´on dela
constante literal ‘‘la cadena ha cambiado de valor’’ ,
y hemosperdido la memoriaasignada con malloc
Sistemas Operativos El Lenguaje de programaci´on C 195 / 218
► Cuandohacemosuna asignaci´on esunaasignaci´on entre
punteros.
► Seasignan direcciones dememoria
► No secopian cadenas
► Si queremoscopiar cadenasdebemosusarla funci´onde
librer´ıa strcpy
► Esresponsabilidaddel programador queenel sitio adondese
copia hayaespaciosuficientepara la cadenaquesequiere copiar
► El espacionecesarioesla longitud dela cadena+ 1 byte
adicional (para el caracter ’0’ quemarcael fin decadena.
► Semuestran posiblesimplementaciones delas funciones dela
librer´ıastrcpy (que copia unacadena) y strdup (que creaun
duplicado)
Sistemas Operativos El Lenguaje de programaci´on C 196 / 218
void strcpy(char *s, char *t)
{
int i=0;
while ((s[i] = t[i]) != ’0’)
i++;
}
char *strdup(char *s) /* make a duplicate of s */
{
char *p = (char *) malloc(strlen(s)+1);
if (p == NULL)
return NULL;
strcpy(p, s);
return p;
}
Sistemas Operativos El Lenguaje de programaci´on C 197 / 218
► Funciones decaracteres:resumen(string.h)
Sistemas Operativos El Lenguaje de programaci´on C 198 / 218
► char *strcpy(char *dest, const char *orig);
► char *strncpy(char *dest, const char *orig, size_t n);
► void *memcpy(void *dest, const void *src, size_t n);
► size_t strlen(const char *s);
► char *strcat(char *dest, const char *src);
► char *strncat(char *dest, const char *src, size_t n);
► int strcmp(const char *s1, const char *s2);
► int strncmp(const char *s1, const char *s2, size_t n);
► strstr, strchr,...
► Otras funciones (stdlib.h): atoi,atof,atol,...
Biblioteca C
Sistemas Operativos El Lenguaje de programaci´on C 199 / 218
Biblioteca C
Documentaci´on enl´ınea
Asignaci´on dememoria
Funciones decaracteres
Cadenasdecaracteres
Entrada/salida conformato
Entrada/salida conformato afichero
Entrada/salida conformato amemoria
Entrada/salida sinformato
Ejercicios
Entrada/salida con formato
Sistemas Operativos El Lenguaje de programaci´on C 200 / 218
► El prototipo deestasfuncionesest´aen <stdio.h>
► Si queremoshacerla entrada salida por caracteres tenemos
int getchar()
int putchar(int c)
► Para cadenasdecaracteres
char * gets(char *s)
int puts(const char *s)
► La funci´ondeentrada salida conformato esprintf(. .. ]
► El formato deprintf es
int printf(const char *format, ...)
format esuna cadenadecaracterescompuestapor
Sistemas Operativos El Lenguaje de programaci´on C 201 / 218
► caracteresquesoncopiadosala salida est´andar
► especificacionesdeconversi´on: comienzanconle caracter%y
terminan conun caracterde conversi´on.
► La primera especificaci´ondeconversi´on serefiere al primer
argumento despu´esdel format, la segundaal siguiente . . . .
► El significado delos caracteres enuna especificaci´on de
conversi´on es:
► - El ajuste es a la izquierda
► N.M N ancho m´ınimo (para float d´ıgitos antes del . decimal).
M nu´mero m´ınimo de d´ıgitos que se imprimir´an para un entero
(para float nu´merode d´ıgitosa la derecha del . decimal)
► h para entero corto l para entero largo
► Caracter de conversi´on
► El caracterdeconversi´on especifica qu´ehayque imprimir
Sistemas Operativos El Lenguaje de programaci´on C 202 / 218
Especificaciones de conversi´on (%u, %d,...) Codigos deescape
car´acter argumento salida C´odigo salida
d,i entero entero con signo n nueva l´ınea
u entero entero sinsigno t tabulador
o entero entero en octal sinsigno b backspace
x, X entero entero en hexadecimal sin signo r retorno carro
f real real con punto ysigno ¨ comillas
e,E real notaci´on exponencial con signo ´ ap´ostrofo
g, G  
c car´acter car´acter ? ?
s cad. Chars cadena de caracteres
% imprime un %
p void depende implementaci´on
ld, lu, lx, lo entero entero largo
► Por ejemplo:
printf (‘‘real: %2.4f; entero: %Xn", x,n);
imprimir´ıa algo como:
real: 3.1516; entero: FF09465
► Si queremoshacerentrada con formato, utilizamos scanf
int scanf(const char *format, ...);
► La especificaci´ondelos formatos descanf escomola de printf.
► Hay quetener encuenta queenla lista deargumentosascanf
no sele suministran las variables quequeremosleer, sino las
direcciones de memoria delas variables quequeremosleer
(para queseapor referencia)
► Ejemplo
int n; char caracter;
scanf ("%d",&n);
printf ("n El cuadrado de %d es : %d",n, n*n);
scanf ("%c",&caracter);
printf ("n He le´ıdo el car´acter: %c", caracter);
Sistemas Operativos El Lenguaje de programaci´on C 203 / 218
Biblioteca C
Sistemas Operativos El Lenguaje de programaci´on C 204 / 218
Biblioteca C
Documentaci´on enl´ınea
Asignaci´on dememoria
Funciones decaracteres
Cadenasdecaracteres
Entrada/salida conformato
Entrada/salida conformato afichero
Entrada/salida conformato amemoria
Entrada/salida sinformato
Ejercicios
Entrada/salida con formato a fichero
Sistemas Operativos El Lenguaje de programaci´on C 205 / 218
► Lasfuncionesprintf,scanf, puts, gets, putchar, getchar operan
sobrela entrada est´andary la salida est´andar.Existen funciones
totalmente an´alogasqueoperan sobre ficheros
► Losficherospodemos abrirlos confopen y cerrarlos con fclose
FILE *fopen(const char *path, const char *mode);
int fclose(FILE *fp);
► Lasfuncionesparaentrada y salida afichero son
int fprintf(FILE *stream, const char *format, ...);
int fscanf(FILE *stream, const char *format, ...);
char *gets(char *s);
int fputs(const char *s, FILE *stream);
int fgetc(FILE *stream);
int fputc(int c, FILE *stream);
Biblioteca C
Sistemas Operativos El Lenguaje de programaci´on C 206 / 218
Biblioteca C
Documentaci´on enl´ınea
Asignaci´on dememoria
Funciones decaracteres
Cadenasdecaracteres
Entrada/salida conformato
Entrada/salida conformato afichero
Entrada/salida conformato amemoria
Entrada/salida sinformato
Ejercicios
Entrada/salida con formato a memoria
Sistemas Operativos El Lenguaje de programaci´on C 207 / 218
► Existen tambi´enfunciones quenospermiten simplemente
hacerla entrada/salida sobrevariables enmemoria.
► Estasfunciones operan exactamente igual quelas quehemos
visto, pero requierenun argumento adicional
► Una variable tipo puntero a car´acter, donde se va a colocar la
salida formateada adecuadamente (o desde donde se pretende
leer la entrada)
int sprintf(char *str, const char *format, ...);
int sscanf(const char *str, const char *format, ...);
Biblioteca C
Sistemas Operativos El Lenguaje de programaci´on C 208 / 218
Biblioteca C
Documentaci´on enl´ınea
Asignaci´on dememoria
Funciones decaracteres
Cadenasdecaracteres
Entrada/salida conformato
Entrada/salida conformato afichero
Entrada/salida conformato amemoria
Entrada/salida sinformato
Ejercicios
Entrada/salida sin formato
► Quiz´ala maneramasc´omodaderealizar e/s seala delas
llamadas al sistemaenUNIX; estasllamadas simplemente leen
bytes y escribenbytes enun fichero
► Si queremosquetengan un formato espec´ıfico,podemos
formatear previamente los datos
► Para abrir un fichero
int open(const char *pathname, int flags, mode_t mode);
pathname nombre del fichero
flags modo deapertura O RDONLY, O WRONLY, O RDWR, O
CREAT O EXCL. . .
modepermisosdel fichero (solo si secreael fichero)
► Devuelve un entero (descriptor delfichero) queseusaenread
y write
Sistemas Operativos El Lenguaje de programaci´on C 209 / 218
► Para leer oescribir
ssize_t read(int fd, void *buf, size_t count);
ssize_t write(int fd, const void *buf, size_t count);
fd descriptor defichero (obtenido con open
buf direcci´on dememoriapara la transferencia dedatos
count nu´merodebytes dee/s
► Devuelven ennu´merodebytes quesehan transferido
► paracerrar el fichero
int close(int fd);
► Otras funciones relacionadas(tras abrir fichero confopen())
size_t fread (void *ptr, size_t tam, size_t n, FILE *stream)
size_t fwrite(void *ptr, size_t tam, size_t n, FILE *stream)
int fseek(FILE *stream, long desplto, int origen);
long ftell(FILE *stream);
Sistemas Operativos El Lenguaje de programaci´on C 210 / 218
Biblioteca C
Sistemas Operativos El Lenguaje de programaci´on C 211 / 218
Biblioteca C
Documentaci´on enl´ınea
Asignaci´on dememoria
Funciones decaracteres
Cadenasdecaracteres
Entrada/salida conformato
Entrada/salida conformato afichero
Entrada/salida conformato amemoria
Entrada/salida sinformato
Ejercicios
Ejercicios
Sistemas Operativos El Lenguaje de programaci´on C 212 / 218
► Realizar enCun programa quereciba comopar´ametroel
nombredeun fichero y generetres ficheros
► Uno quecontiene los mismoscaracteres pero enorden inverso
► Otro que contiene las mismas palabras pero en ordeninverso
► Otro que contiene las mismas l´ıneas pero en orden inverso
► Sesuponequela separaci´onentre l´ıneasestadada por una
ocurrencia del caracterfin del´ınea(’n’), y la separaci´on entre
palabraspor una om´asocurrencias del caracterespacio (’ ’) o
del caractertab (’t’)
► Puede usarsestrtok
Introducci´on
Tipos, operadores yexpresiones
Control deflujo
Funciones y estructura deunprograma
Arrays y punteros
Estructuras
Biblioteca C
Herramientas
Sistemas Operativos El Lenguaje de programaci´on C 213 / 218
Herramientas
Sistemas Operativos El Lenguaje de programaci´on C 214 / 218
Valgrind
Depuracio´nde memoria conValgrind
Sistemas Operativos El Lenguaje de programaci´on C 215 / 218
► Valgrind esunaherramienta quepermite detectar fallos enla
gesti´onde memoria
► Usodememoriasin asignar
► Accesosincorrectos amemoria
► Memoria asignada, no liberada y perdida (memory leaks)
► Para usareldepurador
a. Compilamos con -g -O0
$ gcc -g -O0 ejercicio1.c
b. Invocamos valgrind pas´andoleel ejecutable (y suspar´ametros)
como par´ametro
$ valgrind --leak-check=full --show-reachable=yes a.out
Ejemplo de depuracio´nde memoria con Valgrind (I)
Sistemas Operativos El Lenguaje de programaci´on C 216 / 218
#include <stdio.h>
#include <malloc.h>
main() {
int i;
int *v;
v=(int*) malloc (10*sizeof(int));
for (i=0;i<=10;i++) // aqu´ı hay un acceso no valido!
v[i]=i*2;
for(i=0;i<10;i++) printf("%d",v[i]);
// free(v); // no se libera memoria!!!
}
Ejemplo de depuracio´nde memoria con Valgrind (II)
Sistemas Operativos El Lenguaje de programaci´on C 217 / 218
$ valgr ind --leak-ch eck=full --show-reachable=yes a . ou t
==27888== Memcheck, a memory er r or detector
==27888== Copyright (C) 2002-2010, and GNUGPL’d, by J u l i a n Seward e t a l .
==27888== Using Valgr ind -3.6.1 and LibVEX; rerun with -h for copyright in fo
==27888== Command: . / a . o u t
==27888==
==27888== In valid wr ite of s i z e 4
==27888== a t 0x8048448: main ( p . c: 1 1 )
==27888== Address 0x41b8050 i s 0 bytes a f t e r a block of s i z e 40 a l l oc’ d
==27888== a t 0x4025018: malloc ( i n /usr/lib/valgrind/vgpreload_memch eck -x86-linux.so)
==27888== by 0x8048428: main ( p . c : 8 )
==27888==
0 2 4 6 8 10 12 14 16 18 ==27888==
==27888== HEAPSUMMARY:
==27888== i n use a t e x i t : 40 bytes i n 1 blocks
==27888== t o t a l heap usage: 1 a l l o c s , 0 f r e e s , 40 bytes a l l oca t ed
==27888==
==27888== 40 bytes i n 1 blocks ar e d efi n i t el y l o s t i n l os s record 1 of 1
==27888== a t 0x4025018: malloc ( i n /usr/lib/valgrind/vgpreload_memch eck -x86-linux.so)
==27888== by 0x8048428: main ( p . c : 8 )
==27888==
==27888== LEAK SUMMARY:
d efi n i t el y l o s t : 40 bytes i n 1 blocks
i n d i r ect l y l o s t : 0 bytes i n 0 blocks
possibly l o s t : 0 bytes i n 0 blocks
s t i l l r each able: 0 bytes i n 0 blocks
suppressed: 0 bytes i n 0 blocks
==27888==
==27888==
==27888==
==27888==
==27888==
==27888==
==27888== For counts of detected and suppressed e r r o r s , rerun with : -v
==27888== ERRORSUMMARY:2 er r or s from 2 con texts (suppr essed: 11 from 6)
Ejemplo de depuracio´nde memoria con Valgrind (III)
Sistemas Operativos El Lenguaje de programaci´on C 218 / 218
Trascorregir errores
$ valgrind --leak-check=full --show-reachable=yes . / a . o u t
==12056== Memcheck, a memory error detector
==12056== Copyright (C) 2002-2010, and G
N
UGPL’d, by Julian Seward e t a l .
==12056== Using Valgrind-3.6.1 and LibVEX; rerun with -h for copyright info
==12056== Command: . / a . o u t
==12056==
0 2 4 6 8 10 12 14 16 18 ==12056==
==12056== HEAPSUMMARY:
in use a t e x i t : 0 bytes in 0 blocks
t o t a l heap usage: 1 allocs, 1 f r ees , 40 bytes allocated
==12056==
==12056==
==12056==
==12056== All heap blocks were freed - - no leaks are possible
==12056==
==12056== For counts of detected and suppressed errors, rerun with: -v
==12056== ERRORSUMMARY:0 errors from 0 contexts (suppressed: 11 from 6)

Más contenido relacionado

Similar a El_Lenguaje_de_programacion_C.pptx (20)

IntroLenguajeC.ppt
IntroLenguajeC.pptIntroLenguajeC.ppt
IntroLenguajeC.ppt
 
2 estructura programa-c
2 estructura programa-c2 estructura programa-c
2 estructura programa-c
 
Lenguajec
LenguajecLenguajec
Lenguajec
 
Lenguaje c
Lenguaje c Lenguaje c
Lenguaje c
 
C(++) programacion en c y c++
C(++)   programacion en c y c++C(++)   programacion en c y c++
C(++) programacion en c y c++
 
Programación en c y c++
Programación en c y c++Programación en c y c++
Programación en c y c++
 
Programación en c y c++
Programación en c y c++Programación en c y c++
Programación en c y c++
 
Lenguaje Borland C - Estructura y Componentes
Lenguaje Borland C - Estructura y ComponentesLenguaje Borland C - Estructura y Componentes
Lenguaje Borland C - Estructura y Componentes
 
Programación c
Programación cProgramación c
Programación c
 
Programación c
Programación cProgramación c
Programación c
 
Turbo c
Turbo cTurbo c
Turbo c
 
Lenguaje c completo 6 g x revisar x los estudiantes
Lenguaje c completo 6 g x revisar x los estudiantesLenguaje c completo 6 g x revisar x los estudiantes
Lenguaje c completo 6 g x revisar x los estudiantes
 
C
C C
C
 
programacion-Devian-C.pdf
programacion-Devian-C.pdfprogramacion-Devian-C.pdf
programacion-Devian-C.pdf
 
Unmsm02 2008
Unmsm02 2008Unmsm02 2008
Unmsm02 2008
 
Programa
ProgramaPrograma
Programa
 
Unidad 3
Unidad 3Unidad 3
Unidad 3
 
Curso de c antonio lebron bocanegra
Curso de c   antonio lebron bocanegraCurso de c   antonio lebron bocanegra
Curso de c antonio lebron bocanegra
 
1. introducción a c#
1.  introducción a c#1.  introducción a c#
1. introducción a c#
 
Programación en c
Programación en cProgramación en c
Programación en c
 

Último

Arenas Camacho-Practica tarea Sesión 12.pptx
Arenas Camacho-Practica tarea Sesión 12.pptxArenas Camacho-Practica tarea Sesión 12.pptx
Arenas Camacho-Practica tarea Sesión 12.pptxJOSEFERNANDOARENASCA
 
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdfPARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdfSergioMendoza354770
 
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptxCrear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptxNombre Apellidos
 
Presentación inteligencia artificial en la actualidad
Presentación inteligencia artificial en la actualidadPresentación inteligencia artificial en la actualidad
Presentación inteligencia artificial en la actualidadMiguelAngelVillanuev48
 
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptxMedidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptxaylincamaho
 
Plan Sarmiento - Netbook del GCBA 2019..
Plan Sarmiento - Netbook del GCBA 2019..Plan Sarmiento - Netbook del GCBA 2019..
Plan Sarmiento - Netbook del GCBA 2019..RobertoGumucio2
 
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptx
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptxEl_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptx
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptxAlexander López
 
El uso de las TIC's en la vida cotidiana.
El uso de las TIC's en la vida cotidiana.El uso de las TIC's en la vida cotidiana.
El uso de las TIC's en la vida cotidiana.241514949
 
Segunda ley de la termodinámica TERMODINAMICA.pptx
Segunda ley de la termodinámica TERMODINAMICA.pptxSegunda ley de la termodinámica TERMODINAMICA.pptx
Segunda ley de la termodinámica TERMODINAMICA.pptxMariaBurgos55
 
dokumen.tips_36274588-sistema-heui-eui.ppt
dokumen.tips_36274588-sistema-heui-eui.pptdokumen.tips_36274588-sistema-heui-eui.ppt
dokumen.tips_36274588-sistema-heui-eui.pptMiguelAtencio10
 
El uso de las tic en la vida ,lo importante que son
El uso de las tic en la vida ,lo importante  que sonEl uso de las tic en la vida ,lo importante  que son
El uso de las tic en la vida ,lo importante que son241514984
 
Google-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptx
Google-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptxGoogle-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptx
Google-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptxAlexander López
 
definicion segun autores de matemáticas educativa
definicion segun autores de matemáticas  educativadefinicion segun autores de matemáticas  educativa
definicion segun autores de matemáticas educativaAdrianaMartnez618894
 
Actividad integradora 6 CREAR UN RECURSO MULTIMEDIA
Actividad integradora 6    CREAR UN RECURSO MULTIMEDIAActividad integradora 6    CREAR UN RECURSO MULTIMEDIA
Actividad integradora 6 CREAR UN RECURSO MULTIMEDIA241531640
 
La era de la educación digital y sus desafios
La era de la educación digital y sus desafiosLa era de la educación digital y sus desafios
La era de la educación digital y sus desafiosFundación YOD YOD
 
Mapa-conceptual-del-Origen-del-Universo-3.pptx
Mapa-conceptual-del-Origen-del-Universo-3.pptxMapa-conceptual-del-Origen-del-Universo-3.pptx
Mapa-conceptual-del-Origen-del-Universo-3.pptxMidwarHenryLOZAFLORE
 
R1600G CAT Variables de cargadores en mina
R1600G CAT Variables de cargadores en minaR1600G CAT Variables de cargadores en mina
R1600G CAT Variables de cargadores en minaarkananubis
 
FloresMorales_Montserrath_M1S3AI6 (1).pptx
FloresMorales_Montserrath_M1S3AI6 (1).pptxFloresMorales_Montserrath_M1S3AI6 (1).pptx
FloresMorales_Montserrath_M1S3AI6 (1).pptx241522327
 
Hernandez_Hernandez_Practica web de la sesion 11.pptx
Hernandez_Hernandez_Practica web de la sesion 11.pptxHernandez_Hernandez_Practica web de la sesion 11.pptx
Hernandez_Hernandez_Practica web de la sesion 11.pptxJOSEMANUELHERNANDEZH11
 
El uso delas tic en la vida cotidiana MFEL
El uso delas tic en la vida cotidiana MFELEl uso delas tic en la vida cotidiana MFEL
El uso delas tic en la vida cotidiana MFELmaryfer27m
 

Último (20)

Arenas Camacho-Practica tarea Sesión 12.pptx
Arenas Camacho-Practica tarea Sesión 12.pptxArenas Camacho-Practica tarea Sesión 12.pptx
Arenas Camacho-Practica tarea Sesión 12.pptx
 
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdfPARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
 
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptxCrear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
 
Presentación inteligencia artificial en la actualidad
Presentación inteligencia artificial en la actualidadPresentación inteligencia artificial en la actualidad
Presentación inteligencia artificial en la actualidad
 
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptxMedidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
 
Plan Sarmiento - Netbook del GCBA 2019..
Plan Sarmiento - Netbook del GCBA 2019..Plan Sarmiento - Netbook del GCBA 2019..
Plan Sarmiento - Netbook del GCBA 2019..
 
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptx
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptxEl_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptx
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptx
 
El uso de las TIC's en la vida cotidiana.
El uso de las TIC's en la vida cotidiana.El uso de las TIC's en la vida cotidiana.
El uso de las TIC's en la vida cotidiana.
 
Segunda ley de la termodinámica TERMODINAMICA.pptx
Segunda ley de la termodinámica TERMODINAMICA.pptxSegunda ley de la termodinámica TERMODINAMICA.pptx
Segunda ley de la termodinámica TERMODINAMICA.pptx
 
dokumen.tips_36274588-sistema-heui-eui.ppt
dokumen.tips_36274588-sistema-heui-eui.pptdokumen.tips_36274588-sistema-heui-eui.ppt
dokumen.tips_36274588-sistema-heui-eui.ppt
 
El uso de las tic en la vida ,lo importante que son
El uso de las tic en la vida ,lo importante  que sonEl uso de las tic en la vida ,lo importante  que son
El uso de las tic en la vida ,lo importante que son
 
Google-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptx
Google-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptxGoogle-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptx
Google-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptx
 
definicion segun autores de matemáticas educativa
definicion segun autores de matemáticas  educativadefinicion segun autores de matemáticas  educativa
definicion segun autores de matemáticas educativa
 
Actividad integradora 6 CREAR UN RECURSO MULTIMEDIA
Actividad integradora 6    CREAR UN RECURSO MULTIMEDIAActividad integradora 6    CREAR UN RECURSO MULTIMEDIA
Actividad integradora 6 CREAR UN RECURSO MULTIMEDIA
 
La era de la educación digital y sus desafios
La era de la educación digital y sus desafiosLa era de la educación digital y sus desafios
La era de la educación digital y sus desafios
 
Mapa-conceptual-del-Origen-del-Universo-3.pptx
Mapa-conceptual-del-Origen-del-Universo-3.pptxMapa-conceptual-del-Origen-del-Universo-3.pptx
Mapa-conceptual-del-Origen-del-Universo-3.pptx
 
R1600G CAT Variables de cargadores en mina
R1600G CAT Variables de cargadores en minaR1600G CAT Variables de cargadores en mina
R1600G CAT Variables de cargadores en mina
 
FloresMorales_Montserrath_M1S3AI6 (1).pptx
FloresMorales_Montserrath_M1S3AI6 (1).pptxFloresMorales_Montserrath_M1S3AI6 (1).pptx
FloresMorales_Montserrath_M1S3AI6 (1).pptx
 
Hernandez_Hernandez_Practica web de la sesion 11.pptx
Hernandez_Hernandez_Practica web de la sesion 11.pptxHernandez_Hernandez_Practica web de la sesion 11.pptx
Hernandez_Hernandez_Practica web de la sesion 11.pptx
 
El uso delas tic en la vida cotidiana MFEL
El uso delas tic en la vida cotidiana MFELEl uso delas tic en la vida cotidiana MFEL
El uso delas tic en la vida cotidiana MFEL
 

El_Lenguaje_de_programacion_C.pptx

  • 1. El Lenguaje de programaci´onC Sistemas Operativos Sistemas Operativos El Lenguaje de programaci´on C 1 / 218 Universidade daCorun˜a
  • 2. El Lenguaje de programaci´onC I Sistemas Operativos El Lenguaje de programaci´on C 2 / 218 Introducci´on Caracter´ısticasdel lenguaje C Estructura deun programa C Primeros ejemplos Compilaci´on deun programa Directivas del precompilador Depuraci´on make Ejercicios Tipos, operadores y expresiones Nombresdevariables Tipos y taman˜osdedatos Constantes Declaracionesdevariables Operadoresaritm´eticos Operadoresderelaci´ony l´ogicos
  • 3. El Lenguaje de programaci´onC II Funciones y estructura deun programa Sistemas Operativos El Lenguaje de programaci´on C 3 / 218 Conversiones detipo Operadoresdebit Incremento y decremento, asignaci´on y expresiones Expresi´on condicional Precedencia y ordeneevaluaci´on Ejercicios Control deflujo Sentencias y bloques if else else-if switch bucleswhile, for ydo..while break ycontinue gotoy etiquetas Ejercicios
  • 4. El Lenguaje de programaci´onC III Sistemas Operativos El Lenguaje de programaci´on C 4 / 218 funciones funciones queno devuelven enteros Variables externas Variables est´aticas Variables registro Inicializaci´on Recursividad EL preprocesadorC Ejercicios Arrays y punteros Punteros ydirecciones Punteros y argumentosafunciones Operacionessobrepunteros Arrays y punteros Arrays de punteros Arrays multidimensionales
  • 5. El Lenguaje de programaci´onC IV Sistemas Operativos El Lenguaje de programaci´on C 5 / 218 Punteros y arraysmultidimensionales Argumentos enla l´ıneadecomando Punteros afunciones Ejercicios Estructuras Estructuras Operacionessobreestructuras Punteros aestructuras Arrays deestructuras Estructuras autoreferenciadas Uniones Camposdebits typedef Ejercicios Biblioteca C Biblioteca C
  • 6. El Lenguaje de programaci´onC V Sistemas Operativos El Lenguaje de programaci´on C 6 / 218 Documentaci´on enl´ınea Asignaci´on dememoria Funciones decaracteres Cadenasdecaracteres Entrada/salida con formato Entrada/salida conformato afichero Entrada/salida conformato amemoria Entrada/salida sin formato Ejercicios Herramientas Valgrind
  • 7. Introducci´on Tipos, operadores yexpresiones Control deflujo Funciones y estructura deunprograma Arrays y punteros Estructuras Biblioteca C Herramientas Sistemas Operativos El Lenguaje de programaci´on C 7 / 218
  • 8. Introducci´on Sistemas Operativos El Lenguaje de programaci´on C 8 / 218 Caracter´ısticasdel lenguaje C Estructura deun programa C Primeros ejemplos Compilaci´on deun programa Directivas del precompilador Depuraci´on make Ejercicios
  • 9. Caracter´ısticas del lenguaje C Sistemas Operativos El Lenguaje de programaci´on C 9 / 218 ► Esel lenguaje deprogramaci´ondeprop´ositogeneralasociado al sistemaoperativo UNIX ► Esun lenguaje demedio nivel. Trata conobjetos b´asicos como car´acteres,nu´meros. . . ; tambi´enconbits y direcciones de memoria ► Poseeunagranportabilidad ► Seutiliza parala programaci´ondesistemas:construcci´onde interpretes, compiladores, editores detexto, etc
  • 10. ► El lenguaje Cconsta de ► El lenguaje Cpropiamente dicho: tipos dedatos, expresiones y estructuras decontrol ► Extensionesenforma demacrosy un amplio conjunto de librer´ıas predefinidas Sistemas Operativos El Lenguaje de programaci´on C 10 / 218
  • 11. Introducci´on Sistemas Operativos El Lenguaje de programaci´on C 11 / 218 Caracter´ısticasdel lenguaje C Estructura deun programa C Primeros ejemplos Compilaci´on deun programa Directivas del precompilador Depuraci´on make Ejercicios
  • 12. Estructura de un programa C Sistemas Operativos El Lenguaje de programaci´on C 12 / 218 ► Un programa eCconsta deuno om´asm´odulos(ficheros fuentes) ► Cadam´odulopuedecontener ► directivas del precompilador, p.e para“incluir” otros ficheros (#include) y “definir” constantesy macros (#define) ► declaracionesdevariables y prototipos defunciones ► una o m´asfunciones ► comentarios ► Cadafunci´onpuedecontener ► directivas delprecompilador ► declaraciones ► uno om´asbloques ► comentarios
  • 13. ► Cadabloque puede contener ► directivas del precompilador ► declaraciones ► una om´assentencias ► comentarios Sistemas Operativos El Lenguaje de programaci´on C 13 / 218
  • 14. ► Cadasentencia debeestarterminada por ; ► Cadabloque desentencias seencierra entre llaves {.. . } ► La funci´ondenominada main esla queprimero seejecuta ► Loscomentarios puedenaparecerencualquier lugar del c´odigo y seinsertan entre /* y */ as´ı /* esto es un comentario*/ ► oentre // y final de l´ınea // esto es otro comentario Sistemas Operativos El Lenguaje de programaci´on C 14 / 218
  • 15. Introducci´on Sistemas Operativos El Lenguaje de programaci´on C 15 / 218 Caracter´ısticasdel lenguaje C Estructura deun programa C Primeros ejemplos Compilaci´on deun programa Directivas del precompilador Depuraci´on make Ejercicios
  • 16. Primeros ejemplos Sistemas Operativos El Lenguaje de programaci´on C 16 / 218 #include <stdio.h> main() { printf("hola, primer programa en Cn"); }
  • 17. #include <stdio.h> main() { int fahr, celsius; int lower, upper, step; lower=0; upper=300; step=20; fahr=lower; while(fahr<=upper) { celsius=5*(fahr-32)/9; printf("%dt%dn",fahr,celsius); fahr=fahr+step; } } Sistemas Operativos El Lenguaje de programaci´on C 17 / 218
  • 18. Introducci´on Sistemas Operativos El Lenguaje de programaci´on C 18 / 218 Caracter´ısticasdel lenguaje C Estructura deun programa C Primeros ejemplos Compilaci´on deun programa Directivas del precompilador Depuraci´on make Ejercicios
  • 19. Compilacio´n de un programa Sistemas Operativos El Lenguaje de programaci´on C 19 / 218 ► Normalmente invocamos al compilador concc ogcc (el compilador degnu) ► Cuandotecleamoscc programa.c paragenerarun ejecutable apartir deun fichero fuente obtenemosun ejecutable, t´ıpicamentedenominado a.out.Sin embargoserealizan tres tareas ► Pasopor el preprocesadorC. Esel queprocesalas l´ıneasque comienzan con # (pe #include, #define. . . ). Puede invocarse directamente con cpp ► La compilaci´onpropiamente dicha. Generaficheros objeto (.o) a partir delos ficheros fuente. Puedeinvocarse como cc -c ► El enlazado. Realizado por ld
  • 20. Introducci´on Sistemas Operativos El Lenguaje de programaci´on C 20 / 218 Caracter´ısticasdel lenguaje C Estructura deun programa C Primeros ejemplos Compilaci´on deun programa Directivas del precompilador Depuraci´on make Ejercicios
  • 21. Directivas del precompilador Sistemas Operativos El Lenguaje de programaci´on C 21 / 218 #include Incluye el fichero, cuyo nombre seindica, para sucompilaci´on con el resto delc´odigo ► Si el nombre del fichero va entre <...> se busca en el directorio include del sistema (/usr/include). Por ejemplo #include <stdio.h> hace que el fichero /usr/include/stdio.h se incluya en ese punto para ser compilado con nuestro fichero fuente ► El nombre se puede poner entre comillas (“) y el sistema lo buscar´a en el directorio actual (tambi´en se puede poner una ruta absoluta) ► Los ficheros se suelen denominar .h y contienen declaraciones de tipos, variables y prototipos de funciones (son ficheros fuente que pueden verse)
  • 22. #define Define un s´ımbolo,esdecir cadaocurrencia deeses´ımboloes sustituida por sudefinici´on. Porejemplo Sistemas Operativos El Lenguaje de programaci´on C 22 / 218 ► El C distingue entre mayu´sculasy minu´sculas, aunque la costumbre es utilizar mayu´sculaspara los s´ımbolosdefinidos por el preprocesador ► ejemplo #define M A X 1024 hace que todas las ocurrencias de la cadena MAX dentro del c´odigo son sustituidas por 1024 ► El c´odigo que se compila lleva 1024 donde iba MAX ► Si MAX iba dentro de comillas ’ ’ . . . ‘ ‘ , no sesustituye
  • 23. #include <stdio.h> #define UPPER 300 #define LOWER 0 #define STEP 20 main() { int fahr, celsius; fahr=LOWER; while(fahr<=UPPER) { celsius=5*(fahr-32)/9; printf("%dt%dn",fahr,celsius); fahr=fahr+STEP; } } Sistemas Operativos El Lenguaje de programaci´on C 23 / 218
  • 24. Introducci´on Sistemas Operativos El Lenguaje de programaci´on C 24 / 218 Caracter´ısticasdel lenguaje C Estructura deun programa C Primeros ejemplos Compilaci´on deun programa Directivas del precompilador Depuraci´on make Ejercicios
  • 25. Depuracio´n Sistemas Operativos El Lenguaje de programaci´on C 25 / 218 ► Paradepurar programasdisponemos del depurador,quenos permite ejecutar los programasenun entorno controlado ► Para usareldepurador a. Compilamos con cc -g $gcc -g ejercicio1.c b. Invocamos el depuradorpas´andoleel ejecutable como par´ametro antonio@abyecto:~$ gdb a.out GNU gdb (GDB) 7.3-debian Copyright (C) 2011 Free Software Foundation, Inc. ....... (gdb) ► Dentro del depuradorpodemosestablecer puntos deruptura con break (break numerol´ınea o break nombrefunci´on), ejecutar pasoapasocon step o next,ver variables con display . . . . El depurador dispone deayudaenl´ınea, mediante help
  • 26. Introducci´on Sistemas Operativos El Lenguaje de programaci´on C 26 / 218 Caracter´ısticasdel lenguaje C Estructura deun programa C Primeros ejemplos Compilaci´on deun programa Directivas del precompilador Depuraci´on make Ejercicios
  • 27. make Sistemas Operativos El Lenguaje de programaci´on C 27 / 218 ► Facilita el procesodegeneraci´on y actualizaci´ondeun programa. ► Determina autom´aticamentequ´epartesdeun programa deben recompilarseante una actualizaci´ondealgunosm´odulos y las recompila. ► Secreanun archivo Makefile conlas dependenciasentre los ficheros: un fichero debeactualizarse si alguna desus dependenciasesm´asreciente ► El Makefile define tambi´enlos mandatos necesarios para actualizar cadaarchivo enbaseasus dependencias
  • 28. ► El Makefile estaformadopor unaseriedereglas.Donde cadaregla tiene el siguiente formato objetivo: dependencia1dependencia2. . . mandato1 mandato2 mandato3 ... ► N´otesequeantesdecadamandato hayun caracter tab ► Para compilar usamosla orden‘‘make objetivo’’ que ► Encuentra la regla correspondiente aobjetivo ► Trata susdependenciascomo objetivos y lasresuelve recursivamente ► Dentro del Makefile sepuedendefinir variables (y accedera susvalores) comoenel shell:VAR=valor paradefinir la variable y ${VAR} o$(VAR) paraaccederasuvalor. $ @se refiere al nombredelobjetivo Sistemas Operativos El Lenguaje de programaci´on C 28 / 218
  • 29. Ejemplo muy sencillo de make Sistemas Operativos El Lenguaje de programaci´on C 29 / 218 ► Consideremos el siguiente programa (programa.c) #include "funcion1.h" #include "funcion2.h" main() { int a=MAX1,b=MAX2; funcion1(); funcion2(); } ► Donde funcion1.h #define MAX1 1000 void funcion1(void); ► y funcion2.h #define MAX2 2000 void funcion2(void);
  • 30. Ejemplo muy sencillo de make Sistemas Operativos El Lenguaje de programaci´on C 30 / 218 ► Adem´as,funcion1.c es #include "funcion1.h" void funcion1(void) { int i=MAX1; return; } ► y funcion2.c es #include "funcion2.h" void funcion2(void) { int j=MAX2; return; }
  • 31. Ejemplo muy sencillo de make Sistemas Operativos El Lenguaje de programaci´on C 31 / 218 ► si queremoscompilarlo, y generarun programa llamado programa.out 1. Compilar´ıamos funcion1.c gcc -c funcion1.o funcion1.c 2. Compilar´ıamos funcion2.c gcc -c funcion2.o funcion2.c 3. Compilar´ıamosprograma.c dela siguiente manera gcc -o programa.out programa.c funcion2.o funcion1.o ► Cadavezquesemodificase uno delos archivos habr´ıaque repetir alguna (o todas) delas anteriores compilaciones
  • 32. Ejemplo muy sencillo de make Sistemas Operativos El Lenguaje de programaci´on C 32 / 218 ► El siguiente archivo Makefile seocupa dedecidir quehay quecompilar y hacerlo programa.out: programa.c funcion1.h funcion2.h funcion1.o funcion2.o gcc -o programa.out programa.c funcion2.o funcion1.o funcion1.o: funcion1.h funcion1.c gcc -c funcion1.o funcion1.c funcion2.o: funcion2.h funcion2.c gcc -c funcion2.o funcion2.c limpiar: rm programa.out funcion1.o funcion2.o
  • 33. Otro ejemplo de make Sistemas Operativos El Lenguaje de programaci´on C 33 / 218 CC=gcc CFLAGS=-g OBJS2=prac2.o aux1.o all: prac1 prac2 prac1: prac1.o aux1.o gcc -g -o prac1 prac1.o aux1.o prac2: $(OBJS2) ${CC} ${CFLAGS} -o $@ ${OBJS2} prac1.o prac2.o: prac.h clean: rm -f prac1.o aux1.o ${OBJS2}
  • 34. Introducci´on Sistemas Operativos El Lenguaje de programaci´on C 34 / 218 Caracter´ısticasdel lenguaje C Estructura deun programa C Primeros ejemplos Compilaci´on deun programa Directivas del precompilador Depuraci´on make Ejercicios
  • 35. Ejercicios Sistemas Operativos El Lenguaje de programaci´on C 35 / 218 ► Compilar los programasdeejemplo deesta secci´on ► Observar las salida del preprocesador de cada uno deellos ► Usarel depurador paraejecutar pasoapasolos dosu´ltimos y ver comocambian devalor las variables enel bucle ► Crearun Makefile paraun archivo y compilarlo conmake
  • 36. Introducci´on Tipos, operadores yexpresiones Control deflujo Funciones y estructura deunprograma Arrays y punteros Estructuras Biblioteca C Herramientas Sistemas Operativos El Lenguaje de programaci´on C 36 / 218
  • 37. Tipos, operadores y expresiones Sistemas Operativos El Lenguaje de programaci´on C 37 / 218 Nombresdevariables Tipos y taman˜osdedatos Constantes Declaracionesdevariables Operadoresaritm´eticos Operadoresderelaci´ony l´ogicos Conversiones detipo Operadoresdebit Incremento y decremento, asignaci´on y expresiones Expresi´oncondicional Precedencia y ordeneevaluaci´on Ejercicios
  • 38. Nombres de variables ► los nombresdevariables puedentener letras, nu´merosy el s´ımbolo’ ’. ► Deben empezarpor unaletra (pueden empezarpor ’ ’ pero no esrecomendable puesesel criterio queusanlas rutinas dela biblioteca) ► Puedenllevar mayu´sculasy minu´sculas.El Cdistingue entre mayu´sculasy minu´sculas ► La costumbreesquelas variables van enminu´sculay las constantesenmayu´scula ► Laspalabrasreservadas if,else ...no puedenusarsecomo nombresde variables Sistemas Operativos El Lenguaje de programaci´on C 38 / 218
  • 39. Tipos, operadores y expresiones Sistemas Operativos El Lenguaje de programaci´on C 39 / 218 Nombresdevariables Tipos y taman˜osdedatos Constantes Declaracionesdevariables Operadoresaritm´eticos Operadoresderelaci´ony l´ogicos Conversiones detipo Operadoresdebit Incremento y decremento, asignaci´on y expresiones Expresi´oncondicional Precedencia y ordeneevaluaci´on Ejercicios
  • 40. Tipos y taman˜osde datos Sistemas Operativos El Lenguaje de programaci´on C 40 / 218 ► El Ctiene pocostipos dedatos char Un byte. Contiene un caracter (o un nu´meroentre 0 y 255) int Un entero. El taman˜o dependedel sistema dondeestemos float Un real double Un real endoble precisi´on ► Adem´asint puedesershort o long y tanto int como char puedensersigned o unsigned ► unsignedlong int, unsingedlong, ► El taman˜odepende del compilador pero int no esmenor que short ni mayorquelong ► Existe tambi´enel long long int conmayorrango y el long double conprecisi´onextendida paralos reales
  • 41. Tipos, operadores y expresiones Sistemas Operativos El Lenguaje de programaci´on C 41 / 218 Nombresdevariables Tipos y taman˜osdedatos Constantes Declaracionesdevariables Operadoresaritm´eticos Operadoresderelaci´ony l´ogicos Conversiones detipo Operadoresdebit Incremento y decremento, asignaci´on y expresiones Expresi´oncondicional Precedencia y ordeneevaluaci´on Ejercicios
  • 42. Constantes Sistemas Operativos El Lenguaje de programaci´on C 42 / 218 ► Una constante entera esint (ejemplo 12714) ► Si queremosquesealong le ponemosel sufijo ’l’ o ’L’. (ejemplo 12714L) ► Una constante con un punto decimal o un exponente es un double (ejemplos 3.141516, 1e-5) ► Si queremosqueseafloat le ponemosel sufijo ’f’ o ’F’ (ejemplos 3.141516f,1e-5F) ► Si una constanteenteracomienzapor 0seentiende queest´a en octal y si comienzapor 0x o0X enhexadecimal ► Ejemplos 034892(octal) 0xffff4000(hexadecimal)
  • 43. ► Una constante car´actersepone entre comillas simples (ejemplo ’a’). Puedeaparecerenoperaciones y suvalor esel c´odigodedicho caracter ► Una constante car´actertambi´ensepuedeexpresar por su c´odigoenoctal ohexadecimal. Ejemplos: ’077’ (octal) o ’x3f’ (hexadecimal) ► Algunas constantes especiales:’t’ (tab) ’n’ (fin del´ınea’) ’r’ retorno decarro . . . ► Una constante cadenaseencierra entre comillas dobles (”. . . “). LascadenasenCest´anterminadaspor el caracter ’0’, Sistemas Operativos El Lenguaje de programaci´on C 43 / 218
  • 44. ► Una expresi´onconstante esuna expresi´onquesolo incluye constantes.Puedeserevaluada entiempo decompilaci´on y serutilizada enlugar deuna constante #define MAXIMO 1024 char linea[MAXIMO/2 +20]; ► Un casoparticular deconstantes sonlos tipos enumerados. Un tipo enumeradoesuna lista devalores enterosconstantes enum boolean {FALSE, TRUE}; ► Salvo queseespecifique otra cosa,comienzanen0, as´ıFALSE ser´ıa0y TRUE 1 ► Tambi´enpuedeespecificarse el valor de comienzo enum dias {LUNES=1, MARTES, MIERCOLES, JUEVES, VIERNES, SABADO, DOMINGO}; Sistemas Operativos El Lenguaje de programaci´on C 44 / 218
  • 45. Tipos, operadores y expresiones Sistemas Operativos El Lenguaje de programaci´on C 45 / 218 Nombresdevariables Tipos y taman˜osdedatos Constantes Declaracionesdevariables Operadoresaritm´eticos Operadoresderelaci´ony l´ogicos Conversiones detipo Operadoresdebit Incremento y decremento, asignaci´on y expresiones Expresi´oncondicional Precedencia y ordeneevaluaci´on Ejercicios
  • 46. Declaraciones de variables Sistemas Operativos El Lenguaje de programaci´on C 46 / 218 ► Todas las variables deben ser declaradas antes de su uso. ► Lasdeclaraciones debenapareceral principio decadafunci´on o bloque de sentencias ► La declaraci´on consta deun tipo devariable y unalista de variables separadasporcoma int i,j; float x,pi; unsigned long longitud, contador; ► Lasvariables puedeninicializarse enla declaraci´on float pi=3.1416; unsigned long contador=0; ► Puede utilizarse el simbol const paraindicar quela variable no puedeser cambiada const float e=2.7182;
  • 47. Tipos, operadores y expresiones Sistemas Operativos El Lenguaje de programaci´on C 47 / 218 Nombresdevariables Tipos y taman˜osdedatos Constantes Declaracionesdevariables Operadoresaritm´eticos Operadoresderelaci´ony l´ogicos Conversiones detipo Operadoresdebit Incremento y decremento, asignaci´on y expresiones Expresi´oncondicional Precedencia y ordeneevaluaci´on Ejercicios
  • 48. Operadores aritm´eticos Sistemas Operativos El Lenguaje de programaci´on C 48 / 218 + suma - resta * multiplicaci´on / divisi´on. Si los operandos sonenterosla divisi´onesentera % resto entero. No admite operandos float odouble
  • 49. #include <stdio.h> #define UPPER 300 #define LOWER 0 #define STEP 20 main() { float fahr, celsius; fahr=LOWER; while(fahr<=UPPER) { celsius=5.0/9.0*(fahr-32) printf("%ft%fn",fahr,celsius); fahr=fahr+STEP; } } Sistemas Operativos El Lenguaje de programaci´on C 49 / 218
  • 50. Tipos, operadores y expresiones Sistemas Operativos El Lenguaje de programaci´on C 50 / 218 Nombresdevariables Tipos y taman˜osdedatos Constantes Declaracionesdevariables Operadoresaritm´eticos Operadoresderelaci´ony l´ogicos Conversiones detipo Operadoresdebit Incremento y decremento, asignaci´on y expresiones Expresi´oncondicional Precedencia y ordeneevaluaci´on Ejercicios
  • 51. Operadores de relaci´onylo´gicos Sistemas Operativos El Lenguaje de programaci´on C 51 / 218 ► Operadoresderelaci´on < menor que <= menoro igual que > mayor que >= mayoroigual que = = igual a ! = distinto
  • 52. ► Operadores l´ogicos && AND || OR ! NOT ► Losoperadoresl´ogicosseevalu´andeizquierda aderecha,y se detiene la evaluaci´on tan pronto como se conoce elresultado. Por ejemplo i<MAXIMO && (linea[i]=getchar())!=’n’ && linea[i]!=EOF Comprobar´ıa primero quei esmenorqueMAXIMO; si lo es asigna el valor quedevuelve getchar() alinea[i] y comprueba queesdistinto defin de l´ınea.y enesecasocompruebaque linea[i] no es EOF Sistemas Operativos El Lenguaje de programaci´on C 52 / 218
  • 53. Tipos, operadores y expresiones Sistemas Operativos El Lenguaje de programaci´on C 53 / 218 Nombresdevariables Tipos y taman˜osdedatos Constantes Declaracionesdevariables Operadoresaritm´eticos Operadoresderelaci´ony l´ogicos Conversiones detipo Operadoresdebit Incremento y decremento, asignaci´on y expresiones Expresi´oncondicional Precedencia y ordeneevaluaci´on Ejercicios
  • 54. Conversiones de tipo Sistemas Operativos El Lenguaje de programaci´on C 54 / 218 ► Cuandoenunaoperaci´onaparecentipos distintos, el C convierte el tipo demenorrango al tipo demayorantesde realizar laoperaci´on ► Podemosforzar la conversi´ondetipos poniendo antesdela variable el tipo al quequeremosconvertir. ► Por ejemplo, la funci´onsin esperaun argumento detipo double. Podemospasarleuna variable entera haciendo una conversi´on de tipo double seno; int n; seno= sin ((double) n); ... double centigrados, fahrenheit=55.3; centigrados = 5/9 * (fahrenheit - 32); //77F = 25C centigrados = 5.0/9 * (fahrenheit - 32);
  • 55. Tipos, operadores y expresiones Sistemas Operativos El Lenguaje de programaci´on C 55 / 218 Nombresdevariables Tipos y taman˜osdedatos Constantes Declaracionesdevariables Operadoresaritm´eticos Operadoresderelaci´ony l´ogicos Conversiones detipo Operadoresdebit Incremento y decremento, asignaci´on y expresiones Expresi´oncondicional Precedencia y ordeneevaluaci´on Ejercicios
  • 56. Operadores de bit Sistemas Operativos El Lenguaje de programaci´on C 56 / 218 ► Podemosoperar sobrelos bits deuna variable entera (las variables char sonun tipo deenteros). Todossonoperadores binarios, excepto el complemento a 1 & AND bit abit | ORbit a bit ˆ XOR bit abit << Desplazamiento debits ala izquierda >> Desplazamiento debits ala derecha ˜ Complemento a1
  • 57. Tipos, operadores y expresiones Sistemas Operativos El Lenguaje de programaci´on C 57 / 218 Nombresdevariables Tipos y taman˜osdedatos Constantes Declaracionesdevariables Operadoresaritm´eticos Operadoresderelaci´ony l´ogicos Conversiones detipo Operadoresdebit Incremento y decremento, asignaci´on y expresiones Expresi´oncondicional Precedencia y ordeneevaluaci´on Ejercicios
  • 58. Incremento y decremento, asignaci´on y expresiones Sistemas Operativos El Lenguaje de programaci´on C 58 / 218 ► Losoperadoresincremento (++) y decremento(−−) pueden usarsedentro deexpresiones.Si precedenala variable, el incremento odecrementoseproduce antesdeusarla, encaso contrario despu´es.Ejemplo: linea[i++]=’a’; asigna alinea[i] el valor ’a’ y luego incrementael valor dei, mientras que linea[--i]=’z’ primero decrementael valor dei y luego le asigna alinea[i] el valor ’z’ ► Cuandosemodifica el valor deunavariable apartir deun valor anterior, puedeescribirsedeforma m´ascompacta ► xOPERADOR =expresi´on;equivale ax=x OPERADOR (expresi´on);
  • 59. x+=expresion; equivale a x=x+expresi´on; x-=expresi´on; equivale a x=x-expresi´on; x*=expresion; equivale a x=x*expresi´on; Sistemas Operativos El Lenguaje de programaci´on C 59 / 218 . . . x>> =expresion; equivale a x=x>>expresi´on; x&=expresi´on; equivale a x=x&expresi´on; . . . x+=2; /*x=x+2*/ x*=4+y; /*x=x*(4+y)*/
  • 60. Tipos, operadores y expresiones Sistemas Operativos El Lenguaje de programaci´on C 60 / 218 Nombresdevariables Tipos y taman˜osdedatos Constantes Declaracionesdevariables Operadoresaritm´eticos Operadoresderelaci´ony l´ogicos Conversiones detipo Operadoresdebit Incremento y decremento, asignaci´on y expresiones Expresi´oncondicional Precedencia y ordeneevaluaci´on Ejercicios
  • 61. Expresi´on condicional Sistemas Operativos El Lenguaje de programaci´on C 61 / 218 ► Esdela forma expre1?expre2: expre3 ► Seevalu´anexpre1, si escierta (distinta de0) el resultadoeslo quevalga expre2 ► Si es0, el resultado eslo quevalga expre3 ► Ejemplos char * a; a= (p==NULL)? "cadena1": gets(p); int n; n= i*j*k ? 2567: (int) sqrt (pi); printf ("Resultado: %sn" (p!=NULL)? p:" error");
  • 62. Tipos, operadores y expresiones Sistemas Operativos El Lenguaje de programaci´on C 62 / 218 Nombresdevariables Tipos y taman˜osdedatos Constantes Declaracionesdevariables Operadoresaritm´eticos Operadoresderelaci´ony l´ogicos Conversiones detipo Operadoresdebit Incremento y decremento, asignaci´on y expresiones Expresi´oncondicional Precedencia y ordeneevaluaci´on Ejercicios
  • 63. Precedencia y orden e evaluaci´on Sistemas Operativos El Lenguaje de programaci´on C 63 / 218 ► El Cno especificaenqueordenseevalu´anlos operandos de una expresi´on. Por ejemplo, enla expresi´onx = f() + g () no sabemossi seevaluar´aprimero f() og() ► El Ctampoco especifica enqueordenseevalu´anlos par´ametrosaunafunci´on, printf (‘‘%d %d’’,++i,i) produce un resultado indeterminado ► Lasoperacionesl´ogicasseevalu´andeizquierda aderechay se detiene la evaluaci´ontan pronto comoseconozca elresultado ► El Cs´ıdefine unaprecedencia entre distintos operadores, Adem´ascadaoperador tiene unaasociatividad, comopuede verseenla tabla siguiente
  • 64. OPERADORES asociatividad () [] -> . izquierda aderecha ! ~ ++ -- - * & (tipo) sizeof derechaaizquierda * / izquierda aderecha + - izquierda aderecha << >> izquierda aderecha < <= > >= izquierda aderecha == != izquierda aderecha & izquierda aderecha ^ izquierda aderecha | izquierda aderecha && izquierda aderecha || izquierda aderecha ?: derechaaizquierda = += -= *= /= %= &= |= etc derechaaizquierda , izquierda aderecha Sistemas Operativos El Lenguaje de programaci´on C 64 / 218
  • 65. Tipos, operadores y expresiones Sistemas Operativos El Lenguaje de programaci´on C 65 / 218 Nombresdevariables Tipos y taman˜osdedatos Constantes Declaracionesdevariables Operadoresaritm´eticos Operadoresderelaci´ony l´ogicos Conversiones detipo Operadoresdebit Incremento y decremento, asignaci´on y expresiones Expresi´oncondicional Precedencia y ordeneevaluaci´on Ejercicios
  • 66. Ejercicios Sistemas Operativos El Lenguaje de programaci´on C 66 / 218 ► Escribir un programa enCquenosimprima los taman˜osde todos los tipos dedatos ► Escribir una funci´onInvierteBitsC queinvierte los bits deun caractersinsigno ► Escribir una funci´onInvierteBitsS queinvierte los bits deun entero corto sin signo. ► Escribir una funci´onInvierteBitsL queinvierte los bits deun entero largo sin signo ► Hacer un programa queimprima los enterosdel 0al 100y el resultado deinvertir losbits ► Considerando los nu´merosdel 0 al 100 como caracteressin signo ► Considerando los nu´merosdel 0 al 100 como enteros cortos sin signo ► Considerando los nu´meros del 0 al 100 como enteros largos sin signo
  • 67. Introducci´on Tipos, operadores yexpresiones Control deflujo Funciones y estructura deunprograma Arrays y punteros Estructuras Biblioteca C Herramientas Sistemas Operativos El Lenguaje de programaci´on C 67 / 218
  • 68. Control de flujo Sistemas Operativos El Lenguaje de programaci´on C 68 / 218 Sentencias y bloques if else else-if switch bucleswhile, for y do..while break y continue gotoy etiquetas Ejercicios
  • 69. ► Una expresi´onseguidaenun ; esunasentencia ► Toda sentencia debeir terminada con; ► Puedenir varias sentencias enuna misma l´ınea ► Lasllaves{}seempleanparaagrupar sentencias.enlo que se denomina bloque ► Un bloque essint´acticamenteequivalente auna sentencia ► Dentro deun bloque puedehaber sentencias y declaraciones Sistemas Operativos El Lenguaje de programaci´on C 69 / 218
  • 70. Control de flujo Sistemas Operativos El Lenguaje de programaci´on C 70 / 218 Sentencias y bloques if else else-if switch bucleswhile, for y do..while break y continue gotoy etiquetas Ejercicios
  • 71. if else Sistemas Operativos El Lenguaje de programaci´on C 71 / 218 if (expresi´on) sentencia1 else sentencia2 ► Seevalu´aexpresi´on.Si esdistinta de0 (cierta) seejecuta sentencia1, si es0seejecutasentencia2 ► El elsees opcional ► Tanto sentencia1 comosentencia2 puedenserun bloque se sentencias entre llaves {} ► Expresi´onno termina con ;
  • 72. ► Dado queel elseesopcional, unasentencia elsesiempreva conel if inmediatamente anterior ► El siguiente c´odigoesincorrecto if (n>0) if (a>b) printf ("a es mayor que bn"); else printf ("n es menor que 0n"); ► La versi´oncorrectaser´ıa if (n>0) { if (a>b) printf ("a es mayor que bn"); } else printf ("n es menor que 0n"); Sistemas Operativos El Lenguaje de programaci´on C 72 / 218
  • 73. Control de flujo Sistemas Operativos El Lenguaje de programaci´on C 73 / 218 Sentencias y bloques if else else-if switch bucleswhile, for y do..while break y continue gotoy etiquetas Ejercicios
  • 74. else-if Sistemas Operativos El Lenguaje de programaci´on C 74 / 218 if (expresi´on1) sentencia1 elseif(expresi´on2) sentencia2 elseif(expresi´on3) sentencia3 . .. else sentencian ► Permite tomar decisionesmu´ltiples ► Seevalu´anen orden
  • 75. Control de flujo Sistemas Operativos El Lenguaje de programaci´on C 75 / 218 Sentencias y bloques if else else-if switch bucleswhile, for y do..while break y continue gotoy etiquetas Ejercicios
  • 76. switch Sistemas Operativos El Lenguaje de programaci´on C 76 / 218 switch(expresi´on){ case constante1: sentencias case constante2: sentencias caseconstante3: sentencias . .. default: sentencias } ► Permite tomar una decisi´onmu´ltiple basadaenuna expresi´on quepuedetomar un nu´merodevalores constantes enteros (los char sonun tipo de entero) ► El valor deexpresi´onseva comparandoconlas constantes por ordeny una vezquecoincide con unadeellas seejecutan todas las sentencias (incluidas las delos cases siguientes) hasta quese encuentra la sentencia break ► Esto permite agrupar varios valores constantesquecompartan una mismaacci´on ► Si no queremosquepasedeun case al siguiente, debemos terminarlo conbreak
  • 77. #include <stdio.h> main() /* count digits, white space, others */ { int c, i, nwhite, nother, ndigit[10]; nwhite = nother = 0; for (i = 0; i < 10; i++) ndigit[i] = 0; while ((c = getchar()) != EOF) { switch (c) { case ’0’: case ’1’: case ’2’: case ’3’: case ’4’: case ’5’: case ’6’: case ’7’: case ’8’: case ’9’: ndigit[c-’0’]++; break; case ’ ’: case ’n’: case ’t’: nwhite++; break; default: nother++; break; } } printf("digits ="); for (i = 0; i < 10; i++) printf(" %d", ndigit[i]); printf(", white space = %d, other = %dn", nwhite, nother); return 0; } Sistemas Operativos El Lenguaje de programaci´on C 77 / 218
  • 78. Control de flujo Sistemas Operativos El Lenguaje de programaci´on C 78 / 218 Sentencias y bloques if else else-if switch bucleswhile, for y do..while break y continue gotoy etiquetas Ejercicios
  • 79. bucleswhile, for ydo..while Sistemas Operativos El Lenguaje de programaci´on C 79 / 218 while (expresi´on) sentencia ► Seevalu´aexpresi´on, y si esdistinta de0 seejecutasentencia ► sentencia debeestarterminada por ; ► sentencia puedeserun bloque sesentencias entre llaves { }
  • 80. int strlen(char s[]) { int i; i=0; while (s[i]!= ’0’) ++i; return i; } Sistemas Operativos El Lenguaje de programaci´on C 80 / 218
  • 81. for (expr1; expr2;expr3) sentencia ► Equivale exactamente a expr1; while (expr2){ sentencia expr3; } ► La expresiones del for, adiferencia deotros lenguajes, no tienen por queserreferidas aenteros, puedenserexpresiones decualquier tipo Sistemas Operativos El Lenguaje de programaci´on C 81 / 218
  • 82. int atoi(char s[]) { int i, n; n=0; for(i=0; s[i]>=’0’ && s[i]<=’9’; ++i) n=10*n+(s[i]-’0’); return n; } Sistemas Operativos El Lenguaje de programaci´on C 82 / 218
  • 83. do sentencia while (expresi´on) ► Seejecutasentencia y despu´esseevalu´aexpresi´on, conlo que sentencia seejecuta al menosuna vez ► sentencia debeestarterminada por ; ► sentencia puedeserun bloque sesentencias entre llaves { } Sistemas Operativos El Lenguaje de programaci´on C 83 / 218
  • 84. Control de flujo Sistemas Operativos El Lenguaje de programaci´on C 84 / 218 Sentencias y bloques if else else-if switch bucleswhile, for y do..while break y continue gotoy etiquetas Ejercicios
  • 85. break ycontinue Sistemas Operativos El Lenguaje de programaci´on C 85 / 218 ► Cproporciona dosmodosdesalida delos bucles: break y continue break Provoca la salida del bucle. Si hayvarios bucles anidados provoca la salida deaquel dondeseencuentra continue Provoca la salida dela presenteiteraci´on del bucle. Sevuelve ala condici´on. ► break seutiliza tambi´enparala salida del switch int i; for (i=1;i<10;i++) { if (i) continue; //break; printf("n i vale %d",i); }
  • 86. Control de flujo Sistemas Operativos El Lenguaje de programaci´on C 86 / 218 Sentencias y bloques if else else-if switch bucleswhile, for y do..while break y continue gotoy etiquetas Ejercicios
  • 87. goto yetiquetas Sistemas Operativos El Lenguaje de programaci´on C 87 / 218 ► Aunque no sonformalmente necesarias,ni convenientes, C disponedeuna sentencia goto y etiquetas ► Unaetiqueta tiene el mismo formato queun nombrede variable, seguidadedos puntos ► Debeestarenla mismafunci´onendonde seencuentra el goto for ( ... ) for ( ... ) { for ( ... ) { ... if (disaster) goto error; } ... error: /* clean up the mess */
  • 88. Control de flujo Sistemas Operativos El Lenguaje de programaci´on C 88 / 218 Sentencias y bloques if else else-if switch bucleswhile, for y do..while break y continue gotoy etiquetas Ejercicios
  • 89. Ejercicios Sistemas Operativos El Lenguaje de programaci´on C 89 / 218 ► Escribir una funci´onenCConvierteAEnt, queapartir deuna cadenadecaracteresquecontiene la representaci´on deun entero enunabase,y dicha basenosdevuelve elentero ► Escribir una funci´on en C ConvierteACad, que a partir de un entero y una base nos devuelve una representaci´on de entero endicha base ► Comprobar quesoncorrectas ► Podemossuponer quela longitud m´aximadela cadenaes16 ► hacer un programa en Cque a imprima todos los enteros del 32 al 64 en todas las basesde 2 a 16. Imprime un entero (en las 16 bases)por l´ınea
  • 90. Introducci´on Tipos, operadores yexpresiones Control deflujo Funciones y estructura deunprograma Arrays y punteros Estructuras Biblioteca C Herramientas Sistemas Operativos El Lenguaje de programaci´on C 90 / 218
  • 91. Funciones y estructura de un programa Sistemas Operativos El Lenguaje de programaci´on C 91 / 218 funciones funciones queno devuelven enteros Variables externas Variablesest´aticas Variables registro Inicializaci´on Recursividad EL preprocesadorC Ejercicios
  • 92. funciones ► Un programa eCesuna colecci´onde funciones. ► Una deesasfuncionessellama main y esla primeraen ejecutarse ► Lasfuncionespuedenresidir enuno ovarios ficheros fuente ► Cadafunci´ontiene la forma tipo dedato nombrefuncion (declaraciones argumentos) { declaraciones y sentencias } ► Sepuedeomitir el tipo dedato quedevuelve la funci´on(en esecasoseasumequeesint Sistemas Operativos El Lenguaje de programaci´on C 92 / 218
  • 93. ► Una funci´onpuedeno tener argumentosono tener declaraciones o sentencias funcion_simple() { } ► Cuandounafunci´onno lleva par´ametrosono devuelve ningu´n valor seusael t´ermino void void funcion_nada(void) Sistemas Operativos El Lenguaje de programaci´on C 93 / 218
  • 94. #include <stdio.h> #define MAXLINE 1000 /* maximum input line length */ int getline(char line[], int max) int strindex(char source[], char searchfor[]); char pattern[] = "ould"; /* pattern to search for */ /* find all lines matching pattern */ main() { char line[MAXLINE]; int found = 0; while (getline(line, MAXLINE) > 0) if (strindex(line, pattern) >= 0) { Sistemas Operativos El Lenguaje de programaci´on C 94 / 218
  • 95. printf("%s", line); found++; } return found; } /* getline: get line into s, return length */ int getline(char s[], int lim) { int c, i; i = 0; while (--lim > 0 && (c=getchar()) != EOF && c != ’n’) s[i++] = c; if (c == ’n’) s[i++] = c; s[i] = ’0’; return i; Sistemas Operativos El Lenguaje de programaci´on C 95 / 218
  • 96. } /* strindex: return index of t in s, -1 if none */ int strindex(char s[], char t[]) { int i, j, k; for (i = 0; s[i] != ’0’; i++) { for (j=i, k=0; t[k]!=’0’ && s[j]==t[k]; j++, k++) ; if (k > 0 && t[k] == ’0’) return i; } return -1; } Sistemas Operativos El Lenguaje de programaci´on C 96 / 218
  • 97. ► Lasfuncionesdevuelven valores mediante la sentenciareturn ► El formato es return expresi´on; o return (expresi´on); ► expresi´onseconvierte al tipo dedato quedevuelvela funci´on ► Puedeaparecerencualquier parte deuna funci´ony provoca la inmediata salida de ella ► Si dicha sentencia aparecedentro deun bucle provoca la salida dela funci´ony por tanto del bucle Sistemas Operativos El Lenguaje de programaci´on C 97 / 218
  • 98. Funciones y estructura de un programa Sistemas Operativos El Lenguaje de programaci´on C 98 / 218 funciones funciones queno devuelven enteros Variables externas Variablesest´aticas Variables registro Inicializaci´on Recursividad EL preprocesadorC Ejercicios
  • 99. funciones que no devuelven enteros Sistemas Operativos El Lenguaje de programaci´on C 99 / 218 ► Casumequetoda funci´on,salvoqueseespecifiqueen contrario, devuelve un entero ► Si tenemosunafunci´onquedevuelve un valor queno esun entero, y sobretodo, si la definici´ondedicha funci´onaparece enel c´odigodespu´esdela primeravezqueesllamada, debemos declararla ► Esto sehacedeclarando el tipo quedevuelve la funci´on. ► Podemosdeclarar tambi´enlos par´ametrosquerecibe, as´ıel compilador podr´acomprobar la sintaxis cuandoes llamada ► En el ejemplo siguiente podemos ver quesedeclaran los valores devueltos por las funciones llamadas desde main
  • 100. #include <stdio.h> #include <ctype.h> #define MAXLINE 100 /* rudimentary calculator */ main() { double sum, atof(char []); //<-- Declaraci´on funci´on char line[MAXLINE]; int getline(char line[], int max); sum = 0; while (getline(line, MAXLINE) > 0) printf("t%gn", sum += atof(line)); return 0; } Sistemas Operativos El Lenguaje de programaci´on C 100 / 218
  • 101. double atof(char s[]) { double val, power; int i, sign; for (i = 0; isspace(s[i]); i++) /* skip white space */ ; sign = (s[i] == ’-’) ? -1 : 1; if (s[i] == ’+’ || s[i] == ’-’) i++; for (val = 0.0; isdigit(s[i]); i++) val = 10.0 * val + (s[i] - ’0’); if (s[i] == ’.’) i++; for (power = 1.0; isdigit(s[i]); i++) { val = 10.0 * val + (s[i] - ’0’); power *= 10; } return sign * val / power; } Sistemas Operativos El Lenguaje de programaci´on C 101 / 218
  • 102. Funciones y estructura de un programa Sistemas Operativos El Lenguaje de programaci´on C 102 / 218 funciones funciones queno devuelven enteros Variables externas Variablesest´aticas Variables registro Inicializaci´on Recursividad EL preprocesadorC Ejercicios
  • 103. Variables externas Sistemas Operativos El Lenguaje de programaci´on C 103 / 218 ► Variables externas sonlas queest´andefinidas fuera del cuerpo decualquier funci´on ► Soncompartidas por todos las funciones enmismofichero fuente desdedonde est´adefinida la variable hasta el final del fichero ► En C, las variables definidasdentro debloquessellaman autom´aticas, secreanautom´aticamentecuandocomienzala ejecuci´on del bloque y sedesasignan al terminar dicha ejecuci´on
  • 104. ► El dominio (zona donde se reconoce el nombre) de las variables autom´aticas se reduce al bloque donde est´an declaradas ► El dominio delos argumentosaunafunci´onesdicha funci´on ► Si enun bloque interior sedeclaraunavariable conel mismo nombrequeunaenun bloque masexterior (o unaexterna) dentro dedicho bloque el nombreserefiere ala declarada en´el ► Si queremosqueuna variable externa seacompartida por varios ficherosfuente distintos, debedefinirseenuno deellos y enlos otros declararla conelidentificador extern Sistemas Operativos El Lenguaje de programaci´on C 104 / 218
  • 105. Funciones y estructura de un programa Sistemas Operativos El Lenguaje de programaci´on C 105 / 218 funciones funciones queno devuelven enteros Variables externas Variablesest´aticas Variables registro Inicializaci´on Recursividad EL preprocesadorC Ejercicios
  • 106. Variables est´aticas Sistemas Operativos El Lenguaje de programaci´on C 106 / 218 ► Una variable est´aticaesunavariable local deunafunci´onque no secreay destruye al llamar ala funci´on ► Sedeclarananteponiendo la palabra static ala declaraci´on void funcioncilla (void) { static int veces=0; ++veces printf ("Esta funcion ha sido llamada %dn" veces); } ► Desdeel punto devista del almacenamiento,unavariable est´aticaesenrealidad unavariable externa, y el termino static la haceprivada alafunci´on ► Si una variable externa (o unafunci´on)la declaramos static la hacemosprivada parael fichero fuente dondeest´adefinida
  • 107. Funciones y estructura de un programa Sistemas Operativos El Lenguaje de programaci´on C 107 / 218 funciones funciones queno devuelven enteros Variables externas Variablesest´aticas Variables registro Inicializaci´on Recursividad EL preprocesadorC Ejercicios
  • 108. Variables registro Sistemas Operativos El Lenguaje de programaci´on C 108 / 218 ► La declaraci´on register antes del nombre de una variable indica al compilador que esa variable va a usarse intensamente y que seria conveniente almacenarla enun registro dela m´aquina register int indice; ► El compilador tiene libertad decolocarla enun registro ono ► Solo esaplicable avariables autom´aticasy par´ametrosdelas funciones ► No puedepreguntarsepor la direcci´on deunavariable registro, aunquedehechono sealmaceneenunregistro
  • 109. Funciones y estructura de un programa Sistemas Operativos El Lenguaje de programaci´on C 109 / 218 funciones funciones queno devuelven enteros Variables externas Variablesest´aticas Variables registro Inicializaci´on Recursividad EL preprocesadorC Ejercicios
  • 110. Inicializaci´on Sistemas Operativos El Lenguaje de programaci´on C 110 / 218 ► Cpermite quelas variables seaninicializadas enla declaraci´on ► Lasvariables externasy est´aticasseinicializan unasola vez durante lacompilaci´on ► Lasinicializaciones devariables autom´aticassonsentencias de asignaci´on (se ejecutan) ► Lasexpresionesdeinicializaci´on debenserconocidas enel momento dela inicializaci´on: Lasvariables externas y est´aticassolopuedeninicializarse avalores constantes ► Losarraystambi´enpuedeninicializarse medianteuna lista de suselementosentre llaves y separadospor, int dias_por_mes[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 } ► En estecasono esnecesariodeclarar la dimensi´on del array
  • 111. Funciones y estructura de un programa Sistemas Operativos El Lenguaje de programaci´on C 111 / 218 funciones funciones queno devuelven enteros Variables externas Variablesest´aticas Variables registro Inicializaci´on Recursividad EL preprocesadorC Ejercicios
  • 112. Recursividad Sistemas Operativos El Lenguaje de programaci´on C 112 / 218 ► Cpermite recursividad enlas funciones,tanto directa como indirecta ► No esnecesaria ninguna declaraci´on especial #include <stdio.h> /* printd: print n in decimal */ void printd(int n) { if (n < 0) { putchar(’-’); n = -n; } if (n / 10) printd(n / 10); putchar(n % 10 + ’0’); }
  • 113. Funciones y estructura de un programa Sistemas Operativos El Lenguaje de programaci´on C 113 / 218 funciones funciones queno devuelven enteros Variables externas Variablesest´aticas Variables registro Inicializaci´on Recursividad EL preprocesadorC Ejercicios
  • 114. EL preprocesador C Sistemas Operativos El Lenguaje de programaci´on C 114 / 218 ► Adem´as de la directiva #include y el uso elementaldel #define, el preprocesador C tiene otrasfuncionalidades ► Usode#define paradefinirmacros #define CUBO(x) x*x*x /*incorrecto CUBO (x+2) #define CUBO(x) (x)*(x)*(x) #define MAX(a,b) ((a>b)?a:b) #define MAX(a,b,R) if (a > b) R=a; else R=b; ► Con#ifdef e#ifndef podemossabersi un s´ımboloha sido definido ono. Ejemplo: prevenir queun fichero includese incluya variasveces,(lo quedar´ıas´ımbolosduplicados) #ifndef _UNISTD_H #define _UNISTD_H ..... #endif
  • 115. ► Puede dejarsesin efecto unadefinici´on #undef MAXIMO ► Puedecomprobarsesi sehandefinido s´ımbolosconalgu´n valor concreto, parahacerconstrucciones m´ascomplejas #if SYSTEM == SYSV #define HDR "sysv.h" #elif SYSTEM == BSD #define HDR "bsd.h" #elif SYSTEM == MSDOS #define HDR "msdos.h" #else #define HDR "default.h" #endif #include HDR Sistemas Operativos El Lenguaje de programaci´on C 115 / 218
  • 116. Funciones y estructura de un programa Sistemas Operativos El Lenguaje de programaci´on C 116 / 218 funciones funciones queno devuelven enteros Variables externas Variablesest´aticas Variables registro Inicializaci´on Recursividad EL preprocesadorC Ejercicios
  • 117. Ejercicios Sistemas Operativos El Lenguaje de programaci´on C 117 / 218 ► Repartir los programasdeejemplo deestetema envarios ficherosfuente (uno paracadafunci´on), demaneraquese puedan compilar separadamente.Hacer los ficherosinclude correspondientes ► Declarar unavariable externa conel mismonombreencada fichero fuente y comprobar si eso no la misma ► Declarar todas las variables locales comoregister y compilarlo ► Hacer quela variable externa declaradaenel apartado anterior seala mismaparatodos los ficheros ► Hacer enCuna funci´onrecursiva quecalcula enfactorial de un nu´mero.Imprimir los 20 primerosfactoriales
  • 118. Introducci´on Tipos, operadores yexpresiones Control deflujo Funciones y estructura deunprograma Arrays y punteros Estructuras Biblioteca C Herramientas Sistemas Operativos El Lenguaje de programaci´on C 118 / 218
  • 119. Arrays y punteros Sistemas Operativos El Lenguaje de programaci´on C 119 / 218 Punteros y direcciones Punteros y argumentosafunciones Operacionessobrepunteros Arrays y punteros Arrays depunteros Arrays multidimensionales Punteros y arraysmultidimensionales Argumentos enla l´ıneadecomando Punteros afunciones Ejercicios
  • 120. ► Un punteroesuna variable quecontiene la direcci´on deun dato. Cproporcionadosoperadoresrelacionados conlas direcciones dememoria * Operadorindirecci´on. A partir deuna variable tipo puntero nosproporciona el dato apuntado & Operador direcci´on.A partir deuna variable nosdala direcci´on dememoriadondesealmacenadicha variable ► Para declarar un puntero sedeclarael tipo dedato apuntado int *p; double *pf; declaraque*p esun entero, por tanto p esun puntero a entero *pf esun double, por tanto pf esun puntero aun double Sistemas Operativos El Lenguaje de programaci´on C 120 / 218
  • 121. ► Organizaci´ondeMemoria: Ejemplo Sistemas Operativos El Lenguaje de programaci´on C 121 / 218
  • 122. ► La declaraci´on del puntero reservamemoriaparala variable puntero NO PARA EL OBJETO APUNTADO. Enel ejemplo anterior sereservamemoriaparap, El accesoa*p tiene un resultado indefinido, pudiendo resultar enun error en tiempo deejecuci´on ► Antes deusarun puntero debemosasegurarnosqueapunta un unadirecci´on correcta ► Asign´andolela direcci´on deuna variable. Por ejemplo p=&i; ► Asign´andoleel valor quedevuelva una funci´onquereserve memoriapara´el.Por ejemplo p=(int *) malloc (sizeof (int)); ► Tras utilizar el puntero, siempresedebeliberar la memoria reservadacon malloc utilizando la funci´onfree free(p); Sistemas Operativos El Lenguaje de programaci´on C 122 / 218
  • 123. Arrays y punteros Sistemas Operativos El Lenguaje de programaci´on C 123 / 218 Punteros y direcciones Punteros y argumentosafunciones Operacionessobrepunteros Arrays y punteros Arrays depunteros Arrays multidimensionales Punteros y arraysmultidimensionales Argumentos enla l´ıneadecomando Punteros afunciones Ejercicios
  • 124. Punteros y argumentos a funciones Sistemas Operativos El Lenguaje de programaci´on C 124 / 218 ► enCtodas las llamadas afunci´onsonpor valor: La funci´on recibe siempreunacopia delo quesele pasacomo argumento. Lasmodificaciones serealizan sobrela copia ► Lassiguiente funci´onno afecta alos argumentosquesele pasan void intercambia (int x, int y) /* INCORRECTA */ { int temp; temp = x; x = y; y = temp; } Una llamada aintercambia (a,b) no intercambiar´ıalos valores dea y b, solo desuscopias
  • 125. ► Si queremosquela funci´onseallamada por referencia,lo que hacemosesquela funci´onreciba las direcciones delas variables quequeremosmodificar, y atrav´esdeellas accedaa las variables void intercambia(int *px, int *py) { int temp; temp = *px; *px = *py; *py = temp; } ► Para intercambiar dosvariables a y b la llamar´ıamos intercambia(&a,&b); Sistemas Operativos El Lenguaje de programaci´on C 125 / 218
  • 126. Arrays y punteros Sistemas Operativos El Lenguaje de programaci´on C 126 / 218 Punteros y direcciones Punteros y argumentosafunciones Operacionessobrepunteros Arrays y punteros Arrays depunteros Arrays multidimensionales Punteros y arraysmultidimensionales Argumentos enla l´ıneadecomando Punteros afunciones Ejercicios
  • 127. Operaciones sobre punteros Sistemas Operativos El Lenguaje de programaci´on C 127 / 218 ► Cpermite las siguientes operaciones sobre punteros ► puntero + entero La suma (y la resta), tienen en cuenta el taman˜o del objeto apuntado de manera que si p apunta a un entero, p+1 apuntar´ıaal siguiente entero ► puntero - entero ► puntero = puntero Asignaci´on entre punteros ► puntero = NULL ► puntero = = NULL Comparaci´oncon NULL ► puntero != NULL ► puntero ==puntero La comparaci´onentre punteros tiene restricciones
  • 128. Arrays y punteros Sistemas Operativos El Lenguaje de programaci´on C 128 / 218 Punteros y direcciones Punteros y argumentosafunciones Operacionessobrepunteros Arrays y punteros Arrays depunteros Arrays multidimensionales Punteros y arraysmultidimensionales Argumentos enla l´ıneadecomando Punteros afunciones Ejercicios
  • 129. Arrays y punteros ► La declaraci´on enCdeun array es tipo nombre array[dimension] ► La siguiente declaraci´on declaraun array de10 enteros int a [10]; ► Loselementosseaccedencomoa[0], a[1] . . .a[9] ► Loselementosdeun array sealmacenan consecutivamente en memoria ► El nombredel array esla direcci´on del primer elemento del array Sistemas Operativos El Lenguaje de programaci´on C 129 / 218
  • 130. , ► Consideremos ahoralosiguiente int *pa; pa=&a[0]; ► los elementosdel array a[0], a[1]...a[9] est´an almacenadosenlas direcciones dememoria pa,pa+1,...pa+9 por lo quepuedenseraccedidos como *pa, *(pa+1),. ..*(pa+9) ► Dado queel nombredel array esla direcci´on del primer elemento del array,podr´ıamoshaber hechopa=a enlugar de pa=&a[0]; Sistemas Operativos El Lenguaje de programaci´on C 130 / 218
  • 131. , ► Ctambi´enadmite el accesoalos elementosdel array deesta manera pa[0], pa[1] pa[9] ► Hay quetener encuenta que,aunque el nombredel array esla direcci´on del primer elementodel array,no esunavariable, sino una constante, por lo que una sentencia del tipo a=pb; producir´aun error entiempo de compilaci´on Sistemas Operativos El Lenguaje de programaci´on C 131 / 218
  • 132. , ► Si queremospasarun subarrayaunafunci´onpodemoshacerlo demaneramuy sencilla. Conlas declaraciones anteriores f(a+3); f(&a[3]); pasar´ıanun subarraycomenzando enel tercer elemento del array. ► La declaraci´on delos par´ametrosenla funci´onquerecibe el array puedeser(suponiendo queno devuelvenada) void f (int ar[]) { ....} o void f (int *ar) { ....} Sistemas Operativos El Lenguaje de programaci´on C 132 / 218
  • 133. #include <stdio.h> char a[2][5] = {{11,12,13,14,15}, {21,22,23,24,25}}; main() { char *p; // puntero a char char (*q)[5]; // puntero a un array de 5 chars char *r[5]; // array de 5 punteros a char p = &(a[0][0]); printf("%dn", p[0]); p++; printf("%dn", p[0]); q = &(a[0]); Sistemas Operativos El Lenguaje de programaci´on C 133 / 218 printf("%d == %d n", q[0][0], (*q)[0]); // equivalentes q++; printf("%dn", q[0][0]); p = *a; printf("a = %ld t *a = %ld t **a = %ld n", a, *a, **a); printf("p = %ld t *p = %ld n", p, *p); }
  • 134. Arrays y punteros Sistemas Operativos El Lenguaje de programaci´on C 134 / 218 Punteros y direcciones Punteros y argumentosafunciones Operacionessobrepunteros Arrays y punteros Arrays depunteros Arrays multidimensionales Punteros y arraysmultidimensionales Argumentos enla l´ıneadecomando Punteros afunciones Ejercicios
  • 135. Arrays de punteros Sistemas Operativos El Lenguaje de programaci´on C 135 / 218 ► En Cun puntero escomocualquier otra variable (en concreto es un tipo de entero) ► Puedenhacersearrays de punteros. ► La declaraci´on int * ar[MAX] declaraquear esun array deMAX punteros aenteros. Los elementosar[i] sonpunteros. El accesoa*ar[i], mientras no inicialicemos adecuadamente los ar[i] produce un resultado indefinido ► Dela mismamaneraqueenel apartadoanterior exist´ıauna relaci´onmuy estrechaentre el puntero y el array,aqu´ıel puntero equivalente al array ar se declarar´ıa int **par;
  • 136. Arrays y punteros Sistemas Operativos El Lenguaje de programaci´on C 136 / 218 Punteros y direcciones Punteros y argumentosafunciones Operacionessobrepunteros Arrays y punteros Arrays depunteros Arrays multidimensionales Punteros y arraysmultidimensionales Argumentos enla l´ıneadecomando Punteros afunciones Ejercicios
  • 137. Arrays multidimensionales ► Cproporciona arrays multidimensionales, aunqueseusanm´as los arraysdepunteros. ► La declaraci´on deun arraydedosdimensioneses tipo nombre array[dim1][dim2] int matriz [FILAS][COLUMNAS]; ► El accesoal elemento i,j esmatriz[i][j] Sistemas Operativos El Lenguaje de programaci´on C 137 / 218
  • 138. static char daytab[2][13] = { {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31} }; /* day_of_year: set day of year from month & day */ int day_of_year(int year, int month, int day) { int i, leap; leap = year%4 == 0 && year%100 != 0 || year%400 == 0; for (i = 1; i < month; i++) day += daytab[leap][i]; return day; } Sistemas Operativos El Lenguaje de programaci´on C 138 / 218
  • 139. /* month_day: set month, day from day of year */ void month_day(int year, int yearday, int *pmonth, int *pday) { int i, leap; leap = year%4 == 0 && year%100 != 0 || year%400 == 0; for (i = 1; yearday > daytab[leap][i]; i++) yearday -= daytab[leap][i]; *pmonth = i; *pday = yearday; } Sistemas Operativos El Lenguaje de programaci´on C 139 / 218
  • 140. Arrays y punteros Sistemas Operativos El Lenguaje de programaci´on C 140 / 218 Punteros y direcciones Punteros y argumentosafunciones Operacionessobrepunteros Arrays y punteros Arrays depunteros Arrays multidimensionales Punteros y arraysmultidimensionales Argumentos enla l´ıneadecomando Punteros afunciones Ejercicios
  • 141. Punteros y arrays multidimensionales Sistemas Operativos El Lenguaje de programaci´on C 141 / 218 ► Aunque enCexisten los arrays multidimensionales, no suelen usarsepuesesmasconveniente usarlos arrays depunteros. La declaraci´on int a[10][20]; declaraun array de10x20enteros(10 filas y 20columnas). ► a esla direcci´on deun bloque dondehay200 enteros. Para accederal elementoa[1][3] tengo quesaberquecadafila tiene 20 columnas ► Si quiero pasardicho array auna funci´ontendr´ıaquepasarlela segundadimensi´onara quepudieseaccedercorrectamente a los enteros int func (int arr[][20]) ► Consideremos ahoraestaotra declaraci´on int * p[10]; declaraun array de10punterosa entero
  • 142. ► Si acadauno delos punteros le asigno memoriapara 20 enteros, tengo denuevo una matriz de10x20 enteros ala que puedo accedercomop[i][j]. ► En memoriatengo 10bloques de20enteros cadauno (no necesariamenteconsecutivos) (mas 10punteros) ► El accesoesm´asr´apidopuesno necesito multiplicaciones para determinar adondeaccedo(solo sumaseindirecciones) ► A una funci´onno tendr´ıaquepasarlela segundadimensi´on para quepudieseaccederalosenteros ► Esmasflexible, puesno todos los bloques tienen queserdel mismotaman˜o. Esto esespecialmente interesante cuando queremoscadenasdecaracteres Sistemas Operativos El Lenguaje de programaci´on C 142 / 218
  • 143. ► Enlas siguientes figuras vemosla diferencia enla disposici´on de memoria ► Array depunteros ► Array multidimensional Sistemas Operativos El Lenguaje de programaci´on C 143 / 218
  • 144. ► Conestaotradeclaraci´on int **p; creamosun array multidimensional basado enpunteros. ► Si queremoscrearunamatriz de4filas por 6columnas, debemosreservarmemoria parafilas y columnas p = (int **) malloc (4 * sizeof(int *)); for (i = 0; i < 4; i++) { p[i] = (int *) malloc (6 * size(int)); } Sistemas Operativos El Lenguaje de programaci´on C 144 / 218
  • 145. // Equivalentes Sistemas Operativos El Lenguaje de programaci´on C 145 / 218 ► Accesoaelementosdela matriz for (i = 0; i < 4; i++) { for (j = 0; j < 6; j++) { p[i][j] = 0; *(p[i] + j) = 0; *(*(p + i) + j) = 0; } } ► Para liberar la matriz for (i = 0; i < 4; i++) free(p[i]); free(p);
  • 146. Arrays y punteros Sistemas Operativos El Lenguaje de programaci´on C 146 / 218 Punteros y direcciones Punteros y argumentosafunciones Operacionessobrepunteros Arrays y punteros Arrays depunteros Arrays multidimensionales Punteros y arraysmultidimensionales Argumentos enla l´ıneadecomando Punteros afunciones Ejercicios
  • 147. Argumentos en la l´ıneadecomando Sistemas Operativos El Lenguaje de programaci´on C 147 / 218 ► Cproporciona un m´etodoparaaccederalos argumentosdela l´ıneadecomando, atrav´esdelos par´ametrosdemain 1 Declaramosquemain tiene dospar´ametros;uno un entero y otro un array depunteros acar´acter,dela siguiente manera int main(int argv, char argv[]) 2 Al ejecutar el programa,argc tendr´ael nu´merodeargumentos y los argv[i] (hasta argv[argc-1])sonlos argumentosdel´ınea de comando ► argv[0] esel nombre del programaqueseejecuta por lo quesi argc es1, no sele han pasadoargumentos
  • 148. #include <stdio.h> /* echo command-line arguments; 1st version */ int main(int argc, char *argv[]) { int i; for (i = 1; i < argc; i++) printf("%s%s", argv[i], (i < argc-1) ? " " : ""); printf("n"); return 0; } Sistemas Operativos El Lenguaje de programaci´on C 148 / 218
  • 149. Arrays y punteros Sistemas Operativos El Lenguaje de programaci´on C 149 / 218 Punteros y direcciones Punteros y argumentosafunciones Operacionessobrepunteros Arrays y punteros Arrays depunteros Arrays multidimensionales Punteros y arraysmultidimensionales Argumentos enla l´ıneadecomando Punteros afunciones Ejercicios
  • 150. Punteros a funciones Sistemas Operativos El Lenguaje de programaci´on C 150 / 218 ► Aunque una funci´on no es una variable, si podemos usar punteros a funciones, de manera que podemos usarlos en arrayso pasarloscomopar´ametrosaotras funciones ► La siguientedeclaraci´on double (*pfunc)(int,double) declaraquepfunc esun puntero aunafunci´onquedevuelve un double y querecibe dospar´ametros;un int y un double char * (*pfunc)(char **) ahorapfunc esun puntero aunafunci´onfunci´onquedevuelve un puntero acaractery querecibe comoargumentoun array de punteros acar´acter ► El siguiente ejemplo lo ilustramos con la funci´on qsort que hace una ordenaci´on de l´ıneas y recibe como par´ametro un puntero ala funci´onquecomparaunal´ıneacon otra
  • 151. /* Qsort: sort v[left]...v[right] into increasing order */ void Qsort(void *v[], int left, int right, int (*comp)(void *, void *)) { int i, last; void swap(void *v[], int, int); if (left >= right) /* do nothing if array contains */ return; /* fewer than two elements */ swap(v, left, (left + right)/2); last = left; for (i = left+1; i <= right; i++) if ((*comp)(v[i], v[left]) < 0) swap(v, ++last, i); Sistemas Operativos El Lenguaje de programaci´on C 151 / 218
  • 152. swap(v, left, last); qsort(v, left, last-1, comp); qsort(v, last+1, right, comp); } Sistemas Operativos El Lenguaje de programaci´on C 152 / 218
  • 153. ► Si quisi´esemosutilizar la siguiente funci´onparacomparar l´ıneas int numcmp(char *s1, char *s2) { double v1, v2; v1 = atof(s1); v2 = atof(s2); if (v1 < v2) return -1; else if (v1 > v2) return 1; else return 0; } teniendo encuenta queel nombredela funci´onesun puntero a la funci´on,la llamada ser´ıa Qsort (lineas,MAXLINEAS, numcmp); Sistemas Operativos El Lenguaje de programaci´on C 153 / 218
  • 154. Arrays y punteros Sistemas Operativos El Lenguaje de programaci´on C 154 / 218 Punteros y direcciones Punteros y argumentosafunciones Operacionessobrepunteros Arrays y punteros Arrays depunteros Arrays multidimensionales Punteros y arraysmultidimensionales Argumentos enla l´ıneadecomando Punteros afunciones Ejercicios
  • 155. Ejercicios Sistemas Operativos El Lenguaje de programaci´on C 155 / 218 ► Escribir un programa enCqueimprime todas las l´ıneasdesu entrada est´andarquecontienen una palabra quesele pasa como argumento ► Escribir un programa enCqueadmite comopar´ametroun nu´meroenteroN; si el nu´meroespositivo imprime las N primerasl´ıneasdesuentrada, y si esnegativo las (-)N u´ltimas. ► Escribir un programa enCqueordenetodas las l´ıneasquelee de suentrada usandola funci´onqsort. Si recibe el par´ametro -n las ordenapor longitud, encasocontrario lo hace alfab´eticamente
  • 156. Introducci´on Tipos, operadores yexpresiones Control deflujo Funciones y estructura deunprograma Arrays y punteros Estructuras Biblioteca C Herramientas Sistemas Operativos El Lenguaje de programaci´on C 156 / 218
  • 157. Estructuras Sistemas Operativos El Lenguaje de programaci´on C 157 / 218 Estructuras Operacionessobreestructuras Punteros aestructuras Arrays deestructuras Estructuras autoreferenciadas Uniones Camposdebits typedef Ejercicios
  • 158. Estructuras ► Una estructura esuna colecci´ondeuna o masvariables, no necesariamente del mismo tipo, agrupadasbajo un solo nombre ► Esel equivalente al registro (record) del pascal ► La declaraci´onesdela forma struct nombre estructura {lista variables} nombre variable ; ► El nombre dela estructura puedeomitirse. Lassiguientes declaracionesson(casi) equivalentes: todas declaran dos estructuras (p1 y p2) cada una delas cualescontiene dos enteros a. struct COORDENADAS { int x; int y; } p1, p2; b. struct COORDENADAS { int x; int y; }; struct COORDENADAS p1, p2; Sistemas Operativos El Lenguaje de programaci´on C 158 / 218
  • 159. c struct { int x; int y; } p1 , p2; ► Enlas modalidades a) y b) la estructura tiene un nombre (struct COORDENADAS) quenospodr´ıaservir paradeclarar m´asestructuras del mismo tipo (o par´ametrosaunafunci´on) enotra parte delprograma ► Lasestructuras puedeninicializarse enla declaraci´on al igual queotros tipos devariables, Losvalores desusmiembros separadospor , y entre llaves ({}) struct COORDENADAS p1={ 5,9 }; Sistemas Operativos El Lenguaje de programaci´on C 159 / 218
  • 160. Estructuras Sistemas Operativos El Lenguaje de programaci´on C 160 / 218 Estructuras Operacionessobreestructuras Punteros aestructuras Arrays deestructuras Estructuras autoreferenciadas Uniones Camposdebits typedef Ejercicios
  • 161. Operaciones sobre estructuras Sistemas Operativos El Lenguaje de programaci´on C 161 / 218 ► Cpermite las siguientes operaciones sobre estructuras ► copia oasignaci´on ► accesoasusmiembros ► obtener sudirecci´on con & ► Pasarlascomo argumentosa funciones ► Serdevueltas porfunciones ► Lasestructuras no sepuedencomparar ► Para accederalos miembrosdeunaestructura usamosel operador . Conlas declaraciones del apartadoanterior p1.x=3 p1.y=9; p2.x=p2.y=0 ► Una estructura puedetener miembrosqueseanasuvez estructuras
  • 162. Estructuras Sistemas Operativos El Lenguaje de programaci´on C 162 / 218 Estructuras Operacionessobreestructuras Punteros aestructuras Arrays deestructuras Estructuras autoreferenciadas Uniones Camposdebits typedef Ejercicios
  • 163. Punteros a estructuras Sistemas Operativos El Lenguaje de programaci´on C 163 / 218 ► Ctambi´enpermite punteros aestructuras. ► La declaraci´on deun puntero aunaestructura escomola de un puntero acualquier otra variable. Sedeclarael objeto apuntado. ►Tambi´ensonv´alidaslas distintas modalidades vistas a struct COORDENADAS { int x; int y; } *p1, *p2; b struct COORDENADAS { int x; int y; }; struct COORDENADAS *p1, *p2;
  • 164. c struct { int x; int y; Sistemas Operativos El Lenguaje de programaci´on C 164 / 218 } *p1 , *p2; ► Podemosaccederalos miembrosdeuna estructura atrav´es del puntero dedosmaneras ► Accediendo alaestructura (*p1).x Lospar´entesis() sonnecesariospuesel operador . tiene precedenciasobrela indirecci´on * ► Directamente desdeel puntero mediante el operador -> p1->x En general estesistema esel preferido, sobretodo cuando usamosvariables tipo struct paracrear estructuras dedatos (listas, pilas, ´arboles. . . ) p->siguiente->siguiente->siguiente (*(*(*p).siguiente).siguiente).siguiente
  • 165. ► Al igual queconlos otros punteros, la declaraci´on deun puntero aunaestructura reservaespacioparael puntero pero NO PARA LA ESTRUCTURA APUNTADA POR E´Lpor lo queel accesoadicha estructura produceun resultado indefinido (incluso un error entiempo deejecuci´on) ► Antes deaccederala estructura apuntada debemosinicializar el puntero ► Asign´andolela direcci´on deunavariable ► Reserv´andolememoriacon alguna funci´on(p.e. malloc) ► Enel siguiente ejemplo reservamosmemoriaparaMAX estructuras struct COORD y lo asignamosaun puntero. El operador sizeof nosdevuelve el taman˜odela estructura ► El taman˜o deuna estructura no esnecesariamentela sumadel taman˜o desusmiembros struct CORD *p; p=(struct CORD *) malloc (MAX * sizeof (struct CORD)); Sistemas Operativos El Lenguaje de programaci´on C 165 / 218
  • 166. Estructuras Sistemas Operativos El Lenguaje de programaci´on C 166 / 218 Estructuras Operacionessobreestructuras Punteros aestructuras Arrays deestructuras Estructuras autoreferenciadas Uniones Camposdebits typedef Ejercicios
  • 167. Arrays de estructuras Sistemas Operativos El Lenguaje de programaci´on C 167 / 218 ► Cpermite tambi´en hacer arrays de estructuras, la sintaxis es la misma quepara cualquier otro tipo de variable ► Los arrays de estructuras tambi´en se puede inicializar en la declaraci´on usando llaves para cada estructura y llaves para cadaelemento del array struct PARNUMEROS { int i; double x; } array[]={ {0, 1000.0}, {1, 3.14}, ........ {100, 2.5} }; aunque a veces por comodidad se omiten las llaves de cada estructura ► En el siguiente ejemplo vemos una funci´on que usaun array de estructuras para contar el nu´mero de palabras reservadas de C queseutilizan enunfichero
  • 168. #include <stdio.h> #include <ctype.h> #include <string.h> #define MAXWORD 100 struct key { char *word; int count; } keytab[] = { "auto", 0, "break", 0, "case", 0, "char", 0, "const", 0, "continue", 0, "default", 0, /* ... */ "unsigned", 0, "void", 0, "volatile", 0, "while", 0 }; int getword(char *, int); int binsearch(char *, struct key *, int); Sistemas Operativos El Lenguaje de programaci´on C 168 / 218
  • 169. /* count C keywords */ main() { int n; char word[MAXWORD]; while (getword(word, MAXWORD) != EOF) if (isalpha(word[0])) if ((n = binsearch(word, keytab, NKEYS)) >= 0) keytab[n].count++; for (n = 0; n < NKEYS; n++) if (keytab[n].count > 0) printf("%4d %sn", keytab[n].count, keytab[n].word); return 0; } Sistemas Operativos El Lenguaje de programaci´on C 169 / 218
  • 170. /* binsearch: find word in tab[0]...tab[n-1] */ int binsearch(char *word, struct key tab[], int n) { int cond; int low, high, mid; low = 0; high = n - 1; while (low <= high) { mid = (low+high) / 2; if ((cond = strcmp(word, tab[mid].word)) < 0) high = mid - 1; else if (cond > 0) low = mid + 1; else return mid; } return -1; } Sistemas Operativos El Lenguaje de programaci´on C 170 / 218
  • 171. Estructuras Sistemas Operativos El Lenguaje de programaci´on C 171 / 218 Estructuras Operacionessobreestructuras Punteros aestructuras Arrays deestructuras Estructuras autoreferenciadas Uniones Camposdebits typedef Ejercicios
  • 172. Estructuras autoreferenciadas Sistemas Operativos El Lenguaje de programaci´on C 172 / 218 ► Una estructura no puedereferenciarseasi mismaesdecir, tener unaestructura del mismotipo comomiembro, puesto queesto dar´ıalugar aunarecursi´oninfinita. ► Lo quesi puedetener comomiembro esuno ovarios punteros a unaestructura desumismotipo ► Esto nospermite realizar estructuras dedatos enmemoria struct TNODO{ struct INFO info; struct TNODO *izq; struct TNODO *der; };
  • 173. Estructuras Sistemas Operativos El Lenguaje de programaci´on C 173 / 218 Estructuras Operacionessobreestructuras Punteros aestructuras Arrays deestructuras Estructuras autoreferenciadas Uniones Camposdebits typedef Ejercicios
  • 174. Uniones Sistemas Operativos El Lenguaje de programaci´on C 174 / 218 ► Unauni´onesunavariable quecontiene tipos dedatos distintos eninstantes distintos ► Permite manipular distintos tipos dedatos enla mismazona de memoria ► Sedeclarademanerasimilar aunaestructura pero conla palabra union ► El accesoalos miembrosdela union esconel operador . (o conel operador -> si accedemosatrav´esdeun puntero) union VARIOS { int entero; char bytes[4]; float real; } u; ► Una union puedecontener arraysy/o estructuras. Una estructura tambi´enpuedecontener uniones. Est´anpermitidos tambi´enlos arrays de uniones.
  • 175. Estructuras Sistemas Operativos El Lenguaje de programaci´on C 175 / 218 Estructuras Operacionessobreestructuras Punteros aestructuras Arrays deestructuras Estructuras autoreferenciadas Uniones Camposdebits typedef Ejercicios
  • 176. Campos de bits Sistemas Operativos El Lenguaje de programaci´on C 176 / 218 ► Permiten, con unavariable detipo struct tener accesodirecto a los bits deunentero ► Conunadeclaraci´ondeestetipo struct { unsigned int is_keyword : 1; unsigned int is_extern : 1; unsigned int is_static : 1; } flags; podemosaccederalos bits individualmente como flags.is_keyword=1; flags.is_extern=0; .. if (flags.is_static) {..
  • 177. ► Si los bits comienzanaasignarse por la izquierda opor la derechay otros detalles sondependientesdela implementaci´on,por lo queesmasusualusarm´ascarasy enterospararealizar dichastareas #define KEYWORD 01 #define EXTRENAL 02 #define STATIC 04 int flags; flags|=KEYWORD |EXTERN; if (flags & STATIC) {... Sistemas Operativos El Lenguaje de programaci´on C 177 / 218
  • 178. Estructuras Sistemas Operativos El Lenguaje de programaci´on C 178 / 218 Estructuras Operacionessobreestructuras Punteros aestructuras Arrays deestructuras Estructuras autoreferenciadas Uniones Camposdebits typedef Ejercicios
  • 179. typedef Sistemas Operativos El Lenguaje de programaci´on C 179 / 218 ► Cproporciona una herramienta paraponerle nombresa tipos: typedef ► Suusoessimilar aunadeclaraci´on devariable precedidadela palabra typedef. Lo queir´ıaenel lugar del nombredela variable esel nombredel tipo typedef int * punteroEntero; typedef struct NUEVA nueva_t; Si ahoraquisi´eramos declarar unavariable puntero aentero y otra detipo struct NUEVA podr´ıamoshacer punteroEntero p; nueva_t n;
  • 180. Estructuras Sistemas Operativos El Lenguaje de programaci´on C 180 / 218 Estructuras Operacionessobreestructuras Punteros aestructuras Arrays deestructuras Estructuras autoreferenciadas Uniones Camposdebits typedef Ejercicios
  • 181. Ejercicios Sistemas Operativos El Lenguaje de programaci´on C 181 / 218 ► Implementar e C un programa que lee enteros de su entrada est´andar y los imprime en orden inverso, utilizando una pila. Implementar lapila ► Conun array ► Conun array de punteros ► De maneradin´amica ► Implementar una lista enCdonde cadaelemento dela lista contiene una palabra y un entero. El programa leesuentrada (cada l´ıneatiene unapalabra y un entero) y almacenalos elementosenla lista ordenadospor el valor del entero.
  • 182. Introducci´on Tipos, operadores yexpresiones Control deflujo Funciones y estructura deunprograma Arrays y punteros Estructuras Biblioteca C Herramientas Sistemas Operativos El Lenguaje de programaci´on C 182 / 218
  • 183. Biblioteca C Sistemas Operativos El Lenguaje de programaci´on C 183 / 218 Biblioteca C Documentaci´on enl´ınea Asignaci´on dememoria Funciones decaracteres Cadenasdecaracteres Entrada/salida conformato Entrada/salida conformato afichero Entrada/salida conformato amemoria Entrada/salida sinformato Ejercicios
  • 184. Biblioteca C Sistemas Operativos El Lenguaje de programaci´on C 184 / 218 ► El lenguaje Cesmuy pequen˜o,sin embargo,muchasdelas tareaspodemos hacerlas por medio dela biblioteca C. por ejemplo, usamosfuncionesdela biblioteca C para ► asignar y desasignar memoria ► manipulado decadenasy caracteres ► funciones matem´aticas ► entrada salida ► . .. ► Enlos sistemastipo UNIX la informaci´onsobrelas funciones de la biblioteca Cest´adisponible enla documentaci´on en l´ınea (secci´on3delas p´aginasdemanual). Por ejemplo, para obtener informaci´onsobre printf $ man 3 printf oenotrossistemas $ man -s 3 printf
  • 185. Biblioteca C Sistemas Operativos El Lenguaje de programaci´on C 185 / 218 Biblioteca C Documentaci´on enl´ınea Asignaci´on dememoria Funciones decaracteres Cadenasdecaracteres Entrada/salida conformato Entrada/salida conformato afichero Entrada/salida conformato amemoria Entrada/salida sinformato Ejercicios
  • 186. Documentaci´on enl´ınea Sistemas Operativos El Lenguaje de programaci´on C 186 / 218 ► La informaci´onenl´ıneadeunafunci´onnosindica, adem´asde la sintaxis dedicha funci´on,si esnecesarioalgu´nfichero includeo hayqueindicarle alguna librer´ıa adicional ► Por ejemplo, si miramos la p´agina de manual de la funci´on sqrt, vemos que es necesario incluir el fichero <math.h> y queadem´ashayqueenlazarcon-lm SQRT(3) Linux Programmer’s Manual N A M E s q r t , s q r t f , s q r t l - square root function SYNOPSIS #include <math.h> double sqrt(double x); f l o a t s q r t f ( f l o a t x); long double sqrtl(long double x); Link with -lm. . . . . .
  • 187. Biblioteca C Sistemas Operativos El Lenguaje de programaci´on C 187 / 218 Biblioteca C Documentaci´on enl´ınea Asignaci´on dememoria Funciones decaracteres Cadenasdecaracteres Entrada/salida conformato Entrada/salida conformato afichero Entrada/salida conformato amemoria Entrada/salida sinformato Ejercicios
  • 188. Asignacio´ndememoria Sistemas Operativos El Lenguaje de programaci´on C 188 / 218 ► Para asignar memoria tenemos void *malloc(size_t size); ► Le pasamoscomo argumento la cantidad debytes que queremosreservar (t´ıpicamente usamossizeof para determinarlo) ► Nos devuelve una direcci´on dememoria, como un puntero gen´erico(void *), donde hay disponible dicha cantidad de bytes (no m´as).Si no queremosque el compilador deun aviso al asignarlo a, por ejemplo, un puntero aentero, debemos hacer una conversi´onde tipo ► Cuandoya no necesitemosla memoria asignada con malloc podemos desasignarla con void free(void *ptr); ► Utilizar m´asmemoria dela asignada o hacer freesobreuna direcci´onqueno ha sido obtenida con malloc produce resultados indefinidos, t´ıpicamente un error entiempo de ejecuci´on ► Otras funciones relacionadas: calloc, realloc
  • 189. Biblioteca C Sistemas Operativos El Lenguaje de programaci´on C 189 / 218 Biblioteca C Documentaci´on enl´ınea Asignaci´on dememoria Funciones decaracteres Cadenasdecaracteres Entrada/salida conformato Entrada/salida conformato afichero Entrada/salida conformato amemoria Entrada/salida sinformato Ejercicios
  • 190. Funciones de caracteres Sistemas Operativos El Lenguaje de programaci´on C 190 / 218 ► La biblioteca Cproporcionaunaseriedefuncionesque permiten tratar concaracteres.Susprototipos est´an declarados e<ctype.h> int isalnum(int c); int isalpha(int c); int isascii(int c); int isblank(int c); int iscntrl(int c); int isdigit(int c); int isgraph(int c); int islower(int c); int isprint(int c); int ispunct(int c); int isspace(int c); int isupper(int c); int isxdigit(int c);
  • 191. Biblioteca C Sistemas Operativos El Lenguaje de programaci´on C 191 / 218 Biblioteca C Documentaci´on enl´ınea Asignaci´on dememoria Funciones decaracteres Cadenasdecaracteres Entrada/salida conformato Entrada/salida conformato afichero Entrada/salida conformato amemoria Entrada/salida sinformato Ejercicios
  • 192. Cadenas de caracteres Sistemas Operativos El Lenguaje de programaci´on C 192 / 218 ► EnCno existen las variable tipo cadenas(strings). Existen ► arrays decaracteres ► punteros acar´acter ► Cuandosealmacena unacadena decaracteresdebeestar terminada por el car´actercuyo c´odigoes0(’0’) yaqueeslo queesperanencontrar las funciones de cadenas ► Lasfuncionesdecadenasesperanunadirecci´on dememoria (char *); comoel nombredeun array esla direcci´on donde se almacenael array,las funciones decadenaspuedenrecibir tanto un array comoun puntero ► Hay algunas diferencias sutiles entre el array y el puntero a car´acter
  • 193. ► Consideremos la siguiente declaraci´on char a[MAX]="esto es una cadena"; ► Sedeclaraun array deMAX caracteresy seinicializa a ‘‘esto es una cadena’’ ► El siguiente c´odigoproduce un error de compilaci´on a="la cadena ha cambiado de valor"; puesto queel nombredel array esla direcci´on dondecomienza el array,y ´estano puedecambiarse ► Podr´ıamoscambiar el valor del array conuna delas funciones de cadena strcpy(a,"la cadena ha cambiado de valor"); Sistemas Operativos El Lenguaje de programaci´on C 193 / 218
  • 194. ► Consideremos la siguiente declaraci´on char *a="esto es una cadena"; ► Sedeclaraun puntero y seinicializa ala direcci´on dememoria donde est´ala constante literal ‘‘esto es unacadena’’ ► El siguiente c´odigoNO produceerror decompilaci´on ni en tiempo deejecuci´on a="la cadena ha cambiado de valor"; seasigna al puntero la direcci´on dememoriadonde est´ala constante literal ‘‘la cadena ha cambiado de valor’’ ► Si intentamos cambiar el valor depuntero conunadelas funciones decadena strcpy(a,"la cadena ha cambiado de valor"); el resultado esindefinido puesto queestamosintentando sobreescribir la cadena‘‘esto es una cadena’’ queest´a donde el compilador hapuesto las constantes literales con otra cadena,queadem´asesdemayorlongitud Sistemas Operativos El Lenguaje de programaci´on C 194 / 218
  • 195. ► Consideremos la siguiente declaraci´on char *a; a=(char *) malloc (MAX*sizeof (char)); asigna al puntero aunadirecci´on dememoria donde hay espacioparaMAXcaracteres ► La sentencias strcpy(a,"esto es una cadena"); strcpy(a,"la cadena ha cambiado de valor"); sonperfectamentecorrectas siemprey cuandoMAX sea mayorquela longitud de‘‘la cadena ha cambiado de valor’’ +1 ► Sin embargola asignaci´on a="la cadena ha cambiado de valor"; hacequeel valor del puntero seaahorael dela direcci´on dela constante literal ‘‘la cadena ha cambiado de valor’’ , y hemosperdido la memoriaasignada con malloc Sistemas Operativos El Lenguaje de programaci´on C 195 / 218
  • 196. ► Cuandohacemosuna asignaci´on esunaasignaci´on entre punteros. ► Seasignan direcciones dememoria ► No secopian cadenas ► Si queremoscopiar cadenasdebemosusarla funci´onde librer´ıa strcpy ► Esresponsabilidaddel programador queenel sitio adondese copia hayaespaciosuficientepara la cadenaquesequiere copiar ► El espacionecesarioesla longitud dela cadena+ 1 byte adicional (para el caracter ’0’ quemarcael fin decadena. ► Semuestran posiblesimplementaciones delas funciones dela librer´ıastrcpy (que copia unacadena) y strdup (que creaun duplicado) Sistemas Operativos El Lenguaje de programaci´on C 196 / 218
  • 197. void strcpy(char *s, char *t) { int i=0; while ((s[i] = t[i]) != ’0’) i++; } char *strdup(char *s) /* make a duplicate of s */ { char *p = (char *) malloc(strlen(s)+1); if (p == NULL) return NULL; strcpy(p, s); return p; } Sistemas Operativos El Lenguaje de programaci´on C 197 / 218
  • 198. ► Funciones decaracteres:resumen(string.h) Sistemas Operativos El Lenguaje de programaci´on C 198 / 218 ► char *strcpy(char *dest, const char *orig); ► char *strncpy(char *dest, const char *orig, size_t n); ► void *memcpy(void *dest, const void *src, size_t n); ► size_t strlen(const char *s); ► char *strcat(char *dest, const char *src); ► char *strncat(char *dest, const char *src, size_t n); ► int strcmp(const char *s1, const char *s2); ► int strncmp(const char *s1, const char *s2, size_t n); ► strstr, strchr,... ► Otras funciones (stdlib.h): atoi,atof,atol,...
  • 199. Biblioteca C Sistemas Operativos El Lenguaje de programaci´on C 199 / 218 Biblioteca C Documentaci´on enl´ınea Asignaci´on dememoria Funciones decaracteres Cadenasdecaracteres Entrada/salida conformato Entrada/salida conformato afichero Entrada/salida conformato amemoria Entrada/salida sinformato Ejercicios
  • 200. Entrada/salida con formato Sistemas Operativos El Lenguaje de programaci´on C 200 / 218 ► El prototipo deestasfuncionesest´aen <stdio.h> ► Si queremoshacerla entrada salida por caracteres tenemos int getchar() int putchar(int c) ► Para cadenasdecaracteres char * gets(char *s) int puts(const char *s) ► La funci´ondeentrada salida conformato esprintf(. .. ] ► El formato deprintf es int printf(const char *format, ...)
  • 201. format esuna cadenadecaracterescompuestapor Sistemas Operativos El Lenguaje de programaci´on C 201 / 218 ► caracteresquesoncopiadosala salida est´andar ► especificacionesdeconversi´on: comienzanconle caracter%y terminan conun caracterde conversi´on. ► La primera especificaci´ondeconversi´on serefiere al primer argumento despu´esdel format, la segundaal siguiente . . . . ► El significado delos caracteres enuna especificaci´on de conversi´on es: ► - El ajuste es a la izquierda ► N.M N ancho m´ınimo (para float d´ıgitos antes del . decimal). M nu´mero m´ınimo de d´ıgitos que se imprimir´an para un entero (para float nu´merode d´ıgitosa la derecha del . decimal) ► h para entero corto l para entero largo ► Caracter de conversi´on
  • 202. ► El caracterdeconversi´on especifica qu´ehayque imprimir Sistemas Operativos El Lenguaje de programaci´on C 202 / 218 Especificaciones de conversi´on (%u, %d,...) Codigos deescape car´acter argumento salida C´odigo salida d,i entero entero con signo n nueva l´ınea u entero entero sinsigno t tabulador o entero entero en octal sinsigno b backspace x, X entero entero en hexadecimal sin signo r retorno carro f real real con punto ysigno ¨ comillas e,E real notaci´on exponencial con signo ´ ap´ostrofo g, G c car´acter car´acter ? ? s cad. Chars cadena de caracteres % imprime un % p void depende implementaci´on ld, lu, lx, lo entero entero largo ► Por ejemplo: printf (‘‘real: %2.4f; entero: %Xn", x,n); imprimir´ıa algo como: real: 3.1516; entero: FF09465
  • 203. ► Si queremoshacerentrada con formato, utilizamos scanf int scanf(const char *format, ...); ► La especificaci´ondelos formatos descanf escomola de printf. ► Hay quetener encuenta queenla lista deargumentosascanf no sele suministran las variables quequeremosleer, sino las direcciones de memoria delas variables quequeremosleer (para queseapor referencia) ► Ejemplo int n; char caracter; scanf ("%d",&n); printf ("n El cuadrado de %d es : %d",n, n*n); scanf ("%c",&caracter); printf ("n He le´ıdo el car´acter: %c", caracter); Sistemas Operativos El Lenguaje de programaci´on C 203 / 218
  • 204. Biblioteca C Sistemas Operativos El Lenguaje de programaci´on C 204 / 218 Biblioteca C Documentaci´on enl´ınea Asignaci´on dememoria Funciones decaracteres Cadenasdecaracteres Entrada/salida conformato Entrada/salida conformato afichero Entrada/salida conformato amemoria Entrada/salida sinformato Ejercicios
  • 205. Entrada/salida con formato a fichero Sistemas Operativos El Lenguaje de programaci´on C 205 / 218 ► Lasfuncionesprintf,scanf, puts, gets, putchar, getchar operan sobrela entrada est´andary la salida est´andar.Existen funciones totalmente an´alogasqueoperan sobre ficheros ► Losficherospodemos abrirlos confopen y cerrarlos con fclose FILE *fopen(const char *path, const char *mode); int fclose(FILE *fp); ► Lasfuncionesparaentrada y salida afichero son int fprintf(FILE *stream, const char *format, ...); int fscanf(FILE *stream, const char *format, ...); char *gets(char *s); int fputs(const char *s, FILE *stream); int fgetc(FILE *stream); int fputc(int c, FILE *stream);
  • 206. Biblioteca C Sistemas Operativos El Lenguaje de programaci´on C 206 / 218 Biblioteca C Documentaci´on enl´ınea Asignaci´on dememoria Funciones decaracteres Cadenasdecaracteres Entrada/salida conformato Entrada/salida conformato afichero Entrada/salida conformato amemoria Entrada/salida sinformato Ejercicios
  • 207. Entrada/salida con formato a memoria Sistemas Operativos El Lenguaje de programaci´on C 207 / 218 ► Existen tambi´enfunciones quenospermiten simplemente hacerla entrada/salida sobrevariables enmemoria. ► Estasfunciones operan exactamente igual quelas quehemos visto, pero requierenun argumento adicional ► Una variable tipo puntero a car´acter, donde se va a colocar la salida formateada adecuadamente (o desde donde se pretende leer la entrada) int sprintf(char *str, const char *format, ...); int sscanf(const char *str, const char *format, ...);
  • 208. Biblioteca C Sistemas Operativos El Lenguaje de programaci´on C 208 / 218 Biblioteca C Documentaci´on enl´ınea Asignaci´on dememoria Funciones decaracteres Cadenasdecaracteres Entrada/salida conformato Entrada/salida conformato afichero Entrada/salida conformato amemoria Entrada/salida sinformato Ejercicios
  • 209. Entrada/salida sin formato ► Quiz´ala maneramasc´omodaderealizar e/s seala delas llamadas al sistemaenUNIX; estasllamadas simplemente leen bytes y escribenbytes enun fichero ► Si queremosquetengan un formato espec´ıfico,podemos formatear previamente los datos ► Para abrir un fichero int open(const char *pathname, int flags, mode_t mode); pathname nombre del fichero flags modo deapertura O RDONLY, O WRONLY, O RDWR, O CREAT O EXCL. . . modepermisosdel fichero (solo si secreael fichero) ► Devuelve un entero (descriptor delfichero) queseusaenread y write Sistemas Operativos El Lenguaje de programaci´on C 209 / 218
  • 210. ► Para leer oescribir ssize_t read(int fd, void *buf, size_t count); ssize_t write(int fd, const void *buf, size_t count); fd descriptor defichero (obtenido con open buf direcci´on dememoriapara la transferencia dedatos count nu´merodebytes dee/s ► Devuelven ennu´merodebytes quesehan transferido ► paracerrar el fichero int close(int fd); ► Otras funciones relacionadas(tras abrir fichero confopen()) size_t fread (void *ptr, size_t tam, size_t n, FILE *stream) size_t fwrite(void *ptr, size_t tam, size_t n, FILE *stream) int fseek(FILE *stream, long desplto, int origen); long ftell(FILE *stream); Sistemas Operativos El Lenguaje de programaci´on C 210 / 218
  • 211. Biblioteca C Sistemas Operativos El Lenguaje de programaci´on C 211 / 218 Biblioteca C Documentaci´on enl´ınea Asignaci´on dememoria Funciones decaracteres Cadenasdecaracteres Entrada/salida conformato Entrada/salida conformato afichero Entrada/salida conformato amemoria Entrada/salida sinformato Ejercicios
  • 212. Ejercicios Sistemas Operativos El Lenguaje de programaci´on C 212 / 218 ► Realizar enCun programa quereciba comopar´ametroel nombredeun fichero y generetres ficheros ► Uno quecontiene los mismoscaracteres pero enorden inverso ► Otro que contiene las mismas palabras pero en ordeninverso ► Otro que contiene las mismas l´ıneas pero en orden inverso ► Sesuponequela separaci´onentre l´ıneasestadada por una ocurrencia del caracterfin del´ınea(’n’), y la separaci´on entre palabraspor una om´asocurrencias del caracterespacio (’ ’) o del caractertab (’t’) ► Puede usarsestrtok
  • 213. Introducci´on Tipos, operadores yexpresiones Control deflujo Funciones y estructura deunprograma Arrays y punteros Estructuras Biblioteca C Herramientas Sistemas Operativos El Lenguaje de programaci´on C 213 / 218
  • 214. Herramientas Sistemas Operativos El Lenguaje de programaci´on C 214 / 218 Valgrind
  • 215. Depuracio´nde memoria conValgrind Sistemas Operativos El Lenguaje de programaci´on C 215 / 218 ► Valgrind esunaherramienta quepermite detectar fallos enla gesti´onde memoria ► Usodememoriasin asignar ► Accesosincorrectos amemoria ► Memoria asignada, no liberada y perdida (memory leaks) ► Para usareldepurador a. Compilamos con -g -O0 $ gcc -g -O0 ejercicio1.c b. Invocamos valgrind pas´andoleel ejecutable (y suspar´ametros) como par´ametro $ valgrind --leak-check=full --show-reachable=yes a.out
  • 216. Ejemplo de depuracio´nde memoria con Valgrind (I) Sistemas Operativos El Lenguaje de programaci´on C 216 / 218 #include <stdio.h> #include <malloc.h> main() { int i; int *v; v=(int*) malloc (10*sizeof(int)); for (i=0;i<=10;i++) // aqu´ı hay un acceso no valido! v[i]=i*2; for(i=0;i<10;i++) printf("%d",v[i]); // free(v); // no se libera memoria!!! }
  • 217. Ejemplo de depuracio´nde memoria con Valgrind (II) Sistemas Operativos El Lenguaje de programaci´on C 217 / 218 $ valgr ind --leak-ch eck=full --show-reachable=yes a . ou t ==27888== Memcheck, a memory er r or detector ==27888== Copyright (C) 2002-2010, and GNUGPL’d, by J u l i a n Seward e t a l . ==27888== Using Valgr ind -3.6.1 and LibVEX; rerun with -h for copyright in fo ==27888== Command: . / a . o u t ==27888== ==27888== In valid wr ite of s i z e 4 ==27888== a t 0x8048448: main ( p . c: 1 1 ) ==27888== Address 0x41b8050 i s 0 bytes a f t e r a block of s i z e 40 a l l oc’ d ==27888== a t 0x4025018: malloc ( i n /usr/lib/valgrind/vgpreload_memch eck -x86-linux.so) ==27888== by 0x8048428: main ( p . c : 8 ) ==27888== 0 2 4 6 8 10 12 14 16 18 ==27888== ==27888== HEAPSUMMARY: ==27888== i n use a t e x i t : 40 bytes i n 1 blocks ==27888== t o t a l heap usage: 1 a l l o c s , 0 f r e e s , 40 bytes a l l oca t ed ==27888== ==27888== 40 bytes i n 1 blocks ar e d efi n i t el y l o s t i n l os s record 1 of 1 ==27888== a t 0x4025018: malloc ( i n /usr/lib/valgrind/vgpreload_memch eck -x86-linux.so) ==27888== by 0x8048428: main ( p . c : 8 ) ==27888== ==27888== LEAK SUMMARY: d efi n i t el y l o s t : 40 bytes i n 1 blocks i n d i r ect l y l o s t : 0 bytes i n 0 blocks possibly l o s t : 0 bytes i n 0 blocks s t i l l r each able: 0 bytes i n 0 blocks suppressed: 0 bytes i n 0 blocks ==27888== ==27888== ==27888== ==27888== ==27888== ==27888== ==27888== For counts of detected and suppressed e r r o r s , rerun with : -v ==27888== ERRORSUMMARY:2 er r or s from 2 con texts (suppr essed: 11 from 6)
  • 218. Ejemplo de depuracio´nde memoria con Valgrind (III) Sistemas Operativos El Lenguaje de programaci´on C 218 / 218 Trascorregir errores $ valgrind --leak-check=full --show-reachable=yes . / a . o u t ==12056== Memcheck, a memory error detector ==12056== Copyright (C) 2002-2010, and G N UGPL’d, by Julian Seward e t a l . ==12056== Using Valgrind-3.6.1 and LibVEX; rerun with -h for copyright info ==12056== Command: . / a . o u t ==12056== 0 2 4 6 8 10 12 14 16 18 ==12056== ==12056== HEAPSUMMARY: in use a t e x i t : 0 bytes in 0 blocks t o t a l heap usage: 1 allocs, 1 f r ees , 40 bytes allocated ==12056== ==12056== ==12056== ==12056== All heap blocks were freed - - no leaks are possible ==12056== ==12056== For counts of detected and suppressed errors, rerun with: -v ==12056== ERRORSUMMARY:0 errors from 0 contexts (suppressed: 11 from 6)