elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Arreglado, de nuevo, el registro del warzone (wargame) de EHN


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Java
| | | |-+  Arreglos Bidimensionales
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Arreglos Bidimensionales  (Leído 2,429 veces)
Marthy

Desconectado Desconectado

Mensajes: 1


Ver Perfil
Arreglos Bidimensionales
« en: 9 Febrero 2021, 05:43 am »

/*
DISEÑAR UN PROGRAMA QUE INGRESE NUMEROS ENTEROS A UN ARREGLO BIDIMENSIONAL SE PIDE CALCULAR
E IMPRIMIR EL SEGUNDO NUMERO CAPICUA MAS ALTO DE CADA DIAGONAL PRINCIPAL DEL ARREGLO
(CUANDO M=N). (NO USAR ARREGLO LINEAL)
*/
Código
  1. package pregunta1_pab;
  2.  
  3. import javax.swing.JOptionPane;
  4.  
  5. public class Pregunta1_PAB {
  6. static int m=Integer.parseInt(JOptionPane.showInputDialog("Ingresar el tamaño de las filas del arreglo : "));
  7. static int n=Integer.parseInt(JOptionPane.showInputDialog("Ingresar el tamaño de las columna del arreglo : "));
  8. static int num[][]=new int [m][n],auxCapicuaPrincipal,cifra,CapicuaNumero,NumeroPrincipal,respuestaPrincipal,auxMayor,NumeroP;
  9. static int auxCapicuaSecundario;
  10. public static void main(String[] args) {
  11. ingresar();
  12. mostrar();
  13. diagonales();
  14. }
  15. public static void ingresar(){
  16. for(int i=0;i<m;i++){
  17. for(int k=0;k<n;k++){
  18.  
  19. num[i][k]=Integer.parseInt(JOptionPane.showInputDialog("Ingrese un numero entero mayor de una cifra : "));
  20.  
  21. }
  22. }
  23.  
  24. }
  25.  
  26. public static void mostrar(){
  27.  
  28. for(int i=0;i<m;i++){
  29. for(int k=0;k<n;k++){
  30. System.out.print(num[i][k]+" ");
  31. }
  32. System.out.println("");
  33. }
  34. }
  35.  
  36. public static void diagonales(){
  37.  
  38. for(int i=0; i<m;i++){
  39. for(int k=0; k<n;k++){
  40.  
  41. if(i==k){
  42. CapicuaNumero=0;
  43. auxMayor=0;
  44. auxCapicuaPrincipal=num[i][k];
  45.  
  46. while(auxCapicuaPrincipal>0){
  47. cifra = auxCapicuaPrincipal%10;
  48. auxCapicuaPrincipal=auxCapicuaPrincipal/10;
  49. //CapicuaNumero = 0
  50. NumeroPrincipal=(CapicuaNumero*10)+cifra;
  51. }
  52. if(NumeroPrincipal==num[i][k]){
  53.  
  54. if(NumeroPrincipal>auxMayor){
  55. NumeroP = respuestaPrincipal;
  56. }
  57. }
  58.  
  59.  
  60. System.out.println("numero capicua"+NumeroP);
  61. }
  62. /*if((i+k)==num.length-1){
  63. auxCapicuaSecundario=num[i][k];
  64. }*/
  65. }
  66. }
  67. JOptionPane.showMessageDialog(null,"El mas alto numero es "+NumeroP);
  68.  
  69.  
  70. }
  71.  
  72. }
  73.  
-------------------------------------------------------------------------------------------------------
CUANDO CORRE E INGRESO DATOS ME SALE:
- EL MAS ALTO NUMERO ES 0
- NUMERO CAPICUA 0
ME PUEDEN AYUDAR QUE ES LO QUE ESTÁ MAL, GRACIAS.

[MOD] usar etiquetas GeSHi para publicar codigo.


« Última modificación: 9 Febrero 2021, 17:09 pm por simorg » En línea

K-YreX


Desconectado Desconectado

Mensajes: 1.008



Ver Perfil
Re: Arreglos Bidimensionales
« Respuesta #1 en: 9 Febrero 2021, 15:50 pm »

Lo primero y más importante: el código debe ir siempre entre etiquetas de Código GeSHi y a ser posible para el lenguaje apropiado y correctamente indentado. En tu caso deberías escribir:
[code=java]
Aqui escribes tu código
[/code]

Ahora antes de comentar el problema, voy a comentar la descripción de este:
Citar
Diseñar un programa que ingrese números enteros a un arreglo bidimensional. Se pide calcular e imprimir el segundo número capicúa más alto de cada diagonal principal del arreglo (cuando M = N). No usar arreglo lineal.
Problemas con esa descripción (para la parte en negrita concretamente):
1 - ¿Qué se entiende por diagonal principal? Si se entiende por diagonal principal únicamente la que empieza en la posición (0,0) y continúa por (1,1), (2,2),...(n,n); únicamente existe una diagonal principal en cada matriz cuadrada por lo que eso de "CADA diagonal" confunde un poco.
Si por el contrario, se refiere a todas las diagonales menores que son paralelas a la diagonal principal, entonces tu programa tiene otro problema y es que sólo evalúas la diagonal principal mayor.
2 - "Cuando M = N"... Si es una aclaración de lo que es la diagonal principal, entonces sólo existe una y el "CADA diagonal" estaría fuera de lugar. Otra interpretación es que el programa sólo analice las matrices cuadradas, es decir, que haga todo lo que se pide únicamente cuando M sea igual a N.

Para no complicarme supondré una única diagonal principal por matriz ya sea ésta última cuadrada o no.

