تور لحظه آخری
امروز : یکشنبه ، 15 مهر 1403    احادیث و روایات:  امام صادق (ع):مؤمن را بر مؤمن، هفت حق است. واجب ترين آنها اين است كه آدمى تنها حق را بگويد، هر ...
سرگرمی سبک زندگی سینما و تلویزیون فرهنگ و هنر پزشکی و سلامت اجتماع و خانواده تصویری دین و اندیشه ورزش اقتصادی سیاسی حوادث علم و فناوری سایتهای دانلود گوناگون شرکت ها




آمار وبسایت

 تعداد کل بازدیدها : 1821260280




هواشناسی

نرخ طلا سکه و  ارز

قیمت خودرو

فال حافظ

تعبیر خواب

فال انبیاء

متن قرآن



اضافه به علاقمنديها ارسال اين مطلب به دوستان آرشيو تمام مطالب
archive  refresh

نیاز شدید به همفکری برای یک الگوریتم -


واضح آرشیو وب فارسی:سایت ریسک: نیاز شدید به همفکری برای یک الگوریتم I,NoBody 29 مرداد 1387, 22:52برای اولین بار، توی طراحی یک الگوریتم موندم. لطفاً باهام همفکری کنید. 2 تا جدول داریم: فیلدهای جدول اول( مربوط به ورود کالا به انبار هست ) : `id` bigint(50) NOT NULL auto_increment, `enter_date` date NOT NULL, `tonage` float(10,3) NOT NULL, `owner_id` int(20) NOT NULL, `product_id` int(20) NOT NULL, فیلدهای جدول دوم( مربوط به خروج کالا به انبار هست ) : `id` bigint(50) NOT NULL auto_increment, `exit_date` date NOT NULL, `tonage` float(10,3) NOT NULL, `owner_id` int(20) NOT NULL, `product_id` int(20) NOT NULL, همونطور که میبینید، جدول ها شبیه به هم هستند و فقط در تاریخ ورود و خروج متفاوتند. توی برنامه کنترل میشه که خروج، بیشتر از موجودی انبار نباشه. اما مساله اینجاست : وقتی میخوایم صورتحساب بدیم، هر کالا که وارد شده،اگه قبل از 3 روز خارج بشه، معاف از پرداخت هزینه است. بعد از سه روز، هزینه هاش از روز اول محاسبه میشه که به ازای هر تن و هر روز مثلاً 10 تومن باید بده. ضمناً اگر طرف مثلاً 5 روز پشت سر هم کالا وارد کنه: روز اول 100 تن روز دوم 120 تن روز سوم 70 تن روز چهارم 20 تن روز پنجم 200 تن حالا توی روز پنجم بخواد 150 تن خارج کنه، باید فرض کنیم این 150 تن رو داره از موجودی روز اول و دوم تامین میکنه و شامل معافیت نمیشه. توی نوشتن این الگوریتم موندم. کسی چیزی به ذهنش میرسه؟ aghasina 29 مرداد 1387, 23:13تا کی می خای ؟ من احتمالا بتونم برات حل کنم مجانیه؟؟ در ضمن یه مقدار اونجایی که نوشتی " به ازای هر تن و هر روز مثلاً 10 تومن باید بده." بیشتر تفهیم کن I,NoBody 29 مرداد 1387, 23:46سلام. مرسی. نهایتاً تا فردا شب(چهارشنبه شب) باید حل شده باشه. اگه بتونی کمکم کنی، 30 تومن میتونم بهت بدم.( آدم پول خوری هم نیستم. مطمئن باش اگه حلش کنی، دبه در نمیارم) البته خودم هم دارم روش کار میکنم. اگر خودم به نتیجه نرسیدم. اگه راهی به ذهنت رسید، قبل از اینکه بهم بگی، یه تماس بگیر که سوء تفاهم نشه. توضیح بیشتر : ببین واحد ورود و خروج کالا ها بر اساس تن هست(تا 3 رقم اعشار) هر یک تن، به ازای هر روز که بمونه، 10 تومن بابتش پرداخت میشه مثلاً من روز 87/6/1 10 تن وارد می کنم فرداش 5 تن خارج میکنم. 6 روز دیگه هم 5 تن دیگه خارج میکنم. 5 تن اول، چون قبل از 3 روز خارج شده، هزینه نداره. 5 تن دوم چون 6 روز مونده میشه : 300=10*6*5 ولی باید توجه داشته باشیم که توی این 6 روز، ممکنه بازهم بار وارد بشه. ولی وقتی بعد از این مدت، طرف 5 تن خارج میکنه، برنامه فرض میکنه که این بارها، از بارهای ورودی روزهای اول داره خارج میشه. اینجوری پول بیشتری گیر انباردار میاد. ziXet 30 مرداد 1387, 01:08سوالای سخت سخت قرار نشد بپرسی ها!! الان که مخم تعظیله فردا صبح دوباره میخونم ببینم میتونم کمکی کنم یا نه موفق باشید the_king 30 مرداد 1387, 01:48ببخشید من بی سوادم و PHP بلد نیستم ولی چون الگوریتم خواستید می تونم اینجور توضیح بدم، البته خودم نمی دونم دارم الگوریتم رو می گم، شبه کد می نویسم یا چیز دیگه ای : اول اینکه لیست فیلد ها تون یک مورد کم داره، یعنی به ازای هر رکورد باید یک فیلد موجودی هم اضافه کنید، این موجودی بین 0 تا مقدار tonage خواهد بود. اگر اسمش را بگذاریم curstore تعریف رکورد هایتان می شود : `id` bigint(50) NOT NULL auto_increment, `enter_date` date NOT NULL, `tonage` float(10,3) NOT NULL, `curstore` float(10,3) NOT NULL, `owner_id` int(20) NOT NULL, `product_id` int(20) NOT NULL, چرا؟ چون جدول ورودی ها بایستی سوابق رو نگه دارند. اگه قرار باشه بعد از اینکه از محصول فلان تاریخ فلان مقدار کم بشه بایستی این تغییرات رو یک جایی ذخیره کنید. توی رکورد های جدول خروجی که نمیشه چون اون فقط یک فیلد تاریخ داره که تاریخ خروج از انباره و مشخص هم نمی کنه که از محصول مربوط به ورودی کدوم تاریخ کم می کنه. فیلد اصلی tonage را هم که اصلا نباید تغییر بدهیم. چرا؟ چون لیست سوابق انباره. اگه مقدارش رو تغییر بدهید فردا معلوم نمیشه که توی فلان تاریخ چقدر جنس وارد شده بوده. همین فیلد curstore را در جدول ورودی ها اضافه کنید. پس ما دو جدول در بانک اطلاعاتی خواهیم داشت : اولی ورودی ها به انبار است، وقتی محصولی وارد انبار شد مشخصات curstore و tonage اون یکسان هستند. tonage از این لحظه به بعد مربوط به سوابق است و دیگر تغییر نمی کند. شما صرفا می توانید برای چک کردن سوابق انبار از این فیلد استفاده کنید. وقتی محصول وارد شده از انبار خارج میشه محتویات curstore کم میشه و می تونه به صفر برسه. وقتی صفر شد دیگه برای الگوریتم خروج محصول ارزش اطلاعاتی نداره. ولی رکوردش رو پاک نمی کنیم چون بعدا ممکنه ازش به عنوان رکورد سوابق انبار استفاده کنیم. همانطور که گفتید می توانید بعد با استفاده از curstore چک کنید که مقدار خروجی انبار از ورودی ها بیشتر نشده باشد. یعنی curstore ها فلان محصول مربوط به فلان فرد رو جمع بزنید و با مقدار tonage های خروجی همون محصول همون آقا مقایسه کنید. ولی اینجا دیگه tonage بدرد نمی خوره چون مقداری رو نشون میده که شاید اصلا دیگه توی انبار وجود نداره. جدول دومی جدول خروجی ها است و که هر بار از محصول فلان مقداری از انبار خارج شد در این جدول ثبت می شود. حالا نمی دانم برایتان ساده تر است که جدول اش رو مثل جدول ورودی ها فرض کنید که یک فیلد بدردنخور curstore داشته باشه یا تعریف اش مثل جدول ورودی ها نباشه و فیلد curstore رو در نظر نگیرید. فرض کنیم قراره از محصول product_id که متعلق به owner_id است به اندازه count تن از انبار خارج بشه. غیر از رکوردهایی که باید در قسمت موجودی (همان جدول ورودی) انبار تغییر کنند و رکورد هایی که باید در قسمت خروجی ها ثبت شوند ما باید یک هزینه خروج باید داشته باشیم، درسته؟ پس یک متغیر به اسم charge اضافه می کنیم که مقدار اولی اش باید صفر باشه و به تدریج در توی یک حلقه افزایش پیدا کنه. charge = 0 حالا یک حلقه loop بسازیم که در هنگام ورود به حلقه شرط پایان حلقه این باشه که count == 0 بشه یعنی دیگه همه مقدار محصولی که قرار بوده از انبار خارج بشه رو بردیم بیرون. do until (count == 0) loop قبل از ورود به حلقه ما باید یک لیست از تمامی رکورد های اون بابا (owner_id) رو که مربوط به محصول مورد نظر (product_id) هستند رو داشته باشیم که بر اساس تاریخ ورود به انبار مرتب باشند. اولین رکورد این لیست باید قدیمی ترین تاریخ ورود اون محصول باشه و آخرین رکورد لیست هم جدید ترین تاریخ ورود. این لیست، لیست موجودی ها رو تشکیل میده که از جدول ورودی استخراج میشه. یعنی قبل از ورود به حلقه یک فیلتری در جدول ورودی ها اجرا کنید که نشون بشه فلان شخص فلان محصول رو در چه تاریخ هایی وارد انبار کرده. البته در بعضی از رکورد های این لیست مقدار curstore ممکنه صفر باشه که از نظر الگوریتم وجود و یا عدم وجود اونها مهم نیست. اگر چنین رکورد های هم باشند طبق اصول همیشه در ابتدای لیست اند یعنی اگر در پنج تا رکورد مقدار curstore صفر باشه همون پنج رکورد اول لیست اند چون تاریخ شان از بقیه حتما عقب تر (قدیمی تر) است. داخل الگوریتم این اتفاق می افته که یک به یک رکورد های لیست ای که ساختیم رو دونه به دونه از قدیمی ترین تاریخ چک می کنیم، نمی دونم این رکوردی که از لیست بررسی میشه رو با یک اندیس مثل i مشخص می کنید که i در هر بار یک واحد اضافه میشه و یا از متد هایی مثل records.next برای رفتن به رکورد بعدی استفاده میشه به هر حال هر رکوردی از لیست که بررسی شد باید سراغ رکورد بعدی برویم. اگر حلقه اونقدر ادامه پیدا کرد که به انتهای لیست رسیدیم، مفهوم اش اینه که مقدار count اشتباهه چون داریم از انباری که موجودی اش کمتر از count بوده برداشت می کنیم. اگر مقدار count درست باشه پیش از رسیدن به انتهای لیست مقدار count به صفر می رسه و از حلقه خارج می شویم. حالا ببینیم نحوه چک کردن رکورد ها در داخل حلقه چطوره. فرض می کنم که اسم رکورد مورد نظر که داریم بررسی اش می کنیم record باشد. یک متغیر مثلا به اسم x از نوع float باید مقدار فعلی count را اختیار کند، این رکورد برای محاسبه خروجی محصول از یک رکورد بکار می رود : x = count اگه مقدار x از مقدار curstore (موجودی) اون رکورد record بیشتر شد برابر با مقدار curstore قرار می دهیم، یعنی هیچگاه x نباید بیشتر از curstore باشد. if (x > record.curstore) then x = record.curstore حالا مقدار x را از curstore اون رکورد کم کنید و تغییرات را در جدول ورودی بصورت درجا روی رکورد ثبت نمایید (Update) حالا تاریخ فعلی (today) را از تاریخ رکورد کم کنید تا اختلاف روز میان ورود به انبار و خروج بدست آید و در یک متغیر مثل day ذخیره کنید. day = today - record.enter_date اگر day از 3 بیشتر نشده که باید از هزینه معاف اش کنید پس دیگه ادامه ندید تا دوباره به اول حلقه برگرده (continue) ولی قبلش از مقدار count کم می کنیم و سراغ رکورد بعدی می رویم. if (day < 4) then count = count - x records.next continue end if ولی فرض کنیم که سه روز رو رد کرده. حالا مقدار day را در x که مقدار خروجی است ضرب کنید تا مقدار روز در تن ضرب بشه. دوباره حاصل آنرا در در مقدار به ازای روز ضرب کنید که گفتید مثلا 10 تومن. حاصل این فرمول را به مقدار فعلی charge اضافه کنید، فراموش نکردیم که charge قراره هزینه رو جمع بزنه. charge = charge + ( day * x * 10) خب حالا که مقدار x رو از محصول حساب کردیم می تونیم از مقدار کل count کم کنیم. count = count - x حالا دو وضعیت پیش میاد یا count از صفر بزرگتره، یعنی با کم کردن از مقدار curstore رکورد فعلی، مقدار curstore رو به صفر رسوندیم ولی هنوز به محصول بیشتری نیاز داریم پس باید بریم سراغ محصولی که در تاریخ های بعدی وارد شده (که ارزونتر حساب میشه) حالت دوم هم یعنی count به صفر می رسه و حلقه در دور بعدی با شرط count == 0 به پایان می رسه. فقط قبل از شروع دور بعدی از حلقه باید به رکورد بعدی بپریم. records.next وقتی کار حلقه به پایان رسید اصولا مقدار count صفر است و charge مقدار هزینه رو محاسبه کرده. فقط فراموش نکنید که در جدول خروجی ها بایستی یک رکورد جدید بابت خروج درج کنید. چون مقدار curstore رکورد های جدول ورودی ها در توی حلقه کم شده، فرایندی دیگه ای برای جدول ورودی مورد نیاز نیست. راستی این متنی که من نوشتم الگوریتم بود؟ شبه کد بود؟ داستان بود؟ I,NoBody 30 مرداد 1387, 08:28آقا/خانم the_king واقعاً دستت درد نکنه که اینهمه ارزش قائل شدی و وقت گذاشتی. کاش میشد بیشتر از یکبار کلید تشکر رو بزنم. ولی مساله اینجاست که رکوردهای ورودی، بعد از خروج، از جریان کار خارج نمیشن و همیشه میشه روشون گزارشگیری کرد. ولی پیشنهادتون منو به فکر واداشت و یه ایده دیگه به سرم زد که اگر بخوام اجراش کنم، باید به جای 2 تا جدول، فقط یک جدول داشته باشم و کلی باید کدهامو عوض کنم. البته اگه به نتیجه برسم، ارزششو داره. اگر به نتیجه رسیدم، بابت همین جرقه ای که توی ذهن من ایجاد کردید، حتماً در حد وثقم تشکر خواهم کرد. باز هم ممنون amir01 30 مرداد 1387, 10:44سلام. اون بخشی که باید چک کنه ببینه قبل از سه روز خارج داره میشه یا بعد از سه روز که فکر نمیکنم توش مشکلی باشه چون یه مقایسه سادس. برای اون قسمتی هم که طرف مثلا تو روزهای متوالی بار میباره بعد میخواد برداره میتونی این کارو بکنی که تاریخ رو دست نزنی به این صورت که مثلا طرف 25/5/87 اولین بارش رو آورده بعد فرداش هم وقتی میخواد بار جدید رو به انبار دار تحویل بده دیگه تاریخ ورود به 26/5/87 تغییر نکنه همون 25/6/87 بمونه که موقع خروج بار این تاریخ رو با تاریخ خروج چک کنی اگه بیشتر از سه روز بود مالیات بخوره اگر هم نه که هیچی. این راهی بود که به ذهن من رسید. البته من خودم رو در حدی نمیبینم که بخوام به شما ها که استادید چیزی یاد بدم. چیزی بود که به ذهنم رسید گفتم شاید کارت راه بیافته. همیشه خوب باشید... یاحق I,NoBody 30 مرداد 1387, 10:52مرسی امیرجان. همین که وقت گذاشتی ممنونم. ولی این راهی که شما گفتی، عملی نیست. چون دقیقاً باید مشخص باشه چه زمانی بار میاره. اینطور نیست که ما بهش گفته باشیم مثلاً 25/6/87 بار بیارو اون بار مربوط به این تاریح رو توی چند نوبت بیاره. بلکه هر زمان، هر مقدار که بخواد میتونه بار بیاره. حتی بدون هماهنگی. ضمناً توی تاپیک مربوط به مثال اکسل هم اگه جواب سوال آخرمو بدی ممنون میشم. برام مهمه که بدونم. amir01 30 مرداد 1387, 11:46خب میتونی یه جدول درست کنی که دو تا فیلد داشته باشه به اسم owner_id و first_date بعد برای هر کسی که بار میاره یه رکورد تو این ثبت کنی که تاریخ اولین ورودش باشه. بعد موقع خروج بار با این تاریخ چک کنی. اون یکی جدولهات هم مثل قبل باشن. به کار خودشون ادامه بدن. این چطوره؟ the_king 30 مرداد 1387, 13:14آقا/خانم the_king واقعاً دستت درد نکنه که اینهمه ارزش قائل شدی و وقت گذاشتی. کاش میشد بیشتر از یکبار کلید تشکر رو بزنم. خواهش می کنم، کاری خاصی نکردم. امضاء پایین پست هایی که می زنم و عبارت وسط آواتارم اسم و فامیلم است، اسمم علی و فامیلی ام سعید است. مساله اینجاست که رکوردهای ورودی، بعد از خروج، از جریان کار خارج نمیشن و همیشه میشه روشون گزارشگیری کرد. منظورتون رو از این قسمت متوجه نشدم، مفهوم خارج شدن از جریان کار چیه؟ توی الگوریتمی که من نوشتم توی رکوردهای جدول ورودی صرفا مقدار curstore تغییر می کنند که در مجموع مقدار موجودی انبار رو نشون میده. خب طبیعی است که وقتی محصولی از انبار خارج میشه باید مقدار موجودی انبار تغییر پیدا کنه. این مساله نباید در هیچ زمانی مشکلی برای گزارشگیری دفعات بعدی ایجاد کنه. چون فیلد tonage همیشه مقدار محصول ورودی به انبار رو داره و در لیست خروجی ها هم همیشه زمان خروج کالا ثبت شده. یعنی ما همیشه می دونیم که فلان مقدار محصول کی وارد انبار شده و کی از اون خارج شده. I,NoBody 30 مرداد 1387, 13:48آقای علی سعید؛ بازهم تشکر بابت کمکت. اون curstore که پیشنهاد دادی خیلی کمکم کرد( شاید به نظر یه پیشنهاد ساده باشه ). در واقع ذهنمو برد به یه سمت دیگه که به احتمال زیاد کارمو راه می اندازه. الآن دارم روش کار میکنم. ان شاءالله به نتیجه می رسم. I,NoBody 30 مرداد 1387, 20:27از همگی دوستان ممنون. تقریباً به نتیجه رسیدم. آقای علی سعید، لطفاً شما هم شماره حساب، شماره کارت و شماره تلفنتو برام یغام خصوصی بذار. به هر حال شما باعث شدی من راهشو پیدا کنم. Tnx all




این صفحه را در گوگل محبوب کنید

[ارسال شده از: سایت ریسک]
[مشاهده در: www.ri3k.eu]
[تعداد بازديد از اين مطلب: 665]

bt

اضافه شدن مطلب/حذف مطلب







-


گوناگون

پربازدیدترینها
طراحی وب>


صفحه اول | تمام مطالب | RSS | ارتباط با ما
1390© تمامی حقوق این سایت متعلق به سایت واضح می باشد.
این سایت در ستاد ساماندهی وزارت فرهنگ و ارشاد اسلامی ثبت شده است و پیرو قوانین جمهوری اسلامی ایران می باشد. لطفا در صورت برخورد با مطالب و صفحات خلاف قوانین در سایت آن را به ما اطلاع دهید
پایگاه خبری واضح کاری از شرکت طراحی سایت اینتن