亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? dalgo.cpp

?? 數字電路故障分析之D算法C++實現。按照教科書編寫
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
//---------------------------------------------------------------------------

                                                                                                
#pragma hdrstop

#include "Dalgo.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

#include <alloc.h>

#ifdef __Dalgo_debug__
#include <iostream.h>
#endif

using namespace DAlgorithm;

//typedef DAlgorithmRenderer::TestNodeRes TestNodeRes;
//const TestNodeRes Out   = DAlgorithmRenderer::Out;
//const TestNodeRes NoOut = DAlgorithmRenderer::NoOut;
//const TestNodeRes Fail  = DAlgorithmRenderer::Fail;
//

const ExtStep       = 10;

const Intercube     = 0;
const LineConfirm   = 1;
const SelectDev     = 2;
const SelectTransD  = 3;
const End           = 4;

static DLogic IntercubeTable[5][5] = {
        {DL_0, DL_E, DL_E, DL_E, DL_0},
        {DL_E, DL_1, DL_E, DL_E, DL_1},
        {DL_E, DL_E, DL_D, DL_E, DL_D},
        {DL_E, DL_E, DL_E, DL_N, DL_N},
        {DL_0, DL_1, DL_D, DL_N, DL_X} };

//  DAlgorighm

bool DAlgorithmRenderer::intercube(DCube &cube, const DCube &cube1,
        const DCube &cube2)
{
    bool result = true;
    for(int i = 0; i < nodeNum; i++)
    {
        cube[i] = IntercubeTable[cube1[i]][cube2[i]];
        if(cube[i] == DL_E)
        {
            result = false;
        }
    }
    return result;
}

void DAlgorithmRenderer::add(const DCube &cube)
{
    int i;
    int transDSize = transDTable.getRowNum();
    if(transDEnd >= transDSize)
    {
        transDSize += 5;
        transDTable.setRowNum(transDSize);
        for(i = transDSize - 5; i < transDSize; i++)
        {
            transDTable.createRow(i, nodeNum);
        }
    }
    for(i = 0; i < nodeNum; i++)
    {
        transDTable[transDEnd][i] = cube[i];
    }
    transDEnd++;
}

void DAlgorithmRenderer::addTransDCube(/* const */ DCube &cube)
{
    int diff;
    add(cube);
    int nodeNum = transDTable.getColNum();
    for(int i = transDEnd - 1; i >= 0; i--)
    {
        diff = -1;
        for(int j = nodeNum - 1; j >= 0; j--)
        {
            bool cmp1 = transDTable[i][j] == DL_D || transDTable[i][j] == DL_N;
            bool cmp2 = transDTable[transDEnd - 1][j] == DL_D ||
                    transDTable[transDEnd - 1][j] == DL_N;
            if(cmp1 && !cmp2 || !cmp1 && cmp2)
            {
                diff = -3;
                break;
            }
            if(transDTable[i][j] + transDTable[transDEnd - 1][j] == 1)
            {
                if(diff != -1)
                {
                    diff = -2;
                    break;
                }
                else
                {
                    diff = j;
                }
            }
        }
        if(diff == -3)
        {
            break;
        }
        if(diff >= 0)
        {
            add(transDTable[transDEnd - 1]);
            transDTable[transDEnd - 1][diff] = DL_X;
        }
    }
}

void DAlgorithmRenderer::testPDCheck(_TestPD &testPD)
{
    int i, j;
    unsigned char transDType;
    for(i = testPD.cubeIndex; i < originalNum &&
            devInfoList[originalDevMap[i]].outpNode == testPD.devNode; i++)
    {
        if(originalTable[i][testPD.vPD] != DL_0)
        {
            continue;
        }
        testPD.tryCube[testPD.vPD] = DL_0;
        testPD.tryCube[testPD.devNode] = DL_X;
        if(!intercube(testPD.transDCube, testPD.tryCube, originalTable[i]))
        {
            continue;
        }
        transDType = testPD.transDCube[testPD.devNode];
        testPD.tryCube[testPD.vPD] = DL_1;
        testPD.tryCube[testPD.devNode] = DL_X;
        for(j = testPD.cubeIndex; j < originalNum &&
                devInfoList[originalDevMap[j]].outpNode == testPD.devNode; j++)
        {
            if(originalTable[j][testPD.vPD] != DL_1)
            {
                continue;
            }
            testPD.tryCube[testPD.vPD] = DL_1;
            testPD.tryCube[testPD.devNode] = DL_X;
            if(!intercube(testPD.transDCube, testPD.tryCube, originalTable[j]))
            {
                continue;
            }
            if(testPD.transDCube[testPD.devNode] ==
                    testPD.transDCube[testPD.vPD])
            {
                if(transDType == 0)
                {
                    testPD.transDCube[testPD.vPD] = DL_D;
                    testPD.transDCube[testPD.devNode] = DL_D;
                    addTransDCube(testPD.transDCube);
                    testPD.transDCube[testPD.vPD] = DL_N;
                    testPD.transDCube[testPD.devNode] = DL_N;
                    addTransDCube(testPD.transDCube);
                    return;
                }
            }
            else if(transDType == 1)
            {
                testPD.transDCube[testPD.vPD] = DL_D;
                testPD.transDCube[testPD.devNode] = DL_N;
                addTransDCube(testPD.transDCube);
                testPD.transDCube[testPD.vPD] = DL_N;
                testPD.transDCube[testPD.devNode] = DL_D;
                addTransDCube(testPD.transDCube);
                return;
            }
        }   // for j
    }   // for i
}

void DAlgorithmRenderer::testPD(_TestPD &testPD) const
{
    int i, p;
    unsigned char carry = 0;
    while(1)
    {
        if(carry != 1)
        {
            testPDCheck(testPD);
        }
        else
        {
            for(i = 0; i < testPD.ptEnd - 1; i++)
            {
                testPD.tryCube[testPD.ptKeep[i]] = DL_0;
            }
            break;
        }

        // Get next combination
        carry = 1;
        for(i = 0; i < testPD.ptEnd - 1; i++)
        {
            if(testPD.ptKeep[i] == testPD.vPD)
            {
                continue;
            }
            p = testPD.ptKeep[i];
            if(carry == 1)
            {
                if(testPD.tryCube[p] == DL_0)
                {
                    testPD.tryCube[p] = DL_1;
                    carry = 0;
                    break;
                }
                if(testPD.tryCube[p] == DL_1)
                {
                    testPD.tryCube[p] = DL_0;
                    carry = 1;
                }
            }
        }   // for
    }   // while
}

int DAlgorithmRenderer::contained(const DCube &cube1, const DCube &cube2) const
{
    int result = 0;
    for(int i = 0; i < nodeNum; i++)
    {
        if(cube1[i] != cube2[i])
        {
            if(cube2[i] == DL_0 || cube2[i] == DL_1)
            {
                return 1;
            }
            else if(cube2[i] == DL_D || cube2[i] == DL_N)
            {
                if(!(cube1[i] == DL_D || cube1[i] == DL_N))
                {
                    return 2;
                }
                else
                {
                    result = 1;
                }
            }
        }
    }
    return result;
}

void DAlgorithmRenderer::compressTransD()
{
    int i, j, k, lastOutp, devPt;
    unsigned char res;
    Array<bool> delToken;
    delToken.setLength(transDEnd);
    for(i = 0; i < transDEnd; i++)
    {
        delToken[i] = false;

        for(j = i + 1/*, res = 3*/; j < transDEnd; j++)
        {
            res = contained(transDTable[i], transDTable[j]);
            if(res == 0)
            {
                delToken[i] = true;
                break;
            }
            else if(res == 2)
            {
                break;
            }
        }
    }
    i = j = 0;
    lastOutp = devPt = -1;
    transDDevMap.setLength(transDEnd);
    while(1)
    {
        for(; j < transDEnd && delToken[j]; j++);
        if(j >= transDEnd)
        {
            break;
        }
        if(i != j)
        {
            transDTable.copyRow(i, transDTable[j]);
        }
        for(k = nodeNum - 1; k >= 0; k--)
        {
            if(transDTable[i][k] != DL_X)
            {
                if(lastOutp != k)
                {
                    lastOutp = k;
                    devPt++;
                    devInfoList[devPt].firstTransDCubeIndex = i;
                }
                break;
            }
        }
        transDDevMap[i] = devPt;
        i++; j++;
    }
    transDNum = i;
    transDDevMap.setLength(transDNum);
    transDTable.setRowNum(transDNum);
}

