En la etapa de diseño, al especificar un pseudocódigo de un algoritmo utilizamos el tipo TEXTO para representar una cadena de caracteres. Una variable de este tipo se declara de la siguiente forma:
TEXTO mensaje
mensaje ← ”Ingrese la cantidad de alumnos”
ESCRIBIR(mensaje)
En este ejemplo, la variable mensaje es de tipo TEXTO. La variable asume un valor particular en la segunda línea a partir de la asignación. Y ese valor, es utilizado para mostrar por pantalla un mensaje al usuario.
ESCRIBIR(”Ingrese la cantidad de alumnos”)
El mensaje por pantalla produce un mensaje indicando: Número: 1, Número: 2, etc.
MóDULO ejemplo(ENTERO i) RETORNA ;
(*....*)
ENTERO x, j
x ← 1
PARA j ← 0 HASTA i PASO 1 HACER
ESCRIBIR("Número: ",x)
x ← x + 1
FIN PARA
FIN MóDULO ejRepetirPara
Las cadenas de texto se representan en Java por el tipo de dato String.
En Java no existe un tipo de dato primitivo que sirva para la manipulación de caracteres. En su lugar se utiliza la clase String. Esto significa que en Java las cadenas de caracteres son objetos que se manipulan como tales, aunque existen ciertas operaciones que nos permiten acceder a ciertas funcionalidades. Un valor de tipo String es una secuencia de caracteres tratado como un ítem único. Cuando se dice en Java que una variable es un String lo que se quiere decir en realidad es que la variable es una referencia a un String.
Un string se puede declarar de la siguiente forma:
String saludo ;
saludo = "Hola ! " ;
o:
String saludo = "Hola ! " ;
o un String puede crearse como se crea cualquier otro objeto de cualquier clase, mediante el operador new:
String saludo = new String("Hola ! ") ;
Los literales de cadena de caracteres se indican entre comillas dobles, a diferencia de los caracteres que utilizan comillas simples.
Para mostrar el contenido de un String utilizamos la siguiente instruccion:
System.out.println(saludo);
Java define el operador + (suma) con un significado especial cuando los operandos son de tipo String. En este caso el operador suma significa concatenación. En el siguiente ejemplo el resultado de la concatenación es un nuevo String compuesto por las dos cadenas, una tras otra. Por ejemplo:
String x = "Problemas " + "y Algoritmos" ;
da como resultado el String “Problemas y Algoritmos”.
Veamos otro ejemplo:
String saludo = "Hola " ;
Sting sentencia ;
sentencia = saludo + " operador" ;
System.out.println(sentencia);
También es posible concatenar a un String datos primitivos, tanto numéricos como booleanos y char. Por ejemplo, se puede usar:
int i = 5 ;
String x = " El valor de i es "+ i ;
Cuando se usa el operador + y una de las variables de la expresi´on es un String, Java transforma la otra variable (si es de tipo primitivo) en un String y las concatena. Otro ejemplo:
String solucion;
solucion = "La temperatura es " + 72;
System.out.println(solucion);
Como dijimos previamente String es una clase. Una clase es un tipo usado para producir objetos. Cada declaración de un String en realidad implica la creaci´on de un objeto de la clase String. Un objeto es una entidad que almacena datos. Podemos realizar acciones con los objetos invocando las acciones que definen su comportamiento. El comportamiento de un objeto se define a partir de métodos.
Un objeto de la clase String almacena datos que consisten en una secuencia de caracteres. Las operaciones sobre objetos de la clase String se ejecutan invocando los metodos correspondientes.
Por ejemplo el método length() retorna el n´umero de caracteres de un objeto String particular, es decir retorna un entero.
String cartel;
int longitudCartel;
cartel = "Bienvenido a Java";
longitudCartel = cartel.length();
Sytem.out.println(longitudCartel);
La salida por pantalla del fragmento de c´odigo anterior es: 17.
A continuaci´on describiremos en forma de tabla diferentes operaciones que pueden realizarse con el tipo TEXTO o cadenas de caracteres. Mostraremos los m´etodos para la clase String en JAVA. La tabla presenta cuatro columnas: la primera nos muestra como escribir la primitiva en pseudocódigo, la segunda nos permite ver algunos componentes de la signatura del m´etodo (nombre y parámetros) en JAVA, la tercera columna describe brevemente la primitiva (´o m´etodo en JAVA) y la cuarta columna muestra un ejemplo.
Las variables de tipo TEXTO contienen una cadena de caracteres. Podr´ıamos decir que una variable de tipo TEXTO tiene componentes dentro de s´ı. Estos componentes se encuentran en distintas posiciones comenzando desde 0. Ejemplos: En ”Java es divertido”la ’J’ esta en la posicion 0 Otros ejemplos”:
String cartel = "Bienvenido a Java";
System.out.println(cartel.charAt(4));
System.out.println( cartel.substring(3,9) ) ;
Cuya salida por pantalla es:
v
nvenid
El operador == no es apropiado para determinar si dos cadenas de caracteres (dos strings) tienen el mismo valor.
Retorna la longitud de la cadena de caracteres.
Pseudocódigo
TEXTO saludo
saludo ← "Hola!"
ESCRIBIR(longitud(saludo))
(* salida por pantalla 5)
Java
String saludo = "Hola!" ;
System.out.println(saludo.length());
// muestra por pantalla 5
Retorna true si el contenido de dos cadenas son iguales, sino retorna false.
Pseudocódigo
TEXTO saludo
LEER(saludo);
SI igual(saludo,"Hola") ENTONCES
ESCRIBIR("Saludo Informanl")
FIN SI
Java
Scanner sc = new Scanner(System.in);
// entrada de una cadena
String saludo = sc.nextLine();
if (saludo.equals("Hola"))
System.out.println("saludo informal");
Retorna true si el contenido de cadena1 y de cadena2 son iguales, considerando una letra en mayúscula y minúscula como iguales, sino retorna false.
Pseudocódigo
TEXTO s1
s1 ← "mary"
ESCRIBIR(igualIgnoreMayúsculas(s1,"Mary"))
(* retorna VERDADERO *)
Java
String s1 = "mary";
System.out.println(s1.equalsIgnoreCase("Mary"));
// retorna TRUE
Retorna un String con los mismos caracteres pero convertidos en minúscula.
Pseudocódigo
TEXTO s1
s1 ← "Hola Mary"
ESCRIBIR(aMinuscula(s1))
(* retorna "hola mary" *)
Java
String s1="Hola Mary" ;
System.out.println(s1.toLowerCase());
// muestra por pantalla "hola mary"
Retorna un String con los mismos caracteres pero convertidos en mayúscula.
Pseudocódigo
TEXTO s1
s1 ← "Hola Mary"
ESCRIBIR(aMayuscula(s1))
(* retorna "HOLA MARY" *)
Java
String s1 = "Hola Mary";
System.out.println(s1.toUpperCase();
// retorna "HOLA MARY"
Retorna un String con los mismos caracteres que cadena, pero remueve los espacios por delante y detrás
Pseudocódigo
TEXTO pausa
pausa ← " Hmmm "
System.out.println(pausa.trim())
(* muestra "Hmmm" sin espacios *)
Java
String pausa = " Hmmm ";
System.out.println(pausa.trim());
// muestra "Hmmm" sin espacios
Retorna el carácter que en cadena se encuentra en la posición pos. La posición se cuenta 0, 1, 2, etc.
Pseudocódigo
TEXTO saludo
saludo ← "Hola !"
ESCRIBIR(caracterEnPosicion(saludo,0))
(* muestra 'H'*)
ESCRIBIR(caracterEnPosicion(saludo,3))
(* muestra 'a'*)
Java
String saludo = "Hola !" ;
System.out.println(saludo.charAt(0));
// muestra 'H'
System.out.println(saludo.charAt(3));
// muestar 'a'
Retorna la subcadena de cadena desde la posición indicada hasta el final.
Pseudocódigo
TEXTO prueba
prueba ← "AbcdefG" ;
ESCRIBIR(subcadena(prueba,2))
(* muestra " cdefG")
Java
String prueba = "AbcdefG" ;
System.out.println(prueba.substring(2));
// muestra por pantalla "cdefG"
Retorna la subcadena de cadena desde la posición inicial hasta otra posición final sin incluirla.
Pseudocódigo
TEXTO prueba
prueba ← "AbcdefG" ;
ESCRIBIR(subcadena(prueba,2,5))
(* muestra "cde")
Java
String prueba = "AbcdefG" ;
System.out.println(prueba.substring(2,5));
// muestra por pantalla "cde"
Retorna la posición de la primer ocurrencia de cadena2 dentro de cadena1. Las posiciones se cuentan 0,1,2, etc. Retorna -1 si cadena2 no existe dentro de cadena1.
Pseudocódigo
TEXTO saludo
saludo ← "Hola Mary"
ESCRIBIR(indiceDe(saludo,"Mary"))
(* retorna 5 *)
ESCRIBIR(indiceDe(saludo,"Sally");
(* retorna -1 *)
Java
String saludo = "Hola Mary";
System.out.println(saludo.indexOf("Mary"));
// retorna 5
saludo.indexOf("Sally"));
// retorna -1
Retorna la posición de la primer ocurrencia de cadena2 dentro de cadena1, a partir de la posición ini. Las posiciones se cuentan 0,1,2, etc. Retorna -1 si cadena2 no existe dentro de cadena1.
Pseudocódigo
TEXTO saludo
saludo ← "Hola Mary";
ESCRIBIR(indiceDe(saludo,"Mary",1))
(* muestra 5 *)
ESCRIBIR(indiceDe(saludo,"Mary",8))
(* muestra -1 *)
Java
String saludo = "Hola Mary";
System.out.println(saludo.indexOf("Mary",1));
// muestra 5
System.out.println(saludo.indexOf("Mary",8));
// muestra -1
Retorna la posición de la última ocurrencia de cadena2 dentro de cadena1. Las posiciones se cuentan 0,1,2,etc. Retorna -1 si cadena2 no existe dentro de cadena1.
Pseudocódigo
TEXTO s1
s1 ← "Mary, Mary, Mary no"
ESCRIBIR(ultimoIndiceDe(s1,"Mary"))
(* retorna 12 *)
Java
String s1 = "Mary, Mary, Mary no"
System.out.println(s1.lastIndexOf("Mary"));
// retorna 12
Compara cadena1 con cadena2 de acuerdo a su orden lexicográfico (que es equivalente al alfabético si las letras están todas en minúsculas o mayúsculas). Si el cadena1 es menor que cadena2 devuelve un valor negativo, si son iguales devuelve 0 y si cadena1 es mayor devuelve un número positivo.
Pseudocódigo
TEXTO entrada
entrada ← "aventura"
ESCRIBIR(compararA(entrada,"zoo"))
(* retorna un valor negativo *)
ESCRIBIR(compararA(entrada,"abajo"))
(* retorna un valor positivo *)
Java
String entrada = "aventura";
System.out.println(entrada.compareTo("zoo"));
// retorna un valor negativo
System.out.println(entrada.compareTo("abajo"));
// retorna un valor positivo
Pseudocódigo
ALGORITMO recorrido() RETORNA ∅
(* solicita al usuario una cadena y obtiene
cada uno de sus caracteres*)
TEXTO cadena
ENTERO i, lon
ESCRIBIR("Ingrese una cadena")
LEER(cadena)
lon <- longitud(cadena) - 1
PARA i= 0 HASTA lon PASO 1 HACER
ESCRIBIR(caracterEnPosicion(cadena, i))
FIN PARA
FIN ALGORITMO
Java
import java.util.Scanner;
public class JavaApplication35 {
public static void main(String[] args) {
// TODO code application logic here
Scanner s = new Scanner(System.in);
String cadena;
int i, lon;
System.out.println("Ingrese una cadena");
cadena = s.nextLine();
lon = cadena.length()
for (i = 0; i < lon ; i++) {
System.out.println(cadena.charAt(i));
}
}
}
Pseudocódigo
ALGORITMO recorrido() RETORNA ∅
(* solicita al usuario una cadena y
como desea el usuario descomponer
la cadena*)
TEXTO cadena, orden
ENTERO i, lon
ESCRIBIR("Ingrese una cadena")
LEER(cadena)
ESCRIBIR("Indique en que orden desea
descomponer la palabra (normal o inverso):")
LEER(orden)
lon <- longitud(cadena) - 1
SI igual(orden,"normal") ENTONCES
PARA i= 0 HASTA lon PASO 1 HACER
ESCRIBIR(caracterEnPosicion(cadena, i))
FIN PARA
SINO
SI igual(orden,"inverso") ENTONCES
PARA i= lon HASTA 0 PASO -1 HACER
ESCRIBIR(caracterEnPosicion(cadena, i))
FIN PARA
FIN SI
FIN SI
FIN ALGORITMO
Java
import java.util.Scanner;
public class JavaApplication35 {
public static void main(String[] args) {
// solicita al usuario una cadena y
// como desea el usuario descomponer
// la cadena
Scanner s = new Scanner(System.in);
String cadena, orden;
int i, lon;
System.out.println("Ingrese una cadena");
cadena = s.nextLine();
System.out.println("Indique en que orden desea
descomponer la palabra (normal o inverso):");
orden = s.nextLine();
lon = cadena.length() - 1;
if (orden.equals("normal")) {
for (i = 0; i <= lon ; i++) {
System.out.println(cadena.charAt(i));
}
} else if (orden.equals("inverso")) {
for (i = lon ; i >= 0; i--) {
System.out.println(cadena.charAt(i));
}
}
}
}
Problema: Dada una cadena obtener la posición de un caracter en la cadena.
Pseudocódigo
MÓDULO obtenerPosiciónEnCadena(TEXTO cadena, CARACTER carac ) RETORNA ENTERO
(* devolver la primera posición de un caracter en una cadena, si no lo encuentra retorna -1
cadena: la cadena a recorrer
carac: el caracter del cual se desea obtener la posicion en la cadena*)
ENTERO iter, longitud, pos
LOGICO encontrado
pos ← -1
iter ← 0
encontrado ← FALSO
longitud ← longitud(cadena)
MIENTRAS ((iter < longitud) AND ! encontrado) HACER
SI ( caracterEnPosicion(cadena, iter) = carac ) ENTONCES
pos ← iter
Encontrado ← VERDADERO
SINO
iter ← iter+1
FIN SI
FIN MIENTRAS
RETORNA pos
FIN MÓDULO principal
ALGORITMO principal() RETORNA ∅
(* obtener la primera posición de un caracter en una cadena*)
TEXTO cadena
CARACTER caracABuscar
ENTERO posicion
ESCRIBIR(“Ingrese la cadena de caracteres”)
LEER(cadena)
ESCRIBIR(“Ingrese un caracter del cual se desea obtener su posición en la cadena”)
LEER(caracABuscar)
posicion ← obtenerPosiciónEnCadena(cadena, caracABuscar)
ESCRIBIR(“El caracter ”+ caracABuscar +” esta en la posición: “+ posicion)
FIN ALGORITMO principal
Java
import java.util.Scanner;
public class JavaApplication40 {
public static int obtenerPosicion(String cadena, char e) {
/** obtiene la posición de la primera
* ocurrencia de un caracter en una cadena
* cadena: cadena a evaluar
* e: caracter del cual se desea
* obtener su primera posición
*/
int pos = -1;
int longitud, i;
boolean encontrado = false;
i = 0;
longitud = cadena.length();
while ((i < longitud) & !encontrado) {
if (cadena.charAt(i) == e) {
pos = i;
encontrado = true;
} else {
i++;
}
}
return pos;
}
public static void main(String[] args) {
int posicion;
String cadena;
char carac;
Scanner s = new Scanner(System.in);
System.out.println("Por favor ingrese una cadena");
cadena = s.next();
System.out.println("Por favor ingrese una caracter");
carac = s.next().charAt(0);
posicion = obtenerPosicion(cadena, carac);
System.out.println("El caracter esta en la posicion: " + posicion);
}
}
Problema: ada una cadena obtener la cantidad de ocurrencias de un caracter en la cadena.
Pseudocódigo
MÓDULO cantOcurrencias(TEXTO cadena, CARACTER e) RETORNA ENTERO
(* obtiene la posición de la ocurrencia de un caracter
es un ejemplo de un recorrido TOTAL o
exhaustivo
cadena: cadena a evaluar
e: caracter del cual se desea obtener la
cantidad de ocurrencias *)
ENTERO cant, longitud, i
cant ← 0
longitud ← longitud(cadena) -1
PARA i ← 0 HASTA longitud PASO 1 HACER
SI (caracterEnPosicion(cadena, i) = e )
ENTONCES
cant ←cant + 1
FIN SI
FIN PARA
RETORNAR cant
FIN MÓDULO cantOcurrencias
ALGORITMO principal() RETORNA ∅
(* obtener la primera posición de un caracter en una cadena*)
TEXTO cadena
CARACTER caracABuscar
ENTERO posicion
ESCRIBIR(“Ingrese la cadena de caracteres”)
LEER(cadena)
ESCRIBIR(“Ingrese un caracter del cual
se desea obtener su posición en la cadena”)
LEER(caracABuscar)
posicion ← obtenerPosiciónEnCadena(cadena, caracABuscar)
ESCRIBIR(“El caracter ”+ caracABuscar +” esta en la posición: “+ posicion)
FIN ALGORITMO principal
Java
import java.util.Scanner;
public class JavaApplication40 {
public static int cantOcurrencias(String cadena, char e) {
// obtiene la posicion de la ocurrencia de un caracter
// es un ejemplo de un recorrido TOTAL o exhaustivo
// cadena: cadena a evaluar
// e: caracter del cual se desea obtener la cantidad de ocurrencias
int cant = 0;
int longitud, i;
longitud = cadena.length();
for (i = 0; i < longitud; i++) {
if (cadena.charAt(i) == e) {
cant++;
}
}
return cant;
}
public static void main(String[] args) {
int posicion;
String cadena;
char carac;
Scanner s = new Scanner(System.in);
System.out.println("Por favor ingrese una cadena");
cadena = s.next();
System.out.println("Por favor ingrese una caracter");
carac = s.next().charAt(0);
System.out.println("La cantidad de ocurrencias es: " +
cantOcurrencias(cadena, carac));
}
}
Problema: Obtener el menor nombre en orden lexicográfico, de un número predeterminado de nombres ingresados por el usuario.
Busqueda Menor Lexicográficamente Busqueda Menor Lexicográficamente
Problema: Solicitar al usuario una cadena de caracteres. Luego obtener:
1. Su Longitud
2. El caracter en la posición 5.
3. Obtener la inversa de la cadena
4. Contar la cantidad de ocurrencias de un caracter en la cadena
5. Verificar la existencia de un caracter
6. Contar la cantidad de vocales en una cadena
El siguiente .java muestra un ejemplo utilizando modularización.