/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

Toupper Tolower y cadenas

 
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
dementor3



Registrado: 14 Nov 2007
Mensajes: 7

MensajePublicado: 07/12/2007 5:50 am
Título: Toupper Tolower y cadenas

Hola a todos, como estan.


bueno en clase de programacion el profe nos pidio hacer un programa que imprimiera en pantalla una cadena con las siguientes caracteristicas, usando puntero o apuntador


la primera y segunda letra esten en mayusculas la tercera en minuscula la cuarta y quinta en mayuscula y asi suscesivamente


yo lo hice con un ciclo while

ej:

#include <string.h>
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
main()
{
char cad1[30], *p;

printf("Ingrese Texto:");
gets(cad1);

while(*p)
{
printf("%c", toupper(*P++));
printf("%c", toupper(*P++));
printf("%c", tolower(*P++));
}
}



ahora el problema que nos planteo el profe es que la cadena se imprima en pantalla con las siguientes caracteristicas

la primera letra en mayuscula, las dos siguientes en minusculas, las 3 siguientes en mayusculas, las 4 siguientes en minusculas etc.


y ahi no ma quede, aun sigo pensando



y el otro problema que nos planteo es que se imprima en pantalla la siguente cadena con estas caracteristicas, que separe las vocales y consonates y que despues imprima en pantalla las vocales y al lado las consonantes por ejemplo si ingresamos la palabra automovil este debe quedar asi auooi tmvl


esperando sus respuestas


muchas gracias
_________________
The Hitman
Volver arriba
rir3760



Registrado: 01 Oct 2004
Mensajes: 3842
Ubicación: Mexico

MensajePublicado: 07/12/2007 9:31 am
Título:

Un problema con ese programa es no verificar la longitud de la cadena lo que puede llevar al proceso de caracteres que no son parte de la cadena. Por ejemplo si la cadena es "a" se procesarian dos caracteres adicionales.

La solucion a esto es procesar la cadena caracter por caracter verificando si el caracter procesado es multiplo de tres (el tercero, sexto, etc.), si es asi se imprime en minusculas, caso contrario se imprime en mayusculas.

Un programa de ejemplo en C estandar es:
Código:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

#define LONG_MAX_CADENA 32

int main(void)
{
   char cadena[LONG_MAX_CADENA];
   char *p;
   
   printf("Ingrese texto: ");
   fflush(stdout);
   if (fgets(cadena, LONG_MAX_CADENA, stdin) == NULL)
      return EXIT_FAILURE;
   if ((p = strchr(cadena, '\n')) != NULL)
      *p = '\0';
   
   for (p = cadena; *p != '\0'; p++)
      if ((p - cadena + 1) % 3 != 0)
         putchar(toupper(*p));
      else
         putchar(tolower(*p));
   putchar('\n');
   
   return EXIT_SUCCESS;
}


dementor3 escribió:
ahora el problema que nos planteo el profe es que la cadena se imprima en pantalla con las siguientes caracteristicas la primera letra en mayuscula, las dos siguientes en minusculas, las 3 siguientes en mayusculas, las 4 siguientes en minusculas etc.

Esto lo realizas con dos bucles: el externo indica el numero de veces que se debe imprimir en minuscula/mayuscula y el interno imprime esos caracteres. Para conocer si debe ser minusculas o mayusculas solo tienes que utilizar el operador de modulo como en el ejemplo anterior. Y por supuesto con las verificaciones necesarios para conocer cuando la cadena termina y no procesar caracteres "de mas".

dementor3 escribió:
y el otro problema que nos planteo es que se imprima en pantalla la siguente cadena con estas caracteristicas, que separe las vocales y consonates y que despues imprima en pantalla las vocales y al lado las consonantes por ejemplo si ingresamos la palabra automovil este debe quedar asi auooi tmvl

Solo tienes que procesar todos los caracteres de la cadena dos veces: primero verificas si un caracter es vocal y si es asi lo imprimes. La segunda pasada realiza la misma operacion pero ahora verificando si el caracter es consonante.

Un problema es que la bibliioteca estandar de C no provee funciones para verificar si un caracter es vocal o consonante, esto se soluciona desarrollando funciones propias basadas en isalpha (es alfabetico, prototipo en <ctype.h>) y strchr (prototipo en <string.h>):
Código:
int es_vocal(int ch)
{
   return strchr("AEIOUaeiou", ch) != NULL;
}

int es_consonante(int ch)
{
   return isalpha(ch) && !es_vocal(ch);
}


Un saludo
_________________
The capacity to learn is a gift;
The ability to learn is a skill;
The willingness to learn is a choice.
--
Rebec of Ginaz
Volver arriba
dementor3



Registrado: 14 Nov 2007
Mensajes: 7

MensajePublicado: 08/12/2007 4:02 pm
Título:

con respecto a los dos bucles me podrias hacer un ejemplo porfa realmente estoy colgado en esto gracias
_________________
The Hitman
Volver arriba
rir3760



Registrado: 01 Oct 2004
Mensajes: 3842
Ubicación: Mexico

MensajePublicado: 08/12/2007 5:21 pm
Título:

Pensandolo un poco no es necesario el uso de dos bucles, en su lugar basta con uno solo utilizando tres contadores: uno para procesar cada uno de los caracteres (la variable "i"), otro para llevar el conteo del numero de veces que debe imprimirse un caracter en mayusculas/minusculas (la variable "j") y por ultimo un contador para imprimir esa serie de caracteres (la variable "k").

El programa en C estandar seria asi:
Código:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

#define LONG_MAX_CADENA  64

int main(void)
{
   char cadena[LONG_MAX_CADENA];
   char *p;
   int i, j, k;
   
   puts("Introduce la cadena de texto:");
   if (fgets(cadena, LONG_MAX_CADENA, stdin) == NULL)
      return EXIT_FAILURE;
   if ((p = strchr(cadena, '\n')) != NULL)
      *p = '\0';
   
   for (i = 0, j = k = 1; cadena[i] != '\0'; i++){
      if (j % 2 == 1)
         putchar(toupper(cadena[i]));
      else
         putchar(tolower(cadena[i]));
     
      if (--k == 0)
         j = k = j + 1;
   }
   putchar('\n');
   
   return 0;
}


Un saludo
_________________
The capacity to learn is a gift;
The ability to learn is a skill;
The willingness to learn is a choice.
--
Rebec of Ginaz
Volver arriba
dementor3



Registrado: 14 Nov 2007
Mensajes: 7

MensajePublicado: 08/12/2007 6:38 pm
Título:

Amigo muchas gracias, tengo examenes estas semana y el profe nos dio estas tareas, ahora me falta comprenderlo y estoy listo, lo mas increible de todo es que este ramo no tiene que ver nada con mi carrera solo es un ramo mas


chao muchas gracias
_________________
The Hitman
Volver arriba
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Página 1 de 1Todas las horas están en GMT - 8 Horas

 
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com

Un proyecto de UrlanHeat.com