離散數學實驗指導書及其答案_第1頁
離散數學實驗指導書及其答案_第2頁
離散數學實驗指導書及其答案_第3頁
離散數學實驗指導書及其答案_第4頁
離散數學實驗指導書及其答案_第5頁
已閱讀5頁,還剩10頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、精選優質文檔-傾情為你奉上實驗一 命題邏輯公式化簡【實驗目的】加深對五個基本聯結詞(否定、合取、析取、條件、雙條件)的理解、掌握利用基本等價公式化簡公式的方法。【實驗內容】用化簡命題邏輯公式的方法設計一個表決開關電路。實驗用例:用化簡命題邏輯公式的方法設計一個5人表決開關電路,要求3人以上(含3人)同意則表決通過(表決開關亮)。【實驗原理和方法】(1)寫出5人表決開關電路真值表,從真值表得出5人表決開關電路的主合取公式(或主析取公式),將公式化簡成盡可能含五個基本聯結詞最少的等價公式。(2)上面公式中的每一個聯結詞是一個開關元件,將它們定義成C語言中的函數。(3)輸入5人表決值(0或1),調用

2、上面定義的函數,將5人表決開關電路真值表的等價公式寫成一個函數表達式。(4)輸出函數表達式的結果,如果是1,則表明表決通過,否則表決不通過。參考代碼:#include<stdio.h>int vote(int a,int b,int c,int d,int e)/五人中任取三人的不同的取法有10種。if( a&&b&&c | a&&b&&d | a&&b&&e | a&&c&&d | a&&c&&e | a&&

3、;d&&e | b&&c&&d | b&&c&&e | b&&d&&e | c&&d&&e)return 1;else return 0;void main()int a,b,c,d,e;printf("請輸入第五個人的表決值(0或1,空格分開):");scanf("%d%d%d%d%d",&a,&b,&c,&d,&e);if(vote(a,b,c,d,e) printf(

4、"很好,表決通過!n");elseprintf("遺憾,表決沒有通過!n");/注:聯結詞不定義成函數,否則太繁實驗二 命題邏輯推理【實驗目的】加深對命題邏輯推理方法的理解。【實驗內容】用命題邏輯推理的方法解決邏輯推理問題。實驗用例:根據下面的命題,試用邏輯推理方法確定誰是作案者,寫出推理過程。(1)營業員A或B偷了手表; (2)若A作案,則作案不在營業時間; (3)若B提供的證據正確,則貨柜末上鎖; (4)若B提供的證據不正確,則作案發生在營業時間; (5)貨柜上了鎖。 【實驗原理和方法】(1)符號化上面的命題,將它們作為條件,營業員A偷了手表作為結論

5、,得一個復合命題。(2)將復合命題中要用到的聯結詞定義成C語言中的函數,用變量表示相應的命題變元。將復合命題寫成一個函數表達式。(3)函數表達式中的變量賦初值1。如果函數表達式的值為1,則結論有效, A偷了手表,否則是B偷了手表。用命題題變元表示:A:營業員A偷了手表B:營業員B偷了手表C:作案不在營業時間D:B提供的證據正確E:貨柜末上鎖則上面的命題符號化為 (A|B) && (!A|C) && (!D|E) && (D|!C) && !E要求找到滿足上面式子的變元A,B的指派便是結果。C語言算法:int A,B,C,D,E;f

6、or(A=0;A<=1;A+)for(B=0;B<=1;B+)for(C=0;C<=1;C+)for(D=0;D<=1;D+)for(E=0;E<=1;E+)if(A|B) && (!A|C) && (!D|E) && (D|!C) && !E)printf("A=%d,B=%dn",A,B);/*實驗結果是:A=0,B=1,即B偷了手表*/實驗三 集合運算【實驗目的】掌握用計算機求集合的交、并、差和補運算的方法。【實驗內容】編程實現集合的交、并、差和補運算。【實驗原理和方法】(1

7、)用數組A,B,C,E表示集合。輸入數組A,B,E(全集),輸入數據時要求檢查數據是否重復(集合中的數據要求不重復),要求集合A,B是集合E的子集。以下每一個運算都要求先將集合C置成空集。(2)二個集合的交運算:把數組A中元素逐一與數組B中的元素進行比較,將相同的元素放在數組C中,數組C便是集合A和集合B的交。C語言算法:for(i=0;i<m;i+)for(j=0;j<n;j+)if(ai=bj) ck+=ai;(3)二個集合的并運算:把數組A中各個元素先保存在數組C中。將數組B中的元素逐一與數組B中的元素進行比較,把不相同的元素添加到數組C中,數組C便是集合A和集合B的并。C語

8、言算法:for(i=0;i<m;i+)ci=ai;for(i=0;i<n;i+)for(j=0;j<m;j+)if(bi=cj) break;if(j=m) cm+k=bi;k+;(4)二個集合的差運算:把數組A中各個元素先保存在數組C中。將數組B中的元素逐一與數組B中的元素進行比較,把相同的元素從數組C中刪除,數組C便是集合A和集合B的差A-B。C語言算法:for(i=0;i<m;i+)ci=ai;for(i=0;i<n;i+)for(j=0;j<m;j+)if(bi=cj)for(k=j;k<m;k+)ck=ck+1;/*移位*/m-;break;

9、(5)集合的補運算:將數組E中的元素逐一與數組A中的元素進行比較,把不相同的元素保存到數組C中,數組C便是集合A關于集合E的補集。求補集是一種種特殊的集合差運算。實驗四 二元關系及其性質【實驗目的】掌握二元關系在計算機上的表示方法,并掌握如果判定關系的性質。【實驗內容】 編程判斷一個二元關系是否為等價關系,如果是,求其商集。等價關系:集合A上的二元關系R同時具有自反性、對稱性和傳遞性,則稱R是A上的等價關系。【實驗原理和方法】(1)A上的二元關系用一個n×n關系矩陣R=表示,定義一個n×n數組rnn表示n×n矩陣關系。(2)若R對角線上的元素都是1,則R具有自反性

10、。C語言算法:int i,flag=1;for(i=0;i<N && flag ;i+)if(rii!=1) flag=0;如果flag=1, 則R是自反關系(3)若R是對稱矩陣,則R具有對稱性。對稱矩陣的判斷方法是:。C語言算法:int i,j,flag=1;for(i=0;i<N && flag ;i+)for(j=i+1;j<N && flag;j+) if(rij &&rji!=1) flag=0;如果flag=1, 則R是對稱關系(4)關系的傳遞性判斷方法:對任意i,j,k,若。C語言算法:int i,

11、j,k,flag=1;for(i=0;i<N && flag;i+)for(j=0;j<N && flag;j+)for(k=0;k<N && flag;k+)if(rij &&rjk && rik!=1) flag=0;如果flag=1, 則R是傳遞關系(5)求商集的方法:商集是由等價類組成的集合。已知R是等價關系,下面的算法是把等價類分行打印出來。C語言算法: int i,j,flag=1;int aN;for(i=0;i<N;i+)ai=i+1;/*i代表第i個元素*/for(i=0;

12、i<N;i+)if(ai)printf(" ");for(j=0;j<N;j+)if(rij && aj!=0) printf("%d ",aj);/*打印和第i個元素有關系的所有元素*/aj=0;printf("n");實驗五 關系閉包運算【實驗目的】掌握求關系閉包的方法。【實驗內容】編程求一個關系的閉包,要求傳遞閉包用warshall方法。【實驗原理和方法】設N元關元系用rNN表示,cNN表示各個閉包,函數initc(r)表示將cNN初始化為rNN。(1)自反閉包:。C語言算法: 將關系矩陣的對角線上所

13、有元素設為1。initc(r);/*將關系矩陣的對角線上所有元素設為1*/for(i=0;i<N;i+)cii=1;(2)對稱閉包:C語言算法: 在關系矩陣的基礎上,若。initc(r);for(i=0;i<N;i+)for(j=0;j<N;j+)if(cij) cji=1;/*將關系矩陣的對角線上所有元素設為1*/(3)傳遞閉包:,或用warshall方法。方法1:,下面求得的關系矩陣T=就是。int bNN;initc(r);/*用c裝好r*/for(m=1;m<N;m+) /*得r的m次方,用c裝好*/for(i=0;i<N;i+)for(j=0;j<

14、N;j+)bij=0;for(k=0;k<N;k+)bij+=cik*rkj;if(bij) bij=1;initc(b);/*把r的m次方b賦給c保存*/方法2:warshall方法initc(r);/*用c裝好r*/for(i=0;i<N;i+)for(j=0;j<N;j+)if(cji)for(k=0;k<N;k+)cjk=cjk+cik;if(cjk) cjk=1;實驗六 歐拉圖判定和應用【實驗目的】掌握判斷歐拉圖的方法。【實驗內容】 判斷一個圖是不是,如果是,求出所有歐拉路【實驗原理和方法】(1)用關系矩陣R=表示圖。(2)對無向圖而言,若所有結點的度都是偶數

15、,則該圖為歐拉圖。C語言算法:flag=1;for(i=1;i<=n && flag;i+)sum=0;for(j=1;j<=n;j+)if(rij) sum+;if(sum%2=0) flag=0;如果 flag 該無向圖是歐拉圖(3)對有向圖而言,若所有結點的入度等于出度,則該圖為歐拉圖。C語言算法:flag=1;for(i=1;i<=n && flag;i+)sum1=0;sum2=0;for(j=1;j<=n;j+)if(rij) sum1+;for(j=1;j<=n;j+)if(rji) sum2+;if(sum1%2=0

16、 | sum2%2=0) flag=0;如果 flag 該有向圖是歐拉圖(4)求出歐拉路的方法:歐拉路經過每條邊一次且僅一次。可用回溯的方法求得所有歐拉路。C語言算法:int count=0,cur=0,rNN; / rNN為圖的鄰接矩陣,cur為當前結點編號,count為歐拉路的數量。int sequenceM;/ sequence保留訪問點的序列,M為圖的邊數輸入圖信息;void try1(int k) /k表示邊的序號int i,pre=cur; /j保留前一個點的位置,pre為前一結點的編號for (i=0;i<N;i+) if (rcuri) /當前第cur點到第i點連通 /刪

17、除當前點與第i點的邊,記下第k次到達點i,把第i個點設為當前點rcuri=0;cur=sequencek=i; if (k<M) try1(k+1); /試下一個點else prt1();/經過了所有邊,打印一個解/上面條件不滿足,說明當前點的出度為0,回溯,試下一位置rprei=1;cur=pre; 實驗七 最優二叉樹的應用【實驗目的】掌握求最優二叉樹的方法。【實驗內容】最優二叉樹在通信編碼中的應用。要求輸入一組通信符號的使用頻率,求各通信符號對應的前綴碼。【實驗原理和方法】(1)用一維數組fN存貯通信符號的使用頻率,用求最優二叉樹的方法求得每個通信符號的前綴碼。(2)用鏈表保存最優二

18、叉樹,輸出前綴碼時可用樹的遍歷方法。#include <stdio.h>#include <stdlib.h>#define N 13struct tree float num;struct tree *Lnode;struct tree *Rnode;* fpN;/保存結點char s2*N;/放前綴碼void inite_node(float f,int n)/生成葉子結點int i;struct tree *pt;for(i=0;i<n;i+)pt=(struct tree *)malloc(sizeof(struct tree);/生成葉子結點pt->

19、;num=fi;pt->Lnode=NULL;pt->Rnode=NULL;fpi=pt;void sort(struct tree * array,int n)/將第N-n個點插入到已排好序的序列中。int i;struct tree *temp;for(i=N-n;i<N-1;i+)if(arrayi->num>arrayi+1->num)temp=arrayi+1;arrayi+1=arrayi;arrayi=temp;struct tree * construct_tree(float f,int n)/建立樹int i;struct tree *p

20、t;for(i=1;i<N;i+)pt=(struct tree *)malloc(sizeof(struct tree);/生成非葉子結點pt->num=fpi-1->num+fpi->num;pt->Lnode=fpi-1;pt->Rnode=fpi;fpi=pt;/w1+w2sort(fp,N-i);return fpN-1;void preorder(struct tree *p,int k,char c) int j;if(p!=NULL) if(c='l') sk='0'else sk='1'if(

21、p->Lnode=NULL) /P指向葉子printf("%.2f: ",p->num);for(j=0;j<=k;j+)printf("%c",sj);putchar('n');preorder(p->Lnode,k+1,'l');preorder(p->Rnode,k+1,'r');void main()float fN=2,3,5,7,11,13,17,19,23,29,31,37,41;struct tree *head;inite_node(f,N); /初始化結點head=construct_tree(f,N);/生成最優樹s0=0;preorder(head,0,'l');/遍歷樹實驗八 群的判定【實驗目的】掌握群的判定方法。【實驗內容】輸入代數系統(A,*)的集合A和*運算的運算表,判斷(A,*)是否是群。【實驗原理和方法】(1)用一維數組an存貯集合A。(2)用二維數組opnn存貯運算表。(3)根據群的定義,代數系統(A,*)若為群,除運算表已表明運算*封閉

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論