Foros del Web » Programación para mayores de 30 ;) » C/C++ »

[SOLUCIONADO] Capitalizar un nombre con c/c++

Estas en el tema de Capitalizar un nombre con c/c++ en el foro de C/C++ en Foros del Web. Hola, soy nueva aqui y a veces me confundo programando y me complico la vida ya se que existe la libreria cctype.h para convertir a ...
  #1 (permalink)  
Antiguo 13/11/2014, 15:15
 
Fecha de Ingreso: noviembre-2014
Mensajes: 5
Antigüedad: 9 años, 5 meses
Puntos: 0
Pregunta Capitalizar un nombre con c/c++

Hola, soy nueva aqui

y a veces me confundo programando y me complico la vida

ya se que existe la libreria cctype.h para convertir a Mayusculas y minuscula pero en la clase no vamos por ese tema todavia asi que no pedo usarlas. La idea del programa es que tu introduces tu nombre con apellido desordenado con mayusculas y minusculas donde se te ocurra y tu las reimprimes ya capitalizadas, ordenadas

He llegado hasta este codigo y ya me ordena el nombre y lo imprime, para el apellido quiero usar un for que inicie donde se quedo anteriormente y que haga lo mismo, pero nose como inicializar ese segundo for para el apellido
Código:
#include<stdio.h>
#include <stdlib.h>
int main ()
{
    int i;

    char nombre[20], nom[20], ape[20];

    printf("introduce tu nombre completo: ");
    gets(nombre);
    if(nombre[0]>=97 && nombre[0]<=122)
        printf("%c",nombre[0]-32);
    else
    {printf("%c",nombre[0]);}

    for(i=1; nombre[i]!=32;i++)//evaluar despues de el 0 de la cadena
    {
            if(nombre[i]>=65 && nombre[i]<=90)
                printf("%c", nombre[i]+32);
            else printf("%c", nombre[i]);
    }

    return 0;
    }
  #2 (permalink)  
Antiguo 13/11/2014, 17:35
 
Fecha de Ingreso: octubre-2013
Mensajes: 44
Antigüedad: 10 años, 5 meses
Puntos: 5
Respuesta: Capitalizar un nombre con c/c++

Hola.

Si no he entendido mal, lo que pretendes es esto: EsTdAR -> Estdar. Asi que vamos por partes:

1) Te recomiendo, es que no utilices un bucle for, utiliza un while. ¿Por qué? Bueno, los bucles for son utilizados cuando conoces tanto el inicio como el final de una iteración, algo que no conoces a no ser que calcules el tamaño de la cadena una vez introducida.

2) Por otro lado, te aconsejaria que en vez de mostrar por pantalla cada caracter, mostraras la cadena ya transformada.

3) No utilices gets() pudiendo utilizar scanf().

Una vez dicho esto, vamos allá con la implemetentación:

Código:
#include <stdio.h>
#include <stdlib.h>
int main ()
{
    int i;

    char nombre[20], nom[20], ape[20];

    printf("introduce tu nombre completo: ");
    scanf("%s",nombre);     // Leer cadena y almacenarla en nombre

    if(nombre[0]>=97 && nombre[0]<=122)
        nombre[0] = nombre[0]-32;   // equivalente a: nombre[i] -= 32;

    i=1;

    while (nombre[i] != '\0'){      //mientras no se llegue al final de la cadena, ejecutar

        if(nombre[i]>=65 && nombre[i]<=90)
            nombre[i] = nombre[i]+32;   // equivalente a: nombre[i] += 32;
        i++;
    }

    printf("%s\n",nombre);    // mostrar resultado por pantalla

    return 0;
}
Saludos
  #3 (permalink)  
Antiguo 13/11/2014, 17:37
 
Fecha de Ingreso: noviembre-2014
Mensajes: 36
Antigüedad: 9 años, 5 meses
Puntos: 13
Respuesta: Capitalizar un nombre con c/c++

