آموزش گام به گام #C (جلسه چهارم: عبارات کنترلی – حلقه‌ها)
1397/12/25 12:29 , میلاد صاحب نظر

آموزش گام به گام #C (جلسه چهارم: عبارات کنترلی – حلقه‌ها)

برای تعاملی کردن برنامه روش‌های زیادی وجود دارد. یکی از این روش‌ها استفاده از حلقه‌ها است و برای اینکه بتوانید برنامه خود را هر چه بیشتر هوشمند‌ و تعاملی کنید، باید با ساختار و عملکرد انواع حلقه‌ها آشنایی داشته باشید. در این جلسه توضیح کاملی از حلقه‌ها را در زبان #C ارائه می‌دهیم. با ما همراه باشید.

جلسه اول: آغاز کار با #C جلسه ششم: namespaceها جلسه یازدهم: اندیس گذار یا indexerها جلسه شانزدهم: استفاده از اتریبیوت‌ها جلسه بیست و یکم: متدهای بی‌نام یا anonymous
جلسه دوم: عملگرها، نوع‌ها و متغیرها جلسه هفتم: مقدمه‌ای بر کلاس‌های #C جلسه دوازدهم: ساختار یا structها جلسه هفدهم: enumها جلسه بیست و دوم: موضوعاتی در مورد نوع در #C
جلسه سوم: عبارات کنترلی - گزینشی جلسه هشتم: وراثت کلاس در #C جلسه سیزدهم: واسط یا interfaceها جلسه هجدهم: عملگرهای overloading جلسه بیست و سوم: کار با نوع‌های nullable
جلسه چهارم: عبارات کنترلی - حلقه‌ها جلسه نهم: چند ریختی جلسه چهاردهم: مقدمه‌ای بر delegateها و رویدادها جلسه نوزدهم: کپسوله‌سازی  
جلسه پنجم: متدها جلسه دهم: ویژگی یا propertyها جلسه پانزدهم: مقدمه‌ای بر کنترل خطا یا exception جلسه بیستم: مقدمه‌ای بر generic collectionها  

در جلسه قبل، آموختید که چگونه می‌توان با استفاده از عبارت goto یک حلقه ساده ایجاد کرد. در همان جلسه به شما گفتم که استفاده از goto، بهترین روش برای ایجاد حلقه در #C نیست.

در این جلسه به شما روش مناسب اجرای منطق تعاملی با استفاده از عبارات حلقه‌ای مختلف #C را خواهیم آموخت. اهداف این جلسه به شرح زیر هستند:

  • آموختن حلقه while.
  • آموختن حلقه do.
  • آموختن حلقه for.
  • آموختن حلقه for each.
  • تکمیل دانسته‌های شما در مورد عبارت break.
  • آموختن استفاده از عبارت continue.

حلقه while

یک حلقه while یک شرط را بررسی می‌کند و سپس تا زمانی که مقدار بولین شرط حلقه برابر با True باشد، به اجرای یک بلوک کد ادامه می‌دهد. Syntax یا نحو حلقه while به این شکل است:

(عبارت بولین)While

}

کدها

