تالار گفتمان مانشت
صعودی کردن ماتریس mدرn - نسخه‌ی قابل چاپ

صعودی کردن ماتریس mدرn - The BesT - 23 اردیبهشت ۱۳۹۷ ۰۱:۰۸ ق.ظ

سلام.دوستان.من یه تیکه کد نوشتم. ساده هم هست. BlushBlushBlush مرتب سازی صعودی یک ماتریس m*n .(فعلا دوتا سطر و سه تا ستون در نظر گرفتم) ولی جواب درست نمیده. با دست تریس میکنم جواب میگیرم. ولی اجرا صعودی مرتب نمیکنه. میشه لطف کنید یه نگاه بهش کنید.Heart
s هم برای این صفر کردم که وقتی به اول هر سطر میرسم شروع کنه از خونه اول هر سطر مقایسه را انجام بده.
تشکر Heart


کد:
for ( int i = 1 ; i <= 2 ; i++ )
    {
        for ( int j = 1 ; j <= 3 ; j++ )
        {
            int s=j;
            for ( int k = i ; k <= 2 ; k++ )
            {
              for (int p=s+1;p<=3;p++)
              {
                if (a[i][j] > a[k][p] )
                {
                    temp=a[i][j];
                    a[i][j]=a[k][p];
                    a[k][p]=temp;
                }
              }
              s=0;
            }
        }
    }


RE: صعودی کردن ماتریس mدرn - Behnam‌ - ۲۳ اردیبهشت ۱۳۹۷ ۰۲:۱۴ ق.ظ

(۲۳ اردیبهشت ۱۳۹۷ ۰۱:۰۸ ق.ظ)The BesT نوشته شده توسط:  سلام.دوستان.من یه تیکه کد نوشتم. ساده هم هست. BlushBlushBlush مرتب سازی صعودی یک ماتریس m*n .(فعلا دوتا سطر و سه تا ستون در نظر گرفتم) ولی جواب درست نمیده. با دست تریس میکنم جواب میگیرم. ولی اجرا صعودی مرتب نمیکنه. میشه لطف کنید یه نگاه بهش کنید.Heart
s هم برای این صفر کردم که وقتی به اول هر سطر میرسم شروع کنه از خونه اول هر سطر مقایسه را انجام بده.
تشکر Heart


کد:
for ( int i = 1 ; i <= 2 ; i++ )
    {
        for ( int j = 1 ; j <= 3 ; j++ )
        {
            int s=j;
            for ( int k = i ; k <= 2 ; k++ )
            {
              for (int p=s+1;p<=3;p++)
              {
                if (a[i][j] > a[k][p] )
                {
                    temp=a[i][j];
                    a[i][j]=a[k][p];
                    a[k][p]=temp;
                }
              }
              s=0;
            }
        }
    }
قبل از هر چیز، این که کد متلب نیست، پس چرا اندیس‌ها رو از ۱ شروع می‌کنید و تا خود m میرید؟

RE: صعودی کردن ماتریس mدرn - The BesT - 23 اردیبهشت ۱۳۹۷ ۰۹:۰۵ ق.ظ

سلام مجدد
متلب نداشتم. برنامه را در محیط ++borland c نوشتم.اندیس هم از یک میگذاشتم خطا نمیگرفت.
کل برنامش اینه که گذاشتم. اول اعداد توی ماتریس را دونه دونه میخونه و ماتریس را میسازه. بعد ماتریس را باید صعودی مرتب کنه.ولی اجراشو ببینید که خطا میده.
کد:
#include<iostream.h>
#include<conio.h>
int main()
{
    int r ,c,number1,number2,temp,m,n ;
    int a[2][3];
    int b[2][3];
    for ( int i = 1 ; i <= 2 ; i++ )
    {
        for ( int j = 1 ; j <=3 ; j++ )

            cin >> a[i][j] ;

    }
    for ( int i = 1 ; i <= 2 ; i++ )
    {
        for ( int j = 1 ; j <= 3 ; j++ )
        {
            cout<< a[i][j]<<"    " ;
        }
        cout<<endl;
    }
     cout<<endl<<endl<<endl;

    for ( int i = 1 ; i <= 2 ; i++ )
    {
        for ( int j = 1 ; j <= 3 ; j++ )
        {
            int s=j;
            for ( int k = i ; k <= 2 ; k++ )
            {
              for (int p=s+1;p<=3;p++)
              {
                if (a[i][j] > a[k][p] )
                {
                    temp=a[i][j];
                    a[i][j]=a[k][p];
                    a[k][p]=temp;
                }
              }
              s=0;
            }
        }
    }


    for ( int i = 1 ; i <= 2 ; i++ )
    {
        for ( int j = 1 ; j <= 3 ; j++ )
        {
            cout<< a[i][j]<<"   " ;

        }
        cout<<endl;
    }
    getch();
}


