Java - De que otra forma podría resolver este problema?

 
Vista:
sin imagen de perfil

De que otra forma podría resolver este problema?

Publicado por Nata (3 intervenciones) el 24/06/2015 10:42:12
Hola soy nuevo en el mundo de la programación he visto varios videos y leído varios anuales pero no veo otra forma de resolver este problema. El problema consiste en:


Aquí tienen un tarifario de cobro de taxis de mi localidad, en donde la ciudad se divide en 16 zonas. Si vas a la misma zona el costo es de 25. Los demás precios surgen de la combinación de las diferentes zonas aquí dejo la siguiente imagen:
1-a-4

Quisiera hacer un codigo en consola donde el usuario introduzca el punto de origen y el punto del destino y el programa arroja el resultado, pero me he topado con algunos problemas 1.- No puedo englobar las colonias en una sola variable.

Y como no se hacerlo solo evalúo las zonas en general. Pensaba usar Matrices de tipo cadena pero no se como avaluar si un elemento pertenece a una matriz.

asi que solo lo estoy haciendo con las zonas en general. Al parecer la forma que lo hago no es recomendada en programacion por que estoy anidando muchos if... pero no se me ocurre como hacerlo con algun bucle FOR o While case.

Quedaria así

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
import java.util.*;
public class Precios_taxi {
 
 
 
	public static void main(String[] args) {
		// TODO Auto-generated method stub
 
 
 
	Scanner entrada=new Scanner(System.in);
 
	System.out.println("Introduce el Origen");
 
	String origen=entrada.nextLine();
 
	System.out.println("Introduce el destino");
 
	String destino=entrada.nextLine();
 
	/*EVALUACION BASICA */	if (origen.equals(destino)){
		System.out.println("La tarifa es: " + 25);
		/*EVALUACION ZONA1 */	}else if (origen.equalsIgnoreCase("zona1") && (destino.equalsIgnoreCase("zona2")
			|| destino.equalsIgnoreCase("zona3") || destino.equalsIgnoreCase("zona4")
			|| destino.equalsIgnoreCase("zona5")|| destino.equalsIgnoreCase("zona6"))){
 
		System.out.println("La tarifa es: " + 30);
	}else if (origen.equalsIgnoreCase("zona1") && (destino.equalsIgnoreCase("zona7")
			|| destino.equalsIgnoreCase("zona8") || destino.equalsIgnoreCase("zona9")
			|| destino.equalsIgnoreCase("zona10")|| destino.equalsIgnoreCase("zona11")
			|| destino.equalsIgnoreCase("zona12")|| destino.equalsIgnoreCase("zona14"))){
 
		System.out.println("La tarifa es: " + 35);
	}else if (origen.equalsIgnoreCase("zona1") && (destino.equalsIgnoreCase("zona15")
			|| destino.equalsIgnoreCase("zona16") || destino.equalsIgnoreCase("zona13"))){
		System.out.println("La tarifa es: "+ 40);
/*EVALUACION ZONA2 */	}else if (origen.equalsIgnoreCase("zona2") && (destino.equalsIgnoreCase("zona1")
			|| destino.equalsIgnoreCase("zona3") || destino.equalsIgnoreCase("zona7")
			|| destino.equalsIgnoreCase("zona8")|| destino.equalsIgnoreCase("zona9"))){
 
		System.out.println("La tarifa es: " + 30);
 
	}else if (origen.equalsIgnoreCase("zona2") && (destino.equalsIgnoreCase("zona4")
			|| destino.equalsIgnoreCase("zona4") || destino.equalsIgnoreCase("zona6"))){
 
		System.out.println("La tarifa es: " + 35);
 
	}else if (origen.equalsIgnoreCase("zona2") && (destino.equalsIgnoreCase("zona10")
			|| destino.equalsIgnoreCase("zona11") || destino.equalsIgnoreCase("zona12")
			|| destino.equalsIgnoreCase("zona14"))){
 
		System.out.println("La tarifa es: " + 40);
	}else if (origen.equalsIgnoreCase("zona2") && (destino.equalsIgnoreCase("zona13")
			|| destino.equalsIgnoreCase("zona15") || destino.equalsIgnoreCase("zona16"))){
 
		System.out.println("La tarifa es: " + 45);
	}
 
/*EVALUACION ZONA3 */ else if (origen.equalsIgnoreCase("zona3") && (destino.equalsIgnoreCase("zona1")
		|| destino.equalsIgnoreCase("zona2") || destino.equalsIgnoreCase("zona4")
		|| destino.equalsIgnoreCase("zona8") || destino.equalsIgnoreCase("zona9"))){
 
	System.out.println("La tarifa es: " + 30);
}else if (origen.equalsIgnoreCase("zona3") && (destino.equalsIgnoreCase("zona5")
		|| destino.equalsIgnoreCase("zona6") || destino.equalsIgnoreCase("zona7")
		|| destino.equalsIgnoreCase("zona10") || destino.equalsIgnoreCase("zona14"))){
 
	System.out.println("La tarifa es: " + 35);
}else if (origen.equalsIgnoreCase("zona3") && (destino.equalsIgnoreCase("zona11")
		|| destino.equalsIgnoreCase("zona12") || destino.equalsIgnoreCase("zona13")
		|| destino.equalsIgnoreCase("zona15"))){
 
	System.out.println("La tarifa es: " + 40);
}else if (origen.equalsIgnoreCase("zona3") && destino.equalsIgnoreCase("zona16")){
 
	System.out.println("La tarifa es: " + 45);
}
 
/*EVALUACION ZONA4 */else if (origen.equalsIgnoreCase("zona4") && (destino.equalsIgnoreCase("zona1")
		|| destino.equalsIgnoreCase("zona3") || destino.equalsIgnoreCase("zona5")
		|| destino.equalsIgnoreCase("zona10") || destino.equalsIgnoreCase("zona14"))){
 
	System.out.println("La tarifa es: " + 30);
}else if (origen.equalsIgnoreCase("zona4") && (destino.equalsIgnoreCase("zona2")
		|| destino.equalsIgnoreCase("zona6") || destino.equalsIgnoreCase("zona8")
		|| destino.equalsIgnoreCase("zona9") || destino.equalsIgnoreCase("zona11")
		|| destino.equalsIgnoreCase("zona12") || destino.equalsIgnoreCase("zona13")
		|| destino.equalsIgnoreCase("zona15"))){
 
	System.out.println("La tarifa es: " + 35);
}
else if (origen.equalsIgnoreCase("zona4") && (destino.equalsIgnoreCase("zona7")
		|| destino.equalsIgnoreCase("zona16"))){
 
	System.out.println("La tarifa es: " + 40);
}
else{		System.out.println("Los datos que ingresaste son incorrectos.");
}
 
	}
 
 
}

Al final de cuentas se resolvería pero es demasiado código y aun me faltan hacer las otras zonas ya que son 4 hojas como estas en total. En otras palabras el programa no es eficiente.


5-a-8

Si alguien me puede orientar como hacer el código mas eficiente se lo agradecería mucho. Y de paso como hacer que cuando el usuario introduzca el nombre de una colonia el programa ya reconozca la zona y haga la evaluación del precio.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil

De que otra forma podría resolver este problema?

Publicado por omar (56 intervenciones) el 24/06/2015 18:33:48
Tendrias que armar una clase por zona, esa clase contendria las areas con los precios de cada zona
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

De que otra forma podría resolver este problema?

Publicado por Tom (1831 intervenciones) el 25/06/2015 10:36:54
Pues en mi opinión, deberías armarte de paciencia, y crear arrays multidimensionales para contener los datos de las zonas. Este array podrías rellenarlo al principio, desde un fichero externo o por código.

1
2
3
4
5
6
7
// Supongo que hay 16 zonas (1- 16)
int zonas[][] = new int[16][16];
// Rellenar Zona 1 (Array index 0)
zonas[0] = new int {0, 30, 30, 30, 30, 30, 35, 35, 35, 35, 35, 35, 40, 35, 40, 40};
// Rellenar Zona 2 (Array index 1)
zonas[1] = new int {30, 0, 30, 35, 35, 35, 30, 30, 30, 40, 40, 35, 45, 35, 45, 46};
...

Este trabajo, que solamente harás una vez, o cuando cambien las tarifas, te permitirá luego hacer:

1
2
3
4
// Recuerda, la zona 1 se trata como 0
int tarifa(int zonaOrigen, int zonaDestino) {
  return zonas[zonaOrigen][zonaDestino]
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

De que otra forma podría resolver este problema?

Publicado por Nata (3 intervenciones) el 26/06/2015 06:13:21
Muchas gracias por la respuesta me dio una idea.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

De que otra forma podría resolver este problema?

Publicado por omar (56 intervenciones) el 26/06/2015 04:41:54
Hola de nuevo, te dejo un codigo, espero que te sirva, o al menos sea una guia... suerte!
Hice dos zonas (clases), tendrias que clonar las 8, luego la clase preincipal con el main
Ejecutalo y fijate si es lo que mas o menos buscabas....
PD: si quisieras actualilzar los precios quizas te convenga definir otra variable, como sigue
precio1=xx;
precio2=xx
etc... donde precio 1=grupo1, precio2=grupo2, etc... para actualizar solo cambiarias los valores al comienzo del codigo

zona 1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package cmo;
/**
 *
 * @author cmo
 */
public class Zona1 {
    protected int grupo1[]={2,3,4,5,6};
    protected int grupo2[]={7,8,9,10,11,12,14};
    protected int grupo3[]={13,15,16};
    private int precio;
 
    protected int tarifa(int destino){
            for(int i=0; i<grupo1.length; i++){
                if(destino==grupo1[i]){
                    precio=30;
                }
            }
            for(int i=0; i<grupo2.length; i++){
                if(destino==grupo2[i]){
                    precio=35;
                }
            }
            for(int i=0; i<grupo3.length; i++){
                if(destino==grupo3[i]){
                    precio=40;
                }
            }
             if(precio==0){
            System.out.println("Zona inexistente");
        }
            return precio;
    }
}

zona 2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
package cmo;
/**
 *
 * @author cmo
 */
public class Zona2 {
    protected int grupo1[]={1,3,7,8,9};
    protected int grupo2[]={4,5,6};
    protected int grupo3[]={10,11,12,14};
    protected int grupo4[]={13,15,16};
    private int precio;
 
    protected int tarifa(int destino){
        for(int z=0; z<grupo1.length; z++){
            if(destino==grupo1[z]){
                precio=30;
            }
        }
        for(int z=0; z<grupo2.length; z++){
            if(destino==grupo2[z]){
                precio=35;
            }
        }
        for(int z=0; z<grupo3.length; z++){
            if(destino==grupo3[z]){
                precio=40;
            }
        }
        for(int z=0; z<grupo4.length; z++){
            if(destino==grupo4[z]){
                precio=45;
            }
        }
        if(precio==0){
            System.out.println("Zona inexistente");
        }
        return precio;
    }
}

Clase ejecutable

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
package cmo;
 
import java.util.Scanner;
 
/**
 *
 * @author cmo
 */
public class ClasificaZonas {
 
    ClasificaZonas(){
        Scanner teclado=new Scanner(System.in);
        System.out.println("Cual es su zona actual?");
        int zona=teclado.nextInt();
        System.out.println("Cuál es su zona destino?");
        int destino=teclado.nextInt();
        String tarifa="La trarifa es de $ ";
        switch(zona){
            case 1:
                Zona1 area=new Zona1();
                System.out.println(tarifa+area.tarifa(destino));
                break;
            case 2:
                Zona2 area1=new Zona2();
                System.out.println(tarifa+area1.tarifa(destino));
                break;
        }
    }
    public static void main(String ar[]){
        ClasificaZonas zona=new ClasificaZonas();
    }
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar
sin imagen de perfil

De que otra forma podría resolver este problema?

Publicado por Nata (3 intervenciones) el 26/06/2015 06:14:23
Muchas Gracias omar... con tu ejemplo he comprendido muchas cosas que no entendia. es correcto... es justo lo que quería hacer muchas gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

De que otra forma podría resolver este problema?

Publicado por omar (56 intervenciones) el 26/06/2015 11:25:16
De nada, me alegro que t haya servido
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar