با سلام واحترام در فایل پیوستی ، می خواهم میانگین چند عدد را در فرم بدست آورم ودر صورتی که یک یا چند تکست باکس صفر باشد آنها در میانگین اعداد منظور نشوند با تشکر
با سلام واحترام در فایل پیوستی ، می خواهم میانگین چند عدد را در فرم بدست آورم ودر صورتی که یک یا چند تکست باکس صفر باشد آنها در میانگین اعداد منظور نشوند با تشکر
با سلام مجدد ،دوستان واساتید محترم ، منتظر راهنمایی ارزشمند شما هستم
سلام و روز خوش
1- بهتره با توضیح دقیق مسئله رو روشن کنین:
n عدد داریم که k تای اونها صفر هست (k<>n)،
در مخرج فرمول میانگین گیری به جای n ، مقدار n-k باشه.
همین خواسته شماست؟
2- فرم شما bound هست یا unbound ؟
سلام وعرض ادب خدمت استاد بزرگوار وتشکر ازراهنمایی های ارزشمند شما که همیشه راه گشا وآموزنده بوده است
فرم Unbound است وبه شی خاصی متصل نیست
در مثال ارائه شده در فایل ، چهار عدد داریم می خواهم اگر سه عدد نوشته شود جمع اعداد تقسیم بر سه شود وعددی که صفر است در میانگین
منظور نشود واگر دو عدد نوشته شود میانگین دو عدد حساب شود ممنون از صبر وحوصله شما
با سلام و احترام متقابل
این پرسش شما گرچه ظاهر ساده ای داره،
ولی نکات مهمی درش نهفته هست و ارزش بررسی بیشتری داره.
من اول یک نمونه براتون آماده میکنم که مشکل شما رو در کوتاه مدت حل کنه،
بعد اگر عمری باقی بود به تدریج این نکات رو هم مطرح میکنم و راه حل هر کدوم رو هم میگم.
این نمونه پیوست کار شما رو راه میندازه،
ولی برنامه خوبی نیست!
دلایلش رو در پست های بعدی توضیح میدم.
Option Compare Database
Option Explicit
Private Sub BTN_CALC_Click()
CalcAverage
End Sub
Private Sub BTN_CLEAR_ALL_Click()
TB_NUMBER_1 = Null
TB_NUMBER_2 = Null
TB_NUMBER_3 = Null
TB_NUMBER_4 = Null
TB_SUM = Null
TB_AVERAGE = Null
TB_NON_ZERO_COUNT = Null
TB_NON_ZERO_AVERAGE = Null
End Sub
Private Sub CalcAverage()
Const N As Long = 4
Dim sum_all As Long
Dim non_zero_count As Long
sum_all = 0
non_zero_count = 0
If TB_NUMBER_1 <> 0 Then
non_zero_count = non_zero_count + 1
sum_all = sum_all + TB_NUMBER_1
End If
If TB_NUMBER_2 <> 0 Then
non_zero_count = non_zero_count + 1
sum_all = sum_all + TB_NUMBER_2
End If
If TB_NUMBER_3 <> 0 Then
non_zero_count = non_zero_count + 1
sum_all = sum_all + TB_NUMBER_3
End If
If TB_NUMBER_4 <> 0 Then
non_zero_count = non_zero_count + 1
sum_all = sum_all + TB_NUMBER_4
End If
TB_SUM = sum_all
TB_AVERAGE = sum_all / N
TB_NON_ZERO_COUNT = non_zero_count
If non_zero_count > 0 Then
TB_NON_ZERO_AVERAGE = sum_all / non_zero_count
Else
TB_NON_ZERO_AVERAGE = "Atleast one number should be none zero/null !"
End If
End Sub
2.png
حالا چرا این برنامه پست شماره 6 خوب نیست:
1- درستی مقادیر چک نمیشه (validation)
2- HardCode هست - اگر تعداد شماره ها کم و زیاد بشه کد باید تغییر کنه.
3- اگر تعداد شماره ها زیاد باشه (مثلا 20 یا 50 و ...)
این روش عملا قابل پیاده سازی نیست - بخصوص که validation هم همپای کد اصلی بزرگ میشه و هم کد اولیه و هم نگهداری اون سخت هست.
4- جدای از کد، خود طراحی فرم هم با کم و زیاد شدن شماره ها باید تغییر کنه،
و در تعداد زیاد شماره ها در عمل طراحی فرم single view به مشکل میخوره و عملی نیست.
سلام درود بر شما استاد بزرگوار ، مطالب ارزشمندو مفیدی ارائه نمودید توضیحات شما قابل تامل وتفکر است ممنون وسپاسگزارم
درود وسلام ، لطفا جهت نمایش دو رقم اعشار در میانگین در این برنامه هم توضیح دهید با تشکر
سلام خدمت اساتید محترم ، لطفا در موارد مطرح شده راهنمایی لازم را مبذول فرمایید
سلام وقت بخیر
لطفا نمونه پیوستی را نگاه کنید
در این نمونه محدودیتی در تعداد اعداد وجود ندارد و ردیفهای صفر در محاسبه میانگین لحاظ نمی شود
سلام ودرود ، جناب آقای بهبودی عزیز نمونه ارسالی شما بسیار جالب و زیباست با تشکر از شما ، اما آنچه باید توجه داشته باشیم نوع فرم فرم Unbound است وبه شی خاصی متصل نیست
سلام و روز خوش
اینها از مواردی هست که قبلا مفصل بررسی شده:
تفکیک استاندارد ارقام
سوال: حذف 2 رقم اعشار از فیلد مبلغ ، در لیست باکس و راست چین شدن آن
Format را چگونه بکار ببریم.
یا با یک جستجوی ساده در نت پاسخش بدست میاد.
سلام ودرود ، ممنون از راهنمایی شما ، چرا میانگین حساب شده ،گرد می شود ؟Untitled-1.jpg
با سلام خدمت همه دوستان گرامی بخصوص دوست و استاد گرامی خودم جناب آقای مازولاق عزیز!
بعد از چند ماه دوری از سایت برنامه نویس امروز وسوسه شدم سری به تالار اکسس بزنم ببینم چه خبره
با دیدن این تاپیک و با توجه به توضیحات دوستمون در پست شماره 4 مبنی بر اینکه فرم Unbound میباشد این ایده به ذهنم خطور کرد که بیائیم از طریق حلقه For Each جمع و تعداد تکست باکس هائی که مقدار آنها غیر خالی یا بزرگ
تر از صفر است رو بدست بیاریم و سپس برای بدست آوردن میانگین جمع را بر تعداد بدست آمده تقسیم کنیم
لذا برای بدست آوردن جمع و تعداد تکست باکس ها غیر خالی و بزرگتر از صفر از کدهای زیر استفاده کردم:
Dim ctrl As Control
Dim SumCtrl As Long
Dim CountCtrl As Integer
For Each ctrl In Me
If TypeOf ctrl Is TextBox Then
If Not IsNull(ctrl) And ctrl <> "" And ctrl.Value > 0 Then
CountCtrl = CountCtrl + 1
SumCtrl = SumCtrl + ctrl.Value
End If
End If
Next ctrl
و نمونه ضمیمه با استفده از کدهای فوق
آخرین ویرایش به وسیله eb_1345 : چهارشنبه 14 آبان 1404 در 08:03 صبح
سلام ودرود ، آقای بهرامی عزیز روش ارائه شما قابل تقدیر وتحسین می باشد با تشکر وسپاس از شما وجناب آقای مازولاق عزیز وبقیه دوستان که انصافا دلسوزانه وبا صبر وشکیبایی زحمت می کشید آرزوی سلامتی وتندرستی برای همه عزیزان که در راه آموزش تلاش می کنند یک سوال دارم مثلا وقتی دو عد نیم 0.5 را میانگین می گیریم جواب صفر می دهد لطفا در این مورد توضیح دهید ممنون
با سلام متقابل
به به - چه سعادتی، دیگه داشتم یواش یواش نگران سلامتی شما میشدم که خوشبختانه آسوده خاطر شدم.
===
این پرسش جناب majid44 همینجور که گفتم گرچه ظاهرش ساده اس، ولی زیرپوستش نکته زیاد داره.
بدترین روش رو که خودم گذاشتم (بخشی از دلایل بد بودنش رو هم آوردم) و منتظر موندم دیگر دوستان چی نظر میدن،
روش جناب محمدرضا بهبودی در واقع بهترین هست، ولی ناقص هست و درست پیاده نشده که متاسفانه پی کار رو نگرفتن.
روش جنابعالی هم یکی از راه های میانی بین این دو هست (از بابت عدم وابستگی کد به تعداد تکس باکس ها) اما مثل کد جناب بهبودی کامل نیست.
الان که دوباره با حضورتون اینجا رو روشن کردین ارزش یک تاپیک مستقل داره که اونجا بحث رو پیگیری کنیم.
نهایت سپاس وقدر دانی از اساتید محترم جناب آقای بهرامی و جناب آقای مازولاق را دارم
در نمونه جدید اگر در یکی از تکست باکس ها اطلاعات غیر عددی وارد شود پیغام خطا صادر میشود
سلام ودرود جناب آقای بهرامی عزیز، نمونه جدید،کار زیبای شما را کامل کرد باسپاس وتشکر ازدرگاه ایزد یکتا سلامتی، عزت وتداوم حضور جنابعالی رادر کنارمان خواستارم![]()