• 【离散数学】实验一 利用真值表法求取主析取范式以及主合取范式的实现


    内容:

    针对给定的包含任意个变量的真值表,编程实现用真值表法求取其所对应的主析取范式和主合取范式。

    要求:

    能够掌握通过真值表求取相应主析取和主合取范式的方法及原理。

    代码:

    /*
     * Author:   Tob_yuhong
     * Function: 针对给定的包含任意个变量的真值表,编程实现用真值表法求取其所对应的主析取范式和主合取范式。
     * 运行环境:Code::Blocks 13.12
     */
    #include <iostream>
    #include <cstdio>
    #include <cstdlib>
    #include <vector>
    #include <cstring>
    #include <cmath>
    #include <fstream>
    using namespace std;
    
    const int LEN = 140 + 10; //定义数组长度
    char arr[LEN];   //用来存放2^n次方个字符,n表示变量个数
    int brr[LEN][4+10];   //brr用来存放真值表
    int beg = 80;             //字符P对应的ASCII码
    int sta1 = 0, sta2 = 0;   //sta1表示真值为T的个数,sta2表示真值为F的个数
    
    int main()
    {
    //    freopen("datain.txt", "r", stdin);
        memset(brr, 0, sizeof(brr));
        int num;  //变量个数
        cout << "请输入变量个数 : ";
        cin >> num;
        cout << endl;
        int sum = pow(2, num);  //2^n
        cout << "请输入"<< sum << "个字符(用T 或 F表示) : ";
        for(int i = 1; i <= sum; i++)
        {
            cin >> arr[i];
            if(arr[i] == 'T')
                sta1++;
            else
                sta2++;
        }
        cout << endl;
        //处理真值表
        int cnt1 = 0, cnt2 = 1;
        for(int i = sum-1; i >= 0; i--)
        {
            cnt1 = 0;
            int val=i;
            while(cnt1 < num)
            {
                cnt1++;
                brr[cnt2][cnt1] = val%2;
                val = val/2;
            }
            cnt2++;
        }
        cout << "输出公式对应的真值表 : " << endl;
        for(int i = 1; i <= num ;i++)
        {
            cout << char(beg++) << "      ";
        }
        cout << 'A';
        cout << endl;
        cout << "———————————" << endl;
        beg = 80;   
        for(int i = 1; i <= sum; i++)
        {
            for(int j = num; j >= 1; j--)
            {
                if(brr[i][j] == 1)
                    cout << 'T' << "      ";
                else
                    cout << 'F' << "      ";
            }
            cout << arr[i];
            cout << endl;
        }
        cout << endl;
        int k = 0;
    
        cout << "输出主析取范式:" << endl;
        for(int i = 1; i <= sum; i++)
        {
            if(arr[i] == 'T')
            {
                k++;
                cout << '(';
                for(int j = num; j >= 1; j--)
                {
                    if(brr[i][j] == 1)
                    {
                        cout << (char)(beg++);
                    }
                    else
                    {
                        cout << "┓" << (char)(beg++);
                    }
                    if(j != 1)
                        cout << "∧";
                }
                cout << ')';
                if(k < sta1)
                    cout << "∨";
            }
            beg = 80;
        }
        cout << endl
             << endl;
             
        cout << "输出主合取范式:" << endl;
        for(int i = 1; i <= sum; i++)
        {
            if(arr[i] == 'F')
            {
                k++;
                cout << '(';
                for(int j = num; j >= 1; j--)
                {
                    if(brr[i][j] == 0)
                    {
                        cout << (char)(beg++);
                    }
                    else
                    {
                        cout << "┓" << (char)(beg++);
                    }
                    if(j != 1)
                        cout << "∨";
                }
                cout << ')';
                if(k < sta2)
                    cout << "∧";
            }
            beg = 80;
        }
        cout << endl;
    
        return 0;
    }
    


    运行结果示意:


    测试数据:

    /*

    3
    T F F T F F F T

    */

    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    热烈祝贺《名博是怎样炼成的》出版
    公司年会在民俗文化村举行
    春节后第一周个人新闻两则
    用asp.net来回收IIS6.0应用程序池
    ComponentArt Web.UI 升级遇到的问题
    今天给博客设计了个博皮
    2009春运购火车票经历
    Android平台下实现一个进程管理器
    【转】Windows平台下Android源码的下载
    【转】 使用git 工具下载android.jar Source Code
  • 原文地址:https://www.cnblogs.com/Tobyuyu/p/4965349.html
Copyright © 2020-2023  润新知