آموزش C++ تمرینات for قسمت بیست سوم

مثالهای مطرح شده در این بخش، متدهای متنوعی از کاربرد متغیر کنترلی در یک عبارت for هستند. در هر مورد، سرآیند for نوشته شده است.
a) متغیر کنترلی که از ۱ تا ۱۰۰ با گام ۱ افزایش مییابد.
for ( int i = 1; i <= 100; i++)
بقیه اموزش در ادامه مطلب
آموزش C++ تمرینات for قسمت بیست سوم

مثالهای مطرح شده در این بخش، متدهای متنوعی از کاربرد متغیر کنترلی در یک عبارت for هستند. در هر مورد، سرآیند for نوشته شده است.
a) متغیر کنترلی که از ۱ تا ۱۰۰ با گام ۱ افزایش مییابد.
for ( int i = 1; i <= 100; i++)
b) متغیر کنترلی که از ۱۰۰ تا ۱ با گام -۱ افزایش مییابد (با کاهش ۱).
for ( int i = 100; i >= 1; i–)
c) متغیر کنترلی که از ۷ تا۷۷ ، با گام ۷ افزایش مییابد.
for ( int i = 7; i <= 77; i += 7)
d) متغیر کنترلی که از ۲۰ تا ۲ با گام -۲ افزایش مییابد.
for ( int i = 20; i >= 2; i -=2)
e) متغیر کنترلی، که توالی از مقادیر ۲۰، ۱۷، ۱۴، ۱۱، ۸، ۵ و ۲ به خود میگیرد.
for ( var j = 2; j <= 20; j += 3)
f) متغیر کنترلی که توالی از مقادیر ۰، ۱۱، ۲۲، ۳۳، ۴۴، ۵۵، ۶۶، ۷۷، ۸۸ و ۹۹ به خود میگیرد.
for ( var j = 99; j >= 20; j -=11)
برنامه: مجموع اعداد زوج از ۲ تا ۲۰
دو مثال بعدی برنامههای سادهای هستند که به توضیح عبارت for میپردازند. برنامه ۵-۵ از عبارت for برای بدست آوردن مجموع اعداد زوج ۱۰۰ تا ۲ استفاده میکند. در هر بار تکرار حلقه (خطوط ۱۲-۱۳) مقدار جاری متغیر کنترل number به متغیر total افزوده میشود.

شکل ۵-۵ | عبارت for بکار رفته برای محاسبه مجموع اعداد زوج.
به بدنه عبارت for در برنامه ۵-۵ توجه نمائید. در واقع میتوان این بدنه را با سمت راسترین بخش سرآیند for و با استفاده از کاما ادغام کرد، بصورت زیر:
for ( int number = 2; // initialization
number <= 20; // loop continuation condition
total += number, number += 2 ) // total and increment
;// empty body
برنامه:محاسبه سود
مثال بعدی در ارتباط با محاسبه یک مسئله ترکیبی با استفاده از عبارت forاست. صورت مسئله به شرح زیر است:
شخصی ۱۰۰۰٫۰۰ دلار در یک حساب پس انداز با سود ۵% سرمایهگذاری کرده است. با فرض اینکه کل سود نیز ذخیره میشود، مقدار پول موجود در حساب را در پایان هر سال در یک مدت ۱۰ ساله محاسبه و چاپ کنید. برای بدست آوردن این مقادیر، از فرمول زیر کمک بگیرید:
a = p(1 + r)n
در این فرمول
p میزان سرمایه اولیه
r نرخ سود
n تعداد سالها
a مقدار سرمایه در پایان سال nام است.
این مسئله مستلزم حلقهای است که دلالت بر انجام محاسبهای برای هر سال در مدت ده سال پول باقیمانده در حساب پسانداز است. این راه حل در برنامه شکل ۶-۵ آورده شده است.
عبارت for (خطوط ۲۸-۳۵) مبادرت به اجرای بدنه خود به میزان ۱۰ بار میکند. مقدار متغیر کنترلی از ۱ تا ۱۰ به میزان یک واحد در هر بار افزایش مییابد. زبان C++ حاوی عملگر توان نیست، از اینرو از تابع کتابخانهای استاندارد pow به همین منظور استفاده کردهایم (خط ۳۱). تابع pow(x,y) مبادرت به محاسبه مقدار x به توان y میکند. در این مثال، عبارت جبری (۱+r)n بصورت pow(1.0+rate,year) نوشته شده است، که متغیر rate نشاندهنده r و متغیر year نشاندهنده n است. تابع pow دو آرگومان از نوع double دریافت و یک مقدار double برگشت میدهد.
این برنامه بدون سرآیند فایل کامپایل نمیشود. تابع pow نیازمند دو آرگومان از نوع double است. دقت کنید که متغیر year از نوع صحیح است. سرآیند حاوی اطلاعاتی است که به کامپایلر میگوید تا مقدار year را بطور موقت تبدیل به نوع double کند، قبل از اینکه تابع فراخوانی شود. این اطلاعات در نمونه اولیه تابع pow وجود دارند. در فصل ششم با چندین تابع کتابخانه math آشنا خواهید شد.

