اثر پروانه ای

برنامه نویسی حرفه ای کامپیوتر به زبان سی شارپ - لیست کامل کلمات کلیدی در ʚĭɞ - ßữʈʨɾflỵ ⓔⓕⓕⓔⓒⓣ

اثر پروانه ای

برنامه نویسی حرفه ای کامپیوتر به زبان سی شارپ - لیست کامل کلمات کلیدی در ʚĭɞ - ßữʈʨɾflỵ ⓔⓕⓕⓔⓒⓣ

اثر پروانه ای

اثر پروانه‌ای نام پدیده‌ای است که به دلیل حساسیت سیستم‌های آشوب‌ناک به شرایط اولیه ایجاد می‌شود. این پدیده به این اشاره می‌کند که تغییری کوچک در یک سیستم آشوب‌ناک چون جو سیارهٔ زمین (مثلاً بال‌زدن پروانه) می‌تواند باعث تغییرات شدید (وقوع توفان در کشوری دیگر) در آینده شود.

ایده‌ٔ این‌که پروانه‌ای می‌تواند باعث تغییری آشوبی شود نخستین بار در ۱۹۵۲ در داستان کوتاهی به نام آوای تندر اثر ری بردبری مطرح شد. عبارت «اثر پروانه ای» هم در ۱۹۶۱ در پی مقاله‌ای از ادوارد لورنتس به وجود آمد. وی در صد و سی و نهمین اجلاس ای‌ای‌ای‌اس در سال ۱۹۷۲ مقاله‌ای با این عنوان ارائه داد که «آیا بال‌زدن پروانه‌ای در برزیل می‌تواند باعث ایجاد تندباد در تکزاس شود؟»

آخرین نظرات
  • ۱۳ بهمن ۰۱، ۱۵:۳۱ - حسنا سادات و سما سادات
    عالی

۱۵۹ مطلب با موضوع «برنامه نویسی» ثبت شده است

  • ۱
  • ۰

انتساب delegate ها

به این دلیل که delegate ها نوع های مرجع هستند، شما می توانید ارجاع گنجانده شده در یک  متغیر وکالتی را با انتساب یک ارجاع به آن متغیر وکالتی تغییر دهید. شیئ وکالتی قدیمی توسط زباله روب (Garbage Collector) عزل خواهد شد.

برای مثال، کد زیر مقدار delVar را تنظیم کرده سپس آنرا تغییر می دهد. شکل زیر این موضوع را نشان می دهد.

MyDel delVar;
delVar = myInstObj.MyM1; // Create and assign the delegate object.
...
delVar = SClass.OtherM2; // Create and assign the new delegate object.


  • غلامعلی حسینی بهجانی
  • ۱
  • ۰

اعلان نوع وکالتی (delegate)

همونطوری که در ابتدای بخش قبل گفتم، delegate ها "نوع" هستند، درست مثل کلاس ها که نوع هستند. و مشابه کلاس ها باید قبل از اینکه بتوانید از delegate ها استفاده کنید متغیرها و اشیاء از همان نوع را بسازید. مثال زیر طرز اعلان نوع وکالتی را نشان می دهد:

delegate void MyDel(int x);

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

در مثال قبل مشخص شده که شیئ وکالتی از نوع MyDel فقط متدهایی که دارای تنها یک پارامتر از نوع int بوده و نوع برگشتی ندارند را قبول می کند. شکل زیر در سمت چپ نوع وکالتی، و در سمت راست شیئ وکالتی را نشان می دهد.

نوع وکالتی

اعلان نوع وکالتی با اعلان متد، از دو جهت تفاوت دارد. اعلان نوع وکالتی

  • با کلمه کلیدی delegate شروع می شود
  • دارای بدنه متد نمی باشد

نکته

هرچند اعلان نوع وکالتی شبیه اعلان متد است، نیازی نیست که آنرا در داخل یک کلاس اعلان کنید، زیرا خودش "نوع" است.

  • غلامعلی حسینی بهجانی
  • ۱
  • ۰

delegate (وکیل) چیست؟
شما می توانید فکر کنید یک delegate یک شیئ است که یک یا چند متد را در خود نگهداری می کند. البته درحالت نرمال، اشیائ خاصیت اجرایی ندارند، اما یک delegate با اشیاء معمولی تفاوت دارد. شما می توانید یک delegate را اجرا کنید و هنگامی که شما چنین کاری انجام دهید، آن delegate تمام متد یا متدهایی را که در خود نگهداری می کند را اجرا خواهد کرد.
دراین فصل املاء (syntax) و معناشناسی ساخت و استفاده از delegate را توضیح خواهیم داد. در فصول آینده خواهیم دید که چگونه می توانیم با استفاده از delegate ها کدهای اجرایی را از یک متد به متد دیگر پاس دهیم و اینکه چرا اینکار سودمند است.

  • غلامعلی حسینی بهجانی
  • ۱
  • ۰

PC/UVa IDs: 110101/100

Popularity: A

Success rate: low

Level: 1

الگوریتم زیر را برای تولید دنباله ای از اعداد در نظر بگیرید. از یک عدد صحیح n شروع کنید. اگر n زوج است آنرا بر 2 تقسیم کنید. اگر n فرد است آنرا در 3 ضرب کرده سپس یکی به آن اضافه کنید. این عمل را بر روی مقادیر جدید n تکرار کنید و درصورتی که n برابر با یک شد، این عمل را متوقف کنید. برای مثال دنباله ی زیر برای n=22 تولید شده است.

22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1

خوب من برنامه مربوط به این چالش برنامه نویسی رو با استفاده از زبان قدرتمند #C نوشته ام و شما می تونید اونو از لینک زیر دانلود کنید. (دانلود در ادامه مطلب)

  • غلامعلی حسینی بهجانی
  • ۱
  • ۰

رابط (interface) می تواند یک رویداد را اعلان کند. مثال زیر چگونگی پیاده سازی رویدادهای رابطی را در یک کلاس نشان می دهد. بطور مقدماتی قواعد و قوانین کار مانند پیاده سازی متد ها یا پراپرتی های رابطی می باشد.
برای پیاده سازی رویدادهای رابطی در یک کلاس

  • رویداد را در کلاستان اعلان کرده، سپس آنرا در مکان دلخواه فراخوانی کنید.
    namespace ImplementInterfaceEvents
    {
        public interface IDrawingObject
        {
            event EventHandler ShapeChanged;
        }
        public class MyEventArgs : EventArgs 
        {
            // class members
        }
        public class Shape : IDrawingObject
        {
            public event EventHandler ShapeChanged;
            void ChangeShape()
            {
                // Do something here before the event…
    
                OnShapeChanged(new MyEventArgs(/*arguments*/));
    
                // or do something here after the event. 
            }
            protected virtual void OnShapeChanged(MyEventArgs e)
            {
                if(ShapeChanged != null)
                {
                   ShapeChanged(this, e);
                }
            }
        }
    
    }

مثال
مثال زیر نشان می دهد که چگونه موقعیتی تقریبا" غیر عادی را که در آن کلاس شما از دو رابط یا بیشتر ارث بری می کند و درعین حال هر رابط دارای یک رویداد با نام مشابه است را مدیریت کنید. در این موقعیت، شما باید حداقل برای یکی از رویدادها، بصورت صریح پیاده سازی رابط را فراهم کنید. وقتی شما برای یک رویداد، پیاده سازی صریح رابط می نویسید، همچنین باید دستیابی کننده های رویداد add و remove را بنویسید. در حالت عادی اینها توسط کامپایلر فراهم می شوند، اما در این مورد کامپایلر نمی تواند آنها را فراهم کند.

  • غلامعلی حسینی بهجانی
  • ۱
  • ۰

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

  • غلامعلی حسینی بهجانی
  • ۱
  • ۰

روال پیش رو چگونگی افزودن رویدادهای منطبق با الگوی استاندارد دات نت فریم وورک به کلاس ها و ساختارهایتان را توضیح میدهد. همه ی رویدادها در کتابخانه کلاس دات نت فریم وورک ، برپایه وکیل EventHandler می باشند که بصورت زیر تعریف شده است :

public delegate void EventHandler(object sender, EventArgs e);


نکته
دات نت فریم وورک 2.0 یک نسخه جنریک (عام) از این وکیل را بصورت (EventHandler (of TEventArgs معرفی می کند. مثال های زیر چگونگی استفاده از هر دو نسخه را نشان می دهند.

هرچند رویدادهای موجود در کلاس هایی که شما تعریف کرده اید می توانند بر پایه ی هر وکیل معتبری باشند، حتی وکیل هایی که مقداری را بازگشت می دهند، اما در کل پیشنهاد می شود که شما رویدادهایتان را برپایه الگوی دات نت فریم وورک قرار دهید. این کار با استفاده از EventHandler ، بصورتی که در مثال زیر توضیح داده شده ، انجام می پذیرد.

  • غلامعلی حسینی بهجانی
  • ۱
  • ۰

شما وقتی که بخواهید کد سفارشی ای بنویسید که هنگام برپا شدن یک رویداد فراخوانی شود، تعهد آن رویداد را که توسط کلاس های دیگر منتشر شده است را امضا می کنید. برای نمونه، ممکن است برای اینکه اپلیکیشن شما کار مفیدی را در مواقعی که کاربر روی دکمه "کلیک" کرد انجام دهد، تعهد رویداد click دکمه را امضا کنید.


امضای تعهد به رویدادها با استفاده از IDE ویژوال استودیو

  1. اگر نمی توانید پنجره Properties را ببینید، در نمای Design ، روی فرم یا کنترلی (دکمه ، تکست باکس و...) که می خواهید برایش استعمال کننده رویداد بسازید، راست کلیک کنید و گزینه Properties را انتخاب کنید.
  2. در بالاترین قسمت پنجره Properties روی آیکن Events (به شکل رعدوبرق) کلیک کنید.
  3. روی رویدادی که می خواهید بسازید (برای مثال رویداد Load) ، دوبار کلیک کنید.
    ویژوال استودیو بصورت خودکار یک متد استعمال کننده (بصورت خالی و پیاده سازی نشده) رویداد را به کد شما اضافه می کند. به بیانی دیگر، شما می توانید همین کدها را بصورت دستی در نمای Code وارد کند. برای مثال، خطوط کد زیر یک متد استعمال کننده رویداد را اعلان می کنند که در هنگام برپا شدن رویداد Load از کلاس Form فراخوانی خواهد شد.

private void Form1_Load(object sender, System.EventArgs e)
{
    // Add your form load event handling code here.
}

  • غلامعلی حسینی بهجانی
  • ۱
  • ۰

رویدادها

Event ها یک کلاس یا شیئ را قادر می سازند تا چیزهای مورد علاقه خود را به کلاس ها یا اشیاء دیگر اطلاع دهند. به کلاسی که رویداد را می فرستد ( یا برپا می کند) ناشر می گویند (publisher) و به کلاس هایی که رویداد را دریافت می کنند ( یا استعمال می کنند- handle) ، متعهد ( subscriber ) می گویند.

در یک فرم اپلیکیشن یا وب اپلیکیشن نمونه ی سی شارپ، شما متعهد رویدادهای برپا شده ی کنترل هایی مثل دکمه ها یا لیست باکس ها می شوید. شما می توانید از محیط توسعه یکپارچه (IDE) ویژوال سی شارپ برای مرور رویدادهایی که کنترل ها توانایی برپایی آنها را دارند استفاده کرده و آنهایی را که قصد استعمالشان دارید را انتخاب کنید. IDE بصورت خودکار یک متد خالی (بدون پیاده سازی) استعمال کننده رویداد و همچنین کدهایی برای متعهد شدن به آن رویداد را اضافه می کند.

بررسی رویدادها

رویدادها دارای خصوصیات زیر می باشند:

  • غلامعلی حسینی بهجانی
  • ۱
  • ۰

دات نت فریم وورک کلاس های مخصوصی را برای ذخیره و بازیابی داده ها ارائه داده است. این کلاس ها پشتیبانی از لیست ها، پشته ها، صف ها و جداول هش (جدول هایی که یک سری کلید را به مقادیر خاصی مرتبط می کند) را فراهم می کنند. اکثر کلاس های کلکسیونی رابط های مشابهی را پیاده سازی می کنند، و این رابط ها را می توان برای ساختن کلاس های کلکسیونی جدید که منطبق با نیازهای ذخیره سازی تخصصی تر هستند بکار برد.

نکته

اپلیکیشن های نوشته شده با نسخه 2.0 و بالاتر دات نت فریم وورک می بایست از کلاس های کلکسیونی جنریک موجود در فضای نام  System.Collections.Generic که امنیت-نوع و کارایی بیشتری نسبت به نسخه غیر-جنریک خود دارند، استفاده کنند.

ArrayList list = new ArrayList();
list.Add(10);
list.Add(20);

بررسی کلاس های کلکسیونی

کلاس های کلکسیونی دارای خوصوصیات زیر می باشند:

  • غلامعلی حسینی بهجانی