首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将卡诺图简化程序从SOP更改为POS结果

将卡诺图简化程序从SOP更改为POS结果
EN

Stack Overflow用户
提问于 2020-02-02 03:35:18
回答 1查看 32关注 0票数 1

这是我简化卡诺图的程序。我需要把大学项目的SOP改成POS。我已经把符号从+改成了*,也从*改成了+。我现在要做的就是让它从文本文件中读取0-s,而不是1。我尝试了所有的方法来解决这个问题,但我不知道。我有两个txt文件,一个是输入文件,另一个是输出文件。此时,我需要输入0而不是1,并在另一端输入,以使其正常工作。在这一时刻,我需要输入0而不是1,并在另一边输入,以使其工作。请帮帮我,我的生命取决于此

代码语言:javascript
复制
#include <iostream>
#include <fstream>
#include <cmath>
#include <windows.h>



using namespace std;
//?????
int pow2(int n) // ??2?????,2^n
{
    int result=1
    ;
    while(n>0)
        result*=2,n--;
    return result;
}
int combination(int n,int r) // ?????C_n^r,? n! / ((n-r)!*(r)!)
{
    int fm=1,fz=1;
    for(int i=1;i<=r;i++,n--)
    {
        fm*=i;
        fz*=n;
    }
    return fz/fm;
}
void d2b(int d,char* b,int n) // ???????,??????d???????????b?
{
    for(n--;n>=0;n--)
    {
        b[n]='0'+d%2;
        d/=2;
    }
}
int ispair(char* a1,char* a2,int n) // ????????????????
{
    int x,y=0;
    for(int i=0;i<n;i++)
        if(a1[i]!=a2[i])
            x=i,y++;
    if(y==1) return x;
    else return-1;
}
bool issame(char* a1,char* a2,int n) // ????
{
    for(int i=0;i<n;i++)
        if(a1[i]!=a2[i])
            return 0;
    return 1;
}
int left1(char* a,int N) // ???????????,??????1,??????
{
    for(int i=0;i<N;i++)
        if(a[i]=='1')
            return i;
    return -1;
}
void copy(char* a1,char* a2,int n) // ??????
{
    for(int i=0;i<n;i++)
        a2[i]=a1[i];
}
bool isinside(int x,char* a,int n) // ???x????????a?
{
    for(n--;n>=0;n--)
    {
        if(a[n]!='x' && a[n]!=(char)('0'+x%2))
            return 0;
        x/=2;
    }
    return 1;
}
void output(fstream& file,char* a,int n) 
{


    for(int i=0;i<n;i++)

    {


        if(i==0)file<<'(';
        if(a[i]=='0'||a[i]=='1')

        {

            if(a[i]=='0') file<<'¬'<<(char)('a'+i);
            if(a[i]=='1') file<<(char)('a'+i);
            if(a[i+1]=='0'||a[i+1]=='1'||a[i+2]=='0'||a[i+2]=='1'||a[i+3]=='0'||a[i+3]=='1')
            {
            file<<'+';
            }
            else{
            file<<')';
            }
        }
        else{}


        ;
    }
    file<<'*';
}
int count(char* table,char* a,int n,int N) // ??,????????1???????????a?
{
    int counter=0;
    for(int i=0;i<N;i++)
    {
        if(table[i]!='1') continue;
        if(isinside(i,a,n)) counter++;
    }
    return counter;
}
void clean(char* table,char* a,int n,int N) // ??????????????????1,???x
{
    for(int j=0;j<N;j++)
        if(isinside(j,a,n))
            table[j]='x';
}
int main()
{
    SetConsoleTitle("???-???????????");
    system("color 06");
    //????
    fstream inputFile("input.txt",ios::in); //??????????input.txt
    int valNum; //???
    inputFile >> valNum; // ???????????
    cout<<"\n ????????: "<<valNum;
    cout<<"\n ?????????:\n";
    int minTermLength=pow2(valNum); // ??????????2^valNum?
    char* minTermExpression=new char[minTermLength]; // ???????????????
    int lineOff = pow2(ceil(double(valNum)/2));
    // ???????
    if (inputFile.is_open())
    {
        for(int i=0;i<minTermLength;i++) // ?????
        {
            inputFile>>minTermExpression[i];
            if(i%lineOff == 0&&(i!=0))
                cout<<"\n";
            cout<<"\t"<<minTermExpression[i];
        }
        inputFile.close();
    }
    // ??????
    else{
        cout<<"\n ??input.txt??,???????";
        return 0;
    }
    // ?implication????????
    char*** implication=new char**[valNum]; // ????

    int nonZeroNum=1;
    for(int i=0;i<minTermLength;i++)
        if(minTermExpression[i]!='0') // ?????ON???DC?????????
            nonZeroNum++;
    for(int i=0;i<valNum;i++) // i-??,???????3?,i=0???????,i=1???,i=2???
    {
        if(pow2(i)>nonZeroNum)break;
        int x=pow2(i-1)*combination(nonZeroNum,pow2(i));

        implication[i]=new char*[x];
        for(int j=0;j<x;j++)
            implication[i][j]=new char[valNum];
    }
    //?????????
    int* countNum=new int[valNum+1];
    countNum[0]=0;
    for(int i=0;i<minTermLength;i++)
        if(minTermExpression[i]!='0') // ???0?
        {
            d2b(i,implication[0][countNum[0]],valNum); // ??????????implication[0]???
            countNum[0]++;
        }
    int isOptimal=0;
    while(countNum[isOptimal]>0) // ??????????
    {
        countNum[isOptimal+1]=0;
        for(int i=0;i<countNum[isOptimal]-1;i++)
            for(int j=i+1;j<countNum[isOptimal];j++)
            {
                int x=ispair(implication[isOptimal][i],implication[isOptimal][j],valNum); // ??????????
                if(x==-1) continue;
                copy(implication[isOptimal][i],implication[isOptimal+1][countNum[isOptimal+1]],valNum);// ???implication??
                implication[isOptimal+1][countNum[isOptimal+1]][x]='x'; // ??????????,?????????x,???????????
                countNum[isOptimal+1]++;
            }
        for(int i=0;i<countNum[isOptimal+1]-1;i++)
            for(int j=i+1;j<countNum[isOptimal+1];j++)
                if(issame(implication[isOptimal+1][i],implication[isOptimal+1][j],valNum)) // ??????
                {
                    for(int k=j;k<countNum[isOptimal+1]-1;k++)
                        copy(implication[isOptimal+1][k+1],implication[isOptimal+1][k],valNum);
                    countNum[isOptimal+1]--;
                }
        isOptimal++;
    }
    isOptimal--;
    //???????
    fstream outputFile("output.txt",ios::out);
    outputFile<<"F=";
    while(left1(minTermExpression,minTermLength)>=0) //?minTermExpression???1
    {
        bool flag=0; // ???,????
        for(int i=0;i<minTermLength&&flag==0;i++)
        {
            if(minTermExpression[i]!='1') continue;
            int counter=0,recorder;
            for(int j=0;j<countNum[isOptimal];j++)
                if(isinside(i,implication[isOptimal][j],valNum))
                    counter++,recorder=j;
            if(counter!=1) continue;
            output(outputFile,implication[isOptimal][recorder],valNum);
            clean(minTermExpression,implication[isOptimal][recorder],valNum,minTermLength);
            flag=1;
        }
        if(flag==1) continue;
        int termMaxInclude=0;
        int recorder=0;
        for(int i=0;i<countNum[isOptimal];i++) // ??????????,???????????1???,??????
            if(count(minTermExpression,implication[isOptimal][i],valNum,minTermLength)>termMaxInclude)
                termMaxInclude=count(minTermExpression,implication[isOptimal][i],valNum,minTermLength),recorder=i;
        if(termMaxInclude==0) {isOptimal--; continue;}
        output(outputFile,implication[isOptimal][recorder],valNum);
        clean(minTermExpression,implication[isOptimal][recorder],valNum,minTermLength);
    }
    outputFile.close();
    // ?????
    outputFile.open("output.txt",ios::in);
    char finalExpression[201];
    outputFile.getline(finalExpression,200);
    outputFile.close();
    int termMaxInclude=0;
    for(;finalExpression[termMaxInclude]!='\0';termMaxInclude++);
        finalExpression[termMaxInclude-1]='\0';
    outputFile.open("output.txt",ios::out);
    outputFile<<finalExpression;
    outputFile.close();
    cout<<"\n??????????????";

    cout<<"\n ??????,??????!";
    cin.get();
    return 0;
}
EN

回答 1

Stack Overflow用户

发布于 2020-02-19 20:20:52

0仅仅是不在1列表中的那些。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60020468

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档