hacer mas corto el programa y si esta bien hecho

Iniciado por creiko, 15 Septiembre 2016, 21:33 PM

0 Miembros y 1 Visitante están viendo este tema.

creiko

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


Código (cpp) [Seleccionar]


#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

AlbertoBSD

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!
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

HardForo

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;
}

HardForo:  foro de Hardware y programación

Se buscan Mods y colaboradores *

dato000

#3
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