首页 > 用户发贴区 > 编程问题提问区 > 用数组表示集合A和B,实现集合交、差、并操作
2009
01-07

用数组表示集合A和B,实现集合交、差、并操作

   要求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.


那位高手能帮帮我啊 ,急用啊


 


用数组表示集合A和B,实现集合交、差、并操作》有 8 条评论

  1. 尹恒科技 说:

    /*我觉得你给的例子的结果稍微有一点问题。你再看看吧,我觉得我这个程序基本成功了。*/

    #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这样的大数,折半查找就显现出了得天独厚的优势。
    你看看吧,我写的这段可读性还算比较强,函数和变量的名称基本能做见名知意,有错误欢迎指正,我们共同进步。祝你成功!
    */

  2. 尹恒科技 说:

    哦,对了,我再补充一点。我把程序复制到这里后,所有的4个空格全变成一个空格了。为了方便你看,你可以把所有内容复制到VC里以后,在 编辑 菜单 中选择 替换。

    把_ 替换成 ____(4个空格)

    我写下划线,你别写它啊,要打一个空格和四个空格,然后选择 全部替换。

    huorongabc@yahoo.com.cn,欢迎交流。

  3. lzq362215976 说:

    [QUOTE=尹恒科技]

    哦,对了,我再补充一点。我把程序复制到这里后,所有的4个空格全变成一个空格了。为了方便你看,你可以把所有内容复制到VC里以后,在 编辑 菜单 中选择 替换。

    把_ 替换成 ____(4个空格)

    我写下划线,你别写它啊,要打一个空格和四个空格,然后选择 全部替换。

    huorongabc@yahoo.com.cn,欢迎交流。

    [/QUOTE]

     

    还真是手把手教哦….

  4. 071242 说:

      谢谢你!

       可是有个问题,在输入集合A时,按空格,后边的字符会存到集合B中 ,要是在输入集合B是按空格(如输入集合B:error data)那么集合B就只是error,少了data.

    能帮我改改吗?要是如下输入,结果就不对了。要改哪?

    例子3:A=012oper4a6tion,B=error data;

    A交B=aorte,A并B=adeinoprt,A-B=inp;

  5. 尹恒科技 说:

    我已经改过了,你再复制回去看看。

    我把input_set函数中的scanf语句改成了gets语句,应该就行了。

  6. 071242 说:

      嗯 ,这次行了,多谢~~      

  7. 071242 说:

        我发现个问题,要是输入集合A=aaaaa.集合B=ssss

    结果输出结果是 A交B=   ;A-B=aaaaa;A并B=aaaaassss;

    这个不对啊,输出结果不应该有重复字符。请教怎么改??? 急~~~~~

  8. 071242 说:

      我添加这个 过滤函数行吗??

    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;
                   }
    }

留下一个回复