PDA

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



amaali20
جمعه 08 مرداد 1395, 13:18 عصر
سلام
برای قسمتی از برنامه ام شش تا عدد دارم که باید آنها را رتبه بندی کنم.
وقتی نمرات ناهمسان باشند مشکلی ندارم.
ولی اگر همسان باشند باید رتبه میانگین آنها نوشته شود . در این مثال نمرات خام رتبه 3 و 4 و 5 همسان می باشند محاسبه بدین صورت می باشد 12= 5+4+3 که وقتی بر 3 تقسیم شود عدد 4 بدست می آید، پس برای 3 و 4 و 5 عدد 4 نوشته می شود

141738

لطفا راهنمایی بفرمایید که کد نویسی آن به چه صورت می باشد.

m.4.r.m
دوشنبه 18 مرداد 1395, 18:03 عصر
شما فقط اعداد را رتبه بندی کن پایین رو ثابت نگه دار لزومی نداره پایین هم رتبه بندی بشه

amaali20
سه شنبه 19 مرداد 1395, 22:23 عصر
ولی من رتبه بندی پایینی را لازم دارم
مرحله بعد این اعداد رتبه بندی پایینی با اعداد دیگه جمع زده میشه

amaali20
دوشنبه 25 مرداد 1395, 22:40 عصر
یکی خودم نوشتم توی قسمت شناسایی تکست های تکراری مشکل داره و به جای جمع رتبه تکست های تکراری، رتبه همه تکست ها را جمع میزند

لطفا راهنمایی کنید

amaali20
شنبه 24 مهر 1395, 21:14 عصر
دوستان اگه ممکنه یه راهنمایی بفرمائید

nerset
شنبه 24 مهر 1395, 22:44 عصر
با سلام
راه حل هرگونه سوالی در رتبه بندی خیلی ساده است و در این مورد اگر درست متوجه شده باشم و منظور شما این باشد که در صورت بوجود آمدن اعداد مساوی (نمرات)
بتوان رتبه یکسانی را به آنها داد به دلیل اینکه تعداد نمرات محدود و کم یعنی شش تا می باشد به سادگی قابل حل است ولی هنوز نمی دانم که در مثالی که زده اید چرا رتبه ها
را با هم جمع کرده اید؟ چون با این کار رتبه سوم و پنجم در مجموعه گم می شود و همچنین رتبه ششمی هم وجود نخواهد چون وقتی معنی پیدا می کند که رتبه پنجمی هم وجود داشته باشد.
به هر حال به عنوان یک راه حل پیشنهادی می توان بعد از اتمام رتبه بندی اعداد ، الگوریتم دیگری شروع به کار کرده و به ترتیب در یک حلقه 6 تایی اعداد هر خانه را به ترتیب عنوان مرجع قرار داده و با مقایسه کردن با دیگر خانه ها به دنبال اعداد مشابه بگردد و در صورت تساوی دستور داده شود که رتبه مربوط به خود را برای آن خانه هم در نظر بگیرد ( البته باید به یاد داشته باشید اگر کار جستجو را از بالاترین رتبه انجام به پایین ترین رتبه انجام دهید این روش به درستی انجام می شود چون اعداد مشابه دیگر هم باید به رتبه بالاتر و در عین حال مساوی با رتبه عدد مرجع خود برسند) و با پیشرفت این کار در صورتی که اولین خانه بتواند رتبه صحیح را به دیگر خانه هایی که عدد مشابهی دارند منتقل کند کار بررسی و تغییر رتبه ها برای دیگر خانه ها به نوعی خنثی محسوب خواهد شد که پس از انجام این الگوریتم و به عنوان پیشنهاد بهتر به منظور واضح شدن کار الگوریتم ها در یک الگوریتم بعدی و نه در همین الگوریتم ، می توان کار رتبه بندی را برای جا به جایی و پر شدن فضای خالی بین رتبه ها ، مقادیر رتبه ها را از نوع باز نویسی نمود تا مثلا اگر رتبه پنجم وجود نداشته باشد و در عین حال رتبه ششم وجود داشته باشد بتوان آن خانه را به رتبه پنجم ارتقاء داد.
البته قطعا را حل های بهتر و ساده تری هم برای این کار وجود دارد ولی در حال حاضر آنچه که به عنوان پیشفرض به ذهنم رسید همین راه حل بود.
با آرزوی موفقیت برای شما

amaali20
یک شنبه 25 مهر 1395, 15:50 عصر
سلام
ممنون
- منظور من هم همان اعداد مساوی (نمرات مساوی) می باشد
- اینکه رتبه ها گم می شوند اشکالی ندارد چون توی کاری که انجام می دهم، قانون کار همینه. حتی بعضی وقتها اعشار هم می گیرد


در ضمن آخرین کاری که انجام داده ام را به پیوست ارسال می کنم لطفا بررسی کنید ببینید چطوری باید کد نویسی کنم.
با تشکر

nerset
دوشنبه 26 مهر 1395, 11:52 صبح
با سلام
کدهای ضمیمه شده را مشاهده کردم و منظور شما را در بهم ریختگی رتبه ها در صورت یکسان بودن نمرات با استفاده از راه حلی که استفاده کرده اید را متوجه شدم.
مشکل اصلی این بهم ریختگی مربوط به عدم قطع روال انتخاب بعد از انتخاب شده یکی از گزینه ها می باشد.
مثلا برای رتبه بندی که انجام داده اید در یک بازه شش گزینه اگر شرط دوم صحیح باشد و رتبه مورد نظر ثبت شود روال متوقف نمی شود و سراغ شرط های دیگر در همان بازه می رود
که در مثلا در صورت صحیح بودن شرط پنجم هم رتبه مورد نظر در آن شرط هم با مقداری متفاوت این بار جایگزین قبلی شده و ثبت می شود.
که این حالت انتخاب برای دو نمره یکسان و در دو بازه شش تایی مختلف ممکن است که دو رتبه مختلف را ایجاد کند.
قسمتی از کدهای نوشته شده در برنامه مورد نظر:

If LablLR(4).Caption = Val(Textn(0).Text) Then TextN2(0).Text = "2"
If LablLR(4).Caption = Val(Textn(1).Text) Then TextN2(1).Text = "2"
If LablLR(4).Caption = Val(Textn(2).Text) Then TextN2(2).Text = "2"
If LablLR(4).Caption = Val(Textn(3).Text) Then TextN2(3).Text = "2"
If LablLR(4).Caption = Val(Textn(4).Text) Then TextN2(4).Text = "2"
If LablLR(4).Caption = Val(Textn(5).Text) Then TextN2(5).Text = "2"

در کدهای این بازه شش تایی هیچ دستور توقفی وجود ندارد و همچنین در صورت نوشته شدن این کدها از پایین به بالا رتبه بندی هم ممکن است که تغییر کند که البته در این مورد مشکلی وجود ندارد چون یک حالت انتخاب ثابت و قراردادی است ولی برای ایجاد توقف در این بازه شش تایی حتما باید یک دستور توقف برای جلوگیری از ادامه اجرای کدهای داخل این بازه برقرار شود که یکی از روش ها برای انجام آن پرچم گذاری گذاری است یعنی یک متغیر جداگانه را در ابتدای شروع بررسی بازه در نظر گرفته و مقدار آن را مثلا صفر کنید و کدهای شرطی هر قسمت را فقط در صورت برقرار بودن شرط صفر بودن آن متغیر ادامه دهید و نیز در صورت پیدا شدن اولین تساوی و ثبت رتبه در این بازه ، متغیر پرچم گذاری شده هم در ادامه آن دستور به عددی مخالف صفر و مثلا یک تغییر کند.
همچنین روش دوم و به نظر من بهتری که برای این کار وجود دارد استفاده از روش انتخاب کننده و یا به عبارتی سوییچ می باشد که در زیر آمده است:

