# Native Code > برنامه نویسی در Delphi >  راهنمایی در مورد برنامه ای جهت تنظیم برنامه کلاسی مدارس

## Mahdi_S_T

من می خواهم برنامه ای بنویسم که قابلیت تنظیم برنامه کلاسی مدارس در سه سطح ایتدایی - راهنمایی  و متوسطه داشته باشد با ورود اطلاعات اولیه در مورد نام دبیر - رتبه دبیر - تعداد ساعت درسی دبیر - نام دروس و تعداد ساعات دروس و ...

آیا دوستان تا به حال این چنین برنامه ای را نوشته اند . یا در صورتی که نظر خاصی در مورد روش برنامه نویسی این برنامه دارند مرا راهنمایی نمایند . با تشکر

----------


## Sepidar

کاش تو بخش الگوریتمها مطرح میکردی سوالتو.
اما به هر حال فکر کنم با الگوریتم های برگشتی میشه این مساله رو حل کرد...

----------


## Mahdi_S_T

با تشکر از جناب Sepidar

در صورتی که فکر می کنید در بخش الگویتم های بهتر جواب می گیرم در صورت امکان این تاپیک را به آنجا منتقل نمایید. با تشکر

----------


## hr110

با سلام
یادم که چهار سال قبل با یکی از دوستان شروع به نوشتنش کردیم ولی آنوقتها اطلاعات زیادی در مورد الگوریتمها و روشهای پیاده سازی نرم افزاری نداشتیم ، بعد از چند ماه سرو کله زدن با روشها و الگوریتمهای پیش پا افتاده یکی از دوستان که ریاضی خوانده بود به ما اثبات کرد که اگر(!) روش شما جواب بدهد مثلا برای یک دبیرستان با 10 کلاس چند سال به طول خواهد انجامید :wink: 
من ان پروژه را رها کردم و طرف دوم هنوز هم که هنوز است در حال نوشتنش سرو کله میزنه و آخرین اخباری که از وی دارم اینست که به جواب رسیده و میتواند برای هر مدرسه در عرض چند ساعت جواب بهینه را بگیرد.

اگر روزهای آتی این ایام برام حال و حوصله گذاشت بخشی از پارامترهای مسئله را برایتان باز خواهم کرد.(آمین یا رب العالمین)  :flower:

----------


## Mahdi_S_T

با تشکر از شما دوست عزیز و خوشحال از اینکه هنوز دوستان با اعتقاد  در کنار هم در این سایت فعالیت دارند.

من منتظر راهنمایی های جنابعالی می مانم . از ظاهر قضیه معلومه که این از آن الگوریتم های مشکل است .

موفق باشید.

----------


## hr110

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

همانطور که در بالا نیز ذکر کردم روش که میخواهم برایتان توضیح بدهم یک روش کاملاً سنتی بوده و به علت مشغله هایی که داشتم نتوانستم روش عملی(در صورتی که موجود باشد) را برای پیاده سازی نرم افزار فرابگیرم، البته در تحقیقات کوتاهی که در ان زمان داشتم و نیز گاهی اوقات از دوستان پیگیر میشوم ، الگوریتم علمی و تست شده ایی برای این مسئله وجود ندارد. از سوی دیگر محدودیتهایی که در مدارس ایران وجود دارد بعید میدانم درصورت وجود چنین الگوریتیم بتوان به طور حتم جواب نهایی را بدهد، ضمناً توضیحاتی که در این مقاله برای مدارس دبیرستان آورده شده است برای نظام قدیم بوده و ممکن است نتوان از آن برای برنامه ریزی کلاسی دبیرستانها ترمی، ترمی-واحدی، ترمی-سالی( ;) ) و .. استفاده نمود.

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

