Autor Tema: Java y C++ matrices comprobar si la solución de un sudoku es correcta suma items  (Leído 11395 veces)

mz39729

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 4
    • Ver Perfil
Buenos días,

Aquel que me pueda colaborar se le agradece, me pusieron este ejercicio para resolver en java y C++ es sobre matrices y dice asi:

"Crear un programa que usando una o más funciones permita verificar si un sudoku ya resuelto, es válido o no"

Mi problema es que no hallo correr el la matriz en un ciclo para que digo ciclo y si estoy mal quiero que me corrijan, como dice el ejecicio yo mismo creo la matriz, ok, lo cual que tengo que hacer es comparar si el numero de x filas y n columna no se repiten en su eje de forma horizontal  y vertical como dice las reclas de un sodoku.

Agradeceré su colaboración, buen día.
« Última modificación: 03 de Febrero 2018, 19:07 por Alex Rodríguez »

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 989
    • Ver Perfil
Re:Ayuda con ejercicio en java y C++ de matrices
« Respuesta #1 en: 20 de Noviembre 2017, 14:18 »
Hola,

aquí lo importante es tener claro como está compuesta una matriz.
Una matriz es en realidad una sucesion de vectores (arreglos).
Si suponemos una matriz de 3x3:
Citar
int[][] matriz = new int[3][3];
Esto en realidad es una agrupacion de 3 vectores, en los que cada vector tiene a su vez 3 posiciones para guardar valores. Lo que daría un total de 9 valores posibles para guardar en la matriz.
Esto significa que yo de una matriz, puedo coger uno de esos 9 valores individuales indicando dos posiciones, la primera posicion apunta a uno de los vectores que compone la matriz y la segunda posicion apunta a uno de los valores que compone dicho vector.

Asi que con:
Citar
matriz[0][0];
Estoy apuntando al primer vector y al primer valor de dicho vector.

Con:
Citar
matriz[1][2];
Estoy apuntando al segundo vector y al tercer valor de dicho vector.

Esto seguramente ya lo tenías claro porque es lo que habitualmente se hace en programación al trabajar con matrices: apuntar a valores individuales de la matriz indicando dos posiciones.

Pero algo que quizás no sabías es que al trabajar con matrices, además de coger valores individuales, también podemos coger directamente uno de los vectores.

Asi que con:
Citar
matriz[0];
Estariamos cogiendo el primer vector al completo, con todos sus valores, de modo que podríamos tratarlo y trabajar con él como si fuera un vector (o arreglo) individual, olvidándonos de que en realidad pertenece a una matriz.

Esto no es tan habitual hacerlo al trabajar con matrices, lo de coger un vector completo... pero no es algo tan raro y de hecho para este ejercicio del Sudoku nos va a ser muy útil.

Pero antes, otra aclaración:
Muchas veces representamos la matriz como si fuera una tabla, de modo que tenemos FILAS (valores horizontales de la tabla) y COLUMNAS (valores verticales de la tabla)

Bien, pues cada FILA corresponde a un vector completo de la matriz.
Así que como hemos dicho antes, podemos coger fácilmente una FILA completa de la tabla/matriz y operar con ella ya que en realidad es un vector individual.

Pero en el caso de las COLUMNAS, es más complicado, no podemos coger COLUMNAS tan fácilmente como sí podemos coger las FILAS.
Los valores de las COLUMNAS se componen de valores individuales guardados en cada uno de los vectores (filas) que componen la tabla/matriz.

Así que si queremos coger los valores de una FILA, es muy fácil, le pedimos a la matriz la posicion del vector que corresponde a la FILA y ya está. Ya los tenemos estructurados dentro de un vector.

Pero si queremos coger los valores de una COLUMNA, es más dificil. Habría que recorrer cada uno de los vectores de la matriz, coger únicamente el valor individual correspondiente a la posicion de la COLUMNA que nos interesa y una vez que hemos cogido dicho valor, estructurarlo nosotros mismos en otro vector a parte donde guardaríamos todos estos valores.


¿Y por qué explico todo esto?

Un Sudoku es básicamente una tabla.

Para determinar si un Sudoku esta bien resuelto, se podría hacer cogiendo cada FILA por separado y comprobar que dicha FILA solo tiene numeros del 1 al 9 y no están repetidos.
Luego lo mismo con las COLUMNAS, ir una por una y comprobar que tienen números válidos y no repetidos
Si esto se cumple, el Sudoku es correcto.

Vale, pues esta es la lógica que tenemos que programar.

Y como ya hemos explicado, si representamos el Sudoku en forma de matriz 9x9, coger sus FILAS será muy sencillo porque son vectores individuales y la matriz nos los dará directamente indicandoles su posicion.

Pero luego coger las COLUMNAS, ya es más complicado. La matriz no nos las puede dar directamente, tendremos que recorrer cada uno de los vectores (filas), coger el valor que está en la posición de la columna y copiarlo en otro vector creado por separado para luedo poder trabajar con él.


Cada FILA y cada COLUMNA individual que obtengamos del Sudoku, tendremos que validarlas una por una comprobando que no tiene numeros repetidos.

Así que con esto, ya podemos hacernos una idea de las funciones/métodos que vamos a necesitar en nuestro código.

EL primer método que necesitaremos será uno que reciba " las líneas del Sudoku", es decir, que reciba un vector (ya provenga de una FILA o de una COLUMNA) y determine si es válida o no.

Su declaración podría ser:
Citar
boolean validarLinea(int[] linea);

Y otro método/función, que indicándole el numero de columna, sea capaz de recorrer la matriz y crear un nuevo vector con los valores correspondientes a esa columna.
Se puede declarar como:
Citar
int[] crearLineadesdeColumna(int columna);
Así obtendremos las líneas del Sudoku correspondiente a las COLUMNAS y se las podremos pasar al método validarLinea(); que podrá trabajar con ellas igual de fácil que con las FILAS.

Pues estas son las funciones que tienes que rumiar. Si no lo consigues te ayudaremos, pero de momento intenta hacerlo tú.
Ves por partes e intenta pensar el primer método:
Citar
boolean validarLinea(int[] linea);
Este método ha de ser capaz de recorrer la linea que recibe, comprobar si tiene todos los números del 1 al 9 sin repetirse.
Si esto se cumple ha de devolver TRUE, de lo contrario ha de devolver FALSE.

Si lo consigues, ya puedes hacer la primera parte del ejercicio, que sería validar las FILAS.
Es decir, recorrer la matriz cogiendo los vectores completos y pasándoselos a la funciona validarLinea().
Y comprobar que esta funcion ha devuelto TRUE para cada uno de estos vectores/FILAS.
Si devuelve FALSE en alguno de ellos, es que el Sudoku es incorrecto.

Intentalo y luego ya se pensará como hacer la segunda parte, validar COLUMNAS.


Puedes usar esta matriz que representa un Sudoku correcto:
Citar
int[][] sudoku = {
      {5,3,4,6,7,8,9,1,2},
      {6,7,2,1,9,5,3,4,8},
      {1,9,8,3,4,2,5,6,7},
      {8,5,9,7,6,1,4,2,3},
      {4,2,6,8,5,3,7,9,1},
      {7,1,3,9,2,4,8,5,6},
      {9,6,1,5,3,7,2,8,4},
      {2,8,7,4,1,9,6,3,5},
      {3,4,5,2,8,6,1,7,9}
   };
« Última modificación: 20 de Noviembre 2017, 14:25 por Kabuto »
NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

mz39729

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 4
    • Ver Perfil
Re:Ayuda con ejercicio en java y C++ de matrices
« Respuesta #2 en: 20 de Noviembre 2017, 14:49 »
Gracias, no habia pensado en usar metodos pero creo que me seria util, lo tendre en cuenta, gracias por el aporte me sirvio mucho, cualquier otra duda la publicare para saber opiniones y certeza gracias a su experiencia.

