۷.۰۱.۱۳۸۸

مفاهیم اولیه زبان C






در این فصل به مقدمات اولیه برنامه نویسی به زبان C می پردازیم و اصول اولیه آن را بررسی می نماییم

شناسه ها در C

شناسه (identifier) نامی است که به یک قسمت از برنامه مانند متغیر، تابع، ثابت و یا ... داده می شود. در زبان C برای انتخاب شناسه ها فقط می توان از علائم زیر استفاده کرد: - حروف انگلیسی کوچک و بزرگ (A…Z a…z)
- ارقام (0…9)
- علامت خط پایین یا _


البته یک شناسه تمی تواند با یک رقم شروع شود. مثلا شناسه های sum ، average ، name2 و یا student_average مجاز هستند، اما شناسه های 2name و یا student average مجاز نیستند. البته در برنامه نویسی امروزی پیشنهاد می شود بجای شناسه هایی همانند student_average از studentAverage استفاده گردد. یعنی بجای اینکه در شناسه ها از _ برای جداکننده استفاده کنیم، اولین حرف هر قسمت را بصورت بزرگ بنویسیم.

نکته مهم دیگری که باید به آن اشاره کرد آنستکه زبان C برخلاف بسیاری از زبانهای دیگر به کوچک و بزرگی حروف حساس است (case sensitive). در نتیجه شناسه های زیر با یکدیگر متفاوتند :

Sum ≠ sum ≠ SUM

این مسئله معمولا درهنگام برنامه نویسی باعث ایجاد بعضی خطاها می شود.
آخرین نکته اینستکه در هنگام انتخاب شناسه نمی توانید از کلمات کلیدی که برای منظورهای خاص در زبان C رزرو شده اند استفاده کنید. زبان C دارای 32 کلمه کلیدی است که عبارتند از :

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




البته در نسخه های جدید C کلمات کلیدی دیگری نیز به لیست فوق اضافه شده است. دقت کنید که کلیه این کلمات با حروف کوچک نوشته شده اند.

انواع داده ها در C

همانطور که قبلا نیز گفتیم هر متغیر پیش از آنکه استفاده گردد ابتدا باید اعلان گردد. اعلان یک متغیر تعیین نوع آن را نیز دربر می گیرد. سوال اصلی آنستکه چه نوع داده هایی در زبان C و جود دارد. انواع داده های متداول عبارتند از :

نوع داده

توضیح

اندازه (بیت)

محدوده

char

کاراکتر

8

-128 to +127

int

عدد صحیح

16

-32768 to + 32767

float

عدد اعشاری

32

3.4e-38 to 3.4e+38

double

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

64

1.7e-308 to 1.7e+308

البته چند نکته مهم درمورد جدول فوق قابل ذکر است :

- اندازه int در محیطهای 16 بیتی مانند DOS برابر 16 بیت است. اما در محیطهای 32 بیتی همانند Windows اندازه آن 32 بیت می باشد که در اینصورت محدوده ای برابر -2,147,483,647 تا +2,147,483,647 را پوشش می دهد.

- در بعضی از کامپایلرهای C، نوع داده bool نیز وجود دارد که می تواند یکی از مقادیر true(درست) یا false (غلط) را نشان دهد . اما در نسخه های اولیه C از همان نوع داده صحیح یا int برای اینکار استفاده می شد. بدین صورت که 0 نشاندهنده false و هر عدد غیر صفر (معمولا 1) نشاندهنده true است.

- از آنجا که برای ذخیره سازی کاراکترها کد اسکی آنها ذخیره می گردد، از یک متغیر کاراکتری یا char می توان بعنوان یک عدد صحیح کوچک نیز استفاده کرد و اعمال ریاضی برروی آنها نیز مجاز است.

علاوه براین چندین اصلاح کننده نیز وجود دارد که به ما اجازه می دهد نوع داده مورد نظر را با دقت بیشتری برای نیازهای مختلف استفاده نماییم.

این اصلاح کننده ها عبارتند از : 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 را در خود نگاه دارد.

تعریف متغیرها

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

;

که type یکی از نوع داده های گفته شده و variable-list لیستی از متغیرها است که با کاما از یکدیگر جدا شده اند. بعنوان مثال :

int sum;
float average;
long int a, b, c ;
unsigned long int i, j, k ;

علاوه براین می توان در هنگام تعریف متغیر به آن مقدار اولیه نیز داد. مثال :

int d = 0 ;

نكته مهم آنكه زبان C به متغيرها مقدار اوليه نمي دهد (حتي 0) و برنامه نويس خود بايد اينكار را صريحا انجام دهد، درغير اينصورت مقدار اوليه متغير، نامعين خواهد بود.
تعریف متغیرها طبق اصول زبان C میتواند درهرجایی از برنامه صورت پذیرد، و متغیرهای تعریف شده از همان خط به بعد قابل استفاده خواهد بود. اما معمولا توصیه می گردد كه تعریف متغیرها در همان خط ابتدایی تابع و بلافاصله پس از { صورت پذیرد.

ثوابت

ثابتها مقادیر ثابتی هستند كه مقدار آنها در حین اجرای برنامه تغییر نمی یابد. ثابتها می توانند از هریك از نوع داده های اصلی باشند. برای نمایش هر ثابت بسته به نوع آن عمل می كنیم كه شرح هریك در زیر آمده است :
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.
8 ثوابت عددی اعشاری : برای نمایش اعداد اعشاری، باید از نقطه اعشار استفاده كنیم، مانند 237.45 ، اما نكته جالب آنستكه می توانید از نماد علمی نیز برای نمایش اعداد اعشاری استفاده كنید. برای اینكار كافی است از حرف e برای نمایش قسمت توان استفاده نمایید. بعنوان مثال :

-23.47 × 10 5 = -23.47e5
42.389 × 10 -3 = 42.389e-3

دقت كنید كه قسمت توان، حتما یك عدد صحیح است. نكته جالب اینجاست كه برخلاف مورد قبل، كامپایلر بطور پیش فرض داده های اعشاری را از نوع double فرض می كند.چنانچه دوست دارید ثابت شما ازنوع float درنظر گرفته شود، در انتهای آن F قرار دهید. ضمنا پسوند L نیز داده اعشاری را از نوع long double درنظر می گیرد. 10 ثوابت كاراكتری : برای نشان دادن ثوابت كاراكتری، آنها را در داخل ' قرار می دهیم. بعنوان مثال 'A' یك ثابت كاراكتری است.

char ch = 'S' ;

دقت كنید كه همانطور كه قبلا گفته شد، كد اسكی كاراكترها در متغیر ذخیره می گردد، بنابراین می توان از آن بعنوان یك عدد صحیح نیز استفاده كرد. نكته مهم دیگر آنستكه به تفاوت عدد 5 و كاراكتر '5' دقت داشته باشید. در حقیقت '5' برابر است با عدد 53 كه همان كد اسكی آن است.
از آنجا كه بعضی كاراكترها، مانند enter قابل نمایش نیستند، بهمین دلیل آنها را با استفاده از \ نمایش می دهیم. علاوه براین بعضی كاراكترها مانند خود " نیز چون دارای معنای خاص هستند، باید با استفاده از \ نمایش داده شوند. موارد مهم عبارتند از :

\n خط جدید
\t tab كاراكتر
\a بوق كامپیوتر \" "
\' ' \\ \


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

عملگرها

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


C از نقطه نظر عملگرها یك زبان بسیار قوی است. این عملگرها به چند دسته اصلی تقسیم می گردند كه آنها را به ترتیب بررسی می كنیم..

عملگرهای محاسباتی

این عملگرها، همان اعمال متداول ریاضی هستند كه در زبان C مورد استفاده قرار می گیرند. این اعمال عبارتند از :

عمل

نوع

عملگر

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

یكانی

-

جمع دو عملوند

دودویی

+

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

دودویی

-

ضرب دو عملوند

دودویی

*

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

دودویی

/

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

دودویی

%

عملگرهای فوق برروی همه انواع داده های C عمل می كنند بجز عملگر % كه فقط برروی نوع داده های صحیح عمل میكند و برروی داده های اعشاری تعریف نشده است. اما نكته مهمی كه باید به آن اشاره كرد، نحوه كار عملگر تقسیم برروی نوع داده های مختلف است. درصورتیكه هردو عملوند صحیحی باشند، تقسیم بصورت صحیح بر صحیح انجام خواهد شد. اما اگر یكی یا هر دو عملوند اعشاری باشند، تقسیم بصورت اعشاری انجام خواهد پذیرفت. فرض كنید تعاریف زیر را داریم :

int a,b ;
float c,d ;
a = 10 ; b = 4 ;
c = 8.2; d = 4.0;

اكنون به نتایج عملیات زیر دقت كنید :

a / b = < d =" <" d =" <" 4 =" <">

چنانچه به آخرین مورد توجه كنید، متوجه می شوید كه از آنجا كه a یك متغیر صحیح است و 4 نیز یك ثابت صحیح در نظر گرفته شده، درنتیجه تقسیم بصورت صحیح بر صحیح انجام گرفته است. چنانچه بخواهیم تقسیم بصورت اعشاری صورت پذیرد، به دو شكل می توانیم عمل كنیم. اول اینكه آن را بصورت a / 4.0 بنویسیم و دوم اینكه از عملگر قالب ریزی استفاده كنیم.
عملگر قالب ریزی می تواند یك نوع را به نوع دیگری تبدیل نماید. شكل كلی آن به شكل زیر است :

(<>) <>


كه type نوع مورد نظر است كه قصد تبدیل عبارت expression به آن نوع را داریم. بعنوان مثال در مورد بالا می توان به شكل زیر عمل كرد :

(float) a / 4

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

نكته بسار مهم دیگری كه باید به آن توجه كرد، اولویت عملگرها است. یعنی در عبارتی که شامل چندین عملگر است، کدامیک در ابتدا اعمال خواهد گردید. اولویت عملگرهای محاسباتی از بالا به پایین بشرح زیر است:

1 عملگر یکانی

2 عملگرهای * و / و %

3 عملگرهای + و

چنانچه اولویت دو عملگر یکسان باشد، این عملگرها از چپ به راست محاسبه خواهند شد. چنانچه بخواهیم یک عمل با اولویت پایین زودتر انجام شود، باید از پرانتز استفاده کنیم. بنابراین اولویت عملگر پرانتز از همه موارد فوق بیشتراست. در مورد پرانتزهای متداخل، ابتدا پرانتز داخلی محاسبه می شود؛ اما در مورد پرانتزهای هم سطح، ابتدا پرانتز سمت چپتر محاسبه می گردد. به چند مثال زیر دقت کنید:

عبارت زبان c

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

b + c * d

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

(b + c) * d

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

b + c / d * e

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

b + c / (d * e)

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

مثال زیر، یک مثال کامل در این زمینه می باشد :

عملگرهای انتساب

در زبان C برای انتساب چندین عملگر وجود دارد. ساده ترین عملگر انتساب، همان عملگر = است که در بسیاری از زبانها استفاده می شود. بعنوان مثال :

a = 5;
b = c + 2 * d;

این عملگر باعث می شود که عبارت سمت راست در عبارت سمت چپ قرار گیرد. توجه کنید که مقدار سمت چپ باید عبارتی باشد که بتوان به آن یک مقدار را نسبت داد(مانند یک متغیر) که به آن Lvalue گفته می شود، بنابراین یک ثابت نمی تواند در سمت چپ قرار گیرد. نکته دیگر اینکه اولویت عملگر = از عملگرهای ریاضی کمتر است و درنتیجه ابتدا آن عملیات انجام شده و در پایان حاصل در عبارت سمت چپ ریخته می شود. لازم به ذکر است که در هنگام انتساب، درصورت لزوم نوع عبارت سمت راست به نوع عبارت سمت چپ تبدیل می شود. مثال:

int a;
a = 2.5 * 5.0;

که دراینصورت عدد 12 در a ذخیره خواهد شد.
شرکت پذیری این عملگر از راست به چپ می باشد، بدین معنا که چنانچه چندین عملگر نسبت دهی داشته باشیم، این عملگرها از راست به چپ محاسبه می شوند. مثلا پس از اجرای دستور زیر :

a = b = c = 10;

مقدار هر 3 متغیر برابر 10 خواهد شد.
نکته جالب درمورد زبان 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;

عملگر اول و دوم، عملگرهای یکانی هستند که بترتیب عملگر افزایش و عملگر کاهش نامیده می شوند. نکته جالب آنستکه این دو عملگر به دوصورت مورد استفاده قرار می گیرند. در حالتی که از دستور 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

و اما پنج عملگر بعدی هنگامی می توانند استفاده شوند که عبارتی بصورت زیر داشته باشیم:

عبارت عملگر متغیر = متغیر

که عملگر یکی از عملگرهای محاسباتی ( + ، - ، * یا / ) باشد، دراینصورت می توانیم آن را بصورت زیر بنویسیم:

عبارت =عملگر متغیر

عملگرهای مقایسه ای (رابطه ای)

این عملگرها دو عبارت را بایکدیگر مقایسه کرده و نتیجه را باز می گردانند. نتیجه می تواند درست (true) یا غلط (false) باشد. همانطور که قبلا نیز گفته شد در کامپایلرهای جدید C++ نوع داده bool اضافه شده است و بنابراین نتیجه این عملگرها یک مقدار bool است. اما در کامپایلرهای قدیمیتر، نتیجه این عملگرها یک عدد صحیح است که درصورت درست بودن 1 و درصورت غلط بودن 0 باز می گردانند. این عملگرها عبارتند از:

عملگر

مفهوم عملگر

مثال

<

بزرگتر (<)

a > b

>

کوچکتر (>)

a <>

=<

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

a >= b

=>

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

a <= b

==

مساوی (=)

a == b

=!

نامساوی (≠)

a != b

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


لازم بذکر است که در هنگام مساوی بودن اولویت چند عملگر، این عملگرها از چپ به راست محاسبه می گردند.
عملگرهای منطقی
این عملگرها به شما اجازه می دهند که شرطهای ساده ای را که با استفاده از عملگرهای مقایسه ای ایجاد شده اند را با یکدیگر ترکیب نموده و شرطهای پیچیده تری را بسازید. این عملگرها عبارتند از :
3 عملگرهای <، > ، =< و = > 4 عملگرهای == و =!

عملگر

مفهوم عملگر

نحوه کار

مثال

&&

AND منطقی

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

a>0 && sw==1

||

OR منطقی

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

a<=100 || b!=0

!

NOT منطقی

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

! (a==1 || b<10)

همانطور که قبلا نیز گفته شد مقدار بازگشتی این عملگرها، درست (1) یا نادرست (0) می باشد. اولویت این عملگرها بترتیب عبارتست از :

1- عملگر !

2- عملگر &&

3- عملگر ||

عملگر شرطی

گاهی لازم است که ابتدا یک شرط بررسی شده و سپس برمبنای نتیجه (درست یا نادرست بودن آن) یکی از دو عبارت ممکن بازگردانده شود. گرچه معمولا برای اینکار از دستور if (که در فصل بعدی بحث شده است) استفاده می شود، اما یک عملگر 3تایی (با 3 عملوند) نیز برای آن وجود دارد. شکل کلی این عملگر بصورت زیر است:

عبارت2 : عبارت1 ? شرط

نحوه کار بدینصورت است که درصورت درست بودن شرط عبارت1 و در غیراینصورت عبارت 2 بازگردانده می شود. مثال :

a = (k<10)>

که این عبارت معادل دستور زیر است:

if(k<10) a="100;" a="50;">

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



که معادل است با :

a= a + 1;
c = c + a;
}
else c = c + a/b;
c += (a>0 &&a<10)>0 &&a<10)>


که البته توصیه می شود از این عبارات پیچیده استفاده نشود.

چند نکته درمورد عملگرها


در یک عبارت می توان بین عملوندها و عملگرها از فضاهای خالی به میزان دلخواه استفاده کرد. گرچه استفاده از فضای خالی اجباری نیست اما معمولا باعث بالا رفتن خوانایی عبارت می گردد. علاوه براین در عبارات پیچیده می توان از پرانتز برای نشان دادن ترتیب اجرای عملگرها، حتی درمواردی که مورد نیاز نباشد استفاده کرد. بعنوان مثال به مورد زیر توجه کنید:

شکل نامناسب

result=a-b*c/d+f*g;

شکل بهتر

result = a – b * c / d + f * g

شکل کاملا مناسب

result = a – ( b * c / d) + (f * g)


مورد دیگری که باید به آن اشاره کرد، نحوه محاسبه عبارات پیچیده ای است که عملگرهای مختلفی در آنها استفاده شده باشد. درچنین حالتی باید از اولویت گروههای مختلف عملگرها نسبت به یکدیگر آگاه باشیم. جدول زیر اولویت عملگرهای گفته شده تاکنون را بترتیب از بالا به پایین آ ورده است:

اولویت

عملگر

شرکت پذیری

1

()

از چپ به راست

