나는 명령 줄에 의해 표현을 제공하는 rpn clalculator 내 학교 과제를 쓰려고합니다. Ex ./calc 2 + 5 \* sin 78
atof() assining 0 어디 dobule해야합니까
제 생각에는 숫자 값이나 연산자 유형을 유지하기 위해 struct
데이터 형식을 사용하는 것이 좋습니다. 여기에 모든 것을 명확히 주입니다 :
#include <stdlib.h>
#include <math.h>
#include <string.h>
enum OPERATORS {val, PLUS, MINUS, MULTI, DIV, SIN, COS};
typedef struct value {
double number;
enum OPERATORS oper;
};
void get_the_onp(char *expression[], int length);
int main(int argc, char* argv[]) {
double result;
int i;
printf("Number of arguments: %d\n", argc);
get_the_onp(argv, argc);
//result = equation(argv, argc);
//printf("Result is: %f", result);
return 0;
}
내가 의심으로 atof()
가 작동하지 않는 get_the_onp()
기능을 실행합니다. 여기에 get_the_onp()
입니다 :
void get_the_onp(char* expression[], int length) {
int i, j, k; //iterators i for expression; j for numbers; k for operators
char *current;
struct value values[length];
for (i=1; i<length; i++) {
current = expression[i];
//printf("%f\n", atof(expression[i]));
if (atof(current) != 0 && current != '0') {
//printf("Inside if: %f\n", atof(current));
values[i-1].number = (double) atof(current);
values[i-1].oper = val;
}
else{
switch(current[0]){
case '+':
//values[i].number = NULL;
values[i-1].oper = PLUS;
break;
case '-':
//values[i].number = NULL;
values[i-1].oper = MINUS;
break;
case '*':
//values[i].number = NULL;
values[i-1].oper = MULTI;
break;
case '/':
//values[i].number = NULL;
values[i-1].oper = DIV;
break;
case 's':
//values[i].number = NULL;
values[i-1].oper = SIN;
break;
case 'c':
//values[i].number = NULL;
values[i-1].oper = COS;
break;
}
}
}
//tester
for (i=0; i<length; i++) {
//if (values[i].oper != val)
printf("Operator: %d\n", values[i].oper);
printf("Number is: %d\n", values[i].number);
}
return;
}
예제 표현의 출력은 다음과 같습니다
Number of arguments: 7
Operator: 0
Number is: 2147483636
Operator: 1
Number is: 2147483636
Operator: 0
Number is: 2147483636
Operator: 3
Number is: 2147483636
Operator: 5
Number is: 2147483636
Operator: 0
Number is: 2147483636
Operator: -2072959800
Number is: 2147483626
내가 포인터 current
뭔가가 있다고 생각하지만 지금은 따라 할 생각도 없어.
'current! = '0' '이 올바르지 않습니다. 포인터 ('char *')를 비 포인터 ('char')와 비교합니다. – user694733
여기.'./calc 2 + 5 \ * sin 78'은 올바른 rpn 구문이 아닙니다. 그림 rpn은 스택에서 숫자가 푸시되고 스택 (또는 sin과 같은 함수)이 스택에서 두 개의 요소 (또는 죄의 경우 하나)를 누를 때마다 그 결과를 푸시합니다. '2 +'는 작동하지 않습니다. –
그래, 이제 구조체 값을 만든 후 알았어. rnp를 다루고 싶다. – advena