| Ver tema anterior :: Ver siguiente tema | | Autor | Mensaje |
|---|
dementor3
Registrado: 14 Nov 2007 Mensajes: 7
| Publicado: 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
| Publicado: 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
| Publicado: 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
| Publicado: 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
| Publicado: 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 | |  | | |
| No puede crear mensajes No puede responder temas No puede editar sus mensajes No puede borrar sus mensajes No puede votar en encuestas
|
|
| |