gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 04:03:49 25 4
gpt4 key购买 nike

大家好。

这段代码给我带来了很多困难。不知道如何处理它等。最后我有了一些想法,如何将它转换为后缀表示法 (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 上工作。这些是我得到的错误:

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

顺便说一句,请不要 mock 我太多,因为我才刚刚开始我的编程冒险。

最佳答案

将变量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标准确实允许:

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

但是 VC 编译器不支持 C99(参见 here)。

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

关于c - 使用 math.h 中的变量和函数对后缀转换进行中缀(稍后确定符号积分),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8649148/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com