ControlRecuperativo2008.doc
===========================
Sección: __
Apellido:___________________Nombre:_______________________Firma:____
____________




Pregunta 1 Control Recuperativo CC100 - jueves 29 de mayo de 2008 - Tiempo
total: 1:45

Con apuntes individuales - Sin consultas - Contestar en esta hoja (no use
el reverso)


El archivo "simce.txt" contiene los resultados del SIMCE 2007. Cada línea
del archivo contiene 43 caracteres: nombre del colegio (30 caracteres), el
tipo de colegio (1 caracter P, S o M por particular, subvencionado o
municipal) y los puntajes en lenguaje, matemáticas, ciencias sociales y
ciencias naturales (3 dígitos cada uno). Por ejemplo, una línea del archivo
es: Liceo Carmela Carvajal de PratM342355333356





Escriba un programa en Java que muestre el nombre y el tipo (P,S,M) de los
colegios que obtuvieron el primer y 2º lugar de acuerdo al promedio de los
4 puntajes. En caso que ninguno de los dos primeros sea un colegio
municipal, entonces escriba también el nombre del colegio municipal que
obtuvo el mejor promedio.













Sección: __
Apellido:___________________Nombre:_______________________Firma:____
____________

Pregunta 2 - Contestar en esta hoja (no use el reverso)


