PDA

View Full Version : سوال: برنامه ای برای تشخیص کاربرد صحیح آکولاد یا پرانتز در یک عبارت ریاضی



mohammadsetayesh
چهارشنبه 19 خرداد 1389, 18:06 عصر
با سلام
برنامه ای به زبان Cیا ++c می خواهم که پس از گرفتن یک عبارت ریاضی تشخیص دهد که تعداد کروشه یا پرانتز یا آکولاد ها بطور صحیح بکار برده شده اند یا نه!

با تشکر.

tdkhakpur
چهارشنبه 19 خرداد 1389, 18:37 عصر
اگر داده بازگشتی ار تابع true باشد صحیح در غیر اینصورت عملیات نادرست است!


bool IsCurrect(char *MathStr)
{
int Akolad_c=0, Parantez_c=0;
bool value = true;
for(int i=0; i<strlen(MathStr); i++)
if( MathStr[i] ==')' || MathStr[i] =='(' ) Parantez_c ++;
else
if( MathStr[i] =='{' || MathStr[i] =='}' ) Akolad_c ++;
if(value )
value = Akolad_c%2==0;
if(value )
value = Parantez_c%2==0;
return value;
}

mohsensaghafi
چهارشنبه 19 خرداد 1389, 23:10 عصر
سلام دوست عزیز.
این تابعی که شما نوشتید در حالات خاصی جواب می دهد. مثلا برای عبارت زیر درست جواب نخواهد داشت.

(a+b)*c)+d(
این عبارت صحیح نیست ولی برنامه شما آن را درست ارزیابی می کند.
راه حل صحیح آن با استفاده از stack است.

ztx4
چهارشنبه 19 خرداد 1389, 23:55 عصر
با سلام
برنامه ای به زبان Cیا ++c می خواهم که پس از گرفتن یک عبارت ریاضی تشخیص دهد که تعداد کروشه یا پرانتز یا آکولاد ها بطور صحیح بکار برده شده اند یا نه!

با تشکر.

همون طور که دوست خوبمون فرمودند شما باید از پشته استفاده کنید.
یعنی هر آکولاد بازی که خوانده شد یک عدد 1 در پشته قرار بگیره و با هر آکولاد بسته یکی از این 1 ها از پشته برداشته بشه.
در نهایت اگر پشته خالی باشه معنیش اینه که آکولاد ها به صورت درست ترکیب شده اند.
این جواب در مورد پرانتز و کروشه هم همین طوره.

tdkhakpur
چهارشنبه 19 خرداد 1389, 23:58 عصر
این تابعی که شما نوشتید در حالات خاصی جواب می دهد. مثلا برای عبارت زیر درست جواب نخواهد داشت

درسته من فقط کد بررسی تعداد را ارسال کرده بودم. خودتان هم باید بدانید که عملیات ریاضی با توجه فرمولهای ریاضی بررسی های متفاوتی نیاز دارد این قسمت پایینترین این بررسیهاست .
به هر صورت میتوان بدون پشته هم این عمل را انجام داد.


bool IsCurrect(char *MathStr)
{
bool value = true;
char *Actions={"(){}"};
char *tmp;
int c=0;
tmp = new char[strlen(MathStr)];
for(int i=0; i<strlen(MathStr); i++)
switch(MathStr[i])
{
case '(':
case ')':
case '{':
case '}':
tmp[C++‎] = MathStr[i];
break;
}
for(int i=0; i<c/2 && value; i++)
for( int j=0; j<2 && value; j++ ){
if(tmp[i]!=Actions[j*2] || tmp[c-i-1]!=Actions[j*2+1])
value = false;
break;
}
delete [] tmp;
return value;
}

kmf2001
یک شنبه 23 خرداد 1389, 00:21 صبح
سلام خدمت دوستان برنامه نویس
برنامه ای برای تشخیص کاربرد صحیح آکولاد یا پرانتز در یک عبارت ریاضی نوشته ام که فقط عبارت پرانتز را با استفاد از شرط تشخیص میدهد لطفا کمک کنید که دیگر عبارات مانند {} و [] را نیز تعیین کند


#include<stdio.h>
#include<conio.h>
#define m 20
void push(char i);
char pop(void);
char stack1[m],a,ch1,stack[m];
int top=0;
int p=0,b=0,tp=0;
int main()
{
clrscr();
printf("\n\t Lotfan Ebarat Ra Vared Konid:");
gets(stack1);
while(stack1)
{
if(stack1[p]=='(')
{
push(stack1[p]);
tp++;
}
if(stack1[p]==')')
{
a=pop();
if(a=='+')
{
printf("Error\n");
b++;
break;
}
else
b++;
}
if(stack1[p]=='\0')
break;
p++;
}

if(tp==b)
{
printf("tedad prantez baz=%d\n",tp);
printf("tedad parantez basteh=%d\n",b);
printf("baz ,basteh kaml ast");
}
else
{
printf("parantez baz va basteh kaml nist\n");
}
getch();
return 0;
}
////////////////////
void push(char i)
{
if(top>=20)
{
printf("\n stack por ast");
getch();
return;
}
stack[top]=i;
top++;
}///////////////////////
char pop(void)
{
top--;
if(top<0)
{
printf(" stack khali ast\n");
return '-';
}
return stack[top];
}

kmf2001
یک شنبه 23 خرداد 1389, 18:12 عصر
کسی نبود بتونه کمک کنه؟

tdkhakpur
یک شنبه 23 خرداد 1389, 18:21 عصر
مگر کد ارسل شده درست کار نمیکند؟

kmf2001
یک شنبه 23 خرداد 1389, 23:13 عصر
نه فقط عبارت پرانتز را شناسائی میکند

tdkhakpur
دوشنبه 24 خرداد 1389, 13:40 عصر
نه فقط عبارت پرانتز را شناسائی میکند
فكر نكن كد زير هم داخلش هست


char *Actions={"(){}"};

Salar Ashgi
دوشنبه 24 خرداد 1389, 15:45 عصر
كلا جدا از بحث رياضيات ، براي مفاهيم دو طرفه يا دو جهته مثل همين مساله شما ، معكوس رشته ،

palindrome بودن يك رشته و ... استفاده از Stack يا پشته گزينه مناسبي است .

البته ميشه بدون پشته هم كار رو انجام داد ، ولي كمي كار مشكل خواهد شد .



برنامه ای به زبان Cیا ++c می خواهم

در ضمن ، دوست عزيز mohammadsetayesh (http://www.barnamenevis.org/forum/member.php?u=140222)، درخواست انجام تمرينات برنامه نويسي ممنوع است .

kmf2001
دوشنبه 24 خرداد 1389, 21:13 عصر
فكر نكن كد زير هم داخلش هست


char *Actions={"(){}"};


کجای برنامه ست ؟
من که نمیبینم

یا اینکه اون خط رو هم اضافه کنم بهش؟
اگه اضافه کنم به کجای برنامه؟

kmf2001
دوشنبه 24 خرداد 1389, 21:16 عصر
فكر نكن كد زير هم داخلش هست


char *Actions={"(){}"};


ولی اون دستور شما مربوط به انجام بدون پشته ست

برنامه ای که نوشتم توسط پشته بوده حالا نمیدونم که درست انجامش دادم یانه؟
اگه زحمتی نیست یه بار امتحانش کن ببین کجای برنامه ایراد داره
درضمن اگه بخوام بقیه عبارتها رو هم اضافه کنم چجوری باید اضافه بشن؟

مرسی.