用C语言求解合式公式的主合取范式和主析取范式

本文档展示了一个C语言程序,用于处理命题逻辑表达式,包括逆波兰表示法、二进制枚举和真值计算。程序实现了从输入的命题公式到后缀表达式的转换,并通过二进制枚举法找出所有可能的真值组合,进一步计算得到主析取范式和主合取范式。
摘要由CSDN通过智能技术生成

我最爱的冯老师在离散课上出了一个附加题。
为了能够加更多的学分也是出于自己的好奇,我决定尝试一下。
思路:二进制枚举+逆波兰表达式

#include<stdio.h>
#include<string.h>
#define T 1
#define F 0

struct Stack{
   
    int top;
    char arr[80];
}number={
   -1},symbol={
   -1};
//number储存后缀表达式结果
//symbol 操作符栈,用来保存操作符 

int book[26];//记录变元元素和个数 
//a对应下标为0
//b对应下标为1
//c对应下标为2
//以此类推 
int num=0;//记录变元的个数 
int alphabet_true_false[26];
/*
上面的book数组每个元素存放的是
该下标对应的字母是否存在

类似的这个alphabet_true_false存放的是
该下标对应的字母变元的真值(true or false) 
当然,只有book[i]不为零的情况下该数组才会奏效 
*/ 
int enum_result[80];
/*
如果二进制值为110110010
那么该数组从前往后数每个元素分别为:
1 1 0 1 1 0 0 1 0
说白了就是把十进制转为二进制01值并存到enum_result里罢了 
*/



char str_copy[80];//输入的字符串的副本 

void count_num(char str[]){
   //记录变元的个数,用全局变量num储存 
	int i,len=strlen(str);
	for(i=0;i<len;i++){
   
        if(str[i]>='a'&&str[i]<='z'){
   
            if(book[str[i]-'a']==0){
    
				book[str[i]-'a']=1;    
				++num; 
			} 
    	}      
    }
}
 
void scan_string(char str[]){
   
	//输入小写字符
	//例如!(p|q)>(q&!r|(r>p)) 
	int i;
    gets(str);
    strcpy(str_copy,str);
    
    count_num(str);//记录变元的个数,用全局变量num储存 
    int len=strlen(str);
    for(i=0;i<len;i++){
   
    	//对操作符进行优先级处理
		//把字符数组的操作符改为计算机可判断优先级的特别字符 
        switch(str[i]){
   
            case '!':str[i]=')'+5;break;
            case '&':str[i]=')'+4;break;
            case '|':str[i]=')'+3;break;
            case '>':str[i]=')'+2;break;
            case '=':str[i]=')'+1;break;
        }        
    }
}

<
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值