زنگ سی شارپ – قسمت چهارم

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


مسعود درویشیان ۳۲ دیدگاه سی شارپ سه شنبه, ۲۸ام شهریور , ۱۳۹۱ 36519 بازدید

در قسمت سوم زنگ سی شارپ توضیحات مختصری در مورد value type، متغیر (variable) و عملگرها (operators) داده شد. در این قسمت با چند مثال به تشریح کامل‌تر آن‌ها خواهیم پرداخت. همان‌طور که در قسمت قبل گفته شد، data types به دو دسته ی value types و reference types تقسیم می‌شوند و دانستید که سیزده value types داریم.

زنگ سی‌شارپ - قسمت چهارم

در مجموع به این سیزده ولیو تایپ‌، simple types می‌گویند و دلیل این نامگذاری این است که این‌ها شامل مقدار تکی (singleValue) هستند و به عبارت دیگر، ترکیبی از دو یا بیشتر از دو مقدار نیستند.

Float و Double

به مثال زیر توجه کنید:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ExFloat
{
    class Program
    {
        static void Main(string[] args)
        {
            int i = 25;
            float f = 16.8F;
            float result = i / f;

            Console.WriteLine("Result is: " + result);
        }
    }
}

همان‌طور که مشاهده می‌کنید متغیر i مقدار ۲۵ را در خود ذخیره کرده است و متغیر f که از جنس float است مقدار ۱۶.۸ را در خود نگهداری می‌کند. نکته ی float اینجاست که باید بعد از آن از پسوند F یا f استفاده کنید:

float f = 16.8F;

دلیل اینکار این است که اعداد اعشاری به صورت پیش فرض double هستند و برای اینکه یک مقدار را به صورت float ذخیره کنید باید حتماً از پسوند F یا f استفاده کنید، در غیر این صورت کامپایلر  به شما پیغام خطا می‌دهد و به شما می‌گوید که نمی‌توانید یک مقدار از جنس double را در متغیری از جنس float ذخیره کنید.

float result = i / f;

در اینجا مقدار متغیر i را بر مقدار متغیر f تقسیم کردیم و نتیجه ی آن‌را در متغیری به اسم result که از جنس float است ذخیره ‌کردیم.

Console.WriteLine("Result is: " + result);

در نهایت مقدار result را در خروجی نمایش دادیم:

Result is: 1.488095

اگر همین مثال را برای double انجام دهیم همان‌طور که در قسمت قبل گفته شد، خواهیم دید که دقت دابل بیشتر از float است:

static void Main(string[] args)
{
    int i = 25;
    double d = 16.8;
    double result = i / d;

    Console.WriteLine("Result is: " + result);
}

خروجی:

Result is: 1.48809523809254

Decimal

یکی از موارد خیلی عالی در سی شارپ، تدارک دیدن نوع Decimal برای محاسبات مالی است. نوع دسیمال با بهره گیری از ۱۲۸ بیت برای نشان دادن مقادیر در محدوده‌ی ۲۸-۱۰ * ۱٫۰ و ۱۰۲۸ * ۷٫۹ استفاده می‌کند. در محاسبات معمولی ممیز شناور، خطاهای گرد کردن گوناگونی رخ می‌دهد. نوع دسیمال این خطاها را از بین می‌برد و دقیقاً تا ۲۸ رقم اعشار (در بعضی موارد ۲۹ رقم اعشار) را نشان می‌دهد. این توانایی نشان دادن مقادیر اعشاری بدون خطای گرد کردن، نوع Decimal را برای محاسبات پولی و مالی بسیار مناسب می‌کند. به دلیل اینکه مقادیر پولی در اپلیکیشن های تجاری بسیار با اهمیت هستند، بسیاری از برنامه نویسان سی شارپ اغلب برای این منظور از نوع Decimal استفاده می‌کنند. برای مشخص کردن اینکه عدد شما از نوع Decimal است، باید به عدد خود کاراکتر M (یا m) را اضافه کنید:

decimal d = 12.30M;

اینکار ضروری است چرا که در غیر این صورت مقدار متغیر به عنوان double تفسیر می‌شود (مقادیر اعشاری به صورت پیش‌فرض double هستند).

در اینجا یک مثال برای شما در نظر گرفته ایم که با استفاده از نوع Decimal بتوانید قیمت نهایی را همراه با تخفیف، با توجه به قیمت اصلی و درصد تخفیف به دست آورید:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace test
{
    class Program
    {
        static void Main(string[] args)
        {
            decimal price;
            decimal discount;
            decimal discountedPrice;

            // Compute discounted price.
            price = 19.95m;
            discount = 0.15m; // discount rate is 15%

            discountedPrice = price - (price * discount);

            Console.WriteLine("Discounted price: $" + discountedPrice);
        }
    }
}

