?? classdevice.cpp
字號(hào):
#include "StdAfx.h"
#include "Classdevice.h"
#include "Datastruct.h"
#include "Linklist.h"
//計(jì)算出持續(xù)時(shí)間
void Device::Calculasttime()
{
LinkList optr = output;
int temp;
(optr->data).lasttime = (optr->data).sumtime;
temp = (optr->data).sumtime;
while (1)
{
optr = optr->next;
if(optr == NULL)
break;
(optr->data).lasttime = (optr->data).sumtime-temp;
temp = (optr->data).sumtime;
}
}
//合并相鄰相同的信號(hào)
void Device::Delcommon()
{
LinkList ptr1, ptr2; //用于遍歷比較相鄰信號(hào)
ptr1 = output;
ptr2 = ptr1->next;
while (ptr2 != 0)
{
if (ptr1->data.value == ptr2->data.value)
{
ptr1->data.sumtime = ptr2->data.sumtime;
ListDelete(output,ptr1);
ptr2 = ptr1->next;
}
else
{
ptr1 = ptr2;
ptr2 = ptr1->next;
}
}
}
//延時(shí)
void Device::Delay()
{
LinkList ptr = output;
if (ptr->data.value == true) //如果無延時(shí)時(shí)先輸出高電平
{
ListInsertFirst(output, false, delaytime);
}
else
{
while (ptr->next != 0)
{
ptr->data.sumtime += delaytime;
ptr = ptr->next;
}
}
}
//獲得輸出
LinkList Device::GetOutput()
{
return output;
}
//為input1賦值
void Device::SetInput1(LinkList systeminput)
{
input1 = systeminput;
}
//為input2賦值
void Device::SetInput2(LinkList systeminput)
{
input2 = systeminput;
}
//標(biāo)記輸出
void Device::SetOutputTag()
{
outputtag = true;
}
//標(biāo)記輸入一
void Device::SetInputTag1()
{
inputtag1 = true;
}
//標(biāo)記輸入二
void Device::SetInputTag2()
{
inputtag2 = true;
}
//判斷是否兩個(gè)輸入都已經(jīng)被賦值,是則返回true,否則返回false
bool Device::Ifinput()
{
if (inputtag1 == true && inputtag2 ==true)
{
return true;
}
else
{
return false;
}
}
//判斷輸出是否已經(jīng)計(jì)算出,是則返回true,否則返回false
bool Device::Ifoutput()
{
if (outputtag == true)
{
return true;
}
else
{
return false;
}
}
//與門構(gòu)造函數(shù),為output加結(jié)點(diǎn)并初始化為零
DeviceAND::DeviceAND()
{
delaytime = 10; //初始化延遲時(shí)間
inputtag1 = false;
inputtag2 = false;
outputtag = false;
output = new LNode;
output->next = 0;
output->data.lasttime = 0;
output->data.sumtime = 0;
output->data.value = 0;
}
//*************************
//或門構(gòu)造函數(shù),為output加結(jié)點(diǎn)并初始化為零
DeviceOR::DeviceOR()
{
delaytime = 10; //初始化延遲時(shí)間
inputtag1 = false;
inputtag2 = false;
outputtag = false;
output = new LNode;
output->next = 0;
output->data.lasttime = 0;
output->data.sumtime = 0;
output->data.value = 0;
}
//與非門構(gòu)造函數(shù),為output加結(jié)點(diǎn)并初始化為零
DeviceNAND::DeviceNAND()
{
delaytime = 15; //初始化延遲時(shí)間
inputtag1 = false;
inputtag2 = false;
outputtag = false;
output=new LNode;
output->next = 0;
output->data.lasttime = 0;
output->data.sumtime = 0;
output->data.value = 0;
}
//異或門構(gòu)造函數(shù),為output加結(jié)點(diǎn)并初始化為零
DeviceXOR::DeviceXOR()
{
delaytime = 20; //初始化延遲時(shí)間
inputtag1 = false;
inputtag2 = false;
outputtag = false;
output = new LNode;
output->next = 0;
output->data.lasttime = 0;
output->data.sumtime = 0;
output->data.value = 0;
}
//同或門構(gòu)造函數(shù),為output加結(jié)點(diǎn)并初始化為零
DeviceNXOR::DeviceNXOR()
{
delaytime = 20; //初始化延遲時(shí)間
inputtag1 = false;
inputtag2 = false;
outputtag = false;
output = new LNode;
output->next = 0;
output->data.lasttime = 0;
output->data.sumtime = 0;
output->data.value = 0;
}
//通過輸入得到輸出
bool Device::GetResponse()
{
LinkList ptr1, ptr2; //兩個(gè)指針用于遍歷兩個(gè)輸入信號(hào)
LinkList optr = output;
LinkList temp;
int currenttime; //已經(jīng)計(jì)算過的時(shí)間
ptr1 = input1;
ptr2 = input2;
while (ptr1 != 0 || ptr2 != 0)
{
if (ptr1->data.sumtime < ptr2->data.sumtime)//若信號(hào)一掃描的慢一些
{
currenttime = ptr1->data.sumtime;
optr->data.sumtime = currenttime;
optr->data.value = LogicExpression(ptr1->data.value, ptr2->data.value);
ptr1 = ptr1->next;
}
else if (ptr1->data.sumtime > ptr2->data.sumtime)//若信號(hào)一快一些
{
currenttime = ptr2->data.sumtime;
optr->data.sumtime = currenttime;
optr->data.value = LogicExpression(ptr1->data.value, ptr2->data.value);
ptr2 = ptr2->next;
}
else//若相同
{
currenttime = ptr2->data.sumtime;
optr->data.sumtime = currenttime;
optr->data.value = LogicExpression(ptr1->data.value, ptr2->data.value);
ptr1 = ptr1->next;
ptr2 = ptr2->next;
}
if(ptr1 != 0 || ptr2 != 0)
{
temp = new LNode;
temp->next = 0;
optr->next = temp;
optr = optr->next;
}
}
Delcommon();
Calculasttime();
Delay();
Calculasttime();
return true;
}
bool Device::LogicExpression(bool A, bool B)
{
return A && B;
}
//與門邏輯表達(dá)式
bool DeviceAND::LogicExpression(bool A, bool B)
{
return A && B;
}
//或門邏輯表達(dá)式
bool DeviceOR::LogicExpression(bool A, bool B)
{
return A || B;
}
//與非門邏輯表達(dá)式
bool DeviceNAND :: LogicExpression(bool A, bool B)
{
return !(A && B);
}
//異或門邏輯表達(dá)式
bool DeviceXOR::LogicExpression(bool A,bool B)
{
return ((!A) && B) || (A && (!B));
}
//同或門邏輯表達(dá)式
bool DeviceNXOR::LogicExpression(bool A,bool B)
{
return (A && B) || ((!A) && (!B));
}
void DeviceNOT::Delay()
{
LinkList ptr = output;
if (ptr->data.value == true) //如果無延時(shí)時(shí)先輸出高電平
{
ListInsertFirst(output, false, delaytime);
}
else
{
while (ptr->next != 0)
{
ptr->data.sumtime += delaytime;
ptr = ptr->next;
}
}
}
//非門獲取輸出
LinkList DeviceNOT::GetOutput()
{
return output;
}
//非門為input賦值
void DeviceNOT::SetInput(LinkList systeminput)
{
input = systeminput;
}
void DeviceNOT::SetInputTag()
{
inputtag = true;
}
void DeviceNOT::SetOutputTag()
{
outputtag = true;
}
//判斷是否輸入已經(jīng)被賦值,是則返回true,否則返回false
bool DeviceNOT::Ifinput()
{
if (inputtag == true)
{
return true;
}
else
{
return false;
}
}
//判斷輸出是否已經(jīng)計(jì)算出,是則返回true,否則返回false
bool DeviceNOT::Ifoutput()
{
if (outputtag == true)
{
return true;
}
else
{
return false;
}
}
DeviceNOT::DeviceNOT()
{
delaytime = 5; //初始化延遲時(shí)間
inputtag = false;
outputtag = false;
output = new LNode;
output->next = 0;
output->data.lasttime = 0;
output->data.sumtime = 0;
output->data.value = 0;
}
void DeviceNOT::Calculasttime()
{
LinkList optr = output;
int temp;
(optr->data).lasttime = (optr->data).sumtime;
temp = (optr->data).sumtime;
while(1)
{
optr = optr->next;
if(optr == NULL)
break;
(optr->data).lasttime = (optr->data).sumtime-temp;
temp = (optr->data).sumtime;
}
}
bool DeviceNOT::GetResponse()
{
LinkList ptr; //指針用于遍歷輸入信號(hào)
LinkList optr = output;
LinkList temp;
ptr = input;
while (ptr != 0)
{
optr->data.sumtime = ptr->data.sumtime;
optr->data.lasttime = optr->data.lasttime;
optr->data.value =! (ptr->data.value);
ptr = ptr->next;
if(ptr != 0)
{
temp = new LNode;
temp->next = 0;
optr->next = temp;
optr = optr->next;
}
}
Calculasttime();
Delay();
Calculasttime();
return true;
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -