Professional Documents
Culture Documents
DE
PROGRAMACIN
RAFAEL
LPEZ
NAVARRO
CURSO
2011/2012
UNED
El
procedimiento
printf
est
en
la
librera
<stdio.h>
y
sirve
para
mostrar
o
escribir
por
pantalla
un
valor:
Ejemplos:
printf
("Introduce
tu
nombre:");
printf
("----
Bienvenido
a
este
programa
---
\
n
");
Cuando
a
parte
de
texto
queremos
mostrar
valores
numricos,
la
funcin
printf
necesita
saber
el
tipo
de
datos
que
tiene
que
escribir
para
saber
cmo
las
ha
de
escribir.
El
formato
o
forma
de
utilizar
esta
funcin
es:
printf
("cadena
con
formatos",
valor1,
valor3,
...
valorN);
Nota:
no
es
obligatorio
el
signo
de
%
de
principio
del
especificador,
y
el
tipo
de
datos
que
se
quiere
mostrar.
Esto
es
lo
ms
normal
y
lo
que
se
ve
en
esta
asignatura.
En
caso
de
que
se
quiera
especificar
ms
los
datos
de
salida
se
utilizan
los
dems
parmetros,
que
estn
entre
"corchetes".
Los
tipos
habituales:
Una
cadena
de
caracteres:
s
Un
carcter:
c
Valor
real
con
/
o
sin
notacin
exponencial,
con
un
nmero
dado
de
decimales
de
precisin
.Los
ceros
y
puntos
decimal
salen
si
es
necesario:
g
Valor
real
con
notacin
exponencial
e
[+/-]
ddd.
e
Valor
real
(punto
fijo)
de
la
forma
[-]
dddd.dddd.
f
Entero
decimal
(un
entero):
d
Nota:
%10.3f
real
en
coma
fija
que
reserva
10
espacios
y
una
precisin
de
3
decimales
3.2
-
CONSTANTES:
Son
datos
que
mantienen
su
valor
durante
toda
la
ejecucin
del
programa.
La
forma
de
declarar
una
constante
es:
Const
tip
nombre
=valor;
3.3- VARIABLES
Son
datos
que
pueden
ir
variando
su
valor
durante
la
ejecucin
del
programa.
La
forma
de
declarar
la
variable
es:
tipoDeVariable
nombreVariable;
Encolumnado
Comentarios
Eleccin
de
nombres
Uso
correcto
de
maysculas
y
minsculas
Constantes
con
nombre.
SI
NO
El
flujo
de
control
durante
la
ejecucin
del
programa
se
refleja
mediante
lneas
o
vas
que
van
de
un
elemento
a
otro.
Las
acciones
tienen
una
sola
va
de
entrada
o
comienzo
y
una
de
terminacin
o
salida.
Las
condiciones
tienen
una
va
de
entrada,
y
dos
vas
de
salida
marcadas
son
SI
y
NO.
La
programacin
estructurada
recomienda
descomponer
las
acciones
usando
las
estructuras
ms
sencillas
posibles,
que
son:
Secuencia:
secuencia
de
acciones.
Seleccin:
consiste
en
ejecutar
una
accin
u
otra.
Iteracin:
repeticin
de
una
accin
mientras
que
se
cumpla
una
determinada
condicin.
(Bucle)
Sentencia
IF
Sentencia
WHILE
Sentencia
FOR
7.2 FUNCIONES
7.3
PROCEDIMIENTOS
Son
subprogramas
que
realizan
una
cierta
tarea
o
accin.
No
devuelven
ningn
valor.
Por
referencia:
en
este
caso,
el
mdulo
invocado,
en
lugar
de
trabajar
con
los
valores
de
las
variables
actuales,
trabaja
sobre
las
direcciones
de
las
variables
locales.
Por
tanto
en
este
caso
el
mdulo
invocado
puede
modificar
los
valores
de
las
variables
actuales
del
mdulo
que
hace
la
llamada.
Este
uso
ofrece
menos
seguridad
que
el
paso
por
valor.
El
uso
inadecuado
de
las
variables
que
pasamos
como
argumentos
puede
dar
lugar
a
algunos
problemas:
Efectos
secundarios.
Cuando
un
subprograma
modifica
alguna
variable
externa,
se
dice
que
est
produciendo
efectos
secundarios
o
laterales.
El
concepto
al
efecto
lateral
sera
la
transparencia
referencial.
Siempre
que
llamamos
a
un
subprograma
con
los
mismo
parmetros
se
debe
obtener
el
mismo
resultado.
Redefinicin
de
elementos.
Cuando
a
un
subprograma
se
define
una
variable
local
da
igual
el
nombre
que
elegimos,
ya
que
al
ser
local
slo
afecta
al
propio
subprograma.
El
problema
viene
cuando
el
nombre
de
la
variable
local
que
elegimos
es
lo
mismo
que
una
variable
global.
Aparte
de
sacar
resultados
incorrectos,
se
pierde
mucho
en
claridad.
Doble
referencia(aliasing)
Se
produce
cuando
una
misma
variable
se
referencia
con
dos
nombres
diferentes.
Se
puede
dar
los
siguientes
casos:
1. Cuando
un
subprograma
utiliza
una
variable
externa
que
tambin
se
le
pasa
como
argumento.
2. Cuando
para
utilizar
un
subprograma
se
pasa
la
misma
variable
en
dos
o
ms
argumentos.
Desarrollo
descendente:
desarrollo
por
refinamientos
sucesivos,
teniendo
en
cuenta
adems
la
posibilidad
de
definir
operaciones
abstractas.
En
cada
etapa
de
refinamiento
de
una
operacin
habr
que
optar
por
una
de
las
alterativas
siguientes:
Considerar
la
operacin
como
operacin
terminal,
y
codificarla
mediante
sentencias
del
lenguaje
de
programacin
Considerar
la
operacin
como
operacin
compleja,
y
descomponerla
en
otras
ms
sencillas.
Considerar
la
operacin
como
operacin
abstracta,
y
especificarla,
escribiendo
ms
adelante
el
subprograma
que
la
realiza.
Resultar
ventajoso
definir
una
operacin
como
abstracta
si
se
consigue
alguna
de
las
ventajas
siguientes:
Evitar
mezclar
en
un
determinado
fragmento
de
programa
operaciones
con
un
nivel
de
detalle
muy
diferente.
Evitar
escribir
repetidamente
fragmentos
de
cdigo
que
realicen
operaciones
anlogas.
Reutilizacin:
Si
la
operacin
identificada
como
operacin
abstracta
tiene
un
cierto
sentido
en
s
misma,
es
muy
posible
que
resulte
de
utilidad
en
otros
programas,
adems
de
en
aqul
para
el
cual
se
ha
desarrollado.
La
escritura
de
otros
programas
que
se
utilicen
esa
misma
operacin
resulta
mas
sencilla,
ya
que
se
aprovecha
el
cdigo
de
su
definicin,
que
ya
estaba
escrito.
Los
procedimientos
y
funciones
cuanto
mas
genricos
sean
en
su
comportamiento,
ms
reutilizables
son.
Un
procedimiento
o
funcin
es
reutilizable
si
podemos
aplicarlo
no
slo
al
programa
para
el
que
est
diseado,
sino
que
tambin
a
otros
programas
en
los
que
se
requiere
un
procedimiento
o
funcin
similar.
Desarrollo
ascendente:
Consiste
en
ir
creando
subprogramas
que
realicen
operaciones
significativas
de
utilidad
para
el
programa
que
se
intenta
construir,
hasta
que
finalmente
sea
posible
escribir
el
programa
principal,
de
manera
relativamente
sencilla,
apoyndose
en
los
subprogramas
desarrollados
hasta
ese
momento.
A
parte
de
los
tipos
de
datos
predefinidos
en
C+-
(int,
char,
float..)
el
programador
tambin
puede
definirse
sus
propios
tipos
de
datos
con
el
uso
de
la
instruccin
typedef,
por
ejemplo
Typedef
int
TipoEdad;
Typedef
char
TipoSexo;
Typedef
float
TipoAltura;
Una
vez
declarados
los
tipos
se
pueden
definir
y
declarar
variables
de
esos
tipos
que
acabamos
de
definir,
por
ejemplo
sera
valido:
TipoEdad
edad1,
edad2;
TipoSexo
sexo;
TipoAltura
altura;
Y
podramos
utilizar
estas
variables
como
las
variables
que
hemos
visto
hasta
ahora:
Edad2=
edad1
+
10;
Sexo
=
H;
Altura
=
1,72;
donde
TypoVector
es
el
nombre
del
nuevo
tipo
de
vector
que
se
declara
y
NumElementos
es
un
valor
constante
que
indica
el
nmero
de
elementos
que
constituyen
el
vector.
El
tamao
del
array
estar
comprendido
entre
0
y
NumElementos-1.
TipoElemento
corresponde
al
tipo
de
dato
de
cada
uno
de
los
elementos
del
vector
y
puede
ser
cualquier
tipo
de
dato
predefinido
del
lenguaje
o
definido
por
el
programado.
INICIALIZACIN:
En
el
caso
de
un
vector
la
inicializacin
afecta
a
todos
sus
elementos
y
por
tanto
la
notacin
es
algo
especial
y
en
ella
se
indica
el
valor
inicial
de
todos
los
elementos
agrupndolos
entre
llaves
{..}
y
separndolos
por
comas
(,).
TipoAgenda
agendaUno
=
{
Lunes,
Martes,
Mircoles,
Jueves,
Viernes..};
OPERACIONES
CON
VECTORES:
La
mayora
de
las
operaciones
interesantes
con
vectores
hay
que
realizarlas
operando
con
sus
elementos
uno
por
uno.
La
referencia
a
un
elemento
concreto
de
un
vector
se
hace
mediante
el
nombre
del
vector
seguido,
entre
corchetes,
del
ndice
del
elemento
referenciado.
VectorUno[0];
//
frase[13];
Un
elemento
de
un
vector
puede
formar
parte
de
cualquier
expresin
con
constantes,
variables
u
otros
elementos.
9.7
TIPO
REGISTRO
(STRUCT)
Los
esquemas
de
tupla
pueden
usarse
en
programas
en
C+-
definindolos
como
estructuras
del
tipo
registro
o
struct.
Un
registro
struct
es
una
estructura
de
datos
formada
por
una
coleccin
de
elementos
de
informacin
llamados
campos.
DEFINICIN
DE
REGISTROS:
se
hace
utilizando
la
palabra
clave
struct:
Typedef
struct
Tipo-registro
{
Tipo-campo1
nombre-campo1;
Tipo-campo2
nombre-campo2;
.
};
Cada
una
de
las
parejas
Tipo-campo
y
nombre-campo,
separadas
por
punto
y
coma,
define
un
campo
o
elemento
componente
y
su
correspondiente
ipo.
Adems
hay
que
tener
en
cuenta
que
la
estrucutra
acaba
siempre
con
punto
y
coma:
Typedef
enum
TipoMes
{
Enero,
febrero
};
VARIABLES
DE
TIPO
REGISTRO
Y
SU
INICIALIZACIN:
Para
declara
variables
de
tipo
registro
es
necesario
haber
realizado
previamente
la
deinicin
del
tipo
del
registro.
No
se
permite
declarar
variables
de
tipo
annimo.
TipoFecha
ayer,
hoy;
TipoPunto
punto1,
punto2;
TipoFecha
hoy
=
{12
,Marzo,2009};
USO:
Al
manejar
datos
estructurados
de
tipo
registro
se
dispone
de
dos
posibilidades.
Operar
con
el
dato
completo,
o
bien
operar
con
cada
campo
por
separado.
Las
posibilidades
de
operar
con
el
dato
completo
son
bastante
limitadas.
La
nica
operacin
admisible
es
la
de
asignacin.
En
estas
asignaciones
debe
cumplirse
la
compatibilidad
de
tipos.
No
es
suficiente
la
compatibilidad
estructural,
es
decir,
dos
estructuras
con
los
mismos
campos
no
son
compatibles
si
sus
definiciones
se
hacen
por
separado.
ACCESO
A
UNA
ESTRUCTURA:
Dado
que
los
campos
de
una
estructura
se
procesa
generalmente
de
forma
individual,
deber
poder
acceder
a
cada
uno
de
estos
campos
individualmente.
Para
acceder
a
un
determinado
campo
para
poder
leer
o
escribir
en
l
haremos:
variable.campo
10.1.2
Sentencia
continue
Esta
sentencia
dentro
de
cualquier
bucle
(while,
for
o
do)
finaliza
la
iteracin
en
curso
e
inicia
la
siguiente
iteracin.
A
veces
dependiendo
de
la
evolucin
de
los
clculos
realizados
en
una
iteracin,
no
tiene
sentido
completar
la
iteracin
que
se
est
realizando
y
resulta
ms
adecuado
iniciar
una
nueva.
For
(int
i
=
0;
i
<
N;
i++){
If
(vectorCoeficientes[i]
==
0){
Continue;
}
calculo
=
calculo
/
vectorCoeficientes[i];
}
Los
vectores
con
un
tamao
indefinido
se
denominan
vectores
abiertos.
En
C+-
los
argumentos
de
tipo
vector
abierto
se
especifican
de
manera
similar
a
una
declaracin
de
tipo
vecotr,
omitiendo
el
tamo
explicito
pero
no
los
corchetes
(^*):
const
int
V[
];
El
precio
que
hay
que
pagar
por
disponer
de
esat
facilidad
es
tener
que
pasar
siempre
la
longitud
concreta
del
vector
como
argumento,
en
cada
llamada.
EscribirVectorAbierto
(vectorDos,
NumeroElementos);
Numero.valorentero
=
33;
Otro.valorreal
=
float
(numero.valorentero);
Fraccion2.valorracional
=
fraccion1.valorracional;
Como
se
ha
dicho,
slo
una
de
las
variantes
puede
estar
vigente
en
un
momento
dado.
Si
asignamos
valor
a
una
de
ellas
ser
sta
la
que
exista
a
partir
de
ese
momento,
al
tiempo
que
dejan
de
existir
las
dems.
11.3.2
Registros
con
Variantes
El
hecho
de
que
un
dato
de
tipo
unin
deba
ir
acompaado
de
informacin
complementaria
para
saber
cul
es
la
variante
aplicable
hace
que
los
tipos
unin
aparezcan
casi
siempre
formando
parte
de
estructuras
mas
complejas.
Un
ejemplo
es
lo
que
se
denomina
como
registros
con
variantes.
Se
trata
de
agregados
o
tuplas
en
los
que
hay
una
coleccin
de
campos
fijos,
aplicables
en
todos
los
casos,
y
campos
variantes
que
se
definen
segn
el
esquema
unin.
Adems
suele
reservarse
un
campo
fijo
para
indicar
explcitamente
cual
es
la
variante
aplicable
en
cada
momento,
a
esto
se
le
llama
discriminante.
typedef enum ClaseNumero {Enter, Real, Fraccin};
typedef struct TipoFraccio {
int numerador;
int denominador;
}
typedef union TipoValor {
int valorEnter;
float valorReal;
TipoFraccio valorracional; };
typedef struct TipoNumero {
ClaseNumero clase; Campo discriminante
TipoValor valor; }
void EscriureNumero (TipoNumero n) {
switch (n.clase) {
case Enter: printf ("% d", n.valor.valorEnter); break;
case Real: printf ("% f", n.valor.valorReal); break;
case fraccin: printf ("% d /% d", n.valor.valorRacional.numerad oro,
n.valor.valorRacional.denominador); break;
default: printf (?????); }
}
12.3 INSERCION
El
problema
que
se
plantea
aqu
es
insertar
un
nuevo
elemento
en
una
coleccin
de
elementos
ordenados,
manteniendo
el
orden
de
la
coleccin.
Tenemos
elementos
almacenados
en
un
vector,
ocupando
posiciones
desde
el
principio
hasta
el
final
quedando
libre
algunos
elementos
del
final.
La
operacin
se
puede
realizar
de
forma
iterativa,
examinando
los
elementos
empezando
por
el
final
hasta
encontrar
uno
que
sea
inferior
o
igual
al
que
se
quiere
insertar.
Los
elementos
mayores
que
el
que
se
quiere
insertar
se
van
moviendo
una
posicin
hacia
delante,
con
lo
que
va
quedando
un
huevo
en
medio
del
vector.
Al
encontrar
un
elemento
menor
que
el
nuevo,
se
copia
el
nuevo
elemento
en
el
conocer
el
tamao
de
las
variables,
en
estos
casos
habr
que
hacer
uso
de
variables
dinmicas.
Estas
estructuras
se
caracerizan
por
la
reserva
y
liberacin
de
memoria
que
se
realiza
durante
la
ejecucin
del
programa,
y
este
espacio
puede
variar.
Estas
sentencias
asignan
el
valor
33
a
la
variable
dinmica
sealada
por
el
puntero
pe,
y
luego
la
imprime.
Para
poder
detectar
si
un
puntero
seala
realmente
o
no
a
otra
variable,
existe
el
valor
especial
NULL
(no
es
una
palabra
clave,
esta
dentro
de
la
librera
stdlib.h)
Este
valor
es
compatible
con
cualquier
tipo
de
puntero,
e
indica
que
el
puntero
no
seala
a
ninguna
variable.
Se
usar
para
inicializar
las
variables
de
tipo
puntero
al
comienzo
del
programa:
If
(*pe
=
NULL)
{
*pe
=
33;
printf
(%d,
*pe);
}
13.2.2
Uso
de
variables
dinmicas
Las
variables
dinmicas
no
tienen
reservado
el
espacio
en
memoria
que
tienen
las
dems
variables,
sino
que
se
crean
a
partir
de
punteros
en
el
momento
en
que
se
indique.
Una
vez
creadas
siguen
existiendo
incluso
despus
de
que
termine
la
ejecucin
del
subprograma
donde
se
crean.
Se
crean
as:
Typedef
Tipo-de-variable*
tipo-puntero;
Tipo-puntero
puntero;
Puntero
=
new
tipo-de-variable;
El
operador
new
crea
una
variable
dinmica
del
tipo
indicado
y
devuelve
una
referencia
que
puede
asignarse
aun
puntero
de
tipo
compatible.
La
variable
dinmica
se
crea
a
base
de
reservarle
el
espacio
necesario
en
una
zona
general
de
memoria
gestionada
dinmicamente.
En
principio
no
se
puede
asumir
que
la
variable
recin
creada
tenga
un
valor
concreto,
igual
que
las
variables
normales
que
se
declaran
sin
un
valor
inicial
explicito.
Una
vez
creadas
siguen
existiendo
hasta
que
el
programador
no
especifique
que
ya
no
se
necesita.
Para
ello
existe
la
sentencia
delete,
que
permite
destruir
la
variable
dinmica:
Delete
puntero;
Los
punteros
son
un
elemento
de
programacin
de
muy
bajo
nivel.
Los
lenguajes
de
programacin
simblicos
deberan
evitar
su
empleo,
sustituyendo
por
mecanismos
mas
potentes
de
declaracin
de
estructuras
de
datos,
que
permitiesen
definir
directamente
estructuras
dinmicas
ilimitadas.
Para
crear
una
secuencia
ilimitada
tendremos
que
recurrir
al
empleo
de
variables
dinmicas
y
punteros,
enlazando
cada
elemento
de
la
secuencia
con
el
siguiente.
Cada
elemento
de
la
secuencia
se
materializa
como
un
registro
con
dos
campos:
el
primero
contiene
el
valor
de
una
componente,
y
el
segundo
es
un
puntero
que
seala
al
siguiente.
El
ltimo
apuntar
a
NULL.
Una
lista
es
una
esctructura
de
datos
dinmica
formada
por
un
conjunto
de
elementos,
llamados
nodos,
del
mismo
tipo
y
almacenados
en
la
memoria
principal
siguiendo
una
secuencia
lgica.
Podemos
distinguir:
Listas
contiguas:
Son
aquellas
en
las
que
los
elementos
se
guardan
en
posiciones
de
memoria
contiguas,
de
forma
que
equivalen
a
tablas
o
vectores
unidimensionales
.
Las
operaciones
que
podemos
hacer
en
una
lista
contigua
son:
o Ordenarla
o Copiar
una
lista
origen
a
un
o Buscar
un
elemento
destino
o Aadir
un
elemento
o Concatenar
varias
listas
o Eliminar
un
elemento
o Dividir
una
lista
en
sublistas
o Borrar
la
lista
completa
Concepto:
Si
identifica
el
concepto
de
tipo
de
dato
con
el
del
conjunto
de
valores
que
pueden
tomar
los
datos
de
este
tipo.
Un
enfoque
mas
moderno
de
la
programacin
trata
de
asociar
la
idea
de
tipo
de
datos
con
la
clase
de
valores,
abstractos,
que
pueden
tomar
los
datos.
Esto
quiere
decir
que
la
representacin
o
codificacin
particular
de
los
valores
no
cambia,
el
tipo
del
dato
considerado.
En
el
enfoque
actual
de
la
programacin
se
identifican
los
tipos
de
datos
de
forma
completamente
abstracta,
llegando
a
la
idea
de
tipo
abstracto
de
datos
(TAD).
Esto
quiere
decir
que
un
programa
que
use
ese
tipo
de
datos
no
debera
necesitar
ningn
cambio
por
el
hecho
de
modificar
la
representacin
o
codificacin
de
los
valores
de
ese
tipo.
Si
analizamos
con
cuidado
que
necesita
un
programa
para
poder
usar
datos
de
un
tipo,
encontramos
que
hace
falta:
o Hacer
referencia
al
tipo
en
s,
mediante
un
nombre,
para
poder
definir
variables,
subprogramas,
etc.
o Hacer
referencia
a
algunos
valores
particulares,
generalmente
como
constantes
con
nombre.
o Invocar
operaciones
de
manipulacin
de
los
valores
de
ese
tipo,
bien
usando
operadores
en
expresiones
aritmticas
o
bien
mediante
subprogramas.
El
conjunto
de
todos
estos
elementos
constituye
el
tipo
abstracto
de
datos
(TAD):
Un
tipo
abstracto
de
datos
es
una
agrupacin
de
una
coleccin
de
valores
y
una
coleccin
de
operaciones
de
manipulacin.
Es
importante
comprender
que
estas
colecciones
son
cerradas,
es
decir
slo
se
deben
poder
usar
los
valores
abstractos
y
las
operaciones
declaradas
para
ese
tipo.
Adems
los
detalles
de
cmo
se
representan
los
valores
y
cmo
se
implementan
las
operaciones
pueden
estar
ocultos
para
quien
utiliza
el
tipo
abstracto.
14.2
OCULTACIN
Para
que
un
tipo
sea
realmente
abstracto
hara
falta
que
los
detalles
de
implemtenacin
no
fueran
visibles.
Tanto
en
los
campos
como
en
los
procedimientos.
En
el
caso
anterior
del
TipoPunto
los
campos
x
e
y
son
visibles
en
todo
momento,
y
pueden
funcionar
consultados
y
modificados
por
el
cdigo
que
usa
el
tipo.
Para
permitir
esta
ocultacin
los
tipos
struct
admiten
la
posibilidad
de
declara
ciertos
elementos
componentes
como
privados,
utilizando
la
palabra
clave
private
para
delimitar
una
zona
de
declaraciones
privadas
dentro
de
la
estructura.
Ejemplo
typedef struct TipoData {
void pone (int da, int mes, int ao);
int Da ();
int Mes ();
int Ao ();
void Leer ();
bool EsCorrecta (int da, int mes, int ao);
........
private:
int da, mes, ao;
};
Las variables dia, mes y ao slo son visibles (accesibles) desde las funciones y procedimientos que
estn definidos dentro de la estructura, ya que estn definidas con el modificador private.
En
la
definicin
de
un
elemento
hay
que
especificar
lo
necesario
para
que
el
compilador
genere
el
cdigo
del
propio
elemento.
o Los
tipos
y
constantes
se
especifican
totalmente
en
el
fichero
de
interfaz.
No
hay
declaracin
y
definicin
separadas.
o Las
variables
se
definen
de
la
manera
habitual
en
el
fichero
de
implementacin,
incluyendo
la
especificacin
de
valor
inicial
en
su
caso.
En
el
fichero
de
interfaz
se
pone
adems
una
declaracin
que
indica
el
tipo
y
el
nombre
de
la
variable,
sin
indicar
valor
inicial,
y
precedida
de
la
palabra
clave
extern.
o Los
subprogramas
se
definen
de
la
manera
habitual
en
el
fichero
de
implementacin
y
permiten
al
compilador
generar
el
cdigo
objeto
del
subprograma.
En
el
fichero
de
interfaz
se
pone
adems
una
declaracin
en
forma
de
prototipo
o
cabecera
de
subprograma
slo
con
el
tipo,
nombre
y
argumentos.