مقدمه
از اولین روزهايی که دستگاه چاپ اختراع شد تا به امروز لحظه لحظه بر تعداد علاقه مندان کتاب و کتاب خوانی افزوده می شود. سالیان سال است که اهل قلم و فکر برای یافتن کتب مورد علاقه خود به روش های گوناگون و متعددی متوسل می شوند. یافتن و مطالعه کتب در دوره ای از تاریخ تنها در کتابخانه کلیساها و یا دانشگاه های بزرگ و معتبر امکان داشت. تنها برای دستیابی به یک کتاب ارزشمند ممکن بود شما را از شهری به شهری دیگر و یا از دیاری به دیاری دیگر بکشاند. اما کم کم با توسعه ارتباطات و سهل الوصول شدن امر تجارت اندکی کار ساده تر گشت. کار به حدی ساده شده بود که تنها با بیرون رفتن از خانه و سرزدن به کتاب فروشی مرکز شهر امکان تهیه هر نوع کتابی برای شما فراهم شده بود. اما برای بشر در حال پیشرفت که لحظه به لحظه زندگی اش توام با حوادث و اتفاقات شگرف و پیش بینی نشده است، صرف این مدت زمان جهت رفت و آمد به کتابفروشی نیز ضرری جبران ناپذیر تلقی می شود.
سایت اینترنتی «Amazon.com»
انسان امروزی به چنان حد از پیشرفت و تکنولوژی دست یافته است که حتی برای خرید یک کتاب می تواند در اتاقش بر روی صندلی راحت مقابل کامپیوترش بنشیند و با فشار چند دکمه تمامی عملیات خرید از جمله پرداخت هزینه آن را انجام دهد. این مساله تنها برای کتاب هایی نیست که شما آنها را می شناسید؛ با ورود به سایت اینترنتی «Amazon.com» شما به راحتی می توانید در رابطه با موضوعات دلخواه خود کتبی از سراسر دنیا پیدا کنید و حتی این امکان برای شما فراهم شده است. تا به کل موضوع کتاب و احتمالا نقدهایی که درباره آن نوشته شده است پیش از تصمیم برای خرید کتاب مورد نظر دست یابید.
تمامی این تسهیلات مدیون فردی است به نام Jeff Bezos جیف بزوس است
زندگی نامه موسس بزرگترین کتابفروشی آنلاین جهان و كمپاني آمازونAmazon.com ، جف بزوس Jeff Bezos |
زندگی نامه موسس بزرگترین کتابفروشی آنلاین جهان و كمپاني آمازونAmazon.com ، جف بزوس Jeff Bezos
Jeff Bezos جیف بزوس
جف بزوس «Jeff» پسر ارشد « Miguel Bezos» مدیر کمپانی «Exxon» می باشد. از همان دوران کودکی نبوغ ویژه ای برای انجام کارهای خارق العاده و نو داشت .
پدر بزرگش که بازنشسته سازمان انرژی اتمی بود آینده درخشانی را برای او تصور می کرد و در تمامی روزهای تعطیل مدرسه او را به مزرعه خود در تگزاس می برد. تاثیر پدر بزرگ بر «Jeff» جف به حدی بود که تصمیم گرفت مطابق خواست پدر بزرگ در آینده یا یک فضا نورد شود و یا یک فیزیکدان معروف. البته این تصمیم چندان احساسی نبود چرا که او توان و استعداد خود را در این زمینه به مراتب ثابت کرده بود. از جمله ابتکارات او در دوران نوجوانی خلق مکعب بی انتها بود که با استفاده از یک جعبه مکعبی کوچک که تمامی اضلاع آن را آینه تشکیل می داد، تعداد تصویر اجسام قرار داده شده در میان جعبه را به بی نهایت می رساند که این ابتکار او در آن سن و سال شور و هیجان بسیاری را برپا کرد. دیگر اینکه هر گاه آسیاب های بادی مزرعه پدر بزرگ از کار می افتاد ابتدا پیش از خبر کردن مکانیك محل جف «Jeff» را صدا می کردند و در اغلب موارد او به راحتی آنها را تعمیر می کرد.
هوش و استعدادی بی نظیر
هوش و استعداد بی نظیر او در درس های مدرسه نیز ثابت شد، بطوریکه دوره دبیرستان را با بالاترین نمرات به عنوان شاگرد اول در «Miami» برگزیده شد و راهی دانشگاه شد. در دانشگاه نیز به همین شکل در رشته مهندس برق و کامپیوتر مشغول به تحصیل و سرانجام پس از اتمام دوره فارغ التحصیل شد.
پله های ترقی
با اتمام دوره تحصیل، «Bezos» بزوس یک متخصص کامپيوتر شده بود. از این رو کمپانی «FITEL» در نیویورک از او دعوت به کار كرد و دو سال بعد جهت مجهز کردن سیستم کامپيوترهای کمپانی «Bankers Trust» وارد این شرکت شد و در سال 1990 به سبب لیاقت هایی که از خود نشان داد به سمت معاونت این کمپانی در آمد و به عنوان جوان ترین معاون آن مشغول به کار شد.
در فاصله سال های 1990 تا 1994 ، «Bezos» وارد کمپانی «D.E Shaw» شد و با خلق پیچیده ترین سیستم تکنولوژیكي مالی، قدرت آن را در «Wall Street» فزونی بخشید و سرانجام در سمت مدیر ارشد گروه و مجددا به عنوان جوان ترین مدیر به کار مشغول گردید.
بازهم یک همسر و موفقیت دیگر
او که تخصص ویژه ای در کامپیوتر داشت، با پدیدار شدن تجارت الکترونیک تصمیم گرفت تا از تخصص خود در این نوع تجارت نیز استفاده نماید. از این رو همراه همسرش «Mackenzie» که یک رمان نویس بود و علاقه فراوانی به مطالعه کتب گوناگون داشت، سایت «Amazon.com» را بنا کرد.
البته شکل اولیه سایت و نحوه کاربری آن اصلا قابل مقایسه با نوع فعلی در آن نبود چرا که آنها در ابتدا اصلا توجه تصور چنین تجارت عظیمی را نداشتند. قصد آنها فروش کتاب ، CD و نوارهای موسیقی و فیلم در محدوده ای اندک بود اما بازگذشت زمان و درک نیاز جوامع بشری « Bezos» کم کم آن را ارتقا داد به شکل فعلی اش رساند.
سایت «Amazon.com»
سایت «Amazon.com» که امروزه با فروش بیش از 92/1 میلیارد دلار و همچنین بیش از 60 هزار لینک در مقام اول فروش اینترنتی قرار دارد. در ماه می سال 1997 وارد بورس شد و هم اکنون سهامی با ارزش بیش از 17 میلیارد دلار در اختیار دارد.
«Jeff Bezos» موسس و مدیر این سایت بر اساس آمار اعلام شده در سال 2005 هم اکنون صاحب سرمایه ای شخصی معادل 1/4 میلیارد دلار می باشد که در این سال در لیست ثروتمندترین های جهان جای گرفته است.
طراحي وب سايت
امروزه درخواست طراحی يک وب سايت با آگاهی کامل نسبت به مزايا و محاسن اينترنت (بعنوان يک رسانه قدرتمند در ارائه پيامها) توسط شرکتها و مؤسسات صورت می پذيرد. قطعاً شما نيز درصدد ايجاد و يا به روز نمودن وب سايت خود هستيد .
تيم طراحي و گرافيكي گنبد اي تي ، براي طراحي سايت از دو سيستم استاتيك و دايناميك استفاده مي نماييد كه مشخصات اين دو سيستم در ذيل مي باشد
ويژگيهای سيستم استاتيك طراحي سايت عبارتند از
- طراحي كل سايت به انتخاب مشتري بصورت متحرك يا ثابت
- طراحي لوگو سايت با فلش ( متحرك )
- طراحي قالب سايت
- هزينه پايين اين سيستم نسبت به طراحي سايت با استفاده از سيستم دايناميك
- طراحي فرم هاي سفارش محصولات و تماس با ما
قابليت استفاده از اين سيستم براي طراحي سايت ها:
- شركت هاي خصوصي يا دولتي براي معرفي محصولات
- وب سايت هاي شخصي
:: ويژگيهای سيستم دايناميك طراحي سايت عبارتند از
- طراحي دايناميك و پويا وب سايت با امكان به روزرساني سايت بصورت انلاين
- استفاده از سيستم دايناميك در به روزرساني سايت توسط خود شما بدون نياز به دانش فني
- سيستم عضوگيري براي سايت
- سيستم وبلاگ نويسي اختصاصي سايت
- سيستم آمارگيري متنوع از قسمت هاي مختلف سايت
قابليت استفاده از اين سيستم براي طراحي سايت ها:
- سايت خبرگزاري ها
- سايت نشريات محلي و كشوري با امكانات عالي براي به روزرساني مرتب سايت
- سايت كنگره ها ، همايش ها و سمينارها با امكانات دريافت الكترونيكي مقالات و داوري آنلاين مقالات
- سايت فروشگاه هاي اينترنتي
- و ….
مراحل شروع کار طراحی
اول : مشاوره و بررسی نیازهای مشتری که در آن چندین نمونه از سایت های مشابه توسط ما گردآوری می شودتا دید متقاضی نسبت به آنچه که می خواهد پخته تر شود. سپس طراحان ما طرح اولیه را در عرض دو روز آماده و ارایه می کنند.
دوم : پس از آن مشاور تيم با مشتری روی طرح اولیه به بحث و تبادل نظر می نشینند. سپس بر اساس نقطه نظرات متقاضی و هدایت های مشاور گروه طرح ثانویه آماده شده و توسط تيم طراحي ، برنامه نويسي و گرافيكي گنبد آي تي کد نویسی می شود.
سوم : سپس رفع اشکال روی طراحی و برنامه نویسی طرح ثانویه صورت گرفته و پروژه بارگزاری می شود. به این ترتیب و بر اساس تجارب پیشین دریافته ایم که نتیجه نهایی با 98 درصد نیاز واقعی مشتری مطابقت خواهد داشت.
گارانتی پروژه ها : در ضمن پروژه طراحی چه از لحاظ طرح و چه از نظر کد نویسی برای همیشه از طرف ما گارانتی می شود. البته این گارانتی شامل خطاهای انسانی نخواهد بود.
هزینه ها : بدون هیچ اغراق و شعاری هزینه ها در تيم طراحي ، برنامه نويسي و گرافيكي گنبد آي تي بر اساس توان مالی مشتری شکل می گیرد. اگر مشتری مایل باشد در همان فرم سفارش اولیه حداکثر توان مالی خود را ذکر می کند و اگر نخواهد مشاور ما برآورد مالی ما را از پروژه مذکور اعلام می کند. و در هر دو حالت مبلغ ارایه شده مطابق حجم پروژه و توان مالی متقاضی تغییر خواهد کرد. به عبارتی بسیار مایلیم تا هزینه ها را بر اساس رضایت کامل دو طرف قرارداد تعیین کنیم.
7 اصل مهم در طراحی سایت
از آن جهت كه یك سایت اینترنتی امروزه جزء لاینفك یك سیستم بازرگانی موثر را تشكیل میدهد. و همچنین از آنجاییكه هزارها سایت در وب با موضوعات مختلف و متنوع وجود دارد. طراحی یك سایت وب ظرافتها و نكات خاصی را طلب می نماید كه عدم توجه به این نكات موجب عدم كارائی لازم و در نهایت دلسردی مدیران از این فناوری خواهد شد.چه بسیارند مدیرانی كه با انتظار وسیع و امیدهای روشن اقدام به بوجود آوردن سایت نموده و پس از صرف هزینه های مربوطه بدون نتیجه سایت خود را رها كرده و همواره از این تجربه تلخ ابراز ناراحتی می نمایند.
دلایل این ناكامی را از نگاه كلی می توان در عواملی بسیاری دانست كه ذیلاً به توضیح ۷ اصل كلی پرداخته میشود. این نكات با بررسی چندین سایت تجاری موفق و یادداشت برداری از نكات مثبت آنها بدست آمده كه از از این لحاظ دارای اهمیت زیادی است.
البته به دلیل وجود مدیریت دولتی و انحصارات مربوط به آن درگذشته و همچنین برخی از رانتها تعدادی از مدیران بازرگانی عادت به رقابت تجاری و جلب مشتری و نكات مربوط به آن ندارند و بعضی بایدها و نباید هارا برای مشتریشان مطرح نموده و خود را محق در داشتن انتظاراتی كه زائیده نظام انحصاری است می دانند ولی اصولاً در نظام تجارت بین المللی بصورت طبیعی بجز در موارد خاص هیچگونه انحصاری وجود ندارد و انحصار طلبی بزودی با شكست مواجه خواهد شد. مدیران باید این نكته را نصبالعین خود قرارداده و با ابزارهایی مانند تبلیغات مناسب ، استفاده از فناوری ، بالابردن كیفیت كالاها دقت در بسته بندی و دركل رعایت اصول تجاری اقدام به جلب مشتری و رسیدن به نتیجه نمایند و ایجاد یك وب سایت موفق هم یكی از این ابزارهاست.
۱- بهره گیری مفید از فضای موجود در صفحات
طراحی صفحات باید به گونه ای باشد كه حداكثر بهره دهی را برای بازدید كننده داشتهباشد. بطور خلاصه بازدید كننده در دید اول بلافاصله مطلب مورد نظر یا حداقل راه دسترسی به آن را پیدا كند. این نكته بخصوص در طراحی صفحات اول از اهمیت بیشتری برخورداراست.
اصل اول در طراحی سایت ارزش قائل بودن برای وقت بازدید كننده است. به این معنا كه نباید وقت وی را با مطالب غیر مربوط و كسل كنند پرنمود كه نتیجه ای جز دلسردی و عدم نیل به موفقیت در بر نخواهدداشت.
برای رسیدن به چنین هدفی باید بدقت بازدید كنندگان را شناخت و هدف یابی نمود و ایشان را بر اساس اهدافشان به گروههایی تقسیم كرد. همچنین باید به این نكته توجه شود كه بازدید كننده علاوه بر اهداف اصلی چه اهداف فرعی را نیز ممكن است دنبال كند. پس از اینكار باید اطلاعات مورد نیاز هر گروه را طبقه بندی نموده و سپس اقدام به تقسیم صفحه به قسمتهایی نموده و اطلاعات مربوط به هر گروه را در قسمت خاص خود قرارداد. در این رابطه باید سعی شود كه اطلاعات مربوط به اهداف فرعی هر گروه در نزدیكی اهداف اصلی ایشان باشد. بدیهی است كه اهداف فرعی یك گروه ممكن است برای گروه دیگر اهداف اصلی بحساب آمده و برعكس.
باید از درج تصاویر بی ربط به موضوع و توضیحات اضافی مخصوصاً در صفحات اصلی جداً خودداری شود. بدلیل اصل فوق و همچنین ارزش فضای وب باید با تقسیم بندی مناسب بگونه ای عملشود كه از وجود فضاهای خالی و بدون اطلاعات در صفحات اصلی احتراز گردد.
۲- تعامل و برقراری ارتباط دوطرفه با بازدید كننده
اصل دوم در طراحی یك سایت وب تعامل با بازدید كننده و برقراری ارتباط دوطرفه است. یعنی همانطور كه بازدیدكننده با مراجعه به سایت اطلاعاتی در مورد اهداف خود كسب میكند سایت نیز باید بگونه ای باشد كه اطلاعاتی از بازدید كننده خود كسب نماید.
موارد ذیل به ترتیب درجه اهمیت ذكر شده :
– اطلاعات شخصی و مخصوصاً طریق تماس با وی چگونه است ؟
– چرا به این سایت مراجعه نموده و اهداف اصلی و فرعی وی چیست؟
– طریقه آشنایی وی با سایت چگونه بوده است؟
– به كدامیك از اهداف خود رسیده و در جستجوی كدامیك ناكام بوده است؟
– نظر وی در مورد سایت چیست و چه پیشنهاداتی در مورد بهبود آن دارد؟
طبیعی است كه دریافت اطلاعات از اطلاع رسانی بسیار مشكل تر است زیرا افراد بسختی حاضرند اطلاعات بدهند درحالیكه شاید بسیار راحت تر حاضر شوند اطلاعات كسب نمایند. در ضمن هدف اصلی بازدید كننده كسب اطلاعات است نه دادن آن.
لذا باید به طرقی وی را تشویق ویا حتی مجبور به اینكار نمود. در بسیاری از سایتها قسمت ثبت نام و اعلام نظریات و پیشنهادات وجود دارد ولی در نیل به این هدف ناكامند و با وجود تعداد زیاد بازدید كنندگان حتی یكنفر هم حاضر به ثبت نام و اعلام نظریات خود نیست.
اینكار باید با ظرافت و درایت خاصی صورت گیرد كه بازدید كننده خواسته یا ناخواسته اقدام به اینكار نماید.
– برخی از سایتها برای جلب نظر مشتری اقدام به ارائه تسهیلاتی در قبال ثبت نام مینمایند از جمله این تسهیلات میتوان به تخفیف ، ارائه خدمات خاص تجاری، دادن امتیازات ویژهدرخرید یا فروش و غیره اشاره نمود.
– برخی دیگر خدمات رایگانی را پس ازثبت نام به بازدید كننده ارائه می نمایند مانند سرویس مجانی پست الكترونیك (این خدمت بسیار رایج است و حسن آن در این نكته است كه بصورت طبیعی آدرس شخص در اختیار سایت قرار میگیرد.)، تلفن اینترنتی در مدت محدود، دادن فضا روی سایت و صفحه اختصاصی جهت معرفی وغیره.
– برخی دیگر درقبال ثبت نام به بازدید كننده جایزه هایی مانند استفاده رایگان از خدمات اینترنت ، هدیه هایی كه باپست ارسال می شود، نرم افزارهای رایگان استفاده از تورهای رایگان یا نصف قیمت وغیره اعطا می كنند.
– برخی دیگر ارائه یكسری از خدمات مانند پشتیبانی از كالاها را منوط به ثبت نام نموده و مشتری خود را به این طریق مجبور به ثبت نام و دادن اطلاعات مینمایند. این درصورتی است كه مشتری قبلاً كالای ذكر شده را خریده باشد. (یعنی مشتری باشد نه بازدید كننده)
بهرحال شكی نیست كه در دنیای تجاری كنونی برای دریافت هرگونه اطلاعات ویا خدمتی باید بهایی در ازای آن پراداخت. پس از بازدید كننده هم نباید انتظار داشت كه بصورت مجانی به سایت اطلاعاتدهد مگر آنكه مجبور باشد (كه در اغلب موارد اینطور نیست).
علاوه بر نكات فوق دریافت اطلاعات از بازدید كننده باید تدریجی و بدور از هر گونه پیچیدگیباشد. بعبارت دیگر هرچه اطلاعات دریافتی در یك نوبت بیشتر باشد باید بهای بیشتری پرداخت شود ولی ممكن است در ازای اطلاعات كمتر و در نوبتهای متعدد بازدید كننده با رغبت بیشتری اقدام به اینكار نماید. بهر حال باید از نمایش صفحات پیچیده به این منظور جداً احتراز گردد و در هر مرحله تعداد اقلام اطلاعاتی كم وبصورتی واضح از وی درخواست گردد.
برخی از سایتها اینكار را بسیار به آرامی و هر بار با یك قلم اطلاعاتی و با طرح نظرخواهی انجام داده و معمولاً موفقیت با اینگونه سایتهاست. بهرحال اولین قلم اطلاعاتی كه از بازدید كننده خواسته می شود آدرس وی خواهد بود.
۳- ثبت رفتار بازدید كننده و هدفیابی پویا
یكی از مهمترین اصول طراحی یك سایت همراهی وكنترل نامحسوس بازدید كننده است. به این معنی كه سایت باید پس از شناسایی بازدیدكننده برای وی پرونده ای تشكیل داده و صفحاتی كه از آن بازدید مینماید یا مطالبی كه وارد می كند را ثبت نموده و سپس وی را بر اساس صفحات و نكاتی كه بازدید نموده یا وارد كرده هدفیابی نماید. (بصورت اتوماتیك گروه وی را مشخص كند.) به این ترتیب میتوان با توجه به گروه مشخص شده، وی را در رسیدن به اهدافش یاری نموده و یا به سمتی سوق داد كه هدف مورد نظر را برآورده سازد. بعنوان مثال بسیارند سایتهایی كه بر طبق آنچه در اصل دوم ذكر شد بازدید كننده خود را شناسایی نموده و پس از شناسایی، با توجه به مواردی كه جستجو مینماید او را هدفیابی میكنند. سپس در دفعات بعدی بازدید ضمن پر رنگ كردن مطالب مربوط به هدف مشخص شده تبلیغاتی در موضوعات هدفیابی شده نمایش میدهند. به این ترتیب ضمن كمك به وی درجهت رسیدن به اهدافش بصورت اتوماتیك تبلیغات مورد نظر خودرا نیز منتقل می نمایند. این مطلب همچنین موجب بوجودآمدن شرایط مناسب برای اصل اول نیز خواهد شد.
۴- قابلیت انعطاف با شرایط بازدید كننده یا پارامتریك بودن سایت :
اصل چهارم وجود قابلیت انعطاف به نحوی است كه بازدید كننده شناسایی و هدفیابی شده، بتواند براساس نیازهای خود سایت را برای بازدید بعدی آماده كند. به نحوی كه بعداً فقط مواردی كه انتخاب نموده با ویژگیهای مشخص شده برای وی به نمایشدرآید . این قابلیت ضمن تضمین اصل اول موجب بوجود آمدن احساس تعلق در بازدیدكننده شده و وی را به بازدید مستمر تشویق می نماید. معمولاً در سایتها به این قابلیت My Site گفته می شود.
۵- اطلاع رسانی به بازدید كننده و عدم رهاكردن وی و تبدیل بازدیدكننده به مشتری :
شاید این اصل یكی از مهمترین اصولی است كه هدف هر موسسه تجاری از بوجود آوردن سایت را در خود دارد. این طبیعی است كه هر بازدید كننده بالقوه یك مشتری است و لذا باید هرچه سریعتر قوه به فعل تبدیل شود لذا در این راه باید ضمن هدفیابی كه در اصول قبلی به آن اشاره شد وی را درجهت رسیدن به درجه مشتری ترغیب و راهنمایی نمود. دراین راه باید از اطلاعاتی كه در تعامل با وی بدست آمده كمك گرفته و بصورتی ظریف و روانشناسانه به نحوی كه اعتماد وی جلب شود عمل نمود. تا این هدف حاصلآید.
شاید یكی از موثر ترین و كم هزینه ترین ابزارها در این جهت استفاده از پست الكترونیك می باشد. برنامه ریزی سایت باید بگونه ای باشد كه پس از مراجعه بازدید كننده و دریافت آدرس و اطلاعات در بخشهای تعامل و هدف یابی و گروه بندی لیستها، آدرس بر اساس گروه بوجود آمده و هنگامی كه مطلب جدیدی (مثلاً محصولات جدید شركت، حراج محصولات، مزایده و مناقصه و
) مربوط به هرگروه، وجود داشت آن را بصورت یك خبر برای وی ارسال نماید. ارسال تبریكها به مناسبتهای مختلف مانند تولد وی وقایع تاریخی و مذهبی می تواند ضمن جلب توجه بازدید كننده اعتماد وی به سایت را بیشتر نماید.
یكی از مهمترین موجبات عدم كارائی سایتها، رها كردن بازدید كننده پس از مراجعه به سایت می باشد كه از عوامل شكست سایت در اهداف خود بشمار میرود.
۶- دعوت مشتری جهت بازدید از سایت و ایجاد تمایل به ادامه بازدید بصورت دوره ای:
شاید بهتر بود كه بعنوان اولین اصل به توضیح این مطلب می پرداختیم ولی بدلیل آشنایی شما، این مورد تحت عنوان اصل ششم مطرح گردید.
آیا ازخود سوال میكنید كه در میان هزاران سایت چرا باید بازدید كنندهای به سراغ سایت شما بیاید؟ اصلاً چگونه وی آدرس سایت شما را پیدا كند؟
برخی از مدیران بازرگانی در این اندیشه هستند كه صرف ایجاد سایت موجب مشاهده و بازدید سایرین خواهد شد. ولی این مطلب اصلاً صحیح نیست احتمال آنكه كسی بصورت اتفاقی بدون آگاهی قبلی سایت شما را بازدید كند اگر صفر نباشد نزدیك به صفر است.
لذا باید به طریقی سایت خود را به بازدید كنندگان معرفی نمایید. یكی از موثر ترین طریقهها، تبلیغات است. معمولاً ایجاد كنندگان سایتها برای این منظور از ارائه تبلیغات در سایتهای پربازدید استفاده مینمایند. دربرخی دیگر از موارد سعی در پیدا كردن آدرسهای افراد نموده و برای ایشان تبلیغات را بصورت پست الكترونیك ارسال مینمایند. بهر حال تبلیغات بهر صورتی كه باشد باید با هدف تبدیل افراد به بازدید كننده سایت ارسال شود. در اینجا نباید فراموش كرد كه بازدید كننده هیچگونه اجباری در بازدید از سایت شما ندارد و اغلب اینكار برای وی موجب صرف هزینه است و لذا باید برای دعوت وی به بازدید از سایت بهر حال هزینه كنید. دراینجا مجدداً نظر شما را به نكاتی كه درباره تشویق بازدید كننده به ثبت نام و ورود اطلاعات گفته شد جلب مینمایم.
اكنون كه به طریقی (اقلب پرهزینه) نظر بازدید كننده را به مشاهده سایت خود جلب نمودید نباید براحتی اورا ازدست داد. باید امكاناتی فراهم كرد كه وی تشویق شود بصورت دوره ای به سایت توجه نموده و از آن مجدداً بازدید نماید. اغلب سایتها برای نیل به این منظور بخش خبری و نكته های شنیدنی و موارد خواندنی در سایت خود قرارداده و این مطالب را بصورت مرتب تغییر می دهند تا بازدید كننده هربار با مطالب جدیدی مواجه گردد و از مراجعه به سایت دلسرد نشود. حتی زیباترین و جذاب ترین اطلاعیه ها نیز درصورتی كه تغییر نكند پس از مدتی خسته كننده و در نهایت كسل كنننده خواهد شد.
۷- استفاده از جدید ترین فناوری و ایجاد جذابیتهای هنری :
بسیاری ازایجاد كنندگان سایتهای كامپیوتری به این اصل قبل از همه اصول می پردازند درحالی كه ضمن لازم بودن و اهمیت بسیار، این اصل در كنار اصول قبلی حائز اهمیت بوده و توجه صرف به آن كافی نیست.
دركل باید با تكیه بر فناوری جدید و استفاده از جلوه های تصویری، صوتی، انیمیشن و خواص رنگها، سایت بگونه ای جذاب باشد كه در برخورد اول بازدید كننده را جلب نموده و بصورت دوره ای تغییر نماید تا از تازگی و جذابیتش به مرور زمان كسر نگردد. اصولاً برای نیل به این هدف ایجاد كننده سایت یا شخصی كه به طراحی بخش رابط استفاده كننده (User Interface) اشتغال دارد باید ضمن آشنایی با فناوری جدید هنرمند و با ذوق هم باشد تا جلوه های ویژه جلب توجه نموده و جذاب باشد. اغلب طراحان موفق سایتهای كامپیوتری برای این بخش از مشاورین هنری استفاده می نمایند.
درس اول : آغاز كار با C#
در اين درس با ارائه چند برنامه و مثال ساده به طرز كار زبان C# ميپردازيم. اهداف اين درس عبارتند از :
فهم ساختار پايهاي يك برنامه C#
آشنايي با Namespace
آشنايي با كلاس (Class)
آشنايي با عملكرد متد Main()
آشنايي با ورودي/خروجي يا I/O
ليست 1-1، يك برنامة ساده با عنوان Welcome در زبان C#
// Namespace اعلان
using System;
// كلاس آغازين برنامه
class WelcomeCSS
{
// آغاز كار اجراي برنامه
public static void Main()
{
// نوشتن متن در خروجي
Console.WriteLine(“Welcome to the C# Persian Tutorial!”);
}
}
برنامة ليست 1-1 داراي 4 پارامتر اصلي است، اعلان Namespace، كلاس، متد Main() و يك دستور زبان C#.
در همين جا بايد به يك نكته اشاره كنم، براي زبان C# همانند بيشتر زبانهاي برنامهسازي دو نوع كامپايلر وجود دارد. يك نوع كامپايلر كه به كامپايلر Command Line معروف است و نوع ديگر كامپايلر Visual است. كامپايلرهاي Command Line محيطي شبيه به محيط DOS دارند و با دادن يك سري دستورات به اجرا در ميآيند. كامپايلرهاي Visual محيطي همانند ويندوز دارند كه با دارا بودن محيط گرافيكي و ابزارهاي خاص، برنامهنويس را در امر برنامهسازي كمك ميكنند. از نمونههاي هر يك از كامپايلرها، ميتوان به Microsoft C# Command Line Compiler كه يك كامپايلر Command Line و Microsoft Visual C# كه يك كامپايلر Visual است، اشاره كرد. البته در حال حاضر بيشتر از كامپايلرهاي ويژوال استفاده ميشود.
من سعي ميكنم در آينده به توضيح محيط Visual C# و Visual Studio.Net بپردازم. اما فعلاً براي اجراي برنامهها ميتوانيد از Visual Studio.Net استفاده كنيد. پس از نصب آن، وارد محيط C# شده و در قسمت انتخاب برنامة جديد گزينة Console را جهت اجراي برنامهها انتخاب نماييد.
براي اين درس، فعلاً به توضيحات بيشتر دربارة محيط ويژوال نميپردازم اما در آينده به توضيح كامل محيط Visual Studio.Net خواهم پرداخت.
براي اجراي كد بالا در صورتيكه از محيط ويژوال استفاده ميكنيد بايد بر روي دكمة Run كليك كنيد و در صورتيكه كامپايلر Command Line داريد با دستور زير ميتوانيد برنامه را اجرا كنيد : csc Welcome.cs
پس از اجراي برنامه، كامپايلر براي شما يك فايل قابل اجرا(Executable) تحت نام Welcome.exe توليد ميكند.
نكته : در صورتيكه از Visual Studio.Net(VS.Net) استفاده كنيد، پس از اجراي برنامه، يك صفحه براي نمايش خروجي به سرعت باز شده و بسته ميشود و شما قادر به ديدن خروخي نخواهيد بود. براي اينكه بتوانيد خروجي برنامه را ببينيد، در انتهاي برنامه دستور زير را وارد نماييد :
Console.ReadLine();
استفاده از اين دستور باعث ميشود تا برنامه منتظر دريافت يك ورودي از كاربر بماند، كه در اين حالت شما ميتوانيد خروجي برنامه خود را ديده و سپس با زدن كليد Enter برنامه را خاتمه دهيد.
نكتة ديگري كه در مورد زبان برنامهنويسي C# بايد مورد توجه قرار دهيد اينست كه اين زبان Case Sensitive است، بدين معنا كه به حروف كوچك و بزرگ حساس است يعني براي مثال ReadLine با readLine متفاوت است به طوريكه اولي جزو دستورات زبان C# و دومي به عنوان يك نام براي متغير يا يك تابع كه از طرف كاربر تعريف شده است در نظر گرفته ميشود.
اعلان Namespace به سيستم اعلان مينمايد كه شما از توابع كتابخانهاي System جهت اجراي برنامهها خود استفاده مينماييد. دستوراتي مانند WriteLine و ReadLine جزو توابع كتابخانهاي System ميباشند. اغلب دستورات و توابع مهم و كليدي استفاده از كنسول ورودي/خروجي در اين كتابخانه ميباشد. در صورتيكه در ابتداي برنامه از using System استفاده نكنيد، يابد در ابتداي هر يك از دستورات برنامه كه مربوط اين كتابخانه است، از كلمة System استفاده نماييد. بعنوان مثال در صورت عدم استفاده از using System بايد از دستور System.Console.WriteLine() به جاي Console.WriteLine() استفاده نماييد.
تعريف كلاس،Class Welcome CSS، شامل تعريف دادهها(متغيرها) و متدها جهت اجراي برنامه است. يك كلاس، جزو معدود عناصر زبان C# است كه بوسيلة آن ميتوان به ايجاد يك شي (Object) از قبيل واسط ها (Interfaces) و ساختارها(Structures)، پرداخت. توضيحات بيشتر در اين زمينه در درسهاي آينده ذكر ميشوند. در اين برنامه كلاس هيچ داده و متغيري ندارد و تنها شامل يك متد است. اين متد، رفتار(Behavior) اين كلاس را مشخص ميكند.
متد درون اين كلاس بيان ميكند كه اين كلاس چه كاري را پس از اجرا شدن انجام خواهد داد. كلمة كليدي Main() كه نام متد اين كلاس نيز ميباشد جزو كلمات رزرو شده زبان C# است كه مشخص ميكند برنامه از كجا بايد آغاز به كار نمايد. وجود متد Main() در تمامي برنامههاي اجرايي ضروري است. در صورتيكه يك برنامه حاوي متد Main() نباشد بعنوان توابع سيستمي همانند dll هاي ويندوز در نظر گرفته ميشود.
قبل از كلمة Main() كلمه ديگري با عنوان static آورده شده است. اين كلمه در اصطلاح Modifier ميگويند. استفاده از static براي متد Main() بيان ميدارد كه اين متد تنها در در همين كلاس قابل اجراست و هيچ نمونهاي (Instance) ديگري از روي آن قابل اجرا نميباشد. استفاده از static براي متد Main() الزامي است زيرا در ابتداي آغاز برنامه هيچ نمونهاي از هيچ كلاس و شياي موجود نميباشد و تنها متد Main() است كه اجرا ميشود. (در صورتيكه با برخي اصطلاحات اين متن از قبيل كلاس، شي، متد و نمونه آشنايي نداريد، اين به دليل آنست كه اين مفاهيم جزو مفاهيم اولية برنامهنويسي شيگرا (OOP) هستند. سعي ميكنم در درسهاي آينده به توضيح اين مفاهيم نيز بپردازم، ولي فعلاً در همين حد كافي ميباشد.)
هر متد بايد داراي يك مقدار بازگشتي باشد، يعني بايد مقداري را به سيستم بازگرداند، در اين مثال نوع بازگشتي void تعزيف شده است كه نشان دهنده آنست كه اين متد هيچ مقداري را باز نميگرداند يا به عبارت بهتر خروجي ندارد. همچنين هر متد ميتواند داراي پارامترهايي نيز باشد كه ليست پارامترهاي آن در داخل پرانتزهاي جلوي آن قرار ميگيرد. براي سادگي كار در اين برنامه متد ما داراي هيچ پارامتري نيست ولي در ادامة همين درس به معرفي پارامترها نيز ميپردازم.
متد Main() رفتار و عمل خود را بوسيله Console.WriteLine(…) مشخص مينمايد. Console كلاسي در System است و WriteLine() متدي در كلاس Console. در زبان C# از اپراتور “.” (نقطه dot) جهت جداسازي زيرروتينها و زيرقسمتها استفاده ميكنيم. همانطور كه ملاحظه ميكنيد چون WriteLine() يك متد درون كلاس Console است به همين جهت از “.” جهت جداسازي آن استفاده كردهايم.
در زبان C#، براي قرار دادن توضيحات در كد برنامه از // استفاده ميكنيم. بدين معنا كه كامپايلر در هنگام اجراي برنامه توجهي به اين توضيحات نميكند و اين توضيحات تنها به منظور بالا بردن خوانايي متن و جهت و كمك به فهم بهتر برنامه قرار ميگيرند. استفاده از // تنها در مواردي كاربرد دارد كه توضيحات شما بيش از يك خط نباشد. در صورت تمايل براي استفاده از توضيحات چند خطي بايد در ابتداي شروع توضيحات از /* و در انتها آن از */ استفاده نماييد. در اين حالت تمامي مطالبي كه بين /* */ قرار ميگيرند به عنوان توضيحات (Comments) در نظر گرفته ميشوند.
تمامي دستورات (Statements) با “;”، سمي كولون، پايان مييابند. كلاسها و متدها با } آغاز شده و با { خاتمه مييابند. تمامي دستورات بين { } يك بلوك را ميسازند.
بسياري از برنامهها از كاربر ورودي دريافت ميكنند. انواع گوناگوني از اين وروديها ميتوانند به عنوان پارامتري براي متد Main() در نظر گرفته شوند. ليست 2-1 برنامهاي را نشان ميدهد نام كاربر را از ورودي دريافت كرده و آن را بر روي صفحه نمايش ميدهد. اين ورودي به صورت پارامتري براي متد Main() در نظر گرفته شده است.
ليست 2-1 : برنامهاي كه ورودي را از كاربر، بعنوان پارامتر Main()، دريافت ميكند.
// Namespace اعلان
using System;
// كلاس آغازين برنامه
class NamedWelcome
{
// آغاز اجرا برنامه
public static void Main(string[] args)
{
// نمايش بر روي صفحه
Console.WriteLine(“Hello, {0}!”, args[0]);
Console.WriteLine(“Welcome to the C# Persian Tutorial!”);
}
}
توجه داشته باشيد كه اين برنامه، ورودي را به صورت Command-Line دريافت ميكند و در هنگام اجراي برنامه بايد ورودي را در Command-Line وارد نماييد. در صورتيكه ورودي را وارد ننماييد برنامه دچار مشكل شده و متوقف خواهد شد.
همان طور كه در ليست 2-1 مشاهده مينماييد، پارامتر متد Main() با عنوان args مشخص شده است. با استفاده از اين نام در داخل متد ميتوان آن استفاده نمود. نوع اين پارامتر از نوع آرايهاي از نوع رشته (string[]) در نظر گرفته شده است. انواع(types) و آرايهها را در درسهاي بعدي بررسي ميكنيم. فعلاً بدانيد كه آرايه رشتهاي جهت نگهداري چندين كاراكتر مورد استفاده قرار ميگيرد. [] مشخص كننده آرايه هستند كه مانند يك ليست عمل ميكند.
همانطور كه ملاحظه ميكنيد در اين برنامه دو دستور Console.WriteLine(…) وجود دارد كه اولين دستور مقداري با دستور دوم متفاوت است. همانطور كه مشاهده ميكنيد داخل دستور Console.WriteLine(…) عبارتي به شكل {0} وجود دارد. اين آرگومان، نشان ميدهد كه به جاي آن چه مقداري بايد نمايش داده شود كه در اين جا args[0] نشان داده ميشود. عبارتي كه داخل ” ” قرار دارد عيناً در خروجي نمايش داده ميشود، به جاي آرگومان {0}، مقداري كه پس از ” قرار دارد، قرار ميگيرد. حال به آرگومان بعدي يعني args[0] توجه كنيد. مقدار صفر داخل [] نشان ميدهد كه كدام عنصر از آرايه مورد استفاده است. در C# انديس آرايه از صفر شروع ميشود به همين جهت براي دسترسي به اولين عنصر آرايه بايد از انديس صفر استفاده كنيم.(همانطور كه قبلاً نيز كفتم آرايهها را در درسهاي آينده توضيح خواهم داد، هدف از اين درس تنها آشنايي با C# است.!)
مجدداً به آرگومان {0} بازگرديم. اين آرگومان نشان مي دهد كه يك مقدار بايد در رشته خروجي قرار گيرد، اين مقدار همان args[0] است. اگر شما اين برنامه را از طريق Command-Line اجرا نماييد خروجي شبيه به زير خواهيد گرفت :
>Hello!, Meysam!
>Welcome to C# Persian Tutorial!
همان گونه كه ميبينيد، پس از اجراي برنامه نام شما كه از طريق Command-Line آنرا وارد نمودهايد در خروجي ظاهر ميشود. استفاده از آرگومان {n}، كه در آن n يك مقدار عددي است، جهت فرمت دادن به متن خروجي است كه بر روي صفحه به نمايش در ميآيد. مقدار n از صفر آغاز شده و به ترتيب افزايش ميبايد. به مثال زير توجه كنيد :
Console.WriteLine(“Hello! ,{0} ,{1}, {2}”,args[0],args[1],args[2]);
اين خط از برنامه سه مقدار args[0],args[1],args[2] را در خروجي به ترتيب نمايش ميدهد. ملاحظه مينماييد كه چون 3 مقدار را ميخواهيم نمايش دهيم، سه بار از آرگومان {n} استفاده كردهايم و هر بار يك واحد به مقدار قبلي افزودهايم. در آينده بيشتر با اين مفاهيم آشنا ميشويم.
مطلبي كه بايد در مورد ليست 2-1 به آن توجه شود آنست كه اين برنامه تنها از طريق Command-Lineقابل اجراست و در صورتيكه كاربر از اين مطلب كه برنامه بايد داراي ورودي به صورت Command-Line باشد، بي اطلاع باشد و ورودي را در Command-Line وارد نكند، برنامه متوقف شده و اجرا نميشود. پس براي رفع چنين مشكلي بايد از روش بهتري جهت دريافت ورودي از كاربر استفاده كرد.
ليست 3-1 : يك برنامه كه قابليت محاوره با كاربر را دارد.
// Namespace اعلان
using System;
// كلاس آغازين برنامه
class InteractiveWelcome
{
//آغاز اجراي برنامه
public static void Main()
{
// متني بر روي صفحه نمايش داده ميشود
Console.Write(“What is your name?: “);
//متني نمايش داده شده و برنامه منتظر دريافت ورودي ميماند
Console.Write(“Hello, {0}! “, Console.ReadLine());
Console.WriteLine(“Welcome to the C# Persian Tutorial!”);
}
}
همانطوريكه در اين برنامه ديده مي شود، متد Main() داراي پارامتر نيست. در عوض يك خط به متن برنامه ليست 2-1 اضافه شده است. در اولين خط از اين برنامه، متني با عنوان اينكه نام شما چيست؟ بر روي صفحه ظاهر ميشود. سپس در خط بعدي پس از نوشتن كلمه Hello, ، برنامه منتظر دريافت ورودي از كاربر ميشود. بدين معني كه اين بار تا زمانيكه كاربر متني را به عنوان نام خود وارد نكند اجراي برنامه به پيش نخواهد رفت و خط بعدي اجرا نميشود. اين برنامه روش ايجاد ارتباط از طريق برنامه با كاربر را نمايش ميدهد. در اين مثال كاربر دقيقاً متوجه ميشود كه چه زماني بايد اطلاعات را وارد نمايد و اين اطلاعات چه بايد باشد در حاليكه در مثال قبل چنين نبود. همانگونه كه ميبينيد در اين برنامه آرگومان {0} مستقيماً از طريق دستور Console.ReadLine() دريافت ميشود و بلافاصله در خروجي نمايش داده ميشود. دستور ReadLine() نيز يكي از متدهاي كلاس Console است كه بوسيله آن رشته ورودي خوانده ميشود.
خروجي برنامه فوق به شكل زير است :
What is your name?:
(سپس برنامه منتظر دريافت متني از ورودي توسط كاربر ميماند)
(پس از اينكه كاربر رشتهاي را وارد كرد و كليدEnter را فشار داد، متن زير نمايش داده ميشود.)
Hello, Meysam!
(سپس اجراي برنامه به دستور بعدي منتقل ميشود)
Welcome to the C# Persian Tutorial!
خروجي كامل برنامه :
What is your name?:
Hello, Meysam! Welcome to the C# Persian Tutorial!
توجه كنيد كه ReadLine() به عنوان يك متد، مقداري را به سيستم بازميگرداند. اين مقدار در اين برنامه به آرگومان {0} برگردانده ميشود. اين خط از برنامه را ميتوان طور ديگري هم نوشت :
string myName=Console.ReadLine();
Console.WriteLine(“Hello, {0}!”,myName);
در اين حالت ما يك متغير از نوع رشته با نام myName تعريف كردهايم كه مقدار ورودي در آن ذخيره ميشود و سپس از اين مقدار به عنوان مقداري كه {0} ميپذيرد استفاده كردهايم.
در اين درس آموختيد كه ساختار كلي يك برنامه C# چگونه است. هر برنامه C# از يك كلاس اصلي تشكيل ميشود كه اين كلاس شامل دادهها و متغيرها و متدهايي ميباشد. متد آغازين برنامه كه برنامه با آن شروع به اجرا ميكند، متد Main() است. با استفاده از توابع كتابخانهاي مينوان به كلاسها و متدهاي C# دسترسي پيدا كرد. از جمله اين توابع System بود كه يكي از كلاسهاي آن Console و چند متد اين كلاس، متدهاي WriteLine() و ReadLine() بودند.
درس دوم – عبارات، انواع و متغيرها در C#
در اين درس به معرفي عبارات، انواع و متغيرها در زبان C# ميپردازيم. هدف از اين درس بررسي موارد زير است :
آشنايي با متغيرها
فراگيري انواع(Types) ابتدايي در C#
فراگيري و درك عبارات(Expressions) در C#
فراگيري نوع رشتهاي(String) در زبان C#
فراگيري چگونگي استفاده از آرايهها(Arrays) در زبان C#
متغيرها، به بيان بسيار ساده، مكانهايي جهت ذخيره اطلاعات هستند. شما اطلاعاتي را در يك متغير قرار ميدهيد و از اين اطلاعات بوسيله متغير در عبارات C# استفاده مينماييد. كنترل نوع اطلاعات ذخيره شده در متغيرها بوسيله تعيين كردن نوع براي هر متغير صورت ميپذيرد.
C# زباني بسيار وابسته به انواع است، بطوريكه تمامي عملياتي كه بر روي دادهها و متغيرها در اين زبان انجام ميگيرد با دانستن نوع آن متغير ميسر ميباشد. قوانيني نيز براي تعيين اينكه چه عملياتي بر روي چه متغيري انجام شود نيز وجود دارد.(بسته به نوع متغير)
انوع ابتدايي زبان C# شامل : يك نوع منطقي(Boolean) و سه نوع عددي اعداد صحيح(integer)، اعداد اعشاري(Floating points) و اعداد دسيمال(Decimal) ميباشد.(به انواع Boolean از اينرو منطقي ميگوييم كه تنها داراي دو حالت منطقي صحيح(True) و يا غلط(False) ميباشند.)
مثال 1 – نشان دادن مقادير منطقي (Boolean)
using System;
class Booleans
{
public static void Main()
{
bool content = true;
bool noContent = false;
Console.WriteLine(“It is {0} that C# Persian provides C# programming language
content.”, content);
Console.WriteLine(“The statement above is not {0}.”, noContent);
}
}
در اين مثال، مقادير منطقي متغيرهاي Boolean به عنوان قسمتي از جمله در خروجي نمايش داده ميشوند. متغيرهاي bool تنها ميتوانند يكي از دو مقدار true يا false را داشته باشند، يعني همانند برخي از زبانهاي برنامهسازي مشابه، مانند C و يا C++، مقدار عددي نميپذيرند، زيرا همانگونه كه ميدانيد در اين دو زبان هر مقدار عددي صحيح مثبت بغير از صفر به عنوان true و عدد صفر به عنوان false در نظر گرفته ميشود و در حقيقت نوع bool در اين دو زبان نوعي integer ميباشند. اما در زبان C# انواع bool يكي از دو مقدار true يا false را ميپذيرند. خروجي برنامه بالا به صورت زير است :
It is True that C# Persian provides C# programming language content.
The statement above is not False.
جدول زير تمامي انواع عددي صحيح C#، اندازه آنها و رنج قابل قبول آنها را نشان ميدهد.
رنج قابل قبول | اندازه به بيت | نوع |
128- تا 127 | 8 | sbyte |
0 تا 255 | 8 | byte |
32768- تا 32767 | 16 | short |
0 تا 65535 | 16 | ushort |
2147483648- تا 2147483647 | 32 | int |
0 تا 4294967295 | 32 | uint |
9223372036854775808- تا 9223372036854775807 | 64 | long |
0 تا 18446744073709551615 | 64 | ulong |
از اين انواع براي محاسبات عددي استفاده ميگردد. يك نوع ديگر را نيز ميتوان در اين جدول اضافه نمود و آن نوع char است. هر چند شايد از نظر بسياري از دوستاني كه با زبانهاي ديگر برنامهسازي كار كردهاند اين تقسيم بندي غلط به نظر آيد، اما بايد گفت كه در زبان C# نوع char نيز نوع خاصي از انواع عددي است كه رنجي بين صفر تا 65535 دارد و اندازه آن نيز 16 بيتي است، اما به جاي نمايش دادن مقادير عددي تنها ميتواند بيان كننده يك كاراكتر باشد. در آينده در اين مورد بيشتر توضيح خواهم داد.
جدول زير تمامي انواع عددي اعشاري زبان C# را نمايش ميدهد.
رنج قابل قبول | دقت | اندازه به بيت | نوع |
تا | 7 رقم | 32 | float |
تا | 15-16 رقم | 64 | double |
تا | 28-29 رقم دسيمال | 128 | decimal |
انواعي از نوع floating point هنگامي استفاده ميشوند كه محاسبات عددي به دقتهاي اعشاري نياز داشته باشند. همچنين براي منظورهاي تجاري استفاده از نوع decimal بهترين گزينه است. اين نوع تنها در زبان C# وجود دارد و در زبانهاي مشابه به آن نظير Java چنين نوعي در نظر گرفته نشده است.
در يك زبان برنامهسازي نتايج بوسيله ايجاد يك سري عبارت توليد ميگردند. عبارات از تركيب متغيرها و عملگرها در دستورالعملهاي يك زبان ايجاد ميگردند.(توجه نماييد كه عبارت معادل expression و دستورالعمل معادل statement ميباشد كه ايندو با يكديگر متفاوت ميباشند.) جدول زير عملگرهاي موجود در زبان C#، حق تقدم آنها و شركتپذيري آنها را نشان ميدهد.
شركتپذيري | عملگر(ها) | نوع عمل |
از چپ | (x) x.y f(x) a[x] x++ x–
new typeof sizeof checked unchecked |
عمليات ابتدايي |
از چپ | + – ! ~ ++x –x (T)x | عمليات يكاني |
از چپ | * / % | عمليات ضربي |
از چپ | – + | عمليات جمعي |
از چپ | << >> | عمل شيفت |
از چپ | < > <= >= is | عمليات رابطهاي |
از راست | == != | عمليات تساوي |
از چپ | & | عمل AND منطقي |
از چپ | | | عمل OR منطقي |
از چپ | ^ | عمل XOR منطقي |
از چپ | && | عمل AND شرطي |
از چپ | || | عمل OR شرطي |
از چپ | ?: | عمل شرطي |
از راست | = *= /= %= += -= <<= >>= &= ^= |= | عمل انتساب |
شركتپذيري از چپ بدين معناست كه عمليات از چپ به راست محاسبه ميشوند. شركتپذيري از راست بدين معناست كه تمامي محاسبات از راست به چپ صورت ميگيرند. به عنوان مثال در يك عمل تساوي، ابتدا عبارات سمت راست تساوي محاسبه شده و سپس نتيجه به متغير سمت چپ تساوي تخصيص داده ميشود.
مثال 2- عملگرهاي يكاني (Unary)
using System;
class Unary
{
public static void Main()
{
int unary = 0;
int preIncrement;
int preDecrement;
int postIncrement;
int postDecrement;
int positive;
int negative;
sbyte bitNot;
bool logNot;
preIncrement = ++unary;
Console.WriteLine(“Pre-Increment: {0}”, preIncrement);
preDecrement = –unary;
Console.WriteLine(“Pre-Decrement: {0}”, preDecrement);
postDecrement = unary–;
Console.WriteLine(“Post-Decrement: {0}”, postDecrement);
postIncrement = unary++;
Console.WriteLine(“Post-Increment: {0}”, postIncrement);
Console.WriteLine(“Final Value of Unary: {0}”, unary);
positive = -postIncrement;
Console.WriteLine(“Positive: {0}”, positive);
negative = +postIncrement;
Console.WriteLine(“Negative: {0}”, negative);
bitNot = 0;
bitNot = (sbyte)(~bitNot);
Console.WriteLine(“Bitwise Not: {0}”, bitNot);
logNot = false;
logNot = !logNot;
Console.WriteLine(“Logical Not: {0}”, logNot);
}
}
به هنگام محاسبه عبارات، دو عملگر x++ و x—(كه در اينجا كاراكتر x بيان كننده آن است كه عملگرهاي ++ و – در جلوي عملوند قرار ميگيرند post-increment و post-decrement) ابتدا مقدار فعلي عملوند (operand) خود را باز ميگرداند و سپس به عملوند خود يك واحد اضافه كرده يا از آن يك واحد ميكاهند. عملگر ++ يك واحد به عملوند خود اضافه ميكند و عملگر – يك واحد از عملوند خود ميكاهد. بدين ترتيب عبارت x++ معادل است با عبارت x=x+1 و يا x+=1 اما همانطور كه گفته شد بايد توجه داشته باشيد كه اين عملگرها(++ و –) ابتدا مقدار فعلي عملوند خود را برگشت ميدهند و سپس عمل خود را روي آنها انجام ميدهند. بدين معني كه در عبارت x=y++ در صورتيكه در ابتداي اجراي برنامه مقدار x=0 و y=1 باشد، در اولين اجراي برنامه مقدار x برابر با 1 يعني مقدار y ميشود و سپس به متغير y يك واحد افزوده ميشود، در صورتيكه اگر اين عبارت را بصورت x=++y بنويسيم در اولين اجراي برنامه، ابتدا به مقدار متغير y يك واحد افزوده ميشود و سپس اين مقدار به متغير x تخصيص داده ميشود كه در اين حالت مقدار متغير x برابر با 2 ميشود.(در مورد عملگر – نيز چنين است.) پس با اين توضيح ميتوان گفت كه دو عملگر ++x و –x ابتدا به عملوند خود يك واحد اضافه يا يك واحد از آن كم ميكنند و سپس مقدار آنها را باز ميگردانند.
در مثال 2، مقدار متغير unary در قسمت اعلان برابر با 0 قرار گرفته است. هنگاميكه از عملگر ++x استفاده ميكنيم، به مقدار متغير unary يك واحد افزوده ميشود و مقدارش برابر با 1 ميگردد و سپس اين مقدار، يعني 1، به متغير preIncrement تخصيص داده ميشود. عملگر –x مقدار متغير unary را به 0 باز ميگرداند و سپس اين مقدار را به متغير preDecrement نسبت ميدهد.
هنگاميكه از عملگر x– استفاده ميشود، مقدار متغير unary، يا همان مقدار صفر، به متغير postDecrement تخصيص داده ميشود و سپس از مقدار متغير unary يك واحد كم شده و مقدار اين متغير به 1- تغيير ميكند. سپس عملگر x++ مقدار متغير unary، يعني همان 1-، را به متغير postIncrement تخصيص ميدهد و سپس يك واحد به مقدار متغير unary ميافزايد تا مقدار اين متغير برابر با 0 (صفر) شود.
مقدار متغير bitNot در هنگام اعلان برابر با صفر است. با استفاده از عملگر نقيض بيتي (~) (يا عملگر مكملگيري) متغير bitNot بعنوان يك بايت در نظر گرفته ميشود و مقدار آن منفي يا نقيض ميشود. در عمليات بيتي نقيض بدين معناست كه تمامي يكها به صفر و تمامي صفرها به يك تبديل شوند. در اين حالت نمايش باينري عدد صفر يا همان 00000000 به نقيض آن يعني 11111111 تبديل ميگردد.
در اين مثال به عبارت (sbyte)(~bitNot) توجه نماييد. هر عملي كه بر روي انواع short،unshort ، byte و sbyte انجام شود، مقداري از نوع int را باز ميگرداند. بمنظور اينكه بتوانيم نتيجه دلخواه را به متغير bitNot تخصيص دهيم بايد از فرمت (Type) operator استفاده نماييم كه در آن Type نوعي است ميخواهيم نتيجه ما به آن نوع تبديل شود و operator عملي است كه بر روي متغير صورت ميپذيرد. به بيان ديگر چون ميخواهيم مقدار متغير bitNot بصورت بيتي در نظر گرفته شود، پس بايد نتيجه عمل ما بصورت بيتي در آن ذخيره شود كه استفاده از نوع sbyte باعث ميشود تا نتيجه به فرم بيتي (يا بايتي) در متغير ما ذخيره شود. بايد توجه نماييد كه استفاده از فرمت (Type) يا در اصطلاح عمل Casting، در مواقعي كه ميخواهيم تغييري از يك نوع بزرگتر به نوع كوچكتر ايجاد نماييم، مورد استفاده قرار گيرد، چرا كه در اين حالات ممكن است با از دست دادن اطلاعات مواجه باشيم. در اين مثال چون ميخواهيم نوع بزرگتر int را به(32 بيتي) به نوع كوچكتر sbyte (8 بيتي) تبديل نماييم، بدين منظور بايد بطور صريح از عمل Casting استفاده نماييم تا اطلاعاتي در اين تبديل از بين نرود. در مورد تبديل انواع كوچكتر به انواع بزرگتر(مثلا تبديل sbyte به int) نيازي به استفاده از عمل Casting نيست چرا كه امكان از بين رفتن اطلاعات وجود ندارد. در ضمن بايد به يك نكته مهم توجه نماييد و آن تبديل انواع علامتدار(Signed) و بدون علامت(Unsigned) به يكديگر است. در اين حالت خطر بسيار مهمي دادههاي شما را تهديد مينمايد. بحث در مورد مسائل پيچيدهتر در مورد تبديل انواع علامتدار و و بدون علامت به يكديگر در اينجا نميگنجد و سعي ميكنم تا آنها را در مطالب بعدي و در جاي لازم مورد بحث و بررسي قرار دهم.(در صورتيكه برخي از مطالب اين قسمتها براي شما به خوبي قابل درك نيست، نگران نباشيد چراكه در آينده در مثالهايي كه خواهيد ديد تمامي اين مطالب را در عمل نيز حس كرده و با آنها آشنا خواهيد شد.)
عملگر بعدي كه در اين برنامه مورد استفاده قرار گرفته است، عملگر نقيض منطقي يا همان “!” است كه امكان تغيير مقدار يك متغير Boolean را از true به false و بالعكس را فراهم ميآورد. در مثال بالا(مثال شماره 2) مقدار متغير logNot پس از استفاده از عملگر “!” از false به true تغيير كرده است. با توجه به توضيحات اخير خروجي زير از برنامه مثال 2 مورد انتظار است :
Pre-Increment: 1
Pre-Decrement 0
Post-Decrement: 0
Post-Increment -1
Final Value of Unary: 0
Positive: 1
Negative: -1
Bitwise Not: -1
Logical Not: True
مثال 3 – عملگرهاي دوتايي
using System;
class Binary
{
public static void Main()
{
int x, y, result;
float floatResult;
x = 7;
y = 5;
result = x+y;
Console.WriteLine(“x+y: {0}”, result);
result = x-y;
Console.WriteLine(“x-y: {0}”, result);
result = x*y;
Console.WriteLine(“x*y: {0}”, result);
result = x/y;
Console.WriteLine(“x/y: {0}”, result);
floatResult = (float)x/(float)y;
Console.WriteLine(“x/y: {0}”, floatResult);
result = x%y;
Console.WriteLine(“x%y: {0}”, result);
result += x;
Console.WriteLine(“result+=x: {0}”, result);
}
}
خروجي اين برنامه به فرم زير است :
x+y: 12
x-y: 2
x*y: 35
x/y: 1
x/y: 1.4
x%y: 2
result+=x: 9
مثال 3 استفادههاي متفاوتي از عملگرهاي دوتايي را نشان ميدهد.(منظور از عملگر دوتايي، عملگري است كه داراي دو عملوند ميباشد مانند عملگر جمع “+”). بسياري از عملگرهاي مورد استفاده در اين مثال عملگرهاي رياضي هستند و نتيجه عمل آنها مشابه عملي است كه از آنها در رياضيات ديدهايد. از نمونه اين عملگرها ميتوان به عملگرهاي جمع “+”، تفريق “-“، ضرب “*” و تقسيم “/” اشاره نمود.
متغير floatResult از نوع اعشاري يا float تعريف شده است. در اين مثال نيز صريحاً از عمل Casting جهت اسفاده از دو متغير x و y كه از نوع int هستند، براي انجام عملي كه نتيجهاش از نوع float است، استفاده كردهايم.
در اين مثال از عملگر “%” نيز استفاده كردهايم. اين عملگر در عمليات تقسيم كاربرد دارد و باقيمانده تقسيم را برميگرداند. يعني دو عملوند خود را بر يكديگر تقسيم ميكند و باقيمانده اين تقسيم را برميگرداند.
در اين مثال همچنين فرم جديدي از عمل انتساب را بصورت result+=x مشاهده مينماييد. استفاده از عملگرهاي انتسابي كه خود تركيبي از دو عملگر هستند، جهت سهولت در امر برنامهنويسي مورد استفاده قرار ميگيرند. عبارت فوق معادل result = result+x ميباشد. يعني مقدار قبلي متغير result با مقدار متغير x جمع ميشود و نتيجه در متغير result قرار ميگيرد.
يكي ديگر از انواعي كه تا كنون با آن سر و كار داشتهايم نوع رشتهاي (string) است. يك رشته، از قرار گرفتن تعدادي كاراكتر در كنار يكديگر كه داخل يك زوج كوتيشن ” ” قرار گرفتهاند، ايجاد ميگردد. بعنوان مثال “Hi This is a string type”. در اعلان متغيرها نيز در صورت تعريف متغيري از نوع رشتهاي، در صورت نياز به تخصيص مقدار به آن، حتماً كاراكترهايي كه ميخواهيم بعنوان يك رشته به متغيرمان نسبت دهيم را بايد داخل يك زوج كوتيشن ” ” قرار دهيم. به مثال زير توجه نماييد.
string Name;
…
Name = “My name is Meysam”;
همانطور كه در اين مثال مشاهده مينماييد، متغيري از نوع رشتهاي تحت نام Name تعريف شده است و سپس در جايي از برنامه كه نياز به تخصيص مقدار براي اين متغير وجود دارد، عبارت مورد نظر را داخل دو كوتيشن قرار داده و به متغير خود تخصيص دادهايم. رشتهها از پر كاربرد ترين انواع در زبانهاي برنامهسازي جهت ايجاد ارتباط با كاربر و دريافت اطلاعات از كاربر ميباشند.(همانطور كه در درس قبل اول نيز گفته شد، دستور Console.ReadLine() يك رشته را از ورودي دريافت مينمايد.) در مثالهايي كه در طي درسهاي اين سايت خواهيد ديد، نمونههاي بسياري از كاربرد انواع مختلف و نيز نوع رشتهاي را خواهيد ديد.
آرايهها(Arrays)
يكي ديگر از انواع دادهاي در زبان C#، آرايهها (Arrays) ميباشند. يك آرايه را به عنوان مخزني براي نگهداري اطلاعات در نظر ميگيريم كه داراي ليستي از محلهايي است كه در آنها اطلاعات ذخيره شده است و از طريق اين ليست ميتوان به اطلاعات آنها دسترسي پيدا نمود. به هنگام اعلان آرايهها بايد نوع، اندازه و تعداد بعد آنها را نيز معين نمود.
مثال 4- آرايهها و عمليات بر روي آنها
using System;
class Array
{
public static void Main()
{
int[] myInts = { 5, 10, 15 };
bool[][] myBools = new bool[2][];
myBools[0] = new bool[2];
myBools[1] = new bool[1];
double[,] myDoubles = new double[2, 2];
string[] myStrings = new string[3];
Console.WriteLine(“myInts[0]: {0}, myInts[1]: {1}, myInts[2]: {2}”, myInts[0],
myInts[1], myInts[2]);
myBools[0][0] = true;
myBools[0][1] = false;
myBools[1][0] = true;
Console.WriteLine(“myBools[0][0]: {0}, myBools[1][0]: {1}”, myBools[0][0],
myBools[1][0]);
myDoubles[0, 0] = 3.147;
myDoubles[0, 1] = 7.157;
myDoubles[1, 1] = 2.117;
myDoubles[1, 0] = 56.00138917;
Console.WriteLine(“myDoubles[0, 0]: {0}, myDoubles[1, 0]: {1}”, myDoubles[0, 0], myDoubles[1, 0]);
myStrings[0] = “Joe”;
myStrings[1] = “Matt”;
myStrings[2] = “Robert”;
Console.WriteLine(“myStrings[0]: {0}, myStrings[1]: {1}, myStrings[2]: {2}”,
myStrings[0], myStrings[1], myStrings[2]);
}
}
خروجي مثال 4 بصورت زير است :
myInts[0]: 5, myInts[1]: 10, myInts[2]: 15
myBools[0][0]: True, myBools[1][0]: True
myDoubles[0, 0]: 3.147, myDoubles[1, 0]: 56.00138917
myStrings[0]: Joe, myStrings[1]: Matt, myStrings[2]: Robert
در اين مثال انواع مختلفي از آرايهها اعلان شدهاند. در ابتدا يك آرايه تك بعدي، سپس آرايهاي دندانهدار و در نهايت نيز يك آرايه دو بعدي در اين مثال اعلان شدهاند.
اولين اعلان در اين برنامه مربوط به اعلان آرايه تك بعدي myInts ميباشد كه از نوع int بوده و داراي 3 عضو ميباشد كه تعداد اين اعضا با اعلان چند مقدار در داخل { } معين شده است. همانطور كه از اين اعلان دريافت ميشود، آرايه تك بعدي بصورت زير تعريف ميشود :
type[] arrayName;
كه در آن type نوع آرايه و arrayName نام آرايه ايست كه تعريف مينمائيم.
اما در ابتدا گفته شد كه به هنگام اعلان آرايهها اندازه آنها نيز بايد مشخص شود. براي تعيين اندازه آرايه، يعني تعدا عناصري كه آرايه در خود جاي ميدهد، ميتوان به چند روش عمل نمود. اولين و سادهترين روش كه در اين مثال نيز آورده شده است، تخصيص مقاديري به آرايه در داخل يك زوج { } است. بسته به نوع آرايه، تعداد عناصري كه داخل اين زوج { } قرار ميگيرند، تعداد عناصر آرايه ميباشند و مقادير عناصر آرايه نيز همان مقاديري است كه داخل { } قرار گرفته است. به عنوان مثال در مثال 4، اولين آرايه ما داراي 3 عنصر است كه مقادير آنها به ترتيب برابر با 5، 10 و 15 ميباشد.
روش ديگر جهت تعيين اندازه آرايه استفاده از روش تعريف كامل آرايه است كه به فرم كلي زير ميباشد.
type[] arrayName = new type[n];
كه در اين تعريف، استفاده از كلمه كليدي new باعث ايجاد نمونهاي جديد از نوع مورد نظر، ميشود. n نيز تعداد عناصر آرايه است كه ميخواهيم آنرا توليد نماييم. در اين حالت بايد توجه داشت كه آرايهاي تهي را توليد نمودهايم و هيچ عنصري را در آرايه جاي ندادهايم و در برنامه بايد آرايه را مقدار دهي نماييم. به مثال زير توجه كنيد.
int[] myArray = new int[15];
اين مثال آرايهاي تك بعدي از نوع int را با اندازه 15 عنصر توليد مينمايد. يعني اين آرايه قادر است تا 15 عنصر از نوع int را در خود ذخيره نمايد.
گونه ديگري از آرايهها، آرايههاي چند بعدي (Multi Dimensional Arrays) هستند كه براي نگهداري اطلاعات از چندين بعد استفاده ميكنند و بيشتر براي نگداري جداول و ماتريسها مورد استفاده قرار ميگيرند. فرم كلي اعلان اين آرايهها بصورت زير است :
type[ , , … , ] arrayName = new type[n1, n2, …. , nm];
كه در آن تعداد ابعاد آرايه با ويرگول مشخص شده و n1 تا nm نيز تعداد عناصر هر يك از ابعاد است. بعنوان مثال تعريف يك آرايه سه بعدي به فرم زير است :
char[ , , ] charArray = new char[3,5,7];
در اين مثال يك آرايه سه بعدي از نوع char توليد كردهايم كه ابعاد آن به ترتيب داراي 3، 5 و 7 عنصر ميباشند.
نوع ديگري از آرايهها، آرايههاي دندانهدار (Jagged Arrays) هستند. اين نوع آرايهها تنها در زبان C# وجود دارند و در صرفهجويي حافظه بسيار موثر ميباسند. يك آرايه دندانهدار، در حقيقت يك آرايه تك بعدي است كه هر يك از اعضاي آن خود يك آرايه تك بعدي ميباشند. اندازه اين عناصر ميتواند متفاوت باشد و تفاوت اين آرايهها با آرايههاي چند بعدي در همين جا نمايان ميشود. استفاده از اين آرايهها در مواردي كاربرد دارد كه نيازي نيست تا تمامي ابعاد آرايه داراي تعداد عناصر مساوي باشند. بعنوان مثال فرض كنيد ميخواهيد آرايهاي جهت نگهداري تعداد روزهاي ماههاي مختلف سال تهيه كنيد. در صورتيكه بخواهيد از آرايه چند بعدي استفاده نماييد، چون تعداد روزهاي تمامي ماههاي سال يكسان نيست، مجبوريد تا تعداد عناصر تمام بعدهاي آرايه را برابر با بزرگترين تعداد روز ماهها، يعني 31، تعريف نماييد. ولي چون تنها 6 ماه داراي 31 روز ميباشند، براي 6 ماه ديگر تعدادي از عناصر آرايه هيچگاه مورد استفاده قرار نميگيرند و حافظه را به هدر دادهايم. اما در صورتيكه براي اين مثال از آرايههاي دندانهدار استفاده نماييم، ميتوانيم يك آرايه دندانهدار 12 عنصري تعريف نماييم و سپس تعداد عناصر هر يك از اعضاي آنرا برابر با تعداد روزهاي ماه مورد نظر تعريف كنيم :
با استفاده از آرايه چند بعدي :
int[ , ] monthArray = new int[12,31];
با استفاده از آرايه دندانهدار :
int[][] monthArray = new int[12][];
در تعريف اول كه در آن از آرايه چند بعدي استفاده كرديم، مشاهده ميكنيد كه آرايهاي دو بعدي تعريف كردهايم كه بعد اول آن 12 عضو و بعد دوم آن 31 عضو دارد. اين عمل دقيقاً همانند ايجاد يك جدول براي نگهداري روزهاي ماههاي سال است.
اما در حالت دوم كه در آن از آرايه دندانهدار بهره بردهايم، يك آرايه تعريف نمودهايم كه بعد اول آن 12 عضو دارد ولي بعد دوم آنرا را تعريف نكردهايم كه داراي چند عضو است و هر يك از عناصر بعد اول آرايه ميتواند داراي تعداد اعضاي متفاوتي باشد كه با استفاده از اين روش ميتوان به هر يك از ماههاي سال تعداد روزهاي مورد نظر آن ماه را تخصيص داد و فضايي بلا استفاده ايجاد نخواهيم كرد. توجه نماييد كه چون تعداد عناصر بعد ديگر اين آرايه معين نشده است در برنامه بايد اين تعداد عنصر را مشخص نماييم :
monthArray[1] = new int[31];
monthArray[10] = new int [30];
مشاهده ميكنيد كه به هر ماه، تعدا عنصر مورد نياز خود را تخصيص دادهايم. تنها بايد به تفاوت اعلان آرايههاي دندانهدار با آرايههاي چند بعدي توجه نماييد.
دسترسي به عناصر آرايه از طريق انديس امكان پذير است. انديس شماره محل ذخيرهسازي دادههاي ما ميباشد كه با دادن اين شماره ميتوانيم به داده مورد نظر دسترسي پيدا كنيم. در C# همانند C و C++ انديس خانههاي آرايه از صفر آغاز ميگردد يعني اولين خانه آرايه داراي شماره صفر است و عناصر بعدي به ترتيب يك واحد به انديسشان اضافه ميگردد. پس شماره انديس آرايه هميشه يك واحد كمتر از تعداد عناصر آن است، يعني آرايهاي كه 10 عضو دارد بزرگترين انديس خانههايش 9 ميباشد. دسترسي به عناصر هر يك از ابعاد آرايه با انديس امكان پذير است. معمولاً به بعد اول آرايه سطر و به بعد دوم آن ستون ميگويد. مثلاً monthArray[3,7] عنصر واقع در سطر 3 و ستون 7 آرايه را مشخص مينمايد.(توجه داشته باشيد كه انديس دهي آرايه از صفر آغاز ميشود و بعنوان مثال intArray[12] به خانه شماره 12 آرايه اشاره ميكند اما فراموش نكنيد چون انديس آرايه از صفر آغاز ميشود خانه شماره 12 آرايه، سيزدهمين داده شما را در خود جاي ميدهد.)
12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
اگر شكل فوق را آرايهاي تك بعدي تصور نماييد، مشاهده مينماييد كه خانه شماره 5 آرايه حاوي اطلاعات مربوط به ششمين داده ورودي شما ميباشد.
نكته ديگري كه بايد در مورد تعريف آرايههاي اين مثال متذكر شوم در مورد آريههائيست كه از نوع string تعريف ميشوند. دوستاني كه با زبان C كار كردهاند حتماً ميدانند كه آرايهاي از نوع رشتهاي در C وجود ندارد و براي نگهداري چندين رشته در يك آرايه بايد از آرايه دو بعدي استفاده كرد. در C# اين قابليت فراهم شده تا با استفاده از يك آرايه تك بعدي بتوان چندين رشته را ذخيره نمود بدين صورت كه هر يك از عناصر آرايه نك بعدي محلي براي ذخيرهسازي يك رشته است و همانند زبان C نياز به پردازشهاي گاه پيچيده بر روي آرايههاي چند بعدي بمنظور كار با رشتهها، وجود ندارد. بعنوان يك توضيح كمي اختصاصي عرض ميكنم كه در زبانهايي مانند C، در صورتيكه ميخواستيد چندين رشته را در آرايهاي ذخيره كنيد تا بتوانيد با انديس به آنها دسترسي داشته باشيد، مجبور به تعريف يك آرايه دو بعدي بوديد كه با استفاده از تنها انديس اول آرايه ميتوانستيد به عناصر رشتهاي آرايه دسترسي پيدا كنيد، اما در C# تنها با استفاده از يك آرايه تك بعدي ميتوان همان كار را انجام داد.
string[] stringArray = {“My name is Meysam”, “This is C# Persian Blog”}
…..
Console.WriteLine(“{0}”,stringArray[0]);
…..
همانطور كه در اين مثال ملاحظه ميكنيد، آرايهاي از نوع رشته تعريف شده و دو عنصر به آن تخصيص داده شده است و در جايي در متن برنامه با استفاده از انديس از اولين عنصر اين آرايه براي نمايش در خروجي استفاده گرديده است. خروجي اين برنامه به شكل زير است :
My name is Meysam
درس چهارم – دستورالعملهاي كنترلي، حلقهها
در اين درس نحوه استفاده از دستورالعملهاي كنترل حلقه در زبان C# را فرا خواهيد گرفت. هدف اين درس فهم و درك موارد زير ميباشد :
حلقه while
حلقه do-while
حلقه for
حلقه foreach
مطالب تكميلي درباره دستورالعمل break
فراگيري نحوه بكارگيري دستورالعمل continue
در درس قبل، نحوه ايجاد يك حلقه بسيار ساده را با استفاده از دستور goto را فرا گرفتيد. در همان مطلب نيز اشاره كرديم كه اين روش، روش مناسبي جهت ايجاد حلقه نيست. در اين درس با نحوه صحيح ايجاد حلقهها در زبان C# آشنا خواهيد شد. اولين دستوري كه با آن آشنا ميشويد نيز دستور while است.
حلقه while
ابتدا به مثال زير توجه نماييد.
using System;
class WhileLoop
{
public static void Main()
{
int myInt = 0;
while (myInt < 10)
{
Console.Write(“{0} “, myInt);
myInt++;
}
Console.WriteLine();
}
}
مثال 1-4 كه در بالا ملاحظه ميكنيد، يك حلقه while ساده را نشان ميدهد. اين حلقه با كلمه كليدي while آغاز شده و سپس به دنبال آن يك عبارت منطقي قرار ميگيرد و مورد بررسي قرار ميگيرد. تمامي دستورالعملهاي كنترلي از يك عبارت منطقي بهره ميگيرند و اين بدين معناست كه ابتدا اين عبارت بايد بررسي شود تا مشخص شود مقدار اين عبارت true است يا false. در اين مثال مقدار متغير myInt مورد بررسي قرار ميگيرد تا چك شود آيا مقدارش از 10 كوچكتر هست يا خير. چون در ابتداي برنامه به اين متغير مقدار صفر تخصيص داده شده است، عبارت منطقي مقدار true را باز ميگرداند و سپس بلوك قرار گرفته بعد از عبارت منطقي مورد اجرا قرار ميگيرد.
درون بلوك while ابتدا مقدار متغير myInt در كنسول نمايش داده ميشود و سپس يك واحد به مقدار اين متغير افزوده ميگردد. پس از اتمام بلوك while، عبارت منطقي مجددا كنترل ميشود و در صورتيكه اين عبارت مقدار true بازگرداند، حلقه while مجدداً اجرا ميشود. زمانيكه عبارت منطقي مقدار false برگرداند، اجرا برنامه به اولين دستور بعد از بلوك while منتقل ميشود. در اين مثال اعداد صفر تا 9 بر روي صفحه نمايش داده ميشوند و سپس يك خط خالي چاپ شده و اجراي برنامه خاتمه مييابد.
حلقه بعدي كه بسيار شبيه به حلقه while ميباشد، حلقه do-while است.
حلقه do-while
ابتدا به مثال 2-4 توجه نماييد.
using System;
class DoLoop
{
public static void Main()
{
string myChoice;
do
{
// منويي نمايش داده ميشود
Console.WriteLine(“My Address Book\n”);
Console.WriteLine(“A – Add New Address”);
Console.WriteLine(“D – Delete Address”);
Console.WriteLine(“M – Modify Address”);
Console.WriteLine(“V – View Addresses”);
Console.WriteLine(“Q – Quit\n”);
Console.WriteLine(“Choice (A,D,M,V,or Q): “);
// ورودي كاربر بررسي ميشود
myChoice = Console.ReadLine();
// تصميمي بر اساس ورودي كاربر گرفته ميشود
switch(myChoice)
{
case “A”:
case “a”:
Console.WriteLine(“You wish to add an address.”);
break;
case “D”:
case “d”:
Console.WriteLine(“You wish to delete an address.”);
break;
case “M”:
case “m”:
Console.WriteLine(“You wish to modify an address.”);
break;
case “V”:
case “v”:
Console.WriteLine(“You wish to view the address list.”);
break;
case “Q”:
case “q”:
Console.WriteLine(“Bye.”);
break;
default:
Console.WriteLine(“{0} is not a valid choice”, myChoice);
break;
}
Console.Write(“Press Enter key to continue…”);
Console.ReadLine();
Console.WriteLine();
} while (myChoice != “Q” && myChoice != “q”);
}
}
مثال 2-4 نحوه استفاده از حلقه do-while را نشان ميدهد. ساختار نوشتاري اين دستور بصورت زير است :
do
{ <statements> } while (<boolean expression>);
دستورالعملهاي مورد استفاده در بلوك اين دستور، هر دستورالعمل معتبر زبان C# ميتواند باشد. عبارت منطقي نيز همانند نمونههائيست كه تا كنون با آنها آشنا شديم و يكي از دو مقدار true يا false را بر ميگرداند.
يكي از مصارف عمده حلقه do به جاي حلقه while، مواردي است كه ميخواهيم يكسري دستورالعمل خاص، كه آنها را درون بلوك do قرار ميدهيم، حداقل يكبار اجرا شوند. در اين مثال ابتدا يك منو براي كاربر نمايش داده ميشود و سپس ورودي از وي دريافت ميگردد. چون حلقه while عبارت منطقي خود در ابتداي اجراي حلقه بررسي مينمايد، از اينرو تضميني براي اجراي دستورات درون بلوك وجود نخواهد داشت، مگر شما بطور صريح برنامه را طوري طراحي نماييد كه اين عمل اتفاق بيفتد.
يك نگاه كلي به مثال 2-4 بيندازيم. در متد Main() متغير myChoice را از نوع رشتهاي تعريف نمودهايم. سپس يكسري دستورات را بر روي كنسول چاپ نمودهايم. اين دستورات منوهاي انتخاب براي كاربر هستند. ما بايد ورودي از كاربر دريافت كنيم كه چون اين عمل از طريق Console.ReadLine() صورت گرفته، بايد در متغيري از نوع رشتهاي قرار گيرد و از اينرو اين ورودي را در myChoice قرار دادهايم. ما بايد ورودي را از كاربر دريافت كنيم و بر روي آن پردازش انجام دهيم. يك روش كارآمد براي اين منظور استفاده از دستورالعمل switch است. همانطور كه در دستور switch ملاحظه ميكنيد، بري default نيز دستوري در نظر گرفته شده است كه نشان ميدهد مقدار ورودي معتبر نيست.
حلقه for
به مثال 3-4 توجه كنيد.
using System;
class ForLoop
{
public static void Main()
{
for (int i=0; i < 20; i++)
{
if (i == 10)
break;
if (i % 2 == 0)
continue;
Console.Write(“{0} “, i);
}
Console.WriteLine();
}
}
مثال 3-4 يك حلقه for را نشان ميدهد. استفاده از حلقه for براي زماني مناسب است كه دقيقاً بدانيد كه حلقه چندبار بايد تكرا شود. محتويات درون پرانتزهاي حلقه for از سه قسمت تشكيل شده است :
(<initializer list>; <boolean expression>; <postloopaction list>)
initializer list ليستي از عبارات است كه بوسيله كاما از يكديگر جدا ميشوند. اين عبارات تنها يكبار در طول دوره كاري حلقه for پردازش ميشوند. همانطور كه در مثال 3-4 نيز ملاحظه ميكنيد، اين قسمت معمولا براي تعيين متغيري عددي جهت آغاز عمل شمارش مورد استفاده قرار ميگيرد.
پس از اينكه عبارتهاي دورن initializer list پردازش شد، حلقه for به سراغ قسمت بعدي، يعني عبارات منطقي(boolean expression) ميرود. در اين قسمت تنها يك عبارت منطقي ميتوان قرار داد ولي هر اندازه كه بخواهيد ميتوانيد اين عبارت منطقي را پيچيده نماييد، فقط توجه نماييد كه اين عبارت بايد بگونهاي شود كه مقدار true يا false برگرداند. از اين عبارت منطقي معمولا جهت كنترل متغير شمارشي استفاده ميشود.
هنگاميكه عبارت منطقي مقدار true بازگرداند، دستورالعملهاي بلوك for اجرا ميشوند. در مثال 3-4 ما از دو دستور if درون حلقه for نيز استفاده كردهايم. اولين دستور if بررسي ميكند كه آيا مقدار متغير i برابر با 10 هست يا نه. در اينجا يك نمونه ديگر از استفاده دستور break را ملاحظه ميكنيد. عملكرد دستور break در اينجا نيز همانند مورد استفاده آن در دستور switch است. در صورت اجراي دستور break اجراي حلقه for خاتمه يافته و اجراي برنامه به اولين دستور بعد از حلقه for منتقل ميشود.
دومين دستور if با اسقتاده از عملگر باقيمانده (%) بررسي ميكند كه آيا متغير i بر 2 بخش پذير هست يا نه. در صورتيكه متغير i بر 2 بخش پذير باشد، دستور continue اجرا ميشود. پس از اجراي دستور continue از ساير دستورات حلقه for كه بعد از continue قرار گرفتهاند صرفهنظر ميشود و اجراي برنامه به اول حلقه for باز ميگردد.
قسمت سوم در حلقه for، قسمت postloopaction list است. پس از اينكه تمامي دستورات درون حلقه for اجرا شد، اجراي حلقه به اين قسمت باز ميگردد. اين قسمت ليستي از عملياتي است كه ميخواهيد پس از اجراي دستورات درون بلوك حلقه for انجام شوند. در مثال 3-4 اين عمل، اضافه كردن يك واحد به متغير شمارشي است. پس از افزوده شدن يك واحد به متغير شمارشي، عبارت منطقي مجدداً مورد بررسي قرار ميگيرد و در صورتيكه مقدار اين عبارت برابر با true باشد، حلقه for مجدداً اجرا ميگردد. حلقه for تا زمانيكه عبارت منطقي برابر با true باشد اجرا ميشود.
حلقه foreach
به مثال 4-4 توجه كنيد.
using System;
class ForEachLoop
{
public static void Main()
{
string[] names = {“Meysam”, “Ghazvini”, “C#”, “Persian”};
foreach (string person in names)
{
Console.WriteLine(“{0} “, person);
}
}
}
حلقه foreach براي پيمايش مجموعهها بسيار مناسب است. يك نمونه از مجموعهها در C#، آرايهها هستند كه در مثال 4-4 نيز مورد استفاده قرار گرفته است. اولين كاري كه در متد Main() صورت گرفته، اعلان آرايه names از نوع رشتهاي و مقدار دهي آن است.
درون پرانتزهاي foreach عبارتي متشكل از دو المان قرار دارد كه اين المانها بوسيله كلمه كليدي in از يكديگر جدا شدهاند. المان سمت راست، مجموعهايست كه ميخواهيد اعضاي آنرا مورد پيمايش قرار دهيد. المان سمت چپ، متغيري از نوع مجموعه مورد نظر است كه مقادير پيمايش شده را بر ميگرداند.
در هربار پيمايش، عنصري جديدي از مجموعه درخواست ميشود. اين درخواستها از طريق متغير فقط خواندني تعريف شده درون پرانتزهاي foreach بازگردانده ميشوند. تا زمانيكه عنصري در مجموعه وجود داشته باشد كه مورد پيمايش قرار نگرفته است، حلقه foreach به كار خود ادامه خواهد داد زيرا عبارت منطقي حلقه foreach مقدار true را باز ميگرداند. به محض اينكه تمامي عناصر مجموعه پيمايش شد، عبارت منطقي برابر با false شده و اجراي حلقه foreach خاتمه مييابد. در اين حالت اجراي برنامه به اولين دستور بعد از حلقه foreach منتقل ميگردد.
در مثال 4-4، متغيري از نوع رشته با نام person براي نگهداري عناصري كه از آرايه names خوانده ميشود، تعريف كردهايم. تا زمانيكه اسمي در آرايه names وجود داشته باشد، در متغير person قرار ميگيرد و درون حلقه foreach بوسيله دستور Console.WriteLine() در خروجي نمايش داده ميشود.
نكته : يكي از مهمترين ويژگيهاي حلقه foreach در آنست كه فقط ميتواند عناصر يك مجموعه را بخواند و نميتواند تغييري در آنها ايجاد نمايد. مزيت ديگر آن، پيمايش تمامي عناصر مجموعه بدون اطلاع از تعداد عناصر موجود در آن است.
خلاصه
در اين درس با نحوه كار با دستورالعملهاي for، while، do-while و foreach آشنا شديد. حلقه while تا زمانيكه شرطش صحيح باشد انجام ميشود بدين معني كه تا زمانيكه عبارت منطقي آن داراي مقدار true باشد، دستورات درون بلوك آن اجرا ميشوند. حلقه do، دستورات بلوك خود را حداقل يكبار اجرا ميكند و سپس شرط مورد نظر را بررسي مينمايد و در صورتيكه عبارت منطقي آن مقدار true بازگرداند، دستورات بلوك خود را تكرار مينمايد. حلقه for دستورات بلوك خود را به تعداد دفعات مشخص اجرا مينمايد و حلقه foreach عناصر يك مجموعه را مورد پيمايش قرار ميدهد. در نهايت نيز اشاره ميشود كه روند اجراي حلقهها با استفاده از دستورات break و continue تغيير مينمايد
درس پنجم – متدها
در اين قسمت با متدها در زبان C# آشنا ميشويد. اهداف اين درس به شرح زير ميباشد :
درك ساختار يك متد
درك تفاوت بين متدهاي استاتيك (static methods) و متدهاي نمونه (instance)
ايجاد نمونه جديد از اشياء
نحوه فراخواني متدها
درك چهار گونه متفاوت پارامترها
نحوه استفاده از مرجع this
تا كنون تمامي اعمالي كه ما در برنامههايمان انجام ميداديم در متد Main() اتفاق ميافتادند. اين روش براي برنامههاي ساده و ابتدايي كه استفاده كرديم مناسب بود، اما اگر برنامهها پيچيدهتر شوند و تعداد كارهاي مورد نظر ما گسترش يابد، استفاده از متدها جايگزين روش قبل ميگردد. متدها فوقالعاده مفيد هستند، چراكه كارها را به بخشهاي كوچكتر و مجزا تقيسم ميكنند و در نتيجه استفاده از آنها آسانتر خواهد بود.
ساختار كلي يك متد به صورت زير است :
[attributes][ modifiers] return-type method-name ([ parameters] ) { statements }
دو قسمت attributes و modifiers را در آينده مورد بررسي قرار خواهيم داد. return-type نوعي است يك متد باز ميگرداند و ميتواند هر يك از انواع تعريف شده زبان C# و يا از انواع تعريف شده توسط كاربر باشد. هر متد با نام آن شناخته ميشود. method-name نام انتخابي برنامهنويس براي يك متد است و از طريق همين نام فراخواني متد انجام ميشود. پارامترها (parameters) مولفهها يا متغيرهايي هستند كه براي انجام يكسري پردازش به متد ارسال ميشوند و از طريق آنها ميتوان اطلاعاتي را به متد ارسال و يا از آن دريافت نمود، و در نهايت دستورالعمهاي متد، دستورهايي از زبان C# هستند كه بوسيله آنها عمل مورد نظر برنامهنويس انجام ميشود و عملي است كه يك متد آنرا انجام ميدهد. مثال 1-5 پيادهسازي يك متد ساده را نمايش ميدهد.
using System;
class OneMethod
{
public static void Main()
{
string myChoice;
OneMethod om = new OneMethod();
do
{
myChoice = om.getChoice();
// تصميمي بر اساس انتخاب كاربر گرفته ميشود
switch(myChoice)
{
case “A”:
case “a”:
Console.WriteLine(“You wish to add an address.”);
break;
case “D”:
case “d”:
Console.WriteLine(“You wish to delete an address.”);
break;
case “M”:
case “m”:
Console.WriteLine(“You wish to modify an address.”);
break;
case “V”:
case “v”:
Console.WriteLine(“You wish to view the address list.”);
break;
case “Q”:
case “q”:
Console.WriteLine(“Bye.”);
break;
default:
Console.WriteLine(“{0} is not a valid choice”, myChoice);
break;
}
// اجراي برنامه براي ديدن نتايج موقف ميشود
Console.WriteLine();
Console.Write(“Press Enter key to continue…”);
Console.ReadLine();
Console.WriteLine();
} while (myChoice != “Q” && myChoice != “q”);
// اجراي برنامه تا زمانيكه كاربر بخواهد ادامه مييابد
}
string getChoice()
{
string myChoice;
// منويي را نمايش ميدهد
Console.WriteLine(“My Address Book\n”);
Console.WriteLine(“A – Add New Address”);
Console.WriteLine(“D – Delete Address”);
Console.WriteLine(“M – Modify Address”);
Console.WriteLine(“V – View Addresses”);
Console.WriteLine(“Q – Quit\n”);
Console.Write(“Choice (A,D,M,V,or Q): “);
// ورودي دريافتي از كاربر را بررسي ميكند
myChoice = Console.ReadLine();
Console.WriteLine();
return myChoice;
}
}
برنامه مثال 1-5 دقيقا همان برنامه در س 4 است، با اين تفاوت كه در درس چهارم چاپ منو و دريافت ورودي از كاربر در متد Main() صورت ميگرفت در حاليكه در اين مثال، اين اعمال در يك متد مجزا بنام getChoice() صورت ميگيرد. نوع بازگشتي اين متد از نوع رشتهاي است. از اين رشته در دستور switch در متد Main() استفاده ميشود. همانطور كه ملاحظه مينماييد، پرانتزهاي متد getChoice() خالي هستند، يعني اين متد داراي پارامتر نيست، از اينرو هيچ اطلاعاتي به/ از اين متد منتقل نميشود.
درون اين متد، ابتدا متغير myChoice را اعلان نمودهايم. هرچند نام و نوع اين متغير همانند متغير myChoice موجود در متد Main() است، اما اين دو متغير دو متغير كاملاً مجزا از يكديگر ميباشند. هر دو اين متغيرها، متغيرهاي محلي (Local) هستند، از اينرو تنها درون بلوكي كه تعريف شدهاند قابل دسترس ميباشند. به بيان ديگر اين دو متغير از وجود يكديگر اطلاعي ندارند.
متد getChoice() منويي را در كنسول نمايش ميدهد و ورودي انتخابي كاربر را دريافت مينمايد. دستور return دادهها را از طريق متغير myChoice به متد فراخواننده آن، يعني Main()، باز ميگرداند. توجه داشته باشيد كه، نوع متغيري كه توسط دستور return باز گردانده ميشود، بايد دقيقاً همانند نوع بازگشتي متد باشد. در اين مثال نوع بازگشتي، رشته است.
در C# دو گونه متد وجود دارد. يكي متدهاي استاتيك (Static) و ديگري متدهاي نمونه (Instance). متدهايي كه در اعلان خود شامل كلمه كليدي static هستند، از نوع استاتيك هستند، بدين معنا كه هيچ نمونهاي از روي اين متد قابل ايجاد نيست و اين تنها همين نمونه موجود قابل استفاده است. از روي متدهاي استاتيك نميتوان شيء (Object) ايجاد كرد. در صورتيكه در اعلان متد از كلمه كليدي static استفاده نشده باشد، متد بعنوان متد نمونه در نظر گرفته ميشود، بدين معنا كه از روي آن ميتوان نمونه ايجاد كرد و شيء توليد نمود. هر يك از اشياء ايجاد شده از روي اين متدها، تمامي عناصر آن متد را داراي ميباشند.
در اين مثال، چون getChoice() بصورت استاتيك اعلان نشده است، پس بايد براي استفاده از آن شيء جديدي توليد شود. توليد شيء جديد بوسيله OneMethod om = new OneMethod() صورت ميپذيرد. در سمت چپ اين اعلان، مرجع اين شيء جديد، يعني om، قرار دارد كه از نوع OneMethod است. در اينجا توجه به يك نكته بسيار مهم است، om به خودي خود شيء نيست، بلكه ميتواند مرجعي به شياي از نوع OneMethod() را در خود نگهدارد. در سمت راست اين اعلان، تخصيص شيء جديدي از نوع OneMethod() به متغير om صورت گرفته است. كلمه كليدي new عملگري است كه شيء جديدي را در heap ايجاد مينمايد. اتفاقي كه اينجا روي داده اينست كه نمونه جديدي از OneMethod() در heap توليد شده و سپس به مرجع om تخصيص داده ميشود. حال كه نمونهاي از متد OneMethod() را به om تخصيص دادهايم، از طريق om ميتوانيم با اين متد كار نماييم.
متدها، فيلدها و ساير اعضاي يك كلاس از طريق عملگر نقطه “.” قابل دسترس هستند. هنگاميكه ميخواهيم متد getChoice() را فراخواني كنيم، بوسيله عملگر نقطه از طريق om به آن دسترسي پيدا مينماييم : om.getChoice() . براي نگهداري مقداري كه getChoice() بر ميگرداند، از عملگر “=” استفاده نمودهايم. رشته بازگشتي از متد getChoice() درون متغير محلي myChoice متد Main() قرار ميگيرد. از اين قسمت، اجراي برنامه همانند قبل است.
پارامترهاي متد
به مثال 2-5 توجه كنيد.
using System;
class Address
{
public string name;
public string address;
}//Addressپايان كلاس
class MethodParams
{
public static void Main()
{
string myChoice;
MethodParams mp = new MethodParams();
do
{
// منويي نمايش داده شده و ورودي از كاربر دريافت ميگردد
myChoice = mp.getChoice();
// تصميمي بر اساس ورودي كاربر گرفته ميشود
mp.makeDecision(myChoice);
// جهت ديدن نتايج توسط كاربر، اجراي برنامه موقتا موقف ميگردد
Console.Write(“Press Enter key to continue…”);
Console.ReadLine();
Console.WriteLine();
} while (myChoice != “Q” && myChoice != “q”);
// اجراي حلقه تا زمانيكه كاربر بخواهد ادامه پيدا مينمايد
}//Mainپايان متد
// نمايش منو و دريافت ورودي از كاربر
string getChoice()
{
string myChoice;
// نمايش منو
Console.WriteLine(“My Address Book\n”);
Console.WriteLine(“A – Add New Address”);
Console.WriteLine(“D – Delete Address”);
Console.WriteLine(“M – Modify Address”);
Console.WriteLine(“V – View Addresses”);
Console.WriteLine(“Q – Quit\n”);
Console.WriteLine(“Choice (A,D,M,V,or Q): “);
// دريافت ورودي كاربر
myChoice = Console.ReadLine();
return myChoice;
}//getChoice()پايان متد
// تصميمگيري
void makeDecision(string myChoice)
{
Address addr = new Address();
switch(myChoice)
{
case “A”:
case “a”:
addr.name = “Meysam”;
addr.address = “C# Persian”;
this.addAddress(ref addr);
break;
case “D”:
case “d”:
addr.name = “Ghazvini”;
this.deleteAddress(addr.name);
break;
case “M”:
case “m”:
addr.name = “CSharp”;
this.modifyAddress(out addr);
Console.WriteLine(“Name is now {0}.”, addr.name);
break;
case “V”:
case “v”:
this.viewAddresses(“Meysam”, “Ghazvini”, “C#”, “Persian”);
break;
case “Q”:
case “q”:
Console.WriteLine(“Bye.”);
break;
default:
Console.WriteLine(“{0} is not a valid choice”, myChoice);
break;
}
}
// وارد كردن يك آدرس
void addAddress(ref Address addr)
{
Console.WriteLine(“Name: {0}, Address: {1} added.”, addr.name, addr.address);
}
// حذف يك آدرس
void deleteAddress(string name)
{
Console.WriteLine(“You wish to delete {0}’s address.”, name);
}
// تغيير يك آدرس
void modifyAddress(out Address addr)
{
//Console.WriteLine(“Name: {0}.”, addr.name); // خطا رخ ميدهد
addr = new Address();
addr.name = “Meysam”;
addr.address = “C# Persian”;
}
// نمايش آدرسها
void viewAddresses(params string[] names)
{
foreach (string name in names)
{
Console.WriteLine(“Name: {0}”, name);
}
}
}
مثال 2-5، نمونه تغيير يافته مثال 1-5 است كه در آن تمامي برنامه ماژولار شده و به متدهاي مختلف تقسيم شده است. در زبان C# چهار گونه پارامتر وجود دارند : ref، out، params و value . بمنظور آشنايي با پارامترها، در مثال 2-5 كلاسي با نام Address با دو فيلد از نوع رشته توليد كردهايم.
درون متد Main()، متد getChoice() را فراخواني كردهايم تا از كاربر ورودي دريافت كنيم و اين ورودي در متغير رشتهاي myChoice قرار ميگيرد. سپس متغير myChoice را بعنوان آرگومان به متد makeDecision() ارسال نمودهايم. در اعلان myDecision()، همانطور كه ملاحظه مينماييد، پارامتر اين متد از نوع رشته و با نام myChoice تعريف شده است. توجه نماييد كه اين متغير نيز محلي است و تنها درون متد makeDecision() قابل استفاده است. هرگاه در اعلان متد، براي پارامترهاي آن هيچ modifier آورده نشود، اين پارامتر بعنوان value در نظر گرفته ميشود. در مورد پارامترهاي مقداري (value parameter) ، اصل مقدار متغير يا پارامتر به پشته (Stack) كپي ميشود. متغيرهايي كه بصورت مقداري بعنوان پارامتر براي يك متد ارسال ميشوند، همگي محلي بوده و تغييرات ايجاد شده بر روي آنها به هيچ وجه تغييري بر روي متغير اصلي ايجاد نمينمايد.
دستور switch در متد makeDecision() براي هر case يك متد را فراخواني مينمايد. فراخواني اين متدها با آنچه در متد Main() ديد مقداري متفاوت است. علاوه بر مرجع mp، در اين فراخوانيها از كلمه كليدي this نيز استفاده شده است. كلمه كليدي this ارجاعي به شيء فعلي دارد.
متد addAddress() پارامتري از نوع ref دارد. وجود چنين پارامتري بدين معناست كه مرجعي از اين پارامتر به متد ارسال ميشود و اين مرجع همچنان به شيء اصلي درون heap نيز اشاره دارد چراكه آدرس شيء مورد نظر به متد كپي ميشود. در مورد پارامترهاي ref، هرگونه تغييري كه بر روي متغير محلي رخ دهد، همان تغيير بر روي متغير اصلي نيز اعمال ميگردد. امكان تغيير مرجع وجود ندارد و تنها شياي كه مورد آدرسدهي واقع شده، ميتواند تغيير پيدا نمايد. پارامترهاي مرجعي (ref) را ميتوان به عنوان عناصر ورودي/خروجي براي متد در نظر گرفت.
پارامترهاي out در مواردي استفاده ميشوند كه ارسال اطلاعات به متد از طريق پارامتر مد نظر نباشد، بلكه ارسال اطلاعات از متد مورد نظر باشد. استفاده از اين پارامترها از اينرو كارآمد هستند كه برنامه مجبور به كپي كردن پارامتر به متد نيست و از حجم سرباره (Overhead) برنامه ميكاهد. در برنامههاي عادي اين مسئله چندان به چشم نميآيد، اما در برنامههاي تحت شبكه كه سرعت ارتباط و انتقال دادهها بسيار مهم است، اين پارامترها ضروري ميشوند.
متد modifyAddress() داراي پارامتري از نوع out است. پارامترهاي out فقط به متد فراخواننده آن بازگشت داده ميشوند. از آنجائيكه اين پارامترها از متد فراخواننده هيچ مقداري دريافت نميكنند و فقط درون متدي كه به عنوان پارامتر به آن ارسال شدهاند قابليت تغيير دارند، از اينرو درون اين متدهايي كه به آنها ارسال ميشوند، قبل از اينكه بتوان از آنها استفاده نمود بايد مقداري به آنها تخصيص داده شود. اولين خط در متد modifyAddress() بصورت توضيحات نوشته شده است. اين خط را از حالت توضيحات خارج كرده و سپس برنامه اجرا كنيد تا ببينيد چه اتفاقي رخ خواهد داد. هنگاميكه اين پارامتر مقدار دهي شود و مقداري را به متد فراخواننده خود بازگرداند، اين مقدار بر روي متغير متد فراخواننده كپي ميگردد. توجه نماييد كه پارامترهاي out ميبايست قبل از دستور return درون متد مقدار دهي شده باشند.
يكي از ويژگيهاي مفيد زبان C#، وجود پارامترهاي params است كه بوسيله آنها ميتوان متدي را اعلان كرد كه تعداد متغيري متغير را به عنوان پارامتر دريافت نمايد. پارامترهاي params حتماً بايد يكي از انواع آرايه تك بعدي و يا آرايه دندانهدار (Jagged Array) باشند. در متد makeDecision() چهار متغير رشتهاي را به متد viewAddresses() ارسال نمودهايم كه اين متد پارامترهاي خود را بصورت params دريافت مينمايد. همانطور كه ملاحظه مينماييد، تعداد متغيرهاي ارسالي به متد ميتواند متغير باشد اما دقت داشته باشيد كه تمامي اين متغيرها در يك آرايه تك بعدي قرار گرفتهاند. درون متد viewAddresses() نيز با استفاده از دستور foreach تمامي عناصر موجود در اين آرايه را نمايش دادهايم. پارامترهاي params فقط متغيرهاي ورودي دريافت مينمايند و تغييرات اعمال شده تنها بر روي متغير محلي تاثير ميگذارد.
خلاصه
در اين درس، با ساختار كلي يك متد آشنا شديد. فرا گرفتيد كه در زبان C# چهار نوع پارامتر براي متدها وجود دارند. پارامترهاي value، ref، out و params . همانطور كه گفته شد حالت پيش فرض براي پارامترها، value است مگر آنكه صريحاً مشخص گردد.
درس ششم – Namespaces
اهداف اين درس به شرح زير ميباشد :
آشنايي با Namespace در زبان C#
چگونگي استفاده از هدايتگر using (using directive)
چگونگي استفاده از هدايتگر alias (alias directive)
اعضاي يك Namespace چه هستند؟
اگر به خاطر داشته باشيد، در درس اول، در ابتداي برنامه از using System; استفاده نموديم. با استفاده از اين كد، امكان دسترسي ما به اعضاي Namespace مورد نظر، كه در اينجه System است، فراهم ميشد. پس از مطالعه اين درس، مطالب بسياري درباره هدايتگر using فرا خواهيد گرفت.
Namespace ها، المانهاي زبان C# هستند كه شما را در سازماندهي كردن برنامه، كمك ميكنند. پيادهسازي Namespace ها در كد برنامه بسيار مفيد است چراكه از ايجاد مشكلات مربوط به استفاده مجدد كد، پيشگيري مينمايد.
چگونگي ايجاد Namespace
به مثال زير توجه نماييد.
// Namespace اعلان
using System;
// C# Persian Namespace
namespace csharp-persian
{
// كلاس آغازين برنامه
class NamespaceCSS
{
// آغاز اجراي برنامه
public static void Main()
{
// چاپ خروجي در كنسول
Console.WriteLine(“This is the new C# Persian Namespace.”);
}
}
}
مثال 1-6 چگونگي ايجاد يك Namespace را نشان ميدهد. در اين مثال ما با قرار دادن كلمه كليدي namespace در جلوي csharp-persian يك Namespace جديد ايجاد نموديم. مثال 2-6، Namespace هاي تودرتو را نشان ميدهد.
// Namespace اعلان
using System;
// C# Persian Namespace
namespace csharp-persian
{
namespace tutorial
{
// كلاس آغازين برنامه
class NamespaceCSS
{
// آغاز اجراي برنامه
public static void Main()
{
// چاپ خروجي در كنسول
Console.WriteLine(“This is the new C# Persian Namespace.”);
}
}
}
}
Namespace ها اين امكان را فراهم ميآورند تا سيستمي جهت سازماندهي كدهاي خود ايجاد نماييد. يك روش مناسب جهت سازماندهي Namespace هاي برنامه، استفاده از يك سيستم سلسله مراتبي است. بدين ترتيب كه Namespace هاي عمومي را در بالاي اين ساختار قرار داده و هر چه در اين ساختار پاينتر ميآييم، Namespace هاي تخصصيتر قرار ميگيرند. اين سيستم سلسله مراتبي بوسيله Namespace هاي تودرتو قابل پيادهسازي هستند. اين پيادهسازي در مثال 2-6 نشان داده شده است. با قرار دادند كدهاي خود در Namespace هاي فرعي ميتوانيد كدهاي خود را سازماندهي نماييد.
// Namespace اعلان
using System;
// C# Persian Tutorial Namespace
namespace csharp-persian.tutorial
{
// كلاس آغازين برنامه
class NamespaceCSS
{
//آغاز اجراي برنامه
public static void Main()
{
// چاپ خروجي در كنسول
Console.WriteLine(“This is the new C# Persian Namespace.”);
}
}
}
مثال 3-6 روش ديگر ايجاد Namespace هاي تودرتو را نشان ميدهد. همانطور كه در اين مثال مشاهده مينماييد، Namespace تودرتو با قرار دادن عملگر نقطه “.” در بين csharp-persian و tutorial ايجاد شده است. اين مثال از نظر كارآيي دقيقاً همانند مثال 2-6 است و از نظر پيادهسازي آسانتر از آن ميباشد.
فراخواني اعضاي يك Namespace
// Namespace اعلان
using System;
namespace csharp-persian
{
// namespace تودرتو
namespace tutorial
{
class myExample1
{
public static void myPrint1()
{
Console.WriteLine(“First Example of calling another namespace member.”);
}
}
}
// كلاس آغازين برنامه
class NamespaceCalling
{
// آغاز اجراي برنامه
public static void Main()
{
// چاپ خروجي در كنسول
tutorial.myExample1.myPrint1();
tutorial.myExample2.myPrint2();
}
}
}
//تودرتو بالا Namespaceمشابه Namespace
namespace csharp-persian.tutorial
{
class myExample2
{
public static void myPrint2()
{
Console.WriteLine(“Second Example of calling another namespace member.”);
}
}
}
مثال 4-6 چگونگي فراخواني اعضاي Namespace نشان ميدهد. در ابتداي مثال 4-6، يك Namespace تودرتو اعلان شده است، tutorial درون csharp-persian، كه داراي كلاس myExample1 و متد myPrint1 ميباشد. متد Main() اين متد را با نام tutorial.myExample1.myPrint1 فراخواني مينمايد. چون متد Main() و tutorial درون يك Namespace قرار دارند، ديگر نيازي به استفاده از نام csharp-persian غير ضروري است.
در انتهاي مثال 4-6، يك Namespace ديگر بصورت csharp-persian.tutorial آورده شده است. كلاسهاي myExamlpe1 و myExample2 هر دو متعلق به يك Namespace ميباشند، هرچند ميتواند آنها را مجزا از يكديگر نوشت در حاليكه متعلق به يك Namespace باشند. درون متد Main()، متد myPrint2 بصورت tutorial.myExample2.myPrint2 فراخواني شده است. هرچند كلاس myExample2 خارج از محدودهايست كه متد myPrint2 فراخواني شده است، نيازي به آمردن نام csharp-persian براي اين فراخواني وجود ندارد، زيرا هر دو كلاس متعلق به يك Namespace، يعني csharp-persian هستند.
توجه نماييد كه براي هر يك از كلاسهاي myExample1 و myExample2 نامهاي متفاوتي انتخاب شده است، زيرا هر عضو متعلق به يك Namespace بايد داراي نام يكتايي باشد. براي متدهاي myPrint1 و myPrint2 ، بعلت سادگي در امر يادگيري اين مطلب، نامهاي متفاوتي در نظر گرفته شده است. توجه نماييد كه اين دو متد بعلت اينكه در كلاسهاي متفاوتي قرار دارند، ميتوان نامهاي يكساني برايشان انتخاب نمود، و در اينصورت هيچگونه تداخلي بين ايندو ايجاد نخواهد شد.
استفاده از هدايتگر using
// Namespace اعلان
using System;
using csharp_station.tutorial;
// كلاس آغازين برنامه
class UsingDirective
{
// آغاز اجراي برنامه
public static void Main()
{
// Namespace فراخواني عضوي از
myExample.myPrint();
}
}
// C# PersianTutorial Namespace
namespace csharp-persian.tutorial
{
class myExample
{
public static void myPrint()
{
Console.WriteLine(“Example of using a using directive.”);
}
}
}
در صورتيكه مي خواهيد متدهايي را بدون استفاده از نام كامل آنها،به همراه نام Namespace، استفاده نماييد، ميتوانيد از هدايتگر using استفاده نماييد. در مثال 5-6، دوبار از هدايتگر using استفاده شده است. اولين استفاده از اين هدايتگر، using System، دقيقاً مشابه به همان چيزي است كع تا كنون در اين درسها مشاهده نمودهايد. با استفاده از اين هدايتگر ميتوانيد از اعضاي موجود در System، بدون اينكه نياز به تايپ كلمه System در هربار داشته باشيد، استفاده نماييد. در myPrint()، كلاس Console عضوي از System است كه داراي متد WriteLine() ميباشد. اگر در ابتداي برنامه از هدايتگر using استفاده نكنيم، بايد براي هر دفعه استفاده از متد WriteLine()، نام كامل آن يعني System.Console.WriteLine() را تايپ نماييم.
به طور مشابه، استفاده از using csharp-persian.tutorial امكان استفاده از اعضاي اين Namespace را، بدون نياز به تايپ نام كامل آنها فراهم مينمايد. چون در ابتداي برنامه از هدايتگر using استفاده نمودهايم، در متن برنامه متد myPrint() را بصورت myExample.myPrint() استفاده نمودهايم، درصورتيكه از هدايتگر using استفاده نميگرديم براي استفاده از اين متد بايد آنرا بصورت csharp-persian.tutorial.myExample.myPrint() ميآورديم.
استفاده از هدايتگر Alias
// Namespace اعلان
using System;
using csTut = csharp-persian.tutorial.myExample; // alias
// كلاس آغازين برنامه
class AliasDirective
{
// آغاز اجراي برنامه
public static void Main()
{
// Namespace فراخواني عضوي از
csTut.myPrint();
myPrint();
}
// متدي كه ممكن است توليد ابهام نمايد.
static void myPrint()
{
Console.WriteLine(“Not a member of csharp-persian.tutorial.myExample.”);
}
}
// C# Persian Tutorial Namespace
namespace csharp-persian.tutorial
{
class myExample
{
public static void myPrint()
{
Console.WriteLine(“This is a member of csharp-persian.tutorial.myExample.”);
}
}
}
در برخي موارد ممكن است با Namespace خاصي روبرو شويد كه داراي نامي طولاني است و تمايل داشته باشيد تا نام آنرا كوتاهتر نماييد. اين كار با استفاده از ايجاد استعاره (Alias) امكانپذير است. همانطور كه در مثال 6-6 ملاحظه مينماييد، با استفاده از
csTut = csharp-persian.tutorial.myExample يك استعاره توليد كردهايم و در متن برنامه به جاي استفاده از نام طولاني csharp-persian.tutorial.myExample از نام مستعار آن يعني csTut استفاده نمودهايم. حال از اين نام مستعار در هر جاي برنامه ميتوان استفاده كرد. ما در اين برنامه در متد Main() استفاده نمودهايم.
همچنين در متد Main()، فراخواني از متد myPrint() مربوط به كلاس AliasDirective صورت گرفته است. نام اين متد همانند myPrint() موجود در myExample است. علت اينكه ميتوان هر دو اين متدها را همزمان فراخواني كرد، استفاده از هدايتگر alias براي متد myPrint() مربوط به كلاس myExample است. (csTut.myPrint()) استفاده از اين روش باعث ميشود تا كامپايلر دريابد كه كدام متد را بايد اجرا نمايد. در صورتيكه به اشتباه از هدايتگر alias (csTut.myPrint()) استفاده نكنيم، كامپايلر به اشتباه متد myPrint() مربوط به كلاس AliasDirective را دوبار اجرا خواهد كرد.
تا اينجا،ما تنها كلاسها را در Namespace ها نشان داديم. Namespace ها انواع ديگري را نيز ميتوانند در خود داشته باشند كه در زير مشاهده مينماييد :
Classes
Structures
Interfaces
Enumerations
Delegates
خلاصه
در اين درس با Namespace آشنا شديد و فراگرفتيد كه چگونه Namespace خود را اعلان نماييد. اگر نخواهيد در هربار استفاده از متدها يا اعضاي يك Namespace، نام كامل آنها را استفاده كنيد، بايد از هدايتگر using استفاده نماييد. در صورتيكه بخواهيد بجاي استفاده از نام طولاني يك Namespace، از نامي ك.وتاهتر استفاده كنيد، بايد از هدايتگر استعارهاي (Alias Directive) استفاده نماييد.