توضیح:اجتماع و اشتراک دو مجموعه

mhabat

Member
با سلام.سورس زیر برنامه یی است که دو اجتماع و اشتراک آنهارا نمایش میده.لطفا اگه میشه قسمت مربوط به حلقه هاشو توضیح خطی بدین.اون قسمت هایی که میگه اگر این طور نبود(!داشت)روهم متوجه نمیشم.
شرمنده سورس فکر کنم خیلی سخت نیست اما وقتی تعداد حلقه ها زیاد میشه دیگه درکش خیلی برام سخت میشه.
سورس:
کد:
#include <iostream.h>

void main()
{
    int n, m, x[50], y[50];
    register c;
    cout<<"Enter the number of first list's elements:";
    cin>>n;
    cout<<"Enter the first sorted list:"<<endl;
    for(register i=0;i<n;i++)
        cin>>x[i];
    cout<<"Now enter the number of second list's elements:";
    cin>>m;
    cout<<"Enter the second sorted list:"<<endl;
    for(c=0;c<m;c++)
        cin>>y[c];
    //------------------------------------------------------------
    cout<<"Union: ";
    char ch;
    i=0;
    for(i=0;i<n;i++)
        if(x[i]!=x[i-1])
            cout<<x[i]<<"\t";
    for(c=0;c<m;c++)
        if(y[c]!=y[c-1])
        {
            ch=0;
            for(i=0;i<n;i++)
                if(y[c]==x[i])
                {
                    ch=1;
                    break;
                }
            if(ch!=1)
                cout<<y[c]<<"\t";
        }
    cout<<endl;
    //------------------------------------------------------------
    cout<<"Subscription: ";
    c=0;
    for(i=0;i<n;i++)
        if(x[i]!=x[i-1])
            for(;y[c]<=x[i]&&c<m;c++)
                if(y[c]!=y[c-1]&&x[i]==y[c])
                {
                    cout<<x[i]<<"\t";
                    break;
                }
    //-------------------------------------------------------------
}
با تشکِــــر فراوان از The_King
 

the_king

مدیرکل انجمن
با سلام.سورس زیر برنامه یی است که دو اجتماع و اشتراک آنهارا نمایش میده.لطفا اگه میشه قسمت مربوط به حلقه هاشو توضیح خطی بدین.اون قسمت هایی که میگه اگر این طور نبود(!داشت)روهم متوجه نمیشم.
شرمنده سورس فکر کنم خیلی سخت نیست اما وقتی تعداد حلقه ها زیاد میشه دیگه درکش خیلی برام سخت میشه.
از کاربر دو تا Sorted list خواسته، یعنی برنامه انتظار داره که لیست ها بصورت صعودی مرتب باشند، پس
نباید در هیچ شرایطی [x[i از [x[i - 1 کوچکتر باشه. اما ممکنه عضو ها در یک مجموعه تکراری باشند،
یعنی [x[i برابر [x[i - 1 باشه.

کد برنامه ایراد داره، حتی اگه درست کار کنه، وقتی مقدار i برابر 0 ئه، اندیس i - 1 در آرایه وجود نداره و
نباید [x[i - 1 بررسی بشه. این بخشی از حافظه است که ممکنه بهش دسترسی نداشته باشیم
یا مقدار نامعلوم و غیر قابل پیش بینی داخلش وجود داشته باشه که روی نتیجه اجرای برنامه تاثیر داره.

در اجتماع اول تمام عضو های لیست x رو نمایش می دهیم، به شرطی که تکراری نباشند :
کد:
    for(i=0;i<n;i++)
        if(x[i]!=x[i-1])
            cout<<x[i]<<"\t";
اگر عضوی تکراری باشد [x[i برابر [x[i - 1 خواهد بود که البته کد ایراد داره، ممکنه در حافظه قبل از آرایه x
مقداری باشه که تصادفا با [x[0 برابره و جلوی نمایش [x[0 رو بگیره.

سپس عضو های y را به شرطی نمایش می دهیم که اولا تکراری نباشند و ثانیا در x نباشند.
ممکنه عضو ها در مجموعه y تکراری باشند، یعنی [y[c برابر [y[c - 1 باشه.
یکی یکی عضو های y رو در لیست x جستجو می کنیم، اگر نبود ch صفر می ماند وگرنه ch = 1 می شود.
اگر ch = 0 ماند و 1 نشد پس آن عضو در x نمونه مشابه ندارد و نمایش اش می دهیم :
کد:
    for(c=0;c<m;c++)
        if(y[c]!=y[c-1])
        {
            ch=0;
            for(i=0;i<n;i++)
                if(y[c]==x[i])
                {
                    ch=1;
                    break;
                }
            if(ch!=1)
                cout<<y[c]<<"\t";
        }

در مورد اشتراک باید یکی یکی عضو های یک مجموعه را به شرط آنکه خودشان در مجموعه تکراری نباشد ،
در مجموعه دیگر جستجو کنیم و اگر نمونه مشابه نداشتند نمایش دهیم.
در کد خواسته حلقه داخلی را بهینه کنه تا تعداد مقایسه ها کمتر بشه، وگرنه می توانست
از همان دو حلقه ای که برای تکراری نبودن در اجتماع استفاده کرده بود استفاده کنه :
کد:
    for(c=0;c<m;c++)
        if(y[c]!=y[c-1])
        {
            ch=0;
            for(i=0;i<n;i++)
                if(y[c]==x[i])
                {
                    ch=1;
                    break;
                }
            if(ch==1)
                cout<<y[c]<<"\t";
        }
فرق این کد با کدی که در اجتماع بود اینه که اولا عضو های x رو نمایش نداده، و ثانیا عضو هایی رو نمایش میده
که در مجموعه x نمونه مشابه داشته باشند، یعنی شرط نمایش [y[c اینه که ch == 1 باشه، نه ch != 1
 

جدیدترین ارسال ها

بالا