در این نوشته به آموزش ساختار تکرار در سی پلاس پلاس میپردازم. بدیهی است که اگر شما قبل از شروع برنامهنویسی الگوریتم و فلوچارت را به خوبی یاد گرفته باشید یادگیری این قسمت از برنامه نویسی چندان سخت نیست. با این وجود در این آموزش سعی بر آن شده است که مستقل از الگوریتم و فلوچارت به آموزش ساختار تکرار بپردازیم.
با این سوال شروع میکنیم: چرا به ساختار تکرار نیاز داریم؟ گاهی اوقات در نوشتن یک برنامه، باید عملیاتی را به صورت تکراری انجام دهیم. به طور مثال برنامهای را در نظر بگیرید که صد عدد را از ورودی دریافت میکند و مجذور آن عدد را چاپ میکند. اگر بخواهید صد عدد را به روش معمول از ورودی بخوانید عملا کار غیرممکنی است. بنابراین باید ساختاری ایجاد کنیم که در آن یک قالب مشخص (مثلا در این مثال خواندن عدد و چاپ مجذور آن) صد بار تکرار شود. برای نوشتن ساختار تکرار در ++c میتوان از حلقه while یا for استفاده کرد. در ساختار تکرار باید به سه مورد توجه ویژه داشت: 1- مقداردهی اولیه به اندیسی که وظیفه شمارش تعداد دفعات تکرار دارد 2- شرط 3-آپدیت کردن اندیس.
در مثال زیر از حلقه while استفاده شده است و در ادامه حلقه for را توضیح خواهم داد:
مثال 1: برنامه ای بنویسید که صد عدد دریافت کند و توان دوم آنها را چاپ کند.
#include <iostream> #include <cmath> using namespace std; int main() { int i=1; int x; while (i<=100) { cin>>x; cout<<pow(x,2)<<endl; i=i+1; } return 0; }
توضیح کد:
در این برنامه متغیر i وظیفه کنترل تعداد دفعات تکرار دستورات حلقه while دارد. در خط 8 مقداردهی اولیه به اندیس صورت گرفته است. در خط 10 شرط ساختار تکرار مشخص شده است و تعبیر این خط این است: تا زمانیکه i کوچکتر از 100 است این دستورات را انجام بده. در خط 12 و 13 دستورات ساختار تکرار مشخص شده است و در خط 14 آپدیت کردن اندیس داریم.
نکته قابل ذکر دیگر این است که در خط 13 از تابع pow استفاده شده است. این تابع که به تابع توان شناخته میشود دو پارامتر ورودی دارد. مثلا (2,x)pow به معنی x به توان 2 است. برای اینکه بتوانید از تابع pow استفاده کنید باید فایل سرآیند cmath را به ابتدای برنامه (خط 2) اضافه کنید.
مثال 2: برنامهای بنویسید که که با دریافت n مجموع اعداد 1 تا n را چاپ کند.
#include <iostream> using namespace std; int main() { int n; cin>>n; int i=1; int sum=0; while (i<=n) { sum=sum+i; i=i+1; } Cout<<sum<<endl; return 0; }
توضیح کد:
در ساختار تکرار با استفاده از متغیر i همه اعداد 1 تا n تولید میشود. برای اینکه مجموع این اعداد را بتوانیم پیدا کنیم در هر مرحله از ساختار تکرار مقدار i را به sum اضافه میکنیم.
مثال 3- برنامهای بنویسید که مجموع اعداد طبیعی ضریب 7 کوچکتر از n (که n را از ورودی دریافت میکند) چاپ کند.
تفاوت این مثال با سوال قبل در این است که در مثال قبل همه اعداد بین 1 تا n را به sum اضافه میکردیم و در این مثال باید اعداد ضریب 7 کوچکتر از n به sum اضافه شود:
#include <iostream> using namespace std; int main() { int n; cin>>n; int sum=0; int i=7; while(i<=n) { sum=sum+i; i=i+7; } cout<<sum<<endl; return 0; }
مثال 4: برنامهای بنویسید که یک عدد دریافت کند و فاکتوریل آن را چاپ کند.
#include <iostream> using namespace std; int main() { int n; cin>>n; int fact=1; int i=1; while (i<=n) { fact = fact *i; i=i+1; } cout<< fact <<endl; return 0; }
این مثال هم مانند مثال 2 پیاده سازی شده است با این تفاوت که در مثال 2 حاصلجمع اعداد 1 تا n محاسبه میشود و در این مثال حاصلضرب اعداد 1 تا n.
مثال 5: برنامهای بنویسید که 100 عدد دریافت کند و بزرگترین آنها را چاپ کند.
#include <iostream> using namespace std; int main() { int max; int x; cin>>x; max = x; int i=2; while (i<=100) { cin>>x; if (x>max) { max=x; } i=i+1; } cout<<max; return 0; }
توضیح کد:
در این مثال ابتدا فرض میکنیم عدد اولی که کاربر وارد کرده است بزرگترین عدد است. بنابراین عدد اول را در متغیر max ذخیره میکنیم (خط 9) سپس از اعداد دوم به بعد یکی یکی اعداد را خوانده و با max مقایسه میکنیم. چنانچه بیشتر بود max را آپدیت میکنیم.
مثال 6: برنامهای بنویسید که بزرگترین و دومین بزرگترین عدد را بین 100 عددی که کاربر وارد میکند چاپ کند.
#include <iostream> using namespace std; int main() { int max1, max2; int x; cin>>x; max1=x; cin>>x; max2=x; if (max1<max2) { int t=max1; max1=max2; max2=t; } int i=3; while (i<=100) { cin>>x; if (x>max1) { max2=max1; max1=x; } else if (x>max2) { max2=x; } i=i+1; } cout<<max1 <<" " <<max2<<endl; return 0; }
توضیح کد:
در این کد به دو متغیر max1 و max2 نیاز داریم. برای مقدار دهی اولیه به این دو متغیر ابتدا دو عدد از ورودی دریافت میکنیم (خط 12) و با مقایسه آن دو max1 و max2 مقداردهی میکنیم. سپس از عدد سوم تا صدم تک تک اعداد را با max1 و max2 مقایسه میکنیم (خط 23 و 28) و متناسب با هر کدام از شرطها max2 و max1 آپدیت میشوند.
حلقه for
منطق حلقه for هم مانند while است. یعنی در نوشتن این ساختار باید سه نکته گفته شده دقت کرد: – مقداردهی اولیه به اندیسی که وظیفه شمارش تعداد دفعات تکرار دارد 2- شرط 3-آپدیت کردن اندیس. این سه قسمت را به صورت خلاصه به صورت زیر میتوان نوشت:
به دلیل سادگی در نوشتن معمولا برنامهنویسان از for به جای while استفاده میکنند. (اجباری در این کار نیست و شما میتوانید از while هر موقع که خواستید استفاده کنید.)
توضیحات تکمیلی حلقه for
قسمت 1 فقط یکبار قبل از اجرای حلقه اجرا میشود.
شرط قسمت 2 هر بار قبل از اجرای دستورات حلقه چک میشود، اگر مقدار آن false شود از حلقه خارج شده و اولین خط بعد از حلقه اجرا میشود و اگر مقدار آن true باشد دستورات داخل حلقه for اجرا میشود.
بعد از اجرای تمام دستورات حلقه قسمت 3 اجرا میشود و بعد از آن شرط قسمت 2 چک میشود.
مثال 7: برنامهای بنویسید که از ورودی عدد n را دریافت کند و nامین جمله دنباله فیبوناچی را چاپ کند.
دنباله فیبوناچی با یک و یک شروع میشود و از جمله سوم به بعد هر جمله برابر است با مجموع دو جمله قبل. در ادامه کد این برنامه نوشته شده است.
#include <iostream> using namespace std; int main(){ int a,b,c,i,n; a=1; b=1; cin>>n; for(i=3;i<=n;i++){ c=a+b; a=b; b=c; } cout<<c; }
توضیحات کد:
در این کد به سه متغیر a و b و c نیاز داریم. در واقع قرار است جمله قبلی (b) با جمله قبل تر (a) جمع شود و جمله فعلی (c) محاسبه شود. در خط 9 و 10 مقادیر a و b را با توجه به تعریف دنباله فیبوناچی با یک مقداردهی کردیم. و در ساختار for در هر مرحله مجموع a و b را در c ذخیره میکینیم (خط 14) در ادامه برای اینکه بتوانیم در دور بعدی c جدید را بسازیم باید مقادیر a و b را به روز رسانی کنیم (خط 15 و 16) به این صورت که مقدار جدید a برابر با مقدار b ومقدار جدید b برابر با مقدار c خواهد شد.
مثال 8– برنامه ای بنویسید که یک عدد از ورودی دریافت کند و تشخیص دهد که عدد اول است یا خیر.
عددی اول است که به جز خودش و یک بر عدد دیگری بخشپذیر نباشد. مثلا عدد 13 به این دلیل اول است که نه بر 2 بخشپذیر است، نه 3، نه 4 و … و نه 12. بنابراین x اول است اگر بر اعداد 2 تا x-1 بخشپذیر نباشد.
#include <iostream> using namespace std; int main(){ bool flag=true; int x,i; cin>>x; for(i=2;i<=x-1;i++) if(x%i==0){ flag = false; break; } if(flag==true) cout<<"x is prime"; else cout<<"x is not prime"; }
توضیحات کد:
در این مثال از متغیر flag استفاده شده است که از توع bool است. در متغیرهایی از جنس bool فقط میتوان مقدار true یا false ذخیره کرد. متغیر flag یک متغیر کاربردی در برنامه نویسی است. در این مثال flag را با true مقداردهی کردهایم و فرض کردیم عدد اول است. در ادامه کد به دنبال تایید یا رد این فرضیه هستیم. به همین دلیل همه اعداد 2 تا x-1 را بررسی میکنیم که آیا x بر آنها بخش پذیر است یا خیر. چنانچه عددی پیدا شد که x بر آن بخشپذیر باشد نتیجه میگیریم که عدد اول نیست و flag را برابر false قرار میدهیم.
نکته بعدی که در این مثال قابل ذکر است دستور break است. (خط 15) این دستور موجب خروج از داخلیترین حلقه تکرار میشود . مثلا اگر x=15 وارد شود به ازای i=3 مقدار شرط (خط 13) true میشود بنابراین مقدار flag تغییر میکند و با استفاده دستور break از حلقه for خارج میشویم. (یعنی مقدار i از سه بیشتر نمیشود و دستورات for دیگر اجرا نمیشود.)
دستور دیگری که در ساختار تکرار استفاده میشود و در مورد آن صحبتی نشده است دستور continue است. دستور continue موجب میشود مابقی دستورات بدنه اجرا نشوند و دور بعدی کد اجرا شود. مثلا در کد زیر وقتی که مقدار اندیس برابر 4 میشود دستور continue ادامه دستورات ساختار تکرار را اجرا نمیکند و وارد دور بعدی ساختار تکرار میشود. یعنی دستور ++i اجرا میشود، i برابر 5 میشود، شرط 8=>i چک میشود و اینبار به ازای i برابر 5 وارد ساختار تکرار میشود:
#include <iostream> int main() { int i; for (i=0; i<=8; i++) { if (i==4) continue; cout<<i; } return 0; }
در جلسه بعدی در مورد تابع صحبت میکنیم:
اگه دوست دارید به آموزش کامل سی پلاس پلاس دسترسی داشته باشید میتونید از لینک زیر این دوره رو دریافت کنید:
یوتیوب پلاس سی پلاس پلاس
در کانال یوتیوبم در قالب 5 ویدیو ساختار تکرار رو آموزش دادم، اگه دوست داری ویدیوها رو اونجا ببین. کانالم رو هم دنبال کن تا جدیدترین ویدیوهای من رو از دست ندی: