Programación

1º DAM/DAW - Curso 2024-2025

User Tools

Site Tools


apuntes:cadenas

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
apuntes:cadenas [2019/02/14 22:12] Santiago Faciapuntes:cadenas [2023/10/26 20:01] (current) – [Ejercicios] Santiago Faci
Line 1: Line 1:
 ====== Las cadenas de caracteres ====== ====== Las cadenas de caracteres ======
  
-\part*{Las cadenas de caracteres}+Las cadenas de caracteres se almacenan en java utilizando la clase ''String'' . Java permite que utilicemos este tipo de dato como si tratara de un tipo primitivo pero realmente es una clase que, a parte de almacenar el valor de una cadena de caracteres, tiene numersosos métodos para operar con dicho valor y con otros relacionados.
  
-Las cadenas de caracteres se almacenan en java utilizando la clase \verb String . Java permite que utilicemos este tipo de dato como si +Hay que tener en cuenta que, puesto que las cadenas de texto en Java son inmutables, todos los métodos que realizan operaciones sobre un objeto ''String'' siempre devuelven el resultadonunca lo ejecutan sobre el propio objeto. En el caso de los métodos ''static'' ocurre lo mismo.
-tratara de un tipo primitivo pero realmente es una clase quea parte de almacenar el valor de una cadena de caracteres, tiene numersosos +
-métodos para operar con dicho valor y con otros relacionados.+
  
-\section{Extracción de un caracter particular}+===== A tener en cuenta =====
  
-Podemos extraer un caracter indicando simplemente su posicióny lo obtendremos como una variable de tipo \verb char . Obtendremos un error +  - El tipo ''String'' es una clase asi que las cadenas de texto realmente son objetos Java 
-en caso de que no exista el caracter en la cadena.+  - Al tratarse de un objetopodemos realizar algunas operaciones sobre la misma variable/objeto, como veremos más adelante 
 +  - Java nos permite utilizarlo como si fuera un tipo primitivo (aunque no lo sea) puesto que es un dato muy utilizado y asi nos será más cómodo 
 +  - Como realmente es un objeto, su valor por defecto será ''null'' 
 +  - Cualquier valor puede ser representado como una cadena de texto, por lo que normalmente será el tipo de dato utilizado siempre que se quiera recoger algún input del usuario
  
-\begin{lstlisting}[language=java]+===== Cuándo utilizar una cadena de texto ===== 
 + 
 +Por supuesto, usaremos una cadena cuando queramos almacenar texto. 
 + 
 +A veces, incluso cuando el valor que se quiere almacenar está compuesto exclusivamente de dígitos, éste debe almacenarse como cadena de texto, puesto que no son valores numéricos realmente ya que no soportan ninguna operación matemática ni se espera que se haga ninguna con ellos. 
 + 
 +Estos son algunos ejemplos: 
 +  - DNI 
 +  - Número de la Seguridad Social 
 +  - Cuenta Bancaria 
 +  - Teléfono 
 + 
 +Y si fuera necesario realizar alguna operación con sus dígitos (calcular dígitos de control, por ejemplo) siempre se puede recurrir al parseo del valor para realizar esos cálculos. 
 + 
 +Y, en definitiva, hay que tener en cuenta que todo input de usuario (tanto de consola como a través de formularios) viene siempre en forma de texto y somos nosotros quienes tenemos luego que parsearlo al tipo correcto (tras las comprobaciones) 
 + 
 +=== Casos de uso con cadenas === 
 + 
 +  - Un usuario introduce su nombre y apellidos en una caja de texto 
 +    * Convertir a mayúscula/minúscula y eliminar los espacios a inicio y final 
 +  - Un usuario introduce su número de cuenta 
 +    * Convertir la cadena en un array de caracteres para realizar el cálculo del digito de control 
 +  - Un usuario introduce su número de DNI (con letra) 
 +    * Convertimos el valor a un número para hacer los cálculos y luego lo almacenamos todo junto (con letra) concatenando. 
 +  - Un usuario introduce un precio en un formulario 
 +    * Tras las comprobaciones (caja de texto vacía o valor sólo compuesto por dígitos) tendremos que parsearlo al tipo de dato que corresponda (float en este caso) 
 + 
 +===== Extracción de un caracter particular ===== 
 + 
 +Podemos extraer un caracter indicando simplemente su posición, y lo obtendremos como una variable de tipo ''char''. Obtendremos un error en caso de que no exista el caracter en la cadena. 
 + 
 +<code java>
 String cadena = "Cadena de texto"; String cadena = "Cadena de texto";
 char primerCaracter = cadena.charAt(0); char primerCaracter = cadena.charAt(0);
 System.out.println(primerCaracter);     // C System.out.println(primerCaracter);     // C
