Bienvenido(a), Visitante. Favor de ingresar o registrarse.
Diciembre 02, 2008, 12:06:51
Inicio Ayuda Buscar Ingresar Registrarse
Noticias: Foro de Java, C++ y más.

Nuevo foro de Control de versiones.

+  Foros Java y C/Linux
|-+  Programación
| |-+  C/C++ linux
| | |-+  problema con cadenas de caracteres
« anterior próximo »
Páginas: [1] Enviar tema Imprimir
Autor Tema: problema con cadenas de caracteres  (Leído 488 veces)
lem
Full Member
***
Mensajes: 105


Ver Perfil


« en: Junio 21, 2008, 05:53:39 »

Hola
Se trata  de implementar una función que acepte como entrada una cadena de caracteres y la modiofique poniendo en mayúsculas la primera letra de cada palabra excepto para las palabras "de" y "con".Se considera que empieza una palabra al principio de la cadena y después de un espacio.Por ejemplo,si la frase de entrada es "quiero pan con queso de mi pueblo",la cadena modificada será "Quiero Pan con Queso de Mi Pueblo".

Código:
void pon_en_mayusculas( char e[], char s[] )
   {
   int lon=strlen(e), i=0;
   while ( e[i]!='\0' )  // MIENTRAS NO HAYA ACABADO LA PALABRA DE ENTRADA:
      {
      // ESTAMOS ANTE PRIMERA LETRA DE UNA PALABRA:
          // SI PALABRA ES 'de' O 'con' => PRIMERA LETRA EN MINUSCULA, SI NO => EN MAYUSCULA
      if (i+2<=lon && e[i]=='d' && e[i+1]=='e' && (e[i+2]==' ' || e[i+2]=='\0'))
         s[i] = e[i];

¿Qué significa la condición de if?.Es decir,i+2 es la posición 2 de la cadena de caracteres?
En línea
chuidiang
Administrator
Hero Member
*****
Mensajes: 1974



Ver Perfil WWW Email
« Respuesta #1 en: Junio 21, 2008, 06:08:41 »

Hola:

Ese if está tratando de comprobar que la posición i tiene una d, la siguiente una e y la siguiente un espacio o fin de cadena, es decir,

Código:
e[i] == 'd'
e[i+1] == 'e'
e[i+2] == '\n' o '\0'
Pero para poder comparar con i+1 y con i+2, debe asegurarse que NO se sale del array, es decir, que i+2 no sobrepasa el final del array, es decir, que i+2<longitud, y ese el el primer trozo del if

Se bueno.
« Última modificación: Junio 21, 2008, 10:37:23 por chuidiang » En línea

lem
Full Member
***
Mensajes: 105


Ver Perfil
« Respuesta #2 en: Junio 21, 2008, 06:14:51 »

Pero que no nos salgamos del array ¿no lo hace la condición del primer while?

Gracias por tu ayuda
En línea
chuidiang
Administrator
Hero Member
*****
Mensajes: 1974



Ver Perfil WWW Email
« Respuesta #3 en: Junio 21, 2008, 10:38:32 »

Hola:

El while va recorriendo todo los elementos uno a uno, pero dentro del while se mira i+1 e i+2. Esos dos valores pueden salirse de rango al final. (la i no ya que lo controla el while, pero sí i+1 o i+2).

Se bueno.
En línea

lem
Full Member
***
Mensajes: 105


Ver Perfil
« Respuesta #4 en: Junio 22, 2008, 02:24:42 »

OK

Claro,claro ahora lo he entendido.puede ser que "de" o "con" estén cercanos a salirse de la cadena,por eso la instrucción i+2<=lon e i+3<=lon.

Gracias por tu ayuda y paciencia
En línea
lem
Full Member
***
Mensajes: 105


Ver Perfil
« Respuesta #5 en: Junio 22, 2008, 06:07:57 »

Código:
void pon_en_mayusculas( char e[], char s[] )
   {
   int lon=strlen(e), i=0;
   while ( e[i]!='\0' )  // MIENTRAS NO HAYA ACABADO LA PALABRA DE ENTRADA:
      {
      // ESTAMOS ANTE PRIMERA LETRA DE UNA PALABRA:
          // SI PALABRA ES 'de' O 'con' => PRIMERA LETRA EN MINUSCULA, SI NO => EN MAYUSCULA
      if (i+2<=lon && e[i]=='d' && e[i+1]=='e' && (e[i+2]==' ' || e[i+2]=='\0'))
         s[i] = e[i];
      else if (i+3<=lon && e[i]=='c' && e[i+1]=='o' && e[i+2]=='n' && (e[i+3]==' ' || e[i+3]=='\0') )
         s[i] = e[i];
      else
         s[i] = toupper(e[i]);
         
      i++;
      while (e[i]!=' ' && e[i]!='\0') // COPIAMOS RESTO PALABRA ACTUAL, SI TIENE MAS CARACTERES
         {
         s[i] = e[i];
         i++;
         }
      if (e[i]==' ') // SI LA PALABRA TERMINA CON ' ':                     
         {
         s[i] = ' ';  // COPIAMOS EL ' '
         i++;         // Y NOS SITUAMOS SOBRE INICIO SIGUIENTE PALABRA
         }
      }
   s[i]='\0';  // TERMINAMOS LA CADENA DE SALIDA
   }

Si la frase que inroducimos en el array original no empieza con "de" ni con "de",entonces la primera letra que se copie en el array modificado será en mayúscula pero al hacerse i++ pasará al siguiente elemento del array original que también lo pondrá en mayúscula que no es lo que pide el problema.
Por otro lado,no entiendo el segundo bucle donde dice copiamos el resto de la palabra actual si tiene más caracteres.

Gracias
En línea
chuidiang
Administrator
Hero Member
*****
Mensajes: 1974



Ver Perfil WWW Email
« Respuesta #6 en: Junio 22, 2008, 09:40:12 »

Hola:

Símplemente, si la palabra no empieza con "c" de "con" ni con "d" de "de", entonces podemos saltarnos la palabra. Eso es lo que hace el bucle, seguir avanzando hasta encontrar un espacio (fin de palabra y principio de la siguiente) o un \0, que es el final de cadena.

Se bueno.
En línea

lem
Full Member
***
Mensajes: 105


Ver Perfil
« Respuesta #7 en: Junio 23, 2008, 01:25:11 »

OK
Gracias Chiundiang.
Los problemas de cadenas de caracteres me resultan complicados ya que no "veo" implementar lo que me piden,es decir,entiendo como funcionan las cosas (bucles,estructuras,cadenas,etc.)pero luego no sé armarlo para llegar al resultado final.
Gracias de nuevo
En línea
Páginas: [1] Enviar tema Imprimir 
« anterior próximo »
Ir a:  


Ingresar con nombre de usuario, contraseña y duración de la sesión

Powered by MySQL Powered by PHP Powered by SMF 1.1.5 | SMF © 2006-2007, Simple Machines LLC XHTML 1.0 válido! CSS válido!