DAlgorithmRenderer::DAlgorithmRenderer()
{
}

DAlgorithmRenderer::~DAlgorithmRenderer()
{
}

void DAlgorithmRenderer::setParams(ConstDCube &original,
        ConstNodeStyles &nodeStyles, int nodeNum, int devNum)
{
    this->nodeNum = nodeNum;
    this->devNum = devNum;
    originalNum = original.getLength() / nodeNum;
    originalTable.setRowNum(originalNum);
    originalDevMap.setLength(originalNum);
    devInfoList.setLength(devNum);
    nodeStyleList.setLength(nodeNum);
    for(int i = 0; i < nodeNum; i++)
    {
        nodeStyleList[i] = nodeStyles[i];
    }
    int lastOutpPos = -1, devPt = -1;
    unsigned char stat;
    for(int i = 0; i < originalNum; i++)
    {
        // set the size of original DL_D-cube
        originalTable.createRow(i, nodeNum);

        stat = 0;
        for(int j = nodeNum - 1; j >= 0; j--)
        // probe from the end of the current cube
        {
            // set the value of original D-cube
            originalTable[i][j] = original[i * nodeNum + j];

            if(stat == 0)
            {
                if(originalTable[i][j] != DL_X)
                {
                    if(lastOutpPos != j)
                    // find the output node in current D-cube
                    {
                        // set last output position to current node, then
                        // it points to the output node of current device
                        lastOutpPos = j;

                        devPt++;

                        // BEGIN: set info for the new device
                        devInfoList[devPt].devCube.setLength(nodeNum);
                        for (int k = nodeNum - 1; k >= 0; k--)
                        // initialization
                        {
                            devInfoList[devPt].devCube[k] = None;
                        }
                        // set output node property for current device
                        devInfoList[devPt].outpNode = lastOutpPos;

                        // current node is an output node
                        devInfoList[devPt].devCube[lastOutpPos] = Output;

                        devInfoList[devPt].firstOriginalCubeIndex = i;
                        // END: set info for the new device
                    }   // if(lastOutpPos != j)
                    stat = 1;
                    originalDevMap[i] = devPt;
                }   // if(originalTable[i][j] != DL_X)
            }   // if(stat == 0)
            else if(stat == 1)
            // if a new device(OriginalTable[i]) found
            {
                if(originalTable[i][j] != DL_X)
                // the node must be an input node for the (one-output) device
                {
                    devInfoList[devPt].devCube[j] = Input;
                }
            }
        }   // for(int j = nodeNum - 1; j >= 0; j--)
    }   // for(int i = 0; i < originalNum; i++)
}

void DAlgorithmRenderer::autoCreateTransDTable()
{
    _TestPD test;
    test.ptEnd = test.cubeIndex = 0;
    test.ptKeep.setLength(nodeNum);
    test.tryCube.setLength(nodeNum);
    test.transDCube.setLength(nodeNum);

    transDEnd = 0;

    int j;
    for(int i = test.cubeIndex; test.cubeIndex < originalNum;
            test.cubeIndex = i)
    {
        //  get device node index
        test.devNode = devInfoList[originalDevMap[test.cubeIndex]].outpNode;
        test.ptEnd = 0;
        for(j = 0; j < nodeNum; j++)
        {
            test.tryCube[j] = DL_X;
        }
        for(; i < originalNum &&
                test.devNode == devInfoList[originalDevMap[i]].outpNode; i++)
        {
            for(j = 0; j < nodeNum; j++)
            {
                if(originalTable[i][j] != DL_X)
                {
                    test.tryCube[j] = DL_0;
                }
            }
        }
        
        for(j =  0; j < nodeNum; j++)
        {
            if(test.tryCube[j] == DL_0)
            {
                // register the non-"DL_X"s ("DL_0"s at the first time)
                test.ptKeep[test.ptEnd++] = j;
            }
        }
        for(j = 0; j < test.ptEnd - 1; j++)
        {
            test.vPD = test.ptKeep[j];
            testPD(test);
        }
    }
    compressTransD();
}