در وحله اول کسی که میخواهد برنامه کلاسی یک مدرسه را بنویسد باید ابتدا به محدودیتهای مدرسه توجه نماید. محدودیتهایی که در یک مدرسه به طور کلی(ابتدایی،راهنمایی و دبیرستان) میتواند وجود داشته باشد به این شرح است:
1- دانش آموزان یک کلاس(مثلا 2/5 ریاضی فیزیک) هر روز باید به مدرسه بیایند. البته این محدودیت ظاهراً در دبیرستانهای نظام جدید برداشته شده است.
2- هر پایه(مثلاً پایه دوم علوم انسانی) مجموعه ایی از دروس است که باید همگی آنها در یک دوره شش روزه(یک هفته) تدریس شوند.
3- دروس مربوط به هر درس در یک پایه خاص میزان تدریسش در یک هفته باید ثابت باشد؛ مثلاً : ورزش در هفته دو ساعت ، آزمایشگاه فیزیک یک تک زنگ، شیمی چهار ساعت.
4- دانش آموزان هر کلاس باید تمامی دروس خود را در طول یک پرید زمانی شش روزه  در برنامه کلاسیشان دیده باشند.
5- محدودیت معلمین از همه مهمتر بوده و الگوریتم نهایی را پیچیده تر میسازد؛ 1- برخی از معلمین هر روز به مدرسه می‌آیند 2- برخی فقط چند روز خاص به مدرسه می‌آیند 3- برخی نیز میزان ساعت ثابتی را مشخص کرده ولی زمان حضور در مدرسه را به عهده مدرسه گذاشته اند.
6- تک زنگها؛ تک زنگها معظل دیگری است که تنها در دبیرستانها و آنهم برخی از دبیرستانها مورد توجه میباشد. مثلاً برخی از مدارس آزمایشگاههای تخصصی را در تک زنگها برگزار میکنند این مورد نیز میتواند الگوریتم را پیچیده نماید.
7- درسی که هر معلم میتواند بدهد نیز از پارامتر دیگری است که میتواند الگوریتیم را پیچیده نماید، چرا که در برخی از مدارس(مثلاً ابتدایی) یک معلم ممکن است چندین درس در پایه های متفاوت را تدریس نماید.

مثالهایی از تعاریف اولیه:
پایه : اول ابتدایی، سوم راهنمایی، دوم ریاضی، پیش دانشگاهی ریاضی و ...
درس : علوم اول راهنمایی، ریاضی سوم ابتدایی، فیزیک دوم ریاضی و ..
کلاس : در ابتدایی و راهنمایی : A,B,3/4و ... در دبیرستان : 3/8 ریاضی، 1/10 تجربی و ...
درس/کلاس : ریاضی اول ابتدایی، علوم سوم ابتدایی، شیمی سال سوم رشته ریاضی و ... 
درس/معلم : فارسی اول / خانم میرزایی، فیزیک سال اول / آقای منتظری و ... 

گام بعدی شما یافتن لیستی از این "درس/کلاس" است. مثلا مدرسهء ابتدایی را در نظر بگیرید که تنها به کلاس اولی‌ها خدمات میدهد و فقط دو کلاس اول دارد(!) پس درس/کلاسهای این مدرسه که تنها سه درس و دو کلاس  نیاز دارد به این شرح میباشد:
:: فارسی کلاس A
:: فارسی کلاس B
:: دیکته کلاس A
:: دیکته کلاس B
:: ورزش کلاس A
:: ورزش کلاس B
حال در نظر بگیرد که قرار است بصورت دستی کلاسهای یک دبیرستان که سه رشته ریاضی، تجربی و علوم انسانی را شامل میشود و هر رشته تحصیلی نیز 3 کلاس داشته و  چهار سال تحصیلی(نظام قدیم) داشته و  هر کلاس نیز تعداد زیادی درس دارد را بچینید، بصورت ذهنی میتوانید متصور شود که چه لیست بزرگی از درس/کلاسها ایجاد خواهد شد.

با استخراج لیست درس/کلاسها میتوان به میزان ساعات مورد نیاز برای معلمین دست یافت. اگر قرار است که این برنامه کلاسی توسط نرم افزار انجام شود 
بنابراین به سرعت و سهولت میتوانید در همان وحله اول ورود اطلاعات میزان نقایص حضور معلمین را در مدرسه بیابید، به این معنی که با مشخص شدن درس/کلاسها و تعداد کلاسهای هر پایه و نیز زمانهای حضور معلمین ، پیش بینی اینکه با این مفروضات میتوان در نهایت به جواب رسید کاری بس ساده است(؟!!!) البته این حداقل کاری است که باید یک نرم افزار انجام دهد ولی بهتر است که برنامه بعد از آنکه گزارش داد این کار عملی نیست لیست نقایص را هم نمایش داهد و مشخص نماید که برای تکمیل کادر معلمین مدرسه به چه میزان درس/معلم نیاز است.

تا این مرحله تقریباً یک دهم درصد از الگوریتم شما کامل شده است ;) و شما میتوانید با وجود صحت الگوریتم گزارش نقایص و در نظر گرفتن تمامی محدودیتها به ادامه راه بیاندیشید:


برنامه کلاسی یک مدرسه معمولاً یک ماتریس 2*2 میباشد که در جهت عمودی کلاسها و در جهت افقی "درس/معلم"ها قرار دارد، بنابراین باید لیست از "درس/معلمها" را ایجاد نمایید تا این واحدها را در خانه‌های این ماتریس قرار بگیرند و برنامه کلاسی تکمیل شود. در اینجا فرض براین است که یک معلم تنها میتواند یک درس خاص را تدریس نماید چرا که با تغییر این فرض الگوریتم پیچیده تر شده و "بازگشت به عقبها" یک گام به بیشتر شده  و بالطبع در نهایت رسیدن به جواب را غیرممکنتر(!) نماید.

در گام اول  باید معلمین که محدودیت زمانی دارند(معلمین نوع دوم) را در ماتریس قرار دهید. 

گام بعد بسیار ساده است و در عین حال پیچیده در پیاده سازی میباشد:

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

شاید فکر کنید که این روش ممکن است که هیچگاه به جواب نرسد. ولی به صورت خام و ناپخته همانطور که در اولین پست خود هم گفتم اگر به این روش عمل کنید ممکن است چند سال طول بکشد که یک مدرسه را به جواب برسانید. ولی باید از روشهای و تستهای متنوع و هدفمند برای پیش بینی اینکه به جواب خواهید رسید کمک بگیرید. و یا اینکه میتوان با استفاده از تجربه و انجام چند صد (یا چند هزار) درج به نقاط مشترکی دست یافت مثلا فلان درس/معلم همواره در روز دوشنبه قرار میگیرد پس این موارد را جزء موارد غیر قابل تغییر دانسته  و مابقی خانه ها را تکمیل نمایید.
همچنین برای انتخاب درس/معلم ابتدا معلمهای نوع یک مد نظر قرار بگیرند و سپس معلمهای نوع سوم(همانطور که ذکر شد معلمهای نوع دوم در جاهای خود 

تثبیت شده و در همان مرحله اول انتخاب شده اند)


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

----------


## Mahdi_S_T

با تشکر از جناب ربیعی که واقعا زحمت کشیدند . تا بعد ... :flower:  :flower:

----------


## سوداگر

من همين سوال رو از استادمون پرسيدم و قراره همين برنامه رو واسه يه مدرسه بنويسم.
استادمون گفت بايد قسمت « عامل هاي هوشمند » درس هوش مصنوعي رو بخوني ولي به نظر  من به خاطر بعضي مسائل، روش BackTracking(همين كه hr110 گفته اند) درس طراحي الگوريتمها بهتر جواب ميده.

----------


## Delphi 2010

یه سوالی دوستان عزیز
همه گفته دوستان صحیح ولی این برنامه کلاسی که نرم افزار می چینه به نظر بنده به درد دبیرستان های عیرانتفاعی نمی خوره چون رئیس مدرسه با زمان حضور دبیر برنامه رو باید بچینه و برنامه چنین قابلیت سنگینی رو نمی تونه داشته چون ممکنه چند دبیر همزمان حضور داشته باشند و برنامه یک کلاس بهم می خوره

----------

