گفتگو هایی در باب سی شارپ

the_king

مدیرکل انجمن
استاد ، الان ، علاوه بر مفاهیم سی شارپ ، شما میگین روی الگوریتم ها مثل جستجوی خطی و دودویی و درختی و اینها هم تمرین و تمرکز کنم؟
متوجه شدم تجربه ندارین . ولی حدس تون ، قطعا بهتر از من خواهد بود . مثلا الان روی این الگوریتم هایی که گفتم هم تمرکز کنم؟ الگوریتم یا مبحث دیگه ای مد نظرتون هست؟
متاسفانه حدسی نمیتونم بزنم. من اگه بخوام از کسی برای استخدام امتحان بگیرم، یک موضوع میگم که به روش دلخواه خودش پیاده سازی کنه، به هر طریقی که خودش خواست، تا توانایی عملی و نظم و دقت و سرعت عمل اش رو ببینم.
اینکه الگوریتم کوله پشتی یا مرتب سازی ادغامی رو از حفظ باشه یا حفظ نباشه به چه درد من و بازار کار میخوره، اینها رو برای گزینش تیم المپیاد و ... بدرد میخورن که سوالاتشون به این چیزها مرتبط ئه و لازمه در چند دقیقه راه حل پیدا کنن، نه محیط کار و بازار و میتوانید با خیال آسوده در اینترنت دنبال راه حل بگردید. هیچ الگوریتمی رو هم از حفظ نباشید، باز می توانید برای کسب و کار برنامه نویس خوبی باشید.
اما این مشخصه که اغلب الگوریتم های عادی و مرسوم که در برنامه های عادی لازم میشه رو خود کتابخانه های NET. پیاده سازی کردن و انجام میدن، به ندرت پیش میاد که لازم باشه خودتون از اینجور موارد ابتدایی رو پیاده سازی کنید. ساختن Dictionary و Array.Sort و Array.BinarySearch و List.Sort و List<T>.BinarySearch و ... رو هم که لابد بلد هستید. نمیدونم که چی ازتون میخوان.
 

SU-57

Active Member
سلام به آقا سجاد و استاد علی عزیز
پوزش می خوام به خاطر بیماری که داشتم

1- این کد داخل Button متده یا رویداده

کد:
private void button1_Click(object sender, EventArgs e)
{
}

2- ارسال با مقدار و ارسال با آدرس به انگلیسی چی می شه (در ویدئو فارسیش گفته شد ولی من کلمه های انگلیسی رو می خوام)

3- من هنوز نتونستم یک مثال واقعی و بسیار ساده از متد تو در تو پیدا کنم به این صورت که نتیجه متد دوم return بشه و به عنوان آرگومان به متد یک ارسال بشه و نتیجه متد یک هم با return برگشت داده بشه به متدی که در Button هست و یک نتیجه ای حاصل بشه. من هر کاری می کنم توی یک متد می تونم همه کارها رو انجام بدم طوری که نیازی به متدهای تو در تو نباشه. البته می تونم یک متد رو بشکونم به دو متد ولی اینکه مثالی پیدا کنم که حتما باید توی دو تا متد باشه نتونستم پیدا کنم مثلا:

کد:
private void button1_Click(object sender, EventArgs e)
{
    method1(method2());
}

Method1()
{
}
Method2()
{

}

اصلا متد تو در تو کاربردی داره
 

the_king

مدیرکل انجمن
سلام به آقا سجاد و استاد علی عزیز
پوزش می خوام به خاطر بیماری که داشتم

1- این کد داخل Button متده یا رویداده

کد:
private void button1_Click(object sender, EventArgs e)
{
}
این متد ئه، Button.Click یک رویداد ئه که شما اون رویداد رو برای button1 وصلش کردید به این متد button1_Click تا رویداد موجب اجرا شدن این متد بشه.

2- ارسال با مقدار و ارسال با آدرس به انگلیسی چی می شه (در ویدئو فارسیش گفته شد ولی من کلمه های انگلیسی رو می خوام)
انواع داده value type داریم که با مقدار ارسال میشن و انواع داده reference type داریم که با ارجاع ارسال میشن. value یعنی مقدار و reference یعنی ارجاع و type یعنی نوع

3- من هنوز نتونستم یک مثال واقعی و بسیار ساده از متد تو در تو پیدا کنم به این صورت که نتیجه متد دوم return بشه و به عنوان آرگومان به متد یک ارسال بشه و نتیجه متد یک هم با return برگشت داده بشه به متدی که در Button هست و یک نتیجه ای حاصل بشه. من هر کاری می کنم توی یک متد می تونم همه کارها رو انجام بدم طوری که نیازی به متدهای تو در تو نباشه. البته می تونم یک متد رو بشکونم به دو متد ولی اینکه مثالی پیدا کنم که حتما باید توی دو تا متد باشه نتونستم پیدا کنم مثلا:

کد:
private void button1_Click(object sender, EventArgs e)
{
    method1(method2());
}

Method1()
{
}
Method2()
{

}

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

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
سلام استاد .
سلام آقا رامین .

استاد ، این تعریفات زیر را در نظر بگیرید (استراکچر یا کلاس بودن شون مهم هه) :

کد:
namespace VSS.Classes.Database
{

    internal class Setting
    {

        internal Program Program;
        internal Interface Interface;

        internal Setting(Program programPar, Interface interfacePar)
        {
            this.Program = programPar;
            this.Interface = interfacePar;
        }
    }

   
    internal struct Program
    {
        internal bool SilenceMode { get; set; }
        internal Backuping[] Backupings { get; set; }
        internal DriveInfo[] ExceptionDrives { get; set; }

        internal Program(bool silenceMode, Backuping[] backupings, DriveInfo[] exceptionDrives)
        {
            this.SilenceMode = silenceMode;
            this.Backupings = backupings;
            this.ExceptionDrives = exceptionDrives;
        }

    }

   
    internal struct Interface
    {
        internal Color ToolbarColor { get; set; }
        internal Color MainFormBackgroundColor { get; set; }
        internal Color ProgressControlColor { get; set; }
        internal Bitmap MainFormBackgroundImage { get; set; }
        internal Size MainFormSize { get; set; }

        internal Interface(Color toolbarColor, Color mainFormBackgroundColor, Color progressControlColor, Bitmap mainFormBackgroundImage, Size mainFormSize)
        {
            this.ToolbarColor = toolbarColor;
            this.MainFormBackgroundColor = mainFormBackgroundColor;
            this.ProgressControlColor = progressControlColor;
            this.MainFormBackgroundImage = mainFormBackgroundImage;
            this.MainFormSize = mainFormSize;
        }
    }


    internal struct Backuping
    {
        internal DriveInfo Drive { get; set; }
        internal bool EnableAutoBackuping { get; set; }
        internal int AutoBackupingEver { get; set; }
        internal bool EnableAutoBackupStorage { get; set; }
        internal int MaximumBackupStorage { get; set; }

        internal Backuping(DriveInfo drive, bool enableAutoBackuping, int autoBackupingEver, bool enableAutoBackupStorage, int maximumBackupStorage)
        {
            this.Drive = drive;
            this.EnableAutoBackuping = enableAutoBackuping;
            this.AutoBackupingEver = autoBackupingEver;
            this.EnableAutoBackupStorage = enableAutoBackupStorage;
            this.MaximumBackupStorage = maximumBackupStorage;
        }
    }
}

و همچنین موقع شی ساختن :

کد:
        void Test_1()
        {
            Setting setting = new Setting(new VSS.Classes.Database.Program(), new Interface());
            setting.Program.Backupings = new Backuping[4];
            this.Test_2(setting);
        }

        void Test_2(Setting mySetting)
        {
            mySetting.Program.Backupings = new Backuping[2];
        }

الان در پارامتر mySetting در متد Test_2 (چون Setting از نوع کلاس هست) پس mySetting هم اشاره گر به همون شی ای هست که متغییر setting در متد Test_1 بهش اشاره میکنه .
حالا در متد Test_2 ، وقتی تا اینجا نوشتیم mySetting.Program (چون Program از نوع استراکچر هست ، پس موقعِ خوندن) ، Program ، در یک حافظه ی جدید دیگه ای ریخته میشه (تا اینجا که درسته؟) اما سئوال مهم اینجاست که این حافظه ی جدید Program را چه شی ای (از درون شی کلاس Setting) بهش اشاره میکنه؟
آیا شی mySetting.Program در متد Test_2 (که mySetting ، همون شی setting در متد Test_1 هست) ، به شیِ جدیدِ Program ، اشاره میکنه؟ یا به عبارت دیگه ، شی ای که به شی جدیدِ Program اشاره میکنه ، همون شی mySetting.Program هست؟ یا به عبارت دیگه ، اشاره گرِ mySetting.Program ، عوض میشه؟ (شاید شما بگین که در این جمله ی آخر از اشاره گر بودنِ Program یاد کردم و Program هم از نوع استراکچر هست و اشاره گر نیست . بنابراین من نمیدونم چی بگم . چون حافظه ی قبلی اش موجود هست و تغییر داده نشده . نمیدونم منظورم را متوجه شدین یا نه) .

حالا در ادامه ی کد ، برای آرایه Backupings ، شی جدیدی گرفتیم که 2 عضو داره (در شی قبلی اش ، 4 عضو داشت) .
اگه اشاره گرِ mySetting.Program عوض بشه ، خوب سئوال پیش میاد که ما اصلا شیِ جدیدی برای Program (در mySetting) در نظر نگرفتیم که بخواد شی جدیدی براش در نظر گرفته بشه .
اگه شی جدیدی در نظر گرفته نشه ، سئوال این میشه که خوب استراکچر که موقع خوندن ، کپی و بنابراین شی جدیدی براش در نظر گرفته میشه . پس چرا اینجا نمیشه؟
یا به عبارت دیگه این جوری بگم که چون استراکچر هست و شی جدیدی براش در نظر گرفته میشه ، اشاره گرِ به این شی جدید ، چی هست؟ آیا اصلا اشاره گری داره؟ اگه داره ، چه شی ای به این شیِ استراکچرِ جدیدِ Program ، اشاره میکنه؟ یعنی توی حافظه ، بدون اشاره گر و موقتی هست (و بعد از اتمام خط کد mySetting.Program.Backupings = new Backuping[2]; درون متد Test_2 ، این حافظه دیگه قابلیت دسترسی نداره) ؟ که فکر نکنم این جور باشه . در این صورت ، به این معناست که مقدار آرایه ی mySetting.Program.Backupings را که تغییر دادیم ، در جایی در دسترس نیست؟

کلا یه توضیحی میدین چه اتفاقی میافته توی کدهای Test_1 و Test_2 ؟ و توی متد Test_2 و مخصوصا در متد Test_1 ، چه اشیاهایی در دسترس هستند و چه اشیاهایی در دسترس نیستند و بهشون اشاره گری وجود نخواهد داشت) ؟
آدم قاتی میکنه :green:
خیلی ممنون
 

the_king

مدیرکل انجمن
الان در پارامتر mySetting در متد Test_2 (چون Setting از نوع کلاس هست) پس mySetting هم اشاره گر به همون شی ای هست که متغییر setting در متد Test_1 بهش اشاره میکنه .
حالا در متد Test_2 ، وقتی تا اینجا نوشتیم mySetting.Program (چون Program از نوع استراکچر هست ، پس موقعِ خوندن) ، Program ، در یک حافظه ی جدید دیگه ای ریخته میشه (تا اینجا که درسته؟) اما سئوال مهم اینجاست که این حافظه ی جدید Program را چه شی ای (از درون شی کلاس Setting) بهش اشاره میکنه؟
نه. Settings.Program یکی از متغیر های شما است، مشخصه که نیست get و return شده باشه. به همین جهت استفاده از خود mySetting.Program یا setting.Program به تنهایی ربطی به کپی کردن struct در حافظه جدید نداره. همون mySetting.Program ای که شما داشتید رو برمیگردونه. اما اگر بیایید یک متغیر دیگری از نوع struct تون بسازید و mySetting.Program رو داخلش کپی کنید یا مشخصه ای بسازید و ازش mySetting.Program رو برگردونید اونوقت کپی میشه.

آیا شی mySetting.Program در متد Test_2 (که mySetting ، همون شی setting در متد Test_1 هست) ، به شیِ جدیدِ Program ، اشاره میکنه؟ یا به عبارت دیگه ، شی ای که به شی جدیدِ Program اشاره میکنه ، همون شی mySetting.Program هست؟ یا به عبارت دیگه ، اشاره گرِ mySetting.Program ، عوض میشه؟ (شاید شما بگین که در این جمله ی آخر از اشاره گر بودنِ Program یاد کردم و Program هم از نوع استراکچر هست و اشاره گر نیست . بنابراین من نمیدونم چی بگم . چون حافظه ی قبلی اش موجود هست و تغییر داده نشده . نمیدونم منظورم را متوجه شدین یا نه) .
نه. mySettings چون ارجاع به شیء ئه، همون setting رو تحویل میده، فرقی بین setting.Program و mySettings.Program نیست و Program هم این وسط تکثیر نمیشه. مثل همون مورد بالایی.

مشخصه رو با متغیر قاطی نکنید، چیزی که باعث کپی شدن value type ها (چه int و چه struct و ...) میشه انتقالش به حافظه دیگری است، مثلا با ارسال setting.Program به عنوان پارامتر به متدی یا با = کپی کردنش در متغیر دیگری یا return کردنش از متدی. شما در مثال هاتون settings رو به عنوان پارامتر استفاده کردید که reference type ئه، Settings.Program تون هم که مشخصه نیست، return نمیشه. جایی هم Program اش رو در متغیر دیگری کپی نکردید.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
خیلی ممنون استاد .
یه چیز عجیب .
الان در کد زیر :

کد:
        private void TransparentControl1_Click_1(object sender, EventArgs e)
        {
            Parallel.For(0, int.MaxValue, new ParallelOptions { MaxDegreeOfParallelism = 1 }, new Action<int>(this.parallel));
            MessageBox.Show(this.a.ToString());
        }

        private int a = 0;

        private void parallel(int par1)
        {
            this.a++;
        }

که من مقدار MaxDegreeOfParallelism را 1 قرار دادم که یعنی این کد را در 1 هسته ی منطقی (همون هسته ی مجازی) اجرا کنه . وقتی این کد را اجرا کردم ، کد MessageBox.Show برای من 18 ثاانیه طول کشید (چون پردازنده ام 4460 و 4 هسته ای هست ، پس هسته ی مجازی نداره و در هسته ی فیزیکی اش اجرا کرد و میزان اشغال پردازنده هم 25 درصد برای پروسه ام بود) .
جالب اینجاست که کد بعدی را اجرا کردم اما اینبار مقدار MaxDegreeOfParallelism را 2 قرار دادم (اینبار پروسه ام 50 درصد یعنی 2 هسته ی فیزیکی از پردازنده را اشغال کرد) اما بجای اینکه زمانی که پیام MessageBox.Show رو بده ، کمتر بشه ، از 18 ثانیه ، به 32 ثانیه افزایش پیدا کرد (یعنی تقریبا دو برابر بیشتر شد!!)
وقتی هم که مقدار MaxDegreeOfParallelism را 3 قرار دادم ، پروسه ام 75 درصد از پردازنده را اشغال کرد (3 هسته ی فیزیکی) اما باز زمانش مثل حالت 2 هسته ای ، یعنی 32 ثانیه طول کشید . و وقتی مقدار MaxDegreeOfParallelism را به 4 تغییر دادم ، پروسه ام تقریبا کامل پردازنده را اشغال کرد اما زمانش 38 ثانیه طول کشید .

چرا؟!!!

من حدس میزنم چون متغییر سراسری a را میخواد از حافظه ی رم هر بار بخونه و بنویسه (حالا نمیدونم که پردازنده ، این متغییر را بجای رم ، توی حافظه ی کش خودش ذخیره میکنه یا نه) ، چون از یک کانال فقط میتونه بخونه (از یک کانال فقط میتونه بخونه دیگه . درسته؟) ، پس چه یک هسته یا چند هسته درخواست خوندن و نوشتن ازحافظه ی رم را بدن ، فرقی نمیکنه . درسته؟
اگه درسته ، خوب وقتی یک هسته یا چند هسته استفاده بشه ، سرعت شون نباید فرقی کنه . یعنی اگه یک هسته ، سرعت پردازشش 18 ثانیه هست ، سرعت پردازش 2 هسته یا هسته های بیشتر ، نباید از 18 ثانیه بیشتر بشه (هر چند کمتر هم نشه) .
حالا نمیدونم تحلیلم درسته یا نه .
اما پس نرم افزارهای دیگه (مثل بازی ها یا افترافکت و ...) چی کار میکنن که از چند هسته استفاده میکنن و سرعت پردازش شون بیشتر هم میشه؟
اگه این طور که من گفتم میبود ، که اصلا پردازنده های چند هسته ای معنا نداشتن که.
شما میتونین کد بالا را جوری تغییر بدین که مثلا در دو هسته (یا بیشتر) اجرا بشه و سرعت پردازشش به همون نسبت (به اجرا در یک هسته) ، بیشتر بشه؟ اگه آره ، کدش را میذارین؟
خیلی ممنون
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
استاد ، چند تا مقاله ی خوب در این باره پیدا کردم . لینکش را در زیر میذارم برای مرور در آینده . کلا لینک های خیلی خوبی هستند (به نظرم) مخصوصا لینک اولی (هر چند لینک اولی ، مقاله اش طولانی هه اما گویا و واضح تر هه . تا حالا بخشی از لینک اول را خوندم ، مطالب خوبی بود) :

How to Beat Array Iteration Performance with Parallelism in C# .NET - Michael's Coding Spot

و

https://helloacm.com/how-to-speed-up-parallel-processing-using-parallel-for-foreach-in-c-net-4-0-or-above/

و

Disappointing performance with Parallel.For

و

How to: Write a Simple Parallel.For Loop

البته جواب پست بالا (و تغییراتی که نیازه تا بدیم) را هنوز پیدا نکردم .
 

the_king

مدیرکل انجمن
خیلی ممنون استاد .
یه چیز عجیب .
الان در کد زیر :

کد:
        private void TransparentControl1_Click_1(object sender, EventArgs e)
        {
            Parallel.For(0, int.MaxValue, new ParallelOptions { MaxDegreeOfParallelism = 1 }, new Action<int>(this.parallel));
            MessageBox.Show(this.a.ToString());
        }

        private int a = 0;

        private void parallel(int par1)
        {
            this.a++;
        }

که من مقدار MaxDegreeOfParallelism را 1 قرار دادم که یعنی این کد را در 1 هسته ی منطقی (همون هسته ی مجازی) اجرا کنه . وقتی این کد را اجرا کردم ، کد MessageBox.Show برای من 18 ثاانیه طول کشید (چون پردازنده ام 4460 و 4 هسته ای هست ، پس هسته ی مجازی نداره و در هسته ی فیزیکی اش اجرا کرد و میزان اشغال پردازنده هم 25 درصد برای پروسه ام بود) .
جالب اینجاست که کد بعدی را اجرا کردم اما اینبار مقدار MaxDegreeOfParallelism را 2 قرار دادم (اینبار پروسه ام 50 درصد یعنی 2 هسته ی فیزیکی از پردازنده را اشغال کرد) اما بجای اینکه زمانی که پیام MessageBox.Show رو بده ، کمتر بشه ، از 18 ثانیه ، به 32 ثانیه افزایش پیدا کرد (یعنی تقریبا دو برابر بیشتر شد!!)
وقتی هم که مقدار MaxDegreeOfParallelism را 3 قرار دادم ، پروسه ام 75 درصد از پردازنده را اشغال کرد (3 هسته ی فیزیکی) اما باز زمانش مثل حالت 2 هسته ای ، یعنی 32 ثانیه طول کشید . و وقتی مقدار MaxDegreeOfParallelism را به 4 تغییر دادم ، پروسه ام تقریبا کامل پردازنده را اشغال کرد اما زمانش 38 ثانیه طول کشید .

چرا؟!!!

من حدس میزنم چون متغییر سراسری a را میخواد از حافظه ی رم هر بار بخونه و بنویسه (حالا نمیدونم که پردازنده ، این متغییر را بجای رم ، توی حافظه ی کش خودش ذخیره میکنه یا نه) ، چون از یک کانال فقط میتونه بخونه (از یک کانال فقط میتونه بخونه دیگه . درسته؟) ، پس چه یک هسته یا چند هسته درخواست خوندن و نوشتن ازحافظه ی رم را بدن ، فرقی نمیکنه . درسته؟
اگه درسته ، خوب وقتی یک هسته یا چند هسته استفاده بشه ، سرعت شون نباید فرقی کنه . یعنی اگه یک هسته ، سرعت پردازشش 18 ثانیه هست ، سرعت پردازش 2 هسته یا هسته های بیشتر ، نباید از 18 ثانیه بیشتر بشه (هر چند کمتر هم نشه) .
حالا نمیدونم تحلیلم درسته یا نه .
اما پس نرم افزارهای دیگه (مثل بازی ها یا افترافکت و ...) چی کار میکنن که از چند هسته استفاده میکنن و سرعت پردازش شون بیشتر هم میشه؟
اگه این طور که من گفتم میبود ، که اصلا پردازنده های چند هسته ای معنا نداشتن که.
شما میتونین کد بالا را جوری تغییر بدین که مثلا در دو هسته (یا بیشتر) اجرا بشه و سرعت پردازشش به همون نسبت (به اجرا در یک هسته) ، بیشتر بشه؟ اگه آره ، کدش را میذارین؟
خیلی ممنون
مثال با MaxDegreeOfParallelism مقدار 1 که مورد خاصی نداره. چون تا وقتی یک اجرای روتین parallel تموم نشه اجرای بعدی درکار نیست، وقتی فقط یک نفر از یک صندلی استفاده میکنه و استفاده اشتراکی از صندلی در کار نیست نه لزومی به رعایت اصول استفاده اشتراکی هست و نه تداخلی در دسترسی به صندلی پیش میاد چون سر نشستن روی اون رقابتی نیست. اما صرفا به این دلیل که شما متغیر سراسری رو داخل روتین بکار میبرید، سربار دسترسی بهش رو تحمیل می کنید که عملا موجب کاهش کارایی میشه. این کاهش کارایی اینجا خیلی به چشم میاد چون شما در روتین تون جز همین سربار کار دیگری انجام نمیدید که مفید باشه. وقتی سربار ارزش داره که در مقابلش کار مفیدی انجام بدید که به افزایش کارایی منجر بشه، روتینی که صرفا با متغیر سراسری درگیر میشه صرفا سربار داره، مزیتی نداره :
کد:
        private int a = 0;

        private void button1_Click(object sender, EventArgs e)
        {
            button1.Enabled = false;
            var stopwatch = new Stopwatch();
            Application.DoEvents();
            stopwatch.Start();
            Parallel.For(0, int.MaxValue, new ParallelOptions { MaxDegreeOfParallelism = 1 }, new Action<int>(this.parallel));
            stopwatch.Stop();
            var s = $"1 parallel, {stopwatch.ElapsedMilliseconds} ms,  a = {a} (int.Max = {int.MaxValue})";
            a = 0;
            stopwatch.Reset();
            Application.DoEvents();
            stopwatch.Start();
            for (var i = 0; i < int.MaxValue; i++)
            {
                parallel(i);
            }
            stopwatch.Stop();
            s += Environment.NewLine + $"call, {stopwatch.ElapsedMilliseconds} ms,  a = {a} (int.Max = {int.MaxValue})";
            MessageBox.Show(s);
            button1.Enabled = true;
        }

        private void parallel(int par1)
        {
            this.a++;
        }

وقتی شما MaxDegreeOfParallelism رو بیشتر از 1 می کنید قضیه کاملا فرق می کنه، اولا سر دسترسی به متغیر سراسری رقابت میشه و ثانیا چون شما اصول انحصار متقابل رو رعایت نکردید، مقدار متغیر سراسری به درستی تغییر نمی کنه. شما باید در نظر بگیرید که در حین تغییر مقدار متغیر توسط یک نخ نباید نخ دیگری همزمان سراغش بیاد، باید صبر کنه تا کار نخ قبلی با متغیر تموم بشه.
افزایش مقدار متغیری مثل a شامل سه مرحله است، خواندن مقدار a در یک رجیستر ماشین، افزایش مقدار رجیستر ماشین و نوشتن مقدار رجیستر ماشین در حافظه a. زمانی که شما این سه مرحله رو در دو نخ متفاوت انجام میدید احتمال داره در میان مراحل سه گانه یک نخ دیگری اقدام کنه و حاصل اجرای دو نخ a + 2 نشه، a + 1 بشه. وقتی تعداد تکرار زیاده قطعا این تداخل پیش میاد :
کد:
        private int a = 0;
        private object _obj = new object();

        private void button1_Click(object sender, EventArgs e)
        {
            button1.Enabled = false;
            var stopwatch = new Stopwatch();
            Application.DoEvents();
            stopwatch.Start();
            Parallel.For(0, int.MaxValue, new ParallelOptions { MaxDegreeOfParallelism = 2 }, new Action<int>(this.parallelWithoutLock));
            stopwatch.Stop();
            var s = $"2 parallel without lock, {stopwatch.ElapsedMilliseconds} ms,  a = {a} (int.Max = {int.MaxValue})";
            a = 0;
            stopwatch.Reset();
            Application.DoEvents();
            stopwatch.Start();
            Parallel.For(0, int.MaxValue, new ParallelOptions { MaxDegreeOfParallelism = 2 }, new Action<int>(this.parallelWithLock));
            stopwatch.Stop();
            s += Environment.NewLine + $"2 parallel with lock, {stopwatch.ElapsedMilliseconds} ms,  a = {a} (int.Max = {int.MaxValue})";
            MessageBox.Show(s);
            button1.Enabled = true;
        }

        private void parallelWithoutLock(int par1)
        {
            this.a++;
        }

        private void parallelWithLock(int par1)
        {
            lock (_obj)
            {
                this.a++;
            }
        }
کاری که شما می کنید هیچوقت به افزایش کارایی منجر نمیشه چون الگوریتم مناسب اجرای موازی نیست. شما یک در دارید که عرضش اندازه یک نفر ئه. دو نفر که نمیتونن همزمان از این در عبور کنن. یک صف آدم دارن یکی یکی ازش عبور میکنن. شما یک صف دیگه کنار این صف بذارید که سرعت عبور از در بیشتر نمیشه، بدتر کند میشه، سر عبور از در بین دو صف رقابت پیش میاد و سرعت عبور از در کمتر میشه.
وقتی میخوان از اجرای چند پردازنده ای بهره بگیرن به الگوریتم هایی فکر میکنن که تقسیم شدنش بیشتر از سربار افزایش کارایی داشته باشه. روتین parallel بیشتر از اینکه کارایی داشته باشه سربار داره. شما داخل یک حلقه مقدار a رو افزایش میدادید نسبت به متد parallel کارایی بیشتری میگرفتید.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
سلامی مجدد
خیلی ممنون استاد .
استاد ، میگم چرا کلاس هایی که برای همگام سازی دو نخ در نظر گرفته شده ، این همه متفاوت و متنوع هستن توی دات نت؟
مگه همه شون یه کار را نمیکنن؟ در واقع ، موارد استفاده ی هر کدوم شون ، کجاست؟
مثلا کلمه ی کلیدی lock ، خودش فکر کنم از کلاس Monitor (متد Monitor.Enter و متد Monitor.Exit) استفاده میکنه . درسته؟
حالا بجای کلمه ی کلیدی lock ، اگه حالت پیشرفته تر رو خواستیم استفاده کنیم ، از کلاس Monitor استفاده میکنیم . درسته؟
کلمه ی کلیدی lock که ورودی اش شی object را میگیره ، چیه؟ من دیدم خیلی جاها فقط الکی یه شی object درست میگنن و توی این کلمه ی کلیدی میذارن بدون اینکه جایی از این شی استفاده بشه . اگه جایی کاربرد نداره ، پس چرا میخواد؟
همینطور کلاس های بسیار زیاد دیگه مثل EventWaitHandle, AutoResetEvent, ManualResetEvent که از کلاس WaitHandle ارث بری میکنن و همچنین کلاس های بسیار دیگه ای مثل Mutex و Semaphore و SemaphoreSlim (که کلاس SemaphoreSlim ، حالت سبک تر و سریعتر کلاس Semaphore هست) وجود دارن .
اگه اشتباه نکنم ، کلاس ها و استراکچرهای SpinLock و ReaderWriterLockSlim و CountdownEvent و Barrier و Interlocked و SpinWait هم برای این کار باشن . درسته؟
این در حالی هه که متد Join در کلاس Thread هم کار همگام سازی (و این کلاس ها) را هم انجام میده .

این همه تنوع و این همه کلاس برای همگام سازی چرا ارائه شد؟
چرا مثلا یک ، یا حداکثر دو کلاس جامع و کامل نذاشتن که این قدر گیج و گمراه کننده نباشه؟
کامل ترین کلاس ، کلاس Monitor و Mutex هستن؟ توی این دو ، باز کلاس Monitor جامع تر هه؟ شما خودتون از کدوم کلاس برای همگام سازی استفاده میکنین؟

بعد اینکه signaled state یا مکانیزمِ signaled در نخ ها چیه؟ همینطور unsignaled state در نخ ها چیه؟
signaled state یعنی اینکه یه نخ ، نخ دیگه ای را متوقف میکنه و هر وقت کارش تمام شد ، به اون نخِ دیگه ، سیگنال و پیام میفرسته که اجراش (اجرای نخِ دیگه) را ادامه بده؟ یعنی همون کاری که متد Join انجام میده؟ درسته؟
پس unsignaled state چیه؟
خیلی ممنون استاد
 
آخرین ویرایش:

the_king

مدیرکل انجمن
سلامی مجدد
خیلی ممنون استاد .
استاد ، میگم چرا کلاس هایی که برای همگام سازی دو نخ در نظر گرفته شده ، این همه متفاوت و متنوع هستن توی دات نت؟
مگه همه شون یه کار را نمیکنن؟ در واقع ، موارد استفاده ی هر کدوم شون ، کجاست؟
مثلا کلمه ی کلیدی lock ، خودش فکر کنم از کلاس Monitor (متد Monitor.Enter و متد Monitor.Exit) استفاده میکنه . درسته؟
حالا بجای کلمه ی کلیدی lock ، اگه حالت پیشرفته تر رو خواستیم استفاده کنیم ، از کلاس Monitor استفاده میکنیم . درسته؟
کلمه ی کلیدی lock که ورودی اش شی object را میگیره ، چیه؟ من دیدم خیلی جاها فقط الکی یه شی object درست میگنن و توی این کلمه ی کلیدی میذارن بدون اینکه جایی از این شی استفاده بشه . اگه جایی کاربرد نداره ، پس چرا میخواد؟
همینطور کلاس های بسیار زیاد دیگه مثل EventWaitHandle, AutoResetEvent, ManualResetEvent که از کلاس WaitHandle ارث بری میکنن و همچنین کلاس های بسیار دیگه ای مثل Mutex و Semaphore و SemaphoreSlim (که کلاس SemaphoreSlim ، حالت سبک تر و سریعتر کلاس Semaphore هست) وجود دارن .
اگه اشتباه نکنم ، کلاس ها و استراکچرهای SpinLock و ReaderWriterLockSlim و CountdownEvent و Barrier و Interlocked و SpinWait هم برای این کار باشن . درسته؟
این در حالی هه که متد Join در کلاس Thread هم کار همگام سازی (و این کلاس ها) را هم انجام میده .

این همه تنوع و این همه کلاس برای همگام سازی چرا ارائه شد؟
چرا مثلا یک ، یا حداکثر دو کلاس جامع و کامل نذاشتن که این قدر گیج و گمراه کننده نباشه؟
کامل ترین کلاس ، کلاس Monitor و Mutex هستن؟ توی این دو ، باز کلاس Monitor جامع تر هه؟ شما خودتون از کدوم کلاس برای همگام سازی استفاده میکنین؟

بعد اینکه signaled state یا مکانیزمِ signaled در نخ ها چیه؟ همینطور unsignaled state در نخ ها چیه؟
signaled state یعنی اینکه یه نخ ، نخ دیگه ای را متوقف میکنه و هر وقت کارش تمام شد ، به اون نخِ دیگه ، سیگنال و پیام میفرسته که اجراش (اجرای نخِ دیگه) را ادامه بده؟ یعنی همون کاری که متد Join انجام میده؟ درسته؟
پس unsignaled state چیه؟
خیلی ممنون استاد
lock رو با بقیه مقایسه نکنید، lock به کامپایلر میفهمونه که مرده یا زنده باید وقتی از بلوک مشخص شده در میاد منبع گرفته شده آزاد بشه، یعنی در هر شرایطی که از بلوک خارج بشید یادش میمونه که منبع باید آزاد میشده.
این فرق می کنه با کدی که خودتون بنویسید و جایی اشتباها یادتون بره منبع رو باید تحت هر شرایطی حتی بروز خطا باید آزاد میکردید.
مشابه using که به هر دلیلی ازش خارج بشید کار Dispose شدن رو فراموش نمی کنه. Monitor.Exit وقتی میتونه موثر باشه که قبل از رسیدن بهش خطایی رخ نده یا برنامه نویس اشتباها با return یا break یا goto یا هر مورد دیگه ای دورش نزنه. Dispose و Monitor.Exit فرمان هستند ولی قابلیت اطمینانی که using و lock میتوانند داشته باشند رو ندارند. از طرف دیگه نمیشه Dispose و Monitor.Exit رو حذف کرد چون همیشه و الزاما در اون متدی که ناحیه دسترسی ایجاد شده نمیخواهیم ازش خارج بشیم. شاید لازم باشه در جای دیگری و طبق شرطی منبع آزاد بشه.
نه یک کار رو نمی کنند، هر کدوم با توجه به شرایطی و برای کاربرد های مشخصی مفید واقع میشن.
بعضی موارد مثل Interlocked برای ساده کردن دسترسی به مقادیر اشتراکی اند، نه برای توقف و انتظار و هماهنگ سازی اجرای نخ ها.
بعضی موارد مثل Mutex هم این امکان رو میده که حتی بین برنامه x و برنامه y که کاملا مجزا هستند یک هماهنگ سازی بوجود بیارید چون تامین کننده اش سیستم عامل ئه.

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

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
خیلی ممنون استاد
استاد ، ذخیره سازی آرایه های چند بعدی یا آرایه های jagged array در حافظه ، به چه شکلی هست؟
یعنی آرایه های یک بعدی که پشت سر هم ذخیره میشن ؛ حالا ترتیب ذخیره سازی اون دو نوع آرایه ، چجوری هه؟ مثلا سطر و ستون در آرایه های چند بعدی و آرایه های jagged array ، چجوری ذخیره میشن؟

بعد اینکه آموزش های :
ساختمان داده
طراحی الگوریتم
الگوریتم موازی و پردازش موازی
سیستم عامل
و شاید هم مدار منطقی را میخوام بگیرم .

به نظرتون برام مناسبه؟ چون میگم مثل آموزش entity framework قبلی نشه که فهمیدم کاربرد خاصی نسبت به ado.net نداره.
البته نمیدونم مدار منطقی ، چه جایگاهی داره و در کجاها به درد میخوره و آیا پیش نیاز یا پس نیازِ بقیه ی دروس هست یا نه.
 

the_king

مدیرکل انجمن
خیلی ممنون استاد
استاد ، ذخیره سازی آرایه های چند بعدی یا آرایه های jagged array در حافظه ، به چه شکلی هست؟
یعنی آرایه های یک بعدی که پشت سر هم ذخیره میشن ؛ حالا ترتیب ذخیره سازی اون دو نوع آرایه ، چجوری هه؟ مثلا سطر و ستون در آرایه های چند بعدی و آرایه های jagged array ، چجوری ذخیره میشن؟
مستندات خاصی نداره که این ساختار رو مشخص کنه، از اون مباحثی است که برای اینجور زبان ها که ساختار حافظه اشیاء پنهانه دانستنش فایده عملی نداره.
ولی احتمالا مشابه سایر زبان ها است. آرایه چند بعدی خانه ها بصورت متوالی از اندیس های داخلی به سمت خارجی (اندیس های سمت راست داخلی تر از اندیس های سمت چپ هستند) ثبت می شوند.
مثلا اگر آرایه سه بعدی A[x,y,z] باشه اول خانه های A[0,0,z] با حلقه z نوشته میشه و بعد A[x,1,z] و ...
در آرایه های تو در تو چون در هر خانه مقدار اشاره گر یک آرایه دیگه ثبت میشه ممکنه در حافظه خیلی پراکنده ذخیره بشن، یک ساختار پخش و پلا است که مقادیر آرایه پایه از نوع اشاره گر حافظه است.

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

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
مستندات خاصی نداره که این ساختار رو مشخص کنه، از اون مباحثی است که برای اینجور زبان ها که ساختار حافظه اشیاء پنهانه دانستنش فایده عملی نداره.
ولی احتمالا مشابه سایر زبان ها است. آرایه چند بعدی خانه ها بصورت متوالی از اندیس های داخلی به سمت خارجی (اندیس های سمت راست داخلی تر از اندیس های سمت چپ هستند) ثبت می شوند.
مثلا اگر آرایه سه بعدی A[x,y,z] باشه اول خانه های A[0,0,z] با حلقه z نوشته میشه و بعد A[x,1,z] و ...
در آرایه های تو در تو چون در هر خانه مقدار اشاره گر یک آرایه دیگه ثبت میشه ممکنه در حافظه خیلی پراکنده ذخیره بشن، یک ساختار پخش و پلا است که مقادیر آرایه پایه از نوع اشاره گر حافظه است.

خیلی ممنون استاد.

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

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

پس 4 تا آموزش ساختمان داده و طراحی الگوریتم و الگوریتم موازی و پردازش موازی و سیستم عامل را بگیرم؟
اما مدار منطقی را نگیرم ؟ . مدار منطقی به درد کجاها میخوره؟
 
آخرین ویرایش:

the_king

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

پس 4 تا آموزش ساختمان داده و طراحی الگوریتم و الگوریتم موازی و پردازش موازی و سیستم عامل را بگیرم؟
با این استدلالی که دارید از من نپرسید. با منطق "اگه لازم شد" که در بخش کامپیوتر هر کتابفروشی که برید، حداقل صد تا کتاب می بینید که ممکنه لازمتون بشه. دوران اینجور یادگیری ها گذشته. وقت کافی پیدا نمی کنید.
اگه نظر من رو بخواهید، نه، فقط طراحی الگوریتم، کتاب های ساختمان داده ای که می بینید بیشتر برای آموزش پیاده سازی ساختمان داده های متعارف در زبان هایی مثل C++ / C ئه. شما هر چیزی بخواهید که در همون NET. آماده اش هست، محتوای زیادی لازم نداره. الگوریتم مهم ئه ولی اونم که اصلا حفظی نیست، درک کردنیه. الگوریتم های داخل هیچ کتابی رو حقظ نکنید، منطقشون رو باید درک کنید. صد تا الگوریتم رو که حفظ کنید اندازه دو تا الگوریتم که خوب درکشون کنید مفید نیست. تنها راه یاد گرفتن طراحی الگوریتم سعی برای نوشتن الگوریتم جدید برای یک مساله است، تمرین و تمرین و تمرین.

اما مدار منطقی را نگیرم ؟ . مدار منطقی به درد کجاها میخوره؟
استفاده علمی اش برای برنامه نویسان ریزپردازنده ها و طراحان PLC ئه. برنامه نویسان زبان اسمبلی یک بخشی اش رو میدونند و یک بخشی رو هم لازم نیست بدونند چون فقط با میخواهند با پردازنده کار کنند، نمی خواهند پردازنده بسازند. بخش عمده ای اش در حد تئوری است برای دانشجو های سخت افزار که بدونند یک پردازنده ابتدایی که فرضا 40 سال پیش اونور دنیا میساختن چطور کار میکرد.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
با این استدلالی که دارید از من نپرسید. با منطق "اگه لازم شد" که در بخش کامپیوتر هر کتابفروشی که برید، حداقل صد تا کتاب می بینید که ممکنه لازمتون بشه. دوران اینجور یادگیری ها گذشته. وقت کافی پیدا نمی کنید.
اگه نظر من رو بخواهید، نه، فقط طراحی الگوریتم، کتاب های ساختمان داده ای که می بینید بیشتر برای آموزش پیاده سازی ساختمان داده های متعارف در زبان هایی مثل C++ / C ئه. شما هر چیزی بخواهید که در همون NET. آماده اش هست، محتوای زیادی لازم نداره. الگوریتم مهم ئه ولی اونم که اصلا حفظی نیست، درک کردنیه. الگوریتم های داخل هیچ کتابی رو حقظ نکنید، منطقشون رو باید درک کنید. صد تا الگوریتم رو که حفظ کنید اندازه دو تا الگوریتم که خوب درکشون کنید مفید نیست. تنها راه یاد گرفتن طراحی الگوریتم سعی برای نوشتن الگوریتم جدید برای یک مساله است، تمرین و تمرین و تمرین.


استفاده علمی اش برای برنامه نویسان ریزپردازنده ها و طراحان PLC ئه. برنامه نویسان زبان اسمبلی یک بخشی اش رو میدونند و یک بخشی رو هم لازم نیست بدونند چون فقط با میخواهند با پردازنده کار کنند، نمی خواهند پردازنده بسازند. بخش عمده ای اش در حد تئوری است برای دانشجو های سخت افزار که بدونند یک پردازنده ابتدایی که فرضا 40 سال پیش اونور دنیا میساختن چطور کار میکرد.

