ola buenas alguien que me revise este código y me diga si estas bien hecho y si se puede hacer un poco mas corto
Esto es lo que hace
1. Cree una 5 funciones, donde cada una reciba en un arreglo de tamaño 100, una cadena de caracteres. Cada función debe retornar:
1. La longitud de la cadena
2. El número de vocales
3. Caracteres alfabéticos en minúsculas
4. Caracteres alfabéticos en mayúsculas
5. Caracteres dígitos.
Ejemplo: Si se leyó la siguiente cadena:
Todo Lo Que Puedas Imaginar es reaL 2016
Cada función retornará:
Longitud: 40
Vocales: 15
Minúsculas: 23
Mayúsculas: 6
Digitos: 4
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <ctype.h>
int contar_vocales(char *);
int mayusculas(char a[]);
int minusculas(char a[]);
int contar_caracteres(char a[]);
int contar_numeros(char a[]);
int main()
{
char cad[500],*p;
int longi,x,P,V;
int mini,mayu;
printf("Ingrese un texto: ");
gets(cad);
longi = strlen(cad);
//Contador palabras
P=0;
mayu= mayusculas(cad);
mini = minusculas(cad);
printf("\nCantidad de MAYUSCULAS: %d",mayu);
printf("\nCantidad de minusculas: %d",mini);
//vocales y caracteres
printf("\nCantidad de Vocales: %d",contar_vocales(cad));
V = contar_vocales(cad);
printf("\nCantidad de caracteres: %d",contar_caracteres(cad));
printf("\nCantidad de muneros: %d",contar_numeros(cad));
}
int mayusculas(char a[])//
{
int i;
int contador=0;// CONTADOR DE PALABRAS
int verificador=0;//VERIFICADOR DEL COMIENZO Y FINAL DE CADA PALABRA
for (i=0; a[i]!='\0'; i++)
{
if (a[i]>='A' && a[i]<='Z')
{
contador=contador + 1;
}
}
return (contador);
}
int minusculas(char a[])//
{
int i;
int contador=0;// CONTADOR DE PALABRAS
int verificador=0;//VERIFICADOR DEL COMIENZO Y FINAL DE CADA PALABRA
for (i=0; a[i]!='\0'; i++)
{
if (a[i]>='a' && a[i]<='z')
{
contador=contador + 1;
}
}
return (contador);
}
int contar_vocales(char *cad)
{
int cont=0;
char *aux=cad;
while(*aux)
{
if(*aux=='a'||*aux=='e'||*aux=='i'||*aux=='o'||*aux=='u'||*aux=='A'||*aux=='E'||*aux=='I'||*aux=='O'||*aux=='U')
cont++;
aux++;
}
return cont;
}
int contar_caracteres(char a[])
{
int i;
int contador=0;// CONTADOR DE PALABRAS
for (i=0; a[i]!='\0'; i++)
{
contador++;
}
return (contador);
}
int contar_numeros(char a[])
{
int i;
int contador=0;// CONTADOR DE PALABRAS
for (i=0; a[i]!='\0'; i++)
{
if (a[i]>='1' && a[i]<='9' or a[i]=='0')
{
contador++;
}
}
return (contador);
}
Gracias
La de numeros se puede mejorar
if (a[i]>='0' && a[i]<='9' )
ahora cambia el gets por fgets:
fgets(cad,500,stdin);
ya que con el gets eres vulnerable a buffer overflow (Si le metes mas de 500 caracteres vas a sobre escribir variables del programa)
Saludos!
Podrias "acortar" (mas bien compactar) si quitas todas las llaves de bloque { } que no tienen ninguna funcion, ejemplo:
if (a[i]>='A' && a[i]<='Z')
{
contador=contador + 1;
}
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;
printf("Ingrese un texto: ");
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. :silbar: :silbar: 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. :D
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