elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: ¿Eres nuevo? ¿Tienes dudas acerca del funcionamiento de la comunidad? Lee las Reglas Generales


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  hacer mas corto el programa y si esta bien hecho
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: hacer mas corto el programa y si esta bien hecho  (Leído 3,564 veces)
creiko

Desconectado Desconectado

Mensajes: 44


Ver Perfil
hacer mas corto el programa y si esta bien hecho
« en: 15 Septiembre 2016, 21:33 pm »

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
  1.  
  2. #include <stdio.h>
  3. #include <conio.h>
  4. #include <string.h>
  5. #include <ctype.h>
  6.  
  7. int contar_vocales(char *);
  8. int mayusculas(char a[]);
  9. int minusculas(char a[]);
  10. int contar_caracteres(char a[]);
  11. int contar_numeros(char a[]);
  12.  
  13. int main()
  14. {
  15. char cad[500],*p;
  16. int longi,x,P,V;
  17. int mini,mayu;
  18.  
  19. printf("Ingrese un texto: ");
  20. gets(cad);
  21. longi = strlen(cad);
  22. //Contador palabras
  23. P=0;
  24.  
  25.  
  26.  
  27.  
  28. mayu= mayusculas(cad);
  29. mini = minusculas(cad);
  30.  
  31. printf("\nCantidad de MAYUSCULAS: %d",mayu);
  32.  
  33. printf("\nCantidad de minusculas: %d",mini);
  34. //vocales y caracteres
  35. printf("\nCantidad de Vocales: %d",contar_vocales(cad));
  36. V = contar_vocales(cad);
  37. printf("\nCantidad de caracteres: %d",contar_caracteres(cad));
  38. printf("\nCantidad de muneros: %d",contar_numeros(cad));
  39.  
  40. }
  41.  
  42. int mayusculas(char a[])//
  43. {
  44. int i;
  45. int contador=0;// CONTADOR DE PALABRAS
  46. int verificador=0;//VERIFICADOR DEL COMIENZO Y FINAL DE CADA PALABRA
  47.  
  48. for (i=0; a[i]!='\0'; i++)
  49. {
  50. if (a[i]>='A' && a[i]<='Z')
  51. {
  52. contador=contador + 1;
  53. }
  54. }
  55. return (contador);
  56. }
  57.  
  58. int minusculas(char a[])//
  59. {
  60. int i;
  61. int contador=0;// CONTADOR DE PALABRAS
  62. int verificador=0;//VERIFICADOR DEL COMIENZO Y FINAL DE CADA PALABRA
  63.  
  64. for (i=0; a[i]!='\0'; i++)
  65. {
  66. if (a[i]>='a' && a[i]<='z')
  67. {
  68. contador=contador + 1;
  69. }
  70. }
  71. return (contador);
  72. }
  73.  
  74. int contar_vocales(char *cad)
  75. {
  76. int cont=0;
  77. char *aux=cad;
  78.  
  79. while(*aux)
  80. {
  81. if(*aux=='a'||*aux=='e'||*aux=='i'||*aux=='o'||*aux=='u'||*aux=='A'||*aux=='E'||*aux=='I'||*aux=='O'||*aux=='U')
  82. cont++;
  83. aux++;              
  84.   }
  85.   return cont;
  86. }
  87.  
  88. int contar_caracteres(char a[])
  89. {
  90. int i;
  91. int contador=0;// CONTADOR DE PALABRAS
  92.  
  93. for (i=0; a[i]!='\0'; i++)
  94. {
  95. contador++;
  96. }
  97. return (contador);
  98. }
  99.  
  100. int contar_numeros(char a[])
  101. {
  102. int i;
  103. int contador=0;// CONTADOR DE PALABRAS
  104.  
  105. for (i=0; a[i]!='\0'; i++)
  106. {
  107. if (a[i]>='1' && a[i]<='9' or a[i]=='0')
  108. {
  109. contador++;
  110. }
  111.  
  112. }
  113. return (contador);
  114. }
  115.  
  116.  

Gracias


En línea

AlbertoBSD
Programador y
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.696


🏴 Libertad!!!!!


Ver Perfil WWW
Re: hacer mas corto el programa y si esta bien hecho
« Respuesta #1 en: 15 Septiembre 2016, 21:40 pm »

La de numeros se puede mejorar

Código
  1. if (a[i]>='0' && a[i]<='9' )

ahora cambia el gets por fgets:

Código
  1. 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!


En línea

HardForo

Desconectado Desconectado

Mensajes: 219


HardForo.com


Ver Perfil WWW
Re: hacer mas corto el programa y si esta bien hecho
« Respuesta #2 en: 21 Septiembre 2016, 18:12 pm »

