مبانی کامپیوتر و برنامه سازی فصل هفتم : مفاهیم اولیه زبان C مدرس : نگین معروفی 7-1 شناسه ها در C شناسه ) (identifier نامی.
Download ReportTranscript مبانی کامپیوتر و برنامه سازی فصل هفتم : مفاهیم اولیه زبان 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توابع مربوط به کار با رشته ها
مبانی کامپیوتر و برنامه سازی
فصل هفتم :مفاهیم اولیه زبان 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تعریف متغیرها
برای تعریف متغیرها به شکل زیر عمل می کنیم:
;>
که با کاما از یکدیگر جدا شده اند .بعنوان مثال :
;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بنویسیم.
از عملگر قالب ریزی استفاده كنیم.
عملگر قالب ریزی می تواند یك نوع را به نوع دیگری تبدیل نماید .شكل كلی آن
به شكل زیر است :
>(
داریم .بعنوان مثال در مورد قبلی می توان به شكل زیر عمل كرد :
(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
; 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تعریف متغیرها
برای تعریف متغیرها به شکل زیر عمل می کنیم:
;>
که با کاما از یکدیگر جدا شده اند .بعنوان مثال :
;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بنویسیم.
از عملگر قالب ریزی استفاده كنیم.
عملگر قالب ریزی می تواند یك نوع را به نوع دیگری تبدیل نماید .شكل كلی آن
به شكل زیر است :
>(
داریم .بعنوان مثال در مورد قبلی می توان به شكل زیر عمل كرد :
(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
; 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تعریف متغیرها
برای تعریف متغیرها به شکل زیر عمل می کنیم:
;>
که با کاما از یکدیگر جدا شده اند .بعنوان مثال :
;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بنویسیم.
از عملگر قالب ریزی استفاده كنیم.
عملگر قالب ریزی می تواند یك نوع را به نوع دیگری تبدیل نماید .شكل كلی آن
به شكل زیر است :
>(
داریم .بعنوان مثال در مورد قبلی می توان به شكل زیر عمل كرد :
(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
; 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تعریف متغیرها
برای تعریف متغیرها به شکل زیر عمل می کنیم:
;>
که با کاما از یکدیگر جدا شده اند .بعنوان مثال :
;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بنویسیم.
از عملگر قالب ریزی استفاده كنیم.
عملگر قالب ریزی می تواند یك نوع را به نوع دیگری تبدیل نماید .شكل كلی آن
به شكل زیر است :
>(
داریم .بعنوان مثال در مورد قبلی می توان به شكل زیر عمل كرد :
(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
; 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تعریف متغیرها
برای تعریف متغیرها به شکل زیر عمل می کنیم:
;>
که با کاما از یکدیگر جدا شده اند .بعنوان مثال :
;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بنویسیم.
از عملگر قالب ریزی استفاده كنیم.
عملگر قالب ریزی می تواند یك نوع را به نوع دیگری تبدیل نماید .شكل كلی آن
به شكل زیر است :
>(
داریم .بعنوان مثال در مورد قبلی می توان به شكل زیر عمل كرد :
(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
; 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تعریف متغیرها
برای تعریف متغیرها به شکل زیر عمل می کنیم:
;>
که با کاما از یکدیگر جدا شده اند .بعنوان مثال :
;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بنویسیم.
از عملگر قالب ریزی استفاده كنیم.
عملگر قالب ریزی می تواند یك نوع را به نوع دیگری تبدیل نماید .شكل كلی آن
به شكل زیر است :
>(
داریم .بعنوان مثال در مورد قبلی می توان به شكل زیر عمل كرد :
(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
; 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تعریف متغیرها
برای تعریف متغیرها به شکل زیر عمل می کنیم:
;>
که با کاما از یکدیگر جدا شده اند .بعنوان مثال :
;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بنویسیم.
از عملگر قالب ریزی استفاده كنیم.
عملگر قالب ریزی می تواند یك نوع را به نوع دیگری تبدیل نماید .شكل كلی آن
به شكل زیر است :
>(
داریم .بعنوان مثال در مورد قبلی می توان به شكل زیر عمل كرد :
(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
; 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تعریف متغیرها
برای تعریف متغیرها به شکل زیر عمل می کنیم:
;>
که با کاما از یکدیگر جدا شده اند .بعنوان مثال :
;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بنویسیم.
از عملگر قالب ریزی استفاده كنیم.
عملگر قالب ریزی می تواند یك نوع را به نوع دیگری تبدیل نماید .شكل كلی آن
به شكل زیر است :
>(
داریم .بعنوان مثال در مورد قبلی می توان به شكل زیر عمل كرد :
(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
; 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تعریف متغیرها
برای تعریف متغیرها به شکل زیر عمل می کنیم:
;>
که با کاما از یکدیگر جدا شده اند .بعنوان مثال :
;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بنویسیم.
از عملگر قالب ریزی استفاده كنیم.
عملگر قالب ریزی می تواند یك نوع را به نوع دیگری تبدیل نماید .شكل كلی آن
به شكل زیر است :
>(
داریم .بعنوان مثال در مورد قبلی می توان به شكل زیر عمل كرد :
(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
; 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تعریف متغیرها
برای تعریف متغیرها به شکل زیر عمل می کنیم:
;>
که با کاما از یکدیگر جدا شده اند .بعنوان مثال :
;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بنویسیم.
از عملگر قالب ریزی استفاده كنیم.
عملگر قالب ریزی می تواند یك نوع را به نوع دیگری تبدیل نماید .شكل كلی آن
به شكل زیر است :
>(
داریم .بعنوان مثال در مورد قبلی می توان به شكل زیر عمل كرد :
(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
; 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تعریف متغیرها
برای تعریف متغیرها به شکل زیر عمل می کنیم:
;>
که با کاما از یکدیگر جدا شده اند .بعنوان مثال :
;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بنویسیم.
از عملگر قالب ریزی استفاده كنیم.
عملگر قالب ریزی می تواند یك نوع را به نوع دیگری تبدیل نماید .شكل كلی آن
به شكل زیر است :
>(
داریم .بعنوان مثال در مورد قبلی می توان به شكل زیر عمل كرد :
(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
; 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تعریف متغیرها
برای تعریف متغیرها به شکل زیر عمل می کنیم:
;>
که با کاما از یکدیگر جدا شده اند .بعنوان مثال :
;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بنویسیم.
از عملگر قالب ریزی استفاده كنیم.
عملگر قالب ریزی می تواند یك نوع را به نوع دیگری تبدیل نماید .شكل كلی آن
به شكل زیر است :
>(
داریم .بعنوان مثال در مورد قبلی می توان به شكل زیر عمل كرد :
(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
; 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تعریف متغیرها
برای تعریف متغیرها به شکل زیر عمل می کنیم:
;>
که با کاما از یکدیگر جدا شده اند .بعنوان مثال :
;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بنویسیم.
از عملگر قالب ریزی استفاده كنیم.
عملگر قالب ریزی می تواند یك نوع را به نوع دیگری تبدیل نماید .شكل كلی آن
به شكل زیر است :
>(
داریم .بعنوان مثال در مورد قبلی می توان به شكل زیر عمل كرد :
(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
; 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تعریف متغیرها
برای تعریف متغیرها به شکل زیر عمل می کنیم:
;>
که با کاما از یکدیگر جدا شده اند .بعنوان مثال :
;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بنویسیم.
از عملگر قالب ریزی استفاده كنیم.
عملگر قالب ریزی می تواند یك نوع را به نوع دیگری تبدیل نماید .شكل كلی آن
به شكل زیر است :
>(
داریم .بعنوان مثال در مورد قبلی می توان به شكل زیر عمل كرد :
(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
; 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تعریف متغیرها
برای تعریف متغیرها به شکل زیر عمل می کنیم:
;>
که با کاما از یکدیگر جدا شده اند .بعنوان مثال :
;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بنویسیم.
از عملگر قالب ریزی استفاده كنیم.
عملگر قالب ریزی می تواند یك نوع را به نوع دیگری تبدیل نماید .شكل كلی آن
به شكل زیر است :
>(
داریم .بعنوان مثال در مورد قبلی می توان به شكل زیر عمل كرد :
(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
; 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تعریف متغیرها
برای تعریف متغیرها به شکل زیر عمل می کنیم:
;>
که با کاما از یکدیگر جدا شده اند .بعنوان مثال :
;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بنویسیم.
از عملگر قالب ریزی استفاده كنیم.
عملگر قالب ریزی می تواند یك نوع را به نوع دیگری تبدیل نماید .شكل كلی آن
به شكل زیر است :
>(
داریم .بعنوان مثال در مورد قبلی می توان به شكل زیر عمل كرد :
(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
; 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تعریف متغیرها
برای تعریف متغیرها به شکل زیر عمل می کنیم:
;>
که با کاما از یکدیگر جدا شده اند .بعنوان مثال :
;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بنویسیم.
از عملگر قالب ریزی استفاده كنیم.
عملگر قالب ریزی می تواند یك نوع را به نوع دیگری تبدیل نماید .شكل كلی آن
به شكل زیر است :
>(
داریم .بعنوان مثال در مورد قبلی می توان به شكل زیر عمل كرد :
(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
; 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تعریف متغیرها
برای تعریف متغیرها به شکل زیر عمل می کنیم:
;>
که با کاما از یکدیگر جدا شده اند .بعنوان مثال :
;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بنویسیم.
از عملگر قالب ریزی استفاده كنیم.
عملگر قالب ریزی می تواند یك نوع را به نوع دیگری تبدیل نماید .شكل كلی آن
به شكل زیر است :
>(
داریم .بعنوان مثال در مورد قبلی می توان به شكل زیر عمل كرد :
(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
; 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تعریف متغیرها
برای تعریف متغیرها به شکل زیر عمل می کنیم:
;>
که با کاما از یکدیگر جدا شده اند .بعنوان مثال :
;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بنویسیم.
از عملگر قالب ریزی استفاده كنیم.
عملگر قالب ریزی می تواند یك نوع را به نوع دیگری تبدیل نماید .شكل كلی آن
به شكل زیر است :
>(
داریم .بعنوان مثال در مورد قبلی می توان به شكل زیر عمل كرد :
(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
; 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تعریف متغیرها
برای تعریف متغیرها به شکل زیر عمل می کنیم:
;>
که با کاما از یکدیگر جدا شده اند .بعنوان مثال :
;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بنویسیم.
از عملگر قالب ریزی استفاده كنیم.
عملگر قالب ریزی می تواند یك نوع را به نوع دیگری تبدیل نماید .شكل كلی آن
به شكل زیر است :
>(
داریم .بعنوان مثال در مورد قبلی می توان به شكل زیر عمل كرد :
(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
; 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تعریف متغیرها
برای تعریف متغیرها به شکل زیر عمل می کنیم:
;>
که با کاما از یکدیگر جدا شده اند .بعنوان مثال :
;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بنویسیم.
از عملگر قالب ریزی استفاده كنیم.
عملگر قالب ریزی می تواند یك نوع را به نوع دیگری تبدیل نماید .شكل كلی آن
به شكل زیر است :
>(
داریم .بعنوان مثال در مورد قبلی می توان به شكل زیر عمل كرد :
(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
; 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تعریف متغیرها
برای تعریف متغیرها به شکل زیر عمل می کنیم:
;>
که با کاما از یکدیگر جدا شده اند .بعنوان مثال :
;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بنویسیم.
از عملگر قالب ریزی استفاده كنیم.
عملگر قالب ریزی می تواند یك نوع را به نوع دیگری تبدیل نماید .شكل كلی آن
به شكل زیر است :
>(
داریم .بعنوان مثال در مورد قبلی می توان به شكل زیر عمل كرد :
(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
; 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تعریف متغیرها
برای تعریف متغیرها به شکل زیر عمل می کنیم:
;>
که با کاما از یکدیگر جدا شده اند .بعنوان مثال :
;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بنویسیم.
از عملگر قالب ریزی استفاده كنیم.
عملگر قالب ریزی می تواند یك نوع را به نوع دیگری تبدیل نماید .شكل كلی آن
به شكل زیر است :
>(
داریم .بعنوان مثال در مورد قبلی می توان به شكل زیر عمل كرد :
(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
; 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تعریف متغیرها
برای تعریف متغیرها به شکل زیر عمل می کنیم:
;>
که با کاما از یکدیگر جدا شده اند .بعنوان مثال :
;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بنویسیم.
از عملگر قالب ریزی استفاده كنیم.
عملگر قالب ریزی می تواند یك نوع را به نوع دیگری تبدیل نماید .شكل كلی آن
به شكل زیر است :
>(
داریم .بعنوان مثال در مورد قبلی می توان به شكل زیر عمل كرد :
(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
; 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تعریف متغیرها
برای تعریف متغیرها به شکل زیر عمل می کنیم:
;>
که با کاما از یکدیگر جدا شده اند .بعنوان مثال :
;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بنویسیم.
از عملگر قالب ریزی استفاده كنیم.
عملگر قالب ریزی می تواند یك نوع را به نوع دیگری تبدیل نماید .شكل كلی آن
به شكل زیر است :
>(
داریم .بعنوان مثال در مورد قبلی می توان به شكل زیر عمل كرد :
(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
; 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تعریف متغیرها
برای تعریف متغیرها به شکل زیر عمل می کنیم:
;>
که با کاما از یکدیگر جدا شده اند .بعنوان مثال :
;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بنویسیم.
از عملگر قالب ریزی استفاده كنیم.
عملگر قالب ریزی می تواند یك نوع را به نوع دیگری تبدیل نماید .شكل كلی آن
به شكل زیر است :
>(
داریم .بعنوان مثال در مورد قبلی می توان به شكل زیر عمل كرد :
(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
; 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تعریف متغیرها
برای تعریف متغیرها به شکل زیر عمل می کنیم:
;>
که با کاما از یکدیگر جدا شده اند .بعنوان مثال :
;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بنویسیم.
از عملگر قالب ریزی استفاده كنیم.
عملگر قالب ریزی می تواند یك نوع را به نوع دیگری تبدیل نماید .شكل كلی آن
به شكل زیر است :
>(
داریم .بعنوان مثال در مورد قبلی می توان به شكل زیر عمل كرد :
(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
; 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تعریف متغیرها
برای تعریف متغیرها به شکل زیر عمل می کنیم:
;>
که با کاما از یکدیگر جدا شده اند .بعنوان مثال :
;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بنویسیم.
از عملگر قالب ریزی استفاده كنیم.
عملگر قالب ریزی می تواند یك نوع را به نوع دیگری تبدیل نماید .شكل كلی آن
به شكل زیر است :
>(
داریم .بعنوان مثال در مورد قبلی می توان به شكل زیر عمل كرد :
(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
; 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تعریف متغیرها
برای تعریف متغیرها به شکل زیر عمل می کنیم:
;>
که با کاما از یکدیگر جدا شده اند .بعنوان مثال :
;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بنویسیم.
از عملگر قالب ریزی استفاده كنیم.
عملگر قالب ریزی می تواند یك نوع را به نوع دیگری تبدیل نماید .شكل كلی آن
به شكل زیر است :
>(
داریم .بعنوان مثال در مورد قبلی می توان به شكل زیر عمل كرد :
(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
; 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تعریف متغیرها
برای تعریف متغیرها به شکل زیر عمل می کنیم:
;>
که با کاما از یکدیگر جدا شده اند .بعنوان مثال :
;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بنویسیم.
از عملگر قالب ریزی استفاده كنیم.
عملگر قالب ریزی می تواند یك نوع را به نوع دیگری تبدیل نماید .شكل كلی آن
به شكل زیر است :
>(
داریم .بعنوان مثال در مورد قبلی می توان به شكل زیر عمل كرد :
(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
; 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تعریف متغیرها
برای تعریف متغیرها به شکل زیر عمل می کنیم:
;>
که با کاما از یکدیگر جدا شده اند .بعنوان مثال :
;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بنویسیم.
از عملگر قالب ریزی استفاده كنیم.
عملگر قالب ریزی می تواند یك نوع را به نوع دیگری تبدیل نماید .شكل كلی آن
به شكل زیر است :
>(
داریم .بعنوان مثال در مورد قبلی می توان به شكل زیر عمل كرد :
(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
; 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تعریف متغیرها
برای تعریف متغیرها به شکل زیر عمل می کنیم:
;>
که با کاما از یکدیگر جدا شده اند .بعنوان مثال :
;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بنویسیم.
از عملگر قالب ریزی استفاده كنیم.
عملگر قالب ریزی می تواند یك نوع را به نوع دیگری تبدیل نماید .شكل كلی آن
به شكل زیر است :
>(
داریم .بعنوان مثال در مورد قبلی می توان به شكل زیر عمل كرد :
(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
; 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تعریف متغیرها
برای تعریف متغیرها به شکل زیر عمل می کنیم:
;>
که با کاما از یکدیگر جدا شده اند .بعنوان مثال :
;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بنویسیم.
از عملگر قالب ریزی استفاده كنیم.
عملگر قالب ریزی می تواند یك نوع را به نوع دیگری تبدیل نماید .شكل كلی آن
به شكل زیر است :
>(
داریم .بعنوان مثال در مورد قبلی می توان به شكل زیر عمل كرد :
(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
; 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تعریف متغیرها
برای تعریف متغیرها به شکل زیر عمل می کنیم:
;>
که با کاما از یکدیگر جدا شده اند .بعنوان مثال :
;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بنویسیم.
از عملگر قالب ریزی استفاده كنیم.
عملگر قالب ریزی می تواند یك نوع را به نوع دیگری تبدیل نماید .شكل كلی آن
به شكل زیر است :
>(
داریم .بعنوان مثال در مورد قبلی می توان به شكل زیر عمل كرد :
(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
; 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تعریف متغیرها
برای تعریف متغیرها به شکل زیر عمل می کنیم:
;>
که با کاما از یکدیگر جدا شده اند .بعنوان مثال :
;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بنویسیم.
از عملگر قالب ریزی استفاده كنیم.
عملگر قالب ریزی می تواند یك نوع را به نوع دیگری تبدیل نماید .شكل كلی آن
به شكل زیر است :
>(
داریم .بعنوان مثال در مورد قبلی می توان به شكل زیر عمل كرد :
(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
; 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تعریف متغیرها
برای تعریف متغیرها به شکل زیر عمل می کنیم:
;>
که با کاما از یکدیگر جدا شده اند .بعنوان مثال :
;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بنویسیم.
از عملگر قالب ریزی استفاده كنیم.
عملگر قالب ریزی می تواند یك نوع را به نوع دیگری تبدیل نماید .شكل كلی آن
به شكل زیر است :
>(
داریم .بعنوان مثال در مورد قبلی می توان به شكل زیر عمل كرد :
(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
; 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تعریف متغیرها
برای تعریف متغیرها به شکل زیر عمل می کنیم:
;>
که با کاما از یکدیگر جدا شده اند .بعنوان مثال :
;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بنویسیم.
از عملگر قالب ریزی استفاده كنیم.
عملگر قالب ریزی می تواند یك نوع را به نوع دیگری تبدیل نماید .شكل كلی آن
به شكل زیر است :
>(
داریم .بعنوان مثال در مورد قبلی می توان به شكل زیر عمل كرد :
(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
; 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تعریف متغیرها
برای تعریف متغیرها به شکل زیر عمل می کنیم:
;>
که با کاما از یکدیگر جدا شده اند .بعنوان مثال :
;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بنویسیم.
از عملگر قالب ریزی استفاده كنیم.
عملگر قالب ریزی می تواند یك نوع را به نوع دیگری تبدیل نماید .شكل كلی آن
به شكل زیر است :
>(
داریم .بعنوان مثال در مورد قبلی می توان به شكل زیر عمل كرد :
(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
; 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تعریف متغیرها
برای تعریف متغیرها به شکل زیر عمل می کنیم:
;>
که با کاما از یکدیگر جدا شده اند .بعنوان مثال :
;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بنویسیم.
از عملگر قالب ریزی استفاده كنیم.
عملگر قالب ریزی می تواند یك نوع را به نوع دیگری تبدیل نماید .شكل كلی آن
به شكل زیر است :
>(
داریم .بعنوان مثال در مورد قبلی می توان به شكل زیر عمل كرد :
(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
; 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تعریف متغیرها
برای تعریف متغیرها به شکل زیر عمل می کنیم:
;>
که با کاما از یکدیگر جدا شده اند .بعنوان مثال :
;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بنویسیم.
از عملگر قالب ریزی استفاده كنیم.
عملگر قالب ریزی می تواند یك نوع را به نوع دیگری تبدیل نماید .شكل كلی آن
به شكل زیر است :
>(
داریم .بعنوان مثال در مورد قبلی می توان به شكل زیر عمل كرد :
(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
; 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تعریف متغیرها
برای تعریف متغیرها به شکل زیر عمل می کنیم:
;>
که با کاما از یکدیگر جدا شده اند .بعنوان مثال :
;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بنویسیم.
از عملگر قالب ریزی استفاده كنیم.
عملگر قالب ریزی می تواند یك نوع را به نوع دیگری تبدیل نماید .شكل كلی آن
به شكل زیر است :
>(
داریم .بعنوان مثال در مورد قبلی می توان به شكل زیر عمل كرد :
(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
; 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توابع مربوط به کار با رشته ها