C++実現求主析取模式、主合取模式

7470 ワード

離散数学は初めて実験に乗り,主析取パターンと主合取パターンとは何かを突撃的に学び,実現の構想をざっと考えた.
最初のステップは、入力した式を接尾辞式に変換することです.データ構造書に基本的な4則演算のコードと先人の考え方を結びつけて無理に1つ書いたが、頭を回すとどのように実現するか忘れてしまうところが多い.
接尾辞式に変換すると楽になります.
次にコードを貼ります.
#include
#include

using namespace std;

class SeqStack {
public:
	SeqStack(int mSize);
	~SeqStack();
	bool Push(char x);
	bool Pop();
	char Top();
	bool Empty();
private:
	int top;
	char *stack;
	int maxtop;
};
SeqStack::SeqStack(int mSize) {
	maxtop = mSize - 1;
	stack = new char[mSize];
	top = -1;
}
SeqStack::~SeqStack() {
	delete[]stack;
}
bool SeqStack::Push(char x) {
	if (top == maxtop)
		return false;
	stack[++top] = x;
	return true;
}
bool SeqStack::Pop() {
	if (-1==top )return false;
	top--;
	return true;
}
bool SeqStack::Empty() {
	if (-1==top)return true;
	return false;
}
char SeqStack::Top() {
	return stack[top];
}
bool IsLegal(const string orgin) {
	for (unsigned int i = 0; i < orgin.length(); i++) {
		if (orgin[i] != 'P' && orgin[i] != 'Q' && orgin[i] != 'R' && orgin[i] != '&' && orgin[i] != '|' && orgin[i] != '=' && orgin[i] != '>'&&orgin[i]!='!')return false;
	}
	return true;
}
int And(int a,int b, SeqStack &stack) { 
	int res = a * b;
	stack.Push(res);
	return res;
}

int Or (int a, int b, SeqStack &stack) {
	int res = a + b;
	res = res > 1 ? 1 : res;
	stack.Push(res);
	return res;
}
int Not(int a, SeqStack &stack) {  
	a = stack.Top();
	stack.Pop();
	int res = a == 1 ? 0 : 1;
	stack.Push(res);
	return res;
}

int If(int a, int b, SeqStack &stack) { //  
	int res = (b == 1 && a == 0) ? 0 : 1;
	stack.Push(res);
	return res;
}

int Iif(int a, int b, SeqStack &stack) {//   
	int res = (b == a) ? 1 : 0;
	stack.Push(res);
	return res;
}

bool CanIn(char out,SeqStack &stack) {        //      ,        
	char in = stack.Top();
	int i=0, o=0;  //              
	switch (in) {
	case '#':i = 0; break;
	case '(':i = 1; break;
	case '=':i = 3; break;
	case '>':i = 5; break;
	case '|':i = 7; break;
	case '&':i = 9; break;
	case '!':i = 11; break;
	case ')':i = 12; break;
	}

	switch (out) {
	case '#':o = 0; break;
	case '(':o = 12; break;
	case '=':o = 2; break;
	case '>':o = 4; break;
	case '|':o = 6; break;
	case '&':o = 8; break;
	case '!':o = 10; break;
	case ')':o = 1; break;
	}
	if (i < o)      //            
		return true;
	else
		return false;
}

void InfixToPostfix(string &orgin ,SeqStack &stack) {  //        
	string tmp;                //       
	stack.Push('#');                
	for (int i = 0; (unsigned)i ':res=If(a, b, stack); break;
			case '|':res=Or(a, b, stack); break;
			case '&':res=And(a, b, stack); break;
			case '!':res=Not(a, stack); break;
			}
		}
	}
	if (number == 2){
		for (int i = 0;(unsigned)i ':res = If(a, b, stack); break;
			case '|':res = Or(a, b, stack); break;
			case '&':res = And(a, b, stack); break;
			case '!':res = Not(a, stack); break;
			}
		}
	}
	return res;
}
char num2bool(int t) {
	if (0 == t)return 'T';
	else return 'F';
}


void Print(int number, string &orgin, SeqStack &stack) {
	int p, q, r, res;
	string pcnf;    //     
	string  pdnf;    //     
	if (number == 3) {
		cout << "P\t" << "Q\t" << "R\t" << "Z" << endl;
		for (p = 1; p >= 0; p--) {
			for (q = 1; q >= 0; q--) {
				for (r = 1; r >= 0; r--) {
					res = Calculate(3, orgin, stack, p, q, r);
					if (res == 1)
						pdnf = pdnf + "(" + (p == 1 ? "P" : "!P") + "&" + (q == 1 ? "Q" : "!Q") + "&"
						+ (r == 1 ? "R" : "!R") + ")" + " | ";
					else
						pcnf = pcnf + "(" + (p == 0 ? "P" : "!P") + "|" + (q == 0 ? "Q" : "!Q") + "|"
						+ (r == 0 ? "R" : "!R") + ")" + " & ";
					char cp, cq, cr, cres;
					cp = num2bool(p);
					cq = num2bool(q);
					cr = num2bool(r);
					cres = num2bool(res);
					cout << cp << "\t" << cq << "\t" << cr << "\t" << cres << endl;
				}
			}
		}
	}
	if (number == 2) {
		cout << "P\t" << "Q\t" << "Z" << endl;
		for (p = 1; p >= 0; p--) {
			for (q = 1; q >= 0; q--) {
				res=Calculate(2, orgin, stack, p, q, 0);
				if (res == 1)
					pdnf = pdnf + "(" + (p == 1 ? "P" : "!P") + "&" + (q == 1 ? "Q" : "!Q") + ")" + " | ";
				else
					pcnf = pcnf + "(" + (p == 0 ? "P" : "!P") + "|" + (q == 0 ? "Q" : "!Q") + ")" + " & ";
				char cp, cq, cres;
				cp = num2bool(p);
				cq = num2bool(q);
				cres = num2bool(res);
				cout << cp << "\t" << cq << "\t" << cres << endl;
			}
		}
	}
	//            0
	if (pdnf.length() != 0)
		pdnf.erase(pdnf.length() - 2);
	if (pcnf.length() != 0)
		pcnf.erase(pcnf.length() - 2);
	cout << "     :" << pdnf << endl << endl;
	cout << "     :" << pcnf << endl << endl;

}
/****************************   ******************************/
int main() {
	SeqStack stack(200);
	int cnt = 0;
	string orgin;
	int number;


	cout << "/**************    *****************/" << endl;
	cout << "/*              !                    */" << endl;
	cout << "/*              |                    */" << endl;
	cout << "/*              &                    */" << endl;
	cout << "/*              >                    */" << endl;
	cout << "/*              =                   */" << endl;
	cout << "/**************    *****************/" << endl;
	cout << "        (2   3)" << endl;

	loop:cin >> number;
	if(2==number) 
		cout << endl << "    P、Q  " << endl ;
	else if (3==number)
		cout << endl << "    P、Q、R  " << endl;
	else {
		cout << "   2 3:  " << endl;
		goto loop;
	}
	cout << "    :";
	int flag = 0;
	
	do {
		if (flag != 0) {
			cout << "         ,              
( )" << endl; cout << " :"; } cin >> orgin; flag = 1; } while (!IsLegal(orgin)); InfixToPostfix(orgin,stack); Print(number,orgin,stack); while (1); return 0; }