Autor
|
Tema: Programa capitalizador (Leído 4,798 veces)
|
yuna88
Desconectado
Mensajes: 11
|
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: "); printf("La frase capitalizada es: %s\n",frase ); 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
|
|
|
En línea
|
|
|
|
eferion
Desconectado
Mensajes: 1.248
|
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 ] == ' ' ); }
|
|
|
En línea
|
|
|
|
yuna88
Desconectado
Mensajes: 11
|
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
|
|
« Última modificación: 21 Abril 2014, 17:55 pm por yuna88 »
|
En línea
|
|
|
|
leosansan
Desconectado
Mensajes: 1.314
|
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:........................ 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); ......................................
La frase capitalizada es: I Love This Game
Process returned 0 (0x0) execution time
¡¡¡¡ Saluditos! ..... !!!!
|
|
|
En línea
|
|
|
|
Blaster
Desconectado
Mensajes: 190
|
Para que la salida sea la correcta, en la llamada a la función toupper esta linea: 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 frase[(i++)+1] = toupper(frase[i+1]);
Un gusto volver a pasar aqui.. Saludos
|
|
« Última modificación: 21 Abril 2014, 19:14 pm por Blaster »
|
En línea
|
|
|
|
leosansan
Desconectado
Mensajes: 1.314
|
Para que la salida sea la correcta, en la llamada a la función toupper esta linea: 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 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: 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! ..... !!!!
|
|
|
En línea
|
|
|
|
yuna88
Desconectado
Mensajes: 11
|
Hola leosansan,Decirte que Blaster tiene razón. Sí ejecuto tú código, el resultado es: I ove his ameEn cambio, si añado el +1 al indice i, aparece la frase correctamente. Un saludo y gracias a ambos por la ayuda
|
|
« Última modificación: 21 Abril 2014, 20:06 pm por yuna88 »
|
En línea
|
|
|
|
Blaster
Desconectado
Mensajes: 190
|
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..
|
|
|
En línea
|
|
|
|
leosansan
Desconectado
Mensajes: 1.314
|
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! ..... !!!!
|
|
« Última modificación: 21 Abril 2014, 20:49 pm por leosansan »
|
En línea
|
|
|
|
Blaster
Desconectado
Mensajes: 190
|
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..
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Programa que hace click en un lugar fuera del programa [c#]
.NET (C#, VB.NET, ASP)
|
Un usuario
|
1
|
2,949
|
24 Octubre 2006, 22:58 pm
por SeniorX
|
|
|
programa de matriz aver si el programa q estoy haciendo esta bien
« 1 2 »
Programación C/C++
|
eduardo17445
|
10
|
7,474
|
23 Octubre 2012, 00:11 am
por flony
|
|
|
[Ayuda] ¿Cómo ejecutar otro programa desde mi programa de C#?
.NET (C#, VB.NET, ASP)
|
Zodiak98
|
1
|
7,439
|
8 Diciembre 2013, 01:51 am
por Eleкtro
|
|