[C] Llamar a un array de punteros a caracteres en un bucle.

Iniciado por DanielPy, 29 Diciembre 2014, 19:16 PM

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

DanielPy

Hola a todos.
El enunciado del libro con el que estoy estudiando dice:
CitarEscriba 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.-   

#include<stdio.h>
#include<string.h>

int main(int argc,char **argv){
char a, *funManCad[] = {"islower", "isupper", "isdigit"};
char *mensaje[] = {"una letra minuscula", "una letra mayuscula", "un numero"};
int i;

printf("\n Ingrese un caracter cualquiera [confirme con Enter]...:");
a = getchar();
for(i=0; i<3; i++){
if(funManCad[i](a)){
printf("\n Ingreso %s", mensaje[i]);
}
}

printf("\n\n Pulse [Enter] para finalizar..."); getchar();getchar();
return 0;
}

 
A simple vista se nota que me faltan muchas funciones, pero esto es sólo para la consulta.-
Saludos.
Daniel
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor
y cuando lo abrazas dejan de causar dolor.-

crack81

Hay varias forma de hacerlo pero esta me parecio mas similar a como lo quieres
eso de poner char a, *funManCad[] = {"islower", "isupper", "isdigit"};
ya no son funciones sino que las convertistes a un arreglo de caracteres


Código (cpp) [Seleccionar]
#include<iostream>
#include <ctype.h>
using namespace std;

int main(){
    char ch;

   cout<<"Ingrese un caracter "<<endl;
   cin>>ch;

   if(islower(ch)) cout<<"Es minuscula"<<endl;
   else if(isupper(ch)) cout<<"Es mayuscula"<<endl;
   else if (isdigit(ch)) cout<<"Es un numero "<<endl;
   else cout<<"No es minisucula, mayusucula o numero"<<endl;

cin.get();
cin.get();
return 0;
}


mi version esta en c++ pero creo que se entiende
saludos...
Si C/C++ es el padre de los lenguajes entonces ASM es dios.

DanielPy

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
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor
y cuando lo abrazas dejan de causar dolor.-

crack81

#3
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 (cpp) [Seleccionar]
#include <iostream>
#include <ctype.h>
using namespace std;


int (*func[])(int) = {islower,isupper,isdigit};
string mensaje[] = {"una letra minuscula", "una letra mayuscula", "un numero"};

int main() {

  char ch;
  cout<<"ingrese unc caracter "<<endl;
  cin>>ch;

  for(int i=0;i<3;i++){
    if((*func[i])(ch)){
       cout<<"ingreso "<<mensaje[i]<<endl;
       break; }

  }
   cin.get();
   cin.get();
return 0;
}

la verdad muy interesante el tema de punteros a funciones
Si C/C++ es el padre de los lenguajes entonces ASM es dios.

DanielPy

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
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor
y cuando lo abrazas dejan de causar dolor.-

rir3760

Cita de: DanielC# en 29 Diciembre 2014, 22:48 PMEs 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:
int (*func[])(int) = {islower,isupper,isdigit};

/* ... */

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
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

Yoel Alejandro

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 (cpp) [Seleccionar]

#include <stdio.h>
#include <ctype.h>

int (*func[])(int) = {islower,isupper,isdigit};
char *mensaje1 = "una letra minuscula";
char *mensaje2 = "una letra mayuscula";
char *mensaje3 = "un numero";
char *mensaje[3];

int main() {

    char ch;
    int i;

    /* inicializa los mensajes */
    mensaje[0] = mensaje1;
    mensaje[1] = mensaje2;
    mensaje[2] = mensaje3;

    printf("ingrese un caracter: ");
    scanf ( "%c", &ch);
    while ( getchar() != '\n' ) ; /* limpiar el bufer de entrada */

    for (i=0; i<3; i++) {
        if ((*func[i])(ch)) {
            printf( "ingreso %s\n", mensaje[i] );
            break;
        }

    }

    //getchar(); /* pausa antes de salir */
    return 0;
}
Saludos, Yoel.
P.D..-   Para mayores dudas, puedes enviarme un mensaje personal (M.P.)

DanielPy

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

#include <stdio.h>
#include <string.h>
#include <ctype.h>

int main(int argc,char **argv){
int (*pFun[3])(int ) = {islower, isupper, isdigit};
char a,*mensaje[] = {"una letra minuscula", "una letra mayuscula", "un numero"};
int i;
 
printf("\n Ingrese un caracter cualquiera [confirme con Enter]...:");
a = getchar();

for(i=0; i<3; i++){
if(pFun[i](a)){
printf("\n Ingreso %s", mensaje[i]);
}    
}

printf("\n\n Pulse [Enter] para finalizar..."); getchar();getchar();
return 0;
}


Saludos.
Daniel
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor
y cuando lo abrazas dejan de causar dolor.-

Yoel Alejandro

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 (cpp) [Seleccionar]

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 (cpp) [Seleccionar]

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.

Saludos, Yoel.
P.D..-   Para mayores dudas, puedes enviarme un mensaje personal (M.P.)

DanielPy

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
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor
y cuando lo abrazas dejan de causar dolor.-