You are on page 1of 382

‫بسم هللا الّر حمن الّر حيم‬

‫مبانی کامپیوتر و برنامه سازی ‪c‬‬

‫دانشگاه صنعتی ارومیه‬


‫گروه مهندسی کامپیوتر و فناوری اطالعات‬

‫مدرس ‪ :‬دکتر رشیدی‬


‫منابع درسی‬
‫• کتاب درسی‬
‫– برنامه نویسی ‪ - C‬ابراهیم زاده قلزم‬
‫– برنامه نویسی ‪ – C‬جعفر نژاد قمی‬
‫• کتابهای کمک آموزشی‬
‫آموزش تایپ‬ ‫–‬
‫دریافت کتابهای آموزشی رایگان از ‪www.google.com‬‬ ‫–‬
‫کتابهای ‪ICDL‬‬ ‫–‬
‫کتابهای مهارت کامپیوتری‬ ‫–‬
‫سایتها و مجالت مرتبط با کامپیوتر‬ ‫–‬
‫عضویت در سایت های خبری‬ ‫–‬
‫عضویت در گروه های برنامه نویسی‬ ‫–‬
‫‪....‬‬ ‫–‬
‫‪Pr.rashidi@gmail.com‬‬ ‫‪3‬‬
‫بارم بندی نمرات‬
‫شرح‬ ‫نمره‬ ‫عنوان‬

‫‪10‬‬ ‫فعالیت کالسی‬

‫دو هفته یکبار(بدون اعالم قبلی)‬ ‫‪35‬‬ ‫کوئیز‬

‫هر ماه یک پروژه‬ ‫‪25‬‬ ‫پروژهای برنامه نویسی کالسی‬


‫یک جلسه در هفته‬ ‫‪20‬‬ ‫حل تمرین‬
‫بر اساس اعالم آموزش‬ ‫‪80‬‬ ‫پایان ترم‬

‫بعد از امتحان پایان ترم‬ ‫‪30‬‬ ‫پروژه برنامه نویسی پایان ترم‬

‫نمره ‪200‬‬ ‫جمع کل‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪4‬‬
‫فهرست مطالب‬

‫مفاهیم اولیه کامپیوتر و نقش آن در زندگی‬


‫اجزای اصلی کامپیوتر‬
‫سخت افزار ‪ /‬نرم افزار ‪ /‬هوش مصنوعی‪ /‬فناوری اطالعات‬
‫مفهوم الگوریتم و اصول طراحی آن‬
‫سیستم های عددی کامپیوتری‬
‫‪ C‬زبان برنامه نویسی‬
‫و استفاده از آن در ایجاد برنامه های کامپیوتری‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪5‬‬
‫مفاهیم اولیه کامپیوتر و نقش آن در زندگی‬

‫تاریخچه کامپیوتر‬ ‫•‬


‫هدف از پیدایش کامپیوتر‬ ‫•‬
‫انقالب کامپیوتر (دهه ‪ -)1990‬عصر کامپیوتر‬ ‫•‬
‫تاثیر کامپیوتر در زندگی روزمره‬ ‫•‬
‫اینترنت و ورود کامپیوتر به زندگی مردم‬ ‫•‬
‫کامپیوترهای قابل حمل‬ ‫•‬
‫گ‬ ‫د‬‫ن‬ ‫ز‬ ‫همراه‬ ‫های‬ ‫تلفن‬ ‫•‬
‫ن‬ ‫ب‬
‫دو‬‫ی‬
‫م‬ ‫ا‬‫ک‬
‫محال پیوتر‬
‫ه‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪6‬‬
‫اجزای اصلی کامپیوتر‬

Pr.rashidi@gmail.com 7
‫اجزای اصلی کامپیوتر‬

‫• واحدهای ورودی‬
‫– کیبورد ‪ ،‬ماووس ‪ ،‬قلم نوری ‪CD ، DVD، USB Drive ،‬‬
‫– ‪Ports‬‬
‫– ‪...‬‬
‫• واحدهای خروجی‬
‫– مانیتور ‪ ،‬چاپگر ‪ CD ، DVD ، USB ،‬و ‪...‬‬
‫– ‪....‬‬
‫• واحد پردازش مرکزی‬
‫• حافظه‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪8‬‬
‫سلسله مراتب حافظه کامپیوتری‬

‫• حافظه اصلی‬
‫– فقط خواندنی )‪ROM ( Read Only Memory‬‬
‫– خواندنی و نوشتنی )‪RAM (Random Access Memory‬‬
‫• حافظه جانبی‬
‫– دیسک سخت (‪)Hard Disk‬‬
‫– ‪Tape‬‬
‫– ‪ CD ، DVD‬و ‪....‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪9‬‬
‫تکالیف پیشنهادی‬

‫‪ .1‬در مورد انواع حافظه های‬


‫کامپیوتری تحقیق نماید‪.‬‬
‫‪ .2‬آنها را با هم مقایسه نماید‪.‬‬
‫قیمت‬ ‫‪‬‬
‫سرعت‬ ‫‪‬‬
‫کارایی‬ ‫‪‬‬
‫محل قرار گیری در کامپیوتر‬ ‫‪‬‬
‫‪...‬‬ ‫‪‬‬
‫‪ .3‬در مورد شکل مقابل و صفحه‬
‫بعد گزارش مناسبی برای‬
‫‪Pr.rashidi@gmail.com‬‬
‫‪ 10‬خودتان تهیه نماید‬
‫تکالیف پیشنهادی‬

Pr.rashidi@gmail.com 11
‫فهرست مطالب‬

‫مفاهیم اولیه کامپیوتر و نقش آن در زندگی‬


‫اجزای اصلی کامپیوتر‬
‫سخت افزار ‪ /‬نرم افزار ‪ /‬هوش مصنوعی‪ /‬فناوری اطالعات‬
‫مفهوم الگوریتم و اصول طراحی آن‬
‫سیستم های عددی کامپیوتری‬
‫زبان برنامه نویسی ‪ C‬و استفاده از آن در ایجاد برنامه های‬
‫کامپیوتری‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪12‬‬
‫سخت افزار ‪ /‬نرم افزار ‪ /‬هوش مصنوعی‪/‬فناوری اطالعات‬
‫• سخت افزار‬
‫– در دانش رایانه به قطعات و دستگاه‌های قابل لمس تشکیل دهنده رایانه سخت افزار‬
‫گفته می‌شود‬
‫• نرم افزار‬
‫– به بخش غیرقابل لمس مانند سیستم‌های عامل‪ ،‬برنامه‌های رایانه‌ای نرم‌افزار اطالق‬
‫می‌گردد‬
‫• هوش مصنوعی‬
‫– تلفیق نرم افزار با روشهای هوشمند (مبتنی بر هوش مصنوعی)‬
‫– هوش مصنوعی عبارت است از مطالعه این که چگونه کامپیوترها را می‌توان وادار‬
‫به کارهایی کرد که در حال حاضر انسان‌ها آنها را بهتر انجام می‌دهند‪.‬‬
‫• فناوری اطالعات و ارتباطات‬
‫– تعریف ‪ :‬انجمن فناوری اطالعات آمریکا ‪ :‬ب‪x‬ه مطالع‪x‬ه‪ ،‬ط‪x‬راحی‪ ،‬توس‪x‬عه‪ ،‬پیاده‌س‪x‬ازی‪،‬‬
‫پش‪x‬تیبانی ی‪x‬ا م‪x‬دیریت سیس‪x‬تم‌های اطالع‪x‬اتی مبت‪x‬نی ب‪x‬ر رایان‪x‬ه‪ ،‬خصوص‪x‬ا برنامه‌ه‪x‬ای‬
‫یپ‪x‬ردازد»‪ .‬ب‪x‬ه ط‪x‬ور کوت‪x‬اه‪ ،‬فن‪x‬اوری اطالع‪x‬ات ب‪x‬ا‬ ‫نرم‌اف‪x‬زاری و س‪x‬خت‌افزار رایان‪x‬ه م ‌‬
‫مس‪x‬ائلی مانن‪x‬د اس‪x‬تفاده از رایانه‌های الکترونیکی و نرم‌افزار س‪x‬روکار دارد ت‪x‬ا تبدیل‪،‬‬
‫ذخیره‪ ،‬حفاظت‪ ،‬پردازش‪ ،‬انتقال و بازیابی اطالعات ب‪x‬ه ش‪x‬کلی مطمئن و امن انج‪x‬ام‬
‫‪Pr.rashidi@gmail.com‬‬ ‫‪13‬‬
‫پذیرد‪.‬‬
‫سایت های مرتبط با سخت افزار‬

http://fa.wikipedia.org/wiki/‫ سخت_افزار‬- ‫ویکی پدیا‬ •


http://www.sakhtafzar.com/ ‫سخت افزار‬ •
http://www.shahrsakhtafzar.com/ ‫شهر سخت افزار‬ •
www.google.com : Google ‫موتور جستجوی‬ •

Pr.rashidi@gmail.com 14
‫سایت های مرتبط با نرم افزار‬

- ‫• مقاالت مفید‬
http://www.developercenter.ir/articles.htm
www.google.com : Google ‫• موتور جستجوی‬
http://www.sanaray.ir/ ‫• ثنارای‬

Pr.rashidi@gmail.com 15
‫سایت های مرتبط با فن آوری اطالعات‬

http://www.itiran.com/ •
http://www.iritn.com/ •
http://www.parsinic.com/ •
http://www.itrc.ac.ir/ •
http://www.iranscience.net/ •
http://www.shci.ir/ •

Pr.rashidi@gmail.com 16
‫تکالیف پیشنهادی‬

‫• در مورد رشته تخصصی خودتان تحقیق کنید‬


‫اینکه در دانشگاه چه چیزهای باید یاد بگیرید‪.‬‬ ‫–‬
‫چه مهارت های برای ادامه تحصیل الزم خواهید داشت‬ ‫–‬
‫چه مهارت های برای کار الزم خواهید داشت‬ ‫–‬
‫چه ایده های جدیدی می توانید برای پیشرفت تحصیلی و شخصی ارائه‬ ‫–‬
‫دهید ؟‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪17‬‬
‫فهرست مطالب‬

‫مفاهیم اولیه کامپیوتر و نقش آن در زندگی‬


‫اجزای اصلی کامپیوتر‬
‫سخت افزار ‪ /‬نرم افزار ‪ /‬هوش مصنوعی‪ /‬فناوری اطالعات‬
‫سیستم های عددی کامپیوتری‬
‫مفهوم الگوریتم و اصول طراحی آن‬
‫زبان برنامه نویسی ‪ C‬و استفاده از آن در ایجاد برنامه های‬
‫کامپیوتری‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪18‬‬
‫سیستم های عددی کامپیوتری‬

‫• اطالعات در قالب صفر و یک ذخیره می شود‬


‫‪ .1‬اطالعات باید به شکل صفر و یک درآیند‪.‬‬
‫‪ .2‬اطالعات بر اساس صفر و یک رد و بدل می شوند‪.‬‬
‫‪ .3‬عملیات بر اساس صفر و یک انجام می گیرد (عملیات ریاضی)‬

‫پس‪ ،‬نیاز به سیستم های عددی‬


‫داریم که بر اساس صفر و یک‬
‫کار کند‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪19‬‬
‫سیستم های عددی کامپیوتری‬
‫• ‪( Decimal‬دهدهی – مبنای ده)‬
‫– در این سیستم تمامی اعداد بر مبنای ده ( یعنی با استفاده از ارقام ‪,0,1‬‬
‫…‪ )9,‬تعریف می گردد‪.‬‬
‫• ‪( Binary‬دودویی – مبنای دو)‬
‫– در این سیستم تمامی اعداد بر مبنای دودویی (یعنی با استفاده از ارقام‬
‫‪ )0,1‬تعریف می گردد‪.‬‬
‫• ‪( Octal‬مبنای هشت)‬
‫– در این سیستم تمامی اعداد بر مبنای هشت (یعنی با استفاده از ارقام‬
‫‪ )7,…,0,1‬تعریف می گردد‪.‬‬
‫• ‪( Hexadecimal‬مبنای شانزده)‬
‫• در این سیستم تمامی اعداد بر مبنای شانزده ( یعنی با استفاده از‬
‫ارقام ‪ 9,…,0,1‬و ‪ )A,B,C,D,E,F‬تعریف می گردد‪.‬‬
‫‪Pr.rashidi@gmail.com‬‬ ‫‪20‬‬
‫مبنای‬ ‫مبنای‬ ‫مبنای‬ ‫مبنای ده‬
‫شانزده‬ ‫هشت‬ ‫دو‬ ‫مثال‬
‫‪0000‬‬ ‫‪000‬‬ ‫‪0‬‬ ‫‪0‬‬
‫• در مبنای دو هر عدد را با یک‬
‫‪0001‬‬ ‫‪001‬‬ ‫‪1‬‬ ‫‪1‬‬
‫‪0010‬‬ ‫‪010‬‬ ‫‪10‬‬ ‫‪2‬‬
‫رقم نمایش می دهند‪.‬‬
‫‪0011‬‬ ‫‪011‬‬ ‫‪11‬‬ ‫‪3‬‬ ‫• در مبنای هشت هر عدد را با‬
‫‪0100‬‬ ‫‪100‬‬ ‫‪100‬‬ ‫‪4‬‬ ‫سه رقم نمایش می دهند‪.‬‬
‫‪0101‬‬ ‫‪101‬‬ ‫‪101‬‬ ‫‪5‬‬
‫• در مبنای شانزده هر عدد را با‬
‫‪0110‬‬ ‫‪110‬‬ ‫‪110‬‬ ‫‪6‬‬
‫‪0111‬‬ ‫‪111‬‬ ‫‪111‬‬ ‫‪7‬‬
‫چهار رقم نمایش می دهند‪.‬‬
‫‪1000‬‬ ‫‪8‬‬
‫‪1001‬‬ ‫‪9‬‬
‫‪1010‬‬ ‫‪10‬‬
‫‪1011‬‬ ‫‪11‬‬
‫‪1100‬‬ ‫‪12‬‬
‫‪1101‬‬ ‫‪13‬‬
‫‪1110‬‬ ‫‪14‬‬
‫‪Pr.rashidi@gmail.com‬‬ ‫‪21‬‬
‫‪1111‬‬ ‫‪15‬‬
‫ریاضیات دودویی‬

‫جمع‬ ‫•‬
‫تفریق‬ ‫•‬
‫ضرب‬ ‫•‬
‫تقسیم‬ ‫•‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪22‬‬
‫جمع دودویی‬

‫جمع زدن دو عدد تک رقمی دودویی نسبتًا ساده است‪:‬‬


‫‪0 +0 = 0‬‬
‫‪1 + 0 =1‬‬
‫‪( 1 + 1 = 10‬رقم یک منتقل می شود)‬
‫هنگامی که نتیجه جمع از مقدار مبنا تجاوز می کند "عدد یک به سمت چپ منتقل" و به محل‬
‫بعدی اضافه می شود‪.‬‬
‫‪10110‬‬
‫‪+11101‬‬
‫‪-------------------‬‬
‫‪110011‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪23‬‬
‫تفریق دودویی‬

‫جمع زدن دو عدد تک رقمی دودویی نسبتًا ساده است‪:‬‬


‫‪0 -0 = 0‬‬
‫‪1 - 0 =1‬‬
‫‪(0 - 1 =1‬رقم قرض گرفته شده است)‬
‫‪1-1 =0‬‬
‫هنگامی که نتیجه جمع از مقدار مبنا تجاوز می کند "عدد یک به سمت چپ منتقل" و به محل‬
‫بعدی اضافه می شود‪.‬‬
‫‪1010110‬‬
‫‪-‬‬ ‫‪11101‬‬
‫‪-------------------‬‬
‫‪0 111 00 1‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪24‬‬
‫ضرب دودویی‬

‫دو ع‪x‬دد "‪ "A‬و "‪ "B‬را ب‪x‬ا ض‪x‬رب ج‪x‬زئی (‪ )partial‬می ت‪x‬وان در هم ض‪x‬رب ک‪x‬رد ب‪x‬رای ه‪x‬ر رقم‬
‫"‪ "B‬حاص‪x‬ل ض‪x‬رب آن را در ع‪x‬دد "‪ "A‬ب‪x‬ه دس‪x‬ت آورده و ب‪x‬ر روی خطی جدی‪x‬د زی‪x‬ر رقم‬
‫ضرب شده از "‪ "B‬بنویسید‪ .‬در آخر مجموع تمام ضرب های جرئی را محاسبه کنید‪.‬‬
‫‪)A( 1 1 0 1‬‬
‫* ‪)B( 0 1 0 1‬‬
‫‪-----------------‬‬
‫‪0000‬‬
‫‪1101‬‬
‫‪0000‬‬
‫‪1101‬‬
‫‪----------------------‬‬
‫‪0111011‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪25‬‬
‫تقسیم دودویی‬

‫تقسیم در مبنای دو نیز همانند تقسیم ده دهی است‪.‬‬


‫مثال ‪ :‬باقیمانده تقسیم ‪ 11011‬بر ‪ 101‬را بدست آورید‪.‬‬
‫مقسوم‬ ‫مقسوم علیه‬ ‫خارج قسمت‬
‫‪11011‬‬ ‫‪101‬‬ ‫‪1‬‬
‫‪101‬‬
‫‪-----‬‬
‫‪001‬‬
‫‪0011‬‬ ‫‪10‬‬
‫‪0000‬‬
‫‪00111‬‬ ‫‪101‬‬
‫‪101‬‬
‫‪--------‬‬
‫‪00010‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪26‬‬
‫مطالعه‬

‫• مبنای عددی و نحوه تبدیل آنها به یکدیگر‬


http://www.thealmightyguru.com/Pointless/Computer –
Numbers.html
‫• کاراکترها و چگونگی نمایش آنها با فرمت های عددی‬
http://www.thealmightyguru.com/Pointless/ASCII.htm –
l

Pr.rashidi@gmail.com 27
Pr.rashidi@gmail.com 28
‫کار در منزل(‪ - )3‬تحویل جلسه بعدی‬

‫• عملیات زیر را انجام دهید‪.‬‬


‫‪ .1‬اعداد زیر را در مبنای دودویی بنویسید‬
‫– ردیف ‪57 ،43 ،196 ،78 ،34 ، 123 ) 1‬‬
‫– ردیف ‪859 ،213 ،654 ،872 ) 2‬‬
‫‪ .2‬اعداد مبنای دو ردیف ‪ 1‬و ‪ 2‬را با هم جمع‪ ،‬تفریق و ضرب‬
‫نماید‬
‫‪ .3‬اعداد مبنای دو ردیف ‪ 2‬را بر ردیف ‪ 1‬تقسیم نماید‪.‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪29‬‬
‫فعالیت پیشنهادی‬

‫• بررسی نحوه ذخیره سازی اعداد اعشاری در کامپیوتر‬


‫• بررسی نحوه انجام محاسبات اعشاری‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪30‬‬
‫فهرست مطالب‬

‫مفاهیم اولیه کامپیوتر و نقش آن در زندگی‬


‫اجزای اصلی کامپیوتر‬
‫سخت افزار ‪ /‬نرم افزار ‪ /‬هوش مصنوعی‪ /‬فناوری اطالعات‬
‫سیستم های عددی کامپیوتری‬
‫مفهوم الگوریتم و اصول طراحی آن‬
‫زبان برنامه نویسی ‪ C‬و استفاده از آن در ایجاد برنامه های‬
‫کامپیوتری‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪31‬‬
‫مفهوم الگوریتم و اصول طراحی آن‬

‫مقدمه‬ ‫•‬
‫تعریف الگوریتم‬ ‫•‬
‫مراحل الگوریتم‬ ‫•‬
‫چند مثال‬ ‫•‬
‫کار در منزل‬ ‫•‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪32‬‬
‫مفهوم الگوریتم (مقدمه)‬

‫‪ ‬در زن\\دگي روزم\\ره‪ ،‬انس\\ان ب\\ا مس\\ائل مختلفي روبروس\\ت و‬


‫ب\راي ه\ر ك\دام از اين مس\ائل (ح\ل مش\كالت) راه حلي و روش\ي‬
‫ميگزين\\د‪ .‬مس\\ائلی از قبي\\ل راه رفتن‪ ،‬غ\\ذا خ\\وردن‪،‬‬
‫را ب\\ر ‌‬
‫خوابي\دن و غ\يره ك\ه بش\ر تقريب\ًا ه\ر روز آنه\ا را پيش روي‬
‫خود دارد‪.‬‬
‫‪ ‬الگوریتم تولید چای‬
‫‪ ‬هم\ه اين مس\ائل ني\از ب\ه روش\ي ب\راي ح\ل ك\ردن دارن\د مثال راه‬
‫رفتن بايد ب\ا ت\رتيب خاص\ي و مراح\ل معي\ني انج\ام ش\ود‪ .‬ت\ا‬
‫مسئله راه رفتن براي بشر حل شود‪.‬‬
‫‪ ‬اص\طالحًا روش انج\ام ك\ار يا ح\ل مس\ئله را الگ\وريتم آن مس\ئله‬
‫مينامند‬
‫‌‬
‫‪Pr.rashidi@gmail.com‬‬ ‫‪33‬‬
‫تعريف الگوريتم‬
‫الگوريتم مجموعه‌اي از دستورالعمل ها‪ ،‬براي حل‬
‫ميباشد كه شرايط زير را بايد دارا باشد‪:‬‬
‫مسئله ‌‬

‫• دقيق باشد‬
‫• جزئيات كامل حل مسئله را داشته باشد‪.‬‬
‫پايانپذير باشد‪.‬‬
‫‌‬ ‫•‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪34‬‬
‫مراحل الگوریتم‬
‫براي ح‪x‬ل يك مس‪x‬ئله بايد الگ‪x‬وريتم آن مس‪x‬ئله را مش‪x‬خص ك‪x‬نيم (يا‬
‫بيابيم)‪ .‬ك‪x‬ه اص‪x‬طالحًا ط‪x‬راحي الگ‪x‬وريتم ب‪x‬راي آن مس‪x‬ئله ناميده‬
‫ميش‪x‬ود‪ .‬در ط‪x‬راحي الگ‪x‬وريتم معم‪x‬وًال س‪x‬ه مرحل‪x‬ه زير را از‬ ‫‌‬
‫ميكنند‪:‬‬
‫هم جدا ‌‬

‫– خواندن داده‌ها‬
‫– انجام محاسبات‬
‫خروجيها‬
‫‌‬ ‫–‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪35‬‬
‫مثال ‪ :‬الگوريتمي بنويسيد كه دو عدد از ورودي‬
‫دريافت كرده مجموع‬
‫دو عدد را محاسبه و چاپ نمايد‪.‬‬
‫وروديها‬ ‫انجام محاسبات‬ ‫خروجي‌ها‬

‫‪a , b‬‬ ‫جمع دو عدد‬ ‫مجموع دو عدد‬

‫‪0‬ـ شروع‬
‫‪1‬ـ ‪ b ,a‬را بخوان‪.‬‬
‫‪2‬ـ مجموع ‪ b , a‬را محاسبه و در ‪ sum‬قرار بده‪.‬‬
‫‪3‬ـ ‪ sum‬را در خروجي چاپ كن‬
‫‪4‬ـ پايان‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪36‬‬
‫مثال‪ :‬الگوريتمي بنويسيد كه سه عدد از ورودي دريافت كرده‬
‫مجموع و ميانگين سه عدد را محاسبه و چاپ كند‪.‬‬

‫وروديها‬ ‫انجام محاسبات‬ ‫خروجيها‬


‫‌‬
‫‪a‬‬ ‫محاسبه مجموع‬ ‫چاپ مجموع‬
‫‪b‬‬ ‫محاسبه ميانگين‬ ‫چاپ ميانگين‬
‫‪c‬‬
‫‪0‬ـ شروع‬
‫‪1‬ـ سه عدد از ورودي بخوان‬
‫‪2‬ـ مجموع سه عدد را محاسبه و در ‪ sum‬قرار بده‪.‬‬
‫‪3‬ـ ‪ sum‬را بر سه تقسيم كرده‪،‬در ‪ ave‬قرار بده‪.‬‬
‫‪4‬ـ ‪ ave , sum‬را در خروجي چاپ كن‪.‬‬
‫‪5‬ـ پايان‪.‬‬
‫‪Pr.rashidi@gmail.com‬‬ ‫‪37‬‬
‫طراحی الگوریتم ‪ :‬لپ کالم‬

‫• موفقیت شما در رشته کامپیوتر ( بخصوص برنامه نویسی)‬


‫وابستگی بسیار زیادی به ارائه الگوریتم درست و دقیق دارد‪.‬‬

‫• در صورتی که توانایی ارائه الگوریتم (راه حل) درست‬


‫کامپیوتری برای مسائل را داشته باشید می توانید بسیاری از‬
‫مسائل را براحتی حل نموده و برای آن برنامه کامپیوتری ارائه‬
‫دهید‪.‬‬
‫‪ ، ....‬وای ‪ ،‬وای ‪ ،‬وای‬
‫• در غیر اینصورت‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪38‬‬
‫کار در منزل (‪ -)1‬تاریخ تحویل جلسه بعدی‬

‫الگ\وریتمی بنویس\ید ك\ه دو ع\دد از ورودي دريافت ك\رده س\پس‬ ‫‪.1‬‬


‫محتويات دو ع\دد را ب\ا هم جابج\ا ‌نمايد(ب\ا اس\تفاده از متغ\یر‬
‫کمکی – بدون استفاده از متغیر کمکی)‪.‬‬
‫الگ\وریتمی بنویس\ید ك\ه ط\ول و ع\رض مس\تطيل را از ورودي‬ ‫‪.2‬‬
‫دريافت ك\رده محي\ط و مس\احت آن\را محاس\به و چ\اپ كن\د(ب\رای‬
‫مربع و دایره نیز تکرار شود)‪.‬‬
‫الگ\\وریتمی بنویس\\ید ك\\ه ع\\ددي (درج\\ه ح\\رارت برحس\\ب‬ ‫‪.3‬‬
‫س\انتيگراد) را از ورودي دريافت ك\رده س\پس آن\را ب\ه درج\ه‬
‫فارنهايت تبديل كند‪.‬‬
‫الگ\وریتمی بنویس\ید ك\ه دو ع\دد ‪ N , M‬را از ورودي خوان\ده‪،‬‬ ‫‪.4‬‬
‫بزرگترين مقسوم‌عليه مشترك دو عدد را محاسبه و چاپ كند‬
‫‪Pr.rashidi@gmail.com‬‬ ‫‪39‬‬
‫کار در منزل(‪ - )2‬تاریخ تحویل هفته بعد همین جلسه‬

‫الگ\وریتمی بنویس\ید ك\ه ع\ددي از ورودي دريافت ك\رده مثبت‪،‬‬ ‫‪.1‬‬


‫منفي يا ص\فر ب\ودن ع\دد را تش\خيص داده‪ ،‬در خ\روجي ب\ا پيغ\ام‬
‫مناسب چاپ كند‪.‬‬
‫الگ\وریتمی بنویس\ید ك\ه ع\ددي را از ورودي دريافت ك\رده‪،‬‬ ‫‪.2‬‬
‫بخشپذيري آن بر ‪ 3‬و ‪ 5‬را بررسي نمايد‪.‬‬
‫الگ\وریتمی بنویس\ید ك\ه ع\ددي از ورودي دريافت ك\رده‪ ،‬كام\ل‬ ‫‪.3‬‬
‫ب\ودن آن\را بررس\ي نمايد‪( .‬ع\دد كام\ل‪ ،‬ع\ددي اس\ت ك\ه مجم\وع‬
‫مقسومعليه‌هاي آن با خودش برابر باشد‪).‬‬
‫‌‬
‫الگ\وریتمی بنویس\ید ك\ه ‪ N‬را از ورودي دريافت ك\رده‪N ،‬‬ ‫‪.4‬‬
‫جمله سري فيبوناچي را توليد نماید‪.‬‬
‫‪Pr.rashidi@gmail.com‬‬ ‫‪40‬‬
‫معموال درك يك الگوريتم با شكل راحتر از نوشتن آن بصورت متن‬
‫ميدهند) ‪‌ ( flowchart‬‬
‫ميباشد‪ .‬لذا الگوريتم را با فلوچارت‬ ‫‪.‬نمايش ‌‬
‫‪.‬فلوچارت از شكل‌هاي زير تشكيل ‌‬
‫ميشود‬
‫ميكنند ‪‬‬
‫عالمتهاي شروع و پايان‪ :‬كه معموال از يك بيضي استفاده ‌‬
‫‌‬ ‫‪:‬‬

‫‪Begin‬‬ ‫‪End‬‬

‫ميشود ‪‬‬
‫‪:‬عالمتهاي ورودي و خروجي‪ :‬كه معموال از متوازي‌االضالع استفاده ‌‬

‫خواندن یا‬ ‫چاپ کردن‬


‫‪Read‬‬ ‫‪write‬‬
‫‪Pr.rashidi@gmail.com‬‬ ‫‪41‬‬
‫عالمتهاي محاسباتي و جايگزيني‪ :‬براي نمايش دستورات جايگزيني ‪‬‬
‫‪:‬و محاسباتي از مستطيل استفاده مي‌كنند‬

‫جایگزین یا‬
‫محاسبات‬

‫‪.‬عالمت شرط‪ :‬براي نمايش شرط از لوزي استفاده ‌‬


‫ميشود‬

‫عالمت اتصال‪ :‬براي اتصال شكل‌هاي مختلف بهم از فلش‌هاي‬


‫جهتدار استفاده ‌‬
‫ميكنند‬ ‫‪‌ .‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪42‬‬
Begin
‫فلوچارت مجموع سه عدد‬

Read(a,b,c)

Sum a+b+c

Ave sum/3

Write(sum,ave)

End

Pr.rashidi@gmail.com 43
‫مثال‪ :‬فلوچارتی رسم نمائيد كه دو عدد از ورودي دريافت كرده سپس‬
‫‪.‬محتويات دو عدد را با هم جابجا‌نمايد‬

‫‪،‬را دو متغير كه در آنها دو عدد خوانده شده ‪ b , a‬براي حل اين مسئله‬


‫ميگيرند در نظر ‌‬
‫ميگيريم‪ .‬سپس با استفاده از يك متغير كمكي‬ ‫قرار ‌‬
‫‪ :‬محتويات اين دو عدد را جابجا ‌‬
‫ميكنيم‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪44‬‬
a temp b a b
12 15 12 15
temp

12
temp

a b a b
15 15 15 12

12 12
temp temp

Pr.rashidi@gmail.com 45
‫فلوچارت مسئله باال بصورت زير خواهد بود‬:
Begin

Read(a,b)

temp a

a b

b temp

Write(a,b)

End Pr.rashidi@gmail.com 46
‫تمرين ‪‬‬

‫ـ فلوچارتي رسم نمائيد كه طول و عرض مستطيل را از ورودي ‪1‬‬


‫‪.‬دريافت كرده محيط و مساحت آنرا محاسبه و چاپ كند‬

‫‪،‬ـ فلوچارتي رسم نمائيد كه شعاع دايره‌اي را از ورودي دريافت كرده‪2‬‬


‫‪.‬محيط و مساحت آنرا محاسبه و چاپ نمايد‬

‫‪3‬ـ فلوچارتي رسم كنيد كه سه عدد ‪ Third , second, first‬را‬


‫از ورودي دريافت كرده‪ ،‬محتويات آنها را جابجا نموده‪ ،‬حاصل‬
‫را در خروجي چاپ كند‪.‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪47‬‬
‫‪4‬ـ فلوچارتي رسم نمائيد كه دو عدد از ورودي دريافت كرده‪ ،‬سپس‬
‫محتويات دو عدد را بدون استفاده از متغير كمكي جابجا كند‪.‬‬
‫‪5‬ـ فلوچارتي رسم نمائيد كه عددي (درجه حرارت برحسب سانتيگراد)‬
‫را از ورودي دريافت كرده سپس آنرا به درجه فارنهايت تبديل كند‪.‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪48‬‬
‫دستورالعملهاي شرطي‬
‫‌‬ ‫‪‬‬
‫در حل بسياري از مسائل يا تقريبًا تمام مسائل نياز به استفاده از شروط جزء‪،‬‬
‫ميشود‪ .‬همانطور كه ما خودمان در زندگي روزمره‬ ‫نيازهاي اساسي محسوب ‌‬
‫‌‬
‫شرطها سركار داريم‪ .‬بطور مثال اگر هوا ابري باشد ممكن است چنين‬ ‫با اين‬
‫سخن بگوييم‪:‬‬

‫اگر جاده یخ بندان باشد انگاه زنجیر چرخ باید بسته شود‬
‫‪.‬در غير اينصورت نیازی نیست‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪49‬‬
‫‪:‬در حالت كلي شرط را بصورت زير نمايش مي‌دهند‬

‫شرط یا شروط ‪If‬‬ ‫عمل يا اعمال‬ ‫‪yes‬‬


‫‪then‬‬

‫‪NO‬‬
‫عمل يا اعمال بعدي‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪50‬‬
‫رد يا زوج‬x‫ ف‬،‫رده‬x‫ددي را از ورودي دريافت ك‬x‫ه ع‬x‫م نمائيد ك‬x‫ارتي رس‬x‫ فلوچ‬: ‫مث\ال‬
.‫بودن آن را تشخيص دهد‬
Begin

Read(a)

R a mod 2

yes
if R=0 then Write(‘even’)

No

Write(‘odd’)

End Pr.rashidi@gmail.com 51
‫مثال ‪ :‬فلوچارتي رسم كنيد كه دو عدد از ورودي دريافت كرده بزرگترين عدد‬
‫‪.‬را پيدا كرده در خروجي چاپ نمايد‬
‫‪Begi‬‬
‫‪n‬‬

‫)‪Read(a,b‬‬

‫‪max‬‬ ‫‪a‬‬

‫‪yes‬‬
‫‪if b>max‬‬ ‫‪max‬‬ ‫‪b‬‬

‫‪No‬‬

‫)‪Write(max‬‬

‫‪End‬‬ ‫‪Pr.rashidi@gmail.com‬‬ ‫‪52‬‬


Begi
n ‫ فلوچارتي رسم نمائيد كه سه عدد از ورودي‬: ‫مثال‬
‫ كوچكترين عدد را يافته‬،‫دريافت كرده‬
Read(a,b,c)
‫در خروجي چاپ نمايد‬:
min a

yes
if b<min then min b

No
yes
if c<min then min c

No

Write(min)

End Pr.rashidi@gmail.com 53
‫‪:‬نمونه اجراي فلوچارت باال بصورت زير ‌‬
‫ميباشد‬

‫خروج‬ ‫‪a‬‬ ‫‪b‬‬ ‫‪c‬‬ ‫‪Min‬‬

‫‪11‬‬ ‫‪17‬‬ ‫‪11‬‬ ‫‪12‬‬ ‫‪1‬‬


‫‪12‬‬ ‫‪2‬‬
‫‪11‬‬ ‫‪3‬‬
‫‪11‬‬ ‫‪4‬‬
‫‪11‬‬ ‫‪5‬‬
‫تمرين ‪‬‬

‫‪ -1‬فلوچارتي رسم كنيد که عددي را از ورودي دريافت كرده‪ ،‬قدر‬


‫مطلق عدد را در خروجي چاپ كند‪.‬‬

‫‪ -2‬فلوچارتي رسم نمائيد كه عددي از ورودي دريافت كرده مثبت‪،‬‬


‫منفي يا صفر بودن عدد را تشخيص داده‪ ،‬در خروجي با پيغام مناسب‬
‫چاپ كند‪.‬‬
‫فلوچارتي رسم نمائيد كه عددي را از ورودي دريافت كرده‪3- ،‬‬
‫‪.‬بخشپذيري آن بر ‪ 3‬و ‪ 5‬را بررسي نمايد‬
‫‪4‬ـ فلوچ\ارتي رس\م نمائي\د ك\ه ض\رايب يك معادل\ه درج\ه دوم را از‬
‫ورودي دريافت ك\رده‪ ،‬ريش\ه‌هاي آن را محاس\به در خ\روجي چ\اپ‬
‫‪Pr.rashidi@gmail.com‬‬
‫‪55‬كند‪.‬‬
‫حلقهها ‪‬‬
‫‌‬
‫در حل بسياري از مسائل با عملياتي روبرو ‌‬
‫ميشويم ‪ ،‬كه نياز به تكرار‬

‫دارند و عمل تكرار آنها به تعداد مشخصي انجام ‌‬


‫ميگيرد‪ .‬فرض كنيد‪،‬‬

‫بخواهيم ميانگين ‪ 100‬عدد را محاسبه كنيم‪ ،‬در اينصورت منطقي بنظر‬

‫‌‬
‫نميرسد كه ‪ 100‬متغير مختلف را از ورودي دريافت كنيم سپس آنها را‬

‫جمع كنيم‪.‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪56‬‬
‫انواع حلقه ها‬

‫حلقه های با تکرار مشخص‬

‫حلقه های با تکرار نا مشخص‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪57‬‬
‫حلقه های با تکرار مشخص‬
‫حلقهها تعداد تكرار مشخص ‌‬
‫ميباشد اين حلقه از اجزاء زير‬ ‫در اين نوع ‌‬
‫‪:‬تشكيل ‌‬
‫ميشود‬

‫ـ انديس حلقه‪1‬‬
‫ـ مقدار اوليه براي انديس حلقه‪2‬‬
‫مقدار افزاينده براي انديس حلقه (معموال يك واحد در هر مرحله) ‪3-‬‬
‫ـ مقدار نهايي (تعداد تكرا حلقه)‪4‬‬
‫ـ شرطي براي كنترل تعداد تكرار حلقه‪5‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪58‬‬
‫حلقهها را غالبًا با فلوچارت بصورت زير نمايش مي‌دهند‪:‬‬
‫‌‬ ‫اين‬

‫‪i‬‬ ‫‪1‬‬

‫‪No‬‬
‫‪if i<n‬‬ ‫اتمام كار حلقه‬

‫‪yes‬‬

‫مجموعه دستورات حلقه‬

‫‪i‬‬ ‫‪i+1‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪59‬‬
‫مثال ‪ :‬فلوچارتي رسم نمائيد كه عدد ‪ n‬را از ورودي دريافت كرده‪،‬‬
‫مجموع اعداد از يك تا ‪ n‬را محاسبه كند‪.‬‬

‫‪n‬‬ ‫مقدار نهايي‬

‫‪i‬‬ ‫انديس حلقه‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪60‬‬
Begi
n

Read(n)

I 1
sum 0

if I<=n No
Write(sum)

yes
‫حلقه‬
End
sum sum+I

I I+1
Pr.rashidi@gmail.com 61
‫‪:‬نمونه اجراي فلوچارت باال بصورت زير است‬

‫خروجي‬ ‫‪N‬‬ ‫‪I‬‬ ‫‪sum‬‬

‫‪15‬‬ ‫‪0‬‬ ‫‪1‬‬ ‫‪5‬‬ ‫‪1‬‬


‫‪1‬‬ ‫‪2‬‬ ‫‪2‬‬
‫‪3‬‬ ‫‪3‬‬ ‫‪3‬‬
‫‪6‬‬ ‫‪4‬‬ ‫‪4‬‬
‫‪10‬‬ ‫‪5‬‬ ‫‪5‬‬
‫‪15‬‬ ‫‪6‬‬ ‫‪6‬‬
‫‪7‬‬
‫مثال ‪ :‬فلوچارتي رسم كنيد كه ‪ n‬عدد از ورودي دريافت كرده‪،‬‬
‫بزرگترين مقدار از بين ‪ n‬عدد را پيدا كرده در خروجي چاپ نمايد‪.‬‬

‫انديس حلقه‬ ‫‪i‬‬

‫مقدار نهايي‬ ‫‪n‬‬

‫بزرگ\ترين مق\دار‬
‫‪Max‬‬
‫‪Pr.rashidi@gmail.com‬‬ ‫‪63‬‬
Begin

Read(n,a)

I 2
max a

No
if i<=n then write(max)

yes
End
‫حلقه‬ Read(a)

yes
if a > max max a

No
i i+1Pr.rashidi@gmail.com 64
‫مثال ‪ :‬فلوچارتي رسم نمائيد كه ‪ ، n , x‬دو عدد صحيح مثبت را از‬
‫ورودي دريافت كرده سپس ‪ x‬به توان ‪ n‬را محاسبه كند‪.‬‬

‫انديس حلقه‬ ‫‪i‬‬


‫مقدار نهايي‬ ‫‪n‬‬
‫‪ n‬عدد به توان‬ ‫‪pow‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪65‬‬
Begi
n

Read(n,x)

i 1
pow 1

if i<=n then No
write(pow)

yes
End
‫حلقه‬ pow pow*x

i i+1
Pr.rashidi@gmail.com 66
‫حلقههايي كه تعداد تكرار آنها مشخص نيست‬
‫‌‬ ‫‪‬‬
‫(در ریانهای برنامه نویسی به حلقه ‪ while‬مشهورند‪).‬‬

‫ميشود‪ .‬و دقيقًا‬


‫حلقهها با توجه به ورودي‪ ،‬تعداد تكرار مشخص ‌‬
‫در اين ‌‬

‫‌‬
‫نميتوان تعداد تكرار حلقه را بدون ورودي معين كرد‪ .‬اين حلقه ها فقط‬

‫شامل شرطي هستند كه تا زمانيكه برقرار باشد حلقه اجرا ‌‬


‫ميشود‪.‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪67‬‬
‫ميشوند‬
‫‪:‬در حالت كلي اين نوع حلقه‌ها بصورت زير نمايش داده ‌‬

‫‪No‬‬
‫شرط يا شروط ‪If‬‬

‫‪yes‬‬

‫محموعه دستورالعملها‬
‫و جاگزينها‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪68‬‬
‫مثال‪ :‬فلوچارتي رسم كنيد كه عددي را از ورودي دريافت كرده سپس تعداد ارقام آن‬
‫را شمرده در خروجي چاپ نمايد‪.‬‬

‫عدد خوانده شده‬ ‫‪N‬‬

‫تعداد ارقام‬ ‫‪count‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪69‬‬
Begi
n

count 0

Read(N)

if N>0 then No
write(count)

yes
End
N N div 10
‫حلقه‬

count count+1
Pr.rashidi@gmail.com 70
‫مثال ‪ :‬فلوچارتي رسم نمائيد كه عددي از ورودي دريافت كرده‪ ،‬سري‬
‫فيبوناچي قبل از آنرا توليد نمايد‪.‬‬

‫‪fk=fk-1+fk-2‬‬ ‫‪:‬در حالت كلي جمالت سري بصورت‬

‫‪N‬‬ ‫عدد خوانده شده‬


‫‪f1‬‬ ‫جمله اول سري‬
‫‪f2‬‬ ‫جمله دوم سري‬

‫‪f3‬‬ ‫جمله سوم سري‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪71‬‬
Begi
n
f1 0
f2 1

Read(N)
f3 f1+f2
I =4

No
if i<=N then write(f3)
yes

f1 f2
‫حلقه‬
f2 f3
End
f3 f1+f2

i i+1 Pr.rashidi@gmail.com 72
‫‪ ‬تمرين(جواب با تست)‬

‫‪ - 1‬فلوچارتي رسم نمائيد كه عددي از ورودي دريافت كرده‪ ،‬كامل‬


‫بودن آنرا بررسي نمايد‪( .‬عدد كامل‪ ،‬عددي است كه مجموع‬
‫مقسوم ‌‬
‫عليههاي آن با خودش برابر باشد‪).‬‬ ‫‌‬

‫‪ -2‬فلوچارتي رسم كنيد كه ‪ N‬را از ورودي دريافت كرده‪ N ،‬جمله سري‬


‫فيبوناچي را توليد نماید‪.‬‬

‫‪3‬ـ فلوچارتي رسم نمائيد كه دو عدد ‪ N , M‬را از ورودي خوانده‪،‬‬


‫بزرگترين مقسوم‌عليه مشترك دو عدد را محاسبه و چاپ كند‪.‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪73‬‬
‫حلقههاي تودرتو ‪‬‬
‫‌‬

‫‪.‬الگوريتم‌هايي كه تا حال بكار برديم‪ ،‬فقط شامل يك حلقه بودند‬


‫در صورتي كه در بسياري از مسائل ممكن است نياز به استفاده از چند‬
‫حلقه در داخل هم باشيم‪ .‬در اين نوع ‌‬
‫حلقهها بايد دقت بيشتري به خرج‬
‫دهيم‪ ،‬تا مشكلي پيش نيايد‪ .‬اگر از ‌‬
‫حلقههاي نوع اول بصورت تودرتو‬
‫استفاده كنيم در اينصورت براي هر حلقه شرط نهايي و انديس اوليه‬
‫‪ .‬جداگانه بايد تعريف كنيم‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪74‬‬
‫در حلقه‌هاي تودرتو به ازاي يكبار تكرار حلقه اوليه‪ ،‬حلقه داخلي به‬
‫ميشود‪ .‬در كل اگر حلقه اوليه ‪ n‬بار‬
‫اندازه مقدار نهايي خود تكرار ‌‬
‫تكرار شود و حلقه داخلي ‪ m‬بار‪ ،‬در اينصورت كل حلقه ‪:‬‬

‫‪nm‬‬
‫‪.‬بار تكرار خواهد شد‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪75‬‬
‫حلقههاي تودرتو را ‌‬
‫ميتوان بصورت زير نشان داد‪:‬‬ ‫فلوچارت ‌‬
‫‪i‬‬ ‫‪1‬‬

‫‪.‬‬
‫‪.‬‬
‫‪A‬‬ ‫‪.‬‬

‫‪if i<=n then‬‬ ‫‪No‬‬ ‫اتمام كار حلقه هاي تو در تو‬


‫‪yes‬‬
‫‪j‬‬ ‫‪1‬‬

‫‪if j<=m then‬‬ ‫‪No‬‬ ‫مجموعه دستورات و‬


‫جايگزيني ها‬
‫حلقه‬ ‫‪yes‬‬
‫مجموعه دستورات و‬ ‫‪i‬‬ ‫‪i+1‬‬
‫جايگزيني ها‬

‫‪A‬‬
‫‪j‬‬ ‫‪j+1‬‬
‫‪Pr.rashidi@gmail.com‬‬ ‫‪76‬‬
‫مثال ‪ :‬فلوچارتي رسم نمائيد كه ‪ N‬را از ورودي دريافت كرده‪ ،‬مجموع‬
‫سري زير را محاسبه نمايد‪:‬‬

‫‪S  1‬‬ ‫‪2‬‬


‫!‪2‬‬ ‫‪‬‬ ‫‪3‬‬
‫!‪3‬‬ ‫‪ .... ‬‬ ‫‪N‬‬
‫!‪N‬‬

‫انديس حلقه اول‬ ‫‪I‬‬


‫‪ N‬ورودي‬ ‫‌‬
‫محاسبه فاكتوريل‬ ‫‪fact‬‬
‫انديس حلقه داخلي‬ ‫‪j‬‬
‫‪ Sum‬مجموع‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪77‬‬
i 2
sum 1

Read(N)
A
if i<=N No Write(sum)

yes End

fact 1
j 2

sum sum+i/fact
if j<=i No

yes
i i+1
fact fact*j

A
j j+1 Pr.rashidi@gmail.com 78
‫‪ ‬تمرينات‬
‫‪ -1‬فلوچارتي رسم نمائيد كه ‪ N‬عدد از ورودي دريافت كرده تعداد‬
‫اعداد اول و كامل کوچکتر از ‪ N‬را شمرده در خروجي چاپ نمايد‪.‬‬

‫‪ -2‬فلوچارتي رسم نمائيد كه ‪ N , X‬را از ورودي خوانده مقدار سري‬


‫زير را محاسبه كند‪:‬‬

‫‪x 2‬‬
‫‪S  1‬‬ ‫!‪2‬‬ ‫‪‬‬ ‫‪x4‬‬
‫!‪4‬‬
‫‪ .... ‬‬ ‫‪xn‬‬
‫!‪N‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪79‬‬
‫‪ -3‬فلوچارتي رسم نمائيد كه عددی را از ورودي دريافت كرده مقلوب‬
‫عدد را محاسبه و در خروجي چاپ كند‪.‬‬
‫‪4‬ـ فلوچارتي رسم كنيد كه تاريخ تولد شخصي را از ورودي خوانده‪،‬‬
‫سن شخص را با تاريخ روز‪ ،‬محاسبه نموده در خروجي چاپ كند‪.‬‬

‫‪ -5‬فلوچارتي رسم نمائيد كه (‪ N ,M )m>n‬را از ورودي دريافت‬


‫كرده سري فيبوناچي بين ‪ N ,M‬را توليد كرده‪ ،‬در خروجي چاپ كند‪.‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪80‬‬
‫برنامه نویسی ‪C‬‬

‫مقدمه ‪ :‬چرا برنامه نویسی‬


‫‪ C‬فصل اول ‪ :‬مقدمات زبان‬
‫فصل دوم ‪ :‬ساختار های تصمیم گیری و تکرار‬
‫فصل سوم ‪ :‬سایر ساختار های تکرار‬
‫فصل چهارم ‪ :‬اعداد تصادفی‬
‫فصل پنجم ‪ :‬آرایه ها‬
‫فصل ششم ‪ :‬توابع‬
‫فصل هفتم ‪ :‬ساختارها و اشاره گرها‬
‫فصل هشتم ‪ :‬برنامه نویسی شی گرا‬
‫‪Pr.rashidi@gmail.com‬‬ ‫‪81‬‬
‫مقدمه‬

‫چرا برنامه نویسی‬


‫چرا برنامه نویسی‬

‫زبان برنامه نویسی عامل اصلی پیشرفت سیستم های کامپیوتری است‪.‬‬ ‫‪‬‬
‫مقدمه ای بر تمام درس های آتی می باشد‪.‬‬ ‫‪‬‬
‫بازار ک‪x‬ار عم‪x‬ده ش‪x‬ما ب‪x‬ر اس‪x‬اس م‪x‬یزان تس‪x‬لط ش‪x‬ما ب‪x‬ر اس‪x‬اس زبانه‪x‬ای برنام‪x‬ه نویس‪x‬ی می‬ ‫‪‬‬
‫باشد‪.‬‬
‫ادامه تحصیل در دوره های باالتر مستلزم داشتن پایه قوی در برنامه نویسی می باشد‪.‬‬ ‫‪‬‬
‫با داشتن پایه قوی در برنامه نویسی صاحب اختیار خویش باشید‪.‬‬ ‫‪‬‬

‫‪ :‬مهم ترین هدف‬


‫حل مسائل توسط کامپیوتر‬
‫هدف از درس‬

‫الگوریتمی برای حل مسئله ارائه دهید‪.‬‬ ‫‪‬‬


‫اهداف و مفا هیم برنامه نویسی را بدانید‪.‬‬ ‫‪‬‬
‫مف\اهیم اولیه برنام\ه نویس\ی س\اخت یافت\ه را بدان\د و اص\ول الزم را در مرحل\ه اج\راء بک\ار‬ ‫‪‬‬
‫ببرید‪.‬‬
‫دستورات زبان برنامه نویسی‪ C‬را در حل مسائل( ایجاد برنامه ها) بکار ببرید‪.‬‬ ‫‪‬‬
‫از توابع و روال های استاندارد زبان ‪ C‬در صورت لزوم استفاده کنید‪.‬‬ ‫‪‬‬
‫از توابع ‪ ،‬روال ها برای جدا کردن قطعات برنامه استفاده کنید‪.‬‬ ‫‪‬‬
‫فایل ها را به عنوان محلی برای ذخیره داده ها در برنامه استفاده نماید‪.‬‬ ‫‪‬‬
‫با استفاده از قابلیت های زبان ‪ C‬برنامه ای را برای حل مسائل گوناگون بنویسید‪.‬‬ ‫‪‬‬
‫فصل اول‬

‫مقدمات ‪C‬‬
‫فهرست مطالب فصل اول‬

‫عملگر انتساب‬ ‫‪.14‬‬ ‫تاریخچه مختصر‬ ‫‪.1‬‬


‫عملگر های محاسباتی‬ ‫‪.15‬‬ ‫محیط برنامه نویسی‬ ‫‪.2‬‬
‫عملگرهای افزایش و کاهش‬ ‫‪.16‬‬ ‫‪ C‬اولین برنامه به زبان‬ ‫‪.3‬‬
‫‪ size of‬عملگر‬ ‫‪.17‬‬ ‫‪ C‬ساختار برنامه ها در‬ ‫‪.4‬‬
‫عملگرهای جایگزینی محاسباتی‬ ‫‪.18‬‬ ‫قانون نامگذاری شناسه ها‬ ‫‪.5‬‬
‫اولویت عملگرها‬ ‫‪.19‬‬ ‫متغیر ها‬ ‫‪.6‬‬
‫)‪ (Comments‬توضیحات‬ ‫‪.20‬‬ ‫اعالن متغیر‬ ‫‪.7‬‬
‫توابع کتابخانه‬ ‫‪.21‬‬ ‫تخصیص مقادیر به متغیر‬ ‫‪.8‬‬
‫‪ C++‬برنامه در‬ ‫‪.22‬‬ ‫داده های از نوع کرکتر‬ ‫‪.9‬‬
‫کرکتر های مخصوص‬ ‫‪.10‬‬
‫رشته ها‬ ‫‪.11‬‬
‫نمایش مقادیر داده ها‬ ‫‪.12‬‬
‫دریافت مقادیر‬ ‫‪.13‬‬
‫تاریخچه مختصر ‪C‬‬
‫هدف‬ ‫ارائه کننده‬ ‫سال‬ ‫زبان‬
‫‪ ۱۹۶۷‬مارتین ریچاردز نوشتن نرم افزارهای سیستم عامل و کامپایلر در دانشگاه کمبریج‬ ‫‪BCPL‬‬
‫ایجاد اولین نسخه های سیستم عامل یونیکس در‬ ‫‪ ۱۹۷۰‬کن تامپسون‬ ‫‪ B‬زبان‬
‫آزمایشگاه‌های بل‬
‫ایجاد سیستم عامل یونیکس استفاده و اکثر سیستم عاملهای دیگر‬ ‫‪ ۱۹۷۲‬دنیس ریچی‬ ‫‪C‬‬
‫استاندارد جهانی‬
‫زبانملی اس‬
‫انستیتوی‬ ‫‪۱۹۸۹‬‬ ‫‪ANSI C‬‬
‫تاندارد آمریکا‬
‫(‪) ANSI‬‬
‫استاندارد جهانی‬
‫زباناستاندار‬
‫سازمان‬ ‫‪۱۹۹۰‬‬ ‫‪ANSI/‬‬
‫دهای بین المللی‬ ‫‪ISO C‬‬
‫(‪)ISO‬‬

‫‪Dennis Ritchie‬‬
‫مطالعه آزاد‬

‫‪ ‬تحقیق در مورد تاریخچه زبانهای برنامه نویسی‬


‫‪ ‬مقایسه زبانهای برنامه نویسی و محبوبیت آنها با یکدیگر‬
‫‪ ‬بررسی کاربرد زبانهای برنامه نویسی‬
‫محیط برنامه نویسی‬

Borland C
Turbo C
Microsoft Visual Studio 2008
‫محیط برنامه نویسی(‪)1‬‬
‫محیط برنامه نویسی(‪)2‬‬
‫محیط برنامه نویسی(‪)3‬‬
C ‫اولین برنامه در‬

>include <stdio.h#
>include <conio.h#
)(int main
{
;printf(“Hello World”)
;)(getch
;return 0
}
VS ‫ برای کار در محیط‬C ‫دستورات‬

>include <conio.h#

"include "stdafx.h#
”include “iostream#
;using namespace std

.‫این دستورات باید در ابتدایی برنامه اضافه گردد‬


C ‫اولین برنامه در‬

#include "stdafx.h“
#include <iostream>
#include <conio.h>
using namespace std;
#include <stdio.h>

int _tmain()
{
printf(" Hello World");
getch();
return 0;
}
‫ساختار ساده برنامه ها در ‪C‬‬

‫>فایل هدر< ‪#include‬‬


‫‪...‬‬
‫)(‪int main‬‬
‫{‬
‫;تعریف متغیرها(شناسه ها)‬
‫;دستورات اجرایی‬
‫;‪return 0‬‬
‫}‬
‫کار در کالس‬

‫برنامه ای بنویسید که پیغام “‪ ”wellcome To UUT‬را در صفحه‬ ‫‪.1‬‬


‫نمایش چاپ نماید‪.‬‬
‫کار در منزل‬

‫‪ .1‬آموزش محیط برنامه نویسی‬


‫‪ .2‬نوشتن اولین برنامه‬
‫‪ .3‬اجرای و بدست آوردن نتیجه‬
‫قانون نامگذاري شناسه‌ها‬

‫حروف كوچك و بزرگ در نامگذاري شناسه‌ها متفاوت مي‌باشند‪.‬‬ ‫‪)1‬‬

‫بنابراين ‪ Xy ، XY ، xY ، xy‬چهار شناسه‬


‫متفاوت از نظر ‪ ++C‬مي‌باشد‪.‬‬
‫قانون نامگذاري شناسه‌ها‬

‫‪ )2‬در نامگ\ذاري شناس\ه‌ها از ح\روف الفب\اء‪ ،‬ارق\ام وزير خ\ط (‪)underscore‬‬


‫اس\تفاده مي‌ش\ود و ح\داكثر ط\ول شناس\ه ‪ 31‬مي‌باش\د و شناس\ه بايس\تي ب\ا يك‬
‫رقم شروع نگردد‪.‬‬
‫قانون نامگذاري شناسه‌ها‬
‫ در زير بعضي از كلمات‬.‫) براي نامگذاري شناسه‌ها از كلمات كليدي نبايستي استفاده نمود‬3
.‫كليدي داده شده است‬

And Sizeof then xor Template


Float False Friend While continue
extern Private Switch Default Const
delete typedef if this Virtual
‫متغيرها‬

‫متغ‪xx‬ير‪ ،‬مك‪xx‬اني در حافظ‪xx‬ه اص‪xx‬لي‬


‫ك‪x‬امپيوتر مي‌باش‪x‬د ك‪x‬ه در آنج‪x‬ا يك‬
‫مق‪xxx‬دار را مي‌ت‪xxx‬وان ذخ‪xxx‬يره و در‬
‫برنام‪x‬ه از آن اس‪x‬تفاده نم‪x‬ود‪ .‬ق‪x‬انون‬
‫نامگ‪xx‬ذاري متغيره‪xx‬ا هم‪xx‬ان ق‪xx‬انون‬
‫نامگذاري شناسه‌ها مي‌باشد‪.‬‬
‫تعریف متغيرها‬

‫نوع متغیر‬ ‫;نام متغیر‬


‫انواع داده ها‬
‫نوع داده‬ ‫مقادير‬ ‫حافظه الزم‬
‫‪int‬‬ ‫‪ 32767‬تا –‪32768‬‬ ‫‪ 2‬بايت‬
‫‪unsigned int‬‬ ‫‪ 65535‬تا ‪0‬‬ ‫‪2‬بايت‬
‫‪long int‬‬ ‫‪ 2147483647‬تا –‪2147483648‬‬ ‫‪ 4‬بايت‬
‫‪unsigned long int‬‬ ‫‪ 4294967295‬تا ‪0‬‬ ‫‪ 4‬بايت‬
‫‪char‬‬ ‫يك كاركتر‬ ‫‪1‬بايت‬
‫‪unsigned char‬‬ ‫‪ 127‬تا –‪128‬‬ ‫‪ 1‬بايت‬
‫‪float‬‬ ‫‪ 3.4e38‬تا ‪1.2e-38‬‬ ‫‪ 4‬بايت‬

‫‪double‬‬ ‫‪ 1.8e308‬تا ‪2.2e-308‬‬ ‫‪ 8‬بايت‬


‫اعالن متغیرها‬

‫قب\\ل از آنك\ه در برنام\\ه ب\\ه متغيره\\ا مق\\داري تخص\\يص داده‬


‫ش\ود و از آنه\ا اس\تفاده گ\ردد بايس\تي آنه\ا را در برنام\ه اعالن‬
‫نمود‪.‬‬

‫در اسالید بعد مثال هایی از اعالن متغیر ذکر شده است‪.‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪106‬‬
‫چند مثال از اعالن متغیر ها ‪:‬‬
‫‪ ‬براي اعالن متغير‪ x‬از نوع ‪: int‬‬
‫‪;int‬‬ ‫‪x‬‬

‫‪ ‬برای اعالن متغيرهاي ‪ p‬و ‪ q‬را از نوع ‪ float‬كه هر كدام چهار بايت از‬
‫حافظه را اشغال مي‌كنند ‪:‬‬
‫;‪float p , q‬‬

‫‪ ‬برای اعالن متغير ‪ next‬از نوع كركتر كه مي‌توان يكي از ‪ 256‬كركتر را به‬
‫آن تخصيص داد و يك بايت را اشغال مي‌كند‪.‬‬
‫;‪char next‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪107‬‬
‫تخصيص مقادير به متغيرها‬

‫با استفاده از عملگر = مي‌توان به متغيرها مقدار اوليه تخصيص نمود‪.‬‬

‫در اسالید بعد مثال هایی از اعالن متغیر ذکر شده است‪.‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪108‬‬
‫مثال ‪:‬‬

‫;‪ int x=26‬را از نوع ‪ int‬با مقدار‬ ‫‪X‬‬ ‫‪ ‬در دستورالعمل‬


‫اوليه ‪ 26‬اعالن نموده ‪.‬‬

‫‪;long a=67000 , b=260‬‬ ‫‪ ‬در دستورالعمل‬


‫متغيرهاي ‪ b‬و ‪ a‬را از نوع‪ long int‬تعريف نموده با مقادير بترتيب‬
‫‪.67000‬‬ ‫‪ 260‬و‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪109‬‬
‫داده‌هاي از نوع كركتر‬

‫ب\راي نم\ايش داد ‌هه\اي از ن\وع ‪ char‬در حافظ\ه ك\امپيوتر از ج\دول‬


‫‪ ASCII‬اس\تفاده مي‌ش\ود‪ .‬ج\دول اس\كي ب\ه ه\ر يك از ‪ 256‬كرك\تر يك‬
‫عدد منحصر بفرد بين ‪ 0‬تا ‪ 255‬تخصيص مي‌دهد‪.‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪110‬‬
‫كركترهاي مخصوص‬

‫يت‪x‬وان‬‫ك‪x‬امپيلر ‪ C‬بعض‪x‬ي از كركتره‪x‬اي مخص‪x‬وص ك‪x‬ه در برنام‪x‬ه م ‌‬


‫از آنه‪x‬ا ب‪x‬راي ف‪x‬رمت بن‪x‬دي اس‪x‬تفاده ك‪x‬رد را تش‪x‬خيص مي‌ده‪x‬د‪ .‬تع‪x‬دادي‬
‫از اين كركتره‪x‬اي مخص‪x‬وص ب‪x‬ه هم‪x‬راه ک‪x‬اربرد آنه‪x‬ا در اس‪x‬الید بع‪x‬د‬
‫آورده شده است ‪.‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪111‬‬
‫كركترهاي مخصوص‬

\n Newline
\t Tab beep ‫ مي‌توان براي ايجاد صداي‬a\ ‫بعنوان مثال از كركتر‬
\b Backspace .‫استفاده نمود‬
; char x = '\a
\a Beep sound
\” Double quote
\’ Single quote
\0 Null character
\? Question mark
\\ Back slash
‫رشته‌ها‬

‫رشته يا ‪ string‬عبارتست از دنباله‌اي از كركترها كه بين " " قرار‬


‫داده مي‌شود‪ .‬در حافظه كامپيوتر انتهاي رشته‌ها بوسيله \‪ 0‬ختم مي‌گردد‪.‬‬

‫در اسالید بعد به دو مثال دقت نمایید‪.‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪113‬‬
‫مثال ‪: 1‬‬

‫"‪ "BOOK STORE‬يك رش‪x‬ته ده كرك‪x‬تري مي‌باش‪x‬د‬


‫ك‪xx‬ه ب‪xx‬ا توج‪xx‬ه ب‪xx‬ه كرك‪xx‬تر \‪ 0‬ك‪xx‬ه ب‪xx‬ه انته‪xx‬اي آن در‬
‫ح‪xx‬افظه‌ اض‪xx‬افه مي ش‪xx‬ود جمعــًا يازده ب‪xx‬ايت را‬
‫اشغال مي‌كند‪.‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪114‬‬
‫مثال ‪: 2‬‬

‫دقت نمایی‪x‬د ک‪x‬ه "‪ "w‬يك رش‪x‬ته مي‌باش‪x‬د ك‪x‬ه دو ب‪x‬ايت از‬
‫حافظ‪xx‬ه را اش‪xx‬غال مي‌كن‪xx‬د در حاليك‪xx‬ه '‪ 'w‬يك كرك‪xx‬تر‬
‫مي‌باشد كه يك بايت از حافظه را اشغال مي‌نمايد‪.‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪115‬‬
‫نمايش مقادير داده‌ها‬
‫دستور ‪)(printf‬‬
‫– براي نم‪x‬ايش داده‌ه‪x‬ا ب‪x‬ر روي ص‪x‬فحه م‪x‬انیتواز دس‪x‬تور ‪ ;)”“(printf‬اس‪x‬تفاده می ش‪x‬ود این‬
‫تابع دارای فرمت مشخصی می باشد که به شکل زیر می باشد‪.‬‬
‫;)> عبارت ‪<,”>1‬عبارت ‪Printf(“<2‬‬
‫عبارت ‪ 1‬عبارت کنترلی می باشد(نحوه نمایش اطالعات را در خروجی تعیین می کند‪).‬‬
‫‪.‬عبارت ‪ 2‬مقادیر و متغیر های که باید در خروجی چاپ شود‬
‫• دستور ‪cout‬‬
‫– براي نم‪x‬ايش داد ‌هه‪x‬ا ب‪x‬ر روي ص‪x‬فحه م‪x‬انیتور از ‪ cout‬ك‪x‬ه ب‪x‬دنبال آن عملگ‪x‬ر درج يع‪x‬ني << قيد ش‪x‬ده‬
‫يگ‪x‬ردد‪ .‬بايس‪x‬تي توج‪x‬ه داش‪x‬ت ك‪x‬ه دوكرك‪x‬تر < پش‪x‬ت س‪x‬ر هم توس‪x‬ط ‪ ++C‬بص‪x‬ورت يك‬ ‫باش‪x‬د اس‪x‬تفاده م ‌‬
‫كركتر تلقي مي‌گردد‪.‬‬
‫• دستور ‪ )(putch()، putchar‬برای چاپ یک کرکتر در خروجی‬
‫• دستور ‪)(puts‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪116‬‬
‫‪ ‬برای نمایش پيغام ‪ good morning‬بر روی صفحه نمایش ‪:‬‬
‫‪;"cout << "good morning‬‬
‫‪ :‬مثال‬
‫‪ ‬برای نمایش مقدار متغیر ‪ X‬بر روی صفحه نمایش ‪:‬‬
‫‪; cout << x‬‬
‫‪ ‬چاپ مقدار یک متغییر در برنامه توسط دستور ‪printf‬‬

‫>‪#include <stdio.h‬‬ ‫>‪#include <iostream.h‬‬


‫)( ‪Void main‬‬ ‫)( ‪Void main‬‬
‫{‬ ‫{‬
‫;‪int x=4‬‬ ‫;‪int x=4‬‬
‫;‪int y=5‬‬ ‫;‪int y=5‬‬
‫;‪x=2‬‬ ‫;‪x=2‬‬
‫;‪y=x+2‬‬ ‫;‪y=x+2‬‬
‫;)‪printf(“Result=%d”,y‬‬ ‫;‪cout << “Result =”<<y‬‬
‫}‬ ‫}‬

‫‪ d%‬يعني يک عدد صحيح را روي مانيتور نشان بده‬


‫‪.‬اين عدد صحيح ‪ y‬خواهد بود‪.‬‬
‫‪ d%‬نيز يک کاراکتر کنترلي مي باشد‪.‬‬
‫‪Pr.rashidi@gmail.com‬‬ ‫‪117‬‬
)(printf ‫متغیرها کنترلی دستور‬

Pr.rashidi@gmail.com 118
‫متغیرها کنترلی دستور ‪)(printf‬‬

‫• )‪;printf(“%d”,23‬‬
‫– ‪ 23‬چاپ مي شود‪.‬‬
‫• )’‪printf(“%c”,’a‬‬
‫– کاراکتر ‪ a‬روي مانيتور چاپ مي شود‪.‬‬
‫• )’‪;printf(“%d”,’a‬‬
‫– کد اسکي کاراکتر ‪ a‬يعني ‪ 97‬چاپ مي شود‪.‬‬
‫• )‪printf(“%c”,97‬‬
‫– کاراکتري که کد اسکي آن ‪ 97‬است يعني ‪ a‬چاپ مي شود‪.‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪119‬‬
‫دریافت مقادیر متغیرها‬

‫• دستور ‪)(scanf‬‬
‫از این دستور برای دریافت ورودی از کاربر استفاده می شود‪.‬‬
‫شکل کلی دستور‬
‫)>عبارت ‪< ,”>1‬عبارت ‪Scanf(“<2‬‬
‫همانند دستور ‪ printf‬این دستور نیز دارای پارامترهای کنترلی می باشد‪.‬‬
‫• دستور ‪)(cin‬‬
‫به منظ‪x‬ور دريافت مق‪x‬ادير ب‪x‬راي متغيره‪x‬ا در ض‪x‬من اج‪x‬راي برنام‪x‬ه از ص‪x‬فحه كليد‪ ،‬از ‪cin‬‬
‫كه بدنبال آن عملگر استخراج يعني >> قيد شده باشد مي‌توان استفاده نمود‪.‬‬
‫• دستور ‪ getch() ، ()getche‬برای دریافت یک کاراکتر از ورودی‬
‫• دستور ‪ )(gets‬برای دریافت یک رشته از ورودی‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪120‬‬
‫ دريافت کند و‬keyboard ‫برنامه اي بنويسيد که عددي صحيح را از‬: ‫مثال‬
.‫مربع آن را چاپ کند‬

#include <iostream.h> #include <stdio.h>


void main() void main()
{ {
int x; int x;
cout << “Enter a printf(“Enter a Number”);
Number”; scanf(“%d”,&x);
cin >> x; printf(“%d”,(x*x));
cout << x*x; }
}

Pr.rashidi@gmail.com 121
‫عملگر انتساب‬

‫عملگر انتساب = مي‌باشد كه باعث مي‌گردد‬


‫مقدار عبارت در طرف راست این عملگر ارزيابي‬
‫شده و در متغير طرف چپ آن قرار گيرد‪.‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪122‬‬
‫مثال ‪:‬‬

‫‪;x=a+b‬‬
‫‪; x=35‬‬
‫‪; x=y=z=26‬‬

‫از عملگره‪x‬اي انتس‪x‬اب چندگان‪x‬ه ن‪x‬يز مي‌ت‪x‬وان اس‪x‬تفاده‬


‫نم‪x‬ود‪ .‬ک‪x‬ه مق‪x‬دار س‪x‬ه متغ‪x‬ير ‪ z‬و ‪ y‬و ‪ x‬براب‪x‬ر ب‪x‬ا ‪26‬‬
‫ميشود‪.‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪123‬‬
‫عملگرهاي محاسباتي‬
‫در ‪ C‬پنج عملگر محاسباتي وجود دارد كه عبارتند از ‪:‬‬
‫جمع‬ ‫‪+‬‬
‫تفريق‬ ‫‪-‬‬
‫ضرب‬ ‫*‬
‫تقسيم‬ ‫‪/‬‬
‫باقيمانده‬ ‫‪%‬‬

‫اين عملگرها دو تائي مي‌باشند زيرا روي دو عملوند عمل مي‌نمايند‪ .‬از طرف‬
‫ديگر عملگرهاي ‪ +‬و – رامي‌توان بعنوان عملگرهاي يكتائي نيز در نظر گرفت‪.‬‬
‫مثال ‪: 1‬‬
‫در ح\التي ك\ه ه\ر دو عملون\د عملگره\اي ‪ – ، + ، * ، / ، %‬از ن\وع ص\حيح باش\د‬
‫نتيجه عمل از نوع صحيح مي‌باشد‪.‬‬

‫عبارت‬ ‫نتیجه‬
‫‪2+5‬‬ ‫‪7‬‬
‫‪5*2‬‬ ‫‪10‬‬
‫‪5–2‬‬ ‫‪3‬‬
‫‪5%2‬‬ ‫‪1‬‬
‫‪5/2‬‬ ‫‪2‬‬
‫مثال ‪: 2‬‬
‫در صورتيكه حداقل يكي از عملوندهاي عملگرهاي ‪ + ، – ، * ، /‬از نوع اعشاري باشد‬
‫نتيجه عمل از نوع اعشاري مي‌باشد‪.‬‬

‫عبارت‬ ‫نتیجه‬
‫‪2 + 0 .5‬‬ ‫‪7. 0‬‬
‫‪5* 2. 0‬‬ ‫‪10.0‬‬
‫‪5. 0 / 2‬‬ ‫‪2.5‬‬
‫‪5. 0 -2‬‬ ‫‪3. 0‬‬
‫‪5. 0 / 2. 0‬‬ ‫‪2.5‬‬
‫عملگرهاي افزايش و كاهش‬

‫در ‪ ، C‬اف\زايش يك واح\د ب\ه مق\دار يك متغ\ير‬


‫از ن\وع ص\حيح را اف\زايش و بط\ور مش\ابه‬
‫ك\اهش يك واح\د از مق\دار يك متغ\ير از ن\وع‬
‫صحيح را كاهش مي‌نامند‪..‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪127‬‬
‫عملگرهاي افزايش و كاهش‬

‫عملگ\ر ك\اهش را ب\ا ‪ - -‬و عملگ\ر اف\زايش‬


‫را ب\ا ‪ ++‬نم\ايش مي‌دهن\د‪ .‬چ\ون عملگره\اي‬
‫‪ ++‬و ‪ - -‬فق\ط روي يك عملون\د اث\ر دارن\د‬
‫اين دو عملگ\ر ن\يز ج\زء عملگره\اي يكت\ائي‬
‫مي‌باشند‪.‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪128‬‬
‫مثال ‪:‬‬

‫سه دستور العمل ‪:‬‬


‫‪;x++‬‬
‫‪;++x‬‬
‫‪;x=x+1‬‬

‫معادل مي‌باشند و بطريق مشابه سه دستورالعمل زير نیز معادل مي باشند‪.‬‬

‫‪;y--‬‬
‫‪;y=y-1‬‬
‫‪; - -y‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪129‬‬
‫از عملگرهاي ‪ ++‬و ‪ --‬مي‌توان بدو صورت پيشوندي و پسوندي استفاده نمود‪.‬‬
‫در دستورالعمل‌هاي پيچيده عملگر پيشوندي قبل از انتساب ارزيابي ميشود و عملگر‬
‫پسوندي بعد از انتساب ارزيابي مي‌شود‪.‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪130‬‬
‫مثال ‪:‬‬
‫‪;int x=5‬‬
‫‪;y=++x * 2‬‬
‫پس از اجراي دستورالعملهاي فوق ‪:‬‬
‫‪y=12,x=6‬‬

‫;‪int x=5‬‬
‫;‪y=x++ * 2‬‬
‫پس از اجراي دستورالعملهاي فوق ‪:‬‬
‫‪y=10, x=6‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪131‬‬
‫عملگر ‪sizeof‬‬
‫‪ Sizeof‬ازعملگرهاي يكتائي مي باشد و مشخص كننده تعداد بايت هائي‬
‫است كه يك نوع داده اشغال مي‌كند‪.‬‬

‫مثال ‪:‬‬
‫‪;int x‬‬
‫‪; cout << sizeof x‬‬
‫مقدار ‪ 2‬نمايش داده مي‌شود ‪.‬‬
‫)‪; cout << sizeof(float‬‬
‫مقدار ‪ 4‬نمايش داده مي شود‪.‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪132‬‬
‫عملگرهاي جايگزيني محاسباتي‬

‫براي ساده‌تر نوشتن عبارتها در ‪ ، C‬مي‌توان از‬


‫عملگرهاي جايگزيني محاسبـــاتي استفاده نمود‪.‬‬

‫‪=+‬‬ ‫‪=-‬‬ ‫*=‬ ‫‪=/‬‬ ‫‪=%‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪133‬‬
‫اولويت عملگرها‬
‫ارزيابي مقدار يك عبارت رياضي براساس جدول اولويت عملگرها انجام مي‌گردد‪ .‬در ذيل جدول اولويت‬
‫عملگرها براساس بترتيب از بيشترين اولويت به كمترين اولويت داده شده است‪.‬‬

‫) (‬ ‫پرانتزها‬ ‫چپ به راست‬


‫‪-‬‬ ‫‪+‬‬ ‫‪-- ++‬‬ ‫‪sizeof‬‬ ‫عملگرهاي يك تايي‬ ‫راست به چپ‬
‫*‬ ‫‪/‬‬ ‫‪%‬‬ ‫عملگرهاي ضرب و تقس يم و باقيماند ه‬ ‫چپ به راست‬
‫‪+‬‬ ‫‪‬‬ ‫عملگرهاي جمع و تفريق‬ ‫چپ به راست‬
‫<<‬ ‫>>‬ ‫عملگرهاي درج و استخراج‬ ‫چپ به راست‬
‫=‪= += -= *= /= %‬‬ ‫عملگرهاي جايگزيني و انتس اب‬ ‫راست به چپ‬
‫مثال ‪: 1‬‬
‫(‪2/)2*6+2(* )5+2‬‬

‫با توجه به جدول اولويت عملگرها داريم كه‬

‫‪2/)2*6+2(* 7‬‬
‫‪2/)6+4(*7‬‬
‫‪2/ 10 *7‬‬
‫‪2/ 70‬‬
‫‪35‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪135‬‬
: 2 ‫مثال‬
;int a=6 , b=2, c=8, d=12
;++ d=a++ * b/c
;cout << d << c << b << a

: ‫خروجی‬

1 9 2 7

Pr.rashidi@gmail.com 136
‫توضيحات (‪)Comments‬‬

‫توض\يحات در برنام\ه ب\اعث خوان\ائي بيش\تر و درك به\تر برنام\ه ميش\ود‪ .‬بن\ابراين‬
‫توص\يه ب\ر آن اس\ت ك\ه ح\تي االمك\ان در برنامه‌ه\ا از توض\يحات اس\تفاده نم\ائيم‪ .‬در‬
‫‪ ،C‬توض\يحات ب\دو ص\ورت انج\ام مي‌گ\يرد ک\ه در اس\الیدهای بع\د ب\ه آن اش\اره ش\ده‬
‫است‪.‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪137‬‬
‫توضيحات (‪)Comments‬‬

‫ال\ف‪ :‬اين ن\وع توض\يح بوس\يله ‪ //‬انج\ام مي‌ش\ود‪ .‬ك\ه ك\امپيوتر ه\ر چ\يزي را‬
‫كه بعد از ‪ //‬قرار داده شود تا انتهاي آن خط اغماض مي‌نمايد‪.‬‬
‫مثال ‪:‬‬

‫‪c=a+b;//c is equal to sum of a and b‬‬

‫ب‪:‬توض\يح ن\وع دوم ب\ا ‪ */‬ش\روع ش\ده و ب\ه *‪ /‬ختم مي‌ش\ود و ه\ر چ\يزي ك\ه‬
‫بين*‌‪ /‬و *‪ /‬قرار گيرد اغماض مي‌نمايد ‪.‬‬
‫مثال ‪:‬‬

‫‪this is a program * /‬‬


‫‪to calcufate sum of‬‬
‫‪/* n integer numbers‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪138‬‬
‫توابع كتابخانه‬

‫زب\ان ‪ C‬مجه\ز ب\ه تع\دادي تواب\ع كتابخان\ه مي‌باش\د‪ .‬بعن\وان مث\ال تع\دادي‬
‫تواب\ع كتابخان\ه ب\راي عملي\ات ورودي و خ\روجي وج\ود دارن\د‪ .‬معم\وًال‬
‫تواب\ع كتابخان\ه مش\ابه ‪ ،‬بص\ورت برنام ‌هه\اي ه\دف (برنام\ه ترجم\ه ش\ده‬
‫بزب\ان ماش\ين) در ق\الب فايله\اي كتابخان\ه دس\ته بن\دي و م\ورد اس\تفاده‬
‫ق\\\را رمي‌گيرن\\\د‪ .‬اين فايله\\\ا را فايله\\\اي ‪ header‬مي‌نامن\\\د و داراي‬
‫پسوند ‪ h.‬مي‌باشند‪.‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪139‬‬
‫نحوه استفاده از توابع کتابخانه ای‬

‫براي استفاده از توابع كتابخان ‌ه خاصي بايستـــي نام‬


‫فايل ‪ header‬آنرا در ابتداي برنامه در دستور‬
‫‪ include#‬قرار دهيم‪.‬‬

‫< ‪#header‬‬ ‫> اسم فايل ‪include‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪140‬‬
‫تابع‬ ‫نوع‬ ‫شرح‬ ‫فايل هيد ر‬
abs(i) int i ‫قد رمطلق‬ stdlib.h
cos(d) double d ‫كس ينوس‬ math.h
exp(d) double ex math.h
log(d) double loge d math.h
log10(d) double Log10 d math.h
sin(d) double d ‫سينوس‬ math.h
sqrt(d) double d ‫جذ ر‬ math.h
strlen(s) int s ‫تعد اد كركترهاي رشته‬ string.h
tan(d) double d ‫تانژانت‬ math.h
toascii( c) int c‫كد اسك ي كركتر‬ stdlib.h
tolower(c ) int ‫تبد يل به حروف كوچك‬ stdlib.h
toupper(c ) int ‫تبد يل به حرف بزرگ‬ stdlib.h

Pr.rashidi@gmail.com 141
‫برنامه در ‪C‬‬
‫اكن\ون باتوج\ه ب\ه مط\الب گفت\ه ش\ده ق\ادر خ\واهيم ب\ود ك\ه تع\دادي برنام\ه س\اده و كوچ\ك ب\ه زب\ان ‪C‬‬
‫بنويس\يم‪ .‬ب\راي نوش\تن برنام\ه بايس\تي دس\تورالعملها را در ت\ابع ‪ ) (main‬ق\رار دهيم و ب\راي اينك\ار‬
‫مي‌توان به يكي از دو طريقی که در اسالیدهای بعد آمده است ‪ ،‬عمل نمود‪.‬‬
‫ روش اول‬:

#include < >


int main( )
}
1 ‫; دستورالعمل‬
2 ‫; دستورالعمل‬
.
.
.
n ‫; دستورالعمل‬
return 0 ;
}

Pr.rashidi@gmail.com 143
‫روش دوم ‪:‬‬

‫< ‪#include‬‬ ‫>‬


‫) (‪void main‬‬
‫{‬
‫; دستورالعمل ‪1‬‬
‫; دستورالعمل ‪2‬‬
‫‪.‬‬
‫‪.‬‬
‫‪.‬‬
‫; دستورالعمل ‪n‬‬
‫}‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪144‬‬
.‫را روي صفحه مانیتور نمايش مي دهد‬C Is a Strong Language ‫برنامه ای که پيغام‬

#include <iostream.h>
int main( )
{
cout <<“C is an Strong Language \n" ;
return 0 ;
}

Pr.rashidi@gmail.com 145
‫برنامه زير يك حرف انگليسي كوچك را گرفته به حرف بزرگ تبديل مي‌نمايد‬.

#include <iostream.h>
#include <stdlib. h>
int main( )
{
char c1 , c2;
cout << "Enter a lowercase letter:"
cin >> c1;
c2 = toupper(c1);
cout << c2 << endl;
return 0;
}

Pr.rashidi@gmail.com 146
‫دو عدد از نوع اعشاري را گرفته مجموع و حاصلضرب آنها را محاسبه و نمايش مي‌دهد‬.

#include <iostream.h>
int main( )
{
float x,y,s,p ;
cin >> x >> y ;
s= x+y ;
p=x*y;
cout << s <<endl << p;
return 0 ;
}

Pr.rashidi@gmail.com 147
‫تمارین‬

‫• برای تمارین سری اول فلوچارت ها ‪ -‬برنامه مناسبی بنویسید‪.‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪148‬‬
‫فصل دوم‬

‫ساختارهای تصمیم گیری و تکرار‬


‫فهرست مطالب فصل دوم‬

‫عملگر های رابطه ای‬ ‫‪.1‬‬


‫عملگر شرطی‬ ‫‪.2‬‬
‫دستورالعمل شرطی‬ ‫‪.3‬‬
‫عملگر کاما‬ ‫‪.4‬‬
‫عملگر های منطقی‬ ‫‪.5‬‬
‫‪ For‬دستورالعمل‬ ‫‪.6‬‬
‫عملگرهای رابطه ای‬
‫از این عملگرها براي تعيين اينكه آيا دو عدد با هم‬
‫معادلند يا يكي از ديگري بزرگتر يا كوچكتر‬
‫مي‌باشد استفاده مي‌گردد‪ .‬عملگرهاي رابطه‌اي‬
‫عبارتند از‪:‬‬

‫مساوي‬ ‫==‬
‫مخالف‬ ‫=!‬
‫بزرگتر‬ ‫>‬
‫بزرگتر يا مساوي‬ ‫=>‬
‫كوچكتر‬ ‫<‬
‫كوچكتر يا مساوي‬ ‫<=‬
‫عملگر شرطی‬

‫شكل كلي عملگر شرطي بصورت زير مي‌باشد‪:‬‬

‫‪expression _ test ? expression _ true : expression _ false‬‬

‫عملگر شرطي تنها عملگري در ‪ ++C‬مي‌باشد كه داراي سه عملوند مي‌باشد‪.‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪152‬‬
‫مثال ‪: 1‬‬
‫‪;int x=10,y=20,b‬‬
‫‪; b=(x>y) ? x : y‬‬

‫اين دو دستور العمل باعث ميشوند كه ماكزيمم مقادير ‪ y‬و ‪ x‬در ‪ b‬قرار بگيرد‪.‬‬

‫مثال ‪: 2‬‬
‫; "‪x>=10 ? cout << "passed" : cout << "failed‬‬

‫اگر مقدار ‪ x‬بزرگتر يا مساوي ده باشد رشتة ‪ passed‬در غير اينصورت‬


‫نمايش داده ميشود‪.‬‬ ‫‪failed‬‬ ‫رشته‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪153‬‬
‫‪IF‬‬ ‫دستورالعمل شرطي‬

‫توس\ط این دس\تور ش\رطي را تس\ت نم\وده و بس\ته ب\ه‬


‫آنك\ه ش\رط درس\ت يا غل\ط باش\د عكس‌العم\ل خاص\ي‬
‫را نشان دهيم‪.‬‬
‫(‪if‬‬ ‫) عبارت‬
‫{‬
‫; دستورالعمل‪1‬‬
‫‪.‬‬
‫; دستورالعمل ‪n‬‬
‫}‬
‫‪else‬‬
‫{‬
‫; دستورالعمل ‪1‬‬
‫‪.‬‬
‫; دستورالعمل ‪n‬‬
‫}‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪154‬‬
1 ‫ مثال‬:

if(x != y)
{
cout << x ;
++ x ;
}
else
{
cout << y ;
--y;
}

Pr.rashidi@gmail.com 155
‫‪:‬مثال ‪2‬‬
‫‌نمايد‬
‫محاسبه مميي‌نمايد‬
‫آنرا محاسبه‬
‫جذر آنرا‬
‫گرفته جذر‬
‫ورودي گرفته‬
‫از ورودي‬
‫را از‬
‫اعشاري را‬
‫عدد اعشاري‬
‫يك عدد‬
‫زير يك‬
‫‪.‬برنامه زير‬
‫‪.‬برنامه‬

‫>‪#include <iostream.h‬‬
‫>‪#include <math . h‬‬
‫) (‪int main‬‬
‫{‬
‫;‪float x,s‬‬
‫; ‪cin >> x‬‬
‫) ‪if( x < 0‬‬
‫; ‪cout << " x is negative" << endl‬‬
‫‪else‬‬
‫{‬
‫; )‪s = sqrt(x‬‬
‫; ‪cout << s << endl‬‬
‫}‬
‫;‪return 0‬‬
‫}‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪156‬‬
‫عملگر كاما‬
‫تع\دادي عب\ارت را مي‌ت\وان ب\ا كام\ا بهم متص\ل نم\ود و‬
‫تش\\\كيل يك عب\\\ارت پيچي\\\ده‌تري را داد‪ .‬اين عبارته\\\ا ب\ه‬
‫ت\\رتيب از چپ ب\\ه راس\\ت ارزيابي ش\\ده و مق\\دار عب\\ارت‬
‫معادل عبارت‪ n‬مي‌باشد‪.‬‬

‫(عبارت ‪ , .… , n‬عبارت ‪ , 3‬عبارت ‪ , 2‬عبارت ‪)1‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪157‬‬
‫مثال ‪:‬‬

‫‪ ; int a=2 , b=4 , c=5‬عبارت زير را در نظر بگيريد‪:‬‬ ‫اگر داشته باشيم‬

‫)‪(++ a , a+b, ++ c, c+b‬‬

‫مقدار عبارت برابر است با ‪ b+c‬كه معادل ‪ 10‬مي‌با‌شد‪.‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪158‬‬
‫عملگرهای منطقی‬

‫با استفاده از عملگرهاي منطقي مي‌توان شرطهاي تركيبي در برنام ‌ه ايجاد نمود‪ .‬عملگرهاي‬
‫منطقي عبارتست از ‪:‬‬
‫‪AND‬‬
‫‪OR‬‬
‫‪NOT‬‬
‫كه در ‪ ++C‬به ترتيب بصورت زير نشان داده ميشود‪.‬‬
‫&&‬
‫||‬
‫!‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪159‬‬
‫جدول درستی سه عملگر شرطی‬

a b a || b
true true True
true false True
false true True
false false False

a b a && b
true true True
true false False
false true False
false false False

a !a
true False
false True
‫چند مثال ‪:‬‬
‫))‪if ((x= = 5) ||(y != 0‬‬
‫; ‪cout << x << endl‬‬

‫اگر ‪ x‬برابر با ‪ 5‬يا ‪ y‬مخالف صفر باشد مقدار ‪ x‬نمايش داده شود ‪.‬‬

‫(‪if‬‬
‫)‪x‬‬
‫‪x‬‬
‫;‪=0‬‬
‫اگر مقدار ‪ x‬مخالف صفر باشد‪ ،‬آنگاه ‪ x‬برابر با صفر شود ‪.‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪161‬‬
‫برنامه زير طول سه پاره‌خط را از ورودي گرفته مشخص مي‌نمايد كه آيا تشكيل يك مثلث ميدهد يا خير؟‬

#include < iostream.h >


int main( )
{
float a, b, c;
cout << "Enter three real numbers" << endl ;
cin >> a >> b >> c; //

if(( a < b + c) &&(b < a+c) &&(c < a+b))


cout << "It is a triangle" ;
else
cout << "Not a triangle" ;
return 0 ;
}

Pr.rashidi@gmail.com 162
‫دستورالعمل ‪For‬‬

‫از دستور العمل ‪ for‬براي تكرار دستورالعملها استفاده ميشود‪ .‬شكل كلي دستور ‪for‬‬
‫بصورت زير مي‌باشد‪:‬‬
‫(عبارت ‪ ; 3‬عبارت ; ‪ 2‬عبارت ‪for )1‬‬
‫{‬
‫; دستورالعمل ‪1‬‬
‫; دستورالعمل ‪2‬‬
‫‪.‬‬
‫‪.‬‬
‫‪.‬‬
‫; دستورالعمل ‪n‬‬
‫}‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪163‬‬
.‫ را از ورودي گرفته فاكتوريل آنرا محاسبه ونمايش مي‌دهد‬n ‫برنام ‌ه زير عدد صحيح و مثبت‬

#include <iostream.h>
int main( )
{
int n, i ;
long fact = 1 ;
cout << "Enter a positive integer number";
cin >> n;
for( i=1; i<=n; ++i)
{
fact *= i;
}
cout << fact << endl;
return 0 ;
}

Pr.rashidi@gmail.com 164
.‫ را محاسبه نموده و نمايش مي‌دهد‬n ‫ تا‬1 ‫برنامه زير مجموع اعداد صحيح و متوالي بين‬

#include <iostream.h>
int main( )
{
int n, i=1 ;
long s = 0 ;
cin >> n ;
for(; i<=n; i++)
s += i;

cout << s ;
return 0 ;
}

Pr.rashidi@gmail.com 165
.‫ را نمايش مي‌دهد‬9 ‫ تا‬0 ‫برنامه زير ارقام‬

#include <iostream.h>
int main( )
{
int j=0 ;
for( ; j <= 9 ; )
cout << j++ << endl;
return 0 ;
}

Pr.rashidi@gmail.com 166
.‫ ايجاد مي‌شوند را نمايش مي‌دهد‬3 ، 2 ، 1 ‫برنامه زير كليه اعداد سه رقمي كه با ارقام‬

#include <iostream.h>
int main( )
{
int i,j,k,n;

for(i=1; i<=3; ++i)


for(j=1; j<=3; ++j)
for(k=1; k<=3; ++k)
{
n=i*100 + j*10+k;
cout << n << ‘\n’ ;
}
return 0 ;
}

Pr.rashidi@gmail.com 167
‫تکالیف‬

‫• مطالعه کامل اسالیدهای ‪C.pptx + C 2.pptx‬‬


‫• برنامه ‪ : 1‬ساعت کامپیوتری‬
‫• برنامه ‪ : 2‬برنامه لیست تعطیالت سال و نمایش آن به فرمت‬
‫تاریخ میالدی‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪168‬‬
‫)‪ (h:m:s‬ساخت يک ساعت کامپيوتري‬
‫الگوريتم‪:‬‬
‫‪s=0، m=0،h=0 ، d=0، mon=0، y=0 .1‬‬
‫‪ .2‬نمايش زمان‬
‫‪s=s+1 .3‬‬
‫‪ .4‬اگر ‪ s=60‬آنگاه ‪ s=0‬و ‪++m‬‬
‫‪ .5‬اگر ‪ m=60‬آنگاه ‪ m=0‬و ‪++h‬‬
‫‪ .6‬اگر ‪ h=24‬آنگاه ‪ h=0‬و ‪++d‬‬
‫‪ .7‬اگر ‪ d=31‬انگاه ‪ d=0‬و ‪++mon‬‬
‫‪ .8‬اگر ‪mon=12‬انگاه ‪ mon=0‬و ‪++y‬‬
‫‪ .9‬يک ثانيه انتظار(از تابع )‪ Sleep(1000‬واقع در هدر فایل‬
‫‪>include <windows.h#‬استفاده نماید)‬
‫‪ .10‬انجام ‪ 2‬تا ‪ 9‬به تعداد بي نهايت‬
‫‪Pr.rashidi@gmail.com‬‬ ‫‪169‬‬
‫برنامه ‪ :2‬برنامه محاسبه گر تعطیالت سال ‪ 88‬و به بعد‬
‫الگوریتم برنامه‬ ‫‪.1‬‬
‫تعداد روزهای تعطیلی سال ‪ 88‬را به صورت پیش فرض‬ ‫‪.2‬‬
‫تعیین نماید‪.‬‬
‫تا جایی که تعداد روزهای تعطیلی خاتمه نیافته است‪( .‬از یک‬ ‫‪.3‬‬
‫شروع نماید تا جایی که به تعداد روزهای می رسید‪).‬‬
‫برای هر روز شماره آنروز تعطیل ‪ +‬شرح آن ‪ +‬نوع آن (‪s،‬‬ ‫‪.4‬‬
‫‪ ) g‬را از ورودی دریافت نماید)‬
‫روزهای تعطیل سال ‪ 88‬را به ترتیب در خروجی چاپ نماید‪.‬‬ ‫‪.5‬‬
‫فرمت خروجی (‪)day-description-type‬‬ ‫‪.1‬‬
‫‪ .6‬برای سال بعد نیز تعطیالت را محاسبه و چاپ نماید‪.‬‬
‫(توجه داشته باشید که تعطیالت سال قمری هر سال ‪ 10‬روز جلوتر می‬ ‫‪.1‬‬
‫آیند‪).‬‬
‫نماید‪.‬‬ ‫‪ .7 170‬مرحله ‪ 6‬را تا سال ‪ 1404‬تکرار‬
‫‪Pr.rashidi@gmail.com‬‬
‫راهنمایی ( تمرین ‪) 2‬‬

‫• روش ‪1‬‬
‫– به ازای تمام روزهای تعطیالت متغیرهای جداگانه برای شماره روز‬
‫تعریف نماید‪.‬‬
‫– به ازای تمام روزهای تعطیالت متغیرهای جداگانه برای شرح روز‬
‫تعریف نماید‪.‬‬
‫– به ازای تمام روزهای تعطیالت متغیرهای جداگانه برای نوع تعریف‬
‫نماید‪.‬‬
‫• روش ‪2‬‬
‫– برای شماره روزهای تعطیل یک آرایه از نوع صحیح تعریف نماید‬
‫– برای شرح روزهای تعطیل یک آرایه از نوع رشته تعریف نماید‬
‫– برای نوع روزهای تعطیل یک آرایه از نوع صحیح تعریف نماید‬
‫‪Pr.rashidi@gmail.com‬‬ ‫‪171‬‬
‫تمرین ‪( 3‬مثال های کتاب)‬

‫• مثال های فصل ‪2‬‬


‫– ‪20 ،16 ،11 ، 8‬‬
‫• مثال های فصل ‪3‬‬
‫– ‪ 1‬تا ‪8‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪172‬‬
‫فصل سوم‬

‫سایر ساختارهای تکرار‬


‫فهرست مطالب فصل سوم‬

‫‪ while‬دستورالعمل‬ ‫‪.1‬‬
‫‪ do while‬دستورالعمل‬ ‫‪.2‬‬
‫‪ break‬دستورالعمل‬ ‫‪.3‬‬
‫‪ continue‬دستورالعمل‬ ‫‪.4‬‬
‫‪ switch‬دستورالعمل‬ ‫‪.5‬‬
‫)(‪ cin.get‬تابع‬ ‫‪.6‬‬
‫)(><‪ static_cast‬عملگر‬ ‫‪.7‬‬
‫جدول اولویت عملگرها‬ ‫‪.8‬‬
‫دستورالعمل ‪while‬‬
‫از اين دستور العمل مانند دستورالعمل ‪ for‬براي تكرار يك دستورالعمل ساده يا تركيبي استفاده‬
‫مي‌گردد‪ .‬شكل كلي اين دستور العمل بصورت زير مي‌باشد‪.‬‬

‫)شرط (‪while‬‬
‫}‬
‫; دستورالعمل ‪1‬‬
‫; دستورالعمل ‪2‬‬
‫‪.‬‬
‫‪.‬‬
‫; دستورالعمل ‪n‬‬
‫}‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪175‬‬
‫تفاوت دستورهای ‪ while‬و ‪for‬‬

‫دس\تورالعمل ‪ for‬زم\اني اس\تفاده ميش\ود‬


‫ك\ه تع\داد دفع\ات تك\رار از قب\ل مش\خص و‬
‫معين باش\\د‪ .‬در ص\\ورتيكه تع\\داد دفع\\ات‬
‫تك\\\\رار مش\\\\خص نباش\\\\د بايس\\\\تي از‬
‫دستورالعمل ‪ while‬استفاده نمود‪.‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪176‬‬
‫مثال ‪:‬‬

‫‪int x=0‬‬
‫)‪while(x<5‬‬
‫;‪cout << x ++<< endl‬‬

‫با اجراي قطع ‌ه برنامه فوق مقادير زير نمايش داده‬


‫‪ :‬ميشود‬

‫‪0‬‬
‫‪1‬‬
‫‪2‬‬
‫‪3‬‬
‫‪4‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪177‬‬
‫ قرار‬avg ‫ مقدار از نوع اعشاري را گرفته ميانگين آنها را محاسبه و در متغير‬n ‫برنامة فوق‬
.‫مي‌دهد‬

#inclode <iostream.h>
int main( )
{
int count = 0 , n;
float x, sum = 0 , avg ;
cin >> n ; /* ‫ تعداد مقادير ورودي‬n*/
while(count < n)
{
cin >> x ;
sum += x ;
++ count ;
}
avg = sum / n ;
cout << avg << endl;
return 0 ;
}

Pr.rashidi@gmail.com 178
‫دستورالعمل ‪do while‬‬
‫اين دس‪x‬تور العم‪x‬ل ن‪x‬يز ب‪x‬راي تك‪x‬رار يك دس‪x‬تورالعمل‬
‫س‪xx‬اده يا تركيبي اس‪xx‬تفاده مي‌ش‪xx‬ود‪ .‬ش‪xx‬كل كلي اين‬
‫دستورالعمل بصورت زير مي‌باشد‪.‬‬

‫‪do‬‬
‫}‬
‫; دستورالعمل ‪1‬‬
‫; دستورالعمل ‪2‬‬
‫‪.‬‬
‫‪.‬‬
‫; دستورالعمل ‪n‬‬
‫;)شرط (‪} while‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪179‬‬
‫تفاوت دستورهای ‪ do while‬و ‪while‬‬

‫در دس\\تورالعمل ‪ while‬ابت\\دا مق\\دار ش\\رط‬


‫ارزيابي ش\\\ده ام\\\ا در دس\\\تورالعمل ‪do‬‬
‫‪ while‬ابت\دا دس\تورالعمل اج\را ش\ده س\پس‬
‫مق\\دار ش\\رط ارزيابي مي‌گ\\ردد‪ .‬بن\\ابراین‬
‫دس\\تورالعمل ‪ do while‬ح\\داقل يك ب\\ار‬
‫انجام ميشود ‪.‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪180‬‬
: ‫مثال‬

