代码介绍
由于本人蒟蒻,纯纯菜鸡,代码写的废物,离散也玩不明白,专业也被吊打,额额额说多了,写出来的东西只是这种屎山代码,因此代码仅供参考,不建议直接抄。
简要介绍一下代码中使用到的表示方法是用的按位操作符,很多人写这个程序可能直接写例如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;
}
最后的最后
希望大哥们轻点喷,这个代码可优化的地方很多,因为我是个完美主义,因此当我代码不能美观时我就不做那个功能哈哈哈,最后放个自拍照