2011-05-26 2 views
0

Salut j'ai une méthode appeléeC il Comparer opérateur priorité

int comparer (char OP1, char op2)

la méthode sera return 1, -1 or 0 en fonction du résultat de la comparaison. (1 si op1 < op2).

J'ai besoin de comparer les opérations suivantes:

- subtraction 
* multiplication 
/division 
^ exponentiation 
% remainder 

j'envisagé d'utiliser un ENUM comme:

enum ops{ 
    '+'=1, '-'=1, '*'=2, '/'=2, '^', '%' 
}var; 

mais cela ne compile pas. Est-ce que quelqu'un peut me donner un coup de main?

+0

Donc la comparaison est l'ordre de préséance? –

Répondre

3

Vous ne pouvez pas utiliser des caractères comme clés pour l'ENUM, vous devez faire quelque chose comme:

enum ops { 
    OP_PLUS  = 1, 
    OP_MINUS  = 1, 
    OP_MULT  = 2, 
    OP_DIV  = 2, 
    OP_POWER, 
    OP_MOD 
} var; 
2

énumérations doivent être des noms d'identification et non des caractères. Je suggère de les nommer PLUS, MINUS, etc. (Aussi, pourquoi % ont une priorité plus élevée que ^ La norme de facto est de donner % la même priorité que * et /.)

2
#include <stdio.h> 

struct precedence 
{ 
    char op; 
    int prec; 
} precendence[] = 
{ { '+', 1 }, 
    { '-', 1 }, 
    { '*', 2 }, 
    { '/', 2 }, 
    { '^', 3 }, 
    { '%', 4 }, 
    { 0, 0 }}; 

int compare(char *a, char *b) 
{ 
    int prec_a = 0, prec_b = 0, i; 

    for(i=0; precendence[i].op && (!prec_a || !prec_b); i++) 
    { 
    if (a == precendence[i].op) 
     prec_a = precendence[i].prec; 
    if (b == precendence[i].op) 
     prec_b = precendence[i].prec; 
    } 

    if (!prec_a || !prec_b) 
    { 
    fprintf(stderr,"Could not find operator %c and/or %c\n",a,b); 
    return(-2); 
    } 
    if (prec_a < prec_b) 
    return -1; 
    if (prec_a == prec_b) 
    return 0; 
    return 1; 
} 


main() 
{ 
    char a,b; 

    a='+'; b='-'; printf("Prec %c %c is %d\n", a,b,compare(a,b)); 
    a='+'; b='*'; printf("Prec %c %c is %d\n", a,b,compare(a,b)); 
    a='+'; b='^'; printf("Prec %c %c is %d\n", a,b,compare(a,b)); 
    a='+'; b='%'; printf("Prec %c %c is %d\n", a,b,compare(a,b)); 
    a='*'; b='+'; printf("Prec %c %c is %d\n", a,b,compare(a,b)); 
    a='^'; b='+'; printf("Prec %c %c is %d\n", a,b,compare(a,b)); 
    a='%'; b='+'; printf("Prec %c %c is %d\n", a,b,compare(a,b)); 
}