2011-12-27 3 views
1

まあこんにちは。後で記号積分を決定するために、変数と関数を使用した後置精度変換(後で記号積分を決定する)

このコードは、私に大変な時間を与えてくれました。どのようにアタッチするのかわからなかった。 最後に、それを後置記法(RPN)に変換する方法をいくつか考えました。

これは私のコードですが、それは私にエラーの多くを与え、任意の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の使用です。

関連する問題