Rechenoperationen



  • hallo,

    ich versuche seit einigen Stunden ein Programm zu erstellen, dass von der Kommandozeile den Ausdruck zahl1 operand zahl2 einliest und auswertet. Jedoch bin ich an ein Problem gestoßen, dass bei der Analyse des Rechenoperanten, das "*****"-Zeichen völlig aus der Reihe tanzt, wenn ich nur den ausdruck 5 * 5 eingebe, wird argc trotzdem auf 10 gesetzt.
    Hier der Quellcode des Programmes:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int Fehlermeldung1 (int para, char *zahl1, char *zahl2, char *operand);
    
    int main(int argc, char *argv[])
    {
      int i, check=0;
      check += Fehlermeldung1(argc, argv[1], argv[3], argv[2] );
      if(check != 1){
               return 0;
               }
      printf("Anzahl der Parameter: %d\n", argc);
      for(i=0; i<argc; i++){
               printf("argv[%d] : '%s'\n", i, argv[i]);}
      printf("erste Zahl leange %d", strlen(argv[1])  );
      return 0;
    }
    
    int Fehlermeldung1 (int para, char *zahl1, char *zahl2, char *operand){
         int i, k, n;
         if(para<4){
                        printf("\n\n\t\t!!! ~~ FEHLERMELDUNG ~~ !!!\n\n");
                        printf("\tEs wurden zu wenig Parameter [%d] eingegeben . . .\n\n", para);
                        return 0;
                        }
         if(para>4){
                        printf("\n\n\t\t!!! ~~ FEHLERMELDUNG ~~ !!!\n\n");
                        printf("\tEs wurden zu viele Parameter [%d] eingegeben . . .\n\n", para);
                        return 0;
                        }
         for(i=0; i<strlen(zahl1); i++){
                  k = zahl1[i];
                  if( (!(k>=48 && k<=57)) && !(zahl1[0]==45)){
                        printf("\n\n\t\t!!! ~~ FEHLERMELDUNG ~~ !!!\n\n");
                        printf("\tDas Zeichen %c [%d] der ersten Zahl ist keine Zahl . . .\n\n", zahl1[i], k);
                        return 0;
                        }
                  }
         for(i=0; i<strlen(zahl2); i++){
                  k = zahl2[i];
                  if( (!(k>=48 && k<=57)) && !(zahl2[0]==45)){
                        printf("\n\n\t\t!!! ~~ FEHLERMELDUNG ~~ !!!\n\n");
                        printf("\tDas Zeichen %c [%d] der zweiten Zahl ist keine Zahl . . .\n\n", zahl2[i], k);
                        return 0;
                        }
                  }
    
         for(i=0; i<strlen(operand); i++){
                  k=operand[0];
                  printf("\n%c %d\n", operand[0], k);
                  if( (strlen(operand)!=1) && ( k==42 && k==43 && k==45 && k==47 )==0 ){
                        printf("\n\n\t\t!!! ~~ FEHLERMELDUNG ~~ !!!\n\n");
                        printf("\tEs wurde ein ungueltiger Operant '%c' [%d] eingegeben . . .\n\n", zahl1[i], k);
                        return 0;
                        }
                  }
    
         return 1;
         }
    

    lg
    Triton90



  • Unix? Das * wird von der Shell zu einer Liste von Dateien im aktuellen Verzeichnis expandiert, darauf hast du mit deinem Programm keinerlei Einfluss.



  • Dann muss ich nun einen anderen Weg finden die Operanten einzugeben.

    Aber bei Strings wie "add / sub / div / mul" würde der mir nicht meckern oder?



  • Sollte nicht. Die speziellen Zeichen hängen aber von der Shell ab und sind normalerweise das Problem des Benutzers. Er könnte z.B. den Stern beim Aufruf escapen: \* oder "*" .

    Alternativ lässt du das alles als ein Argument übergeben: meinrechner "2 * 3" und zerlegst es in deinem Programm statt die Shell zu bemühen.



  • kann man dies irgendwie kürzer gestalten?

    if( !(strlen(operand) == 3) ){
              printf("\n\n\t\t!!! ~~ FEHLERMELDUNG ~~ !!!\n\n");
              printf("\tDer eingegebene Operand ist ungueltig . . .\n\n");
              return 0;}
    
         if     (operand[0] == "a" && operand[1] == "d" && operand[2] == "d"){return 2;}
         else if(operand[0] == "s" && operand[1] == "u" && operand[2] == "b"){return 3;}
         else if(operand[0] == "m" && operand[1] == "u" && operand[2] == "l"){return 4;}
         else if(operand[0] == "d" && operand[2] == "i" && operand[2] == "v"){return 5;}
         if( (!(operand[0] == "a" && operand[1] == "d" && operand[2] == "d"))
           &&(!(operand[0] == "s" && operand[1] == "u" && operand[2] == "b"))
           &&(!(operand[0] == "m" && operand[1] == "u" && operand[2] == "l"))
           &&(!(operand[0] == "d" && operand[2] == "i" && operand[2] == "v")) )
             {printf("\n\n\t\t!!! ~~ FEHLERMELDUNG ~~ !!!\n\n");
              printf("\tDer eingegebene Operand %s ist ungueltig . . .\n\n", operand);
              return 0;
              }
    


  • Triton90 schrieb:

    kann man dies irgendwie kürzer gestalten?

    Ja.

    #include <stdio.h>
    #include <string.h>
    
    int calc(int a, char *op, int b)
    {
      if (!strcmp(op, "add"))
        return a + b;
      if (!strcmp(op, "sub"))
        return a - b;
      if (!strcmp(op, "mul"))
        return a * b;
      if (!strcmp(op, "div"))
        return a / b;
      fprintf(stderr, "Error: Invalid argument: %s.\n", op);
      return 0;
    }
    
    int main(int argc, char *argv[])
    {
      if (argc < 4)
        return -1;
      printf("Ergebnis: %i\n", calc(atoi(argv[1]), argv[2], atoi(argv[3])));
    }
    

Anmelden zum Antworten