-\end{lstlisting}+</code>
  
-\section{Obtener la longitud de una cadena}+===== Obtener la longitud de una cadena =====
  
-Para obtener la longitud de una cadena utilizaremos el método \verb length() . Hay que tener en cuenta que devolverá el número de caracteres +Para obtener la longitud de una cadena utilizaremos el método ''length''. Hay que tener en cuenta que devolverá el número de caracteres incluyendo los espacios. También podremos saber si una cadena está vacía con el método ''isEmpty()''. Recuerda que nunca será lo mismo que la cadena esté vacía a que no haya sido instanciada.
-incluyendo los espacios. También podremos saber si una cadena está vacía con el método \verb isEmpty() . Recuerda que nunca será lo mismo +
-que la cadena esté vacía a que no haya sido instanciada.+
  
-\begin{lstlisting}[language=java]+<code java>
 String cadenaVacia = ""; String cadenaVacia = "";
 String cadenaNula; String cadenaNula;
Line 32: Line 62:
 System.out.println(cadenaNula.isEmpty());   // Error (Excepción NullPointerException) System.out.println(cadenaNula.isEmpty());   // Error (Excepción NullPointerException)
 System.out.println(cadenaNulaTambien.isEmpty()); // Error (Excepción NullPointerException) System.out.println(cadenaNulaTambien.isEmpty()); // Error (Excepción NullPointerException)
-\end{lstlisting}+</code>
  
-\begin{lstlisting}[language=java]+<code java>
 String cadena = "esto es una cadena"; String cadena = "esto es una cadena";
 System.out.println(cadena.length());    // 18 System.out.println(cadena.length());    // 18
Line 40: Line 70:
 // Podemos comprobar si la cadena está vacía (length() == 0) // Podemos comprobar si la cadena está vacía (length() == 0)
 System.out.println(cadena.isEmpty());   // false System.out.println(cadena.isEmpty());   // false
-\end{lstlisting}+</code>
  
-\section{Subcadenas}+===== Subcadenas =====
  
-Una subcadena es el fragmento que extraemos de una cadena más larga. La clase \verb String  en Java proporciona diferentes formas de hacerlo +Una subcadena es el fragmento que extraemos de una cadena más larga. La clase ''String'' en Java proporciona diferentes formas de hacerlo a través de las diferentes sobrecargas del método ''substring()'' dependiendo de los parámetros que se le pasen. Tendremos que tener en cuenta que la primera posición de una cadena será la posición 0
-a través de las diferentes sobrecargas del método \verb substring()  dependiendo de los parámetros que se le pasen. Tendremos que tener en +
-cuenta que la primera posición de una cadena será la posición 0+
  
-\begin{lstlisting}[language=java] +<code java> 
-String nombre = "Asociación Española de Programadores Informáticos";+String nombre = "CodeAndCoke";
  
 // Devuelve la subcadena desde la posición 10 en adelante // Devuelve la subcadena desde la posición 10 en adelante
 String subcadena = nombre.substring(10); String subcadena = nombre.substring(10);
-System.out.println(subcadena);      // Española de Programadores Informáticos +System.out.println(subcadena);      // e
 // Devuelve la subcadena entre dos posiciones dadas // Devuelve la subcadena entre dos posiciones dadas
 subcadena = nombre.substring(5, 10); subcadena = nombre.substring(5, 10);
-System.out.println(subcadena);      // ación +System.out.println(subcadena);      // ndCok 
-\end{lstlisting}+</code>
  
-\section{Comparación de cadenas}+===== Comparación de cadenas =====
  
-Las cadenas de texto, al tratarse de objetos, no pueden ser comparadas con el operador \verb ==  ya que dicho operador sobre dos objetos +Las cadenas de texto, al tratarse de objetos, no pueden ser comparadas con el operador ''==''  ya que dicho operador sobre dos objetos evaluará si tienen la misma dirección de memoria, pero no si contienen el mismo valor. Podemos tener dos cadenas con el mismo texto pero pueden ser diferentes objetos, por lo que el operador devolvería un significado erróneo.
-evaluará si tienen la misma dirección de memoria, pero no si contienen el mismo valor. Podemos tener dos cadenas con el mismo texto pero +
-pueden ser diferentes objetos, por lo que el operador devolvería un significado erróneo.+
  
