| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2499 人关注过本帖
标题:关于“集合的运算:交、并、补”的问题
只看楼主 加入收藏
qvbfnyga
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2008-1-6
收藏
 问题点数:0 回复次数:4 
关于“集合的运算:交、并、补”的问题
全集:大写字母 ‘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 编辑 ]
搜索更多相关主题的帖子: 运算 
2009-10-18 03:03
松下孤魂
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2009-10-18
收藏
得分:0 
可以的啊
2009-10-18 12:16
qvbfnyga
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2008-1-6
收藏
得分:0 
大哥,我知道是可以的啊,不过老师输入了超过26个字符就不行了,我想知道怎么将数组改成动态数组?
2009-10-18 15:05
CRookie
Rank: 2
等 级:论坛游民
威 望:1
帖 子:7
专家分:10
注 册:2009-10-11
收藏
得分:0 
把你的类结构该一下,然后用new语句动态分配数组
2009-10-18 22:08
cosdos
Rank: 9Rank: 9Rank: 9
来 自:ShangHai
等 级:蜘蛛侠
威 望:6
帖 子:2109
专家分:1385
注 册:2007-6-19
收藏
得分:0 
char str[25];          // 为什么只有25,25个char单元。

—>〉Sun〈<—
2009-10-23 00:48
快速回复:关于“集合的运算:交、并、补”的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016098 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved