buenas, tengo un problema que no logro resolver, yo recibo un string y esta en lowercase quiero devolverlo en uppercase y si recibo en uppercase devolverlo en lowercase pero sin usar las funciones de c++ toUpper o toLower.
lo he intentado hacer con el codigo ascii pero no lo consigo.
Ejemplo 1
Entrada: "hola MUNDO"
Salida: "HOLA mundo"
Ejemplo 2
Entrada: "EjErCiCiO C++"
Salido: "eJeRcIcIo c++"
*/
la firma del metodo:
char* invertirFrase (char* frase){
}
desde ya muchas gracias.
compara contra 'a' y 'z' o contra 'A' y 'Z' y si resulta cierto alguna de las comparaciones, convierte la letra en su "contrario" primero restandole la diferencia contra la 'a' o la 'A' mas cercana y sumandole esa diferencia a la 'a' o 'A', la que sea contraria.
o sea si la letra esta entre 'a' y 'z', la conviertes en su equivalente mayuscula haciendo
mayuscula = 'A' + (letra - 'a')
Si esta entre 'A' y 'Z' logica similar, te lo dejo propuesto.
Si quieres hacerlo usando alguna función predefinida, en la librería <cctype> (<ctype.h> para C) tienes dos funciones: <islower()> e <isupper()> que te indican si el caracter que le pasas está en mayúsculas o minúsculas. Pero el cambio de uno a otro lo tienes que hacer usando la idea de @CalgaryCorpus de todas formas.
Si no lo consigues puedes poner tu código (entre etiquetas) para que lo veamos y poder ayudarte.
Suerte :-X
lo he intentado como dices pero no ha funcionado, aclaro que es en c++
el siguiente codigo es lo que he intentado pero no ha funcionado
char* invertirPalabra(char* palabra){
int tamano = longitud(palabra);
char * palabra2 = palabra;
for (int i = 0; i<tamano; i++) {
if (int (palabra) >= 97 && int(palabra) <= 122) {
palabra2 = 'A' + (int(palabra) - 'a');
}
else if (int(palabra) >= 65 && int(palabra) <= 90) {
palabra2 = 'a' + (int(palabra) - 'A');
}
else {
palabra2 = palabra;
}
}
return palabra;
}
int longitud(char *cadena)
{
int i = 0;
while (cadena != '\0')
i++;
return i;
}
Un poco tarde, pero ...
Aprovechando la curiosidad de que en el sistema ASCII las mayúsculas y minúsculas difieren en el sexto bit (difieren en 32, el carácter ' ' espacio), se puede hacer:
char* invertirFrase(char* frase) {
char* i = frase;
while( *frase ) {
if(*frase != 32)
*frase ^= 32;
frase++;
}
return i;
}
Pero esto sólo vale para los caracteres ASCII desde la 'a' hasta la 'z' y desde la 'A' hasta la 'Z', peor no vale para las letras acentuadas o la eñe. Es sólo una curiosidad.
Cita de: sebapoli00 en 26 Marzo 2019, 18:56 PM
lo he intentado como dices pero no ha funcionado, aclaro que es en c++
el siguiente codigo es lo que he intentado pero no ha funcionado
char* invertirPalabra(char* palabra){
int tamano = longitud(palabra);
char * palabra2 = palabra;
for (int i = 0; i<tamano; i++) {
if (int (palabra) >= 97 && int(palabra) <= 122) {
palabra2 = 'A' + (int(palabra) - 'a');
}
else if (int(palabra) >= 65 && int(palabra) <= 90) {
palabra2 = 'a' + (int(palabra) - 'A');
}
else {
palabra2 = palabra;
}
}
return palabra;
}
int longitud(char *cadena)
{
int i = 0;
while (cadena != '\0')
i++;
return i;
}
Coloca el código entre etiquetas de código GeSHi (hay un desplegable encima del cuadro de texto)...
Lo primero decir que no hace falta que lo pases a ASCII. Los operadores < y > se pueden aplicar directamente a una variable de tipo <char>
if(caracter >= 'a' && caracter <= 'z')
caracter = caracter - ('a' - 'A');
else if(caracter >= 'A' && caracter <= 'Z')
//... este te lo dejo a ti;
Supongo que quieres cambiar la que se pasa como parámetro, no crear una nueva no?
Puedes usar el propio índice del <for> para recorrer toda la cadena y cambiar el valor que sea necesario sin usar punteros auxiliares. Suerte :rolleyes:
Ya lo he resuelto ;)
adjunto como lo hice
char *frase = copiarStr(palabra);
char * auxiliar = frase;
while (*auxiliar != '\0') {
if (*auxiliar >= 'A' && *auxiliar <= 'Z') {
*auxiliar += 32;
}
else if (*auxiliar >= 'a' && *auxiliar <= 'z') {
*auxiliar -= 32;
}
auxiliar++;
}
return frase;