buen día.

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 989
    • Ver Perfil
Re:Ayuda con ejercicio en java y C++ de matrices
« Respuesta #3 en: 20 de Noviembre 2017, 16:54 »
Gracias, no habia pensado en usar metodos pero creo que me seria util, lo tendre en cuenta, gracias por el aporte me sirvio mucho, cualquier otra duda la publicare para saber opiniones y certeza gracias a su experiencia.

buen día.

Siempre es mejor (por no decir obligatorio) usar métodos/funciones, incluso para tareas simples.

Este programa tiene un objetivo: determinar si un Sudoku es acertado o no.
Pero para alcanzar ese objetivo, tiene que realizar distintas tareas menores: comprobar si lineas son válidas, extraer columnas de la matriz en forma de vector....

Separar estas tareas en métodos/funciones separadas hace que sea más sencillo afrontar la solución del programa porque puedes ir cumpliendo pequeños objetivos menores en lugar de ir directamente a por "el todo".

Además luego sirve para que el código sea más legible, más fácil de mantener, más fácil de reaprovechar....por ejemplo una función que reciba como argumentos una matriz y un numero de columna, y te devuelva un vector con los valores de la columna indicada, puede ser de utilidad en infinidad de programas que operen con matrices, no solo para este del Sudoku.

Tener este método/función escrito por separado del código principal, facilita el poder copiarlo y usarlo en otros.
Incluso puede pasar a formar parte de una libreria personal tuya, una que aglutine distintos métodos/funciones para operar con matrices, de modo que en el futuro te puede bastar con importar dicha librería desde cualquier programa y llamar a estas funciones sin tener que volverlas a escribir o copiar.
NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

mz39729

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 4
    • Ver Perfil
Re:Ayuda con ejercicio en java y C++ de matrices
« Respuesta #4 en: 24 de Noviembre 2017, 02:46 »
La verdad he intentado y no he podido dale y ahora me me ocurre algo y es que no me muestra el resultado de las filas, voy a dejar el codigo por donde lo llego y me dicen cual es el error y si pueden la correcion de este.
Código: [Seleccionar]
package sudoku;

public class sudoku {
     
     public static void main (String arg[]){
         tablasudoku();}
     static int[][] sudoku = {{5,3,4,6,7,8,9,1,2},
      {6,7,2,1,9,5,3,4,8},
      {1,9,8,3,4,2,5,6,7},
      {8,5,9,7,6,1,4,2,3},
      {4,2,6,8,5,3,7,9,1},
      {7,1,3,9,2,4,8,5,6},
      {9,6,1,5,3,7,2,8,4},
      {2,8,7,4,1,9,6,3,5},
      {3,4,5,2,8,6,1,7,9}
   };
    public static void tablasudoku() {
     
   for (int i=0; i<9; i++) {
    System.out.println();
        for (int j=0; j<9; j++) {
       
            System.out.print(sudoku[i][j]+"\t");
                         
            }}}
 public static boolean filas( int numero, int fila, int[][] filas ){
   
  boolean resultado = false;
   
  for ( int i = 0; i< sudoku.length; i ++ )
   if ( sudoku[(fila)][i] == numero ){
     resultado = true;
     break;
   }
      if ( numero == 0 ) resultado = false;
     return resultado;
   }
}
 

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 989
    • Ver Perfil
Re:Ayuda con ejercicio en java y C++ de matrices
« Respuesta #5 en: 26 de Noviembre 2017, 00:46 »
Hola,
mira te explico un poco el enfoque que yo le dí.

Dijimos que el sudoku será válido si todas las lineas, tanto las horizontales (filas) como las verticales (columnas) cumplen la condicion de que contienen todos los numeros del rango del 1 al 9, sin repetirse.

