PDA

View Full Version : نوشتن یک برنامه برای کار با مجموعه ها



qanewaisi
سه شنبه 08 دی 1388, 09:09 صبح
با سلام
من برنامه ای برای کار با مجموعه ها می خوام که خودم روی این برنامه کار کردم و نتیجه کار رو برای شما دوستان قرار می دهم.
البته این برنامه از اصول شئ گرایی پیروی می کنه!
این برنامه هنوز کامل نشده، لذا از شما دوستان می خوام که کمک کنید تا برنامه را کامل کنیم.
با تشکر





#include<iostream.h>
#include<conio.h>
const int maxsize=20;
class Intset{
private:
int ma[maxsize],topindex;
public:
void insert(int x){
if(topindex==maxsize-1)
cout<<"Full !";
else
if(!found(x))
ma[++topindex]=x;
}
Intset(){
topindex=-1;}
Intset& operator+=(Intset b){
for(int i=0;i<=b.card()-1;i++)
insert(b.get(i));
}
Intset& operator-=(Intset b){
makeempty();
for(int i=0;i<=b.card()-1;i++)
if(!b.found(get(i)) )
insert(get(i));
}
int found(int x){
int no=0,i=0;
do{
if(x==ma[i])no=1;
i++;
}while(i<=topindex &&no!=1);
return no;}
void print(ostream & o){
if(topindex==-1)o<<"Empty";
else {
o<<"{";
for(int i=0;i<=topindex;i++)
o<<ma[i]<<",";
o<<"}";
}
}
Intset operator+(Intset b){
Intset c;
for(int i=0;i<=card()-1;i++)
c.insert(get(i));
for(i=0;i<=b.card()-1;i++)
c.insert(b.get(i));
return c;
}
Intset operator^(Intset b){
Intset c;
for(int i=0;i<=card()-1;i++)
for(int j=0;j<=b.card()-1;j++)
if(found(get(i)&&b.found(get(i)) ) )
c.insert(get(i));

return c;
}
Intset operator-(Intset b){
Intset c;
for(int i=0;i<=card()-1;i++)
if(!b.found(get(i)) )
c.insert(get(i));

return c;
}
int get(int i){
return ma[i];}
int card(){
return topindex+1;}
void makeempty(){
topindex=-1;}

};
ostream& operator<<(ostream & o,Intset a){
a.print(o);
return o;}

void main(){
clrscr();
Intset a,b1;
int b;
for(int i=1;i<=5;i++){
cout<<"Enter number a :";
cin>>b;
a.insert(b);}
cout<<endl<< "A "<<a;
for( i=1;i<=3;i++){
cout<<endl<<"Enter number b :";
cin>>b;
b1.insert(b);}
Intset c;
cout<<c<<endl;
c=b1;
cout<<c<<endl;
c+=a;
cout<<c<<endl;
c-=a;
cout<<c;
/* cout<<endl<<"B "<<b1;
Intset c=a+b1;
cout<<endl<<"C "<<c;
c=a-b1;
cout<<endl<<c<<endl;
c=a^b1;
cout<<endl<<c;
c+=a;
cout<<endl<<"+= "<<c;
c=a;
c-=b1;
cout<<endl<<c;*/
getch();

}

mortezamsp
سه شنبه 08 دی 1388, 19:10 عصر
قشنگ بگو مشکلت کجاست.
سوال رو کامل بپرس چون بی جواب میمونه.
البته اگه کاملم باشه بازم بی جواب میمونه....مثل همه سوالایی که من تاحالا پرسیدم ...

mortezamsp
سه شنبه 08 دی 1388, 20:32 عصر
اول اینکه main رو با int بنویس . میگن با void غیراستاندارد و خطرناکه !

دوم اینکه اپراتور << و >> رو friend کن اینطوری راحت تری .

سوم اینکه برنامتو یک کم مرتبش کن و پیام هارو بهتر بنویس .

