回 帖 发 新 帖 刷新版面

主题:第一次使用运算符重载,出现大量错误,希望大家可以帮帮忙修改。

    编写一个程序,使用类存储字符集合,可以用运算符添加删除字符,也可以用运算符将两个集合相加、相减。
    下面为我自己编写的程序,出现了24个错误。

#include<iostream>
#include<cstring>
using namespace std;
class Set{
char len[10];
public:
bool isMember(char word);
Set operator+(Set set2);
Set operator-(Set set2);
Set operator+(char word);
Set operator-(char word);
void show(){
int i;
for(i=0;len[i];i++)cout<<len[i];
cout<<"\n";
}
};
bool Set::isMember(char word){
int i;
for(i=0;len[i];i++){
if(word==len[i]){
cout<<"字符集合中已含有此字符。"<<"\n";
return false;
}
}
cout<<"字符集合中没含有此字符。"<<"\n";
return true;
}
Set::operator+(char word){
int i;
i=strlen(len);
if(isMember(word))len[i]=word;
return *this;
}
Set::operator-(char word){
int i,t[10],n=0;
if(!isMember(word)){
for(i=0;len[i];i++){
if(len[i]==word){
t[n]=i;
n++;
}
}
for(n;n>=0;n--){
for(t[n];len[t[n]];t[n]++)len[t[n]]=len[t[n]+1];
}
}
return *this;
}
Set::operator+(Set set2){
Set set3;
int i,t;
for(i=0;len[i];i++)set3.len[i]=len[i];
for(t=0;set2.len[t];t++)set3+set2.len[t];

return set3;
}
Set::operator-(Set set2){
Set set3;
int i,t;
for(i=0;len[i];i++)set3.len[i]=len[i];
for(i=0;set2.len[i];i++)set3-set2.len[i];
return set3;
}
int main(){
Set set1,set2,set3,set4;
set1+'a'+'b'+'c'+'d';
set1.show();
set2+'c'+'d'+'e'+'f';
set2.show();
set1-'a';
set1.show();
set2-'c';
set2.show();
set3=set1+set2;
set3.show();
set4=set1-set2;
set4.show();
return 0;
}

回复列表 (共15个回复)

沙发

/*
原题目要求:
编写一个程序,使用类存储字符集合,可以用运算符添加删除字符,
也可以用运算符将两个集合相加、相减。
在原题目要求的基础上扩充了部分功能。
能实现大多数的集合操作。

作者:meteor135 meteor@mail.biti.edu.cn
日期:2003.8.29
版本号:0.6
编译环境:VC6.0
http://www.programfan.net/club/showbbs.asp?id=17146
*/
//郑重声明:该程序没有实现动态性,因而测验时不能无限扩容

#pragma warning(disable: 4172)

#include<iostream>
using namespace std;

class Set;

//友员函数声明

//或
Set operator + (const Set set1, const Set set2);
//差
Set operator - (const Set set1, const Set set2);
//交
Set operator * (const Set set1, const Set set2);
//异或
Set operator / (const Set set1, const Set set2);
//流式输出
ostream& operator << (ostream& os, const Set set);

class Set
{
private:
    char len[50];//集合最大容量为50
public:
    Set()
    {
        len[0]=0;
    }
    //成员函数重载
    Set  operator =  (Set set);
    Set& operator +  (char word);
    Set& operator -  (char word);
    Set& operator += (Set set);
    Set& operator -= (Set set);
    Set& operator *= (Set set);
    Set& operator /= (Set set);    
    bool operator <  (Set set) const;
    bool operator >  (Set set) const;
    bool operator <= (Set set) const;
    bool operator >= (Set set) const;
    bool operator == (Set set) const;
    bool operator != (Set set) const;

    //只能用友员函数重载
    friend ostream& operator << (ostream& os, const Set set);
    //友员函数重载
    friend Set operator + (const Set set1, const Set set2);
    friend Set operator - (const Set set1, const Set set2);
    friend Set operator * (const Set set1, const Set set2);
    friend Set operator / (const Set set1, const Set set2);

    bool isMember (char word) const;
    void show();
};

