PDA

View Full Version : این الگوریتم چطوریه ؟؟؟



cactuskhan
یک شنبه 15 مهر 1386, 14:17 عصر
ببینین من توی table کاربران یه فیلد type دارم که نوع کاربر و تعیین میکنه و tinyint هم است
type های من به این صورت است 1,2,4,8,16,32,64 حالا یه جایی دیگه یعنی تویه table دیگه فیلدی است که مجموع بعضی از این اعداد توی اون نگهداری میشن مثلا 68 که جمع 64 و 2 است ممکنه جمع 4 تا از این اعداد باشه !

سوال من اینه چطور میتونم تشخیص بدم عددی که دارم مثلا 48 مجموع چه اعدای است ؟؟؟ :متفکر::متفکر:

hassan razavi
یک شنبه 15 مهر 1386, 14:39 عصر
آیااعداد شما همیشه فقط مجموع اعداد 1,2,4,8,16,32,64 هستند؟
چیزی جز 1,2,4,8,16,32,64 نیستند یعنی بعدا 128 یا مثلا 50 به اونها اضاف نمیشه ؟

cactuskhan
یک شنبه 15 مهر 1386, 14:57 عصر
نه اضافه نمیشند البته فعلا !
اگر روزی این اتقاق بیافته اعداد بصوری باینری اضافه میشند یعنی بعد از 64 میشه 128 بعد 256 و ...

babak23
یک شنبه 15 مهر 1386, 15:04 عصر
سوال واقعا نامفهوم هست اینطور که شما موضوع را مطرح کردی باید طرف آمار و احتمالات را
هم فول باشه

با توجه به مواردی که اشاره کردین ممکنه چندین حالت بوجود بیاد؟

به عنوان مثال
عدد 16 میتونه ترکیبی از 4 تا 4 یا 2 تا 8 یا 8 تا 2 یا 1 16 یا ........!!!!؟

cactuskhan
یک شنبه 15 مهر 1386, 15:13 عصر
سوال واقعا نامفهوم هست اینطور که شما موضوع را مطرح کردی باید طرف آمار و احتمالات را
هم فول باشه

با توجه به مواردی که اشاره کردین ممکنه چندین حالت بوجود بیاد؟

نه نه اشتباه نکن این یه الگوریتم ساده داره یه بار هم یکی بهم گفت ولی چون اون موقع نیازی نداشتم جایی یادداشت نکردم :گریه: الان هم یادم نیست !
هیچ احتمالی در کار نیست ! چرا ؟ خب مثلا عدد ما میشه 28 این هیچ جوری 28 نمیشه مگر
2+4+16 یادت باشه که اعدادی که مجموع اونها شده 28 عدد تکراری نداره یعنی 2 تا 8 و 4 و 2 نیست !!!

دیدی !!؟؟

من یه متد میخوام که چک کنه مثلا توی 28 عدد 16 هست یا نه !!!

hassan razavi
یک شنبه 15 مهر 1386, 15:41 عصر
چرا از روش دیگری استفاده نمی کنید.
هدفتوم رو بیان کنید شاید بتونیم راه حل بهتری رو بیان کنیم.
این روش در آینده می تونه دردسر ساز براتون بشه

cactuskhan
یک شنبه 15 مهر 1386, 16:25 عصر
ببینید من از یک کامپوننت استفاده می کنم که منو میسازه حالا من میخوام هر منو رو متناسب با با دسترسی هر کاربر generate بشه ! آیتم ها ی این منو توی بانک ذخیره شدن با حق دسترسی اونها !

اینم بگم که پروژه نسبتا بزرگه ! و به نظر من بهترین روشی که میشه پیاده کرد اینه ! چون بعد ها اضافه کردن یه ویرایش آیتم ها و دسترسی اونها کار بسیار راحتیه !

فقط مونده این الگوریتم !!