شکل۶-۵ | عبارتforبرایمحاسبهسودسرمایهگذاری.
دقت به هنگام استفاده از نوعdoubleدر محاسبات مالی
دقت کنید که متغیرهای amount و principalو rate از نوع double هستند. به این دلیل از این نوع استفاده کردهایم که میخواهیم به بخشهای کسری رسیدگی کرده و به نوعی نیاز داریم که امکان انجام محاسبات دقیق در زمینه مسائل مالی را فراهم آوریم. متاسفانه این نوع میتواند مشکلساز شود. در این بخش با یک توضیح ساده شاهد خواهید بود که چگونه به هنگام استفاده از نوع floatیا doubleدر نمایشهای مالی میتوانیم دچار اشتباه شویم (فرض کنید از setprecision(2) برای مشخص کردن دو رقم دقت به هنگام چاپ استفاده کردهایم): دو مبلغ دلاری ذخیره شده در ماشین میتواند ۱۴٫۲۳۴ (که ۱۴٫۲۳ چاپ میشود) و ۱۸٫۶۷۳ (که ۱۸٫۶۷ چاپ خواهد شد) را تولید کند. زمانیکه این مبالغ با هم جمع شوند، مجموع داخلی ۳۲٫۹۰۷ تولید میشود که بصورت ۳۲٫۹۱ چاپ میگردد. از اینرو نتیجه چاپی به صورت زیر ظاهر خواهد شد.
۱۴٫۲۳
۱۸٫۶۷ +
۳۲٫۹۱
اما در صورتیکه خودمان این اعداد را با هم جمع کنیم مجموع ۳۲٫۹۰ را بدست خواهیم آورد. پس مشکلی در کار است.
کنترل کنندههای جریان برای قالببندی کردن خروجی عددی
عبارت خروجی در خط ۲۵ قبل از حلقه for و عبارت خروجی در خط ۳۴ در حلقه for ترکیب شدهاند تا مقادیر متغیرهای year و amount با قالببندی (فرمت) تصریح شده توسط کنترلکنندههای جریان پارامتری شده setprecision و setw و کنترلکننده استریم غیرپارامتری fixed چاپ شوند. کنترلکننده استریم setw(4) مشخص میکند که باید مقدار خروجی بعدی به طول فیلد مشخص شده یعنی ۴ به نمایش درآید، یعنی، cout مقدار را با حداقل ۴ موقعیت کاراکتری چاپ خواهد کرد. اگر مقداری که چاپ میشود، کمتر از ۴ کاراکتر طول داشته باشد، مقدار از سمت راست تراز میشود (بطور پیشفرض). اگر مقدار خروجی بیش از ۴ کاراکتر طول داشته باشد، طول فیلد گسترش مییابد تا به کل مقدار جا دهد. برای تاکید بر این نکته که مقادیر در خروجی باید از سمت چپ تراز شوند، کافیست از کنترلکننده استریم غیرپارامتری left استفاده شود (در سرآیند قرار دارد). ترازبندی از سمت راست را میتوان با استفاده از کنترلکننده استریم غیرپارامتری right بدست آورد.
قالببندیهای دیگر، در عبارات خروجی بر این نکته دلالت میکنند که متغیر amount بصورت یک مقدار با نقطه ثابت با یک نقطه دیسمال (تصریح شده در خط ۲۵ با کنترلکننده استریم fixed) تراز از سمت راست در فیلدی به میزان ۲۱ کاراکتر (تصریح شده در خط ۳۴ با setw(21)) و با دقت دو رقم در سمت راست نقطه دیسمال (تصریح شده در خط ۲۵ با کنترلکننده setprecision(2)) چاپ خواهد شد. کنترلکنندههای استریم fixed و setprecision را بر روی استریم خروجی (یعنی cout) و قبل از حلقه for اعمال کردهایم چرا که این تنظیمات قالببندی تا زمانیکه تغییر نیافتهاند ثابت باقی میمانند، به چنین تنظیماتی، تنظیمات چسبنده میگویند. از اینرو، نیازی ندارند در هر بار تکرار حلقه بکار گرفته شوند. با این همه، طول فیلد (میدان) مشخص شده با setw فقط بر مقدار بعدی در خروجی بکار گرفته میشود. در فصل پانزدهم در ارتباط با قابلیتهای قالبندی ورودی/خروجی زبان C++ صحبت خواهیم کرد.
به عبارت ۱٫۰ + rate که بصورت یک آرگومان در تابع pow و در بدنه عبارت for قرار دارد، توجه کنید. در واقع، این محاسبه همان نتیجه را در زمان هر تکرار حلقه تولید میکند، از اینرو تکرار بیموردی صورت گرفته و باید این عبارت یکبار و قبل از حلقه محاسبه شود.
:: بازدید از این مطلب : 144
|
امتیاز مطلب : 0
|
تعداد امتیازدهندگان : 0
|
مجموع امتیاز : 0