-\begin{lstlisting}[language=java] +<code java> 
-String nombre = "Asociación Española de Programadores Informáticos"; +String nombre = "CodeAndCoke"; 
-String nombreCorto = "AEPI";+String nombreCorto = "CAC";
 if (nombre.equals(nombreCorto)) { if (nombre.equals(nombreCorto)) {
     System.out.println("Las dos cadenas son iguales");     System.out.println("Las dos cadenas son iguales");
Line 75: Line 100:
     System.out.println("Las dos cadenas de texto son diferentes");     System.out.println("Las dos cadenas de texto son diferentes");
 } }
-\end{lstlisting}+</code>
  
-\section{Cambiar las letras de mayúscula a minúsculas}+===== Cambiar las letras de mayúscula a minúsculas =====
  
-También podemos pasar una cadena de texto a minúsculas o mayúsculas. La clase \verb String  tiene métodos para realizar ambas operaciones, +También podemos pasar una cadena de texto a minúsculas o mayúsculas. La clase ''String'' tiene métodos para realizar ambas operaciones, devolviendo siempre el resultado final.
-devolviendo siempre el resultado final.+
  
-\begin{lstlisting}[language=java] +<code java> 
-String nombre = "Asociación Española de Programadores Informáticos";+String nombre = "CodeAndCoke";
 String nombreMinusculas = nombre.toLowerCase(); String nombreMinusculas = nombre.toLowerCase();
-System.out.println(nombreMinusculas);   // asociación española de programadores informáticos+System.out.println(nombreMinusculas);   // codeandcoke
  
-String nombre = "Asociación Española de Programadores Informáticos";+String nombre = "CodeAndCoke";
 String nombreMayusculas = nombre.toUpperCase(); String nombreMayusculas = nombre.toUpperCase();
-System.out.println(nombreMayusculas);   // ASOCIACIÓN ESPAÑOLA DE PROGRAMADORES INFORMÁTICOS +System.out.println(nombreMayusculas);   // CODEANDCOKE 
-\end{lstlisting}+</code>
  
-\section{Búsqueda en una cadena}+===== Búsqueda en una cadena =====
  
 También podemos buscar subcadenas dentro de una cadena. Podremos buscar desde un caracter hasta una cadena de longitud indeterminada. También podemos buscar subcadenas dentro de una cadena. Podremos buscar desde un caracter hasta una cadena de longitud indeterminada.
  
-\begin{lstlisting}[language=java] +<code java> 
-String nombre = "Asociación Española de Programadores Informáticos"; +String nombre = "code and coke"; 
-int posicion = nombre.indexOf("Española");+int posicion = nombre.indexOf("and");
 if (posicion == -1) { if (posicion == -1) {
-    System.out.println("La palabra 'Española' no se encuentra en el nombre");+    System.out.println("La palabra 'and' no se encuentra en el nombre");
 } }
 else { else {
-    System.out.println("Se ha encontrado la cadena 'Española' en la posición " +    System.out.println("Se ha encontrado la cadena 'and' en la posición " 
                         + posicion);                         + posicion);
 } }
-\end{lstlisting}+</code>
  
-\section{Sustitución en una cadena}+===== Sustitución en una cadena =====
  
-Podemos reemplazar fragmentos de la cadena de texto por otros que pasemos como parámetros al método \verb replace() , que devolverá la +Podemos reemplazar fragmentos de la cadena de texto por otros que pasemos como parámetros al método ''replace()'', que devolverá la cadena resultante.
-cadena resultante.+
  
-\begin{lstlisting}[language=java] +<code java> 
-String nombre = "Asociación Española de Programadores Informáticos"; +String nombre = "CodeAndCoke"; 
-String busqueda = "Programadores"; +String busqueda = "Coke"; 
-String reemplazo = "Desarrolladores";+String reemplazo = "Code";
 nombre = nombre.replace(busqueda, reemplazo); nombre = nombre.replace(busqueda, reemplazo);
-System.out.println(nombre);  // Asociación Española de Desarrolladores Informáticos +System.out.println(nombre);  // CodeAndCode 
-\end{lstlisting}+</code>
  
-\section{Dar formato a una cadena}+===== Dar formato a una cadena =====
  
