#include<sstream>
#include "karnaugh.h"
#pragma once
Karnaugh::Karnaugh()
{
	for (int i = 0; i < 4; i++){
		for (int j = 0; j < 4; j++){
			virtual_MAP[i][j] = 0;
		}
	}
	minterm_Kar[0][0] = 0;	 minterm_Kar[0][1] = 1;		minterm_Kar[0][2] = 3;	minterm_Kar[0][3] = 2;
	minterm_Kar[1][0] = 4;	 minterm_Kar[1][1] = 5;		minterm_Kar[1][2] = 7;	minterm_Kar[1][3] = 6;
	minterm_Kar[2][0] = 12;	 minterm_Kar[2][1] = 13;	minterm_Kar[2][2] = 15; minterm_Kar[2][3] = 14;
	minterm_Kar[3][0] = 8;	 minterm_Kar[3][1] = 9;		minterm_Kar[3][2] = 11; minterm_Kar[3][3] = 10;

}
void Karnaugh::input_data(string input)
{
	istringstream iss(input);

	do
	{
		string sub;
		iss >> sub; // 잘랐어요
		if (sub == "+")  //sub가 +기호면 그냥 다음거 또짤라줘요.
		{
			iss >> sub;
		}
		string temp = sub;
		int length = temp.length();

		for (int i = 0; i < length; i++)
		{
			if (temp[i] == 'w')
			{
				if (temp[i + 1] == '\'')          //w'의 영역
				{
					i++;
					i++;
					if (temp[i] == 'x')
					{
						if (temp[i + 1] == '\'')          //w'x'
						{
							i++;
							i++;
							if (temp[i] == 'y')
							{
								if (temp[i + 1] == '\'')       //w'x'y'
								{
									i++;
									i++;
									if (temp[i] == 'z')
									{
										if (temp[i + 1] == '\'')    //w'x'y'z'
										{
											virtual_MAP[0][0] = 1;
										}
										else                       //w'x'y'z
										{
											virtual_MAP[0][1] = 1;
										}
									}
									else                               //w'x'y'(no 'z')
									{
										virtual_MAP[0][0] = 1;
										virtual_MAP[0][1] = 1;
									}
								}

								else                            //w'x'y
								{
									i++;
									if (temp[i] == 'z')
									{
										if (temp[i + 1] == '\'')      //w'x'yz'
										{
											virtual_MAP[0][3] = 1;
										}
										else                          //w'x'yz
										{
											virtual_MAP[0][2] = 1;
										}
									}
									else                               //w'x'y
									{
										virtual_MAP[0][2] = 1;
										virtual_MAP[0][3] = 1;
									}

								}

							}
							else                              //y가 없고 w'x'임
							{
								i++;
								if (temp[i] == 'z')
								{
									if (temp[i + 1] == '\'')              //w'x'z'
									{
										virtual_MAP[0][0] = 1;
										virtual_MAP[0][3] = 1;
									}
									else                                  //w'x'z
									{
										virtual_MAP[0][1] = 1;
										virtual_MAP[0][2] = 1;
									}
								}
								else                                     //y, z둘다 없어 w'x'
								{
									virtual_MAP[0][0] = 1;
									virtual_MAP[0][1] = 1;
									virtual_MAP[0][2] = 1;
									virtual_MAP[0][3] = 1;

								}
							}
						}
						else                     //w'x영역
						{
							i++;
							if (temp[i] == 'y')
							{
								if (temp[i + 1] == '\'')
								{
									i++;
									i++;
									if (temp[i] == 'z')
									{
										if (temp[i + 1] == '\'')       //w'xy'z'
										{
											virtual_MAP[1][0] = 1;
										}
										else                           //w'xy'z
										{
											virtual_MAP[1][1] = 1;
										}
									}
									else                                //w'xy'
									{
										virtual_MAP[1][0] = 1;
										virtual_MAP[1][1] = 1;
									}

								}
								else                              //w'xy
								{
									i++;
									if (temp[i] == 'z')
									{
										if (temp[i + 1] == '\'')       //w'xyz'
										{
											virtual_MAP[1][3] = 1;
										}
										else                           //w'xyz
										{
											virtual_MAP[1][2] = 1;
										}
									}
									else                                //w'xy
									{
										virtual_MAP[1][2] = 1;
										virtual_MAP[1][3] = 1;
									}
								}
							}
							else                                  //y가읍슴 w'x임
							{
								i++;
								if (temp[i] == 'z')
								{
									if (temp[i + 1] == '\'')          //w'xz'
									{
										virtual_MAP[1][0] = 1;
										virtual_MAP[1][3] = 1;
									}
									else                             //w'xz
									{
										virtual_MAP[1][1] = 1;
										virtual_MAP[1][2] = 1;
									}
								}
								else                                 //w'x
								{
									virtual_MAP[1][0] = 1;
									virtual_MAP[1][1] = 1;
									virtual_MAP[1][2] = 1;
									virtual_MAP[1][3] = 1;
								}
							}

						}
					}
					else                                    //w'<x가 없어>
					{
						i++;
						if (temp[i] == 'y')
						{
							if (temp[i + 1] == '\'')
							{
								i++;
								i++;
								if (temp[i] == 'z')
								{
									if (temp[i + 1] == '\'')         //w'y'z'
									{
										virtual_MAP[0][0] = 1;
										virtual_MAP[1][0] = 1;
									}
									else                             //w'y'z
									{
										virtual_MAP[0][1] = 1;
										virtual_MAP[1][1] = 1;
									}
								}
								else                                  //w'y'
								{
									virtual_MAP[0][0] = 1;
									virtual_MAP[0][1] = 1;
									virtual_MAP[1][0] = 1;
									virtual_MAP[1][1] = 1;
								}
							}
							else                                        //w'y     
							{
								i++;
								if (temp[i] == 'z')
								{
									if (temp[i + 1] == '\'')         //w'yz'
									{
										virtual_MAP[0][3] = 1;
										virtual_MAP[1][3] = 1;
									}
									else                             //w'yz
									{
										virtual_MAP[0][2] = 1;
										virtual_MAP[1][2] = 1;
									}
								}
								else                                  //w'y
								{
									virtual_MAP[0][2] = 1;
									virtual_MAP[0][3] = 1;
									virtual_MAP[1][2] = 1;
									virtual_MAP[1][3] = 1;
								}
							}
						}
						else                                          //w'(x, y둘다없음)
						{
							i++;
							if (temp[i] == 'z')
							{
								if (temp[i + 1] == '\'')              //w'z'
								{
									virtual_MAP[0][0] = 1;
									virtual_MAP[1][0] = 1;
									virtual_MAP[0][3] = 1;
									virtual_MAP[1][3] = 1;
								}
								else                                  //w'z
								{
									virtual_MAP[0][1] = 1;
									virtual_MAP[0][2] = 1;
									virtual_MAP[1][1] = 1;
									virtual_MAP[1][2] = 1;
								}
							}
							else                                      //w'
							{
								virtual_MAP[0][0] = 1;
								virtual_MAP[1][0] = 1;
								virtual_MAP[0][3] = 1;
								virtual_MAP[1][3] = 1;
								virtual_MAP[0][1] = 1;
								virtual_MAP[0][2] = 1;
								virtual_MAP[1][1] = 1;
								virtual_MAP[1][2] = 1;
							}
						}

					}
				}
				else                      //w로 시작
				{
					i++;
					if (temp[i] == 'y')
					{
						if (temp[i + 1] == '\'')    //wy'
						{
							i++;
							i++;
							if (temp[i] == 'z')
							{
								if (temp[i + 1] == '\'')    //wy'z'
								{
									virtual_MAP[2][0] = 1;
									virtual_MAP[3][0] = 1;
								}
								else                         //wy'z
								{
									virtual_MAP[2][1] = 1;
									virtual_MAP[3][1] = 1;
								}
							}
							else                              //wy'
							{
								virtual_MAP[2][0] = 1;
								virtual_MAP[3][0] = 1;
								virtual_MAP[2][1] = 1;
								virtual_MAP[3][1] = 1;
							}

						}
						else
						{
							i++;
							if (temp[i] == 'z')
							{
								if (temp[i + 1] == '\'')         //wyz'
								{
									virtual_MAP[2][3] = 1;
									virtual_MAP[3][3] = 1;
								}
								else                            //wyz
								{
									virtual_MAP[2][2] = 1;
									virtual_MAP[3][2] = 1;
								}
							}
							else                                //wy
							{
								virtual_MAP[2][2] = 1;
								virtual_MAP[3][2] = 1;
								virtual_MAP[2][3] = 1;
								virtual_MAP[3][3] = 1;
							}
						}
					}
					else                                          //w(x,y도 없음)
					{
						if (temp[i] == 'z')
						{
							if (temp[i + 1] == '\'')             //wz'
							{
								virtual_MAP[0][0] = 1;
								virtual_MAP[1][0] = 1;
								virtual_MAP[0][3] = 1;
								virtual_MAP[1][3] = 1;

							}
							else                                  //wz
							{
								virtual_MAP[0][1] = 1;
								virtual_MAP[1][1] = 1;
								virtual_MAP[1][2] = 1;
								virtual_MAP[0][2] = 1;
							}
						}
						else                                      //w
						{
							virtual_MAP[0][0] = 1;
							virtual_MAP[0][1] = 1;
							virtual_MAP[0][2] = 1;
							virtual_MAP[0][3] = 1;
							virtual_MAP[1][0] = 1;
							virtual_MAP[1][1] = 1;
							virtual_MAP[1][2] = 1;
							virtual_MAP[1][3] = 1;
						}
					}
				}
			}
			else
			{
				if (temp[i] == 'y')           //y로 시작
				{
					if (temp[i + 1] == '\'')
					{
						i++;
						i++;
						if (temp[i] == 'z')
						{
							if (temp[i + 1] == '\'') // y'z'
							{
								virtual_MAP[0][0] = 1;
								virtual_MAP[1][0] = 1;
								virtual_MAP[2][0] = 1;
								virtual_MAP[3][0] = 1;
							}
							else                     //y'z
							{
								virtual_MAP[0][1] = 1;
								virtual_MAP[1][1] = 1;
								virtual_MAP[2][1] = 1;
								virtual_MAP[3][1] = 1;
							}
						}
						else                         //y'
						{
							virtual_MAP[0][0] = 1;
							virtual_MAP[1][0] = 1;
							virtual_MAP[2][0] = 1;
							virtual_MAP[3][0] = 1;
							virtual_MAP[0][1] = 1;
							virtual_MAP[1][1] = 1;
							virtual_MAP[2][1] = 1;
							virtual_MAP[3][1] = 1;
						}

					}
					else
					{
						i++;
						if (temp[i] == 'z')
						{
							if (temp[i + 1] == '\'')    //yz'
							{
								virtual_MAP[0][3] = 1;
								virtual_MAP[1][3] = 1;
								virtual_MAP[2][3] = 1;
								virtual_MAP[3][3] = 1;
							}
							else                         //yz
							{
								virtual_MAP[0][2] = 1;
								virtual_MAP[1][2] = 1;
								virtual_MAP[2][2] = 1;
								virtual_MAP[3][2] = 1;
							}
						}
						else                            //y
						{
							virtual_MAP[0][3] = 1;
							virtual_MAP[1][3] = 1;
							virtual_MAP[2][3] = 1;
							virtual_MAP[3][3] = 1;
							virtual_MAP[0][2] = 1;
							virtual_MAP[1][2] = 1;
							virtual_MAP[2][2] = 1;
							virtual_MAP[3][2] = 1;
						}
					}

				}
				else                         //z시작
				{
					if (temp[i] == 'z')
					{
						if (temp[i + 1] == '\'')    //z'
						{
							virtual_MAP[0][0] = 1;
							virtual_MAP[1][0] = 1;
							virtual_MAP[2][0] = 1;
							virtual_MAP[3][0] = 1;
							virtual_MAP[0][3] = 1;
							virtual_MAP[1][3] = 1;
							virtual_MAP[2][3] = 1;
							virtual_MAP[3][3] = 1;
						}
						else                        //z
						{
							virtual_MAP[0][1] = 1;
							virtual_MAP[1][1] = 1;
							virtual_MAP[2][1] = 1;
							virtual_MAP[3][1] = 1;
							virtual_MAP[0][2] = 1;
							virtual_MAP[1][2] = 1;
							virtual_MAP[2][2] = 1;
							virtual_MAP[3][2] = 1;
						}
					}
					else                               //수식이없어요.
					{
						cout << "수식이 없습니다." << endl;
					}
				}
			}
		}

	} while (iss);
	
}
void Karnaugh::print()
{
	cout << "Karnaugh Map" << endl;
	for (int i = 0; i < 4; i++){
		for (int j = 0; j < 4; j++){
			cout << virtual_MAP[i][j] << endl;
		}
	}
	cout << "Minterms :";
	for (int i = 0; i < 4; i++){
		for (int j = 0; j < 4; j++){
			if (virtual_MAP[i][j] == 1)
			{
				cout << minterm_Kar[i][j] << " , ";
			}
		}
	}
}
string input(string logic_)
{
	string s(logic_);
	while (!s.find("w") || !s.find("x") || !s.find("y") || !s.find("z") || !s.find("'") || !s.find("+"))
	{
		cout << "식을 잘못 입력했습니다. 다시 입력해주세요 :";
		getline(cin, logic_);
		string s(logic_);
	}
	return s;
}
