"> آموزش C++ عبارت کنترلی بخش دوم (قسمت بیست دوم)

آموزش C++ عبارت کنترلی بخش دوم (قسمت بیست دوم)

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

مقدمه

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

در این فصل به توصیف عبارات do…while, for و switch می پردازیم. در کنار مثال‌های کوچکی که در آنها از while و for استفاده شده، به بررسی اصول و نیازهای شمارنده-کنترل‌تکرار خواهیم پرداخت. بخشی از این فصل را اختصاص به گسترش کلاس GradeBook عرضه شده در فصل‌های سوم و چهارم داده‌ایم. در واقع، نسخه‌ای از کلاس GradeBook را ایجاد میکنیم که از عبارت switch برای شمارش تعداد نمرات A، B، C، D وF وارد شده از سوی کاربر استفاده میکند. به معرفی عبارات break وcontinue خواهیم پرداخت که کنترل‌کننده برنامه هستند. در مورد عملگرهای منطقی، که به برنامه‌نویسان اجازه میدهند تا از شرط‌های پیچیده و قدرتمندتر در عبارات کنترلی استفاده کنند، صحبت خواهیم کرد.

همچنین در ارتباط با خطای رایجی که در ارتباط با عدم درک صحیح تفاوت مابین عملگر برابری (==) و تخصیص (=) رخ میدهد توضیحاتی ارائه میکنیم. در پایان، بطور خلاصه شده به توصیف عبارات کنترلی C++ و تکنیک‌های حل مسئله مطرح شده در این فصل و فصل چهارم میپردازیم.

۲-۵  نکاتی در مورد شمارنده-کنترل تکرار

در فصل قبل، با مفهوم روش شمارنده-کنترل تکرار آشنا شدید. در این بخش با استفاده از عبارت تکرار while، اقدام به فرموله کردن عناصر مورد نیاز در روش شمارنده-کنترل تکرار میکنیم:

۱- نام متغیر کنترل (یا شمارنده حلقه) که برای تعیین تکرار حلقه بکار گرفته میشود.

۲- مقدار اولیه متغیر کنترل.

۳- شرط تکرار حلقه برای تست مقدار نهایی متغیر کنترل (آیا حلقه ادامه یابد یا خیر).

۴- افزایش (یا کاهش) متغیر کنترل در هر بار تکرار حلقه.

در برنامه شکل ۱-۵ از چهار عنصر شمارنده-کنترل تکرار برای نمایش ارقام ۱۰-۱ استفاده شده است. در خط ۹، نام متغیر کنترلی (counter) از نوع صحیح اعلان شده و فضای در حافظه برای آن رزرو میشود و با مقدار اولیه ۱ تنظیم شده است. این اعلان یک مقداردهی اولیه است. بخش مقداردهی این عبارت یک جزء اجرائی است و از اینرو، خود عبارت هم اجرائی می باشد.

اعلان و مقداردهی اولیه counter در خط ۹ را میتوان توسط عبارات زیر هم انجام داد:

int counter; // declare control variable

counter = 1; // initialize control variable to 1

ما از هر دو روش استفاده می‌کنیم.

به عبارت while (خطوط ۱۱-۱۵) توجه کنید. خط ۱۴ مقدار جاری counter را به میزان ۱ واحد در هر بار تکرار حلقه افزایش می دهد. شرط تکرار حلقه (خط ۱۱) در عبارت while تست میکند که آیا مقدار متغیر کنترل کمتر یا برابر ۱۰ است یا خیر، به این معنی که ۱۰، مقدار نهایی برای برقرار بودن شرط است. بدنه عبارت while تا زمانیکه متغیر کنترل به ۵ برسد اجرا می شود. زمانیکه مقدار متغیر کنترل بیش از ۱۰ شود (هنگامی که counter به مقدار ۱۱ برسد)، حلقه پایان می یابد.

cpp-ch5-1

شکل ۱-۵ | شمارنده-کنترل تکرار.

با مقداردهی counter با ۰ و جایگزین کردن عبارت while با

while( ++counter <= 10 ) //loop-continuation condition

cout << counter << ” “;

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

۳-۵  عبارت تکرار for

