2014-02-09 7 views
5

나는 사용자가 키보드에서 어떤 사용자 입력을 펑 (X, N)를 대체 표현식을 입력 할 수 있도록 내가 다양한 그것을 만들 필요가 간단한 C 프로그램을키보드에서 수식을 입력하는 방법은 무엇입니까?

int main() 
{ 

    int n, maxn = 21; 
    float SN, x; 

    printf("input x:"); 
    scanf("%f", &x); 

    printf("input maxn:"); 
    scanf("%d", &maxn); 

    for(n=0;n<=maxn;n++){ 
     SN = SN + pow(x,n); 
     n = n + 1; 
    } 

    printf("%f", SN); 
    getch(); 
    return 0; 
} 

있습니다. 표현식을 프로그램에 삽입하려면 어떻게해야합니까?

+1

정확히 무슨 짓을하는지 도구가 있습니다. * bc *라고 부르며 무료 소프트웨어입니다. http://ftp.gnu.org/gnu/bc/ URL을 확인하고 수학 구문 분석 방법을 소스에서 살펴보십시오. 윈도우를 사용하고 있다면 cygwin을 사용하여 미리 컴파일 된 버전을 구해야 할 것입니다. – Alex

+0

동적으로 링크 된 라이브러리를 사용함으로써'eval'과 비슷한 일을하는 이론적 인 가능성이 있습니다. 사용자 문자열에서 간단한 코드를 생성하고이를 동적 라이브러리로 컴파일하고 프로그램에로드 할 수 있습니다. 해킹과 같은 냄새가 나며 코드가 실행되는 컴퓨터에서 호환 가능한 컴파일러가 필요합니다. 질문은 보류 상태였습니다. 그렇지 않으면 데모 코드를 게시 할 것입니다 ... – Marian

답변

10

C 및 C++에서는 컴파일 타임 (구문이 구문 적으로 분석되는 경우)과 런타임 (평가되는 경우) 사이에 명확한 구분이 있기 때문에이 기능이 이미 구현되어 있지 않습니다.

표현식에 대한 파서 및 컴파일러/평가자를 구현하는 것은 좋은 연습이지만 사소하지 않고 현재 질문했을 때보 다 많은 경험이 필요할 것입니다.

이 문제에 대한 접근 방법을 가장 쉽게 이해할 수있는 것은 제 생각에는 recursive descent parser입니다.하지만 네 가지 연산, 숫자 및 변수에 대해서는 백 줄 정도의 코드가 필요합니다.

yacc and bison은 문법 정의에서 자동으로 구문 분석/평가 코드를 생성하도록 설계된 도구입니다. 저는 개인적으로 파서를 손으로 직접 쓰는 것을 선호합니다. (특히 오류 처리 나 통사론과 의미 론적 수준이 상호 작용할 때 그렇습니다. 그러나 그것은 나이고 나는 또한 NIH syndrome의 나쁜 경우입니다).

파이썬이나 자바 스크립트와 같은 상위 언어는 이미 eval으로 구현 된이 기능을 제공합니다.

+0

저를 도울 수있는 기존 라이브러리가 있습니까? – Euphe

+0

@Euphe :이 문제에 대한 기록 도구는 yacc/bison입니다. 설명 링크는 편집 된 답변을 참조하십시오. – 6502

+0

당신은 부스트 ​​스피릿으로 무엇을 할 수 있는지 확인해 봤습니까? http://stackoverflow.com/a/21419351/1000282 –

관련 문제