c语言打印真值表
八种逻辑门电路真值表

以下是八种逻辑门电路的真值表:1. 与门(AND):所有输入为高时,才会有输出高。
真值表如下:* 输入A
* 输入B
* 输出Y
* 0
* 0
* 0
* 0
* 1
* 0
* 0
* 1
* 1
* 1
2. 或门(OR):所有输入为低时,才会有输出低。
真值表如下:
* 输入A
* 输入B
* 输出Y
* 0
* 0
* 0
* 0
* 1
* 1
* 1
* 0
3. 非门(NOT):逆转输入的高低状态。
真值表如下:
* 输入A
* 输出Y
* 0
* 1
4. 与非门(NAND):所有输入为高时,才会有输出低。
真值表如下:
* 输入A
* 输入B
* 输出Y
* 0
* 0
* 1
* 0
* 1
* 1
5. 或非门(NOR):所有输入为低时,才会有输出高。
真值表如下:
* 输入A
* 输入B
* 输出Y
* 0
* 0
* 0
6. 异或门(XOR):输入相同时输出为低,否则为高。
真值表如下:
* 输入A
* 输入B
* 输出Y
* 0
* 0
7. 同或门(XNOR):与异或门相反。
输入相同时输出为高,否则为低。
真值表如下:
8. 与门的逻辑符号为AND,或门的逻辑符号为OR,非门的逻辑符号为NOT,与非门的逻辑符号为NAND,或非门的逻辑符号为NOR,异或门的逻辑符号为XOR,同或门的逻辑符号为XNOR。
离散数学实验——求真值表

一实验目的 (1)二实验内容 (1)三实验环境 (1)四实验原理和实现过程(算法描述) (1)五实验数据及结果分析; (3)六源程序清单; (7)七其他收获和体会。
(16)一实验目的熟悉掌握命题逻辑中的联接词、真值表、主范式等,进一步能用它们来解决实际问题。
二实验内容1. 从键盘输入两个命题变元P和Q的真值,求它们的合取、析取、条件和双条件的真值。
(A)2. 求任意一个命题公式的真值表(B,并根据真值表求主范式(C))三实验环境C或C++语言编程环境实现。
四实验原理和实现过程(算法描述)A:首先提示用户输入真值指派,然后判断用户输入的是否是0或者1,如果不是则利用while语句提示错误,然后提示重新输入直至输入正确,再根据用户输入的真值给代表合取,析取,蕴含,双条件的变量赋值,再以两行表格形式输出所得结果。
最后提示按#键退出,否则继续循环求真值。
B:主要思路:首先提示用户输入表达式,然后编写并调用一个函数将表达式转换为逆波兰式,在转换的同时,插入部分语句将表达式中的变量名存储到数组bianl[N]中,然后输出存好的各变量名及用户输入的表达式(建立表头),将每次的真值指派存在数组zhi[]中,编写函数zzhi()每次调用zzhi()时都使数组zhi[]中的真值加1,(利用递推实现加一时可能的进位,)然后编写并调用一函数qiuzhi ()计算每次真值指派下的逆波兰表达式的值,再输出各真值指派和求出的表达式的真值,然后调用函数zzhi()将真值指派的数组加1,最后外围利用while语句循环输出每个不同的真值指派和该指派下表达式的值。
将表达式转换成逆波兰式并将变量提取的算法:首先需要分配2个栈,一个作为临时存储运算符的栈fu[],一个作为输入逆波兰式的栈nibol[],从中缀式的左端开始取字符,逐序进行如下步骤:(1)若取出的字符是字母,则该字母直接送入nibol[]栈。
同时为了找出所有变量,将该变量名与数组bianl[]中已有的元素比较,如果bianl[]中还没有该字母,则该字母是新出现的变量,将其录入数组bianl[]中。
(完整版)利用真值表法求取主析取范式以及主合取范式的实现-副本

#include "stdio.h"#include "stdlib.h"#include "string.h"#include "math.h"#define N 50void pd(int b[N],int f);int H1 (char T1[N], char T2[N], int T3[N], int y);int H2 (char T1[N], char T2[N], int T3[N], int y);int main(){int i1,i2,d=1,T3[N],kh=0,jg,j=0,y;int w=0,hequ[N],h=0,x=0,xiqu[N];char T1[N],T2[N],T10[N],s;hequ[0]=-1;xiqu[0]=-1;printf("#########################################\n");printf("## 用! 表示否定##\n");printf("## 用& 表示合取##\n") printf("## 用|表示析取##\n"); printf("## 用八表示条件##\n");printf("## 用~ 表示双条件##\n"); printf("#########################################\n\n");printf(" 请输入一个合法的命题公式:\n"); gets(T1);strcpy(T10,T1); for(i1=0;i1<strlen(T1);i1++) {if(T1[i1]==')' || T1[i1]=='(')kh++;if(T1[i1]>='a' && T1[i1]<='z' || T1[i1]>='A' &&T1[i1]<='Z') {for(i2=0;i2<j;i2++) if(T2[i2]==T1[i1]) d=0;if(d==1){T2[j]=T1[i1];j++;}d=1;}}printf("\n 输出真值表如下:\n \n"); for(i1=0;i1<y;i1++) printf(" %c ",T2[i1]); printf(" "); puts(T1);printf("\n"); for(i1=0;i1<j;i1++)T3[i1]=0; for(i2=0;i2<j;i2++)printf(" %d ",T3[i2]); jg=H1(T1,T2,T3,y); if(jg==0) hequ[h++]=w;else xiqu[x++]=w;printf(" %d\n",jg);strcpy(T1,T10); for(i1=0;i1<(int)pow(2,j)-1;i1++) {++w; pd(T3,j-1);jg=H1(T1,T2,T3,y); if(jg==0)hequ[h++]=w;else xiqu[x++]=w;strcpy(T1,T10); for(i2=0;i2<j;i2++) printf(" %d",T3[i2]);printf(" %d\n",jg); }if(hequ[0]==-1) printf("\n 该命题公式不存在主合取范式。
真值表逻辑等价永真蕴涵

(10)(P→Q)∧(Q→R) ⇒ P→R
(11)(P∨Q)∧(P→R)∧(Q→R) ⇒ R (12)(P→Q)∧(R→S) ⇒ (P∧R)→(Q∧S ) (13)(PQ) ∧(QR) ⇒ (P R)
33
永真蕴含的性质
• 设A、B、C是命题公式 (1)若A⇔B,则A⇒B,B⇒A; (2)若A⇒B, 则 PA⇒PB; PA⇒PB;(补充) PA⇒PB;(补充) (注意: AP⇒BP;AP⇒BP; PA⇒PB 或PA⇒PB 都不一定成立。)
设P1,…,Pn为命题A和B包含的所有命题变元。 A ⇔ B A为永真式 A为永假式
P … Pn A B
1
P … Pn A
1
P … Pn A
1
v v
v v v v
2 2 1 1
1 1 … 1
0 0 … 19 0
证明逻辑等价、永真(假)式 的方法(2)
方法二:命题演算 A⇔ B: A⇔ … ⇔ B A为永真式: A⇔ … ⇔1 A为永假式: A⇔ … ⇔0
20
证明逻辑等价例
• 证明┐(PQ) ⇔ P▽Q 证明: 因为PQ ⇔ (P→Q)∧(Q→P) ┐(PQ)⇔ ┐((P→Q)∧(Q→P)) ⇔ ┐(P→Q) ∨ ┐(Q→P) ⇔ ┐(┐P∨Q)∨ ┐(┐Q∨P) ⇔ (┐┐P∧┐Q)∨(┐┐Q∧┐P) ⇔ (P∧┐Q)∨(Q∧┐P) ⇔ P▽Q
26
永真蕴涵的证明方法(1)
欲证:AB • 方法一: 构造AB的真值表 • 方法二:利用等价演算证明 AB1 • 方法三:证明当A为真时,B必为真。 • 方法四:利用常用的等价公式和永真蕴涵 公式证明。 • 方法五:范式
27
永真蕴含式例1(1)
离散数学真值表的计算

离散数学真值表的计算⼤⼀菜鸡肝了近两个⼩时的成果,⽤于计算真值表;拿来⽔⼀篇博客(并不);代码中⽐较重要的两部分是原式向后缀式的转换,遍历所有原⼦命题的可能取值;具体的细节看代码吧,尽量添加了注释;#include<bits/stdc++.h>using namespace std;const int maxn = 105;const int maxstr = 1e5 + 10;char s[maxstr],str[maxstr],Vstr[maxn];//依次为原式,后缀式,存放原⼦命题的符号bool var[maxn];//不同原⼦命题的真值map<char,int>v;//储存原⼦命题对应的编号void Print_true(bool b){//打印bool对应的真值符号if(b) printf("T\t");else printf("F\t");}int Priority(char c){//返回运算符的优先级int p;switch (c) {case '!': p = 5; break;case '&': p = 4; break;case '|': p = 3; break;case '-': p = 2; break;case '=': p = 1; break;default : p = 0; break;}return p;}bool ToPostfix(){//原式转化为后缀表达式int cnt = 0;int len = strlen(s);stack<char>ope;for(int i=0; i<len; i++){if(s[i] == '('){ope.push(s[i]);}else if(s[i] == ')'){if(ope.empty()) return false;while(ope.top() != '('){str[cnt++] = ope.top();ope.pop();if(ope.empty()) return false;}ope.pop();}else if(Priority(s[i]) == 0){str[cnt++] = s[i];}else {if(ope.empty()){ope.push(s[i]);}else {if(Priority(s[i]) > Priority(ope.top())){ope.push(s[i]);}else{while(!ope.empty() && ope.top() != '(' && Priority(s[i]) <= Priority(ope.top())) {str[cnt++] = ope.top();ope.pop();}ope.push(s[i]);}}}}while(!ope.empty()){str[cnt++] = ope.top();ope.pop();}str[cnt] = 0;return true;}bool Calculate(bool a, bool b, char ope){//进⾏真值的运算bool ans;if(ope == '&'){if(a == true && b == true) ans = true;else ans = false;}else if(ope == '|'){if(a == true || b == true) ans = true;else ans = false;}else if(ope == '-'){if(a == true && b == false) ans = false;else ans = true;}else if(ope == '='){if(a == b) ans = true;else ans = false;}return ans;}void init_var(int n, int sum){//对var数组初始化while(sum>0){bool x = sum%2;var[n--] = x;sum /= 2;}do{var[n--] = false;}while(n > 0);}bool Result(){//对后缀式进⾏计算stack<bool>res;int len = strlen(str);for(int i=0; i<len; i++){if(str[i] == '!'){if(res.empty()){printf("计算出现异常!\n");}else {bool f = res.top();// printf("text = %d\n",f);res.pop();res.push(!f);}}else if(Priority(str[i])){bool a,b;if(res.empty()) printf("计算出现异常!\n");else {b = res.top();res.pop();}if(res.empty()) printf("计算出现异常!\n");else {a = res.top();res.pop();}bool ans = Calculate(a, b, str[i]);res.push(ans);}else {res.push(var[v[str[i]]]);}}return res.top();}void Print_Out(){//打印提⽰语printf("您好,欢迎使⽤离散数学真值表计算V1.2版本。
C语言运算符大全

C语言运算符大全C语言运算符大全C语言的内部运算符很丰富,运算符是告诉编译程序执行特定算术或逻辑操作的符号。
C语言有三大运算符:算术、关系与逻辑、位操作。
另外,C还有一些特殊的运算符,用于完成一些特殊的任务。
2.6.1算术运算符表2-5列出了C语言中允许的算术运算符。
在C语言中,运算符“+”、“-”、“*”和“/”的用法与大多数计算机语言的相同,几乎可用于所有C语言内定义的数据类型。
当“/”被用于整数或字符时,结果取整。
例如,在整数除法中,10/3=3。
一元减法的实际效果等于用-1乘单个操作数,即任何数值前放置减号将改变其符号。
模运算符“%”在C 语言中也同它在其它语言中的用法相同。
切记,模运算取整数除法的余数,所以“%”不能用于float和double类型。
最后一行打印一个0和一个1,因为1/2整除时为0,余数为1,故1%2取余数1。
2.6.2自增和自减C语言中有两个很有用的运算符,通常在其它计算机语言中是找不到它们的—自增和自减运算符,++和--。
运算符“++”是操作数加1,而“--”是操作数减1,换句话说:x=x+1;同++x;x=x-1;同--x;自增和自减运算符可用在操作数之前,也可放在其后,例如:x=x+1;可写成++x;或x++;但在表达式中这两种用法是有区别的。
自增或自减运算符在操作数之前,C语言在引用操作数之前就先执行加1或减1操作;运算符在操作数之后,C语言就先引用操作数的值,而后再进行加1或减1操作。
请看下例:x=10;;y=++x;此时,y=11。
如果程序改为:x=10;y=x++;则y=10。
在这两种情况下,x都被置为11,但区别在于设置的时刻,这种对自增和自减发生时刻的控制是非常有用的。
在大多数C编译程序中,为自增和自减操作生成的程序代码比等价的赋值语句生成的代码要快得多,所以尽可能采用加1或减1运算符是一种好的选择。
下面是算术运算符的优先级::最高++、----(一元减)*、/、%最低+、-编译程序对同级运算符按从左到右的顺序进行计算。
离散数学实验——真值表

#include<iostream.h>void main(){ int m,s;char a,b,c,d,e;do{cout<<"\n ********欢迎进入该系统******** "<<"\n";cout<<" 1.与运算p&&q "<<"\n";cout<<"2.或运算p||q "<<"\n";cout<<"3.非运算!q "<<"\n";cout<<" 4.则运算p->q "<<"\n";cout<<”5.蕴涵运算p<->q "<<"\n\n";cout<<"请选择你需要的操作序号: ";cin>>m;switch (m) {case 1:{cout<<"\n请输入两个字母:";cin>>a>>b;cout<<a<<"\t"<<b<<"\t"<<a<<"&&"<<b<<"\n";for(int i=0;i<2;i++)for(int k=0;k<2;k++){ c out<<i<<"\t"<<k<<"\t";if(i+k==2) cout<<"1"<<"\n";elsecout<<"0"<<"\n";}break; }case 2:{cout<<"\n请输入两个字母:";cin>>c>>d;cout<<c<<"\t"<<d<<"\t"<<c<<"||"<<d<<"\n";for(int j=0;j<2;j++)for(int k=0;k<2;k++){ cout<<j<<"\t"<<k<<"\t";if(j+k>0)cout<<1<<"\n";else cout<<0<<"\n";}break; }case 3:{cout<<"\n请输入一个字母:";cin>>e;cout<<e<<"\t"<<"!"<<e<<"\n";for(int j=0;j<2;j++){ cout<<j<<"\t";if(j==0)cout<<1<<"\n";elsecout<<0<<"\n";}break; }case 4:{cout<<"\n请输入两个字母:";cin>>a>>b;cout<<a<<"\t"<<b<<"\t"<<a<<"->"<<b<<"\n";for(int j=0;j<2;j++)for(int k=0;k<2;k++){ cout<<j<<"\t"<<k<<"\t";if(j==0)cout<<1<<"\n";else{if(k==1)cout<<1<<"\n";elsecout<<0<<"\n";} }break;}case 5:{cout<<"\n请输入两个字母:";cin>>a>>b;cout<<a<<"\t"<<b<<"\t"<<a<<"<->"<<b<<"\n";for(int j=0;j<2;j++)for(int k=0;k<2;k++){ cout<<j<<"\t"<<k<<"\t";if(j==k)cout<<1<<"\n";elsecout<<0<<"\n";}break;}}cout<<"\n 你还需要继续操作吗?(YES=1,NO=0): ";cin>>s;}while(s);}1运算:a&&b2运算:p->q3运算:c<—>d。
c语言打印真值表

if(str[1][i] == 1)
{
left=i;
}
if(str[1][i] == 2)
{
right=i;
break;
}
}
str[1][left]=0;//用完 right 和 left 之后将其标记为0
str[1][right]=0;
k=right-left;
for(j=1;j<=k;j++)
return true;
else
return false;
}
void IsFormula(char (*str)[50])//关键函数判断 len>=3 的情况
{
int i,j,k;//辅助变量
int left = 0,right =0;
for(i=0;i<strlen(str[0]);i++)
#include <math.h>
/*
(1) '!'表示否定
(2) '&'表示合取
(3) '|'表示析取
(4) '>'表示条件
(5) '='表示双条件
*/
struct Stack
str[j++]=e;
}
pop(&s,&e);
continue;
}
if( IsNum(arr[i]) )//如果是操作数,则直接进入后缀式
C4C语言学习资料6

例:计算符号函数
输入变量x, 计算符号函数: 1 当 x>0 y = 0 当 x=0 -1 当 x<0
非0
0
x>0
0
x=0
非0
if (x>0) y = 1; else if (x==0) y = 0; else y = -1;
y=1
y=0
y = -1
例4-9
x <1
非0
0 0
x <2
非0 非0
0
逻辑与 &&
(x>1)&&(y>1)
逻辑或 ||
(x>1)||(y>1)
逻辑非 !
(x>1)
!(x>1) 即 x<=1
逻辑运算的规则-真值表
逻辑与 && 逻辑或 || 逻辑非 ! 真值表 x y x&&y x||y !x 假 假 0 0 1 假 真 0 1 1 真 假 0 1 0 真 真 1 1 0
一条语句 一条语句
4.2.1 基本的if语句
2、省略else的if结构 if (exp) statement_1
ch=getchar(); if(ch>='a'&&ch<='z') ch=ch-'a'+'A'; putchar(ch);
非0
表达式
0
语句1
ch=getchar(); if(ch>='a'&&ch<='z'){ ch=ch-'a'+'A'; putchar(ch); }
C语言第3~4章a

3.1 if语句
一、两种形式 形式一 if(表达式)语句; 例如:if ( a>b ) x=a ; 形式二 if(表达式)语句1;else 语句2 例如:if ( a>b ) x=a ; else x=b;
a>b Y x=a
13
N
Y
a>b
N
x=a
x=b
P28例3.1、3.2
14
改为将任意两个整数按大小顺序输出
表达式表达式表达式表达式表达式表达式逻辑运算规则真值表xxyyxyxy0000000011001100111111000011001111111100逻辑表达式的值为0赋值表达式构成的逻辑表达式逻辑表达式的值为0逻辑表达式构成的逻辑表达式算术表达式构成的逻辑表达式逻辑表达式的值为1297397关系表达式构成的逻辑表达式逻辑表达式的值为1逻辑表达式的值为110一点说明
32
学生成绩管理
输 入 模 块
处 理 模 块
查 询 模 块
输 出 模 块
… 统 计 平 均 成 绩
… 按 成 绩 排 序 按 学 号 查 询
… 按 姓 名 查 询
…
返回第五章 33
循环的概念
例:计算数学式 s=1+2+3+4+…+99+100 将上式改写成 s=((…((0+1)+2)+3)+…+99)+100) 再将括号中的每一次求和单独分离出来,写成: s1=0+1 (1) s2= s1 +2 (2) s3= s2 +3 (3) S=0; … … i=1; s100= s99 +100 (100)
(1) !( c-’a’ ) 0 (2) a <= c|| f <= c 2<=97 3<=97 (3) ( a=0 ) && ( f=4 )
C语言运算符大全

C语言运算符大全C语言的内部运算符很丰富,运算符是告诉编译程序执行特定算术或逻辑操作的符号。
C语言有三大运算符:算术、关系与逻辑、位操作。
另外,C还有一些特殊的运算符,用于完成一些特殊的任务。
表2-5列出了C语言中允许的算术运算符。
在C语言中,运算符“+”、“-”、“*”和“/”的用法与大多数计算机语言的相同,几乎可用于所有C语言内定义的数据类型。
当“/”被用于整数或字符时,结果取整。
例如,在整数除法中,10/3=3。
一元减法的实际效果等于用-1乘单个操作数,即任何数值前放置减号将改变其符号。
模运算符“%”在C语言中也同它在其它语言中的用法相同。
切记,模运算取整数除法的余数,所以“%”不能用于float和double类型。
最后一行打印一个0和一个1,因为1/2整除时为0,余数为1,故1%2取余数1。
C语言中有两个很有用的运算符,通常在其它计算机语言中是找不到它们的—自增和自减运算符,++和--。
运算符“++”是操作数加1,而“--”是操作数减1,换句话说:x=x+1;同++x;x=x-1;同--x;自增和自减运算符可用在操作数之前,也可放在其后,例如:x=x+1;可写成++x;或x++;但在表达式中这两种用法是有区别的。
自增或自减运算符在操作数之前,C语言在引用操作数之前就先执行加1或减1操作;运算符在操作数之后,C 语言就先引用操作数的值,而后再进行加1或减1操作。
请看下例:x=10;;y=++x;此时,y=11。
如果程序改为:x=10;y=x++;则y=10。
在这两种情况下,x都被置为11,但区别在于设置的时刻,这种对自增和自减发生时刻的控制是非常有用的。
在大多数C编译程序中,为自增和自减操作生成的程序代码比等价的赋值语句生成的代码要快得多,所以尽可能采用加1或减1运算符是一种好的选择。
下面是算术运算符的优先级::最高++、----(一元减)*、/、%最低+、-编译程序对同级运算符按从左到右的顺序进行计算。
C真值表实验报告

C++真值表实验报告实验1:真值表一、实验目的:通过试验,了解命题的有关概念,真值表技术,连接词的作用与意义二、实验类型:验证型实验三、实验学时:2学时四、实验原理及知识点掌握命题公式及其类型的概念,熟悉逻辑连接词的运算规则,熟悉命题公式真值表的构成,并可用计算机实现五、实验环境(硬件环境、软件环境)1、试验环境visual C++6.02、操作系统window 7六、实验内容及步骤1、编写操作界面使用MFC提供的DLG类,在面板上添加一个输入文本框作为输入公式的实例输入。
添加两个按钮分别表示在程序面板上显示结果和利用输出文本文件显示并保存结果。
2、按照运算规则编写求真值表函数在对应按钮的触发事件中添加对应的处理函数3、测试与修改七、思考与练习利用真值表技术和公式的演算方法,如何求得公式对应的主析取范式和主合取范式,如何判断两公式是否相等,是否为永真式、永假式、可满足式?附录A:#include <iostream> #include <stack> #include<cmath> #define maxsize 100 using namespace std;char str[100];//输入的表达式int zhipai[20]={0};//用于指派真值的数组int length;//逻辑表达式长度char expression[100];//用于计算的数组class symbol { public:void solve(); void Clear(){} private: void change(); int Calculate(); void check();bool Get2Operands(double &left,double &right); void DoOperator(char op);stack<int> s; //运算栈};bool symbol ::Get2Operands(double &left,double&right){ //取两运算值if(s.size()==0){ cerr<<"Miss Operand!"<<endl; return false;}right=s.top(); s.pop();if(s.size()==0){ cerr<<"Miss Operand!"<<endl;return false; }left=s.top(); s.pop(); return true;}void symbol ::DoOperator(char op){ //单次运算double left,right;bool result=Get2Operands(left,right);if(result)switch(op){case '|':s.push(left||right);break;//或运算case'&':s.push(left&&right);break;//与运算case '>':s.push(!left||right);break;//蕴涵运算case'!':s.push((!right)&&left);break;//非运算case '=':s.push(left==right);break;//等价运算}elseClear();}void symbol ::change() //将输入的字符串转化为可计算的表达式{ int k=0; int flag=1;int count=0; //命题变元个数for(inti=0;i<pow(2,count);i++) { k=1;for(int m=0;m<length;m++) { if(isalpha(str[m]))//将原来的命题变元修改为真值{ if(flag==1) {if(zhipai[k]==0) expression[m]='0'; elseexpression[m]='1'; k++; } elseexpression[m]='0'; flag=1;for(int t=m;t>=0;t--){if((str[m+1]==str[t])&&isalpha(str[m+1])&&isalpha(s tr[t])) flag=0; } }elseexpression[m]=str[m];//逻辑联结词不变}for(int t=0;t<length;t++) { for(int j=t;j<length;j++) { if(str[t]==str[j]){expression[j]=expression[t];//相同的命题变元复制赋值}} } } }void plus(int a[],int q)//二进制加法器,用于指派真值{ a[q]=a[q]+1;for(int i=q;a[i]==2;i--) { a[i]=0;a[i-1]=a[i-1]+1;} }int isp(char ch){ //联结词的栈内优先级switch(ch){case '#':return 0;break; case '(':return1;break; case '!':return 10;break; case'=':return 9;break; case '&':return 7;break; case '|':return 5;break; case '>':return 3;break; case ')':return 12;break; default:return -1;break;}}int icp(char ch){ //联结词的栈外优先级switch(ch){case '#':return 0;break; case '(':return12;break; case '!':return 11;break; case'=':return 8;break; case '&':return 6;break; case '|':return 4;break; case '>':return 2;break; case ')':return 1;break; default:return -1;break;}}int symbol ::Calculate(){ //模仿实数加法器进行表达式计算stack<char> h;//联结词栈char ch,y; h.push('#');for(int temp=0;temp<length-1;temp++){ ch=expression[temp];if(isdigit(ch))//命题变元真值入栈{ if(ch=='0') s.push(0); elses.push(1);}else if(ch==')')//运算括号内的{for(y=h.top(),h.pop();y!='(';y=h.top(),h.pop()){DoOperator(y);}}else{ if(ch=='!')//非运算,在!前加1,将!视作双目操作符{ s.push(1);}for(y=h.top(),h.pop();isp(y)>icp(ch);y=h.top(),h.pop())//联结词入栈DoOperator(y); h.push(y);h.push(ch);} }while(h.size()!=1){//计算剩下的y=h.top(); h.pop();DoOperator(y);}cout <<s.top()<<endl;//输出最终结果return s.top(); }void symbol::check();//检查函数的预先声明void symbol::solve()//问题的解决{ cout<<" 使用说明"<<endl;cout<<" ———————"<<endl;cout<<"=================================hx1.push('('); stack<char> hx2;for(int r=0;r<pow(2,count);r++)//输出真值表================="<<endl;cout<<"=={=="<<endl; for(int j=1;j<=count;j++) cout<<"== 命题变元个数不要超过20个{cout<<zhipai[j]<<' ';} =="<<endl;cout<<"== 或运算用'|' 与运算用'&' =="<<endl;cout<<"== 非运算用'!' 蕴涵运算用'>' =="<<endl;cout<<"== 等价运算用'=' 表达式以#结尾== "<<endl;cout<<"===="<<endl;cout<<"=================================================="<<endl;cout<<"请输入命题逻辑表达式:";int flag=1;//标记,防止重复添加命题变元int count=0;//命题变元的数目cin >>str; //输入命题逻辑表达式length=strlen(str);char bianyuan[100]; //命题变元数组for(int i=0;i<length;i++)//逐次添加命题变元{if(isalpha(str[i])&&(flag==1)){bianyuan[count]=str[i];count++;}flag=1;for(int k=0;k<count;k++){if(bianyuan[k]==str[i+1])flag=0;}}if(count==0){cout<<"无命题变元,重新输入!"<<endl;solve();}check();//合法性检查cout<<"真值表:" <<endl;for(int w=0;w<count;w++)cout<<bianyuan[w]<<' ';cout<<"fc"<<endl;int* truth=new int[pow(2,count)];stack<char> xh1;xh1.push('(');stack<char> xh2;stack<char> hx1; change(); truth[r]=Calculate();if(truth[r]==1) //成真指派入析合栈{ for(intt=0;t<count;t++) { if(zhipai[t+1]==1){ xh1.push(bianyuan[t]); xh1.push('&'); } else { xh1.push('!'); xh1.push(bianyuan[t]); xh1.push('&'); } } xh1.pop();xh1.push(')'); xh1.push('|');xh1.push('('); } if(truth[r]==0) //成假指派入合析栈{ for(int c=0;c<count;c++) { if(zhipai[c+1]==1){ hx1.push(bianyuan[c]); hx1.push('|'); }else { hx1.push('!'); hx1.push(bianyuan[c]); hx1.push('|'); } } hx1.pop();hx1.push(')'); hx1.push('&');hx1.push('(');}plus(zhipai,count);}cout<<"是否继续运算?Y/N"<<endl; char goon;cin>>goon;if(goon=='y'||goon=='Y') { system("cls");solve();//递归调用solve,重新计算} else exit(0); }void symbol::check()//检查输入的逻辑表达式是否合法{ if(str[length-1]!='#'){cout<<"未以#结尾,重新输入!"<<endl;solve();}if(!isalpha(str[length-2])&&str[length-2]!=')'){cout&l t;<"错误,重新输入!"<<endl;solve();} for(inti=0;i<length-1;i++) {if(!isalpha(str[i])&&str[i]!='&'&&str[i ]!='|'&&str[i]!='>'&&str[i]!='='&&str[i]!='!& #39;&&str[i]!='('&&str[i]!=')') { cout<<"错误的字符,重新输入!"<<endl;solve(); } if(isalpha(str[i])&&str[i+1]=='!'){cout<<"命题变元后不可跟!,重新输入!"<<endl;solve();}if(str[i]==')'&&str[i+1]=='!'){cout<<")后不可跟!,重新输入!"<<endl;solve();}if(isalpha(str[i])&&isalpha(str[i+1])){cout<<"命题变元之间无联结词,重新输入!"<<endl;solve();}if(isalpha(str[i])&&str[i+1]=='('){cout<<"命题变元后不可接(,重新输入!"<<endl;solve();}if(!isalpha(str[i])&&!isalpha(str[i+1])&&(str[i]!=' ;('&&str[i+1]!='!')&&str[i+1]!='('&&str[i]!=')'){ cout<<"联结词间无命题变元,重新输入!"<<endl;solve(); }}int left=0,right=0,j=0;while(j<length-1){ if(str[j]=='(') left++; if(str[j]==')') right++; if(right>left){cout<<"括号次序不匹配,重新输入!"<<endl;solve();} j++; }if(left!=right){cout<<"括号个数不匹配,重新输入!"<<endl;solve();} }int main(){ symbol a;//对象aa.solve();//调用a的函数solve,实现功能return 0;}附录B:。
c语言打印格式汇总

在C语言中,可以使用不同的格式化符号来控制打印输出。
以下是一些常用的C语言打印格式:
1.%d:用于打印十进制整数。
2.%u:用于打印无符号十进制整数。
3.%f:用于打印浮点数。
4.%c:用于打印字符。
5.%s:用于打印字符串。
6.%p:用于打印指针地址。
7.%o:用于打印八进制数。
8.%x:用于打印十六进制数。
9.%b:用于打印二进制数。
10.%n:用于打印已写字符的个数。
11.%v:用于打印可变参数列表。
12.%a、%A:用于打印浮点数、复数等复杂数据类型。
13.%%:用于打印百分号本身。
这些格式化符号可以与printf函数一起使用,以控制输出格式和数据类型。
例如,printf("整数是%d\n", 42);将输出“整数是42”。
打印真值表程序

SA11226003 李云鹏程序目的:编写程序输入一行逻辑串,打印真值表。
编写语言:JA V A策略:运用算符优先分析法,难点就是算符优先分析法。
概念来自编译原理,不过在这里也仅仅是一个简单的应用。
如果翻书的话,就发现这个分析法主要就是用了一个栈。
在不同的条件下,进行出栈、入栈操作,在这个过程中就可以把逻辑表达式的结构分析出来。
最终分析得出的是一个树状结构(编译原理中,称之为语法树)然后,看看总共用了多少个变量,对这些变量的值进行穷举,就可以输出真值表了。
算符有限分析法:将一个普通的中序表达式转换为逆波兰表达式的一般算法是:首先需要分配2个栈,一个作为临时存储运算符的栈S1(含一个结束符号),一个作为输入逆波兰式的栈S2(空栈),S1栈可先放入优先级最低的运算符#,注意,中缀式应以此最低优先级的运算符结束。
可指定其他字符,不一定非#不可。
从中缀式的左端开始取字符,逐序进行如下步骤:(1)若取出的字符是操作数,则分析出完整的运算数,该操作数直接送入S2栈;若取出的是运算符,并且当前S1栈顶为(,则当前运算符直接入S1栈。
(2)若取出的字符是运算符,则将该运算符与S1栈栈顶元素比较,如果该运算符优先级大于S1栈栈顶运算符优先级,则将该运算符进S1栈,否者,将S1栈的栈顶运算符弹出,送入S2栈中,直至S1栈栈顶运算符低于(不包括等于)该运算符优先级,则将该运算符送入S1栈。
(3)若取出的字符是“(”,则直接送入S1栈栈顶。
(4)若取出的字符是“)”,则将距离S1栈栈顶最近的“(”之间的运算符,逐个出栈,依次送入S2栈,此时抛弃“(”。
(5)重复上面的1~4步,直至处理完所有的输入字符(6)若取出的字符是“#”,则将S1栈内所有运算符(不包括“#”),逐个出栈,依次送入S2栈。
算符优先级:+ - | & ! ( )+ > < < < < < >- > > < < < < >| > > > < < < >& > > > > < < >! > > > > > < >( < < < < < < =) > > > > > E >异或介于了|与&之间程序清单:输入模式是标准的逻辑串而且格式要正确,变量不限个数,逻辑符号包括“&”(逻辑与/合取) 、“|”(逻辑或/析取)、“^”(即异或/○+)、“!”(逻辑非),如果输入不正确的格式会有错误提示。
构造任意合式公式的真值表(可编辑修改word版)

}
if(k==0)
{
int l=j-i-1;
char *p=new char[l+1]; string B;
for(int m=0;m<l-1;m++) p[m]=A[i+2+m];
p[l-1]='\0';
B=p;
delete p;
Temp.invalue(bds(B,N,&a[0])); i=i+j;
break;
}
}
}
else
{
int j=0; while(j<L)
{
if(A[i+1]==char(a[j].getname()))
{
i++;
Temp=a[j]; break;
}
j++;
}
}
return Temp.getvalue();
}
#endif
public:
Thesis(){value=2;name='A';}; friend Thesis operator !(Thesis &q)
{q.invalue(1-q.getvalue());returnq;}//重
载逻辑运算符
friend Thesis operator &(Thesis &p,Thesis &q)
}
}
}
}
}
return answer.getvalue();
}
int run(string A,int &i,int L,int N,Thesis a[])
{
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
else
for(i=0;i< len ;i++)//判断所有的括号是否配对,且将'('标记为1,将')'标记为2
{
if(str[0][i] == '(')
{
str[1][i]=1;
l++;
}
if(str[0][i] == ')')
else
break;
}
if(j==k)
{
Move(str,k,left);
}
if(right == strlen(str[0])-1)
return ;
else
IsFormula(str);
}
bool CheckFormula(char *str1)
|| ( isalpha(str[0][left+j]) && ( IsConnect(str[0][left+j-1]) || isalpha(str[0][left+j-1]) || str[0][left+j-1] =='(') && ( IsConnect(str[0][left+j+1]) || str[0][left+j+1] ==')')) //'A'的右边为连接符,或者'!',或者'(',右边为连接符或者右括号
//后缀式的计算
char num1,num2,sum;
len=strlen(str);
for(i=0;i<len;i++)
{
if( IsNum(str[iห้องสมุดไป่ตู้) )
{
push(&s,str[i]);
}
else
{
if(str[i]=='!')
{
if(s->top - s->base == s->stacksize)//如果 栈顶-栈低=栈长,则表明栈溢出,需要重新申请栈储存空间
{
printf("OverFlow\n");
exit(0);
}
*(s->top++) = c;//元素入栈,栈顶的指针+1
}
void pop(Stack *s,char *c)
*/
struct Stack
{
char *base;
char *top;
int stacksize;
};
struct Room//建立一个比较大的结构体,用于储存字母,和字母所对应的真值
{
char ch;
char value;
}value[10];
void Move(char (*str)[50],int pace,int left)//横向移动字符串
break;
}
return c+48;
}
char LogicNo(char ch)
{
int p=ch-48;
return !p+48;
}
bool IsNum(char ch)
{
if( ch >= '0' && ch <= '9')
return true;
{
push(&s,arr[i]);
continue;
}
if(arr[i]==')')
{
while( *(s.top -1 ) != '(' )
{
pop(&s,&e);
str[j++]=e;
}
pop(&s,&e);
{
if(s->base == s->top) //如果top==base,则表明栈空
return ;
*c = *(--s->top);//将顶元素储存如c,栈顶指针-1,并返回
}
int CalculateFormula(char *arr)
{
Stack s;//s操作符栈
int len,i,j;
for(j=1;j<=k;j++)
{
if( ( str[0][left+j] =='!' && (IsConnect(str[0][left+j-1]) || str[0][left+j-1] =='(' ) && isalpha(str[0][left+j+1]) ) //'!'的左边为连接符或者'(',右边一定为A
{
left=i;
}
if(str[1][i] == 2)
{
right=i;
break;
}
}
str[1][left]=0;//用完 right 和 left 之后将其标记为0
str[1][right]=0;
k=right-left;
|| ( IsConnect(str[0][left+j]) && isalpha(str[0][left+j-1]) && ( str[0][left+j+1] =='!' || isalpha(str[0][left+j+1])))) //连接符的左边为A,右边为非或者A
continue;
p=x-48;
q=y-48;
switch(ch)
{
case '&':
c=p&&q;
break;
case '|':
c=p||q;
break;
case '>':
c=!p||q;
break;
case '=':
c=(p && q)||(!p && !q);
return false;
}
int RuleOperation(char ch)
{
switch(ch)
{
case '#':
return -1;
case '(':
return 0;
case '=':
return 1;
case '>':
arr[len+1]='\0';
push(&s,'#');//先压入#,则栈顶的操作符优先级最小
for(i=0,j=0;i<=len;i++)
{
if(arr[i]=='!')
{
push(&s,arr[i]);
continue;
}
if(arr[i]=='(')
{
int top;
int x,m=0;
top=0;
else
return false;
}
bool IsOperation(char ch)
{
if( ch == '&' || ch == '|' || ch == '>' || ch == '=' )
return true;
else
return false;
}
void push(Stack *s,char c)//栈的压入
push(&s,sum);
}
}
}
pop(&s,&sum);
if(sum=='0')
{
printf("F\t");
}
else
{
printf("T\t");
}
printf("\n");
return 0;
}//计算合式公式
void Binary(int n,int k)//将合式公式的原子命题,化为二进制的相应值,n为输入的值,k为二进至的位数
char e;
char str[50];//后缀式的字符串
s.base=(char *)malloc(20*sizeof(char));//新建操作符栈
s.top=s.base;//空栈
s.stacksize=20;
len =strlen(arr);
arr[len]='#';
{
char str[2][50];//定义2行数组,str[0]存放字符串,str[1]做标记
int l=0,r=0;//l记录左括号的个数,r记录右括号的个数
int i;//辅助变量
int len=strlen(str[0]);
str[0][0]='(';//去空格,且在str[0]的外层加上括号,此时len>=2