Java - Necesito ayuda con la llamada de metodos :(

 
Vista:

Necesito ayuda con la llamada de metodos :(

Publicado por Belen Andrea SanMartin (1 intervención) el 18/10/2018 22:55:36
este es mi programa y tengo un serio problema o confusión con la llamada de métodos con parámetros, si alguien lo puede corregir me ayudaría mucho

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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
package tarea;
import java.util.Scanner;
 
public class Tarea {
    public static void main(String[] args) {
        menu(String[]hotel,int[]precios);
    }
    public static String[] hotel(){
    String hotel[]=new String[10];
    return hotel;
    }
    public static int[] precios(){
    int precios[]=new int[10];
    return precios;
    }
    public static void menu(String[]hotel,int[]precios){
        int opc;
        do{
            System.out.println("Software de gestión hotelera");
            System.out.println("1. Ingresar al hotel");
            System.out.println("2. Mostrar informacion del hotel");
            System.out.println("3. Salir");
            opc = leerEntero();
            switch (opc){
                case 1: ingresar(String[]hotel,int[]precios);
                        break;
                case 2: info(int[]precios);
                        break;
                case 3: System.out.println("¡Adios!");break;
                default:    break;
            }
        }while(opc!=3);
    }
    public static void info(int[]precios){
    for(int i=0;i<precios.length;i++){
         System.out.println("la habitacion "+i+" paga "+precios[i]);
     }
    }
    public static String leerString(){
    Scanner leer = new Scanner(System.in);
    String stri = leer.nextLine();
    return stri;
    }
    public static int leerEntero(){
    Scanner leer = new Scanner(System.in);
    int num1 = leer.nextInt();
    return num1;
    }
    public static void ingresar(String[]hotel,int[]precios){
    boolean salir = false;
        while(!salir){
        System.out.println("==================================================");
        System.out.println("Bienvenido al hotel 'donde cabe 1, caben 2'");
        System.out.println("[1].-Pedir habitacion");
        System.out.println("[2].-Reservar habitacion");
        System.out.println("[3].-estado de las habitaciones");
        System.out.println("[4].-reiniciar hotel");
        System.out.println("[5].-Salir.");
        System.out.println("==================================================");
        int opcion = leerEntero();
        switch(opcion){
            case 1:{
                pedirHabitacion(String[]hotel,int[]precios);
                break;
            }
            case 2:{
                reservarHabitacion(String[]hotel,int[]precios);
                break;
            }
            case 3:{
                espaciosDisponibles(String[]hotel);
                espaciosOcupados(String[]hotel);
                espaciosReservados(String[]hotel);
                break;
            }
            case 4:{
                reiniciar(String[]hotel);
                break;
            }
            case 5:{
                salir = true;
                break;
            }
        }
    }
 }
 public static String[] espaciosDisponibles(String[]hotel){
        int contador =0;
        for(int i=0;i<hotel.length;i++){
                if(hotel[i] == "r"){
                   contador++;
                }
        }
        System.out.println("hay "+contador+" habitaciones reservadas");
        return hotel;
    }
 public static String[] espaciosOcupados(String[]hotel){
        int contador =0;
        for(int i=0;i<hotel.length;i++){
                if(hotel[i] == "p"){
                   contador++;
                }
        }
        System.out.println("hay "+contador+" habitaciones ocupadas");
        return hotel;
    }
 public static String[] espaciosReservados(String[]hotel){
        int contador =0;
        for(int i=0;i<hotel.length;i++){
                if(hotel[i] == null){
                   contador++;
                }
        }
        System.out.println("el numero de espacios disponibles es: "+contador);
        return hotel;
    }
 public static void pedirHabitacion(String[]hotel,int[]precios){
        for(int i=0;i<10;i++){
                if(hotel[i] == null){
                   hotel[i] = "p";
                   i=10;
                }
        }
        System.out.println("tienes dos opciones \n'S' para sin desayuno y cena=$30.000 \n'C' para con desayuno y cena=$40.000");
        String opci=null;
        try{
            opci=leerString();
        }catch(Exception e){
            System.out.println("ingrese un valor valido");
        }
        if(opci=="S"){
            for(int i=0;i<10;i++){
                if(precios[i] == 0){
                   precios[i] = 30000;
                   i=10;
                }
            }
        }else if(opci=="C"){
            for(int i=0;i<10;i++){
                if(precios[i] == 0){
                   precios[i] = 40000;
                   i=10;
                }
        }
        }
        System.out.println("su pedido fue exitoso");
        }
 
  public static void reservarHabitacion(String[]hotel,int[]precios){
        for(int i=0;i<10;i++){
                if(hotel[i] == null){
                   hotel[i] = "r";
                   i=10;
                }
        }
        System.out.println("tienes dos opciones \n'S' para sin desayuno y cena=$30.000 \n'C' para con desayuno y cena=$40.000");
        String opci=null;
        try{
            opci=leerString();
        }catch(Exception e){
            System.out.println("ingrese un valor valido");
        }
        if(opci=="S"){
            for(int i=0;i<10;i++){
                if(precios[i] == 0){
                   precios[i] = 30000;
                   i=10;
                }
        }
        }else if(opci=="C"){
            for(int i=0;i<10;i++){
                if(precios[i] == 0){
                   precios[i] = 40000;
                   i=10;
                }
        }
        }
        System.out.println("su pedido fue exitoso");
  }
  public static void reiniciar(String[]hotel){
      boolean salir = false;
      int contrareal=1234;
      while(!salir){
        System.out.println("==================================================");
        System.out.println("[1].-reiniciar hotel");
        System.out.println("[2].-Salir.");
        System.out.println("==================================================");
        int opcion=0;
        try{
            opcion=leerEntero();
        }catch(Exception e){
            System.out.println("ingrese un valor valido");
        }
 
        switch(opcion){
            case 1:{
                System.out.println("ingrese contraseña");
                int contra=0;
        try{
            contra=leerEntero();
        }catch(Exception e){
            System.out.println("ingrese un valor valido");
        }
                if(contra==contrareal){
                for(int i=0;i<10;i++){
                hotel[i] = null;
                }
                }
            }
            case 2:{
                salir = true;
                break;
            }
        }
    }
 
  }
}
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
Imágen de perfil de Kabuto
Val: 3.428
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Necesito ayuda con la llamada de metodos :(

Publicado por Kabuto (1381 intervenciones) el 19/10/2018 00:47:36
Ok.
A ver el problema está en como nombras a los parametros en los métodos.

Cuando los está DECLARANDO, es decir, estás desarrollando el código de dicho método, SÍ has de especificar el tipo de dato de los parámetros que se van a pasar entre parentesis.
Es decir, esto de abajo es correcto. En el parentesis, has de indicar el tipo de dato de los parametos, en este caso un array String[] y un array de int[]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public static void menu(String[]hotel,int[]precios){
    int opc;
    do{
        System.out.println("Software de gestión hotelera");
        System.out.println("1. Ingresar al hotel");
        System.out.println("2. Mostrar informacion del hotel");
        System.out.println("3. Salir");
        opc = leerEntero();
        switch (opc){
        case 1: ingresar(String[]hotel,int[]precios);
        break;
        case 2: info(int[]precios);
        break;
        case 3: System.out.println("¡Adios!");break;
        default: break;
        }
    }while(opc!=3);
}

Esto es cuando lo estás DECLARANDO.

Pero, luego, cuando lo estás INVOCANDO, es decir, llamas al método para que empiece a funcionar y le pasas los argumentos entre parentesis, aqui no hay que indicar el tipo de dato. Solo has de poner el nombre del argumento.
Esta INVOCACION al método menu(), es incorrecta:
1
2
3
public static void main(String[] args) {
    menu(String[]hotel,int[]precios);
}

Lo correcto sería, solo los nombres:
1
2
3
public static void main(String[] args) {
    menu(hotel, precios);
}

Lo cuál, por cierto, nos lleva a un problema mucho mayor.

Se supone que has de tener un array String[] llamado hotel y un array int[] llamado precios.
Peeero...., no los tienes.

NO HAS DECLARADO ningún String[] llamado hotel.

SÍ has declarado un método, que hace una declaración de un array llamado hotel:
1
2
3
4
public static String[] hotel(){
    String hotel[]=new String[10];
    return hotel;
}
Pero esto no sirve.

Tu no necesitas declarar un método, que declara un array.
Necesitas declarar directamente un array.

Podrías hacerlo directamente en el main(), antes de llamar al menu().
Por ejemplo:
1
2
3
4
5
6
7
public static void main(String[] args) {
 
    String[] hotel = new String[10];
    int[] precios = new int[10];
 
    menu(hotel, precios);
}

Ahí hemos declarados los dos arrays, y se los pasamos al metodo menu() (solo indicando el nombre de los parámetros) para que trabaje con ellos.
Y esto es correcto para poder funcionar. La única "pega" es que a cada metodo que necesite trabajar con estos arrays, hay que estar pasándole los nombres de los arrays, para que estos puedan "verlos"

Pero hay una forma más comoda. Y esta es, en lugar de declararlos en el main(), puesto que estos arrays son superimportantes y son los datos a los que todos los métodos van a querer acceder, se pueden declarar como atributos de clase.
De este modo, los arrays están VISIBLES para todos los métodos de la clase, sin necesidad de tener que pasarselos como argumentos entre parentesis.
Se pueden declarar 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
public class Tarea {
 
//Arrays declarados como atributos de la clase Tarea
static String[] hotel = new String[10];
static int[] precios = new int[10];
 
public static void main(String[] args) {
 
    menu();//Ya no necesita recibir los arrays entre parentesis para "verlos"
}
 
public static void menu(){//En la declaracion ya no le especificamos ningun argumento, menu() puede ver los arrays
    int opc;
    do{
        System.out.println("Software de gestión hotelera");
        System.out.println("1. Ingresar al hotel");
        System.out.println("2. Mostrar informacion del hotel");
        System.out.println("3. Salir");
        opc = leerEntero();
        switch (opc){
        case 1: ingresar(hotel, precios);
        //Al metodo ingresar() tampoco sería necesario pasar los arrays entre parentesis, también puede verlos.
        //Asi que se podría cambiar la declaracion de ingresar() indicando que ya no va recibirá nada entre parentesis
        break;
        case 2: info(precios);
        break;
        case 3: System.out.println("¡Adios!");break;
        default: break;
        }
    }while(opc!=3);
}


De este modo, ningún metodo necesitaría recibir entre parentesis los nombres de los arrays. Al ser atributos de clase, todos los métodos pueden acceder a ellos directamente.
Esta es la forma más cómoda de hacerlo, y también la más correcta debido a que, repito, los arrays son los elementos más importantes del programa y es importante destacarlos como atributos de clase.

Pero no es necesario, puedes hacerlo también como dije antes, declarandolos en el main() y, ahora sí, pasarlos como argumentos a cada método que quiera trabajar con ellos.
Pero, recuerda, solo se pasan los nombres, no se indica el tipo de dato. El método ya sabe que tipo de dato va a recibir, porque ya se los dijimos en la DECLARACION.
En la INVOCACION, solo necesita que le digamos el nombre.


Así que declara los arrays donde prefieras.
Si los declaras en el main(), cambia todas las INVOCACIONES de los métodos, pues todos tienen el error de que se les está indicando el tipo.

Si los declaras como atributos de clase, tendrás que modificar también todas las DECLARACIONES de los métodos, indicando que ahora no van a recibir nada entre parentesis, pues ya tienen acceso directo a los arrays
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
Imágen de perfil de Kabuto
Val: 3.428
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Necesito ayuda con la llamada de metodos :(

Publicado por Kabuto (1381 intervenciones) el 19/10/2018 01:08:28
Otros errores que voy viendo...

Este metodo tiene que informar de los espacios ocupados.
E informa de esto en pantalla, sin embargo, retorna de nuevo el array hotel, lo cual no tiene sentido.
(fijate que además he quitado el argumento entre parentesis, si declaramos el array hotel como atributo, ya no necesita recibirlo como parametro)

1
2
3
4
5
6
7
8
9
10
public static String[] espaciosOcupados(){
    int contador =0;
    for(int i=0;i<hotel.length;i++){
        if(hotel[i] == "p"){
            contador++;
        }
    }
    System.out.println("hay "+contador+" habitaciones ocupadas");
    return hotel;
}

Tienes dos opciones con sentido.
Una,
Declarar el metodo con valor de retorno void (vacío, no retorna nada) y que informe por pantalla de las habitaciones ocupadas.
Aquí prescindimos de la sentencia return

1
2
3
4
5
6
7
8
9
public static void espaciosOcupados(){
    int contador =0;
    for(int i=0;i<hotel.length;i++){
        if(hotel[i] == "p"){
            contador++;
        }
    }
    System.out.println("hay "+contador+" habitaciones ocupadas");
}

Dos,
Que el metodo devuelva el valor de contador, y ya desde el main() o donde sea capturaremos este dato para mostrarlo en pantalla.
Así que el método ya no informará por pantalla, solo contará y retornará el valor del contador.
Entonces, tenemos que declarar este metodo con valor int de retorno:

1
2
3
4
5
6
7
8
9
10
public static int espaciosOcupados(){
    int contador =0;
    for(int i=0;i<hotel.length;i++){
        if(hotel[i] == "p"){
            contador++;
        }
    }
 
    return contador;
}

Ambas posibilidades son válidas.
Puesto que en principio no vamos a hacer nada especial con el valor de las habitaciones contadas, tan solo mostrarlo en pantalla, quizás es más comoda usar la primera posibilidad, que el metodo se encargue de contar y mostrar por pantalla, pero no va a retornar ningún valor, será un método void.
Aunque en realidad, podríamos hacer ambas cosas, que informe por pantalla y que además retorna el valor de contador. Pero en este caso, realmente no necesitamos que nos retorne nada.

Por último, hay un pequeño fallo muy común cuando estamos empezando a programar.
En el metodo, para comprobar si una habitacion está ocupada, tu usas el comparador ==
1
2
3
if(hotel[i] == "p"){
    contador++;
}

El comparador == es adecuado para datos primitivos como int, double, boolean, byte...
Pero no es adecuado para datos tipo String como es en este caso. Estos datos son más avanzados, son "objetos" de una clase (la clase String) y el comparador == no es fiable.

Ahora no quiero marearte explicándote el por qué, eso ya lo comprenderás más adelante.
Tan solo metete en la cabeza que cuando quieras comparar datos tipo String, no uses el comparador ==

La clase String posee su propio método para compararse con otros objetos de su clase, es el método equals() y es el que debes usar para hacer comparaciones fiables.
1
2
3
if(hotel[i].equals("p")){
    contador++;
}
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