1、這個程序只能處理不超過100個數的集合;
2、同壹集合中不能有相同元素出現,差運算只求s1-s2;
3、輸入格式中,“-1”被當作結束標誌,不是有效的數字,當然有必要的話可以改成其他數值;
4、程序是循環進行的,想結束的話直接關掉Dos窗口。
VC下我已經編譯測試過,只需新建壹個“Win32 Console Application”工程,控制臺程序選擇“壹個簡單程序”,然後用下面程序覆蓋掉原來的主函數,原來的頭文件#include "stdafx.h"不能動,不然會抱錯。測試數據的過程是:
輸入集合s1的元素(輸入壹個回車壹下,-1表示結束):
5
8
78
69
21
10
-1
輸入集合s2的元素(輸入壹個回車壹下,-1表示結束):
8
75
88
32
21
76
45
69
-1
選擇s1和s2的操作類型:1、交(s1 n s2),2、並(s1 U s2),3、差(s1 - s2)
輸入對應的數字,然後回車):1
s1和s2求交運算的結果:8 69 21
選擇s1和s2的操作類型:1、交(s1 n s2),2、並(s1 U s2),3、差(s1 - s2)
輸入對應的數字,然後回車):2
s1和s2求並運算的結果:57 78 10 8 75 88 32 21 76 45 69
選擇s1和s2的操作類型:1、交(s1 n s2),2、並(s1 U s2),3、差(s1 - s2)
輸入對應的數字,然後回車):3
s1和s2求差運算的結果:5 78 10
附程序:
/////////////////////////////////////
#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
int value;
}NODE;
void main()
{
int AND(NODE *s1,int count1,NODE *s2,int count2,NODE *and);
int OR(NODE *s1,int count1,NODE *s2,int count2,NODE *or);
int DIFFER(NODE *s1,int count1,NODE *s2,int count2,NODE *differ);
int count1=0;
int count2=0;
int count;
int data=0,i,j,state;
NODE *or,*and,*differ;
NODE *s1,*s2;
s1=(NODE*)malloc(100*sizeof(int));
s2=(NODE*)malloc(100*sizeof(int));
and=(NODE*)malloc(100*sizeof(int));
or=(NODE*)malloc(200*sizeof(int));
differ=(NODE*)malloc(100*sizeof(int));
printf("輸入集合s1的元素(輸入壹個回車壹下,-1表示結束):\n");
while(data!=-1)
{
scanf("%d",&data);
(s1+count1++)->value=data;
}
data=0;
printf("輸入集合s2的元素(輸入壹個回車壹下,-1表示結束):\n");
while(data!=-1)
{
scanf("%d",&data);
(s2+count2++)->value=data;
}
while(1)
{
count=0;
printf("選擇s1和s2的操作類型:1、交(s1 n s2),2、並(s1 U s2),3、差(s1 - s2)\n");
printf("(輸入對應的數字,然後回車):");
scanf("%d",&state);
switch(state)
{
case 1:
{
count=AND(s1,count1,s2,count2,and);
printf("s1和s2求交運算的結果:");
if(count==0)
printf("NULL");
else
{
for(i=0;i<count;i++)
printf(" %d",(and+i)->value);
}
break;
}
case 2:
{
count=OR(s1,count1,s2,count2,or);
printf("s1和s2求並運算的結果:");
if(count==0)
printf("NULL");
else
{
for(i=0;i<count;i++)
printf(" %d",(or+i)->value);
}
break;
}
case 3:
{
count=DIFFER(s1,count1,s2,count2,differ);
printf("s1和s2求差運算的結果:");
if(count==0)
printf("NULL");
else
{
for(i=0;i<count;i++)
printf(" %d",(differ+i)->value);
}
break;
}
}
printf("\n\n");
}
}
int AND(NODE *s1,int count1,NODE *s2,int count2,NODE *and)
{
int i,j;
int count=0;
if(count1==0||count2==0)
{
printf("NULL");
return 0;
}
else
{
for(i=0;i<count1-1;i++)
{
for(j=0;j<count2-1;j++)
{
if((s1+i)->value==(s2+j)->value)
{
(and+count++)->value=(s1+i)->value;
break;
}
}
}
}
return count;
}
int OR(NODE *s1,int count1,NODE *s2,int count2,NODE *or)
{
int i,j;
int count=0;
int sign[100];
for(i=0;i<100;i++)
sign[i]=0;
if(count1==0)
{
or=s2;
return count2;
}
else if(count2==0)
{
or=s1;
return count1;
}
else
{
for(i=0;i<count1-1;i++)
{
for(j=0;j<count2-1;j++)
{
if((s1+i)->value==(s2+j)->value)
{
sign[i]=1;
break;
}
}
}
for(i=0;i<count1-1;i++)
{
if(sign[i]!=1)
(or+count++)->value=(s1+i)->value;
}
for(i=0;i<count2-1;i++)
{
(or+count++)->value=(s2+i)->value;
}
return count;
}
}
int DIFFER(NODE *s1,int count1,NODE *s2,int count2,NODE *differ)
{
int i,j,sign;
int count=0;
if(count1==0)
{
return 0;
}
else if(count2==0)
{
differ=s1;
return count1;
}
else
{
for(i=0;i<count1-1;i++)
{
sign=0;
for(j=0;j<count2-1;j++)
{
if((s1+i)->value==(s2+j)->value)
{
sign=1;
break;
}
}
if(sign!=1)
{
(differ+count++)->value=(s1+i)->value;
}
}
return count;
}
}