خیلی ممنون استاد .
الان هیچ کدوم از این 4 تا 5 آموزش را تهیه نکنم به نظرتون؟
توی جستجو کردن ، توی جستجوی در شی درخت (جستجو در شی treeview) و از این دست الگوریتم ها (که پیچیدگی یا بهینه تر بودنِ الگوریتم در سریع تر اجرا شدن ، مهمه) ، بهم کمک نمیکنه؟

آموزش الگوریتم موازی و پردازش موازی و سیستم عامل هم نگیرم؟ دونستن طراحی الگوریتم برای پردازش موازی یا عملکرد سیستم عامل ، برام میتونه مفید باشه دیگه . مگه نه؟
 

the_king

مدیرکل انجمن
خیلی ممنون استاد .
الان هیچ کدوم از این 4 تا 5 آموزش را تهیه نکنم به نظرتون؟
توی جستجو کردن ، توی جستجوی در شی درخت (جستجو در شی treeview) و از این دست الگوریتم ها (که پیچیدگی یا بهینه تر بودنِ الگوریتم در سریع تر اجرا شدن ، مهمه) ، بهم کمک نمیکنه؟
اینکه جستجو در درخت سریعتر از آرایه نامرتب ئه که شکی نیست ولی شما که نمیخواهید کتابخانه های موجود NET. در بذارید کنار و از نو چرخ رو اختراع کنید. شما مشکلی با SortedDictionary نخواهید داشت که بخواهید همچین کاری بکنید. یا فرضا وقتی میخواهید یکسری داده رو مرتب کنید که لازم نیست از نو الگوریتم جستجوی سریع یا ادغامی بنویسید، با کتابخانه آماده NET. نیازی به اینکار ها نیست.
اگر میخواستید از نو یک کلاس درخت جستجو بنویسید طبعا به یک کتاب ساختمان داده ها یا گوگل مراجعه می کردید ولی برای برنامه هایی که در NET. می نویسید همچین نیازی نیست.
آموزش الگوریتم موازی و پردازش موازی و سیستم عامل هم نگیرم؟ دونستن طراحی الگوریتم برای پردازش موازی یا عملکرد سیستم عامل ، برام میتونه مفید باشه دیگه . مگه نه؟
وقتی الان لازمش ندارید برای چی؟ طراحی الگوریتم برای هر نوع کاربردی میتونه مفید باشه، نه اختصاص به زبان خاصی داره و نه کاربرد خاصی.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
سلام استاد . خیلی ممنون .
استاد ، امتحان آزمون استخدامی سراسری که برگذار شد ، یک ساعت پیش امتحانم تموم شد . :green:
استاد ، اگه وقت داشتین ، سئوال ها و جواب هام را نگاه میکنین . اگه وقت و حال داشتین .
pdf ها سئوالات هه و اون فایل های عکس (png) ، جواب منه .
از لینک زیر میتونید دانلود کنید (حجمش 18.24 مگابایت هست) :

Soalat C#

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

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

چیزهایی که خیلی خراب کردم اول دیتابیس بود و دوم زبان انگلیسی .
میدونستم توی دیتابیس ضعیفم ولی نه تا این حد :green:
بقیه بد نبود (سئوالات شون آسون شاید بشه گفت که بود) اما وقت شون مخصوصا برای سی شارپ برام کم بود (آدم کندی هم هستم :green:) . برای سی شارپ ، 15 دقیقه برای 20 سئوال وقت بود . واسه ی همین 4 سئوال آخر سی شارپ را نرسیدم جواب بدم .
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
استاد ، سئوالات را دیدین؟
سئوالات سی شارپ را دیدین؟
نمیدونم کی این سئوالات را طرح کرد!!

سئوال اول این بود (سئوالات سی شارپ) :
1) کدام گزینه ی زیر نمیتواند برای تعریف سطح دسترسی در سی شارپ استفاده شود ؟
1) friend
2) public
3) protected
4) internal

من فکر کردم اون friend را آوردن و فکر میکردم واقعا شوخی میکنن (درباره ی کلمه ی کلیدی friend در سی شارپ) :green: بعد در سئوالات جلوتر (که بهش میرسیم و میگم) ، فهمیدم نه . واقعا منظورشون اینه که جدی یه همچین کلمه ی کلیدی ای در سی شارپ وجود داره .
همچین کلمه ی کلیدی ای وجود نداره دیگه . درسته؟
من همچین چیزی ندیدم توی جستجوهام .

ای . هل شدم ، سئوال 4 به این سادگی را اشتباه زدم :green:ای بابا . اعصاب آدم خورد میشه . من اصلا مشکل زمان داشتم . محدودیت زمان ، تمرکزم را به هم ریخت.
استاد جواب سئوال 14 که در زیر مینویسم ، چی میشه؟ من جواب ندادم :

14) اگر یک فایل اجرایی سی شارپ را چندین بار اجرا کنیم ، چندین پروسس (application process) ایجاد میشود .اگر بخواهیم حتی در صورت چندین بار اجرا ، تنها یک پروسس داشته باشیم ، از کدام گزینه ی زیر میتوانیم استفاده کنیم؟
1) semaphore
2) mutex
3) critical section
4) c# lock

این گزینه هایی که داد (گزینه ی 1 و 2 و 4) ، همه کلاس ها یا کلمه ی کلیدی ای هستن که برای مدیریت و هماهنگ سازی بین نخ ها بکار میرن . گزینه ی 3 هم که "نقطه ی بحرانی" که اصطلاح هست .
مگه از این کلاس ها ، برای اینکه هر بار روی اپلیکشن که کلیک میکنیم ، فقط یکبار پروسه اش اجرا بشه هم میشه استفاده کرد؟
اگه آره ، جوابش کدومه و با کدوم عضو (متد و ...) و چجوری میشه این کار را کرد؟

15) هنگامی که نوع داده ای با استفاده از var تعریف میشود ، در چه زمانی به آن داده تخصیص میبابد؟
1) در زمان runtime
2) در زمان compile
3) در زمان clr
4) در زمان initialize برنامه


منظورش از اختصاص داده ، مشخص کردن نوع داده ای هست یا اختصاص مقدار؟
اصلا یه اصطلاح های دو پهلو استفاده میکنن ، آدم نمیدونه منظورشون چیه .
من گزینه ی 4 را انتخاب کردم (من فکر کردم مشخص شدن نوع داده ای را میگه . هنوز نمیدونم منظورش چیه) . اگه این جوری که من ، منظورش را فهمیدم ، درست باشه (یعنی منظورش نوع داده ای باشه) ، گزینه ی 4 درسته یا گزینه ی 2 ؟
بین شون شک داشتم . هنوز نمیدونم کمپایل ، دقیقا چه زمانی اجرا میشه .
کمپایلر ، وقتی ما داریم کد را مینویسیم ، در حال کار کردن هست یا زمانی که دکمه ی start ویژال استودیو را میزنیم تا برنامه مون اجرا بشه؟
کمپایلر مگه کدمون (یعنی سی شارپ) را به کد ماشین (یعنی پردازنده) تبدیل نمیکنه؟
اگه آره ، پس clr هم که موقع اجرا همین کار را میکنه . پس تفاوت شون چیه؟
جواب این گزینه ، چی میشه؟


16) کدام عبارت زیر در رابطه با Delegateدر سی شارپ ، صحیح نیست ؟
1) Delegate در سی شارپ ، مالتی کَست (multicast) را پشتیبانی نمیکند .
2) Delegate را میتوان پایه ای برای c# event دانست .
3) Delegate در زمان پاس دادنِ یک reference به یک متد ، مورد استفاده قرار میگیرد.
4) Delegate نمیتواند اپراتورهای =+ و =- را پشتیبانی کند .

مالتی کَست در دلیگیت چیه؟
هر چند من گزینه ی 2 را زدم ولی اشتباه کردم . درسته؟
جواب این گزینه ، چی میشه؟


دیگه وقت نداشتم گزینه های 17 تا 20 را بخونم . یعنی 2 درس اول (که زبان و سی شارپ بودن) را دقت نکرده بودم که تایمر داره از اون بالا کم میشه تا حواسم باشه و مدیریت زمان را بهتر توی دستم بگیرم . با این حال ، سئوالاتش را بگم :

