卡诺图编号怎么记

卡诺图编号怎么记,第1张

处于横座标的变量(图中的A、B)的值作为高位,处于纵座标的变量(图中的C、D)的值作为低位,构成二进制数,这个二进制数所对应的十进制数就是该位置的编号。

如果我们需要输入一个如下图所示的卡诺图(其中空的位置都是0,X表示不关心的值): 那我们首先应该输入4(卡诺图变量的个数),然后在下一行输入0 1 3 4 11 -1(其中-1表示这一行输入结束,0 1 3 4 11是值为1的位置编号),然后再另起一行,输入5 -1(5是X的位置编号,-1代表输入结束)。这样,用户的输入就完成了。

然后程序将用户输入的位置转化为二进制(因为有四个变量,所以转化为四位二进制

、数码制. 2

1、2进制、8进制、10进制、16进制转换. 2

2、原码、反码、补码. 2

3、二维码(8421码)、xrpddc、格雷码…2

二、逻辑代数. 2

1 .基本运算:和非. 2

2 .基本定理:赋值、反演、对偶. 2

3 .简化方法:真值表、公式法、卡诺乔法. 2

4 .官方法. 2

4.1交换律、结合律的分配率. 2

4.2德摩根律(反转律) . 2

4.3简化公式. 2

4.4对偶式. 3

4.5简易法公式化的步骤. 3

5 .卡诺乔化简法. 3

6 .最小项和最大项. 4

三.门电路和组合逻辑电路. 4

1 )基本闸门)门或门、门以外. 4

2 .其他门电路: 4

3 .逻辑电路的分析方法. 4

4 .逻辑电路的设计方法. 5

5 .编码器74HC138. 7

6 .数据选择器. 8

6.1四选74HC153. 8

6.2八选一74HC151. 8

四.时序逻辑电路. 9

1 .触发器. 9

2 .计数器74HC161 (十六进制)、74hc 161 (BCD码)、 10

一.数码制

1、2进制、8进制、10进制、16进制转换

2、原码、反码、补码

原代码:数字转换为二进制数的状态下,符号位为1表示负,0表示正

反符号:负号的位数不变,剩下的数字逐位取反(1变为0,0变为1 ) )。

补数:负数的反码加1

*正数的原码、反码、补码不变化,负数按照上述规则变化

3、二维码(8421码)、xrpddc、格雷码(环路) )。

821码:顾名思义,4位一组,按照权重从高到低的顺序8421

xrpddc :原本四个二进制数可以表示十六个数字。 8421码使用了前10个。 xrpddc使用了中间的10个。 (前面三个,后面三个不用) )。

格雷码:相邻的两个数只相差一位数的循环码,画马尾鱼需要这个码制

*名称中带数字的一般为加权代码(8421代码、5421代码、5211代码等权重固定代码),不带数字的为非加权代码

二.逻辑代数

1 .基本运算:和非

2 .基本定理:赋值、反演、对偶

3 .简化方法:真值表、公式法、kanojo法

4 .官方法

4.1交换律、结合律的分配率与代数化简单方法相似

4.2德摩根律(反转律) )。

(ab ) )=a ) b )

(A B ) )=a ) b )

4.3简化公式:

A AB=A

a’b=ab

abab’=a

a(ab )=A

ABA’CBC=ABA’c

ABA’cbcd=ABA’c

a(ab )=ab )

a’(ab’)=a’

4.4对偶式(将式y的0表示为1,1表示为0,),),将保持变量不变而得到的式表示为YD。 YD被称为y的对偶式。

*对偶定理:如果两个逻辑表达式相等,他们的对偶表达式也相等

4.5简易法公式化的步骤:

第一步:分解所有表达式

步骤2 :消除冗馀

5 .卡诺乔化简法

第一步:把y变成最小项的和的形式

步骤2 :注意变量的编号为00、01、10、11,绘制卡诺图

第3步(用圆圈包围卡诺图。 一个圆只能画2n个格子。 与角对应的可以用圆包围。

第四步:根据圈出的卡诺图写简化的表达式

y=ab’c’da CDA’BD

*有无关项的卡诺图可以用d、、等符号表示,这些无关项可以是圆也可以是圆

6 .最小项和最大项

最小项: kanojo中只占一格,相邻的最小项可以合并,用m表示

最大项:用m表示,表示除了与最小项互补、是卡诺图的小格以外的一个区域

关系: mi=mi’,mi=mi’

*对于由最小项组成的函数Y=m1 m3 m5 m7,其反函数最大可表示y’=(m1 m3 M5 M7 )=m1’m3’M5’M7’=m1’m3’M5’M7’

三.门电路和组合逻辑电路

1 )基本闸门)门或门、非门)新版符号表示) )。

与门:

d形符号

或门:

月牙形符号

门以外:

用o表示谴责

2 .其他门电路:

/p>

异或门:

因为不是或门,所以在月牙形的前面加了一条弧线

A,B输入不同的时候Y=1,异或符号⊕

3.逻辑电路分析方法

第一步:在电路图上每个元件输出的地方写出元件输出的表达式

第二步:写出最终输出Y的逻辑表达式

第三步:化简表达式

4.逻辑电路设计方法

1、首先指明逻辑符号取“1”、“0”的含义。

2、根据题意列出真值表

3、画出卡诺图

4、根据要求画出逻辑电路图

*逻辑电路图绘制的简易方法(适用于题目没有要求电路类型的情况)

例题:设计一个三连开关电路

1、声明变量意义:

设三个开关ABC,灯Z。

ABC取1表示开关闭合,取0表示开关断开

Z取1表示灯亮,0表示灯灭。

2、列出真值表:

3、画出卡诺图:

4、得到表达式(已最简):

Z=A’B’C+A’BC’+AB’C’+ABC

5、观察表达式,需要三个输入(A、B、C)一个输出(Z)、5个元件(每项一个元件,整体也要一个元件)

把元件标在纸上:

6、依次把表达式中的项标到元件上(在元件右侧标上0与1以及对应的项,第一项A’B’C就是在第一个元件左边标注〇〇一右边标注A’B’C)

7、根据记号依次给元件依次连线,完成逻辑电路图

5.编码器 74HC138

例题:用编码器设计一个三连开关电路

1、声明变量意义:

设三个开关ABC,灯Z。

ABC取1表示开关闭合,取0表示开关断开

Z取1表示灯亮,0表示灯灭。

2、列出真值表:

3、得到最小项之和的表达式:

Z=m1+m2+m4+m7

4、转换表达式

Z=m1+m2+m4+m7

=((m1+m2+m4+m7)’)’

=(m1’m2’m4’m7’)’

=(Y1’Y2’Y4’Y7’)’

5、根据表达式画图

6.数据选择器

6.1四选一 74HC153

例题:用四选一数据选择器设计一个红绿灯故障诊断电路

1、声明变量意义:

用ABC分别标识红灯黄灯绿灯三盏灯,1为亮,0为灭,Y为表示诊断结果,1为故障,0为无故障

2、列出真值表:

3、得到表达式:

设A为A1,B为A0

得D1=D2=1,D3=1,D0=0

4、根据表达式画图

6.2八选一 74HC151

例题:用八选一数据选择器设计一个四人表决器

1、声明变量意义:

用ABCD代表四个人,Y代表表决结果。1为同意,0为不同意

2、列出真值表:

3、得到表达式:

设A为A2,B为A1,C为A0

得D3=D5=D6=1,D7=1,D0=D1=D2=D4=0

4、根据表达式画图

四、时序逻辑电路

1.触发器与锁存器

SR锁存器:S置1,R清0,同时按无效,结果不可预测

JK触发器:Q’*=JQ’+K’Q01、10看J,00维持原态,11翻转

T触发器:T=1时翻转

D触发器:D=0置0,D=1置1

*带有CLK的触发器只有在时钟信号上升沿发挥作用

CLK’的触发器在时钟信号下降沿发挥作用

2.计数器 74HC161(十六进制)、74HC160(BCD码)

例题1:用74CH161同步置数端设计十进制计数器

计数器从0000开始计数,则D3D2D1D0=0000

S10-1=S9=1001 LD’=(Q3Q0)’

例题2:用74CH161异步清零端设计十进制计数器

S10=1010 RD’=(Q3Q1)’

例题3:用74CH161同步置数端设计三十六进制计数器

计数器从00000000开始计数,则D23D22D21D20D13D12D11D10=00000000

S36-1=S35=00100011 LD’=(Q21Q11Q10)’

例题4:用74CH161异步清零端设计三十六进制计数器

S36=00100100 LD’=(Q21Q12)’

例题5:用74CH160同步置数端设计三十六进制计数器

计数器从00000000开始计数,则D23D22D21D20D13D12D11D10=00000000

S36-1=S35=00110101 LD’=(Q21Q20Q12Q10)’

*注74CH160用的是BCD码

例题6:用74CH160异步清零端设计三十六进制计数器

S36=00110110 LD’=( Q21Q20Q12Q11)’

*注74CH160用的是BCD码

168飞艇6种不亏钱的方法p>

4、转换表达式

Z=m1+m2+m4+m7

=((m1+m2+m4+m7)’)’

以前做的。

一、 需求分析

1. 本程序是是利用平衡二叉树实现一个动态查找表,实现动态查找表的三种基本功能:查找、插入和删除。

2. 初始,平衡二叉树为空树,可以按先序输入平衡二叉树,以输入0结束,中间以回车隔开,创建好二叉树后,可以对其查找,再对其插入,输入0结束插入,再可以对其删除,输入0结束,每次插入或删除一个结点后,更新平衡二叉树的显示。

3. 本程序以用户和计算机的对话方式执行,根据计算机终端显示:“提示信息”下,用户可由键盘输入要执行的 *** 作。

4. 测试数据(附后)

二、 概要设计

1. 抽象数据类型动态查找表的定义如下:

ADT DynamicSearchTable{

数据结构D:D是具有相同特性的数据元素的集合。各个数据元素含有类型相同,可惟一标识数据元素的关键字。

数据关系R:数据元素同属一个集合。

基本 *** 作P:

InitDSTable(&DT)

*** 作结果:构造一个空的动态查找表DT。

DestroyDSTable(&DT)

初试条件:动态查找表DT存在。

*** 作结果: 销毁动态查找表DT。

SearchDSTable(DT,key)

初试条件:动态查找表DT存在,key为和关键字类型相同的给定值。

*** 作结果: 若DT中存在其关键字等于key的数据元素,则函数值为该元素的值或表中的位置,否则为“空”。

InsertDSTable(&DT,e)

初试条件:动态查找表DT存在,e为待插入的数据元素。

*** 作结果: 若DT中不存在其关键字等于e. key的数据元素,则插入e到DT。

DeleteDSTable(&DT,key)

初试条件:动态查找表DT存在,key为和关键字类型相同的给定值。

*** 作结果: 若DT中存在其关键字等于key的数据元素,则删除之。

TraverseDSTable(DT,Visit())

初试条件:动态查找表DT存在,Visit()是结点 *** 作的应用函数。

*** 作结果: 按某种次序对DT的每个结点调用函数Visit()一次且至多

一次。一但Visit()失败,则 *** 作失败。

}ADT DynamicSearchTable

2. 本程序包含两个模块:

Void main(){

Do{

接受命令(根据提示输入终点城市和起点城市的序号);

处理命令;

}while(“命令”=“退出”);

}

3.本程序只有两个模块,调用关系简单

主程序模块

平衡二叉树的模块

三、 详细设计

1. 根据题目要求和查找的基本特点,其结点类型

typedef struct BSTnode{

int data

int bf

struct BSTnode *lchild,*rchild

}BSTnode,*bstree

#define LH +1

#define EH 0

#define RH -1

/-----------------------------************对平衡二叉树的 *** 作

bstree InsertAVL(bstree &T, int e);

////////在平衡二叉树中插入结点。

int FindAVL(bstree p,int e);

////////查找平衡二叉树中是否有结点e。

bstree DeleteAVL(bstree &T,int e)

////////删除平衡平衡二叉树的结点e,并保持平衡二叉树的性质。

int Preordertraverse(bstree T)

////////按先序遍历平衡二叉树。

/------------------------************平衡二叉树的 *** 作的详细算法

bstree InsertAVL(bstree &T, int e)

{

bstree p

//插入新结点,树长高置taller为TRUE

if(!T) {

T=(bstree)malloc(sizeof(BSTnode))

T->data=e

T->lchild=T->rchild=NULL

T->bf=EH

taller=TRUE

}

else {

//树中存在和e有相同关键字的结点则不再插入

if(e==T->data){

taller=FALSE

return NULL

}

//值小于则继续在树的左子树中搜索

if(e <T->data){

//插入到左子树且左子树长高

p=InsertAVL(T->lchild,e)

if(p){

T->lchild=p

if(taller) {

switch(T->bf){//检查*T的平衡度

case LH://原本左子树比右子树高,需要做左平衡处理

T=LeftBalance(T)

taller=FALSE

break

case EH://原本左子树和右子树同高,现因左子树争高而使树增高

T->bf=LH

taller=TRUE

break

case RH://原本右子树比左子树高,现在左右子树等高

T->bf=EH

taller=FALSE

break

}///////switch(T->bf)

}///////if(taller)

}/////if(p)

}///////if(e <T->data)

//继续在*T的右子树中搜索

else{

//插入到右子树且使右子树长高

p=InsertAVL(T->rchild,e)

if (p){

T->rchild=p

if(taller) {

switch(T->bf){//检查*T的平衡度

case LH://原本左子树比右子树高,现在左右子树等高

T->bf=EH

taller=FALSE

break

case EH://原本左子树和右子树同高,现因右子树增高而使树增高

T->bf=RH

taller=TRUE

break

case RH://原本右子树比左子树高,需要做右平衡处理

T=RightBalance(T)

taller=FALSE

break

}//////switch(T->bf)

}/////if(taller)

}/////if (p)

}//////if(e >T->data)

}///////else

return T

}

int Preordertraverse(bstree T){

if(T){

printf(" %d %d\n",T->data,T->bf)

Preordertraverse(T->lchild)

Preordertraverse(T->rchild)

}

return 1

}

int FindAVL(bstree p,int e){

if(p==NULL)return NULL

else if(e==p->data) return true

else if(e<p->data){

p=p->lchild

return FindAVL(p, e)

}////左子树上查找

else {

p=p->rchild

return FindAVL( p, e)

}////右子树上查找

}

bstree DeleteAVL(bstree &T,int e){

//删除后要保证该二叉树还是平衡的

int n,m=0/////标记

bstree q

if(!T)return NULL

else {

if(e==T->data) {////直接删除

n=Delete(T,e)

m=n

if(m!=0) {

q=T

DeleteAVL(T,m)

q->data=m}

}

else {

if(e<T->data){////在左子树上寻找

DeleteAVL(T->lchild,e)

if(shorter){

switch(T->bf){

case LH:T->bf=EHshorter=truebreak

case EH:T->bf=RHshorter=falsebreak

case RH:Delete_Rightbalance(T)shorter=truebreak

}////switch(T->bf)

}/////if(shorter)

}/////if(e<T->data)

else{ /////////在右子树上寻找

DeleteAVL(T->rchild,e)

if(shorter)

switch(T->bf){

case LH:Delete_Leftbalance(T)shorter=truebreak

case EH:T->bf=LHshorter=falsebreak

case RH:T->bf=EHshorter=truebreak

}////////switch(T->bf)

}////////在右子数上寻找完

}////////在左右子上完

}///////////删除完

return T

}

2. 主程序和其他伪码算法

void main(){

while(e!=0){

if(e!=0) InsertAVL(T,e)

}

while(d!=0){

if(d!=0) InsertAVL(T,d)

Preordertraverse(T)

}

c=FindAVL(T,t)

if(c==1)printf("有要查找的节点\n")

else printf("无要查找的节点\n")

do{

DeleteAVL(T,b)

Preordertraverse(T)

}while(b==1)

}

///右旋

bstree R_Rotate(bstree &p){

bstree lc

lc=p->lchild

p->lchild=lc->rchild

lc->rchild=p

p=lc

return p

}

////左旋

bstree L_Rotate(bstree &p){

bstree rc

rc=p->rchild

p->rchild=rc->lchild

rc->lchild=p

p=rc

return p

}

/////左平衡处理

bstree LeftBalance(bstree &T){

bstree lc,rd

lc=T->lchild //lc指向*T的左子树根结点

switch(lc->bf) { //检查*T的左子树平衡度,并做相应的平衡处理

case LH://新结点插入在*T的左孩子的左子树上,要做单右旋处理

T->bf=lc->bf=EH

T=R_Rotate(T)

break

case RH://新结点插入在*T的左孩子的右子树上,要做双旋处理

rd=lc->rchild //rd指向*T的左孩子的右子树根

switch(rd->bf){ //修改*T及其左孩子的平衡因子

case LH:

T->bf=RH

lc->bf=EH

break

case EH:

T->bf=lc->bf=EH

break

case RH:

T->bf=EH

lc->bf=LH

break

}//////////switch(rd->bf)

rd->bf=EH

T->lchild=L_Rotate(T->lchild)//对*T的左孩子做左旋平衡处理

T=R_Rotate(T)//对*T做右旋处理

}////////switch(lc->bf)

return T

}

////右平衡处理

bstree RightBalance(bstree &T)

{

bstree rc,ld

rc=T->rchild //rc指向*T的右子树根结点

switch(rc->bf) { //检查*T的右子树平衡度,并做相应的平衡处理

case RH://新结点插入在*T的右孩子的右子树上,要做单右旋处理

T->bf=rc->bf=EH

T=L_Rotate(T)

break

case LH://新结点插入在*T的右孩子的左子树上,要做双旋处理

ld=rc->lchild //ld指向*T的右孩子的左子树根

switch(ld->bf){ //修改*T及其右孩子的平衡因子

case LH:

T->bf=EH

rc->bf=RH

break

case EH:

T->bf=rc->bf=EH

break

case RH:

T->bf=LH

rc->bf=EH

break

}///switch(ld->bf)

ld->bf=EH

T->rchild=R_Rotate(T->rchild)//对*T的右孩子做右旋平衡处理

T=L_Rotate(T)//对*T做左旋处理

}/////switch(rc->bf)

return T

}

int Delete(bstree &T,int e){

//删除结点

bstree p,q

e=0

p=T

if(!T->rchild) {//右子数为空需要重接它的左子数

T=T->lchild

free(p)

shorter=true

}

else if(!T->lchild) {//重接它的右子数

T=T->rchild

free(p)

shorter=true

}

else{ //左右子数均不空

q=T->lchild

while(q->rchild!=NULL){//转左,然后向右到尽头

q=q->rchild

}

e=q->data

}

return e

}

void Delete_Rightbalance(bstree &T){

///////////删除在左子树上的,相当于插入在右子树

bstree rc=T->rchild,ld

switch(rc->bf){

case LH://///////双旋 ,先右旋后左旋

ld=rc->lchild

rc->lchild=ld->rchild

ld->rchild=rc

T->rchild=rc->lchild

rc->lchild=T

switch(ld->bf) {

case LH:T->bf=EH

rc->bf=RH

break

case EH:T->bf=rc->bf=EH

break

case RH:T->bf=LH

rc->bf=EH

break

}

ld->bf=EH

T=rc

shorter=truebreak

case EH:///////删除在左子树,相当于插入在右子树,左单旋

T->rchild=rc->lchild

rc->lchild=T

rc->bf=LH

T->bf=RH

T=rc

shorter=EHbreak

case RH:///////删除在左子树,相当于插入在右子树,左单旋

T->rchild=rc->lchild

rc->lchild=T

rc->bf=T->bf=EH

T=rc

shorter=truebreak

}

}

void Delete_Leftbalance(bstree &T)/////删除右子树上的,相当于插入在左子树上

{

bstree p1,p2

p1=T->lchild

switch(p1->bf) {

case LH:T->lchild=p1->rchild//////右旋

p1->rchild=T

p1->bf=T->bf=EH

T=p1

shorter=true

break

case EH:T->lchild=p1->rchild///////右旋

p1->rchild=T

p1->bf=RH

T->bf=LH

T=p1

shorter=false

break

case RH:p2=p1->rchild//////////右双旋

p1->rchild=p2->lchild

p2->lchild=p1

T->lchild=p2->rchild

p2->rchild=T

switch(p2->bf){

case LH:T->bf=RHp1->bf=EHbreak

case EH:T->bf=EHp1->bf=EHbreak

case RH:T->bf=EHp1->bf=LHbreak

}

p2->bf=EH

T=p2

shorter=truebreak

}

}

3. 函数的调用关系图

Main

InsertAVLPreordertraverse FindAVLDeleteAVL

四、 调试分析

1. 在开始对平衡二叉树的插入后,再做平衡处理时,特别是在做双向旋转平衡处理后的更新时,费了一些时间;

2. 在做平衡二叉树的删除时,当删除结点左右孩子均在时,开始直接用左子树的最大数代替,然后直接删除结点,结果导致删除了将要删除的结点及其孩子均删除了,后来将要删除的结点用左子树的最大树代替后,对左子树的最大结点做好标记,然后再做对其做删除处理。

3. 本程序算法基本简单,没有多大困难,就是在分析做双旋平衡处理的更新时,开始思路有些混乱,后来就好了;

五、 用户手册

1. 本程序的运行环境为DOS *** 作系统,执行文件为Balanced Tree.exe。

2. 进入演示程序后,按广度遍历输入平衡二叉树,中间以回车键隔开,输入0为结束;再输入要插入的结点,输入0结束,再输入要查找的结点,最后可以输入要删除的结点,输入0结束

六、 测试结果

先按广度遍历创建平衡二叉树(亦可一个一个的插入二叉树的结点)(50 20 60 10 30 55 70 5 15 25 58 90) ,输入0结束,然后可插入结点(39),其会显示插入后的二叉树,输入0,不再插入;输入要查找结点(6),输入要删除的结点(20),其显示如下:

七、 附录

Balance Tree.cpp


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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存