Подсчитать значение выражения, переданного через 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; }
Объяснение кода листинга программы
- В функции
calculate
первым делом проверяется корректность ввода первого числа и сохраняется в переменнойn
. Если ввод некорректен, функция возвращает 0 и устанавливает ошибкуerr
равной 1. - Затем начинается цикл, который обрабатывает все последующие числа и операции, пока не встретит операцию
+
или-
без следующего за ней числа. - Если встречено число, оно сохраняется в переменной
k
. - В зависимости от операции (
*
,/
,+
,-
) выполняется соответствующая арифметическая операция надn
иk
. - Если встречена операция
+
или-
без следующего за ней числа, то цикл прерывается и продолжается обработка следующего числа. - Если ввод некорректен, функция возвращает 0 и устанавливает ошибку
err
равной 1. - В функции
main
первым делом проверяется, что аргументов больше одного. - Затем вызывается функция
calculate
с аргументамиargs[1]
,argc - 1
и&err
. - Результат вычислений выводится на экран. Если ошибка - выводится сообщение об ошибке.
- В конце программы вызывается
system(
pause)
, чтобы программа не закрылась сразу после вывода результата.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д