رفتن به مطلب
برنامه نویسی من

Mostafa

مدیر سایت
  • تعداد ارسال ها

    2,699
  • تاریخ عضویت

  • آخرین بازدید

  • روز های برد

    10

آخرین بار برد Mostafa در 15 دی

Mostafa یکی از رکورد داران بیشترین تعداد پسند مطالب است !

اعتبار در سایت

12 Good

1 دنبال کننده

درباره Mostafa

آخرین بازدید کنندگان نمایه

887 بازدید کننده نمایه
  1. Mostafa

    لایسنس رایگان آنتی ویروس Kaspersky

    در این موضوع می توانید لایسنس های رایگان آنتی ویروس کاسپر اسکی را با دوستان خود به اشتراک بگذارید. تاریخ بروز رسانی لایسنس ها : ۱۳۹۹/۱۰/29 Kaspersky Antivirus 30 days: YZWEN-98MCX-Z9FV1-9TUSW BKEM2-5FKHA-EP2U8-1EZ5M KIS Android 45 days: JAPXZ-9G9EJ-CSUV2-7YQUS
  2. اکسل به عنوان یک ابزار محاسباتی، قادر است به کمک توابعی که در آن قرار دارد، کار نوشتن پیچیده ترین فرمول ها را ساده کند. آگاهی از این قدرت مخفی اکسل، در وقت و هزینه بسیار صرفه جویی خواهد کرد. فهرست سردرس های مطرح شده در این دوره آموزش، در ادامه آمده اند: درس یکم: ورود و ویرایش فرمول ورود و ویرایش فرمول اولویت های محاسباتی خطاهای محاسباتی فرمول های دو بعدی و سه بعدی و چهار بعدی استفاده از آدرس مطلق و نسبی و ترکیبی نام‌ گذاری و فواید استفاده از آن فرمول های برداری و کاربردهای آن درس دوم: توابع در اکسل معرفی انواع توابع در اکسل شیوه های مختلف ورود تابع استفاده از نوار فرمول استفاده از کادر Formula ترکیب فرمول و تابع چند تابع‌ پرکاربرد (ریاضی و آماری) تابع جمع (Sum) میانگین (Average-Averagea) حداکثر(Maxa-Max) حداقل (Mina-Min) شمارش (Count-Countblank-Counta) تابع گرد کردن (Round-Roundup-Rounddown-Celling-Floor) تابع تو در تو (Round , Sum و یا Round , PI) تابع شرطی IF, And,Or درس سوم: توابع خاص توابع مرتبط با متن Left-Right-Mid-Len-Substitute توابع مرتبط با تاریخ Now-Today-Day-Month-Year-Hour-Minute-Second-Weekday توابع مرتبط با جمع‌ بندی و شمارش شرطی Countifs-Sumifs-Averageifs-Dsum-Dcount-Daverage توابع جستجو و مرجع Vlookup-Hlookup-lookup-match-index توابع محاسبات مالی PMT-PPMT-IPMT-PV-NperFV-Rate-SLN-DB-DDB دانلود دوره آموزشی در کانال تلگرام
  3. Mostafa

    دانلود دوره آموزشی Adobe Lightroom

    بی راه نگفته ایم اگر بگوییم، ابزار Adobe Photoshop Lightroom بسیاری از عکاسان جدید را سردرگم می کند. احتمالاً پیش خود می پرسید که این اپلیکیشن نام فوتوشاپ را یدک می کشد اما در حقیقت نرم افزاری با قابلیت های فوتوشاپ نیست. به طور کلی باید بگوییم که Lightroom اپلیکیشنی مهم برای عکاسان است. لایت روم هم اکنون روی پلتفرم های ویندوز، مک، اندروید و iOS (هرچند نسخه ی دیوایس های همراه آن چنان قوی نیستند) به عنوان یک برنامه ی مستقل با قیمتی معادل 149 دلار در دسترس است. همچنین قادر هستید این نرم افزار را تحت برنامه ی Creative Cloud Photography Plan شرکت ادوبی با هزینه ی ماهانه 9.99 دلار تهیه نمایید. لایت روم از تصاویر شما فهرست های مختلف می سازد اولین و مهم ترین چیزی که باید در مورد این ابزار بدانید این است که لایت روم برای هر عکسی که می گیرید یک فهرست (کاتالوگ) به حساب می آید. لایت روم شباهت کمی به فوتوشاپ داشته و بیشتر مشابه Picasa یا Apple Photos عمل می کند و برای عکاسان حرفه ای و یا آماتورهایی که به صورت جدی به دنبال این حرفه هستند، ساخته شده است. ابزار شرکت ادوبی برای کمک به وارد کردن، پردازش، بررسی و ذخیره ی ده ها هزار عکس طراحی شده است. هر زمان که عکس جدیدی ثبت کردید، به راحتی آن را از داخل دوربین و یا کارت SD وارد فهرست لایت روم خود کنید. این تصاویر به صورت طبیعی روی هارد دیسک تان ذخیره می شوند و می توانید از طریق برنامه های دیگر نیز به آن ها دسترسی داشته باشید. در حالی که مشغول وارد کردن عکس ها هستید، قادر خواهید بود کلمات کلیدی، عنوان، شرح تصاویر، نام مدل و دیگر اطلاعات مورد نیاز را به این تصاویر اضافه کنید. پس از آن که عکس هایتان را با موفقیت وارد این نرم افزار کردید، لایت روم مرور تصاویر و انتخاب بهترین عکس های ثبت شده را برای شما ساده تر می کند. در ادامه قادر هستید، عکس های قابل قبول و یا رد شده را علامت بزنید و به آن ها امتیاز دهید. پس از آن نیز می توانید به فیلتر کردن این تصاویر به وسیله امتیاز و یا فرا داده دیگر بپردازید. این به شما کمک می کند تا به عنوان مثال با استفاده از فیلترهای 5 ستاره و سال 2016 بهترین تصاویری که طی سال گذشته به ثبت رسانده اید را ببینید. لایت روم از ابزار قدرتمند فهرست نویسی برخوردار است؛ این در حالی است که اپلیکیشن های دیگر مثل Picasa یا Apple Photos تنها به ذخیره کردن تصاویر می پردازند و گزینه های زیادی را برای ذخیره سازی، دسته بندی و پیدا کردن عکس های دلخواه در اختیار شما قرار نمی دهند. برای مثال در Apple Photos تنها می توانید تصاویر مورد علاقه ی خود را مشخص کنید و هیچ راهی برای امتیاز دادن به آن ها و یا علامت گذاری موارد رد شده وجود ندارد. اگر عکس های زیادی می گیرید، لایت روم ابزار مناسبی برای پیگیری آن ها محسوب می شود. و ..... دانلود دوره آموزشی در کانال تلگرام
  4. منظور از چکیده‌سازی داده فراهم کردن حداقل اطلاعات برای دنیای خارج و مخفی‌سازی جزئیات پس زمینه است، یعنی اطلاعات مورد نیاز بدون ارائه جزئیات نمایش داده می‌شود. چکیده‌سازی داده یک تکنیک برنامه‌نویسی و طراحی است که مبتنی بر جداسازی رابط میانجی (interface) از پیاده‌سازی (implementation) می‌باشد. اجازه دهید با یک مثال از زندگی واقعی ادامه دهیم، یک تلویزیون را تصور کنید که می‌توان آن را روشن یا خاموش کرد، کانال را عوض کرد، صدا را تنظیم کرده و اجزای خارجی مانند بلندگو، VCR و پخش کننده DVD را به آن متصل کرد، اما شما از جزئیات درونی آن هیچ اطلاعی ندارید، یعنی اطلاع ندارید که چگونه سیگنال‌ها را از کابل یا هوا دریافت کرده، چگونه این سیگنال‌ها را منتقل می‌کند و در نهایت بر روی صفحه نمایش می‌دهد. بنابراین، می‌توان گفت که تلویزیون به وضوح پیاده‌سازی داخلی‌اش را از رابط خروجی‌اش جدا کرده و شما قادر هستید از رابط آن مانند دکمه روش/خاموش، عوض کردن کانال و کنترل صدا، بدون هیچ دانشی از جزئیات درونی‌اش استفاده کنید. در ++C، کلاس‌ها سطح بالایی از چکیده‌سازی داده را فراهم می‌کنند. این کلاس‌ها توابع عمومی‌ کافی را برای دنیای خارج از خود فراهم کرده تا قابلیت‌های اشیا نمایان شده و امکان دستکاری داده‌های شی مثل وضعیت (state)، بدون اطلاع از نحوه‌ی پیاده‌سازی درونی کلاس فراهم گردد. برای مثال، برنامه شما می‌تواند برای مرتب‌سازی، تابع ()sort را بدون اطلاع از الگوریتم به کار رفته در آن فراخوانی کند. در حقیقت، پیاده‌سازی پشت پرده این تابع مرتب‌ساز، با انتشار نسخه‌های کتابخانه آن ممکن است تغییر کند، اما تا زمانی‌که رابط آن ثابت بماند، فراخوانی تابع شما کماکان کار می‌کند. در ++C از کلاس‌ها برای تعریف چکیده‌سازی نوع داده (Abstract Data Type- ADT) استفاده می‌شود. می‌توان از شی cout از کلاس ostream برای استریم کردن داده به خروجی استاندارد استفاده کرد، مانند مثال زیر: #include <iostream> using namespace std; int main() { cout << "Hello C++" <<endl; return ; } در اینجا، نیازی نیست که بدانید cout چگونه متن را روی صفحه نمایش نشان می‌دهد. تنها چیزی که باید بدانید رابط عمومی ‌آن است و بنابراین هیچ محدودتی برای تغییر در پیاده‌سازی پشت پرده cout بوجود نمی‌آید. برچسب‌های دسترسی (Access Label) منجر به چکیده‌سازی می‌شود در ++C، با استفاده از برچسب‌های دسترسی برای یک کلاس رابط چکیده تعریف می‌کنیم. یک کلاس می‌تواند تعدادی برچسب دسترسی داشته باشد یا هیچ برچسبی نداشته باشد. اعضای تعریف شده در یک کلاس با برچسب عمومی ‌از همه بخش‌های برنامه قابل دسترسی هستند. نمای چکیده شده یک نوع داده از طریق اعضای عمومی‌اش تعریف می‌شود. اعضای تعریف شده در یک کلاس با برچسب خصوصی، برای کدهای استفاده کننده قابل دسترسی نیستند. بخش‌های خصوصی کلاس، پیاده‌سازی آن را از دید کاربران مخفی می‌کند. هیچ محدودیتی بر تعداد استفاده از یک برچسب دسترسی وجود ندارد. هر برچسب دسترسی، سطح دسترسی عضو تعریف شده را مشخص می‌کند.سطح دسترسی تعیین شده، تا زمان نوشتن برچسب دسترسی بعدی یا رسیدن به آکلاد بسته، معتبر باقی می‌ماند. مزایای چکیده‌سازی داده چکیده‌سازی داده دو مزیت مهم مهیا می‌سازد. بخش‌های درونی کلاس را از اشتباهات سهوی کاربر، که منجر به خراب کردن وضعیت شی شود در امان نگه می‌دارد. پیاده‌سازی تابع در طول زمان و در پاسخ به مقتضیات یا گزارش خرابی‌ها ممکن است تکامل پیدا کند. با تعریف داده‌های عضو در بخش‌های خصوصی کلاس، نویسنده کلاس برای تغییر در داده‌ها آزادی عمل پیدا می‌کند. اگر پیاده‌سازی تغییر کند، برای مشاهده تاثیرات این تغییر، تنها کافی است که کد کلاس آزمایش شود. اگر داده‌ها عمومی‌ باشند، آنگاه ممکن است هر تابعی که مستقیماً به این داده‌های عضو دسترسی دارد نیز از کار بیفتد. مثال چکیده‌سازی داده هر برنامه ++Cای که یک کلاس را با اعضای خصوصی و عمومی ‌پیاده‌سازی کند، نمونه ای از چکیده‌سازی داده می‌باشد. مثال زیر را ملاحظه کنید. #include <iostream> using namespace std; class Adder { public: // constructor Adder(int i = ) { total = i; } // interface to outside world void addNum(int number) { total += number; } // interface to outside world int getTotal() { return total; }; private: // hidden data from outside world int total; }; int main() { Adder a; a.addNum(10); a.addNum(20); a.addNum(30); cout << "Total " << a.getTotal() <<endl; return ; } با اجرای کد فوق، خروجی زیر حاصل می‌شود. Total 60 کلاس بالا دو عدد را باهم جمع کرده و حاصل جمع را برمی‌گرداند. اعضای عمومی، addNum و getTotal رابط‌های میانجی به دنیای خارج از کلاس بوده و کاربر برای استفاده از کلاس باید با آنها آشنا شود. عضو خصوصی total چیزی است که کاربر نیازی به آشنایی با آن ندارد، اما برای عملکرد صحیح کلاس ضروری است. استراتژی طراحی چکیده‌سازی کد را به دو بخش پیاده‌سازی و رابط تقسیم می‌کند. بنابراین هنگام طراحی اجزا، باید رابط را از پیاده‌سازی مستقل نگه دارید تا اگر تغییری در پیاده‌سازی ایجاد شد، رابط کماکان سالم باقی ماند. در چنین شرایطی، برنامه‌هایی که از رابط استفاده می‌کنند متاثر از تغییر نخواهند شد و تنها نیازمند یک کامپایل مجدد هستند.
  5. Mostafa

    آموزش واسط ها در C++

    یک اینترفیس (interface) رفتار یا قابلیت‌های یک کلاس ++C را بدون درنظرگرفتن هیچ نوع پیاده‌سازی برای آن توصیف می‌کند. اینترفیس‌های ++C با استفاده از کلاس‌های انتزاعی (abstract class) پیاده می‌شوند. این کلاس‌های انتزاعی را نباید با مفهوم ‌چکیده‌سازی که برای جداسازی جزئیات پیاده‌سازی از داده‌ها به کار رفت اشتباه بگیریم. یک کلاس را می‌توان با اعلان حداقل یک تابع مجازی محض در آن، انتزاعی کرد. یک تابع مجازی با قرادادن «0=» در هنگام اعلان آن مشخص می‌شود. class Box { public: // pure virtual function virtual double getVolume() = 0; private: double length; // Length of a box double breadth; // Breadth of a box double height; // Height of a box }; هدف از ایجاد کلاس انتزاعی (معمولاً با ABC مشخص می‌شود)، ایجاد یک کلاس پایه مناسب است تا دیگر کلاس‌ها از آن ارث ببرند. نمی‌توان از کلاس‌های انتزاعی شی نمونه گرفت و تنها به عنوان اینترفیس عمل می‌کنند. تلاش برای گرفتن یک شی نمونه از یک کلاس انتزاعی به خطای کامپایل منجر می‌شود. بنابراین، اگر قرار باشد که از زیرکلاس یک کلاس ABC نمونه گرفته شود، آن زیرکلاس باید همه توابع مجازی را پیاده‌سازی کند، یعنی باید اینترفیس ABC را اجرا کند. اگر یک کلاس مشتق شده در روند رونویسی (override) تابع مجازی محض با مشکل مواجه شود، آنگاه هرگونه نمونه‌گیری شی از آن به خطای کامپایل منجر می‌شود. کلاس‌هایی که بتوان از آنها نمونه‌گیری انجام داد کلاس‌های عینی (concrete class) نامیده می‌شوند. مثال‌هایی از تابع انتزاعی در مثال زیر کلاس والد، یک اینترفیس برای کلاس پایه فراهم کرده تا تابعی به نام ()getArea را پیاده کند. #include <iostream> using namespace std; // Base class class Shape { public: // pure virtual function providing interface framework. virtual int getArea() = ; void setWidth(int w) { width = w; } void setHeight(int h) { height = h; } protected: int width; int height; }; // Derived classes class Rectangle: public Shape { public: int getArea() { return (width * height); } }; class Triangle: public Shape { public: int getArea() { return (width * height)/2; } }; int main(void) { Rectangle Rect; Triangle Tri; Rect.setWidth(5); Rect.setHeight(7); // Print the area of the object. cout << "Total Rectangle area: " << Rect.getArea() << endl; Tri.setWidth(5); Tri.setHeight(7); // Print the area of the object. cout << "Total Triangle area: " << Tri.getArea() << endl; return ; } با اجرای کد فوق، خروجی زیر حاصل می‌شود. Total Rectangle area: 35 Total Triangle area: 17 می‌توان مشاهده کرد که چگونه یک کلاس انتزاعی اینترفیسی در قالب ()getArea تعریف کرده و دو کلاس دیگر همان تابع را با الگوریتم‌های متفاوت پیاده سازی می‌کنند. استراتژی طراحی یک سیستم مبتنی بر شی‌گرایی، می‌تواند یک کلاس پایه انتزاعی را به عنوان یک اینترفیس استاندارد مشترک برای همه اپلیکیشن‌های خارجی به کار بندد. سپس با ارث‌بری از این کلاس پایه انتزاعی، کلاس‌های مشتق شده‌ای پدید می‌آید که مشابه هم عمل می‌کنند. قابلیت‌های (یعنی توابع عمومی) فراهم آمده از طریق این اپلیکیشن‌های خارجی، همان توابع مجازی محض موجود در کلاس پایه انتزاعی می‌باشند. پیاده‌سازی این توابع محض در هرکلاس مشتق شده، بسته به نوع اپلیکیشن می‌تواند متفاوت باشد. این نوع معماری همچنین امکان اضافه کردن اپلیکیشن‌های جدید به سیستم، حتی پس از تعریف آن را به سهولت فراهم ساخته است.
  6. یک مثال برای شروع فرض کنید روی یک بازی (جنگی) کار می‌کنیم. کلاس Weapon را ایجاد می‌کنیم و دو کلاس Bomb و Gun را از آن مشتق می‌کنیم تا ویژگی‌های این سلاح‌ها را در آن‌ها بارگذاری کنیم: #include <iostream> using namespace std; class Weapon { public: void loadFeatures() { cout << "Loading weapon features.\n"; } }; class Bomb : public Weapon { public: void loadFeatures() { cout << "Loading bomb features.\n"; } }; class Gun : public Weapon { public: void loadFeatures() { cout << "Loading gun features.\n"; } }; int main() { Weapon *w = new Weapon; Bomb *b = new Bomb; Gun *g = new Gun; w->loadFeatures(); b->loadFeatures(); g->loadFeatures(); return 0; } خروجی Loading weapon features. Loading bomb features. Loading gun features. سه شیء اشاره‌گر به نام‌های w ،b و g را به ترتیب برای کلاس‌های Weapon ،Bomb و Gun تعریف می‌کنیم. همچنین تابع عضو ()loadFeatures را برای هر شیء با استفاده از کدهای زیر فراخوانی می‌کنیم: w->loadFeatures(); b->loadFeatures(); g->loadFeatures(); تا این جا همه چیز به خوبی کار می‌کند، با این حال پروژه بازی ما رفته‌رفته بزرگ‌تر می‌شود و تصمیم می‌گیریم کلاس مجزای Loader را برای بارگذاری ویژگی‌های سلاح‌ها ایجاد کنیم. این کلاس Loader ویژگی‌های دیگری از سلاح‌ها را بسته به نوع سلاح انتخابی بارگذاری می‌کند. class Loader { public: void loadFeatures(Weapon *weapon) { weapon->features(); } }; ()loadFeatures ویژگی یک سلاح خاص را بارگذاری می‌کند. پیاده‌سازی کلاس Loader #include <iostream> using namespace std; class Weapon { public: Weapon() { cout << "Loading weapon features.\n"; } void features() { cout << "Loading weapon features.\n"; } }; class Bomb : public Weapon { public: void features() { this->Weapon::features(); cout << "Loading bomb features.\n"; } }; class Gun : public Weapon { public: void features() { this->Weapon::features(); cout << "Loading gun features.\n"; } }; class Loader { public: void loadFeatures(Weapon *weapon) { weapon->features(); } }; int main() { Loader *l = new Loader; Weapon *w; Bomb b; Gun g; w = &b; l->loadFeatures(w); w = &g; l->loadFeatures(w); return 0; } خروجی Loading weapon features. Loading weapon features. Loading weapon features. Loading weapon features. پیاده‌سازی ما درست به نظر می‌رسد؛ اما ویژگی‌های سلاح‌ها 4 بار بارگذاری شده است. دلیل این مسئله آن است که در ابتدا شیء سلاح w به شیء کلاس b (یا Bomb) اشاره می‌کرد و تلاش کرده‌ایم ویژگی‌های شیء Bomb را با ارسال آن به تابع ()loadFeatures با استفاده از شیء اشاره‌گر l (کلاس Loader) بارگذاری کنیم. به طور مشابه تلاش کرده‌ایم ویژگی‌های شیء Gun را نیز بارگذاری کنیم، اما تابع ()loadFeatures کلاس Loader اشاره‌گر به شیء کلاس Weapon را به عنوان آرگومان می‌گیرد: void loadFeatures(Weapon *weapon) به همین جهت است که ویژگی‌های weapon 4 بار بارگذاری می‌شوند. برای حل این مشکل باید تابعی از کلاس مبنا (کلاس Weapon) به صورت مجازی با استفاده از کلیدواژه virtual بسازیم. class Weapon { public: virtual void features() { cout << "Loading weapon features.\n"; } }; مثال: استفاده از تابع مجازی برای حل مشکل #include <iostream> using namespace std; class Weapon { public: virtual void features() { cout << "Loading weapon features.\n"; } }; class Bomb : public Weapon { public: void features() { this->Weapon::features(); cout << "Loading bomb features.\n"; } }; class Gun : public Weapon { public: void features() { this->Weapon::features(); cout << "Loading gun features.\n"; } }; class Loader { public: void loadFeatures(Weapon *weapon) { weapon->features(); } }; int main() { Loader *l = new Loader; Weapon *w; Bomb b; Gun g; w = &b; l->loadFeatures(w); w = &g; l->loadFeatures(w); return 0; } خروجی Loading weapon features. Loading bomb features. Loading weapon features. Loading gun features. همچنین توجه کنید که تابع l->loadFeatures(w) تابع کلاس‌های مختلفی را بسته به این که شیء l به چه چیزی اشاره می‌کند فرامی‌خواند. استفاده از تابع مجازی نه‌تنها موجب شده کد ما روشن‌تر شود، بلکه انعطاف‌پذیری آن را نیز افزایش داده است. در برنامه فوق، ویژگی‌های سلاح دو بار پرینت شده‌اند. با افزودن کد بیشتر می‌توانید کاری کنید که ویژگی‌های سلاح تنها یک بار بارگذاری شود. اگر بخواهیم سلاح دیگری (مانند چاقو) اضافه می‌کنیم می‌توانیم به سادگی ویژگی‌های آن را به صورت زیر اضافه کرده و بارگذاری کنیم. class Knife : public Weapon { public: void features() { this->Weapon::features(); cout << "Loading knife features.\n"; } }; و در تابع ()main به صورت زیر عمل می‌کنیم: Knife k; w = &k; l->loadFeatures(w); لازم به ذکر است که ما برای بارگذاری ویژگی‌های چاقو، هیچ چیز را در کلاس Loader تغییر نداده‌ایم. کلاس مجرد در ++C و تابع مجازی خالص هدف برنامه‌نویسی شیءگرا، تقسیم کردن یک مسئله پیچیده به مجموعه‌های کوچک‌تر است. بدین ترتیب می‌توانیم مسئله را به روشی بهینه درک کرده و حل کنیم. برخی اوقات استفاده از وراثت صرفاً به منظور بصری‌سازی بهتر مسئله مفید خواهد بود. در ++C می‌توان یک کلاس مجرد ایجاد کرد که امکان وهله‌سازی از آن وجود نداشته باشد، یعنی نمی‌توان شیئی از روی این کلاس مجرد ساخت. با این حال می‌توان از آن کلاس دیگری مشتق کرد و شیئی را از آن کلاس مشتق شده وهله‌سازی نمود. کلاس‌های مجرد کلاس‌های مبنایی هستند که وهله‌سازی نمی‌شوند. یک کلاس شامل تابع مجازی خالص به نام کلاس مجرد نامیده می‌شود. تابع مجازی خالص یک تابع مجازی که اعلان آن با =0 پایان یابد یک تابع مجازی خالص است. به مثال زیر توجه کنید: class Weapon { public: virtual void features() = 0; }; در این کد تابع مجازی به صورت زیر است: virtual void features() = 0 و کلاس Weapon یک کلاس مجرد است. مثال: کلاس مجرد و تابع مجازی خالص #include <iostream> using namespace std; // Abstract class class Shape { protected: float l; public: void getData() { cin >> l; } // virtual Function virtual float calculateArea() = 0; }; class Square : public Shape { public: float calculateArea() { return l*l; } }; class Circle : public Shape { public: float calculateArea() { return 3.14*l*l; } }; int main() { Square s; Circle c; cout << "Enter length to calculate the area of a square: "; s.getData(); cout<<"Area of square: " << s.calculateArea(); cout<<"\nEnter radius to calculate the area of a circle: "; c.getData(); cout << "Area of circle: " << c.calculateArea(); return 0; } خروجی Enter length to calculate the area of a square: 4 Area of square: 16 Enter radius to calculate the area of a circle: 5 Area of circle: 78.5 در این برنامه، تابع مجازی خالص زیر درون کلاس Shape تعریف شده است: virtual float area() = 0; یک نکته که باید اشاره کنیم این است که تابع مجازی خالص کلاس مبنا باید در کلاس مشتق شده باطل (Override) شود. اگر این کار صورت نگیرد، کلاس مشتق شده خود به یک کلاس مجرد تبدیل می‌شود. برای مطالعه بخش بعدی روی لینک زیر کلیک کنید:
  7. Mostafa

    آموزش Function Overriding در C++

    در ابتدای این آموزش به توضیح Overriding می‌پردازیم سپس شرایط پیاده سازی Function Overriding در سی پلاس پلاس را بیان کرده، در پایان جلسه نیز یک مثال را پیاده سازی می‌کنیم. Function Overriding در سی پلاس پلاس در یک کلاس اگر یک تابع همنام تابعی که در کلاس پدر خود وجود دارد،بنویسیم به آن override میگویند. به زبان دیگر اگر کلاس فرزند تابعی را پیاده سازی کند که به نوعی در کلاس پدر وجود داشته است، overriding در سی پلاس پلاس انجام داده ایم. شروط overriding به ترتیب زیر است: نام توابع یکسان باشد ورودی و خروجی توابع یکسان باشد توابع override شده حتما باید در دو کلاس متفاوت باشند و بین کلاس ها رابطه ارث بری وجود دارد. مثال Function Overriding در سی پلاس پلاس کلاسی به نام Parent داریم و کلاس دیگری به نام Child ساخته‌ایم به صورتی که Child از Parent ارث‌بری کند. کد این مثال به صورت زیر می‌باشد: // Base class class Parent { public: void print() { cout << "The Parent print function was called" << endl; } }; // Derived class class Child : public Parent { public: // definition of a member function already present in Parent void print() { cout << "The child print function was called" << endl; } <div style="clear:both; margin-top:0em; margin-bottom:1em;"><a href="[Hidden Content]" target="_blank" rel="nofollow" class="u6d856ee28e00bf9b93f69b378d085de0"><!-- INLINE RELATED POSTS 1/3 //--><style> .u6d856ee28e00bf9b93f69b378d085de0 { padding:0px; margin: 0; padding-top:1em!important; padding-bottom:1em!important; width:100%; display: block; font-weight:bold; background-color:#e6e6e6; border:0!important; border-left:4px solid #E67E22!important; text-decoration:none; } .u6d856ee28e00bf9b93f69b378d085de0:active, .u6d856ee28e00bf9b93f69b378d085de0:hover { opacity: 1; transition: opacity 250ms; webkit-transition: opacity 250ms; text-decoration:none; } .u6d856ee28e00bf9b93f69b378d085de0 { transition: background-color 250ms; webkit-transition: background-color 250ms; opacity: 1; transition: opacity 250ms; webkit-transition: opacity 250ms; } .u6d856ee28e00bf9b93f69b378d085de0 .ctaText { font-weight:bold; color:#2980B9; text-decoration:none; font-size: 16px; } .u6d856ee28e00bf9b93f69b378d085de0 .postTitle { color:inherit; text-decoration: underline!important; font-size: 16px; } .u6d856ee28e00bf9b93f69b378d085de0:hover .postTitle { text-decoration: underline!important; } </style><div style="padding-left:1em; padding-right:1em;"><span class="ctaText">بیشتر بخوانید:</span> <span class="postTitle">لیست پیوندی در سی پلاس پلاس (LinkedList)</span></div></a></div> }; //main function int main() { //object of parent class Parent obj1; //object of child class Child obj2 = Child(); // obj1 will call the print function in Parent obj1.print(); // obj2 will override the print function in Parent // and call the print function in Child obj2.print(); return 0; } همانطور که در کد بالا می‌بینید تابعی به نام Print هم در کلاس Parent و هم در کلاس Child آمده است. به عبارت دیگر تابع Print در کلاس فرزند Override شده است. در تابع Main هر دو کلاس را ساخته و نحوه دسترسی به هر تابع را نشان داده‌ایم. خروجی کد بالا به صورت زیر می‌باشد: The Parent print function was called The child print function was called
  8. Mostafa

    آموزش Overloading عملگر و تابع در ++C

    ++C به شما اجازه می‌دهد تا در یک دامنه مشخص، بیش از یک تعریف برای یک تابع یا یک عملگر مشخص کنید، که به ترتیب اضافه بار تابع (function overloading) و اضافه بار عملگر (operator oveloading) نامیده می‌شود. یک اعلان اورلود شده، اعلانی است که دارای نام و دامنه یکسانی با یک اعلان پیشین است، با این تفاوت که آرگومان‌های متفاوت و طبیعتاً تعریف متفاوتی از اعلان قبلی خواهد داشت. هنگام تعریف یک تابع یا عملگر اورلود شده، کامپایلر نوع آرگومان‌هایی که در فراخوانی تابع یا عملگر استفاده کرده‌اید را با نوع پارامترهای تعیین شده در تعریف مقایسه کرده و مناسب‌ترین تعریف را انتخاب می‌کند. فرآیند انتخاب مناسب‌ترین تابع یا عملگر اورلود شده overload resolution خوانده می‌شود. اورلود تابع در ++C می‌توان برای یک نام تابع در یک دامنه مشخص، چندین تعریف ارائه کرد. تعاریف تابع باید از حیث نوع/تعداد آرگومان‌ها متفاوت باشند. نمی‌توان تابع اورلود شده‌ای اعلان کرد که تنها از لحاظ نوع داده برگشتی متفاوت باشد. مثال زیر تابع ()print را برای چاپ نوع داده‌های متفاوت به کار می‌برد. #include <iostream> using namespace std; class printData { public: void print(int i) { cout << "Printing int: " << i << endl; } void print(double f) { cout << "Printing float: " << f << endl; } void print(char* c) { cout << "Printing character: " << c << endl; } }; int main(void) { printData pd; // Call print to print integer pd.print(5); // Call print to print float pd.print(500.263); // Call print to print character pd.print("Hello C++"); return ; } با اجرای برنامه فوق، خروجی زیر تولید می‌شود. Printing int: 5 Printing float: 500.263 Printing character: Hello C++ اورلود عملگرها در ++C می‌توان عملگرهای درونی ++C را نیز اورلود یا بازتعریف کرد. بنابراین، یک برنامه‌نویس می‌تواند عملگرها را برای نوع داده‌های تعریف شده توسط کاربر نیز به کار گیرد. عملگرهای اورلود شده توابعی با نام ویژه هستند: کلیدواژه «operator» و به دنبال آن علامت عملگر تعریف شونده. مانند هر تابع دیگری، عملگر اورلودشده یک نوع داده بازگشتی و یک لیست پارامتر دارد. Box operator+(const Box&); عبارت فوق عملگر جمع را برای اضافه کردن دو شی Box و بازگرداندن Box حاصله به کار می‌گیرد. اکثر عملگرهای اورلود شده را می‌توان به عنوان توابع غیرعضو معمولی و یا توابع عضو کلاس تعریف کرد. در حالتی که این توابع را به عنوان توابع غیرعضو یک کلاس تعریف کنیم، مجبور خواهیم بود که برای هر عملوند، دو آرگومان به صورت زیر ارسال کنیم. Box operator+(const Box&, const Box&); مثال زیر مفهوم اورلود عملگر را با استفاده از یک تابع عضو نشان می‌دهد. در اینجا یک شی به صورت آرگومان به تابع ارسال می‌شود و خصوصیات آن از طریق نام آرگومان قابل دسترسی هستند، اما برای دسترسی به خصوصیات شی که عملگر را فراخوانی می‌کند از کلیدواژه this استفاده می‌شود. #include <iostream> using namespace std; class Box { public: double getVolume(void) { return length * breadth * height; } void setLength( double len ) { length = len; } void setBreadth( double bre ) { breadth = bre; } void setHeight( double hei ) { height = hei; } // Overload + operator to add two Box objects. Box operator+(const Box& b) { Box box; box.length = this->length + b.length; box.breadth = this->breadth + b.breadth; box.height = this->height + b.height; return box; } private: double length; // Length of a box double breadth; // Breadth of a box double height; // Height of a box }; // Main function for the program int main() { Box Box1; // Declare Box1 of type Box Box Box2; // Declare Box2 of type Box Box Box3; // Declare Box3 of type Box double volume = 0.0; // Store the volume of a box here // box 1 specification Box1.setLength(6.0); Box1.setBreadth(7.0); Box1.setHeight(5.0); // box 2 specification Box2.setLength(12.0); Box2.setBreadth(13.0); Box2.setHeight(10.0); // volume of box 1 volume = Box1.getVolume(); cout << "Volume of Box1 : " << volume <<endl; // volume of box 2 volume = Box2.getVolume(); cout << "Volume of Box2 : " << volume <<endl; // Add two object as follows: Box3 = Box1 + Box2; // volume of box 3 volume = Box3.getVolume(); cout << "Volume of Box3 : " << volume <<endl; return ; } با اجرای این کد، خروجی زیر حاصل می‌گردد. Volume of Box1 : 210 Volume of Box2 : 1560 Volume of Box3 : 5400 عملگرهایی با قابلیت اورلود و عملگرهایی بدون قابلیت اورلود در زیر لیست عملگرهایی که قابلیت اورلود دارند آمده است. + – * / % ^ & | ~ ! , = > < <= >= ++ — >> << == != && || =+ -= /= %= ^= &= |= *= <<= >>= [] () -> ->* new new [] delete delete [] و در زیر نیز لیست عملگرهایی که قابلیت اورلود ندارند گردآوری شده است. :: .* . ?: مثال‌هایی از اورلود عملگرها در زیر مثال‌های متنوعی آمده که به فهم بهتر مفهوم کمک می‌کند. ردیف عملگرها و مثال‌ها 1 اورلود عملگرهای یگانی 2 اورلود عملگرهای باینری 3 اورلود عملگرهای رابطه‌ای 4 اورلود عملگرهای ورودی/خروجی 5 اورلود عملگرهای ++ و – – 6 اورلود عملگرهای تخصیص 7 اورلود عملگر فراخوانی تابع () 8 اورلود عملگر []Subscripting 9 -> اورلود عملگر دسترسی عضو
  9. یک موضوع مهم در برنامه نویسی Polymorphism است و در این جلسه ما به بررسی چندریختی یا Polymorphism در ++C خواهیم پرداخت. واژه چندریختی به معنی داشتن چندین صورت است. معمولاً، چندریختی در شرایطی اتفاق می‌افتد که زنجیره‌ای از کلاس‌ها از طریق وراثت به هم مربوط شده‌اند. چندریختی در ++C یعنی اینکه فراخوانی یک تابع عضو، بسته به نوع شی فراخواننده آن، می‌تواند منجر به اجرای توابع مختلفی شود. مثال زیر را درنظر بگیرید که در آن دو کلاس از یک کلاس پایه مشتق شده‌اند. #include <iostream> using namespace std; class Shape { protected: int width, height; public: Shape( int a = , int b = ){ width = a; height = b; } int area() { cout << "Parent class area :" <<endl; return ; } }; class Rectangle: public Shape { public: Rectangle( int a = , int b = ):Shape(a, b) { } int area () { cout << "Rectangle class area :" <<endl; return (width * height); } }; class Triangle: public Shape { public: Triangle( int a = , int b = ):Shape(a, b) { } int area () { cout << "Triangle class area :" <<endl; return (width * height / 2); } }; // Main function for the program int main() { Shape *shape; Rectangle rec(10,7); Triangle tri(10,5); // store the address of Rectangle shape = &rec; // call rectangle area. shape->area(); // store the address of Triangle shape = &tri; // call triangle area. shape->area(); return ; } با اجرای این کد، خروجی زیر نتیجه می‌شود. Parent class area : Parent class area : علت این خروجی نادرست این است که برای فراخوانی تابع ()area، کامپایلر از ابتدا نسخه تابع در کلاس پایه را انتخاب کرده است. به این حالت وضوح ایستا (static resolution)، فراخوانی تابع یا اتصال ایستا (static linkage) گفته می‌شود، تابع پیش از فراخوانی قطعی (fixed) شده است. به این حالت همچنین اتصال اولیه (early binding) نیز گفته می‌شود زیرا تابع ()area در زمان کامپایل برنامه تعیین شده است. اما حالا، اجازه دهید یک تغییر کوچک در برنامه ایجاد کرده و پیش از اعلان تابع ()area در کلاس Shape کلیدواژه virtual را قرار دهیم. class Shape { protected: int width, height; public: Shape( int a = 0, int b = 0) { width = a; height = b; } virtual int area() { cout << "Parent class area :" <<endl; return 0; } }; بعد از اعمال این تغییر جزئی و اجرای کد، خروجی زیر حاصل می‌شود. Rectangle class area Triangle class area این‌بار، کامپایلر به جای نوع اشاره‌گر به محتوای آن نگاه می‌کند. بنابراین، از آنجایی که آدرس اشیا کلاس‌های tri و rec در shape* ذخیره می‌شود، تابع ()area مربوطه فراخوانی می‌شود. همانطور که می‌بینید، هر کدام از کلاس‌های فرزند (child class) پیاده‌سازی خاص خود را برای تابع ()area دارند. این شکل عمومی ‌کاربرد چندریختی است. شما چند کلاس مختلف با یک تابع با نام و پارامترهای یکسان، اما پیاده‌سازی‌های متفاوت خواهید داشت. تابع مجازی (Virtual Function) یک تابع مجازی (Virtual) تابعی از کلاس پایه است که با کلیدواژه virtual اعلان می‌شود. وجود یک تابع مجازی در کلاس پایه و یک نسخه متفاوت از آن در کلاس مشتق شده، به کامپایلر این نشانی را می‌دهد که برای این تابع از اتصال ایستا استفاده نکند. آنچه مطلوب ماست انتخاب تابع در هر نقطه از برنامه، براساس نوع شی فراخوانده شده است. به این عملیات اتصال دینامیک (dynamic linkage) یا اتصال متاخر (late binding) گفته می‌شود. توابع مجازی محض (Pure Virtual Functions) می‌توان یک تابع مجازی در کلاس پایه را به گونه‌ای تعریف کرد که در خود کلاس پایه هیچ تعریف معنا‌داری نداشته باشد اما در توابع مشتق شده قابل تعریف مجدد باشد. تابع مجازی ()area را در کلاس پایه به صورت زیر تغییر می‌دهیم. class Shape { protected: int width, height; public: Shape(int a = 0, int b = 0) { width = a; height = b; } // pure virtual function virtual int area() = 0; }; عبارت 0 = به کامپایلر اعلام می‌کند که این تابع هیچ بدنه‌ای ندارد. این تابع، تابع مجازی محض (pure virtual function) نامیده می‌شود.
  10. Mostafa

    آموزش متد zfill در پایتون

    متد zfill رشته را در سمت چپ با 0 رقم پر می کند تا رشته ای به تعداد طول برسد. این یک رشته شامل یک پیشوند علامت + یا - قبل از 0 رقم است. اگر طول کمتر از طول رشته باشد رشته اصلی را برمی گرداند. مثال : # Python zfill(width) method # Declaring variables text = "Zfill Example" # Calling Function str2 = text.zfill(20) # Displaying result print(str2) Output: 0000000Zfill Example ******************************************** # Python zfill(width) method # Declaring variables text = "Zfill Example" # Calling Function str2 = text.zfill(5) # Displaying result print(str2) Output: Zfill Example
  11. Mostafa

    آموزش متد upper در پایتون

    متد upper تمام کاراکترها را به بزرگ تبدیل کرده و یک رشته بزرگ را برمی گرداند. مثال : # Python upper() method # Declaring table and variables str = "Hello mypgr" # Calling function str2 = str.upper() # Displaying result print(str2) Output: HELLO MYPGR
  12. Mostafa

    آموزش متد translate در پایتون

    متد Python رشته ای را ترجمه می کند که در آن هر کاراکتر از طریق جدول ترجمه داده شده نقشه برداری شده است. ما می توانیم از روش maketrans () برای ایجاد نقشه ترجمه از نگاشت های شخصیت به شخصیت در قالب های مختلف استفاده کنیم. مثال : # Python translate() method # Declaring table and variables table = { 97 : 103, 111 : 112, 117 : None } str = "Hello java" # Calling function str2 = str.translate(table) # Displaying result print(str2) Output: Hellp jgvg
  13. Mostafa

    آموزش متد swapcase در پایتون

    متد swapcase حروف کوچک رشته ها را از بزرگ به کوچک و بالعکس تبدیل می کند. به پارامتری نیاز ندارد و یک رشته را پس از تبدیل مورد برمی گرداند. مثال : # Python String swapcase() method # Declaring variable str = "HELLO MYPGR" # Calling function str2 = str.swapcase() # Displaying result print (str2) Output: hello mypgr
  14. Mostafa

    آموزش متد startswith در پایتون

    پایتون با شروع رشته True یا False را برمی گرداند. اگر رشته با پیشوند شروع شود ، در غیر این صورت False باز می گردد. شروع و پایان دو پارامتر طول می کشد. Start یک شاخص شروع از جایی است که جستجو شروع می شود و index end جایی است که جستجو متوقف می شود. مثال : # Python String startswith() method # Declaring variable str = "Hello Mypgr" # Calling function str2 = str.startswith("Hello") # Displaying result print (str2) Output: True ********************************************************* # Python String startswith() method # Declaring variable str = "Hello Mypgr" # Calling function str2 = str.startswith("Java") # False # Displaying result print (str2) Output: False
  15. Mostafa

    آموزش متد split در پایتون

    متد split رشته را به لیست جدا شده با کاما تقسیم می کند. این رشته را بر اساس جداکننده جداکننده جدا می کند. این روش دو پارامتر می گیرد و هر دو اختیاری هستند. در زیر توضیح داده شده است. مثال : # Python split() method example # Variable declaration str = "Java is a programming language" # Calling function str2 = str.split() # Displaying result print(str) print(str2) Output: Java is a programming language ['Java', 'is', 'a', 'programming', 'language'] ************************************************************** # Python split() method example # Variable declaration str = "Java is a programming language" # Calling function str2 = str.split('Java') # Displaying result print(str2)3 Output: ['', ' is a programming language'] ************************************************************** # Python split() method example # Variable declaration str = "Java is a programming language" # Calling function str2 = str.split('a') # Displaying result print(str) print(str2) Output: Java is a programming language ['J', 'v', ' is ', ' progr', 'mming l', 'ngu', 'ge'] ************************************************************** # Python split() method example # Variable declaration str = "Java is a programming language" # Calling function str2 = str.split('a',1) # Displaying result print(str2) str2 = str.split('a',3) # Displaying result print(str2) Output: ['J', 'va is a programming language'] ['J', 'v', ' is ', ' programming language']
×
×
  • اضافه کردن...