Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: DanielPy en 29 Diciembre 2014, 19:16 pm



Título: [C] Llamar a un array de punteros a caracteres en un bucle.
Publicado por: DanielPy en 29 Diciembre 2014, 19:16 pm
Hola a todos.
El enunciado del libro con el que estoy estudiando dice:
Citar
Escriba un programa que lea un carácter desde el teclado y que pruebe el carácter con cada una de las funciones de la biblioteca de manipulación de caracteres.
Como no quiero utilizar 100 if ni switch se me antojo hacerlo de esta manera, obviamente me da un error que no puedo solucionar, me podrían informar si esto es posible o si estoy proponiendo un disparate.-   

Código
  1. #include<stdio.h>
  2. #include<string.h>
  3.  
  4. int main(int argc,char **argv){
  5. char a, *funManCad[] = {"islower", "isupper", "isdigit"};
  6. char *mensaje[] = {"una letra minuscula", "una letra mayuscula", "un numero"};
  7. int i;
  8.  
  9. printf("\n Ingrese un caracter cualquiera [confirme con Enter]...:");
  10. a = getchar();
  11. for(i=0; i<3; i++){
  12. if(funManCad[i](a)){
  13. printf("\n Ingreso %s", mensaje[i]);
  14. }
  15. }
  16.  
  17. printf("\n\n Pulse [Enter] para finalizar..."); getchar();getchar();
  18. return 0;
  19. }
 
A simple vista se nota que me faltan muchas funciones, pero esto es sólo para la consulta.-
Saludos.
Daniel


Título: Re: [C] Llamar a un array de punteros a caracteres en un bucle.
Publicado por: crack81 en 29 Diciembre 2014, 20:26 pm
Hay varias forma de hacerlo pero esta me parecio mas similar a como lo quieres
eso de poner
Código
  1. char a, *funManCad[] = {"islower", "isupper", "isdigit"};
ya no son funciones sino que las convertistes a un arreglo de caracteres


Código
  1. #include<iostream>
  2. #include <ctype.h>
  3. using namespace std;
  4.  
  5. int main(){
  6.    char ch;
  7.  
  8.   cout<<"Ingrese un caracter "<<endl;
  9.   cin>>ch;
  10.  
  11.   if(islower(ch)) cout<<"Es minuscula"<<endl;
  12.   else if(isupper(ch)) cout<<"Es mayuscula"<<endl;
  13.   else if (isdigit(ch)) cout<<"Es un numero "<<endl;
  14.   else cout<<"No es minisucula, mayusucula o numero"<<endl;
  15.  
  16. cin.get();
  17. cin.get();
  18. return 0;
  19. }

mi version esta en c++ pero creo que se entiende
saludos...


Título: Re: [C] Llamar a un array de punteros a caracteres en un bucle.
Publicado por: DanielPy en 29 Diciembre 2014, 20:54 pm
Hola crack81.
Gracias por ocuparte, eso es precisamente lo que no quiero hacer, utilizar 100 if.-
Acabo de ver una referencia con puntero a función, voy a practicar para intentar lograrlo, de cualquier manera seguramente vos u otro tendrán una manera de hacerlo sin usar if ni switch.-

Saludos.
Daniel


Título: Re: [C] Llamar a un array de punteros a caracteres en un bucle.
Publicado por: crack81 en 29 Diciembre 2014, 22:18 pm
Bueno antes te doy las gracias porque este tema no lo conocia asi que me puse a investigar y creo que esta es la solucion que buscabas

Código
  1. #include <iostream>
  2. #include <ctype.h>
  3. using namespace std;
  4.  
  5.  
  6. int (*func[])(int) = {islower,isupper,isdigit};
  7. string mensaje[] = {"una letra minuscula", "una letra mayuscula", "un numero"};
  8.  
  9. int main() {
  10.  
  11.  char ch;
  12.  cout<<"ingrese unc caracter "<<endl;
  13.  cin>>ch;
  14.  
  15.  for(int i=0;i<3;i++){
  16.    if((*func[i])(ch)){
  17.       cout<<"ingreso "<<mensaje[i]<<endl;
  18.       break; }
  19.  
  20.  }
  21.   cin.get();
  22.   cin.get();
  23. return 0;
  24. }
  25.  
la verdad muy interesante el tema de punteros a funciones


Título: Re: [C] Llamar a un array de punteros a caracteres en un bucle.
Publicado por: DanielPy en 29 Diciembre 2014, 22:48 pm
Hola.
Es precisamente lo que quería lograr, sólo tengo el trabajo de pasarlo de c++ a c, no tengo conocimientos de c++ pero seguramente no debe ser cosa de otro mundo.-
Otra cosita, a las 20.26 no tenías ni idea de “puntero a función” y a las 22.18 ya hiciste un programa, a mí me llevo más de 2 días el tema y por lo visto todavía me falta, te felicito.-     

Saludos.
Daniel


Título: Re: [C] Llamar a un array de punteros a caracteres en un bucle.
Publicado por: rir3760 en 30 Diciembre 2014, 03:55 am
Es precisamente lo que quería lograr, sólo tengo el trabajo de pasarlo de c++ a c, no tengo conocimientos de c++ pero seguramente no debe ser cosa de otro mundo.
La parte relacionada con el uso de punteros a función la puedes utilizar tal cual, sin cambios:
Código
  1. int (*func[])(int) = {islower,isupper,isdigit};
  2.  
  3. /* ... */
  4.  
  5. if ((*func[i])(ch)){

Solo un detalle: la expresión "(*func[ i ])(ch)" es valida pero no es necesario el operador de indirección, se puede utilizar "func[ i ](ch)" sin problemas.

Un saludo


Título: Re: [C] Llamar a un array de punteros a caracteres en un bucle.
Publicado por: Yoel Alejandro en 1 Enero 2015, 21:48 pm
Bueno,..... estuve revisando y convertir de C++ a C encierra unos detalles no tan mínimos  :-\

Debes cambiar los cout a printf, el cin a scanf. Ahora, como C no admite la clase string (C no admite clases), hay que declarar e inicializar el array de mensajes "manualmente". Puede quedar así:

Código
  1. #include <stdio.h>
  2. #include <ctype.h>
  3.  
  4. int (*func[])(int) = {islower,isupper,isdigit};
  5. char *mensaje1 = "una letra minuscula";
  6. char *mensaje2 = "una letra mayuscula";
  7. char *mensaje3 = "un numero";
  8. char *mensaje[3];
  9.  
  10. int main() {
  11.  
  12.    char ch;
  13.    int i;
  14.  
  15.    /* inicializa los mensajes */
  16.    mensaje[0] = mensaje1;
  17.    mensaje[1] = mensaje2;
  18.    mensaje[2] = mensaje3;
  19.  
  20.    printf("ingrese un caracter: ");
  21.    scanf ( "%c", &ch);
  22.    while ( getchar() != '\n' ) ; /* limpiar el bufer de entrada */
  23.  
  24.    for (i=0; i<3; i++) {
  25.        if ((*func[i])(ch)) {
  26.            printf( "ingreso %s\n", mensaje[i] );
  27.            break;
  28.        }
  29.  
  30.    }
  31.  
  32.    //getchar(); /* pausa antes de salir */
  33.    return 0;
  34. }


Título: Re: [C] Llamar a un array de punteros a caracteres en un bucle.
Publicado por: DanielPy en 3 Enero 2015, 23:22 pm
Hola yoel_alejandro.
Muchas gracias por ocuparte del paso del programa de c++ a c, funciona a la perfección.-
Igual yo dejo mi versión.-  

Código
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <ctype.h>
  4.  
  5. int main(int argc,char **argv){
  6. int (*pFun[3])(int ) = {islower, isupper, isdigit};
  7. char a,*mensaje[] = {"una letra minuscula", "una letra mayuscula", "un numero"};
  8. int i;
  9.  
  10. printf("\n Ingrese un caracter cualquiera [confirme con Enter]...:");
  11. a = getchar();
  12.  
  13. for(i=0; i<3; i++){
  14. if(pFun[i](a)){
  15. printf("\n Ingreso %s", mensaje[i]);
  16. }    
  17. }
  18.  
  19. printf("\n\n Pulse [Enter] para finalizar..."); getchar();getchar();
  20. return 0;
  21. }

Saludos.
Daniel


Título: Re: [C] Llamar a un array de punteros a caracteres en un bucle.
Publicado por: Yoel Alejandro en 4 Enero 2015, 01:46 am
Excelente por tu trabajo te felicito.

Sólo un detalle. ¿Te has preguntado por qué requieres dos getchar() para hacer la pausa al final del programa?
Con uno sólo no funciona  :-\

La razón es que
Código
  1. a = getchar();
descarta la tecla ENTER, y sólo almacena en la variable a el carácter introducido antes del mismo. Entonces dicho ENTER debe ser "limpiado", a eso llamamos limpiar el búfer de entrada. Usamos:
Código
  1. while ( getchar() != '\n' ) ; /* limpiar el bufer de entrada */
y listo ya puedes poner un único getchar() al final del programa para producir la pausa.

Es recomendable siempre "limpiar el búfer" tras un getchar(), un gets() o un scanf() pues estas funciones descartan el carácter de nueva línea.



Título: Re: [C] Llamar a un array de punteros a caracteres en un bucle.
Publicado por: DanielPy en 4 Enero 2015, 18:15 pm
Hola.
Me vino de perillas tu aclaración, si bien ya tengo incorporado lo de limpiar el buffer de entrada (gracias pero muchas gracias a rir3760) que además valida que el ingreso sea sin errores, en este caso lo olvide e iba a hacer una validación porque al ingresar por ejemplo 4b el programa finalizaba abruptamente, con la limpieza del buffer ello no ocurre.-        

Saludos.
Daniel