离散数学上机实验1
离散数学上机实验报告
离散数学上机实验报告————————————————————————————————作者:————————————————————————————————日期:ﻩ《离散数学》实验报告姓名:学号:班级:ﻬ实验一连结词逻辑运算一.实验目的实现二元合取、析取、蕴涵和等价表达式的计算。
熟悉连接词逻辑运算规则,利用程序语言实现逻辑这几种逻辑运算。
二.实验内容从键盘输入两个命题变元P和Q的真值,求它们的合取、析取、蕴涵和等价四种运算的真值。
要求对输入内容进行分析,如果不符合0、1条件需要重新输入,程序有良好的输入输出界面。
三.实验环境使用Microsoft Visual C++6.0为编程软件,采用称C/C++语言为编程语言实现。
四.实验过程1.算法分析:合取:p,q都为1的时候为1,其他为0析取:p,q都为0的时候为0,其他为1蕴含:p为1,q为0时为0,其他为1等价:p,q同真同假2.程序代码:#include<stdio.h>intmain(){ﻩint P,Q,a,b,c,d,p,q;printf(" P的值");for(P=0;P<2;P++)ﻩ{ﻩfor(Q=0;Q<2;Q++)ﻩﻩprintf("\t%d",P);ﻩ}printf("\n Q的值");for(P=0;P<2;P++)ﻩ{ﻩﻩfor(Q=0;Q<2;Q++)ﻩprintf("\t%d",Q);ﻩ}printf("\n 非P的值");for(P=0;P<2;P++){ﻩfor(Q=0;Q<2;Q++)ﻩ{ﻩﻩif(P==0)/*判断非P的值*/ﻩﻩﻩp=1;ﻩﻩelseﻩﻩp=0;ﻩﻩﻩprintf("\t%d",p);ﻩ}ﻩ}ﻩprintf("\n 非Q的值");ﻩfor(P=0;P<2;P++)ﻩ{ﻩfor(Q=0;Q<2;Q++)ﻩﻩ{ﻩﻩif(Q==1)/*判断非Q的值*/ﻩﻩﻩq=0;ﻩelseﻩﻩq=1;ﻩprintf("\t%d",q);}ﻩ}ﻩprintf("\n P与Q的值");for(P=0;P<2;P++)ﻩ{ﻩfor(Q=0;Q<2;Q++)ﻩ{ﻩﻩﻩif(Q==0||P==0)/*判断P与Q的值*/ﻩa=0;ﻩﻩelseﻩﻩa=1;ﻩprintf("\t%d",a);ﻩ}ﻩ}ﻩprintf("\n P或Q的值");ﻩfor(P=0;P<2;P++)ﻩ{for(Q=0;Q<2;Q++)ﻩﻩ{ﻩif(Q==1||P==1)/*判断P或Q的值*/ ﻩﻩﻩb=1;ﻩelseﻩﻩb=0;ﻩprintf("\t%d",b);}ﻩ}ﻩprintf("\nP蕴含Q的值");ﻩfor(P=0;P<2;P++)ﻩ{ﻩfor(Q=0;Q<2;Q++)ﻩﻩ{ﻩﻩif(P==1&&Q==0)/*判断P蕴含Q的值*/ﻩﻩc=0;ﻩﻩelseﻩc=1;printf("\t%d",c);}}printf("\nP等价Q的值");for(P=0;P<2;P++)ﻩ{ﻩﻩfor(Q=0;Q<2;Q++)ﻩ{ﻩﻩif(P==Q)/*判断P等价Q的值*/ ﻩd=1;ﻩﻩelseﻩﻩd=0;ﻩﻩprintf("\t%d",d);}ﻩ}printf("\n");return 0;}3.实验数据及结果分析:实验二关系的复合运算及逆运算一.实验目的熟悉关系的复合运算和逆运算,编程实现关系复合运算和逆运算算法。
离散数学实验报告()
《离散数学》实验报告专业网络工程班级姓名学号授课教师二 O 一六年十二月目录实验一联结词的运算实验二根据矩阵的乘法求复合关系实验三利用warshall算法求关系的传递闭包实验四图的可达矩阵实现实验一联结词的运算一.实验目的通过上机实验操作,将命题连接词运算融入到C语言的程序编写中,一方面加强对命题连接词运算的理解,另一方面通过编程实现命题连接词运算,帮助学生复习和锻炼C语言知识,将理论知识与实际操作结合,让学生更加容易理解和记忆命题连接词运算。
二.实验原理(1) 非运算, 符号: ,当P=T时,P为F, 当P=F时,P为T 。
(2) 合取, 符号: ∧ , 当且仅当P和Q的真值同为真,命题P∧Q的真值才为真;否则,P∧Q的真值为假。
(3) 析取, 符号: ∨ , 当且仅当P和Q的真值同为假,命题P∨Q的真值才为假;否则,P∨Q的真值为真。
(4) 异或, 符号: ▽ , 当且仅当P和Q的真值不同时,命题P▽Q的真值才为真;否则,P▽Q的真值为真。
(5) 蕴涵, 符号: →, 当且仅当P为T,Q为F时,命题P→Q的真值才为假;否则,P→Q 的真值为真。
(6) 等价, 符号: ↔, 当且仅当P,Q的真值不同时,命题P↔Q的真值才为假;否则,P→Q的真值为真。
三.实验内容编写一个程序实现非运算、合取运算、析取运算、异或运算、蕴涵运算、等价运算。
四.算法程序#include<stdio.h>void main(){printf("请输入P、Q的真值\n");int a,b;scanf("%d%d",&a,&b);int c,d;if(a==1)c=0;else c=1;if(b==1)d=0;else d=1;printf("非P、Q的结果为%d,%d\n",c,d);int e;if(a==1&&b==1)e=1;else e=0;printf("合取的结果为%d\n",e);int f;if(a==0&&b==0)f=0;else f=1;printf("析取的结果为%d\n",f);int g;if(a==1&&b==0)g=0;else g=1;printf("单条件的结果为%d\n",g);int h;if(a==b)h=1;else h=0;printf("双条件的结果为%d\n",h);}内容格式:新罗马,五号,行间距固定值18磅五.实验结果六.心得体会通过编程,学会了析取、合取、单条件连接词、双条件连接词的用法。
离散数学计算机实验报告
离散实验报告实验一真值计算1、实验目的熟悉五个常用联结词合取、析取、条件和双条件的概念,掌握真值表技术。
2、实验内容与要求定义1 设P表示一个命题,由命题联结词┐和命题P连接成┐P,称┐P为P的否定式复合命题,┐P读“非P”。
称┐为否定联结词。
┐P是真,当且仅当P为假;┐P是假,当且仅当P为真。
定义2 设P和Q为两个命题,由命题联结词∧将P和Q连接成P∧Q,称P∧Q为命题P和Q的合取式复合命题,P∧Q读做“P与Q”,或“P且Q”。
称∧为合取联结词。
当且仅当P和Q的真值同为真,命题P∧Q的真值才为真;否则,P∧Q的真值为假。
定义3 设P和Q为两个命题,由命题联结词∨把P和Q连接成P∨Q,称P∨Q为命题P和Q的析取式复合命题,P∨Q读做“P或Q”。
称∨为析取联结词。
当且仅当P和Q的真值同为假,P∨Q的真值为假;否则,P∨Q的真值为真。
定义4 设P和Q为两个命题,由命题联结词→把P和Q连接成P→Q,称P→Q为命题P和Q的条件式复合命题,简称条件命题。
P→Q读做“P条件Q”或者“若P则Q”。
称→为条件联结词。
当P的真值为真而Q的真值为假时,命题P→Q的真值为假;否则,P→Q 的真值为真。
定义5 令P、Q是两个命题,由命题联结词↔把P和Q连接成P ↔ Q,称P ↔ Q为命题P和Q的双条件式复合命题,简称双条件命题,P ↔Q读做“P当且仅当Q”,或“P等价Q”。
称↔为双条件联结词。
当P和Q的真值相同时,P ↔ Q的真值为真;否则,P ↔ Q 的真值为假。
本实验要求从键盘输入两个命题P和Q的真值,求它们的合取、析取、条件和双条件的真值。
用C语言或MATLAB实现。
3、实验报告要求列出实验目的、实验内容、实验步骤、源程序和实验结果。
源代码:#include <iostream.h>void main(){int p,q;cout<<"请分别输入P,Q的真值:";cin>>p>>q;if(p>1||p<0){cout<<"P的真值有误,请重新输入!"<<endl;}if(q>1||q<0){cout<<"Q的真值有误,请重新输入!"<<endl;}if(p==0&&q==0){cout<<"P∧Q=0"<<endl;cout<<"P∨Q=0"<<endl;cout<<"P→Q=1"<<endl;cout<<"P<->Q=1"<<endl;}if(p==0&&q==1){cout<<"P∧Q=0"<<endl;cout<<"P∨Q=1"<<endl;cout<<"P→Q=1"<<endl;cout<<"P<->Q=0"<<endl;}if(p==1&&q==0){cout<<"P∧Q=0"<<endl;cout<<"P∨Q=1"<<endl;cout<<"P→Q=0"<<endl;cout<<"P<->Q=0"<<endl;}if(p==1&&q==1){cout<<"P∧Q=1"<<endl;cout<<"P∨Q=1"<<endl;cout<<"P→Q=1"<<endl;cout<<"P<->Q=1"<<endl;}}运行结果:请分别输入P,Q的真值:0 1P∧Q=0P∨Q=1P→Q=1P<->Q=0Press any key to continue实验二关系闭包计算1、实验目的熟悉Warshall算法,掌握求关系的自反闭包、对称闭包和传递闭包的方法。
离散数学上机实验1
实验11实验内容(1)求任意一个命题公式的真值表。
(2)利用真值表求任意一个命题公式的主范式。
(3)利用真值表进行逻辑推理。
注:(2)和(3)可在(1)的基础上完成。
2实验目的真值表是命题逻辑中的一个十分重要的概念,利用它几乎可以解决命题逻辑中的所有问题。
例如,利用命题公式的真值表,可以判断命题公式的类型、求命题公式的主范式、判断两命题公式是否等价,还可以进行推理等。
本实验通过编写一个程序,让计算机给出命题公式的真值表,并在此基础上进行命题公式类型的判定、求命题公式的主范式等。
目的是让学生更加深刻地理解真值表的概念,并掌握真值表的求解方法及其在解决命题逻辑中其他问题中的应用。
3算法的主要思想利用计算机求命题公式真值表的关键是:①给出命题变元的每一组赋值;②计算命题公式在每一组赋值下的真值。
真值表中命题变元的取值具有如下规律:每列中0 和1 是交替出现的,且0 和1 连续出现的个数相同。
n 个命题变元的每组赋值的生成算法可基于这种思想。
含有n个命题变元的命题公式的真值的计算采用的方法为“算符优先法”。
为了程序实现的方便,约定命题变元只用一个字母表示,非、合取、析取、蕴含和等价联结词分别用!、&、|、-、+来表示。
算符之间的优先关系如表1-1所示:表1-1算符优先级优先算法,我们采用两个工作栈。
一个称作OPTR,用以寄存运算符;另一个称作OPND,用以寄存操作数或运算结果。
算法的基本思想是:(1)首先设置操作数栈为空栈,符号“@”为运算符的栈底元素;(2)调用函数Divi(exp,myopnd)得到命题公式包含的命题变元序列myopnd (按字典序排列,同一个命题变元只出现一次);(3)依次读入命题公式中的每个字符,若是命题变元则其对应的赋值进OPND 栈,若是运算符,则和OPTR栈的栈顶运算符比较后作相应操作,直至整个命题公式求值完毕。
离散数学上机实验报告
一、实验内容
从键盘输入二元关系用沃尔算法求出它的传递闭包,并输出。
二、实验步骤
熟悉沃尔算法,然后将其用程序编写出来,任意输入二元关系,观察程序运行结果,
用另一种算法算出结果,与其比较,调试程序。
三、实验代码
#include<stdio.h>
int main()
{
int n,i,j,k,a[10][10];
printf("﹁q=0\n");
printf("p∧q=1\n");
printf("p∨q=1\n");
printf("p→q=1\n");
printf("p<->q=1\n");
}
continue;
}
if('n'==t)
break;
}
return 0;
}
四、实验体会
求真值运算中,应注意各种连接词的试用方法,以及其在不同情况下的真值。
printf("\n");
}
return 0;
}
四、实验体会
熟悉并使用沃尔算法,关系矩阵中只有0和1,所以用沃尔算法求得的数若大于1,应该返回1,其余不变。
实验四、三种闭包运算
一、实验内容
从键盘输入一个二元关系,求它的自反闭包,对称闭包,传递闭包,并输出。
二、实验步骤
编写程序,从键盘输入一个二元关系,当求传递闭包时,试与沃尔算法的传递闭包做比较,观察程序运行结果,调试程序。
char t;
while(t)
{
printf("是否运算程序(y/n):\n");
离散数学实验指导书
实验一命题逻辑公式化简【实验目的】加深对五个基本联结词(否定、合取、析取、条件、双条件)的理解、掌握利用基本等价公式化简公式的方法。
【实验内容】用化简命题逻辑公式的方法设计一个表决开关电路。
实验用例:用化简命题逻辑公式的方法设计一个5人表决开关电路,要求3人以上(含3人)同意则表决通过(表决开关亮)。
【实验原理和方法】(1)写出5人表决开关电路真值表,从真值表得出5人表决开关电路的主合取公式(或主析取公式),将公式化简成尽可能含五个基本联结词最少的等价公式。
(2)上面公式中的每一个联结词是一个开关元件,将它们定义成C语言中的函数。
(3)输入5人表决值(0或1),调用上面定义的函数,将5人表决开关电路真值表的等价公式写成一个函数表达式。
(4)输出函数表达式的结果,如果是1,则表明表决通过,否则表决不通过。
#include<stdio.h>main(){int a[5],i;printf(“please input five persons’ choices (1 means YES 0 means NO):\n”);for(i=0;i<5;i++)scanf(“%d”,&a[i]);a[5]=0;for(i=0;i<5;i++)a[5]=a[5]+a[i];if(a[5]>=3)printf(“YES!”);elseprintf(“NO!”);}参考代码:#include<stdio.h>int vote(int a,int b,int c,int d,int e){//五人中任取三人的不同的取法有10种。
i f( a&&b&&c || a&&b&&d || a&&b&&e || a&&c&&d || a&&c&&e || a&&d&&e || b&&c&&d || b&&c&&e || b&&d&&e || c&&d&&e)return 1;e lsereturn 0;}void main(){i nt a,b,c,d,e;p rintf("请输入第五个人的表决值(0或1,空格分开):");s canf("%d%d%d%d%d",&a,&b,&c,&d,&e);i f(vote(a,b,c,d,e))printf("很好,表决通过!\n");e lseprintf("遗憾,表决没有通过!\n");}//注:联结词不定义成函数,否则太繁实验二命题逻辑推理【实验目的】加深对命题逻辑推理方法的理解。
离散数学实验
离散数学实验报告(实验一)专业:自动化班级:学号:姓名:日期2010.10.28一实验内容(二选一)1. 从键盘输入两个命题变元P和Q的真值,求它们的合取、析取、条件和双条件的真值(A)2. 求任意一个命题公式的真值表(B),并根据真值表求主范式(C)。
二实验目的熟悉掌握命题逻辑中的联接词、真值表、主范式等,进一步能用它们来解决实际问题。
三实验环境进入Visual C++ 环境后,选择菜单“File | New”,在弹出的对话框中单击上方的选项卡“Projects”,选择“Win32 Console Application”工程类型,在“Project name”一栏中填写工程名例如MyFirst,在“Location”一栏中填写工程路径(目录). 选择菜单“Project | Add to Project | New”,为工程添加新的C++源文件。
选择菜单为工程添加新源文件在“File Name”栏填入新添加的源文件名,如MyFirst.cpp,“Location”一栏指定文件路径,按按钮“OK”完成C++源程序的系统新建操作。
编译源程序:选择Build | Build菜单(F7为快捷键),系统将会在Output窗口给出所有的错误信息和警告信息。
当所有错误修正之后,系统将会生成扩展名为.exe的可执行文件。
对于Output窗口给出的错误信息,双击可以使输入焦点跳转到引起错误的源代码处以进行修改。
执行程序:选择Build | Execute菜单项(Ctrl + F5为快捷键),执行程序,将会出现一个DOS窗口,按照程序输入要求正确输入数据后,程序即正确执行。
四实验原理和实现过程(算法描述)1.程序主界面本程序界面主要有两个操作,1:求真值。
2:求任何公式的真值。
操作1完成A 类题要求,操作2完成A,B类题要求。
如果出输入的操作项不是0,1,2,则会提示出错,再次选择。
其界面如图所示:2.算法描述和实现过程在做A类题时,算法实现,首先判断输入格式是否正确,在把蕴含(→),等值(←→),通过变换,化成只有非,合取和析取的等价公式,在利用C语言中的运算符非(!),与(&&)和或(||)算出任何两元变量的真值。
《离散数学》实验课程指导书
printf("您要在多少个数中进行线性查找,请输入(1~100):");
scanf("%d",&n);
printf("\n");
while(n<1 || n>100) //如果输入的数据列表长度不在[1,100]之间
scanf("%d",&a[i]);
i=0;
do
{
exchanged=0;
for(j=0;j<l-1-i;j++)
if(a[j]>a[j+1])
{
k=a[j];
a[j]=a[j+1];
a[j+1]=k;
exchanged=1;
}
if (i==0)
printf("\n");
printf("第%d趟冒泡排序法由小到大排序后:\n",i+1);
{ int r[50];
int length;
}list,*sqlist;
int CreateSqlist(sqlist s)
{
int i;
printf("请输入您要进行搜索的数据队列的长度:\n");
scanf("%d",&(s->length));
printf("\n请输入您要进行搜索的%d个数据:\n",s->length);
printf("冒泡排序算法\n");
离散数学上机实验报告
离散数学实验)报告姓名:学号:班级:离散数学实验报告'实验一真值计算实验内容:从键盘输入两个命题P和Q的真值,求它们的合取、析取、条件和双条件的真值。
用C语言实现。
实验源程序和运行结果如下:#include "iostream.h"void main(){:char p,q,t;int p1,q1;cout<<"输入p,q的真值(F或T)"<<endl;cin>>p>>q;if(p=='F')p1=0;elsep1=1;)if(q=='F')q1=0;elseq1=1;//下面进行为运算if(p1|q1)t='T';else,t='F';cout<<"p析取q为"<<t<<endl;if(p1&q1)t='T';elset='F';cout<<"p和取q为"<<t<<endl;if((!p1)|q1)|t='T';elset='F';cout<<"p条件q为"<<t<<endl; if(p1==q1)t='T';elset='F';·cout<<"p双条件q为"<<t<<endl; }实验二关系闭包计算'实验内容:从键盘输入一个关系的关系矩阵,计算其自反闭包、对称闭包和传递闭包,传递闭包要求使用两种算法,即R+和Warshall算法。
用C语言实现。
实验源程序运行结果如下:#include<stdio.h>int he(int,int);void main(){inta[100][100],b[100][100],c[100][100],d[100][100],I[100][100],i,j,k,n,m,p,q,t;…printf("请输入关系矩阵的阶数\n");scanf("%d",&n);printf("请输入此关系矩阵\n");for(i=0;i<n;i++)for(j=0;j<n;j++)scanf("%d",&a[i][j]);printf("选择1计算自反闭包...\n选择2计算对称闭包...\n选择3用R+计算传递闭包...\n选择4用washall计算传递闭包...\n计算结束后选择0退出\n");scanf("%d",&t);、switch(t){case 1:{for(i=0;i<n;i++){for(j=0;j<n;j++){:if(i==j)I[i][j]=1;else I[i][j]=0;}}for(i=0;i<n;i++){for(j=0;j<n;j++)-b[i][j]=he(a[i][j],I[i][j]),printf("%4d",b[i][j]);printf("\n");}};break;case 2:{for(i=0;i<n;i++){~for(j=0;j<n;j++)b[j][i]=a[i][j];}printf("对称闭包矩阵为\n");for(i=0;i<n;i++){for(j=0;j<n;j++)c[i][j]=he(a[i][j],b[i][j]),printf("%4d",c[i][j]); {printf("\n");}};break;case 3:{for(i=0;i<n;i++)for(j=0;j<n;j++){】c[i][j]=a[i][j];d[i][j]=a[i][j];b[i][j]=0;}for(m=0;m<n;m++){for(i=0;i<n;i++){》for(k=0;k<n;k++){for(j=0;j<n;j++){b[i][k]=b[i][k]||(c[i][j]*a[j][k]);}}}《for(p=0;p<n;p++){for(q=0;q<n;q++)c[p][q]=b[p][q];}for(p=0;p<n;p++){for(q=0;q<n;q++);{d[p][q]=d[p][q]||b[p][q];b[p][q]=0;}}}printf("矩阵的传递闭包为\n");for(i=0;i<n;i++)!{for(j=0;j<n;j++){printf("%4d",d[i][j]);}printf("\n");}};break;(case 4:{for(j=0;j<n;j++){for(k=0;k<n;k++){if(a[k][j]==1){'for(i=0;i<n;i++)a[k][i]=a[k][i]||a[j][i];}}}printf("传递闭包为\n");for(i=0;i<n;i++){《for(j=0;j<n;j++)printf("%4d",a[i][j]);printf("\n");}};break;default:printf("Error\n");}}·int he(int a,int b){int c;if(a==0&&b==0)c=0;else c=1;return c;}…[实验三计算两结点间长度为m的路的数目实验内容:从键盘输入图的邻接矩阵和一正整数m,计算结点两两之间长度为m的路的数目。
离散数学实验
离散数学实验实验一真值计算一、实验目的熟悉联结词合取、析取、条件和双条件的概念,编程求其真值。
二、实验内容(1)求任意一个命题公式的真值表:从键盘输入两个命题P 和Q 的真值,求它们的合取、析取、蕴含和等价的真值(2)利用真值表求任意一个命题公式的主范式(3)利用真值表进行逻辑推理三、实验报告要求列出实验目的、实验内容、实验步骤、源程序和实验结果。
#include#includeint main(){int p,q,hequ,xiqu,yunhan,dengjia;printf("请输入命题P和Q的真值(0或1)");scanf("%d%d",&p,&q);if(p!=0&&p!=1||q!=0&&q!=1)printf("输入错误");else{if(p==0&&q==0){hequ=0;xiqu=0;yunhan=1;dengjia=1;}else if(p==0&&q==1){hequ=0;xiqu=1;yunhan=1;dengjia=0;}else if(p==1&&q==0){hequ=0;xiqu=1;yunhan=0;dengjia=0;}else if(p==1&&q==1){hequ=1;xiqu=1;yunhan=1;dengjia=1;}printf("合取的真值为:%d\n",hequ);printf("析取的真值为:%d\n",xiqu);printf("蕴含的真值为:%d\n",yunhan);printf("等价的真值为:%d\n",dengjia);system("pause");return 0;}}实验二两个集合运算(交、并、补)一、实验目的集合论是一切数学的基础,也是计算机科学不可或缺的,在数据结构,数据库理论,开关理论,自动机理论和可计算理论等领域都有广泛的应用。
离散数学实验报告四个实验
《离散数学》课程设计学院计算机学院学生姓名学号指导教师评阅意见提交日期 2011 年 11 月 25 日引言《离散数学》是现代数学的一个重要分支,也是计算机科学与技术,电子信息技术,生物技术等的核心基础课程。
它是研究离散量(如整数、有理数、有限字母表等)的数学结构、性质及关系的学问。
它一方面充分地描述了计算机科学离散性的特点,为学生进一步学习算法与数据结构、程序设计语言、操作系统、编译原理、电路设计、软件工程与方法学、数据库与信息检索系统、人工智能、网络、计算机图形学等专业课打好数学基础;另一方面,通过学习离散数学课程,学生在获得离散问题建模、离散数学理论、计算机求解方法和技术知识的同时,还可以培养和提高抽象思维能力和严密的逻辑推理能力,为今后爱念族皮及用计算机处理大量的日常事务和科研项目、从事计算机科学和应用打下坚实基础。
特别是对于那些从事计算机科学与理论研究的高层次计算机人员来说,离散数学更是必不可少的基础理论工具。
实验一、编程判断一个二元关系的性质(是否具有自反性、反自反性、对称性、反对称性和传递性)一、前言引语:二元关系是离散数学中重要的内容。
因为事物之间总是可以根据需要确定相应的关系。
从数学的角度来看,这类联系就是某个集合中元素之间存在的关系。
二、数学原理:自反、对称、传递关系设A和B都是已知的集合,R是A到B的一个确定的二元关系,那么集合R 就是A×B的一个合于{()∈A×}的子集合设R是集合A上的二元关系:自反关系:对任意的x∈A,都满足<>∈R,则称R是自反的,或称R具有自反性,即R在A上是自反的⇔(∀x)((x∈A)→(<>∈R))=1对称关系:对任意的∈A,如果<>∈R,那么<>∈R,则称关系R是对称的,或称R具有对称性,即R在A上是对称的⇔ (∀x)(∀y)((x∈A)∧(y∈A)∧(<>∈R)→(<>∈R))=1传递关系:对任意的∈A,如果<>∈R且<>∈R,那么<>∈R,则称关系R是传递的,或称R具有传递性,即R在A上是传递的⇔ (∀x)(∀y)(∀z)[(x∈A)∧(y∈A)∧(z ∈A)∧((<>∈R)∧(<>∈R)→(<>∈R))]=1三、实验原理:通过二元关系与关系矩阵的联系,可以引入N维数组,以数组的运算来实现二元关系的判断。
离散数学实验一:命题逻辑(1).
离散数学实验报告1.【实验题目】实验一命题逻辑(1)2.【实验目的】熟悉掌握命题逻辑中的联接词,实现二元合取、析取、蕴涵和等价表达式的计算,熟悉连接词逻辑运算规则,利用程序语言实现其逻辑运算。
3.【实验内容】从键盘输入两个命题变元P和Q的真值,求它们的合取、析取、条件和双条件的真值。
4. 【实验要求】通过以下界面提示实现相应逻辑运算,给出具体逻辑值**************************************************************** 请输入变量命题P和Q的值(1或0):请选择(1—5)要进行的逻辑运算:1.合取运算(P∧Q)2.析取运算(P∨Q)3.条件运算(P→Q)4.双条件运算(P←→Q)5.继续/退出(y/n)****************************************************************5. 【算法描述】1.合取运算(P∧Q),P、Q同真时为真,其余为假。
2.析取运算(P∨Q),P、Q同假时为假,其余为真。
3.条件运算(P→Q),P为真,Q为假时,为假,其余为真。
4.双条件运算(P←→Q),P、Q同真同假是为真。
6. 【源程序(带注释)】#include<iostream>#include<stdlib.h>using namespace std;class math{char p,q;int result;public:math(char x,char y);int pdp(char x);int pdq(char y);hequ(char x,char y,int t);xiqu(char x,char y,int t);tiaojian(char x,char y,int t);shuangtiaojian(char x,char y,int t);caidan();};//判断p是否为1或0int math::pdp(char x){int a;p=x;if(x!='0'&&x!='1'){//cout<<"错误"<<endl;a=0;}cin.clear();cin.sync();return a;}//判断q是否为1或0int math::pdq(char y){q=y;int a;if(y!='0'&&y!='1'){//cout<<"错误"<<endl;a=0;}cin.clear();cin.sync();return a;}math::math(char x,char y){p=x;q=y;/*if(x!='0'&&x!='1'){cout<<"错误"<<endl;}else if(y!='0'&&y!='1'){cout<<"错误"<<endl;}*/}//合取运算math::hequ(char x,char y,int t){p=x;q=y;result=t;if(x=='1'&&y=='1') t=1;else t=0;cout<<"真值为:"<<t<<",请继续选择菜单功能:"; }//析取运算math::xiqu(char x,char y,int t){p=x;q=y;result=t;if(x=='0'&&y=='0') t=0;else t=1;cout<<"真值为:"<<t<<",请继续选择菜单功能:"; }//条件运算math::tiaojian(char x,char y,int t){p=x;q=y;result=t;if(x=='1'&&y=='0') t=0;else t=1;cout<<"真值为:"<<t<<",请继续选择菜单功能:"; }//双条件运算math::shuangtiaojian(char x,char y,int t){p=x;q=y;result=t;if(x=y) t=1;else t=0;cout<<"真值为:"<<t<<",请继续选择菜单功能:";}//逻辑运算菜单math::caidan(){cout<<"1. 合取运算(P∧Q)"<<endl;cout<<"2. 析取运算(P∨Q)"<<endl;cout<<"3. 条件运算(P→Q)"<<endl;cout<<"4. 双条件运算(P←→Q)"<<endl;cout<<"5. 退出/继续"<<endl;cout<<"请选择(1-5)要进行的逻辑运算:";}void main(){char x='0',y='0',n,n2;int t;cout<<"请输入变量命题P和Q的值(1或0)"<<endl;math math1(x,y);loop:{cin.clear();cin.sync();//判断P、Q的输入是否正确cout<<"输入P:";x=cin.get();while(math1.pdp(x)==0){cout<<"输入错误,重新输入P:";x=cin.get();}cout<<"输入Q:";y=cin.get();while(math1.pdq(y)==0){cout<<"输入错误,重新输入Q:";y=cin.get();}math1.caidan();}//判断菜单选项while(n){switch(n=cin.get()){case '1':math1.hequ(x,y,t);break;case '2':math1.xiqu(x,y,t);break;case '3':math1.tiaojian(x,y,t);break;case '4':math1.shuangtiaojian(x,y,t);break;case '5':cin.clear();cin.sync();cout<<"y/n:";loop2:{ //判断是否退出switch(n2=cin.get()){case 'y':exit(0);break;case 'n':goto loop;break;default:cin.clear();cin.sync();cout<<"输入错误,请重新选择y/n:";goto loop2;break;}}break;default:cin.clear();cin.sync();cout<<"输入错误,请重新选择菜单!"<<endl;goto loop;break;}cin.clear();cin.sync();}}7.【实验结果与分析总结(含运行结果截图)】输入P,判断P输入是否正确,正确即可输入Q。
离散数学实验报告(一)
一、实验内容:构造任意合式公式的真值表二、实验源码:#include <stdio.h>#include"thesis.h"int main(){Thesis a[30];char x='1';int i=0,N;cout<<"请输入命题变元(不超过30个)(输入'0'结束输入):"<<endl;while(int(x)!=48){cin>>x;if(i>19){cout<<"Error:变元个数太多!"<<endl;break;}if(x!='0'){a[i].inname(x);i++;}}N=i;int M;M=N;string A;cout<<"请输入命题公式( 否定:!,合取:&,析取:| )"<<endl;cin>>A;cout<<A<<"的真值表为:"<<endl;for(int j=0;j<M;j++)cout<<char(a[j].getvalue())<<" ";cout<<"真值"<<endl;assignment(A,N,M,&a[0]);system("pause");return 0;}#include"thesis.h"头文件#ifndef THESIS_H#define THESIS_H#include<string>#include<stdlib.h>#include<iostream>using namespace std;class Thesis //命题类{int value;char name; //value:命题的真值(0/1)name:命题名public:Thesis(){value=2;name='A';};friend Thesis operator !(Thesis &q){q.invalue(1-q.getvalue()); return q;} //重载逻辑运算符friend Thesis operator &(Thesis &p,Thesis &q){p.invalue((p.getvalue()+q.getvalue())/2); return p;}friend Thesis operator |(Thesis &p,Thesis &q){if(p.getvalue()+q.getvalue()>0) p.invalue(1);else p.invalue(0);return p;}friend Thesis operator >(Thesis &p,Thesis &q){if(p.getvalue()==1&&q.getvalue()==0)p.invalue(0);else p.invalue(1);return p;}friend Thesis operator <(Thesis &p,Thesis &q){if(p.getvalue()==q.getvalue()) p.invalue(1);else p.invalue(0);return p;}void invalue(int x){value=x;} //输入valuevoid inname(char x){name=x;} //输入nameint getvalue(){return value;} //获取真值int getname(){return name;} //获取命题名};void assignment(string A,int N,int M,Thesis a[]); //声明函数int bds(string A,int N,Thesis a[]);int run(string A,int &i,int L,int N,Thesis a[]);void assignment(string A,int N,int M,Thesis a[])//命题赋值并计算真值{for(int j=0;j<2;j++){a[N-1].invalue(j);if(N>1){assignment(A,N-1,M,&a[0]);}else{for(int i=0;i<M;i++){cout<<a[i].getvalue()<<" ";}cout<<bds(A,M,&a[0])<<endl;}}}int bds(string A,int N,Thesis a[]) //识别输入的表达式并计算真值{Thesis answer,Temp;char d[5]={'!','|','&','>','<'}; //定义运算符号集合int L;int i=0;L=strlen(&A[0]); //表达式长度while(i<L){if(A[i]=='('){int k=1;for(int j=i+2;j<L;j++){if(k!=0){if(A[j]=='(')k++;if(A[j]==')')k--;}if(k==0){int l=j-i-1;char *p=new char[l+1];string B;for(int m=0;m<l;m++)p[m]=A[i+1+m];p[l]='\0';B=p;delete p;Temp.invalue(bds(B,N,&a[0]));if(i==0)answer.invalue(Temp.getvalue());i=j+1;break;}}}else{if(A[i]=='!') //否定的计算{Temp.invalue(run(A,i,L,N,&a[0]));answer=!Temp;i++;continue;}else if(A[i]=='|'){Temp.invalue(run(A,i,L,N,&a[0]));answer=answer|Temp;i++;continue;}else if(A[i]=='&'){Temp.invalue(run(A,i,L,N,&a[0]));answer=answer&Temp;i++;continue;}else if(A[i]=='<'){Temp.invalue(run(A,i,L,N,&a[0]));answer=answer<Temp;i++;continue;}else if(A[i]=='>'){Temp.invalue(run(A,i,L,N,&a[0]));answer=answer>Temp;i++;continue;}else{for(int j=0;j<N;j++){if(A[i]==char(a[j].getname())){Temp.invalue(a[j].getvalue());if(i==0)answer.invalue(Temp.getvalue());i++;break;}}}}}return answer.getvalue();}int run(string A,int &i,int L,int N,Thesis a[]) {Thesis Temp;if(A[i+1]=='('){int k=1;for(int j=i+2;j<L;j++){if(k!=0){if(A[j]=='(')k++;if(A[j]==')')k--;}if(k==0){int l=j-i-1;char *p=new char[l+1];string B;for(int m=0;m<l-1;m++)p[m]=A[i+2+m];p[l-1]='\0';B=p;delete p;Temp.invalue(bds(B,N,&a[0]));i=i+j;break;}}}else{int j=0;while(j<L){if(A[i+1]==char(a[j].getname())){i++;Temp=a[j];break;}j++;}}return Temp.getvalue(); }#endif三、运行结果。
离散数学上机实验报告 离散数学实验报告:建立关系矩阵实验
离散数学上机实验报告离散数学实验报告:建
立关系矩阵实验
__大学离散数学实验报告建立关系矩阵实验姓名:____
专业:
软件工程班级:
3 学号:
1325116025 日期:
20__.10月7日 1、摘要:建立关系矩阵实验的目的是理解并掌握关系的矩阵表示方法、为用序偶集合表示的关系建立相应的关系矩阵。
学会用所学过的程序设计语言编程,解决关系矩阵的自动建立问题。
实验的内容是用二维数组或向量存储关系矩阵,根据输入的用序偶集合表示的关系,建立相应的关系矩阵。
用建立二维数组的方法构造关系矩阵。
分别输入两个用序偶集合表示的关系作为实验数据,然后建立两个数组之间的关系,得到一个关系矩阵。
关系矩阵一开始初始化为0,建立成功的关系体现为1。
最后得到一个完整的矩阵。
一.导言 2、 1) 问题的描述。
实验的目标是如何为用序偶集合表示的关系建立相应的关系矩阵,解决关系矩阵的自动建立问题。
2) 拟采用的方法用建立二维数组的方法来解决建立关系矩阵。
首先建立两个数组分别代表行和列,然后建立一个新的二维数组,将其初始化为零,集合之间的关系对应真值表,所以在这个二维数组中两个集合的关系就被表示为1,然后就相应地建立了两个集合的关系矩阵。
二.实验过程 1) 算法思想流程 1.申请两个字符型数组用来储存集合元素。
2.建立二维数组然后初始化为0.
3.判断关系是否存在,存在则赋值为1。
4输入数值然后输出关系矩阵。
2)程序流程图开始 P=0 switch P=0
P=’a’&&j=’a’&&j=’a’||j。
离散数学实验报告
离散数学实验报告————————————————————————————————作者:————————————————————————————————日期:ﻩ重庆交通大学学生实验报告实验课程名称离散数学开课实验室数学实验室学院理学院专业信息与计算科学学生姓名谭冰学号631122020212班级2班开课时间2011 至2012学年第二学期教师评语:总成绩教师签名ﻬ目录实验一:教材第17页习题(1)(b);教材第39页习题(4)(b)…………3.实验二:教材第127页习题(2)(b);教材第113页习题(2)(b)9ﻩ实验一(此实验包含两题)一、实验内容1.从键盘输入两个命题变元P和Q的真值,求它们的非,合取,析取,条件和双条件的真值。
2.求任意一个命题公式的真值表。
二、实验目的熟悉掌握命题逻辑中的联接词,真值表,主范式等,进一步能用它们来解决实际问题。
三、实验环境MATLAB软件的编程环境实现四、实现两题的算法与原理(教材第17页习题(1)(b),39页习题(4)(d))根据析取,合取的定义可用简单的算术运算求出结果,并将结果转换成逻辑值。
同样根据等价关系可将条件式及双条件式转换成析取和合取的运算。
五、实验数据及结果分析实验所用函数:functiony=Not(x)if x==0y=1;else y=0;endfunction m=Vee(x,y)ifx==0&y==0m=0;else m=1;endfunction y=Wedge(P,Q)ifP==1&Q==1y=1;else y=0;endfunction y=If(P,Q)y=Vee(Not(P),Q);endfunctiony=Hh(P,Q,R)y=Vee(Wedge(P,R),If(P,Q));endfunction y=Ss(P,Q,R)y=Wedge(If(P,Wedge(Q,R)),If(Not(P),Wedge(Not(Q),Not(R))));endA=[0 000 010 100 1 11 0 01 0 11101 1 1];P=A(:,1);Q=A(:,2);R=A(:,3);In=input(‘请输入含有三个变元的命题公式:’);S={‘真值表为’};T=num2str([P,Q,R,In]);T%保存命名为Zzb'此为求(P→(Q∧R))∧(¬P→(¬Q∧¬R))主析取范式、主合取范式的程序,并判断是否为重言式,以K代替其真值'P=[0 0 00 11 1 1];Q=[00 1 1 0 0 11];R=[0 1 0 1 0 1 0 1];' P QR'Z=[P;Q;R]'K=Wedge(If(P,Wedge(Q,R)),If(Not(P),Wedge(Not(Q),Not(R))));'主析取范式:'A=[];V=[];for i=find(K)switch icase 1A=[A,'(¬P∧¬Q∧¬R)∨'];case 2A=[A,'(¬P∧¬Q∧R)∨'];case 3A=[A,'(¬P∧Q∧¬R)∨'];case 4A=[A,'(¬P∧Q∧R)∨'];case 5A=[A,'(P∧¬Q∧¬R)∨'];case 6A=[A,'(P∧¬Q∧R)∨'];case 7A=[A,'(P∧Q¬∧R)∨'];case 8A=[A,'(P∧Q∧R)'];otherwise'此为永假式'endendA'主合取范式'for i=find(Not(K))switch icase1V=[V,'(P∨Q∨R)∧'];case 2V=[V,'(P∨Q¬∨R)∧'];case 3V=[V,'(P∨¬Q∨R)∧'];case 4V=[V,'(P∨¬Q∨¬R)∧'];case 5V=[V,'(¬P∨Q∨R)∧'];case 6V=[V,'(¬P∨Q∨¬R)∧'];case 7V=[V,'(¬P∨¬Q∨R)∧'];case 8V=[V,'(¬P∨¬Q∨¬R)'];otherwise'此为永真式'endendVif all(K)==1'K是重言式'else'K不是重言式'end %保存文件名为ZyP17 (1) (b):(P∧R)∨(P→Q)运行过程及结果:>> P=[00 0 0 1 11 1],Q=[0 0 1 1 0 0 11],R=[010 1 0 1 0 1]P=0 0 0 0 1 1 1 1Q=0 0 1 1 001 1R =0 1 0 1 0 1 0 1>> Zzb本程序可以求真值表, 请输入含有三个变元的命题公式: Vee(Wedge(P,R),If(P,Q))T =00 0 10 0 1 10 1 0 10 1 1 1100 01 0 1 11 1 0 11111P39 (4)(d):(P→(Q∧R))∧(¬P→(¬Q∧¬R))运行过程及结果:>>Zyans =此为求(P→(Q∧R))∧(¬P→(¬Q∧¬R))主析取范式、主合取范式的程序,并判断是否为重言式,以K代替其真值ans =P QRZ =0 0000 10 1 00 1 11 0 01 0 11 1 01 1 1ans =主析取范式:A =(¬P∧¬Q∧¬R)∨(P∧Q∧R)ans =主合取范式V=(P∨Q¬∨R)∧(P∨¬Q∨R)∧(P∨¬Q∨¬R)∧(¬P∨Q∨R)∧(¬P∨Q∨¬R)∧(¬P∨¬Q∨R)ans =K不是重言式六、收获与体会通过实验使我了解了一些数理逻辑问题可以通过用计算编程的方法来解决,一些定理的证明同样也可以用计算机通过将命题符号化来编程解决。
离散数学实验1
“离散数学”实验报告(实验1)专业班级学号姓名目录一.实验目的; ....................................... - 1 -二.实验内容; ....................................... - 2 -1. 逻辑联接词的运算 ..................................................................................................... - 2 -2. 求任意一个命题公式的真值表 ................................................................................. - 2 -三.实验环境; ....................................... - 2 -四. 实验原理和实现进程(算法描述);................. - 2 -1.实验原理 ....................................................................................................................... - 2 -2.实验进程 ....................................................................................................................... - 3 -五.实验数据及结果分析;.............................. - 7 -题A:................................................................................................................................ - 7 - B,C题:............................................................................................................................ - 9 - 六. 源程序清单; ................................... - 13 -A题部份源代码: .......................................................................................................... - 13 - tt:printf("***************************************\n");其他收成和体会。
离散数学II课程实验题(代数部分)上机作业
离散数学A(II)课程实验题(代数) hj120828一、基本要求:1、可选用C或C++等编程语言或平台进行编程实验,不可直接选用非自编算法库内容。
2、实验内容可在课程提供的实验题中选,或自己设计问题与相关算法题。
3、按时间及任务要求提交实验中完成的程序代码、可执行程序、程序开发说明文档,内容包括实验数据与结果等。
二、代数结构部分题1、设V1=<{a1, a2}, max >和V2=<{b1, b2}, min >是两个数系统, 其中max (x, y)表示x与y 中较大的数;min (x, y)表示x与y中较小的数。
max和min可以看作二元运算。
输入a1, a2, b1, b2为整数, 考虑积代数V1 × V2.(1)设积代数中的二元运算为*运算,输出它的运算表(2)输出积代数的单位元和零元2、设代数系统V1=<A, •>、V2=<A, ∗>、 V3=<A, ⊙>、 V4=<A, △>,A={ x|x∈Z,1≤x≤20},a•b= 2a+b,a∗b=max(a, b),a⊙b=(a+b) mod8 + 2,a△b=min(a-b),试设计算法并编程实验,要求:(1)试判断V1、V2、V3、V4是否为代数系统。
(2)试判断这些代数系统是否有左单位元与右单位元、零元,如存在,请求出。
(3)试分别判断代数系统中的运算是否满足交换律、结合律、幂等律、分配律、吸收律。
(4)试判断这些代数系统之间是否可以建立同态、同构映射,如存在,试建立。
3、设Klein四元群<G, *>,其中G={e,a,b,c},*运算表示如下,试设计算法并编程验证<G, *>是群。
*e a b cE e a b ca a e c bb bc e aC c b a e4、试设计算法并编程求出模6加群<Z6,+6>的子群。
离散数学实验指导书及其答案
实验一命题逻辑公式化简【实验目的】加深对五个基本联结词(否定、合取、析取、条件、双条件)的理解、掌握利用基本等价公式化简公式的方法。
【实验内容】用化简命题逻辑公式的方法设计一个表决开关电路。
实验用例:用化简命题逻辑公式的方法设计一个5人表决开关电路,要求3人以上(含3人)同意则表决通过(表决开关亮)。
【实验原理和方法】(1)写出5人表决开关电路真值表,从真值表得出5人表决开关电路的主合取公式(或主析取公式),将公式化简成尽可能含五个基本联结词最少的等价公式。
(2)上面公式中的每一个联结词是一个开关元件,将它们定义成C语言中的函数。
(3)输入5人表决值(0或1),调用上面定义的函数,将5人表决开关电路真值表的等价公式写成一个函数表达式。
(4)输出函数表达式的结果,如果是1,则表明表决通过,否则表决不通过。
参考代码:#include<stdio.h>int vote(int a,int b,int c,int d,int e){//五人中任取三人的不同的取法有10种。
i f( a&&b&&c || a&&b&&d || a&&b&&e || a&&c&&d || a&&c&&e || a&&d&&e || b&&c&&d || b&&c&&e || b&&d&&e || c&&d&&e)return 1;e lsereturn 0;}void main(){i nt a,b,c,d,e;p rintf("请输入第五个人的表决值(0或1,空格分开):");s canf("%d%d%d%d%d",&a,&b,&c,&d,&e);i f(vote(a,b,c,d,e))printf("很好,表决通过!\n");e lseprintf("遗憾,表决没有通过!\n");}//注:联结词不定义成函数,否则太繁实验二命题逻辑推理【实验目的】加深对命题逻辑推理方法的理解。
河北工业大学-离散数学综合实验一
河北⼯业⼤学-离散数学综合实验⼀实验⼀计算器设计与实现⼀、实验⽬的与要求实验⽬的:锻炼可视化编程能⼒实验要求:1、熟悉VC++编程环境。
2、运⽤C++程序设计知识对实验题⽬进⾏分析和设计。
3、进⾏程序编写和调试⼯作。
⼆、实验内容使⽤MFC框架在Visual Studio 6.0环境下编写⼀个简易的计算器,能实现简单的加、减、乘、除四则运算,并加⼊特定的⼀些效果,如使计算器的颜⾊在红⾊,绿⾊和蓝⾊之间轮流变换等。
完成诸如计算器对话框的创建、控件编辑、界⾯设计、关键功能的实现等⼯作。
三、实现⽅法1、设计界⾯。
创建⼀个对话框,在对话框中添加⽂本框⽤来显⽰计算结果,按钮:0-9、⼩数点、+、-、*、/、=等。
2、实现各个按钮的功能。
3、实现简单的语法分析,保证正确的计算结果。
4、实现颜⾊的变换。
四、程序源代码// caaDlg.cpp : implementation file//#include "stdafx.h"#include "caa.h"#include "caaDlg.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif//////////////////////////////////////////////////////////////////// /////////// CAboutDlg dialog used for App Aboutint m=0,n=255,k=0; //定义全局变量改变窗体颜⾊class CAboutDlg : public CDialog{public:CAboutDlg();// Dialog Data//{{AFX_DATA(CAboutDlg)enum { IDD = IDD_ABOUTBOX };//}}AFX_DATA// ClassWizard generated virtual function overrides//{{AFX_VIRTUAL(CAboutDlg)protected:virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL// Implementationprotected://{{AFX_MSG(CAboutDlg)//}}AFX_MSGDECLARE_MESSAGE_MAP()};CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD){//{{AFX_DATA_INIT(CAboutDlg)//}}AFX_DATA_INIT}void CAboutDlg::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(CAboutDlg)//}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)//{{AFX_MSG_MAP(CAboutDlg)// No message handlers//}}AFX_MSG_MAPEND_MESSAGE_MAP()//////////////////////////////////////////////////////////////////// /////////// CCaaDlg dialogCCaaDlg::CCaaDlg(CWnd* pParent /*=NULL*/): CDialog(CCaaDlg::IDD, pParent){//{{AFX_DATA_INIT(CCaaDlg)m_result = _T("");//}}AFX_DATA_INIT// Note that LoadIcon does not require a subsequent DestroyIcon in Win32m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);/******************************************************************* *******/m_coff=0.1f; //为变量进⾏初始m_bCoff=0; //为变量进⾏初始m_errorState = ErrNone; //为变量进⾏初始m_bOperandAvail=FALSE; //为变量进⾏初始m_operator=OpNone;m_accum=0;/**************************************************************************/}void CCaaDlg::DoDataExchange(CDataExchange* pDX) {CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(CCaaDlg)DDX_Text(pDX, IDC_EDIT, m_result);//}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(CCaaDlg, CDialog)//{{AFX_MSG_MAP(CCaaDlg)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_WM_CTLCOLOR()ON_BN_CLICKED(IDC_BUTTON1, On7)ON_BN_CLICKED(IDC_BUTTON2, On8)ON_BN_CLICKED(IDC_BUTTON3, On9)ON_BN_CLICKED(IDC_BUTTON6, On4)ON_BN_CLICKED(IDC_BUTTON7, On5)ON_BN_CLICKED(IDC_BUTTON8, On6)ON_BN_CLICKED(IDC_BUTTON11, On1)ON_BN_CLICKED(IDC_BUTTON12, On2)ON_BN_CLICKED(IDC_BUTTON14, On3)ON_BN_CLICKED(IDC_BUTTON17, On0)ON_BN_CLICKED(IDC_BUTTON18, Ondian)ON_BN_CLICKED(IDC_BUTTON19, Onclear)ON_BN_CLICKED(IDC_BUTTON22, Ondengyu)ON_BN_CLICKED(IDC_BUTTON4, Onjia)ON_BN_CLICKED(IDC_BUTTON5, Onjian)ON_BN_CLICKED(IDC_BUTTON9, Oncheng)ON_BN_CLICKED(IDC_BUTTON10, Onchu)ON_BN_CLICKED(IDC_BUTTON13, Onhongse)ON_BN_CLICKED(IDC_BUTTON20, Onlanse)ON_BN_CLICKED(IDC_BUTTON21, Onlvse)ON_BN_CLICKED(IDC_BUTTON24, Onhuangse)ON_BN_CLICKED(IDC_BUTTON15, OnCANCEL)//}}AFX_MSG_MAPEND_MESSAGE_MAP()//////////////////////////////////////////////////////////////////// /////////// CCaaDlg message handlersBOOL CCaaDlg::OnInitDialog(){CDialog::OnInitDialog();// Add "About..." menu item to system menu.// IDM_ABOUTBOX must be in the system command range.ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000);CMenu* pSysMenu = GetSystemMenu(FALSE);if (pSysMenu != NULL){CString strAboutMenu;strAboutMenu.LoadString(IDS_ABOUTBOX);if (!strAboutMenu.IsEmpty()){pSysMenu->AppendMenu(MF_SEPARATOR);pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); }}// Set the icon for this dialog. The framework does this automatically// when the application's main window is not a dialogSetIcon(m_hIcon, TRUE); // Set big iconSetIcon(m_hIcon, FALSE); // Set small icon// TODO: Add extra initialization herem_brush.CreateSolidBrush(RGB(m, n, k));return TRUE; // return TRUE unless you set the focus to a control }void CCaaDlg::OnSysCommand(UINT nID, LPARAM lParam)if ((nID & 0xFFF0) == IDM_ABOUTBOX){CAboutDlg dlgAbout;dlgAbout.DoModal();}else{CDialog::OnSysCommand(nID, lParam);}}// If you add a minimize button to your dialog, you will need the code below // to draw the icon. For MFC applications using the document/view model, // this is automatically done for you by the framework.void CCaaDlg::OnPaint(){if (IsIconic()){CPaintDC dc(this); // device context for paintingSendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); // Center icon in client rectangleint cxIcon = GetSystemMetrics(SM_CXICON);int cyIcon = GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(&rect);int x = (rect.Width() - cxIcon + 1) / 2;int y = (rect.Height() - cyIcon + 1) / 2;// Draw the icondc.DrawIcon(x, y, m_hIcon);else{CDialog::OnPaint();}}// The system calls this to obtain the cursor to display while the user// the minimized window.HCURSOR CCaaDlg::OnQueryDragIcon(){return (HCURSOR) m_hIcon;}HBRUSH CCaaDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { // HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);// TODO: Change any attributes of the DC here// TODO: Return a different brush if the default is not desired return m_brush; }/******************************************************************* *********//********************************输⼊模块************************************/void CCaaDlg::OnOperandInput(int a) //处理0-9 数字的输⼊函数{if (m_errorState != ErrNone) //判断当前运算是否有误,若有则返回return;if (!m_bOperandAvail) //判断是否输⼊新的数字,1-是0-否m_operand = 0;if(!m_bCoff) //判断是否是⼩数输⼊,1-是0-否m_operand=m_operand*10+(a); else{m_operand=m_operand+(a)*m_coff;m_coff*=0.1f;}m_bOperandAvail=TRUE;UpdateDisplay(); //更新显⽰}/*******************************计算处理模块*******************************/void CCaaDlg::Calculate() //处理计算函数if (m_errorState != ErrNone)return;if (m_bOperandAvail)//如果没有计算符就将m_operand值赋予m_accumif (m_operator == OpNone)m_accum = m_operand;else if (m_operator == OpMultiply) //否则按计算符进⾏计算m_accum *= m_operand; else if (m_operator == OpDivide){if (m_operand == 0)m_errorState = ErrDivideByZero;elsem_accum /= m_operand;}else if (m_operator == OpAdd)m_accum += m_operand;else if (m_operator == OpSubtract)m_accum -= m_operand;}m_bOperandAvail = FALSE;m_bCoff=0;m_coff=0.1f;UpdateDisplay();}/****************************显⽰模块********************************/void CCaaDlg::UpdateDisplay() //处理显⽰函数{if (GetSafeHwnd() == NULL)return;if (m_errorState != ErrNone)m_result="除数不能为零";else //如果当前计算⽆错误那么进⾏显⽰{//如果是输⼊计算数,那么显⽰输⼊情况,如果按下计算符,则显⽰结果float lVal = (m_bOperandAvail) ? m_operand : m_accum;m_result.Format(_T("%f"), lVal); //将float型转化为CString型int i=m_result.GetLength();while(m_result.GetAt(i-1)=='0'){m_result.Delete(i-1,1);i-=1;}}//⽤编辑控件变量m_result改变编辑控件的值,更新显⽰UpdateData(FALSE);}/******************************************************************* *****/// The system calls this to obtain the cursor to display while the user drags// the minimized window.void CCaaDlg::Ondengyu(){// TODO: Add your control notification handler code hereCalculate();m_operator = OpNone;}void CCaaDlg::On0(){// TODO: Add your control notification handler code here OnOperandInput(0);}void CCaaDlg::On1(){// TODO: Add your control notification handler code here OnOperandInput(1);}void CCaaDlg::On2(){// TODO: Add your control notification handler code here OnOperandInput(2); }void CCaaDlg::On3(){// TODO: Add your control notification handler code here OnOperandInput(3); }void CCaaDlg::On4()// TODO: Add your control notification handler code here OnOperandInput(4); }void CCaaDlg::On5(){// TODO: Add your control notification handler code here OnOperandInput(5); }void CCaaDlg::On6(){// TODO: Add your control notification handler code here OnOperandInput(6); }void CCaaDlg::On7(){// TODO: Add your control notification handler code here OnOperandInput(7); }void CCaaDlg::On8(){// TODO: Add your control notification handler code here OnOperandInput(8); }void CCaaDlg::On9(){// TODO: Add your control notification handler code here OnOperandInput(9);}void CCaaDlg::Oncheng(){// TODO: Add your control notification handler code hereCalculate();m_operator = OpMultiply ;}void CCaaDlg::Onchu(){// TODO: Add your control notification handler code herCalculate();m_operator = OpDivide;void CCaaDlg::Onjia(){// TODO: Add your control notification handler code hereCalculate();m_operator = OpAdd;}void CCaaDlg::Onjian(){// TODO: Add your control notification handler code hereCalculate();m_operator = OpSubtract;}void CCaaDlg::Ondian(){// TODO: Add your control notification handler code herem_bCoff=1;UpdateDisplay();}void CCaaDlg::Onclear(){// TODO: Add your control notification handler code herem_coff=0.1f; //为变量进⾏还原m_bCoff=0; //为变量进⾏还原m_errorState = ErrNone; //为变量进⾏还原m_bOperandAvail=FALSE; //为变量进⾏还原m_operator=OpNone;m_accum=0;m_operand=0;Calculate();m_operator = OpNone;UpdateData(FALSE);}void CCaaDlg::Onhongse(){// TODO: Add your control notification handler code herem_brush.DeleteObject();Invalidate();m = 220;n = 20;k = 60;m_brush.CreateSolidBrush(RGB(m, n, k));UpdateWindow();}void CCaaDlg::Onlanse(){// TODO: Add your control notification handler code herem_brush.DeleteObject();Invalidate();m = 0;n = 0;k = 255;m_brush.CreateSolidBrush(RGB(m, n, k));UpdateWindow();}void CCaaDlg::Onlvse(){// TODO: Add your control notification handler code herem_brush.DeleteObject();Invalidate();m = 0;n = 255;k = 127;m_brush.CreateSolidBrush(RGB(m, n, k));UpdateWindow();}void CCaaDlg::Onhuangse(){// TODO: Add your control notification handler code here m_brush.DeleteObject(); Invalidate();m = 255;n = 255;k = 0;m_brush.CreateSolidBrush(RGB(m, n, k));UpdateWindow();}void CCaaDlg::OnCANCEL(){// TODO: Add your control notification handler code hereCCaaDlg::OnCANCEL();}六、程序截图七、实验总结通过对MFC课程的学习我掌握了MFC开发控件的基础能⼒,利⽤基本的菜单和窗体⼯具可以创建⼀些⾃⼰想要的窗体和控件,并按照⾃⼰的意愿设置属性。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验1
1实验内容
(1)求任意一个命题公式的真值表。
(2)利用真值表求任意一个命题公式的主范式。
(3)利用真值表进行逻辑推理。
注:(2)和(3)可在(1)的基础上完成。
2实验目的
真值表是命题逻辑中的一个十分重要的概念,利用它几乎可以解决命题逻辑中的所有问题。
例如,利用命题公式的真值表,可以判断命题公式的类型、求命题公式的主范式、判断两命题公式是否等价,还可以进行推理等。
本实验通过编写一个程序,让计算机给出命题公式的真值表,并在此基础上进行命题公式类型的判定、求命题公式的主范式等。
目的是让学生更加深刻地理解真值表的概念,并掌握真值表的求解方法及其在解决命题逻辑中其他问题中的应用。
3算法的主要思想
利用计算机求命题公式真值表的关键是:①给出命题变元的每一组赋值;②计算命题公式在每一组赋值下的真值。
真值表中命题变元的取值具有如下规律:每列中0 和1 是交替出现的,且0 和1 连续出现的个数相同。
n 个命题变元的每组赋值的生成算法可基于这种思想。
含有n个命题变元的命题公式的真值的计算采用的方法为“算符优先法”。
为了程序实现的方便,约定命题变元只用一个字母表示,非、合取、析取、蕴含和等价联结词分别用!、&、|、-、+来表示。
算符之间的优先关系如表1-1所示:
表1-1算符优先级
优先算法,我们采用两个工作栈。
一个称作OPTR,用以寄存运算符;另一个称作OPND,用以寄存操作数或运算结果。
算法的基本思想是:
(1)首先设置操作数栈为空栈,符号“@”为运算符的栈底元素;
(2)调用函数Divi(exp,myopnd)得到命题公式包含的命题变元序列myopnd (按字典序排列,同一个命题变元只出现一次);
(3)依次读入命题公式中的每个字符,若是命题变元则其对应的赋值进OPND 栈,若是运算符,则和OPTR栈的栈顶运算符比较后作相应操作,直至整个命题公式求值完毕。