Programa capitalizador

Iniciado por yuna88, 21 Abril 2014, 16:16 PM

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

yuna88

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:


#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

int main()
{
char frase[100];

printf("Introduce una frase: ");
scanf("%s",&frase);

frase[0]=toupper(frase[0]);

printf("La frase capitalizada es: %s\n",frase);

system("PAUSE");
return 0;
}
 

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  :-*

eferion

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".


int espacio = 0;
int i;
for ( i = 0; frase[ i ] != '\0'; i++ )
{
  if ( espacio )
  {
    // A mayusculas
  }
  else
  {
    // A minusculas
  }

  espacio = ( frase[ i ] == ' ' );
}

yuna88

#2
Cita de: 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".


int espacio = 0;
int i;
for ( i = 0; frase[ i ] != '\0'; i++ )
{
 if ( espacio )
 {
   // A mayusculas
 }
 else
 {
   // A minusculas
 }

 espacio = ( frase[ i ] == ' ' );
}


Hola eferion,

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

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

Y luego... En los comentarios // A mayúsculas y //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  :-*


leosansan



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

........................
  int i;
  char frase[]="i love This GAME";
  frase[0]=toupper(frase[0]);
  for (i=1;frase[i];i++)
    if (frase[i]==' ')
      frase[(i++) +1]=toupper(frase[i]);
    else
      frase[i]=tolower(frase[i]);
  printf("La frase capitalizada es: %s\n",frase);
......................................


Citar
La frase capitalizada es: I Love This Game

Process returned 0 (0x0)   execution time

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



Blaster

#4
Para que la salida sea la correcta, en la llamada a la función toupper esta linea:

Código (cpp) [Seleccionar]
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 (cpp) [Seleccionar]
frase[(i++)+1] = toupper(frase[i+1]);

Un gusto volver a pasar aqui..

Saludos


leosansan

Cita de: 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 (cpp) [Seleccionar]
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 (cpp) [Seleccionar]
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! ..... !!!!



yuna88

#6
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  :-*

Blaster

Cita de: leosansan en 21 Abril 2014, 19:22 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..

leosansan

#8
Ya lo dicen, más vale una imagen.....




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! ..... !!!!



Blaster

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..