Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: anita0421 en 20 Noviembre 2012, 02:06 am



Título: MAYUSCULA
Publicado por: anita0421 en 20 Noviembre 2012, 02:06 am
hola!

tengo una duda
cómo podria cambiar este código de C++ para que no importe cuantos espacios ponga, el segundo nombre de la persona me salga con mayuscula tambien??

esto es lo que tengo

Código
  1. #include <iostream>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <stdio.h>
  5. using namespace std;
  6. int main()
  7. {
  8. char nombre [25];
  9. puts ("tu nombre es?:");
  10. gets(nombre);
  11. nombre[0]= toupper(nombre[0]);
  12.  
  13. puts ("\n\n Tu nombre es"), puts(nombre);
  14.  
  15.    puts("\n\n");
  16.  
  17. system("pause");
  18. return 0;
  19. }
  20.  


Título: Re: MAYUSCULA
Publicado por: rir3760 en 20 Noviembre 2012, 02:47 am
Lo primero a cambiar en el programa son los nombres de los encabezados:
Código
  1. #include <stdlib.h>
  2. #include <string.h>
  3. #include <stdio.h>
No es necesario <string.h>, en su lugar se debe incluir <cctype> ya que ahí se encuentra el prototipo de la función "toupper":
Código
  1. #include <cstdlib>
  2. #include <cctype>
  3. #include <cstdio>

Y para ignorar los espacios al principio de la cadena puedes utilizar un bucle y la funcion "isspace" (prototipo en <cctype>):
Código
  1. gets(nombre);
  2.  
  3. // Descartamos los espacios al principio de la cadena
  4. int i;
  5. for (i = 0; isspace(nombre[i]); i++)
  6.   ;
  7. // Se cambia a mayuscula el primer caracter
  8. nombre[i] = toupper(nombre[i]);
Por cierto no te recomiendo utilizar funciones de la biblioteca estándar de C como "puts" y "gets" si estas aprendiendo C++. En su lugar concéntrate en las facilidades de este como "cin", "cout", etc.

Si deseas consultar mas recomendaciones revisa el tema |Lo que no hay que hacer en C/C++. Nivel basico| (http://foro.elhacker.net/programacion_cc/lo_que_no_hay_que_hacer_en_cc_nivel_basico-t277729.0.html).

Un saludo


Título: Re: MAYUSCULA
Publicado por: anita0421 en 20 Noviembre 2012, 05:17 am
mmmm creo que me malinterpretaste... solo quiero que el segundo nombre de la persona lleve mayuscula tambien


Título: Re: MAYUSCULA
Publicado por: Ferno en 20 Noviembre 2012, 05:28 am
Bueno, pero es básicamente el mismo code que posteó rir3760 con el agregado de leer antes el primer nombre.

Es decir, lees el nombre completo, el primer caracter a mayúscula, lees el nombre entero hasta topar con un espacio (que indica que el primer nombre terminó). Luego utilizas el code de rir3760 y listo.


Título: Re: MAYUSCULA
Publicado por: rir3760 en 20 Noviembre 2012, 15:16 pm
OK. Sorry.

En ese caso y como ya comento Ferno puedes utilizar dos bucles, mas o menos asi:
Código
  1. // Lectura del nombre completo (es mejor utilizar getline)
  2. gets(nombre);
  3.  
  4. // Primer caracter (nombre) a mayusculas
  5. nombre[0] = toupper(nombre[0]);
  6.  
  7. // Ignoramos el nombre (encontramos el primer espacio)
  8. int i;
  9. for (i = 1; !isspace(nombre[i]); ++i)
  10.   ;
  11.  
  12. // Ignoramos los espacios despues del nombre
  13. while (isspace(nombre[++i]))
  14.   ;
  15.  
  16. // Primer caracter (Apellido) a mayusculas
  17. nombre[i] = toupper(nombre[i]);

Debe funcionar pero tiene sus limitaciones: 1) Se puede hacer mas corto con funciones de la biblioteca estándar de C como "strspn" (mejor utilizar las facilidades de C++ como la clase "string") y 2) no tiene validaciones (revienta si no hay apellido, lo cual no es tan malo considerando el programa puede reventar desde el uso de "gets").

Un saludo


Título: Re: MAYUSCULA
Publicado por: anita0421 en 21 Noviembre 2012, 02:21 am
ohh yo tenia este

/* Este programa cambia el primer caracter de cada palabra
   a su respectiva mayuscula. Valida caracter por caracter,
   si se encuentra un espacio ' ' reemplaza el siguiente
   caracter "indice+1" a su respectiva mayuscula. Concluye
   hasta encontrar un fin de cadena '\0' que es el ultimo
   caracter en una cadena (char)
*/

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

using namespace std;

int main()
{
   int indice;
   char nombre[25];
   
   puts("Tu nombre es?: "), gets(nombre);
   
    nombre[0]=toupper(nombre[0]);
   
   for (indice=0; nombre[indice]!='\0'; indice++)
      if (nombre[indice]==' ')
         nombre[indice+1]=toupper(nombre[indice+1]);

   puts("\n\nTu nombre es "), puts(nombre) ;
   
   puts("\n\n");
   
   
   system("PAUSE");
       return 0;
}




pero mi profe dijo que el algoritmo hacia mucho trabajo "cambiando" cada espacio a mayuscula... pero no se como hacer que se ahorre ese "trabajo"

no se si me de a entender, el codigo hace su trabajo si pones cualquier nombre te devuelve las dos iniciales con mayuscula aunque pongas 10 espacios, pero el profe dijo que debia hacer el procedimiento mas rapido de otra manera, (no se cual es) podrian ayudarme?


Título: Re: MAYUSCULA
Publicado por: rir3760 en 21 Noviembre 2012, 19:01 pm
El primer detalle a considerar: ignorando las pocas excepciones (como "using namespace std;") ese programa es C cuando tu estas aprendiendo C++. También se debe evitar el uso de la función "gets" y la biblioteca "conio" de Borland. Mas información en el tema |Lo que no hay que hacer en C/C++. Nivel basico| (http://foro.elhacker.net/programacion_cc/lo_que_no_hay_que_hacer_en_cc_nivel_basico-t277729.0.html).

Regresando al programa la forma mas sencilla es: 1) Cambias el primer carácter de forma manual (al parecer esta garantizado que este sea alfabético) y 2) Cambias a mayúsculas el primer carácter alfabético a continuación de un espacio.

Mas o menos así:
Código
  1. char nombre[25];
  2. int i;
  3.  
  4. puts("Tu nombre es?:");
  5. gets(nombre); // gets puede fallar o leer una linea vacia ...
  6.  
  7. nombre[0] = toupper(nombre[0]);
  8. for (i = 2; nombre[i] != '\0'; i++)
  9.   if (nombre[i - 1] == ' ' && isalpha(nombre[i]))
  10.      nombre[i] = toupper(nombre[i]);

Pero de nuevo la preocupación es que no estas aprendiendo C++.

Un saludo