خروجی این برنامه:

Discounted price: $16.9575

در این برنامه، در قسمتی که محاسبه تخفیف انجام می‌شود، الویت اول با پرانتزها است به طوری که ابتدا متغیر price در discount ضرب می‌شود، سپس حاصل آن از متغیر price کم می‌شود و در نهایت مقدار محاسبه شده ی نهایی در متغیر discountedPrice قرار می‌گیرد.

دریافت ورودی از کاربر

به مثال زیر که برای دریافت مقدار از ورودی است توجه کنید:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace test
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.Write("Please enter your name: ");
            string userName = Console.ReadLine();

            Console.Write("Please enter your surname: ");
            string userSurname = Console.ReadLine();

            Console.WriteLine("Hi there, {0} {1}!", userName, userSurname);
            Console.WriteLine();
        }
    }
}

و خروجی با توجه به اسم و فامیل شما این‌چنین است:

در این مثال ما نام و نام خانوادگی کاربر را دریافت می‌کنیم و در نهایت یک پیغام خوش آمد‌ گویی به کاربر نمایش می‌دهیم. هدف از این مثال این است که شما بیاموزید چگونه یک مقدار (ورودی) را از کاربر دریافت کنید و چگونه آن را نمایش دهید و در صورت نیاز چه تغییراتی روی آن اعمال کنید.

به توضیحات برنامه بالا توجه کنید:

Console.Write("Please enter your name: ");

با این خط کد شما به کاربر یک پیغام را نمایش می‌دهید که نام خودش را وارد کند. کاربر نام خودش را وارد می‌کند ولی این نام وارد شده که مسلماً string (رشته ای از کاراکترها) است در کجا ذخیره می‌شود؟! پس شما باید یک مکان را برای گرفتن این مقدار آماده کنید. کامپیوتر در نهایت همه ی اطلاعات را در خانه های حافظه (Ram) ثبت می‌کند که به صورت باینری هستند. حتی برنامه نویسان کارکشته و باتجربه هم ترجیح می‌دهند به جای استفاده از باینری، مستقیماً از اعداد، متن و نوشته استفاده کنند. زبان‌های برنامه نویسی به شما اجازه می‌دهند که مکان‌های خاصی را برای نگهداری اطلاعات در حافظه بوجود بیاورید، این مکان‌های خاص همان متغیرها هستند که در قسمت قبل به شما معرفی کردیم.

شما تا اینجا یک پیغام را به کاربر نمایش دادید که نام خودش را وارد کند و اکنون می‌خواهیم نام کاربر را دریافت و ذخیره کنیم، خط کد بعدی این کار را برای ما انجام می‌دهد:

string userName = Console.ReadLine();

در اینجا برای دریافت نام کاربر یک متغیر به اسم userName از جنس string تعریف کردیم تا نام کاربر را در آن ذخیره کنیم. اکنون ما نیاز داریم که این مقدار را از کاربر دریافت کنیم. دستور ()Console.ReadLine این کار را برای ما انجام می‌دهد و به این صورت عمل می‌کند که منتظر می‌ماند تا کاربر مقداری را در پنجره کنسول تایپ کند و به‌محض این‌که کاربر کلید Enter را فشرد، هرچه را که تایپ کرده در متغیر userName ذخیره می‌کند. در اینجا ما هم زمان هم متغیر را تعریف کردیم هم مقدار ورودی را در آن قرار دادیم، ولی می‌توانستیم ابتدا متغیر را تعریف کنیم، سپس مقدار ورودی را در آن قرار دهیم، بدین صورت:

string userName;
userName = Console.ReadLine();

برای دریافت نام خانوادگی هم طبق همین روال پیش می‌رویم. همین‌طور که می‌بینید ما برای انتخاب نام متغیرها از userName برای اسم کاربر و از userSurname برای نام خانوادگی کاربر استفاده کردیم.

یک‌سری قرارداد و راهنمایی برای نام گذاری وجود دارد که به شما کمک می‌کند چگونه یک نام بسیار مناسب را انتخاب کنید تا اگر در زمان آینده به برنامه ی خود برگشتید دچار سردرگمی نشوید و علاوه بر آن از یک خوش‌نویسی در زبان سی شارپ بهره ببرید، به چند نمونه از این قراردادها و راهنمایی ها توجه کنید:

  • از space و نقطه گذاری نمی‌توانید در انتخاب نام استفاده کنید.
  • از نام های ساده، خوانا و با معنی استفاده کنید.
  • خوانایی و با معنی بودن یک اسم را قربانی یک اسم کوتاه و عجیب و غریب نکنید.
  • از زیرخط، خط فاصله یا هر کاراکتری غیر از کارکترهای الفبایی استفاده نکنید.
  • از انتخاب اسم هایی که با کلمات کلیدی زبان برنامه نویسی تداخل دارند پرهیز کنید.
  • سی شارپ یک زبان case-sensitive است و اکثر برنامه نویسان به طور عمده از حروف کوچک برای نام‌گذاری متغیرها استفاده می‌کنند ولی اگر نام متغیر چند قسمتی باشد برای تمایز بین کلمات از حروف بزرگ استفاده می‌کنند برای مثال userName و userSurname که برای نام گذاری آن‌ها را انتخاب کردیم، دو قسمتی (دو کلمه ای) هستند و userName از دو کلمه‌ی user و name تشکیل شده است که برای تمایز بین آن‌ها حرف N را بزرگ نوشته ایم و هر کلمه ای که به این اسم بخواهد اضافه شود حرف اول آن باید بزرگ باشد.
Console.WriteLine("Hi there, {0} {1}!", userName, userSurname);

اگر شما این خط کد را با خروجی مقایسه کنید متوجه خواهید شد که چه اتفاقی افتاده است. رشته‌ی ” ,Hi there” در خروجی نمایش داده می‌شود و نام کاربر به جای {۰} قرار می‌گیرد و نام خانوادگی کاربر در قسمت {۱} واقع می‌شود. اگر شما بخواهید مقدار یک متغیر را در خروجی همراه یک پیغام نمایش دهید می‌توانید متغیر را با یک عدد در کروشه جایگزین کنید. کامپیوتر شمارش را از عدد صفر شروع می‌کند بنابراین userName متغیر شماره صفر می‌شود و مقدار آن در خروجی چاپ می‌شود همچنین userSurname متغیر شماره یک است. همان‌طور که می‌بینید بعد از string نام متغیرهایی را که می‌خواهیم مقدار آن‌ها همراه با پیغام خوش آمد‌ گویی نمایش داده شود، می‌نویسیم و به ترتیب userName به جای {۰} و userSurname به جای {۱} قرار گرفته می‌شود. اگر توجه کرده باشید همین کار را با استفاده از علامت + هم می‌توانستیم انجام دهیم که بدین صورت می‌شد:

Console.WriteLine("Hi there, " + userName + " " + userSurname + "!" );

همان‌طور که می‌بینید توسط علامت + متغیرها را به رشته ها متصل کردیم.

دستور آشنای آخر:

Console.WriteLine();

این دستور وقتی به این صورت و بدون هیچ ورودی استفاده شود تنها یک خط خالی را چاپ می‌کند و معمولاً برای اینکه خروجی ها خواناتر باشند استفاده می‌شود.



نویسنده / مترجم : مسعود درویشیان

علاقه مند به موسیقی و برنامه نویسی بازی


