要求1:集合输入以回车结束,限定小写字母,可输入重复或非法字符,输出结果程序应自动滤去。命令执行过程:构造集合1;构造集合2,求交集、差集、并集,结束。
例子1:A=gazine,B=paper
A交B=ae;A-B=geinz;A并B=gazinepr.
例子2:A=012icekings,B=silote
A交B=ies;A-B=ckng;A并B=icekingslot.
那位高手能帮帮我啊 ,急用啊
>> 本文固定链接: http://www.vcgood.com/archives/2998
/*我觉得你给的例子的结果稍微有一点问题。你再看看吧,我觉得我这个程序基本成功了。*/
#include “stdio.h”
#include “string.h”
#define LIMIT 80 //所有字符串的长度
void input_set(char a[]); //输入集合的函数
void choosing_order(char a[]); //选择法排序
int whether_found(char c,char a[]); //折半查找法
void make_inter(char a[],char b_ordered[],char result[]); //求交集
void make_minus(char a[],char b_ordered[],char result[]); //求减集
void make_add(char a[],char a_ordered[],char b[],char result[]); //求并集
void main()
{
char a[LIMIT],b[LIMIT],a_ordered[LIMIT],b_ordered[LIMIT]; //a_ordered是a从小到大重新排序的序列
char inter_set[LIMIT],minus_set[LIMIT],add_set[LIMIT]; //这三个分别是最后求的三个结果
printf(“Please enter the set A:\n”); //输入
input_set(a);
printf(“Please enter the set B:\n”);
input_set(b);
strcpy(a_ordered,a); //求x_ordered
strcpy(b_ordered,b);
choosing_order(a_ordered);
choosing_order(b_ordered);
make_inter(a,b_ordered,inter_set); //求最终结果
make_minus(a,b_ordered,minus_set);
make_add(a,a_ordered,b,add_set);
printf(“A is %s\n”,a);
printf(“B is %s\n\n”,b);
printf(“A∩B=%s\n”,inter_set);
printf(“A-B=%s\n”,minus_set);
printf(“A∪B=%s\n”,add_set);
}
void input_set(char a[])
{
char a_temp[LIMIT];
int i,j;
gets(a_temp);
for(i=0,j=0;a_temp[i]!=’\0′;i++)
if(a_temp[i]>=’a’ && a_temp[i]<=’z')
{
a[j]=a_temp[i];
j++;
}
a[j]=’\0′;
}
void choosing_order(char a[])
{
int i,j,k;
char t;
int limit;
limit=strlen(a);
for(i=0;i<limit-1;i++)
{
k=i;
for(j=i+1;j<limit;j++)
if(a[j]<a[k])
k=j;
if(k!=i)
{
t=a[k];
a[k]=a[i];
a[i]=t;
}
}
}
int whether_found(char c,char a[])
{
int left,right,middle,len,result,sign;
result=0;
sign=1;
len=strlen(a);
left=0;
right=len-1;
if(c<a[0] || c>a[len-1])
result=0;
else
{
while(sign==1 && left<=right)
{
middle=(left+right)/2;
if(c==a[middle])
{
result=1;
sign=0;
}
else if(c<a[middle])
right=middle-1;
else
left=middle+1;
}
}
return(result);
}
void make_inter(char a[],char b_ordered[],char result[])
{
int i,j;
for(i=0,j=0;a[i]!=’\0′;i++)
if(whether_found(a[i],b_ordered))
{
result[j]=a[i];
j++;
}
result[j]=’\0′;
}
void make_minus(char a[],char b_ordered[],char result[])
{
int i,j;
for(i=0,j=0;a[i]!=’\0′;i++)
if(whether_found(a[i],b_ordered)==0)
{
result[j]=a[i];
j++;
}
result[j]=’\0′;
}
void make_add(char a[],char a_ordered[],char b[],char result[])
{
int i,j;
for(i=0;a[i]!=’\0′;i++)
result[i]=a[i];
for(j=0;b[j]!=’\0′;j++)
if(whether_found(b[j],a_ordered)==0)
{
result[i]=b[j];
i++;
}
result[i]=’\0′;
}
/*不得不再说两句,你可能觉得我费力气,为什么不直接从字符串里面找字符,非得弄出个x_ordered,再折半查找呢?
我想应该还记得,从头一个一个找和折半查找的效率比较结果吧,假设原字符串有1000个字符,一个一个找平均要找500次,
而折半查找最多只找log(2)1000+1次,也就是大约11次。
当字符串的字符少的时候优势不明显,但像1000这样的大数,折半查找就显现出了得天独厚的优势。
你看看吧,我写的这段可读性还算比较强,函数和变量的名称基本能做见名知意,有错误欢迎指正,我们共同进步。祝你成功!
*/
哦,对了,我再补充一点。我把程序复制到这里后,所有的4个空格全变成一个空格了。为了方便你看,你可以把所有内容复制到VC里以后,在 编辑 菜单 中选择 替换。
把_ 替换成 ____(4个空格)
我写下划线,你别写它啊,要打一个空格和四个空格,然后选择 全部替换。
huorongabc@yahoo.com.cn,欢迎交流。
[QUOTE=尹恒科技]
哦,对了,我再补充一点。我把程序复制到这里后,所有的4个空格全变成一个空格了。为了方便你看,你可以把所有内容复制到VC里以后,在 编辑 菜单 中选择 替换。
把_ 替换成 ____(4个空格)
我写下划线,你别写它啊,要打一个空格和四个空格,然后选择 全部替换。
huorongabc@yahoo.com.cn,欢迎交流。
[/QUOTE]
还真是手把手教哦….
谢谢你!
可是有个问题,在输入集合A时,按空格,后边的字符会存到集合B中 ,要是在输入集合B是按空格(如输入集合B:error data)那么集合B就只是error,少了data.
能帮我改改吗?要是如下输入,结果就不对了。要改哪?
例子3:A=012oper4a6tion,B=error data;
A交B=aorte,A并B=adeinoprt,A-B=inp;
我已经改过了,你再复制回去看看。
我把input_set函数中的scanf语句改成了gets语句,应该就行了。
嗯 ,这次行了,多谢~~
我发现个问题,要是输入集合A=aaaaa.集合B=ssss
结果输出结果是 A交B= ;A-B=aaaaa;A并B=aaaaassss;
这个不对啊,输出结果不应该有重复字符。请教怎么改??? 急~~~~~
我添加这个 过滤函数行吗??
void gl(char a[])//过滤函数
{
int i,p;
for(i=0;i<=LIMIT;i++)
if(a[i]<97||a[i]>122)
a[i]=’ ‘;
else
for(p=0;p<i;p++)
if(a[i]==a[p])
{
a[i]=’ ‘;
break;
}
}