모두 안녕하세요.math.h에서 변수 및 함수를 사용하여 중위 수식으로 후미 변형 (나중에 상징적 적분을 결정)
이 코드는 나에게 많은 어려움을 겪었습니다. 그것을 어떻게 appoach하는지 모르겠다. 마침내 나는 RPN (postfix notation)으로 변환하는 방법을 알아 냈다.
이 내 코드이지만, 어떤 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, 프로그래밍으로 내 모험을 시작하기 만하면 너무 조롱하지 마세요.