Ahora yendo al problema principal, no entiendo qué hace tu método diagonales() que muestro a continuación y que he ido añadiendo comentarios en todo aquello que tenía que comentar:
Código
  1. public static void diagonales(){
  2.    // Si solo vas a recorrer la diagonal principal basta con hacer un for(int i = 0; i < menor(m,n); i++) y utilizar num[i][i]
  3.    for(int i=0; i<m;i++){
  4.        for(int k=0; k<n;k++){
  5.            if(i==k){
  6.                CapicuaNumero=0;
  7.                auxMayor=0;
  8.                auxCapicuaPrincipal=num[i][k];
  9.                // Aqui empiezas a quitar el ultimo digito al numero pero...
  10.                while(auxCapicuaPrincipal>0){
  11.                    cifra = auxCapicuaPrincipal%10;
  12.                    auxCapicuaPrincipal=auxCapicuaPrincipal/10;
  13.                    //CapicuaNumero = 0
  14.                    NumeroPrincipal=(CapicuaNumero*10)+cifra; // ...CapicuaNumero siempre vale 0, asi que eso siempre es = cifra
  15.                }
  16.                if(NumeroPrincipal==num[i][k]){
  17.                    if(NumeroPrincipal>auxMayor){ // Aqui auxMayor siempre es 0
  18.                        NumeroP = respuestaPrincipal; // Aqui respuestaPrincipal no tiene valor asi que es 0
  19.                    }
  20.                }
  21.                System.out.println("numero capicua"+NumeroP);
  22.            }
  23.            /*if((i+k)==num.length-1){
  24.                 auxCapicuaSecundario=num[i][k];
  25.             }*/
  26.        }
  27.    }
  28.    JOptionPane.showMessageDialog(null,"El mas alto numero es "+NumeroP);
  29. }

Además de los errores, tu código necesita mucha más organización de la que tiene. Muchos de los atributos de la clase no son necesarios y bastaría con utilizar variables locales a su método. Además la asignación de valores a no ser que sean constantes, es mejor que lo dejes para el main() o cualquier otro método y no lo incluyas en la misma declaración de los atributos.
Y como recomendación, crea un método que sea esCapicua(int) y que devuelva true/false según si el número indicado es capicúa o no. Esto te facilitará mucho el trabajo.
Código
  1. public class Principal {
  2.  private static int numFilas;
  3.  private static int numCols;
  4.  private static int[][] matriz;
  5.  
  6.  public static void main(String[] args) {
  7.    numFilas = Integer.parseInt(...);
  8.    numCols = Integer.parseInt(...);
  9.    matriz = new int [numFilas][numCols];
  10.  
  11.    rellenarMatriz();
  12.    System.out.println("----- MATRIZ RESULTANTE -----");
  13.    mostrarMatriz();
  14.  
  15.    int[] capicuasMayores = calcularCapicuasMayores(); // Puedes devolver los dos capicuas mas grandes
  16.    System.out.println("El segundo numero capicua mas grande es: " + capicuasMayores[1]);
  17.  }
  18.  
  19.  private static int[] calcularCapicuasMayores() {
  20.    int capicuas[] = new int[2]; // En capicuas[0] se guarda el mayor y en capicuas[1] el segundo mayor
  21.    boolean primerCapicua = true; // Flag para saber si es el primer capicua que guardamos. Si es negativo no vale comparar con > 0
  22.    int dimensionMenor = numFilas < numCols ? numFilas : numCols;
  23.    int numeroActual;
  24.    for(int i = 0; i < dimensionMenor; ++i) {
  25.      numeroActual = matriz[i][i];
  26.      if(esCapicua(numeroActual)) {  
  27.        if(primerCapicua) {                
  28.          capicuas[0] = numeroActual;
  29.          primerCapicua = false;                          
  30.        } else if(numeroActual > capicuas[0]) {
  31.          capicuas[1] = capicuas[0];
  32.          capicuas[0] = numeroActual;
  33.        } else if(numeroActual > capicuas[1]) {
  34.          capicuas[1] = numeroActual;
  35.        }
  36.    }
  37.    return capicuas;
  38.  }
  39.  
  40.  private static boolean esCapicua(int num) {
  41.    // Esto te toca a ti ya...
  42.    // Si haces que esto devuelva true cuando un numero es capicua y false cuando no, todo funcionara correctamente (creo)
  43.  }
  44. }

Como ves, es un código organizado en métodos pero que cada uno hace una parte muy concreta y con solo mirar el método main() ya tienes una idea de lo que el programa hace, aunque no sepas cómo lo hace (para eso tendrías que mirar el resto de métodos).


En línea

Código
  1. cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Programa Orientado a Objetos en Java con arreglos bidimensionales :)
Java
Neostream 3 43,909 Último mensaje 1 Marzo 2008, 18:36 pm
por **Adem**
Parametros de entrada, arreglos bidimensionales « 1 2 »
.NET (C#, VB.NET, ASP)
greenselves 13 11,383 Último mensaje 16 Marzo 2010, 05:45 am
por [D4N93R]
[C] Paso de arreglos bidimensionales a funciones. (?)
Programación C/C++
oblivionxor 9 12,517 Último mensaje 22 Febrero 2013, 06:45 am
por oblivionxor
arreglos bidimensionales y funciones
Programación C/C++
m@o_614 3 2,949 Último mensaje 16 Julio 2013, 22:33 pm
por eferion
duda con arreglos bidimensionales
Programación C/C++
nicolas04 1 2,055 Último mensaje 26 Junio 2014, 21:23 pm
por Flakito81
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines