Título: hacer mas corto el programa y si esta bien hecho
Publicado por: creiko 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 #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
Título: Re: hacer mas corto el programa y si esta bien hecho
Publicado por: AlbertoBSD en 15 Septiembre 2016, 21:40 pm
La de numeros se puede mejorar if (a[i]>='0' && a[i]<='9' )
ahora cambia el gets por fgets:
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!
Título: Re: hacer mas corto el programa y si esta bien hecho
Publicado por: HardForo 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: if (a[i]>='A' && a[i]<='Z') { contador=contador + 1; }
Título: Re: hacer mas corto el programa y si esta bien hecho
Publicado por: dato000 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: #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. :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
|