Examen 1

Anuncio
Sección: ___ Apellido:_____________________Nombre:__________________Firma:_______________
CC100-Computación I – EXAMEN – jueves 9 de julio de 2009 – Tpo total: 2 hrs
Pregunta 1 (Ponderación 2/3) CON apuntes – SIN Consultas – Contestar en esta hoja
Un Ring es una estructura circular sin datos repetidos en que cada dato está conectado con el anterior y con el
siguiente en la forma indicada en el siguiente ejemplo de un objeto A de clase Ring:
B
D
F
E
C
Al respecto, la siguiente tabla define los métodos disponibles en la clase Ring:
Ring A=new Ring();
inicializa A como un Ring vacío (sin datos)
A.first()
entrega primer dato del ring A (en el ejemplo “B”, o null si ring está vacío)
A.add(“C”);
agrega “C” al final del ring A (false si ya existe)
A.delete(“C”)
borra “C” del ring A (false si no existe)
A.next(“B”)
entrega dato siguiente a “B” (en el ejemplo “D”, o null si “B” no existiera)
A.prev(“B”)
entrega dato anterior a “B” (en el ejemplo “C”, o null si “B” no existiera)
a)(2.5 ptos) Use la clase Ring para escribir una función que entregue el lugar de un dato en un ring. Por
ejemplo, lugar(A,”F”) entrega 3, lugar(A,”B”) entrega 1, lugar(A,”A”) entrega 0 (no está).
static public int lugar(Ring x, String y){
b) (2.5 ptos) Escriba el método delete (de la clase Ring) suponiendo que la representación es un arreglo de
strings a y las variables enteras n y max. Ejemplo:
B
D
F
E
C
...
n: nº de datos en el arreglo a (ej: 5)
a[0] a[1] a[2] a[3] a[4] ... a[99] max: nº máximo de datos en el arreglo a (ej:100)
public boolean delete(String x){
c)(1p) Escriba add suponiendo que la representación es una lista de doble enlace circular de nodos de clase:
class N{public String val; public N ant, sig; public N(String x,N y, N z){val=x;ant=y;sig=z;}}. Ejemplo:
B
D
primero
ant val sig
ant val sig
public boolean add(String x){
...
E
ant val sig
C
ant val sig
Sección: ___ Apellido:_____________________Nombre:__________________Firma:_______________
CC100-Computación I – EXAMEN – jueves 9 de julio de 2009 – Tpo total: 2 hrs
Pregunta 2 (Ponderación 1/3) CON apuntes – SIN Consultas – Contestar en esta hoja
La elipse es el lugar geométrico de todos los puntos del plano tales que la suma de las distancias (d1 y d2) a 2
puntos fijos llamados focos es constante. La ecuación de la elipse de centro (h,k), distancia entre focos 2c y
distancia entre vértices 2a y 2b es: (x-h)2/a2 + (y-k)2/b2 = 1 en que a2=b2+c2
Y
k+b
d1
d2
k
Eje focal.
Focos en (h-c,k) y (h+c,k)
k-b
h-a
h-c
h
h+c
h+a
X
Nótese que la elipse es simétrica con respecto al eje focal (horizontal que une los focos)
a)(3 ptos) Escriba una función en Matlab (sin usar if, while ni for) que grafique la elipse y devuelva su
excentricidad (c/a) y la suma constante de las distancias a los focos. Para graficar la elipse se recomienda:
1º calcular los valores de y para n puntos del eje x en el rango h-a y h+a
2º graficar por separado, pero en el mismo gráfico, la parte superior y la parte inferior al eje focal
function [excentricidad sumadistancias]=elipse(h,k,a,b,n)
b)(3 ptos) Escriba una función en Java que calcule el área de la elipse por el método de los rectángulos.
static public double area(int h,int k,int a,int b,int n){ //n=nº de puntos
CC100-Computación I – EXAMEN – jueves 9 de julio de 2009 – Tpo total: 2 hrs
Pregunta 1 (Ponderación 2/3) CON apuntes – SIN Consultas – Contestar en esta hoja
a)(2.5 ptos)
static public int lugar(Ring x, String y){
//recuperar primer dato: 0.5
Sring s=x.first();
if(s==null) return 0;
//recorrer lugares: 0.5
for(int i=1; true; ++i){
//detectar y: 0.5
if(s.equals(y)) return i;
//obtener siguiente: 0.3
s=x.next(s);
//detectar vuelta completa: 0.7
if(s.equals(x.first()))
break;
}
return 0;
}
b) (2.5 ptos)
public boolean delete(String x){
//buscar índice de x: 1.2 pto
int i;
for(i=0; i<n; ++i)
if(a[i].equals(x)) break;
if(i==n) return false;
//eliminar x subiendo los siguientes: 1.0
for(int j=i; j<n-1; ++j)
a[j]=a[j+1];
//actualizar tamaño y devolver true: 0.3
--n;
return true;
}
c)(1p)
public boolean add(String x){
//crear nuevo nodo: 0.1
N r=new N(x,null,null);
//caso lista vacía: (sin puntaje o 0.1 de bonus)
if(primero==null){ primero=r.sig=r.ant=r; return true;}
//verificar si ya existe: 0.4
for(N p=primero; true; p=p.sgte){
if(p.val.equals(x)) return false;
if(p.sgte==primero) break;
}
//agregar nuevo nodo: 0.5 pto
r.sig=primero;
r.ant=primero.ant;
primero.ant.sig=r;
primero.ant=r;
return true;
}
CC100-Computación I – EXAMEN –Pregunta 2– jueves 9 de julio de 2009 – Tpo total: 2 hrs
La elipse es el lugar geométrico de todos los puntos del plano tales que la suma de las distancias (d1 y d2) a 2
puntos fijos llamados focos es constante. La ecuación de la elipse de centro (h,k), distancia entre focos 2c y
distancia entre vértices 2a y 2b es: (x-h)2/a2 + (y-k)2/b2 = 1 en que a2=b2+c2
Y
k+b
d1
d2
k
Eje focal.
Focos en (h-c,k) y (h+c,k)
k-b
h-a
h-c
h
h+c
h+a
X
Nótese que la elipse es simétrica con respecto al eje focal (horizontal que une los focos)
a)(3 ptos) Escriba una función en Matlab (sin usar if, while ni for) que grafique la elipse y devuelva su
excentricidad (c/a) y la suma constante de las distancias a los focos. Para graficar la elipse se recomienda:
1º calcular los valores de y para n puntos del eje x en el rango h-a y h+a
2º graficar por separado, pero en el mismo gráfico, la parte superior y la parte inferior al eje focal
function [excentricidad sumaDistancias]=elipse(h,k,a,b,n)
%calculo de vectores x e y: 1.0 ptos
x=linspace(h-a,h+a,n);
y=sqrt(1-(x-h)^2/a^2); %y=(1 –(x-h)^2/a^2)^0.5;
%grafico: 1 pto
hold on;
y1=k+b*y;
plot(x,y1);
y2=k-b*y;
plot(x,y2);
%grafico: alternativa (1 pto)
plot(x,k+b*y,'b—o’,x,k-b*y,'b—o’);
%resultados finales: 1.0
c=sqrt(a^2-b^2);
%c=(a^2-b^2)^0.5;
excentricidad=c/a;
sumadistancias=(a-c)+(a+c);%sumadistancias=2*a;
b)(3 ptos) Escriba una función en Java que calcule el área de la elipse por el método de los rectángulos.
static public double area(int h,int k,int a,int b,int n){ //n=nº de
puntos
//incializaciones: 0.5
double delta=2*a/n;
double a2=a*a;
double suma=0;
//recorrer x en rango h-a y h+a: 1 pto
for(double x=h-a; x<h+a; x+=delta){
//calcular y sumar eficientemente valor de la función: 1.0
double d=x-h;
double y=Math.sqrt(1-(d*d)/a2);
suma+=y;
}
//resultado: 0.5
return 2*(b*suma*delta);
}
Documentos relacionados
Descargar