۳۲ دیدگاه برای این نوشته ثبت شده است


  1. مجتبی
    ۲۹ شهریور ۱۳۹۱

    ممنون
    یه سوال!
    مزیت کروشه نسبت به + چیه؟ جای خاصی کاربرد داره؟




    • مسعود درویشیان
      ۲۹ شهریور ۱۳۹۱

      سلام، سوال خوبی پرسیدین

      به روش اول می‌گن string formatting:

      Console.WriteLine("Hi there, {0} {1}!", userName, userSurname);
      

      و به روش دوم می‌گن string concatenation:

      Console.WriteLine("Hi there, " + userName + " " + userSurname + "!" );
      

      هر دوی این‌ها خروجی یکسانی رو چاپ می‌کنن ولی روش string formatting مزیت‌های بیشتری نسبت به روش string concatenation داره، از جمله این‌که:

      ۱. فرم ساده‌تر و خواناتری داره
      ۲. با این روش می‌تونی الگوی خروجی خودت رو که از جنس استرینگ هست مشخص کنی
      ۳. می‌تونی به متغیرهایی هم که توی این روش نمایش می‌دی یه فرم خاص و دلخواه بدی، یه‌عنوان مثال می‌تونی بگی که یکی از خروجی‌هات با دو رقم اعشار نمایش داده بشه یا این‌که زمان رو با نمایش سال، ماه و یا روز نشون بدی
      ۴. داده‌ها رو از استرینگت کاملاً جدا می‌کنه
      ۵. از زیاده نویسی جلوگیری می‌کنه
      و…

      البته سرعت string concatenation یه خورده بیشتر هست ولی حافظه‌ی بیشتری رو هم اشغال می‌کنه. درکل استفاده از روش string formatting که یه حالت ایده‌آل هست پیشنهاد می‌شه و با توجه به نیازت و ویژگی‌هایی که string formatting در اختیارت قرار می‌ده باید خودت انتخاب کنی

      سعی می‌کنیم توی مقالات آینده روش string formatting و ویژگی‌هاش رو در مثال‌ها پوشش بدیم.

      برای اطلاعات بیشتر می‌تونی سرچ کنی:
      string formatting vs. string concatenation




  2. علی حیدرزاده
    ۳۰ شهریور ۱۳۹۱

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




    • مسعود درویشیان
      ۳۰ شهریور ۱۳۹۱

      دوست عزیز، اگه یادتون باشه گفته شد که Ctrl + F5 رو با هم بگیرید یا اینکه از منوی Debug گزینه‌ی Start without debugging رو انتخاب کنید.




      • علی حیدرزاده
        ۳۰ شهریور ۱۳۹۱

        ممنون مشکل همین بود من f5 خالی میزدم




  3. داوود
    ۳ مهر ۱۳۹۱

    ممنون؛ عالی بود




  4. سمیرا
    ۱۱ آبان ۱۳۹۱

    خسته نباشید
    خدا قوت
    ممنون




  5. مهدی
    ۲۶ آبان ۱۳۹۱

    ممنونم داداش گل .اما چرا این Console.WriteLine آخرو که برمیداری هیچ اتفاق خاصی نمیفته نکنه منظور Redkey بوده




    • مسعود درویشیان
      ۲۶ آبان ۱۳۹۱

      این دستور وقتی به این صورت و بدون هیچ ورودی استفاده شود تنها یک خط خالی را چاپ می‌کند و معمولاً برای اینکه خروجی ها خواناتر باشند استفاده می‌شود.




  6. nilgoon
    ۸ اسفند ۱۳۹۱

    خیلی عالیه ممنون




  7. حانی
    ۱۴ اسفند ۱۳۹۱

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




    • مسعود درویشیان
      ۱۴ اسفند ۱۳۹۱

      سلام مرسی. نه داده‌ها عوض نمی‌شن! اینکه می‌گیم تا دو رقم اعشار، مثلاً اگه یه عددی ۲٫۵۲۶۷۳۱۵۷ باشه تا دو رقم اعشارش می‌شه ۲٫۵۲
      فرم و شکل‌شون رو می‌تونیم تغییر بدیم…




  8. کوثر
    ۲۵ فروردین ۱۳۹۲

    مثل مقاله ی قبلی خوب بود
    موفق باشید




  9. علیرضا اسکندرپور شوفری
    ۲۸ فروردین ۱۳۹۲

    خیلی مخلصیم آقا. بسیار عالی داری پیش میری. دنبالت میام ;) موفق باشی.




    • مسعود درویشیان
      ۲۸ فروردین ۱۳۹۲

      امیدوارم براتون مفید باشه، موفق باشید



  10. مسعود جان یه سوال دارم. من اومدم برای خودم کد ساده ای نوشتم که عددی از کاربر بگیرم و در متغیری با نوع ushort ذخیره کنم. ظاهرا نباید مشکلی داشته باشه اما…
    دستور ReadLine() باید در متغیری با نوع string ذخیره بشه. و دستور Read() هم در متغیری با نوع int.
    خطایی که من دریافت میکردم حاکی از عدم توانایی در تبدیل string یا int (بسته به دستور دریافت ورودی) به ushort .

    سوالم اینجاست که چرا این اتفاق میوفته؟ و چطوری ورودی ushort بگیرم؟

    سپاس فراوان




    • مسعود درویشیان
      ۳۰ فروردین ۱۳۹۲
      ushort u = Convert.ToUInt16(Console.ReadLine());
      

      ()ReadLine یه string برمی‌گردونه، واسه اینکه توی ushort ذخیره‌اش کنی باید تبدیلش کنی



      • چیزی که خودم فکر میکردم این بود که بخاطر اون کاراکتر Enter پایانی هست که string بر میگردونه. درسته؟
        ما تو PHP برای تبدیل نوع ها میگیم type juggling اینجا بهش چی میگن؟
        بابت پاسخ بسیار سریعتون ممنونم. هر شب در حال خوندن ۵ نوشته از سری زنگ سی شارپ هستم.




  11. کوثر
    ۲۰ شهریور ۱۳۹۲

    خیلی خوب بود ممنون
    پاسخ ها هم جنبه ی آموزشی دارند




  12. محمد
    ۲۹ آذر ۱۳۹۲

    دستتون درد نکنه عالیه




  13. Arash
    ۶ خرداد ۱۳۹۳

    سلام.اقا دمت گرم خیلی استفاده کردم اما یه مشکلی.اینجا من نمیدونم مثلا قسمت ۱۴ خوندم چجوری باید ۱۵ بیارم.این پایین یه چیزایی هستش اما درهمه و ترتیب نداره.




  14. سعید
    ۱۱ خرداد ۱۳۹۳

    آقا مسعود خیلی عالیه بیانت




  15. esysss
    ۲۴ تیر ۱۳۹۳

    hi
    بسیار عالی
    فقط میخواستم بدونم این راه باینری رو دیگه چه جاهایی میتونیم به کار ببریم؟




  16. مهدی
    ۲۴ تیر ۱۳۹۳

    سلام
    استاد یک سوال دارم .
    عددی که نوع دسیمال ذخیره میکنه بیشتره یا نوع دابل ؟
    منظورم مقدار ععد صحیحی است ک در خود ذخیره میکنند نه اعشاری .
    با تشکر




  17. mehri
    ۱۶ آبان ۱۳۹۳

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




  18. حیدر
    ۱۲ دی ۱۳۹۳

    با سلام و عرض ادب و احترام،
    یه سوال داشتم اگر یه وقت بی ربط بود ببخشید.
    چطوری میتونیم جای عدد اعشاری و صحیح رو در شرایطی که عدد میتونه هر عچیزی باشه عوض کنیم. مثلاً یه ماشین حساب داریم مینویسیم که اگه کاربر عدد اعشاری داد قسمت صحیح و اعشاری رو بتونه جا به جا کنه.
    مثلاً ۱۴٫۳۴۴۵۴ رو به ۳۴۴۵۴٫۱۴ تغییر بده یا بتونه ۱۱۲٫۵۴۸۲




  19. حیدر
    ۱۲ دی ۱۳۹۳

    با سلام و عرض ادب و احترام،
    یه سوال داشتم اگر یه وقت بی ربط بود ببخشید.
    چطوری میتونیم جای عدد اعشاری و صحیح رو در شرایطی که عدد میتونه هر عچیزی باشه عوض کنیم. مثلاً یه ماشین حساب داریم مینویسیم که اگه کاربر عدد اعشاری داد قسمت صحیح و اعشاری رو بتونه جا به جا کنه.
    مثلاً ۱۴٫۳۴۴۵۴ رو به ۳۴۴۵۴٫۱۴ تغییر بده یا بتونه ۱۲۵٫۶۵۶۶۳۶ رو به ۶۵۶۶۳۶ که یک عدد صحیحه تغییر بده.
    با تشکّر




  20. حیدر
    ۱۲ دی ۱۳۹۳

    با سلام، سوال ننوشتم فقط تایید بشه ، بلکه اگه لطف کنید جواب میخوام.




  21. mansoreh
    ۱۴ اردیبهشت ۱۳۹۴

    سلام من سوال برنامه نویسی دارم نمیتونم حلش کنم لدفن کمک کنید هر چه سریع تر

    سوال : برنامه ای بنویسید که بدون استفاده از متغییر سوم محتوای متغییر دوم را جا به جا کند و در خروجی نمایش دهد؟؟؟؟؟؟؟/




  22. omid
    ۱۵ بهمن ۱۳۹۵

    سلام جناب ببخشید اگه بخواییم دو عدد اعشاری از ورودی بگیریم بدون استفاده از متغیرهای اعشاری مثل float.double باید چیکار کنیم؟




  23. mani
    ۹ اسفند ۱۳۹۵

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




  24. امیرمهدی
    ۲ مرداد ۱۳۹۶

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



دیدگاه خود را بنویسید





نشانی ایمیل شما منتشر نخواهد شد.

کامنت های شما بعد از تأیید توسط نویسنده وبلاگ، منتشر خواهند شد.

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

شما میتوانید با مراجعه به سایت گراواتار یک آواتار اختصاصی برای خود تعریف کنید، تا در کنار نام شما نمایش داده شود

برای قرار دادن کدهای نمونه می توانید از تگ های [php] ، [html] ، [css] و [js] استفاده کنید.
به عنوان مثال کدهای php را می توان به صورت زیر قرار داد:
[php] var $whoLoveIranians = "WebTarget!"; [/php]



کلیه حقوق مادی و معنوی برای وب سایت وب تارگت محفوظ است ©2017 وب‌تارگت

استفاده از مطالب وب سایت در سایر وب سایت‌ها و نشریات چاپی با ذکر منبع آزاد است.