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

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


مسعود درویشیان 37 دیدگاه سی شارپ Tuesday, 18th September , 2012 79275 بازدید

در قسمت سوم زنگ سی شارپ توضیحات مختصری در مورد 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 برای محاسبات مالی است. نوع دسیمال با بهره گیری از ۱۲۸ بیت برای نشان دادن مقادیر در محدوده‌ی 28-10 * 1.0 و 1028 * 7.9 استفاده می‌کند. در محاسبات معمولی ممیز شناور، خطاهای گرد کردن گوناگونی رخ می‌دهد. نوع دسیمال این خطاها را از بین می‌برد و دقیقاً تا ۲۸ رقم اعشار (در بعضی موارد ۲۹ رقم اعشار) را نشان می‌دهد. این توانایی نشان دادن مقادیر اعشاری بدون خطای گرد کردن، نوع 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” در خروجی نمایش داده می‌شود و نام کاربر به جای {0} قرار می‌گیرد و نام خانوادگی کاربر در قسمت {1} واقع می‌شود. اگر شما بخواهید مقدار یک متغیر را در خروجی همراه یک پیغام نمایش دهید می‌توانید متغیر را با یک عدد در کروشه جایگزین کنید. کامپیوتر شمارش را از عدد صفر شروع می‌کند بنابراین userName متغیر شماره صفر می‌شود و مقدار آن در خروجی چاپ می‌شود همچنین userSurname متغیر شماره یک است. همان‌طور که می‌بینید بعد از string نام متغیرهایی را که می‌خواهیم مقدار آن‌ها همراه با پیغام خوش آمد‌ گویی نمایش داده شود، می‌نویسیم و به ترتیب userName به جای {0} و userSurname به جای {1} قرار گرفته می‌شود. اگر توجه کرده باشید همین کار را با استفاده از علامت + هم می‌توانستیم انجام دهیم که بدین صورت می‌شد:

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

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

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

Console.WriteLine();

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



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

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


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


  1. مجتبی
    19 September 2012

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



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

      به روش اول می‌گن 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. علی حیدرزاده
    20 September 2012

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



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




      • علی حیدرزاده
        20 September 2012

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




  3. داوود
    24 September 2012

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




  4. سمیرا
    1 November 2012

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




  5. مهدی
    16 November 2012

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




    • مسعود درویشیان
      16 November 2012

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




  6. nilgoon
    26 February 2013

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




  7. حانی
    4 March 2013

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




    • مسعود درویشیان
      4 March 2013

      سلام مرسی. نه داده‌ها عوض نمی‌شن! اینکه می‌گیم تا دو رقم اعشار، مثلاً اگه یه عددی 2.52673157 باشه تا دو رقم اعشارش می‌شه 2.52
      فرم و شکل‌شون رو می‌تونیم تغییر بدیم…




  8. کوثر
    14 April 2013

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




  9. علیرضا اسکندرپور شوفری
    17 April 2013

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




    • مسعود درویشیان
      17 April 2013

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



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

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

    سپاس فراوان




    • مسعود درویشیان
      19 April 2013
      ushort u = Convert.ToUInt16(Console.ReadLine());
      

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



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




  11. کوثر
    11 September 2013

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




  12. محمد
    20 December 2013

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




  13. Arash
    27 May 2014

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




  14. سعید
    1 June 2014

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




  15. esysss
    15 July 2014

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




  16. مهدی
    15 July 2014

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




  17. mehri
    7 November 2014

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




  18. حیدر
    2 January 2015

    با سلام و عرض ادب و احترام،
    یه سوال داشتم اگر یه وقت بی ربط بود ببخشید.
    چطوری میتونیم جای عدد اعشاری و صحیح رو در شرایطی که عدد میتونه هر عچیزی باشه عوض کنیم. مثلاً یه ماشین حساب داریم مینویسیم که اگه کاربر عدد اعشاری داد قسمت صحیح و اعشاری رو بتونه جا به جا کنه.
    مثلاً 14.34454 رو به 34454.14 تغییر بده یا بتونه 112.5482




  19. حیدر
    2 January 2015

    با سلام و عرض ادب و احترام،
    یه سوال داشتم اگر یه وقت بی ربط بود ببخشید.
    چطوری میتونیم جای عدد اعشاری و صحیح رو در شرایطی که عدد میتونه هر عچیزی باشه عوض کنیم. مثلاً یه ماشین حساب داریم مینویسیم که اگه کاربر عدد اعشاری داد قسمت صحیح و اعشاری رو بتونه جا به جا کنه.
    مثلاً 14.34454 رو به 34454.14 تغییر بده یا بتونه 125.656636 رو به 656636 که یک عدد صحیحه تغییر بده.
    با تشکّر




  20. حیدر
    2 January 2015

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




  21. mansoreh
    4 May 2015

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

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




  22. omid
    3 February 2017

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




  23. mani
    27 February 2017

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




  24. امیرمهدی
    24 July 2017

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




  25. محمد
    20 January 2018

    ببخشید یه سوال .؟ اول اینکه بسیار اموزشا عالیه واقعا 0 تا 100 که میگن اینه ایشالا همیشه موفق باشید .
    سوالم اینه double.float/decimal اینا خودشون چی هستن یعنی مثلا جزو type value هستن




  26. محمد کبیری
    12 May 2018

    سلام با تشکر از سایت خوبتون
    میخواستم بپرسم که چجور میشه یه متقیر رو جلوی if در پرانتز گذاشت؟
    مثلا اگر بخواییم برنامه سه تا عدد دریافت کنه و بگه ایا این میتونه یه مثلث قایم الزاویه باشه یانه (از طریق اندازه ضلع ها باید از روش فیثاغورس پیش بریم) دمیشه راهنماییم کنید؟ممنون




  27. علیرضا
    2 October 2018

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




  28. yaghoob
    21 December 2018

    سلام
    چرا وقتی عدد اعشاری واردappها می کنم(app هایی که خودم نوشتم)
    خطای زیررا میدهد
    Input string was not in a correct format
    لطفن کمکم کنید




  29. کارون
    23 September 2021

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



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





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

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

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

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

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



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

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