1

大家好。

这段代码给了我很多困难。不知道如何处理它等。最后我有了一些想法,如何将其转换为后缀表示法(RPN)。

这是我的代码,但它给了我很多错误,任何帮助都会得到帮助;>

#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' 获取这些标识符)

下标需要数组或指针类型

'free' : 调用的参数太少

顺便说一句,请不要嘲笑我太多,因为我只是开始我的编程冒险。

4

1 回答 1

1

将变量的声明b移到j函数的顶部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(参见此处)。

编辑:请注意代码的另一个问题是stos在 function中使用了未初始化的变量transform()

于 2011-12-27T21:12:14.460 回答