关于“集合的运算:交、并、补”的问题
全集:大写字母 ‘A’~’Z’要求实现以下功能:
1、集合的输入:自动去掉重复和非法的字符
2、集合的显示:输出集合的全部元素
3、输出一个给定集合的补集
4、输出两个给定集合的交集和并集
还有要求就是能输入无限个字符,不能定义一个范围,之前我写了两个程序交给老师都说不行,说要用链表来建一个动态数组,希望有人能帮帮我写一个给我,下面附上我写的两个程序,或者有人可以改一下我的程序达到要求
如有写好了的,请发给我邮箱376216527@谢谢!
程序1:
#include<iostream.h>
#include "stdlib.h"
class A
{
private:
int size;
char str[25];
char strb[25];
int sizeb;
public:
int mark[25];
A(char s[]);
~A(){};
void bu();
void show();
};
A::A(char s[25])
{
int i=0,j=0;
for(int q=0;q<25;q++)
{mark[q]=0;}
while(s[i]!='*')
{ int k=65;
if((s[i]+1>'A')&&(s[i]-1<'Z'))
{
while(s[i]-k!=0)
{
k++;
}
mark[k-65]=mark[k-65]+1;
if(mark[k-65]<2)
{
str[j]=s[i];
j++;
}
else
mark[k-65]--;
}
i++;
}
size=j;
str[j+1]='#';
}
void A::bu()
{
int p=26;
for(int i=0,j=0;i<p;i++)
{
if(mark[i]!=1)
{
strb[j]='A'+i;
j++;
}
}
sizeb=j;
}
void A::show()
{
cout<<"你输入的集合是:";
for(int i=0;i!=size;++i)
{
cout<<str[i];
}
cout<<endl;
cout<<"你输入的集合的补集是:";
for(i=0;i!=sizeb;++i)
{
cout<<strb[i];
}
cout<<endl;
}
void main()
{
int s,s2;
char mystr3[25];
char mystr4[25];
char mystr[25];
cout<<"请输入一个字符的集合,并以*结束:"<<endl;
cin>>mystr;
A myA(mystr);
myA.bu();
myA.show();
char mystr2[25];
cout<<"请输入另一个字符集合,并以*结束:"<<endl;
cin>>mystr2;
A myA2(mystr2);
myA2.bu();
myA2.show();
for(int i=0,j=0;i<24;i++)
{
if((myA.mark[i]==1)&&(myA2.mark[i]==1))
{
mystr3[j]='A'+i;
j++;
}
s=j;
}
cout<<"这2个集合的交集是:";
for(i=0;i!=s;++i)
{
cout<<mystr3[i];
}
cout<<endl;
cout<<"这2个集合的并集是:";
for(i=0,j=0;i<24;i++)
{
if((myA.mark[i]==1)||(myA2.mark[i]==1))
{
mystr4[j]='A'+i;
j++;
}
s2=j;
}
for(i=0;i!=s2;++i)
{
cout<<mystr4[i];
}
cout<<endl;
}
程序2:
#include "stdafx.h"
#include "operation.h"
#include <stdlib.h>
#include <windows.h>
void main()
{
SetConsoleTitle("集合运算器 Ver 1.0");
cout<<"集合运算器 Ver 1.0 "<<endl;
cout<<"全集为26个大写英文字母A-Z"<<endl;
cout<<"*************************************************************"<<endl;
operation n;
set k;
int i;
char str1[26],str2[26];
while(1)
{
cout<<" 1、集合并运算 "<<endl;
cout<<" 2、集合交运算 "<<endl;
cout<<" 3、集合补运算 "<<endl;
cout<<" 4、退出"<<endl;
cout<<"*************************************************************"<<endl;
cout<<"请选择你需要的功能:"<<endl;
cin>>i;
if(!cin)
{
cerr<<"输入错误,请重新输入需要的功能!"<<endl;
cin.clear(); //清空输入标志
cin.sync(); //更改输入缓冲区
continue;
}
switch(i)
{
case 1:
cin.clear();
cin.sync();
cout<<"你选择的是集合并运算"<<endl;
cout<<"请输入一个集合:"<<endl;
cin.getline(str1,26,'\n'); //输入字符数组str1,当超过26个字符,和遇到回车结束,防止溢出缓冲区
k.input(str1);
cout<<"你输入的集合为:";
k.output();
k.cleaninput(); //每输出完一次都需清空一次输入标志,否则下次输出会出现错误
cout<<"请输入另一个集合:"<<endl;
cin.getline(str2,26,'\n');
k.input(str2);
cout<<"你第二个输入的集合为:";
k.output();
k.cleaninput();
cout<<endl;
cout<<"两个集合的并集为:";
n.Union(str1,str2);
break;
case 2:
cin.clear();
cin.sync();
cout<<"你选择的是集合交运算"<<endl;
cout<<"请输入一个集合:"<<endl;
cin.getline(str1,26,'\n');
k.input(str1);
cout<<"你输入的集合为:";
k.output();
k.cleaninput();
cout<<"请输入另一个集合:"<<endl;
cin.getline(str2,26,'\n');
k.input(str2);
cout<<"你第二个输入的集合为:";
k.output();
k.cleaninput();
cout<<endl;
cout<<"两个集合的交集为:";
n.Intersection(str1,str2);
break;
case 3:
cin.clear();
cin.sync();
cout<<"你选择的是集合补运算"<<endl;
cout<<"请输入一个集合:"<<endl;
cin.getline(str1,27,'\n');
k.input(str1);
cout<<"你输入的集合为:";
k.output();
k.cleaninput();
cout<<endl;
cout<<"你输入集合的补集为:";
n.Except(str1);
break;
case 4:
cout<<"感谢你的使用!"<<endl;
exit(0);
default:
cerr<<"输入错误,请重新输入需要的功能!"<<endl;
break;
}
}
}
[ 本帖最后由 qvbfnyga 于 2009-10-18 03:11 编辑 ]