Select Case M

Case M1

Dastur 1

Case M2

Dastur 2

Case M3

Dastur 3

End Select

در این حالت مقدار متغیر M همان خانه اصلی و به عبارتی معادل LablLR 4 می باشد و مقادیر M1 و M2 و M3 و .. هم خانه های بررسی شونده و به عبارتی معادل Textn 1 و ... هستند که البته می توانید به همین ترتیب تعداد شروط خود را هم بیشتر کرده و مثلا به جای سه شرط به شش شرط افزایش دهید که در اینجا در صورت برقراری تساوی در اولین شرط ممکن ، دستور مورد نظر که در اینجا به صورت Dastur1 و ... بیان شده است اجرا شده و همچنین ادامه کار این روال انتخابی متوقف شده و شرط های دیگر بررسی نمی شود و در نتیجه نمرات یکسان ، دیگر دارای رتبه های مختلفی نخواهند شد.

amaali20
دوشنبه 26 مهر 1395, 15:08 عصر
ممنون
ولی من می خواهم مشخص کنم اعداد کدام تکست شبیه هم مست مثلا توی برنامه، ما نمره خام بدست آمده داریم و در تکس باکس به نام Textn که بصورت آرایه 0 تا 5 هست قرار دارد و اعداد ایندکس 3و4 و 5 عدد 48 می باشد و من می خواهم ایندکس آنها که عدد 4 و 5 و 6 هست را با هم جمع بزند و میانگین آن را بدست بیاورد
با اون روشی که من نوشتم همه را میشه روی یک عدد ثابت (بزرگترین یا کوچکترین ایندکس) مشترک تنظیم کرد ولی چیزی که من می خواهم میانگین این ایندکس های دارای اعداد مساوی هست

در واقع نمی توانم کدی بنویسم که به من بگوید این ایندکس ها اعدادشون یکی ( مساوی) هست تا بعد بتوانم میانگین آنها را بدست بیاورم

با تشکر

nerset
دوشنبه 26 مهر 1395, 21:10 عصر
با سلام
اگر منظورتان این است که برای نمرات مساوی هم نیاز به گرفتن یک میانگین از نظر شماره جایگاه و خانه مورد نظر مربوط به نمرات خام می باشد
به راحتی می توانید بعد از اینکه الگوریتم رتبه بندی تمام شد ، کامپیوتر توسط یک الگوریتم دیگر به ترتیب از شماره 0 تا 5 نمرات خام و با در نظر گرفتن یکی خانه ها شروع به مقایسه با تک تک نمرات داخل دیگر خانه ها کند و در صورت مساوی بودن این مقادیر ، شماره ایندکس آن خانه مربوط به نمرات خام را به طور متناظر و همسان در داخل یکی از شش متغیر دیگر که در ابتدای شروع این الگوریتم همگی با عدد منفی یک جایگزین شده اند (البته می توانید از آرایه ها هم استفاده کنید ولی به دلیل کم بودن تعداد عناصر پیشنهاد نمی شود) قرار دهید و در عین حال تعداد این مقایسه هایی که به نتیجه می رسد هم در یک متغیر هفتم (یک متغیر جداگانه دیگر) با افزایش یک رقم به آن ثبت شود و پس از پایان یافتن هر دوره جستجو و مقایسه و به عبارتی پس از مقایسه با شماره آخرین شماره می توانید تمامی اعداد مربوط به این شش متغیر را به شرط صفر و بزرگ تر از صفر با هم جمع کرده و بر تعداد رقمی که در متغیر هفتم یاد شده به ثبت رسیده تقسیم کرده و بدین ترتیب میانگین شماره ایندکس نمرات خام را بدست آورید و در ادامه این میانگین بدست آمده را به شرط مساوی بودن نمره خانه های رتبه بندی شده با نمره در حال مقایسه داخل خانه های رتبه بندی قرار دهد.
در اینجا هر یک از متغیرهای اضافی شش تایی و متناظر با خانه های نمرات خام فقط در صورت مساوی بودن اعدادی برابر با صفر و بزرگتر از صفر جایگزین می شوند و بدین ترتیب می توان مکان نمرات مساوی را شبیه سازی کرد.
همچنین به طور پیش فرض چون نمرات منفی نمی شوند بنابراین متغیرهای شش گانه اضافی را در ابتدا با عدد منفی یک پر می کنیم.
در این روش چون شماره ایندکس تمامی خانه های نمرات خام ثابت هستند بنابراین حتی با وجود تکرار کار جایگذاری میانگین ایندکس ها هیچ تغییری در میانگین های اولیه بوجود نمی آید.
همچنین کار بررسی و میانگین گیری باید برای تمامی خانه ها انجام شود. همچنین به دلیل اینکه ساختار رتبه بندی مربوط به نمرات یکسان توسط این الگوریتم تغییر می کند بنابراین نیازی به اصلاح الگوریتم های قبلی (حتی با وجود خطای خروجی رتبه های مربوط به نمرات یکسان) نمی باشد و فقط کافیست که این الگوریتم در پایان الگوریتم های قبلی بیاید.
البته همانطور که قبلا هم گفته ام می توان راه حل های راحت تر و کوتاه تری را هم برای این کار در نظر گرفت ولی پیشنهاد می شود که برای شروع کار همواره یک روش کلی و بدون خطا را پیاده کنید و بعد از نتیجه گیری شروع به بهینه کردن کدها و دستورات لازم کنید.

nerset
سه شنبه 27 مهر 1395, 23:21 عصر
با سلام
کد زیر را می توانید به انتهای کدهای برنامه تان اضافه کنید که البته این کد شماره ایندکس نمرات خام یکسان را باهم جمع کرده و میانگین آنها را به جای رتبه قرار می دهد و البته می توانید در آینده آن را بهینه تر کنید.

Dim a0 As Integer
Dim a1 As Integer
Dim a2 As Integer
Dim a3 As Integer
Dim a4 As Integer
Dim a5 As Integer
Dim k As Integer



a0 = -1
a1 = -1
a2 = -1
a3 = -1
a4 = -1
a5 = -1
t = 0
If Textn(0).Text = Textn(0).Text Then
a0 = Textn(0).Text
t = t + 1
End If
If Textn(1).Text = Textn(0).Text Then
a1 = Textn(1).Text
t = t + 1
End If
If Textn(2).Text = Textn(0).Text Then
a2 = Textn(2).Text
t = t + 1
End If
If Textn(3).Text = Textn(0).Text Then
a3 = Textn(3).Text
t = t + 1
End If
If Textn(4).Text = Textn(0).Text Then
a4 = Textn(4).Text
t = t + 1
End If
If Textn(5).Text = Textn(0).Text Then
a5 = Textn(5).Text
t = t + 1
End If
k = 0
If a0 >= 0 Then k = k + 1
If a1 >= 0 Then k = k + 2
If a2 >= 0 Then k = k + 3
If a3 >= 0 Then k = k + 4
If a4 >= 0 Then k = k + 5
If a5 >= 0 Then k = k + 6
m = k / t
If a0 >= 0 Then TextN2(0).Text = m
If a1 >= 0 Then TextN2(1).Text = m
If a2 >= 0 Then TextN2(2).Text = m
If a3 >= 0 Then TextN2(3).Text = m
If a4 >= 0 Then TextN2(4).Text = m
If a5 >= 0 Then TextN2(5).Text = m




a0 = -1
a1 = -1
a2 = -1
a3 = -1
a4 = -1
a5 = -1
t = 0
If Textn(0).Text = Textn(1).Text Then
a0 = Textn(0).Text
t = t + 1
End If
If Textn(1).Text = Textn(1).Text Then
a1 = Textn(1).Text
t = t + 1
End If
If Textn(2).Text = Textn(1).Text Then
a2 = Textn(2).Text
t = t + 1
End If
If Textn(3).Text = Textn(1).Text Then
a3 = Textn(3).Text
t = t + 1
End If
If Textn(4).Text = Textn(1).Text Then
a4 = Textn(4).Text
t = t + 1
End If
If Textn(5).Text = Textn(1).Text Then
a5 = Textn(5).Text
t = t + 1
End If
k = 0
If a0 >= 0 Then k = k + 1
If a1 >= 0 Then k = k + 2
If a2 >= 0 Then k = k + 3
If a3 >= 0 Then k = k + 4
If a4 >= 0 Then k = k + 5
If a5 >= 0 Then k = k + 6
m = k / t
If a0 >= 0 Then TextN2(0).Text = m
If a1 >= 0 Then TextN2(1).Text = m
If a2 >= 0 Then TextN2(2).Text = m
If a3 >= 0 Then TextN2(3).Text = m
If a4 >= 0 Then TextN2(4).Text = m
If a5 >= 0 Then TextN2(5).Text = m




a0 = -1
a1 = -1
a2 = -1
a3 = -1
a4 = -1
a5 = -1
t = 0
If Textn(0).Text = Textn(2).Text Then
a0 = Textn(0).Text
t = t + 1
End If
If Textn(1).Text = Textn(2).Text Then
a1 = Textn(1).Text
t = t + 1
End If
If Textn(2).Text = Textn(2).Text Then
a2 = Textn(2).Text
t = t + 1
End If
If Textn(3).Text = Textn(2).Text Then
a3 = Textn(3).Text
t = t + 1
End If
If Textn(4).Text = Textn(2).Text Then
a4 = Textn(4).Text
t = t + 1
End If
If Textn(5).Text = Textn(2).Text Then
a5 = Textn(5).Text
t = t + 1
End If
k = 0
If a0 >= 0 Then k = k + 1
If a1 >= 0 Then k = k + 2
If a2 >= 0 Then k = k + 3
If a3 >= 0 Then k = k + 4
If a4 >= 0 Then k = k + 5
If a5 >= 0 Then k = k + 6
m = k / t
If a0 >= 0 Then TextN2(0).Text = m
If a1 >= 0 Then TextN2(1).Text = m
If a2 >= 0 Then TextN2(2).Text = m
If a3 >= 0 Then TextN2(3).Text = m
If a4 >= 0 Then TextN2(4).Text = m
If a5 >= 0 Then TextN2(5).Text = m




a0 = -1
a1 = -1
a2 = -1
a3 = -1
a4 = -1
a5 = -1
t = 0
If Textn(0).Text = Textn(3).Text Then
a0 = Textn(0).Text
t = t + 1
End If
If Textn(1).Text = Textn(3).Text Then
a1 = Textn(1).Text
t = t + 1
End If
If Textn(2).Text = Textn(3).Text Then
a2 = Textn(2).Text
t = t + 1
End If
If Textn(3).Text = Textn(3).Text Then
a3 = Textn(3).Text
t = t + 1
End If
If Textn(4).Text = Textn(3).Text Then
a4 = Textn(4).Text
t = t + 1
End If
If Textn(5).Text = Textn(3).Text Then
a5 = Textn(5).Text
t = t + 1
End If
k = 0
If a0 >= 0 Then k = k + 1
If a1 >= 0 Then k = k + 2
If a2 >= 0 Then k = k + 3
If a3 >= 0 Then k = k + 4
If a4 >= 0 Then k = k + 5
If a5 >= 0 Then k = k + 6
m = k / t
If a0 >= 0 Then TextN2(0).Text = m
If a1 >= 0 Then TextN2(1).Text = m
If a2 >= 0 Then TextN2(2).Text = m
If a3 >= 0 Then TextN2(3).Text = m
If a4 >= 0 Then TextN2(4).Text = m
If a5 >= 0 Then TextN2(5).Text = m




a0 = -1
a1 = -1
a2 = -1
a3 = -1
a4 = -1
a5 = -1
t = 0
If Textn(0).Text = Textn(4).Text Then
a0 = Textn(0).Text
t = t + 1
End If
If Textn(1).Text = Textn(4).Text Then
a1 = Textn(1).Text
t = t + 1
End If
If Textn(2).Text = Textn(4).Text Then
a2 = Textn(2).Text
t = t + 1
End If
If Textn(3).Text = Textn(4).Text Then
a3 = Textn(3).Text
t = t + 1
End If
If Textn(4).Text = Textn(4).Text Then
a4 = Textn(4).Text
t = t + 1
End If
If Textn(5).Text = Textn(4).Text Then
a5 = Textn(5).Text
t = t + 1
End If
k = 0
If a0 >= 0 Then k = k + 1
If a1 >= 0 Then k = k + 2
If a2 >= 0 Then k = k + 3
If a3 >= 0 Then k = k + 4
If a4 >= 0 Then k = k + 5
If a5 >= 0 Then k = k + 6
m = k / t
If a0 >= 0 Then TextN2(0).Text = m
If a1 >= 0 Then TextN2(1).Text = m
If a2 >= 0 Then TextN2(2).Text = m
If a3 >= 0 Then TextN2(3).Text = m
If a4 >= 0 Then TextN2(4).Text = m
If a5 >= 0 Then TextN2(5).Text = m




a0 = -1
a1 = -1
a2 = -1
a3 = -1
a4 = -1
a5 = -1
t = 0
If Textn(0).Text = Textn(5).Text Then
a0 = Textn(0).Text
t = t + 1
End If
If Textn(1).Text = Textn(5).Text Then
a1 = Textn(1).Text
t = t + 1
End If
If Textn(2).Text = Textn(5).Text Then
a2 = Textn(2).Text
t = t + 1
End If
If Textn(3).Text = Textn(5).Text Then
a3 = Textn(3).Text
t = t + 1
End If
If Textn(4).Text = Textn(5).Text Then
a4 = Textn(4).Text
t = t + 1
End If
If Textn(5).Text = Textn(5).Text Then
a5 = Textn(5).Text
t = t + 1
End If
k = 0
If a0 >= 0 Then k = k + 1
If a1 >= 0 Then k = k + 2
If a2 >= 0 Then k = k + 3
If a3 >= 0 Then k = k + 4
If a4 >= 0 Then k = k + 5
If a5 >= 0 Then k = k + 6
m = k / t
If a0 >= 0 Then TextN2(0).Text = m
If a1 >= 0 Then TextN2(1).Text = m
If a2 >= 0 Then TextN2(2).Text = m
If a3 >= 0 Then TextN2(3).Text = m
If a4 >= 0 Then TextN2(4).Text = m
If a5 >= 0 Then TextN2(5).Text = m

vbhamed
چهارشنبه 28 مهر 1395, 01:02 صبح
سلام

برنامه زیر با این فرض نوشته شده که اعداد درون Textbox ها مرتب هستند از چپ به راست
6 عدد Textbox به نام txtNomreh با اندیس 1 تا 6 و 6 عدد Textbox به نام txtRotbeh با اندیس 1 تا 6 متناظر با txtNomreh ها بگذارید

Dim Old&, i%, j%, avg!, c%

Old = txtNomreh(1)
txtRotbeh(1) = 1
i = 2
Do
If i > 5 Then
txtRotbeh(i) = i
Exit Do
End If
If txtNomreh(i) = txtNomreh(i + 1) Then
Old = txtNomreh(i)
Do
avg = avg + i
c = c + 1
i = i + 1
Loop While txtNomreh(i) = Old
avg = avg / c
For j = i - 1 To i - c Step -1
txtRotbeh(j) = avg
Next
Else
txtRotbeh(i) = i
Old = txtNomreh(i)
i = i + 1
End If
Loop