Tema: vocales
Ver Mensaje Individual
  #7 (permalink)  
Antiguo 14/04/2005, 06:36
Avatar de jam1138
jam1138
/** @package Moderador */
 
Fecha de Ingreso: julio-2004
Ubicación: sèveR led onieR lE
Mensajes: 9.368
Antigüedad: 19 años, 9 meses
Puntos: 102
Quedó... pongo el código para a quien le sirva y para que "lo critíquen".

El ejercicio consiste en recivir una cadena, imprimirla en orden inverso intercalando Mayúsculas y mnúsculas, indicar su longitud y las vocales que contiene:
Código:
#include <stdio.h>
#include <ctype.h>
#include <string.h>

main() {
     char cadena[100], vocales[20]="aeiouAEIOUáéíóúÁÉÍÓÚ", to='m';
// cadena será donde guardaré lo tecleado por el usuario
// vocales lo manejaré como arreglo para buscarlas... ya no hice el toupper porque no hayé la forma para "convertir" las acentuadas.. así que mejor las tratamos igual
// to será una variable auxiliar para saber si la última LETRA fue mayúscula ó minúsculas
     int i, j, voc=0, lg;
// i la ocuparé para desplazarme en cadena
// j para desplazarme en vocales
// voc será donde guardaré el total de vocales
// lg guardaré la longitud de la cadena

     gets(cadena);

     lg=strlen(cadena);
     for(i=lg-1; i>=0; i++) { // decidí hacer un bucle inverso para aprobecharlo al imprimir y no hacerlo por aparte... ahorro de recusos ¿no?
          if(isalpha(cadena[i])) { // solo si es LETRA... para casos como:  "a A b5T!!!!i" que verdaderamente sea intercalar Mayus/minus 
               for(j=0; j<20; j++) {
                    if(cadena[i]==vocales[j]) { // si es vocal
                         voc++; // sumamos
                         break; // terminamos el ciclo... ahorro de recursos y aprovechamos su uso
                    }
                    if(to=='M') { // si la anterior fue mayúscula
                         cadena[i]= tolower(cadena[i]);
                         to='m'; // guardamos que ésta es minúscula SOLO SI SE HIZO EL CAMBIO
                    } else {
                         cadena[i]= toupper(cadena[i]);
                         to='M';
                    }
// Solo hemos hechos cambios a letras "normales".. las acentuadas no han cambiado... por lo que...
                    if (j>=10 && j<15 && to='M') // el rango de 'j' nos indica que es una letra minúscula acentuada y el 'to' nos indica si se "trato" de cambiarla... no por el simple hecho de que esté acentuada significa que se hará el cambio.
                         cadena[i]= vocales[j+5]; // su posición actual +5 nos da la misma letra en mayúscula
                    else if (j>=15 && j<20 && to='m')
                         cadena[i]= vocales[j-5]; // lo mismo pero al contrario
               }
               printf("%c", cadena[i]); // imprimos el último carácter que trabajamos... 
          }
          printf("\nLongitud: %d\n", lg); // ya fuera del ciclo
          printf("Vocales: %d\n", voc);
     }

return 0;
}
Y listo... sin mayor ciencia.. espero no haberlo comentado demasiado y que dichos comentarios solo confundan en vez de explicar ... Bueno, notese que tube especial cuidado.. en cadenas que expliqué en los comentarios...

Preguntas: Por ahí tenia un error que se lo adjudiqué a la función isalpha() (por ello mi pregunta anterior), entionces la cambié por !isspace()... pero salió peor... ¿alguién podría explicarme ese comportamiento extraño??.. ejemplo: tal como esta ahora, solo cambiando isalpha() por !isspace()... y uno ingresa solo una "á" ... no la cuenta como vocal.. ¿por qué?... no es espacio, cumple la condición y debió de seguir un comportamiento normal... .

Weereber.. Saludos a todos!
__________________
٩(͡๏̯͡๏)۶
» Cómo hacer preguntas de manera inteligente «

"100 años después, la revolución no es con armas, es intelectual y digital"