không nhớ nick này của ai nữa,hình như của CN2,cậu đang chứng minh lại WFF ah???
bài của anh rook_rox làm trên codeblock nên nếu cậu không dùng các trình biên dịch chuẩn mới sẽ không dịch được đâu,bọn mình đang học Tubor C++ thì tớ khuyên cậu nên dùng theo cách này
1. Vấn đề đầu tiên mình gặp phải là độ dài của chuỗi ký tự đó ko cố định, nó tùy thuộc vào người nhập vì thế minh định dùng mảng nhưng cũng ko được ổn lắm vì biết dùng mảng kích thước bao nhiêu cho đủ? Còn nếu dung con trỏ thì mình ko biết xin cấp phát thế nào (vì đâu có bít kích thước). Mong các bạn chỉ giúp.
-> đầu tiên,nếu cậu không biết kích thước của mảng string bao nhiêu cậu có thể cấp phát động cho nó,không sao hết dùng new delete như thường
2. Vấn đề thứ hai là việc tách lấy các chuỗi con của chuỗi ban đầu. Yêu cầu của thuật toán là phải tách lấy chuỗi con Beta cân bằng ngoặc.
việc tách chuỗi cũng đơn giản thôi,cậu cho chạy từ đầu đến cuối nếu gặp dấu ( thì dừng lại tiếp tục xây thêm 1 vòng lặp nữa từ nơi i vừa dừng khi đến dấu ) thì dừng vòng lặp ( break nha )và tự xây 1 hàm copy xâu từ điểm i đến điểm j cậu vừa tìm được,cứ tiếp tục vòng lặp như vậy cậu sẽ có 1 mảng xâu nữa -> xâu đó chính là xâu đã tách ra
nếu cậu vẫn không làm được mình sẽ post code
Code:
//ho va ten : Nguyen Huy Son
//Lop D07CNTT3
#include "iostream.h"
#include "string.h"
#include "conio.h"
int kiemtra2ngoi(char menhde[1000],int n);
int canbangngoac(char menhde[1000],int n);
void kiemtramenhde(char menhde[1000]);
int main()
{
char menhde[1000];
cout<<"\n Define in Computer \n\n"<<"\n v define or\n\n ^ define and \n - define not\n i define if,then \n o define if and only if\n";
cout<<" 1 Menh De don la 1 Ky Hieu VD nhu A,B,C...\n ";
cout<<"\n VD Menh De ((A^B)vC)i(Dv(-C)) tuong duong voi ((A^B)VC)->(Dv(-C))\n";
cout<<"\nImput WFF:";
cin.getline(menhde,1000);
if((menhde[0]!='('&&strlen(menhde)!=1)||(menhde[0]=='('&&strlen(menhde)==1))
{
cout<<"\n menh de phai chua trong dau ngoac\n";
return 0;
}
kiemtramenhde(menhde);
return 0;
}
int kiemtra2ngoi(char menhde[1000],int n)
{
for (int i=0;i<n-2;i++)
{
if (menhde[i]=='^'||menhde[i]=='v'||menhde[i]=='o'||menhde[i]=='i')
{
if (menhde[i+1]=='(')
{
for(int j=i+1;j<n;j++)
{
if
(menhde[j]==')'&&(menhde[j+1]=='^'||menhde[j+1]=='v'||menhde[j+1]=='o'||menhde[j+1]=='i')&&menhde[j-1]!=')')
{
return -1;
}
}
}
else
{
if
(menhde[i+2]!=menhde[i]&&(menhde[i+2]=='^'||menhde[i+2]=='v'||menhde[i+2]=='o'||menhde[i+2]=='i'))
{
return -1;
}
}
}
}
return 0;
}
int canbangngoac(char menhde[1000],int n)
{
int save =0,i,j,test =0;
for(i =0;i<n;i++)
{
if(menhde[i] == '(')
{
test = save + 1;
for(j = 1+ save;j<n;j++)
{
if(menhde[j]== ')')
{
save = j; //luu lai vi tri tim ra can bang ngoac
break;
}
}
if(save == test -1 ) // vi da dat test = save + 1;
{
return -1; //vi thieu dau ngoac )
}
}
else if(menhde[i] == ')')
{
test = save - 1;
for(j = - 1 + save;j>=0;j--)
{
if(menhde[j]== '(')
{
save = j; //luu lai vi tri tim ra can bang ngoac
break;
}
}
if(save == test + 1 ) // vi da dat test = save + 1;
{
return -1; //vi thieu dau ngoac )
}
}
}
return 0;
}
void kiemtramenhde(char menhde[1000])
{
int n=strlen(menhde);
if (menhde[n-1]=='^'&&menhde[n-1]=='v'&&menhde[n-1]=='o'&&menhde[n-1]=='i')
{
cout<<"menh de sai do toan tu o vi tri cuoi cung\n";
getch();
return ;
}
if (menhde[0]=='^'||menhde[0]=='v'||menhde[0]=='o'||menhde[0]=='i')
{
cout<<"menh de bat dau bang toan tu\n";
getch();
return ;
}
for(int i=0;i<n;i++)
{
if(menhde[i]=='(')
{
if (menhde[i+1]=='^'||menhde[i+1]=='v'||menhde[i+1]=='o'||menhde[i+1]=='i')
{
cout<<"menh de sai do ( va toan tu phia sau gan nhau\n";
getch();
return ;
}
else if(i>0&&menhde[i-1]!='^'&&menhde[i-1]!='v'&&menhde[i-1]!='o'&&menhde[i-1]!='i'&&menhde[i-1]!='-'&&menhde[i-1]!='(')
{
cout<<"menh de sai do khong co toan tu truoc dau (\n";
getch();
return ;
}
}
else if (menhde[i]==')')
{
if (menhde[i-1]=='^'||menhde[i-1]=='v'||menhde[i-1]=='o'||menhde[i-1]=='i')
{
cout<<"menh de sai do ) va toan tu phia truoc gan nhau\n";
getch();
return ;
}
else if
(i<n-1&&menhde[i+1]!='^'&&menhde[i+1]!='v'&&menhde[i+1]!='o'&&menhde[i+1]!='i'&&menhde[i+1]!=')')
{
cout<<"menh de sai do khong co toan tu sau dau )\n";
getch();
return ;
}
}
else if (menhde[i]=='^'||menhde[i]=='v'||menhde[i]=='o'||menhde[i]=='i')//neu toan tu
{
if (menhde[i-1]=='^'||menhde[i-1]=='v'||menhde[i-1]=='o'||menhde[i-1]=='i')
{
cout<<"menh de sai do 2 toan tu sat nhau \n";
getch();
return ;
}
}
else if (menhde[i]!='^'&&menhde[i]!='v'&&menhde[i]!='o'&&menhde[i]!='i')
{
if(menhde[i-1]!='^'&&menhde[i-1]!='v'&&menhde[i-1]!='o'&&menhde[i-1]!='i'&&i>0&&menhde[i-2]!=')'&&menhde[i-1]!='('&&menhde[i-1]
!='-')
{
cout<<"menh de sai,menh de thu "<<i <<" sat nhau voi menh de "<<i-1<<"\n";
getch();
return ;
}
}
}
if (canbangngoac(menhde,n)==0&&kiemtra2ngoi(menhde,n)==0)
{
int dem =0,demtoantu=0;
for(i=0;i<n;i++)
{
if (menhde[i]=='(')
{
dem++;
}
else if (menhde[i]=='v'||menhde[i]=='^'||menhde[i]=='i'||menhde[i]=='o')
{
demtoantu++;
}
}
if (demtoantu>dem)
{
cout<<"menh de sai thieu dau ngoac ngoai cung";
getch();
return;
}
cout<<"menh de da dung\n";
getch();
return ;
}
else if(canbangngoac(menhde,n)==-1)
{
cout<<"menh de sai do khong can bang ngoac\n";
getch();
return ;
}
else
{
cout<<"menh de sai do logic chi co phep toan 2 ngoi \n";
getch();
return ;
}
return ;
}
chạy trên TC nha,thầy bắt thế mà