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

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


مسعود درویشیان 39 دیدگاه سی شارپ Thursday, 15th November , 2012 55598 بازدید

در این قسمت به حل تمرین‌های 6 تا 11 می‌پردازیم. هدف از انجام این تمرین‌ها آشنایی بیشتر با حلقه‌های تو در تو و دستور 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 به یک عدد صحیح 32 بیتی علامت‌دار (شامل مقدار مثبت و منفی) تبدیل شده و مستقیماً در متغیر size قرار گرفته است. ()Convert.ToInt32 متدی است که مقدار string را دریافت کرده و به یک عدد صحیح 32 بیتی علامت‌دار  (32bit signed integer) تبدیل می‌کند. در ادامه‌ی تمرین بالا، مانند مثال قسمت قبل حلقه‌های تو در تو به جای نمایش اعداد کاراکتر ستاره را نمایش می‌دهند. در قسمت‌های آینده مبحث متدها و کلاس‌ها به‌طور کامل و دقیق مورد بررسی قرار می‌گیرد پس در این مورد هیچ جای نگرانی نیست که شما کاملاً با شی‌گرایی آشنا شده و بر آن مسلط می‌شوید.

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

// 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;

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

            // 3rd 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 باید کوچک‌تر یا مساوی  1 – (rowNumber * 2) باشد. اگر به تعداد ستاره‌ها در هر سطر توجه کنید متوجه می‌شوید که اعداد فرد را در بر می‌گیرند: 1،3، 5، 7 و… بنابراین باید در هر سطر معادل با اعداد فرد، ستاره‌ها نمایش داده شوند. در نهایت ()Console.WriteLine برنامه را به خط بعد سوق می‌دهد.

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

// 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 ذخیره می‌کند. به این ترتیب عدد پایه به اندازه‌ی عدد توان در خودش ضرب می‌شود.

حل تمرین شماره 9: در این تمرین قصد داریم با استفاده از دستور 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 بود.
حل تمرین شماره 10: در این تمرین قصد داشتیم توسط حلقه‌های تو در تو و کاراکتر █ یک مستطیل را رسم کنیم:

// 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();
        }
    }
}

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

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

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 ذخیره کرده‌ایم و در نهایت آن را نمایش داده‌ایم.
در صورت قابل درک نبودن هر قسمت و هر تمرین می‌توانید سوالات، دیدگاه و پیشنهادات خود را در قسمت نظرات بیان کنید.



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

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


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


  1. داوود
    16 November 2012

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




  2. فرامرز
    17 November 2012

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




  3. mmr
    17 November 2012

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




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

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




      • mmr
        18 November 2012

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




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

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

          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 November 2012

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




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

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




  5. f1
    26 November 2012

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




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

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




  6. davoud
    9 April 2013

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




    • davoud
      9 April 2013

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




  7. HoSsEin
    17 April 2013

    ممنون..

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

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




  8. mohammad sadegh
    19 April 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 April 2013

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




      • علی ابراهیمی
        4 January 2014

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




  9. میلاد
    24 April 2013

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




  10. محمد
    21 May 2013

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

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



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




      • محمد
        22 May 2013

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



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




  11. reza
    26 July 2013

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



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




      • رضا
        11 December 2013

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




  12. سمیه سلطانی
    28 June 2014

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




  13. فاطمه
    15 October 2014

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




  14. نیکی
    25 December 2014

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




  15. نیکی
    25 December 2014

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




  16. رضا
    12 December 2015

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

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




  17. حسین
    14 December 2015

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

    مسئله: برنامه ی بنویسید که مقدار صحیح ار ورودی بخواند و کار های زیر را انجام دهد
    1-میان گین 5 مقدار
    2-بزرگ ترین مقدار و کوچکترین مقدار را نشان دهد
    3-حاصل ضرب
    4-منفی بودن یا مثبت بودن عدد را در Message box نشان دهد
    لطفا کمک کنید
    [email protected]




  18. مهدی
    11 September 2016

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




  19. محمدباقر
    6 November 2016

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




  20. سهیلا
    16 May 2017

    سلام

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

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

    خیلی ممنون :)




  21. علیرضا
    27 October 2017

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




  22. Zahra
    26 January 2018

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




  23. رضا
    15 July 2020

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




  24. پوریا
    1 May 2021

    سلام با تشکر از شما و عرض خسته نباشید
    اگر بخواهیم با توجه به تمرین شماره ۷ تعداد ستاره ها را به صورت کاهشی نشان دهیم از چه دستوری باید استفاده کنیم؟
    ممنون می‌شوم اگر پاسخ دهید…..




  25. پوریا
    9 May 2021

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




  26. پوریا
    9 May 2021

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



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





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

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

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

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

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



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

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