RE: صعودی کردن ماتریس mدرn - αɾια - ۲۳ اردیبهشت ۱۳۹۷ ۰۹:۵۱ ق.ظ

سلام، من هنوز خیلی از متلب سردرنمیارم ولی یه مثالی دیدم که از sort برای صعوی کردن استفاده کرده بود.

"چنانچه یک ماتریس به دستور sort داده شود، دستور sort عناصر را در یکی از ابعادی که مشخص می کنیم، مرتب خواهد نمود. اگر هیچ بعدی را مشخص نکنیم، دستور sort ، عناصر را در جهت ستون ها مرتب خواهد نمود."

مثال_عناصر ماتریس A را در جهت ستون ها، مرتب می کنیم:
کد:
clear all
close all
clc

A=[5 9 7; 3 1 4; 6 2 8]
B=sort(A)

نتیجه:
[تصویر:  455205_cpkb_nt.jpg]

RE: صعودی کردن ماتریس mدرn - The BesT - 23 اردیبهشت ۱۳۹۷ ۱۰:۳۴ ق.ظ

مرسی خانم کیمیا Heart

بله.توی متلب یه دستوری هست به اسم sort که اگر بنویسیمش سریع کل عناصر ماتریس را مرتب میکنه. ولی من میخوام خودم بدون استفاده از دستور sort و بوسیله for و if اینکار کنم. SmileHeart

بعد این دستور sort ظاهرا هر سطر یا ستون ماتریس را مرتب میکنه. ولی میخوام کل عناصر ماتریس را صعودی مرتب کنه. یعنی بیاد تک تک درایه های ماتریس را باهم مقایسه کنه و کوچکترین توی [۱][۱]a قرار بگیره. کوچکترین عدد بعدی در کل درایه های ماتریس توی خونه [۲][۱]a قرار بگیره . به همین ترتیب تا
خونه [۳][۲]a پر بشه Smile

RE: صعودی کردن ماتریس mدرn - Behnam‌ - ۲۳ اردیبهشت ۱۳۹۷ ۱۰:۵۷ ق.ظ

(۲۳ اردیبهشت ۱۳۹۷ ۰۹:۰۵ ق.ظ)The BesT نوشته شده توسط:  سلام مجدد
متلب نداشتم. برنامه را در محیط ++borland c نوشتم.اندیس هم از یک میگذاشتم خطا نمیگرفت.
کل برنامش اینه که گذاشتم. اول اعداد توی ماتریس را دونه دونه میخونه و ماتریس را میسازه. بعد ماتریس را باید صعودی مرتب کنه.ولی اجراشو ببینید که خطا میده.
کد:
#include<iostream.h>
#include<conio.h>
int main()
{
    int r ,c,number1,number2,temp,m,n ;
    int a[2][3];
    int b[2][3];
    for ( int i = 1 ; i <= 2 ; i++ )
    {
        for ( int j = 1 ; j <=3 ; j++ )

            cin >> a[i][j] ;

    }
    for ( int i = 1 ; i <= 2 ; i++ )
    {
        for ( int j = 1 ; j <= 3 ; j++ )
        {
            cout<< a[i][j]<<"    " ;
        }
        cout<<endl;
    }
     cout<<endl<<endl<<endl;

    for ( int i = 1 ; i <= 2 ; i++ )
    {
        for ( int j = 1 ; j <= 3 ; j++ )
        {
            int s=j;
            for ( int k = i ; k <= 2 ; k++ )
            {
              for (int p=s+1;p<=3;p++)
              {
                if (a[i][j] > a[k][p] )
                {
                    temp=a[i][j];
                    a[i][j]=a[k][p];
                    a[k][p]=temp;
                }
              }
              s=0;
            }
        }
    }


    for ( int i = 1 ; i <= 2 ; i++ )
    {
        for ( int j = 1 ; j <= 3 ; j++ )
        {
            cout<< a[i][j]<<"   " ;

        }
        cout<<endl;
    }
    getch();
}

چرا مقاومت می‌کنید و چیزی که گفتم رو امتحان نمی‌کنید؟ اینکه تماما از ۰ شروع کنید و انتهای اندیس رو شامل نکنید، مثال:
int i = 0; i < 2
int p = s+1; p < 3

RE: صعودی کردن ماتریس mدرn - The BesT - 23 اردیبهشت ۱۳۹۷ ۰۱:۵۹ ب.ظ

ممنون آقا بهنام.
انجام دادم و درست شدRolleyesRolleyesHeart
البته چون از صفر شروع کردم و در انتهای حلقه s=0وجود داشت دیگه p=s+1 ؤا باید برمیداشتم و p=s گذاشتم.
ممنووون Heart

فقط یه سوال : من توی معرفی اولیه ماتریس اندیسها را از ۱شروع کردم. پس باید قاعدتا توی تعریف همون اندیسهای ۱ را بخونه. چرا خطا میداد پس؟


این هم کدش.
البته برای m*n هم الان تعمیمش میدم. کدش را میگذارم برای هرآنکه بخواهد .. SmileSmile

کد:
#include<iostream.h>
#include<conio.h>
int main()
{
    int r ,c,number1,number2,temp,m,n ;
    int a[2][3];
    int b[2][3];
    for ( int i = 0 ; i < 2 ; i++ )
    {
        for ( int j = 0 ; j <3 ; j++ )

            cin >> a[i][j] ;

    }
    for ( int i = 0 ; i < 2 ; i++ )
    {
        for ( int j = 0 ; j < 3 ; j++ )
        {
            cout<< a[i][j]<<"    " ;
        }
        cout<<endl;
    }
     cout<<endl<<endl<<endl;

    for ( int i = 0 ; i < 2 ; i++ )
    {
        for ( int j = 0 ; j < 3 ; j++ )
        {
            int s=j;
            for ( int k = i ; k < 2 ; k++ )
            {

              for (int p=s;p<3;p++)
              {
                if (a[i][j] > a[k][p] )
                {
                    temp=a[i][j];
                    a[i][j]=a[k][p];
                    a[k][p]=temp;
                }
              }
              s=0;
            }
        }
    }


    for ( int i = 0 ; i < 2 ; i++ )
    {
        for ( int j = 0 ; j < 3 ; j++ )
        {
            cout<< a[i][j]<<"   " ;

        }
        cout<<endl;
    }
    getch();
}

تعمیم برای m و n :
دو عدد اول سطر و ستون ماتریس خوانده میشه. به تعداد سطر و ستون منتظر میمونه عدد وارد کنیم.بعد ماتریس را تشکیل میده و صعودی میکنه.

کد:
#include<iostream.h>
#include<conio.h>
int main()
{
    int temp,m,n ;
    int a[2][3];
    cin>>m;
    cin>>n;

    for ( int i = 0 ; i < m ; i++ )
    {
        for ( int j = 0 ; j <n ; j++ )

            cin >> a[i][j] ;

    }
    for ( int i = 0 ; i < m ; i++ )
    {
        for ( int j = 0 ; j < n ; j++ )
        {
            cout<< a[i][j]<<"    " ;
        }
        cout<<endl;
    }
     cout<<endl<<endl<<endl;

    for ( int i = 0 ; i < m ; i++ )
    {
        for ( int j = 0 ; j < n ; j++ )
        {
            int s=j;
            for ( int k = i ; k < m ; k++ )
            {

              for (int p=s;p<n;p++)
              {
                if (a[i][j] > a[k][p] )
                {
                    temp=a[i][j];
                    a[i][j]=a[k][p];
                    a[k][p]=temp;
                }
              }
              s=0;
            }
        }
    }


    for ( int i = 0 ; i < m ; i++ )
    {
        for ( int j = 0 ; j < n ; j++ )
        {
            cout<< a[i][j]<<"   " ;

        }
        cout<<endl;
    }
    getch();
}


RE: صعودی کردن ماتریس mدرn - Behnam‌ - ۲۳ اردیبهشت ۱۳۹۷ ۰۲:۲۴ ب.ظ

(۲۳ اردیبهشت ۱۳۹۷ ۰۱:۵۹ ب.ظ)The BesT نوشته شده توسط:  فقط یه سوال : من توی معرفی اولیه ماتریس اندیسها را از ۱شروع کردم. پس باید قاعدتا توی تعریف همون اندیسهای ۱ را بخونه. چرا خطا میداد پس؟

متوجه سوال‌تون نشدم. اندیس رو از ۱ شروع نمی‌کنند، در این صورت ستون و سطر اول مقداردهی نمی‌شن. نمی‌دونم کامپایلر شما چرا ارور نمی‌ده و چه بهینه‌سازی‌های اشتباهی انجام می‌ده که میاد مثلا اندیس a2,3 که وجود خارجی نداره رو مقداردهی می‌کنه (حدس می‌زنم آرایه رو گسترش می‌ده) ولی به هر حال یه ذره ++Cایی که کار کرده بودم به همچین چیزایی ارور می‌داد.
ضمنا برنامه اگه مشکل حافظه نداره، من جای شما بودم اول ماتریس رو تبدیل به آرایه‌ِ یه بعدی می‌کردم و اون رو مرتب می‌کردم و دوباره به ماتریس تبدیل می‌کردم. سربار زمانی خاصی هم گمون نکنم اضافه کنه چون کشِ داده در دسترسی به ماتریس کار خودش رو خوب انجام می‌ده.