MAYUSCULA

Iniciado por anita0421, 20 Noviembre 2012, 02:06 AM

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

anita0421

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

#include <iostream>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
using namespace std;
int main()
{
char nombre [25];
puts ("tu nombre es?:");
gets(nombre);
nombre[0]= toupper(nombre[0]);

puts ("\n\n Tu nombre es"), puts(nombre);

   puts("\n\n");

system("pause");
return 0;
}

rir3760

Lo primero a cambiar en el programa son los nombres de los encabezados:
Código (cpp) [Seleccionar]
#include <stdlib.h>
#include <string.h>
#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 (cpp) [Seleccionar]
#include <cstdlib>
#include <cctype>
#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 (cpp) [Seleccionar]
gets(nombre);

// Descartamos los espacios al principio de la cadena
int i;
for (i = 0; isspace(nombre[i]); i++)
   ;
// Se cambia a mayuscula el primer caracter
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|.

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

anita0421

mmmm creo que me malinterpretaste... solo quiero que el segundo nombre de la persona lleve mayuscula tambien

Ferno

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.

rir3760

OK. Sorry.

En ese caso y como ya comento Ferno puedes utilizar dos bucles, mas o menos asi:
Código (cpp) [Seleccionar]
// Lectura del nombre completo (es mejor utilizar getline)
gets(nombre);

// Primer caracter (nombre) a mayusculas
nombre[0] = toupper(nombre[0]);

// Ignoramos el nombre (encontramos el primer espacio)
int i;
for (i = 1; !isspace(nombre[i]); ++i)
   ;

// Ignoramos los espacios despues del nombre
while (isspace(nombre[++i]))
   ;

// Primer caracter (Apellido) a mayusculas
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
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

anita0421

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?

rir3760

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

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 (cpp) [Seleccionar]
char nombre[25];
int i;

puts("Tu nombre es?:");
gets(nombre); // gets puede fallar o leer una linea vacia ...

nombre[0] = toupper(nombre[0]);
for (i = 2; nombre[i] != '\0'; i++)
   if (nombre[i - 1] == ' ' && isalpha(nombre[i]))
      nombre[i] = toupper(nombre[i]);


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

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language