چهارم اینکه مشکل خاصی نداشتی ، فقط تو تابع insert یه شرط گذاشته بودی که با برداشتنش برنامت خوب کار کرد .

پنجم این که توابع کلاس رو بیرون ازش تعریف کن . داخلش error میده . من نمیدونم چرا .

اینم درست شدش :

#include<iostream.h>
#include<conio.h>
#define maxsize 20
//=================================================
class Intset
{
private:
int ma[maxsize],topindex;
public:
Intset();
void insert(int);
Intset operator+=(Intset);
Intset operator-=(Intset);
int found(int);
void print(ostream & o);
Intset operator+(Intset);
Intset operator^(Intset);
Intset operator-(Intset);
int get(int);
int card();
void makeempty();
friend ostream & operator << (ostream & ,Intset);
};
//=================================================
Intset :: Intset()
{
topindex=-1;
}
void Intset :: insert(int x)
{
if(topindex==maxsize-1)
cout<<"\n=======\ninsert error : stack is full !\n=======\n";
else
ma[++topindex]=x;
}
ostream & operator <<(ostream & o ,Intset a)
{
a.print(o);
return o;
}
Intset Intset :: operator+=(Intset b)
{
for(int i=0;i<=b.card()-1;i++)
insert(b.get(i));
return *this ;
}
Intset Intset :: operator-=(Intset b)
{
Intset rezualt ;
for( int i=0 ; i<=topindex ;i++ )
rezualt.insert( get(i) ) ;
makeempty() ;
for( i=0 ;i<=rezualt.topindex ;i++ )
if( !b.found( rezualt.get(i) ) )
insert( rezualt.get(i) ) ;
return rezualt ;
}
int Intset :: found(int x)
{
int i=0;
do{
if(x==ma[i])
return 1 ;
i++;
}while(i<=topindex);

return 0 ;
}
void Intset :: print(ostream & o)
{
if(topindex==-1)
o<<"Empty";
else
{
o<<"{";
for(int i=0;i<=topindex;i++)
o<<ma[i]<<",";
o<<"}";
}
}
Intset Intset :: operator+(Intset b)
{
Intset c;
for(int i=0;i<=card()-1;i++)
c.insert(get(i));
for(i=0;i<=b.card()-1;i++)
c.insert(b.get(i));
return c;
}
Intset Intset :: operator^(Intset b)
{
Intset c;
for(int i=0;i<=card()-1;i++)
for(int j=0;j<=b.card()-1;j++)
if(found(get(i)&&b.found(get(i)) ) )
c.insert(get(i));
return c;
}
Intset Intset :: operator-(Intset b)
{
Intset c;
for(int i=0;i<=card()-1;i++)
if(!b.found(get(i)) )
c.insert(get(i));
return c;
}
int Intset :: get(int i)
{
return ma[i];
}
int Intset :: card()
{
return topindex+1;
}
void Intset :: makeempty()
{
topindex=-1;
}
//=================================================
int main()
{
clrscr();
Intset a,b1;

int b;
cout<<"\n=======Get a{} ";
for(int i=1;i<=5;i++)
{
cout<<"\nEnter number a{"<<i<<"} :";
cin>>b;
a.insert(b);
}
cout<<"\na{} :"<<a<<endl;

cout<<"\n=======Get b1{} :";
for( i=1;i<=3;i++)
{
cout<<"\nEnter number b1{"<<i<<"} :";
cin>>b;
b1.insert(b);
}
cout<<"\nb1{} :"<<b1<<endl;
Intset c;
cout<<"\n=======\nnew intset c :"<<c<<endl<<"press any key";
getch();
c=b1;
cout<<"\n=======\nc=b1 ==>c :"<<c<<endl<<"press any key";
getch();
c+=a;
cout<<"\n=======\nc+=a ==>c :"<<c<<endl<<"press any key";
getch();
c-=a;
cout<<"\n=======\nc-=a ==>c :"<<c<<endl<<"press any key";
getch();
c=a+b1;
cout<<"\n=======\nc=a+b1 ==>c :"<<c<<endl<<"press any key";
getch();

c=a-b1;
cout<<"\n=======\nc=a-b1 ==>c :"<<c<<endl<<"press any key";
getch();

c=a^b1;
cout<<"\n=======\nc=a^b1 ==>c :"<<c<<endl<<"press any key";
getch();


return 0 ;
}

qanewaisi
سه شنبه 08 دی 1388, 21:26 عصر
سلام دوست عزیز
مرسی به خاطر راهنمایی قشنگتون،عالی بود.
فقط اگه می شد بعد از اینکه جواب رو نشون بده یه مرتب سازی و جستجو هم انجام بده که عضوهای تکراری رو نشون نده دیگه محشر بود.

mortezamsp
سه شنبه 08 دی 1388, 21:46 عصر
امر دیگه ای ؟

من چی گیرم میاد از کار مفتی ؟
لااقل یه تشکر هم نکردی !

بعدشم برای اینکه تکراری نشون نده ، اون تابع insert رو درستش کن ، فقط تابع found رو باید درستش کنی :


int Intset :: found(int x)
{
int i=( i<topindex? i : topindex );
for( i=0 ; i<=topindex ;i++ )
if(ma[i]==x)
return 1 ;
return 0 ;
}

qanewaisi
سه شنبه 08 دی 1388, 22:10 عصر
امر دیگه ای ؟

من چی گیرم میاد از کار مفتی ؟
لااقل یه تشکر هم نکردی !

بعدشم برای اینکه تکراری نشون نده ، اون تابع insert رو درستش کن ، فقط تابع found رو باید درستش کنی :


int Intset :: found(int x)
{
int i=( i<topindex? i : topindex );
for( i=0 ; i<=topindex ;i++ )
if(ma[i]==x)
return 1 ;
return 0 ;
}

دوست گرامی
من که به محض وارد شدن به این تاپیک تشکر کردم،حتما شما ندیدی!!!!:افسرده:
ببخشید اگه زحمتتون شد{می خواین یه شماره حساب بدین که کارتون مفت حساب نشه داداش}:لبخندساده:

qanewaisi
سه شنبه 08 دی 1388, 22:24 عصر
من برنامه رو طبق اون چیزایی که شما گفتید کامل کردم و نتیجه کار رو اجرا کردم و عالی بود،من سورس کامل شدش رو اینجا میزارم.
ولی به نظر خودم مجموعه ها نیازی به مرتب کردن ندارن!
یکبار دیگه از دوست خوبم mortezamsp (http://www.barnamenevis.org/forum/member.php?u=95032) به خاطر راهنمایی های خوبشون تشکر می کنم.:بوس:



#include<iostream.h>
#include<conio.h>
#define maxsize 20
//=================================================
class Intset
{
private:
int ma[maxsize],topindex;
public:
Intset();
void insert(int);
Intset operator+=(Intset);
Intset operator-=(Intset);
int found(int);
void print(ostream & o);
Intset operator+(Intset);
Intset operator^(Intset);
Intset operator-(Intset);
int get(int);
int card();
void makeempty();
friend ostream & operator << (ostream & ,Intset);
};
//=================================================
Intset :: Intset()
{
topindex=-1;
}
void Intset :: insert(int x)
{
if(topindex==maxsize-1)
cout<<"\n=======\ninsert error : stack is full !\n=======\n";
else{
if(!found(x))
ma[++topindex]=x;

}
}

ostream & operator <<(ostream & o ,Intset a)
{
a.print(o);
return o;
}
Intset Intset :: operator+=(Intset b)
{
for(int i=0;i<=b.card()-1;i++)
insert(b.get(i));
return *this ;
}
Intset Intset :: operator-=(Intset b)
{
Intset rezualt ;
for( int i=0 ; i<=topindex ;i++ )
rezualt.insert( get(i) ) ;
makeempty() ;
for( i=0 ;i<=rezualt.topindex ;i++ )
if( !b.found( rezualt.get(i) ) )
insert( rezualt.get(i) ) ;
return rezualt ;
}

void Intset :: print(ostream & o)
{
if(topindex==-1)
o<<"Empty";
else
{
o<<"{";
for(int i=0;i<=topindex;i++)
o<<ma[i]<<",";
o<<"}";
}
}
Intset Intset :: operator+(Intset b)
{
Intset c;
for(int i=0;i<=card()-1;i++)
c.insert(get(i));
for(i=0;i<=b.card()-1;i++)
c.insert(b.get(i));
return c;
}
Intset Intset :: operator^(Intset b)
{
Intset c;
for(int i=0;i<=card()-1;i++)
for(int j=0;j<=b.card()-1;j++)
if(found(get(i)&&b.found(get(i)) ) )
c.insert(get(i));
return c;
}
Intset Intset :: operator-(Intset b)
{
Intset c;
for(int i=0;i<=card()-1;i++)
if(!b.found(get(i)) )
c.insert(get(i));
return c;
}
int Intset :: get(int i)
{
return ma[i];
}
int Intset :: card()
{
return topindex+1;
}
void Intset :: makeempty()
{
topindex=-1;
}
int Intset :: found(int x)
{
int i=( i<topindex? i : topindex );
for( i=0 ; i<=topindex ;i++ )
if(ma[i]==x)
return 1 ;
return 0 ;
}


//=================================================
int main()
{
clrscr();
Intset a,b1;

int b;
cout<<"\n=======Get a{} ";
for(int i=1;i<=5;i++)
{
cout<<"\nEnter number a{"<<i<<"} :";
cin>>b;
a.insert(b);
}
cout<<"\na{} :"<<a<<endl;

cout<<"\n=======Get b1{} :";
for( i=1;i<=3;i++)
{
cout<<"\nEnter number b1{"<<i<<"} :";
cin>>b;
b1.insert(b);
}
cout<<"\nb1{} :"<<b1<<endl;
Intset c;
cout<<"\n=======\nnew intset c :"<<c<<endl<<"press any key";
getch();
c=b1;
cout<<"\n=======\nc=b1 ==>c :"<<c<<endl<<"press any key";
getch();
c+=a;
cout<<"\n=======\nc+=a ==>c :"<<c<<endl<<"press any key";
getch();
c-=a;
cout<<"\n=======\nc-=a ==>c :"<<c<<endl<<"press any key";
getch();
c=a+b1;
cout<<"\n=======\nc=a+b1 ==>c :"<<c<<endl<<"press any key";
getch();

c=a-b1;
cout<<"\n=======\nc=a-b1 ==>c :"<<c<<endl<<"press any key";
getch();

c=a^b1;
cout<<"\n=======\nc=a^b1 ==>c :"<<c<<endl<<"press any key";
getch();


return 0 ;
}

mortezamsp
سه شنبه 08 دی 1388, 22:31 عصر
منظور من از کار مفت تشکر نبود .
منظور من از تشکر کلمه تشکر نبود .

منظور من از کارمفت (ببخشید) درخواست تابع مرتب سازیه . آخه اینم کمک خواستن میخواد ؟
منظورم هم از تشکر ، دکمه تشکر بود و فقط یه شوخی بود .

بهرحال همین جا بحث تموم شه ، وگرنه مدیران این تاپیک رو پاک میکنن .

qanewaisi
سه شنبه 08 دی 1388, 22:49 عصر
دوست عزیز منم مرتب سازی رو به شوخی مطرح کردم.
ولی واقعا یه مشکل دیگه که میشه به این برنامه گرفت اینه که از حافظه پویا استفاده نکرده!!!
اگه بخوایم از حافظه پویا هم استفاده کنه 3 4 خط بیشتر دستکاری نمیشه!!