Cod sursa(job #2629015)

Utilizator dorinm17Manea Dorin dorinm17 Data 18 iunie 2020 16:40:09
Problema Fractii Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 4.86 kb
#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();
}