Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: yuna88 en 21 Abril 2014, 16:16 pm



Título: Programa capitalizador
Publicado por: yuna88 en 21 Abril 2014, 16:16 pm
Hola a todos, necesito realizar un programa que al introducirle una frase en cualquier formato (mayúsculas o minúsculas) me capitalice la frase. Es decir sí introduzco I love This GAME el programa por pantalla me mostrará I Love This Game.

Paso a mostraros el código que tengo hasta ahora que de poco sirve porque solo me pone en mayúscula la primera palabra:

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <ctype.h>
  4.  
  5. int main()
  6. {
  7. char frase[100];
  8.  
  9. printf("Introduce una frase: ");
  10. scanf("%s",&frase);
  11.  
  12. frase[0]=toupper(frase[0]);
  13.  
  14. printf("La frase capitalizada es: %s\n",frase);
  15.  
  16. system("PAUSE");
  17. return 0;
  18. }
 

Para que el programa haga lo que realmente necesito, sería necesario que la primera letra de la frase fuera mayúscula y cada vez que se detecte un espacio, la siguiente letra también fuera en mayúscula. Creo que éste es el razonamiento correcto a éste programa, el problema es, que no se muy bien como plantearlo.

Espero que me podáis ayudar.

Un saludo  :-*


Título: Re: Programa capitalizador
Publicado por: eferion en 21 Abril 2014, 16:25 pm
cuando tienes que hacerle una pregunta al código, la solución es un if o un switch.

En tu caso, la opción lógica es un if.

Lo primero que necesitas es una variable para controlar si el carácter anterior era un espacio o no... algo tipo int espacio = 0; te valdría.

Después tienes que meter un bucle for que recorra toda la "frase". Recuerda que una cadena SIEMPRE termina con el carácter nulo '\0'. En cada iteración del bucle tienes que comprobar el valor de "espacio" y actuar en consecuencia... y no olvidarte de volver a actualizar "espacio".

Código
  1. int espacio = 0;
  2. int i;
  3. for ( i = 0; frase[ i ] != '\0'; i++ )
  4. {
  5.  if ( espacio )
  6.  {
  7.    // A mayusculas
  8.  }
  9.  else
  10.  {
  11.    // A minusculas
  12.  }
  13.  
  14.  espacio = ( frase[ i ] == ' ' );
  15. }


Título: Re: Programa capitalizador
Publicado por: yuna88 en 21 Abril 2014, 17:53 pm
cuando tienes que hacerle una pregunta al código, la solución es un if o un switch.

En tu caso, la opción lógica es un if.

Lo primero que necesitas es una variable para controlar si el carácter anterior era un espacio o no... algo tipo int espacio = 0; te valdría.

Después tienes que meter un bucle for que recorra toda la "frase". Recuerda que una cadena SIEMPRE termina con el carácter nulo '\0'. En cada iteración del bucle tienes que comprobar el valor de "espacio" y actuar en consecuencia... y no olvidarte de volver a actualizar "espacio".

Código
  1. int espacio = 0;
  2. int i;
  3. for ( i = 0; frase[ i ] != '\0'; i++ )
  4. {
  5.  if ( espacio )
  6.  {
  7.    // A mayusculas
  8.  }
  9.  else
  10.  {
  11.    // A minusculas
  12.  }
  13.  
  14.  espacio = ( frase[ i ] == ' ' );
  15. }

Hola eferion,

Primero de todo, darte las gracias por ofrecerte a ayudarme. Ahora paso a realizarte un par de preguntas.

¿La condición del
Código
  1. if
no está completa no? Falta algo...

Y luego... En los comentarios
Código
  1. // A mayúsculas
y
Código
  1. //A minúsculas
¿Te refieras que introduzca el código necesario para que la frase sea convertida respectivamente a esos formatos?

Muchas gracias de nuevo.

Un saludo  :-*

 


Título: Re: Programa capitalizador
Publicado por: leosansan en 21 Abril 2014, 17:56 pm


Creo que se podría hacer sin variable adicional, sin más que touppear el siguiente caracter a espacio, incrementando a un tiempo el índice y tampoco creo necesario indicar explicitamente el caracter nulo en el for. Algo como:

Código
  1. ........................
  2.  int i;
  3.  char frase[]="i love This GAME";
  4.  frase[0]=toupper(frase[0]);
  5.  for (i=1;frase[i];i++)
  6.    if (frase[i]==' ')
  7.      frase[(i++) +1]=toupper(frase[i]);
  8.    else
  9.      frase[i]=tolower(frase[i]);
  10.  printf("La frase capitalizada es: %s\n",frase);
  11. ......................................
  12.  

Citar
La frase capitalizada es: I Love This Game

Process returned 0 (0x0)   execution time

¡¡¡¡ Saluditos! ..... !!!!


(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)


Título: Re: Programa capitalizador
Publicado por: Blaster en 21 Abril 2014, 19:12 pm
Para que la salida sea la correcta, en la llamada a la función toupper esta linea:

Código
  1. frase[(i++)+1] = toupper(frase[i]);

De esta forma tu estas pasando en cada llamada a la función toupper el indice del caracter espacio, obteniendo asi resultados no deseados en la salida lo correcto seria
 
Código
  1. frase[(i++)+1] = toupper(frase[i+1]);

Un gusto volver a pasar aqui..

Saludos



Título: Re: Programa capitalizador
Publicado por: leosansan en 21 Abril 2014, 19:22 pm
Para que la salida sea la correcta, en la llamada a la función toupper esta linea:

Código
  1. frase[(i++)+1] = toupper(frase[i]);

De esta forma tu estas pasando en cada llamada a la función toupper el indice del caracter espacio, obteniendo asi resultados no deseados en la salida lo correcto seria
 
Código
  1. frase[(i++)+1] = toupper(frase[i+1]);

Un gusto volver a pasar aqui..

Saludos



Pues va a ser que no. He aquí una salida a tu idea:

Citar
La frase capitalizada es: I Oove Hhis Aame

Process returned 0 (0x0)   execution time

El motivo es que en frase[ i ], a la izquierda de toupper, se post-incrementa la variable i y al encontrase con el toupper a su derecha ya está incrementada dando mi código el resultado correcto, mientras el tuyo se pasa de caracter. ;)

¡¡¡¡ Saluditos! ..... !!!!


(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)


Título: Re: Programa capitalizador
Publicado por: yuna88 en 21 Abril 2014, 20:04 pm
Hola leosansan,

Decirte que Blaster tiene razón. Sí ejecuto tú código, el resultado es:
I ove his ame

En cambio, si añado el +1 al indice i, aparece la frase correctamente.

Un saludo y gracias a ambos por la ayuda  :-*


Título: Re: Programa capitalizador
Publicado por: Blaster en 21 Abril 2014, 20:16 pm
El motivo es que en frase[ i ], a la izquierda de toupper, se post-incrementa la variable i y al encontrase con el toupper a su derecha ya está incrementada dando mi código el resultado correcto, mientras el tuyo se pasa de caracter. ;)

Lamento contradecirte pero me temo que el valor de i como tu bien lo haz dicho se post-incrementa ya que antes de ocurrir el incremento el valor de i es utilizado en la asignación indicada para luego aumentar

Saludos..


Título: Re: Programa capitalizador
Publicado por: leosansan en 21 Abril 2014, 20:44 pm
Ya lo dicen, más vale una imagen.....


(http://i1280.photobucket.com/albums/a497/leosansan/GRAFICOS%202/primeraletrap_zps2921c18c.jpg)

(http://i1280.photobucket.com/albums/a497/leosansan/GRAFICOS%202/primeraletra_zps6a0b11e0.jpg)

De lo que no me cabe duda es de que usan el Dev-C++, ¿o no?.

Y yo no sólo uso Code::Blocks, también uso PellesC que es un purista y más, pero ya sabemos que Dev-C++ es lo que es ..... decepcionante, al menos para mi, pero vamos que no quiero empezar una diatriba sobre el tema. :)

Y sí, el incremento que hago es digamos que arriesgado, por algo me lanza un warning, pero eso lo hace más emocionante. :)


Pero nada, si te ha funcionado con el +1 a ponerlo y todos tan felices
.

¡¡¡¡ Saluditos! ..... !!!!


(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)


Título: Re: Programa capitalizador
Publicado por: Blaster en 21 Abril 2014, 20:58 pm
Estas equivocado yo uso el Code::Blocks 13.12 tambien tengo el PellesC y otros
y con respecto al codigo sigo manteniendo mi punto de vista de que deberia se como lo he indicado anteriormente, pero tu te niegas a ver el pequeño error que tiene

Saludos..


Título: Re: Programa capitalizador
Publicado por: leosansan en 21 Abril 2014, 21:57 pm
A ver si me logro explicar, ya que ni las imágenes parecen creibles.

Código
  1. if (frase[i]==' ')

es decir en la posición "i" hay un espacio. ¿Qué hago?.

Código
  1. frase[(i++) +1]=

cojo la posición "(i++)+1", es decir la posición "i+1" y "a continuación" (==> lo cual implica incremento de la "i)" hago:

Código
  1. =tolower(frase[i]);

donde la "i" que aparece debe haberse incrementado por el post-incremento previo y es ya la posición implícita "i+1".

Espero que haya quedado meridianamenteclara mi explicación.

Y para más claridad las imágenes que colgué en el mensaje anterior.

Y sí, las saqué del Code::Blocks 13.12 y ya me parecía excesivo colgar más.

Conclusión, a mi si me funciona así y a ti te funciona de la otra manera. :silbar:

Tampoco quiero hacer de este tema una controversia  sobre compiladores y demás. Sólo puse las imágenes para que quedará constancia que a mi si me funcionaba.


(http://i1280.photobucket.com/albums/a497/leosansan/GRAFICOS%202/primeraletraCB_zps9d453e7e.jpg)

(http://i1280.photobucket.com/albums/a497/leosansan/GRAFICOS%202/primeraletraPELLES_zpsb7bb865f.jpg)



Título: Re: Programa capitalizador
Publicado por: Blaster en 21 Abril 2014, 22:19 pm
La verdad que es muy raro ahora que lo he analizado a fondo lo probe de esta manera
Código
  1. frase[++i] = toupper(frase[i]);
Que es conceptualmente igual a esto frase[(i++)+1] pero con la diferencia de que asi me da la salida correcta con el Code::Blosks

Saludos..


Título: Re: Programa capitalizador
Publicado por: do-while en 21 Abril 2014, 22:20 pm
¡Buenas!

Ya que te han dado soluciones, te dejo aquí otra. Simplemente para que veas que si lo único que tiene que hacer el programa es poner en mayúsculas la primera letra de cada palabra y el resto en minúsculas, no te hace falta ninguna cadena (otra cosa sería si tuvieses que utilizar una función...):
Código
  1. #include <stdio.h>
  2. #include <ctype.h>
  3.  
  4. int main(int argc, char *argv[])
  5. {
  6.    int c,primera = 1;
  7.  
  8.    while((c = getchar()) != '\n')
  9.    {
  10.        if(isspace(c))
  11.        {
  12.            if(!primera)
  13.                primera = 1;
  14.  
  15.            putchar(c);
  16.        }
  17.        else if(primera)
  18.        {
  19.            putchar(toupper(c));
  20.            primera = 0;
  21.        }
  22.        else
  23.            putchar(tolower(c));
  24.  
  25.    }
  26.  
  27.    return 0;
  28. }
  29.  

¡Saludos!

Advertencia - mientras estabas escribiendo, una nueva respuesta fue publicada. Probablemente desees revisar tu mensaje.

Wop, todo eso suena a problemas en el orden de evaluación de los distintos compiladores (o igual incluso entre dos versiones distintas de un mismo compilador...). No se si el lenguaje define el orden de evaluación en estos casos o si depende del capricho del (de los) programador(es) del compilador...


Título: Re: Programa capitalizador
Publicado por: 1mpuls0 en 22 Abril 2014, 00:29 am
Si se deja más de un espacio los programas las soluciones de leosansan y Blaster el programa falla.

En cambio el programa de do-while tiene en consideración ese detalle.

Aquí otra forma (incluyendo si se dejan varios espacios en blanco)
Código
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. int main() {
  6.  
  7.    string text = "i love this game ok?";
  8.    int length = text.length();
  9.    text[0] = toupper(text[0]);
  10.  
  11.    for(int index=1;index<length;index++) {
  12.        if(text[index]!=' ') {
  13.            continue;
  14.        }
  15.  
  16.        if(text[index]=' ') {
  17.            cout<<' ';
  18.            index++;
  19.            text[index]=toupper(text[index]);
  20.        }
  21.    }
  22.  
  23.    cout << "La frase capitalizada es: " << text << endl;
  24.  
  25.    return 0;
  26. }
  27.