#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;
}