逻辑式化简C语言代码实验报告.doc

  1. 1、本文档共7页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
姓名:黄新发 班级:信息技术类创新实验111班 学号1107300504 PAGE PAGE 1 2012/12/31 逻辑式化简实验报告 实验名称 逻辑式化简 实验目的 更熟练的掌握逻辑式的化简,同时也更熟练的掌握c语言的各种操作,以及对化简的本质的认识。 化简原理 本次逻辑式化简我做的时间比较长,但做出来的程序实用性比较高。此次的逻辑式化简,我分两大模块分别来完成:一个模块是从复杂的逻辑式(带有括号的、带有异或同或的、带有与非的、或非的等等)化到最小项,一个模块是从最小项化到最简。最后,我把这两个模块整合到一起,形成一个功能集全的程序。下面我分别来阐述这两个的基本原理。 从复杂的的逻辑式化到最小项:要做到从无论多复杂的式子化到最小项,我的算法是先定义了一个一维数组(假设长度是10,那么逻辑变量最多为10)用来存放逻辑变量。这样的数组只要写两三个语句就可以从n个0,变到n个1。(注:这个方法是我学了数字电路的加法原理时找到的)。二进制的数加1,只要从后数起到第一个0为此,把0变为1,把1变0即可。然后再定义一个一维数组,用于存放我们输入的逻辑式。最后把逻辑变量(0,1)赋给逻辑式中的变量(A、B、C、D等),这样的逻辑式化简起来是简单的了。只要定义一个函数(其功能是将变量只有0,1的复杂逻辑式化到只有一个0或1的逻辑式,最后返回0或1)。最终的结果是可以输出真值表和最小项。(具体的实现见程序代码) 从最小项化到最简与或式:这个算法我是参考数字电路课本上的QM算法来编写程序的,课本上的那个算法只有一个大体上的算法,具体的算法是我独自的编出来的。我是定义了一个二维数组来存放最小项的,二维数组的每一行是用来存放一个最小项的。把两行的比较化简结果存放到此二维数组。我是用把此二维数组当成队列来使用的,这样能够减少存储空间。同使我也定义了另一个二维数组用于存放化简后的最终结果的。这样化简出来的结果已经包含最简式的项了,最后一步是从这些结果中将最简式的项筛选出来。我的思路是:从包含最多的最小项到包含最少的最小项查找,例如拿一个最简式的项(包含的最小项的个数是n)出来看是不是应该选:这个项先依次的跟另一个最简式的项(包含的最小项大于n)比较,如果没有找到包含同一最小项,则跟另一个最简式(包含的最小项同是n)比较(标记不为2的才能比较),如果没有找到包含同一最小项的话就标记1,否则标记2。这样开始执行下一个循环 。最终只要输出标记为1的最简式的项即可。 程序说明 本程序的语句在三百行之内,对输入四个变量及其以下的任何一个任何复杂的逻辑式均能化到最简且均正确(最少试验多次都未发现错误现象),如果你输入的逻辑式不规范,它会提示你输入有误,错误的原因可能是你输入变量的大小写问题,或是输入的括号、非的符号是中文的,或是输入的变量在它规定的变量之外(例如:你输入变量的个数是4,它会提示你输入变量在A~D之间;你输入的变量是3,它会提示你输入变量在A~C之间)。超过四个变量后,如果最小项超过一定的个数,就会出错(这个问题等我有空的时候再处理)。因此,最好不要输入超过四个变量,才能全对。 关于输入的说明:1、输入的变量要用大写 2、“与”符号是什么都没有,变量直接相连(如:AB) 3、“或”符号是“+”(如:A+B) 4、“非”符号是“’”(如:A’) 5、“异或”符号是“@”(如:A@B) 6、“同或”符号是“*”(如:A*B) 7、逻辑式中的括号是小写的括号 8、逻辑式结束的标志是按回车键。 五、附录、程序代码 (1)带有异或同或的逻辑式 (2)没有异或同或的逻辑式 以下代码请用C-Free编译器来编写 #includestdio.h #includestdlib.h #includestring.h #includemalloc.h #define ROW 500 #define LINE 80 char a[ROW][LINE];//用于存放最小项 char w[ROW][LINE];//用于存放化简后的项 int w1=0,k;//w1为全局变量(行号),k为变量的个数 int head=ROW-1,rear=ROW-1; //用于循环队列,head指向对头,rear指向队尾,用于数组a[][] char a1[50],b[10];//数组a1用于存放逻辑式,输入时需要,数组b用于存放逻辑变量 //输入逻辑函数式 void input() { int i,j; getchar(); printf(请输入变量为A~%c的逻辑式Y=,A+k-1); for(i=0;i90;i++) { scanf(%c,a1[i]); i

文档评论(0)

137****4262 + 关注
实名认证
内容提供者

网文天下

1亿VIP精品文档

相关文档