使用变量 & 进行中缀到后缀转换math.h 中的函数(稍后确定符号积分)

发布于 2024-12-23 10:39:22 字数 8088 浏览 1 评论 0原文

嗯,大家好。

这段代码给我带来了很多困难。不知道如何解决它等。 最后我得到了一些想法,如何将其转换为后缀表示法(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':调用参数太少

一句,请不要像我一样嘲笑我太多我才刚刚开始我的编程冒险。

Well hello everyone.

This code has given me a whole lot of a hard time. Didn't know how to appoach it etc.
Finally i got some idea, how to convert it to postfix notation (RPN).

This is my code, but it gives me a lot of errors, any help'd be 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;
}

Please don't mind the commentaries, as they're in Polish.

I work on Visual Studio 2010 Ultimate. These are the errors i get:

syntax error : missing ';' before 'type'

'b' : undeclared identifier (get these with 'b' & 'j')

subscript requires array or pointer type

'free' : too few arguments for call

Btw, please don't mock me too much as I'm merely beginning my adventure with programming.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

生活了然无味 2024-12-30 10:39:22

将变量 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(请参阅 此处)。

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

Move the declarations of the variables b and j to the top of the function transform().
Change:

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;

    ...
}

to:

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);

    ...
}

The C99 standard does allow:

intermingled declarations and code: variable declaration is no longer restricted to file scope or the start of a compound statement (block)

but the VC compilers do not support C99 (see here).

EDIT: Note another issue with the code is use of an uninitialised variable stos in function transform().

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文