2016-04-07 2 views
2

Mein Ziel ist es, meine Funktion mit switch-Anweisungen zu vereinfachen, aber ich kann nicht herausfinden, wie man einen Code in die switch-Anweisungen einfügt. Wenn ich die printf("("); und infixTree(node->left); hinzufügen würde sie nicht zu unerwarteten Zeiten aufgerufen werden, wenn ich diese Zeilen Code jeweils hinzugefügt?Umwandlung von if-Anweisungen in eine switch-Anweisung

Hier ist meine aktuelle Funktion.

void infixTree(ExpNode* node) 
{ 
    if(node->type==INTEGER) 
    { 
     printf("%d",node->value.value.iVal); 
     return; 
    } 

    if(node->type==DOUBLE) 
    { 
     printf("%f",node->value.value.dVal); 
     return; 
    } 

    if(node->type==SYMBOL) 
    { 
     printf("%s",node->symbol); 
     return; 
    } 

    printf("("); 
    infixTree(node->left); 

    if(node->type==ADD_OP) 
    { 
     printf(" + "); 
    } 
    else if(node->type==SUB_OP) 
    { 
     printf(" - "); 
    } 
    else if(node->type==MUL_OP) 
    { 
     printf(" * "); 
    } 
    else if(node->type==DIV_OP) 
    { 
     printf("/"); 
    } 
    else if(node->type==MOD_OP) 
    { 
     printf(" %% "); 
    } 
    else if(node->type==ASSIGN_OP) 
    { 
     printf(" = "); 
    } 

    infixTree(node->right); 
    printf(")"); 
} 

Ich weiß nicht, wie ich

printf("("); 
infixTree(node->left); 

Meine Funktion switch-Anweisungen wie folgt aussieht im Moment umfassen würde.

void infixTree(ExpNode* node) 
{ 
    switch(node->type) 
    { 
     case INTEGER : 
      printf("%d", node->value.value.iVal); 
      return; 
     case DOUBLE : 
      printf("%f", node->value.value.dVal); 
      return; 
     case SYMBOL : 
      printf*%s", node->symbol); 
      return; 
    } 

    switch(node->type) 
    { 
     case ADD_OP: 
      printf("("); 
      infixTree(node->left); 
      printf(" + "); 
      break; 
     case SUB_OP: 
      printf("("); 
      infixTree(node->left); 
      printf(" - "); 
      break; 
     case MUL_OP : 
      printf("("); 
      infixTree(node->left); 
      printf(" * "); 
      break; 
     case DIV_OP : 
      printf("("); 
      infixTree(node->left); 
      printf("/"); 
      break; 
     case MOD_OP : 
      printf("("); 
      infixTree(node->left); 
      printf(" %% "); 
      break; 
     case ASSIGN_OP : 
      printf("("); 
      infixTree(node->left); 
      printf(" = "); 
      break; 
    } 

    infixTree(node->right); 
    printf(")"); 
} 
+0

Ja, das war ein Fehler schreiben. Es hätte dort sein sollen. Bearbeitet – FatFockFrank

+0

Sie können zwei verschiedene 'Schalter' haben, wie Sie zwei verschiedene elsif Leitern haben. –

+0

Okay, ich habe es bearbeitet, würde diese Lösung funktionieren? – FatFockFrank

Antwort

4

Ich glaube nicht, dass es notwendig

printf("("); 
infixTree(node->left); 

in allen Zweigen wechseln aufzunehmen.

Aus Gründen der Verdichtung, würde ich

printf("("); 
infixTree(node->left); 
switch(node->type){ 
    case ADD_OP: 
     printf(" + "); 
     break; 
    case SUB_OP: 
     printf(" - "); 
     break; 
    case MUL_OP : 
     printf(" * "); 
     break; 
    case DIV_OP : 
     printf("/"); 
     break; 
    case MOD_OP : 
     printf(" %% "); 
     break; 
    case ASSIGN_OP : 
     printf(" = "); 
     break; 
} 
+0

Also kurz vor dem ersten Fall in der zweiten switch statement? – FatFockFrank

+1

@FatFockFrank Ja. Siehe meine bearbeitete Antwort –

+0

Eine andere Frage. Diese Fälle sind Aufzählungswerte. Wenn ich nicht alle Aufzählungswerte in jedem Switch einbeziehe, erhalte ich einen Fehler. 'warning: Aufzählungswert 'INTEGER' nicht in switch' behandelt. Kann ich das ignorieren? – FatFockFrank