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

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


مسعود درویشیان ۳۴ دیدگاه سی شارپ پنج شنبه, ۲۵ام آبان , ۱۳۹۱ 24316 بازدید

در این قسمت به حل تمرین‌های ۶ تا ۱۱ می‌پردازیم. هدف از انجام این تمرین‌ها آشنایی بیشتر با حلقه‌های تو در تو و دستور 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. داوود
    ۲۶ آبان ۱۳۹۱

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




  2. فرامرز
    ۲۷ آبان ۱۳۹۱

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




  3. mmr
    ۲۷ آبان ۱۳۹۱

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




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

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




      • mmr
        ۲۸ آبان ۱۳۹۱

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




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

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

          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. رامیتن
    ۲ آذر ۱۳۹۱

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




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

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




  5. f1
    ۶ آذر ۱۳۹۱

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




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

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




  6. davoud
    ۲۰ فروردین ۱۳۹۲

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




    • davoud
      ۲۰ فروردین ۱۳۹۲

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




  7. HoSsEin
    ۲۸ فروردین ۱۳۹۲

    ممنون..

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

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




  8. mohammad sadegh
    ۳۰ فروردین ۱۳۹۲

    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




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

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




      • علی ابراهیمی
        ۱۴ دی ۱۳۹۲

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




  9. میلاد
    ۴ اردیبهشت ۱۳۹۲

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




  10. محمد
    ۳۱ اردیبهشت ۱۳۹۲

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

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




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

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




      • محمد
        ۱ خرداد ۱۳۹۲

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




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

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




  11. reza
    ۴ مرداد ۱۳۹۲

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




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

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




      • رضا
        ۲۰ آذر ۱۳۹۲

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




  12. سمیه سلطانی
    ۷ تیر ۱۳۹۳

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




  13. فاطمه
    ۲۳ مهر ۱۳۹۳

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




  14. نیکی
    ۴ دی ۱۳۹۳

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




  15. نیکی
    ۴ دی ۱۳۹۳

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




  16. رضا
    ۲۱ آذر ۱۳۹۴

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

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




  17. حسین
    ۲۳ آذر ۱۳۹۴

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

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




  18. مهدی
    ۲۱ شهریور ۱۳۹۵

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




  19. محمدباقر
    ۱۶ آبان ۱۳۹۵

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




  20. سهیلا
    ۲۶ اردیبهشت ۱۳۹۶

    سلام

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

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

    خیلی ممنون :)




  21. علیرضا
    ۵ آبان ۱۳۹۶

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



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





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

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

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

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

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



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

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