//==============================================
//friend operators
Set operator + (const Set set1, const Set set2)
{
    Set set = set1;
    return set.operator += (set2);
}
Set operator - (const Set set1, const Set set2)
{
    Set set = set1;
    return set.operator -= (set2);
}
Set operator * (const Set set1, const Set set2)
{
    Set set = set1;
    return set.operator *= (set2);
}
Set operator / (const Set set1, const Set set2)
{
    Set set = set1;
    return set.operator /= (set2);
}

ostream& operator << (ostream& os, const Set set)
{
    int i=0;
    while(set.len[i])
        os<<set.len[i++];
    os<<"\n";
    return os;
}
//================================================
//end friend operators

//=============================================
//member operators
void Set::show()
{
    cout<<(*this);
}

bool Set::isMember(char word) const{
    int i;
    for(i=0;len[i];i++){
        if(word==len[i]){
            return true;
        }
    }
    return false;
}
//集合拷贝
Set Set::operator=(Set set)
{
    int i = 0;
    do
    {
        this->len[i]=set.len[i];
    }while(set.len[i++]);
    return (*this);
}
//集合增容
Set& Set::operator+(char word)
{
    int i;
    i=strlen(len);    
    if(!isMember(word))
        len[i]=word;
    len[i+1]=0;
    return *this;
}
//集合消减
Set& Set::operator-(char word)
{
    int i;
    for(i=0;len[i];i++)
    {
        if(len[i]==word)
        {
            for(;len[i];i++)
            {
                len[i]=len[i+1];
            }
            break;
        }
    }
    return *this;
}
//包含
bool Set::operator >= (Set set) const
{
    int i = 0;
    for(i = 0;set.len[i]; i ++)
    {
        if(!isMember(set.len[i]))
            return false;
    }
    return true;
}
//包含于
bool Set::operator <= (Set set) const
{
    return(set>=(*this));
}
//相等
bool Set::operator==(Set set) const
{
    int i = 0;
    if ((*this<=set)&&(*this>=set))
        return true;
    return false;
}
//不等
bool Set::operator!=(Set set) const
{    
    return !((*this)==set);
}
//真包含
bool Set::operator > (Set set) const
{
    if(*this>=set&&!(*this<=set))
        return true;
    return false;
}
//真包含于
bool Set::operator < (Set set) const
{
    return(set>*this);
}
//交赋值
Set& Set::operator *= (Set set)
{
    return (*this) - (::operator -(*this,set));
}
//异或赋值
Set& Set::operator /= (Set set)
{
    return (*this += set) -= (::operator *(*this,set));
    //or
    //return (*this) = ::operator +(::operator -(*this,set),::operator -(set,*this));
}
//或赋值
Set& Set::operator += (Set set)
{    
    int i;
    for(i=0;set.len[i];i++)
        if(!isMember(set.len[i]))
            (*this)+set.len[i];
    return (*this);
}
//差赋值
Set& Set::operator -= (Set set)
{
    int i;
    for(i=0;set.len[i];i++)
        if(isMember(set.len[i]))
            (*this)-set.len[i];
    return (*this);
}
//=============================================
//end member operators

int main()
{
    Set set1,set2,set3,set4;
    //测试+
    set1+'a'+'b'+'c'+'d';
    //测试<<
    cout<<set1;
    set1.show();
    set2+'c'+'d'+'e'+'f';
    set2.show();
    set3 +'a';
    set3.show();
    //测试>
    cout<<(set1>set3)<<endl;
    //测试<
    cout<<(set1<set3)<<endl;
    //测试*和=
    set3 = set1*set2;
    set3.show();
    //测试/和=
    set3 = set1/set2;
    set3.show();
    //测试-
    set1-'a';
    set1+'f';
    set1.show();
    //测试=
    set3=set1;
    //测试==
    cout<<(set1==set3)<<endl;
    cout<<(set1==set2)<<endl;
    //测试::+
    set3=set1+set2;
    set3.show();
    //测试::-
    set4=set1-set2;
    set4.show();
    //测试::-后set1和set4是否相等
    cout<<(set1==set4)<<endl;
    //其他测试自行解决

    return 0;
}

板凳

    楼上,我很感谢你给了一个这么详细的程序给我。但由于我的知识的疲乏,里面有大量语法、关键词我是没见过,也没学到的。而我自己的程序是按我现在的能力所编写的,希望大家可以在此基础上修改、帮忙。
    谢谢

3 楼

楼主:
你把我给你的程序仔细看看,你如果不想要这么复杂的,那你完全可以只选你自己需要的功能的阿。
看懂一个函数也许你就看懂了全部。
注意,友员函数重载和成员函数重载是不一样的。
再就是返回引用和不返回引用也是不一样的。
一定要重载赋值运算符或者实现拷贝构造函数。

4 楼

    修改后的程序可以编译成功,但在运行时出现内存错误。
#include<iostream>
#include<cstring>
using namespace std;
class Set{
char len[10];
public:
bool isMember(char word);
Set operator+(Set set2);
Set operator-(Set set2);
Set &operator+(char word);
Set &operator-(char word);
Set &operator=(Set set2);
void show(){
int i;
for(i=0;len[i];i++)cout<<len[i];
cout<<"\n";
return ;
}
};
bool Set::isMember(char word){
int i;
for(i=0;len[i];i++){
if(word==len[i]){
cout<<"字符集合中已含有此字符。"<<"\n";
return false;
}
}
cout<<"字符集合中没含有此字符。"<<"\n";
return true;
}
Set &Set::operator=(Set set2){
int i;
for(i=0;set2.len[i];i++)len[i]=set2.len[i];
return *this;
}
Set &Set::operator+(char word){
int i;
i=strlen(len);
if(isMember(word))len[i]=word;
len[i+1]=0;
return *this;
}
Set &Set::operator-(char word){
int i,t;
for(i=0;len[i];i++){
if(len[i]==word){
t=i;
for(t;len[t];t++){
len[t]=len[t+1];
}
}
}
return *this;
}
Set Set::operator+(Set set2){
Set set3=*this;
int i;
for(i=0;set2.len[i];i++)set3+set2.len[i];
return set3;
}
Set Set::operator-(Set set2){
Set set3=*this;
int i;
for(i=0;set2.len[i];i++)set3-set2.len[i];
return set3;
}
int main(){
Set set1,set2,set3,set4;
set1+'a'+'b'+'c'+'d';
set1.show();
set2+'c'+'d'+'e'+'f';
set2.show();
set1-'a';
set1.show();
set2-'c';
set2.show();
set3=set1+set2;
set3.show();
set4=set1-set2;
set4.show();
return 0;
}

    为什么???

5 楼

Set /*&*/Set::operator=(Set set2){//不应该返回引用,我已经修改好了
int i;
for(i=0;set2.len[i];i++)
    len[i]=set2.len[i];
len[i]=0;//=============>不可少!
return *this;
}


bool Set::isMember(char word){
int i;
for(i=0;len[i];i++){
if(word==len[i]){
cout<<"字符集合中已含有此字符。"<<"\n";
return false;//你的逻辑有问题,含有怎么是false?不含怎么是true?
//不过要记着,要改都改,否则会出错!
}
}
cout<<"字符集合中没含有此字符。"<<"\n";
return true;
}

Set &Set::operator-(char word){
int i,t;
for(i=0;len[i];i++){
if(len[i]==word){
t=i;//==========>直接用i不就得了?参考我的代码!这点捕捉力都没有?
for(t;len[t];t++){
len[t]=len[t+1];
}
}
}
return *this;
}

6 楼

    经过修改版主所指出的错误,内存错误(有一个内存地址读不了)还是存在。

7 楼

把你修改好的代码贴出来好吗?
我试着帮你看看

8 楼

    修改后的程序。
#include<iostream>
#include<cstring>
using namespace std;
class Set{
char len[10];
public:
bool isMember(char word);
Set operator+(Set set2);
Set operator-(Set set2);
Set &operator+(char word);
Set &operator-(char word);
Set operator=(Set set2);
void show(){
int i;
for(i=0;len[i];i++)cout<<len[i];
cout<<"\n";
return ;
}
};
bool Set::isMember(char word){
int i;
for(i=0;len[i];i++){
if(word==len[i]){
cout<<"字符集合中已含有此字符。\n";
return true;
}
}
cout<<"字符集合中没含有此字符。\n";
return false;
}
Set Set::operator=(Set set2){
int i;
for(i=0;set2.len[i];i++)len[i]=set2.len[i];
len[i]=0;
return (*this);
}
Set &Set::operator+(char word){
int i;
i=strlen(len);
if(!isMember(word))len[i]=word;
len[i+1]=0;
return *this;
}
Set &Set::operator-(char word){
int i;
for(i=0;len[i];i++){
if(len[i]==word){
for(;len[i];i++){
len[i]=len[i+1];
}
}
}
return *this;
}
Set Set::operator+(Set set2){
Set set=*this;
int i;
for(i=0;set2.len[i];i++)set+set2.len[i];
return set;
}
Set Set::operator-(Set set2){
Set set=*this;
int i;
for(i=0;set2.len[i];i++)set-set2.len[i];
return set;
}
int main(){
Set set1,set2,set3,set4;
set1+'a'+'b'+'c'+'d';
set1.show();
set2+'c'+'d'+'e'+'f';
set2.show();
set1-'a';
set1.show();
set2-'c';
set2.show();
set3=set1+set2;
set3.show();
set4=set1-set2;
set4.show();
return 0;
}

9 楼

//如果你在DEV C++下编译,1保留,2可以保留也可以不保留
#define __DEVCPP   //================1
//如果你在TC3.0或者BC3.1下编译,保留2,注释掉1
#define __TCCPP    //================2

#ifdef __DEVCPP
#undef __TCCPP
#include<iostream>
#include<string>
using namespace std;
#endif//DEVCPP

#ifdef __TCCPP
#undef __DEVCPP
#include<iostream.h>
#include<string.h>
#include<conio.h>
enum bool{false,true};
#endif//__TCCPP

class Set{
    char len[10];
public:
    //原来你缺少构造函数,这个我没有强调你就给落了!
    Set(){
         len[0]='\0';
    }
    bool isMember(char word);
    Set operator+(Set set2);
    Set operator-(Set set2);
    Set &operator+(char word);
    Set &operator-(char word);
    Set operator=(Set set2);
    void show(){
        int i;
        for(i=0;len[i];i++)
            cout<<len[i];
        cout<<"\n";
        return ;
    }
};
bool Set::isMember(char word){
    int i;
    for(i=0;len[i];i++){
        if(word==len[i]){
            //cout<<"字符集合中已含有此字符。\n";
            return true;
        }
    }
    //cout<<"字符集合中没含有此字符。\n";
    return false;
}
Set Set::operator=(Set set2){
    int i;
    for(i=0;set2.len[i];i++)
        len[i]=set2.len[i];
    len[i]=0;
    return (*this);
}
Set &Set::operator+(char word){
    int i;
    i=strlen(len);
    if(!isMember(word))len[i]=word;
        len[i+1]=0;
    return *this;
}
Set &Set::operator-(char word){
    int i;
    for(i=0;len[i];i++){
        if(len[i]==word){
            for(;len[i];i++){
                len[i]=len[i+1];
            }
            break;//原来这里少了这个!你可能没看仔细吧?
        }
    }
    return *this;
}
Set Set::operator+(Set set2){
    Set set=*this;
    int i;
    for(i=0;set2.len[i];i++)
        set+set2.len[i];
    return set;
}
Set Set::operator-(Set set2){
    Set set=*this;
    int i;
    for(i=0;set2.len[i];i++)
        set-set2.len[i];    
    return set;
}

int main(){
    Set set1,set2,set3,set4;
    set1+'a'+'b'+'c'+'d';
    set1.show();
    set2+'c'+'d'+'e'+'f';
    set2.show();
    set1-'a';
    set1.show();
    set2-'c';
    set2.show();
    set3=set1+set2;
    set3.show();
    set4=set1-set2;
    set4.show();

#ifdef __TCCPP
    getch();
#endif

#ifdef __DEVCPP
    system("PAUSE");
#endif
    return 0;
}

10 楼

    构造函数在开头就没想到要用;而对于break,在看你的程序时就注意到了,但添加了以后还是有内存错误,有觉得它用处不大,所以也删掉。
    还有,我想知道,你所写出的开头那些文件有什么用,我没看过,所以不知道。

我来回复

您尚未登录,请登录后再回复。点此登录或注册