2

++ -- ! + -

از راست به چپ

3

% / *

از چپ به راست

4

- +

از چپ به راست

5

>> <<

از چپ به راست

6

>= > <= <

از چپ به راست

7

=! ==

از چپ به راست

8

&&

از چپ به راست

9

||

از چپ به راست

10

?:

از راست به چپ

11

=% =/ =* =- =+ =

از راست به چپ

12

,

از چپ به راست

خواندن و نمایش اطلاعات

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

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

تابع نمایش در خروجی

برای نمایش اطلاعات در خروجی از تابع printf استفاده می شود. این تابع رشته موردنظر شما را به خروجی استاندارد (كه در حالت عادی همان صفحه نمایش یا مانیتور است) می فرستد. شكل كلی این تابع بصورت زیر است:

printf(< لیست متغیرها > , < رشته کنترلی >) ;

رشته كنترلی همان متنی است كه قصد چاپ آن را داریم، با ذكر این نكته كه در قسمتهایی كه باید مقدار یك متغیر چاپ شود، از یك مشخصه تبدیل استفاده می شود. هر مشخصه تبدیل از یك علامت % بعلاوه یك كاراكتر كه نوع متغیر مورد نظر را نشان می دهد تشكیل می گردد. مشخصه تبدیل های متداول عبارتند از :

مفهوم

مشخصه تبدیل

كاراكتر

%c

عدد صحیح در مبنای 10

%d

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

%f

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

%e

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

%g

رشته

%s

عدد صحیح بزرگ

%ld

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

%lf %le %lg

عدد صحیح در مبنای 8

%o

عدد صحیحی در مبنای 16

%x

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

%u

البته بعضی موارد دیگر نیز وجود دارد كه از بحث فعلی ما خارج است. توجه كنید كه از آنجا كه رشته كنترلی یك ثابت رشته ای است، باید در داخل " قرار گیرد. لیست متغیرها نیز همان متغیرهایی هستند كه قصد چاپ آنها را داریم. این متغیرها باید بترتیب قرار گرفته و با كاما (,) از یكدیگر جدا شوند. برای نمونه به مثال زیر توجه كنید:

#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

دقت كنید كه علامت \n انتهای رشته كنترلی باعث می شود كه خروجی بعدی برنامه (در صورت وجود) در خط بعد چاپ شود. البته ممكن است نحوه چاپ عدد اعشاری به شكل فوق چندان برای شما دلخواه نباشد و بخواهید تعداد ارقام اعشاری قابل نمایش را محدود كنید. برای اینكار باید از مشخصه طول میدان استفاده كنید. مشخصه طول میدان برای اعداد به شكل زیر استفاده می شود:

برای اعداد صحیح از %nd استفاده می كنیم كه n تعداد ارقام را نشان می دهد (مثلا %3d). در اینصورت برای هر متغیر n رقم درنظر گرفته می شود. اگر اندازه عدد از n كوچكتر باشد، به سمت چپ آن فضای خالی اضافه می شود و اگر اندازه عدد بیش از n رقم باشد، طول میدان نادیده گرفته شده و عدد بطور كامل چاپ می شود.

برای اعداد اعشاری از %n.mf استفاده می كنیم كه n اندازه كل عدد (شامل علامت ممیز) و m تعداد ارقام اعشار است (مثلا %5.2f). در صورتیكه تعداد ارقام اعشاری عدد موردنظر از m بیشتر باشد، عدد به m عدد اعشار گرد می شود و در صورتیكه از m كمتر باشد، در سمت راست آن 0 قرار داده می شود.

البته موارد دیگری نیز در مورد نحوه چاپ وجود دارد كه برای اطلاع از آنها می توانید به قسمت Help كامپایلر خود مراجعه نمایید.

آخرین نكته درمورد تابع printf اینكه این تابع مقدار بازگشتی نیز دارد كه درصورت موفقیت عمل چاپ، تعداد كاراكترهای چاپ شده و درصورت عدم موفقیت مقدار -1 را باز می گرداند. البته معمولا از این مقدار بازگشتی صرفنظر می گردد.

تابع خواندن از ورودی

برای خواندن اطلاعات از ورودی از تابع scanf استفاده می شود. این تابع اطلاعات را ازورودی استاندارد (معمولا صفحه كلید) خوانده و در متغیرهای تعیین شده قرار می دهد. شكل كلی این تابع بصورت زیر است:

scanf(< لیست متغیرها > , < رشته کنترلی >) ;

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

رشته كنترلی حاوی تعداد و نوع متغیرهایی است كه باید دریافت شوند و از همان مشخصه های تبدیل مربوط به printf استفاده می كند. به مثال زیر توجه كنید:

#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

لازم به ذكر است كه هنگامی كه قصد وارد كردن دو عدد فوق را دارید، هم می توانید این دو عدد را با یك فاصله (فضای خالی یا tab) نوشته و سپس كلید enter را فشار دهید و یا پس از نوشتن هر عدد كلید enter را فشار دهید.

توجه كنید كه معمولا رشته كنترلی فقط حاوی مشخصه های تبدیل است و هیچ متنی در آن نوشته نشده است. ازنظر منطقی نیز این كار درست است ولی چنانچه متنی در آن نوشته شود بدین معنا است كه كاربر باید علاوه بر داده های مورد نظر، عین آن متن را نیز وارد كند. بعنوان مثال عبارت زیر:

scanf("level=%d", &a) ;

بدین معناست كه كاربر باید ابتدا كلمه level= را عینا تایپ كرده و سپس عدد موردنظر را وارد نماید. معمولا از چنین حالاتی استفاده نمی گردد.

نكته آخر اینكه در scanf نیز می توان از مواردی همچون طول میدان برای كنترل نحوه ورود اطلاعات استفاده كرد كه از حوصله بحث ما خارج است. برای اطلاعات بیشتر به Help كامپایلر خود مراجعه نمایید.

نکته مهم: توابع printf و scanf از رنگ استاندارد یعنی سفید برروی زمینه مشکی استفاده می کنند، اما می توانید برای تغییر رنگ از توابع textcolor و textbackground نیز استفاده کنید. البته دراینصورت برای دریافت و نمایش اطلاعات نیز باید از توابع cprintf و cscanf استفاده نمایید. برای توضیحات بیشتر به Help کامپایلر خود مراجعه کنید.

ورودی و خروجی اطلاعات در CPP

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

زبان C++ برای نمایش اطلاعات از یک شیئ بنام cout استفاده می نماید. برای ارسال اطلاعات مورد نظر برای چاپ به cout باید از عملگر درج در جریان یا >> استفاده نماییم. بعنوان مثال :

cout << “Please enter your name: ” ;

و یا مثال دیگر :

int a = 10;
float b = 2.86;
cout <<>

