elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Recibir un String en uppercase y devolverlo lowercase y viceversa
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Recibir un String en uppercase y devolverlo lowercase y viceversa  (Leído 2,701 veces)
sebapoli00

Desconectado Desconectado

Mensajes: 20


Ver Perfil
Recibir un String en uppercase y devolverlo lowercase y viceversa
« en: 25 Marzo 2019, 23:01 pm »

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.


En línea

CalgaryCorpus


Desconectado Desconectado

Mensajes: 323


Ver Perfil WWW
Re: Recibir un String en uppercase y devolverlo lowercase y viceversa
« Respuesta #1 en: 26 Marzo 2019, 09:44 am »

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.


En línea

Aqui mi perfil en LinkedIn, invitame un cafe aqui
K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 1.008



Ver Perfil
Re: Recibir un String en uppercase y devolverlo lowercase y viceversa
« Respuesta #2 en: 26 Marzo 2019, 11:50 am »

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
En línea

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

Desconectado Desconectado

Mensajes: 20


Ver Perfil
Re: Recibir un String en uppercase y devolverlo lowercase y viceversa
« Respuesta #3 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;
}
En línea

Loretz

Desconectado Desconectado

Mensajes: 117


Ver Perfil
Re: Recibir un String en uppercase y devolverlo lowercase y viceversa
« Respuesta #4 en: 26 Marzo 2019, 21:32 pm »

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
  1. char* invertirFrase(char* frase) {
  2.  
  3.    char* i = frase;
  4.  
  5.    while( *frase ) {
  6.        if(*frase != 32)
  7.            *frase ^= 32;
  8.        frase++;
  9.    }
  10.    return i;
  11. }

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.

En línea

K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 1.008



Ver Perfil
Re: Recibir un String en uppercase y devolverlo lowercase y viceversa
« Respuesta #5 en: 26 Marzo 2019, 21:55 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
  1. if(caracter >= 'a' && caracter <= 'z')
  2.    caracter = caracter - ('a' - 'A');
  3. else if(caracter >= 'A' && caracter <= 'Z')
  4.    //... 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:
En línea

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

Desconectado Desconectado

Mensajes: 20


Ver Perfil
Re: Recibir un String en uppercase y devolverlo lowercase y viceversa
« Respuesta #6 en: 27 Marzo 2019, 22:03 pm »

Ya lo he resuelto ;)

adjunto como lo hice

Código
  1.  
  2. char *frase = copiarStr(palabra);
  3. char * auxiliar = frase;
  4. while (*auxiliar != '\0') {
  5. if (*auxiliar >= 'A' && *auxiliar <= 'Z') {
  6. *auxiliar += 32;
  7. }
  8. else if (*auxiliar >= 'a' && *auxiliar <= 'z') {
  9. *auxiliar -= 32;
  10. }
  11. auxiliar++;
  12. }
  13. return frase;
  14.  
  15.  
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines