30/09/2018, 18:43

Xin ý tưởng so sánh 2 biểu thức boolean

Đề: Nhập vào 2 biểu thức boolean và so sánh xem 2 biểu thức đó có bằng nhau không. ví dụ:
F1 = A*B + A*C
F2 = X*Y*Z + X*Z + Y
Viết chương trình so sánh F1 == F2 không
Mình có ý tưởng là dựa vào bảng chân trị nhưng không biết làm như thế nào??

huong viết 20:55 ngày 30/09/2018

Mình nghĩ muốn so sánh 2 biểu thức boolen thì phải tính giá trị của biểu thức 2 vế ra rồi so sánh thôi (Tìm bảng chân trị 2 vế như bạn nói ấy)

  • Mình có ý tưởng như này: Để tìm bảng chân trị thì sẽ dùng mảng:
  • Mảng lưu dòng cuối của bảng chân trị (Tức kết quả biểu thức) là mảng 1 chiều có 2^n phần tử (n là số biến).
    Dùng vòng lặp để tính giá trị biểu thức rồi lưu giá trị vào mảng kết quả, bao nhiêu biến thì bấy nhiêu vòng lặp (Chắc chuối).
    Sau đó so sánh 2 mảng kết quả.
    Ví dụ tính f1 = AB + AC ( hoặc hình như là (A and B) || (A and C) thì phải, cái này m quên mất rồi)
    Dùng vòng lặp:
for(i = 0; i < 2; i++)
    for(j = 0; j < 2; j++)
        for(k = 0; k < 2; k++) {
            //tinh bieu thuc:
            bool gt = (i and j) || (i and );
            // luu gt vào mảng kết quả.
        }

Nhưng cách trên có 2 cái cần giải quyết là

  • làm sao để máy tự tạo vòng lặp với số lần lặp là số biến, cái này giải quyết bằng dùng mảng 2 chiều n x2 , với n là số biến , mỗi hàng có giá trị 0 1 hoặc true fale
  • Còn điều thứ 2 mình cũng đang trăn trở là làm sao để máy nó hiểu được biểu thức người dùng nhập. Không biết dùng kí pháp nghịch đảo balan co được không.
Interns viết 20:57 ngày 30/09/2018

Quan trọng là chỗ tính biểu thức ấy bạn ơi, làm thế nào để bạn có được (i && j) || (i && k );

huong viết 20:44 ngày 30/09/2018

Bạn thử tìm hiểu về kí pháp nghịch đảo balan xem, mình cũng góp ý vậy chứ chưa làm.

Interns viết 20:46 ngày 30/09/2018

Làm sao để thay giá trị i,j,k lần lượt cho A,B,C khi tính toán??

huong viết 20:55 ngày 30/09/2018

it nhất cũng phải có quy ước nhập biểu thức chứ nhập biến bắng chữ lung tung sao dc, ví dụ nhập theo x1,x2,x3,x4…
từ đó gán vào các i j k rồi tính.
Hoặc nếu biết trước số biến rồi thì tốt hơn. Thường thì làm việc với mấy biểu thức 4 biến trở xuông thôi chứ nhiều biến thì phức tạp quá

huong viết 20:44 ngày 30/09/2018

Bạn tham khao cái này, mình mới làm buỏi sáng. code thực hiện nhập 1 biểu thức bool 3 biến (dài loằng ngoằng cũng được miễn là 3 biến) , sau đó đưa ra bảng chân trị.
Trong đó có sử dụng kí pháp ngịch đảo balan để chuyển biểu thức sang dạng hậu tố.
Biểu thức nhập vào ở dạng đơn giản nhất tức chỉ có các biến A,B,C,( không co phủ định) và các toán tử + * () Nhưng dựa vào đó có thể phát triển ra như:

  • Thêm phủ định, các phép tính nhu xor, xand…
  • Nhận biết được số biến người dùng nhập vào để sử dụng bao nhiêu vòng lặp,…
    Nói chung nghĩ đển mấy cái trên đã ớn rồi, Bạn tìm hiểu thêm vậy.
#include <iostream>
#include <string>
#include <stack>
using namespace std;

/*________________________________CAC HAM HO TRO TINH GIA TRI BIEU THUC_______________*/
//Ham kiem tra xem co phai toan hang khong, muc don gian chi kiem tra 3 chu ABC voi 01
bool isToanhang(char toanhang)
{
	if(toanhang >= 'A' && toanhang <= 'C' || toanhang == '0' || toanhang == '1' ) return true;
	return false;
}

//Kiem tra chu co phai toan tu khong, muc don gia chi co + va * tuc and va or
bool isToantu(char toantu)
{
	if(toantu == '+' || toantu == '*') return true;
	return false;
}
//Hma kiem tra do uu tien toan tu
int uutien(char toantu)
{
	if(toantu == '+') return 1; //dau cong thap nhat
	if(toantu == '*') return 2; //roi den dau *
	else return -1;
}

//Ham chuyen tu dang trung to sang hau to, ho tro dac luc cho viec tinh toan bieu thuc.
//Muc don gian thi biet thuc chi co 3 bien tro xuong A,B,C va cac toan tu + *
void trungToHau(string a, string &b)
{
	//khoi tao 1 stack
	stack<char> toantu;
	//Duyet tung chu 1 trong chuoi a den khi het
	int i = 0;
	while(i < a.length())
	{
		//Neu x la toan hang thi them x vao b
		if ( isToanhang(a[i]) ) b+= a[i];
		//Neu x la dau ( thi dua vao stack
		if(a[i] == '(') toantu.push(a[i]);
		//Neu x l dau )
		if(a[i] == ')')
		{
			//Dua het toan tu trong stack ra den khi gap ( trong stack
			while(toantu.top() != '(')
			{
				b+= toantu.top();	//Lay gia tri top
				toantu.pop();		//xoa gia tri top
			}
			toantu.pop(); //Dua luon ( ra khoi stack
		}
		//Neu a[i] la toan tu
		if(isToantu(a[i]))
		{
			//Neu stack rong hoac la ( thi dua phep toan vao stack
			if(toantu.empty() || toantu.top() == '(') toantu.push(a[i]);
			//Neu toan tu o stack uu tien thap hon toan tu a[i] thi dua a[i] vao stack
			else if( uutien(toantu.top()) < uutien(a[i]) )
				toantu.push(a[i]);
			else
			{
				//Neu toan tu o stack uu tien hon toan tu a[i]
				do
				{
					//Lay toan tu o stack va dua vao b
					b += toantu.top();
					toantu.pop();
				}
				while( !toantu.empty() && uutien(toantu.top()) > uutien(a[i]) );
				toantu.push(a[i]);
			}
		}

		i++;
	}

	//Lay tat ca trong stack ra va dua vao b
	while(!toantu.empty())
	{
		b+= toantu.top();
		toantu.pop();
	}
}

//Ham ghep cac bien A,B,C thanh 0,1
void ghepBien(string &hauto, char i, char j, char k)
{
	for(int dem = 0; dem < hauto.length(); dem++)
	{
		if(hauto[dem] == 'A' ) hauto[dem] = i;
		if(hauto[dem] == 'B' ) hauto[dem] = j;
		if(hauto[dem] == 'C' ) hauto[dem] = k;
	}
}

//Tinh toan bieu thuc o dang hau to
int tinhBieuThuc(string hauto)
{
	stack<int> ketqua;
	for(int i = 0; i < hauto.length(); i++) //Duyet tung chu cai
	{
		if(isToanhang(hauto[i]))
			{
				//Neu la toan hang thi dua vao stack
				int temp = hauto[i] - '0';
				ketqua.push(temp); 
			}
		if(hauto[i] == '+') //Neu la phep cong
		{
			int so1 = ketqua.top();
			ketqua.pop();
			int so2 = ketqua.top();
			ketqua.pop();
			ketqua.push(so1 || so2);
		}

		if(hauto[i] == '*') 
		{
			int so1 = ketqua.top();
			ketqua.pop();
			int so2 = ketqua.top();
			ketqua.pop();
			ketqua.push(so1 && so2);
		}
	}
	return ketqua.top();
}

int main()
{
	//Vi du
	string f1 = "A*B*C+A*A*B";
	string f2 =  "A*B*(C+B)";
	cout<<"Chan tri cua f1: "<<endl;
	for(char i = '0'; i < '2'; i++)
		for(char j = '0'; j < '2'; j++)
			for(char k = '0'; k < '2'; k++)
			{
				string hauto;
				trungToHau(f1,hauto);
				ghepBien(hauto,i,j,k);
				cout<<tinhBieuThuc(hauto)<<"-";
			}
	
	cout<<"\nchan tri cua f2: \n";
	for(char i = '0'; i < '2'; i++)
		for(char j = '0'; j < '2'; j++)
			for(char k = '0'; k < '2'; k++)
			{
				string hauto;
				trungToHau(f2,hauto);
				ghepBien(hauto,i,j,k);
				cout<<tinhBieuThuc(hauto)<<"-";
			}
	cout<<endl;
	system("pause");
	return 0;
}
Interns viết 20:54 ngày 30/09/2018

Cảm ơn bạn nhiều nhe!

Bài liên quan
0