Suponiendo que además en la clase U hay: import java.util.*; class U{ static Scanner teclado = new...

21
Problem a. Program areldiálogo indicado en elsiguiente ejem plo: fraccion 1 (Nº/Nº) ? 3/4 fraccion 2 (Nº/Nº) ? 6/8 suma=48/32=3/2 mayor=6/8 N ota . Suponga lossgtesm étodosen la clase U //abortar(x): escribe x y termina programa static public void abortar(String x){ println(x); //escribir epitafio System.exit(0);//suicidarse } //mcd(x,y): máximo común divisor entre x e y static public int mcd(int x,int y){ if(x==y) return x; return x>y ? mcd(y,x-y) : mcd(x,y-x); // }

Transcript of Suponiendo que además en la clase U hay: import java.util.*; class U{ static Scanner teclado = new...

Page 1: Suponiendo que además en la clase U hay: import java.util.*; class U{ static Scanner teclado = new Scanner(System.in); static public int readInt(String.

Problema. Programar el diálogo indicado en el siguiente ejemplo: fraccion 1 (Nº/Nº) ? 3/4 fraccion 2 (Nº/Nº) ? 6/8 suma=48/32=3/2 mayor=6/8 Nota. Suponga los sgtes métodos en la clase U //abortar(x): escribe x y termina programa static public void abortar(String x){ println(x); //escribir epitafio System.exit(0);//suicidarse } //mcd(x,y): máximo común divisor entre x e y static public int mcd(int x,int y){ if(x==y) return x; return x>y ? mcd(y,x-y) : mcd(x,y-x); // }

Page 2: Suponiendo que además en la clase U hay: import java.util.*; class U{ static Scanner teclado = new Scanner(System.in); static public int readInt(String.

Suponiendo que además en la clase U hay:

import java.util.*;class U{

static Scanner teclado = new Scanner(System.in);static public int readInt(String x) {

println(x); return readInt();}static public double readDouble(String x) {

println(x); return teclado.nextDouble();}static public void print(String x){

System.out.print(x);}static public void println(String x){

System.out.println(x);}

static public String readLine(String x) { println(x); return teclado.nextLine(); }}

Page 3: Suponiendo que además en la clase U hay: import java.util.*; class U{ static Scanner teclado = new Scanner(System.in); static public int readInt(String.

Solución 1. Con datos de tipo int //obtener fraccion 1: a1/b1 String s=U.readLine(“fraccion 1(Nº/Nº)?“); int i=s.indexOf(“/”), a1=Integer.parseInt(s.substring(0,i)), b1=Integer.parseInt(s.substring(i+1)); if(b1==0) U.abortar(“denominador cero”); //obtener fraccion 2: a2/b2 s=U.readLine(“fraccion 2(Nº/Nº)?“); i=s.indexOf(“/”); int a2=Integer.parseInt(s.substring(0,i)), b2=Integer.parseInt(s.substring(i+1)); if(b2==0) U.abortar(“denominador cero”); //calcular y mostrar suma int a=a1*b2+b1*a2, b=b1*b2, m=U.mcd(a,b); U.println("suma="+a+"/"+b+"="+a/m+"/"+b/m); //mostrar fraccion mayor if(a1*b2>a2*b1){a=a1;b=b1;}else{a=a2;b=b2;} U.println(“mayor=”+a+”/”+b);

Page 4: Suponiendo que además en la clase U hay: import java.util.*; class U{ static Scanner teclado = new Scanner(System.in); static public int readInt(String.

Solución 2. Usando clase Fracción definida con los sgtes métodos: Ejemplo de uso resultado Fraccion x=new Fraccion(“3/4”); Fraccion y=new Fraccion(“6/8”)

x: fracción 3/4 y: fracción 6/8

x.suma(y) fracción 48/32 y.simple(); fracción 3/4 x.toString() string “3/4” x.compareTo(y) 0 si x=y, nº<0 si x<y, nº>0 si x>y //obtener fracciones Fraccion f1=new Fraccion(U.readLine(“fraccion1(Nº/Nº)?”)), f2=new Fraccion(U.readLine(“fraccion2(Nº/Nº)?”)); //calcular y mostrar suma Fraccion f=f1.suma(f2); U.println("suma="+f.toString()+”=”+f.simple().toString()); //mostrar fraccion mayor if(f1.compareTo(f2)>0) f=f1; else f=f2; U.println(“mayor=”+f.toString());

Page 5: Suponiendo que además en la clase U hay: import java.util.*; class U{ static Scanner teclado = new Scanner(System.in); static public int readInt(String.

Explicaciones 1. Fraccion f1 = new Fraccion(“nº/nº”); crea objeto de clase Fracción con numerador y denominador indicados f 1? referencia (dirección, ubicación, puntero, “flecha”) a objeto equivalencia: Fraccion f1; //declarar referencia a objeto

f1 f1 = new Fraccion(“nº/nº”);//crear objeto y asignar dir

nº f1 nº

referencia objeto

Page 6: Suponiendo que además en la clase U hay: import java.util.*; class U{ static Scanner teclado = new Scanner(System.in); static public int readInt(String.

2. f1.suma(f2) suma fracciones f1 y f2 objeto.método(parámetro) más preciso: referencia.método(parámetro) suma dos objetos de clase Fraccion resultado: objeto de clase Fracción tipo del resultado: referencia a objeto de clase Fraccion

nº/nº ejemplo: f=f1.suma(f2);

3/4 f1

6/8 f2

48/32 f

Page 7: Suponiendo que además en la clase U hay: import java.util.*; class U{ static Scanner teclado = new Scanner(System.in); static public int readInt(String.

3. f.toString() convierte fracción f en string entrega String en la forma “nº/nº”

4. f.simple().toString()

entrega string con fracción simplificada equivalencia:Fraccion nn=f.simple(); nn.toString()

5. f1.compareTo(f2)

entrega 0 si f1=f2, nº<0 si f1<f2, nº>0 si f1>f2 6. f=f2;

asignar (copiar) referencias (y no objetos) deja dos referencias apuntando al mismo objeto contenido original de f se pierde (objeto apuntado “desaparece”)

f2 6/8

f nº/nº desaparece

Page 8: Suponiendo que además en la clase U hay: import java.util.*; class U{ static Scanner teclado = new Scanner(System.in); static public int readInt(String.

Definición (declaración) de clase Fraccion class Fraccion{ //en archivo Fraccion.java //representacion private int a,b; //numerador y denominador //métodos public String toString(){ return a + "/" + b; } public Fraccion suma(Fraccion x){ return new Fraccion(a*x.b+b*x.a, b*x.b); } public Fraccion simple(){ int m=U.mcd(a,b); return new Fraccion(a/m, b/m); } public int compareTo(Fraccion x){ return a*x.b – b*x.a; //resultado: 0, <0 o >0 }

Page 9: Suponiendo que además en la clase U hay: import java.util.*; class U{ static Scanner teclado = new Scanner(System.in); static public int readInt(String.

//constructores: inicializan repres. de objeto public Fraccion(int x,int y){ a=x; b=y; validar(); } public Fraccion(String x){ int i=x.indexOf(“/”); if(i>=0){ a=Integer.parseInt(x.substring(0,i)); b=Integer.parseInt(x.substring(i+1)); validar(); }else{ a=Integer.parseInt(x); b=1; } } private void validar(){//método interno if(b==0) U.abortar(“denominador cero”); } }

Page 10: Suponiendo que además en la clase U hay: import java.util.*; class U{ static Scanner teclado = new Scanner(System.in); static public int readInt(String.

Explicaciones 1. private int a,b;

representación/datos/atributos de cada objeto de clase Fraccion: numerador y denominador

private? visible sólo en la clase ¿por qué private?

oculta representación evita modificación (accidental o premeditada) independiza programa usuario de representación

2. public String toString(){...} método que convierte objeto en String (devuelve String) ej invocación: f.toString() concatena numerador, slash y denominador public? visible también fuera de la clase

Page 11: Suponiendo que además en la clase U hay: import java.util.*; class U{ static Scanner teclado = new Scanner(System.in); static public int readInt(String.

3. public Fraccion suma(Fraccion x){...} método que suma dos fracciones ej de invocacion: f1.suma(f2) ref de segundo operando: x (datos: x.a, x.b) ref de primer operando: this (datos: this.a, this.b o a, b) crea nuevo objeto con resultado resultado: referencia a nuevo objeto de clase Fraccion

4. public Fraccion simple(){...}

método que entrega fracción simplificada ej de invocacion: f.simple() crea nueva fracción simplificada resultado: referencia a nuevo objeto de clase Fraccion

5. public int compareTo(Fraccion x){...} método que compara dos objetos (fracciones) devuelve un int <, = o > 0 (resultado de resta)

Page 12: Suponiendo que además en la clase U hay: import java.util.*; class U{ static Scanner teclado = new Scanner(System.in); static public int readInt(String.

6. public Fraccion(String x){...} inicializa componentes de un objeto método “constructor” mismo nombre de la clase recibe parámetro de clase String invocación: new Fraccion(string) se ejecuta después que operador new crea objeto

7. public Fraccion(int x,int y){...}

inicializa un objeto con dos parámetros enteros método “constructor” invocación: new Fraccion(nº,nº) se ejecuta después que operador new crea objeto

Page 13: Suponiendo que además en la clase U hay: import java.util.*; class U{ static Scanner teclado = new Scanner(System.in); static public int readInt(String.

Fraccion f=new Fraccion(nº,nº); 1º operador new crea objeto (reserva memoria para una fracción)

a b

2º objeto se inicializa (invocando a método “constructor”)

a nº b nº

3º operador new devuelve referencia (dirección) de objeto

nº nº

4º asignación guarda referencia

nº f nº

Page 14: Suponiendo que además en la clase U hay: import java.util.*; class U{ static Scanner teclado = new Scanner(System.in); static public int readInt(String.

Problema. Completar la clase Fracción y el programa principal de modo que satisfaga el diálogo siguiente: Fracción 1 (Nº/Nº) ? 3/8 Fracción 2 (Nº/Nº) ? 1/4 Operación (+ - * /) ? / Resultado=3/2 static public void main(String[]args){ … } class Fraccion{ … }

Page 15: Suponiendo que además en la clase U hay: import java.util.*; class U{ static Scanner teclado = new Scanner(System.in); static public int readInt(String.

Fraccion f1=new Fraccion(U.readLine(“Fraccion1(nº/nº)?“)), f2=new Fraccion(U.readLine(“Fraccion2(nº/nº)?“)), f; //resultado String op=U.readLine(“Operación (+ - * /)?”); if(op.equals(“+”)) f=f1.suma(f2); else if(op.equals(“-”)) f=f1.resta(f2); else if(op.equals(“*”)) f=f1.mult(f2); else if(op.equals(“/”)) f=f1.div(f2); else U.abortar(“operador incorrecto”); U.println(“resultado=”+f.simple().toString());

Page 16: Suponiendo que además en la clase U hay: import java.util.*; class U{ static Scanner teclado = new Scanner(System.in); static public int readInt(String.

Solución 2. Con instrucción switch Fraccion f1=new Fraccion(U.readLine(“Fraccion1(nº/nº)?“)), f2=new Fraccion(U.readLine(“Fraccion2(nº/nº)?“)), f; //resultado String op=U.readLine(“Operación (+ - * /)?”); switch(op.charAt(0)){//switch admite char case ‘+’: f=f1.suma(f2); break; case ‘-’: f=f1.resta(f2); break; case ‘*’: f=f1.mult(f2); break; case ‘/’: f=f1.div(f2); break; default: U.abortar(“operación incorrecta”); } U.println(“resultado=”+f.simple().toString());

Page 17: Suponiendo que además en la clase U hay: import java.util.*; class U{ static Scanner teclado = new Scanner(System.in); static public int readInt(String.

class Fraccion { ... public Fraccion resta(Fraccion x){ return new Fraccion(a*x.b-b*x.a, b*x.b); } public Fraccion mult(Fraccion x){ return new Fraccion(a*x.a, b*x.b); } public Fraccion div(Fraccion x){ return new Fraccion(a*x.b, b*x.a); } }

Page 18: Suponiendo que además en la clase U hay: import java.util.*; class U{ static Scanner teclado = new Scanner(System.in); static public int readInt(String.

Solución 2. Con métodos que modifican objeto Fraccion f1=new Fraccion(U.readLine(“Fraccion1(nº/nº)?“)), f2=new Fraccion(U.readLine(“Fraccion2(nº/nº)?“)). f; //resultado String op=U.readLine(“Operación (+ - * /)?”); switch(op.charAt(0)){ case ‘+’: f1.sumar(f2); break; //f1=f1.suma(f2); case ‘-’: f1.restar(f2); break; case ‘*’: f1.multiplicar(f2); break; case ‘/’: f1.dividir(f2); break; default: U.abortar(“operación incorrecta”); } f1.simplificar(); //f1=f1.simple(); U.println(“resultado=”+f1.toString());

Page 19: Suponiendo que además en la clase U hay: import java.util.*; class U{ static Scanner teclado = new Scanner(System.in); static public int readInt(String.

class Fraccion{ … //métodos modifican objeto (no crean uno nuevo) public void sumar(Fraccion x){ a=a*x.b+b*x.a; b=b*x.b; } public void restar(Fraccion x){ a=a*x.b-b*x.a; b=b*x.b; } public void multiplicar(Fraccion x){ a=a*x.a; b=b*x.b; } public void dividir(Fraccion x){ a=a*x.b; b=b*x.a; } public void simplificar(){ int m=U.mcd(a,b); a=a/m; b=b/m; } }

Page 20: Suponiendo que además en la clase U hay: import java.util.*; class U{ static Scanner teclado = new Scanner(System.in); static public int readInt(String.

Implementar la clase Tiempo de modo que se pueda programar el siguiente diálogo

Primer tiempo (HHMMSS) ? 013040Segundo tiempo (HHMMSS) ? 104530Mayor = 10:45:30Menor = 01:30:40Suma = 12:16:10 Resta = 09:14:50

class T { public static void main(String[] args) { Tiempo t1 = new Tiempo(C.readInt(“Primer instante(HHMMSS)?“)); Tiempo t2 = new Tiempo(C.readInt(“Segundo instante(HHMMSS)?”); Tiempo t3 = t1.suma(t2); System.out.print(“Suma=”+t3.toString()); if (t1.compareTo(t2) > 0){ mayor = t1; menor = t2; } else { mayor = t2; menor = t1; } U.println(“Mayor=“+mayor.toString()); U.println(“Menor=”+menor.tostring()); U.print(“Suma = “+(t1.suma(t2)).toString()+” Resta=”+(t1.resta(t2)).toString()); }}

Page 21: Suponiendo que además en la clase U hay: import java.util.*; class U{ static Scanner teclado = new Scanner(System.in); static public int readInt(String.

Esqueleto de la clase Tiempo:

class Tiempo { int segundos; //conviene guardar el total de segundos no mas Tiempo (String x) { //construcctor que recibe un string de parámetro } public int compareTo(Tiempo x) { // retorna un entero < 0, == 0, > 0 según si x es mayor igual o menor }

public Tiempo suma(Tiempo x) { //retorna un objeto tiempo nuevo con la suma } public Tiempo resta(Tiempo x) { //retorna un objeto tiempo nuevo con la resta }

public String toString() { //retorna un string “HH:MM:SS” }}