#C چیست؟

در ابتدا لازم است ذکر کنم مطالب این وبلاگ اکثرا برگرفته از کتاب آقای هاشمیان است که سعی شده بصورت خلاصه و منبعی برای مراجعه سریع باشد در ادامه سعی خواهم کرد از منابع دیگر  مطالب متنوع تری بیاورم.

زبان #C نسخه کامل شده زبانهای C و ++C است که در آن سعی شده از ویژه گیهای خوب زبانهای دیگر الهام گرفته شود و در عین حال کاستی های آن زبانها برطرف شود.

ایجاد یک برنامه در #C بسیار راحتتر از ایجاد برنامه در محیط ++C است ولی با همه این سادگی #C زبان قدرتمندی است بطوری که تمام کارهایی که در ++C میتوان انجام داد در #C نیز میتوان انجام داد.

بعضی مواقع کدهای #C طولانی تر از کدهای ++C است علت این است که #C برخلاف ++C یک زبان Type-Safe است یعنی در #C زمانی که نوع داده ای یک متغیر مشخص شد آن متغیر دیگر نمیتواند به نوع داده ای دیگری تبدیل شود علاوه بر این محدودیتهای دیگری نیز هنگام تبدیل یک نوع داده ای به نوع دیگر وجود دارد که باعث میشود کدهای #C نسبت به کدهای ++C طولانی تر بنظر برسد ولی با این حال کدهای #C از پایداری بیشتری برخوردارند و خطایابی آن آسانتر است.

#C از چارچوب NET. استفاد ه میکند بنابراین هرنوع برنامه ای را میتوان با آن نوشت ولی اکثر برنامه هایی که با  نوشته میشوند جزء یکی از موارد زیر هستند

برنامه های مبتنی بر ویندوز
این نوخ برنامه ها مانند office دارای ظاهر آشنای ویندوزی هستند این نوع برنامه ها بوسیله فضای نام مربوط به برنامه های ویندوزی در چارچوب NET. نوشته میشود ای فضای نام شامل کنترلهایی از قبیل دگمه های فرمان و نظیر آن است که بوسیله آنها میتوان رابط گرافیکی برنامه را طراحی کرد.
برنامه های مبتنی بر وب
این برنامه ها شامل یک یا چند صفحه وب است چاچوب وب دارای یک سیستم قوی برای ایجاد صفحات وب و تامین امنیت آنهاست این سیستم ASP.NET نام دارد و شما میتوانید با استفاده از #C و ASP.NET برنامه های مبتنی بر وب ایجاد کنید
سرویس های وب
وب سویس ها یک روش جدید و جالب برای ایجاد برنامه های توزیع شدنی مبتنی یر وب هستند با استفاده از وب سرویس ها میتوان هرنوع اطلاعاتی را بین برنامه های مختلف از طریق اینترنت منتقل کرد

در هریک از موارد بالا درصورت نیاز به ارتباط با بانک اطلاعاتی از سیستمی به نام ADO.NET در NET. استفاده میشود

متغیرها

متغیر مکانی است که میتوانید مقداری را در آن ذخیره کرده و هرجا که نیاز داشتید از آن استفاده کنید

کار با متغیرها
در #C هنگام تعریف متغیر باید نوع آن را مشخص کرد به مثال زیر توجه کنید

;int intNumber   

در مثال بالا یک متغیر با نام intNumber از نوع integer تعریف کردیم int در #C یک کلمه کلیدی است که مشخص کننده نوع integer یا همان عدد صحیح است

نکته: در #C هر دستوری به ; ختم میشود

میتوانیم مقدار متغیر را هنگام تعریف متغیر مشخص کنیم

;int intNumber = 27     

دستور زیر یک واحد به مقدار متغیر intNumbet اضافه میکند

; intNumber = intNumber + 1   

توضیحات
هنگامی که برنامه ای را مینویسید باید بدانید که ممکن است در آینده خود شما یا کس دیگری نیاز داشته باشد که کد برنامه را ویرایش کند لذا بهتر است از توضیحات در کد خود استفاده کنید
توضیحات بخشی از برنامه هستند که توسط کامپایلر نادیده گرفته میشود و شما میتوانید در این قسمت هر چیزی و به هر زبانی بنویسید برای نوشتن توضیحات از دو اسلش استفاده میشود

   Define a variable for intNumber //
;   int intNumber
  Set the initial value //
;  intNumber = 27
   Add 1 to the value of intNumber //
;  intNumber = intNumber + 1

استفاده از این مطالب با ذکر منبع بلامانع است

تصمیم گیری در برنامه

الگوریتم ها همواره دارای تصمیماتی هستند در واقع این تصمیمات هستند که باعث میشوند کامپیوتر بتواند وظیفه خود را بخوبی انجام دهد.

دستور If

راحت ترین روش برای تصمیم گیری در #C استفاده از دستور if است.

(private void btnIf_Click(object sender, EventArgs e
}
   Declare and set a variable 
//
;  int intNumber = 27
 
   Here's where you make a desicion
//
  and tell the user what happend  //
( if (intNumber == 27
  }     
;(" MessageBox.Show("intNumber' is, indeed, 27!", "Simple If      
{      
{

قطعه کدی که درون آکولاد پایین if قرار دارد فقط زمانی اجرا میشود که مقدار متغیر intNumber برابر 27 باشد به عبارت دیگر هنگامی که شرط داخل پرانتز true یا درست باشد کد داخل بلاک if اجرا میشود.

دستور Else

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

(private void btnAnotherIf_Click(object sender,EventArgs  e
          } 
 Declare and set a variable
//
;  int intNumber = 27
 
   Here’s where you make a decision
//
  and tell the user what happened
//
 ( if (intNumber == 1000
  }    
 ;("MessageBox.Show("intNumber’ is, indeed, " + "1000!", "Simple If     
  {    
  else
 }    
   ; ("MessageBox.Show("‘intNumber’ is not 1000!", "Simple If    
  {     
{

بررسی چند شرط با Else if

زمانیکه لازم باشد بیش از دو حالت تست شود میتوان از دستور Else if استفاده کرد.

(private void btnAnotherIf_Click(object sender,  EventArgs e
}
  
Declare and set a variable//   
 
; int intNumber = 27   
 Here’s where you make a decision
//   
   and tell the user what happened
//     if (intNumber == 1000   
}     
  
;(" MessageBox.Show("‘intNumber’ is, indeed, " + "1000", "Simple If     
  {      
 ( else if (intNumber == 27    
  }        
  ("MessageBox.Show("‘intNumber’ is 27!", "Simple If        
  {         
  else    
  }        
;("MessageBox.Show("‘intNumber’ is neither 1000" +" nor 27!", "Simple If        
  {         
{

دستورات If تودرتو

علاوه بر استفاده متوالی از دستور If میتوان داخل بلاک یک If از If دیگری استفاده کرد.

(if (intX > 3
}
;("MessageBox.Show("intX is greater that 3" "Sample If     
(if (intX == 6     
;(" MessageBox.Show("intX is 6!", "Sample If          
{

استفاده از این مطالب با ذکر منبع بلامانع است.

متدها

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

چرا از متدها استفاده میکنیم؟

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

مثال:

(private void btnAdd_Click(object sender, EventArgs e
}
   Define a variable for intNumber
//
;  int intNumber
 
  Set the initial value
//
;  intNumber = 27
 
   Add 1 to the value of intNumber
//
;  intNumber = intNumber + 1
 
   Display the new value of intNumber
//
;("MessageBox.Show( "The value of intNumber + 1 = " +  intNumber, "Variables
{

این کد یک متد است زیرا قطعه کدی مجزاست که کار خاصی را انجام میدهد.

یک متد بصورت زیر تعریف میشود.

(private void btnAdd_Click(object sender, EventArgs e

درباره کلمه private در بخشهای آتی صحبت خواهیم کرد
کلمه void به کامپایلر میگوید که تابع هیچ مقداری را برنمیگرداند اگر تابع مقداری را برگرداند بجای void نوع آن مقدار نوشته میشود مثلا int.
کلمه btnAdd_Click نام متدی است که تعریف کردیم
داخل پرانتز پارامترهایی است که به تابع فرستاده میشود درمورد این پارامترها دربخش های بعدی بیشتر صحبت خواهیم کرد.

نکته

هنگامی که یک متد شروع بکار میکند متغیرهایی که در محدوده آن تعریف شده اند(بین دو آکولاد) محدوده فعلیت محلی میگیرند یعنی متغیر در محدوده متد جاری قابل دسترسی و معتبر است

استفاده از این مطالب با ذکر منبع بلامانع است

نگهداری متغیرها

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

دودویی

کامپیوترها برای نگهداری هر اطلاعاتی از سیستم دودویی استفاده میکنند هر داده ای در کامپیوتر باید در قالب صفر و یک نگهداری شود برای نمونه عدد 27 در سیستم دودویی بصورت 11011 میباشد.
درمبنای ده یا همان سیستم ده دهی برای تعیین ارزش هر عدد هر رقم از آن در توانی از ده ضرب میشود اولین رقم از سمت راست در ده به توان صفر ضرب میشود دومین عدد در ده به توان یک و به همین صورت ادامه پیدا میکند.
همین روش در سیستم باینری هم وجود دارد براب تبدیل یک عدد در مبنای دو به یک عدد در مبنای ده باید رقم ها را از راست یکی یکی جدا کرده و در دو به توان شماره مکان آن عدد ضرب کرد سپس تمام اعداد به دست آمده باهم جمع میشوند. عدد نهایی نمایش دهنده شکل دهدهی آن عدد است.

11011   =>     27 =1+2+08+16=(1*0^2)+(1*1^2)+(0*2^2)+(1*3^2)+(1*4^2)

بیت ها و بایت ها

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

نمایش مقادیر

بیشتر کامپیوترهای امروزی 32 بیتی یا 64 بیتی هستند یعنی در هرلحظه میتوانند با داده هایی به طول 32 یا 64 بیت کارکنند.
هر عدد 32 بیتی میتواند مقادیری در محدوده  2147483647
تا 2147483647 را نگهداری کند.
اگر یک متغیر از نوع صحیح تعریف کنید و مقدار آن چه 1 باشد یا 2147483647 باشد دقیقا 32 بیت از حافظه را اشغال میکند.
در رشته ها هرکاراکتر دوبایت یا شانزده بیت از حافظه را اشغال میکند بنابرین برای نمایش رشته 13 کاراکتری  
"Hello, World!" به 26 بایت حافظه نیاز خواهد بود. برای ذخیره رشته ها در حافظه هر کاراکتر به یک عدد خاص تبدیل میشود میشود این عدد براساس استانداردی به نام یونیکد به هر عدد اختصاص داده میشود.
به عنوان مثال کاراکتر "6" دارای یونیکد 54 است که معادل باینری آن 0000000000110110 میباشد و همین عدد باینری بجای کاراکتر "6" در حافظه ذخیره میشود.

استفاده از این مطالب با ذکر منبع بلامانع است.


استفاده از تاریخ ها

یکی دیگر از انواع داده ای که کاربرد زیادی دارد تاریخ ها هستند
متغیر تاریخ در #C با DateTime تعریف میشود

;DateTime dteDate
;dteDate = DateTime.Now

در کد بالا مقدار متغیر dteDate برابر با تاریخ و زمان کنونی میشود

قالب بندی تاریخ ها

اگر تنظیمات محلی کامپیوتر بر اساس ایران باشد تاریخ بصورت YYYY/MM/DD نمایش داده خواهد شد ولی اگر تنظیمات محلی کامپیوتر براساس مثلا انگلیس باشد بصورت DD/MM/YYYY نمایش داده خواهد شد
میتوان نحوه نمایش تاریخ را مشخص کرد طوری که در هر کامپیوتری با هر تنظیمات محلی به یک صورت نمایش داده شود ولی بهتر است اجازه دهید نمایش تاریخ بر اساس تنظیمات محلی کامپیوتر باشد

 Display dates //
;("MessageBox.Show(dteDate.ToLongDateString(), "Date Demo
;("MessageBox.Show(dteDate.ToShortDateString(), "Date Demo
Display times//

;("MessageBox.Show(dteDate.ToLongTimeString(), "Date Demo
;("MessageBox.Show(dteDate.ToShortTimeString(), "Date Demo

در کدهای بالا هیچ ابهامی وجود ندارد و نام توابع مشخص کننده کار آنهاست

استفاده از خاصیت های DateTime

;("MessageBox.Show("Day: " + dteDate.Day, "Date Demo
;("MessageBox.Show("Month: " + dteDate.Month, "Date Demo
;("MessageBox.Show("Year: " + dteDate.Year, "Date Demo
;("MessageBox.Show("Hour: " + dteDate.Hour, "Date Demo
;("MessageBox.Show("Minute: " + dteDate.Minute, "Date Demo
;("MessageBox.Show("Second: " + dteDate.Second, "Date Demo
;("MessageBox.Show("Day of week: " + dteDate.DayOfWeek, "Date Demo
;("MessageBox.Show("Day of year: " + dteDate.DayOfYear, "Date Demo

به کدهای زیر توجه کنید

 Add a day and display the results //
;(dteChangedDate = dteStartDate.AddDays(1
Add some months and display the results //
;(dteChangedDate = dteStartDate.AddMonths(6
 
Subtract a year and display the results//
;(dteChangedDate = dteStartDate.AddYears(-1

این توابع برای اضافه کردن روز ماه سال به تاریخ استفاده میشود برای کم کردن یک عدد منفی به تابه میفرستیم متدهای مهم دیگر در این نوع داده ای عبارتند از: AddHours,AddMinutes ,AddSeconds  AddMiliseconds

استفاده از این مطالب با ذکر منبع بلامانع است

تبدیل نوع های داد های

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

برای تبدیل یک عدد اعشار به عدد صحیح از int استفاده میشود

;intNumber = (int)dblNumber

برای تبدیل نوع رشته ای به نوع صحیح از تابع int.Parse استفاده میشود

;(intNumber = int.Parse(str1

برای تبدیل نوع رشته ای به نوع اعشار از تابع double.Parse استفاده میشود

;(dblNum1 = double.Parse(str1

استفاده از این مطالب با ذکر منبع بلامانع است

کار با رشته ها

رشته مجموعه ای از کارکترهاست که با علامت نقل قول در ابتدا و انتهای آن مشخص می شود برای تعریف متغیری که بتواند رشته را در خود نگه دارد از کلمه کلیدی string در #C استفاده می شود

;string strData
;"strData = "Hello world

اتصال رشته ها با + انجام می شود

 Declare variables //
; string strOne
; string strTwo
; string strResults
Set the string values //
;" strOne = "Hello
;"strTwo = "World
Concatenate the strings //
; strResults = strOne + strTwo
Display the results //
;(" MessageBox.Show(strResults, "Strings

تابع MessageBox با متد  Show باعث میشود رشته strResults در یک پنجره پیغام نمایش داده شود

تابع Length طول رشته را بدست میدهد:

;string strData
;int n
;"strData = "Hello world;n=strData.Length

در کد بالا مقدار n برابر تعداد حروف رشته Hello world خواهد شد توجه کنید فاصله خالی بین دوکلمه نیز حساب میشود.

انتخاب زیررشته با تابع Substring

;string strData
; string strData2
;"strData = "Hello world
;(strData2 =strData.Substring(0, 5

کد بالا باعپ میشود کلمه Hello در متغیر strData2 ذخیره شود 0 مکان شروع انتخاب و 5 طول زیررشته انتخابی را مشخص میکند.

جایگزینی زیررشته با تابع Replace

; string strData
; string strData2
;"strData = "Hello world
;("strData2 =strDataReplace("Hello", "Goodbye

کد بالا سبب میشود در متغیر strData کلمه Goodbye با کلمه Hello جایگزین شود و نتیجه که
Goodbye world است در متغیر strData2 ذخیره شود.

استفاده از این مطالب با ذکر منبع بلامانع است

کار با اعداد

اعداد صحیح

عدد صحیح در #C با کلمه کلیدی int تعریف میشود

;int intNumber
دستور زیر مقدار فعلی متغیر intNumber را با 7 جمع می کند
;intNumber = intNumber + 7
دستور زیر همان کار بالا را انجام می دهد
;intNumber += 7
مزیت این نوع کدنویسی کوتاه شدن کدها و تندنویسی است نمونه های زیر را ببینید
;intNumber -= 2
;intNumber *= 10
;intNumber /= 6
محدودیت کار با اعداد صحیح:
شما نمیتوانید عددی داشته باشید که دارای قسمت اعشاری باشد
;int intNumber = 34
;intNumber *= 10.234
کد بالا خطا خواهد داد چرا که intNumber یک متغیر از نوع صحیح است و نمی تواند مقدار اعشاری ذخیره کند
در تقسیم دوعدد نیز اگر بخواهیم یک عدد صحیح را بر یک عدد اعشاری تقسیم کنیم خطایی رخ خواهد داد به کد زیر توجه کنید
; int intNumber = 12
; intNumber /= 7
در این کد خطایی تولید نمیشود چراکه دو عدد صحیح یعنی 12 را بر 7 تقسیم کردیم ولی فقط قسمت صحیح حاصل تقسیم در متغیر intNumber ذخیره میشود و قسمت اعشار حذف میشود

اعداد اعشاری
اعداد اعشاری در #C با کلمه کلیدی double و float تعریف میشوند
;double dblNumber
تمام عملیاتی که درباره اعداد صحیح گفته شد درمورد اعداد اعشاری نیز درست است
; dblNumber = 45.34
; dblNumber *= 4.333
; dblNumber = 12
; dblNumber /= 7
در #C دو نوع عدد اعشاری وجود دارد
1-اعداد اعشاری با دقت معمولی
2-اعداد اعشاری با دقت مضاعف
اعداد اعشاری با دقت معمولی با کلمه کلیدی float تعریف میشوند و میتوانند اعداد در بازه
[-1.7*308^10,+1.7*308^10]را ذخیره کنند
اعداد اعشاری با دقت مضاعف با کلمه کلیدی double تعریف میشوند و میتوانند اعداد در بازه
[-3.4*38^10,+3.4*38^10]را ذخیره کنند

استفاده از این مطالب با ذکر منبع بلامانع است