Подсчитать значение выражения, переданного через 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), чтобы программа не закрылась сразу после вывода результата.