Professional Documents
Culture Documents
PROGRAMACIN
GUA DE EJERCICIOS
PRCTICOS
2012
Ing. Jos Oscar Mugetti Mare
Paradigmas de Programacin
PARADIGMA FUNCIONAL
TRABAJO PRCTICO 1:
Teniendo en cuenta la estructura de los lenguajes funcionales y sabiendo especificar los
algoritmos funcionales se pide que realice una primera introduccin a las tcnicas de
diseo de los lenguajes funcionales:
1) Utilizando funciones auxiliares (que suponemos estn definidas previamente) deber
escribir una funcin que calcule el mximo comn divisor de dos nmeros naturales
dados.
2) Usando selectores y funciones auxiliares (que no se definirn), escribir una funcin
que sume todos los elementos de un rbol binario.
3) Escribir la definicin de una funcin que aplicada a una lista de enteros, devuelva un
rbol binario ordenado.
4) Escribir definiciones de funciones que, aplicadas a un rbol binario, devuelva la lista
de sus elementos en:
a) De mayor a menor.
b) De menor a mayor.
5) Utilizando las funciones definidas en 3 y 4, escribir la definicin de una funcin que
ordene una lista dada.
6) Escribir la definicin de una funcin de orden superior con el significado de
"reduce" pero aplicable a rboles binarios.
7) Utilizando 6, escribir funciones que calculen la suma y el producto de un rbol
binario.
8) Escribir funciones que decida si algunos de los elementos de una lista de valores
"booleanos" es verdadero.
9) Escribir una funcin que calcule el largo de una lista.
10) Escribir una funcin que concatene dos listas.
11) Escribir una funcin filtro que, aplicada a una lista, devuelva otra que contenga
solamente los elementos de la original que cumplan con la condicin dada.
Pgina 2 de 54
Paradigmas de Programacin
TRABAJO PRCTICO 2:
1) A continuacin debers evaluar en el interprete
expresiones:
x1
(define x1 7)
x1
'x1
(define x2 'x1)
x2
(define total (+ (* 3 x1) 2))
total
Paradigmas de Programacin
Pgina 4 de 54
Paradigmas de Programacin
TRABAJO PRCTICO 3:
1) Evala, razonando la respuesta, las siguientes expresiones, suponiendo que a, b y c
tienen como valor #t, mientras que d y e tienen como valor #f. Utiliza el interprete
para comprobar tus resultados.
a) (or a (and b e))
b) (not (and b c (or a e)))
c) (not (or (not a) (not b)))
d) (and (or (symbol? e) (not (symbol? a))) (not e))
2) Intenta predecir el valor de las siguientes expresiones condicionales y utiliza luego
el interprete para comprobar la validez de cada prediccin.
a) (if (null? (car '())) 'vaco 'no-vacio)
b) (if (null? (cdr '(2 3))) 'vaco 'no-vacio)
c) (cond
i) ((symbol? (cadr '(a (b)))) 'smbolo)
((number? (caar '((a) 5))) 'numero)
((pair? (cddr '(a (b)))) 'par)
(else 'nada-de-lo-anterior))
d) (+ (if (null? #f) (+ 4 8) (* (+ 3 2) 2))
(cond
((equal? 0 (caadr '(2 ((0))))) 9)
(else 12)))
3) Evala las siguientes expresiones e intenta comprender los resultados obtenidos.
a) ((lambda (x) (+ x (* x x) 1)) 3)
b) ((lambda (x y) (if (number? x) x y)) 'a 'b)
c) ((lambda (l1 l2) (list (car l1) (car l2))) '(1 2 3) '(a b))
4) Evala la siguiente expresin en el interprete de Scheme:
a) (define borra-el-segundo
(lambda (l)
(cons (car l) (cddr l))))
Intenta entender qu ocurre cuando el procedimiento definido recibe una lista de
menos de 2 elementos. Evala las expresiones:
a) (borra-el-segundo '())
b) (borra-el-segundo '(2))
c) (borra-el-segundo '(a b))
d) (borra-el-segundo '(1 3 4 2))
5) Define un procedimiento pega2 que tome como argumentos dos listas de dos
elementos y devuelva las lista resultante de unir ambas. Por ejemplo,
a) (pega2 '(a b) '(c d)) ==> (a b c d)
6) Define una funcin que concatene dos listas y evala su realizacin
7) Define una funcin que concatene tres listas y evala su realizacin
8) Define una funcin que realice el reverso de un lista y evala su realizacin
Pgina 5 de 54
Paradigmas de Programacin
TRABAJO PRCTICO 4:
1) Definir una funcin cuad-list que reciba una lista de nmeros como argumento y
devuelva la lista de los cuadrados de los elementos de la lista de entrada. Por
ejemplo:
a) (cuad-list '(1 2 3 4)) ==> (1 4 9 16)
b) (cuad-list '(5 3)) ==> (25 9)
c) (cuad-list '()) ==> ()
2) Define una funcin sum-cuad que reciba como argumento una lista de nmeros y
devuelva la suma de los cuadrados de los elementos de la lista.Por ejemplo:
a) (sum-cuad '(1 2 3)) ==> 14
b) (sum-cuad '(3 0 3)) ==> 18
c) (sum-cuad '()) ==> 0
3) Define un procedimiento sparimp que reciba como entrada una lista numrica y
devuelva como salida una lista de dos nmeros: el primero, la suma de los pares de
la lista de entrada y el segundo la suma de los impares de la lista de entrada. Por
ejemplo: (investiga y utiliza la funcin "even")
a) (sparimp '(1 2 3 4 5 6)) ==> (12 9)
b) (sparimp '(2 4 6)) ==> (12 0)
c) (sparimp '()) ==> (0 0)
4) Definir una funcin lista-simb que reciba una lista como argumento y devuelva la
lista de los smbolos de la lista de entrada. Por ejemplo: (investiga y utiliza la
funcin "even")
a) (lista-simb '(1 iacs hse ccia 2)) ==> (iacs hse ccia)
b) (lista-simb '(cordoba 2 beti 1)) ==> (cordoba beti)
c) (lista-simb '(1 2 3)) ==> ()
5) Define un procedimiento llamado quita-ultimo-profundo que recibe una lista como
argumento y devuelve la lista obtenida quitando el ltimo elemento, cualquiera que
sea su nivel. Por ejemplo:
a) (quita-ultimo-profundo '(a (b c) (d (e (f))))) ==> (a (b c) (d (e ())))
b) (quita-ultimo-profundo '()) ==> ()
c) (quita-ultimo-profundo '(a (((b))) (()))) ==> '(a (((b))) ())
d) (quita-ultimo-profundo '((((b))))) ==> (((())))
6) Define un procedimiento acumula-profundo que recibe como entrada una lista y
devuelve la suma de sus elementos que sean nmeros, sea cual sea su nivel. Por
ejemplo:
a) (acumula-profundo '(1 (4 (a #t () (3 b)) 5 juan) (((a))) ((3)))) ==> 16
b) (acumula-profundo '(a (b c ()) d)) ==> 0
c) (acumula-profundo '()) ==> 0
d) (acumula-profundo '(1 (uno (2 (dos (3 (tres (4 (cuatro))))))))) ==> 10
Pgina 6 de 54
Paradigmas de Programacin
Paradigmas de Programacin
Paradigmas de Programacin
Paradigmas de Programacin
(define neg-poly
(lambda (poly)
(let ((poly-neg-uno (haz-term 0 -1)))
(p* poly-neg-uno poly))))
;;; Resta de polinomios.
(define p(lambda (poly1 poly2)
(p+ poly1 (neg-poly poly2))))
;;; Valor de un polinomio (visto como funcin) en un nmero.
(define valor-poly
(lambda (poly num)
(letrec
((pvalor (lambda (p)
(let ((n (grado p)))
(if (zero? n)
(coef-lider p)
(let ((rest (rest-de-poly p)))
(if (< (grado rest) (- n 1))
(pvalor (poly-cons
(- n 1)
(* num (coef-lider p))
rest))
(pvalor (poly-cons
(- n 1)
(+ (* num (coef-lider p))
(coef-lider rest))
(rest-de-poly rest))))))))))
(pvalor poly))))
;;; II) CONSTRUCTORES Y SELECTORES (1a. forma).
;;; Representamos los polinomios por una lista en la que estn los
;;; coeficientes del polinomio, ordenados desde el coeficiente de la
;;; mxima potencia (coef-lider) al trmino independiente.
;;; Necesitamos (ver operaciones anteriores):
;;; * el polinomio cero
;;; * tener acceso al grado, al coef-lder y al resto del polinomio
;;; * construir un polinomio, a partir de su grado, su coef-lider, y
;;; el resto del polinomio (un pol. de grado menor).
;;; El polinomio cero.
(define el-zero-poly '(0))
;;; Grado de un polinomio.
(define grado
(lambda (poly)
(- (length poly) 1)))
;;; Coeficiente del monomio de mayor grado.
Pgina 10 de 54
Paradigmas de Programacin
(define coef-lider
(lambda (poly)
(car poly)))
;;; Polinomio obtenido quitando el monomio de mayor grado.
(define rest-de-poly
(lambda (poly)
(cond
((zero? (grado poly)) el-zero-poly)
((zero? (coef-lider (cdr poly)))
(rest-de-poly (cdr poly)))
(else (cdr poly)))))
;;; Polinomio obtenido aadiendo un termino de mayor grado (gra) con
;;; coeficiente (coef) al polinomio (poly)
(define poly-cons
(lambda (gra coef poly)
(let ((gra-p (grado poly)))
(cond
((and (zero? gra) (equal? poly el-zero-poly)) (list coef))
((< gra-p gra)
(if (zero? coef)
poly
(cons coef
(append (lista-de-ceros (- (- gra gra-p) 1))
poly))))
(else (error "poly-cons: Grado demasiado alto en:" poly))))))
;;; Lista de n ceros.
(define lista-de-ceros
(lambda (n)
(if (zero? n)
'()
(cons 0 (lista-de-ceros (- n 1))))))
Pgina 11 de 54
Paradigmas de Programacin
TRABAJO PRCTICO 6:
1) Evala las siguientes expresiones, razonando el resultado:
a) (map (lambda (x) (* x x)) '(1 2 3 4 5 6))
b) (map pair? '((a.b) (1 2 3) 1 2 3))
c) (let ((imprime (lambda (x) (display x) (newline) (string-length x))))
(for-each imprime '("Lista" "de" "strings")))
d) (let ((imprime (lambda (x) (display x) (newline) (string-length x))))
(map imprime '("Lista" "de" "strings")))
e) (define aplica-a-dos
(lambda (f) (f 2)))
f) (aplica-a-dos sqrt)
g) (aplica-a-dos (lambda (x) (* x x)))
h) (aplica-a-dos even?)
i) (map aplica-a-dos (list sin (lambda (x) (expt x 3)) odd?))
j) (define tonta
(lambda (f)
(lambda (x) (f x))))
a) ((tonta sqrt) 2)
b) (apply + '(1 2))
c) (apply (lambda (x y z) (list z y x)) '(a b c))
2) Definir una funcin que contenga "map", utilizarla y evaluar sus resultados
3) Definir una funcin que contenga "set!", utilizarla y evaluar sus resultados
4) Definir una funcin que contenga "set-car!", utilizarla y evaluar sus resultados
5) Definir una funcin que contenga "set-cdr!", utilizarla y evaluar sus resultados
6) Definir una funcin que contenga "putprop", utilizarla y evaluar sus resultados
7) Definir una funcin que contenga "getprop", utilizarla y evaluar sus resultados
8) Definir una funcin que contenga "member", utilizarla y evaluar sus resultados
9) Definir una funcin que contenga "list-ref", utilizarla y evaluar sus resultados
10) Evala las siguientes expresiones, razonando el resultado:
a) (define v1 (vector 1 45 67 8))
b) (define v2 (make-vector 5 'hola))
c) (vector-ref v1 0)
d) (vector-ref v1 2)
e) (vector-set! v2 4 'adis)
f) (vector-ref v2 4)
11) Observa cual es el valor de x despus de evaluar cada expresin:
a) (define x 100)
b) (set! x 200)
Pgina 12 de 54
Paradigmas de Programacin
c) (set! x (+ x 3))
d) (define lista-vect1
(let ((v (make-vector 3 0)))
(list v v)))
e) (vector-set! (car lista-vect1) 1 45)
lista-vect1
f) (define lista-vect2
(list (make-vector 3 0) (make-vector 3 0)))
(vector-set! (car lista-vect2) 1 45)
lista-vect2
12) Define un procedimiento producto-escalar que tome como entrada dos vectores
numricos y devuelva el producto escalar de ambos, si son de la misma dimensin, y
un mensaje de error en caso contrario.
(producto-escalar #(1 3 2) #(3 5 7)) ==> 32
(producto-escalar #(1 3 2) #(3 5))
==> ERROR: producto-escalar: dimensiones errneas
13) Define un procedimiento vector-sust de tres argumentos de modo que (vector-sust x
y v) devuelve como valor un vector igual que v, salvo en aquellas componentes
iguales a x, que habrn sido sustituidas por y.
(vector-sust 2 'dos #(c 2 45 8 2 #t)) ==> #(c dos 45 8 dos #t)
(vector-sust 'par 'impar #(3 par "oh" par 8)) ==> #(3 impar "oh" impar 8)
(vector-sust 'par 'impar #(1 3 4 5 6)) ==> #(1 3 4 5 6)
(vector-sust 'par 'impar #()) ==> #()
14) Define un procedimiento filtra-vector que tome como entrada un predicado, p, y
evuelva como valor un procedimiento que reciba como entrada un vector, v, y
devuelva como valor un vector formado por los elementos de v que verifican p.
((filtra-vector even?) #(2 3 6 8 9)) ==> #(2 6 8)
((filtra-vector symbol?) #(a b 3 "hola" #t 6 fin)) ==> #(a b fin)
((filtra-vector symbol?) #(1 2 3)) ==> #()
Pgina 13 de 54
Paradigmas de Programacin
TRABAJO PRCTICO 7:
1) Definir un grafo que contenga la siguiente estructura:
a) (define Grafo1 '((A1 () ) (A2 () ) (A3 (A1 A2) ) (A4 (A2 A3) ) ) )
comprueba su comportamiento y analiza si puedes transformar lo definido en un grafo
dirigido
2) Definir los siguientes grafos dirigidos con la siguiente estructura (hijo (padres) )
a) m1 -- m3
m2 -- m3
m2 -- m4
m3 -- m4
b) m1 -- m2
m2 -- m3
m2 -- m4
m3 -- m5
m3 -- m6
m4 -- m5
m5 -- m6
c) m1 -- m2
m2 -- m3
m2 -- m4
m3 -- m5
m4 -- m3
m4 -- m5
m5 -- m6
3) Definir una funcin que muestre un hijo a partir de su posicin
4) Definir una funcin que muestre un padre a partir de su posicin
5) Definir una funcin que muestre todos los hijos y a todos los padres
6) Armar una lista con todos los hijos de un grafo
7) Armar una lista con todos los padres de un grafo
8) Borrar un nodo determinado de un grafo
9) Agregar un nodo al comienzo y al final del grafo
10) Un rbol binario numrico (ABN de aqu en adelante) es una estructura de datos
recursiva que consta de un nmero entero no negativo (llamado raz del rbol) y de
dos ABN llamados hijo izquierdo e hijo derecho. Existe un ABN muy particular que
no tiene raz ni hijos que llamaremos el rbol vaco. En nuestra implementacin,
usaremos la siguiente representacin de los ABN:
- El rbol vaco lo representaremos por la lista vaca ().
Pgina 14 de 54
Paradigmas de Programacin
Paradigmas de Programacin
Pgina 16 de 54
Paradigmas de Programacin
Pgina 17 de 54
Paradigmas de Programacin
PARADIGMA ORIENTADO A
OBJETOS
TRABAJO PRCTICO 1:
1) En la figura siguiente Mueble es una clase. Mesa y Sillas son subclases (hijos) y as
sucesivamente. Como representara la jerarqua por medio de textos sangrados.
Mueble
Mesa
Silla
Silla-1
Mesa-2
Mesa-1
Paradigmas de Programacin
6) Entre dos objetos puede existir todo tipo de relaciones semnticas, que dependen de
la aplicacin concreta en la que participan dichos objetos. Veamos un ejemplo:
Supongamos que vamos a construir un diccionario on-line, un diccionario
informatizado que permita al usuario obtener sobre la pantalla la definicin de una
palabra cualquiera. Supongamos que, en dicho diccionario, las palabras sn objetos
Paradigmas de Programacin
Paradigmas de Programacin
Pgina 21 de 54
Paradigmas de Programacin
TRABAJO PRCTICO 2:
1)
Con un editor de texto cualquiera editar un
fichero llamado: HolaMundo.java
// La clase HolaMundo simplemente muestra
// el mensaje Hola mundo por pantalla
class HolaMundo {
public static void main (String[] args) {
System.out.println(Hola mundo!);
}
}
Compilacin
C:\> dir
HolaMundo.java
C:\> javac HolaMundo.java
C:\> dir
HolaMundo.class
HolaMundo.java
Ejecucin
C:\> dir
HolaMundo.class
HolaMundo.java
C:\> java HolaMundo
Hola mundo!
2)
Ejemplo
public MiClase
{
int i;
public MiClase()
{ i = 10; }
public void sumaAi( int j
{ i = i + j; }
}
Pgina 22 de 54
Paradigmas de Programacin
3)
AWT - Ejemplos
Pgina 23 de 54
Paradigmas de Programacin
4)
Ejemplo (Promedio.java)
class Promedio
{
public static void main(String[] args)
{ int i = 11, j = 20;
double a = (i + j) / 2.0;
System.out.println(El valor de i es: + i + y el de j es: + j);
Pgina 24 de 54
Paradigmas de Programacin
5)
Control de Flujo (Bucles)
Public class Bucles
{
public static void main(String[] args)
{
int cont1 = 0;
while(cont1 <3)
{
System.out.println(cont1);
Cont1++;
}
int cont2 = 0;
do
{
System.out.println(cont2);
Cont2++;
}
while(cont2 < 2);
for(int cont3 = 0; cont3 < 3; cont3++)
{
System.out.println(cont3);
}
}
}
6)
Desarrollar un programa que muestre por pantalla los nmeros primos del 1 al
1000 y todos los aos bisiestos entre el ao 2000 y el ao 3000.
Public class Practica
{
public static void main(String[] args)
{
//Mostrar los nmeros primos del 1 al 1000.
bolean sw;
int contador = 0;
System.out.println(Los nmeros primos del 1 al 1000 son:);
for(int i=1; i<1001; i++)
{
sw = true;
for(int j=i; j>0; j--)
{
Pgina 25 de 54
Paradigmas de Programacin
Pgina 26 de 54
Paradigmas de Programacin
TRABAJO PRCTICO 3:
HERENCIA
1)
Ejemplo Figuras geomtricas
Clase Abstracta
(No posee objetos ni
contructor)
Figura
area (): double
perimetro (): double
Rectangulo
Constructor
ancho: double
alto: double
Rectangulo (double anchura,
double altura)
area (): double
perimetro (): double
getAncho (): double
getAlto (): double
Mtodo que
devuelve el valor del
Atributo ancho
Relacin de Herencia
Elipse
semiMayor: double
Atributos/Variables semiMenor: double
de la clase
Elipse (double a, double
b)
Mtodos/Funciones area (): double
u Operaciones de la perimetro (): double
clase
getMayor (): double
getMenor (): double
Cuadrado
Circulo
// fichero Figura.java
/** Orientacin a objetos */
public abstract class Figura {
public abstract double area ();
public abstract double perimetro ();
}
// fichero Rectangulo.java
/** Orientacin a objetos */
public class Rectangulo extends Figura {
// Variables de la clase
private double ancho;
private double alto;
// Mtodos de la clase
// Mtodo constructor
public Rectangulo (double anchura, double altura) {
ancho = anchura;
alto = altura;
Pgina 27 de 54
Paradigmas de Programacin
}
public double area () {
return alto*ancho;
}
public double perimetro () {
return 2*(alto+alto);
}
public double getAncho () {
return ancho;
}
public double getAlto () {
return alto;
}
}
// fichero Cuadrado.java
/** Orientacin a objetos */
public class Cuadrado extends Rectangulo {
// Mtodos de la clase
// Mtodo constructor
public Cuadrado (double lado) {
ancho = lado; // equivalente a: super (lado, lado);
alto = lado;
}
// Mtodo que retorna el valor del Atributo o miembro ancho
public double getLado () {
return ancho;
}
}
// fichero Elipse.java
/** Orientacin a objetos */
public class Elipse extends Figura {
// Variables de la clase
protected double semiMayor;
protected double semiMenor;
// Mtodos de la clase
// Mtodo constructor
public Elipse (double a, double b) {
if (a >= b) {
semiMayor = a;
Pgina 28 de 54
Paradigmas de Programacin
semiMenor = b;
} else {
semiMayor = b;
semiMenor = a;
}
}
public double area () {
return Math.PI*semiMayor*semiMenor;
}
public double perimetro () {
return Math.PI*(semiMayor+semiMenor);
}
public double getMayor () {
return semiMayor;
}
public double getMenor () {
return semiMenor;
}
}
// fichero Circulo.java
/** Orientacin a objetos */
public class Circulo extends Elipse {
// Mtodos de la clase
// Mtodo constructor
public Circulo (double radio) {
super (radio, radio);
}
public double getRadio () {
return semiMayor;
}
}
Paradigmas de Programacin
2)
Ejemplo Animales
Clase 1
Animal
miVelocidad: int
miNombre: String
Animal(int vel, String nom)
saluda (): void
class Animal {
int miVelocidad;
String miNombre;
public Animal (int vel, String nom) {
miNombre= nom;
miVelocidad= vel;
};
public void saluda () {
System.out.println("Hola, soy "+miNombre);
}
}
class OOP1 {
public static void main (String arg []) {
Animal
laLiebre;
Animal
laTortuga;
laLiebre= new Animal (5,"L");
laLiebre.saluda();
laTortuga= new Animal (1,"T");
laTortuga.saluda();
}
}
Pgina 30 de 54
Paradigmas de Programacin
Clase 2
Animal
miVelocidad: int
miNombre: String
Animales: static int
Animal(int velocidad, String
nombre)
saluda (): void
cuantosAnimales(): void
class Animal {
int
miVelocidad;
String miNombre;
static int animales=0;
public Animal (int velocidad, String nombre) {
animales++;
miNombre= nombre;
miVelocidad= velocidad;
}
public void saluda () {
System.out.println ("Hola, soy "+miNombre);
}
public static void cuantosAnimales () {
System.out.println ("Hay "+animales+" animales");
}
}
class OOP2_static {
public static void main (String arg []) {
Animal
laLiebre;
Animal
laTortuga;
laLiebre= new Animal (5,"L");
Animal.cuantosAnimales();
laLiebre.saluda();
laTortuga= new Animal (1,"T");
Animal.cuantosAnimales();
laTortuga.saluda();
}
}
Pgina 31 de 54
Paradigmas de Programacin
Clase 3
Animal
miVelocidad: int
miNombre: String
Animal(int velocidad, String
nombre)
saluda (): void
Acuatico
marino: boolean
Acuatico(int vel, String nom, boolean mar)
saluda (): void
class Animal {
int miVelocidad;
String miNombre;
public Animal (int velocidad, String nombre) {
miNombre= nombre;
miVelocidad= velocidad;
};
public void saluda () {
System.out.println ("Hola, soy "+miNombre);
}
}
class Acuatico extends Animal {
boolean marino;
public Acuatico (int vel, String nom, boolean mar){
super(vel, nom);
marino=mar;
// los animales Acuaticos llevan prefijo "A_"
miNombre="A_"+miNombre;
}
public void saluda() {
super.saluda();
System.out.println("y soy acutico.");
}
Pgina 32 de 54
Paradigmas de Programacin
}
class OOP3_subclases {
public static void main (String arg []) {
Animal
laLiebre;
Acuatico laTortuga1;
Animal
laTortuga2;
laLiebre= new Animal (5,"L");
laLiebre.saluda();
laTortuga1= new Acuatico (1,"T1",true);
laTortuga2= new Animal (1,"T2");
laTortuga1.saluda();
laTortuga2.saluda();
}
}
Clase 4
Animal
miVelocidad: int
miNombre: String
Animal(int velocidad, String
nombre)
saluda (): void
corre (long distancia): void
Tortuga
deTierra: boolean
Tortuga(int velocidad, String nombre,
boolean tierra)
saluda (): void
class Animal {
int miVelocidad;
String miNombre;
public Animal (int velocidad, String nombre) {
miNombre= nombre;
miVelocidad= velocidad;
Pgina 33 de 54
Paradigmas de Programacin
}
public void saluda () {
System.out.println("\nHola, soy "+miNombre+" y mi velocidad es
"+miVelocidad);
}
public void corre (long distancia) {
for (long i=0; i<distancia;i++){
for (long j=0; j<100000000; j+=miVelocidad){;}
System.out.print (" "+miNombre);
}
System.out.println ("\n"+miNombre+" ha llegado !!!");
}
}
class OOP4_corre {
public static void main (String arg []) {
Animal
laLiebre;
Tortuga laTortuga1;
Animal
laTortuga2;
laLiebre= new Animal (5,"L");
laLiebre.saluda();
laTortuga1= new Tortuga (1,"T1",false);
laTortuga2= new Tortuga (1,"T2",true);
Pgina 34 de 54
Paradigmas de Programacin
laTortuga1.saluda();
laTortuga2.saluda();
System.out.println("\nComienza la carrera:\n");
laLiebre.corre(10);
laTortuga1.corre(10);
laTortuga2.corre(10);
}
}
3)
Ejemplo Turno de mdico
Turno
int numeroOrden
String fecha
String hora
int dniPaciente
int matriculaMedico
String estado
int: getNumeroOrden()
String: getFecha()
String: getHora()
int: getDniPaciente()
String: getMatriculaMedico()
String: getEstado()
void: actualizarEstadoTurno(String
nuevoEstado)
Medico
int matricula
String nombre
String especialidad
int: getMatricula()
String: getNombre()
String: getEspecialidad()
Paciente
int dni
String nombre
String direccion
String telefono
int: getDni()
String: getNombre()
String: getDireccion()
String: getTelefono()
1- Segn el diagrama UML anterior, definir las clases Paciente, Medico y Turno.
2- Crear una clase llamada ReservaTurnos que:
a) Instancie dos pacientes,
b) Instancie dos medicos;
c) Instancie un turno para el paciente 1 del medico 2 a las 16 hrs,
d) Instancie un turno para el paciente 2 del medico 1 a las 18 hrs,
e) Suspenda el turno anterior, colocando su estado en Desocupado.
Nota: se deber mostrar los datos principales de los objetos a medida que sean creados,
ejemplo: El paciente Maria reservo el turno el dia 05/11/2003 a las 16:00 hrs. para el
Dr. Pirulo.
Pgina 35 de 54
Paradigmas de Programacin
4)
Ejemplo Reserva de un video club
Socio
Pelicula
int dni
String nombre
String direccion
String telefono
String codigo
String nombre
String estado
String categoria
int: getDni()
String: getNombre()
String: getDireccion()
String: getTelefono()
String: getCodigo()
String: getNombre()
String: getEstado()
void: actualizarEstadoPelicula(String
nuevoestado)
Reserva
int numero
String fecha
int dniSocio
String codigo
int: getNumero()
String: getFecha()
int: getDniSocio()
String: getCodigo()
Cd
String codigo
String nombre
String estado
String tipo
String: getCodigo()
String: getNombre()
String: getEstado()
void: actualizarEstadoCd(String
nuevoestado)
1- Segn el diagrama UML anterior, y teniendo en cuenta las clases reserva y socio
(ver que pueden haber sido creadas para otro ejemplo y se pueden utilizar) definir
las clases Pelcula y Cd.
2- Crear una clase llamada Biblioteca que:
f) Instacie dos socios,
g) Instancie una pelcula cuyo estado sea No Disponible,
h) Actualice el estado de la pelcula anterior a Disponible,
i) Instancie un CD cuyo estado sea No Disponible,
j) Actualice el estado del CD anterior a Disponible,
k) Instancie una reserva para el socio 1 de la pelcula del apartado b),
l) Instancie una reserva para el socio 2 del CD del apartado d),
Nota: se deber mostrar los datos principales de los objetos a medida que sean creados.
5)
Ejemplo Cuentas de Banco y operaciones bancarias
Desarrollar una clase llamada CuentaCorriente que:
Tenga dos atributos private de tipo Titular (Nombre String, Apellidos String
y Edad - int), de tipo String (el nmero de la cuenta) y el tipo double (el saldo).
Pgina 36 de 54
Paradigmas de Programacin
Titular
nombre: String
apellido: String
edad: int
Titular(String, String, int)
toString(): String
CuentaAhorro
interes: double
CuentaAhorro(Titular, String, double,
double)
CuentaAhorro(Titular, String, double)
CuentaAhorro(Titular, String)
getInteres(): double
l l
()
6)
Sistema de garaje
Pgina 37 de 54
Paradigmas de Programacin
7)
Taller mecnico
Desarrollar un sistema de gestin de partes de un taller mecnico.
La informacin de las partes es: cdigo, descripcin e importe. Una parte ir
asociada a la matrcula de un coche de manera que podamos aadir, mostrar y
eliminar una parte a partir de la matrcula de coche al que est asociado.
El mtodo main mostrar por pantalla un men de opciones:
1- Crear
2- Listas
3- Mostrar
4- Eliminar partes.
5- Salir
Se usar una clase que nos permita obtener las entradas por teclado.
Pgina 38 de 54
Paradigmas de Programacin
8)
EJEMPLO: CLASES
El ejercicio consiste en que se empieza una ficticia guerra entre dos naves, una de
marcianos y otra de terrcolas, cada uno de los cuales va disparando, generando
nmeros aleatorios, y si acierta con el nmero asignado a algn componente de la otra
nave lo mata. Ganar aquella tripulacin en que queden guerreros vivos.
SerVivo
Guerrero
Marciano
Terricola
Marciano(String soy)
recibeDisparo(int i)
getTotal( ): static int
Terricola(String soy)
recibeDisparo(int i)
getTotal( ): static int
Nave
Guerra
tripulacion: Guerrero[ ]
somos: String
Nave(String somos)
recibeDisparo(int i)
generaDisparo(int i): int
cuantosQuedan( ): int
Guerra( )
empiezaGuerra( )
main(String[ ] args)
Pgina 39 de 54
Paradigmas de Programacin
PARADIGMA LGICO
TRABAJO PRCTICO 1:
1) Evala las siguientes expresiones y clasifcalas en tomos, variables, smbolos
predicativos negados y no negados y conectivos:
a) raquel
b) 3200
c)
d) a, b, c,
e) A, B, C,
f) come (jos, pan)
g)
h) san francisco
i) ,
j) ~juega(carlos, ftbol)
2) Para el clculo de predicados deben considerarse equivalencias consideradas
bsicas, deber determinarlas:
Expresin
Equivalencias
~(~X1)
X1 X2
~(X1 X2)
~(X1 X2)
X1 X2
X1 X2
X1 (X2 X3)
X1 (X2 X3)
X1 (X2 X3)
X1 (X2 X3)
X1 X2
3) Dados los siguientes predicados:
padre (X, Y)
X es el padre de Y
madre (X, Y)
X en la madre de Y
femenino (X)
X es femenino
masculino (X)
X es masculino
Defina las relaciones para:
a) hermanos
b) hermanas
c) nieto
d) primo
e) descendiente
4) A partir de los siguientes predicados:
padre (padre, hijo)
Pgina 40 de 54
Paradigmas de Programacin
Pgina 41 de 54
Paradigmas de Programacin
TRABAJO PRCTICO 2:
1) Considerando los siguientes predicados:
Persona (nombre, edad, sexo)
Mayor_edad (nombre, nombre)
Y sabiendo que:
Juan tiene 20 aos
Pedro tiene 30 aos
Luis tiene 28 aos
Ana tiene 10 aos
Alejandra tiene 43 aos
Jorge tiene 60 aos
... ingresar 10 ms
a) escribir un programa que permita identificar a las personas mayores de edad,
identificndolas como hombres y mujeres (recordar la mayora a los 21 aos)
b) escribir un programa que permita identificar a las personas de mayor edad en
cada uno de los sexos.
2) A partir de los siguientes predicados:
Persona (nombre, sexo)
Amistad (nombre, nombre)
Sospechoso (nombre)
Y considerando:
Brbara es amiga de Juan
Brbara es amiga de Roberto
Brbara es amiga de Mara
Susana es amiga de Juan
Susana es amiga de Pedro
Se debe escribir un programa en turbo prolog que permita individualizar a los
sospechosos del asesinato de susana. Para ello debemos considerar como sospechoso a:
Los hombres que tuvieron amistad con Susana
Las mujeres que tuvieron relacin con hombres que Susana conoca
Los amigos de mujeres que tuvieron relacin con hombres que Susana conoca.
3) Dado la siguiente situacin, un jurado debe determinar el orden de llegada de los
corredores de una carrera, pero por una extraa razn los corredores manifiestan lo
siguiente:
Antonio: Yo no he llegado ltimo
Bernardo: Carlos ha llegado tercero
Carlos: Antonio ha llegado inmediatamente despus de Ernesto
Daniel: Ernesto ha llegado en segundo lugar
Ernesto: Daniel no gan la carrera
Carlos: Lleg despus de Antonio
Se logrado determinar que los dos primeros mienten y los otros no. Podremos ayudar
al jurado a determinar el orden de llegada de los corredores?.
4) En base a las siguientes afirmaciones:
Todo hongo es una seta o un champignon.
Pgina 42 de 54
Paradigmas de Programacin
Y
X
(este es un arco)
Ejercicios:
a)
d
a
b)
b
d
a
e
c
Pgina 43 de 54
Paradigmas de Programacin
TRABAJO PRCTICO 3:
1) Dado un mapa como el siguiente, en el cual se indican las ciudades, las distancias
entre ellas y cuantos kilmetros son de camino de tierra (la cantidad entre
parntesis). Se le solicita que construya un programa PROLOG, cuyo predicado
permita indicar de cuantos caminos alternativos se
A
5 (2)
3 (1)
2 (0)
B
6 (3)
6 (1)
E
10 (4)
1(0)
2 (2)
4 (1)
D
C
2 (2)
disponen para realizar el recorrido entre dos ciudades y cuales son sus distancias
indicando cuantos de stos kilmetros son de tierra para cada recorrido.
2) El objetivo del presente es poder llegar al tesoro de manera segura, para ello deber
definir la ruta desde la entrada al tesoro, sabiendo que los predicados pueden ser
definidos de la siguiente manera:
GALERIA(caverna,caverna)
VECINAS(caverna,caverna) (unidas por una galera)
PELIGRO(caverna) (Los peligros son las cavernas de: Alarma, Ladrones y Monstruos
RUTA(caverna,caverna)
Estos son solamente ejemplos, Ud. puede utilizar los mismos o bien definir unos
nuevos.
El formato aproximado del laberinto sera el siguiente:
CAVERNA
ALARMAS
LADRONES
ENTRADA
GALERA
GALERA
FUENTE
GALERA
COMIDA
GALERA
MONSTRUOS
TESORO
CAVERNA
Pgina 44 de 54
Paradigmas de Programacin
Pgina 45 de 54
Paradigmas de Programacin
Pgina 46 de 54
Paradigmas de Programacin
TUTORIAL DE TURBO-PROLOG
F U N C T I O N K E Y S
F1
F2
Pop-Up
Goto to Line
Help
F3
F4
Search
Replace
F5
F6
Copy
Move Text
Copy Again
F7
F8
F9
F10
SPECIAL COMBINATIONS
Ctrl V Insert/Overwrite
Del Delete
Ins Insert/Overwrite
DELETE
COMMAND
KEY
mode on/off
Ctrl-V
line
Ctrl-N
line
Ctrl-Y
to end of line
Ctrl-Q-Y
right word
Ctrl-T
-
-
End
- Home
Ctrl - End
- PgUp
- PgDn
Ins
Pgina 47 de 54
Paradigmas de Programacin
Ctrl-G
Ctrl-H
COMMAND
KEY
Ctrl-K-B
Ctrl-K-K
F8
Ctrl-K-H
Ctrl-K-C
Ctrl-K-V
Ctrl-K-Y
Ctrl-K-R
Ctrl-K-W
Ctrl-K-P
Del
F7
MISC. COMMANDS
COMMAND
KEY
Tab
Ctrl-I
Repeat last find/replace
Ctrl-L
Find
Ctrl-Q-F
Find & replace
Ctrl-Q-A
Auto tab on/off
Ctrl-Q-I
C O L O R S
BACKGROUND-COLORS (Screen)
FOREGROUND-COLORS (Characters)
------------------------+---------+----------------+-----------Black
0
Black
0
Blue
16
Blue
1
Green
32
Green
2
Cyan
48
Cyan
3
Red
64
Red
4
Magenta
80
Magenta
5
Brown
96
Brown
6
White
112
White
7
Grey
8
Light Blue
24
Light Green
40
Light Red
72
Light Magenta
88
Yellow
104
White (High Intensity) 120
STANDARD PREDICATES
Pgina 48 de 54
Paradigmas de Programacin
INPUT
=====
file_str(DosFileName,StringVariable)
File <---> String
(string,string) -- (inp,outp) (inp,inp)
inkey(CharVariable)
(Char) -- (outp)
keypressed
readchar(CharVariable)
(char) -- (outp)
readint(IntgVariable)
(integer) -- (outp)
readln(StringVariable)
(string) -- (outp)
readreal(RealVariable)
(real) -- (outp)
FILESYSTEM
==========
closefile(SymbolicFileName)
(file) -- (inp)
deletefile(DosFileName)
(string) -- (inp)
disk(DosPath)
(string) -- (inp) (outp)
eof(SymbolicFileName)
(file) -- (inp)
existfile(DosFileName)
(string) -- (inp)
filemode(SymbolicFileName,TextOrBinaryMode)
(file,integer) -- (inp,inp)
filepos(SymbolicFileName,FilePosition,Mode)
(file,real,integer) -- (inp,inp,inp) (inp,outp,inp)
Mode specifies: 0:Start 1:Relative 2:End
(When using mode 2, negative filepositions points inside the
file)
flush(SymbolicFileName)
(file) -- (inp)
openappend(SymbolicFileName,DosFileName)
(file,string) -- (inp,inp)
openmodify(SymbolicFileName,DosFileName)
(file,string) -- (inp,inp)
openread(SymbolicFileName,DosFileName)
(file,string) -- (inp,inp)
Pgina 49 de 54
Paradigmas de Programacin
openwrite(SymbolicFileName,DosFileName)
(file,string) -- (inp,inp)
readdevice(SymbolicFileName)
(file) -- (inp) (outp)
renamefile(OldDosFileName,NewDosFileName)
(string,string) -- (inp,inp)
writedevice(SymbolicFileName)
(file) -- (inp) (outp)
SCREEN HANDLING
===============
attribute(Attr)
(integer) -- (inp) (outp)
cursor(Row,Column)
(integer,integer) -- (inp,inp) (outp,outp)
cursorform(Startline,Endline) 0<Startline<14, 0<Endline<14
(integer,integer) -- (inp,inp)
field_str(Row,Column,Length,String)
(integer,integer,integer,string) -- (inp,inp,inp,inp)
(inp,inp,inp,outp)
field_attr(Row,Column,Length,Attr)
(integer,integer,integer,integer)
-- (inp,inp,inp,inp) (inp,inp,inp,outp)
scr_char(Row,Column,Char)
(integer,integer,char) -- (inp,inp,inp) (inp,inp,outp)
scr_attr(Row,Column,Attr)
(integer,integer,integer) -- (inp,inp,inp) (inp,inp,outp)
WINDOW SYSTEM
=============
clearwindow()
gotowindow(WindowNo)
(integer) -- (inp)
makewindow(WindowNo,ScrAtt,FrameAtt,Framestr,Row,Column,Height,Width)
(integer,integer,integer,string,integer,integer,integer,integer)
-- (inp,inp,inp,inp,inp,inp,inp,inp)
(outp,outp,outp,outp,outp,outp,outp,outp)
removewindow()
scroll(RowsToScroll,ColsToScroll)
(integer,integer) -- (inp,inp)
shiftwindow(WindowNo)
(integer) -- (inp) (outp)
window_str(ScreenString)
(string) -- (inp) (outp)
Pgina 50 de 54
Paradigmas de Programacin
window_attr(Attr)
(integer) -- (inp)
STRING HANDLING
===============
concat(String1,String2,String3) String3 = String1 + String2
(string,string,string) -- (inp,inp,outp) (inp,outp,inp)
(outp,inp,inp) (inp,inp,inp)
frontchar(String,FrontChar,RestString)
(string,char,string) -- (inp,outp,outp) (inp,inp,outp)
(inp,outp,inp) (inp,inp,inp) (outp,inp,inp)
frontstr(Lenght,Inpstring,StartString,RestString)
(integer,string,string,string) -- (inp,inp,outp,outp)
fronttoken(String,Token,RestString)
(string,string,string) -- (inp,outp,outp) (inp,inp,outp)
(inp,outp,inp) (inp,inp,inp) (outp,inp,inp)
isname(StringParam)
(string) -- (inp)
str_len(String,Length)
(string,integer) -- (inp,inp) (inp,outp)
CONVERSIONS
===========
char_int(CharParam,IntgParam)
(char,integer) -- (inp,outp) (outp,inp) (inp,inp)
str_int(StringParam,IntgParam)
(string,integer) -- (inp,outp) (outp,inp) (inp,inp)
str_char(StringParam,CharParam)
(string,char) -- (inp,outp) (outp,inp) (inp,inp)
str_real(StringParam,RealParam)
(string,real) -- (inp,outp) (outp,inp) (inp,inp)
upper_lower(StringInUpperCase,StringInLowerCase)
(string,string) -- (inp,inp) (inp,outp) (outp,inp)
GRAPHICS
========
dot(Row,Column,Colour)
(integer,integer,integer) -- (inp,inp,inp) (inp,inp,outp)
graphics(ModeParam,Palette,Background)
(integer,integer,integer) -- (inp,inp,inp)
line(Row1,Col1,Row2,Col2,Colour)
(integer,integer,integer,integer,integer)
-- (inp,inp,inp,inp,inp)
text()
Pgina 51 de 54
Paradigmas de Programacin
TURTLE GRAPHICS
===============
back(Step)
(integer) -- (inp)
forward(Step)
(integer) -- (inp)
left(Angle)
(integer) -- (inp)
pencolor(Color)
(integer) -- (inp)
pendown
penpos(RowCoordinate,ColumnCoordinate,Angle)
(Integer,Integer,Integer) -- (inp,inp,inp) (outp,outp,outp)
penup
right(Angle)
(integer) -- (inp)
MISCELLANEOUS
=============
beep A short sound
bios(Interruptno,reg(AXi,BXi,CXi,DXi,SIi,DIi,DSi,ESi),
reg(AXo,BXo,CXo,DXo,SIo,DIo,DSo,ESo))
Activate a system interrupt
(integer,REG,REG) -- (inp,inp,outp) (inp,inp,reg(outp,outp ... )
bitand(X,Y,Z) : Z=X and Y
(integer,integer,integer) -- (inp,inp,outp)
bitleft(X,Y,Z) : Z=X shiftet Y places to the left
(integer,integer,integer) -- (inp,inp,outp)
bitnot(X,Y) : Y= not X
(integer,integer) -- (inp,outp)
bitor(X,Y,Z) : Z=X or Y
(integer,integer,integer) -- (inp,inp,outp)
bitright(X,Y,Z) : Z=X shiftet Y places to the left
(integer,integer,integer) -- (inp,inp,outp)
bitxor(X,Y,Z) : Z=X exor Y
(integer,integer,integer) -- (inp,inp,outp)
comline(LineBuffer)
(String) -- (inp)
consult(DosFileName) Load a database from file
(string) -- (inp)
date(Year,Month,Day)
Pgina 52 de 54
Paradigmas de Programacin
fail
membyte(Segment,Offset,Byte)
(integer,integer,integer) -- (inp,inp,inp)
(inp,inp,outp)
memword(Segment,Offset,Word)
(integer,integer,integer) -- (inp,inp,inp)
(inp,inp,outp)
nl
New line
port_byte(PortNo,Value)
(integer,integer) -- (inp,inp) (inp,outp)
ptr_dword(8086Ptr,Segment,Offset)
(string,integer,integer) -- (inp,otp,outp) (outp,inp,inp)
random(RealVariable)
(real) -- (outp)
save(DosFileName) Save the database on file
(string) -- (inp)
sound(Duration,Frequency)
(integer,integer) -- (inp,inp)
storage(StackSize,HeapSize,TrailSize)
(real,real,real) -- (outp,outp,outp)
system(DosCommandString)
(string) -- (inp)
time(Hours,Minutes,Seconds,Hundredths)
(integer,integer,integer,integer) -(outp,outp,outp,outp)
(inp,inp,inp,inp)
SPECIAL - PREDICATES
====================
asserta( Term )
assertz( Term )
bound( Variable )
findall( Variable, Atom, ListVariable )
Pgina 53 de 54
Paradigmas de Programacin
free( Variable )
not( Atom )
readterm( Domain, Variable )
retract( Term )
write( Variable|Constant * )
writef( FormatString, Variable|Constant * )
OPTIONS
trace
trace p1,p2,..
shorttrace
p11.4.9)
nowarnings
nobreak
check_determ
This directive instructs the compiler to give a
warning
about the presence of a nondeterministic clause.
In combination with this directive, the programmer has
the option to explicitly describe which state of
determinism any predicate is supposed to have - by
prefixing the predicate-declaration with either of the
two keywords: determ or nondeterm.
check_cmpio Check for use of compound flowpatterns.
diagnostics Print compiler diagnostics
config "ConfigFileName"
Configuration file loaded by EXE-module.
include "filename"
Include a PROLOG file during compilation.
Pgina 54 de 54