void DAlgorithmRenderer::autoCreateFaultDTable()
{
    int i, j, devIndex, len;
    for(j = 0; j < nodeNum; j++)
    {
        // Take it for granted that input nodes is listed at the begining
        if(nodeStyleList[j] != Input)
        {
            break;
        }
    }
    inputNum = j * 2;
    faultDTable.setRowNum(len = inputNum + originalNum);
    for(i = 0; i < inputNum; i++)
    {
        faultDTable.createRow(i, nodeNum);
        for(j = 0; j < nodeNum; j++)
        {
            faultDTable[i][j] = DL_X;
        }
        if(i % 2 == 0)
        {
            faultDTable[i][i / 2] = DL_D;
        }
        else
        {
            faultDTable[i][i / 2] = DL_N;
        }
    }
    for(; i < len; i++)
    {
        faultDTable.createRow(i, nodeNum);
        for(j = 0; j < nodeNum; j++)
        {
            faultDTable[i][j] = originalTable[i - inputNum][j];
        }
        devIndex = originalDevMap[i - inputNum];
        switch(faultDTable[i][devInfoList[devIndex].outpNode])
        {
        case DL_0:
            faultDTable[i][devInfoList[devIndex].outpNode] = DL_N;
            break;
        case DL_1:
            faultDTable[i][devInfoList[devIndex].outpNode] = DL_D;
            break;
        }
    }
}

const DCubeTable &DAlgorithmRenderer::getTransDTable() const
{
    return transDTable;
}

const DCubeTable &DAlgorithmRenderer::getFaultDTable() const
{
    return faultDTable;
}

const CubeMap &DAlgorithmRenderer::getOriginalDevMap() const
{
    return originalDevMap;
}

const CubeMap &DAlgorithmRenderer::getTransDDevMap() const
{
    return transDDevMap;
}

const DevInfoList &DAlgorithmRenderer::getDevInfoList() const
{
    return devInfoList;
}