{

کدها و عباراتی که می‌توانید در بلوک while بنویسید، می‌توانند کدهای قابل‌قبول #C باشند.

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

وقتی مقدار عبارت بولین برابر با false باشد، کدهای درون بلوک while نادیده گرفته شده و کدهایی که بعد از بسته شدن آکولاد بلوک while‌ قرار دارند اجرا می‌شوند. قبل از وارد شدن به حلقه، اطمینان حاصل کنید که متغیرهای ارزیابی شده در شرط حلقه، مقدار اولیه بگیرند.

در طول اجرا، حتما متغیرهای مرتبط با معادله یا عبارت بولین را به روز رسانی کنید تا هر موقع که شما می‌خواهید حلقه پایان یابد. لیست ۱-۴ نحوه پیاده‌سازی یک حلقه while را نشان می‌دهد.

using System;

class WhileLoop
{
    public static void Main()
    {
        int myInt = 0;

        while (myInt < 10)
        {
            Console.Write("{0} ", myInt);
            myInt++;
        }
        Console.WriteLine();
    }
}

لیست ۱-۴ یک حلقه while ساده را نمایش می‌دهد. این حلقه با کلیدواژه while شروع و در مقابل آن یک عبارت بولین داخل پرانتز نوشته شده است.

همه عبارات و کدهای کنترلی از عبارات بولین به عنوان شرط خود برای وارد شدن / ادامه دادن حلقه استفاده می‌کنند. این بدان معنا است که عبارت باید یا مقدار True بگیرد یا False.

در این مثال، ما متغیر myInt را بررسی می‌کنیم تا ببینیم آیا مقدار آن کمتر از ۱۰ هست یا خیر. چون مقدار myInt از ۰ شروع می‌شود، پس عبارت بولین در اولین دفعه‌ای که بررسی می‌شود، مقدار true را بازمی‌گرداند. وقتی مقدار عبارت بولین true باشد، بلوک کدی که بلافاصله پس از عبارت بولین آورده شده است، اجرا خواهد شد.

با استفاده از کد console داخل بلوک while، عدد و فضای کنسول را نمایش می‌دهیم. سپس myInt را یک عدد (++) افزایش می‌دهیم تا به عدد صحیح (integer) بعدی برسیم. وقتی کدهای درون بلوک while اجرا شوند، عبارت بولین دوباره ارزیابی می‌شود.

تا وقتی که مقدار عبارت بولین False نشود، این دنباله ادامه می‌یابد. وقتی مقدار عبارت بولین false شد، کنترل برنامه به اولین کدی که بعد از بلوک while قرار دارد، جهش خواهد کرد.

در این مثال، در کنسول اعداد ۰ تا ۹ را نمایش می‌دهیم، سپس از بلوک while خارج می‌شویم و خط جدیدی در کنسول ایجاد می‌کنیم.

حلقه do

حلقه do مشابه حلقه while است، به استثنای اینکه این حلقه، شرط را در انتهای حلقه بررسی می‌کند. این بدان معنا است که حلقه do حتما حداقل یک بار اجرا خواهد شد.

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

یک دلیل برای استفاده از حلقه do به جای حلقه while، این است که می‌توانید یک پیغام یا منو(مانند آنچه در لیست ۲-۴ می‌بینید)نمایش دهید و سپس ورودی را از کاربر بگیرید.

لیست ۲-۴: حلقه do: DoLoop.cs

using System;

class DoLoop
{
    public static void Main()
    {
        string myChoice;

        do

       {
            // A چاپ منوی
            Console.WriteLine("My Address Book\n");

            Console.WriteLine("A - Add New Address");
            Console.WriteLine("D - Delete Address");
            Console.WriteLine("M - Modify Address");
            Console.WriteLine("V - View Addresses");
            Console.WriteLine("Q - Quit\n");

            Console.WriteLine("Choice (A,D,M,V,or Q): ");

            // به دست آوردن انتخاب کاربر
            myChoice = Console.ReadLine();

            // تصمیم‌گیری بر اساس انتخاب کاربر
            switch(myChoice)
            {
                case "A":
                case "a":
                    Console.WriteLine("You wish to add an address.");
                    break;
                case "D":
                case "d":
                    Console.WriteLine("You wish to delete an address.");
                    break;
                case "M":
                case "m":
                    Console.WriteLine("You wish to modify an address.");
                    break;
                case "V":
                case "v":
                    Console.WriteLine("You wish to view the address list.");
                    break;
                case "Q":
                case "q":
                    Console.WriteLine("Bye.");
                    break;
                default:
                    Console.WriteLine("{0} is not a valid choice", myChoice);
                    break;
            }

            //  کردن برای اینکه کاربر بتواند نتیجه را ببیند Pause
            Console.Write("press Enter key to continue...");
            Console.ReadLine();
            Console.WriteLine();
        } while (myChoice != "Q" && myChoice != "q"); // Keep going until the user wants to quit
    }
}

ست ۲-۴ عملکرد یک حلقه do را نمایش می‌دهد. نحو یا syntax حلقه do به این شکل است:

Do

}

Statements

