用C或C++编写程序,要求: 输入命题公式,给出它的主合取范式和主析取范式。

用C或C++编写程序,要求: 输入命题公式,给出它的主合取范式和主析取范式。,第1张

A-Z + is OR * is AND _ is → # is⊕(圆圈里加个+) @ is ⊙

$ is ↑ 命题的"与非" 运算( "与非门" )

% is ↓ 命题的"或非"运算( "或非门" )

Input the source formula:

A*!S+R

Here!

8countTerms

NORMALc: (A*!S*!R)+(!A*!S*R)+(A*!S*R)+(!A*S*R)+(A*S*R)

NORMALd (A+S+R)*(A+!S+R)*(!A+!S+R)

!A+S*!R

Input the source formula:

(!A+B)_R

Here!

8countTerms

NORMALc: (!A*!B*!R)+(A*!B*!R)+(!A*B*!R)+(A*B*!R)+(!A*!B*R)+(!A*B*R)+(A*B*R)

NORMALd (!A+B+!R)

Error!

Input the source formula:

A#B

Here!

4countTerms

NORMALc: (A*!B)+(!A*B)

NORMALd (A+B)*(!A+!B)

Error!

Input the source formula:

A@B

Here!

4countTerms

NORMALc: (!A*!B)+(A*B)

NORMALd (!A+B)*(A+!B)

Error!

#include <string>

#include <stack>

#include <vector>

#include<iostream>

using namespace std

class formulaBase

{

private:

int numVar//The number of the variables in the formula

bool variables[100]//To store the value of the variables

string sourceFormula

string normalCFormula

string normalDFormula

string dualFormula

vector<char>vctofVar

vector<char>vctofPoland

stack<char>stk

bool isVar(char ch)const

void addMin(int minterm)

void addMax(int maxterm)

bool compute(int minterm)

void getInversePoland()

int countTerms(int n)

void assign(int minterm)

stack<bool>boolStk

public:

formulaBase()

formulaBase(const formulaBase&rhs)

~formulaBase()

void getSource()

string generateNormalC()

string generateNormalD()

string getDual()

void printSource()const{cout<<sourceFormula<<endl}

void printDNormal()const{cout<<normalDFormula<<endl}

void printCNormal()const{cout<<normalCFormula<<endl}

void printDual()const{cout<<dualFormula<<endl}

//void printTruthTable()

}

formulaBase::formulaBase()

{

for(int i=0i<100i++)variables[i]=false

numVar=0

}

formulaBase::formulaBase(const formulaBase&rhs)

{

sourceFormula=rhs.sourceFormula

for(int i=0i<100i++)variables[i]=false

numVar=0

}

formulaBase::~formulaBase()

{

while(!stk.empty())stk.pop()

vctofVar.clear()

vctofPoland.clear()

}

int formulaBase::countTerms(int n)

{

if(n==0)

{

cout<<"invalid input!"<<endl

exit(0)

}

switch(n)

{

case 1:return 2

case 2:return 4

default:

{

int tempA=2,tempB=2

for(int i=2i<=ni*=2)tempA*=tempA

i/=2

if(i==n)return tempA

i=n-i

for(int j=2j<=ij*=2)tempB*=tempB

for(j/=2j<ij++)tempB*=2

tempB*=tempA

return tempB

}

}

}

bool formulaBase::isVar(char ch)const

{

if (ch>='A'&&ch<='Z')

return true

return false

}

void formulaBase::getSource()

{

cout<<"Input the source formula:"<<endl

cin>>sourceFormula

/*if(!isValid(sourceFormula))

cout<<"Invalid input !"

"Operate again:"<<endl

cin>>sourceFormula*/

}

void formulaBase::getInversePoland()