A) La clase Linea permite realizar las siguientes operaciones sobre líneas
en el cuadrante x=[0,100[ e y=[0,100[:
Linea L1=new Linea(a, (), L2=new Linea(b,?), L3=L1.suma(L2);
L3.graficar(G,Color.green); //dibuja L3 de color verde
Notas
. G es un objeto de la clase Graphics definido con 100x100 pixeles
. La sgte figura muestra G después de las instrucciones anteriores. Las
líneas punteadas se muestran a modo de explicación, pero no aparecen el
gráfico. Al respecto, x1=a*coseno((), x2=b*coseno(?), x3=x1+x2,
y1=b*seno(?), y2=a*seno((), y3=y1+y2. El largo de L3 se puede calcular
por Pitágoras y el ángulo de L3 como el arcotangente (Math.atan) de
y3/x3.

y3

y2

y1

x1 x2 x3
Escriba la clase Linea suponiendo que un objeto de la clase se representa
por el largo (entero en [0,100[), y el ángulo en grados sobre la horizontal
(real en [0,90[).

























B) Use la clase anterior para escribir sólo el método action performed de
un programa que muestra la ventana indicada a continuación. Al presionar
los botones se dibuja en el canvas respectivamente la línea 1 en rojo, la
línea 2 en azul y la suma en verde. Los valores del largo y ángulo de las
líneas 1 y 2 se obtienen de los TextFields largo1, angulo1, largo2 y
angulo2.
|nombre|Butto|Label|Label |
| |n | | |
|L3 |suma |largo|ángulo|
|L1 |línea|nº |nº |
| |1 | | |
|L2 |línea|nº |nº |
| |2 | | |
| | | | |
| | | | |
|canvas| | | |
| | | | |
|de | | | |
|100x10| | | |
|0 | | | |
|píxele| | | |
|s | | | |

ControlRecuperativo2009Pauta.doc
================================
Sección:__
Apellido:_______________________Nombre:__________________Firma:___________
CC1001-Computación I - Control Recuperativo: Pregunta 1 - lunes 25
de mayo de 2009 - Tpo total: 2 horas
Con apuntes individuales - Sin consultas - Contestar en esta hoja



A) (1 punto) Escriba una función recursiva que cuente el nº de veces que un
entero X divide exacta y sucesivamente a un entero Y. Por ejemplo:
cuenta(3,18) entrega 2, porque 18/3=6 y 6/3=2. Por otra parte,
cuenta(2,12)=2,cuenta(3,12)=1,cuenta(4,12)=1,cuenta(5,12)=0,cuenta(12,12)
=1,cuenta(1,12)=0,cuenta(0,12)=0.

//encabezamiento: 0.1

static public int cuenta(int X, int Y){//0.1
//caso base: 0.4
if(Xx) break;
//obtener potencia de primo: 0.5
int n=cuenta(p,x);
//agregar factor: 1.0
if(n!=0){
s += "*"+p;
if(n>1)
s += "^"+n;
}
}
//devolver resultado: 0.4
return s.substring(1);//borrar primer *
}
C)(2 puntos) Use la función anterior en un programa que grabe en el archivo
"numeros.txt" la descomposición en factores primos de todos los números no
primos entre 1 y 1000. La 1ª línea se grabará en la forma "4=2^2", la 2ª
"6=2*3" y la última "1000=2^3*5^3".

PrintWriter a=new PrintWriter(new FileWriter("numeros.txt"));//0.2
for(int i=4; i=0 //0.3
|| s.indexOf("^")>=0) //0.2
a.println(i+"="+s); //0.3
}
a.close(); //0.1



CC1001-Computación I - Control Recuperativo: Pregunta 2 - lunes 25
de mayo de 2009 - Tpo total: 2 horas

A)(1.5 ptos) Complete la sgte clase para un móvil que se mueve en dirección
Norte(1), Sur(2), Este(3) u Oeste(4) en un cuadriculado de 1000 unidades
horizontales y 1000 verticales (numeradas entre 0 y 999).
class Movil{
protected int H,V;//coordenadas horizontal y vertical de la ubicación del
móvil
public Movil(int X,int Y){//constructor: 0.7 ptos
if(X=1000 || Y=1000) //0.4
U.abortar("fuera de rango"); //0.1 o System.exit(0);
H=X; V=Y; //0.2
}public void mover(int dist,int dir){//0.8 pto
if(dir==1) //0.1
V-=dist; //0.1
if(dir==2) V+=dist; //0.2
if(dir==3) H+=dist; //0.2
if(dir==2) H-=dist; //0.2
}}
B)(1.5 ptos) Escriba una clase que extienda la anterior con un método para
mover el móvil en dist unidades en dirección dir (1,2,3 o 4), dibujando una
línea en el objeto gráfico G (de 1000x1000 pixeles):
public void mover(int dist,int dir,Graphics G)
//declaración y constructor: 0.5 ptos
class M extends Movil{ //0.1
public M(int X,int Y){ //0.2
super(X,Y); //0.2
}
public void mover(int dist,int dir,Graphics G){//1.0 ptos
int H0=H, V0=V; //0.2
mover(dist,dir); //0.4
G.drawLine(H0,V0,H,V);//0.4
}
}
C)(3 ptos) Use la clase anterior en un programa que controle un móvil que
se ubica inicialmente al centro de un Canvas de 1000x1000. Cada vez que se
presione un botón (N,S,E,O) debe mover el móvil dibujando una línea de 20
pixeles en la dirección indicada.
| | | |N | | | | |import java.awt.*; import java.awt.event.*; | | | | | |
| | | | |class Ventana extends Frame implements ActionListener{ | | | | | |
| | | | |static public void main(String[]args){new Ventana().show();} | |O
| | | | | | | |E |private Button | | | | | | | | | | | N=new Button("N"),
S=new Button("S"), | | | | | | | | | | | E=new Button("E"), O=new
Button("O"); | | | | | | | | | | |private Canvas cv=new Canvas(); | | | | |
|S | | | | | | |public Ventana(){//constructor: 1.5 ptos
cv.setSize(1000,1000); setSize(1050,1050); //0.3
setLayout(new BorderLayout()); //0.3

add("north",N);add("south",S);add("east",E);add("west",O);add("center",cv);/
/0.5
N.addActionListener(this); S.addActionListener(this);//0.2
E.addActionListener(this);O.addActionListener(this); //0.2
}
//declaración de objeto: 0.5 ptos
private M m=new M(500,500);//debe estar en un lugar en que se cree una sóla
vez
//método action performed: 1.0 ptos
public void actionPerformed(ActionEvent x){
Graphics g=cv.getGraphics(); //0.2
if(x.getSource()==N) //0.1
m.mover(20,1,g); //0.1
if(x.getSource()==S) m.mover(20,2,g); //0.2
if(x.getSource()==E) m.mover(20,3,g); //0.2
if(x.getSource()==O) m.mover(20,4,g); //0.2
}}

ControlRecuperativo2008Pauta.doc
================================
Sección: __
Apellido:___________________Nombre:_______________________Firma:____
____________




Pregunta 1 Control Recuperativo CC100 - jueves 29 de mayo de 2008 - Tiempo
total: 1:45

Con apuntes individuales - Sin consultas - Contestar en esta hoja (no use
el reverso)


El archivo "simce.txt" contiene los resultados del SIMCE 2007. Cada línea
del archivo contiene 43 caracteres: nombre del colegio (30 caracteres), el
tipo de colegio (1 caracter P, S o M por particular, subvencionado o
municipal) y los puntajes en lenguaje, matemáticas, ciencias sociales y
ciencias naturales (3 dígitos cada uno). Por ejemplo, una línea del archivo
es: Liceo Carmela Carvajal de PratM342355333356





Escriba un programa en Java que muestre el nombre y el tipo (P,S,M) de los
colegios que obtuvieron el primer y 2º lugar de acuerdo al promedio de los
4 puntajes. En caso que ninguno de los dos primeros sea un colegio
municipal, entonces escriba también el nombre del colegio municipal que
obtuvo el mejor promedio.



//inicializaciones globales: 0.5
double promedio1=0, promedio2=0, promedio3=0;
String colegio1=" ", colegio2="", colegio3="";
char tipo1=' ', tipo2=' ';
//leer hasta fin de archivo: 0.5
BufferedReader a=new BufferedReader(new FileReader("simce.txt"));
String linea;
while((linea=a.readLine())!=null){
//obtener nonbre y tipo de colegio: 0.5 ptos
String colegio=linea.substring(0,30);
char tipo=linea.charAt(30);
//calcular promedio de puntajes: 1.0
int suma=0;
for(int i=31; ipromedio1){
//mover primero a segundo lugar: 0.4
promedio2=promedio1;
colegio2=colegio1;
tipo2=tipo1;
//reemplazar primer lugar: 0.4
promedio1=promedio;
colegio1=colegio;
tipo1=tipo;
//verificar si es segundo: 0.5
}else if(promedio>promedio2){
//reemplazar segundo lugar: 0.4
promedio2=promedio;
colegio2=colegio;
tipo2=tipo;
}
//mantener primero municipal: 1 pto
if(tipo=='M' && promedio>promedio3){
promedio3=promedio;
colegio3=colegio;
}
}
//escribir resultados: 0.5
U.println("1º=" + colegio1);
U.println("2º=" + colegio2);
if(tipo1!='M' && tipo2!='M')
U.println("1ºmunicipal=" + colegio3);


Sección: __
Apellido:___________________Nombre:_______________________Firma:____
____________

Pregunta 2 - Contestar en esta hoja (no use el reverso)


A) La clase Linea permite realizar las siguientes operaciones sobre líneas
en el cuadrante x=[0,100[ e y=[0,100[:
Linea L1=new Linea(a, (), L2=new Linea(b,?), L3=L1.suma(L2);
L3.graficar(G,Color.green); //dibuja L3 de color verde
Notas
. G es un objeto de la clase Graphics definido con 100x100 pixeles
. La sgte figura muestra G después de las instrucciones anteriores. Las
líneas punteadas se muestran a modo de explicación, pero no aparecen el
gráfico. Al respecto, x1=a*coseno((), x2=b*coseno(?), x3=x1+x2,
y1=b*seno(?), y2=a*seno((), y3=y1+y2. El largo de L3 se puede calcular
por Pitágoras y el ángulo de L3 como el arcotangente (Math.atan) de
y3/x3.

y3

y2

y1

x1 x2 x3
Escriba la clase Linea suponiendo que un objeto de la clase se representa
por el largo (entero en [0,100[), y el ángulo en grados sobre la horizontal
(real en [0,90[).

//encabezamiento: 0.2
class Linea{
private int largo;
private double angulo;
//constructor: 0.3
public Linea(int x,double y){
largo=x; angulo=y;
}
//método graficar: 1.0
public void graficar(Graphics G,Color C){
double alfa=angulo*Math.PI/180;
int h=(int)(largo*Math.cos(alfa)+0.5);
int v=(int)(100-largo*Math.sin(alfa)+0.5);
G.setColor(C);
G.drawLine(0,100,h,v);
}
//método suma: 1.5
public Linea suma(Linea L){
double alfa=angulo*Math.PI/180;
double beta=L.angulo*Math.PI/180;
double x1=largo*Math.cos(alfa);
double x2=L.largo*Math.cos(beta);
double x3=x1+x2;
double y1=largo*Math.sin(alfa);
double y2=L.largo*Math.sin(beta);
double y3=y1+y2;
return new Linea(
(int)Math.sqrt(x3*x3+y3*y3),
Math.atan(y3/x3)*180/Math.PI);
}













B) Use la clase anterior para escribir sólo el método action performed de
un programa que muestra la ventana indicada a continuación. Al presionar
los botones se dibuja en el canvas respectivamente la línea 1 en rojo, la
línea 2 en azul y la suma en verde. Los valores del largo y ángulo de las
líneas 1 y 2 se obtienen de los TextFields largo1, angulo1, largo2 y
angulo2.
|nombre|Butto|Label|Label |
| |n | | |
|L3 |suma |largo|ángulo|
|L1 |línea|nº |nº |
| |1 | | |
|L2 |línea|nº |nº |
| |2 | | |
| | | | |
| | | | |
|canvas| | | |
| | | | |
|de | | | |
|100x10| | | |
|0 | | | |
|píxele| | | |
|s | | | |



//recuperar textfields y grafico: 0.6 ptos
Graphics G=canvas.getGraphics();
int l1=Integer.parseInt(largo1.getText());
int l2=Integer.parseInt(largo2.getText());
double a1=Double.parseDouble(angulo1.getText());
double a2=Double.parseDouble(angulo2.getText());
//boton L2: 0.7 ptos
Linea linea1;
if(x.getSource()==L1){
linea1=new Linea(l1,a1);
linea1.graficar(G,Color.red);
}
//boton L2: 0.7 ptos
Linea linea2;
if(x.getSource()==L2){
linea2=new Linea(l2,a2);
linea2.graficar(G,Color.blue);
}
//boton L3: 1.0 ptos
if(x.getSource()==L3){
linea1=new Linea(l1,a1);
linea2=new Linea(l2,a2);
Linea linea3=linea1.suma(linea2);
linea3.graficar(G,Color.green);
}

ControlRecuperativo2009.doc
===========================
Sección:__
Apellido:_______________________Nombre:__________________Firma:___________
CC1001-Computación I - Control Nº 1: Pregunta 1 - lunes 25 de mayo
de 2009 - Tpo total: 2 horas
Con apuntes individuales - Sin consultas - Contestar en esta hoja



A) (1 punto) Escriba una función recursiva que cuente el nº de veces que un
entero X divide exacta y sucesivamente a un entero Y. Por ejemplo:
cuenta(3,18) entrega 2, porque 18/3=6 y 6/3=2. Por otra parte,
cuenta(2,12)=2,cuenta(3,12)=1,cuenta(4,12)=1,cuenta(5,12)=0,cuenta(12,12)
=1,cuenta(1,12)=0,cuenta(0,12)=0.


































B)(3 puntos) Use la función anterior en una función que entregue la
descomposición de un número en factores primos. Por ej, factores(14)
entrega "2*7", factores(13)="13", factores(75)="3*5^2" (es decir 3 x 52).

Nota. Suponga que existe una función que entrega el i-ésimo nº primo. Por
ej, primo(1) entrega 2, primo(2) devuelve 3, primo(3) entrega 5, ....
static public String factores(int x){
























C)(2 puntos) Use la función anterior en un programa que grabe en el archivo
"numeros.txt" la descomposición en factores primos de todos los números no
primos entre 1 y 1000. La 1ª línea se grabará en la forma "4=2^2", la 2ª
"6=2*3" y la última "1000=2^3*5^3".



Sección:__
Apellido:_______________________Nombre:__________________Firma:_____
______
CC1001-Computación I - Control Nº 1: Pregunta 2 - lunes 25 de mayo
de 2009 - Tpo total: 2 horas
Con apuntes individuales - Sin consultas - Contestar en esta hoja

A)(1.5 ptos) Complete la sgte clase para un móvil que se mueve en dirección
Norte(1), Sur(2), Este(3) u Oeste(4) en un cuadriculado de 1000 unidades
horizontales y 1000 verticales (numeradas entre 0 y 999).
class Movil{
protected int H,V;//coordenadas horizontal y vertical de la ubicación del
móvil
public Movil(int X,int Y){//inicializa H,V con X,Y si están en rango 0-
999(sino abortar)





}public void mover(int dist,int dir){//mover en dist unidades en dirección
dir(1,2,3,4)






}}
B)(1.5 ptos) Escriba una clase que extienda la anterior con un método para
mover el móvil en dist unidades en dirección dir (1,2,3 o 4), dibujando una
línea en el objeto gráfico G (de 1000x1000 pixeles):
public void mover(int dist,int dir,Graphics G)











C)(3 ptos) Use la clase anterior en un programa que controle un móvil que
se ubica inicialmente al centro de un Canvas de 1000x1000. Cada vez que se
presione un botón (N,S,E,O) debe mover el móvil dibujando una línea de 20
pixeles en la dirección indicada.
| | | |N | | | | |import java.awt.*; import java.awt.event.*; | | | | | |
| | | | |class Ventana extends Frame implements ActionListener{ | | | | | |
| | | | |static public void main(String[]args){new Ventana().show();} | |O
| | | | | | | |E |private Button | | | | | | | | | | | N=new Button("N"),
S=new Button("S"), | | | | | | | | | | | E=new Button("E"), O=new
Button("O"); | | | | | | | | | | |private Canvas cv=new Canvas(); | | | | |
|S | | | | | | |public Ventana(){//constructor










public void actionPerformed(ActionEvent x){