18) Garbage Collector ، کدام کارهای زیر را انجام نمیدهد ؟
الف) آزاد کردن حافظه در stack
ب) جلوگیری از memory leaks
ج) آزاد کردن حافظه ی اشغال شده با آبجکت های بدون مرجع (unreferenced objects)
د) بستن دیتابیس های بسته نشده .
ه) بستن فایل های بسته نشده

1) الف ، ب ، ج
2) الف ، د ، ه
3) ج ، ه
4) ب ، د ، ج

منظورش از "آزاد کردن حافظه ی اشغال شده با آبجکت های بدون مرجع (unreferenced objects)" ، اشیاء بدون اشاره گر هست دیگه . درسته؟
بنابراین جواب باید فقط گزینه ی
" د ، ه "
باشه که این گزینه ها در شماره های 1 تا 4 وجود نداره .
درست میگم؟
اگه درست بگم که طرح سئوال شون اشتباست .
اگه غلط بگم ، پس جواب درست کدوم میشه؟
شماره ی 2 میشه؟
به چه دلیل؟

19) کدام الگوی طراحی در تکه کد زیر استفاده شده است؟

کد:
public class A{
private A instance;
private A()
{
}

public static A instance
{
get
{
if (A == null)
A = new A();

return instance;

}
}

}

1) Abstract Factory
2) Singleton
3) Builder
4) Factory

هیچ کدوم از این 4 گزینه را نمیدونم چیه .
احیانا Abstract Factory که همون Abstract نیست . هست؟
فقط میدونم نکته ای که قابل توجه باشه اینه که متد سازنده ی این کلاس private هست و بنابراین نمیشه ازش شی ساخت وبنابراین برای استفاده از این کلاس ، باید از کلاس فرزندش (که در اینجا مشخص نشده) ، شی ساخت .
شاید هم جواب همون گزینه ی 1 باشه . که شبیه abstract ها عمل میکنه چون از کلاس abstract هم نمیشه شی ساخت .


سئوالات شی گرایی را در پست بعدی شاید بنویسم .
خیلی ممنون استاد .
بخاطر اینکه اگه خدا شما را برامون نمیذاشت ، علم خاصی نداشتیم که چه برسه اینها را جواب بدیم . هرچند علمی هم نداریم و هر چند سئوالاتش سخت نبود و آسون بود ولی هر چی برنامه نویسی بلدم ، شما یادم دادین .
:rose:
 

the_king

مدیرکل انجمن
استاد ، سئوالات را دیدین؟
سئوالات سی شارپ را دیدین؟
نمیدونم کی این سئوالات را طرح کرد!!

سئوال اول این بود (سئوالات سی شارپ) :
1) کدام گزینه ی زیر نمیتواند برای تعریف سطح دسترسی در سی شارپ استفاده شود ؟
1) friend
2) public
3) protected
4) internal

من فکر کردم اون friend را آوردن و فکر میکردم واقعا شوخی میکنن (درباره ی کلمه ی کلیدی friend در سی شارپ) :green: بعد در سئوالات جلوتر (که بهش میرسیم و میگم) ، فهمیدم نه . واقعا منظورشون اینه که جدی یه همچین کلمه ی کلیدی ای در سی شارپ وجود داره .
همچین کلمه ی کلیدی ای وجود نداره دیگه . درسته؟
من همچین چیزی ندیدم توی جستجوهام .
نه. friend جزو کلمات کلیدی ++C ئه که اجازه میده یک کلاس یا متد خارجی به اجزاء داخلی و خصوصی کلاس دسترسی داشته باشه، در #C همچین چیزی نیست.

14) اگر یک فایل اجرایی سی شارپ را چندین بار اجرا کنیم ، چندین پروسس (application process) ایجاد میشود .اگر بخواهیم حتی در صورت چندین بار اجرا ، تنها یک پروسس داشته باشیم ، از کدام گزینه ی زیر میتوانیم استفاده کنیم؟
1) semaphore
2) mutex
3) critical section
4) c# lock
با Mutex. گفتم قبلا که Mutex رو سیستم عامل تامین میکنه و می توانید باهاش بین برنامه های مختلف هماهنگی ایجاد کنید.

15) هنگامی که نوع داده ای با استفاده از var تعریف میشود ، در چه زمانی به آن داده تخصیص میبابد؟
1) در زمان runtime
2) در زمان compile
3) در زمان clr
4) در زمان initialize برنامه

منظورش از اختصاص داده ، مشخص کردن نوع داده ای هست یا اختصاص مقدار؟
اصلا یه اصطلاح های دو پهلو استفاده میکنن ، آدم نمیدونه منظورشون چیه .
تنها تفاوت var با سایر تعاریف متغیر های محلی در تشخیص خودکار نوع داده است، نه در زمان مقدار دهی داده.
نوع داده var در زمان کامپایل مشخص میشه، پس اگر سوال نوع داده باشه جواب مشخصه، در زمان compile ئه.
مقدار دهی به متغیر محلی هم که در زمان runtime برنامه است پس اگر سوال مقدار یا داده داخل متغیر باشه، جواب در زمان runtime ئه.
در زمان initialize برنامه هم متغیر های static مقدار دهی میشن.
در زمان clr هم بی معنیه، clr یک عملیات نیست که زمان داشته باشه. مثل اینکه بگید زمان صندلی.

بین شون شک داشتم . هنوز نمیدونم کمپایل ، دقیقا چه زمانی اجرا میشه .
کمپایلر ، وقتی ما داریم کد را مینویسیم ، در حال کار کردن هست یا زمانی که دکمه ی start ویژال استودیو را میزنیم تا برنامه مون اجرا بشه؟
بصورت کلی و فارغ از زبان، برنامه اول کامپایل میشه و بعد کتابخانه های داخلی بهش لینک میشه و فایل اجرایی ساخته میشه (در مجموع Build میشه) و بعد اجرا میشه. تا وقتی کامپایل نشده که نمیتونه اجرا بشه.

کمپایلر مگه کدمون (یعنی سی شارپ) را به کد ماشین (یعنی پردازنده) تبدیل نمیکنه؟
نه. شما که با #C که خروجی Native نمیگیرید. خروجی کامپایلر به زبان ماشین مجازی NET. ئه، پردازنده هم چیزی ازش سر در نمیاره.

اگه آره ، پس clr هم که موقع اجرا همین کار را میکنه . پس تفاوت شون چیه؟
وظیفه CLR ئه که کد ماشین مجازی خودش رو به کد ماشین حقیقی تبدیل کنه. برای همینه که می توانید برنامه ای بسازید که روی ویندوز 64 بیتی 64 بیتی اجرا بشه و روی ویندوز 32 بیتی 32 بیتی.

16) کدام عبارت زیر در رابطه با Delegateدر سی شارپ ، صحیح نیست ؟
1) Delegate در سی شارپ ، مالتی کَست (multicast) را پشتیبانی نمیکند .
2) Delegate را میتوان پایه ای برای c# event دانست .
3) Delegate در زمان پاس دادنِ یک reference به یک متد ، مورد استفاده قرار میگیرد.
4) Delegate نمیتواند اپراتورهای =+ و =- را پشتیبانی کند .

مالتی کَست در دلیگیت چیه؟
multicast همون امکانی است که شما یک رخداد رو به چند متد متفاوت وصل می کنید و همه شون با بروز رخداد اجرا میشن. یعنی شما با بروز یک رخداد می توانید چندین متد رو فراخوانی کنید.
بخاطر همون multicast ئه که از عملگر =+ استفاده میشه، چون داره به جمع قبلی ها اضافه میشه.
حتی یک کلاس اختصاصی MulticastDelegate برای اینکار هست ولی کلا همه delegate ها این خاصیت رو دارند.

18) Garbage Collector ، کدام کارهای زیر را انجام نمیدهد ؟
الف) آزاد کردن حافظه در stack
ب) جلوگیری از memory leaks
ج) آزاد کردن حافظه ی اشغال شده با آبجکت های بدون مرجع (unreferenced objects)
د) بستن دیتابیس های بسته نشده .
ه) بستن فایل های بسته نشده

1) الف ، ب ، ج
2) الف ، د ، ه
3) ج ، ه
4) ب ، د ، ج

منظورش از "آزاد کردن حافظه ی اشغال شده با آبجکت های بدون مرجع (unreferenced objects)" ، اشیاء بدون اشاره گر هست دیگه . درسته؟
بله.

