2011-12-27 4 views
1

모두 안녕하세요.math.h에서 변수 및 함수를 사용하여 중위 수식으로 후미 변형 (나중에 상징적 적분을 결정)

이 코드는 나에게 많은 어려움을 겪었습니다. 그것을 어떻게 appoach하는지 모르겠다. 마침내 나는 RPN (postfix notation)으로 변환하는 방법을 알아 냈다.

이 내 코드이지만, 어떤 help'd가 aprreaciated 할 나에게 많은 오류를 제공, 그들은 폴란드어있는 한>

#include <math.h> 
#include <conio.h> 
#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
#define math_length 14 
#define FOUND 1 
#define NOT_FOUND 2 


typedef char* string; 


string read(); 
string transform(string infix); 
char zmienna; 
string math[math_length]={"cos", "sin", "tan", "acos", "asin", "atan", "cosh", "sinh", "tanh", "exp", "log", "pow", "sqrt"}; 
char mathsingle[math_length]={"ABCDEFGHIJKLM"}; 
int *i=0; 

int main (int argc, char *argv) 
{ 
string infix, postfix; 
infix=read(); 

if(argc>1) 
    zmienna=argv[1]; 
else zmienna='x'; 


postfix=transform(infix); 


printf("Oto wynik:%s",postfix); 
getch(); 
free(infix); 
return 0;  
} 

string read() 
{ 

int licznik=0; 
int znak; 
string tab, bufor; 


bufor=(char*) malloc (sizeof(char)); 
if (bufor==NULL) 
    exit(EXIT_FAILURE); 

do 
    { 
    znak=getchar(); 

    if (znak!=10) 
     { 
     licznik++; 
     tab=(string) realloc(bufor,licznik); 
     if (tab!=NULL) 
      { 
      bufor=tab; 
      bufor[licznik-1]=znak; 
      }  
     else 
      { 
      free(bufor); 
      puts ("Blad (re)alokacji pamieci"); 
      exit (EXIT_FAILURE); 
      } 
     } 
    } 
while (znak!=10); 
licznik++; 
tab=(string) realloc(bufor,licznik); 
if (tab!=NULL) 
    { 
    bufor=tab; 
    bufor[licznik-1]='\0'; 
    }  
return bufor; 
} 
string transform(string infix) 
{ 
    int c=0; 
    string *stos, postfix; 
    char func[5]; 
    int detective=0,liczba_stosow=0; 

    stos[liczba_stosow] = (string) malloc (strlen(infix)); 
    if (stos[liczba_stosow]==NULL) 
     exit (EXIT_FAILURE); 
    postfix = (string) malloc (strlen(infix)); 
    if (postfix==NULL) 
     exit (EXIT_FAILURE); 
    int **b = 0; 

    int j=0; 

    b = (int**) malloc (sizeof(int)*liczba_stosow); 
    b[liczba_stosow] = (int*) malloc (sizeof(int)*strlen(infix)); 
    if (b[liczba_stosow]==NULL) exit (EXIT_FAILURE); 
    *(b[liczba_stosow])=0; 

    while(infix[*i]!='\0') 
    { 
//----------------------------------------------------------------------------CYFRY I ZMIENNA---------------------------------------------------------------------------------------------------------------- 
     if(infix[*i]<58 && infix[*i]>47 && infix[*i]==zmienna) 
     { 
      //WYJŚCIE 
      postfix[j]=infix[*i]; 
      *i++; 
      j++; 
     } 
//----------------------------------------------------------------------------LITERY------------------------------------------------------------------------------------------------------------------------- 
     else if(infix[*i]>96 && infix[*i]<123) 
     { 
      //POBIERA AŻ DO NAWIASU, POTEM SZUKA STRINGA W math POPRZEZ strcmp. PO NAWIASIE ODSYŁA DO INNEJ FUNKCJI KTÓRA TRANSFORMUJE TEN KAWAŁEK 
      while((infix[*i]!='(') || (c!=6)) //pobiera do (
      { 
       func[c]=infix[*i]; 
       c++; 
       *i++; 
      } 
      if (c==6) 
       exit(EXIT_FAILURE); //jak ktoś nie umie pisać i podana funkcja będzie dłuższa niż te dozwolone, to zamiast przekraczać zakres, program wywala error 
      for(c=0; c<math_length; c++) //szuka stringa 
       if(strcmp(func,math[c])==0) 
       { 
        detective=FOUND; 

        break; 
       } 
       else detective=NOT_FOUND; 
      if (detective==NOT_FOUND) //jeśli szukało a nie znalazło to dupa->wywala error 
       exit(EXIT_FAILURE); 




     } 
//--------------------------------------------------------------------------OPERATORY------------------------------------------------------------------------------------------------------------------------- 
     else if(infix[*i] == ('+' || '-' || '*' || '/' || '^')) 
     { 
      //3 PRZYPADKI, KAŻDY PO 2 ODDZIELNE PODPKTY, STOS ALBO WYJŚCIE 
      if(*(b[liczba_stosow])==0) 
      { 
       stos[liczba_stosow][*(b[liczba_stosow])]=infix[*i]; 
       *(b[liczba_stosow])++; 
       i++; 
      } 
      else 
       switch (stos[liczba_stosow][*(b[liczba_stosow])-1]) 
       { 
       case '+': 
       case '-': 
        stos[liczba_stosow][*(b[liczba_stosow])]=infix[*i]; 
        *(b[liczba_stosow])++; 
        *i++; 
        break; 
       case '*': 
       case '/': 
        if(infix[*i]==('/' || '^')) 
        { 
         stos[liczba_stosow][*(b[liczba_stosow])]=infix[*i]; 
         *(b[liczba_stosow])++; 
         i++; 
        } 
        else 
        { 
         postfix[j]=stos[liczba_stosow][*(b[liczba_stosow])-1]; 
         j++; 
         stos[liczba_stosow][*(b[liczba_stosow])-1]=infix[*i]; 
         i++; 
        } 
        break; 
       default: //zostaje tylko^
        if(infix[*i]=='^') 
        { 
         stos[liczba_stosow][*(b[liczba_stosow])]=infix[*i]; 
         *(b[liczba_stosow])++; 
         i++; 
        } 
        else 
        { 
         postfix[j]=stos[liczba_stosow][*(b[liczba_stosow])-1]; 
         j++; 
         stos[liczba_stosow][*(b[liczba_stosow])-1]=infix[*i]; 
         i++; 
        } 
        break; 
       } 
     } 
//---------------------------------------------------------------------------------NAWIAS L------------------------------------------------------------------------------------------------------------------ 
     else if(infix[*i]=='(') 
     { 
     liczba_stosow++; 
     *i++; 
     stos[liczba_stosow] = (string) malloc (strlen(infix)); 
     if (stos[liczba_stosow]==NULL) exit (EXIT_FAILURE); 

     b[liczba_stosow] = (int*) malloc (sizeof(int)*strlen(infix)); 
     if (b[liczba_stosow]==NULL) exit (EXIT_FAILURE); 

     stos[liczba_stosow]=NULL; 
     b[liczba_stosow]=0; 
     } 
//---------------------------------------------------------------------------------NAWIAS P------------------------------------------------------------------------------------------------------------------ 
     else if(infix[*i]==')') 
     { 
      for(c=*(b[liczba_stosow]); c>0; c--) 
      {    
       postfix[j]=stos[liczba_stosow][c]; 
       j++; 
      } 
      *i++; 
      free(stos[liczba_stosow]); 
      free(b[liczba_stosow]); 
      liczba_stosow--; 

      if(detective==FOUND) 
      { 
      postfix[j]=mathsingle[c]; //dodaje na koniec wielką literę odpowiadającą funkcji 

      for(c=0; c<5; c++)  //czyści tablicę dla przyszłych pokoleń 
       func[c]=0; 
      c=0; 
      detective=0; 
      j++; 
     } 
//-----------------------------------------------------------------------------NIEZNANY ZNAK----------------------------------------------------------------------------------------------------------------- 
     else exit(EXIT_FAILURE); 
    } 

//-----------------------------------------------------------------------------KONIEC TRANSFORMACJI---------------------------------------------------------------------------------------------------------- 





    //LICZY POCHODNA Z POST FIXA 
} 
    return postfix; 
} 

의 논평을 신경 쓰지 마십시오.

Visual Studio 2010 Ultimate에서 작업합니다. 다음과 같은 오류가 발생합니다.

구문 오류 : ';'이 (가) 누락되었습니다. '유형'

'B'전에 : 선언되지 않은 식별자 ('B'& 'J'로이 얻을)

첨자는 배열 또는 포인터 유형이 필요

'무료'전화

에 너무 적은 인수

Btw, 프로그래밍으로 내 모험을 시작하기 만하면 너무 조롱하지 마세요.

답변

1

변수 bj의 선언을 함수 transform()의 맨 위로 이동하십시오. 변경 :

string transform(string infix) 
{ 
    int c=0; 
    string *stos, postfix; 
    char func[5]; 
    int detective=0,liczba_stosow=0; 

    stos[liczba_stosow] = (string) malloc (strlen(infix)); 
    if (stos[liczba_stosow]==NULL) 
     exit (EXIT_FAILURE); 
    postfix = (string) malloc (strlen(infix)); 
    if (postfix==NULL) 
     exit (EXIT_FAILURE); 
    int **b = 0; 

    int j=0; 

    ... 
} 

에 :

string transform(string infix) 
{ 
    int c=0; 
    string *stos, postfix; 
    char func[5]; 
    int detective=0,liczba_stosow=0; 
    int **b = 0; 
    int j=0; 

    stos[liczba_stosow] = (string) malloc (strlen(infix)); 
    if (stos[liczba_stosow]==NULL) 
     exit (EXIT_FAILURE); 
    postfix = (string) malloc (strlen(infix)); 
    if (postfix==NULL) 
     exit (EXIT_FAILURE); 

    ... 
} 

C99 표준 허용 않습니다

혼합 된 선언 및 코드 : 변수 선언은 더 이상 범위 또는의 시작을 파일로 제한되지 않습니다 복합 선언문 (블록)

이지만 VC 컴파일러는 C99을 지원하지 않습니다 (here 참조).

편집 : 코드의 또 다른 문제점은 기능이 transform() 인 초기화되지 않은 변수 stos의 사용입니다.