برای شروع برنامه نویسی باید به یکسری سوال جواب بدیم یا با یکسری مفاهیم آشنا بشیم. در این مطلب به سوال برنامه نویسی چیست پاسخ داده و قصد داریم مفاهیمی که شما برای شروع آموزش برنامه نویسی به آن نیاز دارید را در اختیار شما قرار دهیم و شما را با مهمترین مفاهیمی که در طول یادگیری یک زبان برنامه نویسی با آن برخورد می کنید آشنا کنیم. سعی کردم این مطلب را با زبان ساده و به صورت گام به گام به همراه مثال های متعدد آماده کنم تا دوستان با کمترین میزان آشنایی با دنیای برنامه بتونن آموزش برنامه نویسی رو شروع کنن. برای مطالعه این مطلب شما نیاز به پیش نیاز خاصی ندارید.
برنامه نویسی دنیای زیباییه و وقتی زیبا تر میشه که آموزش برنامه نویسی رو شروع کنی! وقتی واردش بشی دیگه نمیتونی ازش دل بکنی. این جمله رو با تمام وجودم میگم و بهش اعتقاد دارم. با اینکه سال هاست کار برنامه نویسی انجام میدم و مدت زیادی رو درگیر آموزش برنامه نویسی بودم، اما هنوز هم برام تازگی داره. خیلی از افراد رو میبینم که تصمیم دارن کار برنامه نویسی رو شروع کنن، اما نمیدونن از کجا باید این کار و انجام بدن و یک جورایی سردرگم هستن و یا اصلاً نمیدونن که از کجا باید منابع آموزش برنامه نویسی رو انتخاب کنن!
قبل از هر چیز باید پایه های اون کار رو محکم ایجاد کنید. آموزش برنامه نویسی هم از این قاعده مستثنی نیست. واژه ها و مفاهیم زیادی وجود داره که یادگیری اون ها جزو اصول اولیه یادگیری یک زبان برنامه نویسی هست و البته یادگیری این موضوعات چیز پیچیده ای نیست. به همین خاطر تصمیم گرفتم یکسری مطالب در مورد مفاهیم برنامه نویسی و مباحث مرتبط با آموزش برنامه نویسی رو در وب سایت توسینسو قرار بدم.
این مطلب نه در مورد زبان برنامه نویسی خاصی هست و نه قصد داره تکنیک های برنامه نویسی رو به شما آموزش بده، تنها قصدم از نوشتن این مطلب اینه که دوستانی که قصد ورود به دنیای برنامه نویسی دارن و به دنبال منبع مناسبی برای آموزش برنامه نویسی هستن رو با یکسری مفاهیم و موضوعات که پیش نیاز شروع برنامه نویسی هست آشنا کنم.
برای خواندن این مطلب، تنها کافیست که با شیوه روش کردن یک کامپیوتر، کار کردن با موس و کیبورد و البته اجرا کردن یک برنامه کامپیوتری مانند Media Player که برای پخش آهنگ و فیلم از آن استفاده می کنید آشنا باشید، همین و نه هیچ چیز بیشتر! برای شروع بهتر است که با سه مفهوم اصلی یعنی برنامه کامپیوتری، برنامه نویس و زبان برنامه نویسی آشنا شویم.
قبل از شروع به آموزش برنامه نویسی باید با یکسری مفاهیم ا ولیه آشنا بشیم! در قدم اول به سراغ تعریف برنامه کامپیوتری رفتیم. اگر بخواهیم یک تعریف ساده از یک برنامه کامپیوتری داشته باشیم می توانیم اینگونه بگوییم که یک برنامه کامپیوتری مجموعه ای از دستورالعل ها است که با اجرای آن توسط کامپیوتر یک یا چند نیاز کاربربرطرف می شود. برای مثال، برنامه ای مانند Media Player، برنامه ایست که از آن برای پخش موسیقی و فیلم استفاده می شود.
هر کامپیوتری، برای اینکه قابل استفاده باشد نیاز به برنامه دارد. سیستم عامل یک برنامه کامپیوتری است که بعد اجرا محیطی را برای کاربر فراهم می کند که سایر برنامه ها را اجرا کند. امروزه حجم زیادی از برنامه های کامپیوتری وجود دارند که هر یک بر اساس یک یا چند نیاز مشخص ایجاد شده اند.
همانطور که گفتیم، برنامه های کامپیوتری مجموعه ای از دستور العمل ها هستند که توسط کامپیوتر اجرا می شوند. اما این دستورالعمل ها چگونه ایجاد می شوند؟ جواب سوال ساده است، برنامه نویس شخصی است که دستورالعمل های یک برنامه کامپیوتری را می نویسد. برنامه نویس بر اساس نیازهایی که شناسایی می شود اقدام به نوشتن برنامه می کند. این نیازها بر اساس درخواست های مشتری یا شرکتی که برنامه نویس برای آن کار می کند مشخص می شود. معمولاً برنامه نویسان با واژه هایی مانند Programmer یا Developer و یا Coder خطاب می شوند.
برنامه نویس برای نوشتن دستورالعمل های یک برنامه کامپیوتری نیاز به یک زبان برنامه نویسی دارد. زبان های برنامه نویسی امکانی را برای برنامه نویس فراهم می کنند تا برنامه نویس بتواند دستورالعمل های مورد نظر خود را برای اجرا توسط کامپیوتر بنویسد. هر زبان برنامه نویسی ساختار منحصر به خودش را برای نوشتن دستورالعمل ها دارد.
مثالی بزنیم، فرض کنید میدان ونک هستید و از شخصی برای رفتن به نمایشگاه بین المللی آدرس می پرسید، شخصی که آدرس از او پرسیده می شود، یکسری دستورالعمل به شما می دهد که با انجام آن دستور العمل ها به مقصد خود می رسید، این دستور العمل ها بر اساس اشخاص مختلف تفاوت دارد، برای مثال، شخصی به شما اینگونه آدرس می دهد:
اما شخص دیگری به شما اینگونه آدرس می دهد:
دقت کنید، مقصدی که گفته شد هر دو یکی است، اما آدرس اول سر راست تر و شما سریع تر به مقصد خود می رسید، زیرا شخص آدرس دهنده آگاهی بهتری نسبت مسیرهای مختلف در شهر تهران دارد. برنامه های کامپیوتری نیز به همین صورت است، ممکن است دو برنامه نویس متفاوت، دستورالعمل های متفاوتی را برای یک وظیفه مشخص بنویسند که این کاملاً بستگی به میزان آگاهی و علم برنامه نویس دارد.
ممکن است یک برنامه نویس دستورالعمل های اشتباهی برای برنامه بنویسد که باعث ایجاد خروجی اشتباه برای برنامه کامپیوتری می شود، مشابه اینکه شخص مورد نظر آدرس اشتباه به شما دهد و با انجام دستورالعمل های آن شخص، به جای نمایشگاه بین المللی سر از میدان تجریش در آورید!
بعد از نوشتن برنامه، یک فایل اجرایی تولید می شود که دیگران می توانند با اجرای آن، از برنامه استفاده کنند. کامپیوتر شما برنامه ها را بوسیله واحد پردازشگر مرکزی (Central Processing Unit) که همان CPU خودمان است اجرا می کند. کامپیوتر تنها زبان ماشین را متوجه می شود.
زبان ماشین، زبانی است که از اعداد 0 و 1 تشکیل می شود. یعنی تنها دو عدد 0 و 1 برای کامپیوتر قابل فهم است. برنامه نویس ها می توانند برنامه ها را تحت یک زبان مشخص بنویسند، اما مهم این است که تمامی این برنامه ها، بعد از نوشته شدن باید به زبان ماشین تبدیل شوند تا قابل اجرا باشند.
می توان کامپیوتر و برنامه نویس را تشبیه کرد به یک فارسی زبان و یک شخص انگلیسی زبان، برای اینکه شخص انگلیسی زبان، صحبت های شخص فارسی زبان را متوجه شود باید از یک مترجم استفاده کند که صحبت ها را به زبان مورد نظر ترجمه کند. زبان های برنامه نویسی نیز به همین صورت هستند، هر زبان برنامه نویسی نیاز به یک مترجم دارد که دستورات نوشته شده تحت آن زبان برنامه نویسی را به زبان ماشین تبدیل کند تا برای کامپیوتر قابل فهم باشد.
در این قسمت از مطلب در مورد سه مفهوم اصلی یعنی برنامه کامپیوتری، برنامه نویس و زبان برنامه نویسی صحبت کردیم، در قسمت بعدی توضیحات بیشتری در مورد زبان ماشین و نحوه تبدیل کدهای نوشته شده تحت یک زبان برنامه نویسی به زبان ماشین خواهیم داد.
در ادامه مباحث آموزش برنامه نویسی به بررسی انواع زبان های برنامه نویسی میپردازیم. همانطور که در قسمت قبلی گفتیم، برنامه نویس به کمک زبان برنامه نویسی می تواند دستورالعمل های مرتبط با یک برنامه کامپیوتری را بنویسد.
بیشتر بخوانید: معرفی انواع زبان های برنامه نویسی و کاربردهایشان
اما یک برنامه نویس زمانی که قصد ورود به دنیای برنامه نویسی را دارد با گزینه های زیادی روبرو است، زبان های برنامه نویسی مختلف که هر یک در یک زمینه کارآیی دارند و برنامه نویس می بایست بر اساس علایق خود، زبان برنامه نویسی مناسب را انتخاب کند. همانطور که گفتیم، در این سری مطالب قصد نداریم در مورد یک زبان خاص صحبت کنیم، اما به صورت کلی می توان زبان های برنامه نویسی را به انواع زیر تقسیم کرد:
البته نمی توان گفت که هر زبان به طور مشخص تنها در یک سطح قرار میگیرد، بعضی زبان ها هستند که می توانند در دوسته به صورت مشترک قرار بگیرند، این دسته بندی ها بر اساس ماهیت زبان و کاربرد آن ها مشخص می شود. البته دسته بندی های دیگری مانند زبان های سرگرمی، زبان های آموزشی، زبان های خیلی سطح بالا و ... نیز در سطح اینترنت مشاهده می شوند که عمومیت ندارند و معمولاً دسته بندی های بالا کفایت می کنند. در ادامه به بررسی هر یک از این زبان ها می پردازیم:
این زبان ها، به صورت مستقیم با زبان ماشین کار می کنند. دستورالعمل های این زبان ها به صورت مستقیم توسط انسان قابل درک نمی باشد. معمولاً کدهای ماشین مبتنی بر مبنای 16 نوشته می شوند، مانند:
89 F8 A9 01 00 00 00 75 06 6B C0 03 FF C0 C3 C1 E0 02 83 E8 03 C3
شاید سخت ترین زبان در آموزش برنامه نویسی زبان ماشین باشه! این دسته از زبان ها یک سطح بالاتر از زبان ماشین قرار میگیرند و تا حدودی توسط انسان قابل خواندن و درک هستند، البته درک برنامه های نوشته شده بر اساس زبان های اسمبلی بسیار دشوار است. در زیر می توانید نمونه ای از کد اسمبلی را مشاهده کنید:
.globl f .text f: mov %edi, %eax # Put first parameter into eax register test $1, %eax # Isloate least significant bit jnz odd # If it's not a zero, jump to odd imul $3, %eax # It's even, so multiply it by 3 inc %eax # and add 4 ret # and return it even: shl $2, %eax # It's odd, so multiply by 4 sub $3, %eax # and subtract 3 ret # and return it
زبان های سطح بالا به زبان های محاوره ای انسان ها بسیار نزدیک هستند. از کلمات با معنی در کدها استفاده می شود، برای مثال برای ایجاد شرط در برنامه ها از دستوراتی مانند if استفاده می شود یا برای پرش در میان کد از دستوری مانند goto. امکان نوشتن عملیات های ریاضی بر خلاف زبان های اسمبلی در این نوع از زبان ها بسیار ساده است. برای مثال، کد زیر نمونه از یک کد در زبان های سطح بالا می باشد که حاصل جمع دو عدد را در خروجی چاپ می کند:
Console.Write(2 + 2);
زبان های سیستمی، کارآیی متفاوتی از سایر زبان های برنامه نویسی دارند، شما در زبان های برنامه نویسی سیستمی به راحتی می توانید با قسمت های مختلف کامپیوتر مانند حافظه اصلی، قطعات مختلف سخت افزاری و ... کار کنید. از مزیت های مهم زبان های سیستمی امکان ارتباط مستقیم با بخش های مختلف کامپیوتر و همچنین سرعت اجرای بالای کدها است.
زبان های اسکریپت نویسی معمولاً دارای قدرت زیادی بوده و می توان کارهای سنگین را با حجم کمی از کد انجام داد. زبان های اسکریپت نویسی زیادی وجود دارند مانند زبان جاوا اسکریپت که در محیط وب استفاده می شود.
از این زبان ها معمولاً برای یک کار خاص استفاده می شود، برای مثال زبان هایی مانند HTML یا MATLAB جزو دسته زبان های Domain Specific قرار میگیرند. به سایر زبان های برنامه نویسی مانند زبان #C زبان های GPL یا General Purpos Languages یا زبان های همه منظوره گفته می شود. در این مطلب به بررسی نوع های مختلف زبان های برنامه نویسی پرداختیم، در قسمت بعدی در مورد انواع روش های تبدیل کد های نوشته در زبان های برنامه نویسی به زبان ماشین خواهیم پرداخت.
در این بخش از آموزش برنامه نویسی با نحوه اجرای کدها آشنا میشیم. در قسمت اول گفتیم که هر برنامه کامپیوتری برای اجرا باید به زبان ماشین تبدیل شود، زیرا کامپیوتر تنها زبانی که متوجه می شود زبان ماشین است، یعنی زبان 0 و 1. در حقیقت کامپیوتر شما از حافظه های مختلفی تشکیل شده، مانند حافظه اصلی (RAM)، رجیسترهای CPU که حافظه های بسیار محدودی هستند، حافظه های جانبی مثل هارد دیسک ها و ... اطلاعات در حافظه ها به صورت مجموعه ای از اعداد 0 و 1 ذخیره می شوند که اصطلاحاً به آن مبنای دو گفته می شود.
برنامه های کامپیوتری برای اجرا، کدها را ابتدا به زبان ماشین یا همان زبان 0 و 1 ترجمه کرده و بوسیله CPU یا واحد پردازشگر مرکزی کدها را اجرا می کنند، رجیسترهای CPU که حافظه های بسیار کوچکی هستند نقش اصلی را در اجرای کدها بازی می کنند. اما روند تبدیل کدهای سطح بالا به کد ماشین توسط ابزارهایی به نام Compiler و Interpreter انجام می شود. در ادامه به بررسی این دو ابزار و تفاوت های آن ها خواهیم پرداخت.
کامپایلر | Compiler و اینترپرتر یا مفسر | Interpreter ابزارهایی هستند که عملیات تبدیل کد سطح بالا به کد ماشین را انجام می دهند. هر زبان برنامه نویسی کامپایلر یا اینترپرتر مخصوص به خودش را دارد، اما این دو ابزار تفاوت هایی نیز با یکدیگر دارند که در این قسمت به آن ها اشاره می کنیم:
بیشتر بخوانید: تفاوت کامپایلر | Compiler و مفسر | Interpreter در چیست؟
البته کامپایلرهایی نیز وجود دارند که کدهای سطح بالا را به صورت مستقیم به کد ماشین تبدیل نمی کنند، مانند کامپایلر زبان سی شارپ، کامپایلر زبان سی شارپ، کد نوشته شده را به جای کد ماشین به یک کد سطح میانی به نام کد IL تبدیل می کند و در زمان اجرا کد میانی IL توسط کامپایلر دیگری به نام JIT به کد ماشین تبدیل می شود.
زمانی که شما با زبانی مانند Assembly کار می کنید، این زبان یک زبان سطح پایین است. کد Assembly نیز باید به کد ماشین تبدیل شود، برای تبدیل کد زبان اسمبلی به زبان ماشین از Assembler استفاده می شود. مفاهیم دیگری نیز وجود دارند مانند:
در این بخش در مورد نحوه اجرای برنامه ها، و همچنین کامپایلر و اینترپرتر توضیحاتی دادیم. در قسمت بعدی در مورد سیستم های عددی یا همان مبناهای عددی مختلف توضیحاتی خواهیم داد.
تبدیل مبناها یکی از بخش هایی هست که در هر آموزش برنامه نویسی باید حضور داشته باشه، نباشه اصلاً نمیشه انگار! :دی کامپیوترها برای اجرای کدهای نوشته شده در زبان های برنامه نویسی مختلف، باید کدها را تبدیل به زبان ماشین کنند. زبان کامپیوتر زبان دو دو یی است، یعنی کامپیوتر تنها اعداد 0 و 1 را می شناسد. یکی از مفاهیمی که بهتر است قبل از شروع برنامه نویسی با آن آشنا شویم مبناهای عددی مختلف است که در این قسمت به این موضوع می پردازیم.
مبنای اعداد بر اساس تعداد اعدادی که در مبنا قابل استفاده هستند مشخص می شود. برای مثال، در مبنای دو، تنها اعداد 0 و 1 استفاده می شوند یا در مبنای 16، اعداد 0 تا 9 و کاراکترهای A تا F استفاده می شوند. در این مطلب به ترتیب در مورد مبناهای مختلف و همچنین شیوه های تبدیل آن ها به یکدیگر توضیح خواهیم داد.
مبنای 10، همان سیستم عددی رایج است که ما انسان ها از آن استفاده می کنیم، اعداد در این سیستم، با ترکیب اعداد 0 تا 9 ساخته می شوند. مثل عدد 29 یا 1242.
همانطور که گفتیم، تقریباً تمامی کامپیوتر های امروزی از سیستم دودویی یا همان Binary System که مبنای دو می باشد استفاده می کنند. برای آشنایی بیشتر با سیستم Binary یک مثال می زنیم. به صورت عادی ما انسان ها اعداد را از 1 می شناسیم به بالا، برای مثال عدد 1000 یا 23444. اما در مبنای دو، تمامی اعداد باید با اعداد 0 و 1 نمایش داده شوند.
برای مثال عدد 9 در مبنای دو به صورت 1001 نمایش داده می شود. در مبنای دو، برای هر یک از خانه هایی که اعداد صفر و یک در آن قرار میگیرد، یک ارزش عددی مشخص می شود، ارزش گذاری خانه ها از سمت راست و با عدد یک شروع شده و هر چه به سمت راست برویم، ارزش هر خانه معادل ارزش خانه قبلی ضربدر 2 می باشد. به تصویر زیر دقت کنید:
همانطور که مشاهده می کنید، هر خانه یک ارزش عددی دارد، خانه اول عدد 1، خانه دوم عدد 2، خانه سوم عدد 4 که برابر با 2 ضربدر 2 یا 2 به توان 2 است. برای مثال، ارزش خانه پنجم معادل 8 ضربدر 2 یا عدد 2 به توان 4 می باشد، در حالت به توان رساندن، به این صورت می شود که عدد 2 به توان شماره خانه جاری منهای 1:
[1] = 2 ^ 0 = 1 [2] = 2 ^ 1 = 2 [3] = 2 ^ 2 = 4 [4] = 2 ^ 3 = 8
اما عددی مانند 9 که در ابتدا مثال زدیم، چگونه در مبانی دو نمایش داده می شود؟ همانطور که گفتیم در مبنای دو تنها اعداد 0 و 1 را استفاده می کنیم. عدد 0 به معنای خاموش بودن یک خانه و عدد 1 به معنای روشن بودن یک خانه است. کاری که باید بکنیم ارزش خانه هایی که روشن هستند را با هم جمع کنیم تا عدد معادل در مبنای 10 بدست آید. تصویر زیر را مشاهده کنید:
در تصویر بالا، ارزش خانه های اول و چهارم که مقدار 1 دارند، یعنی روشن هستند را با هم جمع کرده تا به عدد مورد نظر یعنی 9 برسیم. بدست آوردن معادل اعداد در مبنای دو برای اعداد کوچک ساده است، اما برای اعداد بزرگ این کار بسیار دشوار است، برای تبدیل یک عدد از مبنای 10 به مبنای 16 کافیست عدد مورد نظر را تقسیم بر 2 کرده، سپس باقیمانده آن را مجدد تقسیم بر 2 کنیم تا در انتها به باقیمانده 1 یا صفر برسیم، برای مثال، عدد 1232 را در نظر بگیرید، به صورت زیر آن را تبدیل به مبنای 2 می کنیم:
حال اعدادی که دور آن ها دایره قرمز کشیده شده، یعنی باقیمانده های تقسیم را برعکس می نویسیم، یعنی عددی که سمت راست قرار دارد باید سمت چپ قرار بگیرد:
1 0 0 1 1 0 1 0 0 0 0 1024 512 256 128 64 32 16 8 4 2 1
حال ارزش عددی خانه هایی که مقدارشان 1 است را با هم جمع می زنیم:
1024 + 128 + 64 + 16 = 1232
با این روش می توان هر عددی را از مبنای 10 به 2 تبدیل کرد.
اعداد مبنای 16، از ترکیب اعداد 0 تا 9 و کاراکتر های A تا F ایجاد می شوند. کاراکتر های A تا F معادل عددی 10 تا 15 هستند. یکی از قسمت هایی که مبنای 16 بسیار مشاهده می شود، استفاده از رنگ های مبتنی بر HEX هستند که با 6 کاراکتر مشخص می شوند:
FFFFFF => رنگ سفید 000000 => رنگ سیاه E7E7E7 => رنگ طوسی روشن
تبدیل این عددها به مبنای 10 نیز بر اساس همان مکانیزم ارزش گذاری هر جایگاه ضربدر عددی که در آن جایگاه قرار دارد به دست می آید. برای مثال، عدد زیر را در مبنای 16 در نظر بگیرید:
5 B(11) 3 F(15) 4 16^4 = 65536 16^3 = 4096 16^2 = 256 16 1
برای بدست آوردن معادل مبنای 10 عدد بالا، کافیست عدد هر خانه را ضربدر ارزش آن خانه کنیم:
(5 * 65536) + (11 * 4096) + (3 * 256) + (15 * 16) + (4 * 1) 327680 + 45056 + 768 + 240 + 4 = 373748
با انجام پروسه ذکر شده به عدد 327680 می رسیم که معادل عدد 5B3F4 در مبنای 16 می باشد. مبناهای دیگری نیز وجود دارند مانند مبنای 8 یا Octal System، مبنای 20 یا Vigesimal و ... که هر یک بر اساس مکانیزم های مشخص در آن مبنا قابل تبدیل به سایر مبنا ها هستند. در این قسمت با سیستم اعداد و مبناهای مختلف آشنا شدیم. در قسمت بعدی، با مفاهیم تکمیلی در مورد مبنای دو که شامل عملگرهای بیتی می باشند آشنا خواهیم شد.
در قسمت قبلی با سیستم اعداد و همینطور اعداد مبنای 2 آشنا شدیم و گفتیم که کامپیوترها، مبتنی بر اعداد مبنای 2 کار می کنند، یعنی تنها اعداد 0 و 1 را می شناسند. همانطور که بر مبنای 10 ما می توانیم بر روی اعداد عملگرهایی مانند جمع، تفریق، ضرب و ... را انجام دهیم، اعداد مبنای دو نیز عملگرهای مختص خود را دارند که به آن ها عملگرهای بیتی گفته می شود. در ابتدا تعریفی از عملگر و عملوند داشته باشیم:
همانطور که گفتیم در این مطلب قصد داریم تا عملگرهای بیتی را بررسی کنیم. در ادامه با من همراه باشید.
این عملگر، بر روی اعداد مبنای دو استفاده شده و کاری که انجام می دهد، صفرها را به یک و یک ها را به صفر تغییر می دهد. برای مثال، عدد 6 در مبنای 2 به صورت زیر است:
0110
حال عدد بالا را NOT می کنیم:
NOT(0110) = 1001
با NOT کردن عدد 6 در مبنای دو، به عدد 9 میرسیم.
این عملگر بین دو عدد باینری انجام می شود و تک تک خانه های معادل را با هم AND می کند. در ابتدا توضیح دهیم که عملگر AND بر روی هر جایگاه چه تاثیری دارد، به متن زیر دقت کنید:
0 AND 0 = 0 0 AND 1 = 0 1 AND 0 = 0 1 AND 1 = 1
با توجه به مثال بالا، متوجه می شویم که عملگر AND، تنها در صورتی خروجی 1 می دهد که تمامی خانه ها 1 باشند و در صورتیکه تنها یک خانه 0 باشد، نتیجه 0 خواهد بود، در مثال زیر دو عدد 5 و 9 را با هم AND می کنیم:
5 = Binary(0101) 9 = Binary(1001) 0 1 0 1 AND 1 0 0 1 --------------------------- 0 0 0 1 => Decimal(1)
یعنی زمانی که شما دو عدد 5 و 9 را با هم AND می کنید، حاصل خروجی بر اساس اعمال عملگر بر خانه های معادل، عدد 1 خواهد بود.
این عملگر بین دو عدد باینری انجام می شود و تک تک خانه های معادل را با هم OR می کند. در ابتدا توضیح دهیم که عملگر OR بر روی هر جایگاه چه تاثیری دارد، به متن زیر دقت کنید:
0 OR 0 = 0 0 OR 1 = 1 1 OR 0 = 1 1 OR 1 = 1
بر خلاف عملگر AND، عملگر OR، در صورتی خروجی 1 می دهد که یکی از خانه ها 1 باشند و در صورتیکه همه خانه ها 0 باشد، نتیجه 0 خواهد بود، در مثال زیر دو عدد 5 و 9 را با هم OR می کنیم:
5 = Binary(0101) 9 = Binary(1001) 0 1 0 1 OR 1 0 0 1 --------------------------- 1 1 0 1 => Decimal(13)
همانطور که ملاحظه می کنید، زمانی که شما دو عدد 5 و 9 را با هم AND می کنید، حاصل خروجی بر اساس اعمال عملگر OR بر خانه های معادل، عدد 13 خواهد بود.
این عملگر بین دو عدد باینری انجام می شود و تک تک خانه های معادل را با هم XOR می کند. در ابتدا توضیح دهیم که عملگر XOR بر روی هر جایگاه چه تاثیری دارد، به متن زیر دقت کنید:
0 XOR 0 = 0 0 XOR 1 = 1 1 XOR 0 = 1 1 XOR 1 = 0
در مثال بالا، نکته ای که وجود دارد با XOR کردن دو خانه، خروجی تنها در صورتی 1 خواهد بود که یکی از خانه ها 1 باشد و دیگری 0، در صورتی که هر دو خانه 1 یا هر دو خانه 0 باشند، خروجی 0 خواهد بود. در مثال زیر دو عدد 5 و 9 را با هم XOR می کنیم:
5 = Binary(0101) 9 = Binary(1001) 0 1 0 1 XOR 1 0 0 1 --------------------------- 1 1 0 0 => Decimal(12)
در مثال بالا، با XOR کردن اعداد 5 و 9 به صورت Binary، حاصل خروجی 12 خواهد بود.در قسمت بعدی سری آموزشی، شروع به توضیحات در مورد قابلیت های اولیه یک زبان برنامه نویسی خواهیم کرد، مانند ابزارها و محیط های توسعه، تعریف دستورات و علائم، نوع های داده، متغیرها، رشته ها و ...
تا اینجا ما با یکسری مفاهیم و مقدمات مورد نیاز برای شروع برنامه نویسی آشنا شدیم، اما یکی از مفاهیمی که در آموزش برنامه نویسی باید یاد بگیرید، مفهوم IDE است. فرض کنید که الان می خواهید کار برنامه نویسی را شروع کنید. برای اینکار نیاز به یکسری ابزارها دارید که بتوانید بوسیله آن ها شروع به کد نویسی کنید. مهمترین ابزارهایی که برای توسعه یک نرم افزار استفاده می شوند عبارتند از:
بیشتر بخوانید: IDE چیست؟ آشنایی با محیط یکپارچه توسعه به زبان ساده
هدف ما از این مطلب آشنایی شما با IDE ها و اصلی ترین قابلیت هایی است که یک IDE در اختیار برنامه نویس قرار می دهد. در ابتدا یک تعریف کلی از IDE ارائه کنیم: IDE یا Integrated Development Environment محیطی است که یکسری ویژگی ها و قابلیت ها را در اختیار برنامه نویسان و توسعه دهندگان قرار می دهد تا بتوانند با سرعت بیشتری کار برنامه نویسی و توسعه نرم افزار را انجام دهند. به طور معمول هر IDE باید از سه قابلیت زیر
پشتیبانی کند:
در ادامه به بررسی هر یک از این ویژگی ها و توضیحات آن می پردازیم:
اصلی ترین قابلیت یک IDE، ویرایشگر کد است. شما می توانید از ویرایشگر های زیادی استفاده کنید، مثل Notepad یا ++Notepad، اما ویرایشگری مثل Notepad محدودیت های زیادی دارد. یکی از قابلیت های مورد نیاز در ویرایشگر کد Syntax Highlighter است که باعث رنگی شدن قسمت های مختلف کد شما می شود.
برای مثال، کلمات کلیدی با یک رنگ مشخص می شوند یا رشته با یک رنگ دیگر. یکی دیگر از قابلیت های ویرایشگر کد در IDE ها قابلیت Intellisense است. این قابلیت که اصطلاحاً به آن Code Completion هم گفته می شود، بر اساس کاراکترهایی که Type می کنید، به شما پیشنهاد استفاده از کلمات کلیدی یا قابلیت های یک زبان را می دهد.
مورد بعدی که معمولاً در اکثر Source Code Editor ها یافت می شود قابلیت فاصله گذاری یا Indentation است، بوسیله این قابلیت، بین خصوص و قسمت های مختلف کد جهت افزایش خوانایی فاصله گذاری می شود. قابلیت های دیگری نیز می توان برای ویرایشگر کد نام برد، اما اصلی ترین قابلیت ها مواردی بود که ذکر کردم.
زمانی که شما یک برنامه کامپیوتری می نویسید، ممکن است کدهای شما در چندین فایل مختلف نوشته شوند یا از فایل های جانبی در کدهای خود استفاده کنید. پروسه Build عبارت است از عملیات کامپایل کردن کد ها و تبدیل آن ها به زبان ماشین، ایجاد فایل اجرایی از روی کدهای کامپایل شده و اجرای تست هایی که شما برای برنامه های خود می نویسید.
یک توضیح کوتاه در مورد تست بدهیم، تست معمولاً قطعه کدهایی است که برای اطمینان از صحت عملکرد بخشی از کد نوشته می شود. خوب برگردیم به سراغ پروسه Build، یکی از کارهایی که IDE ها برای شما انجام می دهند خودکار سازی این پروسه است. یعنی تجمیع فایل های یک پروژه، کامپایل کردن، اجرای تست ها و ایجاد فایل اجرایی یا اصطلاحاً ایجاد کردن Package برای برنامه.
زمانی که شما به عنوان یک برنامه نویس در حال نوشتن یک برنامه کامپیوتری هستید، به طور حتم با خطاهایی در بخش های مختلف کد برخورد خواهید کرد. به پروسه شناسایی این خطاها و برطرف کردن آن ها Debugging گفته می شود. مثالی می زنیم.
فرض کنید داخل یک IDE برنامه ای نوشتید و قصد دارید برنامه را در حالت آزمایشی که قابلیت خطایابی داشته باشد اجرا کنید، قابلیت Debugger در IDE ها به شما این اجازه را می دهند تا برنامه مورد نظر خود را توسط IDE اجرا کنید، در اینجا IDE پس از اجرای برنامه، یک Link یا ارتباط بین خودش و برنامه در حال اجرا ایجاد می کند که اصطلاحاً می گویند برنامه در حال Debug اجرا شده.
با این کار و در صورت بروز خطایی در برنامه، بلافاصله IDE به کمک برنامه نویس می آید و به او کمک می کند تا راحت تر خطا را شناسایی کرده و آن را برطرف کند. البته غیر از قابلیت اجرا در حالت Debug قابلیت های دیگری نیز در IDE ها برای خطایابی برنامه وجود دارد که در این مبحث نمی توان وارد جزئیات آن ها شد.
موارد بالا، امکانات اولیه ای بود که هر IDE باید از آن ها پشتیبانی کند، اما برخی IDE ها قابلیت های بیشتری را نیز اختیار برنامه نویس قرار می دهند. زبان های برنامه نویسی مختلف از IDE های متفاوتی استفاده می کنند که در زیر به برخی از آن ها اشاره می کنیم:
شما بر اساس زبان برنامه نویسی انتخابی خود، می بایست یک IDE انتخاب کنید تا کار شما به عنوان برنامه نویس راحت تر شود. در قسمت بعدی در مورد قسمت های مختلف تشکیل دهنده یک برنامه کامپیوتری و ساختار اصلی آن ها که تقریباً بین اکثر زبان های برنامه نویسی مشترک است صحبت خواهیم کرد
به آموزش برنامه نویسی خوش اومدید! بله از این لحظه ما شروع به نوشتن کد می کنیم.اول می بایست یک زبان برنامه نویسی را انتخاب کرده و شروع به کار با آن کنیم. از این قسمت آموزش برنامه نویسی به بعد، مواردی که آموزش داده خواهند شد بین اکثر زبان های برنامه نویسی مشترک هستند. اما فقط به توضیحات اکتفا نخواهیم کرد و مباحث مطرح شده را با مثال هایی تکمیل خواهیم کرد. همچنین برای مثال ها تنها به یک زبان برنامه نویسی اکتفا نکرده و سعی می کنیم از چندین زبان برنامه نویسی برای مثال ها استفاده کنیم. زبان های برنامه نویسی که در طول این دوره از آن ها استفاده خواهند شد عبارتند از :
در صورت علاقه به یادگیری یک زبان خاص می توانید از دوره های آموزشی زیر استفاده کنید:
لازم نیست نگران انتخاب چند زبان برنامه نویسی برای مثال ها باشید، به دلیل اینکه تمامی مباحث گفته شده، مباحث مقدماتی برنامه نویسی هستند، مشکلی برای درک کدها وجود نخواهد داشت و بیشتر هدف آشنایی شما با نحوه استفاده از قابلیت های زبان های برنامه نویسی در چند زبان مختلف است و اینکه دستورات در زبان های مختلف چگونه نوشته می شوند. در قسمت قبلی در مورد IDE ها توضیح دادیم و گفتیم که برای نوشتن برنامه های کامپیوتری به یک IDE نیاز دارید. در این قسمت و قبل از شروع کد نویسی می خواهیم در مورد چند مفهوم صحبت کنیم.
در زبان های برنامه نویسی، توابع و متدها قطعاتی از کد هستند که برای انجام یک کار خاص استفاده می شوند. با یک مثال ادامه می دهیم، فرض کنید قصد دارید کاری را شروع کنید، دو راه دارید، یکی اینکه صفر تا صد کار را به تنهایی خودتان انجام دهید و یا اینکه کد را بین اشخاص مختلف تقسیم کنید یا به قول معروف یک تیم تشکیل دهید.
در زبان های برنامه نویسی نیز به همین صورت است، شما می توانید در زبان های برنامه نویسی برای یک کار خاص، تابع یا متد تعریف کنید و در بخش های مختلف از آن استفاده کنید. برای مثال، در قطعه کد زیر که به زبان سی است، یک متد با نام main تعریف شده و در داخل آن پیامی بوسیله دستور printf در خروجی چاپ می شود:
#include<stdio.h> main() { printf("hello tosinso.com"); }
هر تابع یا متد، می تواند یک مقدار بازگشتی داشته باشد، برای مثال عبارت f(x) = 2**x+5 را در نظر بگیرید، تابعی تعریف شده که عددی را به عنوان ورودی می گیرد و حاصل آن را ضربدر 2 کرده، بعلاوه پنج کرده و حاصل را بر میگرداند، در زبان های برنامه نویسی نیز می توان متد یا تابعی نوشت که یک خروجی داشته باشد. پس به طور کلی متدها و توابع به صورت های زیر استفاده می شوند:
هر برنامه کامپیوتری برای اجرا نیاز به یک نقطه شروع دارد. برای مثال، زمانی که شما به یک مجتمع تجاری می رسید، برای ورود به مجتمع می بایست از در ورودی وارد شوید تا بتوانید به مغازه ها سر بزنید و خرید کنید. برنامه های کامپیوتری نیز به همین صورت هستند، زمانی که شما بر روی یک فایل اجرایی دوبار کلیک می کنید.
سیستم عامل به دنبال نقطه شروع برای آن برنامه گشته و از آن نقطه عملیات اجرای برنامه های شما آغاز می شود. هر زبان برنامه نویسی نقطه شروع خاص خودش را دارد، برای مثال، در زبان سی پلاس پلاس و سی شارپ یک متد (در بخش های بالاتر در مورد توابع و متدها توضیح دادیم) وجود دارد به نام Main که برنامه های شما از این قسمت شروع به اجرا می شوند. اگر بخواهیم یک نمای اولیه از نقطه شروع برنامه های سی شارپ را ذکر کنیم، این نقطه شروع به صورت زیر است:
public static void Main() { }
یا برای سی پلاس پلاس به صورت زیر است:
int main() { }
همچنین برای زبان جاوا نیز این نقطه شروع به صورت زیر تعریف می شود:
public static void Main(String [] args) { }
توضیحات یا Comment ها قسمت هایی از برنامه های کامپیوتری هستند که قابلیت اجرا ندارند و تنها در جهت افزودن توضیحات به کدهای برنامه استفاده می شوند. تمامی زبان های برنامه نویسی از قابلیت Comment گذاری پشتیبانی می کنند و شاید اندکی تفاوت در میان آن ها وجود داشته باشد، برای مثال در زبان های سی پلاس پلاس، جاوا و سی شارپ درج نظر به صورت های زیر امکان پذیر است:
// کامنت 1 خطی /* کامنت چند خطی ادامه کامنت چندی خطی */
اما در زبانی مثل python توضیحات یا همان Comment ها بوسیله علامت # مشخص می شوند:
#comment1 #comment2 #comment3
برنامه های کامپیوتری از خطوط و دستورات متفاوتی تشکیل شده اند. به طور کلی می توان Syntax را اینگونه تعریف کرد: «مجموعه ای اصول و قواعد در هر زبان برنامه نویسی که مشخص می کند ترکیب علائم و دستورات به نحوی باشد مبتنی بر ساختار تعریف شده برای آن زبان.» برای مثال، در زبان سی شارپ Syntax ای که برای نمایش یک پیغام در خروجی استفاده می شود به صورت زیر است:
Console.WriteLine("Message");
اما اگر دستور بالا به صورت زیر نوشته شود، Syntax مبتنی بر اصول و قواعدی که برای زبان سی شارپ تعریف شده است نخواهد بود:
Console.WriteLine "Message"
یا برای مثال، در زبان هایی مانند سی شارپ یا سی پلاس پلاس، اکثر دستورات می بایست با علامت Semicolon (;) به پایان برسند، اما در زبانی مانند Visual Basic همچین موضوعی وجود ندارد و این موضوع کاملاً مبتنی بر Syntax آن زبان برنامه نویسی می باشد.
تمام برنامه های کامپیوتری می توانند باعث بوجود آمدن خطا شوند و وظیفه برنامه نویس ها شناسایی و مقابله با این خطاهاست. معنی لغت Bug حشره می باشد و دلیل این انتخاب این نام برای خطاهای کامپیوتری اتفاقی است که در گذشته برای یک کامپیوتر افتاد، حشره ای وارد کامپیوتر شده و باعث اخلال در کار آن شد که از آن به بعد نام Bug برای خطاها ماندگار شد. در برنامه های کامپیوتری خطاها بر دو نوع هستند:
در برخی از زبان های برنامه نویسی، به خطاها اصطلاحاً استثنا یا Exception نیز گفته می شود. پس هر موقع در مطلبی کلمه Exception یا استثناء را دیدید، بدانید که منظور همان خطا یا Bug است.در این قسمت از مطلب با اصطلاحات رایج در زبان های برنامه نویسی آشنا شدیم. در قسمت بعدی در مورد نوع های داده (Data Types) و همچنین بحث متغیرها (Variables) صحبت خواهیم کرد.
در ادامه مطالب آموزش برنامه نویسی به دو موضوع نوع داده (Data Type) و متغیر (Variable) می پردازیم. تمامی برنامه های کامپیوتری بر اساس یکسری داده های ورودی، خروجی تولید می کنند. این داده ها که گفتیم به عنوان ورودی برنامه شناخته می شوند، یک نوع مشخص دارند و باید جهت استفاده در محلی نگهداری شوند.
برای مثال، زمانی که شما قصد جمع کردن دو عدد مانند 2 و 5 را دارید، در حال استفاده از نوع داده اعداد صحیح هستید، یعنی اعداد 2 و 5 از نوع اعداد صحیح هستند، حال وقتی این اعداد به صورت 2.5 و 5.2 باشند، شما از نوع عددی اعشاری استفاده می کنید، یعنی نوع داده مورد استفاده تغییر کرده، یا دفتر تلفنی را فرض کنید که اطلاعات اشخاص در این دفتر تلفن ثبت می شود، شما آیتم های زیر را در این دفتر تلفن ثبت می کنید:
همانطور که مشاهده می کنید چندین فیلد مختلف برای اطلاعات یک شخص در نظر گرفته شده که برای هر یک می توان یک نوع داده در نظر گرفت، برای مثال نوع داده فیلد های نام، نام خانوادگی و آدرس از نوع رشته هستند، اما شماره تماس و سن را می توان از نوع عددی در نظر گرفت.
در حقیقت نوع داده یا Data Type، ماهیت یک مقدار را مشخص می کند. مهمترین دلیل انتخاب نوع داده در زمان نوشتن برنامه های کامپیوتری این است که کامپیوتر بداند زمان انجام عملگر ها بر روی مقادیر چه کاری باید انجام شود. برای مثال، زمانی که شما عملگر + را بین دو عدد استفاده می کنید، حاصل خروجی جمع دو عدد خواهد بود:
5 + 2 = 7
اما زمانی که دو رشته را با یکدیگر جمع می کنید، عملگر جمع دو رشته را به هم متصل می کند:
Hossein + Ahmadi = HosseinAhmadi
در زبان های برنامه نویسی مختلف، بر اساس ماهیت زبان یکسری کلمات کلیدی برای مشخص کردن نوع داده استفاده می شود، اما نه در همه زبان های برنامه نویسی. برای مثال، در زبان سی شارپ، جاوا و سی پلاس پلاس از کلمه کلیدی int برای نوع های عددی صحیح و یا float برای نوع های عددی اعشاری استفاده می شود. همچنین برای رشته ها از string استفاده می شود. در زبان Python نیز نوع های داده مختلفی وجود دارد، مانند اعداد (Numbers)، رشته ها (String)، لیست ها (List) و ...
اما نوع های داده به تنهایی کاربردی ندارند و برای استفاده از آن ها می بایست از متغیرها (Variables) استفاده کرد. متغیرها در حقیقت خانه هایی از حافظه هستند که به آن ها نامی تخصیص داده شده و مقداری داخل آن ها ریخته می شود تا در مواقع نیاز از این مقادیر استفاده کرد.
زمانی که می خواهید در برنامه خود یک متغیر تعریف کنید، باید برای آن یک نوع داده در نظر بگیرید. نوع داده تعیین می کند که متغیر تعریف شده چه مقادیری را می تواند در خود جای دهد. برای مثال، زمانی که شما متغیری از نوع عدد صحیح تعریف می کنید، تنها می توانید داخل آن عدد قرار دهید و امکان قرار دادن رشته داخل آن وجود ندارد.
همانطور که گفتیم، هر متغیر تعدادی از خانه های حافظه را اشغال می کند. مقدار این حافظه کاملاً بستگی به نوع داده مورد استفاده برای آن متغیر دارد. برای مثال در صورت استفاده از متغیر نوع عدد صحیح، میزان حافظه اشغال شده در حافظه 32 بیت خواهد بود. (هر 8 بیت، 1 بایت است). به عنوان مثال، در زبان سی شارپ ما چهار حالت مختلف برای تعریف نوع های عددی صحیح داریم:
میزان عددی که هر یک از متغیرها می توانند در خود نگهداری کنند کاملاً بستگی به میزان حافظه آن ها دارد. برای مثال نوع byte اعداد 0 تا 255 را قبول کرده و short بازه 32768- تا 32767 را به عنوان ورودی قبول می کند. هر چقدر میزان حافظه اشغالی توسط یک نوع داده بیشتر باشد، ظرفیت آن نیز بیشتر خواهد بود.
اما چگونه از متغیرها در برنامه ها استفاده می کنیم؟ هر زبان برنامه نویسی شیوه های مخصوص به خود را برای تعریف و استفاده از متغیر ها دارد. برای مثال، در زبانی مانند سی پلاس پلاس، جاوا یا سی شارپ متغیرها به صورت زیر تعریف می شوند:
int num1; num1 = 12; int num2 = 5;
در کد بالا متغیری تعریف شده با نام num1 و از نوع int که مقدار 12 داخل آن قرار داده شده است و دومی با نام num2 و از نوع int که مقدار 5 داخل آن ریخته شده است. در تعریف دو متغیر بالا، تفاوتی وجود دارد، برای تعریف num1، ابتدا متغیر تعریف شده و در خط دوم مقدار 12 داخل آن ریخته شده است.
عملگری = که در خط دوم مورد استفاده قرار گرفته، اصطلاحاً عملگر انتساب یا Assignment نام دارد که بوسیله آن می توان مقدار یک متغیر را تغییر داد و مقدار جدیدی داخل آن ریخت. اما در خط سوم، در زمان تعریف متغیر num2، مقدار 5 نیز داخل آن ریخته شده که اصطلاحاً به آن مقدار دهی اولیه متغیر یا Variable Initialization گفته می شود.شما می توانید در طول اجرای برنامه با مقادیر متغیرها کار کنید، آن ها را تغییر دهید یا از آن ها برای انجام عملیات های مورد نظر استفاده کنید. کد زیر نحوه استفاده از متغیر num1 که در بالا تعریف شده را نشان می دهد:
int result = num1 + 12;
در کد بالا متغیر جدیدی با نام result تعریف شده و حاصل جمع مقدار num1 بعلاوه 12 داخل آن ریخته شده است.در نمونه کد بالا، همانطور که مشاهده کردید زمان تعریف متغیر می بایست نوع آن را مشخص کنیم، اما برخی زبان ها مانند Python، برای تعریف متغیر نیازی به مشخص کردن نوع آن ندارند و بر اساس مقداری که داخل متغیر ریخته می شود نوع آن مشخص می شود:
a = 10 b = 15 print "Value of a:", a
در کد بالا، همانطور که مشاهده می کنید، برای متغیر a نوعی مشخص نشده، اما بر اساس مقدار آن یعنی 10، نوع عددی برای آن در نظر گرفته می شود.
در انتها چند نکته را در مورد متغیرها در نظر بگیرید:
در این مطلب با مباحث نوع های داده (Data Type) و متغیر ها (Variables) آشنا شدیم. در قسمت بعدی آموزش با مبحث کلمات کلیدی (keywords) در زبان های برنامه نویسی آشنا خواهیم شد.
هر زبانی، چه زبان های برنامه نویسی و چه زبان هایی که در زندگی روزمره انسان ها با آن صحبت می کنند شامل یکسری کلمات و واژه ها است. برای مثال، در زبان فارسی یکسری کلمات وجود دارد که ما انسان ها با کنار هم قرار دادن این کلمات جمله ها را می سازیم.
زبان های برنامه نویسی هم به همین صورت هستند، هر زبان برنامه نویسی شامل یکسری کلمات از پیش تعریف شده است که به آن ها کلمات کلیدی یا Keywords گفته می شود. در قسمت قبلی که در مورد نوع های داده و متغیرها صحبت کردیم با چند کلمه کلیدی آشنا شدیم
کلمات کلیدی مانند int یا string که نشانگر یک نوع داده بودند و برای تعریف متغیرها استفاده می شدند. دلیل اصلی اینکه مبحث مربوط به کلمات کلیدی و الگوریتم ها را اینجا مطرح کردیم این بود که با گفتن مبحث متغیرها، دید اولیه ای در مورد کلمات کلیدی برای شما ایجاد شود.
هر زبان برنامه نویسی کلمات کلیدی منحصر به خودش را دارد، برای مثال در زبانی مثل سی شارپ یا سی پلاس پلاس برای تعریف نوع داده عددی صحیح، از کلمه کلیدی int استفاده می شود، ولی در زبانی مثل Visual Basic از کلمه کلیدی Integer استفاده می کنیم.
تعداد کلمات کلیدی در هر زبان، بستگی به قابلیت های آن زبان دارد، اما معمولاً تعداد این کلمات آن قدر نخواهد بود که مشکلی در به خاطر سپردن همه آن ها داشته باشید. اما تنها به خاطر سپردن کلمات کلیدی کافی نیست، مثل اینکه شما تعداد زیادی از لغات انگلیسی را به همراه معنی بلد باشید
اما ندانید در کجا باید از هر لغت استفاده کنید یا توانایی جمله سازی با کلمات را نداشته باشید. در زبان های برنامه نویسی نیز به همین صورت است، زمانی که شما کلمات کلیدی یک زبان برنامه نویسی را یاد میگیرد، برای مثال، کلمه کلیدی for، باید بدانید که دستور for چگونه استفاده می شود یا اصطلاحاً با syntax آن آشنایی داشته باشید یا زمانی که قصد تعریف متغیری را دارید باید بدانید که کلمه کلیدی int چگونه برای تعریف متغیر استفاده می شود.لیست زیر شامل برخی از کلمات کلیدی تعریف شده در زبان سی شارپ است:
الگوریتم ها، به مجموعه عملیات هایی گفته می شود که به ترتیب انجام می شوند تا به یک خروجی برسیم. یک الگوریتم ترکیبی از کلمات کلیدی و دستورالعمل ها در یک زبان برنامه است که با اجرای قدم به قدم آن ها به یک خروجی مورد نظر می رسیم. برای مثال، فرض کنید می خواهید اعداد فرد بین 1 تا 20 را پیدا کنید، برای اینکار باید یک الگوریتم نوشته و سپس آن را در یک زبان برنامه نویسی پیاده سازی کنید، الگوریتم عملیات پیدا کردن اعداد فرد بین 1 تا 20 را به صورت زیر می نویسیم:
شما می توانید الگوریتم بالا را به صورت دستی و بر روی کاغذ اجرا کنید که اعداد فرد بین 1 تا 20 را در خروجی نمایش می دهد، اما برای اجرای آن توسط یک برنامه کامپیوتری می بایست آن را تبدیل به کد آن زبان کنید تا به خروجی مورد نظر برسید، الگوریتم بالا که به زبان انسان نزدیک بوده و راحت تر قابل درک است، اصطلاحاً Pseudocode نام دارد.
معمولاً بهترین روش برای نوشتن الگوریتم ها در شروع کار، نوشتن الگوریتم به صورت بالا و تبدیل آن به کد زبان برنامه نویسی مورد نظر است. برای مثال در الگوریتم بالا، از ساختار حلقه ها برای تکرار، از شرط ها برای بررسی مقادیر و دستورات خروجی برای نمایش مقادیر استفاده کردیم. به امید خدا در قسمت بعدی در مورد انواع عملگرها در زبان های برنامه نویسی توضیح داده و با کاربرد آن ها بیشتر آشنا خواهیم شد
در بخش های اولیه آموزش برنامه نویسی با مبحث عملگر و عملوند آشنا شدیم. اگر بخواهیم تعریفی از یک عملگر داشته باشیم می توانیم بگوییم عملگر یک نشانه است که بوسیله آن می توان یک عملیات ریاضی یا مقایسه ای یا منطقی را انجام داد و به یک نتیجه خروجی رسید. برای مثال، عبارت زیر را در نظر بگیرید:
2 + 2
در عبارت بالا ما از عملگر + استفاده کردیم برای حساب کردن نتیجه جمع دو عدد 2 و 2 که حاصل این عملگر یا نتیجه نهایی آن عدد 4 می باشد. در عبارت بالا به دو عدد 2 که در دو طرف عملگر + قرار گرفته اند، عملوند می گویند. در این فصل به بررسی انواع عملگرهای ریاضی، عملگرهای رابطه ای و عملگرهای منطقی خواهیم پرداخت و چند مثال نیز از زبان های مختلف ذکر خواهیم کرد.
امروزه برنامه های کامپیوتری به صورت گسترده برای انجام عملیات های ریاضی استفاده می شوند. این برنامه ها می توانند از عملیات های ساده مانند جمع دو عدد تا عملیات های بسیار پیچیده مانند حل معادلات ریاضی را انجام دهند. در مثال زیر دو عملیات ریاضی که یکی خیلی ساده است و یکی دیگر کمی پیچیده است را مشاهده می کنید:
2 + 3 f(x) = x ^ 4 + 2x ^ 3 - 3 * x + 2
در مثال های بالا، عملگرهایی مانند + (جمع)، - (تفریق)، * (ضرل) و ^ (توان) استفاده شده اند. در حالت اول با جمع دو عدد 3 و 2 خروجی 5 برای ما ایجاد شده و در حالت دوم خروجی وابسته به ورودی x می باشد که با جایگذاری آن در عبارت به خروجی مورد نظر می رسیم.زبان های برنامه نویسی از عملگرهای زیادی برای انجام محاسبات ریاضی استفاده می کنند که در زیر برخی از آن ها را بررسی می کنیم:
عملگرهای محاسباتی در زبان های برنامه نویسی، نه تنها بر روی اعداد قابل انجام هستند، بلکه می توان این عملگرها را بر روی متغیرها نیز اعمال کرد. برنامه زیر مثالی را در زبان سی شارپ نشان می دهد:
public static void Main() { int a = 8; int b = 2; Console.WriteLine(a+b); Console.WriteLine(a-b); Console.WriteLine(a/b); Console.WriteLine(a*b); Console.WriteLine(a%b); }
در مثال بالا، به ترتیب اعداد زیر در خروجی نمایش داده می شوند:
10 6 4 16 0
در نظر داشته باشید که برخی از عملگرهای محاسباتی مانند +، زمانی که بین دو رشته استفاده می شوند، عملیات الحاق یا به هم متصل کردن دو رشته را انجام می دهند:
string firstName = "Hossein"; string lastName = "Ahmadi; string result = firstName + " " + lastName; Console.WriteLine(result);
خروجی کد بالا، عبارت Hossein Ahmadi خواهد بود.
از این عملگرها برای انجام مقایسه بین دو مقدار استفاده می شود. بر خلاف خروجی عملگرهای محاسباتی که یک مقدار عددی برگردانده می شود، در عملگرهای رابطه ای بر اساس شرط نوشته شده، یک مقدار boolean برگردانده می شود. مقادیر boolean تنها شامل دو مقدار true یا صحیح و false غلط می باشند. در زبان های برنامه نویسی نوع داده ای وجود دارد به نام boolean که برای نگهداری حاصل یک شرط استفاده می شود. برای مثال، فرض کنید در یک برنامه کامپیوتری دو متغیر به صورت زیر تعریف کردیم:
int a = 10; int b = 20;
مشخص است که عدد a از عدد b کوچکتر است، در زبان های برنامه نویسی مانند جاوا بوسیله کد زیر می توان عملیات مقایسه بین دو عدد بالا را انجام داد:
int a = 10; int b = 20; boolean result = a > b; System.out.println(result);
در خط سوم، به دلیل اینکه عدد a از b کوچکتر است، حاصل شرط مقدار false شده و false در خروجی چاپ می شود. در زیر به بررسی مهمترین عملگرهای رابطه ای در زبان های برنامه نویسی می پردازیم:
البته علگر های رابطه در برخی زبان های برنامه نویسی متفاوت هستند، برای مثال در زبان Visual Basic شما به جای ==، باید = را بنویسید.
عملگرهای منطقی بین دو مقدار boolean قرار میگیرد. برای مثال فرض کنید متغیری داریم با نام a و شرطی داریم که a کوچکتر از 5 باشد یا a بزرگتر از 10 باشد، به کلمه یا در این عبارت دقت کنید، دو شرط گذاشتیم و عبارت یا را در میان آن گذاشتیم، در حقیقت عملگر یا، یک عملگر منطقی است که خودش بین دو عملگر رابطه ای قرار گرفته، اگر بخواهیم در زبان برنامه نویسی مانند سی شارپ این عبارت را بنویسیم به صورت زیر می شود:
int a = 14; boolean result = a < 5 || a > 10
عملگر || که در کد بالا نوشته شده، همان یا در عبارت بالا است که خود این عملگر بر اساس مقادیر سمت راست و چپ یک مقدار boolean بر می گرداند، در زیر مهمترین عملگرهای منطقی را بررسی می کنیم:
|| => عملگر یا true || true = true true || false = true false || true = true false || false = false مثال: int a = 5; a > 5 || a == 5 => true ----------------------------------------------------------------------------- && => عملگر و true && true = true true && false = false false && true = false false && false = false مثال: int a = 5; int b = 4; a > 5 and b <= 3 => false ------------------------------------------------------------------------------ ! => عملگر NOT !(true) = false !(false) = true مثال: int a = 5; !(a==5) // false
در این مطلب با مفهوم عملگر، عملوند و انواع عملگرهای محاسباتی، رابطه ای و منطقی آشنا شدیم. در قسمت بعدی با مفهوم دستورات کنترلی در زبان های برنامه نویسی آشنا خواهیم شد
یکی از قابلیت های بسیار مهم در زبان های برنامه نویسی، افزودن قابلیت تصمیم گیری به برنامه هاست، اینکه برنامه بتواند در شرایط تصمیم گیری کند و روند اجرا را تغییر دهد. البته برنامه های ساده کامپیوتری آنقدر هوشمند نیستند که خود بتوانند تصمیم گیری کنند و این تصمیم گیری از قبل می بایست توسط برنامه نویس در برنامه گنجانده شود. برای مثال، فرض کنید که می خواهیم به دنشجویان بر اساس نمره درسی یک عنوان بدهیم، مانند دانشجوی ممتاز، دانشجوی معمولی و دانشجوی ضعیف. برای اینکار ابتدا الگوریتم زیر را تعریف می کنیم:
اما سوال اصلی اینجاست که چگونه می توان کدی نوشت که روند اجرای برنامه بر اساس مقادیر و ورودی های کاربر تغییر کند. تقریباً تمام زبان های برنامه نویسی از دستورات شرطی برای اینکار استفاده می کنند که این دستورات مبتنی بر دیاگرام زیر کار می کنند:
به عنوان مثال، الگوریتمی که بالا در مورد آن صحبت کردیم را به صورت زیر می توان در زبان سی نوشت:
#include <stdio.h> main() { int mark = 17; if(mark > = 18) { printf("Great"); } if(mark >= 10 && mark <= 17) { printf("Average"); } if(mark < 10) { printf("Poor"); } }
با اجرای کد بالا، عبارت Average در خروجی چاپ خواهد شد.همانطور که مشاهده می کنید، در کد بالا از کلمه کلیدی if که یکی از دستورات شرطی در زبان سی است استفاده شده. به عبارت های مقابل دستور if که داخل پرانتز نوشته شده اند دقت کنید. ما قبلاً با این عبارات آشنا شدیم، عملگرهای رابطه ای که امکان مقایسه بین دو مقدار را به ما می داند.
دستورات شرطی بر اساس نتیجه عبارت داخل پرانتز روند اجرای برنامه را تغییر می دهند، یعنی اگر نتیجه عبارت true باشد، شرط برقرار بوده و کد مربوطه اجرا می شود، در غیر اینصورت خیر. در ادامه مطلب به بررسی معروف ترین دستورات شرطی می پردازیم.
در بالا مثال ساده ای از دستور if را بررسی کردیم. دستور if بر اساس شرطی که برایش مشخص می شود تصمیم میگیرد که کدی اجرا شود یا خیر. ساختار دستور if در زبان های سی، جاوا و سی شارپ یکسان است:
if(شرط) { // دستوراتی که در صورت صحیح بودن شرط اجرا خواهند شد } else { // دستوراتی که در صورت برقرار نبودن هیچ از شرط ها اجرا خواهند شد }
دیاگرام کلی دستور if را می توانید در تصویر زیر مشاهده کنید:
در ساختار if..else، در صورت برقرار بودن شرط کد بدنه if و در غیر اینصورت کدی که برای قسمت else نوشته شده اجرا خواهد شد. مثال زیر ساختار دستور if..else را در سی شارپ نشان می دهد:
int number = 12; if(number > 15) { Console.WriteLine("Number is greather than 15."); } else { Console.WriteLine("Number is lower than 15."); }
در کد بالا، در صورتی که مقدار number بیشتر از 15 باشد کد بدنه if و در غیر اینصورت کد بدنه else اجرا خواهد شد. در زبان های سی، جاوا و سی شارپ نکات زیر را زمان کار با دستور if در نظر بگیرید:
علاوه بر دستور else در ساختار if، می توان از دستور else if نیز استفاده کرد. else if در حقیقت برای قسمت else یک شرط مجدد تعیین می کند که اگر قسمت شرط if صحیح نبود، در غیر اینصورت اگر شرط جدید برقرار بود کاری را انجام بده:
if(شرط) { // دستوراتی که در صورت صحیح بودن شرط اجرا خواهند شد } else if (شرط) { // دستوراتی که در صورت صحیح بودن شرط اجرا خواهند شد } else if (شرط) { // دستوراتی که در صورت صحیح بودن شرط اجرا خواهند شد } else { // دستوراتی که در صورت صحیح بودن شرط اجرا خواهند شد }
یک ساختار if می تواند n قسمت else if داشته باشد، اما تنها یک قسمت else می توان برای دستور if نوشت. مثالی از ساختار if..else if..else در زبان سی:
#include <stdio.h> main() { int x = 19; if( x > 17) { printf( "Great"); }else if( x < 10) { printf( "Poor"); }else if( x <= 17 && x >= 10 ) { printf( "Average"); } }
یکی دیگر از ساختار های موجود در زبان های برنامه نویسی برای ایجاد شرط، استفاده از ساختار switch می باشد. بر خلاف دستور if که بوسیله یک شرط می توان روند اجرای کد را مدیریت کرد، در ساختار switch، با مشخص کردن یک متغیر و مقادیر مختلف می توان روند اجرای کد را تغییر را داد. در زیر ساختار کلی این دستور را مشاهده می کنید:
switch(عبارت){ case [مقدار]: // کدها break; case [مقدار]: // کدها break; . . . . default : // کدها }
عبارت که در داخل پرانتز و در مقابل دستور switch نوشته شده است، باید نام متغیری نوشته شود که مقدار آن، با مقدار نوشته شده در مقابل دستورات case مقایسه می شود و در صورت یکسان بودن مقدار، کدهای مربوط به case مربوطه اجرا خواهد شد.
همانطور که مشاهده می کنید، در ساختار بالا تمامی قسمت های مربوط به case، با کلمه کلیدی break به پایان رسیده اند، نوشتن break برای case ها در ساختار switch الزامی است تا بوسیله آن انتهای هر case مشخص شود. همچنین قسمتی داریم با نام default، این قسمت در صورتی اجرا می شود که هیچ یک از case ها اجرا نشوند، یعنی شرط هیچ یک از case ها برقرار نشود. دیاگرام دستور switch به صورت زیر است:
در کد زیر، ساختار switch در کد سی مشاهده می کنید:
#include <stdio.h> main() { int x = 2; switch( x ){ case 1 : printf( "One\n"); break; case 2 : printf( "Two\n"); break; case 3 : printf( "Three\n"); break; case 4 : printf( "Four\n"); break; default : printf( "None of the above...\n"); } }
در کد بالا، عبارت Two در خروجی چاپ می شود، زیر مقدار x برابر 2 است و case مربوط به مقدار 2 اجرا خواهد شد.
همانطور که در بالا اشاره کردیم، ساختار های if و switch در زبان های سی، جاوا و سی شارپ یکسان هستند، اما زبان هایی نیز هستند که ساختار تعریف شده خودشان را دارند، مانند زبان python. در زبان python دستور if به صورت زیر نوشته می شود:
x = 45 if x > 17: print "Great!" elif x < 10: print "Poor" elif x <= 17 and x >= 10: print "Average"
در کد بالا، برای دستور if پرانتزی نوشته می شود، همچنین علامت های {} وجود ندارند و به جای دستور else if، از دستور elif استفاده می شود. زبان های دیگری نیز مانند Visual Basic هستند که ساختار تعریف شده خود را برای شرط ها دارند. در قسمت بعدی این سری آموزشی، با بحث تکرار و حلقه ها در زبان های برنامه نویسی صحبت خواهیم کرد.
خیلی اوقات پیش می آید که می خواهیم در یک برنامه، قطعه ای از کد به تعداد دفعات مشخص اجرا شود. برای مثال، فرض کنید می خواهیم در زبان سی عبارت Hello ITPro.ir را پنج بار در خروجی نمایش دهیم. کد زیر اینکار را برای ما انجام می دهد:
#include <stdio.h> main() { printf( "Hello ITPro.ir!\n"); printf( "Hello ITPro.ir!\n"); printf( "Hello ITPro.ir!\n"); printf( "Hello ITPro.ir!\n"); printf( "Hello ITPro.ir!\n"); }
کار خیلی ساده است و کافیست دستور printf که در زبان سی برای چاپ عبارتی در خروجی انجام می شود را پنج بار پشت سر هم به صورت بالا فراخوانی کنیم. اما فرض کنید بخواهیم صد بار این کار انجام شود! مطمئناً نوشتن صدر بار دستور printf کار سختی است و البته صحیح هم نمی باشد.
راهکار مناسب در این مواقع استفاده از حلقه ها و دستورات تکرار در زبان های برنامه نویسی است. تقریباً تمامی زبان های برنامه نویسی از قابلیت حلقه ها پشتیبانی می کنند که به اجازه اجرای بخشی از کد را به تعداد مشخص به برنامه نویس می دهد.
نحوه نوشتن حلقه ها در هر زبان برنامه نویسی متفاوت است، اما خوشبخانه زبان های جاوا، سی و سی شارپ به دلیل اینکه ریشه در زبان سی دارند از ساختار یکسان و مشابهی استفاده می کنند. برای شروع، کدی که در بالا نوشتیم را می خواهیم با کمک حلقه در زبان سی پیاده سازی کنیم:
#include <stdio.h> main() { int i = 0; while ( i < 5 ) { printf( "Hello ITPro.ir!\n"); i = i + 1; } }
در کد بالا، از حلقه while برای تکرار دستور printf استفاده کردیم. دستوراتی که در بین {} بعد از دستور while قرار میگیرند، در واقع همان دستوراتی هستند که باید تکرار شوند. در ادامه همین مطلب با انواع حلقه ها آشنا خواهیم شد، اما در ابتدا دیاگیرام زیر نمای کلی از ساختار حلقه ها که در بین کلیه زبان های برنامه نویسی مشترک است را نشان می دهد:
در ادامه به بررسی انواع حلقه ها خواهیم پرداخت.
ساختار کلی این حلقه که بین زبان های مبتنی بر سی مشترک است به صورت زیر است:
while(شرط) { // دستورات برای تکرار }
دیاگرام زیر، ساختار دستور while را نشان می دهد:
در مورد ساختار دستور while به نکات زیر توجه کنید:
در حلقه while، شرط اجرای حلقه قبل از رسیدن به دستورات بررسی می شد، اما در ساختار do..while شرط در انتهای حلقه بررسی می شود، به همین خاطر و بر خلاف دستور while، دستورات حلقه حداقل یکبار اجرا می شوند. در زیر ساختار کلی حلقه doo.while را مشاهده می کنید:
do { // دستورات برای تکرار } while(شرط)
در تصویر زیر، دیاگرام و ساختار دستور do..while را مشاهده می کنید:
کدی که در ابتدای این مطلب نوشتیم را با ساختار do.while مجدد بازنویسی می کنیم:
#include <stdio.h> main() { int i = 0; do { printf( "Hello ITPro.ir!\n"); i = i + 1; }while ( i < 5 ); }
زمانی که دستور break داخل یک حلقه قرار میگیرد، به محض اینکه به این دستور برسیم، روند اجرای حلقه متوقف شده و از حلقه خارج خواهیم شد و روند اجرا بعد از حلقه ادامه پیدا می کند. نحوه نوشتن دستور break به صورت زیر است:
break;
در تصویر زیر، دیاگرام و نحوه کاربرد دستور break را مشاهده می کنید:
در کد زیر، زمانی که مقدار متغیر i به عدد 3 برسد، روند اجرای حلقه متوقف شده و ادامه اجرای برنامه پس از حلقه ادامه خواهد یافت:
#include <stdio.h> main() { int i = 0; do { printf( "Hello ITPro.ir!\n"); i = i + 1; if( i == 3 ) { break; } }while ( i < 5 ); }
دقت کنید که کاربرد دستور break در حلقه ها با کاربرد آن در ساختار switch که در قسمت قبلی در مورد آن صحبت کردیم متفاوت است.
زمانی که دستور continute داخل یک حلقه نوشته می شود، زمان رسیدن به این دستور، اجرای جاری حلقه متوقف شده و تکرار بعدی شروع می شود، برای مثال اگر در تکرار دوم یک حلقه باشیم و به دستور continute برسیم، روند اجرا برای تکرار دوم متوقف شده و تکرار سوم شروع خواهد شد. نحوه استفاده از دستور continute به صورت زیر است:
continute;
دیاگرام زیر ساختار کلی این دستور را زمان استفاده در حلقه ها نمایش می دهد:
در کد زیر، زمانی که مقدار i برابر سه باشد یک واحد به متغیر i اضافه شده و ادامه حلقه اجرا نمی شود و به ابتدای حلقه منتقل می شویم:
#include <stdio.h> main() { int i = 0; do { if( i == 3 ) { i = i + 1; continue; } printf( "Hello ITPro.ir!\n"); i = i + 1; }while ( i < 5 ); }
دستور for نیز یکی دیگر از دستوراتی است که برای ایجاد تکرار در کدها استفاده می شود. ساختار کلی دستور for به صورت زیر است:
for(init; condition; increment) { }
همانطور که مشاهده می کنید این حلقه با کلمه کلیدی for آغاز شده و داخل پرانتز و مقابل کلمه کلیدی for سه بخش داریم که با کاراکتر ; از هم جدا شده اند. در زیر به تعریف هر یک از این بخش ها می پردازیم:
در تصویر زیر دیاگرام کلی ساختار دستور for را مشاهده می کنید:
کد زیر مثالی از کاربرد دستور for در زبان سی است:
#include <stdio.h> int main () { int a; for( a = 10; a < 20; a = a + 1 ){ printf( "Hello ITPro.ir!\n"); } return 0; }
دستورات break و continute دقیقاً همان کاربردهای ذکر شده را در ساختار حلقه for دارند.همانطور که در ابتدای این مطلب گفتیم، ساختار دستور تکرار و حلقه ها در زبان های سی، سی شارپ و جاوا مشترک است، مثال زیر کد بالا را در زبان سی شارپ نشان می دهد:
public static void Main () { int a; for( a = 10; a < 20; a = a + 1 ){ System.Console.WriteLine( "Hello ITPro.ir!\n"); } }
در برخی زبان های برنامه نویسی مانند Python، شیوه نوشتن حلقه با زبان هایی مانند سی متفاوت است و این زبان ها ساختار مجزایی را تعریف می کنند. برای مثال، کد زیر ساختار حلقه while را در زبان python نشان می دهد:
i = 0 while (i < 5): print "Hello ITPro.ir!" i = i + 1
در زبان python دستورات break و continute دقیقاً همان کاربرد ذکر شده در زبان های سی، سی شارپ و جاوا را دارند.در این قسمت با مبحث حلقه ها در زبان های برنامه نویسی آشنا شدیم، در قسمت بعدی در مورد اعداد و کاراکترها صحبت خواهیم کرد.
تا اینجا تقریباً با مفاهیم اولیه یک زبان برنامه نویسی آشنا شدیم و یاد گرفتیم که چگونه می توان در یک برنامه روند اجرا را کنترل کرد یا بوسیله حلقه ها بخشی از کد را به صورت تکرار شونده نوشت. در این قسمت در مورد آرایه ها، شیوه ذخیره آرایه ها در حافظه، اعداد و همچنین مفهوم کاراکتر صحبت می کنیم.
اگر به خاطر داشته باشید گفتیم که متغیر خانه ای از حافظه است که می تواند مقداری را داخل خود نگهداری کند. اما یک متغیر تنها می تواند یک مقدار را در خود نگهداری کند. شرایطی را در نظر بگیرید که می خواهیم 5 مقدار عددی را نگه داشته و عملیاتی را بر روی آن ها انجام دهیم. شاید فکر کنید که باید 5 متغیر به صورت زیر تعریف کرده و مقادیر را داخل آن ها قرار دهیم:
int n1 = 10; int n2 = 21; int n3 = 5; int n4 = 8; int n5 = 2;
کد بالا بدون مشکل کار می کند، حال اگر بخواهیم 100 عدد را جایی نگه داری کنیم باید 100 متغیر تعریف کنیم؟ صد در صد اینکار اصولی نیست و باید راهکار دیگری استفاده شود. برای این شرایط راهکاری که می توان استفاده کرد آرایه ها هستند. آرایه در حقیقت دنباله ای از خانه های حافظه هستند که می توانند هیچ تا چندین مقدار را داخل خود نگهداری کنند. برای مثال، در زبان سی پلاس پلاس اگر بخواهیم آرایه ای 10 خانه ای تعریف کنیم به صورت زیر عمل می کنیم:
int numbers[10];
اما در زبانی مانند سی شارپ تعریف آرایه ای 10 خانه ای از نوع int به صورت زیر انجام می شود:
int[] numbers = new int[10];
همچنین در زبان python می توان به صورت زیر لیستی از اعداد را ایجاد کرد:
numbers=[2,7,4,1,2,6,8]
تمامی متغیرهایی که در بالا تعریف کردیم از نوع آرایه هستند، یعنی مجموعه ای از خانه های حافظه که می توانند چندین مقدار را در خود نگهداری کنند. تصویر زیر نمایی از یک آرایه را حافظه را نشان می دهد:
همانطور که مشاهده می کنید هر خانه آرایه دارای یک مقدار است، عددی که در بالای هر خانه نوشته شده اندیس مربوط به آن خانه است. ما برای دسترسی به خانه های آرایه ها از اندیس ها استفاده می کنیم. اندیس خانه ها در آرایه ها از عدد صفر شروع می شود. برای مثال، در آرایه ای که 5 خانه دارد، اندیس آرایه از خانه 0 شروع شده و به خانه 4 ختم می شود که معادل 5 خانه می شود. در مثال زیر مقدار خانه 3 را می خواهیم در خروجی چاپ کنیم. کد مثال در زبان سی پلاس پلاس است:
#include <stdio.h> #include <iostream> void main() { int numbers[5]; numbers[0] = 1; numbers[1] = 3; numbers[2] = 2; numbers[3] = 6; numbers[4] = 4; std::cout << numbers[2]; }
یکی از قابلیت هایی که در زبان هایی مانند سی پلاس پلاس یا سی شارپ و جاوا وجود دارد، قابلیت مقدار دهی اولیه آرایه ها است، برای مقدار دهی اولیه آرایه در زبان سی پلاس پلاس به صورت عمل می کنیم:
int numbes[5] = { 1, 3, 2, 6, 4 };
کد بالا دقیقاً آرایه ای که در مثال قبلی ایجاد کرده بودیم را ایجاد می کند، با این تفاوت که آرایه مقدار دهی اولیه شده است. مانند متغیرهایی که مقدار دهی اولیه می شوند. کد بالا را می توان به صورت زیر نیز نوشت:
int numbes[] = { 1, 3, 2, 6, 4 };
در کد بالا دیگر تعداد خانه های آرایه را مشخص نکردیم، زیرا بر اساس مقادیر اولیه آرایه تعداد خانه ها مشخص شده است.
در قسمت های قبلی آموزش در مورد رشته صحبت کردیم و گفتیم که چگونه می توان در زبان های برنامه نویسی متغیرهایی از نوع رشته تعریف کرد. اما نکته ای که باید بدانید این است که رشته ها در حقیقت آرایه ای از کاراکترها هستند. در مثال زیر متغیری از نوع کاراکتر تعریف شده است:
char ch = 'h';
تفاوت کاراکتر و رشته در این است که برای تعریف رشته باید از " استفاده کنیم، اما برای کاراکتر ها از ' استفاده می شود:
char ch = 'h'; std::string str = "Hello"; printf("%c", str[1]);
در مثال بالا، کاراکتر e در خروجی نمایش داده می شود که این موضوع نشان دهنده آن است که رشته Hello در حقیقت آرایه ای از کاراکترها است. هر رشته می تواند از هر کاراکتری ایجاد شده باشد، اعداد، نشان ها، حروف الفبا و ...، اما برخی از کاراکترها معانی خاصی دارند، به مثال زیر دقت کنید:
std::string str = "FirstName\tLastName";
به کاراکتر t\\ دقت کنید، این کاراکتر در حقیقت می گوید که در جایی که این آیتم قرار گرفته باید یک tab یا 4 فاصله خالی قرار بگیرد. کاراکترهایی که در ابتدای آن ها علامت \\ قرار گرفته اصطلاحاً Escape Character نام دارند که در زیر با برخی از آن ها آشنا می شویم:
\t => درج 4 فاصله \b => درج backspace \n => درج خط جدید در رشته \r => انتقال مکان نما به ابتدای خط جاری \' => در علامت ' در رشته \" => درج علامت " در رشته \\ => درج \ در رشته
در این قسمت با مبحث آرایه ها و همچنین کاراکترها که آرایه از آن ها تشکیل یک رشته را می دهد آشنا شدیم. در قسمت بعدی که آخرین بخش مبحث آموزش برنامه نویسی به زبان ساده است، به بررسی مفهوم توابع خواهیم پرداخت.
این بخش از آموزش برنامه نویسی، آخرین بخش از این سری آموزشی می باشد. در این بخش به بررسی مفهوم توابع در زبان های برنامه نویسی می پردازیم. در زبان های برنامه نویسی، توابع قطعاتی از کد هستند که بوسیله یک نام در قسمت های مختلف برنامه قابل دسترس بوده و می توان آن ها را فراخوانی کرد. در مثال هایی که برای زبان سی زدیم با تابع printf آشنا شدیم. این تابع رشته ای را به عنوان ورودی گرفته و در خروجی آن را نمایش می دهد:
printf("Welcome to ITPro.ir");
دقت کنید که امکان فراخوانی تابع printf در هر قسمت از برنامه وجود دارد. در ادامه به بررسی شیوه های مختلف تعریف توابع خواهیم پرداخت.
در ابتدا نحوه تعریف توابع را در زبان سی بررسی می کنیم. فرض کنید قصد داریم تابعی تعریف کنیم که یک پیغام خوش آمد گویی را در صفحه نمایش می دهد:
#include <stdio.h> void DisplayWelcome() { printf("Welcome to ITPro.ir"); } void main() { DisplayWelcome(); }
در کد بالا تابعی با نام DisplayWelcome تعریف شده که پیغام Welcome to ITPro.ir را در خروجی نمایش می دهد. به صورت کلی ساختار تعریف یک تابع به صورت زیر است:
[return-type] (Name)({parameters}) { [method-body] }
در مثال زیر نحوه تعریف توابع را زبان سی شارپ مشاهده می کنید:
public class Program { public static void Main() { DisplayWelcome(); } public static void DisplayWelcome() { Console.WriteLine("Welcome to ITPro.ir"); } }
زبان سی شارپ به دلیل آنکه ریشه در زبان سی دارد شیوه تعریف توابع در آن ها تقریباً یکسان است. همانطور که در کدهای بالا مشاهده کردید، برای فراخوانی یک تابع کافیست نام تابع را نوشته و در مقابل نام آن، علامت () را بنویسیم. اگر تابع ما دارای پارامتر ورودی باشد داخل پرانتز باید مقادیر مربوط به پارامترها را بنویسیم.
همانطور که گفتیم می توان در زبان های برنامه نویسی توابعی نوشت که پارامترهایی را به عنوان ورودی قبول می کنند. برای مثال، در کد زیر تابعی نوشتیم که دو عدد را به عنوان ورودی گرفته و حاصل جمع آن ها را در خروجی چاپ می کند:
#include <stdio.h> void DisplaySum(int n1, int n2) { printf("%d", n1 + n2); } void main() { DisplaySum(2, 6); }
در تابع بالا و برای تابع DisplaySum در پارامتر ورودی مشخص کردیم، یکی n1 که از نوه int است و دیگری n2 از نوع int. برای تعریف پارامتر نوع داده پارامتر و سپس نام آن را می نویسیم. دقت کنید که یک متد می تواند چندین پارامتر داشته باشد که پارامترها را بوسیله , از هم جدا می کنیم. زمانی که قصد فراخوانی یک متد را داریم
در داخل () به ترتیب و بر اساس پارامترهای تعریف شده مقادیر را مشخص می کنیم. در مثال بالا به ترتیب عدد 2 برای n1 و عدد 6 برای n2 در نظر گرفته می شود، یعنی این مقادیر داخل پارامترها قرار گرفته و در بدنه تابع می توان از آن ها استفاده کرد. کد بالا عدد 8 که حاصل جمع 2 و 6 است را در خروجی چاپ می کند.
علاوه بر مشخص کردن پارامترهای ورودی برای توابع، می توان برای آن ها مقادیر بازگشتی نیز مشخص کرد، یعنی تابع مقداری را به عنوان خروجی بر میگرداند. برای مثال، فرض کنید می خواهیم تابعی بنویسیم که دو عدد را به عنوان ورودی قبول کرده و حاصل جمع آن ها را به عنوان خروجی برگرداند:
#include <stdio.h> int Sum(int n1, int n2) { return n1 + n2; } void main() { int result = Sum(2, 6); printf("%d", result); }
همانطور که مشاهده می کنید در زمان تعریف تابع Sum، به جای کلمه کلیدی void، کلمه کلیدی int نوشته شده است، یعنی تابع مقداری از نوع int را بر میگرداند. تمامی توابعی که نوع بازگشتی دارند باید در قسمتی از بدنه تابع بوسیله دستور return مقداری باز گردانده شود.
کلمه کلیدی return باعث اتمام روند اجرای تابع شده و مقداری که در جلوی آن نوشته شده را به عنوان خروجی بر میگرداند که در مثال بالا حاصل جمع مقادیر 2 و 6 به عنوان خروجی از متد بازگردانده می شود. در حقیقت مقداری که به عنوان خروجی از متد بازگردانده می شود جایگزین عبارت فراخوانی متد شده و کد اجرا می شود. به کد زیر دقت کنید:
#include <stdio.h> int Sum(int n1, int n2) { return n1 + n2; } void main() { int result = Sum(2, 6) + 5; printf("%d", result); }
در مثال بالا، ابتدا تابع Sum با مقادیر 2 و 6 فراخوانی شده، سپس نتیجه آن که عدد 6 است با عدد 5 جمع شده و حاصل آن در متغیر result ریخته می شود.خیلی از زبان های برنامه نویسی شیوه های متفاوتی برای تعریف توابع دارند، برای مثال در زبان python برای تعریف توابع به صورت عمل می کنیم:
def function_name(parameters) [function_body] return [expression]
بر اساس قالب بالا، به صورت زیر می توان در زبان پایتون یک تابع تعریف و از آن استفاده کرد:
def getMax(list) max = list[0] index = 1 while( index < 5 ) if(max < list[index]) max = list[index] index = index + 1 return max list1 = [2, 5, 6,1 ,3, 9, 7] max = getMax(list1) print "Max: ", max
این قسمت آخرین مطلب از سری آموزش برنامه نویسی به زبان ساده بود. امیدوارم که مطلب آموزش برنامه نویسی که مطالعه کردید مورد استفاده دوستانی که قصد ورود به دنیای برنامه نویسی را دارند قرار گرفته باشد.
بنیانگذار توسینسو و برنامه نویس و توسعه دهنده ارشد وب
حسین احمدی ، بنیانگذار TOSINSO ، توسعه دهنده وب و برنامه نویس ، بیش از 12 سال سابقه فعالیت حرفه ای در سطح کلان ، مشاور ، مدیر پروژه و مدرس نهادهای مالی و اعتباری ، تخصص در پلتفرم دات نت و زبان سی شارپ ، طراحی و توسعه وب ، امنیت نرم افزار ، تحلیل سیستم های اطلاعاتی و داده کاوی ...
زمان پاسخ گویی روز های شنبه الی چهارشنبه ساعت 9 الی 18
فقط به موضوعات مربوط به محصولات آموزشی و فروش پاسخ داده می شود