در بخش ۲-۵ به بررسی اصول شمارنده-کنترل تکرار پرداخته شد. میتوان از عبارتwhile در پیاده‌سازی هر حلقه کنترل شده با شمارنده استفاده کرد. زبان C++ دارای عبارت تکرار for است که از تمام جزئیات شمارنده-کنترل‌تکرار استفاده میکند. برای نشان دادن قدرت for برنامه ۱-۵ را مجدداً بازنویسی میکنیم. نتیجه اینکار در برنامه شکل ۲-۵ دیده میشود.

cpp-ch5-2

شکل ۲-۵ | شمارنده-کنترل‌تکرار با عبارت for.

هنگامی که عبارت for شروع بکار میکند (خطوط ۱۱-۱۲)، متغیر کنترل counter با ۱ مقداردهی میشود، از اینرو تا بدین جا دو عنصر اولیه شمارنده-کنترل تکرار یعنی نام متغیر و مقدار اولیه تعیین شده‌اند. سپس، شرط ادامه حلقه counter <= 10 بررسی میشود. بدلیل اینکه مقدار اولیه متغیر counter، برابر ۱ است، شرط برقرار بوده، و مقدار۱ با اجرای عبارت خط ۱۲ چاپ میشود. سپس مقدار متغیر counter توسط عبارت counter++ افزایش یافته و مجددا حلقه با تست شرط تکرار آغاز میشود. در این لحظه، متغیر کنترل حاوی مقدار ۲ است. این مقدار متجاوز از مقدار پایانی نیست و از اینرو برنامه عبارت موجود در بدنه را به اجرا در می آورد. این فرآیند تا زمانیکه counter به مقدار ۱۰ برسد و آنرا چاپ کند و متغیر کنترل counter به ۱۱ افزایش یابد، ادامه پیدا می کند و موجب می شود تا تست شرط حلقه برقرار نشده و تکرار خاتمه یابد. برنامه با اجرای اولین عبارت پس از عبارت for ادامه می یابد (در این مثال، برنامه به عبارت خروجی در خط ۱۴ می رسد و آنرا اجرا می کند).

کامپونت‌های تشکیل دهنده سرآیند for

در شکل۳-۵ نگاهی دقیق‌تر بر عبارت for برنامه ۲-۵ داشته‌ایم (خط ۱۱). گاهاً به خط اول عبارت for سرآیندfor میگویند. این سرآیند حاوی آیتم‌های مورد نیاز در ایجاد شمارنده-کنترل‌تکرار به همراه یک متغیر کنترلی است.

دقت کنید که در برنامه۲-۵ از شرط تکرار حلقه counter <= 10 استفاده شده است. اگر برنامه‌نویس اشتباهاً بنویسد counter < 10، حلقه فقط ۹ بار اجرا خواهد شد. این خطا معروف به خطای off-by-one است.

cpp-ch5-3

شکل ۳-۵ | کامپونت‌های سرآیند for.

فرمت کلی عبارت for بشکل زیر است

for (مقداردهی اولیه; شرط تکرار حلقه; افزایش)

عبارت

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

مقداردهی اولیه;

while (شرط تکرار حلقه) {

عبارت

افزایش;

}

در اینجا فقط یک استثناء وجود دارد که در بخش ۷-۵ به بررسی آن خواهیم پرداخت.

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

قابلیت حمل

در C++ استاندارد، قلمرو متغیر کنترلی اعلان شده در بخش مقداردهی اولیه یک عبارت for با قلمرو مطرح شده در کامپایلرهای قدیمیC++ متفاوت است. در کامپایلرهای قدیمی، قلمرو متغیر کنترلی با پایان یافتن بلوک تعیین ‌کننده عبارت for خاتمه‌ نمی پذیرد. کدC++ ایجاد شده با کامپایلرهای قدیمیC++ می تواند به هنگام کامپایل با کامپایلرهای استاندارد با مشکل مواجه شود. اگر در حال کار با کامپایلرهای قدیمی هستید و می خواهید از عملکرد دقیق کدهای خود بر روی کامپایلرهای استاندارد مطمئن شوید، دو استراتژی برنامه‌نویسی تدافعی وجود دارد که می توانید از آنها استفاده کنید: اعلان متغیرهای کنترلی با اسامی مختلف در هر عبارت for یا اگر ترجیح می‌دهید از نام یکسانی برای متغیر کنترلی در چندین عبارت for استفاده کنید، اعلان متغیر کنترلی قبل از اولین عبارت for است.

همانطوری که مشاهده خواهید کرد، جملات مقداردهی اولیه و افزایش را می توان با کاما از یکدیگر متمایز کرد. کامای (ویرگول) بکار رفته در این جملات، از نوع عملگرهای کاما هستند و تضمین می کنند که لیست جملات از سمت چپ به راست ارزیابی خواهند شد. عملگر کاما از تمام عملگرهای C++ از تقدم پایین‌تری برخوردار است. مقدار و نوع یک لیست جدا شده با کاما، معادل مقدار و نوع سمت راست‌ترین جمله در لیست خواهد بود. در اکثر مواقع از کاما در عبارات for استفاده می شود. اصلی ترین کاربرد کاما این است که برنامه‌نویس امکان استفاده از چندین جمله مقداردهی اولیه و یا چندین جمله افزایش‌دهنده را فراهم می آورد. برای مثال، امکان دارد چندین متغیر کنترلی در یک عبارت for وجود داشته باشند که بایستی مقداردهی اولیه شده و افزایش داده شوند.

سه عبارت در عبارت for حالت اختیاری دارند. اگر شرط تکرار حلقه فراموش شود، C++ فرض خواهد کرد که شرط تکرار حلقه برقرار است، و از اینرو یک حلقه بی نهایت بوجود خواهد آمد. می توان عبارت مقداردهی اولیه متغیر کنترلی را از عبارت for خارج کرد، اگر این متغیر در جای دیگری از برنامه و قبل از حلقه مقداردهی شده باشد. عبارت سوم مربوط به بخش افزایش است و در صورتیکه عملیات افزایش مقدار متغیر کنترلی توسط عبارتی در بدنه for صورت گیرد یا نیازی به افزایش وجود نداشته باشد، می توان آنرا از سرآیند حذف کرد. عبارت افزایشی در عبارت for همانند یک عبارت منفرد در انتهای بدنه for عمل می کند. از اینرو، عبارات

counter = counter + 1

counter += 1

++counter

counter++

همگی معادل بخش افزایشی در سرآیند عبارت for هستند. بسیاری از برنامه‌نویسان ترجیح می دهند تا از counter++ استفاده کنند. به این دلیل که عملیات افزایش مقدار متغیر کنترلی را پس از اجرای بدنه حلقه به انجام می رساند، و از اینرو این رفتار در افزایش بسیار طبیعی بنظر می رسد.

 

بخش‌های مقداردهی اولیه، شرط تکرار حلقه و افزایش در عبارت for می توانند حاوی عبارات محاسباتی باشند. برای مثال، فرض کنید که x = 2 و y = 10 باشد. اگر x و y در داخل بدنه حلقه تغییری نیابد، پس عبارت

for ( int j = x; j <= 4 * x * y; j += y / x)

معادل عبارت زیر خواهد بود

for ( int j = 2; j <= 80; j += 5)

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

 

دیاگرام فعالیت UML عبارت for

دیاگرام فعالیت UML عبارت for شبیه به دیاگرام فعالیت while است (شکل ۶-۴). در شکل ۴-۵ دیاگرام فعالیت عبارت for بکار رفته در برنامه ۲-۵ آورده شده است. در این دیاگرام مشخص است که فرآیند مقداردهی اولیه فقط یکبار و قبل از ارزیابی  تست شرط تکرار حلقه برای بار اول صورت می گیرد و اینکه عمل افزایش در هر بار و پس از اجرای عبارات بدنه انجام می شود. دقت کنید (در کنار وضعیت اولیه، خطوط انتقال، ادغام، وضعیت پایانی) دیاگرام فقط حاوی یک وضعیت عمل و یک تصمیم‌گیری است.

آموزش سی پلاس پلاس

cpp-ch5-4

  • پسورد: www.mspsoft.com
مسعود شریفی پور

از سال 88 که با برنامه نویسی آشنا شدم خیلی علاقه مند بودم یک بستر آموزشی بسازم در فضای وب و به انتشار آموزش های در این زمینه بپردازم.حالا یک تیم داریم و با قدرت رو به جلو حرکت میکنیم.

نوشته‌های مرتبط

دیدگاه‌ها

*
*

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

کدیشن ! مارکت پروژه های برنامه نویسی راه اندازی شدیه توکه پا بریم ببینم