#include <iostream.h>
int main( )
{
int count = 0;
do
{
cout << count ++<<endl ;
}while(count <= 9);
return 0 ;
}

‫ را روي ده خط نمايش مي‌دهد‬9 ‫ تا‬0 ‫ارقام‬

Pr.rashidi@gmail.com 181
‫دستورالعمل ‪break‬‬

‫اين دستورالعمل باعث توقف دستورالعملهاي تكرار( ‪ )for , while ,do while‬شده و‬
‫كنترل به خارج از اين دستورالعملها منتقل مي‌نمايد‪.‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪182‬‬
#include <iostream.h> : 1 ‫مثال‬
int main( )
{
float x, s=0.0 ;
cin >> x ;
while(x <= 1000.0)
{
if(x < 0.0)
{
cout << "Error-Negative Value" ;
break;
}
s += x ;
cin >> x ;
}
cout << s << endl ;
return 0 ;
}

Pr.rashidi@gmail.com 183
:2 ‫مثال‬

#include <iostream.h>
int main( )
{
int count = 0 ;
while( 1 )
{
count ++ ;
if(count > 10 )
break ;
}
cout << "counter : " << count << "\n";
return 0 ;
}

Pr.rashidi@gmail.com 184
#include <iostream.h>
void main( ) :3 ‫مثال‬
{
int count;
float x, sum = 0;
cin >> x ;
for(count = 1; x < 1000 . 0; ++ count )
{

if(x < 0.0)


{
cout << "Error – Negative value " <<endl;
break ;
}
sum += x ;
cin >> x ;
}
cout << sum << \n ;
}

Pr.rashidi@gmail.com 185
#include <iostream.h>
int main( ) :4 ‫مثال‬
{
float x , sum = 0.0 ;
do
{
cin >> x ;
if(x < 0.0)
{
cout << "Error – Negative Value" << endl ;
break ;
}
sum += x ;
} while(x <= 1000.0);
cout << sum << endl ;
return 0 ;
}

Pr.rashidi@gmail.com 186
‫دستورالعمل ‪continue‬‬
‫از دس\تورالعمل ‪ continue‬مي‌ت\وان در دس\تورالعملهاي تك\رار‬
‫‪ do while ، while ، for‬اس\\تفاده نم\\ود‪ .‬اين دس\\تورالعمل‬
‫باعث مي‌شود كه كنترل بابتداي دستورالعملهاي تكرار منتقل گردد‪.‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪187‬‬
:1 ‫مثال‬

#include <iostream.h>
int main( )
{
float x, sum = 0.0 ;
Do
{
cin >> x ;
if(x < 0 . 0)
{
cout << "Error" << endl ;
continue ;
}
sum += x ;
} while(x <= 1000.0 );
cout << sum ;
return 0 ;
}

Pr.rashidi@gmail.com 188
:2 ‫مثال‬

#include <iostream.h>
int main( )
{
int n , navg = 0 ;
float x, avg, sum = 0 ;
cin >> n ; / * ‫ عبارت از تعداد اعداد ورودي‬n * /
for(int count = 1 ; count <=n; ++ count )
{
cin >> x ;
if(x < 0 )
continue ;
sum += x ;
++ navg ;
}
avg = sum / navg;
cout << avg << endl ;
return 0 ;
}

Pr.rashidi@gmail.com 189
‫دستورالعمل ‪switch‬‬
‫هم\انطور ک\ه می دانید از دس\تورالعمل ش\رطی(‪ )if else‬می ت\وان بص\ورت تودرت\و‬
‫اس\تفاده نم\ود ولي از ط\رفي اگ\ر عم\ق اس\تفادة ت\و در ت\و از اين دس\تورالعمل زياد‬
‫گ\ردد‪ ،‬درك آنه\ا مش\كل ميش\ود ‪ .‬ب\راي ح\ل اين مش\كل ‪ ، ++C‬دس\تورالعمل ‪switch‬‬
‫كه عمًال يك دستورالعمل چند انتخابي مي‌باشد را ارائه نموده است‪.‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪190‬‬
Switch ‫شکل کلی دستور العمل‬
switch(‫)عبارت‬
{
case valueone :
statement;
break;
case valuetwo:
statement;

break;

case valuen :
statement;
break;
default: statement ;
}

Pr.rashidi@gmail.com 191
1 ‫ مثال‬:
#include <iostream.h>
void main( )
{
unsigned int n ;
cin >> n;
switch(n)
{
case 0:
cout << "ZERO" << endl ;
break;
case 1:
cout << "one" << endl ;
break ;
case 2:
cout << "two" << endl ;
break;
default :
cout << "default" << endl;
} / * end of switch statement * /
}

Pr.rashidi@gmail.com 192
: 2 ‫مثال‬
#include <iostream.h>
void main( )
{
unsigned int n;
cin >> n ;
switch(n)
{
case 0 :
case 1:
case 2:
cout << "Less Than Three" << endl;
break;
case 3:
cout << "Equal To Three" << endl ;
break;
default:
cout << "Greater Than Three" << endl;
}
}

Pr.rashidi@gmail.com 193
‫تابع ‪: )(cin.get‬‬

‫اين تابع يك كركتر را از صفحه كليد‬


‫مي‌گيرد‪ .‬براي استفاده از اين تابع در‬
‫ابتداي برنامه بايستي داشته باشيم ‪:‬‬
‫‪#include‬‬ ‫>‪<iostream.h‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪194‬‬
‫قطعه برنامه ذيل يك كركتر را از صفحه كليد گرفته و نمايش مي‌دهد‪.‬‬

‫‪;char‬‬ ‫‪x‬‬
‫‪;) (x = cin.get‬‬
‫‪; cout << x‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪195‬‬
‫برنامة ذيل يك سطر متن انگليسي كه به ‪ CTRL Z‬ختم ميشود را گرفته دقيقاً‌ نمايش مي‌دهد‪.‬‬

‫‪#include‬‬ ‫>‪<iostream.h‬‬
‫) (‪int main‬‬
‫{‬
‫;‪char x‬‬
‫)‪while((x = cin.get( ) !=EOF‬‬
‫; ‪cout << x‬‬
‫; ‪return 0‬‬
‫}‬

‫‪ EOF‬ب\ه مع\ني ‪ End of File‬مي‌باش\د ك\ه در‬


‫‪ iostream.h‬تعريف ش\ده و مق\دار آن براب\ر ب\ا‬
‫‪ -1‬مي‌باش\\د‪ .‬مق\\دار آن در سيس\\تم عام\ل ‪DOS‬‬
‫عبارتست از ‪. ctrl z‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪196‬‬
.‫ استفاده شده است‬switch ‫() و دستور‬cin.get ‫در قطعه برنامه ذيل ازتابع‬

char x;
x = cin.get( );
switch(x)
{
case  r  :
case  R  :
cout << RED << \n ;
break ;
case  b  :
case  B  :
cout << BLUE << endl ;
break ;
cas e y:
case  Y  :
cout << YELLOW << endl;
}

Pr.rashidi@gmail.com 197
.‫) آنرا حذف نموده و نمايش ميدهد‬blank( ‫برنامة ذيل يك سطر متن انگليسي را گرفته كركترهاي خالي‬

#include <iostream.h>
int main( )
{
char next;
while((next = cin.get( ) ) !=EOF)
if(next !=   )
cout << next ;
return 0 ;
}

Pr.rashidi@gmail.com 198
‫عملگر ‪static_cast‬‬

‫از اين عملگر براي تبديل موقت يك نوع ‪ data‬به نوع ديگر‬
‫استفاده مي‌شود‪ .‬اين عملگر يك عملگر يكتائي مي‌باشد‪.‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪199‬‬
‫‪:‬مثال ‪1‬‬

‫‪int‬‬
‫‪int xx==25‬‬‫;;‪25‬‬
‫‪float‬‬
‫;;‪float yy‬‬
‫‪yy==static_cast‬‬
‫‪static_cast‬‬
‫‪<<float‬‬
‫)‪float>(x‬‬
‫;;)‪>(x‬‬

‫مق\دار ‪ x‬موقت\ًا بص\ورت اعش\اري در‬


‫می آيد و در نتيج\\ه مق\\دار ‪ y‬براب\\ر ب\\ا‬
‫‪ 25.0‬می ش\ود‪ .‬بايس\تي توج\ه داش\ت ك\ه‬
‫ن\\وع متغ\\ير ‪ x‬ع\\وض نمي ش\\ود بلك\\ه‬
‫موقت \ًا مق\\دار آن بص\\ورت اعش\\اري در‬
‫آمده است‪.‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪200‬‬
2 ‫مثال‬:

float
floatxx==14.75
14.75;;
cout
cout<<<<
static_cast
static_cast<<int
int
>(x)
>(x)<<
<<endl;
endl;
cout
cout<<<<xx;;

‫ نم\ايش داده ميش\ود و‬14 ‫ابت\دا مق\دار‬


‫ نم\\\\\ايش داده‬14.75 ‫س\\\\\پس مق\\\\\دار‬
.‫ميشود‬

Pr.rashidi@gmail.com 201
‫جدول اولویت عملگرها‬

‫(‬ ‫)‬ ‫چپ به راست‬


‫‪Static_cast < >( ) ++‬‬ ‫‪-- +‬‬ ‫‪- sizeof‬‬ ‫راست به چپ‬
‫‪* / %‬‬ ‫چپ به راست‬
‫‪+ -‬‬ ‫چپ به راست‬
‫<<‬ ‫>>‬ ‫چپ به راست‬
‫<‬ ‫=> > =<‬ ‫چپ به راست‬
‫==‬ ‫=!‬ ‫چپ به راست‬
‫?‬ ‫‪:‬‬ ‫راست به چپ‬
‫=‬ ‫=‪+‬‬ ‫=‪-‬‬ ‫=‪*= /= %‬‬ ‫راست به چپ‬
‫‪,‬‬ ‫چپ به راست‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪202‬‬
‫کوئیز ‪1‬‬

‫برنامه ای بنویسید که مقدار تابع فیبو ناچی را برای ‪ n‬دلخواه‬ ‫•‬


‫(از ورودی دریافت کند) محاسبه نماید‪.‬‬
‫)‪F(n)=F(n-1)+F(n-2‬‬ ‫•‬
‫‪F(1)=1‬‬ ‫•‬
‫‪F(2)=1‬‬ ‫•‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪204‬‬
‫فصل چهارم‬

‫اعداد تصادفی‬
‫فهرست مطالب فصل چهارم‬

‫تولید اعداد تصادفی‬ ‫‪.1‬‬


‫) ‪ ( typedef‬تعریف نوع داده‬ ‫‪.2‬‬
‫داده های از نوع شمارشی‬ ‫‪.3‬‬
‫فرمت های مختلفه مقادیر خروجی‬ ‫‪.4‬‬
‫اعداد تصادفی‬

‫مق\ادير تص\ادفي يا شانس\ي در اك\ثر برنامه‌ه\اي ك\اربردي در زمين\ه ش\بيه س\ازي و بازيه\اي‬
‫ك\\امپيوتري نقش مهمي را ايف\\ا مي‌نماين\\د‪ .‬ب\\راي ايج\\اد يك ع\\دد تص\\ادفي ص\\حيح بين ‪ 0‬و ‪32767‬‬
‫بايستي از تابع ‪ ) (rand‬استفاده نمائيم‪.‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪207‬‬
.‫ را ايجاد مي‌نمايد‬32767 ‫ و‬0 ‫ عدد تصادفي بين‬10 ‫برنامه زير‬

#include <stdlib.h>
#include < iostream.h>
int main( )
{
for(int j=1; j<=10; ++j)
cout << rand( ) << \n ;
return 0 ;
}

Pr.rashidi@gmail.com 208
‫نکته ‪:‬‬

‫اگر برنامة فوق را چندبار اجرا نمائيم جواب يكساني را از كامپيوتري‌می گيريم‪.‬‬
‫براي تصادفي كردن اعداد مي‌بايستي از تابع ‪ ) (srand‬استفاده نمائيم‪.‬‬
‫اين تابع به يك آرگومان صحيح از نوع ‪ unsigned‬نياز دارد‪.‬‬
‫به اين آرگومان ‪ seed‬گفته مي‌شود‪.‬‬

‫در اسالید بعد برنامه قبلی را با تابع ‪ ) (srand‬نوشته ایم‪.‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪209‬‬
) ) (srand ( .‫ را ايجاد مي‌نمايد‬32767 ‫ و‬0 ‫ عدد تصادفي بين‬10 ‫برنامه زير‬

#include <stdlib.h>
#include < iostream.h>
int main( )
{
unsigned seed;
cout << "Enter seed value : " ;
cin >> seed ;
srand(seed);
for(int j=1; j<=10; ++j)
cout << rand( ) <<  \n ;
return 0 ;
}

Pr.rashidi@gmail.com 210
.‫برنامه زير نتيجه پرتاب دو تاس را نمايش مي‌دهد‬

#include < iostream.h>


#include <stdlib.h>
int main( )
{
unsigned seed, d1, d2;
cout << "Enter seed: " ;
cin >> seed ;
srand(seed) ;
d1= 1+rand( )% 6 ;
d2= 1+rand( )% 6 ;
cout << d1 <<  << d2 ;
return 0 ;
}

Pr.rashidi@gmail.com 211
.‫ را نمايش مي‌دهد‬1 ‫ و‬0 ‫ اعداد شانسي بين‬10 ‫برنامه زير‬

#include <stdlib.h>
#include < iostream.h>
int main( )
{
unsigned seed ;
cout << "Enter seed: " ;
cin >> seed ;
srand(seed) ;
for(int i=1; i<=10; ++i)
cout << rand( ) / 32768.0 << endl ;
return 0 ;
}

Pr.rashidi@gmail.com 212
‫تعريف نوع داده (‪)typedef‬‬
‫از ‪ typedef‬مي‌ت\\وان ب\\راي تعريف ن\\وع داده‌ه\\اي جديد ك\\ه مع\\ادل ن\\وع‬
‫داده‌هاي موجود باشد استفاده نمود‪ .‬شكل كلي عبارتست از ‪:‬‬

‫‪typedef‬‬ ‫‪type‬‬ ‫;‪newtype‬‬

‫نشاندهنده نوع داده موجود‬ ‫اسم جديد‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪213‬‬
: ‫مثال‬

;typedef int integer

: ‫ را بصورت زير تعريف نمود‬x ‫ و‬y ‫حال مي‌توان‬


;integer x,y

Pr.rashidi@gmail.com 214
‫داده‌هاي از نوع شمارشي‬

‫بمنظور معرفي داده‌هاي از نوع شمارشي از كلمه ‪ enum‬استفاده مي‌گردد‪.‬‬


‫مثال ‪:‬‬
‫‪0‬‬ ‫‪1‬‬ ‫‪2‬‬ ‫‪3‬‬ ‫‪4‬‬

‫; }‪enum color {red, blue, green, yellow, brown‬‬

‫‪ color‬يك نوع داده شمارشي مي‌باشد‪.‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪215‬‬
‫ چند مثال‬:

;emum status {married, devorced, vidow, single}


; status a
; a= single

enum days {sat, sun, mon, tue, wed, thr, fri};

enum bread {lavash, fantezi, taftoon, barbari};

enum color { yellow, red=2, brown, white };


color x=brown;

0 3 4

Pr.rashidi@gmail.com 216
‫‪ :‬توجه‬

‫بايس\تي در نظ\ر داش\ت ك\ه داده‌ه\اي از‬


‫ن\\\وع شمارش\\\ي در عملي\\\ات ورودي و‬
‫خ\\\روجي ش\\\ركت نمي‌نماين\\\د‪ .‬بعب\\\ارت‬
‫ديگ\ر مق\ادير داده‌ه\اي از ن\وع شمارش\ي‬
‫بايس\\\\تي در برنام\\\\ه تع\\\\يين نم\\\\ود‪.‬‬
‫دس\تورالعلهاي ورودي و خ\روجي مانن\د‬
‫‪ cin‬و ‪ cout‬در م\\\\\\\ورد داده‌ه\\\\\\\اي‬
‫شمارشي نمي‌توان استفاده نمود‪.‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪217‬‬
‫فرمتهای مختلفه مقادیر خروجی‬

‫مقدار ‪ x‬بطور غیر علمی با نقطه اعشار ثابت نمایش داده‬


‫می شود‪.‬‬

‫‪; double x=1050‬‬


‫)‪cout << setiosflags(ios : : fixed | ios: : showpoint ) << setw(23‬‬
‫‪; << setprecision(2) << x << endl‬‬

‫مقدار ‪ x‬با طول میدان ‪ 23‬نمایش داده می شود‪.‬‬


‫مقدار ‪ x‬با دو رقم اعشار نمایش داده می شود‪.‬‬

‫بنابراین مقدار ‪ x‬بصورت زیر نمایش داده می شود ‪:‬‬

‫شانزده ستون خالی ‪1050.00‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪218‬‬
‫فصل پنجم‬

‫آرایه ها‬
‫فهرست مطالب فصل پنجم‬

‫آرایه یک بعدی‬ ‫‪.1‬‬


‫آرایه دو بعدی ( ماتریس ها )‬ ‫‪.2‬‬
‫آرایه یک بعدی‬

‫آرايه يك فضاي پيوسته از حافظه اصلي كامپيوتر مي‌باشد كه مي‌تواند‬


‫چندين مقدا را در خود جاي دهد‪.‬‬

‫كليه عناصر يك آرايه از يك نوع مي‌باشند‪.‬‬

‫عناصر آرايه بوسيله انديس آنها مشخص مي‌شوند‪.‬‬

‫در ‪ ، ++C‬انديس آرايه از صفر شروع مي‌شود‪.‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪221‬‬
‫کاربرد آرایه ها‬

‫آرايه‌ها در برنامه‌نويسي در مواردي كاربرد دارند كه‬


‫بخواهيم اطالعات و داده‌ها را در طول اجراي‬
‫‪.‬برنامه حفظ نمائيم‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪222‬‬
‫]‪; int x[5‬‬

‫‪x‬‬

‫‪0‬‬ ‫‪1‬‬ ‫‪2‬‬ ‫‪3‬‬ ‫‪4‬‬

‫اولين عنصر ]‪x[0‬‬


‫پنجمين عنصر ]‪x[4‬‬
‫تخصیص مقادیر اولیه به عناصر آرایه ‪:‬‬

‫}‪;int x[5]= {4, 2, 5, 17, 30‬‬

‫‪x‬‬
‫‪4‬‬ ‫‪2‬‬ ‫‪5‬‬ ‫‪17‬‬ ‫‪30‬‬
‫‪0‬‬ ‫‪1‬‬ ‫‪2‬‬ ‫‪3‬‬ ‫‪4‬‬
: ‫دریافت مقادیر عناصر آرایه‬

;int x[5]
for(int i=0; i<=4; ++i)
; cin >> x[ i ]

: ‫نمایش مقادیر عناصر آرایه‬

for(int i=0; i<5; ++i) cout << x[ i ] ;

Pr.rashidi@gmail.com 225
‫‪.‬اگر تعداد مقادير اوليه كمتر از تعداد عضوهاي آرايه باشد عضوهاي باقيمانده بطور اتوماتيك‪ ،‬مقدار اوليه صفر مي‌گيرند‬

‫}‪;int x[5] = {12, 5, 7‬‬

‫‪x‬‬
‫‪12‬‬ ‫‪5‬‬ ‫‪7‬‬ ‫‪0‬‬ ‫‪0‬‬
‫‪0‬‬ ‫‪1‬‬ ‫‪2‬‬ ‫‪3‬‬ ‫‪4‬‬
‫بايستي توجه داشت كه آرايه‌ها به صورت ضمني مقدار اوليه صفر نمي‌گيرند‪ .‬برنامه نويس بايد به عضو اول آرايه‪،‬‬
‫مقدار اوليه صفر تخصيص دهد تا عضوهاي باقي‌مانده بطور اتوماتيك‪ ،‬مقدار اوليه صفر بگيرند‪.‬‬

‫}‪; int x[5] = {0‬‬

‫‪x‬‬
‫‪0‬‬ ‫‪0‬‬ ‫‪0‬‬ ‫‪0‬‬ ‫‪0‬‬
‫‪0‬‬ ‫‪1‬‬ ‫‪2‬‬ ‫‪3‬‬ ‫‪4‬‬
‫دستور زير يك آرايه يك بعدي شش عنصري از نوع ‪ float‬ايجاد مي‌نمايد‪.‬‬

‫}‪; float x[ ] = {2.4, 6.3, -17.1, 14.2, 5.9, 16.5‬‬

‫‪x‬‬
‫‪2.4‬‬ ‫‪6.3‬‬ ‫‪-17.1‬‬ ‫‪14.2‬‬ ‫‪5.9‬‬ ‫‪16.5‬‬
‫‪0‬‬ ‫‪1‬‬ ‫‪2‬‬ ‫‪3‬‬ ‫‪4‬‬ ‫‪5‬‬
‫ عدد اعشاري و مثبت را گرفته تشكيل يك آرايه ميدهد سپس مجموع عناصر آرايه را مشخص نموده‬100 ‫برنامه ذيل‬
.‫نمايش مي‌دهد‬

#include <iostream.h>
#include <iomanip.h>
int main( )
{
const int arrsize = 100 ;
float x[ arrsize], tot = 0.0 ;
for(int j=0; j<arrsize; j++)
cin >> x[ j ];
for(j=0; j<arrsize; j++)
cout << setiosflags(ios::fixed ios :: showpoint ) << setw(12) <<
setprecision(2) << x[ j ] << endl;
for(j=0; j<arrsize; j++)
tot += x[ j ] ;
cout << tot ;
return 0 ;
}

Pr.rashidi@gmail.com 229
‫ عدد اعشاري را گرفته تشكيل يك آرايه داده سپس كوچكترين عنصر آرايه را مشخص و‬20 ‫برنامه ذيل‬
.‫نمايش مي‌دهد‬

#include <iostream.h>
#include <conio.h>
int main( )
{
float x[20], s;
int j ;
clrscr( ) ;
for(j=0; j<20 ; ++j)
cin >> x[ j ];

s = x[0 ] ;
for(j=1; j<20; ++j)
if(x[ j] <s)
s = x[ j ];
cout << s << endl;
return 0;
}

Pr.rashidi@gmail.com 230
.‫ عدد اعشاري را گرفته بروش تعویضی بصورت صعودي مرتب مي‌نمايد‬100
‌ ‫برنامه زير‬

#include <iostream.h>
#include <conio.h>
int main ( )
{
float x[100] , temp;
int i,j ;
clrscr( );
for(i=0; i<100; ++i)
cin >> x[i ];
for(i=0; i<99; i++)
for(j=i+1 ; j<100; j++)
if(x[ j ] < x[i ]
{
temp = x[ j ] ;
x[ j ] = x[ i ];
x[ i ] = temp ;
}
for(i=0; i<=99; i++)
cout << x[ i ] << endl;
return 0 ;
}

Pr.rashidi@gmail.com 231
‫تمرین برنامه نویسی (‪)4‬‬

‫• الف ) برنامه ای بنویسید که اعدادی را از ورودی خوانده و تشخیص دهد‬


‫که آیا عدد مورد نظر کامل است و یا نه ؟ ”عددی کامل است که مجموع‬
‫مقسوم علیه های آن عدد (به جز خودش) برابر با آن عدد باشد“ ‪ .‬پس از‬
‫بررسی هر عدد برنامه باید از کاربر بخواهد که می خواهد به کارش ادامه‬
‫دهد و یا نه ؟ (یکشنبه هفته بعد)‬
‫• برنامه ای بنویسید که شماره دانشجویی ‪ ،‬نام دانشجویان و معدل دیپلم ‪n‬‬
‫دانشجو را گرفته و ذخیره نماید‪ .‬سپس منوی را به کاربر نمایش دهد که‬
‫شامل موارد زیر باشد (یک شنبه دو هفته بعد)‪.‬‬
‫‪ ) a‬چاپ لیست دانشجویان (شماره ‪ -‬نام ‪ -‬معدل)‬ ‫–‬
‫‪ ) B‬محاسبه معدل دانشجویان‬ ‫–‬
‫‪ )C‬چاپ لیست دانشجویان دارای معدل باالی ‪15‬‬ ‫–‬
‫‪ ) D‬محاسبه میانگین دانشجویان دارای معدل بین ‪ 12‬تا ‪16‬‬ ‫–‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪232‬‬
‫آرايه‌هاي دوبعدي (ماتريس‌ها)‬
‫ماتريسها بوسيله آرايه‌هاي دوبعدي در كامپيوترنمايش داده ميشوند‪.‬‬

‫;]‪int a[3][4‬‬

‫‪0‬‬ ‫ستون‬ ‫‪1‬‬ ‫ستون‬ ‫‪2‬‬ ‫ستون‬ ‫‪3‬‬ ‫ستون‬

‫‪0‬‬ ‫سطر‬ ‫]‪a[0][0‬‬ ‫]‪a[0][1‬‬ ‫]‪a[0][2‬‬ ‫]‪a[0][3‬‬


‫‪1‬‬ ‫سطر‬ ‫]‪a[1][0‬‬ ‫]‪a[1][1‬‬ ‫]‪a[1][2‬‬ ‫]‪a[1][3‬‬
‫‪2‬‬ ‫سطر‬ ‫]‪a[2][0‬‬ ‫]‪a[2][1‬‬ ‫]‪a[2][2‬‬ ‫]‪a[2][3‬‬
‫تخصیص مقادیر اولیه به عناصر آرایه ‪:‬‬

‫} }‪; int a[3][4]={ {1,2,3,4}, {5,6,7,8}, {9,10,11,12‬‬

‫‪0‬‬ ‫‪1‬‬ ‫‪2‬‬ ‫‪3‬‬

‫‪0‬‬ ‫‪1‬‬ ‫‪2‬‬ ‫‪3‬‬ ‫‪4‬‬


‫‪1‬‬ ‫‪5‬‬ ‫‪6‬‬ ‫‪7‬‬ ‫‪8‬‬
‫‪2‬‬ ‫‪9‬‬ ‫‪10‬‬ ‫‪11‬‬ ‫‪12‬‬
; int a[3][4]= { {1}, {2,3} , {4,5,6} }

0 1 2 3

0 1 0 0 0
1 2 3 0 0
2 4 5 6 0
; int a[3][4]= {1, 2, 3, 4,5 }

0 1 2 3

0 1 2 3 4
1 5 0 0 0
2 0 0 0 0
‫در يك آراية دوانديسي‪ ،‬هر سطر‪ ،‬در حقيقت آرايه‌اي يك انديسي است‪ .‬در‬
‫اعالن آرايه‌هاي دوانديسي ذكر تعداد ستونها الزامي است‪.‬‬

‫;}‪int a[ ][4]={1,2,3,4,5‬‬

‫‪0‬‬ ‫‪1‬‬ ‫‪2‬‬ ‫‪3‬‬

‫‪0‬‬ ‫‪1‬‬ ‫‪2‬‬ ‫‪3‬‬ ‫‪4‬‬


‫‪1‬‬ ‫‪5‬‬ ‫‪0‬‬ ‫‪0‬‬ ‫‪0‬‬
.‫ را گرفته مجموع عناصر آن را مشخص نموده و نمايش مي‌دهد‬4*3 ‫برنامه زير يك ماتريس‬

#include <iostream.h>
#include <conio.h>
int main( )
{
float x[3][4], total= 0.0;
int i, j ;
// generate matrix x.
for(i=0; i<3; ++i)
for (j=0; j<4; j++)
cin >> x[ i ][ j ];
// calculate the sum of elements.
for(i=0; i<3; ++i)
for(j=0; j<4; j++)
tot + = x [ i ][ j ];
cout << "total = " << total << endl;
return 0 ;
}

Pr.rashidi@gmail.com 238
‫مثال کالسی‬

‫• برنامه ای بنویسید که شماره کارمندان و سن آنها را از ورودی‬


‫دریافت نموده و سپس‬
‫– بر اساس سن شماره کارمندان را مرتب نماید‬
‫– میانگین سن کارمندان را محاسبه نماید‪.‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪239‬‬
‫تمرین برنامه نویسی(‪)5‬‬

‫• برنامه ای بنویسید که نام دانشجویان‪ ،‬سن آنها‪ ،‬سال تولد‪ ،‬معدل‬


‫دیپلم دانشجویان یک کالس ‪ 50‬نفری را از ورودی دریافت‬
‫نموده و در آرایه های مناسبی دخیره نمایدو سپس ‪:‬‬
‫چاپ اطالعات دانشجو شامل (نام‪ ،‬سن ‪ ،‬تولد‪ ،‬معدل)‬ ‫–‬
‫محاسبه میانگین سن‪ ،‬دیپلم‬ ‫–‬
‫محاسبه انحراف از میانگین سن و معدل و چاپ آنها‬ ‫–‬
‫مرتب سازی بر اساس‬ ‫–‬
‫• نام ‪ ،‬سال تولد‪ ،‬معدل ‪،‬‬
‫– محاسبه تعداد دانشجویان دارای معدل ‪A,B,C,D,F‬‬
‫– سال خاصی را از ورودی دریافت نموده و اطالعات دانشجویانی که‬
‫سال تولدشان با ورودی برابر است را چاپ نماید‪.‬‬
‫‪Pr.rashidi@gmail.com‬‬ ‫‪240‬‬
‫فصل ششم‬

‫توابع‬
‫فهرست مطالب فصل ششم‬

‫تعریف تابع‬ ‫‪.1‬‬


‫تابع بازگشتی‬ ‫‪.2‬‬
‫توابع درون خطی‬ ‫‪.3‬‬
‫انتقال پارامترها از طریق ارجاع‬ ‫‪.4‬‬
‫) ‪ ( storage classes‬کالس های حافظه‬ ‫‪.5‬‬
‫سربارگذاری توابع‬ ‫‪.6‬‬
‫تعریف توابع‬

‫اس\تفاده از تواب\ع در برنامه‌ه\ا ب\ه برن\امه‌نويس اين امك\ان را مي‌ده\د ك\ه‬


‫بتوان\د برنام ‌هه\اي خ\ود را ب\ه ص\ورت قطع\ه قطع\ه برنام\ه بنويس\د‪ .‬ت\ا كن\ون‬
‫كليه برنامه‌هائي كه نوشته‌ايم فقط از تابع ‪ ) (main‬استفاده نموده‌ايم‪.‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪243‬‬
‫نوع مقدار برگشتي‬
‫شكل كلي توابع بصورت زير مي‌باشند ‪:‬‬

‫لیست پارامتر ها جهت انتقال اطالعات از تابع احضار كننده به تابع فراخوانده شده‬

‫‪return-value-type function-name (parameter-‬‬


‫)‪list‬‬
‫{‬

‫‪declaration and statements‬‬

‫نام تابع‬

‫}‬

‫تعريف اعالن‌هاي تابع و دستورالعملهاي اجرائي‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪244‬‬
‫‪.‬تابع زير يك حرف كوچك را به بزرگ تبديل مي‌نمايد‬

‫نوع مقدار برگشتی‬


‫پارامتری از نوع ‪char‬‬
‫نام تابع‬

‫)‪char low_to_up (char c1‬‬


‫{‬
‫‪;char c2‬‬
‫‪;c2 = (c1>=  a  && c1<=  z )?( A  + c1-  a ): c1‬‬
‫; )‪return (c2‬‬
‫}‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪245‬‬
.‫برنامه کامل که از تابع قبل جهت تبدیل يك حرف كوچك به بزرگ استفاده مي‌نمايد‬

#include <iostream.h>
char low_to_up(char c1)
{ x
char c2;
c2=(c1 >=  a  && c1 <=  z )?( A  +c1 - a ) :
‘d’
c1;
return c2;
}
int main( )
{
char x;
c1
x=cin.get( ); ‘d’
cout << low_to_up(x) ;
return 0;
}

c2
‘D’

‫آرگومان‬
.‫ دو مقدار صحيح را گرفته بزرگترين آنها را برميگرداند‬maximum ‫تابع‬

int maximum(int x, int y)


{
int z ;
z=(x >= y)? x : y;
return z;
}

Pr.rashidi@gmail.com 247
.‫ جهت یافتن ماکزیمم دو مقدار صحيح استفاده می نماید‬maximum ‫برنامه کامل که از تابع‬

#include <iostream.h>
int maximum(int x , int y)
{ a b
int z ; 10 15
z=(x > y)? x : y ;
return z;
}
int main( ) x y
{
int a, b ; 10 15
cin >> a >> b ;
cout << maximum(a,b);
return 0;
}
z
15
maximum ‫ آرگومانهای تابع‬a, b
‫فعالیت کالسی ‪:‬‬

‫‪ .1‬برنامه ای بنویسید که ‪ 10‬عدد را از ورودی دریا فت نموده و با‬


‫استفاده از تابع ‪ calcavg‬میانگین آنرا محاسبه و برگرداند‪ .‬سپس‬
‫برنامه مقدار میانگین را چاپ نماید‪.‬‬
‫‪ .2‬برنامه ای بنویسید که ‪ 20‬عدد را از ورودی دریافت نموده و با استفاده‬
‫از تابع فاکتوریل ‪ ،‬مقدار فاکتوریل هر کدام را محاسبه و چاپ نماید‪.‬‬
‫اسامي پارامترها و آرگومانهاي يك تابع‬
‫‪.‬مي‌توانند همنام باشند‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪250‬‬
‫برنامه زير يك مقدار مثبت را گرفته فاكتوريل آنرا محاسيه نموده نمايش مي‌دهد‬.

x!=1*2*3*4*…*(x-1)*x

#include <iostream.h>
long int factorial(int n)
main ‫ در‬n
{ 3
long int prod=1;
if(n>1)
for(int i=2; i<=n; ++i)
prod *=i;
return(prod); factorial ‫ در‬n
}
int main( ) 3
{
int n;
cin >> n ; factorial ‫ در‬i
cout << factorial(n) ;
return 0 ; 2,3,4
}

factorial ‫ در‬prod
6
‫وقتي در تابعي‪ ،‬تابع ديگر احضار مي‌گردد‬
‫بايستي تعريف تابع احضار شونده قبل از تعريف‬
‫‪.‬تابع احضار كننده در برنامه ظاهر گردد‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪252‬‬
‫اگ\ر بخ\واهیم در برنامه‌ه\ا ابت\دا ت\ابع ‪ main‬ظ\اهر‬
‫گ\ردد بايس\تي ‪ prototype‬ت\ابع يع\ني پيش نمون\ة‬
‫ت\ابع ك\ه ش\امل ن\ام ت\ابع‪ ،‬ن\وع مق\دار برگش\تي ت\ابع‪،‬‬
‫تع\داد پارامتره\ائي را ك\ه ت\ابع انتظ\ار دريافت آن\را‬
‫دارد و ان\\واع پارامتره\\ا و ت\\رتيب قرارگ\\رفتن اين‬
‫پارامترها را به اطالع كامپيلر برساند‪.‬‬

‫در اسالید بعد مثالی در این زمینه آورده شده است‪.‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪253‬‬
#include <iostream.h>
#include <conio.h>
long int factorial(int); // function prototype
int main( )
{
int n;
cout << "Enter a positive integer" << endl;
cin >> n;
cout << factorial(n) << endl;
return 0 ;
}
long int factorial(int n)
{
long int prod = 1;
if(n>1)
for(int i=2; i<=n; ++i)
prod *= i;
return(prod);
}

Pr.rashidi@gmail.com 254
‫در ص\\ورتي ك\\ه ت\\ابع مق\\داري ب\\ر نگردان\\د ن\\وع‬
‫مق\\دار برگش\\تي ت\\ابع را ‪ void‬اعالن مي‌ك\\نيم‪ .‬و‬
‫در ص\ورتيكه ت\ابع مق\داري را دريافت نكن\د بج\اي‬
‫‪ parameter- list‬از ‪ void‬يا ( ) اس\\\\تفاده‬
‫ميگردد‪.‬‬

‫در اسالید بعد مثالی در این زمینه آورده شده است‪.‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪255‬‬
#include <iostream.h>
#include <conio.h>
void maximum(int , int) ;
int main( )
{
int x, y;
clrscr( )
cin >> x >> y;
maximum(x,y);
return 0; .‫تابع مقداري بر نمی گرداند‬
}
void maximum(int x, int y)
{
int z ;
z=(x>=y) ? x : y ;
cout << "max value \n" << z<< endl;
return ;
}

Pr.rashidi@gmail.com 256
‫مطالب مهم‬

‫نحوه تخصیص فضا هنگام فراخوانی یک تابع‬ ‫•‬


‫‪ Scope‬یک متغیر در برنامه و تابع‬ ‫•‬
‫متغیر های سراسری و محلی‬ ‫•‬
‫نحوه فراخوانی و انتقال پارمترها به یک تابع‬ ‫•‬
‫– فراخوانی با مقدار‬
‫– فراخوانی با آدرس (ارجاع)‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪257‬‬
) Call By Value ( ‫احضار بوسیله مقدار‬
main ‫ در‬a
#include <iostream.h>
int modify(int) 20
int main( )
{
int a=20; modify ‫ در‬a
cout << a << endl;
modify(a) ; 20
cout << a << endl;
return 0 ;
} modify ‫ در‬a
int modify(int a)
{ 40
a *= 2;
cout << a << endl;
return ; : ‫خروجی برنامه‬
} 20
40
20
‫احضار بوسیله مقدار ( ‪) Call By Value‬‬
‫‪main‬‬ ‫‪ a‬در‬
‫>‪#include <iostream.h‬‬
‫)‪int modify(int‬‬ ‫‪20‬‬
‫) (‪int main‬‬
‫{‬
‫;‪int a=20‬‬ ‫‪modify‬‬ ‫‪ a‬در‬
‫;‪cout << a << endl‬‬
‫; )‪modify(a‬‬ ‫‪20‬‬
‫;‪cout << a << endl‬‬
‫; ‪return 0‬‬
‫}‬ ‫‪modify‬‬ ‫‪ a‬در‬
‫)‪int modify(int a‬‬
‫{‬ ‫‪40‬‬
‫;‪a *= 2‬‬
‫;‪cout << a << endl‬‬
‫; ‪return‬‬ ‫در این ن\وع احض\ار ت\ابع حافظه‌ه\اي م\ورد اس\تفاده‬
‫}‬ ‫آرگومانه\\\\\\\\\\\\\\\\\\\\\\ا و پارامتره\\\\\\\\\\\\\\\\\\\\\\ا‬
‫از هم متمايزن\\د و هرگون\\ه تغي\\ير در پارامتره\\ا‬
‫باعـــث تغيـــر‬
‫در آرگومانهاي متناظر نمي‌گردد‪.‬‬
‫هر زم\\ان ک\\ه ن\\وع مق\\دار برگش\\تي ت\\ابع ‪int‬‬
‫مي‌باش\د ني\ازي ب\ه ذك\ر آن نیس\ت و همچ\نين ني\ازي‬
‫به تعريف پيش نمونه تابع نمي‌باشد‪.‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪260‬‬
‫تابع بازگشتي (‪)recursive functions‬‬

‫توابع بازگشتي يا ‪ recursive‬توابعي هستند كه‬


‫وقتي احضار شوند باعث مي‌شوند كه خود را احضار نمايند‪.‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪261‬‬
‫نحوه محاسبه فاکتوریل از طریق تابع بازگشتی‬
‫‪n != 1*2*3*…*(n-1) *n‬‬

‫! ‪f(n) = n‬‬

‫‪1‬‬ ‫اگر ‪n=0‬‬


‫= )‪f(n‬‬ ‫)‪n *f(n-1‬‬ ‫در غير اينصورت‬

‫‪n!= 1* 2* 3* … *(n-2) *(n-‬‬


‫‪1) *n‬‬

‫‪n!=(n-1)! *n‬‬

‫در اسالید بعد تابع بازگشتی مورد نظر پیاده سازی شده است‪.‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪262‬‬
‫تابع بازگشتی محاسبه فاکتوریل‬

#include <iostream.h>
long int factorial(int) ;
int main( )
{
int n ;
cout <<  n=  ;
cin >> n ;
cout << endl <<  factorial =  << factorial(n) << endl;
return 0 ;
}
long int factorial(int n)
{
if(n<=1)
return(1);
else
return(n *factorical(n-1) ) ;
}

Pr.rashidi@gmail.com 263
‫نحوه محاسبه ‪ n‬امین مقدار دنباله فیبو ناچی از طریق تابع بازگشتی‬

‫‪ … ,34 , 21 ,13 ,8 ,5 ,3 ,2 ,1 ,1‬دنباله فیبناکی ‪:‬‬

‫‪n=1‬‬ ‫اگر ‪1‬‬


‫=)‪ =fib(n‬جمله ‪ n‬ام‬
‫‪n=2‬‬ ‫اگر ‪1‬‬

‫)‪fib(n-1)+fib(n-2‬‬ ‫در غير اينصورت‬

‫در اسالید بعد تابع بازگشتی مورد نظر پیاده سازی شده است‪.‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪264‬‬
.‫) را مشخص و نمايش مي‌دهد‬fibonacci( ‫ امين مقدار دنبالة فيبو ناچي‬n ‫برنامه‌زير‬
#include <iostream.h>
long int fib(long int); // forward declaration
int main( )
{
long int r ;
int n ;
cout <<  Enter an integer value  << endl ;
cin >> n ;
r = fib(n) ;
cout << r << endl ;
return 0 ;
}
long int fib(long int n)
{
if(n = = 1 || n= = 2)
return 1 ;
else
return(fib(n-1) + fib(n-2) ) ;
}

Pr.rashidi@gmail.com 265
.‫برنامه زير يك خط متن انگليسي را گرفته آنرا وارون نموده نمايش مي‌دهد‬

#include <iostream.h>
void reverse(void) ; // forward declaration
int main( )
{
reverse( ) ;
return 0 ;
}
void reverse(void)
// read a line of characters and reverse it
{
char c ;
if(( c=cin.get( )) !=  \n ) reverse( );
cout << c ;
return ;
}

Pr.rashidi@gmail.com 266
‫استفاده از آرايه‌ها بعنوان پارامتر تابع مجاز است‪.‬‬

‫در اسالید بعد به یک مثال توجه نمایید‪.‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪267‬‬
.‫ را بعنوان پارامتر مي‌گيرد‬a ‫ آرايه‬modify ‫در برنامه زير تابع‬
#include <iostream.h>
void modify(int [ ] ); // forward declaration
int main( )
{
int a[5] ; ‫ خروجی‬:
for(int j=0; j<=4; ++j) 1
a[ j ] = j+1 ;
modify(a) ; 2
for(j=0; j<5; ++j) 3
cout << a[ j ] << endl ; 4
return 0 ;
}
5
void modify(int a[ ]) // function definition
{ 3
for(int j=0; j<5; ++j) 4
a[ j ] += 2 ;
for(j=0; j<5; ++j) 5
cout << a[ j ] << endl ; 6
return ; 7
}

Pr.rashidi@gmail.com 268
‫در ص\\ورتيكه آرايه بيش از يك بع\\د داش\\ته باش\\د‬
‫بع\دهاي دوم ب\ه بع\د بايس\تي در تعريف ت\ابع و پيش‬
‫نمونه تابع ذكر گردد‪.‬‬

‫در اسالید بعد به یک مثال توجه نمایید‪.‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪269‬‬
#include <iostream.h>
void printarr(int [ ][ 3 ]);
int main( )
{
int arrl [2][3] = { {1,2,3}, {4,5,6} };
arr2 [2][3]= {1,2,3,4,5};
arr3 [2][3]={ {1,2}, {4} };
printarr(arr1);
cout << endl ;
printarr(arr2);
cout << endl ;
printarr(arr3);
return 0 ;
}
void printarr(int a[ ][3] )
{
for(int i=0; i<2; i++)
{
for(int j=0; j<3; j++)
cout << a[ i ][ j ]
<<  ;
cout << endl ;
} : ‫خروجی‬
}
1 2 3
4 5 6
1 2 3
4 5 0
1 2 0
4 0 0
‫توابع درون خطي (‪)inline‬‬

‫كلم\ه ‪ inline‬ب\دين مع\ني اس\ت ك\ه ب\ه ك\امپيلر دس\تور مي‌ده\د ك\ه‬
‫يك ك\پي از دس\تورالعلمهاي ت\ابع در هم\ان ج\ا (در زم\ان مقتض\ي)‬
‫توليد نمايد تا از احضار تابع ممانعت بعمل آورد‪.‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪271‬‬
‫اشکال توابع ‪inline‬‬

‫بجاي داشتن تنها يك كپي از تابع ‪ ،‬چند كپي از دستورالعملهاي تابع در‬
‫برنامه اضافه مي‌شود كه باعث بزرگ شدن اندازه يا طول برنامه مي‌شود‪.‬‬
‫بنابراين از ‪ inline‬براي توابع كوچك استفاده مي‌گردد‪.‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪272‬‬
‫مثالی از توابع درون خطی‬
#include <iostream.h>
inline float cube(const float s) {return s*s*s; }
int main( )
{
float side ;
cin >> side ;
cout << side << cube(side) << endl ;
return 0 ;
}

Pr.rashidi@gmail.com 273
‫انتقال پارامترها از طريق ارجاع‬

‫تاكنون وقتي تابعي را احضار مي‌كرديم يك كپي از مقادير آرگومانها درپارامترهاي متناظر‬
‫قرار مي‌گرفت ‪ .‬این روش احضار بوسيله مقدار يا ‪ call by value‬ناميده شد‪.‬‬
‫در انتقال پارامترها از طريق ارجاع در حقيقت حافظه مربوط به آرگومانها و پارامترهاي متناظر‬
‫بصورت اشتراكي مورد استفاده قرار مي‌گيرد‪ .‬اين روش ‪call by reference‬‬
‫ناميده مي‌شود ‪.‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪274‬‬
‫انتقال پارامترها از طريق ارجاع‬

‫در اين روش پارامترهائي كه از طريق ‪ call by reference‬عمل مي‌نمايند در‬


‫پيش نمونه تابع قبل از نام چنين پارامترهائي از & استفاده مي‌شود‪.‬واضح است‬
‫كه در تعريف تابع نيز بهمين طريق عمل مي‌شود‪.‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪275‬‬
#include <iostream.h>
int vfunct(int); // for
void rfunct (int &) ;
int main( ) : ‫مثال‬
{ x y
int x=5, y=10; 5 10
cout << x << endl << vfunct(x) << endl << x <<
endl ; 5
cout << y << endl ; ‫ خروجی‬:
rfunct(y) ; 2
cout << y << endl ; .‫ تغییر نمی کند‬x ‫مقدار آرگومان‬ 5
return 0 ; 5
} 1
int vfunct(int a) 0
{
return a *= a ;
} x y b
void rfunct(int &b)
{ 5 10 100
b *= b ;
}
: ‫ادامه خروجی‬

100
‫نکته ‪:‬‬

‫وق\\تي پ\\ارامتري بص\\ورت ‪call by reference‬‬


‫اعالن مي‌گ\\ردد اين ب\\دان مع\\ني اس\\ت ك\\ه ب\\ا تغي\\ير‬
‫مق\\دار اين پ\\ارامتر در ت\\ابع احض\\ار ش\\ده مق\\دار‬
‫آرگومان متناظر نيز تغيير مي‌نمايد‪.‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪277‬‬
.‫ دو مقدار اعشاري را مبادله مي‌نمايد‬fswap ‫برنامه‌زير با استفاده از‬
#include <iostream.h>
void fswap(float & , float & );
int main( )
{
float a=5.2, b=4.3;
cout << a << endl << b ;
fswap( a , b) ;
cout << a << endl << b ;
return 0 ;
}
void fswap(float &x , float & y)
{
float t;
t=x;
x=y;
y=t;
}

Pr.rashidi@gmail.com 278
‫كالس‌هاي حافظه (‪)storage classes‬‬

‫متغيرها بدو طريق متمايز مشخص مي‌شوند يكي بوسيله نوع (‪ )type‬آنها و ديگري بوسيله‬
‫كالس حافظه آنها‪ .‬نوع متغير قبًال اشاره شده بعنوان مثال ‪ . . . ، int ، float ، double‬ولي‬
‫كالس حافظة يك متغير در مورد طول عمر و وسعت و دامنة متغير بحث مي‌نمايد‪.‬‬

‫در اسالید بعد به انواع کالس حافظه می پردازیم‪.‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪279‬‬
‫ بطور كلي كالس حافظه متغيرها به چهار دستة تقسيم مي‌گردد‬:

automatic .1
static .2
external .3
register .4

Pr.rashidi@gmail.com 280
‫متغيره\اي ‪ automatic‬در درون يك ت\ابع تعريف مي‌ش\وند و در ت\ابعي ك\ه اعالن‬
‫مي‌ش\ود بص\ورت متغيره\اي محلي ب\راي آن ت\ابع مي‌باش\ند‪ .‬حافظ\ه تخص\يص داده ش\ده‬
‫ب\ه متغيره\اي ‪ automatic‬پس از اتم\ام اج\راي ت\ابع از بين مي رود بعب\ارت ديگ\ر‬
‫وس\عت و دامن\ة متغيره\اي از ن\وع ‪ automatic‬ت\ابعي مي‌باش\د ك\ه متغ\ير در آن‬
‫اعالن گرديده است‪.‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪281‬‬
‫متغيرهاي ‪ static‬نيز در درون توابع تعريف ميشوند و از نظر وسعت و دامنه شبيه‬
‫متغيرهاي ‪ automatic‬هستند ولي در خاتمة اجراي تابع‪ ،‬حافظه وابسته به اين نوع‬
‫متغيرهـــا از بين نمي‌رود بلكه براي فراخواني بعدي تابع باقي مي‌ماند‪.‬‬

‫در اسالید بعد به یک مثال از کاربرد این نوع کالس حافظه می پردازیم‪.‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪282‬‬
: ‫مثال‬
#include <iostream.h>
// program to calculate successive fibonacci numbers

long int fib(int) ;


int main( )
{
int n ;
cout <<  how many fibonacci numbers? ;
cin >> n ;
cout << endl ;
for(int j=1; j<=n; ++j )
cout << j <<   << fib(j) << endl ;
return 0 ;
‫بايس\تي توج\ه داش\ت ك\ه اگ\ر در‬
}
long int fib(int count) ‫تواب\\\ع ب\\\ه متغيره\\\اي از ن\\\وع‬
{ ‫ مق\\دار اولي\\ه تخص\\يص‬static
static long int t1 = 1, t2=1; ‫ن\\\دهيم مق\\\دار ص\\\فر بص\\\ورت‬
long int t ; ‫اتوماتي\\\ك ب\\\راي آنه\\\ا در نظ\\\ر‬
t =(count <3) ?1 : t1 + t2 ; .‫گرفته مي‌شود‬
t2 = t1 ;
t1 = t ;
return(t) ;
}

Pr.rashidi@gmail.com 283
‫متغيره\اي از ن\وع ‪ external‬متغيره\ائي هس\تند ك\ه در ب\يرون از تواب\ع اعالن‬
‫ميش\وند و وس\عت و دامن\ه فع\اليت آنه\ا كلي\ه ت\وابعي مي‌باش\د ك\ه در زير دس\تور اعالن‬
‫متغير قرار دارد‪.‬‬

‫در اسالید بعد به یک مثال از کاربرد این نوع کالس حافظه می پردازیم‪.‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪284‬‬
#include <iostream.h> : ‫مثال‬
int w; // external variable
functa(int x, int y)
{
cout << w ;
w=x+y;
cout << endl << w << enld;
return x%y ;
}
int main( )
{
int a, b, c, d;
cin >> a >> b ;
c=functa(a, b) ;
d=functa(w, b+1); ‫بايس\تي توج\ه داش\ت ك\ه اگ\ر در‬
cout << endl << c << endl << d << endl << w ; ‫تواب\\\ع ب\\\ه متغيره\\\اي از ن\\\وع‬
return 0 ; ‫ مق\\\\\\\\دار اولي\\\\\\\\ه‬external
} ‫تخص\\يص ن\\دهيم مق\\دار ص\\فر‬
‫بص\ورت اتوماتي\ك ب\راي آنه\ا در‬
.‫نظر گرفته مي‌شود‬

Pr.rashidi@gmail.com 285
‫وق\تي متغ\يري از ن\وع ‪ register‬اعالن مي‌ش\ود از ك\امپيوتر عمًال درخواس\ت‬
‫مي‌شود كه به جاي حافظه از يكي از رجيسترهاي موجود استفاده نمايد‪.‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪286‬‬
‫کاربرد کالس ‪register‬‬

‫معموًال از نوع رجيستر براي شاخص‌هاي دستور تكرار و يا انديسهاي آرايه‌ها‬


‫استفاده مي‌شود‪ .‬بايستي توجه داشت كه متغيرهاي از نوع رجيستر قابل استفاده‬
‫دردستور ‪ cin‬نمي‌باشند‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪287‬‬
‫سربارگذاري توابع (‪)function overloading‬‬

‫در ‪ ++C‬اين امكان وجود دارد كه دريك برنامه بتوانيم از چند توابع هم نام‬
‫استفاده نمائيم مشروط بر اين كه پارامترهاي اين توابع متفاوت باشند‪( .‬از‬
‫نظر تعداد پارامتر و يا نوع پارامترها و ترتيب آنها)‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪288‬‬
: ‫مثال‬

#include <iostream.h>
float addf(float , int);
int addf(int , int);
int main( )
{
int a=5, b=10 ;
float d=14.75 ;
cout << addf(a , b) << endl;
cout << addf(d , b) << endl;
return 0 ;
}
int addf(int x, int y)
{
return x+y ;
}
float addf(float x, int y)
{
return x+y ;
}

Pr.rashidi@gmail.com 289
‫فصل هفتم‬

‫ساختار ها و اشاره گرها‬


‫فهرست مطالب فصل هفتم‬

‫ساختارها‬ ‫‪.1‬‬
‫ها ‪Union‬‬ ‫‪.2‬‬
‫)‪ ( Pointer‬اشاره گرها‬ ‫‪.3‬‬
‫تعریف آرایه‬ ‫‪.4‬‬
‫آرایه های دو بعدی و اشاره گرها‬ ‫‪.5‬‬
‫) ‪ new‬تخصیص حافظه بصورت پویا ( عملگر‬ ‫‪.6‬‬
‫رشته ها و توابع مربوطه‬ ‫‪.7‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪291‬‬
‫ساختارها‬

‫س\اختارها ش\بيه آراي ‌هه\ا ب\وده ب\دين ص\ورت ك\ه يك ن\وع داده گ\روهي اس\ت ك\ه فض\اي‬
‫پيوس\ته از حافظ\ه اص\لي را اش\غال مي‌نمايد‪ .‬ام\ا عناص\ر س\اختار الزام\ًا از يك ن\وع‬
‫نمي‌باش\ند بلك\ه اعض\اي يك س\اختار مي‌توانن\د از نوع‌ه\اي مختلف\ه از قبي\ل ‪char ، int‬‬
‫‪ … ، ، float‬باشند‪.‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪292‬‬
‫تعريف ساختار‬

‫نام ساختار‬
struct time
{ ‫اعضا ساختار‬
int hour ; // 0 –
23
int minute ; // 0 –
59
int second; //
};

Pr.rashidi@gmail.com 293
‫ مثال‬:

struct account {
int acc_no ;
char acc_type;
char name[80] ;
float balance ;
};

.‫ داراي چهار عضو مي‌باشد‬account ‫ساختار‬


int ‫ شماره حساب از نوع‬acc_no
char ‫ نوع حساب از نوع‬acc_type
‫ كركتري‬80 ‫مشخصات صاحب حساب از نوع رشتة‬ name
float ‫ مانده حساب از نوع‬balance

Pr.rashidi@gmail.com 294
: ‫به دو صورت می توان اعالن یک متغیر از نوع ساختار را نمایش داد‬

‫ روش اول‬:
struct account
{
int acc_no;
char acc_type;
char name[80];
float balance;
} cust1, cAust2, cust3; ‫ روش دوم‬:

struct account
{
int acc_no ;
char acc_type;
char name[80];
float balance;
};
account cust1, cust2, cust3;

Pr.rashidi@gmail.com 295
‫به ساختارها مي‌توان مقدار اوليه نيز تخصيص داد‬

;account cust = {4236, r, Nader Naderi , 7252.5}

Pr.rashidi@gmail.com 296
‫دسترسي به عناصر يك ساختار‬

‫‪.‬‬
‫بمنظور دسترسي به عناصر يك ساختار از عملگر استفاده‬
‫‪.‬مي‌گردد ‪ .‬عملگر‪ .‬جزء عملگرهاي يكتائي مي‌باشد‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪297‬‬
: ‫مثال‬

cust .acc_no = 4236


cust .acc_type = r
cust . name = Nader Naderi
cust . balance = 7252.5

Pr.rashidi@gmail.com 298
‫ نکته‬:
struct date
{ .‫عضو يك ساختار خود مي‌تواند يك ساختار ديگر باشد‬
int month;
int day;
int year;
};
struct account
{
int acc_no ;
char acc_typer;
char name[80];
float balance ;
date lastpay ;
};
‫اگرداشته باشيم‬
account x, y ;
‫ بوسيله‬lastpay ‫آنگاه عضو‬
x.lastpay.day
x.lastpay.month
x.lastpay.year
.‫مشخص مي‌گردد‬

Pr.rashidi@gmail.com 299
‫ نکته‬:
.‫مي‌توان آرايه‌اي تعريف نمود كه هر عضو آن يك ساختار باشد و حتي به آنها مقادير اوليه تخصيص نمود‬

struct struc1
{
char name[40];
int pay1;
int pay2;
};
strucl cust[ ]=
{
nader, 3000 , 40000,
sara, 4200, 6000,
susan, 3700, 25000,
saman, 4800 , 2000,
};

Pr.rashidi@gmail.com 300
‫ دو عدد مختلط را مي‌گيرد و مجموع‬،‫برنامه زير هر عدد مختلط را بصورت يك ساختار در نظر گرفته‬
‫آنها را مشخص و نمايش مي‌دهد‬.

#include <iostream.h>
int main( )
{
struct complex
{
float a;
float b;
} x, y, z;
cout << enter 2 complex numbers << endl ;
cin >> x.a>>x.b ;
cout << endl;
cin >> y.a >> y.b;
z.a = x.a + y.a ;
z.b = x.b + y.b ;
cout << endl << z.a <<  << z.b;
return 0 ;
} x = a + ib i2= -1 ‫بطوريكه‬
y = c + id
x+y =(a+c) + i(b+d)

Pr.rashidi@gmail.com 301
‫‪union‬‬

‫‪ union‬از نظ\ر س\اختاري ش\بيه ‪ struct‬مي‌باش\د ‪ .‬ب\ا اين تف\اوت ك\ه عض\وهائي‬
‫ك\\\ه تش\\\كيل ‪ union‬ميده\\\د همگي از حافظ\\\ه مش\\\تركي در ك\\\امپيوتر اس\\\تفاده‬
‫مي‌نمايند‪ .‬بنابراين استفاده از ‪ union‬باعث صرفه‌جوئي در حافظه مي‌گردد‪.‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪302‬‬
‫مثال ‪:‬‬
‫‪union id‬‬
‫{‬
‫;]‪char color [10‬‬
‫;‪int size‬‬
‫;‪} x , y‬‬

‫هر ك\\دام از متغيره\\اي ‪ x‬و ‪ y‬يك رش\\ته‬


‫‪ 10‬كرك\\\تري يا يك مق\\\دار از ن\وع ‪int‬‬
‫مي‌باش\\د وك\\امپيوتر يك بل\\وك حافظ\\ه ك\\ه‬
‫بتوان\د رش\ته ‪ 10‬كرك\تري رادر خ\ود ج\اي‬
‫ده\\\\د ‪ ،‬ب\\\\راي‪ color‬و ‪ size‬در نظ\\\\ر‬
‫مي‌گيرد‪.‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪303‬‬
: ‫مثال‬
union xpq
{
int x ;
char y[2] ;
}p;

x
‫بايت دوم‬ ‫بايت اول‬
y[1] y[0]
Enum
Enum color
{
Red,
Green,
blue
};
‫اشاره‌گرها (‪)Pointers‬‬

‫ته\اي‬
‫داده‌ه\ائي ك\ه در ك\امپيوتر در حافظ\ه اص\لي ذخ\يره ميش\وند باي ‌‬
‫متوالي از حافظه بسته به نوع ‪ data‬اشغال مي‌كنند‪.‬‬

‫نوع داده‬ ‫مقادير‬ ‫حافظه الزم‬


‫‪int‬‬ ‫‪ 32767‬تا –‪32768‬‬ ‫‪ 2‬بايت‬
‫‪long int‬‬ ‫‪ 2147483647‬تا –‪2147483648‬‬ ‫‪ 4‬بايت‬
‫‪char‬‬ ‫يك كاركتر‬ ‫‪1‬بايت‬
‫‪float‬‬ ‫‪ 3.4e38‬تا ‪1.2e-38‬‬ ‫‪ 4‬بايت‬
‫‪double‬‬ ‫‪ 1.8e308‬تا ‪2.2e-308‬‬ ‫‪ 8‬بايت‬
‫اشاره‌گرها (‪)Pointers‬‬
‫با داش\\\تن آدرس داده در حافظ\\\ة اص\\\لي مي‌ت\\\وان براح\\\تي ب\\\ه آن داده‬
‫دسترس\ي پي\دا نم\ود و از ط\رف ديگ\ر آدرس ه\ر داده در حافظ\ه آدرس‬
‫بايت شروع آن داده مي‌باشد‪.‬‬

‫;‪int x = 613‬‬ ‫‪0‬‬

‫‪1‬‬

‫‪2‬‬

‫‪3‬‬

‫‪4‬‬
‫‪613‬‬
‫‪5‬‬

‫‪6‬‬

‫‪7‬‬
‫نکته ‪:‬‬
‫در كامپيوتر آدرس‌ها معموًال دو بايت اشغال مي‌نمايند‪ .‬اگر آدرس ‪ x‬را در ‪ px‬قرار دهيم آنگاه مي‌گوئيم كه ‪ px‬به ‪x‬‬
‫اشاره مي‌نمايد‪.‬‬

‫‪px‬‬ ‫‪x‬‬

‫آدرس متغير ‪ x‬را بوسيله &‪ x‬نشان ميدهيم و عملگر & را عملگر آدرس مي‌نامند‪.‬‬

‫‪int x , *px‬‬
‫; ‪px = &x‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪308‬‬
‫‪ :‬مثال‬

‫‪; int y , x , *px‬‬


‫‪px‬‬ ‫‪x‬‬ ‫‪; x = 26‬‬
‫‪; px = &x‬‬

‫‪26‬‬

‫حال اگر دستور العمل ‪ ; x += 10‬را بدهيم‪:‬‬


‫‪px‬‬ ‫‪x‬‬

‫‪36‬‬

‫حال اگر دستورالعمل *‪ ; px = *px + 7‬بدهيم‪.‬‬


‫‪px‬‬ ‫‪x‬‬

‫‪43‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪309‬‬
‫آرایه یک بعدی و اشاره گرها‬
‫‪0‬‬ ‫‪26.5‬‬ ‫‪x‬‬
‫‪1‬‬ ‫‪24.7‬‬
‫‪2‬‬ ‫‪5.8‬‬
‫اولين عنصر آرايه بوسيله ]‪ x[0‬مشخص مي‌شود‪.‬‬
‫‪3‬‬ ‫‪-73.2‬‬
‫‪4‬‬ ‫‪69.0‬‬
‫‪5‬‬ ‫‪100.5‬‬ ‫آدرس اولين عنصر آرايه بوسيله &]‪ x[0‬يا بوسيله ‪ x‬مشخص مي‌شود‪.‬‬
‫‪6‬‬ ‫‪-13.24‬‬
‫‪7‬‬ ‫‪424.3‬‬
‫‪8‬‬ ‫‪187.8‬‬
‫‪9‬‬ ‫‪358.2‬‬ ‫آدرس ‪ i‬امين عنصر آرايه بوسيله &]‪ x[i-1‬يا بوسيله )‪ x(i-1‬مشخص مي‌شود‪.‬‬

‫دو دستورالعمل زير با هم معادلند ‪.‬‬


‫‪; x[ i ] = 82.5‬‬
‫*(‪; 82.5 = )x + i‬‬
‫از طرف ديگر اگر داشته باشيم‬
‫]‪;float x[10‬‬
‫‪;float *p‬‬
‫دو دستورالعمل زير معادلند‪.‬‬
‫]‪; p = &x[2‬‬
‫‪; p= x + 2‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪310‬‬
‫ساختارها و اشاره گرها‬
‫مي‌توان اشاره‌گري را تعريف نمود كه به اولين بايت يك ساختار (‪ )struct‬اشاره نمايد‪.‬‬
‫‪struct‬‬
‫‪struc1‬‬
‫{‬
‫‪int a‬‬
‫;‬ ‫‪px‬‬ ‫‪x‬‬
‫‪float‬‬ ‫‪a‬‬ ‫‪int‬‬
‫;‪b‬‬ ‫‪b‬‬ ‫‪float‬‬
‫‪c‬‬ ‫‪char‬‬
‫‪char‬‬ ‫‪d‬‬ ‫‪int‬‬
‫;‪c‬‬
‫‪int d‬‬
‫;‬
‫‪px =}&x‬‬ ‫; ;‬
‫‪x, *px‬‬

‫عبارت ‪ x.a‬معادل ‪ pxa‬معادل (*‪ a.)px‬مي‌باشد‪.‬‬


‫آرايه‌هاي دوبعدي و اشاره‌گرها‬
‫يك آرايه دوبعدي بصورت تعدادي آرايه يك بعدي مي‌توان تعريف نمود‪.‬‬
‫اگر ‪ x‬يك ماتريس ‪ 5‬سطري و ‪ 4‬ستوني از نوع اعشاري باشد قبًال اين ماتريس را با‬

‫]‪;float x[5][4‬‬

‫معرفي كرديم‪ .‬حال با استفاده از اشاره‌گرها بصورت زير معرفي نمائيم‪:‬‬

‫;]‪float (*x)[4‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪312‬‬
‫آرايه‌هاي دوبعدي و اشاره‌گرها‬

‫;]‪float (*x)[4‬‬

‫آرايه يك بعدي اول‬ ‫‪‬‬ ‫‪x‬‬

‫آرايه‌ يك بعدي دوم‬ ‫‪‬‬ ‫(‪)x+1‬‬

‫آرايه يك بعدي سوم‬ ‫‪‬‬ ‫(‪)x+2‬‬

‫آرايه يك بعدي چهارم‬ ‫‪‬‬ ‫(‪)x+3‬‬

‫آرايه يك بعدي پنجم‬ ‫‪‬‬ ‫(‪)x+4‬‬


.‫ ايجاد شده و مقادير عناصر آرايه را به چهار طريق نمايش مي‌دهد‬int ‫ عنصري از نوع‬5 ‫در برنامه زير يك آرايه‬

#include <iostream.h>
#include <conio.h>
int main( )
{
int x[ ]={12, 25, 6, 19, 100};
clrs cr( );
int *px=x;
//‫ اشاره به عنصر اول آرايه مي‌نمايد‬،‫نام آرايه بدون انديس‬
for(int i=0; i<=4; i++)
cout << *(x+i) << endl;

//the second method


for(i=0; i<5; i++)
cout << x[ i ] <<  \n;
//the third method
for(i=0; i<=4; i++)
cout << px[ i ]<<endl;
//the forth method
for(i=0; i<=4; i++)
cout << *(px+i)<<endl;
return 0;
}
Pr.rashidi@gmail.com 314
‫تخصيص حافظه به صورت پويا يا (عملگر ‪)new‬‬

‫از عملگ\ر ‪ new‬ب\راي تخيص\يص حافظ\ه ب\ه ص\ورت‬


‫پويا می ت\وان اس\تفاده نم\ود ‪ ،‬در ض\من مي‌ت\وان ب\راي‬
‫بل\وكي از حافظ\ه ك\ه تخص\يص يافت\ه مق\دار اولي\ه تع\یین‬
‫نمود‪.‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪315‬‬
‫براي تخصيص حافظه باندازه ‪ 20‬مقدار از نوع ‪ int‬كه اشاره‌گر ‪ ptx‬به آن اشاره نمايد بصورت زير عمل مي‌شود‪.‬‬

‫‪;int *ptx‬‬
‫]‪;ptx = new int [20‬‬

‫‪ ptx‬به اولين داده از نوع ‪ int‬اشاره مي‌نمايد‪.‬‬

‫‪ ptx+i‬به ‪ i+1‬امين عنصر از فضاي‌پيوسته اشاره مي‌نمايد‪.‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪316‬‬
‫ سپس آنرا مقدار داده و مجموع مقادير‬،‫ عنصري از نوع اعشاري در حافظه ايجاد نموده‬n ‫برنامه زير يك فضاي‬
.‫رامشخص و نمايش مي‌دهد‬

#include <iostream.h>
int main( )
{
int n;
float *ptr, tot = 0.0;
cout << enter a value for n  << endl;
cin >> n;
ptr=new float [n];
for(int j=0; j<n; ++j)
{
cin >> *(ptr + j);
cout <<  \n ;
}
for(j=0; j<=n-1; ++j)
tot += *(ptr + j);
cout << tot ;
// in order to free the space use
delete[ ] ptr ;
return 0;
} Pr.rashidi@gmail.com 317
.‫ عنصري از ساختار را ايجاد مي‌نمايد‬n ‫برنامه زير آرايه‌هاي‬

#include <iostream.h>
#include <conio.h>
int main( )
{
struct rec
{
float a;
int b;
};
int n;
rec *ptr;
clrscr( );
cout <<  how many records? \n
cin >> n ;
ptr = new rec[n];
for(int i=0; i<n; ++i)
{
cout <<((ptr+i) b=i) <<  ;
cout <<((*(ptr +i)).a = i+0.5) << endl ;
delete [ ] ptr;
return 0 ;
}

Pr.rashidi@gmail.com 318
.‫ جا‌به‌جا مي‌نمايد‬swap ‫برنامه زير دو مقدار اعشاري را گرفته مقادير آنها را بكمك تابع‬

#include <iostream.h>
#include <conio.h>
void swap(float *, float *);
int main( )
{
float a,b;
cin >> a >> b;
cout << a << endl << b << endl ;
return 0;
}
void swap(float *px , float *py)
{
float t;
t = *px;
*px = *py;
*py = t ;
return;
}

Pr.rashidi@gmail.com 319
‫رشته‌ها و توابع مربوطه‬
‫رشته‌ها در ‪ ، ++C‬آرايه‌اي از كركترها مي‌باشند كه با كركتر ‪  \0‬ختم ميشوند‪.‬‬

‫;‪char name[ ]=  sara‬‬

‫‪s‬‬
‫‪a‬‬
‫‪r‬‬
‫‪a‬‬
‫‪\0‬‬
‫رشته و اشاره گر‬
‫هر رشته از طريق اشاره‌گري به اولين كركتر آن در دسترس قرار مي‌گيرد‪ .‬آدرس يك رشته‪ ،‬آدرس كركتر اول‬
‫آن مي‌باشد‪ .‬به رشته‌ها مي‌توان مقدار اوليه تخصيص داد‪.‬‬

‫;‪char *name =  sara‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪321‬‬
.‫ رشته در نظر گرفته آنها را بترتيب حروف الفباء مرتب نموده نمايش مي‌دهد‬5 ‫برنامه ذيل پنج اسم را بصورت‬

#include <iostream.h>
#include <string.h>
void sort(char *[ ]);
int main( )
{
char *name[5] = {sara, afsaneh, babak, saman, naser };
sort(name);// display sorted strings
for(int i=0; i<5; ++i)
cout << name[ i ] << endl;
return 0;
}
sort(char *name[ ])
{
char *t;
for(int i=0; i<4; ++i)
for(int j=i+1; j<5; ++j)
if(strcmpi(name[ i ], name[ j ]> 0)
{// interchange the two strings
t= name[ i ];
name[ j ] = name[ i ];
name[ i ] = t ;
}
return ;
}

Pr.rashidi@gmail.com 322
‫تابع )‪strcmpi(s1, s2‬‬

‫رش\ته‌هاي ‪ s1‬و ‪ s2‬را ب\ا هم مقايس\ه نم\وده (ب\دون توج\ه ب\ه ح\روف كوچ\ك و ب\زرگ) اگ\ر رش\ته‬
‫‪ s1‬براب\ر ب\ا رش\ته ‪ s2‬باش\د مق\دار ص\فر و اگ\ر رش\ته ‪ s1‬كوچك\تر از رش\ته ‪ s2‬باش\د يك مق\دار‬
‫منفي در غير اينصورت يك مقدار مثبت بر مي‌گرداند‪.‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪323‬‬
‫تابع ) ‪strcmp(s1, s2‬‬

‫رش\ته‌هاي ‪ s1‬و ‪ s2‬را ب\ا هم مقايس\ه نم\وده اگ\ر ‪ s1‬براب\ر ب\ا ‪ s2‬باش\د مق\دار ص\فر و اگ\ر رش\ته‬
‫‪ s1‬كوچك\تر از رش\ته ‪ s2‬باش\د يك مق\دار منفي در غ\ير اينص\ورت يك مق\دار مثبت برمي‌گردان\د‪.‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪324‬‬
‫تابع ) ‪strncmp(s1, s2,n‬‬

‫حداكثر ‪ n‬كرك\تر از رش\تة ‪ s1‬را ب\ا ‪ n‬كرك\تر از رش\تة ‪ s2‬مقايس\ه نم\وده در ص\ورتيكه ‪s1‬‬
‫كوچك\\تر از ‪ s2‬باش\\د يك مق\\دار منفي‪ ،‬اگ\\ر ‪ s1‬مس\\اوي ب\\ا ‪ s2‬باش\\د مق\\دار ص\\فر در غ\\ير‬
‫اينصورت يك مقدار مثبت برميگرداند‪.‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪325‬‬
‫تابع (‪strcat(s1, s2‬‬

‫دو رش\\تة ‪ s1‬و ‪ s2‬را بعن\\وان آرگوم\\ان گرفت\\ه رش\\تة ‪ s2‬را ب\\ه انته\\اي رش\\تة ‪ s1‬اض\\افه‬
‫مي‌نمايد‪ .‬كرك\تر اول رش\تة ‪ s2‬روي كرك\تر پاياني ‪ \0‬رش\تة ‪ s1‬نوش\ته مي‌ش\ود ونهايت\ًا‬
‫رشتة ‪ s1‬را برميگرداند‪.‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪326‬‬
‫تابع (‪strncat(s1, s2,n‬‬

‫دو رش\ته‌ ‪ s1‬و ‪ s2‬ومق\دار ص\حيح و مثبت ‪ n‬را بعن\وان آرگوم\ان گرفت\ه‪ ،‬ح\داكثر ‪ n‬كرك\تر از‬
‫رش\تة ‪ s2‬را در انته\اي رش\تة‌ ‪ s1‬ك\پي مي‌نمايد‪ .‬اولين كرك\تر رش\ته ‪ s2‬روي كرك\تر پاياني‬
‫‪ \0‬رشتة ‪ s1‬مي‌نويسد ونهايتًا مقدار رشتة ‪ s1‬را برميگرداند‪.‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪327‬‬
‫تابع (‪strlen(s‬‬

‫رشتة ‪ s‬را بعنوان آرگومان گرفته طول رشته را مشخص مي‌نمايد‪.‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪328‬‬
‫تابع (‪strlen(s‬‬

‫رشتة ‪ s‬را بعنوان آرگومان گرفته طول رشته را مشخص مي‌نمايد‪.‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪329‬‬
‫تابع )‪strcpy(s1,s2‬‬

‫دو رشتة ‪ s1‬و ‪ s2‬را بعنوان آرگومان گرفته رشتة ‪ s2‬را در رشتة ‪ s1‬كپي مي‌نمايد و‬
‫نهايتًا مقدار رشتة ‪ s1‬را بر مي‌گرداند‪.‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪330‬‬
‫تابع (‪strncpy(s1, s2,n‬‬

‫دو رشتة ‪ s1 , s2‬و مقدار صحيح و مثبت ‪ n‬را بعنوان آرگومان گرفته‪ ،‬حداكثر ‪ n‬كركتر را‬
‫از رشتة ‪ s2‬در رشتة ‪ s1‬كپي نموده‪ ،‬نهايت‌ًا مقدار رشتة ‪ s1‬را برميگرداند‪.‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪331‬‬
‫براي استفاده از توابع مربوط به‬
‫رشته‌ها بايستي حتمًا در ابتدا برنامه‬
‫‪ >include <string.h#‬را قرار‬
‫دهيم‪.‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪332‬‬
: ‫مثال‬

#include <iostream.h>
#include <string.h>
#include <conio.h>
int main( )
{
char *s1= happy birthday;
char *s2= happy holidays ;
clrscr( );
cout << strcmp(s1, s2) << endl;
cout << strncmp(s1, s2, 7) << endl ;
return 0;
}

Pr.rashidi@gmail.com 333
: ‫مثال‬

#include <iostream.h>
#include <string.h>
#include <conio.h>
int main( )
{
char *s = sara;
clrscr( );
cout << strlen(s);
return 0;
}

Pr.rashidi@gmail.com 334
.‫ می باشد‬strcmp ‫تابع زیر معادل تابع کتابخانه‬

int nikstrcmp(char s[] , char t[] )


{
int i=0;
while (s[i]==t[i] )
if ( s[i++]=‘\0’ )
return 0;
return (s[i]-t[i]);
}

Pr.rashidi@gmail.com 335
‫فصل هشتم‬

‫برنامه نویس شی گرا‬


‫فهرست مطالب فصل هشتم‬

‫‪ static‬عضوهای‬ ‫‪.12‬‬ ‫‪ .1‬تعریف شی گرایی‬


‫کالسهای تودرتو‬ ‫‪.13‬‬ ‫‪ (polymorphism) .2‬چند ریختی‬
‫کالس های محلی‬ ‫‪.14‬‬ ‫‪ .3‬خاصیت ارث بری‬
‫‪ object‬استفاده از‬ ‫‪.15‬‬ ‫‪ (stack) .4‬پشته‬
‫ها بعنوان پارامترهای تابع‬ ‫‪ .5‬ایجاد شی‬
‫برگشت اشیاء‬ ‫‪.16‬‬ ‫‪ .6‬ارث بری‬
‫انتساب اشیاء‬ ‫‪.17‬‬ ‫‪ .7‬سازنده ها و نابود کننده ها‬
‫آرایه اشیاء‬ ‫‪.18‬‬ ‫‪ .8‬توابع دوست‬
‫اشاره گر به اشیاء‬ ‫‪.19‬‬ ‫‪ .9‬کالس های دوست‬
‫‪ this‬اشاره گر‬ ‫‪.20‬‬ ‫‪ .10‬توابع سازنده پارامتر دار‬
‫توابع مجازی و پلی مرفیسم‬ ‫‪.21‬‬ ‫‪ .11‬توابع سازنده یک پارامتری‬
‫تعریف شی گرایی‬

‫برنامه نويسي شئ گرا يا ‪ oop‬يك روش جديد برنامه نويسي‬


‫مي‌باشد كه در آن از ويژگي‌‬
‫ساختيافته همراه با چند ويژگي‌هاي قوي جديد استفاده‬
‫مي‌شود‪ .‬زبان برنامه نويسي ‪ ++C‬امكان استفاده از ‪oop‬‬
‫را به راحتي فراهم مي‌نمايد‪.‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪338‬‬
‫تعریف شی گرایی‬

‫در ‪ ، oop‬بطور كلي مساله به تعدادي زيرگروه قطعات‬


‫مربوط بهم شكسته مي‌شود كه براي هر زير گروه ‪ code‬و‬
‫‪ data‬تهيه شده و نهايتًا اين زيرگروه‌ها تبديل به ‪ unit‬ها يا‬
‫واحدهائي مي‌شود كه ‪( objects‬يا اشياء) ناميده ميشوند‪.‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪339‬‬
‫نکته مهم ‪:‬‬

‫تمام زبانهاي برنامه نويسي شي‌گرا داراي سه‬


‫خصوصيت مشترك زير مي‌باشند ‪:‬‬

‫الف‪( encapsulation :‬محصورسازي)‬

‫ب‪( polymorphism :‬چندريختي)‬


‫ج‪( inheritance:‬ارث بري)‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪340‬‬
‫محصورسازی (‪) Encapsulation‬‬

‫محصورس\ازي مك\انيزمي اس\ت ك\ه ‪ code‬و ‪ data‬را بهم وص\ل نم\وده و ه\ر دوي آنه\ا را از اس\تفاده‌هاي‬
‫غيرمج\\از مص\\ون نگ\\ه مي‌دارد‪ .‬ش\\ي يك مؤلف\\ه منطقي اس\\ت ك\\ه ‪ data‬و ‪ code‬را محص\\ور نم\\وده و‬
‫‪ code‬باعث دستكاري و پردازش ‪ data‬مي‌شود‪.‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪341‬‬
‫‪( polymorphism‬چند ريختي)‬

‫چند ريختي مشخصه‌اي است كه بيك وسيله امكان ميدهد كه باتعدادي از‬
‫‪.‬سيستمها يا عميات يا دستگاهها‪ ،‬مورد استفاده قرار گيرد‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪342‬‬
‫‪( inheritance‬ارث بري)‬

‫ارث بري فرآيندي است كه بوسيله آن يك شي (‪ )object‬مي‌تواند‬


‫خاصيت‌هاي شي ديگري را دارا شود‪.‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪343‬‬
‫پشته (‪)stack‬‬
‫پشته ساختاري است كه داراي خاصيت ‪ last in first out‬مي‌باشد‪.‬‬
‫پشته فضاي پيوسته در حافظه اشغال مي‌نمايد‪ .‬عملياتي كــه روي پشته‬
‫انجام مي‌شوند عبارتند از ‪:‬‬

‫الف‪ ،push :‬كه باعث مي‌شود يك عنصر وارد پشته شده‪.‬‬


‫ب‪ ، pop :‬كه باعث مي‌شود يك عنصر از پشته خارج گردد‪.‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪344‬‬
‫ايجاد شي (‪)object‬‬

‫بمنظ\\ور ايج\\اد يك ش\\ي بايس\\تي از كلم\\ة رزروش\\ده‬


‫‪ class‬اس\\\تفاده نم\\\ود‪ class .‬از نظ\\\ر ظ\\\اهر ش\\\بيه‬
‫س\\اختار يا ‪ struct‬مي‌باش\\د‪ .‬پش\\ته را بعن\\وان يك‬
‫‪ object‬مي‌ت\وان در نظ\ر گ\رفت ك\ه ‪ data‬آن ش\امل يك‬
‫آرايه و يك ‪ ، tos‬و عملي\\\اتي ك\ه روي اين ‪object‬‬
‫انج\\ام مي‌ش\\ود عبارتس\\ت از ‪push، initialize ،‬‬
‫‪ pop‬كردن پشته‪.‬‬

‫در اسالید بعد مثالی از نحوه ایجاد شی آورده شده است‪.‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪345‬‬
‫مثال ‪:‬‬
‫‪#define SIZE 100‬‬ ‫بدين مع\\\ني اس\\\ت ك\ه ‪ stck‬و ‪tos‬‬
‫‪// this creates the class stack.‬‬ ‫بوس\يله ت\وابعي ك\ه عض\و ‪object‬‬
‫‪class stack‬‬ ‫نباش\ند غ\ير قاب\ل دسترس\ي هس\تند‪ .‬و‬
‫{‬ ‫اين يكي از روش‌ه\\\\\اي محص\\\\\ور‬
‫سازي اقالم داده‌هاست‪.‬‬
‫‪private :‬‬
‫;]‪int stck[SIZE‬‬
‫;‪int tos‬‬
‫‪Public:‬‬
‫بدين مع\\ني اس\\ت ك\\ه بوس\يله س\\اير‬
‫;) (‪void init‬‬
‫قطع\\\ات برنام\\\\ه قاب\\\ل دسترس\\\ي‬
‫;)‪void push(int i‬‬ ‫مي‌باشد‪.‬‬
‫;) (‪int pop‬‬
‫;}‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪346‬‬
‫نکته ‪:‬‬

‫فق\ط تواب\ع عض\و مي‌توانن\د ب\ه متغيره\اي عض\و از ن\وع ‪private‬‬


‫دسترس\\ي داش\\ته باش\\ند‪ .‬بايس\\تي توج\\ه داش\\ت ك\\ه اگ\\ر ن\\وع عض\\وي‬
‫مشخص نگردد آن عضو به صورت اتوماتيك ‪ private‬می باشد‪.‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪347‬‬
‫نحوه تعریف تابع عضو یک کالس‬
void stack : : push(int i)
{
{ if(tos = = SIZE )
;cout << stack is full.
;return
}
; stck[tos]= i
; ++ tos
}

‫ عملگ\ر‬: : ‫ عملگ\ر‬.‫ مي‌باش\د‬object ‫ مش\خص مي‌نمايد ك\ه ت\ابع متعل\ق ب\ه ك\دام‬: :‫عملگ\ر‬
.‫ ناميده مي‌شود‬scope resolution

Pr.rashidi@gmail.com 348
: stack ‫برنامه کامل‬

>include <iostream.h#
define SIZE 100# int stack : : pop( )
.this creates the class stack // {
{ class stack if(tos = = 0) {
;int stck[SIZE] cout << stack underflow. ;
;int tos return 0 ; }
:public tos - - ;
;void init(int i) return stck[tos];
;) (int pop }
;void push(int i)
;} int main( )
) (void stack : : init {
{ stack st1, st2; // create two objects
; tos = 0 st1. init( );
} st2.init( );
void stack : : push(int i) st1.push(1);
{ st2.push(2);
{ if(tos = = size) st1.push(3);
; cout << stack is full. st2.push(4);
; return cout << st1.pop( ) << endl;
} cout << st1.pop( ) << endl;
; stck[tos] = i cout << st2. pop( ) << endl;
; ++ tos cout << st2. pop( ) << endl;
} return 0; }

Pr.rashidi@gmail.com 349
‫ارث بری‬

‫ارث بري فرآيندي است كه بوسيله آن يك شي (‪ )object‬مي‌تواند‬


‫خاصيت‌هاي شي ديگري را دارا شود‪.‬‬

‫در اسالید بعد مثالی از ارث بری آورده شده است‪.‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪350‬‬
‫ مثال‬:
class building {
int rooms; ‫ تعريف گرديده‬building ‫ اي بن\ام س\اختمان يا‬object ‫در روب\رو‬
int floors; ‫ تع\دادي طبق\ه و س\طح زير بن\ا‬،‫ ه\ر س\اختمان داراي تع\دادي اط\اق‬.‫اس\ت‬
int area; : ‫ از طرف ديگرتوابعي كه براي شي تعريف شده‬.‫نيز مي‌باشد‬
public:
void set_rooms(int num);
int get_rooms( );
void set­_floors(int num);
int get_floors( );
void set_area(int num);
int get_area( );
};
‫ تعريف مي‌نم\\ائيم ك\\ه ن\\ه تنه\\ا‬house ‫ ديگ\\ري بن\\ام‬object ‫حال‬
‫ مي‌باش\\د بلك\\ه دارای دو اقالم‬building ‫داراي تم\\ام اعض\\اي ش\\ي‬
house ‫ دراينج\ا عمًال ش\ي‬.‫داده اض\افي و چه\ار ت\ابع اض\افي مي‌باش\د‬
// house is derived from building : ‫ ارث مي‌برد‬building ‫از شي‬
class house : public building {
int bedrooms;
int baths;
public:
void set_bedrooms(int num);
int get_bedrooms( );
void set_baths(int num);
int get_baths( );
};

Pr.rashidi@gmail.com 351
: ‫نکته‬

‫ ش\ي‬. ‫ می نامن\د‬derived class ‫ را‬house ‫ و‬base class ‫ را‬building ‫در مث\ال قب\ل‬
‫ را دارا اس\\ت بعالوه اينك\\ه داراي متغيره\\اي عض\\وي اض\\افي‬building ‫ تم\\ام اعض\\اي‬house
set_baths()، set_bebrooms()، ‫ و همچ\\\نين تواب\\\ع عض\\\وي‬bedrooms ، baths
. .‫()نيز مي‌باشد‬get_baths()، get_bedrooms

Pr.rashidi@gmail.com 352
‫سازنده‌ها و نابودكننده‌ها (‪)constructors and destructors‬‬

‫يا مق\دار اولي\ه دادن بص\ورت اتوماتي\ك از طريق ت\ابعي انج\ام مي‌ش\ود‬ ‫‪Initialization‬‬
‫بن\ام ت\ابع ‪ constructor‬يا ت\ابع س\ازنده‪ .‬ت\ابع س\ازنده ت\ابع مخصوص\ي اس\ت ك\ه عض\وي‬
‫از كالس بوده و همنام با كالس مي‌باشد‪.‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪353‬‬
‫سازنده‌ها و نابودكننده‌ها (‪)constructors and destructors‬‬

‫ت\ابع ن\ابود كنن\ده يا ‪ ، destructor‬عكس عم\ل ت\ابع س\ازنده را انج\ام مي‌ده\د‪.‬‬


‫وق\\تي ك\\ه ش\\ي‌اي از بين مي‌رود بص\\ورت اتوماتي\\ك ت\\ابع ن\\ابود كنن\\ده آن‬
‫فراخواني مي‌گردد‪.‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪354‬‬
‫توابع دوست (‪)friend functions‬‬

‫ب\ا اس\تفاده از كلم\ة ‪ friend‬اين امك\ان وج\ود دارد ك\ه ب\ه ت\ابعي ك\ه عض\و كالس‬
‫نمي‌باش\د اج\ازه دسترس\ي ب\ه متغيره\اي ‪ private‬كالس را داد‪ .‬ب\راي آنك\ه ت\ابعي‬
‫را دوست اعالن نمائيم از كلمه ‪ friend‬قبل از تعريف تابع استفاده مي‌نمائيم‪.‬‬

‫در اسالید بعد مثالی آورده شده است‪.‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪355‬‬
#include <iostream.h>
: ‫مثال‬
#include <conio.h>
class myclass
{
int a,b;
public :
friend int sum(myclass x);
void set_ab(int i, int j);
};
void myclass :: set_ab(int i, int j)
{
a=i;
b=j;
}
//sum is not a member function
int sum(myclass x)
{
return s.a + x.b;
}
int main( )
{
myclass n;
clrscr( );
n. set_ab(5,8);
cout << sum(n);
return 0 ;
}

Pr.rashidi@gmail.com 356
‫نکته ‪:‬‬

‫‪-1‬كالسي كه از كالس ديگر ارث مي‌برد ‪ ،‬توابع دوست آن كالس را‬


‫به ارث نمي‌برند‪ .‬بعبارت ديگر يك ‪ ، derived class‬توابع دوست را‬
‫به ارث نمي‌برد‪.‬‬

‫‪-2‬توابع دوست داراي مشخصه نوع ذخيره نمي‌باشند يعني توابع‬


‫دوست را نمي‌توان بصورت ‪ static‬يا ‪ external‬تعريف نمود‪.‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪357‬‬
‫كالسهاي دوست (‪)friend classes‬‬

‫اين امكان وجود دارد كه يك كالس دوست كالس ديگري باشد ‪ .‬در چنين وضعيتي تابع دوست به كليه‬
‫اسامي ‪ private‬تعريف شده در كالس ديگر دسترسي دارد‪.‬‬

‫در اسالید بعد مثالی آورده شده است‪.‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪358‬‬
#include <iostream.h>
class coins : ‫مثال‬
{
enum units{
penny,
nickel,
dime,
quarter,
half_ dollar
};
friend class amount;
};
class amount {
coins :: units money;
public:
void setm( );
int getm( );
} ob;
void amount :: setm( )
{
money = coins :: dime;
}
int amount :: getm( )
{
return money;
}
int main( )
{
ob.setm( );
cout << ob.getm( );
return 0 ; } Pr.rashidi@gmail.com 359
‫توابع سازنده پارامتردار‬

‫امك\ان انتق\ال آرگومانه\ا ب\ه تواب\ع س\ازنده وج\ود دارد‪ .‬معم\وًال از اين‬
‫آرگومانه\\ا ب\\راي ‪ initialize‬نم\\ودن ش\\ي در زم\\ان ايج\\اد آن اس\\تفاده‬
‫ميگردد‪.‬‬

‫در اسالید بعد مثالی آورده شده است‪.‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪360‬‬
: ‫مثال‬
>include <iostream.h#
>include <conio.h#
class myclass
{
;int x, y
: public
myclass(int i, int j) {x = i; y=j; }
void show( ) {cout << x << endl << y; }
;}
) (int main
{
;myclass obj( 3 , 5)
;) (clrscr
;) (obj.show
;return 0
}

Pr.rashidi@gmail.com 361
‫توابع سازنده يك پارامتري‬
#include <iostream.h>
#include <conio.h>
class myclass
{
int x;
public:
myclass(int i) {x=i;}
int getx( ) {return x;}
};
int main( )
{
clrscr( );
myclass obj=126; // ‫ منتقل كن‬i 126 ‫را به‬
cout << obj.getx( );
return 0 ;
}

Pr.rashidi@gmail.com 362
‫عضوهاي ‪static‬‬

‫اگر عضو داده‌اي بصورت ‪ static‬اعالن گردد اين بدين معني است كه‬
‫كامپيلر فقط يك كپي از متغير مذكور را نگهداري نموده و تمام ‪ object‬ها‬
‫بايستي بصورت اشتراكي از آن كپي استفاده نمايند‪ .‬براي اينكار مي‌بايستي از‬
‫كلمه ‪ static‬قبل از اعالن عضو استفاده نمود‪.‬‬

‫در اسالید بعد مثالی آورده شده است‪.‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪363‬‬
‫ مثال‬:
#include <iostream.h>
class shared{
static int a;
int b;
public :
void set(int i, int j) {a=i; b=j; }
void show( );
};
int shared :: a ; // define a
void shared :: show( )
{
cout << static a:  << a << endl;
cout << nonstatic b: << b << endl;
}
int main( )
{
shared x,y;
x.set(1,1); // set a to 1
x.show( );
y.set(4,4); // change a to 4
y.show( );
x.show( );
return 0;
}

Pr.rashidi@gmail.com 364
‫‪( nested classes‬كالسهاي تودرتو)‬

‫مي‌توان يك كالس را در يك كالس ديگر تعريف نمود‪ .‬اما‬


‫بعلت اينكه در ‪ ++C‬براي كالسها خاصيت ارث بري‬
‫وجود دارد نيازي معموًال به تعريف نمودن يك كالس در‬
‫كالس ديگر نيست‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪365‬‬
‫‪( local classes‬كالسهاي محلي)‬

‫وق\تي ك\ه كالس\ي در درون يك ت\ابع تعريف مي‌ش\ود اين‬


‫كالس فق\ط ب\راي آن ت\ابع ش\ناخته ش\ده اس\ت و ب\راي تواب\ع‬
‫ديگ\\ر ناش\\ناخته مي‌باش\\د‪ .‬چ\\نين كالس\\ي را كالس محلي‬
‫مي‌نامند‪.‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪366‬‬
‫در مورد كالسهاي محلي رعايت نكات زير ضروري است ‪:‬‬

‫تمام توابع عضو بايستي در درون كالس تعريف گردند‪.‬‬ ‫‪.1‬‬


‫از متغيرهاي محلي‪ ،‬تابعي كه كالس در آن تعريف شده نمي‌تواند استفاده نمايد‪.‬‬ ‫‪.2‬‬
‫از متغيرهاي عضوي ‪ static‬نمي‌توان استفاده نمود‪.‬‬ ‫‪.3‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪367‬‬
‫ها بعنوان پارامترهاي توابع‬ ‫استفاده از ‪object‬‬
‫از ‪ object‬ها مي‌توان بعنوان پارامترهاي توابع استفاده نمود و مكانيز ‌م انتقال آرگومانها و پارامترها بصورت‬
‫‪ call by value‬مي‌باشد‪.‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪368‬‬
‫برگشت اشياء (‪)returning objects‬‬

‫مقدار برگشتي يك تابع مي‌تواند يك ‪ object‬باشد‪.‬‬

‫در اسالید بعد مثالی آورده شده است‪.‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪369‬‬
‫ مثال‬:
#include <iostream.h>
class myclass
{
int i ;
public :
void set_ i(int n)
{
i=n;
}
int get_i( ) {return i;}
};
myclass funct( ); // return an object
int main( )
{
myclass ob;
ob=funct( );
cout << ob.get_i( ) << endl;
return 0;
}
myclass funct( )
{
myclass x ;
x.set_i(1);
return x;
}

Pr.rashidi@gmail.com 370
‫انتساب اشياء (‪)object assignment‬‬

‫در صورتيكه دو تا ‪ object‬از يك نوع باشند‬


‫مي‌توان يك ‪ object‬را بديگري انتساب نمود‪.‬‬

‫در اسالید بعد مثالی آورده شده است‪.‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪371‬‬
: ‫مثال‬
#include <iostream.h>
#include <conio.h>
class myclass
{
int i;
public:
void set_i(int n) {i=n;}
int get_i( ) {return i;}
};
int main( )
{
myclass ob1, ob2;
obl.set_i(126);
ob2= ob1; // assign data from ob1 to ob2
clrscr( );
cout << ob2.get_i( );
retrun 0 ;
}

Pr.rashidi@gmail.com 372
‫آرايه اشياء (‪)array of objects‬‬

‫امكان استفاده از آرايه در مورد اشياء مي‌باشد‪.‬‬


‫بعبارت ديگر مي‌توان در برنامه ها آرايه‌اي از ‪ object‬ها‬
‫داشته باشيم‪.‬‬

‫در اسالید بعد مثالی آورده شده است‪.‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪373‬‬
‫ مثال‬:
#include <iostream.h>
#include <conio.h>
class myclass
{
int i;
public:
void set_i(int j) {i=j;}
int get_i( ) {return i;}
};
int main( )
{
clrscr( );
myclass ob[3];
int i;
for(i=0; i<3; i++) ob[ i ].set_i(i+1);
for(i=0; i<3; i++)
cout << ob[ i ].get_i( ) << endl;
return 0;
}

Pr.rashidi@gmail.com 374
‫اشاره‌گر به اشياء (‪) pointers to objects‬‬

‫در مورد اشياء نيز از اشاره‌گرها نيز مي‌توان استفاده نمود‪.‬‬


‫از عملگر ‪ ‬در اين مورد استفاده مي‌شود‪.‬‬

‫در اسالید بعد مثالی آورده شده است‪.‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪375‬‬
: ‫مثال‬
#include <iostream.h>
#include <conio.h>
class myclass
{
int i ;
public:
myclass( ) {i=0;}
myclass(int j) {i=j;}
int get_i( ) {return i;}
};
int main( )
{
myclass ob[3]= {1, 2, 3};
myclass *p;
int i;
p=ob; // get start of array
for(i=0; i<3; i++)
{
cout << p  get_i( ) << endl;
p++; // point to next object
}
return 0;
}

Pr.rashidi@gmail.com 376
‫اشاره‌گر )‪this (this pointer‬‬

‫هر تابع عضو يك كالس داراي يك پارامتر مخفي‬


‫بنام ‪ this pointer‬مي‌باشد‪ this .‬اشاره به ‪object‬‬
‫خاصي مي‌نمايد‪.‬‬

‫در اسالید بعد مثالی آورده شده است‪.‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪377‬‬
#include <iostream.h> : ‫مثال‬
class pwr
{
double b;
int e;
double val;
public:
pwr(double base, int exp);
double get_pwr( ) {return val;}
};
pwr :: pwr(double base, int exp)
{
this  b=base;
this  e=exp;
this  val =1;
if(exp = = 0) return;
for(; exp > 0 ; exp  )
this  val = this  val *this  b;
}
int main( )
{
pwr x(4.0, 2) , y(2.5, 1), z(5.7,0);
cout << x.get_pwr( ) <<  ;
cout << y.get_pwr( ) <<  ;
cout << z.get_pwr( ) <<  \n ;
return 0;
}

Pr.rashidi@gmail.com 378
‫توابع مجازي و پلي مرفيسم (‪)virtual functions‬‬

‫تابع مجازي‪ ،‬تابعي است كه در ‪ base class‬تعريف شد و‬


‫بوسيله ‪ derived class‬تغير داده ميشود‪ .‬براي اعالن يك‬
‫تابع مجازي بايستي از كلمه ‪ virtual‬استفاده نمائيم‪.‬‬
‫تغير تابع در كالس مشتق روي تابعي كه در كالس پايه (‪) base class‬‬
‫تعريف شده انجام مي‌شود‪.‬‬

‫در اسالید بعد مثالی آورده شده است‪.‬‬

‫‪Pr.rashidi@gmail.com‬‬ ‫‪379‬‬
#include <iostream.h>
class base
: ‫مثال‬
{
public :
virtual void vfunc( ){cout <<  this is base s vfunc( ) \n ;}
};
class derived1 : public base {
public:
void vfunc( ) {cout <<  this is derived1 s vfunc( ) " << endl ; }
};
class derived2: public derived1 {
public:
/*vfunc( ) not overridden by derived2.In this case, since derived2 is
derived from derived1, derived1 s vfunc( ) is used */ } ;
int main( )
{
base *p, b;
derived1 d1;
derived2 d2;
//point to base
p = &b;
p  vfunc( ); // access base's vfunc
// point to derived1
p=&d1;
p  vfunc( ); //access derived1's vfunc( )
//point to derived2
p = &d2;
p  vfunc( ); // use derived1 s vfunc( )
return 0 ;
} Pr.rashidi@gmail.com 380
keywords and alternative tokens.
asm enum protected typedef
auto explicit public typeid
bool extern register typename
break false reinterpret_cast union
case float return unsigned
catch for short using
char friend signed virtual
class goto sizeof void
const if static volatile
const_cast inline static_cast wchar_t
continue int struct while
default long switch xor
delete mutable template xor_eq
do namespace this or_eq
double new throw not
dynamic_cast operator true bitand
else private try and_eq
And -- or bitor not_eq compl

You might also like