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













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

يك مثال براي پياده سازي يك الگوريتم ساده:
برنامه اي به زبان ++C بنويسيد كه از كاربر تا زمانيكه دو عدد متوالي فرد نزده بود از كاربر عدد دريافت كند و در نهايت درصورت وارد كردن دو عدد متوالي فرد عمليات متوقف شده و تعداد اعداد وارد شده را نشان دهد.اين برنامه حتما بايد با حلقه For نوشته شود.
ابتدا الگوريتم آنرا در برنامه Scratch پياده سازي كردم و از صحت درست كار كردن آن مطمئن شدم. اين تصوير الگوريتم:
سپس الگوريتم رو به زبان برنامه نويسي سي ترجمه كردم و در كامپايلر تستش كردم و اما سورس كد برنامه:
# include <stdio.h>
# include <conio.h>
# include <iostream.h>
int main()
{
int x1=0;
int x2=0;
int counter=0;
int answer=0;
clrscr();
for (counter=0 ; !((x1 % 2 == 1) && (x2 % 2 == 1)) ; counter++) {
cout << "Input the Number: ";
cin >> answer;
if (counter % 2 == 1) {x1 = answer;} else {x2 = answer;}
}
cout << "You have Entered " << counter << " numbers.\n";
cout << "Finish \n" ;
return 0;
}
و اما نتيجه گيري اخلاقي و آموزشي:
تا الان خودم فكر ميكردم كه غير ممكنه كه با For اين برنامه رو نوشت چون فكر ميكردم كه استفاده از حلقه for فقط براي مواقعي هست كه تعداد تكرار مشخص است. يعني شرط حلقه for وابسته به مقدار شمارنده حلقه for هست. ولي با كمي دقت متوجه شدم كه شرط حلقه for وابسته به شمارنده حلقه for نيست. در وهله اول تنها راه ممكن استفاده از حلقه do while هست ولي وقتي امتحانش كردم و ديدم كه كار كرد متوجه شدم كه در شرط حلقه for هرگونه شرط منطقي ميشه نوشت و با اين حساب از حلقه for مثل حلقه هاي ديگه ميشه استفاده كرد. خوشحالم از اينكه نكته جديد در زمينه الگوريتم ياد گرفتم.
و نكته بعدي كه فكر ميكنم بگم بهتره اينه كه من تا حالا زبان برنامه نويسي سي كار نكردم ولي الگوريتم خودم رو داشتم با يه سرچ ساده توي اينترنت دستورات مربوطه در زبان برنامه نويسي سي رو پيدا كردم و برنامه رو نوشتم. البته مسلما زبان برنامه نويسي اينقدر پيچ خم و نكته داره كه بايد گفت تسلط به يك زبان برنامه نويسي به اين راحتي ها نيست. ولي تمركز من به بحث الگوريتم و آشنايي با ريزه كارييهاي اون هست.
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .