// AOIS_lab1.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
using namespace std;
int Menu();
int GetNumber (int, int);
void ExitBack();
void print_AMRT();
void Load_R();
void Load_R_T();
void Load_T_T();
void Store_R();
void Store_R_T();
void Store_T_T();
void Move();
void Logic();
int Logic_menu();
void Const0();
void Conjunction();
void Ban_1st();
void Repeat_1st();
void Ban_2nd();
void Repeat_2st();
void Noneq();
void Disjunction();
void oper_Pierce();
void Eqiuv();
void Denial_2nd();
void Implic_2_1();
void Denial_1st();
void Implic_1_2();
void oper_Sheffer();
void Const1();

int m, n, Si, Sj, Sr;
int AM[20][20], R[20], T[20];

int _tmain(int argc, _TCHAR* argv[])
{
	srand(time(NULL));
	cout << "Введите 1 <= m <=20: " << endl;
	m = GetNumber(1, 20);
    cout << "Введите 1 <= n <=20: " << endl;
	n = GetNumber(1, 20);
//--------------------------------------	
for(int i=0; i<m; i++){
	R[i] = rand() % 2;
	T[i] = rand() % 2;
	for(int j=0; j<n; j++){
		int number = rand() % 2;
		AM[i][j] = number;
	}
}
print_AMRT();
//Главный цикл
	bool done = false;
	while(!done) {
		switch (Menu()) {
			case 1: {Load_R();	  print_AMRT(); ExitBack(); }  break;
			case 2: {Load_R_T();  print_AMRT(); ExitBack(); }  break;
			case 3: {Load_T_T();  print_AMRT(); ExitBack(); }  break;
			case 4: {Store_R();   print_AMRT(); ExitBack(); }  break;
			case 5: {Store_R_T(); print_AMRT(); ExitBack(); }  break;
			case 6: {Store_T_T(); print_AMRT(); ExitBack(); }  break;
			case 7: {Move();      print_AMRT(); ExitBack(); }  break;
			case 8: Logic();                                   break;
			case 9: cout << "Конец работы" << endl;
		    done = true;                                       break;
		}
	}
	return 0;
}

//--------------Меню-----------------
int Menu() {
	cout << "\n==================== Главное меню ====================" << endl;
	cout << "1 - LOAD R" << endl;
	cout << "2 - LOAD R [T]" << endl;
	cout << "3 - LOAD T [T]" << endl;
	cout << "4 - STORE R" << endl;
	cout << "5 - STORE R [T]" << endl;
	cout << "6 - STORE T [T]" << endl;
	cout << "7 - MOVE" << endl;
	cout << "8 - Логические операции" << endl;
	cout << "9 - Выход" << endl;
	return GetNumber(1, 9);
}

//Ввести число от min до max
int GetNumber(int min, int max) {
	int number = min - 1;
	while(true) {
		cin >> number;
		if((number >= min) && (number <= max) && (cin.peek() == '\n'))
			break;
		else {
			cout << "Введите число от " << min << " до " << max << " ! :" << endl;
			cin.clear();
			while(cin.get() != '\n') {};
		}
	}
	return number;
}

//Выход в меню
void ExitBack() {
	cout << "Введите ""Enter""." << endl;
	cin.get(); cin.get();
}

//Вывод на экран АМ, R и T
void print_AMRT(){
	cout << "AM   ";
	for(int i=0; i<n; i++)
		cout << i+1 << " ";
	cout << "  R   " << "T" << endl
		<< "     ";
    for(int i=0; i<n; i++)
		cout << "_ ";
	cout << "  _   " << "_" << endl;
	for(int i=0; i<m; i++){
		cout << "  " << i+1 << " ";
	       for(int j=0; j<n; j++){
		     cout << "|" << AM[i][j];
	       }
		cout << "| |" << R[i] << "| |" << T[i] << "|" << endl;
	}
}

//Загрузить разрядный срез n в регистр R
void Load_R(){
	int k;
	cout << "Введите номер разрядного среза n: " << endl;
	k = GetNumber(1,n);
	for(int i=0; i<m; i++)
		R[i]=AM[i][k-1];
}

