使用变量 & 进行中缀到后缀转换math.h 中的函数(稍后确定符号积分)
嗯,大家好。
这段代码给我带来了很多困难。不知道如何解决它等。 最后我得到了一些想法,如何将其转换为后缀表示法(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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
将变量
b
和j
的声明移至函数transform()
的顶部。更改
为:
C99 标准允许:
,但 VC 编译器不支持 C99(请参阅 此处)。
编辑:注意代码的另一个问题是在函数
transform()
中使用未初始化的变量stos
。Move the declarations of the variables
b
andj
to the top of the functiontransform()
.Change:
to:
The C99 standard does allow:
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 functiontransform()
.