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

حل تمرین‌های 6 تا 11 (تمرین‌های مربوط به حلقه‌ها و switch)


مسعود درویشیان ۳۶ دیدگاه سی شارپ پنج‌شنبه, 15th نوامبر , 2012 48755 بازدید

در این قسمت به حل تمرین‌های ۶ تا ۱۱ می‌پردازیم. هدف از انجام این تمرین‌ها آشنایی بیشتر با حلقه‌های تو در تو و دستور switch است.

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

حل تمرین شماره ۶: همان‌طور که می‌دانید این تمرین شباهت زیادی با مثال قسمت قبل دارد با این تفاوت که اندازه مثلث از کاربر گرفته می‌شود:

using System;
class Solution
{
    static void Main()
    {
        // Solution 06

        Console.Write("Please enter triangle size: ");
        int size = Convert.ToInt32(Console.ReadLine());

        Console.WriteLine();

        for (int i = 0; i < size; i++)
        {
            for (int j = 0; j <= i; j++)
            {
                Console.Write("*");
            }
            Console.WriteLine();
        }

        Console.WriteLine();
    }
}

نحوه‌ی دریافت ورودی از کاربر در قسمت چهارم مورد بحث قرار گرفت. تفاوت دریافت ورودی در این تمرین و مثال قسمت چهارم در نوع ورودی آن‌ها است. در مثال قسمت چهارم، ورودی گرفته شده از کاربر از جنس string بود اما در اینجا ورودی دریافت شده باید یک عدد باشد. هنگامی‌که ورودی را به برنامه می‌دهید، مقدار وارد شده از جنس string است و شما باید آن را به عدد تبدیل کنید. همان‌طور که می‌بینید، مقدار دریافت شده از کاربر توسط دستور ()Convert.ToInt32 به یک عدد صحیح ۳۲ بیتی علامت‌دار (شامل مقدار مثبت و منفی) تبدیل شده و مستقیماً در متغیر size قرار گرفته است. ()Convert.ToInt32 متدی است که مقدار string را دریافت کرده و به یک عدد صحیح ۳۲ بیتی علامت‌دار  (۳۲bit signed integer) تبدیل می‌کند. در ادامه‌ی تمرین بالا، مانند مثال قسمت قبل حلقه‌های تو در تو به جای نمایش اعداد کاراکتر ستاره را نمایش می‌دهند. در قسمت‌های آینده مبحث متدها و کلاس‌ها به‌طور کامل و دقیق مورد بررسی قرار می‌گیرد پس در این مورد هیچ جای نگرانی نیست که شما کاملاً با شی‌گرایی آشنا شده و بر آن مسلط می‌شوید.

حل تمرین شماره ۷: این مسئله بسیار ساده است. کافی است همه مراحل انجام کار را به‌روی کاغذ بیاورید تا به روش حل آن پی ببرید. اجازه دهید در ابتدا جواب را با هم ببینیم و سپس به توضیح و شرح آن بپردازیم.

// Solution 07
using System;
class Solution
{
    static void Main()
    {
        // Getting input from the user
        Console.Write("Please enter the size: ");
        int size = Convert.ToInt32(Console.ReadLine());

        // Variables declaration
        int rowNumber, j, k;

        // ۱st loop that's counting the rows
        for (rowNumber = 1; rowNumber <= size; rowNumber++)
        {
            // ۲nd loop that write space character
            for (j = 1; j <= size - rowNumber; j++)
            {
                Console.Write(" ");
            }

            // ۳rd loop that write star character
            for (k = 1; k <= (2 * rowNumber) - 1; k++)
            {
                Console.Write("*");
            }

            // finally, this WriteLine() method makes a break.
            Console.WriteLine();
        }
    }
}

همان‌طور که می‌دانید خروجی برنامه این چنین است:

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

به تصویر زیر دقت کنید: (روی تصویر کلیک کنید)

چرا در قسمت شرطی حلقه‌ی اول نیاز داریم که متغیر rowNumber کوچک‌تر یا مساوی متغیر size باشد؟ جواب واضح است زیرا سایز مثلث همان تعداد سطر برنامه‌ی ما است. در حلقه‌ی دوم مشاهده می‌کنیم که متغیر j باید کوچک‌تر یا مساوی size – rowNumber باشد. علت این امر این است که در هر سطر باید تعدادی کاراکتر اسپیس چاپ شود و این کاراکترها باید با افزایش شماره هر سطر یک واحد کاهش یابند. در قسمت شرطی حلقه‌ی سوم مشاهده می‌کنید که متغیر k باید کوچک‌تر یا مساوی  ۱ – (rowNumber * 2) باشد. اگر به تعداد ستاره‌ها در هر سطر توجه کنید متوجه می‌شوید که اعداد فرد را در بر می‌گیرند: ۱،۳، ۵، ۷ و… بنابراین باید در هر سطر معادل با اعداد فرد، ستاره‌ها نمایش داده شوند. در نهایت ()Console.WriteLine برنامه را به خط بعد سوق می‌دهد.

حل تمرین شماره ۸: در این تمرین قصد داریم دو عدد را از کاربر دریافت کنیم و عدد اول را به توان عدد دوم برسانیم:

// Solution 08
using System;
class Example
{
    static void Main()
    {
        Console.Write("Enter base number: ");
        int baseNo = Convert.ToInt32(Console.ReadLine());
        Console.Write("Enter power number: ");
        int powerNo = Convert.ToInt32(Console.ReadLine());

        int result = 1;

        for (int counter = 1; counter <= powerNo; counter++)
            result = baseNo * result;

        Console.WriteLine();
        Console.WriteLine("The result is " + result);
        Console.WriteLine();
    }
}

در ابتدای این مقاله با نحوه‌ی دریافت ورودی از کاربر و تبدیل آن به عدد صحیح آشنا شدید. در اینجا ما علاوه بر متغیرهای پایه و توان به یک متغیر برای ذخیره‌ی نتیجه‌ی نهایی (result) و یک متغیر برای شمارنده‌ی حلقه (counter) نیازمندیم. حلقه تا زمانی‌که کوچک‌تر یا مساوی عدد توان است تکرار می‌شود و عدد پایه را در مقدار result ضرب و حاصل آن را در خود متغیر result ذخیره می‌کند. به این ترتیب عدد پایه به اندازه‌ی عدد توان در خودش ضرب می‌شود.

حل تمرین شماره ۹: در این تمرین قصد داریم با استفاده از دستور switch یک فرهنگ لغت کوچک بسازیم:

// Solution 09
using System;
class Example
{
    static void Main()
    {
        Console.Write("Enter a word to translate: ");
        string word = Console.ReadLine();

        switch (word)
        { 
            case "window":
                Console.WriteLine("Window means panjereh");
                break;
            case "library":
                Console.WriteLine("Library means ketab khaneh");
                break;
            case "easy":
                Console.WriteLine("Easy means asan");
                break;
            case "memory":
                Console.WriteLine("Memory means hafezeh");
                break;
            case "software":
                Console.WriteLine("Software means narm afzar");
                break;
            default:
                Console.WriteLine("Oops! Your word doesn't exist in our dictionary.");
                break;
        }
    }
}

در قسمت دوازدهم در مورد دستور switch بحث شد. البته برای ساخت فرهنگ لغت باید از دستوراتی برای ذخیره‌سازی اطلاعات استفاده کرد و این روش غیر استاندارد است. این تنها تمرینی برای آشنایی بیشتر با دستور switch بود.
حل تمرین شماره ۱۰: در این تمرین قصد داشتیم توسط حلقه‌های تو در تو و کاراکتر █ یک مستطیل را رسم کنیم:

// Solution 10
using System;
class Example
{
    static void Main()
    {
        for (int i = 0; i < 4; i++)
        {
            for (int j = 0; j < 14; j++)
            {
                Console.Write("█");
            }
            Console.WriteLine();
        }
    }
}

همان‌طور که می‌دانید حلقه‌ی اول مشخص می‌کند که عرض مستطیل شامل ۴ کاراکتر █ و حلقه‌ی دوم نشان می‌دهد که طول مستطیل شامل ۱۴ کاراکتر █ است و ()Console.WriteLine باعث می‌شود برنامه بعد از چاپ هر سطر به خط بعد برود.

حل تمرین شماره ۱۱:

using System;
class Example
{
    static void Main()
    {
        Console.Write("Enter table width: ");
        int tableWidth = Convert.ToInt32(Console.ReadLine());
        Console.Write("Enter table height: ");
        int tableHeight = Convert.ToInt32(Console.ReadLine());
        int result;

        for (int i = 1; i <= tableHeight; i++)
        {
            result = 0;
            for (int j = 1; j <= tableWidth; j++)
            {
                result = i * j;
                Console.Write(result + "\t");
            }
            Console.WriteLine();
        }
    }
}

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



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

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


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


  1. داوود
    16 نوامبر 2012

    من هنوز حل تمرینها رو ندیدم که ازتون سوال بپرسم، چون اول میخوام خودم حل کنم و بعدش ببینم. ولی عالی بود. دستتون درد نکنه! ممنون




  2. فرامرز
    17 نوامبر 2012

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




  3. mmr
    17 نوامبر 2012

    سلام
    برنامه شکل زیر بکمک
    الف )دستور For
    ب)دستور While
    چکونه نوشته می شود
    +**b** b** b**+
    +***b*** b*** b***+
    +*b*b*b* b*b* +
    +**b** b** b**+
    b بک اسپیس می باشد
    نمی دونم هرچی بفکر رسیدنتونستم بنویسم




    • مسعود درویشیان
      18 نوامبر 2012

      اگه ممکنه منظورتون رو واضح‌تر بیان کنید!




      • mmr
        18 نوامبر 2012

        سلام
        می خواهم ۴خط خروجی بالا بوسیله کد نویسی از طریق دستورات
        For
        While
        نوشته شود
        +در همه اول آخر است
        اولی بعداز+ دوتا* است و یعد بک اسپیس و همین طوری تا آخر




        • مسعود درویشیان
          18 نوامبر 2012

          این‌کار رو از روش‌های زیادی می‌شه انجام داد، من از روش زیر تا ۲ خط برنامه رو براتون نوشتم که این تقریباً ساده ترین حالت ممکنه
          باید خودتون برنامه رو تجزیه تحلیل کنید ببینید را‌ه‌های بهینه‌تری هم هست که خط کد کمتری تولید بشه یا نه
          من این رو برای نمونه براتون نوشتم:

          using System;
          class Example
          {
              static void Main()
              {
                  for (int i = 0; i < 2; i++)
                  {
                      // line one
                      if (i == 0)
                      {
                          for (int j = 1; j <= 13; j++)
                          {
                              if (j == 1 || j == 13)
                              {
                                  Console.Write("+");
                                  if (j == 13)
                                      break;
                              }
                              if (j == 12)
                              {
                                  continue;
                              }
                              if (j % 3 == 0)
                                  Console.Write(" ");
                              else
                                  Console.Write("*");
                          }
                      }
                      // line two
                      if (i == 1)
                      {
                          for (int j = 1; j <= 17; j++)
                          {
                              if (j == 1 || j == 17)
                              {
                                  Console.Write("+");
                                  if (j == 17)
                                      break;
                              }
                              if (j == 16)
                              {
                                  continue;
                              }
                              if (j % 4 == 0)
                                  Console.Write(" ");
                              else
                                  Console.Write("*");
                          }
                      }
                      Console.WriteLine();
                  }
              }
          }
          



  4. رامیتن
    22 نوامبر 2012

    سلام دوست عزیز .
    من قسمت result رو متوه نشدم . دلیل اینکه تو تمرین ۸
    result = 1 ;
    بعد تو یه تمرین دیگه گذاشتی result = 0
    دلیلش چیه ؟
    مگه می شه نوشت result = result * powerNO ؟
    دو تا result با هم
    از Counter هم که اصلا استفاده نشد ؟ به چه وسیله ای ازش استفاده کردید ؟
    ممنون




    • مسعود درویشیان
      22 نوامبر 2012

      سلام
      توی تمرین ۸ اگه result برابر با صفر باشه نتیجه‌ی نهایی هم برابر با صفر می‌شه پس باید ۱ باشه تا توی عملیات ضرب مشکلی به‌هم نزنه
      result = baseNo * result به این معناست که در ابتدا baseNo (عدد پایه) در متغیر result ضرب می‌شه و نتیجه‌ی این ضرب در خود متغیر result ذخیره میشه و این روند تا زمانی که متغیر counter کوچک‌تر مساوی powerNo (عدد توان) هست ادامه داره
      توی تمرین شماره ۱۱ به این دلیل متغیر result رو توی حلقه‌ی اول برابر با صفر قرار دادیم چون باید توی هر سطر مقدار result از نو مقدار دهی کنیم




  5. f1
    26 نوامبر 2012

    سلام
    ببخش میشه درباره نحوه ساخت مسطتیل یکم بیشتر توضیح بدین؟
    ممنون میشم




    • مسعود درویشیان
      2 دسامبر 2012

      سلام. حلقه‌ی اول مشخص‌کننده‌ی تعداد کاراکتر عرض مستطیل هست و حلقه‌ی داخلی مشخص‌کننده‌ی طول مستطیل. نحوه‌ی عمل‌کرد این دو حلقه به این صورت هست که ابتدا برنامه شرط حلقه‌ی اول رو بررسی می‌کنه و وارد حلقه می‌شه که درونش یه حلقه‌ی دیگه هست. حلقه‌ی داخلی ۱۴ بار تکرار می‌شه و کاراکتر مربوطه رو چاپ می‌کنه. برنامه از حلقه‌ی داخلی خارج می‌شه اما هنوز توی حلقه‌ی خارجی هست! متغیر کنترل‌کننده‌ی حلقه‌ی خارجی یه واحد افزایش داده می‌شه و از ۰ به ۱ تغییر پیدا می‌کنه و مجدداً وارد حلقه‌ی دوم می‌شه و دوباره ۱۴ کاراکتر چاپ می‌کنه و این روند همین‌طور ادامه داره تا شرط حلقه‌ی خارجی نقض بشه و برنامه به پایان برسه…




  6. davoud
    9 آوریل 2013

    سلام
    میشه راهنمایی کنید اگه از کاربر بخوایم طول و عرض وارد کنه برنامش چطور میشه




    • davoud
      9 آوریل 2013

      سوال منو تو مثال بعد جواب دادید مرسی




  7. HoSsEin
    17 آوریل 2013

    ممنون..

    خیلی با سرعت و البته دقت دارم می‌خونم خیلی خوب بود..

    مخصوصاً تمرین مثلث متساوی‌الاضلاع :D.




  8. mohammad sadegh
    19 آوریل 2013

    salam.mikham barname sin x ro benevisam mishe komakam konid!
    sin x =x – x3/2+x5/120
    nemitonam tavan haro beheshoon 3 ta ezafe konam hamchenim factoriel haro




    • مسعود درویشیان
      19 آوریل 2013

      از ()Math.Sin واسه سینوس و از ()Math.Pow واسه به توان رسوندن استفاده کنید.




      • علی ابراهیمی
        4 ژانویه 2014

        با سلام
        ورودی و خروجی تابع Math.Sin() بر حسب رادیان هست. چطور می تونیم ورودی و خروجی برحسب درجه داشته باشیم؟




  9. میلاد
    24 آوریل 2013

    خیلی مرسی آقا مسعود
    با استفاده و تغییر کدهای اون مثلثی که حل کرده بودید
    مشکل مثلث تو خالی خودمم حل شد.




  10. محمد
    21 می 2013

    سلام من تو php تخصص دارم و تا حالا که آموزش هارو نگاه کردم نحوه کد زدنش با php فرق چندانی نداره تو کنسول

    اما میخوام بدونم برنامه نویسی اپ و سرویس هم تو برنامه آموزشی هست یا نه؟



    • توی زنگ سی‌شارپ فقط توی محیط کنسول کار می‌کنیم.




      • محمد
        22 می 2013

        خوب اصلا هیچ برنامه ای ندارید بعد از زنگ سی شارپ؟



        • چون خود زنگ سی‌شارپ مقالات زیادی داره (حدوداً صد قسمت یا بیشتر) فعلاً واسه بعد از اون برنامه‌ی خاصی مد نظرم نیست. شاید برنامه‌نویسی موبایل، شاید وب… هنوز مشخص نیست ولی این مشخص هست که دیگه روی یه پلتفرم پیشرفته‌تر کار می‌کنیم.




  11. reza
    26 جولای 2013

    من با تمرین ۸ یه مشکل دارم وقتی از int استفاده میکنم مقدار ۱۰ به توان ۱۰ رو اشتباه میده ولی اگه از double استفاده کنم درست میشه الان میخوام بدونم کجا باید از int کجا از double استفاده کنم
    مرسی بابت آموزش خوبتون



    • وقتی ۱۰ رو به توان ۱۰ می‌رسونید دیگه از بازه‌ی int خارج می‌شید واسه همین جواب درستی نمی‌ده! اصولاْ باید با توجه به نوع و بازه‌ای که نیاز دارید از یک data type استفاده کنید.




      • رضا
        11 دسامبر 2013

        چه نکته ی ظریفی !
        پس احتمالا به همین دلیله که Math.Pow مقادیر دوبل می خواد ! درسته؟
        چون اعداد وقتی به توان می رسند خیلی زود رشد می کنند و احتمال خروجشون از بازه‌ی int زیاد میشه؟




  12. سمیه سلطانی
    28 ژوئن 2014

    با سلام و تشکر از مطالب بسیار مفید این سایت
    من سوالی داشتم که نتونستم کاملا متوجه بشم این که فرق cast, convert, parse, boxcing and unboxcing رو اگر ممکن هست با مثال و این که در حافظه و استک چه اتفاقی می افتد . ممنونم از توجه شما




  13. فاطمه
    15 اکتبر 2014

    سلام ممنون از اموزش های خوبتون میشه در مورد جدول ضرب یکم توضیح بدین
    ممنون میشم




  14. نیکی
    25 دسامبر 2014

    سلام خسته نباشید . ممنون از راهنمایی هاتون . اگه میشه لطفا به توی حل سوال به من کمک کنید .
    سوال: برنامه ای بنویسید که شکل زیر را در کنسول نمایش دهد .
    *
    * *
    * *
    * *
    *




  15. نیکی
    25 دسامبر 2014

    این شکل خرابه , شکل مورد نظرم یک لوزی تو خالی هستش . ممنون




  16. رضا
    12 دسامبر 2015

    سلام، ممنون از پستهای فوق العاده خوبتون!

    در خصوص تمرین شماره ۹، اگه لغتی که ما در برنامه می نویسیم با حرف کوچک بشه و کسی اون لغت رو با حرف بزرگ بنویسه دیگه معنیش رو نشون نمیده. برای حل این مشکل راهی هست که توی همون case لغت رو هم با حرف بزرگ نوشت و هم با حرف کوچک؟




  17. حسین
    14 دسامبر 2015

    سلام یه خسته نباشید باید به مسئول سایت خوبتون بگم واقعا زحمت کشید،
    من دچار یه مشکلی شدم میخوام یه برنامه بنویسم توش موندم نیاز به کمک دارم

    مسئله: برنامه ی بنویسید که مقدار صحیح ار ورودی بخواند و کار های زیر را انجام دهد
    ۱-میان گین ۵ مقدار
    ۲-بزرگ ترین مقدار و کوچکترین مقدار را نشان دهد
    ۳-حاصل ضرب
    ۴-منفی بودن یا مثبت بودن عدد را در Message box نشان دهد
    لطفا کمک کنید
    Anti.avacs@yahoo.com




  18. مهدی
    11 سپتامبر 2016

    سلام آقا مسعود بابت آموزش ها خیلی ممنونم.
    یه سوالی داشتم درباره ی تمرین فرهنگ لغت
    من توی فرهنگ لغتم نمیتونم کاری کنم که به بزرگی و کوچیکی حروف حساس باشه؟؟




  19. محمدباقر
    6 نوامبر 2016

    سلام درباره تمرین ۷
    اونجا که اسپیس رو محاسبه میکنه. هر اسپیس رو با تکرار حلقه توی یه خط ایجاد میکنه یا نه فقط یه تفریق ساده است؟ یعنی ۴ اسپیس خط اول رو با ۴ بار تکرار حلقه داخلی اولی بدست میاریم. یا اینکه از عبارت size – row =4 به تعداد اسپیس ها میرسیم؟
    ممنون




  20. سهیلا
    16 می 2017

    سلام

    قسمت ۱۵ از زنگ سی شارپ رو مطالعه کردم، و تا سوالاتی دارم؛

    آیا هنوز به سوالات جواب می دین؟

    خیلی ممنون :)




  21. علیرضا
    27 اکتبر 2017

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




  22. Zahra
    26 ژانویه 2018

    *
    * *
    * * *
    * * * *
    ببخشید این مثلث رو پاسخ بدین




  23. رضا
    15 جولای 2020

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



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





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

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

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

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

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



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

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