//Загрузить в R отмеченные метками T биты разрядного среза n
void Load_R_T(){
	int k;
    cout << "Введите номер разрядного среза n: " << endl;
	k = GetNumber(1,n);
	for(int i=0; i<m; i++)
		if(T[i]==1) R[i]=AM[i][k-1];
}

//‡ Загрузить в Т биты разрядного среза  n, отмеченные прежними значениями меток Т
void Load_T_T(){
	int k;
    cout << "Введите номер разрядного среза n: " << endl;
	k = GetNumber(1,n);
	for(int i=0; i<m; i++)
		if(T[i]==1) T[i]=AM[i][k-1];
}

//-----------------------------------------------------------------------------
//Сохранить регистр R разрядном срезе n
void Store_R(){
	int k;
	cout << "Введите номер разрядного среза n: " << endl;
	k = GetNumber(1,n);
	for(int i=0; i<m; i++)
		AM[i][k-1]=R[i];
}

//Сохранить в разрядном срезе n, отмеченные метками Т, биты регистра  R
void Store_R_T(){
	int k;
    cout << "Введите номер разрядного среза n: " << endl;
	k = GetNumber(1,n);
	for(int i=0; i<m; i++)
		if(T[i]==1) AM[i][k-1]=R[i];
}

//Сохранить в разрядном срезе n биты регистра Т, отмеченные метками Т
void Store_T_T(){
	int k;
    cout << "Введите номер разрядного среза n: " << endl;
	k = GetNumber(1,n);
	for(int i=0; i<m; i++)
		if(T[i]==1) AM[i][k-1]=T[i];
}

//-------------------Перемещение разрядного среза----------------------
void Move(){
	Load_R();
	Store_R();
}

//------------------------Логические операции---------------------------
void Logic() {
	bool done = false;
	while(!done) {
		cout << "Введите номер среза Si (1-ый аргумент)" << endl;
		Si=GetNumber(1,n);
		cout << "Введите номер среза Sj (2-ой аргумент)" << endl;
		Sj=GetNumber(1,n);
		cout << "Введите номер среза Sr (результат) или -1, если результат необходимо поместить в R" << endl;
		Sr=GetNumber(-1,n);
		switch (Logic_menu()) {
			case 1:  {Const0();       print_AMRT(); ExitBack(); }  break;
			case 2:  {Conjunction();  print_AMRT(); ExitBack(); }  break;
			case 3:  {Ban_1st();      print_AMRT(); ExitBack(); }  break;
			case 4:  {Repeat_1st();   print_AMRT(); ExitBack(); }  break;
			case 5:  {Ban_2nd();      print_AMRT(); ExitBack(); }  break;
			case 6:  {Repeat_2st();   print_AMRT(); ExitBack(); }  break;
			case 7:  {Noneq();        print_AMRT(); ExitBack(); }  break;
			case 8:  {Disjunction();  print_AMRT(); ExitBack(); }  break;
			case 9:  {oper_Pierce();  print_AMRT(); ExitBack(); }  break;
			case 10: {Eqiuv();        print_AMRT(); ExitBack(); }  break;
			case 11: {Denial_2nd();   print_AMRT(); ExitBack(); }  break;
			case 12: {Implic_2_1();   print_AMRT(); ExitBack(); }  break;
			case 13: {Denial_1st();   print_AMRT(); ExitBack(); }  break;
			case 14: {Implic_1_2();   print_AMRT(); ExitBack(); }  break;
			case 15: {oper_Sheffer(); print_AMRT(); ExitBack(); }  break;
			case 16: {Const1();       print_AMRT(); ExitBack(); }  break;
			case 17: cout << "Вернуться в главное меню" << endl;
			done = true;                                   break;
		}
	}
}

int Logic_menu(){
	cout << "\n============== Логические операции ==============" << endl;
	cout << "1 -  Константа 0" << endl;
	cout << "2 -  Конъюнкция (И)" << endl;
	cout << "3 -  Запрет 1-го аргумента (НЕТ)" << endl;
	cout << "4 -  Повторение 1-го аргумента (ДА)" << endl;
	cout << "5 -  Запрет 2-го аргумента (НЕТ)" << endl;
	cout << "6 -  Повторение 2-го аргумента (ДА)" << endl;
	cout << "7 -  Неравнозначность (ИЛИ-ИЛИ)" << endl;
	cout << "8 -  Дизъюнкция (ИЛИ)" << endl;
	cout << "9 -  Операция Пирса (ИЛИ-НЕ)" << endl;
	cout << "10 - Эквивалентность (И-И)" << endl;
	cout << "11 - Отрицание 2-го аргумента (НЕ)" << endl;
	cout << "12 - Импликация от 2-го аргумента к 1-му (НЕТ-НЕ)" << endl;
	cout << "13 - Отрицание 1-го аргумента" << endl;
	cout << "14 - Импликация от 1-го аргумента ко 2-му (НЕТ-НЕ)" << endl;
	cout << "15 - Операция Шеффера (И-НЕ)" << endl;
	cout << "16 - Константа 1" << endl;
	cout << "17 - Вернуться в главное меню" << endl;
	return GetNumber(1, 17);
}

//Константа  0
void Const0(){
	if(Sr==-1) 
		for(int i=0; i<m; i++) R[i]=0;
	else for(int i=0; i<m; i++) AM[i][Sr-1]=0;
}

//Конъюнкция
void Conjunction(){
if(Sr==-1) 
    for(int i=0; i<m; i++){
         if(AM[i][Si-1]==1 && AM[i][Sj-1]==1) R[i]=1;
		 else R[i]=0;
	}
else for(int i=0; i<m; i++){
         if(AM[i][Si-1]==1 && AM[i][Sj-1]==1) AM[i][Sr-1]=1;
		 else AM[i][Sr-1]=0;
	}		 
}

//Запрет 1-го аргумента
void Ban_1st(){
if(Sr==-1) 
    for(int i=0; i<m; i++){
         if(AM[i][Si-1]==1 && AM[i][Sj-1]==0) R[i]=1;
		 else R[i]=0;
	}
else for(int i=0; i<m; i++){
         if(AM[i][Si-1]==1 && AM[i][Sj-1]==0) AM[i][Sr-1]=1;
		 else AM[i][Sr-1]=0;
	}		
}

//Повторение 1-го аргумента 
void Repeat_1st(){
	if(Sr==-1) 
    for(int i=0; i<m; i++){
         if(AM[i][Si-1]==1) R[i]=1;
		 else R[i]=0;
	}
else for(int i=0; i<m; i++){
         if(AM[i][Si-1]==1) AM[i][Sr-1]=1;
		 else AM[i][Sr-1]=0;
	}	
}
// Запрет 2-го аргумента
void Ban_2nd(){
	if(Sr==-1) 
    for(int i=0; i<m; i++){
         if(AM[i][Si-1]==0 && AM[i][Sj-1]==1) R[i]=1;
		 else R[i]=0;
	}
else for(int i=0; i<m; i++){
         if(AM[i][Si-1]==0 && AM[i][Sj-1]==1) AM[i][Sr-1]=1;
		 else AM[i][Sr-1]=0;
	}	
}

//Повторение 2-го аргумента
void Repeat_2st(){
	if(Sr==-1) 
    for(int i=0; i<m; i++){
         if(AM[i][Sj-1]==1) R[i]=1;
		 else R[i]=0;
	}
else for(int i=0; i<m; i++){
         if(AM[i][Sj-1]==1) AM[i][Sr-1]=1;
		 else AM[i][Sr-1]=0;
	}	
}

//Неравнозначность (nonequivalence)
void Noneq(){
	if(Sr==-1) 
		for(int i=0; i<m; i++){
         if((AM[i][Si-1]==0 && AM[i][Sj-1]==1) || (AM[i][Si-1]==1 && AM[i][Sj-1]==0)) R[i]=1;
		 else R[i]=0;
		}
	else for(int i=0; i<m; i++){
         if((AM[i][Si-1]==0 && AM[i][Sj-1]==1) || (AM[i][Si-1]==1 && AM[i][Sj-1]==0)) AM[i][Sr-1]=1;
		 else AM[i][Sr-1]=0;
	}	
}

//Дизъюнкция
void Disjunction(){
	if(Sr==-1) 
    for(int i=0; i<m; i++){
         if(AM[i][Si-1]==0 && AM[i][Sj-1]==0) R[i]=0;
		 else R[i]=1;
	}
else for(int i=0; i<m; i++){
         if(AM[i][Si-1]==0 && AM[i][Sj-1]==0) AM[i][Sr-1]=0;
		 else AM[i][Sr-1]=1;
	}	
}

//Операция Пирса
void oper_Pierce(){
	if(Sr==-1) 
    for(int i=0; i<m; i++){
         if(AM[i][Si-1]==0 && AM[i][Sj-1]==0) R[i]=1;
		 else R[i]=0;
	}
else for(int i=0; i<m; i++){
         if(AM[i][Si-1]==0 && AM[i][Sj-1]==0) AM[i][Sr-1]=1;
		 else AM[i][Sr-1]=0;
	}	
}

//Эквивалентность (equivalence)
void Eqiuv(){
	if(Sr==-1) 
    for(int i=0; i<m; i++){
         if(AM[i][Si-1]==AM[i][Sj-1]) R[i]=1;
		 else R[i]=0;
	}
else for(int i=0; i<m; i++){
         if(AM[i][Si-1]==AM[i][Sj-1]) AM[i][Sr-1]=1;
		 else AM[i][Sr-1]=0;
	}	
}

//Отрицание 2-го аргумента
void Denial_2nd(){
	if(Sr==-1) 
    for(int i=0; i<m; i++){
         if(AM[i][Sj-1]==0) R[i]=1;
		 else R[i]=0;
	}
else for(int i=0; i<m; i++){
         if(AM[i][Sj-1]==0) AM[i][Sr-1]=1;
		 else AM[i][Sr-1]=0;
	}	
}

//Импликация от 2-го аргумента к 1-му
void Implic_2_1(){
	if(Sr==-1) 
    for(int i=0; i<m; i++){
         if(AM[i][Si-1]==0 && AM[i][Sj-1]==1) R[i]=0;
		 else R[i]=1;
	}
else for(int i=0; i<m; i++){
         if(AM[i][Si-1]==0 && AM[i][Sj-1]==1) AM[i][Sr-1]=0;
		 else AM[i][Sr-1]=1;
	}	
}
//Отрицание 1-го аргумента
void Denial_1st(){
	if(Sr==-1) 
    for(int i=0; i<m; i++){
         if(AM[i][Si-1]==0) R[i]=1;
		 else R[i]=0;
	}
else for(int i=0; i<m; i++){
         if(AM[i][Si-1]==0) AM[i][Sr-1]=1;
		 else AM[i][Sr-1]=0;
	}	
}

//Импликация от 1-го аргумента ко 2-му
void Implic_1_2(){
	if(Sr==-1) 
    for(int i=0; i<m; i++){
         if(AM[i][Si-1]==1 && AM[i][Sj-1]==0) R[i]=0;
		 else R[i]=1;
	}
else for(int i=0; i<m; i++){
         if(AM[i][Si-1]==1 && AM[i][Sj-1]==0) AM[i][Sr-1]=0;
		 else AM[i][Sr-1]=1;
	}	
}

//Операция Шоффера
void oper_Sheffer(){
	if(Sr==-1) 
    for(int i=0; i<m; i++){
         if(AM[i][Si-1]==1 && AM[i][Sj-1]==1) R[i]=0;
		 else R[i]=1;
	}
else for(int i=0; i<m; i++){
         if(AM[i][Si-1]==1 && AM[i][Sj-1]==1) AM[i][Sr-1]=0;
		 else AM[i][Sr-1]=1;
	}	
}

// Константа 1
void Const0(){
	if(Sr==-1) 
		for(int i=0; i<m; i++) R[i]=1;
	else for(int i=0; i<m; i++) AM[i][Sr-1]=1;
}
Соседние файлы в папке основный файлы