西南交通大学离散数学第一次大作业

代码介绍

  由于本人蒟蒻,纯纯菜鸡,代码写的废物,离散也玩不明白,专业也被吊打,额额额说多了,写出来的东西只是这种屎山代码,因此代码仅供参考,不建议直接抄。

  简要介绍一下代码中使用到的表示方法是用的按位操作符,很多人写这个程序可能直接写例如if(P==1||Q==1) 然后判断这个P或Q成立,因为本弱鸡刚好做过一些按位操作的题,因此引入了按位操作来实现代码,比如p与q,就是p&q。

一些运算符知识如下 :

按位与(&)只有两个数的二进制同时为1,结果才为1,否则为0。  和 与 的真值表相同

按位或(|)参加运算的两个数只要两个数中的一个为1,结果就为1。 和 或 的真值表相同

异或(^)参加运算的两个数,如果两个相应位值不同,则该位结果为1,否则为0。 和 异或 的真值表相同。

其他的符号的真值表可以相互表示。

其他就没有其他细节了,因为代码实在功能太少,我就加了一些别的东西,只有输入相应的值才能打印出来相应的真值表,然后打印在txt里面,这个代码唯一麻烦的是我没有学过c++的文件操作,只能用c里面的。。。。好了不多废话了,相信大家要是想做也可以30分钟做完,就是写个文章可能再花个10分钟吧,代码部分有注释。

代码如下

#define _CRT_SECURE_NO_WARNINGS      //vs里面fopen不能使用
#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
#include <map>              
using namespace std;

int P, Q;          //枚举P,Q  1代表真,0代表假
string select;     //记录你的选择
int mem;            //记录你选择的数的下角标
char result[4];    //记录真真值表
string se[10] = {"与","或","非","条件" ,"双条件","异或" ,"与非","或非","条件否定","退出"}; 
//把所有选择罗列出来 0  1    2      3       4      5        6     7       8        9一一对应switch case语句  。。。好久没写过switch case 了 

bool check()                 //检查你输入的选择是否正确
{
    for (int i = 0; i <= 9; i++)
    {
        if (se[i]==select)
        {
            mem = i;
            if (i == 9) 
            {
                printf("成功退出\n");
                exit(0);
            }
            return true;
         }
     
    }
    return false;
}

void Print()           //打印加读入文件
{
    printf("输出结果为\n");
    printf("------------------\n");
    cout << " P   Q    " << select << "\n";
    printf("------------------\n");
    printf(" T   T    %c\n", result[0]);
    printf(" T   F    %c\n", result[1]);
    printf(" F   T    %c\n", result[2]);
    printf(" F   F    %c\n", result[3]);
    printf("------------------\n\n");

    FILE* pf = fopen("logic.txt", "w");
    if (pf == NULL)
    {
        perror("fopen");
        exit(-1);
    }

    fprintf(pf, "输出结果为\n");
    fprintf(pf, "------------------\n");
    fprintf(pf, " P   Q    %s\n", select.c_str());
    fprintf(pf, "------------------\n");
    fprintf(pf, " T   T    %c\n", result[0]);
    fprintf(pf, " T   F    %c\n", result[1]);
    fprintf(pf, " F   T    %c\n", result[2]);
    fprintf(pf, " F   F    %c\n", result[3]);
    fprintf(pf, "------------------\n\n");
    fclose(pf);
    pf = NULL;
}

void solove()                //具体实现
{
    int now1 = 0;
    switch (mem)
    {
    case 0:
        for (int P = 1; P >= 0; P--)
        {
            for (int Q = 1; Q >= 0; Q--)
            { //按位与
                if (P & Q == 1) result[now1] = 'T';
                else result[now1] = 'F';
                now1++;
            }
        }
        break;
    case 1:
        for (int P = 1; P >= 0; P--)
        {
            for (int Q = 1; Q >= 0; Q--)
            {//按位或
                if (P | Q == 1) result[now1] = 'T';
                else result[now1] = 'F';
                now1++;
            }
        }
        break;
    case 2:
        for (int P = 1; P >= 0; P--)
        {
            for (int Q = 1; Q >= 0; Q--)
            {
                if (P|Q ) result[now1] = 'T';   //由于非的实现影响美观故不做
                else result[now1] = 'F';
                now1++;
            }
        }
        break;
    case 3:
        for (int P = 1; P >= 0; P--)
        {
            for (int Q = 1; Q >= 0; Q--)
            {  //条件
                if ( (P == 0 ? 1 : 0) | Q ) result[now1] = 'T';
                else result[now1] = 'F';
                now1++;
            }
        }
        break;
    case 4:
        for (int P = 1; P >= 0; P--)
        {
            for (int Q = 1; Q >= 0; Q--)
            {       //双条件,p->q,q->p都成立
                if ( ((P == 0 ? 1 : 0) | Q ) && (Q == 0 ? 1 : 0) | P) result[now1] = 'T';
                else result[now1] = 'F';
                now1++;
            }
        }
        break;
    case 5:
        for (int P = 1; P >= 0; P--)
        {
            for (int Q = 1; Q >= 0; Q--)
            {   //异或,和按位异或是相同的
                if (P ^ Q == 1) result[now1] = 'T';
                else result[now1] = 'F';
                now1++;
            }
        }
        break;
    case 6:
        for (int P = 1; P >= 0; P--)
        {
            for (int Q = 1; Q >= 0; Q--)
            {   //与非的真值表和 与 相反,所以直接写
                if ( !(P & Q == 1) ) result[now1] = 'T';
                else result[now1] = 'F';
                now1++;
            }
        }
        break;
    case 7:
        for (int P = 1; P >= 0; P--)
        {
            for (int Q = 1; Q >= 0; Q--)
            {  //或非的真值表和 或 相反,所以直接写
                if ( !(P | Q == 1) ) result[now1] = 'T';
                else result[now1] = 'F';
                now1++;
            }
        }
        break;
    case 8:
        for (int P = 1; P >= 0; P--)
        {
            for (int Q = 1; Q >= 0; Q--)
            {  //条件否定的真值表与条件 相反
                if ( !((P == 0 ? 1 : 0) | Q) ) result[now1] = 'T';
                else result[now1] = 'F';
                now1++;
            }
        }
        break;                     
    }
     //这里不需要dfault 因为如果选择不存在,他也进不来这个函数
    Print();
}

int main()
{
    
    while (1)   //当输入退出时循环才退出
    {
        cin >> select;
        if (check())
        {
            solove();
        }
        else
        {
            printf("无效输入\n");
        }
    }
    return 0;
}

最后的最后

希望大哥们轻点喷,这个代码可优化的地方很多,因为我是个完美主义,因此当我代码不能美观时我就不做那个功能哈哈哈,最后放个自拍照

  • 12
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值