عبارت تکرار while
عبارت تکرار while ؛ یک عبارت تکرار به برنامهنویس امکان میدهد تا بر مبنای برقرار بودن یا نبودن مقداری در یک شرط، یک عمل را چندین بار و به تکرار انجام دهد. عبارت شبهکد زیر یک فرآیند تکرار شوند را در حین خرید نشان می دهد:
While there are more items on my shopping list
Purchase next item and cross it off my list
شرط “there are more items on my shopping list” ممکن است برقرار یا برقرار نباشد. اگر شرط برقرار باشد عمل “Purchase next item” و “Cross it off my list” به ترتیب اجرا خواهند شد. این عمل می تواند تا زمانی که شرط برقرار است انجام شود. عبارت موجود در ساختار تکرار while تشکیل دهنده بدنه while است. سرانجام، زمانیکه شرط برقرار نباشد، تکرار پایان یافته و اولین دستور قرار گرفته پس از عبارت تکرار به اجرا در می آید.
while
مثالی که در زیر آورده شده از عبارت while استفاده کرده و اولین توان ۳ بزرگتر از ۱۰۰ را پیدا می کند. در ابتدای کار متغیر product با ۳ مقدار دهی اولیه شده است:
int product = 3;
while (product <= 100)
product = product * 3;
هنگامی که برنامه وارد عبارت while می شود، مقدار متغیر product برابر ۳ است. متغیر product بصورت مکرر در ۳ ضرب می شود و مقادیر ۹، ۲۷، ۸۱ و ۲۴۳ بدست می آیند. زمانیکه مقدار product برابر ۲۴۳ شود، شرط product<=100 در عبارت while برقرار نخواهد شد. در چنین حالتی تکرار با مقدار ۲۴۳ برای product پایان می پذیرد. اجرای برنامه با عبارت بعد از while دنبال می شود. [نکته: اگر شرط یک عبارت while در همان ابتدا برقرار نباشد، عبارات قرار گرفته در بدنه عبارت تکرار اجرا نخواهند شد.]
دیاگرام فعالیت UML به نمایش درآمده در شکل ۶-۴ نشاندهنده روند کنترلی است که متناظر با عبارت while مطرح شده در قسمت فوق می باشد. مجدداً نمادهای موجود در این دیاگرام نشاندهنده یک وضعیت عمل و یک تصمیمگیری هستند. همچنین این دیاگرام مبادرت به معرفی نماد ادغام UML کرده است، که دو روند یا جریان فعالیت را به یک فعالیت متصل می کند. UML نماد ادغام و تصمیمگیری را بصورت لوزی نشان می دهد. در این دیاگرام، نماد ادغام مبادرت به پیوند انتقالها از وضعیت اولیه و از وضعیت عمل کرده است، از اینرو هر دو جریان وارد بخش تصمیم شدهاند که تعیین می کند آیا حلقه مجدداً باید تکرار شود یا خیر. می توان نمادهای تصمیم و ادغام را توسط تعداد فلشهای انتقال «واردشونده» و «خارجشونده» تشخیص داد. نماد تصمیم دارای یک فلش انتقال اشارهکننده به لوزی داشته و دارای دو یا چند فلش انتقال اشارهکننده به خارج از لوزی است که نشاندهنده انتقالات ممکنه از این نقطه هستند. علاوه بر این، هر فلش انتقال اشارهکننده به خارج از نماد تصمیم دارای یک نگهبان شرط در کنار خود است. در طرف دیگر، نماد ادغام قرار دارد که دارای دو یا چند فلش انتقال اشارهکننده به لوزی است و فقط یک فلش انتقال از آن خارج می شود و نشان می هد که چندین روند با یکدیگر برای انجام فعالیت ادغام شدهاند. توجه کنید، که برخلاف نماد تصمیم، نماد ادغام دارای یک رونوشت در کد C++ نیست.
دیاگرام شکل ۶-۴ بوضوح عملیات تکرار در عبارت while مطرح شده در ابتدای این بخش را نشان می دهد. فلش انتقال از وضعیت عمل به حالت ادغام اشاره می کند، که انتقال را به تصمیم باز می گرداند تا تستی دایر بر اینکه آیا حلقه دوباره باید صورت گیرد یا خیر انجام دهد، این حلقه زمانی شکسته می شود که شرط product>100 برقرار گردد. پس از خاتمه عملیات while، کنترل به عبارت بعدی در برنامه انتقال می یابد (در این مورد وضعیت پایانی).
می توانید دیاگرامهای فعالیت UML خالی عبارت تکرار while را تصور کنید که برنامهنویسان می توانند هر تعداد از آنها را به روش پشتهای یا تودرتو با سایر دیاگرامهای فعالیت عبارات کنترلی بکار گیرند تا بخشی از الگوریتم را پیادهسازی کنند.
شکل ۶-۴ | دیاگرام فعالیت UML عبارت تکرار while.
۸-۴ فرموله کردن الگوریتم: شمارنده-کنترل تکرار
برای اینکه با نحوه توسعه الگوریتمها آشنا شوید، مسئله بدست آوردن میانگین نمرات یک کلاس را با روشهای مختلف بررسی میکنیم. صورت مسئله عبارت است از:
از کلاسی با ده دانشآموز آزمونی بعمل آمده است. نمرات این آزمون در اختیار شما قرار دارد (نمرات در محدوده ۰ تا ۱۰۰ هستند). مجموع نمرات دانشآموزان و میانگین نمرات این کلاس را بدست آورید.
میانگین کلاس عبارت است از مجموع نمرات تقسیم بر تعداد دانشآموزان. الگوریتم بکار رفته بر روی کامپیوتر به منظور حل این مسئله بایستی تک تک نمرات را به عنوان ورودی دریافت کرده، محاسبه میانگین را انجام داده و نتیجه را به نمایش در آورد.
الگوریتم شبهکد با شمارنده-کنترل تکرار
اجازه دهید تا از شبهکد استفاده کرده و لیستی از فعالیتهای اجرائی تهیه و ترتیب اجرا را مشخص سازیم. از روش شمارنده-کنترل تکرار برای دریافت تک تک نمرات بعنوان ورودی استفاده میکنیم. در این تکنیک از متغیری بنام شمارنده (counter) برای تعیین تعداد دفعات مجموعهای از عبارات که اجرا خواهند شد، استفاده میشود. روش شمارنده-کنترل تکرار، روش تکرار تعریف شده نیز نامیده میشود چرا که تعداد تکرار قبل از اینکه حلقه آغاز شود، مشخص است. در این مثال، اجرای حلقه با رسیدن شمارنده به ۱۰ خاتمه می یابد. در این بخش به معرفی الگوریتم شبهکد (شکل ۷-۴) و نسخهای از کلاس GradeBook (شکلهای ۸-۴ و ۹-۴) میپردازیم که الگوریتم را توسط یک تابع عضو C++ پیادهسازی میکند. در بخش ۹-۴ با توسعه الگوریتمها با استفاده از شبهکد آشنا خواهید شد.
به نقش total و counter در الگوریتم شبهکد دقت کنید (شکل ۷-۴). در واقع total متغیری است که از آن برای محاسبه مجموع مقادیر استفاده می شود و counter متغیری است که نقش شمارنده بر عهده دارد، در این برنامه، شمارنده تعداد نمرات وارد شده توسط کاربر را ثبت میکند.
Set total to zero
Set grade counter to one
While grade counter is less than or equal to 10
Input the next grade
Add the grade to the total
Add one to the grade counter
Set the class average to the total divided by 10
Print the class average
شکل۷-۴ | الگوریتم شبهکد با استفاده از روش شمارنده-کنترل تکرار برای حل مسئله میانگین کلاس.
شکل۸-۴ | مسئله میانگین کلاس با استفاده از روش شمارنده-کنترل تکرار:سرآیند فایل GradeBook.
شکل۹-۴ | مسئله میانگین کلاس با استفاده از روش شمارنده–کنترل تکرار:کد منبع فایل GradeBook.
افزایش قابلیت اعتبارسنجی GradeBook
قبل از اینکه به بحث پیادهسازی الگوریتم میانگین کلاس بپردازیم، اجازه دهید به بهبود کارائی انجام گرفته بر روی کلاس GradeBook توجه کنیم. در برنامه ۱۶-۳، تابع setCourseName مبادرت به اعتبارسنجی نام دوره با تست طول نام دور میکرد، که باید کمتر یا برابر ۲۵ کاراکتر باشد (با استفاده از یک عبارت if). اگر شرط برقرار بود، نام دوره بکار گرفته میشد. سپس این کد با یک عبارت if دیگر دنبال میشد که مبادرت به تست طول نام دوره میکرد که آیا بزرگتر از ۲۵ کاراکتر است یا خیر. دقت کنید که شرط عبارت if دوم کاملاً متضاد شرط if اول است. اگر شرطی با true ارزیابی گردد، بایستی شرطهای دیگر با false ارزیابی شوند. پیادهسازی چنین وضعیتی توسط عبارت if..else بهتر خواهد بود، از اینرو کد خود را با جایگزین کردن دو عبارت if با یک عبارت if..else اصلاح کردهایم (خطوط ۲۱-۲۸ از برنامه شکل ۹-۴).
شکل۱۰-۴| برنامه میانگین کلاس با شمارنده-کنترل تکرار:ایجاد یک شی از کلاس GradeBook (شکل ۸-۴ و ۹-۴) و فراخوانی تابع عضو determineClassAverage.
پیادهسازی شمارنده-کنترل تکرار در کلاس GradeBook
کلاس GradeBook (شکل ۸-۴ و ۹-۴) حاوی یک سازنده (اعلان شده در خط ۱۱ از شکل ۸-۴ و تعریف شده در خطوط ۱۲-۱۵ از شکل ۹-۴) است که مبادرت به تخصیص مقداری به متغیر نمونه کلاس courseName میکند (اعلان شده در خط ۱۷ از شکل ۸-۴). در خطوط ۱۹-۲۹، ۳۲-۳۵ و ۳۸-۴۲ از شکل ۹-۴ توابع عضو setCourseName، getCourseName و displayMessage تعریف شدهاند. در خطوط ۴۵-۷۱ تابع عضو determineClassAverage تعریف شده است که پیاده سازی کننده الگوریتم میانگین کلاس توضیح داده شده در شبه کد شکل ۷-۴ است.
در خطوط ۴۷-۵۰ متغیرهای محلی total، gradeCounter، grade و average از نوع int اعلان شدهاند. در متغیر grade ورودی کاربر ذخیره می شود. توجه کنید که اعلانهای فوق در بدنه تابع عضو determineClassAverage قرار دارند.
در نسخههای کلاس GradeBook مطرح شده در این فصل، فرآیند خواندن و پردازش نمرات به روش سادهای در نظر گرفته شدهاند. محاسبه میانگین در تابع عضو determineClassAverage و با استفاده از متغیرهای محلی صورت می گیرد. در این بخش مبادرت به ذخیرهسازی نمرات دانشجویان نمی کنیم. در فصل هفتم، با تغییری که در کلاس GradeBook انجام می دهیم قادر به نگهداری نمرات در حافظه خواهیم بود که توسط ساختمان داده آرایه صورت می گیرد. در اینحالت به یک شی GradeBook اجازه داده میشود تا محاسبات مختلف را بر روی همان مجموعه از نمرات انجام دهد بدون اینکه کاربر مجبور به وارد کردن همان نمرات به دفعات باشد.
در خطوط ۵۳-۵۴ متغیر total با ۰ و gradeCounter با ۱ مقداردهی اولیه شدهاند.دقت کنید که متغیرهای totoal و gradeCounter قبل از اینکه در محاسبات بکار گرفته شوند، مقداردهی اولیه شدهاند. معمولاً متغیرهای شمارنده را با یک یا صفر و بر اساس نیاز مقداردهی اولیه میکنند. یک متغیر مقداردهی نشده حاوی یک مقدار اشغال (یا مقدار تعریف نشده) است، آخرین مقداری که در مکان حافظه رزرو شده برای متغیر از قبل وجود داشته است. در این برنامه متغیرهای grade و average که مقدار خود را از طرف ورودی کاربر و محاسبه میانگین بدست می آورند، نیازی به مقداردهی اولیه ندارند.
خط ۵۷ مشخص میکند که عبارت while تا زمانیکه مقدار gradeCounter کمتر یا معادل ۱۰ باشد، تکرار خواهد شد. تا زمانیکه شرط برقرار باشد، ساختار while عبارات قرار گرفته مابین براکتهای بدنه خود را تکرار خواهد کرد.
عبارت بکار رفته در خط ۵۹، جمله“Enter grade:” را بنمایش در می آورد. این خط معادل عبارت شبهکد “Prompt the user to enter the next grade.” هستند. خط ۶۰ مقدار وارد شده توسط کاربر را خوانده و آنرا در متغیر grade ذخیره می کند. این خط معادل شبهکد “Input the next grade.” است. بخاطر دارید که متغیر grade در ابتدای برنامه مقداردهی اولیه نشده است، به این دلیل که برنامه مقدار grade را از کاربر و در هر بار تکرار حلقه اخذ می کند. سپس، برنامه مقدار total را با مقدار جدید grade که توسط کاربر وارد شده به روز می کند (خط ۶۱). مقدار grade با مقدار قبلی total جمع شده و نتیجه به total تخصیص می یابد.
در خط ۶۲ متغیر gradeCounter یک واحد افزایش می یابد تا نشان دهد یک نمره مورد پردازش قرار گرفته است. اینکار تا زمانیکه شرط موجود در عبارت while برقرار نشود، ادامه می یابد. پس از اتمام حلقه، در خط ۶۶ نتیجه محاسبه میانگین به متغیر average تخصیص می یابد. خط ۶۹ پیغام “Total of all 10 grades is” و بدنبال آن مقدار متغیر total را بنمایش در می آورد. سپس در خط ۷۰ پیغامی حاوی رشته “Class average is” که بدنبال آن مقدار متغیر average آورده شده، به نمایش در می آید. تابع عضو determineClassAverage، کنترل را به تابع فراخوان برگشت می دهد (تابع main در شکل ۱۰-۴).
توصیف کلاس GradeBook
شکل ۱۰-۴ حاوی تابع main این برنامه است، که یک شی از کلاس GradeBook ایجاد و به توصیف قابلیتهای آن می پردازد. در خط ۹ از شکل۱۰-۴ یک شی جدید از GradeBook بنام myGradeBookGradeBook ارسال میشود (خطوط ۱۵-۱۲ از شکل ۹-۴). خط ۱۱ از شکل۱۰-۴ تابع عضو displayMessage را برای نمایش پیغام خوشآمدگویی به کاربر فراخوانی میکند. سپس خط ۱۲ تابع عضو determineClassAverage را فراخوانی میکند تا کاربر بتواند ۱۰ نمره را وارد کرده و سپس میانگین را محاسبه و چاپ میکند. تابع عضو، الگوریتم نشان داده شده در شبه کد شکل ۷-۴ را انجام میدهد. ایجاد می شود. رشته موجود در خط۹ به سازنده
نکاتی در ارتباط با تقسیم صحیح و قطع کردن
محاسبه میانگین توسط تابع عضو determineClassAverage صورت میگیرد که در واکنش به فراخوانی تابع در خط ۱۲ از شکل۱۰-۴ فعال شده و یک عدد صحیح تولید میکند. خروجی برنامه نشان میدهد که مجموع نمرات در اجرای نمونه برنامه ۸۴۶ است که به هنگام تقسیم بر ۱۰، باید ۸۴.۶ بدست آید، عددی با نقطه اعشار. با این همه، در نتیجه محاسبه total/10 عدد ۸۴ بدست آمده است (خط ۶۶ از شکل ۹-۴)، چرا که total و ۱۰ هر دو مقادیر عددی صحیح هستند. نتیجه تقسیم دو عدد صحیح یک عدد صحیح است که در آن بخش اعشاری بدست آمده از تقسیم حذف می گردد (قطع می شود). در بخش بعد با نحوه بدست آوردن نتایج اعشاری از محاسبات آشنا خواهید شد.
در برنامه شکل ۹-۴، اگر در خط ۶۶ از gradeCounter بجای ۱۰ در محاسبه استفاده شود، خروجی این برنامه مقدار اشتباه ۷۶ را نشان خواهد داد. دلیل اینکار در آخرین تکرار عبارت whilegradeCounter به مقدار ۱۱ در خط ۶۲ افزایش یافته است. نهفته است که
هیچ دیدگاهی نوشته نشده است.