PDA

View Full Version : سوال: درخواست راهنمایی برای مرتب سازی BucketSort



Omid707
دوشنبه 05 مهر 1389, 20:33 عصر
باسلام
مشکلی دررابطه با این تمرین داشتم لطفا راهنمایی کنید البته تمرین دانشجویی نیست. من بخاطر علاقه ای که به برنامه نویسی داشتم بصورت آزاد دارم یاد میگیرم:تشویق:
تمرین از کتاب دیتل فصل آرایه ها
مرتب سازی بروشBucketSort
تابعی بنویسید که یک آرایه صحیح و سایز آرایه را بعنوان آرگومان دریافت کند و مراحل زیر راانجام دهد........................

خب من تو مراحل مشکل نداشتم وکد لازم رو نوشتم مشکل من اینجاست که مجبورم سایز آرایه رو بصورت دستی وداخل تابع بنویسم در حالی که تابع باید سایز رو بصورت آرگومان از برنامه دریافت کنه اما من هرکاری کردم
تابع آرایه اعداد صحیح رو میخونه ولی سایز رو قبول نمیکنه این هم کدی که نوشتم واجرا نمیشه

البته اگه به متغییر N داخل تابع مقدار بدم اجرا میشه ولی تمرین چیز دیگه ای خواسته:عصبانی++:
اگه کد شلوغه ببخشید بدون استاد و کلاس یاد گرفتن این نتایج رو هم داره




void BucketSort(const int N , int Number[] )
{
const int B=10;

int BucketSort[B][N];

for(int a=0 ; a<B ; a++)
{
for(int b=0 ; b<N ; b++)
{
BucketSort[B][N]=-1;
}
}

enum Ststus{CONTINUE,END};
int Sort=CONTINUE;

int k=1;
int p;
int Result;
int Remainder;
int Item;
int T;
int s;

while( Sort == CONTINUE )
{
s=0;
p=10*k;
T=0;


for(int i=0 ; i<N ; i++)
{
Result=Number[i]/p;
Remainder=Number[i]-(Result*p);
Item=Remainder / (k);
BucketSort[Item][s]=Number[i];
s++;

if( Item > 0)
{
T++;
}

}//end of - for(int i=0 ; i<N ; i++)

int c=0;
for(int i=0 ; i<B ; i++)
{
for(int j=0 ; j<N ; j++)
{
if( BucketSort[i][j] >=0 )
{
Number[c]=BucketSort[i][j];
c++;
}
}
}

for(int a=0 ; a<B ; a++)
{
for(int b=0 ; b<N ; b++)
{
BucketSort[a][b]=-1;
}
}

if( T == 0)
{
Sort=END;
}
k*=10;

}//end of - while( Sort == CONTINUE )

}//end of Function BucketSort

Omid707
دوشنبه 05 مهر 1389, 22:06 عصر
یه توضیح که باید اضافه کنم

آرایه ای که من تعریف کردم به این صورته BucketSort[B][N] ولی وقتی ارسال میکنم نوشته میشه BucketSort[b][N] هرچقدر که ویرایش کردم درست نشد شاید مشکل از مرورگر من باشه (شاخص B که b ارسال میشه)

بهر حال مشکل من اینه قبول کردن یک آرگومان بعنوان شاخص برای آرایه ای که داخل تابع تعریف شده:اشتباه:

Salar Ashgi
دوشنبه 05 مهر 1389, 22:55 عصر
فکر کنم مشکل تون در تعریف آرایه دوبعدی پویاست ؛



int **a = new int*[row];
for(int i=0;i<row;i++)
a[i] = new int[col];

در واقع این آرایه دوبعدی پویا معادل هستش با :


a[row][col];


موفق باشید ./

Omid707
سه شنبه 06 مهر 1389, 16:44 عصر
فکر کنم مشکل تون در تعریف آرایه دوبعدی پویاست ؛



int **a = new int*[row];
for(int i=0;i<row;i++)
a[i] = new int[col];
در واقع این آرایه دوبعدی پویا معادل هستش با :


a[row][col];
موفق باشید ./


خیلی ممنون بابت وقتی که گذاشتین و کمک کردین ولی تا این فصل از کتاب دیتل که من خوندم چیزی در این باره ننوشته بود اصلا متوجه نشدم آرایه دوبعدی پویا چیه
تو مثال کتاب هم چیزی پیدا نکردم

Salar Ashgi
سه شنبه 06 مهر 1389, 21:17 عصر
ولی تا این فصل از کتاب دیتل که من خوندم چیزی در این باره ننوشته بود اصلا متوجه نشدم آرایه دوبعدی پویا چیه
خوب شاید کمی زودتر به این بحث وارد شده اید ./
ولی در کتاب دیتل تا جایی که خاطرم هست ، بحث ایجاد آرایه های پویا در خود بخش آرایه ها بررسی نشده
و در فصول مربوط به برنامه نویسی شی گراء بحث شده است .

ولی خوب ما معمولا بیشتر با دو نوع آرایه ها در C++‎,C طرف هستیم :
1- Static و 2- Dynamic
در مورد اول سایز آرایه حتما باید قبل از مرحله اجرای برنامه مشخص باشد .
مثال :


int a[5];
ولی در مورد دوم سایز آرایه در طول اجرای برنامه مشخص میشود .
مانند :


int len;
cin>>len;
int *a = new int[len];
موفق باشید ./

mohsensaghafi
سه شنبه 06 مهر 1389, 22:20 عصر
سلام دوست عزیز.
با توجه به توضیحاتی که دادید، احتمالا منظور آقای دیتیل این بوده که شما یه آرایه با طول زیاد در نظر بگیرید و یه عدد هم ارسال کنید به این معنی که به تعداد این عدد ارسال شده داده معتبر در آرایه هست. مثلا یه آرایه با طول 100 که فقط 10 عدد شما درون اون ریختید.

Omid707
سه شنبه 06 مهر 1389, 23:14 عصر
سلام دوست عزیز.
با توجه به توضیحاتی که دادید، احتمالا منظور آقای دیتیل این بوده که شما یه آرایه با طول زیاد در نظر بگیرید و یه عدد هم ارسال کنید به این معنی که به تعداد این عدد ارسال شده داده معتبر در آرایه هست. مثلا یه آرایه با طول 100 که فقط 10 عدد شما درون اون ریختید.

تمرین خواسته شده این بود: تعدادی عدد صحیح در یک آرایه تک بعدی قرار دهید حال بر اساس
ارقام یکان، دهگان و صد گان باید این اعداد مرتب شوند برای این کار یک تابع باید نوشته شود ونیز یک آرایه دو بعدی تعریف شود که شاخص اول آن عددی مشخص است (10) و در هیچ حالتی تغییر نخواهد کرد اما شاخص دوم این آرایه همان سایز آرایه تک بعدی است که کاربر وارد خواهد کرد و از پیش مشخص نشده است پس باید بصورت آرگومان به تابع ارسال شود
دیتل تابعی خواسته که به هر تعداد عدد که بهش بدین براساس اندازه مرتب کنه
مشکل من هم این بود که عددی که به تابع ارسال میشد قبول نمیکرد و همچین اروری میداد

error C2057: expected constant expression
error C2466: cannot allocate an array of constant size 0
error C2087: 'BucketSort' : missing subscript

بنابر این تابع من فقط تعداد از قبل مشخص شده ای رومیتونه مرتب کنه نه اونیکه کتاب خواسته
وقتی همون مقدار شاخص رو داخل تابع مینوشتم برنامه اجرا میشد و دقیقا اعداد رو از کوچک به بزرگ مرتب میکرد یعنی منطق برنامه درست بود ولی در ارسال مقدار به تابع اشکال وجود داشته

تا فصل هفتم که من خوندم دیتل بطور خلاصه درباره روش های ارسال آرگومان به تابع از جمله ارسال با مراجعه را بصورت اجمالی توضیح داده که من امتحان کردم نشد

حالا هم میرم همون بخشی که جناب Salar Ashgi (http://www.barnamenevis.org/forum/member.php?u=70109) آدرس داده مطالعه میکنم امیدوارم بتونم از پسش بربیام