Cita:
Iniciado por Estdar123455 Ver Mensaje
para el apellido quiero usar un for que inicie donde se quedo anteriormente y que haga lo mismo, pero nose como inicializar ese segundo for para el apellido
Para que utilizar un segundo for si con solo uno te basta y sobra un ejemplo:

Código C++:
Ver original
  1. #include <stdio.h>
  2. #include <stdbool.h>
  3. #include <ctype.h>
  4.  
  5. int main(void)
  6. {
  7.     char str[30];
  8.     bool c = false;
  9.     int i;
  10.  
  11.     printf("Introduce tu nombre completo: ");
  12.     scanf("%30[^\n]", str);
  13.  
  14.     for( i = 0; str[i] != '\0'; i++ )
  15.         if( str[i] == ' ' ) c = false;
  16.         else if( c == false )
  17.             str[i] = toupper(str[i]), c = true;
  18.         else
  19.             str[i] = tolower(str[i]);
  20.  
  21.     printf("%s\n", str);
  22.  
  23.     return(0);
  24. }

Saludos
  #4 (permalink)  
Antiguo 14/11/2014, 01:21
Avatar de leosansan  
Fecha de Ingreso: mayo-2012
Ubicación: GRAN CANARIA
Mensajes: 194
Antigüedad: 11 años, 11 meses
Puntos: 49
Respuesta: Capitalizar un nombre con c/c++

Cita:
Iniciado por kutcher Ver Mensaje
Para que utilizar un segundo for si con solo uno te basta
..................................................
Eso mismo opino yo, pero sin stdbool, como otro ejemplo:

Código C++:
Ver original
  1. #include <stdio.h>
  2. #include <ctype.h>
  3.  
  4. int main ( void ) {
  5.   unsigned char i , frase [ ] = "  i   l o v e      this     gaME  Leo sanSa n " ;
  6.   for ( i = 1 ; frase [ i ] ; i++ )
  7.     if ( frase [ i ] == ' ' && frase [ i + 1 ] != ' ' )
  8.       frase [ ( ++i ) ] = toupper ( frase [ i ] ) ;
  9.     else
  10.       frase [ i ] = tolower ( frase [ i ] ) ;
  11.   return frase[0]=toupper(frase[0]),printf("La frase capitalizada es: %s\n",frase),0;
  12. }

¡¡¡¡Que me gusta el "return"¡¡¡¡

¡¡¡Saluditos!!!

  #5 (permalink)  
Antiguo 14/11/2014, 01:36
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: Capitalizar un nombre con c/c++

Cita:
Iniciado por kutcher Ver Mensaje
Para que utilizar un segundo for si con solo uno te basta y sobra un ejemplo:
Te propongo las siguientes mejoras:
* No uses la librería "ctype", es un requisito.
* si str[30], entonces scanf("%30[^\n]", str) es inseguro, te deja introducir 30 caracteres más el correspondiente nulo.
* es más estándar poner return EXIT_SUCCESS a return 0.

Código C++:
Ver original
  1. #include <stdbool.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4.  
  5. int main(void)
  6. {
  7.   char str[31];
  8.   bool toCapital = true;
  9.   char* ptr = str - 1;
  10.  
  11.   printf("Introduce tu nombre completo: ");
  12.   scanf("%30[^\n]", str);
  13.  
  14.   while( *++ptr )
  15.   {
  16.     if( *ptr == ' ' )
  17.       toCapital = true;
  18.     else if( toCapital == true )
  19.     {
  20.       if ( *ptr >= 'a' && *ptr <= 'z' )
  21.         *ptr += ('A' - 'a');
  22.       toCapital = false;
  23.     }
  24.     else
  25.     {
  26.       if ( *ptr >= 'A' && *ptr <= 'Z' )
  27.         *ptr += ('a' - 'A');
  28.     }
  29.   }
  30.  
  31.   printf("%s\n", str);
  32.  
  33.   return EXIT_SUCCESS;
  34. }
  #6 (permalink)  
Antiguo 14/11/2014, 01:38
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: Capitalizar un nombre con c/c++

Cita:
Iniciado por leosansan Ver Mensaje

Código C++:
Ver original
  1. if ( frase [ i ] == ' ' && frase [ i + 1 ] != ' ' )
y si, por algún casual, la cadena termina con un espacio??
  #7 (permalink)  
Antiguo 14/11/2014, 01:43
 
Fecha de Ingreso: noviembre-2014
Mensajes: 5
Antigüedad: 9 años, 5 meses
Puntos: 0
Respuesta: Capitalizar un nombre con c/c++

Bueno gracias a los que respondieron, pero mencione que no debia usar las tolower y to upper de la cctype.h

Bueno el caso es que ya realice el codigo y hace lo que yo queria que hiciera y el otro for que queria simplemente continua donde se quedo el anterior,es decir antes del espacio (por que el usuario va a introducir el Nombre y el Apellido y pues son dos palabras separadas y cada una debe de empezar con MAYUS y el resto deben ser minusculas) y los for son secuenciales uno tras otro
Código:
#include<iostream>
#include<stdio.h>
#include <stdlib.h>
int main ()
{
    int i;

    char nombre[20];

    printf("introduce tu nombre completo: ");
    gets(nombre);
    if(nombre[0]>=97 && nombre[0]<=122)
        printf("Nombre: %c",nombre[0]-32);
    else
    {printf("Nombre: %c",nombre[0]);}

    for(i=1; nombre[i]!=32;i++)//evaluar despues de el 0 de la cadena
    {
            if(nombre[i]>=65 && nombre[i]<=90)
                printf("%c", nombre[i]+32);
            else printf("%c", nombre[i]);
    }
    for(int j=i+1; j<i+2;j++)
            {
                if(nombre[j]>=97 && nombre[j]<=122)
                printf("\nApellido: %c", nombre[j]-32);
                else
                    {printf("\nApellido: %c",nombre[j]);}

            }
    for(int k=i+2; nombre[k]!='\0';k++)
            {
                if(nombre[k]>=65 && nombre[k]<=90)
                printf("%c", nombre[k]+32);
            else printf("%c", nombre[k]);
            }
    return 0;
    }
Caso contrario a que cuando yo usaba string en lugar de caracter en el string si debia saber exactamente las posiciones en donde se habia quedado la cadena al llegar al espacio y me ignoraba la conversion de las letras que debian ir en MAYUS, o sea las primeras de cada palabra
  #8 (permalink)  
Antiguo 14/11/2014, 02:20
Avatar de leosansan  
Fecha de Ingreso: mayo-2012
Ubicación: GRAN CANARIA
Mensajes: 194
Antigüedad: 11 años, 11 meses
Puntos: 49
Respuesta: Capitalizar un nombre con c/c++

Cita:
Iniciado por eferion Ver Mensaje
y si, por algún casual, la cadena termina con un espacio??
El ejemplo que propuse en el código termina en espacio, por ejemplo.

¡¡¡Saluditos!!!

  #9 (permalink)  
Antiguo 14/11/2014, 03:27
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: Capitalizar un nombre con c/c++

Cita:
Iniciado por leosansan Ver Mensaje
El ejemplo que propuse en el código termina en espacio, por ejemplo.

¡¡¡Saluditos!!!

Cierto... estaba yo con la cosa de no usar strtoupper y claro... lo que seguía a eso únicamente podía ser modificar el final de cadena si o si...

Mil disculpas :)
  #10 (permalink)  
Antiguo 14/11/2014, 03:53
Avatar de leosansan  
Fecha de Ingreso: mayo-2012
Ubicación: GRAN CANARIA
Mensajes: 194
Antigüedad: 11 años, 11 meses
Puntos: 49
Respuesta: Capitalizar un nombre con c/c++

Cita:
Iniciado por eferion Ver Mensaje
Cierto... estaba yo con la cosa de no usar strtoupper y claro... lo que seguía a eso únicamente podía ser modificar el final de cadena si o si...

Mil disculpas :)
De nada eferion son cosas que suceden posiblemente por la rapidez en las respuestas.

Gracias a ti por mirarlo.

¡¡¡Saluditos!!!


Etiquetas: cadena, mayusculas, minusculas
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 05:25.