بنابراین جواب باید فقط گزینه ی
" د ، ه "
باشه که این گزینه ها در شماره های 1 تا 4 وجود نداره .
درست میگم؟
اگه درست بگم که طرح سئوال شون اشتباست .
اگه غلط بگم ، پس جواب درست کدوم میشه؟
شماره ی 2 میشه؟
به چه دلیل؟
میدونید که GC اون کار شماره ج رو انجام میده، سوال هم که میگه چه کاری رو انجام نمیده. پس هر جوابی که ج داخلش باشه رو میذارید کنار، یعنی به سادگی گزینه های 1 و 3 و 4 حذف میشن. . میمونه شماره 2 دیگه.

19) کدام الگوی طراحی در تکه کد زیر استفاده شده است؟

کد:
public class A{
private A instance;
private A()
{
}

public static A instance
{
get
{
if (A == null)
A = new A();

return instance;

}
}

}

1) Abstract Factory
2) Singleton
3) Builder
4) Factory

هیچ کدوم از این 4 گزینه را نمیدونم چیه .
احیانا Abstract Factory که همون Abstract نیست . هست؟
فقط میدونم نکته ای که قابل توجه باشه اینه که متد سازنده ی این کلاس private هست و بنابراین نمیشه ازش شی ساخت وبنابراین برای استفاده از این کلاس ، باید از کلاس فرزندش (که در اینجا مشخص نشده) ، شی ساخت .
شاید هم جواب همون گزینه ی 1 باشه . که شبیه abstract ها عمل میکنه چون از کلاس abstract هم نمیشه شی ساخت .
Singleton تون ئه. هر کسی میتونه یک الگوی طراحی اختراع کنه و اسمی براش بذاره. تخصص خاصی نیست، اینها صرفا یک آشنایی با چند الگوی ابتدایی است که ممکنه وقتی میخواهید موردی رو پیاده سازی کنید چند الگو در ذهنتون باشه. وقتی تجربه تون زیاد بشه دیگه نیازی به اینها ندارید، کارآمد ترین پیاده سازی ها رو می نویسید حتی بدون اینکه فکر کنید شبیه چه الگویی شده.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
با Mutex. گفتم قبلا که Mutex رو سیستم عامل تامین میکنه و می توانید باهاش بین برنامه های مختلف هماهنگی ایجاد کنید.

سلامی مجدد
خیلی ممنون استاد.
خوب من دقیق نمیدونستم منظورتون از اینکه Mutex را سیستم عامل تامین میکنه چیه . هنوز هم دقیق متوجه نمیشم .
اگه منظورتون اینه که از api های سیستم عامل از درون کلاس mutex استفاده میشه ، خوب خیلی از کلاس ها این جوری اند .

تنها تفاوت var با سایر تعاریف متغیر های محلی در تشخیص خودکار نوع داده است، نه در زمان مقدار دهی داده.
نوع داده var در زمان کامپایل مشخص میشه، پس اگر سوال نوع داده باشه جواب مشخصه، در زمان compile ئه.
مقدار دهی به متغیر محلی هم که در زمان runtime برنامه است پس اگر سوال مقدار یا داده داخل متغیر باشه، جواب در زمان runtime ئه.
در زمان initialize برنامه هم متغیر های static مقدار دهی میشن.
در زمان clr هم بی معنیه، clr یک عملیات نیست که زمان داشته باشه. مثل اینکه بگید زمان صندلی.
بصورت کلی و فارغ از زبان، برنامه اول کامپایل میشه و بعد کتابخانه های داخلی بهش لینک میشه و فایل اجرایی ساخته میشه (در مجموع Build میشه) و بعد اجرا میشه. تا وقتی کامپایل نشده که نمیتونه اجرا بشه.
نه. شما که با #C که خروجی Native نمیگیرید. خروجی کامپایلر به زبان ماشین مجازی NET. ئه، پردازنده هم چیزی ازش سر در نمیاره.
وظیفه CLR ئه که کد ماشین مجازی خودش رو به کد ماشین حقیقی تبدیل کنه. برای همینه که می توانید برنامه ای بسازید که روی ویندوز 64 بیتی 64 بیتی اجرا بشه و روی ویندوز 32 بیتی 32 بیتی.

الان ، پس کمپایلر ، زمانی شروع به کار میکنه که دکمه ی start در ویژال استودیو را بزنیم . درسته؟
در این زمان ، اول کمپایلر ، زبان سی شارپی که نوشتیم را به زبان clr ترجمه میکنه و زمان اجرا ، clr ، زبان خودش را به زبان پردازنده که همون زبان ماشین هست ، تبدیل میکنه . درسته؟
اگه چیزی که گفتم درست باشه ، پس چرا گفتین :

"نوع داده var در زمان کامپایل مشخص میشه، پس اگر سوال نوع داده باشه جواب مشخصه، در زمان compile ئه."

بنابراین ، نوع داده ای var ، در زمانی که ما داریم کد مینویسیم (در ویرایشگر ویژال استودیو) ، مشخص میشه . چون همون زمان ، وقتی موس را روی متغییری که var بکار بردیم براش ، میبریم ، نوع داده ای اش را مشخص میکنه .
اما اگه چیزی که گفتم درست نباشه ، من باز دقیق منظورتون از تعریف کمپایلر را متوجه نشدم .

multicast همون امکانی است که شما یک رخداد رو به چند متد متفاوت وصل می کنید و همه شون با بروز رخداد اجرا میشن. یعنی شما با بروز یک رخداد می توانید چندین متد رو فراخوانی کنید.
بخاطر همون multicast ئه که از عملگر =+ استفاده میشه، چون داره به جمع قبلی ها اضافه میشه.
حتی یک کلاس اختصاصی MulticastDelegate برای اینکار هست ولی کلا همه delegate ها این خاصیت رو دارند.

آها این مالتی کست هه . همینی که چند متد را با عملگر =+ اضافه میکنیم تا همه شون اجرا بشن .
فقط اصطلاح اش (مالتی کست) را نمیدونستم که اسمش چیه .

میدونید که GC اون کار شماره ج رو انجام میده، سوال هم که میگه چه کاری رو انجام نمیده. پس هر جوابی که ج داخلش باشه رو میذارید کنار، یعنی به سادگی گزینه های 1 و 3 و 4 حذف میشن. . میمونه شماره 2 دیگه.

بله . کار شماره ی "ج" را انجام میده .
ولی شماره ی "الف" را هم انجام میده دیگه . آزاد کردن و اختصاص دادن حافظه ، همه دست GC هست . چه توی استک یا هیپ و ... . خودتون هم قبلا گفته بودین .
بنابراین گزینه ی شماره ی 2 ، گزینه ی "الف" را هم توی خودش داره که صحیح نیست . یعنی گزینه ی شماره ی "الف" که :
"آزاد کردن حافظه در stack"
هست را هم GC انجام میده .
پس جواب ، گزینه ی 2 هم نمیشه .

Singleton تون ئه. هر کسی میتونه یک الگوی طراحی اختراع کنه و اسمی براش بذاره. تخصص خاصی نیست، اینها صرفا یک آشنایی با چند الگوی ابتدایی است که ممکنه وقتی میخواهید موردی رو پیاده سازی کنید چند الگو در ذهنتون باشه. وقتی تجربه تون زیاد بشه دیگه نیازی به اینها ندارید، کارآمد ترین پیاده سازی ها رو می نویسید حتی بدون اینکه فکر کنید شبیه چه الگویی شده.

من این قضیه را متوجه نشدم .

----------------------------------------------

من میگم چرا سئوال 4 به این سادگی را یه جوری قاتی کردم در جواب .
طرح سئوالش را نگاه کنین :

4) خروجی تکه کد زیر کدام است؟
کد:
static void Main(string[] args)
{
byte var1 = 10;
byte var2 = 20;
long result = var1 & var2;
Consol.WriteLine("{0} AND {1} Result : {2}", var1, var2, result);
var1 = 10;
var2 = 10;
result = var1 & var2;
Consol.WriteLine("{0} AND {1} Result : {2}", var1, var2, result);
Consol.ReadLine();
}

1) 0,20
2) 10, 10
3) 0,10
4) 0,0

هر چند جواب گزینه ی شماره ی 3 میشه ولی من سئوال به این سادگی را گزینه ی شماره ی 4 زدم و اشتباه کردم ولی در دید اول من دنبال یه چیز میگشتم . حس میکردم یه چیز کمه .
در واقع باید این جوری گزینه ها را مینوشتن :
کد:
10 AND 20 Result : 0
10 AND 10 Result : 10
 

جدیدترین ارسال ها

بالا