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); }