Podrias "acortar" (mas bien compactar) si quitas todas las llaves de bloque { }  que no tienen ninguna funcion, ejemplo:

Código:
if (a[i]>='A' && a[i]<='Z')
{
contador=contador + 1;
}
En línea

HardForo:  foro de Hardware y programación

Se buscan Mods y colaboradores *
dato000


Desconectado Desconectado

Mensajes: 3.034



Ver Perfil
Re: hacer mas corto el programa y si esta bien hecho
« Respuesta #3 en: 22 Septiembre 2016, 05:18 am »

Pues bueno, aquí va un intento simple, simplemente reutilizando una función pasando argumentos diferentes se puede hacer lo mismo:

Código
  1.  
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <ctype.h>
  5.  
  6. enum Opciones
  7. {
  8.    mayusculas = 0,
  9.    minusculas = 1,
  10.    vocales    = 2,
  11.    numeros    = 3,
  12.    caracteres = 4
  13. };
  14.  
  15. int lectorCaracteres(char a[], int opcion);
  16.  
  17.  
  18. int main()
  19. {
  20.   char cadena[500];
  21.   int numeroMayusculas, numeroMinusculas, numeroVocales, numeroNumeros, numeroCaracteres;
  22.  
  23.   printf("Ingrese un texto: ");
  24.   gets(cadena);  // warning: unsafe (see fgets instead)
  25.   //fgets (cadena , 500 , stdin);
  26.  
  27.    //Llamando a metodos
  28.    numeroMayusculas = lectorCaracteres(cadena, mayusculas);
  29.    numeroMinusculas = lectorCaracteres(cadena, minusculas);
  30.    numeroVocales    = lectorCaracteres(cadena, vocales);
  31.    numeroNumeros    = lectorCaracteres(cadena, numeros);
  32.    numeroCaracteres = lectorCaracteres(cadena, caracteres);
  33.  
  34.    // Imprimiendo Resultados
  35.    printf("\nCantidad de Mayúsculas: %d", numeroMayusculas);
  36.    printf("\nCantidad de Minúsculas: %d", numeroMinusculas);
  37.    printf("\nCantidad de Vocales: %d",    numeroVocales);
  38.    printf("\nCantidad de Números: %d",    numeroNumeros);
  39.    printf("\nCantidad de caracteres: %d", numeroCaracteres);
  40.  
  41.    return 0;
  42. }
  43.  
  44. int lectorCaracteres(char cadena[], int opcion)//
  45. {
  46. int contador=0; // CONTADOR DE PALABRAS
  47.  
  48. switch(opcion)
  49. {
  50.        //Mayúsculas
  51.        case 0:
  52.                for (int i=0; cadena[i]!='\0'; i++)
  53.                {
  54.                    if (cadena[i]>='A' && cadena[i]<='Z')
  55.                    {
  56.                        //contador=contador + 1;
  57.                        contador++;
  58.                    }
  59.                }
  60.                break;
  61.  
  62.        //Minúsculas
  63.        case 1:
  64.                for (int i=0; cadena[i]!='\0'; i++)
  65.                {
  66.                    if (cadena[i]>='a' && cadena[i]<='z')
  67.                    {
  68.                        //contador=contador + 1;
  69.                        contador++;
  70.                    }
  71.                }
  72.                break;
  73.  
  74.        //Vocales
  75.        case 2:
  76.                for (int i=0; cadena[i]!='\0'; i++)
  77.                {
  78.                    if( cadena[i]=='a' || cadena[i]=='e' || cadena[i]=='i' || cadena[i]=='o' || cadena[i]=='u' ||
  79.                        cadena[i]=='A' || cadena[i]=='E' || cadena[i]=='I' || cadena[i]=='O' || cadena[i]=='Y'   )
  80.                    {
  81.                        contador++;
  82.                    }
  83.                }
  84.                break;
  85.  
  86.        //Numeros
  87.        case 3:
  88.                for (int i=0; cadena[i]!='\0'; i++)
  89.                {
  90.                    if( cadena[i]>='0' && cadena[i]<='9' )
  91.                    {
  92.                        contador++;
  93.                    }
  94.                }
  95.                break;
  96.  
  97.        //Caracteres
  98.        case 4:
  99.                for (int i=0; cadena[i]!='\0'; i++)
  100.                {
  101.                    contador++;
  102.  
  103.                }
  104.                break;
  105.  
  106.        default:
  107.                 contador=0;
  108.                 break;
  109.  
  110. }
  111.  
  112. return (contador);
  113. }
  114.  
  115.  

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
« Última modificación: 22 Septiembre 2016, 05:26 am por dato000 » En línea


Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines