SlideShare una empresa de Scribd logo
1 de 266
Sistemas Operativos El Lenguaje de programacio´n C
CENTRO DE ESTUDIOS TECNOLOGICOSY DE SERVICIOSNO.109
ESTEFANIA LOREDO CORTES
2AM PROGRAMACION
MARGARITA ROMERO ALVARADO
LENGUAJE C
SistemasOperativos
El Lenguaje de programacio´n C
Sistemas Operativos El Lenguaje de programacio´n C 1 / 265
El Lenguaje de programacio´n C
Sistemas Operativos
Universidade da Corun˜a
I
Introducci´on
Caracter´ısticasdel lenguaje C
Estructura de un programa C
Primerosejemplos
Compilaci´onde unprograma
Directivasdel precompilador
Depuraci´onmake
El Lenguaje de programacio´n C
Sistemas Operativos El Lenguaje de programacio´n C
Ejercicios
Tipos,operadoresyexpresiones
Nombresde variables
Tiposy taman˜osde datos
Constantes
Declaracionesde variables
Operadoresaritm´eticos
Operadoresde relaci´onyl´ogicos
II
Conversionesde tipo
Operadoresde bit
El Lenguaje de programacio´n C
Sistemas Operativos El Lenguaje de programacio´n C 3 / 265
Incrementoydecremento, asignaci´ony
expresiones
Expresi´oncondicional
Precedenciayordene evaluaci´on
Ejercicios
Control de flujo
Sentencias y bloques
if else else-if switch
bucleswhile,forydo..while
breaky continue gotoy
etiquetas
Ejercicios
El Lenguaje de programacio´n C
Sistemas Operativos El Lenguaje de programacio´n C
Funcionesyestructurade un programa
III
funciones
funcionesque nodevuelvenenteros
Variablesexternas
Variablesest´aticas
Variablesregistro
Inicializaci´on
Recursividad
EL preprocesadorC
Ejercicios
Arraysy punteros
El Lenguaje de programacio´n C
Sistemas Operativos El Lenguaje de programacio´n C 5 / 265
Punterosydirecciones
Punterosyargumentosa funciones
Operacionessobre punteros
Arraysy punteros
Arraysde punteros
Arraysmultidimensionales
IV
Punterosy arrays multidimensionales
Argumentosenlal´ıneade comando
Punterosafunciones
Ejercicios
Estructuras
El Lenguaje de programacio´n C
Sistemas Operativos El Lenguaje de programacio´n C
Estructuras
Operacionessobre estructuras
Punterosaestructuras
Arraysde estructuras
Estructuras autoreferenciadas
Uniones
Camposde bits
typedef
Ejercicios
BibliotecaC
BibliotecaC
El Lenguaje de programacio´n C
Sistemas Operativos 7 / 265
V
Documentaci´onenl´ınea
Asignaci´onde memoria
Funcionesde caracteres
Cadenasde caracteres
Entrada/salidaconformato
Entrada/salidaconformatoa fichero
Entrada/salidaconformatoa memoria
Entrada/salidasin formato
Ejercicios
Sistemas Operativos 8
Herramientas
Valgrind
El Lenguaje de programaci´on C
Introducci´on
Tipos,operadoresyexpresiones
Control de flujo
Funcionesyestructurade un programa
Arraysy punteros
Estructuras
BibliotecaC
Herramientas
Sistemas Operativos 9 / 265
El Lenguaje de programaci´on C
Introducci´on
Caracter´ısticasdel lenguaje C
Estructura de un programa C
Primerosejemplos
Compilaci´onde unprograma
Directivasdel
precompiladorDepuraci´on
make
Ejercicios
Sistemas Operativos 10
El Lenguaje de programacio´n C
Caracter´ısticas del lenguaje C
I Es el lenguaje de programaci´onde prop´ositogeneral asociado
al sistemaoperativoUNIX
I Es un lenguaje de medionivel.Tratacon objetosb´asicoscomo
car´acteres,nu´meros...;tambi´encon bitsy direccionesde
memoria
I Posee unagran portabilidad
Sistemas Operativos 11 / 265
I Se utilizapara laprogramaci´onde sistemas:construcci´onde
interpretes,compiladores,editoresde texto,etc
El Lenguaje de programacio´n C
I El lenguaje Cconstade
I El lenguaje C propiamente dicho: tipos de datos, expresiones y
estructuras de control
I Extensiones en forma de macros y un amplio conjunto de
librer´ıas predefinidas
Sistemas Operativos 12
El Lenguaje de programaci´on C
Introducci´on
Caracter´ısticasdel lenguaje C
Estructura de un programa C
Primerosejemplos
Compilaci´onde unprograma
Directivasdel
precompiladorDepuraci´on
make
Ejercicios
Sistemas Operativos 13 / 265
El Lenguaje de programacio´n C
Estructura de un programa C
I Un programae C consta de unoo m´as m´odulos(ficheros
fuentes)
I Cada m´odulopuede contener
I directivas del precompilador,p.epara “incluir”otros ficheros
(#include) y “definir” constantes y macros (#define)
I declaraciones devariables y prototipos de funciones
I una o m´as funciones
I comentarios
I Cada funci´onpuede contener
I directivas del precompilador
Sistemas Operativos 14
I declaraciones
I uno o m´as bloques
I comentarios
El Lenguaje de programacio´n C
I Cada bloque puede contener
I directivas del precompilador
I declaraciones
I una o m´as sentencias
I comentarios
Sistemas Operativos 15 / 265
El Lenguaje de programaci´on C
I Cada sentenciadebe estarterminadapor;
I Cada bloque de sentenciasse encierraentre llaves {... }
I La funci´ondenominadamaineslaque primerose ejecuta I Los
comentariospuedenaparecerencualquierlugardel c´odigoyse
insertanentre /*y */ as´ı
/* estoes uncomentario*/
I o entre // y final de l´ınea
// estoesotro comentario
Sistemas Operativos 16
El Lenguaje de programaci´on C
Introducci´on
Caracter´ısticasdel lenguaje C
Estructura de un programa C
Primerosejemplos
Compilaci´onde unprograma
Directivasdel
precompiladorDepuraci´on
make
Ejercicios
Sistemas Operativos 17 / 265
El Lenguaje de programacio´n C
Sistemas Operativos El Lenguaje de programacio´n C 18
Primeros ejemplos
#include <stdio.h>main() { printf("hola,primer
programa enCn");
}
#include <stdio.h>main() { int fahr,celsius;
intlower,upper,step;lower=0;upper=300;
step=20; fahr=lower;while(fahr<=upper) {
celsius=5*(fahr-32)/9;
Sistemas Operativos 19 / 265
printf("%dt%dn",fahr,celsius);
fahr=fahr+step;
}
}
El Lenguaje de programaci´on C
Introducci´on
Caracter´ısticasdel lenguaje C
Estructura de un programa C
Primerosejemplos
Compilaci´onde unprograma
Sistemas Operativos El Lenguaje de programacio´n C 20
Directivasdel
precompiladorDepuraci´on
make
Ejercicios
Compilacio´n de un programa
I Normalmente invocamosal compiladorconcc o gcc (el
compiladorde gnu)
I Cuandotecleamoscc programa.cpara generarun ejecutablea
partir de un ficherofuente obtenemosunejecutable,
t´ıpicamente denominadoa.out.Sinembargose realizantres
tareas
Sistemas Operativos 21 / 265
I Paso por el preprocesador C. Es el que procesa las l´ıneas que
comienzan con # (pe #include,#define...). Puede invocarse
directamente con cpp
I La compilaci´on propiamentedicha.Genera ficheros objeto (.o) a
partir de los ficheros fuente. Puede invocarsecomo cc -c
I El enlazado. Realizado por ld
El Lenguaje de programaci´on C
Sistemas Operativos El Lenguaje de programacio´n C 22
Introducci´on
Caracter´ısticasdel lenguaje C
Estructura de un programa C
Primerosejemplos
Compilaci´onde unprograma
Directivasdel
precompiladorDepuraci´on
make
Ejercicios
Sistemas Operativos 23 / 265
Directivas del precompilador
#includeIncluyeel fichero,cuyo nombre se indica,para su compilaci´on con
el resto del c´odigo
I Si el nombre del fichero va entre <...> se busca en el directorio
include del sistema (/usr/include). Porejemplo
#include <stdio.h>
hace que el fichero /usr/include/stdio.h se incluya enese punto
para sercompiladocon nuestroficherofuente
I El nombre se puede ponerentre comillas(“) yel sistema lobuscar´a
en el directorioactual (tambi´ense puede poneruna ruta
absoluta)
Sistemas Operativos El Lenguaje de programacio´n C 24
I Los ficheros se suelen denominar.h ycontienendeclaraciones de
tipos, variablesy prototipos de funciones (sonficheros fuente
que puedenverse)
El Lenguaje de programacio´n C
#define Define un s´ımbolo,es decir cada ocurrencia deese s´ımbolo es
sustituida por su definici´on.Por ejemplo
I El C distingue entre mayu´sculas y minu´sculas, aunque la
costumbre es utilizarmayu´sculas para los s´ımbolos definidos por
el preprocesador I ejemplo
#define MAX1024
hace que todaslas ocurrencias de la cadena MAXdentro del
co´digosonsustituidas por1024
Sistemas Operativos 25 / 265
I El co´digoque se compila lleva 1024 donde iba MAX
I Si MAXiba dentro de comillas ’’...‘‘, no se sustituye
Sistemas Operativos El Lenguaje de programacio´n C
26 / 265
#include <stdio.h>
#define UPPER300
#define LOWER0 #define
STEP 20 main() { intfahr,
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 27 / 265
Introducci´on
Caracter´ısticasdel lenguaje C
Estructura de un programa C
Primerosejemplos
Compilaci´onde un programa
Directivasdel
precompiladorDepuraci´on
make
Ejercicios
Sistemas Operativos El Lenguaje de programacio´n C
28 / 265
Depuracio´n
I Para depurar programas disponemos del depurador, que nos
permite ejecutar los programas en un entorno controlado
I Para usar el depuradora
Compilamos con cc -g
$gcc -g ejercicio1.c b Invocamos el depurador
pas´andoleel ejecutablecomo par´ametro
antonio@abyecto:~$ gdb a.out
GNU gdb (GDB) 7.3-debian
Copyright (C) 2011 Free Software Foundation,Inc. .......
(gdb)
Sistemas Operativos El Lenguaje de programaci´on
C 29 / 265
I Dentro del depurador podemos establecer puntos de ruptura con
break (break numerol´ınea o break nombrefunci´on), ejecutar
paso a paso con step o next, ver variables con display .... El
depurador disponede ayuda en l´ınea,mediante help
Introducci´on
Caracter´ısticasdel lenguaje C
Estructura de un programa C
Primerosejemplos
Compilaci´onde unprograma
Sistemas Operativos El Lenguaje de programacio´n C
30 / 265
Directivasdel
precompiladorDepuraci´on
make
Ejercicios
make
I Facilitael procesode generaci´onyactualizaci´onde un
programa.
I Determinaautom´aticamente qu´e partesde un programa deben
recompilarse ante una actualizaci´on de algunos m´odulos y las
recompila.
Sistemas Operativos El Lenguaje de programaci´on
C 31 / 265
I Se crean un archivo Makefile conlasdependenciasentre los
ficheros:unficherodebe actualizarsesi algunade sus
dependenciasesm´asreciente
I El Makefile define tambi´enlos mandatosnecesariospara
actualizarcada archivoen base a sus dependencias
Sistemas Operativos El Lenguaje de programaci´on C 32 /
265
I El Makefile estaformadoporunaserie de reglas.Donde cada
regla tiene el siguiente formato objetivo: dependencia1
dependencia2 ...
mandato1
mandato2
mandato3
...
I N´otese que antesde cada mandatohay uncaracter tab
I Para compilarusamoslaorden‘‘make objetivo’’que
I Encuentra la regla correspondientea objetivo
I Trata sus dependencias como objetivos y las resuelverecursivamente
Ejemplo muy sencillo de make
Sistemas Operativos El Lenguaje de programaci´on
C 33 / 265
I Dentrodel Makefile se puedendefinirvariables(yaccederasus
valores) comoenel shell: VAR=valorparadefinirlavariable y
${VAR}o $(VAR) para accedera su valor.$@ se refiere al
nombre del objetivo
I Consideremosel siguiente programa(programa.c)
#include "funcion1.h"#include
"funcion2.h"
main() { int
a=MAX1,b=MAX2;
funcion1();funcion2();
}
I Donde funcion1.h
Ejemplo muy sencillo de make
Sistemas Operativos El Lenguaje de programacio´n C 34 /
265
#define MAX1 1000 void
funcion1(void); I y
funcion2.h
#define MAX22000 void
funcion2(void); I Adem´as,
funcion1.ces#include
"funcion1.h"
voidfuncion1(void)
{ inti=MAX1;
return;
}
I y funcion2.ces#include
"funcion2.h"
Ejemplo muy sencillo de make
Sistemas Operativos El Lenguaje de programaci´on
C 35 / 265
voidfuncion2(void)
{ intj=MAX2;
return;
}
I si queremoscompilarlo,ygenerarunprogramallamado
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´ıamos programa.c dela
siguientemanera gcc -o
programa.out programa.c funcion2.o
funcion1.o
Ejemplo muy sencillo de make
Sistemas Operativos El Lenguaje de programacio´n C 36 /
265
I Cada vezque se modificase unode losarchivoshabr´ıa que repetir
alguna(o todas) de lasanteriorescompilaciones
I El siguiente archivoMakefile se ocupade decidirque hayque
compilary hacerlo
programa.out: programa.c funcion1.h funcion2.hfuncion1.ofuncion2.o gcc -o programa.out
programa.c funcion2.ofuncion1.o
funcion1.o: funcion1.h funcion1.c gcc -c
funcion1.ofuncion1.c
funcion2.o: funcion2.h funcion2.c gcc -c
funcion2.ofuncion2.c
limpiar:
rm programa.out funcion1.ofuncion2.o
Sistemas Operativos El Lenguaje de programacio´n
C 37 / 265
Otro ejemplo de make
CC=gcc
CFLAGS=-gOBJS2=prac2.o
aux1.oall:prac1 prac2
prac1: prac1.o aux1.ogcc -g -oprac1 prac1.o
aux1.o
prac2: $(OBJS2)
${CC} ${CFLAGS} -o$@ ${OBJS2} prac1.o
prac2.o: prac.h
Sistemas Operativos El Lenguaje de programacio´n C
38 / 265
clean:
rm -f prac1.o aux1.o${OBJS2}
Introducci´on
Caracter´ısticasdel lenguaje C
Estructura de un programa C
Primerosejemplos
Compilaci´onde unprograma
Directivasdel
precompiladorDepuraci´on
make
Sistemas Operativos El Lenguaje de programacio´n
C 39 / 265
Ejercicios
Ejercicios
I Compilarlosprogramasde ejemplode estasecci´on
I Observarlassalidadel preprocesadorde cadaunode ellos I
Usar el depuradorparaejecutarpasoa pasolosdos u´ltimosy
vercomo cambiande valor lasvariablesenel bucle
I Crear un Makefile paraunarchivoy compilarloconmake
Sistemas Operativos El Lenguaje de programaci´on C 40
Introducci´on
Tipos,operadoresyexpresiones
Control de flujo
Funcionesyestructurade un programa
Arraysy punteros
Estructuras
BibliotecaC
Herramientas
Nombresde variables
Tiposy taman˜osde datos
Tipos, operadores y expresiones
Sistemas Operativos El Lenguaje de programacio´n C 41 / 265
Constantes
Declaracionesde variables
Operadoresaritm´eticos
Operadoresde relaci´onyl´ogicos
Conversionesde tipo
Operadoresde bit
Incrementoydecremento, asignaci´onyexpresiones
Expresi´oncondicional
Precedenciayordene evaluaci´on
Ejercicios
Sistemas Operativos El Lenguaje de programaci´on C 42
Nombres de variables
I losnombresde variablespuedentenerletras,nu´merosyel
s´ımbolo’ ’.
I Debenempezarporunaletra(puedenempezarpor’ ’ perono es
recomendable puesesel criterioque usanlasrutinasde la
biblioteca)
I Puedenllevarmayu´sculasyminu´sculas.El Cdistingue entre
mayu´sculasyminu´sculas
Tipos, operadores y expresiones
Sistemas Operativos El Lenguaje de programacio´n C 43 / 265
I La costumbre es que las variables van en minu´scula y las
constantes en mayu´scula
I Las palabrasreservadas if,else ... no puedenusarse como
nombresde variables
Nombresde variables
Tiposy taman˜osde datos
Constantes
Declaracionesde variables
Operadoresaritm´eticos
Operadoresde relaci´onyl´ogicos
Sistemas Operativos El Lenguaje de programaci´on C 44
Conversionesde tipo
Operadoresde bit
Incrementoydecremento, asignaci´onyexpresiones
Expresi´oncondicional
Precedenciayordene evaluaci´on
Ejercicios
Tipos, operadores y expresiones
Sistemas Operativos El Lenguaje de programacio´n C 45 / 265
Tipos y taman˜os de datos
I El C tiene pocostiposde datos char Un byte. Contiene un
caracter (o un nu´mero entre 0 y 255)
int Un entero. El taman˜o depende del sistema donde estemos
floatUn real
double Un real en doble precisi´on
I Adem´asint puede sershortolong y tantoint como char pueden
sersigned o unsigned
Sistemas Operativos El Lenguaje de programaci´on C 46
I unsigned longint, unsinged long,
I El taman˜odepende del compiladorpero intno esmenorque
shortni mayor que long
I Existe tambi´enel longlongintcon mayor rango y el longdouble
con precisi´onextendidaparalosreales
Nombresde variables
Tiposy taman˜osde datos
Constantes
Declaracionesde variables
Operadoresaritm´eticos
Tipos, operadores y expresiones
Sistemas Operativos El Lenguaje de programacio´n C 47 / 265
Operadoresde relaci´onyl´ogicos
Conversionesde tipo
Operadoresde bit
Incrementoydecremento, asignaci´onyexpresiones
Expresi´oncondicional
Precedenciayordene evaluaci´on
Ejercicios
Sistemas Operativos El Lenguaje de programaci´on C 48
Constantes
I Una constante enteraes int(ejemplo12714)
I Si queremosque sealong le ponemosel sufijo’l’o’L’.
(ejemplo12714L)
I Una constante conun puntodecimal oun exponenteesun
double(ejemplos3.141516, 1e-5)
I Si queremosque seafloatle ponemosel sufijo’f’o’F’
Tipos, operadores y expresiones
Sistemas Operativos El Lenguaje de programacio´n C 49 / 265
(ejemplos3.141516f, 1e-5F)
I Si unaconstante enteracomienzapor0 se entiendeque est´aen
octal y si comienzapor0x o 0X enhexadecimal
I Ejemplos 034892 (octal) 0xffff4000 (hexadecimal)
Sistemas Operativos El Lenguaje de programaci´on C 50
I Una constante car´acter se pone entre comillassimples(ejemplo
’a’).Puede aparecerenoperacionesysuvalores el c´odigode
dichocaracter
I Una constante car´acter tambi´ense puede expresarporsu
c´odigoen octal o hexadecimal.Ejemplos:’077’(octal) o
’x3f’(hexadecimal)
I Algunasconstantesespeciales:’t’(tab) ’n’(finde l´ınea’) ’r’
retornode carro ...
I Una constante cadenase encierraentre comillasdobles
(”...“). Las cadenas en C est´an terminadas por el caracter
Sistemas Operativos El Lenguaje de programacio´n C 51 / 265
’0’,
I Una expresi´onconstante esunaexpresi´onque soloincluye
constantes.Puede serevaluadaentiempode compilaci´ony
serutilizadaenlugarde una constante
#define MAXIMO 1024 char linea[MAXIMO/2+20]; I Un caso
particularde constantessonlostiposenumerados.
Un tipo enumerado es una lista de valores enteros constantes
enumboolean{FALSE,TRUE};
I Salvoque se especifique otracosa,comienzanen0,as´ı FALSE
ser´ıa 0 y TRUE 1
Sistemas Operativos El Lenguaje de programaci´on C 52
I Tambi´enpuede especificarse el valorde comienzo
enumdias{LUNES=1, MARTES, MIERCOLES,
JUEVES,VIERNES,SABADO,DOMINGO};
Tipos, operadores y expresiones
Nombresde variables
Tiposy taman˜osde datos
Constantes
Declaracionesde variables
Operadoresaritm´eticos
Sistemas Operativos El Lenguaje de programacio´n C 53 / 265
Operadoresde relaci´onyl´ogicos
Conversionesde tipo
Operadoresde bit
Incrementoydecremento, asignaci´onyexpresiones
Expresi´oncondicional
Precedenciayordene evaluaci´on
Ejercicios
Sistemas Operativos El Lenguaje de programacio´n C 54
Declaraciones de variables
I Todas lasvariablesdebenserdeclaradasantesde suuso. I Las
declaracionesdebenapareceral principiode cadafunci´ono
bloque de sentencias
I La declaraci´onconstade un tipode variable yuna listade
variablesseparadasporcoma
inti,j;floatx,pi;
unsignedlonglongitud,contador;
I Las variablespuedeninicializarse enladeclaraci´on
floatpi=3.1416; unsignedlong
contador=0;
Sistemas Operativos El Lenguaje de programacio´n C 55 / 265
I Puede utilizarse el simbol const para indicar que la variable no
puede sercambiadaconstfloat e=2.7182;
Tipos, operadores y expresiones
Nombresde variables
Tiposy taman˜osde datos
Constantes
Declaracionesde variables
Operadoresaritm´eticos
Operadoresde relaci´onyl´ogicos
Conversionesde tipo
Operadoresde bit
Sistemas Operativos 56
Incrementoydecremento, asignaci´onyexpresiones
Expresi´oncondicional
Precedenciayordene evaluaci´on
Ejercicios
Operadores aritm´eticos
+ suma
- resta
* multiplicaci´on
Sistemas Operativos El Lenguaje de programacio´n C 57 / 265
/ divisi´on.Si losoperandossonenterosladivisi´onesentera
% restoentero.Noadmite operandos floatodouble
El Lenguaje de programaci´on C
Sistemas Operativos
#include <stdio.h>
#define UPPER300
#define LOWER0 #define
STEP 20 main() { floatfahr,
celsius;fahr=LOWER;
while(fahr<=UPPER) {
celsius=5.0/9.0*(fahr-32)
printf("%ft%fn",fahr,celsius);
fahr=fahr+STEP;
}
}
El Lenguaje de programaci´on C
Sistemas Operativos 59 / 265
Tipos, operadores y expresiones
Nombresde variables
Tiposy taman˜osde datos
Constantes
Declaracionesde variables
Operadoresaritm´eticos
Operadoresde relaci´onyl´ogicos
Conversionesde tipo
Operadoresde bit
Incrementoydecremento, asignaci´ony
expresiones
Expresi´oncondicional
Sistemas Operativos
Precedenciayordene evaluaci´on
Ejercicios
El Lenguaje de programacio´n C
Operadores de relacio´n y lo´gicos
I Operadoresde relaci´on
< menor que
Sistemas Operativos 61 / 265
<= menor o igual que>
mayor que
>= mayor o igual que
== igual a
! = distinto
El Lenguaje de programaci´on C
Sistemas Operativos El Lenguaje de programaci´on C 62 / 265
I Operadoresl´ogicos
&& AND ||
OR
! NOT
I Los operadoresl´ogicosse evalu´ande izquierdaaderecha,yse
detiene laevaluaci´ontanprontocomose conoce el resultado.
Por ejemplo
i<MAXIMO && (linea[i]=getchar())!=’n’&&linea[i]!=EOF
Comprobar´ıa primeroque i esmenorque MAXIMO; si lo es
asignael valorque devuelve getchar()alinea[i] ycompruebaque
Tipos, operadores y expresiones
Sistemas Operativos El Lenguaje de programacio´n C 63 / 265
esdistintode fin de l´ınea. y enese caso compruebaque linea[i]
no esEOF
Nombresde variables
Tiposy taman˜osde datos
Constantes
Declaracionesde variables
Operadoresaritm´eticos
Operadoresde relaci´onyl´ogicos
Conversionesde tipo
Operadoresde bit
Incrementoydecremento, asignaci´onyexpresiones
Expresi´oncondicional
Sistemas Operativos El Lenguaje de programaci´on C 64 / 265
Precedenciayordene evaluaci´on
Ejercicios
Conversiones de tipo
I Cuandoenuna operaci´onaparecentiposdistintos,el Cconvierte
el tipode menorrango al tipode mayor antesde realizarla
operaci´on
I Podemosforzarlaconversi´onde tiposponiendoantesde lavariable
el tipoal que queremosconvertir.
Tipos, operadores y expresiones
Sistemas Operativos El Lenguaje de programacio´n C 65 / 265
I Por ejemplo,lafunci´on sin esperaunargumentode tipo double.
Podemospasarle unavariable enterahaciendounaconversi´on
de tipo
double seno;intn;seno=sin((double)n);...double
centigrados,fahrenheit=55.3;centigrados= 5/9 * (fahrenheit -
32); //77F = 25C centigrados= 5.0/9 * (fahrenheit - 32);
Nombresde variables
Tiposy taman˜osde datos
Constantes
Declaracionesde variables
Operadoresaritm´eticos
Operadoresde relaci´onyl´ogicos
Sistemas Operativos El Lenguaje de programaci´on C 66 / 265
Conversionesde tipo
Operadoresde bit
Incrementoydecremento, asignaci´onyexpresiones
Expresi´oncondicional
Precedenciayordene evaluaci´on
Ejercicios
Tipos, operadores y expresiones
Sistemas Operativos El Lenguaje de programacio´n C 67 / 265
Operadores de bit
I Podemosoperarsobre losbitsde unavariable entera(lasvariables
char son un tipode enteros).Todossonoperadoresbinarios,
exceptoel complementoa1
& AND bita bit
| OR bit a bit
ˆ XOR bit a bit
<< Desplazamiento de bits a la izquierda
Sistemas Operativos El Lenguaje de programaci´on C 68 / 265
>> Desplazamiento de bits a la derecha ˜
Complemento a 1
Nombresde variables
Tiposy taman˜osde datos
Constantes
Declaracionesde variables
Operadoresaritm´eticos
Operadoresde relaci´onyl´ogicos
Conversionesde tipo
Operadoresde bit
Incrementoydecremento, asignaci´onyexpresiones
Expresi´oncondicional
Tipos, operadores y expresiones
Sistemas Operativos El Lenguaje de programacio´n C 69 / 265
Precedenciayordene evaluaci´on
Ejercicios
Sistemas Operativos El Lenguaje de programacio´n C 70
Incremento y decremento, asignacio´n y expresiones
I Losoperadoresincremento(++) ydecremento(−−) puedenusarse
dentro de expresiones. Si preceden a la variable, el incremento
o decremento se produce antes de usarla, en caso contrario
despu´es.Ejemplo:
linea[i++]=’a’;
asignaa linea[i] el valor’a’yluegoincrementael valorde i,
mientrasque linea[--i]=’z’
primerodecrementael valorde i yluegole asignaa linea[i]el
valor’z’
Sistemas Operativos El Lenguaje de programacio´n C 71 / 265
I Cuandose modificael valorde una variable apartirde un
valoranterior,puede escribirse de formam´ascompacta I
xOPERADOR=expresi´on;equivaleax=x OPERADOR
(expresi´on);
x+=expresio´n; equivale a x=x+expresio´n; x-=expresio´n;
equivale a x=x-expresio´n;
x*=expresio´n; equivale a x=x*expresio´n; .. .
x>> =expresio´n; equivale a x=x>>expresio´n;
x&=expresio´n; equivale a x=x&expresio´n; .. .
x+=2; /*x=x+2*/ x*=4+y;
/*x=x*(4+y)*/
Sistemas Operativos El Lenguaje de programacio´n C 72
Tipos, operadores y expresiones
Nombresde variables
Tiposy taman˜osde datos
Constantes
Declaracionesde variables
Operadoresaritm´eticos
Operadoresde relaci´onyl´ogicos
Conversionesde tipo
Operadoresde bit
Incrementoydecremento, asignaci´onyexpresiones
Sistemas Operativos El Lenguaje de programacio´n C 73 / 265
Expresi´oncondicional
Precedenciayordene evaluaci´on
Ejercicios
Expresio´n condicional
I Es de laforma expre1?expre2 :expre3
I Se evalu´an expre1,si escierta (distintade 0) el resultadoeslo
que valgaexpre2
I Si es0, el resultadoesloque valga expre3
I Ejemplos
Sistemas Operativos El Lenguaje de programacio´n C 74
char * a; a= (p==NULL)?"cadena1": gets(p);
intn; n= i*j*k? 2567: (int) sqrt(pi);printf ("Resultado:%sn"
(p!=NULL)?p:" error");
Tipos, operadores y expresiones
Nombresde variables
Tiposy taman˜osde datos
Constantes
Declaracionesde variables
Operadoresaritm´eticos
Sistemas Operativos El Lenguaje de programacio´n C 75 / 265
Operadoresde relaci´ony l´ogicos
Conversionesde tipo
Operadoresde bit
Incrementoydecremento, asignaci´onyexpresiones
Expresi´oncondicional
Precedenciayordene evaluaci´on
Ejercicios
Sistemas Operativos El Lenguaje de programacio´n C 76
Precedencia y orden e evaluaci´on
I El C no especificaenque ordense evalu´anlosoperandosde una
expresi´on.Porejemplo,enlaexpresi´on x =f () + g() no
sabemossi se evaluar´aprimerof() og()
I El C tampocoespecificaenque ordense evalu´anlos
par´ametrosa una funci´on,
printf (‘‘%d%d’’,++i,i) produce un
resultadoindeterminado
I Las operacionesl´ogicasse evalu´ande izquierdaaderechayse
detiene laevaluaci´ontanprontocomose conozcael resultado I
Sistemas Operativos El Lenguaje de programacio´n C 77 / 265
El C s´ı define unaprecedenciaentre distintosoperadores,
Adem´ascada operadortiene unaasociatividad,comopuede
verse enlatabla siguiente
Sistemas Operativos 78
OPERADORES asociatividad
()[]->. izquierdaaderecha
! ~++---*& (tipo) sizeof derechaa izquierda
*/ izquierdaaderecha
+- izquierdaaderecha
<<>> izquierdaaderecha
<<=>>= izquierdaaderecha
==!= izquierdaaderecha
& izquierdaaderecha
^ izquierdaaderecha
| izquierdaaderecha
Sistemas Operativos El Lenguaje de programacio´n C 79 / 265
&& izquierdaaderecha
|| izquierdaaderecha
?: derechaa izquierda
=+=-=*=/=%=&=|= etc derechaa izquierda
, izquierdaaderecha
El Lenguaje de programaci´on C
Tipos, operadores y expresiones
Nombresde variables
Tiposy taman˜osde datos
Constantes
Declaracionesde variables
Operadoresaritm´eticos
Sistemas Operativos 80
Operadoresde relaci´onyl´ogicos
Conversionesde tipo
Operadoresde bit
Incrementoydecremento, asignaci´onyexpresiones
Expresi´oncondicional
Precedenciayordene evaluaci´on
Ejercicios
Ejercicios
I Escribirun programa enC que nos imprimalostaman˜osde
todoslostiposde datos
I Escribiruna funci´on InvierteBitsC que invierte losbitsde un
caracter sinsigno
Sistemas Operativos El Lenguaje de programacio´n C 81 / 265
I Escribiruna funci´on InvierteBitsS que invierte losbitsde un
enterocortosin signo.
I Escribiruna funci´on InvierteBitsLque invierte losbitsde un
enterolargosinsigno
I Hacer un programa que imprimalosenterosdel 0al 100 y el
resultadode invertirlosbits
I Considerando los nu´meros del 0 al 100 como caracteres sin signo
I Considerando los nu´meros del 0 al 100 como enteros cortos sin
signo
I Considerando los nu´meros del 0 al 100 como enteros largos sin
signo
El Lenguaje de programaci´on C
Sistemas Operativos
Introducci´on
Tipos,operadoresyexpresiones
Control de flujo
Funcionesyestructurade un programa
Arraysy punteros
Estructuras
BibliotecaC
Herramientas
Sistemas Operativos 83 / 265
El Lenguaje de programaci´on C
Control de flujo
Sentencias y
bloques if elseelse-if
switch
bucleswhile,forydo..while
breaky continue gotoy
etiquetas
Ejercicios
Sistemas Operativos
El Lenguaje de programacio´n C
I Una expresi´onseguidaenun; esuna sentencia
I Toda sentencia debe ir terminada con ;
I Pueden ir varias sentenciasen una misma l´ınea
I Las llaves {}se empleanparaagrupar sentencias.enloque se
denominabloque
I Un bloque essint´acticamente equivalenteauna sentencia
I Dentrode unbloque puede habersentenciasydeclaraciones
Sistemas Operativos 85 / 265
El Lenguaje de programaci´on C
Control de flujo
Sentencias y
bloques if elseelse-if
switch
bucleswhile,forydo..while
breaky continue gotoy
etiquetas
Ejercicios
Sistemas Operativos
El Lenguaje de programacio´n C
Sistemas Operativos El Lenguaje de programacio´n C 87 / 265
if else
if (expresi´on)
sentencia1
else
sentencia2
I Se evalu´aexpresi´on.Si esdistintade 0 (cierta) se ejecuta
sentencia1,si es0 se ejecutasentencia2
I El else esopcional
I Tanto sentencia1 comosentencia2 puedenserunbloque se
sentenciasentre llaves {}
Sistemas Operativos
I Expresi´onnoterminacon;
I Dado que el else esopcional,unasentencia else siempre va
con el if inmediatamente anterior
I El siguiente c´odigoesincorrecto
if (n>0)
if (a>b)
printf ("aes mayorque bn");
else
printf ("nesmenorque 0n");
I La versi´oncorrectaser´ıa
if (n>0) { if
(a>b)
Sistemas Operativos El Lenguaje de programacio´n C 89 / 265
printf ("aes mayorque bn");
} else
printf ("nesmenorque 0n");
El Lenguaje de programaci´on C
Control de flujo
Sentenciasybloquesif else else-
if switch bucleswhile, for y
do..whilebreakycontinuegotoy
etiquetas
Ejercicios
Sistemas Operativos El Lenguaje de programacio´n C 90
else-if
if (expresi´on1)
sentencia1
else if(expresi´on2)
sentencia2
else if(expresi´on3)
sentencia3 ...else
sentencian
I Permite tomardecisionesmu´ltiples
I Se evalu´anenorden
Sistemas Operativos El Lenguaje de programacio´n C 91 / 265
Control de flujo
Sentenciasybloquesif else else-
if switch bucleswhile, for y
do..whilebreakycontinuegotoy
etiquetas
Ejercicios
switch
switch (expresi´on) { case
constante1: sentencias case
Sistemas Operativos 92
constante2: sentencias case
constante3:sentencias...
default:sentencias }
I Permite tomar una decisi´on mu´ltiple basada en una expresi´on
que puede tomarunnu´merode valoresconstantesenteros(los
char sonun tipode entero)
I El valorde expresi´onse vacomparandocon lasconstantespor
ordeny una vezque coincide conunade ellasse ejecutan
todaslas sentencias(incluidaslasde los casessiguientes)hasta
que se encuentralasentenciabreak
I Esto permite agrupar varios valores constantes quecompartan
una misma acci´on
Sistemas Operativos El Lenguaje de programacio´n C 93 / 265
I Si no queremos que pasede un case al siguiente,debemos
terminarlo con break
El Lenguaje de programaci´on C
Sistemas Operativos 94
#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; }
El Lenguaje de programaci´on C
Sistemas Operativos 95 / 265
Control de flujo
Sentenciasybloques
if else else-if switch
bucleswhile,forydo..while
breaky continue gotoy
etiquetas
Ejercicios
Sistemas Operativos 96
El Lenguaje de programacio´n C
bucleswhile, for y do..while
while (expresi´on)
sentencia
I Se evalu´aexpresi´on,ysi es distintade 0 se ejecutasentencia
I sentencia debe estarterminadapor;
I sentencia puede serunbloque se sentenciasentre llaves {}
Sistemas Operativos 97 / 265
El Lenguaje de programacio´n C
intstrlen(chars[])
{ inti;
i=0; while (s[i]!=’0’)
++i; returni;
}
El Lenguaje de programaci´on C
for (expr1;expr2;expr3) sentencia
Sistemas Operativos 98
I Equivale exactamente a
expr1;while
(expr2){
sentencia
expr3;}
I La expresionesdel for,adiferenciade otroslenguajes,notienen
por que serreferidasaenteros,puedenserexpresionesde
cualquiertipo
El Lenguaje de programacio´n C
Sistemas Operativos 99 / 265
intatoi(chars[])
{
inti, n;
n=0; for(i=0;s[i]>=’0’&& s[i]<=’9’;++i)
n=10*n+(s[i]-’0’);
returnn;
}
El Lenguaje de programaci´on C
Sistemas Operativos 100
do
sentencia
while (expresi´on)
I Se ejecutasentenciaydespu´esse evalu´aexpresi´on,conloque
sentencia se ejecutaal menosuna vez
I sentencia debe estarterminadapor;
I sentencia puede ser un bloque se sentencias entre llaves {}
Sistemas Operativos 101 / 265
El Lenguaje de programaci´on C
Control de flujo
Sistemas Operativos El Lenguaje de programacio´n C 10
Sentencias y bloques if else else-
if switch bucleswhile, for y
do..whilebreakycontinuegotoy
etiquetas
Ejercicios
break y continue
I C proporcionadosmodosde salidade losbucles:breaky
continue
break Provoca la salidadel bucle. Si hay varios bucles anidados
provoca la salidadeaquel donde se encuentra
Sistemas Operativos El Lenguaje de programacio´n C 103 / 265
continue Provoca la salidadela presente iteraci´on del bucle.Se vuelve a
la condici´on.
I breakse utilizatambi´enparalasalidadel switch
int i; for (i=1;i<10;i++) { if (i)
continue; //break;
printf("n i vale%d",i);
}
Sentencias y bloques if else else-
if switch bucleswhile, for y
do..whilebreakycontinuegotoy
etiquetas
Control de flujo
Sistemas Operativos El Lenguaje de programacio´n C 10
Ejercicios
Sistemas Operativos 105 / 265
goto y etiquetas
I Aunque nosonformalmente necesarias,ni convenientes,C
dispone de unasentenciagotoyetiquetas
I Una etiquetatiene el mismoformatoque unnombre de
variable,seguidade dospuntos
I Debe estaren lamismafunci´onendonde se encuentrael goto
for ( ... ) for( ...) { for (
...) {
...
if (disaster) goto
error;
}
Control de flujo
Sistemas Operativos 106
...error:
/* cleanup the mess*/
El Lenguaje de programaci´on C
Sentenciasybloquesif else else-
if switch bucleswhile, for y
do..whilebreakycontinuegotoy
etiquetas
Ejercicios
El Lenguaje de programacio´n C
Sistemas Operativos 107 / 265
Ejercicios
I Escribiruna funci´onenC ConvierteAEnt,que apartir de una
cadenade caracteresque contiene larepresentaci´onde un
enteroenunabase,y dicha base nosdevuelveel entero
I Escribiruna funci´onenC ConvierteACad,que apartirde un
enteroyuna base nos devuelve unarepresentaci´onde entero
endicha base
I Comprobar que son correctas
I Podemos suponer que la longitud m´axima de la cadena es 16 I
hacerun programaenC que a imprimatodoslosenterosdel32al
Control de flujo
Sistemas Operativos 108
64 en todas las bases de 2 a 16. Imprime un entero (en las 16
bases) porl´ınea
El Lenguaje de programacio´n C
Sistemas Operativos 109 / 265
Introducci´on
Tipos,operadoresyexpresiones
Control de flujo
Funcionesyestructurade un programa
Arraysy punteros
Estructuras
BibliotecaC
Herramientas
Sistemas Operativos
El Lenguaje de programaci´on C
Funciones y estructura de un programa
funciones
funcionesque no devuelvenenteros
Variablesexternas
Variablesest´aticas
Variablesregistro
Inicializaci´on
Recursividad
EL preprocesadorC
Ejercicios
Sistemas Operativos 111 / 265
El Lenguaje de programacio´n C
funciones
I Un programae C esuna colecci´onde funciones.
I Una de esasfuncionesse llama main yesla primeraen
ejecutarse
I Las funciones pueden residir en uno o varios ficheros fuente I
Cada funci´on tiene la forma tipo de dato nombre funcion
(declaracionesargumentos)
{ declaracionesy
sentencias
}
Sistemas Operativos
I Se puede omitirel tipode datoque devuelvelafunci´on(en
ese caso se asume que esint
El Lenguaje de programaci´on C
Sistemas Operativos El Lenguaje de programaci´on C 113 / 265
I Una funci´onpuede notenerargumentosonotenerdeclaraciones
o sentencias
funcion_simple() {
}
I Cuandouna funci´onnollevapar´ametrosono devuelveningu´n
valorse usael t´ermino void
voidfuncion_nada(void)
#include <stdio.h>
#define MAXLINE1000 /* maximuminputline length*/
intgetline(charline[],intmax) intstrindex(charsource[],char
searchfor[]);charpattern[] ="ould";/* patternto searchfor */
Sistemas Operativos 114 / 265
/* findall linesmatchingpattern*/main() {
char line[MAXLINE];intfound=0;
while (getline(line,MAXLINE) >0) if
(strindex(line,pattern)>=0) {
El Lenguaje de programacio´n C
printf("%s",line);found++;
} return
found;
}
/* getline:getline intos,returnlength*/intgetline(chars[],
intlim)
{
Sistemas Operativos El Lenguaje de programaci´on C 115 / 265
intc, i; i = 0;
while (--lim>0 && (c=getchar()) != EOF && c != ’n’)
s[i++] = c;
if (c == ’n’) s[i++] = c;
s[i] = ’0’; returni;
Sistemas Operativos El Lenguaje de programaci´on C 116 /
}
/* strindex:returnindex of tins, -1 if none */ intstrindex(chars[],
char t[])
{
inti, 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 117 / 265
I Las funcionesdevuelvenvaloresmediantelasentenciareturn
I El formato es
return expresi´on; o
return (expresi´on);
I expresi´on se convierte al tipo de dato que devuelve la funci´on
I Puede aparecer en cualquier partede una funci´on y provoca la
inmediata salida deella
I Si dicha sentencia aparecedentro de un bucle provoca la salidade
la funci´on y por tanto del bucle
Funciones y estructura de un programa
funciones
Sistemas Operativos 118 /
funcionesque nodevuelvenenteros
Variablesexternas
Variablesest´aticas
Variablesregistro
Inicializaci´on
Recursividad
EL preprocesadorC
Ejercicios
El Lenguaje de programacio´n C
Sistemas Operativos 119 / 265
funciones que no devuelven enteros
I C asume que toda funci´on,salvoque se especifique encontrario,
devuelveunentero
I Si tenemosunafunci´onque devuelve unvalorque noesun
entero,ysobre todo,si la definici´onde dichafunci´onaparece
enel c´odigo despu´esde laprimeravezque esllamada,
debemos declararla
I Esto se hace declarandoel tipoque devuelvelafunci´on. I
Podemosdeclarartambi´enlospar´ametrosque recibe,as´ıel
compiladorpodr´acomprobarla sintaxiscuandoesllamada I
En el ejemplosiguiente podemosverque
Sistemas Operativos 120 / 265
se declaranlosvaloresdevueltosporlasfuncionesllamadas
desde main
El Lenguaje de programacio´n C
#include <stdio.h>
#include <ctype.h>
#define MAXLINE100 /* rudimentary calculator*/main() { double
sum,atof(char[]);//<-- Declaraci´onfunci´oncharline[MAXLINE];int
getline(charline[],intmax);
sum= 0; while (getline(line,MAXLINE) >0)
printf("t%gn",sum+=atof(line));
Sistemas Operativos 121 / 265
return0;
}
El Lenguaje de programaci´on C
double atof(chars[])
{ double val, power; inti, sign;
for (i = 0; isspace(s[i]);i++) /*skipwhite 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++;
Sistemas Operativos 122 / 265
for (power=1.0; isdigit(s[i]);i++) {
val = 10.0 * val + (s[i] - ’0’);power*= 10;
} returnsign* val / power;
}
El Lenguaje de programaci´on C
Sistemas Operativos 123 / 265
Funciones y estructura de un programa
funciones
funcionesque nodevuelvenenteros
Variablesexternas
Variablesest´aticas
Variablesregistro
Inicializaci´on
Recursividad
EL preprocesadorC
Ejercicios
Sistemas Operativos El Lenguaje de programacio´n C 124
Variables externas
I Variablesexternassonlasque est´andefinidasfueradel cuerpo
de cualquierfunci´on
I Son compartidasportodoslas funcionesenmismofichero
fuente desde dondeest´adefinidalavariablehastael final del
fichero
I En C, las variablesdefinidasdentrode bloquesse llaman
autom´aticas,se creanautom´aticamente cuandocomienzala
ejecuci´ondel bloqueyse desasignanal terminardicha
ejecuci´on
Sistemas Operativos 125 / 265
El Lenguaje de programaci´on C
I El dominio(zonadonde se reconoce el nombre) de lasvariables
autom´aticasse reduce al bloque donde est´andeclaradas
I El dominiode losargumentosa una funci´onesdicha funci´on I Si
enun bloque interiorse declaraunavariable conel mismonombre
que unaenunbloque masexterior(ounaexterna) dentrode dicho
bloque el nombre se refiere aladeclaradaen ´el I Si queremosque
una variable externa sea compartida por varios ficheros fuente
distintos, debe definirse en uno de ellos y en los otros declararla
con el identificadorextern
Sistemas Operativos El Lenguaje de programacio´n
C 126 / 265
funciones
funcionesque nodevuelvenenteros
Variablesexternas
Variablesest´aticas
Variablesregistro
Inicializaci´on
Recursividad
EL preprocesadorC
Ejercicios
Variables est´aticas
I Una variable est´aticaesunavariable local de unafunci´onque no
se crea y destruye al llamara la funci´on
Funciones y estructura de un programa
Sistemas Operativos El Lenguaje de programacio´n
C 127 / 265
I Se declaran anteponiendo la palabra static a la declaraci´on
voidfuncioncilla(void)
{ staticint veces=0;
++vecesprintf ("Estafuncionha sidollamada%dn"veces);}
I Desde el puntode vistadel almacenamiento, unavariableest´atica
esen realidadunavariable externa,yel termino staticlahace
privadaa la funci´on
I Si unavariable externa(ounafunci´on) ladeclaramos staticla
hacemosprivadapara el ficherofuente dondeest´adefinida
funciones
funcionesque nodevuelvenenteros
Sistemas Operativos El Lenguaje de programacio´n
C 128 / 265
Variablesexternas
Variablesest´aticas
Variablesregistro
Inicializaci´on
Recursividad
EL preprocesadorC
Ejercicios
Funciones y estructura de un programa
Sistemas Operativos El Lenguaje de programacio´n
C 129 / 265
Variables registro
I La declaraci´onregisterantesdel nombre de unavariableindicaal
compilador que esa variable va a usarse intensamente y que
seriaconveniente almacenarlaenunregistrode lam´aquina
registerintindice;
I El compiladortiene libertadde colocarlaenunregistroono I
Soloesaplicable avariablesautom´aticasypar´ametrosde las
funciones
Sistemas Operativos El Lenguaje de programacio´n
C 130 / 265
I No puede preguntarse porladirecci´onde unavariable registro,
aunque de hechono se almacene enunregistro funciones
funcionesque nodevuelvenenteros
Variablesexternas
Variablesest´aticas
Variablesregistro
Inicializaci´on
Recursividad
EL preprocesadorC
Ejercicios
Sistemas Operativos 131 / 265
Inicializaci´on
I C permite que lasvariablesseaninicializadasenladeclaraci´on I
Las variablesexternasyest´aticasse inicializanunasolavez
durante la compilaci´on I Lasinicializacionesde variables
autom´aticasson sentenciasde asignaci´on(seejecutan)
I Las expresionesde inicializaci´ondebenserconocidasenel
momentode lainicializaci´on:Lasvariablesexternasyest´aticas
solopuedeninicializarse avaloresconstantes I Losarrays
tambi´enpuedeninicializarsemediante unalistade sus
elementosentre llavesyseparadospor,
intdias_por_mes[] ={ 31, 28, 31, 30, 31, 30,
Sistemas Operativos El Lenguaje de programacio´n C 132
31, 31, 30, 31, 30, 31 }
I En este caso no esnecesariodeclararladimensi´ondelarray
El Lenguaje de programaci´on C
funciones
funcionesque nodevuelvenenteros
Variablesexternas
Variablesest´aticas
Variablesregistro
Inicializaci´on
Recursividad
EL preprocesadorC
Ejercicios
Funciones y estructura de un programa
Sistemas Operativos El Lenguaje de programacio´n C 133 / 265
Recursividad
I C permite recursividadenlasfunciones,tantodirectacomo
indirecta
I No esnecesarianingunadeclaraci´onespecial
#include <stdio.h>
/* printd:printn in decimal */voidprintd(int
n)
{
if (n < 0) {
putchar(’-’);
n = -n;
}
if (n / 10)
Sistemas Operativos El Lenguaje de programacio´n C 134
printd(n/10);
putchar(n% 10 + ’0’);
}
funciones
funcionesque nodevuelvenenteros
Variablesexternas
Variablesest´aticas
Variablesregistro
Inicializaci´on
Recursividad
EL preprocesadorC
Ejercicios
Sistemas Operativos 135 / 265
EL preprocesador C
I Adem´as de la directiva #include y el uso elemental del
#define,el preprocesadorCtiene otrasfuncionalidades
I Uso de #define paradefinirmacros
#define CUBO(x) x*x*x /*incorrectoCUBO (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;
I Con #ifdef e #ifndef podemossabersi uns´ımbolohasido
definidoono.Ejemplo:prevenirque unfichero includese
incluyavariasveces,(loque dar´ıas´ımbolos duplicados)
Sistemas Operativos 136
#ifndef _UNISTD_H
#define _UNISTD_H.....
#endif
El Lenguaje de programaci´on C
I Puede dejarse sinefectounadefinici´on
#undef MAXIMO
I Puede comprobarse si se handefinidos´ımbolosconalgu´n
valorconcreto, para hacer construccionesm´as complejas
#if SYSTEM == SYSV
#define HDR"sysv.h"
#elif SYSTEM== BSD
#define HDR"bsd.h"
#elif SYSTEM== MSDOS
Sistemas Operativos 137 / 265
#define HDR"msdos.h"
#else
#define HDR"default.h"
#endif
#include HDR
El Lenguaje de programaci´on C
Funciones y estructura de un programa
funciones
funcionesque nodevuelvenenteros
Sistemas Operativos 138
Variablesexternas
Variablesest´aticas
Variablesregistro
Inicializaci´on
Recursividad
EL preprocesadorC
Ejercicios
El Lenguaje de programacio´n C
Sistemas Operativos 139 / 265
Ejercicios
I Repartirlosprogramas de ejemplode este temaen varios
ficherosfuente (unoparacadafunci´on),de maneraque se
puedancompilarseparadamente.Hacerlosficherosinclude
correspondientes
I Declarar unavariable externaconel mismonombre encada
ficherofuente ycomprobarsi eso no la misma
I Declarar todaslas variableslocalescomoregisterycompilarlo I
Hacer que la variable externadeclaradaenel apartadoanterior
seala mismapara todoslos ficheros
Sistemas Operativos 140
I Hacer en C unafunci´onrecursivaque calculaenfactorial de un
nu´mero.Imprimirlos20 primerosfactoriales
El Lenguaje de programacio´n C
Sistemas Operativos 141 / 265
Introducci´on
Tipos,operadoresyexpresiones
Control de flujo
Funcionesyestructurade un programa
Arraysy punteros
Estructuras
BibliotecaC
Herramientas
Arrays y punteros
Punterosydirecciones
Punterosyargumentosa funciones
Sistemas Operativos El Lenguaje de programaci´on C 1
Operacionessobre punteros
Arraysy punteros
Arraysde punteros
Arraysmultidimensionales
Punterosyarrays multidimensionales
Argumentosenlal´ıneade comando
Punterosafunciones
Ejercicios
El Lenguaje de programacio´n C
Sistemas Operativos 143 / 265
I Un punteroesunavariable que contiene ladirecci´onde un
dato.C proporcionadosoperadoresrelacionadosconlas
direccionesde memoria
* Operador indirecci´on.Apartir de una variabletipo puntero nos
proporciona el dato apuntado
& Operador direcci´on.A partir de una variablenos da la
direcci´on dememoria donde se almacena dicha variable
I Para declararun punterose declarael tipode dato apuntado
int*p; double
*pf;
declaraque *p es un entero,portantop esun punteroa
entero
*pf es un double, por tanto pf es un puntero a un double
Sistemas Operativos El Lenguaje de programaci´on C 144
I Organizaci´onde Memoria:Ejemplo
Sistemas Operativos 145 / 265
Sistemas Operativos El Lenguaje de programaci´on C 146
I La declaraci´ondel punteroreservamemoria paralavariable
punteroNOPARA EL OBJETOAPUNTADO.En el
ejemploanteriorse reservamemoriaparap, El accesoa *p
tiene unresultadoindefinido,pudiendoresultarenunerror en
tiempode ejecuci´on
I Antesde usar un punterodebemosasegurarnosque apuntaun
una direcci´oncorrecta
I Asign´andolela direcci´on deuna variable.Por ejemplo p=&i;
I Asign´andole el valor que devuelva una funci´on que reserve
memoria para ´el.Por ejemplo p=(int *) malloc (sizeof (int));
I Tras utilizar el puntero,siempre se debe liberar lamemoria
reservada con malloc utilizando lafunci´on freefree(p);
Sistemas Operativos 147 / 265
Arrays y punteros
Punterosydirecciones
Punterosyargumentosa funciones
Operacionessobre punteros
Arraysy punteros
Arraysde punteros
Arraysmultidimensionales
Punterosyarrays multidimensionales
Argumentosenlal´ıneade comando
Punterosafunciones
Ejercicios
Sistemas Operativos El Lenguaje de programaci´on C 148
El Lenguaje de programacio´n C
Sistemas Operativos El Lenguaje de programaci´on C 149 / 265
Punteros y argumentos a funciones
I enC todaslasllamadasa funci´onsonpor valor:La funci´on
recibe siempre unacopiade loque se le pasa como
argumento.Lasmodificacionesse realizansobre lacopia I Las
siguiente funci´onnoafectaa losargumentosque se le pasan
voidintercambia(intx,inty) /* INCORRECTA */
{ inttemp;
temp= x;x
= y; y=
temp;
}
Sistemas Operativos El Lenguaje de programacio´n C 150
Una llamadaa intercambia(a,b) nointercambiar´ıalosvalores
de a y b,solode suscopias
I Si queremosque lafunci´onseallamadaporreferencia,loque
hacemosesque la funci´onrecibalasdireccionesde las
variablesque queremosmodificar,yatrav´es de ellasaccedaa
lasvariables
voidintercambia(int*px,int*py)
{ inttemp;
temp= *px;
*px = *py;
*py = temp;
}
Sistemas Operativos El Lenguaje de programaci´on C 151 / 265
I Para intercambiardosvariablesayb lallamar´ıamos
intercambia(&a,&b);
Arrays y punteros
Punterosydirecciones
Punterosyargumentosa funciones
Operacionessobre punteros
Arraysy punteros
Arraysde punteros
Arraysmultidimensionales
Punterosyarrays multidimensionales
Sistemas Operativos El Lenguaje de programacio´n C 152
Argumentosenlal´ıneade comando
Punterosafunciones
Ejercicios
Operaciones sobre punteros
I C permite lassiguientesoperacionessobre punteros
I 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´ıa al siguienteentero
I puntero - entero
I puntero = puntero Asignaci´on entre punteros
Sistemas Operativos El Lenguaje de programaci´on C 153 / 265
I puntero = NULL
I puntero == NULL Comparaci´on con NULL
I puntero != NULL
I puntero ==puntero La comparaci´on entre punteros tiene
restricciones
Arrays y punteros
Punterosydirecciones
Punterosyargumentosa funciones
Operacionessobre punteros
Arraysy punteros
Sistemas Operativos El Lenguaje de programacio´n C 154
Arraysde punteros
Arraysmultidimensionales
Punterosyarrays multidimensionales
Argumentosenlal´ıneade comando
Punterosafunciones
Ejercicios
Arrays y punteros
I La declaraci´onenCde un array estipo
nombre array[dimension]
I La siguientedeclaraci´ondeclaraunarray de 10 enteros
inta [10];
Sistemas Operativos El Lenguaje de programaci´on C 155 / 265
I Los elementosse accedencomoa[0],a[1] ...a[9]
I Los elementosde unarray se almacenan consecutivamenteen
memoria
I El nombre del array esla direcci´ondel primerelementodel
array
Sistemas Operativos El Lenguaje de programaci´on
C 156 / 265
,
I Consideremos ahora lo siguiente
int*pa; pa=&a[0];
I loselementosdelarraya[0],a[1]...a[9] est´analmacenadosen
lasdireccionesde memoria
pa,pa+1,...pa+9 por lo que pueden ser accedidos como
*pa, *(pa+1),...*(pa+9)
Sistemas Operativos El Lenguaje de programaci´on
C 157 / 265
I Dado que el nombre del array esla direcci´ondel primer
elementodelarray,podr´ıamoshaberhechopa=a en lugarde
pa=&a[0];
,
I C tambi´enadmite el accesoa loselementosdel arrayde esta
manera
pa[0],pa[1] pa[9]
I Hay que tenerencuentaque,aunque el nombre del arrayes la
direcci´ondel primerelemento del array,noesuna variable,
sinouna constante,porloque una sentenciadel tipoa=pb;
producir´aun error entiempode compilaci´on
,
Sistemas Operativos El Lenguaje de programaci´on
C 158 / 265
I Si queremospasarunsubarraya unafunci´onpodemoshacerlo
de manera muysencilla.Conlasdeclaracionesanteriores
f(a+3);f(&a[3]);
pasar´ıan un subarraycomenzandoenel tercerelementodel
array.
I La declaraci´onde lospar´ametrosenla funci´onque recibe el
array puede ser(suponiendoque nodevuelve nada)
voidf (intar[]) { ....}
o
voidf (int*ar) { ....}
#include <stdio.h> char a[2][5] =
{{11,12,13,14,15},
{21,22,23,24,25}};
Sistemas Operativos El Lenguaje de programaci´on
C 159 / 265
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]); 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);
}
Sistemas Operativos 160 / 26
Arrays y punteros
Punterosydirecciones
Punterosyargumentosa funciones
Operacionessobre punteros
Arraysy punteros
Arraysde punteros
Arraysmultidimensionales
Punteros yarrays multidimensionales
Argumentosenlal´ıneade comando
Punterosafunciones
Ejercicios
Sistemas Operativos El Lenguaje de programaci´on C 161 / 265
El Lenguaje de programacio´n C
Arrays de punteros
I En C un punteroescomo cualquierotravariable (enconcretoes
un tipode entero)
I Puedenhacerse arrays de punteros.
I La declaraci´on
int* ar[MAX]
declaraque ar esun array de MAX punterosa enteros.Los
elementosar[i] sonpunteros.El accesoa*ar[i],mientrasno
inicialicemosadecuadamente losar[i] produce unresultado
indefinido
Sistemas Operativos 162 / 26
I De lamismamanera que enel apartado anteriorexist´ıauna
relaci´onmuyestrechaentre el punteroyel array,aqu´ı el
punteroequivalenteal arrayar se declarar´ıa
int**par;
Arrays y punteros
Punterosydirecciones
Punterosyargumentosa funciones
Operacionessobre punteros
Arraysy punteros
Arraysde punteros
Arraysmultidimensionales
Sistemas Operativos El Lenguaje de programaci´on C 163 / 265
Punterosyarrays multidimensionales
Argumentosenlal´ıneade comando
Punterosafunciones
Ejercicios
El Lenguaje de programacio´n C
Sistemas Operativos 164 / 26
Arrays multidimensionales
I C proporcionaarrays multidimensionales,aunque se usanm´aslos
arrays de punteros.
I La declaraci´onde unarray de dosdimensionesestipo
nombre array[dim1][dim2]
intmatriz [FILAS][COLUMNAS];
I El accesoal elementoi,j esmatriz[i][j]
staticchar daytab[2][13] = {
Sistemas Operativos El Lenguaje de programaci´on C 165 / 265
{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:setday of year frommonth& day*/
intday_of_year(intyear,intmonth,intday)
{ inti, leap;
leap= year%4 == 0 && year%100 != 0 || year%400 == 0; for(i = 1; i
< month;i++) day += daytab[leap][i];
returnday;
}
Sistemas Operativos 166 / 26
El Lenguaje de programaci´on C
/* month_day:setmonth,day fromday of year */
voidmonth_day(intyear,intyearday,int*pmonth,int*pday) {
inti, 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 167 / 265
Arrays y punteros
Punterosydirecciones
Punterosyargumentosa funciones
Operacionessobre punteros
Arraysy punteros
Arraysde punteros
Arraysmultidimensionales
Punterosyarrays multidimensionales
Argumentosenlal´ıneade comando
Punterosafunciones
Ejercicios
Sistemas Operativos 168 / 26
El Lenguaje de programacio´n C
Punteros y arrays multidimensionales
I Aunque enC existenlos arraysmultidimensionales,nosuelen
usarse puesesmas conveniente usarlosarraysde punteros.
La declaraci´on
inta[10][20]; declaraun array de 10x20 enteros(10 filasy
20 columnas).
I a es la direcci´on deun bloque donde hay 200 enteros. Para acceder
al elemento a[1][3] tengo que saber que cada fila tiene20
columnas
I Si quiero pasar dicho array a una funci´on tendr´ıa que pasarlela
segunda dimensi´on ara quepudiese acceder correctamente a
los enteros
Sistemas Operativos El Lenguaje de programaci´on C 169 / 265
int func (int arr[][20])
I Consideremosahoraestaotra declaraci´on
int* p[10];
declaraun array de 10 punterosaentero
Sistemas Operativos El Lenguaje de programaci´on C 170 / 265
I Si a cada uno de los punteros le asigno memoria para 20 enteros,
tengo de nuevo una matriz de 10x20 enteros a la que puedo
acceder como p[i][j].
I En memoria tengo 10 bloques de 20 enteros cada uno (no
necesariamente consecutivos) (mas 10 punteros)
I El acceso es m´as r´apido pues no necesito multiplicaciones para
determinar a donde accedo (solo sumas eindirecciones)
I A una funci´on no tendr´ıa que pasarlela segunda dimensi´on
para que pudiese acceder a los enteros
I Es mas flexible,pues no todos los bloques tienen que ser del
mismo taman˜o. Esto es especialmente interesante cuando
queremos cadenas de caracteres
I
Sistemas Operativos El Lenguaje de programaci´on C 171 / 265
En las siguientesfigurasvemosladiferenciaenladisposici´on
de memoria
I Array de punteros
I Array multidimensional
I
Sistemas Operativos El Lenguaje de programaci´on C 172 / 265
Con estaotra declaraci´on
int **p; creamos un array multidimensional basado en
punteros. I Si queremos crear una matriz de 4 filas por 6
columnas,debemosreservarmemoriaparafilasycolumnas
I
Sistemas Operativos El Lenguaje de programaci´on C 173 / 265
p = (int**) malloc (4 * sizeof(int*)); for (i = 0; i < 4; i++)
{ p[i] = (int *) malloc (6 * size(int));
}
I
Sistemas Operativos 174
Accesoa elementosde lamatriz
for (i = 0; i < 4; i++)
{
for (j = 0; j < 6; j++)
{
p[i][j] = 0; // Equivalentes
*(p[i] + j) = 0;
*(*(p + i) + j) = 0;
}
}
I Para liberarlamatriz
for (i = 0; i < 4; i++) free(p[i]);
free(p);
Sistemas Operativos 175 / 265
El Lenguaje de programacio´n C
Arrays y punteros
Punterosydirecciones
Punterosyargumentosa funciones
Operacionessobre punteros
Arraysy punteros
Arraysde punteros
Arraysmultidimensionales
Punterosyarrays multidimensionales
Argumentosen lal´ıneade comando
Punterosafunciones
Sistemas Operativos 176
Ejercicios
El Lenguaje de programacio´n C
Argumentos en la l´ınea de comando
I C proporcionaunm´etodopara acceder a losargumentosde la
l´ıneade comando,a trav´esde lospar´ametrosde main
Sistemas Operativos 177 / 265
1 Declaramosque main tiene dospar´ametros;unoun enteroy
otro un array de punterosa car´acter, de la siguiente manera
intmain(intargv,char argv[])
2 Al ejecutarel programa, argctendr´a el nu´merode
argumentosylos argv[i] (hastaargv[argc-1])sonlos
argumentosde l´ıneade comando
I argv[0] es el nombre del programa que se ejecuta por lo que si
argc es 1, no se lehan pasado argumentos
El Lenguaje de programaci´on C
Sistemas Operativos El Lenguaje de programaci´on C 178 / 265
#include <stdio.h>
/* echo command-line arguments;1stversion*/
intmain(intargc,char *argv[])
{ inti;
for (i = 1; i < argc; i++)
printf("%s%s",argv[i],(i <argc-1) ? " " : ""); printf("n");
return0;
}
Sistemas Operativos 179 / 265
Arrays y punteros
Punterosydirecciones
Punterosyargumentosa funciones
Operacionessobre punteros
Arraysy punteros
Arraysde punteros
Arraysmultidimensionales
Punterosyarrays multidimensionales
Argumentosenlal´ıneade comando
Punterosafunciones
Ejercicios
Sistemas Operativos El Lenguaje de programaci´on C 180 / 265
El Lenguaje de programacio´n C
Punteros a funciones
I Aunque unafunci´onnoesuna variable,si podemosusar
punterosa funciones,de maneraque podemosusarlosen
arrays o pasarloscomo par´ametrosa otras funciones
I La siguientedeclaraci´ondouble
(*pfunc)(int,double)
declaraque pfuncesun punteroa unafunci´onque devuelve
un doubley que recibe dospar´ametros;un int y un double
char * (*pfunc)(char**)
Sistemas Operativos 181 / 265
ahora pfuncesun punteroa una funci´onfunci´onque devuelve
un punteroa caracter y que recibe comoargumentounarray de
punterosa car´acter
I El siguiente ejemploloilustramosconlafunci´on qsortque hace
una ordenaci´onde l´ıneasyrecibe comopar´ametro un
punteroa la funci´onque comparauna l´ıneacon otra
/* Qsort: sort v[left]...v[right] intoincreasingorder*/
voidQsort(void*v[], intleft,intright,int(*comp)(void*,
void*))
{ inti, last;voidswap(void*v[],int,int);
if (left>= right) /* do nothingif array contains*/ return;/* fewerthan
twoelements*/
Sistemas Operativos El Lenguaje de programaci´on C 182 / 265
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);
El Lenguaje de programacio´n C
swap(v,left,last);qsort(v,left,last-1,
comp);qsort(v,last+1,right,comp);
}
Sistemas Operativos 183 / 265
I Si quisi´esemosutilizarlasiguiente funci´onparacomparar
l´ıneas
intnumcmp(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 return0;
}
teniendoencuentaque el nombre de lafunci´onesunpuntero
a la funci´on,lallamadaser´ıa
Qsort (lineas,MAXLINEAS,numcmp);
El Lenguaje de programaci´on C
Sistemas Operativos 184
Arrays y punteros
Punterosydirecciones
Punterosyargumentosa funciones
Operacionessobre punteros
Arraysy punteros
Arraysde punteros
Arraysmultidimensionales
Punterosyarrays multidimensionales
Argumentosenlal´ıneade comando
Punterosafunciones
Ejercicios
Sistemas Operativos 185 / 265
El Lenguaje de programacio´n C
Ejercicios
I Escribirun programa enC que imprime todaslasl´ıneasde su
entradaest´andarque contienenunapalabraque se le pasa
como argumento
I Escribir un programa en C que admite como par´ametro un
nu´meroenteroN;si el nu´meroespositivoimprime lasN primeras
l´ıneasde su entrada,y si es negativolas(-)N u´ltimas.I Escribirun
programa en C que ordene todas las l´ıneas que lee de su entrada
usandola funci´on qsort.Si recibe el par´ametro -n las ordenapor
Sistemas Operativos 186
longitud,encasocontrariolohace alfab´eticamente
El Lenguaje de programaci´on C
Introducci´on
Tipos,operadoresyexpresiones
Control de flujo
Funcionesyestructurade un programa
Arraysy punteros
Estructuras
BibliotecaC
Herramientas
Sistemas Operativos 187 / 265
El Lenguaje de programaci´on C
Estructuras
Estructuras
Operacionessobre estructuras
Punterosaestructuras
Arraysde estructuras
Estructuras autoreferenciadas
Uniones
Camposde bits
typedef
Ejercicios
Sistemas Operativos 188
El Lenguaje de programacio´n C
Estructuras
Sistemas Operativos 189 / 265
I Una estructura es unacolecci´on deuna o masvariables,no
necesariamentedel mismo tipo,agrupadasbajoun solo
nombre
I Es el equivalente al registro (record) del pascal
I La declaraci´on es dela forma structnombreestructura {lista
variables} nombre variable;
I El nombrede la estructurapuedeomitirse.Lassiguientes
declaraciones son (casi) equivalentes:todasdeclarandos
estructuras(p1 y p2) cadauna delascualescontienedos
enteros
a structCOORDENADAS {int
x; inty;
} p1,p2;b struct
COORDENADAS { intx;inty;
}; structCOORDENADAS p1,
p2;
Estructuras
Sistemas Operativos El Lenguaje de programacio´n C 19
El Lenguaje de programaci´on C
c struct { intx;
inty;
} p1 , p2;
I En las modalidadesa) yb) laestructura tiene unnombre (struct
COORDENADAS) que nospodr´ıaservirpara declararm´as
estructurasdel mismotipo(opar´ametrosa una funci´on) en
otra parte del programa
I Las estructuras pueden inicializarse en la declaraci´on al igual
que otros tipos de variables, Los valores de sus miembros
separados por , y entre llaves ({}) struct COORDENADASp1={
5,9 };
Estructuras
Sistemas Operativos El Lenguaje de programaci´on C 191 / 265
Operacionessobre estructuras
Punterosaestructuras
Arraysde estructuras
Estructuras autoreferenciadas
Uniones
Camposde bits
typedef
Ejercicios
Operaciones sobre estructuras
I C permite lassiguientesoperacionessobre estructuras
I copia o asignaci´on
I acceso a sus miembros
I obtener su direcci´on con &
Estructuras
Sistemas Operativos El Lenguaje de programacio´n C 19
I Pasarlascomo argumentos a funciones
I Ser devueltas por funciones
I Las estructurasno se puedencomparar
I Para accedera losmiembrosde unaestructurausamosel
operador.
Con lasdeclaracionesdel apartadoanterior
p1.x=3 p1.y=9; p2.x=p2.y=0
I Una estructurapuede tener miembrosque seanasuvez
estructuras
Estructuras
Operacionessobre estructuras
Punterosaestructuras
Arraysde estructuras
Sistemas Operativos El Lenguaje de programaci´on C 193 / 265
Estructuras autoreferenciadas
Uniones
Camposde bits
typedef
Ejercicios
Punteros a estructuras
I C tambi´enpermite punterosa estructuras.
I La declaraci´onde unpunteroa una estructuraescomo la de un
punteroa cualquierotravariable.Se declarael objeto
apuntado.
I Tambi´ensonv´alidaslasdistintasmodalidadesvistas a
struct COORDENADAS{ intx; inty;
Estructuras
Sistemas Operativos El Lenguaje de programacio´n C 19
} *p1, *p2; b struct
COORDENADAS{ intx; inty;
}; struct COORDENADAS*p1,
*p2;
Sistemas Operativos El Lenguaje de programaci´on
C 195 / 265
c struct { intx;
inty;
} *p1 , *p2;
I Podemosaccederalos miembrosde unaestructuraa trav´esdel
punterode dosmaneras
I Accediendo a la estructura
(*p1).x
Los par´entesis () son necesarios pues el operador . tiene
precedencia sobre la indirecci´on *
I Directamente desde el puntero mediante el operador -> p1->x
En general este sistema es el preferido, sobretodo cuando
usamos variables tipo structpara crear estructuras dedatos
(listas,pilas,´arboles ...)
Sistemas Operativos El Lenguaje de programacio´n C
196 / 265
p->siguiente->siguiente->siguiente
(*(*(*p).siguiente).siguiente).siguiente
I Al igual que con losotros punteros,ladeclaraci´onde unpunteroa
una estructurareservaespacioparael punteropero
NO PARA LA ESTRUCTURA APUNTADA POR EL´ por lo que el
acceso a dicha estructura produce un resultado indefinido
(inclusounerrorentiempode ejecuci´on)
I Antesde accedera la estructuraapuntadadebemosinicializarel
puntero
I Asign´andolela direcci´on deuna variable
I Reserv´andolememoria con alguna funci´on (p.e. malloc)
Sistemas Operativos El Lenguaje de programaci´on
C 197 / 265
I En el siguiente ejemploreservamosmemoriaparaMAX
estructurasstruct COORDy lo asignamosa un puntero.El
operadorsizeof nosdevuelveel taman˜ode laestructura
I El taman˜o de una estructura no es necesariamente la suma del
taman˜o de sus miembros
structCORD *p; p=(struct CORD *) malloc (MAX * sizeof (struct
CORD));
Estructuras
Estructuras
Operacionessobre estructuras
Sistemas Operativos El Lenguaje de programacio´n C
198 / 265
Punterosaestructuras
Arraysde estructuras
Estructuras autoreferenciadas
Uniones
Camposde bits
typedef
Ejercicios
Arrays de estructuras
I C permitetambi´en hacerarraysdeestructuras,lasintaxises la
misma quepara cualquier otrotipo devariable
I Los arrays de estructuras tambi´en se puede inicializar en la
declaraci´on usando llaves paracada estructuray llavespara
cada elemento del array structPARNUMEROS {
Sistemas Operativos El Lenguaje de programaci´on
C 199 / 265
inti;doublex;}
array[]={
{0,1000.0},
{1,3.14},........
{100,2.5}
}; aunquea veces por comodidad seomiten lasllavesde
cada estructura
I En el siguienteejemplo vemos unafunci´onqueusaun array de
estructurasparacontar el nu´mero depalabrasreservadasdeC
quese utilizan en un fichero
Sistemas Operativos El Lenguaje de programaci´on C 200 /
265
#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,
Sistemas Operativos El Lenguaje de programaci´on
C 201 / 265
"while", 0
};
int getword(char *, int); int binsearch(char *, struct
key *, int);
/* 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 %s n",
keytab[n].count, keytab[n].word);
return 0;
Sistemas Operativos El Lenguaje de programaci´on C 202 /
265
}
/* binsearch:find word in tab[0]...tab[n-1]*/
int binsearch(char*word, struct keytab[], 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 returnmid;
Sistemas Operativos El Lenguaje de programaci´on
C 203 / 265
} return -1;
}
Sistemas Operativos El Lenguaje de programacio´n C 204
Estructuras
Operacionessobre estructuras
Punterosaestructuras
Arraysde estructuras
Estructuras autoreferenciadas
Uniones
Camposde bits
typedef
Ejercicios
Estructuras
Sistemas Operativos El Lenguaje de programacio´n C 205 / 265
Estructuras autoreferenciadas
I Una estructuranopuede referenciarse asi mismaesdecir,tener
una estructuradel mismotipocomomiembro,puesto que esto
dar´ıa lugara unarecursi´oninfinita.
I Lo que si puede tenercomomiembroesunoovariospunterosa
una estructurade su mismotipo
I Esto nospermite realizarestructurasde datosenmemoria
Sistemas Operativos El Lenguaje de programacio´n C 206
struct TNODO{ struct INFO
info;structTNODO
*izq;struct TNODO
*der;
};
Estructuras
Operacionessobre estructuras
Punterosaestructuras
Arraysde estructuras
Estructuras autoreferenciadas
Estructuras
Sistemas Operativos El Lenguaje de programacio´n C 207 / 265
Uniones
Camposde bits
typedef
Ejercicios
Sistemas Operativos 208
Uniones
I Una uni´onesuna variable que contiene tiposde datosdistintos
eninstantesdistintos
I Permite manipulardistintostiposde datosenlamismazonade
memoriaI Se declarade manerasimilara una estructurapero
con la palabraunion
I El acceso a losmiembrosde launionescon el operador. (o con
el operador -> si accedemos a trav´es de un puntero) union
VARIOS{ intentero;char bytes[4];floatreal;
} u;
Estructuras
Sistemas Operativos 209 / 265
I Una union puede contenerarraysy/oestructuras.Una
estructuratambi´enpuede conteneruniones.Est´an
permitidostambi´enlosarraysde uniones.
El Lenguaje de programaci´on C
Estructuras
Operacionessobre estructuras
Punterosaestructuras
Arraysde estructuras
Estructuras autoreferenciadas
Uniones
Camposde bits
typedef
Ejercicios
Sistemas Operativos 210
El Lenguaje de programacio´n C
Campos de bits
I Permiten,conunavariable de tipostructteneraccesodirectoa
losbitsde unentero
I Con una declaraci´on de este tipo struct {
unsignedintis_keyword:1; unsignedint
is_extern:1; unsignedintis_static:1;
} flags;
podemosaccedera los bitsindividualmente como
flags.is_keyword=1; flags.is_extern=0; .. if
(flags.is_static) {..
Estructuras
Sistemas Operativos 211 / 265
El Lenguaje de programaci´on C
Sistemas Operativos 212
I Si losbitscomienzanaasignarse porla izquierdaoporla
derechay otrosdetallessondependientesde la
implementaci´on,porloque esmas usual usar m´ascaras y
enterospararealizardichastareas
#define KEYWORD01
#define EXTRENAL02 #define
STATIC04 intflags;
flags|=KEYWORD|EXTERN;if
(flags& STATIC) {...
Sistemas Operativos El Lenguaje de programaci´on C 213 / 265
Estructuras
Estructuras
Operacionessobre estructuras
Punterosaestructuras
Arraysde estructuras
Estructuras autoreferenciadas
Uniones
Camposde bits
typedef
Ejercicios
Sistemas Operativos 214
El Lenguaje de programacio´n C
typedef
I C proporcionauna herramientaparaponerle nombresatipos:
typedef
I Su usoes similarauna declaraci´onde variable precedidade la
palabratypedef.Loque ir´ıa enel lugar del nombre de la
variable esel nombre del tipo
typedef int*punteroEntero;typedef struct
NUEVA nueva_t;
Sistemas Operativos El Lenguaje de programaci´on C 215 / 265
Si ahora quisi´eramosdeclararunavariable punteroaenteroy
otra de tipo struct NUEVA podr´ıamos hacer punteroEnterop;
nueva_tn;
Estructuras
Estructuras
Operacionessobre estructuras
Punterosaestructuras
Arraysde estructuras
Estructuras autoreferenciadas
Sistemas Operativos 216
Uniones
Camposde bits
typedef
Ejercicios
El Lenguaje de programacio´n C
Sistemas Operativos El Lenguaje de programaci´on C 217 / 265
Ejercicios
I Implementare Cun programaque lee enterosde suentrada
est´andary losimprime enordeninverso,utilizandounapila.
Implementarlapila
I Con un array
I Con un array de punteros
I De manera din´amica
I ImplementarunalistaenCdonde cada elementode lalista
contiene unapalabray unentero.El programa lee suentrada
Sistemas Operativos 218
(cada l´ıneatiene unapalabray un entero) yalmacenalos
elementosenlalistaordenadosporel valordel entero.
Biblioteca C
Sistemas Operativos El Lenguaje de programacio´n
C 219 / 265
Introducci´on
Tipos,operadoresyexpresiones
Control de flujo
Funcionesyestructurade un programa
Arraysy punteros
Estructuras
BibliotecaC
Herramientas
BibliotecaC
Documentaci´on enl´ınea
Asignaci´onde memoria
Funcionesde caracteres
Cadenasde caracteres
Sistemas Operativos El Lenguaje de programaci´on
C 220 / 265
Entrada/salidaconformato
Entrada/salidaconformatoa fichero
Entrada/salidaconformatoa memoria
Entrada/salidasinformato
Ejercicios
Biblioteca C
I El lenguaje Cesmuypequen˜o,sinembargo,muchasde lastareas
podemoshacerlaspormediode labibliotecaC.por ejemplo,
usamosfuncionesde labibliotecaCpara
I asignar y desasignar memoria
I manipulado decadenas y caracteres
Biblioteca C
Sistemas Operativos El Lenguaje de programacio´n
C 221 / 265
I funciones matem´aticas I
entrada salida I ...
I En lossistemastipoUNIXla informaci´onsobre lasfuncionesde
la bibliotecaCest´adisponible enladocumentaci´onenl´ınea
(secci´on3 de las p´aginasde manual).Porejemplo,para
obtenerinformaci´onsobre printf
$ man 3 printf
o enotros sistemas
$ man -s3 printf
BibliotecaC
Documentaci´onenl´ınea
Asignaci´onde memoria
Funcionesde caracteres
Sistemas Operativos El Lenguaje de programaci´on
C 222 / 265
Cadenasde caracteres
Entrada/salidaconformato
Entrada/salidaconformatoa fichero
Entrada/salidaconformatoa memoria
Entrada/salidasinformato
Ejercicios
Documentaci´on en l´ınea
I La informaci´onenl´ıneade unafunci´onnosindica,adem´asde
la sintaxisde dichafunci´on,si esnecesarioalgu´nfichero include
o hay que indicarle algunalibrer´ıaadicional I Porejemplo,si
miramoslap´agina de manual de la funci´onsqrt,vemosque es
Biblioteca C
Sistemas Operativos El Lenguaje de programacio´n
C 223 / 265
necesarioincluirel fichero<math.h>yque adem´ashay que
enlazarcon -lm
SQRT(3) Linux Programmer’s Manual
NAME sqrt, sqrtf, sqrtl -square rootfunction
SYNOPSIS
#include <math.h>
double sqrt(doublex); float sqrtf(float x);
long doublesqrtl(long doublex);
Link with -lm.
.....
BibliotecaC
Documentaci´onenl´ınea
Asignaci´onde memoria
Sistemas Operativos El Lenguaje de programaci´on
C 224 / 265
Funcionesde caracteres
Cadenasde caracteres
Entrada/salidaconformato
Entrada/salidaconformatoa fichero
Entrada/salidaconformatoa memoria
Entrada/salidasinformato
Ejercicios
Asignacio´n de memoria
I Para asignar memoria tenemos void
*malloc(size_tsize);
Biblioteca C
Sistemas Operativos El Lenguaje de programacio´n
C 225 / 265
I Le pasamos comoargumentola cantidadde bytes que queremos
reservar(t´ıpicamente usamos sizeof para determinarlo)
I Nos devuelve una direcci´onde memoria, comounpuntero
gen´erico (void*), donde haydisponible dicha cantidad de bytes
(no m´as). Si no queremos que el compiladorde un avisoal
asignarloa, porejemplo, unpunteroa entero, debemos haceruna
conversi´onde tipo
I Cuando ya no necesitemos la memoria asignada con malloc
podemos desasignarlacon void free(void *ptr);
I Utilizar m´as memoria de la asignadao hacer free sobre una
direcci´on queno ha sido obtenida con malloc produce resultados
indefinidos,t´ıpicamenteun error en tiempo de ejecuci´on
I Otras funciones relacionadas:calloc,realloc
BibliotecaC
Documentaci´onenl´ınea
Sistemas Operativos El Lenguaje de programaci´on
C 226 / 265
Asignaci´onde memoria
Funcionesde caracteres
Cadenasde caracteres
Entrada/salidaconformato
Entrada/salidaconformatoa fichero
Entrada/salidaconformatoa memoria
Entrada/salidasinformato
Ejercicios
Sistemas Operativos El Lenguaje de programacio´n C 227 / 265
Funciones de caracteres
I La biblioteca C proporciona una serie de funciones que
permiten tratar con caracteres. Sus prototipos est´an
declaradose <ctype.h>int isalnum(int c);intisalpha(int
c); int isascii(intc);intisblank(intc);intiscntrl(intc);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(intc);intisxdigit(intc);
BibliotecaC
Documentaci´onenl´ınea
Asignaci´onde memoria
Funcionesde caracteres
Cadenasde caracteres
Sistemas Operativos 228
Entrada/salidaconformato
Entrada/salidaconformatoa fichero
Entrada/salidaconformatoa memoria
Entrada/salidasinformato
Ejercicios
Cadenas de caracteres
I En C no existenlasvariable tipocadenas(strings).Existen
I arrays decaracteres
I punteros a car´acter
Biblioteca C
Sistemas Operativos El Lenguaje de programacio´n C 229 / 265
I Cuandose almacenauna cadenade caracteresdebe estar
terminadaporel car´acter cuyoc´odigoes 0 (’0’) ya que eslo
que esperanencontrar lasfuncionesde cadenas
I Las funcionesde cadenasesperanunadirecci´onde memoria
(char *); como el nombre de unarray es la direcci´ondonde se
almacenael array, lasfuncionesde cadenaspuedenrecibir
tanto unarray comoun puntero
I Hay algunasdiferenciassutilesentre el arrayyel punteroa
car´acter
El Lenguaje de programaci´on C
Sistemas Operativos 230 / 265
I Consideremoslasiguiente declaraci´on
char a[MAX]="estoesunacadena";
I Se declara unarray de MAX caracteresy se inicializaa
‘‘estoesunacadena’’
I El siguiente c´odigoproduce unerrorde compilaci´on
a="la cadenaha cambiadode valor";
puestoque el nombre del arrayesla direcci´ondonde
comienzael array,y ´esta nopuede cambiarse
I Podr´ıamoscambiar el valordel array con una de las funciones
de cadena
strcpy(a,"lacadenahacambiadode valor");
Sistemas Operativos 231 / 265
El Lenguaje de programaci´on C
I Consideremoslasiguiente declaraci´on
char *a="esto esuna cadena";
I Se declara unpunteroy se inicializaaladirecci´onde memoria
donde est´ala constante literal ‘‘estoesunacadena’’ I El siguiente
c´odigoNO produce errorde compilaci´onni entiempode
ejecuci´on
a="la cadenaha cambiadode valor";
se asignaal punterola direcci´onde memoriadonde est´ala
constante literal ‘‘la cadena ha cambiado de valor’’ I Si
intentamos cambiar el valor de puntero con una de las
funcionesde cadena
strcpy(a,"lacadenahacambiadode valor");
Sistemas Operativos 232 / 265
el resultadoesindefinidopuestoque estamosintentando
sobreescribirlacadena‘‘estoesunacadena’’que est´a donde
el compiladorhapuestolasconstantesliteralesconotra
cadena,que adem´asesde mayorlongitud
El Lenguaje de programacio´n C
I Consideremoslasiguiente declaraci´on
char *a;
a=(char *) malloc(MAX*sizeof (char));asignaal punteroa
una direcci´on de memoria donde hay espaciopara MAX
caracteres
I La sentencias strcpy(a,"esto es una cadena"); strcpy(a,"la
cadena ha cambiado de valor"); son perfectamente
Sistemas Operativos 233 / 265
correctas siempre ycuandoMAX seamayor que lalongitud
de ‘‘lacadena ha cambiadode valor’’+1
I Sinembargola asignaci´ona="lacadenaha
cambiadode valor";
hace que el valor del punteroseaahora el de la direcci´onde la
constante literal ‘‘la cadena ha cambiado de valor’’ , y hemos
perdidolamemoriaasignadacon malloc
El Lenguaje de programaci´on C
I Cuandohacemosuna asignaci´onesunaasignaci´onentre
punteros.
I Se asignan direcciones dememoria
I No se copian cadenas
Sistemas Operativos 234 / 265
I Si queremoscopiarcadenasdebemosusarlafunci´onde librer´ıa
strcpy
I Es responsabilidad del programador que en el sitio a donde se
copia haya espacio suficientepara la cadena que sequiere
copiar
I El espacio necesario es la longitud de la cadena + 1 byte adicional
(para el caracter ’0’ que marca el fin de cadena. I Se muestranposibles
implementacionesde lasfuncionesde lalibrer´ıa strcpy (que copia
una cadena) y strdup (que crea unduplicado)
El Lenguaje de programaci´on C
Sistemas Operativos El Lenguaje de programacio´n
C 235 / 265
voidstrcpy(char*s, char *t)
{ inti=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);returnp;
}
Sistemas Operativos El Lenguaje de programacio´n C236
/ 265
I Funcionesde caracteres:resumen(string.h)
I char *strcpy(char *dest, constchar *orig);
I char *strncpy(char *dest, constchar *orig, size_t n);
I void *memcpy(void *dest, constvoid *src,size_t n);
I size_t strlen(constchar *s);
I char *strcat(char *dest, const char *src);
I char *strncat(char *dest, const char *src,size_t n);
I int strcmp(constchar *s1,const char *s2);
Sistemas Operativos El Lenguaje de programacio´n
C 237 / 265
I int strncmp(constchar *s1,const char *s2, size_t n);
I strstr,strchr,...
I Otras funciones(stdlib.h):atoi,atof,atol,...
Biblioteca C
BibliotecaC
Documentaci´onenl´ınea
Asignaci´onde memoria
Funcionesde caracteres
Cadenasde caracteres
Sistemas Operativos El Lenguaje de programacio´n C238
/ 265
Entrada/salidaconformato
Entrada/salidaconformatoa fichero
Entrada/salidaconformatoa memoria
Entrada/salidasinformato
Ejercicios
Entrada/salida con formato
I El prototipode estasfuncionesest´aen<stdio.h>
I Si queremoshacerlaentradasalidaporcaracterestenemosint
getchar() intputchar(intc)
Sistemas Operativos El Lenguaje de programacio´n
C 239 / 265
I Para cadenas de caracteres
char * gets(char *s) int
puts(constchar *s)
I La funci´onde entradasalidaconformatoes printf(...]
I El formatode printf esintprintf(constchar
*format,...)
Sistemas Operativos 240 / 265
formates unacadena de caracterescompuestapor I
caracteresque son copiadosa lasalidaest´andar
I especificacionesde conversi´on:comienzanconle caracter% y
terminanconun caracter de conversi´on.
I La primera especificaci´on deconversi´on serefiere al primer
argumento despu´es del format, la segunda al siguiente....
I El significado delos caracteres en una especificaci´on de
conversi´on es:
I - El ajuste es a la izquierda
I N.M N ancho m´ınimo(para float d´ıgitos antesdel . decimal).
M nu´merom´ınimo de d´ıgitos que se imprimir´an para un entero
(para float nu´merode d´ıgitos a la derecha del . decimal)
I h para enterocorto l para entero largo
I Caracterde conversi´on
Sistemas Operativos El Lenguaje de programaci´on C 241 / 265
I El caracter de conversi´onespecificaqu´e hayque imprimir
Especificaciones de conversi´on (%u, %d,...) C´odigos de escape
car´acter argumento salida C´odigo salida
d,i entero entero consigno n nueva l´ınea
u entero entero sin signo t tabulador
o entero entero enoctalsin signo b backspace
x, X entero entero enhexadecimal sinsigno r retorno carro
f real real con puntoy signo ¨ comillas
e,E real notaci´onexponencial con signo ´ ap´ostrofo
g, G  
c car´acter car´acter ? ?
s cad. Chars cadena de caracteres
% imprime un%
p void dependeimplementaci´on
ld, lu, lx, lo entero entero largo
Sistemas Operativos 242 / 265
I Por ejemplo: printf (‘‘real: %2.4f; entero: %Xn", x,n);
imprimir´ıaalgocomo:
real:3.1516; entero:FF09465
El Lenguaje de programaci´on C
I Si queremoshacerentradaconformato, utilizamos scanf
intscanf(constchar *format,...);
I La especificaci´onde losformatosde scanf escomolade printf.
I Hay que tenerencuentaque en la listade argumentosa scanf no
se le suministranlas variablesque queremosleer,sinolas
direccionesde memoriade lasvariablesque queremosleer
(para que seapor referencia)
I Ejemplo
Sistemas Operativos El Lenguaje de programaci´on C 243 / 265
intn; char caracter; scanf ("%d",&n);printf ("nEl cuadradode
%d es: %d",n,n*n);scanf ("%c",&caracter);printf ("nHe
le´ıdoel car´acter: %c",caracter);
Biblioteca C
Sistemas Operativos El Lenguaje de programacio´n C
BibliotecaC
Documentaci´onenl´ınea
Asignaci´onde memoria
Funcionesde caracteres
Cadenasde caracteres
Entrada/salidaconformato
Entrada/salidaconformatoa fichero
Entrada/salidaconformatoa
memoria
Entrada/salidasinformato
Ejercicios
Sistemas Operativos El Lenguaje de programaci´on C 245 / 265
Entrada/salida con formato a
fichero
I Las funciones printf,scanf,
puts,gets,putchar,
getcharoperansobre la
entradaest´andary la
salidaest´andar.Existen
funcionestotalmente
an´alogasque operan
sobre ficheros
Biblioteca C
Sistemas Operativos El Lenguaje de programacio´n C
I Los ficherospodemosabrirlos
con fopen ycerrarloscon fclose
FILE *fopen(constchar
*path, constchar *mode);
intfclose(FILE*fp);
I Las funcionesparaentraday
salidaa ficheroson
intfprintf(FILE*stream,
const char *format,...);int
fscanf(FILE*stream,const
char *format, ...);char
Sistemas Operativos El Lenguaje de programaci´on C 247 / 265
*gets(char*s); int
fputs(constchar*s, FILE
*stream);intfgetc(FILE
*stream);intfputc(intc,
FILE *stream);
BibliotecaC
Documentaci´onenl´ınea
Asignaci´onde memoria
Funcionesde caracteres
Cadenasde caracteres
Entrada/salidaconformato
Entrada/salidaconformatoa fichero
Biblioteca C
Sistemas Operativos El Lenguaje de programacio´n C
Entrada/salidaconformatoa
memoria
Entrada/salidasinformato
Ejercicios
Entrada/salida con formato a
memoria
I Existentambi´en
funcionesque nos
permitensimplemente
Sistemas Operativos El Lenguaje de programaci´on C 249 / 265
hacer laentrada/salida
sobre variablesen
memoria.
I Estas funcionesoperan
exactamente igual que las
que hemosvisto, pero
requierenunargumento
adicional
I Una variabletipo puntero
a car´acter,donde se va
a colocar la salida
formateada
Biblioteca C
Sistemas Operativos El Lenguaje de programacio´n C
adecuadamente (o
desde donde se
pretende leer la
entrada)
intsprintf(char*str,const
char *format, ...);int
sscanf(constchar*str, const
Sistemas Operativos El Lenguaje de programaci´on C 251 / 265
char *format, ...);Biblioteca
C
Documentaci´onenl´ınea
Asignaci´onde memoria
Funcionesde caracteres
Cadenasde caracteres
Entrada/salidaconformato
Entrada/salidaconformatoa fichero
Entrada/salidaconformatoa
memoria
Biblioteca C
Sistemas Operativos El Lenguaje de programacio´n C
Entrada/salidasinformato
Ejercicios
Entrada/salida sin formato
I Quiz´ala maneramas
c´omoda de realizare/s
seala de las llamadasal
sistemaenUNIX;estas
llamadassimplemente
leenbytesyescriben
bytesenun fichero
Sistemas Operativos El Lenguaje de programaci´on C 253 / 265
I Si queremosque tenganun
formatoespec´ıfico,
podemosformatear
previamentelosdatos
I Para abrir un ficheroint
open(constchar*pathname,
intflags,mode_tmode);
pathname nombre del
fichero flags modo
de apertura O
RDONLY, O
Biblioteca C
Sistemas Operativos El Lenguaje de programacio´n C
WRONLY, O
RDWR, O CREAT O
EXCL...
mode permisos del fichero (solo
si secrea el fichero)
I Devuelve unentero
(descriptordel fichero)
que se usa en read y
write
Sistemas Operativos 255 / 265
I Para leer o escribir ssize_t read(int fd, void *buf, size_t count); ssize_t
write(intfd,constvoid*buf,size_tcount);
fd descriptor de fichero (obtenido con open
buf direcci´on dememoria para la transferenciadedatos
count nu´mero de bytes de e/s
I Devuelvenennu´merode bytesque se hantransferido
I para cerrar el ficheroint
close(intfd);
I Otras funcionesrelacionadas(trasabrirficheroconfopen())
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);
longftell(FILE *stream);
Sistemas Operativos 256 / 265
El Lenguaje de programaci´on C
Biblioteca C
BibliotecaC
Documentaci´onenl´ınea
Asignaci´onde memoria
Funcionesde caracteres
Cadenasde caracteres
Entrada/salidaconformato
Entrada/salidaconformatoa fichero
Entrada/salidaconformatoa memoria
Entrada/salidasinformato
Sistemas Operativos 257 / 265
Ejercicios
El Lenguaje de programacio´n C
Ejercicios
I RealizarenC un programaque recibacomo par´ametroel nombre de
un ficheroygenere tresficheros
I Uno que contiene los mismos caracteres pero en orden inverso
Sistemas Operativos 258 / 265
I Otro que contiene las mismas palabraspero en orden inverso
I Otro que contiene las mismas l´ıneas pero en orden inverso I Se supone
que laseparaci´onentre l´ıneasestadadaporunaocurrenciadel caracter
fin de l´ınea (’n’), y la separaci´on entre palabras por una o m´as
ocurrenciasdel caracterespacio
(’’) o del caracter tab (’t’)
I Puede usarse strtok
El Lenguaje de programaci´on C
Sistemas Operativos El Lenguaje de programaci´on
C 259 / 265
Introducci´on
Tipos, operadoresyexpresiones
Control de flujo
Funcionesyestructurade un programa
Arraysy punteros
Estructuras
BibliotecaC
Herramientas
Herramientas
Sistemas Operativos El Lenguaje de programacio´n C260 /
265
Valgrind
Sistemas Operativos El Lenguaje de programaci´on
C 261 / 265
Depuracio´n de memoria con Valgrind
I Valgrindesunaherramientaque permitedetectarfallosen lagesti´on
de memoria
I Uso de memoria sin asignar
I Accesos incorrectos a memoria
I Memoria asignada, no liberada y perdida (memory leaks)
I Para usar el depuradora
Compilamos con -g -O0
$ gcc -g -O0 ejercicio1.c
Sistemas Operativos El Lenguaje de programacio´n C262 /
265
b Invocamos valgrind pas´andoleel ejecutable(y sus par´ametros)
como par´ametro
$ valgrind --leak-check=full --show-reachable=yes a.out
Ejemplo de depuracio´n de memoria con Valgrind (I)
#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!!!
Sistemas Operativos El Lenguaje de programaci´on
C 263 / 265
}
Ejemplo de depuracio´n de memoria con Valgrind (II)
$ valgrind --leak-check=full --show-reachable=yes a.out
==27888== Memcheck, a memory error detector
==27888== Copyright (C) 2002-2010, and GNU GPL’d, by Julian Seward et al.
==27888== Using Valgrind-3.6.1 and LibVEX; rerun with -h for copyright info
==27888== Command: ./a.out ==27888==
==27888== Invalid write of size 4
==27888== at 0x8048448: main (p.c:11)
==27888== Address 0x41b8050 is 0 bytes after a block of size 40 alloc’d
==27888== at 0x4025018: malloc (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==27888== by 0x8048428: main (p.c:8)
==27888==
0 2 4 6 8 10 12 14 16 18 ==27888==
==27888== HEAP SUMMARY:
==27888== in use at exit: 40 bytes in 1 blocks
==27888== total heap usage: 1 allocs, 0 frees, 40 bytes allocated ==27888==
==27888== 40 bytes in 1 blocks are definitely lost in loss record 1 of 1
==27888== at 0x4025018: malloc (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==27888== by 0x8048428: main (p.c:8)
Sistemas Operativos El Lenguaje de programacio´n C264 /
265
==27888==
==27888== LEAK SUMMARY:
==27888== definitely lost: 40 bytes in 1 blocks
==27888== indirectly lost: 0 bytes in 0 blocks ==27888== possibly lost: 0 bytes in
0 blocks ==27888== still reachable: 0 bytes in 0 blocks ==27888== suppressed: 0 bytes in
0 blocks
==27888==
==27888== For counts of detected and suppressed errors, rerun with: -v
==27888== ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 11 from 6)
Ejemplo de depuracio´n de memoria con Valgrind (III)
Tras corregir errores
$ valgrind --leak-check=full--show-reachable=yes ./a.out
==12056==Memcheck, a memory error detector
==12056==Copyright (C)2002-2010, and GNU GPL’d, by Julian Sewardet al.
==12056==Using Valgrind-3.6.1and LibVEX;rerun with -h for copyrightinfo
==12056==Command: ./a.out
==12056==
Sistemas Operativos El Lenguaje de programaci´on
C 265 / 265
0 2 4 6 8 10 12 1416 18 ==12056==
==12056==HEAP SUMMARY:
==12056== in use at exit: 0 bytes in 0 blocks
==12056==totalheap usage: 1allocs, 1 frees,40 bytes allocated
==12056==
==12056==All heap blocks werefreed --no leaks arepossible
==12056==
==12056==For counts ofdetected and suppressederrors, rerunwith: -v
==12056==ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 11from 6)

Más contenido relacionado

La actualidad más candente

Curso de programacion en c++ prev
Curso de programacion en c++ prevCurso de programacion en c++ prev
Curso de programacion en c++ prevjtk1
 
Entorno de desarrollo en c++
Entorno de desarrollo en c++Entorno de desarrollo en c++
Entorno de desarrollo en c++Lymobe
 
Manual 1 de lenguaje c
Manual 1 de lenguaje cManual 1 de lenguaje c
Manual 1 de lenguaje cgechenique
 
Mi lenguaje de programación de preferencia es C++
Mi lenguaje de programación de preferencia es C++Mi lenguaje de programación de preferencia es C++
Mi lenguaje de programación de preferencia es C++N_Alejandrino
 
Introduccion al lenguaje c
Introduccion al lenguaje cIntroduccion al lenguaje c
Introduccion al lenguaje cvictdiazm
 
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 estudiantesJhon Jairo C Q
 
Estructura general de un programa en lenguaje´´c´´ y sus variables
Estructura general de un programa en lenguaje´´c´´ y sus variablesEstructura general de un programa en lenguaje´´c´´ y sus variables
Estructura general de un programa en lenguaje´´c´´ y sus variablesLuz Zaragoza Chavez
 
2.1 estructura general de un programa en c
2.1 estructura general de un programa en c2.1 estructura general de un programa en c
2.1 estructura general de un programa en cSNPP
 
Introduccion al-lenguaje-c
Introduccion al-lenguaje-cIntroduccion al-lenguaje-c
Introduccion al-lenguaje-cDalva Icaza
 
Programacion En Lenguaje C
Programacion En Lenguaje CProgramacion En Lenguaje C
Programacion En Lenguaje CKritius
 
Repaso del lenguaje C++
Repaso del lenguaje C++Repaso del lenguaje C++
Repaso del lenguaje C++g_torrealba
 
Microcontroladores: Programación en lenguaje ensamblador de Atmel Studio AVR
Microcontroladores: Programación en lenguaje ensamblador de Atmel Studio AVRMicrocontroladores: Programación en lenguaje ensamblador de Atmel Studio AVR
Microcontroladores: Programación en lenguaje ensamblador de Atmel Studio AVRSANTIAGO PABLO ALBERTO
 
Manual de el lenguaje de programacion c# ( español spanish) x richy
Manual de el lenguaje de programacion c# ( español spanish) x richyManual de el lenguaje de programacion c# ( español spanish) x richy
Manual de el lenguaje de programacion c# ( español spanish) x richyRoberto Lll
 
Programación c++forcsma
Programación c++forcsmaProgramación c++forcsma
Programación c++forcsmaCarlos Avila
 

La actualidad más candente (20)

Curso de programacion en c++ prev
Curso de programacion en c++ prevCurso de programacion en c++ prev
Curso de programacion en c++ prev
 
Entorno de desarrollo en c++
Entorno de desarrollo en c++Entorno de desarrollo en c++
Entorno de desarrollo en c++
 
Manual 1 de lenguaje c
Manual 1 de lenguaje cManual 1 de lenguaje c
Manual 1 de lenguaje c
 
Mi lenguaje de programación de preferencia es C++
Mi lenguaje de programación de preferencia es C++Mi lenguaje de programación de preferencia es C++
Mi lenguaje de programación de preferencia es C++
 
Lenguaje c neo
Lenguaje c neoLenguaje c neo
Lenguaje c neo
 
Introduccion al lenguaje c
Introduccion al lenguaje cIntroduccion al lenguaje c
Introduccion al lenguaje 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
 
Tutorial de- c. ++
Tutorial de- c. ++ Tutorial de- c. ++
Tutorial de- c. ++
 
Estructura general de un programa en lenguaje´´c´´ y sus variables
Estructura general de un programa en lenguaje´´c´´ y sus variablesEstructura general de un programa en lenguaje´´c´´ y sus variables
Estructura general de un programa en lenguaje´´c´´ y sus variables
 
Turbo c++
Turbo c++Turbo c++
Turbo c++
 
2.1 estructura general de un programa en c
2.1 estructura general de un programa en c2.1 estructura general de un programa en c
2.1 estructura general de un programa en c
 
1. introducción a c#
1.  introducción a c#1.  introducción a c#
1. introducción a c#
 
Introduccion al-lenguaje-c
Introduccion al-lenguaje-cIntroduccion al-lenguaje-c
Introduccion al-lenguaje-c
 
Programacion En Lenguaje C
Programacion En Lenguaje CProgramacion En Lenguaje C
Programacion En Lenguaje C
 
Repaso del lenguaje C++
Repaso del lenguaje C++Repaso del lenguaje C++
Repaso del lenguaje C++
 
Microcontroladores: Programación en lenguaje ensamblador de Atmel Studio AVR
Microcontroladores: Programación en lenguaje ensamblador de Atmel Studio AVRMicrocontroladores: Programación en lenguaje ensamblador de Atmel Studio AVR
Microcontroladores: Programación en lenguaje ensamblador de Atmel Studio AVR
 
2 estructura programa-c
2 estructura programa-c2 estructura programa-c
2 estructura programa-c
 
Manual de el lenguaje de programacion c# ( español spanish) x richy
Manual de el lenguaje de programacion c# ( español spanish) x richyManual de el lenguaje de programacion c# ( español spanish) x richy
Manual de el lenguaje de programacion c# ( español spanish) x richy
 
Turbo c++ 3.0
Turbo c++ 3.0Turbo c++ 3.0
Turbo c++ 3.0
 
Programación c++forcsma
Programación c++forcsmaProgramación c++forcsma
Programación c++forcsma
 

Similar a Lenguaje c (20)

El_Lenguaje_de_programacion_C.pptx
El_Lenguaje_de_programacion_C.pptxEl_Lenguaje_de_programacion_C.pptx
El_Lenguaje_de_programacion_C.pptx
 
CursoC.pdf
CursoC.pdfCursoC.pdf
CursoC.pdf
 
Tutorial c++
Tutorial c++Tutorial c++
Tutorial c++
 
2do parcial c
2do parcial c2do parcial c
2do parcial c
 
Curso de c antonio lebron bocanegra
Curso de c   antonio lebron bocanegraCurso de c   antonio lebron bocanegra
Curso de c antonio lebron bocanegra
 
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++
 
C
C C
C
 
IntroLenguajeC.ppt
IntroLenguajeC.pptIntroLenguajeC.ppt
IntroLenguajeC.ppt
 
Lenguajec
LenguajecLenguajec
Lenguajec
 
Turbo c
Turbo cTurbo c
Turbo c
 
Lenguaje c
Lenguaje c Lenguaje c
Lenguaje c
 
Lenguaje C
Lenguaje CLenguaje C
Lenguaje C
 
01 lenguaje-c
01 lenguaje-c01 lenguaje-c
01 lenguaje-c
 
Unidad 3
Unidad 3Unidad 3
Unidad 3
 
Libro digital de programación
Libro digital de programaciónLibro digital de programación
Libro digital de programación
 
Programa c++
Programa c++Programa c++
Programa c++
 
Exposición
ExposiciónExposición
Exposición
 
Unidad 3
Unidad 3Unidad 3
Unidad 3
 
C++
C++C++
C++
 

Más de estefania loredo cortes (20)

Centro de estudios_tecnologicos_industrial_y_de_servicios(3)(2) (1)
Centro de estudios_tecnologicos_industrial_y_de_servicios(3)(2) (1)Centro de estudios_tecnologicos_industrial_y_de_servicios(3)(2) (1)
Centro de estudios_tecnologicos_industrial_y_de_servicios(3)(2) (1)
 
Folleto remastered
Folleto remasteredFolleto remastered
Folleto remastered
 
Centro de estudios_tecnologicos_industrial_y_de_servicios(4)
Centro de estudios_tecnologicos_industrial_y_de_servicios(4)Centro de estudios_tecnologicos_industrial_y_de_servicios(4)
Centro de estudios_tecnologicos_industrial_y_de_servicios(4)
 
CETIS MAPS
CETIS MAPSCETIS MAPS
CETIS MAPS
 
APP INVENTOR 2
APP  INVENTOR 2APP  INVENTOR 2
APP INVENTOR 2
 
Cuestionario 2
Cuestionario 2Cuestionario 2
Cuestionario 2
 
Cuestionario (1)
Cuestionario (1)Cuestionario (1)
Cuestionario (1)
 
INVESTIGACION 2
INVESTIGACION 2INVESTIGACION 2
INVESTIGACION 2
 
INVESTIGACION 1
INVESTIGACION 1INVESTIGACION 1
INVESTIGACION 1
 
Tutorial de eclipse
Tutorial de eclipseTutorial de eclipse
Tutorial de eclipse
 
Conclusion examen
Conclusion examenConclusion examen
Conclusion examen
 
MAPA DE NAVEGACION
MAPA DE NAVEGACIONMAPA DE NAVEGACION
MAPA DE NAVEGACION
 
PRESENTACION APP
PRESENTACION APPPRESENTACION APP
PRESENTACION APP
 
TRABAJO PREZI CESAR
TRABAJO PREZI CESARTRABAJO PREZI CESAR
TRABAJO PREZI CESAR
 
EXCEL CESAR IVAN
EXCEL CESAR IVANEXCEL CESAR IVAN
EXCEL CESAR IVAN
 
SIMULADOR POWER CESAR
SIMULADOR POWER CESARSIMULADOR POWER CESAR
SIMULADOR POWER CESAR
 
SIMULADOR WORD CESAR
SIMULADOR WORD CESARSIMULADOR WORD CESAR
SIMULADOR WORD CESAR
 
CONVERSACIONES UTILES 1
CONVERSACIONES UTILES 1CONVERSACIONES UTILES 1
CONVERSACIONES UTILES 1
 
TRABAJO DE CONSTRUYETE
TRABAJO DE CONSTRUYETETRABAJO DE CONSTRUYETE
TRABAJO DE CONSTRUYETE
 
TRABAJO DE PREZI
TRABAJO DE PREZITRABAJO DE PREZI
TRABAJO DE PREZI
 

Último

EPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveEPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveFagnerLisboa3
 
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...silviayucra2
 
Desarrollo Web Moderno con Svelte 2024.pdf
Desarrollo Web Moderno con Svelte 2024.pdfDesarrollo Web Moderno con Svelte 2024.pdf
Desarrollo Web Moderno con Svelte 2024.pdfJulian Lamprea
 
Trabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíaTrabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíassuserf18419
 
International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)GDGSucre
 
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricGlobal Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricKeyla Dolores Méndez
 
guía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Josephguía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan JosephBRAYANJOSEPHPEREZGOM
 
pruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITpruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITMaricarmen Sánchez Ruiz
 
Proyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptxProyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptx241521559
 
Presentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptxPresentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptxLolaBunny11
 

Último (10)

EPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveEPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial Uninove
 
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
 
Desarrollo Web Moderno con Svelte 2024.pdf
Desarrollo Web Moderno con Svelte 2024.pdfDesarrollo Web Moderno con Svelte 2024.pdf
Desarrollo Web Moderno con Svelte 2024.pdf
 
Trabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíaTrabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnología
 
International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)
 
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricGlobal Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
 
guía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Josephguía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Joseph
 
pruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITpruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNIT
 
Proyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptxProyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptx
 
Presentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptxPresentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptx
 

Lenguaje c

  • 1. Sistemas Operativos El Lenguaje de programacio´n C CENTRO DE ESTUDIOS TECNOLOGICOSY DE SERVICIOSNO.109 ESTEFANIA LOREDO CORTES 2AM PROGRAMACION MARGARITA ROMERO ALVARADO LENGUAJE C SistemasOperativos
  • 2. El Lenguaje de programacio´n C Sistemas Operativos El Lenguaje de programacio´n C 1 / 265 El Lenguaje de programacio´n C Sistemas Operativos Universidade da Corun˜a I Introducci´on Caracter´ısticasdel lenguaje C Estructura de un programa C Primerosejemplos Compilaci´onde unprograma Directivasdel precompilador Depuraci´onmake
  • 3. El Lenguaje de programacio´n C Sistemas Operativos El Lenguaje de programacio´n C Ejercicios Tipos,operadoresyexpresiones Nombresde variables Tiposy taman˜osde datos Constantes Declaracionesde variables Operadoresaritm´eticos Operadoresde relaci´onyl´ogicos II Conversionesde tipo Operadoresde bit
  • 4. El Lenguaje de programacio´n C Sistemas Operativos El Lenguaje de programacio´n C 3 / 265 Incrementoydecremento, asignaci´ony expresiones Expresi´oncondicional Precedenciayordene evaluaci´on Ejercicios Control de flujo Sentencias y bloques if else else-if switch bucleswhile,forydo..while breaky continue gotoy etiquetas Ejercicios
  • 5. El Lenguaje de programacio´n C Sistemas Operativos El Lenguaje de programacio´n C Funcionesyestructurade un programa III funciones funcionesque nodevuelvenenteros Variablesexternas Variablesest´aticas Variablesregistro Inicializaci´on Recursividad EL preprocesadorC Ejercicios Arraysy punteros
  • 6. El Lenguaje de programacio´n C Sistemas Operativos El Lenguaje de programacio´n C 5 / 265 Punterosydirecciones Punterosyargumentosa funciones Operacionessobre punteros Arraysy punteros Arraysde punteros Arraysmultidimensionales IV Punterosy arrays multidimensionales Argumentosenlal´ıneade comando Punterosafunciones Ejercicios Estructuras
  • 7. El Lenguaje de programacio´n C Sistemas Operativos El Lenguaje de programacio´n C Estructuras Operacionessobre estructuras Punterosaestructuras Arraysde estructuras Estructuras autoreferenciadas Uniones Camposde bits typedef Ejercicios BibliotecaC BibliotecaC
  • 8. El Lenguaje de programacio´n C Sistemas Operativos 7 / 265 V Documentaci´onenl´ınea Asignaci´onde memoria Funcionesde caracteres Cadenasde caracteres Entrada/salidaconformato Entrada/salidaconformatoa fichero Entrada/salidaconformatoa memoria Entrada/salidasin formato Ejercicios
  • 9. Sistemas Operativos 8 Herramientas Valgrind El Lenguaje de programaci´on C Introducci´on Tipos,operadoresyexpresiones Control de flujo Funcionesyestructurade un programa Arraysy punteros Estructuras BibliotecaC Herramientas
  • 10. Sistemas Operativos 9 / 265 El Lenguaje de programaci´on C Introducci´on Caracter´ısticasdel lenguaje C Estructura de un programa C Primerosejemplos Compilaci´onde unprograma Directivasdel precompiladorDepuraci´on make Ejercicios
  • 11. Sistemas Operativos 10 El Lenguaje de programacio´n C Caracter´ısticas del lenguaje C I Es el lenguaje de programaci´onde prop´ositogeneral asociado al sistemaoperativoUNIX I Es un lenguaje de medionivel.Tratacon objetosb´asicoscomo car´acteres,nu´meros...;tambi´encon bitsy direccionesde memoria I Posee unagran portabilidad
  • 12. Sistemas Operativos 11 / 265 I Se utilizapara laprogramaci´onde sistemas:construcci´onde interpretes,compiladores,editoresde texto,etc El Lenguaje de programacio´n C I El lenguaje Cconstade I El lenguaje C propiamente dicho: tipos de datos, expresiones y estructuras de control I Extensiones en forma de macros y un amplio conjunto de librer´ıas predefinidas
  • 13. Sistemas Operativos 12 El Lenguaje de programaci´on C Introducci´on Caracter´ısticasdel lenguaje C Estructura de un programa C Primerosejemplos Compilaci´onde unprograma Directivasdel precompiladorDepuraci´on make Ejercicios
  • 14. Sistemas Operativos 13 / 265 El Lenguaje de programacio´n C Estructura de un programa C I Un programae C consta de unoo m´as m´odulos(ficheros fuentes) I Cada m´odulopuede contener I directivas del precompilador,p.epara “incluir”otros ficheros (#include) y “definir” constantes y macros (#define) I declaraciones devariables y prototipos de funciones I una o m´as funciones I comentarios I Cada funci´onpuede contener I directivas del precompilador
  • 15. Sistemas Operativos 14 I declaraciones I uno o m´as bloques I comentarios El Lenguaje de programacio´n C I Cada bloque puede contener I directivas del precompilador I declaraciones I una o m´as sentencias I comentarios
  • 16. Sistemas Operativos 15 / 265 El Lenguaje de programaci´on C I Cada sentenciadebe estarterminadapor; I Cada bloque de sentenciasse encierraentre llaves {... } I La funci´ondenominadamaineslaque primerose ejecuta I Los comentariospuedenaparecerencualquierlugardel c´odigoyse insertanentre /*y */ as´ı /* estoes uncomentario*/ I o entre // y final de l´ınea // estoesotro comentario
  • 17. Sistemas Operativos 16 El Lenguaje de programaci´on C Introducci´on Caracter´ısticasdel lenguaje C Estructura de un programa C Primerosejemplos Compilaci´onde unprograma Directivasdel precompiladorDepuraci´on make Ejercicios
  • 18. Sistemas Operativos 17 / 265 El Lenguaje de programacio´n C
  • 19. Sistemas Operativos El Lenguaje de programacio´n C 18 Primeros ejemplos #include <stdio.h>main() { printf("hola,primer programa enCn"); } #include <stdio.h>main() { int fahr,celsius; intlower,upper,step;lower=0;upper=300; step=20; fahr=lower;while(fahr<=upper) { celsius=5*(fahr-32)/9;
  • 20. Sistemas Operativos 19 / 265 printf("%dt%dn",fahr,celsius); fahr=fahr+step; } } El Lenguaje de programaci´on C Introducci´on Caracter´ısticasdel lenguaje C Estructura de un programa C Primerosejemplos Compilaci´onde unprograma
  • 21. Sistemas Operativos El Lenguaje de programacio´n C 20 Directivasdel precompiladorDepuraci´on make Ejercicios Compilacio´n de un programa I Normalmente invocamosal compiladorconcc o gcc (el compiladorde gnu) I Cuandotecleamoscc programa.cpara generarun ejecutablea partir de un ficherofuente obtenemosunejecutable, t´ıpicamente denominadoa.out.Sinembargose realizantres tareas
  • 22. Sistemas Operativos 21 / 265 I Paso por el preprocesador C. Es el que procesa las l´ıneas que comienzan con # (pe #include,#define...). Puede invocarse directamente con cpp I La compilaci´on propiamentedicha.Genera ficheros objeto (.o) a partir de los ficheros fuente. Puede invocarsecomo cc -c I El enlazado. Realizado por ld El Lenguaje de programaci´on C
  • 23. Sistemas Operativos El Lenguaje de programacio´n C 22 Introducci´on Caracter´ısticasdel lenguaje C Estructura de un programa C Primerosejemplos Compilaci´onde unprograma Directivasdel precompiladorDepuraci´on make Ejercicios
  • 24. Sistemas Operativos 23 / 265 Directivas del precompilador #includeIncluyeel fichero,cuyo nombre se indica,para su compilaci´on con el resto del c´odigo I Si el nombre del fichero va entre <...> se busca en el directorio include del sistema (/usr/include). Porejemplo #include <stdio.h> hace que el fichero /usr/include/stdio.h se incluya enese punto para sercompiladocon nuestroficherofuente I El nombre se puede ponerentre comillas(“) yel sistema lobuscar´a en el directorioactual (tambi´ense puede poneruna ruta absoluta)
  • 25. Sistemas Operativos El Lenguaje de programacio´n C 24 I Los ficheros se suelen denominar.h ycontienendeclaraciones de tipos, variablesy prototipos de funciones (sonficheros fuente que puedenverse) El Lenguaje de programacio´n C #define Define un s´ımbolo,es decir cada ocurrencia deese s´ımbolo es sustituida por su definici´on.Por ejemplo I El C distingue entre mayu´sculas y minu´sculas, aunque la costumbre es utilizarmayu´sculas para los s´ımbolos definidos por el preprocesador I ejemplo #define MAX1024 hace que todaslas ocurrencias de la cadena MAXdentro del co´digosonsustituidas por1024
  • 26. Sistemas Operativos 25 / 265 I El co´digoque se compila lleva 1024 donde iba MAX I Si MAXiba dentro de comillas ’’...‘‘, no se sustituye
  • 27. Sistemas Operativos El Lenguaje de programacio´n C 26 / 265 #include <stdio.h> #define UPPER300 #define LOWER0 #define STEP 20 main() { intfahr, celsius;fahr=LOWER; while(fahr<=UPPER) { celsius=5*(fahr- 32)/9; printf("%dt%dn",fahr,celsius); fahr=fahr+STEP; } }
  • 28. Sistemas Operativos El Lenguaje de programaci´on C 27 / 265 Introducci´on Caracter´ısticasdel lenguaje C Estructura de un programa C Primerosejemplos Compilaci´onde un programa Directivasdel precompiladorDepuraci´on make Ejercicios
  • 29. Sistemas Operativos El Lenguaje de programacio´n C 28 / 265 Depuracio´n I Para depurar programas disponemos del depurador, que nos permite ejecutar los programas en un entorno controlado I Para usar el depuradora Compilamos con cc -g $gcc -g ejercicio1.c b Invocamos el depurador pas´andoleel ejecutablecomo par´ametro antonio@abyecto:~$ gdb a.out GNU gdb (GDB) 7.3-debian Copyright (C) 2011 Free Software Foundation,Inc. ....... (gdb)
  • 30. Sistemas Operativos El Lenguaje de programaci´on C 29 / 265 I Dentro del depurador podemos establecer puntos de ruptura con break (break numerol´ınea o break nombrefunci´on), ejecutar paso a paso con step o next, ver variables con display .... El depurador disponede ayuda en l´ınea,mediante help Introducci´on Caracter´ısticasdel lenguaje C Estructura de un programa C Primerosejemplos Compilaci´onde unprograma
  • 31. Sistemas Operativos El Lenguaje de programacio´n C 30 / 265 Directivasdel precompiladorDepuraci´on make Ejercicios make I Facilitael procesode generaci´onyactualizaci´onde un programa. I Determinaautom´aticamente qu´e partesde un programa deben recompilarse ante una actualizaci´on de algunos m´odulos y las recompila.
  • 32. Sistemas Operativos El Lenguaje de programaci´on C 31 / 265 I Se crean un archivo Makefile conlasdependenciasentre los ficheros:unficherodebe actualizarsesi algunade sus dependenciasesm´asreciente I El Makefile define tambi´enlos mandatosnecesariospara actualizarcada archivoen base a sus dependencias
  • 33. Sistemas Operativos El Lenguaje de programaci´on C 32 / 265 I El Makefile estaformadoporunaserie de reglas.Donde cada regla tiene el siguiente formato objetivo: dependencia1 dependencia2 ... mandato1 mandato2 mandato3 ... I N´otese que antesde cada mandatohay uncaracter tab I Para compilarusamoslaorden‘‘make objetivo’’que I Encuentra la regla correspondientea objetivo I Trata sus dependencias como objetivos y las resuelverecursivamente
  • 34. Ejemplo muy sencillo de make Sistemas Operativos El Lenguaje de programaci´on C 33 / 265 I Dentrodel Makefile se puedendefinirvariables(yaccederasus valores) comoenel shell: VAR=valorparadefinirlavariable y ${VAR}o $(VAR) para accedera su valor.$@ se refiere al nombre del objetivo I Consideremosel siguiente programa(programa.c) #include "funcion1.h"#include "funcion2.h" main() { int a=MAX1,b=MAX2; funcion1();funcion2(); } I Donde funcion1.h
  • 35. Ejemplo muy sencillo de make Sistemas Operativos El Lenguaje de programacio´n C 34 / 265 #define MAX1 1000 void funcion1(void); I y funcion2.h #define MAX22000 void funcion2(void); I Adem´as, funcion1.ces#include "funcion1.h" voidfuncion1(void) { inti=MAX1; return; } I y funcion2.ces#include "funcion2.h"
  • 36. Ejemplo muy sencillo de make Sistemas Operativos El Lenguaje de programaci´on C 35 / 265 voidfuncion2(void) { intj=MAX2; return; } I si queremoscompilarlo,ygenerarunprogramallamado 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´ıamos programa.c dela siguientemanera gcc -o programa.out programa.c funcion2.o funcion1.o
  • 37. Ejemplo muy sencillo de make Sistemas Operativos El Lenguaje de programacio´n C 36 / 265 I Cada vezque se modificase unode losarchivoshabr´ıa que repetir alguna(o todas) de lasanteriorescompilaciones I El siguiente archivoMakefile se ocupade decidirque hayque compilary hacerlo programa.out: programa.c funcion1.h funcion2.hfuncion1.ofuncion2.o gcc -o programa.out programa.c funcion2.ofuncion1.o funcion1.o: funcion1.h funcion1.c gcc -c funcion1.ofuncion1.c funcion2.o: funcion2.h funcion2.c gcc -c funcion2.ofuncion2.c limpiar: rm programa.out funcion1.ofuncion2.o
  • 38. Sistemas Operativos El Lenguaje de programacio´n C 37 / 265 Otro ejemplo de make CC=gcc CFLAGS=-gOBJS2=prac2.o aux1.oall:prac1 prac2 prac1: prac1.o aux1.ogcc -g -oprac1 prac1.o aux1.o prac2: $(OBJS2) ${CC} ${CFLAGS} -o$@ ${OBJS2} prac1.o prac2.o: prac.h
  • 39. Sistemas Operativos El Lenguaje de programacio´n C 38 / 265 clean: rm -f prac1.o aux1.o${OBJS2} Introducci´on Caracter´ısticasdel lenguaje C Estructura de un programa C Primerosejemplos Compilaci´onde unprograma Directivasdel precompiladorDepuraci´on make
  • 40. Sistemas Operativos El Lenguaje de programacio´n C 39 / 265 Ejercicios Ejercicios I Compilarlosprogramasde ejemplode estasecci´on I Observarlassalidadel preprocesadorde cadaunode ellos I Usar el depuradorparaejecutarpasoa pasolosdos u´ltimosy vercomo cambiande valor lasvariablesenel bucle I Crear un Makefile paraunarchivoy compilarloconmake
  • 41. Sistemas Operativos El Lenguaje de programaci´on C 40 Introducci´on Tipos,operadoresyexpresiones Control de flujo Funcionesyestructurade un programa Arraysy punteros Estructuras BibliotecaC Herramientas Nombresde variables Tiposy taman˜osde datos
  • 42. Tipos, operadores y expresiones Sistemas Operativos El Lenguaje de programacio´n C 41 / 265 Constantes Declaracionesde variables Operadoresaritm´eticos Operadoresde relaci´onyl´ogicos Conversionesde tipo Operadoresde bit Incrementoydecremento, asignaci´onyexpresiones Expresi´oncondicional Precedenciayordene evaluaci´on Ejercicios
  • 43. Sistemas Operativos El Lenguaje de programaci´on C 42 Nombres de variables I losnombresde variablespuedentenerletras,nu´merosyel s´ımbolo’ ’. I Debenempezarporunaletra(puedenempezarpor’ ’ perono es recomendable puesesel criterioque usanlasrutinasde la biblioteca) I Puedenllevarmayu´sculasyminu´sculas.El Cdistingue entre mayu´sculasyminu´sculas
  • 44. Tipos, operadores y expresiones Sistemas Operativos El Lenguaje de programacio´n C 43 / 265 I La costumbre es que las variables van en minu´scula y las constantes en mayu´scula I Las palabrasreservadas if,else ... no puedenusarse como nombresde variables Nombresde variables Tiposy taman˜osde datos Constantes Declaracionesde variables Operadoresaritm´eticos Operadoresde relaci´onyl´ogicos
  • 45. Sistemas Operativos El Lenguaje de programaci´on C 44 Conversionesde tipo Operadoresde bit Incrementoydecremento, asignaci´onyexpresiones Expresi´oncondicional Precedenciayordene evaluaci´on Ejercicios
  • 46. Tipos, operadores y expresiones Sistemas Operativos El Lenguaje de programacio´n C 45 / 265 Tipos y taman˜os de datos I El C tiene pocostiposde datos char Un byte. Contiene un caracter (o un nu´mero entre 0 y 255) int Un entero. El taman˜o depende del sistema donde estemos floatUn real double Un real en doble precisi´on I Adem´asint puede sershortolong y tantoint como char pueden sersigned o unsigned
  • 47. Sistemas Operativos El Lenguaje de programaci´on C 46 I unsigned longint, unsinged long, I El taman˜odepende del compiladorpero intno esmenorque shortni mayor que long I Existe tambi´enel longlongintcon mayor rango y el longdouble con precisi´onextendidaparalosreales Nombresde variables Tiposy taman˜osde datos Constantes Declaracionesde variables Operadoresaritm´eticos
  • 48. Tipos, operadores y expresiones Sistemas Operativos El Lenguaje de programacio´n C 47 / 265 Operadoresde relaci´onyl´ogicos Conversionesde tipo Operadoresde bit Incrementoydecremento, asignaci´onyexpresiones Expresi´oncondicional Precedenciayordene evaluaci´on Ejercicios
  • 49. Sistemas Operativos El Lenguaje de programaci´on C 48 Constantes I Una constante enteraes int(ejemplo12714) I Si queremosque sealong le ponemosel sufijo’l’o’L’. (ejemplo12714L) I Una constante conun puntodecimal oun exponenteesun double(ejemplos3.141516, 1e-5) I Si queremosque seafloatle ponemosel sufijo’f’o’F’
  • 50. Tipos, operadores y expresiones Sistemas Operativos El Lenguaje de programacio´n C 49 / 265 (ejemplos3.141516f, 1e-5F) I Si unaconstante enteracomienzapor0 se entiendeque est´aen octal y si comienzapor0x o 0X enhexadecimal I Ejemplos 034892 (octal) 0xffff4000 (hexadecimal)
  • 51. Sistemas Operativos El Lenguaje de programaci´on C 50 I Una constante car´acter se pone entre comillassimples(ejemplo ’a’).Puede aparecerenoperacionesysuvalores el c´odigode dichocaracter I Una constante car´acter tambi´ense puede expresarporsu c´odigoen octal o hexadecimal.Ejemplos:’077’(octal) o ’x3f’(hexadecimal) I Algunasconstantesespeciales:’t’(tab) ’n’(finde l´ınea’) ’r’ retornode carro ... I Una constante cadenase encierraentre comillasdobles (”...“). Las cadenas en C est´an terminadas por el caracter
  • 52. Sistemas Operativos El Lenguaje de programacio´n C 51 / 265 ’0’, I Una expresi´onconstante esunaexpresi´onque soloincluye constantes.Puede serevaluadaentiempode compilaci´ony serutilizadaenlugarde una constante #define MAXIMO 1024 char linea[MAXIMO/2+20]; I Un caso particularde constantessonlostiposenumerados. Un tipo enumerado es una lista de valores enteros constantes enumboolean{FALSE,TRUE}; I Salvoque se especifique otracosa,comienzanen0,as´ı FALSE ser´ıa 0 y TRUE 1
  • 53. Sistemas Operativos El Lenguaje de programaci´on C 52 I Tambi´enpuede especificarse el valorde comienzo enumdias{LUNES=1, MARTES, MIERCOLES, JUEVES,VIERNES,SABADO,DOMINGO}; Tipos, operadores y expresiones Nombresde variables Tiposy taman˜osde datos Constantes Declaracionesde variables Operadoresaritm´eticos
  • 54. Sistemas Operativos El Lenguaje de programacio´n C 53 / 265 Operadoresde relaci´onyl´ogicos Conversionesde tipo Operadoresde bit Incrementoydecremento, asignaci´onyexpresiones Expresi´oncondicional Precedenciayordene evaluaci´on Ejercicios
  • 55. Sistemas Operativos El Lenguaje de programacio´n C 54 Declaraciones de variables I Todas lasvariablesdebenserdeclaradasantesde suuso. I Las declaracionesdebenapareceral principiode cadafunci´ono bloque de sentencias I La declaraci´onconstade un tipode variable yuna listade variablesseparadasporcoma inti,j;floatx,pi; unsignedlonglongitud,contador; I Las variablespuedeninicializarse enladeclaraci´on floatpi=3.1416; unsignedlong contador=0;
  • 56. Sistemas Operativos El Lenguaje de programacio´n C 55 / 265 I Puede utilizarse el simbol const para indicar que la variable no puede sercambiadaconstfloat e=2.7182; Tipos, operadores y expresiones Nombresde variables Tiposy taman˜osde datos Constantes Declaracionesde variables Operadoresaritm´eticos Operadoresde relaci´onyl´ogicos Conversionesde tipo Operadoresde bit
  • 57. Sistemas Operativos 56 Incrementoydecremento, asignaci´onyexpresiones Expresi´oncondicional Precedenciayordene evaluaci´on Ejercicios Operadores aritm´eticos + suma - resta * multiplicaci´on
  • 58. Sistemas Operativos El Lenguaje de programacio´n C 57 / 265 / divisi´on.Si losoperandossonenterosladivisi´onesentera % restoentero.Noadmite operandos floatodouble El Lenguaje de programaci´on C
  • 59. Sistemas Operativos #include <stdio.h> #define UPPER300 #define LOWER0 #define STEP 20 main() { floatfahr, celsius;fahr=LOWER; while(fahr<=UPPER) { celsius=5.0/9.0*(fahr-32) printf("%ft%fn",fahr,celsius); fahr=fahr+STEP; } } El Lenguaje de programaci´on C
  • 60. Sistemas Operativos 59 / 265 Tipos, operadores y expresiones Nombresde variables Tiposy taman˜osde datos Constantes Declaracionesde variables Operadoresaritm´eticos Operadoresde relaci´onyl´ogicos Conversionesde tipo Operadoresde bit Incrementoydecremento, asignaci´ony expresiones Expresi´oncondicional
  • 61. Sistemas Operativos Precedenciayordene evaluaci´on Ejercicios El Lenguaje de programacio´n C Operadores de relacio´n y lo´gicos I Operadoresde relaci´on < menor que
  • 62. Sistemas Operativos 61 / 265 <= menor o igual que> mayor que >= mayor o igual que == igual a ! = distinto El Lenguaje de programaci´on C
  • 63. Sistemas Operativos El Lenguaje de programaci´on C 62 / 265 I Operadoresl´ogicos && AND || OR ! NOT I Los operadoresl´ogicosse evalu´ande izquierdaaderecha,yse detiene laevaluaci´ontanprontocomose conoce el resultado. Por ejemplo i<MAXIMO && (linea[i]=getchar())!=’n’&&linea[i]!=EOF Comprobar´ıa primeroque i esmenorque MAXIMO; si lo es asignael valorque devuelve getchar()alinea[i] ycompruebaque
  • 64. Tipos, operadores y expresiones Sistemas Operativos El Lenguaje de programacio´n C 63 / 265 esdistintode fin de l´ınea. y enese caso compruebaque linea[i] no esEOF Nombresde variables Tiposy taman˜osde datos Constantes Declaracionesde variables Operadoresaritm´eticos Operadoresde relaci´onyl´ogicos Conversionesde tipo Operadoresde bit Incrementoydecremento, asignaci´onyexpresiones Expresi´oncondicional
  • 65. Sistemas Operativos El Lenguaje de programaci´on C 64 / 265 Precedenciayordene evaluaci´on Ejercicios Conversiones de tipo I Cuandoenuna operaci´onaparecentiposdistintos,el Cconvierte el tipode menorrango al tipode mayor antesde realizarla operaci´on I Podemosforzarlaconversi´onde tiposponiendoantesde lavariable el tipoal que queremosconvertir.
  • 66. Tipos, operadores y expresiones Sistemas Operativos El Lenguaje de programacio´n C 65 / 265 I Por ejemplo,lafunci´on sin esperaunargumentode tipo double. Podemospasarle unavariable enterahaciendounaconversi´on de tipo double seno;intn;seno=sin((double)n);...double centigrados,fahrenheit=55.3;centigrados= 5/9 * (fahrenheit - 32); //77F = 25C centigrados= 5.0/9 * (fahrenheit - 32); Nombresde variables Tiposy taman˜osde datos Constantes Declaracionesde variables Operadoresaritm´eticos Operadoresde relaci´onyl´ogicos
  • 67. Sistemas Operativos El Lenguaje de programaci´on C 66 / 265 Conversionesde tipo Operadoresde bit Incrementoydecremento, asignaci´onyexpresiones Expresi´oncondicional Precedenciayordene evaluaci´on Ejercicios
  • 68. Tipos, operadores y expresiones Sistemas Operativos El Lenguaje de programacio´n C 67 / 265 Operadores de bit I Podemosoperarsobre losbitsde unavariable entera(lasvariables char son un tipode enteros).Todossonoperadoresbinarios, exceptoel complementoa1 & AND bita bit | OR bit a bit ˆ XOR bit a bit << Desplazamiento de bits a la izquierda
  • 69. Sistemas Operativos El Lenguaje de programaci´on C 68 / 265 >> Desplazamiento de bits a la derecha ˜ Complemento a 1 Nombresde variables Tiposy taman˜osde datos Constantes Declaracionesde variables Operadoresaritm´eticos Operadoresde relaci´onyl´ogicos Conversionesde tipo Operadoresde bit Incrementoydecremento, asignaci´onyexpresiones Expresi´oncondicional
  • 70. Tipos, operadores y expresiones Sistemas Operativos El Lenguaje de programacio´n C 69 / 265 Precedenciayordene evaluaci´on Ejercicios
  • 71. Sistemas Operativos El Lenguaje de programacio´n C 70 Incremento y decremento, asignacio´n y expresiones I Losoperadoresincremento(++) ydecremento(−−) puedenusarse dentro de expresiones. Si preceden a la variable, el incremento o decremento se produce antes de usarla, en caso contrario despu´es.Ejemplo: linea[i++]=’a’; asignaa linea[i] el valor’a’yluegoincrementael valorde i, mientrasque linea[--i]=’z’ primerodecrementael valorde i yluegole asignaa linea[i]el valor’z’
  • 72. Sistemas Operativos El Lenguaje de programacio´n C 71 / 265 I Cuandose modificael valorde una variable apartirde un valoranterior,puede escribirse de formam´ascompacta I xOPERADOR=expresi´on;equivaleax=x OPERADOR (expresi´on); x+=expresio´n; equivale a x=x+expresio´n; x-=expresio´n; equivale a x=x-expresio´n; x*=expresio´n; equivale a x=x*expresio´n; .. . x>> =expresio´n; equivale a x=x>>expresio´n; x&=expresio´n; equivale a x=x&expresio´n; .. . x+=2; /*x=x+2*/ x*=4+y; /*x=x*(4+y)*/
  • 73. Sistemas Operativos El Lenguaje de programacio´n C 72 Tipos, operadores y expresiones Nombresde variables Tiposy taman˜osde datos Constantes Declaracionesde variables Operadoresaritm´eticos Operadoresde relaci´onyl´ogicos Conversionesde tipo Operadoresde bit Incrementoydecremento, asignaci´onyexpresiones
  • 74. Sistemas Operativos El Lenguaje de programacio´n C 73 / 265 Expresi´oncondicional Precedenciayordene evaluaci´on Ejercicios Expresio´n condicional I Es de laforma expre1?expre2 :expre3 I Se evalu´an expre1,si escierta (distintade 0) el resultadoeslo que valgaexpre2 I Si es0, el resultadoesloque valga expre3 I Ejemplos
  • 75. Sistemas Operativos El Lenguaje de programacio´n C 74 char * a; a= (p==NULL)?"cadena1": gets(p); intn; n= i*j*k? 2567: (int) sqrt(pi);printf ("Resultado:%sn" (p!=NULL)?p:" error"); Tipos, operadores y expresiones Nombresde variables Tiposy taman˜osde datos Constantes Declaracionesde variables Operadoresaritm´eticos
  • 76. Sistemas Operativos El Lenguaje de programacio´n C 75 / 265 Operadoresde relaci´ony l´ogicos Conversionesde tipo Operadoresde bit Incrementoydecremento, asignaci´onyexpresiones Expresi´oncondicional Precedenciayordene evaluaci´on Ejercicios
  • 77. Sistemas Operativos El Lenguaje de programacio´n C 76 Precedencia y orden e evaluaci´on I El C no especificaenque ordense evalu´anlosoperandosde una expresi´on.Porejemplo,enlaexpresi´on x =f () + g() no sabemossi se evaluar´aprimerof() og() I El C tampocoespecificaenque ordense evalu´anlos par´ametrosa una funci´on, printf (‘‘%d%d’’,++i,i) produce un resultadoindeterminado I Las operacionesl´ogicasse evalu´ande izquierdaaderechayse detiene laevaluaci´ontanprontocomose conozcael resultado I
  • 78. Sistemas Operativos El Lenguaje de programacio´n C 77 / 265 El C s´ı define unaprecedenciaentre distintosoperadores, Adem´ascada operadortiene unaasociatividad,comopuede verse enlatabla siguiente
  • 79. Sistemas Operativos 78 OPERADORES asociatividad ()[]->. izquierdaaderecha ! ~++---*& (tipo) sizeof derechaa izquierda */ izquierdaaderecha +- izquierdaaderecha <<>> izquierdaaderecha <<=>>= izquierdaaderecha ==!= izquierdaaderecha & izquierdaaderecha ^ izquierdaaderecha | izquierdaaderecha
  • 80. Sistemas Operativos El Lenguaje de programacio´n C 79 / 265 && izquierdaaderecha || izquierdaaderecha ?: derechaa izquierda =+=-=*=/=%=&=|= etc derechaa izquierda , izquierdaaderecha El Lenguaje de programaci´on C Tipos, operadores y expresiones Nombresde variables Tiposy taman˜osde datos Constantes Declaracionesde variables Operadoresaritm´eticos
  • 81. Sistemas Operativos 80 Operadoresde relaci´onyl´ogicos Conversionesde tipo Operadoresde bit Incrementoydecremento, asignaci´onyexpresiones Expresi´oncondicional Precedenciayordene evaluaci´on Ejercicios Ejercicios I Escribirun programa enC que nos imprimalostaman˜osde todoslostiposde datos I Escribiruna funci´on InvierteBitsC que invierte losbitsde un caracter sinsigno
  • 82. Sistemas Operativos El Lenguaje de programacio´n C 81 / 265 I Escribiruna funci´on InvierteBitsS que invierte losbitsde un enterocortosin signo. I Escribiruna funci´on InvierteBitsLque invierte losbitsde un enterolargosinsigno I Hacer un programa que imprimalosenterosdel 0al 100 y el resultadode invertirlosbits I Considerando los nu´meros del 0 al 100 como caracteres sin signo I Considerando los nu´meros del 0 al 100 como enteros cortos sin signo I Considerando los nu´meros del 0 al 100 como enteros largos sin signo El Lenguaje de programaci´on C
  • 83. Sistemas Operativos Introducci´on Tipos,operadoresyexpresiones Control de flujo Funcionesyestructurade un programa Arraysy punteros Estructuras BibliotecaC Herramientas
  • 84. Sistemas Operativos 83 / 265 El Lenguaje de programaci´on C Control de flujo Sentencias y bloques if elseelse-if switch bucleswhile,forydo..while breaky continue gotoy etiquetas Ejercicios
  • 85. Sistemas Operativos El Lenguaje de programacio´n C I Una expresi´onseguidaenun; esuna sentencia I Toda sentencia debe ir terminada con ; I Pueden ir varias sentenciasen una misma l´ınea I Las llaves {}se empleanparaagrupar sentencias.enloque se denominabloque I Un bloque essint´acticamente equivalenteauna sentencia I Dentrode unbloque puede habersentenciasydeclaraciones
  • 86. Sistemas Operativos 85 / 265 El Lenguaje de programaci´on C Control de flujo Sentencias y bloques if elseelse-if switch bucleswhile,forydo..while breaky continue gotoy etiquetas Ejercicios
  • 87. Sistemas Operativos El Lenguaje de programacio´n C
  • 88. Sistemas Operativos El Lenguaje de programacio´n C 87 / 265 if else if (expresi´on) sentencia1 else sentencia2 I Se evalu´aexpresi´on.Si esdistintade 0 (cierta) se ejecuta sentencia1,si es0 se ejecutasentencia2 I El else esopcional I Tanto sentencia1 comosentencia2 puedenserunbloque se sentenciasentre llaves {}
  • 89. Sistemas Operativos I Expresi´onnoterminacon; I Dado que el else esopcional,unasentencia else siempre va con el if inmediatamente anterior I El siguiente c´odigoesincorrecto if (n>0) if (a>b) printf ("aes mayorque bn"); else printf ("nesmenorque 0n"); I La versi´oncorrectaser´ıa if (n>0) { if (a>b)
  • 90. Sistemas Operativos El Lenguaje de programacio´n C 89 / 265 printf ("aes mayorque bn"); } else printf ("nesmenorque 0n"); El Lenguaje de programaci´on C Control de flujo Sentenciasybloquesif else else- if switch bucleswhile, for y do..whilebreakycontinuegotoy etiquetas Ejercicios
  • 91. Sistemas Operativos El Lenguaje de programacio´n C 90 else-if if (expresi´on1) sentencia1 else if(expresi´on2) sentencia2 else if(expresi´on3) sentencia3 ...else sentencian I Permite tomardecisionesmu´ltiples I Se evalu´anenorden
  • 92. Sistemas Operativos El Lenguaje de programacio´n C 91 / 265 Control de flujo Sentenciasybloquesif else else- if switch bucleswhile, for y do..whilebreakycontinuegotoy etiquetas Ejercicios switch switch (expresi´on) { case constante1: sentencias case
  • 93. Sistemas Operativos 92 constante2: sentencias case constante3:sentencias... default:sentencias } I Permite tomar una decisi´on mu´ltiple basada en una expresi´on que puede tomarunnu´merode valoresconstantesenteros(los char sonun tipode entero) I El valorde expresi´onse vacomparandocon lasconstantespor ordeny una vezque coincide conunade ellasse ejecutan todaslas sentencias(incluidaslasde los casessiguientes)hasta que se encuentralasentenciabreak I Esto permite agrupar varios valores constantes quecompartan una misma acci´on
  • 94. Sistemas Operativos El Lenguaje de programacio´n C 93 / 265 I Si no queremos que pasede un case al siguiente,debemos terminarlo con break El Lenguaje de programaci´on C
  • 95. Sistemas Operativos 94 #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; } El Lenguaje de programaci´on C
  • 96. Sistemas Operativos 95 / 265 Control de flujo Sentenciasybloques if else else-if switch bucleswhile,forydo..while breaky continue gotoy etiquetas Ejercicios
  • 97. Sistemas Operativos 96 El Lenguaje de programacio´n C bucleswhile, for y do..while while (expresi´on) sentencia I Se evalu´aexpresi´on,ysi es distintade 0 se ejecutasentencia I sentencia debe estarterminadapor; I sentencia puede serunbloque se sentenciasentre llaves {}
  • 98. Sistemas Operativos 97 / 265 El Lenguaje de programacio´n C intstrlen(chars[]) { inti; i=0; while (s[i]!=’0’) ++i; returni; } El Lenguaje de programaci´on C for (expr1;expr2;expr3) sentencia
  • 99. Sistemas Operativos 98 I Equivale exactamente a expr1;while (expr2){ sentencia expr3;} I La expresionesdel for,adiferenciade otroslenguajes,notienen por que serreferidasaenteros,puedenserexpresionesde cualquiertipo El Lenguaje de programacio´n C
  • 100. Sistemas Operativos 99 / 265 intatoi(chars[]) { inti, n; n=0; for(i=0;s[i]>=’0’&& s[i]<=’9’;++i) n=10*n+(s[i]-’0’); returnn; } El Lenguaje de programaci´on C
  • 101. Sistemas Operativos 100 do sentencia while (expresi´on) I Se ejecutasentenciaydespu´esse evalu´aexpresi´on,conloque sentencia se ejecutaal menosuna vez I sentencia debe estarterminadapor; I sentencia puede ser un bloque se sentencias entre llaves {}
  • 102. Sistemas Operativos 101 / 265 El Lenguaje de programaci´on C
  • 103. Control de flujo Sistemas Operativos El Lenguaje de programacio´n C 10 Sentencias y bloques if else else- if switch bucleswhile, for y do..whilebreakycontinuegotoy etiquetas Ejercicios break y continue I C proporcionadosmodosde salidade losbucles:breaky continue break Provoca la salidadel bucle. Si hay varios bucles anidados provoca la salidadeaquel donde se encuentra
  • 104. Sistemas Operativos El Lenguaje de programacio´n C 103 / 265 continue Provoca la salidadela presente iteraci´on del bucle.Se vuelve a la condici´on. I breakse utilizatambi´enparalasalidadel switch int i; for (i=1;i<10;i++) { if (i) continue; //break; printf("n i vale%d",i); } Sentencias y bloques if else else- if switch bucleswhile, for y do..whilebreakycontinuegotoy etiquetas
  • 105. Control de flujo Sistemas Operativos El Lenguaje de programacio´n C 10 Ejercicios
  • 106. Sistemas Operativos 105 / 265 goto y etiquetas I Aunque nosonformalmente necesarias,ni convenientes,C dispone de unasentenciagotoyetiquetas I Una etiquetatiene el mismoformatoque unnombre de variable,seguidade dospuntos I Debe estaren lamismafunci´onendonde se encuentrael goto for ( ... ) for( ...) { for ( ...) { ... if (disaster) goto error; }
  • 107. Control de flujo Sistemas Operativos 106 ...error: /* cleanup the mess*/ El Lenguaje de programaci´on C Sentenciasybloquesif else else- if switch bucleswhile, for y do..whilebreakycontinuegotoy etiquetas Ejercicios El Lenguaje de programacio´n C
  • 108. Sistemas Operativos 107 / 265 Ejercicios I Escribiruna funci´onenC ConvierteAEnt,que apartir de una cadenade caracteresque contiene larepresentaci´onde un enteroenunabase,y dicha base nosdevuelveel entero I Escribiruna funci´onenC ConvierteACad,que apartirde un enteroyuna base nos devuelve unarepresentaci´onde entero endicha base I Comprobar que son correctas I Podemos suponer que la longitud m´axima de la cadena es 16 I hacerun programaenC que a imprimatodoslosenterosdel32al
  • 109. Control de flujo Sistemas Operativos 108 64 en todas las bases de 2 a 16. Imprime un entero (en las 16 bases) porl´ınea El Lenguaje de programacio´n C
  • 110. Sistemas Operativos 109 / 265 Introducci´on Tipos,operadoresyexpresiones Control de flujo Funcionesyestructurade un programa Arraysy punteros Estructuras BibliotecaC Herramientas
  • 111. Sistemas Operativos El Lenguaje de programaci´on C Funciones y estructura de un programa funciones funcionesque no devuelvenenteros Variablesexternas Variablesest´aticas Variablesregistro Inicializaci´on Recursividad EL preprocesadorC Ejercicios
  • 112. Sistemas Operativos 111 / 265 El Lenguaje de programacio´n C funciones I Un programae C esuna colecci´onde funciones. I Una de esasfuncionesse llama main yesla primeraen ejecutarse I Las funciones pueden residir en uno o varios ficheros fuente I Cada funci´on tiene la forma tipo de dato nombre funcion (declaracionesargumentos) { declaracionesy sentencias }
  • 113. Sistemas Operativos I Se puede omitirel tipode datoque devuelvelafunci´on(en ese caso se asume que esint El Lenguaje de programaci´on C
  • 114. Sistemas Operativos El Lenguaje de programaci´on C 113 / 265 I Una funci´onpuede notenerargumentosonotenerdeclaraciones o sentencias funcion_simple() { } I Cuandouna funci´onnollevapar´ametrosono devuelveningu´n valorse usael t´ermino void voidfuncion_nada(void) #include <stdio.h> #define MAXLINE1000 /* maximuminputline length*/ intgetline(charline[],intmax) intstrindex(charsource[],char searchfor[]);charpattern[] ="ould";/* patternto searchfor */
  • 115. Sistemas Operativos 114 / 265 /* findall linesmatchingpattern*/main() { char line[MAXLINE];intfound=0; while (getline(line,MAXLINE) >0) if (strindex(line,pattern)>=0) { El Lenguaje de programacio´n C printf("%s",line);found++; } return found; } /* getline:getline intos,returnlength*/intgetline(chars[], intlim) {
  • 116. Sistemas Operativos El Lenguaje de programaci´on C 115 / 265 intc, i; i = 0; while (--lim>0 && (c=getchar()) != EOF && c != ’n’) s[i++] = c; if (c == ’n’) s[i++] = c; s[i] = ’0’; returni;
  • 117. Sistemas Operativos El Lenguaje de programaci´on C 116 / } /* strindex:returnindex of tins, -1 if none */ intstrindex(chars[], char t[]) { inti, 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; }
  • 118. Sistemas Operativos El Lenguaje de programaci´on C 117 / 265 I Las funcionesdevuelvenvaloresmediantelasentenciareturn I El formato es return expresi´on; o return (expresi´on); I expresi´on se convierte al tipo de dato que devuelve la funci´on I Puede aparecer en cualquier partede una funci´on y provoca la inmediata salida deella I Si dicha sentencia aparecedentro de un bucle provoca la salidade la funci´on y por tanto del bucle Funciones y estructura de un programa funciones
  • 119. Sistemas Operativos 118 / funcionesque nodevuelvenenteros Variablesexternas Variablesest´aticas Variablesregistro Inicializaci´on Recursividad EL preprocesadorC Ejercicios El Lenguaje de programacio´n C
  • 120. Sistemas Operativos 119 / 265 funciones que no devuelven enteros I C asume que toda funci´on,salvoque se especifique encontrario, devuelveunentero I Si tenemosunafunci´onque devuelve unvalorque noesun entero,ysobre todo,si la definici´onde dichafunci´onaparece enel c´odigo despu´esde laprimeravezque esllamada, debemos declararla I Esto se hace declarandoel tipoque devuelvelafunci´on. I Podemosdeclarartambi´enlospar´ametrosque recibe,as´ıel compiladorpodr´acomprobarla sintaxiscuandoesllamada I En el ejemplosiguiente podemosverque
  • 121. Sistemas Operativos 120 / 265 se declaranlosvaloresdevueltosporlasfuncionesllamadas desde main El Lenguaje de programacio´n C #include <stdio.h> #include <ctype.h> #define MAXLINE100 /* rudimentary calculator*/main() { double sum,atof(char[]);//<-- Declaraci´onfunci´oncharline[MAXLINE];int getline(charline[],intmax); sum= 0; while (getline(line,MAXLINE) >0) printf("t%gn",sum+=atof(line));
  • 122. Sistemas Operativos 121 / 265 return0; } El Lenguaje de programaci´on C double atof(chars[]) { double val, power; inti, sign; for (i = 0; isspace(s[i]);i++) /*skipwhite 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++;
  • 123. Sistemas Operativos 122 / 265 for (power=1.0; isdigit(s[i]);i++) { val = 10.0 * val + (s[i] - ’0’);power*= 10; } returnsign* val / power; } El Lenguaje de programaci´on C
  • 124. Sistemas Operativos 123 / 265 Funciones y estructura de un programa funciones funcionesque nodevuelvenenteros Variablesexternas Variablesest´aticas Variablesregistro Inicializaci´on Recursividad EL preprocesadorC Ejercicios
  • 125. Sistemas Operativos El Lenguaje de programacio´n C 124 Variables externas I Variablesexternassonlasque est´andefinidasfueradel cuerpo de cualquierfunci´on I Son compartidasportodoslas funcionesenmismofichero fuente desde dondeest´adefinidalavariablehastael final del fichero I En C, las variablesdefinidasdentrode bloquesse llaman autom´aticas,se creanautom´aticamente cuandocomienzala ejecuci´ondel bloqueyse desasignanal terminardicha ejecuci´on
  • 126. Sistemas Operativos 125 / 265 El Lenguaje de programaci´on C I El dominio(zonadonde se reconoce el nombre) de lasvariables autom´aticasse reduce al bloque donde est´andeclaradas I El dominiode losargumentosa una funci´onesdicha funci´on I Si enun bloque interiorse declaraunavariable conel mismonombre que unaenunbloque masexterior(ounaexterna) dentrode dicho bloque el nombre se refiere aladeclaradaen ´el I Si queremosque una variable externa sea compartida por varios ficheros fuente distintos, debe definirse en uno de ellos y en los otros declararla con el identificadorextern
  • 127. Sistemas Operativos El Lenguaje de programacio´n C 126 / 265 funciones funcionesque nodevuelvenenteros Variablesexternas Variablesest´aticas Variablesregistro Inicializaci´on Recursividad EL preprocesadorC Ejercicios Variables est´aticas I Una variable est´aticaesunavariable local de unafunci´onque no se crea y destruye al llamara la funci´on
  • 128. Funciones y estructura de un programa Sistemas Operativos El Lenguaje de programacio´n C 127 / 265 I Se declaran anteponiendo la palabra static a la declaraci´on voidfuncioncilla(void) { staticint veces=0; ++vecesprintf ("Estafuncionha sidollamada%dn"veces);} I Desde el puntode vistadel almacenamiento, unavariableest´atica esen realidadunavariable externa,yel termino staticlahace privadaa la funci´on I Si unavariable externa(ounafunci´on) ladeclaramos staticla hacemosprivadapara el ficherofuente dondeest´adefinida funciones funcionesque nodevuelvenenteros
  • 129. Sistemas Operativos El Lenguaje de programacio´n C 128 / 265 Variablesexternas Variablesest´aticas Variablesregistro Inicializaci´on Recursividad EL preprocesadorC Ejercicios
  • 130. Funciones y estructura de un programa Sistemas Operativos El Lenguaje de programacio´n C 129 / 265 Variables registro I La declaraci´onregisterantesdel nombre de unavariableindicaal compilador que esa variable va a usarse intensamente y que seriaconveniente almacenarlaenunregistrode lam´aquina registerintindice; I El compiladortiene libertadde colocarlaenunregistroono I Soloesaplicable avariablesautom´aticasypar´ametrosde las funciones
  • 131. Sistemas Operativos El Lenguaje de programacio´n C 130 / 265 I No puede preguntarse porladirecci´onde unavariable registro, aunque de hechono se almacene enunregistro funciones funcionesque nodevuelvenenteros Variablesexternas Variablesest´aticas Variablesregistro Inicializaci´on Recursividad EL preprocesadorC Ejercicios
  • 132. Sistemas Operativos 131 / 265 Inicializaci´on I C permite que lasvariablesseaninicializadasenladeclaraci´on I Las variablesexternasyest´aticasse inicializanunasolavez durante la compilaci´on I Lasinicializacionesde variables autom´aticasson sentenciasde asignaci´on(seejecutan) I Las expresionesde inicializaci´ondebenserconocidasenel momentode lainicializaci´on:Lasvariablesexternasyest´aticas solopuedeninicializarse avaloresconstantes I Losarrays tambi´enpuedeninicializarsemediante unalistade sus elementosentre llavesyseparadospor, intdias_por_mes[] ={ 31, 28, 31, 30, 31, 30,
  • 133. Sistemas Operativos El Lenguaje de programacio´n C 132 31, 31, 30, 31, 30, 31 } I En este caso no esnecesariodeclararladimensi´ondelarray El Lenguaje de programaci´on C funciones funcionesque nodevuelvenenteros Variablesexternas Variablesest´aticas Variablesregistro Inicializaci´on Recursividad EL preprocesadorC Ejercicios
  • 134. Funciones y estructura de un programa Sistemas Operativos El Lenguaje de programacio´n C 133 / 265 Recursividad I C permite recursividadenlasfunciones,tantodirectacomo indirecta I No esnecesarianingunadeclaraci´onespecial #include <stdio.h> /* printd:printn in decimal */voidprintd(int n) { if (n < 0) { putchar(’-’); n = -n; } if (n / 10)
  • 135. Sistemas Operativos El Lenguaje de programacio´n C 134 printd(n/10); putchar(n% 10 + ’0’); } funciones funcionesque nodevuelvenenteros Variablesexternas Variablesest´aticas Variablesregistro Inicializaci´on Recursividad EL preprocesadorC Ejercicios
  • 136. Sistemas Operativos 135 / 265 EL preprocesador C I Adem´as de la directiva #include y el uso elemental del #define,el preprocesadorCtiene otrasfuncionalidades I Uso de #define paradefinirmacros #define CUBO(x) x*x*x /*incorrectoCUBO (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; I Con #ifdef e #ifndef podemossabersi uns´ımbolohasido definidoono.Ejemplo:prevenirque unfichero includese incluyavariasveces,(loque dar´ıas´ımbolos duplicados)
  • 137. Sistemas Operativos 136 #ifndef _UNISTD_H #define _UNISTD_H..... #endif El Lenguaje de programaci´on C I Puede dejarse sinefectounadefinici´on #undef MAXIMO I Puede comprobarse si se handefinidos´ımbolosconalgu´n valorconcreto, para hacer construccionesm´as complejas #if SYSTEM == SYSV #define HDR"sysv.h" #elif SYSTEM== BSD #define HDR"bsd.h" #elif SYSTEM== MSDOS
  • 138. Sistemas Operativos 137 / 265 #define HDR"msdos.h" #else #define HDR"default.h" #endif #include HDR El Lenguaje de programaci´on C Funciones y estructura de un programa funciones funcionesque nodevuelvenenteros
  • 140. Sistemas Operativos 139 / 265 Ejercicios I Repartirlosprogramas de ejemplode este temaen varios ficherosfuente (unoparacadafunci´on),de maneraque se puedancompilarseparadamente.Hacerlosficherosinclude correspondientes I Declarar unavariable externaconel mismonombre encada ficherofuente ycomprobarsi eso no la misma I Declarar todaslas variableslocalescomoregisterycompilarlo I Hacer que la variable externadeclaradaenel apartadoanterior seala mismapara todoslos ficheros
  • 141. Sistemas Operativos 140 I Hacer en C unafunci´onrecursivaque calculaenfactorial de un nu´mero.Imprimirlos20 primerosfactoriales El Lenguaje de programacio´n C
  • 142. Sistemas Operativos 141 / 265 Introducci´on Tipos,operadoresyexpresiones Control de flujo Funcionesyestructurade un programa Arraysy punteros Estructuras BibliotecaC Herramientas Arrays y punteros Punterosydirecciones Punterosyargumentosa funciones
  • 143. Sistemas Operativos El Lenguaje de programaci´on C 1 Operacionessobre punteros Arraysy punteros Arraysde punteros Arraysmultidimensionales Punterosyarrays multidimensionales Argumentosenlal´ıneade comando Punterosafunciones Ejercicios El Lenguaje de programacio´n C
  • 144. Sistemas Operativos 143 / 265 I Un punteroesunavariable que contiene ladirecci´onde un dato.C proporcionadosoperadoresrelacionadosconlas direccionesde memoria * Operador indirecci´on.Apartir de una variabletipo puntero nos proporciona el dato apuntado & Operador direcci´on.A partir de una variablenos da la direcci´on dememoria donde se almacena dicha variable I Para declararun punterose declarael tipode dato apuntado int*p; double *pf; declaraque *p es un entero,portantop esun punteroa entero *pf es un double, por tanto pf es un puntero a un double
  • 145. Sistemas Operativos El Lenguaje de programaci´on C 144 I Organizaci´onde Memoria:Ejemplo
  • 147. Sistemas Operativos El Lenguaje de programaci´on C 146 I La declaraci´ondel punteroreservamemoria paralavariable punteroNOPARA EL OBJETOAPUNTADO.En el ejemploanteriorse reservamemoriaparap, El accesoa *p tiene unresultadoindefinido,pudiendoresultarenunerror en tiempode ejecuci´on I Antesde usar un punterodebemosasegurarnosque apuntaun una direcci´oncorrecta I Asign´andolela direcci´on deuna variable.Por ejemplo p=&i; I Asign´andole el valor que devuelva una funci´on que reserve memoria para ´el.Por ejemplo p=(int *) malloc (sizeof (int)); I Tras utilizar el puntero,siempre se debe liberar lamemoria reservada con malloc utilizando lafunci´on freefree(p);
  • 148. Sistemas Operativos 147 / 265 Arrays y punteros Punterosydirecciones Punterosyargumentosa funciones Operacionessobre punteros Arraysy punteros Arraysde punteros Arraysmultidimensionales Punterosyarrays multidimensionales Argumentosenlal´ıneade comando Punterosafunciones Ejercicios
  • 149. Sistemas Operativos El Lenguaje de programaci´on C 148 El Lenguaje de programacio´n C
  • 150. Sistemas Operativos El Lenguaje de programaci´on C 149 / 265 Punteros y argumentos a funciones I enC todaslasllamadasa funci´onsonpor valor:La funci´on recibe siempre unacopiade loque se le pasa como argumento.Lasmodificacionesse realizansobre lacopia I Las siguiente funci´onnoafectaa losargumentosque se le pasan voidintercambia(intx,inty) /* INCORRECTA */ { inttemp; temp= x;x = y; y= temp; }
  • 151. Sistemas Operativos El Lenguaje de programacio´n C 150 Una llamadaa intercambia(a,b) nointercambiar´ıalosvalores de a y b,solode suscopias I Si queremosque lafunci´onseallamadaporreferencia,loque hacemosesque la funci´onrecibalasdireccionesde las variablesque queremosmodificar,yatrav´es de ellasaccedaa lasvariables voidintercambia(int*px,int*py) { inttemp; temp= *px; *px = *py; *py = temp; }
  • 152. Sistemas Operativos El Lenguaje de programaci´on C 151 / 265 I Para intercambiardosvariablesayb lallamar´ıamos intercambia(&a,&b); Arrays y punteros Punterosydirecciones Punterosyargumentosa funciones Operacionessobre punteros Arraysy punteros Arraysde punteros Arraysmultidimensionales Punterosyarrays multidimensionales
  • 153. Sistemas Operativos El Lenguaje de programacio´n C 152 Argumentosenlal´ıneade comando Punterosafunciones Ejercicios Operaciones sobre punteros I C permite lassiguientesoperacionessobre punteros I 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´ıa al siguienteentero I puntero - entero I puntero = puntero Asignaci´on entre punteros
  • 154. Sistemas Operativos El Lenguaje de programaci´on C 153 / 265 I puntero = NULL I puntero == NULL Comparaci´on con NULL I puntero != NULL I puntero ==puntero La comparaci´on entre punteros tiene restricciones Arrays y punteros Punterosydirecciones Punterosyargumentosa funciones Operacionessobre punteros Arraysy punteros
  • 155. Sistemas Operativos El Lenguaje de programacio´n C 154 Arraysde punteros Arraysmultidimensionales Punterosyarrays multidimensionales Argumentosenlal´ıneade comando Punterosafunciones Ejercicios Arrays y punteros I La declaraci´onenCde un array estipo nombre array[dimension] I La siguientedeclaraci´ondeclaraunarray de 10 enteros inta [10];
  • 156. Sistemas Operativos El Lenguaje de programaci´on C 155 / 265 I Los elementosse accedencomoa[0],a[1] ...a[9] I Los elementosde unarray se almacenan consecutivamenteen memoria I El nombre del array esla direcci´ondel primerelementodel array
  • 157. Sistemas Operativos El Lenguaje de programaci´on C 156 / 265 , I Consideremos ahora lo siguiente int*pa; pa=&a[0]; I loselementosdelarraya[0],a[1]...a[9] est´analmacenadosen lasdireccionesde memoria pa,pa+1,...pa+9 por lo que pueden ser accedidos como *pa, *(pa+1),...*(pa+9)
  • 158. Sistemas Operativos El Lenguaje de programaci´on C 157 / 265 I Dado que el nombre del array esla direcci´ondel primer elementodelarray,podr´ıamoshaberhechopa=a en lugarde pa=&a[0]; , I C tambi´enadmite el accesoa loselementosdel arrayde esta manera pa[0],pa[1] pa[9] I Hay que tenerencuentaque,aunque el nombre del arrayes la direcci´ondel primerelemento del array,noesuna variable, sinouna constante,porloque una sentenciadel tipoa=pb; producir´aun error entiempode compilaci´on ,
  • 159. Sistemas Operativos El Lenguaje de programaci´on C 158 / 265 I Si queremospasarunsubarraya unafunci´onpodemoshacerlo de manera muysencilla.Conlasdeclaracionesanteriores f(a+3);f(&a[3]); pasar´ıan un subarraycomenzandoenel tercerelementodel array. I La declaraci´onde lospar´ametrosenla funci´onque recibe el array puede ser(suponiendoque nodevuelve nada) voidf (intar[]) { ....} o voidf (int*ar) { ....} #include <stdio.h> char a[2][5] = {{11,12,13,14,15}, {21,22,23,24,25}};
  • 160. Sistemas Operativos El Lenguaje de programaci´on C 159 / 265 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]); 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); }
  • 161. Sistemas Operativos 160 / 26 Arrays y punteros Punterosydirecciones Punterosyargumentosa funciones Operacionessobre punteros Arraysy punteros Arraysde punteros Arraysmultidimensionales Punteros yarrays multidimensionales Argumentosenlal´ıneade comando Punterosafunciones Ejercicios
  • 162. Sistemas Operativos El Lenguaje de programaci´on C 161 / 265 El Lenguaje de programacio´n C Arrays de punteros I En C un punteroescomo cualquierotravariable (enconcretoes un tipode entero) I Puedenhacerse arrays de punteros. I La declaraci´on int* ar[MAX] declaraque ar esun array de MAX punterosa enteros.Los elementosar[i] sonpunteros.El accesoa*ar[i],mientrasno inicialicemosadecuadamente losar[i] produce unresultado indefinido
  • 163. Sistemas Operativos 162 / 26 I De lamismamanera que enel apartado anteriorexist´ıauna relaci´onmuyestrechaentre el punteroyel array,aqu´ı el punteroequivalenteal arrayar se declarar´ıa int**par; Arrays y punteros Punterosydirecciones Punterosyargumentosa funciones Operacionessobre punteros Arraysy punteros Arraysde punteros Arraysmultidimensionales
  • 164. Sistemas Operativos El Lenguaje de programaci´on C 163 / 265 Punterosyarrays multidimensionales Argumentosenlal´ıneade comando Punterosafunciones Ejercicios El Lenguaje de programacio´n C
  • 165. Sistemas Operativos 164 / 26 Arrays multidimensionales I C proporcionaarrays multidimensionales,aunque se usanm´aslos arrays de punteros. I La declaraci´onde unarray de dosdimensionesestipo nombre array[dim1][dim2] intmatriz [FILAS][COLUMNAS]; I El accesoal elementoi,j esmatriz[i][j] staticchar daytab[2][13] = {
  • 166. Sistemas Operativos El Lenguaje de programaci´on C 165 / 265 {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:setday of year frommonth& day*/ intday_of_year(intyear,intmonth,intday) { inti, leap; leap= year%4 == 0 && year%100 != 0 || year%400 == 0; for(i = 1; i < month;i++) day += daytab[leap][i]; returnday; }
  • 167. Sistemas Operativos 166 / 26 El Lenguaje de programaci´on C /* month_day:setmonth,day fromday of year */ voidmonth_day(intyear,intyearday,int*pmonth,int*pday) { inti, 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; }
  • 168. Sistemas Operativos El Lenguaje de programaci´on C 167 / 265 Arrays y punteros Punterosydirecciones Punterosyargumentosa funciones Operacionessobre punteros Arraysy punteros Arraysde punteros Arraysmultidimensionales Punterosyarrays multidimensionales Argumentosenlal´ıneade comando Punterosafunciones Ejercicios
  • 169. Sistemas Operativos 168 / 26 El Lenguaje de programacio´n C Punteros y arrays multidimensionales I Aunque enC existenlos arraysmultidimensionales,nosuelen usarse puesesmas conveniente usarlosarraysde punteros. La declaraci´on inta[10][20]; declaraun array de 10x20 enteros(10 filasy 20 columnas). I a es la direcci´on deun bloque donde hay 200 enteros. Para acceder al elemento a[1][3] tengo que saber que cada fila tiene20 columnas I Si quiero pasar dicho array a una funci´on tendr´ıa que pasarlela segunda dimensi´on ara quepudiese acceder correctamente a los enteros
  • 170. Sistemas Operativos El Lenguaje de programaci´on C 169 / 265 int func (int arr[][20]) I Consideremosahoraestaotra declaraci´on int* p[10]; declaraun array de 10 punterosaentero
  • 171. Sistemas Operativos El Lenguaje de programaci´on C 170 / 265 I Si a cada uno de los punteros le asigno memoria para 20 enteros, tengo de nuevo una matriz de 10x20 enteros a la que puedo acceder como p[i][j]. I En memoria tengo 10 bloques de 20 enteros cada uno (no necesariamente consecutivos) (mas 10 punteros) I El acceso es m´as r´apido pues no necesito multiplicaciones para determinar a donde accedo (solo sumas eindirecciones) I A una funci´on no tendr´ıa que pasarlela segunda dimensi´on para que pudiese acceder a los enteros I Es mas flexible,pues no todos los bloques tienen que ser del mismo taman˜o. Esto es especialmente interesante cuando queremos cadenas de caracteres
  • 172. I Sistemas Operativos El Lenguaje de programaci´on C 171 / 265 En las siguientesfigurasvemosladiferenciaenladisposici´on de memoria I Array de punteros I Array multidimensional
  • 173. I Sistemas Operativos El Lenguaje de programaci´on C 172 / 265 Con estaotra declaraci´on int **p; creamos un array multidimensional basado en punteros. I Si queremos crear una matriz de 4 filas por 6 columnas,debemosreservarmemoriaparafilasycolumnas
  • 174. I Sistemas Operativos El Lenguaje de programaci´on C 173 / 265 p = (int**) malloc (4 * sizeof(int*)); for (i = 0; i < 4; i++) { p[i] = (int *) malloc (6 * size(int)); }
  • 175. I Sistemas Operativos 174 Accesoa elementosde lamatriz for (i = 0; i < 4; i++) { for (j = 0; j < 6; j++) { p[i][j] = 0; // Equivalentes *(p[i] + j) = 0; *(*(p + i) + j) = 0; } } I Para liberarlamatriz for (i = 0; i < 4; i++) free(p[i]); free(p);
  • 176. Sistemas Operativos 175 / 265 El Lenguaje de programacio´n C Arrays y punteros Punterosydirecciones Punterosyargumentosa funciones Operacionessobre punteros Arraysy punteros Arraysde punteros Arraysmultidimensionales Punterosyarrays multidimensionales Argumentosen lal´ıneade comando Punterosafunciones
  • 177. Sistemas Operativos 176 Ejercicios El Lenguaje de programacio´n C Argumentos en la l´ınea de comando I C proporcionaunm´etodopara acceder a losargumentosde la l´ıneade comando,a trav´esde lospar´ametrosde main
  • 178. Sistemas Operativos 177 / 265 1 Declaramosque main tiene dospar´ametros;unoun enteroy otro un array de punterosa car´acter, de la siguiente manera intmain(intargv,char argv[]) 2 Al ejecutarel programa, argctendr´a el nu´merode argumentosylos argv[i] (hastaargv[argc-1])sonlos argumentosde l´ıneade comando I argv[0] es el nombre del programa que se ejecuta por lo que si argc es 1, no se lehan pasado argumentos El Lenguaje de programaci´on C
  • 179. Sistemas Operativos El Lenguaje de programaci´on C 178 / 265 #include <stdio.h> /* echo command-line arguments;1stversion*/ intmain(intargc,char *argv[]) { inti; for (i = 1; i < argc; i++) printf("%s%s",argv[i],(i <argc-1) ? " " : ""); printf("n"); return0; }
  • 180. Sistemas Operativos 179 / 265 Arrays y punteros Punterosydirecciones Punterosyargumentosa funciones Operacionessobre punteros Arraysy punteros Arraysde punteros Arraysmultidimensionales Punterosyarrays multidimensionales Argumentosenlal´ıneade comando Punterosafunciones Ejercicios
  • 181. Sistemas Operativos El Lenguaje de programaci´on C 180 / 265 El Lenguaje de programacio´n C Punteros a funciones I Aunque unafunci´onnoesuna variable,si podemosusar punterosa funciones,de maneraque podemosusarlosen arrays o pasarloscomo par´ametrosa otras funciones I La siguientedeclaraci´ondouble (*pfunc)(int,double) declaraque pfuncesun punteroa unafunci´onque devuelve un doubley que recibe dospar´ametros;un int y un double char * (*pfunc)(char**)
  • 182. Sistemas Operativos 181 / 265 ahora pfuncesun punteroa una funci´onfunci´onque devuelve un punteroa caracter y que recibe comoargumentounarray de punterosa car´acter I El siguiente ejemploloilustramosconlafunci´on qsortque hace una ordenaci´onde l´ıneasyrecibe comopar´ametro un punteroa la funci´onque comparauna l´ıneacon otra /* Qsort: sort v[left]...v[right] intoincreasingorder*/ voidQsort(void*v[], intleft,intright,int(*comp)(void*, void*)) { inti, last;voidswap(void*v[],int,int); if (left>= right) /* do nothingif array contains*/ return;/* fewerthan twoelements*/
  • 183. Sistemas Operativos El Lenguaje de programaci´on C 182 / 265 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); El Lenguaje de programacio´n C swap(v,left,last);qsort(v,left,last-1, comp);qsort(v,last+1,right,comp); }
  • 184. Sistemas Operativos 183 / 265 I Si quisi´esemosutilizarlasiguiente funci´onparacomparar l´ıneas intnumcmp(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 return0; } teniendoencuentaque el nombre de lafunci´onesunpuntero a la funci´on,lallamadaser´ıa Qsort (lineas,MAXLINEAS,numcmp); El Lenguaje de programaci´on C
  • 185. Sistemas Operativos 184 Arrays y punteros Punterosydirecciones Punterosyargumentosa funciones Operacionessobre punteros Arraysy punteros Arraysde punteros Arraysmultidimensionales Punterosyarrays multidimensionales Argumentosenlal´ıneade comando Punterosafunciones Ejercicios
  • 186. Sistemas Operativos 185 / 265 El Lenguaje de programacio´n C Ejercicios I Escribirun programa enC que imprime todaslasl´ıneasde su entradaest´andarque contienenunapalabraque se le pasa como argumento I Escribir un programa en C que admite como par´ametro un nu´meroenteroN;si el nu´meroespositivoimprime lasN primeras l´ıneasde su entrada,y si es negativolas(-)N u´ltimas.I Escribirun programa en C que ordene todas las l´ıneas que lee de su entrada usandola funci´on qsort.Si recibe el par´ametro -n las ordenapor
  • 187. Sistemas Operativos 186 longitud,encasocontrariolohace alfab´eticamente El Lenguaje de programaci´on C Introducci´on Tipos,operadoresyexpresiones Control de flujo Funcionesyestructurade un programa Arraysy punteros Estructuras BibliotecaC Herramientas
  • 188. Sistemas Operativos 187 / 265 El Lenguaje de programaci´on C Estructuras Estructuras Operacionessobre estructuras Punterosaestructuras Arraysde estructuras Estructuras autoreferenciadas Uniones Camposde bits typedef Ejercicios
  • 189. Sistemas Operativos 188 El Lenguaje de programacio´n C
  • 190. Estructuras Sistemas Operativos 189 / 265 I Una estructura es unacolecci´on deuna o masvariables,no necesariamentedel mismo tipo,agrupadasbajoun solo nombre I Es el equivalente al registro (record) del pascal I La declaraci´on es dela forma structnombreestructura {lista variables} nombre variable; I El nombrede la estructurapuedeomitirse.Lassiguientes declaraciones son (casi) equivalentes:todasdeclarandos estructuras(p1 y p2) cadauna delascualescontienedos enteros a structCOORDENADAS {int x; inty; } p1,p2;b struct COORDENADAS { intx;inty; }; structCOORDENADAS p1, p2;
  • 191. Estructuras Sistemas Operativos El Lenguaje de programacio´n C 19 El Lenguaje de programaci´on C c struct { intx; inty; } p1 , p2; I En las modalidadesa) yb) laestructura tiene unnombre (struct COORDENADAS) que nospodr´ıaservirpara declararm´as estructurasdel mismotipo(opar´ametrosa una funci´on) en otra parte del programa I Las estructuras pueden inicializarse en la declaraci´on al igual que otros tipos de variables, Los valores de sus miembros separados por , y entre llaves ({}) struct COORDENADASp1={ 5,9 }; Estructuras
  • 192. Sistemas Operativos El Lenguaje de programaci´on C 191 / 265 Operacionessobre estructuras Punterosaestructuras Arraysde estructuras Estructuras autoreferenciadas Uniones Camposde bits typedef Ejercicios Operaciones sobre estructuras I C permite lassiguientesoperacionessobre estructuras I copia o asignaci´on I acceso a sus miembros I obtener su direcci´on con &
  • 193. Estructuras Sistemas Operativos El Lenguaje de programacio´n C 19 I Pasarlascomo argumentos a funciones I Ser devueltas por funciones I Las estructurasno se puedencomparar I Para accedera losmiembrosde unaestructurausamosel operador. Con lasdeclaracionesdel apartadoanterior p1.x=3 p1.y=9; p2.x=p2.y=0 I Una estructurapuede tener miembrosque seanasuvez estructuras Estructuras Operacionessobre estructuras Punterosaestructuras Arraysde estructuras
  • 194. Sistemas Operativos El Lenguaje de programaci´on C 193 / 265 Estructuras autoreferenciadas Uniones Camposde bits typedef Ejercicios Punteros a estructuras I C tambi´enpermite punterosa estructuras. I La declaraci´onde unpunteroa una estructuraescomo la de un punteroa cualquierotravariable.Se declarael objeto apuntado. I Tambi´ensonv´alidaslasdistintasmodalidadesvistas a struct COORDENADAS{ intx; inty;
  • 195. Estructuras Sistemas Operativos El Lenguaje de programacio´n C 19 } *p1, *p2; b struct COORDENADAS{ intx; inty; }; struct COORDENADAS*p1, *p2;
  • 196. Sistemas Operativos El Lenguaje de programaci´on C 195 / 265 c struct { intx; inty; } *p1 , *p2; I Podemosaccederalos miembrosde unaestructuraa trav´esdel punterode dosmaneras I Accediendo a la estructura (*p1).x Los par´entesis () son necesarios pues el operador . tiene precedencia sobre la indirecci´on * I Directamente desde el puntero mediante el operador -> p1->x En general este sistema es el preferido, sobretodo cuando usamos variables tipo structpara crear estructuras dedatos (listas,pilas,´arboles ...)
  • 197. Sistemas Operativos El Lenguaje de programacio´n C 196 / 265 p->siguiente->siguiente->siguiente (*(*(*p).siguiente).siguiente).siguiente I Al igual que con losotros punteros,ladeclaraci´onde unpunteroa una estructurareservaespacioparael punteropero NO PARA LA ESTRUCTURA APUNTADA POR EL´ por lo que el acceso a dicha estructura produce un resultado indefinido (inclusounerrorentiempode ejecuci´on) I Antesde accedera la estructuraapuntadadebemosinicializarel puntero I Asign´andolela direcci´on deuna variable I Reserv´andolememoria con alguna funci´on (p.e. malloc)
  • 198. Sistemas Operativos El Lenguaje de programaci´on C 197 / 265 I En el siguiente ejemploreservamosmemoriaparaMAX estructurasstruct COORDy lo asignamosa un puntero.El operadorsizeof nosdevuelveel taman˜ode laestructura I El taman˜o de una estructura no es necesariamente la suma del taman˜o de sus miembros structCORD *p; p=(struct CORD *) malloc (MAX * sizeof (struct CORD)); Estructuras Estructuras Operacionessobre estructuras
  • 199. Sistemas Operativos El Lenguaje de programacio´n C 198 / 265 Punterosaestructuras Arraysde estructuras Estructuras autoreferenciadas Uniones Camposde bits typedef Ejercicios Arrays de estructuras I C permitetambi´en hacerarraysdeestructuras,lasintaxises la misma quepara cualquier otrotipo devariable I Los arrays de estructuras tambi´en se puede inicializar en la declaraci´on usando llaves paracada estructuray llavespara cada elemento del array structPARNUMEROS {
  • 200. Sistemas Operativos El Lenguaje de programaci´on C 199 / 265 inti;doublex;} array[]={ {0,1000.0}, {1,3.14},........ {100,2.5} }; aunquea veces por comodidad seomiten lasllavesde cada estructura I En el siguienteejemplo vemos unafunci´onqueusaun array de estructurasparacontar el nu´mero depalabrasreservadasdeC quese utilizan en un fichero
  • 201. Sistemas Operativos El Lenguaje de programaci´on C 200 / 265 #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,
  • 202. Sistemas Operativos El Lenguaje de programaci´on C 201 / 265 "while", 0 }; int getword(char *, int); int binsearch(char *, struct key *, int); /* 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 %s n", keytab[n].count, keytab[n].word); return 0;
  • 203. Sistemas Operativos El Lenguaje de programaci´on C 202 / 265 } /* binsearch:find word in tab[0]...tab[n-1]*/ int binsearch(char*word, struct keytab[], 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 returnmid;
  • 204. Sistemas Operativos El Lenguaje de programaci´on C 203 / 265 } return -1; }
  • 205. Sistemas Operativos El Lenguaje de programacio´n C 204 Estructuras Operacionessobre estructuras Punterosaestructuras Arraysde estructuras Estructuras autoreferenciadas Uniones Camposde bits typedef Ejercicios
  • 206. Estructuras Sistemas Operativos El Lenguaje de programacio´n C 205 / 265 Estructuras autoreferenciadas I Una estructuranopuede referenciarse asi mismaesdecir,tener una estructuradel mismotipocomomiembro,puesto que esto dar´ıa lugara unarecursi´oninfinita. I Lo que si puede tenercomomiembroesunoovariospunterosa una estructurade su mismotipo I Esto nospermite realizarestructurasde datosenmemoria
  • 207. Sistemas Operativos El Lenguaje de programacio´n C 206 struct TNODO{ struct INFO info;structTNODO *izq;struct TNODO *der; }; Estructuras Operacionessobre estructuras Punterosaestructuras Arraysde estructuras Estructuras autoreferenciadas
  • 208. Estructuras Sistemas Operativos El Lenguaje de programacio´n C 207 / 265 Uniones Camposde bits typedef Ejercicios
  • 209. Sistemas Operativos 208 Uniones I Una uni´onesuna variable que contiene tiposde datosdistintos eninstantesdistintos I Permite manipulardistintostiposde datosenlamismazonade memoriaI Se declarade manerasimilara una estructurapero con la palabraunion I El acceso a losmiembrosde launionescon el operador. (o con el operador -> si accedemos a trav´es de un puntero) union VARIOS{ intentero;char bytes[4];floatreal; } u;
  • 210. Estructuras Sistemas Operativos 209 / 265 I Una union puede contenerarraysy/oestructuras.Una estructuratambi´enpuede conteneruniones.Est´an permitidostambi´enlosarraysde uniones. El Lenguaje de programaci´on C Estructuras Operacionessobre estructuras Punterosaestructuras Arraysde estructuras Estructuras autoreferenciadas Uniones Camposde bits typedef Ejercicios
  • 211. Sistemas Operativos 210 El Lenguaje de programacio´n C Campos de bits I Permiten,conunavariable de tipostructteneraccesodirectoa losbitsde unentero I Con una declaraci´on de este tipo struct { unsignedintis_keyword:1; unsignedint is_extern:1; unsignedintis_static:1; } flags; podemosaccedera los bitsindividualmente como flags.is_keyword=1; flags.is_extern=0; .. if (flags.is_static) {..
  • 212. Estructuras Sistemas Operativos 211 / 265 El Lenguaje de programaci´on C
  • 213. Sistemas Operativos 212 I Si losbitscomienzanaasignarse porla izquierdaoporla derechay otrosdetallessondependientesde la implementaci´on,porloque esmas usual usar m´ascaras y enterospararealizardichastareas #define KEYWORD01 #define EXTRENAL02 #define STATIC04 intflags; flags|=KEYWORD|EXTERN;if (flags& STATIC) {...
  • 214. Sistemas Operativos El Lenguaje de programaci´on C 213 / 265 Estructuras Estructuras Operacionessobre estructuras Punterosaestructuras Arraysde estructuras Estructuras autoreferenciadas Uniones Camposde bits typedef Ejercicios
  • 215. Sistemas Operativos 214 El Lenguaje de programacio´n C typedef I C proporcionauna herramientaparaponerle nombresatipos: typedef I Su usoes similarauna declaraci´onde variable precedidade la palabratypedef.Loque ir´ıa enel lugar del nombre de la variable esel nombre del tipo typedef int*punteroEntero;typedef struct NUEVA nueva_t;
  • 216. Sistemas Operativos El Lenguaje de programaci´on C 215 / 265 Si ahora quisi´eramosdeclararunavariable punteroaenteroy otra de tipo struct NUEVA podr´ıamos hacer punteroEnterop; nueva_tn; Estructuras Estructuras Operacionessobre estructuras Punterosaestructuras Arraysde estructuras Estructuras autoreferenciadas
  • 217. Sistemas Operativos 216 Uniones Camposde bits typedef Ejercicios El Lenguaje de programacio´n C
  • 218. Sistemas Operativos El Lenguaje de programaci´on C 217 / 265 Ejercicios I Implementare Cun programaque lee enterosde suentrada est´andary losimprime enordeninverso,utilizandounapila. Implementarlapila I Con un array I Con un array de punteros I De manera din´amica I ImplementarunalistaenCdonde cada elementode lalista contiene unapalabray unentero.El programa lee suentrada
  • 219. Sistemas Operativos 218 (cada l´ıneatiene unapalabray un entero) yalmacenalos elementosenlalistaordenadosporel valordel entero.
  • 220. Biblioteca C Sistemas Operativos El Lenguaje de programacio´n C 219 / 265 Introducci´on Tipos,operadoresyexpresiones Control de flujo Funcionesyestructurade un programa Arraysy punteros Estructuras BibliotecaC Herramientas BibliotecaC Documentaci´on enl´ınea Asignaci´onde memoria Funcionesde caracteres Cadenasde caracteres
  • 221. Sistemas Operativos El Lenguaje de programaci´on C 220 / 265 Entrada/salidaconformato Entrada/salidaconformatoa fichero Entrada/salidaconformatoa memoria Entrada/salidasinformato Ejercicios Biblioteca C I El lenguaje Cesmuypequen˜o,sinembargo,muchasde lastareas podemoshacerlaspormediode labibliotecaC.por ejemplo, usamosfuncionesde labibliotecaCpara I asignar y desasignar memoria I manipulado decadenas y caracteres
  • 222. Biblioteca C Sistemas Operativos El Lenguaje de programacio´n C 221 / 265 I funciones matem´aticas I entrada salida I ... I En lossistemastipoUNIXla informaci´onsobre lasfuncionesde la bibliotecaCest´adisponible enladocumentaci´onenl´ınea (secci´on3 de las p´aginasde manual).Porejemplo,para obtenerinformaci´onsobre printf $ man 3 printf o enotros sistemas $ man -s3 printf BibliotecaC Documentaci´onenl´ınea Asignaci´onde memoria Funcionesde caracteres
  • 223. Sistemas Operativos El Lenguaje de programaci´on C 222 / 265 Cadenasde caracteres Entrada/salidaconformato Entrada/salidaconformatoa fichero Entrada/salidaconformatoa memoria Entrada/salidasinformato Ejercicios Documentaci´on en l´ınea I La informaci´onenl´ıneade unafunci´onnosindica,adem´asde la sintaxisde dichafunci´on,si esnecesarioalgu´nfichero include o hay que indicarle algunalibrer´ıaadicional I Porejemplo,si miramoslap´agina de manual de la funci´onsqrt,vemosque es
  • 224. Biblioteca C Sistemas Operativos El Lenguaje de programacio´n C 223 / 265 necesarioincluirel fichero<math.h>yque adem´ashay que enlazarcon -lm SQRT(3) Linux Programmer’s Manual NAME sqrt, sqrtf, sqrtl -square rootfunction SYNOPSIS #include <math.h> double sqrt(doublex); float sqrtf(float x); long doublesqrtl(long doublex); Link with -lm. ..... BibliotecaC Documentaci´onenl´ınea Asignaci´onde memoria
  • 225. Sistemas Operativos El Lenguaje de programaci´on C 224 / 265 Funcionesde caracteres Cadenasde caracteres Entrada/salidaconformato Entrada/salidaconformatoa fichero Entrada/salidaconformatoa memoria Entrada/salidasinformato Ejercicios Asignacio´n de memoria I Para asignar memoria tenemos void *malloc(size_tsize);
  • 226. Biblioteca C Sistemas Operativos El Lenguaje de programacio´n C 225 / 265 I Le pasamos comoargumentola cantidadde bytes que queremos reservar(t´ıpicamente usamos sizeof para determinarlo) I Nos devuelve una direcci´onde memoria, comounpuntero gen´erico (void*), donde haydisponible dicha cantidad de bytes (no m´as). Si no queremos que el compiladorde un avisoal asignarloa, porejemplo, unpunteroa entero, debemos haceruna conversi´onde tipo I Cuando ya no necesitemos la memoria asignada con malloc podemos desasignarlacon void free(void *ptr); I Utilizar m´as memoria de la asignadao hacer free sobre una direcci´on queno ha sido obtenida con malloc produce resultados indefinidos,t´ıpicamenteun error en tiempo de ejecuci´on I Otras funciones relacionadas:calloc,realloc BibliotecaC Documentaci´onenl´ınea
  • 227. Sistemas Operativos El Lenguaje de programaci´on C 226 / 265 Asignaci´onde memoria Funcionesde caracteres Cadenasde caracteres Entrada/salidaconformato Entrada/salidaconformatoa fichero Entrada/salidaconformatoa memoria Entrada/salidasinformato Ejercicios
  • 228. Sistemas Operativos El Lenguaje de programacio´n C 227 / 265 Funciones de caracteres I La biblioteca C proporciona una serie de funciones que permiten tratar con caracteres. Sus prototipos est´an declaradose <ctype.h>int isalnum(int c);intisalpha(int c); int isascii(intc);intisblank(intc);intiscntrl(intc);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(intc);intisxdigit(intc); BibliotecaC Documentaci´onenl´ınea Asignaci´onde memoria Funcionesde caracteres Cadenasde caracteres
  • 229. Sistemas Operativos 228 Entrada/salidaconformato Entrada/salidaconformatoa fichero Entrada/salidaconformatoa memoria Entrada/salidasinformato Ejercicios Cadenas de caracteres I En C no existenlasvariable tipocadenas(strings).Existen I arrays decaracteres I punteros a car´acter
  • 230. Biblioteca C Sistemas Operativos El Lenguaje de programacio´n C 229 / 265 I Cuandose almacenauna cadenade caracteresdebe estar terminadaporel car´acter cuyoc´odigoes 0 (’0’) ya que eslo que esperanencontrar lasfuncionesde cadenas I Las funcionesde cadenasesperanunadirecci´onde memoria (char *); como el nombre de unarray es la direcci´ondonde se almacenael array, lasfuncionesde cadenaspuedenrecibir tanto unarray comoun puntero I Hay algunasdiferenciassutilesentre el arrayyel punteroa car´acter El Lenguaje de programaci´on C
  • 231. Sistemas Operativos 230 / 265 I Consideremoslasiguiente declaraci´on char a[MAX]="estoesunacadena"; I Se declara unarray de MAX caracteresy se inicializaa ‘‘estoesunacadena’’ I El siguiente c´odigoproduce unerrorde compilaci´on a="la cadenaha cambiadode valor"; puestoque el nombre del arrayesla direcci´ondonde comienzael array,y ´esta nopuede cambiarse I Podr´ıamoscambiar el valordel array con una de las funciones de cadena strcpy(a,"lacadenahacambiadode valor");
  • 232. Sistemas Operativos 231 / 265 El Lenguaje de programaci´on C I Consideremoslasiguiente declaraci´on char *a="esto esuna cadena"; I Se declara unpunteroy se inicializaaladirecci´onde memoria donde est´ala constante literal ‘‘estoesunacadena’’ I El siguiente c´odigoNO produce errorde compilaci´onni entiempode ejecuci´on a="la cadenaha cambiadode valor"; se asignaal punterola direcci´onde memoriadonde est´ala constante literal ‘‘la cadena ha cambiado de valor’’ I Si intentamos cambiar el valor de puntero con una de las funcionesde cadena strcpy(a,"lacadenahacambiadode valor");
  • 233. Sistemas Operativos 232 / 265 el resultadoesindefinidopuestoque estamosintentando sobreescribirlacadena‘‘estoesunacadena’’que est´a donde el compiladorhapuestolasconstantesliteralesconotra cadena,que adem´asesde mayorlongitud El Lenguaje de programacio´n C I Consideremoslasiguiente declaraci´on char *a; a=(char *) malloc(MAX*sizeof (char));asignaal punteroa una direcci´on de memoria donde hay espaciopara MAX caracteres I La sentencias strcpy(a,"esto es una cadena"); strcpy(a,"la cadena ha cambiado de valor"); son perfectamente
  • 234. Sistemas Operativos 233 / 265 correctas siempre ycuandoMAX seamayor que lalongitud de ‘‘lacadena ha cambiadode valor’’+1 I Sinembargola asignaci´ona="lacadenaha cambiadode valor"; hace que el valor del punteroseaahora el de la direcci´onde la constante literal ‘‘la cadena ha cambiado de valor’’ , y hemos perdidolamemoriaasignadacon malloc El Lenguaje de programaci´on C I Cuandohacemosuna asignaci´onesunaasignaci´onentre punteros. I Se asignan direcciones dememoria I No se copian cadenas
  • 235. Sistemas Operativos 234 / 265 I Si queremoscopiarcadenasdebemosusarlafunci´onde librer´ıa strcpy I Es responsabilidad del programador que en el sitio a donde se copia haya espacio suficientepara la cadena que sequiere copiar I El espacio necesario es la longitud de la cadena + 1 byte adicional (para el caracter ’0’ que marca el fin de cadena. I Se muestranposibles implementacionesde lasfuncionesde lalibrer´ıa strcpy (que copia una cadena) y strdup (que crea unduplicado) El Lenguaje de programaci´on C
  • 236. Sistemas Operativos El Lenguaje de programacio´n C 235 / 265 voidstrcpy(char*s, char *t) { inti=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);returnp; }
  • 237. Sistemas Operativos El Lenguaje de programacio´n C236 / 265 I Funcionesde caracteres:resumen(string.h) I char *strcpy(char *dest, constchar *orig); I char *strncpy(char *dest, constchar *orig, size_t n); I void *memcpy(void *dest, constvoid *src,size_t n); I size_t strlen(constchar *s); I char *strcat(char *dest, const char *src); I char *strncat(char *dest, const char *src,size_t n); I int strcmp(constchar *s1,const char *s2);
  • 238. Sistemas Operativos El Lenguaje de programacio´n C 237 / 265 I int strncmp(constchar *s1,const char *s2, size_t n); I strstr,strchr,... I Otras funciones(stdlib.h):atoi,atof,atol,... Biblioteca C BibliotecaC Documentaci´onenl´ınea Asignaci´onde memoria Funcionesde caracteres Cadenasde caracteres
  • 239. Sistemas Operativos El Lenguaje de programacio´n C238 / 265 Entrada/salidaconformato Entrada/salidaconformatoa fichero Entrada/salidaconformatoa memoria Entrada/salidasinformato Ejercicios Entrada/salida con formato I El prototipode estasfuncionesest´aen<stdio.h> I Si queremoshacerlaentradasalidaporcaracterestenemosint getchar() intputchar(intc)
  • 240. Sistemas Operativos El Lenguaje de programacio´n C 239 / 265 I Para cadenas de caracteres char * gets(char *s) int puts(constchar *s) I La funci´onde entradasalidaconformatoes printf(...] I El formatode printf esintprintf(constchar *format,...)
  • 241. Sistemas Operativos 240 / 265 formates unacadena de caracterescompuestapor I caracteresque son copiadosa lasalidaest´andar I especificacionesde conversi´on:comienzanconle caracter% y terminanconun caracter de conversi´on. I La primera especificaci´on deconversi´on serefiere al primer argumento despu´es del format, la segunda al siguiente.... I El significado delos caracteres en una especificaci´on de conversi´on es: I - El ajuste es a la izquierda I N.M N ancho m´ınimo(para float d´ıgitos antesdel . decimal). M nu´merom´ınimo de d´ıgitos que se imprimir´an para un entero (para float nu´merode d´ıgitos a la derecha del . decimal) I h para enterocorto l para entero largo I Caracterde conversi´on
  • 242. Sistemas Operativos El Lenguaje de programaci´on C 241 / 265 I El caracter de conversi´onespecificaqu´e hayque imprimir Especificaciones de conversi´on (%u, %d,...) C´odigos de escape car´acter argumento salida C´odigo salida d,i entero entero consigno n nueva l´ınea u entero entero sin signo t tabulador o entero entero enoctalsin signo b backspace x, X entero entero enhexadecimal sinsigno r retorno carro f real real con puntoy signo ¨ comillas e,E real notaci´onexponencial con signo ´ ap´ostrofo g, G c car´acter car´acter ? ? s cad. Chars cadena de caracteres % imprime un% p void dependeimplementaci´on ld, lu, lx, lo entero entero largo
  • 243. Sistemas Operativos 242 / 265 I Por ejemplo: printf (‘‘real: %2.4f; entero: %Xn", x,n); imprimir´ıaalgocomo: real:3.1516; entero:FF09465 El Lenguaje de programaci´on C I Si queremoshacerentradaconformato, utilizamos scanf intscanf(constchar *format,...); I La especificaci´onde losformatosde scanf escomolade printf. I Hay que tenerencuentaque en la listade argumentosa scanf no se le suministranlas variablesque queremosleer,sinolas direccionesde memoriade lasvariablesque queremosleer (para que seapor referencia) I Ejemplo
  • 244. Sistemas Operativos El Lenguaje de programaci´on C 243 / 265 intn; char caracter; scanf ("%d",&n);printf ("nEl cuadradode %d es: %d",n,n*n);scanf ("%c",&caracter);printf ("nHe le´ıdoel car´acter: %c",caracter);
  • 245. Biblioteca C Sistemas Operativos El Lenguaje de programacio´n C BibliotecaC Documentaci´onenl´ınea Asignaci´onde memoria Funcionesde caracteres Cadenasde caracteres Entrada/salidaconformato Entrada/salidaconformatoa fichero Entrada/salidaconformatoa memoria Entrada/salidasinformato Ejercicios
  • 246. Sistemas Operativos El Lenguaje de programaci´on C 245 / 265 Entrada/salida con formato a fichero I Las funciones printf,scanf, puts,gets,putchar, getcharoperansobre la entradaest´andary la salidaest´andar.Existen funcionestotalmente an´alogasque operan sobre ficheros
  • 247. Biblioteca C Sistemas Operativos El Lenguaje de programacio´n C I Los ficherospodemosabrirlos con fopen ycerrarloscon fclose FILE *fopen(constchar *path, constchar *mode); intfclose(FILE*fp); I Las funcionesparaentraday salidaa ficheroson intfprintf(FILE*stream, const char *format,...);int fscanf(FILE*stream,const char *format, ...);char
  • 248. Sistemas Operativos El Lenguaje de programaci´on C 247 / 265 *gets(char*s); int fputs(constchar*s, FILE *stream);intfgetc(FILE *stream);intfputc(intc, FILE *stream); BibliotecaC Documentaci´onenl´ınea Asignaci´onde memoria Funcionesde caracteres Cadenasde caracteres Entrada/salidaconformato Entrada/salidaconformatoa fichero
  • 249. Biblioteca C Sistemas Operativos El Lenguaje de programacio´n C Entrada/salidaconformatoa memoria Entrada/salidasinformato Ejercicios Entrada/salida con formato a memoria I Existentambi´en funcionesque nos permitensimplemente
  • 250. Sistemas Operativos El Lenguaje de programaci´on C 249 / 265 hacer laentrada/salida sobre variablesen memoria. I Estas funcionesoperan exactamente igual que las que hemosvisto, pero requierenunargumento adicional I Una variabletipo puntero a car´acter,donde se va a colocar la salida formateada
  • 251. Biblioteca C Sistemas Operativos El Lenguaje de programacio´n C adecuadamente (o desde donde se pretende leer la entrada) intsprintf(char*str,const char *format, ...);int sscanf(constchar*str, const
  • 252. Sistemas Operativos El Lenguaje de programaci´on C 251 / 265 char *format, ...);Biblioteca C Documentaci´onenl´ınea Asignaci´onde memoria Funcionesde caracteres Cadenasde caracteres Entrada/salidaconformato Entrada/salidaconformatoa fichero Entrada/salidaconformatoa memoria
  • 253. Biblioteca C Sistemas Operativos El Lenguaje de programacio´n C Entrada/salidasinformato Ejercicios Entrada/salida sin formato I Quiz´ala maneramas c´omoda de realizare/s seala de las llamadasal sistemaenUNIX;estas llamadassimplemente leenbytesyescriben bytesenun fichero
  • 254. Sistemas Operativos El Lenguaje de programaci´on C 253 / 265 I Si queremosque tenganun formatoespec´ıfico, podemosformatear previamentelosdatos I Para abrir un ficheroint open(constchar*pathname, intflags,mode_tmode); pathname nombre del fichero flags modo de apertura O RDONLY, O
  • 255. Biblioteca C Sistemas Operativos El Lenguaje de programacio´n C WRONLY, O RDWR, O CREAT O EXCL... mode permisos del fichero (solo si secrea el fichero) I Devuelve unentero (descriptordel fichero) que se usa en read y write
  • 256. Sistemas Operativos 255 / 265 I Para leer o escribir ssize_t read(int fd, void *buf, size_t count); ssize_t write(intfd,constvoid*buf,size_tcount); fd descriptor de fichero (obtenido con open buf direcci´on dememoria para la transferenciadedatos count nu´mero de bytes de e/s I Devuelvenennu´merode bytesque se hantransferido I para cerrar el ficheroint close(intfd); I Otras funcionesrelacionadas(trasabrirficheroconfopen()) 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); longftell(FILE *stream);
  • 257. Sistemas Operativos 256 / 265 El Lenguaje de programaci´on C Biblioteca C BibliotecaC Documentaci´onenl´ınea Asignaci´onde memoria Funcionesde caracteres Cadenasde caracteres Entrada/salidaconformato Entrada/salidaconformatoa fichero Entrada/salidaconformatoa memoria Entrada/salidasinformato
  • 258. Sistemas Operativos 257 / 265 Ejercicios El Lenguaje de programacio´n C Ejercicios I RealizarenC un programaque recibacomo par´ametroel nombre de un ficheroygenere tresficheros I Uno que contiene los mismos caracteres pero en orden inverso
  • 259. Sistemas Operativos 258 / 265 I Otro que contiene las mismas palabraspero en orden inverso I Otro que contiene las mismas l´ıneas pero en orden inverso I Se supone que laseparaci´onentre l´ıneasestadadaporunaocurrenciadel caracter fin de l´ınea (’n’), y la separaci´on entre palabras por una o m´as ocurrenciasdel caracterespacio (’’) o del caracter tab (’t’) I Puede usarse strtok El Lenguaje de programaci´on C
  • 260. Sistemas Operativos El Lenguaje de programaci´on C 259 / 265 Introducci´on Tipos, operadoresyexpresiones Control de flujo Funcionesyestructurade un programa Arraysy punteros Estructuras BibliotecaC Herramientas Herramientas
  • 261. Sistemas Operativos El Lenguaje de programacio´n C260 / 265 Valgrind
  • 262. Sistemas Operativos El Lenguaje de programaci´on C 261 / 265 Depuracio´n de memoria con Valgrind I Valgrindesunaherramientaque permitedetectarfallosen lagesti´on de memoria I Uso de memoria sin asignar I Accesos incorrectos a memoria I Memoria asignada, no liberada y perdida (memory leaks) I Para usar el depuradora Compilamos con -g -O0 $ gcc -g -O0 ejercicio1.c
  • 263. Sistemas Operativos El Lenguaje de programacio´n C262 / 265 b Invocamos valgrind pas´andoleel ejecutable(y sus par´ametros) como par´ametro $ valgrind --leak-check=full --show-reachable=yes a.out Ejemplo de depuracio´n de memoria con Valgrind (I) #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!!!
  • 264. Sistemas Operativos El Lenguaje de programaci´on C 263 / 265 } Ejemplo de depuracio´n de memoria con Valgrind (II) $ valgrind --leak-check=full --show-reachable=yes a.out ==27888== Memcheck, a memory error detector ==27888== Copyright (C) 2002-2010, and GNU GPL’d, by Julian Seward et al. ==27888== Using Valgrind-3.6.1 and LibVEX; rerun with -h for copyright info ==27888== Command: ./a.out ==27888== ==27888== Invalid write of size 4 ==27888== at 0x8048448: main (p.c:11) ==27888== Address 0x41b8050 is 0 bytes after a block of size 40 alloc’d ==27888== at 0x4025018: malloc (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so) ==27888== by 0x8048428: main (p.c:8) ==27888== 0 2 4 6 8 10 12 14 16 18 ==27888== ==27888== HEAP SUMMARY: ==27888== in use at exit: 40 bytes in 1 blocks ==27888== total heap usage: 1 allocs, 0 frees, 40 bytes allocated ==27888== ==27888== 40 bytes in 1 blocks are definitely lost in loss record 1 of 1 ==27888== at 0x4025018: malloc (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so) ==27888== by 0x8048428: main (p.c:8)
  • 265. Sistemas Operativos El Lenguaje de programacio´n C264 / 265 ==27888== ==27888== LEAK SUMMARY: ==27888== definitely lost: 40 bytes in 1 blocks ==27888== indirectly lost: 0 bytes in 0 blocks ==27888== possibly lost: 0 bytes in 0 blocks ==27888== still reachable: 0 bytes in 0 blocks ==27888== suppressed: 0 bytes in 0 blocks ==27888== ==27888== For counts of detected and suppressed errors, rerun with: -v ==27888== ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 11 from 6) Ejemplo de depuracio´n de memoria con Valgrind (III) Tras corregir errores $ valgrind --leak-check=full--show-reachable=yes ./a.out ==12056==Memcheck, a memory error detector ==12056==Copyright (C)2002-2010, and GNU GPL’d, by Julian Sewardet al. ==12056==Using Valgrind-3.6.1and LibVEX;rerun with -h for copyrightinfo ==12056==Command: ./a.out ==12056==
  • 266. Sistemas Operativos El Lenguaje de programaci´on C 265 / 265 0 2 4 6 8 10 12 1416 18 ==12056== ==12056==HEAP SUMMARY: ==12056== in use at exit: 0 bytes in 0 blocks ==12056==totalheap usage: 1allocs, 1 frees,40 bytes allocated ==12056== ==12056==All heap blocks werefreed --no leaks arepossible ==12056== ==12056==For counts ofdetected and suppressederrors, rerunwith: -v ==12056==ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 11from 6)