PDA

View Full Version : سوال: محاسبه قیمت برای هر بازه



bftarane
چهارشنبه 21 مرداد 1394, 11:07 صبح
سلام.
لطفاً این تصویر رو ببینید.
134174
خوب من می خوام میزان مصرف بر حسب مترمکعب و همچنین تعرفه رو به عنوان ورودی بگیرم و آب بها رو محاسبه کنم.
آب بها به این صورت محاسبه می شه:
آب بها = آب بهای ردیف قبلی + تعرفه
یعنی اگه آب بها برای 5 متر مکعب 5000 محاسبه شده باشه برای ردیف بعد که 6 متر مکعب باشه باید این 5000 با تعرفه بازه مرتبط با 6 مترمکعب که در اینجا 1200 هست جمع بشه و نتیجه میشه 6200.
حالا مشکل در جایی هست که بازه عوض میشه، حالا نمی دونم چطور باید آخرین آب بهای بازه قبلی رو به دست بیارم. می دونم که باید از روش بازگشتی استفاده بشه ولی در پیاده سازیش مشکل دارم.
این چیزیه که خودم نوشتم ولی نتونستم اون قسمت بازگشتی رو پیاده سازی کنم

using System;using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;


namespace abbaha
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}


private void btn_Click(object sender, EventArgs e)
{


}
public void test()
{
int Varabbaha = 0;

int metr = Convert.ToInt32(txt.Text);


if (metr <= 5)
{
Varabbaha = metr * 1000;
}


if (metr >= 6 && metr <= 13)
{
//آخرین آب بهای بازه قبلی یعنی آب بها وقتی متر مکعب برابر با 5
Varabbaha = 5000;
for (int i = 6; i <= 13; i++)
{
if (i <= metr)
{
Varabbaha = Varabbaha + 1200;
}
}
}


if (metr >= 14 && metr <= 20)
{
//آخرین آب بهای بازه قبلی یعنی آب بها وقتی متر مکعب برابر با 13
Varabbaha = 17000;
for (int i = 14; i <= 20; i++)
{
if (i <= metr)
{
Varabbaha = Varabbaha + 3500;
}
}
}


if (metr >= 20)
{
//آخرین آب بهای بازه قبلی
Varabbaha = ;
for (int i = 20; i >=20; i++)
{
if (i <= metr)
{
Varabbaha = Varabbaha + 6700;
}
}
}




lbl_result.Text = Varabbaha.ToString();
}
}
}



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

zayens
چهارشنبه 21 مرداد 1394, 11:26 صبح
مشکل تو متراژه عزیزم
اصلا نیاز نیست بازه قبلی را پیدا کنی و حساب کنی

متراژ را رو به بالا گرد کن و ضربدر تعرفه کن همین!
مثلا برای 5.1 متر باید رو به بالا گرد کنی که میشه 6 و بعد اون رو ضربدر 1200 (تعرفه بازه 6) کن

SabaSabouhi
چهارشنبه 21 مرداد 1394, 11:30 صبح
سلام
بدون شک می‌تونی این رو به صورت بازگشتی بنویسی، اما مطمئن باش اگه ساده بنویسی کارت خیلی راحت‌تر هست.
چون این صورت مساله ماهیتش بازگشتی نیست.

این شکلی تصور کن:
تو هر بازه‌ای آب‌بها 1000 ریال هست. پس آب بها برابر هست با میزان مصرف ضرب در 1000
برای مازاد بر 5 متر مکعب 200 ریال اضافه می‌شه، پس مازاد بر 5 متر مکعب ( مصرف منهای 5 ) رو در 200 ضرب کن برای هزینه‌ی مازاد بر 5 متر مکعب
برای مازاد بر 13 متر مکعب 2300 ریال اضافه می‌شه، پس مازاد بر 13 متر مکعب ( مصرف منهای 13 ) رو در 2300 ضرب کن برای هزینه‌ی مازاد بر 13 متر مکعب
و به همین صورت.
1. باید یک آرایه داشته باشی که مرز تغییر آب بها رو تعیین کنه که تو این مثال مقادیر صفر، 5، 13 و 20 رو شامل می‌شه
2. باید یک آرایه برای هزینه‌ی آب بها به ازای هر بازه رو هم نگهداری کنی که تو این مثال مقادیر 1000، 200، 2300، 3200 رو شامل می‌شه.
حتماً توجه کردی که تو این آرایه فقط تفاضل دو آب‌های رو نگهداری می‌کنم، چون مثلاً برای مصرف متر مکعب ششم، 1000 ریال رو قبلاً محاسبه کردم، پس
فقط اضافه هزینه رو نگهداری می‌کنیم. ضمن این که آرایه‌ی اول همیشه از صفر شروع می‌شه.
3. یک حلقه‌ی ساده بنویس، که به تعداد عناصر آرایه‌ها گردش کنه و اگه میزان مصرف از مرز موجود در آرایه‌ی اول بیشتر بود به میزان هزینه‌ی موجود در
آرایه‌ی دوم به هزینه‌ی کل اضافه کنه.

var margin = new int[] { 0, 5, 13, 20};
var cost = new int[] { 1000, 200, 2300, 3200 };
var usage = 7.5;
var totalCost = 0;
for ( var i = 0 ; i<margin.Length ; i++ ){
if ( usage <= margin[i] ) continue;
var extraUsage = usage - margin[i];
totalCost = extraUsage * cost[i];
}

فقط باید توجه داشته باشی که سه سطر اول این مثال باید از دیتابیس استخراج بشه، اما برای روشن شدن مثال من مقادیر ثابت بهشون دادم.
ضمن این که بجای دو تا آرایه می‌تونی از یه collection یا dictionary استفاده کنی که به‌تر هم هست، اما من برای این که اینجا یک کلاس اضافی ( برای نگهداری مرز و هزینه مربوطه )
نسازم، از دو آرایه ساده استفاده کردم.

صبا صبوحی

bftarane
چهارشنبه 21 مرداد 1394, 14:03 عصر
عالی بود آقای صبوحی، به این میگن ذهن زیبا.
فقط در این قسمت
var extraUsage = usage - margin[i];
با توجه به توضیحات خودتون
= رو تبدیل کردم به =+ که در کد جا افتاده بود.
بی نهایت ممنونم.

zayens عزیز پاسخ شما رو هم خوندم ولی به نظرم رسید با این روش به جواب نمی رسم باز نیاز به وقت بیشتری دارم تا تست کنم. اگه جواب گرفتم خبر می دم.