PC2st
یک شنبه 15 مهر 1386, 16:42 عصر
خب مثلا عدد ما میشه 28 این هیچ جوری 28 نمیشه مگر 2+4+16
خب 16+4+2=22 و برابر 28 نیست :لبخند:
خارج از شوخی، متوجه شدم منظورت چی هست، با یک سری جمع و تفریق میتونی به نتیجه دلخواه برسی.
مثلا عدد 28، میخوایم ببینیم این عدد از مجموع کدام اعداد 2 و 4 و 8 و 16 و 32 تشکیل شده... پس ابتدا چک میشه که آیا 28 بین 16 و 32 هست؟ جواب: بله، پس میایم و عدد 16 رو از عدد 28 کم میکنیم، حاصل عدد 12 خواهد بود، حال آیا عدد 12 بین 8 و 16 هست؟ جواب: بله، پس میایم و عدد 8 رو از 12 کم میکنیم، حاصل عدد 12 خواهد بود، حال آیا عدد 4 بین 2 و 4 هست؟ جواب: خیر، چون عدد 4 برابر 4 هست و بین 2 و 4 نیست، پس عدد 28 از مجوع اعداد 4 و 8 و 16 تشکیل شده است.
روند اجرا کار برای عددی مثل 28:


16 < 28 < 32
28 - 16 = 12
8 < 12 < 16
12 - 8 = 4
2 < 4 < 4
4 is not smaller than 4
28 = 16 + 8 + 4

hassan razavi
یک شنبه 15 مهر 1386, 17:25 عصر
در کد زیر من ورودی را از یک Textbox میگیرم و خروجی ها با MessageBox نمایش میدم.
شما خودتون هرطوری که می خواهید ورودی و خروجی را تغییر بدید



int[] x ={ 64, 32, 16, 8, 4, 2, 1 };
int count = 7;
int j;
int YourNumer=int.Parse(textBox1.Text),Mod=0;
while (YourNumer > 0)
{
for (j = 0; j < count; j++)
{
if (YourNumer >= x[j])
{

MessageBox.Show(x[j].ToString());
YourNumer -= x[j];
break;
}
}

}


برای توسعه هم فقط کافیه که تعداد آرایه و متغییر Count را افزایش بدید.

Mahdi.Kiani
یک شنبه 15 مهر 1386, 20:09 عصر
ببینید من از یک کامپوننت استفاده می کنم که منو میسازه حالا من میخوام هر منو رو متناسب با با دسترسی هر کاربر generate بشه ! آیتم ها ی این منو توی بانک ذخیره شدن با حق دسترسی اونها !

اینم بگم که پروژه نسبتا بزرگه ! و به نظر من بهترین روشی که میشه پیاده کرد اینه ! چون بعد ها اضافه کردن یه ویرایش آیتم ها و دسترسی اونها کار بسیار راحتیه !

فقط مونده این الگوریتم !!

به قول یکی از دوستام که میگه خدا میدونه به طور کل دارین راه را اشتباه میرین
راه های خیلی بهتری هم هست برای تعیین حق دسترسی
شما میخواین یه قسمت تعیین سطح برای کاربران برنامه داشته باشین آیا غیر از اینه ؟
به 2 تا جدول (در بعضی از حالت ها 3 تا جدول (بستگی به نوع پیاده سازی)) و یه Join ساده بین این جدول ها کارتون را میافته




ببینید من از یک کامپوننت استفاده می کنم که منو میسازه


هیچ نیازی به کامپوننت خاصی برای این امر نیست (البته اگه منظورتون منویی غیر از menustrip نباشه یعنی ظاهر خاصی داشته باشه)
شما میتونید آیتم هاتون را در runTime ساخته و به menu اضافه کنید و eventهای مربوطه را پیاده شازی کنید
خدا میدونه به طور کل به همین راحتی که گفتم

hassan razavi
یک شنبه 15 مهر 1386, 23:02 عصر
به نظرم من روش بدی نیست و جواب میده . من هم از روشی تقریبا شبیه به این استفاده میکنم. البته پیاده سازیش خیلی راحت تره.
به هر حال میتونید کدی را که دادم رو بصورت یک متد استفاده کنید و حواب بگیرید

Mahdi.Kiani
یک شنبه 15 مهر 1386, 23:20 عصر
به نظرم من روش بدی نیست و جواب میده . .


کدوم روش ؟
میشه روشتون را توضیخ بدین ببینیم از چه روشی استفاده میکنین؟

hassan razavi
یک شنبه 15 مهر 1386, 23:32 عصر
من کل سطح دسترسی را به صورت یک رشته در بانک ذخیره میکنم.
این رشته شامل نام فرمها و سطح های دسترسی مجاز مثل ویرایش ، جدید ، حذف و ... هستند.
هر فرم یک نام با طول ثابت و هر مجوز یک بایت هست.
در هنگام بارگذاری هر فرم به راحتی می توان سطح های دسترسی مجاز و غیر مجاز را برای آن فرم مشخص کرد

cactuskhan
دوشنبه 16 مهر 1386, 09:04 صبح
به قول یکی از دوستام که میگه خدا میدونه به طور کل دارین راه را اشتباه میرین
راه های خیلی بهتری هم هست برای تعیین حق دسترسی
شما میخواین یه قسمت تعیین سطح برای کاربران برنامه داشته باشین آیا غیر از اینه ؟
به 2 تا جدول (در بعضی از حالت ها 3 تا جدول (بستگی به نوع پیاده سازی)) و یه Join ساده بین این جدول ها کارتون را میافته


هیچ نیازی به کامپوننت خاصی برای این امر نیست (البته اگه منظورتون منویی غیر از menustrip نباشه یعنی ظاهر خاصی داشته باشه)
شما میتونید آیتم هاتون را در runTime ساخته و به menu اضافه کنید و eventهای مربوطه را پیاده شازی کنید
خدا میدونه به طور کل به همین راحتی که گفتم

خدا میدونه به طور کل من هم دارم آیتم ها رو RUN TIME به منو اضافه میکنم ولی فقط اینجا یه IF هست که چک میکنه اگر کاربر به این منو دسترسی داره ADD بشه در غیر این صورت بره سر آیتم بعدی همین !
بعد من دارم از ComponentArt 2007 استفاده میکنم که پیشنهاد میکنم یه نگاه بهش بندازین ببینین چه میکنه !!! :چشمک:
(یه نگاه اشکالی نداره :لبخند:)

cactuskhan
دوشنبه 16 مهر 1386, 10:39 صبح
در کد زیر من ورودی را از یک Textbox میگیرم و خروجی ها با MessageBox نمایش میدم.
شما خودتون هرطوری که می خواهید ورودی و خروجی را تغییر بدید



int[] x ={ 64, 32, 16, 8, 4, 2, 1 };
int count = 7;
int j;
int YourNumer=int.Parse(textBox1.Text),Mod=0;
while (YourNumer > 0)
{
for (j = 0; j < count; j++)
{
if (YourNumer >= x[j])
{

MessageBox.Show(x[j].ToString());
YourNumer -= x[j];
break;
}
}

}


برای توسعه هم فقط کافیه که تعداد آرایه و متغییر Count را افزایش بدید.

ممنون از شما جوابتون کامل و دقیق بود !!!

حالا یه زحمت دیگه هم داشتم !
من یه متد دارم تو یه کلاسی به نام Security که یه مقداری میگره و چک میکنه که کاربر Access داره یا نه ! فقط یه Error میده not all code paths return a value اینو میتونی حل کنی ؟؟





public static bool MenuAccessCheck(int value)
{
int[] x ={ 64, 32, 16, 8, 4, 2, 1 };
int count = 7;
int j;
if (value > 0)
{
while (value > 0)
{
for (j = 0; j < count; j++)
{
if (value >= x[j])
{
return true;
}
else
{
return false;
}
}
break;
}
}
else
{
return false;
}
}

hassan razavi
دوشنبه 16 مهر 1386, 10:45 صبح
این خطا زمانی رخ میده که کامپایلر تشخیص میده که ممکن برای این متدی حالتی پیش بیاد که هیچوقت خط return اجرا نشه چون همه return ها در شرط نوشته شده اند.
برای رفع این مشکل شما دستور else را بردارید تا یک return مستقیم در متد بوجود بیاد.


public static bool MenuAccessCheck(int value)
{
int[] x ={ 64, 32, 16, 8, 4, 2, 1 };
int count = 7;
int j;
if (value > 0)
{
while (value > 0)
{
for (j = 0; j < count; j++)
{
if (value >= x[j])
return true;
else
return false;
}
break;
}
}
return false;
}

babak23
دوشنبه 16 مهر 1386, 10:50 صبح
البته روش های مختلفی برای سطح دسترسی وجود داره
من از یک فیلد نو عددی برای سطح دسترسی استفاده میکنم و در زمان لود شدن فرم این فیلد را چک میکنم و ... حالا میخواستم ببینم این روش مناسب هست یا نه ؟

شما دوستان چه روشی را پیشنهاد می کنید

cactuskhan
دوشنبه 16 مهر 1386, 17:01 عصر
این خطا زمانی رخ میده که کامپایلر تشخیص میده که ممکن برای این متدی حالتی پیش بیاد که هیچوقت خط return اجرا نشه چون همه return ها در شرط نوشته شده اند.
برای رفع این مشکل شما دستور else را بردارید تا یک return مستقیم در متد بوجود بیاد.


public static bool MenuAccessCheck(int value)
{
int[] x ={ 64, 32, 16, 8, 4, 2, 1 };
int count = 7;
int j;
if (value > 0)
{
while (value > 0)
{
for (j = 0; j < count; j++)
{
if (value >= x[j])
return true;
else
return false;
}
break;
}
}
return false;
}


آقا جواب درست ندید !!! مردم پررو میشن !!!:لبخند:

منم الان پررو شدم ! :لبخند:

اگه بخوام مقدار x رو خودم بدم (به عنوان پارامتر)بگم مثلا 64 یا 32 یعنی یکی از این اعداد این متد رو باید چطوری بنویسم !؟؟؟:متفکر:

hassan razavi
دوشنبه 16 مهر 1386, 17:12 عصر
منظورتون را درست متوجه نمیشم.
x یک آرایه است که توسط اندیسش ، مقداری را برمیگرداند.
اگه می خواهید که فقط یک عدد باشه و بصورت پارامتر هم باشه به روش زیر استفاده کند :


public static bool MenuAccessCheck(int value, int x)
{
int j;
if (value > 0)
{
while (value > 0)
{
for (j = 0; j < count; j++)
{
if (value >= x)
return true;
else
return false;
}
break;
}
}
return false;
}


اگه درست متوجه نشده ام ، لطفا دوباره مفصل توضیح بدید.

cactuskhan
سه شنبه 17 مهر 1386, 08:27 صبح
ببخشید count کجا تعریف شده ؟؟

hassan razavi
سه شنبه 17 مهر 1386, 08:37 صبح
دوست من وقتی که دیگه از آرایه استفاده نمیکنید و می خواهید از یک عدد ثابت مثل 32 یا 64 استفاده کنید ، دیگه نیازی به Count نیست

cactuskhan
سه شنبه 17 مهر 1386, 08:39 صبح
منظورتون را درست متوجه نمیشم.
x یک آرایه است که توسط اندیسش ، مقداری را برمیگرداند.
اگه می خواهید که فقط یک عدد باشه و بصورت پارامتر هم باشه به روش زیر استفاده کند :


public static bool MenuAccessCheck(int value, int x)
{
int j;
if (value > 0)
{
while (value > 0)
{
for (j = 0; j <count; j++)
{
if (value >= x)
return true;
else
return false;
}
break;
}
}
return false;
}


اگه درست متوجه نشده ام ، لطفا دوباره مفصل توضیح بدید.


پس بجای count چی بزارم ؟؟:ناراحت:
یعنی احتیاج به For نیست ؟؟

hassan razavi
سه شنبه 17 مهر 1386, 08:58 صبح
ببخشید دوست عزیز ، من فراموش کردم. در این روشی که شما دارید دیگه نیازی به حلقه نیست و می تونید حذفش کنید



public static bool MenuAccessCheck(int value, int x)
{
int j;
if (value > 0)
{
while (value > 0)
{
if (value >= x)
return true;
else
return false;
break;
}
}
return false;
}


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

cactuskhan
سه شنبه 17 مهر 1386, 11:56 صبح
ببخشید دوست عزیز ، من فراموش کردم. در این روشی که شما دارید دیگه نیازی به حلقه نیست و می تونید حذفش کنید



public static bool MenuAccessCheck(int value, int x)
{
int j;
if (value > 0)
{
while (value > 0)
{
if (value >= x)
return true;
else
return false;
break;
}
}
return false;
}


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

از پاسخگویی شما کمال تشکر و قدر دانی رو دارم !!

بهترین راه حل رو برای این کار رو پیدا کردم خیلی راحته!:بوس:
استفاده از and بیتی !:چشمک:

کافیه که این 2 تا عدد رو باهم and بیتی کنیم اگه جواب صفر شده یعنی هیچ وجه مشترکی با هم ندارند !!