PDA

View Full Version : تبدیل باینری اعداد



vahid_d_0101
چهارشنبه 27 شهریور 1387, 15:46 عصر
با سلام من میخوام یه تکست باکس داشته باشم که اعداد بین 1 تا 31 رو بگیره و اعدادی برابر اون که پایه های دو دارند و توان های مختلف تو یه تکست باکس بنویسه
مثلا اگر 5 را تو تکست باکس نوشتیم اون یه تکست باکس دیگه رو برابر
2^0 , 2^2 بکنه
یا مثلا برای عدد 7
2^0 و 2^1 و 2^2
امید وارم درست توضیح داده باشم

mehdad.koulab
چهارشنبه 27 شهریور 1387, 17:08 عصر
سلام
بهتره شما يك آرايه از توان دو اعداد تا 31 مثلا 5^2 ( كه ميشه 32) داشته باشين بعد عدد رو كه گرفتين مقايسه كنين و اولين عدد رو كه به دست آورديد از عدد اصلي منها كنيد بعد اين عمل رو براي باقيمانده انجام بدين تا به 0^2 برسين
مثلا براي عدد 7
بزرگترين توان 2 =2^2 - - - > 3=4-7
حالا عدد باقيمانده 3 است
بزرگترين توان 2= 1^2 - - - > 1=2-3
حالا عدد باقيمانده 1 است
1^2 - - - > 0=1-1
در هر مرحله توان دو رو چاپ كنه

vahid_d_0101
چهارشنبه 27 شهریور 1387, 23:14 عصر
می تونید یه سورس بزارید البته اگر زحمتی نیست ببخشیدا

xxxxx_xxxxx
پنج شنبه 28 شهریور 1387, 01:58 صبح
dim n as byte
for i=0 to int(sqr(n))
if i^2 <=n then text1.text=text1.text & str(i) & "^" & "2, "
next i

n همون عددی هست که گفتی از تکست باکس میگیریم (بین 1 تا 31)
وحید جان اینو امتحان کن. سعی کردم حلقه تا اونجا که ممکنه بهینه باشه. من VB رو سیستمم نصب نیست که امتحان کنم همینجوری نوشتم.
نتیجشو بگو

راستی این چه ربطی به باینری داشت؟

vahid_d_0101
پنج شنبه 28 شهریور 1387, 02:03 صبح
یه تغیراتی دادم که خیلی عالی تر شد مال تو فقط همیشه 2 به توان 0 رو چاپ میکرد
حالا تنها مشکلش اینه که همیشه 2 به توان 0 هم چاپ میکنه

Dim n As Byte
Private Sub Command1_Click()
For i = 0 To Int(Sqr(6))
If i ^ 2 >= n Then Text1.Text = Text1.Text & "2" & "^" & Str(i) & " ,"
Next i
End Sub
مشکل بزرگ تر
همیشه تا توان اخر میره یعنی برای عدد 12
از 2 به توان 3 شروع میکنه میره تا 0

xxxxx_xxxxx
پنج شنبه 28 شهریور 1387, 02:07 صبح
خب شروع حلقه رو از یک بزار

چرا علامت مقابسه رو برعکس کردی؟ راستی اینم درنظر بگیر که 2 به توان n همیشه برابر با n به توان 2 نیست

میشه خروجی این قطعه کد که تو text ظاهر میشه رو اینجا بزاری؟ (مال خودت)

vahid_d_0101
پنج شنبه 28 شهریور 1387, 02:09 صبح
نمیشه دیگه هیچ وقت به توان 0 رو نمیاره
اخه وقتی علامت به جهتیه که شما گذاشتید فقط 2 به توان 0 رو میاره
کدوم اونی که خودت نوشتی یا اونیکه من گذاشتم

vahid_d_0101
پنج شنبه 28 شهریور 1387, 02:23 صبح
وقتی میخواهیم یه عدد رو به باینری تبدیل کنیم باید به 2 تقسیم کنیم غییر از اینه ما اینجا فقط نمیخواهیم جواب تقسیم رو بدونیم فقط میخاهیم عداد رو به پایه های 2 و توان های متغییر تجزیه ( تجزیه نمیشه گفت ) کنیم
اون کدی که تو گذاشتی همیشه برای همه عداد 2 به توان 0 رو برعکس چاپ میکرد
اون کدی که من گذاشتم مثلا برای اعداد 9 تا 15 اینو چاپ میکنه


2^ 0 , 2^ 1 , 2^ 2 , 2^ 3 ,

xxxxx_xxxxx
پنج شنبه 28 شهریور 1387, 02:35 صبح
پس مثل این که من اصلاً متوجه سوال اولت نشدم. یعنی شما می خواین دو تا عدد بگیره توان های عدد دو بین این دو عددی که گرفتیم رو بدست بیاریم؟


مثلا برای اعداد 9 تا 15

vahid_d_0101
پنج شنبه 28 شهریور 1387, 02:39 صبح
نه نه
من میگم برای اعداد 9 تا 15 همش همین عدد رو چاپ میکنه و برای مثلا 16 تا 32 یه اعداد دیگه چاپ میکنه در واقع باید برای عدد 9 بیاد
2 به توان 3 و 2 به توان 0 را چاپ کنه وبرای عدد مثلا 12 بیاد 2 به توان 3 و 2 به توان 2 را چاپ کنه

xxxxx_xxxxx
پنج شنبه 28 شهریور 1387, 02:44 صبح
مگه نمیخای از 2 به توان 0 شروع شه تا جایی که 2 به توان یه عددی که حاصلش کوچکتر از عدد ورودی باشه.
اگه اینطوری می خوای که کد درست کار می کنه.

vahid_d_0101
پنج شنبه 28 شهریور 1387, 02:47 صبح
نه بابا باید اعدادی رو چاپ کنه که وقتی اونارو باهم جمع کردیم حاصل با عدد ورودی یکی بشه

xxxxx_xxxxx
پنج شنبه 28 شهریور 1387, 02:59 صبح
ok
این اعداد یه اسمی داشتند. اگه اسمشو می دونی تو سایت سرچ کن حتماً پیدا می کنی.
آخه نگاه کن این برنامه باید یه الگوریتم خاصی داشته باشه. که تو این چند دقیقه نمیشه با فکر کردن بهش رسید. تو در نظر بگیر که برنامه باید چک کنه ببینه این عددهایی که بدست امده رو چه جوری با هم جمع کنه که حاصل بشه همون عدد ورودی.
حالا من تا فردا سعی می کنم الگوریتمشو بنویسم گرچه VB ندارم. تو نت هم دنبالش باش اگه اسم اون اعداد رو بدونی که خیلی راحت تر میشه پیداشون کرد.

ولی اگه خیلی عجله داری و حداکثر تا عدد 31 میخوای یه راهش اینه که خودت اینا رو حساب کنی و مستقیماً اعداد رو به برنامه بدی. فکر نکنم زیاد طول بکشه. برنامه هم سریع تر میشه. ولی یه بدی ای که داره اینه که آخرش راه این کارو یاد نمی گیریم.

موفق باشی.

vahid_d_0101
پنج شنبه 28 شهریور 1387, 03:01 صبح
تا جاییی که ما این بازی رو انجام میدادیم ( اگه به نتیجه رسیدیم این بازی رو میگم خیلی باحاله ) به ما میگفتن طرز جیدن اعداد به صورت باینری هست.
آره قبلا این فکر به ذهنم خورده بود و برنامه اش رو نوشتم هیچ کاری نداره ولی حالا اومدیم یه کسی خواست عداد بیشتری رو وارد کنه این بار خیلی ضایع می شه.
OK

vahid_d_0101
پنج شنبه 28 شهریور 1387, 16:09 عصر
کسی نبود جواب بده

xxxxx_xxxxx
پنج شنبه 28 شهریور 1387, 16:30 عصر
سلام.

ببین تا الان تا اینجای کار که ما تونستیم توان اعداد رو بدست بیاریم بزار کنار.

الان باید یه برنامه نوشت که مثلاً ما 5 عدد داریم. حالا این 5 عدد رو چگونه با هم جمع کنیم تا حاصل بشود عدد n
. به نظر من بد ترین راه (از لحاظ طولانی بودن) استفاده از حلقه های تو در تو هست.

برای دوستان دیگری که میخوان کمک کنند یه سری توضیحات:


2^0=1
2^1=2
2^2=4
2^3=8
2^4=16


دوستان ما این اعداد رو داریم (1 و 2 و 4 و 8 و 16).
حالا یه عدد دیگه از ورودی دریافت کردیم که کوچکتر از 32 هست.(اسمشو می زاریم n)
می خوایم ببینیم این مجموعه اعداد رو چه جوری با هم جمع کنیم تا حاصل برابر با n بشه.

البته این کارو میشه با چند تا دستور if ساده نوشت که ما نمی خوایم اینطور باشه. چون باید بعداً قابل توسعه باشه.
متشکرم.

xxxxx_xxxxx
پنج شنبه 28 شهریور 1387, 18:57 عصر
از همکاری صمیمانه شما دوستان کمال تشکر رو دارم.
آخرشم مجبور شدم VB رو نصب کنم.


Private Sub Command1_Click()
Dim x(5) As Byte
x(0) = 0
x(1) = 1
x(2) = 2
x(3) = 4
x(4) = 8
x(5) = 16
For i = 0 To 5
For j = 0 To 5
For k = 0 To 5
For p = 0 To 5
If x(i) + x(j) + x(k) + x(p) = Val(Text1.Text) Then
MsgBox x(i) & " " & x(j) & " " & x(k) & " " & x(p): Exit Sub
End If
Next p
Next k
Next j
Next i
End Sub


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

بدرود/

vahid_d_0101
پنج شنبه 28 شهریور 1387, 21:50 عصر
کد خیلی خوب بود ولی ای کاش میشد اعداد را توان دار بنویسیم

r0ot$harp
پنج شنبه 28 شهریور 1387, 22:14 عصر
کد خیلی خوب بود ولی ای کاش میشد اعداد را توان دار بنویسیم



حاجی منظورت چیه ؟

مگه کد باینری با توان نشون داده می شه .


باتشکر احسان

mehdad.koulab
پنج شنبه 28 شهریور 1387, 22:19 عصر
سلام ببنيد دوستان من ميخواستم اين كارو با يه حلقه do while انجام بدم با تعريف يه متغير براي ذخيره باقيمانده در هر بار عمليات (پست دوم رو ببنيد) ولي نتونستم هر كاري كردم فقط بزرگترين عدد رو نشون داد مثلا اگه 17 وارد ميكردم 16 اگه 31 هم وارد ميكردم فقط 16 رو نشون ميداد. يا اگه 15 وارد ميكردم 8 نشون ميداد ديگه بقيه رو نشون نميداد. فكر كنم اگه از اين روش انجام بشه يه كم بهتر بشه از همون لحاظ طولاني بودن. سورس رو فكر كنم پاك كردم اگه پيدا كردم ميذارم اگه هم نه دوباره مينويسم وميذارم تا ببينيم مپكل از كجاست.

vahid_d_0101
پنج شنبه 28 شهریور 1387, 23:02 عصر
اقا احسان شما از اول تاپیک بخونید ببینید ما میخواهیم چه کار کنیم بعد ...

xxxxx_xxxxx
پنج شنبه 28 شهریور 1387, 23:34 عصر
دوستان این نمونه تقریباً تکمیلیش هست. تا عدد 14 رو همون چیزی که باید نشون بده نشون میده.
بعد از اون چون عدد 16 هم تو جمع اعداد دخالت داره و روشی که من استفاده کردم( کاراکتر به کاراکتر خوندن نتیجه) مشکل ساز میشه.
من که حوصلم سر رفت.
بقیشو خودتون درست کنید.
چون آخرش به این نتیجه رسیدم که اگر یکی یکی خودمون حساب کنیم و مستقیم حاصل رو به خروجی بفرستیم راحت تره.:چشمک:

vahid_d_0101
جمعه 29 شهریور 1387, 00:07 صبح
خیلی عالی بود بچه ها من دارم روش کار میکنم ببینم میتونم بیشتر ادامه اش بدم یا نه اون کد همون چیزیه که من میخوام فقط تا عدد 15 رو نشون میده بازم از جناب xxxxxxxxxxxxxxxxx تشکر میکنم که این قدر به این بحث ادامه دادن