علاقه مند به یادگیری و آموزش. دارای تجربه کاری در زمینه تحلیل. طراحی و پیاده سازی نرم افزارهای سازمانی با استفاده از جاوا و php
من می خواهم برنامه نویس شوم - قسمت پنجم
سلام، در قسمت چهارم از این سری آموزشی امیدوارم با جستجو و پرسش از دیگر دوستانتان زبان مورد علاقه خود برای شروع این ماجراجویی تازه را انتخاب کرده و در خصوص نحوه شروع یادگیری (خودخوان، شرکت در بوت کمپ، شرکت در کلاس آموزشی، دوره های آنلاین) انتخاب کرده اید.
اما همزمان با اینکه جلسه اول را شروع کنید. اینجا سعی میکنیم به صورت موازی نهایتا تا چهار جلسه دیگر برخی اصطلاحات را تکمیل کنیم. برخی محتوای آموزشی ممکن است به دلیل ملکه شدن اصطلاحات در ذهنشان فراموش کنند باید این اصطلاحات را به شما شرح دهند.
در این قسمت آموزشی شما با مفاهیم الگوریتم و فلوچارت آشنا خواهید شد. اما به زبان ساده. این مفهوم نیز مانند همه مفاهیمی که تا کنون معرفی شدند تعاریف بسیاری دارد. اما خلاصه همه این تعاریف «به مراحل اجرای دستورالعمل های خواست شما» الگوریتم می گویند و به نمایش تصویری این مراحل با استفاده از اشکال مربع و دایره و ... فلوچارت می گویند.
این را بدانید در ابتدای راه تا رسیدن به لبه تکنولوژی مسیر شما هموار است و بر خلاف تصورتان بیشتر زمان را درگیر یادگیری برنامه نویسی نیستید. بلکه درگیر یادگیری ابزارهای آن هستید. زبان برنامه نویسی و آنچه استفاده میکنید ابزار کار شما هستند. تفکر حل مسئله شما و تبدیل یک ایده به یک برنامه (که خود ابزار است برای دیگران) توسعه نرم افزار است. یعنی شما با انتخاب ابزار هم باید استفاده از آن را یاد بگیرید هم به مرور زمان توانمندی حل مسئله پیدا کنید.
اما نگران نباشید. شما از مسائل کوچوک شروع خواهید کرد. زمانی می رسد که بخواهید این ابزار (برنامه خود) را نه برای مردم عادی بلکه برای تولید ابزار دیگری بنویسید. مثلا بروید و یک زبان برنامه نویسی را ارتقاء دهید (این هم نمونه یک حالت خیلی پیچیده است و صدها مثال ساده و پیچیده دیگر وجود دارد که فعلا بگذاریم کنار) اما هرچه مسائل به مرور زمان پیچیده تر شود، شما ممکن است درگیر ارائه راه حل های مختلف (الگوریتم های مختلف) برای حل آن باشید.
خوب قرار است چه چیز را یادبگیریم؟ در یک برنامه ساده مانند گرفتن اطلاعات یک فرم و نمایش آن ها یا ذخیره یک فرم جدید و بسیار مورد روتین که در برنامه های کاربردی امروز استفاده می شود مراحل کار برای شما که از توابع ارائه شده توسط زبانی که با آن برنامه نویسی میکنید استفاده می کنید ساده و مشخص هستند و نیاز به تفکر آنچنانی راجع به روش کار هم ندارید (صرفا رعایت ترتیب و دیدن تمام مراحل است).
اما فرض کنید روزی قرار است برنامه ای بنویسید که از بین میلیون ها فایل قرار است فایل های شبیه به هم را استخراج کند. در آن زمان حتما به دانش و همه تجربیات دیگران در خصوص روش کار نیاز خواهید داشت تا برنامه شما این کار را در بهینه ترین حالت ممکن انجام دهد. قرار نیست کاربر یک سال منتظر نتیجه برنامه شما باشد. موارد بسیاری برای بحث در طراحی الگوریتم وجود دارد که زمانی که شما با کلیت آن بیشتر آشنا شوید می توانید آن ها را مطالعه کنید. ما سعی می کنیم ذهن شما را با کلیت موضوع آشنا کنیم.
در تصویر بالا از شما می خواهم به حالت های مختلفی که از شهر A به شهر C می توان رفت فکر کنید. شکل فوق اصطلاحا یک گراف است (شکلی متشکل از نقاط و خطوط که مسیر یا چند وضعیت و ارتباط آن ها را معمولا نشان می دهد)
زمانی که بحث در مورد روش است ممکن است هر تصمیمی بگیرید و البته تصمیمات به این وضوح قابل رویت نیست این گراف می تواند صدها نود (نقطه) و یال (خطوط اتصال) داشته باشد. می تواند هزینه پیمایش رفت و برگشت روی یک یال متفاوت باشد (جاده ای دوطرفه را تصور کنید که فقط یک طرف آن آسفالت شده باشد و مسیر برگشت خاکی است) حال تصور کنید شهر D دارای ارتفاع باشد یعنی هزینه B به D بالا باشد. حال اگر این گراف بزرگتر باشد و همه این اطلاعات را به شما بدهند در هر لحظه از شما خواهند خواست کم هزینه ترین مسیر را پیدا کنید (سرعت انجام اینکار خیلی مهم است چرا که شما منابع cpu و ram بی نهایتی ندارید و اگر این درخواستها افزایش پیدا کند مثلا در هر ثانیه هزاران درخواست برای محاسبه به برنامه شما بفرستند آیا برنامه شما پاسخگو خواهد بود؟)
آنچه گفته شد مربوط به برنامه های خاص است و نه لزوما بزرگ، فعلا آنچه ما با آن برخورد می کنیم نیازی به محاسبات ساده یا پیچیده ریاضی ندارند. توابعی در طراحی الگورتیم برای محاسبه زمان اجرای برنامه وجود دارد که می توانید با مقایسه نتیجه آن ها حساب کنید که کدام روش بهینه ترین روش نوشتن یک برنامه خواهد بود. و بر آن اساس الگوریتم مورد نیاز را طراحی کنید.
دروس طراحی الگوریتم و ریاضیات گسسته و آمار و احتمالات در رشته کامپیوتر و IT بصورت تخصصی به این موضوع می پردازند
برگردیم به آموزش ساده خودمان، فرض کنید می خواهید برنامه ای بنویسید که یک لامپ LED را هر ۵ ثانیه یک بار روشن کند (فرض ما بر این است که همچنان به آدرس لامپ احتیاج داریم). پس مراحل کار به این صورت است:
- شروع
- گرفتن آدرس کلید لامپ
- روشن کردن کلید
- نیم ثانیه توقف
- خاموش کردن کلید
- پنچ ثانیه توقف
- رفتن به مرحله سه
- پایان
در یک الگوریتم باید ترتیب اجرای مراحل کار مشخص باشد و باید دارای جزئیات باشد. آنچه گفته شد یک مثال برای درک موضوع است و راجع به توقف و روشن کردن لامپ و گرفتن آدرس لزوما به این شکل نیست. برنامه فوق همیشه اجرا خواهد شد و به قسمت پایان نخواهد رفت چون هر بار در مرحله ۷ به مرحله ۳ باز خواهد گشت این عمل را یک حلقه (loop) می نامند. همچنین آدرس کلید را شما یک بار میگیرید و در داخل حلقه استفاده میکنید خوب برنامه ها هر آنچه که از آن استفاده میکنند باید تحت یک نام ذخیره کنند تا از آن استفاده کنند مثلا فرض کنید نام keyAddress را برای این کار در نظر میگیریم، اصطلاحا به این نام متغیر می گویند.
هرچند آموزش متغیر ارتباطی با این مقاله ندارد اما در یک نگاه اجمالی و به طور کلی به شکل زیر می توان آنها را تعریف کرد (البته در هر زبان این موارد دارای ملاحظاتی است که در طول آموزش آن ها یاد خواهید گرفت)
متغیر مانند ظرفی است که مقادیری را در خود نگاه می دارد. این مقادیر می توانند حتی شامل متغیرهای دیگر (سختار تو در تو که خود نیز دارای اجزا است) باشد
در مثال فوق فرض کنید آدرس کلید متشکل از ترکیبی از حروف و اعداد مثلا A103984F4 که البته طریقه استفاده از آن را کاری نداریم.
به هر مقداری که دارای حروف باشد (صرفا حروف یا ترکیبی از حروف و اعداد) یا دارای علائم خاص مانند & یا هر کاراکتر دیگری اصطلاحا متغیر از نوع رشته (string) می گویند. مثال فوق از 9 حرف/عدد تشکیل شده به تک تک اینها یک کاراکتر میگوییم یعنی رشته از کاراکتر (character یا char) تشکیل شده
متغیرهایی که مقادیری فقط از اعداد صحیح در خود نگاه می دارند مانند (124-) را متغیر عددی میگوییم که بسته به میزان بزرگی و کوچکی عدد یک نام خاص دارند (short, integer / int, long, big integer و ...) نام هایی است که با همه آنها آشنا خواهید شد.
متغیرهایی که مقادیری اعشاری را در خود نگاه می دارند نیز float و Double می نامند
نوع دیگری از متغیر نیز وجود دارد که همیشه یکی از دو مقدار true یا false را در خود نگاه می دارد (صحیح یا غلط) همچنین معادل آن می تواند 1 یا 0 باشد، در حقیقت این متغیر مانند یک سویچ فیزیکی است که تنها دو حالت دارد که بعدها استفاده آن را یاد خواهید گرفت. این متغیر ها را از نوع Boolean مینامند
و در نهایت به صورت کلی متغیر هایی هم هستند که متغیر های دیگری را در خود ذخیره می کنند که باید در آینده و پس از قسمت بعدی (آموزش شی گرایی) راجع به آن ها صحبت کرد.
به آموزش اصلی برگردیم:
برنامه جمع دو عدد را تصور کنید:
- شروع
- گرفتن عدد a (گرفتن عدد تحت نام متغیری به نام a)
- گرفتن عدد b
- چاپ a + b
- پایان
الگوریتم فوق می تواند یک مرحله اضافه هم داشته باشد. مثلا مقدار a+b را در متغیری به نام مثلا sum ذخیره کنیم و در مرحله چاپ بجای a + b مقدار ذخیره شده در متغیر sum را چاپ کنیم.
start;
get a;
get b;
sum = a + b;
print sum;
end;
اصطلاحا چیزی که در بالا میبینید سودوکد میگویند یعنی بصورت کلی و فارغ از دستورات مختص زبانی که با آن برنامه می نویسید (صرفا استفاده از الفاظ انگلیسی معنا دار که گویای مراحل است) بتوان یک الگوریتم را نمایش داد.
نکته: به علامت = دقت کنید که برای انتقال یک مقدار به یک متغیر است. در بکار بردن علامت مساوی همیشه مقدار سمت راست در متغیر سمت چپ مساوی قرار می گیرد (همواره رسم الخط انگلیسی را در نظر بگیرید).
گاهی لازم است شما با توجه به شرایط موجود کاری انجام دهید. مثلا می خواهیم یک عدد بگیریم و اطلاع دهیم عدد زوج است یا فرد. (اعدادی زوج هستند که بر 2 بخش پذیر باشند) در نتیجه باید وقتی بر 2 تقسیم می شوند حتما باقیمانده عدد 0 باشد.
نکته: شما با عملگر های جمع (+)، تفریق (-)، ضرب(*) و تقسیم(/) آشنایی دارید (در تمام زبان ها از علامت های داخل پرانتز برای آنها استفاده می شود). عملگر دیگری به اسم mod که علامت آن (٪) است وجود دارد که مقدار باقیمانده تقسیم دو عدد را مشخص می کند.
start;
get a;
c = a mod 2;
if (c == 0)
print "even"
else
print "odd"
end;
- شروع
- گرفتن عدد a
- ذخیره باقیمانده تقسیم a بر عدد 2 در متغیر c
- اگر مقدار متغیر c برابر با 0 بود
- چاپ کن "زوج"
- در غیر این صورت
- چاپ کن "فرد"
- پایان
در تمام زبان های برنامه نویسی برای بررسی یک شرط از کلمه if استفاده می کنند. و در سودوکد هم همینطور مینویسند. مثلا if(a==true) یعنی اگر a مقدار true را داشت.
البته توجه داشته باشید چون در زبان های برنامه نویسی عملگر= برای انتقال یک مقدار به یک متغیر است در دستورات شرطی عملگر == کار مقایسه را انجام میدهد بدین صورت که اگر هر دو طرف عملگر مقدار یکسانی را داشته باشند اصطلاحا وارد شرط خواهد شد و دستورات زیر مجموعه آن را اجرا می کند و در غیر این صورت از آن دستورات می گذرد (اگر برنامه دارای else یا «در غیر این صورت» باشد فقط یکی از کد های خود شرط یا در غیر اینصورت اجرا میشود). که در مثال فوق دستور چاپ زوج، دستور زیر مجموعه شرط به شمار می رود. و چاپ فرد، دستور زیر مجموعه else به شمار می رود.
دستورات شرطی می توانند شامل else (در غیر این صورت) نباشند که در این صورت اگر شرط بر قرار باشد دستور زیر مجموعه آن اجرا و اگر بر قرار نباشد از دستو زیر مجموعه آن صرف نظر کرده و باقی دستورات را اجرا می کند.
در هنگام آموزش زبان انتخابی خود با انواع این دستورات و دیگر دستورات در آن زبان با قوانین نوشتار آن زبان آشنا خواهید شد. با حالت های دیگر ممکن آشنا شده و آن ها را به کار خواهید گرفت.
اکنون شما آماده هستید که برای انگیزه بیشتر اولین برنامه را بنویسید. پس آموزش زبان برنامه نویسی انتخابی را هرچه سریع تر شروع کنید (البته ما باز هم برای کمک به بیان اصطلاحات بیشتر در قسمت بعد شی گرایی را آموزش داده و در قسمت بعد از آن یک روش خیلی ساده برای اجرای اولین برنامه را در چند زبان مختلف برای آشنایی شما نشان می دهیم.
فلوچارت چیست؟
همانطور که گفته شد نمایش تصویری یک الگوریتم است اما نکاتی دارد:
- از شکل بیضی برای شروع و پایان استفاده می شود
- از شکل متوازی الاضلاع برای ورودی و خروجی برنامه
- از شکل مربع برای نمایش محاسبات
- از شکل لوزی برای نمایش شرط ها
همین.
مطلبی دیگر از این انتشارات
چرا CI/CD به کارمون میاد ؟ چی هست ؟
مطلبی دیگر از این انتشارات
گیتلب و CI/CD: یک راهنمای ساده - قسمت اول
مطلبی دیگر از این انتشارات
ساختار پوشه بندی مناسب برای پروژه های مقیاس بزرگ در React.js