主题:第一次使用运算符重载,出现大量错误,希望大家可以帮帮忙修改。
JRF
[专家分:130] 发布于 2003-08-29 13:34:00
编写一个程序,使用类存储字符集合,可以用运算符添加删除字符,也可以用运算符将两个集合相加、相减。
下面为我自己编写的程序,出现了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 [专家分:6060] 发布于 2003-08-29 17:12:00
/*
原题目要求:
编写一个程序,使用类存储字符集合,可以用运算符添加删除字符,
也可以用运算符将两个集合相加、相减。
在原题目要求的基础上扩充了部分功能。
能实现大多数的集合操作。
作者: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;
}
板凳
JRF [专家分:130] 发布于 2003-08-29 18:50:00
楼上,我很感谢你给了一个这么详细的程序给我。但由于我的知识的疲乏,里面有大量语法、关键词我是没见过,也没学到的。而我自己的程序是按我现在的能力所编写的,希望大家可以在此基础上修改、帮忙。
谢谢
3 楼
meteor135 [专家分:6060] 发布于 2003-08-29 20:02:00
楼主:
你把我给你的程序仔细看看,你如果不想要这么复杂的,那你完全可以只选你自己需要的功能的阿。
看懂一个函数也许你就看懂了全部。
注意,友员函数重载和成员函数重载是不一样的。
再就是返回引用和不返回引用也是不一样的。
一定要重载赋值运算符或者实现拷贝构造函数。
4 楼
JRF [专家分:130] 发布于 2003-08-30 13:24:00
修改后的程序可以编译成功,但在运行时出现内存错误。
#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 楼
meteor135 [专家分:6060] 发布于 2003-08-30 15:36:00
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 楼
JRF [专家分:130] 发布于 2003-08-31 11:12:00
经过修改版主所指出的错误,内存错误(有一个内存地址读不了)还是存在。
7 楼
meteor135 [专家分:6060] 发布于 2003-08-31 11:39:00
把你修改好的代码贴出来好吗?
我试着帮你看看
8 楼
JRF [专家分:130] 发布于 2003-08-31 12:26:00
修改后的程序。
#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 楼
meteor135 [专家分:6060] 发布于 2003-08-31 13:09:00
//如果你在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 楼
JRF [专家分:130] 发布于 2003-08-31 14:47:00
构造函数在开头就没想到要用;而对于break,在看你的程序时就注意到了,但添加了以后还是有内存错误,有觉得它用处不大,所以也删掉。
还有,我想知道,你所写出的开头那些文件有什么用,我没看过,所以不知道。
我来回复