全自动逻辑运算器C版

一个很牛逼的学长写的代码,贴在这边记录一下。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<ctype.h>

char CharStark[50];
char OpStark[50];
int  Char_cnt=0;
int  Op_cnt=0;
char Oplist[10];
int  Oplist_cnt=0;
int pCh;
int pOp;

char temps[10];

char Priority_List[8][8]={	
'>','<','>','>','<','>','<','>',
'>','>','>','>','<','>','<','>',
'<','<','>','>','<','>','<','>',
'<','<','<','>','<','>','<','>',
'<','<','<','<','<','=','<',0,
'>','>','>','>',0,'>','>','>',
'>','>','>','>','<','>','<','>',
'<','<','<','<','<',0,'<','='};
char TR_List[]={'|','&','~','@','(',')','!','='};


char Priority(char c,char top){
	int m,n,i;
	for(i=0;i<8;i++){
		if(top==TR_List[i]){
			m=i;
			break;
		}
	}
	for(i=0;i<8;i++){
		if(c==TR_List[i]){
			n=i;
			break;
		}
	}
	return Priority_List[m][n];
}

int isnewalpha(char ch){
	int i;
	for(i=0;i<Oplist_cnt;i++){
		if(ch==Oplist[i])
			return 0;
	}
	Oplist[Oplist_cnt++]=ch;
	return 1;
}

int SitSum(int temp){
	int i,sitnum=1;
	for(i=0;i<temp;i++){
		sitnum*=2;
	}
	return sitnum;
}

char Cal(char op,char a,char b){	
	switch(op){
		case '|':
			if('0'==a&&'0'==b)
				return '0';
			return '1';
		case '&':
			if('1'==a&&'1'==b)
				return '1';
			return '0';
		case '~':
			if('1'==a&&'0'==b)
				return '0';
			return '1';
		case '@':
			if(a==b)
				return '1';
			return '0';
		case '!':
			pCh++;
			if('0'==b)
				return '1';
			return '0';
	}
}

int Calculate(char c){
loop:switch(Priority(c,OpStark[pOp-1])){
		case '<':
			OpStark[pOp++]=c;
			break;
		case '=':
			pOp--;
			if(pOp==0)
				return 0;
			break;
		case '>':
			CharStark[pCh-2]=Cal(OpStark[pOp-1],CharStark[pCh-2],CharStark[pCh-1]);
			pCh--;
			pOp--;
			goto loop;
	}
	return 1;
}


void CopytoStark(int temp){
	
	int i=0;

	while(temp>1){
		temps[i++]=temp%2+48;
		temp/=2;
	}
	temps[i]=temp+48;
	while(i<Oplist_cnt){
		temps[++i]='0';
	}
	for(i=0;i<Oplist_cnt;i++){
		printf("%c ",temps[Oplist_cnt-i-1]);
	}
}

void Sort(){		
	int i,j;
	for(i=0;i<Oplist_cnt-1;i++){
		for(j=i+1;j<Oplist_cnt;j++){
			if(Oplist[i]>Oplist[j]){
				Oplist[i]+=Oplist[j];
				Oplist[j]=Oplist[i]-Oplist[j];
				Oplist[i]-=Oplist[j];
			}
		}
	}
}


int main(void){
	char string[100];
	int i=0,t=0;
	int sitsum;
	printf("鏋愬彇: |		鍚堝彇: &		绛変环: @		钑村惈: ~		闈? !\n");
	printf("___________________________________________________________________________\n");
	scanf("%s",string);
	while(i<strlen(string))
	{
		if(isalpha(string[i]))
		{
			isnewalpha(string[i]);
		}
		i++;
	}
	Sort();
	for(i=0;i<Oplist_cnt;i++){
		printf("%c ",Oplist[i]);
	}
	printf("          缁撴灉\n");
	sitsum=SitSum(Oplist_cnt);
	
	while(t<sitsum){
		int j;
		i=0;
		pOp=1;
		pCh=0;
		OpStark[0]='=';
		CopytoStark(t++);

		while(i<strlen(string)){
			if(isalpha(string[i]))
			{
				for(j=0;j<Oplist_cnt;j++){
					if(Oplist[j]==string[i])
						CharStark[pCh++]=temps[Oplist_cnt-j-1];
				}
			}
			else
			{
				if(Calculate(string[i])==0)break;
			}
			i++;
		}
		printf("          %c\n",CharStark[0]);
	}
	system("pause");
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值