bool DAlgorithmRenderer::implication(DCube &res, const DCube &tc)
{
    int i, j, lock, outpNode, devPt, lastCubeIndex;
    unsigned char matchStat;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
色综合天天在线| 精品播放一区二区| 欧美一区二区三区影视| 国产日韩av一区二区| 一区二区三区四区国产精品| 裸体健美xxxx欧美裸体表演| 99国产精品久久久久久久久久| 91精品国产一区二区人妖| 国产精品蜜臀在线观看| 久久狠狠亚洲综合| 欧美亚一区二区| 中文在线免费一区三区高中清不卡| 亚洲国产成人高清精品| 99久久精品99国产精品| 日韩欧美一级精品久久| 视频一区二区国产| 91精品在线观看入口| 一区二区在线观看视频| 成人午夜碰碰视频| 久久伊99综合婷婷久久伊| 五月天亚洲婷婷| 91国偷自产一区二区使用方法| 久久理论电影网| 九一久久久久久| 欧美精品日日鲁夜夜添| 亚洲综合在线电影| 91香蕉视频污在线| 日韩毛片在线免费观看| eeuss国产一区二区三区| 国产亚洲欧美激情| 国产剧情一区二区| 国产网站一区二区三区| 国产在线不卡一区| 337p粉嫩大胆色噜噜噜噜亚洲| 青青草原综合久久大伊人精品优势| 欧美丝袜丝交足nylons| 一区二区三区在线免费| 在线观看网站黄不卡| 亚洲女性喷水在线观看一区| 成人h动漫精品一区二区 | 国产高清在线观看免费不卡| 精品国产91乱码一区二区三区| 免费在线观看日韩欧美| 欧美一区二区大片| 久久99日本精品| 国产亚洲欧美在线| 国产成人免费av在线| 欧美极品少妇xxxxⅹ高跟鞋 | 国产制服丝袜一区| 精品国产91久久久久久久妲己| 韩国v欧美v日本v亚洲v| 久久久三级国产网站| 成人蜜臀av电影| 国产精品国产a| 91福利视频网站| 三级在线观看一区二区| 精品国产免费视频| aa级大片欧美| 亚洲成人中文在线| 26uuu欧美| 99在线视频精品| 日韩制服丝袜先锋影音| 337p粉嫩大胆噜噜噜噜噜91av | 亚洲老司机在线| 欧美高清视频不卡网| 国产精品自在欧美一区| ...中文天堂在线一区| 欧美日韩日本视频| 韩国精品主播一区二区在线观看| 国产精品久久久久久福利一牛影视| 色综合天天综合网天天看片| 日韩在线卡一卡二| 中文字幕第一区| 欧美日韩国产中文| 国产成人在线网站| 亚洲国产精品人人做人人爽| 亚洲精品一区二区三区影院 | 欧洲国产伦久久久久久久| 日本欧洲一区二区| 中文字幕欧美区| 4438x亚洲最大成人网| 成人性色生活片| 五月天激情综合| 中文字幕日韩欧美一区二区三区| 欧美精品久久天天躁| 国产超碰在线一区| 视频一区二区三区在线| 最新国产成人在线观看| 亚洲精品亚洲人成人网在线播放| 欧美一区二区三区喷汁尤物| 色综合视频在线观看| 久久99精品久久久久久久久久久久| 亚洲欧美区自拍先锋| 精品99999| 日韩欧美国产三级电影视频| 91官网在线观看| 成人午夜av影视| 国产一区视频导航| 麻豆精品一区二区三区| 亚洲电影一级黄| 亚洲精品日产精品乱码不卡| 国产午夜精品福利| 精品国产乱码久久久久久牛牛 | 欧美猛男gaygay网站| 99久久99久久精品免费观看| 国产一区二区精品在线观看| 美美哒免费高清在线观看视频一区二区 | 欧美在线观看视频在线| 成人久久视频在线观看| 国产一区二区三区在线看麻豆| 日韩成人精品在线观看| 亚洲一区二区三区三| 亚洲欧美视频一区| 中文字幕在线一区免费| 国产精品视频yy9299一区| 久久久一区二区三区捆绑**| 欧美电影免费观看高清完整版在线观看| 欧美在线观看视频在线| 欧美三区在线视频| 欧美色大人视频| 9191成人精品久久| 欧美精品久久99| 日韩一级二级三级| 欧美一卡2卡三卡4卡5免费| 91精品国产综合久久婷婷香蕉| 精品视频免费看| 欧美精品国产精品| 欧美成人免费网站| 久久精品亚洲麻豆av一区二区| 久久久久久久国产精品影院| 久久久精品国产免费观看同学| 国产农村妇女毛片精品久久麻豆 | 欧美xxxx老人做受| 精品国产麻豆免费人成网站| 久久久精品日韩欧美| 中文字幕在线视频一区| 亚洲最新视频在线播放| 午夜激情一区二区| 激情综合色综合久久| 丁香一区二区三区| 色综合网色综合| 欧美一区二区三区精品| 精品国产免费一区二区三区香蕉 | 欧美韩国一区二区| 亚洲女人的天堂| 奇米888四色在线精品| 久久精品国产999大香线蕉| 国产91精品免费| 欧美性一级生活| 日韩精品中文字幕在线不卡尤物| 国产日韩精品一区二区三区在线| 亚洲蜜臀av乱码久久精品蜜桃| 日韩精品国产精品| 丁香一区二区三区| 欧美电影在线免费观看| 久久色在线视频| 亚洲精品成人在线| 91视频国产资源| 精品国产1区2区3区| 亚洲精品菠萝久久久久久久| 日本aⅴ亚洲精品中文乱码| 国产电影一区二区三区| 欧美探花视频资源| 久久久久久久久久久黄色| 亚洲综合另类小说| 国产精品一区二区黑丝| 精品视频免费看| 国产精品进线69影院| 免费成人小视频| 色婷婷久久99综合精品jk白丝| 日韩精品中午字幕| 亚洲最大成人综合| 国产福利一区二区三区| 欧美男男青年gay1069videost| 国产女主播视频一区二区| 蜜臀久久99精品久久久画质超高清| av在线综合网| 久久久亚洲精品石原莉奈| 日韩黄色免费电影| 色网综合在线观看| 欧美国产在线观看| 激情av综合网| 日韩无一区二区| 亚洲成人av在线电影| 91精品办公室少妇高潮对白| 日本一区二区三区四区| 国内精品伊人久久久久av一坑| 欧美日韩和欧美的一区二区| 亚洲色图一区二区| 成人免费三级在线| 国产女人18水真多18精品一级做| 七七婷婷婷婷精品国产| 欧美精品视频www在线观看| 一区二区三区小说| 91国偷自产一区二区开放时间| 国产精品成人免费精品自在线观看 | 国产精品一区二区你懂的| 日韩免费电影一区| 免费欧美高清视频| 欧美一级精品在线|