Pues bueno, aquí va un intento simple, simplemente reutilizando una función pasando argumentos diferentes se puede hacer lo mismo:
#include <stdio.h>
#include <string.h>
#include <ctype.h>
enum Opciones
{
mayusculas = 0,
minusculas = 1,
vocales = 2,
numeros = 3,
caracteres = 4
};
int lectorCaracteres(char a[], int opcion);
int main()
{
char cadena[500];
int numeroMayusculas, numeroMinusculas, numeroVocales, numeroNumeros, numeroCaracteres;
gets(cadena
); // warning: unsafe (see fgets instead) //fgets (cadena , 500 , stdin);
//Llamando a metodos
numeroMayusculas = lectorCaracteres(cadena, mayusculas);
numeroMinusculas = lectorCaracteres(cadena, minusculas);
numeroVocales = lectorCaracteres(cadena, vocales);
numeroNumeros = lectorCaracteres(cadena, numeros);
numeroCaracteres = lectorCaracteres(cadena, caracteres);
// Imprimiendo Resultados
printf("\nCantidad de Mayúsculas: %d", numeroMayusculas
); printf("\nCantidad de Minúsculas: %d", numeroMinusculas
); printf("\nCantidad de Vocales: %d", numeroVocales
); printf("\nCantidad de Números: %d", numeroNumeros
); printf("\nCantidad de caracteres: %d", numeroCaracteres
);
return 0;
}
int lectorCaracteres(char cadena[], int opcion)//
{
int contador=0; // CONTADOR DE PALABRAS
switch(opcion)
{
//Mayúsculas
case 0:
for (int i=0; cadena[i]!='\0'; i++)
{
if (cadena[i]>='A' && cadena[i]<='Z')
{
//contador=contador + 1;
contador++;
}
}
break;
//Minúsculas
case 1:
for (int i=0; cadena[i]!='\0'; i++)
{
if (cadena[i]>='a' && cadena[i]<='z')
{
//contador=contador + 1;
contador++;
}
}
break;
//Vocales
case 2:
for (int i=0; cadena[i]!='\0'; i++)
{
if( cadena[i]=='a' || cadena[i]=='e' || cadena[i]=='i' || cadena[i]=='o' || cadena[i]=='u' ||
cadena[i]=='A' || cadena[i]=='E' || cadena[i]=='I' || cadena[i]=='O' || cadena[i]=='Y' )
{
contador++;
}
}
break;
//Numeros
case 3:
for (int i=0; cadena[i]!='\0'; i++)
{
if( cadena[i]>='0' && cadena[i]<='9' )
{
contador++;
}
}
break;
//Caracteres
case 4:
for (int i=0; cadena[i]!='\0'; i++)
{
contador++;
}
break;
default:
contador=0;
break;
}
return (contador);
}
Ahora, estoy seguro que se puede optimizar ese switch, pero creo que ahi se da una idea de como puede pulirse un código.
Para ser un trabajo de novato se nota el empeño en utilizar diversos metodos para lograr resultados, ese tipo de investigación es un gran paso para aprender desarrollo y en general se necesita ese tipo de dedicación en este tipo de cosas.
En general falta un poco más de organización y de seguir un estandar, no usar funciones diversas a lo loco y variables a diestra y siniestra, pues es un desperdicio de recursos y un completo enredo para el desarrollador, es mejor tratar de seguir un determinado patron de uso para hacer más facil el soporte y elevar la escalabilidad de código.
Slds