-Si te has fijado, hasta ahora almacenamos en variables sólo el valor de algo, pero en ningún caso añadimos información de cómo queremos +Si te has fijado, hasta ahora almacenamos en variables sólo el valor de algo, pero en ningún caso añadimos información de cómo queremos representar ese valor a la hora de mostrarlo en pantalla. Quizás sea un valor monetario, una fecha o cualquier otro valor que necesite una representación determinada. Para eso está el método ''format()'' de la clase ''String''. Permite añadir formato a los valores de cualquier variable para mostrarlo al usuario, por ejemplo.
-representar ese valor a la hora de mostrarlo en pantalla. Quizás sea un valor monetario, una fecha o cualquier otro valor que necesite una +
-representación determinada. Para eso está el método \verb format()  de la clase \verb String . Permite añadir formato a los valores de +
-cualquier variable para mostrarlo al usuario, por ejemplo.+
  
-\begin{lstlisting}[language=java]+<code java>
 float precio = 45.5; float precio = 45.5;
  
Line 143: Line 163:
 // Fuerza mostrar el valor utilizando 3 dígitos // Fuerza mostrar el valor utilizando 3 dígitos
 System.out.println(String.format("%03d", valor);        // 045 System.out.println(String.format("%03d", valor);        // 045
-\end{lstlisting}+</code>
  
-\section{Convertir una cadena de caracteres en un array de caracteres}+===== Convertir una cadena de caracteres en un array de caracteres =====
  
-A veces es interesante obtener una cadena como un array de valores \verb char  para operar con ellos de otra manera. La clase  +A veces es interesante obtener una cadena como un array de valores ''char'' para operar con ellos de otra manera. La clase ''String'' dispone del método ''toCharArray()'' para convertir una cadena en un array de caracteres.
-\verb String  dispone del método \verb toCharArray()  para convertir una cadena en un array de caracteres.+
  
-\begin{lstlisting}[language=java] +<code java> 
-String cadena = "AEPI";+String cadena = "CODE";
 char[] caracteres = cadena.toCharArray(); char[] caracteres = cadena.toCharArray();
-System.out.println(Arrays.toString(caracteres));  // ['A', 'E', 'P', 'I'] +System.out.println(Arrays.toString(caracteres));  // ['C', 'O', 'D', 'E'] 
-\end{lstlisting}+</code> 
 + 
 +---- 
 + 
 +====== Ejercicios ====== 
 + 
 +{ejercicio.png}}
  
 +  - Realiza un programa que sea capaz de seleccionar, aleatoriamente, una palabra de entre 5 que introducirá el usuario por teclado
 +  - Realiza una aplicación donde el usuario pueda almacenar información de personas (nombre, apellidos y dirección), de forma que luego pueda buscar por apellido a cualquiera de ellas. Puedes preparar un menú donde el usuario pueda escoger entre introducir una nueva persona o buscar a alguien
 +  - Realiza un programa para jugar al juego del ahorcado, donde el ordenador debe pensar una palabra y ofrecer al usuario tantos huecos como caracteres tenga dicha palabra. El usuario dispondrá de un número limitado de intentos para adivinar la palabra, pudiendo indicar un caracter en cada intento. Si el caracter existe en la palabra se mostrará en la pantalla y el usuario habrá consumido el intento
 +  - Utilizando matrices, diseña el tablero del juego del 3 en raya y permite al jugador jugar contra el ordenador
 +  - Implementa ahora el juego anterior pero en esta ocasión permite que dos personas jueguen una contra otra
 +  - Realiza una aplicación que compruebe si un número de DNI (con la letra) es correcto. Puedes consultar [[https://www.interior.gob.es/opencms/ca/servicios-al-ciudadano/tramites-y-gestiones/dni/calculo-del-digito-de-control-del-nif-nie/|aqui]] las reglas que se siguen para calcular la letra a partir de los dígitos.
 +  - Idea algún mecanismo que permita saber si una dirección de email que introduce el usuario es correcta
 +  - Idea algún algoritmo que permita saber si algo introducido por el usuario es un número entero o con decimales
 +  - Escribe un programa que reciba una cadena de texto y escriba por pantalla esa misma cadena pero al revés
 +  - El método ''Character.isDigit(char)'' permite saber si un caracter es o no un dígito. Implementa una aplicación que permita saber si un texto introducido por el usuario es un número (se permiten introducir tantos caracteres como el usuario decida)
 +  - Realiza un ejercicio que permita convertir números escritos como cadenas de texto (por ejemplo, "treinta y tres") al número escrito como digitos (por ejemplo, "33"). Considera limitar el rango de números aceptados para simplificarlo. Por ejemplo, solamente hacerlo para números entre 0 y 100.
  
 ---- ----
  
-(c) 2019 Santiago Faci+(c) 2019-{{date>%Y}} Santiago Faci
apuntes/cadenas.1550182347.txt.gz · Last modified: 2019/02/14 22:12 by Santiago Faci