Universidad Autónoma Gabriel René Moreno
Facultad de Ciencias de la Computación
Materia: Programación I, Grupo SD.
Tema: Tratamiento de Caracteres en Cadenas
Docente: Lic. Edwin Vargas Yapura.
Cadenas de Caracteres.
Una cadena de caracteres, es una secuencia de caracteres agrupados con un nombre.
En java, una cadena se escribe entre comillas dobles y un carácter se escribe entre comillas simples.
String s1 = “programa”; // Se declara e inicializa.
Internamente se representa como un Arreglo de Caracteres:
s1 = ´p´ ´r´ ´o´ ´g´ ´r´ ´a´ ´m´ ´a´
0 1 2 3 4 5 6 7
El primer caracter, se almacena en la posición 0 de la cadena s1.
El segundo caracter, se almacena en la posición 1 de la cadena s1.
-------
El n-ésimo caracter, se almacena en la posición n-1 de la cadena s1.
Las cadenas en JAVA, son instancias de la clase String, son objetos de la clase String, por tanto, los caracteres
De una cadena, se acceden a través del método charAt(i).
[Link](0) : devuelve el carácter ´p´. JS: [Link](0) or s1[0] (indexado)
[Link](4) : devuelve el carácter ´a´. JS: [Link](4) or s1[4] (indexado)
Métodos de Clases & Objetos.
En el mundo de la programación, en programación orientada a objetos, se maneja dos tipos de métodos:
a) Métodos de clases, se invocan desde una clase.
b) Métodos de objetos, se invocan desde un objeto de clase.
[Link](ch) : Método lógico que devuelve True, si ch es un carácter dígito.
[Link](ch) : Método lógico que devuelve True, si ch es una letra.
[Link](ch) : Método lógico que devuelve True, si ch es una letra minúscula.
[Link](ch) : Método lógico que devuelve True, si ch es una letra mayúscula.
Los métodos se invocan desde la clase Character.
[Link](n) : Método que devuelve el valor absoluto de n.
[Link](n, x) : Método que devuelve una potencia de n elevado a la x.
[Link](n) : Método que devuelve la raíz cuadrada de n.
Los métodos se invocar desde la clase Math.
String s1 = new String(“programa”); // String s1 = “programa”;
[Link]() : Método que devuelve la longitud o cantidad de caracteres de la cadena s1.
[Link](i) : Método que devuelve el caracter de la posición i, de la cadena s1.
Los métodos se invocan desde un objeto s1, instancia de la clase String.
Tabla de valores ASCII.
char-dígitos letras-may letras-min
ord char ord char ord char
48 0 65 A 97 a
49 1 66 B 98 b
50 2 67 C 99 c
51 3 68 D 100 d
52 4 - - - -
53 5 - - - -
54 6 87 W 119 w
55 7 88 X 120 x
56 8 89 Y 121 y
57 9 90 Z 122 z
Los caracteres en los Lenguajes de Programación, se manejan de acuerdo a los valores de la tabla
ASCII, la precedencia se identifica de acuerdo a sus valores ordinales en esta tabla.
Consultas sobre caracteres, sin librería.
esLetra(ch) : Función Lógica que devuelve True, si el carácter ch, es una Letra.
//JAVA // JS
public static boolean esLetra(char ch){ function esLetra(ch){
return esLetraMay(ch) || esLetraMin(ch); return esLetraMay(ch) || esLetraMin(ch);
} }
public static boolean esLetraMay(char ch){ function esLetraMay(ch){
return ch >= 'A' && ch <= 'Z'; return ch >= "A" && ch <= "Z";
} }
public static boolean esLetraMin(char ch){ function esLetraMin(ch){
return ch >= 'a' && ch <= 'z'; return ch >= "a" && ch <= "z";
} }
esDigito(ch) : Función Lógica que devuelve True, si el caracter ch, es un caracter dígito.
//JAVA // JS
public static boolean esDigito(char ch){ function esDigito(ch){
return ch >= '0' && ch <= '9'; return ch >= "0" && ch <= "9";
} }
Algoritmos sobre los caracteres de una Cadena.
mismosChar(s1, s2) : Función Lógica que devuelve True, si las cadenas s1 y s2 tienen los mismos caracteres.
public static boolean mismosChar(String s1, String s2){ Para resolver este problema, utilizaremos
return estanTodos(s1, s2) && estanTodos(s2, s1); las propiedades de conjuntos iguales.
}
public static boolean estanTodos(String s1, String s2){
int i = 0;
Todos los caracteres de la cadena s1, se
while(i < [Link]()){ encuentran en la cadena s2.
if(!seEncuentra(s2, [Link](i))) return false; AND
i = i + 1;
} Todos los caracteres de la cadena s2, se
return true; encuentran en la cadena s1.
}
public static boolean seEncuentra(String s1, char ch){
int i = 0; Observar, que el Algoritmo es similar
while(i < [Link]()){ al problema de mismosDig(n, m). La
if([Link](i) == ch) return true; lógica es la misma, solo cambia la
i = i + 1; referencia a los elementos.
}
return false;
}
Algoritmos sobre los caracteres de una Cadena.
frecuencia(s1, ch) : Función que devuelve la cantidad de veces que aparece el caracter ch en la cadena s1.
public static int frecuencia(String s1, char ch){
int i = 0, c = 0; Nuevamente, este Algoritmos tiene la misma
while(i < [Link]()){ lógica que la frecuencia de dígitos entero.
if([Link](i) == ch) c = c + 1;
i = i + 1; En ambos, son las mismas inicializaciones y
} las mismas condiciones.
return c;
}
menorChar(s1) : Función que devuelve el menor caracter de la cadena s1.
public static char menorChar(String s1){
La lógica es similar a encontrar el menor
char men = [Link](0);
int i = 0;
dígito de un entero. Se fundamenta en la
while(i < [Link]()){ lógica de utilizar una variable auxiliar.
if([Link](i) < men) men = [Link](i);
i = i + 1; La Lógica para encontrar el mayor caracter
} de la cadena es la misma, solo cambia la
return men; pregunta.
}
JAVA, [Link]() :
JS, [Link] : Método que devuelve la cantidad de caracteres de la cadena s1.
Algoritmos sobre los caracteres de una Cadena.
diferentes(s1) : Función Lógica que devuelve True, si todos los caracteres de la cadena s1, son diferentes.
public static boolean diferentes(String s1){
int i = 0; Para resolver este problema, se requieren
while(i < [Link]()){ necesariamente dos ciclos anidados para
int j = i + 1; comparar un carácter con todos los caracteres
while(j < [Link]()){ de su derecha, solamente.
if([Link](i) == [Link](j)) return false;
j = j + 1; Cuando encuentra un carácter que se repite,
} sale del ciclo y la función. Ya no tiene sentido
i = i + 1; seguir comparando.
}
return true;
}
Otra Lógica.
public static boolean diferentes(String s1){
Si todos los dígitos se repiten solo una vez en
int i = 0;
while(i < [Link]()){ la cadena, entonces todos ellos son diferentes.
if(frecuencia(s1, [Link](i)) > 1) return false;
i = i + 1;
Si hay algún caracter que aparece más de una
} vez en la cadena, sale del ciclo y la función.
return true;
}
Algoritmos sobre los caracteres de una Cadena.
iguales(s1) : Función Lógica que devuelve True, si todos los caracteres de la cadena s1, son iguales.
public static boolean iguales(String s1){
int i = 0;
while(i < [Link]()){ Si todos los caracteres son iguales al primer
if([Link](i) != [Link](0)) return false; carácter, entonces la cadena tiene todos sus
i = i + 1; caracteres iguales.
}
return true;
}
Otra Lógica.
public static boolean iguales(String s1){ Cada carácter se compara con el siguiente carácter,
int i = 0; si son iguales, se pasa a la siguiente posición.
while(i < [Link]() - 1){
if([Link](i) != [Link](i + 1)) return false; El ciclo recorre hasta el penúltimo carácter, que
i = i + 1; puede compararse con su siguiente. El último no
}
tiene siguiente.
return true;
}
Otra Lógica.
public static boolean iguales(String s1){ Todos los caracteres son iguales, si la cantidad de
return frecuencia(s1, [Link](0)) == [Link](); veces que se repite el primer carácter en la cadena
} es igual a la cantidad de caracteres de la cadena.
Algoritmos sobre los caracteres de una Cadena.
charOrdenados(s1) : Función Lógica que devuelve True, si los caracteres de la cadena s1, están ordenados en
formas ascendente o descendente.
public static boolean charOrdenados(String s1){ En lo posible, divide el problema. El
return ordenAsc(s1) || ordenDesc(s1); código que se aproxime al enunciado.
}
public static boolean ordenAsc(String s1){
Rescatamos la lógica de comparar caracteres
int i = 0;
while(i < [Link]() - 1){ adyascentes, recorrer hasta el penúltimo
if([Link](i) > [Link](i+1)) return false; caracter.
i = i + 1;
} Internamente, lLos caracteres se comparan
return true; según la precedencia que aparece en la tabla
} de valores ASCII.
public static boolean ordenDesc(String s1){
int i = 0;
while(i < [Link]() - 1){ Es la misma Lógica que el anterior, solo
if([Link](i) < [Link](i+1)) return false; cambia la condición.
i = i + 1;
}
return true;
}
Algoritmos sobre los caracteres de una Cadena.
existeDigito(s1) : Función Lógica que devuelve True, si la cadena s1 contiene al menos un carácter dìgito.
public static boolean existeDig(String s1){ Recorre la cadena hasta encontrar un carácter
int i = 0; dígito o terminar de recorrer todos los caracteres
while(i < [Link]()){ de la cadena.
if(esDigito([Link](i))) return true;
i = i + 1; Se invoca un método desde una la clase Character.
} Asimismo, se invocar métodos desde un objeto que
return false; corresponde a la cadena.
}
puraLetras(s1) : Función Lógica que devuelve True, si la cadena s1 contiene pura letras.
public static boolean puraLetras(String s1){
int i = 0; La estructura de código, es similar al
while(i < [Link]()){ anterior. También se invocan métodos
if(!esLetra([Link](i))) return false; de clase y métodos de objetos.
i = i + 1;
}
return true;
}
Conclusiones
• Los Algoritmos descritos sobre los caracteres de una cadena, generalmente se pueden
generalizar o adaptar a otras estructuras de datos, es decir; muchas lógicas aplicadas
sobre los dígitos de un entero son las mismas lógicas para las cadenas. Asimismo, en los
temas posteriores, se seguirán utilizando estas lógicas en la resolución de problemas.
• Comenzamos a desarrollar algoritmos con el principio de divide y vencerás. Los
problemas grandes lo transformamos en problemas pequeños y vamos implementando
en la resolución de esos problemas.
• Distinguir el concepto entre caracter y cadena. Ambas tienen su propias librerías, la
representación interna de una cadena es un arreglo de caracteres. Se puede acceder a
ellos a través de un índice.
• Se hace mucho más interesante programar utilizando librerías, se mejora con la lógica de
razonamiento y nos ayuda a resolver problemas con algoritmos mucho mas sencillos de
implementar e interpretar.