Pagini recente » Cod sursa (job #756608) | Cod sursa (job #567590) | Cod sursa (job #3186660) | Cod sursa (job #3161378) | Cod sursa (job #2629015)
#include <iostream>
#include <fstream>
#include <algorithm>
#include <cstring>
#include <cstdlib>
using namespace std;
class multime
{
private:
int n, *elem;
public:
multime operator+(multime m);
multime operator+(int x);
multime operator+(char x[]);
multime operator-(int x);
multime operator*(multime m);
multime operator-(multime m);
friend bool operator<=(int x, multime m);
friend ostream& operator<<(ostream &out, multime &m);
friend fstream& operator>>(fstream &fin, multime &m);
friend fstream& operator<<(fstream &fout, multime &m);
};
multime multime::operator+(multime m)
{
multime s;
s.n=n+m.n;
s.elem=new int[s.n+1];
int i, j, k;
i=j=k=1;
while(i<=n && j<=m.n)
if(elem[i]<=m.elem[j])
{
if(elem[i]==m.elem[j])
{
i++;
s.n--;
}
else
s.elem[k++]=elem[i++];
}
else
s.elem[k++]=m.elem[j++];
for(; i<=n; i++)
s.elem[k++]=elem[i];
for(; j<=m.n; j++)
s.elem[k++]=m.elem[j];
return s;
}
multime multime::operator+(int x)
{
multime s;
s.n=n+1;
s.elem=new int[s.n+1];
int i;
bool ok=true;
for(i=1; i<=n; i++)
{
if(x==elem[i])
ok=false;
s.elem[i]=elem[i];
}
if(ok)
s.elem[i]=x;
else
s.n--;
return s;
}
multime multime::operator+(char x[])
{
multime s;
int nr[100], ct=0, i, j, k;
char *p, fraza[100];
strcpy(fraza, x);
p=strtok(fraza, " ");
while(p)
{
nr[++ct]=atoi(p);
p=strtok(NULL, " ");
}
s.n=n+ct;
s.elem=new int[s.n+1];
sort(nr+1, nr+ct+1);
i=j=k=1;
while(i<=n && j<=ct)
if(elem[i]<=nr[j])
{
if(elem[i]==nr[j])
{
i++;
s.n--;
}
else
s.elem[k++]=elem[i++];
}
else
s.elem[k++]=nr[j++];
for(; i<=n; i++)
s.elem[k++]=elem[i];
for(; j<=ct; j++)
s.elem[k++]=nr[j];
return s;
}
multime multime::operator-(int x)
{
multime dif;
dif.n=n;
dif.elem=new int[n+1];
int i, j=1;
for(i=1; i<=n; i++)
if(x!=elem[i])
dif.elem[j++]=elem[i];
else
dif.n--;
return dif;
}
multime multime::operator*(multime m)
{
multime inter;
inter.n=0;
inter.elem=new int[max(n, m.n)+1];
int i, j, k;
i=j=k=1;
while(i<=n && j<=m.n)
if(elem[i]<=m.elem[j])
{
if(elem[i]==m.elem[j] && (k==1 || elem[k-1]!=elem[i]))
{
inter.elem[k++]=elem[i];
inter.n++;
}
i++;
}
else
j++;
return inter;
}
multime multime::operator-(multime m)
{
multime dif;
dif.n=0;
dif.elem=new int[max(n, m.n)+1];
int i, j, k;
i=j=k=1;
while(i<=n && j<=m.n)
if(elem[i]<=m.elem[j])
{
if(elem[i]==m.elem[j])
i++;
else
{
dif.elem[k++]=elem[i++];
dif.n++;
}
}
else
j++;
for(; i<=n; i++)
{
dif.elem[k++]=elem[i];
dif.n++;
}
return dif;
}
bool operator<=(int x, multime m)
{
for(int i=1; i<=m.n; i++)
if(x==m.elem[i])
return true;
return false;
}
ostream& operator<<(ostream &out, multime &m)
{
for(int i=1; i<=m.n; i++)
out<<m.elem[i]<<" ";
out<<endl;
return out;
}
fstream& operator>>(fstream &fin, multime &m)
{
fin>>m.n;
m.elem=new int[m.n+1];
for(int i=1; i<=m.n; i++)
fin>>m.elem[i];
sort(m.elem+1, m.elem+m.n+1);
return fin;
}
fstream& operator<<(fstream &fout, multime &m)
{
for(int i=1; i<=m.n; i++)
fout<<m.elem[i]<<" ";
fout<<endl;
return fout;
}
int main(void)
{
multime A,B,C;
fstream f,g;
f.open("multime.in", ios::in);
g.open("temp.txt", ios::out);
f>>A>>B; // citeste numarul de elemente apoi elementele propriu-zise, pentru fiecare multime
g<<A; // scrie in fisier elementele multimii A
C=A+B;
cout<<"Reuniunea este "<<C; // scrie pe ecran multimea C
C=A+32;
cout<<"Multimea dupa adaugarea unui numar este "<<C;
C=A*B;
cout<<"Intersectia este "<<C;
C=A-B;
cout<<"Diferenta este "<<C;
if(32<=A)
cout<<"32 apartine multimii "<<A;
else
cout<<"32 nu apartine multimii "<<A;
C=A-32;
cout<<"Dupa eliminarea unui element "<<C;
C=A+"8 -7 15 22"; // reuniune intre A si numerele din string
cout<<C;
f.close();
g.close();
}