PDA

View Full Version : حرفه ای: محاسبات داینامیک



Dead Space
سه شنبه 04 تیر 1392, 11:32 صبح
سلام دوستان
یک سوال داشتم.
فرض کنید الان متغیر $count ما دو عدد رو جمع می کنه و نمایش میده.
حالا اگر دو روز بعد نظر مدیر سیستم در مورد محاسبه این متغیر عوض بشه و به جای جمع بخواد اون رو به ضرب تبدیل کنه و یا به توان برسونه اول بعد جمع کنه.
یک راهش اینه که برنامه نویس بره خودش دستی فرمول رو به چیزی که گفتن تغییر بده.
راهه بعدی اینه که به صورت داینامیک باشه یعنی مدیر بره در بخش مدیریت فرمول رو ادیت کنه و من با توجه به فرمول جدید این کار رو انجام بدم.
---------
به نظرتون بهترین راه برای این کار چیه ؟
ضمن اینکه ممکنه طرف در محاسبش از فانکشنی استفاده کنه مثلا

$count = fact (3) + sqrt(4)
من باید فانکشن رو در بیارم از فروم ببینم موجود هست اگر بود مقدار داخلش رو بدم بهش محاسبه کنه.

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

mostafa_shaeri_tj
سه شنبه 04 تیر 1392, 12:55 عصر
سلام.
یه تابعی تو php داریم که میتونه این کار رو واست انجام بده. یه نگاهی به این لینک بنداز متوجحه میشی چطور ازش استفاده کنی : http://php.net/manual/en/function.eval.php

spiderman200700
سه شنبه 04 تیر 1392, 12:56 عصر
میتونی فرومول رو در قالب یه رشته در دیتابیس ذخیره کنی بعد که رشته رو از دیتابیس خوندی با eval اجراش کنی. مثلا:

eval('$count = pow(2, 4) + sqrt(4);');
echo $count;

یا اینطوری:

$n1=2;
$n2=4;
$n3=16;
eval('$count = pow($n1, $n2) + sqrt($n3);');
echo $count;

H:Shojaei
سه شنبه 04 تیر 1392, 12:59 عصر
سلام
به نظر من با تابع بازگشتي و تابع explode ميشه يه كاريش كرد ولي خيلي پيچيدس و زمان ميخواد.
يه ديد كلي اگه بخوام بگم به اين ترتيب كه در يه تابع بازگشتي به ترتيب اولويت كمتر عمليات(مثلا اول جمع بعد ضرب) اونقدر معادله رو اكسپلود كنيم تا به كوچكترين اجزا شكسته بشه حالا اجزاء كوچيك اگه تابعي روشون اعمال شده بود اعمال كنيم و اعدادشون رو بدست بيارين و با return كردن تابع عملياتي كه انجام شده به ترتيب بالعكس انجام ميشه.(اول ضرب ها بعد جمع ها و...).
البته اين فقط در حد يه تئوري هست و چيزي كه به ذهن من رسيد. اميدوارم يه جرقه اي واسه حلش تو ذهنتون ايجاد شده باشه.

Dead Space
سه شنبه 04 تیر 1392, 13:12 عصر
ممنون از دوستان بابت راهنمایی هاشون
تابع eval تا حد زیادی مشکل رو برطرف می کنه ولی ایرادی که هست اینه که ممکنه در رشته ای که اومدی نام تابعی باشه که من قبلا نوشتم .ممکنه به تابعی مثل sqrt مقداری داده بشه که خودش با اجرای تابع دیگری به دست بیاد که من دستی نوشتم. این رو من الان موندم چطوری به دست بیارم
مثالش به این صورت هست:

$formula = "conft() * fact() * sqrt(fetch_time()) * 1";
الان میبینید که تابع sqrt مقدار داخلش از تابعی به نام fetch_time میاد که مثلا توسط خود من ایجاد شده.

colors
سه شنبه 04 تیر 1392, 13:14 عصر
اینجوری میشه انجامش داد

function calculation($first, $second, $action){
switch($action){
case 'ضرب':
return ($first * $second);
break;
case 'تقسیم':
return ($first / $second);
break;
case 'جمع':
return ($first + $second);
break;
case 'منفی':
return ($first - $second);
break;
}
}

echo calculation(5,2,'تقسیم')
مثلا برای دریافت مقدار پارامتر سوم(نوع عملیات) یه list box گذاشت که طرف(مدیر) انتخاب کنه.

میشه برای انجام عملیات روی هر عدد قبل از ارسال هم, همچین تابعی رو نوشته.

spiderman200700
سه شنبه 04 تیر 1392, 13:41 عصر
ممنون از دوستان بابت راهنمایی هاشون
تابع eval تا حد زیادی مشکل رو برطرف می کنه ولی ایرادی که هست اینه که ممکنه در رشته ای که اومدی نام تابعی باشه که من قبلا نوشتم .ممکنه به تابعی مثل sqrt مقداری داده بشه که خودش با اجرای تابع دیگری به دست بیاد که من دستی نوشتم. این رو من الان موندم چطوری به دست بیارم
مثالش به این صورت هست:

$formula = "conft() * fact() * sqrt(fetch_time()) * 1";
الان میبینید که تابع sqrt مقدار داخلش از تابعی به نام fetch_time میاد که مثلا توسط خود من ایجاد شده.

مشکلی پیش نمیاد. هر متدی که خارج از eval قابل فراخوانی شدن باشه ، داخل eval هم قابل فراخوانی هست.