#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
پست های مرتبط:
تفاوت بین عبارت auto و decltype در C++
هر دو برای تعیین نوع متغیرها استفاده میشوند، اما دارای کاربردها و عملکردهای متفاوتی هستند…
نحوه استفاده از توابع متغیر در C++
در C++، شما میتوانید از توابع متغیر (inline functions) برای تعریف توابع کوچک و ساده استفاده کنید…
نحوه استفاده از جداول در C++
در C++، شما میتوانید از آرایهها برای ایجاد جداول استفاده کنید. یک جدول در C++ مانند یک آرایه چند بعدی…
نحوه استفاده از شورت کاتینگ در C++
شورت کاتینگ یک تکنیک بهینه سازی است که به کمک آن میتوانید عملیات های محاسباتی را بهینه تر انجام دهید…
نحوه استفاده از پوینتر ها در C++
در زبان برنامهنویسی C++، پوینترها یکی از ابزارهای مهم برای مدیریت حافظه و ارجاع به آدرسهای حافظه هستند. با استفاده از پوینترها، میتوانید به طور مستقیم به حافظه دسترسی پیدا کنید و اطلاعات را در آن ذخیره و با آن کار کنید.
تفاوت بین عبارت const و constexpr در C++
بنابراین، تفاوت اصلی بین const و constexpr این است که const برای تعریف متغیرهای ثابت استفاده میشود که مقدار آنها در زمان اجرا مشخص میشود، در حالی که constexpr برای تعریف ثابتهایی استفاده میشود که مقدار آنها در زمان کامپایل قابل محاسبه است.