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)

Lenguaje c

  • 1.
    Sistemas Operativos ElLenguaje 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 deprogramacio´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 deprogramacio´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 deprogramacio´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 deprogramacio´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 deprogramacio´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 deprogramacio´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 deprogramacio´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 ElLenguaje 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 ElLenguaje 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 ElLenguaje 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 Ideclaraciones 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 ElLenguaje 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 ElLenguaje 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 ElLenguaje 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 ElLenguaje 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 ElLenguaje 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 ElLenguaje 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 ElLenguaje 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 ElLenguaje 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 ElLenguaje 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 ElLenguaje 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 ElLenguaje 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 ElLenguaje 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 sencillode 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 sencillode 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 sencillode 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 sencillode 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 ElLenguaje 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 ElLenguaje 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 ElLenguaje 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 ElLenguaje 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 yexpresiones 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 ElLenguaje 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 yexpresiones 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 ElLenguaje de programaci´on C 44 Conversionesde tipo Operadoresde bit Incrementoydecremento, asignaci´onyexpresiones Expresi´oncondicional Precedenciayordene evaluaci´on Ejercicios
  • 46.
    Tipos, operadores yexpresiones 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 ElLenguaje 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 yexpresiones 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 ElLenguaje 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 yexpresiones 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 ElLenguaje 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 ElLenguaje 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 ElLenguaje 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 ElLenguaje 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 ElLenguaje 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 ElLenguaje 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 ElLenguaje 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> #defineUPPER300 #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 ElLenguaje 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 ElLenguaje 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 yexpresiones 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 ElLenguaje 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 yexpresiones 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 ElLenguaje de programaci´on C 66 / 265 Conversionesde tipo Operadoresde bit Incrementoydecremento, asignaci´onyexpresiones Expresi´oncondicional Precedenciayordene evaluaci´on Ejercicios
  • 68.
    Tipos, operadores yexpresiones 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 ElLenguaje 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 yexpresiones Sistemas Operativos El Lenguaje de programacio´n C 69 / 265 Precedenciayordene evaluaci´on Ejercicios
  • 71.
    Sistemas Operativos ElLenguaje 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 ElLenguaje 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 ElLenguaje 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 ElLenguaje 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 ElLenguaje 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 ElLenguaje 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 ElLenguaje 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 ElLenguaje de programacio´n C 77 / 265 El C s´ı define unaprecedenciaentre distintosoperadores, Adem´ascada operadortiene unaasociatividad,comopuede verse enlatabla siguiente
  • 79.
    Sistemas Operativos 78 OPERADORESasociatividad ()[]->. izquierdaaderecha ! ~++---*& (tipo) sizeof derechaa izquierda */ izquierdaaderecha +- izquierdaaderecha <<>> izquierdaaderecha <<=>>= izquierdaaderecha ==!= izquierdaaderecha & izquierdaaderecha ^ izquierdaaderecha | izquierdaaderecha
  • 80.
    Sistemas Operativos ElLenguaje 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 Operadoresderelaci´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 ElLenguaje 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 deflujo 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 Lenguajede 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.
  • 88.
    Sistemas Operativos ElLenguaje 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; IDado 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 ElLenguaje 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 ElLenguaje 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 ElLenguaje 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 ElLenguaje 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 ElLenguaje 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 IEquivale 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 SistemasOperativos 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 ElLenguaje 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 SistemasOperativos 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 SistemasOperativos 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 SistemasOperativos 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 Lenguajede 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 Sepuede omitirel tipode datoque devuelvelafunci´on(en ese caso se asume que esint El Lenguaje de programaci´on C
  • 114.
    Sistemas Operativos ElLenguaje 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 ElLenguaje 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 ElLenguaje 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 ElLenguaje 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 ElLenguaje 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 ElLenguaje 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 estructurade 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 ElLenguaje de programacio´n C 128 / 265 Variablesexternas Variablesest´aticas Variablesregistro Inicializaci´on Recursividad EL preprocesadorC Ejercicios
  • 130.
    Funciones y estructurade 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 ElLenguaje 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 ElLenguaje 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 estructurade 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 ElLenguaje 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
  • 139.
  • 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 IHacer 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 ElLenguaje 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 ElLenguaje de programaci´on C 144 I Organizaci´onde Memoria:Ejemplo
  • 146.
  • 147.
    Sistemas Operativos ElLenguaje 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 ElLenguaje de programaci´on C 148 El Lenguaje de programacio´n C
  • 150.
    Sistemas Operativos ElLenguaje 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 ElLenguaje 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 ElLenguaje 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 ElLenguaje 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 ElLenguaje 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 ElLenguaje 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 ElLenguaje 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 ElLenguaje 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 ElLenguaje 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 ElLenguaje 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 ElLenguaje 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 ElLenguaje 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 ElLenguaje 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 ElLenguaje 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 ElLenguaje 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 ElLenguaje 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 ElLenguaje 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 ElLenguaje de programaci´on C 171 / 265 En las siguientesfigurasvemosladiferenciaenladisposici´on de memoria I Array de punteros I Array multidimensional
  • 173.
    I Sistemas Operativos ElLenguaje 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 ElLenguaje 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 Accesoaelementosde 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 ElLenguaje 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 ElLenguaje 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 ElLenguaje 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 ElLenguaje 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 Arraysy 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,encasocontrariolohacealfab´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 ElLenguaje 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 ElLenguaje 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 ElLenguaje 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 ElLenguaje 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 ElLenguaje 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 ElLenguaje de programacio´n C 19 } *p1, *p2; b struct COORDENADAS{ intx; inty; }; struct COORDENADAS*p1, *p2;
  • 196.
    Sistemas Operativos ElLenguaje 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 ElLenguaje 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 ElLenguaje 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 ElLenguaje 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 ElLenguaje 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 ElLenguaje 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 ElLenguaje 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 ElLenguaje 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 ElLenguaje de programaci´on C 203 / 265 } return -1; }
  • 205.
    Sistemas Operativos ElLenguaje de programacio´n C 204 Estructuras Operacionessobre estructuras Punterosaestructuras Arraysde estructuras Estructuras autoreferenciadas Uniones Camposde bits typedef Ejercicios
  • 206.
    Estructuras Sistemas Operativos ElLenguaje 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 ElLenguaje 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 ElLenguaje de programacio´n C 207 / 265 Uniones Camposde bits typedef Ejercicios
  • 209.
    Sistemas Operativos 208 Uniones IUna 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 ElLenguaje 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 ISi 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 ElLenguaje de programaci´on C 213 / 265 Estructuras Estructuras Operacionessobre estructuras Punterosaestructuras Arraysde estructuras Estructuras autoreferenciadas Uniones Camposde bits typedef Ejercicios
  • 215.
    Sistemas Operativos 214 ElLenguaje 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 ElLenguaje 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 Camposdebits typedef Ejercicios El Lenguaje de programacio´n C
  • 218.
    Sistemas Operativos ElLenguaje 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 (cadal´ıneatiene unapalabray un entero) yalmacenalos elementosenlalistaordenadosporel valordel entero.
  • 220.
    Biblioteca C Sistemas OperativosEl 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 ElLenguaje 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 OperativosEl 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 ElLenguaje 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 OperativosEl 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 ElLenguaje 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 OperativosEl 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 ElLenguaje 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 ElLenguaje 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/salidaconformatoafichero 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 OperativosEl 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 ElLenguaje 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 ElLenguaje 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 ElLenguaje 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 ElLenguaje 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 ElLenguaje 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 ElLenguaje 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 ElLenguaje 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 OperativosEl 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 ElLenguaje 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 OperativosEl 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 ElLenguaje 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 OperativosEl 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 ElLenguaje 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 OperativosEl 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 ElLenguaje 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 OperativosEl 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 ElLenguaje 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 OperativosEl 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 ElLenguaje 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 ElLenguaje de programacio´n C260 / 265 Valgrind
  • 262.
    Sistemas Operativos ElLenguaje 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 ElLenguaje 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 ElLenguaje 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 ElLenguaje 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 ElLenguaje 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)