مردم جهان به دو دسته تقسیم می شوند دسته اول کسانی که موافقند مردم جهان به دو دسته تقسیم میشن و دسته دوم کسانی که مخالفند مردم جهان به دو دسته تقسیم میشن

وبلاگ آموزش سی شارپ

سلام خدمت همه شما دوستان عزیز که به من لطف داشتید و وبلاگ رو دنبال کردین...از مباحثی که قصد داشتم مطرح کنم
File,delegate,event
هنوز باقی مونده که احتمالاً تو تابستون می گم...شاید هم نگفتم هیچ وقت!:D
به هر حال ادامه آموزش رو تو درس ساختمان داده می گم! به آدرس زیر:
http://datastructurekelas.blogspot.com
تا اطلاع ثانوی موفق باشید!:D

۱۳۸۸ شهریور ۷, شنبه

readonly , GC.Collect

چیز هایی که امروز می خوام خیلی چیز های مهمی نیستن...البته فعلاً بعداً بیشتر کاربرد پیدا می کنن

کلمه کلیدی readonly

همون طور که قبلاً هم گفتم این که کمترین سطح دسرسی رو برای هر چیزی قائل بشیم از اصول مهندسی نرم افزار خوب هست!

این کلمه کلیدی کاری که می کنه اینه که متغیر رو فقط یک بار میشه بهش مقدار داد و دیگه کار دیگه ای روش نمیشه کرد!

private readonly int real;


مثل بالا هم ازش استفاده میشه!

مورد بعدی پاکسازی حافظه هست!

تو ++C ما هر وقت می خواستیم حافظه رو پاک می کردیم! اما تو #C پاکسازی حافظه خود به خود صورت می گیره و ما فقط می تونیم کاری کنیم که زود تر حافظه پاکسازی بشه! ولی زمانش رو نمی تونیم تعیین کنیم! با استفاده از متد GC.Collect این کار رو انجام می دیم! اون هم به این صورت که اسم متد اسم سازنده و کاراکتر هم نداره مثلاً سازنده Mydate رو که قبلاً هم داشتیم به این صورت پاکسازیش رو سریع تر می کنیم:

~mydate()
{
}

توجه کنیم که متدهای پاکسازی حافظه سطح دسترسی و مقدار برگشتی ندارن

۱۳۸۸ شهریور ۱, یکشنبه

enumeratiom

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

enum Days { sat , sun , mon , tue , wed , thu , fri }

Days اسمش هست!

مقادیرشون هم:
sat = 0
sun = 1
mon = 2
tue = 3
wed = 4
thu = 5
fri = 6

یکی از ویژگی هاش اینه که ما می تونیم مقدار دهی رو خودمون انجام بدیم!

enum Days { sat=5 , sun , mon , tue , wed=11 , thu , fri }

مقادیرشون هم:
sat = 5
sun = 6
mon = 7
tue = 8
wed = 11
thu = 12
fri = 13

این مقدار ها به طور پیش فرض با int مقدار دهی میشن! ولی خودمون می تونیم تغییر بدیم! مثلاً:

enum Days : long { sat , sun , mon , tue , wed , thu , fri }

یک برنامه ساده :

using system;
enum Days : short
{
sat , sun , mon , tue , wed , thu , fri
}
class Program
{
{
static void Main()
for( Days d = Days.sat ; d <= Days.fri ; d++ )
Console.WriteLine(d);
}
}

یا Constructors سازنده ها

سلام!

امروز می خوام سازنده ها رو بگم!

سازنده ها چی هستن؟!

سازنده ها تنها کاری که می کنن اینه که مقدار دهی اولیه میکنن!

مثلاً شما یک کلاس نوشتی که چهار تا متغیر داره که باید مقدار دهی بشن! ممکنه کاربر 3تاش رو وارد نکنه! در این صورت یا باید پیغام خطایی بهش نشون بدین که بگین داداش این ها رو وارد کن! یا این که باید به صورت پیش فرض مقادیری رو خودتون وارد کنید!

و این سازنده ها هیچ کار دیگه ای انجام نمیدن! نذاشتی هم نذاشتی! ولی چیز مفیدیه
این طوری هم تعریف میشن که اسم کلاس اولش یه سطح دسترسی می ذاریم و متغیری که می خوایم مقدار دهی کنیم معرفی می کنیم!

مثلاً:

using system;
calss MyDate
{
private int year , month , day ;
public MyDate() : this(1 , 1 , 1) { }
public MyDate(int y) : this(y , 1 , 1) { }
public MyDate(int y , int m) : this(y , m , 1) { }
public MyDate(int y , int m , int d)
{
Year = y ;
Month = m ;
Day= d ;
}
و بقیه برنامه!
حالا تک تک توضیح می دم:
public MyDate() : this(1 , 1 , 1) { } :
اگر کاربر هیچ مقداری رو وارد نکنه برای سه تا متغیر year , month , day مقدار یک رو وارد می کنه!

public MyDate(int y) : this(y , 1 , 1) { }
اگر کاربر فقط مقدار سال رو وارد بکنه برای 2تا متغیر دیگه مقدار یک پیش فرض قرار داده میشه!

public MyDate(int y , int m) : this(y , m , 1) { }
اگر کاربر مقدار سال و ماه رو وارد کنه مقدار روز رو به صورت پیش فرض یک قرار میده!

public MyDate(int y , int m , int d)
{
Year = y ;
Month = m ;
Day= d ;
}

این جا کاربر هر 3تا مقدار رو وارد می کنه تمام سازنده های قبلی بعد از اجرا شدن به این قسمت میان تا مقدار متغیر های تازه تعریف شده مشخص بشه و بزرگ شدن حروف اول year , month , day برای همون مساله محدودیت دسترسیه! این طوری دیگه نیازی نیست که property تعریف کنید براشون!

Blogged with the Flock Browser

۱۳۸۸ مرداد ۲۷, سه‌شنبه

property

خب اما Property ها یا ویژگی ها به قول یه آقای بسیار محترمی ووژگی:D

یکی از اصول برنامه نویسی اینه که ما کمترین سطح دسترسی رو برای هر چیزی قائل بشیم!

پس طبق مطلب قبلی میایم کلاسمون رو این طوری تعریف می کنیم:

using system;
class Complex
{
private double real , img ;
.
.
.
.
.
........
}

خب! همون طور که گفتم private فقط تو خود کلاس قابل دسترسیه!یعنی فقط تو کلاس Complex
حالا اگه بخوایم توی کلاس Program از این ها استفاده کنیم تکلیف چیه؟! مثلاً بخوایم بگیم:

Complex c1 = new Complex () ;
c1.real = 3;
c1.img = 4;

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

using system;
class Complex
{
private double real , img ;
public double Real
{
get
{
return real ;
}
set
{
real = value ;
}
}
public double Img
{
get
{
return img;
}
set
{
img = value;
}
}
.
.
.
.
.
.
..........
}

همون طور که می دونی C# به حروف بزرگ و کوچیک حساسه! پس برای این که بتونیم از متغیر هایی که private تعریفشون کردیم تو برنامه اصلیمون استفاده کنیم میایم proprty هایی میسازیم با همون اسم با این تفاوت که حرف اولش حرف بزرگه! البته این استانداردشه وگرنه شما اسمش رو بذار جومونگ! اگه کسی بهت چیزی گفت فقط تو برنامه اصلی برای این که دسترسی داشته باشی باید از جومونگ استفاده کنی!
پس برای این که به c1 مقدار بدیم این کار رو می کنیم!:

Complex c1 = new Complex () ;
c1.Real = 3 ;
c1.Img = 4 ;
به حروف بزرگ و کوچیک Real , real و Img , img توجه کنید!

حالا مثلاً جومونگ تعریف می کنیم!:

public double jumoong
{
get
{
return real ;
}
set
{
real = value ;
}
}
public double joomong
{
get
{
return img ;
}
set
{
img = value ;
}
}

تو program باید این طوری استفاده کنیم:

Complex c1 = new Complex () ;
c1.jumoong = 3 ;
c1.joomoong = 4 ;

-----------------------------------------------------
set برای گرفتن مقدار هست یعنی اگر set نباشه نمی تونیم مقداری رو به real , img بدیم!
get هم برای دسترسی هست ! البته کاربرد های قشنگ تری هم داره که بعداً بهش می رسیم!

Blogged with the Flock Browser

برخی از مفاهیم

public:
چه تابع باشه چه متغیر باشه همه بهش دسترسی دارن!

private:
فقط در خود کلاس بهش دسترسی داریم!

protected:
فقط توی برنامه بهش دسترسی داریم مربوط میشه به بحث dll

stack:
خب این یه قسمتی از حافظه هست که مقادیری توش ذخیره میشه یه نوع reference و نوع دیگه value هست دقیقاً نمی دونم ولی فکر کنم reference به یک قسمت از stack اشاره می کنه و value مقدار رو تو خودش نگه میداره!  دوستانی که وارد تر هستن کمک کنن ممنون میشم!

static:
یکی از خواص توابع هست! وقتی یک تابه رو static تعریف می کنیم که تابع مربوط به یک شی باشه! مثلاً تابع جمع استاتیک تعریف نمی کنیم! ولی مثلاً تابعی که می خواد مقدار real و image یک عدد مختلط رو بخونه رو استاتیک تعریف میکنیم!

فعلاً چیز دیگه ای به ذهنم نمیرسه! اگر رسید اضافه می کنم تو همین پستم! 
Blogged with the Flock Browser

۱۳۸۸ مرداد ۲۰, سه‌شنبه

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

خب! گفتم که اول یک برنامه با کلاس بنویسم که ببینی چه جوری میشه! مطلب بعدی رو در مورد یه سری مفاهیم می خوام بگم مثل
public
satic
stack
private
.
.
.
.....

فایل Complex.cs شامل تعریف تایپ Complex

using System;
class Complex
{
public double real, img;
public void Read()
{
Console.WriteLine("Real:");
real = Convert.ToDouble(Console.ReadLine());
Console.WriteLine("img:");
img = Convert.ToDouble(Console.ReadLine());
}
public static Complex plus(Complex c1, Complex c2)
{
Complex c3 = new Complex();
c3.real = c1.real + c2.real;
c3.img = c1.img + c2.img;
return c3;
}
public void Write()
{
char sign;
sign= (img > 0) ? '+' : '-';
Console.WriteLine("{0}{1}{2}i",real,sign,Math.Abs(img));
}
}

فایل Program.cs شامل متد Main

using System;

class Program
{
static void Main()
{
Complex c1=new Complex();
Complex c2 = new Complex();
Console.WriteLine("Complex Number 1:");
c1.Read();
Console.WriteLine("Complex Number 2:");
c2.Read();
Complex c3;
c3 = Complex.plus(c1, c2);
Console.WriteLine("result : ");
c3.Write();
Console.Read();
}
}
سوال: چرا c3 مثل c2 , c1 تعریف نشده؟!
جواب: به عهده دانش آموز می باشد:D
جواب: c3 رو می تونیم مثل اون 2تایه دیگه هم تعریف کنیم! هیچ مشکلی پیش نمیاد! اما از اونجایی که می خوایم بهش مقدار بدیم هیچ احتیاجی نیست که اون رو به صورت یک شی طریف کنیم و می توینم به صورت یک متغیر از جنس اعداد مختلط تعریف کنیم!
حالا اگه همین طوری که نوشتیم بخوایم به c3 مقدار بدیم! یعنی این طوری:
c3.real=0;
c3.img=2;

این طوری هم مشکل داره! درسته که ما به c3 مقدار می دیم اما به خودش مقداری نمی دیم به اجزائش مقدار میدیم! برای همین زمان اجرا کردن به شما می گه c3 مقداری نداره!
Blogged with the Flock Browser

ایجاد یک کلاس

خب!

حالا می خوایم یک کلاس از جنس اعداد مختلط درست کنیم!

class Complex
{
public double real , img ;
}

خب اولین چیزی که به ذهنتون می رسه اینه که الاف کردی ما رو؟!این که همون struct هست

خب واقعیتش اینه که این 2تا خیلی شبیه به هم هستن! ولی تفاوت های مهمی دارن

اولین تفاوتشون مربوط به سازنده ها هست! چون هنوز نگفتم سازنده ها رو توضیحی در موردش نمی دم

مورد بعدی اینه که وقتی که یک کلاس میسازیم از اعداد مختلط می توینم مقدار دهی اولیه اش بکنیم! ولی struct رو نمی تونیم!

مثلاً
class Complex
{
public double real = 0;
public double img;
}
در مورد بالا مشکلی به وجود نمیاد!
اما:
struct Complex
{
public double real = 0;
public double img;
}
اینجا ما مشکل داریم : خطای زمان کامپایل

خب! حتماً الان دارین می گین که وای وای چه تفاوت مهمی! ولی در واقع خیلی مهم تر از اونیه که به نظر میاد

یک جمله کلیدی:
ساختارها انواع مقداري هستند و مستقيماً مقدار را در خود نگه مي‌دارند و از اينرو در stack نگه‌داري مي‌شوند. استفاده از ساختارها همانند ساير انواع مقداري است.
( http://learn.hge.ir/?name=learn_csharp.net_12 )

خب! stack نمی دونی چیه؟! stack یه قسمت از حافظه هست! اگر اطلاعات بیشتری می خوای این بار خودت باید بری بگردی! و بفهمی که چی هست! چون استک مربوط به بحث های قبل میشه و بخوام برگردم توضیح بدم نمیشه دیگه! خودت برو پیدا کن! البته اگه واقعاً نیاز داشتی بگو تا بگم! البته بعداً در موردش حتماً توضیح می دم ولی بعداً کی هست نمی دونم!

Blogged with the Flock Browser

۱۳۸۸ مرداد ۱۵, پنجشنبه

پیوست پست قبلی

فایل Complex.cs شامل تعریف ساختمان Complex

برای ساختن این فایل تو قسمت solution Explorer اسم پروژه که احتمالاً ConsoleApplication هست کلیک راست می کنیم و add و بعد class رو می زنیم و یک کلاس اضافه می کنیم و توی کلاسمون هرچی هست پاک می کنیم و اون چیزی رو که تو قسمت قبل نوشتم رو paste می کنیم!

out

ما وقتی که یک تابع داریم با return فقط یک چیز رو می تونیم برگردونیم اما این جا ما احتیاج داشتمی که مقدار حقیق و تصویر عدد مختلط رو برگردونیم برای این که از out استفاده می کنیم!

(c.img> 0) ? '+' : '-';

این قسمت همون دستور If هست که این می تونیم این طوری هم بنویسیم:

if(c.img> 0)
+
else
-

Blogged with the Flock Browser

تایپ struct

این شاید مقدمه ای باشه برای بحث شی گرا این تایپ رو به صورت زیر تعریف می کنیم

struct structuer-type-name
{
public data-type field;
public data-type field;
...
...
...
public data-type field;
}

مثلاً می خوایم با این تایپ اعداد مختلط رو بیان کنیم!
(اگر نمی دونی عدد مختلط چیه بگو تا یه مثال دیگه بزنم!)
struct Complex
{
public float real;
public float img;
}

float مربوط به مقادیر اعشاری هست!
حالا ما یک شی از یک عدد مختلط داریم
همون طور که در قسمت مفهوم شی گرا گفتم این مثل یک طرح یا نقشه از یک عدد مختلط می مونه! و برای این که بتونیم ازش استفاده کنیم یک عدد مختلط نیاز داریم نه طرح یک عدد مختلط! پس یک عدد مختلط می سازیم!

Complex c1 = new Complex ()

حالا یک عدد مختلط داریم به اسم c1
حالا می تونیم با عدد مختلط کار کنیم! مثلاً یه سری مقدار بهش بدیم و معرفیش کنیم!

c1.real = 2.3 ;
c1.img = 1 ;

حالا برای این که بهتر متوجه بشیم یه برنامه می نویسیم!
فایل Complex.cs شامل تعریف ساختمان Complex
using system;
struct Complex
{
public double real,img;
}
////////////////////////
فایل Program.cs شامل متد Main
using system;
class Program
{
static void Main()
{
Complex c1 , c2 ;
Console.WriteLine ("Complex Number 1 :");
ComplexRead (out c1);
Console.WriteLine ("Complex Number 2 :");
ComplexRead (out c2);
Complex c3;
c3 = ComplexPlus ( c1 , c2);
Console.Write("The result complex number: ");
ComplexWrite(c3);
}
public static void ComplexRead(out Complex c)
{
Console.Write("Real:");
c.real = Convert.ToDouble(Console.ReadLine());
Console.Write("img(image):");
c.img = Convert.ToDouble(Console.ReadLine());
}
public static void ComplexPlus(out Complex c1 , out Complex c2)
{
Complex c3;
c3.real = c1.real + c2.real;
c3.img= c1.img + c2.img;
return c3;
}
public static void ComplexWrite(out Complex c)
{
char sign;
sign = (c.img> 0) ? '+' : '-';
Console.WriteLine("{0} {1} {2}i",c.real,sign,Math.Abs(c.img));
}
}
قسمت هایی که قرمز شده احتیاج به توضیح داشت که توی پیوست و پست بعدی توضیحاتش رو نوشتم!
پیوست


Blogged with the Flock Browser

۱۳۸۸ مرداد ۱۴, چهارشنبه

مفهموم شی گرا

خب می خوایم مفهموم شی گرا رو بررسی کنیم!

با یه مثال شروع می کنم!

ما یه نقشه داریم که توش نقشه یک آشپزخونه هست

حالا ما می خوایم غذا درست کنیم

برای غذا درست کردن قطعاً نمی تونیم از آشپزخونه ای که تو نقشه هست استفاده کنیم! باید یک نمونه از روی نقشه آشپرخونه بسازیم تا بتونیم توی اون آشپرخونه غذا درست کنیم!

پس ما یک شی داریم به اسم آشپزخونه و برای استفاده از اون باید یک شی بسازیم از روی آشپزخونه

یعنی این که نقشه آشپزخونه مفهوم و ویژگی های آشپزخونه هست! ولی برای ساختن آشپزخونه باید یک شی از روی آشپزخونه بسازیم


یا مثلاً می گیم که هرچیزی که ارتفاعش بیشتر از یک متر باشه و 4تا پایه هم داشته باشه مثلاً میزه این مفهوم و ویژگی شی میزه! حالا واسه این که یک میز داشته باشیم باید با استفاده از مفاهیم شی میز یک میز بسازیم!

ما در برنامه نویسی شی گرا اول شئی رو که می خوایم ازش استفاده بکنیم رو ویژگی هاش رو می گیم و بعد ازش استفاده می کنیم!

مثلاٌ ما تو یه برنامه احتیاج داریم که اسم طرف رو بگیریم و سن طرف رو!
برای این کار می گیم که یک شی تعریف می کنیم به اسم مشخصات!

می گیم شی مشخصات شامل اسم طرف و سن طرف هست!

و هروقت که بخوایم اسم و سن طرف رو بگیریم! میگیم یک شی مشخصات بساز که خودش خود به خود شامل اسم و سن طرف هست!

موفق باشی!

شی گرا
Blogged with the Flock Browser