Лаба №2. Моделирование алгоритмов базовых операций ассоциативного процессора

Решение

Построить и проверить модели алгоритмов, базовых операций с разрядными срезами АП. 

Файл с решением: 
Задание

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