Así que lo primero que necesitamos es un método que vaya recibiendo "líneas" de una en una y decida si son validas (true) o no (false).
Cada "línea" será en realidad un vector, así que eso es lo que ha de recibir como argumento: un vector.
Y el valor que devolverá será de tipo boolean.

Esta podría ser su firma:
public static boolean lineaEsCorrecta(int[] linea);

Ahora hay que decidir su código.
A mi se me ocurrió una forma de hacerla. Puede que no sea la más inteligente, ni la más elegante.. no le pude dedicar mucho tiempo la verdad, pero funciona perfectamente.
Te la pongo a continuación con algunos comentarios explicativos. Tu decides si quieres verla o primero quieres volver a intentarlo por tu cuenta.

Citar
public static boolean lineaEsCorrecta(int[] linea)
   {
      //Un contador para cada numero, del 1 al 9
      int c1 = 0, c2 = 0, c3 = 0, c4 = 0, c5 = 0,
            c6 = 0, c7 = 0, c8 = 0, c9 = 0;
      
      //Recorremos linea, numero a numero y contamos segun lo que encontramos
      for (int num : linea)
      {
         switch (num)
         {
         case 1:
            c1++;
            break;
         case 2:
            c2++;
            break;
         case 3:
            c3++;
            break;
         case 4:
            c4++;
            break;
         case 5:
            c5++;
            break;
         case 6:
            c6++;
            break;
         case 7:
            c7++;
            break;
         case 8:
            c8++;
            break;
         case 9:
            c9++;
            break;
         default:
            return false;//Si encontrasemos un numero fuera del rango 1-9, Sudoku es erroneo
         }
      }
      
      /*
       * Ya se ha recorrido la linea y hemos contado según los numeros encontrados.
       * La linea será CORRECTA si TODOS los contadores tienen valor 1, es decir, se ha encontrado
       * UN UNICO NUMERO para cada posible valor entre 1-9.
       * Si algun contador tuviera valor 0 o mayor que 1, es que la linea es INCORRECTA, porque
       * faltan numeros y/o algunos están repetidos.
       */

      if (c1 == 1 && c2 == 1 && c3 == 1 && c4 == 1 && c5 == 1 && c6 == 1
            && c7 == 1 && c8 == 1 && c9 == 1)
         return true;
      else
         return false;
   }

Bien, ahora ya tenemos un método que nos dice si las líneas son válidas, o no lo son.
Ahora hay que usar este método en main().

Lo ideal sería primero pasarle las FILAS del sudoku y que las compruebe.
Y luego pasarle las COLUMNAS.

Como explicamos al principio, pasarle FILAS es muy fácil, pues solo hay que extraer de la matriz (el Sudoku) los vectores/arreglos de los que está compuesta y para hacer esto nos basta con usar un unico indice para apuntar a cada uno de estos vectores.

Con las COLUMNAS es más dificil porque tenemos que construirlas nosotros previamente para pasarselas al metodo que comprueba las lineas.
Así que de momento, vamos a olvidarnos de las COLUMNAS y vamos a hacer que nuestro programa solo compruebe FILAS.

Yo lo hice así el método main(). De nuevo puedes decidir intentarlo tú antes de ver como lo he hecho yo:

Citar
public static void main(String[] args) {
      /*
       * Usaremos variable booleana para controlar si tras recorrer
       * todas las FILAS, hemos encontrado alguna NO VALIDA.
       * Si todas las FILAS son correctas, esta variable conservará
       * su valor TRUE.
       * Si se encuentra alguna NO VALIDA, su valor pasará a ser FALSE.
       * Luego tras la comprobación de FILAS, mostraremos un mensaje u otro
       * según el valor de esta variable
       */

      boolean filasOK = true;
      
      //Comprobamos las filas
      for (int fila = 0; fila < sudoku.length; fila++)//Con un solo indice obtenemos vectores completos
         if (lineaEsCorrecta(sudoku[fila]) == false)//Se ha encontrado una linea no valida
         {
            filasOK = false;
            System.out.println("Fila no valida: " + fila);//Incluso indicamos cuál fila es incorrecta
         }
      
      System.out.println(filasOK?"Las filas son correctas":"Las filas estan mal.");//Informamos segun el valor de la variable booleana


Pruebalo con el sudoku que pusimos y debería indicar que es correcto.
Luego prueba a alterar algún numero del sudoku para que sea incorrecto y comprueba que este código lo detecta.

Si hasta aquí te funciona, y tienes claro qué es lo que hemos hecho, y por qué....
ahora habría que hacer lo mismo con las COLUMNAS.

Para ello, necesitaríamos crear otro método. Un método que se encargue de construir y devolver"líneas" (un vector) a partir de un número de COLUMNA que le indiquemos.

Esta podría ser su firma (un nombre un poco feo, pero descriptivo):
public static int[] creaLineaParaColumna(int columna);

Entonces, para este sudoku:
Citar
static int[][] sudoku = {
      {5,3,4,6,7,8,9,1,2},
      {6,7,2,1,9,5,3,4,8},
      {1,9,8,3,4,2,5,6,7},
      {8,5,9,7,6,1,4,2,3},
      {4,2,6,8,5,3,7,9,1},
      {7,1,3,9,2,4,8,5,6},
      {9,6,1,5,3,7,2,8,4},
      {2,8,7,4,1,9,6,3,5},
      {3,4,5,2,8,6,1,7,9}
   };

si por ejmplo le indico el valor "0" como numero de columna, me ha de devolver un vector como este:
{5,6,1,8,4,7,9,2,3};

Para así poder pasarselo al método que valida líneas.

Te pongo el código de como lo hice yo. Es más fácil de lo que parece y de nuevo te recomiendo que primero intentes hacerlo por tu cuenta. Y si no lo consigues, pues aquí tienes mi código para ver como solucionarlo.

Citar
static int[] creaLineaParaColumna(int columna)
   {
      int[] linea = new int[9];//Este será el vector que devolveremos
      
      for (int fila = 0; fila < 9; fila++)
         linea[fila] = sudoku[fila][columna];
//Usamos dos indices: fila nos lo da el bucle y cambia en cada iteracion. La columna es la que recibimos como argumento y NO varia con cada iteracion del bucle

//Además el indice fila nos sirve para apuntar a cada una de las 9 posiciones del vector que tenemos que rellenar para crear la linea
      
      return linea;
   }


Con este método, ya podemos construir COLUMNAS y pasárselas al método que se encarga de validar lineas del sudoku.

Esto lo hacemos en el main, del mismo modo que lo hicimos para las FILAS, usando una variable booleana para controlar.
Este sería el main final:

Citar
public static void main(String[] args) {
      /*
       * Usaremos variable booleana para controlar si tras recorrer
       * todas las FILAS, hemos encontrado alguna NO VALIDA.
       * Si todas las FILAS son correctas, esta variable conservará
       * su valor TRUE.
       * Si se encuentra alguna NO VALIDA, su valor pasará a ser FALSE.
       * Luego tras la comprobación de FILAS, mostraremos un mensaje u otro
       * según el valor de esta variable.
                 * Hacemos igual con las COLUMNAS
       */

      boolean filasOK = true;
                boolean columnasOK = true;
      
      //Comprobamos las filas
      for (int fila = 0; fila < sudoku.length; fila++)//Con un solo indice obtenemos vectores completos
         if (lineaEsCorrecta(sudoku[fila]) == false)//Se ha encontrado una linea no valida
         {
            filasOK = false;
            System.out.println("Fila no valida: " + fila);//Incluso indicamos cuál fila es incorrecta
         }
      
      System.out.println(filasOK?"Las filas son correctas":"Las filas estan mal.");//Informamos segun el valor de la variable booleana

        /*
       * Filas Comprobadas.
       * Ahora hay que comprobar Columnas. Esto es un poco más dificil porque la MATRIZ
       * sí tiene los valores de las Filas agrupados en estructuras separadas.
       * Cada Fila es en realidad un VECTOR individual y podemos cogerlos facilmente
       * para pasarselos al método que comprueba si es una línea Sudoku correcta.
       *
       * Pero los valores que corresponden a las Columnas no están agrupados en un
       * VECTOR, sino separados en cada uno de los VECTORES que componen la MATRIZ.
       * Para facilitar la tarea, lo que hacemos es pasarle a un método el número de Columna
       * que queremos comprobar y él se encargará de recorrer las Filas cogiendo el numero
       * correspondiente a la Columna que estamos consultando y construirá un VECTOR que ahora
       * sí podremos tratarlo también como una línea de Sudoku y comprobar su validez.
       */

      
      //Comprobamos columnas
      for (int columna = 0; columna < 9; columna++)
      {
                 //Con el indice de esta bucle le indicamos al método cual columna ha de construir y se la pasamos al metodo que nos dice si la linea es correcta o no
         if (lineaEsCorrecta(creaLineaParaColumna(columna)) == false)
         {
            columnasOK = false;
            System.out.println("Columna no valida: " + columna);
         }
      }
      
      System.out.println(columnasOK?"Las columnas son correctas":"Las columnas estan mal.");
      
      if (filasOK && columnasOK)
         System.out.println("\nEl Sudoku es correcto");
      else
         System.out.println("\nEl Sudoku es incorrecto");
   }


Con todo esto, quedaría resuelto el ejercicio.

Perdón que me repita de nuevo: Importantísimo que lo intentes hacer tú guiándote si quieres por el enfoque que yo le he dado y que solo copies mi código cuándo no te haya sido posible solucionarlo por tu cuenta.

En cualquier caso, pregunta cualquier duda que puedas tener.
Un saludo.
NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

mz39729

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 4
    • Ver Perfil
Re:Ayuda con ejercicio en java y C++ de matrices
« Respuesta #6 en: 28 de Noviembre 2017, 15:29 »
Muchas gracias me ha servido mucho y he entendido, lo que si queria saber es 
Citar
System.out.println(filasOK?"Las filas son correctas":"Las filas estan mal.")
  lo que hace por ejemplo el (?" ":" ") o sea el signo de interrogacion y los dos puntos ¿cual es su funcion y como funciana?

Muchas gracias, se lo agradezco, buen día.

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 989
    • Ver Perfil
Re:Ayuda con ejercicio en java y C++ de matrices
« Respuesta #7 en: 28 de Noviembre 2017, 17:13 »
Muchas gracias me ha servido mucho y he entendido, lo que si queria saber es 
Citar
System.out.println(filasOK?"Las filas son correctas":"Las filas estan mal.")
  lo que hace por ejemplo el (?" ":" ") o sea el signo de interrogacion y los dos puntos ¿cual es su funcion y como funciana?

Muchas gracias, se lo agradezco, buen día.

Hola,
esa línea hace exactamente lo mismo que esto:

Código: [Seleccionar]
if (filasOK == true)
    System.out.println("Las filas son correctas");
else
    System.out.println("Las filas estan mal");

Esa expresión lo que hace es condensar un if... else... dentro de un System.out para que quede en una sola línea.

Lo que hace es analizar la expresión que hay antes del interrogante.
Si la expresión es cierta (true), el System.out mostrará en pantalla la primera cadena de texto que hay antes de los dos puntos :

Si la expresión es falsa, el System.out mostrará en pantalla la segunda cadena de texto que hay después de los dos puntos.

Citar
System.out.println(Expresion_a_Analizar?"Texto a mostrar si es TRUE":"Texto a mostrar si es FALSE");

La primera vez siempre resulta un poco confusa. Pero una vez se ha comprendido como utilizarla, es muy útil para ayudar a que nuestro código no se haga demasiado extenso
NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".