离散实验上机作业Word文件下载.docx
《离散实验上机作业Word文件下载.docx》由会员分享,可在线阅读,更多相关《离散实验上机作业Word文件下载.docx(28页珍藏版)》请在冰点文库上搜索。
![离散实验上机作业Word文件下载.docx](https://file1.bingdoc.com/fileroot1/2023-5/5/ca8211ff-4e8d-495c-812f-4e48ab96e8b6/ca8211ff-4e8d-495c-812f-4e48ab96e8b61.gif)
i++)//运用循环输入字符串,按换行键结束
{
scanf("
%c%c"
a[i],&
z);
m++;
//记录字符串的长度
}
z='
f'
//给z赋值,以便写个循环运用
i++)//输入第二个字符串
b[i],&
n++;
}
x=m+n;
//算出字符串的总长
for(i=m;
i<
x;
i++)//将字符串b接在字符串a的后面
a[i]=b[y++];
(m+n-1);
i++)//将相邻的字符串删去
for(j=i+1;
j<
j++)
if(a[i]==a[j])
{
for(k=j;
k<
k++)
a[k]=a[k+1];
x--;
j--;
}
printf("
集合的并集为:
"
for(i=0;
i++)//输出合并后的字符串
printf("
%4c"
a[i]);
if(d==2)
i++)//输入两个字符串
z'
i++)
m;
i++)//找出数组a与数组b中相同的元素存放于数组c中
for(j=0;
n;
if(a[i]==b[j])
c[x]=a[i];
x++;
集合的交集为:
x+1;
i++)//输出交集
c[i]);
if(d==3)//求集合的差集
i++)//输入字符串
{scanf("
m++;
n++;
i++)//将a中存在b中不存在的字符删去
{
for(k=i;
i--;
m--;
集合a对b的差集为:
i++)//输出差集
if(d==4)//求集合的补集
i++)//b是a的子集,将a中b的元素全部删去
if(b[i]==a[j])
{for(k=j;
a[k]=a[k+1];
j--;
m--;
集合b关于a的补集为:
a[i]);
if(d==5)//求两集合的对称差
i++)//将a,b中相同的元素删去,剩余的链接起来,输出
for(x=i;
x<
x++)
a[x]=a[x+1];
for(y=j;
y<
y++)
b[y]=b[y+1];
i--;
n--;
for(z=m;
z<
m+n;
z++)//将删除后的字符串连接起来
a[z]=b[k++];
集合a,b的对称差为:
i++)//输出a,b的对称差
a[i]);
}
求命题公式的真值表、主范式:
#include"
stdio.h"
stdlib.h"
string.h"
conio.h"
math.h"
#defineN50
voidpanduan(intb[N],intf);
//赋值函数
inttkh(charsz[N],charccu[N],inticu[N],inth0);
//分级运算函数
intfkh(charsz[N],charccu[N],inticu[N],inth0);
//主运算函数
main()
inti1,i2,d=1,icu[N],kh=0,jg,j=0,h0;
//icu[N]用于存放变量值,kh括号计数,jg存放结果
intbj=0,hq[N],h=0,x=0,xq[N];
//hq[N]存放合取结果xq[N]存放析取结果
charsz[N],ccu[N],sz0[N],s;
//sz[N]存放式子,ccu[N]存放变量,sz0[N]也是用于存放式子
hq[0]=-1;
xq[0]=-1;
***************************************\n"
//标语
****\n"
**欢迎进入逻辑运算软件**\n"
**(可运算真值表,主范式,支持括号)**\n"
**用!
表示非**\n"
**用&
表示与**\n"
**用|表示或**\n"
**用^表示蕴含**\n"
**用~表示等值**\n"
***************************************\n\n"
请输入一个合法的命题公式:
//输入式子
gets(sz);
//读取式子
strcpy(sz0,sz);
//复制式子
for(i1=0;
i1<
strlen(sz);
i1++)
{
if(sz[i1]=='
)'
||sz[i1]=='
('
)//存储括号数量
kh++;
if(sz[i1]>
a'
&
&
sz[i1]<
||sz[i1]>
A'
Z'
)
for(i2=0;
i2<
j;
i2++)//判断并储存变量。
if(ccu[i2]==sz[i1])//去除重复变量
d=0;
ccu[j]=sz[i1];
j++;
d=1;
\nd该式子中的变量个数为:
%d\n"
j);
//输出变量个数
h0=j;
\n输出真值表如下:
\n\n"
//输出真值表表头
h0;
%c"
ccu[i1]);
"
puts(sz);
i1++)///////先将所有的变量赋值为零。
icu[i1]=0;
i2++)//输出真值表前项
%d"
icu[i2]);
jg=tkh(sz,ccu,icu,h0);
//用函数求结果
if(jg==0)//结果为0,合取加1
hq[h++]=bj;
else//否则,析取加1
xq[x++]=bj;
%d\n"
jg);
//输出运算结果
strcpy(sz,sz0);
(int)pow(2,j)-1;
++bj;
panduan(icu,j-1);
//赋值变量
//恢复被修改的数组。
i2++)
//输出真值表前项
}
if(hq[0]==-1)//不存在合取范式时
\n该命题公式不存在主合取范式。
else
\n该命题公式的主合取范式:
\n\t"
h;
if(i1>
0)//判断并添加符号
/\\"
M(%d)"
hq[i1]);
//输出主合取范式
if(xq[0]==-1)//不存在析取范式时
\n该命题公式不存在主析取范式。
\n\n该命题公式的主析取范式:
\\/"
m(%d)"
xq[i1]);
//输出主析取范式
\n欢迎下次再次使用!
\n"
//结束
getch();
voidpanduan(intb[N],intf)//二进制赋值。
inti;
i=f;
if(b[f]==0)//加1
b[f]=1;
else//进位
b[f]=0;
panduan(b,--i);
inttkh(charsz[N],charccu[N],inticu[N],inth0)//分级运算函数
inti,j,h,s,kh=0,wz[N],a;
charxs1[N],ckh[N];
//xs1用来保存括号内的字符ckh用来保存括号。
s=strlen(sz);
for(i=0;
s;
if(sz[i]=='
||sz[i]=='
)//判断括号
wz[kh]=i;
//存储括号位置
ckh[kh]=sz[i];
//存储括号类型
if(kh==0)
returnfkh(sz,ccu,icu,h0);
//如果无括号,直接运行
kh;
if(ckh[i]=='
)//找到第一个)
break;
for(j=wz[i-1]+1,h=0;
wz[i];
j++,h++)//存储最内级括号中的内容
xs1[h]=sz[j];
xs1[h]='
\0'
a=fkh(xs1,ccu,icu,h0);
//运行最内级括号的式子,得到结果
if(a==1)//判断并存储结果
sz[wz[i-1]]=1;
sz[wz[i-1]]=-2;
for(j=wz[i-1]+1;
s+wz[i-1]-wz[i];
j++)//将括号后内容前移
sz[j]=sz[j+wz[i]-wz[i-1]];
sz[j]='
returntkh(sz,ccu,icu,h0);
//循环执行
intfkh(charsz[N],charccu[N],inticu[N],inth0)//主运算函数
inti,h=0,j=0,j1=0,j2=0,j3=0,j4=0,j5=0,i1,i2,p1=-1,p2=-1,s;
chardt[N];
if(s==1)
if(sz[0]==-2)//判断是否是最后一项
return0;
return1;
//1就是sz[0]的值、
s-j;
i++)//先处理非
!
'
)
if(sz[i+1]==ccu[i1])//将变量赋值并给P1
p1=icu[i1];
if(sz[i+1]==-2)//如果是前运算结果的0,则P1等于0
p1=0;
if(p1==-1)//如果是数字,直接给P1
p1=sz[i+1];
dt[j+2]=!
p1;
//非运算
sz[i]=j+2;
for(i1=i+1;
sz[i1]=sz[i1+1];
//将后续式子前移一项
p1=-1;
j1=j;
s-j1-2*j2;
i++)//处理与
if(sz[i-1]==ccu[i1])//将变量赋值并给P1
if(sz[i+1]==ccu[i1])//将变量赋值并给P2
p2=icu[i1];
for(i2=2;
j+2;
i2++)
if(sz[i-1]==i2)//如果为前计算结果,将结果赋值并给P1
p1=dt[i2];
if(sz[i+1]==i2)//如果为前计算结果,将结果赋值并给P2
p2=dt[i2];
if(sz[i-1]==-2)//如果是前运算结果的0,则P1等于0
if(sz[i+1]==-2)//如果是前运算结果的0,则P2等于0
p2=0;
if(p1==-1)//如果是数字,直接给P1
p1=(int)(sz[i-1]);
if(p2==-1)//如果是数字,直接给P2
p2=(int)(sz[i+1]);
dt[j+2]=p1&
p2;
//与运算
sz[i-1]=j+2;
j2++;
p2=-1;
for(i1=i;
i1++)//将后续式子前移两项
sz[i1]=sz[i1+2];
i=i-1;
s-j1-2*j2-2*j3;
i++)//处理或。
|'
{
if(sz[i+1]==i2)//如果为前计算结果,将结果赋值并给P2
p1=sz[i-1];
p2=sz[i+1];
dt[j+2]=p1||p2;
//或运算
j3++;
i--;
s-j1-2*j2-2*j3-2*j4;
i++)//处理蕴含。
^'
if(sz[i-1]==-2)//如果是前运算结果的0,则P1等于0
p1=0;
if(sz[i+1]==-2)//如果是前运算结果的0,则P2等于0
p2=0;
if(p1==-1)//如果是数字,直接给P1
p1=sz[i-1];
if(p2==-1)//如果是数字,直接给P2
p2=sz[i+1];
dt[j+2]=!
p1||p2;
//蕴含运算
sz[i-1]=j+2;
j++;
j4++;
p1=-1;
p2=-1;
for(i1=i;
sz[i1]=sz[i1+2];
i--;
s-j1-2*j2-2*j3-2*j4-2*j5;
i++)//处理等值。
~'
dt[j+2]=(!
p1||p2)&
(!
p2||p1);
//等值运算
j5++;
returndt[j+1];
//返回结果
对关系性质的验证:
voidfuzhi(inta[50][50],intb[50][50],intn);
voidwarshall(intb[50][50],intn);
{inta[50][50],b[50][50],i,j,n;
请输入关系矩阵的阶数:
n);
请输入%d阶的关系矩阵:
n);
第%d行:
i+1);
for(j=0;
a[i][j]);
//自反闭包
fu