Подсчитать значение выражения, переданного через Argv - C (СИ)

Узнай цену своей работы

Формулировка задачи:

помогите пожалуйста argv[] получает вот такие аргументы 75 + 50 / 2 как можно подсчитать сумму этого выражениея
получился, кто опытнее подскажите лучшый вариант
#include <ctype.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>

int main(int argc,char*argv[])
 
{
 
   int i=0,t;
   int len;
   static int j=0;
   static double res=0;
   int tmp;
   double *a;
 
   FILE *pf=fopen("dat.d","w");
 
    for(i=1;i<argc;i++)
    {
       fprintf(pf,"%s ",argv[i]);
    }
    fclose(pf);
    FILE *pp=fopen("dat.d","r");
    fseek(pp,0,SEEK_END);
    len=ftell(pp);
    rewind(pp);
    printf("len = %d\n\n",len);
 
    a=(double*)malloc(sizeof(double)*len);
 
    fscanf(pp,"%lf",&a[0]);
    t=1;
    for(i=0;i<len;i++)
    {
        if(fgetc(pp)==' ')
        {
            a[t]=0;
            t++;
        }
        else
        {
           fscanf(pp,"%lf",&a[t]);
           t++;
        }
    }
 
   for(i=0;i<argc;i++)
   {
       switch(*argv[i])
       {
           case '/': tmp=i-1;res=(a[tmp-1])/(a[tmp+1]);j=i;break;
           case '*': tmp=i-1;res=(a[tmp-1])*(a[tmp+1]);j=i;break;
       }
 
   }
 
   for(i=0;i<argc;i++)
   {
       switch(*argv[i])
       {
 
           case '+':
               tmp=i-1;
               if(j>i)
               {
                   res=(a[tmp-1])+res;
 
               }
               else
               {
                   res=(a[tmp+1])+res ;
 
               }
                break;
           case '-':
               tmp=i-1;
               if(j>i)
               {
                   res=(a[tmp-1])-res;
 
               }
               else
               {
                   res=res-(a[tmp+1]);
 
               }
                break;
       }
   }
    printf("res = %.2lf\n",res);
   return 0;
}

Решение задачи: «Подсчитать значение выражения, переданного через Argv»

textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
double calculate(char* arr[], int num, int* err){
    int    i;
    char*  c, *c1;
    double n, v, k;
 
    if(sscanf(arr[0], "%lf", &n) != 1){
        *err = 1;
        return 0;
    }
 
    for(i = 1; i < num; ){
        c = arr[i++];
        if(i >= num)
            break;
        if(sscanf(arr[i], "%lf", &k) != 1){
            *err = 1;
            return 0;
        }
 
        switch(*c) {
        case '*':
            n *= k;
            break;
        case '/':
            if(k == 0.0){
                *err = 1;
                return 0;
            }
            n /= k;
            break;
        case '+':
        case '-':
            ++i;
            if((i < num) && ((*arr[i] == '*') || (*arr[i] == '/'))){
                v = k;
                for(; i < num; ++i){
                    c1 = arr[i];
                    if((*c1 == '+') || (*c1 == '-'))
                        break;
                    if(++i >= num)
                        break;
            
                    if(sscanf(arr[i], "%lf", &k) != 1){
                        *err = 1;
                        return 0.0;
                    }
 
                    if(*c1 == '/') {
                        if(k == 0){
                            *err = 1;
                            return 0;
                        }
                        v /= k;
                    } else if(*c1 == '*')
                        v *= k;
                }
                k = v;
            }
            
            if(*c == '+')
                n += k;
            else if(*c == '-')
                n -= k;
            break;
        }
    }
    *err = 0;
    return n;
}
 
int main(int argc, char* args[]){
    int    err;
    double res;
    if(argc > 1){
        res = calculate(&args[1], argc - 1, &err);
        if(! err)
            printf("answer: %lg\n", res);
        else
            puts("error calc!");
        system("pause");
    }
    return 0;
}

Объяснение кода листинга программы

  1. В функции calculate первым делом проверяется корректность ввода первого числа и сохраняется в переменной n. Если ввод некорректен, функция возвращает 0 и устанавливает ошибку err равной 1.
  2. Затем начинается цикл, который обрабатывает все последующие числа и операции, пока не встретит операцию + или - без следующего за ней числа.
  3. Если встречено число, оно сохраняется в переменной k.
  4. В зависимости от операции (*, /, +, -) выполняется соответствующая арифметическая операция над n и k.
  5. Если встречена операция + или - без следующего за ней числа, то цикл прерывается и продолжается обработка следующего числа.
  6. Если ввод некорректен, функция возвращает 0 и устанавливает ошибку err равной 1.
  7. В функции main первым делом проверяется, что аргументов больше одного.
  8. Затем вызывается функция calculate с аргументами args[1], argc - 1 и &err.
  9. Результат вычислений выводится на экран. Если ошибка - выводится сообщение об ошибке.
  10. В конце программы вызывается system(pause), чтобы программа не закрылась сразу после вывода результата.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 3.778 из 5
Похожие ответы