离散数学上机实验报告

《离散数学》实验报告

实验二:程序实现逻辑运算

程序实现关系运算

姓 名: 叶云燕 学 号: 2014211617 班 级: 计算机科学与技术14-2班 实验地点: 4号机房 实验时间: 2015.10.2

《离散数学》实验报告

1 实验目的和要求

实验目的:

(1) 编程实现各种常见的逻辑运算;

(2) 编程实现关系的闭包运算的求解。

实验要求:

(1)在luojiyuns.cpp文件中补充And(), Or(), Not(), Xor(), Single_condition(),

Doublbe_condition()以实现基本逻辑运算;

(2)运行程序验证用常量表示的复杂逻辑表达式的真值求解方法

(3)补充luojiyuns.cpp文件中的Unknown_Logic()的两段代码以实现以变量表示的复杂逻

辑表达式的结果输出(以真值表形式)以及主合取和主析取范式输出

(4)熟练使用C++进行编码,掌握VC++6.0的有关操作。

(5) 在warshallDlg.cpp文件中的CWarshallDlg::OnCalculate() 函数中补充warshall算法

2 实验环境和工具

装有VC++6.0的电脑一台。

3 实验结果

3.1算法流程图

3.2程序核心代码

(1)编程实现基本的逻辑运算

/****************************************************

//该函数用于检测输入的单逻辑值是否正确

//val_one为要进行检测的逻辑值

*****************************************************/

int luoji::onevalue_Judge(int val_one) {

if(val_one==0||val_one==1 )

《离散数学》实验报告

}

return 1; else return 0;

/****************************************************

//该函数用于检测输入的双逻辑值是否正确

//val_one和val_two为要进行检测的逻辑值

*****************************************************/

int luoji::twovalue_Judge(int val_one,int val_two) {

if((val_one==0||val_one==1)&&(val_two==0||val_two==1))

}

/****************************************************

//该函数用于进行逻辑与运算

//val_one和val_two分别为参与运算的逻辑值

//调用twovalue_Judge函数检测是否符合输入要求,然后进行

//逻辑运算并返回运算结果

*****************************************************/

int luoji::And(int val_one,int val_two) {

int jud; return 1; else return 0;

《离散数学》实验报告

if(twovalue_Judge(val_one,val_two)==1)

}

/****************************************************

//该函数用于进行逻辑或运算

//val_one和val_two分别为要进行计算逻辑值

//调用twovalue_Judge函数检测是否符合输入要求,然后进行

//逻辑运算并返回运算结果

*****************************************************/

int luoji::Or(int val_one,int val_two) {

int jud; else { Output(); { } if(val_one==1&&val_two==1)return 1; else return 0; return 2; } cout<<"\n\n";

if(twovalue_Judge(val_one,val_two)==1)

{

《离散数学》实验报告

} if(val_one==1||val_two==1)return 1; else return 0;

else

}

/****************************************************

//该函数用于进行逻辑非运算

//val_one为要进行计算的逻辑值

//调用onevalue_Judge函数检测是否符合输入要求,然后进行

//逻辑运算并返回运算结果

*****************************************************/

int luoji::Not(int val_one) {

int jud; if( onevalue_Judge(val_one)==1 ) { } else if(val_one==1)return 0; else return 1; { Output(); return 2; } cout<<"\n\n";

《离散数学》实验报告

{ Output();

return 2;

}

/****************************************************

//该函数用于进行逻辑异或运算

//val_one和val_two分别为要进行计算逻辑值

//调用twovalue_Judge函数检测是否符合输入要求,然后进行

//逻辑运算并返回运算结果

*****************************************************/

int luoji::Xor(int val_one,int val_two) {

int jud; if(twovalue_Judge(val_one,val_two)==1) { } else { } Output(); return 2; if(val_one+val_two==1)return 1; else return 0; } cout<<"\n\n";

《离散数学》实验报告

cout<<"\n\n";

}

************************************************

//该函数用于进行逻辑单条件运算

//val_one和val_two分别为要进行计算逻辑值

*****************************************************/

int luoji::Single_condition(int val_one,int val_two) {

if(twovalue_Judge(val_one,val_two)==1) { } else { } Output(); return 2; if(val_one==1&&val_two==0)return 0; else return 1; int jud;

cout<<"\n\n";

}

《离散数学》实验报告

/****************************************************

//该函数用于进行逻辑双条件运算

//val_one和val_two分别为要进行计算逻辑值

*****************************************************/

int luoji::Double_condition(int val_one,int val_two) {

}

(4)warshall算法

int jud; if(twovalue_Judge(val_one,val_two)==1) { } else { } cout<<"\n\n"; Output(); return 2; if(val_one+val_two==1)return 0; else return 1;

/****************************************************

//该函数用于将获得的矩阵使用warshall算法计算并输出

//将输入的string转化存储到二维矩阵two_mat中

*****************************************************/

《离散数学》实验报告

