Recibir un String en uppercase y devolverlo lowercase y viceversa

Iniciado por sebapoli00, 25 Marzo 2019, 23:01 PM

0 Miembros y 1 Visitante están viendo este tema.

sebapoli00

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.

CalgaryCorpus

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.
Aqui mi perfil en LinkedIn, invitame un cafe aqui

K-YreX

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
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;

sebapoli00

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;
}

Loretz

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:

Código (cpp) [Seleccionar]
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.


K-YreX

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>
Código (cpp) [Seleccionar]

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:
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;

sebapoli00

Ya lo he resuelto ;)

adjunto como lo hice

Código (cpp) [Seleccionar]


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;