
![]() |
![]() |
|
| همه چیز در مورد امنیت |
|
حلقه ها در سي شارپ :
مقدمه : اگر نياز باشد تا قطعه اي از كد بيش از يكبار اجرا شود نياز به استفاده از حلقه ها مي باشد. براي مثال فرض كنيد آرايه اي به طول 1000 تعريف كرده ايد. اكنون مي خواهيد آنرا با هزار عدد متوالي پركنيد. بديهي است كه روش زير كارآمد نيست! : int[] intData = new int[1000]; نوشتن اين خطوط متوالي احتمالا با كپي و پيست و اصلاح آن حداقل نيم ساعت طول مي كشد! بنابراين نياز به وسيله اي حس مي شود كه بتوان بوسيله ي آن امثال اينگونه كارها را انجام داد. intData[0]=0; . . . intData[999]=1000; تعريف حلقه ها و استفاده از آنها : براي تعريف حلقه ها ابزارهاي متعددي مانند while, do , for , foreach وجود دارند. استفاده و انتخاب آنها بستگي به سليقه ي شما و منطق برنامه دارد. در هر حال يك مساله بديهي است كه همواره بيش از يك راه حل براي يك مساله وجود خواهد داشت. استفاده از حلقه ي for : عموما كدنويسي را با كد نويسي مي توان آموخت! بنابراين در مورد انواع حلقه ها مثالهايي ارائه خواهد گرديد. يك برنامه ي سي شارپ جديد console را در VS.NET باز كنيد و نام آنرا درابتدا ex07 انتخاب نماييد. سپس كد زير را درون آن بنويسيد : using System; توضيحاتي در مورد كد فوق : namespace ex07 { class Class1 { [STAThread] static void Main(string[] args) { int[] intData = new int[1000]; for (int i=0 ; i<1000 ; i++ ) intData[i]=i; for(int i=0 ; i< intData.Length ; i++) { int j = intData[i]; Console.WriteLine("intData[" + i + "]=" + j); } Console.ReadLine(); } } } 1- براي تعريف حلقه ي for همانطور كه مي بينيد بايد تعداد بار اجراي حلقه ( اينجا از 0 تا 999 است ) و همچنين نحوه ي رسيدن از 0 به 1000 را مشخص كرد ( در اينجا i++ است يعني هر بار يك واحد به شمارشگر حلقه اضافه مي شود. ) 2- در زبان سي i++ يعني i=i+1 و i-- يعني i=i-1 و كلا i-=n يعني i=i-n و به همين ترتيب. براي مثال i*=n يعني i=i*n و i+=n يعني i=i+n و ... 3- اگر پس از حلقه ي for يك خط كد داشته باشيم نيازي به آكولاد نيست (مانند قسمت اول كد). ولي اگر تعداد خطوط مربوط به بدنه ي for زياد بود بايد حتما از آكولاد استفاده شود (مانند قسمت دوم كد). (اين قاعده اي كلي است در زبانهاي مشتق شده از زبان سي در مورد هر چيزي!) 4- فرض كنيد در قسمت اول كد بالا بجاي 1000 مي نوشتيد 1001 . سريعا با يك خطاي زمان اجرا مواجه مي شديد. زيرا مي خواستيد به عضوي از آرايه دسترسي پيدا كنيد كه تعريف نشده است. راه مدرن چك كردن اين مسائل استفاده از خاصيت Length آرايه است كه در قسمت دوم كد در عمل مشاهده مي نماييد. هميشه از اين روش استفاده كنيد. 5- حلقه ي اول يعني اينكه كار پر كردن آرايه intData را از صفر تا 999 يكي يكي (i++) انجام بده. استفاده از حلقه ي while : يك برنامه ي سي شارپ جديد console را در VS.NET باز كنيد و نام آنرا درابتدا ex08 انتخاب نماييد. سپس كد زير را درون آن بنويسيد : using System; توضيحاتي در مورد كد فوق : namespace ex08 { class Class1 { [STAThread] static void Main(string[] args) { int n = 1; while (n < 6) { Console.WriteLine("Current value of n is {0}", n); n++; } Console.ReadLine(); } } } 1- حلقه ي while در بالا كار انجام حلقه را تا هنگامي انجام مي دهد كه شرط ذكر شده در ابتداي آن صادق و برقرار باشد. يعني در حلقه ي فوق تا وقتي n<6 است اين حلقه ادامه خواهد يافت. 2- حلقه ي while صفر يا بيشتر بار ممكن است اجرا شود. 3- در كد فوق از {0} استفاده گرديده است. متد WriteLine به شما اين اجازه را مي دهد كه n تا آرگومان براي آن تعريف كنيد و مقادير هر كدام را كه خواستيد در كد نمايش دهيد از {x} استفاده كنيد. در اين مورد مقدار آرگومان x ام نمايش داده مي شود. استفاده از حلقه ي do : يك برنامه ي سي شارپ جديد console را در VS.NET باز كنيد و نام آنرا درابتدا ex09 انتخاب نماييد. سپس كد زير را درون آن بنويسيد : using System; توضيحاتي در مورد كد فوق : namespace ex09 { class Class1 { [STAThread] static void Main(string[] args) { int x; int y = 0; do { x = y++; Console.WriteLine(x); }while(y < 5); Console.ReadLine(); } } } 1- اين حلقه به حلقه ي do…while معروف است و هر دو جزء آن بايد ذكر گردد. 2- اين حلقه تا زماني كه شرط ذكر شده در قمست while صحيح است ادامه مي يابد. 3- اين حلقه در ابتداي كار بدون توجه به قسمت while حداقل يكبار اجرا مي شود. (مثال زير را اجرا نماييد) int n = 10; استفاده از حلقه ي foreach : do { Console.WriteLine("Current value of n is {0}", n); n++; } while (n < 6); يك برنامه ي سي شارپ جديد console را در VS.NET باز كنيد و نام آنرا درابتدا ex10 انتخاب نماييد. سپس كد زير را درون آن بنويسيد : using System;
namespace ex10 { class Class1 { [STAThread] static void Main(string[] args) { int odd = 0, even = 0; int[] arr = new int [] {0,1,2,5,7,8,11}; foreach (int i in arr) { if (i%2 == 0) even++; else odd++; } Console.WriteLine( "Found {0} Odd Numbers, and {1} Even Numbers.", odd, even) ; Console.ReadLine(); } } } توضيحاتي در مورد كد فوق : |
|
+ نوشته شده در
چهارشنبه دهم خرداد 1385ساعت 20:13 توسط DevilHell |
|
|
آرايه ها در سي شارپ :
هنگامي آرايه ها ايجاد مي شوند كه بخواهيم با مجموعه اي از اطلاعات همجنس كار كنيم. براي نمونه از يك آرايه براي ذخيره تعدادي كاراكتر مي خواهيم استفاده نماييم. آرايه ها هم يك نوع متغير هستند پس بايد تعريف و مقدار دهي اوليه شوند ، نوع و تعداد اعضاي آنها نيز بايد معين گردد. فرض كنيد 10 داده ي هم جنس داريم ( براي مثال رشته (string) ) و مي خواهيم آنها را ذخيره كنيم. يا مي توان 10 متغير مختلف را تعريف كرد و سپس تك تك آنها را مقدار دهي نمود و يا يك آرايه تعريف نمود و سپس در خانه هاي مختلف آن اين ده عضو را چيد. اين مطلب زماني حائز اهميت مي شود كه داده هاي همجنس و به نوعي مرتبط ما تعداد زيادي داشته باشند. براي تعريف آرايه چندين راه مختلف وجود دارد : براي تعريف آرايه ابتدا نوع آنرا مشخص مي كنيد سپس [] را بايد جلوي تعريف نوع بگذاريد اين دستور زبان است و چون چرا ندارد! در زبان سي كمي متفاوت بود. اين كروشه ها بعد از نام متغير مي آمدند. و سپس در اينجا نام يك متغير را كه بعدا به آن ارجا مي دهيم خواهيد گذاشت. براي مثال int[] table; // not int table[]; حد پايين آرايه صفر بوده براي مثال اگر آرايه chrData[] ده عضو داشته باشد، اولين عضو آن chrData[0] و آخرين عضو آن chrData[9] است. مطلب ديگري كه در مورد آرايه ها خيلي مهم است اندازه ي آن است. يعني يك آرايه حاوي چند خانه ي خالي است كه ما اجازه داريم آنرا پر كنيم. مثال : int[] numbers; // declare numbers as an int array of any size numbers = new int[10]; // numbers is a 10-element array numbers = new int[20]; // now it's a 20-element array 1- تعريف آرايه اي از رشته ها و مقدار دهي اوليه آن. String[] strData = new string[2]; 2- تعريف و مقدار دهي اوليه string [] strData = { "1234","abcd" }; كه آرايه اي از نوع رشته اي به طول 2 عضو با مقدار دهي اوليه ايجاد شده است. در اين حالت نيازي به تعيين طول آن نمي باشد. 3- روشي ديگر براي مقدار دهي اوليه strData[0] = "1234"; strData[1] = "abcd"; مثال : يك پروژه ي جديد Console سي شارپ را باز كنيد و نام آنرا در ابتدا ex06 بگذاريد. در اين مثال مي خواهيم نحوه ي كار با آرايه ها را مرور كنيم : using System; namespace ex06 { class Class1 { [STAThread] static void Main(string[] args) { string[] sGoalList = new string[3]; string sReplyStatement = "You have choosen Goal '"; // Store goals in the array sGoalList[0] = "Hike the Appalachian Trail"; sGoalList[1] = "Run the marathon"; sGoalList[2] = "Give $1 million to worthwhile causes"; // Store response to goals in the array //(declaring and initializing on same line) string[] sGoalResponse = { "If you are staring from GA, you should get " + "started in early spring, so you will "+ "not get caught in snow.", "Make sure that you have a good pair of shoes.", "Start saving as soon as possible."}; // Give the user a list of goals to choose from Console.WriteLine("GOAL LIST"); for(int i = 0; i < sGoalList.Length; i++) { Console.WriteLine("Goal " + i + " - " + sGoalList[i]); } // Request the user to choose a goal. Console.WriteLine (""); // Write an empty line for space Console.Write("Please choose the number of the " + "goal that you want to achieve [0,1,2]: "); Console.ReadLine(); } } }
|
|
+ نوشته شده در
چهارشنبه دهم خرداد 1385ساعت 20:12 توسط DevilHell |
|
|
ساختارهاي تصميم گيري :
در بسياري از موارد هنگام برنامه نويسي لازم است تا از عبارات شرطي استفاده كنيم. براي انجام اينكار دو روش عمده وجود دارد. استفاده از if و يا switch . از if بيشتر براي مقايسه هايي تكي و كوچك استفاده مي شود و حاصل مقايسه ي آن يا true است و يا false . از عبارت switch هنگامي استفاده مي شود كه مقايسه هاي متعددي بايد در مورد يك مقدار صورت گيرد. هر دو عبارت if و switch توسط عبارتهايي Boolean كنترل مي شوند ( true و يا false ) . در هنگام استفاده از if اگر عبارت Boolean حاصل اش true باشد اولين قسمت شرط اجرا مي شود و سپس برنامه از انتهاي if ادامه پيدا مي كند. اگر حاصل عبارت Boolean مساوي false باشد كنترل برنامه به قسمت else منتقل مي شود. مثال : يك پروژه ي جديد console باز كنيد و نام آنرا ex04 بگذاريد. سپس كد زير را در آن وارد و جرا كنيد : using System; نكاتي در مورد كد فوق : namespace ex04 { class Class1 { [STAThread] static void Main(string[] args) { Console.WriteLine("Enter 1 character to be evaluated"); char cUserInput = (char) Console.Read(); if ( char.IsDigit( cUserInput ) ) Console.WriteLine("The char is a number!"); else Console.WriteLine("The char is not a number!"); } } } 1- سي شارپ به كوچكي و بزرگي حروف حساس است . براي مثال cUserInput با cUserinput فرق مي كند. 2- حتما بايد بعد از if پرانتزها ذكر گردد. 3- حتما بايد داخل if يك عبارت Boolean ذكر شود مانند if(x>5) . 4- در سي شارپ مقايسه ي تساوي دو عبارت با == و انتساب با = انجام مي شود. ( موارد 1 و 4 مواردي هستند كه اغلب تازه كاران با آن مشكل دارند! ) براي مثال if(i==3) صحيح است اما if(i=3) در سي شارپ معنايي ندارد. 5- اگر بعد از if يك خط كد قرار گيرد نيازي به آوردن آكولاد ها نيست. هنگامي نياز به آكولادها مي باشد كه بيش از يك خط بايد بعد از if قرار گيرد. 6- در سي شارپ همانند اسلاف خودش براي تبديل نوع هاي داده ايي مي توان به صورت زير نيز عمل كرد : (char) Console.Read() ; يعني دريافتي Read به char تبديل مي شود .در اين مورد باز هم صحبت خواهد شد. 7- همانطور كه ذكر شد در سي شارپ همه چيز شيء است حتي نوع هاي پايه ايي مانند char . با استفاده از متد IsDigit آن مي توان چك كرد كه آيا ورودي آن عدد است يا خير؟ ( در مورد متدها صحبت خواهد شد ) استفاده از switch : بهتر است اين مورد را با يك مثال دنبال كنيم. پروژه ي سي شارپ جديدي به نام ex05 در حالت console در VS.NET باز كنيد. دراينجا مي خواهيم يك كلاس جديد تعريف كرده و توسط خاصيتي كه در آن ايجاد مي كنيم متوجه شويم روز جاري مطابق سيستم چه روزي است . يك كلاس جديد از منوي پروژه ،با استفاده از گزينه ي Add class به برنامه اضافه كنيد و نام آنرا در ابتدا clsDate بگذاريد. using System; هنگام ذخيره كردن اين كد ويژوال استوديو به شما اخطار مي دهد كه كد داراي حروف يونيكد است. از منوي فايل گزينه ي advanced save options را انتخاب كنيد. در اينجا مي توان نوع ذخيره سازي را يونيكد انتخاب كرد. namespace ex05 { /// /// Summary description for clsDate. /// public class clsDate { public clsDate() { // // TODO: Add constructor logic here // } public string systemDayOfWeek { get { string res=""; switch( System.DateTime.Now.DayOfWeek.ToString()) { case "Saturday" : res = "شنبه"; break; case "Sunday" : res = "يک شنبه" ; break; case "Monday": res = "دوشنبه"; break; case "Tuesday": res = "سه شنبه"; break; case "Wednesday": res = "چهار شنبه"; break; case "Thursday": res = "پنج شنبه"; break; case "Friday": res = "جمعه" ; break; } return res ; } } } } براي استفاده از كلاس فوق مانند مطالبي كه در قسمت قبل گفته شد عمل مي كنيم : using System; هر چند حالت console يونيكد را پشتيباني نمي كند ولي اصل برنامه براي ما مهم است و در آينده بيشتر از آن استفاده خواهيم كرد. namespace ex05 { class Class1 { [STAThread] static void Main(string[] args) { clsDate m_var = new clsDate(); Console.WriteLine( m_var.systemDayOfWeek ); Console.ReadLine(); } } } همانطور كه ملاحظه كرديد اگر از switch استفاده نمي شد بايد از 7 عدد if استفاده مي گرديد كه اصلا ظاهر حرفه اي و شكيلي نداشت! با استفاده از عبارت زير كار مقايسه شروع مي شود. روز سيستم در يافت شده و وارد بدنه ي switch مي گردد. سپس توسط case ها چك مي شود تا تساوي آن با عبارت بعد از case به اثبات برسد. switch( System.DateTime.Now.DayOfWeek.ToString())
اگر هر كدام از عبارات بعد از case صحيح بودند كار پس از آن كه در اينجا انتساب است انجام شده و سپس توسط break كنترل برنامه از switch خارج مي شود و ادامه ي كار دنبال مي گردد. |
|
+ نوشته شده در
چهارشنبه دهم خرداد 1385ساعت 20:9 توسط DevilHell |
|
|
مقدمه :
در اين قسمت مي خواهيم با يك سري از اصول اوليه ي شيء گرايي در سي شارپ كمي آشنا شويم. لازم به ذكر است ، بسياري از مواردي كه در اين قسمت مطرح مي شوند فقط براي آشنايي شما است و در آينده بيشتر بحث و مرور خواهند شد. آشنايي با فضاهاي نام (NameSpaces) : فضاهاي نام روشي براي مديريت كد نويسي هستند. براي مثال آنها ايجاد شده اند تا تداخلي بين نام هاي توابع در برنامه شما رخ ندهد. اين مساله در پروژه هاي بزرگ خود را نشان مي دهد و ممكن است دو آيتم در يك پروژه نام هاي يكساني را پيدا كنند. بدين وسيله اين شانس تصادم و تداخل كاهش پيدا مي كند. براي ايجاد يك فضاي نام به صورت زير عمل مي شود: namespace anyName { …….. Class anyClassName { ………. } ……. } using System; تمام فضاهاي نام به صورت پيش فرض public مي باشند و در خارج از كد شما قابل دسترسي هستند. روش استفاده از آنها به صورت زير است: ProjectName.NameSpace.ClassName.MemberName نكته : اگر دقت كرده باشيد هنگامي كه كرسر ماوس را روي هر آيتمي در منوي autocomplete نگه مي داريد و يا آنرا انتخاب مي كنيد يك راهنماي كوچك نمايش داده مي شود كه در حقيقت كامنت مربوط به آن تابع مي باشد. روش نوشتن چنين كامنت حرفه اي كه در منوهاي ويژوال استوديو ظاهر شود به صورت زير است كه بهتر است (!) قبل از هر تابع يا خاصيت يا كلاس و .... نوشته شود /// /// /// /// كلاس ها : چون سي شارپ تمام سر و كارش با كلاس ها است بنابراين بايد در مورد نحوه ي تعريف و استفاده از آنها تسلط كافي داشته باشيم. يك پروژه ي جديد console در VS.NET باز كنيد و نام آنرا در ابتدا ex03 وارد نماييد. بعد از باز شدن پروژه ، از منوي Project گزينه ي Add class را انتخاب كنيد تا كلاسي جديد به نام clsDate.cs را اضافه نماييم. ساختار فايل ايجاد شده توسط VS.NET به صورت زير است : using System; تابع يا متد clsDate كه در اينجا به صورت پيش فرض ايجاد شده است اصطلاحا سازنده (constructor) نام دارد. اين تابع هر بار كه يك شيء جديد از كلاس مي سازيم به صورت خودكار اجرا مي شود. namespace ex03 { /// /// Summary description for clsDate. /// public class clsDate { public clsDate() { // // TODO: Add constructor logic here (chashm!) // } } } از اين كلاس مي خواهيم براي نمايش تاريخ/ ساعت و غيره استفاده كنيم. براي مثال مي خواهيم تاريخ جاري سيستم را به صورت يك خاصيت از اين كلاس دريافت كنيم. براي اين منظور كد زير را به برنامه اضافه مي نماييم: public string currentSystemDate توضيح كد فوق : { get { return System.DateTime.Today.ToString() ; } } خاصيتي را كه مي خواهيم از برنامه دريافت كنيم با كلمه ي كليدي get معرفي مي نماييم. هر چيزي كه اين قسمت برگرداند خروجي currentSystemDate خواهد بود. اين دستور زبان كه در بالا معرفي شد استاندارد است و در همه جا به يك صورت تعريف و بكار برده مي شود. پس شكل آنرا به خاطر بسپاريد. از كلمه ي كليدي return براي برگرداندن يك خروجي از خاصيت و يا تابع استفاده مي شود. براي استفاده از اين خاصيت جديد ، در فايل Class1.cs كه متد main برنامه ي ما در آنجا قرار دارد به صورت زير عمل مي كنيم : clsDate m_var = new clsDate(); // initialize variable توضيح كد فوق : Console.WriteLine ( m_var.currentSystemDate ); Console.ReadLine();//pause! براي استفاده از يك كلاس بايد يك متغير از آن را تعريف كنيم. در هر زباني يك سري نوع هاي استاندارد مانند int و string و غيره وجود دارند. كلاس هم در حقيقت يك نوع داده ي بسيار بسيار قدرتمند به شمار مي آيد. براي تعريف يك متغير از نوع جديد روش كار مانند سابق است. براي مثال زماني كه يك متغير عدد صحيح را تعريف مي كنيد به صورت زير عمل مي شود : int i=0; راي تعريف يك متغير از نوع داده اي كه خودمان تعريف كرده ايم نيز بايد به همين صورت عمل شود. clsDate m_var = new clsDate(); از كلمه ي كليدي new اينجا به صورت استاندارد براي مقدار دهي اوليه به اين متغير جديد استفاده مي نماييم. سپس به روش دستيابي به اين خاصيتي كه به كلاس اضافه كرده ايم مي رسيم. m_var.currentSystemDate كلا چه يك خاصيت و يا يك متد را به كلاس اضافه نماييم براي دستيابي به آن از عملگر نقطه پس از ذكر نام متغير تعريف شده از نوع كلاس خود ، استفاده مي نماييم. براي استفاده از خاصيت ها نيازي به آوردن () بعد از ذكر نام خاصيت نمي باشد. عموما از خاصيت ها براي برگرداندن و يا تنظيم يك مقدار ساده استفاده مي شود و در آنها عمليات پيچيده اي مد نظر نمي باشد. توضيحي در مورد ; () System.DateTime.Today.ToString استفاده از خواص : شما به ويژگي هاي يك شيء با استفاده از خواص آن مي توانيد دسترسي پيدا كنيد. يك property عضوي است كه امكان دسترسي به ويژگي شيء يا كلاس را فراهم مي كند. براي مثال طول يك رشته (string) ، سايز يك فونت ، عنوان يك فرم و نام يك مصرف كننده ، خاصيت هستند . بسياري از اشياء ذاتي دات نت فريم ورك ، خواص مفيد زيادي را به همراه دارند. براي مثال شيء DateTime را در نظر بگيريد. با استفاده از خاصيت Today آن مي توان تاريخ جاري سيستم را بدست آورد. براي استفاده از يك خاصيت لازم است تا كلاس تعريف كننده شيء در برنامه مهيا باشد. منظور همان استفاده از فضاي نام مربوطه مي باشد. پس از وارد كردن فضاي نام كلاس مورد نظر مي توانيد از شيء و خواص آن استفاده كنيد. دو راه وجود دارد يا به صورت كامل تمام موارد بايد ذكر شوند مانند System.DateTime.Now; و يا با وارد كردن فضاي نام System كوتاه سازي صورت مي گيرد. براي استفاده از هر متد و يا شيء ايي در سي شارپ بايد اين شيء قابل دسترسي باشد. براي مثال شيء Console كه از آن براي چاپ كردن خروجي بر روي صفحه ي نمايش استفاده مي كنيم در فضاي نام System واقع شده است. يا بايد در ابتداي برنامه ذكر كرد using System ; و سپس خيلي راحت از اين شيء استفاده كرد و يا مي توان اينكار را انجام نداد و نوشت : System.Console و الي آخر. با ذكر فضاي نام در ابتدا با استفاده از using مي توان خلاصه نويسي كرد. نتيجه ي نهايي مثال اين فصل : محتويات فايل Class1.cs : using System; محتويات فايل clsDate.cs كه به برنامه اضافه كرديم: namespace ex03 { /// /// Summary description for Class1. /// class Class1 { /// /// The main entry point for the application. /// [STAThread] static void Main(string[] args) { clsDate m_var = new clsDate(); // initialize variable Console.WriteLine ( m_var.currentSystemDate ); Console.ReadLine();//pause! } } } using System;
namespace ex03 { /// /// Summary description for clsDate. /// public class clsDate { public clsDate() { // // TODO: Add constructor logic here // } public string currentSystemDate { get { return System.DateTime.Today.ToString() ; } } } } |
|
+ نوشته شده در
چهارشنبه دهم خرداد 1385ساعت 20:5 توسط DevilHell |
|
|
طي سلسله مقالاتي مي خواهيم با C# بيشتر آشنا شويم. فرض اين مقالات بر اين است كه آشنايي مختصري با زبانهاي برنامه نويسي داريد ، هر چند كار ما تقريبا از صفر شروع مي شود و هدف آن سادگي هر چه بيشتر است.
C# از دو زبان C++ و Java متولد شده است! حاوي بسياري از جنبه هاي C++ مي باشد اما ويژگي هاي شيء گرايي خودش را از جاوا به ارث برده است. C# اگرچه از C++ گرفته شده است اما يك زبان "خالص" شيء گرا (Object oriented) مي باشد. هر دو زبان ياد شده جزو زبانهاي هيبريد محسوب مي شوند اما طراحان C# اين مورد را به اندازه ي C++ مهم تلقي نكرده اند. يك زبان هيبريد اجازه ي برنامه نويسي با شيوه هاي مختلف را ميسر مي كند. دليل اينكه C++ هيبريد است ، اين است كه قرار بوده تا با زبان C سازگار باشد و همين امر سبب گرديده تا بعضي از جنبه هاي C++ بسيار پيچيده شوند. زبان سي شارپ فرض اش بر اين است كه شما مي خواهيد تنها برنامه نويسي شيء گرا انجام دهيد و همانند C++ مخلوطي از برنامه نويسي رويه ايي (Procedural) و شيء گرا را نمي خواهيد به پايان برسانيد. بنابراين بايد طرز فكر خودتان را با دنياي شيء گرايي تطبيق دهيد. در ادامه خواهيد ديد كه در سي شارپ هر چيزي شيء است حتي يك برنامه ي سي شارپ. برنامه ي اول : Visual studio.net را اجرا كنيد و سپس در صفحه ي ظاهر شده New Project را برگزينيد. حالا از گزينه ي Visual C# projects قسمت Console applications را انتخاب نماييد. نامي دلخواه همانند ex01 را وارد نموده و سپس Ok نماييد. كد زير به صورت خودكار براي شما توليد خواهد شد: using System; اگر يك سري از مفاهيم آنرا متوجه نمي شويد اصلا مهم نيست! در مقالات آتي تمام اين موارد مفصل توضيح داده خواهند شد. namespace ex01 { /// /// Summary description for Class1. /// class Class1 { /// /// The main entry point for the application. /// [STAThread] static void Main(string[] args) { // // TODO: Add code to start application here // } } } متد استاندارد Main در اينجا قسمتي است كه عمليات اصلي برنامه در حالت Console ( شبيه به برنامه هاي تحت داس اما 32 بيتي ) در آن انجام مي شود. بدون متد Main برنامه هاي سي شارپ قادر به اجرا نخواهند بود. نوع آن در اينجا void تعريف شده است يعني اين متد خروجي ندارد. حتي اگر برنامه هاي استاندارد ويندوز را هم بخواهيد با C# بنويسيد بازهم متد Main حضور خواهد داشت ، هر چند به صورت خودكار ويژوال استوديو آنرا توليد مي كند. طريقه ي نوشتن توضيحات (Comments) در سي شارپ همانند C++ مي باشد يعني : /* any comments */ ويا // any comments و تنها برنامه نويس براي نوشتن توضيحاتي در مورد كدهاي خود از آنها استفاده مي كند و در خروجي برنامه ظاهر نمي شوند. فعلا براي پايان قسمت اول از شيء Console و متد WriteLine آن براي نمايش يك جمله ي ساده استفاده مي كنيم. راجع به متدها ، متغيرها و غيره در آينده بيشتر صحبت مي كنيم. در آخر برنامه ي ما چيزي شبيه به عبارت زير مي باشد: using System; دكمه ي F5 را فشار دهيد تا برنامه اجرا شود.namespace ex01 { class Class1 { [STAThread] static void Main(string[] args) { Console.WriteLine("Hello C#!"); } } } تعريف متغيرها در سي شارپ: سي شارپ عناصري را كه بكار مي گيرد همانند اعداد و كاراكترها ، به صورت نوع ها (Types) طبقه بندي مي كند. اين انواع شامل موارد زير مي شوند : نوع هاي پايه ايي از پيش تعريف شده مانند اعداد و غيره. نوع هاي تعريف شده توسط كاربر كه شامل STRUCT ها و ENUM ها مي شوند. نحوه ي تعريف متغيرها از نوع هاي پايه ايي از پيش تعريف شده : همانطور كه مي دانيد از متغيرها براي نگهداري اطلاعات استفاده مي شود. در سي شارپ ابتدا نوع متغير و سپس نام متغير و در آخر يك سمي كولون بكار برده مي شود. براي مثال : int a; كه در اينجا متغير a بعنوان يك متغير حاوي اعداد صحيح تعريف شده است. نكته ي مهمي كه در اينجا حائز اهميت است ، مقدار دهي اوليه ي متغيرها مي باشد. در غير اينصورت كامپايلر سي شارپ برنامه را بايك خطا متوقف مي كند. دليل اين امر هم اين است كه از استفاده از متغيرهاي بدون مقدار در طول برنامه جلوگيري شود تا ميزان خطاهاي در حين اجرا كاهش يابد. نوع هاي داده اي پايه ي زير در در سي شارپ به صورت پيش فرض مهيا هستند: object : نوعي است نامحدود كه مي تواند تمام انواع ديگر را نيز شامل شود. مثال : object = null; string : رشته ؛ در اينجا يك رشته توالي كاراكترهاي يونيكد مي باشد. مثال : string s= "hello"; sbyte : نوع داده ايي صحيح 8 بيتي علامت دار. byte : نوع داده ايي صحيح 8 بيتي بدون علامت. مثال : sbyte val = 12; short : نوع داده ايي صحيح 16 بيتي علامت دار. ushort : نوع داده ايي صحيح 16 بيتي بدون علامت. مثال : short val = 12; int : نوع داده ايي صحيح 32 بيتي علامت دار. unit : نوع داده ايي صحيح 32 بيتي بدون علامت. مثال : int val = 12; long : نوع داده ايي صحيح 64 بيتي علامت دار. ulong : نوع داده ايي صحيح 64 بيتي بدون علامت. مثال : Long val1 = 12; long val2 = 34L; كلا در اينجا u به معناي unsigned است. float : نوع اعشاري با single precision . double : نوع اعشاري با double precision . مثال : float val = 1.23f; bool : نوع داده ايي Boolean كه مي تواند true و يا false باشد. مثال : Bool val = true; char : كاراكتر، دراينجا char يك كاراكتر يونيكد است. char val = 'h'; به نحوه ي تعريف كاراكتر ها و همچنين رشته ها در سي شارپ دقت كنيد. decimal : نوع داده ايي دسيمال با 28 رقم معني دار. decimal val = 1.23M; يك نكته : - بهتر است هنگام تعريف يك متغير ، نامي با مسما براي آن انتخاب شود تا در هنگام كار خواندن كد ساده تر گردد. همچنين رسم شده است كه نوع متغير را به صورت خلاصه به نام متغير اضافه مي كنند. براي مثال بجاي FirstName بهتر است بنويسيم strFirstName . به اين نوع نگارش Hungarian notation مي گويند. - تمام نوع هاي پيش فرض تعريف شده در سي شارپ شيء هستند. در آينده بيشتر در اين مورد صحبت خواهيم كرد. مثال اين قسمت : يك برنامه ي console جديد در را VS.NET باز كنيد. نام آنرا در ابتدا ex02 انتخاب نماييد. در اينجا مي خواهيم دو متغير رشته ايي و صحيح را تعريف و سپس در خروجي نمايش دهيم. كد نهايي به صورت زير مي باشد: using System;
namespace ex02 { /// /// Summary description for Class1. /// class Class1 { /// /// The main entry point for the application. /// [STAThread] static void Main(string[] args) { int intVar1 = 0; int intVar2; intVar2=1; int intV3=15 , intV4 = 12; string strText1 = "abcd"; Console.WriteLine( "The value for variables are : \n intVar1="+intVar1 + "\n intVar2="+ intVar2 + "\n intV3=" + intV3 + "\n intV4=" + intV4 + "\n strText1=" + strText1); Console.WriteLine("\n\n Press any key to terminate"); Console.ReadLine(); // pause screen! } } } نكاتي در مورد كد فوق: |
|
+ نوشته شده در
چهارشنبه دهم خرداد 1385ساعت 20:2 توسط DevilHell |
|
|
مايكروسافت در مصاف با جاوا، بدنبال ارائه يك زبان كامل بود كه سايه جاوا را در ميادين برنامه نويسی كم رنگ تر نمايد. شايد بهمين دليل باشد كه #C را ايجاد كرد. شباهت های بين دو زبان بسيار چشمگير است. مايكروسافت در رابطه با ميزان استفاده و گسترش زبان فوق بسيار خوشبين بوده و اميدوار است بسرعت زبان فوق گستردگی و مقبوليتی به مراتب بيشتر از جاوا را نزد پياده كنندگان نرم افزار پيدا كند.
با توجه به نقش محوری اين زبان، از آن بعنوان مادر زبانهای برنامه نويسی در دات نت نام برده می شود. مورد فوق به تنهائی، می تواند دليل قانع كننده ای برای يادگيری اين زبان باشد، ولی دلايل متعدد ديگری نيز وجود دارد كه در ادامه به برخی از آنها اشاره می گردد. مطرح شدن بعنوان يك استاندارد صنعتی زبان #C بگونه ای طراحی شده است كه نه تنها وابستگی به يك Platform خاص را ندارد، بلكه در اغلب موارد وابستگی RunTime نيز ندارد. كامپايلر #C می تواند بر روی هر نوع معماری سخت افزاری طراحی و اجرا گردد. در برخی از نسخه های اوليه كامپايلر زبان فوق كه توسط برخی از شركت های جانبی ارائه شده است، كدهای #C را به بايت كدهای جاوا كمپايل می كنند. يكی از چنين كامپايلرهائی را می توان در سايت Halcyonsoft.com مشاهده نمود. بنابراين كدهای #C براحتی قابليت حمل بر روی محيط های متفاوت را دارا خواهند بود. مشخصات تعريف شده زبان #C با ساير استاندارهای تعريف شده ECMA نظير (ECMA-335) CLI (Common Language Infrastructure) بخوبی مطابقت می نمايند. CLI قلب و روح دات نت و CLR(Common Language Runtime) است. اولين نسخه از كامپايلر زبان #C كه از CLI استفاده می كند، NET Framwork. مايكروسافت است. با توجه به موارد گفته شده، مشخص می گردد كه اين زبان بسرعت بسمت استاندارد شدن حركت و با تاييد استانداردهای مربوطه از طرف انجمن های معتبر بين المللی و حمايت فراگير شركت های معتبر كامپيوتری در دنيا مسير خود را بسمت جهانی شدن بخوبی طی می نمايد. #C چيست ؟ طراحان زبان #C، با درك اهميت موضوع فوق، اين ويژگی را كماكان در آن گنجانده ولی بمنظور ممانعت از استفاده نادرست و ايجاد اطمينان های لازم مسئله حفاظت نيز مورد توجه قرار گرفته است. جهت استفاده از ويژگی فوق، برنامه نويسان می بايست با صراحت و به روشنی خواسته خود را از طريق استفاده از Keyword های مربوطه اعلان نمايند( فراخوانی يك توانائی و استفاده از آن). #C بعنوان يك زبان شی گراء عالی است. اين زبان First-Class را برای مفهوم Property (Data Member) بهمراه ساير خصائص عمومی برنامه نويسی شی گراء حمايت می كند. در C و ++C و جاوا يك متد get/set اغلب برای دستيابی به ويژگی های هر Property استفاده می گردد. CLI همچنان تعريف Property را به متدهای get/ser ترجمه كرده تا بدين طريق بتواند دارای حداكثر ارتباط متقابل با ساير زبانهای برنامه نويسی باشد. #C بصورت فطری Events ، Declared Value، Reference Type ، Operator Overloading را نيز حمايت می كند. كد مديريت يافته روش يادگيری #C برای يادگيری هر يك از زبانهای حمايت شده در دات نت، می بايست از BCL (Basic Class Library) مربوط به NET Framework. شروع كرد. #C خود صرفا دارای ۷۷ کلمه کليدی يا Keyword بوده كه برای اكثر برنامه نويسان غريب نخواهند بود. در مقابل BCL، دارای ۴۵۰۰ كلاس و تعداد بيشماری متد و Property است كه برنامه نويسان #C، می توانند از آنها برای انجام عمليات دلخواه خود استفاده نمايند. شايد يكی از مسائل قابل توجه جهت يادگيری اين زبان برای برخی از برنامه نويسان حرفه ای عدم وجود برخی از ويژگی ها و امكاناتی باشد كه در گذشته و از طريق ساير زبانهای استفاده شده، بخدمت گرفته می شدند. مثلا عدم وجود امكاناتی جهت توارث چندگانه (MI) سلسله مراتبی يك شئ. خلاصه http://www.iranasp.net :منبع |
|
+ نوشته شده در
چهارشنبه دهم خرداد 1385ساعت 19:59 توسط DevilHell |
|
|
قبل از هر چیز بخاطر اینکه وبلاگ دیر به دیر آپ میشه یه عذر خواهی می کنم.
بعدش با این مطلب حال کنید مقدمه آشنايي با WinInet API : WinInet API مجموعه ای از توابع است که امکان ايجاد و توسعه برنامه های اينترنتی را بصورتی ساده ، سريع و کارآمد برای برنامه نويسان مهيا می کند . با استفاده از اين مجموعه توابع شما می توانيد برنامه هايي بنويسيد که از منابع اينترنتی با استفاده از پروتکلهايي چون HTTP و FTP استفاده کنند . همچنين WinInet به شما اجازه می دهد تا بتوانيد ارتباطی dial-up با يک ISP ايجاد نموده و آنرا کنترل کنيد . امکانات Dial-Up موجود در WinInet : تا قبل از ارائه اينترنت اکسپلورر ورژن 4 ، WinInet تنها دارای دو تابع dial-up بود : تابع InternetAttemptConnect : برای بررسی اينکه آيا يک ارتباط به اينترنت وجود دارد يا نه استفاده می شد . اگر هيچ اتصالی به اينترنت وجود نداشت اين برنامه کادر تبادلی dial-up networking را نمايش می داد و کاربر اجازه داشت تا يک اتصال را برای وصل شدن به اينترنت انتخاب کند . تابع InternetCheckConnection : تابع با استفاده از انجام يک دستور ping به url ای که به تابع داده شده ، بررسی می کرد که آيا ارتباطی به اينترنت وجود دارد يا نه . اين دو تابع دارای محدوديتهای فراوانی بودند . برای مثال تابع اول نمی تواند بطور اتوماتيک اتصال به اينترنت را برقرار کند و تابع دوم نيز نمی تواند هيچ اطلاعاتی در مورد نوع ارتباط به ما بدهد . IE نسخه 4 ، تعدادی تابع جديد برای WinInet معرفی کرد که برخی از آنها عبارتند از : تابع InternetGetConnectedState : اطلاعاتی در مورد نوع ارتباط استفاده شده را بيان می کند . برای مثال اين تابع اطلاع می دهد که نوع ارتباط به اينترنت از طريق مودم است يا شبکه LAN و يا از طريق پروکسی . تابع InternetAutodial : اين امکان را فراهم می سازد تا يک ارتباط اينترنتی اتوماتيک از طريق مودم را با استفاده از مدخل اتصال پيش فرض که کاربر آنرا در dial-up networking مشخص کرده ايجاد کنيد . تابع InternetDial : اين تابع کارآمدتر از تابع InternetAutodial است و کادری را نمايش می دهد که کاربر می تواند نوع مدخل مورد نظر خود برای ارتباط تلفنی با اينترنت را انتخاب کند . تابع InternetAutodialHangup : برای قطع کردن اتصالی مودمی که از طريق تابع InternetAutodial برقرار شده استفاده می شود . تابع InternetHangUp : برای قطع کردن اتصالی مودمی که از طريق تابع InternetDialبرقرار شده استفاده می شود . تابع InternetSetDialState : برای تنظيم کردن وضعيت جاری ارتباط اينترنتی استفاده می شود . در قسمت بعدی اين سلسه مباحث جزئيات اين توابع را بررسی کرده و نهايتاً برنامه ای کاربردی برای کار با اين توابع در ويژوال بيسيک ارائه خواهم داد . اطلاعات بيشتری در مورد WinInet : در اين بخش ما تنها توابع dial-up موجود در WinInet API را بررسی کرديم اما همانطور که در ابتدا گفته شد WinInet دارای امکانات فراوانی در زمينه کار با اينترنت است . برای آشنايي بيشتر با اين امکانات در زير جداولی ارائه شده که به اختصار امکانات مختلف اين مجموعه تابع را نشان می دهد : توابع Dial-Up :
توابع عمومی اينترنت :
توابع URL :
توابع FTP :
توابع HTTP :
بررسی جزئيات توابع Dial-Up موجود در WinInet : 1 – تابع InternetAutodial : بطور اتوماتيک باعث شماره گيری اتصال پيش فرض اينترنت توسط مودم می شود . اگر اتصال با موفقيت انجام شود تابع مقدار true و در غير اينصورت false بر می گرداند . چگونگی declare کردن تابع : Public Declare Function InternetAutodial Lib "wininet.dll" (ByVal dwFlags As Long, ByVal dwReserved As Long) As Long 2 – تابع InternetAutodialHangup : باعث قطع کردن يک اتصال dial-up اتوماتيک می شود . اگر قطع اتصال با موفقيت انجام شود تابع مقدار true و در غير اينصورت false برمی گرداند . تابع دارای يک پارامتر ورودی به اسم dwReserved است که رزرو شده بود و بايستی صفر باشد . چگونگی declare کردن تابع : Public Declare Function InternetAutodialHangup Lib "wininet.dll" (ByVal dwReserved As Long) As Long 3 – تابع InternetDial : يک اتصال به اينترنت را با استفاده از يک ارتباط مودم مقداردهی اوليه می کند . پارامترهای ورودی آن عبارتند از : چگونگی declare کردن تابع : Public Declare Function InternetDial Lib "wininet.dll" (ByVal hwndParent As Long, ByVal lpszConnectoid As String, ByVal dwFlags As Long, lpdwConnection As Long, ByVal dwReserved As Long) As Long 4 – تابع InternetGetConnectedState : اين تابع وضعيت اتصال جاری به اينترنت را بر می گرداند . اگر اتصال برقرار باشد تابع مقدار true و در غير اينصورت false برمی گرداند . چگونگی declare کردن تابع : Public Declare Function InternetGetConnectedState Lib "wininet.dll" (ByRef lpdwFlags As Long, ByVal dwReserved As Long) As Long 5 – تابع InternetGoOnline : پيغامی به کاربر برای دادن مجوز برای مقداردهی اوليه اتصال به يک URL را می دهد . اگر اينکار موفقيت آميز باشد مقدار true و در غير اينصورت false برمی گرداند . پارامترهای ورودی تابع عبارتند از : چگونگی declare کردن تابع : Public Declare Function InternetGoOnline Lib "wininet.dll" (ByVal lpszURL As String, ByVal hwndParent As Long, ByVal dwReserved As Long) As Long 6 – تابع InyernetHangUp : به مودم می گويد که اتصال به اينترنت را قطع کند . پارامترهای اين تابع عبارتند از : چگونگی declare کردن تابع : Public Declare Function InternetHangUp Lib "wininet.dll" (ByVal dwConnection As Long, ByVal dwReserved As Long) As Long 7 – تابع InternetSetDialState : تنظيم نمودن وضعيت شماره گيری مودم . اگر تنظيم با موفقيت انجام شود تابع true و در غيراينصورت false برمی گرداند . پارامترهای ورودی تابع عبارتند از :
dwReserved : پارامتری رزرو شده است و بايستی صفر باشد . چگونگی declare کردن تابع : Public Declare Function InternetSetDialState Lib "wininet.dll" (ByVal lpszConnectoid As String, ByVal dwState As Long, ByVal dwReserved As Long) As Long بررسی فلگهای مورد استفاده در توابع dial-up : 1 – فلگهای تابع InternetDial : Public Const INTERNET_DIAL_UNATTENDED = &H8000& '0x8000 2 – فلگهای تابع InternetAutoDial : Public Const INTERNET_AUTODIAL_FORCE_ONLINE = 1
Public Const INTERNET_CONNECTION_MODEM = 1 4 - فلگهای مربوط به dial handler اختصاصی : Public Const INTERNET_CUSTOMDIAL_CONNECT = 0 5 – فلگهای عملياتی پشتيبانی شده برای dial handler اختصاصی : 6 - وضعيتهای مربوط به InternetSetDialState : Public Const INTERNET_DIALSTATE_DISCONNECTED = 1 در اين بخش که آخرين بخش از مباحث WinInet API است برنامه ای نمونه برای کار با توابع مودمی اين کتابخانه ارائه خواهيم داد : برای نوشتن برنامه ای که بتوان از طريق آن با استفاده از مودم به اينترنت متصل شد بصورت زير عمل می کنيم : Private Declare Function InternetDial Lib "wininet.dll" Alias "InternetDialA" (ByVal hwndParent As Long, ByVal lpszConnectoid As String, ByVal dwFlags As Long, lpdwConnection As Long, ByVal dwReserved As Long) As Long سپس وضعيت شماره گيری را در متغيری به اسم lOption قرار می دهيم . اين متغير می تواند مقادير زير را داشته باشد : حال تابع InternetDial را بصورت زير صدا می کنيم : RetVal = InternetDial(Me.hwnd, ConnectionName, lOption, ConnectionID, 0) اگر RetVal مخالف صفر باشد عمل Dial بدرستی انجام شده است . برای قطع اتصال فوق بايستی از تابع InternetHangUp استفاده کنيم . برای اينکار ابتدا تابع فوق را Declare می کنيم : Private Declare Function InternetHangUp Lib "wininet.dll" (ByVal dwConnection As Long, ByVal dwReserved As Long) As Long سپس اين تابع را بصورت زير فراخوانی می کنيم : RetVal = InternetHangUp(ConnectionID, 0) برای اينکه مودم را مجبور کنيم تا بطور اتوماتيک از اتصال پيش فرض سيستم برای شماره گيری استفاده کند از تابع InternetAutodial استفاده می کنيم . Private Declare Function InternetAutodial Lib "wininet.dll" (ByVal dwFlags As Long, ByVal hwndParent As Long) As Long سپس تابع را بصورت زير فراخوانی می کنيم : RetVal = InternetAutodial(ADF_FORCE_UNATTENDED, Me.hwnd) اگر RetVal مخالف صفر باشد عمل AutoDial بدرستی انجام شده است . برای قطع اتصالی که توسط AutoDial ايجاد شده از تابع InternetAutodialHangup استفاده می کنيم . ابتدا اين تابع را Declare می کنيم : Private Declare Function InternetAutodialHangup Lib "wininet.dll" (ByVal dwReserved As Long) As Long فراخوانی اين تابع بصورت زير است : Call InternetAutodialHangup(0) برای اينکه بفهيم آيا اتصال به اينترنت وجود دارد يا نه از تابع InternetGetConnectedStateEx استفاده می کنيم . برای اينکار ابتدا تابع را Declare می کنيم : Private Declare Function InternetGetConnectedStateEx Lib "wininet.dll" Alias "InternetGetConnectedStateExA" (lpdwFlags As Long, lpszConnectionName As Long, dwNameLen As Long, ByVal dwReserved As Long) As Long سپس تابع را بصورت زير فراخوانی می کنيم : strConnectionName = Space(256) که strConnectionName از نوع String و بقيه متغيرها از نوع Long هستند . اگر RetVal مخالف صفر باشد اتصال برقرار است . ثابتهايی که در کدهای فوق استفاده شده عبارتند از : Private Const INTERNET_AUTODIAL_FORCE_ONLINE = 1& Private Const INTERNET_DIAL_FORCE_PROMPT = &H2000 |
|
+ نوشته شده در
دوشنبه هشتم خرداد 1385ساعت 13:31 توسط DevilHell |
|
|
صفحه نخست پست الکترونیک آرشیو |
| درباره وبلاگ |
استفاده از مطالب این وبلاگ منوط به درج لینک می باشد ;)
|
| نوشته های پیشین |
|
اردیبهشت 1386 فروردین 1386 اسفند 1385 بهمن 1385 دی 1385 آذر 1385 آبان 1385 مهر 1385 تیر 1385 خرداد 1385 اردیبهشت 1385 اسفند 1384 بهمن 1384 |
| نویسندگان |
|
DevilHell بیتا |
| پیوندها |
|
کتاب و مقالات هک انقلاب سیمرغ مرجع امنيت شبکه عصرونه nmap-online جهنم اینترنت تيونينگ،سيستم هاي صوتي،آموزش |
|