#include
#include
#include
#include
#include
//************************** stack ****************************************
struct stack
{
char info;
stack *link;
}*ss;
//************************** stack ****************************************
struct stack2
{
long info;
stack2 *link;
}*ss2;
//************************** num ***************************************
struct number
{
long value;
char chr;
number *link;
}*ns;
//************************** check num **********************************
long checknum(char chr)
{
number *ptr;
ptr = ns;
while ( ptr != NULL)
{
if ( ptr->chr == chr) return ptr->value;
ptr = ptr->link;
}
return 0;
}
//************************** insert num **********************************
void insertnum(long value, char chr)
{
number *ptr;
ptr = (number*) malloc(sizeof(number));
ptr->link = ns;
ptr->chr = chr;
ptr->value = value;
ns = ptr;
}
//************************** push ***************************************
void push(char item)
{
stack *ptr;
ptr = (stack*) malloc(sizeof(stack));
ptr->info = item;
ptr->link = ss;
ss = ptr;
}
//************************** pop ****************************************
char pop()
{
stack *ptr;
ptr = ss;
char temp;
temp = ss->info;
ss = ss->link;
free(ptr);
return temp;
}
//************************** push ***************************************
void push2(long item)
{
stack2 *ptr;
ptr = (stack2*) malloc(sizeof(stack2));
ptr->info = item;
ptr->link = ss2;
ss2 = ptr;
}
//************************** pop ****************************************
long pop2()
{
stack2 *ptr;
ptr = ss2;
long temp;
temp = ss2->info;
ss2 = ss2->link;
free(ptr);
return temp;
}
//************************** mid ****************************************
char mid ( char source[] , int position , int count , char destination[])
{
int qcount = 0 , len ;
len = strlen(source);
for ( int i = position - 1 ; i < position + count - 1 && i < len ; i++ , qcount++)
destination[qcount] = source[i];
destination[qcount] = 0;
if ( qcount == 1) return destination[0];
else return 0;
}
//************************** priority **************************************
int priority(char a , char b)
{
if ( a == '^') return 1;
if ( b == '^') return 0;
if ( a == '*' || a == '/' || a == '%' ) return 1;
if ( b == '*' || b == '/' || b == '%' ) return 0;
return 1;
}
//************************** pulish ****************************************
void pulish(char source[] , char dest[] , int len)
{
char temp , temp2[2];
int count = 0;
for ( int i = 0 ; i < len ; i++)
{
temp = mid(source , i + 1 , 1 , temp2);
switch (temp)
{
case '+':
case '-':
case '*':
case '/':
case '^':
case '%':
if (ss->info == '(' || priority(ss->info , temp) == 0 ) push (temp);
else
{
while (ss ->info != '(' && priority(ss->info , temp))
dest[count++] = pop();
push(temp);
}
break;
case '(':
push(temp);
break;
case ')':
while ( ss->info != '(')
dest[count++] = pop();
pop();
break;
default :
if ( temp >= 48 && temp <= 122)
dest[count++] = temp;
}
}
dest[count] = 0;
}
//************************** value ****************************************
long value(char source[] , int len)
{
char temp , temp2[2] ;
long a , b, result;
for ( int i = 0 ; i < len ; i++)
{
temp = mid ( source , i + 1 , 1 , temp2);
if ( temp >= 48 && temp <= 122)
{
a = checknum(temp);
if ( a == 0 )
{
printf("Please Enter %c =" , temp);
scanf("%u" ,&a);
insertnum(a , temp);
push2(a);
}
else push2(a);
}
else
{
b = pop2();
a = pop2();
switch (temp)
{
case '+':
result = a + b;
push2 (result);
break;
case '-':
result = a - b;
push2 (result);
break;
case '*':
result = a * b;
push2 (result);
break;
case '/':
result = a / b;
push2 (result);
break;
case '^':
result = pow(a,b);
push2 (result);
break;
case '%':
result = a % b;
push2 (result);
break;
}
}
}
return pop2();
}
//************************** main ****************************************
int main()
{
char p[102] , q[100];
clrscr();
int len;
cin>> p;
len = strlen(p);
for ( int i = len ; i > 0 ; i--)
p[i] = p[i-1];
p[0] = '(';
p[len + 1] = ')';
len +=2;
p[len] = 0;
pulish ( p , q , len);
len = strlen(q);
cout<< value ( q , len);
getch();
return 0;
}
توضیحات:
صورت سوال:
برنامه محاسبه عبارات جبری در C++
این برنامه از شما عبارت جبری را گرفته سپس مقدار هر متغیر را میگیرد در انتها نیز جواب را چاپ میکند.
شما میتوانید سوالات خود را از طریق ایمیل پشتیبانی – تماس با ما – یا در قسمت نظرات سوال خود را بپرسید.
موفق باشید
A.J
پست های مرتبط:
استفاده کردن از مفهوم variadic templates در C++ برای تعریف توابع و کلاس های قالب با تعداد متغیری از پارامتر ها
مفهوم variadic templates در C++ به برنامه نویسان اجازه میدهد تا توابع و کلاسهای قالبی را تعریف کنند که تعداد متغیری از پارامترها را…
استفاده کردن از مفهوم move semantics در C++ برای بهینه سازی انتقال داده ها به جای کپی
مفهوم move semantics در C++ امکان انتقال منابع (مانند حافظه دینامیک) به جای کپی کردن آنها فراهم میکند. این بهینهسازی از تبدیل یک…
استفاده کردن از مفهوم RAII (Resource Acquisition Is Initialization) در C++ برای مدیریت منابع به صورت خودکار
مفهوم RAII یک الگوی طراحی در C++ است که به برنامه نویس امکان میدهد منابع (مانند حافظه دینامیک، فایلها، اشیاء سخت افزاری و …) را به…
استفاده کردن از مفهوم CRTP (Curiously Recurring Template Pattern) در C++ برای ارث بری از کلاس های قالب
الگوی CRTP یک الگوی طراحی در C++ است که اجازه میدهد کلاسی از یک کلاس قالب دیگر ارث بری کند و از قالب خود برای ارث بری…
استفاده کردن از توابع متغیر (variable templates) در C++ برای تعریف متغیر های قالب دار
توابع متغیر (variable templates) از ویژگیهای C++11 به بعد است که اجازه میدهد متغیرهایی با قالبهای مختلف تعریف شوند. این ویژگی…
استفاده کردن از توابع constexpr برای ارزیابی ثابت در زمان کامپایل در C++
توابع constexpr در C++ امکان ارزیابی ثابت یا constant expression در زمان کامپایل را فراهم میکنند. این توابع به کمک این امکان، اجازه…