void CWarshallDlg::OnCalculate()

{

CString dimension,string,tmp;

CString ch;

static int dim;

int num; int count=0; GetDlgItem( DIMENSION )->GetWindowText(dimension); dim=atoi(dimension); int *one_mat=new int[dim*dim]; //定义一维动态数组 int **two_mat=new int *[dim]; //定义二维动态数组 for(int i=0;i<dim;i++) two_mat[i] = new int[dim]; GetDlgItem( STRING )->GetWindowText( string ); for(i=0;i<dim*dim;i++) //将字符串转化存到一维数组中

{ if((i+1)%dim==0) { } else ch=string.GetAt(i+count); num=atoi(ch); one_mat[i]=num; ch=string.GetAt(i+count); count=count++; } for( i=0;i<dim;i++) //将一维数组转化存到二维数组中 for(int j=0;j<dim;j++) two_mat[i][j]=one_mat[dim*i+j];

《离散数学》实验报告

// 以下语句段使用warshall方法改变矩阵中的值以帮助求解传递闭包

// 需要用到的矩阵的行、列值存储在变量dim中,矩阵中各个位置上的对应 // 值存储在two_mat[][]数组中

for(int k=0;k<dim;k++) { } tmp=string=""; for(i=0;i<dim;i++) { } for(int j=0;j<dim;j++) { } string+="\r\n"; tmp.Format(" %d ",two_mat[i][j]); string+=tmp; for(i=0;i<dim;i++) { } for( i=0;i<dim;i++) for(int j=0;j<dim;j++) two_mat[i][j]=temp[i][j]; for(int j=0;j<dim;j++) temp[i][j]=(two_mat[i][j])||(two_mat[i][k]&two_mat[k][j]); int** temp=new int*[dim]; for(i=0;i<dim;i++) temp[i]=new int[dim];

《离散数学》实验报告

GetDlgItem( RESULT)->SetWindowText(string ); //输出warshall算法计算结果

}

3.3运行结果

实验运行截图如下:

离散数学上机实验报告

离散数学上机实验报告

《离散数学》实验报告

离散数学上机实验报告

离散数学上机实验报告

《离散数学》实验报告

离散数学上机实验报告

离散数学上机实验报告

3.4运行结果分析

基本实现所要求的运算和功能。 4 思考题(可选)

5 实验心得

《离散数学》实验报告

本次实验采用C++编程来实现基本的逻辑运算和关系的闭包运算,让我们将离散数学中的知识和编程知识结合在一起,两种知识都得到强化。

 

第二篇:四川大学离散数学实验报告(1)

       

离散数学实验报告(1)

 实验名称:构造任意合式公式的真值表

  

姓名:卢松

指导老师:冯伟森

年级:11级2班

学号:1143041172

学院:计算机

1、          功能

给出任意变元的合式公式,构造该合式公式的真值表。

1、      基本思想

仍然以用数值变量表示命题变元为前提规范,合式表示的表示。程序计算前将转换后的合式公式输入到本程序首个sign:语句后的条件位置上。另外使用a[N]来表示合式公式中所出现的n个命题变元。

一位数组a[N]除了表示n个命题变元外,它还是一个二进制加法的模拟器,每当在这个模拟器中产生一个二进制数时,就相当于给各命题变元产生了一组真值指派。其中数值一表示真值为1,数值0表示真值为0.

2、      算法逻辑

(1)            将二进制加法模拟器a[N]赋初值,ai=0(i=1,2,…,n)。

(2)            计算模拟器中所对应于模拟器所给出的一组真值指派下合式公式的真值。(条件语句)

(3)            输出真值表中对应于模拟器所给出的一组真值指派及这组真值指派所对应的一行真值。

(4)            在模拟器a[N]中,模拟产生下一个二进制数值。

(5)            若a[N]中的数值等于2n,则结束,否则转(2)。

3、      源程序

#include<stdio.h>

#define N 4

main()

{

  int a[N];

  int i,z;

  printf("构造任意公式的真值表");

  printf("\n");

  for(i=1;i<=4;i++)

  {

         a[i]=0;

         printf("a[%d]=0  ",i);

  }

sign:

  if(!(a[1]==1||a[2]==1)&&((a[1]==1||a[3]==1)||a[4]==1))

         z=1;

  else

         z=0;

  for(i=N;i>=1;i--)

         printf("%4d",a[i]);

    printf("   |%4d\n",z);

         i=1;

sing:

         a[i]=a[i]+1;

         if(a[i]<2)

                goto sign;

         else

                a[i]=0;

         i++;

         if(i<=4)

                goto sing;

}

备注:本题是以~(PνQ)Λ((PνR)νS)为例子进行实验的。

4、   实验总结:

由于自己的技术问题只是验证了一组数据,因为时间紧迫所以来不及修改,课后会继续修改。从这次实验中学习到了很多,尤其是对真值表的判断条件,同时感觉到想像和实际操作之间的距离。

相关推荐