{

char temp,temp1

for(int i=0sourceFormula[i]!='\0'i++)

{

temp=sourceFormula[i]

if(isVar(temp))

{

if(!variables[temp])

{

numVar++

vctofVar.push_back(temp)

variables[temp]=true

}

vctofPoland.push_back(temp)

}

else

switch(temp)

{

case'_':case'$': //

case'%':case'#':

case'@':

while(!stk.empty())

{

if(stk.top()==temp)

{

vctofPoland.push_back(temp)

stk.pop()

}

else break

}

stk.push(temp)

break

case '(':case '!':

stk.push(temp)

break

case '+':

while (!stk.empty())

{

if(stk.top()!='(')

{

temp1=stk.top()

vctofPoland.push_back(temp1)

stk.pop()

}

else break

}

stk.push(temp)

break

case '*':

while (!stk.empty())

{

temp1=stk.top()

if(stk.top()=='*'||stk.top()=='!')

{

vctofPoland.push_back(temp1)

stk.pop()

}

else

break

}

stk.push(temp)

break

case ')':

while (!stk.empty())

{

if(stk.top()!='(')

{

temp1=stk.top()

vctofPoland.push_back(temp1)

stk.pop()

}

else break

}

if(stk.empty())exit(0)

stk.pop()//pop the operator '('

break

}

}

while(!stk.empty())

{

temp1=stk.top()

vctofPoland.push_back(temp1)

stk.pop()

}

}

void formulaBase::assign(int minterm)

{

int temp=minterm

vector<char>::const_iterator itr=vctofVar.begin()

for(itr!=vctofVar.end()itr++)

{

variables[*itr]=bool(temp&1)

temp=temp>>1

}

}

bool formulaBase::compute(int minterm)

{

assign(minterm)

char temp

bool valueA,valueB

vector<char>::const_iterator itr=vctofPoland.begin()

while (itr!=vctofPoland.end())

{

temp=*itr

if(isVar(temp))boolStk.push(variables[temp])

else

switch(temp)

{

case '+':

{

if(boolStk.size()<2)exit(0)

valueA=boolStk.top()

boolStk.pop()

valueB=boolStk.top()

boolStk.pop()

valueA=valueA||valueB

boolStk.push(valueA)

}

break

case '*':

{

if(boolStk.size()<2)exit(0)

valueA=boolStk.top()

boolStk.pop()

valueB=boolStk.top()

boolStk.pop()

valueA=valueA&&valueB

boolStk.push(valueA)

}

break

case '!':

{

if(boolStk.empty())exit(0)

valueA=!(boolStk.top())

boolStk.pop()

boolStk.push(valueA)

}

break

case'_':

{

if(boolStk.size()<2)exit(0)

valueA=boolStk.top()

boolStk.pop()

valueB=boolStk.top()

boolStk.pop()

valueA=(!valueA)||valueB

boolStk.push(valueA)

}

break

case'$':

{

if(boolStk.size()<2)exit(0)

valueA=boolStk.top()

boolStk.pop()

valueB=boolStk.top()

boolStk.pop()

valueA=!(valueA&&valueB)

boolStk.push(valueA)

}

break

case'%':

{

if(boolStk.size()<2)exit(0)

valueA=boolStk.top()

boolStk.pop()

valueB=boolStk.top()

boolStk.pop()

valueA=!(valueA||valueB)

boolStk.push(valueA)

}

break

case'#':

{

if(boolStk.size()<2)exit(0)

valueA=boolStk.top()

boolStk.pop()

valueB=boolStk.top()

boolStk.pop()

valueA=(!valueA&&valueB)||(valueA&&!valueB)

boolStk.push(valueA)

}

break

case'@':

{

if(boolStk.size()<2)exit(0)

valueA=boolStk.top()

boolStk.pop()

valueB=boolStk.top()

boolStk.pop()

valueA=(valueA&&valueB)||(!valueA&&!valueB)

boolStk.push(valueA)

}

break

}

itr++

}

if(boolStk.size()!=1)

{

cout<<"Error in computing the value of minterm"<<endl

exit(0)

}

valueA=boolStk.top()

boolStk.pop()

return valueA

}

void formulaBase::addMin(int minterm)

{

int temp=minterm

vector<char>::const_iterator itr=vctofVar.begin()

normalCFormula+='('

while (itr!=vctofVar.end())

{

if(!variables[*itr])

normalCFormula+='!'

normalCFormula+=*itr

normalCFormula+='*'

itr++

}

normalCFormula+="\b)+"

}

void formulaBase::addMax(int maxterm)

{

int temp=maxterm

vector<char>::const_iterator itr=vctofVar.begin()

normalDFormula+='('

while (itr!=vctofVar.end())

{

if( variables[*itr])

normalDFormula+='!'

normalDFormula+=*itr

normalDFormula+='+'

itr++

}

normalDFormula+="\b)*"

}

string formulaBase::generateNormalC()

{

if(vctofPoland.size()==0)//This oeration has not been done yet!

getInversePoland()

cout<<"Here!"<<endl

int n=countTerms(numVar)

cout<<n<<"countTerms"<<endl

normalCFormula=' '

for(int i=0i<ni++)

{

if(compute(i))addMin(i)

}

normalCFormula+="\b "

return normalCFormula

}

string formulaBase::generateNormalD()

{

if(vctofPoland.size()==0)//This operation has not been done yet!!

getInversePoland()

int n=countTerms(numVar)

normalDFormula=' '

for(int i=0i<ni++)

{

if(!compute(i))addMax(i)

}

normalDFormula+="\b "

return normalDFormula

}

string formulaBase::getDual()

{

int i=0

char temp

dualFormula=' '

while ((temp=sourceFormula[i])!='\0')

{

switch(temp)

{

case '!':

{

i++

dualFormula+=sourceFormula[i]

break

}

case '+':dualFormula+='*'break

case '*':dualFormula+='+'break

case'(':case ')':dualFormula+=sourceFormula[i]

break

default:

if (isVar(temp))

{

dualFormula+='!'

dualFormula+=temp

}

else

{

cout<<"Error!"<<endl

exit(0)

}

}

i++

}

return dualFormula

}

/*void formulaBase::printTruthTable()//A const function is unable to call a nonconst function!!!

{

int i=0

int count=countTerms(numVar)

cout<<" TRUTH TABLE \n"

for( i=0i<=numVari++)cout<<"___"

cout<<endl

//for( i=0i<numVari++)cout<<'|'<<vctofVar[i]

//cout<<"|F|" <<endl

for( i=0i<=numVari++)cout<<"___"

cout<<endl

for(i=0i<counti++ )

{

int temp=i

for(int j=0j<numVarj++)

{

if(bool(temp&1))cout<<"|1"

else cout<<"|0"

temp=temp>>1

}

if(this->compute(i))cout<<"|1"

else cout<<"|0"

cout<<'|'<<endl

for( int k=0k<=numVark++)cout<<"___"

cout<<endl

}

}

*/

int main()

{

string str

formulaBase f

f.getSource()

str=f.generateNormalC()

cout<<"NORMALc:"<<str<<endl

str=f.generateNormalD()

cout<<"NORMALd"<<str<<endl

// cout<<"Coming here"<<endl

//f.printTruthTable()

str=f.getDual()

f.printDual()

return 0

}

Proteus用起来十分方便,其对中国学生最大的障碍就是很多朋友不知道自己想要寻找的器件用英文怎么说,从而无法在Proteus中快速找到自己需要的器件。下面,我们就简单先来了解一下Proteus中器件的种类。

Proteus中常用的元器件被分成了25大类,为了方便快速地查找到相应器件,在Pick Devices(拾取元器件)对话框中,你应该首先选中相应的大类,然后使用关键词进行搜寻。

Proteus有25大类元器件分别为:

Analog ICs 模拟IC

CMOS 4000 series CMOS 4000系列

Data Converters 数据转换器

Diodes 二极管

Electromechanical机电设备(只有电机模型)

Inductors 电感

Laplace PrimitivesLaplace变换器

Memory ICs 存储器IC

Microprocessor ICs 微处理器IC

Miscellaneous杂类(只有电灯和光敏电阻组成的设备)

Modelling Primitives 模型基元

Operational Amplifiers 运算放大器

Optoelectronics 光电子器件

Resistors 电阻

Simulator Primitives 仿真基元

Switches &Relays 开关和继电器

Transistors 三极管

TTL 74、74ALS、74AS、74F、74HC、74HCT、74LS、74S series 74系列集成电路

除此之外,你还应熟悉常用器件的英文名称,ANY电子为您列举如下:

AND与门

ANTENNA天线

BATTERY 直流电源(电池)

BELL 铃,钟

BRIDEG 1 整流桥(二极管)

BRIDEG 2 整流桥(集成块)

BUFFER 缓冲器

BUZZER 蜂鸣器

CAP 电容

CAPACITOR电容

CAPACITOR POL 有极性电容

CAPVAR 可调电容

CIRCUIT BREAKER 熔断丝

COAX 同轴电缆

CON插口

CRYSTAL 晶振

DB 并行插口

DIODE 二极管

DIODE SCHOTTKY 稳压二极管

DIODE VARACTOR变容二极管

DPY_3-SEG 3段LED

DPY_7-SEG 7段LED

DPY_7-SEG_DP 7段LED(带小数点)

ELECTRO 电解电容

FUSE 熔断器

INDUCTOR 电感

INDUCTOR IRON 带铁芯电感

INDUCTOR3 可调电感

JFET N N沟道场效应管

JFET P P沟道场效应管

LAMP灯泡

LAMP NEDN 起辉器

LED 发光二极管

METER仪表

MICROPHONE 麦克风

MOSFET MOS管

MOTOR AC交流电机

MOTOR SERVO 伺服电机

NAND 与非门

NOR 或非门

NOT 非门

NPN NPN三极管

NPN-PHOTO感光三极管

OPAMP 运放

OR或门

PHOTO 感光二极管

PNP PNP三极管

NPN DAR NPN三极管

PNP DAR PNP三极管

POT 滑线变阻器

PELAY-DPDT双刀双掷继电器

RES1.2 电阻

RES3.4可变电阻

BRIDGE 桥式电阻

RESPACK 电阻排

SCR 晶闸管

PLUG 插头

PLUG AC FEMALE 三相交流插头

SOCKET 插座

SOURCE CURRENT电流源

SOURCE VOLTAGE 电压源

SPEAKER扬声器

SW 开关

SW-DPDY 双刀双掷开关

SW-SPST 单刀单掷开关

SW-PB 按钮

THERMISTOR 电热调节器

TRANS1 变压器

TRANS2 可调变压器

TRIAC三端双向可控硅

TRIODE 三极真空管

VARISTOR 变阻器

ZENER 齐纳二极管

当然了,熟记上面的内容并不能保证你能熟练找到需要的器件,和很多事情一样,在Proteus中查找需要的器件也需要经验积累。

比如,搜寻数码管,通常直接使用7seg进行搜索即可。

原理图常用库文件:

Miscellaneous Devices.ddb

Dallas Microprocessor.ddb

Intel Databooks.ddb

Protel DOS Schematic Libraries.ddb

PCB元件常用库:

Advpcb.ddb

General IC.ddb

Miscellaneous.ddb

分立元件库

部分 分立元件库元件名称及中英对照

AND 与门

ANTENNA 天线

BATTERY 直流电源

BELL 铃,钟

BVC 同轴电缆接插件

BRIDEG 1 整流桥(二极管)

BRIDEG 2 整流桥(集成块)

BUFFER 缓冲器

BUZZER 蜂鸣器

CAP 电容

CAPACITOR 电容

CAPACITOR POL 有极性电容

CAPVAR 可调电容

CIRCUIT BREAKER 熔断丝

COAX 同轴电缆

CON 插口

CRYSTAL 晶体整荡器

DB 并行插口

DIODE 二极管

DIODE SCHOTTKY 稳压二极管

DIODE VARACTOR 变容二极管

DPY_3-SEG 3段LED

DPY_7-SEG 7段LED

DPY_7-SEG_DP 7段LED(带小数点)

ELECTRO 电解电容

FUSE 熔断器

INDUCTOR 电感

INDUCTOR IRON 带铁芯电感

INDUCTOR3 可调电感

JFET N N沟道场效应管

JFET P P沟道场效应管

LAMP 灯泡

LAMP NEDN 起辉器

LED 发光二极管

METER 仪表

MICROPHONE 麦克风

MOSFET MOS管

MOTOR AC 交流电机

MOTOR SERVO 伺服电机

NAND 与非门

NOR 或非门

NOT 非门

NPN NPN三极管

NPN-PHOTO 感光三极管

OPAMP 运放

OR 或门

PHOTO 感光二极管

PNP 三极管

NPN DAR NPN三极管

PNP DAR PNP三极管

POT 滑线变阻器

PELAY-DPDT 双刀双掷继电器

RES1.2 电阻

RES3.4 可变电阻

RESISTOR BRIDGE ? 桥式电阻

RESPACK ? 电阻

SCR 晶闸管

PLUG ? 插头

PLUG AC FEMALE 三相交流插头

SOCKET ? 插座

SOURCE CURRENT 电流源

SOURCE VOLTAGE 电压源

SPEAKER 扬声器

SW ? 开关

SW-DPDY ? 双刀双掷开关

SW-SPST ? 单刀单掷开关

SW-PB 按钮

THERMISTOR 电热调节器

TRANS1 变压器

TRANS2 可调变压器

TRIAC ? 三端双向可控硅

TRIODE ? 三极真空管

VARISTOR 变阻器

ZENER ? 齐纳二极管

DPY_7-SEG_DP 数码管

SW-PB 开关

其他元件库

Protel Dos Schematic 4000 Cmos .Lib

40.系列CMOS管集成块元件库

4013 D 触发器

4027 JK 触发器

Protel Dos Schematic Analog Digital.Lib 模拟数字式集成块元件库

AD系列 DAC系列 HD系列 MC系列

Protel Dos Schematic Comparator.Lib 比较放大器元件库

Protel Dos Shcematic Intel.Lib INTEL公司生产的80系列CPU集成块元件库

Protel Dos Schematic Linear.lib 线性元件库

例555

Protel Dos Schemattic Memory Devices.Lib 内存存储器元件库

Protel Dos Schematic SYnertek.Lib SY系列集成块元件库

Protes Dos Schematic Motorlla.Lib 摩托罗拉公司生产的元件库

Protes Dos Schematic NEC.lib NEC公司生产的集成块元件库

Protes Dos Schematic Operationel Amplifers.lib 运算放大器元件库

Protes Dos Schematic TTL.Lib 晶体管集成块元件库 74系列

Protel Dos Schematic Voltage Regulator.lib 电压调整集成块元件库

Protes Dos Schematic Zilog.Lib 齐格格公司生产的Z80系列CPU集成块元件库

元件属性对话框中英文对照

Lib ref 元件名称

Footprint 器件封装

Designator 元件称号

Part 器件类别或标示值

Schematic Tools 主工具栏

Writing Tools 连线工具栏

Drawing Tools 绘图工具栏

Power Objects 电源工具栏

Digital Objects 数字器件工具栏

Simulation Sources 模拟信号源工具栏

PLD Toolbars 映象工具栏

找到你所需要的电子器件后,将器件拖入编辑页面中。右击菜单里面有一个pdf格式的显示部件资料的标签。点击即可查看所用部件的信息。

当然也可以直接在datasheet里面查看。

这个是 4输入或非门(带选通端) 属于逻辑运算 芯片 不属于单片机 是74系列 型号为7425(74hc25 74ls25等) 一个7425里有2个4输入或非门

4输入或非门是指 只有当4个输入A和B为低电平(逻辑0)时输出为高电平(逻辑1)否则为0, 看图中意思应该是 k1-k4是四个中断源,一般情况为低电平,当产生中断时变为高电平,4个都无中断产生时,都为0 int1为1 当任何一个产生中断时变为1,int1由原来的1变为0产生一个下降沿中断给单片机起到中断的作用

你想扩展的用8输入或非门(不知道有没有)就行了 也可以用两个4输入或非门的输出与后给单片机的一个外部中断口 或两个4输入或非门的输出分别给单片机两个外部中断口

其实我认为8个中断的一般是很少用到的 你可以详细说明要求 不一定非要用中断完成的

如果是按键 在程序不大的情况下直接定时器中断扫描反而更方便


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11857558.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-19
下一篇 2023-05-19

发表评论

登录后才能评论

评论列表(0条)

保存