مبانی کامپیوتر و برنامه سازی فصل هفتم : مفاهیم اولیه زبان C مدرس : نگین معروفی 7-1 شناسه ها در C   شناسه ) (identifier نامی.

Download Report

Transcript مبانی کامپیوتر و برنامه سازی فصل هفتم : مفاهیم اولیه زبان C مدرس : نگین معروفی 7-1 شناسه ها در C   شناسه ) (identifier نامی.

Slide 1

‫مبانی کامپیوتر و برنامه سازی‬
‫فصل هفتم ‪ :‬مفاهیم اولیه زبان ‪C‬‬
‫مدرس ‪ :‬نگین معروفی‬

‫‪ 7-1‬شناسه ها در ‪C‬‬
‫‪‬‬
‫‪‬‬

‫شناسه )‪ (identifier‬نامی است که به یک قسمت از برنامه مانند متغیر‪ ،‬تابع‪ ،‬ثابت و یا‬
‫‪ ...‬داده می شود‪.‬‬
‫در زبان ‪ C‬برای انتخاب شناسه ها فقط می توان از عالئم زیر استفاده کرد‪:‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫حروف انگلیسی کوچک و بزرگ )‪(A…Z a…z‬‬
‫ارقام )‪(0…9‬‬
‫عالمت خط پایین یا _‬

‫البته یک شناسه نمی تواند با یک رقم شروع شود‪.‬‬
‫چند شناسه مجاز‪ name2 ، average ، sum :‬و ‪student_average‬‬
‫چند شناسه غیرمجاز ‪ 2name‬و یا ‪student average‬‬
‫در برنامه نویسی امروزی پیشنهاد می شود بجای شناسه هایی همانند‬
‫‪ student_average‬از ‪ studentAverage‬استفاده گردد‪.‬‬
‫نکته مهم دیگری که باید به آن اشاره کرد آنستکه زبان ‪ C‬برخالف بسیاری از زبانهای دیگر‬
‫به کوچک و بزرگی حروف حساس است )‪ .(case sensitive‬در نتیجه شناسه های زیر با‬
‫یکدیگر متفاوتند ‪:‬‬
‫‪Sum ≠ sum ≠ SUM‬‬
‫آخرین نکته اینستکه در هنگام انتخاب شناسه نمی توانید از کلمات کلیدی که برای‬
‫منظورهای خاص در زبان ‪ C‬رزرو شده اند استفاده کنید‪.‬‬

C ‫ شناسه ها در‬7-1
: C ‫کلمات کلیدی در زبان‬
auto

break

case

char

const

continue

default

do

double

else

enum

extern

float

for

goto

if

int

long

register

return

short

signed

sizeof

static

struct

switch

typedef

union

unsigned

void

volatile

while

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫محدوده‬

‫اندازه )بیت(‬

‫توضیح‬

‫نوع داده‬

‫‪-128 to +127‬‬

‫‪8‬‬

‫کاراکتر‬

‫‪char‬‬

‫‪-32768 to +32767‬‬

‫‪16‬‬

‫عدد صحیح‬

‫‪int‬‬

‫‪3.4e-38 to 3.4e+38‬‬

‫‪32‬‬

‫عدد اعشاری‬

‫‪float‬‬

‫‪1.7e-308 to 1.7e+308‬‬

‫‪64‬‬

‫عدد اعشاری با‬
‫دقت مضاعف‬

‫‪double‬‬

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫‪‬‬

‫البته چند نکته مهم درمورد این جدول قابل ذکر است ‪:‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫اندازه ‪ int‬در محیطهای ‪ 16‬بیتی مانند ‪ DOS‬برابر ‪ 16‬بیت است‪ .‬اما در‬
‫محیطهای ‪ 32‬بیتی همانند ‪ Windows‬اندازه آن ‪ 32‬بیت می باشد که در‬
‫اینصورت محدوده ای برابر ‪ -2,147,483,648‬تا ‪ +2,147,483,647‬را‬
‫پوشش می دهد‪.‬‬
‫در بعضی از کامپایلرهای ‪ ،C‬نوع داده ‪ bool‬نیز وجود دارد که می تواند‬
‫یکی از مقادیر ‪)true‬درست( یا ‪) false‬غلط( را نشان دهد ‪ .‬اما در نسخه‬
‫های اولیه ‪ C‬از همان نوع داده صحیح یا ‪ int‬برای اینکار استفاده می‬
‫شد‪ .‬بدین صورت که ‪ 0‬نشاندهنده ‪ false‬و هر عدد غیر صفر )معموال ‪(1‬‬
‫نشاندهنده ‪ true‬است‪.‬‬
‫از آنجا که برای ذخیره سازی کاراکترها کد اسکی آنها ذخیره می گردد‪،‬‬
‫از یک متغیر کاراکتری یا ‪ char‬می توان بعنوان یک عدد صحیح کوچک نیز‬
‫استفاده کرد و اعمال ریاضی برروی آنها نیز مجاز است‪.‬‬

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫عالوه براین چندین اصالح کننده نیز وجود دارد که به ما اجازه می دهد نوع داده مورد‬
‫نظر را با دقت بیشتری برای نیازهای مختلف استفاده نماییم‪.‬‬
‫این اصالح کننده ها عبارتند از ‪short, long, signed, unsigned :‬‬
‫تمام این اصالح کننده ها می توانند به نوع داده ‪ int‬اعمال شوند و اثر آنها بستگی‬
‫به محیط دارد‪.‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫در یک محیط ‪16‬بیتی‪short int ،‬بازهم برابر ‪16‬بیت است ولی ‪ long int‬برابر‪32‬بیت می‬
‫باشد‪.‬‬
‫‪ unsigned int‬باعث می شود که یک عدد ‪ 16‬بیتی بدون عالمت داشته باشیم که بازه‬
‫بین ‪ 0‬تا ‪ 65535‬را پوشش می دهد‪ signed int .‬نیز همانند ‪ int‬معمولی بوده و تفاوتی‬
‫ندارد‪.‬‬
‫ترکیب این اصالح کننده ها نیز ممکن است‪ .‬مثال ‪ unsigned long int‬یک عدد ‪ 32‬بیتی‬
‫بدون عالمت است که بازه ‪ 0‬تا ‪ 4,294,967,295‬را پوشش می دهد‪.‬‬

‫برروی نوع داده ‪ char‬فقط اصالح کننده های ‪ signed‬و ‪ unsigned‬را می توان اعمال‬
‫کرد‪ .‬معموال از اصالح کننده ‪ unsigned‬وقتی استفاده می شود که قصد داشته‬
‫باشیم از ‪ char‬بعنوان یک عدد صحیح مثبت بین ‪ 0‬تا ‪ 255‬استفاده کنیم‪.‬‬
‫برروی نوع داده ‪ double‬تنها اصالح کننده ‪ long‬قابل اعمال است و دراینصورت عدد‬
‫اعشاری با ‪ 80‬بیت را خواهیم داشت که قادر است هر عددی در بازه ‪ 3.4e-4932‬تا‬
‫‪ 1.1e+4932‬را در خود نگاه دارد‪.‬‬

‫‪ 7-3‬تعریف متغیرها‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای تعریف متغیرها به شکل زیر عمل می کنیم‪:‬‬

‫;>‪ ‫که ‪ type‬یکی از نوع داده های گفته شده و ‪ variable-list‬لیستی از متغیرها است‬
‫که با کاما از یکدیگر جدا شده اند‪ .‬بعنوان مثال ‪:‬‬
‫;‪int sum‬‬
‫;‪float average‬‬
‫; ‪long int a, b, c‬‬
‫; ‪unsigned long int i, j, k‬‬
‫عالوه براین می توان در هنگام تعریف متغیر به آن مقدار اولیه نیز داد‪ .‬مثال ‪:‬‬
‫; ‪int d = 0‬‬
‫نكته مهم آنكه زبان ‪ C‬به متغیرها مقدار اولیه نمي دهد )حتي ‪ (0‬و برنامه نويس‬
‫خود بايد اينكار را صريحا انجام دهد‪ ،‬درغیر اينصورت مقدار اولیه متغیر‪ ،‬نامعین خواهد‬
‫بود‪.‬‬
‫تعریف متغیرها طبق اصول زبان ‪ C‬میتواند درهرجایی از برنامه صورت پذیرد‪ ،‬و‬
‫متغیرهای تعریف شده از همان خط به بعد قابل استفاده خواهد بود‪ .‬اما معموال‬
‫توصیه می گردد كه تعریف متغیرها در همان خط ابتدایی تابع و بالفاصله پس از {‬
‫صورت پذیرد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫‪‬‬
‫‪‬‬

‫ثابتها مقادیر ثابتی هستند كه مقدار آنها در حین اجرای برنامه تغییر نمی یابد‪ .‬ثابتها می توانند از‬
‫هریك از نوع داده های اصلی باشند‪.‬‬
‫ثوابت عددی صحیح ‪:‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫برای نمایش این دسته از ثوابت‪ ،‬از دنباله ای از ارقام بعالوه عالمت ‪ +‬یا ‪ -‬استفاده می كنیم‪ .‬بعنوان مثال‬
‫‪ -45‬و یا ‪ 3489‬ثوابت صحیح هستند‪.‬‬
‫در حالت عادی ‪ C‬هر عدد را در كوچكترین نوع داده ای كه می تواند قرار می دهد‪ .‬مثال عدد ‪ 85‬در یك‬
‫‪ int‬قرار می گیرد‪ ،‬اما عدد ‪ 145398‬در یك ‪ long int‬قرار خواهد گرفت‪.‬‬
‫اگر قصد دارید یك عدد كوچك بعنوان ‪ long‬محسوب گردد‪ ،‬می توانید از پسوند ‪ L‬در انتهای آن استفاده‬
‫می كنیم‪ .‬مثال ‪245L‬یك عدد ‪ long‬محسوب می شود‪.‬‬
‫;‪long int a = 20L‬‬
‫پسوند ‪ U‬در انتهای عدد نیز نشانه بدون عالمت بودن آن است‪.‬‬
‫نكته دیگر آنكه ‪ C‬به شما اجازه می دهد درصورت لزوم ثوابت صحیح خود را در مبنای ‪ 8‬یا ‪ 16‬نیز كه‬
‫از مبناهای متداول در برنامه نویسی هستند‪ ،‬بنویسید‪.‬‬
‫‪‬‬
‫‪‬‬

‫برای نوشتن عدد در مبنای ‪ 8‬باید آن را با ‪ 0‬آغاز كنید‪ ،‬مثال ‪ 0342‬یك عدد در منای ‪ 8‬محسوب می‬
‫گردد‪.‬‬
‫برای نوشتن یك عدد در مبنای ‪ 16‬باید آن را با ‪ 0x‬آغاز نمایید‪ ،‬مانند ‪.0x27A4‬‬

‫‪ 7-4‬ثوابت‬
‫ثوابت عددی اعشاری‬

‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫برای نمایش اعداد اعشاری‪ ،‬باید از نقطه اعشار استفاده كنیم‪ ،‬مانند ‪237.45‬‬
‫اما نكته جالب آنستكه می توانید از نماد علمی نیز برای نمایش اعداد‬
‫اعشاری استفاده كنید‪ .‬برای اینكار كافی است از حرف ‪ e‬برای نمایش قسمت‬
‫توان استفاده نمایید‪ .‬بعنوان مثال ‪:‬‬
‫‪-23.47 × 10 5 = -23.47e5‬‬
‫‪42.389 × 10 -3 = 42.389e-3‬‬
‫دقت كنید كه قسمت توان‪ ،‬حتما یك عدد صحیح است‪.‬‬
‫نكته جالب اینجاست كه برخالف مورد قبل‪ ،‬كامپایلر بطور پیش فرض داده های‬
‫اعشاری را از نوع ‪ double‬فرض می كند‪.‬چنانچه دوست دارید ثابت شما ازنوع‬
‫‪ float‬درنظر گرفته شود‪ ،‬در انتهای آن ‪ F‬قرار دهید‪ .‬ضمنا پسوند ‪ L‬نیز داده‬
‫اعشاری را از نوع ‪ long double‬درنظر می گیرد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫ثوابت كاراكتری ‪:‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫برای نشان دادن ثوابت كاراكتری‪ ،‬آنها را در داخل ' قرار می دهیم‪ .‬بعنوان مثال‬
‫'‪'A‬یك ثابت كاراكتری است‪.‬‬
‫; '‪char ch = 'S‬‬
‫دقت كنید كه همانطور كه قبال گفته شد‪ ،‬كد اسكی كاراكترها در متغیر ذخیره‬
‫می گردد‪ ،‬بنابراین می توان از آن بعنوان یك عدد صحیح نیز استفاده كرد‪ .‬نكته‬
‫مهم دیگر آنستكه به تفاوت عدد ‪ 5‬و كاراكتر '‪ '5‬دقت داشته باشید‪ .‬در حقیقت‬
‫'‪ '5‬برابر است با عدد ‪ 53‬كه همان كد اسكی آن است‪.‬‬
‫روش فوق‪ ،‬برای نمایش کاراکترهای قابل چاپ مناسب است‪ ،‬اما بعضی‬
‫كاراكترها مانند ‪ enter‬قابل نمایش نبوده و برای آنها شکل خاصی وجود ندارد‪.‬‬
‫در چنین مواردی‪ ،‬زبان ‪ C‬از ترکیب عالمت \ به همراه یک کاراکتر دیگر‪ ،‬برای‬
‫نمایش این قبیل کاراکترها استفاده می نماید‪ .‬بعنوان مثال‪ ،‬کاراکتر '‪ '\n‬نشان‬
‫دهنده خط جدید یا همان ‪ enter‬می باشد‪.‬‬
‫جدول صفحه بعد این قبیل کاراکترها و معادل آنها را نشان می دهد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫نحوه نمایش در ‪C‬‬

‫کد اسکی‬

‫صدای بوق کامپیوتر‬

‫‪\a‬‬

‫‪7‬‬

‫حرکت به عقب ‪backspace‬‬

‫‪\b‬‬

‫‪8‬‬

‫شروع صفحه ‪form feed‬‬

‫‪\f‬‬

‫‪12‬‬

‫سطر جدید ‪line feed‬‬

‫‪\n‬‬

‫‪10‬‬

‫برگشت به ابتداي سطر ‪carriage return‬‬

‫‪\r‬‬

‫‪13‬‬

‫فاصله افقی ‪horizontal tab‬‬

‫‪\t‬‬

‫‪9‬‬

‫فاصله عمودی ‪vertical tab‬‬

‫‪\v‬‬

‫‪11‬‬

‫عالمت سوال‬

‫?\‬

‫‪63‬‬

‫عالمت '‬

‫'\‬

‫‪39‬‬

‫عالمت "‬

‫"\‬

‫‪34‬‬

‫عالمت \‬

‫\\‬

‫‪92‬‬

‫عالمت تهی‬

‫‪\0‬‬

‫‪0‬‬

‫نام کاراکتر‬

‫کد اسکی یک کاراکتر با ‪ 3‬رقم در مبنای ‪8‬‬

‫‪\000‬‬

‫کد اسکی یک کاراکتر با ‪ 2‬رقم در مبنای ‪16‬‬

‫‪\x00‬‬

‫‪ 7-4‬ثوابت‬
‫‪‬‬

‫ثوابت رشته ای ‪ C :‬عالوه بر ثوابت فوق‪ ،‬از یك ثابت دیگر بنام رشته نیز‬
‫حمایت می كند‪ .‬رشته‪ ،‬دنباله ای از كاراكترها است كه در داخل " قرار‬
‫می گیرند‪ .‬بعنوان مثال "‪ "this is a test‬یك رشته است‪ .‬دقت كنید كه '‪'a‬‬
‫یك كاراكتر است‪ ،‬اما "‪ "a‬یك رشته است كه فقط شامل یك كاراكتر می‬
‫باشد‪.‬‬

‫‪ 7-5‬عملگرها‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫عملگر‪ ،‬نمادی است كه به كامپایلر می گوید تا عملیات محاسباتی یا‬
‫منطقی خاصی را برروی یك یا چند عملوند‪ ،‬انجام دهد‪.‬‬
‫به عملگرهایی كه فقط یك عملوند دارند‪ ،‬عملگر یكانی می گوییم و‬
‫همواره عملگر در سمت چپ عملوند قرار می گیرد)مانند عدد ‪.(-125‬‬
‫اما عملگرهایی كه برروی دو عملوند اثر می كنند را عملگر دودویی‬
‫نامیده و عملگر را بین دو عملوند قرار می دهیم )مانند ‪.(23+86‬‬
‫هر ترکیب درستی از عملگرها و عملوندها را یک عبارت می نامیم‪.‬‬
‫‪ C‬از نقطه نظر عملگرها یك زبان بسیار قوی است‪ .‬این عملگرها به چند‬
‫دسته اصلی تقسیم می گردند كه آنها را به ترتیب بررسی می كنیم‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫این عملگرها‪ ،‬همان اعمال متداول ریاضی هستند كه در زبان ‪ C‬مورد استفاده‬
‫قرار می گیرند‪ .‬این اعمال عبارتند از ‪:‬‬

‫عمل‬

‫نوع‬

‫عملگر‬

‫منفی كردن عملوند سمت راست‬

‫یكانی‬

‫‪-‬‬

‫جمع دو عملوند‬

‫دودویی‬

‫‪+‬‬

‫تفریق دو عملوند‬

‫دودویی‬

‫‪-‬‬

‫ضرب دو عملوند‬

‫دودویی‬

‫*‬

‫تقسیم دو عملوند‬

‫دودویی‬

‫‪/‬‬

‫محاسبه باقیمانده تقسیم دو عملوند‬

‫دودویی‬

‫‪%‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬
‫‪‬‬

‫این عملگرهای برروی همه انواع داده های ‪ C‬عمل می كنند‪ ،‬بجز عملگر ‪ %‬كه فقط‬
‫برروی نوع داده های صحیح عمل می كند‪.‬‬
‫اما نكته مهمی كه باید به آن اشاره كرد‪ ،‬نحوه كار عملگر تقسیم برروی نوع داده های‬
‫مختلف است‪.‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫درصورتیكه هردو عملوند صحیح باشند‪ ،‬تقسیم بصورت صحیح بر صحیح انجام خواهد شد‪.‬‬
‫اگر یكی یا هر دو عملوند اعشاری باشند‪ ،‬تقسیم بصورت اعشاری انجام خواهد پذیرفت‪.‬‬
‫فرض كنید تعاریف زیر را داریم ‪:‬‬
‫; ‪int a,b‬‬
‫; ‪float c,d‬‬
‫; ‪a = 10 ; b = 4‬‬
‫;‪c = 8.2; d = 4.0‬‬
‫اكنون به نتایج عملیات زیر دقت كنید ‪:‬‬
‫‪a / b => 2‬‬
‫‪c / d => 2.05‬‬
‫‪a / d => 2.5‬‬
‫‪a / 4 => 2‬‬
‫چنانچه به آخرین مورد توجه كنید‪ ،‬متوجه می شوید كه از آنجا كه ‪a‬یك متغیر صحیح است و ‪4‬‬
‫نیز یك ثابت صحیح در نظر گرفته شده‪ ،‬درنتیجه تقسیم بصورت صحیح بر صحیح انجام گرفته‬
‫است‪ .‬چنانچه بخواهیم تقسیم بصورت اعشاری صورت پذیرد‪ ،‬به دو شكل می توانیم عمل‬
‫كنیم‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫برای اینکه عبارت تقسیم صفحه قبل بصورت اعشاری انجام شود‪ ،‬به دو روش‬
‫می توان عمل کرد‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫این عبارت را بصورت ‪ a / 4.0‬بنویسیم‪.‬‬
‫از عملگر قالب ریزی استفاده كنیم‪.‬‬

‫عملگر قالب ریزی می تواند یك نوع را به نوع دیگری تبدیل نماید‪ .‬شكل كلی آن‬
‫به شكل زیر است ‪:‬‬
‫>‪() ‫كه ‪ type‬نوع مورد نظر است كه قصد تبدیل عبارت ‪ expression‬به آن نوع را‬
‫داریم‪ .‬بعنوان مثال در مورد قبلی می توان به شكل زیر عمل كرد ‪:‬‬
‫‪(float) a / 4‬‬
‫در این حالت از كامپایلر خواسته ایم كه ابتدا عدد ‪ a‬را به اعشاری تبدیل كند‬
‫)البته بصورت موقت( و سپس آن را بر ‪ 4‬تقسیم نماید‪ ،‬كه مسلما حاصل‬
‫اعشاری خواهد بود‪.‬‬
‫بطوركلی هرگاه ثابتها و متغیرهایی از انواع مختلف در یك عبارت محاسباتی‬
‫داشته باشیم‪ ،‬كامپایلر ‪ C‬همه آنها را به یك نوع یكسان كه همان بزرگترین‬
‫عملوند موجود است تبدیل خواهد كرد‪ .‬بعنوان مثال به مورد صفحه بعد دقت‬
‫كنید ‪:‬‬

‫ عملگرهای محاسباتی‬7-5-1
char ch;
int i;

float f;
double d;
result = (ch / i)
int

+

(f *d)

(f+i)
float

double

double

int

-

double

double

float

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫اولویت عملگرها ‪ :‬در عبارتی که شامل چندین عملگر است‪ ،‬کدامیک در‬
‫ابتدا اعمال خواهد گردید‪.‬‬
‫اولویت عملگرهای محاسباتی از باال به پایین بشرح زیر است‪:‬‬
‫‪ ‬عملگر یکانی –‬
‫‪ ‬عملگرهای * و ‪ /‬و ‪%‬‬
‫‪ ‬عملگرهای ‪ +‬و –‬
‫چنانچه اولویت دو عملگر یکسان باشد‪ ،‬این عملگرها از چپ به راست‬
‫محاسبه خواهند شد‪.‬‬
‫چنانچه بخواهیم یک عمل با اولویت پایین زودتر انجام شود‪ ،‬باید از پرانتز‬
‫استفاده کنیم‪ .‬بنابراین اولویت عملگر پرانتز از همه موارد فوق‬
‫بیشتراست‪ .‬در مورد پرانتزهای متداخل‪ ،‬ابتدا پرانتز داخلی محاسبه‬
‫می شود؛ اما در مورد پرانتزهای هم سطح‪ ،‬ابتدا پرانتز سمت چپتر‬
‫محاسبه می گردد‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫چند مثال در مورد اولویت عملگرها‬

‫ترتیب اجرای عملگرها‬

‫عبارت زبان ‪C‬‬

‫ابتدا عمل * و سپس عمل ‪+‬‬

‫‪b+c*d‬‬

‫ابتدا عمل ‪ +‬و سپس عمل *‬

‫‪(b + c) * d‬‬

‫ابتدا عمل ‪ /‬سپس عمل * و در انتها عمل ‪+‬‬

‫‪b+c/d*e‬‬

‫ابتدا عمل * سپس عمل ‪ /‬و در انتها عمل ‪+‬‬

‫)‪b + c / (d * e‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫یک مثال کامل در مورد اولویت عملگرها‬

‫‪result = a + b * (f – (g + b) / d) – c * (a – d) / e‬‬
‫‪6‬‬

‫‪1‬‬
‫‪7‬‬

‫‪2‬‬

‫‪8‬‬

‫‪3‬‬
‫‪4‬‬
‫‪5‬‬
‫‪9‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫در زبان ‪ C‬برای انتساب چندین عملگر وجود دارد‪ .‬ساده ترین عملگر انتساب‪ ،‬همان عملگر =‬
‫است که در بسیاری از زبانها استفاده می شود‪ .‬بعنوان مثال ‪:‬‬
‫;‪a = 5‬‬
‫;‪b = c + 2 * d‬‬
‫این عملگر باعث می شود که عبارت سمت راست در عبارت سمت چپ قرار گیرد‪.‬‬
‫توجه کنید که مقدار سمت چپ باید عبارتی باشد که بتوان به آن یک مقدار را نسبت داد‬
‫)مانند یک متغیر( که به آن ‪ Lvalue‬گفته می شود‪ ،‬بنابراین یک ثابت نمی تواند در سمت چپ‬
‫قرار گیرد‪.‬‬
‫نکته دیگر اینکه اولویت عملگر = از عملگرهای ریاضی کمتر است و درنتیجه ابتدا آن عملیات‬
‫انجام شده و در پایان حاصل در عبارت سمت چپ ریخته می شود‪.‬‬
‫الزم به ذکر است که در هنگام انتساب‪ ،‬درصورت لزوم نوع عبارت سمت راست به نوع عبارت‬
‫سمت چپ تبدیل می شود‪ .‬مثال‪:‬‬
‫;‪int a‬‬
‫;‪a = 2.5 * 5.0‬‬
‫که دراینصورت عدد ‪ 12‬در ‪ a‬ذخیره خواهد شد‪.‬‬
‫شرکت پذیری این عملگر از راست به چپ می باشد‪ ،‬بدین معنا که چنانچه چندین عملگر‬
‫نسبت دهی داشته باشیم‪ ،‬این عملگرها از راست به چپ محاسبه می شوند‪ .‬مثال پس از‬
‫اجرای دستور زیر‪ ،‬مقدار هر ‪ 3‬متغیر برابر ‪ 10‬خواهد شد‪.‬‬
‫;‪a = b = c = 10‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬

‫نکته جالب درمورد زبان ‪ C‬آنستکه دارای یک سری عملگرهای انتساب‬
‫خالصه شده است که باعث می شوند در بعضی موارد بتوانیم عبارات‬
‫کوتاهتری را بنویسیم‪ .‬این عملگرها عبارتند از ‪:‬‬
‫عملگرد‬

‫مثال‬

‫عبارت انتساب معادل‬

‫‪++‬‬

‫;‪a ++‬‬

‫;‪a = a + 1‬‬

‫‪--‬‬

‫;‪a --‬‬

‫;‪a = a – 1‬‬

‫=‪+‬‬

‫;‪a += 5‬‬

‫;‪a = a + 5‬‬

‫=‪-‬‬

‫;‪a -= 8‬‬

‫;‪a= a – 8‬‬

‫=*‬

‫;‪a *= 10‬‬

‫;‪a= a * 10‬‬

‫=‪/‬‬

‫;‪a /= 2‬‬

‫;‪a = a / 2‬‬

‫=‪%‬‬

‫;‪a %= 10‬‬

‫;‪a = a % 10‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬
‫‪‬‬

‫عملگر اول و دوم‪ ،‬عملگرهای یکانی هستند که بترتیب عملگر افزایش و عملگر کاهش‬
‫نامیده می شوند‪.‬‬
‫نکته جالب آنستکه این دو عملگر به دوصورت مورد استفاده قرار می گیرند‪.‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫در حالتی که از دستور ;‪ a ++‬استفاده شود به آن پس افزایش می گویند و بدین معناست که‬
‫ابتدا از مقدار فعلی ‪ a‬در عبارت موردنظر استفاده کن و سپس آن را افزایش بده‪.‬‬
‫اما دستور ;‪ ++ a‬که به آن پیش افزایش گفته می شود‪ ،‬ابتدا ‪ a‬را افزایش داده و سپس از آن‬
‫در عبارت استفاده می کند‪.‬‬
‫به برنامه زیر دقت کنید‪:‬‬

‫>‪#include ‫{ )(‪void main‬‬
‫; ‪int a ,b‬‬
‫;‪a=5‬‬
‫;‪b = a ++‬‬
‫;)‪printf(“a=%d and b=%d \n”,a,b‬‬
‫;‪a=5‬‬
‫;‪b = ++ a‬‬
‫;)‪printf(“a=%d and b=%d \n”,a,b‬‬
‫}‬
‫‪a=6 b=5‬‬
‫‪a=6 b=6‬‬

‫‪ 7-5-3‬عملگرهای مقایسه ای‬
‫‪‬‬

‫‪‬‬

‫این عملگرها دو عبارت را بایکدیگر مقایسه کرده و نتیجه را باز می گردانند‪.‬‬
‫نتیجه می تواند درست )‪ (true‬یا غلط )‪ (false‬باشد‪.‬‬
‫نتیجه این عملگرها یک عدد صحیح است که درصورت درست بودن ‪ 1‬و‬
‫درصورت غلط بودن ‪ 0‬باز می گردانند‪ .‬این عملگرها عبارتند از‪:‬‬
‫عملگر‬

‫مفهوم عملگر‬

‫مثال‬

‫<‬

‫بزرگتر )<(‬

‫‪a>b‬‬

‫>‬

‫کوچکتر )>(‬

‫‪a
‫=<‬

‫بزرگتر یا مساوی )≤(‬

‫‪a >= b‬‬

‫=>‬

‫کوچکتر یا مساوی )≥(‬

‫‪a <= b‬‬

‫==‬

‫مساوی )=(‬

‫‪a == b‬‬

‫=!‬

‫نامساوی )≠(‬

‫‪a != b‬‬

‫‪ 7-5-3‬عملگرهای مقایسه ای‬
‫‪‬‬

‫‪‬‬

‫نکته مهمی که باید به آن دقت کرد عملگر مساوی )==( است‪ ،‬چرا که یک‬
‫اشتباه بسیار متداول برنامه نویسان ‪ C‬استفاده اشتباه از عملگر انتساب‬
‫)=( بجای عملگر تساوی )==( است که باعث ایجاد خطا در برنامه می‬
‫شود‪.‬‬
‫اولویت این عملگرها از باال به پایین بشرح زیر است‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫عملگرهای <‪ <= ، > ،‬و =>‬
‫عملگرهای == و =!‬

‫الزم بذکر است که در هنگام مساوی بودن اولویت چند عملگر‪ ،‬این عملگرها‬
‫از چپ به راست محاسبه می گردند‪.‬‬

‫‪ 7-5-4‬عملگرهای منطقی‬
‫‪‬‬

‫این عملگرها به شما اجازه می دهند که شرطهای ساده ای را که با‬
‫استفاده از عملگرهای مقایسه ای ایجاد شده اند را با یکدیگر ترکیب نموده‬
‫و شرطهای پیچیده تری را بسازید‪ .‬این عملگرها عبارتند از ‪:‬‬
‫مثال‬

‫عملگر‬

‫مفهوم عملگر‬

‫نحوه کار‬

‫&&‬

‫‪ AND‬منطقی‬

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

‫‪a>0 && sw==1‬‬

‫||‬

‫‪ OR‬منطقی‬

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

‫‪a<=100 || b!=0‬‬

‫!‬

‫‪ NOT‬منطقی‬

‫اگر عملوند درست باشد‪ ،‬نادرست و‬
‫اگر نادرست باشد‪ ،‬درست برمی‬
‫گرداند‪.‬‬

‫)‪! (a==1 || b<10‬‬

‫‪ 7-5-5‬عملگر شرطی‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫گاهی الزم است که ابتدا یک شرط بررسی شده و سپس برمبنای نتیجه )درست یا نادرست بودن آن( یکی‬
‫از دو عبارت ممکن بازگردانده شود‪ .‬برای اینکار می توان از یک عملگر ‪3‬تایی )با ‪ 3‬عملوند( بنام عملگر‬
‫شرطی استفاده نمود‪.‬‬
‫شکل کلی این عملگر بصورت زیر است‪:‬‬
‫>عبارت‪> :<2‬عبارت‪> ?<1‬شرط<‬
‫نحوه کار بدینصورت است که درصورت درست بودن شرط‪ ،‬عبارت‪ 1‬و در غیراینصورت عبارت ‪ 2‬بازگردانده می‬
‫شود‪.‬‬
‫به عنوان مثال به دستور زیر توجه کنید‪:‬‬
‫که این عبارت معادل دستور زیر است‪:‬‬

‫‪‬‬

‫;‪a = (k<10) ? 100 : 50‬‬
‫;‪if (k<10) a=100‬‬
‫;‪else a=50‬‬

‫البته این عبارت به شکلهای پیچیده نیز می تواند مورد استفاده قرار گیرد‪ .‬مثال ‪:‬‬
‫;‪c += (a>0 && a<10) ? ++a : a/b‬‬
‫که معادل است با ‪:‬‬
‫{ )‪if (a>0 && a<10‬‬
‫;‪a= a + 1‬‬
‫;‪c = c + a‬‬
‫}‬
‫;‪else c = c + a/b‬‬

‫‪ 7-5-6‬اولویت عملگرها‬
‫عملگر‬

‫اولویت‬

‫شرکت پذیری‬

‫‪1‬‬

‫)(‬

‫از چپ به راست‬

‫‪2‬‬

‫‪- + ! -- ++‬‬

‫از راست به چپ‬

‫‪3‬‬

‫‪* / %‬‬

‫از چپ به راست‬

‫‪4‬‬

‫‪+ -‬‬

‫از چپ به راست‬

‫‪5‬‬

‫>> <<‬

‫از چپ به راست‬

‫‪6‬‬

‫>= > <= <‬

‫از چپ به راست‬

‫‪7‬‬

‫=! ==‬

‫از چپ به راست‬

‫‪8‬‬

‫&&‬

‫از چپ به راست‬

‫‪9‬‬

‫||‬

‫از چپ به راست‬

‫‪10‬‬

‫‪?:‬‬

‫از راست به چپ‬

‫‪11‬‬

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

‫از راست به چپ‬

‫‪12‬‬

‫‪,‬‬

‫از چپ به راست‬

‫‪ 7-6‬خواندن و نمایش اطالعات‬
‫‪‬‬

‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫همانطور كه قبال نیز گفته شد‪ ،‬یكی از اهداف زبان ‪ C‬قابل حمل بودن آن‬
‫است‪ .‬بهمین منظور سعی شده است كه از دستوراتی كه ممكن است‬
‫وابسته به ماشین خاصی باشد‪ ،‬اجتناب گردد‪.‬‬
‫بهمین دلیل زبان ‪ C‬برخالف سایر زبانها دارای هیچ دستوری برای‬
‫خواندن از ورودی و یا نوشتن در خروجی نیست‪.‬‬
‫اما در عوض دارای تعدادی تابع )زیربرنامه( استاندارد می باشد كه تقریبا‬
‫تمامی كامپایلرها از آنها حمایت می كنند‪.‬‬
‫این كار به كامپایلر این امكان را می دهد كه بر حسب نوع سخت افزار‬
‫موردنظر‪ ،‬توابع ورودی و خروجی را طراحی نماید‪.‬‬
‫این توابع در یك فایل سرآمد بنام ‪ stdio.h‬تعریف شده اند و بنابراین قبل‬
‫ازاینكه بتوانید از این توابع استفاده نمایید‪ ،‬باید این فایل را نیز با استفاده‬
‫از ‪ #include‬در برنامه خود بگنجانید‪.‬‬

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫برای نمایش اطالعات در خروجی از تابع ‪ printf‬استفاده می شود‪.‬‬
‫این تابع رشته موردنظر شما را به خروجی استاندارد )كه در حالت‬
‫عادی همان صفحه نمایش یا مانیتور است( می فرستد‪ .‬شكل كلی این‬
‫تابع بصورت زیر است‪:‬‬
‫; )>لیست متغیرها< ‪> ,‬رشته كنترلی<(‪printf‬‬
‫رشته كنترلی همان متنی است كه قصد چاپ آن را داریم‪ ،‬با ذكر این‬
‫نكته كه در قسمتهایی كه باید مقدار یك متغیر چاپ شود‪ ،‬از یك‬
‫مشخصه تبدیل استفاده می شود‪ .‬هر مشخصه تبدیل از یك عالمت ‪%‬‬
‫بعالوه یك كاراكتر كه نوع متغیر مورد نظر را نشان می دهد تشكیل می‬
‫گردد‪.‬‬
‫لیست متغیرها نیز همان متغیرهایی هستند كه قصد چاپ آنها را داریم‪.‬‬
‫این متغیرها باید بترتیب قرار گرفته و با كاما )‪ (,‬از یكدیگر جدا شوند‪.‬‬

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫مشخصه تبدیل‬

‫مفهوم‬

‫‪%c‬‬

‫كاراكتر‬

‫‪%d‬‬

‫عدد صحیح در مبنای ‪10‬‬

‫‪%f‬‬

‫عدد اعشاری بدون نماد علمی‬

‫‪%e‬‬

‫عدد اعشاری با نماد علمی‬

‫‪%g‬‬

‫عدد اعشاری با حالت كوتاهتر بین ‪ e‬و ‪f‬‬

‫‪%s‬‬

‫رشته‬

‫‪%ld‬‬

‫عدد صحیح بزرگ‬

‫‪%lf %le %lg‬‬

‫عدد اعشاری بزرگ‬

‫‪%o‬‬

‫عدد صحیح در مبنای ‪8‬‬

‫‪%x‬‬

‫عدد صحیحی در مبنای ‪16‬‬

‫‪%u‬‬

‫عدد صحیح بدون عالمت‬

‫ تابع نمایش در خروجی‬7-6-1
#include
void main() {
int age = 20;
floate average = 18.23;
printf("You are %d years old and your average is %f \n",age,average);
}
You are 20 years old and your average is 18.230000

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫‪‬‬
‫‪‬‬

‫برای کنترل نحوه چاپ اعداد می توانید از مشخصه طول میدان استفاده‬
‫کنید‪.‬‬
‫مشخصه طول میدان برای اعداد به شكل زیر استفاده می شود‪:‬‬
‫‪ ‬برای اعداد صحیح از ‪ %nd‬استفاده می كنیم كه ‪ n‬تعداد ارقام را نشان‬
‫می دهد )مثال ‪ .(%3d‬در اینصورت برای هر متغیر ‪ n‬رقم درنظر گرفته‬
‫می شود‪ .‬اگر اندازه عدد از ‪ n‬كوچكتر باشد‪ ،‬به سمت چپ آن فضای‬
‫خالی اضافه می شود و اگر اندازه عدد بیش از ‪ n‬رقم باشد‪ ،‬طول میدان‬
‫نادیده گرفته شده و عدد بطور كامل چاپ می شود‪.‬‬
‫‪ ‬برای اعداد اعشاری از ‪ %n.mf‬استفاده می كنیم كه ‪ n‬اندازه كل عدد‬
‫)شامل عالمت ممیز( و ‪ m‬تعداد ارقام اعشار است )مثال ‪ .(%5.2f‬در‬
‫صورتیكه تعداد ارقام اعشاری عدد موردنظر از ‪ m‬بیشتر باشد‪ ،‬عدد به ‪m‬‬
‫عدد اعشار گرد می شود و در صورتیكه از ‪ m‬كمتر باشد‪ ،‬در سمت‬
‫راست آن ‪ 0‬قرار داده می شود‪.‬‬

‫‪ 7-6-2‬تابع خواندن از ورودی‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای خواندن اطالعات از ورودی از تابع ‪ scanf‬استفاده می شود‪.‬‬
‫این تابع اطالعات را ازورودی استاندارد )معموال صفحه كلید( خوانده و در‬
‫متغیرهای تعیین شده قرار می دهد‪.‬‬
‫شكل كلی این تابع بصورت زیر است‪:‬‬
‫; )>لیست آدرسهای متغیرها< ‪> ,‬رشته كنترلی<(‪scanf‬‬
‫همانطور كه می بینید نحوه احضار تابع ‪ scanf‬نیز مشابه ‪ printf‬است‪ .‬تنها‬
‫تفاوت در آن است كه در ‪ scanf‬باید لیست آدرسهای متغیرها ارسال شود‪.‬‬
‫مبحث مربوط به آدرسها در فصول بعدی بررسی خواهد شد ولی در حال حاضر‬
‫بخاطر بسپارید كه برای بدست آوردن آدرس یك متغیر از عالمت & استفاده می‬
‫كنیم‪ .‬بعنوان مثال ‪ &age‬بمعنای آدرس متغیر ‪ age‬است‪.‬‬
‫بطور كلی در ‪ C‬قدیمی هرگاه كه یك تابع دارای پارامترهای خروجی بود )یعنی‬
‫پارامترهایی كه یك مقدار را باز می گرداندند( از آدرس متغیرها استفاده می‬
‫شد كه امروزه این مسئله وجود ندارد‪.‬‬

‫ تابع خواندن از ورودی‬7-6-2
#include
void main() {
int age;
float average ;
printf("Please enter your age and average : ");
scanf("%d %f",&age,&average);
printf("You are %d years old and your average is %5.2f \n",age,average);
}

Please enter your age and average : 19 16.72
You are 19 years old and your average is 16.72

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫زبان ‪ C++‬یک زبان شی گرا است‪ ،‬بهمین دلیل در این زبان برای ورودی‬
‫و خروجی از اشیاء بجای توابع استفاده می گردد‪.‬‬
‫از آنجا که امروزه معموال برنامه نویسان ‪ C‬از کامپایلرهای ‪ C++‬استفاده‬
‫می کنند‪ ،‬می توانند از اشیای ورودی و خروجی آن نیز استفاده کنند‪.‬‬
‫اینکار در بین بسیاری از برنامه نویسان ‪ C‬متداول است‪ ،‬بهمین دلیل ما‬
‫در اینجا نحوه کار با اشیای خواندن و نوشتن در ‪ C++‬را بطور مقدماتی‬
‫توضیح می دهیم؛ گرچه توضیح کامل این موارد نیاز به آشنایی با شی‬
‫گرایی و زبان ‪ C++‬دارد‪.‬‬
‫قبل از هرچیز الزم به ذکر است که کلیه اشیای مربوط به ورودی و‬
‫خروجی در فایل سرآمدی بنام ‪ iostream.h‬تعیریف شده اند‪ ،‬بنابراین‬
‫ابتدا باید این فایل به برنامه توسط دستور ‪ #include‬الحاق گردد‪.‬‬

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫زبان ‪ C++‬برای نمایش اطالعات از یک شیئ بنام ‪ cout‬استفاده می نماید‪.‬‬
‫برای ارسال اطالعات مورد نظر برای چاپ به ‪ cout‬باید از عملگر درج در جریان‬
‫یا >> استفاده نماییم‪ .‬بعنوان مثال ‪:‬‬
‫; ” ‪cout >> “Please enter your name:‬‬
‫و یا مثال دیگر ‪:‬‬
‫;‪int a = 10‬‬
‫;‪float b = 2.86‬‬
‫;‪cout << a‬‬
‫;‪cout << b‬‬
‫نکته جالبی که در این مثالها دیده می شود‪ ،‬آنستکه برخالف تابع ‪ printf‬هیچ‬
‫نیازی به مشخص کردن نوع متغیری که قصد چاپ آن را داریم نیست و خود‬
‫شئ ‪ cout‬نوع آن را تشخیص می دهد‪.‬‬
‫عالوه براین می توان چندین عملگر درج در جریان را با یکدیگر الحاق کرد و‬
‫چندین متغیر را با یک دستور چاپ کرد‪.‬‬

C++ ‫ ورودی و خروجی اطالعات در‬7-6-3
#include
void main() {
int age = 20;
floate average = 18.23;
cout >> “You are ” >> age >> “ years old and your average is ” >> average ;
}

You are 20 years old and your average is 18.230000

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای دریافت اطالعات از کاربر‪ ،‬از شئ دیگری بنام ‪ cin‬استفاده می شود‪.‬‬
‫برای ارسال متغیر مورد نظر به ‪ cin‬باید از عملگر استخراج از جریان یا <<‬
‫استفاده نماییم‪ .‬بعنوان مثال‪:‬‬
‫;‪int a‬‬
‫;‪cin >> a‬‬
‫بازهم همانطور که می بینید نیازی به تعیین نوع متغیر موردنظر نیست و خود‬
‫شئ ‪ cin‬نوع متغیر را بطور اتوماتیک تشخیص داده و داده ای از همان نوع را از‬
‫کاربر دریافت و در متغیر مورد نظر قرار می دهد‪.‬‬
‫عملگرهای استخراج از جریان را نیز می توان با یکدیگر الحاق کرد‪.‬‬
‫برای رفتن به خط بعد در شئ ‪ cout‬می توان از دستکاری کننده ‪ endl‬استفاده‬
‫کرد‪ .‬مثال در دستور زیر پس از چاپ پیغام‪ ،‬مکان نما به خط بعد منتقل می‬
‫شود‪:‬‬
‫;‪cout >> “List of students : “ >> endl‬‬
‫البته دستکاری کننده های متعدد دیگری نیز ازجمله موارد مربوط به تعیین طول‬
‫میدان و نحوه چاپ مقادیر وجود دارد که توضیح آنها نیاز به یک مبحث مستقل‬
‫دارد‪.‬‬

C++ ‫ ورودی و خروجی اطالعات در‬7-6-3
#include
void main() {
int age;
float average ;
cout << "Please enter your age and average : " ;
cin >> age >> average ;
cout << "You are " << age << "years old and your average is " << average;
}

Please enter your age and average : 19 16.72
You are 19 years old and your average is 16.72

‫‪ 7-7‬توابع کتابخانه ای‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫همانطور که قبال نیز گفته شد‪ ،‬زبان ‪ C‬از زیر برنامه ها نیز حمایت می کند‪ .‬هر زیر برنامه‬
‫در ‪ C‬یک تابع نامیده می شود‪ .‬تا کنون با توابعی همچون ‪ main‬و یا ‪ printf‬و ‪ scanf‬آشنا‬
‫شده ایم‪.‬‬
‫معموال عرضه کنندگان کامپایلرها و یا سایر فروشندگان نرم افزار‪ ،‬برخی از توابع عمومی‬
‫را که ممکن است مورد نیاز جمع کثیری از برنامه نویسان مختلف باشد را در قالب‬
‫کتابخانه ای از توابع در اختیار برنامه نویسان می گذارند‪ .‬بعضی از این توابع کتابخانه ای‬
‫مانند ‪ printf‬و ‪ scanf‬بصورت استاندارد درآمده و توسط عرضه کنندگان مختلف ارائه می‬
‫شوند‪.‬‬
‫در کامپایلر عرضه شده توسط شرکت بورلند )‪ (Borland C++ 3.1‬نیز کتابخانه های‬
‫متعددی از توابع برای شما عرضه شده اند که بتدریج با آنها و کاربردشان آشنا خواهید‬
‫شد‪.‬‬
‫نکته مهم آنستکه برای استفاده از این توابع ابتدا باید فایل سرآمد مربوط به آنها را نیز در‬
‫ابتدای برنامه خود اضافه نمایید ) با استفاده از ‪ .(#include‬هر فایل سرآمد شامل تعاریف‬
‫اولیه گروهی از توابع مرتبط با هم و داده های مربوط به آنها بوده و در استاندارد قدیمی‬
‫تر دارای پسوند ‪ .h‬می باشد)در استاندارد جدید پسوند این فایلها حذف شده است(‪.‬‬
‫برخی از این فایلهای سرآمد عبارتند از‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪ : stdio.h‬توابع ورودی و خروجی استاندارد‬
‫‪ : math.h‬توابع ریاضی‬
‫‪ : graphics.h‬توابع مربوط به عملیات گرافیکی‬
‫‪ : string.h‬توابع مربوط به کار با رشته ها‬


Slide 2

‫مبانی کامپیوتر و برنامه سازی‬
‫فصل هفتم ‪ :‬مفاهیم اولیه زبان ‪C‬‬
‫مدرس ‪ :‬نگین معروفی‬

‫‪ 7-1‬شناسه ها در ‪C‬‬
‫‪‬‬
‫‪‬‬

‫شناسه )‪ (identifier‬نامی است که به یک قسمت از برنامه مانند متغیر‪ ،‬تابع‪ ،‬ثابت و یا‬
‫‪ ...‬داده می شود‪.‬‬
‫در زبان ‪ C‬برای انتخاب شناسه ها فقط می توان از عالئم زیر استفاده کرد‪:‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫حروف انگلیسی کوچک و بزرگ )‪(A…Z a…z‬‬
‫ارقام )‪(0…9‬‬
‫عالمت خط پایین یا _‬

‫البته یک شناسه نمی تواند با یک رقم شروع شود‪.‬‬
‫چند شناسه مجاز‪ name2 ، average ، sum :‬و ‪student_average‬‬
‫چند شناسه غیرمجاز ‪ 2name‬و یا ‪student average‬‬
‫در برنامه نویسی امروزی پیشنهاد می شود بجای شناسه هایی همانند‬
‫‪ student_average‬از ‪ studentAverage‬استفاده گردد‪.‬‬
‫نکته مهم دیگری که باید به آن اشاره کرد آنستکه زبان ‪ C‬برخالف بسیاری از زبانهای دیگر‬
‫به کوچک و بزرگی حروف حساس است )‪ .(case sensitive‬در نتیجه شناسه های زیر با‬
‫یکدیگر متفاوتند ‪:‬‬
‫‪Sum ≠ sum ≠ SUM‬‬
‫آخرین نکته اینستکه در هنگام انتخاب شناسه نمی توانید از کلمات کلیدی که برای‬
‫منظورهای خاص در زبان ‪ C‬رزرو شده اند استفاده کنید‪.‬‬

C ‫ شناسه ها در‬7-1
: C ‫کلمات کلیدی در زبان‬
auto

break

case

char

const

continue

default

do

double

else

enum

extern

float

for

goto

if

int

long

register

return

short

signed

sizeof

static

struct

switch

typedef

union

unsigned

void

volatile

while

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫محدوده‬

‫اندازه )بیت(‬

‫توضیح‬

‫نوع داده‬

‫‪-128 to +127‬‬

‫‪8‬‬

‫کاراکتر‬

‫‪char‬‬

‫‪-32768 to +32767‬‬

‫‪16‬‬

‫عدد صحیح‬

‫‪int‬‬

‫‪3.4e-38 to 3.4e+38‬‬

‫‪32‬‬

‫عدد اعشاری‬

‫‪float‬‬

‫‪1.7e-308 to 1.7e+308‬‬

‫‪64‬‬

‫عدد اعشاری با‬
‫دقت مضاعف‬

‫‪double‬‬

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫‪‬‬

‫البته چند نکته مهم درمورد این جدول قابل ذکر است ‪:‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫اندازه ‪ int‬در محیطهای ‪ 16‬بیتی مانند ‪ DOS‬برابر ‪ 16‬بیت است‪ .‬اما در‬
‫محیطهای ‪ 32‬بیتی همانند ‪ Windows‬اندازه آن ‪ 32‬بیت می باشد که در‬
‫اینصورت محدوده ای برابر ‪ -2,147,483,648‬تا ‪ +2,147,483,647‬را‬
‫پوشش می دهد‪.‬‬
‫در بعضی از کامپایلرهای ‪ ،C‬نوع داده ‪ bool‬نیز وجود دارد که می تواند‬
‫یکی از مقادیر ‪)true‬درست( یا ‪) false‬غلط( را نشان دهد ‪ .‬اما در نسخه‬
‫های اولیه ‪ C‬از همان نوع داده صحیح یا ‪ int‬برای اینکار استفاده می‬
‫شد‪ .‬بدین صورت که ‪ 0‬نشاندهنده ‪ false‬و هر عدد غیر صفر )معموال ‪(1‬‬
‫نشاندهنده ‪ true‬است‪.‬‬
‫از آنجا که برای ذخیره سازی کاراکترها کد اسکی آنها ذخیره می گردد‪،‬‬
‫از یک متغیر کاراکتری یا ‪ char‬می توان بعنوان یک عدد صحیح کوچک نیز‬
‫استفاده کرد و اعمال ریاضی برروی آنها نیز مجاز است‪.‬‬

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫عالوه براین چندین اصالح کننده نیز وجود دارد که به ما اجازه می دهد نوع داده مورد‬
‫نظر را با دقت بیشتری برای نیازهای مختلف استفاده نماییم‪.‬‬
‫این اصالح کننده ها عبارتند از ‪short, long, signed, unsigned :‬‬
‫تمام این اصالح کننده ها می توانند به نوع داده ‪ int‬اعمال شوند و اثر آنها بستگی‬
‫به محیط دارد‪.‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫در یک محیط ‪16‬بیتی‪short int ،‬بازهم برابر ‪16‬بیت است ولی ‪ long int‬برابر‪32‬بیت می‬
‫باشد‪.‬‬
‫‪ unsigned int‬باعث می شود که یک عدد ‪ 16‬بیتی بدون عالمت داشته باشیم که بازه‬
‫بین ‪ 0‬تا ‪ 65535‬را پوشش می دهد‪ signed int .‬نیز همانند ‪ int‬معمولی بوده و تفاوتی‬
‫ندارد‪.‬‬
‫ترکیب این اصالح کننده ها نیز ممکن است‪ .‬مثال ‪ unsigned long int‬یک عدد ‪ 32‬بیتی‬
‫بدون عالمت است که بازه ‪ 0‬تا ‪ 4,294,967,295‬را پوشش می دهد‪.‬‬

‫برروی نوع داده ‪ char‬فقط اصالح کننده های ‪ signed‬و ‪ unsigned‬را می توان اعمال‬
‫کرد‪ .‬معموال از اصالح کننده ‪ unsigned‬وقتی استفاده می شود که قصد داشته‬
‫باشیم از ‪ char‬بعنوان یک عدد صحیح مثبت بین ‪ 0‬تا ‪ 255‬استفاده کنیم‪.‬‬
‫برروی نوع داده ‪ double‬تنها اصالح کننده ‪ long‬قابل اعمال است و دراینصورت عدد‬
‫اعشاری با ‪ 80‬بیت را خواهیم داشت که قادر است هر عددی در بازه ‪ 3.4e-4932‬تا‬
‫‪ 1.1e+4932‬را در خود نگاه دارد‪.‬‬

‫‪ 7-3‬تعریف متغیرها‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای تعریف متغیرها به شکل زیر عمل می کنیم‪:‬‬

‫;>‪ ‫که ‪ type‬یکی از نوع داده های گفته شده و ‪ variable-list‬لیستی از متغیرها است‬
‫که با کاما از یکدیگر جدا شده اند‪ .‬بعنوان مثال ‪:‬‬
‫;‪int sum‬‬
‫;‪float average‬‬
‫; ‪long int a, b, c‬‬
‫; ‪unsigned long int i, j, k‬‬
‫عالوه براین می توان در هنگام تعریف متغیر به آن مقدار اولیه نیز داد‪ .‬مثال ‪:‬‬
‫; ‪int d = 0‬‬
‫نكته مهم آنكه زبان ‪ C‬به متغیرها مقدار اولیه نمي دهد )حتي ‪ (0‬و برنامه نويس‬
‫خود بايد اينكار را صريحا انجام دهد‪ ،‬درغیر اينصورت مقدار اولیه متغیر‪ ،‬نامعین خواهد‬
‫بود‪.‬‬
‫تعریف متغیرها طبق اصول زبان ‪ C‬میتواند درهرجایی از برنامه صورت پذیرد‪ ،‬و‬
‫متغیرهای تعریف شده از همان خط به بعد قابل استفاده خواهد بود‪ .‬اما معموال‬
‫توصیه می گردد كه تعریف متغیرها در همان خط ابتدایی تابع و بالفاصله پس از {‬
‫صورت پذیرد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫‪‬‬
‫‪‬‬

‫ثابتها مقادیر ثابتی هستند كه مقدار آنها در حین اجرای برنامه تغییر نمی یابد‪ .‬ثابتها می توانند از‬
‫هریك از نوع داده های اصلی باشند‪.‬‬
‫ثوابت عددی صحیح ‪:‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫برای نمایش این دسته از ثوابت‪ ،‬از دنباله ای از ارقام بعالوه عالمت ‪ +‬یا ‪ -‬استفاده می كنیم‪ .‬بعنوان مثال‬
‫‪ -45‬و یا ‪ 3489‬ثوابت صحیح هستند‪.‬‬
‫در حالت عادی ‪ C‬هر عدد را در كوچكترین نوع داده ای كه می تواند قرار می دهد‪ .‬مثال عدد ‪ 85‬در یك‬
‫‪ int‬قرار می گیرد‪ ،‬اما عدد ‪ 145398‬در یك ‪ long int‬قرار خواهد گرفت‪.‬‬
‫اگر قصد دارید یك عدد كوچك بعنوان ‪ long‬محسوب گردد‪ ،‬می توانید از پسوند ‪ L‬در انتهای آن استفاده‬
‫می كنیم‪ .‬مثال ‪245L‬یك عدد ‪ long‬محسوب می شود‪.‬‬
‫;‪long int a = 20L‬‬
‫پسوند ‪ U‬در انتهای عدد نیز نشانه بدون عالمت بودن آن است‪.‬‬
‫نكته دیگر آنكه ‪ C‬به شما اجازه می دهد درصورت لزوم ثوابت صحیح خود را در مبنای ‪ 8‬یا ‪ 16‬نیز كه‬
‫از مبناهای متداول در برنامه نویسی هستند‪ ،‬بنویسید‪.‬‬
‫‪‬‬
‫‪‬‬

‫برای نوشتن عدد در مبنای ‪ 8‬باید آن را با ‪ 0‬آغاز كنید‪ ،‬مثال ‪ 0342‬یك عدد در منای ‪ 8‬محسوب می‬
‫گردد‪.‬‬
‫برای نوشتن یك عدد در مبنای ‪ 16‬باید آن را با ‪ 0x‬آغاز نمایید‪ ،‬مانند ‪.0x27A4‬‬

‫‪ 7-4‬ثوابت‬
‫ثوابت عددی اعشاری‬

‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫برای نمایش اعداد اعشاری‪ ،‬باید از نقطه اعشار استفاده كنیم‪ ،‬مانند ‪237.45‬‬
‫اما نكته جالب آنستكه می توانید از نماد علمی نیز برای نمایش اعداد‬
‫اعشاری استفاده كنید‪ .‬برای اینكار كافی است از حرف ‪ e‬برای نمایش قسمت‬
‫توان استفاده نمایید‪ .‬بعنوان مثال ‪:‬‬
‫‪-23.47 × 10 5 = -23.47e5‬‬
‫‪42.389 × 10 -3 = 42.389e-3‬‬
‫دقت كنید كه قسمت توان‪ ،‬حتما یك عدد صحیح است‪.‬‬
‫نكته جالب اینجاست كه برخالف مورد قبل‪ ،‬كامپایلر بطور پیش فرض داده های‬
‫اعشاری را از نوع ‪ double‬فرض می كند‪.‬چنانچه دوست دارید ثابت شما ازنوع‬
‫‪ float‬درنظر گرفته شود‪ ،‬در انتهای آن ‪ F‬قرار دهید‪ .‬ضمنا پسوند ‪ L‬نیز داده‬
‫اعشاری را از نوع ‪ long double‬درنظر می گیرد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫ثوابت كاراكتری ‪:‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫برای نشان دادن ثوابت كاراكتری‪ ،‬آنها را در داخل ' قرار می دهیم‪ .‬بعنوان مثال‬
‫'‪'A‬یك ثابت كاراكتری است‪.‬‬
‫; '‪char ch = 'S‬‬
‫دقت كنید كه همانطور كه قبال گفته شد‪ ،‬كد اسكی كاراكترها در متغیر ذخیره‬
‫می گردد‪ ،‬بنابراین می توان از آن بعنوان یك عدد صحیح نیز استفاده كرد‪ .‬نكته‬
‫مهم دیگر آنستكه به تفاوت عدد ‪ 5‬و كاراكتر '‪ '5‬دقت داشته باشید‪ .‬در حقیقت‬
‫'‪ '5‬برابر است با عدد ‪ 53‬كه همان كد اسكی آن است‪.‬‬
‫روش فوق‪ ،‬برای نمایش کاراکترهای قابل چاپ مناسب است‪ ،‬اما بعضی‬
‫كاراكترها مانند ‪ enter‬قابل نمایش نبوده و برای آنها شکل خاصی وجود ندارد‪.‬‬
‫در چنین مواردی‪ ،‬زبان ‪ C‬از ترکیب عالمت \ به همراه یک کاراکتر دیگر‪ ،‬برای‬
‫نمایش این قبیل کاراکترها استفاده می نماید‪ .‬بعنوان مثال‪ ،‬کاراکتر '‪ '\n‬نشان‬
‫دهنده خط جدید یا همان ‪ enter‬می باشد‪.‬‬
‫جدول صفحه بعد این قبیل کاراکترها و معادل آنها را نشان می دهد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫نحوه نمایش در ‪C‬‬

‫کد اسکی‬

‫صدای بوق کامپیوتر‬

‫‪\a‬‬

‫‪7‬‬

‫حرکت به عقب ‪backspace‬‬

‫‪\b‬‬

‫‪8‬‬

‫شروع صفحه ‪form feed‬‬

‫‪\f‬‬

‫‪12‬‬

‫سطر جدید ‪line feed‬‬

‫‪\n‬‬

‫‪10‬‬

‫برگشت به ابتداي سطر ‪carriage return‬‬

‫‪\r‬‬

‫‪13‬‬

‫فاصله افقی ‪horizontal tab‬‬

‫‪\t‬‬

‫‪9‬‬

‫فاصله عمودی ‪vertical tab‬‬

‫‪\v‬‬

‫‪11‬‬

‫عالمت سوال‬

‫?\‬

‫‪63‬‬

‫عالمت '‬

‫'\‬

‫‪39‬‬

‫عالمت "‬

‫"\‬

‫‪34‬‬

‫عالمت \‬

‫\\‬

‫‪92‬‬

‫عالمت تهی‬

‫‪\0‬‬

‫‪0‬‬

‫نام کاراکتر‬

‫کد اسکی یک کاراکتر با ‪ 3‬رقم در مبنای ‪8‬‬

‫‪\000‬‬

‫کد اسکی یک کاراکتر با ‪ 2‬رقم در مبنای ‪16‬‬

‫‪\x00‬‬

‫‪ 7-4‬ثوابت‬
‫‪‬‬

‫ثوابت رشته ای ‪ C :‬عالوه بر ثوابت فوق‪ ،‬از یك ثابت دیگر بنام رشته نیز‬
‫حمایت می كند‪ .‬رشته‪ ،‬دنباله ای از كاراكترها است كه در داخل " قرار‬
‫می گیرند‪ .‬بعنوان مثال "‪ "this is a test‬یك رشته است‪ .‬دقت كنید كه '‪'a‬‬
‫یك كاراكتر است‪ ،‬اما "‪ "a‬یك رشته است كه فقط شامل یك كاراكتر می‬
‫باشد‪.‬‬

‫‪ 7-5‬عملگرها‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫عملگر‪ ،‬نمادی است كه به كامپایلر می گوید تا عملیات محاسباتی یا‬
‫منطقی خاصی را برروی یك یا چند عملوند‪ ،‬انجام دهد‪.‬‬
‫به عملگرهایی كه فقط یك عملوند دارند‪ ،‬عملگر یكانی می گوییم و‬
‫همواره عملگر در سمت چپ عملوند قرار می گیرد)مانند عدد ‪.(-125‬‬
‫اما عملگرهایی كه برروی دو عملوند اثر می كنند را عملگر دودویی‬
‫نامیده و عملگر را بین دو عملوند قرار می دهیم )مانند ‪.(23+86‬‬
‫هر ترکیب درستی از عملگرها و عملوندها را یک عبارت می نامیم‪.‬‬
‫‪ C‬از نقطه نظر عملگرها یك زبان بسیار قوی است‪ .‬این عملگرها به چند‬
‫دسته اصلی تقسیم می گردند كه آنها را به ترتیب بررسی می كنیم‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫این عملگرها‪ ،‬همان اعمال متداول ریاضی هستند كه در زبان ‪ C‬مورد استفاده‬
‫قرار می گیرند‪ .‬این اعمال عبارتند از ‪:‬‬

‫عمل‬

‫نوع‬

‫عملگر‬

‫منفی كردن عملوند سمت راست‬

‫یكانی‬

‫‪-‬‬

‫جمع دو عملوند‬

‫دودویی‬

‫‪+‬‬

‫تفریق دو عملوند‬

‫دودویی‬

‫‪-‬‬

‫ضرب دو عملوند‬

‫دودویی‬

‫*‬

‫تقسیم دو عملوند‬

‫دودویی‬

‫‪/‬‬

‫محاسبه باقیمانده تقسیم دو عملوند‬

‫دودویی‬

‫‪%‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬
‫‪‬‬

‫این عملگرهای برروی همه انواع داده های ‪ C‬عمل می كنند‪ ،‬بجز عملگر ‪ %‬كه فقط‬
‫برروی نوع داده های صحیح عمل می كند‪.‬‬
‫اما نكته مهمی كه باید به آن اشاره كرد‪ ،‬نحوه كار عملگر تقسیم برروی نوع داده های‬
‫مختلف است‪.‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫درصورتیكه هردو عملوند صحیح باشند‪ ،‬تقسیم بصورت صحیح بر صحیح انجام خواهد شد‪.‬‬
‫اگر یكی یا هر دو عملوند اعشاری باشند‪ ،‬تقسیم بصورت اعشاری انجام خواهد پذیرفت‪.‬‬
‫فرض كنید تعاریف زیر را داریم ‪:‬‬
‫; ‪int a,b‬‬
‫; ‪float c,d‬‬
‫; ‪a = 10 ; b = 4‬‬
‫;‪c = 8.2; d = 4.0‬‬
‫اكنون به نتایج عملیات زیر دقت كنید ‪:‬‬
‫‪a / b => 2‬‬
‫‪c / d => 2.05‬‬
‫‪a / d => 2.5‬‬
‫‪a / 4 => 2‬‬
‫چنانچه به آخرین مورد توجه كنید‪ ،‬متوجه می شوید كه از آنجا كه ‪a‬یك متغیر صحیح است و ‪4‬‬
‫نیز یك ثابت صحیح در نظر گرفته شده‪ ،‬درنتیجه تقسیم بصورت صحیح بر صحیح انجام گرفته‬
‫است‪ .‬چنانچه بخواهیم تقسیم بصورت اعشاری صورت پذیرد‪ ،‬به دو شكل می توانیم عمل‬
‫كنیم‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫برای اینکه عبارت تقسیم صفحه قبل بصورت اعشاری انجام شود‪ ،‬به دو روش‬
‫می توان عمل کرد‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫این عبارت را بصورت ‪ a / 4.0‬بنویسیم‪.‬‬
‫از عملگر قالب ریزی استفاده كنیم‪.‬‬

‫عملگر قالب ریزی می تواند یك نوع را به نوع دیگری تبدیل نماید‪ .‬شكل كلی آن‬
‫به شكل زیر است ‪:‬‬
‫>‪() ‫كه ‪ type‬نوع مورد نظر است كه قصد تبدیل عبارت ‪ expression‬به آن نوع را‬
‫داریم‪ .‬بعنوان مثال در مورد قبلی می توان به شكل زیر عمل كرد ‪:‬‬
‫‪(float) a / 4‬‬
‫در این حالت از كامپایلر خواسته ایم كه ابتدا عدد ‪ a‬را به اعشاری تبدیل كند‬
‫)البته بصورت موقت( و سپس آن را بر ‪ 4‬تقسیم نماید‪ ،‬كه مسلما حاصل‬
‫اعشاری خواهد بود‪.‬‬
‫بطوركلی هرگاه ثابتها و متغیرهایی از انواع مختلف در یك عبارت محاسباتی‬
‫داشته باشیم‪ ،‬كامپایلر ‪ C‬همه آنها را به یك نوع یكسان كه همان بزرگترین‬
‫عملوند موجود است تبدیل خواهد كرد‪ .‬بعنوان مثال به مورد صفحه بعد دقت‬
‫كنید ‪:‬‬

‫ عملگرهای محاسباتی‬7-5-1
char ch;
int i;

float f;
double d;
result = (ch / i)
int

+

(f *d)

(f+i)
float

double

double

int

-

double

double

float

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫اولویت عملگرها ‪ :‬در عبارتی که شامل چندین عملگر است‪ ،‬کدامیک در‬
‫ابتدا اعمال خواهد گردید‪.‬‬
‫اولویت عملگرهای محاسباتی از باال به پایین بشرح زیر است‪:‬‬
‫‪ ‬عملگر یکانی –‬
‫‪ ‬عملگرهای * و ‪ /‬و ‪%‬‬
‫‪ ‬عملگرهای ‪ +‬و –‬
‫چنانچه اولویت دو عملگر یکسان باشد‪ ،‬این عملگرها از چپ به راست‬
‫محاسبه خواهند شد‪.‬‬
‫چنانچه بخواهیم یک عمل با اولویت پایین زودتر انجام شود‪ ،‬باید از پرانتز‬
‫استفاده کنیم‪ .‬بنابراین اولویت عملگر پرانتز از همه موارد فوق‬
‫بیشتراست‪ .‬در مورد پرانتزهای متداخل‪ ،‬ابتدا پرانتز داخلی محاسبه‬
‫می شود؛ اما در مورد پرانتزهای هم سطح‪ ،‬ابتدا پرانتز سمت چپتر‬
‫محاسبه می گردد‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫چند مثال در مورد اولویت عملگرها‬

‫ترتیب اجرای عملگرها‬

‫عبارت زبان ‪C‬‬

‫ابتدا عمل * و سپس عمل ‪+‬‬

‫‪b+c*d‬‬

‫ابتدا عمل ‪ +‬و سپس عمل *‬

‫‪(b + c) * d‬‬

‫ابتدا عمل ‪ /‬سپس عمل * و در انتها عمل ‪+‬‬

‫‪b+c/d*e‬‬

‫ابتدا عمل * سپس عمل ‪ /‬و در انتها عمل ‪+‬‬

‫)‪b + c / (d * e‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫یک مثال کامل در مورد اولویت عملگرها‬

‫‪result = a + b * (f – (g + b) / d) – c * (a – d) / e‬‬
‫‪6‬‬

‫‪1‬‬
‫‪7‬‬

‫‪2‬‬

‫‪8‬‬

‫‪3‬‬
‫‪4‬‬
‫‪5‬‬
‫‪9‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫در زبان ‪ C‬برای انتساب چندین عملگر وجود دارد‪ .‬ساده ترین عملگر انتساب‪ ،‬همان عملگر =‬
‫است که در بسیاری از زبانها استفاده می شود‪ .‬بعنوان مثال ‪:‬‬
‫;‪a = 5‬‬
‫;‪b = c + 2 * d‬‬
‫این عملگر باعث می شود که عبارت سمت راست در عبارت سمت چپ قرار گیرد‪.‬‬
‫توجه کنید که مقدار سمت چپ باید عبارتی باشد که بتوان به آن یک مقدار را نسبت داد‬
‫)مانند یک متغیر( که به آن ‪ Lvalue‬گفته می شود‪ ،‬بنابراین یک ثابت نمی تواند در سمت چپ‬
‫قرار گیرد‪.‬‬
‫نکته دیگر اینکه اولویت عملگر = از عملگرهای ریاضی کمتر است و درنتیجه ابتدا آن عملیات‬
‫انجام شده و در پایان حاصل در عبارت سمت چپ ریخته می شود‪.‬‬
‫الزم به ذکر است که در هنگام انتساب‪ ،‬درصورت لزوم نوع عبارت سمت راست به نوع عبارت‬
‫سمت چپ تبدیل می شود‪ .‬مثال‪:‬‬
‫;‪int a‬‬
‫;‪a = 2.5 * 5.0‬‬
‫که دراینصورت عدد ‪ 12‬در ‪ a‬ذخیره خواهد شد‪.‬‬
‫شرکت پذیری این عملگر از راست به چپ می باشد‪ ،‬بدین معنا که چنانچه چندین عملگر‬
‫نسبت دهی داشته باشیم‪ ،‬این عملگرها از راست به چپ محاسبه می شوند‪ .‬مثال پس از‬
‫اجرای دستور زیر‪ ،‬مقدار هر ‪ 3‬متغیر برابر ‪ 10‬خواهد شد‪.‬‬
‫;‪a = b = c = 10‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬

‫نکته جالب درمورد زبان ‪ C‬آنستکه دارای یک سری عملگرهای انتساب‬
‫خالصه شده است که باعث می شوند در بعضی موارد بتوانیم عبارات‬
‫کوتاهتری را بنویسیم‪ .‬این عملگرها عبارتند از ‪:‬‬
‫عملگرد‬

‫مثال‬

‫عبارت انتساب معادل‬

‫‪++‬‬

‫;‪a ++‬‬

‫;‪a = a + 1‬‬

‫‪--‬‬

‫;‪a --‬‬

‫;‪a = a – 1‬‬

‫=‪+‬‬

‫;‪a += 5‬‬

‫;‪a = a + 5‬‬

‫=‪-‬‬

‫;‪a -= 8‬‬

‫;‪a= a – 8‬‬

‫=*‬

‫;‪a *= 10‬‬

‫;‪a= a * 10‬‬

‫=‪/‬‬

‫;‪a /= 2‬‬

‫;‪a = a / 2‬‬

‫=‪%‬‬

‫;‪a %= 10‬‬

‫;‪a = a % 10‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬
‫‪‬‬

‫عملگر اول و دوم‪ ،‬عملگرهای یکانی هستند که بترتیب عملگر افزایش و عملگر کاهش‬
‫نامیده می شوند‪.‬‬
‫نکته جالب آنستکه این دو عملگر به دوصورت مورد استفاده قرار می گیرند‪.‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫در حالتی که از دستور ;‪ a ++‬استفاده شود به آن پس افزایش می گویند و بدین معناست که‬
‫ابتدا از مقدار فعلی ‪ a‬در عبارت موردنظر استفاده کن و سپس آن را افزایش بده‪.‬‬
‫اما دستور ;‪ ++ a‬که به آن پیش افزایش گفته می شود‪ ،‬ابتدا ‪ a‬را افزایش داده و سپس از آن‬
‫در عبارت استفاده می کند‪.‬‬
‫به برنامه زیر دقت کنید‪:‬‬

‫>‪#include ‫{ )(‪void main‬‬
‫; ‪int a ,b‬‬
‫;‪a=5‬‬
‫;‪b = a ++‬‬
‫;)‪printf(“a=%d and b=%d \n”,a,b‬‬
‫;‪a=5‬‬
‫;‪b = ++ a‬‬
‫;)‪printf(“a=%d and b=%d \n”,a,b‬‬
‫}‬
‫‪a=6 b=5‬‬
‫‪a=6 b=6‬‬

‫‪ 7-5-3‬عملگرهای مقایسه ای‬
‫‪‬‬

‫‪‬‬

‫این عملگرها دو عبارت را بایکدیگر مقایسه کرده و نتیجه را باز می گردانند‪.‬‬
‫نتیجه می تواند درست )‪ (true‬یا غلط )‪ (false‬باشد‪.‬‬
‫نتیجه این عملگرها یک عدد صحیح است که درصورت درست بودن ‪ 1‬و‬
‫درصورت غلط بودن ‪ 0‬باز می گردانند‪ .‬این عملگرها عبارتند از‪:‬‬
‫عملگر‬

‫مفهوم عملگر‬

‫مثال‬

‫<‬

‫بزرگتر )<(‬

‫‪a>b‬‬

‫>‬

‫کوچکتر )>(‬

‫‪a
‫=<‬

‫بزرگتر یا مساوی )≤(‬

‫‪a >= b‬‬

‫=>‬

‫کوچکتر یا مساوی )≥(‬

‫‪a <= b‬‬

‫==‬

‫مساوی )=(‬

‫‪a == b‬‬

‫=!‬

‫نامساوی )≠(‬

‫‪a != b‬‬

‫‪ 7-5-3‬عملگرهای مقایسه ای‬
‫‪‬‬

‫‪‬‬

‫نکته مهمی که باید به آن دقت کرد عملگر مساوی )==( است‪ ،‬چرا که یک‬
‫اشتباه بسیار متداول برنامه نویسان ‪ C‬استفاده اشتباه از عملگر انتساب‬
‫)=( بجای عملگر تساوی )==( است که باعث ایجاد خطا در برنامه می‬
‫شود‪.‬‬
‫اولویت این عملگرها از باال به پایین بشرح زیر است‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫عملگرهای <‪ <= ، > ،‬و =>‬
‫عملگرهای == و =!‬

‫الزم بذکر است که در هنگام مساوی بودن اولویت چند عملگر‪ ،‬این عملگرها‬
‫از چپ به راست محاسبه می گردند‪.‬‬

‫‪ 7-5-4‬عملگرهای منطقی‬
‫‪‬‬

‫این عملگرها به شما اجازه می دهند که شرطهای ساده ای را که با‬
‫استفاده از عملگرهای مقایسه ای ایجاد شده اند را با یکدیگر ترکیب نموده‬
‫و شرطهای پیچیده تری را بسازید‪ .‬این عملگرها عبارتند از ‪:‬‬
‫مثال‬

‫عملگر‬

‫مفهوم عملگر‬

‫نحوه کار‬

‫&&‬

‫‪ AND‬منطقی‬

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

‫‪a>0 && sw==1‬‬

‫||‬

‫‪ OR‬منطقی‬

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

‫‪a<=100 || b!=0‬‬

‫!‬

‫‪ NOT‬منطقی‬

‫اگر عملوند درست باشد‪ ،‬نادرست و‬
‫اگر نادرست باشد‪ ،‬درست برمی‬
‫گرداند‪.‬‬

‫)‪! (a==1 || b<10‬‬

‫‪ 7-5-5‬عملگر شرطی‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫گاهی الزم است که ابتدا یک شرط بررسی شده و سپس برمبنای نتیجه )درست یا نادرست بودن آن( یکی‬
‫از دو عبارت ممکن بازگردانده شود‪ .‬برای اینکار می توان از یک عملگر ‪3‬تایی )با ‪ 3‬عملوند( بنام عملگر‬
‫شرطی استفاده نمود‪.‬‬
‫شکل کلی این عملگر بصورت زیر است‪:‬‬
‫>عبارت‪> :<2‬عبارت‪> ?<1‬شرط<‬
‫نحوه کار بدینصورت است که درصورت درست بودن شرط‪ ،‬عبارت‪ 1‬و در غیراینصورت عبارت ‪ 2‬بازگردانده می‬
‫شود‪.‬‬
‫به عنوان مثال به دستور زیر توجه کنید‪:‬‬
‫که این عبارت معادل دستور زیر است‪:‬‬

‫‪‬‬

‫;‪a = (k<10) ? 100 : 50‬‬
‫;‪if (k<10) a=100‬‬
‫;‪else a=50‬‬

‫البته این عبارت به شکلهای پیچیده نیز می تواند مورد استفاده قرار گیرد‪ .‬مثال ‪:‬‬
‫;‪c += (a>0 && a<10) ? ++a : a/b‬‬
‫که معادل است با ‪:‬‬
‫{ )‪if (a>0 && a<10‬‬
‫;‪a= a + 1‬‬
‫;‪c = c + a‬‬
‫}‬
‫;‪else c = c + a/b‬‬

‫‪ 7-5-6‬اولویت عملگرها‬
‫عملگر‬

‫اولویت‬

‫شرکت پذیری‬

‫‪1‬‬

‫)(‬

‫از چپ به راست‬

‫‪2‬‬

‫‪- + ! -- ++‬‬

‫از راست به چپ‬

‫‪3‬‬

‫‪* / %‬‬

‫از چپ به راست‬

‫‪4‬‬

‫‪+ -‬‬

‫از چپ به راست‬

‫‪5‬‬

‫>> <<‬

‫از چپ به راست‬

‫‪6‬‬

‫>= > <= <‬

‫از چپ به راست‬

‫‪7‬‬

‫=! ==‬

‫از چپ به راست‬

‫‪8‬‬

‫&&‬

‫از چپ به راست‬

‫‪9‬‬

‫||‬

‫از چپ به راست‬

‫‪10‬‬

‫‪?:‬‬

‫از راست به چپ‬

‫‪11‬‬

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

‫از راست به چپ‬

‫‪12‬‬

‫‪,‬‬

‫از چپ به راست‬

‫‪ 7-6‬خواندن و نمایش اطالعات‬
‫‪‬‬

‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫همانطور كه قبال نیز گفته شد‪ ،‬یكی از اهداف زبان ‪ C‬قابل حمل بودن آن‬
‫است‪ .‬بهمین منظور سعی شده است كه از دستوراتی كه ممكن است‬
‫وابسته به ماشین خاصی باشد‪ ،‬اجتناب گردد‪.‬‬
‫بهمین دلیل زبان ‪ C‬برخالف سایر زبانها دارای هیچ دستوری برای‬
‫خواندن از ورودی و یا نوشتن در خروجی نیست‪.‬‬
‫اما در عوض دارای تعدادی تابع )زیربرنامه( استاندارد می باشد كه تقریبا‬
‫تمامی كامپایلرها از آنها حمایت می كنند‪.‬‬
‫این كار به كامپایلر این امكان را می دهد كه بر حسب نوع سخت افزار‬
‫موردنظر‪ ،‬توابع ورودی و خروجی را طراحی نماید‪.‬‬
‫این توابع در یك فایل سرآمد بنام ‪ stdio.h‬تعریف شده اند و بنابراین قبل‬
‫ازاینكه بتوانید از این توابع استفاده نمایید‪ ،‬باید این فایل را نیز با استفاده‬
‫از ‪ #include‬در برنامه خود بگنجانید‪.‬‬

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫برای نمایش اطالعات در خروجی از تابع ‪ printf‬استفاده می شود‪.‬‬
‫این تابع رشته موردنظر شما را به خروجی استاندارد )كه در حالت‬
‫عادی همان صفحه نمایش یا مانیتور است( می فرستد‪ .‬شكل كلی این‬
‫تابع بصورت زیر است‪:‬‬
‫; )>لیست متغیرها< ‪> ,‬رشته كنترلی<(‪printf‬‬
‫رشته كنترلی همان متنی است كه قصد چاپ آن را داریم‪ ،‬با ذكر این‬
‫نكته كه در قسمتهایی كه باید مقدار یك متغیر چاپ شود‪ ،‬از یك‬
‫مشخصه تبدیل استفاده می شود‪ .‬هر مشخصه تبدیل از یك عالمت ‪%‬‬
‫بعالوه یك كاراكتر كه نوع متغیر مورد نظر را نشان می دهد تشكیل می‬
‫گردد‪.‬‬
‫لیست متغیرها نیز همان متغیرهایی هستند كه قصد چاپ آنها را داریم‪.‬‬
‫این متغیرها باید بترتیب قرار گرفته و با كاما )‪ (,‬از یكدیگر جدا شوند‪.‬‬

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫مشخصه تبدیل‬

‫مفهوم‬

‫‪%c‬‬

‫كاراكتر‬

‫‪%d‬‬

‫عدد صحیح در مبنای ‪10‬‬

‫‪%f‬‬

‫عدد اعشاری بدون نماد علمی‬

‫‪%e‬‬

‫عدد اعشاری با نماد علمی‬

‫‪%g‬‬

‫عدد اعشاری با حالت كوتاهتر بین ‪ e‬و ‪f‬‬

‫‪%s‬‬

‫رشته‬

‫‪%ld‬‬

‫عدد صحیح بزرگ‬

‫‪%lf %le %lg‬‬

‫عدد اعشاری بزرگ‬

‫‪%o‬‬

‫عدد صحیح در مبنای ‪8‬‬

‫‪%x‬‬

‫عدد صحیحی در مبنای ‪16‬‬

‫‪%u‬‬

‫عدد صحیح بدون عالمت‬

‫ تابع نمایش در خروجی‬7-6-1
#include
void main() {
int age = 20;
floate average = 18.23;
printf("You are %d years old and your average is %f \n",age,average);
}
You are 20 years old and your average is 18.230000

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫‪‬‬
‫‪‬‬

‫برای کنترل نحوه چاپ اعداد می توانید از مشخصه طول میدان استفاده‬
‫کنید‪.‬‬
‫مشخصه طول میدان برای اعداد به شكل زیر استفاده می شود‪:‬‬
‫‪ ‬برای اعداد صحیح از ‪ %nd‬استفاده می كنیم كه ‪ n‬تعداد ارقام را نشان‬
‫می دهد )مثال ‪ .(%3d‬در اینصورت برای هر متغیر ‪ n‬رقم درنظر گرفته‬
‫می شود‪ .‬اگر اندازه عدد از ‪ n‬كوچكتر باشد‪ ،‬به سمت چپ آن فضای‬
‫خالی اضافه می شود و اگر اندازه عدد بیش از ‪ n‬رقم باشد‪ ،‬طول میدان‬
‫نادیده گرفته شده و عدد بطور كامل چاپ می شود‪.‬‬
‫‪ ‬برای اعداد اعشاری از ‪ %n.mf‬استفاده می كنیم كه ‪ n‬اندازه كل عدد‬
‫)شامل عالمت ممیز( و ‪ m‬تعداد ارقام اعشار است )مثال ‪ .(%5.2f‬در‬
‫صورتیكه تعداد ارقام اعشاری عدد موردنظر از ‪ m‬بیشتر باشد‪ ،‬عدد به ‪m‬‬
‫عدد اعشار گرد می شود و در صورتیكه از ‪ m‬كمتر باشد‪ ،‬در سمت‬
‫راست آن ‪ 0‬قرار داده می شود‪.‬‬

‫‪ 7-6-2‬تابع خواندن از ورودی‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای خواندن اطالعات از ورودی از تابع ‪ scanf‬استفاده می شود‪.‬‬
‫این تابع اطالعات را ازورودی استاندارد )معموال صفحه كلید( خوانده و در‬
‫متغیرهای تعیین شده قرار می دهد‪.‬‬
‫شكل كلی این تابع بصورت زیر است‪:‬‬
‫; )>لیست آدرسهای متغیرها< ‪> ,‬رشته كنترلی<(‪scanf‬‬
‫همانطور كه می بینید نحوه احضار تابع ‪ scanf‬نیز مشابه ‪ printf‬است‪ .‬تنها‬
‫تفاوت در آن است كه در ‪ scanf‬باید لیست آدرسهای متغیرها ارسال شود‪.‬‬
‫مبحث مربوط به آدرسها در فصول بعدی بررسی خواهد شد ولی در حال حاضر‬
‫بخاطر بسپارید كه برای بدست آوردن آدرس یك متغیر از عالمت & استفاده می‬
‫كنیم‪ .‬بعنوان مثال ‪ &age‬بمعنای آدرس متغیر ‪ age‬است‪.‬‬
‫بطور كلی در ‪ C‬قدیمی هرگاه كه یك تابع دارای پارامترهای خروجی بود )یعنی‬
‫پارامترهایی كه یك مقدار را باز می گرداندند( از آدرس متغیرها استفاده می‬
‫شد كه امروزه این مسئله وجود ندارد‪.‬‬

‫ تابع خواندن از ورودی‬7-6-2
#include
void main() {
int age;
float average ;
printf("Please enter your age and average : ");
scanf("%d %f",&age,&average);
printf("You are %d years old and your average is %5.2f \n",age,average);
}

Please enter your age and average : 19 16.72
You are 19 years old and your average is 16.72

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫زبان ‪ C++‬یک زبان شی گرا است‪ ،‬بهمین دلیل در این زبان برای ورودی‬
‫و خروجی از اشیاء بجای توابع استفاده می گردد‪.‬‬
‫از آنجا که امروزه معموال برنامه نویسان ‪ C‬از کامپایلرهای ‪ C++‬استفاده‬
‫می کنند‪ ،‬می توانند از اشیای ورودی و خروجی آن نیز استفاده کنند‪.‬‬
‫اینکار در بین بسیاری از برنامه نویسان ‪ C‬متداول است‪ ،‬بهمین دلیل ما‬
‫در اینجا نحوه کار با اشیای خواندن و نوشتن در ‪ C++‬را بطور مقدماتی‬
‫توضیح می دهیم؛ گرچه توضیح کامل این موارد نیاز به آشنایی با شی‬
‫گرایی و زبان ‪ C++‬دارد‪.‬‬
‫قبل از هرچیز الزم به ذکر است که کلیه اشیای مربوط به ورودی و‬
‫خروجی در فایل سرآمدی بنام ‪ iostream.h‬تعیریف شده اند‪ ،‬بنابراین‬
‫ابتدا باید این فایل به برنامه توسط دستور ‪ #include‬الحاق گردد‪.‬‬

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫زبان ‪ C++‬برای نمایش اطالعات از یک شیئ بنام ‪ cout‬استفاده می نماید‪.‬‬
‫برای ارسال اطالعات مورد نظر برای چاپ به ‪ cout‬باید از عملگر درج در جریان‬
‫یا >> استفاده نماییم‪ .‬بعنوان مثال ‪:‬‬
‫; ” ‪cout >> “Please enter your name:‬‬
‫و یا مثال دیگر ‪:‬‬
‫;‪int a = 10‬‬
‫;‪float b = 2.86‬‬
‫;‪cout << a‬‬
‫;‪cout << b‬‬
‫نکته جالبی که در این مثالها دیده می شود‪ ،‬آنستکه برخالف تابع ‪ printf‬هیچ‬
‫نیازی به مشخص کردن نوع متغیری که قصد چاپ آن را داریم نیست و خود‬
‫شئ ‪ cout‬نوع آن را تشخیص می دهد‪.‬‬
‫عالوه براین می توان چندین عملگر درج در جریان را با یکدیگر الحاق کرد و‬
‫چندین متغیر را با یک دستور چاپ کرد‪.‬‬

C++ ‫ ورودی و خروجی اطالعات در‬7-6-3
#include
void main() {
int age = 20;
floate average = 18.23;
cout >> “You are ” >> age >> “ years old and your average is ” >> average ;
}

You are 20 years old and your average is 18.230000

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای دریافت اطالعات از کاربر‪ ،‬از شئ دیگری بنام ‪ cin‬استفاده می شود‪.‬‬
‫برای ارسال متغیر مورد نظر به ‪ cin‬باید از عملگر استخراج از جریان یا <<‬
‫استفاده نماییم‪ .‬بعنوان مثال‪:‬‬
‫;‪int a‬‬
‫;‪cin >> a‬‬
‫بازهم همانطور که می بینید نیازی به تعیین نوع متغیر موردنظر نیست و خود‬
‫شئ ‪ cin‬نوع متغیر را بطور اتوماتیک تشخیص داده و داده ای از همان نوع را از‬
‫کاربر دریافت و در متغیر مورد نظر قرار می دهد‪.‬‬
‫عملگرهای استخراج از جریان را نیز می توان با یکدیگر الحاق کرد‪.‬‬
‫برای رفتن به خط بعد در شئ ‪ cout‬می توان از دستکاری کننده ‪ endl‬استفاده‬
‫کرد‪ .‬مثال در دستور زیر پس از چاپ پیغام‪ ،‬مکان نما به خط بعد منتقل می‬
‫شود‪:‬‬
‫;‪cout >> “List of students : “ >> endl‬‬
‫البته دستکاری کننده های متعدد دیگری نیز ازجمله موارد مربوط به تعیین طول‬
‫میدان و نحوه چاپ مقادیر وجود دارد که توضیح آنها نیاز به یک مبحث مستقل‬
‫دارد‪.‬‬

C++ ‫ ورودی و خروجی اطالعات در‬7-6-3
#include
void main() {
int age;
float average ;
cout << "Please enter your age and average : " ;
cin >> age >> average ;
cout << "You are " << age << "years old and your average is " << average;
}

Please enter your age and average : 19 16.72
You are 19 years old and your average is 16.72

‫‪ 7-7‬توابع کتابخانه ای‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫همانطور که قبال نیز گفته شد‪ ،‬زبان ‪ C‬از زیر برنامه ها نیز حمایت می کند‪ .‬هر زیر برنامه‬
‫در ‪ C‬یک تابع نامیده می شود‪ .‬تا کنون با توابعی همچون ‪ main‬و یا ‪ printf‬و ‪ scanf‬آشنا‬
‫شده ایم‪.‬‬
‫معموال عرضه کنندگان کامپایلرها و یا سایر فروشندگان نرم افزار‪ ،‬برخی از توابع عمومی‬
‫را که ممکن است مورد نیاز جمع کثیری از برنامه نویسان مختلف باشد را در قالب‬
‫کتابخانه ای از توابع در اختیار برنامه نویسان می گذارند‪ .‬بعضی از این توابع کتابخانه ای‬
‫مانند ‪ printf‬و ‪ scanf‬بصورت استاندارد درآمده و توسط عرضه کنندگان مختلف ارائه می‬
‫شوند‪.‬‬
‫در کامپایلر عرضه شده توسط شرکت بورلند )‪ (Borland C++ 3.1‬نیز کتابخانه های‬
‫متعددی از توابع برای شما عرضه شده اند که بتدریج با آنها و کاربردشان آشنا خواهید‬
‫شد‪.‬‬
‫نکته مهم آنستکه برای استفاده از این توابع ابتدا باید فایل سرآمد مربوط به آنها را نیز در‬
‫ابتدای برنامه خود اضافه نمایید ) با استفاده از ‪ .(#include‬هر فایل سرآمد شامل تعاریف‬
‫اولیه گروهی از توابع مرتبط با هم و داده های مربوط به آنها بوده و در استاندارد قدیمی‬
‫تر دارای پسوند ‪ .h‬می باشد)در استاندارد جدید پسوند این فایلها حذف شده است(‪.‬‬
‫برخی از این فایلهای سرآمد عبارتند از‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪ : stdio.h‬توابع ورودی و خروجی استاندارد‬
‫‪ : math.h‬توابع ریاضی‬
‫‪ : graphics.h‬توابع مربوط به عملیات گرافیکی‬
‫‪ : string.h‬توابع مربوط به کار با رشته ها‬


Slide 3

‫مبانی کامپیوتر و برنامه سازی‬
‫فصل هفتم ‪ :‬مفاهیم اولیه زبان ‪C‬‬
‫مدرس ‪ :‬نگین معروفی‬

‫‪ 7-1‬شناسه ها در ‪C‬‬
‫‪‬‬
‫‪‬‬

‫شناسه )‪ (identifier‬نامی است که به یک قسمت از برنامه مانند متغیر‪ ،‬تابع‪ ،‬ثابت و یا‬
‫‪ ...‬داده می شود‪.‬‬
‫در زبان ‪ C‬برای انتخاب شناسه ها فقط می توان از عالئم زیر استفاده کرد‪:‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫حروف انگلیسی کوچک و بزرگ )‪(A…Z a…z‬‬
‫ارقام )‪(0…9‬‬
‫عالمت خط پایین یا _‬

‫البته یک شناسه نمی تواند با یک رقم شروع شود‪.‬‬
‫چند شناسه مجاز‪ name2 ، average ، sum :‬و ‪student_average‬‬
‫چند شناسه غیرمجاز ‪ 2name‬و یا ‪student average‬‬
‫در برنامه نویسی امروزی پیشنهاد می شود بجای شناسه هایی همانند‬
‫‪ student_average‬از ‪ studentAverage‬استفاده گردد‪.‬‬
‫نکته مهم دیگری که باید به آن اشاره کرد آنستکه زبان ‪ C‬برخالف بسیاری از زبانهای دیگر‬
‫به کوچک و بزرگی حروف حساس است )‪ .(case sensitive‬در نتیجه شناسه های زیر با‬
‫یکدیگر متفاوتند ‪:‬‬
‫‪Sum ≠ sum ≠ SUM‬‬
‫آخرین نکته اینستکه در هنگام انتخاب شناسه نمی توانید از کلمات کلیدی که برای‬
‫منظورهای خاص در زبان ‪ C‬رزرو شده اند استفاده کنید‪.‬‬

C ‫ شناسه ها در‬7-1
: C ‫کلمات کلیدی در زبان‬
auto

break

case

char

const

continue

default

do

double

else

enum

extern

float

for

goto

if

int

long

register

return

short

signed

sizeof

static

struct

switch

typedef

union

unsigned

void

volatile

while

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫محدوده‬

‫اندازه )بیت(‬

‫توضیح‬

‫نوع داده‬

‫‪-128 to +127‬‬

‫‪8‬‬

‫کاراکتر‬

‫‪char‬‬

‫‪-32768 to +32767‬‬

‫‪16‬‬

‫عدد صحیح‬

‫‪int‬‬

‫‪3.4e-38 to 3.4e+38‬‬

‫‪32‬‬

‫عدد اعشاری‬

‫‪float‬‬

‫‪1.7e-308 to 1.7e+308‬‬

‫‪64‬‬

‫عدد اعشاری با‬
‫دقت مضاعف‬

‫‪double‬‬

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫‪‬‬

‫البته چند نکته مهم درمورد این جدول قابل ذکر است ‪:‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫اندازه ‪ int‬در محیطهای ‪ 16‬بیتی مانند ‪ DOS‬برابر ‪ 16‬بیت است‪ .‬اما در‬
‫محیطهای ‪ 32‬بیتی همانند ‪ Windows‬اندازه آن ‪ 32‬بیت می باشد که در‬
‫اینصورت محدوده ای برابر ‪ -2,147,483,648‬تا ‪ +2,147,483,647‬را‬
‫پوشش می دهد‪.‬‬
‫در بعضی از کامپایلرهای ‪ ،C‬نوع داده ‪ bool‬نیز وجود دارد که می تواند‬
‫یکی از مقادیر ‪)true‬درست( یا ‪) false‬غلط( را نشان دهد ‪ .‬اما در نسخه‬
‫های اولیه ‪ C‬از همان نوع داده صحیح یا ‪ int‬برای اینکار استفاده می‬
‫شد‪ .‬بدین صورت که ‪ 0‬نشاندهنده ‪ false‬و هر عدد غیر صفر )معموال ‪(1‬‬
‫نشاندهنده ‪ true‬است‪.‬‬
‫از آنجا که برای ذخیره سازی کاراکترها کد اسکی آنها ذخیره می گردد‪،‬‬
‫از یک متغیر کاراکتری یا ‪ char‬می توان بعنوان یک عدد صحیح کوچک نیز‬
‫استفاده کرد و اعمال ریاضی برروی آنها نیز مجاز است‪.‬‬

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫عالوه براین چندین اصالح کننده نیز وجود دارد که به ما اجازه می دهد نوع داده مورد‬
‫نظر را با دقت بیشتری برای نیازهای مختلف استفاده نماییم‪.‬‬
‫این اصالح کننده ها عبارتند از ‪short, long, signed, unsigned :‬‬
‫تمام این اصالح کننده ها می توانند به نوع داده ‪ int‬اعمال شوند و اثر آنها بستگی‬
‫به محیط دارد‪.‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫در یک محیط ‪16‬بیتی‪short int ،‬بازهم برابر ‪16‬بیت است ولی ‪ long int‬برابر‪32‬بیت می‬
‫باشد‪.‬‬
‫‪ unsigned int‬باعث می شود که یک عدد ‪ 16‬بیتی بدون عالمت داشته باشیم که بازه‬
‫بین ‪ 0‬تا ‪ 65535‬را پوشش می دهد‪ signed int .‬نیز همانند ‪ int‬معمولی بوده و تفاوتی‬
‫ندارد‪.‬‬
‫ترکیب این اصالح کننده ها نیز ممکن است‪ .‬مثال ‪ unsigned long int‬یک عدد ‪ 32‬بیتی‬
‫بدون عالمت است که بازه ‪ 0‬تا ‪ 4,294,967,295‬را پوشش می دهد‪.‬‬

‫برروی نوع داده ‪ char‬فقط اصالح کننده های ‪ signed‬و ‪ unsigned‬را می توان اعمال‬
‫کرد‪ .‬معموال از اصالح کننده ‪ unsigned‬وقتی استفاده می شود که قصد داشته‬
‫باشیم از ‪ char‬بعنوان یک عدد صحیح مثبت بین ‪ 0‬تا ‪ 255‬استفاده کنیم‪.‬‬
‫برروی نوع داده ‪ double‬تنها اصالح کننده ‪ long‬قابل اعمال است و دراینصورت عدد‬
‫اعشاری با ‪ 80‬بیت را خواهیم داشت که قادر است هر عددی در بازه ‪ 3.4e-4932‬تا‬
‫‪ 1.1e+4932‬را در خود نگاه دارد‪.‬‬

‫‪ 7-3‬تعریف متغیرها‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای تعریف متغیرها به شکل زیر عمل می کنیم‪:‬‬

‫;>‪ ‫که ‪ type‬یکی از نوع داده های گفته شده و ‪ variable-list‬لیستی از متغیرها است‬
‫که با کاما از یکدیگر جدا شده اند‪ .‬بعنوان مثال ‪:‬‬
‫;‪int sum‬‬
‫;‪float average‬‬
‫; ‪long int a, b, c‬‬
‫; ‪unsigned long int i, j, k‬‬
‫عالوه براین می توان در هنگام تعریف متغیر به آن مقدار اولیه نیز داد‪ .‬مثال ‪:‬‬
‫; ‪int d = 0‬‬
‫نكته مهم آنكه زبان ‪ C‬به متغیرها مقدار اولیه نمي دهد )حتي ‪ (0‬و برنامه نويس‬
‫خود بايد اينكار را صريحا انجام دهد‪ ،‬درغیر اينصورت مقدار اولیه متغیر‪ ،‬نامعین خواهد‬
‫بود‪.‬‬
‫تعریف متغیرها طبق اصول زبان ‪ C‬میتواند درهرجایی از برنامه صورت پذیرد‪ ،‬و‬
‫متغیرهای تعریف شده از همان خط به بعد قابل استفاده خواهد بود‪ .‬اما معموال‬
‫توصیه می گردد كه تعریف متغیرها در همان خط ابتدایی تابع و بالفاصله پس از {‬
‫صورت پذیرد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫‪‬‬
‫‪‬‬

‫ثابتها مقادیر ثابتی هستند كه مقدار آنها در حین اجرای برنامه تغییر نمی یابد‪ .‬ثابتها می توانند از‬
‫هریك از نوع داده های اصلی باشند‪.‬‬
‫ثوابت عددی صحیح ‪:‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫برای نمایش این دسته از ثوابت‪ ،‬از دنباله ای از ارقام بعالوه عالمت ‪ +‬یا ‪ -‬استفاده می كنیم‪ .‬بعنوان مثال‬
‫‪ -45‬و یا ‪ 3489‬ثوابت صحیح هستند‪.‬‬
‫در حالت عادی ‪ C‬هر عدد را در كوچكترین نوع داده ای كه می تواند قرار می دهد‪ .‬مثال عدد ‪ 85‬در یك‬
‫‪ int‬قرار می گیرد‪ ،‬اما عدد ‪ 145398‬در یك ‪ long int‬قرار خواهد گرفت‪.‬‬
‫اگر قصد دارید یك عدد كوچك بعنوان ‪ long‬محسوب گردد‪ ،‬می توانید از پسوند ‪ L‬در انتهای آن استفاده‬
‫می كنیم‪ .‬مثال ‪245L‬یك عدد ‪ long‬محسوب می شود‪.‬‬
‫;‪long int a = 20L‬‬
‫پسوند ‪ U‬در انتهای عدد نیز نشانه بدون عالمت بودن آن است‪.‬‬
‫نكته دیگر آنكه ‪ C‬به شما اجازه می دهد درصورت لزوم ثوابت صحیح خود را در مبنای ‪ 8‬یا ‪ 16‬نیز كه‬
‫از مبناهای متداول در برنامه نویسی هستند‪ ،‬بنویسید‪.‬‬
‫‪‬‬
‫‪‬‬

‫برای نوشتن عدد در مبنای ‪ 8‬باید آن را با ‪ 0‬آغاز كنید‪ ،‬مثال ‪ 0342‬یك عدد در منای ‪ 8‬محسوب می‬
‫گردد‪.‬‬
‫برای نوشتن یك عدد در مبنای ‪ 16‬باید آن را با ‪ 0x‬آغاز نمایید‪ ،‬مانند ‪.0x27A4‬‬

‫‪ 7-4‬ثوابت‬
‫ثوابت عددی اعشاری‬

‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫برای نمایش اعداد اعشاری‪ ،‬باید از نقطه اعشار استفاده كنیم‪ ،‬مانند ‪237.45‬‬
‫اما نكته جالب آنستكه می توانید از نماد علمی نیز برای نمایش اعداد‬
‫اعشاری استفاده كنید‪ .‬برای اینكار كافی است از حرف ‪ e‬برای نمایش قسمت‬
‫توان استفاده نمایید‪ .‬بعنوان مثال ‪:‬‬
‫‪-23.47 × 10 5 = -23.47e5‬‬
‫‪42.389 × 10 -3 = 42.389e-3‬‬
‫دقت كنید كه قسمت توان‪ ،‬حتما یك عدد صحیح است‪.‬‬
‫نكته جالب اینجاست كه برخالف مورد قبل‪ ،‬كامپایلر بطور پیش فرض داده های‬
‫اعشاری را از نوع ‪ double‬فرض می كند‪.‬چنانچه دوست دارید ثابت شما ازنوع‬
‫‪ float‬درنظر گرفته شود‪ ،‬در انتهای آن ‪ F‬قرار دهید‪ .‬ضمنا پسوند ‪ L‬نیز داده‬
‫اعشاری را از نوع ‪ long double‬درنظر می گیرد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫ثوابت كاراكتری ‪:‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫برای نشان دادن ثوابت كاراكتری‪ ،‬آنها را در داخل ' قرار می دهیم‪ .‬بعنوان مثال‬
‫'‪'A‬یك ثابت كاراكتری است‪.‬‬
‫; '‪char ch = 'S‬‬
‫دقت كنید كه همانطور كه قبال گفته شد‪ ،‬كد اسكی كاراكترها در متغیر ذخیره‬
‫می گردد‪ ،‬بنابراین می توان از آن بعنوان یك عدد صحیح نیز استفاده كرد‪ .‬نكته‬
‫مهم دیگر آنستكه به تفاوت عدد ‪ 5‬و كاراكتر '‪ '5‬دقت داشته باشید‪ .‬در حقیقت‬
‫'‪ '5‬برابر است با عدد ‪ 53‬كه همان كد اسكی آن است‪.‬‬
‫روش فوق‪ ،‬برای نمایش کاراکترهای قابل چاپ مناسب است‪ ،‬اما بعضی‬
‫كاراكترها مانند ‪ enter‬قابل نمایش نبوده و برای آنها شکل خاصی وجود ندارد‪.‬‬
‫در چنین مواردی‪ ،‬زبان ‪ C‬از ترکیب عالمت \ به همراه یک کاراکتر دیگر‪ ،‬برای‬
‫نمایش این قبیل کاراکترها استفاده می نماید‪ .‬بعنوان مثال‪ ،‬کاراکتر '‪ '\n‬نشان‬
‫دهنده خط جدید یا همان ‪ enter‬می باشد‪.‬‬
‫جدول صفحه بعد این قبیل کاراکترها و معادل آنها را نشان می دهد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫نحوه نمایش در ‪C‬‬

‫کد اسکی‬

‫صدای بوق کامپیوتر‬

‫‪\a‬‬

‫‪7‬‬

‫حرکت به عقب ‪backspace‬‬

‫‪\b‬‬

‫‪8‬‬

‫شروع صفحه ‪form feed‬‬

‫‪\f‬‬

‫‪12‬‬

‫سطر جدید ‪line feed‬‬

‫‪\n‬‬

‫‪10‬‬

‫برگشت به ابتداي سطر ‪carriage return‬‬

‫‪\r‬‬

‫‪13‬‬

‫فاصله افقی ‪horizontal tab‬‬

‫‪\t‬‬

‫‪9‬‬

‫فاصله عمودی ‪vertical tab‬‬

‫‪\v‬‬

‫‪11‬‬

‫عالمت سوال‬

‫?\‬

‫‪63‬‬

‫عالمت '‬

‫'\‬

‫‪39‬‬

‫عالمت "‬

‫"\‬

‫‪34‬‬

‫عالمت \‬

‫\\‬

‫‪92‬‬

‫عالمت تهی‬

‫‪\0‬‬

‫‪0‬‬

‫نام کاراکتر‬

‫کد اسکی یک کاراکتر با ‪ 3‬رقم در مبنای ‪8‬‬

‫‪\000‬‬

‫کد اسکی یک کاراکتر با ‪ 2‬رقم در مبنای ‪16‬‬

‫‪\x00‬‬

‫‪ 7-4‬ثوابت‬
‫‪‬‬

‫ثوابت رشته ای ‪ C :‬عالوه بر ثوابت فوق‪ ،‬از یك ثابت دیگر بنام رشته نیز‬
‫حمایت می كند‪ .‬رشته‪ ،‬دنباله ای از كاراكترها است كه در داخل " قرار‬
‫می گیرند‪ .‬بعنوان مثال "‪ "this is a test‬یك رشته است‪ .‬دقت كنید كه '‪'a‬‬
‫یك كاراكتر است‪ ،‬اما "‪ "a‬یك رشته است كه فقط شامل یك كاراكتر می‬
‫باشد‪.‬‬

‫‪ 7-5‬عملگرها‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫عملگر‪ ،‬نمادی است كه به كامپایلر می گوید تا عملیات محاسباتی یا‬
‫منطقی خاصی را برروی یك یا چند عملوند‪ ،‬انجام دهد‪.‬‬
‫به عملگرهایی كه فقط یك عملوند دارند‪ ،‬عملگر یكانی می گوییم و‬
‫همواره عملگر در سمت چپ عملوند قرار می گیرد)مانند عدد ‪.(-125‬‬
‫اما عملگرهایی كه برروی دو عملوند اثر می كنند را عملگر دودویی‬
‫نامیده و عملگر را بین دو عملوند قرار می دهیم )مانند ‪.(23+86‬‬
‫هر ترکیب درستی از عملگرها و عملوندها را یک عبارت می نامیم‪.‬‬
‫‪ C‬از نقطه نظر عملگرها یك زبان بسیار قوی است‪ .‬این عملگرها به چند‬
‫دسته اصلی تقسیم می گردند كه آنها را به ترتیب بررسی می كنیم‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫این عملگرها‪ ،‬همان اعمال متداول ریاضی هستند كه در زبان ‪ C‬مورد استفاده‬
‫قرار می گیرند‪ .‬این اعمال عبارتند از ‪:‬‬

‫عمل‬

‫نوع‬

‫عملگر‬

‫منفی كردن عملوند سمت راست‬

‫یكانی‬

‫‪-‬‬

‫جمع دو عملوند‬

‫دودویی‬

‫‪+‬‬

‫تفریق دو عملوند‬

‫دودویی‬

‫‪-‬‬

‫ضرب دو عملوند‬

‫دودویی‬

‫*‬

‫تقسیم دو عملوند‬

‫دودویی‬

‫‪/‬‬

‫محاسبه باقیمانده تقسیم دو عملوند‬

‫دودویی‬

‫‪%‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬
‫‪‬‬

‫این عملگرهای برروی همه انواع داده های ‪ C‬عمل می كنند‪ ،‬بجز عملگر ‪ %‬كه فقط‬
‫برروی نوع داده های صحیح عمل می كند‪.‬‬
‫اما نكته مهمی كه باید به آن اشاره كرد‪ ،‬نحوه كار عملگر تقسیم برروی نوع داده های‬
‫مختلف است‪.‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫درصورتیكه هردو عملوند صحیح باشند‪ ،‬تقسیم بصورت صحیح بر صحیح انجام خواهد شد‪.‬‬
‫اگر یكی یا هر دو عملوند اعشاری باشند‪ ،‬تقسیم بصورت اعشاری انجام خواهد پذیرفت‪.‬‬
‫فرض كنید تعاریف زیر را داریم ‪:‬‬
‫; ‪int a,b‬‬
‫; ‪float c,d‬‬
‫; ‪a = 10 ; b = 4‬‬
‫;‪c = 8.2; d = 4.0‬‬
‫اكنون به نتایج عملیات زیر دقت كنید ‪:‬‬
‫‪a / b => 2‬‬
‫‪c / d => 2.05‬‬
‫‪a / d => 2.5‬‬
‫‪a / 4 => 2‬‬
‫چنانچه به آخرین مورد توجه كنید‪ ،‬متوجه می شوید كه از آنجا كه ‪a‬یك متغیر صحیح است و ‪4‬‬
‫نیز یك ثابت صحیح در نظر گرفته شده‪ ،‬درنتیجه تقسیم بصورت صحیح بر صحیح انجام گرفته‬
‫است‪ .‬چنانچه بخواهیم تقسیم بصورت اعشاری صورت پذیرد‪ ،‬به دو شكل می توانیم عمل‬
‫كنیم‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫برای اینکه عبارت تقسیم صفحه قبل بصورت اعشاری انجام شود‪ ،‬به دو روش‬
‫می توان عمل کرد‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫این عبارت را بصورت ‪ a / 4.0‬بنویسیم‪.‬‬
‫از عملگر قالب ریزی استفاده كنیم‪.‬‬

‫عملگر قالب ریزی می تواند یك نوع را به نوع دیگری تبدیل نماید‪ .‬شكل كلی آن‬
‫به شكل زیر است ‪:‬‬
‫>‪() ‫كه ‪ type‬نوع مورد نظر است كه قصد تبدیل عبارت ‪ expression‬به آن نوع را‬
‫داریم‪ .‬بعنوان مثال در مورد قبلی می توان به شكل زیر عمل كرد ‪:‬‬
‫‪(float) a / 4‬‬
‫در این حالت از كامپایلر خواسته ایم كه ابتدا عدد ‪ a‬را به اعشاری تبدیل كند‬
‫)البته بصورت موقت( و سپس آن را بر ‪ 4‬تقسیم نماید‪ ،‬كه مسلما حاصل‬
‫اعشاری خواهد بود‪.‬‬
‫بطوركلی هرگاه ثابتها و متغیرهایی از انواع مختلف در یك عبارت محاسباتی‬
‫داشته باشیم‪ ،‬كامپایلر ‪ C‬همه آنها را به یك نوع یكسان كه همان بزرگترین‬
‫عملوند موجود است تبدیل خواهد كرد‪ .‬بعنوان مثال به مورد صفحه بعد دقت‬
‫كنید ‪:‬‬

‫ عملگرهای محاسباتی‬7-5-1
char ch;
int i;

float f;
double d;
result = (ch / i)
int

+

(f *d)

(f+i)
float

double

double

int

-

double

double

float

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫اولویت عملگرها ‪ :‬در عبارتی که شامل چندین عملگر است‪ ،‬کدامیک در‬
‫ابتدا اعمال خواهد گردید‪.‬‬
‫اولویت عملگرهای محاسباتی از باال به پایین بشرح زیر است‪:‬‬
‫‪ ‬عملگر یکانی –‬
‫‪ ‬عملگرهای * و ‪ /‬و ‪%‬‬
‫‪ ‬عملگرهای ‪ +‬و –‬
‫چنانچه اولویت دو عملگر یکسان باشد‪ ،‬این عملگرها از چپ به راست‬
‫محاسبه خواهند شد‪.‬‬
‫چنانچه بخواهیم یک عمل با اولویت پایین زودتر انجام شود‪ ،‬باید از پرانتز‬
‫استفاده کنیم‪ .‬بنابراین اولویت عملگر پرانتز از همه موارد فوق‬
‫بیشتراست‪ .‬در مورد پرانتزهای متداخل‪ ،‬ابتدا پرانتز داخلی محاسبه‬
‫می شود؛ اما در مورد پرانتزهای هم سطح‪ ،‬ابتدا پرانتز سمت چپتر‬
‫محاسبه می گردد‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫چند مثال در مورد اولویت عملگرها‬

‫ترتیب اجرای عملگرها‬

‫عبارت زبان ‪C‬‬

‫ابتدا عمل * و سپس عمل ‪+‬‬

‫‪b+c*d‬‬

‫ابتدا عمل ‪ +‬و سپس عمل *‬

‫‪(b + c) * d‬‬

‫ابتدا عمل ‪ /‬سپس عمل * و در انتها عمل ‪+‬‬

‫‪b+c/d*e‬‬

‫ابتدا عمل * سپس عمل ‪ /‬و در انتها عمل ‪+‬‬

‫)‪b + c / (d * e‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫یک مثال کامل در مورد اولویت عملگرها‬

‫‪result = a + b * (f – (g + b) / d) – c * (a – d) / e‬‬
‫‪6‬‬

‫‪1‬‬
‫‪7‬‬

‫‪2‬‬

‫‪8‬‬

‫‪3‬‬
‫‪4‬‬
‫‪5‬‬
‫‪9‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫در زبان ‪ C‬برای انتساب چندین عملگر وجود دارد‪ .‬ساده ترین عملگر انتساب‪ ،‬همان عملگر =‬
‫است که در بسیاری از زبانها استفاده می شود‪ .‬بعنوان مثال ‪:‬‬
‫;‪a = 5‬‬
‫;‪b = c + 2 * d‬‬
‫این عملگر باعث می شود که عبارت سمت راست در عبارت سمت چپ قرار گیرد‪.‬‬
‫توجه کنید که مقدار سمت چپ باید عبارتی باشد که بتوان به آن یک مقدار را نسبت داد‬
‫)مانند یک متغیر( که به آن ‪ Lvalue‬گفته می شود‪ ،‬بنابراین یک ثابت نمی تواند در سمت چپ‬
‫قرار گیرد‪.‬‬
‫نکته دیگر اینکه اولویت عملگر = از عملگرهای ریاضی کمتر است و درنتیجه ابتدا آن عملیات‬
‫انجام شده و در پایان حاصل در عبارت سمت چپ ریخته می شود‪.‬‬
‫الزم به ذکر است که در هنگام انتساب‪ ،‬درصورت لزوم نوع عبارت سمت راست به نوع عبارت‬
‫سمت چپ تبدیل می شود‪ .‬مثال‪:‬‬
‫;‪int a‬‬
‫;‪a = 2.5 * 5.0‬‬
‫که دراینصورت عدد ‪ 12‬در ‪ a‬ذخیره خواهد شد‪.‬‬
‫شرکت پذیری این عملگر از راست به چپ می باشد‪ ،‬بدین معنا که چنانچه چندین عملگر‬
‫نسبت دهی داشته باشیم‪ ،‬این عملگرها از راست به چپ محاسبه می شوند‪ .‬مثال پس از‬
‫اجرای دستور زیر‪ ،‬مقدار هر ‪ 3‬متغیر برابر ‪ 10‬خواهد شد‪.‬‬
‫;‪a = b = c = 10‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬

‫نکته جالب درمورد زبان ‪ C‬آنستکه دارای یک سری عملگرهای انتساب‬
‫خالصه شده است که باعث می شوند در بعضی موارد بتوانیم عبارات‬
‫کوتاهتری را بنویسیم‪ .‬این عملگرها عبارتند از ‪:‬‬
‫عملگرد‬

‫مثال‬

‫عبارت انتساب معادل‬

‫‪++‬‬

‫;‪a ++‬‬

‫;‪a = a + 1‬‬

‫‪--‬‬

‫;‪a --‬‬

‫;‪a = a – 1‬‬

‫=‪+‬‬

‫;‪a += 5‬‬

‫;‪a = a + 5‬‬

‫=‪-‬‬

‫;‪a -= 8‬‬

‫;‪a= a – 8‬‬

‫=*‬

‫;‪a *= 10‬‬

‫;‪a= a * 10‬‬

‫=‪/‬‬

‫;‪a /= 2‬‬

‫;‪a = a / 2‬‬

‫=‪%‬‬

‫;‪a %= 10‬‬

‫;‪a = a % 10‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬
‫‪‬‬

‫عملگر اول و دوم‪ ،‬عملگرهای یکانی هستند که بترتیب عملگر افزایش و عملگر کاهش‬
‫نامیده می شوند‪.‬‬
‫نکته جالب آنستکه این دو عملگر به دوصورت مورد استفاده قرار می گیرند‪.‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫در حالتی که از دستور ;‪ a ++‬استفاده شود به آن پس افزایش می گویند و بدین معناست که‬
‫ابتدا از مقدار فعلی ‪ a‬در عبارت موردنظر استفاده کن و سپس آن را افزایش بده‪.‬‬
‫اما دستور ;‪ ++ a‬که به آن پیش افزایش گفته می شود‪ ،‬ابتدا ‪ a‬را افزایش داده و سپس از آن‬
‫در عبارت استفاده می کند‪.‬‬
‫به برنامه زیر دقت کنید‪:‬‬

‫>‪#include ‫{ )(‪void main‬‬
‫; ‪int a ,b‬‬
‫;‪a=5‬‬
‫;‪b = a ++‬‬
‫;)‪printf(“a=%d and b=%d \n”,a,b‬‬
‫;‪a=5‬‬
‫;‪b = ++ a‬‬
‫;)‪printf(“a=%d and b=%d \n”,a,b‬‬
‫}‬
‫‪a=6 b=5‬‬
‫‪a=6 b=6‬‬

‫‪ 7-5-3‬عملگرهای مقایسه ای‬
‫‪‬‬

‫‪‬‬

‫این عملگرها دو عبارت را بایکدیگر مقایسه کرده و نتیجه را باز می گردانند‪.‬‬
‫نتیجه می تواند درست )‪ (true‬یا غلط )‪ (false‬باشد‪.‬‬
‫نتیجه این عملگرها یک عدد صحیح است که درصورت درست بودن ‪ 1‬و‬
‫درصورت غلط بودن ‪ 0‬باز می گردانند‪ .‬این عملگرها عبارتند از‪:‬‬
‫عملگر‬

‫مفهوم عملگر‬

‫مثال‬

‫<‬

‫بزرگتر )<(‬

‫‪a>b‬‬

‫>‬

‫کوچکتر )>(‬

‫‪a
‫=<‬

‫بزرگتر یا مساوی )≤(‬

‫‪a >= b‬‬

‫=>‬

‫کوچکتر یا مساوی )≥(‬

‫‪a <= b‬‬

‫==‬

‫مساوی )=(‬

‫‪a == b‬‬

‫=!‬

‫نامساوی )≠(‬

‫‪a != b‬‬

‫‪ 7-5-3‬عملگرهای مقایسه ای‬
‫‪‬‬

‫‪‬‬

‫نکته مهمی که باید به آن دقت کرد عملگر مساوی )==( است‪ ،‬چرا که یک‬
‫اشتباه بسیار متداول برنامه نویسان ‪ C‬استفاده اشتباه از عملگر انتساب‬
‫)=( بجای عملگر تساوی )==( است که باعث ایجاد خطا در برنامه می‬
‫شود‪.‬‬
‫اولویت این عملگرها از باال به پایین بشرح زیر است‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫عملگرهای <‪ <= ، > ،‬و =>‬
‫عملگرهای == و =!‬

‫الزم بذکر است که در هنگام مساوی بودن اولویت چند عملگر‪ ،‬این عملگرها‬
‫از چپ به راست محاسبه می گردند‪.‬‬

‫‪ 7-5-4‬عملگرهای منطقی‬
‫‪‬‬

‫این عملگرها به شما اجازه می دهند که شرطهای ساده ای را که با‬
‫استفاده از عملگرهای مقایسه ای ایجاد شده اند را با یکدیگر ترکیب نموده‬
‫و شرطهای پیچیده تری را بسازید‪ .‬این عملگرها عبارتند از ‪:‬‬
‫مثال‬

‫عملگر‬

‫مفهوم عملگر‬

‫نحوه کار‬

‫&&‬

‫‪ AND‬منطقی‬

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

‫‪a>0 && sw==1‬‬

‫||‬

‫‪ OR‬منطقی‬

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

‫‪a<=100 || b!=0‬‬

‫!‬

‫‪ NOT‬منطقی‬

‫اگر عملوند درست باشد‪ ،‬نادرست و‬
‫اگر نادرست باشد‪ ،‬درست برمی‬
‫گرداند‪.‬‬

‫)‪! (a==1 || b<10‬‬

‫‪ 7-5-5‬عملگر شرطی‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫گاهی الزم است که ابتدا یک شرط بررسی شده و سپس برمبنای نتیجه )درست یا نادرست بودن آن( یکی‬
‫از دو عبارت ممکن بازگردانده شود‪ .‬برای اینکار می توان از یک عملگر ‪3‬تایی )با ‪ 3‬عملوند( بنام عملگر‬
‫شرطی استفاده نمود‪.‬‬
‫شکل کلی این عملگر بصورت زیر است‪:‬‬
‫>عبارت‪> :<2‬عبارت‪> ?<1‬شرط<‬
‫نحوه کار بدینصورت است که درصورت درست بودن شرط‪ ،‬عبارت‪ 1‬و در غیراینصورت عبارت ‪ 2‬بازگردانده می‬
‫شود‪.‬‬
‫به عنوان مثال به دستور زیر توجه کنید‪:‬‬
‫که این عبارت معادل دستور زیر است‪:‬‬

‫‪‬‬

‫;‪a = (k<10) ? 100 : 50‬‬
‫;‪if (k<10) a=100‬‬
‫;‪else a=50‬‬

‫البته این عبارت به شکلهای پیچیده نیز می تواند مورد استفاده قرار گیرد‪ .‬مثال ‪:‬‬
‫;‪c += (a>0 && a<10) ? ++a : a/b‬‬
‫که معادل است با ‪:‬‬
‫{ )‪if (a>0 && a<10‬‬
‫;‪a= a + 1‬‬
‫;‪c = c + a‬‬
‫}‬
‫;‪else c = c + a/b‬‬

‫‪ 7-5-6‬اولویت عملگرها‬
‫عملگر‬

‫اولویت‬

‫شرکت پذیری‬

‫‪1‬‬

‫)(‬

‫از چپ به راست‬

‫‪2‬‬

‫‪- + ! -- ++‬‬

‫از راست به چپ‬

‫‪3‬‬

‫‪* / %‬‬

‫از چپ به راست‬

‫‪4‬‬

‫‪+ -‬‬

‫از چپ به راست‬

‫‪5‬‬

‫>> <<‬

‫از چپ به راست‬

‫‪6‬‬

‫>= > <= <‬

‫از چپ به راست‬

‫‪7‬‬

‫=! ==‬

‫از چپ به راست‬

‫‪8‬‬

‫&&‬

‫از چپ به راست‬

‫‪9‬‬

‫||‬

‫از چپ به راست‬

‫‪10‬‬

‫‪?:‬‬

‫از راست به چپ‬

‫‪11‬‬

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

‫از راست به چپ‬

‫‪12‬‬

‫‪,‬‬

‫از چپ به راست‬

‫‪ 7-6‬خواندن و نمایش اطالعات‬
‫‪‬‬

‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫همانطور كه قبال نیز گفته شد‪ ،‬یكی از اهداف زبان ‪ C‬قابل حمل بودن آن‬
‫است‪ .‬بهمین منظور سعی شده است كه از دستوراتی كه ممكن است‬
‫وابسته به ماشین خاصی باشد‪ ،‬اجتناب گردد‪.‬‬
‫بهمین دلیل زبان ‪ C‬برخالف سایر زبانها دارای هیچ دستوری برای‬
‫خواندن از ورودی و یا نوشتن در خروجی نیست‪.‬‬
‫اما در عوض دارای تعدادی تابع )زیربرنامه( استاندارد می باشد كه تقریبا‬
‫تمامی كامپایلرها از آنها حمایت می كنند‪.‬‬
‫این كار به كامپایلر این امكان را می دهد كه بر حسب نوع سخت افزار‬
‫موردنظر‪ ،‬توابع ورودی و خروجی را طراحی نماید‪.‬‬
‫این توابع در یك فایل سرآمد بنام ‪ stdio.h‬تعریف شده اند و بنابراین قبل‬
‫ازاینكه بتوانید از این توابع استفاده نمایید‪ ،‬باید این فایل را نیز با استفاده‬
‫از ‪ #include‬در برنامه خود بگنجانید‪.‬‬

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫برای نمایش اطالعات در خروجی از تابع ‪ printf‬استفاده می شود‪.‬‬
‫این تابع رشته موردنظر شما را به خروجی استاندارد )كه در حالت‬
‫عادی همان صفحه نمایش یا مانیتور است( می فرستد‪ .‬شكل كلی این‬
‫تابع بصورت زیر است‪:‬‬
‫; )>لیست متغیرها< ‪> ,‬رشته كنترلی<(‪printf‬‬
‫رشته كنترلی همان متنی است كه قصد چاپ آن را داریم‪ ،‬با ذكر این‬
‫نكته كه در قسمتهایی كه باید مقدار یك متغیر چاپ شود‪ ،‬از یك‬
‫مشخصه تبدیل استفاده می شود‪ .‬هر مشخصه تبدیل از یك عالمت ‪%‬‬
‫بعالوه یك كاراكتر كه نوع متغیر مورد نظر را نشان می دهد تشكیل می‬
‫گردد‪.‬‬
‫لیست متغیرها نیز همان متغیرهایی هستند كه قصد چاپ آنها را داریم‪.‬‬
‫این متغیرها باید بترتیب قرار گرفته و با كاما )‪ (,‬از یكدیگر جدا شوند‪.‬‬

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫مشخصه تبدیل‬

‫مفهوم‬

‫‪%c‬‬

‫كاراكتر‬

‫‪%d‬‬

‫عدد صحیح در مبنای ‪10‬‬

‫‪%f‬‬

‫عدد اعشاری بدون نماد علمی‬

‫‪%e‬‬

‫عدد اعشاری با نماد علمی‬

‫‪%g‬‬

‫عدد اعشاری با حالت كوتاهتر بین ‪ e‬و ‪f‬‬

‫‪%s‬‬

‫رشته‬

‫‪%ld‬‬

‫عدد صحیح بزرگ‬

‫‪%lf %le %lg‬‬

‫عدد اعشاری بزرگ‬

‫‪%o‬‬

‫عدد صحیح در مبنای ‪8‬‬

‫‪%x‬‬

‫عدد صحیحی در مبنای ‪16‬‬

‫‪%u‬‬

‫عدد صحیح بدون عالمت‬

‫ تابع نمایش در خروجی‬7-6-1
#include
void main() {
int age = 20;
floate average = 18.23;
printf("You are %d years old and your average is %f \n",age,average);
}
You are 20 years old and your average is 18.230000

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫‪‬‬
‫‪‬‬

‫برای کنترل نحوه چاپ اعداد می توانید از مشخصه طول میدان استفاده‬
‫کنید‪.‬‬
‫مشخصه طول میدان برای اعداد به شكل زیر استفاده می شود‪:‬‬
‫‪ ‬برای اعداد صحیح از ‪ %nd‬استفاده می كنیم كه ‪ n‬تعداد ارقام را نشان‬
‫می دهد )مثال ‪ .(%3d‬در اینصورت برای هر متغیر ‪ n‬رقم درنظر گرفته‬
‫می شود‪ .‬اگر اندازه عدد از ‪ n‬كوچكتر باشد‪ ،‬به سمت چپ آن فضای‬
‫خالی اضافه می شود و اگر اندازه عدد بیش از ‪ n‬رقم باشد‪ ،‬طول میدان‬
‫نادیده گرفته شده و عدد بطور كامل چاپ می شود‪.‬‬
‫‪ ‬برای اعداد اعشاری از ‪ %n.mf‬استفاده می كنیم كه ‪ n‬اندازه كل عدد‬
‫)شامل عالمت ممیز( و ‪ m‬تعداد ارقام اعشار است )مثال ‪ .(%5.2f‬در‬
‫صورتیكه تعداد ارقام اعشاری عدد موردنظر از ‪ m‬بیشتر باشد‪ ،‬عدد به ‪m‬‬
‫عدد اعشار گرد می شود و در صورتیكه از ‪ m‬كمتر باشد‪ ،‬در سمت‬
‫راست آن ‪ 0‬قرار داده می شود‪.‬‬

‫‪ 7-6-2‬تابع خواندن از ورودی‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای خواندن اطالعات از ورودی از تابع ‪ scanf‬استفاده می شود‪.‬‬
‫این تابع اطالعات را ازورودی استاندارد )معموال صفحه كلید( خوانده و در‬
‫متغیرهای تعیین شده قرار می دهد‪.‬‬
‫شكل كلی این تابع بصورت زیر است‪:‬‬
‫; )>لیست آدرسهای متغیرها< ‪> ,‬رشته كنترلی<(‪scanf‬‬
‫همانطور كه می بینید نحوه احضار تابع ‪ scanf‬نیز مشابه ‪ printf‬است‪ .‬تنها‬
‫تفاوت در آن است كه در ‪ scanf‬باید لیست آدرسهای متغیرها ارسال شود‪.‬‬
‫مبحث مربوط به آدرسها در فصول بعدی بررسی خواهد شد ولی در حال حاضر‬
‫بخاطر بسپارید كه برای بدست آوردن آدرس یك متغیر از عالمت & استفاده می‬
‫كنیم‪ .‬بعنوان مثال ‪ &age‬بمعنای آدرس متغیر ‪ age‬است‪.‬‬
‫بطور كلی در ‪ C‬قدیمی هرگاه كه یك تابع دارای پارامترهای خروجی بود )یعنی‬
‫پارامترهایی كه یك مقدار را باز می گرداندند( از آدرس متغیرها استفاده می‬
‫شد كه امروزه این مسئله وجود ندارد‪.‬‬

‫ تابع خواندن از ورودی‬7-6-2
#include
void main() {
int age;
float average ;
printf("Please enter your age and average : ");
scanf("%d %f",&age,&average);
printf("You are %d years old and your average is %5.2f \n",age,average);
}

Please enter your age and average : 19 16.72
You are 19 years old and your average is 16.72

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫زبان ‪ C++‬یک زبان شی گرا است‪ ،‬بهمین دلیل در این زبان برای ورودی‬
‫و خروجی از اشیاء بجای توابع استفاده می گردد‪.‬‬
‫از آنجا که امروزه معموال برنامه نویسان ‪ C‬از کامپایلرهای ‪ C++‬استفاده‬
‫می کنند‪ ،‬می توانند از اشیای ورودی و خروجی آن نیز استفاده کنند‪.‬‬
‫اینکار در بین بسیاری از برنامه نویسان ‪ C‬متداول است‪ ،‬بهمین دلیل ما‬
‫در اینجا نحوه کار با اشیای خواندن و نوشتن در ‪ C++‬را بطور مقدماتی‬
‫توضیح می دهیم؛ گرچه توضیح کامل این موارد نیاز به آشنایی با شی‬
‫گرایی و زبان ‪ C++‬دارد‪.‬‬
‫قبل از هرچیز الزم به ذکر است که کلیه اشیای مربوط به ورودی و‬
‫خروجی در فایل سرآمدی بنام ‪ iostream.h‬تعیریف شده اند‪ ،‬بنابراین‬
‫ابتدا باید این فایل به برنامه توسط دستور ‪ #include‬الحاق گردد‪.‬‬

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫زبان ‪ C++‬برای نمایش اطالعات از یک شیئ بنام ‪ cout‬استفاده می نماید‪.‬‬
‫برای ارسال اطالعات مورد نظر برای چاپ به ‪ cout‬باید از عملگر درج در جریان‬
‫یا >> استفاده نماییم‪ .‬بعنوان مثال ‪:‬‬
‫; ” ‪cout >> “Please enter your name:‬‬
‫و یا مثال دیگر ‪:‬‬
‫;‪int a = 10‬‬
‫;‪float b = 2.86‬‬
‫;‪cout << a‬‬
‫;‪cout << b‬‬
‫نکته جالبی که در این مثالها دیده می شود‪ ،‬آنستکه برخالف تابع ‪ printf‬هیچ‬
‫نیازی به مشخص کردن نوع متغیری که قصد چاپ آن را داریم نیست و خود‬
‫شئ ‪ cout‬نوع آن را تشخیص می دهد‪.‬‬
‫عالوه براین می توان چندین عملگر درج در جریان را با یکدیگر الحاق کرد و‬
‫چندین متغیر را با یک دستور چاپ کرد‪.‬‬

C++ ‫ ورودی و خروجی اطالعات در‬7-6-3
#include
void main() {
int age = 20;
floate average = 18.23;
cout >> “You are ” >> age >> “ years old and your average is ” >> average ;
}

You are 20 years old and your average is 18.230000

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای دریافت اطالعات از کاربر‪ ،‬از شئ دیگری بنام ‪ cin‬استفاده می شود‪.‬‬
‫برای ارسال متغیر مورد نظر به ‪ cin‬باید از عملگر استخراج از جریان یا <<‬
‫استفاده نماییم‪ .‬بعنوان مثال‪:‬‬
‫;‪int a‬‬
‫;‪cin >> a‬‬
‫بازهم همانطور که می بینید نیازی به تعیین نوع متغیر موردنظر نیست و خود‬
‫شئ ‪ cin‬نوع متغیر را بطور اتوماتیک تشخیص داده و داده ای از همان نوع را از‬
‫کاربر دریافت و در متغیر مورد نظر قرار می دهد‪.‬‬
‫عملگرهای استخراج از جریان را نیز می توان با یکدیگر الحاق کرد‪.‬‬
‫برای رفتن به خط بعد در شئ ‪ cout‬می توان از دستکاری کننده ‪ endl‬استفاده‬
‫کرد‪ .‬مثال در دستور زیر پس از چاپ پیغام‪ ،‬مکان نما به خط بعد منتقل می‬
‫شود‪:‬‬
‫;‪cout >> “List of students : “ >> endl‬‬
‫البته دستکاری کننده های متعدد دیگری نیز ازجمله موارد مربوط به تعیین طول‬
‫میدان و نحوه چاپ مقادیر وجود دارد که توضیح آنها نیاز به یک مبحث مستقل‬
‫دارد‪.‬‬

C++ ‫ ورودی و خروجی اطالعات در‬7-6-3
#include
void main() {
int age;
float average ;
cout << "Please enter your age and average : " ;
cin >> age >> average ;
cout << "You are " << age << "years old and your average is " << average;
}

Please enter your age and average : 19 16.72
You are 19 years old and your average is 16.72

‫‪ 7-7‬توابع کتابخانه ای‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫همانطور که قبال نیز گفته شد‪ ،‬زبان ‪ C‬از زیر برنامه ها نیز حمایت می کند‪ .‬هر زیر برنامه‬
‫در ‪ C‬یک تابع نامیده می شود‪ .‬تا کنون با توابعی همچون ‪ main‬و یا ‪ printf‬و ‪ scanf‬آشنا‬
‫شده ایم‪.‬‬
‫معموال عرضه کنندگان کامپایلرها و یا سایر فروشندگان نرم افزار‪ ،‬برخی از توابع عمومی‬
‫را که ممکن است مورد نیاز جمع کثیری از برنامه نویسان مختلف باشد را در قالب‬
‫کتابخانه ای از توابع در اختیار برنامه نویسان می گذارند‪ .‬بعضی از این توابع کتابخانه ای‬
‫مانند ‪ printf‬و ‪ scanf‬بصورت استاندارد درآمده و توسط عرضه کنندگان مختلف ارائه می‬
‫شوند‪.‬‬
‫در کامپایلر عرضه شده توسط شرکت بورلند )‪ (Borland C++ 3.1‬نیز کتابخانه های‬
‫متعددی از توابع برای شما عرضه شده اند که بتدریج با آنها و کاربردشان آشنا خواهید‬
‫شد‪.‬‬
‫نکته مهم آنستکه برای استفاده از این توابع ابتدا باید فایل سرآمد مربوط به آنها را نیز در‬
‫ابتدای برنامه خود اضافه نمایید ) با استفاده از ‪ .(#include‬هر فایل سرآمد شامل تعاریف‬
‫اولیه گروهی از توابع مرتبط با هم و داده های مربوط به آنها بوده و در استاندارد قدیمی‬
‫تر دارای پسوند ‪ .h‬می باشد)در استاندارد جدید پسوند این فایلها حذف شده است(‪.‬‬
‫برخی از این فایلهای سرآمد عبارتند از‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪ : stdio.h‬توابع ورودی و خروجی استاندارد‬
‫‪ : math.h‬توابع ریاضی‬
‫‪ : graphics.h‬توابع مربوط به عملیات گرافیکی‬
‫‪ : string.h‬توابع مربوط به کار با رشته ها‬


Slide 4

‫مبانی کامپیوتر و برنامه سازی‬
‫فصل هفتم ‪ :‬مفاهیم اولیه زبان ‪C‬‬
‫مدرس ‪ :‬نگین معروفی‬

‫‪ 7-1‬شناسه ها در ‪C‬‬
‫‪‬‬
‫‪‬‬

‫شناسه )‪ (identifier‬نامی است که به یک قسمت از برنامه مانند متغیر‪ ،‬تابع‪ ،‬ثابت و یا‬
‫‪ ...‬داده می شود‪.‬‬
‫در زبان ‪ C‬برای انتخاب شناسه ها فقط می توان از عالئم زیر استفاده کرد‪:‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫حروف انگلیسی کوچک و بزرگ )‪(A…Z a…z‬‬
‫ارقام )‪(0…9‬‬
‫عالمت خط پایین یا _‬

‫البته یک شناسه نمی تواند با یک رقم شروع شود‪.‬‬
‫چند شناسه مجاز‪ name2 ، average ، sum :‬و ‪student_average‬‬
‫چند شناسه غیرمجاز ‪ 2name‬و یا ‪student average‬‬
‫در برنامه نویسی امروزی پیشنهاد می شود بجای شناسه هایی همانند‬
‫‪ student_average‬از ‪ studentAverage‬استفاده گردد‪.‬‬
‫نکته مهم دیگری که باید به آن اشاره کرد آنستکه زبان ‪ C‬برخالف بسیاری از زبانهای دیگر‬
‫به کوچک و بزرگی حروف حساس است )‪ .(case sensitive‬در نتیجه شناسه های زیر با‬
‫یکدیگر متفاوتند ‪:‬‬
‫‪Sum ≠ sum ≠ SUM‬‬
‫آخرین نکته اینستکه در هنگام انتخاب شناسه نمی توانید از کلمات کلیدی که برای‬
‫منظورهای خاص در زبان ‪ C‬رزرو شده اند استفاده کنید‪.‬‬

C ‫ شناسه ها در‬7-1
: C ‫کلمات کلیدی در زبان‬
auto

break

case

char

const

continue

default

do

double

else

enum

extern

float

for

goto

if

int

long

register

return

short

signed

sizeof

static

struct

switch

typedef

union

unsigned

void

volatile

while

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫محدوده‬

‫اندازه )بیت(‬

‫توضیح‬

‫نوع داده‬

‫‪-128 to +127‬‬

‫‪8‬‬

‫کاراکتر‬

‫‪char‬‬

‫‪-32768 to +32767‬‬

‫‪16‬‬

‫عدد صحیح‬

‫‪int‬‬

‫‪3.4e-38 to 3.4e+38‬‬

‫‪32‬‬

‫عدد اعشاری‬

‫‪float‬‬

‫‪1.7e-308 to 1.7e+308‬‬

‫‪64‬‬

‫عدد اعشاری با‬
‫دقت مضاعف‬

‫‪double‬‬

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫‪‬‬

‫البته چند نکته مهم درمورد این جدول قابل ذکر است ‪:‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫اندازه ‪ int‬در محیطهای ‪ 16‬بیتی مانند ‪ DOS‬برابر ‪ 16‬بیت است‪ .‬اما در‬
‫محیطهای ‪ 32‬بیتی همانند ‪ Windows‬اندازه آن ‪ 32‬بیت می باشد که در‬
‫اینصورت محدوده ای برابر ‪ -2,147,483,648‬تا ‪ +2,147,483,647‬را‬
‫پوشش می دهد‪.‬‬
‫در بعضی از کامپایلرهای ‪ ،C‬نوع داده ‪ bool‬نیز وجود دارد که می تواند‬
‫یکی از مقادیر ‪)true‬درست( یا ‪) false‬غلط( را نشان دهد ‪ .‬اما در نسخه‬
‫های اولیه ‪ C‬از همان نوع داده صحیح یا ‪ int‬برای اینکار استفاده می‬
‫شد‪ .‬بدین صورت که ‪ 0‬نشاندهنده ‪ false‬و هر عدد غیر صفر )معموال ‪(1‬‬
‫نشاندهنده ‪ true‬است‪.‬‬
‫از آنجا که برای ذخیره سازی کاراکترها کد اسکی آنها ذخیره می گردد‪،‬‬
‫از یک متغیر کاراکتری یا ‪ char‬می توان بعنوان یک عدد صحیح کوچک نیز‬
‫استفاده کرد و اعمال ریاضی برروی آنها نیز مجاز است‪.‬‬

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫عالوه براین چندین اصالح کننده نیز وجود دارد که به ما اجازه می دهد نوع داده مورد‬
‫نظر را با دقت بیشتری برای نیازهای مختلف استفاده نماییم‪.‬‬
‫این اصالح کننده ها عبارتند از ‪short, long, signed, unsigned :‬‬
‫تمام این اصالح کننده ها می توانند به نوع داده ‪ int‬اعمال شوند و اثر آنها بستگی‬
‫به محیط دارد‪.‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫در یک محیط ‪16‬بیتی‪short int ،‬بازهم برابر ‪16‬بیت است ولی ‪ long int‬برابر‪32‬بیت می‬
‫باشد‪.‬‬
‫‪ unsigned int‬باعث می شود که یک عدد ‪ 16‬بیتی بدون عالمت داشته باشیم که بازه‬
‫بین ‪ 0‬تا ‪ 65535‬را پوشش می دهد‪ signed int .‬نیز همانند ‪ int‬معمولی بوده و تفاوتی‬
‫ندارد‪.‬‬
‫ترکیب این اصالح کننده ها نیز ممکن است‪ .‬مثال ‪ unsigned long int‬یک عدد ‪ 32‬بیتی‬
‫بدون عالمت است که بازه ‪ 0‬تا ‪ 4,294,967,295‬را پوشش می دهد‪.‬‬

‫برروی نوع داده ‪ char‬فقط اصالح کننده های ‪ signed‬و ‪ unsigned‬را می توان اعمال‬
‫کرد‪ .‬معموال از اصالح کننده ‪ unsigned‬وقتی استفاده می شود که قصد داشته‬
‫باشیم از ‪ char‬بعنوان یک عدد صحیح مثبت بین ‪ 0‬تا ‪ 255‬استفاده کنیم‪.‬‬
‫برروی نوع داده ‪ double‬تنها اصالح کننده ‪ long‬قابل اعمال است و دراینصورت عدد‬
‫اعشاری با ‪ 80‬بیت را خواهیم داشت که قادر است هر عددی در بازه ‪ 3.4e-4932‬تا‬
‫‪ 1.1e+4932‬را در خود نگاه دارد‪.‬‬

‫‪ 7-3‬تعریف متغیرها‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای تعریف متغیرها به شکل زیر عمل می کنیم‪:‬‬

‫;>‪ ‫که ‪ type‬یکی از نوع داده های گفته شده و ‪ variable-list‬لیستی از متغیرها است‬
‫که با کاما از یکدیگر جدا شده اند‪ .‬بعنوان مثال ‪:‬‬
‫;‪int sum‬‬
‫;‪float average‬‬
‫; ‪long int a, b, c‬‬
‫; ‪unsigned long int i, j, k‬‬
‫عالوه براین می توان در هنگام تعریف متغیر به آن مقدار اولیه نیز داد‪ .‬مثال ‪:‬‬
‫; ‪int d = 0‬‬
‫نكته مهم آنكه زبان ‪ C‬به متغیرها مقدار اولیه نمي دهد )حتي ‪ (0‬و برنامه نويس‬
‫خود بايد اينكار را صريحا انجام دهد‪ ،‬درغیر اينصورت مقدار اولیه متغیر‪ ،‬نامعین خواهد‬
‫بود‪.‬‬
‫تعریف متغیرها طبق اصول زبان ‪ C‬میتواند درهرجایی از برنامه صورت پذیرد‪ ،‬و‬
‫متغیرهای تعریف شده از همان خط به بعد قابل استفاده خواهد بود‪ .‬اما معموال‬
‫توصیه می گردد كه تعریف متغیرها در همان خط ابتدایی تابع و بالفاصله پس از {‬
‫صورت پذیرد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫‪‬‬
‫‪‬‬

‫ثابتها مقادیر ثابتی هستند كه مقدار آنها در حین اجرای برنامه تغییر نمی یابد‪ .‬ثابتها می توانند از‬
‫هریك از نوع داده های اصلی باشند‪.‬‬
‫ثوابت عددی صحیح ‪:‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫برای نمایش این دسته از ثوابت‪ ،‬از دنباله ای از ارقام بعالوه عالمت ‪ +‬یا ‪ -‬استفاده می كنیم‪ .‬بعنوان مثال‬
‫‪ -45‬و یا ‪ 3489‬ثوابت صحیح هستند‪.‬‬
‫در حالت عادی ‪ C‬هر عدد را در كوچكترین نوع داده ای كه می تواند قرار می دهد‪ .‬مثال عدد ‪ 85‬در یك‬
‫‪ int‬قرار می گیرد‪ ،‬اما عدد ‪ 145398‬در یك ‪ long int‬قرار خواهد گرفت‪.‬‬
‫اگر قصد دارید یك عدد كوچك بعنوان ‪ long‬محسوب گردد‪ ،‬می توانید از پسوند ‪ L‬در انتهای آن استفاده‬
‫می كنیم‪ .‬مثال ‪245L‬یك عدد ‪ long‬محسوب می شود‪.‬‬
‫;‪long int a = 20L‬‬
‫پسوند ‪ U‬در انتهای عدد نیز نشانه بدون عالمت بودن آن است‪.‬‬
‫نكته دیگر آنكه ‪ C‬به شما اجازه می دهد درصورت لزوم ثوابت صحیح خود را در مبنای ‪ 8‬یا ‪ 16‬نیز كه‬
‫از مبناهای متداول در برنامه نویسی هستند‪ ،‬بنویسید‪.‬‬
‫‪‬‬
‫‪‬‬

‫برای نوشتن عدد در مبنای ‪ 8‬باید آن را با ‪ 0‬آغاز كنید‪ ،‬مثال ‪ 0342‬یك عدد در منای ‪ 8‬محسوب می‬
‫گردد‪.‬‬
‫برای نوشتن یك عدد در مبنای ‪ 16‬باید آن را با ‪ 0x‬آغاز نمایید‪ ،‬مانند ‪.0x27A4‬‬

‫‪ 7-4‬ثوابت‬
‫ثوابت عددی اعشاری‬

‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫برای نمایش اعداد اعشاری‪ ،‬باید از نقطه اعشار استفاده كنیم‪ ،‬مانند ‪237.45‬‬
‫اما نكته جالب آنستكه می توانید از نماد علمی نیز برای نمایش اعداد‬
‫اعشاری استفاده كنید‪ .‬برای اینكار كافی است از حرف ‪ e‬برای نمایش قسمت‬
‫توان استفاده نمایید‪ .‬بعنوان مثال ‪:‬‬
‫‪-23.47 × 10 5 = -23.47e5‬‬
‫‪42.389 × 10 -3 = 42.389e-3‬‬
‫دقت كنید كه قسمت توان‪ ،‬حتما یك عدد صحیح است‪.‬‬
‫نكته جالب اینجاست كه برخالف مورد قبل‪ ،‬كامپایلر بطور پیش فرض داده های‬
‫اعشاری را از نوع ‪ double‬فرض می كند‪.‬چنانچه دوست دارید ثابت شما ازنوع‬
‫‪ float‬درنظر گرفته شود‪ ،‬در انتهای آن ‪ F‬قرار دهید‪ .‬ضمنا پسوند ‪ L‬نیز داده‬
‫اعشاری را از نوع ‪ long double‬درنظر می گیرد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫ثوابت كاراكتری ‪:‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫برای نشان دادن ثوابت كاراكتری‪ ،‬آنها را در داخل ' قرار می دهیم‪ .‬بعنوان مثال‬
‫'‪'A‬یك ثابت كاراكتری است‪.‬‬
‫; '‪char ch = 'S‬‬
‫دقت كنید كه همانطور كه قبال گفته شد‪ ،‬كد اسكی كاراكترها در متغیر ذخیره‬
‫می گردد‪ ،‬بنابراین می توان از آن بعنوان یك عدد صحیح نیز استفاده كرد‪ .‬نكته‬
‫مهم دیگر آنستكه به تفاوت عدد ‪ 5‬و كاراكتر '‪ '5‬دقت داشته باشید‪ .‬در حقیقت‬
‫'‪ '5‬برابر است با عدد ‪ 53‬كه همان كد اسكی آن است‪.‬‬
‫روش فوق‪ ،‬برای نمایش کاراکترهای قابل چاپ مناسب است‪ ،‬اما بعضی‬
‫كاراكترها مانند ‪ enter‬قابل نمایش نبوده و برای آنها شکل خاصی وجود ندارد‪.‬‬
‫در چنین مواردی‪ ،‬زبان ‪ C‬از ترکیب عالمت \ به همراه یک کاراکتر دیگر‪ ،‬برای‬
‫نمایش این قبیل کاراکترها استفاده می نماید‪ .‬بعنوان مثال‪ ،‬کاراکتر '‪ '\n‬نشان‬
‫دهنده خط جدید یا همان ‪ enter‬می باشد‪.‬‬
‫جدول صفحه بعد این قبیل کاراکترها و معادل آنها را نشان می دهد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫نحوه نمایش در ‪C‬‬

‫کد اسکی‬

‫صدای بوق کامپیوتر‬

‫‪\a‬‬

‫‪7‬‬

‫حرکت به عقب ‪backspace‬‬

‫‪\b‬‬

‫‪8‬‬

‫شروع صفحه ‪form feed‬‬

‫‪\f‬‬

‫‪12‬‬

‫سطر جدید ‪line feed‬‬

‫‪\n‬‬

‫‪10‬‬

‫برگشت به ابتداي سطر ‪carriage return‬‬

‫‪\r‬‬

‫‪13‬‬

‫فاصله افقی ‪horizontal tab‬‬

‫‪\t‬‬

‫‪9‬‬

‫فاصله عمودی ‪vertical tab‬‬

‫‪\v‬‬

‫‪11‬‬

‫عالمت سوال‬

‫?\‬

‫‪63‬‬

‫عالمت '‬

‫'\‬

‫‪39‬‬

‫عالمت "‬

‫"\‬

‫‪34‬‬

‫عالمت \‬

‫\\‬

‫‪92‬‬

‫عالمت تهی‬

‫‪\0‬‬

‫‪0‬‬

‫نام کاراکتر‬

‫کد اسکی یک کاراکتر با ‪ 3‬رقم در مبنای ‪8‬‬

‫‪\000‬‬

‫کد اسکی یک کاراکتر با ‪ 2‬رقم در مبنای ‪16‬‬

‫‪\x00‬‬

‫‪ 7-4‬ثوابت‬
‫‪‬‬

‫ثوابت رشته ای ‪ C :‬عالوه بر ثوابت فوق‪ ،‬از یك ثابت دیگر بنام رشته نیز‬
‫حمایت می كند‪ .‬رشته‪ ،‬دنباله ای از كاراكترها است كه در داخل " قرار‬
‫می گیرند‪ .‬بعنوان مثال "‪ "this is a test‬یك رشته است‪ .‬دقت كنید كه '‪'a‬‬
‫یك كاراكتر است‪ ،‬اما "‪ "a‬یك رشته است كه فقط شامل یك كاراكتر می‬
‫باشد‪.‬‬

‫‪ 7-5‬عملگرها‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫عملگر‪ ،‬نمادی است كه به كامپایلر می گوید تا عملیات محاسباتی یا‬
‫منطقی خاصی را برروی یك یا چند عملوند‪ ،‬انجام دهد‪.‬‬
‫به عملگرهایی كه فقط یك عملوند دارند‪ ،‬عملگر یكانی می گوییم و‬
‫همواره عملگر در سمت چپ عملوند قرار می گیرد)مانند عدد ‪.(-125‬‬
‫اما عملگرهایی كه برروی دو عملوند اثر می كنند را عملگر دودویی‬
‫نامیده و عملگر را بین دو عملوند قرار می دهیم )مانند ‪.(23+86‬‬
‫هر ترکیب درستی از عملگرها و عملوندها را یک عبارت می نامیم‪.‬‬
‫‪ C‬از نقطه نظر عملگرها یك زبان بسیار قوی است‪ .‬این عملگرها به چند‬
‫دسته اصلی تقسیم می گردند كه آنها را به ترتیب بررسی می كنیم‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫این عملگرها‪ ،‬همان اعمال متداول ریاضی هستند كه در زبان ‪ C‬مورد استفاده‬
‫قرار می گیرند‪ .‬این اعمال عبارتند از ‪:‬‬

‫عمل‬

‫نوع‬

‫عملگر‬

‫منفی كردن عملوند سمت راست‬

‫یكانی‬

‫‪-‬‬

‫جمع دو عملوند‬

‫دودویی‬

‫‪+‬‬

‫تفریق دو عملوند‬

‫دودویی‬

‫‪-‬‬

‫ضرب دو عملوند‬

‫دودویی‬

‫*‬

‫تقسیم دو عملوند‬

‫دودویی‬

‫‪/‬‬

‫محاسبه باقیمانده تقسیم دو عملوند‬

‫دودویی‬

‫‪%‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬
‫‪‬‬

‫این عملگرهای برروی همه انواع داده های ‪ C‬عمل می كنند‪ ،‬بجز عملگر ‪ %‬كه فقط‬
‫برروی نوع داده های صحیح عمل می كند‪.‬‬
‫اما نكته مهمی كه باید به آن اشاره كرد‪ ،‬نحوه كار عملگر تقسیم برروی نوع داده های‬
‫مختلف است‪.‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫درصورتیكه هردو عملوند صحیح باشند‪ ،‬تقسیم بصورت صحیح بر صحیح انجام خواهد شد‪.‬‬
‫اگر یكی یا هر دو عملوند اعشاری باشند‪ ،‬تقسیم بصورت اعشاری انجام خواهد پذیرفت‪.‬‬
‫فرض كنید تعاریف زیر را داریم ‪:‬‬
‫; ‪int a,b‬‬
‫; ‪float c,d‬‬
‫; ‪a = 10 ; b = 4‬‬
‫;‪c = 8.2; d = 4.0‬‬
‫اكنون به نتایج عملیات زیر دقت كنید ‪:‬‬
‫‪a / b => 2‬‬
‫‪c / d => 2.05‬‬
‫‪a / d => 2.5‬‬
‫‪a / 4 => 2‬‬
‫چنانچه به آخرین مورد توجه كنید‪ ،‬متوجه می شوید كه از آنجا كه ‪a‬یك متغیر صحیح است و ‪4‬‬
‫نیز یك ثابت صحیح در نظر گرفته شده‪ ،‬درنتیجه تقسیم بصورت صحیح بر صحیح انجام گرفته‬
‫است‪ .‬چنانچه بخواهیم تقسیم بصورت اعشاری صورت پذیرد‪ ،‬به دو شكل می توانیم عمل‬
‫كنیم‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫برای اینکه عبارت تقسیم صفحه قبل بصورت اعشاری انجام شود‪ ،‬به دو روش‬
‫می توان عمل کرد‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫این عبارت را بصورت ‪ a / 4.0‬بنویسیم‪.‬‬
‫از عملگر قالب ریزی استفاده كنیم‪.‬‬

‫عملگر قالب ریزی می تواند یك نوع را به نوع دیگری تبدیل نماید‪ .‬شكل كلی آن‬
‫به شكل زیر است ‪:‬‬
‫>‪() ‫كه ‪ type‬نوع مورد نظر است كه قصد تبدیل عبارت ‪ expression‬به آن نوع را‬
‫داریم‪ .‬بعنوان مثال در مورد قبلی می توان به شكل زیر عمل كرد ‪:‬‬
‫‪(float) a / 4‬‬
‫در این حالت از كامپایلر خواسته ایم كه ابتدا عدد ‪ a‬را به اعشاری تبدیل كند‬
‫)البته بصورت موقت( و سپس آن را بر ‪ 4‬تقسیم نماید‪ ،‬كه مسلما حاصل‬
‫اعشاری خواهد بود‪.‬‬
‫بطوركلی هرگاه ثابتها و متغیرهایی از انواع مختلف در یك عبارت محاسباتی‬
‫داشته باشیم‪ ،‬كامپایلر ‪ C‬همه آنها را به یك نوع یكسان كه همان بزرگترین‬
‫عملوند موجود است تبدیل خواهد كرد‪ .‬بعنوان مثال به مورد صفحه بعد دقت‬
‫كنید ‪:‬‬

‫ عملگرهای محاسباتی‬7-5-1
char ch;
int i;

float f;
double d;
result = (ch / i)
int

+

(f *d)

(f+i)
float

double

double

int

-

double

double

float

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫اولویت عملگرها ‪ :‬در عبارتی که شامل چندین عملگر است‪ ،‬کدامیک در‬
‫ابتدا اعمال خواهد گردید‪.‬‬
‫اولویت عملگرهای محاسباتی از باال به پایین بشرح زیر است‪:‬‬
‫‪ ‬عملگر یکانی –‬
‫‪ ‬عملگرهای * و ‪ /‬و ‪%‬‬
‫‪ ‬عملگرهای ‪ +‬و –‬
‫چنانچه اولویت دو عملگر یکسان باشد‪ ،‬این عملگرها از چپ به راست‬
‫محاسبه خواهند شد‪.‬‬
‫چنانچه بخواهیم یک عمل با اولویت پایین زودتر انجام شود‪ ،‬باید از پرانتز‬
‫استفاده کنیم‪ .‬بنابراین اولویت عملگر پرانتز از همه موارد فوق‬
‫بیشتراست‪ .‬در مورد پرانتزهای متداخل‪ ،‬ابتدا پرانتز داخلی محاسبه‬
‫می شود؛ اما در مورد پرانتزهای هم سطح‪ ،‬ابتدا پرانتز سمت چپتر‬
‫محاسبه می گردد‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫چند مثال در مورد اولویت عملگرها‬

‫ترتیب اجرای عملگرها‬

‫عبارت زبان ‪C‬‬

‫ابتدا عمل * و سپس عمل ‪+‬‬

‫‪b+c*d‬‬

‫ابتدا عمل ‪ +‬و سپس عمل *‬

‫‪(b + c) * d‬‬

‫ابتدا عمل ‪ /‬سپس عمل * و در انتها عمل ‪+‬‬

‫‪b+c/d*e‬‬

‫ابتدا عمل * سپس عمل ‪ /‬و در انتها عمل ‪+‬‬

‫)‪b + c / (d * e‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫یک مثال کامل در مورد اولویت عملگرها‬

‫‪result = a + b * (f – (g + b) / d) – c * (a – d) / e‬‬
‫‪6‬‬

‫‪1‬‬
‫‪7‬‬

‫‪2‬‬

‫‪8‬‬

‫‪3‬‬
‫‪4‬‬
‫‪5‬‬
‫‪9‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫در زبان ‪ C‬برای انتساب چندین عملگر وجود دارد‪ .‬ساده ترین عملگر انتساب‪ ،‬همان عملگر =‬
‫است که در بسیاری از زبانها استفاده می شود‪ .‬بعنوان مثال ‪:‬‬
‫;‪a = 5‬‬
‫;‪b = c + 2 * d‬‬
‫این عملگر باعث می شود که عبارت سمت راست در عبارت سمت چپ قرار گیرد‪.‬‬
‫توجه کنید که مقدار سمت چپ باید عبارتی باشد که بتوان به آن یک مقدار را نسبت داد‬
‫)مانند یک متغیر( که به آن ‪ Lvalue‬گفته می شود‪ ،‬بنابراین یک ثابت نمی تواند در سمت چپ‬
‫قرار گیرد‪.‬‬
‫نکته دیگر اینکه اولویت عملگر = از عملگرهای ریاضی کمتر است و درنتیجه ابتدا آن عملیات‬
‫انجام شده و در پایان حاصل در عبارت سمت چپ ریخته می شود‪.‬‬
‫الزم به ذکر است که در هنگام انتساب‪ ،‬درصورت لزوم نوع عبارت سمت راست به نوع عبارت‬
‫سمت چپ تبدیل می شود‪ .‬مثال‪:‬‬
‫;‪int a‬‬
‫;‪a = 2.5 * 5.0‬‬
‫که دراینصورت عدد ‪ 12‬در ‪ a‬ذخیره خواهد شد‪.‬‬
‫شرکت پذیری این عملگر از راست به چپ می باشد‪ ،‬بدین معنا که چنانچه چندین عملگر‬
‫نسبت دهی داشته باشیم‪ ،‬این عملگرها از راست به چپ محاسبه می شوند‪ .‬مثال پس از‬
‫اجرای دستور زیر‪ ،‬مقدار هر ‪ 3‬متغیر برابر ‪ 10‬خواهد شد‪.‬‬
‫;‪a = b = c = 10‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬

‫نکته جالب درمورد زبان ‪ C‬آنستکه دارای یک سری عملگرهای انتساب‬
‫خالصه شده است که باعث می شوند در بعضی موارد بتوانیم عبارات‬
‫کوتاهتری را بنویسیم‪ .‬این عملگرها عبارتند از ‪:‬‬
‫عملگرد‬

‫مثال‬

‫عبارت انتساب معادل‬

‫‪++‬‬

‫;‪a ++‬‬

‫;‪a = a + 1‬‬

‫‪--‬‬

‫;‪a --‬‬

‫;‪a = a – 1‬‬

‫=‪+‬‬

‫;‪a += 5‬‬

‫;‪a = a + 5‬‬

‫=‪-‬‬

‫;‪a -= 8‬‬

‫;‪a= a – 8‬‬

‫=*‬

‫;‪a *= 10‬‬

‫;‪a= a * 10‬‬

‫=‪/‬‬

‫;‪a /= 2‬‬

‫;‪a = a / 2‬‬

‫=‪%‬‬

‫;‪a %= 10‬‬

‫;‪a = a % 10‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬
‫‪‬‬

‫عملگر اول و دوم‪ ،‬عملگرهای یکانی هستند که بترتیب عملگر افزایش و عملگر کاهش‬
‫نامیده می شوند‪.‬‬
‫نکته جالب آنستکه این دو عملگر به دوصورت مورد استفاده قرار می گیرند‪.‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫در حالتی که از دستور ;‪ a ++‬استفاده شود به آن پس افزایش می گویند و بدین معناست که‬
‫ابتدا از مقدار فعلی ‪ a‬در عبارت موردنظر استفاده کن و سپس آن را افزایش بده‪.‬‬
‫اما دستور ;‪ ++ a‬که به آن پیش افزایش گفته می شود‪ ،‬ابتدا ‪ a‬را افزایش داده و سپس از آن‬
‫در عبارت استفاده می کند‪.‬‬
‫به برنامه زیر دقت کنید‪:‬‬

‫>‪#include ‫{ )(‪void main‬‬
‫; ‪int a ,b‬‬
‫;‪a=5‬‬
‫;‪b = a ++‬‬
‫;)‪printf(“a=%d and b=%d \n”,a,b‬‬
‫;‪a=5‬‬
‫;‪b = ++ a‬‬
‫;)‪printf(“a=%d and b=%d \n”,a,b‬‬
‫}‬
‫‪a=6 b=5‬‬
‫‪a=6 b=6‬‬

‫‪ 7-5-3‬عملگرهای مقایسه ای‬
‫‪‬‬

‫‪‬‬

‫این عملگرها دو عبارت را بایکدیگر مقایسه کرده و نتیجه را باز می گردانند‪.‬‬
‫نتیجه می تواند درست )‪ (true‬یا غلط )‪ (false‬باشد‪.‬‬
‫نتیجه این عملگرها یک عدد صحیح است که درصورت درست بودن ‪ 1‬و‬
‫درصورت غلط بودن ‪ 0‬باز می گردانند‪ .‬این عملگرها عبارتند از‪:‬‬
‫عملگر‬

‫مفهوم عملگر‬

‫مثال‬

‫<‬

‫بزرگتر )<(‬

‫‪a>b‬‬

‫>‬

‫کوچکتر )>(‬

‫‪a
‫=<‬

‫بزرگتر یا مساوی )≤(‬

‫‪a >= b‬‬

‫=>‬

‫کوچکتر یا مساوی )≥(‬

‫‪a <= b‬‬

‫==‬

‫مساوی )=(‬

‫‪a == b‬‬

‫=!‬

‫نامساوی )≠(‬

‫‪a != b‬‬

‫‪ 7-5-3‬عملگرهای مقایسه ای‬
‫‪‬‬

‫‪‬‬

‫نکته مهمی که باید به آن دقت کرد عملگر مساوی )==( است‪ ،‬چرا که یک‬
‫اشتباه بسیار متداول برنامه نویسان ‪ C‬استفاده اشتباه از عملگر انتساب‬
‫)=( بجای عملگر تساوی )==( است که باعث ایجاد خطا در برنامه می‬
‫شود‪.‬‬
‫اولویت این عملگرها از باال به پایین بشرح زیر است‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫عملگرهای <‪ <= ، > ،‬و =>‬
‫عملگرهای == و =!‬

‫الزم بذکر است که در هنگام مساوی بودن اولویت چند عملگر‪ ،‬این عملگرها‬
‫از چپ به راست محاسبه می گردند‪.‬‬

‫‪ 7-5-4‬عملگرهای منطقی‬
‫‪‬‬

‫این عملگرها به شما اجازه می دهند که شرطهای ساده ای را که با‬
‫استفاده از عملگرهای مقایسه ای ایجاد شده اند را با یکدیگر ترکیب نموده‬
‫و شرطهای پیچیده تری را بسازید‪ .‬این عملگرها عبارتند از ‪:‬‬
‫مثال‬

‫عملگر‬

‫مفهوم عملگر‬

‫نحوه کار‬

‫&&‬

‫‪ AND‬منطقی‬

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

‫‪a>0 && sw==1‬‬

‫||‬

‫‪ OR‬منطقی‬

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

‫‪a<=100 || b!=0‬‬

‫!‬

‫‪ NOT‬منطقی‬

‫اگر عملوند درست باشد‪ ،‬نادرست و‬
‫اگر نادرست باشد‪ ،‬درست برمی‬
‫گرداند‪.‬‬

‫)‪! (a==1 || b<10‬‬

‫‪ 7-5-5‬عملگر شرطی‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫گاهی الزم است که ابتدا یک شرط بررسی شده و سپس برمبنای نتیجه )درست یا نادرست بودن آن( یکی‬
‫از دو عبارت ممکن بازگردانده شود‪ .‬برای اینکار می توان از یک عملگر ‪3‬تایی )با ‪ 3‬عملوند( بنام عملگر‬
‫شرطی استفاده نمود‪.‬‬
‫شکل کلی این عملگر بصورت زیر است‪:‬‬
‫>عبارت‪> :<2‬عبارت‪> ?<1‬شرط<‬
‫نحوه کار بدینصورت است که درصورت درست بودن شرط‪ ،‬عبارت‪ 1‬و در غیراینصورت عبارت ‪ 2‬بازگردانده می‬
‫شود‪.‬‬
‫به عنوان مثال به دستور زیر توجه کنید‪:‬‬
‫که این عبارت معادل دستور زیر است‪:‬‬

‫‪‬‬

‫;‪a = (k<10) ? 100 : 50‬‬
‫;‪if (k<10) a=100‬‬
‫;‪else a=50‬‬

‫البته این عبارت به شکلهای پیچیده نیز می تواند مورد استفاده قرار گیرد‪ .‬مثال ‪:‬‬
‫;‪c += (a>0 && a<10) ? ++a : a/b‬‬
‫که معادل است با ‪:‬‬
‫{ )‪if (a>0 && a<10‬‬
‫;‪a= a + 1‬‬
‫;‪c = c + a‬‬
‫}‬
‫;‪else c = c + a/b‬‬

‫‪ 7-5-6‬اولویت عملگرها‬
‫عملگر‬

‫اولویت‬

‫شرکت پذیری‬

‫‪1‬‬

‫)(‬

‫از چپ به راست‬

‫‪2‬‬

‫‪- + ! -- ++‬‬

‫از راست به چپ‬

‫‪3‬‬

‫‪* / %‬‬

‫از چپ به راست‬

‫‪4‬‬

‫‪+ -‬‬

‫از چپ به راست‬

‫‪5‬‬

‫>> <<‬

‫از چپ به راست‬

‫‪6‬‬

‫>= > <= <‬

‫از چپ به راست‬

‫‪7‬‬

‫=! ==‬

‫از چپ به راست‬

‫‪8‬‬

‫&&‬

‫از چپ به راست‬

‫‪9‬‬

‫||‬

‫از چپ به راست‬

‫‪10‬‬

‫‪?:‬‬

‫از راست به چپ‬

‫‪11‬‬

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

‫از راست به چپ‬

‫‪12‬‬

‫‪,‬‬

‫از چپ به راست‬

‫‪ 7-6‬خواندن و نمایش اطالعات‬
‫‪‬‬

‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫همانطور كه قبال نیز گفته شد‪ ،‬یكی از اهداف زبان ‪ C‬قابل حمل بودن آن‬
‫است‪ .‬بهمین منظور سعی شده است كه از دستوراتی كه ممكن است‬
‫وابسته به ماشین خاصی باشد‪ ،‬اجتناب گردد‪.‬‬
‫بهمین دلیل زبان ‪ C‬برخالف سایر زبانها دارای هیچ دستوری برای‬
‫خواندن از ورودی و یا نوشتن در خروجی نیست‪.‬‬
‫اما در عوض دارای تعدادی تابع )زیربرنامه( استاندارد می باشد كه تقریبا‬
‫تمامی كامپایلرها از آنها حمایت می كنند‪.‬‬
‫این كار به كامپایلر این امكان را می دهد كه بر حسب نوع سخت افزار‬
‫موردنظر‪ ،‬توابع ورودی و خروجی را طراحی نماید‪.‬‬
‫این توابع در یك فایل سرآمد بنام ‪ stdio.h‬تعریف شده اند و بنابراین قبل‬
‫ازاینكه بتوانید از این توابع استفاده نمایید‪ ،‬باید این فایل را نیز با استفاده‬
‫از ‪ #include‬در برنامه خود بگنجانید‪.‬‬

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫برای نمایش اطالعات در خروجی از تابع ‪ printf‬استفاده می شود‪.‬‬
‫این تابع رشته موردنظر شما را به خروجی استاندارد )كه در حالت‬
‫عادی همان صفحه نمایش یا مانیتور است( می فرستد‪ .‬شكل كلی این‬
‫تابع بصورت زیر است‪:‬‬
‫; )>لیست متغیرها< ‪> ,‬رشته كنترلی<(‪printf‬‬
‫رشته كنترلی همان متنی است كه قصد چاپ آن را داریم‪ ،‬با ذكر این‬
‫نكته كه در قسمتهایی كه باید مقدار یك متغیر چاپ شود‪ ،‬از یك‬
‫مشخصه تبدیل استفاده می شود‪ .‬هر مشخصه تبدیل از یك عالمت ‪%‬‬
‫بعالوه یك كاراكتر كه نوع متغیر مورد نظر را نشان می دهد تشكیل می‬
‫گردد‪.‬‬
‫لیست متغیرها نیز همان متغیرهایی هستند كه قصد چاپ آنها را داریم‪.‬‬
‫این متغیرها باید بترتیب قرار گرفته و با كاما )‪ (,‬از یكدیگر جدا شوند‪.‬‬

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫مشخصه تبدیل‬

‫مفهوم‬

‫‪%c‬‬

‫كاراكتر‬

‫‪%d‬‬

‫عدد صحیح در مبنای ‪10‬‬

‫‪%f‬‬

‫عدد اعشاری بدون نماد علمی‬

‫‪%e‬‬

‫عدد اعشاری با نماد علمی‬

‫‪%g‬‬

‫عدد اعشاری با حالت كوتاهتر بین ‪ e‬و ‪f‬‬

‫‪%s‬‬

‫رشته‬

‫‪%ld‬‬

‫عدد صحیح بزرگ‬

‫‪%lf %le %lg‬‬

‫عدد اعشاری بزرگ‬

‫‪%o‬‬

‫عدد صحیح در مبنای ‪8‬‬

‫‪%x‬‬

‫عدد صحیحی در مبنای ‪16‬‬

‫‪%u‬‬

‫عدد صحیح بدون عالمت‬

‫ تابع نمایش در خروجی‬7-6-1
#include
void main() {
int age = 20;
floate average = 18.23;
printf("You are %d years old and your average is %f \n",age,average);
}
You are 20 years old and your average is 18.230000

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫‪‬‬
‫‪‬‬

‫برای کنترل نحوه چاپ اعداد می توانید از مشخصه طول میدان استفاده‬
‫کنید‪.‬‬
‫مشخصه طول میدان برای اعداد به شكل زیر استفاده می شود‪:‬‬
‫‪ ‬برای اعداد صحیح از ‪ %nd‬استفاده می كنیم كه ‪ n‬تعداد ارقام را نشان‬
‫می دهد )مثال ‪ .(%3d‬در اینصورت برای هر متغیر ‪ n‬رقم درنظر گرفته‬
‫می شود‪ .‬اگر اندازه عدد از ‪ n‬كوچكتر باشد‪ ،‬به سمت چپ آن فضای‬
‫خالی اضافه می شود و اگر اندازه عدد بیش از ‪ n‬رقم باشد‪ ،‬طول میدان‬
‫نادیده گرفته شده و عدد بطور كامل چاپ می شود‪.‬‬
‫‪ ‬برای اعداد اعشاری از ‪ %n.mf‬استفاده می كنیم كه ‪ n‬اندازه كل عدد‬
‫)شامل عالمت ممیز( و ‪ m‬تعداد ارقام اعشار است )مثال ‪ .(%5.2f‬در‬
‫صورتیكه تعداد ارقام اعشاری عدد موردنظر از ‪ m‬بیشتر باشد‪ ،‬عدد به ‪m‬‬
‫عدد اعشار گرد می شود و در صورتیكه از ‪ m‬كمتر باشد‪ ،‬در سمت‬
‫راست آن ‪ 0‬قرار داده می شود‪.‬‬

‫‪ 7-6-2‬تابع خواندن از ورودی‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای خواندن اطالعات از ورودی از تابع ‪ scanf‬استفاده می شود‪.‬‬
‫این تابع اطالعات را ازورودی استاندارد )معموال صفحه كلید( خوانده و در‬
‫متغیرهای تعیین شده قرار می دهد‪.‬‬
‫شكل كلی این تابع بصورت زیر است‪:‬‬
‫; )>لیست آدرسهای متغیرها< ‪> ,‬رشته كنترلی<(‪scanf‬‬
‫همانطور كه می بینید نحوه احضار تابع ‪ scanf‬نیز مشابه ‪ printf‬است‪ .‬تنها‬
‫تفاوت در آن است كه در ‪ scanf‬باید لیست آدرسهای متغیرها ارسال شود‪.‬‬
‫مبحث مربوط به آدرسها در فصول بعدی بررسی خواهد شد ولی در حال حاضر‬
‫بخاطر بسپارید كه برای بدست آوردن آدرس یك متغیر از عالمت & استفاده می‬
‫كنیم‪ .‬بعنوان مثال ‪ &age‬بمعنای آدرس متغیر ‪ age‬است‪.‬‬
‫بطور كلی در ‪ C‬قدیمی هرگاه كه یك تابع دارای پارامترهای خروجی بود )یعنی‬
‫پارامترهایی كه یك مقدار را باز می گرداندند( از آدرس متغیرها استفاده می‬
‫شد كه امروزه این مسئله وجود ندارد‪.‬‬

‫ تابع خواندن از ورودی‬7-6-2
#include
void main() {
int age;
float average ;
printf("Please enter your age and average : ");
scanf("%d %f",&age,&average);
printf("You are %d years old and your average is %5.2f \n",age,average);
}

Please enter your age and average : 19 16.72
You are 19 years old and your average is 16.72

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫زبان ‪ C++‬یک زبان شی گرا است‪ ،‬بهمین دلیل در این زبان برای ورودی‬
‫و خروجی از اشیاء بجای توابع استفاده می گردد‪.‬‬
‫از آنجا که امروزه معموال برنامه نویسان ‪ C‬از کامپایلرهای ‪ C++‬استفاده‬
‫می کنند‪ ،‬می توانند از اشیای ورودی و خروجی آن نیز استفاده کنند‪.‬‬
‫اینکار در بین بسیاری از برنامه نویسان ‪ C‬متداول است‪ ،‬بهمین دلیل ما‬
‫در اینجا نحوه کار با اشیای خواندن و نوشتن در ‪ C++‬را بطور مقدماتی‬
‫توضیح می دهیم؛ گرچه توضیح کامل این موارد نیاز به آشنایی با شی‬
‫گرایی و زبان ‪ C++‬دارد‪.‬‬
‫قبل از هرچیز الزم به ذکر است که کلیه اشیای مربوط به ورودی و‬
‫خروجی در فایل سرآمدی بنام ‪ iostream.h‬تعیریف شده اند‪ ،‬بنابراین‬
‫ابتدا باید این فایل به برنامه توسط دستور ‪ #include‬الحاق گردد‪.‬‬

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫زبان ‪ C++‬برای نمایش اطالعات از یک شیئ بنام ‪ cout‬استفاده می نماید‪.‬‬
‫برای ارسال اطالعات مورد نظر برای چاپ به ‪ cout‬باید از عملگر درج در جریان‬
‫یا >> استفاده نماییم‪ .‬بعنوان مثال ‪:‬‬
‫; ” ‪cout >> “Please enter your name:‬‬
‫و یا مثال دیگر ‪:‬‬
‫;‪int a = 10‬‬
‫;‪float b = 2.86‬‬
‫;‪cout << a‬‬
‫;‪cout << b‬‬
‫نکته جالبی که در این مثالها دیده می شود‪ ،‬آنستکه برخالف تابع ‪ printf‬هیچ‬
‫نیازی به مشخص کردن نوع متغیری که قصد چاپ آن را داریم نیست و خود‬
‫شئ ‪ cout‬نوع آن را تشخیص می دهد‪.‬‬
‫عالوه براین می توان چندین عملگر درج در جریان را با یکدیگر الحاق کرد و‬
‫چندین متغیر را با یک دستور چاپ کرد‪.‬‬

C++ ‫ ورودی و خروجی اطالعات در‬7-6-3
#include
void main() {
int age = 20;
floate average = 18.23;
cout >> “You are ” >> age >> “ years old and your average is ” >> average ;
}

You are 20 years old and your average is 18.230000

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای دریافت اطالعات از کاربر‪ ،‬از شئ دیگری بنام ‪ cin‬استفاده می شود‪.‬‬
‫برای ارسال متغیر مورد نظر به ‪ cin‬باید از عملگر استخراج از جریان یا <<‬
‫استفاده نماییم‪ .‬بعنوان مثال‪:‬‬
‫;‪int a‬‬
‫;‪cin >> a‬‬
‫بازهم همانطور که می بینید نیازی به تعیین نوع متغیر موردنظر نیست و خود‬
‫شئ ‪ cin‬نوع متغیر را بطور اتوماتیک تشخیص داده و داده ای از همان نوع را از‬
‫کاربر دریافت و در متغیر مورد نظر قرار می دهد‪.‬‬
‫عملگرهای استخراج از جریان را نیز می توان با یکدیگر الحاق کرد‪.‬‬
‫برای رفتن به خط بعد در شئ ‪ cout‬می توان از دستکاری کننده ‪ endl‬استفاده‬
‫کرد‪ .‬مثال در دستور زیر پس از چاپ پیغام‪ ،‬مکان نما به خط بعد منتقل می‬
‫شود‪:‬‬
‫;‪cout >> “List of students : “ >> endl‬‬
‫البته دستکاری کننده های متعدد دیگری نیز ازجمله موارد مربوط به تعیین طول‬
‫میدان و نحوه چاپ مقادیر وجود دارد که توضیح آنها نیاز به یک مبحث مستقل‬
‫دارد‪.‬‬

C++ ‫ ورودی و خروجی اطالعات در‬7-6-3
#include
void main() {
int age;
float average ;
cout << "Please enter your age and average : " ;
cin >> age >> average ;
cout << "You are " << age << "years old and your average is " << average;
}

Please enter your age and average : 19 16.72
You are 19 years old and your average is 16.72

‫‪ 7-7‬توابع کتابخانه ای‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫همانطور که قبال نیز گفته شد‪ ،‬زبان ‪ C‬از زیر برنامه ها نیز حمایت می کند‪ .‬هر زیر برنامه‬
‫در ‪ C‬یک تابع نامیده می شود‪ .‬تا کنون با توابعی همچون ‪ main‬و یا ‪ printf‬و ‪ scanf‬آشنا‬
‫شده ایم‪.‬‬
‫معموال عرضه کنندگان کامپایلرها و یا سایر فروشندگان نرم افزار‪ ،‬برخی از توابع عمومی‬
‫را که ممکن است مورد نیاز جمع کثیری از برنامه نویسان مختلف باشد را در قالب‬
‫کتابخانه ای از توابع در اختیار برنامه نویسان می گذارند‪ .‬بعضی از این توابع کتابخانه ای‬
‫مانند ‪ printf‬و ‪ scanf‬بصورت استاندارد درآمده و توسط عرضه کنندگان مختلف ارائه می‬
‫شوند‪.‬‬
‫در کامپایلر عرضه شده توسط شرکت بورلند )‪ (Borland C++ 3.1‬نیز کتابخانه های‬
‫متعددی از توابع برای شما عرضه شده اند که بتدریج با آنها و کاربردشان آشنا خواهید‬
‫شد‪.‬‬
‫نکته مهم آنستکه برای استفاده از این توابع ابتدا باید فایل سرآمد مربوط به آنها را نیز در‬
‫ابتدای برنامه خود اضافه نمایید ) با استفاده از ‪ .(#include‬هر فایل سرآمد شامل تعاریف‬
‫اولیه گروهی از توابع مرتبط با هم و داده های مربوط به آنها بوده و در استاندارد قدیمی‬
‫تر دارای پسوند ‪ .h‬می باشد)در استاندارد جدید پسوند این فایلها حذف شده است(‪.‬‬
‫برخی از این فایلهای سرآمد عبارتند از‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪ : stdio.h‬توابع ورودی و خروجی استاندارد‬
‫‪ : math.h‬توابع ریاضی‬
‫‪ : graphics.h‬توابع مربوط به عملیات گرافیکی‬
‫‪ : string.h‬توابع مربوط به کار با رشته ها‬


Slide 5

‫مبانی کامپیوتر و برنامه سازی‬
‫فصل هفتم ‪ :‬مفاهیم اولیه زبان ‪C‬‬
‫مدرس ‪ :‬نگین معروفی‬

‫‪ 7-1‬شناسه ها در ‪C‬‬
‫‪‬‬
‫‪‬‬

‫شناسه )‪ (identifier‬نامی است که به یک قسمت از برنامه مانند متغیر‪ ،‬تابع‪ ،‬ثابت و یا‬
‫‪ ...‬داده می شود‪.‬‬
‫در زبان ‪ C‬برای انتخاب شناسه ها فقط می توان از عالئم زیر استفاده کرد‪:‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫حروف انگلیسی کوچک و بزرگ )‪(A…Z a…z‬‬
‫ارقام )‪(0…9‬‬
‫عالمت خط پایین یا _‬

‫البته یک شناسه نمی تواند با یک رقم شروع شود‪.‬‬
‫چند شناسه مجاز‪ name2 ، average ، sum :‬و ‪student_average‬‬
‫چند شناسه غیرمجاز ‪ 2name‬و یا ‪student average‬‬
‫در برنامه نویسی امروزی پیشنهاد می شود بجای شناسه هایی همانند‬
‫‪ student_average‬از ‪ studentAverage‬استفاده گردد‪.‬‬
‫نکته مهم دیگری که باید به آن اشاره کرد آنستکه زبان ‪ C‬برخالف بسیاری از زبانهای دیگر‬
‫به کوچک و بزرگی حروف حساس است )‪ .(case sensitive‬در نتیجه شناسه های زیر با‬
‫یکدیگر متفاوتند ‪:‬‬
‫‪Sum ≠ sum ≠ SUM‬‬
‫آخرین نکته اینستکه در هنگام انتخاب شناسه نمی توانید از کلمات کلیدی که برای‬
‫منظورهای خاص در زبان ‪ C‬رزرو شده اند استفاده کنید‪.‬‬

C ‫ شناسه ها در‬7-1
: C ‫کلمات کلیدی در زبان‬
auto

break

case

char

const

continue

default

do

double

else

enum

extern

float

for

goto

if

int

long

register

return

short

signed

sizeof

static

struct

switch

typedef

union

unsigned

void

volatile

while

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫محدوده‬

‫اندازه )بیت(‬

‫توضیح‬

‫نوع داده‬

‫‪-128 to +127‬‬

‫‪8‬‬

‫کاراکتر‬

‫‪char‬‬

‫‪-32768 to +32767‬‬

‫‪16‬‬

‫عدد صحیح‬

‫‪int‬‬

‫‪3.4e-38 to 3.4e+38‬‬

‫‪32‬‬

‫عدد اعشاری‬

‫‪float‬‬

‫‪1.7e-308 to 1.7e+308‬‬

‫‪64‬‬

‫عدد اعشاری با‬
‫دقت مضاعف‬

‫‪double‬‬

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫‪‬‬

‫البته چند نکته مهم درمورد این جدول قابل ذکر است ‪:‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫اندازه ‪ int‬در محیطهای ‪ 16‬بیتی مانند ‪ DOS‬برابر ‪ 16‬بیت است‪ .‬اما در‬
‫محیطهای ‪ 32‬بیتی همانند ‪ Windows‬اندازه آن ‪ 32‬بیت می باشد که در‬
‫اینصورت محدوده ای برابر ‪ -2,147,483,648‬تا ‪ +2,147,483,647‬را‬
‫پوشش می دهد‪.‬‬
‫در بعضی از کامپایلرهای ‪ ،C‬نوع داده ‪ bool‬نیز وجود دارد که می تواند‬
‫یکی از مقادیر ‪)true‬درست( یا ‪) false‬غلط( را نشان دهد ‪ .‬اما در نسخه‬
‫های اولیه ‪ C‬از همان نوع داده صحیح یا ‪ int‬برای اینکار استفاده می‬
‫شد‪ .‬بدین صورت که ‪ 0‬نشاندهنده ‪ false‬و هر عدد غیر صفر )معموال ‪(1‬‬
‫نشاندهنده ‪ true‬است‪.‬‬
‫از آنجا که برای ذخیره سازی کاراکترها کد اسکی آنها ذخیره می گردد‪،‬‬
‫از یک متغیر کاراکتری یا ‪ char‬می توان بعنوان یک عدد صحیح کوچک نیز‬
‫استفاده کرد و اعمال ریاضی برروی آنها نیز مجاز است‪.‬‬

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫عالوه براین چندین اصالح کننده نیز وجود دارد که به ما اجازه می دهد نوع داده مورد‬
‫نظر را با دقت بیشتری برای نیازهای مختلف استفاده نماییم‪.‬‬
‫این اصالح کننده ها عبارتند از ‪short, long, signed, unsigned :‬‬
‫تمام این اصالح کننده ها می توانند به نوع داده ‪ int‬اعمال شوند و اثر آنها بستگی‬
‫به محیط دارد‪.‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫در یک محیط ‪16‬بیتی‪short int ،‬بازهم برابر ‪16‬بیت است ولی ‪ long int‬برابر‪32‬بیت می‬
‫باشد‪.‬‬
‫‪ unsigned int‬باعث می شود که یک عدد ‪ 16‬بیتی بدون عالمت داشته باشیم که بازه‬
‫بین ‪ 0‬تا ‪ 65535‬را پوشش می دهد‪ signed int .‬نیز همانند ‪ int‬معمولی بوده و تفاوتی‬
‫ندارد‪.‬‬
‫ترکیب این اصالح کننده ها نیز ممکن است‪ .‬مثال ‪ unsigned long int‬یک عدد ‪ 32‬بیتی‬
‫بدون عالمت است که بازه ‪ 0‬تا ‪ 4,294,967,295‬را پوشش می دهد‪.‬‬

‫برروی نوع داده ‪ char‬فقط اصالح کننده های ‪ signed‬و ‪ unsigned‬را می توان اعمال‬
‫کرد‪ .‬معموال از اصالح کننده ‪ unsigned‬وقتی استفاده می شود که قصد داشته‬
‫باشیم از ‪ char‬بعنوان یک عدد صحیح مثبت بین ‪ 0‬تا ‪ 255‬استفاده کنیم‪.‬‬
‫برروی نوع داده ‪ double‬تنها اصالح کننده ‪ long‬قابل اعمال است و دراینصورت عدد‬
‫اعشاری با ‪ 80‬بیت را خواهیم داشت که قادر است هر عددی در بازه ‪ 3.4e-4932‬تا‬
‫‪ 1.1e+4932‬را در خود نگاه دارد‪.‬‬

‫‪ 7-3‬تعریف متغیرها‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای تعریف متغیرها به شکل زیر عمل می کنیم‪:‬‬

‫;>‪ ‫که ‪ type‬یکی از نوع داده های گفته شده و ‪ variable-list‬لیستی از متغیرها است‬
‫که با کاما از یکدیگر جدا شده اند‪ .‬بعنوان مثال ‪:‬‬
‫;‪int sum‬‬
‫;‪float average‬‬
‫; ‪long int a, b, c‬‬
‫; ‪unsigned long int i, j, k‬‬
‫عالوه براین می توان در هنگام تعریف متغیر به آن مقدار اولیه نیز داد‪ .‬مثال ‪:‬‬
‫; ‪int d = 0‬‬
‫نكته مهم آنكه زبان ‪ C‬به متغیرها مقدار اولیه نمي دهد )حتي ‪ (0‬و برنامه نويس‬
‫خود بايد اينكار را صريحا انجام دهد‪ ،‬درغیر اينصورت مقدار اولیه متغیر‪ ،‬نامعین خواهد‬
‫بود‪.‬‬
‫تعریف متغیرها طبق اصول زبان ‪ C‬میتواند درهرجایی از برنامه صورت پذیرد‪ ،‬و‬
‫متغیرهای تعریف شده از همان خط به بعد قابل استفاده خواهد بود‪ .‬اما معموال‬
‫توصیه می گردد كه تعریف متغیرها در همان خط ابتدایی تابع و بالفاصله پس از {‬
‫صورت پذیرد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫‪‬‬
‫‪‬‬

‫ثابتها مقادیر ثابتی هستند كه مقدار آنها در حین اجرای برنامه تغییر نمی یابد‪ .‬ثابتها می توانند از‬
‫هریك از نوع داده های اصلی باشند‪.‬‬
‫ثوابت عددی صحیح ‪:‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫برای نمایش این دسته از ثوابت‪ ،‬از دنباله ای از ارقام بعالوه عالمت ‪ +‬یا ‪ -‬استفاده می كنیم‪ .‬بعنوان مثال‬
‫‪ -45‬و یا ‪ 3489‬ثوابت صحیح هستند‪.‬‬
‫در حالت عادی ‪ C‬هر عدد را در كوچكترین نوع داده ای كه می تواند قرار می دهد‪ .‬مثال عدد ‪ 85‬در یك‬
‫‪ int‬قرار می گیرد‪ ،‬اما عدد ‪ 145398‬در یك ‪ long int‬قرار خواهد گرفت‪.‬‬
‫اگر قصد دارید یك عدد كوچك بعنوان ‪ long‬محسوب گردد‪ ،‬می توانید از پسوند ‪ L‬در انتهای آن استفاده‬
‫می كنیم‪ .‬مثال ‪245L‬یك عدد ‪ long‬محسوب می شود‪.‬‬
‫;‪long int a = 20L‬‬
‫پسوند ‪ U‬در انتهای عدد نیز نشانه بدون عالمت بودن آن است‪.‬‬
‫نكته دیگر آنكه ‪ C‬به شما اجازه می دهد درصورت لزوم ثوابت صحیح خود را در مبنای ‪ 8‬یا ‪ 16‬نیز كه‬
‫از مبناهای متداول در برنامه نویسی هستند‪ ،‬بنویسید‪.‬‬
‫‪‬‬
‫‪‬‬

‫برای نوشتن عدد در مبنای ‪ 8‬باید آن را با ‪ 0‬آغاز كنید‪ ،‬مثال ‪ 0342‬یك عدد در منای ‪ 8‬محسوب می‬
‫گردد‪.‬‬
‫برای نوشتن یك عدد در مبنای ‪ 16‬باید آن را با ‪ 0x‬آغاز نمایید‪ ،‬مانند ‪.0x27A4‬‬

‫‪ 7-4‬ثوابت‬
‫ثوابت عددی اعشاری‬

‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫برای نمایش اعداد اعشاری‪ ،‬باید از نقطه اعشار استفاده كنیم‪ ،‬مانند ‪237.45‬‬
‫اما نكته جالب آنستكه می توانید از نماد علمی نیز برای نمایش اعداد‬
‫اعشاری استفاده كنید‪ .‬برای اینكار كافی است از حرف ‪ e‬برای نمایش قسمت‬
‫توان استفاده نمایید‪ .‬بعنوان مثال ‪:‬‬
‫‪-23.47 × 10 5 = -23.47e5‬‬
‫‪42.389 × 10 -3 = 42.389e-3‬‬
‫دقت كنید كه قسمت توان‪ ،‬حتما یك عدد صحیح است‪.‬‬
‫نكته جالب اینجاست كه برخالف مورد قبل‪ ،‬كامپایلر بطور پیش فرض داده های‬
‫اعشاری را از نوع ‪ double‬فرض می كند‪.‬چنانچه دوست دارید ثابت شما ازنوع‬
‫‪ float‬درنظر گرفته شود‪ ،‬در انتهای آن ‪ F‬قرار دهید‪ .‬ضمنا پسوند ‪ L‬نیز داده‬
‫اعشاری را از نوع ‪ long double‬درنظر می گیرد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫ثوابت كاراكتری ‪:‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫برای نشان دادن ثوابت كاراكتری‪ ،‬آنها را در داخل ' قرار می دهیم‪ .‬بعنوان مثال‬
‫'‪'A‬یك ثابت كاراكتری است‪.‬‬
‫; '‪char ch = 'S‬‬
‫دقت كنید كه همانطور كه قبال گفته شد‪ ،‬كد اسكی كاراكترها در متغیر ذخیره‬
‫می گردد‪ ،‬بنابراین می توان از آن بعنوان یك عدد صحیح نیز استفاده كرد‪ .‬نكته‬
‫مهم دیگر آنستكه به تفاوت عدد ‪ 5‬و كاراكتر '‪ '5‬دقت داشته باشید‪ .‬در حقیقت‬
‫'‪ '5‬برابر است با عدد ‪ 53‬كه همان كد اسكی آن است‪.‬‬
‫روش فوق‪ ،‬برای نمایش کاراکترهای قابل چاپ مناسب است‪ ،‬اما بعضی‬
‫كاراكترها مانند ‪ enter‬قابل نمایش نبوده و برای آنها شکل خاصی وجود ندارد‪.‬‬
‫در چنین مواردی‪ ،‬زبان ‪ C‬از ترکیب عالمت \ به همراه یک کاراکتر دیگر‪ ،‬برای‬
‫نمایش این قبیل کاراکترها استفاده می نماید‪ .‬بعنوان مثال‪ ،‬کاراکتر '‪ '\n‬نشان‬
‫دهنده خط جدید یا همان ‪ enter‬می باشد‪.‬‬
‫جدول صفحه بعد این قبیل کاراکترها و معادل آنها را نشان می دهد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫نحوه نمایش در ‪C‬‬

‫کد اسکی‬

‫صدای بوق کامپیوتر‬

‫‪\a‬‬

‫‪7‬‬

‫حرکت به عقب ‪backspace‬‬

‫‪\b‬‬

‫‪8‬‬

‫شروع صفحه ‪form feed‬‬

‫‪\f‬‬

‫‪12‬‬

‫سطر جدید ‪line feed‬‬

‫‪\n‬‬

‫‪10‬‬

‫برگشت به ابتداي سطر ‪carriage return‬‬

‫‪\r‬‬

‫‪13‬‬

‫فاصله افقی ‪horizontal tab‬‬

‫‪\t‬‬

‫‪9‬‬

‫فاصله عمودی ‪vertical tab‬‬

‫‪\v‬‬

‫‪11‬‬

‫عالمت سوال‬

‫?\‬

‫‪63‬‬

‫عالمت '‬

‫'\‬

‫‪39‬‬

‫عالمت "‬

‫"\‬

‫‪34‬‬

‫عالمت \‬

‫\\‬

‫‪92‬‬

‫عالمت تهی‬

‫‪\0‬‬

‫‪0‬‬

‫نام کاراکتر‬

‫کد اسکی یک کاراکتر با ‪ 3‬رقم در مبنای ‪8‬‬

‫‪\000‬‬

‫کد اسکی یک کاراکتر با ‪ 2‬رقم در مبنای ‪16‬‬

‫‪\x00‬‬

‫‪ 7-4‬ثوابت‬
‫‪‬‬

‫ثوابت رشته ای ‪ C :‬عالوه بر ثوابت فوق‪ ،‬از یك ثابت دیگر بنام رشته نیز‬
‫حمایت می كند‪ .‬رشته‪ ،‬دنباله ای از كاراكترها است كه در داخل " قرار‬
‫می گیرند‪ .‬بعنوان مثال "‪ "this is a test‬یك رشته است‪ .‬دقت كنید كه '‪'a‬‬
‫یك كاراكتر است‪ ،‬اما "‪ "a‬یك رشته است كه فقط شامل یك كاراكتر می‬
‫باشد‪.‬‬

‫‪ 7-5‬عملگرها‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫عملگر‪ ،‬نمادی است كه به كامپایلر می گوید تا عملیات محاسباتی یا‬
‫منطقی خاصی را برروی یك یا چند عملوند‪ ،‬انجام دهد‪.‬‬
‫به عملگرهایی كه فقط یك عملوند دارند‪ ،‬عملگر یكانی می گوییم و‬
‫همواره عملگر در سمت چپ عملوند قرار می گیرد)مانند عدد ‪.(-125‬‬
‫اما عملگرهایی كه برروی دو عملوند اثر می كنند را عملگر دودویی‬
‫نامیده و عملگر را بین دو عملوند قرار می دهیم )مانند ‪.(23+86‬‬
‫هر ترکیب درستی از عملگرها و عملوندها را یک عبارت می نامیم‪.‬‬
‫‪ C‬از نقطه نظر عملگرها یك زبان بسیار قوی است‪ .‬این عملگرها به چند‬
‫دسته اصلی تقسیم می گردند كه آنها را به ترتیب بررسی می كنیم‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫این عملگرها‪ ،‬همان اعمال متداول ریاضی هستند كه در زبان ‪ C‬مورد استفاده‬
‫قرار می گیرند‪ .‬این اعمال عبارتند از ‪:‬‬

‫عمل‬

‫نوع‬

‫عملگر‬

‫منفی كردن عملوند سمت راست‬

‫یكانی‬

‫‪-‬‬

‫جمع دو عملوند‬

‫دودویی‬

‫‪+‬‬

‫تفریق دو عملوند‬

‫دودویی‬

‫‪-‬‬

‫ضرب دو عملوند‬

‫دودویی‬

‫*‬

‫تقسیم دو عملوند‬

‫دودویی‬

‫‪/‬‬

‫محاسبه باقیمانده تقسیم دو عملوند‬

‫دودویی‬

‫‪%‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬
‫‪‬‬

‫این عملگرهای برروی همه انواع داده های ‪ C‬عمل می كنند‪ ،‬بجز عملگر ‪ %‬كه فقط‬
‫برروی نوع داده های صحیح عمل می كند‪.‬‬
‫اما نكته مهمی كه باید به آن اشاره كرد‪ ،‬نحوه كار عملگر تقسیم برروی نوع داده های‬
‫مختلف است‪.‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫درصورتیكه هردو عملوند صحیح باشند‪ ،‬تقسیم بصورت صحیح بر صحیح انجام خواهد شد‪.‬‬
‫اگر یكی یا هر دو عملوند اعشاری باشند‪ ،‬تقسیم بصورت اعشاری انجام خواهد پذیرفت‪.‬‬
‫فرض كنید تعاریف زیر را داریم ‪:‬‬
‫; ‪int a,b‬‬
‫; ‪float c,d‬‬
‫; ‪a = 10 ; b = 4‬‬
‫;‪c = 8.2; d = 4.0‬‬
‫اكنون به نتایج عملیات زیر دقت كنید ‪:‬‬
‫‪a / b => 2‬‬
‫‪c / d => 2.05‬‬
‫‪a / d => 2.5‬‬
‫‪a / 4 => 2‬‬
‫چنانچه به آخرین مورد توجه كنید‪ ،‬متوجه می شوید كه از آنجا كه ‪a‬یك متغیر صحیح است و ‪4‬‬
‫نیز یك ثابت صحیح در نظر گرفته شده‪ ،‬درنتیجه تقسیم بصورت صحیح بر صحیح انجام گرفته‬
‫است‪ .‬چنانچه بخواهیم تقسیم بصورت اعشاری صورت پذیرد‪ ،‬به دو شكل می توانیم عمل‬
‫كنیم‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫برای اینکه عبارت تقسیم صفحه قبل بصورت اعشاری انجام شود‪ ،‬به دو روش‬
‫می توان عمل کرد‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫این عبارت را بصورت ‪ a / 4.0‬بنویسیم‪.‬‬
‫از عملگر قالب ریزی استفاده كنیم‪.‬‬

‫عملگر قالب ریزی می تواند یك نوع را به نوع دیگری تبدیل نماید‪ .‬شكل كلی آن‬
‫به شكل زیر است ‪:‬‬
‫>‪() ‫كه ‪ type‬نوع مورد نظر است كه قصد تبدیل عبارت ‪ expression‬به آن نوع را‬
‫داریم‪ .‬بعنوان مثال در مورد قبلی می توان به شكل زیر عمل كرد ‪:‬‬
‫‪(float) a / 4‬‬
‫در این حالت از كامپایلر خواسته ایم كه ابتدا عدد ‪ a‬را به اعشاری تبدیل كند‬
‫)البته بصورت موقت( و سپس آن را بر ‪ 4‬تقسیم نماید‪ ،‬كه مسلما حاصل‬
‫اعشاری خواهد بود‪.‬‬
‫بطوركلی هرگاه ثابتها و متغیرهایی از انواع مختلف در یك عبارت محاسباتی‬
‫داشته باشیم‪ ،‬كامپایلر ‪ C‬همه آنها را به یك نوع یكسان كه همان بزرگترین‬
‫عملوند موجود است تبدیل خواهد كرد‪ .‬بعنوان مثال به مورد صفحه بعد دقت‬
‫كنید ‪:‬‬

‫ عملگرهای محاسباتی‬7-5-1
char ch;
int i;

float f;
double d;
result = (ch / i)
int

+

(f *d)

(f+i)
float

double

double

int

-

double

double

float

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫اولویت عملگرها ‪ :‬در عبارتی که شامل چندین عملگر است‪ ،‬کدامیک در‬
‫ابتدا اعمال خواهد گردید‪.‬‬
‫اولویت عملگرهای محاسباتی از باال به پایین بشرح زیر است‪:‬‬
‫‪ ‬عملگر یکانی –‬
‫‪ ‬عملگرهای * و ‪ /‬و ‪%‬‬
‫‪ ‬عملگرهای ‪ +‬و –‬
‫چنانچه اولویت دو عملگر یکسان باشد‪ ،‬این عملگرها از چپ به راست‬
‫محاسبه خواهند شد‪.‬‬
‫چنانچه بخواهیم یک عمل با اولویت پایین زودتر انجام شود‪ ،‬باید از پرانتز‬
‫استفاده کنیم‪ .‬بنابراین اولویت عملگر پرانتز از همه موارد فوق‬
‫بیشتراست‪ .‬در مورد پرانتزهای متداخل‪ ،‬ابتدا پرانتز داخلی محاسبه‬
‫می شود؛ اما در مورد پرانتزهای هم سطح‪ ،‬ابتدا پرانتز سمت چپتر‬
‫محاسبه می گردد‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫چند مثال در مورد اولویت عملگرها‬

‫ترتیب اجرای عملگرها‬

‫عبارت زبان ‪C‬‬

‫ابتدا عمل * و سپس عمل ‪+‬‬

‫‪b+c*d‬‬

‫ابتدا عمل ‪ +‬و سپس عمل *‬

‫‪(b + c) * d‬‬

‫ابتدا عمل ‪ /‬سپس عمل * و در انتها عمل ‪+‬‬

‫‪b+c/d*e‬‬

‫ابتدا عمل * سپس عمل ‪ /‬و در انتها عمل ‪+‬‬

‫)‪b + c / (d * e‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫یک مثال کامل در مورد اولویت عملگرها‬

‫‪result = a + b * (f – (g + b) / d) – c * (a – d) / e‬‬
‫‪6‬‬

‫‪1‬‬
‫‪7‬‬

‫‪2‬‬

‫‪8‬‬

‫‪3‬‬
‫‪4‬‬
‫‪5‬‬
‫‪9‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫در زبان ‪ C‬برای انتساب چندین عملگر وجود دارد‪ .‬ساده ترین عملگر انتساب‪ ،‬همان عملگر =‬
‫است که در بسیاری از زبانها استفاده می شود‪ .‬بعنوان مثال ‪:‬‬
‫;‪a = 5‬‬
‫;‪b = c + 2 * d‬‬
‫این عملگر باعث می شود که عبارت سمت راست در عبارت سمت چپ قرار گیرد‪.‬‬
‫توجه کنید که مقدار سمت چپ باید عبارتی باشد که بتوان به آن یک مقدار را نسبت داد‬
‫)مانند یک متغیر( که به آن ‪ Lvalue‬گفته می شود‪ ،‬بنابراین یک ثابت نمی تواند در سمت چپ‬
‫قرار گیرد‪.‬‬
‫نکته دیگر اینکه اولویت عملگر = از عملگرهای ریاضی کمتر است و درنتیجه ابتدا آن عملیات‬
‫انجام شده و در پایان حاصل در عبارت سمت چپ ریخته می شود‪.‬‬
‫الزم به ذکر است که در هنگام انتساب‪ ،‬درصورت لزوم نوع عبارت سمت راست به نوع عبارت‬
‫سمت چپ تبدیل می شود‪ .‬مثال‪:‬‬
‫;‪int a‬‬
‫;‪a = 2.5 * 5.0‬‬
‫که دراینصورت عدد ‪ 12‬در ‪ a‬ذخیره خواهد شد‪.‬‬
‫شرکت پذیری این عملگر از راست به چپ می باشد‪ ،‬بدین معنا که چنانچه چندین عملگر‬
‫نسبت دهی داشته باشیم‪ ،‬این عملگرها از راست به چپ محاسبه می شوند‪ .‬مثال پس از‬
‫اجرای دستور زیر‪ ،‬مقدار هر ‪ 3‬متغیر برابر ‪ 10‬خواهد شد‪.‬‬
‫;‪a = b = c = 10‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬

‫نکته جالب درمورد زبان ‪ C‬آنستکه دارای یک سری عملگرهای انتساب‬
‫خالصه شده است که باعث می شوند در بعضی موارد بتوانیم عبارات‬
‫کوتاهتری را بنویسیم‪ .‬این عملگرها عبارتند از ‪:‬‬
‫عملگرد‬

‫مثال‬

‫عبارت انتساب معادل‬

‫‪++‬‬

‫;‪a ++‬‬

‫;‪a = a + 1‬‬

‫‪--‬‬

‫;‪a --‬‬

‫;‪a = a – 1‬‬

‫=‪+‬‬

‫;‪a += 5‬‬

‫;‪a = a + 5‬‬

‫=‪-‬‬

‫;‪a -= 8‬‬

‫;‪a= a – 8‬‬

‫=*‬

‫;‪a *= 10‬‬

‫;‪a= a * 10‬‬

‫=‪/‬‬

‫;‪a /= 2‬‬

‫;‪a = a / 2‬‬

‫=‪%‬‬

‫;‪a %= 10‬‬

‫;‪a = a % 10‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬
‫‪‬‬

‫عملگر اول و دوم‪ ،‬عملگرهای یکانی هستند که بترتیب عملگر افزایش و عملگر کاهش‬
‫نامیده می شوند‪.‬‬
‫نکته جالب آنستکه این دو عملگر به دوصورت مورد استفاده قرار می گیرند‪.‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫در حالتی که از دستور ;‪ a ++‬استفاده شود به آن پس افزایش می گویند و بدین معناست که‬
‫ابتدا از مقدار فعلی ‪ a‬در عبارت موردنظر استفاده کن و سپس آن را افزایش بده‪.‬‬
‫اما دستور ;‪ ++ a‬که به آن پیش افزایش گفته می شود‪ ،‬ابتدا ‪ a‬را افزایش داده و سپس از آن‬
‫در عبارت استفاده می کند‪.‬‬
‫به برنامه زیر دقت کنید‪:‬‬

‫>‪#include ‫{ )(‪void main‬‬
‫; ‪int a ,b‬‬
‫;‪a=5‬‬
‫;‪b = a ++‬‬
‫;)‪printf(“a=%d and b=%d \n”,a,b‬‬
‫;‪a=5‬‬
‫;‪b = ++ a‬‬
‫;)‪printf(“a=%d and b=%d \n”,a,b‬‬
‫}‬
‫‪a=6 b=5‬‬
‫‪a=6 b=6‬‬

‫‪ 7-5-3‬عملگرهای مقایسه ای‬
‫‪‬‬

‫‪‬‬

‫این عملگرها دو عبارت را بایکدیگر مقایسه کرده و نتیجه را باز می گردانند‪.‬‬
‫نتیجه می تواند درست )‪ (true‬یا غلط )‪ (false‬باشد‪.‬‬
‫نتیجه این عملگرها یک عدد صحیح است که درصورت درست بودن ‪ 1‬و‬
‫درصورت غلط بودن ‪ 0‬باز می گردانند‪ .‬این عملگرها عبارتند از‪:‬‬
‫عملگر‬

‫مفهوم عملگر‬

‫مثال‬

‫<‬

‫بزرگتر )<(‬

‫‪a>b‬‬

‫>‬

‫کوچکتر )>(‬

‫‪a
‫=<‬

‫بزرگتر یا مساوی )≤(‬

‫‪a >= b‬‬

‫=>‬

‫کوچکتر یا مساوی )≥(‬

‫‪a <= b‬‬

‫==‬

‫مساوی )=(‬

‫‪a == b‬‬

‫=!‬

‫نامساوی )≠(‬

‫‪a != b‬‬

‫‪ 7-5-3‬عملگرهای مقایسه ای‬
‫‪‬‬

‫‪‬‬

‫نکته مهمی که باید به آن دقت کرد عملگر مساوی )==( است‪ ،‬چرا که یک‬
‫اشتباه بسیار متداول برنامه نویسان ‪ C‬استفاده اشتباه از عملگر انتساب‬
‫)=( بجای عملگر تساوی )==( است که باعث ایجاد خطا در برنامه می‬
‫شود‪.‬‬
‫اولویت این عملگرها از باال به پایین بشرح زیر است‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫عملگرهای <‪ <= ، > ،‬و =>‬
‫عملگرهای == و =!‬

‫الزم بذکر است که در هنگام مساوی بودن اولویت چند عملگر‪ ،‬این عملگرها‬
‫از چپ به راست محاسبه می گردند‪.‬‬

‫‪ 7-5-4‬عملگرهای منطقی‬
‫‪‬‬

‫این عملگرها به شما اجازه می دهند که شرطهای ساده ای را که با‬
‫استفاده از عملگرهای مقایسه ای ایجاد شده اند را با یکدیگر ترکیب نموده‬
‫و شرطهای پیچیده تری را بسازید‪ .‬این عملگرها عبارتند از ‪:‬‬
‫مثال‬

‫عملگر‬

‫مفهوم عملگر‬

‫نحوه کار‬

‫&&‬

‫‪ AND‬منطقی‬

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

‫‪a>0 && sw==1‬‬

‫||‬

‫‪ OR‬منطقی‬

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

‫‪a<=100 || b!=0‬‬

‫!‬

‫‪ NOT‬منطقی‬

‫اگر عملوند درست باشد‪ ،‬نادرست و‬
‫اگر نادرست باشد‪ ،‬درست برمی‬
‫گرداند‪.‬‬

‫)‪! (a==1 || b<10‬‬

‫‪ 7-5-5‬عملگر شرطی‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫گاهی الزم است که ابتدا یک شرط بررسی شده و سپس برمبنای نتیجه )درست یا نادرست بودن آن( یکی‬
‫از دو عبارت ممکن بازگردانده شود‪ .‬برای اینکار می توان از یک عملگر ‪3‬تایی )با ‪ 3‬عملوند( بنام عملگر‬
‫شرطی استفاده نمود‪.‬‬
‫شکل کلی این عملگر بصورت زیر است‪:‬‬
‫>عبارت‪> :<2‬عبارت‪> ?<1‬شرط<‬
‫نحوه کار بدینصورت است که درصورت درست بودن شرط‪ ،‬عبارت‪ 1‬و در غیراینصورت عبارت ‪ 2‬بازگردانده می‬
‫شود‪.‬‬
‫به عنوان مثال به دستور زیر توجه کنید‪:‬‬
‫که این عبارت معادل دستور زیر است‪:‬‬

‫‪‬‬

‫;‪a = (k<10) ? 100 : 50‬‬
‫;‪if (k<10) a=100‬‬
‫;‪else a=50‬‬

‫البته این عبارت به شکلهای پیچیده نیز می تواند مورد استفاده قرار گیرد‪ .‬مثال ‪:‬‬
‫;‪c += (a>0 && a<10) ? ++a : a/b‬‬
‫که معادل است با ‪:‬‬
‫{ )‪if (a>0 && a<10‬‬
‫;‪a= a + 1‬‬
‫;‪c = c + a‬‬
‫}‬
‫;‪else c = c + a/b‬‬

‫‪ 7-5-6‬اولویت عملگرها‬
‫عملگر‬

‫اولویت‬

‫شرکت پذیری‬

‫‪1‬‬

‫)(‬

‫از چپ به راست‬

‫‪2‬‬

‫‪- + ! -- ++‬‬

‫از راست به چپ‬

‫‪3‬‬

‫‪* / %‬‬

‫از چپ به راست‬

‫‪4‬‬

‫‪+ -‬‬

‫از چپ به راست‬

‫‪5‬‬

‫>> <<‬

‫از چپ به راست‬

‫‪6‬‬

‫>= > <= <‬

‫از چپ به راست‬

‫‪7‬‬

‫=! ==‬

‫از چپ به راست‬

‫‪8‬‬

‫&&‬

‫از چپ به راست‬

‫‪9‬‬

‫||‬

‫از چپ به راست‬

‫‪10‬‬

‫‪?:‬‬

‫از راست به چپ‬

‫‪11‬‬

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

‫از راست به چپ‬

‫‪12‬‬

‫‪,‬‬

‫از چپ به راست‬

‫‪ 7-6‬خواندن و نمایش اطالعات‬
‫‪‬‬

‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫همانطور كه قبال نیز گفته شد‪ ،‬یكی از اهداف زبان ‪ C‬قابل حمل بودن آن‬
‫است‪ .‬بهمین منظور سعی شده است كه از دستوراتی كه ممكن است‬
‫وابسته به ماشین خاصی باشد‪ ،‬اجتناب گردد‪.‬‬
‫بهمین دلیل زبان ‪ C‬برخالف سایر زبانها دارای هیچ دستوری برای‬
‫خواندن از ورودی و یا نوشتن در خروجی نیست‪.‬‬
‫اما در عوض دارای تعدادی تابع )زیربرنامه( استاندارد می باشد كه تقریبا‬
‫تمامی كامپایلرها از آنها حمایت می كنند‪.‬‬
‫این كار به كامپایلر این امكان را می دهد كه بر حسب نوع سخت افزار‬
‫موردنظر‪ ،‬توابع ورودی و خروجی را طراحی نماید‪.‬‬
‫این توابع در یك فایل سرآمد بنام ‪ stdio.h‬تعریف شده اند و بنابراین قبل‬
‫ازاینكه بتوانید از این توابع استفاده نمایید‪ ،‬باید این فایل را نیز با استفاده‬
‫از ‪ #include‬در برنامه خود بگنجانید‪.‬‬

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫برای نمایش اطالعات در خروجی از تابع ‪ printf‬استفاده می شود‪.‬‬
‫این تابع رشته موردنظر شما را به خروجی استاندارد )كه در حالت‬
‫عادی همان صفحه نمایش یا مانیتور است( می فرستد‪ .‬شكل كلی این‬
‫تابع بصورت زیر است‪:‬‬
‫; )>لیست متغیرها< ‪> ,‬رشته كنترلی<(‪printf‬‬
‫رشته كنترلی همان متنی است كه قصد چاپ آن را داریم‪ ،‬با ذكر این‬
‫نكته كه در قسمتهایی كه باید مقدار یك متغیر چاپ شود‪ ،‬از یك‬
‫مشخصه تبدیل استفاده می شود‪ .‬هر مشخصه تبدیل از یك عالمت ‪%‬‬
‫بعالوه یك كاراكتر كه نوع متغیر مورد نظر را نشان می دهد تشكیل می‬
‫گردد‪.‬‬
‫لیست متغیرها نیز همان متغیرهایی هستند كه قصد چاپ آنها را داریم‪.‬‬
‫این متغیرها باید بترتیب قرار گرفته و با كاما )‪ (,‬از یكدیگر جدا شوند‪.‬‬

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫مشخصه تبدیل‬

‫مفهوم‬

‫‪%c‬‬

‫كاراكتر‬

‫‪%d‬‬

‫عدد صحیح در مبنای ‪10‬‬

‫‪%f‬‬

‫عدد اعشاری بدون نماد علمی‬

‫‪%e‬‬

‫عدد اعشاری با نماد علمی‬

‫‪%g‬‬

‫عدد اعشاری با حالت كوتاهتر بین ‪ e‬و ‪f‬‬

‫‪%s‬‬

‫رشته‬

‫‪%ld‬‬

‫عدد صحیح بزرگ‬

‫‪%lf %le %lg‬‬

‫عدد اعشاری بزرگ‬

‫‪%o‬‬

‫عدد صحیح در مبنای ‪8‬‬

‫‪%x‬‬

‫عدد صحیحی در مبنای ‪16‬‬

‫‪%u‬‬

‫عدد صحیح بدون عالمت‬

‫ تابع نمایش در خروجی‬7-6-1
#include
void main() {
int age = 20;
floate average = 18.23;
printf("You are %d years old and your average is %f \n",age,average);
}
You are 20 years old and your average is 18.230000

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫‪‬‬
‫‪‬‬

‫برای کنترل نحوه چاپ اعداد می توانید از مشخصه طول میدان استفاده‬
‫کنید‪.‬‬
‫مشخصه طول میدان برای اعداد به شكل زیر استفاده می شود‪:‬‬
‫‪ ‬برای اعداد صحیح از ‪ %nd‬استفاده می كنیم كه ‪ n‬تعداد ارقام را نشان‬
‫می دهد )مثال ‪ .(%3d‬در اینصورت برای هر متغیر ‪ n‬رقم درنظر گرفته‬
‫می شود‪ .‬اگر اندازه عدد از ‪ n‬كوچكتر باشد‪ ،‬به سمت چپ آن فضای‬
‫خالی اضافه می شود و اگر اندازه عدد بیش از ‪ n‬رقم باشد‪ ،‬طول میدان‬
‫نادیده گرفته شده و عدد بطور كامل چاپ می شود‪.‬‬
‫‪ ‬برای اعداد اعشاری از ‪ %n.mf‬استفاده می كنیم كه ‪ n‬اندازه كل عدد‬
‫)شامل عالمت ممیز( و ‪ m‬تعداد ارقام اعشار است )مثال ‪ .(%5.2f‬در‬
‫صورتیكه تعداد ارقام اعشاری عدد موردنظر از ‪ m‬بیشتر باشد‪ ،‬عدد به ‪m‬‬
‫عدد اعشار گرد می شود و در صورتیكه از ‪ m‬كمتر باشد‪ ،‬در سمت‬
‫راست آن ‪ 0‬قرار داده می شود‪.‬‬

‫‪ 7-6-2‬تابع خواندن از ورودی‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای خواندن اطالعات از ورودی از تابع ‪ scanf‬استفاده می شود‪.‬‬
‫این تابع اطالعات را ازورودی استاندارد )معموال صفحه كلید( خوانده و در‬
‫متغیرهای تعیین شده قرار می دهد‪.‬‬
‫شكل كلی این تابع بصورت زیر است‪:‬‬
‫; )>لیست آدرسهای متغیرها< ‪> ,‬رشته كنترلی<(‪scanf‬‬
‫همانطور كه می بینید نحوه احضار تابع ‪ scanf‬نیز مشابه ‪ printf‬است‪ .‬تنها‬
‫تفاوت در آن است كه در ‪ scanf‬باید لیست آدرسهای متغیرها ارسال شود‪.‬‬
‫مبحث مربوط به آدرسها در فصول بعدی بررسی خواهد شد ولی در حال حاضر‬
‫بخاطر بسپارید كه برای بدست آوردن آدرس یك متغیر از عالمت & استفاده می‬
‫كنیم‪ .‬بعنوان مثال ‪ &age‬بمعنای آدرس متغیر ‪ age‬است‪.‬‬
‫بطور كلی در ‪ C‬قدیمی هرگاه كه یك تابع دارای پارامترهای خروجی بود )یعنی‬
‫پارامترهایی كه یك مقدار را باز می گرداندند( از آدرس متغیرها استفاده می‬
‫شد كه امروزه این مسئله وجود ندارد‪.‬‬

‫ تابع خواندن از ورودی‬7-6-2
#include
void main() {
int age;
float average ;
printf("Please enter your age and average : ");
scanf("%d %f",&age,&average);
printf("You are %d years old and your average is %5.2f \n",age,average);
}

Please enter your age and average : 19 16.72
You are 19 years old and your average is 16.72

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫زبان ‪ C++‬یک زبان شی گرا است‪ ،‬بهمین دلیل در این زبان برای ورودی‬
‫و خروجی از اشیاء بجای توابع استفاده می گردد‪.‬‬
‫از آنجا که امروزه معموال برنامه نویسان ‪ C‬از کامپایلرهای ‪ C++‬استفاده‬
‫می کنند‪ ،‬می توانند از اشیای ورودی و خروجی آن نیز استفاده کنند‪.‬‬
‫اینکار در بین بسیاری از برنامه نویسان ‪ C‬متداول است‪ ،‬بهمین دلیل ما‬
‫در اینجا نحوه کار با اشیای خواندن و نوشتن در ‪ C++‬را بطور مقدماتی‬
‫توضیح می دهیم؛ گرچه توضیح کامل این موارد نیاز به آشنایی با شی‬
‫گرایی و زبان ‪ C++‬دارد‪.‬‬
‫قبل از هرچیز الزم به ذکر است که کلیه اشیای مربوط به ورودی و‬
‫خروجی در فایل سرآمدی بنام ‪ iostream.h‬تعیریف شده اند‪ ،‬بنابراین‬
‫ابتدا باید این فایل به برنامه توسط دستور ‪ #include‬الحاق گردد‪.‬‬

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫زبان ‪ C++‬برای نمایش اطالعات از یک شیئ بنام ‪ cout‬استفاده می نماید‪.‬‬
‫برای ارسال اطالعات مورد نظر برای چاپ به ‪ cout‬باید از عملگر درج در جریان‬
‫یا >> استفاده نماییم‪ .‬بعنوان مثال ‪:‬‬
‫; ” ‪cout >> “Please enter your name:‬‬
‫و یا مثال دیگر ‪:‬‬
‫;‪int a = 10‬‬
‫;‪float b = 2.86‬‬
‫;‪cout << a‬‬
‫;‪cout << b‬‬
‫نکته جالبی که در این مثالها دیده می شود‪ ،‬آنستکه برخالف تابع ‪ printf‬هیچ‬
‫نیازی به مشخص کردن نوع متغیری که قصد چاپ آن را داریم نیست و خود‬
‫شئ ‪ cout‬نوع آن را تشخیص می دهد‪.‬‬
‫عالوه براین می توان چندین عملگر درج در جریان را با یکدیگر الحاق کرد و‬
‫چندین متغیر را با یک دستور چاپ کرد‪.‬‬

C++ ‫ ورودی و خروجی اطالعات در‬7-6-3
#include
void main() {
int age = 20;
floate average = 18.23;
cout >> “You are ” >> age >> “ years old and your average is ” >> average ;
}

You are 20 years old and your average is 18.230000

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای دریافت اطالعات از کاربر‪ ،‬از شئ دیگری بنام ‪ cin‬استفاده می شود‪.‬‬
‫برای ارسال متغیر مورد نظر به ‪ cin‬باید از عملگر استخراج از جریان یا <<‬
‫استفاده نماییم‪ .‬بعنوان مثال‪:‬‬
‫;‪int a‬‬
‫;‪cin >> a‬‬
‫بازهم همانطور که می بینید نیازی به تعیین نوع متغیر موردنظر نیست و خود‬
‫شئ ‪ cin‬نوع متغیر را بطور اتوماتیک تشخیص داده و داده ای از همان نوع را از‬
‫کاربر دریافت و در متغیر مورد نظر قرار می دهد‪.‬‬
‫عملگرهای استخراج از جریان را نیز می توان با یکدیگر الحاق کرد‪.‬‬
‫برای رفتن به خط بعد در شئ ‪ cout‬می توان از دستکاری کننده ‪ endl‬استفاده‬
‫کرد‪ .‬مثال در دستور زیر پس از چاپ پیغام‪ ،‬مکان نما به خط بعد منتقل می‬
‫شود‪:‬‬
‫;‪cout >> “List of students : “ >> endl‬‬
‫البته دستکاری کننده های متعدد دیگری نیز ازجمله موارد مربوط به تعیین طول‬
‫میدان و نحوه چاپ مقادیر وجود دارد که توضیح آنها نیاز به یک مبحث مستقل‬
‫دارد‪.‬‬

C++ ‫ ورودی و خروجی اطالعات در‬7-6-3
#include
void main() {
int age;
float average ;
cout << "Please enter your age and average : " ;
cin >> age >> average ;
cout << "You are " << age << "years old and your average is " << average;
}

Please enter your age and average : 19 16.72
You are 19 years old and your average is 16.72

‫‪ 7-7‬توابع کتابخانه ای‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫همانطور که قبال نیز گفته شد‪ ،‬زبان ‪ C‬از زیر برنامه ها نیز حمایت می کند‪ .‬هر زیر برنامه‬
‫در ‪ C‬یک تابع نامیده می شود‪ .‬تا کنون با توابعی همچون ‪ main‬و یا ‪ printf‬و ‪ scanf‬آشنا‬
‫شده ایم‪.‬‬
‫معموال عرضه کنندگان کامپایلرها و یا سایر فروشندگان نرم افزار‪ ،‬برخی از توابع عمومی‬
‫را که ممکن است مورد نیاز جمع کثیری از برنامه نویسان مختلف باشد را در قالب‬
‫کتابخانه ای از توابع در اختیار برنامه نویسان می گذارند‪ .‬بعضی از این توابع کتابخانه ای‬
‫مانند ‪ printf‬و ‪ scanf‬بصورت استاندارد درآمده و توسط عرضه کنندگان مختلف ارائه می‬
‫شوند‪.‬‬
‫در کامپایلر عرضه شده توسط شرکت بورلند )‪ (Borland C++ 3.1‬نیز کتابخانه های‬
‫متعددی از توابع برای شما عرضه شده اند که بتدریج با آنها و کاربردشان آشنا خواهید‬
‫شد‪.‬‬
‫نکته مهم آنستکه برای استفاده از این توابع ابتدا باید فایل سرآمد مربوط به آنها را نیز در‬
‫ابتدای برنامه خود اضافه نمایید ) با استفاده از ‪ .(#include‬هر فایل سرآمد شامل تعاریف‬
‫اولیه گروهی از توابع مرتبط با هم و داده های مربوط به آنها بوده و در استاندارد قدیمی‬
‫تر دارای پسوند ‪ .h‬می باشد)در استاندارد جدید پسوند این فایلها حذف شده است(‪.‬‬
‫برخی از این فایلهای سرآمد عبارتند از‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪ : stdio.h‬توابع ورودی و خروجی استاندارد‬
‫‪ : math.h‬توابع ریاضی‬
‫‪ : graphics.h‬توابع مربوط به عملیات گرافیکی‬
‫‪ : string.h‬توابع مربوط به کار با رشته ها‬


Slide 6

‫مبانی کامپیوتر و برنامه سازی‬
‫فصل هفتم ‪ :‬مفاهیم اولیه زبان ‪C‬‬
‫مدرس ‪ :‬نگین معروفی‬

‫‪ 7-1‬شناسه ها در ‪C‬‬
‫‪‬‬
‫‪‬‬

‫شناسه )‪ (identifier‬نامی است که به یک قسمت از برنامه مانند متغیر‪ ،‬تابع‪ ،‬ثابت و یا‬
‫‪ ...‬داده می شود‪.‬‬
‫در زبان ‪ C‬برای انتخاب شناسه ها فقط می توان از عالئم زیر استفاده کرد‪:‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫حروف انگلیسی کوچک و بزرگ )‪(A…Z a…z‬‬
‫ارقام )‪(0…9‬‬
‫عالمت خط پایین یا _‬

‫البته یک شناسه نمی تواند با یک رقم شروع شود‪.‬‬
‫چند شناسه مجاز‪ name2 ، average ، sum :‬و ‪student_average‬‬
‫چند شناسه غیرمجاز ‪ 2name‬و یا ‪student average‬‬
‫در برنامه نویسی امروزی پیشنهاد می شود بجای شناسه هایی همانند‬
‫‪ student_average‬از ‪ studentAverage‬استفاده گردد‪.‬‬
‫نکته مهم دیگری که باید به آن اشاره کرد آنستکه زبان ‪ C‬برخالف بسیاری از زبانهای دیگر‬
‫به کوچک و بزرگی حروف حساس است )‪ .(case sensitive‬در نتیجه شناسه های زیر با‬
‫یکدیگر متفاوتند ‪:‬‬
‫‪Sum ≠ sum ≠ SUM‬‬
‫آخرین نکته اینستکه در هنگام انتخاب شناسه نمی توانید از کلمات کلیدی که برای‬
‫منظورهای خاص در زبان ‪ C‬رزرو شده اند استفاده کنید‪.‬‬

C ‫ شناسه ها در‬7-1
: C ‫کلمات کلیدی در زبان‬
auto

break

case

char

const

continue

default

do

double

else

enum

extern

float

for

goto

if

int

long

register

return

short

signed

sizeof

static

struct

switch

typedef

union

unsigned

void

volatile

while

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫محدوده‬

‫اندازه )بیت(‬

‫توضیح‬

‫نوع داده‬

‫‪-128 to +127‬‬

‫‪8‬‬

‫کاراکتر‬

‫‪char‬‬

‫‪-32768 to +32767‬‬

‫‪16‬‬

‫عدد صحیح‬

‫‪int‬‬

‫‪3.4e-38 to 3.4e+38‬‬

‫‪32‬‬

‫عدد اعشاری‬

‫‪float‬‬

‫‪1.7e-308 to 1.7e+308‬‬

‫‪64‬‬

‫عدد اعشاری با‬
‫دقت مضاعف‬

‫‪double‬‬

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫‪‬‬

‫البته چند نکته مهم درمورد این جدول قابل ذکر است ‪:‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫اندازه ‪ int‬در محیطهای ‪ 16‬بیتی مانند ‪ DOS‬برابر ‪ 16‬بیت است‪ .‬اما در‬
‫محیطهای ‪ 32‬بیتی همانند ‪ Windows‬اندازه آن ‪ 32‬بیت می باشد که در‬
‫اینصورت محدوده ای برابر ‪ -2,147,483,648‬تا ‪ +2,147,483,647‬را‬
‫پوشش می دهد‪.‬‬
‫در بعضی از کامپایلرهای ‪ ،C‬نوع داده ‪ bool‬نیز وجود دارد که می تواند‬
‫یکی از مقادیر ‪)true‬درست( یا ‪) false‬غلط( را نشان دهد ‪ .‬اما در نسخه‬
‫های اولیه ‪ C‬از همان نوع داده صحیح یا ‪ int‬برای اینکار استفاده می‬
‫شد‪ .‬بدین صورت که ‪ 0‬نشاندهنده ‪ false‬و هر عدد غیر صفر )معموال ‪(1‬‬
‫نشاندهنده ‪ true‬است‪.‬‬
‫از آنجا که برای ذخیره سازی کاراکترها کد اسکی آنها ذخیره می گردد‪،‬‬
‫از یک متغیر کاراکتری یا ‪ char‬می توان بعنوان یک عدد صحیح کوچک نیز‬
‫استفاده کرد و اعمال ریاضی برروی آنها نیز مجاز است‪.‬‬

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫عالوه براین چندین اصالح کننده نیز وجود دارد که به ما اجازه می دهد نوع داده مورد‬
‫نظر را با دقت بیشتری برای نیازهای مختلف استفاده نماییم‪.‬‬
‫این اصالح کننده ها عبارتند از ‪short, long, signed, unsigned :‬‬
‫تمام این اصالح کننده ها می توانند به نوع داده ‪ int‬اعمال شوند و اثر آنها بستگی‬
‫به محیط دارد‪.‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫در یک محیط ‪16‬بیتی‪short int ،‬بازهم برابر ‪16‬بیت است ولی ‪ long int‬برابر‪32‬بیت می‬
‫باشد‪.‬‬
‫‪ unsigned int‬باعث می شود که یک عدد ‪ 16‬بیتی بدون عالمت داشته باشیم که بازه‬
‫بین ‪ 0‬تا ‪ 65535‬را پوشش می دهد‪ signed int .‬نیز همانند ‪ int‬معمولی بوده و تفاوتی‬
‫ندارد‪.‬‬
‫ترکیب این اصالح کننده ها نیز ممکن است‪ .‬مثال ‪ unsigned long int‬یک عدد ‪ 32‬بیتی‬
‫بدون عالمت است که بازه ‪ 0‬تا ‪ 4,294,967,295‬را پوشش می دهد‪.‬‬

‫برروی نوع داده ‪ char‬فقط اصالح کننده های ‪ signed‬و ‪ unsigned‬را می توان اعمال‬
‫کرد‪ .‬معموال از اصالح کننده ‪ unsigned‬وقتی استفاده می شود که قصد داشته‬
‫باشیم از ‪ char‬بعنوان یک عدد صحیح مثبت بین ‪ 0‬تا ‪ 255‬استفاده کنیم‪.‬‬
‫برروی نوع داده ‪ double‬تنها اصالح کننده ‪ long‬قابل اعمال است و دراینصورت عدد‬
‫اعشاری با ‪ 80‬بیت را خواهیم داشت که قادر است هر عددی در بازه ‪ 3.4e-4932‬تا‬
‫‪ 1.1e+4932‬را در خود نگاه دارد‪.‬‬

‫‪ 7-3‬تعریف متغیرها‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای تعریف متغیرها به شکل زیر عمل می کنیم‪:‬‬

‫;>‪ ‫که ‪ type‬یکی از نوع داده های گفته شده و ‪ variable-list‬لیستی از متغیرها است‬
‫که با کاما از یکدیگر جدا شده اند‪ .‬بعنوان مثال ‪:‬‬
‫;‪int sum‬‬
‫;‪float average‬‬
‫; ‪long int a, b, c‬‬
‫; ‪unsigned long int i, j, k‬‬
‫عالوه براین می توان در هنگام تعریف متغیر به آن مقدار اولیه نیز داد‪ .‬مثال ‪:‬‬
‫; ‪int d = 0‬‬
‫نكته مهم آنكه زبان ‪ C‬به متغیرها مقدار اولیه نمي دهد )حتي ‪ (0‬و برنامه نويس‬
‫خود بايد اينكار را صريحا انجام دهد‪ ،‬درغیر اينصورت مقدار اولیه متغیر‪ ،‬نامعین خواهد‬
‫بود‪.‬‬
‫تعریف متغیرها طبق اصول زبان ‪ C‬میتواند درهرجایی از برنامه صورت پذیرد‪ ،‬و‬
‫متغیرهای تعریف شده از همان خط به بعد قابل استفاده خواهد بود‪ .‬اما معموال‬
‫توصیه می گردد كه تعریف متغیرها در همان خط ابتدایی تابع و بالفاصله پس از {‬
‫صورت پذیرد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫‪‬‬
‫‪‬‬

‫ثابتها مقادیر ثابتی هستند كه مقدار آنها در حین اجرای برنامه تغییر نمی یابد‪ .‬ثابتها می توانند از‬
‫هریك از نوع داده های اصلی باشند‪.‬‬
‫ثوابت عددی صحیح ‪:‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫برای نمایش این دسته از ثوابت‪ ،‬از دنباله ای از ارقام بعالوه عالمت ‪ +‬یا ‪ -‬استفاده می كنیم‪ .‬بعنوان مثال‬
‫‪ -45‬و یا ‪ 3489‬ثوابت صحیح هستند‪.‬‬
‫در حالت عادی ‪ C‬هر عدد را در كوچكترین نوع داده ای كه می تواند قرار می دهد‪ .‬مثال عدد ‪ 85‬در یك‬
‫‪ int‬قرار می گیرد‪ ،‬اما عدد ‪ 145398‬در یك ‪ long int‬قرار خواهد گرفت‪.‬‬
‫اگر قصد دارید یك عدد كوچك بعنوان ‪ long‬محسوب گردد‪ ،‬می توانید از پسوند ‪ L‬در انتهای آن استفاده‬
‫می كنیم‪ .‬مثال ‪245L‬یك عدد ‪ long‬محسوب می شود‪.‬‬
‫;‪long int a = 20L‬‬
‫پسوند ‪ U‬در انتهای عدد نیز نشانه بدون عالمت بودن آن است‪.‬‬
‫نكته دیگر آنكه ‪ C‬به شما اجازه می دهد درصورت لزوم ثوابت صحیح خود را در مبنای ‪ 8‬یا ‪ 16‬نیز كه‬
‫از مبناهای متداول در برنامه نویسی هستند‪ ،‬بنویسید‪.‬‬
‫‪‬‬
‫‪‬‬

‫برای نوشتن عدد در مبنای ‪ 8‬باید آن را با ‪ 0‬آغاز كنید‪ ،‬مثال ‪ 0342‬یك عدد در منای ‪ 8‬محسوب می‬
‫گردد‪.‬‬
‫برای نوشتن یك عدد در مبنای ‪ 16‬باید آن را با ‪ 0x‬آغاز نمایید‪ ،‬مانند ‪.0x27A4‬‬

‫‪ 7-4‬ثوابت‬
‫ثوابت عددی اعشاری‬

‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫برای نمایش اعداد اعشاری‪ ،‬باید از نقطه اعشار استفاده كنیم‪ ،‬مانند ‪237.45‬‬
‫اما نكته جالب آنستكه می توانید از نماد علمی نیز برای نمایش اعداد‬
‫اعشاری استفاده كنید‪ .‬برای اینكار كافی است از حرف ‪ e‬برای نمایش قسمت‬
‫توان استفاده نمایید‪ .‬بعنوان مثال ‪:‬‬
‫‪-23.47 × 10 5 = -23.47e5‬‬
‫‪42.389 × 10 -3 = 42.389e-3‬‬
‫دقت كنید كه قسمت توان‪ ،‬حتما یك عدد صحیح است‪.‬‬
‫نكته جالب اینجاست كه برخالف مورد قبل‪ ،‬كامپایلر بطور پیش فرض داده های‬
‫اعشاری را از نوع ‪ double‬فرض می كند‪.‬چنانچه دوست دارید ثابت شما ازنوع‬
‫‪ float‬درنظر گرفته شود‪ ،‬در انتهای آن ‪ F‬قرار دهید‪ .‬ضمنا پسوند ‪ L‬نیز داده‬
‫اعشاری را از نوع ‪ long double‬درنظر می گیرد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫ثوابت كاراكتری ‪:‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫برای نشان دادن ثوابت كاراكتری‪ ،‬آنها را در داخل ' قرار می دهیم‪ .‬بعنوان مثال‬
‫'‪'A‬یك ثابت كاراكتری است‪.‬‬
‫; '‪char ch = 'S‬‬
‫دقت كنید كه همانطور كه قبال گفته شد‪ ،‬كد اسكی كاراكترها در متغیر ذخیره‬
‫می گردد‪ ،‬بنابراین می توان از آن بعنوان یك عدد صحیح نیز استفاده كرد‪ .‬نكته‬
‫مهم دیگر آنستكه به تفاوت عدد ‪ 5‬و كاراكتر '‪ '5‬دقت داشته باشید‪ .‬در حقیقت‬
‫'‪ '5‬برابر است با عدد ‪ 53‬كه همان كد اسكی آن است‪.‬‬
‫روش فوق‪ ،‬برای نمایش کاراکترهای قابل چاپ مناسب است‪ ،‬اما بعضی‬
‫كاراكترها مانند ‪ enter‬قابل نمایش نبوده و برای آنها شکل خاصی وجود ندارد‪.‬‬
‫در چنین مواردی‪ ،‬زبان ‪ C‬از ترکیب عالمت \ به همراه یک کاراکتر دیگر‪ ،‬برای‬
‫نمایش این قبیل کاراکترها استفاده می نماید‪ .‬بعنوان مثال‪ ،‬کاراکتر '‪ '\n‬نشان‬
‫دهنده خط جدید یا همان ‪ enter‬می باشد‪.‬‬
‫جدول صفحه بعد این قبیل کاراکترها و معادل آنها را نشان می دهد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫نحوه نمایش در ‪C‬‬

‫کد اسکی‬

‫صدای بوق کامپیوتر‬

‫‪\a‬‬

‫‪7‬‬

‫حرکت به عقب ‪backspace‬‬

‫‪\b‬‬

‫‪8‬‬

‫شروع صفحه ‪form feed‬‬

‫‪\f‬‬

‫‪12‬‬

‫سطر جدید ‪line feed‬‬

‫‪\n‬‬

‫‪10‬‬

‫برگشت به ابتداي سطر ‪carriage return‬‬

‫‪\r‬‬

‫‪13‬‬

‫فاصله افقی ‪horizontal tab‬‬

‫‪\t‬‬

‫‪9‬‬

‫فاصله عمودی ‪vertical tab‬‬

‫‪\v‬‬

‫‪11‬‬

‫عالمت سوال‬

‫?\‬

‫‪63‬‬

‫عالمت '‬

‫'\‬

‫‪39‬‬

‫عالمت "‬

‫"\‬

‫‪34‬‬

‫عالمت \‬

‫\\‬

‫‪92‬‬

‫عالمت تهی‬

‫‪\0‬‬

‫‪0‬‬

‫نام کاراکتر‬

‫کد اسکی یک کاراکتر با ‪ 3‬رقم در مبنای ‪8‬‬

‫‪\000‬‬

‫کد اسکی یک کاراکتر با ‪ 2‬رقم در مبنای ‪16‬‬

‫‪\x00‬‬

‫‪ 7-4‬ثوابت‬
‫‪‬‬

‫ثوابت رشته ای ‪ C :‬عالوه بر ثوابت فوق‪ ،‬از یك ثابت دیگر بنام رشته نیز‬
‫حمایت می كند‪ .‬رشته‪ ،‬دنباله ای از كاراكترها است كه در داخل " قرار‬
‫می گیرند‪ .‬بعنوان مثال "‪ "this is a test‬یك رشته است‪ .‬دقت كنید كه '‪'a‬‬
‫یك كاراكتر است‪ ،‬اما "‪ "a‬یك رشته است كه فقط شامل یك كاراكتر می‬
‫باشد‪.‬‬

‫‪ 7-5‬عملگرها‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫عملگر‪ ،‬نمادی است كه به كامپایلر می گوید تا عملیات محاسباتی یا‬
‫منطقی خاصی را برروی یك یا چند عملوند‪ ،‬انجام دهد‪.‬‬
‫به عملگرهایی كه فقط یك عملوند دارند‪ ،‬عملگر یكانی می گوییم و‬
‫همواره عملگر در سمت چپ عملوند قرار می گیرد)مانند عدد ‪.(-125‬‬
‫اما عملگرهایی كه برروی دو عملوند اثر می كنند را عملگر دودویی‬
‫نامیده و عملگر را بین دو عملوند قرار می دهیم )مانند ‪.(23+86‬‬
‫هر ترکیب درستی از عملگرها و عملوندها را یک عبارت می نامیم‪.‬‬
‫‪ C‬از نقطه نظر عملگرها یك زبان بسیار قوی است‪ .‬این عملگرها به چند‬
‫دسته اصلی تقسیم می گردند كه آنها را به ترتیب بررسی می كنیم‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫این عملگرها‪ ،‬همان اعمال متداول ریاضی هستند كه در زبان ‪ C‬مورد استفاده‬
‫قرار می گیرند‪ .‬این اعمال عبارتند از ‪:‬‬

‫عمل‬

‫نوع‬

‫عملگر‬

‫منفی كردن عملوند سمت راست‬

‫یكانی‬

‫‪-‬‬

‫جمع دو عملوند‬

‫دودویی‬

‫‪+‬‬

‫تفریق دو عملوند‬

‫دودویی‬

‫‪-‬‬

‫ضرب دو عملوند‬

‫دودویی‬

‫*‬

‫تقسیم دو عملوند‬

‫دودویی‬

‫‪/‬‬

‫محاسبه باقیمانده تقسیم دو عملوند‬

‫دودویی‬

‫‪%‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬
‫‪‬‬

‫این عملگرهای برروی همه انواع داده های ‪ C‬عمل می كنند‪ ،‬بجز عملگر ‪ %‬كه فقط‬
‫برروی نوع داده های صحیح عمل می كند‪.‬‬
‫اما نكته مهمی كه باید به آن اشاره كرد‪ ،‬نحوه كار عملگر تقسیم برروی نوع داده های‬
‫مختلف است‪.‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫درصورتیكه هردو عملوند صحیح باشند‪ ،‬تقسیم بصورت صحیح بر صحیح انجام خواهد شد‪.‬‬
‫اگر یكی یا هر دو عملوند اعشاری باشند‪ ،‬تقسیم بصورت اعشاری انجام خواهد پذیرفت‪.‬‬
‫فرض كنید تعاریف زیر را داریم ‪:‬‬
‫; ‪int a,b‬‬
‫; ‪float c,d‬‬
‫; ‪a = 10 ; b = 4‬‬
‫;‪c = 8.2; d = 4.0‬‬
‫اكنون به نتایج عملیات زیر دقت كنید ‪:‬‬
‫‪a / b => 2‬‬
‫‪c / d => 2.05‬‬
‫‪a / d => 2.5‬‬
‫‪a / 4 => 2‬‬
‫چنانچه به آخرین مورد توجه كنید‪ ،‬متوجه می شوید كه از آنجا كه ‪a‬یك متغیر صحیح است و ‪4‬‬
‫نیز یك ثابت صحیح در نظر گرفته شده‪ ،‬درنتیجه تقسیم بصورت صحیح بر صحیح انجام گرفته‬
‫است‪ .‬چنانچه بخواهیم تقسیم بصورت اعشاری صورت پذیرد‪ ،‬به دو شكل می توانیم عمل‬
‫كنیم‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫برای اینکه عبارت تقسیم صفحه قبل بصورت اعشاری انجام شود‪ ،‬به دو روش‬
‫می توان عمل کرد‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫این عبارت را بصورت ‪ a / 4.0‬بنویسیم‪.‬‬
‫از عملگر قالب ریزی استفاده كنیم‪.‬‬

‫عملگر قالب ریزی می تواند یك نوع را به نوع دیگری تبدیل نماید‪ .‬شكل كلی آن‬
‫به شكل زیر است ‪:‬‬
‫>‪() ‫كه ‪ type‬نوع مورد نظر است كه قصد تبدیل عبارت ‪ expression‬به آن نوع را‬
‫داریم‪ .‬بعنوان مثال در مورد قبلی می توان به شكل زیر عمل كرد ‪:‬‬
‫‪(float) a / 4‬‬
‫در این حالت از كامپایلر خواسته ایم كه ابتدا عدد ‪ a‬را به اعشاری تبدیل كند‬
‫)البته بصورت موقت( و سپس آن را بر ‪ 4‬تقسیم نماید‪ ،‬كه مسلما حاصل‬
‫اعشاری خواهد بود‪.‬‬
‫بطوركلی هرگاه ثابتها و متغیرهایی از انواع مختلف در یك عبارت محاسباتی‬
‫داشته باشیم‪ ،‬كامپایلر ‪ C‬همه آنها را به یك نوع یكسان كه همان بزرگترین‬
‫عملوند موجود است تبدیل خواهد كرد‪ .‬بعنوان مثال به مورد صفحه بعد دقت‬
‫كنید ‪:‬‬

‫ عملگرهای محاسباتی‬7-5-1
char ch;
int i;

float f;
double d;
result = (ch / i)
int

+

(f *d)

(f+i)
float

double

double

int

-

double

double

float

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫اولویت عملگرها ‪ :‬در عبارتی که شامل چندین عملگر است‪ ،‬کدامیک در‬
‫ابتدا اعمال خواهد گردید‪.‬‬
‫اولویت عملگرهای محاسباتی از باال به پایین بشرح زیر است‪:‬‬
‫‪ ‬عملگر یکانی –‬
‫‪ ‬عملگرهای * و ‪ /‬و ‪%‬‬
‫‪ ‬عملگرهای ‪ +‬و –‬
‫چنانچه اولویت دو عملگر یکسان باشد‪ ،‬این عملگرها از چپ به راست‬
‫محاسبه خواهند شد‪.‬‬
‫چنانچه بخواهیم یک عمل با اولویت پایین زودتر انجام شود‪ ،‬باید از پرانتز‬
‫استفاده کنیم‪ .‬بنابراین اولویت عملگر پرانتز از همه موارد فوق‬
‫بیشتراست‪ .‬در مورد پرانتزهای متداخل‪ ،‬ابتدا پرانتز داخلی محاسبه‬
‫می شود؛ اما در مورد پرانتزهای هم سطح‪ ،‬ابتدا پرانتز سمت چپتر‬
‫محاسبه می گردد‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫چند مثال در مورد اولویت عملگرها‬

‫ترتیب اجرای عملگرها‬

‫عبارت زبان ‪C‬‬

‫ابتدا عمل * و سپس عمل ‪+‬‬

‫‪b+c*d‬‬

‫ابتدا عمل ‪ +‬و سپس عمل *‬

‫‪(b + c) * d‬‬

‫ابتدا عمل ‪ /‬سپس عمل * و در انتها عمل ‪+‬‬

‫‪b+c/d*e‬‬

‫ابتدا عمل * سپس عمل ‪ /‬و در انتها عمل ‪+‬‬

‫)‪b + c / (d * e‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫یک مثال کامل در مورد اولویت عملگرها‬

‫‪result = a + b * (f – (g + b) / d) – c * (a – d) / e‬‬
‫‪6‬‬

‫‪1‬‬
‫‪7‬‬

‫‪2‬‬

‫‪8‬‬

‫‪3‬‬
‫‪4‬‬
‫‪5‬‬
‫‪9‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫در زبان ‪ C‬برای انتساب چندین عملگر وجود دارد‪ .‬ساده ترین عملگر انتساب‪ ،‬همان عملگر =‬
‫است که در بسیاری از زبانها استفاده می شود‪ .‬بعنوان مثال ‪:‬‬
‫;‪a = 5‬‬
‫;‪b = c + 2 * d‬‬
‫این عملگر باعث می شود که عبارت سمت راست در عبارت سمت چپ قرار گیرد‪.‬‬
‫توجه کنید که مقدار سمت چپ باید عبارتی باشد که بتوان به آن یک مقدار را نسبت داد‬
‫)مانند یک متغیر( که به آن ‪ Lvalue‬گفته می شود‪ ،‬بنابراین یک ثابت نمی تواند در سمت چپ‬
‫قرار گیرد‪.‬‬
‫نکته دیگر اینکه اولویت عملگر = از عملگرهای ریاضی کمتر است و درنتیجه ابتدا آن عملیات‬
‫انجام شده و در پایان حاصل در عبارت سمت چپ ریخته می شود‪.‬‬
‫الزم به ذکر است که در هنگام انتساب‪ ،‬درصورت لزوم نوع عبارت سمت راست به نوع عبارت‬
‫سمت چپ تبدیل می شود‪ .‬مثال‪:‬‬
‫;‪int a‬‬
‫;‪a = 2.5 * 5.0‬‬
‫که دراینصورت عدد ‪ 12‬در ‪ a‬ذخیره خواهد شد‪.‬‬
‫شرکت پذیری این عملگر از راست به چپ می باشد‪ ،‬بدین معنا که چنانچه چندین عملگر‬
‫نسبت دهی داشته باشیم‪ ،‬این عملگرها از راست به چپ محاسبه می شوند‪ .‬مثال پس از‬
‫اجرای دستور زیر‪ ،‬مقدار هر ‪ 3‬متغیر برابر ‪ 10‬خواهد شد‪.‬‬
‫;‪a = b = c = 10‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬

‫نکته جالب درمورد زبان ‪ C‬آنستکه دارای یک سری عملگرهای انتساب‬
‫خالصه شده است که باعث می شوند در بعضی موارد بتوانیم عبارات‬
‫کوتاهتری را بنویسیم‪ .‬این عملگرها عبارتند از ‪:‬‬
‫عملگرد‬

‫مثال‬

‫عبارت انتساب معادل‬

‫‪++‬‬

‫;‪a ++‬‬

‫;‪a = a + 1‬‬

‫‪--‬‬

‫;‪a --‬‬

‫;‪a = a – 1‬‬

‫=‪+‬‬

‫;‪a += 5‬‬

‫;‪a = a + 5‬‬

‫=‪-‬‬

‫;‪a -= 8‬‬

‫;‪a= a – 8‬‬

‫=*‬

‫;‪a *= 10‬‬

‫;‪a= a * 10‬‬

‫=‪/‬‬

‫;‪a /= 2‬‬

‫;‪a = a / 2‬‬

‫=‪%‬‬

‫;‪a %= 10‬‬

‫;‪a = a % 10‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬
‫‪‬‬

‫عملگر اول و دوم‪ ،‬عملگرهای یکانی هستند که بترتیب عملگر افزایش و عملگر کاهش‬
‫نامیده می شوند‪.‬‬
‫نکته جالب آنستکه این دو عملگر به دوصورت مورد استفاده قرار می گیرند‪.‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫در حالتی که از دستور ;‪ a ++‬استفاده شود به آن پس افزایش می گویند و بدین معناست که‬
‫ابتدا از مقدار فعلی ‪ a‬در عبارت موردنظر استفاده کن و سپس آن را افزایش بده‪.‬‬
‫اما دستور ;‪ ++ a‬که به آن پیش افزایش گفته می شود‪ ،‬ابتدا ‪ a‬را افزایش داده و سپس از آن‬
‫در عبارت استفاده می کند‪.‬‬
‫به برنامه زیر دقت کنید‪:‬‬

‫>‪#include ‫{ )(‪void main‬‬
‫; ‪int a ,b‬‬
‫;‪a=5‬‬
‫;‪b = a ++‬‬
‫;)‪printf(“a=%d and b=%d \n”,a,b‬‬
‫;‪a=5‬‬
‫;‪b = ++ a‬‬
‫;)‪printf(“a=%d and b=%d \n”,a,b‬‬
‫}‬
‫‪a=6 b=5‬‬
‫‪a=6 b=6‬‬

‫‪ 7-5-3‬عملگرهای مقایسه ای‬
‫‪‬‬

‫‪‬‬

‫این عملگرها دو عبارت را بایکدیگر مقایسه کرده و نتیجه را باز می گردانند‪.‬‬
‫نتیجه می تواند درست )‪ (true‬یا غلط )‪ (false‬باشد‪.‬‬
‫نتیجه این عملگرها یک عدد صحیح است که درصورت درست بودن ‪ 1‬و‬
‫درصورت غلط بودن ‪ 0‬باز می گردانند‪ .‬این عملگرها عبارتند از‪:‬‬
‫عملگر‬

‫مفهوم عملگر‬

‫مثال‬

‫<‬

‫بزرگتر )<(‬

‫‪a>b‬‬

‫>‬

‫کوچکتر )>(‬

‫‪a
‫=<‬

‫بزرگتر یا مساوی )≤(‬

‫‪a >= b‬‬

‫=>‬

‫کوچکتر یا مساوی )≥(‬

‫‪a <= b‬‬

‫==‬

‫مساوی )=(‬

‫‪a == b‬‬

‫=!‬

‫نامساوی )≠(‬

‫‪a != b‬‬

‫‪ 7-5-3‬عملگرهای مقایسه ای‬
‫‪‬‬

‫‪‬‬

‫نکته مهمی که باید به آن دقت کرد عملگر مساوی )==( است‪ ،‬چرا که یک‬
‫اشتباه بسیار متداول برنامه نویسان ‪ C‬استفاده اشتباه از عملگر انتساب‬
‫)=( بجای عملگر تساوی )==( است که باعث ایجاد خطا در برنامه می‬
‫شود‪.‬‬
‫اولویت این عملگرها از باال به پایین بشرح زیر است‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫عملگرهای <‪ <= ، > ،‬و =>‬
‫عملگرهای == و =!‬

‫الزم بذکر است که در هنگام مساوی بودن اولویت چند عملگر‪ ،‬این عملگرها‬
‫از چپ به راست محاسبه می گردند‪.‬‬

‫‪ 7-5-4‬عملگرهای منطقی‬
‫‪‬‬

‫این عملگرها به شما اجازه می دهند که شرطهای ساده ای را که با‬
‫استفاده از عملگرهای مقایسه ای ایجاد شده اند را با یکدیگر ترکیب نموده‬
‫و شرطهای پیچیده تری را بسازید‪ .‬این عملگرها عبارتند از ‪:‬‬
‫مثال‬

‫عملگر‬

‫مفهوم عملگر‬

‫نحوه کار‬

‫&&‬

‫‪ AND‬منطقی‬

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

‫‪a>0 && sw==1‬‬

‫||‬

‫‪ OR‬منطقی‬

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

‫‪a<=100 || b!=0‬‬

‫!‬

‫‪ NOT‬منطقی‬

‫اگر عملوند درست باشد‪ ،‬نادرست و‬
‫اگر نادرست باشد‪ ،‬درست برمی‬
‫گرداند‪.‬‬

‫)‪! (a==1 || b<10‬‬

‫‪ 7-5-5‬عملگر شرطی‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫گاهی الزم است که ابتدا یک شرط بررسی شده و سپس برمبنای نتیجه )درست یا نادرست بودن آن( یکی‬
‫از دو عبارت ممکن بازگردانده شود‪ .‬برای اینکار می توان از یک عملگر ‪3‬تایی )با ‪ 3‬عملوند( بنام عملگر‬
‫شرطی استفاده نمود‪.‬‬
‫شکل کلی این عملگر بصورت زیر است‪:‬‬
‫>عبارت‪> :<2‬عبارت‪> ?<1‬شرط<‬
‫نحوه کار بدینصورت است که درصورت درست بودن شرط‪ ،‬عبارت‪ 1‬و در غیراینصورت عبارت ‪ 2‬بازگردانده می‬
‫شود‪.‬‬
‫به عنوان مثال به دستور زیر توجه کنید‪:‬‬
‫که این عبارت معادل دستور زیر است‪:‬‬

‫‪‬‬

‫;‪a = (k<10) ? 100 : 50‬‬
‫;‪if (k<10) a=100‬‬
‫;‪else a=50‬‬

‫البته این عبارت به شکلهای پیچیده نیز می تواند مورد استفاده قرار گیرد‪ .‬مثال ‪:‬‬
‫;‪c += (a>0 && a<10) ? ++a : a/b‬‬
‫که معادل است با ‪:‬‬
‫{ )‪if (a>0 && a<10‬‬
‫;‪a= a + 1‬‬
‫;‪c = c + a‬‬
‫}‬
‫;‪else c = c + a/b‬‬

‫‪ 7-5-6‬اولویت عملگرها‬
‫عملگر‬

‫اولویت‬

‫شرکت پذیری‬

‫‪1‬‬

‫)(‬

‫از چپ به راست‬

‫‪2‬‬

‫‪- + ! -- ++‬‬

‫از راست به چپ‬

‫‪3‬‬

‫‪* / %‬‬

‫از چپ به راست‬

‫‪4‬‬

‫‪+ -‬‬

‫از چپ به راست‬

‫‪5‬‬

‫>> <<‬

‫از چپ به راست‬

‫‪6‬‬

‫>= > <= <‬

‫از چپ به راست‬

‫‪7‬‬

‫=! ==‬

‫از چپ به راست‬

‫‪8‬‬

‫&&‬

‫از چپ به راست‬

‫‪9‬‬

‫||‬

‫از چپ به راست‬

‫‪10‬‬

‫‪?:‬‬

‫از راست به چپ‬

‫‪11‬‬

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

‫از راست به چپ‬

‫‪12‬‬

‫‪,‬‬

‫از چپ به راست‬

‫‪ 7-6‬خواندن و نمایش اطالعات‬
‫‪‬‬

‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫همانطور كه قبال نیز گفته شد‪ ،‬یكی از اهداف زبان ‪ C‬قابل حمل بودن آن‬
‫است‪ .‬بهمین منظور سعی شده است كه از دستوراتی كه ممكن است‬
‫وابسته به ماشین خاصی باشد‪ ،‬اجتناب گردد‪.‬‬
‫بهمین دلیل زبان ‪ C‬برخالف سایر زبانها دارای هیچ دستوری برای‬
‫خواندن از ورودی و یا نوشتن در خروجی نیست‪.‬‬
‫اما در عوض دارای تعدادی تابع )زیربرنامه( استاندارد می باشد كه تقریبا‬
‫تمامی كامپایلرها از آنها حمایت می كنند‪.‬‬
‫این كار به كامپایلر این امكان را می دهد كه بر حسب نوع سخت افزار‬
‫موردنظر‪ ،‬توابع ورودی و خروجی را طراحی نماید‪.‬‬
‫این توابع در یك فایل سرآمد بنام ‪ stdio.h‬تعریف شده اند و بنابراین قبل‬
‫ازاینكه بتوانید از این توابع استفاده نمایید‪ ،‬باید این فایل را نیز با استفاده‬
‫از ‪ #include‬در برنامه خود بگنجانید‪.‬‬

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫برای نمایش اطالعات در خروجی از تابع ‪ printf‬استفاده می شود‪.‬‬
‫این تابع رشته موردنظر شما را به خروجی استاندارد )كه در حالت‬
‫عادی همان صفحه نمایش یا مانیتور است( می فرستد‪ .‬شكل كلی این‬
‫تابع بصورت زیر است‪:‬‬
‫; )>لیست متغیرها< ‪> ,‬رشته كنترلی<(‪printf‬‬
‫رشته كنترلی همان متنی است كه قصد چاپ آن را داریم‪ ،‬با ذكر این‬
‫نكته كه در قسمتهایی كه باید مقدار یك متغیر چاپ شود‪ ،‬از یك‬
‫مشخصه تبدیل استفاده می شود‪ .‬هر مشخصه تبدیل از یك عالمت ‪%‬‬
‫بعالوه یك كاراكتر كه نوع متغیر مورد نظر را نشان می دهد تشكیل می‬
‫گردد‪.‬‬
‫لیست متغیرها نیز همان متغیرهایی هستند كه قصد چاپ آنها را داریم‪.‬‬
‫این متغیرها باید بترتیب قرار گرفته و با كاما )‪ (,‬از یكدیگر جدا شوند‪.‬‬

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫مشخصه تبدیل‬

‫مفهوم‬

‫‪%c‬‬

‫كاراكتر‬

‫‪%d‬‬

‫عدد صحیح در مبنای ‪10‬‬

‫‪%f‬‬

‫عدد اعشاری بدون نماد علمی‬

‫‪%e‬‬

‫عدد اعشاری با نماد علمی‬

‫‪%g‬‬

‫عدد اعشاری با حالت كوتاهتر بین ‪ e‬و ‪f‬‬

‫‪%s‬‬

‫رشته‬

‫‪%ld‬‬

‫عدد صحیح بزرگ‬

‫‪%lf %le %lg‬‬

‫عدد اعشاری بزرگ‬

‫‪%o‬‬

‫عدد صحیح در مبنای ‪8‬‬

‫‪%x‬‬

‫عدد صحیحی در مبنای ‪16‬‬

‫‪%u‬‬

‫عدد صحیح بدون عالمت‬

‫ تابع نمایش در خروجی‬7-6-1
#include
void main() {
int age = 20;
floate average = 18.23;
printf("You are %d years old and your average is %f \n",age,average);
}
You are 20 years old and your average is 18.230000

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫‪‬‬
‫‪‬‬

‫برای کنترل نحوه چاپ اعداد می توانید از مشخصه طول میدان استفاده‬
‫کنید‪.‬‬
‫مشخصه طول میدان برای اعداد به شكل زیر استفاده می شود‪:‬‬
‫‪ ‬برای اعداد صحیح از ‪ %nd‬استفاده می كنیم كه ‪ n‬تعداد ارقام را نشان‬
‫می دهد )مثال ‪ .(%3d‬در اینصورت برای هر متغیر ‪ n‬رقم درنظر گرفته‬
‫می شود‪ .‬اگر اندازه عدد از ‪ n‬كوچكتر باشد‪ ،‬به سمت چپ آن فضای‬
‫خالی اضافه می شود و اگر اندازه عدد بیش از ‪ n‬رقم باشد‪ ،‬طول میدان‬
‫نادیده گرفته شده و عدد بطور كامل چاپ می شود‪.‬‬
‫‪ ‬برای اعداد اعشاری از ‪ %n.mf‬استفاده می كنیم كه ‪ n‬اندازه كل عدد‬
‫)شامل عالمت ممیز( و ‪ m‬تعداد ارقام اعشار است )مثال ‪ .(%5.2f‬در‬
‫صورتیكه تعداد ارقام اعشاری عدد موردنظر از ‪ m‬بیشتر باشد‪ ،‬عدد به ‪m‬‬
‫عدد اعشار گرد می شود و در صورتیكه از ‪ m‬كمتر باشد‪ ،‬در سمت‬
‫راست آن ‪ 0‬قرار داده می شود‪.‬‬

‫‪ 7-6-2‬تابع خواندن از ورودی‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای خواندن اطالعات از ورودی از تابع ‪ scanf‬استفاده می شود‪.‬‬
‫این تابع اطالعات را ازورودی استاندارد )معموال صفحه كلید( خوانده و در‬
‫متغیرهای تعیین شده قرار می دهد‪.‬‬
‫شكل كلی این تابع بصورت زیر است‪:‬‬
‫; )>لیست آدرسهای متغیرها< ‪> ,‬رشته كنترلی<(‪scanf‬‬
‫همانطور كه می بینید نحوه احضار تابع ‪ scanf‬نیز مشابه ‪ printf‬است‪ .‬تنها‬
‫تفاوت در آن است كه در ‪ scanf‬باید لیست آدرسهای متغیرها ارسال شود‪.‬‬
‫مبحث مربوط به آدرسها در فصول بعدی بررسی خواهد شد ولی در حال حاضر‬
‫بخاطر بسپارید كه برای بدست آوردن آدرس یك متغیر از عالمت & استفاده می‬
‫كنیم‪ .‬بعنوان مثال ‪ &age‬بمعنای آدرس متغیر ‪ age‬است‪.‬‬
‫بطور كلی در ‪ C‬قدیمی هرگاه كه یك تابع دارای پارامترهای خروجی بود )یعنی‬
‫پارامترهایی كه یك مقدار را باز می گرداندند( از آدرس متغیرها استفاده می‬
‫شد كه امروزه این مسئله وجود ندارد‪.‬‬

‫ تابع خواندن از ورودی‬7-6-2
#include
void main() {
int age;
float average ;
printf("Please enter your age and average : ");
scanf("%d %f",&age,&average);
printf("You are %d years old and your average is %5.2f \n",age,average);
}

Please enter your age and average : 19 16.72
You are 19 years old and your average is 16.72

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫زبان ‪ C++‬یک زبان شی گرا است‪ ،‬بهمین دلیل در این زبان برای ورودی‬
‫و خروجی از اشیاء بجای توابع استفاده می گردد‪.‬‬
‫از آنجا که امروزه معموال برنامه نویسان ‪ C‬از کامپایلرهای ‪ C++‬استفاده‬
‫می کنند‪ ،‬می توانند از اشیای ورودی و خروجی آن نیز استفاده کنند‪.‬‬
‫اینکار در بین بسیاری از برنامه نویسان ‪ C‬متداول است‪ ،‬بهمین دلیل ما‬
‫در اینجا نحوه کار با اشیای خواندن و نوشتن در ‪ C++‬را بطور مقدماتی‬
‫توضیح می دهیم؛ گرچه توضیح کامل این موارد نیاز به آشنایی با شی‬
‫گرایی و زبان ‪ C++‬دارد‪.‬‬
‫قبل از هرچیز الزم به ذکر است که کلیه اشیای مربوط به ورودی و‬
‫خروجی در فایل سرآمدی بنام ‪ iostream.h‬تعیریف شده اند‪ ،‬بنابراین‬
‫ابتدا باید این فایل به برنامه توسط دستور ‪ #include‬الحاق گردد‪.‬‬

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫زبان ‪ C++‬برای نمایش اطالعات از یک شیئ بنام ‪ cout‬استفاده می نماید‪.‬‬
‫برای ارسال اطالعات مورد نظر برای چاپ به ‪ cout‬باید از عملگر درج در جریان‬
‫یا >> استفاده نماییم‪ .‬بعنوان مثال ‪:‬‬
‫; ” ‪cout >> “Please enter your name:‬‬
‫و یا مثال دیگر ‪:‬‬
‫;‪int a = 10‬‬
‫;‪float b = 2.86‬‬
‫;‪cout << a‬‬
‫;‪cout << b‬‬
‫نکته جالبی که در این مثالها دیده می شود‪ ،‬آنستکه برخالف تابع ‪ printf‬هیچ‬
‫نیازی به مشخص کردن نوع متغیری که قصد چاپ آن را داریم نیست و خود‬
‫شئ ‪ cout‬نوع آن را تشخیص می دهد‪.‬‬
‫عالوه براین می توان چندین عملگر درج در جریان را با یکدیگر الحاق کرد و‬
‫چندین متغیر را با یک دستور چاپ کرد‪.‬‬

C++ ‫ ورودی و خروجی اطالعات در‬7-6-3
#include
void main() {
int age = 20;
floate average = 18.23;
cout >> “You are ” >> age >> “ years old and your average is ” >> average ;
}

You are 20 years old and your average is 18.230000

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای دریافت اطالعات از کاربر‪ ،‬از شئ دیگری بنام ‪ cin‬استفاده می شود‪.‬‬
‫برای ارسال متغیر مورد نظر به ‪ cin‬باید از عملگر استخراج از جریان یا <<‬
‫استفاده نماییم‪ .‬بعنوان مثال‪:‬‬
‫;‪int a‬‬
‫;‪cin >> a‬‬
‫بازهم همانطور که می بینید نیازی به تعیین نوع متغیر موردنظر نیست و خود‬
‫شئ ‪ cin‬نوع متغیر را بطور اتوماتیک تشخیص داده و داده ای از همان نوع را از‬
‫کاربر دریافت و در متغیر مورد نظر قرار می دهد‪.‬‬
‫عملگرهای استخراج از جریان را نیز می توان با یکدیگر الحاق کرد‪.‬‬
‫برای رفتن به خط بعد در شئ ‪ cout‬می توان از دستکاری کننده ‪ endl‬استفاده‬
‫کرد‪ .‬مثال در دستور زیر پس از چاپ پیغام‪ ،‬مکان نما به خط بعد منتقل می‬
‫شود‪:‬‬
‫;‪cout >> “List of students : “ >> endl‬‬
‫البته دستکاری کننده های متعدد دیگری نیز ازجمله موارد مربوط به تعیین طول‬
‫میدان و نحوه چاپ مقادیر وجود دارد که توضیح آنها نیاز به یک مبحث مستقل‬
‫دارد‪.‬‬

C++ ‫ ورودی و خروجی اطالعات در‬7-6-3
#include
void main() {
int age;
float average ;
cout << "Please enter your age and average : " ;
cin >> age >> average ;
cout << "You are " << age << "years old and your average is " << average;
}

Please enter your age and average : 19 16.72
You are 19 years old and your average is 16.72

‫‪ 7-7‬توابع کتابخانه ای‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫همانطور که قبال نیز گفته شد‪ ،‬زبان ‪ C‬از زیر برنامه ها نیز حمایت می کند‪ .‬هر زیر برنامه‬
‫در ‪ C‬یک تابع نامیده می شود‪ .‬تا کنون با توابعی همچون ‪ main‬و یا ‪ printf‬و ‪ scanf‬آشنا‬
‫شده ایم‪.‬‬
‫معموال عرضه کنندگان کامپایلرها و یا سایر فروشندگان نرم افزار‪ ،‬برخی از توابع عمومی‬
‫را که ممکن است مورد نیاز جمع کثیری از برنامه نویسان مختلف باشد را در قالب‬
‫کتابخانه ای از توابع در اختیار برنامه نویسان می گذارند‪ .‬بعضی از این توابع کتابخانه ای‬
‫مانند ‪ printf‬و ‪ scanf‬بصورت استاندارد درآمده و توسط عرضه کنندگان مختلف ارائه می‬
‫شوند‪.‬‬
‫در کامپایلر عرضه شده توسط شرکت بورلند )‪ (Borland C++ 3.1‬نیز کتابخانه های‬
‫متعددی از توابع برای شما عرضه شده اند که بتدریج با آنها و کاربردشان آشنا خواهید‬
‫شد‪.‬‬
‫نکته مهم آنستکه برای استفاده از این توابع ابتدا باید فایل سرآمد مربوط به آنها را نیز در‬
‫ابتدای برنامه خود اضافه نمایید ) با استفاده از ‪ .(#include‬هر فایل سرآمد شامل تعاریف‬
‫اولیه گروهی از توابع مرتبط با هم و داده های مربوط به آنها بوده و در استاندارد قدیمی‬
‫تر دارای پسوند ‪ .h‬می باشد)در استاندارد جدید پسوند این فایلها حذف شده است(‪.‬‬
‫برخی از این فایلهای سرآمد عبارتند از‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪ : stdio.h‬توابع ورودی و خروجی استاندارد‬
‫‪ : math.h‬توابع ریاضی‬
‫‪ : graphics.h‬توابع مربوط به عملیات گرافیکی‬
‫‪ : string.h‬توابع مربوط به کار با رشته ها‬


Slide 7

‫مبانی کامپیوتر و برنامه سازی‬
‫فصل هفتم ‪ :‬مفاهیم اولیه زبان ‪C‬‬
‫مدرس ‪ :‬نگین معروفی‬

‫‪ 7-1‬شناسه ها در ‪C‬‬
‫‪‬‬
‫‪‬‬

‫شناسه )‪ (identifier‬نامی است که به یک قسمت از برنامه مانند متغیر‪ ،‬تابع‪ ،‬ثابت و یا‬
‫‪ ...‬داده می شود‪.‬‬
‫در زبان ‪ C‬برای انتخاب شناسه ها فقط می توان از عالئم زیر استفاده کرد‪:‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫حروف انگلیسی کوچک و بزرگ )‪(A…Z a…z‬‬
‫ارقام )‪(0…9‬‬
‫عالمت خط پایین یا _‬

‫البته یک شناسه نمی تواند با یک رقم شروع شود‪.‬‬
‫چند شناسه مجاز‪ name2 ، average ، sum :‬و ‪student_average‬‬
‫چند شناسه غیرمجاز ‪ 2name‬و یا ‪student average‬‬
‫در برنامه نویسی امروزی پیشنهاد می شود بجای شناسه هایی همانند‬
‫‪ student_average‬از ‪ studentAverage‬استفاده گردد‪.‬‬
‫نکته مهم دیگری که باید به آن اشاره کرد آنستکه زبان ‪ C‬برخالف بسیاری از زبانهای دیگر‬
‫به کوچک و بزرگی حروف حساس است )‪ .(case sensitive‬در نتیجه شناسه های زیر با‬
‫یکدیگر متفاوتند ‪:‬‬
‫‪Sum ≠ sum ≠ SUM‬‬
‫آخرین نکته اینستکه در هنگام انتخاب شناسه نمی توانید از کلمات کلیدی که برای‬
‫منظورهای خاص در زبان ‪ C‬رزرو شده اند استفاده کنید‪.‬‬

C ‫ شناسه ها در‬7-1
: C ‫کلمات کلیدی در زبان‬
auto

break

case

char

const

continue

default

do

double

else

enum

extern

float

for

goto

if

int

long

register

return

short

signed

sizeof

static

struct

switch

typedef

union

unsigned

void

volatile

while

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫محدوده‬

‫اندازه )بیت(‬

‫توضیح‬

‫نوع داده‬

‫‪-128 to +127‬‬

‫‪8‬‬

‫کاراکتر‬

‫‪char‬‬

‫‪-32768 to +32767‬‬

‫‪16‬‬

‫عدد صحیح‬

‫‪int‬‬

‫‪3.4e-38 to 3.4e+38‬‬

‫‪32‬‬

‫عدد اعشاری‬

‫‪float‬‬

‫‪1.7e-308 to 1.7e+308‬‬

‫‪64‬‬

‫عدد اعشاری با‬
‫دقت مضاعف‬

‫‪double‬‬

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫‪‬‬

‫البته چند نکته مهم درمورد این جدول قابل ذکر است ‪:‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫اندازه ‪ int‬در محیطهای ‪ 16‬بیتی مانند ‪ DOS‬برابر ‪ 16‬بیت است‪ .‬اما در‬
‫محیطهای ‪ 32‬بیتی همانند ‪ Windows‬اندازه آن ‪ 32‬بیت می باشد که در‬
‫اینصورت محدوده ای برابر ‪ -2,147,483,648‬تا ‪ +2,147,483,647‬را‬
‫پوشش می دهد‪.‬‬
‫در بعضی از کامپایلرهای ‪ ،C‬نوع داده ‪ bool‬نیز وجود دارد که می تواند‬
‫یکی از مقادیر ‪)true‬درست( یا ‪) false‬غلط( را نشان دهد ‪ .‬اما در نسخه‬
‫های اولیه ‪ C‬از همان نوع داده صحیح یا ‪ int‬برای اینکار استفاده می‬
‫شد‪ .‬بدین صورت که ‪ 0‬نشاندهنده ‪ false‬و هر عدد غیر صفر )معموال ‪(1‬‬
‫نشاندهنده ‪ true‬است‪.‬‬
‫از آنجا که برای ذخیره سازی کاراکترها کد اسکی آنها ذخیره می گردد‪،‬‬
‫از یک متغیر کاراکتری یا ‪ char‬می توان بعنوان یک عدد صحیح کوچک نیز‬
‫استفاده کرد و اعمال ریاضی برروی آنها نیز مجاز است‪.‬‬

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫عالوه براین چندین اصالح کننده نیز وجود دارد که به ما اجازه می دهد نوع داده مورد‬
‫نظر را با دقت بیشتری برای نیازهای مختلف استفاده نماییم‪.‬‬
‫این اصالح کننده ها عبارتند از ‪short, long, signed, unsigned :‬‬
‫تمام این اصالح کننده ها می توانند به نوع داده ‪ int‬اعمال شوند و اثر آنها بستگی‬
‫به محیط دارد‪.‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫در یک محیط ‪16‬بیتی‪short int ،‬بازهم برابر ‪16‬بیت است ولی ‪ long int‬برابر‪32‬بیت می‬
‫باشد‪.‬‬
‫‪ unsigned int‬باعث می شود که یک عدد ‪ 16‬بیتی بدون عالمت داشته باشیم که بازه‬
‫بین ‪ 0‬تا ‪ 65535‬را پوشش می دهد‪ signed int .‬نیز همانند ‪ int‬معمولی بوده و تفاوتی‬
‫ندارد‪.‬‬
‫ترکیب این اصالح کننده ها نیز ممکن است‪ .‬مثال ‪ unsigned long int‬یک عدد ‪ 32‬بیتی‬
‫بدون عالمت است که بازه ‪ 0‬تا ‪ 4,294,967,295‬را پوشش می دهد‪.‬‬

‫برروی نوع داده ‪ char‬فقط اصالح کننده های ‪ signed‬و ‪ unsigned‬را می توان اعمال‬
‫کرد‪ .‬معموال از اصالح کننده ‪ unsigned‬وقتی استفاده می شود که قصد داشته‬
‫باشیم از ‪ char‬بعنوان یک عدد صحیح مثبت بین ‪ 0‬تا ‪ 255‬استفاده کنیم‪.‬‬
‫برروی نوع داده ‪ double‬تنها اصالح کننده ‪ long‬قابل اعمال است و دراینصورت عدد‬
‫اعشاری با ‪ 80‬بیت را خواهیم داشت که قادر است هر عددی در بازه ‪ 3.4e-4932‬تا‬
‫‪ 1.1e+4932‬را در خود نگاه دارد‪.‬‬

‫‪ 7-3‬تعریف متغیرها‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای تعریف متغیرها به شکل زیر عمل می کنیم‪:‬‬

‫;>‪ ‫که ‪ type‬یکی از نوع داده های گفته شده و ‪ variable-list‬لیستی از متغیرها است‬
‫که با کاما از یکدیگر جدا شده اند‪ .‬بعنوان مثال ‪:‬‬
‫;‪int sum‬‬
‫;‪float average‬‬
‫; ‪long int a, b, c‬‬
‫; ‪unsigned long int i, j, k‬‬
‫عالوه براین می توان در هنگام تعریف متغیر به آن مقدار اولیه نیز داد‪ .‬مثال ‪:‬‬
‫; ‪int d = 0‬‬
‫نكته مهم آنكه زبان ‪ C‬به متغیرها مقدار اولیه نمي دهد )حتي ‪ (0‬و برنامه نويس‬
‫خود بايد اينكار را صريحا انجام دهد‪ ،‬درغیر اينصورت مقدار اولیه متغیر‪ ،‬نامعین خواهد‬
‫بود‪.‬‬
‫تعریف متغیرها طبق اصول زبان ‪ C‬میتواند درهرجایی از برنامه صورت پذیرد‪ ،‬و‬
‫متغیرهای تعریف شده از همان خط به بعد قابل استفاده خواهد بود‪ .‬اما معموال‬
‫توصیه می گردد كه تعریف متغیرها در همان خط ابتدایی تابع و بالفاصله پس از {‬
‫صورت پذیرد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫‪‬‬
‫‪‬‬

‫ثابتها مقادیر ثابتی هستند كه مقدار آنها در حین اجرای برنامه تغییر نمی یابد‪ .‬ثابتها می توانند از‬
‫هریك از نوع داده های اصلی باشند‪.‬‬
‫ثوابت عددی صحیح ‪:‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫برای نمایش این دسته از ثوابت‪ ،‬از دنباله ای از ارقام بعالوه عالمت ‪ +‬یا ‪ -‬استفاده می كنیم‪ .‬بعنوان مثال‬
‫‪ -45‬و یا ‪ 3489‬ثوابت صحیح هستند‪.‬‬
‫در حالت عادی ‪ C‬هر عدد را در كوچكترین نوع داده ای كه می تواند قرار می دهد‪ .‬مثال عدد ‪ 85‬در یك‬
‫‪ int‬قرار می گیرد‪ ،‬اما عدد ‪ 145398‬در یك ‪ long int‬قرار خواهد گرفت‪.‬‬
‫اگر قصد دارید یك عدد كوچك بعنوان ‪ long‬محسوب گردد‪ ،‬می توانید از پسوند ‪ L‬در انتهای آن استفاده‬
‫می كنیم‪ .‬مثال ‪245L‬یك عدد ‪ long‬محسوب می شود‪.‬‬
‫;‪long int a = 20L‬‬
‫پسوند ‪ U‬در انتهای عدد نیز نشانه بدون عالمت بودن آن است‪.‬‬
‫نكته دیگر آنكه ‪ C‬به شما اجازه می دهد درصورت لزوم ثوابت صحیح خود را در مبنای ‪ 8‬یا ‪ 16‬نیز كه‬
‫از مبناهای متداول در برنامه نویسی هستند‪ ،‬بنویسید‪.‬‬
‫‪‬‬
‫‪‬‬

‫برای نوشتن عدد در مبنای ‪ 8‬باید آن را با ‪ 0‬آغاز كنید‪ ،‬مثال ‪ 0342‬یك عدد در منای ‪ 8‬محسوب می‬
‫گردد‪.‬‬
‫برای نوشتن یك عدد در مبنای ‪ 16‬باید آن را با ‪ 0x‬آغاز نمایید‪ ،‬مانند ‪.0x27A4‬‬

‫‪ 7-4‬ثوابت‬
‫ثوابت عددی اعشاری‬

‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫برای نمایش اعداد اعشاری‪ ،‬باید از نقطه اعشار استفاده كنیم‪ ،‬مانند ‪237.45‬‬
‫اما نكته جالب آنستكه می توانید از نماد علمی نیز برای نمایش اعداد‬
‫اعشاری استفاده كنید‪ .‬برای اینكار كافی است از حرف ‪ e‬برای نمایش قسمت‬
‫توان استفاده نمایید‪ .‬بعنوان مثال ‪:‬‬
‫‪-23.47 × 10 5 = -23.47e5‬‬
‫‪42.389 × 10 -3 = 42.389e-3‬‬
‫دقت كنید كه قسمت توان‪ ،‬حتما یك عدد صحیح است‪.‬‬
‫نكته جالب اینجاست كه برخالف مورد قبل‪ ،‬كامپایلر بطور پیش فرض داده های‬
‫اعشاری را از نوع ‪ double‬فرض می كند‪.‬چنانچه دوست دارید ثابت شما ازنوع‬
‫‪ float‬درنظر گرفته شود‪ ،‬در انتهای آن ‪ F‬قرار دهید‪ .‬ضمنا پسوند ‪ L‬نیز داده‬
‫اعشاری را از نوع ‪ long double‬درنظر می گیرد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫ثوابت كاراكتری ‪:‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫برای نشان دادن ثوابت كاراكتری‪ ،‬آنها را در داخل ' قرار می دهیم‪ .‬بعنوان مثال‬
‫'‪'A‬یك ثابت كاراكتری است‪.‬‬
‫; '‪char ch = 'S‬‬
‫دقت كنید كه همانطور كه قبال گفته شد‪ ،‬كد اسكی كاراكترها در متغیر ذخیره‬
‫می گردد‪ ،‬بنابراین می توان از آن بعنوان یك عدد صحیح نیز استفاده كرد‪ .‬نكته‬
‫مهم دیگر آنستكه به تفاوت عدد ‪ 5‬و كاراكتر '‪ '5‬دقت داشته باشید‪ .‬در حقیقت‬
‫'‪ '5‬برابر است با عدد ‪ 53‬كه همان كد اسكی آن است‪.‬‬
‫روش فوق‪ ،‬برای نمایش کاراکترهای قابل چاپ مناسب است‪ ،‬اما بعضی‬
‫كاراكترها مانند ‪ enter‬قابل نمایش نبوده و برای آنها شکل خاصی وجود ندارد‪.‬‬
‫در چنین مواردی‪ ،‬زبان ‪ C‬از ترکیب عالمت \ به همراه یک کاراکتر دیگر‪ ،‬برای‬
‫نمایش این قبیل کاراکترها استفاده می نماید‪ .‬بعنوان مثال‪ ،‬کاراکتر '‪ '\n‬نشان‬
‫دهنده خط جدید یا همان ‪ enter‬می باشد‪.‬‬
‫جدول صفحه بعد این قبیل کاراکترها و معادل آنها را نشان می دهد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫نحوه نمایش در ‪C‬‬

‫کد اسکی‬

‫صدای بوق کامپیوتر‬

‫‪\a‬‬

‫‪7‬‬

‫حرکت به عقب ‪backspace‬‬

‫‪\b‬‬

‫‪8‬‬

‫شروع صفحه ‪form feed‬‬

‫‪\f‬‬

‫‪12‬‬

‫سطر جدید ‪line feed‬‬

‫‪\n‬‬

‫‪10‬‬

‫برگشت به ابتداي سطر ‪carriage return‬‬

‫‪\r‬‬

‫‪13‬‬

‫فاصله افقی ‪horizontal tab‬‬

‫‪\t‬‬

‫‪9‬‬

‫فاصله عمودی ‪vertical tab‬‬

‫‪\v‬‬

‫‪11‬‬

‫عالمت سوال‬

‫?\‬

‫‪63‬‬

‫عالمت '‬

‫'\‬

‫‪39‬‬

‫عالمت "‬

‫"\‬

‫‪34‬‬

‫عالمت \‬

‫\\‬

‫‪92‬‬

‫عالمت تهی‬

‫‪\0‬‬

‫‪0‬‬

‫نام کاراکتر‬

‫کد اسکی یک کاراکتر با ‪ 3‬رقم در مبنای ‪8‬‬

‫‪\000‬‬

‫کد اسکی یک کاراکتر با ‪ 2‬رقم در مبنای ‪16‬‬

‫‪\x00‬‬

‫‪ 7-4‬ثوابت‬
‫‪‬‬

‫ثوابت رشته ای ‪ C :‬عالوه بر ثوابت فوق‪ ،‬از یك ثابت دیگر بنام رشته نیز‬
‫حمایت می كند‪ .‬رشته‪ ،‬دنباله ای از كاراكترها است كه در داخل " قرار‬
‫می گیرند‪ .‬بعنوان مثال "‪ "this is a test‬یك رشته است‪ .‬دقت كنید كه '‪'a‬‬
‫یك كاراكتر است‪ ،‬اما "‪ "a‬یك رشته است كه فقط شامل یك كاراكتر می‬
‫باشد‪.‬‬

‫‪ 7-5‬عملگرها‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫عملگر‪ ،‬نمادی است كه به كامپایلر می گوید تا عملیات محاسباتی یا‬
‫منطقی خاصی را برروی یك یا چند عملوند‪ ،‬انجام دهد‪.‬‬
‫به عملگرهایی كه فقط یك عملوند دارند‪ ،‬عملگر یكانی می گوییم و‬
‫همواره عملگر در سمت چپ عملوند قرار می گیرد)مانند عدد ‪.(-125‬‬
‫اما عملگرهایی كه برروی دو عملوند اثر می كنند را عملگر دودویی‬
‫نامیده و عملگر را بین دو عملوند قرار می دهیم )مانند ‪.(23+86‬‬
‫هر ترکیب درستی از عملگرها و عملوندها را یک عبارت می نامیم‪.‬‬
‫‪ C‬از نقطه نظر عملگرها یك زبان بسیار قوی است‪ .‬این عملگرها به چند‬
‫دسته اصلی تقسیم می گردند كه آنها را به ترتیب بررسی می كنیم‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫این عملگرها‪ ،‬همان اعمال متداول ریاضی هستند كه در زبان ‪ C‬مورد استفاده‬
‫قرار می گیرند‪ .‬این اعمال عبارتند از ‪:‬‬

‫عمل‬

‫نوع‬

‫عملگر‬

‫منفی كردن عملوند سمت راست‬

‫یكانی‬

‫‪-‬‬

‫جمع دو عملوند‬

‫دودویی‬

‫‪+‬‬

‫تفریق دو عملوند‬

‫دودویی‬

‫‪-‬‬

‫ضرب دو عملوند‬

‫دودویی‬

‫*‬

‫تقسیم دو عملوند‬

‫دودویی‬

‫‪/‬‬

‫محاسبه باقیمانده تقسیم دو عملوند‬

‫دودویی‬

‫‪%‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬
‫‪‬‬

‫این عملگرهای برروی همه انواع داده های ‪ C‬عمل می كنند‪ ،‬بجز عملگر ‪ %‬كه فقط‬
‫برروی نوع داده های صحیح عمل می كند‪.‬‬
‫اما نكته مهمی كه باید به آن اشاره كرد‪ ،‬نحوه كار عملگر تقسیم برروی نوع داده های‬
‫مختلف است‪.‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫درصورتیكه هردو عملوند صحیح باشند‪ ،‬تقسیم بصورت صحیح بر صحیح انجام خواهد شد‪.‬‬
‫اگر یكی یا هر دو عملوند اعشاری باشند‪ ،‬تقسیم بصورت اعشاری انجام خواهد پذیرفت‪.‬‬
‫فرض كنید تعاریف زیر را داریم ‪:‬‬
‫; ‪int a,b‬‬
‫; ‪float c,d‬‬
‫; ‪a = 10 ; b = 4‬‬
‫;‪c = 8.2; d = 4.0‬‬
‫اكنون به نتایج عملیات زیر دقت كنید ‪:‬‬
‫‪a / b => 2‬‬
‫‪c / d => 2.05‬‬
‫‪a / d => 2.5‬‬
‫‪a / 4 => 2‬‬
‫چنانچه به آخرین مورد توجه كنید‪ ،‬متوجه می شوید كه از آنجا كه ‪a‬یك متغیر صحیح است و ‪4‬‬
‫نیز یك ثابت صحیح در نظر گرفته شده‪ ،‬درنتیجه تقسیم بصورت صحیح بر صحیح انجام گرفته‬
‫است‪ .‬چنانچه بخواهیم تقسیم بصورت اعشاری صورت پذیرد‪ ،‬به دو شكل می توانیم عمل‬
‫كنیم‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫برای اینکه عبارت تقسیم صفحه قبل بصورت اعشاری انجام شود‪ ،‬به دو روش‬
‫می توان عمل کرد‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫این عبارت را بصورت ‪ a / 4.0‬بنویسیم‪.‬‬
‫از عملگر قالب ریزی استفاده كنیم‪.‬‬

‫عملگر قالب ریزی می تواند یك نوع را به نوع دیگری تبدیل نماید‪ .‬شكل كلی آن‬
‫به شكل زیر است ‪:‬‬
‫>‪() ‫كه ‪ type‬نوع مورد نظر است كه قصد تبدیل عبارت ‪ expression‬به آن نوع را‬
‫داریم‪ .‬بعنوان مثال در مورد قبلی می توان به شكل زیر عمل كرد ‪:‬‬
‫‪(float) a / 4‬‬
‫در این حالت از كامپایلر خواسته ایم كه ابتدا عدد ‪ a‬را به اعشاری تبدیل كند‬
‫)البته بصورت موقت( و سپس آن را بر ‪ 4‬تقسیم نماید‪ ،‬كه مسلما حاصل‬
‫اعشاری خواهد بود‪.‬‬
‫بطوركلی هرگاه ثابتها و متغیرهایی از انواع مختلف در یك عبارت محاسباتی‬
‫داشته باشیم‪ ،‬كامپایلر ‪ C‬همه آنها را به یك نوع یكسان كه همان بزرگترین‬
‫عملوند موجود است تبدیل خواهد كرد‪ .‬بعنوان مثال به مورد صفحه بعد دقت‬
‫كنید ‪:‬‬

‫ عملگرهای محاسباتی‬7-5-1
char ch;
int i;

float f;
double d;
result = (ch / i)
int

+

(f *d)

(f+i)
float

double

double

int

-

double

double

float

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫اولویت عملگرها ‪ :‬در عبارتی که شامل چندین عملگر است‪ ،‬کدامیک در‬
‫ابتدا اعمال خواهد گردید‪.‬‬
‫اولویت عملگرهای محاسباتی از باال به پایین بشرح زیر است‪:‬‬
‫‪ ‬عملگر یکانی –‬
‫‪ ‬عملگرهای * و ‪ /‬و ‪%‬‬
‫‪ ‬عملگرهای ‪ +‬و –‬
‫چنانچه اولویت دو عملگر یکسان باشد‪ ،‬این عملگرها از چپ به راست‬
‫محاسبه خواهند شد‪.‬‬
‫چنانچه بخواهیم یک عمل با اولویت پایین زودتر انجام شود‪ ،‬باید از پرانتز‬
‫استفاده کنیم‪ .‬بنابراین اولویت عملگر پرانتز از همه موارد فوق‬
‫بیشتراست‪ .‬در مورد پرانتزهای متداخل‪ ،‬ابتدا پرانتز داخلی محاسبه‬
‫می شود؛ اما در مورد پرانتزهای هم سطح‪ ،‬ابتدا پرانتز سمت چپتر‬
‫محاسبه می گردد‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫چند مثال در مورد اولویت عملگرها‬

‫ترتیب اجرای عملگرها‬

‫عبارت زبان ‪C‬‬

‫ابتدا عمل * و سپس عمل ‪+‬‬

‫‪b+c*d‬‬

‫ابتدا عمل ‪ +‬و سپس عمل *‬

‫‪(b + c) * d‬‬

‫ابتدا عمل ‪ /‬سپس عمل * و در انتها عمل ‪+‬‬

‫‪b+c/d*e‬‬

‫ابتدا عمل * سپس عمل ‪ /‬و در انتها عمل ‪+‬‬

‫)‪b + c / (d * e‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫یک مثال کامل در مورد اولویت عملگرها‬

‫‪result = a + b * (f – (g + b) / d) – c * (a – d) / e‬‬
‫‪6‬‬

‫‪1‬‬
‫‪7‬‬

‫‪2‬‬

‫‪8‬‬

‫‪3‬‬
‫‪4‬‬
‫‪5‬‬
‫‪9‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫در زبان ‪ C‬برای انتساب چندین عملگر وجود دارد‪ .‬ساده ترین عملگر انتساب‪ ،‬همان عملگر =‬
‫است که در بسیاری از زبانها استفاده می شود‪ .‬بعنوان مثال ‪:‬‬
‫;‪a = 5‬‬
‫;‪b = c + 2 * d‬‬
‫این عملگر باعث می شود که عبارت سمت راست در عبارت سمت چپ قرار گیرد‪.‬‬
‫توجه کنید که مقدار سمت چپ باید عبارتی باشد که بتوان به آن یک مقدار را نسبت داد‬
‫)مانند یک متغیر( که به آن ‪ Lvalue‬گفته می شود‪ ،‬بنابراین یک ثابت نمی تواند در سمت چپ‬
‫قرار گیرد‪.‬‬
‫نکته دیگر اینکه اولویت عملگر = از عملگرهای ریاضی کمتر است و درنتیجه ابتدا آن عملیات‬
‫انجام شده و در پایان حاصل در عبارت سمت چپ ریخته می شود‪.‬‬
‫الزم به ذکر است که در هنگام انتساب‪ ،‬درصورت لزوم نوع عبارت سمت راست به نوع عبارت‬
‫سمت چپ تبدیل می شود‪ .‬مثال‪:‬‬
‫;‪int a‬‬
‫;‪a = 2.5 * 5.0‬‬
‫که دراینصورت عدد ‪ 12‬در ‪ a‬ذخیره خواهد شد‪.‬‬
‫شرکت پذیری این عملگر از راست به چپ می باشد‪ ،‬بدین معنا که چنانچه چندین عملگر‬
‫نسبت دهی داشته باشیم‪ ،‬این عملگرها از راست به چپ محاسبه می شوند‪ .‬مثال پس از‬
‫اجرای دستور زیر‪ ،‬مقدار هر ‪ 3‬متغیر برابر ‪ 10‬خواهد شد‪.‬‬
‫;‪a = b = c = 10‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬

‫نکته جالب درمورد زبان ‪ C‬آنستکه دارای یک سری عملگرهای انتساب‬
‫خالصه شده است که باعث می شوند در بعضی موارد بتوانیم عبارات‬
‫کوتاهتری را بنویسیم‪ .‬این عملگرها عبارتند از ‪:‬‬
‫عملگرد‬

‫مثال‬

‫عبارت انتساب معادل‬

‫‪++‬‬

‫;‪a ++‬‬

‫;‪a = a + 1‬‬

‫‪--‬‬

‫;‪a --‬‬

‫;‪a = a – 1‬‬

‫=‪+‬‬

‫;‪a += 5‬‬

‫;‪a = a + 5‬‬

‫=‪-‬‬

‫;‪a -= 8‬‬

‫;‪a= a – 8‬‬

‫=*‬

‫;‪a *= 10‬‬

‫;‪a= a * 10‬‬

‫=‪/‬‬

‫;‪a /= 2‬‬

‫;‪a = a / 2‬‬

‫=‪%‬‬

‫;‪a %= 10‬‬

‫;‪a = a % 10‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬
‫‪‬‬

‫عملگر اول و دوم‪ ،‬عملگرهای یکانی هستند که بترتیب عملگر افزایش و عملگر کاهش‬
‫نامیده می شوند‪.‬‬
‫نکته جالب آنستکه این دو عملگر به دوصورت مورد استفاده قرار می گیرند‪.‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫در حالتی که از دستور ;‪ a ++‬استفاده شود به آن پس افزایش می گویند و بدین معناست که‬
‫ابتدا از مقدار فعلی ‪ a‬در عبارت موردنظر استفاده کن و سپس آن را افزایش بده‪.‬‬
‫اما دستور ;‪ ++ a‬که به آن پیش افزایش گفته می شود‪ ،‬ابتدا ‪ a‬را افزایش داده و سپس از آن‬
‫در عبارت استفاده می کند‪.‬‬
‫به برنامه زیر دقت کنید‪:‬‬

‫>‪#include ‫{ )(‪void main‬‬
‫; ‪int a ,b‬‬
‫;‪a=5‬‬
‫;‪b = a ++‬‬
‫;)‪printf(“a=%d and b=%d \n”,a,b‬‬
‫;‪a=5‬‬
‫;‪b = ++ a‬‬
‫;)‪printf(“a=%d and b=%d \n”,a,b‬‬
‫}‬
‫‪a=6 b=5‬‬
‫‪a=6 b=6‬‬

‫‪ 7-5-3‬عملگرهای مقایسه ای‬
‫‪‬‬

‫‪‬‬

‫این عملگرها دو عبارت را بایکدیگر مقایسه کرده و نتیجه را باز می گردانند‪.‬‬
‫نتیجه می تواند درست )‪ (true‬یا غلط )‪ (false‬باشد‪.‬‬
‫نتیجه این عملگرها یک عدد صحیح است که درصورت درست بودن ‪ 1‬و‬
‫درصورت غلط بودن ‪ 0‬باز می گردانند‪ .‬این عملگرها عبارتند از‪:‬‬
‫عملگر‬

‫مفهوم عملگر‬

‫مثال‬

‫<‬

‫بزرگتر )<(‬

‫‪a>b‬‬

‫>‬

‫کوچکتر )>(‬

‫‪a
‫=<‬

‫بزرگتر یا مساوی )≤(‬

‫‪a >= b‬‬

‫=>‬

‫کوچکتر یا مساوی )≥(‬

‫‪a <= b‬‬

‫==‬

‫مساوی )=(‬

‫‪a == b‬‬

‫=!‬

‫نامساوی )≠(‬

‫‪a != b‬‬

‫‪ 7-5-3‬عملگرهای مقایسه ای‬
‫‪‬‬

‫‪‬‬

‫نکته مهمی که باید به آن دقت کرد عملگر مساوی )==( است‪ ،‬چرا که یک‬
‫اشتباه بسیار متداول برنامه نویسان ‪ C‬استفاده اشتباه از عملگر انتساب‬
‫)=( بجای عملگر تساوی )==( است که باعث ایجاد خطا در برنامه می‬
‫شود‪.‬‬
‫اولویت این عملگرها از باال به پایین بشرح زیر است‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫عملگرهای <‪ <= ، > ،‬و =>‬
‫عملگرهای == و =!‬

‫الزم بذکر است که در هنگام مساوی بودن اولویت چند عملگر‪ ،‬این عملگرها‬
‫از چپ به راست محاسبه می گردند‪.‬‬

‫‪ 7-5-4‬عملگرهای منطقی‬
‫‪‬‬

‫این عملگرها به شما اجازه می دهند که شرطهای ساده ای را که با‬
‫استفاده از عملگرهای مقایسه ای ایجاد شده اند را با یکدیگر ترکیب نموده‬
‫و شرطهای پیچیده تری را بسازید‪ .‬این عملگرها عبارتند از ‪:‬‬
‫مثال‬

‫عملگر‬

‫مفهوم عملگر‬

‫نحوه کار‬

‫&&‬

‫‪ AND‬منطقی‬

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

‫‪a>0 && sw==1‬‬

‫||‬

‫‪ OR‬منطقی‬

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

‫‪a<=100 || b!=0‬‬

‫!‬

‫‪ NOT‬منطقی‬

‫اگر عملوند درست باشد‪ ،‬نادرست و‬
‫اگر نادرست باشد‪ ،‬درست برمی‬
‫گرداند‪.‬‬

‫)‪! (a==1 || b<10‬‬

‫‪ 7-5-5‬عملگر شرطی‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫گاهی الزم است که ابتدا یک شرط بررسی شده و سپس برمبنای نتیجه )درست یا نادرست بودن آن( یکی‬
‫از دو عبارت ممکن بازگردانده شود‪ .‬برای اینکار می توان از یک عملگر ‪3‬تایی )با ‪ 3‬عملوند( بنام عملگر‬
‫شرطی استفاده نمود‪.‬‬
‫شکل کلی این عملگر بصورت زیر است‪:‬‬
‫>عبارت‪> :<2‬عبارت‪> ?<1‬شرط<‬
‫نحوه کار بدینصورت است که درصورت درست بودن شرط‪ ،‬عبارت‪ 1‬و در غیراینصورت عبارت ‪ 2‬بازگردانده می‬
‫شود‪.‬‬
‫به عنوان مثال به دستور زیر توجه کنید‪:‬‬
‫که این عبارت معادل دستور زیر است‪:‬‬

‫‪‬‬

‫;‪a = (k<10) ? 100 : 50‬‬
‫;‪if (k<10) a=100‬‬
‫;‪else a=50‬‬

‫البته این عبارت به شکلهای پیچیده نیز می تواند مورد استفاده قرار گیرد‪ .‬مثال ‪:‬‬
‫;‪c += (a>0 && a<10) ? ++a : a/b‬‬
‫که معادل است با ‪:‬‬
‫{ )‪if (a>0 && a<10‬‬
‫;‪a= a + 1‬‬
‫;‪c = c + a‬‬
‫}‬
‫;‪else c = c + a/b‬‬

‫‪ 7-5-6‬اولویت عملگرها‬
‫عملگر‬

‫اولویت‬

‫شرکت پذیری‬

‫‪1‬‬

‫)(‬

‫از چپ به راست‬

‫‪2‬‬

‫‪- + ! -- ++‬‬

‫از راست به چپ‬

‫‪3‬‬

‫‪* / %‬‬

‫از چپ به راست‬

‫‪4‬‬

‫‪+ -‬‬

‫از چپ به راست‬

‫‪5‬‬

‫>> <<‬

‫از چپ به راست‬

‫‪6‬‬

‫>= > <= <‬

‫از چپ به راست‬

‫‪7‬‬

‫=! ==‬

‫از چپ به راست‬

‫‪8‬‬

‫&&‬

‫از چپ به راست‬

‫‪9‬‬

‫||‬

‫از چپ به راست‬

‫‪10‬‬

‫‪?:‬‬

‫از راست به چپ‬

‫‪11‬‬

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

‫از راست به چپ‬

‫‪12‬‬

‫‪,‬‬

‫از چپ به راست‬

‫‪ 7-6‬خواندن و نمایش اطالعات‬
‫‪‬‬

‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫همانطور كه قبال نیز گفته شد‪ ،‬یكی از اهداف زبان ‪ C‬قابل حمل بودن آن‬
‫است‪ .‬بهمین منظور سعی شده است كه از دستوراتی كه ممكن است‬
‫وابسته به ماشین خاصی باشد‪ ،‬اجتناب گردد‪.‬‬
‫بهمین دلیل زبان ‪ C‬برخالف سایر زبانها دارای هیچ دستوری برای‬
‫خواندن از ورودی و یا نوشتن در خروجی نیست‪.‬‬
‫اما در عوض دارای تعدادی تابع )زیربرنامه( استاندارد می باشد كه تقریبا‬
‫تمامی كامپایلرها از آنها حمایت می كنند‪.‬‬
‫این كار به كامپایلر این امكان را می دهد كه بر حسب نوع سخت افزار‬
‫موردنظر‪ ،‬توابع ورودی و خروجی را طراحی نماید‪.‬‬
‫این توابع در یك فایل سرآمد بنام ‪ stdio.h‬تعریف شده اند و بنابراین قبل‬
‫ازاینكه بتوانید از این توابع استفاده نمایید‪ ،‬باید این فایل را نیز با استفاده‬
‫از ‪ #include‬در برنامه خود بگنجانید‪.‬‬

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫برای نمایش اطالعات در خروجی از تابع ‪ printf‬استفاده می شود‪.‬‬
‫این تابع رشته موردنظر شما را به خروجی استاندارد )كه در حالت‬
‫عادی همان صفحه نمایش یا مانیتور است( می فرستد‪ .‬شكل كلی این‬
‫تابع بصورت زیر است‪:‬‬
‫; )>لیست متغیرها< ‪> ,‬رشته كنترلی<(‪printf‬‬
‫رشته كنترلی همان متنی است كه قصد چاپ آن را داریم‪ ،‬با ذكر این‬
‫نكته كه در قسمتهایی كه باید مقدار یك متغیر چاپ شود‪ ،‬از یك‬
‫مشخصه تبدیل استفاده می شود‪ .‬هر مشخصه تبدیل از یك عالمت ‪%‬‬
‫بعالوه یك كاراكتر كه نوع متغیر مورد نظر را نشان می دهد تشكیل می‬
‫گردد‪.‬‬
‫لیست متغیرها نیز همان متغیرهایی هستند كه قصد چاپ آنها را داریم‪.‬‬
‫این متغیرها باید بترتیب قرار گرفته و با كاما )‪ (,‬از یكدیگر جدا شوند‪.‬‬

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫مشخصه تبدیل‬

‫مفهوم‬

‫‪%c‬‬

‫كاراكتر‬

‫‪%d‬‬

‫عدد صحیح در مبنای ‪10‬‬

‫‪%f‬‬

‫عدد اعشاری بدون نماد علمی‬

‫‪%e‬‬

‫عدد اعشاری با نماد علمی‬

‫‪%g‬‬

‫عدد اعشاری با حالت كوتاهتر بین ‪ e‬و ‪f‬‬

‫‪%s‬‬

‫رشته‬

‫‪%ld‬‬

‫عدد صحیح بزرگ‬

‫‪%lf %le %lg‬‬

‫عدد اعشاری بزرگ‬

‫‪%o‬‬

‫عدد صحیح در مبنای ‪8‬‬

‫‪%x‬‬

‫عدد صحیحی در مبنای ‪16‬‬

‫‪%u‬‬

‫عدد صحیح بدون عالمت‬

‫ تابع نمایش در خروجی‬7-6-1
#include
void main() {
int age = 20;
floate average = 18.23;
printf("You are %d years old and your average is %f \n",age,average);
}
You are 20 years old and your average is 18.230000

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫‪‬‬
‫‪‬‬

‫برای کنترل نحوه چاپ اعداد می توانید از مشخصه طول میدان استفاده‬
‫کنید‪.‬‬
‫مشخصه طول میدان برای اعداد به شكل زیر استفاده می شود‪:‬‬
‫‪ ‬برای اعداد صحیح از ‪ %nd‬استفاده می كنیم كه ‪ n‬تعداد ارقام را نشان‬
‫می دهد )مثال ‪ .(%3d‬در اینصورت برای هر متغیر ‪ n‬رقم درنظر گرفته‬
‫می شود‪ .‬اگر اندازه عدد از ‪ n‬كوچكتر باشد‪ ،‬به سمت چپ آن فضای‬
‫خالی اضافه می شود و اگر اندازه عدد بیش از ‪ n‬رقم باشد‪ ،‬طول میدان‬
‫نادیده گرفته شده و عدد بطور كامل چاپ می شود‪.‬‬
‫‪ ‬برای اعداد اعشاری از ‪ %n.mf‬استفاده می كنیم كه ‪ n‬اندازه كل عدد‬
‫)شامل عالمت ممیز( و ‪ m‬تعداد ارقام اعشار است )مثال ‪ .(%5.2f‬در‬
‫صورتیكه تعداد ارقام اعشاری عدد موردنظر از ‪ m‬بیشتر باشد‪ ،‬عدد به ‪m‬‬
‫عدد اعشار گرد می شود و در صورتیكه از ‪ m‬كمتر باشد‪ ،‬در سمت‬
‫راست آن ‪ 0‬قرار داده می شود‪.‬‬

‫‪ 7-6-2‬تابع خواندن از ورودی‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای خواندن اطالعات از ورودی از تابع ‪ scanf‬استفاده می شود‪.‬‬
‫این تابع اطالعات را ازورودی استاندارد )معموال صفحه كلید( خوانده و در‬
‫متغیرهای تعیین شده قرار می دهد‪.‬‬
‫شكل كلی این تابع بصورت زیر است‪:‬‬
‫; )>لیست آدرسهای متغیرها< ‪> ,‬رشته كنترلی<(‪scanf‬‬
‫همانطور كه می بینید نحوه احضار تابع ‪ scanf‬نیز مشابه ‪ printf‬است‪ .‬تنها‬
‫تفاوت در آن است كه در ‪ scanf‬باید لیست آدرسهای متغیرها ارسال شود‪.‬‬
‫مبحث مربوط به آدرسها در فصول بعدی بررسی خواهد شد ولی در حال حاضر‬
‫بخاطر بسپارید كه برای بدست آوردن آدرس یك متغیر از عالمت & استفاده می‬
‫كنیم‪ .‬بعنوان مثال ‪ &age‬بمعنای آدرس متغیر ‪ age‬است‪.‬‬
‫بطور كلی در ‪ C‬قدیمی هرگاه كه یك تابع دارای پارامترهای خروجی بود )یعنی‬
‫پارامترهایی كه یك مقدار را باز می گرداندند( از آدرس متغیرها استفاده می‬
‫شد كه امروزه این مسئله وجود ندارد‪.‬‬

‫ تابع خواندن از ورودی‬7-6-2
#include
void main() {
int age;
float average ;
printf("Please enter your age and average : ");
scanf("%d %f",&age,&average);
printf("You are %d years old and your average is %5.2f \n",age,average);
}

Please enter your age and average : 19 16.72
You are 19 years old and your average is 16.72

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫زبان ‪ C++‬یک زبان شی گرا است‪ ،‬بهمین دلیل در این زبان برای ورودی‬
‫و خروجی از اشیاء بجای توابع استفاده می گردد‪.‬‬
‫از آنجا که امروزه معموال برنامه نویسان ‪ C‬از کامپایلرهای ‪ C++‬استفاده‬
‫می کنند‪ ،‬می توانند از اشیای ورودی و خروجی آن نیز استفاده کنند‪.‬‬
‫اینکار در بین بسیاری از برنامه نویسان ‪ C‬متداول است‪ ،‬بهمین دلیل ما‬
‫در اینجا نحوه کار با اشیای خواندن و نوشتن در ‪ C++‬را بطور مقدماتی‬
‫توضیح می دهیم؛ گرچه توضیح کامل این موارد نیاز به آشنایی با شی‬
‫گرایی و زبان ‪ C++‬دارد‪.‬‬
‫قبل از هرچیز الزم به ذکر است که کلیه اشیای مربوط به ورودی و‬
‫خروجی در فایل سرآمدی بنام ‪ iostream.h‬تعیریف شده اند‪ ،‬بنابراین‬
‫ابتدا باید این فایل به برنامه توسط دستور ‪ #include‬الحاق گردد‪.‬‬

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫زبان ‪ C++‬برای نمایش اطالعات از یک شیئ بنام ‪ cout‬استفاده می نماید‪.‬‬
‫برای ارسال اطالعات مورد نظر برای چاپ به ‪ cout‬باید از عملگر درج در جریان‬
‫یا >> استفاده نماییم‪ .‬بعنوان مثال ‪:‬‬
‫; ” ‪cout >> “Please enter your name:‬‬
‫و یا مثال دیگر ‪:‬‬
‫;‪int a = 10‬‬
‫;‪float b = 2.86‬‬
‫;‪cout << a‬‬
‫;‪cout << b‬‬
‫نکته جالبی که در این مثالها دیده می شود‪ ،‬آنستکه برخالف تابع ‪ printf‬هیچ‬
‫نیازی به مشخص کردن نوع متغیری که قصد چاپ آن را داریم نیست و خود‬
‫شئ ‪ cout‬نوع آن را تشخیص می دهد‪.‬‬
‫عالوه براین می توان چندین عملگر درج در جریان را با یکدیگر الحاق کرد و‬
‫چندین متغیر را با یک دستور چاپ کرد‪.‬‬

C++ ‫ ورودی و خروجی اطالعات در‬7-6-3
#include
void main() {
int age = 20;
floate average = 18.23;
cout >> “You are ” >> age >> “ years old and your average is ” >> average ;
}

You are 20 years old and your average is 18.230000

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای دریافت اطالعات از کاربر‪ ،‬از شئ دیگری بنام ‪ cin‬استفاده می شود‪.‬‬
‫برای ارسال متغیر مورد نظر به ‪ cin‬باید از عملگر استخراج از جریان یا <<‬
‫استفاده نماییم‪ .‬بعنوان مثال‪:‬‬
‫;‪int a‬‬
‫;‪cin >> a‬‬
‫بازهم همانطور که می بینید نیازی به تعیین نوع متغیر موردنظر نیست و خود‬
‫شئ ‪ cin‬نوع متغیر را بطور اتوماتیک تشخیص داده و داده ای از همان نوع را از‬
‫کاربر دریافت و در متغیر مورد نظر قرار می دهد‪.‬‬
‫عملگرهای استخراج از جریان را نیز می توان با یکدیگر الحاق کرد‪.‬‬
‫برای رفتن به خط بعد در شئ ‪ cout‬می توان از دستکاری کننده ‪ endl‬استفاده‬
‫کرد‪ .‬مثال در دستور زیر پس از چاپ پیغام‪ ،‬مکان نما به خط بعد منتقل می‬
‫شود‪:‬‬
‫;‪cout >> “List of students : “ >> endl‬‬
‫البته دستکاری کننده های متعدد دیگری نیز ازجمله موارد مربوط به تعیین طول‬
‫میدان و نحوه چاپ مقادیر وجود دارد که توضیح آنها نیاز به یک مبحث مستقل‬
‫دارد‪.‬‬

C++ ‫ ورودی و خروجی اطالعات در‬7-6-3
#include
void main() {
int age;
float average ;
cout << "Please enter your age and average : " ;
cin >> age >> average ;
cout << "You are " << age << "years old and your average is " << average;
}

Please enter your age and average : 19 16.72
You are 19 years old and your average is 16.72

‫‪ 7-7‬توابع کتابخانه ای‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫همانطور که قبال نیز گفته شد‪ ،‬زبان ‪ C‬از زیر برنامه ها نیز حمایت می کند‪ .‬هر زیر برنامه‬
‫در ‪ C‬یک تابع نامیده می شود‪ .‬تا کنون با توابعی همچون ‪ main‬و یا ‪ printf‬و ‪ scanf‬آشنا‬
‫شده ایم‪.‬‬
‫معموال عرضه کنندگان کامپایلرها و یا سایر فروشندگان نرم افزار‪ ،‬برخی از توابع عمومی‬
‫را که ممکن است مورد نیاز جمع کثیری از برنامه نویسان مختلف باشد را در قالب‬
‫کتابخانه ای از توابع در اختیار برنامه نویسان می گذارند‪ .‬بعضی از این توابع کتابخانه ای‬
‫مانند ‪ printf‬و ‪ scanf‬بصورت استاندارد درآمده و توسط عرضه کنندگان مختلف ارائه می‬
‫شوند‪.‬‬
‫در کامپایلر عرضه شده توسط شرکت بورلند )‪ (Borland C++ 3.1‬نیز کتابخانه های‬
‫متعددی از توابع برای شما عرضه شده اند که بتدریج با آنها و کاربردشان آشنا خواهید‬
‫شد‪.‬‬
‫نکته مهم آنستکه برای استفاده از این توابع ابتدا باید فایل سرآمد مربوط به آنها را نیز در‬
‫ابتدای برنامه خود اضافه نمایید ) با استفاده از ‪ .(#include‬هر فایل سرآمد شامل تعاریف‬
‫اولیه گروهی از توابع مرتبط با هم و داده های مربوط به آنها بوده و در استاندارد قدیمی‬
‫تر دارای پسوند ‪ .h‬می باشد)در استاندارد جدید پسوند این فایلها حذف شده است(‪.‬‬
‫برخی از این فایلهای سرآمد عبارتند از‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪ : stdio.h‬توابع ورودی و خروجی استاندارد‬
‫‪ : math.h‬توابع ریاضی‬
‫‪ : graphics.h‬توابع مربوط به عملیات گرافیکی‬
‫‪ : string.h‬توابع مربوط به کار با رشته ها‬


Slide 8

‫مبانی کامپیوتر و برنامه سازی‬
‫فصل هفتم ‪ :‬مفاهیم اولیه زبان ‪C‬‬
‫مدرس ‪ :‬نگین معروفی‬

‫‪ 7-1‬شناسه ها در ‪C‬‬
‫‪‬‬
‫‪‬‬

‫شناسه )‪ (identifier‬نامی است که به یک قسمت از برنامه مانند متغیر‪ ،‬تابع‪ ،‬ثابت و یا‬
‫‪ ...‬داده می شود‪.‬‬
‫در زبان ‪ C‬برای انتخاب شناسه ها فقط می توان از عالئم زیر استفاده کرد‪:‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫حروف انگلیسی کوچک و بزرگ )‪(A…Z a…z‬‬
‫ارقام )‪(0…9‬‬
‫عالمت خط پایین یا _‬

‫البته یک شناسه نمی تواند با یک رقم شروع شود‪.‬‬
‫چند شناسه مجاز‪ name2 ، average ، sum :‬و ‪student_average‬‬
‫چند شناسه غیرمجاز ‪ 2name‬و یا ‪student average‬‬
‫در برنامه نویسی امروزی پیشنهاد می شود بجای شناسه هایی همانند‬
‫‪ student_average‬از ‪ studentAverage‬استفاده گردد‪.‬‬
‫نکته مهم دیگری که باید به آن اشاره کرد آنستکه زبان ‪ C‬برخالف بسیاری از زبانهای دیگر‬
‫به کوچک و بزرگی حروف حساس است )‪ .(case sensitive‬در نتیجه شناسه های زیر با‬
‫یکدیگر متفاوتند ‪:‬‬
‫‪Sum ≠ sum ≠ SUM‬‬
‫آخرین نکته اینستکه در هنگام انتخاب شناسه نمی توانید از کلمات کلیدی که برای‬
‫منظورهای خاص در زبان ‪ C‬رزرو شده اند استفاده کنید‪.‬‬

C ‫ شناسه ها در‬7-1
: C ‫کلمات کلیدی در زبان‬
auto

break

case

char

const

continue

default

do

double

else

enum

extern

float

for

goto

if

int

long

register

return

short

signed

sizeof

static

struct

switch

typedef

union

unsigned

void

volatile

while

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫محدوده‬

‫اندازه )بیت(‬

‫توضیح‬

‫نوع داده‬

‫‪-128 to +127‬‬

‫‪8‬‬

‫کاراکتر‬

‫‪char‬‬

‫‪-32768 to +32767‬‬

‫‪16‬‬

‫عدد صحیح‬

‫‪int‬‬

‫‪3.4e-38 to 3.4e+38‬‬

‫‪32‬‬

‫عدد اعشاری‬

‫‪float‬‬

‫‪1.7e-308 to 1.7e+308‬‬

‫‪64‬‬

‫عدد اعشاری با‬
‫دقت مضاعف‬

‫‪double‬‬

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫‪‬‬

‫البته چند نکته مهم درمورد این جدول قابل ذکر است ‪:‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫اندازه ‪ int‬در محیطهای ‪ 16‬بیتی مانند ‪ DOS‬برابر ‪ 16‬بیت است‪ .‬اما در‬
‫محیطهای ‪ 32‬بیتی همانند ‪ Windows‬اندازه آن ‪ 32‬بیت می باشد که در‬
‫اینصورت محدوده ای برابر ‪ -2,147,483,648‬تا ‪ +2,147,483,647‬را‬
‫پوشش می دهد‪.‬‬
‫در بعضی از کامپایلرهای ‪ ،C‬نوع داده ‪ bool‬نیز وجود دارد که می تواند‬
‫یکی از مقادیر ‪)true‬درست( یا ‪) false‬غلط( را نشان دهد ‪ .‬اما در نسخه‬
‫های اولیه ‪ C‬از همان نوع داده صحیح یا ‪ int‬برای اینکار استفاده می‬
‫شد‪ .‬بدین صورت که ‪ 0‬نشاندهنده ‪ false‬و هر عدد غیر صفر )معموال ‪(1‬‬
‫نشاندهنده ‪ true‬است‪.‬‬
‫از آنجا که برای ذخیره سازی کاراکترها کد اسکی آنها ذخیره می گردد‪،‬‬
‫از یک متغیر کاراکتری یا ‪ char‬می توان بعنوان یک عدد صحیح کوچک نیز‬
‫استفاده کرد و اعمال ریاضی برروی آنها نیز مجاز است‪.‬‬

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫عالوه براین چندین اصالح کننده نیز وجود دارد که به ما اجازه می دهد نوع داده مورد‬
‫نظر را با دقت بیشتری برای نیازهای مختلف استفاده نماییم‪.‬‬
‫این اصالح کننده ها عبارتند از ‪short, long, signed, unsigned :‬‬
‫تمام این اصالح کننده ها می توانند به نوع داده ‪ int‬اعمال شوند و اثر آنها بستگی‬
‫به محیط دارد‪.‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫در یک محیط ‪16‬بیتی‪short int ،‬بازهم برابر ‪16‬بیت است ولی ‪ long int‬برابر‪32‬بیت می‬
‫باشد‪.‬‬
‫‪ unsigned int‬باعث می شود که یک عدد ‪ 16‬بیتی بدون عالمت داشته باشیم که بازه‬
‫بین ‪ 0‬تا ‪ 65535‬را پوشش می دهد‪ signed int .‬نیز همانند ‪ int‬معمولی بوده و تفاوتی‬
‫ندارد‪.‬‬
‫ترکیب این اصالح کننده ها نیز ممکن است‪ .‬مثال ‪ unsigned long int‬یک عدد ‪ 32‬بیتی‬
‫بدون عالمت است که بازه ‪ 0‬تا ‪ 4,294,967,295‬را پوشش می دهد‪.‬‬

‫برروی نوع داده ‪ char‬فقط اصالح کننده های ‪ signed‬و ‪ unsigned‬را می توان اعمال‬
‫کرد‪ .‬معموال از اصالح کننده ‪ unsigned‬وقتی استفاده می شود که قصد داشته‬
‫باشیم از ‪ char‬بعنوان یک عدد صحیح مثبت بین ‪ 0‬تا ‪ 255‬استفاده کنیم‪.‬‬
‫برروی نوع داده ‪ double‬تنها اصالح کننده ‪ long‬قابل اعمال است و دراینصورت عدد‬
‫اعشاری با ‪ 80‬بیت را خواهیم داشت که قادر است هر عددی در بازه ‪ 3.4e-4932‬تا‬
‫‪ 1.1e+4932‬را در خود نگاه دارد‪.‬‬

‫‪ 7-3‬تعریف متغیرها‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای تعریف متغیرها به شکل زیر عمل می کنیم‪:‬‬

‫;>‪ ‫که ‪ type‬یکی از نوع داده های گفته شده و ‪ variable-list‬لیستی از متغیرها است‬
‫که با کاما از یکدیگر جدا شده اند‪ .‬بعنوان مثال ‪:‬‬
‫;‪int sum‬‬
‫;‪float average‬‬
‫; ‪long int a, b, c‬‬
‫; ‪unsigned long int i, j, k‬‬
‫عالوه براین می توان در هنگام تعریف متغیر به آن مقدار اولیه نیز داد‪ .‬مثال ‪:‬‬
‫; ‪int d = 0‬‬
‫نكته مهم آنكه زبان ‪ C‬به متغیرها مقدار اولیه نمي دهد )حتي ‪ (0‬و برنامه نويس‬
‫خود بايد اينكار را صريحا انجام دهد‪ ،‬درغیر اينصورت مقدار اولیه متغیر‪ ،‬نامعین خواهد‬
‫بود‪.‬‬
‫تعریف متغیرها طبق اصول زبان ‪ C‬میتواند درهرجایی از برنامه صورت پذیرد‪ ،‬و‬
‫متغیرهای تعریف شده از همان خط به بعد قابل استفاده خواهد بود‪ .‬اما معموال‬
‫توصیه می گردد كه تعریف متغیرها در همان خط ابتدایی تابع و بالفاصله پس از {‬
‫صورت پذیرد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫‪‬‬
‫‪‬‬

‫ثابتها مقادیر ثابتی هستند كه مقدار آنها در حین اجرای برنامه تغییر نمی یابد‪ .‬ثابتها می توانند از‬
‫هریك از نوع داده های اصلی باشند‪.‬‬
‫ثوابت عددی صحیح ‪:‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫برای نمایش این دسته از ثوابت‪ ،‬از دنباله ای از ارقام بعالوه عالمت ‪ +‬یا ‪ -‬استفاده می كنیم‪ .‬بعنوان مثال‬
‫‪ -45‬و یا ‪ 3489‬ثوابت صحیح هستند‪.‬‬
‫در حالت عادی ‪ C‬هر عدد را در كوچكترین نوع داده ای كه می تواند قرار می دهد‪ .‬مثال عدد ‪ 85‬در یك‬
‫‪ int‬قرار می گیرد‪ ،‬اما عدد ‪ 145398‬در یك ‪ long int‬قرار خواهد گرفت‪.‬‬
‫اگر قصد دارید یك عدد كوچك بعنوان ‪ long‬محسوب گردد‪ ،‬می توانید از پسوند ‪ L‬در انتهای آن استفاده‬
‫می كنیم‪ .‬مثال ‪245L‬یك عدد ‪ long‬محسوب می شود‪.‬‬
‫;‪long int a = 20L‬‬
‫پسوند ‪ U‬در انتهای عدد نیز نشانه بدون عالمت بودن آن است‪.‬‬
‫نكته دیگر آنكه ‪ C‬به شما اجازه می دهد درصورت لزوم ثوابت صحیح خود را در مبنای ‪ 8‬یا ‪ 16‬نیز كه‬
‫از مبناهای متداول در برنامه نویسی هستند‪ ،‬بنویسید‪.‬‬
‫‪‬‬
‫‪‬‬

‫برای نوشتن عدد در مبنای ‪ 8‬باید آن را با ‪ 0‬آغاز كنید‪ ،‬مثال ‪ 0342‬یك عدد در منای ‪ 8‬محسوب می‬
‫گردد‪.‬‬
‫برای نوشتن یك عدد در مبنای ‪ 16‬باید آن را با ‪ 0x‬آغاز نمایید‪ ،‬مانند ‪.0x27A4‬‬

‫‪ 7-4‬ثوابت‬
‫ثوابت عددی اعشاری‬

‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫برای نمایش اعداد اعشاری‪ ،‬باید از نقطه اعشار استفاده كنیم‪ ،‬مانند ‪237.45‬‬
‫اما نكته جالب آنستكه می توانید از نماد علمی نیز برای نمایش اعداد‬
‫اعشاری استفاده كنید‪ .‬برای اینكار كافی است از حرف ‪ e‬برای نمایش قسمت‬
‫توان استفاده نمایید‪ .‬بعنوان مثال ‪:‬‬
‫‪-23.47 × 10 5 = -23.47e5‬‬
‫‪42.389 × 10 -3 = 42.389e-3‬‬
‫دقت كنید كه قسمت توان‪ ،‬حتما یك عدد صحیح است‪.‬‬
‫نكته جالب اینجاست كه برخالف مورد قبل‪ ،‬كامپایلر بطور پیش فرض داده های‬
‫اعشاری را از نوع ‪ double‬فرض می كند‪.‬چنانچه دوست دارید ثابت شما ازنوع‬
‫‪ float‬درنظر گرفته شود‪ ،‬در انتهای آن ‪ F‬قرار دهید‪ .‬ضمنا پسوند ‪ L‬نیز داده‬
‫اعشاری را از نوع ‪ long double‬درنظر می گیرد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫ثوابت كاراكتری ‪:‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫برای نشان دادن ثوابت كاراكتری‪ ،‬آنها را در داخل ' قرار می دهیم‪ .‬بعنوان مثال‬
‫'‪'A‬یك ثابت كاراكتری است‪.‬‬
‫; '‪char ch = 'S‬‬
‫دقت كنید كه همانطور كه قبال گفته شد‪ ،‬كد اسكی كاراكترها در متغیر ذخیره‬
‫می گردد‪ ،‬بنابراین می توان از آن بعنوان یك عدد صحیح نیز استفاده كرد‪ .‬نكته‬
‫مهم دیگر آنستكه به تفاوت عدد ‪ 5‬و كاراكتر '‪ '5‬دقت داشته باشید‪ .‬در حقیقت‬
‫'‪ '5‬برابر است با عدد ‪ 53‬كه همان كد اسكی آن است‪.‬‬
‫روش فوق‪ ،‬برای نمایش کاراکترهای قابل چاپ مناسب است‪ ،‬اما بعضی‬
‫كاراكترها مانند ‪ enter‬قابل نمایش نبوده و برای آنها شکل خاصی وجود ندارد‪.‬‬
‫در چنین مواردی‪ ،‬زبان ‪ C‬از ترکیب عالمت \ به همراه یک کاراکتر دیگر‪ ،‬برای‬
‫نمایش این قبیل کاراکترها استفاده می نماید‪ .‬بعنوان مثال‪ ،‬کاراکتر '‪ '\n‬نشان‬
‫دهنده خط جدید یا همان ‪ enter‬می باشد‪.‬‬
‫جدول صفحه بعد این قبیل کاراکترها و معادل آنها را نشان می دهد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫نحوه نمایش در ‪C‬‬

‫کد اسکی‬

‫صدای بوق کامپیوتر‬

‫‪\a‬‬

‫‪7‬‬

‫حرکت به عقب ‪backspace‬‬

‫‪\b‬‬

‫‪8‬‬

‫شروع صفحه ‪form feed‬‬

‫‪\f‬‬

‫‪12‬‬

‫سطر جدید ‪line feed‬‬

‫‪\n‬‬

‫‪10‬‬

‫برگشت به ابتداي سطر ‪carriage return‬‬

‫‪\r‬‬

‫‪13‬‬

‫فاصله افقی ‪horizontal tab‬‬

‫‪\t‬‬

‫‪9‬‬

‫فاصله عمودی ‪vertical tab‬‬

‫‪\v‬‬

‫‪11‬‬

‫عالمت سوال‬

‫?\‬

‫‪63‬‬

‫عالمت '‬

‫'\‬

‫‪39‬‬

‫عالمت "‬

‫"\‬

‫‪34‬‬

‫عالمت \‬

‫\\‬

‫‪92‬‬

‫عالمت تهی‬

‫‪\0‬‬

‫‪0‬‬

‫نام کاراکتر‬

‫کد اسکی یک کاراکتر با ‪ 3‬رقم در مبنای ‪8‬‬

‫‪\000‬‬

‫کد اسکی یک کاراکتر با ‪ 2‬رقم در مبنای ‪16‬‬

‫‪\x00‬‬

‫‪ 7-4‬ثوابت‬
‫‪‬‬

‫ثوابت رشته ای ‪ C :‬عالوه بر ثوابت فوق‪ ،‬از یك ثابت دیگر بنام رشته نیز‬
‫حمایت می كند‪ .‬رشته‪ ،‬دنباله ای از كاراكترها است كه در داخل " قرار‬
‫می گیرند‪ .‬بعنوان مثال "‪ "this is a test‬یك رشته است‪ .‬دقت كنید كه '‪'a‬‬
‫یك كاراكتر است‪ ،‬اما "‪ "a‬یك رشته است كه فقط شامل یك كاراكتر می‬
‫باشد‪.‬‬

‫‪ 7-5‬عملگرها‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫عملگر‪ ،‬نمادی است كه به كامپایلر می گوید تا عملیات محاسباتی یا‬
‫منطقی خاصی را برروی یك یا چند عملوند‪ ،‬انجام دهد‪.‬‬
‫به عملگرهایی كه فقط یك عملوند دارند‪ ،‬عملگر یكانی می گوییم و‬
‫همواره عملگر در سمت چپ عملوند قرار می گیرد)مانند عدد ‪.(-125‬‬
‫اما عملگرهایی كه برروی دو عملوند اثر می كنند را عملگر دودویی‬
‫نامیده و عملگر را بین دو عملوند قرار می دهیم )مانند ‪.(23+86‬‬
‫هر ترکیب درستی از عملگرها و عملوندها را یک عبارت می نامیم‪.‬‬
‫‪ C‬از نقطه نظر عملگرها یك زبان بسیار قوی است‪ .‬این عملگرها به چند‬
‫دسته اصلی تقسیم می گردند كه آنها را به ترتیب بررسی می كنیم‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫این عملگرها‪ ،‬همان اعمال متداول ریاضی هستند كه در زبان ‪ C‬مورد استفاده‬
‫قرار می گیرند‪ .‬این اعمال عبارتند از ‪:‬‬

‫عمل‬

‫نوع‬

‫عملگر‬

‫منفی كردن عملوند سمت راست‬

‫یكانی‬

‫‪-‬‬

‫جمع دو عملوند‬

‫دودویی‬

‫‪+‬‬

‫تفریق دو عملوند‬

‫دودویی‬

‫‪-‬‬

‫ضرب دو عملوند‬

‫دودویی‬

‫*‬

‫تقسیم دو عملوند‬

‫دودویی‬

‫‪/‬‬

‫محاسبه باقیمانده تقسیم دو عملوند‬

‫دودویی‬

‫‪%‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬
‫‪‬‬

‫این عملگرهای برروی همه انواع داده های ‪ C‬عمل می كنند‪ ،‬بجز عملگر ‪ %‬كه فقط‬
‫برروی نوع داده های صحیح عمل می كند‪.‬‬
‫اما نكته مهمی كه باید به آن اشاره كرد‪ ،‬نحوه كار عملگر تقسیم برروی نوع داده های‬
‫مختلف است‪.‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫درصورتیكه هردو عملوند صحیح باشند‪ ،‬تقسیم بصورت صحیح بر صحیح انجام خواهد شد‪.‬‬
‫اگر یكی یا هر دو عملوند اعشاری باشند‪ ،‬تقسیم بصورت اعشاری انجام خواهد پذیرفت‪.‬‬
‫فرض كنید تعاریف زیر را داریم ‪:‬‬
‫; ‪int a,b‬‬
‫; ‪float c,d‬‬
‫; ‪a = 10 ; b = 4‬‬
‫;‪c = 8.2; d = 4.0‬‬
‫اكنون به نتایج عملیات زیر دقت كنید ‪:‬‬
‫‪a / b => 2‬‬
‫‪c / d => 2.05‬‬
‫‪a / d => 2.5‬‬
‫‪a / 4 => 2‬‬
‫چنانچه به آخرین مورد توجه كنید‪ ،‬متوجه می شوید كه از آنجا كه ‪a‬یك متغیر صحیح است و ‪4‬‬
‫نیز یك ثابت صحیح در نظر گرفته شده‪ ،‬درنتیجه تقسیم بصورت صحیح بر صحیح انجام گرفته‬
‫است‪ .‬چنانچه بخواهیم تقسیم بصورت اعشاری صورت پذیرد‪ ،‬به دو شكل می توانیم عمل‬
‫كنیم‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫برای اینکه عبارت تقسیم صفحه قبل بصورت اعشاری انجام شود‪ ،‬به دو روش‬
‫می توان عمل کرد‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫این عبارت را بصورت ‪ a / 4.0‬بنویسیم‪.‬‬
‫از عملگر قالب ریزی استفاده كنیم‪.‬‬

‫عملگر قالب ریزی می تواند یك نوع را به نوع دیگری تبدیل نماید‪ .‬شكل كلی آن‬
‫به شكل زیر است ‪:‬‬
‫>‪() ‫كه ‪ type‬نوع مورد نظر است كه قصد تبدیل عبارت ‪ expression‬به آن نوع را‬
‫داریم‪ .‬بعنوان مثال در مورد قبلی می توان به شكل زیر عمل كرد ‪:‬‬
‫‪(float) a / 4‬‬
‫در این حالت از كامپایلر خواسته ایم كه ابتدا عدد ‪ a‬را به اعشاری تبدیل كند‬
‫)البته بصورت موقت( و سپس آن را بر ‪ 4‬تقسیم نماید‪ ،‬كه مسلما حاصل‬
‫اعشاری خواهد بود‪.‬‬
‫بطوركلی هرگاه ثابتها و متغیرهایی از انواع مختلف در یك عبارت محاسباتی‬
‫داشته باشیم‪ ،‬كامپایلر ‪ C‬همه آنها را به یك نوع یكسان كه همان بزرگترین‬
‫عملوند موجود است تبدیل خواهد كرد‪ .‬بعنوان مثال به مورد صفحه بعد دقت‬
‫كنید ‪:‬‬

‫ عملگرهای محاسباتی‬7-5-1
char ch;
int i;

float f;
double d;
result = (ch / i)
int

+

(f *d)

(f+i)
float

double

double

int

-

double

double

float

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫اولویت عملگرها ‪ :‬در عبارتی که شامل چندین عملگر است‪ ،‬کدامیک در‬
‫ابتدا اعمال خواهد گردید‪.‬‬
‫اولویت عملگرهای محاسباتی از باال به پایین بشرح زیر است‪:‬‬
‫‪ ‬عملگر یکانی –‬
‫‪ ‬عملگرهای * و ‪ /‬و ‪%‬‬
‫‪ ‬عملگرهای ‪ +‬و –‬
‫چنانچه اولویت دو عملگر یکسان باشد‪ ،‬این عملگرها از چپ به راست‬
‫محاسبه خواهند شد‪.‬‬
‫چنانچه بخواهیم یک عمل با اولویت پایین زودتر انجام شود‪ ،‬باید از پرانتز‬
‫استفاده کنیم‪ .‬بنابراین اولویت عملگر پرانتز از همه موارد فوق‬
‫بیشتراست‪ .‬در مورد پرانتزهای متداخل‪ ،‬ابتدا پرانتز داخلی محاسبه‬
‫می شود؛ اما در مورد پرانتزهای هم سطح‪ ،‬ابتدا پرانتز سمت چپتر‬
‫محاسبه می گردد‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫چند مثال در مورد اولویت عملگرها‬

‫ترتیب اجرای عملگرها‬

‫عبارت زبان ‪C‬‬

‫ابتدا عمل * و سپس عمل ‪+‬‬

‫‪b+c*d‬‬

‫ابتدا عمل ‪ +‬و سپس عمل *‬

‫‪(b + c) * d‬‬

‫ابتدا عمل ‪ /‬سپس عمل * و در انتها عمل ‪+‬‬

‫‪b+c/d*e‬‬

‫ابتدا عمل * سپس عمل ‪ /‬و در انتها عمل ‪+‬‬

‫)‪b + c / (d * e‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫یک مثال کامل در مورد اولویت عملگرها‬

‫‪result = a + b * (f – (g + b) / d) – c * (a – d) / e‬‬
‫‪6‬‬

‫‪1‬‬
‫‪7‬‬

‫‪2‬‬

‫‪8‬‬

‫‪3‬‬
‫‪4‬‬
‫‪5‬‬
‫‪9‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫در زبان ‪ C‬برای انتساب چندین عملگر وجود دارد‪ .‬ساده ترین عملگر انتساب‪ ،‬همان عملگر =‬
‫است که در بسیاری از زبانها استفاده می شود‪ .‬بعنوان مثال ‪:‬‬
‫;‪a = 5‬‬
‫;‪b = c + 2 * d‬‬
‫این عملگر باعث می شود که عبارت سمت راست در عبارت سمت چپ قرار گیرد‪.‬‬
‫توجه کنید که مقدار سمت چپ باید عبارتی باشد که بتوان به آن یک مقدار را نسبت داد‬
‫)مانند یک متغیر( که به آن ‪ Lvalue‬گفته می شود‪ ،‬بنابراین یک ثابت نمی تواند در سمت چپ‬
‫قرار گیرد‪.‬‬
‫نکته دیگر اینکه اولویت عملگر = از عملگرهای ریاضی کمتر است و درنتیجه ابتدا آن عملیات‬
‫انجام شده و در پایان حاصل در عبارت سمت چپ ریخته می شود‪.‬‬
‫الزم به ذکر است که در هنگام انتساب‪ ،‬درصورت لزوم نوع عبارت سمت راست به نوع عبارت‬
‫سمت چپ تبدیل می شود‪ .‬مثال‪:‬‬
‫;‪int a‬‬
‫;‪a = 2.5 * 5.0‬‬
‫که دراینصورت عدد ‪ 12‬در ‪ a‬ذخیره خواهد شد‪.‬‬
‫شرکت پذیری این عملگر از راست به چپ می باشد‪ ،‬بدین معنا که چنانچه چندین عملگر‬
‫نسبت دهی داشته باشیم‪ ،‬این عملگرها از راست به چپ محاسبه می شوند‪ .‬مثال پس از‬
‫اجرای دستور زیر‪ ،‬مقدار هر ‪ 3‬متغیر برابر ‪ 10‬خواهد شد‪.‬‬
‫;‪a = b = c = 10‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬

‫نکته جالب درمورد زبان ‪ C‬آنستکه دارای یک سری عملگرهای انتساب‬
‫خالصه شده است که باعث می شوند در بعضی موارد بتوانیم عبارات‬
‫کوتاهتری را بنویسیم‪ .‬این عملگرها عبارتند از ‪:‬‬
‫عملگرد‬

‫مثال‬

‫عبارت انتساب معادل‬

‫‪++‬‬

‫;‪a ++‬‬

‫;‪a = a + 1‬‬

‫‪--‬‬

‫;‪a --‬‬

‫;‪a = a – 1‬‬

‫=‪+‬‬

‫;‪a += 5‬‬

‫;‪a = a + 5‬‬

‫=‪-‬‬

‫;‪a -= 8‬‬

‫;‪a= a – 8‬‬

‫=*‬

‫;‪a *= 10‬‬

‫;‪a= a * 10‬‬

‫=‪/‬‬

‫;‪a /= 2‬‬

‫;‪a = a / 2‬‬

‫=‪%‬‬

‫;‪a %= 10‬‬

‫;‪a = a % 10‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬
‫‪‬‬

‫عملگر اول و دوم‪ ،‬عملگرهای یکانی هستند که بترتیب عملگر افزایش و عملگر کاهش‬
‫نامیده می شوند‪.‬‬
‫نکته جالب آنستکه این دو عملگر به دوصورت مورد استفاده قرار می گیرند‪.‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫در حالتی که از دستور ;‪ a ++‬استفاده شود به آن پس افزایش می گویند و بدین معناست که‬
‫ابتدا از مقدار فعلی ‪ a‬در عبارت موردنظر استفاده کن و سپس آن را افزایش بده‪.‬‬
‫اما دستور ;‪ ++ a‬که به آن پیش افزایش گفته می شود‪ ،‬ابتدا ‪ a‬را افزایش داده و سپس از آن‬
‫در عبارت استفاده می کند‪.‬‬
‫به برنامه زیر دقت کنید‪:‬‬

‫>‪#include ‫{ )(‪void main‬‬
‫; ‪int a ,b‬‬
‫;‪a=5‬‬
‫;‪b = a ++‬‬
‫;)‪printf(“a=%d and b=%d \n”,a,b‬‬
‫;‪a=5‬‬
‫;‪b = ++ a‬‬
‫;)‪printf(“a=%d and b=%d \n”,a,b‬‬
‫}‬
‫‪a=6 b=5‬‬
‫‪a=6 b=6‬‬

‫‪ 7-5-3‬عملگرهای مقایسه ای‬
‫‪‬‬

‫‪‬‬

‫این عملگرها دو عبارت را بایکدیگر مقایسه کرده و نتیجه را باز می گردانند‪.‬‬
‫نتیجه می تواند درست )‪ (true‬یا غلط )‪ (false‬باشد‪.‬‬
‫نتیجه این عملگرها یک عدد صحیح است که درصورت درست بودن ‪ 1‬و‬
‫درصورت غلط بودن ‪ 0‬باز می گردانند‪ .‬این عملگرها عبارتند از‪:‬‬
‫عملگر‬

‫مفهوم عملگر‬

‫مثال‬

‫<‬

‫بزرگتر )<(‬

‫‪a>b‬‬

‫>‬

‫کوچکتر )>(‬

‫‪a
‫=<‬

‫بزرگتر یا مساوی )≤(‬

‫‪a >= b‬‬

‫=>‬

‫کوچکتر یا مساوی )≥(‬

‫‪a <= b‬‬

‫==‬

‫مساوی )=(‬

‫‪a == b‬‬

‫=!‬

‫نامساوی )≠(‬

‫‪a != b‬‬

‫‪ 7-5-3‬عملگرهای مقایسه ای‬
‫‪‬‬

‫‪‬‬

‫نکته مهمی که باید به آن دقت کرد عملگر مساوی )==( است‪ ،‬چرا که یک‬
‫اشتباه بسیار متداول برنامه نویسان ‪ C‬استفاده اشتباه از عملگر انتساب‬
‫)=( بجای عملگر تساوی )==( است که باعث ایجاد خطا در برنامه می‬
‫شود‪.‬‬
‫اولویت این عملگرها از باال به پایین بشرح زیر است‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫عملگرهای <‪ <= ، > ،‬و =>‬
‫عملگرهای == و =!‬

‫الزم بذکر است که در هنگام مساوی بودن اولویت چند عملگر‪ ،‬این عملگرها‬
‫از چپ به راست محاسبه می گردند‪.‬‬

‫‪ 7-5-4‬عملگرهای منطقی‬
‫‪‬‬

‫این عملگرها به شما اجازه می دهند که شرطهای ساده ای را که با‬
‫استفاده از عملگرهای مقایسه ای ایجاد شده اند را با یکدیگر ترکیب نموده‬
‫و شرطهای پیچیده تری را بسازید‪ .‬این عملگرها عبارتند از ‪:‬‬
‫مثال‬

‫عملگر‬

‫مفهوم عملگر‬

‫نحوه کار‬

‫&&‬

‫‪ AND‬منطقی‬

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

‫‪a>0 && sw==1‬‬

‫||‬

‫‪ OR‬منطقی‬

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

‫‪a<=100 || b!=0‬‬

‫!‬

‫‪ NOT‬منطقی‬

‫اگر عملوند درست باشد‪ ،‬نادرست و‬
‫اگر نادرست باشد‪ ،‬درست برمی‬
‫گرداند‪.‬‬

‫)‪! (a==1 || b<10‬‬

‫‪ 7-5-5‬عملگر شرطی‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫گاهی الزم است که ابتدا یک شرط بررسی شده و سپس برمبنای نتیجه )درست یا نادرست بودن آن( یکی‬
‫از دو عبارت ممکن بازگردانده شود‪ .‬برای اینکار می توان از یک عملگر ‪3‬تایی )با ‪ 3‬عملوند( بنام عملگر‬
‫شرطی استفاده نمود‪.‬‬
‫شکل کلی این عملگر بصورت زیر است‪:‬‬
‫>عبارت‪> :<2‬عبارت‪> ?<1‬شرط<‬
‫نحوه کار بدینصورت است که درصورت درست بودن شرط‪ ،‬عبارت‪ 1‬و در غیراینصورت عبارت ‪ 2‬بازگردانده می‬
‫شود‪.‬‬
‫به عنوان مثال به دستور زیر توجه کنید‪:‬‬
‫که این عبارت معادل دستور زیر است‪:‬‬

‫‪‬‬

‫;‪a = (k<10) ? 100 : 50‬‬
‫;‪if (k<10) a=100‬‬
‫;‪else a=50‬‬

‫البته این عبارت به شکلهای پیچیده نیز می تواند مورد استفاده قرار گیرد‪ .‬مثال ‪:‬‬
‫;‪c += (a>0 && a<10) ? ++a : a/b‬‬
‫که معادل است با ‪:‬‬
‫{ )‪if (a>0 && a<10‬‬
‫;‪a= a + 1‬‬
‫;‪c = c + a‬‬
‫}‬
‫;‪else c = c + a/b‬‬

‫‪ 7-5-6‬اولویت عملگرها‬
‫عملگر‬

‫اولویت‬

‫شرکت پذیری‬

‫‪1‬‬

‫)(‬

‫از چپ به راست‬

‫‪2‬‬

‫‪- + ! -- ++‬‬

‫از راست به چپ‬

‫‪3‬‬

‫‪* / %‬‬

‫از چپ به راست‬

‫‪4‬‬

‫‪+ -‬‬

‫از چپ به راست‬

‫‪5‬‬

‫>> <<‬

‫از چپ به راست‬

‫‪6‬‬

‫>= > <= <‬

‫از چپ به راست‬

‫‪7‬‬

‫=! ==‬

‫از چپ به راست‬

‫‪8‬‬

‫&&‬

‫از چپ به راست‬

‫‪9‬‬

‫||‬

‫از چپ به راست‬

‫‪10‬‬

‫‪?:‬‬

‫از راست به چپ‬

‫‪11‬‬

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

‫از راست به چپ‬

‫‪12‬‬

‫‪,‬‬

‫از چپ به راست‬

‫‪ 7-6‬خواندن و نمایش اطالعات‬
‫‪‬‬

‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫همانطور كه قبال نیز گفته شد‪ ،‬یكی از اهداف زبان ‪ C‬قابل حمل بودن آن‬
‫است‪ .‬بهمین منظور سعی شده است كه از دستوراتی كه ممكن است‬
‫وابسته به ماشین خاصی باشد‪ ،‬اجتناب گردد‪.‬‬
‫بهمین دلیل زبان ‪ C‬برخالف سایر زبانها دارای هیچ دستوری برای‬
‫خواندن از ورودی و یا نوشتن در خروجی نیست‪.‬‬
‫اما در عوض دارای تعدادی تابع )زیربرنامه( استاندارد می باشد كه تقریبا‬
‫تمامی كامپایلرها از آنها حمایت می كنند‪.‬‬
‫این كار به كامپایلر این امكان را می دهد كه بر حسب نوع سخت افزار‬
‫موردنظر‪ ،‬توابع ورودی و خروجی را طراحی نماید‪.‬‬
‫این توابع در یك فایل سرآمد بنام ‪ stdio.h‬تعریف شده اند و بنابراین قبل‬
‫ازاینكه بتوانید از این توابع استفاده نمایید‪ ،‬باید این فایل را نیز با استفاده‬
‫از ‪ #include‬در برنامه خود بگنجانید‪.‬‬

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫برای نمایش اطالعات در خروجی از تابع ‪ printf‬استفاده می شود‪.‬‬
‫این تابع رشته موردنظر شما را به خروجی استاندارد )كه در حالت‬
‫عادی همان صفحه نمایش یا مانیتور است( می فرستد‪ .‬شكل كلی این‬
‫تابع بصورت زیر است‪:‬‬
‫; )>لیست متغیرها< ‪> ,‬رشته كنترلی<(‪printf‬‬
‫رشته كنترلی همان متنی است كه قصد چاپ آن را داریم‪ ،‬با ذكر این‬
‫نكته كه در قسمتهایی كه باید مقدار یك متغیر چاپ شود‪ ،‬از یك‬
‫مشخصه تبدیل استفاده می شود‪ .‬هر مشخصه تبدیل از یك عالمت ‪%‬‬
‫بعالوه یك كاراكتر كه نوع متغیر مورد نظر را نشان می دهد تشكیل می‬
‫گردد‪.‬‬
‫لیست متغیرها نیز همان متغیرهایی هستند كه قصد چاپ آنها را داریم‪.‬‬
‫این متغیرها باید بترتیب قرار گرفته و با كاما )‪ (,‬از یكدیگر جدا شوند‪.‬‬

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫مشخصه تبدیل‬

‫مفهوم‬

‫‪%c‬‬

‫كاراكتر‬

‫‪%d‬‬

‫عدد صحیح در مبنای ‪10‬‬

‫‪%f‬‬

‫عدد اعشاری بدون نماد علمی‬

‫‪%e‬‬

‫عدد اعشاری با نماد علمی‬

‫‪%g‬‬

‫عدد اعشاری با حالت كوتاهتر بین ‪ e‬و ‪f‬‬

‫‪%s‬‬

‫رشته‬

‫‪%ld‬‬

‫عدد صحیح بزرگ‬

‫‪%lf %le %lg‬‬

‫عدد اعشاری بزرگ‬

‫‪%o‬‬

‫عدد صحیح در مبنای ‪8‬‬

‫‪%x‬‬

‫عدد صحیحی در مبنای ‪16‬‬

‫‪%u‬‬

‫عدد صحیح بدون عالمت‬

‫ تابع نمایش در خروجی‬7-6-1
#include
void main() {
int age = 20;
floate average = 18.23;
printf("You are %d years old and your average is %f \n",age,average);
}
You are 20 years old and your average is 18.230000

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫‪‬‬
‫‪‬‬

‫برای کنترل نحوه چاپ اعداد می توانید از مشخصه طول میدان استفاده‬
‫کنید‪.‬‬
‫مشخصه طول میدان برای اعداد به شكل زیر استفاده می شود‪:‬‬
‫‪ ‬برای اعداد صحیح از ‪ %nd‬استفاده می كنیم كه ‪ n‬تعداد ارقام را نشان‬
‫می دهد )مثال ‪ .(%3d‬در اینصورت برای هر متغیر ‪ n‬رقم درنظر گرفته‬
‫می شود‪ .‬اگر اندازه عدد از ‪ n‬كوچكتر باشد‪ ،‬به سمت چپ آن فضای‬
‫خالی اضافه می شود و اگر اندازه عدد بیش از ‪ n‬رقم باشد‪ ،‬طول میدان‬
‫نادیده گرفته شده و عدد بطور كامل چاپ می شود‪.‬‬
‫‪ ‬برای اعداد اعشاری از ‪ %n.mf‬استفاده می كنیم كه ‪ n‬اندازه كل عدد‬
‫)شامل عالمت ممیز( و ‪ m‬تعداد ارقام اعشار است )مثال ‪ .(%5.2f‬در‬
‫صورتیكه تعداد ارقام اعشاری عدد موردنظر از ‪ m‬بیشتر باشد‪ ،‬عدد به ‪m‬‬
‫عدد اعشار گرد می شود و در صورتیكه از ‪ m‬كمتر باشد‪ ،‬در سمت‬
‫راست آن ‪ 0‬قرار داده می شود‪.‬‬

‫‪ 7-6-2‬تابع خواندن از ورودی‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای خواندن اطالعات از ورودی از تابع ‪ scanf‬استفاده می شود‪.‬‬
‫این تابع اطالعات را ازورودی استاندارد )معموال صفحه كلید( خوانده و در‬
‫متغیرهای تعیین شده قرار می دهد‪.‬‬
‫شكل كلی این تابع بصورت زیر است‪:‬‬
‫; )>لیست آدرسهای متغیرها< ‪> ,‬رشته كنترلی<(‪scanf‬‬
‫همانطور كه می بینید نحوه احضار تابع ‪ scanf‬نیز مشابه ‪ printf‬است‪ .‬تنها‬
‫تفاوت در آن است كه در ‪ scanf‬باید لیست آدرسهای متغیرها ارسال شود‪.‬‬
‫مبحث مربوط به آدرسها در فصول بعدی بررسی خواهد شد ولی در حال حاضر‬
‫بخاطر بسپارید كه برای بدست آوردن آدرس یك متغیر از عالمت & استفاده می‬
‫كنیم‪ .‬بعنوان مثال ‪ &age‬بمعنای آدرس متغیر ‪ age‬است‪.‬‬
‫بطور كلی در ‪ C‬قدیمی هرگاه كه یك تابع دارای پارامترهای خروجی بود )یعنی‬
‫پارامترهایی كه یك مقدار را باز می گرداندند( از آدرس متغیرها استفاده می‬
‫شد كه امروزه این مسئله وجود ندارد‪.‬‬

‫ تابع خواندن از ورودی‬7-6-2
#include
void main() {
int age;
float average ;
printf("Please enter your age and average : ");
scanf("%d %f",&age,&average);
printf("You are %d years old and your average is %5.2f \n",age,average);
}

Please enter your age and average : 19 16.72
You are 19 years old and your average is 16.72

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫زبان ‪ C++‬یک زبان شی گرا است‪ ،‬بهمین دلیل در این زبان برای ورودی‬
‫و خروجی از اشیاء بجای توابع استفاده می گردد‪.‬‬
‫از آنجا که امروزه معموال برنامه نویسان ‪ C‬از کامپایلرهای ‪ C++‬استفاده‬
‫می کنند‪ ،‬می توانند از اشیای ورودی و خروجی آن نیز استفاده کنند‪.‬‬
‫اینکار در بین بسیاری از برنامه نویسان ‪ C‬متداول است‪ ،‬بهمین دلیل ما‬
‫در اینجا نحوه کار با اشیای خواندن و نوشتن در ‪ C++‬را بطور مقدماتی‬
‫توضیح می دهیم؛ گرچه توضیح کامل این موارد نیاز به آشنایی با شی‬
‫گرایی و زبان ‪ C++‬دارد‪.‬‬
‫قبل از هرچیز الزم به ذکر است که کلیه اشیای مربوط به ورودی و‬
‫خروجی در فایل سرآمدی بنام ‪ iostream.h‬تعیریف شده اند‪ ،‬بنابراین‬
‫ابتدا باید این فایل به برنامه توسط دستور ‪ #include‬الحاق گردد‪.‬‬

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫زبان ‪ C++‬برای نمایش اطالعات از یک شیئ بنام ‪ cout‬استفاده می نماید‪.‬‬
‫برای ارسال اطالعات مورد نظر برای چاپ به ‪ cout‬باید از عملگر درج در جریان‬
‫یا >> استفاده نماییم‪ .‬بعنوان مثال ‪:‬‬
‫; ” ‪cout >> “Please enter your name:‬‬
‫و یا مثال دیگر ‪:‬‬
‫;‪int a = 10‬‬
‫;‪float b = 2.86‬‬
‫;‪cout << a‬‬
‫;‪cout << b‬‬
‫نکته جالبی که در این مثالها دیده می شود‪ ،‬آنستکه برخالف تابع ‪ printf‬هیچ‬
‫نیازی به مشخص کردن نوع متغیری که قصد چاپ آن را داریم نیست و خود‬
‫شئ ‪ cout‬نوع آن را تشخیص می دهد‪.‬‬
‫عالوه براین می توان چندین عملگر درج در جریان را با یکدیگر الحاق کرد و‬
‫چندین متغیر را با یک دستور چاپ کرد‪.‬‬

C++ ‫ ورودی و خروجی اطالعات در‬7-6-3
#include
void main() {
int age = 20;
floate average = 18.23;
cout >> “You are ” >> age >> “ years old and your average is ” >> average ;
}

You are 20 years old and your average is 18.230000

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای دریافت اطالعات از کاربر‪ ،‬از شئ دیگری بنام ‪ cin‬استفاده می شود‪.‬‬
‫برای ارسال متغیر مورد نظر به ‪ cin‬باید از عملگر استخراج از جریان یا <<‬
‫استفاده نماییم‪ .‬بعنوان مثال‪:‬‬
‫;‪int a‬‬
‫;‪cin >> a‬‬
‫بازهم همانطور که می بینید نیازی به تعیین نوع متغیر موردنظر نیست و خود‬
‫شئ ‪ cin‬نوع متغیر را بطور اتوماتیک تشخیص داده و داده ای از همان نوع را از‬
‫کاربر دریافت و در متغیر مورد نظر قرار می دهد‪.‬‬
‫عملگرهای استخراج از جریان را نیز می توان با یکدیگر الحاق کرد‪.‬‬
‫برای رفتن به خط بعد در شئ ‪ cout‬می توان از دستکاری کننده ‪ endl‬استفاده‬
‫کرد‪ .‬مثال در دستور زیر پس از چاپ پیغام‪ ،‬مکان نما به خط بعد منتقل می‬
‫شود‪:‬‬
‫;‪cout >> “List of students : “ >> endl‬‬
‫البته دستکاری کننده های متعدد دیگری نیز ازجمله موارد مربوط به تعیین طول‬
‫میدان و نحوه چاپ مقادیر وجود دارد که توضیح آنها نیاز به یک مبحث مستقل‬
‫دارد‪.‬‬

C++ ‫ ورودی و خروجی اطالعات در‬7-6-3
#include
void main() {
int age;
float average ;
cout << "Please enter your age and average : " ;
cin >> age >> average ;
cout << "You are " << age << "years old and your average is " << average;
}

Please enter your age and average : 19 16.72
You are 19 years old and your average is 16.72

‫‪ 7-7‬توابع کتابخانه ای‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫همانطور که قبال نیز گفته شد‪ ،‬زبان ‪ C‬از زیر برنامه ها نیز حمایت می کند‪ .‬هر زیر برنامه‬
‫در ‪ C‬یک تابع نامیده می شود‪ .‬تا کنون با توابعی همچون ‪ main‬و یا ‪ printf‬و ‪ scanf‬آشنا‬
‫شده ایم‪.‬‬
‫معموال عرضه کنندگان کامپایلرها و یا سایر فروشندگان نرم افزار‪ ،‬برخی از توابع عمومی‬
‫را که ممکن است مورد نیاز جمع کثیری از برنامه نویسان مختلف باشد را در قالب‬
‫کتابخانه ای از توابع در اختیار برنامه نویسان می گذارند‪ .‬بعضی از این توابع کتابخانه ای‬
‫مانند ‪ printf‬و ‪ scanf‬بصورت استاندارد درآمده و توسط عرضه کنندگان مختلف ارائه می‬
‫شوند‪.‬‬
‫در کامپایلر عرضه شده توسط شرکت بورلند )‪ (Borland C++ 3.1‬نیز کتابخانه های‬
‫متعددی از توابع برای شما عرضه شده اند که بتدریج با آنها و کاربردشان آشنا خواهید‬
‫شد‪.‬‬
‫نکته مهم آنستکه برای استفاده از این توابع ابتدا باید فایل سرآمد مربوط به آنها را نیز در‬
‫ابتدای برنامه خود اضافه نمایید ) با استفاده از ‪ .(#include‬هر فایل سرآمد شامل تعاریف‬
‫اولیه گروهی از توابع مرتبط با هم و داده های مربوط به آنها بوده و در استاندارد قدیمی‬
‫تر دارای پسوند ‪ .h‬می باشد)در استاندارد جدید پسوند این فایلها حذف شده است(‪.‬‬
‫برخی از این فایلهای سرآمد عبارتند از‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪ : stdio.h‬توابع ورودی و خروجی استاندارد‬
‫‪ : math.h‬توابع ریاضی‬
‫‪ : graphics.h‬توابع مربوط به عملیات گرافیکی‬
‫‪ : string.h‬توابع مربوط به کار با رشته ها‬


Slide 9

‫مبانی کامپیوتر و برنامه سازی‬
‫فصل هفتم ‪ :‬مفاهیم اولیه زبان ‪C‬‬
‫مدرس ‪ :‬نگین معروفی‬

‫‪ 7-1‬شناسه ها در ‪C‬‬
‫‪‬‬
‫‪‬‬

‫شناسه )‪ (identifier‬نامی است که به یک قسمت از برنامه مانند متغیر‪ ،‬تابع‪ ،‬ثابت و یا‬
‫‪ ...‬داده می شود‪.‬‬
‫در زبان ‪ C‬برای انتخاب شناسه ها فقط می توان از عالئم زیر استفاده کرد‪:‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫حروف انگلیسی کوچک و بزرگ )‪(A…Z a…z‬‬
‫ارقام )‪(0…9‬‬
‫عالمت خط پایین یا _‬

‫البته یک شناسه نمی تواند با یک رقم شروع شود‪.‬‬
‫چند شناسه مجاز‪ name2 ، average ، sum :‬و ‪student_average‬‬
‫چند شناسه غیرمجاز ‪ 2name‬و یا ‪student average‬‬
‫در برنامه نویسی امروزی پیشنهاد می شود بجای شناسه هایی همانند‬
‫‪ student_average‬از ‪ studentAverage‬استفاده گردد‪.‬‬
‫نکته مهم دیگری که باید به آن اشاره کرد آنستکه زبان ‪ C‬برخالف بسیاری از زبانهای دیگر‬
‫به کوچک و بزرگی حروف حساس است )‪ .(case sensitive‬در نتیجه شناسه های زیر با‬
‫یکدیگر متفاوتند ‪:‬‬
‫‪Sum ≠ sum ≠ SUM‬‬
‫آخرین نکته اینستکه در هنگام انتخاب شناسه نمی توانید از کلمات کلیدی که برای‬
‫منظورهای خاص در زبان ‪ C‬رزرو شده اند استفاده کنید‪.‬‬

C ‫ شناسه ها در‬7-1
: C ‫کلمات کلیدی در زبان‬
auto

break

case

char

const

continue

default

do

double

else

enum

extern

float

for

goto

if

int

long

register

return

short

signed

sizeof

static

struct

switch

typedef

union

unsigned

void

volatile

while

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫محدوده‬

‫اندازه )بیت(‬

‫توضیح‬

‫نوع داده‬

‫‪-128 to +127‬‬

‫‪8‬‬

‫کاراکتر‬

‫‪char‬‬

‫‪-32768 to +32767‬‬

‫‪16‬‬

‫عدد صحیح‬

‫‪int‬‬

‫‪3.4e-38 to 3.4e+38‬‬

‫‪32‬‬

‫عدد اعشاری‬

‫‪float‬‬

‫‪1.7e-308 to 1.7e+308‬‬

‫‪64‬‬

‫عدد اعشاری با‬
‫دقت مضاعف‬

‫‪double‬‬

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫‪‬‬

‫البته چند نکته مهم درمورد این جدول قابل ذکر است ‪:‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫اندازه ‪ int‬در محیطهای ‪ 16‬بیتی مانند ‪ DOS‬برابر ‪ 16‬بیت است‪ .‬اما در‬
‫محیطهای ‪ 32‬بیتی همانند ‪ Windows‬اندازه آن ‪ 32‬بیت می باشد که در‬
‫اینصورت محدوده ای برابر ‪ -2,147,483,648‬تا ‪ +2,147,483,647‬را‬
‫پوشش می دهد‪.‬‬
‫در بعضی از کامپایلرهای ‪ ،C‬نوع داده ‪ bool‬نیز وجود دارد که می تواند‬
‫یکی از مقادیر ‪)true‬درست( یا ‪) false‬غلط( را نشان دهد ‪ .‬اما در نسخه‬
‫های اولیه ‪ C‬از همان نوع داده صحیح یا ‪ int‬برای اینکار استفاده می‬
‫شد‪ .‬بدین صورت که ‪ 0‬نشاندهنده ‪ false‬و هر عدد غیر صفر )معموال ‪(1‬‬
‫نشاندهنده ‪ true‬است‪.‬‬
‫از آنجا که برای ذخیره سازی کاراکترها کد اسکی آنها ذخیره می گردد‪،‬‬
‫از یک متغیر کاراکتری یا ‪ char‬می توان بعنوان یک عدد صحیح کوچک نیز‬
‫استفاده کرد و اعمال ریاضی برروی آنها نیز مجاز است‪.‬‬

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫عالوه براین چندین اصالح کننده نیز وجود دارد که به ما اجازه می دهد نوع داده مورد‬
‫نظر را با دقت بیشتری برای نیازهای مختلف استفاده نماییم‪.‬‬
‫این اصالح کننده ها عبارتند از ‪short, long, signed, unsigned :‬‬
‫تمام این اصالح کننده ها می توانند به نوع داده ‪ int‬اعمال شوند و اثر آنها بستگی‬
‫به محیط دارد‪.‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫در یک محیط ‪16‬بیتی‪short int ،‬بازهم برابر ‪16‬بیت است ولی ‪ long int‬برابر‪32‬بیت می‬
‫باشد‪.‬‬
‫‪ unsigned int‬باعث می شود که یک عدد ‪ 16‬بیتی بدون عالمت داشته باشیم که بازه‬
‫بین ‪ 0‬تا ‪ 65535‬را پوشش می دهد‪ signed int .‬نیز همانند ‪ int‬معمولی بوده و تفاوتی‬
‫ندارد‪.‬‬
‫ترکیب این اصالح کننده ها نیز ممکن است‪ .‬مثال ‪ unsigned long int‬یک عدد ‪ 32‬بیتی‬
‫بدون عالمت است که بازه ‪ 0‬تا ‪ 4,294,967,295‬را پوشش می دهد‪.‬‬

‫برروی نوع داده ‪ char‬فقط اصالح کننده های ‪ signed‬و ‪ unsigned‬را می توان اعمال‬
‫کرد‪ .‬معموال از اصالح کننده ‪ unsigned‬وقتی استفاده می شود که قصد داشته‬
‫باشیم از ‪ char‬بعنوان یک عدد صحیح مثبت بین ‪ 0‬تا ‪ 255‬استفاده کنیم‪.‬‬
‫برروی نوع داده ‪ double‬تنها اصالح کننده ‪ long‬قابل اعمال است و دراینصورت عدد‬
‫اعشاری با ‪ 80‬بیت را خواهیم داشت که قادر است هر عددی در بازه ‪ 3.4e-4932‬تا‬
‫‪ 1.1e+4932‬را در خود نگاه دارد‪.‬‬

‫‪ 7-3‬تعریف متغیرها‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای تعریف متغیرها به شکل زیر عمل می کنیم‪:‬‬

‫;>‪ ‫که ‪ type‬یکی از نوع داده های گفته شده و ‪ variable-list‬لیستی از متغیرها است‬
‫که با کاما از یکدیگر جدا شده اند‪ .‬بعنوان مثال ‪:‬‬
‫;‪int sum‬‬
‫;‪float average‬‬
‫; ‪long int a, b, c‬‬
‫; ‪unsigned long int i, j, k‬‬
‫عالوه براین می توان در هنگام تعریف متغیر به آن مقدار اولیه نیز داد‪ .‬مثال ‪:‬‬
‫; ‪int d = 0‬‬
‫نكته مهم آنكه زبان ‪ C‬به متغیرها مقدار اولیه نمي دهد )حتي ‪ (0‬و برنامه نويس‬
‫خود بايد اينكار را صريحا انجام دهد‪ ،‬درغیر اينصورت مقدار اولیه متغیر‪ ،‬نامعین خواهد‬
‫بود‪.‬‬
‫تعریف متغیرها طبق اصول زبان ‪ C‬میتواند درهرجایی از برنامه صورت پذیرد‪ ،‬و‬
‫متغیرهای تعریف شده از همان خط به بعد قابل استفاده خواهد بود‪ .‬اما معموال‬
‫توصیه می گردد كه تعریف متغیرها در همان خط ابتدایی تابع و بالفاصله پس از {‬
‫صورت پذیرد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫‪‬‬
‫‪‬‬

‫ثابتها مقادیر ثابتی هستند كه مقدار آنها در حین اجرای برنامه تغییر نمی یابد‪ .‬ثابتها می توانند از‬
‫هریك از نوع داده های اصلی باشند‪.‬‬
‫ثوابت عددی صحیح ‪:‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫برای نمایش این دسته از ثوابت‪ ،‬از دنباله ای از ارقام بعالوه عالمت ‪ +‬یا ‪ -‬استفاده می كنیم‪ .‬بعنوان مثال‬
‫‪ -45‬و یا ‪ 3489‬ثوابت صحیح هستند‪.‬‬
‫در حالت عادی ‪ C‬هر عدد را در كوچكترین نوع داده ای كه می تواند قرار می دهد‪ .‬مثال عدد ‪ 85‬در یك‬
‫‪ int‬قرار می گیرد‪ ،‬اما عدد ‪ 145398‬در یك ‪ long int‬قرار خواهد گرفت‪.‬‬
‫اگر قصد دارید یك عدد كوچك بعنوان ‪ long‬محسوب گردد‪ ،‬می توانید از پسوند ‪ L‬در انتهای آن استفاده‬
‫می كنیم‪ .‬مثال ‪245L‬یك عدد ‪ long‬محسوب می شود‪.‬‬
‫;‪long int a = 20L‬‬
‫پسوند ‪ U‬در انتهای عدد نیز نشانه بدون عالمت بودن آن است‪.‬‬
‫نكته دیگر آنكه ‪ C‬به شما اجازه می دهد درصورت لزوم ثوابت صحیح خود را در مبنای ‪ 8‬یا ‪ 16‬نیز كه‬
‫از مبناهای متداول در برنامه نویسی هستند‪ ،‬بنویسید‪.‬‬
‫‪‬‬
‫‪‬‬

‫برای نوشتن عدد در مبنای ‪ 8‬باید آن را با ‪ 0‬آغاز كنید‪ ،‬مثال ‪ 0342‬یك عدد در منای ‪ 8‬محسوب می‬
‫گردد‪.‬‬
‫برای نوشتن یك عدد در مبنای ‪ 16‬باید آن را با ‪ 0x‬آغاز نمایید‪ ،‬مانند ‪.0x27A4‬‬

‫‪ 7-4‬ثوابت‬
‫ثوابت عددی اعشاری‬

‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫برای نمایش اعداد اعشاری‪ ،‬باید از نقطه اعشار استفاده كنیم‪ ،‬مانند ‪237.45‬‬
‫اما نكته جالب آنستكه می توانید از نماد علمی نیز برای نمایش اعداد‬
‫اعشاری استفاده كنید‪ .‬برای اینكار كافی است از حرف ‪ e‬برای نمایش قسمت‬
‫توان استفاده نمایید‪ .‬بعنوان مثال ‪:‬‬
‫‪-23.47 × 10 5 = -23.47e5‬‬
‫‪42.389 × 10 -3 = 42.389e-3‬‬
‫دقت كنید كه قسمت توان‪ ،‬حتما یك عدد صحیح است‪.‬‬
‫نكته جالب اینجاست كه برخالف مورد قبل‪ ،‬كامپایلر بطور پیش فرض داده های‬
‫اعشاری را از نوع ‪ double‬فرض می كند‪.‬چنانچه دوست دارید ثابت شما ازنوع‬
‫‪ float‬درنظر گرفته شود‪ ،‬در انتهای آن ‪ F‬قرار دهید‪ .‬ضمنا پسوند ‪ L‬نیز داده‬
‫اعشاری را از نوع ‪ long double‬درنظر می گیرد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫ثوابت كاراكتری ‪:‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫برای نشان دادن ثوابت كاراكتری‪ ،‬آنها را در داخل ' قرار می دهیم‪ .‬بعنوان مثال‬
‫'‪'A‬یك ثابت كاراكتری است‪.‬‬
‫; '‪char ch = 'S‬‬
‫دقت كنید كه همانطور كه قبال گفته شد‪ ،‬كد اسكی كاراكترها در متغیر ذخیره‬
‫می گردد‪ ،‬بنابراین می توان از آن بعنوان یك عدد صحیح نیز استفاده كرد‪ .‬نكته‬
‫مهم دیگر آنستكه به تفاوت عدد ‪ 5‬و كاراكتر '‪ '5‬دقت داشته باشید‪ .‬در حقیقت‬
‫'‪ '5‬برابر است با عدد ‪ 53‬كه همان كد اسكی آن است‪.‬‬
‫روش فوق‪ ،‬برای نمایش کاراکترهای قابل چاپ مناسب است‪ ،‬اما بعضی‬
‫كاراكترها مانند ‪ enter‬قابل نمایش نبوده و برای آنها شکل خاصی وجود ندارد‪.‬‬
‫در چنین مواردی‪ ،‬زبان ‪ C‬از ترکیب عالمت \ به همراه یک کاراکتر دیگر‪ ،‬برای‬
‫نمایش این قبیل کاراکترها استفاده می نماید‪ .‬بعنوان مثال‪ ،‬کاراکتر '‪ '\n‬نشان‬
‫دهنده خط جدید یا همان ‪ enter‬می باشد‪.‬‬
‫جدول صفحه بعد این قبیل کاراکترها و معادل آنها را نشان می دهد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫نحوه نمایش در ‪C‬‬

‫کد اسکی‬

‫صدای بوق کامپیوتر‬

‫‪\a‬‬

‫‪7‬‬

‫حرکت به عقب ‪backspace‬‬

‫‪\b‬‬

‫‪8‬‬

‫شروع صفحه ‪form feed‬‬

‫‪\f‬‬

‫‪12‬‬

‫سطر جدید ‪line feed‬‬

‫‪\n‬‬

‫‪10‬‬

‫برگشت به ابتداي سطر ‪carriage return‬‬

‫‪\r‬‬

‫‪13‬‬

‫فاصله افقی ‪horizontal tab‬‬

‫‪\t‬‬

‫‪9‬‬

‫فاصله عمودی ‪vertical tab‬‬

‫‪\v‬‬

‫‪11‬‬

‫عالمت سوال‬

‫?\‬

‫‪63‬‬

‫عالمت '‬

‫'\‬

‫‪39‬‬

‫عالمت "‬

‫"\‬

‫‪34‬‬

‫عالمت \‬

‫\\‬

‫‪92‬‬

‫عالمت تهی‬

‫‪\0‬‬

‫‪0‬‬

‫نام کاراکتر‬

‫کد اسکی یک کاراکتر با ‪ 3‬رقم در مبنای ‪8‬‬

‫‪\000‬‬

‫کد اسکی یک کاراکتر با ‪ 2‬رقم در مبنای ‪16‬‬

‫‪\x00‬‬

‫‪ 7-4‬ثوابت‬
‫‪‬‬

‫ثوابت رشته ای ‪ C :‬عالوه بر ثوابت فوق‪ ،‬از یك ثابت دیگر بنام رشته نیز‬
‫حمایت می كند‪ .‬رشته‪ ،‬دنباله ای از كاراكترها است كه در داخل " قرار‬
‫می گیرند‪ .‬بعنوان مثال "‪ "this is a test‬یك رشته است‪ .‬دقت كنید كه '‪'a‬‬
‫یك كاراكتر است‪ ،‬اما "‪ "a‬یك رشته است كه فقط شامل یك كاراكتر می‬
‫باشد‪.‬‬

‫‪ 7-5‬عملگرها‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫عملگر‪ ،‬نمادی است كه به كامپایلر می گوید تا عملیات محاسباتی یا‬
‫منطقی خاصی را برروی یك یا چند عملوند‪ ،‬انجام دهد‪.‬‬
‫به عملگرهایی كه فقط یك عملوند دارند‪ ،‬عملگر یكانی می گوییم و‬
‫همواره عملگر در سمت چپ عملوند قرار می گیرد)مانند عدد ‪.(-125‬‬
‫اما عملگرهایی كه برروی دو عملوند اثر می كنند را عملگر دودویی‬
‫نامیده و عملگر را بین دو عملوند قرار می دهیم )مانند ‪.(23+86‬‬
‫هر ترکیب درستی از عملگرها و عملوندها را یک عبارت می نامیم‪.‬‬
‫‪ C‬از نقطه نظر عملگرها یك زبان بسیار قوی است‪ .‬این عملگرها به چند‬
‫دسته اصلی تقسیم می گردند كه آنها را به ترتیب بررسی می كنیم‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫این عملگرها‪ ،‬همان اعمال متداول ریاضی هستند كه در زبان ‪ C‬مورد استفاده‬
‫قرار می گیرند‪ .‬این اعمال عبارتند از ‪:‬‬

‫عمل‬

‫نوع‬

‫عملگر‬

‫منفی كردن عملوند سمت راست‬

‫یكانی‬

‫‪-‬‬

‫جمع دو عملوند‬

‫دودویی‬

‫‪+‬‬

‫تفریق دو عملوند‬

‫دودویی‬

‫‪-‬‬

‫ضرب دو عملوند‬

‫دودویی‬

‫*‬

‫تقسیم دو عملوند‬

‫دودویی‬

‫‪/‬‬

‫محاسبه باقیمانده تقسیم دو عملوند‬

‫دودویی‬

‫‪%‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬
‫‪‬‬

‫این عملگرهای برروی همه انواع داده های ‪ C‬عمل می كنند‪ ،‬بجز عملگر ‪ %‬كه فقط‬
‫برروی نوع داده های صحیح عمل می كند‪.‬‬
‫اما نكته مهمی كه باید به آن اشاره كرد‪ ،‬نحوه كار عملگر تقسیم برروی نوع داده های‬
‫مختلف است‪.‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫درصورتیكه هردو عملوند صحیح باشند‪ ،‬تقسیم بصورت صحیح بر صحیح انجام خواهد شد‪.‬‬
‫اگر یكی یا هر دو عملوند اعشاری باشند‪ ،‬تقسیم بصورت اعشاری انجام خواهد پذیرفت‪.‬‬
‫فرض كنید تعاریف زیر را داریم ‪:‬‬
‫; ‪int a,b‬‬
‫; ‪float c,d‬‬
‫; ‪a = 10 ; b = 4‬‬
‫;‪c = 8.2; d = 4.0‬‬
‫اكنون به نتایج عملیات زیر دقت كنید ‪:‬‬
‫‪a / b => 2‬‬
‫‪c / d => 2.05‬‬
‫‪a / d => 2.5‬‬
‫‪a / 4 => 2‬‬
‫چنانچه به آخرین مورد توجه كنید‪ ،‬متوجه می شوید كه از آنجا كه ‪a‬یك متغیر صحیح است و ‪4‬‬
‫نیز یك ثابت صحیح در نظر گرفته شده‪ ،‬درنتیجه تقسیم بصورت صحیح بر صحیح انجام گرفته‬
‫است‪ .‬چنانچه بخواهیم تقسیم بصورت اعشاری صورت پذیرد‪ ،‬به دو شكل می توانیم عمل‬
‫كنیم‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫برای اینکه عبارت تقسیم صفحه قبل بصورت اعشاری انجام شود‪ ،‬به دو روش‬
‫می توان عمل کرد‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫این عبارت را بصورت ‪ a / 4.0‬بنویسیم‪.‬‬
‫از عملگر قالب ریزی استفاده كنیم‪.‬‬

‫عملگر قالب ریزی می تواند یك نوع را به نوع دیگری تبدیل نماید‪ .‬شكل كلی آن‬
‫به شكل زیر است ‪:‬‬
‫>‪() ‫كه ‪ type‬نوع مورد نظر است كه قصد تبدیل عبارت ‪ expression‬به آن نوع را‬
‫داریم‪ .‬بعنوان مثال در مورد قبلی می توان به شكل زیر عمل كرد ‪:‬‬
‫‪(float) a / 4‬‬
‫در این حالت از كامپایلر خواسته ایم كه ابتدا عدد ‪ a‬را به اعشاری تبدیل كند‬
‫)البته بصورت موقت( و سپس آن را بر ‪ 4‬تقسیم نماید‪ ،‬كه مسلما حاصل‬
‫اعشاری خواهد بود‪.‬‬
‫بطوركلی هرگاه ثابتها و متغیرهایی از انواع مختلف در یك عبارت محاسباتی‬
‫داشته باشیم‪ ،‬كامپایلر ‪ C‬همه آنها را به یك نوع یكسان كه همان بزرگترین‬
‫عملوند موجود است تبدیل خواهد كرد‪ .‬بعنوان مثال به مورد صفحه بعد دقت‬
‫كنید ‪:‬‬

‫ عملگرهای محاسباتی‬7-5-1
char ch;
int i;

float f;
double d;
result = (ch / i)
int

+

(f *d)

(f+i)
float

double

double

int

-

double

double

float

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫اولویت عملگرها ‪ :‬در عبارتی که شامل چندین عملگر است‪ ،‬کدامیک در‬
‫ابتدا اعمال خواهد گردید‪.‬‬
‫اولویت عملگرهای محاسباتی از باال به پایین بشرح زیر است‪:‬‬
‫‪ ‬عملگر یکانی –‬
‫‪ ‬عملگرهای * و ‪ /‬و ‪%‬‬
‫‪ ‬عملگرهای ‪ +‬و –‬
‫چنانچه اولویت دو عملگر یکسان باشد‪ ،‬این عملگرها از چپ به راست‬
‫محاسبه خواهند شد‪.‬‬
‫چنانچه بخواهیم یک عمل با اولویت پایین زودتر انجام شود‪ ،‬باید از پرانتز‬
‫استفاده کنیم‪ .‬بنابراین اولویت عملگر پرانتز از همه موارد فوق‬
‫بیشتراست‪ .‬در مورد پرانتزهای متداخل‪ ،‬ابتدا پرانتز داخلی محاسبه‬
‫می شود؛ اما در مورد پرانتزهای هم سطح‪ ،‬ابتدا پرانتز سمت چپتر‬
‫محاسبه می گردد‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫چند مثال در مورد اولویت عملگرها‬

‫ترتیب اجرای عملگرها‬

‫عبارت زبان ‪C‬‬

‫ابتدا عمل * و سپس عمل ‪+‬‬

‫‪b+c*d‬‬

‫ابتدا عمل ‪ +‬و سپس عمل *‬

‫‪(b + c) * d‬‬

‫ابتدا عمل ‪ /‬سپس عمل * و در انتها عمل ‪+‬‬

‫‪b+c/d*e‬‬

‫ابتدا عمل * سپس عمل ‪ /‬و در انتها عمل ‪+‬‬

‫)‪b + c / (d * e‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫یک مثال کامل در مورد اولویت عملگرها‬

‫‪result = a + b * (f – (g + b) / d) – c * (a – d) / e‬‬
‫‪6‬‬

‫‪1‬‬
‫‪7‬‬

‫‪2‬‬

‫‪8‬‬

‫‪3‬‬
‫‪4‬‬
‫‪5‬‬
‫‪9‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫در زبان ‪ C‬برای انتساب چندین عملگر وجود دارد‪ .‬ساده ترین عملگر انتساب‪ ،‬همان عملگر =‬
‫است که در بسیاری از زبانها استفاده می شود‪ .‬بعنوان مثال ‪:‬‬
‫;‪a = 5‬‬
‫;‪b = c + 2 * d‬‬
‫این عملگر باعث می شود که عبارت سمت راست در عبارت سمت چپ قرار گیرد‪.‬‬
‫توجه کنید که مقدار سمت چپ باید عبارتی باشد که بتوان به آن یک مقدار را نسبت داد‬
‫)مانند یک متغیر( که به آن ‪ Lvalue‬گفته می شود‪ ،‬بنابراین یک ثابت نمی تواند در سمت چپ‬
‫قرار گیرد‪.‬‬
‫نکته دیگر اینکه اولویت عملگر = از عملگرهای ریاضی کمتر است و درنتیجه ابتدا آن عملیات‬
‫انجام شده و در پایان حاصل در عبارت سمت چپ ریخته می شود‪.‬‬
‫الزم به ذکر است که در هنگام انتساب‪ ،‬درصورت لزوم نوع عبارت سمت راست به نوع عبارت‬
‫سمت چپ تبدیل می شود‪ .‬مثال‪:‬‬
‫;‪int a‬‬
‫;‪a = 2.5 * 5.0‬‬
‫که دراینصورت عدد ‪ 12‬در ‪ a‬ذخیره خواهد شد‪.‬‬
‫شرکت پذیری این عملگر از راست به چپ می باشد‪ ،‬بدین معنا که چنانچه چندین عملگر‬
‫نسبت دهی داشته باشیم‪ ،‬این عملگرها از راست به چپ محاسبه می شوند‪ .‬مثال پس از‬
‫اجرای دستور زیر‪ ،‬مقدار هر ‪ 3‬متغیر برابر ‪ 10‬خواهد شد‪.‬‬
‫;‪a = b = c = 10‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬

‫نکته جالب درمورد زبان ‪ C‬آنستکه دارای یک سری عملگرهای انتساب‬
‫خالصه شده است که باعث می شوند در بعضی موارد بتوانیم عبارات‬
‫کوتاهتری را بنویسیم‪ .‬این عملگرها عبارتند از ‪:‬‬
‫عملگرد‬

‫مثال‬

‫عبارت انتساب معادل‬

‫‪++‬‬

‫;‪a ++‬‬

‫;‪a = a + 1‬‬

‫‪--‬‬

‫;‪a --‬‬

‫;‪a = a – 1‬‬

‫=‪+‬‬

‫;‪a += 5‬‬

‫;‪a = a + 5‬‬

‫=‪-‬‬

‫;‪a -= 8‬‬

‫;‪a= a – 8‬‬

‫=*‬

‫;‪a *= 10‬‬

‫;‪a= a * 10‬‬

‫=‪/‬‬

‫;‪a /= 2‬‬

‫;‪a = a / 2‬‬

‫=‪%‬‬

‫;‪a %= 10‬‬

‫;‪a = a % 10‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬
‫‪‬‬

‫عملگر اول و دوم‪ ،‬عملگرهای یکانی هستند که بترتیب عملگر افزایش و عملگر کاهش‬
‫نامیده می شوند‪.‬‬
‫نکته جالب آنستکه این دو عملگر به دوصورت مورد استفاده قرار می گیرند‪.‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫در حالتی که از دستور ;‪ a ++‬استفاده شود به آن پس افزایش می گویند و بدین معناست که‬
‫ابتدا از مقدار فعلی ‪ a‬در عبارت موردنظر استفاده کن و سپس آن را افزایش بده‪.‬‬
‫اما دستور ;‪ ++ a‬که به آن پیش افزایش گفته می شود‪ ،‬ابتدا ‪ a‬را افزایش داده و سپس از آن‬
‫در عبارت استفاده می کند‪.‬‬
‫به برنامه زیر دقت کنید‪:‬‬

‫>‪#include ‫{ )(‪void main‬‬
‫; ‪int a ,b‬‬
‫;‪a=5‬‬
‫;‪b = a ++‬‬
‫;)‪printf(“a=%d and b=%d \n”,a,b‬‬
‫;‪a=5‬‬
‫;‪b = ++ a‬‬
‫;)‪printf(“a=%d and b=%d \n”,a,b‬‬
‫}‬
‫‪a=6 b=5‬‬
‫‪a=6 b=6‬‬

‫‪ 7-5-3‬عملگرهای مقایسه ای‬
‫‪‬‬

‫‪‬‬

‫این عملگرها دو عبارت را بایکدیگر مقایسه کرده و نتیجه را باز می گردانند‪.‬‬
‫نتیجه می تواند درست )‪ (true‬یا غلط )‪ (false‬باشد‪.‬‬
‫نتیجه این عملگرها یک عدد صحیح است که درصورت درست بودن ‪ 1‬و‬
‫درصورت غلط بودن ‪ 0‬باز می گردانند‪ .‬این عملگرها عبارتند از‪:‬‬
‫عملگر‬

‫مفهوم عملگر‬

‫مثال‬

‫<‬

‫بزرگتر )<(‬

‫‪a>b‬‬

‫>‬

‫کوچکتر )>(‬

‫‪a
‫=<‬

‫بزرگتر یا مساوی )≤(‬

‫‪a >= b‬‬

‫=>‬

‫کوچکتر یا مساوی )≥(‬

‫‪a <= b‬‬

‫==‬

‫مساوی )=(‬

‫‪a == b‬‬

‫=!‬

‫نامساوی )≠(‬

‫‪a != b‬‬

‫‪ 7-5-3‬عملگرهای مقایسه ای‬
‫‪‬‬

‫‪‬‬

‫نکته مهمی که باید به آن دقت کرد عملگر مساوی )==( است‪ ،‬چرا که یک‬
‫اشتباه بسیار متداول برنامه نویسان ‪ C‬استفاده اشتباه از عملگر انتساب‬
‫)=( بجای عملگر تساوی )==( است که باعث ایجاد خطا در برنامه می‬
‫شود‪.‬‬
‫اولویت این عملگرها از باال به پایین بشرح زیر است‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫عملگرهای <‪ <= ، > ،‬و =>‬
‫عملگرهای == و =!‬

‫الزم بذکر است که در هنگام مساوی بودن اولویت چند عملگر‪ ،‬این عملگرها‬
‫از چپ به راست محاسبه می گردند‪.‬‬

‫‪ 7-5-4‬عملگرهای منطقی‬
‫‪‬‬

‫این عملگرها به شما اجازه می دهند که شرطهای ساده ای را که با‬
‫استفاده از عملگرهای مقایسه ای ایجاد شده اند را با یکدیگر ترکیب نموده‬
‫و شرطهای پیچیده تری را بسازید‪ .‬این عملگرها عبارتند از ‪:‬‬
‫مثال‬

‫عملگر‬

‫مفهوم عملگر‬

‫نحوه کار‬

‫&&‬

‫‪ AND‬منطقی‬

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

‫‪a>0 && sw==1‬‬

‫||‬

‫‪ OR‬منطقی‬

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

‫‪a<=100 || b!=0‬‬

‫!‬

‫‪ NOT‬منطقی‬

‫اگر عملوند درست باشد‪ ،‬نادرست و‬
‫اگر نادرست باشد‪ ،‬درست برمی‬
‫گرداند‪.‬‬

‫)‪! (a==1 || b<10‬‬

‫‪ 7-5-5‬عملگر شرطی‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫گاهی الزم است که ابتدا یک شرط بررسی شده و سپس برمبنای نتیجه )درست یا نادرست بودن آن( یکی‬
‫از دو عبارت ممکن بازگردانده شود‪ .‬برای اینکار می توان از یک عملگر ‪3‬تایی )با ‪ 3‬عملوند( بنام عملگر‬
‫شرطی استفاده نمود‪.‬‬
‫شکل کلی این عملگر بصورت زیر است‪:‬‬
‫>عبارت‪> :<2‬عبارت‪> ?<1‬شرط<‬
‫نحوه کار بدینصورت است که درصورت درست بودن شرط‪ ،‬عبارت‪ 1‬و در غیراینصورت عبارت ‪ 2‬بازگردانده می‬
‫شود‪.‬‬
‫به عنوان مثال به دستور زیر توجه کنید‪:‬‬
‫که این عبارت معادل دستور زیر است‪:‬‬

‫‪‬‬

‫;‪a = (k<10) ? 100 : 50‬‬
‫;‪if (k<10) a=100‬‬
‫;‪else a=50‬‬

‫البته این عبارت به شکلهای پیچیده نیز می تواند مورد استفاده قرار گیرد‪ .‬مثال ‪:‬‬
‫;‪c += (a>0 && a<10) ? ++a : a/b‬‬
‫که معادل است با ‪:‬‬
‫{ )‪if (a>0 && a<10‬‬
‫;‪a= a + 1‬‬
‫;‪c = c + a‬‬
‫}‬
‫;‪else c = c + a/b‬‬

‫‪ 7-5-6‬اولویت عملگرها‬
‫عملگر‬

‫اولویت‬

‫شرکت پذیری‬

‫‪1‬‬

‫)(‬

‫از چپ به راست‬

‫‪2‬‬

‫‪- + ! -- ++‬‬

‫از راست به چپ‬

‫‪3‬‬

‫‪* / %‬‬

‫از چپ به راست‬

‫‪4‬‬

‫‪+ -‬‬

‫از چپ به راست‬

‫‪5‬‬

‫>> <<‬

‫از چپ به راست‬

‫‪6‬‬

‫>= > <= <‬

‫از چپ به راست‬

‫‪7‬‬

‫=! ==‬

‫از چپ به راست‬

‫‪8‬‬

‫&&‬

‫از چپ به راست‬

‫‪9‬‬

‫||‬

‫از چپ به راست‬

‫‪10‬‬

‫‪?:‬‬

‫از راست به چپ‬

‫‪11‬‬

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

‫از راست به چپ‬

‫‪12‬‬

‫‪,‬‬

‫از چپ به راست‬

‫‪ 7-6‬خواندن و نمایش اطالعات‬
‫‪‬‬

‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫همانطور كه قبال نیز گفته شد‪ ،‬یكی از اهداف زبان ‪ C‬قابل حمل بودن آن‬
‫است‪ .‬بهمین منظور سعی شده است كه از دستوراتی كه ممكن است‬
‫وابسته به ماشین خاصی باشد‪ ،‬اجتناب گردد‪.‬‬
‫بهمین دلیل زبان ‪ C‬برخالف سایر زبانها دارای هیچ دستوری برای‬
‫خواندن از ورودی و یا نوشتن در خروجی نیست‪.‬‬
‫اما در عوض دارای تعدادی تابع )زیربرنامه( استاندارد می باشد كه تقریبا‬
‫تمامی كامپایلرها از آنها حمایت می كنند‪.‬‬
‫این كار به كامپایلر این امكان را می دهد كه بر حسب نوع سخت افزار‬
‫موردنظر‪ ،‬توابع ورودی و خروجی را طراحی نماید‪.‬‬
‫این توابع در یك فایل سرآمد بنام ‪ stdio.h‬تعریف شده اند و بنابراین قبل‬
‫ازاینكه بتوانید از این توابع استفاده نمایید‪ ،‬باید این فایل را نیز با استفاده‬
‫از ‪ #include‬در برنامه خود بگنجانید‪.‬‬

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫برای نمایش اطالعات در خروجی از تابع ‪ printf‬استفاده می شود‪.‬‬
‫این تابع رشته موردنظر شما را به خروجی استاندارد )كه در حالت‬
‫عادی همان صفحه نمایش یا مانیتور است( می فرستد‪ .‬شكل كلی این‬
‫تابع بصورت زیر است‪:‬‬
‫; )>لیست متغیرها< ‪> ,‬رشته كنترلی<(‪printf‬‬
‫رشته كنترلی همان متنی است كه قصد چاپ آن را داریم‪ ،‬با ذكر این‬
‫نكته كه در قسمتهایی كه باید مقدار یك متغیر چاپ شود‪ ،‬از یك‬
‫مشخصه تبدیل استفاده می شود‪ .‬هر مشخصه تبدیل از یك عالمت ‪%‬‬
‫بعالوه یك كاراكتر كه نوع متغیر مورد نظر را نشان می دهد تشكیل می‬
‫گردد‪.‬‬
‫لیست متغیرها نیز همان متغیرهایی هستند كه قصد چاپ آنها را داریم‪.‬‬
‫این متغیرها باید بترتیب قرار گرفته و با كاما )‪ (,‬از یكدیگر جدا شوند‪.‬‬

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫مشخصه تبدیل‬

‫مفهوم‬

‫‪%c‬‬

‫كاراكتر‬

‫‪%d‬‬

‫عدد صحیح در مبنای ‪10‬‬

‫‪%f‬‬

‫عدد اعشاری بدون نماد علمی‬

‫‪%e‬‬

‫عدد اعشاری با نماد علمی‬

‫‪%g‬‬

‫عدد اعشاری با حالت كوتاهتر بین ‪ e‬و ‪f‬‬

‫‪%s‬‬

‫رشته‬

‫‪%ld‬‬

‫عدد صحیح بزرگ‬

‫‪%lf %le %lg‬‬

‫عدد اعشاری بزرگ‬

‫‪%o‬‬

‫عدد صحیح در مبنای ‪8‬‬

‫‪%x‬‬

‫عدد صحیحی در مبنای ‪16‬‬

‫‪%u‬‬

‫عدد صحیح بدون عالمت‬

‫ تابع نمایش در خروجی‬7-6-1
#include
void main() {
int age = 20;
floate average = 18.23;
printf("You are %d years old and your average is %f \n",age,average);
}
You are 20 years old and your average is 18.230000

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫‪‬‬
‫‪‬‬

‫برای کنترل نحوه چاپ اعداد می توانید از مشخصه طول میدان استفاده‬
‫کنید‪.‬‬
‫مشخصه طول میدان برای اعداد به شكل زیر استفاده می شود‪:‬‬
‫‪ ‬برای اعداد صحیح از ‪ %nd‬استفاده می كنیم كه ‪ n‬تعداد ارقام را نشان‬
‫می دهد )مثال ‪ .(%3d‬در اینصورت برای هر متغیر ‪ n‬رقم درنظر گرفته‬
‫می شود‪ .‬اگر اندازه عدد از ‪ n‬كوچكتر باشد‪ ،‬به سمت چپ آن فضای‬
‫خالی اضافه می شود و اگر اندازه عدد بیش از ‪ n‬رقم باشد‪ ،‬طول میدان‬
‫نادیده گرفته شده و عدد بطور كامل چاپ می شود‪.‬‬
‫‪ ‬برای اعداد اعشاری از ‪ %n.mf‬استفاده می كنیم كه ‪ n‬اندازه كل عدد‬
‫)شامل عالمت ممیز( و ‪ m‬تعداد ارقام اعشار است )مثال ‪ .(%5.2f‬در‬
‫صورتیكه تعداد ارقام اعشاری عدد موردنظر از ‪ m‬بیشتر باشد‪ ،‬عدد به ‪m‬‬
‫عدد اعشار گرد می شود و در صورتیكه از ‪ m‬كمتر باشد‪ ،‬در سمت‬
‫راست آن ‪ 0‬قرار داده می شود‪.‬‬

‫‪ 7-6-2‬تابع خواندن از ورودی‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای خواندن اطالعات از ورودی از تابع ‪ scanf‬استفاده می شود‪.‬‬
‫این تابع اطالعات را ازورودی استاندارد )معموال صفحه كلید( خوانده و در‬
‫متغیرهای تعیین شده قرار می دهد‪.‬‬
‫شكل كلی این تابع بصورت زیر است‪:‬‬
‫; )>لیست آدرسهای متغیرها< ‪> ,‬رشته كنترلی<(‪scanf‬‬
‫همانطور كه می بینید نحوه احضار تابع ‪ scanf‬نیز مشابه ‪ printf‬است‪ .‬تنها‬
‫تفاوت در آن است كه در ‪ scanf‬باید لیست آدرسهای متغیرها ارسال شود‪.‬‬
‫مبحث مربوط به آدرسها در فصول بعدی بررسی خواهد شد ولی در حال حاضر‬
‫بخاطر بسپارید كه برای بدست آوردن آدرس یك متغیر از عالمت & استفاده می‬
‫كنیم‪ .‬بعنوان مثال ‪ &age‬بمعنای آدرس متغیر ‪ age‬است‪.‬‬
‫بطور كلی در ‪ C‬قدیمی هرگاه كه یك تابع دارای پارامترهای خروجی بود )یعنی‬
‫پارامترهایی كه یك مقدار را باز می گرداندند( از آدرس متغیرها استفاده می‬
‫شد كه امروزه این مسئله وجود ندارد‪.‬‬

‫ تابع خواندن از ورودی‬7-6-2
#include
void main() {
int age;
float average ;
printf("Please enter your age and average : ");
scanf("%d %f",&age,&average);
printf("You are %d years old and your average is %5.2f \n",age,average);
}

Please enter your age and average : 19 16.72
You are 19 years old and your average is 16.72

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫زبان ‪ C++‬یک زبان شی گرا است‪ ،‬بهمین دلیل در این زبان برای ورودی‬
‫و خروجی از اشیاء بجای توابع استفاده می گردد‪.‬‬
‫از آنجا که امروزه معموال برنامه نویسان ‪ C‬از کامپایلرهای ‪ C++‬استفاده‬
‫می کنند‪ ،‬می توانند از اشیای ورودی و خروجی آن نیز استفاده کنند‪.‬‬
‫اینکار در بین بسیاری از برنامه نویسان ‪ C‬متداول است‪ ،‬بهمین دلیل ما‬
‫در اینجا نحوه کار با اشیای خواندن و نوشتن در ‪ C++‬را بطور مقدماتی‬
‫توضیح می دهیم؛ گرچه توضیح کامل این موارد نیاز به آشنایی با شی‬
‫گرایی و زبان ‪ C++‬دارد‪.‬‬
‫قبل از هرچیز الزم به ذکر است که کلیه اشیای مربوط به ورودی و‬
‫خروجی در فایل سرآمدی بنام ‪ iostream.h‬تعیریف شده اند‪ ،‬بنابراین‬
‫ابتدا باید این فایل به برنامه توسط دستور ‪ #include‬الحاق گردد‪.‬‬

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫زبان ‪ C++‬برای نمایش اطالعات از یک شیئ بنام ‪ cout‬استفاده می نماید‪.‬‬
‫برای ارسال اطالعات مورد نظر برای چاپ به ‪ cout‬باید از عملگر درج در جریان‬
‫یا >> استفاده نماییم‪ .‬بعنوان مثال ‪:‬‬
‫; ” ‪cout >> “Please enter your name:‬‬
‫و یا مثال دیگر ‪:‬‬
‫;‪int a = 10‬‬
‫;‪float b = 2.86‬‬
‫;‪cout << a‬‬
‫;‪cout << b‬‬
‫نکته جالبی که در این مثالها دیده می شود‪ ،‬آنستکه برخالف تابع ‪ printf‬هیچ‬
‫نیازی به مشخص کردن نوع متغیری که قصد چاپ آن را داریم نیست و خود‬
‫شئ ‪ cout‬نوع آن را تشخیص می دهد‪.‬‬
‫عالوه براین می توان چندین عملگر درج در جریان را با یکدیگر الحاق کرد و‬
‫چندین متغیر را با یک دستور چاپ کرد‪.‬‬

C++ ‫ ورودی و خروجی اطالعات در‬7-6-3
#include
void main() {
int age = 20;
floate average = 18.23;
cout >> “You are ” >> age >> “ years old and your average is ” >> average ;
}

You are 20 years old and your average is 18.230000

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای دریافت اطالعات از کاربر‪ ،‬از شئ دیگری بنام ‪ cin‬استفاده می شود‪.‬‬
‫برای ارسال متغیر مورد نظر به ‪ cin‬باید از عملگر استخراج از جریان یا <<‬
‫استفاده نماییم‪ .‬بعنوان مثال‪:‬‬
‫;‪int a‬‬
‫;‪cin >> a‬‬
‫بازهم همانطور که می بینید نیازی به تعیین نوع متغیر موردنظر نیست و خود‬
‫شئ ‪ cin‬نوع متغیر را بطور اتوماتیک تشخیص داده و داده ای از همان نوع را از‬
‫کاربر دریافت و در متغیر مورد نظر قرار می دهد‪.‬‬
‫عملگرهای استخراج از جریان را نیز می توان با یکدیگر الحاق کرد‪.‬‬
‫برای رفتن به خط بعد در شئ ‪ cout‬می توان از دستکاری کننده ‪ endl‬استفاده‬
‫کرد‪ .‬مثال در دستور زیر پس از چاپ پیغام‪ ،‬مکان نما به خط بعد منتقل می‬
‫شود‪:‬‬
‫;‪cout >> “List of students : “ >> endl‬‬
‫البته دستکاری کننده های متعدد دیگری نیز ازجمله موارد مربوط به تعیین طول‬
‫میدان و نحوه چاپ مقادیر وجود دارد که توضیح آنها نیاز به یک مبحث مستقل‬
‫دارد‪.‬‬

C++ ‫ ورودی و خروجی اطالعات در‬7-6-3
#include
void main() {
int age;
float average ;
cout << "Please enter your age and average : " ;
cin >> age >> average ;
cout << "You are " << age << "years old and your average is " << average;
}

Please enter your age and average : 19 16.72
You are 19 years old and your average is 16.72

‫‪ 7-7‬توابع کتابخانه ای‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫همانطور که قبال نیز گفته شد‪ ،‬زبان ‪ C‬از زیر برنامه ها نیز حمایت می کند‪ .‬هر زیر برنامه‬
‫در ‪ C‬یک تابع نامیده می شود‪ .‬تا کنون با توابعی همچون ‪ main‬و یا ‪ printf‬و ‪ scanf‬آشنا‬
‫شده ایم‪.‬‬
‫معموال عرضه کنندگان کامپایلرها و یا سایر فروشندگان نرم افزار‪ ،‬برخی از توابع عمومی‬
‫را که ممکن است مورد نیاز جمع کثیری از برنامه نویسان مختلف باشد را در قالب‬
‫کتابخانه ای از توابع در اختیار برنامه نویسان می گذارند‪ .‬بعضی از این توابع کتابخانه ای‬
‫مانند ‪ printf‬و ‪ scanf‬بصورت استاندارد درآمده و توسط عرضه کنندگان مختلف ارائه می‬
‫شوند‪.‬‬
‫در کامپایلر عرضه شده توسط شرکت بورلند )‪ (Borland C++ 3.1‬نیز کتابخانه های‬
‫متعددی از توابع برای شما عرضه شده اند که بتدریج با آنها و کاربردشان آشنا خواهید‬
‫شد‪.‬‬
‫نکته مهم آنستکه برای استفاده از این توابع ابتدا باید فایل سرآمد مربوط به آنها را نیز در‬
‫ابتدای برنامه خود اضافه نمایید ) با استفاده از ‪ .(#include‬هر فایل سرآمد شامل تعاریف‬
‫اولیه گروهی از توابع مرتبط با هم و داده های مربوط به آنها بوده و در استاندارد قدیمی‬
‫تر دارای پسوند ‪ .h‬می باشد)در استاندارد جدید پسوند این فایلها حذف شده است(‪.‬‬
‫برخی از این فایلهای سرآمد عبارتند از‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪ : stdio.h‬توابع ورودی و خروجی استاندارد‬
‫‪ : math.h‬توابع ریاضی‬
‫‪ : graphics.h‬توابع مربوط به عملیات گرافیکی‬
‫‪ : string.h‬توابع مربوط به کار با رشته ها‬


Slide 10

‫مبانی کامپیوتر و برنامه سازی‬
‫فصل هفتم ‪ :‬مفاهیم اولیه زبان ‪C‬‬
‫مدرس ‪ :‬نگین معروفی‬

‫‪ 7-1‬شناسه ها در ‪C‬‬
‫‪‬‬
‫‪‬‬

‫شناسه )‪ (identifier‬نامی است که به یک قسمت از برنامه مانند متغیر‪ ،‬تابع‪ ،‬ثابت و یا‬
‫‪ ...‬داده می شود‪.‬‬
‫در زبان ‪ C‬برای انتخاب شناسه ها فقط می توان از عالئم زیر استفاده کرد‪:‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫حروف انگلیسی کوچک و بزرگ )‪(A…Z a…z‬‬
‫ارقام )‪(0…9‬‬
‫عالمت خط پایین یا _‬

‫البته یک شناسه نمی تواند با یک رقم شروع شود‪.‬‬
‫چند شناسه مجاز‪ name2 ، average ، sum :‬و ‪student_average‬‬
‫چند شناسه غیرمجاز ‪ 2name‬و یا ‪student average‬‬
‫در برنامه نویسی امروزی پیشنهاد می شود بجای شناسه هایی همانند‬
‫‪ student_average‬از ‪ studentAverage‬استفاده گردد‪.‬‬
‫نکته مهم دیگری که باید به آن اشاره کرد آنستکه زبان ‪ C‬برخالف بسیاری از زبانهای دیگر‬
‫به کوچک و بزرگی حروف حساس است )‪ .(case sensitive‬در نتیجه شناسه های زیر با‬
‫یکدیگر متفاوتند ‪:‬‬
‫‪Sum ≠ sum ≠ SUM‬‬
‫آخرین نکته اینستکه در هنگام انتخاب شناسه نمی توانید از کلمات کلیدی که برای‬
‫منظورهای خاص در زبان ‪ C‬رزرو شده اند استفاده کنید‪.‬‬

C ‫ شناسه ها در‬7-1
: C ‫کلمات کلیدی در زبان‬
auto

break

case

char

const

continue

default

do

double

else

enum

extern

float

for

goto

if

int

long

register

return

short

signed

sizeof

static

struct

switch

typedef

union

unsigned

void

volatile

while

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫محدوده‬

‫اندازه )بیت(‬

‫توضیح‬

‫نوع داده‬

‫‪-128 to +127‬‬

‫‪8‬‬

‫کاراکتر‬

‫‪char‬‬

‫‪-32768 to +32767‬‬

‫‪16‬‬

‫عدد صحیح‬

‫‪int‬‬

‫‪3.4e-38 to 3.4e+38‬‬

‫‪32‬‬

‫عدد اعشاری‬

‫‪float‬‬

‫‪1.7e-308 to 1.7e+308‬‬

‫‪64‬‬

‫عدد اعشاری با‬
‫دقت مضاعف‬

‫‪double‬‬

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫‪‬‬

‫البته چند نکته مهم درمورد این جدول قابل ذکر است ‪:‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫اندازه ‪ int‬در محیطهای ‪ 16‬بیتی مانند ‪ DOS‬برابر ‪ 16‬بیت است‪ .‬اما در‬
‫محیطهای ‪ 32‬بیتی همانند ‪ Windows‬اندازه آن ‪ 32‬بیت می باشد که در‬
‫اینصورت محدوده ای برابر ‪ -2,147,483,648‬تا ‪ +2,147,483,647‬را‬
‫پوشش می دهد‪.‬‬
‫در بعضی از کامپایلرهای ‪ ،C‬نوع داده ‪ bool‬نیز وجود دارد که می تواند‬
‫یکی از مقادیر ‪)true‬درست( یا ‪) false‬غلط( را نشان دهد ‪ .‬اما در نسخه‬
‫های اولیه ‪ C‬از همان نوع داده صحیح یا ‪ int‬برای اینکار استفاده می‬
‫شد‪ .‬بدین صورت که ‪ 0‬نشاندهنده ‪ false‬و هر عدد غیر صفر )معموال ‪(1‬‬
‫نشاندهنده ‪ true‬است‪.‬‬
‫از آنجا که برای ذخیره سازی کاراکترها کد اسکی آنها ذخیره می گردد‪،‬‬
‫از یک متغیر کاراکتری یا ‪ char‬می توان بعنوان یک عدد صحیح کوچک نیز‬
‫استفاده کرد و اعمال ریاضی برروی آنها نیز مجاز است‪.‬‬

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫عالوه براین چندین اصالح کننده نیز وجود دارد که به ما اجازه می دهد نوع داده مورد‬
‫نظر را با دقت بیشتری برای نیازهای مختلف استفاده نماییم‪.‬‬
‫این اصالح کننده ها عبارتند از ‪short, long, signed, unsigned :‬‬
‫تمام این اصالح کننده ها می توانند به نوع داده ‪ int‬اعمال شوند و اثر آنها بستگی‬
‫به محیط دارد‪.‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫در یک محیط ‪16‬بیتی‪short int ،‬بازهم برابر ‪16‬بیت است ولی ‪ long int‬برابر‪32‬بیت می‬
‫باشد‪.‬‬
‫‪ unsigned int‬باعث می شود که یک عدد ‪ 16‬بیتی بدون عالمت داشته باشیم که بازه‬
‫بین ‪ 0‬تا ‪ 65535‬را پوشش می دهد‪ signed int .‬نیز همانند ‪ int‬معمولی بوده و تفاوتی‬
‫ندارد‪.‬‬
‫ترکیب این اصالح کننده ها نیز ممکن است‪ .‬مثال ‪ unsigned long int‬یک عدد ‪ 32‬بیتی‬
‫بدون عالمت است که بازه ‪ 0‬تا ‪ 4,294,967,295‬را پوشش می دهد‪.‬‬

‫برروی نوع داده ‪ char‬فقط اصالح کننده های ‪ signed‬و ‪ unsigned‬را می توان اعمال‬
‫کرد‪ .‬معموال از اصالح کننده ‪ unsigned‬وقتی استفاده می شود که قصد داشته‬
‫باشیم از ‪ char‬بعنوان یک عدد صحیح مثبت بین ‪ 0‬تا ‪ 255‬استفاده کنیم‪.‬‬
‫برروی نوع داده ‪ double‬تنها اصالح کننده ‪ long‬قابل اعمال است و دراینصورت عدد‬
‫اعشاری با ‪ 80‬بیت را خواهیم داشت که قادر است هر عددی در بازه ‪ 3.4e-4932‬تا‬
‫‪ 1.1e+4932‬را در خود نگاه دارد‪.‬‬

‫‪ 7-3‬تعریف متغیرها‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای تعریف متغیرها به شکل زیر عمل می کنیم‪:‬‬

‫;>‪ ‫که ‪ type‬یکی از نوع داده های گفته شده و ‪ variable-list‬لیستی از متغیرها است‬
‫که با کاما از یکدیگر جدا شده اند‪ .‬بعنوان مثال ‪:‬‬
‫;‪int sum‬‬
‫;‪float average‬‬
‫; ‪long int a, b, c‬‬
‫; ‪unsigned long int i, j, k‬‬
‫عالوه براین می توان در هنگام تعریف متغیر به آن مقدار اولیه نیز داد‪ .‬مثال ‪:‬‬
‫; ‪int d = 0‬‬
‫نكته مهم آنكه زبان ‪ C‬به متغیرها مقدار اولیه نمي دهد )حتي ‪ (0‬و برنامه نويس‬
‫خود بايد اينكار را صريحا انجام دهد‪ ،‬درغیر اينصورت مقدار اولیه متغیر‪ ،‬نامعین خواهد‬
‫بود‪.‬‬
‫تعریف متغیرها طبق اصول زبان ‪ C‬میتواند درهرجایی از برنامه صورت پذیرد‪ ،‬و‬
‫متغیرهای تعریف شده از همان خط به بعد قابل استفاده خواهد بود‪ .‬اما معموال‬
‫توصیه می گردد كه تعریف متغیرها در همان خط ابتدایی تابع و بالفاصله پس از {‬
‫صورت پذیرد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫‪‬‬
‫‪‬‬

‫ثابتها مقادیر ثابتی هستند كه مقدار آنها در حین اجرای برنامه تغییر نمی یابد‪ .‬ثابتها می توانند از‬
‫هریك از نوع داده های اصلی باشند‪.‬‬
‫ثوابت عددی صحیح ‪:‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫برای نمایش این دسته از ثوابت‪ ،‬از دنباله ای از ارقام بعالوه عالمت ‪ +‬یا ‪ -‬استفاده می كنیم‪ .‬بعنوان مثال‬
‫‪ -45‬و یا ‪ 3489‬ثوابت صحیح هستند‪.‬‬
‫در حالت عادی ‪ C‬هر عدد را در كوچكترین نوع داده ای كه می تواند قرار می دهد‪ .‬مثال عدد ‪ 85‬در یك‬
‫‪ int‬قرار می گیرد‪ ،‬اما عدد ‪ 145398‬در یك ‪ long int‬قرار خواهد گرفت‪.‬‬
‫اگر قصد دارید یك عدد كوچك بعنوان ‪ long‬محسوب گردد‪ ،‬می توانید از پسوند ‪ L‬در انتهای آن استفاده‬
‫می كنیم‪ .‬مثال ‪245L‬یك عدد ‪ long‬محسوب می شود‪.‬‬
‫;‪long int a = 20L‬‬
‫پسوند ‪ U‬در انتهای عدد نیز نشانه بدون عالمت بودن آن است‪.‬‬
‫نكته دیگر آنكه ‪ C‬به شما اجازه می دهد درصورت لزوم ثوابت صحیح خود را در مبنای ‪ 8‬یا ‪ 16‬نیز كه‬
‫از مبناهای متداول در برنامه نویسی هستند‪ ،‬بنویسید‪.‬‬
‫‪‬‬
‫‪‬‬

‫برای نوشتن عدد در مبنای ‪ 8‬باید آن را با ‪ 0‬آغاز كنید‪ ،‬مثال ‪ 0342‬یك عدد در منای ‪ 8‬محسوب می‬
‫گردد‪.‬‬
‫برای نوشتن یك عدد در مبنای ‪ 16‬باید آن را با ‪ 0x‬آغاز نمایید‪ ،‬مانند ‪.0x27A4‬‬

‫‪ 7-4‬ثوابت‬
‫ثوابت عددی اعشاری‬

‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫برای نمایش اعداد اعشاری‪ ،‬باید از نقطه اعشار استفاده كنیم‪ ،‬مانند ‪237.45‬‬
‫اما نكته جالب آنستكه می توانید از نماد علمی نیز برای نمایش اعداد‬
‫اعشاری استفاده كنید‪ .‬برای اینكار كافی است از حرف ‪ e‬برای نمایش قسمت‬
‫توان استفاده نمایید‪ .‬بعنوان مثال ‪:‬‬
‫‪-23.47 × 10 5 = -23.47e5‬‬
‫‪42.389 × 10 -3 = 42.389e-3‬‬
‫دقت كنید كه قسمت توان‪ ،‬حتما یك عدد صحیح است‪.‬‬
‫نكته جالب اینجاست كه برخالف مورد قبل‪ ،‬كامپایلر بطور پیش فرض داده های‬
‫اعشاری را از نوع ‪ double‬فرض می كند‪.‬چنانچه دوست دارید ثابت شما ازنوع‬
‫‪ float‬درنظر گرفته شود‪ ،‬در انتهای آن ‪ F‬قرار دهید‪ .‬ضمنا پسوند ‪ L‬نیز داده‬
‫اعشاری را از نوع ‪ long double‬درنظر می گیرد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫ثوابت كاراكتری ‪:‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫برای نشان دادن ثوابت كاراكتری‪ ،‬آنها را در داخل ' قرار می دهیم‪ .‬بعنوان مثال‬
‫'‪'A‬یك ثابت كاراكتری است‪.‬‬
‫; '‪char ch = 'S‬‬
‫دقت كنید كه همانطور كه قبال گفته شد‪ ،‬كد اسكی كاراكترها در متغیر ذخیره‬
‫می گردد‪ ،‬بنابراین می توان از آن بعنوان یك عدد صحیح نیز استفاده كرد‪ .‬نكته‬
‫مهم دیگر آنستكه به تفاوت عدد ‪ 5‬و كاراكتر '‪ '5‬دقت داشته باشید‪ .‬در حقیقت‬
‫'‪ '5‬برابر است با عدد ‪ 53‬كه همان كد اسكی آن است‪.‬‬
‫روش فوق‪ ،‬برای نمایش کاراکترهای قابل چاپ مناسب است‪ ،‬اما بعضی‬
‫كاراكترها مانند ‪ enter‬قابل نمایش نبوده و برای آنها شکل خاصی وجود ندارد‪.‬‬
‫در چنین مواردی‪ ،‬زبان ‪ C‬از ترکیب عالمت \ به همراه یک کاراکتر دیگر‪ ،‬برای‬
‫نمایش این قبیل کاراکترها استفاده می نماید‪ .‬بعنوان مثال‪ ،‬کاراکتر '‪ '\n‬نشان‬
‫دهنده خط جدید یا همان ‪ enter‬می باشد‪.‬‬
‫جدول صفحه بعد این قبیل کاراکترها و معادل آنها را نشان می دهد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫نحوه نمایش در ‪C‬‬

‫کد اسکی‬

‫صدای بوق کامپیوتر‬

‫‪\a‬‬

‫‪7‬‬

‫حرکت به عقب ‪backspace‬‬

‫‪\b‬‬

‫‪8‬‬

‫شروع صفحه ‪form feed‬‬

‫‪\f‬‬

‫‪12‬‬

‫سطر جدید ‪line feed‬‬

‫‪\n‬‬

‫‪10‬‬

‫برگشت به ابتداي سطر ‪carriage return‬‬

‫‪\r‬‬

‫‪13‬‬

‫فاصله افقی ‪horizontal tab‬‬

‫‪\t‬‬

‫‪9‬‬

‫فاصله عمودی ‪vertical tab‬‬

‫‪\v‬‬

‫‪11‬‬

‫عالمت سوال‬

‫?\‬

‫‪63‬‬

‫عالمت '‬

‫'\‬

‫‪39‬‬

‫عالمت "‬

‫"\‬

‫‪34‬‬

‫عالمت \‬

‫\\‬

‫‪92‬‬

‫عالمت تهی‬

‫‪\0‬‬

‫‪0‬‬

‫نام کاراکتر‬

‫کد اسکی یک کاراکتر با ‪ 3‬رقم در مبنای ‪8‬‬

‫‪\000‬‬

‫کد اسکی یک کاراکتر با ‪ 2‬رقم در مبنای ‪16‬‬

‫‪\x00‬‬

‫‪ 7-4‬ثوابت‬
‫‪‬‬

‫ثوابت رشته ای ‪ C :‬عالوه بر ثوابت فوق‪ ،‬از یك ثابت دیگر بنام رشته نیز‬
‫حمایت می كند‪ .‬رشته‪ ،‬دنباله ای از كاراكترها است كه در داخل " قرار‬
‫می گیرند‪ .‬بعنوان مثال "‪ "this is a test‬یك رشته است‪ .‬دقت كنید كه '‪'a‬‬
‫یك كاراكتر است‪ ،‬اما "‪ "a‬یك رشته است كه فقط شامل یك كاراكتر می‬
‫باشد‪.‬‬

‫‪ 7-5‬عملگرها‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫عملگر‪ ،‬نمادی است كه به كامپایلر می گوید تا عملیات محاسباتی یا‬
‫منطقی خاصی را برروی یك یا چند عملوند‪ ،‬انجام دهد‪.‬‬
‫به عملگرهایی كه فقط یك عملوند دارند‪ ،‬عملگر یكانی می گوییم و‬
‫همواره عملگر در سمت چپ عملوند قرار می گیرد)مانند عدد ‪.(-125‬‬
‫اما عملگرهایی كه برروی دو عملوند اثر می كنند را عملگر دودویی‬
‫نامیده و عملگر را بین دو عملوند قرار می دهیم )مانند ‪.(23+86‬‬
‫هر ترکیب درستی از عملگرها و عملوندها را یک عبارت می نامیم‪.‬‬
‫‪ C‬از نقطه نظر عملگرها یك زبان بسیار قوی است‪ .‬این عملگرها به چند‬
‫دسته اصلی تقسیم می گردند كه آنها را به ترتیب بررسی می كنیم‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫این عملگرها‪ ،‬همان اعمال متداول ریاضی هستند كه در زبان ‪ C‬مورد استفاده‬
‫قرار می گیرند‪ .‬این اعمال عبارتند از ‪:‬‬

‫عمل‬

‫نوع‬

‫عملگر‬

‫منفی كردن عملوند سمت راست‬

‫یكانی‬

‫‪-‬‬

‫جمع دو عملوند‬

‫دودویی‬

‫‪+‬‬

‫تفریق دو عملوند‬

‫دودویی‬

‫‪-‬‬

‫ضرب دو عملوند‬

‫دودویی‬

‫*‬

‫تقسیم دو عملوند‬

‫دودویی‬

‫‪/‬‬

‫محاسبه باقیمانده تقسیم دو عملوند‬

‫دودویی‬

‫‪%‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬
‫‪‬‬

‫این عملگرهای برروی همه انواع داده های ‪ C‬عمل می كنند‪ ،‬بجز عملگر ‪ %‬كه فقط‬
‫برروی نوع داده های صحیح عمل می كند‪.‬‬
‫اما نكته مهمی كه باید به آن اشاره كرد‪ ،‬نحوه كار عملگر تقسیم برروی نوع داده های‬
‫مختلف است‪.‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫درصورتیكه هردو عملوند صحیح باشند‪ ،‬تقسیم بصورت صحیح بر صحیح انجام خواهد شد‪.‬‬
‫اگر یكی یا هر دو عملوند اعشاری باشند‪ ،‬تقسیم بصورت اعشاری انجام خواهد پذیرفت‪.‬‬
‫فرض كنید تعاریف زیر را داریم ‪:‬‬
‫; ‪int a,b‬‬
‫; ‪float c,d‬‬
‫; ‪a = 10 ; b = 4‬‬
‫;‪c = 8.2; d = 4.0‬‬
‫اكنون به نتایج عملیات زیر دقت كنید ‪:‬‬
‫‪a / b => 2‬‬
‫‪c / d => 2.05‬‬
‫‪a / d => 2.5‬‬
‫‪a / 4 => 2‬‬
‫چنانچه به آخرین مورد توجه كنید‪ ،‬متوجه می شوید كه از آنجا كه ‪a‬یك متغیر صحیح است و ‪4‬‬
‫نیز یك ثابت صحیح در نظر گرفته شده‪ ،‬درنتیجه تقسیم بصورت صحیح بر صحیح انجام گرفته‬
‫است‪ .‬چنانچه بخواهیم تقسیم بصورت اعشاری صورت پذیرد‪ ،‬به دو شكل می توانیم عمل‬
‫كنیم‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫برای اینکه عبارت تقسیم صفحه قبل بصورت اعشاری انجام شود‪ ،‬به دو روش‬
‫می توان عمل کرد‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫این عبارت را بصورت ‪ a / 4.0‬بنویسیم‪.‬‬
‫از عملگر قالب ریزی استفاده كنیم‪.‬‬

‫عملگر قالب ریزی می تواند یك نوع را به نوع دیگری تبدیل نماید‪ .‬شكل كلی آن‬
‫به شكل زیر است ‪:‬‬
‫>‪() ‫كه ‪ type‬نوع مورد نظر است كه قصد تبدیل عبارت ‪ expression‬به آن نوع را‬
‫داریم‪ .‬بعنوان مثال در مورد قبلی می توان به شكل زیر عمل كرد ‪:‬‬
‫‪(float) a / 4‬‬
‫در این حالت از كامپایلر خواسته ایم كه ابتدا عدد ‪ a‬را به اعشاری تبدیل كند‬
‫)البته بصورت موقت( و سپس آن را بر ‪ 4‬تقسیم نماید‪ ،‬كه مسلما حاصل‬
‫اعشاری خواهد بود‪.‬‬
‫بطوركلی هرگاه ثابتها و متغیرهایی از انواع مختلف در یك عبارت محاسباتی‬
‫داشته باشیم‪ ،‬كامپایلر ‪ C‬همه آنها را به یك نوع یكسان كه همان بزرگترین‬
‫عملوند موجود است تبدیل خواهد كرد‪ .‬بعنوان مثال به مورد صفحه بعد دقت‬
‫كنید ‪:‬‬

‫ عملگرهای محاسباتی‬7-5-1
char ch;
int i;

float f;
double d;
result = (ch / i)
int

+

(f *d)

(f+i)
float

double

double

int

-

double

double

float

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫اولویت عملگرها ‪ :‬در عبارتی که شامل چندین عملگر است‪ ،‬کدامیک در‬
‫ابتدا اعمال خواهد گردید‪.‬‬
‫اولویت عملگرهای محاسباتی از باال به پایین بشرح زیر است‪:‬‬
‫‪ ‬عملگر یکانی –‬
‫‪ ‬عملگرهای * و ‪ /‬و ‪%‬‬
‫‪ ‬عملگرهای ‪ +‬و –‬
‫چنانچه اولویت دو عملگر یکسان باشد‪ ،‬این عملگرها از چپ به راست‬
‫محاسبه خواهند شد‪.‬‬
‫چنانچه بخواهیم یک عمل با اولویت پایین زودتر انجام شود‪ ،‬باید از پرانتز‬
‫استفاده کنیم‪ .‬بنابراین اولویت عملگر پرانتز از همه موارد فوق‬
‫بیشتراست‪ .‬در مورد پرانتزهای متداخل‪ ،‬ابتدا پرانتز داخلی محاسبه‬
‫می شود؛ اما در مورد پرانتزهای هم سطح‪ ،‬ابتدا پرانتز سمت چپتر‬
‫محاسبه می گردد‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫چند مثال در مورد اولویت عملگرها‬

‫ترتیب اجرای عملگرها‬

‫عبارت زبان ‪C‬‬

‫ابتدا عمل * و سپس عمل ‪+‬‬

‫‪b+c*d‬‬

‫ابتدا عمل ‪ +‬و سپس عمل *‬

‫‪(b + c) * d‬‬

‫ابتدا عمل ‪ /‬سپس عمل * و در انتها عمل ‪+‬‬

‫‪b+c/d*e‬‬

‫ابتدا عمل * سپس عمل ‪ /‬و در انتها عمل ‪+‬‬

‫)‪b + c / (d * e‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫یک مثال کامل در مورد اولویت عملگرها‬

‫‪result = a + b * (f – (g + b) / d) – c * (a – d) / e‬‬
‫‪6‬‬

‫‪1‬‬
‫‪7‬‬

‫‪2‬‬

‫‪8‬‬

‫‪3‬‬
‫‪4‬‬
‫‪5‬‬
‫‪9‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫در زبان ‪ C‬برای انتساب چندین عملگر وجود دارد‪ .‬ساده ترین عملگر انتساب‪ ،‬همان عملگر =‬
‫است که در بسیاری از زبانها استفاده می شود‪ .‬بعنوان مثال ‪:‬‬
‫;‪a = 5‬‬
‫;‪b = c + 2 * d‬‬
‫این عملگر باعث می شود که عبارت سمت راست در عبارت سمت چپ قرار گیرد‪.‬‬
‫توجه کنید که مقدار سمت چپ باید عبارتی باشد که بتوان به آن یک مقدار را نسبت داد‬
‫)مانند یک متغیر( که به آن ‪ Lvalue‬گفته می شود‪ ،‬بنابراین یک ثابت نمی تواند در سمت چپ‬
‫قرار گیرد‪.‬‬
‫نکته دیگر اینکه اولویت عملگر = از عملگرهای ریاضی کمتر است و درنتیجه ابتدا آن عملیات‬
‫انجام شده و در پایان حاصل در عبارت سمت چپ ریخته می شود‪.‬‬
‫الزم به ذکر است که در هنگام انتساب‪ ،‬درصورت لزوم نوع عبارت سمت راست به نوع عبارت‬
‫سمت چپ تبدیل می شود‪ .‬مثال‪:‬‬
‫;‪int a‬‬
‫;‪a = 2.5 * 5.0‬‬
‫که دراینصورت عدد ‪ 12‬در ‪ a‬ذخیره خواهد شد‪.‬‬
‫شرکت پذیری این عملگر از راست به چپ می باشد‪ ،‬بدین معنا که چنانچه چندین عملگر‬
‫نسبت دهی داشته باشیم‪ ،‬این عملگرها از راست به چپ محاسبه می شوند‪ .‬مثال پس از‬
‫اجرای دستور زیر‪ ،‬مقدار هر ‪ 3‬متغیر برابر ‪ 10‬خواهد شد‪.‬‬
‫;‪a = b = c = 10‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬

‫نکته جالب درمورد زبان ‪ C‬آنستکه دارای یک سری عملگرهای انتساب‬
‫خالصه شده است که باعث می شوند در بعضی موارد بتوانیم عبارات‬
‫کوتاهتری را بنویسیم‪ .‬این عملگرها عبارتند از ‪:‬‬
‫عملگرد‬

‫مثال‬

‫عبارت انتساب معادل‬

‫‪++‬‬

‫;‪a ++‬‬

‫;‪a = a + 1‬‬

‫‪--‬‬

‫;‪a --‬‬

‫;‪a = a – 1‬‬

‫=‪+‬‬

‫;‪a += 5‬‬

‫;‪a = a + 5‬‬

‫=‪-‬‬

‫;‪a -= 8‬‬

‫;‪a= a – 8‬‬

‫=*‬

‫;‪a *= 10‬‬

‫;‪a= a * 10‬‬

‫=‪/‬‬

‫;‪a /= 2‬‬

‫;‪a = a / 2‬‬

‫=‪%‬‬

‫;‪a %= 10‬‬

‫;‪a = a % 10‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬
‫‪‬‬

‫عملگر اول و دوم‪ ،‬عملگرهای یکانی هستند که بترتیب عملگر افزایش و عملگر کاهش‬
‫نامیده می شوند‪.‬‬
‫نکته جالب آنستکه این دو عملگر به دوصورت مورد استفاده قرار می گیرند‪.‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫در حالتی که از دستور ;‪ a ++‬استفاده شود به آن پس افزایش می گویند و بدین معناست که‬
‫ابتدا از مقدار فعلی ‪ a‬در عبارت موردنظر استفاده کن و سپس آن را افزایش بده‪.‬‬
‫اما دستور ;‪ ++ a‬که به آن پیش افزایش گفته می شود‪ ،‬ابتدا ‪ a‬را افزایش داده و سپس از آن‬
‫در عبارت استفاده می کند‪.‬‬
‫به برنامه زیر دقت کنید‪:‬‬

‫>‪#include ‫{ )(‪void main‬‬
‫; ‪int a ,b‬‬
‫;‪a=5‬‬
‫;‪b = a ++‬‬
‫;)‪printf(“a=%d and b=%d \n”,a,b‬‬
‫;‪a=5‬‬
‫;‪b = ++ a‬‬
‫;)‪printf(“a=%d and b=%d \n”,a,b‬‬
‫}‬
‫‪a=6 b=5‬‬
‫‪a=6 b=6‬‬

‫‪ 7-5-3‬عملگرهای مقایسه ای‬
‫‪‬‬

‫‪‬‬

‫این عملگرها دو عبارت را بایکدیگر مقایسه کرده و نتیجه را باز می گردانند‪.‬‬
‫نتیجه می تواند درست )‪ (true‬یا غلط )‪ (false‬باشد‪.‬‬
‫نتیجه این عملگرها یک عدد صحیح است که درصورت درست بودن ‪ 1‬و‬
‫درصورت غلط بودن ‪ 0‬باز می گردانند‪ .‬این عملگرها عبارتند از‪:‬‬
‫عملگر‬

‫مفهوم عملگر‬

‫مثال‬

‫<‬

‫بزرگتر )<(‬

‫‪a>b‬‬

‫>‬

‫کوچکتر )>(‬

‫‪a
‫=<‬

‫بزرگتر یا مساوی )≤(‬

‫‪a >= b‬‬

‫=>‬

‫کوچکتر یا مساوی )≥(‬

‫‪a <= b‬‬

‫==‬

‫مساوی )=(‬

‫‪a == b‬‬

‫=!‬

‫نامساوی )≠(‬

‫‪a != b‬‬

‫‪ 7-5-3‬عملگرهای مقایسه ای‬
‫‪‬‬

‫‪‬‬

‫نکته مهمی که باید به آن دقت کرد عملگر مساوی )==( است‪ ،‬چرا که یک‬
‫اشتباه بسیار متداول برنامه نویسان ‪ C‬استفاده اشتباه از عملگر انتساب‬
‫)=( بجای عملگر تساوی )==( است که باعث ایجاد خطا در برنامه می‬
‫شود‪.‬‬
‫اولویت این عملگرها از باال به پایین بشرح زیر است‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫عملگرهای <‪ <= ، > ،‬و =>‬
‫عملگرهای == و =!‬

‫الزم بذکر است که در هنگام مساوی بودن اولویت چند عملگر‪ ،‬این عملگرها‬
‫از چپ به راست محاسبه می گردند‪.‬‬

‫‪ 7-5-4‬عملگرهای منطقی‬
‫‪‬‬

‫این عملگرها به شما اجازه می دهند که شرطهای ساده ای را که با‬
‫استفاده از عملگرهای مقایسه ای ایجاد شده اند را با یکدیگر ترکیب نموده‬
‫و شرطهای پیچیده تری را بسازید‪ .‬این عملگرها عبارتند از ‪:‬‬
‫مثال‬

‫عملگر‬

‫مفهوم عملگر‬

‫نحوه کار‬

‫&&‬

‫‪ AND‬منطقی‬

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

‫‪a>0 && sw==1‬‬

‫||‬

‫‪ OR‬منطقی‬

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

‫‪a<=100 || b!=0‬‬

‫!‬

‫‪ NOT‬منطقی‬

‫اگر عملوند درست باشد‪ ،‬نادرست و‬
‫اگر نادرست باشد‪ ،‬درست برمی‬
‫گرداند‪.‬‬

‫)‪! (a==1 || b<10‬‬

‫‪ 7-5-5‬عملگر شرطی‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫گاهی الزم است که ابتدا یک شرط بررسی شده و سپس برمبنای نتیجه )درست یا نادرست بودن آن( یکی‬
‫از دو عبارت ممکن بازگردانده شود‪ .‬برای اینکار می توان از یک عملگر ‪3‬تایی )با ‪ 3‬عملوند( بنام عملگر‬
‫شرطی استفاده نمود‪.‬‬
‫شکل کلی این عملگر بصورت زیر است‪:‬‬
‫>عبارت‪> :<2‬عبارت‪> ?<1‬شرط<‬
‫نحوه کار بدینصورت است که درصورت درست بودن شرط‪ ،‬عبارت‪ 1‬و در غیراینصورت عبارت ‪ 2‬بازگردانده می‬
‫شود‪.‬‬
‫به عنوان مثال به دستور زیر توجه کنید‪:‬‬
‫که این عبارت معادل دستور زیر است‪:‬‬

‫‪‬‬

‫;‪a = (k<10) ? 100 : 50‬‬
‫;‪if (k<10) a=100‬‬
‫;‪else a=50‬‬

‫البته این عبارت به شکلهای پیچیده نیز می تواند مورد استفاده قرار گیرد‪ .‬مثال ‪:‬‬
‫;‪c += (a>0 && a<10) ? ++a : a/b‬‬
‫که معادل است با ‪:‬‬
‫{ )‪if (a>0 && a<10‬‬
‫;‪a= a + 1‬‬
‫;‪c = c + a‬‬
‫}‬
‫;‪else c = c + a/b‬‬

‫‪ 7-5-6‬اولویت عملگرها‬
‫عملگر‬

‫اولویت‬

‫شرکت پذیری‬

‫‪1‬‬

‫)(‬

‫از چپ به راست‬

‫‪2‬‬

‫‪- + ! -- ++‬‬

‫از راست به چپ‬

‫‪3‬‬

‫‪* / %‬‬

‫از چپ به راست‬

‫‪4‬‬

‫‪+ -‬‬

‫از چپ به راست‬

‫‪5‬‬

‫>> <<‬

‫از چپ به راست‬

‫‪6‬‬

‫>= > <= <‬

‫از چپ به راست‬

‫‪7‬‬

‫=! ==‬

‫از چپ به راست‬

‫‪8‬‬

‫&&‬

‫از چپ به راست‬

‫‪9‬‬

‫||‬

‫از چپ به راست‬

‫‪10‬‬

‫‪?:‬‬

‫از راست به چپ‬

‫‪11‬‬

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

‫از راست به چپ‬

‫‪12‬‬

‫‪,‬‬

‫از چپ به راست‬

‫‪ 7-6‬خواندن و نمایش اطالعات‬
‫‪‬‬

‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫همانطور كه قبال نیز گفته شد‪ ،‬یكی از اهداف زبان ‪ C‬قابل حمل بودن آن‬
‫است‪ .‬بهمین منظور سعی شده است كه از دستوراتی كه ممكن است‬
‫وابسته به ماشین خاصی باشد‪ ،‬اجتناب گردد‪.‬‬
‫بهمین دلیل زبان ‪ C‬برخالف سایر زبانها دارای هیچ دستوری برای‬
‫خواندن از ورودی و یا نوشتن در خروجی نیست‪.‬‬
‫اما در عوض دارای تعدادی تابع )زیربرنامه( استاندارد می باشد كه تقریبا‬
‫تمامی كامپایلرها از آنها حمایت می كنند‪.‬‬
‫این كار به كامپایلر این امكان را می دهد كه بر حسب نوع سخت افزار‬
‫موردنظر‪ ،‬توابع ورودی و خروجی را طراحی نماید‪.‬‬
‫این توابع در یك فایل سرآمد بنام ‪ stdio.h‬تعریف شده اند و بنابراین قبل‬
‫ازاینكه بتوانید از این توابع استفاده نمایید‪ ،‬باید این فایل را نیز با استفاده‬
‫از ‪ #include‬در برنامه خود بگنجانید‪.‬‬

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫برای نمایش اطالعات در خروجی از تابع ‪ printf‬استفاده می شود‪.‬‬
‫این تابع رشته موردنظر شما را به خروجی استاندارد )كه در حالت‬
‫عادی همان صفحه نمایش یا مانیتور است( می فرستد‪ .‬شكل كلی این‬
‫تابع بصورت زیر است‪:‬‬
‫; )>لیست متغیرها< ‪> ,‬رشته كنترلی<(‪printf‬‬
‫رشته كنترلی همان متنی است كه قصد چاپ آن را داریم‪ ،‬با ذكر این‬
‫نكته كه در قسمتهایی كه باید مقدار یك متغیر چاپ شود‪ ،‬از یك‬
‫مشخصه تبدیل استفاده می شود‪ .‬هر مشخصه تبدیل از یك عالمت ‪%‬‬
‫بعالوه یك كاراكتر كه نوع متغیر مورد نظر را نشان می دهد تشكیل می‬
‫گردد‪.‬‬
‫لیست متغیرها نیز همان متغیرهایی هستند كه قصد چاپ آنها را داریم‪.‬‬
‫این متغیرها باید بترتیب قرار گرفته و با كاما )‪ (,‬از یكدیگر جدا شوند‪.‬‬

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫مشخصه تبدیل‬

‫مفهوم‬

‫‪%c‬‬

‫كاراكتر‬

‫‪%d‬‬

‫عدد صحیح در مبنای ‪10‬‬

‫‪%f‬‬

‫عدد اعشاری بدون نماد علمی‬

‫‪%e‬‬

‫عدد اعشاری با نماد علمی‬

‫‪%g‬‬

‫عدد اعشاری با حالت كوتاهتر بین ‪ e‬و ‪f‬‬

‫‪%s‬‬

‫رشته‬

‫‪%ld‬‬

‫عدد صحیح بزرگ‬

‫‪%lf %le %lg‬‬

‫عدد اعشاری بزرگ‬

‫‪%o‬‬

‫عدد صحیح در مبنای ‪8‬‬

‫‪%x‬‬

‫عدد صحیحی در مبنای ‪16‬‬

‫‪%u‬‬

‫عدد صحیح بدون عالمت‬

‫ تابع نمایش در خروجی‬7-6-1
#include
void main() {
int age = 20;
floate average = 18.23;
printf("You are %d years old and your average is %f \n",age,average);
}
You are 20 years old and your average is 18.230000

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫‪‬‬
‫‪‬‬

‫برای کنترل نحوه چاپ اعداد می توانید از مشخصه طول میدان استفاده‬
‫کنید‪.‬‬
‫مشخصه طول میدان برای اعداد به شكل زیر استفاده می شود‪:‬‬
‫‪ ‬برای اعداد صحیح از ‪ %nd‬استفاده می كنیم كه ‪ n‬تعداد ارقام را نشان‬
‫می دهد )مثال ‪ .(%3d‬در اینصورت برای هر متغیر ‪ n‬رقم درنظر گرفته‬
‫می شود‪ .‬اگر اندازه عدد از ‪ n‬كوچكتر باشد‪ ،‬به سمت چپ آن فضای‬
‫خالی اضافه می شود و اگر اندازه عدد بیش از ‪ n‬رقم باشد‪ ،‬طول میدان‬
‫نادیده گرفته شده و عدد بطور كامل چاپ می شود‪.‬‬
‫‪ ‬برای اعداد اعشاری از ‪ %n.mf‬استفاده می كنیم كه ‪ n‬اندازه كل عدد‬
‫)شامل عالمت ممیز( و ‪ m‬تعداد ارقام اعشار است )مثال ‪ .(%5.2f‬در‬
‫صورتیكه تعداد ارقام اعشاری عدد موردنظر از ‪ m‬بیشتر باشد‪ ،‬عدد به ‪m‬‬
‫عدد اعشار گرد می شود و در صورتیكه از ‪ m‬كمتر باشد‪ ،‬در سمت‬
‫راست آن ‪ 0‬قرار داده می شود‪.‬‬

‫‪ 7-6-2‬تابع خواندن از ورودی‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای خواندن اطالعات از ورودی از تابع ‪ scanf‬استفاده می شود‪.‬‬
‫این تابع اطالعات را ازورودی استاندارد )معموال صفحه كلید( خوانده و در‬
‫متغیرهای تعیین شده قرار می دهد‪.‬‬
‫شكل كلی این تابع بصورت زیر است‪:‬‬
‫; )>لیست آدرسهای متغیرها< ‪> ,‬رشته كنترلی<(‪scanf‬‬
‫همانطور كه می بینید نحوه احضار تابع ‪ scanf‬نیز مشابه ‪ printf‬است‪ .‬تنها‬
‫تفاوت در آن است كه در ‪ scanf‬باید لیست آدرسهای متغیرها ارسال شود‪.‬‬
‫مبحث مربوط به آدرسها در فصول بعدی بررسی خواهد شد ولی در حال حاضر‬
‫بخاطر بسپارید كه برای بدست آوردن آدرس یك متغیر از عالمت & استفاده می‬
‫كنیم‪ .‬بعنوان مثال ‪ &age‬بمعنای آدرس متغیر ‪ age‬است‪.‬‬
‫بطور كلی در ‪ C‬قدیمی هرگاه كه یك تابع دارای پارامترهای خروجی بود )یعنی‬
‫پارامترهایی كه یك مقدار را باز می گرداندند( از آدرس متغیرها استفاده می‬
‫شد كه امروزه این مسئله وجود ندارد‪.‬‬

‫ تابع خواندن از ورودی‬7-6-2
#include
void main() {
int age;
float average ;
printf("Please enter your age and average : ");
scanf("%d %f",&age,&average);
printf("You are %d years old and your average is %5.2f \n",age,average);
}

Please enter your age and average : 19 16.72
You are 19 years old and your average is 16.72

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫زبان ‪ C++‬یک زبان شی گرا است‪ ،‬بهمین دلیل در این زبان برای ورودی‬
‫و خروجی از اشیاء بجای توابع استفاده می گردد‪.‬‬
‫از آنجا که امروزه معموال برنامه نویسان ‪ C‬از کامپایلرهای ‪ C++‬استفاده‬
‫می کنند‪ ،‬می توانند از اشیای ورودی و خروجی آن نیز استفاده کنند‪.‬‬
‫اینکار در بین بسیاری از برنامه نویسان ‪ C‬متداول است‪ ،‬بهمین دلیل ما‬
‫در اینجا نحوه کار با اشیای خواندن و نوشتن در ‪ C++‬را بطور مقدماتی‬
‫توضیح می دهیم؛ گرچه توضیح کامل این موارد نیاز به آشنایی با شی‬
‫گرایی و زبان ‪ C++‬دارد‪.‬‬
‫قبل از هرچیز الزم به ذکر است که کلیه اشیای مربوط به ورودی و‬
‫خروجی در فایل سرآمدی بنام ‪ iostream.h‬تعیریف شده اند‪ ،‬بنابراین‬
‫ابتدا باید این فایل به برنامه توسط دستور ‪ #include‬الحاق گردد‪.‬‬

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫زبان ‪ C++‬برای نمایش اطالعات از یک شیئ بنام ‪ cout‬استفاده می نماید‪.‬‬
‫برای ارسال اطالعات مورد نظر برای چاپ به ‪ cout‬باید از عملگر درج در جریان‬
‫یا >> استفاده نماییم‪ .‬بعنوان مثال ‪:‬‬
‫; ” ‪cout >> “Please enter your name:‬‬
‫و یا مثال دیگر ‪:‬‬
‫;‪int a = 10‬‬
‫;‪float b = 2.86‬‬
‫;‪cout << a‬‬
‫;‪cout << b‬‬
‫نکته جالبی که در این مثالها دیده می شود‪ ،‬آنستکه برخالف تابع ‪ printf‬هیچ‬
‫نیازی به مشخص کردن نوع متغیری که قصد چاپ آن را داریم نیست و خود‬
‫شئ ‪ cout‬نوع آن را تشخیص می دهد‪.‬‬
‫عالوه براین می توان چندین عملگر درج در جریان را با یکدیگر الحاق کرد و‬
‫چندین متغیر را با یک دستور چاپ کرد‪.‬‬

C++ ‫ ورودی و خروجی اطالعات در‬7-6-3
#include
void main() {
int age = 20;
floate average = 18.23;
cout >> “You are ” >> age >> “ years old and your average is ” >> average ;
}

You are 20 years old and your average is 18.230000

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای دریافت اطالعات از کاربر‪ ،‬از شئ دیگری بنام ‪ cin‬استفاده می شود‪.‬‬
‫برای ارسال متغیر مورد نظر به ‪ cin‬باید از عملگر استخراج از جریان یا <<‬
‫استفاده نماییم‪ .‬بعنوان مثال‪:‬‬
‫;‪int a‬‬
‫;‪cin >> a‬‬
‫بازهم همانطور که می بینید نیازی به تعیین نوع متغیر موردنظر نیست و خود‬
‫شئ ‪ cin‬نوع متغیر را بطور اتوماتیک تشخیص داده و داده ای از همان نوع را از‬
‫کاربر دریافت و در متغیر مورد نظر قرار می دهد‪.‬‬
‫عملگرهای استخراج از جریان را نیز می توان با یکدیگر الحاق کرد‪.‬‬
‫برای رفتن به خط بعد در شئ ‪ cout‬می توان از دستکاری کننده ‪ endl‬استفاده‬
‫کرد‪ .‬مثال در دستور زیر پس از چاپ پیغام‪ ،‬مکان نما به خط بعد منتقل می‬
‫شود‪:‬‬
‫;‪cout >> “List of students : “ >> endl‬‬
‫البته دستکاری کننده های متعدد دیگری نیز ازجمله موارد مربوط به تعیین طول‬
‫میدان و نحوه چاپ مقادیر وجود دارد که توضیح آنها نیاز به یک مبحث مستقل‬
‫دارد‪.‬‬

C++ ‫ ورودی و خروجی اطالعات در‬7-6-3
#include
void main() {
int age;
float average ;
cout << "Please enter your age and average : " ;
cin >> age >> average ;
cout << "You are " << age << "years old and your average is " << average;
}

Please enter your age and average : 19 16.72
You are 19 years old and your average is 16.72

‫‪ 7-7‬توابع کتابخانه ای‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫همانطور که قبال نیز گفته شد‪ ،‬زبان ‪ C‬از زیر برنامه ها نیز حمایت می کند‪ .‬هر زیر برنامه‬
‫در ‪ C‬یک تابع نامیده می شود‪ .‬تا کنون با توابعی همچون ‪ main‬و یا ‪ printf‬و ‪ scanf‬آشنا‬
‫شده ایم‪.‬‬
‫معموال عرضه کنندگان کامپایلرها و یا سایر فروشندگان نرم افزار‪ ،‬برخی از توابع عمومی‬
‫را که ممکن است مورد نیاز جمع کثیری از برنامه نویسان مختلف باشد را در قالب‬
‫کتابخانه ای از توابع در اختیار برنامه نویسان می گذارند‪ .‬بعضی از این توابع کتابخانه ای‬
‫مانند ‪ printf‬و ‪ scanf‬بصورت استاندارد درآمده و توسط عرضه کنندگان مختلف ارائه می‬
‫شوند‪.‬‬
‫در کامپایلر عرضه شده توسط شرکت بورلند )‪ (Borland C++ 3.1‬نیز کتابخانه های‬
‫متعددی از توابع برای شما عرضه شده اند که بتدریج با آنها و کاربردشان آشنا خواهید‬
‫شد‪.‬‬
‫نکته مهم آنستکه برای استفاده از این توابع ابتدا باید فایل سرآمد مربوط به آنها را نیز در‬
‫ابتدای برنامه خود اضافه نمایید ) با استفاده از ‪ .(#include‬هر فایل سرآمد شامل تعاریف‬
‫اولیه گروهی از توابع مرتبط با هم و داده های مربوط به آنها بوده و در استاندارد قدیمی‬
‫تر دارای پسوند ‪ .h‬می باشد)در استاندارد جدید پسوند این فایلها حذف شده است(‪.‬‬
‫برخی از این فایلهای سرآمد عبارتند از‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪ : stdio.h‬توابع ورودی و خروجی استاندارد‬
‫‪ : math.h‬توابع ریاضی‬
‫‪ : graphics.h‬توابع مربوط به عملیات گرافیکی‬
‫‪ : string.h‬توابع مربوط به کار با رشته ها‬


Slide 11

‫مبانی کامپیوتر و برنامه سازی‬
‫فصل هفتم ‪ :‬مفاهیم اولیه زبان ‪C‬‬
‫مدرس ‪ :‬نگین معروفی‬

‫‪ 7-1‬شناسه ها در ‪C‬‬
‫‪‬‬
‫‪‬‬

‫شناسه )‪ (identifier‬نامی است که به یک قسمت از برنامه مانند متغیر‪ ،‬تابع‪ ،‬ثابت و یا‬
‫‪ ...‬داده می شود‪.‬‬
‫در زبان ‪ C‬برای انتخاب شناسه ها فقط می توان از عالئم زیر استفاده کرد‪:‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫حروف انگلیسی کوچک و بزرگ )‪(A…Z a…z‬‬
‫ارقام )‪(0…9‬‬
‫عالمت خط پایین یا _‬

‫البته یک شناسه نمی تواند با یک رقم شروع شود‪.‬‬
‫چند شناسه مجاز‪ name2 ، average ، sum :‬و ‪student_average‬‬
‫چند شناسه غیرمجاز ‪ 2name‬و یا ‪student average‬‬
‫در برنامه نویسی امروزی پیشنهاد می شود بجای شناسه هایی همانند‬
‫‪ student_average‬از ‪ studentAverage‬استفاده گردد‪.‬‬
‫نکته مهم دیگری که باید به آن اشاره کرد آنستکه زبان ‪ C‬برخالف بسیاری از زبانهای دیگر‬
‫به کوچک و بزرگی حروف حساس است )‪ .(case sensitive‬در نتیجه شناسه های زیر با‬
‫یکدیگر متفاوتند ‪:‬‬
‫‪Sum ≠ sum ≠ SUM‬‬
‫آخرین نکته اینستکه در هنگام انتخاب شناسه نمی توانید از کلمات کلیدی که برای‬
‫منظورهای خاص در زبان ‪ C‬رزرو شده اند استفاده کنید‪.‬‬

C ‫ شناسه ها در‬7-1
: C ‫کلمات کلیدی در زبان‬
auto

break

case

char

const

continue

default

do

double

else

enum

extern

float

for

goto

if

int

long

register

return

short

signed

sizeof

static

struct

switch

typedef

union

unsigned

void

volatile

while

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫محدوده‬

‫اندازه )بیت(‬

‫توضیح‬

‫نوع داده‬

‫‪-128 to +127‬‬

‫‪8‬‬

‫کاراکتر‬

‫‪char‬‬

‫‪-32768 to +32767‬‬

‫‪16‬‬

‫عدد صحیح‬

‫‪int‬‬

‫‪3.4e-38 to 3.4e+38‬‬

‫‪32‬‬

‫عدد اعشاری‬

‫‪float‬‬

‫‪1.7e-308 to 1.7e+308‬‬

‫‪64‬‬

‫عدد اعشاری با‬
‫دقت مضاعف‬

‫‪double‬‬

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫‪‬‬

‫البته چند نکته مهم درمورد این جدول قابل ذکر است ‪:‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫اندازه ‪ int‬در محیطهای ‪ 16‬بیتی مانند ‪ DOS‬برابر ‪ 16‬بیت است‪ .‬اما در‬
‫محیطهای ‪ 32‬بیتی همانند ‪ Windows‬اندازه آن ‪ 32‬بیت می باشد که در‬
‫اینصورت محدوده ای برابر ‪ -2,147,483,648‬تا ‪ +2,147,483,647‬را‬
‫پوشش می دهد‪.‬‬
‫در بعضی از کامپایلرهای ‪ ،C‬نوع داده ‪ bool‬نیز وجود دارد که می تواند‬
‫یکی از مقادیر ‪)true‬درست( یا ‪) false‬غلط( را نشان دهد ‪ .‬اما در نسخه‬
‫های اولیه ‪ C‬از همان نوع داده صحیح یا ‪ int‬برای اینکار استفاده می‬
‫شد‪ .‬بدین صورت که ‪ 0‬نشاندهنده ‪ false‬و هر عدد غیر صفر )معموال ‪(1‬‬
‫نشاندهنده ‪ true‬است‪.‬‬
‫از آنجا که برای ذخیره سازی کاراکترها کد اسکی آنها ذخیره می گردد‪،‬‬
‫از یک متغیر کاراکتری یا ‪ char‬می توان بعنوان یک عدد صحیح کوچک نیز‬
‫استفاده کرد و اعمال ریاضی برروی آنها نیز مجاز است‪.‬‬

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫عالوه براین چندین اصالح کننده نیز وجود دارد که به ما اجازه می دهد نوع داده مورد‬
‫نظر را با دقت بیشتری برای نیازهای مختلف استفاده نماییم‪.‬‬
‫این اصالح کننده ها عبارتند از ‪short, long, signed, unsigned :‬‬
‫تمام این اصالح کننده ها می توانند به نوع داده ‪ int‬اعمال شوند و اثر آنها بستگی‬
‫به محیط دارد‪.‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫در یک محیط ‪16‬بیتی‪short int ،‬بازهم برابر ‪16‬بیت است ولی ‪ long int‬برابر‪32‬بیت می‬
‫باشد‪.‬‬
‫‪ unsigned int‬باعث می شود که یک عدد ‪ 16‬بیتی بدون عالمت داشته باشیم که بازه‬
‫بین ‪ 0‬تا ‪ 65535‬را پوشش می دهد‪ signed int .‬نیز همانند ‪ int‬معمولی بوده و تفاوتی‬
‫ندارد‪.‬‬
‫ترکیب این اصالح کننده ها نیز ممکن است‪ .‬مثال ‪ unsigned long int‬یک عدد ‪ 32‬بیتی‬
‫بدون عالمت است که بازه ‪ 0‬تا ‪ 4,294,967,295‬را پوشش می دهد‪.‬‬

‫برروی نوع داده ‪ char‬فقط اصالح کننده های ‪ signed‬و ‪ unsigned‬را می توان اعمال‬
‫کرد‪ .‬معموال از اصالح کننده ‪ unsigned‬وقتی استفاده می شود که قصد داشته‬
‫باشیم از ‪ char‬بعنوان یک عدد صحیح مثبت بین ‪ 0‬تا ‪ 255‬استفاده کنیم‪.‬‬
‫برروی نوع داده ‪ double‬تنها اصالح کننده ‪ long‬قابل اعمال است و دراینصورت عدد‬
‫اعشاری با ‪ 80‬بیت را خواهیم داشت که قادر است هر عددی در بازه ‪ 3.4e-4932‬تا‬
‫‪ 1.1e+4932‬را در خود نگاه دارد‪.‬‬

‫‪ 7-3‬تعریف متغیرها‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای تعریف متغیرها به شکل زیر عمل می کنیم‪:‬‬

‫;>‪ ‫که ‪ type‬یکی از نوع داده های گفته شده و ‪ variable-list‬لیستی از متغیرها است‬
‫که با کاما از یکدیگر جدا شده اند‪ .‬بعنوان مثال ‪:‬‬
‫;‪int sum‬‬
‫;‪float average‬‬
‫; ‪long int a, b, c‬‬
‫; ‪unsigned long int i, j, k‬‬
‫عالوه براین می توان در هنگام تعریف متغیر به آن مقدار اولیه نیز داد‪ .‬مثال ‪:‬‬
‫; ‪int d = 0‬‬
‫نكته مهم آنكه زبان ‪ C‬به متغیرها مقدار اولیه نمي دهد )حتي ‪ (0‬و برنامه نويس‬
‫خود بايد اينكار را صريحا انجام دهد‪ ،‬درغیر اينصورت مقدار اولیه متغیر‪ ،‬نامعین خواهد‬
‫بود‪.‬‬
‫تعریف متغیرها طبق اصول زبان ‪ C‬میتواند درهرجایی از برنامه صورت پذیرد‪ ،‬و‬
‫متغیرهای تعریف شده از همان خط به بعد قابل استفاده خواهد بود‪ .‬اما معموال‬
‫توصیه می گردد كه تعریف متغیرها در همان خط ابتدایی تابع و بالفاصله پس از {‬
‫صورت پذیرد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫‪‬‬
‫‪‬‬

‫ثابتها مقادیر ثابتی هستند كه مقدار آنها در حین اجرای برنامه تغییر نمی یابد‪ .‬ثابتها می توانند از‬
‫هریك از نوع داده های اصلی باشند‪.‬‬
‫ثوابت عددی صحیح ‪:‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫برای نمایش این دسته از ثوابت‪ ،‬از دنباله ای از ارقام بعالوه عالمت ‪ +‬یا ‪ -‬استفاده می كنیم‪ .‬بعنوان مثال‬
‫‪ -45‬و یا ‪ 3489‬ثوابت صحیح هستند‪.‬‬
‫در حالت عادی ‪ C‬هر عدد را در كوچكترین نوع داده ای كه می تواند قرار می دهد‪ .‬مثال عدد ‪ 85‬در یك‬
‫‪ int‬قرار می گیرد‪ ،‬اما عدد ‪ 145398‬در یك ‪ long int‬قرار خواهد گرفت‪.‬‬
‫اگر قصد دارید یك عدد كوچك بعنوان ‪ long‬محسوب گردد‪ ،‬می توانید از پسوند ‪ L‬در انتهای آن استفاده‬
‫می كنیم‪ .‬مثال ‪245L‬یك عدد ‪ long‬محسوب می شود‪.‬‬
‫;‪long int a = 20L‬‬
‫پسوند ‪ U‬در انتهای عدد نیز نشانه بدون عالمت بودن آن است‪.‬‬
‫نكته دیگر آنكه ‪ C‬به شما اجازه می دهد درصورت لزوم ثوابت صحیح خود را در مبنای ‪ 8‬یا ‪ 16‬نیز كه‬
‫از مبناهای متداول در برنامه نویسی هستند‪ ،‬بنویسید‪.‬‬
‫‪‬‬
‫‪‬‬

‫برای نوشتن عدد در مبنای ‪ 8‬باید آن را با ‪ 0‬آغاز كنید‪ ،‬مثال ‪ 0342‬یك عدد در منای ‪ 8‬محسوب می‬
‫گردد‪.‬‬
‫برای نوشتن یك عدد در مبنای ‪ 16‬باید آن را با ‪ 0x‬آغاز نمایید‪ ،‬مانند ‪.0x27A4‬‬

‫‪ 7-4‬ثوابت‬
‫ثوابت عددی اعشاری‬

‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫برای نمایش اعداد اعشاری‪ ،‬باید از نقطه اعشار استفاده كنیم‪ ،‬مانند ‪237.45‬‬
‫اما نكته جالب آنستكه می توانید از نماد علمی نیز برای نمایش اعداد‬
‫اعشاری استفاده كنید‪ .‬برای اینكار كافی است از حرف ‪ e‬برای نمایش قسمت‬
‫توان استفاده نمایید‪ .‬بعنوان مثال ‪:‬‬
‫‪-23.47 × 10 5 = -23.47e5‬‬
‫‪42.389 × 10 -3 = 42.389e-3‬‬
‫دقت كنید كه قسمت توان‪ ،‬حتما یك عدد صحیح است‪.‬‬
‫نكته جالب اینجاست كه برخالف مورد قبل‪ ،‬كامپایلر بطور پیش فرض داده های‬
‫اعشاری را از نوع ‪ double‬فرض می كند‪.‬چنانچه دوست دارید ثابت شما ازنوع‬
‫‪ float‬درنظر گرفته شود‪ ،‬در انتهای آن ‪ F‬قرار دهید‪ .‬ضمنا پسوند ‪ L‬نیز داده‬
‫اعشاری را از نوع ‪ long double‬درنظر می گیرد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫ثوابت كاراكتری ‪:‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫برای نشان دادن ثوابت كاراكتری‪ ،‬آنها را در داخل ' قرار می دهیم‪ .‬بعنوان مثال‬
‫'‪'A‬یك ثابت كاراكتری است‪.‬‬
‫; '‪char ch = 'S‬‬
‫دقت كنید كه همانطور كه قبال گفته شد‪ ،‬كد اسكی كاراكترها در متغیر ذخیره‬
‫می گردد‪ ،‬بنابراین می توان از آن بعنوان یك عدد صحیح نیز استفاده كرد‪ .‬نكته‬
‫مهم دیگر آنستكه به تفاوت عدد ‪ 5‬و كاراكتر '‪ '5‬دقت داشته باشید‪ .‬در حقیقت‬
‫'‪ '5‬برابر است با عدد ‪ 53‬كه همان كد اسكی آن است‪.‬‬
‫روش فوق‪ ،‬برای نمایش کاراکترهای قابل چاپ مناسب است‪ ،‬اما بعضی‬
‫كاراكترها مانند ‪ enter‬قابل نمایش نبوده و برای آنها شکل خاصی وجود ندارد‪.‬‬
‫در چنین مواردی‪ ،‬زبان ‪ C‬از ترکیب عالمت \ به همراه یک کاراکتر دیگر‪ ،‬برای‬
‫نمایش این قبیل کاراکترها استفاده می نماید‪ .‬بعنوان مثال‪ ،‬کاراکتر '‪ '\n‬نشان‬
‫دهنده خط جدید یا همان ‪ enter‬می باشد‪.‬‬
‫جدول صفحه بعد این قبیل کاراکترها و معادل آنها را نشان می دهد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫نحوه نمایش در ‪C‬‬

‫کد اسکی‬

‫صدای بوق کامپیوتر‬

‫‪\a‬‬

‫‪7‬‬

‫حرکت به عقب ‪backspace‬‬

‫‪\b‬‬

‫‪8‬‬

‫شروع صفحه ‪form feed‬‬

‫‪\f‬‬

‫‪12‬‬

‫سطر جدید ‪line feed‬‬

‫‪\n‬‬

‫‪10‬‬

‫برگشت به ابتداي سطر ‪carriage return‬‬

‫‪\r‬‬

‫‪13‬‬

‫فاصله افقی ‪horizontal tab‬‬

‫‪\t‬‬

‫‪9‬‬

‫فاصله عمودی ‪vertical tab‬‬

‫‪\v‬‬

‫‪11‬‬

‫عالمت سوال‬

‫?\‬

‫‪63‬‬

‫عالمت '‬

‫'\‬

‫‪39‬‬

‫عالمت "‬

‫"\‬

‫‪34‬‬

‫عالمت \‬

‫\\‬

‫‪92‬‬

‫عالمت تهی‬

‫‪\0‬‬

‫‪0‬‬

‫نام کاراکتر‬

‫کد اسکی یک کاراکتر با ‪ 3‬رقم در مبنای ‪8‬‬

‫‪\000‬‬

‫کد اسکی یک کاراکتر با ‪ 2‬رقم در مبنای ‪16‬‬

‫‪\x00‬‬

‫‪ 7-4‬ثوابت‬
‫‪‬‬

‫ثوابت رشته ای ‪ C :‬عالوه بر ثوابت فوق‪ ،‬از یك ثابت دیگر بنام رشته نیز‬
‫حمایت می كند‪ .‬رشته‪ ،‬دنباله ای از كاراكترها است كه در داخل " قرار‬
‫می گیرند‪ .‬بعنوان مثال "‪ "this is a test‬یك رشته است‪ .‬دقت كنید كه '‪'a‬‬
‫یك كاراكتر است‪ ،‬اما "‪ "a‬یك رشته است كه فقط شامل یك كاراكتر می‬
‫باشد‪.‬‬

‫‪ 7-5‬عملگرها‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫عملگر‪ ،‬نمادی است كه به كامپایلر می گوید تا عملیات محاسباتی یا‬
‫منطقی خاصی را برروی یك یا چند عملوند‪ ،‬انجام دهد‪.‬‬
‫به عملگرهایی كه فقط یك عملوند دارند‪ ،‬عملگر یكانی می گوییم و‬
‫همواره عملگر در سمت چپ عملوند قرار می گیرد)مانند عدد ‪.(-125‬‬
‫اما عملگرهایی كه برروی دو عملوند اثر می كنند را عملگر دودویی‬
‫نامیده و عملگر را بین دو عملوند قرار می دهیم )مانند ‪.(23+86‬‬
‫هر ترکیب درستی از عملگرها و عملوندها را یک عبارت می نامیم‪.‬‬
‫‪ C‬از نقطه نظر عملگرها یك زبان بسیار قوی است‪ .‬این عملگرها به چند‬
‫دسته اصلی تقسیم می گردند كه آنها را به ترتیب بررسی می كنیم‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫این عملگرها‪ ،‬همان اعمال متداول ریاضی هستند كه در زبان ‪ C‬مورد استفاده‬
‫قرار می گیرند‪ .‬این اعمال عبارتند از ‪:‬‬

‫عمل‬

‫نوع‬

‫عملگر‬

‫منفی كردن عملوند سمت راست‬

‫یكانی‬

‫‪-‬‬

‫جمع دو عملوند‬

‫دودویی‬

‫‪+‬‬

‫تفریق دو عملوند‬

‫دودویی‬

‫‪-‬‬

‫ضرب دو عملوند‬

‫دودویی‬

‫*‬

‫تقسیم دو عملوند‬

‫دودویی‬

‫‪/‬‬

‫محاسبه باقیمانده تقسیم دو عملوند‬

‫دودویی‬

‫‪%‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬
‫‪‬‬

‫این عملگرهای برروی همه انواع داده های ‪ C‬عمل می كنند‪ ،‬بجز عملگر ‪ %‬كه فقط‬
‫برروی نوع داده های صحیح عمل می كند‪.‬‬
‫اما نكته مهمی كه باید به آن اشاره كرد‪ ،‬نحوه كار عملگر تقسیم برروی نوع داده های‬
‫مختلف است‪.‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫درصورتیكه هردو عملوند صحیح باشند‪ ،‬تقسیم بصورت صحیح بر صحیح انجام خواهد شد‪.‬‬
‫اگر یكی یا هر دو عملوند اعشاری باشند‪ ،‬تقسیم بصورت اعشاری انجام خواهد پذیرفت‪.‬‬
‫فرض كنید تعاریف زیر را داریم ‪:‬‬
‫; ‪int a,b‬‬
‫; ‪float c,d‬‬
‫; ‪a = 10 ; b = 4‬‬
‫;‪c = 8.2; d = 4.0‬‬
‫اكنون به نتایج عملیات زیر دقت كنید ‪:‬‬
‫‪a / b => 2‬‬
‫‪c / d => 2.05‬‬
‫‪a / d => 2.5‬‬
‫‪a / 4 => 2‬‬
‫چنانچه به آخرین مورد توجه كنید‪ ،‬متوجه می شوید كه از آنجا كه ‪a‬یك متغیر صحیح است و ‪4‬‬
‫نیز یك ثابت صحیح در نظر گرفته شده‪ ،‬درنتیجه تقسیم بصورت صحیح بر صحیح انجام گرفته‬
‫است‪ .‬چنانچه بخواهیم تقسیم بصورت اعشاری صورت پذیرد‪ ،‬به دو شكل می توانیم عمل‬
‫كنیم‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫برای اینکه عبارت تقسیم صفحه قبل بصورت اعشاری انجام شود‪ ،‬به دو روش‬
‫می توان عمل کرد‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫این عبارت را بصورت ‪ a / 4.0‬بنویسیم‪.‬‬
‫از عملگر قالب ریزی استفاده كنیم‪.‬‬

‫عملگر قالب ریزی می تواند یك نوع را به نوع دیگری تبدیل نماید‪ .‬شكل كلی آن‬
‫به شكل زیر است ‪:‬‬
‫>‪() ‫كه ‪ type‬نوع مورد نظر است كه قصد تبدیل عبارت ‪ expression‬به آن نوع را‬
‫داریم‪ .‬بعنوان مثال در مورد قبلی می توان به شكل زیر عمل كرد ‪:‬‬
‫‪(float) a / 4‬‬
‫در این حالت از كامپایلر خواسته ایم كه ابتدا عدد ‪ a‬را به اعشاری تبدیل كند‬
‫)البته بصورت موقت( و سپس آن را بر ‪ 4‬تقسیم نماید‪ ،‬كه مسلما حاصل‬
‫اعشاری خواهد بود‪.‬‬
‫بطوركلی هرگاه ثابتها و متغیرهایی از انواع مختلف در یك عبارت محاسباتی‬
‫داشته باشیم‪ ،‬كامپایلر ‪ C‬همه آنها را به یك نوع یكسان كه همان بزرگترین‬
‫عملوند موجود است تبدیل خواهد كرد‪ .‬بعنوان مثال به مورد صفحه بعد دقت‬
‫كنید ‪:‬‬

‫ عملگرهای محاسباتی‬7-5-1
char ch;
int i;

float f;
double d;
result = (ch / i)
int

+

(f *d)

(f+i)
float

double

double

int

-

double

double

float

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫اولویت عملگرها ‪ :‬در عبارتی که شامل چندین عملگر است‪ ،‬کدامیک در‬
‫ابتدا اعمال خواهد گردید‪.‬‬
‫اولویت عملگرهای محاسباتی از باال به پایین بشرح زیر است‪:‬‬
‫‪ ‬عملگر یکانی –‬
‫‪ ‬عملگرهای * و ‪ /‬و ‪%‬‬
‫‪ ‬عملگرهای ‪ +‬و –‬
‫چنانچه اولویت دو عملگر یکسان باشد‪ ،‬این عملگرها از چپ به راست‬
‫محاسبه خواهند شد‪.‬‬
‫چنانچه بخواهیم یک عمل با اولویت پایین زودتر انجام شود‪ ،‬باید از پرانتز‬
‫استفاده کنیم‪ .‬بنابراین اولویت عملگر پرانتز از همه موارد فوق‬
‫بیشتراست‪ .‬در مورد پرانتزهای متداخل‪ ،‬ابتدا پرانتز داخلی محاسبه‬
‫می شود؛ اما در مورد پرانتزهای هم سطح‪ ،‬ابتدا پرانتز سمت چپتر‬
‫محاسبه می گردد‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫چند مثال در مورد اولویت عملگرها‬

‫ترتیب اجرای عملگرها‬

‫عبارت زبان ‪C‬‬

‫ابتدا عمل * و سپس عمل ‪+‬‬

‫‪b+c*d‬‬

‫ابتدا عمل ‪ +‬و سپس عمل *‬

‫‪(b + c) * d‬‬

‫ابتدا عمل ‪ /‬سپس عمل * و در انتها عمل ‪+‬‬

‫‪b+c/d*e‬‬

‫ابتدا عمل * سپس عمل ‪ /‬و در انتها عمل ‪+‬‬

‫)‪b + c / (d * e‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫یک مثال کامل در مورد اولویت عملگرها‬

‫‪result = a + b * (f – (g + b) / d) – c * (a – d) / e‬‬
‫‪6‬‬

‫‪1‬‬
‫‪7‬‬

‫‪2‬‬

‫‪8‬‬

‫‪3‬‬
‫‪4‬‬
‫‪5‬‬
‫‪9‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫در زبان ‪ C‬برای انتساب چندین عملگر وجود دارد‪ .‬ساده ترین عملگر انتساب‪ ،‬همان عملگر =‬
‫است که در بسیاری از زبانها استفاده می شود‪ .‬بعنوان مثال ‪:‬‬
‫;‪a = 5‬‬
‫;‪b = c + 2 * d‬‬
‫این عملگر باعث می شود که عبارت سمت راست در عبارت سمت چپ قرار گیرد‪.‬‬
‫توجه کنید که مقدار سمت چپ باید عبارتی باشد که بتوان به آن یک مقدار را نسبت داد‬
‫)مانند یک متغیر( که به آن ‪ Lvalue‬گفته می شود‪ ،‬بنابراین یک ثابت نمی تواند در سمت چپ‬
‫قرار گیرد‪.‬‬
‫نکته دیگر اینکه اولویت عملگر = از عملگرهای ریاضی کمتر است و درنتیجه ابتدا آن عملیات‬
‫انجام شده و در پایان حاصل در عبارت سمت چپ ریخته می شود‪.‬‬
‫الزم به ذکر است که در هنگام انتساب‪ ،‬درصورت لزوم نوع عبارت سمت راست به نوع عبارت‬
‫سمت چپ تبدیل می شود‪ .‬مثال‪:‬‬
‫;‪int a‬‬
‫;‪a = 2.5 * 5.0‬‬
‫که دراینصورت عدد ‪ 12‬در ‪ a‬ذخیره خواهد شد‪.‬‬
‫شرکت پذیری این عملگر از راست به چپ می باشد‪ ،‬بدین معنا که چنانچه چندین عملگر‬
‫نسبت دهی داشته باشیم‪ ،‬این عملگرها از راست به چپ محاسبه می شوند‪ .‬مثال پس از‬
‫اجرای دستور زیر‪ ،‬مقدار هر ‪ 3‬متغیر برابر ‪ 10‬خواهد شد‪.‬‬
‫;‪a = b = c = 10‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬

‫نکته جالب درمورد زبان ‪ C‬آنستکه دارای یک سری عملگرهای انتساب‬
‫خالصه شده است که باعث می شوند در بعضی موارد بتوانیم عبارات‬
‫کوتاهتری را بنویسیم‪ .‬این عملگرها عبارتند از ‪:‬‬
‫عملگرد‬

‫مثال‬

‫عبارت انتساب معادل‬

‫‪++‬‬

‫;‪a ++‬‬

‫;‪a = a + 1‬‬

‫‪--‬‬

‫;‪a --‬‬

‫;‪a = a – 1‬‬

‫=‪+‬‬

‫;‪a += 5‬‬

‫;‪a = a + 5‬‬

‫=‪-‬‬

‫;‪a -= 8‬‬

‫;‪a= a – 8‬‬

‫=*‬

‫;‪a *= 10‬‬

‫;‪a= a * 10‬‬

‫=‪/‬‬

‫;‪a /= 2‬‬

‫;‪a = a / 2‬‬

‫=‪%‬‬

‫;‪a %= 10‬‬

‫;‪a = a % 10‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬
‫‪‬‬

‫عملگر اول و دوم‪ ،‬عملگرهای یکانی هستند که بترتیب عملگر افزایش و عملگر کاهش‬
‫نامیده می شوند‪.‬‬
‫نکته جالب آنستکه این دو عملگر به دوصورت مورد استفاده قرار می گیرند‪.‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫در حالتی که از دستور ;‪ a ++‬استفاده شود به آن پس افزایش می گویند و بدین معناست که‬
‫ابتدا از مقدار فعلی ‪ a‬در عبارت موردنظر استفاده کن و سپس آن را افزایش بده‪.‬‬
‫اما دستور ;‪ ++ a‬که به آن پیش افزایش گفته می شود‪ ،‬ابتدا ‪ a‬را افزایش داده و سپس از آن‬
‫در عبارت استفاده می کند‪.‬‬
‫به برنامه زیر دقت کنید‪:‬‬

‫>‪#include ‫{ )(‪void main‬‬
‫; ‪int a ,b‬‬
‫;‪a=5‬‬
‫;‪b = a ++‬‬
‫;)‪printf(“a=%d and b=%d \n”,a,b‬‬
‫;‪a=5‬‬
‫;‪b = ++ a‬‬
‫;)‪printf(“a=%d and b=%d \n”,a,b‬‬
‫}‬
‫‪a=6 b=5‬‬
‫‪a=6 b=6‬‬

‫‪ 7-5-3‬عملگرهای مقایسه ای‬
‫‪‬‬

‫‪‬‬

‫این عملگرها دو عبارت را بایکدیگر مقایسه کرده و نتیجه را باز می گردانند‪.‬‬
‫نتیجه می تواند درست )‪ (true‬یا غلط )‪ (false‬باشد‪.‬‬
‫نتیجه این عملگرها یک عدد صحیح است که درصورت درست بودن ‪ 1‬و‬
‫درصورت غلط بودن ‪ 0‬باز می گردانند‪ .‬این عملگرها عبارتند از‪:‬‬
‫عملگر‬

‫مفهوم عملگر‬

‫مثال‬

‫<‬

‫بزرگتر )<(‬

‫‪a>b‬‬

‫>‬

‫کوچکتر )>(‬

‫‪a
‫=<‬

‫بزرگتر یا مساوی )≤(‬

‫‪a >= b‬‬

‫=>‬

‫کوچکتر یا مساوی )≥(‬

‫‪a <= b‬‬

‫==‬

‫مساوی )=(‬

‫‪a == b‬‬

‫=!‬

‫نامساوی )≠(‬

‫‪a != b‬‬

‫‪ 7-5-3‬عملگرهای مقایسه ای‬
‫‪‬‬

‫‪‬‬

‫نکته مهمی که باید به آن دقت کرد عملگر مساوی )==( است‪ ،‬چرا که یک‬
‫اشتباه بسیار متداول برنامه نویسان ‪ C‬استفاده اشتباه از عملگر انتساب‬
‫)=( بجای عملگر تساوی )==( است که باعث ایجاد خطا در برنامه می‬
‫شود‪.‬‬
‫اولویت این عملگرها از باال به پایین بشرح زیر است‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫عملگرهای <‪ <= ، > ،‬و =>‬
‫عملگرهای == و =!‬

‫الزم بذکر است که در هنگام مساوی بودن اولویت چند عملگر‪ ،‬این عملگرها‬
‫از چپ به راست محاسبه می گردند‪.‬‬

‫‪ 7-5-4‬عملگرهای منطقی‬
‫‪‬‬

‫این عملگرها به شما اجازه می دهند که شرطهای ساده ای را که با‬
‫استفاده از عملگرهای مقایسه ای ایجاد شده اند را با یکدیگر ترکیب نموده‬
‫و شرطهای پیچیده تری را بسازید‪ .‬این عملگرها عبارتند از ‪:‬‬
‫مثال‬

‫عملگر‬

‫مفهوم عملگر‬

‫نحوه کار‬

‫&&‬

‫‪ AND‬منطقی‬

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

‫‪a>0 && sw==1‬‬

‫||‬

‫‪ OR‬منطقی‬

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

‫‪a<=100 || b!=0‬‬

‫!‬

‫‪ NOT‬منطقی‬

‫اگر عملوند درست باشد‪ ،‬نادرست و‬
‫اگر نادرست باشد‪ ،‬درست برمی‬
‫گرداند‪.‬‬

‫)‪! (a==1 || b<10‬‬

‫‪ 7-5-5‬عملگر شرطی‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫گاهی الزم است که ابتدا یک شرط بررسی شده و سپس برمبنای نتیجه )درست یا نادرست بودن آن( یکی‬
‫از دو عبارت ممکن بازگردانده شود‪ .‬برای اینکار می توان از یک عملگر ‪3‬تایی )با ‪ 3‬عملوند( بنام عملگر‬
‫شرطی استفاده نمود‪.‬‬
‫شکل کلی این عملگر بصورت زیر است‪:‬‬
‫>عبارت‪> :<2‬عبارت‪> ?<1‬شرط<‬
‫نحوه کار بدینصورت است که درصورت درست بودن شرط‪ ،‬عبارت‪ 1‬و در غیراینصورت عبارت ‪ 2‬بازگردانده می‬
‫شود‪.‬‬
‫به عنوان مثال به دستور زیر توجه کنید‪:‬‬
‫که این عبارت معادل دستور زیر است‪:‬‬

‫‪‬‬

‫;‪a = (k<10) ? 100 : 50‬‬
‫;‪if (k<10) a=100‬‬
‫;‪else a=50‬‬

‫البته این عبارت به شکلهای پیچیده نیز می تواند مورد استفاده قرار گیرد‪ .‬مثال ‪:‬‬
‫;‪c += (a>0 && a<10) ? ++a : a/b‬‬
‫که معادل است با ‪:‬‬
‫{ )‪if (a>0 && a<10‬‬
‫;‪a= a + 1‬‬
‫;‪c = c + a‬‬
‫}‬
‫;‪else c = c + a/b‬‬

‫‪ 7-5-6‬اولویت عملگرها‬
‫عملگر‬

‫اولویت‬

‫شرکت پذیری‬

‫‪1‬‬

‫)(‬

‫از چپ به راست‬

‫‪2‬‬

‫‪- + ! -- ++‬‬

‫از راست به چپ‬

‫‪3‬‬

‫‪* / %‬‬

‫از چپ به راست‬

‫‪4‬‬

‫‪+ -‬‬

‫از چپ به راست‬

‫‪5‬‬

‫>> <<‬

‫از چپ به راست‬

‫‪6‬‬

‫>= > <= <‬

‫از چپ به راست‬

‫‪7‬‬

‫=! ==‬

‫از چپ به راست‬

‫‪8‬‬

‫&&‬

‫از چپ به راست‬

‫‪9‬‬

‫||‬

‫از چپ به راست‬

‫‪10‬‬

‫‪?:‬‬

‫از راست به چپ‬

‫‪11‬‬

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

‫از راست به چپ‬

‫‪12‬‬

‫‪,‬‬

‫از چپ به راست‬

‫‪ 7-6‬خواندن و نمایش اطالعات‬
‫‪‬‬

‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫همانطور كه قبال نیز گفته شد‪ ،‬یكی از اهداف زبان ‪ C‬قابل حمل بودن آن‬
‫است‪ .‬بهمین منظور سعی شده است كه از دستوراتی كه ممكن است‬
‫وابسته به ماشین خاصی باشد‪ ،‬اجتناب گردد‪.‬‬
‫بهمین دلیل زبان ‪ C‬برخالف سایر زبانها دارای هیچ دستوری برای‬
‫خواندن از ورودی و یا نوشتن در خروجی نیست‪.‬‬
‫اما در عوض دارای تعدادی تابع )زیربرنامه( استاندارد می باشد كه تقریبا‬
‫تمامی كامپایلرها از آنها حمایت می كنند‪.‬‬
‫این كار به كامپایلر این امكان را می دهد كه بر حسب نوع سخت افزار‬
‫موردنظر‪ ،‬توابع ورودی و خروجی را طراحی نماید‪.‬‬
‫این توابع در یك فایل سرآمد بنام ‪ stdio.h‬تعریف شده اند و بنابراین قبل‬
‫ازاینكه بتوانید از این توابع استفاده نمایید‪ ،‬باید این فایل را نیز با استفاده‬
‫از ‪ #include‬در برنامه خود بگنجانید‪.‬‬

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫برای نمایش اطالعات در خروجی از تابع ‪ printf‬استفاده می شود‪.‬‬
‫این تابع رشته موردنظر شما را به خروجی استاندارد )كه در حالت‬
‫عادی همان صفحه نمایش یا مانیتور است( می فرستد‪ .‬شكل كلی این‬
‫تابع بصورت زیر است‪:‬‬
‫; )>لیست متغیرها< ‪> ,‬رشته كنترلی<(‪printf‬‬
‫رشته كنترلی همان متنی است كه قصد چاپ آن را داریم‪ ،‬با ذكر این‬
‫نكته كه در قسمتهایی كه باید مقدار یك متغیر چاپ شود‪ ،‬از یك‬
‫مشخصه تبدیل استفاده می شود‪ .‬هر مشخصه تبدیل از یك عالمت ‪%‬‬
‫بعالوه یك كاراكتر كه نوع متغیر مورد نظر را نشان می دهد تشكیل می‬
‫گردد‪.‬‬
‫لیست متغیرها نیز همان متغیرهایی هستند كه قصد چاپ آنها را داریم‪.‬‬
‫این متغیرها باید بترتیب قرار گرفته و با كاما )‪ (,‬از یكدیگر جدا شوند‪.‬‬

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫مشخصه تبدیل‬

‫مفهوم‬

‫‪%c‬‬

‫كاراكتر‬

‫‪%d‬‬

‫عدد صحیح در مبنای ‪10‬‬

‫‪%f‬‬

‫عدد اعشاری بدون نماد علمی‬

‫‪%e‬‬

‫عدد اعشاری با نماد علمی‬

‫‪%g‬‬

‫عدد اعشاری با حالت كوتاهتر بین ‪ e‬و ‪f‬‬

‫‪%s‬‬

‫رشته‬

‫‪%ld‬‬

‫عدد صحیح بزرگ‬

‫‪%lf %le %lg‬‬

‫عدد اعشاری بزرگ‬

‫‪%o‬‬

‫عدد صحیح در مبنای ‪8‬‬

‫‪%x‬‬

‫عدد صحیحی در مبنای ‪16‬‬

‫‪%u‬‬

‫عدد صحیح بدون عالمت‬

‫ تابع نمایش در خروجی‬7-6-1
#include
void main() {
int age = 20;
floate average = 18.23;
printf("You are %d years old and your average is %f \n",age,average);
}
You are 20 years old and your average is 18.230000

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫‪‬‬
‫‪‬‬

‫برای کنترل نحوه چاپ اعداد می توانید از مشخصه طول میدان استفاده‬
‫کنید‪.‬‬
‫مشخصه طول میدان برای اعداد به شكل زیر استفاده می شود‪:‬‬
‫‪ ‬برای اعداد صحیح از ‪ %nd‬استفاده می كنیم كه ‪ n‬تعداد ارقام را نشان‬
‫می دهد )مثال ‪ .(%3d‬در اینصورت برای هر متغیر ‪ n‬رقم درنظر گرفته‬
‫می شود‪ .‬اگر اندازه عدد از ‪ n‬كوچكتر باشد‪ ،‬به سمت چپ آن فضای‬
‫خالی اضافه می شود و اگر اندازه عدد بیش از ‪ n‬رقم باشد‪ ،‬طول میدان‬
‫نادیده گرفته شده و عدد بطور كامل چاپ می شود‪.‬‬
‫‪ ‬برای اعداد اعشاری از ‪ %n.mf‬استفاده می كنیم كه ‪ n‬اندازه كل عدد‬
‫)شامل عالمت ممیز( و ‪ m‬تعداد ارقام اعشار است )مثال ‪ .(%5.2f‬در‬
‫صورتیكه تعداد ارقام اعشاری عدد موردنظر از ‪ m‬بیشتر باشد‪ ،‬عدد به ‪m‬‬
‫عدد اعشار گرد می شود و در صورتیكه از ‪ m‬كمتر باشد‪ ،‬در سمت‬
‫راست آن ‪ 0‬قرار داده می شود‪.‬‬

‫‪ 7-6-2‬تابع خواندن از ورودی‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای خواندن اطالعات از ورودی از تابع ‪ scanf‬استفاده می شود‪.‬‬
‫این تابع اطالعات را ازورودی استاندارد )معموال صفحه كلید( خوانده و در‬
‫متغیرهای تعیین شده قرار می دهد‪.‬‬
‫شكل كلی این تابع بصورت زیر است‪:‬‬
‫; )>لیست آدرسهای متغیرها< ‪> ,‬رشته كنترلی<(‪scanf‬‬
‫همانطور كه می بینید نحوه احضار تابع ‪ scanf‬نیز مشابه ‪ printf‬است‪ .‬تنها‬
‫تفاوت در آن است كه در ‪ scanf‬باید لیست آدرسهای متغیرها ارسال شود‪.‬‬
‫مبحث مربوط به آدرسها در فصول بعدی بررسی خواهد شد ولی در حال حاضر‬
‫بخاطر بسپارید كه برای بدست آوردن آدرس یك متغیر از عالمت & استفاده می‬
‫كنیم‪ .‬بعنوان مثال ‪ &age‬بمعنای آدرس متغیر ‪ age‬است‪.‬‬
‫بطور كلی در ‪ C‬قدیمی هرگاه كه یك تابع دارای پارامترهای خروجی بود )یعنی‬
‫پارامترهایی كه یك مقدار را باز می گرداندند( از آدرس متغیرها استفاده می‬
‫شد كه امروزه این مسئله وجود ندارد‪.‬‬

‫ تابع خواندن از ورودی‬7-6-2
#include
void main() {
int age;
float average ;
printf("Please enter your age and average : ");
scanf("%d %f",&age,&average);
printf("You are %d years old and your average is %5.2f \n",age,average);
}

Please enter your age and average : 19 16.72
You are 19 years old and your average is 16.72

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫زبان ‪ C++‬یک زبان شی گرا است‪ ،‬بهمین دلیل در این زبان برای ورودی‬
‫و خروجی از اشیاء بجای توابع استفاده می گردد‪.‬‬
‫از آنجا که امروزه معموال برنامه نویسان ‪ C‬از کامپایلرهای ‪ C++‬استفاده‬
‫می کنند‪ ،‬می توانند از اشیای ورودی و خروجی آن نیز استفاده کنند‪.‬‬
‫اینکار در بین بسیاری از برنامه نویسان ‪ C‬متداول است‪ ،‬بهمین دلیل ما‬
‫در اینجا نحوه کار با اشیای خواندن و نوشتن در ‪ C++‬را بطور مقدماتی‬
‫توضیح می دهیم؛ گرچه توضیح کامل این موارد نیاز به آشنایی با شی‬
‫گرایی و زبان ‪ C++‬دارد‪.‬‬
‫قبل از هرچیز الزم به ذکر است که کلیه اشیای مربوط به ورودی و‬
‫خروجی در فایل سرآمدی بنام ‪ iostream.h‬تعیریف شده اند‪ ،‬بنابراین‬
‫ابتدا باید این فایل به برنامه توسط دستور ‪ #include‬الحاق گردد‪.‬‬

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫زبان ‪ C++‬برای نمایش اطالعات از یک شیئ بنام ‪ cout‬استفاده می نماید‪.‬‬
‫برای ارسال اطالعات مورد نظر برای چاپ به ‪ cout‬باید از عملگر درج در جریان‬
‫یا >> استفاده نماییم‪ .‬بعنوان مثال ‪:‬‬
‫; ” ‪cout >> “Please enter your name:‬‬
‫و یا مثال دیگر ‪:‬‬
‫;‪int a = 10‬‬
‫;‪float b = 2.86‬‬
‫;‪cout << a‬‬
‫;‪cout << b‬‬
‫نکته جالبی که در این مثالها دیده می شود‪ ،‬آنستکه برخالف تابع ‪ printf‬هیچ‬
‫نیازی به مشخص کردن نوع متغیری که قصد چاپ آن را داریم نیست و خود‬
‫شئ ‪ cout‬نوع آن را تشخیص می دهد‪.‬‬
‫عالوه براین می توان چندین عملگر درج در جریان را با یکدیگر الحاق کرد و‬
‫چندین متغیر را با یک دستور چاپ کرد‪.‬‬

C++ ‫ ورودی و خروجی اطالعات در‬7-6-3
#include
void main() {
int age = 20;
floate average = 18.23;
cout >> “You are ” >> age >> “ years old and your average is ” >> average ;
}

You are 20 years old and your average is 18.230000

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای دریافت اطالعات از کاربر‪ ،‬از شئ دیگری بنام ‪ cin‬استفاده می شود‪.‬‬
‫برای ارسال متغیر مورد نظر به ‪ cin‬باید از عملگر استخراج از جریان یا <<‬
‫استفاده نماییم‪ .‬بعنوان مثال‪:‬‬
‫;‪int a‬‬
‫;‪cin >> a‬‬
‫بازهم همانطور که می بینید نیازی به تعیین نوع متغیر موردنظر نیست و خود‬
‫شئ ‪ cin‬نوع متغیر را بطور اتوماتیک تشخیص داده و داده ای از همان نوع را از‬
‫کاربر دریافت و در متغیر مورد نظر قرار می دهد‪.‬‬
‫عملگرهای استخراج از جریان را نیز می توان با یکدیگر الحاق کرد‪.‬‬
‫برای رفتن به خط بعد در شئ ‪ cout‬می توان از دستکاری کننده ‪ endl‬استفاده‬
‫کرد‪ .‬مثال در دستور زیر پس از چاپ پیغام‪ ،‬مکان نما به خط بعد منتقل می‬
‫شود‪:‬‬
‫;‪cout >> “List of students : “ >> endl‬‬
‫البته دستکاری کننده های متعدد دیگری نیز ازجمله موارد مربوط به تعیین طول‬
‫میدان و نحوه چاپ مقادیر وجود دارد که توضیح آنها نیاز به یک مبحث مستقل‬
‫دارد‪.‬‬

C++ ‫ ورودی و خروجی اطالعات در‬7-6-3
#include
void main() {
int age;
float average ;
cout << "Please enter your age and average : " ;
cin >> age >> average ;
cout << "You are " << age << "years old and your average is " << average;
}

Please enter your age and average : 19 16.72
You are 19 years old and your average is 16.72

‫‪ 7-7‬توابع کتابخانه ای‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫همانطور که قبال نیز گفته شد‪ ،‬زبان ‪ C‬از زیر برنامه ها نیز حمایت می کند‪ .‬هر زیر برنامه‬
‫در ‪ C‬یک تابع نامیده می شود‪ .‬تا کنون با توابعی همچون ‪ main‬و یا ‪ printf‬و ‪ scanf‬آشنا‬
‫شده ایم‪.‬‬
‫معموال عرضه کنندگان کامپایلرها و یا سایر فروشندگان نرم افزار‪ ،‬برخی از توابع عمومی‬
‫را که ممکن است مورد نیاز جمع کثیری از برنامه نویسان مختلف باشد را در قالب‬
‫کتابخانه ای از توابع در اختیار برنامه نویسان می گذارند‪ .‬بعضی از این توابع کتابخانه ای‬
‫مانند ‪ printf‬و ‪ scanf‬بصورت استاندارد درآمده و توسط عرضه کنندگان مختلف ارائه می‬
‫شوند‪.‬‬
‫در کامپایلر عرضه شده توسط شرکت بورلند )‪ (Borland C++ 3.1‬نیز کتابخانه های‬
‫متعددی از توابع برای شما عرضه شده اند که بتدریج با آنها و کاربردشان آشنا خواهید‬
‫شد‪.‬‬
‫نکته مهم آنستکه برای استفاده از این توابع ابتدا باید فایل سرآمد مربوط به آنها را نیز در‬
‫ابتدای برنامه خود اضافه نمایید ) با استفاده از ‪ .(#include‬هر فایل سرآمد شامل تعاریف‬
‫اولیه گروهی از توابع مرتبط با هم و داده های مربوط به آنها بوده و در استاندارد قدیمی‬
‫تر دارای پسوند ‪ .h‬می باشد)در استاندارد جدید پسوند این فایلها حذف شده است(‪.‬‬
‫برخی از این فایلهای سرآمد عبارتند از‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪ : stdio.h‬توابع ورودی و خروجی استاندارد‬
‫‪ : math.h‬توابع ریاضی‬
‫‪ : graphics.h‬توابع مربوط به عملیات گرافیکی‬
‫‪ : string.h‬توابع مربوط به کار با رشته ها‬


Slide 12

‫مبانی کامپیوتر و برنامه سازی‬
‫فصل هفتم ‪ :‬مفاهیم اولیه زبان ‪C‬‬
‫مدرس ‪ :‬نگین معروفی‬

‫‪ 7-1‬شناسه ها در ‪C‬‬
‫‪‬‬
‫‪‬‬

‫شناسه )‪ (identifier‬نامی است که به یک قسمت از برنامه مانند متغیر‪ ،‬تابع‪ ،‬ثابت و یا‬
‫‪ ...‬داده می شود‪.‬‬
‫در زبان ‪ C‬برای انتخاب شناسه ها فقط می توان از عالئم زیر استفاده کرد‪:‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫حروف انگلیسی کوچک و بزرگ )‪(A…Z a…z‬‬
‫ارقام )‪(0…9‬‬
‫عالمت خط پایین یا _‬

‫البته یک شناسه نمی تواند با یک رقم شروع شود‪.‬‬
‫چند شناسه مجاز‪ name2 ، average ، sum :‬و ‪student_average‬‬
‫چند شناسه غیرمجاز ‪ 2name‬و یا ‪student average‬‬
‫در برنامه نویسی امروزی پیشنهاد می شود بجای شناسه هایی همانند‬
‫‪ student_average‬از ‪ studentAverage‬استفاده گردد‪.‬‬
‫نکته مهم دیگری که باید به آن اشاره کرد آنستکه زبان ‪ C‬برخالف بسیاری از زبانهای دیگر‬
‫به کوچک و بزرگی حروف حساس است )‪ .(case sensitive‬در نتیجه شناسه های زیر با‬
‫یکدیگر متفاوتند ‪:‬‬
‫‪Sum ≠ sum ≠ SUM‬‬
‫آخرین نکته اینستکه در هنگام انتخاب شناسه نمی توانید از کلمات کلیدی که برای‬
‫منظورهای خاص در زبان ‪ C‬رزرو شده اند استفاده کنید‪.‬‬

C ‫ شناسه ها در‬7-1
: C ‫کلمات کلیدی در زبان‬
auto

break

case

char

const

continue

default

do

double

else

enum

extern

float

for

goto

if

int

long

register

return

short

signed

sizeof

static

struct

switch

typedef

union

unsigned

void

volatile

while

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫محدوده‬

‫اندازه )بیت(‬

‫توضیح‬

‫نوع داده‬

‫‪-128 to +127‬‬

‫‪8‬‬

‫کاراکتر‬

‫‪char‬‬

‫‪-32768 to +32767‬‬

‫‪16‬‬

‫عدد صحیح‬

‫‪int‬‬

‫‪3.4e-38 to 3.4e+38‬‬

‫‪32‬‬

‫عدد اعشاری‬

‫‪float‬‬

‫‪1.7e-308 to 1.7e+308‬‬

‫‪64‬‬

‫عدد اعشاری با‬
‫دقت مضاعف‬

‫‪double‬‬

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫‪‬‬

‫البته چند نکته مهم درمورد این جدول قابل ذکر است ‪:‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫اندازه ‪ int‬در محیطهای ‪ 16‬بیتی مانند ‪ DOS‬برابر ‪ 16‬بیت است‪ .‬اما در‬
‫محیطهای ‪ 32‬بیتی همانند ‪ Windows‬اندازه آن ‪ 32‬بیت می باشد که در‬
‫اینصورت محدوده ای برابر ‪ -2,147,483,648‬تا ‪ +2,147,483,647‬را‬
‫پوشش می دهد‪.‬‬
‫در بعضی از کامپایلرهای ‪ ،C‬نوع داده ‪ bool‬نیز وجود دارد که می تواند‬
‫یکی از مقادیر ‪)true‬درست( یا ‪) false‬غلط( را نشان دهد ‪ .‬اما در نسخه‬
‫های اولیه ‪ C‬از همان نوع داده صحیح یا ‪ int‬برای اینکار استفاده می‬
‫شد‪ .‬بدین صورت که ‪ 0‬نشاندهنده ‪ false‬و هر عدد غیر صفر )معموال ‪(1‬‬
‫نشاندهنده ‪ true‬است‪.‬‬
‫از آنجا که برای ذخیره سازی کاراکترها کد اسکی آنها ذخیره می گردد‪،‬‬
‫از یک متغیر کاراکتری یا ‪ char‬می توان بعنوان یک عدد صحیح کوچک نیز‬
‫استفاده کرد و اعمال ریاضی برروی آنها نیز مجاز است‪.‬‬

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫عالوه براین چندین اصالح کننده نیز وجود دارد که به ما اجازه می دهد نوع داده مورد‬
‫نظر را با دقت بیشتری برای نیازهای مختلف استفاده نماییم‪.‬‬
‫این اصالح کننده ها عبارتند از ‪short, long, signed, unsigned :‬‬
‫تمام این اصالح کننده ها می توانند به نوع داده ‪ int‬اعمال شوند و اثر آنها بستگی‬
‫به محیط دارد‪.‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫در یک محیط ‪16‬بیتی‪short int ،‬بازهم برابر ‪16‬بیت است ولی ‪ long int‬برابر‪32‬بیت می‬
‫باشد‪.‬‬
‫‪ unsigned int‬باعث می شود که یک عدد ‪ 16‬بیتی بدون عالمت داشته باشیم که بازه‬
‫بین ‪ 0‬تا ‪ 65535‬را پوشش می دهد‪ signed int .‬نیز همانند ‪ int‬معمولی بوده و تفاوتی‬
‫ندارد‪.‬‬
‫ترکیب این اصالح کننده ها نیز ممکن است‪ .‬مثال ‪ unsigned long int‬یک عدد ‪ 32‬بیتی‬
‫بدون عالمت است که بازه ‪ 0‬تا ‪ 4,294,967,295‬را پوشش می دهد‪.‬‬

‫برروی نوع داده ‪ char‬فقط اصالح کننده های ‪ signed‬و ‪ unsigned‬را می توان اعمال‬
‫کرد‪ .‬معموال از اصالح کننده ‪ unsigned‬وقتی استفاده می شود که قصد داشته‬
‫باشیم از ‪ char‬بعنوان یک عدد صحیح مثبت بین ‪ 0‬تا ‪ 255‬استفاده کنیم‪.‬‬
‫برروی نوع داده ‪ double‬تنها اصالح کننده ‪ long‬قابل اعمال است و دراینصورت عدد‬
‫اعشاری با ‪ 80‬بیت را خواهیم داشت که قادر است هر عددی در بازه ‪ 3.4e-4932‬تا‬
‫‪ 1.1e+4932‬را در خود نگاه دارد‪.‬‬

‫‪ 7-3‬تعریف متغیرها‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای تعریف متغیرها به شکل زیر عمل می کنیم‪:‬‬

‫;>‪ ‫که ‪ type‬یکی از نوع داده های گفته شده و ‪ variable-list‬لیستی از متغیرها است‬
‫که با کاما از یکدیگر جدا شده اند‪ .‬بعنوان مثال ‪:‬‬
‫;‪int sum‬‬
‫;‪float average‬‬
‫; ‪long int a, b, c‬‬
‫; ‪unsigned long int i, j, k‬‬
‫عالوه براین می توان در هنگام تعریف متغیر به آن مقدار اولیه نیز داد‪ .‬مثال ‪:‬‬
‫; ‪int d = 0‬‬
‫نكته مهم آنكه زبان ‪ C‬به متغیرها مقدار اولیه نمي دهد )حتي ‪ (0‬و برنامه نويس‬
‫خود بايد اينكار را صريحا انجام دهد‪ ،‬درغیر اينصورت مقدار اولیه متغیر‪ ،‬نامعین خواهد‬
‫بود‪.‬‬
‫تعریف متغیرها طبق اصول زبان ‪ C‬میتواند درهرجایی از برنامه صورت پذیرد‪ ،‬و‬
‫متغیرهای تعریف شده از همان خط به بعد قابل استفاده خواهد بود‪ .‬اما معموال‬
‫توصیه می گردد كه تعریف متغیرها در همان خط ابتدایی تابع و بالفاصله پس از {‬
‫صورت پذیرد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫‪‬‬
‫‪‬‬

‫ثابتها مقادیر ثابتی هستند كه مقدار آنها در حین اجرای برنامه تغییر نمی یابد‪ .‬ثابتها می توانند از‬
‫هریك از نوع داده های اصلی باشند‪.‬‬
‫ثوابت عددی صحیح ‪:‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫برای نمایش این دسته از ثوابت‪ ،‬از دنباله ای از ارقام بعالوه عالمت ‪ +‬یا ‪ -‬استفاده می كنیم‪ .‬بعنوان مثال‬
‫‪ -45‬و یا ‪ 3489‬ثوابت صحیح هستند‪.‬‬
‫در حالت عادی ‪ C‬هر عدد را در كوچكترین نوع داده ای كه می تواند قرار می دهد‪ .‬مثال عدد ‪ 85‬در یك‬
‫‪ int‬قرار می گیرد‪ ،‬اما عدد ‪ 145398‬در یك ‪ long int‬قرار خواهد گرفت‪.‬‬
‫اگر قصد دارید یك عدد كوچك بعنوان ‪ long‬محسوب گردد‪ ،‬می توانید از پسوند ‪ L‬در انتهای آن استفاده‬
‫می كنیم‪ .‬مثال ‪245L‬یك عدد ‪ long‬محسوب می شود‪.‬‬
‫;‪long int a = 20L‬‬
‫پسوند ‪ U‬در انتهای عدد نیز نشانه بدون عالمت بودن آن است‪.‬‬
‫نكته دیگر آنكه ‪ C‬به شما اجازه می دهد درصورت لزوم ثوابت صحیح خود را در مبنای ‪ 8‬یا ‪ 16‬نیز كه‬
‫از مبناهای متداول در برنامه نویسی هستند‪ ،‬بنویسید‪.‬‬
‫‪‬‬
‫‪‬‬

‫برای نوشتن عدد در مبنای ‪ 8‬باید آن را با ‪ 0‬آغاز كنید‪ ،‬مثال ‪ 0342‬یك عدد در منای ‪ 8‬محسوب می‬
‫گردد‪.‬‬
‫برای نوشتن یك عدد در مبنای ‪ 16‬باید آن را با ‪ 0x‬آغاز نمایید‪ ،‬مانند ‪.0x27A4‬‬

‫‪ 7-4‬ثوابت‬
‫ثوابت عددی اعشاری‬

‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫برای نمایش اعداد اعشاری‪ ،‬باید از نقطه اعشار استفاده كنیم‪ ،‬مانند ‪237.45‬‬
‫اما نكته جالب آنستكه می توانید از نماد علمی نیز برای نمایش اعداد‬
‫اعشاری استفاده كنید‪ .‬برای اینكار كافی است از حرف ‪ e‬برای نمایش قسمت‬
‫توان استفاده نمایید‪ .‬بعنوان مثال ‪:‬‬
‫‪-23.47 × 10 5 = -23.47e5‬‬
‫‪42.389 × 10 -3 = 42.389e-3‬‬
‫دقت كنید كه قسمت توان‪ ،‬حتما یك عدد صحیح است‪.‬‬
‫نكته جالب اینجاست كه برخالف مورد قبل‪ ،‬كامپایلر بطور پیش فرض داده های‬
‫اعشاری را از نوع ‪ double‬فرض می كند‪.‬چنانچه دوست دارید ثابت شما ازنوع‬
‫‪ float‬درنظر گرفته شود‪ ،‬در انتهای آن ‪ F‬قرار دهید‪ .‬ضمنا پسوند ‪ L‬نیز داده‬
‫اعشاری را از نوع ‪ long double‬درنظر می گیرد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫ثوابت كاراكتری ‪:‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫برای نشان دادن ثوابت كاراكتری‪ ،‬آنها را در داخل ' قرار می دهیم‪ .‬بعنوان مثال‬
‫'‪'A‬یك ثابت كاراكتری است‪.‬‬
‫; '‪char ch = 'S‬‬
‫دقت كنید كه همانطور كه قبال گفته شد‪ ،‬كد اسكی كاراكترها در متغیر ذخیره‬
‫می گردد‪ ،‬بنابراین می توان از آن بعنوان یك عدد صحیح نیز استفاده كرد‪ .‬نكته‬
‫مهم دیگر آنستكه به تفاوت عدد ‪ 5‬و كاراكتر '‪ '5‬دقت داشته باشید‪ .‬در حقیقت‬
‫'‪ '5‬برابر است با عدد ‪ 53‬كه همان كد اسكی آن است‪.‬‬
‫روش فوق‪ ،‬برای نمایش کاراکترهای قابل چاپ مناسب است‪ ،‬اما بعضی‬
‫كاراكترها مانند ‪ enter‬قابل نمایش نبوده و برای آنها شکل خاصی وجود ندارد‪.‬‬
‫در چنین مواردی‪ ،‬زبان ‪ C‬از ترکیب عالمت \ به همراه یک کاراکتر دیگر‪ ،‬برای‬
‫نمایش این قبیل کاراکترها استفاده می نماید‪ .‬بعنوان مثال‪ ،‬کاراکتر '‪ '\n‬نشان‬
‫دهنده خط جدید یا همان ‪ enter‬می باشد‪.‬‬
‫جدول صفحه بعد این قبیل کاراکترها و معادل آنها را نشان می دهد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫نحوه نمایش در ‪C‬‬

‫کد اسکی‬

‫صدای بوق کامپیوتر‬

‫‪\a‬‬

‫‪7‬‬

‫حرکت به عقب ‪backspace‬‬

‫‪\b‬‬

‫‪8‬‬

‫شروع صفحه ‪form feed‬‬

‫‪\f‬‬

‫‪12‬‬

‫سطر جدید ‪line feed‬‬

‫‪\n‬‬

‫‪10‬‬

‫برگشت به ابتداي سطر ‪carriage return‬‬

‫‪\r‬‬

‫‪13‬‬

‫فاصله افقی ‪horizontal tab‬‬

‫‪\t‬‬

‫‪9‬‬

‫فاصله عمودی ‪vertical tab‬‬

‫‪\v‬‬

‫‪11‬‬

‫عالمت سوال‬

‫?\‬

‫‪63‬‬

‫عالمت '‬

‫'\‬

‫‪39‬‬

‫عالمت "‬

‫"\‬

‫‪34‬‬

‫عالمت \‬

‫\\‬

‫‪92‬‬

‫عالمت تهی‬

‫‪\0‬‬

‫‪0‬‬

‫نام کاراکتر‬

‫کد اسکی یک کاراکتر با ‪ 3‬رقم در مبنای ‪8‬‬

‫‪\000‬‬

‫کد اسکی یک کاراکتر با ‪ 2‬رقم در مبنای ‪16‬‬

‫‪\x00‬‬

‫‪ 7-4‬ثوابت‬
‫‪‬‬

‫ثوابت رشته ای ‪ C :‬عالوه بر ثوابت فوق‪ ،‬از یك ثابت دیگر بنام رشته نیز‬
‫حمایت می كند‪ .‬رشته‪ ،‬دنباله ای از كاراكترها است كه در داخل " قرار‬
‫می گیرند‪ .‬بعنوان مثال "‪ "this is a test‬یك رشته است‪ .‬دقت كنید كه '‪'a‬‬
‫یك كاراكتر است‪ ،‬اما "‪ "a‬یك رشته است كه فقط شامل یك كاراكتر می‬
‫باشد‪.‬‬

‫‪ 7-5‬عملگرها‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫عملگر‪ ،‬نمادی است كه به كامپایلر می گوید تا عملیات محاسباتی یا‬
‫منطقی خاصی را برروی یك یا چند عملوند‪ ،‬انجام دهد‪.‬‬
‫به عملگرهایی كه فقط یك عملوند دارند‪ ،‬عملگر یكانی می گوییم و‬
‫همواره عملگر در سمت چپ عملوند قرار می گیرد)مانند عدد ‪.(-125‬‬
‫اما عملگرهایی كه برروی دو عملوند اثر می كنند را عملگر دودویی‬
‫نامیده و عملگر را بین دو عملوند قرار می دهیم )مانند ‪.(23+86‬‬
‫هر ترکیب درستی از عملگرها و عملوندها را یک عبارت می نامیم‪.‬‬
‫‪ C‬از نقطه نظر عملگرها یك زبان بسیار قوی است‪ .‬این عملگرها به چند‬
‫دسته اصلی تقسیم می گردند كه آنها را به ترتیب بررسی می كنیم‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫این عملگرها‪ ،‬همان اعمال متداول ریاضی هستند كه در زبان ‪ C‬مورد استفاده‬
‫قرار می گیرند‪ .‬این اعمال عبارتند از ‪:‬‬

‫عمل‬

‫نوع‬

‫عملگر‬

‫منفی كردن عملوند سمت راست‬

‫یكانی‬

‫‪-‬‬

‫جمع دو عملوند‬

‫دودویی‬

‫‪+‬‬

‫تفریق دو عملوند‬

‫دودویی‬

‫‪-‬‬

‫ضرب دو عملوند‬

‫دودویی‬

‫*‬

‫تقسیم دو عملوند‬

‫دودویی‬

‫‪/‬‬

‫محاسبه باقیمانده تقسیم دو عملوند‬

‫دودویی‬

‫‪%‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬
‫‪‬‬

‫این عملگرهای برروی همه انواع داده های ‪ C‬عمل می كنند‪ ،‬بجز عملگر ‪ %‬كه فقط‬
‫برروی نوع داده های صحیح عمل می كند‪.‬‬
‫اما نكته مهمی كه باید به آن اشاره كرد‪ ،‬نحوه كار عملگر تقسیم برروی نوع داده های‬
‫مختلف است‪.‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫درصورتیكه هردو عملوند صحیح باشند‪ ،‬تقسیم بصورت صحیح بر صحیح انجام خواهد شد‪.‬‬
‫اگر یكی یا هر دو عملوند اعشاری باشند‪ ،‬تقسیم بصورت اعشاری انجام خواهد پذیرفت‪.‬‬
‫فرض كنید تعاریف زیر را داریم ‪:‬‬
‫; ‪int a,b‬‬
‫; ‪float c,d‬‬
‫; ‪a = 10 ; b = 4‬‬
‫;‪c = 8.2; d = 4.0‬‬
‫اكنون به نتایج عملیات زیر دقت كنید ‪:‬‬
‫‪a / b => 2‬‬
‫‪c / d => 2.05‬‬
‫‪a / d => 2.5‬‬
‫‪a / 4 => 2‬‬
‫چنانچه به آخرین مورد توجه كنید‪ ،‬متوجه می شوید كه از آنجا كه ‪a‬یك متغیر صحیح است و ‪4‬‬
‫نیز یك ثابت صحیح در نظر گرفته شده‪ ،‬درنتیجه تقسیم بصورت صحیح بر صحیح انجام گرفته‬
‫است‪ .‬چنانچه بخواهیم تقسیم بصورت اعشاری صورت پذیرد‪ ،‬به دو شكل می توانیم عمل‬
‫كنیم‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫برای اینکه عبارت تقسیم صفحه قبل بصورت اعشاری انجام شود‪ ،‬به دو روش‬
‫می توان عمل کرد‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫این عبارت را بصورت ‪ a / 4.0‬بنویسیم‪.‬‬
‫از عملگر قالب ریزی استفاده كنیم‪.‬‬

‫عملگر قالب ریزی می تواند یك نوع را به نوع دیگری تبدیل نماید‪ .‬شكل كلی آن‬
‫به شكل زیر است ‪:‬‬
‫>‪() ‫كه ‪ type‬نوع مورد نظر است كه قصد تبدیل عبارت ‪ expression‬به آن نوع را‬
‫داریم‪ .‬بعنوان مثال در مورد قبلی می توان به شكل زیر عمل كرد ‪:‬‬
‫‪(float) a / 4‬‬
‫در این حالت از كامپایلر خواسته ایم كه ابتدا عدد ‪ a‬را به اعشاری تبدیل كند‬
‫)البته بصورت موقت( و سپس آن را بر ‪ 4‬تقسیم نماید‪ ،‬كه مسلما حاصل‬
‫اعشاری خواهد بود‪.‬‬
‫بطوركلی هرگاه ثابتها و متغیرهایی از انواع مختلف در یك عبارت محاسباتی‬
‫داشته باشیم‪ ،‬كامپایلر ‪ C‬همه آنها را به یك نوع یكسان كه همان بزرگترین‬
‫عملوند موجود است تبدیل خواهد كرد‪ .‬بعنوان مثال به مورد صفحه بعد دقت‬
‫كنید ‪:‬‬

‫ عملگرهای محاسباتی‬7-5-1
char ch;
int i;

float f;
double d;
result = (ch / i)
int

+

(f *d)

(f+i)
float

double

double

int

-

double

double

float

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫اولویت عملگرها ‪ :‬در عبارتی که شامل چندین عملگر است‪ ،‬کدامیک در‬
‫ابتدا اعمال خواهد گردید‪.‬‬
‫اولویت عملگرهای محاسباتی از باال به پایین بشرح زیر است‪:‬‬
‫‪ ‬عملگر یکانی –‬
‫‪ ‬عملگرهای * و ‪ /‬و ‪%‬‬
‫‪ ‬عملگرهای ‪ +‬و –‬
‫چنانچه اولویت دو عملگر یکسان باشد‪ ،‬این عملگرها از چپ به راست‬
‫محاسبه خواهند شد‪.‬‬
‫چنانچه بخواهیم یک عمل با اولویت پایین زودتر انجام شود‪ ،‬باید از پرانتز‬
‫استفاده کنیم‪ .‬بنابراین اولویت عملگر پرانتز از همه موارد فوق‬
‫بیشتراست‪ .‬در مورد پرانتزهای متداخل‪ ،‬ابتدا پرانتز داخلی محاسبه‬
‫می شود؛ اما در مورد پرانتزهای هم سطح‪ ،‬ابتدا پرانتز سمت چپتر‬
‫محاسبه می گردد‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫چند مثال در مورد اولویت عملگرها‬

‫ترتیب اجرای عملگرها‬

‫عبارت زبان ‪C‬‬

‫ابتدا عمل * و سپس عمل ‪+‬‬

‫‪b+c*d‬‬

‫ابتدا عمل ‪ +‬و سپس عمل *‬

‫‪(b + c) * d‬‬

‫ابتدا عمل ‪ /‬سپس عمل * و در انتها عمل ‪+‬‬

‫‪b+c/d*e‬‬

‫ابتدا عمل * سپس عمل ‪ /‬و در انتها عمل ‪+‬‬

‫)‪b + c / (d * e‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫یک مثال کامل در مورد اولویت عملگرها‬

‫‪result = a + b * (f – (g + b) / d) – c * (a – d) / e‬‬
‫‪6‬‬

‫‪1‬‬
‫‪7‬‬

‫‪2‬‬

‫‪8‬‬

‫‪3‬‬
‫‪4‬‬
‫‪5‬‬
‫‪9‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫در زبان ‪ C‬برای انتساب چندین عملگر وجود دارد‪ .‬ساده ترین عملگر انتساب‪ ،‬همان عملگر =‬
‫است که در بسیاری از زبانها استفاده می شود‪ .‬بعنوان مثال ‪:‬‬
‫;‪a = 5‬‬
‫;‪b = c + 2 * d‬‬
‫این عملگر باعث می شود که عبارت سمت راست در عبارت سمت چپ قرار گیرد‪.‬‬
‫توجه کنید که مقدار سمت چپ باید عبارتی باشد که بتوان به آن یک مقدار را نسبت داد‬
‫)مانند یک متغیر( که به آن ‪ Lvalue‬گفته می شود‪ ،‬بنابراین یک ثابت نمی تواند در سمت چپ‬
‫قرار گیرد‪.‬‬
‫نکته دیگر اینکه اولویت عملگر = از عملگرهای ریاضی کمتر است و درنتیجه ابتدا آن عملیات‬
‫انجام شده و در پایان حاصل در عبارت سمت چپ ریخته می شود‪.‬‬
‫الزم به ذکر است که در هنگام انتساب‪ ،‬درصورت لزوم نوع عبارت سمت راست به نوع عبارت‬
‫سمت چپ تبدیل می شود‪ .‬مثال‪:‬‬
‫;‪int a‬‬
‫;‪a = 2.5 * 5.0‬‬
‫که دراینصورت عدد ‪ 12‬در ‪ a‬ذخیره خواهد شد‪.‬‬
‫شرکت پذیری این عملگر از راست به چپ می باشد‪ ،‬بدین معنا که چنانچه چندین عملگر‬
‫نسبت دهی داشته باشیم‪ ،‬این عملگرها از راست به چپ محاسبه می شوند‪ .‬مثال پس از‬
‫اجرای دستور زیر‪ ،‬مقدار هر ‪ 3‬متغیر برابر ‪ 10‬خواهد شد‪.‬‬
‫;‪a = b = c = 10‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬

‫نکته جالب درمورد زبان ‪ C‬آنستکه دارای یک سری عملگرهای انتساب‬
‫خالصه شده است که باعث می شوند در بعضی موارد بتوانیم عبارات‬
‫کوتاهتری را بنویسیم‪ .‬این عملگرها عبارتند از ‪:‬‬
‫عملگرد‬

‫مثال‬

‫عبارت انتساب معادل‬

‫‪++‬‬

‫;‪a ++‬‬

‫;‪a = a + 1‬‬

‫‪--‬‬

‫;‪a --‬‬

‫;‪a = a – 1‬‬

‫=‪+‬‬

‫;‪a += 5‬‬

‫;‪a = a + 5‬‬

‫=‪-‬‬

‫;‪a -= 8‬‬

‫;‪a= a – 8‬‬

‫=*‬

‫;‪a *= 10‬‬

‫;‪a= a * 10‬‬

‫=‪/‬‬

‫;‪a /= 2‬‬

‫;‪a = a / 2‬‬

‫=‪%‬‬

‫;‪a %= 10‬‬

‫;‪a = a % 10‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬
‫‪‬‬

‫عملگر اول و دوم‪ ،‬عملگرهای یکانی هستند که بترتیب عملگر افزایش و عملگر کاهش‬
‫نامیده می شوند‪.‬‬
‫نکته جالب آنستکه این دو عملگر به دوصورت مورد استفاده قرار می گیرند‪.‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫در حالتی که از دستور ;‪ a ++‬استفاده شود به آن پس افزایش می گویند و بدین معناست که‬
‫ابتدا از مقدار فعلی ‪ a‬در عبارت موردنظر استفاده کن و سپس آن را افزایش بده‪.‬‬
‫اما دستور ;‪ ++ a‬که به آن پیش افزایش گفته می شود‪ ،‬ابتدا ‪ a‬را افزایش داده و سپس از آن‬
‫در عبارت استفاده می کند‪.‬‬
‫به برنامه زیر دقت کنید‪:‬‬

‫>‪#include ‫{ )(‪void main‬‬
‫; ‪int a ,b‬‬
‫;‪a=5‬‬
‫;‪b = a ++‬‬
‫;)‪printf(“a=%d and b=%d \n”,a,b‬‬
‫;‪a=5‬‬
‫;‪b = ++ a‬‬
‫;)‪printf(“a=%d and b=%d \n”,a,b‬‬
‫}‬
‫‪a=6 b=5‬‬
‫‪a=6 b=6‬‬

‫‪ 7-5-3‬عملگرهای مقایسه ای‬
‫‪‬‬

‫‪‬‬

‫این عملگرها دو عبارت را بایکدیگر مقایسه کرده و نتیجه را باز می گردانند‪.‬‬
‫نتیجه می تواند درست )‪ (true‬یا غلط )‪ (false‬باشد‪.‬‬
‫نتیجه این عملگرها یک عدد صحیح است که درصورت درست بودن ‪ 1‬و‬
‫درصورت غلط بودن ‪ 0‬باز می گردانند‪ .‬این عملگرها عبارتند از‪:‬‬
‫عملگر‬

‫مفهوم عملگر‬

‫مثال‬

‫<‬

‫بزرگتر )<(‬

‫‪a>b‬‬

‫>‬

‫کوچکتر )>(‬

‫‪a
‫=<‬

‫بزرگتر یا مساوی )≤(‬

‫‪a >= b‬‬

‫=>‬

‫کوچکتر یا مساوی )≥(‬

‫‪a <= b‬‬

‫==‬

‫مساوی )=(‬

‫‪a == b‬‬

‫=!‬

‫نامساوی )≠(‬

‫‪a != b‬‬

‫‪ 7-5-3‬عملگرهای مقایسه ای‬
‫‪‬‬

‫‪‬‬

‫نکته مهمی که باید به آن دقت کرد عملگر مساوی )==( است‪ ،‬چرا که یک‬
‫اشتباه بسیار متداول برنامه نویسان ‪ C‬استفاده اشتباه از عملگر انتساب‬
‫)=( بجای عملگر تساوی )==( است که باعث ایجاد خطا در برنامه می‬
‫شود‪.‬‬
‫اولویت این عملگرها از باال به پایین بشرح زیر است‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫عملگرهای <‪ <= ، > ،‬و =>‬
‫عملگرهای == و =!‬

‫الزم بذکر است که در هنگام مساوی بودن اولویت چند عملگر‪ ،‬این عملگرها‬
‫از چپ به راست محاسبه می گردند‪.‬‬

‫‪ 7-5-4‬عملگرهای منطقی‬
‫‪‬‬

‫این عملگرها به شما اجازه می دهند که شرطهای ساده ای را که با‬
‫استفاده از عملگرهای مقایسه ای ایجاد شده اند را با یکدیگر ترکیب نموده‬
‫و شرطهای پیچیده تری را بسازید‪ .‬این عملگرها عبارتند از ‪:‬‬
‫مثال‬

‫عملگر‬

‫مفهوم عملگر‬

‫نحوه کار‬

‫&&‬

‫‪ AND‬منطقی‬

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

‫‪a>0 && sw==1‬‬

‫||‬

‫‪ OR‬منطقی‬

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

‫‪a<=100 || b!=0‬‬

‫!‬

‫‪ NOT‬منطقی‬

‫اگر عملوند درست باشد‪ ،‬نادرست و‬
‫اگر نادرست باشد‪ ،‬درست برمی‬
‫گرداند‪.‬‬

‫)‪! (a==1 || b<10‬‬

‫‪ 7-5-5‬عملگر شرطی‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫گاهی الزم است که ابتدا یک شرط بررسی شده و سپس برمبنای نتیجه )درست یا نادرست بودن آن( یکی‬
‫از دو عبارت ممکن بازگردانده شود‪ .‬برای اینکار می توان از یک عملگر ‪3‬تایی )با ‪ 3‬عملوند( بنام عملگر‬
‫شرطی استفاده نمود‪.‬‬
‫شکل کلی این عملگر بصورت زیر است‪:‬‬
‫>عبارت‪> :<2‬عبارت‪> ?<1‬شرط<‬
‫نحوه کار بدینصورت است که درصورت درست بودن شرط‪ ،‬عبارت‪ 1‬و در غیراینصورت عبارت ‪ 2‬بازگردانده می‬
‫شود‪.‬‬
‫به عنوان مثال به دستور زیر توجه کنید‪:‬‬
‫که این عبارت معادل دستور زیر است‪:‬‬

‫‪‬‬

‫;‪a = (k<10) ? 100 : 50‬‬
‫;‪if (k<10) a=100‬‬
‫;‪else a=50‬‬

‫البته این عبارت به شکلهای پیچیده نیز می تواند مورد استفاده قرار گیرد‪ .‬مثال ‪:‬‬
‫;‪c += (a>0 && a<10) ? ++a : a/b‬‬
‫که معادل است با ‪:‬‬
‫{ )‪if (a>0 && a<10‬‬
‫;‪a= a + 1‬‬
‫;‪c = c + a‬‬
‫}‬
‫;‪else c = c + a/b‬‬

‫‪ 7-5-6‬اولویت عملگرها‬
‫عملگر‬

‫اولویت‬

‫شرکت پذیری‬

‫‪1‬‬

‫)(‬

‫از چپ به راست‬

‫‪2‬‬

‫‪- + ! -- ++‬‬

‫از راست به چپ‬

‫‪3‬‬

‫‪* / %‬‬

‫از چپ به راست‬

‫‪4‬‬

‫‪+ -‬‬

‫از چپ به راست‬

‫‪5‬‬

‫>> <<‬

‫از چپ به راست‬

‫‪6‬‬

‫>= > <= <‬

‫از چپ به راست‬

‫‪7‬‬

‫=! ==‬

‫از چپ به راست‬

‫‪8‬‬

‫&&‬

‫از چپ به راست‬

‫‪9‬‬

‫||‬

‫از چپ به راست‬

‫‪10‬‬

‫‪?:‬‬

‫از راست به چپ‬

‫‪11‬‬

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

‫از راست به چپ‬

‫‪12‬‬

‫‪,‬‬

‫از چپ به راست‬

‫‪ 7-6‬خواندن و نمایش اطالعات‬
‫‪‬‬

‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫همانطور كه قبال نیز گفته شد‪ ،‬یكی از اهداف زبان ‪ C‬قابل حمل بودن آن‬
‫است‪ .‬بهمین منظور سعی شده است كه از دستوراتی كه ممكن است‬
‫وابسته به ماشین خاصی باشد‪ ،‬اجتناب گردد‪.‬‬
‫بهمین دلیل زبان ‪ C‬برخالف سایر زبانها دارای هیچ دستوری برای‬
‫خواندن از ورودی و یا نوشتن در خروجی نیست‪.‬‬
‫اما در عوض دارای تعدادی تابع )زیربرنامه( استاندارد می باشد كه تقریبا‬
‫تمامی كامپایلرها از آنها حمایت می كنند‪.‬‬
‫این كار به كامپایلر این امكان را می دهد كه بر حسب نوع سخت افزار‬
‫موردنظر‪ ،‬توابع ورودی و خروجی را طراحی نماید‪.‬‬
‫این توابع در یك فایل سرآمد بنام ‪ stdio.h‬تعریف شده اند و بنابراین قبل‬
‫ازاینكه بتوانید از این توابع استفاده نمایید‪ ،‬باید این فایل را نیز با استفاده‬
‫از ‪ #include‬در برنامه خود بگنجانید‪.‬‬

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫برای نمایش اطالعات در خروجی از تابع ‪ printf‬استفاده می شود‪.‬‬
‫این تابع رشته موردنظر شما را به خروجی استاندارد )كه در حالت‬
‫عادی همان صفحه نمایش یا مانیتور است( می فرستد‪ .‬شكل كلی این‬
‫تابع بصورت زیر است‪:‬‬
‫; )>لیست متغیرها< ‪> ,‬رشته كنترلی<(‪printf‬‬
‫رشته كنترلی همان متنی است كه قصد چاپ آن را داریم‪ ،‬با ذكر این‬
‫نكته كه در قسمتهایی كه باید مقدار یك متغیر چاپ شود‪ ،‬از یك‬
‫مشخصه تبدیل استفاده می شود‪ .‬هر مشخصه تبدیل از یك عالمت ‪%‬‬
‫بعالوه یك كاراكتر كه نوع متغیر مورد نظر را نشان می دهد تشكیل می‬
‫گردد‪.‬‬
‫لیست متغیرها نیز همان متغیرهایی هستند كه قصد چاپ آنها را داریم‪.‬‬
‫این متغیرها باید بترتیب قرار گرفته و با كاما )‪ (,‬از یكدیگر جدا شوند‪.‬‬

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫مشخصه تبدیل‬

‫مفهوم‬

‫‪%c‬‬

‫كاراكتر‬

‫‪%d‬‬

‫عدد صحیح در مبنای ‪10‬‬

‫‪%f‬‬

‫عدد اعشاری بدون نماد علمی‬

‫‪%e‬‬

‫عدد اعشاری با نماد علمی‬

‫‪%g‬‬

‫عدد اعشاری با حالت كوتاهتر بین ‪ e‬و ‪f‬‬

‫‪%s‬‬

‫رشته‬

‫‪%ld‬‬

‫عدد صحیح بزرگ‬

‫‪%lf %le %lg‬‬

‫عدد اعشاری بزرگ‬

‫‪%o‬‬

‫عدد صحیح در مبنای ‪8‬‬

‫‪%x‬‬

‫عدد صحیحی در مبنای ‪16‬‬

‫‪%u‬‬

‫عدد صحیح بدون عالمت‬

‫ تابع نمایش در خروجی‬7-6-1
#include
void main() {
int age = 20;
floate average = 18.23;
printf("You are %d years old and your average is %f \n",age,average);
}
You are 20 years old and your average is 18.230000

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫‪‬‬
‫‪‬‬

‫برای کنترل نحوه چاپ اعداد می توانید از مشخصه طول میدان استفاده‬
‫کنید‪.‬‬
‫مشخصه طول میدان برای اعداد به شكل زیر استفاده می شود‪:‬‬
‫‪ ‬برای اعداد صحیح از ‪ %nd‬استفاده می كنیم كه ‪ n‬تعداد ارقام را نشان‬
‫می دهد )مثال ‪ .(%3d‬در اینصورت برای هر متغیر ‪ n‬رقم درنظر گرفته‬
‫می شود‪ .‬اگر اندازه عدد از ‪ n‬كوچكتر باشد‪ ،‬به سمت چپ آن فضای‬
‫خالی اضافه می شود و اگر اندازه عدد بیش از ‪ n‬رقم باشد‪ ،‬طول میدان‬
‫نادیده گرفته شده و عدد بطور كامل چاپ می شود‪.‬‬
‫‪ ‬برای اعداد اعشاری از ‪ %n.mf‬استفاده می كنیم كه ‪ n‬اندازه كل عدد‬
‫)شامل عالمت ممیز( و ‪ m‬تعداد ارقام اعشار است )مثال ‪ .(%5.2f‬در‬
‫صورتیكه تعداد ارقام اعشاری عدد موردنظر از ‪ m‬بیشتر باشد‪ ،‬عدد به ‪m‬‬
‫عدد اعشار گرد می شود و در صورتیكه از ‪ m‬كمتر باشد‪ ،‬در سمت‬
‫راست آن ‪ 0‬قرار داده می شود‪.‬‬

‫‪ 7-6-2‬تابع خواندن از ورودی‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای خواندن اطالعات از ورودی از تابع ‪ scanf‬استفاده می شود‪.‬‬
‫این تابع اطالعات را ازورودی استاندارد )معموال صفحه كلید( خوانده و در‬
‫متغیرهای تعیین شده قرار می دهد‪.‬‬
‫شكل كلی این تابع بصورت زیر است‪:‬‬
‫; )>لیست آدرسهای متغیرها< ‪> ,‬رشته كنترلی<(‪scanf‬‬
‫همانطور كه می بینید نحوه احضار تابع ‪ scanf‬نیز مشابه ‪ printf‬است‪ .‬تنها‬
‫تفاوت در آن است كه در ‪ scanf‬باید لیست آدرسهای متغیرها ارسال شود‪.‬‬
‫مبحث مربوط به آدرسها در فصول بعدی بررسی خواهد شد ولی در حال حاضر‬
‫بخاطر بسپارید كه برای بدست آوردن آدرس یك متغیر از عالمت & استفاده می‬
‫كنیم‪ .‬بعنوان مثال ‪ &age‬بمعنای آدرس متغیر ‪ age‬است‪.‬‬
‫بطور كلی در ‪ C‬قدیمی هرگاه كه یك تابع دارای پارامترهای خروجی بود )یعنی‬
‫پارامترهایی كه یك مقدار را باز می گرداندند( از آدرس متغیرها استفاده می‬
‫شد كه امروزه این مسئله وجود ندارد‪.‬‬

‫ تابع خواندن از ورودی‬7-6-2
#include
void main() {
int age;
float average ;
printf("Please enter your age and average : ");
scanf("%d %f",&age,&average);
printf("You are %d years old and your average is %5.2f \n",age,average);
}

Please enter your age and average : 19 16.72
You are 19 years old and your average is 16.72

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫زبان ‪ C++‬یک زبان شی گرا است‪ ،‬بهمین دلیل در این زبان برای ورودی‬
‫و خروجی از اشیاء بجای توابع استفاده می گردد‪.‬‬
‫از آنجا که امروزه معموال برنامه نویسان ‪ C‬از کامپایلرهای ‪ C++‬استفاده‬
‫می کنند‪ ،‬می توانند از اشیای ورودی و خروجی آن نیز استفاده کنند‪.‬‬
‫اینکار در بین بسیاری از برنامه نویسان ‪ C‬متداول است‪ ،‬بهمین دلیل ما‬
‫در اینجا نحوه کار با اشیای خواندن و نوشتن در ‪ C++‬را بطور مقدماتی‬
‫توضیح می دهیم؛ گرچه توضیح کامل این موارد نیاز به آشنایی با شی‬
‫گرایی و زبان ‪ C++‬دارد‪.‬‬
‫قبل از هرچیز الزم به ذکر است که کلیه اشیای مربوط به ورودی و‬
‫خروجی در فایل سرآمدی بنام ‪ iostream.h‬تعیریف شده اند‪ ،‬بنابراین‬
‫ابتدا باید این فایل به برنامه توسط دستور ‪ #include‬الحاق گردد‪.‬‬

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫زبان ‪ C++‬برای نمایش اطالعات از یک شیئ بنام ‪ cout‬استفاده می نماید‪.‬‬
‫برای ارسال اطالعات مورد نظر برای چاپ به ‪ cout‬باید از عملگر درج در جریان‬
‫یا >> استفاده نماییم‪ .‬بعنوان مثال ‪:‬‬
‫; ” ‪cout >> “Please enter your name:‬‬
‫و یا مثال دیگر ‪:‬‬
‫;‪int a = 10‬‬
‫;‪float b = 2.86‬‬
‫;‪cout << a‬‬
‫;‪cout << b‬‬
‫نکته جالبی که در این مثالها دیده می شود‪ ،‬آنستکه برخالف تابع ‪ printf‬هیچ‬
‫نیازی به مشخص کردن نوع متغیری که قصد چاپ آن را داریم نیست و خود‬
‫شئ ‪ cout‬نوع آن را تشخیص می دهد‪.‬‬
‫عالوه براین می توان چندین عملگر درج در جریان را با یکدیگر الحاق کرد و‬
‫چندین متغیر را با یک دستور چاپ کرد‪.‬‬

C++ ‫ ورودی و خروجی اطالعات در‬7-6-3
#include
void main() {
int age = 20;
floate average = 18.23;
cout >> “You are ” >> age >> “ years old and your average is ” >> average ;
}

You are 20 years old and your average is 18.230000

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای دریافت اطالعات از کاربر‪ ،‬از شئ دیگری بنام ‪ cin‬استفاده می شود‪.‬‬
‫برای ارسال متغیر مورد نظر به ‪ cin‬باید از عملگر استخراج از جریان یا <<‬
‫استفاده نماییم‪ .‬بعنوان مثال‪:‬‬
‫;‪int a‬‬
‫;‪cin >> a‬‬
‫بازهم همانطور که می بینید نیازی به تعیین نوع متغیر موردنظر نیست و خود‬
‫شئ ‪ cin‬نوع متغیر را بطور اتوماتیک تشخیص داده و داده ای از همان نوع را از‬
‫کاربر دریافت و در متغیر مورد نظر قرار می دهد‪.‬‬
‫عملگرهای استخراج از جریان را نیز می توان با یکدیگر الحاق کرد‪.‬‬
‫برای رفتن به خط بعد در شئ ‪ cout‬می توان از دستکاری کننده ‪ endl‬استفاده‬
‫کرد‪ .‬مثال در دستور زیر پس از چاپ پیغام‪ ،‬مکان نما به خط بعد منتقل می‬
‫شود‪:‬‬
‫;‪cout >> “List of students : “ >> endl‬‬
‫البته دستکاری کننده های متعدد دیگری نیز ازجمله موارد مربوط به تعیین طول‬
‫میدان و نحوه چاپ مقادیر وجود دارد که توضیح آنها نیاز به یک مبحث مستقل‬
‫دارد‪.‬‬

C++ ‫ ورودی و خروجی اطالعات در‬7-6-3
#include
void main() {
int age;
float average ;
cout << "Please enter your age and average : " ;
cin >> age >> average ;
cout << "You are " << age << "years old and your average is " << average;
}

Please enter your age and average : 19 16.72
You are 19 years old and your average is 16.72

‫‪ 7-7‬توابع کتابخانه ای‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫همانطور که قبال نیز گفته شد‪ ،‬زبان ‪ C‬از زیر برنامه ها نیز حمایت می کند‪ .‬هر زیر برنامه‬
‫در ‪ C‬یک تابع نامیده می شود‪ .‬تا کنون با توابعی همچون ‪ main‬و یا ‪ printf‬و ‪ scanf‬آشنا‬
‫شده ایم‪.‬‬
‫معموال عرضه کنندگان کامپایلرها و یا سایر فروشندگان نرم افزار‪ ،‬برخی از توابع عمومی‬
‫را که ممکن است مورد نیاز جمع کثیری از برنامه نویسان مختلف باشد را در قالب‬
‫کتابخانه ای از توابع در اختیار برنامه نویسان می گذارند‪ .‬بعضی از این توابع کتابخانه ای‬
‫مانند ‪ printf‬و ‪ scanf‬بصورت استاندارد درآمده و توسط عرضه کنندگان مختلف ارائه می‬
‫شوند‪.‬‬
‫در کامپایلر عرضه شده توسط شرکت بورلند )‪ (Borland C++ 3.1‬نیز کتابخانه های‬
‫متعددی از توابع برای شما عرضه شده اند که بتدریج با آنها و کاربردشان آشنا خواهید‬
‫شد‪.‬‬
‫نکته مهم آنستکه برای استفاده از این توابع ابتدا باید فایل سرآمد مربوط به آنها را نیز در‬
‫ابتدای برنامه خود اضافه نمایید ) با استفاده از ‪ .(#include‬هر فایل سرآمد شامل تعاریف‬
‫اولیه گروهی از توابع مرتبط با هم و داده های مربوط به آنها بوده و در استاندارد قدیمی‬
‫تر دارای پسوند ‪ .h‬می باشد)در استاندارد جدید پسوند این فایلها حذف شده است(‪.‬‬
‫برخی از این فایلهای سرآمد عبارتند از‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪ : stdio.h‬توابع ورودی و خروجی استاندارد‬
‫‪ : math.h‬توابع ریاضی‬
‫‪ : graphics.h‬توابع مربوط به عملیات گرافیکی‬
‫‪ : string.h‬توابع مربوط به کار با رشته ها‬


Slide 13

‫مبانی کامپیوتر و برنامه سازی‬
‫فصل هفتم ‪ :‬مفاهیم اولیه زبان ‪C‬‬
‫مدرس ‪ :‬نگین معروفی‬

‫‪ 7-1‬شناسه ها در ‪C‬‬
‫‪‬‬
‫‪‬‬

‫شناسه )‪ (identifier‬نامی است که به یک قسمت از برنامه مانند متغیر‪ ،‬تابع‪ ،‬ثابت و یا‬
‫‪ ...‬داده می شود‪.‬‬
‫در زبان ‪ C‬برای انتخاب شناسه ها فقط می توان از عالئم زیر استفاده کرد‪:‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫حروف انگلیسی کوچک و بزرگ )‪(A…Z a…z‬‬
‫ارقام )‪(0…9‬‬
‫عالمت خط پایین یا _‬

‫البته یک شناسه نمی تواند با یک رقم شروع شود‪.‬‬
‫چند شناسه مجاز‪ name2 ، average ، sum :‬و ‪student_average‬‬
‫چند شناسه غیرمجاز ‪ 2name‬و یا ‪student average‬‬
‫در برنامه نویسی امروزی پیشنهاد می شود بجای شناسه هایی همانند‬
‫‪ student_average‬از ‪ studentAverage‬استفاده گردد‪.‬‬
‫نکته مهم دیگری که باید به آن اشاره کرد آنستکه زبان ‪ C‬برخالف بسیاری از زبانهای دیگر‬
‫به کوچک و بزرگی حروف حساس است )‪ .(case sensitive‬در نتیجه شناسه های زیر با‬
‫یکدیگر متفاوتند ‪:‬‬
‫‪Sum ≠ sum ≠ SUM‬‬
‫آخرین نکته اینستکه در هنگام انتخاب شناسه نمی توانید از کلمات کلیدی که برای‬
‫منظورهای خاص در زبان ‪ C‬رزرو شده اند استفاده کنید‪.‬‬

C ‫ شناسه ها در‬7-1
: C ‫کلمات کلیدی در زبان‬
auto

break

case

char

const

continue

default

do

double

else

enum

extern

float

for

goto

if

int

long

register

return

short

signed

sizeof

static

struct

switch

typedef

union

unsigned

void

volatile

while

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫محدوده‬

‫اندازه )بیت(‬

‫توضیح‬

‫نوع داده‬

‫‪-128 to +127‬‬

‫‪8‬‬

‫کاراکتر‬

‫‪char‬‬

‫‪-32768 to +32767‬‬

‫‪16‬‬

‫عدد صحیح‬

‫‪int‬‬

‫‪3.4e-38 to 3.4e+38‬‬

‫‪32‬‬

‫عدد اعشاری‬

‫‪float‬‬

‫‪1.7e-308 to 1.7e+308‬‬

‫‪64‬‬

‫عدد اعشاری با‬
‫دقت مضاعف‬

‫‪double‬‬

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫‪‬‬

‫البته چند نکته مهم درمورد این جدول قابل ذکر است ‪:‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫اندازه ‪ int‬در محیطهای ‪ 16‬بیتی مانند ‪ DOS‬برابر ‪ 16‬بیت است‪ .‬اما در‬
‫محیطهای ‪ 32‬بیتی همانند ‪ Windows‬اندازه آن ‪ 32‬بیت می باشد که در‬
‫اینصورت محدوده ای برابر ‪ -2,147,483,648‬تا ‪ +2,147,483,647‬را‬
‫پوشش می دهد‪.‬‬
‫در بعضی از کامپایلرهای ‪ ،C‬نوع داده ‪ bool‬نیز وجود دارد که می تواند‬
‫یکی از مقادیر ‪)true‬درست( یا ‪) false‬غلط( را نشان دهد ‪ .‬اما در نسخه‬
‫های اولیه ‪ C‬از همان نوع داده صحیح یا ‪ int‬برای اینکار استفاده می‬
‫شد‪ .‬بدین صورت که ‪ 0‬نشاندهنده ‪ false‬و هر عدد غیر صفر )معموال ‪(1‬‬
‫نشاندهنده ‪ true‬است‪.‬‬
‫از آنجا که برای ذخیره سازی کاراکترها کد اسکی آنها ذخیره می گردد‪،‬‬
‫از یک متغیر کاراکتری یا ‪ char‬می توان بعنوان یک عدد صحیح کوچک نیز‬
‫استفاده کرد و اعمال ریاضی برروی آنها نیز مجاز است‪.‬‬

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫عالوه براین چندین اصالح کننده نیز وجود دارد که به ما اجازه می دهد نوع داده مورد‬
‫نظر را با دقت بیشتری برای نیازهای مختلف استفاده نماییم‪.‬‬
‫این اصالح کننده ها عبارتند از ‪short, long, signed, unsigned :‬‬
‫تمام این اصالح کننده ها می توانند به نوع داده ‪ int‬اعمال شوند و اثر آنها بستگی‬
‫به محیط دارد‪.‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫در یک محیط ‪16‬بیتی‪short int ،‬بازهم برابر ‪16‬بیت است ولی ‪ long int‬برابر‪32‬بیت می‬
‫باشد‪.‬‬
‫‪ unsigned int‬باعث می شود که یک عدد ‪ 16‬بیتی بدون عالمت داشته باشیم که بازه‬
‫بین ‪ 0‬تا ‪ 65535‬را پوشش می دهد‪ signed int .‬نیز همانند ‪ int‬معمولی بوده و تفاوتی‬
‫ندارد‪.‬‬
‫ترکیب این اصالح کننده ها نیز ممکن است‪ .‬مثال ‪ unsigned long int‬یک عدد ‪ 32‬بیتی‬
‫بدون عالمت است که بازه ‪ 0‬تا ‪ 4,294,967,295‬را پوشش می دهد‪.‬‬

‫برروی نوع داده ‪ char‬فقط اصالح کننده های ‪ signed‬و ‪ unsigned‬را می توان اعمال‬
‫کرد‪ .‬معموال از اصالح کننده ‪ unsigned‬وقتی استفاده می شود که قصد داشته‬
‫باشیم از ‪ char‬بعنوان یک عدد صحیح مثبت بین ‪ 0‬تا ‪ 255‬استفاده کنیم‪.‬‬
‫برروی نوع داده ‪ double‬تنها اصالح کننده ‪ long‬قابل اعمال است و دراینصورت عدد‬
‫اعشاری با ‪ 80‬بیت را خواهیم داشت که قادر است هر عددی در بازه ‪ 3.4e-4932‬تا‬
‫‪ 1.1e+4932‬را در خود نگاه دارد‪.‬‬

‫‪ 7-3‬تعریف متغیرها‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای تعریف متغیرها به شکل زیر عمل می کنیم‪:‬‬

‫;>‪ ‫که ‪ type‬یکی از نوع داده های گفته شده و ‪ variable-list‬لیستی از متغیرها است‬
‫که با کاما از یکدیگر جدا شده اند‪ .‬بعنوان مثال ‪:‬‬
‫;‪int sum‬‬
‫;‪float average‬‬
‫; ‪long int a, b, c‬‬
‫; ‪unsigned long int i, j, k‬‬
‫عالوه براین می توان در هنگام تعریف متغیر به آن مقدار اولیه نیز داد‪ .‬مثال ‪:‬‬
‫; ‪int d = 0‬‬
‫نكته مهم آنكه زبان ‪ C‬به متغیرها مقدار اولیه نمي دهد )حتي ‪ (0‬و برنامه نويس‬
‫خود بايد اينكار را صريحا انجام دهد‪ ،‬درغیر اينصورت مقدار اولیه متغیر‪ ،‬نامعین خواهد‬
‫بود‪.‬‬
‫تعریف متغیرها طبق اصول زبان ‪ C‬میتواند درهرجایی از برنامه صورت پذیرد‪ ،‬و‬
‫متغیرهای تعریف شده از همان خط به بعد قابل استفاده خواهد بود‪ .‬اما معموال‬
‫توصیه می گردد كه تعریف متغیرها در همان خط ابتدایی تابع و بالفاصله پس از {‬
‫صورت پذیرد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫‪‬‬
‫‪‬‬

‫ثابتها مقادیر ثابتی هستند كه مقدار آنها در حین اجرای برنامه تغییر نمی یابد‪ .‬ثابتها می توانند از‬
‫هریك از نوع داده های اصلی باشند‪.‬‬
‫ثوابت عددی صحیح ‪:‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫برای نمایش این دسته از ثوابت‪ ،‬از دنباله ای از ارقام بعالوه عالمت ‪ +‬یا ‪ -‬استفاده می كنیم‪ .‬بعنوان مثال‬
‫‪ -45‬و یا ‪ 3489‬ثوابت صحیح هستند‪.‬‬
‫در حالت عادی ‪ C‬هر عدد را در كوچكترین نوع داده ای كه می تواند قرار می دهد‪ .‬مثال عدد ‪ 85‬در یك‬
‫‪ int‬قرار می گیرد‪ ،‬اما عدد ‪ 145398‬در یك ‪ long int‬قرار خواهد گرفت‪.‬‬
‫اگر قصد دارید یك عدد كوچك بعنوان ‪ long‬محسوب گردد‪ ،‬می توانید از پسوند ‪ L‬در انتهای آن استفاده‬
‫می كنیم‪ .‬مثال ‪245L‬یك عدد ‪ long‬محسوب می شود‪.‬‬
‫;‪long int a = 20L‬‬
‫پسوند ‪ U‬در انتهای عدد نیز نشانه بدون عالمت بودن آن است‪.‬‬
‫نكته دیگر آنكه ‪ C‬به شما اجازه می دهد درصورت لزوم ثوابت صحیح خود را در مبنای ‪ 8‬یا ‪ 16‬نیز كه‬
‫از مبناهای متداول در برنامه نویسی هستند‪ ،‬بنویسید‪.‬‬
‫‪‬‬
‫‪‬‬

‫برای نوشتن عدد در مبنای ‪ 8‬باید آن را با ‪ 0‬آغاز كنید‪ ،‬مثال ‪ 0342‬یك عدد در منای ‪ 8‬محسوب می‬
‫گردد‪.‬‬
‫برای نوشتن یك عدد در مبنای ‪ 16‬باید آن را با ‪ 0x‬آغاز نمایید‪ ،‬مانند ‪.0x27A4‬‬

‫‪ 7-4‬ثوابت‬
‫ثوابت عددی اعشاری‬

‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫برای نمایش اعداد اعشاری‪ ،‬باید از نقطه اعشار استفاده كنیم‪ ،‬مانند ‪237.45‬‬
‫اما نكته جالب آنستكه می توانید از نماد علمی نیز برای نمایش اعداد‬
‫اعشاری استفاده كنید‪ .‬برای اینكار كافی است از حرف ‪ e‬برای نمایش قسمت‬
‫توان استفاده نمایید‪ .‬بعنوان مثال ‪:‬‬
‫‪-23.47 × 10 5 = -23.47e5‬‬
‫‪42.389 × 10 -3 = 42.389e-3‬‬
‫دقت كنید كه قسمت توان‪ ،‬حتما یك عدد صحیح است‪.‬‬
‫نكته جالب اینجاست كه برخالف مورد قبل‪ ،‬كامپایلر بطور پیش فرض داده های‬
‫اعشاری را از نوع ‪ double‬فرض می كند‪.‬چنانچه دوست دارید ثابت شما ازنوع‬
‫‪ float‬درنظر گرفته شود‪ ،‬در انتهای آن ‪ F‬قرار دهید‪ .‬ضمنا پسوند ‪ L‬نیز داده‬
‫اعشاری را از نوع ‪ long double‬درنظر می گیرد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫ثوابت كاراكتری ‪:‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫برای نشان دادن ثوابت كاراكتری‪ ،‬آنها را در داخل ' قرار می دهیم‪ .‬بعنوان مثال‬
‫'‪'A‬یك ثابت كاراكتری است‪.‬‬
‫; '‪char ch = 'S‬‬
‫دقت كنید كه همانطور كه قبال گفته شد‪ ،‬كد اسكی كاراكترها در متغیر ذخیره‬
‫می گردد‪ ،‬بنابراین می توان از آن بعنوان یك عدد صحیح نیز استفاده كرد‪ .‬نكته‬
‫مهم دیگر آنستكه به تفاوت عدد ‪ 5‬و كاراكتر '‪ '5‬دقت داشته باشید‪ .‬در حقیقت‬
‫'‪ '5‬برابر است با عدد ‪ 53‬كه همان كد اسكی آن است‪.‬‬
‫روش فوق‪ ،‬برای نمایش کاراکترهای قابل چاپ مناسب است‪ ،‬اما بعضی‬
‫كاراكترها مانند ‪ enter‬قابل نمایش نبوده و برای آنها شکل خاصی وجود ندارد‪.‬‬
‫در چنین مواردی‪ ،‬زبان ‪ C‬از ترکیب عالمت \ به همراه یک کاراکتر دیگر‪ ،‬برای‬
‫نمایش این قبیل کاراکترها استفاده می نماید‪ .‬بعنوان مثال‪ ،‬کاراکتر '‪ '\n‬نشان‬
‫دهنده خط جدید یا همان ‪ enter‬می باشد‪.‬‬
‫جدول صفحه بعد این قبیل کاراکترها و معادل آنها را نشان می دهد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫نحوه نمایش در ‪C‬‬

‫کد اسکی‬

‫صدای بوق کامپیوتر‬

‫‪\a‬‬

‫‪7‬‬

‫حرکت به عقب ‪backspace‬‬

‫‪\b‬‬

‫‪8‬‬

‫شروع صفحه ‪form feed‬‬

‫‪\f‬‬

‫‪12‬‬

‫سطر جدید ‪line feed‬‬

‫‪\n‬‬

‫‪10‬‬

‫برگشت به ابتداي سطر ‪carriage return‬‬

‫‪\r‬‬

‫‪13‬‬

‫فاصله افقی ‪horizontal tab‬‬

‫‪\t‬‬

‫‪9‬‬

‫فاصله عمودی ‪vertical tab‬‬

‫‪\v‬‬

‫‪11‬‬

‫عالمت سوال‬

‫?\‬

‫‪63‬‬

‫عالمت '‬

‫'\‬

‫‪39‬‬

‫عالمت "‬

‫"\‬

‫‪34‬‬

‫عالمت \‬

‫\\‬

‫‪92‬‬

‫عالمت تهی‬

‫‪\0‬‬

‫‪0‬‬

‫نام کاراکتر‬

‫کد اسکی یک کاراکتر با ‪ 3‬رقم در مبنای ‪8‬‬

‫‪\000‬‬

‫کد اسکی یک کاراکتر با ‪ 2‬رقم در مبنای ‪16‬‬

‫‪\x00‬‬

‫‪ 7-4‬ثوابت‬
‫‪‬‬

‫ثوابت رشته ای ‪ C :‬عالوه بر ثوابت فوق‪ ،‬از یك ثابت دیگر بنام رشته نیز‬
‫حمایت می كند‪ .‬رشته‪ ،‬دنباله ای از كاراكترها است كه در داخل " قرار‬
‫می گیرند‪ .‬بعنوان مثال "‪ "this is a test‬یك رشته است‪ .‬دقت كنید كه '‪'a‬‬
‫یك كاراكتر است‪ ،‬اما "‪ "a‬یك رشته است كه فقط شامل یك كاراكتر می‬
‫باشد‪.‬‬

‫‪ 7-5‬عملگرها‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫عملگر‪ ،‬نمادی است كه به كامپایلر می گوید تا عملیات محاسباتی یا‬
‫منطقی خاصی را برروی یك یا چند عملوند‪ ،‬انجام دهد‪.‬‬
‫به عملگرهایی كه فقط یك عملوند دارند‪ ،‬عملگر یكانی می گوییم و‬
‫همواره عملگر در سمت چپ عملوند قرار می گیرد)مانند عدد ‪.(-125‬‬
‫اما عملگرهایی كه برروی دو عملوند اثر می كنند را عملگر دودویی‬
‫نامیده و عملگر را بین دو عملوند قرار می دهیم )مانند ‪.(23+86‬‬
‫هر ترکیب درستی از عملگرها و عملوندها را یک عبارت می نامیم‪.‬‬
‫‪ C‬از نقطه نظر عملگرها یك زبان بسیار قوی است‪ .‬این عملگرها به چند‬
‫دسته اصلی تقسیم می گردند كه آنها را به ترتیب بررسی می كنیم‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫این عملگرها‪ ،‬همان اعمال متداول ریاضی هستند كه در زبان ‪ C‬مورد استفاده‬
‫قرار می گیرند‪ .‬این اعمال عبارتند از ‪:‬‬

‫عمل‬

‫نوع‬

‫عملگر‬

‫منفی كردن عملوند سمت راست‬

‫یكانی‬

‫‪-‬‬

‫جمع دو عملوند‬

‫دودویی‬

‫‪+‬‬

‫تفریق دو عملوند‬

‫دودویی‬

‫‪-‬‬

‫ضرب دو عملوند‬

‫دودویی‬

‫*‬

‫تقسیم دو عملوند‬

‫دودویی‬

‫‪/‬‬

‫محاسبه باقیمانده تقسیم دو عملوند‬

‫دودویی‬

‫‪%‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬
‫‪‬‬

‫این عملگرهای برروی همه انواع داده های ‪ C‬عمل می كنند‪ ،‬بجز عملگر ‪ %‬كه فقط‬
‫برروی نوع داده های صحیح عمل می كند‪.‬‬
‫اما نكته مهمی كه باید به آن اشاره كرد‪ ،‬نحوه كار عملگر تقسیم برروی نوع داده های‬
‫مختلف است‪.‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫درصورتیكه هردو عملوند صحیح باشند‪ ،‬تقسیم بصورت صحیح بر صحیح انجام خواهد شد‪.‬‬
‫اگر یكی یا هر دو عملوند اعشاری باشند‪ ،‬تقسیم بصورت اعشاری انجام خواهد پذیرفت‪.‬‬
‫فرض كنید تعاریف زیر را داریم ‪:‬‬
‫; ‪int a,b‬‬
‫; ‪float c,d‬‬
‫; ‪a = 10 ; b = 4‬‬
‫;‪c = 8.2; d = 4.0‬‬
‫اكنون به نتایج عملیات زیر دقت كنید ‪:‬‬
‫‪a / b => 2‬‬
‫‪c / d => 2.05‬‬
‫‪a / d => 2.5‬‬
‫‪a / 4 => 2‬‬
‫چنانچه به آخرین مورد توجه كنید‪ ،‬متوجه می شوید كه از آنجا كه ‪a‬یك متغیر صحیح است و ‪4‬‬
‫نیز یك ثابت صحیح در نظر گرفته شده‪ ،‬درنتیجه تقسیم بصورت صحیح بر صحیح انجام گرفته‬
‫است‪ .‬چنانچه بخواهیم تقسیم بصورت اعشاری صورت پذیرد‪ ،‬به دو شكل می توانیم عمل‬
‫كنیم‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫برای اینکه عبارت تقسیم صفحه قبل بصورت اعشاری انجام شود‪ ،‬به دو روش‬
‫می توان عمل کرد‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫این عبارت را بصورت ‪ a / 4.0‬بنویسیم‪.‬‬
‫از عملگر قالب ریزی استفاده كنیم‪.‬‬

‫عملگر قالب ریزی می تواند یك نوع را به نوع دیگری تبدیل نماید‪ .‬شكل كلی آن‬
‫به شكل زیر است ‪:‬‬
‫>‪() ‫كه ‪ type‬نوع مورد نظر است كه قصد تبدیل عبارت ‪ expression‬به آن نوع را‬
‫داریم‪ .‬بعنوان مثال در مورد قبلی می توان به شكل زیر عمل كرد ‪:‬‬
‫‪(float) a / 4‬‬
‫در این حالت از كامپایلر خواسته ایم كه ابتدا عدد ‪ a‬را به اعشاری تبدیل كند‬
‫)البته بصورت موقت( و سپس آن را بر ‪ 4‬تقسیم نماید‪ ،‬كه مسلما حاصل‬
‫اعشاری خواهد بود‪.‬‬
‫بطوركلی هرگاه ثابتها و متغیرهایی از انواع مختلف در یك عبارت محاسباتی‬
‫داشته باشیم‪ ،‬كامپایلر ‪ C‬همه آنها را به یك نوع یكسان كه همان بزرگترین‬
‫عملوند موجود است تبدیل خواهد كرد‪ .‬بعنوان مثال به مورد صفحه بعد دقت‬
‫كنید ‪:‬‬

‫ عملگرهای محاسباتی‬7-5-1
char ch;
int i;

float f;
double d;
result = (ch / i)
int

+

(f *d)

(f+i)
float

double

double

int

-

double

double

float

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫اولویت عملگرها ‪ :‬در عبارتی که شامل چندین عملگر است‪ ،‬کدامیک در‬
‫ابتدا اعمال خواهد گردید‪.‬‬
‫اولویت عملگرهای محاسباتی از باال به پایین بشرح زیر است‪:‬‬
‫‪ ‬عملگر یکانی –‬
‫‪ ‬عملگرهای * و ‪ /‬و ‪%‬‬
‫‪ ‬عملگرهای ‪ +‬و –‬
‫چنانچه اولویت دو عملگر یکسان باشد‪ ،‬این عملگرها از چپ به راست‬
‫محاسبه خواهند شد‪.‬‬
‫چنانچه بخواهیم یک عمل با اولویت پایین زودتر انجام شود‪ ،‬باید از پرانتز‬
‫استفاده کنیم‪ .‬بنابراین اولویت عملگر پرانتز از همه موارد فوق‬
‫بیشتراست‪ .‬در مورد پرانتزهای متداخل‪ ،‬ابتدا پرانتز داخلی محاسبه‬
‫می شود؛ اما در مورد پرانتزهای هم سطح‪ ،‬ابتدا پرانتز سمت چپتر‬
‫محاسبه می گردد‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫چند مثال در مورد اولویت عملگرها‬

‫ترتیب اجرای عملگرها‬

‫عبارت زبان ‪C‬‬

‫ابتدا عمل * و سپس عمل ‪+‬‬

‫‪b+c*d‬‬

‫ابتدا عمل ‪ +‬و سپس عمل *‬

‫‪(b + c) * d‬‬

‫ابتدا عمل ‪ /‬سپس عمل * و در انتها عمل ‪+‬‬

‫‪b+c/d*e‬‬

‫ابتدا عمل * سپس عمل ‪ /‬و در انتها عمل ‪+‬‬

‫)‪b + c / (d * e‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫یک مثال کامل در مورد اولویت عملگرها‬

‫‪result = a + b * (f – (g + b) / d) – c * (a – d) / e‬‬
‫‪6‬‬

‫‪1‬‬
‫‪7‬‬

‫‪2‬‬

‫‪8‬‬

‫‪3‬‬
‫‪4‬‬
‫‪5‬‬
‫‪9‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫در زبان ‪ C‬برای انتساب چندین عملگر وجود دارد‪ .‬ساده ترین عملگر انتساب‪ ،‬همان عملگر =‬
‫است که در بسیاری از زبانها استفاده می شود‪ .‬بعنوان مثال ‪:‬‬
‫;‪a = 5‬‬
‫;‪b = c + 2 * d‬‬
‫این عملگر باعث می شود که عبارت سمت راست در عبارت سمت چپ قرار گیرد‪.‬‬
‫توجه کنید که مقدار سمت چپ باید عبارتی باشد که بتوان به آن یک مقدار را نسبت داد‬
‫)مانند یک متغیر( که به آن ‪ Lvalue‬گفته می شود‪ ،‬بنابراین یک ثابت نمی تواند در سمت چپ‬
‫قرار گیرد‪.‬‬
‫نکته دیگر اینکه اولویت عملگر = از عملگرهای ریاضی کمتر است و درنتیجه ابتدا آن عملیات‬
‫انجام شده و در پایان حاصل در عبارت سمت چپ ریخته می شود‪.‬‬
‫الزم به ذکر است که در هنگام انتساب‪ ،‬درصورت لزوم نوع عبارت سمت راست به نوع عبارت‬
‫سمت چپ تبدیل می شود‪ .‬مثال‪:‬‬
‫;‪int a‬‬
‫;‪a = 2.5 * 5.0‬‬
‫که دراینصورت عدد ‪ 12‬در ‪ a‬ذخیره خواهد شد‪.‬‬
‫شرکت پذیری این عملگر از راست به چپ می باشد‪ ،‬بدین معنا که چنانچه چندین عملگر‬
‫نسبت دهی داشته باشیم‪ ،‬این عملگرها از راست به چپ محاسبه می شوند‪ .‬مثال پس از‬
‫اجرای دستور زیر‪ ،‬مقدار هر ‪ 3‬متغیر برابر ‪ 10‬خواهد شد‪.‬‬
‫;‪a = b = c = 10‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬

‫نکته جالب درمورد زبان ‪ C‬آنستکه دارای یک سری عملگرهای انتساب‬
‫خالصه شده است که باعث می شوند در بعضی موارد بتوانیم عبارات‬
‫کوتاهتری را بنویسیم‪ .‬این عملگرها عبارتند از ‪:‬‬
‫عملگرد‬

‫مثال‬

‫عبارت انتساب معادل‬

‫‪++‬‬

‫;‪a ++‬‬

‫;‪a = a + 1‬‬

‫‪--‬‬

‫;‪a --‬‬

‫;‪a = a – 1‬‬

‫=‪+‬‬

‫;‪a += 5‬‬

‫;‪a = a + 5‬‬

‫=‪-‬‬

‫;‪a -= 8‬‬

‫;‪a= a – 8‬‬

‫=*‬

‫;‪a *= 10‬‬

‫;‪a= a * 10‬‬

‫=‪/‬‬

‫;‪a /= 2‬‬

‫;‪a = a / 2‬‬

‫=‪%‬‬

‫;‪a %= 10‬‬

‫;‪a = a % 10‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬
‫‪‬‬

‫عملگر اول و دوم‪ ،‬عملگرهای یکانی هستند که بترتیب عملگر افزایش و عملگر کاهش‬
‫نامیده می شوند‪.‬‬
‫نکته جالب آنستکه این دو عملگر به دوصورت مورد استفاده قرار می گیرند‪.‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫در حالتی که از دستور ;‪ a ++‬استفاده شود به آن پس افزایش می گویند و بدین معناست که‬
‫ابتدا از مقدار فعلی ‪ a‬در عبارت موردنظر استفاده کن و سپس آن را افزایش بده‪.‬‬
‫اما دستور ;‪ ++ a‬که به آن پیش افزایش گفته می شود‪ ،‬ابتدا ‪ a‬را افزایش داده و سپس از آن‬
‫در عبارت استفاده می کند‪.‬‬
‫به برنامه زیر دقت کنید‪:‬‬

‫>‪#include ‫{ )(‪void main‬‬
‫; ‪int a ,b‬‬
‫;‪a=5‬‬
‫;‪b = a ++‬‬
‫;)‪printf(“a=%d and b=%d \n”,a,b‬‬
‫;‪a=5‬‬
‫;‪b = ++ a‬‬
‫;)‪printf(“a=%d and b=%d \n”,a,b‬‬
‫}‬
‫‪a=6 b=5‬‬
‫‪a=6 b=6‬‬

‫‪ 7-5-3‬عملگرهای مقایسه ای‬
‫‪‬‬

‫‪‬‬

‫این عملگرها دو عبارت را بایکدیگر مقایسه کرده و نتیجه را باز می گردانند‪.‬‬
‫نتیجه می تواند درست )‪ (true‬یا غلط )‪ (false‬باشد‪.‬‬
‫نتیجه این عملگرها یک عدد صحیح است که درصورت درست بودن ‪ 1‬و‬
‫درصورت غلط بودن ‪ 0‬باز می گردانند‪ .‬این عملگرها عبارتند از‪:‬‬
‫عملگر‬

‫مفهوم عملگر‬

‫مثال‬

‫<‬

‫بزرگتر )<(‬

‫‪a>b‬‬

‫>‬

‫کوچکتر )>(‬

‫‪a
‫=<‬

‫بزرگتر یا مساوی )≤(‬

‫‪a >= b‬‬

‫=>‬

‫کوچکتر یا مساوی )≥(‬

‫‪a <= b‬‬

‫==‬

‫مساوی )=(‬

‫‪a == b‬‬

‫=!‬

‫نامساوی )≠(‬

‫‪a != b‬‬

‫‪ 7-5-3‬عملگرهای مقایسه ای‬
‫‪‬‬

‫‪‬‬

‫نکته مهمی که باید به آن دقت کرد عملگر مساوی )==( است‪ ،‬چرا که یک‬
‫اشتباه بسیار متداول برنامه نویسان ‪ C‬استفاده اشتباه از عملگر انتساب‬
‫)=( بجای عملگر تساوی )==( است که باعث ایجاد خطا در برنامه می‬
‫شود‪.‬‬
‫اولویت این عملگرها از باال به پایین بشرح زیر است‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫عملگرهای <‪ <= ، > ،‬و =>‬
‫عملگرهای == و =!‬

‫الزم بذکر است که در هنگام مساوی بودن اولویت چند عملگر‪ ،‬این عملگرها‬
‫از چپ به راست محاسبه می گردند‪.‬‬

‫‪ 7-5-4‬عملگرهای منطقی‬
‫‪‬‬

‫این عملگرها به شما اجازه می دهند که شرطهای ساده ای را که با‬
‫استفاده از عملگرهای مقایسه ای ایجاد شده اند را با یکدیگر ترکیب نموده‬
‫و شرطهای پیچیده تری را بسازید‪ .‬این عملگرها عبارتند از ‪:‬‬
‫مثال‬

‫عملگر‬

‫مفهوم عملگر‬

‫نحوه کار‬

‫&&‬

‫‪ AND‬منطقی‬

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

‫‪a>0 && sw==1‬‬

‫||‬

‫‪ OR‬منطقی‬

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

‫‪a<=100 || b!=0‬‬

‫!‬

‫‪ NOT‬منطقی‬

‫اگر عملوند درست باشد‪ ،‬نادرست و‬
‫اگر نادرست باشد‪ ،‬درست برمی‬
‫گرداند‪.‬‬

‫)‪! (a==1 || b<10‬‬

‫‪ 7-5-5‬عملگر شرطی‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫گاهی الزم است که ابتدا یک شرط بررسی شده و سپس برمبنای نتیجه )درست یا نادرست بودن آن( یکی‬
‫از دو عبارت ممکن بازگردانده شود‪ .‬برای اینکار می توان از یک عملگر ‪3‬تایی )با ‪ 3‬عملوند( بنام عملگر‬
‫شرطی استفاده نمود‪.‬‬
‫شکل کلی این عملگر بصورت زیر است‪:‬‬
‫>عبارت‪> :<2‬عبارت‪> ?<1‬شرط<‬
‫نحوه کار بدینصورت است که درصورت درست بودن شرط‪ ،‬عبارت‪ 1‬و در غیراینصورت عبارت ‪ 2‬بازگردانده می‬
‫شود‪.‬‬
‫به عنوان مثال به دستور زیر توجه کنید‪:‬‬
‫که این عبارت معادل دستور زیر است‪:‬‬

‫‪‬‬

‫;‪a = (k<10) ? 100 : 50‬‬
‫;‪if (k<10) a=100‬‬
‫;‪else a=50‬‬

‫البته این عبارت به شکلهای پیچیده نیز می تواند مورد استفاده قرار گیرد‪ .‬مثال ‪:‬‬
‫;‪c += (a>0 && a<10) ? ++a : a/b‬‬
‫که معادل است با ‪:‬‬
‫{ )‪if (a>0 && a<10‬‬
‫;‪a= a + 1‬‬
‫;‪c = c + a‬‬
‫}‬
‫;‪else c = c + a/b‬‬

‫‪ 7-5-6‬اولویت عملگرها‬
‫عملگر‬

‫اولویت‬

‫شرکت پذیری‬

‫‪1‬‬

‫)(‬

‫از چپ به راست‬

‫‪2‬‬

‫‪- + ! -- ++‬‬

‫از راست به چپ‬

‫‪3‬‬

‫‪* / %‬‬

‫از چپ به راست‬

‫‪4‬‬

‫‪+ -‬‬

‫از چپ به راست‬

‫‪5‬‬

‫>> <<‬

‫از چپ به راست‬

‫‪6‬‬

‫>= > <= <‬

‫از چپ به راست‬

‫‪7‬‬

‫=! ==‬

‫از چپ به راست‬

‫‪8‬‬

‫&&‬

‫از چپ به راست‬

‫‪9‬‬

‫||‬

‫از چپ به راست‬

‫‪10‬‬

‫‪?:‬‬

‫از راست به چپ‬

‫‪11‬‬

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

‫از راست به چپ‬

‫‪12‬‬

‫‪,‬‬

‫از چپ به راست‬

‫‪ 7-6‬خواندن و نمایش اطالعات‬
‫‪‬‬

‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫همانطور كه قبال نیز گفته شد‪ ،‬یكی از اهداف زبان ‪ C‬قابل حمل بودن آن‬
‫است‪ .‬بهمین منظور سعی شده است كه از دستوراتی كه ممكن است‬
‫وابسته به ماشین خاصی باشد‪ ،‬اجتناب گردد‪.‬‬
‫بهمین دلیل زبان ‪ C‬برخالف سایر زبانها دارای هیچ دستوری برای‬
‫خواندن از ورودی و یا نوشتن در خروجی نیست‪.‬‬
‫اما در عوض دارای تعدادی تابع )زیربرنامه( استاندارد می باشد كه تقریبا‬
‫تمامی كامپایلرها از آنها حمایت می كنند‪.‬‬
‫این كار به كامپایلر این امكان را می دهد كه بر حسب نوع سخت افزار‬
‫موردنظر‪ ،‬توابع ورودی و خروجی را طراحی نماید‪.‬‬
‫این توابع در یك فایل سرآمد بنام ‪ stdio.h‬تعریف شده اند و بنابراین قبل‬
‫ازاینكه بتوانید از این توابع استفاده نمایید‪ ،‬باید این فایل را نیز با استفاده‬
‫از ‪ #include‬در برنامه خود بگنجانید‪.‬‬

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫برای نمایش اطالعات در خروجی از تابع ‪ printf‬استفاده می شود‪.‬‬
‫این تابع رشته موردنظر شما را به خروجی استاندارد )كه در حالت‬
‫عادی همان صفحه نمایش یا مانیتور است( می فرستد‪ .‬شكل كلی این‬
‫تابع بصورت زیر است‪:‬‬
‫; )>لیست متغیرها< ‪> ,‬رشته كنترلی<(‪printf‬‬
‫رشته كنترلی همان متنی است كه قصد چاپ آن را داریم‪ ،‬با ذكر این‬
‫نكته كه در قسمتهایی كه باید مقدار یك متغیر چاپ شود‪ ،‬از یك‬
‫مشخصه تبدیل استفاده می شود‪ .‬هر مشخصه تبدیل از یك عالمت ‪%‬‬
‫بعالوه یك كاراكتر كه نوع متغیر مورد نظر را نشان می دهد تشكیل می‬
‫گردد‪.‬‬
‫لیست متغیرها نیز همان متغیرهایی هستند كه قصد چاپ آنها را داریم‪.‬‬
‫این متغیرها باید بترتیب قرار گرفته و با كاما )‪ (,‬از یكدیگر جدا شوند‪.‬‬

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫مشخصه تبدیل‬

‫مفهوم‬

‫‪%c‬‬

‫كاراكتر‬

‫‪%d‬‬

‫عدد صحیح در مبنای ‪10‬‬

‫‪%f‬‬

‫عدد اعشاری بدون نماد علمی‬

‫‪%e‬‬

‫عدد اعشاری با نماد علمی‬

‫‪%g‬‬

‫عدد اعشاری با حالت كوتاهتر بین ‪ e‬و ‪f‬‬

‫‪%s‬‬

‫رشته‬

‫‪%ld‬‬

‫عدد صحیح بزرگ‬

‫‪%lf %le %lg‬‬

‫عدد اعشاری بزرگ‬

‫‪%o‬‬

‫عدد صحیح در مبنای ‪8‬‬

‫‪%x‬‬

‫عدد صحیحی در مبنای ‪16‬‬

‫‪%u‬‬

‫عدد صحیح بدون عالمت‬

‫ تابع نمایش در خروجی‬7-6-1
#include
void main() {
int age = 20;
floate average = 18.23;
printf("You are %d years old and your average is %f \n",age,average);
}
You are 20 years old and your average is 18.230000

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫‪‬‬
‫‪‬‬

‫برای کنترل نحوه چاپ اعداد می توانید از مشخصه طول میدان استفاده‬
‫کنید‪.‬‬
‫مشخصه طول میدان برای اعداد به شكل زیر استفاده می شود‪:‬‬
‫‪ ‬برای اعداد صحیح از ‪ %nd‬استفاده می كنیم كه ‪ n‬تعداد ارقام را نشان‬
‫می دهد )مثال ‪ .(%3d‬در اینصورت برای هر متغیر ‪ n‬رقم درنظر گرفته‬
‫می شود‪ .‬اگر اندازه عدد از ‪ n‬كوچكتر باشد‪ ،‬به سمت چپ آن فضای‬
‫خالی اضافه می شود و اگر اندازه عدد بیش از ‪ n‬رقم باشد‪ ،‬طول میدان‬
‫نادیده گرفته شده و عدد بطور كامل چاپ می شود‪.‬‬
‫‪ ‬برای اعداد اعشاری از ‪ %n.mf‬استفاده می كنیم كه ‪ n‬اندازه كل عدد‬
‫)شامل عالمت ممیز( و ‪ m‬تعداد ارقام اعشار است )مثال ‪ .(%5.2f‬در‬
‫صورتیكه تعداد ارقام اعشاری عدد موردنظر از ‪ m‬بیشتر باشد‪ ،‬عدد به ‪m‬‬
‫عدد اعشار گرد می شود و در صورتیكه از ‪ m‬كمتر باشد‪ ،‬در سمت‬
‫راست آن ‪ 0‬قرار داده می شود‪.‬‬

‫‪ 7-6-2‬تابع خواندن از ورودی‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای خواندن اطالعات از ورودی از تابع ‪ scanf‬استفاده می شود‪.‬‬
‫این تابع اطالعات را ازورودی استاندارد )معموال صفحه كلید( خوانده و در‬
‫متغیرهای تعیین شده قرار می دهد‪.‬‬
‫شكل كلی این تابع بصورت زیر است‪:‬‬
‫; )>لیست آدرسهای متغیرها< ‪> ,‬رشته كنترلی<(‪scanf‬‬
‫همانطور كه می بینید نحوه احضار تابع ‪ scanf‬نیز مشابه ‪ printf‬است‪ .‬تنها‬
‫تفاوت در آن است كه در ‪ scanf‬باید لیست آدرسهای متغیرها ارسال شود‪.‬‬
‫مبحث مربوط به آدرسها در فصول بعدی بررسی خواهد شد ولی در حال حاضر‬
‫بخاطر بسپارید كه برای بدست آوردن آدرس یك متغیر از عالمت & استفاده می‬
‫كنیم‪ .‬بعنوان مثال ‪ &age‬بمعنای آدرس متغیر ‪ age‬است‪.‬‬
‫بطور كلی در ‪ C‬قدیمی هرگاه كه یك تابع دارای پارامترهای خروجی بود )یعنی‬
‫پارامترهایی كه یك مقدار را باز می گرداندند( از آدرس متغیرها استفاده می‬
‫شد كه امروزه این مسئله وجود ندارد‪.‬‬

‫ تابع خواندن از ورودی‬7-6-2
#include
void main() {
int age;
float average ;
printf("Please enter your age and average : ");
scanf("%d %f",&age,&average);
printf("You are %d years old and your average is %5.2f \n",age,average);
}

Please enter your age and average : 19 16.72
You are 19 years old and your average is 16.72

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫زبان ‪ C++‬یک زبان شی گرا است‪ ،‬بهمین دلیل در این زبان برای ورودی‬
‫و خروجی از اشیاء بجای توابع استفاده می گردد‪.‬‬
‫از آنجا که امروزه معموال برنامه نویسان ‪ C‬از کامپایلرهای ‪ C++‬استفاده‬
‫می کنند‪ ،‬می توانند از اشیای ورودی و خروجی آن نیز استفاده کنند‪.‬‬
‫اینکار در بین بسیاری از برنامه نویسان ‪ C‬متداول است‪ ،‬بهمین دلیل ما‬
‫در اینجا نحوه کار با اشیای خواندن و نوشتن در ‪ C++‬را بطور مقدماتی‬
‫توضیح می دهیم؛ گرچه توضیح کامل این موارد نیاز به آشنایی با شی‬
‫گرایی و زبان ‪ C++‬دارد‪.‬‬
‫قبل از هرچیز الزم به ذکر است که کلیه اشیای مربوط به ورودی و‬
‫خروجی در فایل سرآمدی بنام ‪ iostream.h‬تعیریف شده اند‪ ،‬بنابراین‬
‫ابتدا باید این فایل به برنامه توسط دستور ‪ #include‬الحاق گردد‪.‬‬

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫زبان ‪ C++‬برای نمایش اطالعات از یک شیئ بنام ‪ cout‬استفاده می نماید‪.‬‬
‫برای ارسال اطالعات مورد نظر برای چاپ به ‪ cout‬باید از عملگر درج در جریان‬
‫یا >> استفاده نماییم‪ .‬بعنوان مثال ‪:‬‬
‫; ” ‪cout >> “Please enter your name:‬‬
‫و یا مثال دیگر ‪:‬‬
‫;‪int a = 10‬‬
‫;‪float b = 2.86‬‬
‫;‪cout << a‬‬
‫;‪cout << b‬‬
‫نکته جالبی که در این مثالها دیده می شود‪ ،‬آنستکه برخالف تابع ‪ printf‬هیچ‬
‫نیازی به مشخص کردن نوع متغیری که قصد چاپ آن را داریم نیست و خود‬
‫شئ ‪ cout‬نوع آن را تشخیص می دهد‪.‬‬
‫عالوه براین می توان چندین عملگر درج در جریان را با یکدیگر الحاق کرد و‬
‫چندین متغیر را با یک دستور چاپ کرد‪.‬‬

C++ ‫ ورودی و خروجی اطالعات در‬7-6-3
#include
void main() {
int age = 20;
floate average = 18.23;
cout >> “You are ” >> age >> “ years old and your average is ” >> average ;
}

You are 20 years old and your average is 18.230000

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای دریافت اطالعات از کاربر‪ ،‬از شئ دیگری بنام ‪ cin‬استفاده می شود‪.‬‬
‫برای ارسال متغیر مورد نظر به ‪ cin‬باید از عملگر استخراج از جریان یا <<‬
‫استفاده نماییم‪ .‬بعنوان مثال‪:‬‬
‫;‪int a‬‬
‫;‪cin >> a‬‬
‫بازهم همانطور که می بینید نیازی به تعیین نوع متغیر موردنظر نیست و خود‬
‫شئ ‪ cin‬نوع متغیر را بطور اتوماتیک تشخیص داده و داده ای از همان نوع را از‬
‫کاربر دریافت و در متغیر مورد نظر قرار می دهد‪.‬‬
‫عملگرهای استخراج از جریان را نیز می توان با یکدیگر الحاق کرد‪.‬‬
‫برای رفتن به خط بعد در شئ ‪ cout‬می توان از دستکاری کننده ‪ endl‬استفاده‬
‫کرد‪ .‬مثال در دستور زیر پس از چاپ پیغام‪ ،‬مکان نما به خط بعد منتقل می‬
‫شود‪:‬‬
‫;‪cout >> “List of students : “ >> endl‬‬
‫البته دستکاری کننده های متعدد دیگری نیز ازجمله موارد مربوط به تعیین طول‬
‫میدان و نحوه چاپ مقادیر وجود دارد که توضیح آنها نیاز به یک مبحث مستقل‬
‫دارد‪.‬‬

C++ ‫ ورودی و خروجی اطالعات در‬7-6-3
#include
void main() {
int age;
float average ;
cout << "Please enter your age and average : " ;
cin >> age >> average ;
cout << "You are " << age << "years old and your average is " << average;
}

Please enter your age and average : 19 16.72
You are 19 years old and your average is 16.72

‫‪ 7-7‬توابع کتابخانه ای‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫همانطور که قبال نیز گفته شد‪ ،‬زبان ‪ C‬از زیر برنامه ها نیز حمایت می کند‪ .‬هر زیر برنامه‬
‫در ‪ C‬یک تابع نامیده می شود‪ .‬تا کنون با توابعی همچون ‪ main‬و یا ‪ printf‬و ‪ scanf‬آشنا‬
‫شده ایم‪.‬‬
‫معموال عرضه کنندگان کامپایلرها و یا سایر فروشندگان نرم افزار‪ ،‬برخی از توابع عمومی‬
‫را که ممکن است مورد نیاز جمع کثیری از برنامه نویسان مختلف باشد را در قالب‬
‫کتابخانه ای از توابع در اختیار برنامه نویسان می گذارند‪ .‬بعضی از این توابع کتابخانه ای‬
‫مانند ‪ printf‬و ‪ scanf‬بصورت استاندارد درآمده و توسط عرضه کنندگان مختلف ارائه می‬
‫شوند‪.‬‬
‫در کامپایلر عرضه شده توسط شرکت بورلند )‪ (Borland C++ 3.1‬نیز کتابخانه های‬
‫متعددی از توابع برای شما عرضه شده اند که بتدریج با آنها و کاربردشان آشنا خواهید‬
‫شد‪.‬‬
‫نکته مهم آنستکه برای استفاده از این توابع ابتدا باید فایل سرآمد مربوط به آنها را نیز در‬
‫ابتدای برنامه خود اضافه نمایید ) با استفاده از ‪ .(#include‬هر فایل سرآمد شامل تعاریف‬
‫اولیه گروهی از توابع مرتبط با هم و داده های مربوط به آنها بوده و در استاندارد قدیمی‬
‫تر دارای پسوند ‪ .h‬می باشد)در استاندارد جدید پسوند این فایلها حذف شده است(‪.‬‬
‫برخی از این فایلهای سرآمد عبارتند از‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪ : stdio.h‬توابع ورودی و خروجی استاندارد‬
‫‪ : math.h‬توابع ریاضی‬
‫‪ : graphics.h‬توابع مربوط به عملیات گرافیکی‬
‫‪ : string.h‬توابع مربوط به کار با رشته ها‬


Slide 14

‫مبانی کامپیوتر و برنامه سازی‬
‫فصل هفتم ‪ :‬مفاهیم اولیه زبان ‪C‬‬
‫مدرس ‪ :‬نگین معروفی‬

‫‪ 7-1‬شناسه ها در ‪C‬‬
‫‪‬‬
‫‪‬‬

‫شناسه )‪ (identifier‬نامی است که به یک قسمت از برنامه مانند متغیر‪ ،‬تابع‪ ،‬ثابت و یا‬
‫‪ ...‬داده می شود‪.‬‬
‫در زبان ‪ C‬برای انتخاب شناسه ها فقط می توان از عالئم زیر استفاده کرد‪:‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫حروف انگلیسی کوچک و بزرگ )‪(A…Z a…z‬‬
‫ارقام )‪(0…9‬‬
‫عالمت خط پایین یا _‬

‫البته یک شناسه نمی تواند با یک رقم شروع شود‪.‬‬
‫چند شناسه مجاز‪ name2 ، average ، sum :‬و ‪student_average‬‬
‫چند شناسه غیرمجاز ‪ 2name‬و یا ‪student average‬‬
‫در برنامه نویسی امروزی پیشنهاد می شود بجای شناسه هایی همانند‬
‫‪ student_average‬از ‪ studentAverage‬استفاده گردد‪.‬‬
‫نکته مهم دیگری که باید به آن اشاره کرد آنستکه زبان ‪ C‬برخالف بسیاری از زبانهای دیگر‬
‫به کوچک و بزرگی حروف حساس است )‪ .(case sensitive‬در نتیجه شناسه های زیر با‬
‫یکدیگر متفاوتند ‪:‬‬
‫‪Sum ≠ sum ≠ SUM‬‬
‫آخرین نکته اینستکه در هنگام انتخاب شناسه نمی توانید از کلمات کلیدی که برای‬
‫منظورهای خاص در زبان ‪ C‬رزرو شده اند استفاده کنید‪.‬‬

C ‫ شناسه ها در‬7-1
: C ‫کلمات کلیدی در زبان‬
auto

break

case

char

const

continue

default

do

double

else

enum

extern

float

for

goto

if

int

long

register

return

short

signed

sizeof

static

struct

switch

typedef

union

unsigned

void

volatile

while

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫محدوده‬

‫اندازه )بیت(‬

‫توضیح‬

‫نوع داده‬

‫‪-128 to +127‬‬

‫‪8‬‬

‫کاراکتر‬

‫‪char‬‬

‫‪-32768 to +32767‬‬

‫‪16‬‬

‫عدد صحیح‬

‫‪int‬‬

‫‪3.4e-38 to 3.4e+38‬‬

‫‪32‬‬

‫عدد اعشاری‬

‫‪float‬‬

‫‪1.7e-308 to 1.7e+308‬‬

‫‪64‬‬

‫عدد اعشاری با‬
‫دقت مضاعف‬

‫‪double‬‬

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫‪‬‬

‫البته چند نکته مهم درمورد این جدول قابل ذکر است ‪:‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫اندازه ‪ int‬در محیطهای ‪ 16‬بیتی مانند ‪ DOS‬برابر ‪ 16‬بیت است‪ .‬اما در‬
‫محیطهای ‪ 32‬بیتی همانند ‪ Windows‬اندازه آن ‪ 32‬بیت می باشد که در‬
‫اینصورت محدوده ای برابر ‪ -2,147,483,648‬تا ‪ +2,147,483,647‬را‬
‫پوشش می دهد‪.‬‬
‫در بعضی از کامپایلرهای ‪ ،C‬نوع داده ‪ bool‬نیز وجود دارد که می تواند‬
‫یکی از مقادیر ‪)true‬درست( یا ‪) false‬غلط( را نشان دهد ‪ .‬اما در نسخه‬
‫های اولیه ‪ C‬از همان نوع داده صحیح یا ‪ int‬برای اینکار استفاده می‬
‫شد‪ .‬بدین صورت که ‪ 0‬نشاندهنده ‪ false‬و هر عدد غیر صفر )معموال ‪(1‬‬
‫نشاندهنده ‪ true‬است‪.‬‬
‫از آنجا که برای ذخیره سازی کاراکترها کد اسکی آنها ذخیره می گردد‪،‬‬
‫از یک متغیر کاراکتری یا ‪ char‬می توان بعنوان یک عدد صحیح کوچک نیز‬
‫استفاده کرد و اعمال ریاضی برروی آنها نیز مجاز است‪.‬‬

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫عالوه براین چندین اصالح کننده نیز وجود دارد که به ما اجازه می دهد نوع داده مورد‬
‫نظر را با دقت بیشتری برای نیازهای مختلف استفاده نماییم‪.‬‬
‫این اصالح کننده ها عبارتند از ‪short, long, signed, unsigned :‬‬
‫تمام این اصالح کننده ها می توانند به نوع داده ‪ int‬اعمال شوند و اثر آنها بستگی‬
‫به محیط دارد‪.‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫در یک محیط ‪16‬بیتی‪short int ،‬بازهم برابر ‪16‬بیت است ولی ‪ long int‬برابر‪32‬بیت می‬
‫باشد‪.‬‬
‫‪ unsigned int‬باعث می شود که یک عدد ‪ 16‬بیتی بدون عالمت داشته باشیم که بازه‬
‫بین ‪ 0‬تا ‪ 65535‬را پوشش می دهد‪ signed int .‬نیز همانند ‪ int‬معمولی بوده و تفاوتی‬
‫ندارد‪.‬‬
‫ترکیب این اصالح کننده ها نیز ممکن است‪ .‬مثال ‪ unsigned long int‬یک عدد ‪ 32‬بیتی‬
‫بدون عالمت است که بازه ‪ 0‬تا ‪ 4,294,967,295‬را پوشش می دهد‪.‬‬

‫برروی نوع داده ‪ char‬فقط اصالح کننده های ‪ signed‬و ‪ unsigned‬را می توان اعمال‬
‫کرد‪ .‬معموال از اصالح کننده ‪ unsigned‬وقتی استفاده می شود که قصد داشته‬
‫باشیم از ‪ char‬بعنوان یک عدد صحیح مثبت بین ‪ 0‬تا ‪ 255‬استفاده کنیم‪.‬‬
‫برروی نوع داده ‪ double‬تنها اصالح کننده ‪ long‬قابل اعمال است و دراینصورت عدد‬
‫اعشاری با ‪ 80‬بیت را خواهیم داشت که قادر است هر عددی در بازه ‪ 3.4e-4932‬تا‬
‫‪ 1.1e+4932‬را در خود نگاه دارد‪.‬‬

‫‪ 7-3‬تعریف متغیرها‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای تعریف متغیرها به شکل زیر عمل می کنیم‪:‬‬

‫;>‪ ‫که ‪ type‬یکی از نوع داده های گفته شده و ‪ variable-list‬لیستی از متغیرها است‬
‫که با کاما از یکدیگر جدا شده اند‪ .‬بعنوان مثال ‪:‬‬
‫;‪int sum‬‬
‫;‪float average‬‬
‫; ‪long int a, b, c‬‬
‫; ‪unsigned long int i, j, k‬‬
‫عالوه براین می توان در هنگام تعریف متغیر به آن مقدار اولیه نیز داد‪ .‬مثال ‪:‬‬
‫; ‪int d = 0‬‬
‫نكته مهم آنكه زبان ‪ C‬به متغیرها مقدار اولیه نمي دهد )حتي ‪ (0‬و برنامه نويس‬
‫خود بايد اينكار را صريحا انجام دهد‪ ،‬درغیر اينصورت مقدار اولیه متغیر‪ ،‬نامعین خواهد‬
‫بود‪.‬‬
‫تعریف متغیرها طبق اصول زبان ‪ C‬میتواند درهرجایی از برنامه صورت پذیرد‪ ،‬و‬
‫متغیرهای تعریف شده از همان خط به بعد قابل استفاده خواهد بود‪ .‬اما معموال‬
‫توصیه می گردد كه تعریف متغیرها در همان خط ابتدایی تابع و بالفاصله پس از {‬
‫صورت پذیرد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫‪‬‬
‫‪‬‬

‫ثابتها مقادیر ثابتی هستند كه مقدار آنها در حین اجرای برنامه تغییر نمی یابد‪ .‬ثابتها می توانند از‬
‫هریك از نوع داده های اصلی باشند‪.‬‬
‫ثوابت عددی صحیح ‪:‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫برای نمایش این دسته از ثوابت‪ ،‬از دنباله ای از ارقام بعالوه عالمت ‪ +‬یا ‪ -‬استفاده می كنیم‪ .‬بعنوان مثال‬
‫‪ -45‬و یا ‪ 3489‬ثوابت صحیح هستند‪.‬‬
‫در حالت عادی ‪ C‬هر عدد را در كوچكترین نوع داده ای كه می تواند قرار می دهد‪ .‬مثال عدد ‪ 85‬در یك‬
‫‪ int‬قرار می گیرد‪ ،‬اما عدد ‪ 145398‬در یك ‪ long int‬قرار خواهد گرفت‪.‬‬
‫اگر قصد دارید یك عدد كوچك بعنوان ‪ long‬محسوب گردد‪ ،‬می توانید از پسوند ‪ L‬در انتهای آن استفاده‬
‫می كنیم‪ .‬مثال ‪245L‬یك عدد ‪ long‬محسوب می شود‪.‬‬
‫;‪long int a = 20L‬‬
‫پسوند ‪ U‬در انتهای عدد نیز نشانه بدون عالمت بودن آن است‪.‬‬
‫نكته دیگر آنكه ‪ C‬به شما اجازه می دهد درصورت لزوم ثوابت صحیح خود را در مبنای ‪ 8‬یا ‪ 16‬نیز كه‬
‫از مبناهای متداول در برنامه نویسی هستند‪ ،‬بنویسید‪.‬‬
‫‪‬‬
‫‪‬‬

‫برای نوشتن عدد در مبنای ‪ 8‬باید آن را با ‪ 0‬آغاز كنید‪ ،‬مثال ‪ 0342‬یك عدد در منای ‪ 8‬محسوب می‬
‫گردد‪.‬‬
‫برای نوشتن یك عدد در مبنای ‪ 16‬باید آن را با ‪ 0x‬آغاز نمایید‪ ،‬مانند ‪.0x27A4‬‬

‫‪ 7-4‬ثوابت‬
‫ثوابت عددی اعشاری‬

‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫برای نمایش اعداد اعشاری‪ ،‬باید از نقطه اعشار استفاده كنیم‪ ،‬مانند ‪237.45‬‬
‫اما نكته جالب آنستكه می توانید از نماد علمی نیز برای نمایش اعداد‬
‫اعشاری استفاده كنید‪ .‬برای اینكار كافی است از حرف ‪ e‬برای نمایش قسمت‬
‫توان استفاده نمایید‪ .‬بعنوان مثال ‪:‬‬
‫‪-23.47 × 10 5 = -23.47e5‬‬
‫‪42.389 × 10 -3 = 42.389e-3‬‬
‫دقت كنید كه قسمت توان‪ ،‬حتما یك عدد صحیح است‪.‬‬
‫نكته جالب اینجاست كه برخالف مورد قبل‪ ،‬كامپایلر بطور پیش فرض داده های‬
‫اعشاری را از نوع ‪ double‬فرض می كند‪.‬چنانچه دوست دارید ثابت شما ازنوع‬
‫‪ float‬درنظر گرفته شود‪ ،‬در انتهای آن ‪ F‬قرار دهید‪ .‬ضمنا پسوند ‪ L‬نیز داده‬
‫اعشاری را از نوع ‪ long double‬درنظر می گیرد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫ثوابت كاراكتری ‪:‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫برای نشان دادن ثوابت كاراكتری‪ ،‬آنها را در داخل ' قرار می دهیم‪ .‬بعنوان مثال‬
‫'‪'A‬یك ثابت كاراكتری است‪.‬‬
‫; '‪char ch = 'S‬‬
‫دقت كنید كه همانطور كه قبال گفته شد‪ ،‬كد اسكی كاراكترها در متغیر ذخیره‬
‫می گردد‪ ،‬بنابراین می توان از آن بعنوان یك عدد صحیح نیز استفاده كرد‪ .‬نكته‬
‫مهم دیگر آنستكه به تفاوت عدد ‪ 5‬و كاراكتر '‪ '5‬دقت داشته باشید‪ .‬در حقیقت‬
‫'‪ '5‬برابر است با عدد ‪ 53‬كه همان كد اسكی آن است‪.‬‬
‫روش فوق‪ ،‬برای نمایش کاراکترهای قابل چاپ مناسب است‪ ،‬اما بعضی‬
‫كاراكترها مانند ‪ enter‬قابل نمایش نبوده و برای آنها شکل خاصی وجود ندارد‪.‬‬
‫در چنین مواردی‪ ،‬زبان ‪ C‬از ترکیب عالمت \ به همراه یک کاراکتر دیگر‪ ،‬برای‬
‫نمایش این قبیل کاراکترها استفاده می نماید‪ .‬بعنوان مثال‪ ،‬کاراکتر '‪ '\n‬نشان‬
‫دهنده خط جدید یا همان ‪ enter‬می باشد‪.‬‬
‫جدول صفحه بعد این قبیل کاراکترها و معادل آنها را نشان می دهد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫نحوه نمایش در ‪C‬‬

‫کد اسکی‬

‫صدای بوق کامپیوتر‬

‫‪\a‬‬

‫‪7‬‬

‫حرکت به عقب ‪backspace‬‬

‫‪\b‬‬

‫‪8‬‬

‫شروع صفحه ‪form feed‬‬

‫‪\f‬‬

‫‪12‬‬

‫سطر جدید ‪line feed‬‬

‫‪\n‬‬

‫‪10‬‬

‫برگشت به ابتداي سطر ‪carriage return‬‬

‫‪\r‬‬

‫‪13‬‬

‫فاصله افقی ‪horizontal tab‬‬

‫‪\t‬‬

‫‪9‬‬

‫فاصله عمودی ‪vertical tab‬‬

‫‪\v‬‬

‫‪11‬‬

‫عالمت سوال‬

‫?\‬

‫‪63‬‬

‫عالمت '‬

‫'\‬

‫‪39‬‬

‫عالمت "‬

‫"\‬

‫‪34‬‬

‫عالمت \‬

‫\\‬

‫‪92‬‬

‫عالمت تهی‬

‫‪\0‬‬

‫‪0‬‬

‫نام کاراکتر‬

‫کد اسکی یک کاراکتر با ‪ 3‬رقم در مبنای ‪8‬‬

‫‪\000‬‬

‫کد اسکی یک کاراکتر با ‪ 2‬رقم در مبنای ‪16‬‬

‫‪\x00‬‬

‫‪ 7-4‬ثوابت‬
‫‪‬‬

‫ثوابت رشته ای ‪ C :‬عالوه بر ثوابت فوق‪ ،‬از یك ثابت دیگر بنام رشته نیز‬
‫حمایت می كند‪ .‬رشته‪ ،‬دنباله ای از كاراكترها است كه در داخل " قرار‬
‫می گیرند‪ .‬بعنوان مثال "‪ "this is a test‬یك رشته است‪ .‬دقت كنید كه '‪'a‬‬
‫یك كاراكتر است‪ ،‬اما "‪ "a‬یك رشته است كه فقط شامل یك كاراكتر می‬
‫باشد‪.‬‬

‫‪ 7-5‬عملگرها‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫عملگر‪ ،‬نمادی است كه به كامپایلر می گوید تا عملیات محاسباتی یا‬
‫منطقی خاصی را برروی یك یا چند عملوند‪ ،‬انجام دهد‪.‬‬
‫به عملگرهایی كه فقط یك عملوند دارند‪ ،‬عملگر یكانی می گوییم و‬
‫همواره عملگر در سمت چپ عملوند قرار می گیرد)مانند عدد ‪.(-125‬‬
‫اما عملگرهایی كه برروی دو عملوند اثر می كنند را عملگر دودویی‬
‫نامیده و عملگر را بین دو عملوند قرار می دهیم )مانند ‪.(23+86‬‬
‫هر ترکیب درستی از عملگرها و عملوندها را یک عبارت می نامیم‪.‬‬
‫‪ C‬از نقطه نظر عملگرها یك زبان بسیار قوی است‪ .‬این عملگرها به چند‬
‫دسته اصلی تقسیم می گردند كه آنها را به ترتیب بررسی می كنیم‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫این عملگرها‪ ،‬همان اعمال متداول ریاضی هستند كه در زبان ‪ C‬مورد استفاده‬
‫قرار می گیرند‪ .‬این اعمال عبارتند از ‪:‬‬

‫عمل‬

‫نوع‬

‫عملگر‬

‫منفی كردن عملوند سمت راست‬

‫یكانی‬

‫‪-‬‬

‫جمع دو عملوند‬

‫دودویی‬

‫‪+‬‬

‫تفریق دو عملوند‬

‫دودویی‬

‫‪-‬‬

‫ضرب دو عملوند‬

‫دودویی‬

‫*‬

‫تقسیم دو عملوند‬

‫دودویی‬

‫‪/‬‬

‫محاسبه باقیمانده تقسیم دو عملوند‬

‫دودویی‬

‫‪%‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬
‫‪‬‬

‫این عملگرهای برروی همه انواع داده های ‪ C‬عمل می كنند‪ ،‬بجز عملگر ‪ %‬كه فقط‬
‫برروی نوع داده های صحیح عمل می كند‪.‬‬
‫اما نكته مهمی كه باید به آن اشاره كرد‪ ،‬نحوه كار عملگر تقسیم برروی نوع داده های‬
‫مختلف است‪.‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫درصورتیكه هردو عملوند صحیح باشند‪ ،‬تقسیم بصورت صحیح بر صحیح انجام خواهد شد‪.‬‬
‫اگر یكی یا هر دو عملوند اعشاری باشند‪ ،‬تقسیم بصورت اعشاری انجام خواهد پذیرفت‪.‬‬
‫فرض كنید تعاریف زیر را داریم ‪:‬‬
‫; ‪int a,b‬‬
‫; ‪float c,d‬‬
‫; ‪a = 10 ; b = 4‬‬
‫;‪c = 8.2; d = 4.0‬‬
‫اكنون به نتایج عملیات زیر دقت كنید ‪:‬‬
‫‪a / b => 2‬‬
‫‪c / d => 2.05‬‬
‫‪a / d => 2.5‬‬
‫‪a / 4 => 2‬‬
‫چنانچه به آخرین مورد توجه كنید‪ ،‬متوجه می شوید كه از آنجا كه ‪a‬یك متغیر صحیح است و ‪4‬‬
‫نیز یك ثابت صحیح در نظر گرفته شده‪ ،‬درنتیجه تقسیم بصورت صحیح بر صحیح انجام گرفته‬
‫است‪ .‬چنانچه بخواهیم تقسیم بصورت اعشاری صورت پذیرد‪ ،‬به دو شكل می توانیم عمل‬
‫كنیم‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫برای اینکه عبارت تقسیم صفحه قبل بصورت اعشاری انجام شود‪ ،‬به دو روش‬
‫می توان عمل کرد‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫این عبارت را بصورت ‪ a / 4.0‬بنویسیم‪.‬‬
‫از عملگر قالب ریزی استفاده كنیم‪.‬‬

‫عملگر قالب ریزی می تواند یك نوع را به نوع دیگری تبدیل نماید‪ .‬شكل كلی آن‬
‫به شكل زیر است ‪:‬‬
‫>‪() ‫كه ‪ type‬نوع مورد نظر است كه قصد تبدیل عبارت ‪ expression‬به آن نوع را‬
‫داریم‪ .‬بعنوان مثال در مورد قبلی می توان به شكل زیر عمل كرد ‪:‬‬
‫‪(float) a / 4‬‬
‫در این حالت از كامپایلر خواسته ایم كه ابتدا عدد ‪ a‬را به اعشاری تبدیل كند‬
‫)البته بصورت موقت( و سپس آن را بر ‪ 4‬تقسیم نماید‪ ،‬كه مسلما حاصل‬
‫اعشاری خواهد بود‪.‬‬
‫بطوركلی هرگاه ثابتها و متغیرهایی از انواع مختلف در یك عبارت محاسباتی‬
‫داشته باشیم‪ ،‬كامپایلر ‪ C‬همه آنها را به یك نوع یكسان كه همان بزرگترین‬
‫عملوند موجود است تبدیل خواهد كرد‪ .‬بعنوان مثال به مورد صفحه بعد دقت‬
‫كنید ‪:‬‬

‫ عملگرهای محاسباتی‬7-5-1
char ch;
int i;

float f;
double d;
result = (ch / i)
int

+

(f *d)

(f+i)
float

double

double

int

-

double

double

float

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫اولویت عملگرها ‪ :‬در عبارتی که شامل چندین عملگر است‪ ،‬کدامیک در‬
‫ابتدا اعمال خواهد گردید‪.‬‬
‫اولویت عملگرهای محاسباتی از باال به پایین بشرح زیر است‪:‬‬
‫‪ ‬عملگر یکانی –‬
‫‪ ‬عملگرهای * و ‪ /‬و ‪%‬‬
‫‪ ‬عملگرهای ‪ +‬و –‬
‫چنانچه اولویت دو عملگر یکسان باشد‪ ،‬این عملگرها از چپ به راست‬
‫محاسبه خواهند شد‪.‬‬
‫چنانچه بخواهیم یک عمل با اولویت پایین زودتر انجام شود‪ ،‬باید از پرانتز‬
‫استفاده کنیم‪ .‬بنابراین اولویت عملگر پرانتز از همه موارد فوق‬
‫بیشتراست‪ .‬در مورد پرانتزهای متداخل‪ ،‬ابتدا پرانتز داخلی محاسبه‬
‫می شود؛ اما در مورد پرانتزهای هم سطح‪ ،‬ابتدا پرانتز سمت چپتر‬
‫محاسبه می گردد‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫چند مثال در مورد اولویت عملگرها‬

‫ترتیب اجرای عملگرها‬

‫عبارت زبان ‪C‬‬

‫ابتدا عمل * و سپس عمل ‪+‬‬

‫‪b+c*d‬‬

‫ابتدا عمل ‪ +‬و سپس عمل *‬

‫‪(b + c) * d‬‬

‫ابتدا عمل ‪ /‬سپس عمل * و در انتها عمل ‪+‬‬

‫‪b+c/d*e‬‬

‫ابتدا عمل * سپس عمل ‪ /‬و در انتها عمل ‪+‬‬

‫)‪b + c / (d * e‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫یک مثال کامل در مورد اولویت عملگرها‬

‫‪result = a + b * (f – (g + b) / d) – c * (a – d) / e‬‬
‫‪6‬‬

‫‪1‬‬
‫‪7‬‬

‫‪2‬‬

‫‪8‬‬

‫‪3‬‬
‫‪4‬‬
‫‪5‬‬
‫‪9‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫در زبان ‪ C‬برای انتساب چندین عملگر وجود دارد‪ .‬ساده ترین عملگر انتساب‪ ،‬همان عملگر =‬
‫است که در بسیاری از زبانها استفاده می شود‪ .‬بعنوان مثال ‪:‬‬
‫;‪a = 5‬‬
‫;‪b = c + 2 * d‬‬
‫این عملگر باعث می شود که عبارت سمت راست در عبارت سمت چپ قرار گیرد‪.‬‬
‫توجه کنید که مقدار سمت چپ باید عبارتی باشد که بتوان به آن یک مقدار را نسبت داد‬
‫)مانند یک متغیر( که به آن ‪ Lvalue‬گفته می شود‪ ،‬بنابراین یک ثابت نمی تواند در سمت چپ‬
‫قرار گیرد‪.‬‬
‫نکته دیگر اینکه اولویت عملگر = از عملگرهای ریاضی کمتر است و درنتیجه ابتدا آن عملیات‬
‫انجام شده و در پایان حاصل در عبارت سمت چپ ریخته می شود‪.‬‬
‫الزم به ذکر است که در هنگام انتساب‪ ،‬درصورت لزوم نوع عبارت سمت راست به نوع عبارت‬
‫سمت چپ تبدیل می شود‪ .‬مثال‪:‬‬
‫;‪int a‬‬
‫;‪a = 2.5 * 5.0‬‬
‫که دراینصورت عدد ‪ 12‬در ‪ a‬ذخیره خواهد شد‪.‬‬
‫شرکت پذیری این عملگر از راست به چپ می باشد‪ ،‬بدین معنا که چنانچه چندین عملگر‬
‫نسبت دهی داشته باشیم‪ ،‬این عملگرها از راست به چپ محاسبه می شوند‪ .‬مثال پس از‬
‫اجرای دستور زیر‪ ،‬مقدار هر ‪ 3‬متغیر برابر ‪ 10‬خواهد شد‪.‬‬
‫;‪a = b = c = 10‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬

‫نکته جالب درمورد زبان ‪ C‬آنستکه دارای یک سری عملگرهای انتساب‬
‫خالصه شده است که باعث می شوند در بعضی موارد بتوانیم عبارات‬
‫کوتاهتری را بنویسیم‪ .‬این عملگرها عبارتند از ‪:‬‬
‫عملگرد‬

‫مثال‬

‫عبارت انتساب معادل‬

‫‪++‬‬

‫;‪a ++‬‬

‫;‪a = a + 1‬‬

‫‪--‬‬

‫;‪a --‬‬

‫;‪a = a – 1‬‬

‫=‪+‬‬

‫;‪a += 5‬‬

‫;‪a = a + 5‬‬

‫=‪-‬‬

‫;‪a -= 8‬‬

‫;‪a= a – 8‬‬

‫=*‬

‫;‪a *= 10‬‬

‫;‪a= a * 10‬‬

‫=‪/‬‬

‫;‪a /= 2‬‬

‫;‪a = a / 2‬‬

‫=‪%‬‬

‫;‪a %= 10‬‬

‫;‪a = a % 10‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬
‫‪‬‬

‫عملگر اول و دوم‪ ،‬عملگرهای یکانی هستند که بترتیب عملگر افزایش و عملگر کاهش‬
‫نامیده می شوند‪.‬‬
‫نکته جالب آنستکه این دو عملگر به دوصورت مورد استفاده قرار می گیرند‪.‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫در حالتی که از دستور ;‪ a ++‬استفاده شود به آن پس افزایش می گویند و بدین معناست که‬
‫ابتدا از مقدار فعلی ‪ a‬در عبارت موردنظر استفاده کن و سپس آن را افزایش بده‪.‬‬
‫اما دستور ;‪ ++ a‬که به آن پیش افزایش گفته می شود‪ ،‬ابتدا ‪ a‬را افزایش داده و سپس از آن‬
‫در عبارت استفاده می کند‪.‬‬
‫به برنامه زیر دقت کنید‪:‬‬

‫>‪#include ‫{ )(‪void main‬‬
‫; ‪int a ,b‬‬
‫;‪a=5‬‬
‫;‪b = a ++‬‬
‫;)‪printf(“a=%d and b=%d \n”,a,b‬‬
‫;‪a=5‬‬
‫;‪b = ++ a‬‬
‫;)‪printf(“a=%d and b=%d \n”,a,b‬‬
‫}‬
‫‪a=6 b=5‬‬
‫‪a=6 b=6‬‬

‫‪ 7-5-3‬عملگرهای مقایسه ای‬
‫‪‬‬

‫‪‬‬

‫این عملگرها دو عبارت را بایکدیگر مقایسه کرده و نتیجه را باز می گردانند‪.‬‬
‫نتیجه می تواند درست )‪ (true‬یا غلط )‪ (false‬باشد‪.‬‬
‫نتیجه این عملگرها یک عدد صحیح است که درصورت درست بودن ‪ 1‬و‬
‫درصورت غلط بودن ‪ 0‬باز می گردانند‪ .‬این عملگرها عبارتند از‪:‬‬
‫عملگر‬

‫مفهوم عملگر‬

‫مثال‬

‫<‬

‫بزرگتر )<(‬

‫‪a>b‬‬

‫>‬

‫کوچکتر )>(‬

‫‪a
‫=<‬

‫بزرگتر یا مساوی )≤(‬

‫‪a >= b‬‬

‫=>‬

‫کوچکتر یا مساوی )≥(‬

‫‪a <= b‬‬

‫==‬

‫مساوی )=(‬

‫‪a == b‬‬

‫=!‬

‫نامساوی )≠(‬

‫‪a != b‬‬

‫‪ 7-5-3‬عملگرهای مقایسه ای‬
‫‪‬‬

‫‪‬‬

‫نکته مهمی که باید به آن دقت کرد عملگر مساوی )==( است‪ ،‬چرا که یک‬
‫اشتباه بسیار متداول برنامه نویسان ‪ C‬استفاده اشتباه از عملگر انتساب‬
‫)=( بجای عملگر تساوی )==( است که باعث ایجاد خطا در برنامه می‬
‫شود‪.‬‬
‫اولویت این عملگرها از باال به پایین بشرح زیر است‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫عملگرهای <‪ <= ، > ،‬و =>‬
‫عملگرهای == و =!‬

‫الزم بذکر است که در هنگام مساوی بودن اولویت چند عملگر‪ ،‬این عملگرها‬
‫از چپ به راست محاسبه می گردند‪.‬‬

‫‪ 7-5-4‬عملگرهای منطقی‬
‫‪‬‬

‫این عملگرها به شما اجازه می دهند که شرطهای ساده ای را که با‬
‫استفاده از عملگرهای مقایسه ای ایجاد شده اند را با یکدیگر ترکیب نموده‬
‫و شرطهای پیچیده تری را بسازید‪ .‬این عملگرها عبارتند از ‪:‬‬
‫مثال‬

‫عملگر‬

‫مفهوم عملگر‬

‫نحوه کار‬

‫&&‬

‫‪ AND‬منطقی‬

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

‫‪a>0 && sw==1‬‬

‫||‬

‫‪ OR‬منطقی‬

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

‫‪a<=100 || b!=0‬‬

‫!‬

‫‪ NOT‬منطقی‬

‫اگر عملوند درست باشد‪ ،‬نادرست و‬
‫اگر نادرست باشد‪ ،‬درست برمی‬
‫گرداند‪.‬‬

‫)‪! (a==1 || b<10‬‬

‫‪ 7-5-5‬عملگر شرطی‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫گاهی الزم است که ابتدا یک شرط بررسی شده و سپس برمبنای نتیجه )درست یا نادرست بودن آن( یکی‬
‫از دو عبارت ممکن بازگردانده شود‪ .‬برای اینکار می توان از یک عملگر ‪3‬تایی )با ‪ 3‬عملوند( بنام عملگر‬
‫شرطی استفاده نمود‪.‬‬
‫شکل کلی این عملگر بصورت زیر است‪:‬‬
‫>عبارت‪> :<2‬عبارت‪> ?<1‬شرط<‬
‫نحوه کار بدینصورت است که درصورت درست بودن شرط‪ ،‬عبارت‪ 1‬و در غیراینصورت عبارت ‪ 2‬بازگردانده می‬
‫شود‪.‬‬
‫به عنوان مثال به دستور زیر توجه کنید‪:‬‬
‫که این عبارت معادل دستور زیر است‪:‬‬

‫‪‬‬

‫;‪a = (k<10) ? 100 : 50‬‬
‫;‪if (k<10) a=100‬‬
‫;‪else a=50‬‬

‫البته این عبارت به شکلهای پیچیده نیز می تواند مورد استفاده قرار گیرد‪ .‬مثال ‪:‬‬
‫;‪c += (a>0 && a<10) ? ++a : a/b‬‬
‫که معادل است با ‪:‬‬
‫{ )‪if (a>0 && a<10‬‬
‫;‪a= a + 1‬‬
‫;‪c = c + a‬‬
‫}‬
‫;‪else c = c + a/b‬‬

‫‪ 7-5-6‬اولویت عملگرها‬
‫عملگر‬

‫اولویت‬

‫شرکت پذیری‬

‫‪1‬‬

‫)(‬

‫از چپ به راست‬

‫‪2‬‬

‫‪- + ! -- ++‬‬

‫از راست به چپ‬

‫‪3‬‬

‫‪* / %‬‬

‫از چپ به راست‬

‫‪4‬‬

‫‪+ -‬‬

‫از چپ به راست‬

‫‪5‬‬

‫>> <<‬

‫از چپ به راست‬

‫‪6‬‬

‫>= > <= <‬

‫از چپ به راست‬

‫‪7‬‬

‫=! ==‬

‫از چپ به راست‬

‫‪8‬‬

‫&&‬

‫از چپ به راست‬

‫‪9‬‬

‫||‬

‫از چپ به راست‬

‫‪10‬‬

‫‪?:‬‬

‫از راست به چپ‬

‫‪11‬‬

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

‫از راست به چپ‬

‫‪12‬‬

‫‪,‬‬

‫از چپ به راست‬

‫‪ 7-6‬خواندن و نمایش اطالعات‬
‫‪‬‬

‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫همانطور كه قبال نیز گفته شد‪ ،‬یكی از اهداف زبان ‪ C‬قابل حمل بودن آن‬
‫است‪ .‬بهمین منظور سعی شده است كه از دستوراتی كه ممكن است‬
‫وابسته به ماشین خاصی باشد‪ ،‬اجتناب گردد‪.‬‬
‫بهمین دلیل زبان ‪ C‬برخالف سایر زبانها دارای هیچ دستوری برای‬
‫خواندن از ورودی و یا نوشتن در خروجی نیست‪.‬‬
‫اما در عوض دارای تعدادی تابع )زیربرنامه( استاندارد می باشد كه تقریبا‬
‫تمامی كامپایلرها از آنها حمایت می كنند‪.‬‬
‫این كار به كامپایلر این امكان را می دهد كه بر حسب نوع سخت افزار‬
‫موردنظر‪ ،‬توابع ورودی و خروجی را طراحی نماید‪.‬‬
‫این توابع در یك فایل سرآمد بنام ‪ stdio.h‬تعریف شده اند و بنابراین قبل‬
‫ازاینكه بتوانید از این توابع استفاده نمایید‪ ،‬باید این فایل را نیز با استفاده‬
‫از ‪ #include‬در برنامه خود بگنجانید‪.‬‬

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫برای نمایش اطالعات در خروجی از تابع ‪ printf‬استفاده می شود‪.‬‬
‫این تابع رشته موردنظر شما را به خروجی استاندارد )كه در حالت‬
‫عادی همان صفحه نمایش یا مانیتور است( می فرستد‪ .‬شكل كلی این‬
‫تابع بصورت زیر است‪:‬‬
‫; )>لیست متغیرها< ‪> ,‬رشته كنترلی<(‪printf‬‬
‫رشته كنترلی همان متنی است كه قصد چاپ آن را داریم‪ ،‬با ذكر این‬
‫نكته كه در قسمتهایی كه باید مقدار یك متغیر چاپ شود‪ ،‬از یك‬
‫مشخصه تبدیل استفاده می شود‪ .‬هر مشخصه تبدیل از یك عالمت ‪%‬‬
‫بعالوه یك كاراكتر كه نوع متغیر مورد نظر را نشان می دهد تشكیل می‬
‫گردد‪.‬‬
‫لیست متغیرها نیز همان متغیرهایی هستند كه قصد چاپ آنها را داریم‪.‬‬
‫این متغیرها باید بترتیب قرار گرفته و با كاما )‪ (,‬از یكدیگر جدا شوند‪.‬‬

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫مشخصه تبدیل‬

‫مفهوم‬

‫‪%c‬‬

‫كاراكتر‬

‫‪%d‬‬

‫عدد صحیح در مبنای ‪10‬‬

‫‪%f‬‬

‫عدد اعشاری بدون نماد علمی‬

‫‪%e‬‬

‫عدد اعشاری با نماد علمی‬

‫‪%g‬‬

‫عدد اعشاری با حالت كوتاهتر بین ‪ e‬و ‪f‬‬

‫‪%s‬‬

‫رشته‬

‫‪%ld‬‬

‫عدد صحیح بزرگ‬

‫‪%lf %le %lg‬‬

‫عدد اعشاری بزرگ‬

‫‪%o‬‬

‫عدد صحیح در مبنای ‪8‬‬

‫‪%x‬‬

‫عدد صحیحی در مبنای ‪16‬‬

‫‪%u‬‬

‫عدد صحیح بدون عالمت‬

‫ تابع نمایش در خروجی‬7-6-1
#include
void main() {
int age = 20;
floate average = 18.23;
printf("You are %d years old and your average is %f \n",age,average);
}
You are 20 years old and your average is 18.230000

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫‪‬‬
‫‪‬‬

‫برای کنترل نحوه چاپ اعداد می توانید از مشخصه طول میدان استفاده‬
‫کنید‪.‬‬
‫مشخصه طول میدان برای اعداد به شكل زیر استفاده می شود‪:‬‬
‫‪ ‬برای اعداد صحیح از ‪ %nd‬استفاده می كنیم كه ‪ n‬تعداد ارقام را نشان‬
‫می دهد )مثال ‪ .(%3d‬در اینصورت برای هر متغیر ‪ n‬رقم درنظر گرفته‬
‫می شود‪ .‬اگر اندازه عدد از ‪ n‬كوچكتر باشد‪ ،‬به سمت چپ آن فضای‬
‫خالی اضافه می شود و اگر اندازه عدد بیش از ‪ n‬رقم باشد‪ ،‬طول میدان‬
‫نادیده گرفته شده و عدد بطور كامل چاپ می شود‪.‬‬
‫‪ ‬برای اعداد اعشاری از ‪ %n.mf‬استفاده می كنیم كه ‪ n‬اندازه كل عدد‬
‫)شامل عالمت ممیز( و ‪ m‬تعداد ارقام اعشار است )مثال ‪ .(%5.2f‬در‬
‫صورتیكه تعداد ارقام اعشاری عدد موردنظر از ‪ m‬بیشتر باشد‪ ،‬عدد به ‪m‬‬
‫عدد اعشار گرد می شود و در صورتیكه از ‪ m‬كمتر باشد‪ ،‬در سمت‬
‫راست آن ‪ 0‬قرار داده می شود‪.‬‬

‫‪ 7-6-2‬تابع خواندن از ورودی‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای خواندن اطالعات از ورودی از تابع ‪ scanf‬استفاده می شود‪.‬‬
‫این تابع اطالعات را ازورودی استاندارد )معموال صفحه كلید( خوانده و در‬
‫متغیرهای تعیین شده قرار می دهد‪.‬‬
‫شكل كلی این تابع بصورت زیر است‪:‬‬
‫; )>لیست آدرسهای متغیرها< ‪> ,‬رشته كنترلی<(‪scanf‬‬
‫همانطور كه می بینید نحوه احضار تابع ‪ scanf‬نیز مشابه ‪ printf‬است‪ .‬تنها‬
‫تفاوت در آن است كه در ‪ scanf‬باید لیست آدرسهای متغیرها ارسال شود‪.‬‬
‫مبحث مربوط به آدرسها در فصول بعدی بررسی خواهد شد ولی در حال حاضر‬
‫بخاطر بسپارید كه برای بدست آوردن آدرس یك متغیر از عالمت & استفاده می‬
‫كنیم‪ .‬بعنوان مثال ‪ &age‬بمعنای آدرس متغیر ‪ age‬است‪.‬‬
‫بطور كلی در ‪ C‬قدیمی هرگاه كه یك تابع دارای پارامترهای خروجی بود )یعنی‬
‫پارامترهایی كه یك مقدار را باز می گرداندند( از آدرس متغیرها استفاده می‬
‫شد كه امروزه این مسئله وجود ندارد‪.‬‬

‫ تابع خواندن از ورودی‬7-6-2
#include
void main() {
int age;
float average ;
printf("Please enter your age and average : ");
scanf("%d %f",&age,&average);
printf("You are %d years old and your average is %5.2f \n",age,average);
}

Please enter your age and average : 19 16.72
You are 19 years old and your average is 16.72

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫زبان ‪ C++‬یک زبان شی گرا است‪ ،‬بهمین دلیل در این زبان برای ورودی‬
‫و خروجی از اشیاء بجای توابع استفاده می گردد‪.‬‬
‫از آنجا که امروزه معموال برنامه نویسان ‪ C‬از کامپایلرهای ‪ C++‬استفاده‬
‫می کنند‪ ،‬می توانند از اشیای ورودی و خروجی آن نیز استفاده کنند‪.‬‬
‫اینکار در بین بسیاری از برنامه نویسان ‪ C‬متداول است‪ ،‬بهمین دلیل ما‬
‫در اینجا نحوه کار با اشیای خواندن و نوشتن در ‪ C++‬را بطور مقدماتی‬
‫توضیح می دهیم؛ گرچه توضیح کامل این موارد نیاز به آشنایی با شی‬
‫گرایی و زبان ‪ C++‬دارد‪.‬‬
‫قبل از هرچیز الزم به ذکر است که کلیه اشیای مربوط به ورودی و‬
‫خروجی در فایل سرآمدی بنام ‪ iostream.h‬تعیریف شده اند‪ ،‬بنابراین‬
‫ابتدا باید این فایل به برنامه توسط دستور ‪ #include‬الحاق گردد‪.‬‬

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫زبان ‪ C++‬برای نمایش اطالعات از یک شیئ بنام ‪ cout‬استفاده می نماید‪.‬‬
‫برای ارسال اطالعات مورد نظر برای چاپ به ‪ cout‬باید از عملگر درج در جریان‬
‫یا >> استفاده نماییم‪ .‬بعنوان مثال ‪:‬‬
‫; ” ‪cout >> “Please enter your name:‬‬
‫و یا مثال دیگر ‪:‬‬
‫;‪int a = 10‬‬
‫;‪float b = 2.86‬‬
‫;‪cout << a‬‬
‫;‪cout << b‬‬
‫نکته جالبی که در این مثالها دیده می شود‪ ،‬آنستکه برخالف تابع ‪ printf‬هیچ‬
‫نیازی به مشخص کردن نوع متغیری که قصد چاپ آن را داریم نیست و خود‬
‫شئ ‪ cout‬نوع آن را تشخیص می دهد‪.‬‬
‫عالوه براین می توان چندین عملگر درج در جریان را با یکدیگر الحاق کرد و‬
‫چندین متغیر را با یک دستور چاپ کرد‪.‬‬

C++ ‫ ورودی و خروجی اطالعات در‬7-6-3
#include
void main() {
int age = 20;
floate average = 18.23;
cout >> “You are ” >> age >> “ years old and your average is ” >> average ;
}

You are 20 years old and your average is 18.230000

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای دریافت اطالعات از کاربر‪ ،‬از شئ دیگری بنام ‪ cin‬استفاده می شود‪.‬‬
‫برای ارسال متغیر مورد نظر به ‪ cin‬باید از عملگر استخراج از جریان یا <<‬
‫استفاده نماییم‪ .‬بعنوان مثال‪:‬‬
‫;‪int a‬‬
‫;‪cin >> a‬‬
‫بازهم همانطور که می بینید نیازی به تعیین نوع متغیر موردنظر نیست و خود‬
‫شئ ‪ cin‬نوع متغیر را بطور اتوماتیک تشخیص داده و داده ای از همان نوع را از‬
‫کاربر دریافت و در متغیر مورد نظر قرار می دهد‪.‬‬
‫عملگرهای استخراج از جریان را نیز می توان با یکدیگر الحاق کرد‪.‬‬
‫برای رفتن به خط بعد در شئ ‪ cout‬می توان از دستکاری کننده ‪ endl‬استفاده‬
‫کرد‪ .‬مثال در دستور زیر پس از چاپ پیغام‪ ،‬مکان نما به خط بعد منتقل می‬
‫شود‪:‬‬
‫;‪cout >> “List of students : “ >> endl‬‬
‫البته دستکاری کننده های متعدد دیگری نیز ازجمله موارد مربوط به تعیین طول‬
‫میدان و نحوه چاپ مقادیر وجود دارد که توضیح آنها نیاز به یک مبحث مستقل‬
‫دارد‪.‬‬

C++ ‫ ورودی و خروجی اطالعات در‬7-6-3
#include
void main() {
int age;
float average ;
cout << "Please enter your age and average : " ;
cin >> age >> average ;
cout << "You are " << age << "years old and your average is " << average;
}

Please enter your age and average : 19 16.72
You are 19 years old and your average is 16.72

‫‪ 7-7‬توابع کتابخانه ای‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫همانطور که قبال نیز گفته شد‪ ،‬زبان ‪ C‬از زیر برنامه ها نیز حمایت می کند‪ .‬هر زیر برنامه‬
‫در ‪ C‬یک تابع نامیده می شود‪ .‬تا کنون با توابعی همچون ‪ main‬و یا ‪ printf‬و ‪ scanf‬آشنا‬
‫شده ایم‪.‬‬
‫معموال عرضه کنندگان کامپایلرها و یا سایر فروشندگان نرم افزار‪ ،‬برخی از توابع عمومی‬
‫را که ممکن است مورد نیاز جمع کثیری از برنامه نویسان مختلف باشد را در قالب‬
‫کتابخانه ای از توابع در اختیار برنامه نویسان می گذارند‪ .‬بعضی از این توابع کتابخانه ای‬
‫مانند ‪ printf‬و ‪ scanf‬بصورت استاندارد درآمده و توسط عرضه کنندگان مختلف ارائه می‬
‫شوند‪.‬‬
‫در کامپایلر عرضه شده توسط شرکت بورلند )‪ (Borland C++ 3.1‬نیز کتابخانه های‬
‫متعددی از توابع برای شما عرضه شده اند که بتدریج با آنها و کاربردشان آشنا خواهید‬
‫شد‪.‬‬
‫نکته مهم آنستکه برای استفاده از این توابع ابتدا باید فایل سرآمد مربوط به آنها را نیز در‬
‫ابتدای برنامه خود اضافه نمایید ) با استفاده از ‪ .(#include‬هر فایل سرآمد شامل تعاریف‬
‫اولیه گروهی از توابع مرتبط با هم و داده های مربوط به آنها بوده و در استاندارد قدیمی‬
‫تر دارای پسوند ‪ .h‬می باشد)در استاندارد جدید پسوند این فایلها حذف شده است(‪.‬‬
‫برخی از این فایلهای سرآمد عبارتند از‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪ : stdio.h‬توابع ورودی و خروجی استاندارد‬
‫‪ : math.h‬توابع ریاضی‬
‫‪ : graphics.h‬توابع مربوط به عملیات گرافیکی‬
‫‪ : string.h‬توابع مربوط به کار با رشته ها‬


Slide 15

‫مبانی کامپیوتر و برنامه سازی‬
‫فصل هفتم ‪ :‬مفاهیم اولیه زبان ‪C‬‬
‫مدرس ‪ :‬نگین معروفی‬

‫‪ 7-1‬شناسه ها در ‪C‬‬
‫‪‬‬
‫‪‬‬

‫شناسه )‪ (identifier‬نامی است که به یک قسمت از برنامه مانند متغیر‪ ،‬تابع‪ ،‬ثابت و یا‬
‫‪ ...‬داده می شود‪.‬‬
‫در زبان ‪ C‬برای انتخاب شناسه ها فقط می توان از عالئم زیر استفاده کرد‪:‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫حروف انگلیسی کوچک و بزرگ )‪(A…Z a…z‬‬
‫ارقام )‪(0…9‬‬
‫عالمت خط پایین یا _‬

‫البته یک شناسه نمی تواند با یک رقم شروع شود‪.‬‬
‫چند شناسه مجاز‪ name2 ، average ، sum :‬و ‪student_average‬‬
‫چند شناسه غیرمجاز ‪ 2name‬و یا ‪student average‬‬
‫در برنامه نویسی امروزی پیشنهاد می شود بجای شناسه هایی همانند‬
‫‪ student_average‬از ‪ studentAverage‬استفاده گردد‪.‬‬
‫نکته مهم دیگری که باید به آن اشاره کرد آنستکه زبان ‪ C‬برخالف بسیاری از زبانهای دیگر‬
‫به کوچک و بزرگی حروف حساس است )‪ .(case sensitive‬در نتیجه شناسه های زیر با‬
‫یکدیگر متفاوتند ‪:‬‬
‫‪Sum ≠ sum ≠ SUM‬‬
‫آخرین نکته اینستکه در هنگام انتخاب شناسه نمی توانید از کلمات کلیدی که برای‬
‫منظورهای خاص در زبان ‪ C‬رزرو شده اند استفاده کنید‪.‬‬

C ‫ شناسه ها در‬7-1
: C ‫کلمات کلیدی در زبان‬
auto

break

case

char

const

continue

default

do

double

else

enum

extern

float

for

goto

if

int

long

register

return

short

signed

sizeof

static

struct

switch

typedef

union

unsigned

void

volatile

while

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫محدوده‬

‫اندازه )بیت(‬

‫توضیح‬

‫نوع داده‬

‫‪-128 to +127‬‬

‫‪8‬‬

‫کاراکتر‬

‫‪char‬‬

‫‪-32768 to +32767‬‬

‫‪16‬‬

‫عدد صحیح‬

‫‪int‬‬

‫‪3.4e-38 to 3.4e+38‬‬

‫‪32‬‬

‫عدد اعشاری‬

‫‪float‬‬

‫‪1.7e-308 to 1.7e+308‬‬

‫‪64‬‬

‫عدد اعشاری با‬
‫دقت مضاعف‬

‫‪double‬‬

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫‪‬‬

‫البته چند نکته مهم درمورد این جدول قابل ذکر است ‪:‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫اندازه ‪ int‬در محیطهای ‪ 16‬بیتی مانند ‪ DOS‬برابر ‪ 16‬بیت است‪ .‬اما در‬
‫محیطهای ‪ 32‬بیتی همانند ‪ Windows‬اندازه آن ‪ 32‬بیت می باشد که در‬
‫اینصورت محدوده ای برابر ‪ -2,147,483,648‬تا ‪ +2,147,483,647‬را‬
‫پوشش می دهد‪.‬‬
‫در بعضی از کامپایلرهای ‪ ،C‬نوع داده ‪ bool‬نیز وجود دارد که می تواند‬
‫یکی از مقادیر ‪)true‬درست( یا ‪) false‬غلط( را نشان دهد ‪ .‬اما در نسخه‬
‫های اولیه ‪ C‬از همان نوع داده صحیح یا ‪ int‬برای اینکار استفاده می‬
‫شد‪ .‬بدین صورت که ‪ 0‬نشاندهنده ‪ false‬و هر عدد غیر صفر )معموال ‪(1‬‬
‫نشاندهنده ‪ true‬است‪.‬‬
‫از آنجا که برای ذخیره سازی کاراکترها کد اسکی آنها ذخیره می گردد‪،‬‬
‫از یک متغیر کاراکتری یا ‪ char‬می توان بعنوان یک عدد صحیح کوچک نیز‬
‫استفاده کرد و اعمال ریاضی برروی آنها نیز مجاز است‪.‬‬

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫عالوه براین چندین اصالح کننده نیز وجود دارد که به ما اجازه می دهد نوع داده مورد‬
‫نظر را با دقت بیشتری برای نیازهای مختلف استفاده نماییم‪.‬‬
‫این اصالح کننده ها عبارتند از ‪short, long, signed, unsigned :‬‬
‫تمام این اصالح کننده ها می توانند به نوع داده ‪ int‬اعمال شوند و اثر آنها بستگی‬
‫به محیط دارد‪.‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫در یک محیط ‪16‬بیتی‪short int ،‬بازهم برابر ‪16‬بیت است ولی ‪ long int‬برابر‪32‬بیت می‬
‫باشد‪.‬‬
‫‪ unsigned int‬باعث می شود که یک عدد ‪ 16‬بیتی بدون عالمت داشته باشیم که بازه‬
‫بین ‪ 0‬تا ‪ 65535‬را پوشش می دهد‪ signed int .‬نیز همانند ‪ int‬معمولی بوده و تفاوتی‬
‫ندارد‪.‬‬
‫ترکیب این اصالح کننده ها نیز ممکن است‪ .‬مثال ‪ unsigned long int‬یک عدد ‪ 32‬بیتی‬
‫بدون عالمت است که بازه ‪ 0‬تا ‪ 4,294,967,295‬را پوشش می دهد‪.‬‬

‫برروی نوع داده ‪ char‬فقط اصالح کننده های ‪ signed‬و ‪ unsigned‬را می توان اعمال‬
‫کرد‪ .‬معموال از اصالح کننده ‪ unsigned‬وقتی استفاده می شود که قصد داشته‬
‫باشیم از ‪ char‬بعنوان یک عدد صحیح مثبت بین ‪ 0‬تا ‪ 255‬استفاده کنیم‪.‬‬
‫برروی نوع داده ‪ double‬تنها اصالح کننده ‪ long‬قابل اعمال است و دراینصورت عدد‬
‫اعشاری با ‪ 80‬بیت را خواهیم داشت که قادر است هر عددی در بازه ‪ 3.4e-4932‬تا‬
‫‪ 1.1e+4932‬را در خود نگاه دارد‪.‬‬

‫‪ 7-3‬تعریف متغیرها‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای تعریف متغیرها به شکل زیر عمل می کنیم‪:‬‬

‫;>‪ ‫که ‪ type‬یکی از نوع داده های گفته شده و ‪ variable-list‬لیستی از متغیرها است‬
‫که با کاما از یکدیگر جدا شده اند‪ .‬بعنوان مثال ‪:‬‬
‫;‪int sum‬‬
‫;‪float average‬‬
‫; ‪long int a, b, c‬‬
‫; ‪unsigned long int i, j, k‬‬
‫عالوه براین می توان در هنگام تعریف متغیر به آن مقدار اولیه نیز داد‪ .‬مثال ‪:‬‬
‫; ‪int d = 0‬‬
‫نكته مهم آنكه زبان ‪ C‬به متغیرها مقدار اولیه نمي دهد )حتي ‪ (0‬و برنامه نويس‬
‫خود بايد اينكار را صريحا انجام دهد‪ ،‬درغیر اينصورت مقدار اولیه متغیر‪ ،‬نامعین خواهد‬
‫بود‪.‬‬
‫تعریف متغیرها طبق اصول زبان ‪ C‬میتواند درهرجایی از برنامه صورت پذیرد‪ ،‬و‬
‫متغیرهای تعریف شده از همان خط به بعد قابل استفاده خواهد بود‪ .‬اما معموال‬
‫توصیه می گردد كه تعریف متغیرها در همان خط ابتدایی تابع و بالفاصله پس از {‬
‫صورت پذیرد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫‪‬‬
‫‪‬‬

‫ثابتها مقادیر ثابتی هستند كه مقدار آنها در حین اجرای برنامه تغییر نمی یابد‪ .‬ثابتها می توانند از‬
‫هریك از نوع داده های اصلی باشند‪.‬‬
‫ثوابت عددی صحیح ‪:‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫برای نمایش این دسته از ثوابت‪ ،‬از دنباله ای از ارقام بعالوه عالمت ‪ +‬یا ‪ -‬استفاده می كنیم‪ .‬بعنوان مثال‬
‫‪ -45‬و یا ‪ 3489‬ثوابت صحیح هستند‪.‬‬
‫در حالت عادی ‪ C‬هر عدد را در كوچكترین نوع داده ای كه می تواند قرار می دهد‪ .‬مثال عدد ‪ 85‬در یك‬
‫‪ int‬قرار می گیرد‪ ،‬اما عدد ‪ 145398‬در یك ‪ long int‬قرار خواهد گرفت‪.‬‬
‫اگر قصد دارید یك عدد كوچك بعنوان ‪ long‬محسوب گردد‪ ،‬می توانید از پسوند ‪ L‬در انتهای آن استفاده‬
‫می كنیم‪ .‬مثال ‪245L‬یك عدد ‪ long‬محسوب می شود‪.‬‬
‫;‪long int a = 20L‬‬
‫پسوند ‪ U‬در انتهای عدد نیز نشانه بدون عالمت بودن آن است‪.‬‬
‫نكته دیگر آنكه ‪ C‬به شما اجازه می دهد درصورت لزوم ثوابت صحیح خود را در مبنای ‪ 8‬یا ‪ 16‬نیز كه‬
‫از مبناهای متداول در برنامه نویسی هستند‪ ،‬بنویسید‪.‬‬
‫‪‬‬
‫‪‬‬

‫برای نوشتن عدد در مبنای ‪ 8‬باید آن را با ‪ 0‬آغاز كنید‪ ،‬مثال ‪ 0342‬یك عدد در منای ‪ 8‬محسوب می‬
‫گردد‪.‬‬
‫برای نوشتن یك عدد در مبنای ‪ 16‬باید آن را با ‪ 0x‬آغاز نمایید‪ ،‬مانند ‪.0x27A4‬‬

‫‪ 7-4‬ثوابت‬
‫ثوابت عددی اعشاری‬

‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫برای نمایش اعداد اعشاری‪ ،‬باید از نقطه اعشار استفاده كنیم‪ ،‬مانند ‪237.45‬‬
‫اما نكته جالب آنستكه می توانید از نماد علمی نیز برای نمایش اعداد‬
‫اعشاری استفاده كنید‪ .‬برای اینكار كافی است از حرف ‪ e‬برای نمایش قسمت‬
‫توان استفاده نمایید‪ .‬بعنوان مثال ‪:‬‬
‫‪-23.47 × 10 5 = -23.47e5‬‬
‫‪42.389 × 10 -3 = 42.389e-3‬‬
‫دقت كنید كه قسمت توان‪ ،‬حتما یك عدد صحیح است‪.‬‬
‫نكته جالب اینجاست كه برخالف مورد قبل‪ ،‬كامپایلر بطور پیش فرض داده های‬
‫اعشاری را از نوع ‪ double‬فرض می كند‪.‬چنانچه دوست دارید ثابت شما ازنوع‬
‫‪ float‬درنظر گرفته شود‪ ،‬در انتهای آن ‪ F‬قرار دهید‪ .‬ضمنا پسوند ‪ L‬نیز داده‬
‫اعشاری را از نوع ‪ long double‬درنظر می گیرد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫ثوابت كاراكتری ‪:‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫برای نشان دادن ثوابت كاراكتری‪ ،‬آنها را در داخل ' قرار می دهیم‪ .‬بعنوان مثال‬
‫'‪'A‬یك ثابت كاراكتری است‪.‬‬
‫; '‪char ch = 'S‬‬
‫دقت كنید كه همانطور كه قبال گفته شد‪ ،‬كد اسكی كاراكترها در متغیر ذخیره‬
‫می گردد‪ ،‬بنابراین می توان از آن بعنوان یك عدد صحیح نیز استفاده كرد‪ .‬نكته‬
‫مهم دیگر آنستكه به تفاوت عدد ‪ 5‬و كاراكتر '‪ '5‬دقت داشته باشید‪ .‬در حقیقت‬
‫'‪ '5‬برابر است با عدد ‪ 53‬كه همان كد اسكی آن است‪.‬‬
‫روش فوق‪ ،‬برای نمایش کاراکترهای قابل چاپ مناسب است‪ ،‬اما بعضی‬
‫كاراكترها مانند ‪ enter‬قابل نمایش نبوده و برای آنها شکل خاصی وجود ندارد‪.‬‬
‫در چنین مواردی‪ ،‬زبان ‪ C‬از ترکیب عالمت \ به همراه یک کاراکتر دیگر‪ ،‬برای‬
‫نمایش این قبیل کاراکترها استفاده می نماید‪ .‬بعنوان مثال‪ ،‬کاراکتر '‪ '\n‬نشان‬
‫دهنده خط جدید یا همان ‪ enter‬می باشد‪.‬‬
‫جدول صفحه بعد این قبیل کاراکترها و معادل آنها را نشان می دهد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫نحوه نمایش در ‪C‬‬

‫کد اسکی‬

‫صدای بوق کامپیوتر‬

‫‪\a‬‬

‫‪7‬‬

‫حرکت به عقب ‪backspace‬‬

‫‪\b‬‬

‫‪8‬‬

‫شروع صفحه ‪form feed‬‬

‫‪\f‬‬

‫‪12‬‬

‫سطر جدید ‪line feed‬‬

‫‪\n‬‬

‫‪10‬‬

‫برگشت به ابتداي سطر ‪carriage return‬‬

‫‪\r‬‬

‫‪13‬‬

‫فاصله افقی ‪horizontal tab‬‬

‫‪\t‬‬

‫‪9‬‬

‫فاصله عمودی ‪vertical tab‬‬

‫‪\v‬‬

‫‪11‬‬

‫عالمت سوال‬

‫?\‬

‫‪63‬‬

‫عالمت '‬

‫'\‬

‫‪39‬‬

‫عالمت "‬

‫"\‬

‫‪34‬‬

‫عالمت \‬

‫\\‬

‫‪92‬‬

‫عالمت تهی‬

‫‪\0‬‬

‫‪0‬‬

‫نام کاراکتر‬

‫کد اسکی یک کاراکتر با ‪ 3‬رقم در مبنای ‪8‬‬

‫‪\000‬‬

‫کد اسکی یک کاراکتر با ‪ 2‬رقم در مبنای ‪16‬‬

‫‪\x00‬‬

‫‪ 7-4‬ثوابت‬
‫‪‬‬

‫ثوابت رشته ای ‪ C :‬عالوه بر ثوابت فوق‪ ،‬از یك ثابت دیگر بنام رشته نیز‬
‫حمایت می كند‪ .‬رشته‪ ،‬دنباله ای از كاراكترها است كه در داخل " قرار‬
‫می گیرند‪ .‬بعنوان مثال "‪ "this is a test‬یك رشته است‪ .‬دقت كنید كه '‪'a‬‬
‫یك كاراكتر است‪ ،‬اما "‪ "a‬یك رشته است كه فقط شامل یك كاراكتر می‬
‫باشد‪.‬‬

‫‪ 7-5‬عملگرها‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫عملگر‪ ،‬نمادی است كه به كامپایلر می گوید تا عملیات محاسباتی یا‬
‫منطقی خاصی را برروی یك یا چند عملوند‪ ،‬انجام دهد‪.‬‬
‫به عملگرهایی كه فقط یك عملوند دارند‪ ،‬عملگر یكانی می گوییم و‬
‫همواره عملگر در سمت چپ عملوند قرار می گیرد)مانند عدد ‪.(-125‬‬
‫اما عملگرهایی كه برروی دو عملوند اثر می كنند را عملگر دودویی‬
‫نامیده و عملگر را بین دو عملوند قرار می دهیم )مانند ‪.(23+86‬‬
‫هر ترکیب درستی از عملگرها و عملوندها را یک عبارت می نامیم‪.‬‬
‫‪ C‬از نقطه نظر عملگرها یك زبان بسیار قوی است‪ .‬این عملگرها به چند‬
‫دسته اصلی تقسیم می گردند كه آنها را به ترتیب بررسی می كنیم‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫این عملگرها‪ ،‬همان اعمال متداول ریاضی هستند كه در زبان ‪ C‬مورد استفاده‬
‫قرار می گیرند‪ .‬این اعمال عبارتند از ‪:‬‬

‫عمل‬

‫نوع‬

‫عملگر‬

‫منفی كردن عملوند سمت راست‬

‫یكانی‬

‫‪-‬‬

‫جمع دو عملوند‬

‫دودویی‬

‫‪+‬‬

‫تفریق دو عملوند‬

‫دودویی‬

‫‪-‬‬

‫ضرب دو عملوند‬

‫دودویی‬

‫*‬

‫تقسیم دو عملوند‬

‫دودویی‬

‫‪/‬‬

‫محاسبه باقیمانده تقسیم دو عملوند‬

‫دودویی‬

‫‪%‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬
‫‪‬‬

‫این عملگرهای برروی همه انواع داده های ‪ C‬عمل می كنند‪ ،‬بجز عملگر ‪ %‬كه فقط‬
‫برروی نوع داده های صحیح عمل می كند‪.‬‬
‫اما نكته مهمی كه باید به آن اشاره كرد‪ ،‬نحوه كار عملگر تقسیم برروی نوع داده های‬
‫مختلف است‪.‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫درصورتیكه هردو عملوند صحیح باشند‪ ،‬تقسیم بصورت صحیح بر صحیح انجام خواهد شد‪.‬‬
‫اگر یكی یا هر دو عملوند اعشاری باشند‪ ،‬تقسیم بصورت اعشاری انجام خواهد پذیرفت‪.‬‬
‫فرض كنید تعاریف زیر را داریم ‪:‬‬
‫; ‪int a,b‬‬
‫; ‪float c,d‬‬
‫; ‪a = 10 ; b = 4‬‬
‫;‪c = 8.2; d = 4.0‬‬
‫اكنون به نتایج عملیات زیر دقت كنید ‪:‬‬
‫‪a / b => 2‬‬
‫‪c / d => 2.05‬‬
‫‪a / d => 2.5‬‬
‫‪a / 4 => 2‬‬
‫چنانچه به آخرین مورد توجه كنید‪ ،‬متوجه می شوید كه از آنجا كه ‪a‬یك متغیر صحیح است و ‪4‬‬
‫نیز یك ثابت صحیح در نظر گرفته شده‪ ،‬درنتیجه تقسیم بصورت صحیح بر صحیح انجام گرفته‬
‫است‪ .‬چنانچه بخواهیم تقسیم بصورت اعشاری صورت پذیرد‪ ،‬به دو شكل می توانیم عمل‬
‫كنیم‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫برای اینکه عبارت تقسیم صفحه قبل بصورت اعشاری انجام شود‪ ،‬به دو روش‬
‫می توان عمل کرد‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫این عبارت را بصورت ‪ a / 4.0‬بنویسیم‪.‬‬
‫از عملگر قالب ریزی استفاده كنیم‪.‬‬

‫عملگر قالب ریزی می تواند یك نوع را به نوع دیگری تبدیل نماید‪ .‬شكل كلی آن‬
‫به شكل زیر است ‪:‬‬
‫>‪() ‫كه ‪ type‬نوع مورد نظر است كه قصد تبدیل عبارت ‪ expression‬به آن نوع را‬
‫داریم‪ .‬بعنوان مثال در مورد قبلی می توان به شكل زیر عمل كرد ‪:‬‬
‫‪(float) a / 4‬‬
‫در این حالت از كامپایلر خواسته ایم كه ابتدا عدد ‪ a‬را به اعشاری تبدیل كند‬
‫)البته بصورت موقت( و سپس آن را بر ‪ 4‬تقسیم نماید‪ ،‬كه مسلما حاصل‬
‫اعشاری خواهد بود‪.‬‬
‫بطوركلی هرگاه ثابتها و متغیرهایی از انواع مختلف در یك عبارت محاسباتی‬
‫داشته باشیم‪ ،‬كامپایلر ‪ C‬همه آنها را به یك نوع یكسان كه همان بزرگترین‬
‫عملوند موجود است تبدیل خواهد كرد‪ .‬بعنوان مثال به مورد صفحه بعد دقت‬
‫كنید ‪:‬‬

‫ عملگرهای محاسباتی‬7-5-1
char ch;
int i;

float f;
double d;
result = (ch / i)
int

+

(f *d)

(f+i)
float

double

double

int

-

double

double

float

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫اولویت عملگرها ‪ :‬در عبارتی که شامل چندین عملگر است‪ ،‬کدامیک در‬
‫ابتدا اعمال خواهد گردید‪.‬‬
‫اولویت عملگرهای محاسباتی از باال به پایین بشرح زیر است‪:‬‬
‫‪ ‬عملگر یکانی –‬
‫‪ ‬عملگرهای * و ‪ /‬و ‪%‬‬
‫‪ ‬عملگرهای ‪ +‬و –‬
‫چنانچه اولویت دو عملگر یکسان باشد‪ ،‬این عملگرها از چپ به راست‬
‫محاسبه خواهند شد‪.‬‬
‫چنانچه بخواهیم یک عمل با اولویت پایین زودتر انجام شود‪ ،‬باید از پرانتز‬
‫استفاده کنیم‪ .‬بنابراین اولویت عملگر پرانتز از همه موارد فوق‬
‫بیشتراست‪ .‬در مورد پرانتزهای متداخل‪ ،‬ابتدا پرانتز داخلی محاسبه‬
‫می شود؛ اما در مورد پرانتزهای هم سطح‪ ،‬ابتدا پرانتز سمت چپتر‬
‫محاسبه می گردد‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫چند مثال در مورد اولویت عملگرها‬

‫ترتیب اجرای عملگرها‬

‫عبارت زبان ‪C‬‬

‫ابتدا عمل * و سپس عمل ‪+‬‬

‫‪b+c*d‬‬

‫ابتدا عمل ‪ +‬و سپس عمل *‬

‫‪(b + c) * d‬‬

‫ابتدا عمل ‪ /‬سپس عمل * و در انتها عمل ‪+‬‬

‫‪b+c/d*e‬‬

‫ابتدا عمل * سپس عمل ‪ /‬و در انتها عمل ‪+‬‬

‫)‪b + c / (d * e‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫یک مثال کامل در مورد اولویت عملگرها‬

‫‪result = a + b * (f – (g + b) / d) – c * (a – d) / e‬‬
‫‪6‬‬

‫‪1‬‬
‫‪7‬‬

‫‪2‬‬

‫‪8‬‬

‫‪3‬‬
‫‪4‬‬
‫‪5‬‬
‫‪9‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫در زبان ‪ C‬برای انتساب چندین عملگر وجود دارد‪ .‬ساده ترین عملگر انتساب‪ ،‬همان عملگر =‬
‫است که در بسیاری از زبانها استفاده می شود‪ .‬بعنوان مثال ‪:‬‬
‫;‪a = 5‬‬
‫;‪b = c + 2 * d‬‬
‫این عملگر باعث می شود که عبارت سمت راست در عبارت سمت چپ قرار گیرد‪.‬‬
‫توجه کنید که مقدار سمت چپ باید عبارتی باشد که بتوان به آن یک مقدار را نسبت داد‬
‫)مانند یک متغیر( که به آن ‪ Lvalue‬گفته می شود‪ ،‬بنابراین یک ثابت نمی تواند در سمت چپ‬
‫قرار گیرد‪.‬‬
‫نکته دیگر اینکه اولویت عملگر = از عملگرهای ریاضی کمتر است و درنتیجه ابتدا آن عملیات‬
‫انجام شده و در پایان حاصل در عبارت سمت چپ ریخته می شود‪.‬‬
‫الزم به ذکر است که در هنگام انتساب‪ ،‬درصورت لزوم نوع عبارت سمت راست به نوع عبارت‬
‫سمت چپ تبدیل می شود‪ .‬مثال‪:‬‬
‫;‪int a‬‬
‫;‪a = 2.5 * 5.0‬‬
‫که دراینصورت عدد ‪ 12‬در ‪ a‬ذخیره خواهد شد‪.‬‬
‫شرکت پذیری این عملگر از راست به چپ می باشد‪ ،‬بدین معنا که چنانچه چندین عملگر‬
‫نسبت دهی داشته باشیم‪ ،‬این عملگرها از راست به چپ محاسبه می شوند‪ .‬مثال پس از‬
‫اجرای دستور زیر‪ ،‬مقدار هر ‪ 3‬متغیر برابر ‪ 10‬خواهد شد‪.‬‬
‫;‪a = b = c = 10‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬

‫نکته جالب درمورد زبان ‪ C‬آنستکه دارای یک سری عملگرهای انتساب‬
‫خالصه شده است که باعث می شوند در بعضی موارد بتوانیم عبارات‬
‫کوتاهتری را بنویسیم‪ .‬این عملگرها عبارتند از ‪:‬‬
‫عملگرد‬

‫مثال‬

‫عبارت انتساب معادل‬

‫‪++‬‬

‫;‪a ++‬‬

‫;‪a = a + 1‬‬

‫‪--‬‬

‫;‪a --‬‬

‫;‪a = a – 1‬‬

‫=‪+‬‬

‫;‪a += 5‬‬

‫;‪a = a + 5‬‬

‫=‪-‬‬

‫;‪a -= 8‬‬

‫;‪a= a – 8‬‬

‫=*‬

‫;‪a *= 10‬‬

‫;‪a= a * 10‬‬

‫=‪/‬‬

‫;‪a /= 2‬‬

‫;‪a = a / 2‬‬

‫=‪%‬‬

‫;‪a %= 10‬‬

‫;‪a = a % 10‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬
‫‪‬‬

‫عملگر اول و دوم‪ ،‬عملگرهای یکانی هستند که بترتیب عملگر افزایش و عملگر کاهش‬
‫نامیده می شوند‪.‬‬
‫نکته جالب آنستکه این دو عملگر به دوصورت مورد استفاده قرار می گیرند‪.‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫در حالتی که از دستور ;‪ a ++‬استفاده شود به آن پس افزایش می گویند و بدین معناست که‬
‫ابتدا از مقدار فعلی ‪ a‬در عبارت موردنظر استفاده کن و سپس آن را افزایش بده‪.‬‬
‫اما دستور ;‪ ++ a‬که به آن پیش افزایش گفته می شود‪ ،‬ابتدا ‪ a‬را افزایش داده و سپس از آن‬
‫در عبارت استفاده می کند‪.‬‬
‫به برنامه زیر دقت کنید‪:‬‬

‫>‪#include ‫{ )(‪void main‬‬
‫; ‪int a ,b‬‬
‫;‪a=5‬‬
‫;‪b = a ++‬‬
‫;)‪printf(“a=%d and b=%d \n”,a,b‬‬
‫;‪a=5‬‬
‫;‪b = ++ a‬‬
‫;)‪printf(“a=%d and b=%d \n”,a,b‬‬
‫}‬
‫‪a=6 b=5‬‬
‫‪a=6 b=6‬‬

‫‪ 7-5-3‬عملگرهای مقایسه ای‬
‫‪‬‬

‫‪‬‬

‫این عملگرها دو عبارت را بایکدیگر مقایسه کرده و نتیجه را باز می گردانند‪.‬‬
‫نتیجه می تواند درست )‪ (true‬یا غلط )‪ (false‬باشد‪.‬‬
‫نتیجه این عملگرها یک عدد صحیح است که درصورت درست بودن ‪ 1‬و‬
‫درصورت غلط بودن ‪ 0‬باز می گردانند‪ .‬این عملگرها عبارتند از‪:‬‬
‫عملگر‬

‫مفهوم عملگر‬

‫مثال‬

‫<‬

‫بزرگتر )<(‬

‫‪a>b‬‬

‫>‬

‫کوچکتر )>(‬

‫‪a
‫=<‬

‫بزرگتر یا مساوی )≤(‬

‫‪a >= b‬‬

‫=>‬

‫کوچکتر یا مساوی )≥(‬

‫‪a <= b‬‬

‫==‬

‫مساوی )=(‬

‫‪a == b‬‬

‫=!‬

‫نامساوی )≠(‬

‫‪a != b‬‬

‫‪ 7-5-3‬عملگرهای مقایسه ای‬
‫‪‬‬

‫‪‬‬

‫نکته مهمی که باید به آن دقت کرد عملگر مساوی )==( است‪ ،‬چرا که یک‬
‫اشتباه بسیار متداول برنامه نویسان ‪ C‬استفاده اشتباه از عملگر انتساب‬
‫)=( بجای عملگر تساوی )==( است که باعث ایجاد خطا در برنامه می‬
‫شود‪.‬‬
‫اولویت این عملگرها از باال به پایین بشرح زیر است‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫عملگرهای <‪ <= ، > ،‬و =>‬
‫عملگرهای == و =!‬

‫الزم بذکر است که در هنگام مساوی بودن اولویت چند عملگر‪ ،‬این عملگرها‬
‫از چپ به راست محاسبه می گردند‪.‬‬

‫‪ 7-5-4‬عملگرهای منطقی‬
‫‪‬‬

‫این عملگرها به شما اجازه می دهند که شرطهای ساده ای را که با‬
‫استفاده از عملگرهای مقایسه ای ایجاد شده اند را با یکدیگر ترکیب نموده‬
‫و شرطهای پیچیده تری را بسازید‪ .‬این عملگرها عبارتند از ‪:‬‬
‫مثال‬

‫عملگر‬

‫مفهوم عملگر‬

‫نحوه کار‬

‫&&‬

‫‪ AND‬منطقی‬

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

‫‪a>0 && sw==1‬‬

‫||‬

‫‪ OR‬منطقی‬

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

‫‪a<=100 || b!=0‬‬

‫!‬

‫‪ NOT‬منطقی‬

‫اگر عملوند درست باشد‪ ،‬نادرست و‬
‫اگر نادرست باشد‪ ،‬درست برمی‬
‫گرداند‪.‬‬

‫)‪! (a==1 || b<10‬‬

‫‪ 7-5-5‬عملگر شرطی‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫گاهی الزم است که ابتدا یک شرط بررسی شده و سپس برمبنای نتیجه )درست یا نادرست بودن آن( یکی‬
‫از دو عبارت ممکن بازگردانده شود‪ .‬برای اینکار می توان از یک عملگر ‪3‬تایی )با ‪ 3‬عملوند( بنام عملگر‬
‫شرطی استفاده نمود‪.‬‬
‫شکل کلی این عملگر بصورت زیر است‪:‬‬
‫>عبارت‪> :<2‬عبارت‪> ?<1‬شرط<‬
‫نحوه کار بدینصورت است که درصورت درست بودن شرط‪ ،‬عبارت‪ 1‬و در غیراینصورت عبارت ‪ 2‬بازگردانده می‬
‫شود‪.‬‬
‫به عنوان مثال به دستور زیر توجه کنید‪:‬‬
‫که این عبارت معادل دستور زیر است‪:‬‬

‫‪‬‬

‫;‪a = (k<10) ? 100 : 50‬‬
‫;‪if (k<10) a=100‬‬
‫;‪else a=50‬‬

‫البته این عبارت به شکلهای پیچیده نیز می تواند مورد استفاده قرار گیرد‪ .‬مثال ‪:‬‬
‫;‪c += (a>0 && a<10) ? ++a : a/b‬‬
‫که معادل است با ‪:‬‬
‫{ )‪if (a>0 && a<10‬‬
‫;‪a= a + 1‬‬
‫;‪c = c + a‬‬
‫}‬
‫;‪else c = c + a/b‬‬

‫‪ 7-5-6‬اولویت عملگرها‬
‫عملگر‬

‫اولویت‬

‫شرکت پذیری‬

‫‪1‬‬

‫)(‬

‫از چپ به راست‬

‫‪2‬‬

‫‪- + ! -- ++‬‬

‫از راست به چپ‬

‫‪3‬‬

‫‪* / %‬‬

‫از چپ به راست‬

‫‪4‬‬

‫‪+ -‬‬

‫از چپ به راست‬

‫‪5‬‬

‫>> <<‬

‫از چپ به راست‬

‫‪6‬‬

‫>= > <= <‬

‫از چپ به راست‬

‫‪7‬‬

‫=! ==‬

‫از چپ به راست‬

‫‪8‬‬

‫&&‬

‫از چپ به راست‬

‫‪9‬‬

‫||‬

‫از چپ به راست‬

‫‪10‬‬

‫‪?:‬‬

‫از راست به چپ‬

‫‪11‬‬

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

‫از راست به چپ‬

‫‪12‬‬

‫‪,‬‬

‫از چپ به راست‬

‫‪ 7-6‬خواندن و نمایش اطالعات‬
‫‪‬‬

‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫همانطور كه قبال نیز گفته شد‪ ،‬یكی از اهداف زبان ‪ C‬قابل حمل بودن آن‬
‫است‪ .‬بهمین منظور سعی شده است كه از دستوراتی كه ممكن است‬
‫وابسته به ماشین خاصی باشد‪ ،‬اجتناب گردد‪.‬‬
‫بهمین دلیل زبان ‪ C‬برخالف سایر زبانها دارای هیچ دستوری برای‬
‫خواندن از ورودی و یا نوشتن در خروجی نیست‪.‬‬
‫اما در عوض دارای تعدادی تابع )زیربرنامه( استاندارد می باشد كه تقریبا‬
‫تمامی كامپایلرها از آنها حمایت می كنند‪.‬‬
‫این كار به كامپایلر این امكان را می دهد كه بر حسب نوع سخت افزار‬
‫موردنظر‪ ،‬توابع ورودی و خروجی را طراحی نماید‪.‬‬
‫این توابع در یك فایل سرآمد بنام ‪ stdio.h‬تعریف شده اند و بنابراین قبل‬
‫ازاینكه بتوانید از این توابع استفاده نمایید‪ ،‬باید این فایل را نیز با استفاده‬
‫از ‪ #include‬در برنامه خود بگنجانید‪.‬‬

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫برای نمایش اطالعات در خروجی از تابع ‪ printf‬استفاده می شود‪.‬‬
‫این تابع رشته موردنظر شما را به خروجی استاندارد )كه در حالت‬
‫عادی همان صفحه نمایش یا مانیتور است( می فرستد‪ .‬شكل كلی این‬
‫تابع بصورت زیر است‪:‬‬
‫; )>لیست متغیرها< ‪> ,‬رشته كنترلی<(‪printf‬‬
‫رشته كنترلی همان متنی است كه قصد چاپ آن را داریم‪ ،‬با ذكر این‬
‫نكته كه در قسمتهایی كه باید مقدار یك متغیر چاپ شود‪ ،‬از یك‬
‫مشخصه تبدیل استفاده می شود‪ .‬هر مشخصه تبدیل از یك عالمت ‪%‬‬
‫بعالوه یك كاراكتر كه نوع متغیر مورد نظر را نشان می دهد تشكیل می‬
‫گردد‪.‬‬
‫لیست متغیرها نیز همان متغیرهایی هستند كه قصد چاپ آنها را داریم‪.‬‬
‫این متغیرها باید بترتیب قرار گرفته و با كاما )‪ (,‬از یكدیگر جدا شوند‪.‬‬

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫مشخصه تبدیل‬

‫مفهوم‬

‫‪%c‬‬

‫كاراكتر‬

‫‪%d‬‬

‫عدد صحیح در مبنای ‪10‬‬

‫‪%f‬‬

‫عدد اعشاری بدون نماد علمی‬

‫‪%e‬‬

‫عدد اعشاری با نماد علمی‬

‫‪%g‬‬

‫عدد اعشاری با حالت كوتاهتر بین ‪ e‬و ‪f‬‬

‫‪%s‬‬

‫رشته‬

‫‪%ld‬‬

‫عدد صحیح بزرگ‬

‫‪%lf %le %lg‬‬

‫عدد اعشاری بزرگ‬

‫‪%o‬‬

‫عدد صحیح در مبنای ‪8‬‬

‫‪%x‬‬

‫عدد صحیحی در مبنای ‪16‬‬

‫‪%u‬‬

‫عدد صحیح بدون عالمت‬

‫ تابع نمایش در خروجی‬7-6-1
#include
void main() {
int age = 20;
floate average = 18.23;
printf("You are %d years old and your average is %f \n",age,average);
}
You are 20 years old and your average is 18.230000

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫‪‬‬
‫‪‬‬

‫برای کنترل نحوه چاپ اعداد می توانید از مشخصه طول میدان استفاده‬
‫کنید‪.‬‬
‫مشخصه طول میدان برای اعداد به شكل زیر استفاده می شود‪:‬‬
‫‪ ‬برای اعداد صحیح از ‪ %nd‬استفاده می كنیم كه ‪ n‬تعداد ارقام را نشان‬
‫می دهد )مثال ‪ .(%3d‬در اینصورت برای هر متغیر ‪ n‬رقم درنظر گرفته‬
‫می شود‪ .‬اگر اندازه عدد از ‪ n‬كوچكتر باشد‪ ،‬به سمت چپ آن فضای‬
‫خالی اضافه می شود و اگر اندازه عدد بیش از ‪ n‬رقم باشد‪ ،‬طول میدان‬
‫نادیده گرفته شده و عدد بطور كامل چاپ می شود‪.‬‬
‫‪ ‬برای اعداد اعشاری از ‪ %n.mf‬استفاده می كنیم كه ‪ n‬اندازه كل عدد‬
‫)شامل عالمت ممیز( و ‪ m‬تعداد ارقام اعشار است )مثال ‪ .(%5.2f‬در‬
‫صورتیكه تعداد ارقام اعشاری عدد موردنظر از ‪ m‬بیشتر باشد‪ ،‬عدد به ‪m‬‬
‫عدد اعشار گرد می شود و در صورتیكه از ‪ m‬كمتر باشد‪ ،‬در سمت‬
‫راست آن ‪ 0‬قرار داده می شود‪.‬‬

‫‪ 7-6-2‬تابع خواندن از ورودی‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای خواندن اطالعات از ورودی از تابع ‪ scanf‬استفاده می شود‪.‬‬
‫این تابع اطالعات را ازورودی استاندارد )معموال صفحه كلید( خوانده و در‬
‫متغیرهای تعیین شده قرار می دهد‪.‬‬
‫شكل كلی این تابع بصورت زیر است‪:‬‬
‫; )>لیست آدرسهای متغیرها< ‪> ,‬رشته كنترلی<(‪scanf‬‬
‫همانطور كه می بینید نحوه احضار تابع ‪ scanf‬نیز مشابه ‪ printf‬است‪ .‬تنها‬
‫تفاوت در آن است كه در ‪ scanf‬باید لیست آدرسهای متغیرها ارسال شود‪.‬‬
‫مبحث مربوط به آدرسها در فصول بعدی بررسی خواهد شد ولی در حال حاضر‬
‫بخاطر بسپارید كه برای بدست آوردن آدرس یك متغیر از عالمت & استفاده می‬
‫كنیم‪ .‬بعنوان مثال ‪ &age‬بمعنای آدرس متغیر ‪ age‬است‪.‬‬
‫بطور كلی در ‪ C‬قدیمی هرگاه كه یك تابع دارای پارامترهای خروجی بود )یعنی‬
‫پارامترهایی كه یك مقدار را باز می گرداندند( از آدرس متغیرها استفاده می‬
‫شد كه امروزه این مسئله وجود ندارد‪.‬‬

‫ تابع خواندن از ورودی‬7-6-2
#include
void main() {
int age;
float average ;
printf("Please enter your age and average : ");
scanf("%d %f",&age,&average);
printf("You are %d years old and your average is %5.2f \n",age,average);
}

Please enter your age and average : 19 16.72
You are 19 years old and your average is 16.72

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫زبان ‪ C++‬یک زبان شی گرا است‪ ،‬بهمین دلیل در این زبان برای ورودی‬
‫و خروجی از اشیاء بجای توابع استفاده می گردد‪.‬‬
‫از آنجا که امروزه معموال برنامه نویسان ‪ C‬از کامپایلرهای ‪ C++‬استفاده‬
‫می کنند‪ ،‬می توانند از اشیای ورودی و خروجی آن نیز استفاده کنند‪.‬‬
‫اینکار در بین بسیاری از برنامه نویسان ‪ C‬متداول است‪ ،‬بهمین دلیل ما‬
‫در اینجا نحوه کار با اشیای خواندن و نوشتن در ‪ C++‬را بطور مقدماتی‬
‫توضیح می دهیم؛ گرچه توضیح کامل این موارد نیاز به آشنایی با شی‬
‫گرایی و زبان ‪ C++‬دارد‪.‬‬
‫قبل از هرچیز الزم به ذکر است که کلیه اشیای مربوط به ورودی و‬
‫خروجی در فایل سرآمدی بنام ‪ iostream.h‬تعیریف شده اند‪ ،‬بنابراین‬
‫ابتدا باید این فایل به برنامه توسط دستور ‪ #include‬الحاق گردد‪.‬‬

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫زبان ‪ C++‬برای نمایش اطالعات از یک شیئ بنام ‪ cout‬استفاده می نماید‪.‬‬
‫برای ارسال اطالعات مورد نظر برای چاپ به ‪ cout‬باید از عملگر درج در جریان‬
‫یا >> استفاده نماییم‪ .‬بعنوان مثال ‪:‬‬
‫; ” ‪cout >> “Please enter your name:‬‬
‫و یا مثال دیگر ‪:‬‬
‫;‪int a = 10‬‬
‫;‪float b = 2.86‬‬
‫;‪cout << a‬‬
‫;‪cout << b‬‬
‫نکته جالبی که در این مثالها دیده می شود‪ ،‬آنستکه برخالف تابع ‪ printf‬هیچ‬
‫نیازی به مشخص کردن نوع متغیری که قصد چاپ آن را داریم نیست و خود‬
‫شئ ‪ cout‬نوع آن را تشخیص می دهد‪.‬‬
‫عالوه براین می توان چندین عملگر درج در جریان را با یکدیگر الحاق کرد و‬
‫چندین متغیر را با یک دستور چاپ کرد‪.‬‬

C++ ‫ ورودی و خروجی اطالعات در‬7-6-3
#include
void main() {
int age = 20;
floate average = 18.23;
cout >> “You are ” >> age >> “ years old and your average is ” >> average ;
}

You are 20 years old and your average is 18.230000

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای دریافت اطالعات از کاربر‪ ،‬از شئ دیگری بنام ‪ cin‬استفاده می شود‪.‬‬
‫برای ارسال متغیر مورد نظر به ‪ cin‬باید از عملگر استخراج از جریان یا <<‬
‫استفاده نماییم‪ .‬بعنوان مثال‪:‬‬
‫;‪int a‬‬
‫;‪cin >> a‬‬
‫بازهم همانطور که می بینید نیازی به تعیین نوع متغیر موردنظر نیست و خود‬
‫شئ ‪ cin‬نوع متغیر را بطور اتوماتیک تشخیص داده و داده ای از همان نوع را از‬
‫کاربر دریافت و در متغیر مورد نظر قرار می دهد‪.‬‬
‫عملگرهای استخراج از جریان را نیز می توان با یکدیگر الحاق کرد‪.‬‬
‫برای رفتن به خط بعد در شئ ‪ cout‬می توان از دستکاری کننده ‪ endl‬استفاده‬
‫کرد‪ .‬مثال در دستور زیر پس از چاپ پیغام‪ ،‬مکان نما به خط بعد منتقل می‬
‫شود‪:‬‬
‫;‪cout >> “List of students : “ >> endl‬‬
‫البته دستکاری کننده های متعدد دیگری نیز ازجمله موارد مربوط به تعیین طول‬
‫میدان و نحوه چاپ مقادیر وجود دارد که توضیح آنها نیاز به یک مبحث مستقل‬
‫دارد‪.‬‬

C++ ‫ ورودی و خروجی اطالعات در‬7-6-3
#include
void main() {
int age;
float average ;
cout << "Please enter your age and average : " ;
cin >> age >> average ;
cout << "You are " << age << "years old and your average is " << average;
}

Please enter your age and average : 19 16.72
You are 19 years old and your average is 16.72

‫‪ 7-7‬توابع کتابخانه ای‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫همانطور که قبال نیز گفته شد‪ ،‬زبان ‪ C‬از زیر برنامه ها نیز حمایت می کند‪ .‬هر زیر برنامه‬
‫در ‪ C‬یک تابع نامیده می شود‪ .‬تا کنون با توابعی همچون ‪ main‬و یا ‪ printf‬و ‪ scanf‬آشنا‬
‫شده ایم‪.‬‬
‫معموال عرضه کنندگان کامپایلرها و یا سایر فروشندگان نرم افزار‪ ،‬برخی از توابع عمومی‬
‫را که ممکن است مورد نیاز جمع کثیری از برنامه نویسان مختلف باشد را در قالب‬
‫کتابخانه ای از توابع در اختیار برنامه نویسان می گذارند‪ .‬بعضی از این توابع کتابخانه ای‬
‫مانند ‪ printf‬و ‪ scanf‬بصورت استاندارد درآمده و توسط عرضه کنندگان مختلف ارائه می‬
‫شوند‪.‬‬
‫در کامپایلر عرضه شده توسط شرکت بورلند )‪ (Borland C++ 3.1‬نیز کتابخانه های‬
‫متعددی از توابع برای شما عرضه شده اند که بتدریج با آنها و کاربردشان آشنا خواهید‬
‫شد‪.‬‬
‫نکته مهم آنستکه برای استفاده از این توابع ابتدا باید فایل سرآمد مربوط به آنها را نیز در‬
‫ابتدای برنامه خود اضافه نمایید ) با استفاده از ‪ .(#include‬هر فایل سرآمد شامل تعاریف‬
‫اولیه گروهی از توابع مرتبط با هم و داده های مربوط به آنها بوده و در استاندارد قدیمی‬
‫تر دارای پسوند ‪ .h‬می باشد)در استاندارد جدید پسوند این فایلها حذف شده است(‪.‬‬
‫برخی از این فایلهای سرآمد عبارتند از‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪ : stdio.h‬توابع ورودی و خروجی استاندارد‬
‫‪ : math.h‬توابع ریاضی‬
‫‪ : graphics.h‬توابع مربوط به عملیات گرافیکی‬
‫‪ : string.h‬توابع مربوط به کار با رشته ها‬


Slide 16

‫مبانی کامپیوتر و برنامه سازی‬
‫فصل هفتم ‪ :‬مفاهیم اولیه زبان ‪C‬‬
‫مدرس ‪ :‬نگین معروفی‬

‫‪ 7-1‬شناسه ها در ‪C‬‬
‫‪‬‬
‫‪‬‬

‫شناسه )‪ (identifier‬نامی است که به یک قسمت از برنامه مانند متغیر‪ ،‬تابع‪ ،‬ثابت و یا‬
‫‪ ...‬داده می شود‪.‬‬
‫در زبان ‪ C‬برای انتخاب شناسه ها فقط می توان از عالئم زیر استفاده کرد‪:‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫حروف انگلیسی کوچک و بزرگ )‪(A…Z a…z‬‬
‫ارقام )‪(0…9‬‬
‫عالمت خط پایین یا _‬

‫البته یک شناسه نمی تواند با یک رقم شروع شود‪.‬‬
‫چند شناسه مجاز‪ name2 ، average ، sum :‬و ‪student_average‬‬
‫چند شناسه غیرمجاز ‪ 2name‬و یا ‪student average‬‬
‫در برنامه نویسی امروزی پیشنهاد می شود بجای شناسه هایی همانند‬
‫‪ student_average‬از ‪ studentAverage‬استفاده گردد‪.‬‬
‫نکته مهم دیگری که باید به آن اشاره کرد آنستکه زبان ‪ C‬برخالف بسیاری از زبانهای دیگر‬
‫به کوچک و بزرگی حروف حساس است )‪ .(case sensitive‬در نتیجه شناسه های زیر با‬
‫یکدیگر متفاوتند ‪:‬‬
‫‪Sum ≠ sum ≠ SUM‬‬
‫آخرین نکته اینستکه در هنگام انتخاب شناسه نمی توانید از کلمات کلیدی که برای‬
‫منظورهای خاص در زبان ‪ C‬رزرو شده اند استفاده کنید‪.‬‬

C ‫ شناسه ها در‬7-1
: C ‫کلمات کلیدی در زبان‬
auto

break

case

char

const

continue

default

do

double

else

enum

extern

float

for

goto

if

int

long

register

return

short

signed

sizeof

static

struct

switch

typedef

union

unsigned

void

volatile

while

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫محدوده‬

‫اندازه )بیت(‬

‫توضیح‬

‫نوع داده‬

‫‪-128 to +127‬‬

‫‪8‬‬

‫کاراکتر‬

‫‪char‬‬

‫‪-32768 to +32767‬‬

‫‪16‬‬

‫عدد صحیح‬

‫‪int‬‬

‫‪3.4e-38 to 3.4e+38‬‬

‫‪32‬‬

‫عدد اعشاری‬

‫‪float‬‬

‫‪1.7e-308 to 1.7e+308‬‬

‫‪64‬‬

‫عدد اعشاری با‬
‫دقت مضاعف‬

‫‪double‬‬

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫‪‬‬

‫البته چند نکته مهم درمورد این جدول قابل ذکر است ‪:‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫اندازه ‪ int‬در محیطهای ‪ 16‬بیتی مانند ‪ DOS‬برابر ‪ 16‬بیت است‪ .‬اما در‬
‫محیطهای ‪ 32‬بیتی همانند ‪ Windows‬اندازه آن ‪ 32‬بیت می باشد که در‬
‫اینصورت محدوده ای برابر ‪ -2,147,483,648‬تا ‪ +2,147,483,647‬را‬
‫پوشش می دهد‪.‬‬
‫در بعضی از کامپایلرهای ‪ ،C‬نوع داده ‪ bool‬نیز وجود دارد که می تواند‬
‫یکی از مقادیر ‪)true‬درست( یا ‪) false‬غلط( را نشان دهد ‪ .‬اما در نسخه‬
‫های اولیه ‪ C‬از همان نوع داده صحیح یا ‪ int‬برای اینکار استفاده می‬
‫شد‪ .‬بدین صورت که ‪ 0‬نشاندهنده ‪ false‬و هر عدد غیر صفر )معموال ‪(1‬‬
‫نشاندهنده ‪ true‬است‪.‬‬
‫از آنجا که برای ذخیره سازی کاراکترها کد اسکی آنها ذخیره می گردد‪،‬‬
‫از یک متغیر کاراکتری یا ‪ char‬می توان بعنوان یک عدد صحیح کوچک نیز‬
‫استفاده کرد و اعمال ریاضی برروی آنها نیز مجاز است‪.‬‬

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫عالوه براین چندین اصالح کننده نیز وجود دارد که به ما اجازه می دهد نوع داده مورد‬
‫نظر را با دقت بیشتری برای نیازهای مختلف استفاده نماییم‪.‬‬
‫این اصالح کننده ها عبارتند از ‪short, long, signed, unsigned :‬‬
‫تمام این اصالح کننده ها می توانند به نوع داده ‪ int‬اعمال شوند و اثر آنها بستگی‬
‫به محیط دارد‪.‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫در یک محیط ‪16‬بیتی‪short int ،‬بازهم برابر ‪16‬بیت است ولی ‪ long int‬برابر‪32‬بیت می‬
‫باشد‪.‬‬
‫‪ unsigned int‬باعث می شود که یک عدد ‪ 16‬بیتی بدون عالمت داشته باشیم که بازه‬
‫بین ‪ 0‬تا ‪ 65535‬را پوشش می دهد‪ signed int .‬نیز همانند ‪ int‬معمولی بوده و تفاوتی‬
‫ندارد‪.‬‬
‫ترکیب این اصالح کننده ها نیز ممکن است‪ .‬مثال ‪ unsigned long int‬یک عدد ‪ 32‬بیتی‬
‫بدون عالمت است که بازه ‪ 0‬تا ‪ 4,294,967,295‬را پوشش می دهد‪.‬‬

‫برروی نوع داده ‪ char‬فقط اصالح کننده های ‪ signed‬و ‪ unsigned‬را می توان اعمال‬
‫کرد‪ .‬معموال از اصالح کننده ‪ unsigned‬وقتی استفاده می شود که قصد داشته‬
‫باشیم از ‪ char‬بعنوان یک عدد صحیح مثبت بین ‪ 0‬تا ‪ 255‬استفاده کنیم‪.‬‬
‫برروی نوع داده ‪ double‬تنها اصالح کننده ‪ long‬قابل اعمال است و دراینصورت عدد‬
‫اعشاری با ‪ 80‬بیت را خواهیم داشت که قادر است هر عددی در بازه ‪ 3.4e-4932‬تا‬
‫‪ 1.1e+4932‬را در خود نگاه دارد‪.‬‬

‫‪ 7-3‬تعریف متغیرها‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای تعریف متغیرها به شکل زیر عمل می کنیم‪:‬‬

‫;>‪ ‫که ‪ type‬یکی از نوع داده های گفته شده و ‪ variable-list‬لیستی از متغیرها است‬
‫که با کاما از یکدیگر جدا شده اند‪ .‬بعنوان مثال ‪:‬‬
‫;‪int sum‬‬
‫;‪float average‬‬
‫; ‪long int a, b, c‬‬
‫; ‪unsigned long int i, j, k‬‬
‫عالوه براین می توان در هنگام تعریف متغیر به آن مقدار اولیه نیز داد‪ .‬مثال ‪:‬‬
‫; ‪int d = 0‬‬
‫نكته مهم آنكه زبان ‪ C‬به متغیرها مقدار اولیه نمي دهد )حتي ‪ (0‬و برنامه نويس‬
‫خود بايد اينكار را صريحا انجام دهد‪ ،‬درغیر اينصورت مقدار اولیه متغیر‪ ،‬نامعین خواهد‬
‫بود‪.‬‬
‫تعریف متغیرها طبق اصول زبان ‪ C‬میتواند درهرجایی از برنامه صورت پذیرد‪ ،‬و‬
‫متغیرهای تعریف شده از همان خط به بعد قابل استفاده خواهد بود‪ .‬اما معموال‬
‫توصیه می گردد كه تعریف متغیرها در همان خط ابتدایی تابع و بالفاصله پس از {‬
‫صورت پذیرد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫‪‬‬
‫‪‬‬

‫ثابتها مقادیر ثابتی هستند كه مقدار آنها در حین اجرای برنامه تغییر نمی یابد‪ .‬ثابتها می توانند از‬
‫هریك از نوع داده های اصلی باشند‪.‬‬
‫ثوابت عددی صحیح ‪:‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫برای نمایش این دسته از ثوابت‪ ،‬از دنباله ای از ارقام بعالوه عالمت ‪ +‬یا ‪ -‬استفاده می كنیم‪ .‬بعنوان مثال‬
‫‪ -45‬و یا ‪ 3489‬ثوابت صحیح هستند‪.‬‬
‫در حالت عادی ‪ C‬هر عدد را در كوچكترین نوع داده ای كه می تواند قرار می دهد‪ .‬مثال عدد ‪ 85‬در یك‬
‫‪ int‬قرار می گیرد‪ ،‬اما عدد ‪ 145398‬در یك ‪ long int‬قرار خواهد گرفت‪.‬‬
‫اگر قصد دارید یك عدد كوچك بعنوان ‪ long‬محسوب گردد‪ ،‬می توانید از پسوند ‪ L‬در انتهای آن استفاده‬
‫می كنیم‪ .‬مثال ‪245L‬یك عدد ‪ long‬محسوب می شود‪.‬‬
‫;‪long int a = 20L‬‬
‫پسوند ‪ U‬در انتهای عدد نیز نشانه بدون عالمت بودن آن است‪.‬‬
‫نكته دیگر آنكه ‪ C‬به شما اجازه می دهد درصورت لزوم ثوابت صحیح خود را در مبنای ‪ 8‬یا ‪ 16‬نیز كه‬
‫از مبناهای متداول در برنامه نویسی هستند‪ ،‬بنویسید‪.‬‬
‫‪‬‬
‫‪‬‬

‫برای نوشتن عدد در مبنای ‪ 8‬باید آن را با ‪ 0‬آغاز كنید‪ ،‬مثال ‪ 0342‬یك عدد در منای ‪ 8‬محسوب می‬
‫گردد‪.‬‬
‫برای نوشتن یك عدد در مبنای ‪ 16‬باید آن را با ‪ 0x‬آغاز نمایید‪ ،‬مانند ‪.0x27A4‬‬

‫‪ 7-4‬ثوابت‬
‫ثوابت عددی اعشاری‬

‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫برای نمایش اعداد اعشاری‪ ،‬باید از نقطه اعشار استفاده كنیم‪ ،‬مانند ‪237.45‬‬
‫اما نكته جالب آنستكه می توانید از نماد علمی نیز برای نمایش اعداد‬
‫اعشاری استفاده كنید‪ .‬برای اینكار كافی است از حرف ‪ e‬برای نمایش قسمت‬
‫توان استفاده نمایید‪ .‬بعنوان مثال ‪:‬‬
‫‪-23.47 × 10 5 = -23.47e5‬‬
‫‪42.389 × 10 -3 = 42.389e-3‬‬
‫دقت كنید كه قسمت توان‪ ،‬حتما یك عدد صحیح است‪.‬‬
‫نكته جالب اینجاست كه برخالف مورد قبل‪ ،‬كامپایلر بطور پیش فرض داده های‬
‫اعشاری را از نوع ‪ double‬فرض می كند‪.‬چنانچه دوست دارید ثابت شما ازنوع‬
‫‪ float‬درنظر گرفته شود‪ ،‬در انتهای آن ‪ F‬قرار دهید‪ .‬ضمنا پسوند ‪ L‬نیز داده‬
‫اعشاری را از نوع ‪ long double‬درنظر می گیرد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫ثوابت كاراكتری ‪:‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫برای نشان دادن ثوابت كاراكتری‪ ،‬آنها را در داخل ' قرار می دهیم‪ .‬بعنوان مثال‬
‫'‪'A‬یك ثابت كاراكتری است‪.‬‬
‫; '‪char ch = 'S‬‬
‫دقت كنید كه همانطور كه قبال گفته شد‪ ،‬كد اسكی كاراكترها در متغیر ذخیره‬
‫می گردد‪ ،‬بنابراین می توان از آن بعنوان یك عدد صحیح نیز استفاده كرد‪ .‬نكته‬
‫مهم دیگر آنستكه به تفاوت عدد ‪ 5‬و كاراكتر '‪ '5‬دقت داشته باشید‪ .‬در حقیقت‬
‫'‪ '5‬برابر است با عدد ‪ 53‬كه همان كد اسكی آن است‪.‬‬
‫روش فوق‪ ،‬برای نمایش کاراکترهای قابل چاپ مناسب است‪ ،‬اما بعضی‬
‫كاراكترها مانند ‪ enter‬قابل نمایش نبوده و برای آنها شکل خاصی وجود ندارد‪.‬‬
‫در چنین مواردی‪ ،‬زبان ‪ C‬از ترکیب عالمت \ به همراه یک کاراکتر دیگر‪ ،‬برای‬
‫نمایش این قبیل کاراکترها استفاده می نماید‪ .‬بعنوان مثال‪ ،‬کاراکتر '‪ '\n‬نشان‬
‫دهنده خط جدید یا همان ‪ enter‬می باشد‪.‬‬
‫جدول صفحه بعد این قبیل کاراکترها و معادل آنها را نشان می دهد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫نحوه نمایش در ‪C‬‬

‫کد اسکی‬

‫صدای بوق کامپیوتر‬

‫‪\a‬‬

‫‪7‬‬

‫حرکت به عقب ‪backspace‬‬

‫‪\b‬‬

‫‪8‬‬

‫شروع صفحه ‪form feed‬‬

‫‪\f‬‬

‫‪12‬‬

‫سطر جدید ‪line feed‬‬

‫‪\n‬‬

‫‪10‬‬

‫برگشت به ابتداي سطر ‪carriage return‬‬

‫‪\r‬‬

‫‪13‬‬

‫فاصله افقی ‪horizontal tab‬‬

‫‪\t‬‬

‫‪9‬‬

‫فاصله عمودی ‪vertical tab‬‬

‫‪\v‬‬

‫‪11‬‬

‫عالمت سوال‬

‫?\‬

‫‪63‬‬

‫عالمت '‬

‫'\‬

‫‪39‬‬

‫عالمت "‬

‫"\‬

‫‪34‬‬

‫عالمت \‬

‫\\‬

‫‪92‬‬

‫عالمت تهی‬

‫‪\0‬‬

‫‪0‬‬

‫نام کاراکتر‬

‫کد اسکی یک کاراکتر با ‪ 3‬رقم در مبنای ‪8‬‬

‫‪\000‬‬

‫کد اسکی یک کاراکتر با ‪ 2‬رقم در مبنای ‪16‬‬

‫‪\x00‬‬

‫‪ 7-4‬ثوابت‬
‫‪‬‬

‫ثوابت رشته ای ‪ C :‬عالوه بر ثوابت فوق‪ ،‬از یك ثابت دیگر بنام رشته نیز‬
‫حمایت می كند‪ .‬رشته‪ ،‬دنباله ای از كاراكترها است كه در داخل " قرار‬
‫می گیرند‪ .‬بعنوان مثال "‪ "this is a test‬یك رشته است‪ .‬دقت كنید كه '‪'a‬‬
‫یك كاراكتر است‪ ،‬اما "‪ "a‬یك رشته است كه فقط شامل یك كاراكتر می‬
‫باشد‪.‬‬

‫‪ 7-5‬عملگرها‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫عملگر‪ ،‬نمادی است كه به كامپایلر می گوید تا عملیات محاسباتی یا‬
‫منطقی خاصی را برروی یك یا چند عملوند‪ ،‬انجام دهد‪.‬‬
‫به عملگرهایی كه فقط یك عملوند دارند‪ ،‬عملگر یكانی می گوییم و‬
‫همواره عملگر در سمت چپ عملوند قرار می گیرد)مانند عدد ‪.(-125‬‬
‫اما عملگرهایی كه برروی دو عملوند اثر می كنند را عملگر دودویی‬
‫نامیده و عملگر را بین دو عملوند قرار می دهیم )مانند ‪.(23+86‬‬
‫هر ترکیب درستی از عملگرها و عملوندها را یک عبارت می نامیم‪.‬‬
‫‪ C‬از نقطه نظر عملگرها یك زبان بسیار قوی است‪ .‬این عملگرها به چند‬
‫دسته اصلی تقسیم می گردند كه آنها را به ترتیب بررسی می كنیم‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫این عملگرها‪ ،‬همان اعمال متداول ریاضی هستند كه در زبان ‪ C‬مورد استفاده‬
‫قرار می گیرند‪ .‬این اعمال عبارتند از ‪:‬‬

‫عمل‬

‫نوع‬

‫عملگر‬

‫منفی كردن عملوند سمت راست‬

‫یكانی‬

‫‪-‬‬

‫جمع دو عملوند‬

‫دودویی‬

‫‪+‬‬

‫تفریق دو عملوند‬

‫دودویی‬

‫‪-‬‬

‫ضرب دو عملوند‬

‫دودویی‬

‫*‬

‫تقسیم دو عملوند‬

‫دودویی‬

‫‪/‬‬

‫محاسبه باقیمانده تقسیم دو عملوند‬

‫دودویی‬

‫‪%‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬
‫‪‬‬

‫این عملگرهای برروی همه انواع داده های ‪ C‬عمل می كنند‪ ،‬بجز عملگر ‪ %‬كه فقط‬
‫برروی نوع داده های صحیح عمل می كند‪.‬‬
‫اما نكته مهمی كه باید به آن اشاره كرد‪ ،‬نحوه كار عملگر تقسیم برروی نوع داده های‬
‫مختلف است‪.‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫درصورتیكه هردو عملوند صحیح باشند‪ ،‬تقسیم بصورت صحیح بر صحیح انجام خواهد شد‪.‬‬
‫اگر یكی یا هر دو عملوند اعشاری باشند‪ ،‬تقسیم بصورت اعشاری انجام خواهد پذیرفت‪.‬‬
‫فرض كنید تعاریف زیر را داریم ‪:‬‬
‫; ‪int a,b‬‬
‫; ‪float c,d‬‬
‫; ‪a = 10 ; b = 4‬‬
‫;‪c = 8.2; d = 4.0‬‬
‫اكنون به نتایج عملیات زیر دقت كنید ‪:‬‬
‫‪a / b => 2‬‬
‫‪c / d => 2.05‬‬
‫‪a / d => 2.5‬‬
‫‪a / 4 => 2‬‬
‫چنانچه به آخرین مورد توجه كنید‪ ،‬متوجه می شوید كه از آنجا كه ‪a‬یك متغیر صحیح است و ‪4‬‬
‫نیز یك ثابت صحیح در نظر گرفته شده‪ ،‬درنتیجه تقسیم بصورت صحیح بر صحیح انجام گرفته‬
‫است‪ .‬چنانچه بخواهیم تقسیم بصورت اعشاری صورت پذیرد‪ ،‬به دو شكل می توانیم عمل‬
‫كنیم‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫برای اینکه عبارت تقسیم صفحه قبل بصورت اعشاری انجام شود‪ ،‬به دو روش‬
‫می توان عمل کرد‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫این عبارت را بصورت ‪ a / 4.0‬بنویسیم‪.‬‬
‫از عملگر قالب ریزی استفاده كنیم‪.‬‬

‫عملگر قالب ریزی می تواند یك نوع را به نوع دیگری تبدیل نماید‪ .‬شكل كلی آن‬
‫به شكل زیر است ‪:‬‬
‫>‪() ‫كه ‪ type‬نوع مورد نظر است كه قصد تبدیل عبارت ‪ expression‬به آن نوع را‬
‫داریم‪ .‬بعنوان مثال در مورد قبلی می توان به شكل زیر عمل كرد ‪:‬‬
‫‪(float) a / 4‬‬
‫در این حالت از كامپایلر خواسته ایم كه ابتدا عدد ‪ a‬را به اعشاری تبدیل كند‬
‫)البته بصورت موقت( و سپس آن را بر ‪ 4‬تقسیم نماید‪ ،‬كه مسلما حاصل‬
‫اعشاری خواهد بود‪.‬‬
‫بطوركلی هرگاه ثابتها و متغیرهایی از انواع مختلف در یك عبارت محاسباتی‬
‫داشته باشیم‪ ،‬كامپایلر ‪ C‬همه آنها را به یك نوع یكسان كه همان بزرگترین‬
‫عملوند موجود است تبدیل خواهد كرد‪ .‬بعنوان مثال به مورد صفحه بعد دقت‬
‫كنید ‪:‬‬

‫ عملگرهای محاسباتی‬7-5-1
char ch;
int i;

float f;
double d;
result = (ch / i)
int

+

(f *d)

(f+i)
float

double

double

int

-

double

double

float

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫اولویت عملگرها ‪ :‬در عبارتی که شامل چندین عملگر است‪ ،‬کدامیک در‬
‫ابتدا اعمال خواهد گردید‪.‬‬
‫اولویت عملگرهای محاسباتی از باال به پایین بشرح زیر است‪:‬‬
‫‪ ‬عملگر یکانی –‬
‫‪ ‬عملگرهای * و ‪ /‬و ‪%‬‬
‫‪ ‬عملگرهای ‪ +‬و –‬
‫چنانچه اولویت دو عملگر یکسان باشد‪ ،‬این عملگرها از چپ به راست‬
‫محاسبه خواهند شد‪.‬‬
‫چنانچه بخواهیم یک عمل با اولویت پایین زودتر انجام شود‪ ،‬باید از پرانتز‬
‫استفاده کنیم‪ .‬بنابراین اولویت عملگر پرانتز از همه موارد فوق‬
‫بیشتراست‪ .‬در مورد پرانتزهای متداخل‪ ،‬ابتدا پرانتز داخلی محاسبه‬
‫می شود؛ اما در مورد پرانتزهای هم سطح‪ ،‬ابتدا پرانتز سمت چپتر‬
‫محاسبه می گردد‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫چند مثال در مورد اولویت عملگرها‬

‫ترتیب اجرای عملگرها‬

‫عبارت زبان ‪C‬‬

‫ابتدا عمل * و سپس عمل ‪+‬‬

‫‪b+c*d‬‬

‫ابتدا عمل ‪ +‬و سپس عمل *‬

‫‪(b + c) * d‬‬

‫ابتدا عمل ‪ /‬سپس عمل * و در انتها عمل ‪+‬‬

‫‪b+c/d*e‬‬

‫ابتدا عمل * سپس عمل ‪ /‬و در انتها عمل ‪+‬‬

‫)‪b + c / (d * e‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫یک مثال کامل در مورد اولویت عملگرها‬

‫‪result = a + b * (f – (g + b) / d) – c * (a – d) / e‬‬
‫‪6‬‬

‫‪1‬‬
‫‪7‬‬

‫‪2‬‬

‫‪8‬‬

‫‪3‬‬
‫‪4‬‬
‫‪5‬‬
‫‪9‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫در زبان ‪ C‬برای انتساب چندین عملگر وجود دارد‪ .‬ساده ترین عملگر انتساب‪ ،‬همان عملگر =‬
‫است که در بسیاری از زبانها استفاده می شود‪ .‬بعنوان مثال ‪:‬‬
‫;‪a = 5‬‬
‫;‪b = c + 2 * d‬‬
‫این عملگر باعث می شود که عبارت سمت راست در عبارت سمت چپ قرار گیرد‪.‬‬
‫توجه کنید که مقدار سمت چپ باید عبارتی باشد که بتوان به آن یک مقدار را نسبت داد‬
‫)مانند یک متغیر( که به آن ‪ Lvalue‬گفته می شود‪ ،‬بنابراین یک ثابت نمی تواند در سمت چپ‬
‫قرار گیرد‪.‬‬
‫نکته دیگر اینکه اولویت عملگر = از عملگرهای ریاضی کمتر است و درنتیجه ابتدا آن عملیات‬
‫انجام شده و در پایان حاصل در عبارت سمت چپ ریخته می شود‪.‬‬
‫الزم به ذکر است که در هنگام انتساب‪ ،‬درصورت لزوم نوع عبارت سمت راست به نوع عبارت‬
‫سمت چپ تبدیل می شود‪ .‬مثال‪:‬‬
‫;‪int a‬‬
‫;‪a = 2.5 * 5.0‬‬
‫که دراینصورت عدد ‪ 12‬در ‪ a‬ذخیره خواهد شد‪.‬‬
‫شرکت پذیری این عملگر از راست به چپ می باشد‪ ،‬بدین معنا که چنانچه چندین عملگر‬
‫نسبت دهی داشته باشیم‪ ،‬این عملگرها از راست به چپ محاسبه می شوند‪ .‬مثال پس از‬
‫اجرای دستور زیر‪ ،‬مقدار هر ‪ 3‬متغیر برابر ‪ 10‬خواهد شد‪.‬‬
‫;‪a = b = c = 10‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬

‫نکته جالب درمورد زبان ‪ C‬آنستکه دارای یک سری عملگرهای انتساب‬
‫خالصه شده است که باعث می شوند در بعضی موارد بتوانیم عبارات‬
‫کوتاهتری را بنویسیم‪ .‬این عملگرها عبارتند از ‪:‬‬
‫عملگرد‬

‫مثال‬

‫عبارت انتساب معادل‬

‫‪++‬‬

‫;‪a ++‬‬

‫;‪a = a + 1‬‬

‫‪--‬‬

‫;‪a --‬‬

‫;‪a = a – 1‬‬

‫=‪+‬‬

‫;‪a += 5‬‬

‫;‪a = a + 5‬‬

‫=‪-‬‬

‫;‪a -= 8‬‬

‫;‪a= a – 8‬‬

‫=*‬

‫;‪a *= 10‬‬

‫;‪a= a * 10‬‬

‫=‪/‬‬

‫;‪a /= 2‬‬

‫;‪a = a / 2‬‬

‫=‪%‬‬

‫;‪a %= 10‬‬

‫;‪a = a % 10‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬
‫‪‬‬

‫عملگر اول و دوم‪ ،‬عملگرهای یکانی هستند که بترتیب عملگر افزایش و عملگر کاهش‬
‫نامیده می شوند‪.‬‬
‫نکته جالب آنستکه این دو عملگر به دوصورت مورد استفاده قرار می گیرند‪.‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫در حالتی که از دستور ;‪ a ++‬استفاده شود به آن پس افزایش می گویند و بدین معناست که‬
‫ابتدا از مقدار فعلی ‪ a‬در عبارت موردنظر استفاده کن و سپس آن را افزایش بده‪.‬‬
‫اما دستور ;‪ ++ a‬که به آن پیش افزایش گفته می شود‪ ،‬ابتدا ‪ a‬را افزایش داده و سپس از آن‬
‫در عبارت استفاده می کند‪.‬‬
‫به برنامه زیر دقت کنید‪:‬‬

‫>‪#include ‫{ )(‪void main‬‬
‫; ‪int a ,b‬‬
‫;‪a=5‬‬
‫;‪b = a ++‬‬
‫;)‪printf(“a=%d and b=%d \n”,a,b‬‬
‫;‪a=5‬‬
‫;‪b = ++ a‬‬
‫;)‪printf(“a=%d and b=%d \n”,a,b‬‬
‫}‬
‫‪a=6 b=5‬‬
‫‪a=6 b=6‬‬

‫‪ 7-5-3‬عملگرهای مقایسه ای‬
‫‪‬‬

‫‪‬‬

‫این عملگرها دو عبارت را بایکدیگر مقایسه کرده و نتیجه را باز می گردانند‪.‬‬
‫نتیجه می تواند درست )‪ (true‬یا غلط )‪ (false‬باشد‪.‬‬
‫نتیجه این عملگرها یک عدد صحیح است که درصورت درست بودن ‪ 1‬و‬
‫درصورت غلط بودن ‪ 0‬باز می گردانند‪ .‬این عملگرها عبارتند از‪:‬‬
‫عملگر‬

‫مفهوم عملگر‬

‫مثال‬

‫<‬

‫بزرگتر )<(‬

‫‪a>b‬‬

‫>‬

‫کوچکتر )>(‬

‫‪a
‫=<‬

‫بزرگتر یا مساوی )≤(‬

‫‪a >= b‬‬

‫=>‬

‫کوچکتر یا مساوی )≥(‬

‫‪a <= b‬‬

‫==‬

‫مساوی )=(‬

‫‪a == b‬‬

‫=!‬

‫نامساوی )≠(‬

‫‪a != b‬‬

‫‪ 7-5-3‬عملگرهای مقایسه ای‬
‫‪‬‬

‫‪‬‬

‫نکته مهمی که باید به آن دقت کرد عملگر مساوی )==( است‪ ،‬چرا که یک‬
‫اشتباه بسیار متداول برنامه نویسان ‪ C‬استفاده اشتباه از عملگر انتساب‬
‫)=( بجای عملگر تساوی )==( است که باعث ایجاد خطا در برنامه می‬
‫شود‪.‬‬
‫اولویت این عملگرها از باال به پایین بشرح زیر است‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫عملگرهای <‪ <= ، > ،‬و =>‬
‫عملگرهای == و =!‬

‫الزم بذکر است که در هنگام مساوی بودن اولویت چند عملگر‪ ،‬این عملگرها‬
‫از چپ به راست محاسبه می گردند‪.‬‬

‫‪ 7-5-4‬عملگرهای منطقی‬
‫‪‬‬

‫این عملگرها به شما اجازه می دهند که شرطهای ساده ای را که با‬
‫استفاده از عملگرهای مقایسه ای ایجاد شده اند را با یکدیگر ترکیب نموده‬
‫و شرطهای پیچیده تری را بسازید‪ .‬این عملگرها عبارتند از ‪:‬‬
‫مثال‬

‫عملگر‬

‫مفهوم عملگر‬

‫نحوه کار‬

‫&&‬

‫‪ AND‬منطقی‬

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

‫‪a>0 && sw==1‬‬

‫||‬

‫‪ OR‬منطقی‬

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

‫‪a<=100 || b!=0‬‬

‫!‬

‫‪ NOT‬منطقی‬

‫اگر عملوند درست باشد‪ ،‬نادرست و‬
‫اگر نادرست باشد‪ ،‬درست برمی‬
‫گرداند‪.‬‬

‫)‪! (a==1 || b<10‬‬

‫‪ 7-5-5‬عملگر شرطی‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫گاهی الزم است که ابتدا یک شرط بررسی شده و سپس برمبنای نتیجه )درست یا نادرست بودن آن( یکی‬
‫از دو عبارت ممکن بازگردانده شود‪ .‬برای اینکار می توان از یک عملگر ‪3‬تایی )با ‪ 3‬عملوند( بنام عملگر‬
‫شرطی استفاده نمود‪.‬‬
‫شکل کلی این عملگر بصورت زیر است‪:‬‬
‫>عبارت‪> :<2‬عبارت‪> ?<1‬شرط<‬
‫نحوه کار بدینصورت است که درصورت درست بودن شرط‪ ،‬عبارت‪ 1‬و در غیراینصورت عبارت ‪ 2‬بازگردانده می‬
‫شود‪.‬‬
‫به عنوان مثال به دستور زیر توجه کنید‪:‬‬
‫که این عبارت معادل دستور زیر است‪:‬‬

‫‪‬‬

‫;‪a = (k<10) ? 100 : 50‬‬
‫;‪if (k<10) a=100‬‬
‫;‪else a=50‬‬

‫البته این عبارت به شکلهای پیچیده نیز می تواند مورد استفاده قرار گیرد‪ .‬مثال ‪:‬‬
‫;‪c += (a>0 && a<10) ? ++a : a/b‬‬
‫که معادل است با ‪:‬‬
‫{ )‪if (a>0 && a<10‬‬
‫;‪a= a + 1‬‬
‫;‪c = c + a‬‬
‫}‬
‫;‪else c = c + a/b‬‬

‫‪ 7-5-6‬اولویت عملگرها‬
‫عملگر‬

‫اولویت‬

‫شرکت پذیری‬

‫‪1‬‬

‫)(‬

‫از چپ به راست‬

‫‪2‬‬

‫‪- + ! -- ++‬‬

‫از راست به چپ‬

‫‪3‬‬

‫‪* / %‬‬

‫از چپ به راست‬

‫‪4‬‬

‫‪+ -‬‬

‫از چپ به راست‬

‫‪5‬‬

‫>> <<‬

‫از چپ به راست‬

‫‪6‬‬

‫>= > <= <‬

‫از چپ به راست‬

‫‪7‬‬

‫=! ==‬

‫از چپ به راست‬

‫‪8‬‬

‫&&‬

‫از چپ به راست‬

‫‪9‬‬

‫||‬

‫از چپ به راست‬

‫‪10‬‬

‫‪?:‬‬

‫از راست به چپ‬

‫‪11‬‬

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

‫از راست به چپ‬

‫‪12‬‬

‫‪,‬‬

‫از چپ به راست‬

‫‪ 7-6‬خواندن و نمایش اطالعات‬
‫‪‬‬

‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫همانطور كه قبال نیز گفته شد‪ ،‬یكی از اهداف زبان ‪ C‬قابل حمل بودن آن‬
‫است‪ .‬بهمین منظور سعی شده است كه از دستوراتی كه ممكن است‬
‫وابسته به ماشین خاصی باشد‪ ،‬اجتناب گردد‪.‬‬
‫بهمین دلیل زبان ‪ C‬برخالف سایر زبانها دارای هیچ دستوری برای‬
‫خواندن از ورودی و یا نوشتن در خروجی نیست‪.‬‬
‫اما در عوض دارای تعدادی تابع )زیربرنامه( استاندارد می باشد كه تقریبا‬
‫تمامی كامپایلرها از آنها حمایت می كنند‪.‬‬
‫این كار به كامپایلر این امكان را می دهد كه بر حسب نوع سخت افزار‬
‫موردنظر‪ ،‬توابع ورودی و خروجی را طراحی نماید‪.‬‬
‫این توابع در یك فایل سرآمد بنام ‪ stdio.h‬تعریف شده اند و بنابراین قبل‬
‫ازاینكه بتوانید از این توابع استفاده نمایید‪ ،‬باید این فایل را نیز با استفاده‬
‫از ‪ #include‬در برنامه خود بگنجانید‪.‬‬

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫برای نمایش اطالعات در خروجی از تابع ‪ printf‬استفاده می شود‪.‬‬
‫این تابع رشته موردنظر شما را به خروجی استاندارد )كه در حالت‬
‫عادی همان صفحه نمایش یا مانیتور است( می فرستد‪ .‬شكل كلی این‬
‫تابع بصورت زیر است‪:‬‬
‫; )>لیست متغیرها< ‪> ,‬رشته كنترلی<(‪printf‬‬
‫رشته كنترلی همان متنی است كه قصد چاپ آن را داریم‪ ،‬با ذكر این‬
‫نكته كه در قسمتهایی كه باید مقدار یك متغیر چاپ شود‪ ،‬از یك‬
‫مشخصه تبدیل استفاده می شود‪ .‬هر مشخصه تبدیل از یك عالمت ‪%‬‬
‫بعالوه یك كاراكتر كه نوع متغیر مورد نظر را نشان می دهد تشكیل می‬
‫گردد‪.‬‬
‫لیست متغیرها نیز همان متغیرهایی هستند كه قصد چاپ آنها را داریم‪.‬‬
‫این متغیرها باید بترتیب قرار گرفته و با كاما )‪ (,‬از یكدیگر جدا شوند‪.‬‬

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫مشخصه تبدیل‬

‫مفهوم‬

‫‪%c‬‬

‫كاراكتر‬

‫‪%d‬‬

‫عدد صحیح در مبنای ‪10‬‬

‫‪%f‬‬

‫عدد اعشاری بدون نماد علمی‬

‫‪%e‬‬

‫عدد اعشاری با نماد علمی‬

‫‪%g‬‬

‫عدد اعشاری با حالت كوتاهتر بین ‪ e‬و ‪f‬‬

‫‪%s‬‬

‫رشته‬

‫‪%ld‬‬

‫عدد صحیح بزرگ‬

‫‪%lf %le %lg‬‬

‫عدد اعشاری بزرگ‬

‫‪%o‬‬

‫عدد صحیح در مبنای ‪8‬‬

‫‪%x‬‬

‫عدد صحیحی در مبنای ‪16‬‬

‫‪%u‬‬

‫عدد صحیح بدون عالمت‬

‫ تابع نمایش در خروجی‬7-6-1
#include
void main() {
int age = 20;
floate average = 18.23;
printf("You are %d years old and your average is %f \n",age,average);
}
You are 20 years old and your average is 18.230000

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫‪‬‬
‫‪‬‬

‫برای کنترل نحوه چاپ اعداد می توانید از مشخصه طول میدان استفاده‬
‫کنید‪.‬‬
‫مشخصه طول میدان برای اعداد به شكل زیر استفاده می شود‪:‬‬
‫‪ ‬برای اعداد صحیح از ‪ %nd‬استفاده می كنیم كه ‪ n‬تعداد ارقام را نشان‬
‫می دهد )مثال ‪ .(%3d‬در اینصورت برای هر متغیر ‪ n‬رقم درنظر گرفته‬
‫می شود‪ .‬اگر اندازه عدد از ‪ n‬كوچكتر باشد‪ ،‬به سمت چپ آن فضای‬
‫خالی اضافه می شود و اگر اندازه عدد بیش از ‪ n‬رقم باشد‪ ،‬طول میدان‬
‫نادیده گرفته شده و عدد بطور كامل چاپ می شود‪.‬‬
‫‪ ‬برای اعداد اعشاری از ‪ %n.mf‬استفاده می كنیم كه ‪ n‬اندازه كل عدد‬
‫)شامل عالمت ممیز( و ‪ m‬تعداد ارقام اعشار است )مثال ‪ .(%5.2f‬در‬
‫صورتیكه تعداد ارقام اعشاری عدد موردنظر از ‪ m‬بیشتر باشد‪ ،‬عدد به ‪m‬‬
‫عدد اعشار گرد می شود و در صورتیكه از ‪ m‬كمتر باشد‪ ،‬در سمت‬
‫راست آن ‪ 0‬قرار داده می شود‪.‬‬

‫‪ 7-6-2‬تابع خواندن از ورودی‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای خواندن اطالعات از ورودی از تابع ‪ scanf‬استفاده می شود‪.‬‬
‫این تابع اطالعات را ازورودی استاندارد )معموال صفحه كلید( خوانده و در‬
‫متغیرهای تعیین شده قرار می دهد‪.‬‬
‫شكل كلی این تابع بصورت زیر است‪:‬‬
‫; )>لیست آدرسهای متغیرها< ‪> ,‬رشته كنترلی<(‪scanf‬‬
‫همانطور كه می بینید نحوه احضار تابع ‪ scanf‬نیز مشابه ‪ printf‬است‪ .‬تنها‬
‫تفاوت در آن است كه در ‪ scanf‬باید لیست آدرسهای متغیرها ارسال شود‪.‬‬
‫مبحث مربوط به آدرسها در فصول بعدی بررسی خواهد شد ولی در حال حاضر‬
‫بخاطر بسپارید كه برای بدست آوردن آدرس یك متغیر از عالمت & استفاده می‬
‫كنیم‪ .‬بعنوان مثال ‪ &age‬بمعنای آدرس متغیر ‪ age‬است‪.‬‬
‫بطور كلی در ‪ C‬قدیمی هرگاه كه یك تابع دارای پارامترهای خروجی بود )یعنی‬
‫پارامترهایی كه یك مقدار را باز می گرداندند( از آدرس متغیرها استفاده می‬
‫شد كه امروزه این مسئله وجود ندارد‪.‬‬

‫ تابع خواندن از ورودی‬7-6-2
#include
void main() {
int age;
float average ;
printf("Please enter your age and average : ");
scanf("%d %f",&age,&average);
printf("You are %d years old and your average is %5.2f \n",age,average);
}

Please enter your age and average : 19 16.72
You are 19 years old and your average is 16.72

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫زبان ‪ C++‬یک زبان شی گرا است‪ ،‬بهمین دلیل در این زبان برای ورودی‬
‫و خروجی از اشیاء بجای توابع استفاده می گردد‪.‬‬
‫از آنجا که امروزه معموال برنامه نویسان ‪ C‬از کامپایلرهای ‪ C++‬استفاده‬
‫می کنند‪ ،‬می توانند از اشیای ورودی و خروجی آن نیز استفاده کنند‪.‬‬
‫اینکار در بین بسیاری از برنامه نویسان ‪ C‬متداول است‪ ،‬بهمین دلیل ما‬
‫در اینجا نحوه کار با اشیای خواندن و نوشتن در ‪ C++‬را بطور مقدماتی‬
‫توضیح می دهیم؛ گرچه توضیح کامل این موارد نیاز به آشنایی با شی‬
‫گرایی و زبان ‪ C++‬دارد‪.‬‬
‫قبل از هرچیز الزم به ذکر است که کلیه اشیای مربوط به ورودی و‬
‫خروجی در فایل سرآمدی بنام ‪ iostream.h‬تعیریف شده اند‪ ،‬بنابراین‬
‫ابتدا باید این فایل به برنامه توسط دستور ‪ #include‬الحاق گردد‪.‬‬

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫زبان ‪ C++‬برای نمایش اطالعات از یک شیئ بنام ‪ cout‬استفاده می نماید‪.‬‬
‫برای ارسال اطالعات مورد نظر برای چاپ به ‪ cout‬باید از عملگر درج در جریان‬
‫یا >> استفاده نماییم‪ .‬بعنوان مثال ‪:‬‬
‫; ” ‪cout >> “Please enter your name:‬‬
‫و یا مثال دیگر ‪:‬‬
‫;‪int a = 10‬‬
‫;‪float b = 2.86‬‬
‫;‪cout << a‬‬
‫;‪cout << b‬‬
‫نکته جالبی که در این مثالها دیده می شود‪ ،‬آنستکه برخالف تابع ‪ printf‬هیچ‬
‫نیازی به مشخص کردن نوع متغیری که قصد چاپ آن را داریم نیست و خود‬
‫شئ ‪ cout‬نوع آن را تشخیص می دهد‪.‬‬
‫عالوه براین می توان چندین عملگر درج در جریان را با یکدیگر الحاق کرد و‬
‫چندین متغیر را با یک دستور چاپ کرد‪.‬‬

C++ ‫ ورودی و خروجی اطالعات در‬7-6-3
#include
void main() {
int age = 20;
floate average = 18.23;
cout >> “You are ” >> age >> “ years old and your average is ” >> average ;
}

You are 20 years old and your average is 18.230000

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای دریافت اطالعات از کاربر‪ ،‬از شئ دیگری بنام ‪ cin‬استفاده می شود‪.‬‬
‫برای ارسال متغیر مورد نظر به ‪ cin‬باید از عملگر استخراج از جریان یا <<‬
‫استفاده نماییم‪ .‬بعنوان مثال‪:‬‬
‫;‪int a‬‬
‫;‪cin >> a‬‬
‫بازهم همانطور که می بینید نیازی به تعیین نوع متغیر موردنظر نیست و خود‬
‫شئ ‪ cin‬نوع متغیر را بطور اتوماتیک تشخیص داده و داده ای از همان نوع را از‬
‫کاربر دریافت و در متغیر مورد نظر قرار می دهد‪.‬‬
‫عملگرهای استخراج از جریان را نیز می توان با یکدیگر الحاق کرد‪.‬‬
‫برای رفتن به خط بعد در شئ ‪ cout‬می توان از دستکاری کننده ‪ endl‬استفاده‬
‫کرد‪ .‬مثال در دستور زیر پس از چاپ پیغام‪ ،‬مکان نما به خط بعد منتقل می‬
‫شود‪:‬‬
‫;‪cout >> “List of students : “ >> endl‬‬
‫البته دستکاری کننده های متعدد دیگری نیز ازجمله موارد مربوط به تعیین طول‬
‫میدان و نحوه چاپ مقادیر وجود دارد که توضیح آنها نیاز به یک مبحث مستقل‬
‫دارد‪.‬‬

C++ ‫ ورودی و خروجی اطالعات در‬7-6-3
#include
void main() {
int age;
float average ;
cout << "Please enter your age and average : " ;
cin >> age >> average ;
cout << "You are " << age << "years old and your average is " << average;
}

Please enter your age and average : 19 16.72
You are 19 years old and your average is 16.72

‫‪ 7-7‬توابع کتابخانه ای‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫همانطور که قبال نیز گفته شد‪ ،‬زبان ‪ C‬از زیر برنامه ها نیز حمایت می کند‪ .‬هر زیر برنامه‬
‫در ‪ C‬یک تابع نامیده می شود‪ .‬تا کنون با توابعی همچون ‪ main‬و یا ‪ printf‬و ‪ scanf‬آشنا‬
‫شده ایم‪.‬‬
‫معموال عرضه کنندگان کامپایلرها و یا سایر فروشندگان نرم افزار‪ ،‬برخی از توابع عمومی‬
‫را که ممکن است مورد نیاز جمع کثیری از برنامه نویسان مختلف باشد را در قالب‬
‫کتابخانه ای از توابع در اختیار برنامه نویسان می گذارند‪ .‬بعضی از این توابع کتابخانه ای‬
‫مانند ‪ printf‬و ‪ scanf‬بصورت استاندارد درآمده و توسط عرضه کنندگان مختلف ارائه می‬
‫شوند‪.‬‬
‫در کامپایلر عرضه شده توسط شرکت بورلند )‪ (Borland C++ 3.1‬نیز کتابخانه های‬
‫متعددی از توابع برای شما عرضه شده اند که بتدریج با آنها و کاربردشان آشنا خواهید‬
‫شد‪.‬‬
‫نکته مهم آنستکه برای استفاده از این توابع ابتدا باید فایل سرآمد مربوط به آنها را نیز در‬
‫ابتدای برنامه خود اضافه نمایید ) با استفاده از ‪ .(#include‬هر فایل سرآمد شامل تعاریف‬
‫اولیه گروهی از توابع مرتبط با هم و داده های مربوط به آنها بوده و در استاندارد قدیمی‬
‫تر دارای پسوند ‪ .h‬می باشد)در استاندارد جدید پسوند این فایلها حذف شده است(‪.‬‬
‫برخی از این فایلهای سرآمد عبارتند از‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪ : stdio.h‬توابع ورودی و خروجی استاندارد‬
‫‪ : math.h‬توابع ریاضی‬
‫‪ : graphics.h‬توابع مربوط به عملیات گرافیکی‬
‫‪ : string.h‬توابع مربوط به کار با رشته ها‬


Slide 17

‫مبانی کامپیوتر و برنامه سازی‬
‫فصل هفتم ‪ :‬مفاهیم اولیه زبان ‪C‬‬
‫مدرس ‪ :‬نگین معروفی‬

‫‪ 7-1‬شناسه ها در ‪C‬‬
‫‪‬‬
‫‪‬‬

‫شناسه )‪ (identifier‬نامی است که به یک قسمت از برنامه مانند متغیر‪ ،‬تابع‪ ،‬ثابت و یا‬
‫‪ ...‬داده می شود‪.‬‬
‫در زبان ‪ C‬برای انتخاب شناسه ها فقط می توان از عالئم زیر استفاده کرد‪:‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫حروف انگلیسی کوچک و بزرگ )‪(A…Z a…z‬‬
‫ارقام )‪(0…9‬‬
‫عالمت خط پایین یا _‬

‫البته یک شناسه نمی تواند با یک رقم شروع شود‪.‬‬
‫چند شناسه مجاز‪ name2 ، average ، sum :‬و ‪student_average‬‬
‫چند شناسه غیرمجاز ‪ 2name‬و یا ‪student average‬‬
‫در برنامه نویسی امروزی پیشنهاد می شود بجای شناسه هایی همانند‬
‫‪ student_average‬از ‪ studentAverage‬استفاده گردد‪.‬‬
‫نکته مهم دیگری که باید به آن اشاره کرد آنستکه زبان ‪ C‬برخالف بسیاری از زبانهای دیگر‬
‫به کوچک و بزرگی حروف حساس است )‪ .(case sensitive‬در نتیجه شناسه های زیر با‬
‫یکدیگر متفاوتند ‪:‬‬
‫‪Sum ≠ sum ≠ SUM‬‬
‫آخرین نکته اینستکه در هنگام انتخاب شناسه نمی توانید از کلمات کلیدی که برای‬
‫منظورهای خاص در زبان ‪ C‬رزرو شده اند استفاده کنید‪.‬‬

C ‫ شناسه ها در‬7-1
: C ‫کلمات کلیدی در زبان‬
auto

break

case

char

const

continue

default

do

double

else

enum

extern

float

for

goto

if

int

long

register

return

short

signed

sizeof

static

struct

switch

typedef

union

unsigned

void

volatile

while

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫محدوده‬

‫اندازه )بیت(‬

‫توضیح‬

‫نوع داده‬

‫‪-128 to +127‬‬

‫‪8‬‬

‫کاراکتر‬

‫‪char‬‬

‫‪-32768 to +32767‬‬

‫‪16‬‬

‫عدد صحیح‬

‫‪int‬‬

‫‪3.4e-38 to 3.4e+38‬‬

‫‪32‬‬

‫عدد اعشاری‬

‫‪float‬‬

‫‪1.7e-308 to 1.7e+308‬‬

‫‪64‬‬

‫عدد اعشاری با‬
‫دقت مضاعف‬

‫‪double‬‬

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫‪‬‬

‫البته چند نکته مهم درمورد این جدول قابل ذکر است ‪:‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫اندازه ‪ int‬در محیطهای ‪ 16‬بیتی مانند ‪ DOS‬برابر ‪ 16‬بیت است‪ .‬اما در‬
‫محیطهای ‪ 32‬بیتی همانند ‪ Windows‬اندازه آن ‪ 32‬بیت می باشد که در‬
‫اینصورت محدوده ای برابر ‪ -2,147,483,648‬تا ‪ +2,147,483,647‬را‬
‫پوشش می دهد‪.‬‬
‫در بعضی از کامپایلرهای ‪ ،C‬نوع داده ‪ bool‬نیز وجود دارد که می تواند‬
‫یکی از مقادیر ‪)true‬درست( یا ‪) false‬غلط( را نشان دهد ‪ .‬اما در نسخه‬
‫های اولیه ‪ C‬از همان نوع داده صحیح یا ‪ int‬برای اینکار استفاده می‬
‫شد‪ .‬بدین صورت که ‪ 0‬نشاندهنده ‪ false‬و هر عدد غیر صفر )معموال ‪(1‬‬
‫نشاندهنده ‪ true‬است‪.‬‬
‫از آنجا که برای ذخیره سازی کاراکترها کد اسکی آنها ذخیره می گردد‪،‬‬
‫از یک متغیر کاراکتری یا ‪ char‬می توان بعنوان یک عدد صحیح کوچک نیز‬
‫استفاده کرد و اعمال ریاضی برروی آنها نیز مجاز است‪.‬‬

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫عالوه براین چندین اصالح کننده نیز وجود دارد که به ما اجازه می دهد نوع داده مورد‬
‫نظر را با دقت بیشتری برای نیازهای مختلف استفاده نماییم‪.‬‬
‫این اصالح کننده ها عبارتند از ‪short, long, signed, unsigned :‬‬
‫تمام این اصالح کننده ها می توانند به نوع داده ‪ int‬اعمال شوند و اثر آنها بستگی‬
‫به محیط دارد‪.‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫در یک محیط ‪16‬بیتی‪short int ،‬بازهم برابر ‪16‬بیت است ولی ‪ long int‬برابر‪32‬بیت می‬
‫باشد‪.‬‬
‫‪ unsigned int‬باعث می شود که یک عدد ‪ 16‬بیتی بدون عالمت داشته باشیم که بازه‬
‫بین ‪ 0‬تا ‪ 65535‬را پوشش می دهد‪ signed int .‬نیز همانند ‪ int‬معمولی بوده و تفاوتی‬
‫ندارد‪.‬‬
‫ترکیب این اصالح کننده ها نیز ممکن است‪ .‬مثال ‪ unsigned long int‬یک عدد ‪ 32‬بیتی‬
‫بدون عالمت است که بازه ‪ 0‬تا ‪ 4,294,967,295‬را پوشش می دهد‪.‬‬

‫برروی نوع داده ‪ char‬فقط اصالح کننده های ‪ signed‬و ‪ unsigned‬را می توان اعمال‬
‫کرد‪ .‬معموال از اصالح کننده ‪ unsigned‬وقتی استفاده می شود که قصد داشته‬
‫باشیم از ‪ char‬بعنوان یک عدد صحیح مثبت بین ‪ 0‬تا ‪ 255‬استفاده کنیم‪.‬‬
‫برروی نوع داده ‪ double‬تنها اصالح کننده ‪ long‬قابل اعمال است و دراینصورت عدد‬
‫اعشاری با ‪ 80‬بیت را خواهیم داشت که قادر است هر عددی در بازه ‪ 3.4e-4932‬تا‬
‫‪ 1.1e+4932‬را در خود نگاه دارد‪.‬‬

‫‪ 7-3‬تعریف متغیرها‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای تعریف متغیرها به شکل زیر عمل می کنیم‪:‬‬

‫;>‪ ‫که ‪ type‬یکی از نوع داده های گفته شده و ‪ variable-list‬لیستی از متغیرها است‬
‫که با کاما از یکدیگر جدا شده اند‪ .‬بعنوان مثال ‪:‬‬
‫;‪int sum‬‬
‫;‪float average‬‬
‫; ‪long int a, b, c‬‬
‫; ‪unsigned long int i, j, k‬‬
‫عالوه براین می توان در هنگام تعریف متغیر به آن مقدار اولیه نیز داد‪ .‬مثال ‪:‬‬
‫; ‪int d = 0‬‬
‫نكته مهم آنكه زبان ‪ C‬به متغیرها مقدار اولیه نمي دهد )حتي ‪ (0‬و برنامه نويس‬
‫خود بايد اينكار را صريحا انجام دهد‪ ،‬درغیر اينصورت مقدار اولیه متغیر‪ ،‬نامعین خواهد‬
‫بود‪.‬‬
‫تعریف متغیرها طبق اصول زبان ‪ C‬میتواند درهرجایی از برنامه صورت پذیرد‪ ،‬و‬
‫متغیرهای تعریف شده از همان خط به بعد قابل استفاده خواهد بود‪ .‬اما معموال‬
‫توصیه می گردد كه تعریف متغیرها در همان خط ابتدایی تابع و بالفاصله پس از {‬
‫صورت پذیرد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫‪‬‬
‫‪‬‬

‫ثابتها مقادیر ثابتی هستند كه مقدار آنها در حین اجرای برنامه تغییر نمی یابد‪ .‬ثابتها می توانند از‬
‫هریك از نوع داده های اصلی باشند‪.‬‬
‫ثوابت عددی صحیح ‪:‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫برای نمایش این دسته از ثوابت‪ ،‬از دنباله ای از ارقام بعالوه عالمت ‪ +‬یا ‪ -‬استفاده می كنیم‪ .‬بعنوان مثال‬
‫‪ -45‬و یا ‪ 3489‬ثوابت صحیح هستند‪.‬‬
‫در حالت عادی ‪ C‬هر عدد را در كوچكترین نوع داده ای كه می تواند قرار می دهد‪ .‬مثال عدد ‪ 85‬در یك‬
‫‪ int‬قرار می گیرد‪ ،‬اما عدد ‪ 145398‬در یك ‪ long int‬قرار خواهد گرفت‪.‬‬
‫اگر قصد دارید یك عدد كوچك بعنوان ‪ long‬محسوب گردد‪ ،‬می توانید از پسوند ‪ L‬در انتهای آن استفاده‬
‫می كنیم‪ .‬مثال ‪245L‬یك عدد ‪ long‬محسوب می شود‪.‬‬
‫;‪long int a = 20L‬‬
‫پسوند ‪ U‬در انتهای عدد نیز نشانه بدون عالمت بودن آن است‪.‬‬
‫نكته دیگر آنكه ‪ C‬به شما اجازه می دهد درصورت لزوم ثوابت صحیح خود را در مبنای ‪ 8‬یا ‪ 16‬نیز كه‬
‫از مبناهای متداول در برنامه نویسی هستند‪ ،‬بنویسید‪.‬‬
‫‪‬‬
‫‪‬‬

‫برای نوشتن عدد در مبنای ‪ 8‬باید آن را با ‪ 0‬آغاز كنید‪ ،‬مثال ‪ 0342‬یك عدد در منای ‪ 8‬محسوب می‬
‫گردد‪.‬‬
‫برای نوشتن یك عدد در مبنای ‪ 16‬باید آن را با ‪ 0x‬آغاز نمایید‪ ،‬مانند ‪.0x27A4‬‬

‫‪ 7-4‬ثوابت‬
‫ثوابت عددی اعشاری‬

‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫برای نمایش اعداد اعشاری‪ ،‬باید از نقطه اعشار استفاده كنیم‪ ،‬مانند ‪237.45‬‬
‫اما نكته جالب آنستكه می توانید از نماد علمی نیز برای نمایش اعداد‬
‫اعشاری استفاده كنید‪ .‬برای اینكار كافی است از حرف ‪ e‬برای نمایش قسمت‬
‫توان استفاده نمایید‪ .‬بعنوان مثال ‪:‬‬
‫‪-23.47 × 10 5 = -23.47e5‬‬
‫‪42.389 × 10 -3 = 42.389e-3‬‬
‫دقت كنید كه قسمت توان‪ ،‬حتما یك عدد صحیح است‪.‬‬
‫نكته جالب اینجاست كه برخالف مورد قبل‪ ،‬كامپایلر بطور پیش فرض داده های‬
‫اعشاری را از نوع ‪ double‬فرض می كند‪.‬چنانچه دوست دارید ثابت شما ازنوع‬
‫‪ float‬درنظر گرفته شود‪ ،‬در انتهای آن ‪ F‬قرار دهید‪ .‬ضمنا پسوند ‪ L‬نیز داده‬
‫اعشاری را از نوع ‪ long double‬درنظر می گیرد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫ثوابت كاراكتری ‪:‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫برای نشان دادن ثوابت كاراكتری‪ ،‬آنها را در داخل ' قرار می دهیم‪ .‬بعنوان مثال‬
‫'‪'A‬یك ثابت كاراكتری است‪.‬‬
‫; '‪char ch = 'S‬‬
‫دقت كنید كه همانطور كه قبال گفته شد‪ ،‬كد اسكی كاراكترها در متغیر ذخیره‬
‫می گردد‪ ،‬بنابراین می توان از آن بعنوان یك عدد صحیح نیز استفاده كرد‪ .‬نكته‬
‫مهم دیگر آنستكه به تفاوت عدد ‪ 5‬و كاراكتر '‪ '5‬دقت داشته باشید‪ .‬در حقیقت‬
‫'‪ '5‬برابر است با عدد ‪ 53‬كه همان كد اسكی آن است‪.‬‬
‫روش فوق‪ ،‬برای نمایش کاراکترهای قابل چاپ مناسب است‪ ،‬اما بعضی‬
‫كاراكترها مانند ‪ enter‬قابل نمایش نبوده و برای آنها شکل خاصی وجود ندارد‪.‬‬
‫در چنین مواردی‪ ،‬زبان ‪ C‬از ترکیب عالمت \ به همراه یک کاراکتر دیگر‪ ،‬برای‬
‫نمایش این قبیل کاراکترها استفاده می نماید‪ .‬بعنوان مثال‪ ،‬کاراکتر '‪ '\n‬نشان‬
‫دهنده خط جدید یا همان ‪ enter‬می باشد‪.‬‬
‫جدول صفحه بعد این قبیل کاراکترها و معادل آنها را نشان می دهد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫نحوه نمایش در ‪C‬‬

‫کد اسکی‬

‫صدای بوق کامپیوتر‬

‫‪\a‬‬

‫‪7‬‬

‫حرکت به عقب ‪backspace‬‬

‫‪\b‬‬

‫‪8‬‬

‫شروع صفحه ‪form feed‬‬

‫‪\f‬‬

‫‪12‬‬

‫سطر جدید ‪line feed‬‬

‫‪\n‬‬

‫‪10‬‬

‫برگشت به ابتداي سطر ‪carriage return‬‬

‫‪\r‬‬

‫‪13‬‬

‫فاصله افقی ‪horizontal tab‬‬

‫‪\t‬‬

‫‪9‬‬

‫فاصله عمودی ‪vertical tab‬‬

‫‪\v‬‬

‫‪11‬‬

‫عالمت سوال‬

‫?\‬

‫‪63‬‬

‫عالمت '‬

‫'\‬

‫‪39‬‬

‫عالمت "‬

‫"\‬

‫‪34‬‬

‫عالمت \‬

‫\\‬

‫‪92‬‬

‫عالمت تهی‬

‫‪\0‬‬

‫‪0‬‬

‫نام کاراکتر‬

‫کد اسکی یک کاراکتر با ‪ 3‬رقم در مبنای ‪8‬‬

‫‪\000‬‬

‫کد اسکی یک کاراکتر با ‪ 2‬رقم در مبنای ‪16‬‬

‫‪\x00‬‬

‫‪ 7-4‬ثوابت‬
‫‪‬‬

‫ثوابت رشته ای ‪ C :‬عالوه بر ثوابت فوق‪ ،‬از یك ثابت دیگر بنام رشته نیز‬
‫حمایت می كند‪ .‬رشته‪ ،‬دنباله ای از كاراكترها است كه در داخل " قرار‬
‫می گیرند‪ .‬بعنوان مثال "‪ "this is a test‬یك رشته است‪ .‬دقت كنید كه '‪'a‬‬
‫یك كاراكتر است‪ ،‬اما "‪ "a‬یك رشته است كه فقط شامل یك كاراكتر می‬
‫باشد‪.‬‬

‫‪ 7-5‬عملگرها‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫عملگر‪ ،‬نمادی است كه به كامپایلر می گوید تا عملیات محاسباتی یا‬
‫منطقی خاصی را برروی یك یا چند عملوند‪ ،‬انجام دهد‪.‬‬
‫به عملگرهایی كه فقط یك عملوند دارند‪ ،‬عملگر یكانی می گوییم و‬
‫همواره عملگر در سمت چپ عملوند قرار می گیرد)مانند عدد ‪.(-125‬‬
‫اما عملگرهایی كه برروی دو عملوند اثر می كنند را عملگر دودویی‬
‫نامیده و عملگر را بین دو عملوند قرار می دهیم )مانند ‪.(23+86‬‬
‫هر ترکیب درستی از عملگرها و عملوندها را یک عبارت می نامیم‪.‬‬
‫‪ C‬از نقطه نظر عملگرها یك زبان بسیار قوی است‪ .‬این عملگرها به چند‬
‫دسته اصلی تقسیم می گردند كه آنها را به ترتیب بررسی می كنیم‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫این عملگرها‪ ،‬همان اعمال متداول ریاضی هستند كه در زبان ‪ C‬مورد استفاده‬
‫قرار می گیرند‪ .‬این اعمال عبارتند از ‪:‬‬

‫عمل‬

‫نوع‬

‫عملگر‬

‫منفی كردن عملوند سمت راست‬

‫یكانی‬

‫‪-‬‬

‫جمع دو عملوند‬

‫دودویی‬

‫‪+‬‬

‫تفریق دو عملوند‬

‫دودویی‬

‫‪-‬‬

‫ضرب دو عملوند‬

‫دودویی‬

‫*‬

‫تقسیم دو عملوند‬

‫دودویی‬

‫‪/‬‬

‫محاسبه باقیمانده تقسیم دو عملوند‬

‫دودویی‬

‫‪%‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬
‫‪‬‬

‫این عملگرهای برروی همه انواع داده های ‪ C‬عمل می كنند‪ ،‬بجز عملگر ‪ %‬كه فقط‬
‫برروی نوع داده های صحیح عمل می كند‪.‬‬
‫اما نكته مهمی كه باید به آن اشاره كرد‪ ،‬نحوه كار عملگر تقسیم برروی نوع داده های‬
‫مختلف است‪.‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫درصورتیكه هردو عملوند صحیح باشند‪ ،‬تقسیم بصورت صحیح بر صحیح انجام خواهد شد‪.‬‬
‫اگر یكی یا هر دو عملوند اعشاری باشند‪ ،‬تقسیم بصورت اعشاری انجام خواهد پذیرفت‪.‬‬
‫فرض كنید تعاریف زیر را داریم ‪:‬‬
‫; ‪int a,b‬‬
‫; ‪float c,d‬‬
‫; ‪a = 10 ; b = 4‬‬
‫;‪c = 8.2; d = 4.0‬‬
‫اكنون به نتایج عملیات زیر دقت كنید ‪:‬‬
‫‪a / b => 2‬‬
‫‪c / d => 2.05‬‬
‫‪a / d => 2.5‬‬
‫‪a / 4 => 2‬‬
‫چنانچه به آخرین مورد توجه كنید‪ ،‬متوجه می شوید كه از آنجا كه ‪a‬یك متغیر صحیح است و ‪4‬‬
‫نیز یك ثابت صحیح در نظر گرفته شده‪ ،‬درنتیجه تقسیم بصورت صحیح بر صحیح انجام گرفته‬
‫است‪ .‬چنانچه بخواهیم تقسیم بصورت اعشاری صورت پذیرد‪ ،‬به دو شكل می توانیم عمل‬
‫كنیم‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫برای اینکه عبارت تقسیم صفحه قبل بصورت اعشاری انجام شود‪ ،‬به دو روش‬
‫می توان عمل کرد‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫این عبارت را بصورت ‪ a / 4.0‬بنویسیم‪.‬‬
‫از عملگر قالب ریزی استفاده كنیم‪.‬‬

‫عملگر قالب ریزی می تواند یك نوع را به نوع دیگری تبدیل نماید‪ .‬شكل كلی آن‬
‫به شكل زیر است ‪:‬‬
‫>‪() ‫كه ‪ type‬نوع مورد نظر است كه قصد تبدیل عبارت ‪ expression‬به آن نوع را‬
‫داریم‪ .‬بعنوان مثال در مورد قبلی می توان به شكل زیر عمل كرد ‪:‬‬
‫‪(float) a / 4‬‬
‫در این حالت از كامپایلر خواسته ایم كه ابتدا عدد ‪ a‬را به اعشاری تبدیل كند‬
‫)البته بصورت موقت( و سپس آن را بر ‪ 4‬تقسیم نماید‪ ،‬كه مسلما حاصل‬
‫اعشاری خواهد بود‪.‬‬
‫بطوركلی هرگاه ثابتها و متغیرهایی از انواع مختلف در یك عبارت محاسباتی‬
‫داشته باشیم‪ ،‬كامپایلر ‪ C‬همه آنها را به یك نوع یكسان كه همان بزرگترین‬
‫عملوند موجود است تبدیل خواهد كرد‪ .‬بعنوان مثال به مورد صفحه بعد دقت‬
‫كنید ‪:‬‬

‫ عملگرهای محاسباتی‬7-5-1
char ch;
int i;

float f;
double d;
result = (ch / i)
int

+

(f *d)

(f+i)
float

double

double

int

-

double

double

float

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫اولویت عملگرها ‪ :‬در عبارتی که شامل چندین عملگر است‪ ،‬کدامیک در‬
‫ابتدا اعمال خواهد گردید‪.‬‬
‫اولویت عملگرهای محاسباتی از باال به پایین بشرح زیر است‪:‬‬
‫‪ ‬عملگر یکانی –‬
‫‪ ‬عملگرهای * و ‪ /‬و ‪%‬‬
‫‪ ‬عملگرهای ‪ +‬و –‬
‫چنانچه اولویت دو عملگر یکسان باشد‪ ،‬این عملگرها از چپ به راست‬
‫محاسبه خواهند شد‪.‬‬
‫چنانچه بخواهیم یک عمل با اولویت پایین زودتر انجام شود‪ ،‬باید از پرانتز‬
‫استفاده کنیم‪ .‬بنابراین اولویت عملگر پرانتز از همه موارد فوق‬
‫بیشتراست‪ .‬در مورد پرانتزهای متداخل‪ ،‬ابتدا پرانتز داخلی محاسبه‬
‫می شود؛ اما در مورد پرانتزهای هم سطح‪ ،‬ابتدا پرانتز سمت چپتر‬
‫محاسبه می گردد‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫چند مثال در مورد اولویت عملگرها‬

‫ترتیب اجرای عملگرها‬

‫عبارت زبان ‪C‬‬

‫ابتدا عمل * و سپس عمل ‪+‬‬

‫‪b+c*d‬‬

‫ابتدا عمل ‪ +‬و سپس عمل *‬

‫‪(b + c) * d‬‬

‫ابتدا عمل ‪ /‬سپس عمل * و در انتها عمل ‪+‬‬

‫‪b+c/d*e‬‬

‫ابتدا عمل * سپس عمل ‪ /‬و در انتها عمل ‪+‬‬

‫)‪b + c / (d * e‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫یک مثال کامل در مورد اولویت عملگرها‬

‫‪result = a + b * (f – (g + b) / d) – c * (a – d) / e‬‬
‫‪6‬‬

‫‪1‬‬
‫‪7‬‬

‫‪2‬‬

‫‪8‬‬

‫‪3‬‬
‫‪4‬‬
‫‪5‬‬
‫‪9‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫در زبان ‪ C‬برای انتساب چندین عملگر وجود دارد‪ .‬ساده ترین عملگر انتساب‪ ،‬همان عملگر =‬
‫است که در بسیاری از زبانها استفاده می شود‪ .‬بعنوان مثال ‪:‬‬
‫;‪a = 5‬‬
‫;‪b = c + 2 * d‬‬
‫این عملگر باعث می شود که عبارت سمت راست در عبارت سمت چپ قرار گیرد‪.‬‬
‫توجه کنید که مقدار سمت چپ باید عبارتی باشد که بتوان به آن یک مقدار را نسبت داد‬
‫)مانند یک متغیر( که به آن ‪ Lvalue‬گفته می شود‪ ،‬بنابراین یک ثابت نمی تواند در سمت چپ‬
‫قرار گیرد‪.‬‬
‫نکته دیگر اینکه اولویت عملگر = از عملگرهای ریاضی کمتر است و درنتیجه ابتدا آن عملیات‬
‫انجام شده و در پایان حاصل در عبارت سمت چپ ریخته می شود‪.‬‬
‫الزم به ذکر است که در هنگام انتساب‪ ،‬درصورت لزوم نوع عبارت سمت راست به نوع عبارت‬
‫سمت چپ تبدیل می شود‪ .‬مثال‪:‬‬
‫;‪int a‬‬
‫;‪a = 2.5 * 5.0‬‬
‫که دراینصورت عدد ‪ 12‬در ‪ a‬ذخیره خواهد شد‪.‬‬
‫شرکت پذیری این عملگر از راست به چپ می باشد‪ ،‬بدین معنا که چنانچه چندین عملگر‬
‫نسبت دهی داشته باشیم‪ ،‬این عملگرها از راست به چپ محاسبه می شوند‪ .‬مثال پس از‬
‫اجرای دستور زیر‪ ،‬مقدار هر ‪ 3‬متغیر برابر ‪ 10‬خواهد شد‪.‬‬
‫;‪a = b = c = 10‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬

‫نکته جالب درمورد زبان ‪ C‬آنستکه دارای یک سری عملگرهای انتساب‬
‫خالصه شده است که باعث می شوند در بعضی موارد بتوانیم عبارات‬
‫کوتاهتری را بنویسیم‪ .‬این عملگرها عبارتند از ‪:‬‬
‫عملگرد‬

‫مثال‬

‫عبارت انتساب معادل‬

‫‪++‬‬

‫;‪a ++‬‬

‫;‪a = a + 1‬‬

‫‪--‬‬

‫;‪a --‬‬

‫;‪a = a – 1‬‬

‫=‪+‬‬

‫;‪a += 5‬‬

‫;‪a = a + 5‬‬

‫=‪-‬‬

‫;‪a -= 8‬‬

‫;‪a= a – 8‬‬

‫=*‬

‫;‪a *= 10‬‬

‫;‪a= a * 10‬‬

‫=‪/‬‬

‫;‪a /= 2‬‬

‫;‪a = a / 2‬‬

‫=‪%‬‬

‫;‪a %= 10‬‬

‫;‪a = a % 10‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬
‫‪‬‬

‫عملگر اول و دوم‪ ،‬عملگرهای یکانی هستند که بترتیب عملگر افزایش و عملگر کاهش‬
‫نامیده می شوند‪.‬‬
‫نکته جالب آنستکه این دو عملگر به دوصورت مورد استفاده قرار می گیرند‪.‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫در حالتی که از دستور ;‪ a ++‬استفاده شود به آن پس افزایش می گویند و بدین معناست که‬
‫ابتدا از مقدار فعلی ‪ a‬در عبارت موردنظر استفاده کن و سپس آن را افزایش بده‪.‬‬
‫اما دستور ;‪ ++ a‬که به آن پیش افزایش گفته می شود‪ ،‬ابتدا ‪ a‬را افزایش داده و سپس از آن‬
‫در عبارت استفاده می کند‪.‬‬
‫به برنامه زیر دقت کنید‪:‬‬

‫>‪#include ‫{ )(‪void main‬‬
‫; ‪int a ,b‬‬
‫;‪a=5‬‬
‫;‪b = a ++‬‬
‫;)‪printf(“a=%d and b=%d \n”,a,b‬‬
‫;‪a=5‬‬
‫;‪b = ++ a‬‬
‫;)‪printf(“a=%d and b=%d \n”,a,b‬‬
‫}‬
‫‪a=6 b=5‬‬
‫‪a=6 b=6‬‬

‫‪ 7-5-3‬عملگرهای مقایسه ای‬
‫‪‬‬

‫‪‬‬

‫این عملگرها دو عبارت را بایکدیگر مقایسه کرده و نتیجه را باز می گردانند‪.‬‬
‫نتیجه می تواند درست )‪ (true‬یا غلط )‪ (false‬باشد‪.‬‬
‫نتیجه این عملگرها یک عدد صحیح است که درصورت درست بودن ‪ 1‬و‬
‫درصورت غلط بودن ‪ 0‬باز می گردانند‪ .‬این عملگرها عبارتند از‪:‬‬
‫عملگر‬

‫مفهوم عملگر‬

‫مثال‬

‫<‬

‫بزرگتر )<(‬

‫‪a>b‬‬

‫>‬

‫کوچکتر )>(‬

‫‪a
‫=<‬

‫بزرگتر یا مساوی )≤(‬

‫‪a >= b‬‬

‫=>‬

‫کوچکتر یا مساوی )≥(‬

‫‪a <= b‬‬

‫==‬

‫مساوی )=(‬

‫‪a == b‬‬

‫=!‬

‫نامساوی )≠(‬

‫‪a != b‬‬

‫‪ 7-5-3‬عملگرهای مقایسه ای‬
‫‪‬‬

‫‪‬‬

‫نکته مهمی که باید به آن دقت کرد عملگر مساوی )==( است‪ ،‬چرا که یک‬
‫اشتباه بسیار متداول برنامه نویسان ‪ C‬استفاده اشتباه از عملگر انتساب‬
‫)=( بجای عملگر تساوی )==( است که باعث ایجاد خطا در برنامه می‬
‫شود‪.‬‬
‫اولویت این عملگرها از باال به پایین بشرح زیر است‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫عملگرهای <‪ <= ، > ،‬و =>‬
‫عملگرهای == و =!‬

‫الزم بذکر است که در هنگام مساوی بودن اولویت چند عملگر‪ ،‬این عملگرها‬
‫از چپ به راست محاسبه می گردند‪.‬‬

‫‪ 7-5-4‬عملگرهای منطقی‬
‫‪‬‬

‫این عملگرها به شما اجازه می دهند که شرطهای ساده ای را که با‬
‫استفاده از عملگرهای مقایسه ای ایجاد شده اند را با یکدیگر ترکیب نموده‬
‫و شرطهای پیچیده تری را بسازید‪ .‬این عملگرها عبارتند از ‪:‬‬
‫مثال‬

‫عملگر‬

‫مفهوم عملگر‬

‫نحوه کار‬

‫&&‬

‫‪ AND‬منطقی‬

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

‫‪a>0 && sw==1‬‬

‫||‬

‫‪ OR‬منطقی‬

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

‫‪a<=100 || b!=0‬‬

‫!‬

‫‪ NOT‬منطقی‬

‫اگر عملوند درست باشد‪ ،‬نادرست و‬
‫اگر نادرست باشد‪ ،‬درست برمی‬
‫گرداند‪.‬‬

‫)‪! (a==1 || b<10‬‬

‫‪ 7-5-5‬عملگر شرطی‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫گاهی الزم است که ابتدا یک شرط بررسی شده و سپس برمبنای نتیجه )درست یا نادرست بودن آن( یکی‬
‫از دو عبارت ممکن بازگردانده شود‪ .‬برای اینکار می توان از یک عملگر ‪3‬تایی )با ‪ 3‬عملوند( بنام عملگر‬
‫شرطی استفاده نمود‪.‬‬
‫شکل کلی این عملگر بصورت زیر است‪:‬‬
‫>عبارت‪> :<2‬عبارت‪> ?<1‬شرط<‬
‫نحوه کار بدینصورت است که درصورت درست بودن شرط‪ ،‬عبارت‪ 1‬و در غیراینصورت عبارت ‪ 2‬بازگردانده می‬
‫شود‪.‬‬
‫به عنوان مثال به دستور زیر توجه کنید‪:‬‬
‫که این عبارت معادل دستور زیر است‪:‬‬

‫‪‬‬

‫;‪a = (k<10) ? 100 : 50‬‬
‫;‪if (k<10) a=100‬‬
‫;‪else a=50‬‬

‫البته این عبارت به شکلهای پیچیده نیز می تواند مورد استفاده قرار گیرد‪ .‬مثال ‪:‬‬
‫;‪c += (a>0 && a<10) ? ++a : a/b‬‬
‫که معادل است با ‪:‬‬
‫{ )‪if (a>0 && a<10‬‬
‫;‪a= a + 1‬‬
‫;‪c = c + a‬‬
‫}‬
‫;‪else c = c + a/b‬‬

‫‪ 7-5-6‬اولویت عملگرها‬
‫عملگر‬

‫اولویت‬

‫شرکت پذیری‬

‫‪1‬‬

‫)(‬

‫از چپ به راست‬

‫‪2‬‬

‫‪- + ! -- ++‬‬

‫از راست به چپ‬

‫‪3‬‬

‫‪* / %‬‬

‫از چپ به راست‬

‫‪4‬‬

‫‪+ -‬‬

‫از چپ به راست‬

‫‪5‬‬

‫>> <<‬

‫از چپ به راست‬

‫‪6‬‬

‫>= > <= <‬

‫از چپ به راست‬

‫‪7‬‬

‫=! ==‬

‫از چپ به راست‬

‫‪8‬‬

‫&&‬

‫از چپ به راست‬

‫‪9‬‬

‫||‬

‫از چپ به راست‬

‫‪10‬‬

‫‪?:‬‬

‫از راست به چپ‬

‫‪11‬‬

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

‫از راست به چپ‬

‫‪12‬‬

‫‪,‬‬

‫از چپ به راست‬

‫‪ 7-6‬خواندن و نمایش اطالعات‬
‫‪‬‬

‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫همانطور كه قبال نیز گفته شد‪ ،‬یكی از اهداف زبان ‪ C‬قابل حمل بودن آن‬
‫است‪ .‬بهمین منظور سعی شده است كه از دستوراتی كه ممكن است‬
‫وابسته به ماشین خاصی باشد‪ ،‬اجتناب گردد‪.‬‬
‫بهمین دلیل زبان ‪ C‬برخالف سایر زبانها دارای هیچ دستوری برای‬
‫خواندن از ورودی و یا نوشتن در خروجی نیست‪.‬‬
‫اما در عوض دارای تعدادی تابع )زیربرنامه( استاندارد می باشد كه تقریبا‬
‫تمامی كامپایلرها از آنها حمایت می كنند‪.‬‬
‫این كار به كامپایلر این امكان را می دهد كه بر حسب نوع سخت افزار‬
‫موردنظر‪ ،‬توابع ورودی و خروجی را طراحی نماید‪.‬‬
‫این توابع در یك فایل سرآمد بنام ‪ stdio.h‬تعریف شده اند و بنابراین قبل‬
‫ازاینكه بتوانید از این توابع استفاده نمایید‪ ،‬باید این فایل را نیز با استفاده‬
‫از ‪ #include‬در برنامه خود بگنجانید‪.‬‬

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫برای نمایش اطالعات در خروجی از تابع ‪ printf‬استفاده می شود‪.‬‬
‫این تابع رشته موردنظر شما را به خروجی استاندارد )كه در حالت‬
‫عادی همان صفحه نمایش یا مانیتور است( می فرستد‪ .‬شكل كلی این‬
‫تابع بصورت زیر است‪:‬‬
‫; )>لیست متغیرها< ‪> ,‬رشته كنترلی<(‪printf‬‬
‫رشته كنترلی همان متنی است كه قصد چاپ آن را داریم‪ ،‬با ذكر این‬
‫نكته كه در قسمتهایی كه باید مقدار یك متغیر چاپ شود‪ ،‬از یك‬
‫مشخصه تبدیل استفاده می شود‪ .‬هر مشخصه تبدیل از یك عالمت ‪%‬‬
‫بعالوه یك كاراكتر كه نوع متغیر مورد نظر را نشان می دهد تشكیل می‬
‫گردد‪.‬‬
‫لیست متغیرها نیز همان متغیرهایی هستند كه قصد چاپ آنها را داریم‪.‬‬
‫این متغیرها باید بترتیب قرار گرفته و با كاما )‪ (,‬از یكدیگر جدا شوند‪.‬‬

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫مشخصه تبدیل‬

‫مفهوم‬

‫‪%c‬‬

‫كاراكتر‬

‫‪%d‬‬

‫عدد صحیح در مبنای ‪10‬‬

‫‪%f‬‬

‫عدد اعشاری بدون نماد علمی‬

‫‪%e‬‬

‫عدد اعشاری با نماد علمی‬

‫‪%g‬‬

‫عدد اعشاری با حالت كوتاهتر بین ‪ e‬و ‪f‬‬

‫‪%s‬‬

‫رشته‬

‫‪%ld‬‬

‫عدد صحیح بزرگ‬

‫‪%lf %le %lg‬‬

‫عدد اعشاری بزرگ‬

‫‪%o‬‬

‫عدد صحیح در مبنای ‪8‬‬

‫‪%x‬‬

‫عدد صحیحی در مبنای ‪16‬‬

‫‪%u‬‬

‫عدد صحیح بدون عالمت‬

‫ تابع نمایش در خروجی‬7-6-1
#include
void main() {
int age = 20;
floate average = 18.23;
printf("You are %d years old and your average is %f \n",age,average);
}
You are 20 years old and your average is 18.230000

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫‪‬‬
‫‪‬‬

‫برای کنترل نحوه چاپ اعداد می توانید از مشخصه طول میدان استفاده‬
‫کنید‪.‬‬
‫مشخصه طول میدان برای اعداد به شكل زیر استفاده می شود‪:‬‬
‫‪ ‬برای اعداد صحیح از ‪ %nd‬استفاده می كنیم كه ‪ n‬تعداد ارقام را نشان‬
‫می دهد )مثال ‪ .(%3d‬در اینصورت برای هر متغیر ‪ n‬رقم درنظر گرفته‬
‫می شود‪ .‬اگر اندازه عدد از ‪ n‬كوچكتر باشد‪ ،‬به سمت چپ آن فضای‬
‫خالی اضافه می شود و اگر اندازه عدد بیش از ‪ n‬رقم باشد‪ ،‬طول میدان‬
‫نادیده گرفته شده و عدد بطور كامل چاپ می شود‪.‬‬
‫‪ ‬برای اعداد اعشاری از ‪ %n.mf‬استفاده می كنیم كه ‪ n‬اندازه كل عدد‬
‫)شامل عالمت ممیز( و ‪ m‬تعداد ارقام اعشار است )مثال ‪ .(%5.2f‬در‬
‫صورتیكه تعداد ارقام اعشاری عدد موردنظر از ‪ m‬بیشتر باشد‪ ،‬عدد به ‪m‬‬
‫عدد اعشار گرد می شود و در صورتیكه از ‪ m‬كمتر باشد‪ ،‬در سمت‬
‫راست آن ‪ 0‬قرار داده می شود‪.‬‬

‫‪ 7-6-2‬تابع خواندن از ورودی‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای خواندن اطالعات از ورودی از تابع ‪ scanf‬استفاده می شود‪.‬‬
‫این تابع اطالعات را ازورودی استاندارد )معموال صفحه كلید( خوانده و در‬
‫متغیرهای تعیین شده قرار می دهد‪.‬‬
‫شكل كلی این تابع بصورت زیر است‪:‬‬
‫; )>لیست آدرسهای متغیرها< ‪> ,‬رشته كنترلی<(‪scanf‬‬
‫همانطور كه می بینید نحوه احضار تابع ‪ scanf‬نیز مشابه ‪ printf‬است‪ .‬تنها‬
‫تفاوت در آن است كه در ‪ scanf‬باید لیست آدرسهای متغیرها ارسال شود‪.‬‬
‫مبحث مربوط به آدرسها در فصول بعدی بررسی خواهد شد ولی در حال حاضر‬
‫بخاطر بسپارید كه برای بدست آوردن آدرس یك متغیر از عالمت & استفاده می‬
‫كنیم‪ .‬بعنوان مثال ‪ &age‬بمعنای آدرس متغیر ‪ age‬است‪.‬‬
‫بطور كلی در ‪ C‬قدیمی هرگاه كه یك تابع دارای پارامترهای خروجی بود )یعنی‬
‫پارامترهایی كه یك مقدار را باز می گرداندند( از آدرس متغیرها استفاده می‬
‫شد كه امروزه این مسئله وجود ندارد‪.‬‬

‫ تابع خواندن از ورودی‬7-6-2
#include
void main() {
int age;
float average ;
printf("Please enter your age and average : ");
scanf("%d %f",&age,&average);
printf("You are %d years old and your average is %5.2f \n",age,average);
}

Please enter your age and average : 19 16.72
You are 19 years old and your average is 16.72

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫زبان ‪ C++‬یک زبان شی گرا است‪ ،‬بهمین دلیل در این زبان برای ورودی‬
‫و خروجی از اشیاء بجای توابع استفاده می گردد‪.‬‬
‫از آنجا که امروزه معموال برنامه نویسان ‪ C‬از کامپایلرهای ‪ C++‬استفاده‬
‫می کنند‪ ،‬می توانند از اشیای ورودی و خروجی آن نیز استفاده کنند‪.‬‬
‫اینکار در بین بسیاری از برنامه نویسان ‪ C‬متداول است‪ ،‬بهمین دلیل ما‬
‫در اینجا نحوه کار با اشیای خواندن و نوشتن در ‪ C++‬را بطور مقدماتی‬
‫توضیح می دهیم؛ گرچه توضیح کامل این موارد نیاز به آشنایی با شی‬
‫گرایی و زبان ‪ C++‬دارد‪.‬‬
‫قبل از هرچیز الزم به ذکر است که کلیه اشیای مربوط به ورودی و‬
‫خروجی در فایل سرآمدی بنام ‪ iostream.h‬تعیریف شده اند‪ ،‬بنابراین‬
‫ابتدا باید این فایل به برنامه توسط دستور ‪ #include‬الحاق گردد‪.‬‬

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫زبان ‪ C++‬برای نمایش اطالعات از یک شیئ بنام ‪ cout‬استفاده می نماید‪.‬‬
‫برای ارسال اطالعات مورد نظر برای چاپ به ‪ cout‬باید از عملگر درج در جریان‬
‫یا >> استفاده نماییم‪ .‬بعنوان مثال ‪:‬‬
‫; ” ‪cout >> “Please enter your name:‬‬
‫و یا مثال دیگر ‪:‬‬
‫;‪int a = 10‬‬
‫;‪float b = 2.86‬‬
‫;‪cout << a‬‬
‫;‪cout << b‬‬
‫نکته جالبی که در این مثالها دیده می شود‪ ،‬آنستکه برخالف تابع ‪ printf‬هیچ‬
‫نیازی به مشخص کردن نوع متغیری که قصد چاپ آن را داریم نیست و خود‬
‫شئ ‪ cout‬نوع آن را تشخیص می دهد‪.‬‬
‫عالوه براین می توان چندین عملگر درج در جریان را با یکدیگر الحاق کرد و‬
‫چندین متغیر را با یک دستور چاپ کرد‪.‬‬

C++ ‫ ورودی و خروجی اطالعات در‬7-6-3
#include
void main() {
int age = 20;
floate average = 18.23;
cout >> “You are ” >> age >> “ years old and your average is ” >> average ;
}

You are 20 years old and your average is 18.230000

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای دریافت اطالعات از کاربر‪ ،‬از شئ دیگری بنام ‪ cin‬استفاده می شود‪.‬‬
‫برای ارسال متغیر مورد نظر به ‪ cin‬باید از عملگر استخراج از جریان یا <<‬
‫استفاده نماییم‪ .‬بعنوان مثال‪:‬‬
‫;‪int a‬‬
‫;‪cin >> a‬‬
‫بازهم همانطور که می بینید نیازی به تعیین نوع متغیر موردنظر نیست و خود‬
‫شئ ‪ cin‬نوع متغیر را بطور اتوماتیک تشخیص داده و داده ای از همان نوع را از‬
‫کاربر دریافت و در متغیر مورد نظر قرار می دهد‪.‬‬
‫عملگرهای استخراج از جریان را نیز می توان با یکدیگر الحاق کرد‪.‬‬
‫برای رفتن به خط بعد در شئ ‪ cout‬می توان از دستکاری کننده ‪ endl‬استفاده‬
‫کرد‪ .‬مثال در دستور زیر پس از چاپ پیغام‪ ،‬مکان نما به خط بعد منتقل می‬
‫شود‪:‬‬
‫;‪cout >> “List of students : “ >> endl‬‬
‫البته دستکاری کننده های متعدد دیگری نیز ازجمله موارد مربوط به تعیین طول‬
‫میدان و نحوه چاپ مقادیر وجود دارد که توضیح آنها نیاز به یک مبحث مستقل‬
‫دارد‪.‬‬

C++ ‫ ورودی و خروجی اطالعات در‬7-6-3
#include
void main() {
int age;
float average ;
cout << "Please enter your age and average : " ;
cin >> age >> average ;
cout << "You are " << age << "years old and your average is " << average;
}

Please enter your age and average : 19 16.72
You are 19 years old and your average is 16.72

‫‪ 7-7‬توابع کتابخانه ای‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫همانطور که قبال نیز گفته شد‪ ،‬زبان ‪ C‬از زیر برنامه ها نیز حمایت می کند‪ .‬هر زیر برنامه‬
‫در ‪ C‬یک تابع نامیده می شود‪ .‬تا کنون با توابعی همچون ‪ main‬و یا ‪ printf‬و ‪ scanf‬آشنا‬
‫شده ایم‪.‬‬
‫معموال عرضه کنندگان کامپایلرها و یا سایر فروشندگان نرم افزار‪ ،‬برخی از توابع عمومی‬
‫را که ممکن است مورد نیاز جمع کثیری از برنامه نویسان مختلف باشد را در قالب‬
‫کتابخانه ای از توابع در اختیار برنامه نویسان می گذارند‪ .‬بعضی از این توابع کتابخانه ای‬
‫مانند ‪ printf‬و ‪ scanf‬بصورت استاندارد درآمده و توسط عرضه کنندگان مختلف ارائه می‬
‫شوند‪.‬‬
‫در کامپایلر عرضه شده توسط شرکت بورلند )‪ (Borland C++ 3.1‬نیز کتابخانه های‬
‫متعددی از توابع برای شما عرضه شده اند که بتدریج با آنها و کاربردشان آشنا خواهید‬
‫شد‪.‬‬
‫نکته مهم آنستکه برای استفاده از این توابع ابتدا باید فایل سرآمد مربوط به آنها را نیز در‬
‫ابتدای برنامه خود اضافه نمایید ) با استفاده از ‪ .(#include‬هر فایل سرآمد شامل تعاریف‬
‫اولیه گروهی از توابع مرتبط با هم و داده های مربوط به آنها بوده و در استاندارد قدیمی‬
‫تر دارای پسوند ‪ .h‬می باشد)در استاندارد جدید پسوند این فایلها حذف شده است(‪.‬‬
‫برخی از این فایلهای سرآمد عبارتند از‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪ : stdio.h‬توابع ورودی و خروجی استاندارد‬
‫‪ : math.h‬توابع ریاضی‬
‫‪ : graphics.h‬توابع مربوط به عملیات گرافیکی‬
‫‪ : string.h‬توابع مربوط به کار با رشته ها‬


Slide 18

‫مبانی کامپیوتر و برنامه سازی‬
‫فصل هفتم ‪ :‬مفاهیم اولیه زبان ‪C‬‬
‫مدرس ‪ :‬نگین معروفی‬

‫‪ 7-1‬شناسه ها در ‪C‬‬
‫‪‬‬
‫‪‬‬

‫شناسه )‪ (identifier‬نامی است که به یک قسمت از برنامه مانند متغیر‪ ،‬تابع‪ ،‬ثابت و یا‬
‫‪ ...‬داده می شود‪.‬‬
‫در زبان ‪ C‬برای انتخاب شناسه ها فقط می توان از عالئم زیر استفاده کرد‪:‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫حروف انگلیسی کوچک و بزرگ )‪(A…Z a…z‬‬
‫ارقام )‪(0…9‬‬
‫عالمت خط پایین یا _‬

‫البته یک شناسه نمی تواند با یک رقم شروع شود‪.‬‬
‫چند شناسه مجاز‪ name2 ، average ، sum :‬و ‪student_average‬‬
‫چند شناسه غیرمجاز ‪ 2name‬و یا ‪student average‬‬
‫در برنامه نویسی امروزی پیشنهاد می شود بجای شناسه هایی همانند‬
‫‪ student_average‬از ‪ studentAverage‬استفاده گردد‪.‬‬
‫نکته مهم دیگری که باید به آن اشاره کرد آنستکه زبان ‪ C‬برخالف بسیاری از زبانهای دیگر‬
‫به کوچک و بزرگی حروف حساس است )‪ .(case sensitive‬در نتیجه شناسه های زیر با‬
‫یکدیگر متفاوتند ‪:‬‬
‫‪Sum ≠ sum ≠ SUM‬‬
‫آخرین نکته اینستکه در هنگام انتخاب شناسه نمی توانید از کلمات کلیدی که برای‬
‫منظورهای خاص در زبان ‪ C‬رزرو شده اند استفاده کنید‪.‬‬

C ‫ شناسه ها در‬7-1
: C ‫کلمات کلیدی در زبان‬
auto

break

case

char

const

continue

default

do

double

else

enum

extern

float

for

goto

if

int

long

register

return

short

signed

sizeof

static

struct

switch

typedef

union

unsigned

void

volatile

while

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫محدوده‬

‫اندازه )بیت(‬

‫توضیح‬

‫نوع داده‬

‫‪-128 to +127‬‬

‫‪8‬‬

‫کاراکتر‬

‫‪char‬‬

‫‪-32768 to +32767‬‬

‫‪16‬‬

‫عدد صحیح‬

‫‪int‬‬

‫‪3.4e-38 to 3.4e+38‬‬

‫‪32‬‬

‫عدد اعشاری‬

‫‪float‬‬

‫‪1.7e-308 to 1.7e+308‬‬

‫‪64‬‬

‫عدد اعشاری با‬
‫دقت مضاعف‬

‫‪double‬‬

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫‪‬‬

‫البته چند نکته مهم درمورد این جدول قابل ذکر است ‪:‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫اندازه ‪ int‬در محیطهای ‪ 16‬بیتی مانند ‪ DOS‬برابر ‪ 16‬بیت است‪ .‬اما در‬
‫محیطهای ‪ 32‬بیتی همانند ‪ Windows‬اندازه آن ‪ 32‬بیت می باشد که در‬
‫اینصورت محدوده ای برابر ‪ -2,147,483,648‬تا ‪ +2,147,483,647‬را‬
‫پوشش می دهد‪.‬‬
‫در بعضی از کامپایلرهای ‪ ،C‬نوع داده ‪ bool‬نیز وجود دارد که می تواند‬
‫یکی از مقادیر ‪)true‬درست( یا ‪) false‬غلط( را نشان دهد ‪ .‬اما در نسخه‬
‫های اولیه ‪ C‬از همان نوع داده صحیح یا ‪ int‬برای اینکار استفاده می‬
‫شد‪ .‬بدین صورت که ‪ 0‬نشاندهنده ‪ false‬و هر عدد غیر صفر )معموال ‪(1‬‬
‫نشاندهنده ‪ true‬است‪.‬‬
‫از آنجا که برای ذخیره سازی کاراکترها کد اسکی آنها ذخیره می گردد‪،‬‬
‫از یک متغیر کاراکتری یا ‪ char‬می توان بعنوان یک عدد صحیح کوچک نیز‬
‫استفاده کرد و اعمال ریاضی برروی آنها نیز مجاز است‪.‬‬

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫عالوه براین چندین اصالح کننده نیز وجود دارد که به ما اجازه می دهد نوع داده مورد‬
‫نظر را با دقت بیشتری برای نیازهای مختلف استفاده نماییم‪.‬‬
‫این اصالح کننده ها عبارتند از ‪short, long, signed, unsigned :‬‬
‫تمام این اصالح کننده ها می توانند به نوع داده ‪ int‬اعمال شوند و اثر آنها بستگی‬
‫به محیط دارد‪.‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫در یک محیط ‪16‬بیتی‪short int ،‬بازهم برابر ‪16‬بیت است ولی ‪ long int‬برابر‪32‬بیت می‬
‫باشد‪.‬‬
‫‪ unsigned int‬باعث می شود که یک عدد ‪ 16‬بیتی بدون عالمت داشته باشیم که بازه‬
‫بین ‪ 0‬تا ‪ 65535‬را پوشش می دهد‪ signed int .‬نیز همانند ‪ int‬معمولی بوده و تفاوتی‬
‫ندارد‪.‬‬
‫ترکیب این اصالح کننده ها نیز ممکن است‪ .‬مثال ‪ unsigned long int‬یک عدد ‪ 32‬بیتی‬
‫بدون عالمت است که بازه ‪ 0‬تا ‪ 4,294,967,295‬را پوشش می دهد‪.‬‬

‫برروی نوع داده ‪ char‬فقط اصالح کننده های ‪ signed‬و ‪ unsigned‬را می توان اعمال‬
‫کرد‪ .‬معموال از اصالح کننده ‪ unsigned‬وقتی استفاده می شود که قصد داشته‬
‫باشیم از ‪ char‬بعنوان یک عدد صحیح مثبت بین ‪ 0‬تا ‪ 255‬استفاده کنیم‪.‬‬
‫برروی نوع داده ‪ double‬تنها اصالح کننده ‪ long‬قابل اعمال است و دراینصورت عدد‬
‫اعشاری با ‪ 80‬بیت را خواهیم داشت که قادر است هر عددی در بازه ‪ 3.4e-4932‬تا‬
‫‪ 1.1e+4932‬را در خود نگاه دارد‪.‬‬

‫‪ 7-3‬تعریف متغیرها‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای تعریف متغیرها به شکل زیر عمل می کنیم‪:‬‬

‫;>‪ ‫که ‪ type‬یکی از نوع داده های گفته شده و ‪ variable-list‬لیستی از متغیرها است‬
‫که با کاما از یکدیگر جدا شده اند‪ .‬بعنوان مثال ‪:‬‬
‫;‪int sum‬‬
‫;‪float average‬‬
‫; ‪long int a, b, c‬‬
‫; ‪unsigned long int i, j, k‬‬
‫عالوه براین می توان در هنگام تعریف متغیر به آن مقدار اولیه نیز داد‪ .‬مثال ‪:‬‬
‫; ‪int d = 0‬‬
‫نكته مهم آنكه زبان ‪ C‬به متغیرها مقدار اولیه نمي دهد )حتي ‪ (0‬و برنامه نويس‬
‫خود بايد اينكار را صريحا انجام دهد‪ ،‬درغیر اينصورت مقدار اولیه متغیر‪ ،‬نامعین خواهد‬
‫بود‪.‬‬
‫تعریف متغیرها طبق اصول زبان ‪ C‬میتواند درهرجایی از برنامه صورت پذیرد‪ ،‬و‬
‫متغیرهای تعریف شده از همان خط به بعد قابل استفاده خواهد بود‪ .‬اما معموال‬
‫توصیه می گردد كه تعریف متغیرها در همان خط ابتدایی تابع و بالفاصله پس از {‬
‫صورت پذیرد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫‪‬‬
‫‪‬‬

‫ثابتها مقادیر ثابتی هستند كه مقدار آنها در حین اجرای برنامه تغییر نمی یابد‪ .‬ثابتها می توانند از‬
‫هریك از نوع داده های اصلی باشند‪.‬‬
‫ثوابت عددی صحیح ‪:‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫برای نمایش این دسته از ثوابت‪ ،‬از دنباله ای از ارقام بعالوه عالمت ‪ +‬یا ‪ -‬استفاده می كنیم‪ .‬بعنوان مثال‬
‫‪ -45‬و یا ‪ 3489‬ثوابت صحیح هستند‪.‬‬
‫در حالت عادی ‪ C‬هر عدد را در كوچكترین نوع داده ای كه می تواند قرار می دهد‪ .‬مثال عدد ‪ 85‬در یك‬
‫‪ int‬قرار می گیرد‪ ،‬اما عدد ‪ 145398‬در یك ‪ long int‬قرار خواهد گرفت‪.‬‬
‫اگر قصد دارید یك عدد كوچك بعنوان ‪ long‬محسوب گردد‪ ،‬می توانید از پسوند ‪ L‬در انتهای آن استفاده‬
‫می كنیم‪ .‬مثال ‪245L‬یك عدد ‪ long‬محسوب می شود‪.‬‬
‫;‪long int a = 20L‬‬
‫پسوند ‪ U‬در انتهای عدد نیز نشانه بدون عالمت بودن آن است‪.‬‬
‫نكته دیگر آنكه ‪ C‬به شما اجازه می دهد درصورت لزوم ثوابت صحیح خود را در مبنای ‪ 8‬یا ‪ 16‬نیز كه‬
‫از مبناهای متداول در برنامه نویسی هستند‪ ،‬بنویسید‪.‬‬
‫‪‬‬
‫‪‬‬

‫برای نوشتن عدد در مبنای ‪ 8‬باید آن را با ‪ 0‬آغاز كنید‪ ،‬مثال ‪ 0342‬یك عدد در منای ‪ 8‬محسوب می‬
‫گردد‪.‬‬
‫برای نوشتن یك عدد در مبنای ‪ 16‬باید آن را با ‪ 0x‬آغاز نمایید‪ ،‬مانند ‪.0x27A4‬‬

‫‪ 7-4‬ثوابت‬
‫ثوابت عددی اعشاری‬

‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫برای نمایش اعداد اعشاری‪ ،‬باید از نقطه اعشار استفاده كنیم‪ ،‬مانند ‪237.45‬‬
‫اما نكته جالب آنستكه می توانید از نماد علمی نیز برای نمایش اعداد‬
‫اعشاری استفاده كنید‪ .‬برای اینكار كافی است از حرف ‪ e‬برای نمایش قسمت‬
‫توان استفاده نمایید‪ .‬بعنوان مثال ‪:‬‬
‫‪-23.47 × 10 5 = -23.47e5‬‬
‫‪42.389 × 10 -3 = 42.389e-3‬‬
‫دقت كنید كه قسمت توان‪ ،‬حتما یك عدد صحیح است‪.‬‬
‫نكته جالب اینجاست كه برخالف مورد قبل‪ ،‬كامپایلر بطور پیش فرض داده های‬
‫اعشاری را از نوع ‪ double‬فرض می كند‪.‬چنانچه دوست دارید ثابت شما ازنوع‬
‫‪ float‬درنظر گرفته شود‪ ،‬در انتهای آن ‪ F‬قرار دهید‪ .‬ضمنا پسوند ‪ L‬نیز داده‬
‫اعشاری را از نوع ‪ long double‬درنظر می گیرد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫ثوابت كاراكتری ‪:‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫برای نشان دادن ثوابت كاراكتری‪ ،‬آنها را در داخل ' قرار می دهیم‪ .‬بعنوان مثال‬
‫'‪'A‬یك ثابت كاراكتری است‪.‬‬
‫; '‪char ch = 'S‬‬
‫دقت كنید كه همانطور كه قبال گفته شد‪ ،‬كد اسكی كاراكترها در متغیر ذخیره‬
‫می گردد‪ ،‬بنابراین می توان از آن بعنوان یك عدد صحیح نیز استفاده كرد‪ .‬نكته‬
‫مهم دیگر آنستكه به تفاوت عدد ‪ 5‬و كاراكتر '‪ '5‬دقت داشته باشید‪ .‬در حقیقت‬
‫'‪ '5‬برابر است با عدد ‪ 53‬كه همان كد اسكی آن است‪.‬‬
‫روش فوق‪ ،‬برای نمایش کاراکترهای قابل چاپ مناسب است‪ ،‬اما بعضی‬
‫كاراكترها مانند ‪ enter‬قابل نمایش نبوده و برای آنها شکل خاصی وجود ندارد‪.‬‬
‫در چنین مواردی‪ ،‬زبان ‪ C‬از ترکیب عالمت \ به همراه یک کاراکتر دیگر‪ ،‬برای‬
‫نمایش این قبیل کاراکترها استفاده می نماید‪ .‬بعنوان مثال‪ ،‬کاراکتر '‪ '\n‬نشان‬
‫دهنده خط جدید یا همان ‪ enter‬می باشد‪.‬‬
‫جدول صفحه بعد این قبیل کاراکترها و معادل آنها را نشان می دهد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫نحوه نمایش در ‪C‬‬

‫کد اسکی‬

‫صدای بوق کامپیوتر‬

‫‪\a‬‬

‫‪7‬‬

‫حرکت به عقب ‪backspace‬‬

‫‪\b‬‬

‫‪8‬‬

‫شروع صفحه ‪form feed‬‬

‫‪\f‬‬

‫‪12‬‬

‫سطر جدید ‪line feed‬‬

‫‪\n‬‬

‫‪10‬‬

‫برگشت به ابتداي سطر ‪carriage return‬‬

‫‪\r‬‬

‫‪13‬‬

‫فاصله افقی ‪horizontal tab‬‬

‫‪\t‬‬

‫‪9‬‬

‫فاصله عمودی ‪vertical tab‬‬

‫‪\v‬‬

‫‪11‬‬

‫عالمت سوال‬

‫?\‬

‫‪63‬‬

‫عالمت '‬

‫'\‬

‫‪39‬‬

‫عالمت "‬

‫"\‬

‫‪34‬‬

‫عالمت \‬

‫\\‬

‫‪92‬‬

‫عالمت تهی‬

‫‪\0‬‬

‫‪0‬‬

‫نام کاراکتر‬

‫کد اسکی یک کاراکتر با ‪ 3‬رقم در مبنای ‪8‬‬

‫‪\000‬‬

‫کد اسکی یک کاراکتر با ‪ 2‬رقم در مبنای ‪16‬‬

‫‪\x00‬‬

‫‪ 7-4‬ثوابت‬
‫‪‬‬

‫ثوابت رشته ای ‪ C :‬عالوه بر ثوابت فوق‪ ،‬از یك ثابت دیگر بنام رشته نیز‬
‫حمایت می كند‪ .‬رشته‪ ،‬دنباله ای از كاراكترها است كه در داخل " قرار‬
‫می گیرند‪ .‬بعنوان مثال "‪ "this is a test‬یك رشته است‪ .‬دقت كنید كه '‪'a‬‬
‫یك كاراكتر است‪ ،‬اما "‪ "a‬یك رشته است كه فقط شامل یك كاراكتر می‬
‫باشد‪.‬‬

‫‪ 7-5‬عملگرها‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫عملگر‪ ،‬نمادی است كه به كامپایلر می گوید تا عملیات محاسباتی یا‬
‫منطقی خاصی را برروی یك یا چند عملوند‪ ،‬انجام دهد‪.‬‬
‫به عملگرهایی كه فقط یك عملوند دارند‪ ،‬عملگر یكانی می گوییم و‬
‫همواره عملگر در سمت چپ عملوند قرار می گیرد)مانند عدد ‪.(-125‬‬
‫اما عملگرهایی كه برروی دو عملوند اثر می كنند را عملگر دودویی‬
‫نامیده و عملگر را بین دو عملوند قرار می دهیم )مانند ‪.(23+86‬‬
‫هر ترکیب درستی از عملگرها و عملوندها را یک عبارت می نامیم‪.‬‬
‫‪ C‬از نقطه نظر عملگرها یك زبان بسیار قوی است‪ .‬این عملگرها به چند‬
‫دسته اصلی تقسیم می گردند كه آنها را به ترتیب بررسی می كنیم‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫این عملگرها‪ ،‬همان اعمال متداول ریاضی هستند كه در زبان ‪ C‬مورد استفاده‬
‫قرار می گیرند‪ .‬این اعمال عبارتند از ‪:‬‬

‫عمل‬

‫نوع‬

‫عملگر‬

‫منفی كردن عملوند سمت راست‬

‫یكانی‬

‫‪-‬‬

‫جمع دو عملوند‬

‫دودویی‬

‫‪+‬‬

‫تفریق دو عملوند‬

‫دودویی‬

‫‪-‬‬

‫ضرب دو عملوند‬

‫دودویی‬

‫*‬

‫تقسیم دو عملوند‬

‫دودویی‬

‫‪/‬‬

‫محاسبه باقیمانده تقسیم دو عملوند‬

‫دودویی‬

‫‪%‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬
‫‪‬‬

‫این عملگرهای برروی همه انواع داده های ‪ C‬عمل می كنند‪ ،‬بجز عملگر ‪ %‬كه فقط‬
‫برروی نوع داده های صحیح عمل می كند‪.‬‬
‫اما نكته مهمی كه باید به آن اشاره كرد‪ ،‬نحوه كار عملگر تقسیم برروی نوع داده های‬
‫مختلف است‪.‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫درصورتیكه هردو عملوند صحیح باشند‪ ،‬تقسیم بصورت صحیح بر صحیح انجام خواهد شد‪.‬‬
‫اگر یكی یا هر دو عملوند اعشاری باشند‪ ،‬تقسیم بصورت اعشاری انجام خواهد پذیرفت‪.‬‬
‫فرض كنید تعاریف زیر را داریم ‪:‬‬
‫; ‪int a,b‬‬
‫; ‪float c,d‬‬
‫; ‪a = 10 ; b = 4‬‬
‫;‪c = 8.2; d = 4.0‬‬
‫اكنون به نتایج عملیات زیر دقت كنید ‪:‬‬
‫‪a / b => 2‬‬
‫‪c / d => 2.05‬‬
‫‪a / d => 2.5‬‬
‫‪a / 4 => 2‬‬
‫چنانچه به آخرین مورد توجه كنید‪ ،‬متوجه می شوید كه از آنجا كه ‪a‬یك متغیر صحیح است و ‪4‬‬
‫نیز یك ثابت صحیح در نظر گرفته شده‪ ،‬درنتیجه تقسیم بصورت صحیح بر صحیح انجام گرفته‬
‫است‪ .‬چنانچه بخواهیم تقسیم بصورت اعشاری صورت پذیرد‪ ،‬به دو شكل می توانیم عمل‬
‫كنیم‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫برای اینکه عبارت تقسیم صفحه قبل بصورت اعشاری انجام شود‪ ،‬به دو روش‬
‫می توان عمل کرد‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫این عبارت را بصورت ‪ a / 4.0‬بنویسیم‪.‬‬
‫از عملگر قالب ریزی استفاده كنیم‪.‬‬

‫عملگر قالب ریزی می تواند یك نوع را به نوع دیگری تبدیل نماید‪ .‬شكل كلی آن‬
‫به شكل زیر است ‪:‬‬
‫>‪() ‫كه ‪ type‬نوع مورد نظر است كه قصد تبدیل عبارت ‪ expression‬به آن نوع را‬
‫داریم‪ .‬بعنوان مثال در مورد قبلی می توان به شكل زیر عمل كرد ‪:‬‬
‫‪(float) a / 4‬‬
‫در این حالت از كامپایلر خواسته ایم كه ابتدا عدد ‪ a‬را به اعشاری تبدیل كند‬
‫)البته بصورت موقت( و سپس آن را بر ‪ 4‬تقسیم نماید‪ ،‬كه مسلما حاصل‬
‫اعشاری خواهد بود‪.‬‬
‫بطوركلی هرگاه ثابتها و متغیرهایی از انواع مختلف در یك عبارت محاسباتی‬
‫داشته باشیم‪ ،‬كامپایلر ‪ C‬همه آنها را به یك نوع یكسان كه همان بزرگترین‬
‫عملوند موجود است تبدیل خواهد كرد‪ .‬بعنوان مثال به مورد صفحه بعد دقت‬
‫كنید ‪:‬‬

‫ عملگرهای محاسباتی‬7-5-1
char ch;
int i;

float f;
double d;
result = (ch / i)
int

+

(f *d)

(f+i)
float

double

double

int

-

double

double

float

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫اولویت عملگرها ‪ :‬در عبارتی که شامل چندین عملگر است‪ ،‬کدامیک در‬
‫ابتدا اعمال خواهد گردید‪.‬‬
‫اولویت عملگرهای محاسباتی از باال به پایین بشرح زیر است‪:‬‬
‫‪ ‬عملگر یکانی –‬
‫‪ ‬عملگرهای * و ‪ /‬و ‪%‬‬
‫‪ ‬عملگرهای ‪ +‬و –‬
‫چنانچه اولویت دو عملگر یکسان باشد‪ ،‬این عملگرها از چپ به راست‬
‫محاسبه خواهند شد‪.‬‬
‫چنانچه بخواهیم یک عمل با اولویت پایین زودتر انجام شود‪ ،‬باید از پرانتز‬
‫استفاده کنیم‪ .‬بنابراین اولویت عملگر پرانتز از همه موارد فوق‬
‫بیشتراست‪ .‬در مورد پرانتزهای متداخل‪ ،‬ابتدا پرانتز داخلی محاسبه‬
‫می شود؛ اما در مورد پرانتزهای هم سطح‪ ،‬ابتدا پرانتز سمت چپتر‬
‫محاسبه می گردد‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫چند مثال در مورد اولویت عملگرها‬

‫ترتیب اجرای عملگرها‬

‫عبارت زبان ‪C‬‬

‫ابتدا عمل * و سپس عمل ‪+‬‬

‫‪b+c*d‬‬

‫ابتدا عمل ‪ +‬و سپس عمل *‬

‫‪(b + c) * d‬‬

‫ابتدا عمل ‪ /‬سپس عمل * و در انتها عمل ‪+‬‬

‫‪b+c/d*e‬‬

‫ابتدا عمل * سپس عمل ‪ /‬و در انتها عمل ‪+‬‬

‫)‪b + c / (d * e‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫یک مثال کامل در مورد اولویت عملگرها‬

‫‪result = a + b * (f – (g + b) / d) – c * (a – d) / e‬‬
‫‪6‬‬

‫‪1‬‬
‫‪7‬‬

‫‪2‬‬

‫‪8‬‬

‫‪3‬‬
‫‪4‬‬
‫‪5‬‬
‫‪9‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫در زبان ‪ C‬برای انتساب چندین عملگر وجود دارد‪ .‬ساده ترین عملگر انتساب‪ ،‬همان عملگر =‬
‫است که در بسیاری از زبانها استفاده می شود‪ .‬بعنوان مثال ‪:‬‬
‫;‪a = 5‬‬
‫;‪b = c + 2 * d‬‬
‫این عملگر باعث می شود که عبارت سمت راست در عبارت سمت چپ قرار گیرد‪.‬‬
‫توجه کنید که مقدار سمت چپ باید عبارتی باشد که بتوان به آن یک مقدار را نسبت داد‬
‫)مانند یک متغیر( که به آن ‪ Lvalue‬گفته می شود‪ ،‬بنابراین یک ثابت نمی تواند در سمت چپ‬
‫قرار گیرد‪.‬‬
‫نکته دیگر اینکه اولویت عملگر = از عملگرهای ریاضی کمتر است و درنتیجه ابتدا آن عملیات‬
‫انجام شده و در پایان حاصل در عبارت سمت چپ ریخته می شود‪.‬‬
‫الزم به ذکر است که در هنگام انتساب‪ ،‬درصورت لزوم نوع عبارت سمت راست به نوع عبارت‬
‫سمت چپ تبدیل می شود‪ .‬مثال‪:‬‬
‫;‪int a‬‬
‫;‪a = 2.5 * 5.0‬‬
‫که دراینصورت عدد ‪ 12‬در ‪ a‬ذخیره خواهد شد‪.‬‬
‫شرکت پذیری این عملگر از راست به چپ می باشد‪ ،‬بدین معنا که چنانچه چندین عملگر‬
‫نسبت دهی داشته باشیم‪ ،‬این عملگرها از راست به چپ محاسبه می شوند‪ .‬مثال پس از‬
‫اجرای دستور زیر‪ ،‬مقدار هر ‪ 3‬متغیر برابر ‪ 10‬خواهد شد‪.‬‬
‫;‪a = b = c = 10‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬

‫نکته جالب درمورد زبان ‪ C‬آنستکه دارای یک سری عملگرهای انتساب‬
‫خالصه شده است که باعث می شوند در بعضی موارد بتوانیم عبارات‬
‫کوتاهتری را بنویسیم‪ .‬این عملگرها عبارتند از ‪:‬‬
‫عملگرد‬

‫مثال‬

‫عبارت انتساب معادل‬

‫‪++‬‬

‫;‪a ++‬‬

‫;‪a = a + 1‬‬

‫‪--‬‬

‫;‪a --‬‬

‫;‪a = a – 1‬‬

‫=‪+‬‬

‫;‪a += 5‬‬

‫;‪a = a + 5‬‬

‫=‪-‬‬

‫;‪a -= 8‬‬

‫;‪a= a – 8‬‬

‫=*‬

‫;‪a *= 10‬‬

‫;‪a= a * 10‬‬

‫=‪/‬‬

‫;‪a /= 2‬‬

‫;‪a = a / 2‬‬

‫=‪%‬‬

‫;‪a %= 10‬‬

‫;‪a = a % 10‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬
‫‪‬‬

‫عملگر اول و دوم‪ ،‬عملگرهای یکانی هستند که بترتیب عملگر افزایش و عملگر کاهش‬
‫نامیده می شوند‪.‬‬
‫نکته جالب آنستکه این دو عملگر به دوصورت مورد استفاده قرار می گیرند‪.‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫در حالتی که از دستور ;‪ a ++‬استفاده شود به آن پس افزایش می گویند و بدین معناست که‬
‫ابتدا از مقدار فعلی ‪ a‬در عبارت موردنظر استفاده کن و سپس آن را افزایش بده‪.‬‬
‫اما دستور ;‪ ++ a‬که به آن پیش افزایش گفته می شود‪ ،‬ابتدا ‪ a‬را افزایش داده و سپس از آن‬
‫در عبارت استفاده می کند‪.‬‬
‫به برنامه زیر دقت کنید‪:‬‬

‫>‪#include ‫{ )(‪void main‬‬
‫; ‪int a ,b‬‬
‫;‪a=5‬‬
‫;‪b = a ++‬‬
‫;)‪printf(“a=%d and b=%d \n”,a,b‬‬
‫;‪a=5‬‬
‫;‪b = ++ a‬‬
‫;)‪printf(“a=%d and b=%d \n”,a,b‬‬
‫}‬
‫‪a=6 b=5‬‬
‫‪a=6 b=6‬‬

‫‪ 7-5-3‬عملگرهای مقایسه ای‬
‫‪‬‬

‫‪‬‬

‫این عملگرها دو عبارت را بایکدیگر مقایسه کرده و نتیجه را باز می گردانند‪.‬‬
‫نتیجه می تواند درست )‪ (true‬یا غلط )‪ (false‬باشد‪.‬‬
‫نتیجه این عملگرها یک عدد صحیح است که درصورت درست بودن ‪ 1‬و‬
‫درصورت غلط بودن ‪ 0‬باز می گردانند‪ .‬این عملگرها عبارتند از‪:‬‬
‫عملگر‬

‫مفهوم عملگر‬

‫مثال‬

‫<‬

‫بزرگتر )<(‬

‫‪a>b‬‬

‫>‬

‫کوچکتر )>(‬

‫‪a
‫=<‬

‫بزرگتر یا مساوی )≤(‬

‫‪a >= b‬‬

‫=>‬

‫کوچکتر یا مساوی )≥(‬

‫‪a <= b‬‬

‫==‬

‫مساوی )=(‬

‫‪a == b‬‬

‫=!‬

‫نامساوی )≠(‬

‫‪a != b‬‬

‫‪ 7-5-3‬عملگرهای مقایسه ای‬
‫‪‬‬

‫‪‬‬

‫نکته مهمی که باید به آن دقت کرد عملگر مساوی )==( است‪ ،‬چرا که یک‬
‫اشتباه بسیار متداول برنامه نویسان ‪ C‬استفاده اشتباه از عملگر انتساب‬
‫)=( بجای عملگر تساوی )==( است که باعث ایجاد خطا در برنامه می‬
‫شود‪.‬‬
‫اولویت این عملگرها از باال به پایین بشرح زیر است‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫عملگرهای <‪ <= ، > ،‬و =>‬
‫عملگرهای == و =!‬

‫الزم بذکر است که در هنگام مساوی بودن اولویت چند عملگر‪ ،‬این عملگرها‬
‫از چپ به راست محاسبه می گردند‪.‬‬

‫‪ 7-5-4‬عملگرهای منطقی‬
‫‪‬‬

‫این عملگرها به شما اجازه می دهند که شرطهای ساده ای را که با‬
‫استفاده از عملگرهای مقایسه ای ایجاد شده اند را با یکدیگر ترکیب نموده‬
‫و شرطهای پیچیده تری را بسازید‪ .‬این عملگرها عبارتند از ‪:‬‬
‫مثال‬

‫عملگر‬

‫مفهوم عملگر‬

‫نحوه کار‬

‫&&‬

‫‪ AND‬منطقی‬

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

‫‪a>0 && sw==1‬‬

‫||‬

‫‪ OR‬منطقی‬

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

‫‪a<=100 || b!=0‬‬

‫!‬

‫‪ NOT‬منطقی‬

‫اگر عملوند درست باشد‪ ،‬نادرست و‬
‫اگر نادرست باشد‪ ،‬درست برمی‬
‫گرداند‪.‬‬

‫)‪! (a==1 || b<10‬‬

‫‪ 7-5-5‬عملگر شرطی‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫گاهی الزم است که ابتدا یک شرط بررسی شده و سپس برمبنای نتیجه )درست یا نادرست بودن آن( یکی‬
‫از دو عبارت ممکن بازگردانده شود‪ .‬برای اینکار می توان از یک عملگر ‪3‬تایی )با ‪ 3‬عملوند( بنام عملگر‬
‫شرطی استفاده نمود‪.‬‬
‫شکل کلی این عملگر بصورت زیر است‪:‬‬
‫>عبارت‪> :<2‬عبارت‪> ?<1‬شرط<‬
‫نحوه کار بدینصورت است که درصورت درست بودن شرط‪ ،‬عبارت‪ 1‬و در غیراینصورت عبارت ‪ 2‬بازگردانده می‬
‫شود‪.‬‬
‫به عنوان مثال به دستور زیر توجه کنید‪:‬‬
‫که این عبارت معادل دستور زیر است‪:‬‬

‫‪‬‬

‫;‪a = (k<10) ? 100 : 50‬‬
‫;‪if (k<10) a=100‬‬
‫;‪else a=50‬‬

‫البته این عبارت به شکلهای پیچیده نیز می تواند مورد استفاده قرار گیرد‪ .‬مثال ‪:‬‬
‫;‪c += (a>0 && a<10) ? ++a : a/b‬‬
‫که معادل است با ‪:‬‬
‫{ )‪if (a>0 && a<10‬‬
‫;‪a= a + 1‬‬
‫;‪c = c + a‬‬
‫}‬
‫;‪else c = c + a/b‬‬

‫‪ 7-5-6‬اولویت عملگرها‬
‫عملگر‬

‫اولویت‬

‫شرکت پذیری‬

‫‪1‬‬

‫)(‬

‫از چپ به راست‬

‫‪2‬‬

‫‪- + ! -- ++‬‬

‫از راست به چپ‬

‫‪3‬‬

‫‪* / %‬‬

‫از چپ به راست‬

‫‪4‬‬

‫‪+ -‬‬

‫از چپ به راست‬

‫‪5‬‬

‫>> <<‬

‫از چپ به راست‬

‫‪6‬‬

‫>= > <= <‬

‫از چپ به راست‬

‫‪7‬‬

‫=! ==‬

‫از چپ به راست‬

‫‪8‬‬

‫&&‬

‫از چپ به راست‬

‫‪9‬‬

‫||‬

‫از چپ به راست‬

‫‪10‬‬

‫‪?:‬‬

‫از راست به چپ‬

‫‪11‬‬

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

‫از راست به چپ‬

‫‪12‬‬

‫‪,‬‬

‫از چپ به راست‬

‫‪ 7-6‬خواندن و نمایش اطالعات‬
‫‪‬‬

‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫همانطور كه قبال نیز گفته شد‪ ،‬یكی از اهداف زبان ‪ C‬قابل حمل بودن آن‬
‫است‪ .‬بهمین منظور سعی شده است كه از دستوراتی كه ممكن است‬
‫وابسته به ماشین خاصی باشد‪ ،‬اجتناب گردد‪.‬‬
‫بهمین دلیل زبان ‪ C‬برخالف سایر زبانها دارای هیچ دستوری برای‬
‫خواندن از ورودی و یا نوشتن در خروجی نیست‪.‬‬
‫اما در عوض دارای تعدادی تابع )زیربرنامه( استاندارد می باشد كه تقریبا‬
‫تمامی كامپایلرها از آنها حمایت می كنند‪.‬‬
‫این كار به كامپایلر این امكان را می دهد كه بر حسب نوع سخت افزار‬
‫موردنظر‪ ،‬توابع ورودی و خروجی را طراحی نماید‪.‬‬
‫این توابع در یك فایل سرآمد بنام ‪ stdio.h‬تعریف شده اند و بنابراین قبل‬
‫ازاینكه بتوانید از این توابع استفاده نمایید‪ ،‬باید این فایل را نیز با استفاده‬
‫از ‪ #include‬در برنامه خود بگنجانید‪.‬‬

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫برای نمایش اطالعات در خروجی از تابع ‪ printf‬استفاده می شود‪.‬‬
‫این تابع رشته موردنظر شما را به خروجی استاندارد )كه در حالت‬
‫عادی همان صفحه نمایش یا مانیتور است( می فرستد‪ .‬شكل كلی این‬
‫تابع بصورت زیر است‪:‬‬
‫; )>لیست متغیرها< ‪> ,‬رشته كنترلی<(‪printf‬‬
‫رشته كنترلی همان متنی است كه قصد چاپ آن را داریم‪ ،‬با ذكر این‬
‫نكته كه در قسمتهایی كه باید مقدار یك متغیر چاپ شود‪ ،‬از یك‬
‫مشخصه تبدیل استفاده می شود‪ .‬هر مشخصه تبدیل از یك عالمت ‪%‬‬
‫بعالوه یك كاراكتر كه نوع متغیر مورد نظر را نشان می دهد تشكیل می‬
‫گردد‪.‬‬
‫لیست متغیرها نیز همان متغیرهایی هستند كه قصد چاپ آنها را داریم‪.‬‬
‫این متغیرها باید بترتیب قرار گرفته و با كاما )‪ (,‬از یكدیگر جدا شوند‪.‬‬

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫مشخصه تبدیل‬

‫مفهوم‬

‫‪%c‬‬

‫كاراكتر‬

‫‪%d‬‬

‫عدد صحیح در مبنای ‪10‬‬

‫‪%f‬‬

‫عدد اعشاری بدون نماد علمی‬

‫‪%e‬‬

‫عدد اعشاری با نماد علمی‬

‫‪%g‬‬

‫عدد اعشاری با حالت كوتاهتر بین ‪ e‬و ‪f‬‬

‫‪%s‬‬

‫رشته‬

‫‪%ld‬‬

‫عدد صحیح بزرگ‬

‫‪%lf %le %lg‬‬

‫عدد اعشاری بزرگ‬

‫‪%o‬‬

‫عدد صحیح در مبنای ‪8‬‬

‫‪%x‬‬

‫عدد صحیحی در مبنای ‪16‬‬

‫‪%u‬‬

‫عدد صحیح بدون عالمت‬

‫ تابع نمایش در خروجی‬7-6-1
#include
void main() {
int age = 20;
floate average = 18.23;
printf("You are %d years old and your average is %f \n",age,average);
}
You are 20 years old and your average is 18.230000

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫‪‬‬
‫‪‬‬

‫برای کنترل نحوه چاپ اعداد می توانید از مشخصه طول میدان استفاده‬
‫کنید‪.‬‬
‫مشخصه طول میدان برای اعداد به شكل زیر استفاده می شود‪:‬‬
‫‪ ‬برای اعداد صحیح از ‪ %nd‬استفاده می كنیم كه ‪ n‬تعداد ارقام را نشان‬
‫می دهد )مثال ‪ .(%3d‬در اینصورت برای هر متغیر ‪ n‬رقم درنظر گرفته‬
‫می شود‪ .‬اگر اندازه عدد از ‪ n‬كوچكتر باشد‪ ،‬به سمت چپ آن فضای‬
‫خالی اضافه می شود و اگر اندازه عدد بیش از ‪ n‬رقم باشد‪ ،‬طول میدان‬
‫نادیده گرفته شده و عدد بطور كامل چاپ می شود‪.‬‬
‫‪ ‬برای اعداد اعشاری از ‪ %n.mf‬استفاده می كنیم كه ‪ n‬اندازه كل عدد‬
‫)شامل عالمت ممیز( و ‪ m‬تعداد ارقام اعشار است )مثال ‪ .(%5.2f‬در‬
‫صورتیكه تعداد ارقام اعشاری عدد موردنظر از ‪ m‬بیشتر باشد‪ ،‬عدد به ‪m‬‬
‫عدد اعشار گرد می شود و در صورتیكه از ‪ m‬كمتر باشد‪ ،‬در سمت‬
‫راست آن ‪ 0‬قرار داده می شود‪.‬‬

‫‪ 7-6-2‬تابع خواندن از ورودی‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای خواندن اطالعات از ورودی از تابع ‪ scanf‬استفاده می شود‪.‬‬
‫این تابع اطالعات را ازورودی استاندارد )معموال صفحه كلید( خوانده و در‬
‫متغیرهای تعیین شده قرار می دهد‪.‬‬
‫شكل كلی این تابع بصورت زیر است‪:‬‬
‫; )>لیست آدرسهای متغیرها< ‪> ,‬رشته كنترلی<(‪scanf‬‬
‫همانطور كه می بینید نحوه احضار تابع ‪ scanf‬نیز مشابه ‪ printf‬است‪ .‬تنها‬
‫تفاوت در آن است كه در ‪ scanf‬باید لیست آدرسهای متغیرها ارسال شود‪.‬‬
‫مبحث مربوط به آدرسها در فصول بعدی بررسی خواهد شد ولی در حال حاضر‬
‫بخاطر بسپارید كه برای بدست آوردن آدرس یك متغیر از عالمت & استفاده می‬
‫كنیم‪ .‬بعنوان مثال ‪ &age‬بمعنای آدرس متغیر ‪ age‬است‪.‬‬
‫بطور كلی در ‪ C‬قدیمی هرگاه كه یك تابع دارای پارامترهای خروجی بود )یعنی‬
‫پارامترهایی كه یك مقدار را باز می گرداندند( از آدرس متغیرها استفاده می‬
‫شد كه امروزه این مسئله وجود ندارد‪.‬‬

‫ تابع خواندن از ورودی‬7-6-2
#include
void main() {
int age;
float average ;
printf("Please enter your age and average : ");
scanf("%d %f",&age,&average);
printf("You are %d years old and your average is %5.2f \n",age,average);
}

Please enter your age and average : 19 16.72
You are 19 years old and your average is 16.72

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫زبان ‪ C++‬یک زبان شی گرا است‪ ،‬بهمین دلیل در این زبان برای ورودی‬
‫و خروجی از اشیاء بجای توابع استفاده می گردد‪.‬‬
‫از آنجا که امروزه معموال برنامه نویسان ‪ C‬از کامپایلرهای ‪ C++‬استفاده‬
‫می کنند‪ ،‬می توانند از اشیای ورودی و خروجی آن نیز استفاده کنند‪.‬‬
‫اینکار در بین بسیاری از برنامه نویسان ‪ C‬متداول است‪ ،‬بهمین دلیل ما‬
‫در اینجا نحوه کار با اشیای خواندن و نوشتن در ‪ C++‬را بطور مقدماتی‬
‫توضیح می دهیم؛ گرچه توضیح کامل این موارد نیاز به آشنایی با شی‬
‫گرایی و زبان ‪ C++‬دارد‪.‬‬
‫قبل از هرچیز الزم به ذکر است که کلیه اشیای مربوط به ورودی و‬
‫خروجی در فایل سرآمدی بنام ‪ iostream.h‬تعیریف شده اند‪ ،‬بنابراین‬
‫ابتدا باید این فایل به برنامه توسط دستور ‪ #include‬الحاق گردد‪.‬‬

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫زبان ‪ C++‬برای نمایش اطالعات از یک شیئ بنام ‪ cout‬استفاده می نماید‪.‬‬
‫برای ارسال اطالعات مورد نظر برای چاپ به ‪ cout‬باید از عملگر درج در جریان‬
‫یا >> استفاده نماییم‪ .‬بعنوان مثال ‪:‬‬
‫; ” ‪cout >> “Please enter your name:‬‬
‫و یا مثال دیگر ‪:‬‬
‫;‪int a = 10‬‬
‫;‪float b = 2.86‬‬
‫;‪cout << a‬‬
‫;‪cout << b‬‬
‫نکته جالبی که در این مثالها دیده می شود‪ ،‬آنستکه برخالف تابع ‪ printf‬هیچ‬
‫نیازی به مشخص کردن نوع متغیری که قصد چاپ آن را داریم نیست و خود‬
‫شئ ‪ cout‬نوع آن را تشخیص می دهد‪.‬‬
‫عالوه براین می توان چندین عملگر درج در جریان را با یکدیگر الحاق کرد و‬
‫چندین متغیر را با یک دستور چاپ کرد‪.‬‬

C++ ‫ ورودی و خروجی اطالعات در‬7-6-3
#include
void main() {
int age = 20;
floate average = 18.23;
cout >> “You are ” >> age >> “ years old and your average is ” >> average ;
}

You are 20 years old and your average is 18.230000

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای دریافت اطالعات از کاربر‪ ،‬از شئ دیگری بنام ‪ cin‬استفاده می شود‪.‬‬
‫برای ارسال متغیر مورد نظر به ‪ cin‬باید از عملگر استخراج از جریان یا <<‬
‫استفاده نماییم‪ .‬بعنوان مثال‪:‬‬
‫;‪int a‬‬
‫;‪cin >> a‬‬
‫بازهم همانطور که می بینید نیازی به تعیین نوع متغیر موردنظر نیست و خود‬
‫شئ ‪ cin‬نوع متغیر را بطور اتوماتیک تشخیص داده و داده ای از همان نوع را از‬
‫کاربر دریافت و در متغیر مورد نظر قرار می دهد‪.‬‬
‫عملگرهای استخراج از جریان را نیز می توان با یکدیگر الحاق کرد‪.‬‬
‫برای رفتن به خط بعد در شئ ‪ cout‬می توان از دستکاری کننده ‪ endl‬استفاده‬
‫کرد‪ .‬مثال در دستور زیر پس از چاپ پیغام‪ ،‬مکان نما به خط بعد منتقل می‬
‫شود‪:‬‬
‫;‪cout >> “List of students : “ >> endl‬‬
‫البته دستکاری کننده های متعدد دیگری نیز ازجمله موارد مربوط به تعیین طول‬
‫میدان و نحوه چاپ مقادیر وجود دارد که توضیح آنها نیاز به یک مبحث مستقل‬
‫دارد‪.‬‬

C++ ‫ ورودی و خروجی اطالعات در‬7-6-3
#include
void main() {
int age;
float average ;
cout << "Please enter your age and average : " ;
cin >> age >> average ;
cout << "You are " << age << "years old and your average is " << average;
}

Please enter your age and average : 19 16.72
You are 19 years old and your average is 16.72

‫‪ 7-7‬توابع کتابخانه ای‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫همانطور که قبال نیز گفته شد‪ ،‬زبان ‪ C‬از زیر برنامه ها نیز حمایت می کند‪ .‬هر زیر برنامه‬
‫در ‪ C‬یک تابع نامیده می شود‪ .‬تا کنون با توابعی همچون ‪ main‬و یا ‪ printf‬و ‪ scanf‬آشنا‬
‫شده ایم‪.‬‬
‫معموال عرضه کنندگان کامپایلرها و یا سایر فروشندگان نرم افزار‪ ،‬برخی از توابع عمومی‬
‫را که ممکن است مورد نیاز جمع کثیری از برنامه نویسان مختلف باشد را در قالب‬
‫کتابخانه ای از توابع در اختیار برنامه نویسان می گذارند‪ .‬بعضی از این توابع کتابخانه ای‬
‫مانند ‪ printf‬و ‪ scanf‬بصورت استاندارد درآمده و توسط عرضه کنندگان مختلف ارائه می‬
‫شوند‪.‬‬
‫در کامپایلر عرضه شده توسط شرکت بورلند )‪ (Borland C++ 3.1‬نیز کتابخانه های‬
‫متعددی از توابع برای شما عرضه شده اند که بتدریج با آنها و کاربردشان آشنا خواهید‬
‫شد‪.‬‬
‫نکته مهم آنستکه برای استفاده از این توابع ابتدا باید فایل سرآمد مربوط به آنها را نیز در‬
‫ابتدای برنامه خود اضافه نمایید ) با استفاده از ‪ .(#include‬هر فایل سرآمد شامل تعاریف‬
‫اولیه گروهی از توابع مرتبط با هم و داده های مربوط به آنها بوده و در استاندارد قدیمی‬
‫تر دارای پسوند ‪ .h‬می باشد)در استاندارد جدید پسوند این فایلها حذف شده است(‪.‬‬
‫برخی از این فایلهای سرآمد عبارتند از‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪ : stdio.h‬توابع ورودی و خروجی استاندارد‬
‫‪ : math.h‬توابع ریاضی‬
‫‪ : graphics.h‬توابع مربوط به عملیات گرافیکی‬
‫‪ : string.h‬توابع مربوط به کار با رشته ها‬


Slide 19

‫مبانی کامپیوتر و برنامه سازی‬
‫فصل هفتم ‪ :‬مفاهیم اولیه زبان ‪C‬‬
‫مدرس ‪ :‬نگین معروفی‬

‫‪ 7-1‬شناسه ها در ‪C‬‬
‫‪‬‬
‫‪‬‬

‫شناسه )‪ (identifier‬نامی است که به یک قسمت از برنامه مانند متغیر‪ ،‬تابع‪ ،‬ثابت و یا‬
‫‪ ...‬داده می شود‪.‬‬
‫در زبان ‪ C‬برای انتخاب شناسه ها فقط می توان از عالئم زیر استفاده کرد‪:‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫حروف انگلیسی کوچک و بزرگ )‪(A…Z a…z‬‬
‫ارقام )‪(0…9‬‬
‫عالمت خط پایین یا _‬

‫البته یک شناسه نمی تواند با یک رقم شروع شود‪.‬‬
‫چند شناسه مجاز‪ name2 ، average ، sum :‬و ‪student_average‬‬
‫چند شناسه غیرمجاز ‪ 2name‬و یا ‪student average‬‬
‫در برنامه نویسی امروزی پیشنهاد می شود بجای شناسه هایی همانند‬
‫‪ student_average‬از ‪ studentAverage‬استفاده گردد‪.‬‬
‫نکته مهم دیگری که باید به آن اشاره کرد آنستکه زبان ‪ C‬برخالف بسیاری از زبانهای دیگر‬
‫به کوچک و بزرگی حروف حساس است )‪ .(case sensitive‬در نتیجه شناسه های زیر با‬
‫یکدیگر متفاوتند ‪:‬‬
‫‪Sum ≠ sum ≠ SUM‬‬
‫آخرین نکته اینستکه در هنگام انتخاب شناسه نمی توانید از کلمات کلیدی که برای‬
‫منظورهای خاص در زبان ‪ C‬رزرو شده اند استفاده کنید‪.‬‬

C ‫ شناسه ها در‬7-1
: C ‫کلمات کلیدی در زبان‬
auto

break

case

char

const

continue

default

do

double

else

enum

extern

float

for

goto

if

int

long

register

return

short

signed

sizeof

static

struct

switch

typedef

union

unsigned

void

volatile

while

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫محدوده‬

‫اندازه )بیت(‬

‫توضیح‬

‫نوع داده‬

‫‪-128 to +127‬‬

‫‪8‬‬

‫کاراکتر‬

‫‪char‬‬

‫‪-32768 to +32767‬‬

‫‪16‬‬

‫عدد صحیح‬

‫‪int‬‬

‫‪3.4e-38 to 3.4e+38‬‬

‫‪32‬‬

‫عدد اعشاری‬

‫‪float‬‬

‫‪1.7e-308 to 1.7e+308‬‬

‫‪64‬‬

‫عدد اعشاری با‬
‫دقت مضاعف‬

‫‪double‬‬

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫‪‬‬

‫البته چند نکته مهم درمورد این جدول قابل ذکر است ‪:‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫اندازه ‪ int‬در محیطهای ‪ 16‬بیتی مانند ‪ DOS‬برابر ‪ 16‬بیت است‪ .‬اما در‬
‫محیطهای ‪ 32‬بیتی همانند ‪ Windows‬اندازه آن ‪ 32‬بیت می باشد که در‬
‫اینصورت محدوده ای برابر ‪ -2,147,483,648‬تا ‪ +2,147,483,647‬را‬
‫پوشش می دهد‪.‬‬
‫در بعضی از کامپایلرهای ‪ ،C‬نوع داده ‪ bool‬نیز وجود دارد که می تواند‬
‫یکی از مقادیر ‪)true‬درست( یا ‪) false‬غلط( را نشان دهد ‪ .‬اما در نسخه‬
‫های اولیه ‪ C‬از همان نوع داده صحیح یا ‪ int‬برای اینکار استفاده می‬
‫شد‪ .‬بدین صورت که ‪ 0‬نشاندهنده ‪ false‬و هر عدد غیر صفر )معموال ‪(1‬‬
‫نشاندهنده ‪ true‬است‪.‬‬
‫از آنجا که برای ذخیره سازی کاراکترها کد اسکی آنها ذخیره می گردد‪،‬‬
‫از یک متغیر کاراکتری یا ‪ char‬می توان بعنوان یک عدد صحیح کوچک نیز‬
‫استفاده کرد و اعمال ریاضی برروی آنها نیز مجاز است‪.‬‬

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫عالوه براین چندین اصالح کننده نیز وجود دارد که به ما اجازه می دهد نوع داده مورد‬
‫نظر را با دقت بیشتری برای نیازهای مختلف استفاده نماییم‪.‬‬
‫این اصالح کننده ها عبارتند از ‪short, long, signed, unsigned :‬‬
‫تمام این اصالح کننده ها می توانند به نوع داده ‪ int‬اعمال شوند و اثر آنها بستگی‬
‫به محیط دارد‪.‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫در یک محیط ‪16‬بیتی‪short int ،‬بازهم برابر ‪16‬بیت است ولی ‪ long int‬برابر‪32‬بیت می‬
‫باشد‪.‬‬
‫‪ unsigned int‬باعث می شود که یک عدد ‪ 16‬بیتی بدون عالمت داشته باشیم که بازه‬
‫بین ‪ 0‬تا ‪ 65535‬را پوشش می دهد‪ signed int .‬نیز همانند ‪ int‬معمولی بوده و تفاوتی‬
‫ندارد‪.‬‬
‫ترکیب این اصالح کننده ها نیز ممکن است‪ .‬مثال ‪ unsigned long int‬یک عدد ‪ 32‬بیتی‬
‫بدون عالمت است که بازه ‪ 0‬تا ‪ 4,294,967,295‬را پوشش می دهد‪.‬‬

‫برروی نوع داده ‪ char‬فقط اصالح کننده های ‪ signed‬و ‪ unsigned‬را می توان اعمال‬
‫کرد‪ .‬معموال از اصالح کننده ‪ unsigned‬وقتی استفاده می شود که قصد داشته‬
‫باشیم از ‪ char‬بعنوان یک عدد صحیح مثبت بین ‪ 0‬تا ‪ 255‬استفاده کنیم‪.‬‬
‫برروی نوع داده ‪ double‬تنها اصالح کننده ‪ long‬قابل اعمال است و دراینصورت عدد‬
‫اعشاری با ‪ 80‬بیت را خواهیم داشت که قادر است هر عددی در بازه ‪ 3.4e-4932‬تا‬
‫‪ 1.1e+4932‬را در خود نگاه دارد‪.‬‬

‫‪ 7-3‬تعریف متغیرها‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای تعریف متغیرها به شکل زیر عمل می کنیم‪:‬‬

‫;>‪ ‫که ‪ type‬یکی از نوع داده های گفته شده و ‪ variable-list‬لیستی از متغیرها است‬
‫که با کاما از یکدیگر جدا شده اند‪ .‬بعنوان مثال ‪:‬‬
‫;‪int sum‬‬
‫;‪float average‬‬
‫; ‪long int a, b, c‬‬
‫; ‪unsigned long int i, j, k‬‬
‫عالوه براین می توان در هنگام تعریف متغیر به آن مقدار اولیه نیز داد‪ .‬مثال ‪:‬‬
‫; ‪int d = 0‬‬
‫نكته مهم آنكه زبان ‪ C‬به متغیرها مقدار اولیه نمي دهد )حتي ‪ (0‬و برنامه نويس‬
‫خود بايد اينكار را صريحا انجام دهد‪ ،‬درغیر اينصورت مقدار اولیه متغیر‪ ،‬نامعین خواهد‬
‫بود‪.‬‬
‫تعریف متغیرها طبق اصول زبان ‪ C‬میتواند درهرجایی از برنامه صورت پذیرد‪ ،‬و‬
‫متغیرهای تعریف شده از همان خط به بعد قابل استفاده خواهد بود‪ .‬اما معموال‬
‫توصیه می گردد كه تعریف متغیرها در همان خط ابتدایی تابع و بالفاصله پس از {‬
‫صورت پذیرد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫‪‬‬
‫‪‬‬

‫ثابتها مقادیر ثابتی هستند كه مقدار آنها در حین اجرای برنامه تغییر نمی یابد‪ .‬ثابتها می توانند از‬
‫هریك از نوع داده های اصلی باشند‪.‬‬
‫ثوابت عددی صحیح ‪:‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫برای نمایش این دسته از ثوابت‪ ،‬از دنباله ای از ارقام بعالوه عالمت ‪ +‬یا ‪ -‬استفاده می كنیم‪ .‬بعنوان مثال‬
‫‪ -45‬و یا ‪ 3489‬ثوابت صحیح هستند‪.‬‬
‫در حالت عادی ‪ C‬هر عدد را در كوچكترین نوع داده ای كه می تواند قرار می دهد‪ .‬مثال عدد ‪ 85‬در یك‬
‫‪ int‬قرار می گیرد‪ ،‬اما عدد ‪ 145398‬در یك ‪ long int‬قرار خواهد گرفت‪.‬‬
‫اگر قصد دارید یك عدد كوچك بعنوان ‪ long‬محسوب گردد‪ ،‬می توانید از پسوند ‪ L‬در انتهای آن استفاده‬
‫می كنیم‪ .‬مثال ‪245L‬یك عدد ‪ long‬محسوب می شود‪.‬‬
‫;‪long int a = 20L‬‬
‫پسوند ‪ U‬در انتهای عدد نیز نشانه بدون عالمت بودن آن است‪.‬‬
‫نكته دیگر آنكه ‪ C‬به شما اجازه می دهد درصورت لزوم ثوابت صحیح خود را در مبنای ‪ 8‬یا ‪ 16‬نیز كه‬
‫از مبناهای متداول در برنامه نویسی هستند‪ ،‬بنویسید‪.‬‬
‫‪‬‬
‫‪‬‬

‫برای نوشتن عدد در مبنای ‪ 8‬باید آن را با ‪ 0‬آغاز كنید‪ ،‬مثال ‪ 0342‬یك عدد در منای ‪ 8‬محسوب می‬
‫گردد‪.‬‬
‫برای نوشتن یك عدد در مبنای ‪ 16‬باید آن را با ‪ 0x‬آغاز نمایید‪ ،‬مانند ‪.0x27A4‬‬

‫‪ 7-4‬ثوابت‬
‫ثوابت عددی اعشاری‬

‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫برای نمایش اعداد اعشاری‪ ،‬باید از نقطه اعشار استفاده كنیم‪ ،‬مانند ‪237.45‬‬
‫اما نكته جالب آنستكه می توانید از نماد علمی نیز برای نمایش اعداد‬
‫اعشاری استفاده كنید‪ .‬برای اینكار كافی است از حرف ‪ e‬برای نمایش قسمت‬
‫توان استفاده نمایید‪ .‬بعنوان مثال ‪:‬‬
‫‪-23.47 × 10 5 = -23.47e5‬‬
‫‪42.389 × 10 -3 = 42.389e-3‬‬
‫دقت كنید كه قسمت توان‪ ،‬حتما یك عدد صحیح است‪.‬‬
‫نكته جالب اینجاست كه برخالف مورد قبل‪ ،‬كامپایلر بطور پیش فرض داده های‬
‫اعشاری را از نوع ‪ double‬فرض می كند‪.‬چنانچه دوست دارید ثابت شما ازنوع‬
‫‪ float‬درنظر گرفته شود‪ ،‬در انتهای آن ‪ F‬قرار دهید‪ .‬ضمنا پسوند ‪ L‬نیز داده‬
‫اعشاری را از نوع ‪ long double‬درنظر می گیرد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫ثوابت كاراكتری ‪:‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫برای نشان دادن ثوابت كاراكتری‪ ،‬آنها را در داخل ' قرار می دهیم‪ .‬بعنوان مثال‬
‫'‪'A‬یك ثابت كاراكتری است‪.‬‬
‫; '‪char ch = 'S‬‬
‫دقت كنید كه همانطور كه قبال گفته شد‪ ،‬كد اسكی كاراكترها در متغیر ذخیره‬
‫می گردد‪ ،‬بنابراین می توان از آن بعنوان یك عدد صحیح نیز استفاده كرد‪ .‬نكته‬
‫مهم دیگر آنستكه به تفاوت عدد ‪ 5‬و كاراكتر '‪ '5‬دقت داشته باشید‪ .‬در حقیقت‬
‫'‪ '5‬برابر است با عدد ‪ 53‬كه همان كد اسكی آن است‪.‬‬
‫روش فوق‪ ،‬برای نمایش کاراکترهای قابل چاپ مناسب است‪ ،‬اما بعضی‬
‫كاراكترها مانند ‪ enter‬قابل نمایش نبوده و برای آنها شکل خاصی وجود ندارد‪.‬‬
‫در چنین مواردی‪ ،‬زبان ‪ C‬از ترکیب عالمت \ به همراه یک کاراکتر دیگر‪ ،‬برای‬
‫نمایش این قبیل کاراکترها استفاده می نماید‪ .‬بعنوان مثال‪ ،‬کاراکتر '‪ '\n‬نشان‬
‫دهنده خط جدید یا همان ‪ enter‬می باشد‪.‬‬
‫جدول صفحه بعد این قبیل کاراکترها و معادل آنها را نشان می دهد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫نحوه نمایش در ‪C‬‬

‫کد اسکی‬

‫صدای بوق کامپیوتر‬

‫‪\a‬‬

‫‪7‬‬

‫حرکت به عقب ‪backspace‬‬

‫‪\b‬‬

‫‪8‬‬

‫شروع صفحه ‪form feed‬‬

‫‪\f‬‬

‫‪12‬‬

‫سطر جدید ‪line feed‬‬

‫‪\n‬‬

‫‪10‬‬

‫برگشت به ابتداي سطر ‪carriage return‬‬

‫‪\r‬‬

‫‪13‬‬

‫فاصله افقی ‪horizontal tab‬‬

‫‪\t‬‬

‫‪9‬‬

‫فاصله عمودی ‪vertical tab‬‬

‫‪\v‬‬

‫‪11‬‬

‫عالمت سوال‬

‫?\‬

‫‪63‬‬

‫عالمت '‬

‫'\‬

‫‪39‬‬

‫عالمت "‬

‫"\‬

‫‪34‬‬

‫عالمت \‬

‫\\‬

‫‪92‬‬

‫عالمت تهی‬

‫‪\0‬‬

‫‪0‬‬

‫نام کاراکتر‬

‫کد اسکی یک کاراکتر با ‪ 3‬رقم در مبنای ‪8‬‬

‫‪\000‬‬

‫کد اسکی یک کاراکتر با ‪ 2‬رقم در مبنای ‪16‬‬

‫‪\x00‬‬

‫‪ 7-4‬ثوابت‬
‫‪‬‬

‫ثوابت رشته ای ‪ C :‬عالوه بر ثوابت فوق‪ ،‬از یك ثابت دیگر بنام رشته نیز‬
‫حمایت می كند‪ .‬رشته‪ ،‬دنباله ای از كاراكترها است كه در داخل " قرار‬
‫می گیرند‪ .‬بعنوان مثال "‪ "this is a test‬یك رشته است‪ .‬دقت كنید كه '‪'a‬‬
‫یك كاراكتر است‪ ،‬اما "‪ "a‬یك رشته است كه فقط شامل یك كاراكتر می‬
‫باشد‪.‬‬

‫‪ 7-5‬عملگرها‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫عملگر‪ ،‬نمادی است كه به كامپایلر می گوید تا عملیات محاسباتی یا‬
‫منطقی خاصی را برروی یك یا چند عملوند‪ ،‬انجام دهد‪.‬‬
‫به عملگرهایی كه فقط یك عملوند دارند‪ ،‬عملگر یكانی می گوییم و‬
‫همواره عملگر در سمت چپ عملوند قرار می گیرد)مانند عدد ‪.(-125‬‬
‫اما عملگرهایی كه برروی دو عملوند اثر می كنند را عملگر دودویی‬
‫نامیده و عملگر را بین دو عملوند قرار می دهیم )مانند ‪.(23+86‬‬
‫هر ترکیب درستی از عملگرها و عملوندها را یک عبارت می نامیم‪.‬‬
‫‪ C‬از نقطه نظر عملگرها یك زبان بسیار قوی است‪ .‬این عملگرها به چند‬
‫دسته اصلی تقسیم می گردند كه آنها را به ترتیب بررسی می كنیم‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫این عملگرها‪ ،‬همان اعمال متداول ریاضی هستند كه در زبان ‪ C‬مورد استفاده‬
‫قرار می گیرند‪ .‬این اعمال عبارتند از ‪:‬‬

‫عمل‬

‫نوع‬

‫عملگر‬

‫منفی كردن عملوند سمت راست‬

‫یكانی‬

‫‪-‬‬

‫جمع دو عملوند‬

‫دودویی‬

‫‪+‬‬

‫تفریق دو عملوند‬

‫دودویی‬

‫‪-‬‬

‫ضرب دو عملوند‬

‫دودویی‬

‫*‬

‫تقسیم دو عملوند‬

‫دودویی‬

‫‪/‬‬

‫محاسبه باقیمانده تقسیم دو عملوند‬

‫دودویی‬

‫‪%‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬
‫‪‬‬

‫این عملگرهای برروی همه انواع داده های ‪ C‬عمل می كنند‪ ،‬بجز عملگر ‪ %‬كه فقط‬
‫برروی نوع داده های صحیح عمل می كند‪.‬‬
‫اما نكته مهمی كه باید به آن اشاره كرد‪ ،‬نحوه كار عملگر تقسیم برروی نوع داده های‬
‫مختلف است‪.‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫درصورتیكه هردو عملوند صحیح باشند‪ ،‬تقسیم بصورت صحیح بر صحیح انجام خواهد شد‪.‬‬
‫اگر یكی یا هر دو عملوند اعشاری باشند‪ ،‬تقسیم بصورت اعشاری انجام خواهد پذیرفت‪.‬‬
‫فرض كنید تعاریف زیر را داریم ‪:‬‬
‫; ‪int a,b‬‬
‫; ‪float c,d‬‬
‫; ‪a = 10 ; b = 4‬‬
‫;‪c = 8.2; d = 4.0‬‬
‫اكنون به نتایج عملیات زیر دقت كنید ‪:‬‬
‫‪a / b => 2‬‬
‫‪c / d => 2.05‬‬
‫‪a / d => 2.5‬‬
‫‪a / 4 => 2‬‬
‫چنانچه به آخرین مورد توجه كنید‪ ،‬متوجه می شوید كه از آنجا كه ‪a‬یك متغیر صحیح است و ‪4‬‬
‫نیز یك ثابت صحیح در نظر گرفته شده‪ ،‬درنتیجه تقسیم بصورت صحیح بر صحیح انجام گرفته‬
‫است‪ .‬چنانچه بخواهیم تقسیم بصورت اعشاری صورت پذیرد‪ ،‬به دو شكل می توانیم عمل‬
‫كنیم‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫برای اینکه عبارت تقسیم صفحه قبل بصورت اعشاری انجام شود‪ ،‬به دو روش‬
‫می توان عمل کرد‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫این عبارت را بصورت ‪ a / 4.0‬بنویسیم‪.‬‬
‫از عملگر قالب ریزی استفاده كنیم‪.‬‬

‫عملگر قالب ریزی می تواند یك نوع را به نوع دیگری تبدیل نماید‪ .‬شكل كلی آن‬
‫به شكل زیر است ‪:‬‬
‫>‪() ‫كه ‪ type‬نوع مورد نظر است كه قصد تبدیل عبارت ‪ expression‬به آن نوع را‬
‫داریم‪ .‬بعنوان مثال در مورد قبلی می توان به شكل زیر عمل كرد ‪:‬‬
‫‪(float) a / 4‬‬
‫در این حالت از كامپایلر خواسته ایم كه ابتدا عدد ‪ a‬را به اعشاری تبدیل كند‬
‫)البته بصورت موقت( و سپس آن را بر ‪ 4‬تقسیم نماید‪ ،‬كه مسلما حاصل‬
‫اعشاری خواهد بود‪.‬‬
‫بطوركلی هرگاه ثابتها و متغیرهایی از انواع مختلف در یك عبارت محاسباتی‬
‫داشته باشیم‪ ،‬كامپایلر ‪ C‬همه آنها را به یك نوع یكسان كه همان بزرگترین‬
‫عملوند موجود است تبدیل خواهد كرد‪ .‬بعنوان مثال به مورد صفحه بعد دقت‬
‫كنید ‪:‬‬

‫ عملگرهای محاسباتی‬7-5-1
char ch;
int i;

float f;
double d;
result = (ch / i)
int

+

(f *d)

(f+i)
float

double

double

int

-

double

double

float

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫اولویت عملگرها ‪ :‬در عبارتی که شامل چندین عملگر است‪ ،‬کدامیک در‬
‫ابتدا اعمال خواهد گردید‪.‬‬
‫اولویت عملگرهای محاسباتی از باال به پایین بشرح زیر است‪:‬‬
‫‪ ‬عملگر یکانی –‬
‫‪ ‬عملگرهای * و ‪ /‬و ‪%‬‬
‫‪ ‬عملگرهای ‪ +‬و –‬
‫چنانچه اولویت دو عملگر یکسان باشد‪ ،‬این عملگرها از چپ به راست‬
‫محاسبه خواهند شد‪.‬‬
‫چنانچه بخواهیم یک عمل با اولویت پایین زودتر انجام شود‪ ،‬باید از پرانتز‬
‫استفاده کنیم‪ .‬بنابراین اولویت عملگر پرانتز از همه موارد فوق‬
‫بیشتراست‪ .‬در مورد پرانتزهای متداخل‪ ،‬ابتدا پرانتز داخلی محاسبه‬
‫می شود؛ اما در مورد پرانتزهای هم سطح‪ ،‬ابتدا پرانتز سمت چپتر‬
‫محاسبه می گردد‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫چند مثال در مورد اولویت عملگرها‬

‫ترتیب اجرای عملگرها‬

‫عبارت زبان ‪C‬‬

‫ابتدا عمل * و سپس عمل ‪+‬‬

‫‪b+c*d‬‬

‫ابتدا عمل ‪ +‬و سپس عمل *‬

‫‪(b + c) * d‬‬

‫ابتدا عمل ‪ /‬سپس عمل * و در انتها عمل ‪+‬‬

‫‪b+c/d*e‬‬

‫ابتدا عمل * سپس عمل ‪ /‬و در انتها عمل ‪+‬‬

‫)‪b + c / (d * e‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫یک مثال کامل در مورد اولویت عملگرها‬

‫‪result = a + b * (f – (g + b) / d) – c * (a – d) / e‬‬
‫‪6‬‬

‫‪1‬‬
‫‪7‬‬

‫‪2‬‬

‫‪8‬‬

‫‪3‬‬
‫‪4‬‬
‫‪5‬‬
‫‪9‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫در زبان ‪ C‬برای انتساب چندین عملگر وجود دارد‪ .‬ساده ترین عملگر انتساب‪ ،‬همان عملگر =‬
‫است که در بسیاری از زبانها استفاده می شود‪ .‬بعنوان مثال ‪:‬‬
‫;‪a = 5‬‬
‫;‪b = c + 2 * d‬‬
‫این عملگر باعث می شود که عبارت سمت راست در عبارت سمت چپ قرار گیرد‪.‬‬
‫توجه کنید که مقدار سمت چپ باید عبارتی باشد که بتوان به آن یک مقدار را نسبت داد‬
‫)مانند یک متغیر( که به آن ‪ Lvalue‬گفته می شود‪ ،‬بنابراین یک ثابت نمی تواند در سمت چپ‬
‫قرار گیرد‪.‬‬
‫نکته دیگر اینکه اولویت عملگر = از عملگرهای ریاضی کمتر است و درنتیجه ابتدا آن عملیات‬
‫انجام شده و در پایان حاصل در عبارت سمت چپ ریخته می شود‪.‬‬
‫الزم به ذکر است که در هنگام انتساب‪ ،‬درصورت لزوم نوع عبارت سمت راست به نوع عبارت‬
‫سمت چپ تبدیل می شود‪ .‬مثال‪:‬‬
‫;‪int a‬‬
‫;‪a = 2.5 * 5.0‬‬
‫که دراینصورت عدد ‪ 12‬در ‪ a‬ذخیره خواهد شد‪.‬‬
‫شرکت پذیری این عملگر از راست به چپ می باشد‪ ،‬بدین معنا که چنانچه چندین عملگر‬
‫نسبت دهی داشته باشیم‪ ،‬این عملگرها از راست به چپ محاسبه می شوند‪ .‬مثال پس از‬
‫اجرای دستور زیر‪ ،‬مقدار هر ‪ 3‬متغیر برابر ‪ 10‬خواهد شد‪.‬‬
‫;‪a = b = c = 10‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬

‫نکته جالب درمورد زبان ‪ C‬آنستکه دارای یک سری عملگرهای انتساب‬
‫خالصه شده است که باعث می شوند در بعضی موارد بتوانیم عبارات‬
‫کوتاهتری را بنویسیم‪ .‬این عملگرها عبارتند از ‪:‬‬
‫عملگرد‬

‫مثال‬

‫عبارت انتساب معادل‬

‫‪++‬‬

‫;‪a ++‬‬

‫;‪a = a + 1‬‬

‫‪--‬‬

‫;‪a --‬‬

‫;‪a = a – 1‬‬

‫=‪+‬‬

‫;‪a += 5‬‬

‫;‪a = a + 5‬‬

‫=‪-‬‬

‫;‪a -= 8‬‬

‫;‪a= a – 8‬‬

‫=*‬

‫;‪a *= 10‬‬

‫;‪a= a * 10‬‬

‫=‪/‬‬

‫;‪a /= 2‬‬

‫;‪a = a / 2‬‬

‫=‪%‬‬

‫;‪a %= 10‬‬

‫;‪a = a % 10‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬
‫‪‬‬

‫عملگر اول و دوم‪ ،‬عملگرهای یکانی هستند که بترتیب عملگر افزایش و عملگر کاهش‬
‫نامیده می شوند‪.‬‬
‫نکته جالب آنستکه این دو عملگر به دوصورت مورد استفاده قرار می گیرند‪.‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫در حالتی که از دستور ;‪ a ++‬استفاده شود به آن پس افزایش می گویند و بدین معناست که‬
‫ابتدا از مقدار فعلی ‪ a‬در عبارت موردنظر استفاده کن و سپس آن را افزایش بده‪.‬‬
‫اما دستور ;‪ ++ a‬که به آن پیش افزایش گفته می شود‪ ،‬ابتدا ‪ a‬را افزایش داده و سپس از آن‬
‫در عبارت استفاده می کند‪.‬‬
‫به برنامه زیر دقت کنید‪:‬‬

‫>‪#include ‫{ )(‪void main‬‬
‫; ‪int a ,b‬‬
‫;‪a=5‬‬
‫;‪b = a ++‬‬
‫;)‪printf(“a=%d and b=%d \n”,a,b‬‬
‫;‪a=5‬‬
‫;‪b = ++ a‬‬
‫;)‪printf(“a=%d and b=%d \n”,a,b‬‬
‫}‬
‫‪a=6 b=5‬‬
‫‪a=6 b=6‬‬

‫‪ 7-5-3‬عملگرهای مقایسه ای‬
‫‪‬‬

‫‪‬‬

‫این عملگرها دو عبارت را بایکدیگر مقایسه کرده و نتیجه را باز می گردانند‪.‬‬
‫نتیجه می تواند درست )‪ (true‬یا غلط )‪ (false‬باشد‪.‬‬
‫نتیجه این عملگرها یک عدد صحیح است که درصورت درست بودن ‪ 1‬و‬
‫درصورت غلط بودن ‪ 0‬باز می گردانند‪ .‬این عملگرها عبارتند از‪:‬‬
‫عملگر‬

‫مفهوم عملگر‬

‫مثال‬

‫<‬

‫بزرگتر )<(‬

‫‪a>b‬‬

‫>‬

‫کوچکتر )>(‬

‫‪a
‫=<‬

‫بزرگتر یا مساوی )≤(‬

‫‪a >= b‬‬

‫=>‬

‫کوچکتر یا مساوی )≥(‬

‫‪a <= b‬‬

‫==‬

‫مساوی )=(‬

‫‪a == b‬‬

‫=!‬

‫نامساوی )≠(‬

‫‪a != b‬‬

‫‪ 7-5-3‬عملگرهای مقایسه ای‬
‫‪‬‬

‫‪‬‬

‫نکته مهمی که باید به آن دقت کرد عملگر مساوی )==( است‪ ،‬چرا که یک‬
‫اشتباه بسیار متداول برنامه نویسان ‪ C‬استفاده اشتباه از عملگر انتساب‬
‫)=( بجای عملگر تساوی )==( است که باعث ایجاد خطا در برنامه می‬
‫شود‪.‬‬
‫اولویت این عملگرها از باال به پایین بشرح زیر است‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫عملگرهای <‪ <= ، > ،‬و =>‬
‫عملگرهای == و =!‬

‫الزم بذکر است که در هنگام مساوی بودن اولویت چند عملگر‪ ،‬این عملگرها‬
‫از چپ به راست محاسبه می گردند‪.‬‬

‫‪ 7-5-4‬عملگرهای منطقی‬
‫‪‬‬

‫این عملگرها به شما اجازه می دهند که شرطهای ساده ای را که با‬
‫استفاده از عملگرهای مقایسه ای ایجاد شده اند را با یکدیگر ترکیب نموده‬
‫و شرطهای پیچیده تری را بسازید‪ .‬این عملگرها عبارتند از ‪:‬‬
‫مثال‬

‫عملگر‬

‫مفهوم عملگر‬

‫نحوه کار‬

‫&&‬

‫‪ AND‬منطقی‬

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

‫‪a>0 && sw==1‬‬

‫||‬

‫‪ OR‬منطقی‬

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

‫‪a<=100 || b!=0‬‬

‫!‬

‫‪ NOT‬منطقی‬

‫اگر عملوند درست باشد‪ ،‬نادرست و‬
‫اگر نادرست باشد‪ ،‬درست برمی‬
‫گرداند‪.‬‬

‫)‪! (a==1 || b<10‬‬

‫‪ 7-5-5‬عملگر شرطی‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫گاهی الزم است که ابتدا یک شرط بررسی شده و سپس برمبنای نتیجه )درست یا نادرست بودن آن( یکی‬
‫از دو عبارت ممکن بازگردانده شود‪ .‬برای اینکار می توان از یک عملگر ‪3‬تایی )با ‪ 3‬عملوند( بنام عملگر‬
‫شرطی استفاده نمود‪.‬‬
‫شکل کلی این عملگر بصورت زیر است‪:‬‬
‫>عبارت‪> :<2‬عبارت‪> ?<1‬شرط<‬
‫نحوه کار بدینصورت است که درصورت درست بودن شرط‪ ،‬عبارت‪ 1‬و در غیراینصورت عبارت ‪ 2‬بازگردانده می‬
‫شود‪.‬‬
‫به عنوان مثال به دستور زیر توجه کنید‪:‬‬
‫که این عبارت معادل دستور زیر است‪:‬‬

‫‪‬‬

‫;‪a = (k<10) ? 100 : 50‬‬
‫;‪if (k<10) a=100‬‬
‫;‪else a=50‬‬

‫البته این عبارت به شکلهای پیچیده نیز می تواند مورد استفاده قرار گیرد‪ .‬مثال ‪:‬‬
‫;‪c += (a>0 && a<10) ? ++a : a/b‬‬
‫که معادل است با ‪:‬‬
‫{ )‪if (a>0 && a<10‬‬
‫;‪a= a + 1‬‬
‫;‪c = c + a‬‬
‫}‬
‫;‪else c = c + a/b‬‬

‫‪ 7-5-6‬اولویت عملگرها‬
‫عملگر‬

‫اولویت‬

‫شرکت پذیری‬

‫‪1‬‬

‫)(‬

‫از چپ به راست‬

‫‪2‬‬

‫‪- + ! -- ++‬‬

‫از راست به چپ‬

‫‪3‬‬

‫‪* / %‬‬

‫از چپ به راست‬

‫‪4‬‬

‫‪+ -‬‬

‫از چپ به راست‬

‫‪5‬‬

‫>> <<‬

‫از چپ به راست‬

‫‪6‬‬

‫>= > <= <‬

‫از چپ به راست‬

‫‪7‬‬

‫=! ==‬

‫از چپ به راست‬

‫‪8‬‬

‫&&‬

‫از چپ به راست‬

‫‪9‬‬

‫||‬

‫از چپ به راست‬

‫‪10‬‬

‫‪?:‬‬

‫از راست به چپ‬

‫‪11‬‬

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

‫از راست به چپ‬

‫‪12‬‬

‫‪,‬‬

‫از چپ به راست‬

‫‪ 7-6‬خواندن و نمایش اطالعات‬
‫‪‬‬

‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫همانطور كه قبال نیز گفته شد‪ ،‬یكی از اهداف زبان ‪ C‬قابل حمل بودن آن‬
‫است‪ .‬بهمین منظور سعی شده است كه از دستوراتی كه ممكن است‬
‫وابسته به ماشین خاصی باشد‪ ،‬اجتناب گردد‪.‬‬
‫بهمین دلیل زبان ‪ C‬برخالف سایر زبانها دارای هیچ دستوری برای‬
‫خواندن از ورودی و یا نوشتن در خروجی نیست‪.‬‬
‫اما در عوض دارای تعدادی تابع )زیربرنامه( استاندارد می باشد كه تقریبا‬
‫تمامی كامپایلرها از آنها حمایت می كنند‪.‬‬
‫این كار به كامپایلر این امكان را می دهد كه بر حسب نوع سخت افزار‬
‫موردنظر‪ ،‬توابع ورودی و خروجی را طراحی نماید‪.‬‬
‫این توابع در یك فایل سرآمد بنام ‪ stdio.h‬تعریف شده اند و بنابراین قبل‬
‫ازاینكه بتوانید از این توابع استفاده نمایید‪ ،‬باید این فایل را نیز با استفاده‬
‫از ‪ #include‬در برنامه خود بگنجانید‪.‬‬

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫برای نمایش اطالعات در خروجی از تابع ‪ printf‬استفاده می شود‪.‬‬
‫این تابع رشته موردنظر شما را به خروجی استاندارد )كه در حالت‬
‫عادی همان صفحه نمایش یا مانیتور است( می فرستد‪ .‬شكل كلی این‬
‫تابع بصورت زیر است‪:‬‬
‫; )>لیست متغیرها< ‪> ,‬رشته كنترلی<(‪printf‬‬
‫رشته كنترلی همان متنی است كه قصد چاپ آن را داریم‪ ،‬با ذكر این‬
‫نكته كه در قسمتهایی كه باید مقدار یك متغیر چاپ شود‪ ،‬از یك‬
‫مشخصه تبدیل استفاده می شود‪ .‬هر مشخصه تبدیل از یك عالمت ‪%‬‬
‫بعالوه یك كاراكتر كه نوع متغیر مورد نظر را نشان می دهد تشكیل می‬
‫گردد‪.‬‬
‫لیست متغیرها نیز همان متغیرهایی هستند كه قصد چاپ آنها را داریم‪.‬‬
‫این متغیرها باید بترتیب قرار گرفته و با كاما )‪ (,‬از یكدیگر جدا شوند‪.‬‬

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫مشخصه تبدیل‬

‫مفهوم‬

‫‪%c‬‬

‫كاراكتر‬

‫‪%d‬‬

‫عدد صحیح در مبنای ‪10‬‬

‫‪%f‬‬

‫عدد اعشاری بدون نماد علمی‬

‫‪%e‬‬

‫عدد اعشاری با نماد علمی‬

‫‪%g‬‬

‫عدد اعشاری با حالت كوتاهتر بین ‪ e‬و ‪f‬‬

‫‪%s‬‬

‫رشته‬

‫‪%ld‬‬

‫عدد صحیح بزرگ‬

‫‪%lf %le %lg‬‬

‫عدد اعشاری بزرگ‬

‫‪%o‬‬

‫عدد صحیح در مبنای ‪8‬‬

‫‪%x‬‬

‫عدد صحیحی در مبنای ‪16‬‬

‫‪%u‬‬

‫عدد صحیح بدون عالمت‬

‫ تابع نمایش در خروجی‬7-6-1
#include
void main() {
int age = 20;
floate average = 18.23;
printf("You are %d years old and your average is %f \n",age,average);
}
You are 20 years old and your average is 18.230000

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫‪‬‬
‫‪‬‬

‫برای کنترل نحوه چاپ اعداد می توانید از مشخصه طول میدان استفاده‬
‫کنید‪.‬‬
‫مشخصه طول میدان برای اعداد به شكل زیر استفاده می شود‪:‬‬
‫‪ ‬برای اعداد صحیح از ‪ %nd‬استفاده می كنیم كه ‪ n‬تعداد ارقام را نشان‬
‫می دهد )مثال ‪ .(%3d‬در اینصورت برای هر متغیر ‪ n‬رقم درنظر گرفته‬
‫می شود‪ .‬اگر اندازه عدد از ‪ n‬كوچكتر باشد‪ ،‬به سمت چپ آن فضای‬
‫خالی اضافه می شود و اگر اندازه عدد بیش از ‪ n‬رقم باشد‪ ،‬طول میدان‬
‫نادیده گرفته شده و عدد بطور كامل چاپ می شود‪.‬‬
‫‪ ‬برای اعداد اعشاری از ‪ %n.mf‬استفاده می كنیم كه ‪ n‬اندازه كل عدد‬
‫)شامل عالمت ممیز( و ‪ m‬تعداد ارقام اعشار است )مثال ‪ .(%5.2f‬در‬
‫صورتیكه تعداد ارقام اعشاری عدد موردنظر از ‪ m‬بیشتر باشد‪ ،‬عدد به ‪m‬‬
‫عدد اعشار گرد می شود و در صورتیكه از ‪ m‬كمتر باشد‪ ،‬در سمت‬
‫راست آن ‪ 0‬قرار داده می شود‪.‬‬

‫‪ 7-6-2‬تابع خواندن از ورودی‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای خواندن اطالعات از ورودی از تابع ‪ scanf‬استفاده می شود‪.‬‬
‫این تابع اطالعات را ازورودی استاندارد )معموال صفحه كلید( خوانده و در‬
‫متغیرهای تعیین شده قرار می دهد‪.‬‬
‫شكل كلی این تابع بصورت زیر است‪:‬‬
‫; )>لیست آدرسهای متغیرها< ‪> ,‬رشته كنترلی<(‪scanf‬‬
‫همانطور كه می بینید نحوه احضار تابع ‪ scanf‬نیز مشابه ‪ printf‬است‪ .‬تنها‬
‫تفاوت در آن است كه در ‪ scanf‬باید لیست آدرسهای متغیرها ارسال شود‪.‬‬
‫مبحث مربوط به آدرسها در فصول بعدی بررسی خواهد شد ولی در حال حاضر‬
‫بخاطر بسپارید كه برای بدست آوردن آدرس یك متغیر از عالمت & استفاده می‬
‫كنیم‪ .‬بعنوان مثال ‪ &age‬بمعنای آدرس متغیر ‪ age‬است‪.‬‬
‫بطور كلی در ‪ C‬قدیمی هرگاه كه یك تابع دارای پارامترهای خروجی بود )یعنی‬
‫پارامترهایی كه یك مقدار را باز می گرداندند( از آدرس متغیرها استفاده می‬
‫شد كه امروزه این مسئله وجود ندارد‪.‬‬

‫ تابع خواندن از ورودی‬7-6-2
#include
void main() {
int age;
float average ;
printf("Please enter your age and average : ");
scanf("%d %f",&age,&average);
printf("You are %d years old and your average is %5.2f \n",age,average);
}

Please enter your age and average : 19 16.72
You are 19 years old and your average is 16.72

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫زبان ‪ C++‬یک زبان شی گرا است‪ ،‬بهمین دلیل در این زبان برای ورودی‬
‫و خروجی از اشیاء بجای توابع استفاده می گردد‪.‬‬
‫از آنجا که امروزه معموال برنامه نویسان ‪ C‬از کامپایلرهای ‪ C++‬استفاده‬
‫می کنند‪ ،‬می توانند از اشیای ورودی و خروجی آن نیز استفاده کنند‪.‬‬
‫اینکار در بین بسیاری از برنامه نویسان ‪ C‬متداول است‪ ،‬بهمین دلیل ما‬
‫در اینجا نحوه کار با اشیای خواندن و نوشتن در ‪ C++‬را بطور مقدماتی‬
‫توضیح می دهیم؛ گرچه توضیح کامل این موارد نیاز به آشنایی با شی‬
‫گرایی و زبان ‪ C++‬دارد‪.‬‬
‫قبل از هرچیز الزم به ذکر است که کلیه اشیای مربوط به ورودی و‬
‫خروجی در فایل سرآمدی بنام ‪ iostream.h‬تعیریف شده اند‪ ،‬بنابراین‬
‫ابتدا باید این فایل به برنامه توسط دستور ‪ #include‬الحاق گردد‪.‬‬

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫زبان ‪ C++‬برای نمایش اطالعات از یک شیئ بنام ‪ cout‬استفاده می نماید‪.‬‬
‫برای ارسال اطالعات مورد نظر برای چاپ به ‪ cout‬باید از عملگر درج در جریان‬
‫یا >> استفاده نماییم‪ .‬بعنوان مثال ‪:‬‬
‫; ” ‪cout >> “Please enter your name:‬‬
‫و یا مثال دیگر ‪:‬‬
‫;‪int a = 10‬‬
‫;‪float b = 2.86‬‬
‫;‪cout << a‬‬
‫;‪cout << b‬‬
‫نکته جالبی که در این مثالها دیده می شود‪ ،‬آنستکه برخالف تابع ‪ printf‬هیچ‬
‫نیازی به مشخص کردن نوع متغیری که قصد چاپ آن را داریم نیست و خود‬
‫شئ ‪ cout‬نوع آن را تشخیص می دهد‪.‬‬
‫عالوه براین می توان چندین عملگر درج در جریان را با یکدیگر الحاق کرد و‬
‫چندین متغیر را با یک دستور چاپ کرد‪.‬‬

C++ ‫ ورودی و خروجی اطالعات در‬7-6-3
#include
void main() {
int age = 20;
floate average = 18.23;
cout >> “You are ” >> age >> “ years old and your average is ” >> average ;
}

You are 20 years old and your average is 18.230000

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای دریافت اطالعات از کاربر‪ ،‬از شئ دیگری بنام ‪ cin‬استفاده می شود‪.‬‬
‫برای ارسال متغیر مورد نظر به ‪ cin‬باید از عملگر استخراج از جریان یا <<‬
‫استفاده نماییم‪ .‬بعنوان مثال‪:‬‬
‫;‪int a‬‬
‫;‪cin >> a‬‬
‫بازهم همانطور که می بینید نیازی به تعیین نوع متغیر موردنظر نیست و خود‬
‫شئ ‪ cin‬نوع متغیر را بطور اتوماتیک تشخیص داده و داده ای از همان نوع را از‬
‫کاربر دریافت و در متغیر مورد نظر قرار می دهد‪.‬‬
‫عملگرهای استخراج از جریان را نیز می توان با یکدیگر الحاق کرد‪.‬‬
‫برای رفتن به خط بعد در شئ ‪ cout‬می توان از دستکاری کننده ‪ endl‬استفاده‬
‫کرد‪ .‬مثال در دستور زیر پس از چاپ پیغام‪ ،‬مکان نما به خط بعد منتقل می‬
‫شود‪:‬‬
‫;‪cout >> “List of students : “ >> endl‬‬
‫البته دستکاری کننده های متعدد دیگری نیز ازجمله موارد مربوط به تعیین طول‬
‫میدان و نحوه چاپ مقادیر وجود دارد که توضیح آنها نیاز به یک مبحث مستقل‬
‫دارد‪.‬‬

C++ ‫ ورودی و خروجی اطالعات در‬7-6-3
#include
void main() {
int age;
float average ;
cout << "Please enter your age and average : " ;
cin >> age >> average ;
cout << "You are " << age << "years old and your average is " << average;
}

Please enter your age and average : 19 16.72
You are 19 years old and your average is 16.72

‫‪ 7-7‬توابع کتابخانه ای‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫همانطور که قبال نیز گفته شد‪ ،‬زبان ‪ C‬از زیر برنامه ها نیز حمایت می کند‪ .‬هر زیر برنامه‬
‫در ‪ C‬یک تابع نامیده می شود‪ .‬تا کنون با توابعی همچون ‪ main‬و یا ‪ printf‬و ‪ scanf‬آشنا‬
‫شده ایم‪.‬‬
‫معموال عرضه کنندگان کامپایلرها و یا سایر فروشندگان نرم افزار‪ ،‬برخی از توابع عمومی‬
‫را که ممکن است مورد نیاز جمع کثیری از برنامه نویسان مختلف باشد را در قالب‬
‫کتابخانه ای از توابع در اختیار برنامه نویسان می گذارند‪ .‬بعضی از این توابع کتابخانه ای‬
‫مانند ‪ printf‬و ‪ scanf‬بصورت استاندارد درآمده و توسط عرضه کنندگان مختلف ارائه می‬
‫شوند‪.‬‬
‫در کامپایلر عرضه شده توسط شرکت بورلند )‪ (Borland C++ 3.1‬نیز کتابخانه های‬
‫متعددی از توابع برای شما عرضه شده اند که بتدریج با آنها و کاربردشان آشنا خواهید‬
‫شد‪.‬‬
‫نکته مهم آنستکه برای استفاده از این توابع ابتدا باید فایل سرآمد مربوط به آنها را نیز در‬
‫ابتدای برنامه خود اضافه نمایید ) با استفاده از ‪ .(#include‬هر فایل سرآمد شامل تعاریف‬
‫اولیه گروهی از توابع مرتبط با هم و داده های مربوط به آنها بوده و در استاندارد قدیمی‬
‫تر دارای پسوند ‪ .h‬می باشد)در استاندارد جدید پسوند این فایلها حذف شده است(‪.‬‬
‫برخی از این فایلهای سرآمد عبارتند از‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪ : stdio.h‬توابع ورودی و خروجی استاندارد‬
‫‪ : math.h‬توابع ریاضی‬
‫‪ : graphics.h‬توابع مربوط به عملیات گرافیکی‬
‫‪ : string.h‬توابع مربوط به کار با رشته ها‬


Slide 20

‫مبانی کامپیوتر و برنامه سازی‬
‫فصل هفتم ‪ :‬مفاهیم اولیه زبان ‪C‬‬
‫مدرس ‪ :‬نگین معروفی‬

‫‪ 7-1‬شناسه ها در ‪C‬‬
‫‪‬‬
‫‪‬‬

‫شناسه )‪ (identifier‬نامی است که به یک قسمت از برنامه مانند متغیر‪ ،‬تابع‪ ،‬ثابت و یا‬
‫‪ ...‬داده می شود‪.‬‬
‫در زبان ‪ C‬برای انتخاب شناسه ها فقط می توان از عالئم زیر استفاده کرد‪:‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫حروف انگلیسی کوچک و بزرگ )‪(A…Z a…z‬‬
‫ارقام )‪(0…9‬‬
‫عالمت خط پایین یا _‬

‫البته یک شناسه نمی تواند با یک رقم شروع شود‪.‬‬
‫چند شناسه مجاز‪ name2 ، average ، sum :‬و ‪student_average‬‬
‫چند شناسه غیرمجاز ‪ 2name‬و یا ‪student average‬‬
‫در برنامه نویسی امروزی پیشنهاد می شود بجای شناسه هایی همانند‬
‫‪ student_average‬از ‪ studentAverage‬استفاده گردد‪.‬‬
‫نکته مهم دیگری که باید به آن اشاره کرد آنستکه زبان ‪ C‬برخالف بسیاری از زبانهای دیگر‬
‫به کوچک و بزرگی حروف حساس است )‪ .(case sensitive‬در نتیجه شناسه های زیر با‬
‫یکدیگر متفاوتند ‪:‬‬
‫‪Sum ≠ sum ≠ SUM‬‬
‫آخرین نکته اینستکه در هنگام انتخاب شناسه نمی توانید از کلمات کلیدی که برای‬
‫منظورهای خاص در زبان ‪ C‬رزرو شده اند استفاده کنید‪.‬‬

C ‫ شناسه ها در‬7-1
: C ‫کلمات کلیدی در زبان‬
auto

break

case

char

const

continue

default

do

double

else

enum

extern

float

for

goto

if

int

long

register

return

short

signed

sizeof

static

struct

switch

typedef

union

unsigned

void

volatile

while

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫محدوده‬

‫اندازه )بیت(‬

‫توضیح‬

‫نوع داده‬

‫‪-128 to +127‬‬

‫‪8‬‬

‫کاراکتر‬

‫‪char‬‬

‫‪-32768 to +32767‬‬

‫‪16‬‬

‫عدد صحیح‬

‫‪int‬‬

‫‪3.4e-38 to 3.4e+38‬‬

‫‪32‬‬

‫عدد اعشاری‬

‫‪float‬‬

‫‪1.7e-308 to 1.7e+308‬‬

‫‪64‬‬

‫عدد اعشاری با‬
‫دقت مضاعف‬

‫‪double‬‬

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫‪‬‬

‫البته چند نکته مهم درمورد این جدول قابل ذکر است ‪:‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫اندازه ‪ int‬در محیطهای ‪ 16‬بیتی مانند ‪ DOS‬برابر ‪ 16‬بیت است‪ .‬اما در‬
‫محیطهای ‪ 32‬بیتی همانند ‪ Windows‬اندازه آن ‪ 32‬بیت می باشد که در‬
‫اینصورت محدوده ای برابر ‪ -2,147,483,648‬تا ‪ +2,147,483,647‬را‬
‫پوشش می دهد‪.‬‬
‫در بعضی از کامپایلرهای ‪ ،C‬نوع داده ‪ bool‬نیز وجود دارد که می تواند‬
‫یکی از مقادیر ‪)true‬درست( یا ‪) false‬غلط( را نشان دهد ‪ .‬اما در نسخه‬
‫های اولیه ‪ C‬از همان نوع داده صحیح یا ‪ int‬برای اینکار استفاده می‬
‫شد‪ .‬بدین صورت که ‪ 0‬نشاندهنده ‪ false‬و هر عدد غیر صفر )معموال ‪(1‬‬
‫نشاندهنده ‪ true‬است‪.‬‬
‫از آنجا که برای ذخیره سازی کاراکترها کد اسکی آنها ذخیره می گردد‪،‬‬
‫از یک متغیر کاراکتری یا ‪ char‬می توان بعنوان یک عدد صحیح کوچک نیز‬
‫استفاده کرد و اعمال ریاضی برروی آنها نیز مجاز است‪.‬‬

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫عالوه براین چندین اصالح کننده نیز وجود دارد که به ما اجازه می دهد نوع داده مورد‬
‫نظر را با دقت بیشتری برای نیازهای مختلف استفاده نماییم‪.‬‬
‫این اصالح کننده ها عبارتند از ‪short, long, signed, unsigned :‬‬
‫تمام این اصالح کننده ها می توانند به نوع داده ‪ int‬اعمال شوند و اثر آنها بستگی‬
‫به محیط دارد‪.‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫در یک محیط ‪16‬بیتی‪short int ،‬بازهم برابر ‪16‬بیت است ولی ‪ long int‬برابر‪32‬بیت می‬
‫باشد‪.‬‬
‫‪ unsigned int‬باعث می شود که یک عدد ‪ 16‬بیتی بدون عالمت داشته باشیم که بازه‬
‫بین ‪ 0‬تا ‪ 65535‬را پوشش می دهد‪ signed int .‬نیز همانند ‪ int‬معمولی بوده و تفاوتی‬
‫ندارد‪.‬‬
‫ترکیب این اصالح کننده ها نیز ممکن است‪ .‬مثال ‪ unsigned long int‬یک عدد ‪ 32‬بیتی‬
‫بدون عالمت است که بازه ‪ 0‬تا ‪ 4,294,967,295‬را پوشش می دهد‪.‬‬

‫برروی نوع داده ‪ char‬فقط اصالح کننده های ‪ signed‬و ‪ unsigned‬را می توان اعمال‬
‫کرد‪ .‬معموال از اصالح کننده ‪ unsigned‬وقتی استفاده می شود که قصد داشته‬
‫باشیم از ‪ char‬بعنوان یک عدد صحیح مثبت بین ‪ 0‬تا ‪ 255‬استفاده کنیم‪.‬‬
‫برروی نوع داده ‪ double‬تنها اصالح کننده ‪ long‬قابل اعمال است و دراینصورت عدد‬
‫اعشاری با ‪ 80‬بیت را خواهیم داشت که قادر است هر عددی در بازه ‪ 3.4e-4932‬تا‬
‫‪ 1.1e+4932‬را در خود نگاه دارد‪.‬‬

‫‪ 7-3‬تعریف متغیرها‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای تعریف متغیرها به شکل زیر عمل می کنیم‪:‬‬

‫;>‪ ‫که ‪ type‬یکی از نوع داده های گفته شده و ‪ variable-list‬لیستی از متغیرها است‬
‫که با کاما از یکدیگر جدا شده اند‪ .‬بعنوان مثال ‪:‬‬
‫;‪int sum‬‬
‫;‪float average‬‬
‫; ‪long int a, b, c‬‬
‫; ‪unsigned long int i, j, k‬‬
‫عالوه براین می توان در هنگام تعریف متغیر به آن مقدار اولیه نیز داد‪ .‬مثال ‪:‬‬
‫; ‪int d = 0‬‬
‫نكته مهم آنكه زبان ‪ C‬به متغیرها مقدار اولیه نمي دهد )حتي ‪ (0‬و برنامه نويس‬
‫خود بايد اينكار را صريحا انجام دهد‪ ،‬درغیر اينصورت مقدار اولیه متغیر‪ ،‬نامعین خواهد‬
‫بود‪.‬‬
‫تعریف متغیرها طبق اصول زبان ‪ C‬میتواند درهرجایی از برنامه صورت پذیرد‪ ،‬و‬
‫متغیرهای تعریف شده از همان خط به بعد قابل استفاده خواهد بود‪ .‬اما معموال‬
‫توصیه می گردد كه تعریف متغیرها در همان خط ابتدایی تابع و بالفاصله پس از {‬
‫صورت پذیرد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫‪‬‬
‫‪‬‬

‫ثابتها مقادیر ثابتی هستند كه مقدار آنها در حین اجرای برنامه تغییر نمی یابد‪ .‬ثابتها می توانند از‬
‫هریك از نوع داده های اصلی باشند‪.‬‬
‫ثوابت عددی صحیح ‪:‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫برای نمایش این دسته از ثوابت‪ ،‬از دنباله ای از ارقام بعالوه عالمت ‪ +‬یا ‪ -‬استفاده می كنیم‪ .‬بعنوان مثال‬
‫‪ -45‬و یا ‪ 3489‬ثوابت صحیح هستند‪.‬‬
‫در حالت عادی ‪ C‬هر عدد را در كوچكترین نوع داده ای كه می تواند قرار می دهد‪ .‬مثال عدد ‪ 85‬در یك‬
‫‪ int‬قرار می گیرد‪ ،‬اما عدد ‪ 145398‬در یك ‪ long int‬قرار خواهد گرفت‪.‬‬
‫اگر قصد دارید یك عدد كوچك بعنوان ‪ long‬محسوب گردد‪ ،‬می توانید از پسوند ‪ L‬در انتهای آن استفاده‬
‫می كنیم‪ .‬مثال ‪245L‬یك عدد ‪ long‬محسوب می شود‪.‬‬
‫;‪long int a = 20L‬‬
‫پسوند ‪ U‬در انتهای عدد نیز نشانه بدون عالمت بودن آن است‪.‬‬
‫نكته دیگر آنكه ‪ C‬به شما اجازه می دهد درصورت لزوم ثوابت صحیح خود را در مبنای ‪ 8‬یا ‪ 16‬نیز كه‬
‫از مبناهای متداول در برنامه نویسی هستند‪ ،‬بنویسید‪.‬‬
‫‪‬‬
‫‪‬‬

‫برای نوشتن عدد در مبنای ‪ 8‬باید آن را با ‪ 0‬آغاز كنید‪ ،‬مثال ‪ 0342‬یك عدد در منای ‪ 8‬محسوب می‬
‫گردد‪.‬‬
‫برای نوشتن یك عدد در مبنای ‪ 16‬باید آن را با ‪ 0x‬آغاز نمایید‪ ،‬مانند ‪.0x27A4‬‬

‫‪ 7-4‬ثوابت‬
‫ثوابت عددی اعشاری‬

‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫برای نمایش اعداد اعشاری‪ ،‬باید از نقطه اعشار استفاده كنیم‪ ،‬مانند ‪237.45‬‬
‫اما نكته جالب آنستكه می توانید از نماد علمی نیز برای نمایش اعداد‬
‫اعشاری استفاده كنید‪ .‬برای اینكار كافی است از حرف ‪ e‬برای نمایش قسمت‬
‫توان استفاده نمایید‪ .‬بعنوان مثال ‪:‬‬
‫‪-23.47 × 10 5 = -23.47e5‬‬
‫‪42.389 × 10 -3 = 42.389e-3‬‬
‫دقت كنید كه قسمت توان‪ ،‬حتما یك عدد صحیح است‪.‬‬
‫نكته جالب اینجاست كه برخالف مورد قبل‪ ،‬كامپایلر بطور پیش فرض داده های‬
‫اعشاری را از نوع ‪ double‬فرض می كند‪.‬چنانچه دوست دارید ثابت شما ازنوع‬
‫‪ float‬درنظر گرفته شود‪ ،‬در انتهای آن ‪ F‬قرار دهید‪ .‬ضمنا پسوند ‪ L‬نیز داده‬
‫اعشاری را از نوع ‪ long double‬درنظر می گیرد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫ثوابت كاراكتری ‪:‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫برای نشان دادن ثوابت كاراكتری‪ ،‬آنها را در داخل ' قرار می دهیم‪ .‬بعنوان مثال‬
‫'‪'A‬یك ثابت كاراكتری است‪.‬‬
‫; '‪char ch = 'S‬‬
‫دقت كنید كه همانطور كه قبال گفته شد‪ ،‬كد اسكی كاراكترها در متغیر ذخیره‬
‫می گردد‪ ،‬بنابراین می توان از آن بعنوان یك عدد صحیح نیز استفاده كرد‪ .‬نكته‬
‫مهم دیگر آنستكه به تفاوت عدد ‪ 5‬و كاراكتر '‪ '5‬دقت داشته باشید‪ .‬در حقیقت‬
‫'‪ '5‬برابر است با عدد ‪ 53‬كه همان كد اسكی آن است‪.‬‬
‫روش فوق‪ ،‬برای نمایش کاراکترهای قابل چاپ مناسب است‪ ،‬اما بعضی‬
‫كاراكترها مانند ‪ enter‬قابل نمایش نبوده و برای آنها شکل خاصی وجود ندارد‪.‬‬
‫در چنین مواردی‪ ،‬زبان ‪ C‬از ترکیب عالمت \ به همراه یک کاراکتر دیگر‪ ،‬برای‬
‫نمایش این قبیل کاراکترها استفاده می نماید‪ .‬بعنوان مثال‪ ،‬کاراکتر '‪ '\n‬نشان‬
‫دهنده خط جدید یا همان ‪ enter‬می باشد‪.‬‬
‫جدول صفحه بعد این قبیل کاراکترها و معادل آنها را نشان می دهد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫نحوه نمایش در ‪C‬‬

‫کد اسکی‬

‫صدای بوق کامپیوتر‬

‫‪\a‬‬

‫‪7‬‬

‫حرکت به عقب ‪backspace‬‬

‫‪\b‬‬

‫‪8‬‬

‫شروع صفحه ‪form feed‬‬

‫‪\f‬‬

‫‪12‬‬

‫سطر جدید ‪line feed‬‬

‫‪\n‬‬

‫‪10‬‬

‫برگشت به ابتداي سطر ‪carriage return‬‬

‫‪\r‬‬

‫‪13‬‬

‫فاصله افقی ‪horizontal tab‬‬

‫‪\t‬‬

‫‪9‬‬

‫فاصله عمودی ‪vertical tab‬‬

‫‪\v‬‬

‫‪11‬‬

‫عالمت سوال‬

‫?\‬

‫‪63‬‬

‫عالمت '‬

‫'\‬

‫‪39‬‬

‫عالمت "‬

‫"\‬

‫‪34‬‬

‫عالمت \‬

‫\\‬

‫‪92‬‬

‫عالمت تهی‬

‫‪\0‬‬

‫‪0‬‬

‫نام کاراکتر‬

‫کد اسکی یک کاراکتر با ‪ 3‬رقم در مبنای ‪8‬‬

‫‪\000‬‬

‫کد اسکی یک کاراکتر با ‪ 2‬رقم در مبنای ‪16‬‬

‫‪\x00‬‬

‫‪ 7-4‬ثوابت‬
‫‪‬‬

‫ثوابت رشته ای ‪ C :‬عالوه بر ثوابت فوق‪ ،‬از یك ثابت دیگر بنام رشته نیز‬
‫حمایت می كند‪ .‬رشته‪ ،‬دنباله ای از كاراكترها است كه در داخل " قرار‬
‫می گیرند‪ .‬بعنوان مثال "‪ "this is a test‬یك رشته است‪ .‬دقت كنید كه '‪'a‬‬
‫یك كاراكتر است‪ ،‬اما "‪ "a‬یك رشته است كه فقط شامل یك كاراكتر می‬
‫باشد‪.‬‬

‫‪ 7-5‬عملگرها‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫عملگر‪ ،‬نمادی است كه به كامپایلر می گوید تا عملیات محاسباتی یا‬
‫منطقی خاصی را برروی یك یا چند عملوند‪ ،‬انجام دهد‪.‬‬
‫به عملگرهایی كه فقط یك عملوند دارند‪ ،‬عملگر یكانی می گوییم و‬
‫همواره عملگر در سمت چپ عملوند قرار می گیرد)مانند عدد ‪.(-125‬‬
‫اما عملگرهایی كه برروی دو عملوند اثر می كنند را عملگر دودویی‬
‫نامیده و عملگر را بین دو عملوند قرار می دهیم )مانند ‪.(23+86‬‬
‫هر ترکیب درستی از عملگرها و عملوندها را یک عبارت می نامیم‪.‬‬
‫‪ C‬از نقطه نظر عملگرها یك زبان بسیار قوی است‪ .‬این عملگرها به چند‬
‫دسته اصلی تقسیم می گردند كه آنها را به ترتیب بررسی می كنیم‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫این عملگرها‪ ،‬همان اعمال متداول ریاضی هستند كه در زبان ‪ C‬مورد استفاده‬
‫قرار می گیرند‪ .‬این اعمال عبارتند از ‪:‬‬

‫عمل‬

‫نوع‬

‫عملگر‬

‫منفی كردن عملوند سمت راست‬

‫یكانی‬

‫‪-‬‬

‫جمع دو عملوند‬

‫دودویی‬

‫‪+‬‬

‫تفریق دو عملوند‬

‫دودویی‬

‫‪-‬‬

‫ضرب دو عملوند‬

‫دودویی‬

‫*‬

‫تقسیم دو عملوند‬

‫دودویی‬

‫‪/‬‬

‫محاسبه باقیمانده تقسیم دو عملوند‬

‫دودویی‬

‫‪%‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬
‫‪‬‬

‫این عملگرهای برروی همه انواع داده های ‪ C‬عمل می كنند‪ ،‬بجز عملگر ‪ %‬كه فقط‬
‫برروی نوع داده های صحیح عمل می كند‪.‬‬
‫اما نكته مهمی كه باید به آن اشاره كرد‪ ،‬نحوه كار عملگر تقسیم برروی نوع داده های‬
‫مختلف است‪.‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫درصورتیكه هردو عملوند صحیح باشند‪ ،‬تقسیم بصورت صحیح بر صحیح انجام خواهد شد‪.‬‬
‫اگر یكی یا هر دو عملوند اعشاری باشند‪ ،‬تقسیم بصورت اعشاری انجام خواهد پذیرفت‪.‬‬
‫فرض كنید تعاریف زیر را داریم ‪:‬‬
‫; ‪int a,b‬‬
‫; ‪float c,d‬‬
‫; ‪a = 10 ; b = 4‬‬
‫;‪c = 8.2; d = 4.0‬‬
‫اكنون به نتایج عملیات زیر دقت كنید ‪:‬‬
‫‪a / b => 2‬‬
‫‪c / d => 2.05‬‬
‫‪a / d => 2.5‬‬
‫‪a / 4 => 2‬‬
‫چنانچه به آخرین مورد توجه كنید‪ ،‬متوجه می شوید كه از آنجا كه ‪a‬یك متغیر صحیح است و ‪4‬‬
‫نیز یك ثابت صحیح در نظر گرفته شده‪ ،‬درنتیجه تقسیم بصورت صحیح بر صحیح انجام گرفته‬
‫است‪ .‬چنانچه بخواهیم تقسیم بصورت اعشاری صورت پذیرد‪ ،‬به دو شكل می توانیم عمل‬
‫كنیم‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫برای اینکه عبارت تقسیم صفحه قبل بصورت اعشاری انجام شود‪ ،‬به دو روش‬
‫می توان عمل کرد‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫این عبارت را بصورت ‪ a / 4.0‬بنویسیم‪.‬‬
‫از عملگر قالب ریزی استفاده كنیم‪.‬‬

‫عملگر قالب ریزی می تواند یك نوع را به نوع دیگری تبدیل نماید‪ .‬شكل كلی آن‬
‫به شكل زیر است ‪:‬‬
‫>‪() ‫كه ‪ type‬نوع مورد نظر است كه قصد تبدیل عبارت ‪ expression‬به آن نوع را‬
‫داریم‪ .‬بعنوان مثال در مورد قبلی می توان به شكل زیر عمل كرد ‪:‬‬
‫‪(float) a / 4‬‬
‫در این حالت از كامپایلر خواسته ایم كه ابتدا عدد ‪ a‬را به اعشاری تبدیل كند‬
‫)البته بصورت موقت( و سپس آن را بر ‪ 4‬تقسیم نماید‪ ،‬كه مسلما حاصل‬
‫اعشاری خواهد بود‪.‬‬
‫بطوركلی هرگاه ثابتها و متغیرهایی از انواع مختلف در یك عبارت محاسباتی‬
‫داشته باشیم‪ ،‬كامپایلر ‪ C‬همه آنها را به یك نوع یكسان كه همان بزرگترین‬
‫عملوند موجود است تبدیل خواهد كرد‪ .‬بعنوان مثال به مورد صفحه بعد دقت‬
‫كنید ‪:‬‬

‫ عملگرهای محاسباتی‬7-5-1
char ch;
int i;

float f;
double d;
result = (ch / i)
int

+

(f *d)

(f+i)
float

double

double

int

-

double

double

float

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫اولویت عملگرها ‪ :‬در عبارتی که شامل چندین عملگر است‪ ،‬کدامیک در‬
‫ابتدا اعمال خواهد گردید‪.‬‬
‫اولویت عملگرهای محاسباتی از باال به پایین بشرح زیر است‪:‬‬
‫‪ ‬عملگر یکانی –‬
‫‪ ‬عملگرهای * و ‪ /‬و ‪%‬‬
‫‪ ‬عملگرهای ‪ +‬و –‬
‫چنانچه اولویت دو عملگر یکسان باشد‪ ،‬این عملگرها از چپ به راست‬
‫محاسبه خواهند شد‪.‬‬
‫چنانچه بخواهیم یک عمل با اولویت پایین زودتر انجام شود‪ ،‬باید از پرانتز‬
‫استفاده کنیم‪ .‬بنابراین اولویت عملگر پرانتز از همه موارد فوق‬
‫بیشتراست‪ .‬در مورد پرانتزهای متداخل‪ ،‬ابتدا پرانتز داخلی محاسبه‬
‫می شود؛ اما در مورد پرانتزهای هم سطح‪ ،‬ابتدا پرانتز سمت چپتر‬
‫محاسبه می گردد‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫چند مثال در مورد اولویت عملگرها‬

‫ترتیب اجرای عملگرها‬

‫عبارت زبان ‪C‬‬

‫ابتدا عمل * و سپس عمل ‪+‬‬

‫‪b+c*d‬‬

‫ابتدا عمل ‪ +‬و سپس عمل *‬

‫‪(b + c) * d‬‬

‫ابتدا عمل ‪ /‬سپس عمل * و در انتها عمل ‪+‬‬

‫‪b+c/d*e‬‬

‫ابتدا عمل * سپس عمل ‪ /‬و در انتها عمل ‪+‬‬

‫)‪b + c / (d * e‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫یک مثال کامل در مورد اولویت عملگرها‬

‫‪result = a + b * (f – (g + b) / d) – c * (a – d) / e‬‬
‫‪6‬‬

‫‪1‬‬
‫‪7‬‬

‫‪2‬‬

‫‪8‬‬

‫‪3‬‬
‫‪4‬‬
‫‪5‬‬
‫‪9‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫در زبان ‪ C‬برای انتساب چندین عملگر وجود دارد‪ .‬ساده ترین عملگر انتساب‪ ،‬همان عملگر =‬
‫است که در بسیاری از زبانها استفاده می شود‪ .‬بعنوان مثال ‪:‬‬
‫;‪a = 5‬‬
‫;‪b = c + 2 * d‬‬
‫این عملگر باعث می شود که عبارت سمت راست در عبارت سمت چپ قرار گیرد‪.‬‬
‫توجه کنید که مقدار سمت چپ باید عبارتی باشد که بتوان به آن یک مقدار را نسبت داد‬
‫)مانند یک متغیر( که به آن ‪ Lvalue‬گفته می شود‪ ،‬بنابراین یک ثابت نمی تواند در سمت چپ‬
‫قرار گیرد‪.‬‬
‫نکته دیگر اینکه اولویت عملگر = از عملگرهای ریاضی کمتر است و درنتیجه ابتدا آن عملیات‬
‫انجام شده و در پایان حاصل در عبارت سمت چپ ریخته می شود‪.‬‬
‫الزم به ذکر است که در هنگام انتساب‪ ،‬درصورت لزوم نوع عبارت سمت راست به نوع عبارت‬
‫سمت چپ تبدیل می شود‪ .‬مثال‪:‬‬
‫;‪int a‬‬
‫;‪a = 2.5 * 5.0‬‬
‫که دراینصورت عدد ‪ 12‬در ‪ a‬ذخیره خواهد شد‪.‬‬
‫شرکت پذیری این عملگر از راست به چپ می باشد‪ ،‬بدین معنا که چنانچه چندین عملگر‬
‫نسبت دهی داشته باشیم‪ ،‬این عملگرها از راست به چپ محاسبه می شوند‪ .‬مثال پس از‬
‫اجرای دستور زیر‪ ،‬مقدار هر ‪ 3‬متغیر برابر ‪ 10‬خواهد شد‪.‬‬
‫;‪a = b = c = 10‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬

‫نکته جالب درمورد زبان ‪ C‬آنستکه دارای یک سری عملگرهای انتساب‬
‫خالصه شده است که باعث می شوند در بعضی موارد بتوانیم عبارات‬
‫کوتاهتری را بنویسیم‪ .‬این عملگرها عبارتند از ‪:‬‬
‫عملگرد‬

‫مثال‬

‫عبارت انتساب معادل‬

‫‪++‬‬

‫;‪a ++‬‬

‫;‪a = a + 1‬‬

‫‪--‬‬

‫;‪a --‬‬

‫;‪a = a – 1‬‬

‫=‪+‬‬

‫;‪a += 5‬‬

‫;‪a = a + 5‬‬

‫=‪-‬‬

‫;‪a -= 8‬‬

‫;‪a= a – 8‬‬

‫=*‬

‫;‪a *= 10‬‬

‫;‪a= a * 10‬‬

‫=‪/‬‬

‫;‪a /= 2‬‬

‫;‪a = a / 2‬‬

‫=‪%‬‬

‫;‪a %= 10‬‬

‫;‪a = a % 10‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬
‫‪‬‬

‫عملگر اول و دوم‪ ،‬عملگرهای یکانی هستند که بترتیب عملگر افزایش و عملگر کاهش‬
‫نامیده می شوند‪.‬‬
‫نکته جالب آنستکه این دو عملگر به دوصورت مورد استفاده قرار می گیرند‪.‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫در حالتی که از دستور ;‪ a ++‬استفاده شود به آن پس افزایش می گویند و بدین معناست که‬
‫ابتدا از مقدار فعلی ‪ a‬در عبارت موردنظر استفاده کن و سپس آن را افزایش بده‪.‬‬
‫اما دستور ;‪ ++ a‬که به آن پیش افزایش گفته می شود‪ ،‬ابتدا ‪ a‬را افزایش داده و سپس از آن‬
‫در عبارت استفاده می کند‪.‬‬
‫به برنامه زیر دقت کنید‪:‬‬

‫>‪#include ‫{ )(‪void main‬‬
‫; ‪int a ,b‬‬
‫;‪a=5‬‬
‫;‪b = a ++‬‬
‫;)‪printf(“a=%d and b=%d \n”,a,b‬‬
‫;‪a=5‬‬
‫;‪b = ++ a‬‬
‫;)‪printf(“a=%d and b=%d \n”,a,b‬‬
‫}‬
‫‪a=6 b=5‬‬
‫‪a=6 b=6‬‬

‫‪ 7-5-3‬عملگرهای مقایسه ای‬
‫‪‬‬

‫‪‬‬

‫این عملگرها دو عبارت را بایکدیگر مقایسه کرده و نتیجه را باز می گردانند‪.‬‬
‫نتیجه می تواند درست )‪ (true‬یا غلط )‪ (false‬باشد‪.‬‬
‫نتیجه این عملگرها یک عدد صحیح است که درصورت درست بودن ‪ 1‬و‬
‫درصورت غلط بودن ‪ 0‬باز می گردانند‪ .‬این عملگرها عبارتند از‪:‬‬
‫عملگر‬

‫مفهوم عملگر‬

‫مثال‬

‫<‬

‫بزرگتر )<(‬

‫‪a>b‬‬

‫>‬

‫کوچکتر )>(‬

‫‪a
‫=<‬

‫بزرگتر یا مساوی )≤(‬

‫‪a >= b‬‬

‫=>‬

‫کوچکتر یا مساوی )≥(‬

‫‪a <= b‬‬

‫==‬

‫مساوی )=(‬

‫‪a == b‬‬

‫=!‬

‫نامساوی )≠(‬

‫‪a != b‬‬

‫‪ 7-5-3‬عملگرهای مقایسه ای‬
‫‪‬‬

‫‪‬‬

‫نکته مهمی که باید به آن دقت کرد عملگر مساوی )==( است‪ ،‬چرا که یک‬
‫اشتباه بسیار متداول برنامه نویسان ‪ C‬استفاده اشتباه از عملگر انتساب‬
‫)=( بجای عملگر تساوی )==( است که باعث ایجاد خطا در برنامه می‬
‫شود‪.‬‬
‫اولویت این عملگرها از باال به پایین بشرح زیر است‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫عملگرهای <‪ <= ، > ،‬و =>‬
‫عملگرهای == و =!‬

‫الزم بذکر است که در هنگام مساوی بودن اولویت چند عملگر‪ ،‬این عملگرها‬
‫از چپ به راست محاسبه می گردند‪.‬‬

‫‪ 7-5-4‬عملگرهای منطقی‬
‫‪‬‬

‫این عملگرها به شما اجازه می دهند که شرطهای ساده ای را که با‬
‫استفاده از عملگرهای مقایسه ای ایجاد شده اند را با یکدیگر ترکیب نموده‬
‫و شرطهای پیچیده تری را بسازید‪ .‬این عملگرها عبارتند از ‪:‬‬
‫مثال‬

‫عملگر‬

‫مفهوم عملگر‬

‫نحوه کار‬

‫&&‬

‫‪ AND‬منطقی‬

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

‫‪a>0 && sw==1‬‬

‫||‬

‫‪ OR‬منطقی‬

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

‫‪a<=100 || b!=0‬‬

‫!‬

‫‪ NOT‬منطقی‬

‫اگر عملوند درست باشد‪ ،‬نادرست و‬
‫اگر نادرست باشد‪ ،‬درست برمی‬
‫گرداند‪.‬‬

‫)‪! (a==1 || b<10‬‬

‫‪ 7-5-5‬عملگر شرطی‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫گاهی الزم است که ابتدا یک شرط بررسی شده و سپس برمبنای نتیجه )درست یا نادرست بودن آن( یکی‬
‫از دو عبارت ممکن بازگردانده شود‪ .‬برای اینکار می توان از یک عملگر ‪3‬تایی )با ‪ 3‬عملوند( بنام عملگر‬
‫شرطی استفاده نمود‪.‬‬
‫شکل کلی این عملگر بصورت زیر است‪:‬‬
‫>عبارت‪> :<2‬عبارت‪> ?<1‬شرط<‬
‫نحوه کار بدینصورت است که درصورت درست بودن شرط‪ ،‬عبارت‪ 1‬و در غیراینصورت عبارت ‪ 2‬بازگردانده می‬
‫شود‪.‬‬
‫به عنوان مثال به دستور زیر توجه کنید‪:‬‬
‫که این عبارت معادل دستور زیر است‪:‬‬

‫‪‬‬

‫;‪a = (k<10) ? 100 : 50‬‬
‫;‪if (k<10) a=100‬‬
‫;‪else a=50‬‬

‫البته این عبارت به شکلهای پیچیده نیز می تواند مورد استفاده قرار گیرد‪ .‬مثال ‪:‬‬
‫;‪c += (a>0 && a<10) ? ++a : a/b‬‬
‫که معادل است با ‪:‬‬
‫{ )‪if (a>0 && a<10‬‬
‫;‪a= a + 1‬‬
‫;‪c = c + a‬‬
‫}‬
‫;‪else c = c + a/b‬‬

‫‪ 7-5-6‬اولویت عملگرها‬
‫عملگر‬

‫اولویت‬

‫شرکت پذیری‬

‫‪1‬‬

‫)(‬

‫از چپ به راست‬

‫‪2‬‬

‫‪- + ! -- ++‬‬

‫از راست به چپ‬

‫‪3‬‬

‫‪* / %‬‬

‫از چپ به راست‬

‫‪4‬‬

‫‪+ -‬‬

‫از چپ به راست‬

‫‪5‬‬

‫>> <<‬

‫از چپ به راست‬

‫‪6‬‬

‫>= > <= <‬

‫از چپ به راست‬

‫‪7‬‬

‫=! ==‬

‫از چپ به راست‬

‫‪8‬‬

‫&&‬

‫از چپ به راست‬

‫‪9‬‬

‫||‬

‫از چپ به راست‬

‫‪10‬‬

‫‪?:‬‬

‫از راست به چپ‬

‫‪11‬‬

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

‫از راست به چپ‬

‫‪12‬‬

‫‪,‬‬

‫از چپ به راست‬

‫‪ 7-6‬خواندن و نمایش اطالعات‬
‫‪‬‬

‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫همانطور كه قبال نیز گفته شد‪ ،‬یكی از اهداف زبان ‪ C‬قابل حمل بودن آن‬
‫است‪ .‬بهمین منظور سعی شده است كه از دستوراتی كه ممكن است‬
‫وابسته به ماشین خاصی باشد‪ ،‬اجتناب گردد‪.‬‬
‫بهمین دلیل زبان ‪ C‬برخالف سایر زبانها دارای هیچ دستوری برای‬
‫خواندن از ورودی و یا نوشتن در خروجی نیست‪.‬‬
‫اما در عوض دارای تعدادی تابع )زیربرنامه( استاندارد می باشد كه تقریبا‬
‫تمامی كامپایلرها از آنها حمایت می كنند‪.‬‬
‫این كار به كامپایلر این امكان را می دهد كه بر حسب نوع سخت افزار‬
‫موردنظر‪ ،‬توابع ورودی و خروجی را طراحی نماید‪.‬‬
‫این توابع در یك فایل سرآمد بنام ‪ stdio.h‬تعریف شده اند و بنابراین قبل‬
‫ازاینكه بتوانید از این توابع استفاده نمایید‪ ،‬باید این فایل را نیز با استفاده‬
‫از ‪ #include‬در برنامه خود بگنجانید‪.‬‬

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫برای نمایش اطالعات در خروجی از تابع ‪ printf‬استفاده می شود‪.‬‬
‫این تابع رشته موردنظر شما را به خروجی استاندارد )كه در حالت‬
‫عادی همان صفحه نمایش یا مانیتور است( می فرستد‪ .‬شكل كلی این‬
‫تابع بصورت زیر است‪:‬‬
‫; )>لیست متغیرها< ‪> ,‬رشته كنترلی<(‪printf‬‬
‫رشته كنترلی همان متنی است كه قصد چاپ آن را داریم‪ ،‬با ذكر این‬
‫نكته كه در قسمتهایی كه باید مقدار یك متغیر چاپ شود‪ ،‬از یك‬
‫مشخصه تبدیل استفاده می شود‪ .‬هر مشخصه تبدیل از یك عالمت ‪%‬‬
‫بعالوه یك كاراكتر كه نوع متغیر مورد نظر را نشان می دهد تشكیل می‬
‫گردد‪.‬‬
‫لیست متغیرها نیز همان متغیرهایی هستند كه قصد چاپ آنها را داریم‪.‬‬
‫این متغیرها باید بترتیب قرار گرفته و با كاما )‪ (,‬از یكدیگر جدا شوند‪.‬‬

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫مشخصه تبدیل‬

‫مفهوم‬

‫‪%c‬‬

‫كاراكتر‬

‫‪%d‬‬

‫عدد صحیح در مبنای ‪10‬‬

‫‪%f‬‬

‫عدد اعشاری بدون نماد علمی‬

‫‪%e‬‬

‫عدد اعشاری با نماد علمی‬

‫‪%g‬‬

‫عدد اعشاری با حالت كوتاهتر بین ‪ e‬و ‪f‬‬

‫‪%s‬‬

‫رشته‬

‫‪%ld‬‬

‫عدد صحیح بزرگ‬

‫‪%lf %le %lg‬‬

‫عدد اعشاری بزرگ‬

‫‪%o‬‬

‫عدد صحیح در مبنای ‪8‬‬

‫‪%x‬‬

‫عدد صحیحی در مبنای ‪16‬‬

‫‪%u‬‬

‫عدد صحیح بدون عالمت‬

‫ تابع نمایش در خروجی‬7-6-1
#include
void main() {
int age = 20;
floate average = 18.23;
printf("You are %d years old and your average is %f \n",age,average);
}
You are 20 years old and your average is 18.230000

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫‪‬‬
‫‪‬‬

‫برای کنترل نحوه چاپ اعداد می توانید از مشخصه طول میدان استفاده‬
‫کنید‪.‬‬
‫مشخصه طول میدان برای اعداد به شكل زیر استفاده می شود‪:‬‬
‫‪ ‬برای اعداد صحیح از ‪ %nd‬استفاده می كنیم كه ‪ n‬تعداد ارقام را نشان‬
‫می دهد )مثال ‪ .(%3d‬در اینصورت برای هر متغیر ‪ n‬رقم درنظر گرفته‬
‫می شود‪ .‬اگر اندازه عدد از ‪ n‬كوچكتر باشد‪ ،‬به سمت چپ آن فضای‬
‫خالی اضافه می شود و اگر اندازه عدد بیش از ‪ n‬رقم باشد‪ ،‬طول میدان‬
‫نادیده گرفته شده و عدد بطور كامل چاپ می شود‪.‬‬
‫‪ ‬برای اعداد اعشاری از ‪ %n.mf‬استفاده می كنیم كه ‪ n‬اندازه كل عدد‬
‫)شامل عالمت ممیز( و ‪ m‬تعداد ارقام اعشار است )مثال ‪ .(%5.2f‬در‬
‫صورتیكه تعداد ارقام اعشاری عدد موردنظر از ‪ m‬بیشتر باشد‪ ،‬عدد به ‪m‬‬
‫عدد اعشار گرد می شود و در صورتیكه از ‪ m‬كمتر باشد‪ ،‬در سمت‬
‫راست آن ‪ 0‬قرار داده می شود‪.‬‬

‫‪ 7-6-2‬تابع خواندن از ورودی‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای خواندن اطالعات از ورودی از تابع ‪ scanf‬استفاده می شود‪.‬‬
‫این تابع اطالعات را ازورودی استاندارد )معموال صفحه كلید( خوانده و در‬
‫متغیرهای تعیین شده قرار می دهد‪.‬‬
‫شكل كلی این تابع بصورت زیر است‪:‬‬
‫; )>لیست آدرسهای متغیرها< ‪> ,‬رشته كنترلی<(‪scanf‬‬
‫همانطور كه می بینید نحوه احضار تابع ‪ scanf‬نیز مشابه ‪ printf‬است‪ .‬تنها‬
‫تفاوت در آن است كه در ‪ scanf‬باید لیست آدرسهای متغیرها ارسال شود‪.‬‬
‫مبحث مربوط به آدرسها در فصول بعدی بررسی خواهد شد ولی در حال حاضر‬
‫بخاطر بسپارید كه برای بدست آوردن آدرس یك متغیر از عالمت & استفاده می‬
‫كنیم‪ .‬بعنوان مثال ‪ &age‬بمعنای آدرس متغیر ‪ age‬است‪.‬‬
‫بطور كلی در ‪ C‬قدیمی هرگاه كه یك تابع دارای پارامترهای خروجی بود )یعنی‬
‫پارامترهایی كه یك مقدار را باز می گرداندند( از آدرس متغیرها استفاده می‬
‫شد كه امروزه این مسئله وجود ندارد‪.‬‬

‫ تابع خواندن از ورودی‬7-6-2
#include
void main() {
int age;
float average ;
printf("Please enter your age and average : ");
scanf("%d %f",&age,&average);
printf("You are %d years old and your average is %5.2f \n",age,average);
}

Please enter your age and average : 19 16.72
You are 19 years old and your average is 16.72

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫زبان ‪ C++‬یک زبان شی گرا است‪ ،‬بهمین دلیل در این زبان برای ورودی‬
‫و خروجی از اشیاء بجای توابع استفاده می گردد‪.‬‬
‫از آنجا که امروزه معموال برنامه نویسان ‪ C‬از کامپایلرهای ‪ C++‬استفاده‬
‫می کنند‪ ،‬می توانند از اشیای ورودی و خروجی آن نیز استفاده کنند‪.‬‬
‫اینکار در بین بسیاری از برنامه نویسان ‪ C‬متداول است‪ ،‬بهمین دلیل ما‬
‫در اینجا نحوه کار با اشیای خواندن و نوشتن در ‪ C++‬را بطور مقدماتی‬
‫توضیح می دهیم؛ گرچه توضیح کامل این موارد نیاز به آشنایی با شی‬
‫گرایی و زبان ‪ C++‬دارد‪.‬‬
‫قبل از هرچیز الزم به ذکر است که کلیه اشیای مربوط به ورودی و‬
‫خروجی در فایل سرآمدی بنام ‪ iostream.h‬تعیریف شده اند‪ ،‬بنابراین‬
‫ابتدا باید این فایل به برنامه توسط دستور ‪ #include‬الحاق گردد‪.‬‬

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫زبان ‪ C++‬برای نمایش اطالعات از یک شیئ بنام ‪ cout‬استفاده می نماید‪.‬‬
‫برای ارسال اطالعات مورد نظر برای چاپ به ‪ cout‬باید از عملگر درج در جریان‬
‫یا >> استفاده نماییم‪ .‬بعنوان مثال ‪:‬‬
‫; ” ‪cout >> “Please enter your name:‬‬
‫و یا مثال دیگر ‪:‬‬
‫;‪int a = 10‬‬
‫;‪float b = 2.86‬‬
‫;‪cout << a‬‬
‫;‪cout << b‬‬
‫نکته جالبی که در این مثالها دیده می شود‪ ،‬آنستکه برخالف تابع ‪ printf‬هیچ‬
‫نیازی به مشخص کردن نوع متغیری که قصد چاپ آن را داریم نیست و خود‬
‫شئ ‪ cout‬نوع آن را تشخیص می دهد‪.‬‬
‫عالوه براین می توان چندین عملگر درج در جریان را با یکدیگر الحاق کرد و‬
‫چندین متغیر را با یک دستور چاپ کرد‪.‬‬

C++ ‫ ورودی و خروجی اطالعات در‬7-6-3
#include
void main() {
int age = 20;
floate average = 18.23;
cout >> “You are ” >> age >> “ years old and your average is ” >> average ;
}

You are 20 years old and your average is 18.230000

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای دریافت اطالعات از کاربر‪ ،‬از شئ دیگری بنام ‪ cin‬استفاده می شود‪.‬‬
‫برای ارسال متغیر مورد نظر به ‪ cin‬باید از عملگر استخراج از جریان یا <<‬
‫استفاده نماییم‪ .‬بعنوان مثال‪:‬‬
‫;‪int a‬‬
‫;‪cin >> a‬‬
‫بازهم همانطور که می بینید نیازی به تعیین نوع متغیر موردنظر نیست و خود‬
‫شئ ‪ cin‬نوع متغیر را بطور اتوماتیک تشخیص داده و داده ای از همان نوع را از‬
‫کاربر دریافت و در متغیر مورد نظر قرار می دهد‪.‬‬
‫عملگرهای استخراج از جریان را نیز می توان با یکدیگر الحاق کرد‪.‬‬
‫برای رفتن به خط بعد در شئ ‪ cout‬می توان از دستکاری کننده ‪ endl‬استفاده‬
‫کرد‪ .‬مثال در دستور زیر پس از چاپ پیغام‪ ،‬مکان نما به خط بعد منتقل می‬
‫شود‪:‬‬
‫;‪cout >> “List of students : “ >> endl‬‬
‫البته دستکاری کننده های متعدد دیگری نیز ازجمله موارد مربوط به تعیین طول‬
‫میدان و نحوه چاپ مقادیر وجود دارد که توضیح آنها نیاز به یک مبحث مستقل‬
‫دارد‪.‬‬

C++ ‫ ورودی و خروجی اطالعات در‬7-6-3
#include
void main() {
int age;
float average ;
cout << "Please enter your age and average : " ;
cin >> age >> average ;
cout << "You are " << age << "years old and your average is " << average;
}

Please enter your age and average : 19 16.72
You are 19 years old and your average is 16.72

‫‪ 7-7‬توابع کتابخانه ای‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫همانطور که قبال نیز گفته شد‪ ،‬زبان ‪ C‬از زیر برنامه ها نیز حمایت می کند‪ .‬هر زیر برنامه‬
‫در ‪ C‬یک تابع نامیده می شود‪ .‬تا کنون با توابعی همچون ‪ main‬و یا ‪ printf‬و ‪ scanf‬آشنا‬
‫شده ایم‪.‬‬
‫معموال عرضه کنندگان کامپایلرها و یا سایر فروشندگان نرم افزار‪ ،‬برخی از توابع عمومی‬
‫را که ممکن است مورد نیاز جمع کثیری از برنامه نویسان مختلف باشد را در قالب‬
‫کتابخانه ای از توابع در اختیار برنامه نویسان می گذارند‪ .‬بعضی از این توابع کتابخانه ای‬
‫مانند ‪ printf‬و ‪ scanf‬بصورت استاندارد درآمده و توسط عرضه کنندگان مختلف ارائه می‬
‫شوند‪.‬‬
‫در کامپایلر عرضه شده توسط شرکت بورلند )‪ (Borland C++ 3.1‬نیز کتابخانه های‬
‫متعددی از توابع برای شما عرضه شده اند که بتدریج با آنها و کاربردشان آشنا خواهید‬
‫شد‪.‬‬
‫نکته مهم آنستکه برای استفاده از این توابع ابتدا باید فایل سرآمد مربوط به آنها را نیز در‬
‫ابتدای برنامه خود اضافه نمایید ) با استفاده از ‪ .(#include‬هر فایل سرآمد شامل تعاریف‬
‫اولیه گروهی از توابع مرتبط با هم و داده های مربوط به آنها بوده و در استاندارد قدیمی‬
‫تر دارای پسوند ‪ .h‬می باشد)در استاندارد جدید پسوند این فایلها حذف شده است(‪.‬‬
‫برخی از این فایلهای سرآمد عبارتند از‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪ : stdio.h‬توابع ورودی و خروجی استاندارد‬
‫‪ : math.h‬توابع ریاضی‬
‫‪ : graphics.h‬توابع مربوط به عملیات گرافیکی‬
‫‪ : string.h‬توابع مربوط به کار با رشته ها‬


Slide 21

‫مبانی کامپیوتر و برنامه سازی‬
‫فصل هفتم ‪ :‬مفاهیم اولیه زبان ‪C‬‬
‫مدرس ‪ :‬نگین معروفی‬

‫‪ 7-1‬شناسه ها در ‪C‬‬
‫‪‬‬
‫‪‬‬

‫شناسه )‪ (identifier‬نامی است که به یک قسمت از برنامه مانند متغیر‪ ،‬تابع‪ ،‬ثابت و یا‬
‫‪ ...‬داده می شود‪.‬‬
‫در زبان ‪ C‬برای انتخاب شناسه ها فقط می توان از عالئم زیر استفاده کرد‪:‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫حروف انگلیسی کوچک و بزرگ )‪(A…Z a…z‬‬
‫ارقام )‪(0…9‬‬
‫عالمت خط پایین یا _‬

‫البته یک شناسه نمی تواند با یک رقم شروع شود‪.‬‬
‫چند شناسه مجاز‪ name2 ، average ، sum :‬و ‪student_average‬‬
‫چند شناسه غیرمجاز ‪ 2name‬و یا ‪student average‬‬
‫در برنامه نویسی امروزی پیشنهاد می شود بجای شناسه هایی همانند‬
‫‪ student_average‬از ‪ studentAverage‬استفاده گردد‪.‬‬
‫نکته مهم دیگری که باید به آن اشاره کرد آنستکه زبان ‪ C‬برخالف بسیاری از زبانهای دیگر‬
‫به کوچک و بزرگی حروف حساس است )‪ .(case sensitive‬در نتیجه شناسه های زیر با‬
‫یکدیگر متفاوتند ‪:‬‬
‫‪Sum ≠ sum ≠ SUM‬‬
‫آخرین نکته اینستکه در هنگام انتخاب شناسه نمی توانید از کلمات کلیدی که برای‬
‫منظورهای خاص در زبان ‪ C‬رزرو شده اند استفاده کنید‪.‬‬

C ‫ شناسه ها در‬7-1
: C ‫کلمات کلیدی در زبان‬
auto

break

case

char

const

continue

default

do

double

else

enum

extern

float

for

goto

if

int

long

register

return

short

signed

sizeof

static

struct

switch

typedef

union

unsigned

void

volatile

while

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫محدوده‬

‫اندازه )بیت(‬

‫توضیح‬

‫نوع داده‬

‫‪-128 to +127‬‬

‫‪8‬‬

‫کاراکتر‬

‫‪char‬‬

‫‪-32768 to +32767‬‬

‫‪16‬‬

‫عدد صحیح‬

‫‪int‬‬

‫‪3.4e-38 to 3.4e+38‬‬

‫‪32‬‬

‫عدد اعشاری‬

‫‪float‬‬

‫‪1.7e-308 to 1.7e+308‬‬

‫‪64‬‬

‫عدد اعشاری با‬
‫دقت مضاعف‬

‫‪double‬‬

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫‪‬‬

‫البته چند نکته مهم درمورد این جدول قابل ذکر است ‪:‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫اندازه ‪ int‬در محیطهای ‪ 16‬بیتی مانند ‪ DOS‬برابر ‪ 16‬بیت است‪ .‬اما در‬
‫محیطهای ‪ 32‬بیتی همانند ‪ Windows‬اندازه آن ‪ 32‬بیت می باشد که در‬
‫اینصورت محدوده ای برابر ‪ -2,147,483,648‬تا ‪ +2,147,483,647‬را‬
‫پوشش می دهد‪.‬‬
‫در بعضی از کامپایلرهای ‪ ،C‬نوع داده ‪ bool‬نیز وجود دارد که می تواند‬
‫یکی از مقادیر ‪)true‬درست( یا ‪) false‬غلط( را نشان دهد ‪ .‬اما در نسخه‬
‫های اولیه ‪ C‬از همان نوع داده صحیح یا ‪ int‬برای اینکار استفاده می‬
‫شد‪ .‬بدین صورت که ‪ 0‬نشاندهنده ‪ false‬و هر عدد غیر صفر )معموال ‪(1‬‬
‫نشاندهنده ‪ true‬است‪.‬‬
‫از آنجا که برای ذخیره سازی کاراکترها کد اسکی آنها ذخیره می گردد‪،‬‬
‫از یک متغیر کاراکتری یا ‪ char‬می توان بعنوان یک عدد صحیح کوچک نیز‬
‫استفاده کرد و اعمال ریاضی برروی آنها نیز مجاز است‪.‬‬

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫عالوه براین چندین اصالح کننده نیز وجود دارد که به ما اجازه می دهد نوع داده مورد‬
‫نظر را با دقت بیشتری برای نیازهای مختلف استفاده نماییم‪.‬‬
‫این اصالح کننده ها عبارتند از ‪short, long, signed, unsigned :‬‬
‫تمام این اصالح کننده ها می توانند به نوع داده ‪ int‬اعمال شوند و اثر آنها بستگی‬
‫به محیط دارد‪.‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫در یک محیط ‪16‬بیتی‪short int ،‬بازهم برابر ‪16‬بیت است ولی ‪ long int‬برابر‪32‬بیت می‬
‫باشد‪.‬‬
‫‪ unsigned int‬باعث می شود که یک عدد ‪ 16‬بیتی بدون عالمت داشته باشیم که بازه‬
‫بین ‪ 0‬تا ‪ 65535‬را پوشش می دهد‪ signed int .‬نیز همانند ‪ int‬معمولی بوده و تفاوتی‬
‫ندارد‪.‬‬
‫ترکیب این اصالح کننده ها نیز ممکن است‪ .‬مثال ‪ unsigned long int‬یک عدد ‪ 32‬بیتی‬
‫بدون عالمت است که بازه ‪ 0‬تا ‪ 4,294,967,295‬را پوشش می دهد‪.‬‬

‫برروی نوع داده ‪ char‬فقط اصالح کننده های ‪ signed‬و ‪ unsigned‬را می توان اعمال‬
‫کرد‪ .‬معموال از اصالح کننده ‪ unsigned‬وقتی استفاده می شود که قصد داشته‬
‫باشیم از ‪ char‬بعنوان یک عدد صحیح مثبت بین ‪ 0‬تا ‪ 255‬استفاده کنیم‪.‬‬
‫برروی نوع داده ‪ double‬تنها اصالح کننده ‪ long‬قابل اعمال است و دراینصورت عدد‬
‫اعشاری با ‪ 80‬بیت را خواهیم داشت که قادر است هر عددی در بازه ‪ 3.4e-4932‬تا‬
‫‪ 1.1e+4932‬را در خود نگاه دارد‪.‬‬

‫‪ 7-3‬تعریف متغیرها‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای تعریف متغیرها به شکل زیر عمل می کنیم‪:‬‬

‫;>‪ ‫که ‪ type‬یکی از نوع داده های گفته شده و ‪ variable-list‬لیستی از متغیرها است‬
‫که با کاما از یکدیگر جدا شده اند‪ .‬بعنوان مثال ‪:‬‬
‫;‪int sum‬‬
‫;‪float average‬‬
‫; ‪long int a, b, c‬‬
‫; ‪unsigned long int i, j, k‬‬
‫عالوه براین می توان در هنگام تعریف متغیر به آن مقدار اولیه نیز داد‪ .‬مثال ‪:‬‬
‫; ‪int d = 0‬‬
‫نكته مهم آنكه زبان ‪ C‬به متغیرها مقدار اولیه نمي دهد )حتي ‪ (0‬و برنامه نويس‬
‫خود بايد اينكار را صريحا انجام دهد‪ ،‬درغیر اينصورت مقدار اولیه متغیر‪ ،‬نامعین خواهد‬
‫بود‪.‬‬
‫تعریف متغیرها طبق اصول زبان ‪ C‬میتواند درهرجایی از برنامه صورت پذیرد‪ ،‬و‬
‫متغیرهای تعریف شده از همان خط به بعد قابل استفاده خواهد بود‪ .‬اما معموال‬
‫توصیه می گردد كه تعریف متغیرها در همان خط ابتدایی تابع و بالفاصله پس از {‬
‫صورت پذیرد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫‪‬‬
‫‪‬‬

‫ثابتها مقادیر ثابتی هستند كه مقدار آنها در حین اجرای برنامه تغییر نمی یابد‪ .‬ثابتها می توانند از‬
‫هریك از نوع داده های اصلی باشند‪.‬‬
‫ثوابت عددی صحیح ‪:‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫برای نمایش این دسته از ثوابت‪ ،‬از دنباله ای از ارقام بعالوه عالمت ‪ +‬یا ‪ -‬استفاده می كنیم‪ .‬بعنوان مثال‬
‫‪ -45‬و یا ‪ 3489‬ثوابت صحیح هستند‪.‬‬
‫در حالت عادی ‪ C‬هر عدد را در كوچكترین نوع داده ای كه می تواند قرار می دهد‪ .‬مثال عدد ‪ 85‬در یك‬
‫‪ int‬قرار می گیرد‪ ،‬اما عدد ‪ 145398‬در یك ‪ long int‬قرار خواهد گرفت‪.‬‬
‫اگر قصد دارید یك عدد كوچك بعنوان ‪ long‬محسوب گردد‪ ،‬می توانید از پسوند ‪ L‬در انتهای آن استفاده‬
‫می كنیم‪ .‬مثال ‪245L‬یك عدد ‪ long‬محسوب می شود‪.‬‬
‫;‪long int a = 20L‬‬
‫پسوند ‪ U‬در انتهای عدد نیز نشانه بدون عالمت بودن آن است‪.‬‬
‫نكته دیگر آنكه ‪ C‬به شما اجازه می دهد درصورت لزوم ثوابت صحیح خود را در مبنای ‪ 8‬یا ‪ 16‬نیز كه‬
‫از مبناهای متداول در برنامه نویسی هستند‪ ،‬بنویسید‪.‬‬
‫‪‬‬
‫‪‬‬

‫برای نوشتن عدد در مبنای ‪ 8‬باید آن را با ‪ 0‬آغاز كنید‪ ،‬مثال ‪ 0342‬یك عدد در منای ‪ 8‬محسوب می‬
‫گردد‪.‬‬
‫برای نوشتن یك عدد در مبنای ‪ 16‬باید آن را با ‪ 0x‬آغاز نمایید‪ ،‬مانند ‪.0x27A4‬‬

‫‪ 7-4‬ثوابت‬
‫ثوابت عددی اعشاری‬

‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫برای نمایش اعداد اعشاری‪ ،‬باید از نقطه اعشار استفاده كنیم‪ ،‬مانند ‪237.45‬‬
‫اما نكته جالب آنستكه می توانید از نماد علمی نیز برای نمایش اعداد‬
‫اعشاری استفاده كنید‪ .‬برای اینكار كافی است از حرف ‪ e‬برای نمایش قسمت‬
‫توان استفاده نمایید‪ .‬بعنوان مثال ‪:‬‬
‫‪-23.47 × 10 5 = -23.47e5‬‬
‫‪42.389 × 10 -3 = 42.389e-3‬‬
‫دقت كنید كه قسمت توان‪ ،‬حتما یك عدد صحیح است‪.‬‬
‫نكته جالب اینجاست كه برخالف مورد قبل‪ ،‬كامپایلر بطور پیش فرض داده های‬
‫اعشاری را از نوع ‪ double‬فرض می كند‪.‬چنانچه دوست دارید ثابت شما ازنوع‬
‫‪ float‬درنظر گرفته شود‪ ،‬در انتهای آن ‪ F‬قرار دهید‪ .‬ضمنا پسوند ‪ L‬نیز داده‬
‫اعشاری را از نوع ‪ long double‬درنظر می گیرد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫ثوابت كاراكتری ‪:‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫برای نشان دادن ثوابت كاراكتری‪ ،‬آنها را در داخل ' قرار می دهیم‪ .‬بعنوان مثال‬
‫'‪'A‬یك ثابت كاراكتری است‪.‬‬
‫; '‪char ch = 'S‬‬
‫دقت كنید كه همانطور كه قبال گفته شد‪ ،‬كد اسكی كاراكترها در متغیر ذخیره‬
‫می گردد‪ ،‬بنابراین می توان از آن بعنوان یك عدد صحیح نیز استفاده كرد‪ .‬نكته‬
‫مهم دیگر آنستكه به تفاوت عدد ‪ 5‬و كاراكتر '‪ '5‬دقت داشته باشید‪ .‬در حقیقت‬
‫'‪ '5‬برابر است با عدد ‪ 53‬كه همان كد اسكی آن است‪.‬‬
‫روش فوق‪ ،‬برای نمایش کاراکترهای قابل چاپ مناسب است‪ ،‬اما بعضی‬
‫كاراكترها مانند ‪ enter‬قابل نمایش نبوده و برای آنها شکل خاصی وجود ندارد‪.‬‬
‫در چنین مواردی‪ ،‬زبان ‪ C‬از ترکیب عالمت \ به همراه یک کاراکتر دیگر‪ ،‬برای‬
‫نمایش این قبیل کاراکترها استفاده می نماید‪ .‬بعنوان مثال‪ ،‬کاراکتر '‪ '\n‬نشان‬
‫دهنده خط جدید یا همان ‪ enter‬می باشد‪.‬‬
‫جدول صفحه بعد این قبیل کاراکترها و معادل آنها را نشان می دهد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫نحوه نمایش در ‪C‬‬

‫کد اسکی‬

‫صدای بوق کامپیوتر‬

‫‪\a‬‬

‫‪7‬‬

‫حرکت به عقب ‪backspace‬‬

‫‪\b‬‬

‫‪8‬‬

‫شروع صفحه ‪form feed‬‬

‫‪\f‬‬

‫‪12‬‬

‫سطر جدید ‪line feed‬‬

‫‪\n‬‬

‫‪10‬‬

‫برگشت به ابتداي سطر ‪carriage return‬‬

‫‪\r‬‬

‫‪13‬‬

‫فاصله افقی ‪horizontal tab‬‬

‫‪\t‬‬

‫‪9‬‬

‫فاصله عمودی ‪vertical tab‬‬

‫‪\v‬‬

‫‪11‬‬

‫عالمت سوال‬

‫?\‬

‫‪63‬‬

‫عالمت '‬

‫'\‬

‫‪39‬‬

‫عالمت "‬

‫"\‬

‫‪34‬‬

‫عالمت \‬

‫\\‬

‫‪92‬‬

‫عالمت تهی‬

‫‪\0‬‬

‫‪0‬‬

‫نام کاراکتر‬

‫کد اسکی یک کاراکتر با ‪ 3‬رقم در مبنای ‪8‬‬

‫‪\000‬‬

‫کد اسکی یک کاراکتر با ‪ 2‬رقم در مبنای ‪16‬‬

‫‪\x00‬‬

‫‪ 7-4‬ثوابت‬
‫‪‬‬

‫ثوابت رشته ای ‪ C :‬عالوه بر ثوابت فوق‪ ،‬از یك ثابت دیگر بنام رشته نیز‬
‫حمایت می كند‪ .‬رشته‪ ،‬دنباله ای از كاراكترها است كه در داخل " قرار‬
‫می گیرند‪ .‬بعنوان مثال "‪ "this is a test‬یك رشته است‪ .‬دقت كنید كه '‪'a‬‬
‫یك كاراكتر است‪ ،‬اما "‪ "a‬یك رشته است كه فقط شامل یك كاراكتر می‬
‫باشد‪.‬‬

‫‪ 7-5‬عملگرها‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫عملگر‪ ،‬نمادی است كه به كامپایلر می گوید تا عملیات محاسباتی یا‬
‫منطقی خاصی را برروی یك یا چند عملوند‪ ،‬انجام دهد‪.‬‬
‫به عملگرهایی كه فقط یك عملوند دارند‪ ،‬عملگر یكانی می گوییم و‬
‫همواره عملگر در سمت چپ عملوند قرار می گیرد)مانند عدد ‪.(-125‬‬
‫اما عملگرهایی كه برروی دو عملوند اثر می كنند را عملگر دودویی‬
‫نامیده و عملگر را بین دو عملوند قرار می دهیم )مانند ‪.(23+86‬‬
‫هر ترکیب درستی از عملگرها و عملوندها را یک عبارت می نامیم‪.‬‬
‫‪ C‬از نقطه نظر عملگرها یك زبان بسیار قوی است‪ .‬این عملگرها به چند‬
‫دسته اصلی تقسیم می گردند كه آنها را به ترتیب بررسی می كنیم‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫این عملگرها‪ ،‬همان اعمال متداول ریاضی هستند كه در زبان ‪ C‬مورد استفاده‬
‫قرار می گیرند‪ .‬این اعمال عبارتند از ‪:‬‬

‫عمل‬

‫نوع‬

‫عملگر‬

‫منفی كردن عملوند سمت راست‬

‫یكانی‬

‫‪-‬‬

‫جمع دو عملوند‬

‫دودویی‬

‫‪+‬‬

‫تفریق دو عملوند‬

‫دودویی‬

‫‪-‬‬

‫ضرب دو عملوند‬

‫دودویی‬

‫*‬

‫تقسیم دو عملوند‬

‫دودویی‬

‫‪/‬‬

‫محاسبه باقیمانده تقسیم دو عملوند‬

‫دودویی‬

‫‪%‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬
‫‪‬‬

‫این عملگرهای برروی همه انواع داده های ‪ C‬عمل می كنند‪ ،‬بجز عملگر ‪ %‬كه فقط‬
‫برروی نوع داده های صحیح عمل می كند‪.‬‬
‫اما نكته مهمی كه باید به آن اشاره كرد‪ ،‬نحوه كار عملگر تقسیم برروی نوع داده های‬
‫مختلف است‪.‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫درصورتیكه هردو عملوند صحیح باشند‪ ،‬تقسیم بصورت صحیح بر صحیح انجام خواهد شد‪.‬‬
‫اگر یكی یا هر دو عملوند اعشاری باشند‪ ،‬تقسیم بصورت اعشاری انجام خواهد پذیرفت‪.‬‬
‫فرض كنید تعاریف زیر را داریم ‪:‬‬
‫; ‪int a,b‬‬
‫; ‪float c,d‬‬
‫; ‪a = 10 ; b = 4‬‬
‫;‪c = 8.2; d = 4.0‬‬
‫اكنون به نتایج عملیات زیر دقت كنید ‪:‬‬
‫‪a / b => 2‬‬
‫‪c / d => 2.05‬‬
‫‪a / d => 2.5‬‬
‫‪a / 4 => 2‬‬
‫چنانچه به آخرین مورد توجه كنید‪ ،‬متوجه می شوید كه از آنجا كه ‪a‬یك متغیر صحیح است و ‪4‬‬
‫نیز یك ثابت صحیح در نظر گرفته شده‪ ،‬درنتیجه تقسیم بصورت صحیح بر صحیح انجام گرفته‬
‫است‪ .‬چنانچه بخواهیم تقسیم بصورت اعشاری صورت پذیرد‪ ،‬به دو شكل می توانیم عمل‬
‫كنیم‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫برای اینکه عبارت تقسیم صفحه قبل بصورت اعشاری انجام شود‪ ،‬به دو روش‬
‫می توان عمل کرد‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫این عبارت را بصورت ‪ a / 4.0‬بنویسیم‪.‬‬
‫از عملگر قالب ریزی استفاده كنیم‪.‬‬

‫عملگر قالب ریزی می تواند یك نوع را به نوع دیگری تبدیل نماید‪ .‬شكل كلی آن‬
‫به شكل زیر است ‪:‬‬
‫>‪() ‫كه ‪ type‬نوع مورد نظر است كه قصد تبدیل عبارت ‪ expression‬به آن نوع را‬
‫داریم‪ .‬بعنوان مثال در مورد قبلی می توان به شكل زیر عمل كرد ‪:‬‬
‫‪(float) a / 4‬‬
‫در این حالت از كامپایلر خواسته ایم كه ابتدا عدد ‪ a‬را به اعشاری تبدیل كند‬
‫)البته بصورت موقت( و سپس آن را بر ‪ 4‬تقسیم نماید‪ ،‬كه مسلما حاصل‬
‫اعشاری خواهد بود‪.‬‬
‫بطوركلی هرگاه ثابتها و متغیرهایی از انواع مختلف در یك عبارت محاسباتی‬
‫داشته باشیم‪ ،‬كامپایلر ‪ C‬همه آنها را به یك نوع یكسان كه همان بزرگترین‬
‫عملوند موجود است تبدیل خواهد كرد‪ .‬بعنوان مثال به مورد صفحه بعد دقت‬
‫كنید ‪:‬‬

‫ عملگرهای محاسباتی‬7-5-1
char ch;
int i;

float f;
double d;
result = (ch / i)
int

+

(f *d)

(f+i)
float

double

double

int

-

double

double

float

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫اولویت عملگرها ‪ :‬در عبارتی که شامل چندین عملگر است‪ ،‬کدامیک در‬
‫ابتدا اعمال خواهد گردید‪.‬‬
‫اولویت عملگرهای محاسباتی از باال به پایین بشرح زیر است‪:‬‬
‫‪ ‬عملگر یکانی –‬
‫‪ ‬عملگرهای * و ‪ /‬و ‪%‬‬
‫‪ ‬عملگرهای ‪ +‬و –‬
‫چنانچه اولویت دو عملگر یکسان باشد‪ ،‬این عملگرها از چپ به راست‬
‫محاسبه خواهند شد‪.‬‬
‫چنانچه بخواهیم یک عمل با اولویت پایین زودتر انجام شود‪ ،‬باید از پرانتز‬
‫استفاده کنیم‪ .‬بنابراین اولویت عملگر پرانتز از همه موارد فوق‬
‫بیشتراست‪ .‬در مورد پرانتزهای متداخل‪ ،‬ابتدا پرانتز داخلی محاسبه‬
‫می شود؛ اما در مورد پرانتزهای هم سطح‪ ،‬ابتدا پرانتز سمت چپتر‬
‫محاسبه می گردد‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫چند مثال در مورد اولویت عملگرها‬

‫ترتیب اجرای عملگرها‬

‫عبارت زبان ‪C‬‬

‫ابتدا عمل * و سپس عمل ‪+‬‬

‫‪b+c*d‬‬

‫ابتدا عمل ‪ +‬و سپس عمل *‬

‫‪(b + c) * d‬‬

‫ابتدا عمل ‪ /‬سپس عمل * و در انتها عمل ‪+‬‬

‫‪b+c/d*e‬‬

‫ابتدا عمل * سپس عمل ‪ /‬و در انتها عمل ‪+‬‬

‫)‪b + c / (d * e‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫یک مثال کامل در مورد اولویت عملگرها‬

‫‪result = a + b * (f – (g + b) / d) – c * (a – d) / e‬‬
‫‪6‬‬

‫‪1‬‬
‫‪7‬‬

‫‪2‬‬

‫‪8‬‬

‫‪3‬‬
‫‪4‬‬
‫‪5‬‬
‫‪9‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫در زبان ‪ C‬برای انتساب چندین عملگر وجود دارد‪ .‬ساده ترین عملگر انتساب‪ ،‬همان عملگر =‬
‫است که در بسیاری از زبانها استفاده می شود‪ .‬بعنوان مثال ‪:‬‬
‫;‪a = 5‬‬
‫;‪b = c + 2 * d‬‬
‫این عملگر باعث می شود که عبارت سمت راست در عبارت سمت چپ قرار گیرد‪.‬‬
‫توجه کنید که مقدار سمت چپ باید عبارتی باشد که بتوان به آن یک مقدار را نسبت داد‬
‫)مانند یک متغیر( که به آن ‪ Lvalue‬گفته می شود‪ ،‬بنابراین یک ثابت نمی تواند در سمت چپ‬
‫قرار گیرد‪.‬‬
‫نکته دیگر اینکه اولویت عملگر = از عملگرهای ریاضی کمتر است و درنتیجه ابتدا آن عملیات‬
‫انجام شده و در پایان حاصل در عبارت سمت چپ ریخته می شود‪.‬‬
‫الزم به ذکر است که در هنگام انتساب‪ ،‬درصورت لزوم نوع عبارت سمت راست به نوع عبارت‬
‫سمت چپ تبدیل می شود‪ .‬مثال‪:‬‬
‫;‪int a‬‬
‫;‪a = 2.5 * 5.0‬‬
‫که دراینصورت عدد ‪ 12‬در ‪ a‬ذخیره خواهد شد‪.‬‬
‫شرکت پذیری این عملگر از راست به چپ می باشد‪ ،‬بدین معنا که چنانچه چندین عملگر‬
‫نسبت دهی داشته باشیم‪ ،‬این عملگرها از راست به چپ محاسبه می شوند‪ .‬مثال پس از‬
‫اجرای دستور زیر‪ ،‬مقدار هر ‪ 3‬متغیر برابر ‪ 10‬خواهد شد‪.‬‬
‫;‪a = b = c = 10‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬

‫نکته جالب درمورد زبان ‪ C‬آنستکه دارای یک سری عملگرهای انتساب‬
‫خالصه شده است که باعث می شوند در بعضی موارد بتوانیم عبارات‬
‫کوتاهتری را بنویسیم‪ .‬این عملگرها عبارتند از ‪:‬‬
‫عملگرد‬

‫مثال‬

‫عبارت انتساب معادل‬

‫‪++‬‬

‫;‪a ++‬‬

‫;‪a = a + 1‬‬

‫‪--‬‬

‫;‪a --‬‬

‫;‪a = a – 1‬‬

‫=‪+‬‬

‫;‪a += 5‬‬

‫;‪a = a + 5‬‬

‫=‪-‬‬

‫;‪a -= 8‬‬

‫;‪a= a – 8‬‬

‫=*‬

‫;‪a *= 10‬‬

‫;‪a= a * 10‬‬

‫=‪/‬‬

‫;‪a /= 2‬‬

‫;‪a = a / 2‬‬

‫=‪%‬‬

‫;‪a %= 10‬‬

‫;‪a = a % 10‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬
‫‪‬‬

‫عملگر اول و دوم‪ ،‬عملگرهای یکانی هستند که بترتیب عملگر افزایش و عملگر کاهش‬
‫نامیده می شوند‪.‬‬
‫نکته جالب آنستکه این دو عملگر به دوصورت مورد استفاده قرار می گیرند‪.‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫در حالتی که از دستور ;‪ a ++‬استفاده شود به آن پس افزایش می گویند و بدین معناست که‬
‫ابتدا از مقدار فعلی ‪ a‬در عبارت موردنظر استفاده کن و سپس آن را افزایش بده‪.‬‬
‫اما دستور ;‪ ++ a‬که به آن پیش افزایش گفته می شود‪ ،‬ابتدا ‪ a‬را افزایش داده و سپس از آن‬
‫در عبارت استفاده می کند‪.‬‬
‫به برنامه زیر دقت کنید‪:‬‬

‫>‪#include ‫{ )(‪void main‬‬
‫; ‪int a ,b‬‬
‫;‪a=5‬‬
‫;‪b = a ++‬‬
‫;)‪printf(“a=%d and b=%d \n”,a,b‬‬
‫;‪a=5‬‬
‫;‪b = ++ a‬‬
‫;)‪printf(“a=%d and b=%d \n”,a,b‬‬
‫}‬
‫‪a=6 b=5‬‬
‫‪a=6 b=6‬‬

‫‪ 7-5-3‬عملگرهای مقایسه ای‬
‫‪‬‬

‫‪‬‬

‫این عملگرها دو عبارت را بایکدیگر مقایسه کرده و نتیجه را باز می گردانند‪.‬‬
‫نتیجه می تواند درست )‪ (true‬یا غلط )‪ (false‬باشد‪.‬‬
‫نتیجه این عملگرها یک عدد صحیح است که درصورت درست بودن ‪ 1‬و‬
‫درصورت غلط بودن ‪ 0‬باز می گردانند‪ .‬این عملگرها عبارتند از‪:‬‬
‫عملگر‬

‫مفهوم عملگر‬

‫مثال‬

‫<‬

‫بزرگتر )<(‬

‫‪a>b‬‬

‫>‬

‫کوچکتر )>(‬

‫‪a
‫=<‬

‫بزرگتر یا مساوی )≤(‬

‫‪a >= b‬‬

‫=>‬

‫کوچکتر یا مساوی )≥(‬

‫‪a <= b‬‬

‫==‬

‫مساوی )=(‬

‫‪a == b‬‬

‫=!‬

‫نامساوی )≠(‬

‫‪a != b‬‬

‫‪ 7-5-3‬عملگرهای مقایسه ای‬
‫‪‬‬

‫‪‬‬

‫نکته مهمی که باید به آن دقت کرد عملگر مساوی )==( است‪ ،‬چرا که یک‬
‫اشتباه بسیار متداول برنامه نویسان ‪ C‬استفاده اشتباه از عملگر انتساب‬
‫)=( بجای عملگر تساوی )==( است که باعث ایجاد خطا در برنامه می‬
‫شود‪.‬‬
‫اولویت این عملگرها از باال به پایین بشرح زیر است‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫عملگرهای <‪ <= ، > ،‬و =>‬
‫عملگرهای == و =!‬

‫الزم بذکر است که در هنگام مساوی بودن اولویت چند عملگر‪ ،‬این عملگرها‬
‫از چپ به راست محاسبه می گردند‪.‬‬

‫‪ 7-5-4‬عملگرهای منطقی‬
‫‪‬‬

‫این عملگرها به شما اجازه می دهند که شرطهای ساده ای را که با‬
‫استفاده از عملگرهای مقایسه ای ایجاد شده اند را با یکدیگر ترکیب نموده‬
‫و شرطهای پیچیده تری را بسازید‪ .‬این عملگرها عبارتند از ‪:‬‬
‫مثال‬

‫عملگر‬

‫مفهوم عملگر‬

‫نحوه کار‬

‫&&‬

‫‪ AND‬منطقی‬

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

‫‪a>0 && sw==1‬‬

‫||‬

‫‪ OR‬منطقی‬

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

‫‪a<=100 || b!=0‬‬

‫!‬

‫‪ NOT‬منطقی‬

‫اگر عملوند درست باشد‪ ،‬نادرست و‬
‫اگر نادرست باشد‪ ،‬درست برمی‬
‫گرداند‪.‬‬

‫)‪! (a==1 || b<10‬‬

‫‪ 7-5-5‬عملگر شرطی‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫گاهی الزم است که ابتدا یک شرط بررسی شده و سپس برمبنای نتیجه )درست یا نادرست بودن آن( یکی‬
‫از دو عبارت ممکن بازگردانده شود‪ .‬برای اینکار می توان از یک عملگر ‪3‬تایی )با ‪ 3‬عملوند( بنام عملگر‬
‫شرطی استفاده نمود‪.‬‬
‫شکل کلی این عملگر بصورت زیر است‪:‬‬
‫>عبارت‪> :<2‬عبارت‪> ?<1‬شرط<‬
‫نحوه کار بدینصورت است که درصورت درست بودن شرط‪ ،‬عبارت‪ 1‬و در غیراینصورت عبارت ‪ 2‬بازگردانده می‬
‫شود‪.‬‬
‫به عنوان مثال به دستور زیر توجه کنید‪:‬‬
‫که این عبارت معادل دستور زیر است‪:‬‬

‫‪‬‬

‫;‪a = (k<10) ? 100 : 50‬‬
‫;‪if (k<10) a=100‬‬
‫;‪else a=50‬‬

‫البته این عبارت به شکلهای پیچیده نیز می تواند مورد استفاده قرار گیرد‪ .‬مثال ‪:‬‬
‫;‪c += (a>0 && a<10) ? ++a : a/b‬‬
‫که معادل است با ‪:‬‬
‫{ )‪if (a>0 && a<10‬‬
‫;‪a= a + 1‬‬
‫;‪c = c + a‬‬
‫}‬
‫;‪else c = c + a/b‬‬

‫‪ 7-5-6‬اولویت عملگرها‬
‫عملگر‬

‫اولویت‬

‫شرکت پذیری‬

‫‪1‬‬

‫)(‬

‫از چپ به راست‬

‫‪2‬‬

‫‪- + ! -- ++‬‬

‫از راست به چپ‬

‫‪3‬‬

‫‪* / %‬‬

‫از چپ به راست‬

‫‪4‬‬

‫‪+ -‬‬

‫از چپ به راست‬

‫‪5‬‬

‫>> <<‬

‫از چپ به راست‬

‫‪6‬‬

‫>= > <= <‬

‫از چپ به راست‬

‫‪7‬‬

‫=! ==‬

‫از چپ به راست‬

‫‪8‬‬

‫&&‬

‫از چپ به راست‬

‫‪9‬‬

‫||‬

‫از چپ به راست‬

‫‪10‬‬

‫‪?:‬‬

‫از راست به چپ‬

‫‪11‬‬

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

‫از راست به چپ‬

‫‪12‬‬

‫‪,‬‬

‫از چپ به راست‬

‫‪ 7-6‬خواندن و نمایش اطالعات‬
‫‪‬‬

‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫همانطور كه قبال نیز گفته شد‪ ،‬یكی از اهداف زبان ‪ C‬قابل حمل بودن آن‬
‫است‪ .‬بهمین منظور سعی شده است كه از دستوراتی كه ممكن است‬
‫وابسته به ماشین خاصی باشد‪ ،‬اجتناب گردد‪.‬‬
‫بهمین دلیل زبان ‪ C‬برخالف سایر زبانها دارای هیچ دستوری برای‬
‫خواندن از ورودی و یا نوشتن در خروجی نیست‪.‬‬
‫اما در عوض دارای تعدادی تابع )زیربرنامه( استاندارد می باشد كه تقریبا‬
‫تمامی كامپایلرها از آنها حمایت می كنند‪.‬‬
‫این كار به كامپایلر این امكان را می دهد كه بر حسب نوع سخت افزار‬
‫موردنظر‪ ،‬توابع ورودی و خروجی را طراحی نماید‪.‬‬
‫این توابع در یك فایل سرآمد بنام ‪ stdio.h‬تعریف شده اند و بنابراین قبل‬
‫ازاینكه بتوانید از این توابع استفاده نمایید‪ ،‬باید این فایل را نیز با استفاده‬
‫از ‪ #include‬در برنامه خود بگنجانید‪.‬‬

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫برای نمایش اطالعات در خروجی از تابع ‪ printf‬استفاده می شود‪.‬‬
‫این تابع رشته موردنظر شما را به خروجی استاندارد )كه در حالت‬
‫عادی همان صفحه نمایش یا مانیتور است( می فرستد‪ .‬شكل كلی این‬
‫تابع بصورت زیر است‪:‬‬
‫; )>لیست متغیرها< ‪> ,‬رشته كنترلی<(‪printf‬‬
‫رشته كنترلی همان متنی است كه قصد چاپ آن را داریم‪ ،‬با ذكر این‬
‫نكته كه در قسمتهایی كه باید مقدار یك متغیر چاپ شود‪ ،‬از یك‬
‫مشخصه تبدیل استفاده می شود‪ .‬هر مشخصه تبدیل از یك عالمت ‪%‬‬
‫بعالوه یك كاراكتر كه نوع متغیر مورد نظر را نشان می دهد تشكیل می‬
‫گردد‪.‬‬
‫لیست متغیرها نیز همان متغیرهایی هستند كه قصد چاپ آنها را داریم‪.‬‬
‫این متغیرها باید بترتیب قرار گرفته و با كاما )‪ (,‬از یكدیگر جدا شوند‪.‬‬

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫مشخصه تبدیل‬

‫مفهوم‬

‫‪%c‬‬

‫كاراكتر‬

‫‪%d‬‬

‫عدد صحیح در مبنای ‪10‬‬

‫‪%f‬‬

‫عدد اعشاری بدون نماد علمی‬

‫‪%e‬‬

‫عدد اعشاری با نماد علمی‬

‫‪%g‬‬

‫عدد اعشاری با حالت كوتاهتر بین ‪ e‬و ‪f‬‬

‫‪%s‬‬

‫رشته‬

‫‪%ld‬‬

‫عدد صحیح بزرگ‬

‫‪%lf %le %lg‬‬

‫عدد اعشاری بزرگ‬

‫‪%o‬‬

‫عدد صحیح در مبنای ‪8‬‬

‫‪%x‬‬

‫عدد صحیحی در مبنای ‪16‬‬

‫‪%u‬‬

‫عدد صحیح بدون عالمت‬

‫ تابع نمایش در خروجی‬7-6-1
#include
void main() {
int age = 20;
floate average = 18.23;
printf("You are %d years old and your average is %f \n",age,average);
}
You are 20 years old and your average is 18.230000

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫‪‬‬
‫‪‬‬

‫برای کنترل نحوه چاپ اعداد می توانید از مشخصه طول میدان استفاده‬
‫کنید‪.‬‬
‫مشخصه طول میدان برای اعداد به شكل زیر استفاده می شود‪:‬‬
‫‪ ‬برای اعداد صحیح از ‪ %nd‬استفاده می كنیم كه ‪ n‬تعداد ارقام را نشان‬
‫می دهد )مثال ‪ .(%3d‬در اینصورت برای هر متغیر ‪ n‬رقم درنظر گرفته‬
‫می شود‪ .‬اگر اندازه عدد از ‪ n‬كوچكتر باشد‪ ،‬به سمت چپ آن فضای‬
‫خالی اضافه می شود و اگر اندازه عدد بیش از ‪ n‬رقم باشد‪ ،‬طول میدان‬
‫نادیده گرفته شده و عدد بطور كامل چاپ می شود‪.‬‬
‫‪ ‬برای اعداد اعشاری از ‪ %n.mf‬استفاده می كنیم كه ‪ n‬اندازه كل عدد‬
‫)شامل عالمت ممیز( و ‪ m‬تعداد ارقام اعشار است )مثال ‪ .(%5.2f‬در‬
‫صورتیكه تعداد ارقام اعشاری عدد موردنظر از ‪ m‬بیشتر باشد‪ ،‬عدد به ‪m‬‬
‫عدد اعشار گرد می شود و در صورتیكه از ‪ m‬كمتر باشد‪ ،‬در سمت‬
‫راست آن ‪ 0‬قرار داده می شود‪.‬‬

‫‪ 7-6-2‬تابع خواندن از ورودی‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای خواندن اطالعات از ورودی از تابع ‪ scanf‬استفاده می شود‪.‬‬
‫این تابع اطالعات را ازورودی استاندارد )معموال صفحه كلید( خوانده و در‬
‫متغیرهای تعیین شده قرار می دهد‪.‬‬
‫شكل كلی این تابع بصورت زیر است‪:‬‬
‫; )>لیست آدرسهای متغیرها< ‪> ,‬رشته كنترلی<(‪scanf‬‬
‫همانطور كه می بینید نحوه احضار تابع ‪ scanf‬نیز مشابه ‪ printf‬است‪ .‬تنها‬
‫تفاوت در آن است كه در ‪ scanf‬باید لیست آدرسهای متغیرها ارسال شود‪.‬‬
‫مبحث مربوط به آدرسها در فصول بعدی بررسی خواهد شد ولی در حال حاضر‬
‫بخاطر بسپارید كه برای بدست آوردن آدرس یك متغیر از عالمت & استفاده می‬
‫كنیم‪ .‬بعنوان مثال ‪ &age‬بمعنای آدرس متغیر ‪ age‬است‪.‬‬
‫بطور كلی در ‪ C‬قدیمی هرگاه كه یك تابع دارای پارامترهای خروجی بود )یعنی‬
‫پارامترهایی كه یك مقدار را باز می گرداندند( از آدرس متغیرها استفاده می‬
‫شد كه امروزه این مسئله وجود ندارد‪.‬‬

‫ تابع خواندن از ورودی‬7-6-2
#include
void main() {
int age;
float average ;
printf("Please enter your age and average : ");
scanf("%d %f",&age,&average);
printf("You are %d years old and your average is %5.2f \n",age,average);
}

Please enter your age and average : 19 16.72
You are 19 years old and your average is 16.72

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫زبان ‪ C++‬یک زبان شی گرا است‪ ،‬بهمین دلیل در این زبان برای ورودی‬
‫و خروجی از اشیاء بجای توابع استفاده می گردد‪.‬‬
‫از آنجا که امروزه معموال برنامه نویسان ‪ C‬از کامپایلرهای ‪ C++‬استفاده‬
‫می کنند‪ ،‬می توانند از اشیای ورودی و خروجی آن نیز استفاده کنند‪.‬‬
‫اینکار در بین بسیاری از برنامه نویسان ‪ C‬متداول است‪ ،‬بهمین دلیل ما‬
‫در اینجا نحوه کار با اشیای خواندن و نوشتن در ‪ C++‬را بطور مقدماتی‬
‫توضیح می دهیم؛ گرچه توضیح کامل این موارد نیاز به آشنایی با شی‬
‫گرایی و زبان ‪ C++‬دارد‪.‬‬
‫قبل از هرچیز الزم به ذکر است که کلیه اشیای مربوط به ورودی و‬
‫خروجی در فایل سرآمدی بنام ‪ iostream.h‬تعیریف شده اند‪ ،‬بنابراین‬
‫ابتدا باید این فایل به برنامه توسط دستور ‪ #include‬الحاق گردد‪.‬‬

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫زبان ‪ C++‬برای نمایش اطالعات از یک شیئ بنام ‪ cout‬استفاده می نماید‪.‬‬
‫برای ارسال اطالعات مورد نظر برای چاپ به ‪ cout‬باید از عملگر درج در جریان‬
‫یا >> استفاده نماییم‪ .‬بعنوان مثال ‪:‬‬
‫; ” ‪cout >> “Please enter your name:‬‬
‫و یا مثال دیگر ‪:‬‬
‫;‪int a = 10‬‬
‫;‪float b = 2.86‬‬
‫;‪cout << a‬‬
‫;‪cout << b‬‬
‫نکته جالبی که در این مثالها دیده می شود‪ ،‬آنستکه برخالف تابع ‪ printf‬هیچ‬
‫نیازی به مشخص کردن نوع متغیری که قصد چاپ آن را داریم نیست و خود‬
‫شئ ‪ cout‬نوع آن را تشخیص می دهد‪.‬‬
‫عالوه براین می توان چندین عملگر درج در جریان را با یکدیگر الحاق کرد و‬
‫چندین متغیر را با یک دستور چاپ کرد‪.‬‬

C++ ‫ ورودی و خروجی اطالعات در‬7-6-3
#include
void main() {
int age = 20;
floate average = 18.23;
cout >> “You are ” >> age >> “ years old and your average is ” >> average ;
}

You are 20 years old and your average is 18.230000

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای دریافت اطالعات از کاربر‪ ،‬از شئ دیگری بنام ‪ cin‬استفاده می شود‪.‬‬
‫برای ارسال متغیر مورد نظر به ‪ cin‬باید از عملگر استخراج از جریان یا <<‬
‫استفاده نماییم‪ .‬بعنوان مثال‪:‬‬
‫;‪int a‬‬
‫;‪cin >> a‬‬
‫بازهم همانطور که می بینید نیازی به تعیین نوع متغیر موردنظر نیست و خود‬
‫شئ ‪ cin‬نوع متغیر را بطور اتوماتیک تشخیص داده و داده ای از همان نوع را از‬
‫کاربر دریافت و در متغیر مورد نظر قرار می دهد‪.‬‬
‫عملگرهای استخراج از جریان را نیز می توان با یکدیگر الحاق کرد‪.‬‬
‫برای رفتن به خط بعد در شئ ‪ cout‬می توان از دستکاری کننده ‪ endl‬استفاده‬
‫کرد‪ .‬مثال در دستور زیر پس از چاپ پیغام‪ ،‬مکان نما به خط بعد منتقل می‬
‫شود‪:‬‬
‫;‪cout >> “List of students : “ >> endl‬‬
‫البته دستکاری کننده های متعدد دیگری نیز ازجمله موارد مربوط به تعیین طول‬
‫میدان و نحوه چاپ مقادیر وجود دارد که توضیح آنها نیاز به یک مبحث مستقل‬
‫دارد‪.‬‬

C++ ‫ ورودی و خروجی اطالعات در‬7-6-3
#include
void main() {
int age;
float average ;
cout << "Please enter your age and average : " ;
cin >> age >> average ;
cout << "You are " << age << "years old and your average is " << average;
}

Please enter your age and average : 19 16.72
You are 19 years old and your average is 16.72

‫‪ 7-7‬توابع کتابخانه ای‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫همانطور که قبال نیز گفته شد‪ ،‬زبان ‪ C‬از زیر برنامه ها نیز حمایت می کند‪ .‬هر زیر برنامه‬
‫در ‪ C‬یک تابع نامیده می شود‪ .‬تا کنون با توابعی همچون ‪ main‬و یا ‪ printf‬و ‪ scanf‬آشنا‬
‫شده ایم‪.‬‬
‫معموال عرضه کنندگان کامپایلرها و یا سایر فروشندگان نرم افزار‪ ،‬برخی از توابع عمومی‬
‫را که ممکن است مورد نیاز جمع کثیری از برنامه نویسان مختلف باشد را در قالب‬
‫کتابخانه ای از توابع در اختیار برنامه نویسان می گذارند‪ .‬بعضی از این توابع کتابخانه ای‬
‫مانند ‪ printf‬و ‪ scanf‬بصورت استاندارد درآمده و توسط عرضه کنندگان مختلف ارائه می‬
‫شوند‪.‬‬
‫در کامپایلر عرضه شده توسط شرکت بورلند )‪ (Borland C++ 3.1‬نیز کتابخانه های‬
‫متعددی از توابع برای شما عرضه شده اند که بتدریج با آنها و کاربردشان آشنا خواهید‬
‫شد‪.‬‬
‫نکته مهم آنستکه برای استفاده از این توابع ابتدا باید فایل سرآمد مربوط به آنها را نیز در‬
‫ابتدای برنامه خود اضافه نمایید ) با استفاده از ‪ .(#include‬هر فایل سرآمد شامل تعاریف‬
‫اولیه گروهی از توابع مرتبط با هم و داده های مربوط به آنها بوده و در استاندارد قدیمی‬
‫تر دارای پسوند ‪ .h‬می باشد)در استاندارد جدید پسوند این فایلها حذف شده است(‪.‬‬
‫برخی از این فایلهای سرآمد عبارتند از‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪ : stdio.h‬توابع ورودی و خروجی استاندارد‬
‫‪ : math.h‬توابع ریاضی‬
‫‪ : graphics.h‬توابع مربوط به عملیات گرافیکی‬
‫‪ : string.h‬توابع مربوط به کار با رشته ها‬


Slide 22

‫مبانی کامپیوتر و برنامه سازی‬
‫فصل هفتم ‪ :‬مفاهیم اولیه زبان ‪C‬‬
‫مدرس ‪ :‬نگین معروفی‬

‫‪ 7-1‬شناسه ها در ‪C‬‬
‫‪‬‬
‫‪‬‬

‫شناسه )‪ (identifier‬نامی است که به یک قسمت از برنامه مانند متغیر‪ ،‬تابع‪ ،‬ثابت و یا‬
‫‪ ...‬داده می شود‪.‬‬
‫در زبان ‪ C‬برای انتخاب شناسه ها فقط می توان از عالئم زیر استفاده کرد‪:‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫حروف انگلیسی کوچک و بزرگ )‪(A…Z a…z‬‬
‫ارقام )‪(0…9‬‬
‫عالمت خط پایین یا _‬

‫البته یک شناسه نمی تواند با یک رقم شروع شود‪.‬‬
‫چند شناسه مجاز‪ name2 ، average ، sum :‬و ‪student_average‬‬
‫چند شناسه غیرمجاز ‪ 2name‬و یا ‪student average‬‬
‫در برنامه نویسی امروزی پیشنهاد می شود بجای شناسه هایی همانند‬
‫‪ student_average‬از ‪ studentAverage‬استفاده گردد‪.‬‬
‫نکته مهم دیگری که باید به آن اشاره کرد آنستکه زبان ‪ C‬برخالف بسیاری از زبانهای دیگر‬
‫به کوچک و بزرگی حروف حساس است )‪ .(case sensitive‬در نتیجه شناسه های زیر با‬
‫یکدیگر متفاوتند ‪:‬‬
‫‪Sum ≠ sum ≠ SUM‬‬
‫آخرین نکته اینستکه در هنگام انتخاب شناسه نمی توانید از کلمات کلیدی که برای‬
‫منظورهای خاص در زبان ‪ C‬رزرو شده اند استفاده کنید‪.‬‬

C ‫ شناسه ها در‬7-1
: C ‫کلمات کلیدی در زبان‬
auto

break

case

char

const

continue

default

do

double

else

enum

extern

float

for

goto

if

int

long

register

return

short

signed

sizeof

static

struct

switch

typedef

union

unsigned

void

volatile

while

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫محدوده‬

‫اندازه )بیت(‬

‫توضیح‬

‫نوع داده‬

‫‪-128 to +127‬‬

‫‪8‬‬

‫کاراکتر‬

‫‪char‬‬

‫‪-32768 to +32767‬‬

‫‪16‬‬

‫عدد صحیح‬

‫‪int‬‬

‫‪3.4e-38 to 3.4e+38‬‬

‫‪32‬‬

‫عدد اعشاری‬

‫‪float‬‬

‫‪1.7e-308 to 1.7e+308‬‬

‫‪64‬‬

‫عدد اعشاری با‬
‫دقت مضاعف‬

‫‪double‬‬

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫‪‬‬

‫البته چند نکته مهم درمورد این جدول قابل ذکر است ‪:‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫اندازه ‪ int‬در محیطهای ‪ 16‬بیتی مانند ‪ DOS‬برابر ‪ 16‬بیت است‪ .‬اما در‬
‫محیطهای ‪ 32‬بیتی همانند ‪ Windows‬اندازه آن ‪ 32‬بیت می باشد که در‬
‫اینصورت محدوده ای برابر ‪ -2,147,483,648‬تا ‪ +2,147,483,647‬را‬
‫پوشش می دهد‪.‬‬
‫در بعضی از کامپایلرهای ‪ ،C‬نوع داده ‪ bool‬نیز وجود دارد که می تواند‬
‫یکی از مقادیر ‪)true‬درست( یا ‪) false‬غلط( را نشان دهد ‪ .‬اما در نسخه‬
‫های اولیه ‪ C‬از همان نوع داده صحیح یا ‪ int‬برای اینکار استفاده می‬
‫شد‪ .‬بدین صورت که ‪ 0‬نشاندهنده ‪ false‬و هر عدد غیر صفر )معموال ‪(1‬‬
‫نشاندهنده ‪ true‬است‪.‬‬
‫از آنجا که برای ذخیره سازی کاراکترها کد اسکی آنها ذخیره می گردد‪،‬‬
‫از یک متغیر کاراکتری یا ‪ char‬می توان بعنوان یک عدد صحیح کوچک نیز‬
‫استفاده کرد و اعمال ریاضی برروی آنها نیز مجاز است‪.‬‬

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫عالوه براین چندین اصالح کننده نیز وجود دارد که به ما اجازه می دهد نوع داده مورد‬
‫نظر را با دقت بیشتری برای نیازهای مختلف استفاده نماییم‪.‬‬
‫این اصالح کننده ها عبارتند از ‪short, long, signed, unsigned :‬‬
‫تمام این اصالح کننده ها می توانند به نوع داده ‪ int‬اعمال شوند و اثر آنها بستگی‬
‫به محیط دارد‪.‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫در یک محیط ‪16‬بیتی‪short int ،‬بازهم برابر ‪16‬بیت است ولی ‪ long int‬برابر‪32‬بیت می‬
‫باشد‪.‬‬
‫‪ unsigned int‬باعث می شود که یک عدد ‪ 16‬بیتی بدون عالمت داشته باشیم که بازه‬
‫بین ‪ 0‬تا ‪ 65535‬را پوشش می دهد‪ signed int .‬نیز همانند ‪ int‬معمولی بوده و تفاوتی‬
‫ندارد‪.‬‬
‫ترکیب این اصالح کننده ها نیز ممکن است‪ .‬مثال ‪ unsigned long int‬یک عدد ‪ 32‬بیتی‬
‫بدون عالمت است که بازه ‪ 0‬تا ‪ 4,294,967,295‬را پوشش می دهد‪.‬‬

‫برروی نوع داده ‪ char‬فقط اصالح کننده های ‪ signed‬و ‪ unsigned‬را می توان اعمال‬
‫کرد‪ .‬معموال از اصالح کننده ‪ unsigned‬وقتی استفاده می شود که قصد داشته‬
‫باشیم از ‪ char‬بعنوان یک عدد صحیح مثبت بین ‪ 0‬تا ‪ 255‬استفاده کنیم‪.‬‬
‫برروی نوع داده ‪ double‬تنها اصالح کننده ‪ long‬قابل اعمال است و دراینصورت عدد‬
‫اعشاری با ‪ 80‬بیت را خواهیم داشت که قادر است هر عددی در بازه ‪ 3.4e-4932‬تا‬
‫‪ 1.1e+4932‬را در خود نگاه دارد‪.‬‬

‫‪ 7-3‬تعریف متغیرها‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای تعریف متغیرها به شکل زیر عمل می کنیم‪:‬‬

‫;>‪ ‫که ‪ type‬یکی از نوع داده های گفته شده و ‪ variable-list‬لیستی از متغیرها است‬
‫که با کاما از یکدیگر جدا شده اند‪ .‬بعنوان مثال ‪:‬‬
‫;‪int sum‬‬
‫;‪float average‬‬
‫; ‪long int a, b, c‬‬
‫; ‪unsigned long int i, j, k‬‬
‫عالوه براین می توان در هنگام تعریف متغیر به آن مقدار اولیه نیز داد‪ .‬مثال ‪:‬‬
‫; ‪int d = 0‬‬
‫نكته مهم آنكه زبان ‪ C‬به متغیرها مقدار اولیه نمي دهد )حتي ‪ (0‬و برنامه نويس‬
‫خود بايد اينكار را صريحا انجام دهد‪ ،‬درغیر اينصورت مقدار اولیه متغیر‪ ،‬نامعین خواهد‬
‫بود‪.‬‬
‫تعریف متغیرها طبق اصول زبان ‪ C‬میتواند درهرجایی از برنامه صورت پذیرد‪ ،‬و‬
‫متغیرهای تعریف شده از همان خط به بعد قابل استفاده خواهد بود‪ .‬اما معموال‬
‫توصیه می گردد كه تعریف متغیرها در همان خط ابتدایی تابع و بالفاصله پس از {‬
‫صورت پذیرد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫‪‬‬
‫‪‬‬

‫ثابتها مقادیر ثابتی هستند كه مقدار آنها در حین اجرای برنامه تغییر نمی یابد‪ .‬ثابتها می توانند از‬
‫هریك از نوع داده های اصلی باشند‪.‬‬
‫ثوابت عددی صحیح ‪:‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫برای نمایش این دسته از ثوابت‪ ،‬از دنباله ای از ارقام بعالوه عالمت ‪ +‬یا ‪ -‬استفاده می كنیم‪ .‬بعنوان مثال‬
‫‪ -45‬و یا ‪ 3489‬ثوابت صحیح هستند‪.‬‬
‫در حالت عادی ‪ C‬هر عدد را در كوچكترین نوع داده ای كه می تواند قرار می دهد‪ .‬مثال عدد ‪ 85‬در یك‬
‫‪ int‬قرار می گیرد‪ ،‬اما عدد ‪ 145398‬در یك ‪ long int‬قرار خواهد گرفت‪.‬‬
‫اگر قصد دارید یك عدد كوچك بعنوان ‪ long‬محسوب گردد‪ ،‬می توانید از پسوند ‪ L‬در انتهای آن استفاده‬
‫می كنیم‪ .‬مثال ‪245L‬یك عدد ‪ long‬محسوب می شود‪.‬‬
‫;‪long int a = 20L‬‬
‫پسوند ‪ U‬در انتهای عدد نیز نشانه بدون عالمت بودن آن است‪.‬‬
‫نكته دیگر آنكه ‪ C‬به شما اجازه می دهد درصورت لزوم ثوابت صحیح خود را در مبنای ‪ 8‬یا ‪ 16‬نیز كه‬
‫از مبناهای متداول در برنامه نویسی هستند‪ ،‬بنویسید‪.‬‬
‫‪‬‬
‫‪‬‬

‫برای نوشتن عدد در مبنای ‪ 8‬باید آن را با ‪ 0‬آغاز كنید‪ ،‬مثال ‪ 0342‬یك عدد در منای ‪ 8‬محسوب می‬
‫گردد‪.‬‬
‫برای نوشتن یك عدد در مبنای ‪ 16‬باید آن را با ‪ 0x‬آغاز نمایید‪ ،‬مانند ‪.0x27A4‬‬

‫‪ 7-4‬ثوابت‬
‫ثوابت عددی اعشاری‬

‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫برای نمایش اعداد اعشاری‪ ،‬باید از نقطه اعشار استفاده كنیم‪ ،‬مانند ‪237.45‬‬
‫اما نكته جالب آنستكه می توانید از نماد علمی نیز برای نمایش اعداد‬
‫اعشاری استفاده كنید‪ .‬برای اینكار كافی است از حرف ‪ e‬برای نمایش قسمت‬
‫توان استفاده نمایید‪ .‬بعنوان مثال ‪:‬‬
‫‪-23.47 × 10 5 = -23.47e5‬‬
‫‪42.389 × 10 -3 = 42.389e-3‬‬
‫دقت كنید كه قسمت توان‪ ،‬حتما یك عدد صحیح است‪.‬‬
‫نكته جالب اینجاست كه برخالف مورد قبل‪ ،‬كامپایلر بطور پیش فرض داده های‬
‫اعشاری را از نوع ‪ double‬فرض می كند‪.‬چنانچه دوست دارید ثابت شما ازنوع‬
‫‪ float‬درنظر گرفته شود‪ ،‬در انتهای آن ‪ F‬قرار دهید‪ .‬ضمنا پسوند ‪ L‬نیز داده‬
‫اعشاری را از نوع ‪ long double‬درنظر می گیرد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫ثوابت كاراكتری ‪:‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫برای نشان دادن ثوابت كاراكتری‪ ،‬آنها را در داخل ' قرار می دهیم‪ .‬بعنوان مثال‬
‫'‪'A‬یك ثابت كاراكتری است‪.‬‬
‫; '‪char ch = 'S‬‬
‫دقت كنید كه همانطور كه قبال گفته شد‪ ،‬كد اسكی كاراكترها در متغیر ذخیره‬
‫می گردد‪ ،‬بنابراین می توان از آن بعنوان یك عدد صحیح نیز استفاده كرد‪ .‬نكته‬
‫مهم دیگر آنستكه به تفاوت عدد ‪ 5‬و كاراكتر '‪ '5‬دقت داشته باشید‪ .‬در حقیقت‬
‫'‪ '5‬برابر است با عدد ‪ 53‬كه همان كد اسكی آن است‪.‬‬
‫روش فوق‪ ،‬برای نمایش کاراکترهای قابل چاپ مناسب است‪ ،‬اما بعضی‬
‫كاراكترها مانند ‪ enter‬قابل نمایش نبوده و برای آنها شکل خاصی وجود ندارد‪.‬‬
‫در چنین مواردی‪ ،‬زبان ‪ C‬از ترکیب عالمت \ به همراه یک کاراکتر دیگر‪ ،‬برای‬
‫نمایش این قبیل کاراکترها استفاده می نماید‪ .‬بعنوان مثال‪ ،‬کاراکتر '‪ '\n‬نشان‬
‫دهنده خط جدید یا همان ‪ enter‬می باشد‪.‬‬
‫جدول صفحه بعد این قبیل کاراکترها و معادل آنها را نشان می دهد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫نحوه نمایش در ‪C‬‬

‫کد اسکی‬

‫صدای بوق کامپیوتر‬

‫‪\a‬‬

‫‪7‬‬

‫حرکت به عقب ‪backspace‬‬

‫‪\b‬‬

‫‪8‬‬

‫شروع صفحه ‪form feed‬‬

‫‪\f‬‬

‫‪12‬‬

‫سطر جدید ‪line feed‬‬

‫‪\n‬‬

‫‪10‬‬

‫برگشت به ابتداي سطر ‪carriage return‬‬

‫‪\r‬‬

‫‪13‬‬

‫فاصله افقی ‪horizontal tab‬‬

‫‪\t‬‬

‫‪9‬‬

‫فاصله عمودی ‪vertical tab‬‬

‫‪\v‬‬

‫‪11‬‬

‫عالمت سوال‬

‫?\‬

‫‪63‬‬

‫عالمت '‬

‫'\‬

‫‪39‬‬

‫عالمت "‬

‫"\‬

‫‪34‬‬

‫عالمت \‬

‫\\‬

‫‪92‬‬

‫عالمت تهی‬

‫‪\0‬‬

‫‪0‬‬

‫نام کاراکتر‬

‫کد اسکی یک کاراکتر با ‪ 3‬رقم در مبنای ‪8‬‬

‫‪\000‬‬

‫کد اسکی یک کاراکتر با ‪ 2‬رقم در مبنای ‪16‬‬

‫‪\x00‬‬

‫‪ 7-4‬ثوابت‬
‫‪‬‬

‫ثوابت رشته ای ‪ C :‬عالوه بر ثوابت فوق‪ ،‬از یك ثابت دیگر بنام رشته نیز‬
‫حمایت می كند‪ .‬رشته‪ ،‬دنباله ای از كاراكترها است كه در داخل " قرار‬
‫می گیرند‪ .‬بعنوان مثال "‪ "this is a test‬یك رشته است‪ .‬دقت كنید كه '‪'a‬‬
‫یك كاراكتر است‪ ،‬اما "‪ "a‬یك رشته است كه فقط شامل یك كاراكتر می‬
‫باشد‪.‬‬

‫‪ 7-5‬عملگرها‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫عملگر‪ ،‬نمادی است كه به كامپایلر می گوید تا عملیات محاسباتی یا‬
‫منطقی خاصی را برروی یك یا چند عملوند‪ ،‬انجام دهد‪.‬‬
‫به عملگرهایی كه فقط یك عملوند دارند‪ ،‬عملگر یكانی می گوییم و‬
‫همواره عملگر در سمت چپ عملوند قرار می گیرد)مانند عدد ‪.(-125‬‬
‫اما عملگرهایی كه برروی دو عملوند اثر می كنند را عملگر دودویی‬
‫نامیده و عملگر را بین دو عملوند قرار می دهیم )مانند ‪.(23+86‬‬
‫هر ترکیب درستی از عملگرها و عملوندها را یک عبارت می نامیم‪.‬‬
‫‪ C‬از نقطه نظر عملگرها یك زبان بسیار قوی است‪ .‬این عملگرها به چند‬
‫دسته اصلی تقسیم می گردند كه آنها را به ترتیب بررسی می كنیم‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫این عملگرها‪ ،‬همان اعمال متداول ریاضی هستند كه در زبان ‪ C‬مورد استفاده‬
‫قرار می گیرند‪ .‬این اعمال عبارتند از ‪:‬‬

‫عمل‬

‫نوع‬

‫عملگر‬

‫منفی كردن عملوند سمت راست‬

‫یكانی‬

‫‪-‬‬

‫جمع دو عملوند‬

‫دودویی‬

‫‪+‬‬

‫تفریق دو عملوند‬

‫دودویی‬

‫‪-‬‬

‫ضرب دو عملوند‬

‫دودویی‬

‫*‬

‫تقسیم دو عملوند‬

‫دودویی‬

‫‪/‬‬

‫محاسبه باقیمانده تقسیم دو عملوند‬

‫دودویی‬

‫‪%‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬
‫‪‬‬

‫این عملگرهای برروی همه انواع داده های ‪ C‬عمل می كنند‪ ،‬بجز عملگر ‪ %‬كه فقط‬
‫برروی نوع داده های صحیح عمل می كند‪.‬‬
‫اما نكته مهمی كه باید به آن اشاره كرد‪ ،‬نحوه كار عملگر تقسیم برروی نوع داده های‬
‫مختلف است‪.‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫درصورتیكه هردو عملوند صحیح باشند‪ ،‬تقسیم بصورت صحیح بر صحیح انجام خواهد شد‪.‬‬
‫اگر یكی یا هر دو عملوند اعشاری باشند‪ ،‬تقسیم بصورت اعشاری انجام خواهد پذیرفت‪.‬‬
‫فرض كنید تعاریف زیر را داریم ‪:‬‬
‫; ‪int a,b‬‬
‫; ‪float c,d‬‬
‫; ‪a = 10 ; b = 4‬‬
‫;‪c = 8.2; d = 4.0‬‬
‫اكنون به نتایج عملیات زیر دقت كنید ‪:‬‬
‫‪a / b => 2‬‬
‫‪c / d => 2.05‬‬
‫‪a / d => 2.5‬‬
‫‪a / 4 => 2‬‬
‫چنانچه به آخرین مورد توجه كنید‪ ،‬متوجه می شوید كه از آنجا كه ‪a‬یك متغیر صحیح است و ‪4‬‬
‫نیز یك ثابت صحیح در نظر گرفته شده‪ ،‬درنتیجه تقسیم بصورت صحیح بر صحیح انجام گرفته‬
‫است‪ .‬چنانچه بخواهیم تقسیم بصورت اعشاری صورت پذیرد‪ ،‬به دو شكل می توانیم عمل‬
‫كنیم‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫برای اینکه عبارت تقسیم صفحه قبل بصورت اعشاری انجام شود‪ ،‬به دو روش‬
‫می توان عمل کرد‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫این عبارت را بصورت ‪ a / 4.0‬بنویسیم‪.‬‬
‫از عملگر قالب ریزی استفاده كنیم‪.‬‬

‫عملگر قالب ریزی می تواند یك نوع را به نوع دیگری تبدیل نماید‪ .‬شكل كلی آن‬
‫به شكل زیر است ‪:‬‬
‫>‪() ‫كه ‪ type‬نوع مورد نظر است كه قصد تبدیل عبارت ‪ expression‬به آن نوع را‬
‫داریم‪ .‬بعنوان مثال در مورد قبلی می توان به شكل زیر عمل كرد ‪:‬‬
‫‪(float) a / 4‬‬
‫در این حالت از كامپایلر خواسته ایم كه ابتدا عدد ‪ a‬را به اعشاری تبدیل كند‬
‫)البته بصورت موقت( و سپس آن را بر ‪ 4‬تقسیم نماید‪ ،‬كه مسلما حاصل‬
‫اعشاری خواهد بود‪.‬‬
‫بطوركلی هرگاه ثابتها و متغیرهایی از انواع مختلف در یك عبارت محاسباتی‬
‫داشته باشیم‪ ،‬كامپایلر ‪ C‬همه آنها را به یك نوع یكسان كه همان بزرگترین‬
‫عملوند موجود است تبدیل خواهد كرد‪ .‬بعنوان مثال به مورد صفحه بعد دقت‬
‫كنید ‪:‬‬

‫ عملگرهای محاسباتی‬7-5-1
char ch;
int i;

float f;
double d;
result = (ch / i)
int

+

(f *d)

(f+i)
float

double

double

int

-

double

double

float

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫اولویت عملگرها ‪ :‬در عبارتی که شامل چندین عملگر است‪ ،‬کدامیک در‬
‫ابتدا اعمال خواهد گردید‪.‬‬
‫اولویت عملگرهای محاسباتی از باال به پایین بشرح زیر است‪:‬‬
‫‪ ‬عملگر یکانی –‬
‫‪ ‬عملگرهای * و ‪ /‬و ‪%‬‬
‫‪ ‬عملگرهای ‪ +‬و –‬
‫چنانچه اولویت دو عملگر یکسان باشد‪ ،‬این عملگرها از چپ به راست‬
‫محاسبه خواهند شد‪.‬‬
‫چنانچه بخواهیم یک عمل با اولویت پایین زودتر انجام شود‪ ،‬باید از پرانتز‬
‫استفاده کنیم‪ .‬بنابراین اولویت عملگر پرانتز از همه موارد فوق‬
‫بیشتراست‪ .‬در مورد پرانتزهای متداخل‪ ،‬ابتدا پرانتز داخلی محاسبه‬
‫می شود؛ اما در مورد پرانتزهای هم سطح‪ ،‬ابتدا پرانتز سمت چپتر‬
‫محاسبه می گردد‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫چند مثال در مورد اولویت عملگرها‬

‫ترتیب اجرای عملگرها‬

‫عبارت زبان ‪C‬‬

‫ابتدا عمل * و سپس عمل ‪+‬‬

‫‪b+c*d‬‬

‫ابتدا عمل ‪ +‬و سپس عمل *‬

‫‪(b + c) * d‬‬

‫ابتدا عمل ‪ /‬سپس عمل * و در انتها عمل ‪+‬‬

‫‪b+c/d*e‬‬

‫ابتدا عمل * سپس عمل ‪ /‬و در انتها عمل ‪+‬‬

‫)‪b + c / (d * e‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫یک مثال کامل در مورد اولویت عملگرها‬

‫‪result = a + b * (f – (g + b) / d) – c * (a – d) / e‬‬
‫‪6‬‬

‫‪1‬‬
‫‪7‬‬

‫‪2‬‬

‫‪8‬‬

‫‪3‬‬
‫‪4‬‬
‫‪5‬‬
‫‪9‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫در زبان ‪ C‬برای انتساب چندین عملگر وجود دارد‪ .‬ساده ترین عملگر انتساب‪ ،‬همان عملگر =‬
‫است که در بسیاری از زبانها استفاده می شود‪ .‬بعنوان مثال ‪:‬‬
‫;‪a = 5‬‬
‫;‪b = c + 2 * d‬‬
‫این عملگر باعث می شود که عبارت سمت راست در عبارت سمت چپ قرار گیرد‪.‬‬
‫توجه کنید که مقدار سمت چپ باید عبارتی باشد که بتوان به آن یک مقدار را نسبت داد‬
‫)مانند یک متغیر( که به آن ‪ Lvalue‬گفته می شود‪ ،‬بنابراین یک ثابت نمی تواند در سمت چپ‬
‫قرار گیرد‪.‬‬
‫نکته دیگر اینکه اولویت عملگر = از عملگرهای ریاضی کمتر است و درنتیجه ابتدا آن عملیات‬
‫انجام شده و در پایان حاصل در عبارت سمت چپ ریخته می شود‪.‬‬
‫الزم به ذکر است که در هنگام انتساب‪ ،‬درصورت لزوم نوع عبارت سمت راست به نوع عبارت‬
‫سمت چپ تبدیل می شود‪ .‬مثال‪:‬‬
‫;‪int a‬‬
‫;‪a = 2.5 * 5.0‬‬
‫که دراینصورت عدد ‪ 12‬در ‪ a‬ذخیره خواهد شد‪.‬‬
‫شرکت پذیری این عملگر از راست به چپ می باشد‪ ،‬بدین معنا که چنانچه چندین عملگر‬
‫نسبت دهی داشته باشیم‪ ،‬این عملگرها از راست به چپ محاسبه می شوند‪ .‬مثال پس از‬
‫اجرای دستور زیر‪ ،‬مقدار هر ‪ 3‬متغیر برابر ‪ 10‬خواهد شد‪.‬‬
‫;‪a = b = c = 10‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬

‫نکته جالب درمورد زبان ‪ C‬آنستکه دارای یک سری عملگرهای انتساب‬
‫خالصه شده است که باعث می شوند در بعضی موارد بتوانیم عبارات‬
‫کوتاهتری را بنویسیم‪ .‬این عملگرها عبارتند از ‪:‬‬
‫عملگرد‬

‫مثال‬

‫عبارت انتساب معادل‬

‫‪++‬‬

‫;‪a ++‬‬

‫;‪a = a + 1‬‬

‫‪--‬‬

‫;‪a --‬‬

‫;‪a = a – 1‬‬

‫=‪+‬‬

‫;‪a += 5‬‬

‫;‪a = a + 5‬‬

‫=‪-‬‬

‫;‪a -= 8‬‬

‫;‪a= a – 8‬‬

‫=*‬

‫;‪a *= 10‬‬

‫;‪a= a * 10‬‬

‫=‪/‬‬

‫;‪a /= 2‬‬

‫;‪a = a / 2‬‬

‫=‪%‬‬

‫;‪a %= 10‬‬

‫;‪a = a % 10‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬
‫‪‬‬

‫عملگر اول و دوم‪ ،‬عملگرهای یکانی هستند که بترتیب عملگر افزایش و عملگر کاهش‬
‫نامیده می شوند‪.‬‬
‫نکته جالب آنستکه این دو عملگر به دوصورت مورد استفاده قرار می گیرند‪.‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫در حالتی که از دستور ;‪ a ++‬استفاده شود به آن پس افزایش می گویند و بدین معناست که‬
‫ابتدا از مقدار فعلی ‪ a‬در عبارت موردنظر استفاده کن و سپس آن را افزایش بده‪.‬‬
‫اما دستور ;‪ ++ a‬که به آن پیش افزایش گفته می شود‪ ،‬ابتدا ‪ a‬را افزایش داده و سپس از آن‬
‫در عبارت استفاده می کند‪.‬‬
‫به برنامه زیر دقت کنید‪:‬‬

‫>‪#include ‫{ )(‪void main‬‬
‫; ‪int a ,b‬‬
‫;‪a=5‬‬
‫;‪b = a ++‬‬
‫;)‪printf(“a=%d and b=%d \n”,a,b‬‬
‫;‪a=5‬‬
‫;‪b = ++ a‬‬
‫;)‪printf(“a=%d and b=%d \n”,a,b‬‬
‫}‬
‫‪a=6 b=5‬‬
‫‪a=6 b=6‬‬

‫‪ 7-5-3‬عملگرهای مقایسه ای‬
‫‪‬‬

‫‪‬‬

‫این عملگرها دو عبارت را بایکدیگر مقایسه کرده و نتیجه را باز می گردانند‪.‬‬
‫نتیجه می تواند درست )‪ (true‬یا غلط )‪ (false‬باشد‪.‬‬
‫نتیجه این عملگرها یک عدد صحیح است که درصورت درست بودن ‪ 1‬و‬
‫درصورت غلط بودن ‪ 0‬باز می گردانند‪ .‬این عملگرها عبارتند از‪:‬‬
‫عملگر‬

‫مفهوم عملگر‬

‫مثال‬

‫<‬

‫بزرگتر )<(‬

‫‪a>b‬‬

‫>‬

‫کوچکتر )>(‬

‫‪a
‫=<‬

‫بزرگتر یا مساوی )≤(‬

‫‪a >= b‬‬

‫=>‬

‫کوچکتر یا مساوی )≥(‬

‫‪a <= b‬‬

‫==‬

‫مساوی )=(‬

‫‪a == b‬‬

‫=!‬

‫نامساوی )≠(‬

‫‪a != b‬‬

‫‪ 7-5-3‬عملگرهای مقایسه ای‬
‫‪‬‬

‫‪‬‬

‫نکته مهمی که باید به آن دقت کرد عملگر مساوی )==( است‪ ،‬چرا که یک‬
‫اشتباه بسیار متداول برنامه نویسان ‪ C‬استفاده اشتباه از عملگر انتساب‬
‫)=( بجای عملگر تساوی )==( است که باعث ایجاد خطا در برنامه می‬
‫شود‪.‬‬
‫اولویت این عملگرها از باال به پایین بشرح زیر است‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫عملگرهای <‪ <= ، > ،‬و =>‬
‫عملگرهای == و =!‬

‫الزم بذکر است که در هنگام مساوی بودن اولویت چند عملگر‪ ،‬این عملگرها‬
‫از چپ به راست محاسبه می گردند‪.‬‬

‫‪ 7-5-4‬عملگرهای منطقی‬
‫‪‬‬

‫این عملگرها به شما اجازه می دهند که شرطهای ساده ای را که با‬
‫استفاده از عملگرهای مقایسه ای ایجاد شده اند را با یکدیگر ترکیب نموده‬
‫و شرطهای پیچیده تری را بسازید‪ .‬این عملگرها عبارتند از ‪:‬‬
‫مثال‬

‫عملگر‬

‫مفهوم عملگر‬

‫نحوه کار‬

‫&&‬

‫‪ AND‬منطقی‬

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

‫‪a>0 && sw==1‬‬

‫||‬

‫‪ OR‬منطقی‬

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

‫‪a<=100 || b!=0‬‬

‫!‬

‫‪ NOT‬منطقی‬

‫اگر عملوند درست باشد‪ ،‬نادرست و‬
‫اگر نادرست باشد‪ ،‬درست برمی‬
‫گرداند‪.‬‬

‫)‪! (a==1 || b<10‬‬

‫‪ 7-5-5‬عملگر شرطی‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫گاهی الزم است که ابتدا یک شرط بررسی شده و سپس برمبنای نتیجه )درست یا نادرست بودن آن( یکی‬
‫از دو عبارت ممکن بازگردانده شود‪ .‬برای اینکار می توان از یک عملگر ‪3‬تایی )با ‪ 3‬عملوند( بنام عملگر‬
‫شرطی استفاده نمود‪.‬‬
‫شکل کلی این عملگر بصورت زیر است‪:‬‬
‫>عبارت‪> :<2‬عبارت‪> ?<1‬شرط<‬
‫نحوه کار بدینصورت است که درصورت درست بودن شرط‪ ،‬عبارت‪ 1‬و در غیراینصورت عبارت ‪ 2‬بازگردانده می‬
‫شود‪.‬‬
‫به عنوان مثال به دستور زیر توجه کنید‪:‬‬
‫که این عبارت معادل دستور زیر است‪:‬‬

‫‪‬‬

‫;‪a = (k<10) ? 100 : 50‬‬
‫;‪if (k<10) a=100‬‬
‫;‪else a=50‬‬

‫البته این عبارت به شکلهای پیچیده نیز می تواند مورد استفاده قرار گیرد‪ .‬مثال ‪:‬‬
‫;‪c += (a>0 && a<10) ? ++a : a/b‬‬
‫که معادل است با ‪:‬‬
‫{ )‪if (a>0 && a<10‬‬
‫;‪a= a + 1‬‬
‫;‪c = c + a‬‬
‫}‬
‫;‪else c = c + a/b‬‬

‫‪ 7-5-6‬اولویت عملگرها‬
‫عملگر‬

‫اولویت‬

‫شرکت پذیری‬

‫‪1‬‬

‫)(‬

‫از چپ به راست‬

‫‪2‬‬

‫‪- + ! -- ++‬‬

‫از راست به چپ‬

‫‪3‬‬

‫‪* / %‬‬

‫از چپ به راست‬

‫‪4‬‬

‫‪+ -‬‬

‫از چپ به راست‬

‫‪5‬‬

‫>> <<‬

‫از چپ به راست‬

‫‪6‬‬

‫>= > <= <‬

‫از چپ به راست‬

‫‪7‬‬

‫=! ==‬

‫از چپ به راست‬

‫‪8‬‬

‫&&‬

‫از چپ به راست‬

‫‪9‬‬

‫||‬

‫از چپ به راست‬

‫‪10‬‬

‫‪?:‬‬

‫از راست به چپ‬

‫‪11‬‬

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

‫از راست به چپ‬

‫‪12‬‬

‫‪,‬‬

‫از چپ به راست‬

‫‪ 7-6‬خواندن و نمایش اطالعات‬
‫‪‬‬

‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫همانطور كه قبال نیز گفته شد‪ ،‬یكی از اهداف زبان ‪ C‬قابل حمل بودن آن‬
‫است‪ .‬بهمین منظور سعی شده است كه از دستوراتی كه ممكن است‬
‫وابسته به ماشین خاصی باشد‪ ،‬اجتناب گردد‪.‬‬
‫بهمین دلیل زبان ‪ C‬برخالف سایر زبانها دارای هیچ دستوری برای‬
‫خواندن از ورودی و یا نوشتن در خروجی نیست‪.‬‬
‫اما در عوض دارای تعدادی تابع )زیربرنامه( استاندارد می باشد كه تقریبا‬
‫تمامی كامپایلرها از آنها حمایت می كنند‪.‬‬
‫این كار به كامپایلر این امكان را می دهد كه بر حسب نوع سخت افزار‬
‫موردنظر‪ ،‬توابع ورودی و خروجی را طراحی نماید‪.‬‬
‫این توابع در یك فایل سرآمد بنام ‪ stdio.h‬تعریف شده اند و بنابراین قبل‬
‫ازاینكه بتوانید از این توابع استفاده نمایید‪ ،‬باید این فایل را نیز با استفاده‬
‫از ‪ #include‬در برنامه خود بگنجانید‪.‬‬

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫برای نمایش اطالعات در خروجی از تابع ‪ printf‬استفاده می شود‪.‬‬
‫این تابع رشته موردنظر شما را به خروجی استاندارد )كه در حالت‬
‫عادی همان صفحه نمایش یا مانیتور است( می فرستد‪ .‬شكل كلی این‬
‫تابع بصورت زیر است‪:‬‬
‫; )>لیست متغیرها< ‪> ,‬رشته كنترلی<(‪printf‬‬
‫رشته كنترلی همان متنی است كه قصد چاپ آن را داریم‪ ،‬با ذكر این‬
‫نكته كه در قسمتهایی كه باید مقدار یك متغیر چاپ شود‪ ،‬از یك‬
‫مشخصه تبدیل استفاده می شود‪ .‬هر مشخصه تبدیل از یك عالمت ‪%‬‬
‫بعالوه یك كاراكتر كه نوع متغیر مورد نظر را نشان می دهد تشكیل می‬
‫گردد‪.‬‬
‫لیست متغیرها نیز همان متغیرهایی هستند كه قصد چاپ آنها را داریم‪.‬‬
‫این متغیرها باید بترتیب قرار گرفته و با كاما )‪ (,‬از یكدیگر جدا شوند‪.‬‬

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫مشخصه تبدیل‬

‫مفهوم‬

‫‪%c‬‬

‫كاراكتر‬

‫‪%d‬‬

‫عدد صحیح در مبنای ‪10‬‬

‫‪%f‬‬

‫عدد اعشاری بدون نماد علمی‬

‫‪%e‬‬

‫عدد اعشاری با نماد علمی‬

‫‪%g‬‬

‫عدد اعشاری با حالت كوتاهتر بین ‪ e‬و ‪f‬‬

‫‪%s‬‬

‫رشته‬

‫‪%ld‬‬

‫عدد صحیح بزرگ‬

‫‪%lf %le %lg‬‬

‫عدد اعشاری بزرگ‬

‫‪%o‬‬

‫عدد صحیح در مبنای ‪8‬‬

‫‪%x‬‬

‫عدد صحیحی در مبنای ‪16‬‬

‫‪%u‬‬

‫عدد صحیح بدون عالمت‬

‫ تابع نمایش در خروجی‬7-6-1
#include
void main() {
int age = 20;
floate average = 18.23;
printf("You are %d years old and your average is %f \n",age,average);
}
You are 20 years old and your average is 18.230000

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫‪‬‬
‫‪‬‬

‫برای کنترل نحوه چاپ اعداد می توانید از مشخصه طول میدان استفاده‬
‫کنید‪.‬‬
‫مشخصه طول میدان برای اعداد به شكل زیر استفاده می شود‪:‬‬
‫‪ ‬برای اعداد صحیح از ‪ %nd‬استفاده می كنیم كه ‪ n‬تعداد ارقام را نشان‬
‫می دهد )مثال ‪ .(%3d‬در اینصورت برای هر متغیر ‪ n‬رقم درنظر گرفته‬
‫می شود‪ .‬اگر اندازه عدد از ‪ n‬كوچكتر باشد‪ ،‬به سمت چپ آن فضای‬
‫خالی اضافه می شود و اگر اندازه عدد بیش از ‪ n‬رقم باشد‪ ،‬طول میدان‬
‫نادیده گرفته شده و عدد بطور كامل چاپ می شود‪.‬‬
‫‪ ‬برای اعداد اعشاری از ‪ %n.mf‬استفاده می كنیم كه ‪ n‬اندازه كل عدد‬
‫)شامل عالمت ممیز( و ‪ m‬تعداد ارقام اعشار است )مثال ‪ .(%5.2f‬در‬
‫صورتیكه تعداد ارقام اعشاری عدد موردنظر از ‪ m‬بیشتر باشد‪ ،‬عدد به ‪m‬‬
‫عدد اعشار گرد می شود و در صورتیكه از ‪ m‬كمتر باشد‪ ،‬در سمت‬
‫راست آن ‪ 0‬قرار داده می شود‪.‬‬

‫‪ 7-6-2‬تابع خواندن از ورودی‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای خواندن اطالعات از ورودی از تابع ‪ scanf‬استفاده می شود‪.‬‬
‫این تابع اطالعات را ازورودی استاندارد )معموال صفحه كلید( خوانده و در‬
‫متغیرهای تعیین شده قرار می دهد‪.‬‬
‫شكل كلی این تابع بصورت زیر است‪:‬‬
‫; )>لیست آدرسهای متغیرها< ‪> ,‬رشته كنترلی<(‪scanf‬‬
‫همانطور كه می بینید نحوه احضار تابع ‪ scanf‬نیز مشابه ‪ printf‬است‪ .‬تنها‬
‫تفاوت در آن است كه در ‪ scanf‬باید لیست آدرسهای متغیرها ارسال شود‪.‬‬
‫مبحث مربوط به آدرسها در فصول بعدی بررسی خواهد شد ولی در حال حاضر‬
‫بخاطر بسپارید كه برای بدست آوردن آدرس یك متغیر از عالمت & استفاده می‬
‫كنیم‪ .‬بعنوان مثال ‪ &age‬بمعنای آدرس متغیر ‪ age‬است‪.‬‬
‫بطور كلی در ‪ C‬قدیمی هرگاه كه یك تابع دارای پارامترهای خروجی بود )یعنی‬
‫پارامترهایی كه یك مقدار را باز می گرداندند( از آدرس متغیرها استفاده می‬
‫شد كه امروزه این مسئله وجود ندارد‪.‬‬

‫ تابع خواندن از ورودی‬7-6-2
#include
void main() {
int age;
float average ;
printf("Please enter your age and average : ");
scanf("%d %f",&age,&average);
printf("You are %d years old and your average is %5.2f \n",age,average);
}

Please enter your age and average : 19 16.72
You are 19 years old and your average is 16.72

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫زبان ‪ C++‬یک زبان شی گرا است‪ ،‬بهمین دلیل در این زبان برای ورودی‬
‫و خروجی از اشیاء بجای توابع استفاده می گردد‪.‬‬
‫از آنجا که امروزه معموال برنامه نویسان ‪ C‬از کامپایلرهای ‪ C++‬استفاده‬
‫می کنند‪ ،‬می توانند از اشیای ورودی و خروجی آن نیز استفاده کنند‪.‬‬
‫اینکار در بین بسیاری از برنامه نویسان ‪ C‬متداول است‪ ،‬بهمین دلیل ما‬
‫در اینجا نحوه کار با اشیای خواندن و نوشتن در ‪ C++‬را بطور مقدماتی‬
‫توضیح می دهیم؛ گرچه توضیح کامل این موارد نیاز به آشنایی با شی‬
‫گرایی و زبان ‪ C++‬دارد‪.‬‬
‫قبل از هرچیز الزم به ذکر است که کلیه اشیای مربوط به ورودی و‬
‫خروجی در فایل سرآمدی بنام ‪ iostream.h‬تعیریف شده اند‪ ،‬بنابراین‬
‫ابتدا باید این فایل به برنامه توسط دستور ‪ #include‬الحاق گردد‪.‬‬

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫زبان ‪ C++‬برای نمایش اطالعات از یک شیئ بنام ‪ cout‬استفاده می نماید‪.‬‬
‫برای ارسال اطالعات مورد نظر برای چاپ به ‪ cout‬باید از عملگر درج در جریان‬
‫یا >> استفاده نماییم‪ .‬بعنوان مثال ‪:‬‬
‫; ” ‪cout >> “Please enter your name:‬‬
‫و یا مثال دیگر ‪:‬‬
‫;‪int a = 10‬‬
‫;‪float b = 2.86‬‬
‫;‪cout << a‬‬
‫;‪cout << b‬‬
‫نکته جالبی که در این مثالها دیده می شود‪ ،‬آنستکه برخالف تابع ‪ printf‬هیچ‬
‫نیازی به مشخص کردن نوع متغیری که قصد چاپ آن را داریم نیست و خود‬
‫شئ ‪ cout‬نوع آن را تشخیص می دهد‪.‬‬
‫عالوه براین می توان چندین عملگر درج در جریان را با یکدیگر الحاق کرد و‬
‫چندین متغیر را با یک دستور چاپ کرد‪.‬‬

C++ ‫ ورودی و خروجی اطالعات در‬7-6-3
#include
void main() {
int age = 20;
floate average = 18.23;
cout >> “You are ” >> age >> “ years old and your average is ” >> average ;
}

You are 20 years old and your average is 18.230000

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای دریافت اطالعات از کاربر‪ ،‬از شئ دیگری بنام ‪ cin‬استفاده می شود‪.‬‬
‫برای ارسال متغیر مورد نظر به ‪ cin‬باید از عملگر استخراج از جریان یا <<‬
‫استفاده نماییم‪ .‬بعنوان مثال‪:‬‬
‫;‪int a‬‬
‫;‪cin >> a‬‬
‫بازهم همانطور که می بینید نیازی به تعیین نوع متغیر موردنظر نیست و خود‬
‫شئ ‪ cin‬نوع متغیر را بطور اتوماتیک تشخیص داده و داده ای از همان نوع را از‬
‫کاربر دریافت و در متغیر مورد نظر قرار می دهد‪.‬‬
‫عملگرهای استخراج از جریان را نیز می توان با یکدیگر الحاق کرد‪.‬‬
‫برای رفتن به خط بعد در شئ ‪ cout‬می توان از دستکاری کننده ‪ endl‬استفاده‬
‫کرد‪ .‬مثال در دستور زیر پس از چاپ پیغام‪ ،‬مکان نما به خط بعد منتقل می‬
‫شود‪:‬‬
‫;‪cout >> “List of students : “ >> endl‬‬
‫البته دستکاری کننده های متعدد دیگری نیز ازجمله موارد مربوط به تعیین طول‬
‫میدان و نحوه چاپ مقادیر وجود دارد که توضیح آنها نیاز به یک مبحث مستقل‬
‫دارد‪.‬‬

C++ ‫ ورودی و خروجی اطالعات در‬7-6-3
#include
void main() {
int age;
float average ;
cout << "Please enter your age and average : " ;
cin >> age >> average ;
cout << "You are " << age << "years old and your average is " << average;
}

Please enter your age and average : 19 16.72
You are 19 years old and your average is 16.72

‫‪ 7-7‬توابع کتابخانه ای‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫همانطور که قبال نیز گفته شد‪ ،‬زبان ‪ C‬از زیر برنامه ها نیز حمایت می کند‪ .‬هر زیر برنامه‬
‫در ‪ C‬یک تابع نامیده می شود‪ .‬تا کنون با توابعی همچون ‪ main‬و یا ‪ printf‬و ‪ scanf‬آشنا‬
‫شده ایم‪.‬‬
‫معموال عرضه کنندگان کامپایلرها و یا سایر فروشندگان نرم افزار‪ ،‬برخی از توابع عمومی‬
‫را که ممکن است مورد نیاز جمع کثیری از برنامه نویسان مختلف باشد را در قالب‬
‫کتابخانه ای از توابع در اختیار برنامه نویسان می گذارند‪ .‬بعضی از این توابع کتابخانه ای‬
‫مانند ‪ printf‬و ‪ scanf‬بصورت استاندارد درآمده و توسط عرضه کنندگان مختلف ارائه می‬
‫شوند‪.‬‬
‫در کامپایلر عرضه شده توسط شرکت بورلند )‪ (Borland C++ 3.1‬نیز کتابخانه های‬
‫متعددی از توابع برای شما عرضه شده اند که بتدریج با آنها و کاربردشان آشنا خواهید‬
‫شد‪.‬‬
‫نکته مهم آنستکه برای استفاده از این توابع ابتدا باید فایل سرآمد مربوط به آنها را نیز در‬
‫ابتدای برنامه خود اضافه نمایید ) با استفاده از ‪ .(#include‬هر فایل سرآمد شامل تعاریف‬
‫اولیه گروهی از توابع مرتبط با هم و داده های مربوط به آنها بوده و در استاندارد قدیمی‬
‫تر دارای پسوند ‪ .h‬می باشد)در استاندارد جدید پسوند این فایلها حذف شده است(‪.‬‬
‫برخی از این فایلهای سرآمد عبارتند از‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪ : stdio.h‬توابع ورودی و خروجی استاندارد‬
‫‪ : math.h‬توابع ریاضی‬
‫‪ : graphics.h‬توابع مربوط به عملیات گرافیکی‬
‫‪ : string.h‬توابع مربوط به کار با رشته ها‬


Slide 23

‫مبانی کامپیوتر و برنامه سازی‬
‫فصل هفتم ‪ :‬مفاهیم اولیه زبان ‪C‬‬
‫مدرس ‪ :‬نگین معروفی‬

‫‪ 7-1‬شناسه ها در ‪C‬‬
‫‪‬‬
‫‪‬‬

‫شناسه )‪ (identifier‬نامی است که به یک قسمت از برنامه مانند متغیر‪ ،‬تابع‪ ،‬ثابت و یا‬
‫‪ ...‬داده می شود‪.‬‬
‫در زبان ‪ C‬برای انتخاب شناسه ها فقط می توان از عالئم زیر استفاده کرد‪:‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫حروف انگلیسی کوچک و بزرگ )‪(A…Z a…z‬‬
‫ارقام )‪(0…9‬‬
‫عالمت خط پایین یا _‬

‫البته یک شناسه نمی تواند با یک رقم شروع شود‪.‬‬
‫چند شناسه مجاز‪ name2 ، average ، sum :‬و ‪student_average‬‬
‫چند شناسه غیرمجاز ‪ 2name‬و یا ‪student average‬‬
‫در برنامه نویسی امروزی پیشنهاد می شود بجای شناسه هایی همانند‬
‫‪ student_average‬از ‪ studentAverage‬استفاده گردد‪.‬‬
‫نکته مهم دیگری که باید به آن اشاره کرد آنستکه زبان ‪ C‬برخالف بسیاری از زبانهای دیگر‬
‫به کوچک و بزرگی حروف حساس است )‪ .(case sensitive‬در نتیجه شناسه های زیر با‬
‫یکدیگر متفاوتند ‪:‬‬
‫‪Sum ≠ sum ≠ SUM‬‬
‫آخرین نکته اینستکه در هنگام انتخاب شناسه نمی توانید از کلمات کلیدی که برای‬
‫منظورهای خاص در زبان ‪ C‬رزرو شده اند استفاده کنید‪.‬‬

C ‫ شناسه ها در‬7-1
: C ‫کلمات کلیدی در زبان‬
auto

break

case

char

const

continue

default

do

double

else

enum

extern

float

for

goto

if

int

long

register

return

short

signed

sizeof

static

struct

switch

typedef

union

unsigned

void

volatile

while

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫محدوده‬

‫اندازه )بیت(‬

‫توضیح‬

‫نوع داده‬

‫‪-128 to +127‬‬

‫‪8‬‬

‫کاراکتر‬

‫‪char‬‬

‫‪-32768 to +32767‬‬

‫‪16‬‬

‫عدد صحیح‬

‫‪int‬‬

‫‪3.4e-38 to 3.4e+38‬‬

‫‪32‬‬

‫عدد اعشاری‬

‫‪float‬‬

‫‪1.7e-308 to 1.7e+308‬‬

‫‪64‬‬

‫عدد اعشاری با‬
‫دقت مضاعف‬

‫‪double‬‬

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫‪‬‬

‫البته چند نکته مهم درمورد این جدول قابل ذکر است ‪:‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫اندازه ‪ int‬در محیطهای ‪ 16‬بیتی مانند ‪ DOS‬برابر ‪ 16‬بیت است‪ .‬اما در‬
‫محیطهای ‪ 32‬بیتی همانند ‪ Windows‬اندازه آن ‪ 32‬بیت می باشد که در‬
‫اینصورت محدوده ای برابر ‪ -2,147,483,648‬تا ‪ +2,147,483,647‬را‬
‫پوشش می دهد‪.‬‬
‫در بعضی از کامپایلرهای ‪ ،C‬نوع داده ‪ bool‬نیز وجود دارد که می تواند‬
‫یکی از مقادیر ‪)true‬درست( یا ‪) false‬غلط( را نشان دهد ‪ .‬اما در نسخه‬
‫های اولیه ‪ C‬از همان نوع داده صحیح یا ‪ int‬برای اینکار استفاده می‬
‫شد‪ .‬بدین صورت که ‪ 0‬نشاندهنده ‪ false‬و هر عدد غیر صفر )معموال ‪(1‬‬
‫نشاندهنده ‪ true‬است‪.‬‬
‫از آنجا که برای ذخیره سازی کاراکترها کد اسکی آنها ذخیره می گردد‪،‬‬
‫از یک متغیر کاراکتری یا ‪ char‬می توان بعنوان یک عدد صحیح کوچک نیز‬
‫استفاده کرد و اعمال ریاضی برروی آنها نیز مجاز است‪.‬‬

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫عالوه براین چندین اصالح کننده نیز وجود دارد که به ما اجازه می دهد نوع داده مورد‬
‫نظر را با دقت بیشتری برای نیازهای مختلف استفاده نماییم‪.‬‬
‫این اصالح کننده ها عبارتند از ‪short, long, signed, unsigned :‬‬
‫تمام این اصالح کننده ها می توانند به نوع داده ‪ int‬اعمال شوند و اثر آنها بستگی‬
‫به محیط دارد‪.‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫در یک محیط ‪16‬بیتی‪short int ،‬بازهم برابر ‪16‬بیت است ولی ‪ long int‬برابر‪32‬بیت می‬
‫باشد‪.‬‬
‫‪ unsigned int‬باعث می شود که یک عدد ‪ 16‬بیتی بدون عالمت داشته باشیم که بازه‬
‫بین ‪ 0‬تا ‪ 65535‬را پوشش می دهد‪ signed int .‬نیز همانند ‪ int‬معمولی بوده و تفاوتی‬
‫ندارد‪.‬‬
‫ترکیب این اصالح کننده ها نیز ممکن است‪ .‬مثال ‪ unsigned long int‬یک عدد ‪ 32‬بیتی‬
‫بدون عالمت است که بازه ‪ 0‬تا ‪ 4,294,967,295‬را پوشش می دهد‪.‬‬

‫برروی نوع داده ‪ char‬فقط اصالح کننده های ‪ signed‬و ‪ unsigned‬را می توان اعمال‬
‫کرد‪ .‬معموال از اصالح کننده ‪ unsigned‬وقتی استفاده می شود که قصد داشته‬
‫باشیم از ‪ char‬بعنوان یک عدد صحیح مثبت بین ‪ 0‬تا ‪ 255‬استفاده کنیم‪.‬‬
‫برروی نوع داده ‪ double‬تنها اصالح کننده ‪ long‬قابل اعمال است و دراینصورت عدد‬
‫اعشاری با ‪ 80‬بیت را خواهیم داشت که قادر است هر عددی در بازه ‪ 3.4e-4932‬تا‬
‫‪ 1.1e+4932‬را در خود نگاه دارد‪.‬‬

‫‪ 7-3‬تعریف متغیرها‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای تعریف متغیرها به شکل زیر عمل می کنیم‪:‬‬

‫;>‪ ‫که ‪ type‬یکی از نوع داده های گفته شده و ‪ variable-list‬لیستی از متغیرها است‬
‫که با کاما از یکدیگر جدا شده اند‪ .‬بعنوان مثال ‪:‬‬
‫;‪int sum‬‬
‫;‪float average‬‬
‫; ‪long int a, b, c‬‬
‫; ‪unsigned long int i, j, k‬‬
‫عالوه براین می توان در هنگام تعریف متغیر به آن مقدار اولیه نیز داد‪ .‬مثال ‪:‬‬
‫; ‪int d = 0‬‬
‫نكته مهم آنكه زبان ‪ C‬به متغیرها مقدار اولیه نمي دهد )حتي ‪ (0‬و برنامه نويس‬
‫خود بايد اينكار را صريحا انجام دهد‪ ،‬درغیر اينصورت مقدار اولیه متغیر‪ ،‬نامعین خواهد‬
‫بود‪.‬‬
‫تعریف متغیرها طبق اصول زبان ‪ C‬میتواند درهرجایی از برنامه صورت پذیرد‪ ،‬و‬
‫متغیرهای تعریف شده از همان خط به بعد قابل استفاده خواهد بود‪ .‬اما معموال‬
‫توصیه می گردد كه تعریف متغیرها در همان خط ابتدایی تابع و بالفاصله پس از {‬
‫صورت پذیرد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫‪‬‬
‫‪‬‬

‫ثابتها مقادیر ثابتی هستند كه مقدار آنها در حین اجرای برنامه تغییر نمی یابد‪ .‬ثابتها می توانند از‬
‫هریك از نوع داده های اصلی باشند‪.‬‬
‫ثوابت عددی صحیح ‪:‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫برای نمایش این دسته از ثوابت‪ ،‬از دنباله ای از ارقام بعالوه عالمت ‪ +‬یا ‪ -‬استفاده می كنیم‪ .‬بعنوان مثال‬
‫‪ -45‬و یا ‪ 3489‬ثوابت صحیح هستند‪.‬‬
‫در حالت عادی ‪ C‬هر عدد را در كوچكترین نوع داده ای كه می تواند قرار می دهد‪ .‬مثال عدد ‪ 85‬در یك‬
‫‪ int‬قرار می گیرد‪ ،‬اما عدد ‪ 145398‬در یك ‪ long int‬قرار خواهد گرفت‪.‬‬
‫اگر قصد دارید یك عدد كوچك بعنوان ‪ long‬محسوب گردد‪ ،‬می توانید از پسوند ‪ L‬در انتهای آن استفاده‬
‫می كنیم‪ .‬مثال ‪245L‬یك عدد ‪ long‬محسوب می شود‪.‬‬
‫;‪long int a = 20L‬‬
‫پسوند ‪ U‬در انتهای عدد نیز نشانه بدون عالمت بودن آن است‪.‬‬
‫نكته دیگر آنكه ‪ C‬به شما اجازه می دهد درصورت لزوم ثوابت صحیح خود را در مبنای ‪ 8‬یا ‪ 16‬نیز كه‬
‫از مبناهای متداول در برنامه نویسی هستند‪ ،‬بنویسید‪.‬‬
‫‪‬‬
‫‪‬‬

‫برای نوشتن عدد در مبنای ‪ 8‬باید آن را با ‪ 0‬آغاز كنید‪ ،‬مثال ‪ 0342‬یك عدد در منای ‪ 8‬محسوب می‬
‫گردد‪.‬‬
‫برای نوشتن یك عدد در مبنای ‪ 16‬باید آن را با ‪ 0x‬آغاز نمایید‪ ،‬مانند ‪.0x27A4‬‬

‫‪ 7-4‬ثوابت‬
‫ثوابت عددی اعشاری‬

‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫برای نمایش اعداد اعشاری‪ ،‬باید از نقطه اعشار استفاده كنیم‪ ،‬مانند ‪237.45‬‬
‫اما نكته جالب آنستكه می توانید از نماد علمی نیز برای نمایش اعداد‬
‫اعشاری استفاده كنید‪ .‬برای اینكار كافی است از حرف ‪ e‬برای نمایش قسمت‬
‫توان استفاده نمایید‪ .‬بعنوان مثال ‪:‬‬
‫‪-23.47 × 10 5 = -23.47e5‬‬
‫‪42.389 × 10 -3 = 42.389e-3‬‬
‫دقت كنید كه قسمت توان‪ ،‬حتما یك عدد صحیح است‪.‬‬
‫نكته جالب اینجاست كه برخالف مورد قبل‪ ،‬كامپایلر بطور پیش فرض داده های‬
‫اعشاری را از نوع ‪ double‬فرض می كند‪.‬چنانچه دوست دارید ثابت شما ازنوع‬
‫‪ float‬درنظر گرفته شود‪ ،‬در انتهای آن ‪ F‬قرار دهید‪ .‬ضمنا پسوند ‪ L‬نیز داده‬
‫اعشاری را از نوع ‪ long double‬درنظر می گیرد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫ثوابت كاراكتری ‪:‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫برای نشان دادن ثوابت كاراكتری‪ ،‬آنها را در داخل ' قرار می دهیم‪ .‬بعنوان مثال‬
‫'‪'A‬یك ثابت كاراكتری است‪.‬‬
‫; '‪char ch = 'S‬‬
‫دقت كنید كه همانطور كه قبال گفته شد‪ ،‬كد اسكی كاراكترها در متغیر ذخیره‬
‫می گردد‪ ،‬بنابراین می توان از آن بعنوان یك عدد صحیح نیز استفاده كرد‪ .‬نكته‬
‫مهم دیگر آنستكه به تفاوت عدد ‪ 5‬و كاراكتر '‪ '5‬دقت داشته باشید‪ .‬در حقیقت‬
‫'‪ '5‬برابر است با عدد ‪ 53‬كه همان كد اسكی آن است‪.‬‬
‫روش فوق‪ ،‬برای نمایش کاراکترهای قابل چاپ مناسب است‪ ،‬اما بعضی‬
‫كاراكترها مانند ‪ enter‬قابل نمایش نبوده و برای آنها شکل خاصی وجود ندارد‪.‬‬
‫در چنین مواردی‪ ،‬زبان ‪ C‬از ترکیب عالمت \ به همراه یک کاراکتر دیگر‪ ،‬برای‬
‫نمایش این قبیل کاراکترها استفاده می نماید‪ .‬بعنوان مثال‪ ،‬کاراکتر '‪ '\n‬نشان‬
‫دهنده خط جدید یا همان ‪ enter‬می باشد‪.‬‬
‫جدول صفحه بعد این قبیل کاراکترها و معادل آنها را نشان می دهد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫نحوه نمایش در ‪C‬‬

‫کد اسکی‬

‫صدای بوق کامپیوتر‬

‫‪\a‬‬

‫‪7‬‬

‫حرکت به عقب ‪backspace‬‬

‫‪\b‬‬

‫‪8‬‬

‫شروع صفحه ‪form feed‬‬

‫‪\f‬‬

‫‪12‬‬

‫سطر جدید ‪line feed‬‬

‫‪\n‬‬

‫‪10‬‬

‫برگشت به ابتداي سطر ‪carriage return‬‬

‫‪\r‬‬

‫‪13‬‬

‫فاصله افقی ‪horizontal tab‬‬

‫‪\t‬‬

‫‪9‬‬

‫فاصله عمودی ‪vertical tab‬‬

‫‪\v‬‬

‫‪11‬‬

‫عالمت سوال‬

‫?\‬

‫‪63‬‬

‫عالمت '‬

‫'\‬

‫‪39‬‬

‫عالمت "‬

‫"\‬

‫‪34‬‬

‫عالمت \‬

‫\\‬

‫‪92‬‬

‫عالمت تهی‬

‫‪\0‬‬

‫‪0‬‬

‫نام کاراکتر‬

‫کد اسکی یک کاراکتر با ‪ 3‬رقم در مبنای ‪8‬‬

‫‪\000‬‬

‫کد اسکی یک کاراکتر با ‪ 2‬رقم در مبنای ‪16‬‬

‫‪\x00‬‬

‫‪ 7-4‬ثوابت‬
‫‪‬‬

‫ثوابت رشته ای ‪ C :‬عالوه بر ثوابت فوق‪ ،‬از یك ثابت دیگر بنام رشته نیز‬
‫حمایت می كند‪ .‬رشته‪ ،‬دنباله ای از كاراكترها است كه در داخل " قرار‬
‫می گیرند‪ .‬بعنوان مثال "‪ "this is a test‬یك رشته است‪ .‬دقت كنید كه '‪'a‬‬
‫یك كاراكتر است‪ ،‬اما "‪ "a‬یك رشته است كه فقط شامل یك كاراكتر می‬
‫باشد‪.‬‬

‫‪ 7-5‬عملگرها‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫عملگر‪ ،‬نمادی است كه به كامپایلر می گوید تا عملیات محاسباتی یا‬
‫منطقی خاصی را برروی یك یا چند عملوند‪ ،‬انجام دهد‪.‬‬
‫به عملگرهایی كه فقط یك عملوند دارند‪ ،‬عملگر یكانی می گوییم و‬
‫همواره عملگر در سمت چپ عملوند قرار می گیرد)مانند عدد ‪.(-125‬‬
‫اما عملگرهایی كه برروی دو عملوند اثر می كنند را عملگر دودویی‬
‫نامیده و عملگر را بین دو عملوند قرار می دهیم )مانند ‪.(23+86‬‬
‫هر ترکیب درستی از عملگرها و عملوندها را یک عبارت می نامیم‪.‬‬
‫‪ C‬از نقطه نظر عملگرها یك زبان بسیار قوی است‪ .‬این عملگرها به چند‬
‫دسته اصلی تقسیم می گردند كه آنها را به ترتیب بررسی می كنیم‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫این عملگرها‪ ،‬همان اعمال متداول ریاضی هستند كه در زبان ‪ C‬مورد استفاده‬
‫قرار می گیرند‪ .‬این اعمال عبارتند از ‪:‬‬

‫عمل‬

‫نوع‬

‫عملگر‬

‫منفی كردن عملوند سمت راست‬

‫یكانی‬

‫‪-‬‬

‫جمع دو عملوند‬

‫دودویی‬

‫‪+‬‬

‫تفریق دو عملوند‬

‫دودویی‬

‫‪-‬‬

‫ضرب دو عملوند‬

‫دودویی‬

‫*‬

‫تقسیم دو عملوند‬

‫دودویی‬

‫‪/‬‬

‫محاسبه باقیمانده تقسیم دو عملوند‬

‫دودویی‬

‫‪%‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬
‫‪‬‬

‫این عملگرهای برروی همه انواع داده های ‪ C‬عمل می كنند‪ ،‬بجز عملگر ‪ %‬كه فقط‬
‫برروی نوع داده های صحیح عمل می كند‪.‬‬
‫اما نكته مهمی كه باید به آن اشاره كرد‪ ،‬نحوه كار عملگر تقسیم برروی نوع داده های‬
‫مختلف است‪.‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫درصورتیكه هردو عملوند صحیح باشند‪ ،‬تقسیم بصورت صحیح بر صحیح انجام خواهد شد‪.‬‬
‫اگر یكی یا هر دو عملوند اعشاری باشند‪ ،‬تقسیم بصورت اعشاری انجام خواهد پذیرفت‪.‬‬
‫فرض كنید تعاریف زیر را داریم ‪:‬‬
‫; ‪int a,b‬‬
‫; ‪float c,d‬‬
‫; ‪a = 10 ; b = 4‬‬
‫;‪c = 8.2; d = 4.0‬‬
‫اكنون به نتایج عملیات زیر دقت كنید ‪:‬‬
‫‪a / b => 2‬‬
‫‪c / d => 2.05‬‬
‫‪a / d => 2.5‬‬
‫‪a / 4 => 2‬‬
‫چنانچه به آخرین مورد توجه كنید‪ ،‬متوجه می شوید كه از آنجا كه ‪a‬یك متغیر صحیح است و ‪4‬‬
‫نیز یك ثابت صحیح در نظر گرفته شده‪ ،‬درنتیجه تقسیم بصورت صحیح بر صحیح انجام گرفته‬
‫است‪ .‬چنانچه بخواهیم تقسیم بصورت اعشاری صورت پذیرد‪ ،‬به دو شكل می توانیم عمل‬
‫كنیم‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫برای اینکه عبارت تقسیم صفحه قبل بصورت اعشاری انجام شود‪ ،‬به دو روش‬
‫می توان عمل کرد‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫این عبارت را بصورت ‪ a / 4.0‬بنویسیم‪.‬‬
‫از عملگر قالب ریزی استفاده كنیم‪.‬‬

‫عملگر قالب ریزی می تواند یك نوع را به نوع دیگری تبدیل نماید‪ .‬شكل كلی آن‬
‫به شكل زیر است ‪:‬‬
‫>‪() ‫كه ‪ type‬نوع مورد نظر است كه قصد تبدیل عبارت ‪ expression‬به آن نوع را‬
‫داریم‪ .‬بعنوان مثال در مورد قبلی می توان به شكل زیر عمل كرد ‪:‬‬
‫‪(float) a / 4‬‬
‫در این حالت از كامپایلر خواسته ایم كه ابتدا عدد ‪ a‬را به اعشاری تبدیل كند‬
‫)البته بصورت موقت( و سپس آن را بر ‪ 4‬تقسیم نماید‪ ،‬كه مسلما حاصل‬
‫اعشاری خواهد بود‪.‬‬
‫بطوركلی هرگاه ثابتها و متغیرهایی از انواع مختلف در یك عبارت محاسباتی‬
‫داشته باشیم‪ ،‬كامپایلر ‪ C‬همه آنها را به یك نوع یكسان كه همان بزرگترین‬
‫عملوند موجود است تبدیل خواهد كرد‪ .‬بعنوان مثال به مورد صفحه بعد دقت‬
‫كنید ‪:‬‬

‫ عملگرهای محاسباتی‬7-5-1
char ch;
int i;

float f;
double d;
result = (ch / i)
int

+

(f *d)

(f+i)
float

double

double

int

-

double

double

float

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫اولویت عملگرها ‪ :‬در عبارتی که شامل چندین عملگر است‪ ،‬کدامیک در‬
‫ابتدا اعمال خواهد گردید‪.‬‬
‫اولویت عملگرهای محاسباتی از باال به پایین بشرح زیر است‪:‬‬
‫‪ ‬عملگر یکانی –‬
‫‪ ‬عملگرهای * و ‪ /‬و ‪%‬‬
‫‪ ‬عملگرهای ‪ +‬و –‬
‫چنانچه اولویت دو عملگر یکسان باشد‪ ،‬این عملگرها از چپ به راست‬
‫محاسبه خواهند شد‪.‬‬
‫چنانچه بخواهیم یک عمل با اولویت پایین زودتر انجام شود‪ ،‬باید از پرانتز‬
‫استفاده کنیم‪ .‬بنابراین اولویت عملگر پرانتز از همه موارد فوق‬
‫بیشتراست‪ .‬در مورد پرانتزهای متداخل‪ ،‬ابتدا پرانتز داخلی محاسبه‬
‫می شود؛ اما در مورد پرانتزهای هم سطح‪ ،‬ابتدا پرانتز سمت چپتر‬
‫محاسبه می گردد‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫چند مثال در مورد اولویت عملگرها‬

‫ترتیب اجرای عملگرها‬

‫عبارت زبان ‪C‬‬

‫ابتدا عمل * و سپس عمل ‪+‬‬

‫‪b+c*d‬‬

‫ابتدا عمل ‪ +‬و سپس عمل *‬

‫‪(b + c) * d‬‬

‫ابتدا عمل ‪ /‬سپس عمل * و در انتها عمل ‪+‬‬

‫‪b+c/d*e‬‬

‫ابتدا عمل * سپس عمل ‪ /‬و در انتها عمل ‪+‬‬

‫)‪b + c / (d * e‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫یک مثال کامل در مورد اولویت عملگرها‬

‫‪result = a + b * (f – (g + b) / d) – c * (a – d) / e‬‬
‫‪6‬‬

‫‪1‬‬
‫‪7‬‬

‫‪2‬‬

‫‪8‬‬

‫‪3‬‬
‫‪4‬‬
‫‪5‬‬
‫‪9‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫در زبان ‪ C‬برای انتساب چندین عملگر وجود دارد‪ .‬ساده ترین عملگر انتساب‪ ،‬همان عملگر =‬
‫است که در بسیاری از زبانها استفاده می شود‪ .‬بعنوان مثال ‪:‬‬
‫;‪a = 5‬‬
‫;‪b = c + 2 * d‬‬
‫این عملگر باعث می شود که عبارت سمت راست در عبارت سمت چپ قرار گیرد‪.‬‬
‫توجه کنید که مقدار سمت چپ باید عبارتی باشد که بتوان به آن یک مقدار را نسبت داد‬
‫)مانند یک متغیر( که به آن ‪ Lvalue‬گفته می شود‪ ،‬بنابراین یک ثابت نمی تواند در سمت چپ‬
‫قرار گیرد‪.‬‬
‫نکته دیگر اینکه اولویت عملگر = از عملگرهای ریاضی کمتر است و درنتیجه ابتدا آن عملیات‬
‫انجام شده و در پایان حاصل در عبارت سمت چپ ریخته می شود‪.‬‬
‫الزم به ذکر است که در هنگام انتساب‪ ،‬درصورت لزوم نوع عبارت سمت راست به نوع عبارت‬
‫سمت چپ تبدیل می شود‪ .‬مثال‪:‬‬
‫;‪int a‬‬
‫;‪a = 2.5 * 5.0‬‬
‫که دراینصورت عدد ‪ 12‬در ‪ a‬ذخیره خواهد شد‪.‬‬
‫شرکت پذیری این عملگر از راست به چپ می باشد‪ ،‬بدین معنا که چنانچه چندین عملگر‬
‫نسبت دهی داشته باشیم‪ ،‬این عملگرها از راست به چپ محاسبه می شوند‪ .‬مثال پس از‬
‫اجرای دستور زیر‪ ،‬مقدار هر ‪ 3‬متغیر برابر ‪ 10‬خواهد شد‪.‬‬
‫;‪a = b = c = 10‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬

‫نکته جالب درمورد زبان ‪ C‬آنستکه دارای یک سری عملگرهای انتساب‬
‫خالصه شده است که باعث می شوند در بعضی موارد بتوانیم عبارات‬
‫کوتاهتری را بنویسیم‪ .‬این عملگرها عبارتند از ‪:‬‬
‫عملگرد‬

‫مثال‬

‫عبارت انتساب معادل‬

‫‪++‬‬

‫;‪a ++‬‬

‫;‪a = a + 1‬‬

‫‪--‬‬

‫;‪a --‬‬

‫;‪a = a – 1‬‬

‫=‪+‬‬

‫;‪a += 5‬‬

‫;‪a = a + 5‬‬

‫=‪-‬‬

‫;‪a -= 8‬‬

‫;‪a= a – 8‬‬

‫=*‬

‫;‪a *= 10‬‬

‫;‪a= a * 10‬‬

‫=‪/‬‬

‫;‪a /= 2‬‬

‫;‪a = a / 2‬‬

‫=‪%‬‬

‫;‪a %= 10‬‬

‫;‪a = a % 10‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬
‫‪‬‬

‫عملگر اول و دوم‪ ،‬عملگرهای یکانی هستند که بترتیب عملگر افزایش و عملگر کاهش‬
‫نامیده می شوند‪.‬‬
‫نکته جالب آنستکه این دو عملگر به دوصورت مورد استفاده قرار می گیرند‪.‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫در حالتی که از دستور ;‪ a ++‬استفاده شود به آن پس افزایش می گویند و بدین معناست که‬
‫ابتدا از مقدار فعلی ‪ a‬در عبارت موردنظر استفاده کن و سپس آن را افزایش بده‪.‬‬
‫اما دستور ;‪ ++ a‬که به آن پیش افزایش گفته می شود‪ ،‬ابتدا ‪ a‬را افزایش داده و سپس از آن‬
‫در عبارت استفاده می کند‪.‬‬
‫به برنامه زیر دقت کنید‪:‬‬

‫>‪#include ‫{ )(‪void main‬‬
‫; ‪int a ,b‬‬
‫;‪a=5‬‬
‫;‪b = a ++‬‬
‫;)‪printf(“a=%d and b=%d \n”,a,b‬‬
‫;‪a=5‬‬
‫;‪b = ++ a‬‬
‫;)‪printf(“a=%d and b=%d \n”,a,b‬‬
‫}‬
‫‪a=6 b=5‬‬
‫‪a=6 b=6‬‬

‫‪ 7-5-3‬عملگرهای مقایسه ای‬
‫‪‬‬

‫‪‬‬

‫این عملگرها دو عبارت را بایکدیگر مقایسه کرده و نتیجه را باز می گردانند‪.‬‬
‫نتیجه می تواند درست )‪ (true‬یا غلط )‪ (false‬باشد‪.‬‬
‫نتیجه این عملگرها یک عدد صحیح است که درصورت درست بودن ‪ 1‬و‬
‫درصورت غلط بودن ‪ 0‬باز می گردانند‪ .‬این عملگرها عبارتند از‪:‬‬
‫عملگر‬

‫مفهوم عملگر‬

‫مثال‬

‫<‬

‫بزرگتر )<(‬

‫‪a>b‬‬

‫>‬

‫کوچکتر )>(‬

‫‪a
‫=<‬

‫بزرگتر یا مساوی )≤(‬

‫‪a >= b‬‬

‫=>‬

‫کوچکتر یا مساوی )≥(‬

‫‪a <= b‬‬

‫==‬

‫مساوی )=(‬

‫‪a == b‬‬

‫=!‬

‫نامساوی )≠(‬

‫‪a != b‬‬

‫‪ 7-5-3‬عملگرهای مقایسه ای‬
‫‪‬‬

‫‪‬‬

‫نکته مهمی که باید به آن دقت کرد عملگر مساوی )==( است‪ ،‬چرا که یک‬
‫اشتباه بسیار متداول برنامه نویسان ‪ C‬استفاده اشتباه از عملگر انتساب‬
‫)=( بجای عملگر تساوی )==( است که باعث ایجاد خطا در برنامه می‬
‫شود‪.‬‬
‫اولویت این عملگرها از باال به پایین بشرح زیر است‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫عملگرهای <‪ <= ، > ،‬و =>‬
‫عملگرهای == و =!‬

‫الزم بذکر است که در هنگام مساوی بودن اولویت چند عملگر‪ ،‬این عملگرها‬
‫از چپ به راست محاسبه می گردند‪.‬‬

‫‪ 7-5-4‬عملگرهای منطقی‬
‫‪‬‬

‫این عملگرها به شما اجازه می دهند که شرطهای ساده ای را که با‬
‫استفاده از عملگرهای مقایسه ای ایجاد شده اند را با یکدیگر ترکیب نموده‬
‫و شرطهای پیچیده تری را بسازید‪ .‬این عملگرها عبارتند از ‪:‬‬
‫مثال‬

‫عملگر‬

‫مفهوم عملگر‬

‫نحوه کار‬

‫&&‬

‫‪ AND‬منطقی‬

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

‫‪a>0 && sw==1‬‬

‫||‬

‫‪ OR‬منطقی‬

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

‫‪a<=100 || b!=0‬‬

‫!‬

‫‪ NOT‬منطقی‬

‫اگر عملوند درست باشد‪ ،‬نادرست و‬
‫اگر نادرست باشد‪ ،‬درست برمی‬
‫گرداند‪.‬‬

‫)‪! (a==1 || b<10‬‬

‫‪ 7-5-5‬عملگر شرطی‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫گاهی الزم است که ابتدا یک شرط بررسی شده و سپس برمبنای نتیجه )درست یا نادرست بودن آن( یکی‬
‫از دو عبارت ممکن بازگردانده شود‪ .‬برای اینکار می توان از یک عملگر ‪3‬تایی )با ‪ 3‬عملوند( بنام عملگر‬
‫شرطی استفاده نمود‪.‬‬
‫شکل کلی این عملگر بصورت زیر است‪:‬‬
‫>عبارت‪> :<2‬عبارت‪> ?<1‬شرط<‬
‫نحوه کار بدینصورت است که درصورت درست بودن شرط‪ ،‬عبارت‪ 1‬و در غیراینصورت عبارت ‪ 2‬بازگردانده می‬
‫شود‪.‬‬
‫به عنوان مثال به دستور زیر توجه کنید‪:‬‬
‫که این عبارت معادل دستور زیر است‪:‬‬

‫‪‬‬

‫;‪a = (k<10) ? 100 : 50‬‬
‫;‪if (k<10) a=100‬‬
‫;‪else a=50‬‬

‫البته این عبارت به شکلهای پیچیده نیز می تواند مورد استفاده قرار گیرد‪ .‬مثال ‪:‬‬
‫;‪c += (a>0 && a<10) ? ++a : a/b‬‬
‫که معادل است با ‪:‬‬
‫{ )‪if (a>0 && a<10‬‬
‫;‪a= a + 1‬‬
‫;‪c = c + a‬‬
‫}‬
‫;‪else c = c + a/b‬‬

‫‪ 7-5-6‬اولویت عملگرها‬
‫عملگر‬

‫اولویت‬

‫شرکت پذیری‬

‫‪1‬‬

‫)(‬

‫از چپ به راست‬

‫‪2‬‬

‫‪- + ! -- ++‬‬

‫از راست به چپ‬

‫‪3‬‬

‫‪* / %‬‬

‫از چپ به راست‬

‫‪4‬‬

‫‪+ -‬‬

‫از چپ به راست‬

‫‪5‬‬

‫>> <<‬

‫از چپ به راست‬

‫‪6‬‬

‫>= > <= <‬

‫از چپ به راست‬

‫‪7‬‬

‫=! ==‬

‫از چپ به راست‬

‫‪8‬‬

‫&&‬

‫از چپ به راست‬

‫‪9‬‬

‫||‬

‫از چپ به راست‬

‫‪10‬‬

‫‪?:‬‬

‫از راست به چپ‬

‫‪11‬‬

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

‫از راست به چپ‬

‫‪12‬‬

‫‪,‬‬

‫از چپ به راست‬

‫‪ 7-6‬خواندن و نمایش اطالعات‬
‫‪‬‬

‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫همانطور كه قبال نیز گفته شد‪ ،‬یكی از اهداف زبان ‪ C‬قابل حمل بودن آن‬
‫است‪ .‬بهمین منظور سعی شده است كه از دستوراتی كه ممكن است‬
‫وابسته به ماشین خاصی باشد‪ ،‬اجتناب گردد‪.‬‬
‫بهمین دلیل زبان ‪ C‬برخالف سایر زبانها دارای هیچ دستوری برای‬
‫خواندن از ورودی و یا نوشتن در خروجی نیست‪.‬‬
‫اما در عوض دارای تعدادی تابع )زیربرنامه( استاندارد می باشد كه تقریبا‬
‫تمامی كامپایلرها از آنها حمایت می كنند‪.‬‬
‫این كار به كامپایلر این امكان را می دهد كه بر حسب نوع سخت افزار‬
‫موردنظر‪ ،‬توابع ورودی و خروجی را طراحی نماید‪.‬‬
‫این توابع در یك فایل سرآمد بنام ‪ stdio.h‬تعریف شده اند و بنابراین قبل‬
‫ازاینكه بتوانید از این توابع استفاده نمایید‪ ،‬باید این فایل را نیز با استفاده‬
‫از ‪ #include‬در برنامه خود بگنجانید‪.‬‬

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫برای نمایش اطالعات در خروجی از تابع ‪ printf‬استفاده می شود‪.‬‬
‫این تابع رشته موردنظر شما را به خروجی استاندارد )كه در حالت‬
‫عادی همان صفحه نمایش یا مانیتور است( می فرستد‪ .‬شكل كلی این‬
‫تابع بصورت زیر است‪:‬‬
‫; )>لیست متغیرها< ‪> ,‬رشته كنترلی<(‪printf‬‬
‫رشته كنترلی همان متنی است كه قصد چاپ آن را داریم‪ ،‬با ذكر این‬
‫نكته كه در قسمتهایی كه باید مقدار یك متغیر چاپ شود‪ ،‬از یك‬
‫مشخصه تبدیل استفاده می شود‪ .‬هر مشخصه تبدیل از یك عالمت ‪%‬‬
‫بعالوه یك كاراكتر كه نوع متغیر مورد نظر را نشان می دهد تشكیل می‬
‫گردد‪.‬‬
‫لیست متغیرها نیز همان متغیرهایی هستند كه قصد چاپ آنها را داریم‪.‬‬
‫این متغیرها باید بترتیب قرار گرفته و با كاما )‪ (,‬از یكدیگر جدا شوند‪.‬‬

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫مشخصه تبدیل‬

‫مفهوم‬

‫‪%c‬‬

‫كاراكتر‬

‫‪%d‬‬

‫عدد صحیح در مبنای ‪10‬‬

‫‪%f‬‬

‫عدد اعشاری بدون نماد علمی‬

‫‪%e‬‬

‫عدد اعشاری با نماد علمی‬

‫‪%g‬‬

‫عدد اعشاری با حالت كوتاهتر بین ‪ e‬و ‪f‬‬

‫‪%s‬‬

‫رشته‬

‫‪%ld‬‬

‫عدد صحیح بزرگ‬

‫‪%lf %le %lg‬‬

‫عدد اعشاری بزرگ‬

‫‪%o‬‬

‫عدد صحیح در مبنای ‪8‬‬

‫‪%x‬‬

‫عدد صحیحی در مبنای ‪16‬‬

‫‪%u‬‬

‫عدد صحیح بدون عالمت‬

‫ تابع نمایش در خروجی‬7-6-1
#include
void main() {
int age = 20;
floate average = 18.23;
printf("You are %d years old and your average is %f \n",age,average);
}
You are 20 years old and your average is 18.230000

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫‪‬‬
‫‪‬‬

‫برای کنترل نحوه چاپ اعداد می توانید از مشخصه طول میدان استفاده‬
‫کنید‪.‬‬
‫مشخصه طول میدان برای اعداد به شكل زیر استفاده می شود‪:‬‬
‫‪ ‬برای اعداد صحیح از ‪ %nd‬استفاده می كنیم كه ‪ n‬تعداد ارقام را نشان‬
‫می دهد )مثال ‪ .(%3d‬در اینصورت برای هر متغیر ‪ n‬رقم درنظر گرفته‬
‫می شود‪ .‬اگر اندازه عدد از ‪ n‬كوچكتر باشد‪ ،‬به سمت چپ آن فضای‬
‫خالی اضافه می شود و اگر اندازه عدد بیش از ‪ n‬رقم باشد‪ ،‬طول میدان‬
‫نادیده گرفته شده و عدد بطور كامل چاپ می شود‪.‬‬
‫‪ ‬برای اعداد اعشاری از ‪ %n.mf‬استفاده می كنیم كه ‪ n‬اندازه كل عدد‬
‫)شامل عالمت ممیز( و ‪ m‬تعداد ارقام اعشار است )مثال ‪ .(%5.2f‬در‬
‫صورتیكه تعداد ارقام اعشاری عدد موردنظر از ‪ m‬بیشتر باشد‪ ،‬عدد به ‪m‬‬
‫عدد اعشار گرد می شود و در صورتیكه از ‪ m‬كمتر باشد‪ ،‬در سمت‬
‫راست آن ‪ 0‬قرار داده می شود‪.‬‬

‫‪ 7-6-2‬تابع خواندن از ورودی‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای خواندن اطالعات از ورودی از تابع ‪ scanf‬استفاده می شود‪.‬‬
‫این تابع اطالعات را ازورودی استاندارد )معموال صفحه كلید( خوانده و در‬
‫متغیرهای تعیین شده قرار می دهد‪.‬‬
‫شكل كلی این تابع بصورت زیر است‪:‬‬
‫; )>لیست آدرسهای متغیرها< ‪> ,‬رشته كنترلی<(‪scanf‬‬
‫همانطور كه می بینید نحوه احضار تابع ‪ scanf‬نیز مشابه ‪ printf‬است‪ .‬تنها‬
‫تفاوت در آن است كه در ‪ scanf‬باید لیست آدرسهای متغیرها ارسال شود‪.‬‬
‫مبحث مربوط به آدرسها در فصول بعدی بررسی خواهد شد ولی در حال حاضر‬
‫بخاطر بسپارید كه برای بدست آوردن آدرس یك متغیر از عالمت & استفاده می‬
‫كنیم‪ .‬بعنوان مثال ‪ &age‬بمعنای آدرس متغیر ‪ age‬است‪.‬‬
‫بطور كلی در ‪ C‬قدیمی هرگاه كه یك تابع دارای پارامترهای خروجی بود )یعنی‬
‫پارامترهایی كه یك مقدار را باز می گرداندند( از آدرس متغیرها استفاده می‬
‫شد كه امروزه این مسئله وجود ندارد‪.‬‬

‫ تابع خواندن از ورودی‬7-6-2
#include
void main() {
int age;
float average ;
printf("Please enter your age and average : ");
scanf("%d %f",&age,&average);
printf("You are %d years old and your average is %5.2f \n",age,average);
}

Please enter your age and average : 19 16.72
You are 19 years old and your average is 16.72

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫زبان ‪ C++‬یک زبان شی گرا است‪ ،‬بهمین دلیل در این زبان برای ورودی‬
‫و خروجی از اشیاء بجای توابع استفاده می گردد‪.‬‬
‫از آنجا که امروزه معموال برنامه نویسان ‪ C‬از کامپایلرهای ‪ C++‬استفاده‬
‫می کنند‪ ،‬می توانند از اشیای ورودی و خروجی آن نیز استفاده کنند‪.‬‬
‫اینکار در بین بسیاری از برنامه نویسان ‪ C‬متداول است‪ ،‬بهمین دلیل ما‬
‫در اینجا نحوه کار با اشیای خواندن و نوشتن در ‪ C++‬را بطور مقدماتی‬
‫توضیح می دهیم؛ گرچه توضیح کامل این موارد نیاز به آشنایی با شی‬
‫گرایی و زبان ‪ C++‬دارد‪.‬‬
‫قبل از هرچیز الزم به ذکر است که کلیه اشیای مربوط به ورودی و‬
‫خروجی در فایل سرآمدی بنام ‪ iostream.h‬تعیریف شده اند‪ ،‬بنابراین‬
‫ابتدا باید این فایل به برنامه توسط دستور ‪ #include‬الحاق گردد‪.‬‬

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫زبان ‪ C++‬برای نمایش اطالعات از یک شیئ بنام ‪ cout‬استفاده می نماید‪.‬‬
‫برای ارسال اطالعات مورد نظر برای چاپ به ‪ cout‬باید از عملگر درج در جریان‬
‫یا >> استفاده نماییم‪ .‬بعنوان مثال ‪:‬‬
‫; ” ‪cout >> “Please enter your name:‬‬
‫و یا مثال دیگر ‪:‬‬
‫;‪int a = 10‬‬
‫;‪float b = 2.86‬‬
‫;‪cout << a‬‬
‫;‪cout << b‬‬
‫نکته جالبی که در این مثالها دیده می شود‪ ،‬آنستکه برخالف تابع ‪ printf‬هیچ‬
‫نیازی به مشخص کردن نوع متغیری که قصد چاپ آن را داریم نیست و خود‬
‫شئ ‪ cout‬نوع آن را تشخیص می دهد‪.‬‬
‫عالوه براین می توان چندین عملگر درج در جریان را با یکدیگر الحاق کرد و‬
‫چندین متغیر را با یک دستور چاپ کرد‪.‬‬

C++ ‫ ورودی و خروجی اطالعات در‬7-6-3
#include
void main() {
int age = 20;
floate average = 18.23;
cout >> “You are ” >> age >> “ years old and your average is ” >> average ;
}

You are 20 years old and your average is 18.230000

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای دریافت اطالعات از کاربر‪ ،‬از شئ دیگری بنام ‪ cin‬استفاده می شود‪.‬‬
‫برای ارسال متغیر مورد نظر به ‪ cin‬باید از عملگر استخراج از جریان یا <<‬
‫استفاده نماییم‪ .‬بعنوان مثال‪:‬‬
‫;‪int a‬‬
‫;‪cin >> a‬‬
‫بازهم همانطور که می بینید نیازی به تعیین نوع متغیر موردنظر نیست و خود‬
‫شئ ‪ cin‬نوع متغیر را بطور اتوماتیک تشخیص داده و داده ای از همان نوع را از‬
‫کاربر دریافت و در متغیر مورد نظر قرار می دهد‪.‬‬
‫عملگرهای استخراج از جریان را نیز می توان با یکدیگر الحاق کرد‪.‬‬
‫برای رفتن به خط بعد در شئ ‪ cout‬می توان از دستکاری کننده ‪ endl‬استفاده‬
‫کرد‪ .‬مثال در دستور زیر پس از چاپ پیغام‪ ،‬مکان نما به خط بعد منتقل می‬
‫شود‪:‬‬
‫;‪cout >> “List of students : “ >> endl‬‬
‫البته دستکاری کننده های متعدد دیگری نیز ازجمله موارد مربوط به تعیین طول‬
‫میدان و نحوه چاپ مقادیر وجود دارد که توضیح آنها نیاز به یک مبحث مستقل‬
‫دارد‪.‬‬

C++ ‫ ورودی و خروجی اطالعات در‬7-6-3
#include
void main() {
int age;
float average ;
cout << "Please enter your age and average : " ;
cin >> age >> average ;
cout << "You are " << age << "years old and your average is " << average;
}

Please enter your age and average : 19 16.72
You are 19 years old and your average is 16.72

‫‪ 7-7‬توابع کتابخانه ای‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫همانطور که قبال نیز گفته شد‪ ،‬زبان ‪ C‬از زیر برنامه ها نیز حمایت می کند‪ .‬هر زیر برنامه‬
‫در ‪ C‬یک تابع نامیده می شود‪ .‬تا کنون با توابعی همچون ‪ main‬و یا ‪ printf‬و ‪ scanf‬آشنا‬
‫شده ایم‪.‬‬
‫معموال عرضه کنندگان کامپایلرها و یا سایر فروشندگان نرم افزار‪ ،‬برخی از توابع عمومی‬
‫را که ممکن است مورد نیاز جمع کثیری از برنامه نویسان مختلف باشد را در قالب‬
‫کتابخانه ای از توابع در اختیار برنامه نویسان می گذارند‪ .‬بعضی از این توابع کتابخانه ای‬
‫مانند ‪ printf‬و ‪ scanf‬بصورت استاندارد درآمده و توسط عرضه کنندگان مختلف ارائه می‬
‫شوند‪.‬‬
‫در کامپایلر عرضه شده توسط شرکت بورلند )‪ (Borland C++ 3.1‬نیز کتابخانه های‬
‫متعددی از توابع برای شما عرضه شده اند که بتدریج با آنها و کاربردشان آشنا خواهید‬
‫شد‪.‬‬
‫نکته مهم آنستکه برای استفاده از این توابع ابتدا باید فایل سرآمد مربوط به آنها را نیز در‬
‫ابتدای برنامه خود اضافه نمایید ) با استفاده از ‪ .(#include‬هر فایل سرآمد شامل تعاریف‬
‫اولیه گروهی از توابع مرتبط با هم و داده های مربوط به آنها بوده و در استاندارد قدیمی‬
‫تر دارای پسوند ‪ .h‬می باشد)در استاندارد جدید پسوند این فایلها حذف شده است(‪.‬‬
‫برخی از این فایلهای سرآمد عبارتند از‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪ : stdio.h‬توابع ورودی و خروجی استاندارد‬
‫‪ : math.h‬توابع ریاضی‬
‫‪ : graphics.h‬توابع مربوط به عملیات گرافیکی‬
‫‪ : string.h‬توابع مربوط به کار با رشته ها‬


Slide 24

‫مبانی کامپیوتر و برنامه سازی‬
‫فصل هفتم ‪ :‬مفاهیم اولیه زبان ‪C‬‬
‫مدرس ‪ :‬نگین معروفی‬

‫‪ 7-1‬شناسه ها در ‪C‬‬
‫‪‬‬
‫‪‬‬

‫شناسه )‪ (identifier‬نامی است که به یک قسمت از برنامه مانند متغیر‪ ،‬تابع‪ ،‬ثابت و یا‬
‫‪ ...‬داده می شود‪.‬‬
‫در زبان ‪ C‬برای انتخاب شناسه ها فقط می توان از عالئم زیر استفاده کرد‪:‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫حروف انگلیسی کوچک و بزرگ )‪(A…Z a…z‬‬
‫ارقام )‪(0…9‬‬
‫عالمت خط پایین یا _‬

‫البته یک شناسه نمی تواند با یک رقم شروع شود‪.‬‬
‫چند شناسه مجاز‪ name2 ، average ، sum :‬و ‪student_average‬‬
‫چند شناسه غیرمجاز ‪ 2name‬و یا ‪student average‬‬
‫در برنامه نویسی امروزی پیشنهاد می شود بجای شناسه هایی همانند‬
‫‪ student_average‬از ‪ studentAverage‬استفاده گردد‪.‬‬
‫نکته مهم دیگری که باید به آن اشاره کرد آنستکه زبان ‪ C‬برخالف بسیاری از زبانهای دیگر‬
‫به کوچک و بزرگی حروف حساس است )‪ .(case sensitive‬در نتیجه شناسه های زیر با‬
‫یکدیگر متفاوتند ‪:‬‬
‫‪Sum ≠ sum ≠ SUM‬‬
‫آخرین نکته اینستکه در هنگام انتخاب شناسه نمی توانید از کلمات کلیدی که برای‬
‫منظورهای خاص در زبان ‪ C‬رزرو شده اند استفاده کنید‪.‬‬

C ‫ شناسه ها در‬7-1
: C ‫کلمات کلیدی در زبان‬
auto

break

case

char

const

continue

default

do

double

else

enum

extern

float

for

goto

if

int

long

register

return

short

signed

sizeof

static

struct

switch

typedef

union

unsigned

void

volatile

while

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫محدوده‬

‫اندازه )بیت(‬

‫توضیح‬

‫نوع داده‬

‫‪-128 to +127‬‬

‫‪8‬‬

‫کاراکتر‬

‫‪char‬‬

‫‪-32768 to +32767‬‬

‫‪16‬‬

‫عدد صحیح‬

‫‪int‬‬

‫‪3.4e-38 to 3.4e+38‬‬

‫‪32‬‬

‫عدد اعشاری‬

‫‪float‬‬

‫‪1.7e-308 to 1.7e+308‬‬

‫‪64‬‬

‫عدد اعشاری با‬
‫دقت مضاعف‬

‫‪double‬‬

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫‪‬‬

‫البته چند نکته مهم درمورد این جدول قابل ذکر است ‪:‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫اندازه ‪ int‬در محیطهای ‪ 16‬بیتی مانند ‪ DOS‬برابر ‪ 16‬بیت است‪ .‬اما در‬
‫محیطهای ‪ 32‬بیتی همانند ‪ Windows‬اندازه آن ‪ 32‬بیت می باشد که در‬
‫اینصورت محدوده ای برابر ‪ -2,147,483,648‬تا ‪ +2,147,483,647‬را‬
‫پوشش می دهد‪.‬‬
‫در بعضی از کامپایلرهای ‪ ،C‬نوع داده ‪ bool‬نیز وجود دارد که می تواند‬
‫یکی از مقادیر ‪)true‬درست( یا ‪) false‬غلط( را نشان دهد ‪ .‬اما در نسخه‬
‫های اولیه ‪ C‬از همان نوع داده صحیح یا ‪ int‬برای اینکار استفاده می‬
‫شد‪ .‬بدین صورت که ‪ 0‬نشاندهنده ‪ false‬و هر عدد غیر صفر )معموال ‪(1‬‬
‫نشاندهنده ‪ true‬است‪.‬‬
‫از آنجا که برای ذخیره سازی کاراکترها کد اسکی آنها ذخیره می گردد‪،‬‬
‫از یک متغیر کاراکتری یا ‪ char‬می توان بعنوان یک عدد صحیح کوچک نیز‬
‫استفاده کرد و اعمال ریاضی برروی آنها نیز مجاز است‪.‬‬

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫عالوه براین چندین اصالح کننده نیز وجود دارد که به ما اجازه می دهد نوع داده مورد‬
‫نظر را با دقت بیشتری برای نیازهای مختلف استفاده نماییم‪.‬‬
‫این اصالح کننده ها عبارتند از ‪short, long, signed, unsigned :‬‬
‫تمام این اصالح کننده ها می توانند به نوع داده ‪ int‬اعمال شوند و اثر آنها بستگی‬
‫به محیط دارد‪.‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫در یک محیط ‪16‬بیتی‪short int ،‬بازهم برابر ‪16‬بیت است ولی ‪ long int‬برابر‪32‬بیت می‬
‫باشد‪.‬‬
‫‪ unsigned int‬باعث می شود که یک عدد ‪ 16‬بیتی بدون عالمت داشته باشیم که بازه‬
‫بین ‪ 0‬تا ‪ 65535‬را پوشش می دهد‪ signed int .‬نیز همانند ‪ int‬معمولی بوده و تفاوتی‬
‫ندارد‪.‬‬
‫ترکیب این اصالح کننده ها نیز ممکن است‪ .‬مثال ‪ unsigned long int‬یک عدد ‪ 32‬بیتی‬
‫بدون عالمت است که بازه ‪ 0‬تا ‪ 4,294,967,295‬را پوشش می دهد‪.‬‬

‫برروی نوع داده ‪ char‬فقط اصالح کننده های ‪ signed‬و ‪ unsigned‬را می توان اعمال‬
‫کرد‪ .‬معموال از اصالح کننده ‪ unsigned‬وقتی استفاده می شود که قصد داشته‬
‫باشیم از ‪ char‬بعنوان یک عدد صحیح مثبت بین ‪ 0‬تا ‪ 255‬استفاده کنیم‪.‬‬
‫برروی نوع داده ‪ double‬تنها اصالح کننده ‪ long‬قابل اعمال است و دراینصورت عدد‬
‫اعشاری با ‪ 80‬بیت را خواهیم داشت که قادر است هر عددی در بازه ‪ 3.4e-4932‬تا‬
‫‪ 1.1e+4932‬را در خود نگاه دارد‪.‬‬

‫‪ 7-3‬تعریف متغیرها‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای تعریف متغیرها به شکل زیر عمل می کنیم‪:‬‬

‫;>‪ ‫که ‪ type‬یکی از نوع داده های گفته شده و ‪ variable-list‬لیستی از متغیرها است‬
‫که با کاما از یکدیگر جدا شده اند‪ .‬بعنوان مثال ‪:‬‬
‫;‪int sum‬‬
‫;‪float average‬‬
‫; ‪long int a, b, c‬‬
‫; ‪unsigned long int i, j, k‬‬
‫عالوه براین می توان در هنگام تعریف متغیر به آن مقدار اولیه نیز داد‪ .‬مثال ‪:‬‬
‫; ‪int d = 0‬‬
‫نكته مهم آنكه زبان ‪ C‬به متغیرها مقدار اولیه نمي دهد )حتي ‪ (0‬و برنامه نويس‬
‫خود بايد اينكار را صريحا انجام دهد‪ ،‬درغیر اينصورت مقدار اولیه متغیر‪ ،‬نامعین خواهد‬
‫بود‪.‬‬
‫تعریف متغیرها طبق اصول زبان ‪ C‬میتواند درهرجایی از برنامه صورت پذیرد‪ ،‬و‬
‫متغیرهای تعریف شده از همان خط به بعد قابل استفاده خواهد بود‪ .‬اما معموال‬
‫توصیه می گردد كه تعریف متغیرها در همان خط ابتدایی تابع و بالفاصله پس از {‬
‫صورت پذیرد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫‪‬‬
‫‪‬‬

‫ثابتها مقادیر ثابتی هستند كه مقدار آنها در حین اجرای برنامه تغییر نمی یابد‪ .‬ثابتها می توانند از‬
‫هریك از نوع داده های اصلی باشند‪.‬‬
‫ثوابت عددی صحیح ‪:‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫برای نمایش این دسته از ثوابت‪ ،‬از دنباله ای از ارقام بعالوه عالمت ‪ +‬یا ‪ -‬استفاده می كنیم‪ .‬بعنوان مثال‬
‫‪ -45‬و یا ‪ 3489‬ثوابت صحیح هستند‪.‬‬
‫در حالت عادی ‪ C‬هر عدد را در كوچكترین نوع داده ای كه می تواند قرار می دهد‪ .‬مثال عدد ‪ 85‬در یك‬
‫‪ int‬قرار می گیرد‪ ،‬اما عدد ‪ 145398‬در یك ‪ long int‬قرار خواهد گرفت‪.‬‬
‫اگر قصد دارید یك عدد كوچك بعنوان ‪ long‬محسوب گردد‪ ،‬می توانید از پسوند ‪ L‬در انتهای آن استفاده‬
‫می كنیم‪ .‬مثال ‪245L‬یك عدد ‪ long‬محسوب می شود‪.‬‬
‫;‪long int a = 20L‬‬
‫پسوند ‪ U‬در انتهای عدد نیز نشانه بدون عالمت بودن آن است‪.‬‬
‫نكته دیگر آنكه ‪ C‬به شما اجازه می دهد درصورت لزوم ثوابت صحیح خود را در مبنای ‪ 8‬یا ‪ 16‬نیز كه‬
‫از مبناهای متداول در برنامه نویسی هستند‪ ،‬بنویسید‪.‬‬
‫‪‬‬
‫‪‬‬

‫برای نوشتن عدد در مبنای ‪ 8‬باید آن را با ‪ 0‬آغاز كنید‪ ،‬مثال ‪ 0342‬یك عدد در منای ‪ 8‬محسوب می‬
‫گردد‪.‬‬
‫برای نوشتن یك عدد در مبنای ‪ 16‬باید آن را با ‪ 0x‬آغاز نمایید‪ ،‬مانند ‪.0x27A4‬‬

‫‪ 7-4‬ثوابت‬
‫ثوابت عددی اعشاری‬

‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫برای نمایش اعداد اعشاری‪ ،‬باید از نقطه اعشار استفاده كنیم‪ ،‬مانند ‪237.45‬‬
‫اما نكته جالب آنستكه می توانید از نماد علمی نیز برای نمایش اعداد‬
‫اعشاری استفاده كنید‪ .‬برای اینكار كافی است از حرف ‪ e‬برای نمایش قسمت‬
‫توان استفاده نمایید‪ .‬بعنوان مثال ‪:‬‬
‫‪-23.47 × 10 5 = -23.47e5‬‬
‫‪42.389 × 10 -3 = 42.389e-3‬‬
‫دقت كنید كه قسمت توان‪ ،‬حتما یك عدد صحیح است‪.‬‬
‫نكته جالب اینجاست كه برخالف مورد قبل‪ ،‬كامپایلر بطور پیش فرض داده های‬
‫اعشاری را از نوع ‪ double‬فرض می كند‪.‬چنانچه دوست دارید ثابت شما ازنوع‬
‫‪ float‬درنظر گرفته شود‪ ،‬در انتهای آن ‪ F‬قرار دهید‪ .‬ضمنا پسوند ‪ L‬نیز داده‬
‫اعشاری را از نوع ‪ long double‬درنظر می گیرد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫ثوابت كاراكتری ‪:‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫برای نشان دادن ثوابت كاراكتری‪ ،‬آنها را در داخل ' قرار می دهیم‪ .‬بعنوان مثال‬
‫'‪'A‬یك ثابت كاراكتری است‪.‬‬
‫; '‪char ch = 'S‬‬
‫دقت كنید كه همانطور كه قبال گفته شد‪ ،‬كد اسكی كاراكترها در متغیر ذخیره‬
‫می گردد‪ ،‬بنابراین می توان از آن بعنوان یك عدد صحیح نیز استفاده كرد‪ .‬نكته‬
‫مهم دیگر آنستكه به تفاوت عدد ‪ 5‬و كاراكتر '‪ '5‬دقت داشته باشید‪ .‬در حقیقت‬
‫'‪ '5‬برابر است با عدد ‪ 53‬كه همان كد اسكی آن است‪.‬‬
‫روش فوق‪ ،‬برای نمایش کاراکترهای قابل چاپ مناسب است‪ ،‬اما بعضی‬
‫كاراكترها مانند ‪ enter‬قابل نمایش نبوده و برای آنها شکل خاصی وجود ندارد‪.‬‬
‫در چنین مواردی‪ ،‬زبان ‪ C‬از ترکیب عالمت \ به همراه یک کاراکتر دیگر‪ ،‬برای‬
‫نمایش این قبیل کاراکترها استفاده می نماید‪ .‬بعنوان مثال‪ ،‬کاراکتر '‪ '\n‬نشان‬
‫دهنده خط جدید یا همان ‪ enter‬می باشد‪.‬‬
‫جدول صفحه بعد این قبیل کاراکترها و معادل آنها را نشان می دهد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫نحوه نمایش در ‪C‬‬

‫کد اسکی‬

‫صدای بوق کامپیوتر‬

‫‪\a‬‬

‫‪7‬‬

‫حرکت به عقب ‪backspace‬‬

‫‪\b‬‬

‫‪8‬‬

‫شروع صفحه ‪form feed‬‬

‫‪\f‬‬

‫‪12‬‬

‫سطر جدید ‪line feed‬‬

‫‪\n‬‬

‫‪10‬‬

‫برگشت به ابتداي سطر ‪carriage return‬‬

‫‪\r‬‬

‫‪13‬‬

‫فاصله افقی ‪horizontal tab‬‬

‫‪\t‬‬

‫‪9‬‬

‫فاصله عمودی ‪vertical tab‬‬

‫‪\v‬‬

‫‪11‬‬

‫عالمت سوال‬

‫?\‬

‫‪63‬‬

‫عالمت '‬

‫'\‬

‫‪39‬‬

‫عالمت "‬

‫"\‬

‫‪34‬‬

‫عالمت \‬

‫\\‬

‫‪92‬‬

‫عالمت تهی‬

‫‪\0‬‬

‫‪0‬‬

‫نام کاراکتر‬

‫کد اسکی یک کاراکتر با ‪ 3‬رقم در مبنای ‪8‬‬

‫‪\000‬‬

‫کد اسکی یک کاراکتر با ‪ 2‬رقم در مبنای ‪16‬‬

‫‪\x00‬‬

‫‪ 7-4‬ثوابت‬
‫‪‬‬

‫ثوابت رشته ای ‪ C :‬عالوه بر ثوابت فوق‪ ،‬از یك ثابت دیگر بنام رشته نیز‬
‫حمایت می كند‪ .‬رشته‪ ،‬دنباله ای از كاراكترها است كه در داخل " قرار‬
‫می گیرند‪ .‬بعنوان مثال "‪ "this is a test‬یك رشته است‪ .‬دقت كنید كه '‪'a‬‬
‫یك كاراكتر است‪ ،‬اما "‪ "a‬یك رشته است كه فقط شامل یك كاراكتر می‬
‫باشد‪.‬‬

‫‪ 7-5‬عملگرها‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫عملگر‪ ،‬نمادی است كه به كامپایلر می گوید تا عملیات محاسباتی یا‬
‫منطقی خاصی را برروی یك یا چند عملوند‪ ،‬انجام دهد‪.‬‬
‫به عملگرهایی كه فقط یك عملوند دارند‪ ،‬عملگر یكانی می گوییم و‬
‫همواره عملگر در سمت چپ عملوند قرار می گیرد)مانند عدد ‪.(-125‬‬
‫اما عملگرهایی كه برروی دو عملوند اثر می كنند را عملگر دودویی‬
‫نامیده و عملگر را بین دو عملوند قرار می دهیم )مانند ‪.(23+86‬‬
‫هر ترکیب درستی از عملگرها و عملوندها را یک عبارت می نامیم‪.‬‬
‫‪ C‬از نقطه نظر عملگرها یك زبان بسیار قوی است‪ .‬این عملگرها به چند‬
‫دسته اصلی تقسیم می گردند كه آنها را به ترتیب بررسی می كنیم‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫این عملگرها‪ ،‬همان اعمال متداول ریاضی هستند كه در زبان ‪ C‬مورد استفاده‬
‫قرار می گیرند‪ .‬این اعمال عبارتند از ‪:‬‬

‫عمل‬

‫نوع‬

‫عملگر‬

‫منفی كردن عملوند سمت راست‬

‫یكانی‬

‫‪-‬‬

‫جمع دو عملوند‬

‫دودویی‬

‫‪+‬‬

‫تفریق دو عملوند‬

‫دودویی‬

‫‪-‬‬

‫ضرب دو عملوند‬

‫دودویی‬

‫*‬

‫تقسیم دو عملوند‬

‫دودویی‬

‫‪/‬‬

‫محاسبه باقیمانده تقسیم دو عملوند‬

‫دودویی‬

‫‪%‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬
‫‪‬‬

‫این عملگرهای برروی همه انواع داده های ‪ C‬عمل می كنند‪ ،‬بجز عملگر ‪ %‬كه فقط‬
‫برروی نوع داده های صحیح عمل می كند‪.‬‬
‫اما نكته مهمی كه باید به آن اشاره كرد‪ ،‬نحوه كار عملگر تقسیم برروی نوع داده های‬
‫مختلف است‪.‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫درصورتیكه هردو عملوند صحیح باشند‪ ،‬تقسیم بصورت صحیح بر صحیح انجام خواهد شد‪.‬‬
‫اگر یكی یا هر دو عملوند اعشاری باشند‪ ،‬تقسیم بصورت اعشاری انجام خواهد پذیرفت‪.‬‬
‫فرض كنید تعاریف زیر را داریم ‪:‬‬
‫; ‪int a,b‬‬
‫; ‪float c,d‬‬
‫; ‪a = 10 ; b = 4‬‬
‫;‪c = 8.2; d = 4.0‬‬
‫اكنون به نتایج عملیات زیر دقت كنید ‪:‬‬
‫‪a / b => 2‬‬
‫‪c / d => 2.05‬‬
‫‪a / d => 2.5‬‬
‫‪a / 4 => 2‬‬
‫چنانچه به آخرین مورد توجه كنید‪ ،‬متوجه می شوید كه از آنجا كه ‪a‬یك متغیر صحیح است و ‪4‬‬
‫نیز یك ثابت صحیح در نظر گرفته شده‪ ،‬درنتیجه تقسیم بصورت صحیح بر صحیح انجام گرفته‬
‫است‪ .‬چنانچه بخواهیم تقسیم بصورت اعشاری صورت پذیرد‪ ،‬به دو شكل می توانیم عمل‬
‫كنیم‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫برای اینکه عبارت تقسیم صفحه قبل بصورت اعشاری انجام شود‪ ،‬به دو روش‬
‫می توان عمل کرد‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫این عبارت را بصورت ‪ a / 4.0‬بنویسیم‪.‬‬
‫از عملگر قالب ریزی استفاده كنیم‪.‬‬

‫عملگر قالب ریزی می تواند یك نوع را به نوع دیگری تبدیل نماید‪ .‬شكل كلی آن‬
‫به شكل زیر است ‪:‬‬
‫>‪() ‫كه ‪ type‬نوع مورد نظر است كه قصد تبدیل عبارت ‪ expression‬به آن نوع را‬
‫داریم‪ .‬بعنوان مثال در مورد قبلی می توان به شكل زیر عمل كرد ‪:‬‬
‫‪(float) a / 4‬‬
‫در این حالت از كامپایلر خواسته ایم كه ابتدا عدد ‪ a‬را به اعشاری تبدیل كند‬
‫)البته بصورت موقت( و سپس آن را بر ‪ 4‬تقسیم نماید‪ ،‬كه مسلما حاصل‬
‫اعشاری خواهد بود‪.‬‬
‫بطوركلی هرگاه ثابتها و متغیرهایی از انواع مختلف در یك عبارت محاسباتی‬
‫داشته باشیم‪ ،‬كامپایلر ‪ C‬همه آنها را به یك نوع یكسان كه همان بزرگترین‬
‫عملوند موجود است تبدیل خواهد كرد‪ .‬بعنوان مثال به مورد صفحه بعد دقت‬
‫كنید ‪:‬‬

‫ عملگرهای محاسباتی‬7-5-1
char ch;
int i;

float f;
double d;
result = (ch / i)
int

+

(f *d)

(f+i)
float

double

double

int

-

double

double

float

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫اولویت عملگرها ‪ :‬در عبارتی که شامل چندین عملگر است‪ ،‬کدامیک در‬
‫ابتدا اعمال خواهد گردید‪.‬‬
‫اولویت عملگرهای محاسباتی از باال به پایین بشرح زیر است‪:‬‬
‫‪ ‬عملگر یکانی –‬
‫‪ ‬عملگرهای * و ‪ /‬و ‪%‬‬
‫‪ ‬عملگرهای ‪ +‬و –‬
‫چنانچه اولویت دو عملگر یکسان باشد‪ ،‬این عملگرها از چپ به راست‬
‫محاسبه خواهند شد‪.‬‬
‫چنانچه بخواهیم یک عمل با اولویت پایین زودتر انجام شود‪ ،‬باید از پرانتز‬
‫استفاده کنیم‪ .‬بنابراین اولویت عملگر پرانتز از همه موارد فوق‬
‫بیشتراست‪ .‬در مورد پرانتزهای متداخل‪ ،‬ابتدا پرانتز داخلی محاسبه‬
‫می شود؛ اما در مورد پرانتزهای هم سطح‪ ،‬ابتدا پرانتز سمت چپتر‬
‫محاسبه می گردد‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫چند مثال در مورد اولویت عملگرها‬

‫ترتیب اجرای عملگرها‬

‫عبارت زبان ‪C‬‬

‫ابتدا عمل * و سپس عمل ‪+‬‬

‫‪b+c*d‬‬

‫ابتدا عمل ‪ +‬و سپس عمل *‬

‫‪(b + c) * d‬‬

‫ابتدا عمل ‪ /‬سپس عمل * و در انتها عمل ‪+‬‬

‫‪b+c/d*e‬‬

‫ابتدا عمل * سپس عمل ‪ /‬و در انتها عمل ‪+‬‬

‫)‪b + c / (d * e‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫یک مثال کامل در مورد اولویت عملگرها‬

‫‪result = a + b * (f – (g + b) / d) – c * (a – d) / e‬‬
‫‪6‬‬

‫‪1‬‬
‫‪7‬‬

‫‪2‬‬

‫‪8‬‬

‫‪3‬‬
‫‪4‬‬
‫‪5‬‬
‫‪9‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫در زبان ‪ C‬برای انتساب چندین عملگر وجود دارد‪ .‬ساده ترین عملگر انتساب‪ ،‬همان عملگر =‬
‫است که در بسیاری از زبانها استفاده می شود‪ .‬بعنوان مثال ‪:‬‬
‫;‪a = 5‬‬
‫;‪b = c + 2 * d‬‬
‫این عملگر باعث می شود که عبارت سمت راست در عبارت سمت چپ قرار گیرد‪.‬‬
‫توجه کنید که مقدار سمت چپ باید عبارتی باشد که بتوان به آن یک مقدار را نسبت داد‬
‫)مانند یک متغیر( که به آن ‪ Lvalue‬گفته می شود‪ ،‬بنابراین یک ثابت نمی تواند در سمت چپ‬
‫قرار گیرد‪.‬‬
‫نکته دیگر اینکه اولویت عملگر = از عملگرهای ریاضی کمتر است و درنتیجه ابتدا آن عملیات‬
‫انجام شده و در پایان حاصل در عبارت سمت چپ ریخته می شود‪.‬‬
‫الزم به ذکر است که در هنگام انتساب‪ ،‬درصورت لزوم نوع عبارت سمت راست به نوع عبارت‬
‫سمت چپ تبدیل می شود‪ .‬مثال‪:‬‬
‫;‪int a‬‬
‫;‪a = 2.5 * 5.0‬‬
‫که دراینصورت عدد ‪ 12‬در ‪ a‬ذخیره خواهد شد‪.‬‬
‫شرکت پذیری این عملگر از راست به چپ می باشد‪ ،‬بدین معنا که چنانچه چندین عملگر‬
‫نسبت دهی داشته باشیم‪ ،‬این عملگرها از راست به چپ محاسبه می شوند‪ .‬مثال پس از‬
‫اجرای دستور زیر‪ ،‬مقدار هر ‪ 3‬متغیر برابر ‪ 10‬خواهد شد‪.‬‬
‫;‪a = b = c = 10‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬

‫نکته جالب درمورد زبان ‪ C‬آنستکه دارای یک سری عملگرهای انتساب‬
‫خالصه شده است که باعث می شوند در بعضی موارد بتوانیم عبارات‬
‫کوتاهتری را بنویسیم‪ .‬این عملگرها عبارتند از ‪:‬‬
‫عملگرد‬

‫مثال‬

‫عبارت انتساب معادل‬

‫‪++‬‬

‫;‪a ++‬‬

‫;‪a = a + 1‬‬

‫‪--‬‬

‫;‪a --‬‬

‫;‪a = a – 1‬‬

‫=‪+‬‬

‫;‪a += 5‬‬

‫;‪a = a + 5‬‬

‫=‪-‬‬

‫;‪a -= 8‬‬

‫;‪a= a – 8‬‬

‫=*‬

‫;‪a *= 10‬‬

‫;‪a= a * 10‬‬

‫=‪/‬‬

‫;‪a /= 2‬‬

‫;‪a = a / 2‬‬

‫=‪%‬‬

‫;‪a %= 10‬‬

‫;‪a = a % 10‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬
‫‪‬‬

‫عملگر اول و دوم‪ ،‬عملگرهای یکانی هستند که بترتیب عملگر افزایش و عملگر کاهش‬
‫نامیده می شوند‪.‬‬
‫نکته جالب آنستکه این دو عملگر به دوصورت مورد استفاده قرار می گیرند‪.‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫در حالتی که از دستور ;‪ a ++‬استفاده شود به آن پس افزایش می گویند و بدین معناست که‬
‫ابتدا از مقدار فعلی ‪ a‬در عبارت موردنظر استفاده کن و سپس آن را افزایش بده‪.‬‬
‫اما دستور ;‪ ++ a‬که به آن پیش افزایش گفته می شود‪ ،‬ابتدا ‪ a‬را افزایش داده و سپس از آن‬
‫در عبارت استفاده می کند‪.‬‬
‫به برنامه زیر دقت کنید‪:‬‬

‫>‪#include ‫{ )(‪void main‬‬
‫; ‪int a ,b‬‬
‫;‪a=5‬‬
‫;‪b = a ++‬‬
‫;)‪printf(“a=%d and b=%d \n”,a,b‬‬
‫;‪a=5‬‬
‫;‪b = ++ a‬‬
‫;)‪printf(“a=%d and b=%d \n”,a,b‬‬
‫}‬
‫‪a=6 b=5‬‬
‫‪a=6 b=6‬‬

‫‪ 7-5-3‬عملگرهای مقایسه ای‬
‫‪‬‬

‫‪‬‬

‫این عملگرها دو عبارت را بایکدیگر مقایسه کرده و نتیجه را باز می گردانند‪.‬‬
‫نتیجه می تواند درست )‪ (true‬یا غلط )‪ (false‬باشد‪.‬‬
‫نتیجه این عملگرها یک عدد صحیح است که درصورت درست بودن ‪ 1‬و‬
‫درصورت غلط بودن ‪ 0‬باز می گردانند‪ .‬این عملگرها عبارتند از‪:‬‬
‫عملگر‬

‫مفهوم عملگر‬

‫مثال‬

‫<‬

‫بزرگتر )<(‬

‫‪a>b‬‬

‫>‬

‫کوچکتر )>(‬

‫‪a
‫=<‬

‫بزرگتر یا مساوی )≤(‬

‫‪a >= b‬‬

‫=>‬

‫کوچکتر یا مساوی )≥(‬

‫‪a <= b‬‬

‫==‬

‫مساوی )=(‬

‫‪a == b‬‬

‫=!‬

‫نامساوی )≠(‬

‫‪a != b‬‬

‫‪ 7-5-3‬عملگرهای مقایسه ای‬
‫‪‬‬

‫‪‬‬

‫نکته مهمی که باید به آن دقت کرد عملگر مساوی )==( است‪ ،‬چرا که یک‬
‫اشتباه بسیار متداول برنامه نویسان ‪ C‬استفاده اشتباه از عملگر انتساب‬
‫)=( بجای عملگر تساوی )==( است که باعث ایجاد خطا در برنامه می‬
‫شود‪.‬‬
‫اولویت این عملگرها از باال به پایین بشرح زیر است‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫عملگرهای <‪ <= ، > ،‬و =>‬
‫عملگرهای == و =!‬

‫الزم بذکر است که در هنگام مساوی بودن اولویت چند عملگر‪ ،‬این عملگرها‬
‫از چپ به راست محاسبه می گردند‪.‬‬

‫‪ 7-5-4‬عملگرهای منطقی‬
‫‪‬‬

‫این عملگرها به شما اجازه می دهند که شرطهای ساده ای را که با‬
‫استفاده از عملگرهای مقایسه ای ایجاد شده اند را با یکدیگر ترکیب نموده‬
‫و شرطهای پیچیده تری را بسازید‪ .‬این عملگرها عبارتند از ‪:‬‬
‫مثال‬

‫عملگر‬

‫مفهوم عملگر‬

‫نحوه کار‬

‫&&‬

‫‪ AND‬منطقی‬

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

‫‪a>0 && sw==1‬‬

‫||‬

‫‪ OR‬منطقی‬

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

‫‪a<=100 || b!=0‬‬

‫!‬

‫‪ NOT‬منطقی‬

‫اگر عملوند درست باشد‪ ،‬نادرست و‬
‫اگر نادرست باشد‪ ،‬درست برمی‬
‫گرداند‪.‬‬

‫)‪! (a==1 || b<10‬‬

‫‪ 7-5-5‬عملگر شرطی‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫گاهی الزم است که ابتدا یک شرط بررسی شده و سپس برمبنای نتیجه )درست یا نادرست بودن آن( یکی‬
‫از دو عبارت ممکن بازگردانده شود‪ .‬برای اینکار می توان از یک عملگر ‪3‬تایی )با ‪ 3‬عملوند( بنام عملگر‬
‫شرطی استفاده نمود‪.‬‬
‫شکل کلی این عملگر بصورت زیر است‪:‬‬
‫>عبارت‪> :<2‬عبارت‪> ?<1‬شرط<‬
‫نحوه کار بدینصورت است که درصورت درست بودن شرط‪ ،‬عبارت‪ 1‬و در غیراینصورت عبارت ‪ 2‬بازگردانده می‬
‫شود‪.‬‬
‫به عنوان مثال به دستور زیر توجه کنید‪:‬‬
‫که این عبارت معادل دستور زیر است‪:‬‬

‫‪‬‬

‫;‪a = (k<10) ? 100 : 50‬‬
‫;‪if (k<10) a=100‬‬
‫;‪else a=50‬‬

‫البته این عبارت به شکلهای پیچیده نیز می تواند مورد استفاده قرار گیرد‪ .‬مثال ‪:‬‬
‫;‪c += (a>0 && a<10) ? ++a : a/b‬‬
‫که معادل است با ‪:‬‬
‫{ )‪if (a>0 && a<10‬‬
‫;‪a= a + 1‬‬
‫;‪c = c + a‬‬
‫}‬
‫;‪else c = c + a/b‬‬

‫‪ 7-5-6‬اولویت عملگرها‬
‫عملگر‬

‫اولویت‬

‫شرکت پذیری‬

‫‪1‬‬

‫)(‬

‫از چپ به راست‬

‫‪2‬‬

‫‪- + ! -- ++‬‬

‫از راست به چپ‬

‫‪3‬‬

‫‪* / %‬‬

‫از چپ به راست‬

‫‪4‬‬

‫‪+ -‬‬

‫از چپ به راست‬

‫‪5‬‬

‫>> <<‬

‫از چپ به راست‬

‫‪6‬‬

‫>= > <= <‬

‫از چپ به راست‬

‫‪7‬‬

‫=! ==‬

‫از چپ به راست‬

‫‪8‬‬

‫&&‬

‫از چپ به راست‬

‫‪9‬‬

‫||‬

‫از چپ به راست‬

‫‪10‬‬

‫‪?:‬‬

‫از راست به چپ‬

‫‪11‬‬

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

‫از راست به چپ‬

‫‪12‬‬

‫‪,‬‬

‫از چپ به راست‬

‫‪ 7-6‬خواندن و نمایش اطالعات‬
‫‪‬‬

‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫همانطور كه قبال نیز گفته شد‪ ،‬یكی از اهداف زبان ‪ C‬قابل حمل بودن آن‬
‫است‪ .‬بهمین منظور سعی شده است كه از دستوراتی كه ممكن است‬
‫وابسته به ماشین خاصی باشد‪ ،‬اجتناب گردد‪.‬‬
‫بهمین دلیل زبان ‪ C‬برخالف سایر زبانها دارای هیچ دستوری برای‬
‫خواندن از ورودی و یا نوشتن در خروجی نیست‪.‬‬
‫اما در عوض دارای تعدادی تابع )زیربرنامه( استاندارد می باشد كه تقریبا‬
‫تمامی كامپایلرها از آنها حمایت می كنند‪.‬‬
‫این كار به كامپایلر این امكان را می دهد كه بر حسب نوع سخت افزار‬
‫موردنظر‪ ،‬توابع ورودی و خروجی را طراحی نماید‪.‬‬
‫این توابع در یك فایل سرآمد بنام ‪ stdio.h‬تعریف شده اند و بنابراین قبل‬
‫ازاینكه بتوانید از این توابع استفاده نمایید‪ ،‬باید این فایل را نیز با استفاده‬
‫از ‪ #include‬در برنامه خود بگنجانید‪.‬‬

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫برای نمایش اطالعات در خروجی از تابع ‪ printf‬استفاده می شود‪.‬‬
‫این تابع رشته موردنظر شما را به خروجی استاندارد )كه در حالت‬
‫عادی همان صفحه نمایش یا مانیتور است( می فرستد‪ .‬شكل كلی این‬
‫تابع بصورت زیر است‪:‬‬
‫; )>لیست متغیرها< ‪> ,‬رشته كنترلی<(‪printf‬‬
‫رشته كنترلی همان متنی است كه قصد چاپ آن را داریم‪ ،‬با ذكر این‬
‫نكته كه در قسمتهایی كه باید مقدار یك متغیر چاپ شود‪ ،‬از یك‬
‫مشخصه تبدیل استفاده می شود‪ .‬هر مشخصه تبدیل از یك عالمت ‪%‬‬
‫بعالوه یك كاراكتر كه نوع متغیر مورد نظر را نشان می دهد تشكیل می‬
‫گردد‪.‬‬
‫لیست متغیرها نیز همان متغیرهایی هستند كه قصد چاپ آنها را داریم‪.‬‬
‫این متغیرها باید بترتیب قرار گرفته و با كاما )‪ (,‬از یكدیگر جدا شوند‪.‬‬

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫مشخصه تبدیل‬

‫مفهوم‬

‫‪%c‬‬

‫كاراكتر‬

‫‪%d‬‬

‫عدد صحیح در مبنای ‪10‬‬

‫‪%f‬‬

‫عدد اعشاری بدون نماد علمی‬

‫‪%e‬‬

‫عدد اعشاری با نماد علمی‬

‫‪%g‬‬

‫عدد اعشاری با حالت كوتاهتر بین ‪ e‬و ‪f‬‬

‫‪%s‬‬

‫رشته‬

‫‪%ld‬‬

‫عدد صحیح بزرگ‬

‫‪%lf %le %lg‬‬

‫عدد اعشاری بزرگ‬

‫‪%o‬‬

‫عدد صحیح در مبنای ‪8‬‬

‫‪%x‬‬

‫عدد صحیحی در مبنای ‪16‬‬

‫‪%u‬‬

‫عدد صحیح بدون عالمت‬

‫ تابع نمایش در خروجی‬7-6-1
#include
void main() {
int age = 20;
floate average = 18.23;
printf("You are %d years old and your average is %f \n",age,average);
}
You are 20 years old and your average is 18.230000

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫‪‬‬
‫‪‬‬

‫برای کنترل نحوه چاپ اعداد می توانید از مشخصه طول میدان استفاده‬
‫کنید‪.‬‬
‫مشخصه طول میدان برای اعداد به شكل زیر استفاده می شود‪:‬‬
‫‪ ‬برای اعداد صحیح از ‪ %nd‬استفاده می كنیم كه ‪ n‬تعداد ارقام را نشان‬
‫می دهد )مثال ‪ .(%3d‬در اینصورت برای هر متغیر ‪ n‬رقم درنظر گرفته‬
‫می شود‪ .‬اگر اندازه عدد از ‪ n‬كوچكتر باشد‪ ،‬به سمت چپ آن فضای‬
‫خالی اضافه می شود و اگر اندازه عدد بیش از ‪ n‬رقم باشد‪ ،‬طول میدان‬
‫نادیده گرفته شده و عدد بطور كامل چاپ می شود‪.‬‬
‫‪ ‬برای اعداد اعشاری از ‪ %n.mf‬استفاده می كنیم كه ‪ n‬اندازه كل عدد‬
‫)شامل عالمت ممیز( و ‪ m‬تعداد ارقام اعشار است )مثال ‪ .(%5.2f‬در‬
‫صورتیكه تعداد ارقام اعشاری عدد موردنظر از ‪ m‬بیشتر باشد‪ ،‬عدد به ‪m‬‬
‫عدد اعشار گرد می شود و در صورتیكه از ‪ m‬كمتر باشد‪ ،‬در سمت‬
‫راست آن ‪ 0‬قرار داده می شود‪.‬‬

‫‪ 7-6-2‬تابع خواندن از ورودی‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای خواندن اطالعات از ورودی از تابع ‪ scanf‬استفاده می شود‪.‬‬
‫این تابع اطالعات را ازورودی استاندارد )معموال صفحه كلید( خوانده و در‬
‫متغیرهای تعیین شده قرار می دهد‪.‬‬
‫شكل كلی این تابع بصورت زیر است‪:‬‬
‫; )>لیست آدرسهای متغیرها< ‪> ,‬رشته كنترلی<(‪scanf‬‬
‫همانطور كه می بینید نحوه احضار تابع ‪ scanf‬نیز مشابه ‪ printf‬است‪ .‬تنها‬
‫تفاوت در آن است كه در ‪ scanf‬باید لیست آدرسهای متغیرها ارسال شود‪.‬‬
‫مبحث مربوط به آدرسها در فصول بعدی بررسی خواهد شد ولی در حال حاضر‬
‫بخاطر بسپارید كه برای بدست آوردن آدرس یك متغیر از عالمت & استفاده می‬
‫كنیم‪ .‬بعنوان مثال ‪ &age‬بمعنای آدرس متغیر ‪ age‬است‪.‬‬
‫بطور كلی در ‪ C‬قدیمی هرگاه كه یك تابع دارای پارامترهای خروجی بود )یعنی‬
‫پارامترهایی كه یك مقدار را باز می گرداندند( از آدرس متغیرها استفاده می‬
‫شد كه امروزه این مسئله وجود ندارد‪.‬‬

‫ تابع خواندن از ورودی‬7-6-2
#include
void main() {
int age;
float average ;
printf("Please enter your age and average : ");
scanf("%d %f",&age,&average);
printf("You are %d years old and your average is %5.2f \n",age,average);
}

Please enter your age and average : 19 16.72
You are 19 years old and your average is 16.72

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫زبان ‪ C++‬یک زبان شی گرا است‪ ،‬بهمین دلیل در این زبان برای ورودی‬
‫و خروجی از اشیاء بجای توابع استفاده می گردد‪.‬‬
‫از آنجا که امروزه معموال برنامه نویسان ‪ C‬از کامپایلرهای ‪ C++‬استفاده‬
‫می کنند‪ ،‬می توانند از اشیای ورودی و خروجی آن نیز استفاده کنند‪.‬‬
‫اینکار در بین بسیاری از برنامه نویسان ‪ C‬متداول است‪ ،‬بهمین دلیل ما‬
‫در اینجا نحوه کار با اشیای خواندن و نوشتن در ‪ C++‬را بطور مقدماتی‬
‫توضیح می دهیم؛ گرچه توضیح کامل این موارد نیاز به آشنایی با شی‬
‫گرایی و زبان ‪ C++‬دارد‪.‬‬
‫قبل از هرچیز الزم به ذکر است که کلیه اشیای مربوط به ورودی و‬
‫خروجی در فایل سرآمدی بنام ‪ iostream.h‬تعیریف شده اند‪ ،‬بنابراین‬
‫ابتدا باید این فایل به برنامه توسط دستور ‪ #include‬الحاق گردد‪.‬‬

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫زبان ‪ C++‬برای نمایش اطالعات از یک شیئ بنام ‪ cout‬استفاده می نماید‪.‬‬
‫برای ارسال اطالعات مورد نظر برای چاپ به ‪ cout‬باید از عملگر درج در جریان‬
‫یا >> استفاده نماییم‪ .‬بعنوان مثال ‪:‬‬
‫; ” ‪cout >> “Please enter your name:‬‬
‫و یا مثال دیگر ‪:‬‬
‫;‪int a = 10‬‬
‫;‪float b = 2.86‬‬
‫;‪cout << a‬‬
‫;‪cout << b‬‬
‫نکته جالبی که در این مثالها دیده می شود‪ ،‬آنستکه برخالف تابع ‪ printf‬هیچ‬
‫نیازی به مشخص کردن نوع متغیری که قصد چاپ آن را داریم نیست و خود‬
‫شئ ‪ cout‬نوع آن را تشخیص می دهد‪.‬‬
‫عالوه براین می توان چندین عملگر درج در جریان را با یکدیگر الحاق کرد و‬
‫چندین متغیر را با یک دستور چاپ کرد‪.‬‬

C++ ‫ ورودی و خروجی اطالعات در‬7-6-3
#include
void main() {
int age = 20;
floate average = 18.23;
cout >> “You are ” >> age >> “ years old and your average is ” >> average ;
}

You are 20 years old and your average is 18.230000

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای دریافت اطالعات از کاربر‪ ،‬از شئ دیگری بنام ‪ cin‬استفاده می شود‪.‬‬
‫برای ارسال متغیر مورد نظر به ‪ cin‬باید از عملگر استخراج از جریان یا <<‬
‫استفاده نماییم‪ .‬بعنوان مثال‪:‬‬
‫;‪int a‬‬
‫;‪cin >> a‬‬
‫بازهم همانطور که می بینید نیازی به تعیین نوع متغیر موردنظر نیست و خود‬
‫شئ ‪ cin‬نوع متغیر را بطور اتوماتیک تشخیص داده و داده ای از همان نوع را از‬
‫کاربر دریافت و در متغیر مورد نظر قرار می دهد‪.‬‬
‫عملگرهای استخراج از جریان را نیز می توان با یکدیگر الحاق کرد‪.‬‬
‫برای رفتن به خط بعد در شئ ‪ cout‬می توان از دستکاری کننده ‪ endl‬استفاده‬
‫کرد‪ .‬مثال در دستور زیر پس از چاپ پیغام‪ ،‬مکان نما به خط بعد منتقل می‬
‫شود‪:‬‬
‫;‪cout >> “List of students : “ >> endl‬‬
‫البته دستکاری کننده های متعدد دیگری نیز ازجمله موارد مربوط به تعیین طول‬
‫میدان و نحوه چاپ مقادیر وجود دارد که توضیح آنها نیاز به یک مبحث مستقل‬
‫دارد‪.‬‬

C++ ‫ ورودی و خروجی اطالعات در‬7-6-3
#include
void main() {
int age;
float average ;
cout << "Please enter your age and average : " ;
cin >> age >> average ;
cout << "You are " << age << "years old and your average is " << average;
}

Please enter your age and average : 19 16.72
You are 19 years old and your average is 16.72

‫‪ 7-7‬توابع کتابخانه ای‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫همانطور که قبال نیز گفته شد‪ ،‬زبان ‪ C‬از زیر برنامه ها نیز حمایت می کند‪ .‬هر زیر برنامه‬
‫در ‪ C‬یک تابع نامیده می شود‪ .‬تا کنون با توابعی همچون ‪ main‬و یا ‪ printf‬و ‪ scanf‬آشنا‬
‫شده ایم‪.‬‬
‫معموال عرضه کنندگان کامپایلرها و یا سایر فروشندگان نرم افزار‪ ،‬برخی از توابع عمومی‬
‫را که ممکن است مورد نیاز جمع کثیری از برنامه نویسان مختلف باشد را در قالب‬
‫کتابخانه ای از توابع در اختیار برنامه نویسان می گذارند‪ .‬بعضی از این توابع کتابخانه ای‬
‫مانند ‪ printf‬و ‪ scanf‬بصورت استاندارد درآمده و توسط عرضه کنندگان مختلف ارائه می‬
‫شوند‪.‬‬
‫در کامپایلر عرضه شده توسط شرکت بورلند )‪ (Borland C++ 3.1‬نیز کتابخانه های‬
‫متعددی از توابع برای شما عرضه شده اند که بتدریج با آنها و کاربردشان آشنا خواهید‬
‫شد‪.‬‬
‫نکته مهم آنستکه برای استفاده از این توابع ابتدا باید فایل سرآمد مربوط به آنها را نیز در‬
‫ابتدای برنامه خود اضافه نمایید ) با استفاده از ‪ .(#include‬هر فایل سرآمد شامل تعاریف‬
‫اولیه گروهی از توابع مرتبط با هم و داده های مربوط به آنها بوده و در استاندارد قدیمی‬
‫تر دارای پسوند ‪ .h‬می باشد)در استاندارد جدید پسوند این فایلها حذف شده است(‪.‬‬
‫برخی از این فایلهای سرآمد عبارتند از‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪ : stdio.h‬توابع ورودی و خروجی استاندارد‬
‫‪ : math.h‬توابع ریاضی‬
‫‪ : graphics.h‬توابع مربوط به عملیات گرافیکی‬
‫‪ : string.h‬توابع مربوط به کار با رشته ها‬


Slide 25

‫مبانی کامپیوتر و برنامه سازی‬
‫فصل هفتم ‪ :‬مفاهیم اولیه زبان ‪C‬‬
‫مدرس ‪ :‬نگین معروفی‬

‫‪ 7-1‬شناسه ها در ‪C‬‬
‫‪‬‬
‫‪‬‬

‫شناسه )‪ (identifier‬نامی است که به یک قسمت از برنامه مانند متغیر‪ ،‬تابع‪ ،‬ثابت و یا‬
‫‪ ...‬داده می شود‪.‬‬
‫در زبان ‪ C‬برای انتخاب شناسه ها فقط می توان از عالئم زیر استفاده کرد‪:‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫حروف انگلیسی کوچک و بزرگ )‪(A…Z a…z‬‬
‫ارقام )‪(0…9‬‬
‫عالمت خط پایین یا _‬

‫البته یک شناسه نمی تواند با یک رقم شروع شود‪.‬‬
‫چند شناسه مجاز‪ name2 ، average ، sum :‬و ‪student_average‬‬
‫چند شناسه غیرمجاز ‪ 2name‬و یا ‪student average‬‬
‫در برنامه نویسی امروزی پیشنهاد می شود بجای شناسه هایی همانند‬
‫‪ student_average‬از ‪ studentAverage‬استفاده گردد‪.‬‬
‫نکته مهم دیگری که باید به آن اشاره کرد آنستکه زبان ‪ C‬برخالف بسیاری از زبانهای دیگر‬
‫به کوچک و بزرگی حروف حساس است )‪ .(case sensitive‬در نتیجه شناسه های زیر با‬
‫یکدیگر متفاوتند ‪:‬‬
‫‪Sum ≠ sum ≠ SUM‬‬
‫آخرین نکته اینستکه در هنگام انتخاب شناسه نمی توانید از کلمات کلیدی که برای‬
‫منظورهای خاص در زبان ‪ C‬رزرو شده اند استفاده کنید‪.‬‬

C ‫ شناسه ها در‬7-1
: C ‫کلمات کلیدی در زبان‬
auto

break

case

char

const

continue

default

do

double

else

enum

extern

float

for

goto

if

int

long

register

return

short

signed

sizeof

static

struct

switch

typedef

union

unsigned

void

volatile

while

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫محدوده‬

‫اندازه )بیت(‬

‫توضیح‬

‫نوع داده‬

‫‪-128 to +127‬‬

‫‪8‬‬

‫کاراکتر‬

‫‪char‬‬

‫‪-32768 to +32767‬‬

‫‪16‬‬

‫عدد صحیح‬

‫‪int‬‬

‫‪3.4e-38 to 3.4e+38‬‬

‫‪32‬‬

‫عدد اعشاری‬

‫‪float‬‬

‫‪1.7e-308 to 1.7e+308‬‬

‫‪64‬‬

‫عدد اعشاری با‬
‫دقت مضاعف‬

‫‪double‬‬

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫‪‬‬

‫البته چند نکته مهم درمورد این جدول قابل ذکر است ‪:‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫اندازه ‪ int‬در محیطهای ‪ 16‬بیتی مانند ‪ DOS‬برابر ‪ 16‬بیت است‪ .‬اما در‬
‫محیطهای ‪ 32‬بیتی همانند ‪ Windows‬اندازه آن ‪ 32‬بیت می باشد که در‬
‫اینصورت محدوده ای برابر ‪ -2,147,483,648‬تا ‪ +2,147,483,647‬را‬
‫پوشش می دهد‪.‬‬
‫در بعضی از کامپایلرهای ‪ ،C‬نوع داده ‪ bool‬نیز وجود دارد که می تواند‬
‫یکی از مقادیر ‪)true‬درست( یا ‪) false‬غلط( را نشان دهد ‪ .‬اما در نسخه‬
‫های اولیه ‪ C‬از همان نوع داده صحیح یا ‪ int‬برای اینکار استفاده می‬
‫شد‪ .‬بدین صورت که ‪ 0‬نشاندهنده ‪ false‬و هر عدد غیر صفر )معموال ‪(1‬‬
‫نشاندهنده ‪ true‬است‪.‬‬
‫از آنجا که برای ذخیره سازی کاراکترها کد اسکی آنها ذخیره می گردد‪،‬‬
‫از یک متغیر کاراکتری یا ‪ char‬می توان بعنوان یک عدد صحیح کوچک نیز‬
‫استفاده کرد و اعمال ریاضی برروی آنها نیز مجاز است‪.‬‬

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫عالوه براین چندین اصالح کننده نیز وجود دارد که به ما اجازه می دهد نوع داده مورد‬
‫نظر را با دقت بیشتری برای نیازهای مختلف استفاده نماییم‪.‬‬
‫این اصالح کننده ها عبارتند از ‪short, long, signed, unsigned :‬‬
‫تمام این اصالح کننده ها می توانند به نوع داده ‪ int‬اعمال شوند و اثر آنها بستگی‬
‫به محیط دارد‪.‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫در یک محیط ‪16‬بیتی‪short int ،‬بازهم برابر ‪16‬بیت است ولی ‪ long int‬برابر‪32‬بیت می‬
‫باشد‪.‬‬
‫‪ unsigned int‬باعث می شود که یک عدد ‪ 16‬بیتی بدون عالمت داشته باشیم که بازه‬
‫بین ‪ 0‬تا ‪ 65535‬را پوشش می دهد‪ signed int .‬نیز همانند ‪ int‬معمولی بوده و تفاوتی‬
‫ندارد‪.‬‬
‫ترکیب این اصالح کننده ها نیز ممکن است‪ .‬مثال ‪ unsigned long int‬یک عدد ‪ 32‬بیتی‬
‫بدون عالمت است که بازه ‪ 0‬تا ‪ 4,294,967,295‬را پوشش می دهد‪.‬‬

‫برروی نوع داده ‪ char‬فقط اصالح کننده های ‪ signed‬و ‪ unsigned‬را می توان اعمال‬
‫کرد‪ .‬معموال از اصالح کننده ‪ unsigned‬وقتی استفاده می شود که قصد داشته‬
‫باشیم از ‪ char‬بعنوان یک عدد صحیح مثبت بین ‪ 0‬تا ‪ 255‬استفاده کنیم‪.‬‬
‫برروی نوع داده ‪ double‬تنها اصالح کننده ‪ long‬قابل اعمال است و دراینصورت عدد‬
‫اعشاری با ‪ 80‬بیت را خواهیم داشت که قادر است هر عددی در بازه ‪ 3.4e-4932‬تا‬
‫‪ 1.1e+4932‬را در خود نگاه دارد‪.‬‬

‫‪ 7-3‬تعریف متغیرها‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای تعریف متغیرها به شکل زیر عمل می کنیم‪:‬‬

‫;>‪ ‫که ‪ type‬یکی از نوع داده های گفته شده و ‪ variable-list‬لیستی از متغیرها است‬
‫که با کاما از یکدیگر جدا شده اند‪ .‬بعنوان مثال ‪:‬‬
‫;‪int sum‬‬
‫;‪float average‬‬
‫; ‪long int a, b, c‬‬
‫; ‪unsigned long int i, j, k‬‬
‫عالوه براین می توان در هنگام تعریف متغیر به آن مقدار اولیه نیز داد‪ .‬مثال ‪:‬‬
‫; ‪int d = 0‬‬
‫نكته مهم آنكه زبان ‪ C‬به متغیرها مقدار اولیه نمي دهد )حتي ‪ (0‬و برنامه نويس‬
‫خود بايد اينكار را صريحا انجام دهد‪ ،‬درغیر اينصورت مقدار اولیه متغیر‪ ،‬نامعین خواهد‬
‫بود‪.‬‬
‫تعریف متغیرها طبق اصول زبان ‪ C‬میتواند درهرجایی از برنامه صورت پذیرد‪ ،‬و‬
‫متغیرهای تعریف شده از همان خط به بعد قابل استفاده خواهد بود‪ .‬اما معموال‬
‫توصیه می گردد كه تعریف متغیرها در همان خط ابتدایی تابع و بالفاصله پس از {‬
‫صورت پذیرد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫‪‬‬
‫‪‬‬

‫ثابتها مقادیر ثابتی هستند كه مقدار آنها در حین اجرای برنامه تغییر نمی یابد‪ .‬ثابتها می توانند از‬
‫هریك از نوع داده های اصلی باشند‪.‬‬
‫ثوابت عددی صحیح ‪:‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫برای نمایش این دسته از ثوابت‪ ،‬از دنباله ای از ارقام بعالوه عالمت ‪ +‬یا ‪ -‬استفاده می كنیم‪ .‬بعنوان مثال‬
‫‪ -45‬و یا ‪ 3489‬ثوابت صحیح هستند‪.‬‬
‫در حالت عادی ‪ C‬هر عدد را در كوچكترین نوع داده ای كه می تواند قرار می دهد‪ .‬مثال عدد ‪ 85‬در یك‬
‫‪ int‬قرار می گیرد‪ ،‬اما عدد ‪ 145398‬در یك ‪ long int‬قرار خواهد گرفت‪.‬‬
‫اگر قصد دارید یك عدد كوچك بعنوان ‪ long‬محسوب گردد‪ ،‬می توانید از پسوند ‪ L‬در انتهای آن استفاده‬
‫می كنیم‪ .‬مثال ‪245L‬یك عدد ‪ long‬محسوب می شود‪.‬‬
‫;‪long int a = 20L‬‬
‫پسوند ‪ U‬در انتهای عدد نیز نشانه بدون عالمت بودن آن است‪.‬‬
‫نكته دیگر آنكه ‪ C‬به شما اجازه می دهد درصورت لزوم ثوابت صحیح خود را در مبنای ‪ 8‬یا ‪ 16‬نیز كه‬
‫از مبناهای متداول در برنامه نویسی هستند‪ ،‬بنویسید‪.‬‬
‫‪‬‬
‫‪‬‬

‫برای نوشتن عدد در مبنای ‪ 8‬باید آن را با ‪ 0‬آغاز كنید‪ ،‬مثال ‪ 0342‬یك عدد در منای ‪ 8‬محسوب می‬
‫گردد‪.‬‬
‫برای نوشتن یك عدد در مبنای ‪ 16‬باید آن را با ‪ 0x‬آغاز نمایید‪ ،‬مانند ‪.0x27A4‬‬

‫‪ 7-4‬ثوابت‬
‫ثوابت عددی اعشاری‬

‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫برای نمایش اعداد اعشاری‪ ،‬باید از نقطه اعشار استفاده كنیم‪ ،‬مانند ‪237.45‬‬
‫اما نكته جالب آنستكه می توانید از نماد علمی نیز برای نمایش اعداد‬
‫اعشاری استفاده كنید‪ .‬برای اینكار كافی است از حرف ‪ e‬برای نمایش قسمت‬
‫توان استفاده نمایید‪ .‬بعنوان مثال ‪:‬‬
‫‪-23.47 × 10 5 = -23.47e5‬‬
‫‪42.389 × 10 -3 = 42.389e-3‬‬
‫دقت كنید كه قسمت توان‪ ،‬حتما یك عدد صحیح است‪.‬‬
‫نكته جالب اینجاست كه برخالف مورد قبل‪ ،‬كامپایلر بطور پیش فرض داده های‬
‫اعشاری را از نوع ‪ double‬فرض می كند‪.‬چنانچه دوست دارید ثابت شما ازنوع‬
‫‪ float‬درنظر گرفته شود‪ ،‬در انتهای آن ‪ F‬قرار دهید‪ .‬ضمنا پسوند ‪ L‬نیز داده‬
‫اعشاری را از نوع ‪ long double‬درنظر می گیرد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫ثوابت كاراكتری ‪:‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫برای نشان دادن ثوابت كاراكتری‪ ،‬آنها را در داخل ' قرار می دهیم‪ .‬بعنوان مثال‬
‫'‪'A‬یك ثابت كاراكتری است‪.‬‬
‫; '‪char ch = 'S‬‬
‫دقت كنید كه همانطور كه قبال گفته شد‪ ،‬كد اسكی كاراكترها در متغیر ذخیره‬
‫می گردد‪ ،‬بنابراین می توان از آن بعنوان یك عدد صحیح نیز استفاده كرد‪ .‬نكته‬
‫مهم دیگر آنستكه به تفاوت عدد ‪ 5‬و كاراكتر '‪ '5‬دقت داشته باشید‪ .‬در حقیقت‬
‫'‪ '5‬برابر است با عدد ‪ 53‬كه همان كد اسكی آن است‪.‬‬
‫روش فوق‪ ،‬برای نمایش کاراکترهای قابل چاپ مناسب است‪ ،‬اما بعضی‬
‫كاراكترها مانند ‪ enter‬قابل نمایش نبوده و برای آنها شکل خاصی وجود ندارد‪.‬‬
‫در چنین مواردی‪ ،‬زبان ‪ C‬از ترکیب عالمت \ به همراه یک کاراکتر دیگر‪ ،‬برای‬
‫نمایش این قبیل کاراکترها استفاده می نماید‪ .‬بعنوان مثال‪ ،‬کاراکتر '‪ '\n‬نشان‬
‫دهنده خط جدید یا همان ‪ enter‬می باشد‪.‬‬
‫جدول صفحه بعد این قبیل کاراکترها و معادل آنها را نشان می دهد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫نحوه نمایش در ‪C‬‬

‫کد اسکی‬

‫صدای بوق کامپیوتر‬

‫‪\a‬‬

‫‪7‬‬

‫حرکت به عقب ‪backspace‬‬

‫‪\b‬‬

‫‪8‬‬

‫شروع صفحه ‪form feed‬‬

‫‪\f‬‬

‫‪12‬‬

‫سطر جدید ‪line feed‬‬

‫‪\n‬‬

‫‪10‬‬

‫برگشت به ابتداي سطر ‪carriage return‬‬

‫‪\r‬‬

‫‪13‬‬

‫فاصله افقی ‪horizontal tab‬‬

‫‪\t‬‬

‫‪9‬‬

‫فاصله عمودی ‪vertical tab‬‬

‫‪\v‬‬

‫‪11‬‬

‫عالمت سوال‬

‫?\‬

‫‪63‬‬

‫عالمت '‬

‫'\‬

‫‪39‬‬

‫عالمت "‬

‫"\‬

‫‪34‬‬

‫عالمت \‬

‫\\‬

‫‪92‬‬

‫عالمت تهی‬

‫‪\0‬‬

‫‪0‬‬

‫نام کاراکتر‬

‫کد اسکی یک کاراکتر با ‪ 3‬رقم در مبنای ‪8‬‬

‫‪\000‬‬

‫کد اسکی یک کاراکتر با ‪ 2‬رقم در مبنای ‪16‬‬

‫‪\x00‬‬

‫‪ 7-4‬ثوابت‬
‫‪‬‬

‫ثوابت رشته ای ‪ C :‬عالوه بر ثوابت فوق‪ ،‬از یك ثابت دیگر بنام رشته نیز‬
‫حمایت می كند‪ .‬رشته‪ ،‬دنباله ای از كاراكترها است كه در داخل " قرار‬
‫می گیرند‪ .‬بعنوان مثال "‪ "this is a test‬یك رشته است‪ .‬دقت كنید كه '‪'a‬‬
‫یك كاراكتر است‪ ،‬اما "‪ "a‬یك رشته است كه فقط شامل یك كاراكتر می‬
‫باشد‪.‬‬

‫‪ 7-5‬عملگرها‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫عملگر‪ ،‬نمادی است كه به كامپایلر می گوید تا عملیات محاسباتی یا‬
‫منطقی خاصی را برروی یك یا چند عملوند‪ ،‬انجام دهد‪.‬‬
‫به عملگرهایی كه فقط یك عملوند دارند‪ ،‬عملگر یكانی می گوییم و‬
‫همواره عملگر در سمت چپ عملوند قرار می گیرد)مانند عدد ‪.(-125‬‬
‫اما عملگرهایی كه برروی دو عملوند اثر می كنند را عملگر دودویی‬
‫نامیده و عملگر را بین دو عملوند قرار می دهیم )مانند ‪.(23+86‬‬
‫هر ترکیب درستی از عملگرها و عملوندها را یک عبارت می نامیم‪.‬‬
‫‪ C‬از نقطه نظر عملگرها یك زبان بسیار قوی است‪ .‬این عملگرها به چند‬
‫دسته اصلی تقسیم می گردند كه آنها را به ترتیب بررسی می كنیم‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫این عملگرها‪ ،‬همان اعمال متداول ریاضی هستند كه در زبان ‪ C‬مورد استفاده‬
‫قرار می گیرند‪ .‬این اعمال عبارتند از ‪:‬‬

‫عمل‬

‫نوع‬

‫عملگر‬

‫منفی كردن عملوند سمت راست‬

‫یكانی‬

‫‪-‬‬

‫جمع دو عملوند‬

‫دودویی‬

‫‪+‬‬

‫تفریق دو عملوند‬

‫دودویی‬

‫‪-‬‬

‫ضرب دو عملوند‬

‫دودویی‬

‫*‬

‫تقسیم دو عملوند‬

‫دودویی‬

‫‪/‬‬

‫محاسبه باقیمانده تقسیم دو عملوند‬

‫دودویی‬

‫‪%‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬
‫‪‬‬

‫این عملگرهای برروی همه انواع داده های ‪ C‬عمل می كنند‪ ،‬بجز عملگر ‪ %‬كه فقط‬
‫برروی نوع داده های صحیح عمل می كند‪.‬‬
‫اما نكته مهمی كه باید به آن اشاره كرد‪ ،‬نحوه كار عملگر تقسیم برروی نوع داده های‬
‫مختلف است‪.‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫درصورتیكه هردو عملوند صحیح باشند‪ ،‬تقسیم بصورت صحیح بر صحیح انجام خواهد شد‪.‬‬
‫اگر یكی یا هر دو عملوند اعشاری باشند‪ ،‬تقسیم بصورت اعشاری انجام خواهد پذیرفت‪.‬‬
‫فرض كنید تعاریف زیر را داریم ‪:‬‬
‫; ‪int a,b‬‬
‫; ‪float c,d‬‬
‫; ‪a = 10 ; b = 4‬‬
‫;‪c = 8.2; d = 4.0‬‬
‫اكنون به نتایج عملیات زیر دقت كنید ‪:‬‬
‫‪a / b => 2‬‬
‫‪c / d => 2.05‬‬
‫‪a / d => 2.5‬‬
‫‪a / 4 => 2‬‬
‫چنانچه به آخرین مورد توجه كنید‪ ،‬متوجه می شوید كه از آنجا كه ‪a‬یك متغیر صحیح است و ‪4‬‬
‫نیز یك ثابت صحیح در نظر گرفته شده‪ ،‬درنتیجه تقسیم بصورت صحیح بر صحیح انجام گرفته‬
‫است‪ .‬چنانچه بخواهیم تقسیم بصورت اعشاری صورت پذیرد‪ ،‬به دو شكل می توانیم عمل‬
‫كنیم‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫برای اینکه عبارت تقسیم صفحه قبل بصورت اعشاری انجام شود‪ ،‬به دو روش‬
‫می توان عمل کرد‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫این عبارت را بصورت ‪ a / 4.0‬بنویسیم‪.‬‬
‫از عملگر قالب ریزی استفاده كنیم‪.‬‬

‫عملگر قالب ریزی می تواند یك نوع را به نوع دیگری تبدیل نماید‪ .‬شكل كلی آن‬
‫به شكل زیر است ‪:‬‬
‫>‪() ‫كه ‪ type‬نوع مورد نظر است كه قصد تبدیل عبارت ‪ expression‬به آن نوع را‬
‫داریم‪ .‬بعنوان مثال در مورد قبلی می توان به شكل زیر عمل كرد ‪:‬‬
‫‪(float) a / 4‬‬
‫در این حالت از كامپایلر خواسته ایم كه ابتدا عدد ‪ a‬را به اعشاری تبدیل كند‬
‫)البته بصورت موقت( و سپس آن را بر ‪ 4‬تقسیم نماید‪ ،‬كه مسلما حاصل‬
‫اعشاری خواهد بود‪.‬‬
‫بطوركلی هرگاه ثابتها و متغیرهایی از انواع مختلف در یك عبارت محاسباتی‬
‫داشته باشیم‪ ،‬كامپایلر ‪ C‬همه آنها را به یك نوع یكسان كه همان بزرگترین‬
‫عملوند موجود است تبدیل خواهد كرد‪ .‬بعنوان مثال به مورد صفحه بعد دقت‬
‫كنید ‪:‬‬

‫ عملگرهای محاسباتی‬7-5-1
char ch;
int i;

float f;
double d;
result = (ch / i)
int

+

(f *d)

(f+i)
float

double

double

int

-

double

double

float

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫اولویت عملگرها ‪ :‬در عبارتی که شامل چندین عملگر است‪ ،‬کدامیک در‬
‫ابتدا اعمال خواهد گردید‪.‬‬
‫اولویت عملگرهای محاسباتی از باال به پایین بشرح زیر است‪:‬‬
‫‪ ‬عملگر یکانی –‬
‫‪ ‬عملگرهای * و ‪ /‬و ‪%‬‬
‫‪ ‬عملگرهای ‪ +‬و –‬
‫چنانچه اولویت دو عملگر یکسان باشد‪ ،‬این عملگرها از چپ به راست‬
‫محاسبه خواهند شد‪.‬‬
‫چنانچه بخواهیم یک عمل با اولویت پایین زودتر انجام شود‪ ،‬باید از پرانتز‬
‫استفاده کنیم‪ .‬بنابراین اولویت عملگر پرانتز از همه موارد فوق‬
‫بیشتراست‪ .‬در مورد پرانتزهای متداخل‪ ،‬ابتدا پرانتز داخلی محاسبه‬
‫می شود؛ اما در مورد پرانتزهای هم سطح‪ ،‬ابتدا پرانتز سمت چپتر‬
‫محاسبه می گردد‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫چند مثال در مورد اولویت عملگرها‬

‫ترتیب اجرای عملگرها‬

‫عبارت زبان ‪C‬‬

‫ابتدا عمل * و سپس عمل ‪+‬‬

‫‪b+c*d‬‬

‫ابتدا عمل ‪ +‬و سپس عمل *‬

‫‪(b + c) * d‬‬

‫ابتدا عمل ‪ /‬سپس عمل * و در انتها عمل ‪+‬‬

‫‪b+c/d*e‬‬

‫ابتدا عمل * سپس عمل ‪ /‬و در انتها عمل ‪+‬‬

‫)‪b + c / (d * e‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫یک مثال کامل در مورد اولویت عملگرها‬

‫‪result = a + b * (f – (g + b) / d) – c * (a – d) / e‬‬
‫‪6‬‬

‫‪1‬‬
‫‪7‬‬

‫‪2‬‬

‫‪8‬‬

‫‪3‬‬
‫‪4‬‬
‫‪5‬‬
‫‪9‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫در زبان ‪ C‬برای انتساب چندین عملگر وجود دارد‪ .‬ساده ترین عملگر انتساب‪ ،‬همان عملگر =‬
‫است که در بسیاری از زبانها استفاده می شود‪ .‬بعنوان مثال ‪:‬‬
‫;‪a = 5‬‬
‫;‪b = c + 2 * d‬‬
‫این عملگر باعث می شود که عبارت سمت راست در عبارت سمت چپ قرار گیرد‪.‬‬
‫توجه کنید که مقدار سمت چپ باید عبارتی باشد که بتوان به آن یک مقدار را نسبت داد‬
‫)مانند یک متغیر( که به آن ‪ Lvalue‬گفته می شود‪ ،‬بنابراین یک ثابت نمی تواند در سمت چپ‬
‫قرار گیرد‪.‬‬
‫نکته دیگر اینکه اولویت عملگر = از عملگرهای ریاضی کمتر است و درنتیجه ابتدا آن عملیات‬
‫انجام شده و در پایان حاصل در عبارت سمت چپ ریخته می شود‪.‬‬
‫الزم به ذکر است که در هنگام انتساب‪ ،‬درصورت لزوم نوع عبارت سمت راست به نوع عبارت‬
‫سمت چپ تبدیل می شود‪ .‬مثال‪:‬‬
‫;‪int a‬‬
‫;‪a = 2.5 * 5.0‬‬
‫که دراینصورت عدد ‪ 12‬در ‪ a‬ذخیره خواهد شد‪.‬‬
‫شرکت پذیری این عملگر از راست به چپ می باشد‪ ،‬بدین معنا که چنانچه چندین عملگر‬
‫نسبت دهی داشته باشیم‪ ،‬این عملگرها از راست به چپ محاسبه می شوند‪ .‬مثال پس از‬
‫اجرای دستور زیر‪ ،‬مقدار هر ‪ 3‬متغیر برابر ‪ 10‬خواهد شد‪.‬‬
‫;‪a = b = c = 10‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬

‫نکته جالب درمورد زبان ‪ C‬آنستکه دارای یک سری عملگرهای انتساب‬
‫خالصه شده است که باعث می شوند در بعضی موارد بتوانیم عبارات‬
‫کوتاهتری را بنویسیم‪ .‬این عملگرها عبارتند از ‪:‬‬
‫عملگرد‬

‫مثال‬

‫عبارت انتساب معادل‬

‫‪++‬‬

‫;‪a ++‬‬

‫;‪a = a + 1‬‬

‫‪--‬‬

‫;‪a --‬‬

‫;‪a = a – 1‬‬

‫=‪+‬‬

‫;‪a += 5‬‬

‫;‪a = a + 5‬‬

‫=‪-‬‬

‫;‪a -= 8‬‬

‫;‪a= a – 8‬‬

‫=*‬

‫;‪a *= 10‬‬

‫;‪a= a * 10‬‬

‫=‪/‬‬

‫;‪a /= 2‬‬

‫;‪a = a / 2‬‬

‫=‪%‬‬

‫;‪a %= 10‬‬

‫;‪a = a % 10‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬
‫‪‬‬

‫عملگر اول و دوم‪ ،‬عملگرهای یکانی هستند که بترتیب عملگر افزایش و عملگر کاهش‬
‫نامیده می شوند‪.‬‬
‫نکته جالب آنستکه این دو عملگر به دوصورت مورد استفاده قرار می گیرند‪.‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫در حالتی که از دستور ;‪ a ++‬استفاده شود به آن پس افزایش می گویند و بدین معناست که‬
‫ابتدا از مقدار فعلی ‪ a‬در عبارت موردنظر استفاده کن و سپس آن را افزایش بده‪.‬‬
‫اما دستور ;‪ ++ a‬که به آن پیش افزایش گفته می شود‪ ،‬ابتدا ‪ a‬را افزایش داده و سپس از آن‬
‫در عبارت استفاده می کند‪.‬‬
‫به برنامه زیر دقت کنید‪:‬‬

‫>‪#include ‫{ )(‪void main‬‬
‫; ‪int a ,b‬‬
‫;‪a=5‬‬
‫;‪b = a ++‬‬
‫;)‪printf(“a=%d and b=%d \n”,a,b‬‬
‫;‪a=5‬‬
‫;‪b = ++ a‬‬
‫;)‪printf(“a=%d and b=%d \n”,a,b‬‬
‫}‬
‫‪a=6 b=5‬‬
‫‪a=6 b=6‬‬

‫‪ 7-5-3‬عملگرهای مقایسه ای‬
‫‪‬‬

‫‪‬‬

‫این عملگرها دو عبارت را بایکدیگر مقایسه کرده و نتیجه را باز می گردانند‪.‬‬
‫نتیجه می تواند درست )‪ (true‬یا غلط )‪ (false‬باشد‪.‬‬
‫نتیجه این عملگرها یک عدد صحیح است که درصورت درست بودن ‪ 1‬و‬
‫درصورت غلط بودن ‪ 0‬باز می گردانند‪ .‬این عملگرها عبارتند از‪:‬‬
‫عملگر‬

‫مفهوم عملگر‬

‫مثال‬

‫<‬

‫بزرگتر )<(‬

‫‪a>b‬‬

‫>‬

‫کوچکتر )>(‬

‫‪a
‫=<‬

‫بزرگتر یا مساوی )≤(‬

‫‪a >= b‬‬

‫=>‬

‫کوچکتر یا مساوی )≥(‬

‫‪a <= b‬‬

‫==‬

‫مساوی )=(‬

‫‪a == b‬‬

‫=!‬

‫نامساوی )≠(‬

‫‪a != b‬‬

‫‪ 7-5-3‬عملگرهای مقایسه ای‬
‫‪‬‬

‫‪‬‬

‫نکته مهمی که باید به آن دقت کرد عملگر مساوی )==( است‪ ،‬چرا که یک‬
‫اشتباه بسیار متداول برنامه نویسان ‪ C‬استفاده اشتباه از عملگر انتساب‬
‫)=( بجای عملگر تساوی )==( است که باعث ایجاد خطا در برنامه می‬
‫شود‪.‬‬
‫اولویت این عملگرها از باال به پایین بشرح زیر است‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫عملگرهای <‪ <= ، > ،‬و =>‬
‫عملگرهای == و =!‬

‫الزم بذکر است که در هنگام مساوی بودن اولویت چند عملگر‪ ،‬این عملگرها‬
‫از چپ به راست محاسبه می گردند‪.‬‬

‫‪ 7-5-4‬عملگرهای منطقی‬
‫‪‬‬

‫این عملگرها به شما اجازه می دهند که شرطهای ساده ای را که با‬
‫استفاده از عملگرهای مقایسه ای ایجاد شده اند را با یکدیگر ترکیب نموده‬
‫و شرطهای پیچیده تری را بسازید‪ .‬این عملگرها عبارتند از ‪:‬‬
‫مثال‬

‫عملگر‬

‫مفهوم عملگر‬

‫نحوه کار‬

‫&&‬

‫‪ AND‬منطقی‬

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

‫‪a>0 && sw==1‬‬

‫||‬

‫‪ OR‬منطقی‬

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

‫‪a<=100 || b!=0‬‬

‫!‬

‫‪ NOT‬منطقی‬

‫اگر عملوند درست باشد‪ ،‬نادرست و‬
‫اگر نادرست باشد‪ ،‬درست برمی‬
‫گرداند‪.‬‬

‫)‪! (a==1 || b<10‬‬

‫‪ 7-5-5‬عملگر شرطی‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫گاهی الزم است که ابتدا یک شرط بررسی شده و سپس برمبنای نتیجه )درست یا نادرست بودن آن( یکی‬
‫از دو عبارت ممکن بازگردانده شود‪ .‬برای اینکار می توان از یک عملگر ‪3‬تایی )با ‪ 3‬عملوند( بنام عملگر‬
‫شرطی استفاده نمود‪.‬‬
‫شکل کلی این عملگر بصورت زیر است‪:‬‬
‫>عبارت‪> :<2‬عبارت‪> ?<1‬شرط<‬
‫نحوه کار بدینصورت است که درصورت درست بودن شرط‪ ،‬عبارت‪ 1‬و در غیراینصورت عبارت ‪ 2‬بازگردانده می‬
‫شود‪.‬‬
‫به عنوان مثال به دستور زیر توجه کنید‪:‬‬
‫که این عبارت معادل دستور زیر است‪:‬‬

‫‪‬‬

‫;‪a = (k<10) ? 100 : 50‬‬
‫;‪if (k<10) a=100‬‬
‫;‪else a=50‬‬

‫البته این عبارت به شکلهای پیچیده نیز می تواند مورد استفاده قرار گیرد‪ .‬مثال ‪:‬‬
‫;‪c += (a>0 && a<10) ? ++a : a/b‬‬
‫که معادل است با ‪:‬‬
‫{ )‪if (a>0 && a<10‬‬
‫;‪a= a + 1‬‬
‫;‪c = c + a‬‬
‫}‬
‫;‪else c = c + a/b‬‬

‫‪ 7-5-6‬اولویت عملگرها‬
‫عملگر‬

‫اولویت‬

‫شرکت پذیری‬

‫‪1‬‬

‫)(‬

‫از چپ به راست‬

‫‪2‬‬

‫‪- + ! -- ++‬‬

‫از راست به چپ‬

‫‪3‬‬

‫‪* / %‬‬

‫از چپ به راست‬

‫‪4‬‬

‫‪+ -‬‬

‫از چپ به راست‬

‫‪5‬‬

‫>> <<‬

‫از چپ به راست‬

‫‪6‬‬

‫>= > <= <‬

‫از چپ به راست‬

‫‪7‬‬

‫=! ==‬

‫از چپ به راست‬

‫‪8‬‬

‫&&‬

‫از چپ به راست‬

‫‪9‬‬

‫||‬

‫از چپ به راست‬

‫‪10‬‬

‫‪?:‬‬

‫از راست به چپ‬

‫‪11‬‬

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

‫از راست به چپ‬

‫‪12‬‬

‫‪,‬‬

‫از چپ به راست‬

‫‪ 7-6‬خواندن و نمایش اطالعات‬
‫‪‬‬

‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫همانطور كه قبال نیز گفته شد‪ ،‬یكی از اهداف زبان ‪ C‬قابل حمل بودن آن‬
‫است‪ .‬بهمین منظور سعی شده است كه از دستوراتی كه ممكن است‬
‫وابسته به ماشین خاصی باشد‪ ،‬اجتناب گردد‪.‬‬
‫بهمین دلیل زبان ‪ C‬برخالف سایر زبانها دارای هیچ دستوری برای‬
‫خواندن از ورودی و یا نوشتن در خروجی نیست‪.‬‬
‫اما در عوض دارای تعدادی تابع )زیربرنامه( استاندارد می باشد كه تقریبا‬
‫تمامی كامپایلرها از آنها حمایت می كنند‪.‬‬
‫این كار به كامپایلر این امكان را می دهد كه بر حسب نوع سخت افزار‬
‫موردنظر‪ ،‬توابع ورودی و خروجی را طراحی نماید‪.‬‬
‫این توابع در یك فایل سرآمد بنام ‪ stdio.h‬تعریف شده اند و بنابراین قبل‬
‫ازاینكه بتوانید از این توابع استفاده نمایید‪ ،‬باید این فایل را نیز با استفاده‬
‫از ‪ #include‬در برنامه خود بگنجانید‪.‬‬

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫برای نمایش اطالعات در خروجی از تابع ‪ printf‬استفاده می شود‪.‬‬
‫این تابع رشته موردنظر شما را به خروجی استاندارد )كه در حالت‬
‫عادی همان صفحه نمایش یا مانیتور است( می فرستد‪ .‬شكل كلی این‬
‫تابع بصورت زیر است‪:‬‬
‫; )>لیست متغیرها< ‪> ,‬رشته كنترلی<(‪printf‬‬
‫رشته كنترلی همان متنی است كه قصد چاپ آن را داریم‪ ،‬با ذكر این‬
‫نكته كه در قسمتهایی كه باید مقدار یك متغیر چاپ شود‪ ،‬از یك‬
‫مشخصه تبدیل استفاده می شود‪ .‬هر مشخصه تبدیل از یك عالمت ‪%‬‬
‫بعالوه یك كاراكتر كه نوع متغیر مورد نظر را نشان می دهد تشكیل می‬
‫گردد‪.‬‬
‫لیست متغیرها نیز همان متغیرهایی هستند كه قصد چاپ آنها را داریم‪.‬‬
‫این متغیرها باید بترتیب قرار گرفته و با كاما )‪ (,‬از یكدیگر جدا شوند‪.‬‬

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫مشخصه تبدیل‬

‫مفهوم‬

‫‪%c‬‬

‫كاراكتر‬

‫‪%d‬‬

‫عدد صحیح در مبنای ‪10‬‬

‫‪%f‬‬

‫عدد اعشاری بدون نماد علمی‬

‫‪%e‬‬

‫عدد اعشاری با نماد علمی‬

‫‪%g‬‬

‫عدد اعشاری با حالت كوتاهتر بین ‪ e‬و ‪f‬‬

‫‪%s‬‬

‫رشته‬

‫‪%ld‬‬

‫عدد صحیح بزرگ‬

‫‪%lf %le %lg‬‬

‫عدد اعشاری بزرگ‬

‫‪%o‬‬

‫عدد صحیح در مبنای ‪8‬‬

‫‪%x‬‬

‫عدد صحیحی در مبنای ‪16‬‬

‫‪%u‬‬

‫عدد صحیح بدون عالمت‬

‫ تابع نمایش در خروجی‬7-6-1
#include
void main() {
int age = 20;
floate average = 18.23;
printf("You are %d years old and your average is %f \n",age,average);
}
You are 20 years old and your average is 18.230000

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫‪‬‬
‫‪‬‬

‫برای کنترل نحوه چاپ اعداد می توانید از مشخصه طول میدان استفاده‬
‫کنید‪.‬‬
‫مشخصه طول میدان برای اعداد به شكل زیر استفاده می شود‪:‬‬
‫‪ ‬برای اعداد صحیح از ‪ %nd‬استفاده می كنیم كه ‪ n‬تعداد ارقام را نشان‬
‫می دهد )مثال ‪ .(%3d‬در اینصورت برای هر متغیر ‪ n‬رقم درنظر گرفته‬
‫می شود‪ .‬اگر اندازه عدد از ‪ n‬كوچكتر باشد‪ ،‬به سمت چپ آن فضای‬
‫خالی اضافه می شود و اگر اندازه عدد بیش از ‪ n‬رقم باشد‪ ،‬طول میدان‬
‫نادیده گرفته شده و عدد بطور كامل چاپ می شود‪.‬‬
‫‪ ‬برای اعداد اعشاری از ‪ %n.mf‬استفاده می كنیم كه ‪ n‬اندازه كل عدد‬
‫)شامل عالمت ممیز( و ‪ m‬تعداد ارقام اعشار است )مثال ‪ .(%5.2f‬در‬
‫صورتیكه تعداد ارقام اعشاری عدد موردنظر از ‪ m‬بیشتر باشد‪ ،‬عدد به ‪m‬‬
‫عدد اعشار گرد می شود و در صورتیكه از ‪ m‬كمتر باشد‪ ،‬در سمت‬
‫راست آن ‪ 0‬قرار داده می شود‪.‬‬

‫‪ 7-6-2‬تابع خواندن از ورودی‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای خواندن اطالعات از ورودی از تابع ‪ scanf‬استفاده می شود‪.‬‬
‫این تابع اطالعات را ازورودی استاندارد )معموال صفحه كلید( خوانده و در‬
‫متغیرهای تعیین شده قرار می دهد‪.‬‬
‫شكل كلی این تابع بصورت زیر است‪:‬‬
‫; )>لیست آدرسهای متغیرها< ‪> ,‬رشته كنترلی<(‪scanf‬‬
‫همانطور كه می بینید نحوه احضار تابع ‪ scanf‬نیز مشابه ‪ printf‬است‪ .‬تنها‬
‫تفاوت در آن است كه در ‪ scanf‬باید لیست آدرسهای متغیرها ارسال شود‪.‬‬
‫مبحث مربوط به آدرسها در فصول بعدی بررسی خواهد شد ولی در حال حاضر‬
‫بخاطر بسپارید كه برای بدست آوردن آدرس یك متغیر از عالمت & استفاده می‬
‫كنیم‪ .‬بعنوان مثال ‪ &age‬بمعنای آدرس متغیر ‪ age‬است‪.‬‬
‫بطور كلی در ‪ C‬قدیمی هرگاه كه یك تابع دارای پارامترهای خروجی بود )یعنی‬
‫پارامترهایی كه یك مقدار را باز می گرداندند( از آدرس متغیرها استفاده می‬
‫شد كه امروزه این مسئله وجود ندارد‪.‬‬

‫ تابع خواندن از ورودی‬7-6-2
#include
void main() {
int age;
float average ;
printf("Please enter your age and average : ");
scanf("%d %f",&age,&average);
printf("You are %d years old and your average is %5.2f \n",age,average);
}

Please enter your age and average : 19 16.72
You are 19 years old and your average is 16.72

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫زبان ‪ C++‬یک زبان شی گرا است‪ ،‬بهمین دلیل در این زبان برای ورودی‬
‫و خروجی از اشیاء بجای توابع استفاده می گردد‪.‬‬
‫از آنجا که امروزه معموال برنامه نویسان ‪ C‬از کامپایلرهای ‪ C++‬استفاده‬
‫می کنند‪ ،‬می توانند از اشیای ورودی و خروجی آن نیز استفاده کنند‪.‬‬
‫اینکار در بین بسیاری از برنامه نویسان ‪ C‬متداول است‪ ،‬بهمین دلیل ما‬
‫در اینجا نحوه کار با اشیای خواندن و نوشتن در ‪ C++‬را بطور مقدماتی‬
‫توضیح می دهیم؛ گرچه توضیح کامل این موارد نیاز به آشنایی با شی‬
‫گرایی و زبان ‪ C++‬دارد‪.‬‬
‫قبل از هرچیز الزم به ذکر است که کلیه اشیای مربوط به ورودی و‬
‫خروجی در فایل سرآمدی بنام ‪ iostream.h‬تعیریف شده اند‪ ،‬بنابراین‬
‫ابتدا باید این فایل به برنامه توسط دستور ‪ #include‬الحاق گردد‪.‬‬

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫زبان ‪ C++‬برای نمایش اطالعات از یک شیئ بنام ‪ cout‬استفاده می نماید‪.‬‬
‫برای ارسال اطالعات مورد نظر برای چاپ به ‪ cout‬باید از عملگر درج در جریان‬
‫یا >> استفاده نماییم‪ .‬بعنوان مثال ‪:‬‬
‫; ” ‪cout >> “Please enter your name:‬‬
‫و یا مثال دیگر ‪:‬‬
‫;‪int a = 10‬‬
‫;‪float b = 2.86‬‬
‫;‪cout << a‬‬
‫;‪cout << b‬‬
‫نکته جالبی که در این مثالها دیده می شود‪ ،‬آنستکه برخالف تابع ‪ printf‬هیچ‬
‫نیازی به مشخص کردن نوع متغیری که قصد چاپ آن را داریم نیست و خود‬
‫شئ ‪ cout‬نوع آن را تشخیص می دهد‪.‬‬
‫عالوه براین می توان چندین عملگر درج در جریان را با یکدیگر الحاق کرد و‬
‫چندین متغیر را با یک دستور چاپ کرد‪.‬‬

C++ ‫ ورودی و خروجی اطالعات در‬7-6-3
#include
void main() {
int age = 20;
floate average = 18.23;
cout >> “You are ” >> age >> “ years old and your average is ” >> average ;
}

You are 20 years old and your average is 18.230000

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای دریافت اطالعات از کاربر‪ ،‬از شئ دیگری بنام ‪ cin‬استفاده می شود‪.‬‬
‫برای ارسال متغیر مورد نظر به ‪ cin‬باید از عملگر استخراج از جریان یا <<‬
‫استفاده نماییم‪ .‬بعنوان مثال‪:‬‬
‫;‪int a‬‬
‫;‪cin >> a‬‬
‫بازهم همانطور که می بینید نیازی به تعیین نوع متغیر موردنظر نیست و خود‬
‫شئ ‪ cin‬نوع متغیر را بطور اتوماتیک تشخیص داده و داده ای از همان نوع را از‬
‫کاربر دریافت و در متغیر مورد نظر قرار می دهد‪.‬‬
‫عملگرهای استخراج از جریان را نیز می توان با یکدیگر الحاق کرد‪.‬‬
‫برای رفتن به خط بعد در شئ ‪ cout‬می توان از دستکاری کننده ‪ endl‬استفاده‬
‫کرد‪ .‬مثال در دستور زیر پس از چاپ پیغام‪ ،‬مکان نما به خط بعد منتقل می‬
‫شود‪:‬‬
‫;‪cout >> “List of students : “ >> endl‬‬
‫البته دستکاری کننده های متعدد دیگری نیز ازجمله موارد مربوط به تعیین طول‬
‫میدان و نحوه چاپ مقادیر وجود دارد که توضیح آنها نیاز به یک مبحث مستقل‬
‫دارد‪.‬‬

C++ ‫ ورودی و خروجی اطالعات در‬7-6-3
#include
void main() {
int age;
float average ;
cout << "Please enter your age and average : " ;
cin >> age >> average ;
cout << "You are " << age << "years old and your average is " << average;
}

Please enter your age and average : 19 16.72
You are 19 years old and your average is 16.72

‫‪ 7-7‬توابع کتابخانه ای‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫همانطور که قبال نیز گفته شد‪ ،‬زبان ‪ C‬از زیر برنامه ها نیز حمایت می کند‪ .‬هر زیر برنامه‬
‫در ‪ C‬یک تابع نامیده می شود‪ .‬تا کنون با توابعی همچون ‪ main‬و یا ‪ printf‬و ‪ scanf‬آشنا‬
‫شده ایم‪.‬‬
‫معموال عرضه کنندگان کامپایلرها و یا سایر فروشندگان نرم افزار‪ ،‬برخی از توابع عمومی‬
‫را که ممکن است مورد نیاز جمع کثیری از برنامه نویسان مختلف باشد را در قالب‬
‫کتابخانه ای از توابع در اختیار برنامه نویسان می گذارند‪ .‬بعضی از این توابع کتابخانه ای‬
‫مانند ‪ printf‬و ‪ scanf‬بصورت استاندارد درآمده و توسط عرضه کنندگان مختلف ارائه می‬
‫شوند‪.‬‬
‫در کامپایلر عرضه شده توسط شرکت بورلند )‪ (Borland C++ 3.1‬نیز کتابخانه های‬
‫متعددی از توابع برای شما عرضه شده اند که بتدریج با آنها و کاربردشان آشنا خواهید‬
‫شد‪.‬‬
‫نکته مهم آنستکه برای استفاده از این توابع ابتدا باید فایل سرآمد مربوط به آنها را نیز در‬
‫ابتدای برنامه خود اضافه نمایید ) با استفاده از ‪ .(#include‬هر فایل سرآمد شامل تعاریف‬
‫اولیه گروهی از توابع مرتبط با هم و داده های مربوط به آنها بوده و در استاندارد قدیمی‬
‫تر دارای پسوند ‪ .h‬می باشد)در استاندارد جدید پسوند این فایلها حذف شده است(‪.‬‬
‫برخی از این فایلهای سرآمد عبارتند از‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪ : stdio.h‬توابع ورودی و خروجی استاندارد‬
‫‪ : math.h‬توابع ریاضی‬
‫‪ : graphics.h‬توابع مربوط به عملیات گرافیکی‬
‫‪ : string.h‬توابع مربوط به کار با رشته ها‬


Slide 26

‫مبانی کامپیوتر و برنامه سازی‬
‫فصل هفتم ‪ :‬مفاهیم اولیه زبان ‪C‬‬
‫مدرس ‪ :‬نگین معروفی‬

‫‪ 7-1‬شناسه ها در ‪C‬‬
‫‪‬‬
‫‪‬‬

‫شناسه )‪ (identifier‬نامی است که به یک قسمت از برنامه مانند متغیر‪ ،‬تابع‪ ،‬ثابت و یا‬
‫‪ ...‬داده می شود‪.‬‬
‫در زبان ‪ C‬برای انتخاب شناسه ها فقط می توان از عالئم زیر استفاده کرد‪:‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫حروف انگلیسی کوچک و بزرگ )‪(A…Z a…z‬‬
‫ارقام )‪(0…9‬‬
‫عالمت خط پایین یا _‬

‫البته یک شناسه نمی تواند با یک رقم شروع شود‪.‬‬
‫چند شناسه مجاز‪ name2 ، average ، sum :‬و ‪student_average‬‬
‫چند شناسه غیرمجاز ‪ 2name‬و یا ‪student average‬‬
‫در برنامه نویسی امروزی پیشنهاد می شود بجای شناسه هایی همانند‬
‫‪ student_average‬از ‪ studentAverage‬استفاده گردد‪.‬‬
‫نکته مهم دیگری که باید به آن اشاره کرد آنستکه زبان ‪ C‬برخالف بسیاری از زبانهای دیگر‬
‫به کوچک و بزرگی حروف حساس است )‪ .(case sensitive‬در نتیجه شناسه های زیر با‬
‫یکدیگر متفاوتند ‪:‬‬
‫‪Sum ≠ sum ≠ SUM‬‬
‫آخرین نکته اینستکه در هنگام انتخاب شناسه نمی توانید از کلمات کلیدی که برای‬
‫منظورهای خاص در زبان ‪ C‬رزرو شده اند استفاده کنید‪.‬‬

C ‫ شناسه ها در‬7-1
: C ‫کلمات کلیدی در زبان‬
auto

break

case

char

const

continue

default

do

double

else

enum

extern

float

for

goto

if

int

long

register

return

short

signed

sizeof

static

struct

switch

typedef

union

unsigned

void

volatile

while

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫محدوده‬

‫اندازه )بیت(‬

‫توضیح‬

‫نوع داده‬

‫‪-128 to +127‬‬

‫‪8‬‬

‫کاراکتر‬

‫‪char‬‬

‫‪-32768 to +32767‬‬

‫‪16‬‬

‫عدد صحیح‬

‫‪int‬‬

‫‪3.4e-38 to 3.4e+38‬‬

‫‪32‬‬

‫عدد اعشاری‬

‫‪float‬‬

‫‪1.7e-308 to 1.7e+308‬‬

‫‪64‬‬

‫عدد اعشاری با‬
‫دقت مضاعف‬

‫‪double‬‬

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫‪‬‬

‫البته چند نکته مهم درمورد این جدول قابل ذکر است ‪:‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫اندازه ‪ int‬در محیطهای ‪ 16‬بیتی مانند ‪ DOS‬برابر ‪ 16‬بیت است‪ .‬اما در‬
‫محیطهای ‪ 32‬بیتی همانند ‪ Windows‬اندازه آن ‪ 32‬بیت می باشد که در‬
‫اینصورت محدوده ای برابر ‪ -2,147,483,648‬تا ‪ +2,147,483,647‬را‬
‫پوشش می دهد‪.‬‬
‫در بعضی از کامپایلرهای ‪ ،C‬نوع داده ‪ bool‬نیز وجود دارد که می تواند‬
‫یکی از مقادیر ‪)true‬درست( یا ‪) false‬غلط( را نشان دهد ‪ .‬اما در نسخه‬
‫های اولیه ‪ C‬از همان نوع داده صحیح یا ‪ int‬برای اینکار استفاده می‬
‫شد‪ .‬بدین صورت که ‪ 0‬نشاندهنده ‪ false‬و هر عدد غیر صفر )معموال ‪(1‬‬
‫نشاندهنده ‪ true‬است‪.‬‬
‫از آنجا که برای ذخیره سازی کاراکترها کد اسکی آنها ذخیره می گردد‪،‬‬
‫از یک متغیر کاراکتری یا ‪ char‬می توان بعنوان یک عدد صحیح کوچک نیز‬
‫استفاده کرد و اعمال ریاضی برروی آنها نیز مجاز است‪.‬‬

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫عالوه براین چندین اصالح کننده نیز وجود دارد که به ما اجازه می دهد نوع داده مورد‬
‫نظر را با دقت بیشتری برای نیازهای مختلف استفاده نماییم‪.‬‬
‫این اصالح کننده ها عبارتند از ‪short, long, signed, unsigned :‬‬
‫تمام این اصالح کننده ها می توانند به نوع داده ‪ int‬اعمال شوند و اثر آنها بستگی‬
‫به محیط دارد‪.‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫در یک محیط ‪16‬بیتی‪short int ،‬بازهم برابر ‪16‬بیت است ولی ‪ long int‬برابر‪32‬بیت می‬
‫باشد‪.‬‬
‫‪ unsigned int‬باعث می شود که یک عدد ‪ 16‬بیتی بدون عالمت داشته باشیم که بازه‬
‫بین ‪ 0‬تا ‪ 65535‬را پوشش می دهد‪ signed int .‬نیز همانند ‪ int‬معمولی بوده و تفاوتی‬
‫ندارد‪.‬‬
‫ترکیب این اصالح کننده ها نیز ممکن است‪ .‬مثال ‪ unsigned long int‬یک عدد ‪ 32‬بیتی‬
‫بدون عالمت است که بازه ‪ 0‬تا ‪ 4,294,967,295‬را پوشش می دهد‪.‬‬

‫برروی نوع داده ‪ char‬فقط اصالح کننده های ‪ signed‬و ‪ unsigned‬را می توان اعمال‬
‫کرد‪ .‬معموال از اصالح کننده ‪ unsigned‬وقتی استفاده می شود که قصد داشته‬
‫باشیم از ‪ char‬بعنوان یک عدد صحیح مثبت بین ‪ 0‬تا ‪ 255‬استفاده کنیم‪.‬‬
‫برروی نوع داده ‪ double‬تنها اصالح کننده ‪ long‬قابل اعمال است و دراینصورت عدد‬
‫اعشاری با ‪ 80‬بیت را خواهیم داشت که قادر است هر عددی در بازه ‪ 3.4e-4932‬تا‬
‫‪ 1.1e+4932‬را در خود نگاه دارد‪.‬‬

‫‪ 7-3‬تعریف متغیرها‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای تعریف متغیرها به شکل زیر عمل می کنیم‪:‬‬

‫;>‪ ‫که ‪ type‬یکی از نوع داده های گفته شده و ‪ variable-list‬لیستی از متغیرها است‬
‫که با کاما از یکدیگر جدا شده اند‪ .‬بعنوان مثال ‪:‬‬
‫;‪int sum‬‬
‫;‪float average‬‬
‫; ‪long int a, b, c‬‬
‫; ‪unsigned long int i, j, k‬‬
‫عالوه براین می توان در هنگام تعریف متغیر به آن مقدار اولیه نیز داد‪ .‬مثال ‪:‬‬
‫; ‪int d = 0‬‬
‫نكته مهم آنكه زبان ‪ C‬به متغیرها مقدار اولیه نمي دهد )حتي ‪ (0‬و برنامه نويس‬
‫خود بايد اينكار را صريحا انجام دهد‪ ،‬درغیر اينصورت مقدار اولیه متغیر‪ ،‬نامعین خواهد‬
‫بود‪.‬‬
‫تعریف متغیرها طبق اصول زبان ‪ C‬میتواند درهرجایی از برنامه صورت پذیرد‪ ،‬و‬
‫متغیرهای تعریف شده از همان خط به بعد قابل استفاده خواهد بود‪ .‬اما معموال‬
‫توصیه می گردد كه تعریف متغیرها در همان خط ابتدایی تابع و بالفاصله پس از {‬
‫صورت پذیرد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫‪‬‬
‫‪‬‬

‫ثابتها مقادیر ثابتی هستند كه مقدار آنها در حین اجرای برنامه تغییر نمی یابد‪ .‬ثابتها می توانند از‬
‫هریك از نوع داده های اصلی باشند‪.‬‬
‫ثوابت عددی صحیح ‪:‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫برای نمایش این دسته از ثوابت‪ ،‬از دنباله ای از ارقام بعالوه عالمت ‪ +‬یا ‪ -‬استفاده می كنیم‪ .‬بعنوان مثال‬
‫‪ -45‬و یا ‪ 3489‬ثوابت صحیح هستند‪.‬‬
‫در حالت عادی ‪ C‬هر عدد را در كوچكترین نوع داده ای كه می تواند قرار می دهد‪ .‬مثال عدد ‪ 85‬در یك‬
‫‪ int‬قرار می گیرد‪ ،‬اما عدد ‪ 145398‬در یك ‪ long int‬قرار خواهد گرفت‪.‬‬
‫اگر قصد دارید یك عدد كوچك بعنوان ‪ long‬محسوب گردد‪ ،‬می توانید از پسوند ‪ L‬در انتهای آن استفاده‬
‫می كنیم‪ .‬مثال ‪245L‬یك عدد ‪ long‬محسوب می شود‪.‬‬
‫;‪long int a = 20L‬‬
‫پسوند ‪ U‬در انتهای عدد نیز نشانه بدون عالمت بودن آن است‪.‬‬
‫نكته دیگر آنكه ‪ C‬به شما اجازه می دهد درصورت لزوم ثوابت صحیح خود را در مبنای ‪ 8‬یا ‪ 16‬نیز كه‬
‫از مبناهای متداول در برنامه نویسی هستند‪ ،‬بنویسید‪.‬‬
‫‪‬‬
‫‪‬‬

‫برای نوشتن عدد در مبنای ‪ 8‬باید آن را با ‪ 0‬آغاز كنید‪ ،‬مثال ‪ 0342‬یك عدد در منای ‪ 8‬محسوب می‬
‫گردد‪.‬‬
‫برای نوشتن یك عدد در مبنای ‪ 16‬باید آن را با ‪ 0x‬آغاز نمایید‪ ،‬مانند ‪.0x27A4‬‬

‫‪ 7-4‬ثوابت‬
‫ثوابت عددی اعشاری‬

‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫برای نمایش اعداد اعشاری‪ ،‬باید از نقطه اعشار استفاده كنیم‪ ،‬مانند ‪237.45‬‬
‫اما نكته جالب آنستكه می توانید از نماد علمی نیز برای نمایش اعداد‬
‫اعشاری استفاده كنید‪ .‬برای اینكار كافی است از حرف ‪ e‬برای نمایش قسمت‬
‫توان استفاده نمایید‪ .‬بعنوان مثال ‪:‬‬
‫‪-23.47 × 10 5 = -23.47e5‬‬
‫‪42.389 × 10 -3 = 42.389e-3‬‬
‫دقت كنید كه قسمت توان‪ ،‬حتما یك عدد صحیح است‪.‬‬
‫نكته جالب اینجاست كه برخالف مورد قبل‪ ،‬كامپایلر بطور پیش فرض داده های‬
‫اعشاری را از نوع ‪ double‬فرض می كند‪.‬چنانچه دوست دارید ثابت شما ازنوع‬
‫‪ float‬درنظر گرفته شود‪ ،‬در انتهای آن ‪ F‬قرار دهید‪ .‬ضمنا پسوند ‪ L‬نیز داده‬
‫اعشاری را از نوع ‪ long double‬درنظر می گیرد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫ثوابت كاراكتری ‪:‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫برای نشان دادن ثوابت كاراكتری‪ ،‬آنها را در داخل ' قرار می دهیم‪ .‬بعنوان مثال‬
‫'‪'A‬یك ثابت كاراكتری است‪.‬‬
‫; '‪char ch = 'S‬‬
‫دقت كنید كه همانطور كه قبال گفته شد‪ ،‬كد اسكی كاراكترها در متغیر ذخیره‬
‫می گردد‪ ،‬بنابراین می توان از آن بعنوان یك عدد صحیح نیز استفاده كرد‪ .‬نكته‬
‫مهم دیگر آنستكه به تفاوت عدد ‪ 5‬و كاراكتر '‪ '5‬دقت داشته باشید‪ .‬در حقیقت‬
‫'‪ '5‬برابر است با عدد ‪ 53‬كه همان كد اسكی آن است‪.‬‬
‫روش فوق‪ ،‬برای نمایش کاراکترهای قابل چاپ مناسب است‪ ،‬اما بعضی‬
‫كاراكترها مانند ‪ enter‬قابل نمایش نبوده و برای آنها شکل خاصی وجود ندارد‪.‬‬
‫در چنین مواردی‪ ،‬زبان ‪ C‬از ترکیب عالمت \ به همراه یک کاراکتر دیگر‪ ،‬برای‬
‫نمایش این قبیل کاراکترها استفاده می نماید‪ .‬بعنوان مثال‪ ،‬کاراکتر '‪ '\n‬نشان‬
‫دهنده خط جدید یا همان ‪ enter‬می باشد‪.‬‬
‫جدول صفحه بعد این قبیل کاراکترها و معادل آنها را نشان می دهد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫نحوه نمایش در ‪C‬‬

‫کد اسکی‬

‫صدای بوق کامپیوتر‬

‫‪\a‬‬

‫‪7‬‬

‫حرکت به عقب ‪backspace‬‬

‫‪\b‬‬

‫‪8‬‬

‫شروع صفحه ‪form feed‬‬

‫‪\f‬‬

‫‪12‬‬

‫سطر جدید ‪line feed‬‬

‫‪\n‬‬

‫‪10‬‬

‫برگشت به ابتداي سطر ‪carriage return‬‬

‫‪\r‬‬

‫‪13‬‬

‫فاصله افقی ‪horizontal tab‬‬

‫‪\t‬‬

‫‪9‬‬

‫فاصله عمودی ‪vertical tab‬‬

‫‪\v‬‬

‫‪11‬‬

‫عالمت سوال‬

‫?\‬

‫‪63‬‬

‫عالمت '‬

‫'\‬

‫‪39‬‬

‫عالمت "‬

‫"\‬

‫‪34‬‬

‫عالمت \‬

‫\\‬

‫‪92‬‬

‫عالمت تهی‬

‫‪\0‬‬

‫‪0‬‬

‫نام کاراکتر‬

‫کد اسکی یک کاراکتر با ‪ 3‬رقم در مبنای ‪8‬‬

‫‪\000‬‬

‫کد اسکی یک کاراکتر با ‪ 2‬رقم در مبنای ‪16‬‬

‫‪\x00‬‬

‫‪ 7-4‬ثوابت‬
‫‪‬‬

‫ثوابت رشته ای ‪ C :‬عالوه بر ثوابت فوق‪ ،‬از یك ثابت دیگر بنام رشته نیز‬
‫حمایت می كند‪ .‬رشته‪ ،‬دنباله ای از كاراكترها است كه در داخل " قرار‬
‫می گیرند‪ .‬بعنوان مثال "‪ "this is a test‬یك رشته است‪ .‬دقت كنید كه '‪'a‬‬
‫یك كاراكتر است‪ ،‬اما "‪ "a‬یك رشته است كه فقط شامل یك كاراكتر می‬
‫باشد‪.‬‬

‫‪ 7-5‬عملگرها‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫عملگر‪ ،‬نمادی است كه به كامپایلر می گوید تا عملیات محاسباتی یا‬
‫منطقی خاصی را برروی یك یا چند عملوند‪ ،‬انجام دهد‪.‬‬
‫به عملگرهایی كه فقط یك عملوند دارند‪ ،‬عملگر یكانی می گوییم و‬
‫همواره عملگر در سمت چپ عملوند قرار می گیرد)مانند عدد ‪.(-125‬‬
‫اما عملگرهایی كه برروی دو عملوند اثر می كنند را عملگر دودویی‬
‫نامیده و عملگر را بین دو عملوند قرار می دهیم )مانند ‪.(23+86‬‬
‫هر ترکیب درستی از عملگرها و عملوندها را یک عبارت می نامیم‪.‬‬
‫‪ C‬از نقطه نظر عملگرها یك زبان بسیار قوی است‪ .‬این عملگرها به چند‬
‫دسته اصلی تقسیم می گردند كه آنها را به ترتیب بررسی می كنیم‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫این عملگرها‪ ،‬همان اعمال متداول ریاضی هستند كه در زبان ‪ C‬مورد استفاده‬
‫قرار می گیرند‪ .‬این اعمال عبارتند از ‪:‬‬

‫عمل‬

‫نوع‬

‫عملگر‬

‫منفی كردن عملوند سمت راست‬

‫یكانی‬

‫‪-‬‬

‫جمع دو عملوند‬

‫دودویی‬

‫‪+‬‬

‫تفریق دو عملوند‬

‫دودویی‬

‫‪-‬‬

‫ضرب دو عملوند‬

‫دودویی‬

‫*‬

‫تقسیم دو عملوند‬

‫دودویی‬

‫‪/‬‬

‫محاسبه باقیمانده تقسیم دو عملوند‬

‫دودویی‬

‫‪%‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬
‫‪‬‬

‫این عملگرهای برروی همه انواع داده های ‪ C‬عمل می كنند‪ ،‬بجز عملگر ‪ %‬كه فقط‬
‫برروی نوع داده های صحیح عمل می كند‪.‬‬
‫اما نكته مهمی كه باید به آن اشاره كرد‪ ،‬نحوه كار عملگر تقسیم برروی نوع داده های‬
‫مختلف است‪.‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫درصورتیكه هردو عملوند صحیح باشند‪ ،‬تقسیم بصورت صحیح بر صحیح انجام خواهد شد‪.‬‬
‫اگر یكی یا هر دو عملوند اعشاری باشند‪ ،‬تقسیم بصورت اعشاری انجام خواهد پذیرفت‪.‬‬
‫فرض كنید تعاریف زیر را داریم ‪:‬‬
‫; ‪int a,b‬‬
‫; ‪float c,d‬‬
‫; ‪a = 10 ; b = 4‬‬
‫;‪c = 8.2; d = 4.0‬‬
‫اكنون به نتایج عملیات زیر دقت كنید ‪:‬‬
‫‪a / b => 2‬‬
‫‪c / d => 2.05‬‬
‫‪a / d => 2.5‬‬
‫‪a / 4 => 2‬‬
‫چنانچه به آخرین مورد توجه كنید‪ ،‬متوجه می شوید كه از آنجا كه ‪a‬یك متغیر صحیح است و ‪4‬‬
‫نیز یك ثابت صحیح در نظر گرفته شده‪ ،‬درنتیجه تقسیم بصورت صحیح بر صحیح انجام گرفته‬
‫است‪ .‬چنانچه بخواهیم تقسیم بصورت اعشاری صورت پذیرد‪ ،‬به دو شكل می توانیم عمل‬
‫كنیم‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫برای اینکه عبارت تقسیم صفحه قبل بصورت اعشاری انجام شود‪ ،‬به دو روش‬
‫می توان عمل کرد‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫این عبارت را بصورت ‪ a / 4.0‬بنویسیم‪.‬‬
‫از عملگر قالب ریزی استفاده كنیم‪.‬‬

‫عملگر قالب ریزی می تواند یك نوع را به نوع دیگری تبدیل نماید‪ .‬شكل كلی آن‬
‫به شكل زیر است ‪:‬‬
‫>‪() ‫كه ‪ type‬نوع مورد نظر است كه قصد تبدیل عبارت ‪ expression‬به آن نوع را‬
‫داریم‪ .‬بعنوان مثال در مورد قبلی می توان به شكل زیر عمل كرد ‪:‬‬
‫‪(float) a / 4‬‬
‫در این حالت از كامپایلر خواسته ایم كه ابتدا عدد ‪ a‬را به اعشاری تبدیل كند‬
‫)البته بصورت موقت( و سپس آن را بر ‪ 4‬تقسیم نماید‪ ،‬كه مسلما حاصل‬
‫اعشاری خواهد بود‪.‬‬
‫بطوركلی هرگاه ثابتها و متغیرهایی از انواع مختلف در یك عبارت محاسباتی‬
‫داشته باشیم‪ ،‬كامپایلر ‪ C‬همه آنها را به یك نوع یكسان كه همان بزرگترین‬
‫عملوند موجود است تبدیل خواهد كرد‪ .‬بعنوان مثال به مورد صفحه بعد دقت‬
‫كنید ‪:‬‬

‫ عملگرهای محاسباتی‬7-5-1
char ch;
int i;

float f;
double d;
result = (ch / i)
int

+

(f *d)

(f+i)
float

double

double

int

-

double

double

float

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫اولویت عملگرها ‪ :‬در عبارتی که شامل چندین عملگر است‪ ،‬کدامیک در‬
‫ابتدا اعمال خواهد گردید‪.‬‬
‫اولویت عملگرهای محاسباتی از باال به پایین بشرح زیر است‪:‬‬
‫‪ ‬عملگر یکانی –‬
‫‪ ‬عملگرهای * و ‪ /‬و ‪%‬‬
‫‪ ‬عملگرهای ‪ +‬و –‬
‫چنانچه اولویت دو عملگر یکسان باشد‪ ،‬این عملگرها از چپ به راست‬
‫محاسبه خواهند شد‪.‬‬
‫چنانچه بخواهیم یک عمل با اولویت پایین زودتر انجام شود‪ ،‬باید از پرانتز‬
‫استفاده کنیم‪ .‬بنابراین اولویت عملگر پرانتز از همه موارد فوق‬
‫بیشتراست‪ .‬در مورد پرانتزهای متداخل‪ ،‬ابتدا پرانتز داخلی محاسبه‬
‫می شود؛ اما در مورد پرانتزهای هم سطح‪ ،‬ابتدا پرانتز سمت چپتر‬
‫محاسبه می گردد‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫چند مثال در مورد اولویت عملگرها‬

‫ترتیب اجرای عملگرها‬

‫عبارت زبان ‪C‬‬

‫ابتدا عمل * و سپس عمل ‪+‬‬

‫‪b+c*d‬‬

‫ابتدا عمل ‪ +‬و سپس عمل *‬

‫‪(b + c) * d‬‬

‫ابتدا عمل ‪ /‬سپس عمل * و در انتها عمل ‪+‬‬

‫‪b+c/d*e‬‬

‫ابتدا عمل * سپس عمل ‪ /‬و در انتها عمل ‪+‬‬

‫)‪b + c / (d * e‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫یک مثال کامل در مورد اولویت عملگرها‬

‫‪result = a + b * (f – (g + b) / d) – c * (a – d) / e‬‬
‫‪6‬‬

‫‪1‬‬
‫‪7‬‬

‫‪2‬‬

‫‪8‬‬

‫‪3‬‬
‫‪4‬‬
‫‪5‬‬
‫‪9‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫در زبان ‪ C‬برای انتساب چندین عملگر وجود دارد‪ .‬ساده ترین عملگر انتساب‪ ،‬همان عملگر =‬
‫است که در بسیاری از زبانها استفاده می شود‪ .‬بعنوان مثال ‪:‬‬
‫;‪a = 5‬‬
‫;‪b = c + 2 * d‬‬
‫این عملگر باعث می شود که عبارت سمت راست در عبارت سمت چپ قرار گیرد‪.‬‬
‫توجه کنید که مقدار سمت چپ باید عبارتی باشد که بتوان به آن یک مقدار را نسبت داد‬
‫)مانند یک متغیر( که به آن ‪ Lvalue‬گفته می شود‪ ،‬بنابراین یک ثابت نمی تواند در سمت چپ‬
‫قرار گیرد‪.‬‬
‫نکته دیگر اینکه اولویت عملگر = از عملگرهای ریاضی کمتر است و درنتیجه ابتدا آن عملیات‬
‫انجام شده و در پایان حاصل در عبارت سمت چپ ریخته می شود‪.‬‬
‫الزم به ذکر است که در هنگام انتساب‪ ،‬درصورت لزوم نوع عبارت سمت راست به نوع عبارت‬
‫سمت چپ تبدیل می شود‪ .‬مثال‪:‬‬
‫;‪int a‬‬
‫;‪a = 2.5 * 5.0‬‬
‫که دراینصورت عدد ‪ 12‬در ‪ a‬ذخیره خواهد شد‪.‬‬
‫شرکت پذیری این عملگر از راست به چپ می باشد‪ ،‬بدین معنا که چنانچه چندین عملگر‬
‫نسبت دهی داشته باشیم‪ ،‬این عملگرها از راست به چپ محاسبه می شوند‪ .‬مثال پس از‬
‫اجرای دستور زیر‪ ،‬مقدار هر ‪ 3‬متغیر برابر ‪ 10‬خواهد شد‪.‬‬
‫;‪a = b = c = 10‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬

‫نکته جالب درمورد زبان ‪ C‬آنستکه دارای یک سری عملگرهای انتساب‬
‫خالصه شده است که باعث می شوند در بعضی موارد بتوانیم عبارات‬
‫کوتاهتری را بنویسیم‪ .‬این عملگرها عبارتند از ‪:‬‬
‫عملگرد‬

‫مثال‬

‫عبارت انتساب معادل‬

‫‪++‬‬

‫;‪a ++‬‬

‫;‪a = a + 1‬‬

‫‪--‬‬

‫;‪a --‬‬

‫;‪a = a – 1‬‬

‫=‪+‬‬

‫;‪a += 5‬‬

‫;‪a = a + 5‬‬

‫=‪-‬‬

‫;‪a -= 8‬‬

‫;‪a= a – 8‬‬

‫=*‬

‫;‪a *= 10‬‬

‫;‪a= a * 10‬‬

‫=‪/‬‬

‫;‪a /= 2‬‬

‫;‪a = a / 2‬‬

‫=‪%‬‬

‫;‪a %= 10‬‬

‫;‪a = a % 10‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬
‫‪‬‬

‫عملگر اول و دوم‪ ،‬عملگرهای یکانی هستند که بترتیب عملگر افزایش و عملگر کاهش‬
‫نامیده می شوند‪.‬‬
‫نکته جالب آنستکه این دو عملگر به دوصورت مورد استفاده قرار می گیرند‪.‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫در حالتی که از دستور ;‪ a ++‬استفاده شود به آن پس افزایش می گویند و بدین معناست که‬
‫ابتدا از مقدار فعلی ‪ a‬در عبارت موردنظر استفاده کن و سپس آن را افزایش بده‪.‬‬
‫اما دستور ;‪ ++ a‬که به آن پیش افزایش گفته می شود‪ ،‬ابتدا ‪ a‬را افزایش داده و سپس از آن‬
‫در عبارت استفاده می کند‪.‬‬
‫به برنامه زیر دقت کنید‪:‬‬

‫>‪#include ‫{ )(‪void main‬‬
‫; ‪int a ,b‬‬
‫;‪a=5‬‬
‫;‪b = a ++‬‬
‫;)‪printf(“a=%d and b=%d \n”,a,b‬‬
‫;‪a=5‬‬
‫;‪b = ++ a‬‬
‫;)‪printf(“a=%d and b=%d \n”,a,b‬‬
‫}‬
‫‪a=6 b=5‬‬
‫‪a=6 b=6‬‬

‫‪ 7-5-3‬عملگرهای مقایسه ای‬
‫‪‬‬

‫‪‬‬

‫این عملگرها دو عبارت را بایکدیگر مقایسه کرده و نتیجه را باز می گردانند‪.‬‬
‫نتیجه می تواند درست )‪ (true‬یا غلط )‪ (false‬باشد‪.‬‬
‫نتیجه این عملگرها یک عدد صحیح است که درصورت درست بودن ‪ 1‬و‬
‫درصورت غلط بودن ‪ 0‬باز می گردانند‪ .‬این عملگرها عبارتند از‪:‬‬
‫عملگر‬

‫مفهوم عملگر‬

‫مثال‬

‫<‬

‫بزرگتر )<(‬

‫‪a>b‬‬

‫>‬

‫کوچکتر )>(‬

‫‪a
‫=<‬

‫بزرگتر یا مساوی )≤(‬

‫‪a >= b‬‬

‫=>‬

‫کوچکتر یا مساوی )≥(‬

‫‪a <= b‬‬

‫==‬

‫مساوی )=(‬

‫‪a == b‬‬

‫=!‬

‫نامساوی )≠(‬

‫‪a != b‬‬

‫‪ 7-5-3‬عملگرهای مقایسه ای‬
‫‪‬‬

‫‪‬‬

‫نکته مهمی که باید به آن دقت کرد عملگر مساوی )==( است‪ ،‬چرا که یک‬
‫اشتباه بسیار متداول برنامه نویسان ‪ C‬استفاده اشتباه از عملگر انتساب‬
‫)=( بجای عملگر تساوی )==( است که باعث ایجاد خطا در برنامه می‬
‫شود‪.‬‬
‫اولویت این عملگرها از باال به پایین بشرح زیر است‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫عملگرهای <‪ <= ، > ،‬و =>‬
‫عملگرهای == و =!‬

‫الزم بذکر است که در هنگام مساوی بودن اولویت چند عملگر‪ ،‬این عملگرها‬
‫از چپ به راست محاسبه می گردند‪.‬‬

‫‪ 7-5-4‬عملگرهای منطقی‬
‫‪‬‬

‫این عملگرها به شما اجازه می دهند که شرطهای ساده ای را که با‬
‫استفاده از عملگرهای مقایسه ای ایجاد شده اند را با یکدیگر ترکیب نموده‬
‫و شرطهای پیچیده تری را بسازید‪ .‬این عملگرها عبارتند از ‪:‬‬
‫مثال‬

‫عملگر‬

‫مفهوم عملگر‬

‫نحوه کار‬

‫&&‬

‫‪ AND‬منطقی‬

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

‫‪a>0 && sw==1‬‬

‫||‬

‫‪ OR‬منطقی‬

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

‫‪a<=100 || b!=0‬‬

‫!‬

‫‪ NOT‬منطقی‬

‫اگر عملوند درست باشد‪ ،‬نادرست و‬
‫اگر نادرست باشد‪ ،‬درست برمی‬
‫گرداند‪.‬‬

‫)‪! (a==1 || b<10‬‬

‫‪ 7-5-5‬عملگر شرطی‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫گاهی الزم است که ابتدا یک شرط بررسی شده و سپس برمبنای نتیجه )درست یا نادرست بودن آن( یکی‬
‫از دو عبارت ممکن بازگردانده شود‪ .‬برای اینکار می توان از یک عملگر ‪3‬تایی )با ‪ 3‬عملوند( بنام عملگر‬
‫شرطی استفاده نمود‪.‬‬
‫شکل کلی این عملگر بصورت زیر است‪:‬‬
‫>عبارت‪> :<2‬عبارت‪> ?<1‬شرط<‬
‫نحوه کار بدینصورت است که درصورت درست بودن شرط‪ ،‬عبارت‪ 1‬و در غیراینصورت عبارت ‪ 2‬بازگردانده می‬
‫شود‪.‬‬
‫به عنوان مثال به دستور زیر توجه کنید‪:‬‬
‫که این عبارت معادل دستور زیر است‪:‬‬

‫‪‬‬

‫;‪a = (k<10) ? 100 : 50‬‬
‫;‪if (k<10) a=100‬‬
‫;‪else a=50‬‬

‫البته این عبارت به شکلهای پیچیده نیز می تواند مورد استفاده قرار گیرد‪ .‬مثال ‪:‬‬
‫;‪c += (a>0 && a<10) ? ++a : a/b‬‬
‫که معادل است با ‪:‬‬
‫{ )‪if (a>0 && a<10‬‬
‫;‪a= a + 1‬‬
‫;‪c = c + a‬‬
‫}‬
‫;‪else c = c + a/b‬‬

‫‪ 7-5-6‬اولویت عملگرها‬
‫عملگر‬

‫اولویت‬

‫شرکت پذیری‬

‫‪1‬‬

‫)(‬

‫از چپ به راست‬

‫‪2‬‬

‫‪- + ! -- ++‬‬

‫از راست به چپ‬

‫‪3‬‬

‫‪* / %‬‬

‫از چپ به راست‬

‫‪4‬‬

‫‪+ -‬‬

‫از چپ به راست‬

‫‪5‬‬

‫>> <<‬

‫از چپ به راست‬

‫‪6‬‬

‫>= > <= <‬

‫از چپ به راست‬

‫‪7‬‬

‫=! ==‬

‫از چپ به راست‬

‫‪8‬‬

‫&&‬

‫از چپ به راست‬

‫‪9‬‬

‫||‬

‫از چپ به راست‬

‫‪10‬‬

‫‪?:‬‬

‫از راست به چپ‬

‫‪11‬‬

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

‫از راست به چپ‬

‫‪12‬‬

‫‪,‬‬

‫از چپ به راست‬

‫‪ 7-6‬خواندن و نمایش اطالعات‬
‫‪‬‬

‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫همانطور كه قبال نیز گفته شد‪ ،‬یكی از اهداف زبان ‪ C‬قابل حمل بودن آن‬
‫است‪ .‬بهمین منظور سعی شده است كه از دستوراتی كه ممكن است‬
‫وابسته به ماشین خاصی باشد‪ ،‬اجتناب گردد‪.‬‬
‫بهمین دلیل زبان ‪ C‬برخالف سایر زبانها دارای هیچ دستوری برای‬
‫خواندن از ورودی و یا نوشتن در خروجی نیست‪.‬‬
‫اما در عوض دارای تعدادی تابع )زیربرنامه( استاندارد می باشد كه تقریبا‬
‫تمامی كامپایلرها از آنها حمایت می كنند‪.‬‬
‫این كار به كامپایلر این امكان را می دهد كه بر حسب نوع سخت افزار‬
‫موردنظر‪ ،‬توابع ورودی و خروجی را طراحی نماید‪.‬‬
‫این توابع در یك فایل سرآمد بنام ‪ stdio.h‬تعریف شده اند و بنابراین قبل‬
‫ازاینكه بتوانید از این توابع استفاده نمایید‪ ،‬باید این فایل را نیز با استفاده‬
‫از ‪ #include‬در برنامه خود بگنجانید‪.‬‬

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫برای نمایش اطالعات در خروجی از تابع ‪ printf‬استفاده می شود‪.‬‬
‫این تابع رشته موردنظر شما را به خروجی استاندارد )كه در حالت‬
‫عادی همان صفحه نمایش یا مانیتور است( می فرستد‪ .‬شكل كلی این‬
‫تابع بصورت زیر است‪:‬‬
‫; )>لیست متغیرها< ‪> ,‬رشته كنترلی<(‪printf‬‬
‫رشته كنترلی همان متنی است كه قصد چاپ آن را داریم‪ ،‬با ذكر این‬
‫نكته كه در قسمتهایی كه باید مقدار یك متغیر چاپ شود‪ ،‬از یك‬
‫مشخصه تبدیل استفاده می شود‪ .‬هر مشخصه تبدیل از یك عالمت ‪%‬‬
‫بعالوه یك كاراكتر كه نوع متغیر مورد نظر را نشان می دهد تشكیل می‬
‫گردد‪.‬‬
‫لیست متغیرها نیز همان متغیرهایی هستند كه قصد چاپ آنها را داریم‪.‬‬
‫این متغیرها باید بترتیب قرار گرفته و با كاما )‪ (,‬از یكدیگر جدا شوند‪.‬‬

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫مشخصه تبدیل‬

‫مفهوم‬

‫‪%c‬‬

‫كاراكتر‬

‫‪%d‬‬

‫عدد صحیح در مبنای ‪10‬‬

‫‪%f‬‬

‫عدد اعشاری بدون نماد علمی‬

‫‪%e‬‬

‫عدد اعشاری با نماد علمی‬

‫‪%g‬‬

‫عدد اعشاری با حالت كوتاهتر بین ‪ e‬و ‪f‬‬

‫‪%s‬‬

‫رشته‬

‫‪%ld‬‬

‫عدد صحیح بزرگ‬

‫‪%lf %le %lg‬‬

‫عدد اعشاری بزرگ‬

‫‪%o‬‬

‫عدد صحیح در مبنای ‪8‬‬

‫‪%x‬‬

‫عدد صحیحی در مبنای ‪16‬‬

‫‪%u‬‬

‫عدد صحیح بدون عالمت‬

‫ تابع نمایش در خروجی‬7-6-1
#include
void main() {
int age = 20;
floate average = 18.23;
printf("You are %d years old and your average is %f \n",age,average);
}
You are 20 years old and your average is 18.230000

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫‪‬‬
‫‪‬‬

‫برای کنترل نحوه چاپ اعداد می توانید از مشخصه طول میدان استفاده‬
‫کنید‪.‬‬
‫مشخصه طول میدان برای اعداد به شكل زیر استفاده می شود‪:‬‬
‫‪ ‬برای اعداد صحیح از ‪ %nd‬استفاده می كنیم كه ‪ n‬تعداد ارقام را نشان‬
‫می دهد )مثال ‪ .(%3d‬در اینصورت برای هر متغیر ‪ n‬رقم درنظر گرفته‬
‫می شود‪ .‬اگر اندازه عدد از ‪ n‬كوچكتر باشد‪ ،‬به سمت چپ آن فضای‬
‫خالی اضافه می شود و اگر اندازه عدد بیش از ‪ n‬رقم باشد‪ ،‬طول میدان‬
‫نادیده گرفته شده و عدد بطور كامل چاپ می شود‪.‬‬
‫‪ ‬برای اعداد اعشاری از ‪ %n.mf‬استفاده می كنیم كه ‪ n‬اندازه كل عدد‬
‫)شامل عالمت ممیز( و ‪ m‬تعداد ارقام اعشار است )مثال ‪ .(%5.2f‬در‬
‫صورتیكه تعداد ارقام اعشاری عدد موردنظر از ‪ m‬بیشتر باشد‪ ،‬عدد به ‪m‬‬
‫عدد اعشار گرد می شود و در صورتیكه از ‪ m‬كمتر باشد‪ ،‬در سمت‬
‫راست آن ‪ 0‬قرار داده می شود‪.‬‬

‫‪ 7-6-2‬تابع خواندن از ورودی‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای خواندن اطالعات از ورودی از تابع ‪ scanf‬استفاده می شود‪.‬‬
‫این تابع اطالعات را ازورودی استاندارد )معموال صفحه كلید( خوانده و در‬
‫متغیرهای تعیین شده قرار می دهد‪.‬‬
‫شكل كلی این تابع بصورت زیر است‪:‬‬
‫; )>لیست آدرسهای متغیرها< ‪> ,‬رشته كنترلی<(‪scanf‬‬
‫همانطور كه می بینید نحوه احضار تابع ‪ scanf‬نیز مشابه ‪ printf‬است‪ .‬تنها‬
‫تفاوت در آن است كه در ‪ scanf‬باید لیست آدرسهای متغیرها ارسال شود‪.‬‬
‫مبحث مربوط به آدرسها در فصول بعدی بررسی خواهد شد ولی در حال حاضر‬
‫بخاطر بسپارید كه برای بدست آوردن آدرس یك متغیر از عالمت & استفاده می‬
‫كنیم‪ .‬بعنوان مثال ‪ &age‬بمعنای آدرس متغیر ‪ age‬است‪.‬‬
‫بطور كلی در ‪ C‬قدیمی هرگاه كه یك تابع دارای پارامترهای خروجی بود )یعنی‬
‫پارامترهایی كه یك مقدار را باز می گرداندند( از آدرس متغیرها استفاده می‬
‫شد كه امروزه این مسئله وجود ندارد‪.‬‬

‫ تابع خواندن از ورودی‬7-6-2
#include
void main() {
int age;
float average ;
printf("Please enter your age and average : ");
scanf("%d %f",&age,&average);
printf("You are %d years old and your average is %5.2f \n",age,average);
}

Please enter your age and average : 19 16.72
You are 19 years old and your average is 16.72

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫زبان ‪ C++‬یک زبان شی گرا است‪ ،‬بهمین دلیل در این زبان برای ورودی‬
‫و خروجی از اشیاء بجای توابع استفاده می گردد‪.‬‬
‫از آنجا که امروزه معموال برنامه نویسان ‪ C‬از کامپایلرهای ‪ C++‬استفاده‬
‫می کنند‪ ،‬می توانند از اشیای ورودی و خروجی آن نیز استفاده کنند‪.‬‬
‫اینکار در بین بسیاری از برنامه نویسان ‪ C‬متداول است‪ ،‬بهمین دلیل ما‬
‫در اینجا نحوه کار با اشیای خواندن و نوشتن در ‪ C++‬را بطور مقدماتی‬
‫توضیح می دهیم؛ گرچه توضیح کامل این موارد نیاز به آشنایی با شی‬
‫گرایی و زبان ‪ C++‬دارد‪.‬‬
‫قبل از هرچیز الزم به ذکر است که کلیه اشیای مربوط به ورودی و‬
‫خروجی در فایل سرآمدی بنام ‪ iostream.h‬تعیریف شده اند‪ ،‬بنابراین‬
‫ابتدا باید این فایل به برنامه توسط دستور ‪ #include‬الحاق گردد‪.‬‬

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫زبان ‪ C++‬برای نمایش اطالعات از یک شیئ بنام ‪ cout‬استفاده می نماید‪.‬‬
‫برای ارسال اطالعات مورد نظر برای چاپ به ‪ cout‬باید از عملگر درج در جریان‬
‫یا >> استفاده نماییم‪ .‬بعنوان مثال ‪:‬‬
‫; ” ‪cout >> “Please enter your name:‬‬
‫و یا مثال دیگر ‪:‬‬
‫;‪int a = 10‬‬
‫;‪float b = 2.86‬‬
‫;‪cout << a‬‬
‫;‪cout << b‬‬
‫نکته جالبی که در این مثالها دیده می شود‪ ،‬آنستکه برخالف تابع ‪ printf‬هیچ‬
‫نیازی به مشخص کردن نوع متغیری که قصد چاپ آن را داریم نیست و خود‬
‫شئ ‪ cout‬نوع آن را تشخیص می دهد‪.‬‬
‫عالوه براین می توان چندین عملگر درج در جریان را با یکدیگر الحاق کرد و‬
‫چندین متغیر را با یک دستور چاپ کرد‪.‬‬

C++ ‫ ورودی و خروجی اطالعات در‬7-6-3
#include
void main() {
int age = 20;
floate average = 18.23;
cout >> “You are ” >> age >> “ years old and your average is ” >> average ;
}

You are 20 years old and your average is 18.230000

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای دریافت اطالعات از کاربر‪ ،‬از شئ دیگری بنام ‪ cin‬استفاده می شود‪.‬‬
‫برای ارسال متغیر مورد نظر به ‪ cin‬باید از عملگر استخراج از جریان یا <<‬
‫استفاده نماییم‪ .‬بعنوان مثال‪:‬‬
‫;‪int a‬‬
‫;‪cin >> a‬‬
‫بازهم همانطور که می بینید نیازی به تعیین نوع متغیر موردنظر نیست و خود‬
‫شئ ‪ cin‬نوع متغیر را بطور اتوماتیک تشخیص داده و داده ای از همان نوع را از‬
‫کاربر دریافت و در متغیر مورد نظر قرار می دهد‪.‬‬
‫عملگرهای استخراج از جریان را نیز می توان با یکدیگر الحاق کرد‪.‬‬
‫برای رفتن به خط بعد در شئ ‪ cout‬می توان از دستکاری کننده ‪ endl‬استفاده‬
‫کرد‪ .‬مثال در دستور زیر پس از چاپ پیغام‪ ،‬مکان نما به خط بعد منتقل می‬
‫شود‪:‬‬
‫;‪cout >> “List of students : “ >> endl‬‬
‫البته دستکاری کننده های متعدد دیگری نیز ازجمله موارد مربوط به تعیین طول‬
‫میدان و نحوه چاپ مقادیر وجود دارد که توضیح آنها نیاز به یک مبحث مستقل‬
‫دارد‪.‬‬

C++ ‫ ورودی و خروجی اطالعات در‬7-6-3
#include
void main() {
int age;
float average ;
cout << "Please enter your age and average : " ;
cin >> age >> average ;
cout << "You are " << age << "years old and your average is " << average;
}

Please enter your age and average : 19 16.72
You are 19 years old and your average is 16.72

‫‪ 7-7‬توابع کتابخانه ای‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫همانطور که قبال نیز گفته شد‪ ،‬زبان ‪ C‬از زیر برنامه ها نیز حمایت می کند‪ .‬هر زیر برنامه‬
‫در ‪ C‬یک تابع نامیده می شود‪ .‬تا کنون با توابعی همچون ‪ main‬و یا ‪ printf‬و ‪ scanf‬آشنا‬
‫شده ایم‪.‬‬
‫معموال عرضه کنندگان کامپایلرها و یا سایر فروشندگان نرم افزار‪ ،‬برخی از توابع عمومی‬
‫را که ممکن است مورد نیاز جمع کثیری از برنامه نویسان مختلف باشد را در قالب‬
‫کتابخانه ای از توابع در اختیار برنامه نویسان می گذارند‪ .‬بعضی از این توابع کتابخانه ای‬
‫مانند ‪ printf‬و ‪ scanf‬بصورت استاندارد درآمده و توسط عرضه کنندگان مختلف ارائه می‬
‫شوند‪.‬‬
‫در کامپایلر عرضه شده توسط شرکت بورلند )‪ (Borland C++ 3.1‬نیز کتابخانه های‬
‫متعددی از توابع برای شما عرضه شده اند که بتدریج با آنها و کاربردشان آشنا خواهید‬
‫شد‪.‬‬
‫نکته مهم آنستکه برای استفاده از این توابع ابتدا باید فایل سرآمد مربوط به آنها را نیز در‬
‫ابتدای برنامه خود اضافه نمایید ) با استفاده از ‪ .(#include‬هر فایل سرآمد شامل تعاریف‬
‫اولیه گروهی از توابع مرتبط با هم و داده های مربوط به آنها بوده و در استاندارد قدیمی‬
‫تر دارای پسوند ‪ .h‬می باشد)در استاندارد جدید پسوند این فایلها حذف شده است(‪.‬‬
‫برخی از این فایلهای سرآمد عبارتند از‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪ : stdio.h‬توابع ورودی و خروجی استاندارد‬
‫‪ : math.h‬توابع ریاضی‬
‫‪ : graphics.h‬توابع مربوط به عملیات گرافیکی‬
‫‪ : string.h‬توابع مربوط به کار با رشته ها‬


Slide 27

‫مبانی کامپیوتر و برنامه سازی‬
‫فصل هفتم ‪ :‬مفاهیم اولیه زبان ‪C‬‬
‫مدرس ‪ :‬نگین معروفی‬

‫‪ 7-1‬شناسه ها در ‪C‬‬
‫‪‬‬
‫‪‬‬

‫شناسه )‪ (identifier‬نامی است که به یک قسمت از برنامه مانند متغیر‪ ،‬تابع‪ ،‬ثابت و یا‬
‫‪ ...‬داده می شود‪.‬‬
‫در زبان ‪ C‬برای انتخاب شناسه ها فقط می توان از عالئم زیر استفاده کرد‪:‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫حروف انگلیسی کوچک و بزرگ )‪(A…Z a…z‬‬
‫ارقام )‪(0…9‬‬
‫عالمت خط پایین یا _‬

‫البته یک شناسه نمی تواند با یک رقم شروع شود‪.‬‬
‫چند شناسه مجاز‪ name2 ، average ، sum :‬و ‪student_average‬‬
‫چند شناسه غیرمجاز ‪ 2name‬و یا ‪student average‬‬
‫در برنامه نویسی امروزی پیشنهاد می شود بجای شناسه هایی همانند‬
‫‪ student_average‬از ‪ studentAverage‬استفاده گردد‪.‬‬
‫نکته مهم دیگری که باید به آن اشاره کرد آنستکه زبان ‪ C‬برخالف بسیاری از زبانهای دیگر‬
‫به کوچک و بزرگی حروف حساس است )‪ .(case sensitive‬در نتیجه شناسه های زیر با‬
‫یکدیگر متفاوتند ‪:‬‬
‫‪Sum ≠ sum ≠ SUM‬‬
‫آخرین نکته اینستکه در هنگام انتخاب شناسه نمی توانید از کلمات کلیدی که برای‬
‫منظورهای خاص در زبان ‪ C‬رزرو شده اند استفاده کنید‪.‬‬

C ‫ شناسه ها در‬7-1
: C ‫کلمات کلیدی در زبان‬
auto

break

case

char

const

continue

default

do

double

else

enum

extern

float

for

goto

if

int

long

register

return

short

signed

sizeof

static

struct

switch

typedef

union

unsigned

void

volatile

while

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫محدوده‬

‫اندازه )بیت(‬

‫توضیح‬

‫نوع داده‬

‫‪-128 to +127‬‬

‫‪8‬‬

‫کاراکتر‬

‫‪char‬‬

‫‪-32768 to +32767‬‬

‫‪16‬‬

‫عدد صحیح‬

‫‪int‬‬

‫‪3.4e-38 to 3.4e+38‬‬

‫‪32‬‬

‫عدد اعشاری‬

‫‪float‬‬

‫‪1.7e-308 to 1.7e+308‬‬

‫‪64‬‬

‫عدد اعشاری با‬
‫دقت مضاعف‬

‫‪double‬‬

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫‪‬‬

‫البته چند نکته مهم درمورد این جدول قابل ذکر است ‪:‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫اندازه ‪ int‬در محیطهای ‪ 16‬بیتی مانند ‪ DOS‬برابر ‪ 16‬بیت است‪ .‬اما در‬
‫محیطهای ‪ 32‬بیتی همانند ‪ Windows‬اندازه آن ‪ 32‬بیت می باشد که در‬
‫اینصورت محدوده ای برابر ‪ -2,147,483,648‬تا ‪ +2,147,483,647‬را‬
‫پوشش می دهد‪.‬‬
‫در بعضی از کامپایلرهای ‪ ،C‬نوع داده ‪ bool‬نیز وجود دارد که می تواند‬
‫یکی از مقادیر ‪)true‬درست( یا ‪) false‬غلط( را نشان دهد ‪ .‬اما در نسخه‬
‫های اولیه ‪ C‬از همان نوع داده صحیح یا ‪ int‬برای اینکار استفاده می‬
‫شد‪ .‬بدین صورت که ‪ 0‬نشاندهنده ‪ false‬و هر عدد غیر صفر )معموال ‪(1‬‬
‫نشاندهنده ‪ true‬است‪.‬‬
‫از آنجا که برای ذخیره سازی کاراکترها کد اسکی آنها ذخیره می گردد‪،‬‬
‫از یک متغیر کاراکتری یا ‪ char‬می توان بعنوان یک عدد صحیح کوچک نیز‬
‫استفاده کرد و اعمال ریاضی برروی آنها نیز مجاز است‪.‬‬

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫عالوه براین چندین اصالح کننده نیز وجود دارد که به ما اجازه می دهد نوع داده مورد‬
‫نظر را با دقت بیشتری برای نیازهای مختلف استفاده نماییم‪.‬‬
‫این اصالح کننده ها عبارتند از ‪short, long, signed, unsigned :‬‬
‫تمام این اصالح کننده ها می توانند به نوع داده ‪ int‬اعمال شوند و اثر آنها بستگی‬
‫به محیط دارد‪.‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫در یک محیط ‪16‬بیتی‪short int ،‬بازهم برابر ‪16‬بیت است ولی ‪ long int‬برابر‪32‬بیت می‬
‫باشد‪.‬‬
‫‪ unsigned int‬باعث می شود که یک عدد ‪ 16‬بیتی بدون عالمت داشته باشیم که بازه‬
‫بین ‪ 0‬تا ‪ 65535‬را پوشش می دهد‪ signed int .‬نیز همانند ‪ int‬معمولی بوده و تفاوتی‬
‫ندارد‪.‬‬
‫ترکیب این اصالح کننده ها نیز ممکن است‪ .‬مثال ‪ unsigned long int‬یک عدد ‪ 32‬بیتی‬
‫بدون عالمت است که بازه ‪ 0‬تا ‪ 4,294,967,295‬را پوشش می دهد‪.‬‬

‫برروی نوع داده ‪ char‬فقط اصالح کننده های ‪ signed‬و ‪ unsigned‬را می توان اعمال‬
‫کرد‪ .‬معموال از اصالح کننده ‪ unsigned‬وقتی استفاده می شود که قصد داشته‬
‫باشیم از ‪ char‬بعنوان یک عدد صحیح مثبت بین ‪ 0‬تا ‪ 255‬استفاده کنیم‪.‬‬
‫برروی نوع داده ‪ double‬تنها اصالح کننده ‪ long‬قابل اعمال است و دراینصورت عدد‬
‫اعشاری با ‪ 80‬بیت را خواهیم داشت که قادر است هر عددی در بازه ‪ 3.4e-4932‬تا‬
‫‪ 1.1e+4932‬را در خود نگاه دارد‪.‬‬

‫‪ 7-3‬تعریف متغیرها‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای تعریف متغیرها به شکل زیر عمل می کنیم‪:‬‬

‫;>‪ ‫که ‪ type‬یکی از نوع داده های گفته شده و ‪ variable-list‬لیستی از متغیرها است‬
‫که با کاما از یکدیگر جدا شده اند‪ .‬بعنوان مثال ‪:‬‬
‫;‪int sum‬‬
‫;‪float average‬‬
‫; ‪long int a, b, c‬‬
‫; ‪unsigned long int i, j, k‬‬
‫عالوه براین می توان در هنگام تعریف متغیر به آن مقدار اولیه نیز داد‪ .‬مثال ‪:‬‬
‫; ‪int d = 0‬‬
‫نكته مهم آنكه زبان ‪ C‬به متغیرها مقدار اولیه نمي دهد )حتي ‪ (0‬و برنامه نويس‬
‫خود بايد اينكار را صريحا انجام دهد‪ ،‬درغیر اينصورت مقدار اولیه متغیر‪ ،‬نامعین خواهد‬
‫بود‪.‬‬
‫تعریف متغیرها طبق اصول زبان ‪ C‬میتواند درهرجایی از برنامه صورت پذیرد‪ ،‬و‬
‫متغیرهای تعریف شده از همان خط به بعد قابل استفاده خواهد بود‪ .‬اما معموال‬
‫توصیه می گردد كه تعریف متغیرها در همان خط ابتدایی تابع و بالفاصله پس از {‬
‫صورت پذیرد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫‪‬‬
‫‪‬‬

‫ثابتها مقادیر ثابتی هستند كه مقدار آنها در حین اجرای برنامه تغییر نمی یابد‪ .‬ثابتها می توانند از‬
‫هریك از نوع داده های اصلی باشند‪.‬‬
‫ثوابت عددی صحیح ‪:‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫برای نمایش این دسته از ثوابت‪ ،‬از دنباله ای از ارقام بعالوه عالمت ‪ +‬یا ‪ -‬استفاده می كنیم‪ .‬بعنوان مثال‬
‫‪ -45‬و یا ‪ 3489‬ثوابت صحیح هستند‪.‬‬
‫در حالت عادی ‪ C‬هر عدد را در كوچكترین نوع داده ای كه می تواند قرار می دهد‪ .‬مثال عدد ‪ 85‬در یك‬
‫‪ int‬قرار می گیرد‪ ،‬اما عدد ‪ 145398‬در یك ‪ long int‬قرار خواهد گرفت‪.‬‬
‫اگر قصد دارید یك عدد كوچك بعنوان ‪ long‬محسوب گردد‪ ،‬می توانید از پسوند ‪ L‬در انتهای آن استفاده‬
‫می كنیم‪ .‬مثال ‪245L‬یك عدد ‪ long‬محسوب می شود‪.‬‬
‫;‪long int a = 20L‬‬
‫پسوند ‪ U‬در انتهای عدد نیز نشانه بدون عالمت بودن آن است‪.‬‬
‫نكته دیگر آنكه ‪ C‬به شما اجازه می دهد درصورت لزوم ثوابت صحیح خود را در مبنای ‪ 8‬یا ‪ 16‬نیز كه‬
‫از مبناهای متداول در برنامه نویسی هستند‪ ،‬بنویسید‪.‬‬
‫‪‬‬
‫‪‬‬

‫برای نوشتن عدد در مبنای ‪ 8‬باید آن را با ‪ 0‬آغاز كنید‪ ،‬مثال ‪ 0342‬یك عدد در منای ‪ 8‬محسوب می‬
‫گردد‪.‬‬
‫برای نوشتن یك عدد در مبنای ‪ 16‬باید آن را با ‪ 0x‬آغاز نمایید‪ ،‬مانند ‪.0x27A4‬‬

‫‪ 7-4‬ثوابت‬
‫ثوابت عددی اعشاری‬

‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫برای نمایش اعداد اعشاری‪ ،‬باید از نقطه اعشار استفاده كنیم‪ ،‬مانند ‪237.45‬‬
‫اما نكته جالب آنستكه می توانید از نماد علمی نیز برای نمایش اعداد‬
‫اعشاری استفاده كنید‪ .‬برای اینكار كافی است از حرف ‪ e‬برای نمایش قسمت‬
‫توان استفاده نمایید‪ .‬بعنوان مثال ‪:‬‬
‫‪-23.47 × 10 5 = -23.47e5‬‬
‫‪42.389 × 10 -3 = 42.389e-3‬‬
‫دقت كنید كه قسمت توان‪ ،‬حتما یك عدد صحیح است‪.‬‬
‫نكته جالب اینجاست كه برخالف مورد قبل‪ ،‬كامپایلر بطور پیش فرض داده های‬
‫اعشاری را از نوع ‪ double‬فرض می كند‪.‬چنانچه دوست دارید ثابت شما ازنوع‬
‫‪ float‬درنظر گرفته شود‪ ،‬در انتهای آن ‪ F‬قرار دهید‪ .‬ضمنا پسوند ‪ L‬نیز داده‬
‫اعشاری را از نوع ‪ long double‬درنظر می گیرد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫ثوابت كاراكتری ‪:‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫برای نشان دادن ثوابت كاراكتری‪ ،‬آنها را در داخل ' قرار می دهیم‪ .‬بعنوان مثال‬
‫'‪'A‬یك ثابت كاراكتری است‪.‬‬
‫; '‪char ch = 'S‬‬
‫دقت كنید كه همانطور كه قبال گفته شد‪ ،‬كد اسكی كاراكترها در متغیر ذخیره‬
‫می گردد‪ ،‬بنابراین می توان از آن بعنوان یك عدد صحیح نیز استفاده كرد‪ .‬نكته‬
‫مهم دیگر آنستكه به تفاوت عدد ‪ 5‬و كاراكتر '‪ '5‬دقت داشته باشید‪ .‬در حقیقت‬
‫'‪ '5‬برابر است با عدد ‪ 53‬كه همان كد اسكی آن است‪.‬‬
‫روش فوق‪ ،‬برای نمایش کاراکترهای قابل چاپ مناسب است‪ ،‬اما بعضی‬
‫كاراكترها مانند ‪ enter‬قابل نمایش نبوده و برای آنها شکل خاصی وجود ندارد‪.‬‬
‫در چنین مواردی‪ ،‬زبان ‪ C‬از ترکیب عالمت \ به همراه یک کاراکتر دیگر‪ ،‬برای‬
‫نمایش این قبیل کاراکترها استفاده می نماید‪ .‬بعنوان مثال‪ ،‬کاراکتر '‪ '\n‬نشان‬
‫دهنده خط جدید یا همان ‪ enter‬می باشد‪.‬‬
‫جدول صفحه بعد این قبیل کاراکترها و معادل آنها را نشان می دهد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫نحوه نمایش در ‪C‬‬

‫کد اسکی‬

‫صدای بوق کامپیوتر‬

‫‪\a‬‬

‫‪7‬‬

‫حرکت به عقب ‪backspace‬‬

‫‪\b‬‬

‫‪8‬‬

‫شروع صفحه ‪form feed‬‬

‫‪\f‬‬

‫‪12‬‬

‫سطر جدید ‪line feed‬‬

‫‪\n‬‬

‫‪10‬‬

‫برگشت به ابتداي سطر ‪carriage return‬‬

‫‪\r‬‬

‫‪13‬‬

‫فاصله افقی ‪horizontal tab‬‬

‫‪\t‬‬

‫‪9‬‬

‫فاصله عمودی ‪vertical tab‬‬

‫‪\v‬‬

‫‪11‬‬

‫عالمت سوال‬

‫?\‬

‫‪63‬‬

‫عالمت '‬

‫'\‬

‫‪39‬‬

‫عالمت "‬

‫"\‬

‫‪34‬‬

‫عالمت \‬

‫\\‬

‫‪92‬‬

‫عالمت تهی‬

‫‪\0‬‬

‫‪0‬‬

‫نام کاراکتر‬

‫کد اسکی یک کاراکتر با ‪ 3‬رقم در مبنای ‪8‬‬

‫‪\000‬‬

‫کد اسکی یک کاراکتر با ‪ 2‬رقم در مبنای ‪16‬‬

‫‪\x00‬‬

‫‪ 7-4‬ثوابت‬
‫‪‬‬

‫ثوابت رشته ای ‪ C :‬عالوه بر ثوابت فوق‪ ،‬از یك ثابت دیگر بنام رشته نیز‬
‫حمایت می كند‪ .‬رشته‪ ،‬دنباله ای از كاراكترها است كه در داخل " قرار‬
‫می گیرند‪ .‬بعنوان مثال "‪ "this is a test‬یك رشته است‪ .‬دقت كنید كه '‪'a‬‬
‫یك كاراكتر است‪ ،‬اما "‪ "a‬یك رشته است كه فقط شامل یك كاراكتر می‬
‫باشد‪.‬‬

‫‪ 7-5‬عملگرها‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫عملگر‪ ،‬نمادی است كه به كامپایلر می گوید تا عملیات محاسباتی یا‬
‫منطقی خاصی را برروی یك یا چند عملوند‪ ،‬انجام دهد‪.‬‬
‫به عملگرهایی كه فقط یك عملوند دارند‪ ،‬عملگر یكانی می گوییم و‬
‫همواره عملگر در سمت چپ عملوند قرار می گیرد)مانند عدد ‪.(-125‬‬
‫اما عملگرهایی كه برروی دو عملوند اثر می كنند را عملگر دودویی‬
‫نامیده و عملگر را بین دو عملوند قرار می دهیم )مانند ‪.(23+86‬‬
‫هر ترکیب درستی از عملگرها و عملوندها را یک عبارت می نامیم‪.‬‬
‫‪ C‬از نقطه نظر عملگرها یك زبان بسیار قوی است‪ .‬این عملگرها به چند‬
‫دسته اصلی تقسیم می گردند كه آنها را به ترتیب بررسی می كنیم‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫این عملگرها‪ ،‬همان اعمال متداول ریاضی هستند كه در زبان ‪ C‬مورد استفاده‬
‫قرار می گیرند‪ .‬این اعمال عبارتند از ‪:‬‬

‫عمل‬

‫نوع‬

‫عملگر‬

‫منفی كردن عملوند سمت راست‬

‫یكانی‬

‫‪-‬‬

‫جمع دو عملوند‬

‫دودویی‬

‫‪+‬‬

‫تفریق دو عملوند‬

‫دودویی‬

‫‪-‬‬

‫ضرب دو عملوند‬

‫دودویی‬

‫*‬

‫تقسیم دو عملوند‬

‫دودویی‬

‫‪/‬‬

‫محاسبه باقیمانده تقسیم دو عملوند‬

‫دودویی‬

‫‪%‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬
‫‪‬‬

‫این عملگرهای برروی همه انواع داده های ‪ C‬عمل می كنند‪ ،‬بجز عملگر ‪ %‬كه فقط‬
‫برروی نوع داده های صحیح عمل می كند‪.‬‬
‫اما نكته مهمی كه باید به آن اشاره كرد‪ ،‬نحوه كار عملگر تقسیم برروی نوع داده های‬
‫مختلف است‪.‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫درصورتیكه هردو عملوند صحیح باشند‪ ،‬تقسیم بصورت صحیح بر صحیح انجام خواهد شد‪.‬‬
‫اگر یكی یا هر دو عملوند اعشاری باشند‪ ،‬تقسیم بصورت اعشاری انجام خواهد پذیرفت‪.‬‬
‫فرض كنید تعاریف زیر را داریم ‪:‬‬
‫; ‪int a,b‬‬
‫; ‪float c,d‬‬
‫; ‪a = 10 ; b = 4‬‬
‫;‪c = 8.2; d = 4.0‬‬
‫اكنون به نتایج عملیات زیر دقت كنید ‪:‬‬
‫‪a / b => 2‬‬
‫‪c / d => 2.05‬‬
‫‪a / d => 2.5‬‬
‫‪a / 4 => 2‬‬
‫چنانچه به آخرین مورد توجه كنید‪ ،‬متوجه می شوید كه از آنجا كه ‪a‬یك متغیر صحیح است و ‪4‬‬
‫نیز یك ثابت صحیح در نظر گرفته شده‪ ،‬درنتیجه تقسیم بصورت صحیح بر صحیح انجام گرفته‬
‫است‪ .‬چنانچه بخواهیم تقسیم بصورت اعشاری صورت پذیرد‪ ،‬به دو شكل می توانیم عمل‬
‫كنیم‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫برای اینکه عبارت تقسیم صفحه قبل بصورت اعشاری انجام شود‪ ،‬به دو روش‬
‫می توان عمل کرد‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫این عبارت را بصورت ‪ a / 4.0‬بنویسیم‪.‬‬
‫از عملگر قالب ریزی استفاده كنیم‪.‬‬

‫عملگر قالب ریزی می تواند یك نوع را به نوع دیگری تبدیل نماید‪ .‬شكل كلی آن‬
‫به شكل زیر است ‪:‬‬
‫>‪() ‫كه ‪ type‬نوع مورد نظر است كه قصد تبدیل عبارت ‪ expression‬به آن نوع را‬
‫داریم‪ .‬بعنوان مثال در مورد قبلی می توان به شكل زیر عمل كرد ‪:‬‬
‫‪(float) a / 4‬‬
‫در این حالت از كامپایلر خواسته ایم كه ابتدا عدد ‪ a‬را به اعشاری تبدیل كند‬
‫)البته بصورت موقت( و سپس آن را بر ‪ 4‬تقسیم نماید‪ ،‬كه مسلما حاصل‬
‫اعشاری خواهد بود‪.‬‬
‫بطوركلی هرگاه ثابتها و متغیرهایی از انواع مختلف در یك عبارت محاسباتی‬
‫داشته باشیم‪ ،‬كامپایلر ‪ C‬همه آنها را به یك نوع یكسان كه همان بزرگترین‬
‫عملوند موجود است تبدیل خواهد كرد‪ .‬بعنوان مثال به مورد صفحه بعد دقت‬
‫كنید ‪:‬‬

‫ عملگرهای محاسباتی‬7-5-1
char ch;
int i;

float f;
double d;
result = (ch / i)
int

+

(f *d)

(f+i)
float

double

double

int

-

double

double

float

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫اولویت عملگرها ‪ :‬در عبارتی که شامل چندین عملگر است‪ ،‬کدامیک در‬
‫ابتدا اعمال خواهد گردید‪.‬‬
‫اولویت عملگرهای محاسباتی از باال به پایین بشرح زیر است‪:‬‬
‫‪ ‬عملگر یکانی –‬
‫‪ ‬عملگرهای * و ‪ /‬و ‪%‬‬
‫‪ ‬عملگرهای ‪ +‬و –‬
‫چنانچه اولویت دو عملگر یکسان باشد‪ ،‬این عملگرها از چپ به راست‬
‫محاسبه خواهند شد‪.‬‬
‫چنانچه بخواهیم یک عمل با اولویت پایین زودتر انجام شود‪ ،‬باید از پرانتز‬
‫استفاده کنیم‪ .‬بنابراین اولویت عملگر پرانتز از همه موارد فوق‬
‫بیشتراست‪ .‬در مورد پرانتزهای متداخل‪ ،‬ابتدا پرانتز داخلی محاسبه‬
‫می شود؛ اما در مورد پرانتزهای هم سطح‪ ،‬ابتدا پرانتز سمت چپتر‬
‫محاسبه می گردد‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫چند مثال در مورد اولویت عملگرها‬

‫ترتیب اجرای عملگرها‬

‫عبارت زبان ‪C‬‬

‫ابتدا عمل * و سپس عمل ‪+‬‬

‫‪b+c*d‬‬

‫ابتدا عمل ‪ +‬و سپس عمل *‬

‫‪(b + c) * d‬‬

‫ابتدا عمل ‪ /‬سپس عمل * و در انتها عمل ‪+‬‬

‫‪b+c/d*e‬‬

‫ابتدا عمل * سپس عمل ‪ /‬و در انتها عمل ‪+‬‬

‫)‪b + c / (d * e‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫یک مثال کامل در مورد اولویت عملگرها‬

‫‪result = a + b * (f – (g + b) / d) – c * (a – d) / e‬‬
‫‪6‬‬

‫‪1‬‬
‫‪7‬‬

‫‪2‬‬

‫‪8‬‬

‫‪3‬‬
‫‪4‬‬
‫‪5‬‬
‫‪9‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫در زبان ‪ C‬برای انتساب چندین عملگر وجود دارد‪ .‬ساده ترین عملگر انتساب‪ ،‬همان عملگر =‬
‫است که در بسیاری از زبانها استفاده می شود‪ .‬بعنوان مثال ‪:‬‬
‫;‪a = 5‬‬
‫;‪b = c + 2 * d‬‬
‫این عملگر باعث می شود که عبارت سمت راست در عبارت سمت چپ قرار گیرد‪.‬‬
‫توجه کنید که مقدار سمت چپ باید عبارتی باشد که بتوان به آن یک مقدار را نسبت داد‬
‫)مانند یک متغیر( که به آن ‪ Lvalue‬گفته می شود‪ ،‬بنابراین یک ثابت نمی تواند در سمت چپ‬
‫قرار گیرد‪.‬‬
‫نکته دیگر اینکه اولویت عملگر = از عملگرهای ریاضی کمتر است و درنتیجه ابتدا آن عملیات‬
‫انجام شده و در پایان حاصل در عبارت سمت چپ ریخته می شود‪.‬‬
‫الزم به ذکر است که در هنگام انتساب‪ ،‬درصورت لزوم نوع عبارت سمت راست به نوع عبارت‬
‫سمت چپ تبدیل می شود‪ .‬مثال‪:‬‬
‫;‪int a‬‬
‫;‪a = 2.5 * 5.0‬‬
‫که دراینصورت عدد ‪ 12‬در ‪ a‬ذخیره خواهد شد‪.‬‬
‫شرکت پذیری این عملگر از راست به چپ می باشد‪ ،‬بدین معنا که چنانچه چندین عملگر‬
‫نسبت دهی داشته باشیم‪ ،‬این عملگرها از راست به چپ محاسبه می شوند‪ .‬مثال پس از‬
‫اجرای دستور زیر‪ ،‬مقدار هر ‪ 3‬متغیر برابر ‪ 10‬خواهد شد‪.‬‬
‫;‪a = b = c = 10‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬

‫نکته جالب درمورد زبان ‪ C‬آنستکه دارای یک سری عملگرهای انتساب‬
‫خالصه شده است که باعث می شوند در بعضی موارد بتوانیم عبارات‬
‫کوتاهتری را بنویسیم‪ .‬این عملگرها عبارتند از ‪:‬‬
‫عملگرد‬

‫مثال‬

‫عبارت انتساب معادل‬

‫‪++‬‬

‫;‪a ++‬‬

‫;‪a = a + 1‬‬

‫‪--‬‬

‫;‪a --‬‬

‫;‪a = a – 1‬‬

‫=‪+‬‬

‫;‪a += 5‬‬

‫;‪a = a + 5‬‬

‫=‪-‬‬

‫;‪a -= 8‬‬

‫;‪a= a – 8‬‬

‫=*‬

‫;‪a *= 10‬‬

‫;‪a= a * 10‬‬

‫=‪/‬‬

‫;‪a /= 2‬‬

‫;‪a = a / 2‬‬

‫=‪%‬‬

‫;‪a %= 10‬‬

‫;‪a = a % 10‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬
‫‪‬‬

‫عملگر اول و دوم‪ ،‬عملگرهای یکانی هستند که بترتیب عملگر افزایش و عملگر کاهش‬
‫نامیده می شوند‪.‬‬
‫نکته جالب آنستکه این دو عملگر به دوصورت مورد استفاده قرار می گیرند‪.‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫در حالتی که از دستور ;‪ a ++‬استفاده شود به آن پس افزایش می گویند و بدین معناست که‬
‫ابتدا از مقدار فعلی ‪ a‬در عبارت موردنظر استفاده کن و سپس آن را افزایش بده‪.‬‬
‫اما دستور ;‪ ++ a‬که به آن پیش افزایش گفته می شود‪ ،‬ابتدا ‪ a‬را افزایش داده و سپس از آن‬
‫در عبارت استفاده می کند‪.‬‬
‫به برنامه زیر دقت کنید‪:‬‬

‫>‪#include ‫{ )(‪void main‬‬
‫; ‪int a ,b‬‬
‫;‪a=5‬‬
‫;‪b = a ++‬‬
‫;)‪printf(“a=%d and b=%d \n”,a,b‬‬
‫;‪a=5‬‬
‫;‪b = ++ a‬‬
‫;)‪printf(“a=%d and b=%d \n”,a,b‬‬
‫}‬
‫‪a=6 b=5‬‬
‫‪a=6 b=6‬‬

‫‪ 7-5-3‬عملگرهای مقایسه ای‬
‫‪‬‬

‫‪‬‬

‫این عملگرها دو عبارت را بایکدیگر مقایسه کرده و نتیجه را باز می گردانند‪.‬‬
‫نتیجه می تواند درست )‪ (true‬یا غلط )‪ (false‬باشد‪.‬‬
‫نتیجه این عملگرها یک عدد صحیح است که درصورت درست بودن ‪ 1‬و‬
‫درصورت غلط بودن ‪ 0‬باز می گردانند‪ .‬این عملگرها عبارتند از‪:‬‬
‫عملگر‬

‫مفهوم عملگر‬

‫مثال‬

‫<‬

‫بزرگتر )<(‬

‫‪a>b‬‬

‫>‬

‫کوچکتر )>(‬

‫‪a
‫=<‬

‫بزرگتر یا مساوی )≤(‬

‫‪a >= b‬‬

‫=>‬

‫کوچکتر یا مساوی )≥(‬

‫‪a <= b‬‬

‫==‬

‫مساوی )=(‬

‫‪a == b‬‬

‫=!‬

‫نامساوی )≠(‬

‫‪a != b‬‬

‫‪ 7-5-3‬عملگرهای مقایسه ای‬
‫‪‬‬

‫‪‬‬

‫نکته مهمی که باید به آن دقت کرد عملگر مساوی )==( است‪ ،‬چرا که یک‬
‫اشتباه بسیار متداول برنامه نویسان ‪ C‬استفاده اشتباه از عملگر انتساب‬
‫)=( بجای عملگر تساوی )==( است که باعث ایجاد خطا در برنامه می‬
‫شود‪.‬‬
‫اولویت این عملگرها از باال به پایین بشرح زیر است‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫عملگرهای <‪ <= ، > ،‬و =>‬
‫عملگرهای == و =!‬

‫الزم بذکر است که در هنگام مساوی بودن اولویت چند عملگر‪ ،‬این عملگرها‬
‫از چپ به راست محاسبه می گردند‪.‬‬

‫‪ 7-5-4‬عملگرهای منطقی‬
‫‪‬‬

‫این عملگرها به شما اجازه می دهند که شرطهای ساده ای را که با‬
‫استفاده از عملگرهای مقایسه ای ایجاد شده اند را با یکدیگر ترکیب نموده‬
‫و شرطهای پیچیده تری را بسازید‪ .‬این عملگرها عبارتند از ‪:‬‬
‫مثال‬

‫عملگر‬

‫مفهوم عملگر‬

‫نحوه کار‬

‫&&‬

‫‪ AND‬منطقی‬

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

‫‪a>0 && sw==1‬‬

‫||‬

‫‪ OR‬منطقی‬

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

‫‪a<=100 || b!=0‬‬

‫!‬

‫‪ NOT‬منطقی‬

‫اگر عملوند درست باشد‪ ،‬نادرست و‬
‫اگر نادرست باشد‪ ،‬درست برمی‬
‫گرداند‪.‬‬

‫)‪! (a==1 || b<10‬‬

‫‪ 7-5-5‬عملگر شرطی‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫گاهی الزم است که ابتدا یک شرط بررسی شده و سپس برمبنای نتیجه )درست یا نادرست بودن آن( یکی‬
‫از دو عبارت ممکن بازگردانده شود‪ .‬برای اینکار می توان از یک عملگر ‪3‬تایی )با ‪ 3‬عملوند( بنام عملگر‬
‫شرطی استفاده نمود‪.‬‬
‫شکل کلی این عملگر بصورت زیر است‪:‬‬
‫>عبارت‪> :<2‬عبارت‪> ?<1‬شرط<‬
‫نحوه کار بدینصورت است که درصورت درست بودن شرط‪ ،‬عبارت‪ 1‬و در غیراینصورت عبارت ‪ 2‬بازگردانده می‬
‫شود‪.‬‬
‫به عنوان مثال به دستور زیر توجه کنید‪:‬‬
‫که این عبارت معادل دستور زیر است‪:‬‬

‫‪‬‬

‫;‪a = (k<10) ? 100 : 50‬‬
‫;‪if (k<10) a=100‬‬
‫;‪else a=50‬‬

‫البته این عبارت به شکلهای پیچیده نیز می تواند مورد استفاده قرار گیرد‪ .‬مثال ‪:‬‬
‫;‪c += (a>0 && a<10) ? ++a : a/b‬‬
‫که معادل است با ‪:‬‬
‫{ )‪if (a>0 && a<10‬‬
‫;‪a= a + 1‬‬
‫;‪c = c + a‬‬
‫}‬
‫;‪else c = c + a/b‬‬

‫‪ 7-5-6‬اولویت عملگرها‬
‫عملگر‬

‫اولویت‬

‫شرکت پذیری‬

‫‪1‬‬

‫)(‬

‫از چپ به راست‬

‫‪2‬‬

‫‪- + ! -- ++‬‬

‫از راست به چپ‬

‫‪3‬‬

‫‪* / %‬‬

‫از چپ به راست‬

‫‪4‬‬

‫‪+ -‬‬

‫از چپ به راست‬

‫‪5‬‬

‫>> <<‬

‫از چپ به راست‬

‫‪6‬‬

‫>= > <= <‬

‫از چپ به راست‬

‫‪7‬‬

‫=! ==‬

‫از چپ به راست‬

‫‪8‬‬

‫&&‬

‫از چپ به راست‬

‫‪9‬‬

‫||‬

‫از چپ به راست‬

‫‪10‬‬

‫‪?:‬‬

‫از راست به چپ‬

‫‪11‬‬

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

‫از راست به چپ‬

‫‪12‬‬

‫‪,‬‬

‫از چپ به راست‬

‫‪ 7-6‬خواندن و نمایش اطالعات‬
‫‪‬‬

‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫همانطور كه قبال نیز گفته شد‪ ،‬یكی از اهداف زبان ‪ C‬قابل حمل بودن آن‬
‫است‪ .‬بهمین منظور سعی شده است كه از دستوراتی كه ممكن است‬
‫وابسته به ماشین خاصی باشد‪ ،‬اجتناب گردد‪.‬‬
‫بهمین دلیل زبان ‪ C‬برخالف سایر زبانها دارای هیچ دستوری برای‬
‫خواندن از ورودی و یا نوشتن در خروجی نیست‪.‬‬
‫اما در عوض دارای تعدادی تابع )زیربرنامه( استاندارد می باشد كه تقریبا‬
‫تمامی كامپایلرها از آنها حمایت می كنند‪.‬‬
‫این كار به كامپایلر این امكان را می دهد كه بر حسب نوع سخت افزار‬
‫موردنظر‪ ،‬توابع ورودی و خروجی را طراحی نماید‪.‬‬
‫این توابع در یك فایل سرآمد بنام ‪ stdio.h‬تعریف شده اند و بنابراین قبل‬
‫ازاینكه بتوانید از این توابع استفاده نمایید‪ ،‬باید این فایل را نیز با استفاده‬
‫از ‪ #include‬در برنامه خود بگنجانید‪.‬‬

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫برای نمایش اطالعات در خروجی از تابع ‪ printf‬استفاده می شود‪.‬‬
‫این تابع رشته موردنظر شما را به خروجی استاندارد )كه در حالت‬
‫عادی همان صفحه نمایش یا مانیتور است( می فرستد‪ .‬شكل كلی این‬
‫تابع بصورت زیر است‪:‬‬
‫; )>لیست متغیرها< ‪> ,‬رشته كنترلی<(‪printf‬‬
‫رشته كنترلی همان متنی است كه قصد چاپ آن را داریم‪ ،‬با ذكر این‬
‫نكته كه در قسمتهایی كه باید مقدار یك متغیر چاپ شود‪ ،‬از یك‬
‫مشخصه تبدیل استفاده می شود‪ .‬هر مشخصه تبدیل از یك عالمت ‪%‬‬
‫بعالوه یك كاراكتر كه نوع متغیر مورد نظر را نشان می دهد تشكیل می‬
‫گردد‪.‬‬
‫لیست متغیرها نیز همان متغیرهایی هستند كه قصد چاپ آنها را داریم‪.‬‬
‫این متغیرها باید بترتیب قرار گرفته و با كاما )‪ (,‬از یكدیگر جدا شوند‪.‬‬

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫مشخصه تبدیل‬

‫مفهوم‬

‫‪%c‬‬

‫كاراكتر‬

‫‪%d‬‬

‫عدد صحیح در مبنای ‪10‬‬

‫‪%f‬‬

‫عدد اعشاری بدون نماد علمی‬

‫‪%e‬‬

‫عدد اعشاری با نماد علمی‬

‫‪%g‬‬

‫عدد اعشاری با حالت كوتاهتر بین ‪ e‬و ‪f‬‬

‫‪%s‬‬

‫رشته‬

‫‪%ld‬‬

‫عدد صحیح بزرگ‬

‫‪%lf %le %lg‬‬

‫عدد اعشاری بزرگ‬

‫‪%o‬‬

‫عدد صحیح در مبنای ‪8‬‬

‫‪%x‬‬

‫عدد صحیحی در مبنای ‪16‬‬

‫‪%u‬‬

‫عدد صحیح بدون عالمت‬

‫ تابع نمایش در خروجی‬7-6-1
#include
void main() {
int age = 20;
floate average = 18.23;
printf("You are %d years old and your average is %f \n",age,average);
}
You are 20 years old and your average is 18.230000

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫‪‬‬
‫‪‬‬

‫برای کنترل نحوه چاپ اعداد می توانید از مشخصه طول میدان استفاده‬
‫کنید‪.‬‬
‫مشخصه طول میدان برای اعداد به شكل زیر استفاده می شود‪:‬‬
‫‪ ‬برای اعداد صحیح از ‪ %nd‬استفاده می كنیم كه ‪ n‬تعداد ارقام را نشان‬
‫می دهد )مثال ‪ .(%3d‬در اینصورت برای هر متغیر ‪ n‬رقم درنظر گرفته‬
‫می شود‪ .‬اگر اندازه عدد از ‪ n‬كوچكتر باشد‪ ،‬به سمت چپ آن فضای‬
‫خالی اضافه می شود و اگر اندازه عدد بیش از ‪ n‬رقم باشد‪ ،‬طول میدان‬
‫نادیده گرفته شده و عدد بطور كامل چاپ می شود‪.‬‬
‫‪ ‬برای اعداد اعشاری از ‪ %n.mf‬استفاده می كنیم كه ‪ n‬اندازه كل عدد‬
‫)شامل عالمت ممیز( و ‪ m‬تعداد ارقام اعشار است )مثال ‪ .(%5.2f‬در‬
‫صورتیكه تعداد ارقام اعشاری عدد موردنظر از ‪ m‬بیشتر باشد‪ ،‬عدد به ‪m‬‬
‫عدد اعشار گرد می شود و در صورتیكه از ‪ m‬كمتر باشد‪ ،‬در سمت‬
‫راست آن ‪ 0‬قرار داده می شود‪.‬‬

‫‪ 7-6-2‬تابع خواندن از ورودی‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای خواندن اطالعات از ورودی از تابع ‪ scanf‬استفاده می شود‪.‬‬
‫این تابع اطالعات را ازورودی استاندارد )معموال صفحه كلید( خوانده و در‬
‫متغیرهای تعیین شده قرار می دهد‪.‬‬
‫شكل كلی این تابع بصورت زیر است‪:‬‬
‫; )>لیست آدرسهای متغیرها< ‪> ,‬رشته كنترلی<(‪scanf‬‬
‫همانطور كه می بینید نحوه احضار تابع ‪ scanf‬نیز مشابه ‪ printf‬است‪ .‬تنها‬
‫تفاوت در آن است كه در ‪ scanf‬باید لیست آدرسهای متغیرها ارسال شود‪.‬‬
‫مبحث مربوط به آدرسها در فصول بعدی بررسی خواهد شد ولی در حال حاضر‬
‫بخاطر بسپارید كه برای بدست آوردن آدرس یك متغیر از عالمت & استفاده می‬
‫كنیم‪ .‬بعنوان مثال ‪ &age‬بمعنای آدرس متغیر ‪ age‬است‪.‬‬
‫بطور كلی در ‪ C‬قدیمی هرگاه كه یك تابع دارای پارامترهای خروجی بود )یعنی‬
‫پارامترهایی كه یك مقدار را باز می گرداندند( از آدرس متغیرها استفاده می‬
‫شد كه امروزه این مسئله وجود ندارد‪.‬‬

‫ تابع خواندن از ورودی‬7-6-2
#include
void main() {
int age;
float average ;
printf("Please enter your age and average : ");
scanf("%d %f",&age,&average);
printf("You are %d years old and your average is %5.2f \n",age,average);
}

Please enter your age and average : 19 16.72
You are 19 years old and your average is 16.72

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫زبان ‪ C++‬یک زبان شی گرا است‪ ،‬بهمین دلیل در این زبان برای ورودی‬
‫و خروجی از اشیاء بجای توابع استفاده می گردد‪.‬‬
‫از آنجا که امروزه معموال برنامه نویسان ‪ C‬از کامپایلرهای ‪ C++‬استفاده‬
‫می کنند‪ ،‬می توانند از اشیای ورودی و خروجی آن نیز استفاده کنند‪.‬‬
‫اینکار در بین بسیاری از برنامه نویسان ‪ C‬متداول است‪ ،‬بهمین دلیل ما‬
‫در اینجا نحوه کار با اشیای خواندن و نوشتن در ‪ C++‬را بطور مقدماتی‬
‫توضیح می دهیم؛ گرچه توضیح کامل این موارد نیاز به آشنایی با شی‬
‫گرایی و زبان ‪ C++‬دارد‪.‬‬
‫قبل از هرچیز الزم به ذکر است که کلیه اشیای مربوط به ورودی و‬
‫خروجی در فایل سرآمدی بنام ‪ iostream.h‬تعیریف شده اند‪ ،‬بنابراین‬
‫ابتدا باید این فایل به برنامه توسط دستور ‪ #include‬الحاق گردد‪.‬‬

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫زبان ‪ C++‬برای نمایش اطالعات از یک شیئ بنام ‪ cout‬استفاده می نماید‪.‬‬
‫برای ارسال اطالعات مورد نظر برای چاپ به ‪ cout‬باید از عملگر درج در جریان‬
‫یا >> استفاده نماییم‪ .‬بعنوان مثال ‪:‬‬
‫; ” ‪cout >> “Please enter your name:‬‬
‫و یا مثال دیگر ‪:‬‬
‫;‪int a = 10‬‬
‫;‪float b = 2.86‬‬
‫;‪cout << a‬‬
‫;‪cout << b‬‬
‫نکته جالبی که در این مثالها دیده می شود‪ ،‬آنستکه برخالف تابع ‪ printf‬هیچ‬
‫نیازی به مشخص کردن نوع متغیری که قصد چاپ آن را داریم نیست و خود‬
‫شئ ‪ cout‬نوع آن را تشخیص می دهد‪.‬‬
‫عالوه براین می توان چندین عملگر درج در جریان را با یکدیگر الحاق کرد و‬
‫چندین متغیر را با یک دستور چاپ کرد‪.‬‬

C++ ‫ ورودی و خروجی اطالعات در‬7-6-3
#include
void main() {
int age = 20;
floate average = 18.23;
cout >> “You are ” >> age >> “ years old and your average is ” >> average ;
}

You are 20 years old and your average is 18.230000

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای دریافت اطالعات از کاربر‪ ،‬از شئ دیگری بنام ‪ cin‬استفاده می شود‪.‬‬
‫برای ارسال متغیر مورد نظر به ‪ cin‬باید از عملگر استخراج از جریان یا <<‬
‫استفاده نماییم‪ .‬بعنوان مثال‪:‬‬
‫;‪int a‬‬
‫;‪cin >> a‬‬
‫بازهم همانطور که می بینید نیازی به تعیین نوع متغیر موردنظر نیست و خود‬
‫شئ ‪ cin‬نوع متغیر را بطور اتوماتیک تشخیص داده و داده ای از همان نوع را از‬
‫کاربر دریافت و در متغیر مورد نظر قرار می دهد‪.‬‬
‫عملگرهای استخراج از جریان را نیز می توان با یکدیگر الحاق کرد‪.‬‬
‫برای رفتن به خط بعد در شئ ‪ cout‬می توان از دستکاری کننده ‪ endl‬استفاده‬
‫کرد‪ .‬مثال در دستور زیر پس از چاپ پیغام‪ ،‬مکان نما به خط بعد منتقل می‬
‫شود‪:‬‬
‫;‪cout >> “List of students : “ >> endl‬‬
‫البته دستکاری کننده های متعدد دیگری نیز ازجمله موارد مربوط به تعیین طول‬
‫میدان و نحوه چاپ مقادیر وجود دارد که توضیح آنها نیاز به یک مبحث مستقل‬
‫دارد‪.‬‬

C++ ‫ ورودی و خروجی اطالعات در‬7-6-3
#include
void main() {
int age;
float average ;
cout << "Please enter your age and average : " ;
cin >> age >> average ;
cout << "You are " << age << "years old and your average is " << average;
}

Please enter your age and average : 19 16.72
You are 19 years old and your average is 16.72

‫‪ 7-7‬توابع کتابخانه ای‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫همانطور که قبال نیز گفته شد‪ ،‬زبان ‪ C‬از زیر برنامه ها نیز حمایت می کند‪ .‬هر زیر برنامه‬
‫در ‪ C‬یک تابع نامیده می شود‪ .‬تا کنون با توابعی همچون ‪ main‬و یا ‪ printf‬و ‪ scanf‬آشنا‬
‫شده ایم‪.‬‬
‫معموال عرضه کنندگان کامپایلرها و یا سایر فروشندگان نرم افزار‪ ،‬برخی از توابع عمومی‬
‫را که ممکن است مورد نیاز جمع کثیری از برنامه نویسان مختلف باشد را در قالب‬
‫کتابخانه ای از توابع در اختیار برنامه نویسان می گذارند‪ .‬بعضی از این توابع کتابخانه ای‬
‫مانند ‪ printf‬و ‪ scanf‬بصورت استاندارد درآمده و توسط عرضه کنندگان مختلف ارائه می‬
‫شوند‪.‬‬
‫در کامپایلر عرضه شده توسط شرکت بورلند )‪ (Borland C++ 3.1‬نیز کتابخانه های‬
‫متعددی از توابع برای شما عرضه شده اند که بتدریج با آنها و کاربردشان آشنا خواهید‬
‫شد‪.‬‬
‫نکته مهم آنستکه برای استفاده از این توابع ابتدا باید فایل سرآمد مربوط به آنها را نیز در‬
‫ابتدای برنامه خود اضافه نمایید ) با استفاده از ‪ .(#include‬هر فایل سرآمد شامل تعاریف‬
‫اولیه گروهی از توابع مرتبط با هم و داده های مربوط به آنها بوده و در استاندارد قدیمی‬
‫تر دارای پسوند ‪ .h‬می باشد)در استاندارد جدید پسوند این فایلها حذف شده است(‪.‬‬
‫برخی از این فایلهای سرآمد عبارتند از‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪ : stdio.h‬توابع ورودی و خروجی استاندارد‬
‫‪ : math.h‬توابع ریاضی‬
‫‪ : graphics.h‬توابع مربوط به عملیات گرافیکی‬
‫‪ : string.h‬توابع مربوط به کار با رشته ها‬


Slide 28

‫مبانی کامپیوتر و برنامه سازی‬
‫فصل هفتم ‪ :‬مفاهیم اولیه زبان ‪C‬‬
‫مدرس ‪ :‬نگین معروفی‬

‫‪ 7-1‬شناسه ها در ‪C‬‬
‫‪‬‬
‫‪‬‬

‫شناسه )‪ (identifier‬نامی است که به یک قسمت از برنامه مانند متغیر‪ ،‬تابع‪ ،‬ثابت و یا‬
‫‪ ...‬داده می شود‪.‬‬
‫در زبان ‪ C‬برای انتخاب شناسه ها فقط می توان از عالئم زیر استفاده کرد‪:‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫حروف انگلیسی کوچک و بزرگ )‪(A…Z a…z‬‬
‫ارقام )‪(0…9‬‬
‫عالمت خط پایین یا _‬

‫البته یک شناسه نمی تواند با یک رقم شروع شود‪.‬‬
‫چند شناسه مجاز‪ name2 ، average ، sum :‬و ‪student_average‬‬
‫چند شناسه غیرمجاز ‪ 2name‬و یا ‪student average‬‬
‫در برنامه نویسی امروزی پیشنهاد می شود بجای شناسه هایی همانند‬
‫‪ student_average‬از ‪ studentAverage‬استفاده گردد‪.‬‬
‫نکته مهم دیگری که باید به آن اشاره کرد آنستکه زبان ‪ C‬برخالف بسیاری از زبانهای دیگر‬
‫به کوچک و بزرگی حروف حساس است )‪ .(case sensitive‬در نتیجه شناسه های زیر با‬
‫یکدیگر متفاوتند ‪:‬‬
‫‪Sum ≠ sum ≠ SUM‬‬
‫آخرین نکته اینستکه در هنگام انتخاب شناسه نمی توانید از کلمات کلیدی که برای‬
‫منظورهای خاص در زبان ‪ C‬رزرو شده اند استفاده کنید‪.‬‬

C ‫ شناسه ها در‬7-1
: C ‫کلمات کلیدی در زبان‬
auto

break

case

char

const

continue

default

do

double

else

enum

extern

float

for

goto

if

int

long

register

return

short

signed

sizeof

static

struct

switch

typedef

union

unsigned

void

volatile

while

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫محدوده‬

‫اندازه )بیت(‬

‫توضیح‬

‫نوع داده‬

‫‪-128 to +127‬‬

‫‪8‬‬

‫کاراکتر‬

‫‪char‬‬

‫‪-32768 to +32767‬‬

‫‪16‬‬

‫عدد صحیح‬

‫‪int‬‬

‫‪3.4e-38 to 3.4e+38‬‬

‫‪32‬‬

‫عدد اعشاری‬

‫‪float‬‬

‫‪1.7e-308 to 1.7e+308‬‬

‫‪64‬‬

‫عدد اعشاری با‬
‫دقت مضاعف‬

‫‪double‬‬

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫‪‬‬

‫البته چند نکته مهم درمورد این جدول قابل ذکر است ‪:‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫اندازه ‪ int‬در محیطهای ‪ 16‬بیتی مانند ‪ DOS‬برابر ‪ 16‬بیت است‪ .‬اما در‬
‫محیطهای ‪ 32‬بیتی همانند ‪ Windows‬اندازه آن ‪ 32‬بیت می باشد که در‬
‫اینصورت محدوده ای برابر ‪ -2,147,483,648‬تا ‪ +2,147,483,647‬را‬
‫پوشش می دهد‪.‬‬
‫در بعضی از کامپایلرهای ‪ ،C‬نوع داده ‪ bool‬نیز وجود دارد که می تواند‬
‫یکی از مقادیر ‪)true‬درست( یا ‪) false‬غلط( را نشان دهد ‪ .‬اما در نسخه‬
‫های اولیه ‪ C‬از همان نوع داده صحیح یا ‪ int‬برای اینکار استفاده می‬
‫شد‪ .‬بدین صورت که ‪ 0‬نشاندهنده ‪ false‬و هر عدد غیر صفر )معموال ‪(1‬‬
‫نشاندهنده ‪ true‬است‪.‬‬
‫از آنجا که برای ذخیره سازی کاراکترها کد اسکی آنها ذخیره می گردد‪،‬‬
‫از یک متغیر کاراکتری یا ‪ char‬می توان بعنوان یک عدد صحیح کوچک نیز‬
‫استفاده کرد و اعمال ریاضی برروی آنها نیز مجاز است‪.‬‬

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫عالوه براین چندین اصالح کننده نیز وجود دارد که به ما اجازه می دهد نوع داده مورد‬
‫نظر را با دقت بیشتری برای نیازهای مختلف استفاده نماییم‪.‬‬
‫این اصالح کننده ها عبارتند از ‪short, long, signed, unsigned :‬‬
‫تمام این اصالح کننده ها می توانند به نوع داده ‪ int‬اعمال شوند و اثر آنها بستگی‬
‫به محیط دارد‪.‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫در یک محیط ‪16‬بیتی‪short int ،‬بازهم برابر ‪16‬بیت است ولی ‪ long int‬برابر‪32‬بیت می‬
‫باشد‪.‬‬
‫‪ unsigned int‬باعث می شود که یک عدد ‪ 16‬بیتی بدون عالمت داشته باشیم که بازه‬
‫بین ‪ 0‬تا ‪ 65535‬را پوشش می دهد‪ signed int .‬نیز همانند ‪ int‬معمولی بوده و تفاوتی‬
‫ندارد‪.‬‬
‫ترکیب این اصالح کننده ها نیز ممکن است‪ .‬مثال ‪ unsigned long int‬یک عدد ‪ 32‬بیتی‬
‫بدون عالمت است که بازه ‪ 0‬تا ‪ 4,294,967,295‬را پوشش می دهد‪.‬‬

‫برروی نوع داده ‪ char‬فقط اصالح کننده های ‪ signed‬و ‪ unsigned‬را می توان اعمال‬
‫کرد‪ .‬معموال از اصالح کننده ‪ unsigned‬وقتی استفاده می شود که قصد داشته‬
‫باشیم از ‪ char‬بعنوان یک عدد صحیح مثبت بین ‪ 0‬تا ‪ 255‬استفاده کنیم‪.‬‬
‫برروی نوع داده ‪ double‬تنها اصالح کننده ‪ long‬قابل اعمال است و دراینصورت عدد‬
‫اعشاری با ‪ 80‬بیت را خواهیم داشت که قادر است هر عددی در بازه ‪ 3.4e-4932‬تا‬
‫‪ 1.1e+4932‬را در خود نگاه دارد‪.‬‬

‫‪ 7-3‬تعریف متغیرها‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای تعریف متغیرها به شکل زیر عمل می کنیم‪:‬‬

‫;>‪ ‫که ‪ type‬یکی از نوع داده های گفته شده و ‪ variable-list‬لیستی از متغیرها است‬
‫که با کاما از یکدیگر جدا شده اند‪ .‬بعنوان مثال ‪:‬‬
‫;‪int sum‬‬
‫;‪float average‬‬
‫; ‪long int a, b, c‬‬
‫; ‪unsigned long int i, j, k‬‬
‫عالوه براین می توان در هنگام تعریف متغیر به آن مقدار اولیه نیز داد‪ .‬مثال ‪:‬‬
‫; ‪int d = 0‬‬
‫نكته مهم آنكه زبان ‪ C‬به متغیرها مقدار اولیه نمي دهد )حتي ‪ (0‬و برنامه نويس‬
‫خود بايد اينكار را صريحا انجام دهد‪ ،‬درغیر اينصورت مقدار اولیه متغیر‪ ،‬نامعین خواهد‬
‫بود‪.‬‬
‫تعریف متغیرها طبق اصول زبان ‪ C‬میتواند درهرجایی از برنامه صورت پذیرد‪ ،‬و‬
‫متغیرهای تعریف شده از همان خط به بعد قابل استفاده خواهد بود‪ .‬اما معموال‬
‫توصیه می گردد كه تعریف متغیرها در همان خط ابتدایی تابع و بالفاصله پس از {‬
‫صورت پذیرد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫‪‬‬
‫‪‬‬

‫ثابتها مقادیر ثابتی هستند كه مقدار آنها در حین اجرای برنامه تغییر نمی یابد‪ .‬ثابتها می توانند از‬
‫هریك از نوع داده های اصلی باشند‪.‬‬
‫ثوابت عددی صحیح ‪:‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫برای نمایش این دسته از ثوابت‪ ،‬از دنباله ای از ارقام بعالوه عالمت ‪ +‬یا ‪ -‬استفاده می كنیم‪ .‬بعنوان مثال‬
‫‪ -45‬و یا ‪ 3489‬ثوابت صحیح هستند‪.‬‬
‫در حالت عادی ‪ C‬هر عدد را در كوچكترین نوع داده ای كه می تواند قرار می دهد‪ .‬مثال عدد ‪ 85‬در یك‬
‫‪ int‬قرار می گیرد‪ ،‬اما عدد ‪ 145398‬در یك ‪ long int‬قرار خواهد گرفت‪.‬‬
‫اگر قصد دارید یك عدد كوچك بعنوان ‪ long‬محسوب گردد‪ ،‬می توانید از پسوند ‪ L‬در انتهای آن استفاده‬
‫می كنیم‪ .‬مثال ‪245L‬یك عدد ‪ long‬محسوب می شود‪.‬‬
‫;‪long int a = 20L‬‬
‫پسوند ‪ U‬در انتهای عدد نیز نشانه بدون عالمت بودن آن است‪.‬‬
‫نكته دیگر آنكه ‪ C‬به شما اجازه می دهد درصورت لزوم ثوابت صحیح خود را در مبنای ‪ 8‬یا ‪ 16‬نیز كه‬
‫از مبناهای متداول در برنامه نویسی هستند‪ ،‬بنویسید‪.‬‬
‫‪‬‬
‫‪‬‬

‫برای نوشتن عدد در مبنای ‪ 8‬باید آن را با ‪ 0‬آغاز كنید‪ ،‬مثال ‪ 0342‬یك عدد در منای ‪ 8‬محسوب می‬
‫گردد‪.‬‬
‫برای نوشتن یك عدد در مبنای ‪ 16‬باید آن را با ‪ 0x‬آغاز نمایید‪ ،‬مانند ‪.0x27A4‬‬

‫‪ 7-4‬ثوابت‬
‫ثوابت عددی اعشاری‬

‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫برای نمایش اعداد اعشاری‪ ،‬باید از نقطه اعشار استفاده كنیم‪ ،‬مانند ‪237.45‬‬
‫اما نكته جالب آنستكه می توانید از نماد علمی نیز برای نمایش اعداد‬
‫اعشاری استفاده كنید‪ .‬برای اینكار كافی است از حرف ‪ e‬برای نمایش قسمت‬
‫توان استفاده نمایید‪ .‬بعنوان مثال ‪:‬‬
‫‪-23.47 × 10 5 = -23.47e5‬‬
‫‪42.389 × 10 -3 = 42.389e-3‬‬
‫دقت كنید كه قسمت توان‪ ،‬حتما یك عدد صحیح است‪.‬‬
‫نكته جالب اینجاست كه برخالف مورد قبل‪ ،‬كامپایلر بطور پیش فرض داده های‬
‫اعشاری را از نوع ‪ double‬فرض می كند‪.‬چنانچه دوست دارید ثابت شما ازنوع‬
‫‪ float‬درنظر گرفته شود‪ ،‬در انتهای آن ‪ F‬قرار دهید‪ .‬ضمنا پسوند ‪ L‬نیز داده‬
‫اعشاری را از نوع ‪ long double‬درنظر می گیرد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫ثوابت كاراكتری ‪:‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫برای نشان دادن ثوابت كاراكتری‪ ،‬آنها را در داخل ' قرار می دهیم‪ .‬بعنوان مثال‬
‫'‪'A‬یك ثابت كاراكتری است‪.‬‬
‫; '‪char ch = 'S‬‬
‫دقت كنید كه همانطور كه قبال گفته شد‪ ،‬كد اسكی كاراكترها در متغیر ذخیره‬
‫می گردد‪ ،‬بنابراین می توان از آن بعنوان یك عدد صحیح نیز استفاده كرد‪ .‬نكته‬
‫مهم دیگر آنستكه به تفاوت عدد ‪ 5‬و كاراكتر '‪ '5‬دقت داشته باشید‪ .‬در حقیقت‬
‫'‪ '5‬برابر است با عدد ‪ 53‬كه همان كد اسكی آن است‪.‬‬
‫روش فوق‪ ،‬برای نمایش کاراکترهای قابل چاپ مناسب است‪ ،‬اما بعضی‬
‫كاراكترها مانند ‪ enter‬قابل نمایش نبوده و برای آنها شکل خاصی وجود ندارد‪.‬‬
‫در چنین مواردی‪ ،‬زبان ‪ C‬از ترکیب عالمت \ به همراه یک کاراکتر دیگر‪ ،‬برای‬
‫نمایش این قبیل کاراکترها استفاده می نماید‪ .‬بعنوان مثال‪ ،‬کاراکتر '‪ '\n‬نشان‬
‫دهنده خط جدید یا همان ‪ enter‬می باشد‪.‬‬
‫جدول صفحه بعد این قبیل کاراکترها و معادل آنها را نشان می دهد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫نحوه نمایش در ‪C‬‬

‫کد اسکی‬

‫صدای بوق کامپیوتر‬

‫‪\a‬‬

‫‪7‬‬

‫حرکت به عقب ‪backspace‬‬

‫‪\b‬‬

‫‪8‬‬

‫شروع صفحه ‪form feed‬‬

‫‪\f‬‬

‫‪12‬‬

‫سطر جدید ‪line feed‬‬

‫‪\n‬‬

‫‪10‬‬

‫برگشت به ابتداي سطر ‪carriage return‬‬

‫‪\r‬‬

‫‪13‬‬

‫فاصله افقی ‪horizontal tab‬‬

‫‪\t‬‬

‫‪9‬‬

‫فاصله عمودی ‪vertical tab‬‬

‫‪\v‬‬

‫‪11‬‬

‫عالمت سوال‬

‫?\‬

‫‪63‬‬

‫عالمت '‬

‫'\‬

‫‪39‬‬

‫عالمت "‬

‫"\‬

‫‪34‬‬

‫عالمت \‬

‫\\‬

‫‪92‬‬

‫عالمت تهی‬

‫‪\0‬‬

‫‪0‬‬

‫نام کاراکتر‬

‫کد اسکی یک کاراکتر با ‪ 3‬رقم در مبنای ‪8‬‬

‫‪\000‬‬

‫کد اسکی یک کاراکتر با ‪ 2‬رقم در مبنای ‪16‬‬

‫‪\x00‬‬

‫‪ 7-4‬ثوابت‬
‫‪‬‬

‫ثوابت رشته ای ‪ C :‬عالوه بر ثوابت فوق‪ ،‬از یك ثابت دیگر بنام رشته نیز‬
‫حمایت می كند‪ .‬رشته‪ ،‬دنباله ای از كاراكترها است كه در داخل " قرار‬
‫می گیرند‪ .‬بعنوان مثال "‪ "this is a test‬یك رشته است‪ .‬دقت كنید كه '‪'a‬‬
‫یك كاراكتر است‪ ،‬اما "‪ "a‬یك رشته است كه فقط شامل یك كاراكتر می‬
‫باشد‪.‬‬

‫‪ 7-5‬عملگرها‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫عملگر‪ ،‬نمادی است كه به كامپایلر می گوید تا عملیات محاسباتی یا‬
‫منطقی خاصی را برروی یك یا چند عملوند‪ ،‬انجام دهد‪.‬‬
‫به عملگرهایی كه فقط یك عملوند دارند‪ ،‬عملگر یكانی می گوییم و‬
‫همواره عملگر در سمت چپ عملوند قرار می گیرد)مانند عدد ‪.(-125‬‬
‫اما عملگرهایی كه برروی دو عملوند اثر می كنند را عملگر دودویی‬
‫نامیده و عملگر را بین دو عملوند قرار می دهیم )مانند ‪.(23+86‬‬
‫هر ترکیب درستی از عملگرها و عملوندها را یک عبارت می نامیم‪.‬‬
‫‪ C‬از نقطه نظر عملگرها یك زبان بسیار قوی است‪ .‬این عملگرها به چند‬
‫دسته اصلی تقسیم می گردند كه آنها را به ترتیب بررسی می كنیم‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫این عملگرها‪ ،‬همان اعمال متداول ریاضی هستند كه در زبان ‪ C‬مورد استفاده‬
‫قرار می گیرند‪ .‬این اعمال عبارتند از ‪:‬‬

‫عمل‬

‫نوع‬

‫عملگر‬

‫منفی كردن عملوند سمت راست‬

‫یكانی‬

‫‪-‬‬

‫جمع دو عملوند‬

‫دودویی‬

‫‪+‬‬

‫تفریق دو عملوند‬

‫دودویی‬

‫‪-‬‬

‫ضرب دو عملوند‬

‫دودویی‬

‫*‬

‫تقسیم دو عملوند‬

‫دودویی‬

‫‪/‬‬

‫محاسبه باقیمانده تقسیم دو عملوند‬

‫دودویی‬

‫‪%‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬
‫‪‬‬

‫این عملگرهای برروی همه انواع داده های ‪ C‬عمل می كنند‪ ،‬بجز عملگر ‪ %‬كه فقط‬
‫برروی نوع داده های صحیح عمل می كند‪.‬‬
‫اما نكته مهمی كه باید به آن اشاره كرد‪ ،‬نحوه كار عملگر تقسیم برروی نوع داده های‬
‫مختلف است‪.‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫درصورتیكه هردو عملوند صحیح باشند‪ ،‬تقسیم بصورت صحیح بر صحیح انجام خواهد شد‪.‬‬
‫اگر یكی یا هر دو عملوند اعشاری باشند‪ ،‬تقسیم بصورت اعشاری انجام خواهد پذیرفت‪.‬‬
‫فرض كنید تعاریف زیر را داریم ‪:‬‬
‫; ‪int a,b‬‬
‫; ‪float c,d‬‬
‫; ‪a = 10 ; b = 4‬‬
‫;‪c = 8.2; d = 4.0‬‬
‫اكنون به نتایج عملیات زیر دقت كنید ‪:‬‬
‫‪a / b => 2‬‬
‫‪c / d => 2.05‬‬
‫‪a / d => 2.5‬‬
‫‪a / 4 => 2‬‬
‫چنانچه به آخرین مورد توجه كنید‪ ،‬متوجه می شوید كه از آنجا كه ‪a‬یك متغیر صحیح است و ‪4‬‬
‫نیز یك ثابت صحیح در نظر گرفته شده‪ ،‬درنتیجه تقسیم بصورت صحیح بر صحیح انجام گرفته‬
‫است‪ .‬چنانچه بخواهیم تقسیم بصورت اعشاری صورت پذیرد‪ ،‬به دو شكل می توانیم عمل‬
‫كنیم‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫برای اینکه عبارت تقسیم صفحه قبل بصورت اعشاری انجام شود‪ ،‬به دو روش‬
‫می توان عمل کرد‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫این عبارت را بصورت ‪ a / 4.0‬بنویسیم‪.‬‬
‫از عملگر قالب ریزی استفاده كنیم‪.‬‬

‫عملگر قالب ریزی می تواند یك نوع را به نوع دیگری تبدیل نماید‪ .‬شكل كلی آن‬
‫به شكل زیر است ‪:‬‬
‫>‪() ‫كه ‪ type‬نوع مورد نظر است كه قصد تبدیل عبارت ‪ expression‬به آن نوع را‬
‫داریم‪ .‬بعنوان مثال در مورد قبلی می توان به شكل زیر عمل كرد ‪:‬‬
‫‪(float) a / 4‬‬
‫در این حالت از كامپایلر خواسته ایم كه ابتدا عدد ‪ a‬را به اعشاری تبدیل كند‬
‫)البته بصورت موقت( و سپس آن را بر ‪ 4‬تقسیم نماید‪ ،‬كه مسلما حاصل‬
‫اعشاری خواهد بود‪.‬‬
‫بطوركلی هرگاه ثابتها و متغیرهایی از انواع مختلف در یك عبارت محاسباتی‬
‫داشته باشیم‪ ،‬كامپایلر ‪ C‬همه آنها را به یك نوع یكسان كه همان بزرگترین‬
‫عملوند موجود است تبدیل خواهد كرد‪ .‬بعنوان مثال به مورد صفحه بعد دقت‬
‫كنید ‪:‬‬

‫ عملگرهای محاسباتی‬7-5-1
char ch;
int i;

float f;
double d;
result = (ch / i)
int

+

(f *d)

(f+i)
float

double

double

int

-

double

double

float

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫اولویت عملگرها ‪ :‬در عبارتی که شامل چندین عملگر است‪ ،‬کدامیک در‬
‫ابتدا اعمال خواهد گردید‪.‬‬
‫اولویت عملگرهای محاسباتی از باال به پایین بشرح زیر است‪:‬‬
‫‪ ‬عملگر یکانی –‬
‫‪ ‬عملگرهای * و ‪ /‬و ‪%‬‬
‫‪ ‬عملگرهای ‪ +‬و –‬
‫چنانچه اولویت دو عملگر یکسان باشد‪ ،‬این عملگرها از چپ به راست‬
‫محاسبه خواهند شد‪.‬‬
‫چنانچه بخواهیم یک عمل با اولویت پایین زودتر انجام شود‪ ،‬باید از پرانتز‬
‫استفاده کنیم‪ .‬بنابراین اولویت عملگر پرانتز از همه موارد فوق‬
‫بیشتراست‪ .‬در مورد پرانتزهای متداخل‪ ،‬ابتدا پرانتز داخلی محاسبه‬
‫می شود؛ اما در مورد پرانتزهای هم سطح‪ ،‬ابتدا پرانتز سمت چپتر‬
‫محاسبه می گردد‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫چند مثال در مورد اولویت عملگرها‬

‫ترتیب اجرای عملگرها‬

‫عبارت زبان ‪C‬‬

‫ابتدا عمل * و سپس عمل ‪+‬‬

‫‪b+c*d‬‬

‫ابتدا عمل ‪ +‬و سپس عمل *‬

‫‪(b + c) * d‬‬

‫ابتدا عمل ‪ /‬سپس عمل * و در انتها عمل ‪+‬‬

‫‪b+c/d*e‬‬

‫ابتدا عمل * سپس عمل ‪ /‬و در انتها عمل ‪+‬‬

‫)‪b + c / (d * e‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫یک مثال کامل در مورد اولویت عملگرها‬

‫‪result = a + b * (f – (g + b) / d) – c * (a – d) / e‬‬
‫‪6‬‬

‫‪1‬‬
‫‪7‬‬

‫‪2‬‬

‫‪8‬‬

‫‪3‬‬
‫‪4‬‬
‫‪5‬‬
‫‪9‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫در زبان ‪ C‬برای انتساب چندین عملگر وجود دارد‪ .‬ساده ترین عملگر انتساب‪ ،‬همان عملگر =‬
‫است که در بسیاری از زبانها استفاده می شود‪ .‬بعنوان مثال ‪:‬‬
‫;‪a = 5‬‬
‫;‪b = c + 2 * d‬‬
‫این عملگر باعث می شود که عبارت سمت راست در عبارت سمت چپ قرار گیرد‪.‬‬
‫توجه کنید که مقدار سمت چپ باید عبارتی باشد که بتوان به آن یک مقدار را نسبت داد‬
‫)مانند یک متغیر( که به آن ‪ Lvalue‬گفته می شود‪ ،‬بنابراین یک ثابت نمی تواند در سمت چپ‬
‫قرار گیرد‪.‬‬
‫نکته دیگر اینکه اولویت عملگر = از عملگرهای ریاضی کمتر است و درنتیجه ابتدا آن عملیات‬
‫انجام شده و در پایان حاصل در عبارت سمت چپ ریخته می شود‪.‬‬
‫الزم به ذکر است که در هنگام انتساب‪ ،‬درصورت لزوم نوع عبارت سمت راست به نوع عبارت‬
‫سمت چپ تبدیل می شود‪ .‬مثال‪:‬‬
‫;‪int a‬‬
‫;‪a = 2.5 * 5.0‬‬
‫که دراینصورت عدد ‪ 12‬در ‪ a‬ذخیره خواهد شد‪.‬‬
‫شرکت پذیری این عملگر از راست به چپ می باشد‪ ،‬بدین معنا که چنانچه چندین عملگر‬
‫نسبت دهی داشته باشیم‪ ،‬این عملگرها از راست به چپ محاسبه می شوند‪ .‬مثال پس از‬
‫اجرای دستور زیر‪ ،‬مقدار هر ‪ 3‬متغیر برابر ‪ 10‬خواهد شد‪.‬‬
‫;‪a = b = c = 10‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬

‫نکته جالب درمورد زبان ‪ C‬آنستکه دارای یک سری عملگرهای انتساب‬
‫خالصه شده است که باعث می شوند در بعضی موارد بتوانیم عبارات‬
‫کوتاهتری را بنویسیم‪ .‬این عملگرها عبارتند از ‪:‬‬
‫عملگرد‬

‫مثال‬

‫عبارت انتساب معادل‬

‫‪++‬‬

‫;‪a ++‬‬

‫;‪a = a + 1‬‬

‫‪--‬‬

‫;‪a --‬‬

‫;‪a = a – 1‬‬

‫=‪+‬‬

‫;‪a += 5‬‬

‫;‪a = a + 5‬‬

‫=‪-‬‬

‫;‪a -= 8‬‬

‫;‪a= a – 8‬‬

‫=*‬

‫;‪a *= 10‬‬

‫;‪a= a * 10‬‬

‫=‪/‬‬

‫;‪a /= 2‬‬

‫;‪a = a / 2‬‬

‫=‪%‬‬

‫;‪a %= 10‬‬

‫;‪a = a % 10‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬
‫‪‬‬

‫عملگر اول و دوم‪ ،‬عملگرهای یکانی هستند که بترتیب عملگر افزایش و عملگر کاهش‬
‫نامیده می شوند‪.‬‬
‫نکته جالب آنستکه این دو عملگر به دوصورت مورد استفاده قرار می گیرند‪.‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫در حالتی که از دستور ;‪ a ++‬استفاده شود به آن پس افزایش می گویند و بدین معناست که‬
‫ابتدا از مقدار فعلی ‪ a‬در عبارت موردنظر استفاده کن و سپس آن را افزایش بده‪.‬‬
‫اما دستور ;‪ ++ a‬که به آن پیش افزایش گفته می شود‪ ،‬ابتدا ‪ a‬را افزایش داده و سپس از آن‬
‫در عبارت استفاده می کند‪.‬‬
‫به برنامه زیر دقت کنید‪:‬‬

‫>‪#include ‫{ )(‪void main‬‬
‫; ‪int a ,b‬‬
‫;‪a=5‬‬
‫;‪b = a ++‬‬
‫;)‪printf(“a=%d and b=%d \n”,a,b‬‬
‫;‪a=5‬‬
‫;‪b = ++ a‬‬
‫;)‪printf(“a=%d and b=%d \n”,a,b‬‬
‫}‬
‫‪a=6 b=5‬‬
‫‪a=6 b=6‬‬

‫‪ 7-5-3‬عملگرهای مقایسه ای‬
‫‪‬‬

‫‪‬‬

‫این عملگرها دو عبارت را بایکدیگر مقایسه کرده و نتیجه را باز می گردانند‪.‬‬
‫نتیجه می تواند درست )‪ (true‬یا غلط )‪ (false‬باشد‪.‬‬
‫نتیجه این عملگرها یک عدد صحیح است که درصورت درست بودن ‪ 1‬و‬
‫درصورت غلط بودن ‪ 0‬باز می گردانند‪ .‬این عملگرها عبارتند از‪:‬‬
‫عملگر‬

‫مفهوم عملگر‬

‫مثال‬

‫<‬

‫بزرگتر )<(‬

‫‪a>b‬‬

‫>‬

‫کوچکتر )>(‬

‫‪a
‫=<‬

‫بزرگتر یا مساوی )≤(‬

‫‪a >= b‬‬

‫=>‬

‫کوچکتر یا مساوی )≥(‬

‫‪a <= b‬‬

‫==‬

‫مساوی )=(‬

‫‪a == b‬‬

‫=!‬

‫نامساوی )≠(‬

‫‪a != b‬‬

‫‪ 7-5-3‬عملگرهای مقایسه ای‬
‫‪‬‬

‫‪‬‬

‫نکته مهمی که باید به آن دقت کرد عملگر مساوی )==( است‪ ،‬چرا که یک‬
‫اشتباه بسیار متداول برنامه نویسان ‪ C‬استفاده اشتباه از عملگر انتساب‬
‫)=( بجای عملگر تساوی )==( است که باعث ایجاد خطا در برنامه می‬
‫شود‪.‬‬
‫اولویت این عملگرها از باال به پایین بشرح زیر است‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫عملگرهای <‪ <= ، > ،‬و =>‬
‫عملگرهای == و =!‬

‫الزم بذکر است که در هنگام مساوی بودن اولویت چند عملگر‪ ،‬این عملگرها‬
‫از چپ به راست محاسبه می گردند‪.‬‬

‫‪ 7-5-4‬عملگرهای منطقی‬
‫‪‬‬

‫این عملگرها به شما اجازه می دهند که شرطهای ساده ای را که با‬
‫استفاده از عملگرهای مقایسه ای ایجاد شده اند را با یکدیگر ترکیب نموده‬
‫و شرطهای پیچیده تری را بسازید‪ .‬این عملگرها عبارتند از ‪:‬‬
‫مثال‬

‫عملگر‬

‫مفهوم عملگر‬

‫نحوه کار‬

‫&&‬

‫‪ AND‬منطقی‬

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

‫‪a>0 && sw==1‬‬

‫||‬

‫‪ OR‬منطقی‬

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

‫‪a<=100 || b!=0‬‬

‫!‬

‫‪ NOT‬منطقی‬

‫اگر عملوند درست باشد‪ ،‬نادرست و‬
‫اگر نادرست باشد‪ ،‬درست برمی‬
‫گرداند‪.‬‬

‫)‪! (a==1 || b<10‬‬

‫‪ 7-5-5‬عملگر شرطی‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫گاهی الزم است که ابتدا یک شرط بررسی شده و سپس برمبنای نتیجه )درست یا نادرست بودن آن( یکی‬
‫از دو عبارت ممکن بازگردانده شود‪ .‬برای اینکار می توان از یک عملگر ‪3‬تایی )با ‪ 3‬عملوند( بنام عملگر‬
‫شرطی استفاده نمود‪.‬‬
‫شکل کلی این عملگر بصورت زیر است‪:‬‬
‫>عبارت‪> :<2‬عبارت‪> ?<1‬شرط<‬
‫نحوه کار بدینصورت است که درصورت درست بودن شرط‪ ،‬عبارت‪ 1‬و در غیراینصورت عبارت ‪ 2‬بازگردانده می‬
‫شود‪.‬‬
‫به عنوان مثال به دستور زیر توجه کنید‪:‬‬
‫که این عبارت معادل دستور زیر است‪:‬‬

‫‪‬‬

‫;‪a = (k<10) ? 100 : 50‬‬
‫;‪if (k<10) a=100‬‬
‫;‪else a=50‬‬

‫البته این عبارت به شکلهای پیچیده نیز می تواند مورد استفاده قرار گیرد‪ .‬مثال ‪:‬‬
‫;‪c += (a>0 && a<10) ? ++a : a/b‬‬
‫که معادل است با ‪:‬‬
‫{ )‪if (a>0 && a<10‬‬
‫;‪a= a + 1‬‬
‫;‪c = c + a‬‬
‫}‬
‫;‪else c = c + a/b‬‬

‫‪ 7-5-6‬اولویت عملگرها‬
‫عملگر‬

‫اولویت‬

‫شرکت پذیری‬

‫‪1‬‬

‫)(‬

‫از چپ به راست‬

‫‪2‬‬

‫‪- + ! -- ++‬‬

‫از راست به چپ‬

‫‪3‬‬

‫‪* / %‬‬

‫از چپ به راست‬

‫‪4‬‬

‫‪+ -‬‬

‫از چپ به راست‬

‫‪5‬‬

‫>> <<‬

‫از چپ به راست‬

‫‪6‬‬

‫>= > <= <‬

‫از چپ به راست‬

‫‪7‬‬

‫=! ==‬

‫از چپ به راست‬

‫‪8‬‬

‫&&‬

‫از چپ به راست‬

‫‪9‬‬

‫||‬

‫از چپ به راست‬

‫‪10‬‬

‫‪?:‬‬

‫از راست به چپ‬

‫‪11‬‬

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

‫از راست به چپ‬

‫‪12‬‬

‫‪,‬‬

‫از چپ به راست‬

‫‪ 7-6‬خواندن و نمایش اطالعات‬
‫‪‬‬

‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫همانطور كه قبال نیز گفته شد‪ ،‬یكی از اهداف زبان ‪ C‬قابل حمل بودن آن‬
‫است‪ .‬بهمین منظور سعی شده است كه از دستوراتی كه ممكن است‬
‫وابسته به ماشین خاصی باشد‪ ،‬اجتناب گردد‪.‬‬
‫بهمین دلیل زبان ‪ C‬برخالف سایر زبانها دارای هیچ دستوری برای‬
‫خواندن از ورودی و یا نوشتن در خروجی نیست‪.‬‬
‫اما در عوض دارای تعدادی تابع )زیربرنامه( استاندارد می باشد كه تقریبا‬
‫تمامی كامپایلرها از آنها حمایت می كنند‪.‬‬
‫این كار به كامپایلر این امكان را می دهد كه بر حسب نوع سخت افزار‬
‫موردنظر‪ ،‬توابع ورودی و خروجی را طراحی نماید‪.‬‬
‫این توابع در یك فایل سرآمد بنام ‪ stdio.h‬تعریف شده اند و بنابراین قبل‬
‫ازاینكه بتوانید از این توابع استفاده نمایید‪ ،‬باید این فایل را نیز با استفاده‬
‫از ‪ #include‬در برنامه خود بگنجانید‪.‬‬

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫برای نمایش اطالعات در خروجی از تابع ‪ printf‬استفاده می شود‪.‬‬
‫این تابع رشته موردنظر شما را به خروجی استاندارد )كه در حالت‬
‫عادی همان صفحه نمایش یا مانیتور است( می فرستد‪ .‬شكل كلی این‬
‫تابع بصورت زیر است‪:‬‬
‫; )>لیست متغیرها< ‪> ,‬رشته كنترلی<(‪printf‬‬
‫رشته كنترلی همان متنی است كه قصد چاپ آن را داریم‪ ،‬با ذكر این‬
‫نكته كه در قسمتهایی كه باید مقدار یك متغیر چاپ شود‪ ،‬از یك‬
‫مشخصه تبدیل استفاده می شود‪ .‬هر مشخصه تبدیل از یك عالمت ‪%‬‬
‫بعالوه یك كاراكتر كه نوع متغیر مورد نظر را نشان می دهد تشكیل می‬
‫گردد‪.‬‬
‫لیست متغیرها نیز همان متغیرهایی هستند كه قصد چاپ آنها را داریم‪.‬‬
‫این متغیرها باید بترتیب قرار گرفته و با كاما )‪ (,‬از یكدیگر جدا شوند‪.‬‬

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫مشخصه تبدیل‬

‫مفهوم‬

‫‪%c‬‬

‫كاراكتر‬

‫‪%d‬‬

‫عدد صحیح در مبنای ‪10‬‬

‫‪%f‬‬

‫عدد اعشاری بدون نماد علمی‬

‫‪%e‬‬

‫عدد اعشاری با نماد علمی‬

‫‪%g‬‬

‫عدد اعشاری با حالت كوتاهتر بین ‪ e‬و ‪f‬‬

‫‪%s‬‬

‫رشته‬

‫‪%ld‬‬

‫عدد صحیح بزرگ‬

‫‪%lf %le %lg‬‬

‫عدد اعشاری بزرگ‬

‫‪%o‬‬

‫عدد صحیح در مبنای ‪8‬‬

‫‪%x‬‬

‫عدد صحیحی در مبنای ‪16‬‬

‫‪%u‬‬

‫عدد صحیح بدون عالمت‬

‫ تابع نمایش در خروجی‬7-6-1
#include
void main() {
int age = 20;
floate average = 18.23;
printf("You are %d years old and your average is %f \n",age,average);
}
You are 20 years old and your average is 18.230000

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫‪‬‬
‫‪‬‬

‫برای کنترل نحوه چاپ اعداد می توانید از مشخصه طول میدان استفاده‬
‫کنید‪.‬‬
‫مشخصه طول میدان برای اعداد به شكل زیر استفاده می شود‪:‬‬
‫‪ ‬برای اعداد صحیح از ‪ %nd‬استفاده می كنیم كه ‪ n‬تعداد ارقام را نشان‬
‫می دهد )مثال ‪ .(%3d‬در اینصورت برای هر متغیر ‪ n‬رقم درنظر گرفته‬
‫می شود‪ .‬اگر اندازه عدد از ‪ n‬كوچكتر باشد‪ ،‬به سمت چپ آن فضای‬
‫خالی اضافه می شود و اگر اندازه عدد بیش از ‪ n‬رقم باشد‪ ،‬طول میدان‬
‫نادیده گرفته شده و عدد بطور كامل چاپ می شود‪.‬‬
‫‪ ‬برای اعداد اعشاری از ‪ %n.mf‬استفاده می كنیم كه ‪ n‬اندازه كل عدد‬
‫)شامل عالمت ممیز( و ‪ m‬تعداد ارقام اعشار است )مثال ‪ .(%5.2f‬در‬
‫صورتیكه تعداد ارقام اعشاری عدد موردنظر از ‪ m‬بیشتر باشد‪ ،‬عدد به ‪m‬‬
‫عدد اعشار گرد می شود و در صورتیكه از ‪ m‬كمتر باشد‪ ،‬در سمت‬
‫راست آن ‪ 0‬قرار داده می شود‪.‬‬

‫‪ 7-6-2‬تابع خواندن از ورودی‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای خواندن اطالعات از ورودی از تابع ‪ scanf‬استفاده می شود‪.‬‬
‫این تابع اطالعات را ازورودی استاندارد )معموال صفحه كلید( خوانده و در‬
‫متغیرهای تعیین شده قرار می دهد‪.‬‬
‫شكل كلی این تابع بصورت زیر است‪:‬‬
‫; )>لیست آدرسهای متغیرها< ‪> ,‬رشته كنترلی<(‪scanf‬‬
‫همانطور كه می بینید نحوه احضار تابع ‪ scanf‬نیز مشابه ‪ printf‬است‪ .‬تنها‬
‫تفاوت در آن است كه در ‪ scanf‬باید لیست آدرسهای متغیرها ارسال شود‪.‬‬
‫مبحث مربوط به آدرسها در فصول بعدی بررسی خواهد شد ولی در حال حاضر‬
‫بخاطر بسپارید كه برای بدست آوردن آدرس یك متغیر از عالمت & استفاده می‬
‫كنیم‪ .‬بعنوان مثال ‪ &age‬بمعنای آدرس متغیر ‪ age‬است‪.‬‬
‫بطور كلی در ‪ C‬قدیمی هرگاه كه یك تابع دارای پارامترهای خروجی بود )یعنی‬
‫پارامترهایی كه یك مقدار را باز می گرداندند( از آدرس متغیرها استفاده می‬
‫شد كه امروزه این مسئله وجود ندارد‪.‬‬

‫ تابع خواندن از ورودی‬7-6-2
#include
void main() {
int age;
float average ;
printf("Please enter your age and average : ");
scanf("%d %f",&age,&average);
printf("You are %d years old and your average is %5.2f \n",age,average);
}

Please enter your age and average : 19 16.72
You are 19 years old and your average is 16.72

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫زبان ‪ C++‬یک زبان شی گرا است‪ ،‬بهمین دلیل در این زبان برای ورودی‬
‫و خروجی از اشیاء بجای توابع استفاده می گردد‪.‬‬
‫از آنجا که امروزه معموال برنامه نویسان ‪ C‬از کامپایلرهای ‪ C++‬استفاده‬
‫می کنند‪ ،‬می توانند از اشیای ورودی و خروجی آن نیز استفاده کنند‪.‬‬
‫اینکار در بین بسیاری از برنامه نویسان ‪ C‬متداول است‪ ،‬بهمین دلیل ما‬
‫در اینجا نحوه کار با اشیای خواندن و نوشتن در ‪ C++‬را بطور مقدماتی‬
‫توضیح می دهیم؛ گرچه توضیح کامل این موارد نیاز به آشنایی با شی‬
‫گرایی و زبان ‪ C++‬دارد‪.‬‬
‫قبل از هرچیز الزم به ذکر است که کلیه اشیای مربوط به ورودی و‬
‫خروجی در فایل سرآمدی بنام ‪ iostream.h‬تعیریف شده اند‪ ،‬بنابراین‬
‫ابتدا باید این فایل به برنامه توسط دستور ‪ #include‬الحاق گردد‪.‬‬

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫زبان ‪ C++‬برای نمایش اطالعات از یک شیئ بنام ‪ cout‬استفاده می نماید‪.‬‬
‫برای ارسال اطالعات مورد نظر برای چاپ به ‪ cout‬باید از عملگر درج در جریان‬
‫یا >> استفاده نماییم‪ .‬بعنوان مثال ‪:‬‬
‫; ” ‪cout >> “Please enter your name:‬‬
‫و یا مثال دیگر ‪:‬‬
‫;‪int a = 10‬‬
‫;‪float b = 2.86‬‬
‫;‪cout << a‬‬
‫;‪cout << b‬‬
‫نکته جالبی که در این مثالها دیده می شود‪ ،‬آنستکه برخالف تابع ‪ printf‬هیچ‬
‫نیازی به مشخص کردن نوع متغیری که قصد چاپ آن را داریم نیست و خود‬
‫شئ ‪ cout‬نوع آن را تشخیص می دهد‪.‬‬
‫عالوه براین می توان چندین عملگر درج در جریان را با یکدیگر الحاق کرد و‬
‫چندین متغیر را با یک دستور چاپ کرد‪.‬‬

C++ ‫ ورودی و خروجی اطالعات در‬7-6-3
#include
void main() {
int age = 20;
floate average = 18.23;
cout >> “You are ” >> age >> “ years old and your average is ” >> average ;
}

You are 20 years old and your average is 18.230000

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای دریافت اطالعات از کاربر‪ ،‬از شئ دیگری بنام ‪ cin‬استفاده می شود‪.‬‬
‫برای ارسال متغیر مورد نظر به ‪ cin‬باید از عملگر استخراج از جریان یا <<‬
‫استفاده نماییم‪ .‬بعنوان مثال‪:‬‬
‫;‪int a‬‬
‫;‪cin >> a‬‬
‫بازهم همانطور که می بینید نیازی به تعیین نوع متغیر موردنظر نیست و خود‬
‫شئ ‪ cin‬نوع متغیر را بطور اتوماتیک تشخیص داده و داده ای از همان نوع را از‬
‫کاربر دریافت و در متغیر مورد نظر قرار می دهد‪.‬‬
‫عملگرهای استخراج از جریان را نیز می توان با یکدیگر الحاق کرد‪.‬‬
‫برای رفتن به خط بعد در شئ ‪ cout‬می توان از دستکاری کننده ‪ endl‬استفاده‬
‫کرد‪ .‬مثال در دستور زیر پس از چاپ پیغام‪ ،‬مکان نما به خط بعد منتقل می‬
‫شود‪:‬‬
‫;‪cout >> “List of students : “ >> endl‬‬
‫البته دستکاری کننده های متعدد دیگری نیز ازجمله موارد مربوط به تعیین طول‬
‫میدان و نحوه چاپ مقادیر وجود دارد که توضیح آنها نیاز به یک مبحث مستقل‬
‫دارد‪.‬‬

C++ ‫ ورودی و خروجی اطالعات در‬7-6-3
#include
void main() {
int age;
float average ;
cout << "Please enter your age and average : " ;
cin >> age >> average ;
cout << "You are " << age << "years old and your average is " << average;
}

Please enter your age and average : 19 16.72
You are 19 years old and your average is 16.72

‫‪ 7-7‬توابع کتابخانه ای‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫همانطور که قبال نیز گفته شد‪ ،‬زبان ‪ C‬از زیر برنامه ها نیز حمایت می کند‪ .‬هر زیر برنامه‬
‫در ‪ C‬یک تابع نامیده می شود‪ .‬تا کنون با توابعی همچون ‪ main‬و یا ‪ printf‬و ‪ scanf‬آشنا‬
‫شده ایم‪.‬‬
‫معموال عرضه کنندگان کامپایلرها و یا سایر فروشندگان نرم افزار‪ ،‬برخی از توابع عمومی‬
‫را که ممکن است مورد نیاز جمع کثیری از برنامه نویسان مختلف باشد را در قالب‬
‫کتابخانه ای از توابع در اختیار برنامه نویسان می گذارند‪ .‬بعضی از این توابع کتابخانه ای‬
‫مانند ‪ printf‬و ‪ scanf‬بصورت استاندارد درآمده و توسط عرضه کنندگان مختلف ارائه می‬
‫شوند‪.‬‬
‫در کامپایلر عرضه شده توسط شرکت بورلند )‪ (Borland C++ 3.1‬نیز کتابخانه های‬
‫متعددی از توابع برای شما عرضه شده اند که بتدریج با آنها و کاربردشان آشنا خواهید‬
‫شد‪.‬‬
‫نکته مهم آنستکه برای استفاده از این توابع ابتدا باید فایل سرآمد مربوط به آنها را نیز در‬
‫ابتدای برنامه خود اضافه نمایید ) با استفاده از ‪ .(#include‬هر فایل سرآمد شامل تعاریف‬
‫اولیه گروهی از توابع مرتبط با هم و داده های مربوط به آنها بوده و در استاندارد قدیمی‬
‫تر دارای پسوند ‪ .h‬می باشد)در استاندارد جدید پسوند این فایلها حذف شده است(‪.‬‬
‫برخی از این فایلهای سرآمد عبارتند از‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪ : stdio.h‬توابع ورودی و خروجی استاندارد‬
‫‪ : math.h‬توابع ریاضی‬
‫‪ : graphics.h‬توابع مربوط به عملیات گرافیکی‬
‫‪ : string.h‬توابع مربوط به کار با رشته ها‬


Slide 29

‫مبانی کامپیوتر و برنامه سازی‬
‫فصل هفتم ‪ :‬مفاهیم اولیه زبان ‪C‬‬
‫مدرس ‪ :‬نگین معروفی‬

‫‪ 7-1‬شناسه ها در ‪C‬‬
‫‪‬‬
‫‪‬‬

‫شناسه )‪ (identifier‬نامی است که به یک قسمت از برنامه مانند متغیر‪ ،‬تابع‪ ،‬ثابت و یا‬
‫‪ ...‬داده می شود‪.‬‬
‫در زبان ‪ C‬برای انتخاب شناسه ها فقط می توان از عالئم زیر استفاده کرد‪:‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫حروف انگلیسی کوچک و بزرگ )‪(A…Z a…z‬‬
‫ارقام )‪(0…9‬‬
‫عالمت خط پایین یا _‬

‫البته یک شناسه نمی تواند با یک رقم شروع شود‪.‬‬
‫چند شناسه مجاز‪ name2 ، average ، sum :‬و ‪student_average‬‬
‫چند شناسه غیرمجاز ‪ 2name‬و یا ‪student average‬‬
‫در برنامه نویسی امروزی پیشنهاد می شود بجای شناسه هایی همانند‬
‫‪ student_average‬از ‪ studentAverage‬استفاده گردد‪.‬‬
‫نکته مهم دیگری که باید به آن اشاره کرد آنستکه زبان ‪ C‬برخالف بسیاری از زبانهای دیگر‬
‫به کوچک و بزرگی حروف حساس است )‪ .(case sensitive‬در نتیجه شناسه های زیر با‬
‫یکدیگر متفاوتند ‪:‬‬
‫‪Sum ≠ sum ≠ SUM‬‬
‫آخرین نکته اینستکه در هنگام انتخاب شناسه نمی توانید از کلمات کلیدی که برای‬
‫منظورهای خاص در زبان ‪ C‬رزرو شده اند استفاده کنید‪.‬‬

C ‫ شناسه ها در‬7-1
: C ‫کلمات کلیدی در زبان‬
auto

break

case

char

const

continue

default

do

double

else

enum

extern

float

for

goto

if

int

long

register

return

short

signed

sizeof

static

struct

switch

typedef

union

unsigned

void

volatile

while

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫محدوده‬

‫اندازه )بیت(‬

‫توضیح‬

‫نوع داده‬

‫‪-128 to +127‬‬

‫‪8‬‬

‫کاراکتر‬

‫‪char‬‬

‫‪-32768 to +32767‬‬

‫‪16‬‬

‫عدد صحیح‬

‫‪int‬‬

‫‪3.4e-38 to 3.4e+38‬‬

‫‪32‬‬

‫عدد اعشاری‬

‫‪float‬‬

‫‪1.7e-308 to 1.7e+308‬‬

‫‪64‬‬

‫عدد اعشاری با‬
‫دقت مضاعف‬

‫‪double‬‬

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫‪‬‬

‫البته چند نکته مهم درمورد این جدول قابل ذکر است ‪:‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫اندازه ‪ int‬در محیطهای ‪ 16‬بیتی مانند ‪ DOS‬برابر ‪ 16‬بیت است‪ .‬اما در‬
‫محیطهای ‪ 32‬بیتی همانند ‪ Windows‬اندازه آن ‪ 32‬بیت می باشد که در‬
‫اینصورت محدوده ای برابر ‪ -2,147,483,648‬تا ‪ +2,147,483,647‬را‬
‫پوشش می دهد‪.‬‬
‫در بعضی از کامپایلرهای ‪ ،C‬نوع داده ‪ bool‬نیز وجود دارد که می تواند‬
‫یکی از مقادیر ‪)true‬درست( یا ‪) false‬غلط( را نشان دهد ‪ .‬اما در نسخه‬
‫های اولیه ‪ C‬از همان نوع داده صحیح یا ‪ int‬برای اینکار استفاده می‬
‫شد‪ .‬بدین صورت که ‪ 0‬نشاندهنده ‪ false‬و هر عدد غیر صفر )معموال ‪(1‬‬
‫نشاندهنده ‪ true‬است‪.‬‬
‫از آنجا که برای ذخیره سازی کاراکترها کد اسکی آنها ذخیره می گردد‪،‬‬
‫از یک متغیر کاراکتری یا ‪ char‬می توان بعنوان یک عدد صحیح کوچک نیز‬
‫استفاده کرد و اعمال ریاضی برروی آنها نیز مجاز است‪.‬‬

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫عالوه براین چندین اصالح کننده نیز وجود دارد که به ما اجازه می دهد نوع داده مورد‬
‫نظر را با دقت بیشتری برای نیازهای مختلف استفاده نماییم‪.‬‬
‫این اصالح کننده ها عبارتند از ‪short, long, signed, unsigned :‬‬
‫تمام این اصالح کننده ها می توانند به نوع داده ‪ int‬اعمال شوند و اثر آنها بستگی‬
‫به محیط دارد‪.‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫در یک محیط ‪16‬بیتی‪short int ،‬بازهم برابر ‪16‬بیت است ولی ‪ long int‬برابر‪32‬بیت می‬
‫باشد‪.‬‬
‫‪ unsigned int‬باعث می شود که یک عدد ‪ 16‬بیتی بدون عالمت داشته باشیم که بازه‬
‫بین ‪ 0‬تا ‪ 65535‬را پوشش می دهد‪ signed int .‬نیز همانند ‪ int‬معمولی بوده و تفاوتی‬
‫ندارد‪.‬‬
‫ترکیب این اصالح کننده ها نیز ممکن است‪ .‬مثال ‪ unsigned long int‬یک عدد ‪ 32‬بیتی‬
‫بدون عالمت است که بازه ‪ 0‬تا ‪ 4,294,967,295‬را پوشش می دهد‪.‬‬

‫برروی نوع داده ‪ char‬فقط اصالح کننده های ‪ signed‬و ‪ unsigned‬را می توان اعمال‬
‫کرد‪ .‬معموال از اصالح کننده ‪ unsigned‬وقتی استفاده می شود که قصد داشته‬
‫باشیم از ‪ char‬بعنوان یک عدد صحیح مثبت بین ‪ 0‬تا ‪ 255‬استفاده کنیم‪.‬‬
‫برروی نوع داده ‪ double‬تنها اصالح کننده ‪ long‬قابل اعمال است و دراینصورت عدد‬
‫اعشاری با ‪ 80‬بیت را خواهیم داشت که قادر است هر عددی در بازه ‪ 3.4e-4932‬تا‬
‫‪ 1.1e+4932‬را در خود نگاه دارد‪.‬‬

‫‪ 7-3‬تعریف متغیرها‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای تعریف متغیرها به شکل زیر عمل می کنیم‪:‬‬

‫;>‪ ‫که ‪ type‬یکی از نوع داده های گفته شده و ‪ variable-list‬لیستی از متغیرها است‬
‫که با کاما از یکدیگر جدا شده اند‪ .‬بعنوان مثال ‪:‬‬
‫;‪int sum‬‬
‫;‪float average‬‬
‫; ‪long int a, b, c‬‬
‫; ‪unsigned long int i, j, k‬‬
‫عالوه براین می توان در هنگام تعریف متغیر به آن مقدار اولیه نیز داد‪ .‬مثال ‪:‬‬
‫; ‪int d = 0‬‬
‫نكته مهم آنكه زبان ‪ C‬به متغیرها مقدار اولیه نمي دهد )حتي ‪ (0‬و برنامه نويس‬
‫خود بايد اينكار را صريحا انجام دهد‪ ،‬درغیر اينصورت مقدار اولیه متغیر‪ ،‬نامعین خواهد‬
‫بود‪.‬‬
‫تعریف متغیرها طبق اصول زبان ‪ C‬میتواند درهرجایی از برنامه صورت پذیرد‪ ،‬و‬
‫متغیرهای تعریف شده از همان خط به بعد قابل استفاده خواهد بود‪ .‬اما معموال‬
‫توصیه می گردد كه تعریف متغیرها در همان خط ابتدایی تابع و بالفاصله پس از {‬
‫صورت پذیرد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫‪‬‬
‫‪‬‬

‫ثابتها مقادیر ثابتی هستند كه مقدار آنها در حین اجرای برنامه تغییر نمی یابد‪ .‬ثابتها می توانند از‬
‫هریك از نوع داده های اصلی باشند‪.‬‬
‫ثوابت عددی صحیح ‪:‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫برای نمایش این دسته از ثوابت‪ ،‬از دنباله ای از ارقام بعالوه عالمت ‪ +‬یا ‪ -‬استفاده می كنیم‪ .‬بعنوان مثال‬
‫‪ -45‬و یا ‪ 3489‬ثوابت صحیح هستند‪.‬‬
‫در حالت عادی ‪ C‬هر عدد را در كوچكترین نوع داده ای كه می تواند قرار می دهد‪ .‬مثال عدد ‪ 85‬در یك‬
‫‪ int‬قرار می گیرد‪ ،‬اما عدد ‪ 145398‬در یك ‪ long int‬قرار خواهد گرفت‪.‬‬
‫اگر قصد دارید یك عدد كوچك بعنوان ‪ long‬محسوب گردد‪ ،‬می توانید از پسوند ‪ L‬در انتهای آن استفاده‬
‫می كنیم‪ .‬مثال ‪245L‬یك عدد ‪ long‬محسوب می شود‪.‬‬
‫;‪long int a = 20L‬‬
‫پسوند ‪ U‬در انتهای عدد نیز نشانه بدون عالمت بودن آن است‪.‬‬
‫نكته دیگر آنكه ‪ C‬به شما اجازه می دهد درصورت لزوم ثوابت صحیح خود را در مبنای ‪ 8‬یا ‪ 16‬نیز كه‬
‫از مبناهای متداول در برنامه نویسی هستند‪ ،‬بنویسید‪.‬‬
‫‪‬‬
‫‪‬‬

‫برای نوشتن عدد در مبنای ‪ 8‬باید آن را با ‪ 0‬آغاز كنید‪ ،‬مثال ‪ 0342‬یك عدد در منای ‪ 8‬محسوب می‬
‫گردد‪.‬‬
‫برای نوشتن یك عدد در مبنای ‪ 16‬باید آن را با ‪ 0x‬آغاز نمایید‪ ،‬مانند ‪.0x27A4‬‬

‫‪ 7-4‬ثوابت‬
‫ثوابت عددی اعشاری‬

‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫برای نمایش اعداد اعشاری‪ ،‬باید از نقطه اعشار استفاده كنیم‪ ،‬مانند ‪237.45‬‬
‫اما نكته جالب آنستكه می توانید از نماد علمی نیز برای نمایش اعداد‬
‫اعشاری استفاده كنید‪ .‬برای اینكار كافی است از حرف ‪ e‬برای نمایش قسمت‬
‫توان استفاده نمایید‪ .‬بعنوان مثال ‪:‬‬
‫‪-23.47 × 10 5 = -23.47e5‬‬
‫‪42.389 × 10 -3 = 42.389e-3‬‬
‫دقت كنید كه قسمت توان‪ ،‬حتما یك عدد صحیح است‪.‬‬
‫نكته جالب اینجاست كه برخالف مورد قبل‪ ،‬كامپایلر بطور پیش فرض داده های‬
‫اعشاری را از نوع ‪ double‬فرض می كند‪.‬چنانچه دوست دارید ثابت شما ازنوع‬
‫‪ float‬درنظر گرفته شود‪ ،‬در انتهای آن ‪ F‬قرار دهید‪ .‬ضمنا پسوند ‪ L‬نیز داده‬
‫اعشاری را از نوع ‪ long double‬درنظر می گیرد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫ثوابت كاراكتری ‪:‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫برای نشان دادن ثوابت كاراكتری‪ ،‬آنها را در داخل ' قرار می دهیم‪ .‬بعنوان مثال‬
‫'‪'A‬یك ثابت كاراكتری است‪.‬‬
‫; '‪char ch = 'S‬‬
‫دقت كنید كه همانطور كه قبال گفته شد‪ ،‬كد اسكی كاراكترها در متغیر ذخیره‬
‫می گردد‪ ،‬بنابراین می توان از آن بعنوان یك عدد صحیح نیز استفاده كرد‪ .‬نكته‬
‫مهم دیگر آنستكه به تفاوت عدد ‪ 5‬و كاراكتر '‪ '5‬دقت داشته باشید‪ .‬در حقیقت‬
‫'‪ '5‬برابر است با عدد ‪ 53‬كه همان كد اسكی آن است‪.‬‬
‫روش فوق‪ ،‬برای نمایش کاراکترهای قابل چاپ مناسب است‪ ،‬اما بعضی‬
‫كاراكترها مانند ‪ enter‬قابل نمایش نبوده و برای آنها شکل خاصی وجود ندارد‪.‬‬
‫در چنین مواردی‪ ،‬زبان ‪ C‬از ترکیب عالمت \ به همراه یک کاراکتر دیگر‪ ،‬برای‬
‫نمایش این قبیل کاراکترها استفاده می نماید‪ .‬بعنوان مثال‪ ،‬کاراکتر '‪ '\n‬نشان‬
‫دهنده خط جدید یا همان ‪ enter‬می باشد‪.‬‬
‫جدول صفحه بعد این قبیل کاراکترها و معادل آنها را نشان می دهد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫نحوه نمایش در ‪C‬‬

‫کد اسکی‬

‫صدای بوق کامپیوتر‬

‫‪\a‬‬

‫‪7‬‬

‫حرکت به عقب ‪backspace‬‬

‫‪\b‬‬

‫‪8‬‬

‫شروع صفحه ‪form feed‬‬

‫‪\f‬‬

‫‪12‬‬

‫سطر جدید ‪line feed‬‬

‫‪\n‬‬

‫‪10‬‬

‫برگشت به ابتداي سطر ‪carriage return‬‬

‫‪\r‬‬

‫‪13‬‬

‫فاصله افقی ‪horizontal tab‬‬

‫‪\t‬‬

‫‪9‬‬

‫فاصله عمودی ‪vertical tab‬‬

‫‪\v‬‬

‫‪11‬‬

‫عالمت سوال‬

‫?\‬

‫‪63‬‬

‫عالمت '‬

‫'\‬

‫‪39‬‬

‫عالمت "‬

‫"\‬

‫‪34‬‬

‫عالمت \‬

‫\\‬

‫‪92‬‬

‫عالمت تهی‬

‫‪\0‬‬

‫‪0‬‬

‫نام کاراکتر‬

‫کد اسکی یک کاراکتر با ‪ 3‬رقم در مبنای ‪8‬‬

‫‪\000‬‬

‫کد اسکی یک کاراکتر با ‪ 2‬رقم در مبنای ‪16‬‬

‫‪\x00‬‬

‫‪ 7-4‬ثوابت‬
‫‪‬‬

‫ثوابت رشته ای ‪ C :‬عالوه بر ثوابت فوق‪ ،‬از یك ثابت دیگر بنام رشته نیز‬
‫حمایت می كند‪ .‬رشته‪ ،‬دنباله ای از كاراكترها است كه در داخل " قرار‬
‫می گیرند‪ .‬بعنوان مثال "‪ "this is a test‬یك رشته است‪ .‬دقت كنید كه '‪'a‬‬
‫یك كاراكتر است‪ ،‬اما "‪ "a‬یك رشته است كه فقط شامل یك كاراكتر می‬
‫باشد‪.‬‬

‫‪ 7-5‬عملگرها‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫عملگر‪ ،‬نمادی است كه به كامپایلر می گوید تا عملیات محاسباتی یا‬
‫منطقی خاصی را برروی یك یا چند عملوند‪ ،‬انجام دهد‪.‬‬
‫به عملگرهایی كه فقط یك عملوند دارند‪ ،‬عملگر یكانی می گوییم و‬
‫همواره عملگر در سمت چپ عملوند قرار می گیرد)مانند عدد ‪.(-125‬‬
‫اما عملگرهایی كه برروی دو عملوند اثر می كنند را عملگر دودویی‬
‫نامیده و عملگر را بین دو عملوند قرار می دهیم )مانند ‪.(23+86‬‬
‫هر ترکیب درستی از عملگرها و عملوندها را یک عبارت می نامیم‪.‬‬
‫‪ C‬از نقطه نظر عملگرها یك زبان بسیار قوی است‪ .‬این عملگرها به چند‬
‫دسته اصلی تقسیم می گردند كه آنها را به ترتیب بررسی می كنیم‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫این عملگرها‪ ،‬همان اعمال متداول ریاضی هستند كه در زبان ‪ C‬مورد استفاده‬
‫قرار می گیرند‪ .‬این اعمال عبارتند از ‪:‬‬

‫عمل‬

‫نوع‬

‫عملگر‬

‫منفی كردن عملوند سمت راست‬

‫یكانی‬

‫‪-‬‬

‫جمع دو عملوند‬

‫دودویی‬

‫‪+‬‬

‫تفریق دو عملوند‬

‫دودویی‬

‫‪-‬‬

‫ضرب دو عملوند‬

‫دودویی‬

‫*‬

‫تقسیم دو عملوند‬

‫دودویی‬

‫‪/‬‬

‫محاسبه باقیمانده تقسیم دو عملوند‬

‫دودویی‬

‫‪%‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬
‫‪‬‬

‫این عملگرهای برروی همه انواع داده های ‪ C‬عمل می كنند‪ ،‬بجز عملگر ‪ %‬كه فقط‬
‫برروی نوع داده های صحیح عمل می كند‪.‬‬
‫اما نكته مهمی كه باید به آن اشاره كرد‪ ،‬نحوه كار عملگر تقسیم برروی نوع داده های‬
‫مختلف است‪.‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫درصورتیكه هردو عملوند صحیح باشند‪ ،‬تقسیم بصورت صحیح بر صحیح انجام خواهد شد‪.‬‬
‫اگر یكی یا هر دو عملوند اعشاری باشند‪ ،‬تقسیم بصورت اعشاری انجام خواهد پذیرفت‪.‬‬
‫فرض كنید تعاریف زیر را داریم ‪:‬‬
‫; ‪int a,b‬‬
‫; ‪float c,d‬‬
‫; ‪a = 10 ; b = 4‬‬
‫;‪c = 8.2; d = 4.0‬‬
‫اكنون به نتایج عملیات زیر دقت كنید ‪:‬‬
‫‪a / b => 2‬‬
‫‪c / d => 2.05‬‬
‫‪a / d => 2.5‬‬
‫‪a / 4 => 2‬‬
‫چنانچه به آخرین مورد توجه كنید‪ ،‬متوجه می شوید كه از آنجا كه ‪a‬یك متغیر صحیح است و ‪4‬‬
‫نیز یك ثابت صحیح در نظر گرفته شده‪ ،‬درنتیجه تقسیم بصورت صحیح بر صحیح انجام گرفته‬
‫است‪ .‬چنانچه بخواهیم تقسیم بصورت اعشاری صورت پذیرد‪ ،‬به دو شكل می توانیم عمل‬
‫كنیم‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫برای اینکه عبارت تقسیم صفحه قبل بصورت اعشاری انجام شود‪ ،‬به دو روش‬
‫می توان عمل کرد‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫این عبارت را بصورت ‪ a / 4.0‬بنویسیم‪.‬‬
‫از عملگر قالب ریزی استفاده كنیم‪.‬‬

‫عملگر قالب ریزی می تواند یك نوع را به نوع دیگری تبدیل نماید‪ .‬شكل كلی آن‬
‫به شكل زیر است ‪:‬‬
‫>‪() ‫كه ‪ type‬نوع مورد نظر است كه قصد تبدیل عبارت ‪ expression‬به آن نوع را‬
‫داریم‪ .‬بعنوان مثال در مورد قبلی می توان به شكل زیر عمل كرد ‪:‬‬
‫‪(float) a / 4‬‬
‫در این حالت از كامپایلر خواسته ایم كه ابتدا عدد ‪ a‬را به اعشاری تبدیل كند‬
‫)البته بصورت موقت( و سپس آن را بر ‪ 4‬تقسیم نماید‪ ،‬كه مسلما حاصل‬
‫اعشاری خواهد بود‪.‬‬
‫بطوركلی هرگاه ثابتها و متغیرهایی از انواع مختلف در یك عبارت محاسباتی‬
‫داشته باشیم‪ ،‬كامپایلر ‪ C‬همه آنها را به یك نوع یكسان كه همان بزرگترین‬
‫عملوند موجود است تبدیل خواهد كرد‪ .‬بعنوان مثال به مورد صفحه بعد دقت‬
‫كنید ‪:‬‬

‫ عملگرهای محاسباتی‬7-5-1
char ch;
int i;

float f;
double d;
result = (ch / i)
int

+

(f *d)

(f+i)
float

double

double

int

-

double

double

float

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫اولویت عملگرها ‪ :‬در عبارتی که شامل چندین عملگر است‪ ،‬کدامیک در‬
‫ابتدا اعمال خواهد گردید‪.‬‬
‫اولویت عملگرهای محاسباتی از باال به پایین بشرح زیر است‪:‬‬
‫‪ ‬عملگر یکانی –‬
‫‪ ‬عملگرهای * و ‪ /‬و ‪%‬‬
‫‪ ‬عملگرهای ‪ +‬و –‬
‫چنانچه اولویت دو عملگر یکسان باشد‪ ،‬این عملگرها از چپ به راست‬
‫محاسبه خواهند شد‪.‬‬
‫چنانچه بخواهیم یک عمل با اولویت پایین زودتر انجام شود‪ ،‬باید از پرانتز‬
‫استفاده کنیم‪ .‬بنابراین اولویت عملگر پرانتز از همه موارد فوق‬
‫بیشتراست‪ .‬در مورد پرانتزهای متداخل‪ ،‬ابتدا پرانتز داخلی محاسبه‬
‫می شود؛ اما در مورد پرانتزهای هم سطح‪ ،‬ابتدا پرانتز سمت چپتر‬
‫محاسبه می گردد‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫چند مثال در مورد اولویت عملگرها‬

‫ترتیب اجرای عملگرها‬

‫عبارت زبان ‪C‬‬

‫ابتدا عمل * و سپس عمل ‪+‬‬

‫‪b+c*d‬‬

‫ابتدا عمل ‪ +‬و سپس عمل *‬

‫‪(b + c) * d‬‬

‫ابتدا عمل ‪ /‬سپس عمل * و در انتها عمل ‪+‬‬

‫‪b+c/d*e‬‬

‫ابتدا عمل * سپس عمل ‪ /‬و در انتها عمل ‪+‬‬

‫)‪b + c / (d * e‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫یک مثال کامل در مورد اولویت عملگرها‬

‫‪result = a + b * (f – (g + b) / d) – c * (a – d) / e‬‬
‫‪6‬‬

‫‪1‬‬
‫‪7‬‬

‫‪2‬‬

‫‪8‬‬

‫‪3‬‬
‫‪4‬‬
‫‪5‬‬
‫‪9‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫در زبان ‪ C‬برای انتساب چندین عملگر وجود دارد‪ .‬ساده ترین عملگر انتساب‪ ،‬همان عملگر =‬
‫است که در بسیاری از زبانها استفاده می شود‪ .‬بعنوان مثال ‪:‬‬
‫;‪a = 5‬‬
‫;‪b = c + 2 * d‬‬
‫این عملگر باعث می شود که عبارت سمت راست در عبارت سمت چپ قرار گیرد‪.‬‬
‫توجه کنید که مقدار سمت چپ باید عبارتی باشد که بتوان به آن یک مقدار را نسبت داد‬
‫)مانند یک متغیر( که به آن ‪ Lvalue‬گفته می شود‪ ،‬بنابراین یک ثابت نمی تواند در سمت چپ‬
‫قرار گیرد‪.‬‬
‫نکته دیگر اینکه اولویت عملگر = از عملگرهای ریاضی کمتر است و درنتیجه ابتدا آن عملیات‬
‫انجام شده و در پایان حاصل در عبارت سمت چپ ریخته می شود‪.‬‬
‫الزم به ذکر است که در هنگام انتساب‪ ،‬درصورت لزوم نوع عبارت سمت راست به نوع عبارت‬
‫سمت چپ تبدیل می شود‪ .‬مثال‪:‬‬
‫;‪int a‬‬
‫;‪a = 2.5 * 5.0‬‬
‫که دراینصورت عدد ‪ 12‬در ‪ a‬ذخیره خواهد شد‪.‬‬
‫شرکت پذیری این عملگر از راست به چپ می باشد‪ ،‬بدین معنا که چنانچه چندین عملگر‬
‫نسبت دهی داشته باشیم‪ ،‬این عملگرها از راست به چپ محاسبه می شوند‪ .‬مثال پس از‬
‫اجرای دستور زیر‪ ،‬مقدار هر ‪ 3‬متغیر برابر ‪ 10‬خواهد شد‪.‬‬
‫;‪a = b = c = 10‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬

‫نکته جالب درمورد زبان ‪ C‬آنستکه دارای یک سری عملگرهای انتساب‬
‫خالصه شده است که باعث می شوند در بعضی موارد بتوانیم عبارات‬
‫کوتاهتری را بنویسیم‪ .‬این عملگرها عبارتند از ‪:‬‬
‫عملگرد‬

‫مثال‬

‫عبارت انتساب معادل‬

‫‪++‬‬

‫;‪a ++‬‬

‫;‪a = a + 1‬‬

‫‪--‬‬

‫;‪a --‬‬

‫;‪a = a – 1‬‬

‫=‪+‬‬

‫;‪a += 5‬‬

‫;‪a = a + 5‬‬

‫=‪-‬‬

‫;‪a -= 8‬‬

‫;‪a= a – 8‬‬

‫=*‬

‫;‪a *= 10‬‬

‫;‪a= a * 10‬‬

‫=‪/‬‬

‫;‪a /= 2‬‬

‫;‪a = a / 2‬‬

‫=‪%‬‬

‫;‪a %= 10‬‬

‫;‪a = a % 10‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬
‫‪‬‬

‫عملگر اول و دوم‪ ،‬عملگرهای یکانی هستند که بترتیب عملگر افزایش و عملگر کاهش‬
‫نامیده می شوند‪.‬‬
‫نکته جالب آنستکه این دو عملگر به دوصورت مورد استفاده قرار می گیرند‪.‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫در حالتی که از دستور ;‪ a ++‬استفاده شود به آن پس افزایش می گویند و بدین معناست که‬
‫ابتدا از مقدار فعلی ‪ a‬در عبارت موردنظر استفاده کن و سپس آن را افزایش بده‪.‬‬
‫اما دستور ;‪ ++ a‬که به آن پیش افزایش گفته می شود‪ ،‬ابتدا ‪ a‬را افزایش داده و سپس از آن‬
‫در عبارت استفاده می کند‪.‬‬
‫به برنامه زیر دقت کنید‪:‬‬

‫>‪#include ‫{ )(‪void main‬‬
‫; ‪int a ,b‬‬
‫;‪a=5‬‬
‫;‪b = a ++‬‬
‫;)‪printf(“a=%d and b=%d \n”,a,b‬‬
‫;‪a=5‬‬
‫;‪b = ++ a‬‬
‫;)‪printf(“a=%d and b=%d \n”,a,b‬‬
‫}‬
‫‪a=6 b=5‬‬
‫‪a=6 b=6‬‬

‫‪ 7-5-3‬عملگرهای مقایسه ای‬
‫‪‬‬

‫‪‬‬

‫این عملگرها دو عبارت را بایکدیگر مقایسه کرده و نتیجه را باز می گردانند‪.‬‬
‫نتیجه می تواند درست )‪ (true‬یا غلط )‪ (false‬باشد‪.‬‬
‫نتیجه این عملگرها یک عدد صحیح است که درصورت درست بودن ‪ 1‬و‬
‫درصورت غلط بودن ‪ 0‬باز می گردانند‪ .‬این عملگرها عبارتند از‪:‬‬
‫عملگر‬

‫مفهوم عملگر‬

‫مثال‬

‫<‬

‫بزرگتر )<(‬

‫‪a>b‬‬

‫>‬

‫کوچکتر )>(‬

‫‪a
‫=<‬

‫بزرگتر یا مساوی )≤(‬

‫‪a >= b‬‬

‫=>‬

‫کوچکتر یا مساوی )≥(‬

‫‪a <= b‬‬

‫==‬

‫مساوی )=(‬

‫‪a == b‬‬

‫=!‬

‫نامساوی )≠(‬

‫‪a != b‬‬

‫‪ 7-5-3‬عملگرهای مقایسه ای‬
‫‪‬‬

‫‪‬‬

‫نکته مهمی که باید به آن دقت کرد عملگر مساوی )==( است‪ ،‬چرا که یک‬
‫اشتباه بسیار متداول برنامه نویسان ‪ C‬استفاده اشتباه از عملگر انتساب‬
‫)=( بجای عملگر تساوی )==( است که باعث ایجاد خطا در برنامه می‬
‫شود‪.‬‬
‫اولویت این عملگرها از باال به پایین بشرح زیر است‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫عملگرهای <‪ <= ، > ،‬و =>‬
‫عملگرهای == و =!‬

‫الزم بذکر است که در هنگام مساوی بودن اولویت چند عملگر‪ ،‬این عملگرها‬
‫از چپ به راست محاسبه می گردند‪.‬‬

‫‪ 7-5-4‬عملگرهای منطقی‬
‫‪‬‬

‫این عملگرها به شما اجازه می دهند که شرطهای ساده ای را که با‬
‫استفاده از عملگرهای مقایسه ای ایجاد شده اند را با یکدیگر ترکیب نموده‬
‫و شرطهای پیچیده تری را بسازید‪ .‬این عملگرها عبارتند از ‪:‬‬
‫مثال‬

‫عملگر‬

‫مفهوم عملگر‬

‫نحوه کار‬

‫&&‬

‫‪ AND‬منطقی‬

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

‫‪a>0 && sw==1‬‬

‫||‬

‫‪ OR‬منطقی‬

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

‫‪a<=100 || b!=0‬‬

‫!‬

‫‪ NOT‬منطقی‬

‫اگر عملوند درست باشد‪ ،‬نادرست و‬
‫اگر نادرست باشد‪ ،‬درست برمی‬
‫گرداند‪.‬‬

‫)‪! (a==1 || b<10‬‬

‫‪ 7-5-5‬عملگر شرطی‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫گاهی الزم است که ابتدا یک شرط بررسی شده و سپس برمبنای نتیجه )درست یا نادرست بودن آن( یکی‬
‫از دو عبارت ممکن بازگردانده شود‪ .‬برای اینکار می توان از یک عملگر ‪3‬تایی )با ‪ 3‬عملوند( بنام عملگر‬
‫شرطی استفاده نمود‪.‬‬
‫شکل کلی این عملگر بصورت زیر است‪:‬‬
‫>عبارت‪> :<2‬عبارت‪> ?<1‬شرط<‬
‫نحوه کار بدینصورت است که درصورت درست بودن شرط‪ ،‬عبارت‪ 1‬و در غیراینصورت عبارت ‪ 2‬بازگردانده می‬
‫شود‪.‬‬
‫به عنوان مثال به دستور زیر توجه کنید‪:‬‬
‫که این عبارت معادل دستور زیر است‪:‬‬

‫‪‬‬

‫;‪a = (k<10) ? 100 : 50‬‬
‫;‪if (k<10) a=100‬‬
‫;‪else a=50‬‬

‫البته این عبارت به شکلهای پیچیده نیز می تواند مورد استفاده قرار گیرد‪ .‬مثال ‪:‬‬
‫;‪c += (a>0 && a<10) ? ++a : a/b‬‬
‫که معادل است با ‪:‬‬
‫{ )‪if (a>0 && a<10‬‬
‫;‪a= a + 1‬‬
‫;‪c = c + a‬‬
‫}‬
‫;‪else c = c + a/b‬‬

‫‪ 7-5-6‬اولویت عملگرها‬
‫عملگر‬

‫اولویت‬

‫شرکت پذیری‬

‫‪1‬‬

‫)(‬

‫از چپ به راست‬

‫‪2‬‬

‫‪- + ! -- ++‬‬

‫از راست به چپ‬

‫‪3‬‬

‫‪* / %‬‬

‫از چپ به راست‬

‫‪4‬‬

‫‪+ -‬‬

‫از چپ به راست‬

‫‪5‬‬

‫>> <<‬

‫از چپ به راست‬

‫‪6‬‬

‫>= > <= <‬

‫از چپ به راست‬

‫‪7‬‬

‫=! ==‬

‫از چپ به راست‬

‫‪8‬‬

‫&&‬

‫از چپ به راست‬

‫‪9‬‬

‫||‬

‫از چپ به راست‬

‫‪10‬‬

‫‪?:‬‬

‫از راست به چپ‬

‫‪11‬‬

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

‫از راست به چپ‬

‫‪12‬‬

‫‪,‬‬

‫از چپ به راست‬

‫‪ 7-6‬خواندن و نمایش اطالعات‬
‫‪‬‬

‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫همانطور كه قبال نیز گفته شد‪ ،‬یكی از اهداف زبان ‪ C‬قابل حمل بودن آن‬
‫است‪ .‬بهمین منظور سعی شده است كه از دستوراتی كه ممكن است‬
‫وابسته به ماشین خاصی باشد‪ ،‬اجتناب گردد‪.‬‬
‫بهمین دلیل زبان ‪ C‬برخالف سایر زبانها دارای هیچ دستوری برای‬
‫خواندن از ورودی و یا نوشتن در خروجی نیست‪.‬‬
‫اما در عوض دارای تعدادی تابع )زیربرنامه( استاندارد می باشد كه تقریبا‬
‫تمامی كامپایلرها از آنها حمایت می كنند‪.‬‬
‫این كار به كامپایلر این امكان را می دهد كه بر حسب نوع سخت افزار‬
‫موردنظر‪ ،‬توابع ورودی و خروجی را طراحی نماید‪.‬‬
‫این توابع در یك فایل سرآمد بنام ‪ stdio.h‬تعریف شده اند و بنابراین قبل‬
‫ازاینكه بتوانید از این توابع استفاده نمایید‪ ،‬باید این فایل را نیز با استفاده‬
‫از ‪ #include‬در برنامه خود بگنجانید‪.‬‬

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫برای نمایش اطالعات در خروجی از تابع ‪ printf‬استفاده می شود‪.‬‬
‫این تابع رشته موردنظر شما را به خروجی استاندارد )كه در حالت‬
‫عادی همان صفحه نمایش یا مانیتور است( می فرستد‪ .‬شكل كلی این‬
‫تابع بصورت زیر است‪:‬‬
‫; )>لیست متغیرها< ‪> ,‬رشته كنترلی<(‪printf‬‬
‫رشته كنترلی همان متنی است كه قصد چاپ آن را داریم‪ ،‬با ذكر این‬
‫نكته كه در قسمتهایی كه باید مقدار یك متغیر چاپ شود‪ ،‬از یك‬
‫مشخصه تبدیل استفاده می شود‪ .‬هر مشخصه تبدیل از یك عالمت ‪%‬‬
‫بعالوه یك كاراكتر كه نوع متغیر مورد نظر را نشان می دهد تشكیل می‬
‫گردد‪.‬‬
‫لیست متغیرها نیز همان متغیرهایی هستند كه قصد چاپ آنها را داریم‪.‬‬
‫این متغیرها باید بترتیب قرار گرفته و با كاما )‪ (,‬از یكدیگر جدا شوند‪.‬‬

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫مشخصه تبدیل‬

‫مفهوم‬

‫‪%c‬‬

‫كاراكتر‬

‫‪%d‬‬

‫عدد صحیح در مبنای ‪10‬‬

‫‪%f‬‬

‫عدد اعشاری بدون نماد علمی‬

‫‪%e‬‬

‫عدد اعشاری با نماد علمی‬

‫‪%g‬‬

‫عدد اعشاری با حالت كوتاهتر بین ‪ e‬و ‪f‬‬

‫‪%s‬‬

‫رشته‬

‫‪%ld‬‬

‫عدد صحیح بزرگ‬

‫‪%lf %le %lg‬‬

‫عدد اعشاری بزرگ‬

‫‪%o‬‬

‫عدد صحیح در مبنای ‪8‬‬

‫‪%x‬‬

‫عدد صحیحی در مبنای ‪16‬‬

‫‪%u‬‬

‫عدد صحیح بدون عالمت‬

‫ تابع نمایش در خروجی‬7-6-1
#include
void main() {
int age = 20;
floate average = 18.23;
printf("You are %d years old and your average is %f \n",age,average);
}
You are 20 years old and your average is 18.230000

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫‪‬‬
‫‪‬‬

‫برای کنترل نحوه چاپ اعداد می توانید از مشخصه طول میدان استفاده‬
‫کنید‪.‬‬
‫مشخصه طول میدان برای اعداد به شكل زیر استفاده می شود‪:‬‬
‫‪ ‬برای اعداد صحیح از ‪ %nd‬استفاده می كنیم كه ‪ n‬تعداد ارقام را نشان‬
‫می دهد )مثال ‪ .(%3d‬در اینصورت برای هر متغیر ‪ n‬رقم درنظر گرفته‬
‫می شود‪ .‬اگر اندازه عدد از ‪ n‬كوچكتر باشد‪ ،‬به سمت چپ آن فضای‬
‫خالی اضافه می شود و اگر اندازه عدد بیش از ‪ n‬رقم باشد‪ ،‬طول میدان‬
‫نادیده گرفته شده و عدد بطور كامل چاپ می شود‪.‬‬
‫‪ ‬برای اعداد اعشاری از ‪ %n.mf‬استفاده می كنیم كه ‪ n‬اندازه كل عدد‬
‫)شامل عالمت ممیز( و ‪ m‬تعداد ارقام اعشار است )مثال ‪ .(%5.2f‬در‬
‫صورتیكه تعداد ارقام اعشاری عدد موردنظر از ‪ m‬بیشتر باشد‪ ،‬عدد به ‪m‬‬
‫عدد اعشار گرد می شود و در صورتیكه از ‪ m‬كمتر باشد‪ ،‬در سمت‬
‫راست آن ‪ 0‬قرار داده می شود‪.‬‬

‫‪ 7-6-2‬تابع خواندن از ورودی‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای خواندن اطالعات از ورودی از تابع ‪ scanf‬استفاده می شود‪.‬‬
‫این تابع اطالعات را ازورودی استاندارد )معموال صفحه كلید( خوانده و در‬
‫متغیرهای تعیین شده قرار می دهد‪.‬‬
‫شكل كلی این تابع بصورت زیر است‪:‬‬
‫; )>لیست آدرسهای متغیرها< ‪> ,‬رشته كنترلی<(‪scanf‬‬
‫همانطور كه می بینید نحوه احضار تابع ‪ scanf‬نیز مشابه ‪ printf‬است‪ .‬تنها‬
‫تفاوت در آن است كه در ‪ scanf‬باید لیست آدرسهای متغیرها ارسال شود‪.‬‬
‫مبحث مربوط به آدرسها در فصول بعدی بررسی خواهد شد ولی در حال حاضر‬
‫بخاطر بسپارید كه برای بدست آوردن آدرس یك متغیر از عالمت & استفاده می‬
‫كنیم‪ .‬بعنوان مثال ‪ &age‬بمعنای آدرس متغیر ‪ age‬است‪.‬‬
‫بطور كلی در ‪ C‬قدیمی هرگاه كه یك تابع دارای پارامترهای خروجی بود )یعنی‬
‫پارامترهایی كه یك مقدار را باز می گرداندند( از آدرس متغیرها استفاده می‬
‫شد كه امروزه این مسئله وجود ندارد‪.‬‬

‫ تابع خواندن از ورودی‬7-6-2
#include
void main() {
int age;
float average ;
printf("Please enter your age and average : ");
scanf("%d %f",&age,&average);
printf("You are %d years old and your average is %5.2f \n",age,average);
}

Please enter your age and average : 19 16.72
You are 19 years old and your average is 16.72

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫زبان ‪ C++‬یک زبان شی گرا است‪ ،‬بهمین دلیل در این زبان برای ورودی‬
‫و خروجی از اشیاء بجای توابع استفاده می گردد‪.‬‬
‫از آنجا که امروزه معموال برنامه نویسان ‪ C‬از کامپایلرهای ‪ C++‬استفاده‬
‫می کنند‪ ،‬می توانند از اشیای ورودی و خروجی آن نیز استفاده کنند‪.‬‬
‫اینکار در بین بسیاری از برنامه نویسان ‪ C‬متداول است‪ ،‬بهمین دلیل ما‬
‫در اینجا نحوه کار با اشیای خواندن و نوشتن در ‪ C++‬را بطور مقدماتی‬
‫توضیح می دهیم؛ گرچه توضیح کامل این موارد نیاز به آشنایی با شی‬
‫گرایی و زبان ‪ C++‬دارد‪.‬‬
‫قبل از هرچیز الزم به ذکر است که کلیه اشیای مربوط به ورودی و‬
‫خروجی در فایل سرآمدی بنام ‪ iostream.h‬تعیریف شده اند‪ ،‬بنابراین‬
‫ابتدا باید این فایل به برنامه توسط دستور ‪ #include‬الحاق گردد‪.‬‬

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫زبان ‪ C++‬برای نمایش اطالعات از یک شیئ بنام ‪ cout‬استفاده می نماید‪.‬‬
‫برای ارسال اطالعات مورد نظر برای چاپ به ‪ cout‬باید از عملگر درج در جریان‬
‫یا >> استفاده نماییم‪ .‬بعنوان مثال ‪:‬‬
‫; ” ‪cout >> “Please enter your name:‬‬
‫و یا مثال دیگر ‪:‬‬
‫;‪int a = 10‬‬
‫;‪float b = 2.86‬‬
‫;‪cout << a‬‬
‫;‪cout << b‬‬
‫نکته جالبی که در این مثالها دیده می شود‪ ،‬آنستکه برخالف تابع ‪ printf‬هیچ‬
‫نیازی به مشخص کردن نوع متغیری که قصد چاپ آن را داریم نیست و خود‬
‫شئ ‪ cout‬نوع آن را تشخیص می دهد‪.‬‬
‫عالوه براین می توان چندین عملگر درج در جریان را با یکدیگر الحاق کرد و‬
‫چندین متغیر را با یک دستور چاپ کرد‪.‬‬

C++ ‫ ورودی و خروجی اطالعات در‬7-6-3
#include
void main() {
int age = 20;
floate average = 18.23;
cout >> “You are ” >> age >> “ years old and your average is ” >> average ;
}

You are 20 years old and your average is 18.230000

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای دریافت اطالعات از کاربر‪ ،‬از شئ دیگری بنام ‪ cin‬استفاده می شود‪.‬‬
‫برای ارسال متغیر مورد نظر به ‪ cin‬باید از عملگر استخراج از جریان یا <<‬
‫استفاده نماییم‪ .‬بعنوان مثال‪:‬‬
‫;‪int a‬‬
‫;‪cin >> a‬‬
‫بازهم همانطور که می بینید نیازی به تعیین نوع متغیر موردنظر نیست و خود‬
‫شئ ‪ cin‬نوع متغیر را بطور اتوماتیک تشخیص داده و داده ای از همان نوع را از‬
‫کاربر دریافت و در متغیر مورد نظر قرار می دهد‪.‬‬
‫عملگرهای استخراج از جریان را نیز می توان با یکدیگر الحاق کرد‪.‬‬
‫برای رفتن به خط بعد در شئ ‪ cout‬می توان از دستکاری کننده ‪ endl‬استفاده‬
‫کرد‪ .‬مثال در دستور زیر پس از چاپ پیغام‪ ،‬مکان نما به خط بعد منتقل می‬
‫شود‪:‬‬
‫;‪cout >> “List of students : “ >> endl‬‬
‫البته دستکاری کننده های متعدد دیگری نیز ازجمله موارد مربوط به تعیین طول‬
‫میدان و نحوه چاپ مقادیر وجود دارد که توضیح آنها نیاز به یک مبحث مستقل‬
‫دارد‪.‬‬

C++ ‫ ورودی و خروجی اطالعات در‬7-6-3
#include
void main() {
int age;
float average ;
cout << "Please enter your age and average : " ;
cin >> age >> average ;
cout << "You are " << age << "years old and your average is " << average;
}

Please enter your age and average : 19 16.72
You are 19 years old and your average is 16.72

‫‪ 7-7‬توابع کتابخانه ای‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫همانطور که قبال نیز گفته شد‪ ،‬زبان ‪ C‬از زیر برنامه ها نیز حمایت می کند‪ .‬هر زیر برنامه‬
‫در ‪ C‬یک تابع نامیده می شود‪ .‬تا کنون با توابعی همچون ‪ main‬و یا ‪ printf‬و ‪ scanf‬آشنا‬
‫شده ایم‪.‬‬
‫معموال عرضه کنندگان کامپایلرها و یا سایر فروشندگان نرم افزار‪ ،‬برخی از توابع عمومی‬
‫را که ممکن است مورد نیاز جمع کثیری از برنامه نویسان مختلف باشد را در قالب‬
‫کتابخانه ای از توابع در اختیار برنامه نویسان می گذارند‪ .‬بعضی از این توابع کتابخانه ای‬
‫مانند ‪ printf‬و ‪ scanf‬بصورت استاندارد درآمده و توسط عرضه کنندگان مختلف ارائه می‬
‫شوند‪.‬‬
‫در کامپایلر عرضه شده توسط شرکت بورلند )‪ (Borland C++ 3.1‬نیز کتابخانه های‬
‫متعددی از توابع برای شما عرضه شده اند که بتدریج با آنها و کاربردشان آشنا خواهید‬
‫شد‪.‬‬
‫نکته مهم آنستکه برای استفاده از این توابع ابتدا باید فایل سرآمد مربوط به آنها را نیز در‬
‫ابتدای برنامه خود اضافه نمایید ) با استفاده از ‪ .(#include‬هر فایل سرآمد شامل تعاریف‬
‫اولیه گروهی از توابع مرتبط با هم و داده های مربوط به آنها بوده و در استاندارد قدیمی‬
‫تر دارای پسوند ‪ .h‬می باشد)در استاندارد جدید پسوند این فایلها حذف شده است(‪.‬‬
‫برخی از این فایلهای سرآمد عبارتند از‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪ : stdio.h‬توابع ورودی و خروجی استاندارد‬
‫‪ : math.h‬توابع ریاضی‬
‫‪ : graphics.h‬توابع مربوط به عملیات گرافیکی‬
‫‪ : string.h‬توابع مربوط به کار با رشته ها‬


Slide 30

‫مبانی کامپیوتر و برنامه سازی‬
‫فصل هفتم ‪ :‬مفاهیم اولیه زبان ‪C‬‬
‫مدرس ‪ :‬نگین معروفی‬

‫‪ 7-1‬شناسه ها در ‪C‬‬
‫‪‬‬
‫‪‬‬

‫شناسه )‪ (identifier‬نامی است که به یک قسمت از برنامه مانند متغیر‪ ،‬تابع‪ ،‬ثابت و یا‬
‫‪ ...‬داده می شود‪.‬‬
‫در زبان ‪ C‬برای انتخاب شناسه ها فقط می توان از عالئم زیر استفاده کرد‪:‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫حروف انگلیسی کوچک و بزرگ )‪(A…Z a…z‬‬
‫ارقام )‪(0…9‬‬
‫عالمت خط پایین یا _‬

‫البته یک شناسه نمی تواند با یک رقم شروع شود‪.‬‬
‫چند شناسه مجاز‪ name2 ، average ، sum :‬و ‪student_average‬‬
‫چند شناسه غیرمجاز ‪ 2name‬و یا ‪student average‬‬
‫در برنامه نویسی امروزی پیشنهاد می شود بجای شناسه هایی همانند‬
‫‪ student_average‬از ‪ studentAverage‬استفاده گردد‪.‬‬
‫نکته مهم دیگری که باید به آن اشاره کرد آنستکه زبان ‪ C‬برخالف بسیاری از زبانهای دیگر‬
‫به کوچک و بزرگی حروف حساس است )‪ .(case sensitive‬در نتیجه شناسه های زیر با‬
‫یکدیگر متفاوتند ‪:‬‬
‫‪Sum ≠ sum ≠ SUM‬‬
‫آخرین نکته اینستکه در هنگام انتخاب شناسه نمی توانید از کلمات کلیدی که برای‬
‫منظورهای خاص در زبان ‪ C‬رزرو شده اند استفاده کنید‪.‬‬

C ‫ شناسه ها در‬7-1
: C ‫کلمات کلیدی در زبان‬
auto

break

case

char

const

continue

default

do

double

else

enum

extern

float

for

goto

if

int

long

register

return

short

signed

sizeof

static

struct

switch

typedef

union

unsigned

void

volatile

while

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫محدوده‬

‫اندازه )بیت(‬

‫توضیح‬

‫نوع داده‬

‫‪-128 to +127‬‬

‫‪8‬‬

‫کاراکتر‬

‫‪char‬‬

‫‪-32768 to +32767‬‬

‫‪16‬‬

‫عدد صحیح‬

‫‪int‬‬

‫‪3.4e-38 to 3.4e+38‬‬

‫‪32‬‬

‫عدد اعشاری‬

‫‪float‬‬

‫‪1.7e-308 to 1.7e+308‬‬

‫‪64‬‬

‫عدد اعشاری با‬
‫دقت مضاعف‬

‫‪double‬‬

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫‪‬‬

‫البته چند نکته مهم درمورد این جدول قابل ذکر است ‪:‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫اندازه ‪ int‬در محیطهای ‪ 16‬بیتی مانند ‪ DOS‬برابر ‪ 16‬بیت است‪ .‬اما در‬
‫محیطهای ‪ 32‬بیتی همانند ‪ Windows‬اندازه آن ‪ 32‬بیت می باشد که در‬
‫اینصورت محدوده ای برابر ‪ -2,147,483,648‬تا ‪ +2,147,483,647‬را‬
‫پوشش می دهد‪.‬‬
‫در بعضی از کامپایلرهای ‪ ،C‬نوع داده ‪ bool‬نیز وجود دارد که می تواند‬
‫یکی از مقادیر ‪)true‬درست( یا ‪) false‬غلط( را نشان دهد ‪ .‬اما در نسخه‬
‫های اولیه ‪ C‬از همان نوع داده صحیح یا ‪ int‬برای اینکار استفاده می‬
‫شد‪ .‬بدین صورت که ‪ 0‬نشاندهنده ‪ false‬و هر عدد غیر صفر )معموال ‪(1‬‬
‫نشاندهنده ‪ true‬است‪.‬‬
‫از آنجا که برای ذخیره سازی کاراکترها کد اسکی آنها ذخیره می گردد‪،‬‬
‫از یک متغیر کاراکتری یا ‪ char‬می توان بعنوان یک عدد صحیح کوچک نیز‬
‫استفاده کرد و اعمال ریاضی برروی آنها نیز مجاز است‪.‬‬

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫عالوه براین چندین اصالح کننده نیز وجود دارد که به ما اجازه می دهد نوع داده مورد‬
‫نظر را با دقت بیشتری برای نیازهای مختلف استفاده نماییم‪.‬‬
‫این اصالح کننده ها عبارتند از ‪short, long, signed, unsigned :‬‬
‫تمام این اصالح کننده ها می توانند به نوع داده ‪ int‬اعمال شوند و اثر آنها بستگی‬
‫به محیط دارد‪.‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫در یک محیط ‪16‬بیتی‪short int ،‬بازهم برابر ‪16‬بیت است ولی ‪ long int‬برابر‪32‬بیت می‬
‫باشد‪.‬‬
‫‪ unsigned int‬باعث می شود که یک عدد ‪ 16‬بیتی بدون عالمت داشته باشیم که بازه‬
‫بین ‪ 0‬تا ‪ 65535‬را پوشش می دهد‪ signed int .‬نیز همانند ‪ int‬معمولی بوده و تفاوتی‬
‫ندارد‪.‬‬
‫ترکیب این اصالح کننده ها نیز ممکن است‪ .‬مثال ‪ unsigned long int‬یک عدد ‪ 32‬بیتی‬
‫بدون عالمت است که بازه ‪ 0‬تا ‪ 4,294,967,295‬را پوشش می دهد‪.‬‬

‫برروی نوع داده ‪ char‬فقط اصالح کننده های ‪ signed‬و ‪ unsigned‬را می توان اعمال‬
‫کرد‪ .‬معموال از اصالح کننده ‪ unsigned‬وقتی استفاده می شود که قصد داشته‬
‫باشیم از ‪ char‬بعنوان یک عدد صحیح مثبت بین ‪ 0‬تا ‪ 255‬استفاده کنیم‪.‬‬
‫برروی نوع داده ‪ double‬تنها اصالح کننده ‪ long‬قابل اعمال است و دراینصورت عدد‬
‫اعشاری با ‪ 80‬بیت را خواهیم داشت که قادر است هر عددی در بازه ‪ 3.4e-4932‬تا‬
‫‪ 1.1e+4932‬را در خود نگاه دارد‪.‬‬

‫‪ 7-3‬تعریف متغیرها‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای تعریف متغیرها به شکل زیر عمل می کنیم‪:‬‬

‫;>‪ ‫که ‪ type‬یکی از نوع داده های گفته شده و ‪ variable-list‬لیستی از متغیرها است‬
‫که با کاما از یکدیگر جدا شده اند‪ .‬بعنوان مثال ‪:‬‬
‫;‪int sum‬‬
‫;‪float average‬‬
‫; ‪long int a, b, c‬‬
‫; ‪unsigned long int i, j, k‬‬
‫عالوه براین می توان در هنگام تعریف متغیر به آن مقدار اولیه نیز داد‪ .‬مثال ‪:‬‬
‫; ‪int d = 0‬‬
‫نكته مهم آنكه زبان ‪ C‬به متغیرها مقدار اولیه نمي دهد )حتي ‪ (0‬و برنامه نويس‬
‫خود بايد اينكار را صريحا انجام دهد‪ ،‬درغیر اينصورت مقدار اولیه متغیر‪ ،‬نامعین خواهد‬
‫بود‪.‬‬
‫تعریف متغیرها طبق اصول زبان ‪ C‬میتواند درهرجایی از برنامه صورت پذیرد‪ ،‬و‬
‫متغیرهای تعریف شده از همان خط به بعد قابل استفاده خواهد بود‪ .‬اما معموال‬
‫توصیه می گردد كه تعریف متغیرها در همان خط ابتدایی تابع و بالفاصله پس از {‬
‫صورت پذیرد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫‪‬‬
‫‪‬‬

‫ثابتها مقادیر ثابتی هستند كه مقدار آنها در حین اجرای برنامه تغییر نمی یابد‪ .‬ثابتها می توانند از‬
‫هریك از نوع داده های اصلی باشند‪.‬‬
‫ثوابت عددی صحیح ‪:‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫برای نمایش این دسته از ثوابت‪ ،‬از دنباله ای از ارقام بعالوه عالمت ‪ +‬یا ‪ -‬استفاده می كنیم‪ .‬بعنوان مثال‬
‫‪ -45‬و یا ‪ 3489‬ثوابت صحیح هستند‪.‬‬
‫در حالت عادی ‪ C‬هر عدد را در كوچكترین نوع داده ای كه می تواند قرار می دهد‪ .‬مثال عدد ‪ 85‬در یك‬
‫‪ int‬قرار می گیرد‪ ،‬اما عدد ‪ 145398‬در یك ‪ long int‬قرار خواهد گرفت‪.‬‬
‫اگر قصد دارید یك عدد كوچك بعنوان ‪ long‬محسوب گردد‪ ،‬می توانید از پسوند ‪ L‬در انتهای آن استفاده‬
‫می كنیم‪ .‬مثال ‪245L‬یك عدد ‪ long‬محسوب می شود‪.‬‬
‫;‪long int a = 20L‬‬
‫پسوند ‪ U‬در انتهای عدد نیز نشانه بدون عالمت بودن آن است‪.‬‬
‫نكته دیگر آنكه ‪ C‬به شما اجازه می دهد درصورت لزوم ثوابت صحیح خود را در مبنای ‪ 8‬یا ‪ 16‬نیز كه‬
‫از مبناهای متداول در برنامه نویسی هستند‪ ،‬بنویسید‪.‬‬
‫‪‬‬
‫‪‬‬

‫برای نوشتن عدد در مبنای ‪ 8‬باید آن را با ‪ 0‬آغاز كنید‪ ،‬مثال ‪ 0342‬یك عدد در منای ‪ 8‬محسوب می‬
‫گردد‪.‬‬
‫برای نوشتن یك عدد در مبنای ‪ 16‬باید آن را با ‪ 0x‬آغاز نمایید‪ ،‬مانند ‪.0x27A4‬‬

‫‪ 7-4‬ثوابت‬
‫ثوابت عددی اعشاری‬

‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫برای نمایش اعداد اعشاری‪ ،‬باید از نقطه اعشار استفاده كنیم‪ ،‬مانند ‪237.45‬‬
‫اما نكته جالب آنستكه می توانید از نماد علمی نیز برای نمایش اعداد‬
‫اعشاری استفاده كنید‪ .‬برای اینكار كافی است از حرف ‪ e‬برای نمایش قسمت‬
‫توان استفاده نمایید‪ .‬بعنوان مثال ‪:‬‬
‫‪-23.47 × 10 5 = -23.47e5‬‬
‫‪42.389 × 10 -3 = 42.389e-3‬‬
‫دقت كنید كه قسمت توان‪ ،‬حتما یك عدد صحیح است‪.‬‬
‫نكته جالب اینجاست كه برخالف مورد قبل‪ ،‬كامپایلر بطور پیش فرض داده های‬
‫اعشاری را از نوع ‪ double‬فرض می كند‪.‬چنانچه دوست دارید ثابت شما ازنوع‬
‫‪ float‬درنظر گرفته شود‪ ،‬در انتهای آن ‪ F‬قرار دهید‪ .‬ضمنا پسوند ‪ L‬نیز داده‬
‫اعشاری را از نوع ‪ long double‬درنظر می گیرد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫ثوابت كاراكتری ‪:‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫برای نشان دادن ثوابت كاراكتری‪ ،‬آنها را در داخل ' قرار می دهیم‪ .‬بعنوان مثال‬
‫'‪'A‬یك ثابت كاراكتری است‪.‬‬
‫; '‪char ch = 'S‬‬
‫دقت كنید كه همانطور كه قبال گفته شد‪ ،‬كد اسكی كاراكترها در متغیر ذخیره‬
‫می گردد‪ ،‬بنابراین می توان از آن بعنوان یك عدد صحیح نیز استفاده كرد‪ .‬نكته‬
‫مهم دیگر آنستكه به تفاوت عدد ‪ 5‬و كاراكتر '‪ '5‬دقت داشته باشید‪ .‬در حقیقت‬
‫'‪ '5‬برابر است با عدد ‪ 53‬كه همان كد اسكی آن است‪.‬‬
‫روش فوق‪ ،‬برای نمایش کاراکترهای قابل چاپ مناسب است‪ ،‬اما بعضی‬
‫كاراكترها مانند ‪ enter‬قابل نمایش نبوده و برای آنها شکل خاصی وجود ندارد‪.‬‬
‫در چنین مواردی‪ ،‬زبان ‪ C‬از ترکیب عالمت \ به همراه یک کاراکتر دیگر‪ ،‬برای‬
‫نمایش این قبیل کاراکترها استفاده می نماید‪ .‬بعنوان مثال‪ ،‬کاراکتر '‪ '\n‬نشان‬
‫دهنده خط جدید یا همان ‪ enter‬می باشد‪.‬‬
‫جدول صفحه بعد این قبیل کاراکترها و معادل آنها را نشان می دهد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫نحوه نمایش در ‪C‬‬

‫کد اسکی‬

‫صدای بوق کامپیوتر‬

‫‪\a‬‬

‫‪7‬‬

‫حرکت به عقب ‪backspace‬‬

‫‪\b‬‬

‫‪8‬‬

‫شروع صفحه ‪form feed‬‬

‫‪\f‬‬

‫‪12‬‬

‫سطر جدید ‪line feed‬‬

‫‪\n‬‬

‫‪10‬‬

‫برگشت به ابتداي سطر ‪carriage return‬‬

‫‪\r‬‬

‫‪13‬‬

‫فاصله افقی ‪horizontal tab‬‬

‫‪\t‬‬

‫‪9‬‬

‫فاصله عمودی ‪vertical tab‬‬

‫‪\v‬‬

‫‪11‬‬

‫عالمت سوال‬

‫?\‬

‫‪63‬‬

‫عالمت '‬

‫'\‬

‫‪39‬‬

‫عالمت "‬

‫"\‬

‫‪34‬‬

‫عالمت \‬

‫\\‬

‫‪92‬‬

‫عالمت تهی‬

‫‪\0‬‬

‫‪0‬‬

‫نام کاراکتر‬

‫کد اسکی یک کاراکتر با ‪ 3‬رقم در مبنای ‪8‬‬

‫‪\000‬‬

‫کد اسکی یک کاراکتر با ‪ 2‬رقم در مبنای ‪16‬‬

‫‪\x00‬‬

‫‪ 7-4‬ثوابت‬
‫‪‬‬

‫ثوابت رشته ای ‪ C :‬عالوه بر ثوابت فوق‪ ،‬از یك ثابت دیگر بنام رشته نیز‬
‫حمایت می كند‪ .‬رشته‪ ،‬دنباله ای از كاراكترها است كه در داخل " قرار‬
‫می گیرند‪ .‬بعنوان مثال "‪ "this is a test‬یك رشته است‪ .‬دقت كنید كه '‪'a‬‬
‫یك كاراكتر است‪ ،‬اما "‪ "a‬یك رشته است كه فقط شامل یك كاراكتر می‬
‫باشد‪.‬‬

‫‪ 7-5‬عملگرها‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫عملگر‪ ،‬نمادی است كه به كامپایلر می گوید تا عملیات محاسباتی یا‬
‫منطقی خاصی را برروی یك یا چند عملوند‪ ،‬انجام دهد‪.‬‬
‫به عملگرهایی كه فقط یك عملوند دارند‪ ،‬عملگر یكانی می گوییم و‬
‫همواره عملگر در سمت چپ عملوند قرار می گیرد)مانند عدد ‪.(-125‬‬
‫اما عملگرهایی كه برروی دو عملوند اثر می كنند را عملگر دودویی‬
‫نامیده و عملگر را بین دو عملوند قرار می دهیم )مانند ‪.(23+86‬‬
‫هر ترکیب درستی از عملگرها و عملوندها را یک عبارت می نامیم‪.‬‬
‫‪ C‬از نقطه نظر عملگرها یك زبان بسیار قوی است‪ .‬این عملگرها به چند‬
‫دسته اصلی تقسیم می گردند كه آنها را به ترتیب بررسی می كنیم‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫این عملگرها‪ ،‬همان اعمال متداول ریاضی هستند كه در زبان ‪ C‬مورد استفاده‬
‫قرار می گیرند‪ .‬این اعمال عبارتند از ‪:‬‬

‫عمل‬

‫نوع‬

‫عملگر‬

‫منفی كردن عملوند سمت راست‬

‫یكانی‬

‫‪-‬‬

‫جمع دو عملوند‬

‫دودویی‬

‫‪+‬‬

‫تفریق دو عملوند‬

‫دودویی‬

‫‪-‬‬

‫ضرب دو عملوند‬

‫دودویی‬

‫*‬

‫تقسیم دو عملوند‬

‫دودویی‬

‫‪/‬‬

‫محاسبه باقیمانده تقسیم دو عملوند‬

‫دودویی‬

‫‪%‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬
‫‪‬‬

‫این عملگرهای برروی همه انواع داده های ‪ C‬عمل می كنند‪ ،‬بجز عملگر ‪ %‬كه فقط‬
‫برروی نوع داده های صحیح عمل می كند‪.‬‬
‫اما نكته مهمی كه باید به آن اشاره كرد‪ ،‬نحوه كار عملگر تقسیم برروی نوع داده های‬
‫مختلف است‪.‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫درصورتیكه هردو عملوند صحیح باشند‪ ،‬تقسیم بصورت صحیح بر صحیح انجام خواهد شد‪.‬‬
‫اگر یكی یا هر دو عملوند اعشاری باشند‪ ،‬تقسیم بصورت اعشاری انجام خواهد پذیرفت‪.‬‬
‫فرض كنید تعاریف زیر را داریم ‪:‬‬
‫; ‪int a,b‬‬
‫; ‪float c,d‬‬
‫; ‪a = 10 ; b = 4‬‬
‫;‪c = 8.2; d = 4.0‬‬
‫اكنون به نتایج عملیات زیر دقت كنید ‪:‬‬
‫‪a / b => 2‬‬
‫‪c / d => 2.05‬‬
‫‪a / d => 2.5‬‬
‫‪a / 4 => 2‬‬
‫چنانچه به آخرین مورد توجه كنید‪ ،‬متوجه می شوید كه از آنجا كه ‪a‬یك متغیر صحیح است و ‪4‬‬
‫نیز یك ثابت صحیح در نظر گرفته شده‪ ،‬درنتیجه تقسیم بصورت صحیح بر صحیح انجام گرفته‬
‫است‪ .‬چنانچه بخواهیم تقسیم بصورت اعشاری صورت پذیرد‪ ،‬به دو شكل می توانیم عمل‬
‫كنیم‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫برای اینکه عبارت تقسیم صفحه قبل بصورت اعشاری انجام شود‪ ،‬به دو روش‬
‫می توان عمل کرد‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫این عبارت را بصورت ‪ a / 4.0‬بنویسیم‪.‬‬
‫از عملگر قالب ریزی استفاده كنیم‪.‬‬

‫عملگر قالب ریزی می تواند یك نوع را به نوع دیگری تبدیل نماید‪ .‬شكل كلی آن‬
‫به شكل زیر است ‪:‬‬
‫>‪() ‫كه ‪ type‬نوع مورد نظر است كه قصد تبدیل عبارت ‪ expression‬به آن نوع را‬
‫داریم‪ .‬بعنوان مثال در مورد قبلی می توان به شكل زیر عمل كرد ‪:‬‬
‫‪(float) a / 4‬‬
‫در این حالت از كامپایلر خواسته ایم كه ابتدا عدد ‪ a‬را به اعشاری تبدیل كند‬
‫)البته بصورت موقت( و سپس آن را بر ‪ 4‬تقسیم نماید‪ ،‬كه مسلما حاصل‬
‫اعشاری خواهد بود‪.‬‬
‫بطوركلی هرگاه ثابتها و متغیرهایی از انواع مختلف در یك عبارت محاسباتی‬
‫داشته باشیم‪ ،‬كامپایلر ‪ C‬همه آنها را به یك نوع یكسان كه همان بزرگترین‬
‫عملوند موجود است تبدیل خواهد كرد‪ .‬بعنوان مثال به مورد صفحه بعد دقت‬
‫كنید ‪:‬‬

‫ عملگرهای محاسباتی‬7-5-1
char ch;
int i;

float f;
double d;
result = (ch / i)
int

+

(f *d)

(f+i)
float

double

double

int

-

double

double

float

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫اولویت عملگرها ‪ :‬در عبارتی که شامل چندین عملگر است‪ ،‬کدامیک در‬
‫ابتدا اعمال خواهد گردید‪.‬‬
‫اولویت عملگرهای محاسباتی از باال به پایین بشرح زیر است‪:‬‬
‫‪ ‬عملگر یکانی –‬
‫‪ ‬عملگرهای * و ‪ /‬و ‪%‬‬
‫‪ ‬عملگرهای ‪ +‬و –‬
‫چنانچه اولویت دو عملگر یکسان باشد‪ ،‬این عملگرها از چپ به راست‬
‫محاسبه خواهند شد‪.‬‬
‫چنانچه بخواهیم یک عمل با اولویت پایین زودتر انجام شود‪ ،‬باید از پرانتز‬
‫استفاده کنیم‪ .‬بنابراین اولویت عملگر پرانتز از همه موارد فوق‬
‫بیشتراست‪ .‬در مورد پرانتزهای متداخل‪ ،‬ابتدا پرانتز داخلی محاسبه‬
‫می شود؛ اما در مورد پرانتزهای هم سطح‪ ،‬ابتدا پرانتز سمت چپتر‬
‫محاسبه می گردد‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫چند مثال در مورد اولویت عملگرها‬

‫ترتیب اجرای عملگرها‬

‫عبارت زبان ‪C‬‬

‫ابتدا عمل * و سپس عمل ‪+‬‬

‫‪b+c*d‬‬

‫ابتدا عمل ‪ +‬و سپس عمل *‬

‫‪(b + c) * d‬‬

‫ابتدا عمل ‪ /‬سپس عمل * و در انتها عمل ‪+‬‬

‫‪b+c/d*e‬‬

‫ابتدا عمل * سپس عمل ‪ /‬و در انتها عمل ‪+‬‬

‫)‪b + c / (d * e‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫یک مثال کامل در مورد اولویت عملگرها‬

‫‪result = a + b * (f – (g + b) / d) – c * (a – d) / e‬‬
‫‪6‬‬

‫‪1‬‬
‫‪7‬‬

‫‪2‬‬

‫‪8‬‬

‫‪3‬‬
‫‪4‬‬
‫‪5‬‬
‫‪9‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫در زبان ‪ C‬برای انتساب چندین عملگر وجود دارد‪ .‬ساده ترین عملگر انتساب‪ ،‬همان عملگر =‬
‫است که در بسیاری از زبانها استفاده می شود‪ .‬بعنوان مثال ‪:‬‬
‫;‪a = 5‬‬
‫;‪b = c + 2 * d‬‬
‫این عملگر باعث می شود که عبارت سمت راست در عبارت سمت چپ قرار گیرد‪.‬‬
‫توجه کنید که مقدار سمت چپ باید عبارتی باشد که بتوان به آن یک مقدار را نسبت داد‬
‫)مانند یک متغیر( که به آن ‪ Lvalue‬گفته می شود‪ ،‬بنابراین یک ثابت نمی تواند در سمت چپ‬
‫قرار گیرد‪.‬‬
‫نکته دیگر اینکه اولویت عملگر = از عملگرهای ریاضی کمتر است و درنتیجه ابتدا آن عملیات‬
‫انجام شده و در پایان حاصل در عبارت سمت چپ ریخته می شود‪.‬‬
‫الزم به ذکر است که در هنگام انتساب‪ ،‬درصورت لزوم نوع عبارت سمت راست به نوع عبارت‬
‫سمت چپ تبدیل می شود‪ .‬مثال‪:‬‬
‫;‪int a‬‬
‫;‪a = 2.5 * 5.0‬‬
‫که دراینصورت عدد ‪ 12‬در ‪ a‬ذخیره خواهد شد‪.‬‬
‫شرکت پذیری این عملگر از راست به چپ می باشد‪ ،‬بدین معنا که چنانچه چندین عملگر‬
‫نسبت دهی داشته باشیم‪ ،‬این عملگرها از راست به چپ محاسبه می شوند‪ .‬مثال پس از‬
‫اجرای دستور زیر‪ ،‬مقدار هر ‪ 3‬متغیر برابر ‪ 10‬خواهد شد‪.‬‬
‫;‪a = b = c = 10‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬

‫نکته جالب درمورد زبان ‪ C‬آنستکه دارای یک سری عملگرهای انتساب‬
‫خالصه شده است که باعث می شوند در بعضی موارد بتوانیم عبارات‬
‫کوتاهتری را بنویسیم‪ .‬این عملگرها عبارتند از ‪:‬‬
‫عملگرد‬

‫مثال‬

‫عبارت انتساب معادل‬

‫‪++‬‬

‫;‪a ++‬‬

‫;‪a = a + 1‬‬

‫‪--‬‬

‫;‪a --‬‬

‫;‪a = a – 1‬‬

‫=‪+‬‬

‫;‪a += 5‬‬

‫;‪a = a + 5‬‬

‫=‪-‬‬

‫;‪a -= 8‬‬

‫;‪a= a – 8‬‬

‫=*‬

‫;‪a *= 10‬‬

‫;‪a= a * 10‬‬

‫=‪/‬‬

‫;‪a /= 2‬‬

‫;‪a = a / 2‬‬

‫=‪%‬‬

‫;‪a %= 10‬‬

‫;‪a = a % 10‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬
‫‪‬‬

‫عملگر اول و دوم‪ ،‬عملگرهای یکانی هستند که بترتیب عملگر افزایش و عملگر کاهش‬
‫نامیده می شوند‪.‬‬
‫نکته جالب آنستکه این دو عملگر به دوصورت مورد استفاده قرار می گیرند‪.‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫در حالتی که از دستور ;‪ a ++‬استفاده شود به آن پس افزایش می گویند و بدین معناست که‬
‫ابتدا از مقدار فعلی ‪ a‬در عبارت موردنظر استفاده کن و سپس آن را افزایش بده‪.‬‬
‫اما دستور ;‪ ++ a‬که به آن پیش افزایش گفته می شود‪ ،‬ابتدا ‪ a‬را افزایش داده و سپس از آن‬
‫در عبارت استفاده می کند‪.‬‬
‫به برنامه زیر دقت کنید‪:‬‬

‫>‪#include ‫{ )(‪void main‬‬
‫; ‪int a ,b‬‬
‫;‪a=5‬‬
‫;‪b = a ++‬‬
‫;)‪printf(“a=%d and b=%d \n”,a,b‬‬
‫;‪a=5‬‬
‫;‪b = ++ a‬‬
‫;)‪printf(“a=%d and b=%d \n”,a,b‬‬
‫}‬
‫‪a=6 b=5‬‬
‫‪a=6 b=6‬‬

‫‪ 7-5-3‬عملگرهای مقایسه ای‬
‫‪‬‬

‫‪‬‬

‫این عملگرها دو عبارت را بایکدیگر مقایسه کرده و نتیجه را باز می گردانند‪.‬‬
‫نتیجه می تواند درست )‪ (true‬یا غلط )‪ (false‬باشد‪.‬‬
‫نتیجه این عملگرها یک عدد صحیح است که درصورت درست بودن ‪ 1‬و‬
‫درصورت غلط بودن ‪ 0‬باز می گردانند‪ .‬این عملگرها عبارتند از‪:‬‬
‫عملگر‬

‫مفهوم عملگر‬

‫مثال‬

‫<‬

‫بزرگتر )<(‬

‫‪a>b‬‬

‫>‬

‫کوچکتر )>(‬

‫‪a
‫=<‬

‫بزرگتر یا مساوی )≤(‬

‫‪a >= b‬‬

‫=>‬

‫کوچکتر یا مساوی )≥(‬

‫‪a <= b‬‬

‫==‬

‫مساوی )=(‬

‫‪a == b‬‬

‫=!‬

‫نامساوی )≠(‬

‫‪a != b‬‬

‫‪ 7-5-3‬عملگرهای مقایسه ای‬
‫‪‬‬

‫‪‬‬

‫نکته مهمی که باید به آن دقت کرد عملگر مساوی )==( است‪ ،‬چرا که یک‬
‫اشتباه بسیار متداول برنامه نویسان ‪ C‬استفاده اشتباه از عملگر انتساب‬
‫)=( بجای عملگر تساوی )==( است که باعث ایجاد خطا در برنامه می‬
‫شود‪.‬‬
‫اولویت این عملگرها از باال به پایین بشرح زیر است‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫عملگرهای <‪ <= ، > ،‬و =>‬
‫عملگرهای == و =!‬

‫الزم بذکر است که در هنگام مساوی بودن اولویت چند عملگر‪ ،‬این عملگرها‬
‫از چپ به راست محاسبه می گردند‪.‬‬

‫‪ 7-5-4‬عملگرهای منطقی‬
‫‪‬‬

‫این عملگرها به شما اجازه می دهند که شرطهای ساده ای را که با‬
‫استفاده از عملگرهای مقایسه ای ایجاد شده اند را با یکدیگر ترکیب نموده‬
‫و شرطهای پیچیده تری را بسازید‪ .‬این عملگرها عبارتند از ‪:‬‬
‫مثال‬

‫عملگر‬

‫مفهوم عملگر‬

‫نحوه کار‬

‫&&‬

‫‪ AND‬منطقی‬

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

‫‪a>0 && sw==1‬‬

‫||‬

‫‪ OR‬منطقی‬

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

‫‪a<=100 || b!=0‬‬

‫!‬

‫‪ NOT‬منطقی‬

‫اگر عملوند درست باشد‪ ،‬نادرست و‬
‫اگر نادرست باشد‪ ،‬درست برمی‬
‫گرداند‪.‬‬

‫)‪! (a==1 || b<10‬‬

‫‪ 7-5-5‬عملگر شرطی‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫گاهی الزم است که ابتدا یک شرط بررسی شده و سپس برمبنای نتیجه )درست یا نادرست بودن آن( یکی‬
‫از دو عبارت ممکن بازگردانده شود‪ .‬برای اینکار می توان از یک عملگر ‪3‬تایی )با ‪ 3‬عملوند( بنام عملگر‬
‫شرطی استفاده نمود‪.‬‬
‫شکل کلی این عملگر بصورت زیر است‪:‬‬
‫>عبارت‪> :<2‬عبارت‪> ?<1‬شرط<‬
‫نحوه کار بدینصورت است که درصورت درست بودن شرط‪ ،‬عبارت‪ 1‬و در غیراینصورت عبارت ‪ 2‬بازگردانده می‬
‫شود‪.‬‬
‫به عنوان مثال به دستور زیر توجه کنید‪:‬‬
‫که این عبارت معادل دستور زیر است‪:‬‬

‫‪‬‬

‫;‪a = (k<10) ? 100 : 50‬‬
‫;‪if (k<10) a=100‬‬
‫;‪else a=50‬‬

‫البته این عبارت به شکلهای پیچیده نیز می تواند مورد استفاده قرار گیرد‪ .‬مثال ‪:‬‬
‫;‪c += (a>0 && a<10) ? ++a : a/b‬‬
‫که معادل است با ‪:‬‬
‫{ )‪if (a>0 && a<10‬‬
‫;‪a= a + 1‬‬
‫;‪c = c + a‬‬
‫}‬
‫;‪else c = c + a/b‬‬

‫‪ 7-5-6‬اولویت عملگرها‬
‫عملگر‬

‫اولویت‬

‫شرکت پذیری‬

‫‪1‬‬

‫)(‬

‫از چپ به راست‬

‫‪2‬‬

‫‪- + ! -- ++‬‬

‫از راست به چپ‬

‫‪3‬‬

‫‪* / %‬‬

‫از چپ به راست‬

‫‪4‬‬

‫‪+ -‬‬

‫از چپ به راست‬

‫‪5‬‬

‫>> <<‬

‫از چپ به راست‬

‫‪6‬‬

‫>= > <= <‬

‫از چپ به راست‬

‫‪7‬‬

‫=! ==‬

‫از چپ به راست‬

‫‪8‬‬

‫&&‬

‫از چپ به راست‬

‫‪9‬‬

‫||‬

‫از چپ به راست‬

‫‪10‬‬

‫‪?:‬‬

‫از راست به چپ‬

‫‪11‬‬

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

‫از راست به چپ‬

‫‪12‬‬

‫‪,‬‬

‫از چپ به راست‬

‫‪ 7-6‬خواندن و نمایش اطالعات‬
‫‪‬‬

‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫همانطور كه قبال نیز گفته شد‪ ،‬یكی از اهداف زبان ‪ C‬قابل حمل بودن آن‬
‫است‪ .‬بهمین منظور سعی شده است كه از دستوراتی كه ممكن است‬
‫وابسته به ماشین خاصی باشد‪ ،‬اجتناب گردد‪.‬‬
‫بهمین دلیل زبان ‪ C‬برخالف سایر زبانها دارای هیچ دستوری برای‬
‫خواندن از ورودی و یا نوشتن در خروجی نیست‪.‬‬
‫اما در عوض دارای تعدادی تابع )زیربرنامه( استاندارد می باشد كه تقریبا‬
‫تمامی كامپایلرها از آنها حمایت می كنند‪.‬‬
‫این كار به كامپایلر این امكان را می دهد كه بر حسب نوع سخت افزار‬
‫موردنظر‪ ،‬توابع ورودی و خروجی را طراحی نماید‪.‬‬
‫این توابع در یك فایل سرآمد بنام ‪ stdio.h‬تعریف شده اند و بنابراین قبل‬
‫ازاینكه بتوانید از این توابع استفاده نمایید‪ ،‬باید این فایل را نیز با استفاده‬
‫از ‪ #include‬در برنامه خود بگنجانید‪.‬‬

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫برای نمایش اطالعات در خروجی از تابع ‪ printf‬استفاده می شود‪.‬‬
‫این تابع رشته موردنظر شما را به خروجی استاندارد )كه در حالت‬
‫عادی همان صفحه نمایش یا مانیتور است( می فرستد‪ .‬شكل كلی این‬
‫تابع بصورت زیر است‪:‬‬
‫; )>لیست متغیرها< ‪> ,‬رشته كنترلی<(‪printf‬‬
‫رشته كنترلی همان متنی است كه قصد چاپ آن را داریم‪ ،‬با ذكر این‬
‫نكته كه در قسمتهایی كه باید مقدار یك متغیر چاپ شود‪ ،‬از یك‬
‫مشخصه تبدیل استفاده می شود‪ .‬هر مشخصه تبدیل از یك عالمت ‪%‬‬
‫بعالوه یك كاراكتر كه نوع متغیر مورد نظر را نشان می دهد تشكیل می‬
‫گردد‪.‬‬
‫لیست متغیرها نیز همان متغیرهایی هستند كه قصد چاپ آنها را داریم‪.‬‬
‫این متغیرها باید بترتیب قرار گرفته و با كاما )‪ (,‬از یكدیگر جدا شوند‪.‬‬

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫مشخصه تبدیل‬

‫مفهوم‬

‫‪%c‬‬

‫كاراكتر‬

‫‪%d‬‬

‫عدد صحیح در مبنای ‪10‬‬

‫‪%f‬‬

‫عدد اعشاری بدون نماد علمی‬

‫‪%e‬‬

‫عدد اعشاری با نماد علمی‬

‫‪%g‬‬

‫عدد اعشاری با حالت كوتاهتر بین ‪ e‬و ‪f‬‬

‫‪%s‬‬

‫رشته‬

‫‪%ld‬‬

‫عدد صحیح بزرگ‬

‫‪%lf %le %lg‬‬

‫عدد اعشاری بزرگ‬

‫‪%o‬‬

‫عدد صحیح در مبنای ‪8‬‬

‫‪%x‬‬

‫عدد صحیحی در مبنای ‪16‬‬

‫‪%u‬‬

‫عدد صحیح بدون عالمت‬

‫ تابع نمایش در خروجی‬7-6-1
#include
void main() {
int age = 20;
floate average = 18.23;
printf("You are %d years old and your average is %f \n",age,average);
}
You are 20 years old and your average is 18.230000

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫‪‬‬
‫‪‬‬

‫برای کنترل نحوه چاپ اعداد می توانید از مشخصه طول میدان استفاده‬
‫کنید‪.‬‬
‫مشخصه طول میدان برای اعداد به شكل زیر استفاده می شود‪:‬‬
‫‪ ‬برای اعداد صحیح از ‪ %nd‬استفاده می كنیم كه ‪ n‬تعداد ارقام را نشان‬
‫می دهد )مثال ‪ .(%3d‬در اینصورت برای هر متغیر ‪ n‬رقم درنظر گرفته‬
‫می شود‪ .‬اگر اندازه عدد از ‪ n‬كوچكتر باشد‪ ،‬به سمت چپ آن فضای‬
‫خالی اضافه می شود و اگر اندازه عدد بیش از ‪ n‬رقم باشد‪ ،‬طول میدان‬
‫نادیده گرفته شده و عدد بطور كامل چاپ می شود‪.‬‬
‫‪ ‬برای اعداد اعشاری از ‪ %n.mf‬استفاده می كنیم كه ‪ n‬اندازه كل عدد‬
‫)شامل عالمت ممیز( و ‪ m‬تعداد ارقام اعشار است )مثال ‪ .(%5.2f‬در‬
‫صورتیكه تعداد ارقام اعشاری عدد موردنظر از ‪ m‬بیشتر باشد‪ ،‬عدد به ‪m‬‬
‫عدد اعشار گرد می شود و در صورتیكه از ‪ m‬كمتر باشد‪ ،‬در سمت‬
‫راست آن ‪ 0‬قرار داده می شود‪.‬‬

‫‪ 7-6-2‬تابع خواندن از ورودی‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای خواندن اطالعات از ورودی از تابع ‪ scanf‬استفاده می شود‪.‬‬
‫این تابع اطالعات را ازورودی استاندارد )معموال صفحه كلید( خوانده و در‬
‫متغیرهای تعیین شده قرار می دهد‪.‬‬
‫شكل كلی این تابع بصورت زیر است‪:‬‬
‫; )>لیست آدرسهای متغیرها< ‪> ,‬رشته كنترلی<(‪scanf‬‬
‫همانطور كه می بینید نحوه احضار تابع ‪ scanf‬نیز مشابه ‪ printf‬است‪ .‬تنها‬
‫تفاوت در آن است كه در ‪ scanf‬باید لیست آدرسهای متغیرها ارسال شود‪.‬‬
‫مبحث مربوط به آدرسها در فصول بعدی بررسی خواهد شد ولی در حال حاضر‬
‫بخاطر بسپارید كه برای بدست آوردن آدرس یك متغیر از عالمت & استفاده می‬
‫كنیم‪ .‬بعنوان مثال ‪ &age‬بمعنای آدرس متغیر ‪ age‬است‪.‬‬
‫بطور كلی در ‪ C‬قدیمی هرگاه كه یك تابع دارای پارامترهای خروجی بود )یعنی‬
‫پارامترهایی كه یك مقدار را باز می گرداندند( از آدرس متغیرها استفاده می‬
‫شد كه امروزه این مسئله وجود ندارد‪.‬‬

‫ تابع خواندن از ورودی‬7-6-2
#include
void main() {
int age;
float average ;
printf("Please enter your age and average : ");
scanf("%d %f",&age,&average);
printf("You are %d years old and your average is %5.2f \n",age,average);
}

Please enter your age and average : 19 16.72
You are 19 years old and your average is 16.72

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫زبان ‪ C++‬یک زبان شی گرا است‪ ،‬بهمین دلیل در این زبان برای ورودی‬
‫و خروجی از اشیاء بجای توابع استفاده می گردد‪.‬‬
‫از آنجا که امروزه معموال برنامه نویسان ‪ C‬از کامپایلرهای ‪ C++‬استفاده‬
‫می کنند‪ ،‬می توانند از اشیای ورودی و خروجی آن نیز استفاده کنند‪.‬‬
‫اینکار در بین بسیاری از برنامه نویسان ‪ C‬متداول است‪ ،‬بهمین دلیل ما‬
‫در اینجا نحوه کار با اشیای خواندن و نوشتن در ‪ C++‬را بطور مقدماتی‬
‫توضیح می دهیم؛ گرچه توضیح کامل این موارد نیاز به آشنایی با شی‬
‫گرایی و زبان ‪ C++‬دارد‪.‬‬
‫قبل از هرچیز الزم به ذکر است که کلیه اشیای مربوط به ورودی و‬
‫خروجی در فایل سرآمدی بنام ‪ iostream.h‬تعیریف شده اند‪ ،‬بنابراین‬
‫ابتدا باید این فایل به برنامه توسط دستور ‪ #include‬الحاق گردد‪.‬‬

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫زبان ‪ C++‬برای نمایش اطالعات از یک شیئ بنام ‪ cout‬استفاده می نماید‪.‬‬
‫برای ارسال اطالعات مورد نظر برای چاپ به ‪ cout‬باید از عملگر درج در جریان‬
‫یا >> استفاده نماییم‪ .‬بعنوان مثال ‪:‬‬
‫; ” ‪cout >> “Please enter your name:‬‬
‫و یا مثال دیگر ‪:‬‬
‫;‪int a = 10‬‬
‫;‪float b = 2.86‬‬
‫;‪cout << a‬‬
‫;‪cout << b‬‬
‫نکته جالبی که در این مثالها دیده می شود‪ ،‬آنستکه برخالف تابع ‪ printf‬هیچ‬
‫نیازی به مشخص کردن نوع متغیری که قصد چاپ آن را داریم نیست و خود‬
‫شئ ‪ cout‬نوع آن را تشخیص می دهد‪.‬‬
‫عالوه براین می توان چندین عملگر درج در جریان را با یکدیگر الحاق کرد و‬
‫چندین متغیر را با یک دستور چاپ کرد‪.‬‬

C++ ‫ ورودی و خروجی اطالعات در‬7-6-3
#include
void main() {
int age = 20;
floate average = 18.23;
cout >> “You are ” >> age >> “ years old and your average is ” >> average ;
}

You are 20 years old and your average is 18.230000

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای دریافت اطالعات از کاربر‪ ،‬از شئ دیگری بنام ‪ cin‬استفاده می شود‪.‬‬
‫برای ارسال متغیر مورد نظر به ‪ cin‬باید از عملگر استخراج از جریان یا <<‬
‫استفاده نماییم‪ .‬بعنوان مثال‪:‬‬
‫;‪int a‬‬
‫;‪cin >> a‬‬
‫بازهم همانطور که می بینید نیازی به تعیین نوع متغیر موردنظر نیست و خود‬
‫شئ ‪ cin‬نوع متغیر را بطور اتوماتیک تشخیص داده و داده ای از همان نوع را از‬
‫کاربر دریافت و در متغیر مورد نظر قرار می دهد‪.‬‬
‫عملگرهای استخراج از جریان را نیز می توان با یکدیگر الحاق کرد‪.‬‬
‫برای رفتن به خط بعد در شئ ‪ cout‬می توان از دستکاری کننده ‪ endl‬استفاده‬
‫کرد‪ .‬مثال در دستور زیر پس از چاپ پیغام‪ ،‬مکان نما به خط بعد منتقل می‬
‫شود‪:‬‬
‫;‪cout >> “List of students : “ >> endl‬‬
‫البته دستکاری کننده های متعدد دیگری نیز ازجمله موارد مربوط به تعیین طول‬
‫میدان و نحوه چاپ مقادیر وجود دارد که توضیح آنها نیاز به یک مبحث مستقل‬
‫دارد‪.‬‬

C++ ‫ ورودی و خروجی اطالعات در‬7-6-3
#include
void main() {
int age;
float average ;
cout << "Please enter your age and average : " ;
cin >> age >> average ;
cout << "You are " << age << "years old and your average is " << average;
}

Please enter your age and average : 19 16.72
You are 19 years old and your average is 16.72

‫‪ 7-7‬توابع کتابخانه ای‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫همانطور که قبال نیز گفته شد‪ ،‬زبان ‪ C‬از زیر برنامه ها نیز حمایت می کند‪ .‬هر زیر برنامه‬
‫در ‪ C‬یک تابع نامیده می شود‪ .‬تا کنون با توابعی همچون ‪ main‬و یا ‪ printf‬و ‪ scanf‬آشنا‬
‫شده ایم‪.‬‬
‫معموال عرضه کنندگان کامپایلرها و یا سایر فروشندگان نرم افزار‪ ،‬برخی از توابع عمومی‬
‫را که ممکن است مورد نیاز جمع کثیری از برنامه نویسان مختلف باشد را در قالب‬
‫کتابخانه ای از توابع در اختیار برنامه نویسان می گذارند‪ .‬بعضی از این توابع کتابخانه ای‬
‫مانند ‪ printf‬و ‪ scanf‬بصورت استاندارد درآمده و توسط عرضه کنندگان مختلف ارائه می‬
‫شوند‪.‬‬
‫در کامپایلر عرضه شده توسط شرکت بورلند )‪ (Borland C++ 3.1‬نیز کتابخانه های‬
‫متعددی از توابع برای شما عرضه شده اند که بتدریج با آنها و کاربردشان آشنا خواهید‬
‫شد‪.‬‬
‫نکته مهم آنستکه برای استفاده از این توابع ابتدا باید فایل سرآمد مربوط به آنها را نیز در‬
‫ابتدای برنامه خود اضافه نمایید ) با استفاده از ‪ .(#include‬هر فایل سرآمد شامل تعاریف‬
‫اولیه گروهی از توابع مرتبط با هم و داده های مربوط به آنها بوده و در استاندارد قدیمی‬
‫تر دارای پسوند ‪ .h‬می باشد)در استاندارد جدید پسوند این فایلها حذف شده است(‪.‬‬
‫برخی از این فایلهای سرآمد عبارتند از‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪ : stdio.h‬توابع ورودی و خروجی استاندارد‬
‫‪ : math.h‬توابع ریاضی‬
‫‪ : graphics.h‬توابع مربوط به عملیات گرافیکی‬
‫‪ : string.h‬توابع مربوط به کار با رشته ها‬


Slide 31

‫مبانی کامپیوتر و برنامه سازی‬
‫فصل هفتم ‪ :‬مفاهیم اولیه زبان ‪C‬‬
‫مدرس ‪ :‬نگین معروفی‬

‫‪ 7-1‬شناسه ها در ‪C‬‬
‫‪‬‬
‫‪‬‬

‫شناسه )‪ (identifier‬نامی است که به یک قسمت از برنامه مانند متغیر‪ ،‬تابع‪ ،‬ثابت و یا‬
‫‪ ...‬داده می شود‪.‬‬
‫در زبان ‪ C‬برای انتخاب شناسه ها فقط می توان از عالئم زیر استفاده کرد‪:‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫حروف انگلیسی کوچک و بزرگ )‪(A…Z a…z‬‬
‫ارقام )‪(0…9‬‬
‫عالمت خط پایین یا _‬

‫البته یک شناسه نمی تواند با یک رقم شروع شود‪.‬‬
‫چند شناسه مجاز‪ name2 ، average ، sum :‬و ‪student_average‬‬
‫چند شناسه غیرمجاز ‪ 2name‬و یا ‪student average‬‬
‫در برنامه نویسی امروزی پیشنهاد می شود بجای شناسه هایی همانند‬
‫‪ student_average‬از ‪ studentAverage‬استفاده گردد‪.‬‬
‫نکته مهم دیگری که باید به آن اشاره کرد آنستکه زبان ‪ C‬برخالف بسیاری از زبانهای دیگر‬
‫به کوچک و بزرگی حروف حساس است )‪ .(case sensitive‬در نتیجه شناسه های زیر با‬
‫یکدیگر متفاوتند ‪:‬‬
‫‪Sum ≠ sum ≠ SUM‬‬
‫آخرین نکته اینستکه در هنگام انتخاب شناسه نمی توانید از کلمات کلیدی که برای‬
‫منظورهای خاص در زبان ‪ C‬رزرو شده اند استفاده کنید‪.‬‬

C ‫ شناسه ها در‬7-1
: C ‫کلمات کلیدی در زبان‬
auto

break

case

char

const

continue

default

do

double

else

enum

extern

float

for

goto

if

int

long

register

return

short

signed

sizeof

static

struct

switch

typedef

union

unsigned

void

volatile

while

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫محدوده‬

‫اندازه )بیت(‬

‫توضیح‬

‫نوع داده‬

‫‪-128 to +127‬‬

‫‪8‬‬

‫کاراکتر‬

‫‪char‬‬

‫‪-32768 to +32767‬‬

‫‪16‬‬

‫عدد صحیح‬

‫‪int‬‬

‫‪3.4e-38 to 3.4e+38‬‬

‫‪32‬‬

‫عدد اعشاری‬

‫‪float‬‬

‫‪1.7e-308 to 1.7e+308‬‬

‫‪64‬‬

‫عدد اعشاری با‬
‫دقت مضاعف‬

‫‪double‬‬

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫‪‬‬

‫البته چند نکته مهم درمورد این جدول قابل ذکر است ‪:‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫اندازه ‪ int‬در محیطهای ‪ 16‬بیتی مانند ‪ DOS‬برابر ‪ 16‬بیت است‪ .‬اما در‬
‫محیطهای ‪ 32‬بیتی همانند ‪ Windows‬اندازه آن ‪ 32‬بیت می باشد که در‬
‫اینصورت محدوده ای برابر ‪ -2,147,483,648‬تا ‪ +2,147,483,647‬را‬
‫پوشش می دهد‪.‬‬
‫در بعضی از کامپایلرهای ‪ ،C‬نوع داده ‪ bool‬نیز وجود دارد که می تواند‬
‫یکی از مقادیر ‪)true‬درست( یا ‪) false‬غلط( را نشان دهد ‪ .‬اما در نسخه‬
‫های اولیه ‪ C‬از همان نوع داده صحیح یا ‪ int‬برای اینکار استفاده می‬
‫شد‪ .‬بدین صورت که ‪ 0‬نشاندهنده ‪ false‬و هر عدد غیر صفر )معموال ‪(1‬‬
‫نشاندهنده ‪ true‬است‪.‬‬
‫از آنجا که برای ذخیره سازی کاراکترها کد اسکی آنها ذخیره می گردد‪،‬‬
‫از یک متغیر کاراکتری یا ‪ char‬می توان بعنوان یک عدد صحیح کوچک نیز‬
‫استفاده کرد و اعمال ریاضی برروی آنها نیز مجاز است‪.‬‬

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫عالوه براین چندین اصالح کننده نیز وجود دارد که به ما اجازه می دهد نوع داده مورد‬
‫نظر را با دقت بیشتری برای نیازهای مختلف استفاده نماییم‪.‬‬
‫این اصالح کننده ها عبارتند از ‪short, long, signed, unsigned :‬‬
‫تمام این اصالح کننده ها می توانند به نوع داده ‪ int‬اعمال شوند و اثر آنها بستگی‬
‫به محیط دارد‪.‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫در یک محیط ‪16‬بیتی‪short int ،‬بازهم برابر ‪16‬بیت است ولی ‪ long int‬برابر‪32‬بیت می‬
‫باشد‪.‬‬
‫‪ unsigned int‬باعث می شود که یک عدد ‪ 16‬بیتی بدون عالمت داشته باشیم که بازه‬
‫بین ‪ 0‬تا ‪ 65535‬را پوشش می دهد‪ signed int .‬نیز همانند ‪ int‬معمولی بوده و تفاوتی‬
‫ندارد‪.‬‬
‫ترکیب این اصالح کننده ها نیز ممکن است‪ .‬مثال ‪ unsigned long int‬یک عدد ‪ 32‬بیتی‬
‫بدون عالمت است که بازه ‪ 0‬تا ‪ 4,294,967,295‬را پوشش می دهد‪.‬‬

‫برروی نوع داده ‪ char‬فقط اصالح کننده های ‪ signed‬و ‪ unsigned‬را می توان اعمال‬
‫کرد‪ .‬معموال از اصالح کننده ‪ unsigned‬وقتی استفاده می شود که قصد داشته‬
‫باشیم از ‪ char‬بعنوان یک عدد صحیح مثبت بین ‪ 0‬تا ‪ 255‬استفاده کنیم‪.‬‬
‫برروی نوع داده ‪ double‬تنها اصالح کننده ‪ long‬قابل اعمال است و دراینصورت عدد‬
‫اعشاری با ‪ 80‬بیت را خواهیم داشت که قادر است هر عددی در بازه ‪ 3.4e-4932‬تا‬
‫‪ 1.1e+4932‬را در خود نگاه دارد‪.‬‬

‫‪ 7-3‬تعریف متغیرها‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای تعریف متغیرها به شکل زیر عمل می کنیم‪:‬‬

‫;>‪ ‫که ‪ type‬یکی از نوع داده های گفته شده و ‪ variable-list‬لیستی از متغیرها است‬
‫که با کاما از یکدیگر جدا شده اند‪ .‬بعنوان مثال ‪:‬‬
‫;‪int sum‬‬
‫;‪float average‬‬
‫; ‪long int a, b, c‬‬
‫; ‪unsigned long int i, j, k‬‬
‫عالوه براین می توان در هنگام تعریف متغیر به آن مقدار اولیه نیز داد‪ .‬مثال ‪:‬‬
‫; ‪int d = 0‬‬
‫نكته مهم آنكه زبان ‪ C‬به متغیرها مقدار اولیه نمي دهد )حتي ‪ (0‬و برنامه نويس‬
‫خود بايد اينكار را صريحا انجام دهد‪ ،‬درغیر اينصورت مقدار اولیه متغیر‪ ،‬نامعین خواهد‬
‫بود‪.‬‬
‫تعریف متغیرها طبق اصول زبان ‪ C‬میتواند درهرجایی از برنامه صورت پذیرد‪ ،‬و‬
‫متغیرهای تعریف شده از همان خط به بعد قابل استفاده خواهد بود‪ .‬اما معموال‬
‫توصیه می گردد كه تعریف متغیرها در همان خط ابتدایی تابع و بالفاصله پس از {‬
‫صورت پذیرد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫‪‬‬
‫‪‬‬

‫ثابتها مقادیر ثابتی هستند كه مقدار آنها در حین اجرای برنامه تغییر نمی یابد‪ .‬ثابتها می توانند از‬
‫هریك از نوع داده های اصلی باشند‪.‬‬
‫ثوابت عددی صحیح ‪:‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫برای نمایش این دسته از ثوابت‪ ،‬از دنباله ای از ارقام بعالوه عالمت ‪ +‬یا ‪ -‬استفاده می كنیم‪ .‬بعنوان مثال‬
‫‪ -45‬و یا ‪ 3489‬ثوابت صحیح هستند‪.‬‬
‫در حالت عادی ‪ C‬هر عدد را در كوچكترین نوع داده ای كه می تواند قرار می دهد‪ .‬مثال عدد ‪ 85‬در یك‬
‫‪ int‬قرار می گیرد‪ ،‬اما عدد ‪ 145398‬در یك ‪ long int‬قرار خواهد گرفت‪.‬‬
‫اگر قصد دارید یك عدد كوچك بعنوان ‪ long‬محسوب گردد‪ ،‬می توانید از پسوند ‪ L‬در انتهای آن استفاده‬
‫می كنیم‪ .‬مثال ‪245L‬یك عدد ‪ long‬محسوب می شود‪.‬‬
‫;‪long int a = 20L‬‬
‫پسوند ‪ U‬در انتهای عدد نیز نشانه بدون عالمت بودن آن است‪.‬‬
‫نكته دیگر آنكه ‪ C‬به شما اجازه می دهد درصورت لزوم ثوابت صحیح خود را در مبنای ‪ 8‬یا ‪ 16‬نیز كه‬
‫از مبناهای متداول در برنامه نویسی هستند‪ ،‬بنویسید‪.‬‬
‫‪‬‬
‫‪‬‬

‫برای نوشتن عدد در مبنای ‪ 8‬باید آن را با ‪ 0‬آغاز كنید‪ ،‬مثال ‪ 0342‬یك عدد در منای ‪ 8‬محسوب می‬
‫گردد‪.‬‬
‫برای نوشتن یك عدد در مبنای ‪ 16‬باید آن را با ‪ 0x‬آغاز نمایید‪ ،‬مانند ‪.0x27A4‬‬

‫‪ 7-4‬ثوابت‬
‫ثوابت عددی اعشاری‬

‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫برای نمایش اعداد اعشاری‪ ،‬باید از نقطه اعشار استفاده كنیم‪ ،‬مانند ‪237.45‬‬
‫اما نكته جالب آنستكه می توانید از نماد علمی نیز برای نمایش اعداد‬
‫اعشاری استفاده كنید‪ .‬برای اینكار كافی است از حرف ‪ e‬برای نمایش قسمت‬
‫توان استفاده نمایید‪ .‬بعنوان مثال ‪:‬‬
‫‪-23.47 × 10 5 = -23.47e5‬‬
‫‪42.389 × 10 -3 = 42.389e-3‬‬
‫دقت كنید كه قسمت توان‪ ،‬حتما یك عدد صحیح است‪.‬‬
‫نكته جالب اینجاست كه برخالف مورد قبل‪ ،‬كامپایلر بطور پیش فرض داده های‬
‫اعشاری را از نوع ‪ double‬فرض می كند‪.‬چنانچه دوست دارید ثابت شما ازنوع‬
‫‪ float‬درنظر گرفته شود‪ ،‬در انتهای آن ‪ F‬قرار دهید‪ .‬ضمنا پسوند ‪ L‬نیز داده‬
‫اعشاری را از نوع ‪ long double‬درنظر می گیرد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫ثوابت كاراكتری ‪:‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫برای نشان دادن ثوابت كاراكتری‪ ،‬آنها را در داخل ' قرار می دهیم‪ .‬بعنوان مثال‬
‫'‪'A‬یك ثابت كاراكتری است‪.‬‬
‫; '‪char ch = 'S‬‬
‫دقت كنید كه همانطور كه قبال گفته شد‪ ،‬كد اسكی كاراكترها در متغیر ذخیره‬
‫می گردد‪ ،‬بنابراین می توان از آن بعنوان یك عدد صحیح نیز استفاده كرد‪ .‬نكته‬
‫مهم دیگر آنستكه به تفاوت عدد ‪ 5‬و كاراكتر '‪ '5‬دقت داشته باشید‪ .‬در حقیقت‬
‫'‪ '5‬برابر است با عدد ‪ 53‬كه همان كد اسكی آن است‪.‬‬
‫روش فوق‪ ،‬برای نمایش کاراکترهای قابل چاپ مناسب است‪ ،‬اما بعضی‬
‫كاراكترها مانند ‪ enter‬قابل نمایش نبوده و برای آنها شکل خاصی وجود ندارد‪.‬‬
‫در چنین مواردی‪ ،‬زبان ‪ C‬از ترکیب عالمت \ به همراه یک کاراکتر دیگر‪ ،‬برای‬
‫نمایش این قبیل کاراکترها استفاده می نماید‪ .‬بعنوان مثال‪ ،‬کاراکتر '‪ '\n‬نشان‬
‫دهنده خط جدید یا همان ‪ enter‬می باشد‪.‬‬
‫جدول صفحه بعد این قبیل کاراکترها و معادل آنها را نشان می دهد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫نحوه نمایش در ‪C‬‬

‫کد اسکی‬

‫صدای بوق کامپیوتر‬

‫‪\a‬‬

‫‪7‬‬

‫حرکت به عقب ‪backspace‬‬

‫‪\b‬‬

‫‪8‬‬

‫شروع صفحه ‪form feed‬‬

‫‪\f‬‬

‫‪12‬‬

‫سطر جدید ‪line feed‬‬

‫‪\n‬‬

‫‪10‬‬

‫برگشت به ابتداي سطر ‪carriage return‬‬

‫‪\r‬‬

‫‪13‬‬

‫فاصله افقی ‪horizontal tab‬‬

‫‪\t‬‬

‫‪9‬‬

‫فاصله عمودی ‪vertical tab‬‬

‫‪\v‬‬

‫‪11‬‬

‫عالمت سوال‬

‫?\‬

‫‪63‬‬

‫عالمت '‬

‫'\‬

‫‪39‬‬

‫عالمت "‬

‫"\‬

‫‪34‬‬

‫عالمت \‬

‫\\‬

‫‪92‬‬

‫عالمت تهی‬

‫‪\0‬‬

‫‪0‬‬

‫نام کاراکتر‬

‫کد اسکی یک کاراکتر با ‪ 3‬رقم در مبنای ‪8‬‬

‫‪\000‬‬

‫کد اسکی یک کاراکتر با ‪ 2‬رقم در مبنای ‪16‬‬

‫‪\x00‬‬

‫‪ 7-4‬ثوابت‬
‫‪‬‬

‫ثوابت رشته ای ‪ C :‬عالوه بر ثوابت فوق‪ ،‬از یك ثابت دیگر بنام رشته نیز‬
‫حمایت می كند‪ .‬رشته‪ ،‬دنباله ای از كاراكترها است كه در داخل " قرار‬
‫می گیرند‪ .‬بعنوان مثال "‪ "this is a test‬یك رشته است‪ .‬دقت كنید كه '‪'a‬‬
‫یك كاراكتر است‪ ،‬اما "‪ "a‬یك رشته است كه فقط شامل یك كاراكتر می‬
‫باشد‪.‬‬

‫‪ 7-5‬عملگرها‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫عملگر‪ ،‬نمادی است كه به كامپایلر می گوید تا عملیات محاسباتی یا‬
‫منطقی خاصی را برروی یك یا چند عملوند‪ ،‬انجام دهد‪.‬‬
‫به عملگرهایی كه فقط یك عملوند دارند‪ ،‬عملگر یكانی می گوییم و‬
‫همواره عملگر در سمت چپ عملوند قرار می گیرد)مانند عدد ‪.(-125‬‬
‫اما عملگرهایی كه برروی دو عملوند اثر می كنند را عملگر دودویی‬
‫نامیده و عملگر را بین دو عملوند قرار می دهیم )مانند ‪.(23+86‬‬
‫هر ترکیب درستی از عملگرها و عملوندها را یک عبارت می نامیم‪.‬‬
‫‪ C‬از نقطه نظر عملگرها یك زبان بسیار قوی است‪ .‬این عملگرها به چند‬
‫دسته اصلی تقسیم می گردند كه آنها را به ترتیب بررسی می كنیم‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫این عملگرها‪ ،‬همان اعمال متداول ریاضی هستند كه در زبان ‪ C‬مورد استفاده‬
‫قرار می گیرند‪ .‬این اعمال عبارتند از ‪:‬‬

‫عمل‬

‫نوع‬

‫عملگر‬

‫منفی كردن عملوند سمت راست‬

‫یكانی‬

‫‪-‬‬

‫جمع دو عملوند‬

‫دودویی‬

‫‪+‬‬

‫تفریق دو عملوند‬

‫دودویی‬

‫‪-‬‬

‫ضرب دو عملوند‬

‫دودویی‬

‫*‬

‫تقسیم دو عملوند‬

‫دودویی‬

‫‪/‬‬

‫محاسبه باقیمانده تقسیم دو عملوند‬

‫دودویی‬

‫‪%‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬
‫‪‬‬

‫این عملگرهای برروی همه انواع داده های ‪ C‬عمل می كنند‪ ،‬بجز عملگر ‪ %‬كه فقط‬
‫برروی نوع داده های صحیح عمل می كند‪.‬‬
‫اما نكته مهمی كه باید به آن اشاره كرد‪ ،‬نحوه كار عملگر تقسیم برروی نوع داده های‬
‫مختلف است‪.‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫درصورتیكه هردو عملوند صحیح باشند‪ ،‬تقسیم بصورت صحیح بر صحیح انجام خواهد شد‪.‬‬
‫اگر یكی یا هر دو عملوند اعشاری باشند‪ ،‬تقسیم بصورت اعشاری انجام خواهد پذیرفت‪.‬‬
‫فرض كنید تعاریف زیر را داریم ‪:‬‬
‫; ‪int a,b‬‬
‫; ‪float c,d‬‬
‫; ‪a = 10 ; b = 4‬‬
‫;‪c = 8.2; d = 4.0‬‬
‫اكنون به نتایج عملیات زیر دقت كنید ‪:‬‬
‫‪a / b => 2‬‬
‫‪c / d => 2.05‬‬
‫‪a / d => 2.5‬‬
‫‪a / 4 => 2‬‬
‫چنانچه به آخرین مورد توجه كنید‪ ،‬متوجه می شوید كه از آنجا كه ‪a‬یك متغیر صحیح است و ‪4‬‬
‫نیز یك ثابت صحیح در نظر گرفته شده‪ ،‬درنتیجه تقسیم بصورت صحیح بر صحیح انجام گرفته‬
‫است‪ .‬چنانچه بخواهیم تقسیم بصورت اعشاری صورت پذیرد‪ ،‬به دو شكل می توانیم عمل‬
‫كنیم‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫برای اینکه عبارت تقسیم صفحه قبل بصورت اعشاری انجام شود‪ ،‬به دو روش‬
‫می توان عمل کرد‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫این عبارت را بصورت ‪ a / 4.0‬بنویسیم‪.‬‬
‫از عملگر قالب ریزی استفاده كنیم‪.‬‬

‫عملگر قالب ریزی می تواند یك نوع را به نوع دیگری تبدیل نماید‪ .‬شكل كلی آن‬
‫به شكل زیر است ‪:‬‬
‫>‪() ‫كه ‪ type‬نوع مورد نظر است كه قصد تبدیل عبارت ‪ expression‬به آن نوع را‬
‫داریم‪ .‬بعنوان مثال در مورد قبلی می توان به شكل زیر عمل كرد ‪:‬‬
‫‪(float) a / 4‬‬
‫در این حالت از كامپایلر خواسته ایم كه ابتدا عدد ‪ a‬را به اعشاری تبدیل كند‬
‫)البته بصورت موقت( و سپس آن را بر ‪ 4‬تقسیم نماید‪ ،‬كه مسلما حاصل‬
‫اعشاری خواهد بود‪.‬‬
‫بطوركلی هرگاه ثابتها و متغیرهایی از انواع مختلف در یك عبارت محاسباتی‬
‫داشته باشیم‪ ،‬كامپایلر ‪ C‬همه آنها را به یك نوع یكسان كه همان بزرگترین‬
‫عملوند موجود است تبدیل خواهد كرد‪ .‬بعنوان مثال به مورد صفحه بعد دقت‬
‫كنید ‪:‬‬

‫ عملگرهای محاسباتی‬7-5-1
char ch;
int i;

float f;
double d;
result = (ch / i)
int

+

(f *d)

(f+i)
float

double

double

int

-

double

double

float

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫اولویت عملگرها ‪ :‬در عبارتی که شامل چندین عملگر است‪ ،‬کدامیک در‬
‫ابتدا اعمال خواهد گردید‪.‬‬
‫اولویت عملگرهای محاسباتی از باال به پایین بشرح زیر است‪:‬‬
‫‪ ‬عملگر یکانی –‬
‫‪ ‬عملگرهای * و ‪ /‬و ‪%‬‬
‫‪ ‬عملگرهای ‪ +‬و –‬
‫چنانچه اولویت دو عملگر یکسان باشد‪ ،‬این عملگرها از چپ به راست‬
‫محاسبه خواهند شد‪.‬‬
‫چنانچه بخواهیم یک عمل با اولویت پایین زودتر انجام شود‪ ،‬باید از پرانتز‬
‫استفاده کنیم‪ .‬بنابراین اولویت عملگر پرانتز از همه موارد فوق‬
‫بیشتراست‪ .‬در مورد پرانتزهای متداخل‪ ،‬ابتدا پرانتز داخلی محاسبه‬
‫می شود؛ اما در مورد پرانتزهای هم سطح‪ ،‬ابتدا پرانتز سمت چپتر‬
‫محاسبه می گردد‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫چند مثال در مورد اولویت عملگرها‬

‫ترتیب اجرای عملگرها‬

‫عبارت زبان ‪C‬‬

‫ابتدا عمل * و سپس عمل ‪+‬‬

‫‪b+c*d‬‬

‫ابتدا عمل ‪ +‬و سپس عمل *‬

‫‪(b + c) * d‬‬

‫ابتدا عمل ‪ /‬سپس عمل * و در انتها عمل ‪+‬‬

‫‪b+c/d*e‬‬

‫ابتدا عمل * سپس عمل ‪ /‬و در انتها عمل ‪+‬‬

‫)‪b + c / (d * e‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫یک مثال کامل در مورد اولویت عملگرها‬

‫‪result = a + b * (f – (g + b) / d) – c * (a – d) / e‬‬
‫‪6‬‬

‫‪1‬‬
‫‪7‬‬

‫‪2‬‬

‫‪8‬‬

‫‪3‬‬
‫‪4‬‬
‫‪5‬‬
‫‪9‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫در زبان ‪ C‬برای انتساب چندین عملگر وجود دارد‪ .‬ساده ترین عملگر انتساب‪ ،‬همان عملگر =‬
‫است که در بسیاری از زبانها استفاده می شود‪ .‬بعنوان مثال ‪:‬‬
‫;‪a = 5‬‬
‫;‪b = c + 2 * d‬‬
‫این عملگر باعث می شود که عبارت سمت راست در عبارت سمت چپ قرار گیرد‪.‬‬
‫توجه کنید که مقدار سمت چپ باید عبارتی باشد که بتوان به آن یک مقدار را نسبت داد‬
‫)مانند یک متغیر( که به آن ‪ Lvalue‬گفته می شود‪ ،‬بنابراین یک ثابت نمی تواند در سمت چپ‬
‫قرار گیرد‪.‬‬
‫نکته دیگر اینکه اولویت عملگر = از عملگرهای ریاضی کمتر است و درنتیجه ابتدا آن عملیات‬
‫انجام شده و در پایان حاصل در عبارت سمت چپ ریخته می شود‪.‬‬
‫الزم به ذکر است که در هنگام انتساب‪ ،‬درصورت لزوم نوع عبارت سمت راست به نوع عبارت‬
‫سمت چپ تبدیل می شود‪ .‬مثال‪:‬‬
‫;‪int a‬‬
‫;‪a = 2.5 * 5.0‬‬
‫که دراینصورت عدد ‪ 12‬در ‪ a‬ذخیره خواهد شد‪.‬‬
‫شرکت پذیری این عملگر از راست به چپ می باشد‪ ،‬بدین معنا که چنانچه چندین عملگر‬
‫نسبت دهی داشته باشیم‪ ،‬این عملگرها از راست به چپ محاسبه می شوند‪ .‬مثال پس از‬
‫اجرای دستور زیر‪ ،‬مقدار هر ‪ 3‬متغیر برابر ‪ 10‬خواهد شد‪.‬‬
‫;‪a = b = c = 10‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬

‫نکته جالب درمورد زبان ‪ C‬آنستکه دارای یک سری عملگرهای انتساب‬
‫خالصه شده است که باعث می شوند در بعضی موارد بتوانیم عبارات‬
‫کوتاهتری را بنویسیم‪ .‬این عملگرها عبارتند از ‪:‬‬
‫عملگرد‬

‫مثال‬

‫عبارت انتساب معادل‬

‫‪++‬‬

‫;‪a ++‬‬

‫;‪a = a + 1‬‬

‫‪--‬‬

‫;‪a --‬‬

‫;‪a = a – 1‬‬

‫=‪+‬‬

‫;‪a += 5‬‬

‫;‪a = a + 5‬‬

‫=‪-‬‬

‫;‪a -= 8‬‬

‫;‪a= a – 8‬‬

‫=*‬

‫;‪a *= 10‬‬

‫;‪a= a * 10‬‬

‫=‪/‬‬

‫;‪a /= 2‬‬

‫;‪a = a / 2‬‬

‫=‪%‬‬

‫;‪a %= 10‬‬

‫;‪a = a % 10‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬
‫‪‬‬

‫عملگر اول و دوم‪ ،‬عملگرهای یکانی هستند که بترتیب عملگر افزایش و عملگر کاهش‬
‫نامیده می شوند‪.‬‬
‫نکته جالب آنستکه این دو عملگر به دوصورت مورد استفاده قرار می گیرند‪.‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫در حالتی که از دستور ;‪ a ++‬استفاده شود به آن پس افزایش می گویند و بدین معناست که‬
‫ابتدا از مقدار فعلی ‪ a‬در عبارت موردنظر استفاده کن و سپس آن را افزایش بده‪.‬‬
‫اما دستور ;‪ ++ a‬که به آن پیش افزایش گفته می شود‪ ،‬ابتدا ‪ a‬را افزایش داده و سپس از آن‬
‫در عبارت استفاده می کند‪.‬‬
‫به برنامه زیر دقت کنید‪:‬‬

‫>‪#include ‫{ )(‪void main‬‬
‫; ‪int a ,b‬‬
‫;‪a=5‬‬
‫;‪b = a ++‬‬
‫;)‪printf(“a=%d and b=%d \n”,a,b‬‬
‫;‪a=5‬‬
‫;‪b = ++ a‬‬
‫;)‪printf(“a=%d and b=%d \n”,a,b‬‬
‫}‬
‫‪a=6 b=5‬‬
‫‪a=6 b=6‬‬

‫‪ 7-5-3‬عملگرهای مقایسه ای‬
‫‪‬‬

‫‪‬‬

‫این عملگرها دو عبارت را بایکدیگر مقایسه کرده و نتیجه را باز می گردانند‪.‬‬
‫نتیجه می تواند درست )‪ (true‬یا غلط )‪ (false‬باشد‪.‬‬
‫نتیجه این عملگرها یک عدد صحیح است که درصورت درست بودن ‪ 1‬و‬
‫درصورت غلط بودن ‪ 0‬باز می گردانند‪ .‬این عملگرها عبارتند از‪:‬‬
‫عملگر‬

‫مفهوم عملگر‬

‫مثال‬

‫<‬

‫بزرگتر )<(‬

‫‪a>b‬‬

‫>‬

‫کوچکتر )>(‬

‫‪a
‫=<‬

‫بزرگتر یا مساوی )≤(‬

‫‪a >= b‬‬

‫=>‬

‫کوچکتر یا مساوی )≥(‬

‫‪a <= b‬‬

‫==‬

‫مساوی )=(‬

‫‪a == b‬‬

‫=!‬

‫نامساوی )≠(‬

‫‪a != b‬‬

‫‪ 7-5-3‬عملگرهای مقایسه ای‬
‫‪‬‬

‫‪‬‬

‫نکته مهمی که باید به آن دقت کرد عملگر مساوی )==( است‪ ،‬چرا که یک‬
‫اشتباه بسیار متداول برنامه نویسان ‪ C‬استفاده اشتباه از عملگر انتساب‬
‫)=( بجای عملگر تساوی )==( است که باعث ایجاد خطا در برنامه می‬
‫شود‪.‬‬
‫اولویت این عملگرها از باال به پایین بشرح زیر است‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫عملگرهای <‪ <= ، > ،‬و =>‬
‫عملگرهای == و =!‬

‫الزم بذکر است که در هنگام مساوی بودن اولویت چند عملگر‪ ،‬این عملگرها‬
‫از چپ به راست محاسبه می گردند‪.‬‬

‫‪ 7-5-4‬عملگرهای منطقی‬
‫‪‬‬

‫این عملگرها به شما اجازه می دهند که شرطهای ساده ای را که با‬
‫استفاده از عملگرهای مقایسه ای ایجاد شده اند را با یکدیگر ترکیب نموده‬
‫و شرطهای پیچیده تری را بسازید‪ .‬این عملگرها عبارتند از ‪:‬‬
‫مثال‬

‫عملگر‬

‫مفهوم عملگر‬

‫نحوه کار‬

‫&&‬

‫‪ AND‬منطقی‬

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

‫‪a>0 && sw==1‬‬

‫||‬

‫‪ OR‬منطقی‬

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

‫‪a<=100 || b!=0‬‬

‫!‬

‫‪ NOT‬منطقی‬

‫اگر عملوند درست باشد‪ ،‬نادرست و‬
‫اگر نادرست باشد‪ ،‬درست برمی‬
‫گرداند‪.‬‬

‫)‪! (a==1 || b<10‬‬

‫‪ 7-5-5‬عملگر شرطی‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫گاهی الزم است که ابتدا یک شرط بررسی شده و سپس برمبنای نتیجه )درست یا نادرست بودن آن( یکی‬
‫از دو عبارت ممکن بازگردانده شود‪ .‬برای اینکار می توان از یک عملگر ‪3‬تایی )با ‪ 3‬عملوند( بنام عملگر‬
‫شرطی استفاده نمود‪.‬‬
‫شکل کلی این عملگر بصورت زیر است‪:‬‬
‫>عبارت‪> :<2‬عبارت‪> ?<1‬شرط<‬
‫نحوه کار بدینصورت است که درصورت درست بودن شرط‪ ،‬عبارت‪ 1‬و در غیراینصورت عبارت ‪ 2‬بازگردانده می‬
‫شود‪.‬‬
‫به عنوان مثال به دستور زیر توجه کنید‪:‬‬
‫که این عبارت معادل دستور زیر است‪:‬‬

‫‪‬‬

‫;‪a = (k<10) ? 100 : 50‬‬
‫;‪if (k<10) a=100‬‬
‫;‪else a=50‬‬

‫البته این عبارت به شکلهای پیچیده نیز می تواند مورد استفاده قرار گیرد‪ .‬مثال ‪:‬‬
‫;‪c += (a>0 && a<10) ? ++a : a/b‬‬
‫که معادل است با ‪:‬‬
‫{ )‪if (a>0 && a<10‬‬
‫;‪a= a + 1‬‬
‫;‪c = c + a‬‬
‫}‬
‫;‪else c = c + a/b‬‬

‫‪ 7-5-6‬اولویت عملگرها‬
‫عملگر‬

‫اولویت‬

‫شرکت پذیری‬

‫‪1‬‬

‫)(‬

‫از چپ به راست‬

‫‪2‬‬

‫‪- + ! -- ++‬‬

‫از راست به چپ‬

‫‪3‬‬

‫‪* / %‬‬

‫از چپ به راست‬

‫‪4‬‬

‫‪+ -‬‬

‫از چپ به راست‬

‫‪5‬‬

‫>> <<‬

‫از چپ به راست‬

‫‪6‬‬

‫>= > <= <‬

‫از چپ به راست‬

‫‪7‬‬

‫=! ==‬

‫از چپ به راست‬

‫‪8‬‬

‫&&‬

‫از چپ به راست‬

‫‪9‬‬

‫||‬

‫از چپ به راست‬

‫‪10‬‬

‫‪?:‬‬

‫از راست به چپ‬

‫‪11‬‬

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

‫از راست به چپ‬

‫‪12‬‬

‫‪,‬‬

‫از چپ به راست‬

‫‪ 7-6‬خواندن و نمایش اطالعات‬
‫‪‬‬

‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫همانطور كه قبال نیز گفته شد‪ ،‬یكی از اهداف زبان ‪ C‬قابل حمل بودن آن‬
‫است‪ .‬بهمین منظور سعی شده است كه از دستوراتی كه ممكن است‬
‫وابسته به ماشین خاصی باشد‪ ،‬اجتناب گردد‪.‬‬
‫بهمین دلیل زبان ‪ C‬برخالف سایر زبانها دارای هیچ دستوری برای‬
‫خواندن از ورودی و یا نوشتن در خروجی نیست‪.‬‬
‫اما در عوض دارای تعدادی تابع )زیربرنامه( استاندارد می باشد كه تقریبا‬
‫تمامی كامپایلرها از آنها حمایت می كنند‪.‬‬
‫این كار به كامپایلر این امكان را می دهد كه بر حسب نوع سخت افزار‬
‫موردنظر‪ ،‬توابع ورودی و خروجی را طراحی نماید‪.‬‬
‫این توابع در یك فایل سرآمد بنام ‪ stdio.h‬تعریف شده اند و بنابراین قبل‬
‫ازاینكه بتوانید از این توابع استفاده نمایید‪ ،‬باید این فایل را نیز با استفاده‬
‫از ‪ #include‬در برنامه خود بگنجانید‪.‬‬

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫برای نمایش اطالعات در خروجی از تابع ‪ printf‬استفاده می شود‪.‬‬
‫این تابع رشته موردنظر شما را به خروجی استاندارد )كه در حالت‬
‫عادی همان صفحه نمایش یا مانیتور است( می فرستد‪ .‬شكل كلی این‬
‫تابع بصورت زیر است‪:‬‬
‫; )>لیست متغیرها< ‪> ,‬رشته كنترلی<(‪printf‬‬
‫رشته كنترلی همان متنی است كه قصد چاپ آن را داریم‪ ،‬با ذكر این‬
‫نكته كه در قسمتهایی كه باید مقدار یك متغیر چاپ شود‪ ،‬از یك‬
‫مشخصه تبدیل استفاده می شود‪ .‬هر مشخصه تبدیل از یك عالمت ‪%‬‬
‫بعالوه یك كاراكتر كه نوع متغیر مورد نظر را نشان می دهد تشكیل می‬
‫گردد‪.‬‬
‫لیست متغیرها نیز همان متغیرهایی هستند كه قصد چاپ آنها را داریم‪.‬‬
‫این متغیرها باید بترتیب قرار گرفته و با كاما )‪ (,‬از یكدیگر جدا شوند‪.‬‬

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫مشخصه تبدیل‬

‫مفهوم‬

‫‪%c‬‬

‫كاراكتر‬

‫‪%d‬‬

‫عدد صحیح در مبنای ‪10‬‬

‫‪%f‬‬

‫عدد اعشاری بدون نماد علمی‬

‫‪%e‬‬

‫عدد اعشاری با نماد علمی‬

‫‪%g‬‬

‫عدد اعشاری با حالت كوتاهتر بین ‪ e‬و ‪f‬‬

‫‪%s‬‬

‫رشته‬

‫‪%ld‬‬

‫عدد صحیح بزرگ‬

‫‪%lf %le %lg‬‬

‫عدد اعشاری بزرگ‬

‫‪%o‬‬

‫عدد صحیح در مبنای ‪8‬‬

‫‪%x‬‬

‫عدد صحیحی در مبنای ‪16‬‬

‫‪%u‬‬

‫عدد صحیح بدون عالمت‬

‫ تابع نمایش در خروجی‬7-6-1
#include
void main() {
int age = 20;
floate average = 18.23;
printf("You are %d years old and your average is %f \n",age,average);
}
You are 20 years old and your average is 18.230000

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫‪‬‬
‫‪‬‬

‫برای کنترل نحوه چاپ اعداد می توانید از مشخصه طول میدان استفاده‬
‫کنید‪.‬‬
‫مشخصه طول میدان برای اعداد به شكل زیر استفاده می شود‪:‬‬
‫‪ ‬برای اعداد صحیح از ‪ %nd‬استفاده می كنیم كه ‪ n‬تعداد ارقام را نشان‬
‫می دهد )مثال ‪ .(%3d‬در اینصورت برای هر متغیر ‪ n‬رقم درنظر گرفته‬
‫می شود‪ .‬اگر اندازه عدد از ‪ n‬كوچكتر باشد‪ ،‬به سمت چپ آن فضای‬
‫خالی اضافه می شود و اگر اندازه عدد بیش از ‪ n‬رقم باشد‪ ،‬طول میدان‬
‫نادیده گرفته شده و عدد بطور كامل چاپ می شود‪.‬‬
‫‪ ‬برای اعداد اعشاری از ‪ %n.mf‬استفاده می كنیم كه ‪ n‬اندازه كل عدد‬
‫)شامل عالمت ممیز( و ‪ m‬تعداد ارقام اعشار است )مثال ‪ .(%5.2f‬در‬
‫صورتیكه تعداد ارقام اعشاری عدد موردنظر از ‪ m‬بیشتر باشد‪ ،‬عدد به ‪m‬‬
‫عدد اعشار گرد می شود و در صورتیكه از ‪ m‬كمتر باشد‪ ،‬در سمت‬
‫راست آن ‪ 0‬قرار داده می شود‪.‬‬

‫‪ 7-6-2‬تابع خواندن از ورودی‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای خواندن اطالعات از ورودی از تابع ‪ scanf‬استفاده می شود‪.‬‬
‫این تابع اطالعات را ازورودی استاندارد )معموال صفحه كلید( خوانده و در‬
‫متغیرهای تعیین شده قرار می دهد‪.‬‬
‫شكل كلی این تابع بصورت زیر است‪:‬‬
‫; )>لیست آدرسهای متغیرها< ‪> ,‬رشته كنترلی<(‪scanf‬‬
‫همانطور كه می بینید نحوه احضار تابع ‪ scanf‬نیز مشابه ‪ printf‬است‪ .‬تنها‬
‫تفاوت در آن است كه در ‪ scanf‬باید لیست آدرسهای متغیرها ارسال شود‪.‬‬
‫مبحث مربوط به آدرسها در فصول بعدی بررسی خواهد شد ولی در حال حاضر‬
‫بخاطر بسپارید كه برای بدست آوردن آدرس یك متغیر از عالمت & استفاده می‬
‫كنیم‪ .‬بعنوان مثال ‪ &age‬بمعنای آدرس متغیر ‪ age‬است‪.‬‬
‫بطور كلی در ‪ C‬قدیمی هرگاه كه یك تابع دارای پارامترهای خروجی بود )یعنی‬
‫پارامترهایی كه یك مقدار را باز می گرداندند( از آدرس متغیرها استفاده می‬
‫شد كه امروزه این مسئله وجود ندارد‪.‬‬

‫ تابع خواندن از ورودی‬7-6-2
#include
void main() {
int age;
float average ;
printf("Please enter your age and average : ");
scanf("%d %f",&age,&average);
printf("You are %d years old and your average is %5.2f \n",age,average);
}

Please enter your age and average : 19 16.72
You are 19 years old and your average is 16.72

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫زبان ‪ C++‬یک زبان شی گرا است‪ ،‬بهمین دلیل در این زبان برای ورودی‬
‫و خروجی از اشیاء بجای توابع استفاده می گردد‪.‬‬
‫از آنجا که امروزه معموال برنامه نویسان ‪ C‬از کامپایلرهای ‪ C++‬استفاده‬
‫می کنند‪ ،‬می توانند از اشیای ورودی و خروجی آن نیز استفاده کنند‪.‬‬
‫اینکار در بین بسیاری از برنامه نویسان ‪ C‬متداول است‪ ،‬بهمین دلیل ما‬
‫در اینجا نحوه کار با اشیای خواندن و نوشتن در ‪ C++‬را بطور مقدماتی‬
‫توضیح می دهیم؛ گرچه توضیح کامل این موارد نیاز به آشنایی با شی‬
‫گرایی و زبان ‪ C++‬دارد‪.‬‬
‫قبل از هرچیز الزم به ذکر است که کلیه اشیای مربوط به ورودی و‬
‫خروجی در فایل سرآمدی بنام ‪ iostream.h‬تعیریف شده اند‪ ،‬بنابراین‬
‫ابتدا باید این فایل به برنامه توسط دستور ‪ #include‬الحاق گردد‪.‬‬

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫زبان ‪ C++‬برای نمایش اطالعات از یک شیئ بنام ‪ cout‬استفاده می نماید‪.‬‬
‫برای ارسال اطالعات مورد نظر برای چاپ به ‪ cout‬باید از عملگر درج در جریان‬
‫یا >> استفاده نماییم‪ .‬بعنوان مثال ‪:‬‬
‫; ” ‪cout >> “Please enter your name:‬‬
‫و یا مثال دیگر ‪:‬‬
‫;‪int a = 10‬‬
‫;‪float b = 2.86‬‬
‫;‪cout << a‬‬
‫;‪cout << b‬‬
‫نکته جالبی که در این مثالها دیده می شود‪ ،‬آنستکه برخالف تابع ‪ printf‬هیچ‬
‫نیازی به مشخص کردن نوع متغیری که قصد چاپ آن را داریم نیست و خود‬
‫شئ ‪ cout‬نوع آن را تشخیص می دهد‪.‬‬
‫عالوه براین می توان چندین عملگر درج در جریان را با یکدیگر الحاق کرد و‬
‫چندین متغیر را با یک دستور چاپ کرد‪.‬‬

C++ ‫ ورودی و خروجی اطالعات در‬7-6-3
#include
void main() {
int age = 20;
floate average = 18.23;
cout >> “You are ” >> age >> “ years old and your average is ” >> average ;
}

You are 20 years old and your average is 18.230000

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای دریافت اطالعات از کاربر‪ ،‬از شئ دیگری بنام ‪ cin‬استفاده می شود‪.‬‬
‫برای ارسال متغیر مورد نظر به ‪ cin‬باید از عملگر استخراج از جریان یا <<‬
‫استفاده نماییم‪ .‬بعنوان مثال‪:‬‬
‫;‪int a‬‬
‫;‪cin >> a‬‬
‫بازهم همانطور که می بینید نیازی به تعیین نوع متغیر موردنظر نیست و خود‬
‫شئ ‪ cin‬نوع متغیر را بطور اتوماتیک تشخیص داده و داده ای از همان نوع را از‬
‫کاربر دریافت و در متغیر مورد نظر قرار می دهد‪.‬‬
‫عملگرهای استخراج از جریان را نیز می توان با یکدیگر الحاق کرد‪.‬‬
‫برای رفتن به خط بعد در شئ ‪ cout‬می توان از دستکاری کننده ‪ endl‬استفاده‬
‫کرد‪ .‬مثال در دستور زیر پس از چاپ پیغام‪ ،‬مکان نما به خط بعد منتقل می‬
‫شود‪:‬‬
‫;‪cout >> “List of students : “ >> endl‬‬
‫البته دستکاری کننده های متعدد دیگری نیز ازجمله موارد مربوط به تعیین طول‬
‫میدان و نحوه چاپ مقادیر وجود دارد که توضیح آنها نیاز به یک مبحث مستقل‬
‫دارد‪.‬‬

C++ ‫ ورودی و خروجی اطالعات در‬7-6-3
#include
void main() {
int age;
float average ;
cout << "Please enter your age and average : " ;
cin >> age >> average ;
cout << "You are " << age << "years old and your average is " << average;
}

Please enter your age and average : 19 16.72
You are 19 years old and your average is 16.72

‫‪ 7-7‬توابع کتابخانه ای‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫همانطور که قبال نیز گفته شد‪ ،‬زبان ‪ C‬از زیر برنامه ها نیز حمایت می کند‪ .‬هر زیر برنامه‬
‫در ‪ C‬یک تابع نامیده می شود‪ .‬تا کنون با توابعی همچون ‪ main‬و یا ‪ printf‬و ‪ scanf‬آشنا‬
‫شده ایم‪.‬‬
‫معموال عرضه کنندگان کامپایلرها و یا سایر فروشندگان نرم افزار‪ ،‬برخی از توابع عمومی‬
‫را که ممکن است مورد نیاز جمع کثیری از برنامه نویسان مختلف باشد را در قالب‬
‫کتابخانه ای از توابع در اختیار برنامه نویسان می گذارند‪ .‬بعضی از این توابع کتابخانه ای‬
‫مانند ‪ printf‬و ‪ scanf‬بصورت استاندارد درآمده و توسط عرضه کنندگان مختلف ارائه می‬
‫شوند‪.‬‬
‫در کامپایلر عرضه شده توسط شرکت بورلند )‪ (Borland C++ 3.1‬نیز کتابخانه های‬
‫متعددی از توابع برای شما عرضه شده اند که بتدریج با آنها و کاربردشان آشنا خواهید‬
‫شد‪.‬‬
‫نکته مهم آنستکه برای استفاده از این توابع ابتدا باید فایل سرآمد مربوط به آنها را نیز در‬
‫ابتدای برنامه خود اضافه نمایید ) با استفاده از ‪ .(#include‬هر فایل سرآمد شامل تعاریف‬
‫اولیه گروهی از توابع مرتبط با هم و داده های مربوط به آنها بوده و در استاندارد قدیمی‬
‫تر دارای پسوند ‪ .h‬می باشد)در استاندارد جدید پسوند این فایلها حذف شده است(‪.‬‬
‫برخی از این فایلهای سرآمد عبارتند از‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪ : stdio.h‬توابع ورودی و خروجی استاندارد‬
‫‪ : math.h‬توابع ریاضی‬
‫‪ : graphics.h‬توابع مربوط به عملیات گرافیکی‬
‫‪ : string.h‬توابع مربوط به کار با رشته ها‬


Slide 32

‫مبانی کامپیوتر و برنامه سازی‬
‫فصل هفتم ‪ :‬مفاهیم اولیه زبان ‪C‬‬
‫مدرس ‪ :‬نگین معروفی‬

‫‪ 7-1‬شناسه ها در ‪C‬‬
‫‪‬‬
‫‪‬‬

‫شناسه )‪ (identifier‬نامی است که به یک قسمت از برنامه مانند متغیر‪ ،‬تابع‪ ،‬ثابت و یا‬
‫‪ ...‬داده می شود‪.‬‬
‫در زبان ‪ C‬برای انتخاب شناسه ها فقط می توان از عالئم زیر استفاده کرد‪:‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫حروف انگلیسی کوچک و بزرگ )‪(A…Z a…z‬‬
‫ارقام )‪(0…9‬‬
‫عالمت خط پایین یا _‬

‫البته یک شناسه نمی تواند با یک رقم شروع شود‪.‬‬
‫چند شناسه مجاز‪ name2 ، average ، sum :‬و ‪student_average‬‬
‫چند شناسه غیرمجاز ‪ 2name‬و یا ‪student average‬‬
‫در برنامه نویسی امروزی پیشنهاد می شود بجای شناسه هایی همانند‬
‫‪ student_average‬از ‪ studentAverage‬استفاده گردد‪.‬‬
‫نکته مهم دیگری که باید به آن اشاره کرد آنستکه زبان ‪ C‬برخالف بسیاری از زبانهای دیگر‬
‫به کوچک و بزرگی حروف حساس است )‪ .(case sensitive‬در نتیجه شناسه های زیر با‬
‫یکدیگر متفاوتند ‪:‬‬
‫‪Sum ≠ sum ≠ SUM‬‬
‫آخرین نکته اینستکه در هنگام انتخاب شناسه نمی توانید از کلمات کلیدی که برای‬
‫منظورهای خاص در زبان ‪ C‬رزرو شده اند استفاده کنید‪.‬‬

C ‫ شناسه ها در‬7-1
: C ‫کلمات کلیدی در زبان‬
auto

break

case

char

const

continue

default

do

double

else

enum

extern

float

for

goto

if

int

long

register

return

short

signed

sizeof

static

struct

switch

typedef

union

unsigned

void

volatile

while

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫محدوده‬

‫اندازه )بیت(‬

‫توضیح‬

‫نوع داده‬

‫‪-128 to +127‬‬

‫‪8‬‬

‫کاراکتر‬

‫‪char‬‬

‫‪-32768 to +32767‬‬

‫‪16‬‬

‫عدد صحیح‬

‫‪int‬‬

‫‪3.4e-38 to 3.4e+38‬‬

‫‪32‬‬

‫عدد اعشاری‬

‫‪float‬‬

‫‪1.7e-308 to 1.7e+308‬‬

‫‪64‬‬

‫عدد اعشاری با‬
‫دقت مضاعف‬

‫‪double‬‬

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫‪‬‬

‫البته چند نکته مهم درمورد این جدول قابل ذکر است ‪:‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫اندازه ‪ int‬در محیطهای ‪ 16‬بیتی مانند ‪ DOS‬برابر ‪ 16‬بیت است‪ .‬اما در‬
‫محیطهای ‪ 32‬بیتی همانند ‪ Windows‬اندازه آن ‪ 32‬بیت می باشد که در‬
‫اینصورت محدوده ای برابر ‪ -2,147,483,648‬تا ‪ +2,147,483,647‬را‬
‫پوشش می دهد‪.‬‬
‫در بعضی از کامپایلرهای ‪ ،C‬نوع داده ‪ bool‬نیز وجود دارد که می تواند‬
‫یکی از مقادیر ‪)true‬درست( یا ‪) false‬غلط( را نشان دهد ‪ .‬اما در نسخه‬
‫های اولیه ‪ C‬از همان نوع داده صحیح یا ‪ int‬برای اینکار استفاده می‬
‫شد‪ .‬بدین صورت که ‪ 0‬نشاندهنده ‪ false‬و هر عدد غیر صفر )معموال ‪(1‬‬
‫نشاندهنده ‪ true‬است‪.‬‬
‫از آنجا که برای ذخیره سازی کاراکترها کد اسکی آنها ذخیره می گردد‪،‬‬
‫از یک متغیر کاراکتری یا ‪ char‬می توان بعنوان یک عدد صحیح کوچک نیز‬
‫استفاده کرد و اعمال ریاضی برروی آنها نیز مجاز است‪.‬‬

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫عالوه براین چندین اصالح کننده نیز وجود دارد که به ما اجازه می دهد نوع داده مورد‬
‫نظر را با دقت بیشتری برای نیازهای مختلف استفاده نماییم‪.‬‬
‫این اصالح کننده ها عبارتند از ‪short, long, signed, unsigned :‬‬
‫تمام این اصالح کننده ها می توانند به نوع داده ‪ int‬اعمال شوند و اثر آنها بستگی‬
‫به محیط دارد‪.‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫در یک محیط ‪16‬بیتی‪short int ،‬بازهم برابر ‪16‬بیت است ولی ‪ long int‬برابر‪32‬بیت می‬
‫باشد‪.‬‬
‫‪ unsigned int‬باعث می شود که یک عدد ‪ 16‬بیتی بدون عالمت داشته باشیم که بازه‬
‫بین ‪ 0‬تا ‪ 65535‬را پوشش می دهد‪ signed int .‬نیز همانند ‪ int‬معمولی بوده و تفاوتی‬
‫ندارد‪.‬‬
‫ترکیب این اصالح کننده ها نیز ممکن است‪ .‬مثال ‪ unsigned long int‬یک عدد ‪ 32‬بیتی‬
‫بدون عالمت است که بازه ‪ 0‬تا ‪ 4,294,967,295‬را پوشش می دهد‪.‬‬

‫برروی نوع داده ‪ char‬فقط اصالح کننده های ‪ signed‬و ‪ unsigned‬را می توان اعمال‬
‫کرد‪ .‬معموال از اصالح کننده ‪ unsigned‬وقتی استفاده می شود که قصد داشته‬
‫باشیم از ‪ char‬بعنوان یک عدد صحیح مثبت بین ‪ 0‬تا ‪ 255‬استفاده کنیم‪.‬‬
‫برروی نوع داده ‪ double‬تنها اصالح کننده ‪ long‬قابل اعمال است و دراینصورت عدد‬
‫اعشاری با ‪ 80‬بیت را خواهیم داشت که قادر است هر عددی در بازه ‪ 3.4e-4932‬تا‬
‫‪ 1.1e+4932‬را در خود نگاه دارد‪.‬‬

‫‪ 7-3‬تعریف متغیرها‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای تعریف متغیرها به شکل زیر عمل می کنیم‪:‬‬

‫;>‪ ‫که ‪ type‬یکی از نوع داده های گفته شده و ‪ variable-list‬لیستی از متغیرها است‬
‫که با کاما از یکدیگر جدا شده اند‪ .‬بعنوان مثال ‪:‬‬
‫;‪int sum‬‬
‫;‪float average‬‬
‫; ‪long int a, b, c‬‬
‫; ‪unsigned long int i, j, k‬‬
‫عالوه براین می توان در هنگام تعریف متغیر به آن مقدار اولیه نیز داد‪ .‬مثال ‪:‬‬
‫; ‪int d = 0‬‬
‫نكته مهم آنكه زبان ‪ C‬به متغیرها مقدار اولیه نمي دهد )حتي ‪ (0‬و برنامه نويس‬
‫خود بايد اينكار را صريحا انجام دهد‪ ،‬درغیر اينصورت مقدار اولیه متغیر‪ ،‬نامعین خواهد‬
‫بود‪.‬‬
‫تعریف متغیرها طبق اصول زبان ‪ C‬میتواند درهرجایی از برنامه صورت پذیرد‪ ،‬و‬
‫متغیرهای تعریف شده از همان خط به بعد قابل استفاده خواهد بود‪ .‬اما معموال‬
‫توصیه می گردد كه تعریف متغیرها در همان خط ابتدایی تابع و بالفاصله پس از {‬
‫صورت پذیرد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫‪‬‬
‫‪‬‬

‫ثابتها مقادیر ثابتی هستند كه مقدار آنها در حین اجرای برنامه تغییر نمی یابد‪ .‬ثابتها می توانند از‬
‫هریك از نوع داده های اصلی باشند‪.‬‬
‫ثوابت عددی صحیح ‪:‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫برای نمایش این دسته از ثوابت‪ ،‬از دنباله ای از ارقام بعالوه عالمت ‪ +‬یا ‪ -‬استفاده می كنیم‪ .‬بعنوان مثال‬
‫‪ -45‬و یا ‪ 3489‬ثوابت صحیح هستند‪.‬‬
‫در حالت عادی ‪ C‬هر عدد را در كوچكترین نوع داده ای كه می تواند قرار می دهد‪ .‬مثال عدد ‪ 85‬در یك‬
‫‪ int‬قرار می گیرد‪ ،‬اما عدد ‪ 145398‬در یك ‪ long int‬قرار خواهد گرفت‪.‬‬
‫اگر قصد دارید یك عدد كوچك بعنوان ‪ long‬محسوب گردد‪ ،‬می توانید از پسوند ‪ L‬در انتهای آن استفاده‬
‫می كنیم‪ .‬مثال ‪245L‬یك عدد ‪ long‬محسوب می شود‪.‬‬
‫;‪long int a = 20L‬‬
‫پسوند ‪ U‬در انتهای عدد نیز نشانه بدون عالمت بودن آن است‪.‬‬
‫نكته دیگر آنكه ‪ C‬به شما اجازه می دهد درصورت لزوم ثوابت صحیح خود را در مبنای ‪ 8‬یا ‪ 16‬نیز كه‬
‫از مبناهای متداول در برنامه نویسی هستند‪ ،‬بنویسید‪.‬‬
‫‪‬‬
‫‪‬‬

‫برای نوشتن عدد در مبنای ‪ 8‬باید آن را با ‪ 0‬آغاز كنید‪ ،‬مثال ‪ 0342‬یك عدد در منای ‪ 8‬محسوب می‬
‫گردد‪.‬‬
‫برای نوشتن یك عدد در مبنای ‪ 16‬باید آن را با ‪ 0x‬آغاز نمایید‪ ،‬مانند ‪.0x27A4‬‬

‫‪ 7-4‬ثوابت‬
‫ثوابت عددی اعشاری‬

‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫برای نمایش اعداد اعشاری‪ ،‬باید از نقطه اعشار استفاده كنیم‪ ،‬مانند ‪237.45‬‬
‫اما نكته جالب آنستكه می توانید از نماد علمی نیز برای نمایش اعداد‬
‫اعشاری استفاده كنید‪ .‬برای اینكار كافی است از حرف ‪ e‬برای نمایش قسمت‬
‫توان استفاده نمایید‪ .‬بعنوان مثال ‪:‬‬
‫‪-23.47 × 10 5 = -23.47e5‬‬
‫‪42.389 × 10 -3 = 42.389e-3‬‬
‫دقت كنید كه قسمت توان‪ ،‬حتما یك عدد صحیح است‪.‬‬
‫نكته جالب اینجاست كه برخالف مورد قبل‪ ،‬كامپایلر بطور پیش فرض داده های‬
‫اعشاری را از نوع ‪ double‬فرض می كند‪.‬چنانچه دوست دارید ثابت شما ازنوع‬
‫‪ float‬درنظر گرفته شود‪ ،‬در انتهای آن ‪ F‬قرار دهید‪ .‬ضمنا پسوند ‪ L‬نیز داده‬
‫اعشاری را از نوع ‪ long double‬درنظر می گیرد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫ثوابت كاراكتری ‪:‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫برای نشان دادن ثوابت كاراكتری‪ ،‬آنها را در داخل ' قرار می دهیم‪ .‬بعنوان مثال‬
‫'‪'A‬یك ثابت كاراكتری است‪.‬‬
‫; '‪char ch = 'S‬‬
‫دقت كنید كه همانطور كه قبال گفته شد‪ ،‬كد اسكی كاراكترها در متغیر ذخیره‬
‫می گردد‪ ،‬بنابراین می توان از آن بعنوان یك عدد صحیح نیز استفاده كرد‪ .‬نكته‬
‫مهم دیگر آنستكه به تفاوت عدد ‪ 5‬و كاراكتر '‪ '5‬دقت داشته باشید‪ .‬در حقیقت‬
‫'‪ '5‬برابر است با عدد ‪ 53‬كه همان كد اسكی آن است‪.‬‬
‫روش فوق‪ ،‬برای نمایش کاراکترهای قابل چاپ مناسب است‪ ،‬اما بعضی‬
‫كاراكترها مانند ‪ enter‬قابل نمایش نبوده و برای آنها شکل خاصی وجود ندارد‪.‬‬
‫در چنین مواردی‪ ،‬زبان ‪ C‬از ترکیب عالمت \ به همراه یک کاراکتر دیگر‪ ،‬برای‬
‫نمایش این قبیل کاراکترها استفاده می نماید‪ .‬بعنوان مثال‪ ،‬کاراکتر '‪ '\n‬نشان‬
‫دهنده خط جدید یا همان ‪ enter‬می باشد‪.‬‬
‫جدول صفحه بعد این قبیل کاراکترها و معادل آنها را نشان می دهد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫نحوه نمایش در ‪C‬‬

‫کد اسکی‬

‫صدای بوق کامپیوتر‬

‫‪\a‬‬

‫‪7‬‬

‫حرکت به عقب ‪backspace‬‬

‫‪\b‬‬

‫‪8‬‬

‫شروع صفحه ‪form feed‬‬

‫‪\f‬‬

‫‪12‬‬

‫سطر جدید ‪line feed‬‬

‫‪\n‬‬

‫‪10‬‬

‫برگشت به ابتداي سطر ‪carriage return‬‬

‫‪\r‬‬

‫‪13‬‬

‫فاصله افقی ‪horizontal tab‬‬

‫‪\t‬‬

‫‪9‬‬

‫فاصله عمودی ‪vertical tab‬‬

‫‪\v‬‬

‫‪11‬‬

‫عالمت سوال‬

‫?\‬

‫‪63‬‬

‫عالمت '‬

‫'\‬

‫‪39‬‬

‫عالمت "‬

‫"\‬

‫‪34‬‬

‫عالمت \‬

‫\\‬

‫‪92‬‬

‫عالمت تهی‬

‫‪\0‬‬

‫‪0‬‬

‫نام کاراکتر‬

‫کد اسکی یک کاراکتر با ‪ 3‬رقم در مبنای ‪8‬‬

‫‪\000‬‬

‫کد اسکی یک کاراکتر با ‪ 2‬رقم در مبنای ‪16‬‬

‫‪\x00‬‬

‫‪ 7-4‬ثوابت‬
‫‪‬‬

‫ثوابت رشته ای ‪ C :‬عالوه بر ثوابت فوق‪ ،‬از یك ثابت دیگر بنام رشته نیز‬
‫حمایت می كند‪ .‬رشته‪ ،‬دنباله ای از كاراكترها است كه در داخل " قرار‬
‫می گیرند‪ .‬بعنوان مثال "‪ "this is a test‬یك رشته است‪ .‬دقت كنید كه '‪'a‬‬
‫یك كاراكتر است‪ ،‬اما "‪ "a‬یك رشته است كه فقط شامل یك كاراكتر می‬
‫باشد‪.‬‬

‫‪ 7-5‬عملگرها‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫عملگر‪ ،‬نمادی است كه به كامپایلر می گوید تا عملیات محاسباتی یا‬
‫منطقی خاصی را برروی یك یا چند عملوند‪ ،‬انجام دهد‪.‬‬
‫به عملگرهایی كه فقط یك عملوند دارند‪ ،‬عملگر یكانی می گوییم و‬
‫همواره عملگر در سمت چپ عملوند قرار می گیرد)مانند عدد ‪.(-125‬‬
‫اما عملگرهایی كه برروی دو عملوند اثر می كنند را عملگر دودویی‬
‫نامیده و عملگر را بین دو عملوند قرار می دهیم )مانند ‪.(23+86‬‬
‫هر ترکیب درستی از عملگرها و عملوندها را یک عبارت می نامیم‪.‬‬
‫‪ C‬از نقطه نظر عملگرها یك زبان بسیار قوی است‪ .‬این عملگرها به چند‬
‫دسته اصلی تقسیم می گردند كه آنها را به ترتیب بررسی می كنیم‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫این عملگرها‪ ،‬همان اعمال متداول ریاضی هستند كه در زبان ‪ C‬مورد استفاده‬
‫قرار می گیرند‪ .‬این اعمال عبارتند از ‪:‬‬

‫عمل‬

‫نوع‬

‫عملگر‬

‫منفی كردن عملوند سمت راست‬

‫یكانی‬

‫‪-‬‬

‫جمع دو عملوند‬

‫دودویی‬

‫‪+‬‬

‫تفریق دو عملوند‬

‫دودویی‬

‫‪-‬‬

‫ضرب دو عملوند‬

‫دودویی‬

‫*‬

‫تقسیم دو عملوند‬

‫دودویی‬

‫‪/‬‬

‫محاسبه باقیمانده تقسیم دو عملوند‬

‫دودویی‬

‫‪%‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬
‫‪‬‬

‫این عملگرهای برروی همه انواع داده های ‪ C‬عمل می كنند‪ ،‬بجز عملگر ‪ %‬كه فقط‬
‫برروی نوع داده های صحیح عمل می كند‪.‬‬
‫اما نكته مهمی كه باید به آن اشاره كرد‪ ،‬نحوه كار عملگر تقسیم برروی نوع داده های‬
‫مختلف است‪.‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫درصورتیكه هردو عملوند صحیح باشند‪ ،‬تقسیم بصورت صحیح بر صحیح انجام خواهد شد‪.‬‬
‫اگر یكی یا هر دو عملوند اعشاری باشند‪ ،‬تقسیم بصورت اعشاری انجام خواهد پذیرفت‪.‬‬
‫فرض كنید تعاریف زیر را داریم ‪:‬‬
‫; ‪int a,b‬‬
‫; ‪float c,d‬‬
‫; ‪a = 10 ; b = 4‬‬
‫;‪c = 8.2; d = 4.0‬‬
‫اكنون به نتایج عملیات زیر دقت كنید ‪:‬‬
‫‪a / b => 2‬‬
‫‪c / d => 2.05‬‬
‫‪a / d => 2.5‬‬
‫‪a / 4 => 2‬‬
‫چنانچه به آخرین مورد توجه كنید‪ ،‬متوجه می شوید كه از آنجا كه ‪a‬یك متغیر صحیح است و ‪4‬‬
‫نیز یك ثابت صحیح در نظر گرفته شده‪ ،‬درنتیجه تقسیم بصورت صحیح بر صحیح انجام گرفته‬
‫است‪ .‬چنانچه بخواهیم تقسیم بصورت اعشاری صورت پذیرد‪ ،‬به دو شكل می توانیم عمل‬
‫كنیم‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫برای اینکه عبارت تقسیم صفحه قبل بصورت اعشاری انجام شود‪ ،‬به دو روش‬
‫می توان عمل کرد‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫این عبارت را بصورت ‪ a / 4.0‬بنویسیم‪.‬‬
‫از عملگر قالب ریزی استفاده كنیم‪.‬‬

‫عملگر قالب ریزی می تواند یك نوع را به نوع دیگری تبدیل نماید‪ .‬شكل كلی آن‬
‫به شكل زیر است ‪:‬‬
‫>‪() ‫كه ‪ type‬نوع مورد نظر است كه قصد تبدیل عبارت ‪ expression‬به آن نوع را‬
‫داریم‪ .‬بعنوان مثال در مورد قبلی می توان به شكل زیر عمل كرد ‪:‬‬
‫‪(float) a / 4‬‬
‫در این حالت از كامپایلر خواسته ایم كه ابتدا عدد ‪ a‬را به اعشاری تبدیل كند‬
‫)البته بصورت موقت( و سپس آن را بر ‪ 4‬تقسیم نماید‪ ،‬كه مسلما حاصل‬
‫اعشاری خواهد بود‪.‬‬
‫بطوركلی هرگاه ثابتها و متغیرهایی از انواع مختلف در یك عبارت محاسباتی‬
‫داشته باشیم‪ ،‬كامپایلر ‪ C‬همه آنها را به یك نوع یكسان كه همان بزرگترین‬
‫عملوند موجود است تبدیل خواهد كرد‪ .‬بعنوان مثال به مورد صفحه بعد دقت‬
‫كنید ‪:‬‬

‫ عملگرهای محاسباتی‬7-5-1
char ch;
int i;

float f;
double d;
result = (ch / i)
int

+

(f *d)

(f+i)
float

double

double

int

-

double

double

float

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫اولویت عملگرها ‪ :‬در عبارتی که شامل چندین عملگر است‪ ،‬کدامیک در‬
‫ابتدا اعمال خواهد گردید‪.‬‬
‫اولویت عملگرهای محاسباتی از باال به پایین بشرح زیر است‪:‬‬
‫‪ ‬عملگر یکانی –‬
‫‪ ‬عملگرهای * و ‪ /‬و ‪%‬‬
‫‪ ‬عملگرهای ‪ +‬و –‬
‫چنانچه اولویت دو عملگر یکسان باشد‪ ،‬این عملگرها از چپ به راست‬
‫محاسبه خواهند شد‪.‬‬
‫چنانچه بخواهیم یک عمل با اولویت پایین زودتر انجام شود‪ ،‬باید از پرانتز‬
‫استفاده کنیم‪ .‬بنابراین اولویت عملگر پرانتز از همه موارد فوق‬
‫بیشتراست‪ .‬در مورد پرانتزهای متداخل‪ ،‬ابتدا پرانتز داخلی محاسبه‬
‫می شود؛ اما در مورد پرانتزهای هم سطح‪ ،‬ابتدا پرانتز سمت چپتر‬
‫محاسبه می گردد‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫چند مثال در مورد اولویت عملگرها‬

‫ترتیب اجرای عملگرها‬

‫عبارت زبان ‪C‬‬

‫ابتدا عمل * و سپس عمل ‪+‬‬

‫‪b+c*d‬‬

‫ابتدا عمل ‪ +‬و سپس عمل *‬

‫‪(b + c) * d‬‬

‫ابتدا عمل ‪ /‬سپس عمل * و در انتها عمل ‪+‬‬

‫‪b+c/d*e‬‬

‫ابتدا عمل * سپس عمل ‪ /‬و در انتها عمل ‪+‬‬

‫)‪b + c / (d * e‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫یک مثال کامل در مورد اولویت عملگرها‬

‫‪result = a + b * (f – (g + b) / d) – c * (a – d) / e‬‬
‫‪6‬‬

‫‪1‬‬
‫‪7‬‬

‫‪2‬‬

‫‪8‬‬

‫‪3‬‬
‫‪4‬‬
‫‪5‬‬
‫‪9‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫در زبان ‪ C‬برای انتساب چندین عملگر وجود دارد‪ .‬ساده ترین عملگر انتساب‪ ،‬همان عملگر =‬
‫است که در بسیاری از زبانها استفاده می شود‪ .‬بعنوان مثال ‪:‬‬
‫;‪a = 5‬‬
‫;‪b = c + 2 * d‬‬
‫این عملگر باعث می شود که عبارت سمت راست در عبارت سمت چپ قرار گیرد‪.‬‬
‫توجه کنید که مقدار سمت چپ باید عبارتی باشد که بتوان به آن یک مقدار را نسبت داد‬
‫)مانند یک متغیر( که به آن ‪ Lvalue‬گفته می شود‪ ،‬بنابراین یک ثابت نمی تواند در سمت چپ‬
‫قرار گیرد‪.‬‬
‫نکته دیگر اینکه اولویت عملگر = از عملگرهای ریاضی کمتر است و درنتیجه ابتدا آن عملیات‬
‫انجام شده و در پایان حاصل در عبارت سمت چپ ریخته می شود‪.‬‬
‫الزم به ذکر است که در هنگام انتساب‪ ،‬درصورت لزوم نوع عبارت سمت راست به نوع عبارت‬
‫سمت چپ تبدیل می شود‪ .‬مثال‪:‬‬
‫;‪int a‬‬
‫;‪a = 2.5 * 5.0‬‬
‫که دراینصورت عدد ‪ 12‬در ‪ a‬ذخیره خواهد شد‪.‬‬
‫شرکت پذیری این عملگر از راست به چپ می باشد‪ ،‬بدین معنا که چنانچه چندین عملگر‬
‫نسبت دهی داشته باشیم‪ ،‬این عملگرها از راست به چپ محاسبه می شوند‪ .‬مثال پس از‬
‫اجرای دستور زیر‪ ،‬مقدار هر ‪ 3‬متغیر برابر ‪ 10‬خواهد شد‪.‬‬
‫;‪a = b = c = 10‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬

‫نکته جالب درمورد زبان ‪ C‬آنستکه دارای یک سری عملگرهای انتساب‬
‫خالصه شده است که باعث می شوند در بعضی موارد بتوانیم عبارات‬
‫کوتاهتری را بنویسیم‪ .‬این عملگرها عبارتند از ‪:‬‬
‫عملگرد‬

‫مثال‬

‫عبارت انتساب معادل‬

‫‪++‬‬

‫;‪a ++‬‬

‫;‪a = a + 1‬‬

‫‪--‬‬

‫;‪a --‬‬

‫;‪a = a – 1‬‬

‫=‪+‬‬

‫;‪a += 5‬‬

‫;‪a = a + 5‬‬

‫=‪-‬‬

‫;‪a -= 8‬‬

‫;‪a= a – 8‬‬

‫=*‬

‫;‪a *= 10‬‬

‫;‪a= a * 10‬‬

‫=‪/‬‬

‫;‪a /= 2‬‬

‫;‪a = a / 2‬‬

‫=‪%‬‬

‫;‪a %= 10‬‬

‫;‪a = a % 10‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬
‫‪‬‬

‫عملگر اول و دوم‪ ،‬عملگرهای یکانی هستند که بترتیب عملگر افزایش و عملگر کاهش‬
‫نامیده می شوند‪.‬‬
‫نکته جالب آنستکه این دو عملگر به دوصورت مورد استفاده قرار می گیرند‪.‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫در حالتی که از دستور ;‪ a ++‬استفاده شود به آن پس افزایش می گویند و بدین معناست که‬
‫ابتدا از مقدار فعلی ‪ a‬در عبارت موردنظر استفاده کن و سپس آن را افزایش بده‪.‬‬
‫اما دستور ;‪ ++ a‬که به آن پیش افزایش گفته می شود‪ ،‬ابتدا ‪ a‬را افزایش داده و سپس از آن‬
‫در عبارت استفاده می کند‪.‬‬
‫به برنامه زیر دقت کنید‪:‬‬

‫>‪#include ‫{ )(‪void main‬‬
‫; ‪int a ,b‬‬
‫;‪a=5‬‬
‫;‪b = a ++‬‬
‫;)‪printf(“a=%d and b=%d \n”,a,b‬‬
‫;‪a=5‬‬
‫;‪b = ++ a‬‬
‫;)‪printf(“a=%d and b=%d \n”,a,b‬‬
‫}‬
‫‪a=6 b=5‬‬
‫‪a=6 b=6‬‬

‫‪ 7-5-3‬عملگرهای مقایسه ای‬
‫‪‬‬

‫‪‬‬

‫این عملگرها دو عبارت را بایکدیگر مقایسه کرده و نتیجه را باز می گردانند‪.‬‬
‫نتیجه می تواند درست )‪ (true‬یا غلط )‪ (false‬باشد‪.‬‬
‫نتیجه این عملگرها یک عدد صحیح است که درصورت درست بودن ‪ 1‬و‬
‫درصورت غلط بودن ‪ 0‬باز می گردانند‪ .‬این عملگرها عبارتند از‪:‬‬
‫عملگر‬

‫مفهوم عملگر‬

‫مثال‬

‫<‬

‫بزرگتر )<(‬

‫‪a>b‬‬

‫>‬

‫کوچکتر )>(‬

‫‪a
‫=<‬

‫بزرگتر یا مساوی )≤(‬

‫‪a >= b‬‬

‫=>‬

‫کوچکتر یا مساوی )≥(‬

‫‪a <= b‬‬

‫==‬

‫مساوی )=(‬

‫‪a == b‬‬

‫=!‬

‫نامساوی )≠(‬

‫‪a != b‬‬

‫‪ 7-5-3‬عملگرهای مقایسه ای‬
‫‪‬‬

‫‪‬‬

‫نکته مهمی که باید به آن دقت کرد عملگر مساوی )==( است‪ ،‬چرا که یک‬
‫اشتباه بسیار متداول برنامه نویسان ‪ C‬استفاده اشتباه از عملگر انتساب‬
‫)=( بجای عملگر تساوی )==( است که باعث ایجاد خطا در برنامه می‬
‫شود‪.‬‬
‫اولویت این عملگرها از باال به پایین بشرح زیر است‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫عملگرهای <‪ <= ، > ،‬و =>‬
‫عملگرهای == و =!‬

‫الزم بذکر است که در هنگام مساوی بودن اولویت چند عملگر‪ ،‬این عملگرها‬
‫از چپ به راست محاسبه می گردند‪.‬‬

‫‪ 7-5-4‬عملگرهای منطقی‬
‫‪‬‬

‫این عملگرها به شما اجازه می دهند که شرطهای ساده ای را که با‬
‫استفاده از عملگرهای مقایسه ای ایجاد شده اند را با یکدیگر ترکیب نموده‬
‫و شرطهای پیچیده تری را بسازید‪ .‬این عملگرها عبارتند از ‪:‬‬
‫مثال‬

‫عملگر‬

‫مفهوم عملگر‬

‫نحوه کار‬

‫&&‬

‫‪ AND‬منطقی‬

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

‫‪a>0 && sw==1‬‬

‫||‬

‫‪ OR‬منطقی‬

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

‫‪a<=100 || b!=0‬‬

‫!‬

‫‪ NOT‬منطقی‬

‫اگر عملوند درست باشد‪ ،‬نادرست و‬
‫اگر نادرست باشد‪ ،‬درست برمی‬
‫گرداند‪.‬‬

‫)‪! (a==1 || b<10‬‬

‫‪ 7-5-5‬عملگر شرطی‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫گاهی الزم است که ابتدا یک شرط بررسی شده و سپس برمبنای نتیجه )درست یا نادرست بودن آن( یکی‬
‫از دو عبارت ممکن بازگردانده شود‪ .‬برای اینکار می توان از یک عملگر ‪3‬تایی )با ‪ 3‬عملوند( بنام عملگر‬
‫شرطی استفاده نمود‪.‬‬
‫شکل کلی این عملگر بصورت زیر است‪:‬‬
‫>عبارت‪> :<2‬عبارت‪> ?<1‬شرط<‬
‫نحوه کار بدینصورت است که درصورت درست بودن شرط‪ ،‬عبارت‪ 1‬و در غیراینصورت عبارت ‪ 2‬بازگردانده می‬
‫شود‪.‬‬
‫به عنوان مثال به دستور زیر توجه کنید‪:‬‬
‫که این عبارت معادل دستور زیر است‪:‬‬

‫‪‬‬

‫;‪a = (k<10) ? 100 : 50‬‬
‫;‪if (k<10) a=100‬‬
‫;‪else a=50‬‬

‫البته این عبارت به شکلهای پیچیده نیز می تواند مورد استفاده قرار گیرد‪ .‬مثال ‪:‬‬
‫;‪c += (a>0 && a<10) ? ++a : a/b‬‬
‫که معادل است با ‪:‬‬
‫{ )‪if (a>0 && a<10‬‬
‫;‪a= a + 1‬‬
‫;‪c = c + a‬‬
‫}‬
‫;‪else c = c + a/b‬‬

‫‪ 7-5-6‬اولویت عملگرها‬
‫عملگر‬

‫اولویت‬

‫شرکت پذیری‬

‫‪1‬‬

‫)(‬

‫از چپ به راست‬

‫‪2‬‬

‫‪- + ! -- ++‬‬

‫از راست به چپ‬

‫‪3‬‬

‫‪* / %‬‬

‫از چپ به راست‬

‫‪4‬‬

‫‪+ -‬‬

‫از چپ به راست‬

‫‪5‬‬

‫>> <<‬

‫از چپ به راست‬

‫‪6‬‬

‫>= > <= <‬

‫از چپ به راست‬

‫‪7‬‬

‫=! ==‬

‫از چپ به راست‬

‫‪8‬‬

‫&&‬

‫از چپ به راست‬

‫‪9‬‬

‫||‬

‫از چپ به راست‬

‫‪10‬‬

‫‪?:‬‬

‫از راست به چپ‬

‫‪11‬‬

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

‫از راست به چپ‬

‫‪12‬‬

‫‪,‬‬

‫از چپ به راست‬

‫‪ 7-6‬خواندن و نمایش اطالعات‬
‫‪‬‬

‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫همانطور كه قبال نیز گفته شد‪ ،‬یكی از اهداف زبان ‪ C‬قابل حمل بودن آن‬
‫است‪ .‬بهمین منظور سعی شده است كه از دستوراتی كه ممكن است‬
‫وابسته به ماشین خاصی باشد‪ ،‬اجتناب گردد‪.‬‬
‫بهمین دلیل زبان ‪ C‬برخالف سایر زبانها دارای هیچ دستوری برای‬
‫خواندن از ورودی و یا نوشتن در خروجی نیست‪.‬‬
‫اما در عوض دارای تعدادی تابع )زیربرنامه( استاندارد می باشد كه تقریبا‬
‫تمامی كامپایلرها از آنها حمایت می كنند‪.‬‬
‫این كار به كامپایلر این امكان را می دهد كه بر حسب نوع سخت افزار‬
‫موردنظر‪ ،‬توابع ورودی و خروجی را طراحی نماید‪.‬‬
‫این توابع در یك فایل سرآمد بنام ‪ stdio.h‬تعریف شده اند و بنابراین قبل‬
‫ازاینكه بتوانید از این توابع استفاده نمایید‪ ،‬باید این فایل را نیز با استفاده‬
‫از ‪ #include‬در برنامه خود بگنجانید‪.‬‬

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫برای نمایش اطالعات در خروجی از تابع ‪ printf‬استفاده می شود‪.‬‬
‫این تابع رشته موردنظر شما را به خروجی استاندارد )كه در حالت‬
‫عادی همان صفحه نمایش یا مانیتور است( می فرستد‪ .‬شكل كلی این‬
‫تابع بصورت زیر است‪:‬‬
‫; )>لیست متغیرها< ‪> ,‬رشته كنترلی<(‪printf‬‬
‫رشته كنترلی همان متنی است كه قصد چاپ آن را داریم‪ ،‬با ذكر این‬
‫نكته كه در قسمتهایی كه باید مقدار یك متغیر چاپ شود‪ ،‬از یك‬
‫مشخصه تبدیل استفاده می شود‪ .‬هر مشخصه تبدیل از یك عالمت ‪%‬‬
‫بعالوه یك كاراكتر كه نوع متغیر مورد نظر را نشان می دهد تشكیل می‬
‫گردد‪.‬‬
‫لیست متغیرها نیز همان متغیرهایی هستند كه قصد چاپ آنها را داریم‪.‬‬
‫این متغیرها باید بترتیب قرار گرفته و با كاما )‪ (,‬از یكدیگر جدا شوند‪.‬‬

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫مشخصه تبدیل‬

‫مفهوم‬

‫‪%c‬‬

‫كاراكتر‬

‫‪%d‬‬

‫عدد صحیح در مبنای ‪10‬‬

‫‪%f‬‬

‫عدد اعشاری بدون نماد علمی‬

‫‪%e‬‬

‫عدد اعشاری با نماد علمی‬

‫‪%g‬‬

‫عدد اعشاری با حالت كوتاهتر بین ‪ e‬و ‪f‬‬

‫‪%s‬‬

‫رشته‬

‫‪%ld‬‬

‫عدد صحیح بزرگ‬

‫‪%lf %le %lg‬‬

‫عدد اعشاری بزرگ‬

‫‪%o‬‬

‫عدد صحیح در مبنای ‪8‬‬

‫‪%x‬‬

‫عدد صحیحی در مبنای ‪16‬‬

‫‪%u‬‬

‫عدد صحیح بدون عالمت‬

‫ تابع نمایش در خروجی‬7-6-1
#include
void main() {
int age = 20;
floate average = 18.23;
printf("You are %d years old and your average is %f \n",age,average);
}
You are 20 years old and your average is 18.230000

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫‪‬‬
‫‪‬‬

‫برای کنترل نحوه چاپ اعداد می توانید از مشخصه طول میدان استفاده‬
‫کنید‪.‬‬
‫مشخصه طول میدان برای اعداد به شكل زیر استفاده می شود‪:‬‬
‫‪ ‬برای اعداد صحیح از ‪ %nd‬استفاده می كنیم كه ‪ n‬تعداد ارقام را نشان‬
‫می دهد )مثال ‪ .(%3d‬در اینصورت برای هر متغیر ‪ n‬رقم درنظر گرفته‬
‫می شود‪ .‬اگر اندازه عدد از ‪ n‬كوچكتر باشد‪ ،‬به سمت چپ آن فضای‬
‫خالی اضافه می شود و اگر اندازه عدد بیش از ‪ n‬رقم باشد‪ ،‬طول میدان‬
‫نادیده گرفته شده و عدد بطور كامل چاپ می شود‪.‬‬
‫‪ ‬برای اعداد اعشاری از ‪ %n.mf‬استفاده می كنیم كه ‪ n‬اندازه كل عدد‬
‫)شامل عالمت ممیز( و ‪ m‬تعداد ارقام اعشار است )مثال ‪ .(%5.2f‬در‬
‫صورتیكه تعداد ارقام اعشاری عدد موردنظر از ‪ m‬بیشتر باشد‪ ،‬عدد به ‪m‬‬
‫عدد اعشار گرد می شود و در صورتیكه از ‪ m‬كمتر باشد‪ ،‬در سمت‬
‫راست آن ‪ 0‬قرار داده می شود‪.‬‬

‫‪ 7-6-2‬تابع خواندن از ورودی‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای خواندن اطالعات از ورودی از تابع ‪ scanf‬استفاده می شود‪.‬‬
‫این تابع اطالعات را ازورودی استاندارد )معموال صفحه كلید( خوانده و در‬
‫متغیرهای تعیین شده قرار می دهد‪.‬‬
‫شكل كلی این تابع بصورت زیر است‪:‬‬
‫; )>لیست آدرسهای متغیرها< ‪> ,‬رشته كنترلی<(‪scanf‬‬
‫همانطور كه می بینید نحوه احضار تابع ‪ scanf‬نیز مشابه ‪ printf‬است‪ .‬تنها‬
‫تفاوت در آن است كه در ‪ scanf‬باید لیست آدرسهای متغیرها ارسال شود‪.‬‬
‫مبحث مربوط به آدرسها در فصول بعدی بررسی خواهد شد ولی در حال حاضر‬
‫بخاطر بسپارید كه برای بدست آوردن آدرس یك متغیر از عالمت & استفاده می‬
‫كنیم‪ .‬بعنوان مثال ‪ &age‬بمعنای آدرس متغیر ‪ age‬است‪.‬‬
‫بطور كلی در ‪ C‬قدیمی هرگاه كه یك تابع دارای پارامترهای خروجی بود )یعنی‬
‫پارامترهایی كه یك مقدار را باز می گرداندند( از آدرس متغیرها استفاده می‬
‫شد كه امروزه این مسئله وجود ندارد‪.‬‬

‫ تابع خواندن از ورودی‬7-6-2
#include
void main() {
int age;
float average ;
printf("Please enter your age and average : ");
scanf("%d %f",&age,&average);
printf("You are %d years old and your average is %5.2f \n",age,average);
}

Please enter your age and average : 19 16.72
You are 19 years old and your average is 16.72

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫زبان ‪ C++‬یک زبان شی گرا است‪ ،‬بهمین دلیل در این زبان برای ورودی‬
‫و خروجی از اشیاء بجای توابع استفاده می گردد‪.‬‬
‫از آنجا که امروزه معموال برنامه نویسان ‪ C‬از کامپایلرهای ‪ C++‬استفاده‬
‫می کنند‪ ،‬می توانند از اشیای ورودی و خروجی آن نیز استفاده کنند‪.‬‬
‫اینکار در بین بسیاری از برنامه نویسان ‪ C‬متداول است‪ ،‬بهمین دلیل ما‬
‫در اینجا نحوه کار با اشیای خواندن و نوشتن در ‪ C++‬را بطور مقدماتی‬
‫توضیح می دهیم؛ گرچه توضیح کامل این موارد نیاز به آشنایی با شی‬
‫گرایی و زبان ‪ C++‬دارد‪.‬‬
‫قبل از هرچیز الزم به ذکر است که کلیه اشیای مربوط به ورودی و‬
‫خروجی در فایل سرآمدی بنام ‪ iostream.h‬تعیریف شده اند‪ ،‬بنابراین‬
‫ابتدا باید این فایل به برنامه توسط دستور ‪ #include‬الحاق گردد‪.‬‬

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫زبان ‪ C++‬برای نمایش اطالعات از یک شیئ بنام ‪ cout‬استفاده می نماید‪.‬‬
‫برای ارسال اطالعات مورد نظر برای چاپ به ‪ cout‬باید از عملگر درج در جریان‬
‫یا >> استفاده نماییم‪ .‬بعنوان مثال ‪:‬‬
‫; ” ‪cout >> “Please enter your name:‬‬
‫و یا مثال دیگر ‪:‬‬
‫;‪int a = 10‬‬
‫;‪float b = 2.86‬‬
‫;‪cout << a‬‬
‫;‪cout << b‬‬
‫نکته جالبی که در این مثالها دیده می شود‪ ،‬آنستکه برخالف تابع ‪ printf‬هیچ‬
‫نیازی به مشخص کردن نوع متغیری که قصد چاپ آن را داریم نیست و خود‬
‫شئ ‪ cout‬نوع آن را تشخیص می دهد‪.‬‬
‫عالوه براین می توان چندین عملگر درج در جریان را با یکدیگر الحاق کرد و‬
‫چندین متغیر را با یک دستور چاپ کرد‪.‬‬

C++ ‫ ورودی و خروجی اطالعات در‬7-6-3
#include
void main() {
int age = 20;
floate average = 18.23;
cout >> “You are ” >> age >> “ years old and your average is ” >> average ;
}

You are 20 years old and your average is 18.230000

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای دریافت اطالعات از کاربر‪ ،‬از شئ دیگری بنام ‪ cin‬استفاده می شود‪.‬‬
‫برای ارسال متغیر مورد نظر به ‪ cin‬باید از عملگر استخراج از جریان یا <<‬
‫استفاده نماییم‪ .‬بعنوان مثال‪:‬‬
‫;‪int a‬‬
‫;‪cin >> a‬‬
‫بازهم همانطور که می بینید نیازی به تعیین نوع متغیر موردنظر نیست و خود‬
‫شئ ‪ cin‬نوع متغیر را بطور اتوماتیک تشخیص داده و داده ای از همان نوع را از‬
‫کاربر دریافت و در متغیر مورد نظر قرار می دهد‪.‬‬
‫عملگرهای استخراج از جریان را نیز می توان با یکدیگر الحاق کرد‪.‬‬
‫برای رفتن به خط بعد در شئ ‪ cout‬می توان از دستکاری کننده ‪ endl‬استفاده‬
‫کرد‪ .‬مثال در دستور زیر پس از چاپ پیغام‪ ،‬مکان نما به خط بعد منتقل می‬
‫شود‪:‬‬
‫;‪cout >> “List of students : “ >> endl‬‬
‫البته دستکاری کننده های متعدد دیگری نیز ازجمله موارد مربوط به تعیین طول‬
‫میدان و نحوه چاپ مقادیر وجود دارد که توضیح آنها نیاز به یک مبحث مستقل‬
‫دارد‪.‬‬

C++ ‫ ورودی و خروجی اطالعات در‬7-6-3
#include
void main() {
int age;
float average ;
cout << "Please enter your age and average : " ;
cin >> age >> average ;
cout << "You are " << age << "years old and your average is " << average;
}

Please enter your age and average : 19 16.72
You are 19 years old and your average is 16.72

‫‪ 7-7‬توابع کتابخانه ای‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫همانطور که قبال نیز گفته شد‪ ،‬زبان ‪ C‬از زیر برنامه ها نیز حمایت می کند‪ .‬هر زیر برنامه‬
‫در ‪ C‬یک تابع نامیده می شود‪ .‬تا کنون با توابعی همچون ‪ main‬و یا ‪ printf‬و ‪ scanf‬آشنا‬
‫شده ایم‪.‬‬
‫معموال عرضه کنندگان کامپایلرها و یا سایر فروشندگان نرم افزار‪ ،‬برخی از توابع عمومی‬
‫را که ممکن است مورد نیاز جمع کثیری از برنامه نویسان مختلف باشد را در قالب‬
‫کتابخانه ای از توابع در اختیار برنامه نویسان می گذارند‪ .‬بعضی از این توابع کتابخانه ای‬
‫مانند ‪ printf‬و ‪ scanf‬بصورت استاندارد درآمده و توسط عرضه کنندگان مختلف ارائه می‬
‫شوند‪.‬‬
‫در کامپایلر عرضه شده توسط شرکت بورلند )‪ (Borland C++ 3.1‬نیز کتابخانه های‬
‫متعددی از توابع برای شما عرضه شده اند که بتدریج با آنها و کاربردشان آشنا خواهید‬
‫شد‪.‬‬
‫نکته مهم آنستکه برای استفاده از این توابع ابتدا باید فایل سرآمد مربوط به آنها را نیز در‬
‫ابتدای برنامه خود اضافه نمایید ) با استفاده از ‪ .(#include‬هر فایل سرآمد شامل تعاریف‬
‫اولیه گروهی از توابع مرتبط با هم و داده های مربوط به آنها بوده و در استاندارد قدیمی‬
‫تر دارای پسوند ‪ .h‬می باشد)در استاندارد جدید پسوند این فایلها حذف شده است(‪.‬‬
‫برخی از این فایلهای سرآمد عبارتند از‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪ : stdio.h‬توابع ورودی و خروجی استاندارد‬
‫‪ : math.h‬توابع ریاضی‬
‫‪ : graphics.h‬توابع مربوط به عملیات گرافیکی‬
‫‪ : string.h‬توابع مربوط به کار با رشته ها‬


Slide 33

‫مبانی کامپیوتر و برنامه سازی‬
‫فصل هفتم ‪ :‬مفاهیم اولیه زبان ‪C‬‬
‫مدرس ‪ :‬نگین معروفی‬

‫‪ 7-1‬شناسه ها در ‪C‬‬
‫‪‬‬
‫‪‬‬

‫شناسه )‪ (identifier‬نامی است که به یک قسمت از برنامه مانند متغیر‪ ،‬تابع‪ ،‬ثابت و یا‬
‫‪ ...‬داده می شود‪.‬‬
‫در زبان ‪ C‬برای انتخاب شناسه ها فقط می توان از عالئم زیر استفاده کرد‪:‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫حروف انگلیسی کوچک و بزرگ )‪(A…Z a…z‬‬
‫ارقام )‪(0…9‬‬
‫عالمت خط پایین یا _‬

‫البته یک شناسه نمی تواند با یک رقم شروع شود‪.‬‬
‫چند شناسه مجاز‪ name2 ، average ، sum :‬و ‪student_average‬‬
‫چند شناسه غیرمجاز ‪ 2name‬و یا ‪student average‬‬
‫در برنامه نویسی امروزی پیشنهاد می شود بجای شناسه هایی همانند‬
‫‪ student_average‬از ‪ studentAverage‬استفاده گردد‪.‬‬
‫نکته مهم دیگری که باید به آن اشاره کرد آنستکه زبان ‪ C‬برخالف بسیاری از زبانهای دیگر‬
‫به کوچک و بزرگی حروف حساس است )‪ .(case sensitive‬در نتیجه شناسه های زیر با‬
‫یکدیگر متفاوتند ‪:‬‬
‫‪Sum ≠ sum ≠ SUM‬‬
‫آخرین نکته اینستکه در هنگام انتخاب شناسه نمی توانید از کلمات کلیدی که برای‬
‫منظورهای خاص در زبان ‪ C‬رزرو شده اند استفاده کنید‪.‬‬

C ‫ شناسه ها در‬7-1
: C ‫کلمات کلیدی در زبان‬
auto

break

case

char

const

continue

default

do

double

else

enum

extern

float

for

goto

if

int

long

register

return

short

signed

sizeof

static

struct

switch

typedef

union

unsigned

void

volatile

while

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫محدوده‬

‫اندازه )بیت(‬

‫توضیح‬

‫نوع داده‬

‫‪-128 to +127‬‬

‫‪8‬‬

‫کاراکتر‬

‫‪char‬‬

‫‪-32768 to +32767‬‬

‫‪16‬‬

‫عدد صحیح‬

‫‪int‬‬

‫‪3.4e-38 to 3.4e+38‬‬

‫‪32‬‬

‫عدد اعشاری‬

‫‪float‬‬

‫‪1.7e-308 to 1.7e+308‬‬

‫‪64‬‬

‫عدد اعشاری با‬
‫دقت مضاعف‬

‫‪double‬‬

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫‪‬‬

‫البته چند نکته مهم درمورد این جدول قابل ذکر است ‪:‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫اندازه ‪ int‬در محیطهای ‪ 16‬بیتی مانند ‪ DOS‬برابر ‪ 16‬بیت است‪ .‬اما در‬
‫محیطهای ‪ 32‬بیتی همانند ‪ Windows‬اندازه آن ‪ 32‬بیت می باشد که در‬
‫اینصورت محدوده ای برابر ‪ -2,147,483,648‬تا ‪ +2,147,483,647‬را‬
‫پوشش می دهد‪.‬‬
‫در بعضی از کامپایلرهای ‪ ،C‬نوع داده ‪ bool‬نیز وجود دارد که می تواند‬
‫یکی از مقادیر ‪)true‬درست( یا ‪) false‬غلط( را نشان دهد ‪ .‬اما در نسخه‬
‫های اولیه ‪ C‬از همان نوع داده صحیح یا ‪ int‬برای اینکار استفاده می‬
‫شد‪ .‬بدین صورت که ‪ 0‬نشاندهنده ‪ false‬و هر عدد غیر صفر )معموال ‪(1‬‬
‫نشاندهنده ‪ true‬است‪.‬‬
‫از آنجا که برای ذخیره سازی کاراکترها کد اسکی آنها ذخیره می گردد‪،‬‬
‫از یک متغیر کاراکتری یا ‪ char‬می توان بعنوان یک عدد صحیح کوچک نیز‬
‫استفاده کرد و اعمال ریاضی برروی آنها نیز مجاز است‪.‬‬

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫عالوه براین چندین اصالح کننده نیز وجود دارد که به ما اجازه می دهد نوع داده مورد‬
‫نظر را با دقت بیشتری برای نیازهای مختلف استفاده نماییم‪.‬‬
‫این اصالح کننده ها عبارتند از ‪short, long, signed, unsigned :‬‬
‫تمام این اصالح کننده ها می توانند به نوع داده ‪ int‬اعمال شوند و اثر آنها بستگی‬
‫به محیط دارد‪.‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫در یک محیط ‪16‬بیتی‪short int ،‬بازهم برابر ‪16‬بیت است ولی ‪ long int‬برابر‪32‬بیت می‬
‫باشد‪.‬‬
‫‪ unsigned int‬باعث می شود که یک عدد ‪ 16‬بیتی بدون عالمت داشته باشیم که بازه‬
‫بین ‪ 0‬تا ‪ 65535‬را پوشش می دهد‪ signed int .‬نیز همانند ‪ int‬معمولی بوده و تفاوتی‬
‫ندارد‪.‬‬
‫ترکیب این اصالح کننده ها نیز ممکن است‪ .‬مثال ‪ unsigned long int‬یک عدد ‪ 32‬بیتی‬
‫بدون عالمت است که بازه ‪ 0‬تا ‪ 4,294,967,295‬را پوشش می دهد‪.‬‬

‫برروی نوع داده ‪ char‬فقط اصالح کننده های ‪ signed‬و ‪ unsigned‬را می توان اعمال‬
‫کرد‪ .‬معموال از اصالح کننده ‪ unsigned‬وقتی استفاده می شود که قصد داشته‬
‫باشیم از ‪ char‬بعنوان یک عدد صحیح مثبت بین ‪ 0‬تا ‪ 255‬استفاده کنیم‪.‬‬
‫برروی نوع داده ‪ double‬تنها اصالح کننده ‪ long‬قابل اعمال است و دراینصورت عدد‬
‫اعشاری با ‪ 80‬بیت را خواهیم داشت که قادر است هر عددی در بازه ‪ 3.4e-4932‬تا‬
‫‪ 1.1e+4932‬را در خود نگاه دارد‪.‬‬

‫‪ 7-3‬تعریف متغیرها‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای تعریف متغیرها به شکل زیر عمل می کنیم‪:‬‬

‫;>‪ ‫که ‪ type‬یکی از نوع داده های گفته شده و ‪ variable-list‬لیستی از متغیرها است‬
‫که با کاما از یکدیگر جدا شده اند‪ .‬بعنوان مثال ‪:‬‬
‫;‪int sum‬‬
‫;‪float average‬‬
‫; ‪long int a, b, c‬‬
‫; ‪unsigned long int i, j, k‬‬
‫عالوه براین می توان در هنگام تعریف متغیر به آن مقدار اولیه نیز داد‪ .‬مثال ‪:‬‬
‫; ‪int d = 0‬‬
‫نكته مهم آنكه زبان ‪ C‬به متغیرها مقدار اولیه نمي دهد )حتي ‪ (0‬و برنامه نويس‬
‫خود بايد اينكار را صريحا انجام دهد‪ ،‬درغیر اينصورت مقدار اولیه متغیر‪ ،‬نامعین خواهد‬
‫بود‪.‬‬
‫تعریف متغیرها طبق اصول زبان ‪ C‬میتواند درهرجایی از برنامه صورت پذیرد‪ ،‬و‬
‫متغیرهای تعریف شده از همان خط به بعد قابل استفاده خواهد بود‪ .‬اما معموال‬
‫توصیه می گردد كه تعریف متغیرها در همان خط ابتدایی تابع و بالفاصله پس از {‬
‫صورت پذیرد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫‪‬‬
‫‪‬‬

‫ثابتها مقادیر ثابتی هستند كه مقدار آنها در حین اجرای برنامه تغییر نمی یابد‪ .‬ثابتها می توانند از‬
‫هریك از نوع داده های اصلی باشند‪.‬‬
‫ثوابت عددی صحیح ‪:‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫برای نمایش این دسته از ثوابت‪ ،‬از دنباله ای از ارقام بعالوه عالمت ‪ +‬یا ‪ -‬استفاده می كنیم‪ .‬بعنوان مثال‬
‫‪ -45‬و یا ‪ 3489‬ثوابت صحیح هستند‪.‬‬
‫در حالت عادی ‪ C‬هر عدد را در كوچكترین نوع داده ای كه می تواند قرار می دهد‪ .‬مثال عدد ‪ 85‬در یك‬
‫‪ int‬قرار می گیرد‪ ،‬اما عدد ‪ 145398‬در یك ‪ long int‬قرار خواهد گرفت‪.‬‬
‫اگر قصد دارید یك عدد كوچك بعنوان ‪ long‬محسوب گردد‪ ،‬می توانید از پسوند ‪ L‬در انتهای آن استفاده‬
‫می كنیم‪ .‬مثال ‪245L‬یك عدد ‪ long‬محسوب می شود‪.‬‬
‫;‪long int a = 20L‬‬
‫پسوند ‪ U‬در انتهای عدد نیز نشانه بدون عالمت بودن آن است‪.‬‬
‫نكته دیگر آنكه ‪ C‬به شما اجازه می دهد درصورت لزوم ثوابت صحیح خود را در مبنای ‪ 8‬یا ‪ 16‬نیز كه‬
‫از مبناهای متداول در برنامه نویسی هستند‪ ،‬بنویسید‪.‬‬
‫‪‬‬
‫‪‬‬

‫برای نوشتن عدد در مبنای ‪ 8‬باید آن را با ‪ 0‬آغاز كنید‪ ،‬مثال ‪ 0342‬یك عدد در منای ‪ 8‬محسوب می‬
‫گردد‪.‬‬
‫برای نوشتن یك عدد در مبنای ‪ 16‬باید آن را با ‪ 0x‬آغاز نمایید‪ ،‬مانند ‪.0x27A4‬‬

‫‪ 7-4‬ثوابت‬
‫ثوابت عددی اعشاری‬

‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫برای نمایش اعداد اعشاری‪ ،‬باید از نقطه اعشار استفاده كنیم‪ ،‬مانند ‪237.45‬‬
‫اما نكته جالب آنستكه می توانید از نماد علمی نیز برای نمایش اعداد‬
‫اعشاری استفاده كنید‪ .‬برای اینكار كافی است از حرف ‪ e‬برای نمایش قسمت‬
‫توان استفاده نمایید‪ .‬بعنوان مثال ‪:‬‬
‫‪-23.47 × 10 5 = -23.47e5‬‬
‫‪42.389 × 10 -3 = 42.389e-3‬‬
‫دقت كنید كه قسمت توان‪ ،‬حتما یك عدد صحیح است‪.‬‬
‫نكته جالب اینجاست كه برخالف مورد قبل‪ ،‬كامپایلر بطور پیش فرض داده های‬
‫اعشاری را از نوع ‪ double‬فرض می كند‪.‬چنانچه دوست دارید ثابت شما ازنوع‬
‫‪ float‬درنظر گرفته شود‪ ،‬در انتهای آن ‪ F‬قرار دهید‪ .‬ضمنا پسوند ‪ L‬نیز داده‬
‫اعشاری را از نوع ‪ long double‬درنظر می گیرد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫ثوابت كاراكتری ‪:‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫برای نشان دادن ثوابت كاراكتری‪ ،‬آنها را در داخل ' قرار می دهیم‪ .‬بعنوان مثال‬
‫'‪'A‬یك ثابت كاراكتری است‪.‬‬
‫; '‪char ch = 'S‬‬
‫دقت كنید كه همانطور كه قبال گفته شد‪ ،‬كد اسكی كاراكترها در متغیر ذخیره‬
‫می گردد‪ ،‬بنابراین می توان از آن بعنوان یك عدد صحیح نیز استفاده كرد‪ .‬نكته‬
‫مهم دیگر آنستكه به تفاوت عدد ‪ 5‬و كاراكتر '‪ '5‬دقت داشته باشید‪ .‬در حقیقت‬
‫'‪ '5‬برابر است با عدد ‪ 53‬كه همان كد اسكی آن است‪.‬‬
‫روش فوق‪ ،‬برای نمایش کاراکترهای قابل چاپ مناسب است‪ ،‬اما بعضی‬
‫كاراكترها مانند ‪ enter‬قابل نمایش نبوده و برای آنها شکل خاصی وجود ندارد‪.‬‬
‫در چنین مواردی‪ ،‬زبان ‪ C‬از ترکیب عالمت \ به همراه یک کاراکتر دیگر‪ ،‬برای‬
‫نمایش این قبیل کاراکترها استفاده می نماید‪ .‬بعنوان مثال‪ ،‬کاراکتر '‪ '\n‬نشان‬
‫دهنده خط جدید یا همان ‪ enter‬می باشد‪.‬‬
‫جدول صفحه بعد این قبیل کاراکترها و معادل آنها را نشان می دهد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫نحوه نمایش در ‪C‬‬

‫کد اسکی‬

‫صدای بوق کامپیوتر‬

‫‪\a‬‬

‫‪7‬‬

‫حرکت به عقب ‪backspace‬‬

‫‪\b‬‬

‫‪8‬‬

‫شروع صفحه ‪form feed‬‬

‫‪\f‬‬

‫‪12‬‬

‫سطر جدید ‪line feed‬‬

‫‪\n‬‬

‫‪10‬‬

‫برگشت به ابتداي سطر ‪carriage return‬‬

‫‪\r‬‬

‫‪13‬‬

‫فاصله افقی ‪horizontal tab‬‬

‫‪\t‬‬

‫‪9‬‬

‫فاصله عمودی ‪vertical tab‬‬

‫‪\v‬‬

‫‪11‬‬

‫عالمت سوال‬

‫?\‬

‫‪63‬‬

‫عالمت '‬

‫'\‬

‫‪39‬‬

‫عالمت "‬

‫"\‬

‫‪34‬‬

‫عالمت \‬

‫\\‬

‫‪92‬‬

‫عالمت تهی‬

‫‪\0‬‬

‫‪0‬‬

‫نام کاراکتر‬

‫کد اسکی یک کاراکتر با ‪ 3‬رقم در مبنای ‪8‬‬

‫‪\000‬‬

‫کد اسکی یک کاراکتر با ‪ 2‬رقم در مبنای ‪16‬‬

‫‪\x00‬‬

‫‪ 7-4‬ثوابت‬
‫‪‬‬

‫ثوابت رشته ای ‪ C :‬عالوه بر ثوابت فوق‪ ،‬از یك ثابت دیگر بنام رشته نیز‬
‫حمایت می كند‪ .‬رشته‪ ،‬دنباله ای از كاراكترها است كه در داخل " قرار‬
‫می گیرند‪ .‬بعنوان مثال "‪ "this is a test‬یك رشته است‪ .‬دقت كنید كه '‪'a‬‬
‫یك كاراكتر است‪ ،‬اما "‪ "a‬یك رشته است كه فقط شامل یك كاراكتر می‬
‫باشد‪.‬‬

‫‪ 7-5‬عملگرها‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫عملگر‪ ،‬نمادی است كه به كامپایلر می گوید تا عملیات محاسباتی یا‬
‫منطقی خاصی را برروی یك یا چند عملوند‪ ،‬انجام دهد‪.‬‬
‫به عملگرهایی كه فقط یك عملوند دارند‪ ،‬عملگر یكانی می گوییم و‬
‫همواره عملگر در سمت چپ عملوند قرار می گیرد)مانند عدد ‪.(-125‬‬
‫اما عملگرهایی كه برروی دو عملوند اثر می كنند را عملگر دودویی‬
‫نامیده و عملگر را بین دو عملوند قرار می دهیم )مانند ‪.(23+86‬‬
‫هر ترکیب درستی از عملگرها و عملوندها را یک عبارت می نامیم‪.‬‬
‫‪ C‬از نقطه نظر عملگرها یك زبان بسیار قوی است‪ .‬این عملگرها به چند‬
‫دسته اصلی تقسیم می گردند كه آنها را به ترتیب بررسی می كنیم‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫این عملگرها‪ ،‬همان اعمال متداول ریاضی هستند كه در زبان ‪ C‬مورد استفاده‬
‫قرار می گیرند‪ .‬این اعمال عبارتند از ‪:‬‬

‫عمل‬

‫نوع‬

‫عملگر‬

‫منفی كردن عملوند سمت راست‬

‫یكانی‬

‫‪-‬‬

‫جمع دو عملوند‬

‫دودویی‬

‫‪+‬‬

‫تفریق دو عملوند‬

‫دودویی‬

‫‪-‬‬

‫ضرب دو عملوند‬

‫دودویی‬

‫*‬

‫تقسیم دو عملوند‬

‫دودویی‬

‫‪/‬‬

‫محاسبه باقیمانده تقسیم دو عملوند‬

‫دودویی‬

‫‪%‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬
‫‪‬‬

‫این عملگرهای برروی همه انواع داده های ‪ C‬عمل می كنند‪ ،‬بجز عملگر ‪ %‬كه فقط‬
‫برروی نوع داده های صحیح عمل می كند‪.‬‬
‫اما نكته مهمی كه باید به آن اشاره كرد‪ ،‬نحوه كار عملگر تقسیم برروی نوع داده های‬
‫مختلف است‪.‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫درصورتیكه هردو عملوند صحیح باشند‪ ،‬تقسیم بصورت صحیح بر صحیح انجام خواهد شد‪.‬‬
‫اگر یكی یا هر دو عملوند اعشاری باشند‪ ،‬تقسیم بصورت اعشاری انجام خواهد پذیرفت‪.‬‬
‫فرض كنید تعاریف زیر را داریم ‪:‬‬
‫; ‪int a,b‬‬
‫; ‪float c,d‬‬
‫; ‪a = 10 ; b = 4‬‬
‫;‪c = 8.2; d = 4.0‬‬
‫اكنون به نتایج عملیات زیر دقت كنید ‪:‬‬
‫‪a / b => 2‬‬
‫‪c / d => 2.05‬‬
‫‪a / d => 2.5‬‬
‫‪a / 4 => 2‬‬
‫چنانچه به آخرین مورد توجه كنید‪ ،‬متوجه می شوید كه از آنجا كه ‪a‬یك متغیر صحیح است و ‪4‬‬
‫نیز یك ثابت صحیح در نظر گرفته شده‪ ،‬درنتیجه تقسیم بصورت صحیح بر صحیح انجام گرفته‬
‫است‪ .‬چنانچه بخواهیم تقسیم بصورت اعشاری صورت پذیرد‪ ،‬به دو شكل می توانیم عمل‬
‫كنیم‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫برای اینکه عبارت تقسیم صفحه قبل بصورت اعشاری انجام شود‪ ،‬به دو روش‬
‫می توان عمل کرد‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫این عبارت را بصورت ‪ a / 4.0‬بنویسیم‪.‬‬
‫از عملگر قالب ریزی استفاده كنیم‪.‬‬

‫عملگر قالب ریزی می تواند یك نوع را به نوع دیگری تبدیل نماید‪ .‬شكل كلی آن‬
‫به شكل زیر است ‪:‬‬
‫>‪() ‫كه ‪ type‬نوع مورد نظر است كه قصد تبدیل عبارت ‪ expression‬به آن نوع را‬
‫داریم‪ .‬بعنوان مثال در مورد قبلی می توان به شكل زیر عمل كرد ‪:‬‬
‫‪(float) a / 4‬‬
‫در این حالت از كامپایلر خواسته ایم كه ابتدا عدد ‪ a‬را به اعشاری تبدیل كند‬
‫)البته بصورت موقت( و سپس آن را بر ‪ 4‬تقسیم نماید‪ ،‬كه مسلما حاصل‬
‫اعشاری خواهد بود‪.‬‬
‫بطوركلی هرگاه ثابتها و متغیرهایی از انواع مختلف در یك عبارت محاسباتی‬
‫داشته باشیم‪ ،‬كامپایلر ‪ C‬همه آنها را به یك نوع یكسان كه همان بزرگترین‬
‫عملوند موجود است تبدیل خواهد كرد‪ .‬بعنوان مثال به مورد صفحه بعد دقت‬
‫كنید ‪:‬‬

‫ عملگرهای محاسباتی‬7-5-1
char ch;
int i;

float f;
double d;
result = (ch / i)
int

+

(f *d)

(f+i)
float

double

double

int

-

double

double

float

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫اولویت عملگرها ‪ :‬در عبارتی که شامل چندین عملگر است‪ ،‬کدامیک در‬
‫ابتدا اعمال خواهد گردید‪.‬‬
‫اولویت عملگرهای محاسباتی از باال به پایین بشرح زیر است‪:‬‬
‫‪ ‬عملگر یکانی –‬
‫‪ ‬عملگرهای * و ‪ /‬و ‪%‬‬
‫‪ ‬عملگرهای ‪ +‬و –‬
‫چنانچه اولویت دو عملگر یکسان باشد‪ ،‬این عملگرها از چپ به راست‬
‫محاسبه خواهند شد‪.‬‬
‫چنانچه بخواهیم یک عمل با اولویت پایین زودتر انجام شود‪ ،‬باید از پرانتز‬
‫استفاده کنیم‪ .‬بنابراین اولویت عملگر پرانتز از همه موارد فوق‬
‫بیشتراست‪ .‬در مورد پرانتزهای متداخل‪ ،‬ابتدا پرانتز داخلی محاسبه‬
‫می شود؛ اما در مورد پرانتزهای هم سطح‪ ،‬ابتدا پرانتز سمت چپتر‬
‫محاسبه می گردد‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫چند مثال در مورد اولویت عملگرها‬

‫ترتیب اجرای عملگرها‬

‫عبارت زبان ‪C‬‬

‫ابتدا عمل * و سپس عمل ‪+‬‬

‫‪b+c*d‬‬

‫ابتدا عمل ‪ +‬و سپس عمل *‬

‫‪(b + c) * d‬‬

‫ابتدا عمل ‪ /‬سپس عمل * و در انتها عمل ‪+‬‬

‫‪b+c/d*e‬‬

‫ابتدا عمل * سپس عمل ‪ /‬و در انتها عمل ‪+‬‬

‫)‪b + c / (d * e‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫یک مثال کامل در مورد اولویت عملگرها‬

‫‪result = a + b * (f – (g + b) / d) – c * (a – d) / e‬‬
‫‪6‬‬

‫‪1‬‬
‫‪7‬‬

‫‪2‬‬

‫‪8‬‬

‫‪3‬‬
‫‪4‬‬
‫‪5‬‬
‫‪9‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫در زبان ‪ C‬برای انتساب چندین عملگر وجود دارد‪ .‬ساده ترین عملگر انتساب‪ ،‬همان عملگر =‬
‫است که در بسیاری از زبانها استفاده می شود‪ .‬بعنوان مثال ‪:‬‬
‫;‪a = 5‬‬
‫;‪b = c + 2 * d‬‬
‫این عملگر باعث می شود که عبارت سمت راست در عبارت سمت چپ قرار گیرد‪.‬‬
‫توجه کنید که مقدار سمت چپ باید عبارتی باشد که بتوان به آن یک مقدار را نسبت داد‬
‫)مانند یک متغیر( که به آن ‪ Lvalue‬گفته می شود‪ ،‬بنابراین یک ثابت نمی تواند در سمت چپ‬
‫قرار گیرد‪.‬‬
‫نکته دیگر اینکه اولویت عملگر = از عملگرهای ریاضی کمتر است و درنتیجه ابتدا آن عملیات‬
‫انجام شده و در پایان حاصل در عبارت سمت چپ ریخته می شود‪.‬‬
‫الزم به ذکر است که در هنگام انتساب‪ ،‬درصورت لزوم نوع عبارت سمت راست به نوع عبارت‬
‫سمت چپ تبدیل می شود‪ .‬مثال‪:‬‬
‫;‪int a‬‬
‫;‪a = 2.5 * 5.0‬‬
‫که دراینصورت عدد ‪ 12‬در ‪ a‬ذخیره خواهد شد‪.‬‬
‫شرکت پذیری این عملگر از راست به چپ می باشد‪ ،‬بدین معنا که چنانچه چندین عملگر‬
‫نسبت دهی داشته باشیم‪ ،‬این عملگرها از راست به چپ محاسبه می شوند‪ .‬مثال پس از‬
‫اجرای دستور زیر‪ ،‬مقدار هر ‪ 3‬متغیر برابر ‪ 10‬خواهد شد‪.‬‬
‫;‪a = b = c = 10‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬

‫نکته جالب درمورد زبان ‪ C‬آنستکه دارای یک سری عملگرهای انتساب‬
‫خالصه شده است که باعث می شوند در بعضی موارد بتوانیم عبارات‬
‫کوتاهتری را بنویسیم‪ .‬این عملگرها عبارتند از ‪:‬‬
‫عملگرد‬

‫مثال‬

‫عبارت انتساب معادل‬

‫‪++‬‬

‫;‪a ++‬‬

‫;‪a = a + 1‬‬

‫‪--‬‬

‫;‪a --‬‬

‫;‪a = a – 1‬‬

‫=‪+‬‬

‫;‪a += 5‬‬

‫;‪a = a + 5‬‬

‫=‪-‬‬

‫;‪a -= 8‬‬

‫;‪a= a – 8‬‬

‫=*‬

‫;‪a *= 10‬‬

‫;‪a= a * 10‬‬

‫=‪/‬‬

‫;‪a /= 2‬‬

‫;‪a = a / 2‬‬

‫=‪%‬‬

‫;‪a %= 10‬‬

‫;‪a = a % 10‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬
‫‪‬‬

‫عملگر اول و دوم‪ ،‬عملگرهای یکانی هستند که بترتیب عملگر افزایش و عملگر کاهش‬
‫نامیده می شوند‪.‬‬
‫نکته جالب آنستکه این دو عملگر به دوصورت مورد استفاده قرار می گیرند‪.‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫در حالتی که از دستور ;‪ a ++‬استفاده شود به آن پس افزایش می گویند و بدین معناست که‬
‫ابتدا از مقدار فعلی ‪ a‬در عبارت موردنظر استفاده کن و سپس آن را افزایش بده‪.‬‬
‫اما دستور ;‪ ++ a‬که به آن پیش افزایش گفته می شود‪ ،‬ابتدا ‪ a‬را افزایش داده و سپس از آن‬
‫در عبارت استفاده می کند‪.‬‬
‫به برنامه زیر دقت کنید‪:‬‬

‫>‪#include ‫{ )(‪void main‬‬
‫; ‪int a ,b‬‬
‫;‪a=5‬‬
‫;‪b = a ++‬‬
‫;)‪printf(“a=%d and b=%d \n”,a,b‬‬
‫;‪a=5‬‬
‫;‪b = ++ a‬‬
‫;)‪printf(“a=%d and b=%d \n”,a,b‬‬
‫}‬
‫‪a=6 b=5‬‬
‫‪a=6 b=6‬‬

‫‪ 7-5-3‬عملگرهای مقایسه ای‬
‫‪‬‬

‫‪‬‬

‫این عملگرها دو عبارت را بایکدیگر مقایسه کرده و نتیجه را باز می گردانند‪.‬‬
‫نتیجه می تواند درست )‪ (true‬یا غلط )‪ (false‬باشد‪.‬‬
‫نتیجه این عملگرها یک عدد صحیح است که درصورت درست بودن ‪ 1‬و‬
‫درصورت غلط بودن ‪ 0‬باز می گردانند‪ .‬این عملگرها عبارتند از‪:‬‬
‫عملگر‬

‫مفهوم عملگر‬

‫مثال‬

‫<‬

‫بزرگتر )<(‬

‫‪a>b‬‬

‫>‬

‫کوچکتر )>(‬

‫‪a
‫=<‬

‫بزرگتر یا مساوی )≤(‬

‫‪a >= b‬‬

‫=>‬

‫کوچکتر یا مساوی )≥(‬

‫‪a <= b‬‬

‫==‬

‫مساوی )=(‬

‫‪a == b‬‬

‫=!‬

‫نامساوی )≠(‬

‫‪a != b‬‬

‫‪ 7-5-3‬عملگرهای مقایسه ای‬
‫‪‬‬

‫‪‬‬

‫نکته مهمی که باید به آن دقت کرد عملگر مساوی )==( است‪ ،‬چرا که یک‬
‫اشتباه بسیار متداول برنامه نویسان ‪ C‬استفاده اشتباه از عملگر انتساب‬
‫)=( بجای عملگر تساوی )==( است که باعث ایجاد خطا در برنامه می‬
‫شود‪.‬‬
‫اولویت این عملگرها از باال به پایین بشرح زیر است‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫عملگرهای <‪ <= ، > ،‬و =>‬
‫عملگرهای == و =!‬

‫الزم بذکر است که در هنگام مساوی بودن اولویت چند عملگر‪ ،‬این عملگرها‬
‫از چپ به راست محاسبه می گردند‪.‬‬

‫‪ 7-5-4‬عملگرهای منطقی‬
‫‪‬‬

‫این عملگرها به شما اجازه می دهند که شرطهای ساده ای را که با‬
‫استفاده از عملگرهای مقایسه ای ایجاد شده اند را با یکدیگر ترکیب نموده‬
‫و شرطهای پیچیده تری را بسازید‪ .‬این عملگرها عبارتند از ‪:‬‬
‫مثال‬

‫عملگر‬

‫مفهوم عملگر‬

‫نحوه کار‬

‫&&‬

‫‪ AND‬منطقی‬

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

‫‪a>0 && sw==1‬‬

‫||‬

‫‪ OR‬منطقی‬

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

‫‪a<=100 || b!=0‬‬

‫!‬

‫‪ NOT‬منطقی‬

‫اگر عملوند درست باشد‪ ،‬نادرست و‬
‫اگر نادرست باشد‪ ،‬درست برمی‬
‫گرداند‪.‬‬

‫)‪! (a==1 || b<10‬‬

‫‪ 7-5-5‬عملگر شرطی‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫گاهی الزم است که ابتدا یک شرط بررسی شده و سپس برمبنای نتیجه )درست یا نادرست بودن آن( یکی‬
‫از دو عبارت ممکن بازگردانده شود‪ .‬برای اینکار می توان از یک عملگر ‪3‬تایی )با ‪ 3‬عملوند( بنام عملگر‬
‫شرطی استفاده نمود‪.‬‬
‫شکل کلی این عملگر بصورت زیر است‪:‬‬
‫>عبارت‪> :<2‬عبارت‪> ?<1‬شرط<‬
‫نحوه کار بدینصورت است که درصورت درست بودن شرط‪ ،‬عبارت‪ 1‬و در غیراینصورت عبارت ‪ 2‬بازگردانده می‬
‫شود‪.‬‬
‫به عنوان مثال به دستور زیر توجه کنید‪:‬‬
‫که این عبارت معادل دستور زیر است‪:‬‬

‫‪‬‬

‫;‪a = (k<10) ? 100 : 50‬‬
‫;‪if (k<10) a=100‬‬
‫;‪else a=50‬‬

‫البته این عبارت به شکلهای پیچیده نیز می تواند مورد استفاده قرار گیرد‪ .‬مثال ‪:‬‬
‫;‪c += (a>0 && a<10) ? ++a : a/b‬‬
‫که معادل است با ‪:‬‬
‫{ )‪if (a>0 && a<10‬‬
‫;‪a= a + 1‬‬
‫;‪c = c + a‬‬
‫}‬
‫;‪else c = c + a/b‬‬

‫‪ 7-5-6‬اولویت عملگرها‬
‫عملگر‬

‫اولویت‬

‫شرکت پذیری‬

‫‪1‬‬

‫)(‬

‫از چپ به راست‬

‫‪2‬‬

‫‪- + ! -- ++‬‬

‫از راست به چپ‬

‫‪3‬‬

‫‪* / %‬‬

‫از چپ به راست‬

‫‪4‬‬

‫‪+ -‬‬

‫از چپ به راست‬

‫‪5‬‬

‫>> <<‬

‫از چپ به راست‬

‫‪6‬‬

‫>= > <= <‬

‫از چپ به راست‬

‫‪7‬‬

‫=! ==‬

‫از چپ به راست‬

‫‪8‬‬

‫&&‬

‫از چپ به راست‬

‫‪9‬‬

‫||‬

‫از چپ به راست‬

‫‪10‬‬

‫‪?:‬‬

‫از راست به چپ‬

‫‪11‬‬

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

‫از راست به چپ‬

‫‪12‬‬

‫‪,‬‬

‫از چپ به راست‬

‫‪ 7-6‬خواندن و نمایش اطالعات‬
‫‪‬‬

‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫همانطور كه قبال نیز گفته شد‪ ،‬یكی از اهداف زبان ‪ C‬قابل حمل بودن آن‬
‫است‪ .‬بهمین منظور سعی شده است كه از دستوراتی كه ممكن است‬
‫وابسته به ماشین خاصی باشد‪ ،‬اجتناب گردد‪.‬‬
‫بهمین دلیل زبان ‪ C‬برخالف سایر زبانها دارای هیچ دستوری برای‬
‫خواندن از ورودی و یا نوشتن در خروجی نیست‪.‬‬
‫اما در عوض دارای تعدادی تابع )زیربرنامه( استاندارد می باشد كه تقریبا‬
‫تمامی كامپایلرها از آنها حمایت می كنند‪.‬‬
‫این كار به كامپایلر این امكان را می دهد كه بر حسب نوع سخت افزار‬
‫موردنظر‪ ،‬توابع ورودی و خروجی را طراحی نماید‪.‬‬
‫این توابع در یك فایل سرآمد بنام ‪ stdio.h‬تعریف شده اند و بنابراین قبل‬
‫ازاینكه بتوانید از این توابع استفاده نمایید‪ ،‬باید این فایل را نیز با استفاده‬
‫از ‪ #include‬در برنامه خود بگنجانید‪.‬‬

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫برای نمایش اطالعات در خروجی از تابع ‪ printf‬استفاده می شود‪.‬‬
‫این تابع رشته موردنظر شما را به خروجی استاندارد )كه در حالت‬
‫عادی همان صفحه نمایش یا مانیتور است( می فرستد‪ .‬شكل كلی این‬
‫تابع بصورت زیر است‪:‬‬
‫; )>لیست متغیرها< ‪> ,‬رشته كنترلی<(‪printf‬‬
‫رشته كنترلی همان متنی است كه قصد چاپ آن را داریم‪ ،‬با ذكر این‬
‫نكته كه در قسمتهایی كه باید مقدار یك متغیر چاپ شود‪ ،‬از یك‬
‫مشخصه تبدیل استفاده می شود‪ .‬هر مشخصه تبدیل از یك عالمت ‪%‬‬
‫بعالوه یك كاراكتر كه نوع متغیر مورد نظر را نشان می دهد تشكیل می‬
‫گردد‪.‬‬
‫لیست متغیرها نیز همان متغیرهایی هستند كه قصد چاپ آنها را داریم‪.‬‬
‫این متغیرها باید بترتیب قرار گرفته و با كاما )‪ (,‬از یكدیگر جدا شوند‪.‬‬

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫مشخصه تبدیل‬

‫مفهوم‬

‫‪%c‬‬

‫كاراكتر‬

‫‪%d‬‬

‫عدد صحیح در مبنای ‪10‬‬

‫‪%f‬‬

‫عدد اعشاری بدون نماد علمی‬

‫‪%e‬‬

‫عدد اعشاری با نماد علمی‬

‫‪%g‬‬

‫عدد اعشاری با حالت كوتاهتر بین ‪ e‬و ‪f‬‬

‫‪%s‬‬

‫رشته‬

‫‪%ld‬‬

‫عدد صحیح بزرگ‬

‫‪%lf %le %lg‬‬

‫عدد اعشاری بزرگ‬

‫‪%o‬‬

‫عدد صحیح در مبنای ‪8‬‬

‫‪%x‬‬

‫عدد صحیحی در مبنای ‪16‬‬

‫‪%u‬‬

‫عدد صحیح بدون عالمت‬

‫ تابع نمایش در خروجی‬7-6-1
#include
void main() {
int age = 20;
floate average = 18.23;
printf("You are %d years old and your average is %f \n",age,average);
}
You are 20 years old and your average is 18.230000

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫‪‬‬
‫‪‬‬

‫برای کنترل نحوه چاپ اعداد می توانید از مشخصه طول میدان استفاده‬
‫کنید‪.‬‬
‫مشخصه طول میدان برای اعداد به شكل زیر استفاده می شود‪:‬‬
‫‪ ‬برای اعداد صحیح از ‪ %nd‬استفاده می كنیم كه ‪ n‬تعداد ارقام را نشان‬
‫می دهد )مثال ‪ .(%3d‬در اینصورت برای هر متغیر ‪ n‬رقم درنظر گرفته‬
‫می شود‪ .‬اگر اندازه عدد از ‪ n‬كوچكتر باشد‪ ،‬به سمت چپ آن فضای‬
‫خالی اضافه می شود و اگر اندازه عدد بیش از ‪ n‬رقم باشد‪ ،‬طول میدان‬
‫نادیده گرفته شده و عدد بطور كامل چاپ می شود‪.‬‬
‫‪ ‬برای اعداد اعشاری از ‪ %n.mf‬استفاده می كنیم كه ‪ n‬اندازه كل عدد‬
‫)شامل عالمت ممیز( و ‪ m‬تعداد ارقام اعشار است )مثال ‪ .(%5.2f‬در‬
‫صورتیكه تعداد ارقام اعشاری عدد موردنظر از ‪ m‬بیشتر باشد‪ ،‬عدد به ‪m‬‬
‫عدد اعشار گرد می شود و در صورتیكه از ‪ m‬كمتر باشد‪ ،‬در سمت‬
‫راست آن ‪ 0‬قرار داده می شود‪.‬‬

‫‪ 7-6-2‬تابع خواندن از ورودی‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای خواندن اطالعات از ورودی از تابع ‪ scanf‬استفاده می شود‪.‬‬
‫این تابع اطالعات را ازورودی استاندارد )معموال صفحه كلید( خوانده و در‬
‫متغیرهای تعیین شده قرار می دهد‪.‬‬
‫شكل كلی این تابع بصورت زیر است‪:‬‬
‫; )>لیست آدرسهای متغیرها< ‪> ,‬رشته كنترلی<(‪scanf‬‬
‫همانطور كه می بینید نحوه احضار تابع ‪ scanf‬نیز مشابه ‪ printf‬است‪ .‬تنها‬
‫تفاوت در آن است كه در ‪ scanf‬باید لیست آدرسهای متغیرها ارسال شود‪.‬‬
‫مبحث مربوط به آدرسها در فصول بعدی بررسی خواهد شد ولی در حال حاضر‬
‫بخاطر بسپارید كه برای بدست آوردن آدرس یك متغیر از عالمت & استفاده می‬
‫كنیم‪ .‬بعنوان مثال ‪ &age‬بمعنای آدرس متغیر ‪ age‬است‪.‬‬
‫بطور كلی در ‪ C‬قدیمی هرگاه كه یك تابع دارای پارامترهای خروجی بود )یعنی‬
‫پارامترهایی كه یك مقدار را باز می گرداندند( از آدرس متغیرها استفاده می‬
‫شد كه امروزه این مسئله وجود ندارد‪.‬‬

‫ تابع خواندن از ورودی‬7-6-2
#include
void main() {
int age;
float average ;
printf("Please enter your age and average : ");
scanf("%d %f",&age,&average);
printf("You are %d years old and your average is %5.2f \n",age,average);
}

Please enter your age and average : 19 16.72
You are 19 years old and your average is 16.72

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫زبان ‪ C++‬یک زبان شی گرا است‪ ،‬بهمین دلیل در این زبان برای ورودی‬
‫و خروجی از اشیاء بجای توابع استفاده می گردد‪.‬‬
‫از آنجا که امروزه معموال برنامه نویسان ‪ C‬از کامپایلرهای ‪ C++‬استفاده‬
‫می کنند‪ ،‬می توانند از اشیای ورودی و خروجی آن نیز استفاده کنند‪.‬‬
‫اینکار در بین بسیاری از برنامه نویسان ‪ C‬متداول است‪ ،‬بهمین دلیل ما‬
‫در اینجا نحوه کار با اشیای خواندن و نوشتن در ‪ C++‬را بطور مقدماتی‬
‫توضیح می دهیم؛ گرچه توضیح کامل این موارد نیاز به آشنایی با شی‬
‫گرایی و زبان ‪ C++‬دارد‪.‬‬
‫قبل از هرچیز الزم به ذکر است که کلیه اشیای مربوط به ورودی و‬
‫خروجی در فایل سرآمدی بنام ‪ iostream.h‬تعیریف شده اند‪ ،‬بنابراین‬
‫ابتدا باید این فایل به برنامه توسط دستور ‪ #include‬الحاق گردد‪.‬‬

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫زبان ‪ C++‬برای نمایش اطالعات از یک شیئ بنام ‪ cout‬استفاده می نماید‪.‬‬
‫برای ارسال اطالعات مورد نظر برای چاپ به ‪ cout‬باید از عملگر درج در جریان‬
‫یا >> استفاده نماییم‪ .‬بعنوان مثال ‪:‬‬
‫; ” ‪cout >> “Please enter your name:‬‬
‫و یا مثال دیگر ‪:‬‬
‫;‪int a = 10‬‬
‫;‪float b = 2.86‬‬
‫;‪cout << a‬‬
‫;‪cout << b‬‬
‫نکته جالبی که در این مثالها دیده می شود‪ ،‬آنستکه برخالف تابع ‪ printf‬هیچ‬
‫نیازی به مشخص کردن نوع متغیری که قصد چاپ آن را داریم نیست و خود‬
‫شئ ‪ cout‬نوع آن را تشخیص می دهد‪.‬‬
‫عالوه براین می توان چندین عملگر درج در جریان را با یکدیگر الحاق کرد و‬
‫چندین متغیر را با یک دستور چاپ کرد‪.‬‬

C++ ‫ ورودی و خروجی اطالعات در‬7-6-3
#include
void main() {
int age = 20;
floate average = 18.23;
cout >> “You are ” >> age >> “ years old and your average is ” >> average ;
}

You are 20 years old and your average is 18.230000

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای دریافت اطالعات از کاربر‪ ،‬از شئ دیگری بنام ‪ cin‬استفاده می شود‪.‬‬
‫برای ارسال متغیر مورد نظر به ‪ cin‬باید از عملگر استخراج از جریان یا <<‬
‫استفاده نماییم‪ .‬بعنوان مثال‪:‬‬
‫;‪int a‬‬
‫;‪cin >> a‬‬
‫بازهم همانطور که می بینید نیازی به تعیین نوع متغیر موردنظر نیست و خود‬
‫شئ ‪ cin‬نوع متغیر را بطور اتوماتیک تشخیص داده و داده ای از همان نوع را از‬
‫کاربر دریافت و در متغیر مورد نظر قرار می دهد‪.‬‬
‫عملگرهای استخراج از جریان را نیز می توان با یکدیگر الحاق کرد‪.‬‬
‫برای رفتن به خط بعد در شئ ‪ cout‬می توان از دستکاری کننده ‪ endl‬استفاده‬
‫کرد‪ .‬مثال در دستور زیر پس از چاپ پیغام‪ ،‬مکان نما به خط بعد منتقل می‬
‫شود‪:‬‬
‫;‪cout >> “List of students : “ >> endl‬‬
‫البته دستکاری کننده های متعدد دیگری نیز ازجمله موارد مربوط به تعیین طول‬
‫میدان و نحوه چاپ مقادیر وجود دارد که توضیح آنها نیاز به یک مبحث مستقل‬
‫دارد‪.‬‬

C++ ‫ ورودی و خروجی اطالعات در‬7-6-3
#include
void main() {
int age;
float average ;
cout << "Please enter your age and average : " ;
cin >> age >> average ;
cout << "You are " << age << "years old and your average is " << average;
}

Please enter your age and average : 19 16.72
You are 19 years old and your average is 16.72

‫‪ 7-7‬توابع کتابخانه ای‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫همانطور که قبال نیز گفته شد‪ ،‬زبان ‪ C‬از زیر برنامه ها نیز حمایت می کند‪ .‬هر زیر برنامه‬
‫در ‪ C‬یک تابع نامیده می شود‪ .‬تا کنون با توابعی همچون ‪ main‬و یا ‪ printf‬و ‪ scanf‬آشنا‬
‫شده ایم‪.‬‬
‫معموال عرضه کنندگان کامپایلرها و یا سایر فروشندگان نرم افزار‪ ،‬برخی از توابع عمومی‬
‫را که ممکن است مورد نیاز جمع کثیری از برنامه نویسان مختلف باشد را در قالب‬
‫کتابخانه ای از توابع در اختیار برنامه نویسان می گذارند‪ .‬بعضی از این توابع کتابخانه ای‬
‫مانند ‪ printf‬و ‪ scanf‬بصورت استاندارد درآمده و توسط عرضه کنندگان مختلف ارائه می‬
‫شوند‪.‬‬
‫در کامپایلر عرضه شده توسط شرکت بورلند )‪ (Borland C++ 3.1‬نیز کتابخانه های‬
‫متعددی از توابع برای شما عرضه شده اند که بتدریج با آنها و کاربردشان آشنا خواهید‬
‫شد‪.‬‬
‫نکته مهم آنستکه برای استفاده از این توابع ابتدا باید فایل سرآمد مربوط به آنها را نیز در‬
‫ابتدای برنامه خود اضافه نمایید ) با استفاده از ‪ .(#include‬هر فایل سرآمد شامل تعاریف‬
‫اولیه گروهی از توابع مرتبط با هم و داده های مربوط به آنها بوده و در استاندارد قدیمی‬
‫تر دارای پسوند ‪ .h‬می باشد)در استاندارد جدید پسوند این فایلها حذف شده است(‪.‬‬
‫برخی از این فایلهای سرآمد عبارتند از‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪ : stdio.h‬توابع ورودی و خروجی استاندارد‬
‫‪ : math.h‬توابع ریاضی‬
‫‪ : graphics.h‬توابع مربوط به عملیات گرافیکی‬
‫‪ : string.h‬توابع مربوط به کار با رشته ها‬


Slide 34

‫مبانی کامپیوتر و برنامه سازی‬
‫فصل هفتم ‪ :‬مفاهیم اولیه زبان ‪C‬‬
‫مدرس ‪ :‬نگین معروفی‬

‫‪ 7-1‬شناسه ها در ‪C‬‬
‫‪‬‬
‫‪‬‬

‫شناسه )‪ (identifier‬نامی است که به یک قسمت از برنامه مانند متغیر‪ ،‬تابع‪ ،‬ثابت و یا‬
‫‪ ...‬داده می شود‪.‬‬
‫در زبان ‪ C‬برای انتخاب شناسه ها فقط می توان از عالئم زیر استفاده کرد‪:‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫حروف انگلیسی کوچک و بزرگ )‪(A…Z a…z‬‬
‫ارقام )‪(0…9‬‬
‫عالمت خط پایین یا _‬

‫البته یک شناسه نمی تواند با یک رقم شروع شود‪.‬‬
‫چند شناسه مجاز‪ name2 ، average ، sum :‬و ‪student_average‬‬
‫چند شناسه غیرمجاز ‪ 2name‬و یا ‪student average‬‬
‫در برنامه نویسی امروزی پیشنهاد می شود بجای شناسه هایی همانند‬
‫‪ student_average‬از ‪ studentAverage‬استفاده گردد‪.‬‬
‫نکته مهم دیگری که باید به آن اشاره کرد آنستکه زبان ‪ C‬برخالف بسیاری از زبانهای دیگر‬
‫به کوچک و بزرگی حروف حساس است )‪ .(case sensitive‬در نتیجه شناسه های زیر با‬
‫یکدیگر متفاوتند ‪:‬‬
‫‪Sum ≠ sum ≠ SUM‬‬
‫آخرین نکته اینستکه در هنگام انتخاب شناسه نمی توانید از کلمات کلیدی که برای‬
‫منظورهای خاص در زبان ‪ C‬رزرو شده اند استفاده کنید‪.‬‬

C ‫ شناسه ها در‬7-1
: C ‫کلمات کلیدی در زبان‬
auto

break

case

char

const

continue

default

do

double

else

enum

extern

float

for

goto

if

int

long

register

return

short

signed

sizeof

static

struct

switch

typedef

union

unsigned

void

volatile

while

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫محدوده‬

‫اندازه )بیت(‬

‫توضیح‬

‫نوع داده‬

‫‪-128 to +127‬‬

‫‪8‬‬

‫کاراکتر‬

‫‪char‬‬

‫‪-32768 to +32767‬‬

‫‪16‬‬

‫عدد صحیح‬

‫‪int‬‬

‫‪3.4e-38 to 3.4e+38‬‬

‫‪32‬‬

‫عدد اعشاری‬

‫‪float‬‬

‫‪1.7e-308 to 1.7e+308‬‬

‫‪64‬‬

‫عدد اعشاری با‬
‫دقت مضاعف‬

‫‪double‬‬

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫‪‬‬

‫البته چند نکته مهم درمورد این جدول قابل ذکر است ‪:‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫اندازه ‪ int‬در محیطهای ‪ 16‬بیتی مانند ‪ DOS‬برابر ‪ 16‬بیت است‪ .‬اما در‬
‫محیطهای ‪ 32‬بیتی همانند ‪ Windows‬اندازه آن ‪ 32‬بیت می باشد که در‬
‫اینصورت محدوده ای برابر ‪ -2,147,483,648‬تا ‪ +2,147,483,647‬را‬
‫پوشش می دهد‪.‬‬
‫در بعضی از کامپایلرهای ‪ ،C‬نوع داده ‪ bool‬نیز وجود دارد که می تواند‬
‫یکی از مقادیر ‪)true‬درست( یا ‪) false‬غلط( را نشان دهد ‪ .‬اما در نسخه‬
‫های اولیه ‪ C‬از همان نوع داده صحیح یا ‪ int‬برای اینکار استفاده می‬
‫شد‪ .‬بدین صورت که ‪ 0‬نشاندهنده ‪ false‬و هر عدد غیر صفر )معموال ‪(1‬‬
‫نشاندهنده ‪ true‬است‪.‬‬
‫از آنجا که برای ذخیره سازی کاراکترها کد اسکی آنها ذخیره می گردد‪،‬‬
‫از یک متغیر کاراکتری یا ‪ char‬می توان بعنوان یک عدد صحیح کوچک نیز‬
‫استفاده کرد و اعمال ریاضی برروی آنها نیز مجاز است‪.‬‬

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫عالوه براین چندین اصالح کننده نیز وجود دارد که به ما اجازه می دهد نوع داده مورد‬
‫نظر را با دقت بیشتری برای نیازهای مختلف استفاده نماییم‪.‬‬
‫این اصالح کننده ها عبارتند از ‪short, long, signed, unsigned :‬‬
‫تمام این اصالح کننده ها می توانند به نوع داده ‪ int‬اعمال شوند و اثر آنها بستگی‬
‫به محیط دارد‪.‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫در یک محیط ‪16‬بیتی‪short int ،‬بازهم برابر ‪16‬بیت است ولی ‪ long int‬برابر‪32‬بیت می‬
‫باشد‪.‬‬
‫‪ unsigned int‬باعث می شود که یک عدد ‪ 16‬بیتی بدون عالمت داشته باشیم که بازه‬
‫بین ‪ 0‬تا ‪ 65535‬را پوشش می دهد‪ signed int .‬نیز همانند ‪ int‬معمولی بوده و تفاوتی‬
‫ندارد‪.‬‬
‫ترکیب این اصالح کننده ها نیز ممکن است‪ .‬مثال ‪ unsigned long int‬یک عدد ‪ 32‬بیتی‬
‫بدون عالمت است که بازه ‪ 0‬تا ‪ 4,294,967,295‬را پوشش می دهد‪.‬‬

‫برروی نوع داده ‪ char‬فقط اصالح کننده های ‪ signed‬و ‪ unsigned‬را می توان اعمال‬
‫کرد‪ .‬معموال از اصالح کننده ‪ unsigned‬وقتی استفاده می شود که قصد داشته‬
‫باشیم از ‪ char‬بعنوان یک عدد صحیح مثبت بین ‪ 0‬تا ‪ 255‬استفاده کنیم‪.‬‬
‫برروی نوع داده ‪ double‬تنها اصالح کننده ‪ long‬قابل اعمال است و دراینصورت عدد‬
‫اعشاری با ‪ 80‬بیت را خواهیم داشت که قادر است هر عددی در بازه ‪ 3.4e-4932‬تا‬
‫‪ 1.1e+4932‬را در خود نگاه دارد‪.‬‬

‫‪ 7-3‬تعریف متغیرها‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای تعریف متغیرها به شکل زیر عمل می کنیم‪:‬‬

‫;>‪ ‫که ‪ type‬یکی از نوع داده های گفته شده و ‪ variable-list‬لیستی از متغیرها است‬
‫که با کاما از یکدیگر جدا شده اند‪ .‬بعنوان مثال ‪:‬‬
‫;‪int sum‬‬
‫;‪float average‬‬
‫; ‪long int a, b, c‬‬
‫; ‪unsigned long int i, j, k‬‬
‫عالوه براین می توان در هنگام تعریف متغیر به آن مقدار اولیه نیز داد‪ .‬مثال ‪:‬‬
‫; ‪int d = 0‬‬
‫نكته مهم آنكه زبان ‪ C‬به متغیرها مقدار اولیه نمي دهد )حتي ‪ (0‬و برنامه نويس‬
‫خود بايد اينكار را صريحا انجام دهد‪ ،‬درغیر اينصورت مقدار اولیه متغیر‪ ،‬نامعین خواهد‬
‫بود‪.‬‬
‫تعریف متغیرها طبق اصول زبان ‪ C‬میتواند درهرجایی از برنامه صورت پذیرد‪ ،‬و‬
‫متغیرهای تعریف شده از همان خط به بعد قابل استفاده خواهد بود‪ .‬اما معموال‬
‫توصیه می گردد كه تعریف متغیرها در همان خط ابتدایی تابع و بالفاصله پس از {‬
‫صورت پذیرد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫‪‬‬
‫‪‬‬

‫ثابتها مقادیر ثابتی هستند كه مقدار آنها در حین اجرای برنامه تغییر نمی یابد‪ .‬ثابتها می توانند از‬
‫هریك از نوع داده های اصلی باشند‪.‬‬
‫ثوابت عددی صحیح ‪:‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫برای نمایش این دسته از ثوابت‪ ،‬از دنباله ای از ارقام بعالوه عالمت ‪ +‬یا ‪ -‬استفاده می كنیم‪ .‬بعنوان مثال‬
‫‪ -45‬و یا ‪ 3489‬ثوابت صحیح هستند‪.‬‬
‫در حالت عادی ‪ C‬هر عدد را در كوچكترین نوع داده ای كه می تواند قرار می دهد‪ .‬مثال عدد ‪ 85‬در یك‬
‫‪ int‬قرار می گیرد‪ ،‬اما عدد ‪ 145398‬در یك ‪ long int‬قرار خواهد گرفت‪.‬‬
‫اگر قصد دارید یك عدد كوچك بعنوان ‪ long‬محسوب گردد‪ ،‬می توانید از پسوند ‪ L‬در انتهای آن استفاده‬
‫می كنیم‪ .‬مثال ‪245L‬یك عدد ‪ long‬محسوب می شود‪.‬‬
‫;‪long int a = 20L‬‬
‫پسوند ‪ U‬در انتهای عدد نیز نشانه بدون عالمت بودن آن است‪.‬‬
‫نكته دیگر آنكه ‪ C‬به شما اجازه می دهد درصورت لزوم ثوابت صحیح خود را در مبنای ‪ 8‬یا ‪ 16‬نیز كه‬
‫از مبناهای متداول در برنامه نویسی هستند‪ ،‬بنویسید‪.‬‬
‫‪‬‬
‫‪‬‬

‫برای نوشتن عدد در مبنای ‪ 8‬باید آن را با ‪ 0‬آغاز كنید‪ ،‬مثال ‪ 0342‬یك عدد در منای ‪ 8‬محسوب می‬
‫گردد‪.‬‬
‫برای نوشتن یك عدد در مبنای ‪ 16‬باید آن را با ‪ 0x‬آغاز نمایید‪ ،‬مانند ‪.0x27A4‬‬

‫‪ 7-4‬ثوابت‬
‫ثوابت عددی اعشاری‬

‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫برای نمایش اعداد اعشاری‪ ،‬باید از نقطه اعشار استفاده كنیم‪ ،‬مانند ‪237.45‬‬
‫اما نكته جالب آنستكه می توانید از نماد علمی نیز برای نمایش اعداد‬
‫اعشاری استفاده كنید‪ .‬برای اینكار كافی است از حرف ‪ e‬برای نمایش قسمت‬
‫توان استفاده نمایید‪ .‬بعنوان مثال ‪:‬‬
‫‪-23.47 × 10 5 = -23.47e5‬‬
‫‪42.389 × 10 -3 = 42.389e-3‬‬
‫دقت كنید كه قسمت توان‪ ،‬حتما یك عدد صحیح است‪.‬‬
‫نكته جالب اینجاست كه برخالف مورد قبل‪ ،‬كامپایلر بطور پیش فرض داده های‬
‫اعشاری را از نوع ‪ double‬فرض می كند‪.‬چنانچه دوست دارید ثابت شما ازنوع‬
‫‪ float‬درنظر گرفته شود‪ ،‬در انتهای آن ‪ F‬قرار دهید‪ .‬ضمنا پسوند ‪ L‬نیز داده‬
‫اعشاری را از نوع ‪ long double‬درنظر می گیرد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫ثوابت كاراكتری ‪:‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫برای نشان دادن ثوابت كاراكتری‪ ،‬آنها را در داخل ' قرار می دهیم‪ .‬بعنوان مثال‬
‫'‪'A‬یك ثابت كاراكتری است‪.‬‬
‫; '‪char ch = 'S‬‬
‫دقت كنید كه همانطور كه قبال گفته شد‪ ،‬كد اسكی كاراكترها در متغیر ذخیره‬
‫می گردد‪ ،‬بنابراین می توان از آن بعنوان یك عدد صحیح نیز استفاده كرد‪ .‬نكته‬
‫مهم دیگر آنستكه به تفاوت عدد ‪ 5‬و كاراكتر '‪ '5‬دقت داشته باشید‪ .‬در حقیقت‬
‫'‪ '5‬برابر است با عدد ‪ 53‬كه همان كد اسكی آن است‪.‬‬
‫روش فوق‪ ،‬برای نمایش کاراکترهای قابل چاپ مناسب است‪ ،‬اما بعضی‬
‫كاراكترها مانند ‪ enter‬قابل نمایش نبوده و برای آنها شکل خاصی وجود ندارد‪.‬‬
‫در چنین مواردی‪ ،‬زبان ‪ C‬از ترکیب عالمت \ به همراه یک کاراکتر دیگر‪ ،‬برای‬
‫نمایش این قبیل کاراکترها استفاده می نماید‪ .‬بعنوان مثال‪ ،‬کاراکتر '‪ '\n‬نشان‬
‫دهنده خط جدید یا همان ‪ enter‬می باشد‪.‬‬
‫جدول صفحه بعد این قبیل کاراکترها و معادل آنها را نشان می دهد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫نحوه نمایش در ‪C‬‬

‫کد اسکی‬

‫صدای بوق کامپیوتر‬

‫‪\a‬‬

‫‪7‬‬

‫حرکت به عقب ‪backspace‬‬

‫‪\b‬‬

‫‪8‬‬

‫شروع صفحه ‪form feed‬‬

‫‪\f‬‬

‫‪12‬‬

‫سطر جدید ‪line feed‬‬

‫‪\n‬‬

‫‪10‬‬

‫برگشت به ابتداي سطر ‪carriage return‬‬

‫‪\r‬‬

‫‪13‬‬

‫فاصله افقی ‪horizontal tab‬‬

‫‪\t‬‬

‫‪9‬‬

‫فاصله عمودی ‪vertical tab‬‬

‫‪\v‬‬

‫‪11‬‬

‫عالمت سوال‬

‫?\‬

‫‪63‬‬

‫عالمت '‬

‫'\‬

‫‪39‬‬

‫عالمت "‬

‫"\‬

‫‪34‬‬

‫عالمت \‬

‫\\‬

‫‪92‬‬

‫عالمت تهی‬

‫‪\0‬‬

‫‪0‬‬

‫نام کاراکتر‬

‫کد اسکی یک کاراکتر با ‪ 3‬رقم در مبنای ‪8‬‬

‫‪\000‬‬

‫کد اسکی یک کاراکتر با ‪ 2‬رقم در مبنای ‪16‬‬

‫‪\x00‬‬

‫‪ 7-4‬ثوابت‬
‫‪‬‬

‫ثوابت رشته ای ‪ C :‬عالوه بر ثوابت فوق‪ ،‬از یك ثابت دیگر بنام رشته نیز‬
‫حمایت می كند‪ .‬رشته‪ ،‬دنباله ای از كاراكترها است كه در داخل " قرار‬
‫می گیرند‪ .‬بعنوان مثال "‪ "this is a test‬یك رشته است‪ .‬دقت كنید كه '‪'a‬‬
‫یك كاراكتر است‪ ،‬اما "‪ "a‬یك رشته است كه فقط شامل یك كاراكتر می‬
‫باشد‪.‬‬

‫‪ 7-5‬عملگرها‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫عملگر‪ ،‬نمادی است كه به كامپایلر می گوید تا عملیات محاسباتی یا‬
‫منطقی خاصی را برروی یك یا چند عملوند‪ ،‬انجام دهد‪.‬‬
‫به عملگرهایی كه فقط یك عملوند دارند‪ ،‬عملگر یكانی می گوییم و‬
‫همواره عملگر در سمت چپ عملوند قرار می گیرد)مانند عدد ‪.(-125‬‬
‫اما عملگرهایی كه برروی دو عملوند اثر می كنند را عملگر دودویی‬
‫نامیده و عملگر را بین دو عملوند قرار می دهیم )مانند ‪.(23+86‬‬
‫هر ترکیب درستی از عملگرها و عملوندها را یک عبارت می نامیم‪.‬‬
‫‪ C‬از نقطه نظر عملگرها یك زبان بسیار قوی است‪ .‬این عملگرها به چند‬
‫دسته اصلی تقسیم می گردند كه آنها را به ترتیب بررسی می كنیم‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫این عملگرها‪ ،‬همان اعمال متداول ریاضی هستند كه در زبان ‪ C‬مورد استفاده‬
‫قرار می گیرند‪ .‬این اعمال عبارتند از ‪:‬‬

‫عمل‬

‫نوع‬

‫عملگر‬

‫منفی كردن عملوند سمت راست‬

‫یكانی‬

‫‪-‬‬

‫جمع دو عملوند‬

‫دودویی‬

‫‪+‬‬

‫تفریق دو عملوند‬

‫دودویی‬

‫‪-‬‬

‫ضرب دو عملوند‬

‫دودویی‬

‫*‬

‫تقسیم دو عملوند‬

‫دودویی‬

‫‪/‬‬

‫محاسبه باقیمانده تقسیم دو عملوند‬

‫دودویی‬

‫‪%‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬
‫‪‬‬

‫این عملگرهای برروی همه انواع داده های ‪ C‬عمل می كنند‪ ،‬بجز عملگر ‪ %‬كه فقط‬
‫برروی نوع داده های صحیح عمل می كند‪.‬‬
‫اما نكته مهمی كه باید به آن اشاره كرد‪ ،‬نحوه كار عملگر تقسیم برروی نوع داده های‬
‫مختلف است‪.‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫درصورتیكه هردو عملوند صحیح باشند‪ ،‬تقسیم بصورت صحیح بر صحیح انجام خواهد شد‪.‬‬
‫اگر یكی یا هر دو عملوند اعشاری باشند‪ ،‬تقسیم بصورت اعشاری انجام خواهد پذیرفت‪.‬‬
‫فرض كنید تعاریف زیر را داریم ‪:‬‬
‫; ‪int a,b‬‬
‫; ‪float c,d‬‬
‫; ‪a = 10 ; b = 4‬‬
‫;‪c = 8.2; d = 4.0‬‬
‫اكنون به نتایج عملیات زیر دقت كنید ‪:‬‬
‫‪a / b => 2‬‬
‫‪c / d => 2.05‬‬
‫‪a / d => 2.5‬‬
‫‪a / 4 => 2‬‬
‫چنانچه به آخرین مورد توجه كنید‪ ،‬متوجه می شوید كه از آنجا كه ‪a‬یك متغیر صحیح است و ‪4‬‬
‫نیز یك ثابت صحیح در نظر گرفته شده‪ ،‬درنتیجه تقسیم بصورت صحیح بر صحیح انجام گرفته‬
‫است‪ .‬چنانچه بخواهیم تقسیم بصورت اعشاری صورت پذیرد‪ ،‬به دو شكل می توانیم عمل‬
‫كنیم‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫برای اینکه عبارت تقسیم صفحه قبل بصورت اعشاری انجام شود‪ ،‬به دو روش‬
‫می توان عمل کرد‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫این عبارت را بصورت ‪ a / 4.0‬بنویسیم‪.‬‬
‫از عملگر قالب ریزی استفاده كنیم‪.‬‬

‫عملگر قالب ریزی می تواند یك نوع را به نوع دیگری تبدیل نماید‪ .‬شكل كلی آن‬
‫به شكل زیر است ‪:‬‬
‫>‪() ‫كه ‪ type‬نوع مورد نظر است كه قصد تبدیل عبارت ‪ expression‬به آن نوع را‬
‫داریم‪ .‬بعنوان مثال در مورد قبلی می توان به شكل زیر عمل كرد ‪:‬‬
‫‪(float) a / 4‬‬
‫در این حالت از كامپایلر خواسته ایم كه ابتدا عدد ‪ a‬را به اعشاری تبدیل كند‬
‫)البته بصورت موقت( و سپس آن را بر ‪ 4‬تقسیم نماید‪ ،‬كه مسلما حاصل‬
‫اعشاری خواهد بود‪.‬‬
‫بطوركلی هرگاه ثابتها و متغیرهایی از انواع مختلف در یك عبارت محاسباتی‬
‫داشته باشیم‪ ،‬كامپایلر ‪ C‬همه آنها را به یك نوع یكسان كه همان بزرگترین‬
‫عملوند موجود است تبدیل خواهد كرد‪ .‬بعنوان مثال به مورد صفحه بعد دقت‬
‫كنید ‪:‬‬

‫ عملگرهای محاسباتی‬7-5-1
char ch;
int i;

float f;
double d;
result = (ch / i)
int

+

(f *d)

(f+i)
float

double

double

int

-

double

double

float

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫اولویت عملگرها ‪ :‬در عبارتی که شامل چندین عملگر است‪ ،‬کدامیک در‬
‫ابتدا اعمال خواهد گردید‪.‬‬
‫اولویت عملگرهای محاسباتی از باال به پایین بشرح زیر است‪:‬‬
‫‪ ‬عملگر یکانی –‬
‫‪ ‬عملگرهای * و ‪ /‬و ‪%‬‬
‫‪ ‬عملگرهای ‪ +‬و –‬
‫چنانچه اولویت دو عملگر یکسان باشد‪ ،‬این عملگرها از چپ به راست‬
‫محاسبه خواهند شد‪.‬‬
‫چنانچه بخواهیم یک عمل با اولویت پایین زودتر انجام شود‪ ،‬باید از پرانتز‬
‫استفاده کنیم‪ .‬بنابراین اولویت عملگر پرانتز از همه موارد فوق‬
‫بیشتراست‪ .‬در مورد پرانتزهای متداخل‪ ،‬ابتدا پرانتز داخلی محاسبه‬
‫می شود؛ اما در مورد پرانتزهای هم سطح‪ ،‬ابتدا پرانتز سمت چپتر‬
‫محاسبه می گردد‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫چند مثال در مورد اولویت عملگرها‬

‫ترتیب اجرای عملگرها‬

‫عبارت زبان ‪C‬‬

‫ابتدا عمل * و سپس عمل ‪+‬‬

‫‪b+c*d‬‬

‫ابتدا عمل ‪ +‬و سپس عمل *‬

‫‪(b + c) * d‬‬

‫ابتدا عمل ‪ /‬سپس عمل * و در انتها عمل ‪+‬‬

‫‪b+c/d*e‬‬

‫ابتدا عمل * سپس عمل ‪ /‬و در انتها عمل ‪+‬‬

‫)‪b + c / (d * e‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫یک مثال کامل در مورد اولویت عملگرها‬

‫‪result = a + b * (f – (g + b) / d) – c * (a – d) / e‬‬
‫‪6‬‬

‫‪1‬‬
‫‪7‬‬

‫‪2‬‬

‫‪8‬‬

‫‪3‬‬
‫‪4‬‬
‫‪5‬‬
‫‪9‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫در زبان ‪ C‬برای انتساب چندین عملگر وجود دارد‪ .‬ساده ترین عملگر انتساب‪ ،‬همان عملگر =‬
‫است که در بسیاری از زبانها استفاده می شود‪ .‬بعنوان مثال ‪:‬‬
‫;‪a = 5‬‬
‫;‪b = c + 2 * d‬‬
‫این عملگر باعث می شود که عبارت سمت راست در عبارت سمت چپ قرار گیرد‪.‬‬
‫توجه کنید که مقدار سمت چپ باید عبارتی باشد که بتوان به آن یک مقدار را نسبت داد‬
‫)مانند یک متغیر( که به آن ‪ Lvalue‬گفته می شود‪ ،‬بنابراین یک ثابت نمی تواند در سمت چپ‬
‫قرار گیرد‪.‬‬
‫نکته دیگر اینکه اولویت عملگر = از عملگرهای ریاضی کمتر است و درنتیجه ابتدا آن عملیات‬
‫انجام شده و در پایان حاصل در عبارت سمت چپ ریخته می شود‪.‬‬
‫الزم به ذکر است که در هنگام انتساب‪ ،‬درصورت لزوم نوع عبارت سمت راست به نوع عبارت‬
‫سمت چپ تبدیل می شود‪ .‬مثال‪:‬‬
‫;‪int a‬‬
‫;‪a = 2.5 * 5.0‬‬
‫که دراینصورت عدد ‪ 12‬در ‪ a‬ذخیره خواهد شد‪.‬‬
‫شرکت پذیری این عملگر از راست به چپ می باشد‪ ،‬بدین معنا که چنانچه چندین عملگر‬
‫نسبت دهی داشته باشیم‪ ،‬این عملگرها از راست به چپ محاسبه می شوند‪ .‬مثال پس از‬
‫اجرای دستور زیر‪ ،‬مقدار هر ‪ 3‬متغیر برابر ‪ 10‬خواهد شد‪.‬‬
‫;‪a = b = c = 10‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬

‫نکته جالب درمورد زبان ‪ C‬آنستکه دارای یک سری عملگرهای انتساب‬
‫خالصه شده است که باعث می شوند در بعضی موارد بتوانیم عبارات‬
‫کوتاهتری را بنویسیم‪ .‬این عملگرها عبارتند از ‪:‬‬
‫عملگرد‬

‫مثال‬

‫عبارت انتساب معادل‬

‫‪++‬‬

‫;‪a ++‬‬

‫;‪a = a + 1‬‬

‫‪--‬‬

‫;‪a --‬‬

‫;‪a = a – 1‬‬

‫=‪+‬‬

‫;‪a += 5‬‬

‫;‪a = a + 5‬‬

‫=‪-‬‬

‫;‪a -= 8‬‬

‫;‪a= a – 8‬‬

‫=*‬

‫;‪a *= 10‬‬

‫;‪a= a * 10‬‬

‫=‪/‬‬

‫;‪a /= 2‬‬

‫;‪a = a / 2‬‬

‫=‪%‬‬

‫;‪a %= 10‬‬

‫;‪a = a % 10‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬
‫‪‬‬

‫عملگر اول و دوم‪ ،‬عملگرهای یکانی هستند که بترتیب عملگر افزایش و عملگر کاهش‬
‫نامیده می شوند‪.‬‬
‫نکته جالب آنستکه این دو عملگر به دوصورت مورد استفاده قرار می گیرند‪.‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫در حالتی که از دستور ;‪ a ++‬استفاده شود به آن پس افزایش می گویند و بدین معناست که‬
‫ابتدا از مقدار فعلی ‪ a‬در عبارت موردنظر استفاده کن و سپس آن را افزایش بده‪.‬‬
‫اما دستور ;‪ ++ a‬که به آن پیش افزایش گفته می شود‪ ،‬ابتدا ‪ a‬را افزایش داده و سپس از آن‬
‫در عبارت استفاده می کند‪.‬‬
‫به برنامه زیر دقت کنید‪:‬‬

‫>‪#include ‫{ )(‪void main‬‬
‫; ‪int a ,b‬‬
‫;‪a=5‬‬
‫;‪b = a ++‬‬
‫;)‪printf(“a=%d and b=%d \n”,a,b‬‬
‫;‪a=5‬‬
‫;‪b = ++ a‬‬
‫;)‪printf(“a=%d and b=%d \n”,a,b‬‬
‫}‬
‫‪a=6 b=5‬‬
‫‪a=6 b=6‬‬

‫‪ 7-5-3‬عملگرهای مقایسه ای‬
‫‪‬‬

‫‪‬‬

‫این عملگرها دو عبارت را بایکدیگر مقایسه کرده و نتیجه را باز می گردانند‪.‬‬
‫نتیجه می تواند درست )‪ (true‬یا غلط )‪ (false‬باشد‪.‬‬
‫نتیجه این عملگرها یک عدد صحیح است که درصورت درست بودن ‪ 1‬و‬
‫درصورت غلط بودن ‪ 0‬باز می گردانند‪ .‬این عملگرها عبارتند از‪:‬‬
‫عملگر‬

‫مفهوم عملگر‬

‫مثال‬

‫<‬

‫بزرگتر )<(‬

‫‪a>b‬‬

‫>‬

‫کوچکتر )>(‬

‫‪a
‫=<‬

‫بزرگتر یا مساوی )≤(‬

‫‪a >= b‬‬

‫=>‬

‫کوچکتر یا مساوی )≥(‬

‫‪a <= b‬‬

‫==‬

‫مساوی )=(‬

‫‪a == b‬‬

‫=!‬

‫نامساوی )≠(‬

‫‪a != b‬‬

‫‪ 7-5-3‬عملگرهای مقایسه ای‬
‫‪‬‬

‫‪‬‬

‫نکته مهمی که باید به آن دقت کرد عملگر مساوی )==( است‪ ،‬چرا که یک‬
‫اشتباه بسیار متداول برنامه نویسان ‪ C‬استفاده اشتباه از عملگر انتساب‬
‫)=( بجای عملگر تساوی )==( است که باعث ایجاد خطا در برنامه می‬
‫شود‪.‬‬
‫اولویت این عملگرها از باال به پایین بشرح زیر است‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫عملگرهای <‪ <= ، > ،‬و =>‬
‫عملگرهای == و =!‬

‫الزم بذکر است که در هنگام مساوی بودن اولویت چند عملگر‪ ،‬این عملگرها‬
‫از چپ به راست محاسبه می گردند‪.‬‬

‫‪ 7-5-4‬عملگرهای منطقی‬
‫‪‬‬

‫این عملگرها به شما اجازه می دهند که شرطهای ساده ای را که با‬
‫استفاده از عملگرهای مقایسه ای ایجاد شده اند را با یکدیگر ترکیب نموده‬
‫و شرطهای پیچیده تری را بسازید‪ .‬این عملگرها عبارتند از ‪:‬‬
‫مثال‬

‫عملگر‬

‫مفهوم عملگر‬

‫نحوه کار‬

‫&&‬

‫‪ AND‬منطقی‬

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

‫‪a>0 && sw==1‬‬

‫||‬

‫‪ OR‬منطقی‬

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

‫‪a<=100 || b!=0‬‬

‫!‬

‫‪ NOT‬منطقی‬

‫اگر عملوند درست باشد‪ ،‬نادرست و‬
‫اگر نادرست باشد‪ ،‬درست برمی‬
‫گرداند‪.‬‬

‫)‪! (a==1 || b<10‬‬

‫‪ 7-5-5‬عملگر شرطی‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫گاهی الزم است که ابتدا یک شرط بررسی شده و سپس برمبنای نتیجه )درست یا نادرست بودن آن( یکی‬
‫از دو عبارت ممکن بازگردانده شود‪ .‬برای اینکار می توان از یک عملگر ‪3‬تایی )با ‪ 3‬عملوند( بنام عملگر‬
‫شرطی استفاده نمود‪.‬‬
‫شکل کلی این عملگر بصورت زیر است‪:‬‬
‫>عبارت‪> :<2‬عبارت‪> ?<1‬شرط<‬
‫نحوه کار بدینصورت است که درصورت درست بودن شرط‪ ،‬عبارت‪ 1‬و در غیراینصورت عبارت ‪ 2‬بازگردانده می‬
‫شود‪.‬‬
‫به عنوان مثال به دستور زیر توجه کنید‪:‬‬
‫که این عبارت معادل دستور زیر است‪:‬‬

‫‪‬‬

‫;‪a = (k<10) ? 100 : 50‬‬
‫;‪if (k<10) a=100‬‬
‫;‪else a=50‬‬

‫البته این عبارت به شکلهای پیچیده نیز می تواند مورد استفاده قرار گیرد‪ .‬مثال ‪:‬‬
‫;‪c += (a>0 && a<10) ? ++a : a/b‬‬
‫که معادل است با ‪:‬‬
‫{ )‪if (a>0 && a<10‬‬
‫;‪a= a + 1‬‬
‫;‪c = c + a‬‬
‫}‬
‫;‪else c = c + a/b‬‬

‫‪ 7-5-6‬اولویت عملگرها‬
‫عملگر‬

‫اولویت‬

‫شرکت پذیری‬

‫‪1‬‬

‫)(‬

‫از چپ به راست‬

‫‪2‬‬

‫‪- + ! -- ++‬‬

‫از راست به چپ‬

‫‪3‬‬

‫‪* / %‬‬

‫از چپ به راست‬

‫‪4‬‬

‫‪+ -‬‬

‫از چپ به راست‬

‫‪5‬‬

‫>> <<‬

‫از چپ به راست‬

‫‪6‬‬

‫>= > <= <‬

‫از چپ به راست‬

‫‪7‬‬

‫=! ==‬

‫از چپ به راست‬

‫‪8‬‬

‫&&‬

‫از چپ به راست‬

‫‪9‬‬

‫||‬

‫از چپ به راست‬

‫‪10‬‬

‫‪?:‬‬

‫از راست به چپ‬

‫‪11‬‬

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

‫از راست به چپ‬

‫‪12‬‬

‫‪,‬‬

‫از چپ به راست‬

‫‪ 7-6‬خواندن و نمایش اطالعات‬
‫‪‬‬

‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫همانطور كه قبال نیز گفته شد‪ ،‬یكی از اهداف زبان ‪ C‬قابل حمل بودن آن‬
‫است‪ .‬بهمین منظور سعی شده است كه از دستوراتی كه ممكن است‬
‫وابسته به ماشین خاصی باشد‪ ،‬اجتناب گردد‪.‬‬
‫بهمین دلیل زبان ‪ C‬برخالف سایر زبانها دارای هیچ دستوری برای‬
‫خواندن از ورودی و یا نوشتن در خروجی نیست‪.‬‬
‫اما در عوض دارای تعدادی تابع )زیربرنامه( استاندارد می باشد كه تقریبا‬
‫تمامی كامپایلرها از آنها حمایت می كنند‪.‬‬
‫این كار به كامپایلر این امكان را می دهد كه بر حسب نوع سخت افزار‬
‫موردنظر‪ ،‬توابع ورودی و خروجی را طراحی نماید‪.‬‬
‫این توابع در یك فایل سرآمد بنام ‪ stdio.h‬تعریف شده اند و بنابراین قبل‬
‫ازاینكه بتوانید از این توابع استفاده نمایید‪ ،‬باید این فایل را نیز با استفاده‬
‫از ‪ #include‬در برنامه خود بگنجانید‪.‬‬

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫برای نمایش اطالعات در خروجی از تابع ‪ printf‬استفاده می شود‪.‬‬
‫این تابع رشته موردنظر شما را به خروجی استاندارد )كه در حالت‬
‫عادی همان صفحه نمایش یا مانیتور است( می فرستد‪ .‬شكل كلی این‬
‫تابع بصورت زیر است‪:‬‬
‫; )>لیست متغیرها< ‪> ,‬رشته كنترلی<(‪printf‬‬
‫رشته كنترلی همان متنی است كه قصد چاپ آن را داریم‪ ،‬با ذكر این‬
‫نكته كه در قسمتهایی كه باید مقدار یك متغیر چاپ شود‪ ،‬از یك‬
‫مشخصه تبدیل استفاده می شود‪ .‬هر مشخصه تبدیل از یك عالمت ‪%‬‬
‫بعالوه یك كاراكتر كه نوع متغیر مورد نظر را نشان می دهد تشكیل می‬
‫گردد‪.‬‬
‫لیست متغیرها نیز همان متغیرهایی هستند كه قصد چاپ آنها را داریم‪.‬‬
‫این متغیرها باید بترتیب قرار گرفته و با كاما )‪ (,‬از یكدیگر جدا شوند‪.‬‬

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫مشخصه تبدیل‬

‫مفهوم‬

‫‪%c‬‬

‫كاراكتر‬

‫‪%d‬‬

‫عدد صحیح در مبنای ‪10‬‬

‫‪%f‬‬

‫عدد اعشاری بدون نماد علمی‬

‫‪%e‬‬

‫عدد اعشاری با نماد علمی‬

‫‪%g‬‬

‫عدد اعشاری با حالت كوتاهتر بین ‪ e‬و ‪f‬‬

‫‪%s‬‬

‫رشته‬

‫‪%ld‬‬

‫عدد صحیح بزرگ‬

‫‪%lf %le %lg‬‬

‫عدد اعشاری بزرگ‬

‫‪%o‬‬

‫عدد صحیح در مبنای ‪8‬‬

‫‪%x‬‬

‫عدد صحیحی در مبنای ‪16‬‬

‫‪%u‬‬

‫عدد صحیح بدون عالمت‬

‫ تابع نمایش در خروجی‬7-6-1
#include
void main() {
int age = 20;
floate average = 18.23;
printf("You are %d years old and your average is %f \n",age,average);
}
You are 20 years old and your average is 18.230000

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫‪‬‬
‫‪‬‬

‫برای کنترل نحوه چاپ اعداد می توانید از مشخصه طول میدان استفاده‬
‫کنید‪.‬‬
‫مشخصه طول میدان برای اعداد به شكل زیر استفاده می شود‪:‬‬
‫‪ ‬برای اعداد صحیح از ‪ %nd‬استفاده می كنیم كه ‪ n‬تعداد ارقام را نشان‬
‫می دهد )مثال ‪ .(%3d‬در اینصورت برای هر متغیر ‪ n‬رقم درنظر گرفته‬
‫می شود‪ .‬اگر اندازه عدد از ‪ n‬كوچكتر باشد‪ ،‬به سمت چپ آن فضای‬
‫خالی اضافه می شود و اگر اندازه عدد بیش از ‪ n‬رقم باشد‪ ،‬طول میدان‬
‫نادیده گرفته شده و عدد بطور كامل چاپ می شود‪.‬‬
‫‪ ‬برای اعداد اعشاری از ‪ %n.mf‬استفاده می كنیم كه ‪ n‬اندازه كل عدد‬
‫)شامل عالمت ممیز( و ‪ m‬تعداد ارقام اعشار است )مثال ‪ .(%5.2f‬در‬
‫صورتیكه تعداد ارقام اعشاری عدد موردنظر از ‪ m‬بیشتر باشد‪ ،‬عدد به ‪m‬‬
‫عدد اعشار گرد می شود و در صورتیكه از ‪ m‬كمتر باشد‪ ،‬در سمت‬
‫راست آن ‪ 0‬قرار داده می شود‪.‬‬

‫‪ 7-6-2‬تابع خواندن از ورودی‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای خواندن اطالعات از ورودی از تابع ‪ scanf‬استفاده می شود‪.‬‬
‫این تابع اطالعات را ازورودی استاندارد )معموال صفحه كلید( خوانده و در‬
‫متغیرهای تعیین شده قرار می دهد‪.‬‬
‫شكل كلی این تابع بصورت زیر است‪:‬‬
‫; )>لیست آدرسهای متغیرها< ‪> ,‬رشته كنترلی<(‪scanf‬‬
‫همانطور كه می بینید نحوه احضار تابع ‪ scanf‬نیز مشابه ‪ printf‬است‪ .‬تنها‬
‫تفاوت در آن است كه در ‪ scanf‬باید لیست آدرسهای متغیرها ارسال شود‪.‬‬
‫مبحث مربوط به آدرسها در فصول بعدی بررسی خواهد شد ولی در حال حاضر‬
‫بخاطر بسپارید كه برای بدست آوردن آدرس یك متغیر از عالمت & استفاده می‬
‫كنیم‪ .‬بعنوان مثال ‪ &age‬بمعنای آدرس متغیر ‪ age‬است‪.‬‬
‫بطور كلی در ‪ C‬قدیمی هرگاه كه یك تابع دارای پارامترهای خروجی بود )یعنی‬
‫پارامترهایی كه یك مقدار را باز می گرداندند( از آدرس متغیرها استفاده می‬
‫شد كه امروزه این مسئله وجود ندارد‪.‬‬

‫ تابع خواندن از ورودی‬7-6-2
#include
void main() {
int age;
float average ;
printf("Please enter your age and average : ");
scanf("%d %f",&age,&average);
printf("You are %d years old and your average is %5.2f \n",age,average);
}

Please enter your age and average : 19 16.72
You are 19 years old and your average is 16.72

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫زبان ‪ C++‬یک زبان شی گرا است‪ ،‬بهمین دلیل در این زبان برای ورودی‬
‫و خروجی از اشیاء بجای توابع استفاده می گردد‪.‬‬
‫از آنجا که امروزه معموال برنامه نویسان ‪ C‬از کامپایلرهای ‪ C++‬استفاده‬
‫می کنند‪ ،‬می توانند از اشیای ورودی و خروجی آن نیز استفاده کنند‪.‬‬
‫اینکار در بین بسیاری از برنامه نویسان ‪ C‬متداول است‪ ،‬بهمین دلیل ما‬
‫در اینجا نحوه کار با اشیای خواندن و نوشتن در ‪ C++‬را بطور مقدماتی‬
‫توضیح می دهیم؛ گرچه توضیح کامل این موارد نیاز به آشنایی با شی‬
‫گرایی و زبان ‪ C++‬دارد‪.‬‬
‫قبل از هرچیز الزم به ذکر است که کلیه اشیای مربوط به ورودی و‬
‫خروجی در فایل سرآمدی بنام ‪ iostream.h‬تعیریف شده اند‪ ،‬بنابراین‬
‫ابتدا باید این فایل به برنامه توسط دستور ‪ #include‬الحاق گردد‪.‬‬

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫زبان ‪ C++‬برای نمایش اطالعات از یک شیئ بنام ‪ cout‬استفاده می نماید‪.‬‬
‫برای ارسال اطالعات مورد نظر برای چاپ به ‪ cout‬باید از عملگر درج در جریان‬
‫یا >> استفاده نماییم‪ .‬بعنوان مثال ‪:‬‬
‫; ” ‪cout >> “Please enter your name:‬‬
‫و یا مثال دیگر ‪:‬‬
‫;‪int a = 10‬‬
‫;‪float b = 2.86‬‬
‫;‪cout << a‬‬
‫;‪cout << b‬‬
‫نکته جالبی که در این مثالها دیده می شود‪ ،‬آنستکه برخالف تابع ‪ printf‬هیچ‬
‫نیازی به مشخص کردن نوع متغیری که قصد چاپ آن را داریم نیست و خود‬
‫شئ ‪ cout‬نوع آن را تشخیص می دهد‪.‬‬
‫عالوه براین می توان چندین عملگر درج در جریان را با یکدیگر الحاق کرد و‬
‫چندین متغیر را با یک دستور چاپ کرد‪.‬‬

C++ ‫ ورودی و خروجی اطالعات در‬7-6-3
#include
void main() {
int age = 20;
floate average = 18.23;
cout >> “You are ” >> age >> “ years old and your average is ” >> average ;
}

You are 20 years old and your average is 18.230000

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای دریافت اطالعات از کاربر‪ ،‬از شئ دیگری بنام ‪ cin‬استفاده می شود‪.‬‬
‫برای ارسال متغیر مورد نظر به ‪ cin‬باید از عملگر استخراج از جریان یا <<‬
‫استفاده نماییم‪ .‬بعنوان مثال‪:‬‬
‫;‪int a‬‬
‫;‪cin >> a‬‬
‫بازهم همانطور که می بینید نیازی به تعیین نوع متغیر موردنظر نیست و خود‬
‫شئ ‪ cin‬نوع متغیر را بطور اتوماتیک تشخیص داده و داده ای از همان نوع را از‬
‫کاربر دریافت و در متغیر مورد نظر قرار می دهد‪.‬‬
‫عملگرهای استخراج از جریان را نیز می توان با یکدیگر الحاق کرد‪.‬‬
‫برای رفتن به خط بعد در شئ ‪ cout‬می توان از دستکاری کننده ‪ endl‬استفاده‬
‫کرد‪ .‬مثال در دستور زیر پس از چاپ پیغام‪ ،‬مکان نما به خط بعد منتقل می‬
‫شود‪:‬‬
‫;‪cout >> “List of students : “ >> endl‬‬
‫البته دستکاری کننده های متعدد دیگری نیز ازجمله موارد مربوط به تعیین طول‬
‫میدان و نحوه چاپ مقادیر وجود دارد که توضیح آنها نیاز به یک مبحث مستقل‬
‫دارد‪.‬‬

C++ ‫ ورودی و خروجی اطالعات در‬7-6-3
#include
void main() {
int age;
float average ;
cout << "Please enter your age and average : " ;
cin >> age >> average ;
cout << "You are " << age << "years old and your average is " << average;
}

Please enter your age and average : 19 16.72
You are 19 years old and your average is 16.72

‫‪ 7-7‬توابع کتابخانه ای‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫همانطور که قبال نیز گفته شد‪ ،‬زبان ‪ C‬از زیر برنامه ها نیز حمایت می کند‪ .‬هر زیر برنامه‬
‫در ‪ C‬یک تابع نامیده می شود‪ .‬تا کنون با توابعی همچون ‪ main‬و یا ‪ printf‬و ‪ scanf‬آشنا‬
‫شده ایم‪.‬‬
‫معموال عرضه کنندگان کامپایلرها و یا سایر فروشندگان نرم افزار‪ ،‬برخی از توابع عمومی‬
‫را که ممکن است مورد نیاز جمع کثیری از برنامه نویسان مختلف باشد را در قالب‬
‫کتابخانه ای از توابع در اختیار برنامه نویسان می گذارند‪ .‬بعضی از این توابع کتابخانه ای‬
‫مانند ‪ printf‬و ‪ scanf‬بصورت استاندارد درآمده و توسط عرضه کنندگان مختلف ارائه می‬
‫شوند‪.‬‬
‫در کامپایلر عرضه شده توسط شرکت بورلند )‪ (Borland C++ 3.1‬نیز کتابخانه های‬
‫متعددی از توابع برای شما عرضه شده اند که بتدریج با آنها و کاربردشان آشنا خواهید‬
‫شد‪.‬‬
‫نکته مهم آنستکه برای استفاده از این توابع ابتدا باید فایل سرآمد مربوط به آنها را نیز در‬
‫ابتدای برنامه خود اضافه نمایید ) با استفاده از ‪ .(#include‬هر فایل سرآمد شامل تعاریف‬
‫اولیه گروهی از توابع مرتبط با هم و داده های مربوط به آنها بوده و در استاندارد قدیمی‬
‫تر دارای پسوند ‪ .h‬می باشد)در استاندارد جدید پسوند این فایلها حذف شده است(‪.‬‬
‫برخی از این فایلهای سرآمد عبارتند از‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪ : stdio.h‬توابع ورودی و خروجی استاندارد‬
‫‪ : math.h‬توابع ریاضی‬
‫‪ : graphics.h‬توابع مربوط به عملیات گرافیکی‬
‫‪ : string.h‬توابع مربوط به کار با رشته ها‬


Slide 35

‫مبانی کامپیوتر و برنامه سازی‬
‫فصل هفتم ‪ :‬مفاهیم اولیه زبان ‪C‬‬
‫مدرس ‪ :‬نگین معروفی‬

‫‪ 7-1‬شناسه ها در ‪C‬‬
‫‪‬‬
‫‪‬‬

‫شناسه )‪ (identifier‬نامی است که به یک قسمت از برنامه مانند متغیر‪ ،‬تابع‪ ،‬ثابت و یا‬
‫‪ ...‬داده می شود‪.‬‬
‫در زبان ‪ C‬برای انتخاب شناسه ها فقط می توان از عالئم زیر استفاده کرد‪:‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫حروف انگلیسی کوچک و بزرگ )‪(A…Z a…z‬‬
‫ارقام )‪(0…9‬‬
‫عالمت خط پایین یا _‬

‫البته یک شناسه نمی تواند با یک رقم شروع شود‪.‬‬
‫چند شناسه مجاز‪ name2 ، average ، sum :‬و ‪student_average‬‬
‫چند شناسه غیرمجاز ‪ 2name‬و یا ‪student average‬‬
‫در برنامه نویسی امروزی پیشنهاد می شود بجای شناسه هایی همانند‬
‫‪ student_average‬از ‪ studentAverage‬استفاده گردد‪.‬‬
‫نکته مهم دیگری که باید به آن اشاره کرد آنستکه زبان ‪ C‬برخالف بسیاری از زبانهای دیگر‬
‫به کوچک و بزرگی حروف حساس است )‪ .(case sensitive‬در نتیجه شناسه های زیر با‬
‫یکدیگر متفاوتند ‪:‬‬
‫‪Sum ≠ sum ≠ SUM‬‬
‫آخرین نکته اینستکه در هنگام انتخاب شناسه نمی توانید از کلمات کلیدی که برای‬
‫منظورهای خاص در زبان ‪ C‬رزرو شده اند استفاده کنید‪.‬‬

C ‫ شناسه ها در‬7-1
: C ‫کلمات کلیدی در زبان‬
auto

break

case

char

const

continue

default

do

double

else

enum

extern

float

for

goto

if

int

long

register

return

short

signed

sizeof

static

struct

switch

typedef

union

unsigned

void

volatile

while

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫محدوده‬

‫اندازه )بیت(‬

‫توضیح‬

‫نوع داده‬

‫‪-128 to +127‬‬

‫‪8‬‬

‫کاراکتر‬

‫‪char‬‬

‫‪-32768 to +32767‬‬

‫‪16‬‬

‫عدد صحیح‬

‫‪int‬‬

‫‪3.4e-38 to 3.4e+38‬‬

‫‪32‬‬

‫عدد اعشاری‬

‫‪float‬‬

‫‪1.7e-308 to 1.7e+308‬‬

‫‪64‬‬

‫عدد اعشاری با‬
‫دقت مضاعف‬

‫‪double‬‬

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫‪‬‬

‫البته چند نکته مهم درمورد این جدول قابل ذکر است ‪:‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫اندازه ‪ int‬در محیطهای ‪ 16‬بیتی مانند ‪ DOS‬برابر ‪ 16‬بیت است‪ .‬اما در‬
‫محیطهای ‪ 32‬بیتی همانند ‪ Windows‬اندازه آن ‪ 32‬بیت می باشد که در‬
‫اینصورت محدوده ای برابر ‪ -2,147,483,648‬تا ‪ +2,147,483,647‬را‬
‫پوشش می دهد‪.‬‬
‫در بعضی از کامپایلرهای ‪ ،C‬نوع داده ‪ bool‬نیز وجود دارد که می تواند‬
‫یکی از مقادیر ‪)true‬درست( یا ‪) false‬غلط( را نشان دهد ‪ .‬اما در نسخه‬
‫های اولیه ‪ C‬از همان نوع داده صحیح یا ‪ int‬برای اینکار استفاده می‬
‫شد‪ .‬بدین صورت که ‪ 0‬نشاندهنده ‪ false‬و هر عدد غیر صفر )معموال ‪(1‬‬
‫نشاندهنده ‪ true‬است‪.‬‬
‫از آنجا که برای ذخیره سازی کاراکترها کد اسکی آنها ذخیره می گردد‪،‬‬
‫از یک متغیر کاراکتری یا ‪ char‬می توان بعنوان یک عدد صحیح کوچک نیز‬
‫استفاده کرد و اعمال ریاضی برروی آنها نیز مجاز است‪.‬‬

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫عالوه براین چندین اصالح کننده نیز وجود دارد که به ما اجازه می دهد نوع داده مورد‬
‫نظر را با دقت بیشتری برای نیازهای مختلف استفاده نماییم‪.‬‬
‫این اصالح کننده ها عبارتند از ‪short, long, signed, unsigned :‬‬
‫تمام این اصالح کننده ها می توانند به نوع داده ‪ int‬اعمال شوند و اثر آنها بستگی‬
‫به محیط دارد‪.‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫در یک محیط ‪16‬بیتی‪short int ،‬بازهم برابر ‪16‬بیت است ولی ‪ long int‬برابر‪32‬بیت می‬
‫باشد‪.‬‬
‫‪ unsigned int‬باعث می شود که یک عدد ‪ 16‬بیتی بدون عالمت داشته باشیم که بازه‬
‫بین ‪ 0‬تا ‪ 65535‬را پوشش می دهد‪ signed int .‬نیز همانند ‪ int‬معمولی بوده و تفاوتی‬
‫ندارد‪.‬‬
‫ترکیب این اصالح کننده ها نیز ممکن است‪ .‬مثال ‪ unsigned long int‬یک عدد ‪ 32‬بیتی‬
‫بدون عالمت است که بازه ‪ 0‬تا ‪ 4,294,967,295‬را پوشش می دهد‪.‬‬

‫برروی نوع داده ‪ char‬فقط اصالح کننده های ‪ signed‬و ‪ unsigned‬را می توان اعمال‬
‫کرد‪ .‬معموال از اصالح کننده ‪ unsigned‬وقتی استفاده می شود که قصد داشته‬
‫باشیم از ‪ char‬بعنوان یک عدد صحیح مثبت بین ‪ 0‬تا ‪ 255‬استفاده کنیم‪.‬‬
‫برروی نوع داده ‪ double‬تنها اصالح کننده ‪ long‬قابل اعمال است و دراینصورت عدد‬
‫اعشاری با ‪ 80‬بیت را خواهیم داشت که قادر است هر عددی در بازه ‪ 3.4e-4932‬تا‬
‫‪ 1.1e+4932‬را در خود نگاه دارد‪.‬‬

‫‪ 7-3‬تعریف متغیرها‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای تعریف متغیرها به شکل زیر عمل می کنیم‪:‬‬

‫;>‪ ‫که ‪ type‬یکی از نوع داده های گفته شده و ‪ variable-list‬لیستی از متغیرها است‬
‫که با کاما از یکدیگر جدا شده اند‪ .‬بعنوان مثال ‪:‬‬
‫;‪int sum‬‬
‫;‪float average‬‬
‫; ‪long int a, b, c‬‬
‫; ‪unsigned long int i, j, k‬‬
‫عالوه براین می توان در هنگام تعریف متغیر به آن مقدار اولیه نیز داد‪ .‬مثال ‪:‬‬
‫; ‪int d = 0‬‬
‫نكته مهم آنكه زبان ‪ C‬به متغیرها مقدار اولیه نمي دهد )حتي ‪ (0‬و برنامه نويس‬
‫خود بايد اينكار را صريحا انجام دهد‪ ،‬درغیر اينصورت مقدار اولیه متغیر‪ ،‬نامعین خواهد‬
‫بود‪.‬‬
‫تعریف متغیرها طبق اصول زبان ‪ C‬میتواند درهرجایی از برنامه صورت پذیرد‪ ،‬و‬
‫متغیرهای تعریف شده از همان خط به بعد قابل استفاده خواهد بود‪ .‬اما معموال‬
‫توصیه می گردد كه تعریف متغیرها در همان خط ابتدایی تابع و بالفاصله پس از {‬
‫صورت پذیرد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫‪‬‬
‫‪‬‬

‫ثابتها مقادیر ثابتی هستند كه مقدار آنها در حین اجرای برنامه تغییر نمی یابد‪ .‬ثابتها می توانند از‬
‫هریك از نوع داده های اصلی باشند‪.‬‬
‫ثوابت عددی صحیح ‪:‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫برای نمایش این دسته از ثوابت‪ ،‬از دنباله ای از ارقام بعالوه عالمت ‪ +‬یا ‪ -‬استفاده می كنیم‪ .‬بعنوان مثال‬
‫‪ -45‬و یا ‪ 3489‬ثوابت صحیح هستند‪.‬‬
‫در حالت عادی ‪ C‬هر عدد را در كوچكترین نوع داده ای كه می تواند قرار می دهد‪ .‬مثال عدد ‪ 85‬در یك‬
‫‪ int‬قرار می گیرد‪ ،‬اما عدد ‪ 145398‬در یك ‪ long int‬قرار خواهد گرفت‪.‬‬
‫اگر قصد دارید یك عدد كوچك بعنوان ‪ long‬محسوب گردد‪ ،‬می توانید از پسوند ‪ L‬در انتهای آن استفاده‬
‫می كنیم‪ .‬مثال ‪245L‬یك عدد ‪ long‬محسوب می شود‪.‬‬
‫;‪long int a = 20L‬‬
‫پسوند ‪ U‬در انتهای عدد نیز نشانه بدون عالمت بودن آن است‪.‬‬
‫نكته دیگر آنكه ‪ C‬به شما اجازه می دهد درصورت لزوم ثوابت صحیح خود را در مبنای ‪ 8‬یا ‪ 16‬نیز كه‬
‫از مبناهای متداول در برنامه نویسی هستند‪ ،‬بنویسید‪.‬‬
‫‪‬‬
‫‪‬‬

‫برای نوشتن عدد در مبنای ‪ 8‬باید آن را با ‪ 0‬آغاز كنید‪ ،‬مثال ‪ 0342‬یك عدد در منای ‪ 8‬محسوب می‬
‫گردد‪.‬‬
‫برای نوشتن یك عدد در مبنای ‪ 16‬باید آن را با ‪ 0x‬آغاز نمایید‪ ،‬مانند ‪.0x27A4‬‬

‫‪ 7-4‬ثوابت‬
‫ثوابت عددی اعشاری‬

‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫برای نمایش اعداد اعشاری‪ ،‬باید از نقطه اعشار استفاده كنیم‪ ،‬مانند ‪237.45‬‬
‫اما نكته جالب آنستكه می توانید از نماد علمی نیز برای نمایش اعداد‬
‫اعشاری استفاده كنید‪ .‬برای اینكار كافی است از حرف ‪ e‬برای نمایش قسمت‬
‫توان استفاده نمایید‪ .‬بعنوان مثال ‪:‬‬
‫‪-23.47 × 10 5 = -23.47e5‬‬
‫‪42.389 × 10 -3 = 42.389e-3‬‬
‫دقت كنید كه قسمت توان‪ ،‬حتما یك عدد صحیح است‪.‬‬
‫نكته جالب اینجاست كه برخالف مورد قبل‪ ،‬كامپایلر بطور پیش فرض داده های‬
‫اعشاری را از نوع ‪ double‬فرض می كند‪.‬چنانچه دوست دارید ثابت شما ازنوع‬
‫‪ float‬درنظر گرفته شود‪ ،‬در انتهای آن ‪ F‬قرار دهید‪ .‬ضمنا پسوند ‪ L‬نیز داده‬
‫اعشاری را از نوع ‪ long double‬درنظر می گیرد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫ثوابت كاراكتری ‪:‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫برای نشان دادن ثوابت كاراكتری‪ ،‬آنها را در داخل ' قرار می دهیم‪ .‬بعنوان مثال‬
‫'‪'A‬یك ثابت كاراكتری است‪.‬‬
‫; '‪char ch = 'S‬‬
‫دقت كنید كه همانطور كه قبال گفته شد‪ ،‬كد اسكی كاراكترها در متغیر ذخیره‬
‫می گردد‪ ،‬بنابراین می توان از آن بعنوان یك عدد صحیح نیز استفاده كرد‪ .‬نكته‬
‫مهم دیگر آنستكه به تفاوت عدد ‪ 5‬و كاراكتر '‪ '5‬دقت داشته باشید‪ .‬در حقیقت‬
‫'‪ '5‬برابر است با عدد ‪ 53‬كه همان كد اسكی آن است‪.‬‬
‫روش فوق‪ ،‬برای نمایش کاراکترهای قابل چاپ مناسب است‪ ،‬اما بعضی‬
‫كاراكترها مانند ‪ enter‬قابل نمایش نبوده و برای آنها شکل خاصی وجود ندارد‪.‬‬
‫در چنین مواردی‪ ،‬زبان ‪ C‬از ترکیب عالمت \ به همراه یک کاراکتر دیگر‪ ،‬برای‬
‫نمایش این قبیل کاراکترها استفاده می نماید‪ .‬بعنوان مثال‪ ،‬کاراکتر '‪ '\n‬نشان‬
‫دهنده خط جدید یا همان ‪ enter‬می باشد‪.‬‬
‫جدول صفحه بعد این قبیل کاراکترها و معادل آنها را نشان می دهد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫نحوه نمایش در ‪C‬‬

‫کد اسکی‬

‫صدای بوق کامپیوتر‬

‫‪\a‬‬

‫‪7‬‬

‫حرکت به عقب ‪backspace‬‬

‫‪\b‬‬

‫‪8‬‬

‫شروع صفحه ‪form feed‬‬

‫‪\f‬‬

‫‪12‬‬

‫سطر جدید ‪line feed‬‬

‫‪\n‬‬

‫‪10‬‬

‫برگشت به ابتداي سطر ‪carriage return‬‬

‫‪\r‬‬

‫‪13‬‬

‫فاصله افقی ‪horizontal tab‬‬

‫‪\t‬‬

‫‪9‬‬

‫فاصله عمودی ‪vertical tab‬‬

‫‪\v‬‬

‫‪11‬‬

‫عالمت سوال‬

‫?\‬

‫‪63‬‬

‫عالمت '‬

‫'\‬

‫‪39‬‬

‫عالمت "‬

‫"\‬

‫‪34‬‬

‫عالمت \‬

‫\\‬

‫‪92‬‬

‫عالمت تهی‬

‫‪\0‬‬

‫‪0‬‬

‫نام کاراکتر‬

‫کد اسکی یک کاراکتر با ‪ 3‬رقم در مبنای ‪8‬‬

‫‪\000‬‬

‫کد اسکی یک کاراکتر با ‪ 2‬رقم در مبنای ‪16‬‬

‫‪\x00‬‬

‫‪ 7-4‬ثوابت‬
‫‪‬‬

‫ثوابت رشته ای ‪ C :‬عالوه بر ثوابت فوق‪ ،‬از یك ثابت دیگر بنام رشته نیز‬
‫حمایت می كند‪ .‬رشته‪ ،‬دنباله ای از كاراكترها است كه در داخل " قرار‬
‫می گیرند‪ .‬بعنوان مثال "‪ "this is a test‬یك رشته است‪ .‬دقت كنید كه '‪'a‬‬
‫یك كاراكتر است‪ ،‬اما "‪ "a‬یك رشته است كه فقط شامل یك كاراكتر می‬
‫باشد‪.‬‬

‫‪ 7-5‬عملگرها‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫عملگر‪ ،‬نمادی است كه به كامپایلر می گوید تا عملیات محاسباتی یا‬
‫منطقی خاصی را برروی یك یا چند عملوند‪ ،‬انجام دهد‪.‬‬
‫به عملگرهایی كه فقط یك عملوند دارند‪ ،‬عملگر یكانی می گوییم و‬
‫همواره عملگر در سمت چپ عملوند قرار می گیرد)مانند عدد ‪.(-125‬‬
‫اما عملگرهایی كه برروی دو عملوند اثر می كنند را عملگر دودویی‬
‫نامیده و عملگر را بین دو عملوند قرار می دهیم )مانند ‪.(23+86‬‬
‫هر ترکیب درستی از عملگرها و عملوندها را یک عبارت می نامیم‪.‬‬
‫‪ C‬از نقطه نظر عملگرها یك زبان بسیار قوی است‪ .‬این عملگرها به چند‬
‫دسته اصلی تقسیم می گردند كه آنها را به ترتیب بررسی می كنیم‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫این عملگرها‪ ،‬همان اعمال متداول ریاضی هستند كه در زبان ‪ C‬مورد استفاده‬
‫قرار می گیرند‪ .‬این اعمال عبارتند از ‪:‬‬

‫عمل‬

‫نوع‬

‫عملگر‬

‫منفی كردن عملوند سمت راست‬

‫یكانی‬

‫‪-‬‬

‫جمع دو عملوند‬

‫دودویی‬

‫‪+‬‬

‫تفریق دو عملوند‬

‫دودویی‬

‫‪-‬‬

‫ضرب دو عملوند‬

‫دودویی‬

‫*‬

‫تقسیم دو عملوند‬

‫دودویی‬

‫‪/‬‬

‫محاسبه باقیمانده تقسیم دو عملوند‬

‫دودویی‬

‫‪%‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬
‫‪‬‬

‫این عملگرهای برروی همه انواع داده های ‪ C‬عمل می كنند‪ ،‬بجز عملگر ‪ %‬كه فقط‬
‫برروی نوع داده های صحیح عمل می كند‪.‬‬
‫اما نكته مهمی كه باید به آن اشاره كرد‪ ،‬نحوه كار عملگر تقسیم برروی نوع داده های‬
‫مختلف است‪.‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫درصورتیكه هردو عملوند صحیح باشند‪ ،‬تقسیم بصورت صحیح بر صحیح انجام خواهد شد‪.‬‬
‫اگر یكی یا هر دو عملوند اعشاری باشند‪ ،‬تقسیم بصورت اعشاری انجام خواهد پذیرفت‪.‬‬
‫فرض كنید تعاریف زیر را داریم ‪:‬‬
‫; ‪int a,b‬‬
‫; ‪float c,d‬‬
‫; ‪a = 10 ; b = 4‬‬
‫;‪c = 8.2; d = 4.0‬‬
‫اكنون به نتایج عملیات زیر دقت كنید ‪:‬‬
‫‪a / b => 2‬‬
‫‪c / d => 2.05‬‬
‫‪a / d => 2.5‬‬
‫‪a / 4 => 2‬‬
‫چنانچه به آخرین مورد توجه كنید‪ ،‬متوجه می شوید كه از آنجا كه ‪a‬یك متغیر صحیح است و ‪4‬‬
‫نیز یك ثابت صحیح در نظر گرفته شده‪ ،‬درنتیجه تقسیم بصورت صحیح بر صحیح انجام گرفته‬
‫است‪ .‬چنانچه بخواهیم تقسیم بصورت اعشاری صورت پذیرد‪ ،‬به دو شكل می توانیم عمل‬
‫كنیم‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫برای اینکه عبارت تقسیم صفحه قبل بصورت اعشاری انجام شود‪ ،‬به دو روش‬
‫می توان عمل کرد‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫این عبارت را بصورت ‪ a / 4.0‬بنویسیم‪.‬‬
‫از عملگر قالب ریزی استفاده كنیم‪.‬‬

‫عملگر قالب ریزی می تواند یك نوع را به نوع دیگری تبدیل نماید‪ .‬شكل كلی آن‬
‫به شكل زیر است ‪:‬‬
‫>‪() ‫كه ‪ type‬نوع مورد نظر است كه قصد تبدیل عبارت ‪ expression‬به آن نوع را‬
‫داریم‪ .‬بعنوان مثال در مورد قبلی می توان به شكل زیر عمل كرد ‪:‬‬
‫‪(float) a / 4‬‬
‫در این حالت از كامپایلر خواسته ایم كه ابتدا عدد ‪ a‬را به اعشاری تبدیل كند‬
‫)البته بصورت موقت( و سپس آن را بر ‪ 4‬تقسیم نماید‪ ،‬كه مسلما حاصل‬
‫اعشاری خواهد بود‪.‬‬
‫بطوركلی هرگاه ثابتها و متغیرهایی از انواع مختلف در یك عبارت محاسباتی‬
‫داشته باشیم‪ ،‬كامپایلر ‪ C‬همه آنها را به یك نوع یكسان كه همان بزرگترین‬
‫عملوند موجود است تبدیل خواهد كرد‪ .‬بعنوان مثال به مورد صفحه بعد دقت‬
‫كنید ‪:‬‬

‫ عملگرهای محاسباتی‬7-5-1
char ch;
int i;

float f;
double d;
result = (ch / i)
int

+

(f *d)

(f+i)
float

double

double

int

-

double

double

float

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫اولویت عملگرها ‪ :‬در عبارتی که شامل چندین عملگر است‪ ،‬کدامیک در‬
‫ابتدا اعمال خواهد گردید‪.‬‬
‫اولویت عملگرهای محاسباتی از باال به پایین بشرح زیر است‪:‬‬
‫‪ ‬عملگر یکانی –‬
‫‪ ‬عملگرهای * و ‪ /‬و ‪%‬‬
‫‪ ‬عملگرهای ‪ +‬و –‬
‫چنانچه اولویت دو عملگر یکسان باشد‪ ،‬این عملگرها از چپ به راست‬
‫محاسبه خواهند شد‪.‬‬
‫چنانچه بخواهیم یک عمل با اولویت پایین زودتر انجام شود‪ ،‬باید از پرانتز‬
‫استفاده کنیم‪ .‬بنابراین اولویت عملگر پرانتز از همه موارد فوق‬
‫بیشتراست‪ .‬در مورد پرانتزهای متداخل‪ ،‬ابتدا پرانتز داخلی محاسبه‬
‫می شود؛ اما در مورد پرانتزهای هم سطح‪ ،‬ابتدا پرانتز سمت چپتر‬
‫محاسبه می گردد‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫چند مثال در مورد اولویت عملگرها‬

‫ترتیب اجرای عملگرها‬

‫عبارت زبان ‪C‬‬

‫ابتدا عمل * و سپس عمل ‪+‬‬

‫‪b+c*d‬‬

‫ابتدا عمل ‪ +‬و سپس عمل *‬

‫‪(b + c) * d‬‬

‫ابتدا عمل ‪ /‬سپس عمل * و در انتها عمل ‪+‬‬

‫‪b+c/d*e‬‬

‫ابتدا عمل * سپس عمل ‪ /‬و در انتها عمل ‪+‬‬

‫)‪b + c / (d * e‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫یک مثال کامل در مورد اولویت عملگرها‬

‫‪result = a + b * (f – (g + b) / d) – c * (a – d) / e‬‬
‫‪6‬‬

‫‪1‬‬
‫‪7‬‬

‫‪2‬‬

‫‪8‬‬

‫‪3‬‬
‫‪4‬‬
‫‪5‬‬
‫‪9‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫در زبان ‪ C‬برای انتساب چندین عملگر وجود دارد‪ .‬ساده ترین عملگر انتساب‪ ،‬همان عملگر =‬
‫است که در بسیاری از زبانها استفاده می شود‪ .‬بعنوان مثال ‪:‬‬
‫;‪a = 5‬‬
‫;‪b = c + 2 * d‬‬
‫این عملگر باعث می شود که عبارت سمت راست در عبارت سمت چپ قرار گیرد‪.‬‬
‫توجه کنید که مقدار سمت چپ باید عبارتی باشد که بتوان به آن یک مقدار را نسبت داد‬
‫)مانند یک متغیر( که به آن ‪ Lvalue‬گفته می شود‪ ،‬بنابراین یک ثابت نمی تواند در سمت چپ‬
‫قرار گیرد‪.‬‬
‫نکته دیگر اینکه اولویت عملگر = از عملگرهای ریاضی کمتر است و درنتیجه ابتدا آن عملیات‬
‫انجام شده و در پایان حاصل در عبارت سمت چپ ریخته می شود‪.‬‬
‫الزم به ذکر است که در هنگام انتساب‪ ،‬درصورت لزوم نوع عبارت سمت راست به نوع عبارت‬
‫سمت چپ تبدیل می شود‪ .‬مثال‪:‬‬
‫;‪int a‬‬
‫;‪a = 2.5 * 5.0‬‬
‫که دراینصورت عدد ‪ 12‬در ‪ a‬ذخیره خواهد شد‪.‬‬
‫شرکت پذیری این عملگر از راست به چپ می باشد‪ ،‬بدین معنا که چنانچه چندین عملگر‬
‫نسبت دهی داشته باشیم‪ ،‬این عملگرها از راست به چپ محاسبه می شوند‪ .‬مثال پس از‬
‫اجرای دستور زیر‪ ،‬مقدار هر ‪ 3‬متغیر برابر ‪ 10‬خواهد شد‪.‬‬
‫;‪a = b = c = 10‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬

‫نکته جالب درمورد زبان ‪ C‬آنستکه دارای یک سری عملگرهای انتساب‬
‫خالصه شده است که باعث می شوند در بعضی موارد بتوانیم عبارات‬
‫کوتاهتری را بنویسیم‪ .‬این عملگرها عبارتند از ‪:‬‬
‫عملگرد‬

‫مثال‬

‫عبارت انتساب معادل‬

‫‪++‬‬

‫;‪a ++‬‬

‫;‪a = a + 1‬‬

‫‪--‬‬

‫;‪a --‬‬

‫;‪a = a – 1‬‬

‫=‪+‬‬

‫;‪a += 5‬‬

‫;‪a = a + 5‬‬

‫=‪-‬‬

‫;‪a -= 8‬‬

‫;‪a= a – 8‬‬

‫=*‬

‫;‪a *= 10‬‬

‫;‪a= a * 10‬‬

‫=‪/‬‬

‫;‪a /= 2‬‬

‫;‪a = a / 2‬‬

‫=‪%‬‬

‫;‪a %= 10‬‬

‫;‪a = a % 10‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬
‫‪‬‬

‫عملگر اول و دوم‪ ،‬عملگرهای یکانی هستند که بترتیب عملگر افزایش و عملگر کاهش‬
‫نامیده می شوند‪.‬‬
‫نکته جالب آنستکه این دو عملگر به دوصورت مورد استفاده قرار می گیرند‪.‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫در حالتی که از دستور ;‪ a ++‬استفاده شود به آن پس افزایش می گویند و بدین معناست که‬
‫ابتدا از مقدار فعلی ‪ a‬در عبارت موردنظر استفاده کن و سپس آن را افزایش بده‪.‬‬
‫اما دستور ;‪ ++ a‬که به آن پیش افزایش گفته می شود‪ ،‬ابتدا ‪ a‬را افزایش داده و سپس از آن‬
‫در عبارت استفاده می کند‪.‬‬
‫به برنامه زیر دقت کنید‪:‬‬

‫>‪#include ‫{ )(‪void main‬‬
‫; ‪int a ,b‬‬
‫;‪a=5‬‬
‫;‪b = a ++‬‬
‫;)‪printf(“a=%d and b=%d \n”,a,b‬‬
‫;‪a=5‬‬
‫;‪b = ++ a‬‬
‫;)‪printf(“a=%d and b=%d \n”,a,b‬‬
‫}‬
‫‪a=6 b=5‬‬
‫‪a=6 b=6‬‬

‫‪ 7-5-3‬عملگرهای مقایسه ای‬
‫‪‬‬

‫‪‬‬

‫این عملگرها دو عبارت را بایکدیگر مقایسه کرده و نتیجه را باز می گردانند‪.‬‬
‫نتیجه می تواند درست )‪ (true‬یا غلط )‪ (false‬باشد‪.‬‬
‫نتیجه این عملگرها یک عدد صحیح است که درصورت درست بودن ‪ 1‬و‬
‫درصورت غلط بودن ‪ 0‬باز می گردانند‪ .‬این عملگرها عبارتند از‪:‬‬
‫عملگر‬

‫مفهوم عملگر‬

‫مثال‬

‫<‬

‫بزرگتر )<(‬

‫‪a>b‬‬

‫>‬

‫کوچکتر )>(‬

‫‪a
‫=<‬

‫بزرگتر یا مساوی )≤(‬

‫‪a >= b‬‬

‫=>‬

‫کوچکتر یا مساوی )≥(‬

‫‪a <= b‬‬

‫==‬

‫مساوی )=(‬

‫‪a == b‬‬

‫=!‬

‫نامساوی )≠(‬

‫‪a != b‬‬

‫‪ 7-5-3‬عملگرهای مقایسه ای‬
‫‪‬‬

‫‪‬‬

‫نکته مهمی که باید به آن دقت کرد عملگر مساوی )==( است‪ ،‬چرا که یک‬
‫اشتباه بسیار متداول برنامه نویسان ‪ C‬استفاده اشتباه از عملگر انتساب‬
‫)=( بجای عملگر تساوی )==( است که باعث ایجاد خطا در برنامه می‬
‫شود‪.‬‬
‫اولویت این عملگرها از باال به پایین بشرح زیر است‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫عملگرهای <‪ <= ، > ،‬و =>‬
‫عملگرهای == و =!‬

‫الزم بذکر است که در هنگام مساوی بودن اولویت چند عملگر‪ ،‬این عملگرها‬
‫از چپ به راست محاسبه می گردند‪.‬‬

‫‪ 7-5-4‬عملگرهای منطقی‬
‫‪‬‬

‫این عملگرها به شما اجازه می دهند که شرطهای ساده ای را که با‬
‫استفاده از عملگرهای مقایسه ای ایجاد شده اند را با یکدیگر ترکیب نموده‬
‫و شرطهای پیچیده تری را بسازید‪ .‬این عملگرها عبارتند از ‪:‬‬
‫مثال‬

‫عملگر‬

‫مفهوم عملگر‬

‫نحوه کار‬

‫&&‬

‫‪ AND‬منطقی‬

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

‫‪a>0 && sw==1‬‬

‫||‬

‫‪ OR‬منطقی‬

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

‫‪a<=100 || b!=0‬‬

‫!‬

‫‪ NOT‬منطقی‬

‫اگر عملوند درست باشد‪ ،‬نادرست و‬
‫اگر نادرست باشد‪ ،‬درست برمی‬
‫گرداند‪.‬‬

‫)‪! (a==1 || b<10‬‬

‫‪ 7-5-5‬عملگر شرطی‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫گاهی الزم است که ابتدا یک شرط بررسی شده و سپس برمبنای نتیجه )درست یا نادرست بودن آن( یکی‬
‫از دو عبارت ممکن بازگردانده شود‪ .‬برای اینکار می توان از یک عملگر ‪3‬تایی )با ‪ 3‬عملوند( بنام عملگر‬
‫شرطی استفاده نمود‪.‬‬
‫شکل کلی این عملگر بصورت زیر است‪:‬‬
‫>عبارت‪> :<2‬عبارت‪> ?<1‬شرط<‬
‫نحوه کار بدینصورت است که درصورت درست بودن شرط‪ ،‬عبارت‪ 1‬و در غیراینصورت عبارت ‪ 2‬بازگردانده می‬
‫شود‪.‬‬
‫به عنوان مثال به دستور زیر توجه کنید‪:‬‬
‫که این عبارت معادل دستور زیر است‪:‬‬

‫‪‬‬

‫;‪a = (k<10) ? 100 : 50‬‬
‫;‪if (k<10) a=100‬‬
‫;‪else a=50‬‬

‫البته این عبارت به شکلهای پیچیده نیز می تواند مورد استفاده قرار گیرد‪ .‬مثال ‪:‬‬
‫;‪c += (a>0 && a<10) ? ++a : a/b‬‬
‫که معادل است با ‪:‬‬
‫{ )‪if (a>0 && a<10‬‬
‫;‪a= a + 1‬‬
‫;‪c = c + a‬‬
‫}‬
‫;‪else c = c + a/b‬‬

‫‪ 7-5-6‬اولویت عملگرها‬
‫عملگر‬

‫اولویت‬

‫شرکت پذیری‬

‫‪1‬‬

‫)(‬

‫از چپ به راست‬

‫‪2‬‬

‫‪- + ! -- ++‬‬

‫از راست به چپ‬

‫‪3‬‬

‫‪* / %‬‬

‫از چپ به راست‬

‫‪4‬‬

‫‪+ -‬‬

‫از چپ به راست‬

‫‪5‬‬

‫>> <<‬

‫از چپ به راست‬

‫‪6‬‬

‫>= > <= <‬

‫از چپ به راست‬

‫‪7‬‬

‫=! ==‬

‫از چپ به راست‬

‫‪8‬‬

‫&&‬

‫از چپ به راست‬

‫‪9‬‬

‫||‬

‫از چپ به راست‬

‫‪10‬‬

‫‪?:‬‬

‫از راست به چپ‬

‫‪11‬‬

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

‫از راست به چپ‬

‫‪12‬‬

‫‪,‬‬

‫از چپ به راست‬

‫‪ 7-6‬خواندن و نمایش اطالعات‬
‫‪‬‬

‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫همانطور كه قبال نیز گفته شد‪ ،‬یكی از اهداف زبان ‪ C‬قابل حمل بودن آن‬
‫است‪ .‬بهمین منظور سعی شده است كه از دستوراتی كه ممكن است‬
‫وابسته به ماشین خاصی باشد‪ ،‬اجتناب گردد‪.‬‬
‫بهمین دلیل زبان ‪ C‬برخالف سایر زبانها دارای هیچ دستوری برای‬
‫خواندن از ورودی و یا نوشتن در خروجی نیست‪.‬‬
‫اما در عوض دارای تعدادی تابع )زیربرنامه( استاندارد می باشد كه تقریبا‬
‫تمامی كامپایلرها از آنها حمایت می كنند‪.‬‬
‫این كار به كامپایلر این امكان را می دهد كه بر حسب نوع سخت افزار‬
‫موردنظر‪ ،‬توابع ورودی و خروجی را طراحی نماید‪.‬‬
‫این توابع در یك فایل سرآمد بنام ‪ stdio.h‬تعریف شده اند و بنابراین قبل‬
‫ازاینكه بتوانید از این توابع استفاده نمایید‪ ،‬باید این فایل را نیز با استفاده‬
‫از ‪ #include‬در برنامه خود بگنجانید‪.‬‬

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫برای نمایش اطالعات در خروجی از تابع ‪ printf‬استفاده می شود‪.‬‬
‫این تابع رشته موردنظر شما را به خروجی استاندارد )كه در حالت‬
‫عادی همان صفحه نمایش یا مانیتور است( می فرستد‪ .‬شكل كلی این‬
‫تابع بصورت زیر است‪:‬‬
‫; )>لیست متغیرها< ‪> ,‬رشته كنترلی<(‪printf‬‬
‫رشته كنترلی همان متنی است كه قصد چاپ آن را داریم‪ ،‬با ذكر این‬
‫نكته كه در قسمتهایی كه باید مقدار یك متغیر چاپ شود‪ ،‬از یك‬
‫مشخصه تبدیل استفاده می شود‪ .‬هر مشخصه تبدیل از یك عالمت ‪%‬‬
‫بعالوه یك كاراكتر كه نوع متغیر مورد نظر را نشان می دهد تشكیل می‬
‫گردد‪.‬‬
‫لیست متغیرها نیز همان متغیرهایی هستند كه قصد چاپ آنها را داریم‪.‬‬
‫این متغیرها باید بترتیب قرار گرفته و با كاما )‪ (,‬از یكدیگر جدا شوند‪.‬‬

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫مشخصه تبدیل‬

‫مفهوم‬

‫‪%c‬‬

‫كاراكتر‬

‫‪%d‬‬

‫عدد صحیح در مبنای ‪10‬‬

‫‪%f‬‬

‫عدد اعشاری بدون نماد علمی‬

‫‪%e‬‬

‫عدد اعشاری با نماد علمی‬

‫‪%g‬‬

‫عدد اعشاری با حالت كوتاهتر بین ‪ e‬و ‪f‬‬

‫‪%s‬‬

‫رشته‬

‫‪%ld‬‬

‫عدد صحیح بزرگ‬

‫‪%lf %le %lg‬‬

‫عدد اعشاری بزرگ‬

‫‪%o‬‬

‫عدد صحیح در مبنای ‪8‬‬

‫‪%x‬‬

‫عدد صحیحی در مبنای ‪16‬‬

‫‪%u‬‬

‫عدد صحیح بدون عالمت‬

‫ تابع نمایش در خروجی‬7-6-1
#include
void main() {
int age = 20;
floate average = 18.23;
printf("You are %d years old and your average is %f \n",age,average);
}
You are 20 years old and your average is 18.230000

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫‪‬‬
‫‪‬‬

‫برای کنترل نحوه چاپ اعداد می توانید از مشخصه طول میدان استفاده‬
‫کنید‪.‬‬
‫مشخصه طول میدان برای اعداد به شكل زیر استفاده می شود‪:‬‬
‫‪ ‬برای اعداد صحیح از ‪ %nd‬استفاده می كنیم كه ‪ n‬تعداد ارقام را نشان‬
‫می دهد )مثال ‪ .(%3d‬در اینصورت برای هر متغیر ‪ n‬رقم درنظر گرفته‬
‫می شود‪ .‬اگر اندازه عدد از ‪ n‬كوچكتر باشد‪ ،‬به سمت چپ آن فضای‬
‫خالی اضافه می شود و اگر اندازه عدد بیش از ‪ n‬رقم باشد‪ ،‬طول میدان‬
‫نادیده گرفته شده و عدد بطور كامل چاپ می شود‪.‬‬
‫‪ ‬برای اعداد اعشاری از ‪ %n.mf‬استفاده می كنیم كه ‪ n‬اندازه كل عدد‬
‫)شامل عالمت ممیز( و ‪ m‬تعداد ارقام اعشار است )مثال ‪ .(%5.2f‬در‬
‫صورتیكه تعداد ارقام اعشاری عدد موردنظر از ‪ m‬بیشتر باشد‪ ،‬عدد به ‪m‬‬
‫عدد اعشار گرد می شود و در صورتیكه از ‪ m‬كمتر باشد‪ ،‬در سمت‬
‫راست آن ‪ 0‬قرار داده می شود‪.‬‬

‫‪ 7-6-2‬تابع خواندن از ورودی‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای خواندن اطالعات از ورودی از تابع ‪ scanf‬استفاده می شود‪.‬‬
‫این تابع اطالعات را ازورودی استاندارد )معموال صفحه كلید( خوانده و در‬
‫متغیرهای تعیین شده قرار می دهد‪.‬‬
‫شكل كلی این تابع بصورت زیر است‪:‬‬
‫; )>لیست آدرسهای متغیرها< ‪> ,‬رشته كنترلی<(‪scanf‬‬
‫همانطور كه می بینید نحوه احضار تابع ‪ scanf‬نیز مشابه ‪ printf‬است‪ .‬تنها‬
‫تفاوت در آن است كه در ‪ scanf‬باید لیست آدرسهای متغیرها ارسال شود‪.‬‬
‫مبحث مربوط به آدرسها در فصول بعدی بررسی خواهد شد ولی در حال حاضر‬
‫بخاطر بسپارید كه برای بدست آوردن آدرس یك متغیر از عالمت & استفاده می‬
‫كنیم‪ .‬بعنوان مثال ‪ &age‬بمعنای آدرس متغیر ‪ age‬است‪.‬‬
‫بطور كلی در ‪ C‬قدیمی هرگاه كه یك تابع دارای پارامترهای خروجی بود )یعنی‬
‫پارامترهایی كه یك مقدار را باز می گرداندند( از آدرس متغیرها استفاده می‬
‫شد كه امروزه این مسئله وجود ندارد‪.‬‬

‫ تابع خواندن از ورودی‬7-6-2
#include
void main() {
int age;
float average ;
printf("Please enter your age and average : ");
scanf("%d %f",&age,&average);
printf("You are %d years old and your average is %5.2f \n",age,average);
}

Please enter your age and average : 19 16.72
You are 19 years old and your average is 16.72

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫زبان ‪ C++‬یک زبان شی گرا است‪ ،‬بهمین دلیل در این زبان برای ورودی‬
‫و خروجی از اشیاء بجای توابع استفاده می گردد‪.‬‬
‫از آنجا که امروزه معموال برنامه نویسان ‪ C‬از کامپایلرهای ‪ C++‬استفاده‬
‫می کنند‪ ،‬می توانند از اشیای ورودی و خروجی آن نیز استفاده کنند‪.‬‬
‫اینکار در بین بسیاری از برنامه نویسان ‪ C‬متداول است‪ ،‬بهمین دلیل ما‬
‫در اینجا نحوه کار با اشیای خواندن و نوشتن در ‪ C++‬را بطور مقدماتی‬
‫توضیح می دهیم؛ گرچه توضیح کامل این موارد نیاز به آشنایی با شی‬
‫گرایی و زبان ‪ C++‬دارد‪.‬‬
‫قبل از هرچیز الزم به ذکر است که کلیه اشیای مربوط به ورودی و‬
‫خروجی در فایل سرآمدی بنام ‪ iostream.h‬تعیریف شده اند‪ ،‬بنابراین‬
‫ابتدا باید این فایل به برنامه توسط دستور ‪ #include‬الحاق گردد‪.‬‬

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫زبان ‪ C++‬برای نمایش اطالعات از یک شیئ بنام ‪ cout‬استفاده می نماید‪.‬‬
‫برای ارسال اطالعات مورد نظر برای چاپ به ‪ cout‬باید از عملگر درج در جریان‬
‫یا >> استفاده نماییم‪ .‬بعنوان مثال ‪:‬‬
‫; ” ‪cout >> “Please enter your name:‬‬
‫و یا مثال دیگر ‪:‬‬
‫;‪int a = 10‬‬
‫;‪float b = 2.86‬‬
‫;‪cout << a‬‬
‫;‪cout << b‬‬
‫نکته جالبی که در این مثالها دیده می شود‪ ،‬آنستکه برخالف تابع ‪ printf‬هیچ‬
‫نیازی به مشخص کردن نوع متغیری که قصد چاپ آن را داریم نیست و خود‬
‫شئ ‪ cout‬نوع آن را تشخیص می دهد‪.‬‬
‫عالوه براین می توان چندین عملگر درج در جریان را با یکدیگر الحاق کرد و‬
‫چندین متغیر را با یک دستور چاپ کرد‪.‬‬

C++ ‫ ورودی و خروجی اطالعات در‬7-6-3
#include
void main() {
int age = 20;
floate average = 18.23;
cout >> “You are ” >> age >> “ years old and your average is ” >> average ;
}

You are 20 years old and your average is 18.230000

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای دریافت اطالعات از کاربر‪ ،‬از شئ دیگری بنام ‪ cin‬استفاده می شود‪.‬‬
‫برای ارسال متغیر مورد نظر به ‪ cin‬باید از عملگر استخراج از جریان یا <<‬
‫استفاده نماییم‪ .‬بعنوان مثال‪:‬‬
‫;‪int a‬‬
‫;‪cin >> a‬‬
‫بازهم همانطور که می بینید نیازی به تعیین نوع متغیر موردنظر نیست و خود‬
‫شئ ‪ cin‬نوع متغیر را بطور اتوماتیک تشخیص داده و داده ای از همان نوع را از‬
‫کاربر دریافت و در متغیر مورد نظر قرار می دهد‪.‬‬
‫عملگرهای استخراج از جریان را نیز می توان با یکدیگر الحاق کرد‪.‬‬
‫برای رفتن به خط بعد در شئ ‪ cout‬می توان از دستکاری کننده ‪ endl‬استفاده‬
‫کرد‪ .‬مثال در دستور زیر پس از چاپ پیغام‪ ،‬مکان نما به خط بعد منتقل می‬
‫شود‪:‬‬
‫;‪cout >> “List of students : “ >> endl‬‬
‫البته دستکاری کننده های متعدد دیگری نیز ازجمله موارد مربوط به تعیین طول‬
‫میدان و نحوه چاپ مقادیر وجود دارد که توضیح آنها نیاز به یک مبحث مستقل‬
‫دارد‪.‬‬

C++ ‫ ورودی و خروجی اطالعات در‬7-6-3
#include
void main() {
int age;
float average ;
cout << "Please enter your age and average : " ;
cin >> age >> average ;
cout << "You are " << age << "years old and your average is " << average;
}

Please enter your age and average : 19 16.72
You are 19 years old and your average is 16.72

‫‪ 7-7‬توابع کتابخانه ای‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫همانطور که قبال نیز گفته شد‪ ،‬زبان ‪ C‬از زیر برنامه ها نیز حمایت می کند‪ .‬هر زیر برنامه‬
‫در ‪ C‬یک تابع نامیده می شود‪ .‬تا کنون با توابعی همچون ‪ main‬و یا ‪ printf‬و ‪ scanf‬آشنا‬
‫شده ایم‪.‬‬
‫معموال عرضه کنندگان کامپایلرها و یا سایر فروشندگان نرم افزار‪ ،‬برخی از توابع عمومی‬
‫را که ممکن است مورد نیاز جمع کثیری از برنامه نویسان مختلف باشد را در قالب‬
‫کتابخانه ای از توابع در اختیار برنامه نویسان می گذارند‪ .‬بعضی از این توابع کتابخانه ای‬
‫مانند ‪ printf‬و ‪ scanf‬بصورت استاندارد درآمده و توسط عرضه کنندگان مختلف ارائه می‬
‫شوند‪.‬‬
‫در کامپایلر عرضه شده توسط شرکت بورلند )‪ (Borland C++ 3.1‬نیز کتابخانه های‬
‫متعددی از توابع برای شما عرضه شده اند که بتدریج با آنها و کاربردشان آشنا خواهید‬
‫شد‪.‬‬
‫نکته مهم آنستکه برای استفاده از این توابع ابتدا باید فایل سرآمد مربوط به آنها را نیز در‬
‫ابتدای برنامه خود اضافه نمایید ) با استفاده از ‪ .(#include‬هر فایل سرآمد شامل تعاریف‬
‫اولیه گروهی از توابع مرتبط با هم و داده های مربوط به آنها بوده و در استاندارد قدیمی‬
‫تر دارای پسوند ‪ .h‬می باشد)در استاندارد جدید پسوند این فایلها حذف شده است(‪.‬‬
‫برخی از این فایلهای سرآمد عبارتند از‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪ : stdio.h‬توابع ورودی و خروجی استاندارد‬
‫‪ : math.h‬توابع ریاضی‬
‫‪ : graphics.h‬توابع مربوط به عملیات گرافیکی‬
‫‪ : string.h‬توابع مربوط به کار با رشته ها‬


Slide 36

‫مبانی کامپیوتر و برنامه سازی‬
‫فصل هفتم ‪ :‬مفاهیم اولیه زبان ‪C‬‬
‫مدرس ‪ :‬نگین معروفی‬

‫‪ 7-1‬شناسه ها در ‪C‬‬
‫‪‬‬
‫‪‬‬

‫شناسه )‪ (identifier‬نامی است که به یک قسمت از برنامه مانند متغیر‪ ،‬تابع‪ ،‬ثابت و یا‬
‫‪ ...‬داده می شود‪.‬‬
‫در زبان ‪ C‬برای انتخاب شناسه ها فقط می توان از عالئم زیر استفاده کرد‪:‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫حروف انگلیسی کوچک و بزرگ )‪(A…Z a…z‬‬
‫ارقام )‪(0…9‬‬
‫عالمت خط پایین یا _‬

‫البته یک شناسه نمی تواند با یک رقم شروع شود‪.‬‬
‫چند شناسه مجاز‪ name2 ، average ، sum :‬و ‪student_average‬‬
‫چند شناسه غیرمجاز ‪ 2name‬و یا ‪student average‬‬
‫در برنامه نویسی امروزی پیشنهاد می شود بجای شناسه هایی همانند‬
‫‪ student_average‬از ‪ studentAverage‬استفاده گردد‪.‬‬
‫نکته مهم دیگری که باید به آن اشاره کرد آنستکه زبان ‪ C‬برخالف بسیاری از زبانهای دیگر‬
‫به کوچک و بزرگی حروف حساس است )‪ .(case sensitive‬در نتیجه شناسه های زیر با‬
‫یکدیگر متفاوتند ‪:‬‬
‫‪Sum ≠ sum ≠ SUM‬‬
‫آخرین نکته اینستکه در هنگام انتخاب شناسه نمی توانید از کلمات کلیدی که برای‬
‫منظورهای خاص در زبان ‪ C‬رزرو شده اند استفاده کنید‪.‬‬

C ‫ شناسه ها در‬7-1
: C ‫کلمات کلیدی در زبان‬
auto

break

case

char

const

continue

default

do

double

else

enum

extern

float

for

goto

if

int

long

register

return

short

signed

sizeof

static

struct

switch

typedef

union

unsigned

void

volatile

while

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫محدوده‬

‫اندازه )بیت(‬

‫توضیح‬

‫نوع داده‬

‫‪-128 to +127‬‬

‫‪8‬‬

‫کاراکتر‬

‫‪char‬‬

‫‪-32768 to +32767‬‬

‫‪16‬‬

‫عدد صحیح‬

‫‪int‬‬

‫‪3.4e-38 to 3.4e+38‬‬

‫‪32‬‬

‫عدد اعشاری‬

‫‪float‬‬

‫‪1.7e-308 to 1.7e+308‬‬

‫‪64‬‬

‫عدد اعشاری با‬
‫دقت مضاعف‬

‫‪double‬‬

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫‪‬‬

‫البته چند نکته مهم درمورد این جدول قابل ذکر است ‪:‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫اندازه ‪ int‬در محیطهای ‪ 16‬بیتی مانند ‪ DOS‬برابر ‪ 16‬بیت است‪ .‬اما در‬
‫محیطهای ‪ 32‬بیتی همانند ‪ Windows‬اندازه آن ‪ 32‬بیت می باشد که در‬
‫اینصورت محدوده ای برابر ‪ -2,147,483,648‬تا ‪ +2,147,483,647‬را‬
‫پوشش می دهد‪.‬‬
‫در بعضی از کامپایلرهای ‪ ،C‬نوع داده ‪ bool‬نیز وجود دارد که می تواند‬
‫یکی از مقادیر ‪)true‬درست( یا ‪) false‬غلط( را نشان دهد ‪ .‬اما در نسخه‬
‫های اولیه ‪ C‬از همان نوع داده صحیح یا ‪ int‬برای اینکار استفاده می‬
‫شد‪ .‬بدین صورت که ‪ 0‬نشاندهنده ‪ false‬و هر عدد غیر صفر )معموال ‪(1‬‬
‫نشاندهنده ‪ true‬است‪.‬‬
‫از آنجا که برای ذخیره سازی کاراکترها کد اسکی آنها ذخیره می گردد‪،‬‬
‫از یک متغیر کاراکتری یا ‪ char‬می توان بعنوان یک عدد صحیح کوچک نیز‬
‫استفاده کرد و اعمال ریاضی برروی آنها نیز مجاز است‪.‬‬

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫عالوه براین چندین اصالح کننده نیز وجود دارد که به ما اجازه می دهد نوع داده مورد‬
‫نظر را با دقت بیشتری برای نیازهای مختلف استفاده نماییم‪.‬‬
‫این اصالح کننده ها عبارتند از ‪short, long, signed, unsigned :‬‬
‫تمام این اصالح کننده ها می توانند به نوع داده ‪ int‬اعمال شوند و اثر آنها بستگی‬
‫به محیط دارد‪.‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫در یک محیط ‪16‬بیتی‪short int ،‬بازهم برابر ‪16‬بیت است ولی ‪ long int‬برابر‪32‬بیت می‬
‫باشد‪.‬‬
‫‪ unsigned int‬باعث می شود که یک عدد ‪ 16‬بیتی بدون عالمت داشته باشیم که بازه‬
‫بین ‪ 0‬تا ‪ 65535‬را پوشش می دهد‪ signed int .‬نیز همانند ‪ int‬معمولی بوده و تفاوتی‬
‫ندارد‪.‬‬
‫ترکیب این اصالح کننده ها نیز ممکن است‪ .‬مثال ‪ unsigned long int‬یک عدد ‪ 32‬بیتی‬
‫بدون عالمت است که بازه ‪ 0‬تا ‪ 4,294,967,295‬را پوشش می دهد‪.‬‬

‫برروی نوع داده ‪ char‬فقط اصالح کننده های ‪ signed‬و ‪ unsigned‬را می توان اعمال‬
‫کرد‪ .‬معموال از اصالح کننده ‪ unsigned‬وقتی استفاده می شود که قصد داشته‬
‫باشیم از ‪ char‬بعنوان یک عدد صحیح مثبت بین ‪ 0‬تا ‪ 255‬استفاده کنیم‪.‬‬
‫برروی نوع داده ‪ double‬تنها اصالح کننده ‪ long‬قابل اعمال است و دراینصورت عدد‬
‫اعشاری با ‪ 80‬بیت را خواهیم داشت که قادر است هر عددی در بازه ‪ 3.4e-4932‬تا‬
‫‪ 1.1e+4932‬را در خود نگاه دارد‪.‬‬

‫‪ 7-3‬تعریف متغیرها‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای تعریف متغیرها به شکل زیر عمل می کنیم‪:‬‬

‫;>‪ ‫که ‪ type‬یکی از نوع داده های گفته شده و ‪ variable-list‬لیستی از متغیرها است‬
‫که با کاما از یکدیگر جدا شده اند‪ .‬بعنوان مثال ‪:‬‬
‫;‪int sum‬‬
‫;‪float average‬‬
‫; ‪long int a, b, c‬‬
‫; ‪unsigned long int i, j, k‬‬
‫عالوه براین می توان در هنگام تعریف متغیر به آن مقدار اولیه نیز داد‪ .‬مثال ‪:‬‬
‫; ‪int d = 0‬‬
‫نكته مهم آنكه زبان ‪ C‬به متغیرها مقدار اولیه نمي دهد )حتي ‪ (0‬و برنامه نويس‬
‫خود بايد اينكار را صريحا انجام دهد‪ ،‬درغیر اينصورت مقدار اولیه متغیر‪ ،‬نامعین خواهد‬
‫بود‪.‬‬
‫تعریف متغیرها طبق اصول زبان ‪ C‬میتواند درهرجایی از برنامه صورت پذیرد‪ ،‬و‬
‫متغیرهای تعریف شده از همان خط به بعد قابل استفاده خواهد بود‪ .‬اما معموال‬
‫توصیه می گردد كه تعریف متغیرها در همان خط ابتدایی تابع و بالفاصله پس از {‬
‫صورت پذیرد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫‪‬‬
‫‪‬‬

‫ثابتها مقادیر ثابتی هستند كه مقدار آنها در حین اجرای برنامه تغییر نمی یابد‪ .‬ثابتها می توانند از‬
‫هریك از نوع داده های اصلی باشند‪.‬‬
‫ثوابت عددی صحیح ‪:‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫برای نمایش این دسته از ثوابت‪ ،‬از دنباله ای از ارقام بعالوه عالمت ‪ +‬یا ‪ -‬استفاده می كنیم‪ .‬بعنوان مثال‬
‫‪ -45‬و یا ‪ 3489‬ثوابت صحیح هستند‪.‬‬
‫در حالت عادی ‪ C‬هر عدد را در كوچكترین نوع داده ای كه می تواند قرار می دهد‪ .‬مثال عدد ‪ 85‬در یك‬
‫‪ int‬قرار می گیرد‪ ،‬اما عدد ‪ 145398‬در یك ‪ long int‬قرار خواهد گرفت‪.‬‬
‫اگر قصد دارید یك عدد كوچك بعنوان ‪ long‬محسوب گردد‪ ،‬می توانید از پسوند ‪ L‬در انتهای آن استفاده‬
‫می كنیم‪ .‬مثال ‪245L‬یك عدد ‪ long‬محسوب می شود‪.‬‬
‫;‪long int a = 20L‬‬
‫پسوند ‪ U‬در انتهای عدد نیز نشانه بدون عالمت بودن آن است‪.‬‬
‫نكته دیگر آنكه ‪ C‬به شما اجازه می دهد درصورت لزوم ثوابت صحیح خود را در مبنای ‪ 8‬یا ‪ 16‬نیز كه‬
‫از مبناهای متداول در برنامه نویسی هستند‪ ،‬بنویسید‪.‬‬
‫‪‬‬
‫‪‬‬

‫برای نوشتن عدد در مبنای ‪ 8‬باید آن را با ‪ 0‬آغاز كنید‪ ،‬مثال ‪ 0342‬یك عدد در منای ‪ 8‬محسوب می‬
‫گردد‪.‬‬
‫برای نوشتن یك عدد در مبنای ‪ 16‬باید آن را با ‪ 0x‬آغاز نمایید‪ ،‬مانند ‪.0x27A4‬‬

‫‪ 7-4‬ثوابت‬
‫ثوابت عددی اعشاری‬

‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫برای نمایش اعداد اعشاری‪ ،‬باید از نقطه اعشار استفاده كنیم‪ ،‬مانند ‪237.45‬‬
‫اما نكته جالب آنستكه می توانید از نماد علمی نیز برای نمایش اعداد‬
‫اعشاری استفاده كنید‪ .‬برای اینكار كافی است از حرف ‪ e‬برای نمایش قسمت‬
‫توان استفاده نمایید‪ .‬بعنوان مثال ‪:‬‬
‫‪-23.47 × 10 5 = -23.47e5‬‬
‫‪42.389 × 10 -3 = 42.389e-3‬‬
‫دقت كنید كه قسمت توان‪ ،‬حتما یك عدد صحیح است‪.‬‬
‫نكته جالب اینجاست كه برخالف مورد قبل‪ ،‬كامپایلر بطور پیش فرض داده های‬
‫اعشاری را از نوع ‪ double‬فرض می كند‪.‬چنانچه دوست دارید ثابت شما ازنوع‬
‫‪ float‬درنظر گرفته شود‪ ،‬در انتهای آن ‪ F‬قرار دهید‪ .‬ضمنا پسوند ‪ L‬نیز داده‬
‫اعشاری را از نوع ‪ long double‬درنظر می گیرد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫ثوابت كاراكتری ‪:‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫برای نشان دادن ثوابت كاراكتری‪ ،‬آنها را در داخل ' قرار می دهیم‪ .‬بعنوان مثال‬
‫'‪'A‬یك ثابت كاراكتری است‪.‬‬
‫; '‪char ch = 'S‬‬
‫دقت كنید كه همانطور كه قبال گفته شد‪ ،‬كد اسكی كاراكترها در متغیر ذخیره‬
‫می گردد‪ ،‬بنابراین می توان از آن بعنوان یك عدد صحیح نیز استفاده كرد‪ .‬نكته‬
‫مهم دیگر آنستكه به تفاوت عدد ‪ 5‬و كاراكتر '‪ '5‬دقت داشته باشید‪ .‬در حقیقت‬
‫'‪ '5‬برابر است با عدد ‪ 53‬كه همان كد اسكی آن است‪.‬‬
‫روش فوق‪ ،‬برای نمایش کاراکترهای قابل چاپ مناسب است‪ ،‬اما بعضی‬
‫كاراكترها مانند ‪ enter‬قابل نمایش نبوده و برای آنها شکل خاصی وجود ندارد‪.‬‬
‫در چنین مواردی‪ ،‬زبان ‪ C‬از ترکیب عالمت \ به همراه یک کاراکتر دیگر‪ ،‬برای‬
‫نمایش این قبیل کاراکترها استفاده می نماید‪ .‬بعنوان مثال‪ ،‬کاراکتر '‪ '\n‬نشان‬
‫دهنده خط جدید یا همان ‪ enter‬می باشد‪.‬‬
‫جدول صفحه بعد این قبیل کاراکترها و معادل آنها را نشان می دهد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫نحوه نمایش در ‪C‬‬

‫کد اسکی‬

‫صدای بوق کامپیوتر‬

‫‪\a‬‬

‫‪7‬‬

‫حرکت به عقب ‪backspace‬‬

‫‪\b‬‬

‫‪8‬‬

‫شروع صفحه ‪form feed‬‬

‫‪\f‬‬

‫‪12‬‬

‫سطر جدید ‪line feed‬‬

‫‪\n‬‬

‫‪10‬‬

‫برگشت به ابتداي سطر ‪carriage return‬‬

‫‪\r‬‬

‫‪13‬‬

‫فاصله افقی ‪horizontal tab‬‬

‫‪\t‬‬

‫‪9‬‬

‫فاصله عمودی ‪vertical tab‬‬

‫‪\v‬‬

‫‪11‬‬

‫عالمت سوال‬

‫?\‬

‫‪63‬‬

‫عالمت '‬

‫'\‬

‫‪39‬‬

‫عالمت "‬

‫"\‬

‫‪34‬‬

‫عالمت \‬

‫\\‬

‫‪92‬‬

‫عالمت تهی‬

‫‪\0‬‬

‫‪0‬‬

‫نام کاراکتر‬

‫کد اسکی یک کاراکتر با ‪ 3‬رقم در مبنای ‪8‬‬

‫‪\000‬‬

‫کد اسکی یک کاراکتر با ‪ 2‬رقم در مبنای ‪16‬‬

‫‪\x00‬‬

‫‪ 7-4‬ثوابت‬
‫‪‬‬

‫ثوابت رشته ای ‪ C :‬عالوه بر ثوابت فوق‪ ،‬از یك ثابت دیگر بنام رشته نیز‬
‫حمایت می كند‪ .‬رشته‪ ،‬دنباله ای از كاراكترها است كه در داخل " قرار‬
‫می گیرند‪ .‬بعنوان مثال "‪ "this is a test‬یك رشته است‪ .‬دقت كنید كه '‪'a‬‬
‫یك كاراكتر است‪ ،‬اما "‪ "a‬یك رشته است كه فقط شامل یك كاراكتر می‬
‫باشد‪.‬‬

‫‪ 7-5‬عملگرها‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫عملگر‪ ،‬نمادی است كه به كامپایلر می گوید تا عملیات محاسباتی یا‬
‫منطقی خاصی را برروی یك یا چند عملوند‪ ،‬انجام دهد‪.‬‬
‫به عملگرهایی كه فقط یك عملوند دارند‪ ،‬عملگر یكانی می گوییم و‬
‫همواره عملگر در سمت چپ عملوند قرار می گیرد)مانند عدد ‪.(-125‬‬
‫اما عملگرهایی كه برروی دو عملوند اثر می كنند را عملگر دودویی‬
‫نامیده و عملگر را بین دو عملوند قرار می دهیم )مانند ‪.(23+86‬‬
‫هر ترکیب درستی از عملگرها و عملوندها را یک عبارت می نامیم‪.‬‬
‫‪ C‬از نقطه نظر عملگرها یك زبان بسیار قوی است‪ .‬این عملگرها به چند‬
‫دسته اصلی تقسیم می گردند كه آنها را به ترتیب بررسی می كنیم‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫این عملگرها‪ ،‬همان اعمال متداول ریاضی هستند كه در زبان ‪ C‬مورد استفاده‬
‫قرار می گیرند‪ .‬این اعمال عبارتند از ‪:‬‬

‫عمل‬

‫نوع‬

‫عملگر‬

‫منفی كردن عملوند سمت راست‬

‫یكانی‬

‫‪-‬‬

‫جمع دو عملوند‬

‫دودویی‬

‫‪+‬‬

‫تفریق دو عملوند‬

‫دودویی‬

‫‪-‬‬

‫ضرب دو عملوند‬

‫دودویی‬

‫*‬

‫تقسیم دو عملوند‬

‫دودویی‬

‫‪/‬‬

‫محاسبه باقیمانده تقسیم دو عملوند‬

‫دودویی‬

‫‪%‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬
‫‪‬‬

‫این عملگرهای برروی همه انواع داده های ‪ C‬عمل می كنند‪ ،‬بجز عملگر ‪ %‬كه فقط‬
‫برروی نوع داده های صحیح عمل می كند‪.‬‬
‫اما نكته مهمی كه باید به آن اشاره كرد‪ ،‬نحوه كار عملگر تقسیم برروی نوع داده های‬
‫مختلف است‪.‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫درصورتیكه هردو عملوند صحیح باشند‪ ،‬تقسیم بصورت صحیح بر صحیح انجام خواهد شد‪.‬‬
‫اگر یكی یا هر دو عملوند اعشاری باشند‪ ،‬تقسیم بصورت اعشاری انجام خواهد پذیرفت‪.‬‬
‫فرض كنید تعاریف زیر را داریم ‪:‬‬
‫; ‪int a,b‬‬
‫; ‪float c,d‬‬
‫; ‪a = 10 ; b = 4‬‬
‫;‪c = 8.2; d = 4.0‬‬
‫اكنون به نتایج عملیات زیر دقت كنید ‪:‬‬
‫‪a / b => 2‬‬
‫‪c / d => 2.05‬‬
‫‪a / d => 2.5‬‬
‫‪a / 4 => 2‬‬
‫چنانچه به آخرین مورد توجه كنید‪ ،‬متوجه می شوید كه از آنجا كه ‪a‬یك متغیر صحیح است و ‪4‬‬
‫نیز یك ثابت صحیح در نظر گرفته شده‪ ،‬درنتیجه تقسیم بصورت صحیح بر صحیح انجام گرفته‬
‫است‪ .‬چنانچه بخواهیم تقسیم بصورت اعشاری صورت پذیرد‪ ،‬به دو شكل می توانیم عمل‬
‫كنیم‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫برای اینکه عبارت تقسیم صفحه قبل بصورت اعشاری انجام شود‪ ،‬به دو روش‬
‫می توان عمل کرد‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫این عبارت را بصورت ‪ a / 4.0‬بنویسیم‪.‬‬
‫از عملگر قالب ریزی استفاده كنیم‪.‬‬

‫عملگر قالب ریزی می تواند یك نوع را به نوع دیگری تبدیل نماید‪ .‬شكل كلی آن‬
‫به شكل زیر است ‪:‬‬
‫>‪() ‫كه ‪ type‬نوع مورد نظر است كه قصد تبدیل عبارت ‪ expression‬به آن نوع را‬
‫داریم‪ .‬بعنوان مثال در مورد قبلی می توان به شكل زیر عمل كرد ‪:‬‬
‫‪(float) a / 4‬‬
‫در این حالت از كامپایلر خواسته ایم كه ابتدا عدد ‪ a‬را به اعشاری تبدیل كند‬
‫)البته بصورت موقت( و سپس آن را بر ‪ 4‬تقسیم نماید‪ ،‬كه مسلما حاصل‬
‫اعشاری خواهد بود‪.‬‬
‫بطوركلی هرگاه ثابتها و متغیرهایی از انواع مختلف در یك عبارت محاسباتی‬
‫داشته باشیم‪ ،‬كامپایلر ‪ C‬همه آنها را به یك نوع یكسان كه همان بزرگترین‬
‫عملوند موجود است تبدیل خواهد كرد‪ .‬بعنوان مثال به مورد صفحه بعد دقت‬
‫كنید ‪:‬‬

‫ عملگرهای محاسباتی‬7-5-1
char ch;
int i;

float f;
double d;
result = (ch / i)
int

+

(f *d)

(f+i)
float

double

double

int

-

double

double

float

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫اولویت عملگرها ‪ :‬در عبارتی که شامل چندین عملگر است‪ ،‬کدامیک در‬
‫ابتدا اعمال خواهد گردید‪.‬‬
‫اولویت عملگرهای محاسباتی از باال به پایین بشرح زیر است‪:‬‬
‫‪ ‬عملگر یکانی –‬
‫‪ ‬عملگرهای * و ‪ /‬و ‪%‬‬
‫‪ ‬عملگرهای ‪ +‬و –‬
‫چنانچه اولویت دو عملگر یکسان باشد‪ ،‬این عملگرها از چپ به راست‬
‫محاسبه خواهند شد‪.‬‬
‫چنانچه بخواهیم یک عمل با اولویت پایین زودتر انجام شود‪ ،‬باید از پرانتز‬
‫استفاده کنیم‪ .‬بنابراین اولویت عملگر پرانتز از همه موارد فوق‬
‫بیشتراست‪ .‬در مورد پرانتزهای متداخل‪ ،‬ابتدا پرانتز داخلی محاسبه‬
‫می شود؛ اما در مورد پرانتزهای هم سطح‪ ،‬ابتدا پرانتز سمت چپتر‬
‫محاسبه می گردد‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫چند مثال در مورد اولویت عملگرها‬

‫ترتیب اجرای عملگرها‬

‫عبارت زبان ‪C‬‬

‫ابتدا عمل * و سپس عمل ‪+‬‬

‫‪b+c*d‬‬

‫ابتدا عمل ‪ +‬و سپس عمل *‬

‫‪(b + c) * d‬‬

‫ابتدا عمل ‪ /‬سپس عمل * و در انتها عمل ‪+‬‬

‫‪b+c/d*e‬‬

‫ابتدا عمل * سپس عمل ‪ /‬و در انتها عمل ‪+‬‬

‫)‪b + c / (d * e‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫یک مثال کامل در مورد اولویت عملگرها‬

‫‪result = a + b * (f – (g + b) / d) – c * (a – d) / e‬‬
‫‪6‬‬

‫‪1‬‬
‫‪7‬‬

‫‪2‬‬

‫‪8‬‬

‫‪3‬‬
‫‪4‬‬
‫‪5‬‬
‫‪9‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫در زبان ‪ C‬برای انتساب چندین عملگر وجود دارد‪ .‬ساده ترین عملگر انتساب‪ ،‬همان عملگر =‬
‫است که در بسیاری از زبانها استفاده می شود‪ .‬بعنوان مثال ‪:‬‬
‫;‪a = 5‬‬
‫;‪b = c + 2 * d‬‬
‫این عملگر باعث می شود که عبارت سمت راست در عبارت سمت چپ قرار گیرد‪.‬‬
‫توجه کنید که مقدار سمت چپ باید عبارتی باشد که بتوان به آن یک مقدار را نسبت داد‬
‫)مانند یک متغیر( که به آن ‪ Lvalue‬گفته می شود‪ ،‬بنابراین یک ثابت نمی تواند در سمت چپ‬
‫قرار گیرد‪.‬‬
‫نکته دیگر اینکه اولویت عملگر = از عملگرهای ریاضی کمتر است و درنتیجه ابتدا آن عملیات‬
‫انجام شده و در پایان حاصل در عبارت سمت چپ ریخته می شود‪.‬‬
‫الزم به ذکر است که در هنگام انتساب‪ ،‬درصورت لزوم نوع عبارت سمت راست به نوع عبارت‬
‫سمت چپ تبدیل می شود‪ .‬مثال‪:‬‬
‫;‪int a‬‬
‫;‪a = 2.5 * 5.0‬‬
‫که دراینصورت عدد ‪ 12‬در ‪ a‬ذخیره خواهد شد‪.‬‬
‫شرکت پذیری این عملگر از راست به چپ می باشد‪ ،‬بدین معنا که چنانچه چندین عملگر‬
‫نسبت دهی داشته باشیم‪ ،‬این عملگرها از راست به چپ محاسبه می شوند‪ .‬مثال پس از‬
‫اجرای دستور زیر‪ ،‬مقدار هر ‪ 3‬متغیر برابر ‪ 10‬خواهد شد‪.‬‬
‫;‪a = b = c = 10‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬

‫نکته جالب درمورد زبان ‪ C‬آنستکه دارای یک سری عملگرهای انتساب‬
‫خالصه شده است که باعث می شوند در بعضی موارد بتوانیم عبارات‬
‫کوتاهتری را بنویسیم‪ .‬این عملگرها عبارتند از ‪:‬‬
‫عملگرد‬

‫مثال‬

‫عبارت انتساب معادل‬

‫‪++‬‬

‫;‪a ++‬‬

‫;‪a = a + 1‬‬

‫‪--‬‬

‫;‪a --‬‬

‫;‪a = a – 1‬‬

‫=‪+‬‬

‫;‪a += 5‬‬

‫;‪a = a + 5‬‬

‫=‪-‬‬

‫;‪a -= 8‬‬

‫;‪a= a – 8‬‬

‫=*‬

‫;‪a *= 10‬‬

‫;‪a= a * 10‬‬

‫=‪/‬‬

‫;‪a /= 2‬‬

‫;‪a = a / 2‬‬

‫=‪%‬‬

‫;‪a %= 10‬‬

‫;‪a = a % 10‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬
‫‪‬‬

‫عملگر اول و دوم‪ ،‬عملگرهای یکانی هستند که بترتیب عملگر افزایش و عملگر کاهش‬
‫نامیده می شوند‪.‬‬
‫نکته جالب آنستکه این دو عملگر به دوصورت مورد استفاده قرار می گیرند‪.‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫در حالتی که از دستور ;‪ a ++‬استفاده شود به آن پس افزایش می گویند و بدین معناست که‬
‫ابتدا از مقدار فعلی ‪ a‬در عبارت موردنظر استفاده کن و سپس آن را افزایش بده‪.‬‬
‫اما دستور ;‪ ++ a‬که به آن پیش افزایش گفته می شود‪ ،‬ابتدا ‪ a‬را افزایش داده و سپس از آن‬
‫در عبارت استفاده می کند‪.‬‬
‫به برنامه زیر دقت کنید‪:‬‬

‫>‪#include ‫{ )(‪void main‬‬
‫; ‪int a ,b‬‬
‫;‪a=5‬‬
‫;‪b = a ++‬‬
‫;)‪printf(“a=%d and b=%d \n”,a,b‬‬
‫;‪a=5‬‬
‫;‪b = ++ a‬‬
‫;)‪printf(“a=%d and b=%d \n”,a,b‬‬
‫}‬
‫‪a=6 b=5‬‬
‫‪a=6 b=6‬‬

‫‪ 7-5-3‬عملگرهای مقایسه ای‬
‫‪‬‬

‫‪‬‬

‫این عملگرها دو عبارت را بایکدیگر مقایسه کرده و نتیجه را باز می گردانند‪.‬‬
‫نتیجه می تواند درست )‪ (true‬یا غلط )‪ (false‬باشد‪.‬‬
‫نتیجه این عملگرها یک عدد صحیح است که درصورت درست بودن ‪ 1‬و‬
‫درصورت غلط بودن ‪ 0‬باز می گردانند‪ .‬این عملگرها عبارتند از‪:‬‬
‫عملگر‬

‫مفهوم عملگر‬

‫مثال‬

‫<‬

‫بزرگتر )<(‬

‫‪a>b‬‬

‫>‬

‫کوچکتر )>(‬

‫‪a
‫=<‬

‫بزرگتر یا مساوی )≤(‬

‫‪a >= b‬‬

‫=>‬

‫کوچکتر یا مساوی )≥(‬

‫‪a <= b‬‬

‫==‬

‫مساوی )=(‬

‫‪a == b‬‬

‫=!‬

‫نامساوی )≠(‬

‫‪a != b‬‬

‫‪ 7-5-3‬عملگرهای مقایسه ای‬
‫‪‬‬

‫‪‬‬

‫نکته مهمی که باید به آن دقت کرد عملگر مساوی )==( است‪ ،‬چرا که یک‬
‫اشتباه بسیار متداول برنامه نویسان ‪ C‬استفاده اشتباه از عملگر انتساب‬
‫)=( بجای عملگر تساوی )==( است که باعث ایجاد خطا در برنامه می‬
‫شود‪.‬‬
‫اولویت این عملگرها از باال به پایین بشرح زیر است‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫عملگرهای <‪ <= ، > ،‬و =>‬
‫عملگرهای == و =!‬

‫الزم بذکر است که در هنگام مساوی بودن اولویت چند عملگر‪ ،‬این عملگرها‬
‫از چپ به راست محاسبه می گردند‪.‬‬

‫‪ 7-5-4‬عملگرهای منطقی‬
‫‪‬‬

‫این عملگرها به شما اجازه می دهند که شرطهای ساده ای را که با‬
‫استفاده از عملگرهای مقایسه ای ایجاد شده اند را با یکدیگر ترکیب نموده‬
‫و شرطهای پیچیده تری را بسازید‪ .‬این عملگرها عبارتند از ‪:‬‬
‫مثال‬

‫عملگر‬

‫مفهوم عملگر‬

‫نحوه کار‬

‫&&‬

‫‪ AND‬منطقی‬

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

‫‪a>0 && sw==1‬‬

‫||‬

‫‪ OR‬منطقی‬

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

‫‪a<=100 || b!=0‬‬

‫!‬

‫‪ NOT‬منطقی‬

‫اگر عملوند درست باشد‪ ،‬نادرست و‬
‫اگر نادرست باشد‪ ،‬درست برمی‬
‫گرداند‪.‬‬

‫)‪! (a==1 || b<10‬‬

‫‪ 7-5-5‬عملگر شرطی‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫گاهی الزم است که ابتدا یک شرط بررسی شده و سپس برمبنای نتیجه )درست یا نادرست بودن آن( یکی‬
‫از دو عبارت ممکن بازگردانده شود‪ .‬برای اینکار می توان از یک عملگر ‪3‬تایی )با ‪ 3‬عملوند( بنام عملگر‬
‫شرطی استفاده نمود‪.‬‬
‫شکل کلی این عملگر بصورت زیر است‪:‬‬
‫>عبارت‪> :<2‬عبارت‪> ?<1‬شرط<‬
‫نحوه کار بدینصورت است که درصورت درست بودن شرط‪ ،‬عبارت‪ 1‬و در غیراینصورت عبارت ‪ 2‬بازگردانده می‬
‫شود‪.‬‬
‫به عنوان مثال به دستور زیر توجه کنید‪:‬‬
‫که این عبارت معادل دستور زیر است‪:‬‬

‫‪‬‬

‫;‪a = (k<10) ? 100 : 50‬‬
‫;‪if (k<10) a=100‬‬
‫;‪else a=50‬‬

‫البته این عبارت به شکلهای پیچیده نیز می تواند مورد استفاده قرار گیرد‪ .‬مثال ‪:‬‬
‫;‪c += (a>0 && a<10) ? ++a : a/b‬‬
‫که معادل است با ‪:‬‬
‫{ )‪if (a>0 && a<10‬‬
‫;‪a= a + 1‬‬
‫;‪c = c + a‬‬
‫}‬
‫;‪else c = c + a/b‬‬

‫‪ 7-5-6‬اولویت عملگرها‬
‫عملگر‬

‫اولویت‬

‫شرکت پذیری‬

‫‪1‬‬

‫)(‬

‫از چپ به راست‬

‫‪2‬‬

‫‪- + ! -- ++‬‬

‫از راست به چپ‬

‫‪3‬‬

‫‪* / %‬‬

‫از چپ به راست‬

‫‪4‬‬

‫‪+ -‬‬

‫از چپ به راست‬

‫‪5‬‬

‫>> <<‬

‫از چپ به راست‬

‫‪6‬‬

‫>= > <= <‬

‫از چپ به راست‬

‫‪7‬‬

‫=! ==‬

‫از چپ به راست‬

‫‪8‬‬

‫&&‬

‫از چپ به راست‬

‫‪9‬‬

‫||‬

‫از چپ به راست‬

‫‪10‬‬

‫‪?:‬‬

‫از راست به چپ‬

‫‪11‬‬

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

‫از راست به چپ‬

‫‪12‬‬

‫‪,‬‬

‫از چپ به راست‬

‫‪ 7-6‬خواندن و نمایش اطالعات‬
‫‪‬‬

‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫همانطور كه قبال نیز گفته شد‪ ،‬یكی از اهداف زبان ‪ C‬قابل حمل بودن آن‬
‫است‪ .‬بهمین منظور سعی شده است كه از دستوراتی كه ممكن است‬
‫وابسته به ماشین خاصی باشد‪ ،‬اجتناب گردد‪.‬‬
‫بهمین دلیل زبان ‪ C‬برخالف سایر زبانها دارای هیچ دستوری برای‬
‫خواندن از ورودی و یا نوشتن در خروجی نیست‪.‬‬
‫اما در عوض دارای تعدادی تابع )زیربرنامه( استاندارد می باشد كه تقریبا‬
‫تمامی كامپایلرها از آنها حمایت می كنند‪.‬‬
‫این كار به كامپایلر این امكان را می دهد كه بر حسب نوع سخت افزار‬
‫موردنظر‪ ،‬توابع ورودی و خروجی را طراحی نماید‪.‬‬
‫این توابع در یك فایل سرآمد بنام ‪ stdio.h‬تعریف شده اند و بنابراین قبل‬
‫ازاینكه بتوانید از این توابع استفاده نمایید‪ ،‬باید این فایل را نیز با استفاده‬
‫از ‪ #include‬در برنامه خود بگنجانید‪.‬‬

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫برای نمایش اطالعات در خروجی از تابع ‪ printf‬استفاده می شود‪.‬‬
‫این تابع رشته موردنظر شما را به خروجی استاندارد )كه در حالت‬
‫عادی همان صفحه نمایش یا مانیتور است( می فرستد‪ .‬شكل كلی این‬
‫تابع بصورت زیر است‪:‬‬
‫; )>لیست متغیرها< ‪> ,‬رشته كنترلی<(‪printf‬‬
‫رشته كنترلی همان متنی است كه قصد چاپ آن را داریم‪ ،‬با ذكر این‬
‫نكته كه در قسمتهایی كه باید مقدار یك متغیر چاپ شود‪ ،‬از یك‬
‫مشخصه تبدیل استفاده می شود‪ .‬هر مشخصه تبدیل از یك عالمت ‪%‬‬
‫بعالوه یك كاراكتر كه نوع متغیر مورد نظر را نشان می دهد تشكیل می‬
‫گردد‪.‬‬
‫لیست متغیرها نیز همان متغیرهایی هستند كه قصد چاپ آنها را داریم‪.‬‬
‫این متغیرها باید بترتیب قرار گرفته و با كاما )‪ (,‬از یكدیگر جدا شوند‪.‬‬

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫مشخصه تبدیل‬

‫مفهوم‬

‫‪%c‬‬

‫كاراكتر‬

‫‪%d‬‬

‫عدد صحیح در مبنای ‪10‬‬

‫‪%f‬‬

‫عدد اعشاری بدون نماد علمی‬

‫‪%e‬‬

‫عدد اعشاری با نماد علمی‬

‫‪%g‬‬

‫عدد اعشاری با حالت كوتاهتر بین ‪ e‬و ‪f‬‬

‫‪%s‬‬

‫رشته‬

‫‪%ld‬‬

‫عدد صحیح بزرگ‬

‫‪%lf %le %lg‬‬

‫عدد اعشاری بزرگ‬

‫‪%o‬‬

‫عدد صحیح در مبنای ‪8‬‬

‫‪%x‬‬

‫عدد صحیحی در مبنای ‪16‬‬

‫‪%u‬‬

‫عدد صحیح بدون عالمت‬

‫ تابع نمایش در خروجی‬7-6-1
#include
void main() {
int age = 20;
floate average = 18.23;
printf("You are %d years old and your average is %f \n",age,average);
}
You are 20 years old and your average is 18.230000

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫‪‬‬
‫‪‬‬

‫برای کنترل نحوه چاپ اعداد می توانید از مشخصه طول میدان استفاده‬
‫کنید‪.‬‬
‫مشخصه طول میدان برای اعداد به شكل زیر استفاده می شود‪:‬‬
‫‪ ‬برای اعداد صحیح از ‪ %nd‬استفاده می كنیم كه ‪ n‬تعداد ارقام را نشان‬
‫می دهد )مثال ‪ .(%3d‬در اینصورت برای هر متغیر ‪ n‬رقم درنظر گرفته‬
‫می شود‪ .‬اگر اندازه عدد از ‪ n‬كوچكتر باشد‪ ،‬به سمت چپ آن فضای‬
‫خالی اضافه می شود و اگر اندازه عدد بیش از ‪ n‬رقم باشد‪ ،‬طول میدان‬
‫نادیده گرفته شده و عدد بطور كامل چاپ می شود‪.‬‬
‫‪ ‬برای اعداد اعشاری از ‪ %n.mf‬استفاده می كنیم كه ‪ n‬اندازه كل عدد‬
‫)شامل عالمت ممیز( و ‪ m‬تعداد ارقام اعشار است )مثال ‪ .(%5.2f‬در‬
‫صورتیكه تعداد ارقام اعشاری عدد موردنظر از ‪ m‬بیشتر باشد‪ ،‬عدد به ‪m‬‬
‫عدد اعشار گرد می شود و در صورتیكه از ‪ m‬كمتر باشد‪ ،‬در سمت‬
‫راست آن ‪ 0‬قرار داده می شود‪.‬‬

‫‪ 7-6-2‬تابع خواندن از ورودی‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای خواندن اطالعات از ورودی از تابع ‪ scanf‬استفاده می شود‪.‬‬
‫این تابع اطالعات را ازورودی استاندارد )معموال صفحه كلید( خوانده و در‬
‫متغیرهای تعیین شده قرار می دهد‪.‬‬
‫شكل كلی این تابع بصورت زیر است‪:‬‬
‫; )>لیست آدرسهای متغیرها< ‪> ,‬رشته كنترلی<(‪scanf‬‬
‫همانطور كه می بینید نحوه احضار تابع ‪ scanf‬نیز مشابه ‪ printf‬است‪ .‬تنها‬
‫تفاوت در آن است كه در ‪ scanf‬باید لیست آدرسهای متغیرها ارسال شود‪.‬‬
‫مبحث مربوط به آدرسها در فصول بعدی بررسی خواهد شد ولی در حال حاضر‬
‫بخاطر بسپارید كه برای بدست آوردن آدرس یك متغیر از عالمت & استفاده می‬
‫كنیم‪ .‬بعنوان مثال ‪ &age‬بمعنای آدرس متغیر ‪ age‬است‪.‬‬
‫بطور كلی در ‪ C‬قدیمی هرگاه كه یك تابع دارای پارامترهای خروجی بود )یعنی‬
‫پارامترهایی كه یك مقدار را باز می گرداندند( از آدرس متغیرها استفاده می‬
‫شد كه امروزه این مسئله وجود ندارد‪.‬‬

‫ تابع خواندن از ورودی‬7-6-2
#include
void main() {
int age;
float average ;
printf("Please enter your age and average : ");
scanf("%d %f",&age,&average);
printf("You are %d years old and your average is %5.2f \n",age,average);
}

Please enter your age and average : 19 16.72
You are 19 years old and your average is 16.72

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫زبان ‪ C++‬یک زبان شی گرا است‪ ،‬بهمین دلیل در این زبان برای ورودی‬
‫و خروجی از اشیاء بجای توابع استفاده می گردد‪.‬‬
‫از آنجا که امروزه معموال برنامه نویسان ‪ C‬از کامپایلرهای ‪ C++‬استفاده‬
‫می کنند‪ ،‬می توانند از اشیای ورودی و خروجی آن نیز استفاده کنند‪.‬‬
‫اینکار در بین بسیاری از برنامه نویسان ‪ C‬متداول است‪ ،‬بهمین دلیل ما‬
‫در اینجا نحوه کار با اشیای خواندن و نوشتن در ‪ C++‬را بطور مقدماتی‬
‫توضیح می دهیم؛ گرچه توضیح کامل این موارد نیاز به آشنایی با شی‬
‫گرایی و زبان ‪ C++‬دارد‪.‬‬
‫قبل از هرچیز الزم به ذکر است که کلیه اشیای مربوط به ورودی و‬
‫خروجی در فایل سرآمدی بنام ‪ iostream.h‬تعیریف شده اند‪ ،‬بنابراین‬
‫ابتدا باید این فایل به برنامه توسط دستور ‪ #include‬الحاق گردد‪.‬‬

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫زبان ‪ C++‬برای نمایش اطالعات از یک شیئ بنام ‪ cout‬استفاده می نماید‪.‬‬
‫برای ارسال اطالعات مورد نظر برای چاپ به ‪ cout‬باید از عملگر درج در جریان‬
‫یا >> استفاده نماییم‪ .‬بعنوان مثال ‪:‬‬
‫; ” ‪cout >> “Please enter your name:‬‬
‫و یا مثال دیگر ‪:‬‬
‫;‪int a = 10‬‬
‫;‪float b = 2.86‬‬
‫;‪cout << a‬‬
‫;‪cout << b‬‬
‫نکته جالبی که در این مثالها دیده می شود‪ ،‬آنستکه برخالف تابع ‪ printf‬هیچ‬
‫نیازی به مشخص کردن نوع متغیری که قصد چاپ آن را داریم نیست و خود‬
‫شئ ‪ cout‬نوع آن را تشخیص می دهد‪.‬‬
‫عالوه براین می توان چندین عملگر درج در جریان را با یکدیگر الحاق کرد و‬
‫چندین متغیر را با یک دستور چاپ کرد‪.‬‬

C++ ‫ ورودی و خروجی اطالعات در‬7-6-3
#include
void main() {
int age = 20;
floate average = 18.23;
cout >> “You are ” >> age >> “ years old and your average is ” >> average ;
}

You are 20 years old and your average is 18.230000

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای دریافت اطالعات از کاربر‪ ،‬از شئ دیگری بنام ‪ cin‬استفاده می شود‪.‬‬
‫برای ارسال متغیر مورد نظر به ‪ cin‬باید از عملگر استخراج از جریان یا <<‬
‫استفاده نماییم‪ .‬بعنوان مثال‪:‬‬
‫;‪int a‬‬
‫;‪cin >> a‬‬
‫بازهم همانطور که می بینید نیازی به تعیین نوع متغیر موردنظر نیست و خود‬
‫شئ ‪ cin‬نوع متغیر را بطور اتوماتیک تشخیص داده و داده ای از همان نوع را از‬
‫کاربر دریافت و در متغیر مورد نظر قرار می دهد‪.‬‬
‫عملگرهای استخراج از جریان را نیز می توان با یکدیگر الحاق کرد‪.‬‬
‫برای رفتن به خط بعد در شئ ‪ cout‬می توان از دستکاری کننده ‪ endl‬استفاده‬
‫کرد‪ .‬مثال در دستور زیر پس از چاپ پیغام‪ ،‬مکان نما به خط بعد منتقل می‬
‫شود‪:‬‬
‫;‪cout >> “List of students : “ >> endl‬‬
‫البته دستکاری کننده های متعدد دیگری نیز ازجمله موارد مربوط به تعیین طول‬
‫میدان و نحوه چاپ مقادیر وجود دارد که توضیح آنها نیاز به یک مبحث مستقل‬
‫دارد‪.‬‬

C++ ‫ ورودی و خروجی اطالعات در‬7-6-3
#include
void main() {
int age;
float average ;
cout << "Please enter your age and average : " ;
cin >> age >> average ;
cout << "You are " << age << "years old and your average is " << average;
}

Please enter your age and average : 19 16.72
You are 19 years old and your average is 16.72

‫‪ 7-7‬توابع کتابخانه ای‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫همانطور که قبال نیز گفته شد‪ ،‬زبان ‪ C‬از زیر برنامه ها نیز حمایت می کند‪ .‬هر زیر برنامه‬
‫در ‪ C‬یک تابع نامیده می شود‪ .‬تا کنون با توابعی همچون ‪ main‬و یا ‪ printf‬و ‪ scanf‬آشنا‬
‫شده ایم‪.‬‬
‫معموال عرضه کنندگان کامپایلرها و یا سایر فروشندگان نرم افزار‪ ،‬برخی از توابع عمومی‬
‫را که ممکن است مورد نیاز جمع کثیری از برنامه نویسان مختلف باشد را در قالب‬
‫کتابخانه ای از توابع در اختیار برنامه نویسان می گذارند‪ .‬بعضی از این توابع کتابخانه ای‬
‫مانند ‪ printf‬و ‪ scanf‬بصورت استاندارد درآمده و توسط عرضه کنندگان مختلف ارائه می‬
‫شوند‪.‬‬
‫در کامپایلر عرضه شده توسط شرکت بورلند )‪ (Borland C++ 3.1‬نیز کتابخانه های‬
‫متعددی از توابع برای شما عرضه شده اند که بتدریج با آنها و کاربردشان آشنا خواهید‬
‫شد‪.‬‬
‫نکته مهم آنستکه برای استفاده از این توابع ابتدا باید فایل سرآمد مربوط به آنها را نیز در‬
‫ابتدای برنامه خود اضافه نمایید ) با استفاده از ‪ .(#include‬هر فایل سرآمد شامل تعاریف‬
‫اولیه گروهی از توابع مرتبط با هم و داده های مربوط به آنها بوده و در استاندارد قدیمی‬
‫تر دارای پسوند ‪ .h‬می باشد)در استاندارد جدید پسوند این فایلها حذف شده است(‪.‬‬
‫برخی از این فایلهای سرآمد عبارتند از‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪ : stdio.h‬توابع ورودی و خروجی استاندارد‬
‫‪ : math.h‬توابع ریاضی‬
‫‪ : graphics.h‬توابع مربوط به عملیات گرافیکی‬
‫‪ : string.h‬توابع مربوط به کار با رشته ها‬


Slide 37

‫مبانی کامپیوتر و برنامه سازی‬
‫فصل هفتم ‪ :‬مفاهیم اولیه زبان ‪C‬‬
‫مدرس ‪ :‬نگین معروفی‬

‫‪ 7-1‬شناسه ها در ‪C‬‬
‫‪‬‬
‫‪‬‬

‫شناسه )‪ (identifier‬نامی است که به یک قسمت از برنامه مانند متغیر‪ ،‬تابع‪ ،‬ثابت و یا‬
‫‪ ...‬داده می شود‪.‬‬
‫در زبان ‪ C‬برای انتخاب شناسه ها فقط می توان از عالئم زیر استفاده کرد‪:‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫حروف انگلیسی کوچک و بزرگ )‪(A…Z a…z‬‬
‫ارقام )‪(0…9‬‬
‫عالمت خط پایین یا _‬

‫البته یک شناسه نمی تواند با یک رقم شروع شود‪.‬‬
‫چند شناسه مجاز‪ name2 ، average ، sum :‬و ‪student_average‬‬
‫چند شناسه غیرمجاز ‪ 2name‬و یا ‪student average‬‬
‫در برنامه نویسی امروزی پیشنهاد می شود بجای شناسه هایی همانند‬
‫‪ student_average‬از ‪ studentAverage‬استفاده گردد‪.‬‬
‫نکته مهم دیگری که باید به آن اشاره کرد آنستکه زبان ‪ C‬برخالف بسیاری از زبانهای دیگر‬
‫به کوچک و بزرگی حروف حساس است )‪ .(case sensitive‬در نتیجه شناسه های زیر با‬
‫یکدیگر متفاوتند ‪:‬‬
‫‪Sum ≠ sum ≠ SUM‬‬
‫آخرین نکته اینستکه در هنگام انتخاب شناسه نمی توانید از کلمات کلیدی که برای‬
‫منظورهای خاص در زبان ‪ C‬رزرو شده اند استفاده کنید‪.‬‬

C ‫ شناسه ها در‬7-1
: C ‫کلمات کلیدی در زبان‬
auto

break

case

char

const

continue

default

do

double

else

enum

extern

float

for

goto

if

int

long

register

return

short

signed

sizeof

static

struct

switch

typedef

union

unsigned

void

volatile

while

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫محدوده‬

‫اندازه )بیت(‬

‫توضیح‬

‫نوع داده‬

‫‪-128 to +127‬‬

‫‪8‬‬

‫کاراکتر‬

‫‪char‬‬

‫‪-32768 to +32767‬‬

‫‪16‬‬

‫عدد صحیح‬

‫‪int‬‬

‫‪3.4e-38 to 3.4e+38‬‬

‫‪32‬‬

‫عدد اعشاری‬

‫‪float‬‬

‫‪1.7e-308 to 1.7e+308‬‬

‫‪64‬‬

‫عدد اعشاری با‬
‫دقت مضاعف‬

‫‪double‬‬

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫‪‬‬

‫البته چند نکته مهم درمورد این جدول قابل ذکر است ‪:‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫اندازه ‪ int‬در محیطهای ‪ 16‬بیتی مانند ‪ DOS‬برابر ‪ 16‬بیت است‪ .‬اما در‬
‫محیطهای ‪ 32‬بیتی همانند ‪ Windows‬اندازه آن ‪ 32‬بیت می باشد که در‬
‫اینصورت محدوده ای برابر ‪ -2,147,483,648‬تا ‪ +2,147,483,647‬را‬
‫پوشش می دهد‪.‬‬
‫در بعضی از کامپایلرهای ‪ ،C‬نوع داده ‪ bool‬نیز وجود دارد که می تواند‬
‫یکی از مقادیر ‪)true‬درست( یا ‪) false‬غلط( را نشان دهد ‪ .‬اما در نسخه‬
‫های اولیه ‪ C‬از همان نوع داده صحیح یا ‪ int‬برای اینکار استفاده می‬
‫شد‪ .‬بدین صورت که ‪ 0‬نشاندهنده ‪ false‬و هر عدد غیر صفر )معموال ‪(1‬‬
‫نشاندهنده ‪ true‬است‪.‬‬
‫از آنجا که برای ذخیره سازی کاراکترها کد اسکی آنها ذخیره می گردد‪،‬‬
‫از یک متغیر کاراکتری یا ‪ char‬می توان بعنوان یک عدد صحیح کوچک نیز‬
‫استفاده کرد و اعمال ریاضی برروی آنها نیز مجاز است‪.‬‬

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫عالوه براین چندین اصالح کننده نیز وجود دارد که به ما اجازه می دهد نوع داده مورد‬
‫نظر را با دقت بیشتری برای نیازهای مختلف استفاده نماییم‪.‬‬
‫این اصالح کننده ها عبارتند از ‪short, long, signed, unsigned :‬‬
‫تمام این اصالح کننده ها می توانند به نوع داده ‪ int‬اعمال شوند و اثر آنها بستگی‬
‫به محیط دارد‪.‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫در یک محیط ‪16‬بیتی‪short int ،‬بازهم برابر ‪16‬بیت است ولی ‪ long int‬برابر‪32‬بیت می‬
‫باشد‪.‬‬
‫‪ unsigned int‬باعث می شود که یک عدد ‪ 16‬بیتی بدون عالمت داشته باشیم که بازه‬
‫بین ‪ 0‬تا ‪ 65535‬را پوشش می دهد‪ signed int .‬نیز همانند ‪ int‬معمولی بوده و تفاوتی‬
‫ندارد‪.‬‬
‫ترکیب این اصالح کننده ها نیز ممکن است‪ .‬مثال ‪ unsigned long int‬یک عدد ‪ 32‬بیتی‬
‫بدون عالمت است که بازه ‪ 0‬تا ‪ 4,294,967,295‬را پوشش می دهد‪.‬‬

‫برروی نوع داده ‪ char‬فقط اصالح کننده های ‪ signed‬و ‪ unsigned‬را می توان اعمال‬
‫کرد‪ .‬معموال از اصالح کننده ‪ unsigned‬وقتی استفاده می شود که قصد داشته‬
‫باشیم از ‪ char‬بعنوان یک عدد صحیح مثبت بین ‪ 0‬تا ‪ 255‬استفاده کنیم‪.‬‬
‫برروی نوع داده ‪ double‬تنها اصالح کننده ‪ long‬قابل اعمال است و دراینصورت عدد‬
‫اعشاری با ‪ 80‬بیت را خواهیم داشت که قادر است هر عددی در بازه ‪ 3.4e-4932‬تا‬
‫‪ 1.1e+4932‬را در خود نگاه دارد‪.‬‬

‫‪ 7-3‬تعریف متغیرها‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای تعریف متغیرها به شکل زیر عمل می کنیم‪:‬‬

‫;>‪ ‫که ‪ type‬یکی از نوع داده های گفته شده و ‪ variable-list‬لیستی از متغیرها است‬
‫که با کاما از یکدیگر جدا شده اند‪ .‬بعنوان مثال ‪:‬‬
‫;‪int sum‬‬
‫;‪float average‬‬
‫; ‪long int a, b, c‬‬
‫; ‪unsigned long int i, j, k‬‬
‫عالوه براین می توان در هنگام تعریف متغیر به آن مقدار اولیه نیز داد‪ .‬مثال ‪:‬‬
‫; ‪int d = 0‬‬
‫نكته مهم آنكه زبان ‪ C‬به متغیرها مقدار اولیه نمي دهد )حتي ‪ (0‬و برنامه نويس‬
‫خود بايد اينكار را صريحا انجام دهد‪ ،‬درغیر اينصورت مقدار اولیه متغیر‪ ،‬نامعین خواهد‬
‫بود‪.‬‬
‫تعریف متغیرها طبق اصول زبان ‪ C‬میتواند درهرجایی از برنامه صورت پذیرد‪ ،‬و‬
‫متغیرهای تعریف شده از همان خط به بعد قابل استفاده خواهد بود‪ .‬اما معموال‬
‫توصیه می گردد كه تعریف متغیرها در همان خط ابتدایی تابع و بالفاصله پس از {‬
‫صورت پذیرد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫‪‬‬
‫‪‬‬

‫ثابتها مقادیر ثابتی هستند كه مقدار آنها در حین اجرای برنامه تغییر نمی یابد‪ .‬ثابتها می توانند از‬
‫هریك از نوع داده های اصلی باشند‪.‬‬
‫ثوابت عددی صحیح ‪:‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫برای نمایش این دسته از ثوابت‪ ،‬از دنباله ای از ارقام بعالوه عالمت ‪ +‬یا ‪ -‬استفاده می كنیم‪ .‬بعنوان مثال‬
‫‪ -45‬و یا ‪ 3489‬ثوابت صحیح هستند‪.‬‬
‫در حالت عادی ‪ C‬هر عدد را در كوچكترین نوع داده ای كه می تواند قرار می دهد‪ .‬مثال عدد ‪ 85‬در یك‬
‫‪ int‬قرار می گیرد‪ ،‬اما عدد ‪ 145398‬در یك ‪ long int‬قرار خواهد گرفت‪.‬‬
‫اگر قصد دارید یك عدد كوچك بعنوان ‪ long‬محسوب گردد‪ ،‬می توانید از پسوند ‪ L‬در انتهای آن استفاده‬
‫می كنیم‪ .‬مثال ‪245L‬یك عدد ‪ long‬محسوب می شود‪.‬‬
‫;‪long int a = 20L‬‬
‫پسوند ‪ U‬در انتهای عدد نیز نشانه بدون عالمت بودن آن است‪.‬‬
‫نكته دیگر آنكه ‪ C‬به شما اجازه می دهد درصورت لزوم ثوابت صحیح خود را در مبنای ‪ 8‬یا ‪ 16‬نیز كه‬
‫از مبناهای متداول در برنامه نویسی هستند‪ ،‬بنویسید‪.‬‬
‫‪‬‬
‫‪‬‬

‫برای نوشتن عدد در مبنای ‪ 8‬باید آن را با ‪ 0‬آغاز كنید‪ ،‬مثال ‪ 0342‬یك عدد در منای ‪ 8‬محسوب می‬
‫گردد‪.‬‬
‫برای نوشتن یك عدد در مبنای ‪ 16‬باید آن را با ‪ 0x‬آغاز نمایید‪ ،‬مانند ‪.0x27A4‬‬

‫‪ 7-4‬ثوابت‬
‫ثوابت عددی اعشاری‬

‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫برای نمایش اعداد اعشاری‪ ،‬باید از نقطه اعشار استفاده كنیم‪ ،‬مانند ‪237.45‬‬
‫اما نكته جالب آنستكه می توانید از نماد علمی نیز برای نمایش اعداد‬
‫اعشاری استفاده كنید‪ .‬برای اینكار كافی است از حرف ‪ e‬برای نمایش قسمت‬
‫توان استفاده نمایید‪ .‬بعنوان مثال ‪:‬‬
‫‪-23.47 × 10 5 = -23.47e5‬‬
‫‪42.389 × 10 -3 = 42.389e-3‬‬
‫دقت كنید كه قسمت توان‪ ،‬حتما یك عدد صحیح است‪.‬‬
‫نكته جالب اینجاست كه برخالف مورد قبل‪ ،‬كامپایلر بطور پیش فرض داده های‬
‫اعشاری را از نوع ‪ double‬فرض می كند‪.‬چنانچه دوست دارید ثابت شما ازنوع‬
‫‪ float‬درنظر گرفته شود‪ ،‬در انتهای آن ‪ F‬قرار دهید‪ .‬ضمنا پسوند ‪ L‬نیز داده‬
‫اعشاری را از نوع ‪ long double‬درنظر می گیرد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫ثوابت كاراكتری ‪:‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫برای نشان دادن ثوابت كاراكتری‪ ،‬آنها را در داخل ' قرار می دهیم‪ .‬بعنوان مثال‬
‫'‪'A‬یك ثابت كاراكتری است‪.‬‬
‫; '‪char ch = 'S‬‬
‫دقت كنید كه همانطور كه قبال گفته شد‪ ،‬كد اسكی كاراكترها در متغیر ذخیره‬
‫می گردد‪ ،‬بنابراین می توان از آن بعنوان یك عدد صحیح نیز استفاده كرد‪ .‬نكته‬
‫مهم دیگر آنستكه به تفاوت عدد ‪ 5‬و كاراكتر '‪ '5‬دقت داشته باشید‪ .‬در حقیقت‬
‫'‪ '5‬برابر است با عدد ‪ 53‬كه همان كد اسكی آن است‪.‬‬
‫روش فوق‪ ،‬برای نمایش کاراکترهای قابل چاپ مناسب است‪ ،‬اما بعضی‬
‫كاراكترها مانند ‪ enter‬قابل نمایش نبوده و برای آنها شکل خاصی وجود ندارد‪.‬‬
‫در چنین مواردی‪ ،‬زبان ‪ C‬از ترکیب عالمت \ به همراه یک کاراکتر دیگر‪ ،‬برای‬
‫نمایش این قبیل کاراکترها استفاده می نماید‪ .‬بعنوان مثال‪ ،‬کاراکتر '‪ '\n‬نشان‬
‫دهنده خط جدید یا همان ‪ enter‬می باشد‪.‬‬
‫جدول صفحه بعد این قبیل کاراکترها و معادل آنها را نشان می دهد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫نحوه نمایش در ‪C‬‬

‫کد اسکی‬

‫صدای بوق کامپیوتر‬

‫‪\a‬‬

‫‪7‬‬

‫حرکت به عقب ‪backspace‬‬

‫‪\b‬‬

‫‪8‬‬

‫شروع صفحه ‪form feed‬‬

‫‪\f‬‬

‫‪12‬‬

‫سطر جدید ‪line feed‬‬

‫‪\n‬‬

‫‪10‬‬

‫برگشت به ابتداي سطر ‪carriage return‬‬

‫‪\r‬‬

‫‪13‬‬

‫فاصله افقی ‪horizontal tab‬‬

‫‪\t‬‬

‫‪9‬‬

‫فاصله عمودی ‪vertical tab‬‬

‫‪\v‬‬

‫‪11‬‬

‫عالمت سوال‬

‫?\‬

‫‪63‬‬

‫عالمت '‬

‫'\‬

‫‪39‬‬

‫عالمت "‬

‫"\‬

‫‪34‬‬

‫عالمت \‬

‫\\‬

‫‪92‬‬

‫عالمت تهی‬

‫‪\0‬‬

‫‪0‬‬

‫نام کاراکتر‬

‫کد اسکی یک کاراکتر با ‪ 3‬رقم در مبنای ‪8‬‬

‫‪\000‬‬

‫کد اسکی یک کاراکتر با ‪ 2‬رقم در مبنای ‪16‬‬

‫‪\x00‬‬

‫‪ 7-4‬ثوابت‬
‫‪‬‬

‫ثوابت رشته ای ‪ C :‬عالوه بر ثوابت فوق‪ ،‬از یك ثابت دیگر بنام رشته نیز‬
‫حمایت می كند‪ .‬رشته‪ ،‬دنباله ای از كاراكترها است كه در داخل " قرار‬
‫می گیرند‪ .‬بعنوان مثال "‪ "this is a test‬یك رشته است‪ .‬دقت كنید كه '‪'a‬‬
‫یك كاراكتر است‪ ،‬اما "‪ "a‬یك رشته است كه فقط شامل یك كاراكتر می‬
‫باشد‪.‬‬

‫‪ 7-5‬عملگرها‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫عملگر‪ ،‬نمادی است كه به كامپایلر می گوید تا عملیات محاسباتی یا‬
‫منطقی خاصی را برروی یك یا چند عملوند‪ ،‬انجام دهد‪.‬‬
‫به عملگرهایی كه فقط یك عملوند دارند‪ ،‬عملگر یكانی می گوییم و‬
‫همواره عملگر در سمت چپ عملوند قرار می گیرد)مانند عدد ‪.(-125‬‬
‫اما عملگرهایی كه برروی دو عملوند اثر می كنند را عملگر دودویی‬
‫نامیده و عملگر را بین دو عملوند قرار می دهیم )مانند ‪.(23+86‬‬
‫هر ترکیب درستی از عملگرها و عملوندها را یک عبارت می نامیم‪.‬‬
‫‪ C‬از نقطه نظر عملگرها یك زبان بسیار قوی است‪ .‬این عملگرها به چند‬
‫دسته اصلی تقسیم می گردند كه آنها را به ترتیب بررسی می كنیم‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫این عملگرها‪ ،‬همان اعمال متداول ریاضی هستند كه در زبان ‪ C‬مورد استفاده‬
‫قرار می گیرند‪ .‬این اعمال عبارتند از ‪:‬‬

‫عمل‬

‫نوع‬

‫عملگر‬

‫منفی كردن عملوند سمت راست‬

‫یكانی‬

‫‪-‬‬

‫جمع دو عملوند‬

‫دودویی‬

‫‪+‬‬

‫تفریق دو عملوند‬

‫دودویی‬

‫‪-‬‬

‫ضرب دو عملوند‬

‫دودویی‬

‫*‬

‫تقسیم دو عملوند‬

‫دودویی‬

‫‪/‬‬

‫محاسبه باقیمانده تقسیم دو عملوند‬

‫دودویی‬

‫‪%‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬
‫‪‬‬

‫این عملگرهای برروی همه انواع داده های ‪ C‬عمل می كنند‪ ،‬بجز عملگر ‪ %‬كه فقط‬
‫برروی نوع داده های صحیح عمل می كند‪.‬‬
‫اما نكته مهمی كه باید به آن اشاره كرد‪ ،‬نحوه كار عملگر تقسیم برروی نوع داده های‬
‫مختلف است‪.‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫درصورتیكه هردو عملوند صحیح باشند‪ ،‬تقسیم بصورت صحیح بر صحیح انجام خواهد شد‪.‬‬
‫اگر یكی یا هر دو عملوند اعشاری باشند‪ ،‬تقسیم بصورت اعشاری انجام خواهد پذیرفت‪.‬‬
‫فرض كنید تعاریف زیر را داریم ‪:‬‬
‫; ‪int a,b‬‬
‫; ‪float c,d‬‬
‫; ‪a = 10 ; b = 4‬‬
‫;‪c = 8.2; d = 4.0‬‬
‫اكنون به نتایج عملیات زیر دقت كنید ‪:‬‬
‫‪a / b => 2‬‬
‫‪c / d => 2.05‬‬
‫‪a / d => 2.5‬‬
‫‪a / 4 => 2‬‬
‫چنانچه به آخرین مورد توجه كنید‪ ،‬متوجه می شوید كه از آنجا كه ‪a‬یك متغیر صحیح است و ‪4‬‬
‫نیز یك ثابت صحیح در نظر گرفته شده‪ ،‬درنتیجه تقسیم بصورت صحیح بر صحیح انجام گرفته‬
‫است‪ .‬چنانچه بخواهیم تقسیم بصورت اعشاری صورت پذیرد‪ ،‬به دو شكل می توانیم عمل‬
‫كنیم‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫برای اینکه عبارت تقسیم صفحه قبل بصورت اعشاری انجام شود‪ ،‬به دو روش‬
‫می توان عمل کرد‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫این عبارت را بصورت ‪ a / 4.0‬بنویسیم‪.‬‬
‫از عملگر قالب ریزی استفاده كنیم‪.‬‬

‫عملگر قالب ریزی می تواند یك نوع را به نوع دیگری تبدیل نماید‪ .‬شكل كلی آن‬
‫به شكل زیر است ‪:‬‬
‫>‪() ‫كه ‪ type‬نوع مورد نظر است كه قصد تبدیل عبارت ‪ expression‬به آن نوع را‬
‫داریم‪ .‬بعنوان مثال در مورد قبلی می توان به شكل زیر عمل كرد ‪:‬‬
‫‪(float) a / 4‬‬
‫در این حالت از كامپایلر خواسته ایم كه ابتدا عدد ‪ a‬را به اعشاری تبدیل كند‬
‫)البته بصورت موقت( و سپس آن را بر ‪ 4‬تقسیم نماید‪ ،‬كه مسلما حاصل‬
‫اعشاری خواهد بود‪.‬‬
‫بطوركلی هرگاه ثابتها و متغیرهایی از انواع مختلف در یك عبارت محاسباتی‬
‫داشته باشیم‪ ،‬كامپایلر ‪ C‬همه آنها را به یك نوع یكسان كه همان بزرگترین‬
‫عملوند موجود است تبدیل خواهد كرد‪ .‬بعنوان مثال به مورد صفحه بعد دقت‬
‫كنید ‪:‬‬

‫ عملگرهای محاسباتی‬7-5-1
char ch;
int i;

float f;
double d;
result = (ch / i)
int

+

(f *d)

(f+i)
float

double

double

int

-

double

double

float

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫اولویت عملگرها ‪ :‬در عبارتی که شامل چندین عملگر است‪ ،‬کدامیک در‬
‫ابتدا اعمال خواهد گردید‪.‬‬
‫اولویت عملگرهای محاسباتی از باال به پایین بشرح زیر است‪:‬‬
‫‪ ‬عملگر یکانی –‬
‫‪ ‬عملگرهای * و ‪ /‬و ‪%‬‬
‫‪ ‬عملگرهای ‪ +‬و –‬
‫چنانچه اولویت دو عملگر یکسان باشد‪ ،‬این عملگرها از چپ به راست‬
‫محاسبه خواهند شد‪.‬‬
‫چنانچه بخواهیم یک عمل با اولویت پایین زودتر انجام شود‪ ،‬باید از پرانتز‬
‫استفاده کنیم‪ .‬بنابراین اولویت عملگر پرانتز از همه موارد فوق‬
‫بیشتراست‪ .‬در مورد پرانتزهای متداخل‪ ،‬ابتدا پرانتز داخلی محاسبه‬
‫می شود؛ اما در مورد پرانتزهای هم سطح‪ ،‬ابتدا پرانتز سمت چپتر‬
‫محاسبه می گردد‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫چند مثال در مورد اولویت عملگرها‬

‫ترتیب اجرای عملگرها‬

‫عبارت زبان ‪C‬‬

‫ابتدا عمل * و سپس عمل ‪+‬‬

‫‪b+c*d‬‬

‫ابتدا عمل ‪ +‬و سپس عمل *‬

‫‪(b + c) * d‬‬

‫ابتدا عمل ‪ /‬سپس عمل * و در انتها عمل ‪+‬‬

‫‪b+c/d*e‬‬

‫ابتدا عمل * سپس عمل ‪ /‬و در انتها عمل ‪+‬‬

‫)‪b + c / (d * e‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫یک مثال کامل در مورد اولویت عملگرها‬

‫‪result = a + b * (f – (g + b) / d) – c * (a – d) / e‬‬
‫‪6‬‬

‫‪1‬‬
‫‪7‬‬

‫‪2‬‬

‫‪8‬‬

‫‪3‬‬
‫‪4‬‬
‫‪5‬‬
‫‪9‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫در زبان ‪ C‬برای انتساب چندین عملگر وجود دارد‪ .‬ساده ترین عملگر انتساب‪ ،‬همان عملگر =‬
‫است که در بسیاری از زبانها استفاده می شود‪ .‬بعنوان مثال ‪:‬‬
‫;‪a = 5‬‬
‫;‪b = c + 2 * d‬‬
‫این عملگر باعث می شود که عبارت سمت راست در عبارت سمت چپ قرار گیرد‪.‬‬
‫توجه کنید که مقدار سمت چپ باید عبارتی باشد که بتوان به آن یک مقدار را نسبت داد‬
‫)مانند یک متغیر( که به آن ‪ Lvalue‬گفته می شود‪ ،‬بنابراین یک ثابت نمی تواند در سمت چپ‬
‫قرار گیرد‪.‬‬
‫نکته دیگر اینکه اولویت عملگر = از عملگرهای ریاضی کمتر است و درنتیجه ابتدا آن عملیات‬
‫انجام شده و در پایان حاصل در عبارت سمت چپ ریخته می شود‪.‬‬
‫الزم به ذکر است که در هنگام انتساب‪ ،‬درصورت لزوم نوع عبارت سمت راست به نوع عبارت‬
‫سمت چپ تبدیل می شود‪ .‬مثال‪:‬‬
‫;‪int a‬‬
‫;‪a = 2.5 * 5.0‬‬
‫که دراینصورت عدد ‪ 12‬در ‪ a‬ذخیره خواهد شد‪.‬‬
‫شرکت پذیری این عملگر از راست به چپ می باشد‪ ،‬بدین معنا که چنانچه چندین عملگر‬
‫نسبت دهی داشته باشیم‪ ،‬این عملگرها از راست به چپ محاسبه می شوند‪ .‬مثال پس از‬
‫اجرای دستور زیر‪ ،‬مقدار هر ‪ 3‬متغیر برابر ‪ 10‬خواهد شد‪.‬‬
‫;‪a = b = c = 10‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬

‫نکته جالب درمورد زبان ‪ C‬آنستکه دارای یک سری عملگرهای انتساب‬
‫خالصه شده است که باعث می شوند در بعضی موارد بتوانیم عبارات‬
‫کوتاهتری را بنویسیم‪ .‬این عملگرها عبارتند از ‪:‬‬
‫عملگرد‬

‫مثال‬

‫عبارت انتساب معادل‬

‫‪++‬‬

‫;‪a ++‬‬

‫;‪a = a + 1‬‬

‫‪--‬‬

‫;‪a --‬‬

‫;‪a = a – 1‬‬

‫=‪+‬‬

‫;‪a += 5‬‬

‫;‪a = a + 5‬‬

‫=‪-‬‬

‫;‪a -= 8‬‬

‫;‪a= a – 8‬‬

‫=*‬

‫;‪a *= 10‬‬

‫;‪a= a * 10‬‬

‫=‪/‬‬

‫;‪a /= 2‬‬

‫;‪a = a / 2‬‬

‫=‪%‬‬

‫;‪a %= 10‬‬

‫;‪a = a % 10‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬
‫‪‬‬

‫عملگر اول و دوم‪ ،‬عملگرهای یکانی هستند که بترتیب عملگر افزایش و عملگر کاهش‬
‫نامیده می شوند‪.‬‬
‫نکته جالب آنستکه این دو عملگر به دوصورت مورد استفاده قرار می گیرند‪.‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫در حالتی که از دستور ;‪ a ++‬استفاده شود به آن پس افزایش می گویند و بدین معناست که‬
‫ابتدا از مقدار فعلی ‪ a‬در عبارت موردنظر استفاده کن و سپس آن را افزایش بده‪.‬‬
‫اما دستور ;‪ ++ a‬که به آن پیش افزایش گفته می شود‪ ،‬ابتدا ‪ a‬را افزایش داده و سپس از آن‬
‫در عبارت استفاده می کند‪.‬‬
‫به برنامه زیر دقت کنید‪:‬‬

‫>‪#include ‫{ )(‪void main‬‬
‫; ‪int a ,b‬‬
‫;‪a=5‬‬
‫;‪b = a ++‬‬
‫;)‪printf(“a=%d and b=%d \n”,a,b‬‬
‫;‪a=5‬‬
‫;‪b = ++ a‬‬
‫;)‪printf(“a=%d and b=%d \n”,a,b‬‬
‫}‬
‫‪a=6 b=5‬‬
‫‪a=6 b=6‬‬

‫‪ 7-5-3‬عملگرهای مقایسه ای‬
‫‪‬‬

‫‪‬‬

‫این عملگرها دو عبارت را بایکدیگر مقایسه کرده و نتیجه را باز می گردانند‪.‬‬
‫نتیجه می تواند درست )‪ (true‬یا غلط )‪ (false‬باشد‪.‬‬
‫نتیجه این عملگرها یک عدد صحیح است که درصورت درست بودن ‪ 1‬و‬
‫درصورت غلط بودن ‪ 0‬باز می گردانند‪ .‬این عملگرها عبارتند از‪:‬‬
‫عملگر‬

‫مفهوم عملگر‬

‫مثال‬

‫<‬

‫بزرگتر )<(‬

‫‪a>b‬‬

‫>‬

‫کوچکتر )>(‬

‫‪a
‫=<‬

‫بزرگتر یا مساوی )≤(‬

‫‪a >= b‬‬

‫=>‬

‫کوچکتر یا مساوی )≥(‬

‫‪a <= b‬‬

‫==‬

‫مساوی )=(‬

‫‪a == b‬‬

‫=!‬

‫نامساوی )≠(‬

‫‪a != b‬‬

‫‪ 7-5-3‬عملگرهای مقایسه ای‬
‫‪‬‬

‫‪‬‬

‫نکته مهمی که باید به آن دقت کرد عملگر مساوی )==( است‪ ،‬چرا که یک‬
‫اشتباه بسیار متداول برنامه نویسان ‪ C‬استفاده اشتباه از عملگر انتساب‬
‫)=( بجای عملگر تساوی )==( است که باعث ایجاد خطا در برنامه می‬
‫شود‪.‬‬
‫اولویت این عملگرها از باال به پایین بشرح زیر است‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫عملگرهای <‪ <= ، > ،‬و =>‬
‫عملگرهای == و =!‬

‫الزم بذکر است که در هنگام مساوی بودن اولویت چند عملگر‪ ،‬این عملگرها‬
‫از چپ به راست محاسبه می گردند‪.‬‬

‫‪ 7-5-4‬عملگرهای منطقی‬
‫‪‬‬

‫این عملگرها به شما اجازه می دهند که شرطهای ساده ای را که با‬
‫استفاده از عملگرهای مقایسه ای ایجاد شده اند را با یکدیگر ترکیب نموده‬
‫و شرطهای پیچیده تری را بسازید‪ .‬این عملگرها عبارتند از ‪:‬‬
‫مثال‬

‫عملگر‬

‫مفهوم عملگر‬

‫نحوه کار‬

‫&&‬

‫‪ AND‬منطقی‬

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

‫‪a>0 && sw==1‬‬

‫||‬

‫‪ OR‬منطقی‬

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

‫‪a<=100 || b!=0‬‬

‫!‬

‫‪ NOT‬منطقی‬

‫اگر عملوند درست باشد‪ ،‬نادرست و‬
‫اگر نادرست باشد‪ ،‬درست برمی‬
‫گرداند‪.‬‬

‫)‪! (a==1 || b<10‬‬

‫‪ 7-5-5‬عملگر شرطی‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫گاهی الزم است که ابتدا یک شرط بررسی شده و سپس برمبنای نتیجه )درست یا نادرست بودن آن( یکی‬
‫از دو عبارت ممکن بازگردانده شود‪ .‬برای اینکار می توان از یک عملگر ‪3‬تایی )با ‪ 3‬عملوند( بنام عملگر‬
‫شرطی استفاده نمود‪.‬‬
‫شکل کلی این عملگر بصورت زیر است‪:‬‬
‫>عبارت‪> :<2‬عبارت‪> ?<1‬شرط<‬
‫نحوه کار بدینصورت است که درصورت درست بودن شرط‪ ،‬عبارت‪ 1‬و در غیراینصورت عبارت ‪ 2‬بازگردانده می‬
‫شود‪.‬‬
‫به عنوان مثال به دستور زیر توجه کنید‪:‬‬
‫که این عبارت معادل دستور زیر است‪:‬‬

‫‪‬‬

‫;‪a = (k<10) ? 100 : 50‬‬
‫;‪if (k<10) a=100‬‬
‫;‪else a=50‬‬

‫البته این عبارت به شکلهای پیچیده نیز می تواند مورد استفاده قرار گیرد‪ .‬مثال ‪:‬‬
‫;‪c += (a>0 && a<10) ? ++a : a/b‬‬
‫که معادل است با ‪:‬‬
‫{ )‪if (a>0 && a<10‬‬
‫;‪a= a + 1‬‬
‫;‪c = c + a‬‬
‫}‬
‫;‪else c = c + a/b‬‬

‫‪ 7-5-6‬اولویت عملگرها‬
‫عملگر‬

‫اولویت‬

‫شرکت پذیری‬

‫‪1‬‬

‫)(‬

‫از چپ به راست‬

‫‪2‬‬

‫‪- + ! -- ++‬‬

‫از راست به چپ‬

‫‪3‬‬

‫‪* / %‬‬

‫از چپ به راست‬

‫‪4‬‬

‫‪+ -‬‬

‫از چپ به راست‬

‫‪5‬‬

‫>> <<‬

‫از چپ به راست‬

‫‪6‬‬

‫>= > <= <‬

‫از چپ به راست‬

‫‪7‬‬

‫=! ==‬

‫از چپ به راست‬

‫‪8‬‬

‫&&‬

‫از چپ به راست‬

‫‪9‬‬

‫||‬

‫از چپ به راست‬

‫‪10‬‬

‫‪?:‬‬

‫از راست به چپ‬

‫‪11‬‬

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

‫از راست به چپ‬

‫‪12‬‬

‫‪,‬‬

‫از چپ به راست‬

‫‪ 7-6‬خواندن و نمایش اطالعات‬
‫‪‬‬

‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫همانطور كه قبال نیز گفته شد‪ ،‬یكی از اهداف زبان ‪ C‬قابل حمل بودن آن‬
‫است‪ .‬بهمین منظور سعی شده است كه از دستوراتی كه ممكن است‬
‫وابسته به ماشین خاصی باشد‪ ،‬اجتناب گردد‪.‬‬
‫بهمین دلیل زبان ‪ C‬برخالف سایر زبانها دارای هیچ دستوری برای‬
‫خواندن از ورودی و یا نوشتن در خروجی نیست‪.‬‬
‫اما در عوض دارای تعدادی تابع )زیربرنامه( استاندارد می باشد كه تقریبا‬
‫تمامی كامپایلرها از آنها حمایت می كنند‪.‬‬
‫این كار به كامپایلر این امكان را می دهد كه بر حسب نوع سخت افزار‬
‫موردنظر‪ ،‬توابع ورودی و خروجی را طراحی نماید‪.‬‬
‫این توابع در یك فایل سرآمد بنام ‪ stdio.h‬تعریف شده اند و بنابراین قبل‬
‫ازاینكه بتوانید از این توابع استفاده نمایید‪ ،‬باید این فایل را نیز با استفاده‬
‫از ‪ #include‬در برنامه خود بگنجانید‪.‬‬

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫برای نمایش اطالعات در خروجی از تابع ‪ printf‬استفاده می شود‪.‬‬
‫این تابع رشته موردنظر شما را به خروجی استاندارد )كه در حالت‬
‫عادی همان صفحه نمایش یا مانیتور است( می فرستد‪ .‬شكل كلی این‬
‫تابع بصورت زیر است‪:‬‬
‫; )>لیست متغیرها< ‪> ,‬رشته كنترلی<(‪printf‬‬
‫رشته كنترلی همان متنی است كه قصد چاپ آن را داریم‪ ،‬با ذكر این‬
‫نكته كه در قسمتهایی كه باید مقدار یك متغیر چاپ شود‪ ،‬از یك‬
‫مشخصه تبدیل استفاده می شود‪ .‬هر مشخصه تبدیل از یك عالمت ‪%‬‬
‫بعالوه یك كاراكتر كه نوع متغیر مورد نظر را نشان می دهد تشكیل می‬
‫گردد‪.‬‬
‫لیست متغیرها نیز همان متغیرهایی هستند كه قصد چاپ آنها را داریم‪.‬‬
‫این متغیرها باید بترتیب قرار گرفته و با كاما )‪ (,‬از یكدیگر جدا شوند‪.‬‬

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫مشخصه تبدیل‬

‫مفهوم‬

‫‪%c‬‬

‫كاراكتر‬

‫‪%d‬‬

‫عدد صحیح در مبنای ‪10‬‬

‫‪%f‬‬

‫عدد اعشاری بدون نماد علمی‬

‫‪%e‬‬

‫عدد اعشاری با نماد علمی‬

‫‪%g‬‬

‫عدد اعشاری با حالت كوتاهتر بین ‪ e‬و ‪f‬‬

‫‪%s‬‬

‫رشته‬

‫‪%ld‬‬

‫عدد صحیح بزرگ‬

‫‪%lf %le %lg‬‬

‫عدد اعشاری بزرگ‬

‫‪%o‬‬

‫عدد صحیح در مبنای ‪8‬‬

‫‪%x‬‬

‫عدد صحیحی در مبنای ‪16‬‬

‫‪%u‬‬

‫عدد صحیح بدون عالمت‬

‫ تابع نمایش در خروجی‬7-6-1
#include
void main() {
int age = 20;
floate average = 18.23;
printf("You are %d years old and your average is %f \n",age,average);
}
You are 20 years old and your average is 18.230000

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫‪‬‬
‫‪‬‬

‫برای کنترل نحوه چاپ اعداد می توانید از مشخصه طول میدان استفاده‬
‫کنید‪.‬‬
‫مشخصه طول میدان برای اعداد به شكل زیر استفاده می شود‪:‬‬
‫‪ ‬برای اعداد صحیح از ‪ %nd‬استفاده می كنیم كه ‪ n‬تعداد ارقام را نشان‬
‫می دهد )مثال ‪ .(%3d‬در اینصورت برای هر متغیر ‪ n‬رقم درنظر گرفته‬
‫می شود‪ .‬اگر اندازه عدد از ‪ n‬كوچكتر باشد‪ ،‬به سمت چپ آن فضای‬
‫خالی اضافه می شود و اگر اندازه عدد بیش از ‪ n‬رقم باشد‪ ،‬طول میدان‬
‫نادیده گرفته شده و عدد بطور كامل چاپ می شود‪.‬‬
‫‪ ‬برای اعداد اعشاری از ‪ %n.mf‬استفاده می كنیم كه ‪ n‬اندازه كل عدد‬
‫)شامل عالمت ممیز( و ‪ m‬تعداد ارقام اعشار است )مثال ‪ .(%5.2f‬در‬
‫صورتیكه تعداد ارقام اعشاری عدد موردنظر از ‪ m‬بیشتر باشد‪ ،‬عدد به ‪m‬‬
‫عدد اعشار گرد می شود و در صورتیكه از ‪ m‬كمتر باشد‪ ،‬در سمت‬
‫راست آن ‪ 0‬قرار داده می شود‪.‬‬

‫‪ 7-6-2‬تابع خواندن از ورودی‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای خواندن اطالعات از ورودی از تابع ‪ scanf‬استفاده می شود‪.‬‬
‫این تابع اطالعات را ازورودی استاندارد )معموال صفحه كلید( خوانده و در‬
‫متغیرهای تعیین شده قرار می دهد‪.‬‬
‫شكل كلی این تابع بصورت زیر است‪:‬‬
‫; )>لیست آدرسهای متغیرها< ‪> ,‬رشته كنترلی<(‪scanf‬‬
‫همانطور كه می بینید نحوه احضار تابع ‪ scanf‬نیز مشابه ‪ printf‬است‪ .‬تنها‬
‫تفاوت در آن است كه در ‪ scanf‬باید لیست آدرسهای متغیرها ارسال شود‪.‬‬
‫مبحث مربوط به آدرسها در فصول بعدی بررسی خواهد شد ولی در حال حاضر‬
‫بخاطر بسپارید كه برای بدست آوردن آدرس یك متغیر از عالمت & استفاده می‬
‫كنیم‪ .‬بعنوان مثال ‪ &age‬بمعنای آدرس متغیر ‪ age‬است‪.‬‬
‫بطور كلی در ‪ C‬قدیمی هرگاه كه یك تابع دارای پارامترهای خروجی بود )یعنی‬
‫پارامترهایی كه یك مقدار را باز می گرداندند( از آدرس متغیرها استفاده می‬
‫شد كه امروزه این مسئله وجود ندارد‪.‬‬

‫ تابع خواندن از ورودی‬7-6-2
#include
void main() {
int age;
float average ;
printf("Please enter your age and average : ");
scanf("%d %f",&age,&average);
printf("You are %d years old and your average is %5.2f \n",age,average);
}

Please enter your age and average : 19 16.72
You are 19 years old and your average is 16.72

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫زبان ‪ C++‬یک زبان شی گرا است‪ ،‬بهمین دلیل در این زبان برای ورودی‬
‫و خروجی از اشیاء بجای توابع استفاده می گردد‪.‬‬
‫از آنجا که امروزه معموال برنامه نویسان ‪ C‬از کامپایلرهای ‪ C++‬استفاده‬
‫می کنند‪ ،‬می توانند از اشیای ورودی و خروجی آن نیز استفاده کنند‪.‬‬
‫اینکار در بین بسیاری از برنامه نویسان ‪ C‬متداول است‪ ،‬بهمین دلیل ما‬
‫در اینجا نحوه کار با اشیای خواندن و نوشتن در ‪ C++‬را بطور مقدماتی‬
‫توضیح می دهیم؛ گرچه توضیح کامل این موارد نیاز به آشنایی با شی‬
‫گرایی و زبان ‪ C++‬دارد‪.‬‬
‫قبل از هرچیز الزم به ذکر است که کلیه اشیای مربوط به ورودی و‬
‫خروجی در فایل سرآمدی بنام ‪ iostream.h‬تعیریف شده اند‪ ،‬بنابراین‬
‫ابتدا باید این فایل به برنامه توسط دستور ‪ #include‬الحاق گردد‪.‬‬

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫زبان ‪ C++‬برای نمایش اطالعات از یک شیئ بنام ‪ cout‬استفاده می نماید‪.‬‬
‫برای ارسال اطالعات مورد نظر برای چاپ به ‪ cout‬باید از عملگر درج در جریان‬
‫یا >> استفاده نماییم‪ .‬بعنوان مثال ‪:‬‬
‫; ” ‪cout >> “Please enter your name:‬‬
‫و یا مثال دیگر ‪:‬‬
‫;‪int a = 10‬‬
‫;‪float b = 2.86‬‬
‫;‪cout << a‬‬
‫;‪cout << b‬‬
‫نکته جالبی که در این مثالها دیده می شود‪ ،‬آنستکه برخالف تابع ‪ printf‬هیچ‬
‫نیازی به مشخص کردن نوع متغیری که قصد چاپ آن را داریم نیست و خود‬
‫شئ ‪ cout‬نوع آن را تشخیص می دهد‪.‬‬
‫عالوه براین می توان چندین عملگر درج در جریان را با یکدیگر الحاق کرد و‬
‫چندین متغیر را با یک دستور چاپ کرد‪.‬‬

C++ ‫ ورودی و خروجی اطالعات در‬7-6-3
#include
void main() {
int age = 20;
floate average = 18.23;
cout >> “You are ” >> age >> “ years old and your average is ” >> average ;
}

You are 20 years old and your average is 18.230000

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای دریافت اطالعات از کاربر‪ ،‬از شئ دیگری بنام ‪ cin‬استفاده می شود‪.‬‬
‫برای ارسال متغیر مورد نظر به ‪ cin‬باید از عملگر استخراج از جریان یا <<‬
‫استفاده نماییم‪ .‬بعنوان مثال‪:‬‬
‫;‪int a‬‬
‫;‪cin >> a‬‬
‫بازهم همانطور که می بینید نیازی به تعیین نوع متغیر موردنظر نیست و خود‬
‫شئ ‪ cin‬نوع متغیر را بطور اتوماتیک تشخیص داده و داده ای از همان نوع را از‬
‫کاربر دریافت و در متغیر مورد نظر قرار می دهد‪.‬‬
‫عملگرهای استخراج از جریان را نیز می توان با یکدیگر الحاق کرد‪.‬‬
‫برای رفتن به خط بعد در شئ ‪ cout‬می توان از دستکاری کننده ‪ endl‬استفاده‬
‫کرد‪ .‬مثال در دستور زیر پس از چاپ پیغام‪ ،‬مکان نما به خط بعد منتقل می‬
‫شود‪:‬‬
‫;‪cout >> “List of students : “ >> endl‬‬
‫البته دستکاری کننده های متعدد دیگری نیز ازجمله موارد مربوط به تعیین طول‬
‫میدان و نحوه چاپ مقادیر وجود دارد که توضیح آنها نیاز به یک مبحث مستقل‬
‫دارد‪.‬‬

C++ ‫ ورودی و خروجی اطالعات در‬7-6-3
#include
void main() {
int age;
float average ;
cout << "Please enter your age and average : " ;
cin >> age >> average ;
cout << "You are " << age << "years old and your average is " << average;
}

Please enter your age and average : 19 16.72
You are 19 years old and your average is 16.72

‫‪ 7-7‬توابع کتابخانه ای‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫همانطور که قبال نیز گفته شد‪ ،‬زبان ‪ C‬از زیر برنامه ها نیز حمایت می کند‪ .‬هر زیر برنامه‬
‫در ‪ C‬یک تابع نامیده می شود‪ .‬تا کنون با توابعی همچون ‪ main‬و یا ‪ printf‬و ‪ scanf‬آشنا‬
‫شده ایم‪.‬‬
‫معموال عرضه کنندگان کامپایلرها و یا سایر فروشندگان نرم افزار‪ ،‬برخی از توابع عمومی‬
‫را که ممکن است مورد نیاز جمع کثیری از برنامه نویسان مختلف باشد را در قالب‬
‫کتابخانه ای از توابع در اختیار برنامه نویسان می گذارند‪ .‬بعضی از این توابع کتابخانه ای‬
‫مانند ‪ printf‬و ‪ scanf‬بصورت استاندارد درآمده و توسط عرضه کنندگان مختلف ارائه می‬
‫شوند‪.‬‬
‫در کامپایلر عرضه شده توسط شرکت بورلند )‪ (Borland C++ 3.1‬نیز کتابخانه های‬
‫متعددی از توابع برای شما عرضه شده اند که بتدریج با آنها و کاربردشان آشنا خواهید‬
‫شد‪.‬‬
‫نکته مهم آنستکه برای استفاده از این توابع ابتدا باید فایل سرآمد مربوط به آنها را نیز در‬
‫ابتدای برنامه خود اضافه نمایید ) با استفاده از ‪ .(#include‬هر فایل سرآمد شامل تعاریف‬
‫اولیه گروهی از توابع مرتبط با هم و داده های مربوط به آنها بوده و در استاندارد قدیمی‬
‫تر دارای پسوند ‪ .h‬می باشد)در استاندارد جدید پسوند این فایلها حذف شده است(‪.‬‬
‫برخی از این فایلهای سرآمد عبارتند از‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪ : stdio.h‬توابع ورودی و خروجی استاندارد‬
‫‪ : math.h‬توابع ریاضی‬
‫‪ : graphics.h‬توابع مربوط به عملیات گرافیکی‬
‫‪ : string.h‬توابع مربوط به کار با رشته ها‬


Slide 38

‫مبانی کامپیوتر و برنامه سازی‬
‫فصل هفتم ‪ :‬مفاهیم اولیه زبان ‪C‬‬
‫مدرس ‪ :‬نگین معروفی‬

‫‪ 7-1‬شناسه ها در ‪C‬‬
‫‪‬‬
‫‪‬‬

‫شناسه )‪ (identifier‬نامی است که به یک قسمت از برنامه مانند متغیر‪ ،‬تابع‪ ،‬ثابت و یا‬
‫‪ ...‬داده می شود‪.‬‬
‫در زبان ‪ C‬برای انتخاب شناسه ها فقط می توان از عالئم زیر استفاده کرد‪:‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫حروف انگلیسی کوچک و بزرگ )‪(A…Z a…z‬‬
‫ارقام )‪(0…9‬‬
‫عالمت خط پایین یا _‬

‫البته یک شناسه نمی تواند با یک رقم شروع شود‪.‬‬
‫چند شناسه مجاز‪ name2 ، average ، sum :‬و ‪student_average‬‬
‫چند شناسه غیرمجاز ‪ 2name‬و یا ‪student average‬‬
‫در برنامه نویسی امروزی پیشنهاد می شود بجای شناسه هایی همانند‬
‫‪ student_average‬از ‪ studentAverage‬استفاده گردد‪.‬‬
‫نکته مهم دیگری که باید به آن اشاره کرد آنستکه زبان ‪ C‬برخالف بسیاری از زبانهای دیگر‬
‫به کوچک و بزرگی حروف حساس است )‪ .(case sensitive‬در نتیجه شناسه های زیر با‬
‫یکدیگر متفاوتند ‪:‬‬
‫‪Sum ≠ sum ≠ SUM‬‬
‫آخرین نکته اینستکه در هنگام انتخاب شناسه نمی توانید از کلمات کلیدی که برای‬
‫منظورهای خاص در زبان ‪ C‬رزرو شده اند استفاده کنید‪.‬‬

C ‫ شناسه ها در‬7-1
: C ‫کلمات کلیدی در زبان‬
auto

break

case

char

const

continue

default

do

double

else

enum

extern

float

for

goto

if

int

long

register

return

short

signed

sizeof

static

struct

switch

typedef

union

unsigned

void

volatile

while

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫محدوده‬

‫اندازه )بیت(‬

‫توضیح‬

‫نوع داده‬

‫‪-128 to +127‬‬

‫‪8‬‬

‫کاراکتر‬

‫‪char‬‬

‫‪-32768 to +32767‬‬

‫‪16‬‬

‫عدد صحیح‬

‫‪int‬‬

‫‪3.4e-38 to 3.4e+38‬‬

‫‪32‬‬

‫عدد اعشاری‬

‫‪float‬‬

‫‪1.7e-308 to 1.7e+308‬‬

‫‪64‬‬

‫عدد اعشاری با‬
‫دقت مضاعف‬

‫‪double‬‬

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫‪‬‬

‫البته چند نکته مهم درمورد این جدول قابل ذکر است ‪:‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫اندازه ‪ int‬در محیطهای ‪ 16‬بیتی مانند ‪ DOS‬برابر ‪ 16‬بیت است‪ .‬اما در‬
‫محیطهای ‪ 32‬بیتی همانند ‪ Windows‬اندازه آن ‪ 32‬بیت می باشد که در‬
‫اینصورت محدوده ای برابر ‪ -2,147,483,648‬تا ‪ +2,147,483,647‬را‬
‫پوشش می دهد‪.‬‬
‫در بعضی از کامپایلرهای ‪ ،C‬نوع داده ‪ bool‬نیز وجود دارد که می تواند‬
‫یکی از مقادیر ‪)true‬درست( یا ‪) false‬غلط( را نشان دهد ‪ .‬اما در نسخه‬
‫های اولیه ‪ C‬از همان نوع داده صحیح یا ‪ int‬برای اینکار استفاده می‬
‫شد‪ .‬بدین صورت که ‪ 0‬نشاندهنده ‪ false‬و هر عدد غیر صفر )معموال ‪(1‬‬
‫نشاندهنده ‪ true‬است‪.‬‬
‫از آنجا که برای ذخیره سازی کاراکترها کد اسکی آنها ذخیره می گردد‪،‬‬
‫از یک متغیر کاراکتری یا ‪ char‬می توان بعنوان یک عدد صحیح کوچک نیز‬
‫استفاده کرد و اعمال ریاضی برروی آنها نیز مجاز است‪.‬‬

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫عالوه براین چندین اصالح کننده نیز وجود دارد که به ما اجازه می دهد نوع داده مورد‬
‫نظر را با دقت بیشتری برای نیازهای مختلف استفاده نماییم‪.‬‬
‫این اصالح کننده ها عبارتند از ‪short, long, signed, unsigned :‬‬
‫تمام این اصالح کننده ها می توانند به نوع داده ‪ int‬اعمال شوند و اثر آنها بستگی‬
‫به محیط دارد‪.‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫در یک محیط ‪16‬بیتی‪short int ،‬بازهم برابر ‪16‬بیت است ولی ‪ long int‬برابر‪32‬بیت می‬
‫باشد‪.‬‬
‫‪ unsigned int‬باعث می شود که یک عدد ‪ 16‬بیتی بدون عالمت داشته باشیم که بازه‬
‫بین ‪ 0‬تا ‪ 65535‬را پوشش می دهد‪ signed int .‬نیز همانند ‪ int‬معمولی بوده و تفاوتی‬
‫ندارد‪.‬‬
‫ترکیب این اصالح کننده ها نیز ممکن است‪ .‬مثال ‪ unsigned long int‬یک عدد ‪ 32‬بیتی‬
‫بدون عالمت است که بازه ‪ 0‬تا ‪ 4,294,967,295‬را پوشش می دهد‪.‬‬

‫برروی نوع داده ‪ char‬فقط اصالح کننده های ‪ signed‬و ‪ unsigned‬را می توان اعمال‬
‫کرد‪ .‬معموال از اصالح کننده ‪ unsigned‬وقتی استفاده می شود که قصد داشته‬
‫باشیم از ‪ char‬بعنوان یک عدد صحیح مثبت بین ‪ 0‬تا ‪ 255‬استفاده کنیم‪.‬‬
‫برروی نوع داده ‪ double‬تنها اصالح کننده ‪ long‬قابل اعمال است و دراینصورت عدد‬
‫اعشاری با ‪ 80‬بیت را خواهیم داشت که قادر است هر عددی در بازه ‪ 3.4e-4932‬تا‬
‫‪ 1.1e+4932‬را در خود نگاه دارد‪.‬‬

‫‪ 7-3‬تعریف متغیرها‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای تعریف متغیرها به شکل زیر عمل می کنیم‪:‬‬

‫;>‪ ‫که ‪ type‬یکی از نوع داده های گفته شده و ‪ variable-list‬لیستی از متغیرها است‬
‫که با کاما از یکدیگر جدا شده اند‪ .‬بعنوان مثال ‪:‬‬
‫;‪int sum‬‬
‫;‪float average‬‬
‫; ‪long int a, b, c‬‬
‫; ‪unsigned long int i, j, k‬‬
‫عالوه براین می توان در هنگام تعریف متغیر به آن مقدار اولیه نیز داد‪ .‬مثال ‪:‬‬
‫; ‪int d = 0‬‬
‫نكته مهم آنكه زبان ‪ C‬به متغیرها مقدار اولیه نمي دهد )حتي ‪ (0‬و برنامه نويس‬
‫خود بايد اينكار را صريحا انجام دهد‪ ،‬درغیر اينصورت مقدار اولیه متغیر‪ ،‬نامعین خواهد‬
‫بود‪.‬‬
‫تعریف متغیرها طبق اصول زبان ‪ C‬میتواند درهرجایی از برنامه صورت پذیرد‪ ،‬و‬
‫متغیرهای تعریف شده از همان خط به بعد قابل استفاده خواهد بود‪ .‬اما معموال‬
‫توصیه می گردد كه تعریف متغیرها در همان خط ابتدایی تابع و بالفاصله پس از {‬
‫صورت پذیرد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫‪‬‬
‫‪‬‬

‫ثابتها مقادیر ثابتی هستند كه مقدار آنها در حین اجرای برنامه تغییر نمی یابد‪ .‬ثابتها می توانند از‬
‫هریك از نوع داده های اصلی باشند‪.‬‬
‫ثوابت عددی صحیح ‪:‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫برای نمایش این دسته از ثوابت‪ ،‬از دنباله ای از ارقام بعالوه عالمت ‪ +‬یا ‪ -‬استفاده می كنیم‪ .‬بعنوان مثال‬
‫‪ -45‬و یا ‪ 3489‬ثوابت صحیح هستند‪.‬‬
‫در حالت عادی ‪ C‬هر عدد را در كوچكترین نوع داده ای كه می تواند قرار می دهد‪ .‬مثال عدد ‪ 85‬در یك‬
‫‪ int‬قرار می گیرد‪ ،‬اما عدد ‪ 145398‬در یك ‪ long int‬قرار خواهد گرفت‪.‬‬
‫اگر قصد دارید یك عدد كوچك بعنوان ‪ long‬محسوب گردد‪ ،‬می توانید از پسوند ‪ L‬در انتهای آن استفاده‬
‫می كنیم‪ .‬مثال ‪245L‬یك عدد ‪ long‬محسوب می شود‪.‬‬
‫;‪long int a = 20L‬‬
‫پسوند ‪ U‬در انتهای عدد نیز نشانه بدون عالمت بودن آن است‪.‬‬
‫نكته دیگر آنكه ‪ C‬به شما اجازه می دهد درصورت لزوم ثوابت صحیح خود را در مبنای ‪ 8‬یا ‪ 16‬نیز كه‬
‫از مبناهای متداول در برنامه نویسی هستند‪ ،‬بنویسید‪.‬‬
‫‪‬‬
‫‪‬‬

‫برای نوشتن عدد در مبنای ‪ 8‬باید آن را با ‪ 0‬آغاز كنید‪ ،‬مثال ‪ 0342‬یك عدد در منای ‪ 8‬محسوب می‬
‫گردد‪.‬‬
‫برای نوشتن یك عدد در مبنای ‪ 16‬باید آن را با ‪ 0x‬آغاز نمایید‪ ،‬مانند ‪.0x27A4‬‬

‫‪ 7-4‬ثوابت‬
‫ثوابت عددی اعشاری‬

‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫برای نمایش اعداد اعشاری‪ ،‬باید از نقطه اعشار استفاده كنیم‪ ،‬مانند ‪237.45‬‬
‫اما نكته جالب آنستكه می توانید از نماد علمی نیز برای نمایش اعداد‬
‫اعشاری استفاده كنید‪ .‬برای اینكار كافی است از حرف ‪ e‬برای نمایش قسمت‬
‫توان استفاده نمایید‪ .‬بعنوان مثال ‪:‬‬
‫‪-23.47 × 10 5 = -23.47e5‬‬
‫‪42.389 × 10 -3 = 42.389e-3‬‬
‫دقت كنید كه قسمت توان‪ ،‬حتما یك عدد صحیح است‪.‬‬
‫نكته جالب اینجاست كه برخالف مورد قبل‪ ،‬كامپایلر بطور پیش فرض داده های‬
‫اعشاری را از نوع ‪ double‬فرض می كند‪.‬چنانچه دوست دارید ثابت شما ازنوع‬
‫‪ float‬درنظر گرفته شود‪ ،‬در انتهای آن ‪ F‬قرار دهید‪ .‬ضمنا پسوند ‪ L‬نیز داده‬
‫اعشاری را از نوع ‪ long double‬درنظر می گیرد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫ثوابت كاراكتری ‪:‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫برای نشان دادن ثوابت كاراكتری‪ ،‬آنها را در داخل ' قرار می دهیم‪ .‬بعنوان مثال‬
‫'‪'A‬یك ثابت كاراكتری است‪.‬‬
‫; '‪char ch = 'S‬‬
‫دقت كنید كه همانطور كه قبال گفته شد‪ ،‬كد اسكی كاراكترها در متغیر ذخیره‬
‫می گردد‪ ،‬بنابراین می توان از آن بعنوان یك عدد صحیح نیز استفاده كرد‪ .‬نكته‬
‫مهم دیگر آنستكه به تفاوت عدد ‪ 5‬و كاراكتر '‪ '5‬دقت داشته باشید‪ .‬در حقیقت‬
‫'‪ '5‬برابر است با عدد ‪ 53‬كه همان كد اسكی آن است‪.‬‬
‫روش فوق‪ ،‬برای نمایش کاراکترهای قابل چاپ مناسب است‪ ،‬اما بعضی‬
‫كاراكترها مانند ‪ enter‬قابل نمایش نبوده و برای آنها شکل خاصی وجود ندارد‪.‬‬
‫در چنین مواردی‪ ،‬زبان ‪ C‬از ترکیب عالمت \ به همراه یک کاراکتر دیگر‪ ،‬برای‬
‫نمایش این قبیل کاراکترها استفاده می نماید‪ .‬بعنوان مثال‪ ،‬کاراکتر '‪ '\n‬نشان‬
‫دهنده خط جدید یا همان ‪ enter‬می باشد‪.‬‬
‫جدول صفحه بعد این قبیل کاراکترها و معادل آنها را نشان می دهد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫نحوه نمایش در ‪C‬‬

‫کد اسکی‬

‫صدای بوق کامپیوتر‬

‫‪\a‬‬

‫‪7‬‬

‫حرکت به عقب ‪backspace‬‬

‫‪\b‬‬

‫‪8‬‬

‫شروع صفحه ‪form feed‬‬

‫‪\f‬‬

‫‪12‬‬

‫سطر جدید ‪line feed‬‬

‫‪\n‬‬

‫‪10‬‬

‫برگشت به ابتداي سطر ‪carriage return‬‬

‫‪\r‬‬

‫‪13‬‬

‫فاصله افقی ‪horizontal tab‬‬

‫‪\t‬‬

‫‪9‬‬

‫فاصله عمودی ‪vertical tab‬‬

‫‪\v‬‬

‫‪11‬‬

‫عالمت سوال‬

‫?\‬

‫‪63‬‬

‫عالمت '‬

‫'\‬

‫‪39‬‬

‫عالمت "‬

‫"\‬

‫‪34‬‬

‫عالمت \‬

‫\\‬

‫‪92‬‬

‫عالمت تهی‬

‫‪\0‬‬

‫‪0‬‬

‫نام کاراکتر‬

‫کد اسکی یک کاراکتر با ‪ 3‬رقم در مبنای ‪8‬‬

‫‪\000‬‬

‫کد اسکی یک کاراکتر با ‪ 2‬رقم در مبنای ‪16‬‬

‫‪\x00‬‬

‫‪ 7-4‬ثوابت‬
‫‪‬‬

‫ثوابت رشته ای ‪ C :‬عالوه بر ثوابت فوق‪ ،‬از یك ثابت دیگر بنام رشته نیز‬
‫حمایت می كند‪ .‬رشته‪ ،‬دنباله ای از كاراكترها است كه در داخل " قرار‬
‫می گیرند‪ .‬بعنوان مثال "‪ "this is a test‬یك رشته است‪ .‬دقت كنید كه '‪'a‬‬
‫یك كاراكتر است‪ ،‬اما "‪ "a‬یك رشته است كه فقط شامل یك كاراكتر می‬
‫باشد‪.‬‬

‫‪ 7-5‬عملگرها‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫عملگر‪ ،‬نمادی است كه به كامپایلر می گوید تا عملیات محاسباتی یا‬
‫منطقی خاصی را برروی یك یا چند عملوند‪ ،‬انجام دهد‪.‬‬
‫به عملگرهایی كه فقط یك عملوند دارند‪ ،‬عملگر یكانی می گوییم و‬
‫همواره عملگر در سمت چپ عملوند قرار می گیرد)مانند عدد ‪.(-125‬‬
‫اما عملگرهایی كه برروی دو عملوند اثر می كنند را عملگر دودویی‬
‫نامیده و عملگر را بین دو عملوند قرار می دهیم )مانند ‪.(23+86‬‬
‫هر ترکیب درستی از عملگرها و عملوندها را یک عبارت می نامیم‪.‬‬
‫‪ C‬از نقطه نظر عملگرها یك زبان بسیار قوی است‪ .‬این عملگرها به چند‬
‫دسته اصلی تقسیم می گردند كه آنها را به ترتیب بررسی می كنیم‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫این عملگرها‪ ،‬همان اعمال متداول ریاضی هستند كه در زبان ‪ C‬مورد استفاده‬
‫قرار می گیرند‪ .‬این اعمال عبارتند از ‪:‬‬

‫عمل‬

‫نوع‬

‫عملگر‬

‫منفی كردن عملوند سمت راست‬

‫یكانی‬

‫‪-‬‬

‫جمع دو عملوند‬

‫دودویی‬

‫‪+‬‬

‫تفریق دو عملوند‬

‫دودویی‬

‫‪-‬‬

‫ضرب دو عملوند‬

‫دودویی‬

‫*‬

‫تقسیم دو عملوند‬

‫دودویی‬

‫‪/‬‬

‫محاسبه باقیمانده تقسیم دو عملوند‬

‫دودویی‬

‫‪%‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬
‫‪‬‬

‫این عملگرهای برروی همه انواع داده های ‪ C‬عمل می كنند‪ ،‬بجز عملگر ‪ %‬كه فقط‬
‫برروی نوع داده های صحیح عمل می كند‪.‬‬
‫اما نكته مهمی كه باید به آن اشاره كرد‪ ،‬نحوه كار عملگر تقسیم برروی نوع داده های‬
‫مختلف است‪.‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫درصورتیكه هردو عملوند صحیح باشند‪ ،‬تقسیم بصورت صحیح بر صحیح انجام خواهد شد‪.‬‬
‫اگر یكی یا هر دو عملوند اعشاری باشند‪ ،‬تقسیم بصورت اعشاری انجام خواهد پذیرفت‪.‬‬
‫فرض كنید تعاریف زیر را داریم ‪:‬‬
‫; ‪int a,b‬‬
‫; ‪float c,d‬‬
‫; ‪a = 10 ; b = 4‬‬
‫;‪c = 8.2; d = 4.0‬‬
‫اكنون به نتایج عملیات زیر دقت كنید ‪:‬‬
‫‪a / b => 2‬‬
‫‪c / d => 2.05‬‬
‫‪a / d => 2.5‬‬
‫‪a / 4 => 2‬‬
‫چنانچه به آخرین مورد توجه كنید‪ ،‬متوجه می شوید كه از آنجا كه ‪a‬یك متغیر صحیح است و ‪4‬‬
‫نیز یك ثابت صحیح در نظر گرفته شده‪ ،‬درنتیجه تقسیم بصورت صحیح بر صحیح انجام گرفته‬
‫است‪ .‬چنانچه بخواهیم تقسیم بصورت اعشاری صورت پذیرد‪ ،‬به دو شكل می توانیم عمل‬
‫كنیم‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫برای اینکه عبارت تقسیم صفحه قبل بصورت اعشاری انجام شود‪ ،‬به دو روش‬
‫می توان عمل کرد‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫این عبارت را بصورت ‪ a / 4.0‬بنویسیم‪.‬‬
‫از عملگر قالب ریزی استفاده كنیم‪.‬‬

‫عملگر قالب ریزی می تواند یك نوع را به نوع دیگری تبدیل نماید‪ .‬شكل كلی آن‬
‫به شكل زیر است ‪:‬‬
‫>‪() ‫كه ‪ type‬نوع مورد نظر است كه قصد تبدیل عبارت ‪ expression‬به آن نوع را‬
‫داریم‪ .‬بعنوان مثال در مورد قبلی می توان به شكل زیر عمل كرد ‪:‬‬
‫‪(float) a / 4‬‬
‫در این حالت از كامپایلر خواسته ایم كه ابتدا عدد ‪ a‬را به اعشاری تبدیل كند‬
‫)البته بصورت موقت( و سپس آن را بر ‪ 4‬تقسیم نماید‪ ،‬كه مسلما حاصل‬
‫اعشاری خواهد بود‪.‬‬
‫بطوركلی هرگاه ثابتها و متغیرهایی از انواع مختلف در یك عبارت محاسباتی‬
‫داشته باشیم‪ ،‬كامپایلر ‪ C‬همه آنها را به یك نوع یكسان كه همان بزرگترین‬
‫عملوند موجود است تبدیل خواهد كرد‪ .‬بعنوان مثال به مورد صفحه بعد دقت‬
‫كنید ‪:‬‬

‫ عملگرهای محاسباتی‬7-5-1
char ch;
int i;

float f;
double d;
result = (ch / i)
int

+

(f *d)

(f+i)
float

double

double

int

-

double

double

float

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫اولویت عملگرها ‪ :‬در عبارتی که شامل چندین عملگر است‪ ،‬کدامیک در‬
‫ابتدا اعمال خواهد گردید‪.‬‬
‫اولویت عملگرهای محاسباتی از باال به پایین بشرح زیر است‪:‬‬
‫‪ ‬عملگر یکانی –‬
‫‪ ‬عملگرهای * و ‪ /‬و ‪%‬‬
‫‪ ‬عملگرهای ‪ +‬و –‬
‫چنانچه اولویت دو عملگر یکسان باشد‪ ،‬این عملگرها از چپ به راست‬
‫محاسبه خواهند شد‪.‬‬
‫چنانچه بخواهیم یک عمل با اولویت پایین زودتر انجام شود‪ ،‬باید از پرانتز‬
‫استفاده کنیم‪ .‬بنابراین اولویت عملگر پرانتز از همه موارد فوق‬
‫بیشتراست‪ .‬در مورد پرانتزهای متداخل‪ ،‬ابتدا پرانتز داخلی محاسبه‬
‫می شود؛ اما در مورد پرانتزهای هم سطح‪ ،‬ابتدا پرانتز سمت چپتر‬
‫محاسبه می گردد‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫چند مثال در مورد اولویت عملگرها‬

‫ترتیب اجرای عملگرها‬

‫عبارت زبان ‪C‬‬

‫ابتدا عمل * و سپس عمل ‪+‬‬

‫‪b+c*d‬‬

‫ابتدا عمل ‪ +‬و سپس عمل *‬

‫‪(b + c) * d‬‬

‫ابتدا عمل ‪ /‬سپس عمل * و در انتها عمل ‪+‬‬

‫‪b+c/d*e‬‬

‫ابتدا عمل * سپس عمل ‪ /‬و در انتها عمل ‪+‬‬

‫)‪b + c / (d * e‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫یک مثال کامل در مورد اولویت عملگرها‬

‫‪result = a + b * (f – (g + b) / d) – c * (a – d) / e‬‬
‫‪6‬‬

‫‪1‬‬
‫‪7‬‬

‫‪2‬‬

‫‪8‬‬

‫‪3‬‬
‫‪4‬‬
‫‪5‬‬
‫‪9‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫در زبان ‪ C‬برای انتساب چندین عملگر وجود دارد‪ .‬ساده ترین عملگر انتساب‪ ،‬همان عملگر =‬
‫است که در بسیاری از زبانها استفاده می شود‪ .‬بعنوان مثال ‪:‬‬
‫;‪a = 5‬‬
‫;‪b = c + 2 * d‬‬
‫این عملگر باعث می شود که عبارت سمت راست در عبارت سمت چپ قرار گیرد‪.‬‬
‫توجه کنید که مقدار سمت چپ باید عبارتی باشد که بتوان به آن یک مقدار را نسبت داد‬
‫)مانند یک متغیر( که به آن ‪ Lvalue‬گفته می شود‪ ،‬بنابراین یک ثابت نمی تواند در سمت چپ‬
‫قرار گیرد‪.‬‬
‫نکته دیگر اینکه اولویت عملگر = از عملگرهای ریاضی کمتر است و درنتیجه ابتدا آن عملیات‬
‫انجام شده و در پایان حاصل در عبارت سمت چپ ریخته می شود‪.‬‬
‫الزم به ذکر است که در هنگام انتساب‪ ،‬درصورت لزوم نوع عبارت سمت راست به نوع عبارت‬
‫سمت چپ تبدیل می شود‪ .‬مثال‪:‬‬
‫;‪int a‬‬
‫;‪a = 2.5 * 5.0‬‬
‫که دراینصورت عدد ‪ 12‬در ‪ a‬ذخیره خواهد شد‪.‬‬
‫شرکت پذیری این عملگر از راست به چپ می باشد‪ ،‬بدین معنا که چنانچه چندین عملگر‬
‫نسبت دهی داشته باشیم‪ ،‬این عملگرها از راست به چپ محاسبه می شوند‪ .‬مثال پس از‬
‫اجرای دستور زیر‪ ،‬مقدار هر ‪ 3‬متغیر برابر ‪ 10‬خواهد شد‪.‬‬
‫;‪a = b = c = 10‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬

‫نکته جالب درمورد زبان ‪ C‬آنستکه دارای یک سری عملگرهای انتساب‬
‫خالصه شده است که باعث می شوند در بعضی موارد بتوانیم عبارات‬
‫کوتاهتری را بنویسیم‪ .‬این عملگرها عبارتند از ‪:‬‬
‫عملگرد‬

‫مثال‬

‫عبارت انتساب معادل‬

‫‪++‬‬

‫;‪a ++‬‬

‫;‪a = a + 1‬‬

‫‪--‬‬

‫;‪a --‬‬

‫;‪a = a – 1‬‬

‫=‪+‬‬

‫;‪a += 5‬‬

‫;‪a = a + 5‬‬

‫=‪-‬‬

‫;‪a -= 8‬‬

‫;‪a= a – 8‬‬

‫=*‬

‫;‪a *= 10‬‬

‫;‪a= a * 10‬‬

‫=‪/‬‬

‫;‪a /= 2‬‬

‫;‪a = a / 2‬‬

‫=‪%‬‬

‫;‪a %= 10‬‬

‫;‪a = a % 10‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬
‫‪‬‬

‫عملگر اول و دوم‪ ،‬عملگرهای یکانی هستند که بترتیب عملگر افزایش و عملگر کاهش‬
‫نامیده می شوند‪.‬‬
‫نکته جالب آنستکه این دو عملگر به دوصورت مورد استفاده قرار می گیرند‪.‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫در حالتی که از دستور ;‪ a ++‬استفاده شود به آن پس افزایش می گویند و بدین معناست که‬
‫ابتدا از مقدار فعلی ‪ a‬در عبارت موردنظر استفاده کن و سپس آن را افزایش بده‪.‬‬
‫اما دستور ;‪ ++ a‬که به آن پیش افزایش گفته می شود‪ ،‬ابتدا ‪ a‬را افزایش داده و سپس از آن‬
‫در عبارت استفاده می کند‪.‬‬
‫به برنامه زیر دقت کنید‪:‬‬

‫>‪#include ‫{ )(‪void main‬‬
‫; ‪int a ,b‬‬
‫;‪a=5‬‬
‫;‪b = a ++‬‬
‫;)‪printf(“a=%d and b=%d \n”,a,b‬‬
‫;‪a=5‬‬
‫;‪b = ++ a‬‬
‫;)‪printf(“a=%d and b=%d \n”,a,b‬‬
‫}‬
‫‪a=6 b=5‬‬
‫‪a=6 b=6‬‬

‫‪ 7-5-3‬عملگرهای مقایسه ای‬
‫‪‬‬

‫‪‬‬

‫این عملگرها دو عبارت را بایکدیگر مقایسه کرده و نتیجه را باز می گردانند‪.‬‬
‫نتیجه می تواند درست )‪ (true‬یا غلط )‪ (false‬باشد‪.‬‬
‫نتیجه این عملگرها یک عدد صحیح است که درصورت درست بودن ‪ 1‬و‬
‫درصورت غلط بودن ‪ 0‬باز می گردانند‪ .‬این عملگرها عبارتند از‪:‬‬
‫عملگر‬

‫مفهوم عملگر‬

‫مثال‬

‫<‬

‫بزرگتر )<(‬

‫‪a>b‬‬

‫>‬

‫کوچکتر )>(‬

‫‪a
‫=<‬

‫بزرگتر یا مساوی )≤(‬

‫‪a >= b‬‬

‫=>‬

‫کوچکتر یا مساوی )≥(‬

‫‪a <= b‬‬

‫==‬

‫مساوی )=(‬

‫‪a == b‬‬

‫=!‬

‫نامساوی )≠(‬

‫‪a != b‬‬

‫‪ 7-5-3‬عملگرهای مقایسه ای‬
‫‪‬‬

‫‪‬‬

‫نکته مهمی که باید به آن دقت کرد عملگر مساوی )==( است‪ ،‬چرا که یک‬
‫اشتباه بسیار متداول برنامه نویسان ‪ C‬استفاده اشتباه از عملگر انتساب‬
‫)=( بجای عملگر تساوی )==( است که باعث ایجاد خطا در برنامه می‬
‫شود‪.‬‬
‫اولویت این عملگرها از باال به پایین بشرح زیر است‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫عملگرهای <‪ <= ، > ،‬و =>‬
‫عملگرهای == و =!‬

‫الزم بذکر است که در هنگام مساوی بودن اولویت چند عملگر‪ ،‬این عملگرها‬
‫از چپ به راست محاسبه می گردند‪.‬‬

‫‪ 7-5-4‬عملگرهای منطقی‬
‫‪‬‬

‫این عملگرها به شما اجازه می دهند که شرطهای ساده ای را که با‬
‫استفاده از عملگرهای مقایسه ای ایجاد شده اند را با یکدیگر ترکیب نموده‬
‫و شرطهای پیچیده تری را بسازید‪ .‬این عملگرها عبارتند از ‪:‬‬
‫مثال‬

‫عملگر‬

‫مفهوم عملگر‬

‫نحوه کار‬

‫&&‬

‫‪ AND‬منطقی‬

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

‫‪a>0 && sw==1‬‬

‫||‬

‫‪ OR‬منطقی‬

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

‫‪a<=100 || b!=0‬‬

‫!‬

‫‪ NOT‬منطقی‬

‫اگر عملوند درست باشد‪ ،‬نادرست و‬
‫اگر نادرست باشد‪ ،‬درست برمی‬
‫گرداند‪.‬‬

‫)‪! (a==1 || b<10‬‬

‫‪ 7-5-5‬عملگر شرطی‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫گاهی الزم است که ابتدا یک شرط بررسی شده و سپس برمبنای نتیجه )درست یا نادرست بودن آن( یکی‬
‫از دو عبارت ممکن بازگردانده شود‪ .‬برای اینکار می توان از یک عملگر ‪3‬تایی )با ‪ 3‬عملوند( بنام عملگر‬
‫شرطی استفاده نمود‪.‬‬
‫شکل کلی این عملگر بصورت زیر است‪:‬‬
‫>عبارت‪> :<2‬عبارت‪> ?<1‬شرط<‬
‫نحوه کار بدینصورت است که درصورت درست بودن شرط‪ ،‬عبارت‪ 1‬و در غیراینصورت عبارت ‪ 2‬بازگردانده می‬
‫شود‪.‬‬
‫به عنوان مثال به دستور زیر توجه کنید‪:‬‬
‫که این عبارت معادل دستور زیر است‪:‬‬

‫‪‬‬

‫;‪a = (k<10) ? 100 : 50‬‬
‫;‪if (k<10) a=100‬‬
‫;‪else a=50‬‬

‫البته این عبارت به شکلهای پیچیده نیز می تواند مورد استفاده قرار گیرد‪ .‬مثال ‪:‬‬
‫;‪c += (a>0 && a<10) ? ++a : a/b‬‬
‫که معادل است با ‪:‬‬
‫{ )‪if (a>0 && a<10‬‬
‫;‪a= a + 1‬‬
‫;‪c = c + a‬‬
‫}‬
‫;‪else c = c + a/b‬‬

‫‪ 7-5-6‬اولویت عملگرها‬
‫عملگر‬

‫اولویت‬

‫شرکت پذیری‬

‫‪1‬‬

‫)(‬

‫از چپ به راست‬

‫‪2‬‬

‫‪- + ! -- ++‬‬

‫از راست به چپ‬

‫‪3‬‬

‫‪* / %‬‬

‫از چپ به راست‬

‫‪4‬‬

‫‪+ -‬‬

‫از چپ به راست‬

‫‪5‬‬

‫>> <<‬

‫از چپ به راست‬

‫‪6‬‬

‫>= > <= <‬

‫از چپ به راست‬

‫‪7‬‬

‫=! ==‬

‫از چپ به راست‬

‫‪8‬‬

‫&&‬

‫از چپ به راست‬

‫‪9‬‬

‫||‬

‫از چپ به راست‬

‫‪10‬‬

‫‪?:‬‬

‫از راست به چپ‬

‫‪11‬‬

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

‫از راست به چپ‬

‫‪12‬‬

‫‪,‬‬

‫از چپ به راست‬

‫‪ 7-6‬خواندن و نمایش اطالعات‬
‫‪‬‬

‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫همانطور كه قبال نیز گفته شد‪ ،‬یكی از اهداف زبان ‪ C‬قابل حمل بودن آن‬
‫است‪ .‬بهمین منظور سعی شده است كه از دستوراتی كه ممكن است‬
‫وابسته به ماشین خاصی باشد‪ ،‬اجتناب گردد‪.‬‬
‫بهمین دلیل زبان ‪ C‬برخالف سایر زبانها دارای هیچ دستوری برای‬
‫خواندن از ورودی و یا نوشتن در خروجی نیست‪.‬‬
‫اما در عوض دارای تعدادی تابع )زیربرنامه( استاندارد می باشد كه تقریبا‬
‫تمامی كامپایلرها از آنها حمایت می كنند‪.‬‬
‫این كار به كامپایلر این امكان را می دهد كه بر حسب نوع سخت افزار‬
‫موردنظر‪ ،‬توابع ورودی و خروجی را طراحی نماید‪.‬‬
‫این توابع در یك فایل سرآمد بنام ‪ stdio.h‬تعریف شده اند و بنابراین قبل‬
‫ازاینكه بتوانید از این توابع استفاده نمایید‪ ،‬باید این فایل را نیز با استفاده‬
‫از ‪ #include‬در برنامه خود بگنجانید‪.‬‬

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫برای نمایش اطالعات در خروجی از تابع ‪ printf‬استفاده می شود‪.‬‬
‫این تابع رشته موردنظر شما را به خروجی استاندارد )كه در حالت‬
‫عادی همان صفحه نمایش یا مانیتور است( می فرستد‪ .‬شكل كلی این‬
‫تابع بصورت زیر است‪:‬‬
‫; )>لیست متغیرها< ‪> ,‬رشته كنترلی<(‪printf‬‬
‫رشته كنترلی همان متنی است كه قصد چاپ آن را داریم‪ ،‬با ذكر این‬
‫نكته كه در قسمتهایی كه باید مقدار یك متغیر چاپ شود‪ ،‬از یك‬
‫مشخصه تبدیل استفاده می شود‪ .‬هر مشخصه تبدیل از یك عالمت ‪%‬‬
‫بعالوه یك كاراكتر كه نوع متغیر مورد نظر را نشان می دهد تشكیل می‬
‫گردد‪.‬‬
‫لیست متغیرها نیز همان متغیرهایی هستند كه قصد چاپ آنها را داریم‪.‬‬
‫این متغیرها باید بترتیب قرار گرفته و با كاما )‪ (,‬از یكدیگر جدا شوند‪.‬‬

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫مشخصه تبدیل‬

‫مفهوم‬

‫‪%c‬‬

‫كاراكتر‬

‫‪%d‬‬

‫عدد صحیح در مبنای ‪10‬‬

‫‪%f‬‬

‫عدد اعشاری بدون نماد علمی‬

‫‪%e‬‬

‫عدد اعشاری با نماد علمی‬

‫‪%g‬‬

‫عدد اعشاری با حالت كوتاهتر بین ‪ e‬و ‪f‬‬

‫‪%s‬‬

‫رشته‬

‫‪%ld‬‬

‫عدد صحیح بزرگ‬

‫‪%lf %le %lg‬‬

‫عدد اعشاری بزرگ‬

‫‪%o‬‬

‫عدد صحیح در مبنای ‪8‬‬

‫‪%x‬‬

‫عدد صحیحی در مبنای ‪16‬‬

‫‪%u‬‬

‫عدد صحیح بدون عالمت‬

‫ تابع نمایش در خروجی‬7-6-1
#include
void main() {
int age = 20;
floate average = 18.23;
printf("You are %d years old and your average is %f \n",age,average);
}
You are 20 years old and your average is 18.230000

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫‪‬‬
‫‪‬‬

‫برای کنترل نحوه چاپ اعداد می توانید از مشخصه طول میدان استفاده‬
‫کنید‪.‬‬
‫مشخصه طول میدان برای اعداد به شكل زیر استفاده می شود‪:‬‬
‫‪ ‬برای اعداد صحیح از ‪ %nd‬استفاده می كنیم كه ‪ n‬تعداد ارقام را نشان‬
‫می دهد )مثال ‪ .(%3d‬در اینصورت برای هر متغیر ‪ n‬رقم درنظر گرفته‬
‫می شود‪ .‬اگر اندازه عدد از ‪ n‬كوچكتر باشد‪ ،‬به سمت چپ آن فضای‬
‫خالی اضافه می شود و اگر اندازه عدد بیش از ‪ n‬رقم باشد‪ ،‬طول میدان‬
‫نادیده گرفته شده و عدد بطور كامل چاپ می شود‪.‬‬
‫‪ ‬برای اعداد اعشاری از ‪ %n.mf‬استفاده می كنیم كه ‪ n‬اندازه كل عدد‬
‫)شامل عالمت ممیز( و ‪ m‬تعداد ارقام اعشار است )مثال ‪ .(%5.2f‬در‬
‫صورتیكه تعداد ارقام اعشاری عدد موردنظر از ‪ m‬بیشتر باشد‪ ،‬عدد به ‪m‬‬
‫عدد اعشار گرد می شود و در صورتیكه از ‪ m‬كمتر باشد‪ ،‬در سمت‬
‫راست آن ‪ 0‬قرار داده می شود‪.‬‬

‫‪ 7-6-2‬تابع خواندن از ورودی‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای خواندن اطالعات از ورودی از تابع ‪ scanf‬استفاده می شود‪.‬‬
‫این تابع اطالعات را ازورودی استاندارد )معموال صفحه كلید( خوانده و در‬
‫متغیرهای تعیین شده قرار می دهد‪.‬‬
‫شكل كلی این تابع بصورت زیر است‪:‬‬
‫; )>لیست آدرسهای متغیرها< ‪> ,‬رشته كنترلی<(‪scanf‬‬
‫همانطور كه می بینید نحوه احضار تابع ‪ scanf‬نیز مشابه ‪ printf‬است‪ .‬تنها‬
‫تفاوت در آن است كه در ‪ scanf‬باید لیست آدرسهای متغیرها ارسال شود‪.‬‬
‫مبحث مربوط به آدرسها در فصول بعدی بررسی خواهد شد ولی در حال حاضر‬
‫بخاطر بسپارید كه برای بدست آوردن آدرس یك متغیر از عالمت & استفاده می‬
‫كنیم‪ .‬بعنوان مثال ‪ &age‬بمعنای آدرس متغیر ‪ age‬است‪.‬‬
‫بطور كلی در ‪ C‬قدیمی هرگاه كه یك تابع دارای پارامترهای خروجی بود )یعنی‬
‫پارامترهایی كه یك مقدار را باز می گرداندند( از آدرس متغیرها استفاده می‬
‫شد كه امروزه این مسئله وجود ندارد‪.‬‬

‫ تابع خواندن از ورودی‬7-6-2
#include
void main() {
int age;
float average ;
printf("Please enter your age and average : ");
scanf("%d %f",&age,&average);
printf("You are %d years old and your average is %5.2f \n",age,average);
}

Please enter your age and average : 19 16.72
You are 19 years old and your average is 16.72

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫زبان ‪ C++‬یک زبان شی گرا است‪ ،‬بهمین دلیل در این زبان برای ورودی‬
‫و خروجی از اشیاء بجای توابع استفاده می گردد‪.‬‬
‫از آنجا که امروزه معموال برنامه نویسان ‪ C‬از کامپایلرهای ‪ C++‬استفاده‬
‫می کنند‪ ،‬می توانند از اشیای ورودی و خروجی آن نیز استفاده کنند‪.‬‬
‫اینکار در بین بسیاری از برنامه نویسان ‪ C‬متداول است‪ ،‬بهمین دلیل ما‬
‫در اینجا نحوه کار با اشیای خواندن و نوشتن در ‪ C++‬را بطور مقدماتی‬
‫توضیح می دهیم؛ گرچه توضیح کامل این موارد نیاز به آشنایی با شی‬
‫گرایی و زبان ‪ C++‬دارد‪.‬‬
‫قبل از هرچیز الزم به ذکر است که کلیه اشیای مربوط به ورودی و‬
‫خروجی در فایل سرآمدی بنام ‪ iostream.h‬تعیریف شده اند‪ ،‬بنابراین‬
‫ابتدا باید این فایل به برنامه توسط دستور ‪ #include‬الحاق گردد‪.‬‬

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫زبان ‪ C++‬برای نمایش اطالعات از یک شیئ بنام ‪ cout‬استفاده می نماید‪.‬‬
‫برای ارسال اطالعات مورد نظر برای چاپ به ‪ cout‬باید از عملگر درج در جریان‬
‫یا >> استفاده نماییم‪ .‬بعنوان مثال ‪:‬‬
‫; ” ‪cout >> “Please enter your name:‬‬
‫و یا مثال دیگر ‪:‬‬
‫;‪int a = 10‬‬
‫;‪float b = 2.86‬‬
‫;‪cout << a‬‬
‫;‪cout << b‬‬
‫نکته جالبی که در این مثالها دیده می شود‪ ،‬آنستکه برخالف تابع ‪ printf‬هیچ‬
‫نیازی به مشخص کردن نوع متغیری که قصد چاپ آن را داریم نیست و خود‬
‫شئ ‪ cout‬نوع آن را تشخیص می دهد‪.‬‬
‫عالوه براین می توان چندین عملگر درج در جریان را با یکدیگر الحاق کرد و‬
‫چندین متغیر را با یک دستور چاپ کرد‪.‬‬

C++ ‫ ورودی و خروجی اطالعات در‬7-6-3
#include
void main() {
int age = 20;
floate average = 18.23;
cout >> “You are ” >> age >> “ years old and your average is ” >> average ;
}

You are 20 years old and your average is 18.230000

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای دریافت اطالعات از کاربر‪ ،‬از شئ دیگری بنام ‪ cin‬استفاده می شود‪.‬‬
‫برای ارسال متغیر مورد نظر به ‪ cin‬باید از عملگر استخراج از جریان یا <<‬
‫استفاده نماییم‪ .‬بعنوان مثال‪:‬‬
‫;‪int a‬‬
‫;‪cin >> a‬‬
‫بازهم همانطور که می بینید نیازی به تعیین نوع متغیر موردنظر نیست و خود‬
‫شئ ‪ cin‬نوع متغیر را بطور اتوماتیک تشخیص داده و داده ای از همان نوع را از‬
‫کاربر دریافت و در متغیر مورد نظر قرار می دهد‪.‬‬
‫عملگرهای استخراج از جریان را نیز می توان با یکدیگر الحاق کرد‪.‬‬
‫برای رفتن به خط بعد در شئ ‪ cout‬می توان از دستکاری کننده ‪ endl‬استفاده‬
‫کرد‪ .‬مثال در دستور زیر پس از چاپ پیغام‪ ،‬مکان نما به خط بعد منتقل می‬
‫شود‪:‬‬
‫;‪cout >> “List of students : “ >> endl‬‬
‫البته دستکاری کننده های متعدد دیگری نیز ازجمله موارد مربوط به تعیین طول‬
‫میدان و نحوه چاپ مقادیر وجود دارد که توضیح آنها نیاز به یک مبحث مستقل‬
‫دارد‪.‬‬

C++ ‫ ورودی و خروجی اطالعات در‬7-6-3
#include
void main() {
int age;
float average ;
cout << "Please enter your age and average : " ;
cin >> age >> average ;
cout << "You are " << age << "years old and your average is " << average;
}

Please enter your age and average : 19 16.72
You are 19 years old and your average is 16.72

‫‪ 7-7‬توابع کتابخانه ای‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫همانطور که قبال نیز گفته شد‪ ،‬زبان ‪ C‬از زیر برنامه ها نیز حمایت می کند‪ .‬هر زیر برنامه‬
‫در ‪ C‬یک تابع نامیده می شود‪ .‬تا کنون با توابعی همچون ‪ main‬و یا ‪ printf‬و ‪ scanf‬آشنا‬
‫شده ایم‪.‬‬
‫معموال عرضه کنندگان کامپایلرها و یا سایر فروشندگان نرم افزار‪ ،‬برخی از توابع عمومی‬
‫را که ممکن است مورد نیاز جمع کثیری از برنامه نویسان مختلف باشد را در قالب‬
‫کتابخانه ای از توابع در اختیار برنامه نویسان می گذارند‪ .‬بعضی از این توابع کتابخانه ای‬
‫مانند ‪ printf‬و ‪ scanf‬بصورت استاندارد درآمده و توسط عرضه کنندگان مختلف ارائه می‬
‫شوند‪.‬‬
‫در کامپایلر عرضه شده توسط شرکت بورلند )‪ (Borland C++ 3.1‬نیز کتابخانه های‬
‫متعددی از توابع برای شما عرضه شده اند که بتدریج با آنها و کاربردشان آشنا خواهید‬
‫شد‪.‬‬
‫نکته مهم آنستکه برای استفاده از این توابع ابتدا باید فایل سرآمد مربوط به آنها را نیز در‬
‫ابتدای برنامه خود اضافه نمایید ) با استفاده از ‪ .(#include‬هر فایل سرآمد شامل تعاریف‬
‫اولیه گروهی از توابع مرتبط با هم و داده های مربوط به آنها بوده و در استاندارد قدیمی‬
‫تر دارای پسوند ‪ .h‬می باشد)در استاندارد جدید پسوند این فایلها حذف شده است(‪.‬‬
‫برخی از این فایلهای سرآمد عبارتند از‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪ : stdio.h‬توابع ورودی و خروجی استاندارد‬
‫‪ : math.h‬توابع ریاضی‬
‫‪ : graphics.h‬توابع مربوط به عملیات گرافیکی‬
‫‪ : string.h‬توابع مربوط به کار با رشته ها‬


Slide 39

‫مبانی کامپیوتر و برنامه سازی‬
‫فصل هفتم ‪ :‬مفاهیم اولیه زبان ‪C‬‬
‫مدرس ‪ :‬نگین معروفی‬

‫‪ 7-1‬شناسه ها در ‪C‬‬
‫‪‬‬
‫‪‬‬

‫شناسه )‪ (identifier‬نامی است که به یک قسمت از برنامه مانند متغیر‪ ،‬تابع‪ ،‬ثابت و یا‬
‫‪ ...‬داده می شود‪.‬‬
‫در زبان ‪ C‬برای انتخاب شناسه ها فقط می توان از عالئم زیر استفاده کرد‪:‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫حروف انگلیسی کوچک و بزرگ )‪(A…Z a…z‬‬
‫ارقام )‪(0…9‬‬
‫عالمت خط پایین یا _‬

‫البته یک شناسه نمی تواند با یک رقم شروع شود‪.‬‬
‫چند شناسه مجاز‪ name2 ، average ، sum :‬و ‪student_average‬‬
‫چند شناسه غیرمجاز ‪ 2name‬و یا ‪student average‬‬
‫در برنامه نویسی امروزی پیشنهاد می شود بجای شناسه هایی همانند‬
‫‪ student_average‬از ‪ studentAverage‬استفاده گردد‪.‬‬
‫نکته مهم دیگری که باید به آن اشاره کرد آنستکه زبان ‪ C‬برخالف بسیاری از زبانهای دیگر‬
‫به کوچک و بزرگی حروف حساس است )‪ .(case sensitive‬در نتیجه شناسه های زیر با‬
‫یکدیگر متفاوتند ‪:‬‬
‫‪Sum ≠ sum ≠ SUM‬‬
‫آخرین نکته اینستکه در هنگام انتخاب شناسه نمی توانید از کلمات کلیدی که برای‬
‫منظورهای خاص در زبان ‪ C‬رزرو شده اند استفاده کنید‪.‬‬

C ‫ شناسه ها در‬7-1
: C ‫کلمات کلیدی در زبان‬
auto

break

case

char

const

continue

default

do

double

else

enum

extern

float

for

goto

if

int

long

register

return

short

signed

sizeof

static

struct

switch

typedef

union

unsigned

void

volatile

while

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫محدوده‬

‫اندازه )بیت(‬

‫توضیح‬

‫نوع داده‬

‫‪-128 to +127‬‬

‫‪8‬‬

‫کاراکتر‬

‫‪char‬‬

‫‪-32768 to +32767‬‬

‫‪16‬‬

‫عدد صحیح‬

‫‪int‬‬

‫‪3.4e-38 to 3.4e+38‬‬

‫‪32‬‬

‫عدد اعشاری‬

‫‪float‬‬

‫‪1.7e-308 to 1.7e+308‬‬

‫‪64‬‬

‫عدد اعشاری با‬
‫دقت مضاعف‬

‫‪double‬‬

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫‪‬‬

‫البته چند نکته مهم درمورد این جدول قابل ذکر است ‪:‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫اندازه ‪ int‬در محیطهای ‪ 16‬بیتی مانند ‪ DOS‬برابر ‪ 16‬بیت است‪ .‬اما در‬
‫محیطهای ‪ 32‬بیتی همانند ‪ Windows‬اندازه آن ‪ 32‬بیت می باشد که در‬
‫اینصورت محدوده ای برابر ‪ -2,147,483,648‬تا ‪ +2,147,483,647‬را‬
‫پوشش می دهد‪.‬‬
‫در بعضی از کامپایلرهای ‪ ،C‬نوع داده ‪ bool‬نیز وجود دارد که می تواند‬
‫یکی از مقادیر ‪)true‬درست( یا ‪) false‬غلط( را نشان دهد ‪ .‬اما در نسخه‬
‫های اولیه ‪ C‬از همان نوع داده صحیح یا ‪ int‬برای اینکار استفاده می‬
‫شد‪ .‬بدین صورت که ‪ 0‬نشاندهنده ‪ false‬و هر عدد غیر صفر )معموال ‪(1‬‬
‫نشاندهنده ‪ true‬است‪.‬‬
‫از آنجا که برای ذخیره سازی کاراکترها کد اسکی آنها ذخیره می گردد‪،‬‬
‫از یک متغیر کاراکتری یا ‪ char‬می توان بعنوان یک عدد صحیح کوچک نیز‬
‫استفاده کرد و اعمال ریاضی برروی آنها نیز مجاز است‪.‬‬

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫عالوه براین چندین اصالح کننده نیز وجود دارد که به ما اجازه می دهد نوع داده مورد‬
‫نظر را با دقت بیشتری برای نیازهای مختلف استفاده نماییم‪.‬‬
‫این اصالح کننده ها عبارتند از ‪short, long, signed, unsigned :‬‬
‫تمام این اصالح کننده ها می توانند به نوع داده ‪ int‬اعمال شوند و اثر آنها بستگی‬
‫به محیط دارد‪.‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫در یک محیط ‪16‬بیتی‪short int ،‬بازهم برابر ‪16‬بیت است ولی ‪ long int‬برابر‪32‬بیت می‬
‫باشد‪.‬‬
‫‪ unsigned int‬باعث می شود که یک عدد ‪ 16‬بیتی بدون عالمت داشته باشیم که بازه‬
‫بین ‪ 0‬تا ‪ 65535‬را پوشش می دهد‪ signed int .‬نیز همانند ‪ int‬معمولی بوده و تفاوتی‬
‫ندارد‪.‬‬
‫ترکیب این اصالح کننده ها نیز ممکن است‪ .‬مثال ‪ unsigned long int‬یک عدد ‪ 32‬بیتی‬
‫بدون عالمت است که بازه ‪ 0‬تا ‪ 4,294,967,295‬را پوشش می دهد‪.‬‬

‫برروی نوع داده ‪ char‬فقط اصالح کننده های ‪ signed‬و ‪ unsigned‬را می توان اعمال‬
‫کرد‪ .‬معموال از اصالح کننده ‪ unsigned‬وقتی استفاده می شود که قصد داشته‬
‫باشیم از ‪ char‬بعنوان یک عدد صحیح مثبت بین ‪ 0‬تا ‪ 255‬استفاده کنیم‪.‬‬
‫برروی نوع داده ‪ double‬تنها اصالح کننده ‪ long‬قابل اعمال است و دراینصورت عدد‬
‫اعشاری با ‪ 80‬بیت را خواهیم داشت که قادر است هر عددی در بازه ‪ 3.4e-4932‬تا‬
‫‪ 1.1e+4932‬را در خود نگاه دارد‪.‬‬

‫‪ 7-3‬تعریف متغیرها‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای تعریف متغیرها به شکل زیر عمل می کنیم‪:‬‬

‫;>‪ ‫که ‪ type‬یکی از نوع داده های گفته شده و ‪ variable-list‬لیستی از متغیرها است‬
‫که با کاما از یکدیگر جدا شده اند‪ .‬بعنوان مثال ‪:‬‬
‫;‪int sum‬‬
‫;‪float average‬‬
‫; ‪long int a, b, c‬‬
‫; ‪unsigned long int i, j, k‬‬
‫عالوه براین می توان در هنگام تعریف متغیر به آن مقدار اولیه نیز داد‪ .‬مثال ‪:‬‬
‫; ‪int d = 0‬‬
‫نكته مهم آنكه زبان ‪ C‬به متغیرها مقدار اولیه نمي دهد )حتي ‪ (0‬و برنامه نويس‬
‫خود بايد اينكار را صريحا انجام دهد‪ ،‬درغیر اينصورت مقدار اولیه متغیر‪ ،‬نامعین خواهد‬
‫بود‪.‬‬
‫تعریف متغیرها طبق اصول زبان ‪ C‬میتواند درهرجایی از برنامه صورت پذیرد‪ ،‬و‬
‫متغیرهای تعریف شده از همان خط به بعد قابل استفاده خواهد بود‪ .‬اما معموال‬
‫توصیه می گردد كه تعریف متغیرها در همان خط ابتدایی تابع و بالفاصله پس از {‬
‫صورت پذیرد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫‪‬‬
‫‪‬‬

‫ثابتها مقادیر ثابتی هستند كه مقدار آنها در حین اجرای برنامه تغییر نمی یابد‪ .‬ثابتها می توانند از‬
‫هریك از نوع داده های اصلی باشند‪.‬‬
‫ثوابت عددی صحیح ‪:‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫برای نمایش این دسته از ثوابت‪ ،‬از دنباله ای از ارقام بعالوه عالمت ‪ +‬یا ‪ -‬استفاده می كنیم‪ .‬بعنوان مثال‬
‫‪ -45‬و یا ‪ 3489‬ثوابت صحیح هستند‪.‬‬
‫در حالت عادی ‪ C‬هر عدد را در كوچكترین نوع داده ای كه می تواند قرار می دهد‪ .‬مثال عدد ‪ 85‬در یك‬
‫‪ int‬قرار می گیرد‪ ،‬اما عدد ‪ 145398‬در یك ‪ long int‬قرار خواهد گرفت‪.‬‬
‫اگر قصد دارید یك عدد كوچك بعنوان ‪ long‬محسوب گردد‪ ،‬می توانید از پسوند ‪ L‬در انتهای آن استفاده‬
‫می كنیم‪ .‬مثال ‪245L‬یك عدد ‪ long‬محسوب می شود‪.‬‬
‫;‪long int a = 20L‬‬
‫پسوند ‪ U‬در انتهای عدد نیز نشانه بدون عالمت بودن آن است‪.‬‬
‫نكته دیگر آنكه ‪ C‬به شما اجازه می دهد درصورت لزوم ثوابت صحیح خود را در مبنای ‪ 8‬یا ‪ 16‬نیز كه‬
‫از مبناهای متداول در برنامه نویسی هستند‪ ،‬بنویسید‪.‬‬
‫‪‬‬
‫‪‬‬

‫برای نوشتن عدد در مبنای ‪ 8‬باید آن را با ‪ 0‬آغاز كنید‪ ،‬مثال ‪ 0342‬یك عدد در منای ‪ 8‬محسوب می‬
‫گردد‪.‬‬
‫برای نوشتن یك عدد در مبنای ‪ 16‬باید آن را با ‪ 0x‬آغاز نمایید‪ ،‬مانند ‪.0x27A4‬‬

‫‪ 7-4‬ثوابت‬
‫ثوابت عددی اعشاری‬

‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫برای نمایش اعداد اعشاری‪ ،‬باید از نقطه اعشار استفاده كنیم‪ ،‬مانند ‪237.45‬‬
‫اما نكته جالب آنستكه می توانید از نماد علمی نیز برای نمایش اعداد‬
‫اعشاری استفاده كنید‪ .‬برای اینكار كافی است از حرف ‪ e‬برای نمایش قسمت‬
‫توان استفاده نمایید‪ .‬بعنوان مثال ‪:‬‬
‫‪-23.47 × 10 5 = -23.47e5‬‬
‫‪42.389 × 10 -3 = 42.389e-3‬‬
‫دقت كنید كه قسمت توان‪ ،‬حتما یك عدد صحیح است‪.‬‬
‫نكته جالب اینجاست كه برخالف مورد قبل‪ ،‬كامپایلر بطور پیش فرض داده های‬
‫اعشاری را از نوع ‪ double‬فرض می كند‪.‬چنانچه دوست دارید ثابت شما ازنوع‬
‫‪ float‬درنظر گرفته شود‪ ،‬در انتهای آن ‪ F‬قرار دهید‪ .‬ضمنا پسوند ‪ L‬نیز داده‬
‫اعشاری را از نوع ‪ long double‬درنظر می گیرد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫ثوابت كاراكتری ‪:‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫برای نشان دادن ثوابت كاراكتری‪ ،‬آنها را در داخل ' قرار می دهیم‪ .‬بعنوان مثال‬
‫'‪'A‬یك ثابت كاراكتری است‪.‬‬
‫; '‪char ch = 'S‬‬
‫دقت كنید كه همانطور كه قبال گفته شد‪ ،‬كد اسكی كاراكترها در متغیر ذخیره‬
‫می گردد‪ ،‬بنابراین می توان از آن بعنوان یك عدد صحیح نیز استفاده كرد‪ .‬نكته‬
‫مهم دیگر آنستكه به تفاوت عدد ‪ 5‬و كاراكتر '‪ '5‬دقت داشته باشید‪ .‬در حقیقت‬
‫'‪ '5‬برابر است با عدد ‪ 53‬كه همان كد اسكی آن است‪.‬‬
‫روش فوق‪ ،‬برای نمایش کاراکترهای قابل چاپ مناسب است‪ ،‬اما بعضی‬
‫كاراكترها مانند ‪ enter‬قابل نمایش نبوده و برای آنها شکل خاصی وجود ندارد‪.‬‬
‫در چنین مواردی‪ ،‬زبان ‪ C‬از ترکیب عالمت \ به همراه یک کاراکتر دیگر‪ ،‬برای‬
‫نمایش این قبیل کاراکترها استفاده می نماید‪ .‬بعنوان مثال‪ ،‬کاراکتر '‪ '\n‬نشان‬
‫دهنده خط جدید یا همان ‪ enter‬می باشد‪.‬‬
‫جدول صفحه بعد این قبیل کاراکترها و معادل آنها را نشان می دهد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫نحوه نمایش در ‪C‬‬

‫کد اسکی‬

‫صدای بوق کامپیوتر‬

‫‪\a‬‬

‫‪7‬‬

‫حرکت به عقب ‪backspace‬‬

‫‪\b‬‬

‫‪8‬‬

‫شروع صفحه ‪form feed‬‬

‫‪\f‬‬

‫‪12‬‬

‫سطر جدید ‪line feed‬‬

‫‪\n‬‬

‫‪10‬‬

‫برگشت به ابتداي سطر ‪carriage return‬‬

‫‪\r‬‬

‫‪13‬‬

‫فاصله افقی ‪horizontal tab‬‬

‫‪\t‬‬

‫‪9‬‬

‫فاصله عمودی ‪vertical tab‬‬

‫‪\v‬‬

‫‪11‬‬

‫عالمت سوال‬

‫?\‬

‫‪63‬‬

‫عالمت '‬

‫'\‬

‫‪39‬‬

‫عالمت "‬

‫"\‬

‫‪34‬‬

‫عالمت \‬

‫\\‬

‫‪92‬‬

‫عالمت تهی‬

‫‪\0‬‬

‫‪0‬‬

‫نام کاراکتر‬

‫کد اسکی یک کاراکتر با ‪ 3‬رقم در مبنای ‪8‬‬

‫‪\000‬‬

‫کد اسکی یک کاراکتر با ‪ 2‬رقم در مبنای ‪16‬‬

‫‪\x00‬‬

‫‪ 7-4‬ثوابت‬
‫‪‬‬

‫ثوابت رشته ای ‪ C :‬عالوه بر ثوابت فوق‪ ،‬از یك ثابت دیگر بنام رشته نیز‬
‫حمایت می كند‪ .‬رشته‪ ،‬دنباله ای از كاراكترها است كه در داخل " قرار‬
‫می گیرند‪ .‬بعنوان مثال "‪ "this is a test‬یك رشته است‪ .‬دقت كنید كه '‪'a‬‬
‫یك كاراكتر است‪ ،‬اما "‪ "a‬یك رشته است كه فقط شامل یك كاراكتر می‬
‫باشد‪.‬‬

‫‪ 7-5‬عملگرها‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫عملگر‪ ،‬نمادی است كه به كامپایلر می گوید تا عملیات محاسباتی یا‬
‫منطقی خاصی را برروی یك یا چند عملوند‪ ،‬انجام دهد‪.‬‬
‫به عملگرهایی كه فقط یك عملوند دارند‪ ،‬عملگر یكانی می گوییم و‬
‫همواره عملگر در سمت چپ عملوند قرار می گیرد)مانند عدد ‪.(-125‬‬
‫اما عملگرهایی كه برروی دو عملوند اثر می كنند را عملگر دودویی‬
‫نامیده و عملگر را بین دو عملوند قرار می دهیم )مانند ‪.(23+86‬‬
‫هر ترکیب درستی از عملگرها و عملوندها را یک عبارت می نامیم‪.‬‬
‫‪ C‬از نقطه نظر عملگرها یك زبان بسیار قوی است‪ .‬این عملگرها به چند‬
‫دسته اصلی تقسیم می گردند كه آنها را به ترتیب بررسی می كنیم‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫این عملگرها‪ ،‬همان اعمال متداول ریاضی هستند كه در زبان ‪ C‬مورد استفاده‬
‫قرار می گیرند‪ .‬این اعمال عبارتند از ‪:‬‬

‫عمل‬

‫نوع‬

‫عملگر‬

‫منفی كردن عملوند سمت راست‬

‫یكانی‬

‫‪-‬‬

‫جمع دو عملوند‬

‫دودویی‬

‫‪+‬‬

‫تفریق دو عملوند‬

‫دودویی‬

‫‪-‬‬

‫ضرب دو عملوند‬

‫دودویی‬

‫*‬

‫تقسیم دو عملوند‬

‫دودویی‬

‫‪/‬‬

‫محاسبه باقیمانده تقسیم دو عملوند‬

‫دودویی‬

‫‪%‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬
‫‪‬‬

‫این عملگرهای برروی همه انواع داده های ‪ C‬عمل می كنند‪ ،‬بجز عملگر ‪ %‬كه فقط‬
‫برروی نوع داده های صحیح عمل می كند‪.‬‬
‫اما نكته مهمی كه باید به آن اشاره كرد‪ ،‬نحوه كار عملگر تقسیم برروی نوع داده های‬
‫مختلف است‪.‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫درصورتیكه هردو عملوند صحیح باشند‪ ،‬تقسیم بصورت صحیح بر صحیح انجام خواهد شد‪.‬‬
‫اگر یكی یا هر دو عملوند اعشاری باشند‪ ،‬تقسیم بصورت اعشاری انجام خواهد پذیرفت‪.‬‬
‫فرض كنید تعاریف زیر را داریم ‪:‬‬
‫; ‪int a,b‬‬
‫; ‪float c,d‬‬
‫; ‪a = 10 ; b = 4‬‬
‫;‪c = 8.2; d = 4.0‬‬
‫اكنون به نتایج عملیات زیر دقت كنید ‪:‬‬
‫‪a / b => 2‬‬
‫‪c / d => 2.05‬‬
‫‪a / d => 2.5‬‬
‫‪a / 4 => 2‬‬
‫چنانچه به آخرین مورد توجه كنید‪ ،‬متوجه می شوید كه از آنجا كه ‪a‬یك متغیر صحیح است و ‪4‬‬
‫نیز یك ثابت صحیح در نظر گرفته شده‪ ،‬درنتیجه تقسیم بصورت صحیح بر صحیح انجام گرفته‬
‫است‪ .‬چنانچه بخواهیم تقسیم بصورت اعشاری صورت پذیرد‪ ،‬به دو شكل می توانیم عمل‬
‫كنیم‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫برای اینکه عبارت تقسیم صفحه قبل بصورت اعشاری انجام شود‪ ،‬به دو روش‬
‫می توان عمل کرد‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫این عبارت را بصورت ‪ a / 4.0‬بنویسیم‪.‬‬
‫از عملگر قالب ریزی استفاده كنیم‪.‬‬

‫عملگر قالب ریزی می تواند یك نوع را به نوع دیگری تبدیل نماید‪ .‬شكل كلی آن‬
‫به شكل زیر است ‪:‬‬
‫>‪() ‫كه ‪ type‬نوع مورد نظر است كه قصد تبدیل عبارت ‪ expression‬به آن نوع را‬
‫داریم‪ .‬بعنوان مثال در مورد قبلی می توان به شكل زیر عمل كرد ‪:‬‬
‫‪(float) a / 4‬‬
‫در این حالت از كامپایلر خواسته ایم كه ابتدا عدد ‪ a‬را به اعشاری تبدیل كند‬
‫)البته بصورت موقت( و سپس آن را بر ‪ 4‬تقسیم نماید‪ ،‬كه مسلما حاصل‬
‫اعشاری خواهد بود‪.‬‬
‫بطوركلی هرگاه ثابتها و متغیرهایی از انواع مختلف در یك عبارت محاسباتی‬
‫داشته باشیم‪ ،‬كامپایلر ‪ C‬همه آنها را به یك نوع یكسان كه همان بزرگترین‬
‫عملوند موجود است تبدیل خواهد كرد‪ .‬بعنوان مثال به مورد صفحه بعد دقت‬
‫كنید ‪:‬‬

‫ عملگرهای محاسباتی‬7-5-1
char ch;
int i;

float f;
double d;
result = (ch / i)
int

+

(f *d)

(f+i)
float

double

double

int

-

double

double

float

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫اولویت عملگرها ‪ :‬در عبارتی که شامل چندین عملگر است‪ ،‬کدامیک در‬
‫ابتدا اعمال خواهد گردید‪.‬‬
‫اولویت عملگرهای محاسباتی از باال به پایین بشرح زیر است‪:‬‬
‫‪ ‬عملگر یکانی –‬
‫‪ ‬عملگرهای * و ‪ /‬و ‪%‬‬
‫‪ ‬عملگرهای ‪ +‬و –‬
‫چنانچه اولویت دو عملگر یکسان باشد‪ ،‬این عملگرها از چپ به راست‬
‫محاسبه خواهند شد‪.‬‬
‫چنانچه بخواهیم یک عمل با اولویت پایین زودتر انجام شود‪ ،‬باید از پرانتز‬
‫استفاده کنیم‪ .‬بنابراین اولویت عملگر پرانتز از همه موارد فوق‬
‫بیشتراست‪ .‬در مورد پرانتزهای متداخل‪ ،‬ابتدا پرانتز داخلی محاسبه‬
‫می شود؛ اما در مورد پرانتزهای هم سطح‪ ،‬ابتدا پرانتز سمت چپتر‬
‫محاسبه می گردد‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫چند مثال در مورد اولویت عملگرها‬

‫ترتیب اجرای عملگرها‬

‫عبارت زبان ‪C‬‬

‫ابتدا عمل * و سپس عمل ‪+‬‬

‫‪b+c*d‬‬

‫ابتدا عمل ‪ +‬و سپس عمل *‬

‫‪(b + c) * d‬‬

‫ابتدا عمل ‪ /‬سپس عمل * و در انتها عمل ‪+‬‬

‫‪b+c/d*e‬‬

‫ابتدا عمل * سپس عمل ‪ /‬و در انتها عمل ‪+‬‬

‫)‪b + c / (d * e‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫یک مثال کامل در مورد اولویت عملگرها‬

‫‪result = a + b * (f – (g + b) / d) – c * (a – d) / e‬‬
‫‪6‬‬

‫‪1‬‬
‫‪7‬‬

‫‪2‬‬

‫‪8‬‬

‫‪3‬‬
‫‪4‬‬
‫‪5‬‬
‫‪9‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫در زبان ‪ C‬برای انتساب چندین عملگر وجود دارد‪ .‬ساده ترین عملگر انتساب‪ ،‬همان عملگر =‬
‫است که در بسیاری از زبانها استفاده می شود‪ .‬بعنوان مثال ‪:‬‬
‫;‪a = 5‬‬
‫;‪b = c + 2 * d‬‬
‫این عملگر باعث می شود که عبارت سمت راست در عبارت سمت چپ قرار گیرد‪.‬‬
‫توجه کنید که مقدار سمت چپ باید عبارتی باشد که بتوان به آن یک مقدار را نسبت داد‬
‫)مانند یک متغیر( که به آن ‪ Lvalue‬گفته می شود‪ ،‬بنابراین یک ثابت نمی تواند در سمت چپ‬
‫قرار گیرد‪.‬‬
‫نکته دیگر اینکه اولویت عملگر = از عملگرهای ریاضی کمتر است و درنتیجه ابتدا آن عملیات‬
‫انجام شده و در پایان حاصل در عبارت سمت چپ ریخته می شود‪.‬‬
‫الزم به ذکر است که در هنگام انتساب‪ ،‬درصورت لزوم نوع عبارت سمت راست به نوع عبارت‬
‫سمت چپ تبدیل می شود‪ .‬مثال‪:‬‬
‫;‪int a‬‬
‫;‪a = 2.5 * 5.0‬‬
‫که دراینصورت عدد ‪ 12‬در ‪ a‬ذخیره خواهد شد‪.‬‬
‫شرکت پذیری این عملگر از راست به چپ می باشد‪ ،‬بدین معنا که چنانچه چندین عملگر‬
‫نسبت دهی داشته باشیم‪ ،‬این عملگرها از راست به چپ محاسبه می شوند‪ .‬مثال پس از‬
‫اجرای دستور زیر‪ ،‬مقدار هر ‪ 3‬متغیر برابر ‪ 10‬خواهد شد‪.‬‬
‫;‪a = b = c = 10‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬

‫نکته جالب درمورد زبان ‪ C‬آنستکه دارای یک سری عملگرهای انتساب‬
‫خالصه شده است که باعث می شوند در بعضی موارد بتوانیم عبارات‬
‫کوتاهتری را بنویسیم‪ .‬این عملگرها عبارتند از ‪:‬‬
‫عملگرد‬

‫مثال‬

‫عبارت انتساب معادل‬

‫‪++‬‬

‫;‪a ++‬‬

‫;‪a = a + 1‬‬

‫‪--‬‬

‫;‪a --‬‬

‫;‪a = a – 1‬‬

‫=‪+‬‬

‫;‪a += 5‬‬

‫;‪a = a + 5‬‬

‫=‪-‬‬

‫;‪a -= 8‬‬

‫;‪a= a – 8‬‬

‫=*‬

‫;‪a *= 10‬‬

‫;‪a= a * 10‬‬

‫=‪/‬‬

‫;‪a /= 2‬‬

‫;‪a = a / 2‬‬

‫=‪%‬‬

‫;‪a %= 10‬‬

‫;‪a = a % 10‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬
‫‪‬‬

‫عملگر اول و دوم‪ ،‬عملگرهای یکانی هستند که بترتیب عملگر افزایش و عملگر کاهش‬
‫نامیده می شوند‪.‬‬
‫نکته جالب آنستکه این دو عملگر به دوصورت مورد استفاده قرار می گیرند‪.‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫در حالتی که از دستور ;‪ a ++‬استفاده شود به آن پس افزایش می گویند و بدین معناست که‬
‫ابتدا از مقدار فعلی ‪ a‬در عبارت موردنظر استفاده کن و سپس آن را افزایش بده‪.‬‬
‫اما دستور ;‪ ++ a‬که به آن پیش افزایش گفته می شود‪ ،‬ابتدا ‪ a‬را افزایش داده و سپس از آن‬
‫در عبارت استفاده می کند‪.‬‬
‫به برنامه زیر دقت کنید‪:‬‬

‫>‪#include ‫{ )(‪void main‬‬
‫; ‪int a ,b‬‬
‫;‪a=5‬‬
‫;‪b = a ++‬‬
‫;)‪printf(“a=%d and b=%d \n”,a,b‬‬
‫;‪a=5‬‬
‫;‪b = ++ a‬‬
‫;)‪printf(“a=%d and b=%d \n”,a,b‬‬
‫}‬
‫‪a=6 b=5‬‬
‫‪a=6 b=6‬‬

‫‪ 7-5-3‬عملگرهای مقایسه ای‬
‫‪‬‬

‫‪‬‬

‫این عملگرها دو عبارت را بایکدیگر مقایسه کرده و نتیجه را باز می گردانند‪.‬‬
‫نتیجه می تواند درست )‪ (true‬یا غلط )‪ (false‬باشد‪.‬‬
‫نتیجه این عملگرها یک عدد صحیح است که درصورت درست بودن ‪ 1‬و‬
‫درصورت غلط بودن ‪ 0‬باز می گردانند‪ .‬این عملگرها عبارتند از‪:‬‬
‫عملگر‬

‫مفهوم عملگر‬

‫مثال‬

‫<‬

‫بزرگتر )<(‬

‫‪a>b‬‬

‫>‬

‫کوچکتر )>(‬

‫‪a
‫=<‬

‫بزرگتر یا مساوی )≤(‬

‫‪a >= b‬‬

‫=>‬

‫کوچکتر یا مساوی )≥(‬

‫‪a <= b‬‬

‫==‬

‫مساوی )=(‬

‫‪a == b‬‬

‫=!‬

‫نامساوی )≠(‬

‫‪a != b‬‬

‫‪ 7-5-3‬عملگرهای مقایسه ای‬
‫‪‬‬

‫‪‬‬

‫نکته مهمی که باید به آن دقت کرد عملگر مساوی )==( است‪ ،‬چرا که یک‬
‫اشتباه بسیار متداول برنامه نویسان ‪ C‬استفاده اشتباه از عملگر انتساب‬
‫)=( بجای عملگر تساوی )==( است که باعث ایجاد خطا در برنامه می‬
‫شود‪.‬‬
‫اولویت این عملگرها از باال به پایین بشرح زیر است‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫عملگرهای <‪ <= ، > ،‬و =>‬
‫عملگرهای == و =!‬

‫الزم بذکر است که در هنگام مساوی بودن اولویت چند عملگر‪ ،‬این عملگرها‬
‫از چپ به راست محاسبه می گردند‪.‬‬

‫‪ 7-5-4‬عملگرهای منطقی‬
‫‪‬‬

‫این عملگرها به شما اجازه می دهند که شرطهای ساده ای را که با‬
‫استفاده از عملگرهای مقایسه ای ایجاد شده اند را با یکدیگر ترکیب نموده‬
‫و شرطهای پیچیده تری را بسازید‪ .‬این عملگرها عبارتند از ‪:‬‬
‫مثال‬

‫عملگر‬

‫مفهوم عملگر‬

‫نحوه کار‬

‫&&‬

‫‪ AND‬منطقی‬

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

‫‪a>0 && sw==1‬‬

‫||‬

‫‪ OR‬منطقی‬

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

‫‪a<=100 || b!=0‬‬

‫!‬

‫‪ NOT‬منطقی‬

‫اگر عملوند درست باشد‪ ،‬نادرست و‬
‫اگر نادرست باشد‪ ،‬درست برمی‬
‫گرداند‪.‬‬

‫)‪! (a==1 || b<10‬‬

‫‪ 7-5-5‬عملگر شرطی‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫گاهی الزم است که ابتدا یک شرط بررسی شده و سپس برمبنای نتیجه )درست یا نادرست بودن آن( یکی‬
‫از دو عبارت ممکن بازگردانده شود‪ .‬برای اینکار می توان از یک عملگر ‪3‬تایی )با ‪ 3‬عملوند( بنام عملگر‬
‫شرطی استفاده نمود‪.‬‬
‫شکل کلی این عملگر بصورت زیر است‪:‬‬
‫>عبارت‪> :<2‬عبارت‪> ?<1‬شرط<‬
‫نحوه کار بدینصورت است که درصورت درست بودن شرط‪ ،‬عبارت‪ 1‬و در غیراینصورت عبارت ‪ 2‬بازگردانده می‬
‫شود‪.‬‬
‫به عنوان مثال به دستور زیر توجه کنید‪:‬‬
‫که این عبارت معادل دستور زیر است‪:‬‬

‫‪‬‬

‫;‪a = (k<10) ? 100 : 50‬‬
‫;‪if (k<10) a=100‬‬
‫;‪else a=50‬‬

‫البته این عبارت به شکلهای پیچیده نیز می تواند مورد استفاده قرار گیرد‪ .‬مثال ‪:‬‬
‫;‪c += (a>0 && a<10) ? ++a : a/b‬‬
‫که معادل است با ‪:‬‬
‫{ )‪if (a>0 && a<10‬‬
‫;‪a= a + 1‬‬
‫;‪c = c + a‬‬
‫}‬
‫;‪else c = c + a/b‬‬

‫‪ 7-5-6‬اولویت عملگرها‬
‫عملگر‬

‫اولویت‬

‫شرکت پذیری‬

‫‪1‬‬

‫)(‬

‫از چپ به راست‬

‫‪2‬‬

‫‪- + ! -- ++‬‬

‫از راست به چپ‬

‫‪3‬‬

‫‪* / %‬‬

‫از چپ به راست‬

‫‪4‬‬

‫‪+ -‬‬

‫از چپ به راست‬

‫‪5‬‬

‫>> <<‬

‫از چپ به راست‬

‫‪6‬‬

‫>= > <= <‬

‫از چپ به راست‬

‫‪7‬‬

‫=! ==‬

‫از چپ به راست‬

‫‪8‬‬

‫&&‬

‫از چپ به راست‬

‫‪9‬‬

‫||‬

‫از چپ به راست‬

‫‪10‬‬

‫‪?:‬‬

‫از راست به چپ‬

‫‪11‬‬

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

‫از راست به چپ‬

‫‪12‬‬

‫‪,‬‬

‫از چپ به راست‬

‫‪ 7-6‬خواندن و نمایش اطالعات‬
‫‪‬‬

‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫همانطور كه قبال نیز گفته شد‪ ،‬یكی از اهداف زبان ‪ C‬قابل حمل بودن آن‬
‫است‪ .‬بهمین منظور سعی شده است كه از دستوراتی كه ممكن است‬
‫وابسته به ماشین خاصی باشد‪ ،‬اجتناب گردد‪.‬‬
‫بهمین دلیل زبان ‪ C‬برخالف سایر زبانها دارای هیچ دستوری برای‬
‫خواندن از ورودی و یا نوشتن در خروجی نیست‪.‬‬
‫اما در عوض دارای تعدادی تابع )زیربرنامه( استاندارد می باشد كه تقریبا‬
‫تمامی كامپایلرها از آنها حمایت می كنند‪.‬‬
‫این كار به كامپایلر این امكان را می دهد كه بر حسب نوع سخت افزار‬
‫موردنظر‪ ،‬توابع ورودی و خروجی را طراحی نماید‪.‬‬
‫این توابع در یك فایل سرآمد بنام ‪ stdio.h‬تعریف شده اند و بنابراین قبل‬
‫ازاینكه بتوانید از این توابع استفاده نمایید‪ ،‬باید این فایل را نیز با استفاده‬
‫از ‪ #include‬در برنامه خود بگنجانید‪.‬‬

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫برای نمایش اطالعات در خروجی از تابع ‪ printf‬استفاده می شود‪.‬‬
‫این تابع رشته موردنظر شما را به خروجی استاندارد )كه در حالت‬
‫عادی همان صفحه نمایش یا مانیتور است( می فرستد‪ .‬شكل كلی این‬
‫تابع بصورت زیر است‪:‬‬
‫; )>لیست متغیرها< ‪> ,‬رشته كنترلی<(‪printf‬‬
‫رشته كنترلی همان متنی است كه قصد چاپ آن را داریم‪ ،‬با ذكر این‬
‫نكته كه در قسمتهایی كه باید مقدار یك متغیر چاپ شود‪ ،‬از یك‬
‫مشخصه تبدیل استفاده می شود‪ .‬هر مشخصه تبدیل از یك عالمت ‪%‬‬
‫بعالوه یك كاراكتر كه نوع متغیر مورد نظر را نشان می دهد تشكیل می‬
‫گردد‪.‬‬
‫لیست متغیرها نیز همان متغیرهایی هستند كه قصد چاپ آنها را داریم‪.‬‬
‫این متغیرها باید بترتیب قرار گرفته و با كاما )‪ (,‬از یكدیگر جدا شوند‪.‬‬

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫مشخصه تبدیل‬

‫مفهوم‬

‫‪%c‬‬

‫كاراكتر‬

‫‪%d‬‬

‫عدد صحیح در مبنای ‪10‬‬

‫‪%f‬‬

‫عدد اعشاری بدون نماد علمی‬

‫‪%e‬‬

‫عدد اعشاری با نماد علمی‬

‫‪%g‬‬

‫عدد اعشاری با حالت كوتاهتر بین ‪ e‬و ‪f‬‬

‫‪%s‬‬

‫رشته‬

‫‪%ld‬‬

‫عدد صحیح بزرگ‬

‫‪%lf %le %lg‬‬

‫عدد اعشاری بزرگ‬

‫‪%o‬‬

‫عدد صحیح در مبنای ‪8‬‬

‫‪%x‬‬

‫عدد صحیحی در مبنای ‪16‬‬

‫‪%u‬‬

‫عدد صحیح بدون عالمت‬

‫ تابع نمایش در خروجی‬7-6-1
#include
void main() {
int age = 20;
floate average = 18.23;
printf("You are %d years old and your average is %f \n",age,average);
}
You are 20 years old and your average is 18.230000

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫‪‬‬
‫‪‬‬

‫برای کنترل نحوه چاپ اعداد می توانید از مشخصه طول میدان استفاده‬
‫کنید‪.‬‬
‫مشخصه طول میدان برای اعداد به شكل زیر استفاده می شود‪:‬‬
‫‪ ‬برای اعداد صحیح از ‪ %nd‬استفاده می كنیم كه ‪ n‬تعداد ارقام را نشان‬
‫می دهد )مثال ‪ .(%3d‬در اینصورت برای هر متغیر ‪ n‬رقم درنظر گرفته‬
‫می شود‪ .‬اگر اندازه عدد از ‪ n‬كوچكتر باشد‪ ،‬به سمت چپ آن فضای‬
‫خالی اضافه می شود و اگر اندازه عدد بیش از ‪ n‬رقم باشد‪ ،‬طول میدان‬
‫نادیده گرفته شده و عدد بطور كامل چاپ می شود‪.‬‬
‫‪ ‬برای اعداد اعشاری از ‪ %n.mf‬استفاده می كنیم كه ‪ n‬اندازه كل عدد‬
‫)شامل عالمت ممیز( و ‪ m‬تعداد ارقام اعشار است )مثال ‪ .(%5.2f‬در‬
‫صورتیكه تعداد ارقام اعشاری عدد موردنظر از ‪ m‬بیشتر باشد‪ ،‬عدد به ‪m‬‬
‫عدد اعشار گرد می شود و در صورتیكه از ‪ m‬كمتر باشد‪ ،‬در سمت‬
‫راست آن ‪ 0‬قرار داده می شود‪.‬‬

‫‪ 7-6-2‬تابع خواندن از ورودی‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای خواندن اطالعات از ورودی از تابع ‪ scanf‬استفاده می شود‪.‬‬
‫این تابع اطالعات را ازورودی استاندارد )معموال صفحه كلید( خوانده و در‬
‫متغیرهای تعیین شده قرار می دهد‪.‬‬
‫شكل كلی این تابع بصورت زیر است‪:‬‬
‫; )>لیست آدرسهای متغیرها< ‪> ,‬رشته كنترلی<(‪scanf‬‬
‫همانطور كه می بینید نحوه احضار تابع ‪ scanf‬نیز مشابه ‪ printf‬است‪ .‬تنها‬
‫تفاوت در آن است كه در ‪ scanf‬باید لیست آدرسهای متغیرها ارسال شود‪.‬‬
‫مبحث مربوط به آدرسها در فصول بعدی بررسی خواهد شد ولی در حال حاضر‬
‫بخاطر بسپارید كه برای بدست آوردن آدرس یك متغیر از عالمت & استفاده می‬
‫كنیم‪ .‬بعنوان مثال ‪ &age‬بمعنای آدرس متغیر ‪ age‬است‪.‬‬
‫بطور كلی در ‪ C‬قدیمی هرگاه كه یك تابع دارای پارامترهای خروجی بود )یعنی‬
‫پارامترهایی كه یك مقدار را باز می گرداندند( از آدرس متغیرها استفاده می‬
‫شد كه امروزه این مسئله وجود ندارد‪.‬‬

‫ تابع خواندن از ورودی‬7-6-2
#include
void main() {
int age;
float average ;
printf("Please enter your age and average : ");
scanf("%d %f",&age,&average);
printf("You are %d years old and your average is %5.2f \n",age,average);
}

Please enter your age and average : 19 16.72
You are 19 years old and your average is 16.72

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫زبان ‪ C++‬یک زبان شی گرا است‪ ،‬بهمین دلیل در این زبان برای ورودی‬
‫و خروجی از اشیاء بجای توابع استفاده می گردد‪.‬‬
‫از آنجا که امروزه معموال برنامه نویسان ‪ C‬از کامپایلرهای ‪ C++‬استفاده‬
‫می کنند‪ ،‬می توانند از اشیای ورودی و خروجی آن نیز استفاده کنند‪.‬‬
‫اینکار در بین بسیاری از برنامه نویسان ‪ C‬متداول است‪ ،‬بهمین دلیل ما‬
‫در اینجا نحوه کار با اشیای خواندن و نوشتن در ‪ C++‬را بطور مقدماتی‬
‫توضیح می دهیم؛ گرچه توضیح کامل این موارد نیاز به آشنایی با شی‬
‫گرایی و زبان ‪ C++‬دارد‪.‬‬
‫قبل از هرچیز الزم به ذکر است که کلیه اشیای مربوط به ورودی و‬
‫خروجی در فایل سرآمدی بنام ‪ iostream.h‬تعیریف شده اند‪ ،‬بنابراین‬
‫ابتدا باید این فایل به برنامه توسط دستور ‪ #include‬الحاق گردد‪.‬‬

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫زبان ‪ C++‬برای نمایش اطالعات از یک شیئ بنام ‪ cout‬استفاده می نماید‪.‬‬
‫برای ارسال اطالعات مورد نظر برای چاپ به ‪ cout‬باید از عملگر درج در جریان‬
‫یا >> استفاده نماییم‪ .‬بعنوان مثال ‪:‬‬
‫; ” ‪cout >> “Please enter your name:‬‬
‫و یا مثال دیگر ‪:‬‬
‫;‪int a = 10‬‬
‫;‪float b = 2.86‬‬
‫;‪cout << a‬‬
‫;‪cout << b‬‬
‫نکته جالبی که در این مثالها دیده می شود‪ ،‬آنستکه برخالف تابع ‪ printf‬هیچ‬
‫نیازی به مشخص کردن نوع متغیری که قصد چاپ آن را داریم نیست و خود‬
‫شئ ‪ cout‬نوع آن را تشخیص می دهد‪.‬‬
‫عالوه براین می توان چندین عملگر درج در جریان را با یکدیگر الحاق کرد و‬
‫چندین متغیر را با یک دستور چاپ کرد‪.‬‬

C++ ‫ ورودی و خروجی اطالعات در‬7-6-3
#include
void main() {
int age = 20;
floate average = 18.23;
cout >> “You are ” >> age >> “ years old and your average is ” >> average ;
}

You are 20 years old and your average is 18.230000

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای دریافت اطالعات از کاربر‪ ،‬از شئ دیگری بنام ‪ cin‬استفاده می شود‪.‬‬
‫برای ارسال متغیر مورد نظر به ‪ cin‬باید از عملگر استخراج از جریان یا <<‬
‫استفاده نماییم‪ .‬بعنوان مثال‪:‬‬
‫;‪int a‬‬
‫;‪cin >> a‬‬
‫بازهم همانطور که می بینید نیازی به تعیین نوع متغیر موردنظر نیست و خود‬
‫شئ ‪ cin‬نوع متغیر را بطور اتوماتیک تشخیص داده و داده ای از همان نوع را از‬
‫کاربر دریافت و در متغیر مورد نظر قرار می دهد‪.‬‬
‫عملگرهای استخراج از جریان را نیز می توان با یکدیگر الحاق کرد‪.‬‬
‫برای رفتن به خط بعد در شئ ‪ cout‬می توان از دستکاری کننده ‪ endl‬استفاده‬
‫کرد‪ .‬مثال در دستور زیر پس از چاپ پیغام‪ ،‬مکان نما به خط بعد منتقل می‬
‫شود‪:‬‬
‫;‪cout >> “List of students : “ >> endl‬‬
‫البته دستکاری کننده های متعدد دیگری نیز ازجمله موارد مربوط به تعیین طول‬
‫میدان و نحوه چاپ مقادیر وجود دارد که توضیح آنها نیاز به یک مبحث مستقل‬
‫دارد‪.‬‬

C++ ‫ ورودی و خروجی اطالعات در‬7-6-3
#include
void main() {
int age;
float average ;
cout << "Please enter your age and average : " ;
cin >> age >> average ;
cout << "You are " << age << "years old and your average is " << average;
}

Please enter your age and average : 19 16.72
You are 19 years old and your average is 16.72

‫‪ 7-7‬توابع کتابخانه ای‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫همانطور که قبال نیز گفته شد‪ ،‬زبان ‪ C‬از زیر برنامه ها نیز حمایت می کند‪ .‬هر زیر برنامه‬
‫در ‪ C‬یک تابع نامیده می شود‪ .‬تا کنون با توابعی همچون ‪ main‬و یا ‪ printf‬و ‪ scanf‬آشنا‬
‫شده ایم‪.‬‬
‫معموال عرضه کنندگان کامپایلرها و یا سایر فروشندگان نرم افزار‪ ،‬برخی از توابع عمومی‬
‫را که ممکن است مورد نیاز جمع کثیری از برنامه نویسان مختلف باشد را در قالب‬
‫کتابخانه ای از توابع در اختیار برنامه نویسان می گذارند‪ .‬بعضی از این توابع کتابخانه ای‬
‫مانند ‪ printf‬و ‪ scanf‬بصورت استاندارد درآمده و توسط عرضه کنندگان مختلف ارائه می‬
‫شوند‪.‬‬
‫در کامپایلر عرضه شده توسط شرکت بورلند )‪ (Borland C++ 3.1‬نیز کتابخانه های‬
‫متعددی از توابع برای شما عرضه شده اند که بتدریج با آنها و کاربردشان آشنا خواهید‬
‫شد‪.‬‬
‫نکته مهم آنستکه برای استفاده از این توابع ابتدا باید فایل سرآمد مربوط به آنها را نیز در‬
‫ابتدای برنامه خود اضافه نمایید ) با استفاده از ‪ .(#include‬هر فایل سرآمد شامل تعاریف‬
‫اولیه گروهی از توابع مرتبط با هم و داده های مربوط به آنها بوده و در استاندارد قدیمی‬
‫تر دارای پسوند ‪ .h‬می باشد)در استاندارد جدید پسوند این فایلها حذف شده است(‪.‬‬
‫برخی از این فایلهای سرآمد عبارتند از‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪ : stdio.h‬توابع ورودی و خروجی استاندارد‬
‫‪ : math.h‬توابع ریاضی‬
‫‪ : graphics.h‬توابع مربوط به عملیات گرافیکی‬
‫‪ : string.h‬توابع مربوط به کار با رشته ها‬


Slide 40

‫مبانی کامپیوتر و برنامه سازی‬
‫فصل هفتم ‪ :‬مفاهیم اولیه زبان ‪C‬‬
‫مدرس ‪ :‬نگین معروفی‬

‫‪ 7-1‬شناسه ها در ‪C‬‬
‫‪‬‬
‫‪‬‬

‫شناسه )‪ (identifier‬نامی است که به یک قسمت از برنامه مانند متغیر‪ ،‬تابع‪ ،‬ثابت و یا‬
‫‪ ...‬داده می شود‪.‬‬
‫در زبان ‪ C‬برای انتخاب شناسه ها فقط می توان از عالئم زیر استفاده کرد‪:‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫حروف انگلیسی کوچک و بزرگ )‪(A…Z a…z‬‬
‫ارقام )‪(0…9‬‬
‫عالمت خط پایین یا _‬

‫البته یک شناسه نمی تواند با یک رقم شروع شود‪.‬‬
‫چند شناسه مجاز‪ name2 ، average ، sum :‬و ‪student_average‬‬
‫چند شناسه غیرمجاز ‪ 2name‬و یا ‪student average‬‬
‫در برنامه نویسی امروزی پیشنهاد می شود بجای شناسه هایی همانند‬
‫‪ student_average‬از ‪ studentAverage‬استفاده گردد‪.‬‬
‫نکته مهم دیگری که باید به آن اشاره کرد آنستکه زبان ‪ C‬برخالف بسیاری از زبانهای دیگر‬
‫به کوچک و بزرگی حروف حساس است )‪ .(case sensitive‬در نتیجه شناسه های زیر با‬
‫یکدیگر متفاوتند ‪:‬‬
‫‪Sum ≠ sum ≠ SUM‬‬
‫آخرین نکته اینستکه در هنگام انتخاب شناسه نمی توانید از کلمات کلیدی که برای‬
‫منظورهای خاص در زبان ‪ C‬رزرو شده اند استفاده کنید‪.‬‬

C ‫ شناسه ها در‬7-1
: C ‫کلمات کلیدی در زبان‬
auto

break

case

char

const

continue

default

do

double

else

enum

extern

float

for

goto

if

int

long

register

return

short

signed

sizeof

static

struct

switch

typedef

union

unsigned

void

volatile

while

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫محدوده‬

‫اندازه )بیت(‬

‫توضیح‬

‫نوع داده‬

‫‪-128 to +127‬‬

‫‪8‬‬

‫کاراکتر‬

‫‪char‬‬

‫‪-32768 to +32767‬‬

‫‪16‬‬

‫عدد صحیح‬

‫‪int‬‬

‫‪3.4e-38 to 3.4e+38‬‬

‫‪32‬‬

‫عدد اعشاری‬

‫‪float‬‬

‫‪1.7e-308 to 1.7e+308‬‬

‫‪64‬‬

‫عدد اعشاری با‬
‫دقت مضاعف‬

‫‪double‬‬

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫‪‬‬

‫البته چند نکته مهم درمورد این جدول قابل ذکر است ‪:‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫اندازه ‪ int‬در محیطهای ‪ 16‬بیتی مانند ‪ DOS‬برابر ‪ 16‬بیت است‪ .‬اما در‬
‫محیطهای ‪ 32‬بیتی همانند ‪ Windows‬اندازه آن ‪ 32‬بیت می باشد که در‬
‫اینصورت محدوده ای برابر ‪ -2,147,483,648‬تا ‪ +2,147,483,647‬را‬
‫پوشش می دهد‪.‬‬
‫در بعضی از کامپایلرهای ‪ ،C‬نوع داده ‪ bool‬نیز وجود دارد که می تواند‬
‫یکی از مقادیر ‪)true‬درست( یا ‪) false‬غلط( را نشان دهد ‪ .‬اما در نسخه‬
‫های اولیه ‪ C‬از همان نوع داده صحیح یا ‪ int‬برای اینکار استفاده می‬
‫شد‪ .‬بدین صورت که ‪ 0‬نشاندهنده ‪ false‬و هر عدد غیر صفر )معموال ‪(1‬‬
‫نشاندهنده ‪ true‬است‪.‬‬
‫از آنجا که برای ذخیره سازی کاراکترها کد اسکی آنها ذخیره می گردد‪،‬‬
‫از یک متغیر کاراکتری یا ‪ char‬می توان بعنوان یک عدد صحیح کوچک نیز‬
‫استفاده کرد و اعمال ریاضی برروی آنها نیز مجاز است‪.‬‬

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫عالوه براین چندین اصالح کننده نیز وجود دارد که به ما اجازه می دهد نوع داده مورد‬
‫نظر را با دقت بیشتری برای نیازهای مختلف استفاده نماییم‪.‬‬
‫این اصالح کننده ها عبارتند از ‪short, long, signed, unsigned :‬‬
‫تمام این اصالح کننده ها می توانند به نوع داده ‪ int‬اعمال شوند و اثر آنها بستگی‬
‫به محیط دارد‪.‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫در یک محیط ‪16‬بیتی‪short int ،‬بازهم برابر ‪16‬بیت است ولی ‪ long int‬برابر‪32‬بیت می‬
‫باشد‪.‬‬
‫‪ unsigned int‬باعث می شود که یک عدد ‪ 16‬بیتی بدون عالمت داشته باشیم که بازه‬
‫بین ‪ 0‬تا ‪ 65535‬را پوشش می دهد‪ signed int .‬نیز همانند ‪ int‬معمولی بوده و تفاوتی‬
‫ندارد‪.‬‬
‫ترکیب این اصالح کننده ها نیز ممکن است‪ .‬مثال ‪ unsigned long int‬یک عدد ‪ 32‬بیتی‬
‫بدون عالمت است که بازه ‪ 0‬تا ‪ 4,294,967,295‬را پوشش می دهد‪.‬‬

‫برروی نوع داده ‪ char‬فقط اصالح کننده های ‪ signed‬و ‪ unsigned‬را می توان اعمال‬
‫کرد‪ .‬معموال از اصالح کننده ‪ unsigned‬وقتی استفاده می شود که قصد داشته‬
‫باشیم از ‪ char‬بعنوان یک عدد صحیح مثبت بین ‪ 0‬تا ‪ 255‬استفاده کنیم‪.‬‬
‫برروی نوع داده ‪ double‬تنها اصالح کننده ‪ long‬قابل اعمال است و دراینصورت عدد‬
‫اعشاری با ‪ 80‬بیت را خواهیم داشت که قادر است هر عددی در بازه ‪ 3.4e-4932‬تا‬
‫‪ 1.1e+4932‬را در خود نگاه دارد‪.‬‬

‫‪ 7-3‬تعریف متغیرها‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای تعریف متغیرها به شکل زیر عمل می کنیم‪:‬‬

‫;>‪ ‫که ‪ type‬یکی از نوع داده های گفته شده و ‪ variable-list‬لیستی از متغیرها است‬
‫که با کاما از یکدیگر جدا شده اند‪ .‬بعنوان مثال ‪:‬‬
‫;‪int sum‬‬
‫;‪float average‬‬
‫; ‪long int a, b, c‬‬
‫; ‪unsigned long int i, j, k‬‬
‫عالوه براین می توان در هنگام تعریف متغیر به آن مقدار اولیه نیز داد‪ .‬مثال ‪:‬‬
‫; ‪int d = 0‬‬
‫نكته مهم آنكه زبان ‪ C‬به متغیرها مقدار اولیه نمي دهد )حتي ‪ (0‬و برنامه نويس‬
‫خود بايد اينكار را صريحا انجام دهد‪ ،‬درغیر اينصورت مقدار اولیه متغیر‪ ،‬نامعین خواهد‬
‫بود‪.‬‬
‫تعریف متغیرها طبق اصول زبان ‪ C‬میتواند درهرجایی از برنامه صورت پذیرد‪ ،‬و‬
‫متغیرهای تعریف شده از همان خط به بعد قابل استفاده خواهد بود‪ .‬اما معموال‬
‫توصیه می گردد كه تعریف متغیرها در همان خط ابتدایی تابع و بالفاصله پس از {‬
‫صورت پذیرد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫‪‬‬
‫‪‬‬

‫ثابتها مقادیر ثابتی هستند كه مقدار آنها در حین اجرای برنامه تغییر نمی یابد‪ .‬ثابتها می توانند از‬
‫هریك از نوع داده های اصلی باشند‪.‬‬
‫ثوابت عددی صحیح ‪:‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫برای نمایش این دسته از ثوابت‪ ،‬از دنباله ای از ارقام بعالوه عالمت ‪ +‬یا ‪ -‬استفاده می كنیم‪ .‬بعنوان مثال‬
‫‪ -45‬و یا ‪ 3489‬ثوابت صحیح هستند‪.‬‬
‫در حالت عادی ‪ C‬هر عدد را در كوچكترین نوع داده ای كه می تواند قرار می دهد‪ .‬مثال عدد ‪ 85‬در یك‬
‫‪ int‬قرار می گیرد‪ ،‬اما عدد ‪ 145398‬در یك ‪ long int‬قرار خواهد گرفت‪.‬‬
‫اگر قصد دارید یك عدد كوچك بعنوان ‪ long‬محسوب گردد‪ ،‬می توانید از پسوند ‪ L‬در انتهای آن استفاده‬
‫می كنیم‪ .‬مثال ‪245L‬یك عدد ‪ long‬محسوب می شود‪.‬‬
‫;‪long int a = 20L‬‬
‫پسوند ‪ U‬در انتهای عدد نیز نشانه بدون عالمت بودن آن است‪.‬‬
‫نكته دیگر آنكه ‪ C‬به شما اجازه می دهد درصورت لزوم ثوابت صحیح خود را در مبنای ‪ 8‬یا ‪ 16‬نیز كه‬
‫از مبناهای متداول در برنامه نویسی هستند‪ ،‬بنویسید‪.‬‬
‫‪‬‬
‫‪‬‬

‫برای نوشتن عدد در مبنای ‪ 8‬باید آن را با ‪ 0‬آغاز كنید‪ ،‬مثال ‪ 0342‬یك عدد در منای ‪ 8‬محسوب می‬
‫گردد‪.‬‬
‫برای نوشتن یك عدد در مبنای ‪ 16‬باید آن را با ‪ 0x‬آغاز نمایید‪ ،‬مانند ‪.0x27A4‬‬

‫‪ 7-4‬ثوابت‬
‫ثوابت عددی اعشاری‬

‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫برای نمایش اعداد اعشاری‪ ،‬باید از نقطه اعشار استفاده كنیم‪ ،‬مانند ‪237.45‬‬
‫اما نكته جالب آنستكه می توانید از نماد علمی نیز برای نمایش اعداد‬
‫اعشاری استفاده كنید‪ .‬برای اینكار كافی است از حرف ‪ e‬برای نمایش قسمت‬
‫توان استفاده نمایید‪ .‬بعنوان مثال ‪:‬‬
‫‪-23.47 × 10 5 = -23.47e5‬‬
‫‪42.389 × 10 -3 = 42.389e-3‬‬
‫دقت كنید كه قسمت توان‪ ،‬حتما یك عدد صحیح است‪.‬‬
‫نكته جالب اینجاست كه برخالف مورد قبل‪ ،‬كامپایلر بطور پیش فرض داده های‬
‫اعشاری را از نوع ‪ double‬فرض می كند‪.‬چنانچه دوست دارید ثابت شما ازنوع‬
‫‪ float‬درنظر گرفته شود‪ ،‬در انتهای آن ‪ F‬قرار دهید‪ .‬ضمنا پسوند ‪ L‬نیز داده‬
‫اعشاری را از نوع ‪ long double‬درنظر می گیرد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫ثوابت كاراكتری ‪:‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫برای نشان دادن ثوابت كاراكتری‪ ،‬آنها را در داخل ' قرار می دهیم‪ .‬بعنوان مثال‬
‫'‪'A‬یك ثابت كاراكتری است‪.‬‬
‫; '‪char ch = 'S‬‬
‫دقت كنید كه همانطور كه قبال گفته شد‪ ،‬كد اسكی كاراكترها در متغیر ذخیره‬
‫می گردد‪ ،‬بنابراین می توان از آن بعنوان یك عدد صحیح نیز استفاده كرد‪ .‬نكته‬
‫مهم دیگر آنستكه به تفاوت عدد ‪ 5‬و كاراكتر '‪ '5‬دقت داشته باشید‪ .‬در حقیقت‬
‫'‪ '5‬برابر است با عدد ‪ 53‬كه همان كد اسكی آن است‪.‬‬
‫روش فوق‪ ،‬برای نمایش کاراکترهای قابل چاپ مناسب است‪ ،‬اما بعضی‬
‫كاراكترها مانند ‪ enter‬قابل نمایش نبوده و برای آنها شکل خاصی وجود ندارد‪.‬‬
‫در چنین مواردی‪ ،‬زبان ‪ C‬از ترکیب عالمت \ به همراه یک کاراکتر دیگر‪ ،‬برای‬
‫نمایش این قبیل کاراکترها استفاده می نماید‪ .‬بعنوان مثال‪ ،‬کاراکتر '‪ '\n‬نشان‬
‫دهنده خط جدید یا همان ‪ enter‬می باشد‪.‬‬
‫جدول صفحه بعد این قبیل کاراکترها و معادل آنها را نشان می دهد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫نحوه نمایش در ‪C‬‬

‫کد اسکی‬

‫صدای بوق کامپیوتر‬

‫‪\a‬‬

‫‪7‬‬

‫حرکت به عقب ‪backspace‬‬

‫‪\b‬‬

‫‪8‬‬

‫شروع صفحه ‪form feed‬‬

‫‪\f‬‬

‫‪12‬‬

‫سطر جدید ‪line feed‬‬

‫‪\n‬‬

‫‪10‬‬

‫برگشت به ابتداي سطر ‪carriage return‬‬

‫‪\r‬‬

‫‪13‬‬

‫فاصله افقی ‪horizontal tab‬‬

‫‪\t‬‬

‫‪9‬‬

‫فاصله عمودی ‪vertical tab‬‬

‫‪\v‬‬

‫‪11‬‬

‫عالمت سوال‬

‫?\‬

‫‪63‬‬

‫عالمت '‬

‫'\‬

‫‪39‬‬

‫عالمت "‬

‫"\‬

‫‪34‬‬

‫عالمت \‬

‫\\‬

‫‪92‬‬

‫عالمت تهی‬

‫‪\0‬‬

‫‪0‬‬

‫نام کاراکتر‬

‫کد اسکی یک کاراکتر با ‪ 3‬رقم در مبنای ‪8‬‬

‫‪\000‬‬

‫کد اسکی یک کاراکتر با ‪ 2‬رقم در مبنای ‪16‬‬

‫‪\x00‬‬

‫‪ 7-4‬ثوابت‬
‫‪‬‬

‫ثوابت رشته ای ‪ C :‬عالوه بر ثوابت فوق‪ ،‬از یك ثابت دیگر بنام رشته نیز‬
‫حمایت می كند‪ .‬رشته‪ ،‬دنباله ای از كاراكترها است كه در داخل " قرار‬
‫می گیرند‪ .‬بعنوان مثال "‪ "this is a test‬یك رشته است‪ .‬دقت كنید كه '‪'a‬‬
‫یك كاراكتر است‪ ،‬اما "‪ "a‬یك رشته است كه فقط شامل یك كاراكتر می‬
‫باشد‪.‬‬

‫‪ 7-5‬عملگرها‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫عملگر‪ ،‬نمادی است كه به كامپایلر می گوید تا عملیات محاسباتی یا‬
‫منطقی خاصی را برروی یك یا چند عملوند‪ ،‬انجام دهد‪.‬‬
‫به عملگرهایی كه فقط یك عملوند دارند‪ ،‬عملگر یكانی می گوییم و‬
‫همواره عملگر در سمت چپ عملوند قرار می گیرد)مانند عدد ‪.(-125‬‬
‫اما عملگرهایی كه برروی دو عملوند اثر می كنند را عملگر دودویی‬
‫نامیده و عملگر را بین دو عملوند قرار می دهیم )مانند ‪.(23+86‬‬
‫هر ترکیب درستی از عملگرها و عملوندها را یک عبارت می نامیم‪.‬‬
‫‪ C‬از نقطه نظر عملگرها یك زبان بسیار قوی است‪ .‬این عملگرها به چند‬
‫دسته اصلی تقسیم می گردند كه آنها را به ترتیب بررسی می كنیم‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫این عملگرها‪ ،‬همان اعمال متداول ریاضی هستند كه در زبان ‪ C‬مورد استفاده‬
‫قرار می گیرند‪ .‬این اعمال عبارتند از ‪:‬‬

‫عمل‬

‫نوع‬

‫عملگر‬

‫منفی كردن عملوند سمت راست‬

‫یكانی‬

‫‪-‬‬

‫جمع دو عملوند‬

‫دودویی‬

‫‪+‬‬

‫تفریق دو عملوند‬

‫دودویی‬

‫‪-‬‬

‫ضرب دو عملوند‬

‫دودویی‬

‫*‬

‫تقسیم دو عملوند‬

‫دودویی‬

‫‪/‬‬

‫محاسبه باقیمانده تقسیم دو عملوند‬

‫دودویی‬

‫‪%‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬
‫‪‬‬

‫این عملگرهای برروی همه انواع داده های ‪ C‬عمل می كنند‪ ،‬بجز عملگر ‪ %‬كه فقط‬
‫برروی نوع داده های صحیح عمل می كند‪.‬‬
‫اما نكته مهمی كه باید به آن اشاره كرد‪ ،‬نحوه كار عملگر تقسیم برروی نوع داده های‬
‫مختلف است‪.‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫درصورتیكه هردو عملوند صحیح باشند‪ ،‬تقسیم بصورت صحیح بر صحیح انجام خواهد شد‪.‬‬
‫اگر یكی یا هر دو عملوند اعشاری باشند‪ ،‬تقسیم بصورت اعشاری انجام خواهد پذیرفت‪.‬‬
‫فرض كنید تعاریف زیر را داریم ‪:‬‬
‫; ‪int a,b‬‬
‫; ‪float c,d‬‬
‫; ‪a = 10 ; b = 4‬‬
‫;‪c = 8.2; d = 4.0‬‬
‫اكنون به نتایج عملیات زیر دقت كنید ‪:‬‬
‫‪a / b => 2‬‬
‫‪c / d => 2.05‬‬
‫‪a / d => 2.5‬‬
‫‪a / 4 => 2‬‬
‫چنانچه به آخرین مورد توجه كنید‪ ،‬متوجه می شوید كه از آنجا كه ‪a‬یك متغیر صحیح است و ‪4‬‬
‫نیز یك ثابت صحیح در نظر گرفته شده‪ ،‬درنتیجه تقسیم بصورت صحیح بر صحیح انجام گرفته‬
‫است‪ .‬چنانچه بخواهیم تقسیم بصورت اعشاری صورت پذیرد‪ ،‬به دو شكل می توانیم عمل‬
‫كنیم‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫برای اینکه عبارت تقسیم صفحه قبل بصورت اعشاری انجام شود‪ ،‬به دو روش‬
‫می توان عمل کرد‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫این عبارت را بصورت ‪ a / 4.0‬بنویسیم‪.‬‬
‫از عملگر قالب ریزی استفاده كنیم‪.‬‬

‫عملگر قالب ریزی می تواند یك نوع را به نوع دیگری تبدیل نماید‪ .‬شكل كلی آن‬
‫به شكل زیر است ‪:‬‬
‫>‪() ‫كه ‪ type‬نوع مورد نظر است كه قصد تبدیل عبارت ‪ expression‬به آن نوع را‬
‫داریم‪ .‬بعنوان مثال در مورد قبلی می توان به شكل زیر عمل كرد ‪:‬‬
‫‪(float) a / 4‬‬
‫در این حالت از كامپایلر خواسته ایم كه ابتدا عدد ‪ a‬را به اعشاری تبدیل كند‬
‫)البته بصورت موقت( و سپس آن را بر ‪ 4‬تقسیم نماید‪ ،‬كه مسلما حاصل‬
‫اعشاری خواهد بود‪.‬‬
‫بطوركلی هرگاه ثابتها و متغیرهایی از انواع مختلف در یك عبارت محاسباتی‬
‫داشته باشیم‪ ،‬كامپایلر ‪ C‬همه آنها را به یك نوع یكسان كه همان بزرگترین‬
‫عملوند موجود است تبدیل خواهد كرد‪ .‬بعنوان مثال به مورد صفحه بعد دقت‬
‫كنید ‪:‬‬

‫ عملگرهای محاسباتی‬7-5-1
char ch;
int i;

float f;
double d;
result = (ch / i)
int

+

(f *d)

(f+i)
float

double

double

int

-

double

double

float

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫اولویت عملگرها ‪ :‬در عبارتی که شامل چندین عملگر است‪ ،‬کدامیک در‬
‫ابتدا اعمال خواهد گردید‪.‬‬
‫اولویت عملگرهای محاسباتی از باال به پایین بشرح زیر است‪:‬‬
‫‪ ‬عملگر یکانی –‬
‫‪ ‬عملگرهای * و ‪ /‬و ‪%‬‬
‫‪ ‬عملگرهای ‪ +‬و –‬
‫چنانچه اولویت دو عملگر یکسان باشد‪ ،‬این عملگرها از چپ به راست‬
‫محاسبه خواهند شد‪.‬‬
‫چنانچه بخواهیم یک عمل با اولویت پایین زودتر انجام شود‪ ،‬باید از پرانتز‬
‫استفاده کنیم‪ .‬بنابراین اولویت عملگر پرانتز از همه موارد فوق‬
‫بیشتراست‪ .‬در مورد پرانتزهای متداخل‪ ،‬ابتدا پرانتز داخلی محاسبه‬
‫می شود؛ اما در مورد پرانتزهای هم سطح‪ ،‬ابتدا پرانتز سمت چپتر‬
‫محاسبه می گردد‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫چند مثال در مورد اولویت عملگرها‬

‫ترتیب اجرای عملگرها‬

‫عبارت زبان ‪C‬‬

‫ابتدا عمل * و سپس عمل ‪+‬‬

‫‪b+c*d‬‬

‫ابتدا عمل ‪ +‬و سپس عمل *‬

‫‪(b + c) * d‬‬

‫ابتدا عمل ‪ /‬سپس عمل * و در انتها عمل ‪+‬‬

‫‪b+c/d*e‬‬

‫ابتدا عمل * سپس عمل ‪ /‬و در انتها عمل ‪+‬‬

‫)‪b + c / (d * e‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫یک مثال کامل در مورد اولویت عملگرها‬

‫‪result = a + b * (f – (g + b) / d) – c * (a – d) / e‬‬
‫‪6‬‬

‫‪1‬‬
‫‪7‬‬

‫‪2‬‬

‫‪8‬‬

‫‪3‬‬
‫‪4‬‬
‫‪5‬‬
‫‪9‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫در زبان ‪ C‬برای انتساب چندین عملگر وجود دارد‪ .‬ساده ترین عملگر انتساب‪ ،‬همان عملگر =‬
‫است که در بسیاری از زبانها استفاده می شود‪ .‬بعنوان مثال ‪:‬‬
‫;‪a = 5‬‬
‫;‪b = c + 2 * d‬‬
‫این عملگر باعث می شود که عبارت سمت راست در عبارت سمت چپ قرار گیرد‪.‬‬
‫توجه کنید که مقدار سمت چپ باید عبارتی باشد که بتوان به آن یک مقدار را نسبت داد‬
‫)مانند یک متغیر( که به آن ‪ Lvalue‬گفته می شود‪ ،‬بنابراین یک ثابت نمی تواند در سمت چپ‬
‫قرار گیرد‪.‬‬
‫نکته دیگر اینکه اولویت عملگر = از عملگرهای ریاضی کمتر است و درنتیجه ابتدا آن عملیات‬
‫انجام شده و در پایان حاصل در عبارت سمت چپ ریخته می شود‪.‬‬
‫الزم به ذکر است که در هنگام انتساب‪ ،‬درصورت لزوم نوع عبارت سمت راست به نوع عبارت‬
‫سمت چپ تبدیل می شود‪ .‬مثال‪:‬‬
‫;‪int a‬‬
‫;‪a = 2.5 * 5.0‬‬
‫که دراینصورت عدد ‪ 12‬در ‪ a‬ذخیره خواهد شد‪.‬‬
‫شرکت پذیری این عملگر از راست به چپ می باشد‪ ،‬بدین معنا که چنانچه چندین عملگر‬
‫نسبت دهی داشته باشیم‪ ،‬این عملگرها از راست به چپ محاسبه می شوند‪ .‬مثال پس از‬
‫اجرای دستور زیر‪ ،‬مقدار هر ‪ 3‬متغیر برابر ‪ 10‬خواهد شد‪.‬‬
‫;‪a = b = c = 10‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬

‫نکته جالب درمورد زبان ‪ C‬آنستکه دارای یک سری عملگرهای انتساب‬
‫خالصه شده است که باعث می شوند در بعضی موارد بتوانیم عبارات‬
‫کوتاهتری را بنویسیم‪ .‬این عملگرها عبارتند از ‪:‬‬
‫عملگرد‬

‫مثال‬

‫عبارت انتساب معادل‬

‫‪++‬‬

‫;‪a ++‬‬

‫;‪a = a + 1‬‬

‫‪--‬‬

‫;‪a --‬‬

‫;‪a = a – 1‬‬

‫=‪+‬‬

‫;‪a += 5‬‬

‫;‪a = a + 5‬‬

‫=‪-‬‬

‫;‪a -= 8‬‬

‫;‪a= a – 8‬‬

‫=*‬

‫;‪a *= 10‬‬

‫;‪a= a * 10‬‬

‫=‪/‬‬

‫;‪a /= 2‬‬

‫;‪a = a / 2‬‬

‫=‪%‬‬

‫;‪a %= 10‬‬

‫;‪a = a % 10‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬
‫‪‬‬

‫عملگر اول و دوم‪ ،‬عملگرهای یکانی هستند که بترتیب عملگر افزایش و عملگر کاهش‬
‫نامیده می شوند‪.‬‬
‫نکته جالب آنستکه این دو عملگر به دوصورت مورد استفاده قرار می گیرند‪.‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫در حالتی که از دستور ;‪ a ++‬استفاده شود به آن پس افزایش می گویند و بدین معناست که‬
‫ابتدا از مقدار فعلی ‪ a‬در عبارت موردنظر استفاده کن و سپس آن را افزایش بده‪.‬‬
‫اما دستور ;‪ ++ a‬که به آن پیش افزایش گفته می شود‪ ،‬ابتدا ‪ a‬را افزایش داده و سپس از آن‬
‫در عبارت استفاده می کند‪.‬‬
‫به برنامه زیر دقت کنید‪:‬‬

‫>‪#include ‫{ )(‪void main‬‬
‫; ‪int a ,b‬‬
‫;‪a=5‬‬
‫;‪b = a ++‬‬
‫;)‪printf(“a=%d and b=%d \n”,a,b‬‬
‫;‪a=5‬‬
‫;‪b = ++ a‬‬
‫;)‪printf(“a=%d and b=%d \n”,a,b‬‬
‫}‬
‫‪a=6 b=5‬‬
‫‪a=6 b=6‬‬

‫‪ 7-5-3‬عملگرهای مقایسه ای‬
‫‪‬‬

‫‪‬‬

‫این عملگرها دو عبارت را بایکدیگر مقایسه کرده و نتیجه را باز می گردانند‪.‬‬
‫نتیجه می تواند درست )‪ (true‬یا غلط )‪ (false‬باشد‪.‬‬
‫نتیجه این عملگرها یک عدد صحیح است که درصورت درست بودن ‪ 1‬و‬
‫درصورت غلط بودن ‪ 0‬باز می گردانند‪ .‬این عملگرها عبارتند از‪:‬‬
‫عملگر‬

‫مفهوم عملگر‬

‫مثال‬

‫<‬

‫بزرگتر )<(‬

‫‪a>b‬‬

‫>‬

‫کوچکتر )>(‬

‫‪a
‫=<‬

‫بزرگتر یا مساوی )≤(‬

‫‪a >= b‬‬

‫=>‬

‫کوچکتر یا مساوی )≥(‬

‫‪a <= b‬‬

‫==‬

‫مساوی )=(‬

‫‪a == b‬‬

‫=!‬

‫نامساوی )≠(‬

‫‪a != b‬‬

‫‪ 7-5-3‬عملگرهای مقایسه ای‬
‫‪‬‬

‫‪‬‬

‫نکته مهمی که باید به آن دقت کرد عملگر مساوی )==( است‪ ،‬چرا که یک‬
‫اشتباه بسیار متداول برنامه نویسان ‪ C‬استفاده اشتباه از عملگر انتساب‬
‫)=( بجای عملگر تساوی )==( است که باعث ایجاد خطا در برنامه می‬
‫شود‪.‬‬
‫اولویت این عملگرها از باال به پایین بشرح زیر است‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫عملگرهای <‪ <= ، > ،‬و =>‬
‫عملگرهای == و =!‬

‫الزم بذکر است که در هنگام مساوی بودن اولویت چند عملگر‪ ،‬این عملگرها‬
‫از چپ به راست محاسبه می گردند‪.‬‬

‫‪ 7-5-4‬عملگرهای منطقی‬
‫‪‬‬

‫این عملگرها به شما اجازه می دهند که شرطهای ساده ای را که با‬
‫استفاده از عملگرهای مقایسه ای ایجاد شده اند را با یکدیگر ترکیب نموده‬
‫و شرطهای پیچیده تری را بسازید‪ .‬این عملگرها عبارتند از ‪:‬‬
‫مثال‬

‫عملگر‬

‫مفهوم عملگر‬

‫نحوه کار‬

‫&&‬

‫‪ AND‬منطقی‬

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

‫‪a>0 && sw==1‬‬

‫||‬

‫‪ OR‬منطقی‬

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

‫‪a<=100 || b!=0‬‬

‫!‬

‫‪ NOT‬منطقی‬

‫اگر عملوند درست باشد‪ ،‬نادرست و‬
‫اگر نادرست باشد‪ ،‬درست برمی‬
‫گرداند‪.‬‬

‫)‪! (a==1 || b<10‬‬

‫‪ 7-5-5‬عملگر شرطی‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫گاهی الزم است که ابتدا یک شرط بررسی شده و سپس برمبنای نتیجه )درست یا نادرست بودن آن( یکی‬
‫از دو عبارت ممکن بازگردانده شود‪ .‬برای اینکار می توان از یک عملگر ‪3‬تایی )با ‪ 3‬عملوند( بنام عملگر‬
‫شرطی استفاده نمود‪.‬‬
‫شکل کلی این عملگر بصورت زیر است‪:‬‬
‫>عبارت‪> :<2‬عبارت‪> ?<1‬شرط<‬
‫نحوه کار بدینصورت است که درصورت درست بودن شرط‪ ،‬عبارت‪ 1‬و در غیراینصورت عبارت ‪ 2‬بازگردانده می‬
‫شود‪.‬‬
‫به عنوان مثال به دستور زیر توجه کنید‪:‬‬
‫که این عبارت معادل دستور زیر است‪:‬‬

‫‪‬‬

‫;‪a = (k<10) ? 100 : 50‬‬
‫;‪if (k<10) a=100‬‬
‫;‪else a=50‬‬

‫البته این عبارت به شکلهای پیچیده نیز می تواند مورد استفاده قرار گیرد‪ .‬مثال ‪:‬‬
‫;‪c += (a>0 && a<10) ? ++a : a/b‬‬
‫که معادل است با ‪:‬‬
‫{ )‪if (a>0 && a<10‬‬
‫;‪a= a + 1‬‬
‫;‪c = c + a‬‬
‫}‬
‫;‪else c = c + a/b‬‬

‫‪ 7-5-6‬اولویت عملگرها‬
‫عملگر‬

‫اولویت‬

‫شرکت پذیری‬

‫‪1‬‬

‫)(‬

‫از چپ به راست‬

‫‪2‬‬

‫‪- + ! -- ++‬‬

‫از راست به چپ‬

‫‪3‬‬

‫‪* / %‬‬

‫از چپ به راست‬

‫‪4‬‬

‫‪+ -‬‬

‫از چپ به راست‬

‫‪5‬‬

‫>> <<‬

‫از چپ به راست‬

‫‪6‬‬

‫>= > <= <‬

‫از چپ به راست‬

‫‪7‬‬

‫=! ==‬

‫از چپ به راست‬

‫‪8‬‬

‫&&‬

‫از چپ به راست‬

‫‪9‬‬

‫||‬

‫از چپ به راست‬

‫‪10‬‬

‫‪?:‬‬

‫از راست به چپ‬

‫‪11‬‬

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

‫از راست به چپ‬

‫‪12‬‬

‫‪,‬‬

‫از چپ به راست‬

‫‪ 7-6‬خواندن و نمایش اطالعات‬
‫‪‬‬

‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫همانطور كه قبال نیز گفته شد‪ ،‬یكی از اهداف زبان ‪ C‬قابل حمل بودن آن‬
‫است‪ .‬بهمین منظور سعی شده است كه از دستوراتی كه ممكن است‬
‫وابسته به ماشین خاصی باشد‪ ،‬اجتناب گردد‪.‬‬
‫بهمین دلیل زبان ‪ C‬برخالف سایر زبانها دارای هیچ دستوری برای‬
‫خواندن از ورودی و یا نوشتن در خروجی نیست‪.‬‬
‫اما در عوض دارای تعدادی تابع )زیربرنامه( استاندارد می باشد كه تقریبا‬
‫تمامی كامپایلرها از آنها حمایت می كنند‪.‬‬
‫این كار به كامپایلر این امكان را می دهد كه بر حسب نوع سخت افزار‬
‫موردنظر‪ ،‬توابع ورودی و خروجی را طراحی نماید‪.‬‬
‫این توابع در یك فایل سرآمد بنام ‪ stdio.h‬تعریف شده اند و بنابراین قبل‬
‫ازاینكه بتوانید از این توابع استفاده نمایید‪ ،‬باید این فایل را نیز با استفاده‬
‫از ‪ #include‬در برنامه خود بگنجانید‪.‬‬

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫برای نمایش اطالعات در خروجی از تابع ‪ printf‬استفاده می شود‪.‬‬
‫این تابع رشته موردنظر شما را به خروجی استاندارد )كه در حالت‬
‫عادی همان صفحه نمایش یا مانیتور است( می فرستد‪ .‬شكل كلی این‬
‫تابع بصورت زیر است‪:‬‬
‫; )>لیست متغیرها< ‪> ,‬رشته كنترلی<(‪printf‬‬
‫رشته كنترلی همان متنی است كه قصد چاپ آن را داریم‪ ،‬با ذكر این‬
‫نكته كه در قسمتهایی كه باید مقدار یك متغیر چاپ شود‪ ،‬از یك‬
‫مشخصه تبدیل استفاده می شود‪ .‬هر مشخصه تبدیل از یك عالمت ‪%‬‬
‫بعالوه یك كاراكتر كه نوع متغیر مورد نظر را نشان می دهد تشكیل می‬
‫گردد‪.‬‬
‫لیست متغیرها نیز همان متغیرهایی هستند كه قصد چاپ آنها را داریم‪.‬‬
‫این متغیرها باید بترتیب قرار گرفته و با كاما )‪ (,‬از یكدیگر جدا شوند‪.‬‬

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫مشخصه تبدیل‬

‫مفهوم‬

‫‪%c‬‬

‫كاراكتر‬

‫‪%d‬‬

‫عدد صحیح در مبنای ‪10‬‬

‫‪%f‬‬

‫عدد اعشاری بدون نماد علمی‬

‫‪%e‬‬

‫عدد اعشاری با نماد علمی‬

‫‪%g‬‬

‫عدد اعشاری با حالت كوتاهتر بین ‪ e‬و ‪f‬‬

‫‪%s‬‬

‫رشته‬

‫‪%ld‬‬

‫عدد صحیح بزرگ‬

‫‪%lf %le %lg‬‬

‫عدد اعشاری بزرگ‬

‫‪%o‬‬

‫عدد صحیح در مبنای ‪8‬‬

‫‪%x‬‬

‫عدد صحیحی در مبنای ‪16‬‬

‫‪%u‬‬

‫عدد صحیح بدون عالمت‬

‫ تابع نمایش در خروجی‬7-6-1
#include
void main() {
int age = 20;
floate average = 18.23;
printf("You are %d years old and your average is %f \n",age,average);
}
You are 20 years old and your average is 18.230000

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫‪‬‬
‫‪‬‬

‫برای کنترل نحوه چاپ اعداد می توانید از مشخصه طول میدان استفاده‬
‫کنید‪.‬‬
‫مشخصه طول میدان برای اعداد به شكل زیر استفاده می شود‪:‬‬
‫‪ ‬برای اعداد صحیح از ‪ %nd‬استفاده می كنیم كه ‪ n‬تعداد ارقام را نشان‬
‫می دهد )مثال ‪ .(%3d‬در اینصورت برای هر متغیر ‪ n‬رقم درنظر گرفته‬
‫می شود‪ .‬اگر اندازه عدد از ‪ n‬كوچكتر باشد‪ ،‬به سمت چپ آن فضای‬
‫خالی اضافه می شود و اگر اندازه عدد بیش از ‪ n‬رقم باشد‪ ،‬طول میدان‬
‫نادیده گرفته شده و عدد بطور كامل چاپ می شود‪.‬‬
‫‪ ‬برای اعداد اعشاری از ‪ %n.mf‬استفاده می كنیم كه ‪ n‬اندازه كل عدد‬
‫)شامل عالمت ممیز( و ‪ m‬تعداد ارقام اعشار است )مثال ‪ .(%5.2f‬در‬
‫صورتیكه تعداد ارقام اعشاری عدد موردنظر از ‪ m‬بیشتر باشد‪ ،‬عدد به ‪m‬‬
‫عدد اعشار گرد می شود و در صورتیكه از ‪ m‬كمتر باشد‪ ،‬در سمت‬
‫راست آن ‪ 0‬قرار داده می شود‪.‬‬

‫‪ 7-6-2‬تابع خواندن از ورودی‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای خواندن اطالعات از ورودی از تابع ‪ scanf‬استفاده می شود‪.‬‬
‫این تابع اطالعات را ازورودی استاندارد )معموال صفحه كلید( خوانده و در‬
‫متغیرهای تعیین شده قرار می دهد‪.‬‬
‫شكل كلی این تابع بصورت زیر است‪:‬‬
‫; )>لیست آدرسهای متغیرها< ‪> ,‬رشته كنترلی<(‪scanf‬‬
‫همانطور كه می بینید نحوه احضار تابع ‪ scanf‬نیز مشابه ‪ printf‬است‪ .‬تنها‬
‫تفاوت در آن است كه در ‪ scanf‬باید لیست آدرسهای متغیرها ارسال شود‪.‬‬
‫مبحث مربوط به آدرسها در فصول بعدی بررسی خواهد شد ولی در حال حاضر‬
‫بخاطر بسپارید كه برای بدست آوردن آدرس یك متغیر از عالمت & استفاده می‬
‫كنیم‪ .‬بعنوان مثال ‪ &age‬بمعنای آدرس متغیر ‪ age‬است‪.‬‬
‫بطور كلی در ‪ C‬قدیمی هرگاه كه یك تابع دارای پارامترهای خروجی بود )یعنی‬
‫پارامترهایی كه یك مقدار را باز می گرداندند( از آدرس متغیرها استفاده می‬
‫شد كه امروزه این مسئله وجود ندارد‪.‬‬

‫ تابع خواندن از ورودی‬7-6-2
#include
void main() {
int age;
float average ;
printf("Please enter your age and average : ");
scanf("%d %f",&age,&average);
printf("You are %d years old and your average is %5.2f \n",age,average);
}

Please enter your age and average : 19 16.72
You are 19 years old and your average is 16.72

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫زبان ‪ C++‬یک زبان شی گرا است‪ ،‬بهمین دلیل در این زبان برای ورودی‬
‫و خروجی از اشیاء بجای توابع استفاده می گردد‪.‬‬
‫از آنجا که امروزه معموال برنامه نویسان ‪ C‬از کامپایلرهای ‪ C++‬استفاده‬
‫می کنند‪ ،‬می توانند از اشیای ورودی و خروجی آن نیز استفاده کنند‪.‬‬
‫اینکار در بین بسیاری از برنامه نویسان ‪ C‬متداول است‪ ،‬بهمین دلیل ما‬
‫در اینجا نحوه کار با اشیای خواندن و نوشتن در ‪ C++‬را بطور مقدماتی‬
‫توضیح می دهیم؛ گرچه توضیح کامل این موارد نیاز به آشنایی با شی‬
‫گرایی و زبان ‪ C++‬دارد‪.‬‬
‫قبل از هرچیز الزم به ذکر است که کلیه اشیای مربوط به ورودی و‬
‫خروجی در فایل سرآمدی بنام ‪ iostream.h‬تعیریف شده اند‪ ،‬بنابراین‬
‫ابتدا باید این فایل به برنامه توسط دستور ‪ #include‬الحاق گردد‪.‬‬

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫زبان ‪ C++‬برای نمایش اطالعات از یک شیئ بنام ‪ cout‬استفاده می نماید‪.‬‬
‫برای ارسال اطالعات مورد نظر برای چاپ به ‪ cout‬باید از عملگر درج در جریان‬
‫یا >> استفاده نماییم‪ .‬بعنوان مثال ‪:‬‬
‫; ” ‪cout >> “Please enter your name:‬‬
‫و یا مثال دیگر ‪:‬‬
‫;‪int a = 10‬‬
‫;‪float b = 2.86‬‬
‫;‪cout << a‬‬
‫;‪cout << b‬‬
‫نکته جالبی که در این مثالها دیده می شود‪ ،‬آنستکه برخالف تابع ‪ printf‬هیچ‬
‫نیازی به مشخص کردن نوع متغیری که قصد چاپ آن را داریم نیست و خود‬
‫شئ ‪ cout‬نوع آن را تشخیص می دهد‪.‬‬
‫عالوه براین می توان چندین عملگر درج در جریان را با یکدیگر الحاق کرد و‬
‫چندین متغیر را با یک دستور چاپ کرد‪.‬‬

C++ ‫ ورودی و خروجی اطالعات در‬7-6-3
#include
void main() {
int age = 20;
floate average = 18.23;
cout >> “You are ” >> age >> “ years old and your average is ” >> average ;
}

You are 20 years old and your average is 18.230000

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای دریافت اطالعات از کاربر‪ ،‬از شئ دیگری بنام ‪ cin‬استفاده می شود‪.‬‬
‫برای ارسال متغیر مورد نظر به ‪ cin‬باید از عملگر استخراج از جریان یا <<‬
‫استفاده نماییم‪ .‬بعنوان مثال‪:‬‬
‫;‪int a‬‬
‫;‪cin >> a‬‬
‫بازهم همانطور که می بینید نیازی به تعیین نوع متغیر موردنظر نیست و خود‬
‫شئ ‪ cin‬نوع متغیر را بطور اتوماتیک تشخیص داده و داده ای از همان نوع را از‬
‫کاربر دریافت و در متغیر مورد نظر قرار می دهد‪.‬‬
‫عملگرهای استخراج از جریان را نیز می توان با یکدیگر الحاق کرد‪.‬‬
‫برای رفتن به خط بعد در شئ ‪ cout‬می توان از دستکاری کننده ‪ endl‬استفاده‬
‫کرد‪ .‬مثال در دستور زیر پس از چاپ پیغام‪ ،‬مکان نما به خط بعد منتقل می‬
‫شود‪:‬‬
‫;‪cout >> “List of students : “ >> endl‬‬
‫البته دستکاری کننده های متعدد دیگری نیز ازجمله موارد مربوط به تعیین طول‬
‫میدان و نحوه چاپ مقادیر وجود دارد که توضیح آنها نیاز به یک مبحث مستقل‬
‫دارد‪.‬‬

C++ ‫ ورودی و خروجی اطالعات در‬7-6-3
#include
void main() {
int age;
float average ;
cout << "Please enter your age and average : " ;
cin >> age >> average ;
cout << "You are " << age << "years old and your average is " << average;
}

Please enter your age and average : 19 16.72
You are 19 years old and your average is 16.72

‫‪ 7-7‬توابع کتابخانه ای‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫همانطور که قبال نیز گفته شد‪ ،‬زبان ‪ C‬از زیر برنامه ها نیز حمایت می کند‪ .‬هر زیر برنامه‬
‫در ‪ C‬یک تابع نامیده می شود‪ .‬تا کنون با توابعی همچون ‪ main‬و یا ‪ printf‬و ‪ scanf‬آشنا‬
‫شده ایم‪.‬‬
‫معموال عرضه کنندگان کامپایلرها و یا سایر فروشندگان نرم افزار‪ ،‬برخی از توابع عمومی‬
‫را که ممکن است مورد نیاز جمع کثیری از برنامه نویسان مختلف باشد را در قالب‬
‫کتابخانه ای از توابع در اختیار برنامه نویسان می گذارند‪ .‬بعضی از این توابع کتابخانه ای‬
‫مانند ‪ printf‬و ‪ scanf‬بصورت استاندارد درآمده و توسط عرضه کنندگان مختلف ارائه می‬
‫شوند‪.‬‬
‫در کامپایلر عرضه شده توسط شرکت بورلند )‪ (Borland C++ 3.1‬نیز کتابخانه های‬
‫متعددی از توابع برای شما عرضه شده اند که بتدریج با آنها و کاربردشان آشنا خواهید‬
‫شد‪.‬‬
‫نکته مهم آنستکه برای استفاده از این توابع ابتدا باید فایل سرآمد مربوط به آنها را نیز در‬
‫ابتدای برنامه خود اضافه نمایید ) با استفاده از ‪ .(#include‬هر فایل سرآمد شامل تعاریف‬
‫اولیه گروهی از توابع مرتبط با هم و داده های مربوط به آنها بوده و در استاندارد قدیمی‬
‫تر دارای پسوند ‪ .h‬می باشد)در استاندارد جدید پسوند این فایلها حذف شده است(‪.‬‬
‫برخی از این فایلهای سرآمد عبارتند از‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪ : stdio.h‬توابع ورودی و خروجی استاندارد‬
‫‪ : math.h‬توابع ریاضی‬
‫‪ : graphics.h‬توابع مربوط به عملیات گرافیکی‬
‫‪ : string.h‬توابع مربوط به کار با رشته ها‬


Slide 41

‫مبانی کامپیوتر و برنامه سازی‬
‫فصل هفتم ‪ :‬مفاهیم اولیه زبان ‪C‬‬
‫مدرس ‪ :‬نگین معروفی‬

‫‪ 7-1‬شناسه ها در ‪C‬‬
‫‪‬‬
‫‪‬‬

‫شناسه )‪ (identifier‬نامی است که به یک قسمت از برنامه مانند متغیر‪ ،‬تابع‪ ،‬ثابت و یا‬
‫‪ ...‬داده می شود‪.‬‬
‫در زبان ‪ C‬برای انتخاب شناسه ها فقط می توان از عالئم زیر استفاده کرد‪:‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫حروف انگلیسی کوچک و بزرگ )‪(A…Z a…z‬‬
‫ارقام )‪(0…9‬‬
‫عالمت خط پایین یا _‬

‫البته یک شناسه نمی تواند با یک رقم شروع شود‪.‬‬
‫چند شناسه مجاز‪ name2 ، average ، sum :‬و ‪student_average‬‬
‫چند شناسه غیرمجاز ‪ 2name‬و یا ‪student average‬‬
‫در برنامه نویسی امروزی پیشنهاد می شود بجای شناسه هایی همانند‬
‫‪ student_average‬از ‪ studentAverage‬استفاده گردد‪.‬‬
‫نکته مهم دیگری که باید به آن اشاره کرد آنستکه زبان ‪ C‬برخالف بسیاری از زبانهای دیگر‬
‫به کوچک و بزرگی حروف حساس است )‪ .(case sensitive‬در نتیجه شناسه های زیر با‬
‫یکدیگر متفاوتند ‪:‬‬
‫‪Sum ≠ sum ≠ SUM‬‬
‫آخرین نکته اینستکه در هنگام انتخاب شناسه نمی توانید از کلمات کلیدی که برای‬
‫منظورهای خاص در زبان ‪ C‬رزرو شده اند استفاده کنید‪.‬‬

C ‫ شناسه ها در‬7-1
: C ‫کلمات کلیدی در زبان‬
auto

break

case

char

const

continue

default

do

double

else

enum

extern

float

for

goto

if

int

long

register

return

short

signed

sizeof

static

struct

switch

typedef

union

unsigned

void

volatile

while

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫محدوده‬

‫اندازه )بیت(‬

‫توضیح‬

‫نوع داده‬

‫‪-128 to +127‬‬

‫‪8‬‬

‫کاراکتر‬

‫‪char‬‬

‫‪-32768 to +32767‬‬

‫‪16‬‬

‫عدد صحیح‬

‫‪int‬‬

‫‪3.4e-38 to 3.4e+38‬‬

‫‪32‬‬

‫عدد اعشاری‬

‫‪float‬‬

‫‪1.7e-308 to 1.7e+308‬‬

‫‪64‬‬

‫عدد اعشاری با‬
‫دقت مضاعف‬

‫‪double‬‬

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫‪‬‬

‫البته چند نکته مهم درمورد این جدول قابل ذکر است ‪:‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫اندازه ‪ int‬در محیطهای ‪ 16‬بیتی مانند ‪ DOS‬برابر ‪ 16‬بیت است‪ .‬اما در‬
‫محیطهای ‪ 32‬بیتی همانند ‪ Windows‬اندازه آن ‪ 32‬بیت می باشد که در‬
‫اینصورت محدوده ای برابر ‪ -2,147,483,648‬تا ‪ +2,147,483,647‬را‬
‫پوشش می دهد‪.‬‬
‫در بعضی از کامپایلرهای ‪ ،C‬نوع داده ‪ bool‬نیز وجود دارد که می تواند‬
‫یکی از مقادیر ‪)true‬درست( یا ‪) false‬غلط( را نشان دهد ‪ .‬اما در نسخه‬
‫های اولیه ‪ C‬از همان نوع داده صحیح یا ‪ int‬برای اینکار استفاده می‬
‫شد‪ .‬بدین صورت که ‪ 0‬نشاندهنده ‪ false‬و هر عدد غیر صفر )معموال ‪(1‬‬
‫نشاندهنده ‪ true‬است‪.‬‬
‫از آنجا که برای ذخیره سازی کاراکترها کد اسکی آنها ذخیره می گردد‪،‬‬
‫از یک متغیر کاراکتری یا ‪ char‬می توان بعنوان یک عدد صحیح کوچک نیز‬
‫استفاده کرد و اعمال ریاضی برروی آنها نیز مجاز است‪.‬‬

‫‪ 7-2‬انواع داده ها در ‪C‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫عالوه براین چندین اصالح کننده نیز وجود دارد که به ما اجازه می دهد نوع داده مورد‬
‫نظر را با دقت بیشتری برای نیازهای مختلف استفاده نماییم‪.‬‬
‫این اصالح کننده ها عبارتند از ‪short, long, signed, unsigned :‬‬
‫تمام این اصالح کننده ها می توانند به نوع داده ‪ int‬اعمال شوند و اثر آنها بستگی‬
‫به محیط دارد‪.‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫در یک محیط ‪16‬بیتی‪short int ،‬بازهم برابر ‪16‬بیت است ولی ‪ long int‬برابر‪32‬بیت می‬
‫باشد‪.‬‬
‫‪ unsigned int‬باعث می شود که یک عدد ‪ 16‬بیتی بدون عالمت داشته باشیم که بازه‬
‫بین ‪ 0‬تا ‪ 65535‬را پوشش می دهد‪ signed int .‬نیز همانند ‪ int‬معمولی بوده و تفاوتی‬
‫ندارد‪.‬‬
‫ترکیب این اصالح کننده ها نیز ممکن است‪ .‬مثال ‪ unsigned long int‬یک عدد ‪ 32‬بیتی‬
‫بدون عالمت است که بازه ‪ 0‬تا ‪ 4,294,967,295‬را پوشش می دهد‪.‬‬

‫برروی نوع داده ‪ char‬فقط اصالح کننده های ‪ signed‬و ‪ unsigned‬را می توان اعمال‬
‫کرد‪ .‬معموال از اصالح کننده ‪ unsigned‬وقتی استفاده می شود که قصد داشته‬
‫باشیم از ‪ char‬بعنوان یک عدد صحیح مثبت بین ‪ 0‬تا ‪ 255‬استفاده کنیم‪.‬‬
‫برروی نوع داده ‪ double‬تنها اصالح کننده ‪ long‬قابل اعمال است و دراینصورت عدد‬
‫اعشاری با ‪ 80‬بیت را خواهیم داشت که قادر است هر عددی در بازه ‪ 3.4e-4932‬تا‬
‫‪ 1.1e+4932‬را در خود نگاه دارد‪.‬‬

‫‪ 7-3‬تعریف متغیرها‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای تعریف متغیرها به شکل زیر عمل می کنیم‪:‬‬

‫;>‪ ‫که ‪ type‬یکی از نوع داده های گفته شده و ‪ variable-list‬لیستی از متغیرها است‬
‫که با کاما از یکدیگر جدا شده اند‪ .‬بعنوان مثال ‪:‬‬
‫;‪int sum‬‬
‫;‪float average‬‬
‫; ‪long int a, b, c‬‬
‫; ‪unsigned long int i, j, k‬‬
‫عالوه براین می توان در هنگام تعریف متغیر به آن مقدار اولیه نیز داد‪ .‬مثال ‪:‬‬
‫; ‪int d = 0‬‬
‫نكته مهم آنكه زبان ‪ C‬به متغیرها مقدار اولیه نمي دهد )حتي ‪ (0‬و برنامه نويس‬
‫خود بايد اينكار را صريحا انجام دهد‪ ،‬درغیر اينصورت مقدار اولیه متغیر‪ ،‬نامعین خواهد‬
‫بود‪.‬‬
‫تعریف متغیرها طبق اصول زبان ‪ C‬میتواند درهرجایی از برنامه صورت پذیرد‪ ،‬و‬
‫متغیرهای تعریف شده از همان خط به بعد قابل استفاده خواهد بود‪ .‬اما معموال‬
‫توصیه می گردد كه تعریف متغیرها در همان خط ابتدایی تابع و بالفاصله پس از {‬
‫صورت پذیرد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫‪‬‬
‫‪‬‬

‫ثابتها مقادیر ثابتی هستند كه مقدار آنها در حین اجرای برنامه تغییر نمی یابد‪ .‬ثابتها می توانند از‬
‫هریك از نوع داده های اصلی باشند‪.‬‬
‫ثوابت عددی صحیح ‪:‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫برای نمایش این دسته از ثوابت‪ ،‬از دنباله ای از ارقام بعالوه عالمت ‪ +‬یا ‪ -‬استفاده می كنیم‪ .‬بعنوان مثال‬
‫‪ -45‬و یا ‪ 3489‬ثوابت صحیح هستند‪.‬‬
‫در حالت عادی ‪ C‬هر عدد را در كوچكترین نوع داده ای كه می تواند قرار می دهد‪ .‬مثال عدد ‪ 85‬در یك‬
‫‪ int‬قرار می گیرد‪ ،‬اما عدد ‪ 145398‬در یك ‪ long int‬قرار خواهد گرفت‪.‬‬
‫اگر قصد دارید یك عدد كوچك بعنوان ‪ long‬محسوب گردد‪ ،‬می توانید از پسوند ‪ L‬در انتهای آن استفاده‬
‫می كنیم‪ .‬مثال ‪245L‬یك عدد ‪ long‬محسوب می شود‪.‬‬
‫;‪long int a = 20L‬‬
‫پسوند ‪ U‬در انتهای عدد نیز نشانه بدون عالمت بودن آن است‪.‬‬
‫نكته دیگر آنكه ‪ C‬به شما اجازه می دهد درصورت لزوم ثوابت صحیح خود را در مبنای ‪ 8‬یا ‪ 16‬نیز كه‬
‫از مبناهای متداول در برنامه نویسی هستند‪ ،‬بنویسید‪.‬‬
‫‪‬‬
‫‪‬‬

‫برای نوشتن عدد در مبنای ‪ 8‬باید آن را با ‪ 0‬آغاز كنید‪ ،‬مثال ‪ 0342‬یك عدد در منای ‪ 8‬محسوب می‬
‫گردد‪.‬‬
‫برای نوشتن یك عدد در مبنای ‪ 16‬باید آن را با ‪ 0x‬آغاز نمایید‪ ،‬مانند ‪.0x27A4‬‬

‫‪ 7-4‬ثوابت‬
‫ثوابت عددی اعشاری‬

‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫برای نمایش اعداد اعشاری‪ ،‬باید از نقطه اعشار استفاده كنیم‪ ،‬مانند ‪237.45‬‬
‫اما نكته جالب آنستكه می توانید از نماد علمی نیز برای نمایش اعداد‬
‫اعشاری استفاده كنید‪ .‬برای اینكار كافی است از حرف ‪ e‬برای نمایش قسمت‬
‫توان استفاده نمایید‪ .‬بعنوان مثال ‪:‬‬
‫‪-23.47 × 10 5 = -23.47e5‬‬
‫‪42.389 × 10 -3 = 42.389e-3‬‬
‫دقت كنید كه قسمت توان‪ ،‬حتما یك عدد صحیح است‪.‬‬
‫نكته جالب اینجاست كه برخالف مورد قبل‪ ،‬كامپایلر بطور پیش فرض داده های‬
‫اعشاری را از نوع ‪ double‬فرض می كند‪.‬چنانچه دوست دارید ثابت شما ازنوع‬
‫‪ float‬درنظر گرفته شود‪ ،‬در انتهای آن ‪ F‬قرار دهید‪ .‬ضمنا پسوند ‪ L‬نیز داده‬
‫اعشاری را از نوع ‪ long double‬درنظر می گیرد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫ثوابت كاراكتری ‪:‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫برای نشان دادن ثوابت كاراكتری‪ ،‬آنها را در داخل ' قرار می دهیم‪ .‬بعنوان مثال‬
‫'‪'A‬یك ثابت كاراكتری است‪.‬‬
‫; '‪char ch = 'S‬‬
‫دقت كنید كه همانطور كه قبال گفته شد‪ ،‬كد اسكی كاراكترها در متغیر ذخیره‬
‫می گردد‪ ،‬بنابراین می توان از آن بعنوان یك عدد صحیح نیز استفاده كرد‪ .‬نكته‬
‫مهم دیگر آنستكه به تفاوت عدد ‪ 5‬و كاراكتر '‪ '5‬دقت داشته باشید‪ .‬در حقیقت‬
‫'‪ '5‬برابر است با عدد ‪ 53‬كه همان كد اسكی آن است‪.‬‬
‫روش فوق‪ ،‬برای نمایش کاراکترهای قابل چاپ مناسب است‪ ،‬اما بعضی‬
‫كاراكترها مانند ‪ enter‬قابل نمایش نبوده و برای آنها شکل خاصی وجود ندارد‪.‬‬
‫در چنین مواردی‪ ،‬زبان ‪ C‬از ترکیب عالمت \ به همراه یک کاراکتر دیگر‪ ،‬برای‬
‫نمایش این قبیل کاراکترها استفاده می نماید‪ .‬بعنوان مثال‪ ،‬کاراکتر '‪ '\n‬نشان‬
‫دهنده خط جدید یا همان ‪ enter‬می باشد‪.‬‬
‫جدول صفحه بعد این قبیل کاراکترها و معادل آنها را نشان می دهد‪.‬‬

‫‪ 7-4‬ثوابت‬
‫نحوه نمایش در ‪C‬‬

‫کد اسکی‬

‫صدای بوق کامپیوتر‬

‫‪\a‬‬

‫‪7‬‬

‫حرکت به عقب ‪backspace‬‬

‫‪\b‬‬

‫‪8‬‬

‫شروع صفحه ‪form feed‬‬

‫‪\f‬‬

‫‪12‬‬

‫سطر جدید ‪line feed‬‬

‫‪\n‬‬

‫‪10‬‬

‫برگشت به ابتداي سطر ‪carriage return‬‬

‫‪\r‬‬

‫‪13‬‬

‫فاصله افقی ‪horizontal tab‬‬

‫‪\t‬‬

‫‪9‬‬

‫فاصله عمودی ‪vertical tab‬‬

‫‪\v‬‬

‫‪11‬‬

‫عالمت سوال‬

‫?\‬

‫‪63‬‬

‫عالمت '‬

‫'\‬

‫‪39‬‬

‫عالمت "‬

‫"\‬

‫‪34‬‬

‫عالمت \‬

‫\\‬

‫‪92‬‬

‫عالمت تهی‬

‫‪\0‬‬

‫‪0‬‬

‫نام کاراکتر‬

‫کد اسکی یک کاراکتر با ‪ 3‬رقم در مبنای ‪8‬‬

‫‪\000‬‬

‫کد اسکی یک کاراکتر با ‪ 2‬رقم در مبنای ‪16‬‬

‫‪\x00‬‬

‫‪ 7-4‬ثوابت‬
‫‪‬‬

‫ثوابت رشته ای ‪ C :‬عالوه بر ثوابت فوق‪ ،‬از یك ثابت دیگر بنام رشته نیز‬
‫حمایت می كند‪ .‬رشته‪ ،‬دنباله ای از كاراكترها است كه در داخل " قرار‬
‫می گیرند‪ .‬بعنوان مثال "‪ "this is a test‬یك رشته است‪ .‬دقت كنید كه '‪'a‬‬
‫یك كاراكتر است‪ ،‬اما "‪ "a‬یك رشته است كه فقط شامل یك كاراكتر می‬
‫باشد‪.‬‬

‫‪ 7-5‬عملگرها‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫عملگر‪ ،‬نمادی است كه به كامپایلر می گوید تا عملیات محاسباتی یا‬
‫منطقی خاصی را برروی یك یا چند عملوند‪ ،‬انجام دهد‪.‬‬
‫به عملگرهایی كه فقط یك عملوند دارند‪ ،‬عملگر یكانی می گوییم و‬
‫همواره عملگر در سمت چپ عملوند قرار می گیرد)مانند عدد ‪.(-125‬‬
‫اما عملگرهایی كه برروی دو عملوند اثر می كنند را عملگر دودویی‬
‫نامیده و عملگر را بین دو عملوند قرار می دهیم )مانند ‪.(23+86‬‬
‫هر ترکیب درستی از عملگرها و عملوندها را یک عبارت می نامیم‪.‬‬
‫‪ C‬از نقطه نظر عملگرها یك زبان بسیار قوی است‪ .‬این عملگرها به چند‬
‫دسته اصلی تقسیم می گردند كه آنها را به ترتیب بررسی می كنیم‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫این عملگرها‪ ،‬همان اعمال متداول ریاضی هستند كه در زبان ‪ C‬مورد استفاده‬
‫قرار می گیرند‪ .‬این اعمال عبارتند از ‪:‬‬

‫عمل‬

‫نوع‬

‫عملگر‬

‫منفی كردن عملوند سمت راست‬

‫یكانی‬

‫‪-‬‬

‫جمع دو عملوند‬

‫دودویی‬

‫‪+‬‬

‫تفریق دو عملوند‬

‫دودویی‬

‫‪-‬‬

‫ضرب دو عملوند‬

‫دودویی‬

‫*‬

‫تقسیم دو عملوند‬

‫دودویی‬

‫‪/‬‬

‫محاسبه باقیمانده تقسیم دو عملوند‬

‫دودویی‬

‫‪%‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬
‫‪‬‬

‫این عملگرهای برروی همه انواع داده های ‪ C‬عمل می كنند‪ ،‬بجز عملگر ‪ %‬كه فقط‬
‫برروی نوع داده های صحیح عمل می كند‪.‬‬
‫اما نكته مهمی كه باید به آن اشاره كرد‪ ،‬نحوه كار عملگر تقسیم برروی نوع داده های‬
‫مختلف است‪.‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫درصورتیكه هردو عملوند صحیح باشند‪ ،‬تقسیم بصورت صحیح بر صحیح انجام خواهد شد‪.‬‬
‫اگر یكی یا هر دو عملوند اعشاری باشند‪ ،‬تقسیم بصورت اعشاری انجام خواهد پذیرفت‪.‬‬
‫فرض كنید تعاریف زیر را داریم ‪:‬‬
‫; ‪int a,b‬‬
‫; ‪float c,d‬‬
‫; ‪a = 10 ; b = 4‬‬
‫;‪c = 8.2; d = 4.0‬‬
‫اكنون به نتایج عملیات زیر دقت كنید ‪:‬‬
‫‪a / b => 2‬‬
‫‪c / d => 2.05‬‬
‫‪a / d => 2.5‬‬
‫‪a / 4 => 2‬‬
‫چنانچه به آخرین مورد توجه كنید‪ ،‬متوجه می شوید كه از آنجا كه ‪a‬یك متغیر صحیح است و ‪4‬‬
‫نیز یك ثابت صحیح در نظر گرفته شده‪ ،‬درنتیجه تقسیم بصورت صحیح بر صحیح انجام گرفته‬
‫است‪ .‬چنانچه بخواهیم تقسیم بصورت اعشاری صورت پذیرد‪ ،‬به دو شكل می توانیم عمل‬
‫كنیم‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫برای اینکه عبارت تقسیم صفحه قبل بصورت اعشاری انجام شود‪ ،‬به دو روش‬
‫می توان عمل کرد‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫این عبارت را بصورت ‪ a / 4.0‬بنویسیم‪.‬‬
‫از عملگر قالب ریزی استفاده كنیم‪.‬‬

‫عملگر قالب ریزی می تواند یك نوع را به نوع دیگری تبدیل نماید‪ .‬شكل كلی آن‬
‫به شكل زیر است ‪:‬‬
‫>‪() ‫كه ‪ type‬نوع مورد نظر است كه قصد تبدیل عبارت ‪ expression‬به آن نوع را‬
‫داریم‪ .‬بعنوان مثال در مورد قبلی می توان به شكل زیر عمل كرد ‪:‬‬
‫‪(float) a / 4‬‬
‫در این حالت از كامپایلر خواسته ایم كه ابتدا عدد ‪ a‬را به اعشاری تبدیل كند‬
‫)البته بصورت موقت( و سپس آن را بر ‪ 4‬تقسیم نماید‪ ،‬كه مسلما حاصل‬
‫اعشاری خواهد بود‪.‬‬
‫بطوركلی هرگاه ثابتها و متغیرهایی از انواع مختلف در یك عبارت محاسباتی‬
‫داشته باشیم‪ ،‬كامپایلر ‪ C‬همه آنها را به یك نوع یكسان كه همان بزرگترین‬
‫عملوند موجود است تبدیل خواهد كرد‪ .‬بعنوان مثال به مورد صفحه بعد دقت‬
‫كنید ‪:‬‬

‫ عملگرهای محاسباتی‬7-5-1
char ch;
int i;

float f;
double d;
result = (ch / i)
int

+

(f *d)

(f+i)
float

double

double

int

-

double

double

float

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫اولویت عملگرها ‪ :‬در عبارتی که شامل چندین عملگر است‪ ،‬کدامیک در‬
‫ابتدا اعمال خواهد گردید‪.‬‬
‫اولویت عملگرهای محاسباتی از باال به پایین بشرح زیر است‪:‬‬
‫‪ ‬عملگر یکانی –‬
‫‪ ‬عملگرهای * و ‪ /‬و ‪%‬‬
‫‪ ‬عملگرهای ‪ +‬و –‬
‫چنانچه اولویت دو عملگر یکسان باشد‪ ،‬این عملگرها از چپ به راست‬
‫محاسبه خواهند شد‪.‬‬
‫چنانچه بخواهیم یک عمل با اولویت پایین زودتر انجام شود‪ ،‬باید از پرانتز‬
‫استفاده کنیم‪ .‬بنابراین اولویت عملگر پرانتز از همه موارد فوق‬
‫بیشتراست‪ .‬در مورد پرانتزهای متداخل‪ ،‬ابتدا پرانتز داخلی محاسبه‬
‫می شود؛ اما در مورد پرانتزهای هم سطح‪ ،‬ابتدا پرانتز سمت چپتر‬
‫محاسبه می گردد‪.‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫چند مثال در مورد اولویت عملگرها‬

‫ترتیب اجرای عملگرها‬

‫عبارت زبان ‪C‬‬

‫ابتدا عمل * و سپس عمل ‪+‬‬

‫‪b+c*d‬‬

‫ابتدا عمل ‪ +‬و سپس عمل *‬

‫‪(b + c) * d‬‬

‫ابتدا عمل ‪ /‬سپس عمل * و در انتها عمل ‪+‬‬

‫‪b+c/d*e‬‬

‫ابتدا عمل * سپس عمل ‪ /‬و در انتها عمل ‪+‬‬

‫)‪b + c / (d * e‬‬

‫‪ 7-5-1‬عملگرهای محاسباتی‬
‫‪‬‬

‫یک مثال کامل در مورد اولویت عملگرها‬

‫‪result = a + b * (f – (g + b) / d) – c * (a – d) / e‬‬
‫‪6‬‬

‫‪1‬‬
‫‪7‬‬

‫‪2‬‬

‫‪8‬‬

‫‪3‬‬
‫‪4‬‬
‫‪5‬‬
‫‪9‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫در زبان ‪ C‬برای انتساب چندین عملگر وجود دارد‪ .‬ساده ترین عملگر انتساب‪ ،‬همان عملگر =‬
‫است که در بسیاری از زبانها استفاده می شود‪ .‬بعنوان مثال ‪:‬‬
‫;‪a = 5‬‬
‫;‪b = c + 2 * d‬‬
‫این عملگر باعث می شود که عبارت سمت راست در عبارت سمت چپ قرار گیرد‪.‬‬
‫توجه کنید که مقدار سمت چپ باید عبارتی باشد که بتوان به آن یک مقدار را نسبت داد‬
‫)مانند یک متغیر( که به آن ‪ Lvalue‬گفته می شود‪ ،‬بنابراین یک ثابت نمی تواند در سمت چپ‬
‫قرار گیرد‪.‬‬
‫نکته دیگر اینکه اولویت عملگر = از عملگرهای ریاضی کمتر است و درنتیجه ابتدا آن عملیات‬
‫انجام شده و در پایان حاصل در عبارت سمت چپ ریخته می شود‪.‬‬
‫الزم به ذکر است که در هنگام انتساب‪ ،‬درصورت لزوم نوع عبارت سمت راست به نوع عبارت‬
‫سمت چپ تبدیل می شود‪ .‬مثال‪:‬‬
‫;‪int a‬‬
‫;‪a = 2.5 * 5.0‬‬
‫که دراینصورت عدد ‪ 12‬در ‪ a‬ذخیره خواهد شد‪.‬‬
‫شرکت پذیری این عملگر از راست به چپ می باشد‪ ،‬بدین معنا که چنانچه چندین عملگر‬
‫نسبت دهی داشته باشیم‪ ،‬این عملگرها از راست به چپ محاسبه می شوند‪ .‬مثال پس از‬
‫اجرای دستور زیر‪ ،‬مقدار هر ‪ 3‬متغیر برابر ‪ 10‬خواهد شد‪.‬‬
‫;‪a = b = c = 10‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬

‫نکته جالب درمورد زبان ‪ C‬آنستکه دارای یک سری عملگرهای انتساب‬
‫خالصه شده است که باعث می شوند در بعضی موارد بتوانیم عبارات‬
‫کوتاهتری را بنویسیم‪ .‬این عملگرها عبارتند از ‪:‬‬
‫عملگرد‬

‫مثال‬

‫عبارت انتساب معادل‬

‫‪++‬‬

‫;‪a ++‬‬

‫;‪a = a + 1‬‬

‫‪--‬‬

‫;‪a --‬‬

‫;‪a = a – 1‬‬

‫=‪+‬‬

‫;‪a += 5‬‬

‫;‪a = a + 5‬‬

‫=‪-‬‬

‫;‪a -= 8‬‬

‫;‪a= a – 8‬‬

‫=*‬

‫;‪a *= 10‬‬

‫;‪a= a * 10‬‬

‫=‪/‬‬

‫;‪a /= 2‬‬

‫;‪a = a / 2‬‬

‫=‪%‬‬

‫;‪a %= 10‬‬

‫;‪a = a % 10‬‬

‫‪ 7-5-2‬عملگرهای انتساب‬
‫‪‬‬
‫‪‬‬

‫عملگر اول و دوم‪ ،‬عملگرهای یکانی هستند که بترتیب عملگر افزایش و عملگر کاهش‬
‫نامیده می شوند‪.‬‬
‫نکته جالب آنستکه این دو عملگر به دوصورت مورد استفاده قرار می گیرند‪.‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫در حالتی که از دستور ;‪ a ++‬استفاده شود به آن پس افزایش می گویند و بدین معناست که‬
‫ابتدا از مقدار فعلی ‪ a‬در عبارت موردنظر استفاده کن و سپس آن را افزایش بده‪.‬‬
‫اما دستور ;‪ ++ a‬که به آن پیش افزایش گفته می شود‪ ،‬ابتدا ‪ a‬را افزایش داده و سپس از آن‬
‫در عبارت استفاده می کند‪.‬‬
‫به برنامه زیر دقت کنید‪:‬‬

‫>‪#include ‫{ )(‪void main‬‬
‫; ‪int a ,b‬‬
‫;‪a=5‬‬
‫;‪b = a ++‬‬
‫;)‪printf(“a=%d and b=%d \n”,a,b‬‬
‫;‪a=5‬‬
‫;‪b = ++ a‬‬
‫;)‪printf(“a=%d and b=%d \n”,a,b‬‬
‫}‬
‫‪a=6 b=5‬‬
‫‪a=6 b=6‬‬

‫‪ 7-5-3‬عملگرهای مقایسه ای‬
‫‪‬‬

‫‪‬‬

‫این عملگرها دو عبارت را بایکدیگر مقایسه کرده و نتیجه را باز می گردانند‪.‬‬
‫نتیجه می تواند درست )‪ (true‬یا غلط )‪ (false‬باشد‪.‬‬
‫نتیجه این عملگرها یک عدد صحیح است که درصورت درست بودن ‪ 1‬و‬
‫درصورت غلط بودن ‪ 0‬باز می گردانند‪ .‬این عملگرها عبارتند از‪:‬‬
‫عملگر‬

‫مفهوم عملگر‬

‫مثال‬

‫<‬

‫بزرگتر )<(‬

‫‪a>b‬‬

‫>‬

‫کوچکتر )>(‬

‫‪a
‫=<‬

‫بزرگتر یا مساوی )≤(‬

‫‪a >= b‬‬

‫=>‬

‫کوچکتر یا مساوی )≥(‬

‫‪a <= b‬‬

‫==‬

‫مساوی )=(‬

‫‪a == b‬‬

‫=!‬

‫نامساوی )≠(‬

‫‪a != b‬‬

‫‪ 7-5-3‬عملگرهای مقایسه ای‬
‫‪‬‬

‫‪‬‬

‫نکته مهمی که باید به آن دقت کرد عملگر مساوی )==( است‪ ،‬چرا که یک‬
‫اشتباه بسیار متداول برنامه نویسان ‪ C‬استفاده اشتباه از عملگر انتساب‬
‫)=( بجای عملگر تساوی )==( است که باعث ایجاد خطا در برنامه می‬
‫شود‪.‬‬
‫اولویت این عملگرها از باال به پایین بشرح زیر است‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫عملگرهای <‪ <= ، > ،‬و =>‬
‫عملگرهای == و =!‬

‫الزم بذکر است که در هنگام مساوی بودن اولویت چند عملگر‪ ،‬این عملگرها‬
‫از چپ به راست محاسبه می گردند‪.‬‬

‫‪ 7-5-4‬عملگرهای منطقی‬
‫‪‬‬

‫این عملگرها به شما اجازه می دهند که شرطهای ساده ای را که با‬
‫استفاده از عملگرهای مقایسه ای ایجاد شده اند را با یکدیگر ترکیب نموده‬
‫و شرطهای پیچیده تری را بسازید‪ .‬این عملگرها عبارتند از ‪:‬‬
‫مثال‬

‫عملگر‬

‫مفهوم عملگر‬

‫نحوه کار‬

‫&&‬

‫‪ AND‬منطقی‬

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

‫‪a>0 && sw==1‬‬

‫||‬

‫‪ OR‬منطقی‬

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

‫‪a<=100 || b!=0‬‬

‫!‬

‫‪ NOT‬منطقی‬

‫اگر عملوند درست باشد‪ ،‬نادرست و‬
‫اگر نادرست باشد‪ ،‬درست برمی‬
‫گرداند‪.‬‬

‫)‪! (a==1 || b<10‬‬

‫‪ 7-5-5‬عملگر شرطی‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫گاهی الزم است که ابتدا یک شرط بررسی شده و سپس برمبنای نتیجه )درست یا نادرست بودن آن( یکی‬
‫از دو عبارت ممکن بازگردانده شود‪ .‬برای اینکار می توان از یک عملگر ‪3‬تایی )با ‪ 3‬عملوند( بنام عملگر‬
‫شرطی استفاده نمود‪.‬‬
‫شکل کلی این عملگر بصورت زیر است‪:‬‬
‫>عبارت‪> :<2‬عبارت‪> ?<1‬شرط<‬
‫نحوه کار بدینصورت است که درصورت درست بودن شرط‪ ،‬عبارت‪ 1‬و در غیراینصورت عبارت ‪ 2‬بازگردانده می‬
‫شود‪.‬‬
‫به عنوان مثال به دستور زیر توجه کنید‪:‬‬
‫که این عبارت معادل دستور زیر است‪:‬‬

‫‪‬‬

‫;‪a = (k<10) ? 100 : 50‬‬
‫;‪if (k<10) a=100‬‬
‫;‪else a=50‬‬

‫البته این عبارت به شکلهای پیچیده نیز می تواند مورد استفاده قرار گیرد‪ .‬مثال ‪:‬‬
‫;‪c += (a>0 && a<10) ? ++a : a/b‬‬
‫که معادل است با ‪:‬‬
‫{ )‪if (a>0 && a<10‬‬
‫;‪a= a + 1‬‬
‫;‪c = c + a‬‬
‫}‬
‫;‪else c = c + a/b‬‬

‫‪ 7-5-6‬اولویت عملگرها‬
‫عملگر‬

‫اولویت‬

‫شرکت پذیری‬

‫‪1‬‬

‫)(‬

‫از چپ به راست‬

‫‪2‬‬

‫‪- + ! -- ++‬‬

‫از راست به چپ‬

‫‪3‬‬

‫‪* / %‬‬

‫از چپ به راست‬

‫‪4‬‬

‫‪+ -‬‬

‫از چپ به راست‬

‫‪5‬‬

‫>> <<‬

‫از چپ به راست‬

‫‪6‬‬

‫>= > <= <‬

‫از چپ به راست‬

‫‪7‬‬

‫=! ==‬

‫از چپ به راست‬

‫‪8‬‬

‫&&‬

‫از چپ به راست‬

‫‪9‬‬

‫||‬

‫از چپ به راست‬

‫‪10‬‬

‫‪?:‬‬

‫از راست به چپ‬

‫‪11‬‬

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

‫از راست به چپ‬

‫‪12‬‬

‫‪,‬‬

‫از چپ به راست‬

‫‪ 7-6‬خواندن و نمایش اطالعات‬
‫‪‬‬

‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫همانطور كه قبال نیز گفته شد‪ ،‬یكی از اهداف زبان ‪ C‬قابل حمل بودن آن‬
‫است‪ .‬بهمین منظور سعی شده است كه از دستوراتی كه ممكن است‬
‫وابسته به ماشین خاصی باشد‪ ،‬اجتناب گردد‪.‬‬
‫بهمین دلیل زبان ‪ C‬برخالف سایر زبانها دارای هیچ دستوری برای‬
‫خواندن از ورودی و یا نوشتن در خروجی نیست‪.‬‬
‫اما در عوض دارای تعدادی تابع )زیربرنامه( استاندارد می باشد كه تقریبا‬
‫تمامی كامپایلرها از آنها حمایت می كنند‪.‬‬
‫این كار به كامپایلر این امكان را می دهد كه بر حسب نوع سخت افزار‬
‫موردنظر‪ ،‬توابع ورودی و خروجی را طراحی نماید‪.‬‬
‫این توابع در یك فایل سرآمد بنام ‪ stdio.h‬تعریف شده اند و بنابراین قبل‬
‫ازاینكه بتوانید از این توابع استفاده نمایید‪ ،‬باید این فایل را نیز با استفاده‬
‫از ‪ #include‬در برنامه خود بگنجانید‪.‬‬

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫برای نمایش اطالعات در خروجی از تابع ‪ printf‬استفاده می شود‪.‬‬
‫این تابع رشته موردنظر شما را به خروجی استاندارد )كه در حالت‬
‫عادی همان صفحه نمایش یا مانیتور است( می فرستد‪ .‬شكل كلی این‬
‫تابع بصورت زیر است‪:‬‬
‫; )>لیست متغیرها< ‪> ,‬رشته كنترلی<(‪printf‬‬
‫رشته كنترلی همان متنی است كه قصد چاپ آن را داریم‪ ،‬با ذكر این‬
‫نكته كه در قسمتهایی كه باید مقدار یك متغیر چاپ شود‪ ،‬از یك‬
‫مشخصه تبدیل استفاده می شود‪ .‬هر مشخصه تبدیل از یك عالمت ‪%‬‬
‫بعالوه یك كاراكتر كه نوع متغیر مورد نظر را نشان می دهد تشكیل می‬
‫گردد‪.‬‬
‫لیست متغیرها نیز همان متغیرهایی هستند كه قصد چاپ آنها را داریم‪.‬‬
‫این متغیرها باید بترتیب قرار گرفته و با كاما )‪ (,‬از یكدیگر جدا شوند‪.‬‬

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫مشخصه تبدیل‬

‫مفهوم‬

‫‪%c‬‬

‫كاراكتر‬

‫‪%d‬‬

‫عدد صحیح در مبنای ‪10‬‬

‫‪%f‬‬

‫عدد اعشاری بدون نماد علمی‬

‫‪%e‬‬

‫عدد اعشاری با نماد علمی‬

‫‪%g‬‬

‫عدد اعشاری با حالت كوتاهتر بین ‪ e‬و ‪f‬‬

‫‪%s‬‬

‫رشته‬

‫‪%ld‬‬

‫عدد صحیح بزرگ‬

‫‪%lf %le %lg‬‬

‫عدد اعشاری بزرگ‬

‫‪%o‬‬

‫عدد صحیح در مبنای ‪8‬‬

‫‪%x‬‬

‫عدد صحیحی در مبنای ‪16‬‬

‫‪%u‬‬

‫عدد صحیح بدون عالمت‬

‫ تابع نمایش در خروجی‬7-6-1
#include
void main() {
int age = 20;
floate average = 18.23;
printf("You are %d years old and your average is %f \n",age,average);
}
You are 20 years old and your average is 18.230000

‫‪ 7-6-1‬تابع نمایش در خروجی‬
‫‪‬‬
‫‪‬‬

‫برای کنترل نحوه چاپ اعداد می توانید از مشخصه طول میدان استفاده‬
‫کنید‪.‬‬
‫مشخصه طول میدان برای اعداد به شكل زیر استفاده می شود‪:‬‬
‫‪ ‬برای اعداد صحیح از ‪ %nd‬استفاده می كنیم كه ‪ n‬تعداد ارقام را نشان‬
‫می دهد )مثال ‪ .(%3d‬در اینصورت برای هر متغیر ‪ n‬رقم درنظر گرفته‬
‫می شود‪ .‬اگر اندازه عدد از ‪ n‬كوچكتر باشد‪ ،‬به سمت چپ آن فضای‬
‫خالی اضافه می شود و اگر اندازه عدد بیش از ‪ n‬رقم باشد‪ ،‬طول میدان‬
‫نادیده گرفته شده و عدد بطور كامل چاپ می شود‪.‬‬
‫‪ ‬برای اعداد اعشاری از ‪ %n.mf‬استفاده می كنیم كه ‪ n‬اندازه كل عدد‬
‫)شامل عالمت ممیز( و ‪ m‬تعداد ارقام اعشار است )مثال ‪ .(%5.2f‬در‬
‫صورتیكه تعداد ارقام اعشاری عدد موردنظر از ‪ m‬بیشتر باشد‪ ،‬عدد به ‪m‬‬
‫عدد اعشار گرد می شود و در صورتیكه از ‪ m‬كمتر باشد‪ ،‬در سمت‬
‫راست آن ‪ 0‬قرار داده می شود‪.‬‬

‫‪ 7-6-2‬تابع خواندن از ورودی‬
‫‪‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای خواندن اطالعات از ورودی از تابع ‪ scanf‬استفاده می شود‪.‬‬
‫این تابع اطالعات را ازورودی استاندارد )معموال صفحه كلید( خوانده و در‬
‫متغیرهای تعیین شده قرار می دهد‪.‬‬
‫شكل كلی این تابع بصورت زیر است‪:‬‬
‫; )>لیست آدرسهای متغیرها< ‪> ,‬رشته كنترلی<(‪scanf‬‬
‫همانطور كه می بینید نحوه احضار تابع ‪ scanf‬نیز مشابه ‪ printf‬است‪ .‬تنها‬
‫تفاوت در آن است كه در ‪ scanf‬باید لیست آدرسهای متغیرها ارسال شود‪.‬‬
‫مبحث مربوط به آدرسها در فصول بعدی بررسی خواهد شد ولی در حال حاضر‬
‫بخاطر بسپارید كه برای بدست آوردن آدرس یك متغیر از عالمت & استفاده می‬
‫كنیم‪ .‬بعنوان مثال ‪ &age‬بمعنای آدرس متغیر ‪ age‬است‪.‬‬
‫بطور كلی در ‪ C‬قدیمی هرگاه كه یك تابع دارای پارامترهای خروجی بود )یعنی‬
‫پارامترهایی كه یك مقدار را باز می گرداندند( از آدرس متغیرها استفاده می‬
‫شد كه امروزه این مسئله وجود ندارد‪.‬‬

‫ تابع خواندن از ورودی‬7-6-2
#include
void main() {
int age;
float average ;
printf("Please enter your age and average : ");
scanf("%d %f",&age,&average);
printf("You are %d years old and your average is %5.2f \n",age,average);
}

Please enter your age and average : 19 16.72
You are 19 years old and your average is 16.72

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫زبان ‪ C++‬یک زبان شی گرا است‪ ،‬بهمین دلیل در این زبان برای ورودی‬
‫و خروجی از اشیاء بجای توابع استفاده می گردد‪.‬‬
‫از آنجا که امروزه معموال برنامه نویسان ‪ C‬از کامپایلرهای ‪ C++‬استفاده‬
‫می کنند‪ ،‬می توانند از اشیای ورودی و خروجی آن نیز استفاده کنند‪.‬‬
‫اینکار در بین بسیاری از برنامه نویسان ‪ C‬متداول است‪ ،‬بهمین دلیل ما‬
‫در اینجا نحوه کار با اشیای خواندن و نوشتن در ‪ C++‬را بطور مقدماتی‬
‫توضیح می دهیم؛ گرچه توضیح کامل این موارد نیاز به آشنایی با شی‬
‫گرایی و زبان ‪ C++‬دارد‪.‬‬
‫قبل از هرچیز الزم به ذکر است که کلیه اشیای مربوط به ورودی و‬
‫خروجی در فایل سرآمدی بنام ‪ iostream.h‬تعیریف شده اند‪ ،‬بنابراین‬
‫ابتدا باید این فایل به برنامه توسط دستور ‪ #include‬الحاق گردد‪.‬‬

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫زبان ‪ C++‬برای نمایش اطالعات از یک شیئ بنام ‪ cout‬استفاده می نماید‪.‬‬
‫برای ارسال اطالعات مورد نظر برای چاپ به ‪ cout‬باید از عملگر درج در جریان‬
‫یا >> استفاده نماییم‪ .‬بعنوان مثال ‪:‬‬
‫; ” ‪cout >> “Please enter your name:‬‬
‫و یا مثال دیگر ‪:‬‬
‫;‪int a = 10‬‬
‫;‪float b = 2.86‬‬
‫;‪cout << a‬‬
‫;‪cout << b‬‬
‫نکته جالبی که در این مثالها دیده می شود‪ ،‬آنستکه برخالف تابع ‪ printf‬هیچ‬
‫نیازی به مشخص کردن نوع متغیری که قصد چاپ آن را داریم نیست و خود‬
‫شئ ‪ cout‬نوع آن را تشخیص می دهد‪.‬‬
‫عالوه براین می توان چندین عملگر درج در جریان را با یکدیگر الحاق کرد و‬
‫چندین متغیر را با یک دستور چاپ کرد‪.‬‬

C++ ‫ ورودی و خروجی اطالعات در‬7-6-3
#include
void main() {
int age = 20;
floate average = 18.23;
cout >> “You are ” >> age >> “ years old and your average is ” >> average ;
}

You are 20 years old and your average is 18.230000

‫‪ 7-6-3‬ورودی و خروجی اطالعات در ‪C++‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪‬‬

‫برای دریافت اطالعات از کاربر‪ ،‬از شئ دیگری بنام ‪ cin‬استفاده می شود‪.‬‬
‫برای ارسال متغیر مورد نظر به ‪ cin‬باید از عملگر استخراج از جریان یا <<‬
‫استفاده نماییم‪ .‬بعنوان مثال‪:‬‬
‫;‪int a‬‬
‫;‪cin >> a‬‬
‫بازهم همانطور که می بینید نیازی به تعیین نوع متغیر موردنظر نیست و خود‬
‫شئ ‪ cin‬نوع متغیر را بطور اتوماتیک تشخیص داده و داده ای از همان نوع را از‬
‫کاربر دریافت و در متغیر مورد نظر قرار می دهد‪.‬‬
‫عملگرهای استخراج از جریان را نیز می توان با یکدیگر الحاق کرد‪.‬‬
‫برای رفتن به خط بعد در شئ ‪ cout‬می توان از دستکاری کننده ‪ endl‬استفاده‬
‫کرد‪ .‬مثال در دستور زیر پس از چاپ پیغام‪ ،‬مکان نما به خط بعد منتقل می‬
‫شود‪:‬‬
‫;‪cout >> “List of students : “ >> endl‬‬
‫البته دستکاری کننده های متعدد دیگری نیز ازجمله موارد مربوط به تعیین طول‬
‫میدان و نحوه چاپ مقادیر وجود دارد که توضیح آنها نیاز به یک مبحث مستقل‬
‫دارد‪.‬‬

C++ ‫ ورودی و خروجی اطالعات در‬7-6-3
#include
void main() {
int age;
float average ;
cout << "Please enter your age and average : " ;
cin >> age >> average ;
cout << "You are " << age << "years old and your average is " << average;
}

Please enter your age and average : 19 16.72
You are 19 years old and your average is 16.72

‫‪ 7-7‬توابع کتابخانه ای‬
‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫‪‬‬

‫همانطور که قبال نیز گفته شد‪ ،‬زبان ‪ C‬از زیر برنامه ها نیز حمایت می کند‪ .‬هر زیر برنامه‬
‫در ‪ C‬یک تابع نامیده می شود‪ .‬تا کنون با توابعی همچون ‪ main‬و یا ‪ printf‬و ‪ scanf‬آشنا‬
‫شده ایم‪.‬‬
‫معموال عرضه کنندگان کامپایلرها و یا سایر فروشندگان نرم افزار‪ ،‬برخی از توابع عمومی‬
‫را که ممکن است مورد نیاز جمع کثیری از برنامه نویسان مختلف باشد را در قالب‬
‫کتابخانه ای از توابع در اختیار برنامه نویسان می گذارند‪ .‬بعضی از این توابع کتابخانه ای‬
‫مانند ‪ printf‬و ‪ scanf‬بصورت استاندارد درآمده و توسط عرضه کنندگان مختلف ارائه می‬
‫شوند‪.‬‬
‫در کامپایلر عرضه شده توسط شرکت بورلند )‪ (Borland C++ 3.1‬نیز کتابخانه های‬
‫متعددی از توابع برای شما عرضه شده اند که بتدریج با آنها و کاربردشان آشنا خواهید‬
‫شد‪.‬‬
‫نکته مهم آنستکه برای استفاده از این توابع ابتدا باید فایل سرآمد مربوط به آنها را نیز در‬
‫ابتدای برنامه خود اضافه نمایید ) با استفاده از ‪ .(#include‬هر فایل سرآمد شامل تعاریف‬
‫اولیه گروهی از توابع مرتبط با هم و داده های مربوط به آنها بوده و در استاندارد قدیمی‬
‫تر دارای پسوند ‪ .h‬می باشد)در استاندارد جدید پسوند این فایلها حذف شده است(‪.‬‬
‫برخی از این فایلهای سرآمد عبارتند از‪:‬‬
‫‪‬‬
‫‪‬‬

‫‪‬‬
‫‪‬‬

‫‪ : stdio.h‬توابع ورودی و خروجی استاندارد‬
‫‪ : math.h‬توابع ریاضی‬
‫‪ : graphics.h‬توابع مربوط به عملیات گرافیکی‬
‫‪ : string.h‬توابع مربوط به کار با رشته ها‬