;(while(boolean expression{

در بلوک do می‌توانید از هر نوع کد مورد قبول #C که دوست دارید استفاده کنید. عبارت بولین نیز مانند تمام عبارات قبلی‌ای است که با آن‌ها مواجه شدید. یا مقدار true بازمی‌گرداند یا False.

در متد Main، ما متغیر myChoice را با نوع string معرفی کردیم. سپس مجموعه‌ای از کدها را درون کنسول نوشتیم. این کدها منویی از انتخاب‌ها را برای کاربر نمایش می‌دهند. باید از کاربر ورودی بگیریم، که این امر را به شکل یک متد Console.ReadLine نوشتیم و این متد، ورودی یا مقدار کاربر را به متغیر myChoice بازمی‌گرداند.

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

این تنها راه ممکن و منطقی برای گذر خودکار برنامه از caseها است. اگر بین هر دو case یک کد می‌نوشتید، نمی‌توانستید به این سادگی‌ها از برخی Caseهایی که انتخاب شدن آن‌ها مد نظر شما نیست، بگذرید.

نکته دیگر این است که ما از default: case استفاده کردیم، که یک عادت بسیار خوب در استفاده از عبارت Switch است.

دلیل این کار را در جلسه سوم کامل توضیح دادیم.

حلقه for

حلقه for همانند حلقه while عمل می‌کند، به استثنای اینکه syntax آن به این شکل است که مقدار دهی اولیه و شرط تغییر مقدار هر دو در قسمت شروط for نوشته می‌شوند. زمانی استفاده از حلقه‌های for مناسب است که دقیقا بدانید عبارات داخل بلوک for، قرار است چند دفعه تکرار شوند.

محتوای درون پرانتزهای حلقه for در سه بخش قرار می‌گیرند که این بخش‌ها با سمی‌کالن‌ها از هم مجزا می‌شوند:

(لیست تکرار کننده; عبارت بولین; لیست مقدار دهی اولیه)For

}

کدها

{

لیست مقداردهی اولیه، لیستی از عبارات یا معادلاتی است که با ویرگول از همدیگر مجزا می‌شوند. این معادلات در کل طول عمر حلقه for فقط یک بار ارزیابی می‌شوند.

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

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

فقط یک عبارت بولین وجود دارد، اما می‌توانید هر چقدر دوست دارید آن را پیچیده بنویسید، تنها شرطی که باید رعایت کنید این است که در هر حال فقط یک مقدار true یا false را بازگرداند.

معمولا عبارت بولین برای تشخیص وضعیت متغیر شمارنده مورد استفاده قرار می‌گیرد.

وقتی مقدار عبارت بولین True باشد، کدهای داخلی آکولادهای حلقه for اجرا می‌شوند. بعد از اجرای کدهای بلوک حلقه for، کنترل دوباره به بالای حلقه بازمی‌گردد و لیست تکرار کننده را دوباره اجرا می‌کند، که معمولا یک عدد از شمارنده کم یا به آن اضافه می‌کند.

لیست تکرار کننده می‌تواند شامل لیستی از کدهای جدا شوند با ویرگول باشد، اما عملا در کل همه فقط یک عبارت یا کد محسوب می‌شوند. لیست ۳-۴ نحوه پیاده‌سازی یک حلقه for را نمایش می‌دهد. هدف برنامه این است که فقط اعداد فرد کمتر از ۱۰ را نمایش دهد.

لیست ۳-۴، حلقه for: ForLoop.cs

using System;

class ForLoop
{
    public static void Main()
    {
        for (int i=0; i < 20; i++)
        {
            if (i == 10)
                break;

            if (i % 2 == 0)
                continue;

            Console.Write("{0} ", i);
        }
        Console.WriteLine();
    }
}

معمولا، کدهای حلقه for از آکولاد باز شروع شده و بدون مزاحمت و وقفه، تا آکولاد بسته اجرا می‌شوند. به هر حال، در لیست ۳-۴، ما چند استثنا ایجاد کردیم. چند عبارت if وجود دارند که در جریان کنترل درون بلوک for مزاحمت و وقفه ایجاد می‌کنند.

اولین عبارت if بررسی می‌کند تا ببیند آیا i برابر با ۱۰ هست یا خیر. حالا می‌توانید یکی دیگر از موارد استفاده عبارت break را مشاهده کنید. رفتار break مشابه رفتار عبارات گزینشی است که در جلسه سوم توضیح داده شدند.

این عبارت، به زبان ساده، باعث می‌شود برنامه از حلقه خارج شده و کنترل را به اولین کدی که بعد از پایان بلوک حلقه for‌ قرار دارد، می‌سپارد.

دومین عبارت if از عملگر "باقیمانده"(٪) استفاده می‌کند تا بررسی کند که آیا is از ضرایب ۲ هست یا خیر. مقدار این عبارت بولین زمانی true می‌شود که i بر ۲ تقسیم شود و باقیمانده آن برابر با صفر باشد.

وقتی مقدار آن True شد، عبارت continue اجرا شده و باعث می‌شود کنترل برنامه از کدهای باقیمانده در حلقه عبور کرده (آن‌ها را نادیده می‌گیرد) و دوباره به لیست تکرار کننده بازمی‌گردد. با نوشتن و قرار دادن مناسب کدها در یک بلوک، می‌توانید بر اساس هر شرطی که لازم دارید، آن‌ها را به صورت شرطی اجرا کنید.

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

لیست ۳-۴ یک عمل معمولی است، یک عدد به شمارنده اضافه می‌کند. وقتی این عمل تکمیل شد، کنترل به عبارت بولین بازمی‌گردد تا آن را ارزیابی کند.

همانند حلقه while، یک حلقه for تا زمانی که مقدار عبارت بولین برابر با true باشد، به اجرا کردن بلوک کد حلقه ادامه می‌دهد. وقتی مقدار عبارت بولین false شود، کنترل به اولین کد موجود بعد از بلوک for می‌رود.

برای این تمرین، من تصمیم گرفتم که در لیست ۳-۴ فقط از عبارات break و continue استفاده کنم. به هر حال، می‌توانید از آن‌ها در هر عبارت حلقه استفاده کنید.

حلقه foreach

حلقه foreach برای تکرار کردن یک بلوک از طریق آیتم‌های موجود در یک لیست مورد استفاده قرار می‌گیرند. این حلقه روی آرایه‌ها یا مجموعه‌هایی مانند ArrayList عمل می‌کند که می‌توانید آن‌ها را در کتابخانه System.Collections namespace بیابید.

نحو یا syntax یک حلقه foreach به این شکل است:

(<لیست> in<متغیر تکرار><نوع>)Foreach

}

Statements

{

نوع، همان نوع آیتم قرار گرفته در لیست است. برای مثال، اگر نوع لیست []int باشد، پس نوع آیتم‌ها نیز int است.

متغیر تکرار، یک آیتم شناسایی کننده به انتخاب شما است که بهتر است نام آن را چیزی مرتبط با برنامه‌ای که می‌نویسید و هدف حلقه انتخاب کنید. برای مثال، اگر لیست شامل آرایه‌ای از سن افراد باشد، پس یک نام معنادار برای این آیتم، age است.

کلیدواژه in در حلقه Eachword الزامی است.

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

 وقتی از طریق آیتم‌های موجود در یک لیست درون حلقه Foreach عمل تکرار را انجام می‌دهید، لیست حالت فقط خواندنی دارد. این یعنی اینکه درون یک حلقه foreach، نمی‌توانید متغیر تکرار را تغییر دهید.

در این بخش از برنامه‌نویسی، ظرافت و زیبایی خاصی به کار رفته است. بعدا خواهید آموخت که می‌توانید انواع سفارشی(به نام Class و struct) ایجاد کنید که می‌توانند شامل چندین فیلد باشند.

می‌توانید فیلدهای class یا Struct را تغییر دهید، اما متغیر تکرار برای class یا struct در یک حلقه foreach غیرقابل تغییر هستند.

برای هر تکرار درون یک حلقه foreach، مقدار جدیدی در لیست گنجانده می‌شود. تا وقتی که لیست بتواند مقداری را بازگرداند، این مقدار درون متغیر تکرار فقط خواندنی قرار می‌گیرد و باعث می‌شود کدهای درون بلوک foreach اجرا شوند.

وقتی مجموعه کاملا طی شد، کنترل به اولین عبارت کدی که بعد از پایان بلوک foreach قرار دارد انتقال می‌یابد. لیست ۴-۴ نحوه استفاده از حلقه foreach را نمایش می‌دهد.

لیست ۴-۴. حلقه foreach: ForEach.cs

using System;

class ForEachLoop
{
    public static void Main()
    {
        string[] names = {"Cheryl", "Joe", "Matt", "Robert"};

        foreach (string person in names)
        {
            Console.WriteLine("{0} ", person);
        }
    }
}

در لیست ۴-۴، اولین کاری که درون متد Main انجام داده‌ایم، تعریف و مقداردهی اولیه آرایه names با ۴ رشته است. این لیستی است که برای حلقه foreach استفاده شد.

در حلقه foreach، ما از یک متغیر نوع رشته به نام person استفاده کردیم، تا هر عنصر از آرایه names را در خودش نگه دارد. تا زمانی که در آرایه نام‌هایی وجود داشته باشند که بازگردانده نشده باشند، متد Console.WriteLine هر مقدار از متغیر person را روی صفحه نمایش می‌دهد.

خلاصه

حلقه‌ها این امکان را فراهم می‌کنند تا یک بلوک از کدها را چندین بار اجرا کنید. #C چندین عبارت برای ساخت حلقه به برنامه‌نویسان ارائه داده است که عبارت‌اند از while، do، for و foreach. حلقه‌های while تا زمانی که عبارت بولین true باشد، بلوکی از کدها را اجرا می‌کنند.

حلقه‌های do حداقل یک بار بلوک کدها را اجرا می‌کنند و سپس تا وقتی که شرط درون عبارت بولین true باشد به اجرای بلوک کد ادامه می‌دهند.

حلقه‌های for یک بلوک از کدها را به تعداد دفعات معین اجرا می‌کنند و حلقه‌های foreach یک بلوک از کدها را برای هر آیتم موجود در آرایه یا مجموعه اجرا می‌کنند. معمولا بلوک کدها از ابتدا تا انتها بدون وقفه انجام می‌شوند. اما، می‌توانید با استفاده از عبارت‌های break و continue جریان طبیعی اجرای حلقه را تغییر دهید.

تا این مبحث از آموزش، تنها متدی که در تمرین‌ها مشاهده کرده‌اید، متد Main بوده است که نقطه ورودی برنامه‌نویسی #C است.

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

برای این منظور، به شما پیشنهاد می‌کنم که جلسه پنجم را از دست ندهید. در جلسه پنجم می‌توانید تکنیک‌های جدیدی برای سازماندهی کدهای خود بیاموزید.

منبع: C# - Station

جلسه بعد                                                                جلسه قبل

 مطالب مرتبط

 مقدمه ای بر زبان برنامه نویسی #C و پلتفرم NET Framework.
7 دلیل منطقی برای آموختن #C
 طبقه بندی زبان های برنامه نویسی
به دست آوردن Exceptionها در #C و یافتن همه خطاها
 LINQ(زبان جستجوی یکپارچه)
برنامه نویسی شیءگرا چیست؟

 

از آخرین دوره های آموزشی و تخفیف ها مطلع شوید

با تکمیل فرم زیر ، از اخبار و اطلاعات به روز برنامه نویسی و تکنولوژی عقب نمانید

آخرین مطالب

آموزش جامع SQL Server (جلسه ۱۲)
آموزش جامع SQL Server (جلسه ۱۲)

دستور UPDATE در SQL Server برای تغییر داده‌های موجود در یک جدول، از دستور UPDATE به شکل زیر استفاده ...

آموزش جامع SQL Server (جلسه ۱۵)
آموزش جامع SQL Server (جلسه ۱۵)

دستور DROP TABLE در SQL Server گاهی، لازم است یک جدول که دیگر استفاده‌ای ندارد را حذف کنید. برای ...

آموزش جامع SQL Server (جلسه ۳۵: Window Functionها – بخش ۲)
آموزش جامع SQL Server (جلسه ۳۵: Window Functionها – بخش ۲)

بخش اول از آخرین مبحث دوره جامع آموزش SQL Server در جلسه قبلی بررسی شد. این مبحث که ...

آخرین دیدگاه ها

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

فرم ارسال نظرات