آموزش C++ عبارت تکرار do while و تمرینات عبارات کنترلی

۵-۵ عبارت تکرار do…while
عملکرد عبارت تکرار do…while همانند عبارت whileاست. در عبارتwhile ، شرط تکرار حلقه در ابتدای حلقه تست میشود، قبل از اینکه بدنه حلقه به اجرا درآید. عبارت do…while شرط تکرار حلقه را پس از اجرای حلقه تست میکند. از اینرو، در یک عبارت do…while، همیشه بدنه حلقه حداقل یکبار به اجرا در میآید. اگر فقط یک عبارت در بدنه وجود داشته باشد، استفاده از براکتها در do…whilewhile و do…while از براکتها استفاده میشود. برای مثال، ضرورتی ندارد.
بقیه اموزش در ادامه مطلب
آموزش C++ عبارت تکرار do while و تمرینات عبارات کنترلی

۵-۵ عبارت تکرار do…while
عملکرد عبارت تکرار do…while همانند عبارت whileاست. در عبارتwhile ، شرط تکرار حلقه در ابتدای حلقه تست میشود، قبل از اینکه بدنه حلقه به اجرا درآید. عبارت do…while شرط تکرار حلقه را پس از اجرای حلقه تست میکند. از اینرو، در یک عبارت do…while، همیشه بدنه حلقه حداقل یکبار به اجرا در میآید. اگر فقط یک عبارت در بدنه وجود داشته باشد، استفاده از براکتها در do…whilewhile و do…while از براکتها استفاده میشود. برای مثال، ضرورتی ندارد.
while (شرط)
نشاندهنده سرآیند عبارت while است. یک عبارت do…while بدون براکتها در اطراف بدنه خود (با یک عبارت) بصورت زیر خواهد بود
do
عبارت
while ( شرط );
که میتواند باعث اشتباه شود. خط آخر، میتواند توسط خواننده به غلط بعنوان یک عبارت while با عبارت تهی تفسیر شود (وجود سیمکولن در انتهای شرط). از اینرو، برای اجتناب از اشتباه، بهتر است در یک عبارت do…while با یک عبارت از براکتها استفاده شود:
do {
عبارت;
} while ( شرط );
در برنامه شکل ۷-۵ از یک عبارت do…whileبرای چاپ مقادیر از ۱۰ تا ۱ استفاده شده است. عبارت do…whileدر خطوط ۱۱-۱۵ اعمال شده است. در اولین برخورد برنامه با این عبارت، خط ۱۳ اجرا شده و مقدار متغیر counter (با مقدار ۱) چاپ شده، سپس counter یک واحد افزایش مییابد (خط ۱۴). سپس شرط در خط ۱۵ ارزیابی میشود. اکنون متغیر counter حاوی مقدار ۲است که کمتر یا مساوی با ۱۰ میباشد، چون شرط برقرار است، عبارت do…while مجدداً اجرا میشود. در بار دهم که عبارت اجرا شد، عبارت خط ۱۳ مقدار ۱۰ را چاپ کرده و در خط ۱۴، مقدار counter به ۱۱ افزایش مییابد. در این لحظه، شرط موجود در خط ۱۵، نادرست ارزیابی شده و برنامه از عبارت do…while خارج میشود و برنامه به سراغ عبارت پس از حلقه میرود (خط ۱۷).

شکل۷-۵ | عبارتتکرارdo…while
دیاگرام فعالیت UMLعبارت do…while
شکل ۸-۵ حاوی دیاگرام فعالیت UML برای عبارت do…while است. این دیاگرام به وضوح نشان میدهد که شرط تکرار حلقه حداقل پس از یک بار اجرای عبارات موجود در بدنه حلقه، ارزیابی نخواهد شد. این دیاگرام فعالیت را با عبارت while بکار رفته در شکل ۶-۴ مقایسه کنید. مجدداً، توجه کنید که این دیاگرام حاوی یک نماد وضعیت عمل و تصمیمگیری است.

شکل ۸-۵ | دیاگرام فعالیت UML عبارت تکرار do…while
6-5 عبارت چند انتخابی switch
در فصل گذشته، در ارتباط با عبارت تک انتخابی if و دو انتخابی if…else صحبت کردیم. زبان C++ دارای عبارت چند انتخابی switch برای رسیدگی به چنین شرایطی است.
کلاس GradeBook با عبارت switch
در مثال بعدی، مبادرت به عرضه یک نسخه بهبود یافته از کلاس GradeBook معرفی شده در فصل سوم و فصل چهارم میکنیم. نسخه جدید از کاربر میخواهد تا مجموعهای از امتیازات حرفی را وارد کرده، سپس تعداد دانشجویانی که هر کدام امتیازی دریافت کردهاند، به نمایش در میآورد. این کلاس از یک عبارت switch برای تعیین اینکه امتیاز وارد شده یک A، B، C، D یا F میباشد و افزایش مقدار شمارنده امتیاز وارد شده، استفاده میکند. کلاس GradeBook در برنامه شکل ۹-۵ تعریف شده و تعریف تابع عضو آن در برنامه شکل ۱۰-۵ قرار دارد. شکل ۱۱-۵ نمایشی از اجرای نمونه برنامه همراه ورودیها و خروجی برنامه main است که از کلاس GradeBook برای پردازش امتیازات استفاده میکند. همانند نسخههای قبلی تعریف کلاس، تعریف کلاس GradeBook در شکل ۹-۵ حاوی نمونه اولیه تابع برای توابع عضو setCourseName در خط ۱۳، getCourseName در خط ۱۴ و displayMessage در خط ۱۵ به همراه سازنده کلاس در خط ۱۲ است. همچنین در تعریف کلاس عضو داده courseName بصورت private اعلان شده است (خط ۱۹).
کلاس GradeBook در شکل۹-۵ دارای پنج عضو داده private است (خطوط ۲۰-۱۴)، متغیرهای شمارنده برای هر امتیاز (یعنی برای A، B، C، D و F). همچنین کلاس دارای دو تابع عضو public بنامهای inputGrades و displayGradeReport است. تابع عضو inputGrade (اعلان شده در خط ۱۶) مبادرت خواندن حروف امتیازی به تعداد اختیاری از طرف کاربر با روش مقدار مراقبتی میکند و شمارنده امتیاز مقتضی را برای هر امتیاز وارد شده به روز مینماید. تابع عضو displayGradeReport (اعلان شده در خط ۱۷) گزارشی از تعداد دانشجویان دریافتکننده هر امتیاز به نمایش در میآورد.

شکل ۹-۵ | تعریفکلاسGradeBook.
فایل کد منبع GradeBook.cpp در شکل۱۰-۵ حاوی تعریف تابع عضو کلاس GradeBook است. توجه کنید زمانیکه یک شی GradeBook برای اولین بار ایجاد میشود و هنوز هیچ امتیازی وارد نشده است، خطوط ۱۶-۲۰ در سازنده مبادرت به مقداردهی اولیه پنج شمارنده امتیاز با صفر میکنند. همانطوری که بزودی خواهید دید، این شمارندهها در تابع عضو inputGrade و بعنوان امتیازهای ورودی کاربر افزایش مییابند. تعاریف توابع عضو setCourseName، getCourseName و displayMessage با نسخههای قبلی موجود در کلاس GradeBook یکسان هستند. اجازه دهید تا نگاهی به توابع عضو جدید در GradeBook داشته باشیم.




شکل۱۰-۵ | کلاسGradeBook از عبارت switch برای شمارش امتیازات A, B, C, D و F استفاده میکند.
خواندن کاراکترهای ورودی
کاربر مبادرت به وارد کردن امتیازات حرفی برای یک واحد درسی در تابع inputGrades میکند (خطوط ۵۲-۱۰۱). در سرآیند حلقه while در خط ۶۰، ابتدا عبارت تخصیصی قرار گرفته در درون پرانتز ( grade = cin.get() ) اجرا میشود. تابع cin.get() یک کاراکتر از صفحه کلید خوانده و آن را در متغیر grade از نوع صحیح ذخیره میسازد (اعلان شده در خط ۵۴). معمولاً کاراکترها در متغیرهای از نوع char ذخیره میشوند، با این همه، میتوان کاراکترها را در هر نوع داده صحیحی ذخیره کرد، چرا که نشاندهنده ۱ بایت صحیح در کامپیوتر هستند. از اینرو، میتوانیم براساس استفاده، با یک کاراکتر همانند یک مقدار صحیح یا بعنوان یک کاراکتر رفتار کنیم. برای مثال، عبارت
cout << “The character (” << ‘a’ << “) has the value”
<< static_cast< int > ( ‘a’ ) << endl;
مبادرت به چاپ کاراکتر a و مقدار صحیح آن بصورت زیر میکند:
The character (a) has the value 97
عدد صحیح ۹۷ نشاندهنده شماره عددی کاراکترa در کامپیوتر است. اکثر کامپیوترها از مجموعه کاراکتری ASCII (American Standard Code for Information Interchange) استفاده میکنند، که در این مورد ۹۷ نشاندهنده حرف کوچک ‘a’ است.
بطور کلی عبارات تخصیصدهنده مبادرت به تخصیص مقدار قرار گرفته در سمت راست به متغیر قرار گرفته در سمت چپ علامت =میکنند. بنابر این مقدار عبارت تخصیصی grade=cin.get()همان مقدار برگشتی از سوی cin.get() بوده و به متغیر gradeتخصیص مییابد. میتوان از عبارات تخصیصدهنده برای تخصیص یک مقدار به چندین متغیر استفاده کرد. برای مثال در عبارت زیر
a=b=c=0;
ابتدا تخصیص c=0 صورت میگیرد چرا که عملگر = دارای شرکتپذیری از سمت راست به چپ است. سپس به متغیر b مقدار تخصیصی c=0، تخصیص مییابد (که صفر است). سپس متغیر a حاوی مقدار تخصیصی b=(c=0) خواهد شد که آن هم صفر است. در برنامه، مقدار عبارت تخصیصی grade=cin.get() با مقدار EOF مقایسه میشود (نمادی که کوتاه شده عبارت “end-of-file” است). ما از EOF (که معمولاً دارای مقدار -۱ است) بعنوان مقدار مراقبتی استفاده کردهایم. با این همه، نیازی به تایپ مقدار -۱ یا تایپ حروف EOF بعنوان مقدار مراقبتی ندارید. بجای آن از یک ترکیب کلیدی استفاده کردهایم، که نشاندهنده EOF در سیستم است. EOF یک ثابت سمبولیک سیستم است که در سرآیند فایل <iostream> تعریف شده است. اگر مقداری به gradeتخصیص دهید که معادل با EOF باشد، حلقه whileدر خطوط ۶۰-۱۰۰ بکار خود خاتمه میدهد. نمایش کاراکترهای وارد شده به این برنامه را بصورت مقادیر صحیح انتخاب کردهایم، چرا که EOF دارای یک مقدار صحیح است.
در سیستمهای UNIX/Linux و برخی از سیستمهای دیگر، EOF با تایپ
<ctrl> d
در یک خط وارد میشود. این عبارت به این معنی است که کلید ctrl را فشار و پایین نگه داشته و سپس کلید d فشار داده شود. در سیستمهای دیگر همانند Microsoft Windows، میتوان EOF را با تایپ
<ctrl> z
وارد کرد.
در این برنامه، کاربر امتیازها را توسط صفحه کلید وارد میکند. زمانیکه کاربر کلیدEnter را فشار دهد، کاراکترها توسط تابع cin.get() خوانده میشوند، یک کاراکتر در یک زمان. اگر کاراکتر وارد شده EOF نباشد، برنامه وارد عبارت switchمیشود (خط ۶۳-۹۹) که شمارنده امتیاز را متناسب با حرف وارد شده، یک واحد افزایش میدهد.
:: بازدید از این مطلب : 177
|
امتیاز مطلب : 0
|
تعداد امتیازدهندگان : 0
|
مجموع امتیاز : 0