نکته جالبی که در این مثالها دیده می شود، آنستکه برخلاف تابع printf هیچ نیازی به مشخص کردن نوع متغیری که قصد چاپ آن را داریم نیست و خود شئ cout نوع آن را تشخیص می دهد. علاوه براین می توان چندین عملگر درج در جریان را با یکدیگر الحاق کرد و چندین متغیر را با یک دستور چاپ کرد. بعنوان مثال به برنامه زیر دقت کنید:

#include <>
void main() {
int age = 20;
floate average = 18.23;
cout << “You are ” <<>

You are 20 years old and your average is 18.230000

برای دریافت اطلاعات از کاربر، از شئ دیگری بنام cin استفاده می شود. برای ارسال متغیر مورد نظر به cin باید از عملگر استخراج از جریان یا << استفاده نماییم. بعنوان مثال:

int a;
cin >> a;

بازهم همانطور که می بینید نیازی به تعیین نوع متغیر موردنظر نیست و خود شئ cin نوع متغیر را بطور اتوماتیک تشخیص داده و داده ای از همان نوع را از کاربر دریافت و در متغیر مورد نظر قرار می دهد. عملگرهای استخراج از جریان را نیز می توان با یکدیگر الحاق کرد. اکنون به یک برنامه کاملتر توجه کنید:

#include <>
void main() {
int age;
float average ;
cout << "Please enter your age and average : " ; cin >> age >> average ;
cout << "You are " <<>

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

برای رفتن به خط بعد در شئ cout می توان از دستکاری کننده endl استفاده کرد. مثلا در دستور زیر پس از چاپ پیغام، مکان نما به خط بعد منتقل می شود:

cout << “List of students : “ <<>

البته دستکاری کننده های متعدد دیگری نیز ازجمله موارد مربوط به تعیین طول میدان و نحوه چاپ مقادیر وجود دارد که توضیح آنها نیاز به یک مبحث مستقل دارد.

توابع کتابخانه ای

همانطور که قبلا نیز گفته شد، زبان C از زیر برنامه ها نیز حمایت می کند. هر زیر برنامه در C یک تابع نامیده می شود که آن را بطور مفصل در فصول بعدی بررسی خواهیم کرد. تا کنون با توابعی همچون main و یا printf و scanf آشنا شده ایم.

معمولا عرضه کنندگان کامپایلرها و یا سایر فروشندگان نرم افزار، برخی از توابع عمومی را که ممکن است مورد نیاز جمع کثیری از برنامه نویسان مختلف باشد را در قالب کتابخانه ای از توابع در اختیار برنامه نویسان می گذارند (این کتابخانه ها ممکن است مجانی باشند و یا نیاز به پرداخت مبلغی داشته باشند). بعضی از این توابع کتابخانه ای مانند printf و scanf بصورت استاندارد درآمده و توسط عرضه کنندگان مختلف ارائه می شوند.

در کامپایلر عرضه شده توسط شرکت بورلند (Borland C++ 3.1) نیز کتابخانه های متعددی از توابع برای شما عرضه شده اند که بتدریج با آنها و کاربردشان آشنا خواهید شد. نکته مهم آنستکه برای استفاده از این توابع ابتدا باید فایل سرآمد مربوط به آنها را نیز در ابتدای برنامه خود اضافه نمایید ( با استفاده از #include). هر فایل سرآمد شامل تعاریف اولیه گروهی از توابع مرتبط با هم و داده های مربوط به آنها بوده و در استاندارد قدیمی تر دارای پسوند .h می باشد(در استاندارد جدید پسوند این فایلها حذف شده است). برخی از این فایلهای سرآمد عبارتند از:

stdio.h : توابع ورودی و خروجی استاندارد


math.h : توابع ریاضی graphics.h : توابع مربوط به عملیات گرافیکی string.h : توابع مربوط به کار با رشته ها

البته تعداد این فایلها و توابع مربوطه بسیار زیاد است و در آینده با هریک از آنها بنا به کاربرد، آشنا خواهید شد.

هیچ نظری موجود نیست:

http://up.iranblog.com/images/0z5dgraxwa4j49a5ts77.gif http://up.iranblog.com/images/gv83ah5giec9g8jkopmc.gif