جلسه دوم(متغیرها و عملگرها)
ما در برنامه نويسی نياز به خانه های حافظه داريم. در تعريف خانه حافظه بايد نام و نوع اطلاعاتی که در آن قرار می گيرد معين شود.
نام متغيير نوع داده ;
int i1,i2,index;
دستور فوق سه خانه حافظه با نامهای i1 وi2 وindex از نوع اعداد صحيح تعيين می کند، يعنی در هر کدام از خانه های حافظه فوق می توان يک عدد صحيح در بازه 32767 تا 32768- قرار داد. نوع داده int به دو بايت حافظه نياز دارد.
نکته :
· هر خط دستور زبان ++C به ; ختم می شود.
· برای نام گذاری خانه های حافظه فقط می توان از حروف، اعداد و ... استفاده کرد و نيز حرف اول نام يک متغير بايد يک حرف باشد. به عنوان مثال نامهای 1test و test!num و mark.1 اسامی غير مجاز می باشند.
· بين حروف نام متغير نمی توان از کاراکتر فاصله استفاده کرد.
· زبان ++C دارای تعدادی کلمات کليدی است که نمی توان از اين کلمات به عنوان نام متغير استفاده کرد. کلمات کليدی زبان ++C عبارتند از:
|
asm |
auto |
break |
case |
cdecl |
char |
|
class |
const |
continue |
_cs |
default |
delete |
|
do |
double |
_ds |
else |
enum |
_es |
|
extern |
_export |
far |
_fastcall |
float |
for |
|
friend |
goto |
huge |
if |
inline |
int |
|
interrupt |
_loadds |
long |
near |
new |
operator |
|
pascal |
private |
protected |
public |
register |
return |
|
_saveregs |
_seg |
short |
signed |
sizeof |
_ss |
|
static |
struct |
switch |
template |
this |
typedef |
|
union |
unsigned |
virtual |
void |
volatile |
while |
· زبان ++C نسبت به حروف حساس است يعنی بين حروف کوچک و بزرگ تفاوت قائل می شود. در اين زبان تمام کلمات کليدی با حروف کوچک نوشته می شوند، به عنوان مثال short يک کلمه کليدی می باشد ولی SHORT يا shoRT کلمات کليدی نيستند. توصيه می شود که تمام برنامه های اين زبان با حروف کوچک نوشته شوند.
در زبان ++C چهار نوع داده اصلی وجود دارد که عبارتند از :
1- char : اين نوع داده برای ذخيره داده های کاراکتری مانند 'a' ، '1' ، '.' به کار می رود و بازه قابل قبول آن از 128- تا 127 می باشد. در حقيقت خانه های char نيز از نوع اعداد صحيح می باشند که يک بايت طول دارند و کد اسکی کاراکتر مورد نظر را در خود حفظ می کنند. به عنوان مثال کد اسکی کاراکتر A عدد 65 می باشد.
2- int : اين نوع داده برای ذخيره اعداد صحيح مانند 1300، 32000 ، 850- به کار می رود و بازه قابل قبول آن 32768- تا 32767 می باشد.
3- float : اين نوع داده برای ذخيره اعداد اعشاری مانند 12.5241 ، 1501.3- ، 1415.1234 به کار می رود و دقت آن تا 7 رقم اعشاری می باشد.
4- double : اين نوع داده برای ذخيره سازی اعداد اعشاری بزرگ به کار می رود و دقت آن از float بيشتر می باشد.
باکلماتی مانند signed ( علامت دار) ، unsigned ( بدون علامت)، short (کوتاه) و long ( بلند) انواع داده های جديدی می توان ايجاد کرد. نوع int با هر چهار کلمه فوق می تواند مورد استفاده قرار گيرد. نوع char می تواند با signed و unsigned به کار رود و نوع double می تواند با long به کار رود. به جدول زير توجه کنيد:
|
نوع داده |
طول داده |
بازه |
|
unsigned char |
8 bits |
0 to 255 |
|
char |
8 bits |
-128 to 127 |
|
enum |
16 bits |
-32,768 to 32,767 |
|
unsigned int |
16 bits |
0 to 65,535 |
|
short int |
16 bits |
-32,768 to 32,767 |
|
int |
16 bits |
-32,768 to 32,767 |
|
unsigned long |
32 bits |
0 to 4,294,967,295 |
|
long |
32 bits |
-2,147,483,648 to 2,147,483,647 |
|
float |
32 bits |
3.4 * (10**-38) to 3.4 * (10**+38) |
|
double |
64 bits |
1.7 * (10**-308) to 1.7 * (10**+308) |
|
long double |
80 bits |
3.4 * (10**-4932) to 1.1 * (10**+4932) |
اعمال رياضی و محاسباتی
در مبحث حافظه با انواع داده و شيوه اختصاص دادن حافظه به متغيرها آشنا شديم حال می توانيم متغيرها را در محاسبات به کار ببريم. برای نيل به اين هدف ++C عملگرهايی را در اختيار ما قرار داده است.
عملگر انتساب (=)
این عملگر به معنای تساوی نیست بلکه برای قرار دادن متغیر سمت راست تساوی در متغیر سمت چپی است یعنی عملگر تساوی جهت اختصاص دادن يک مقدار به يک متغير به کار می رود ، مانند a = 5 که عدد 5 را به متغير a تخصيص می دهد. جزئی که در سمت چپ تساوی قرار دارد همواره بايد نام يک متغير باشد، وجزء سمت راست تساوی می تواند يک عدد، يک متغير و يا ترکيبی از هر دو باشد. مانند: a=b+5 ، که در ايجا حاصل b + 5 در متغير a قرار می گيرد. توجه داشته باشيد که همواره مقدار سمت راست تساوی در مقدار سمت چپ قرار می گيرد. به دستورات زير توجه کنيد.
int a,b;
a = 10;
b = 4;
a = b;
b = 7;
اگر از دستورات فوق استفاده کنيم در نهايت مقدار a برابر 4 و مقدار b برابر 7 خواهد بود. ++C قابليتهای زيادی دارد يکی از اين قابليتها اينست که می توانيم چند دستور را در يک دستور خلاصه کنيم ، به عنوان مثال دستور :
a = 2 + (b = 5);
برابر است با:
b = 5;
a = 2 + b;
که هر دو عبارت در نهايت عدد 7 را در متغير a قرار می دهند.
ضمناً استفاده از عبارت زير نيز در ++C مجاز می باشد:
a = b = c = 5
عبارت فوق عدد 5 را به سه متغير a و b و c اختصاص می دهد.
عملگر های محاسباتی
پنج عملگر محاسباتی که قابل استفاده در زبان ++C هستند عبارتند از:
+ جمع
- تفريق
* ضرب
/ تقسيم
% باقيمانده تقسيم
تنها عملگری که ممکن است برای شما ناشناس باشد عملگر % است. اين عملگر باقيمانده تقسيم دو عدد صحيح را به ما می دهد، به عنوان مثال اگر از دستور زير استفاده کنيم:
a = 11 % 3;
متغير a حاوی عدد 2 خواهد شد. چون عدد 2 باقيمانده تقسيم 11 بر 3 می باشد.
عملگر های انتساب مرکب
عملگرهای انتسال مرکب عبارتند از =+ ، =- ، =* ، =/ ، =% .اين عملگرها دو کار را با هم انجام می دهند و در کم شدن کد نويسی به ما کمک می کنند، به جای توضيح اضافی به مثال های زير که فهم مطلب را ساده تر می کند توجه کنيد:
value += increase;«برابر است با»value=value+increase;
a -= 5; «برابر است با»a = a - 5;
a /= b; «برابر است با»a = a / b;
price*=units+1; «برابر است با»price=price*(units+1);
x %= y * z; «برابر است با»x = x % (y * z);
عملگرهای افزايش و کاهش
گونه ای ديگر از عملگرها که در کم شدن کد نويسی به ما کمک می کنند عملگر افزايش(++) و عملگر کاهش(--) می باشند. عملگر افزايش(++) يک واحد به مقدار قبلی که در متغير بود اضافه می کند و عملگر کاهش(--) يک واحد از مقدار قبلی که در متغير بود کم می کند.
++a; a++; a += 1; a = a + 1;
هر چهار دستور فوق يک واحد به مقدار قبلی متغير اضافه می کنند.
--a; a--; a -= 1; a = a - 1;
هر چهار دستور فوق يک واحد از مقدار قبلی متغير کم می کنند.
اگر از دستورات ++a و a++ به تنهايی استفاده کنيم فرقی ندارد که ++ قبل از متغير قرار گيرد يا بعد از متغير. اما اگر از ++ در کنار عملگرهای ديگر استفاده شود، اگر ++ قبل از متغير قرار گيرد ابتدا يک واحد به متغير اضافه شده سپس در محاسبه استفاده می شود، ولی اگر ++ بعد از متغير قرار گيرد ابتدا متغير در محاسبه استفاده می شود سپس يک واحد به آن اضافه می شود. همين روال برای عملگر -- نيز برقرار است. به مثال های زير توجه کنيد:
|
b = 3; |
b = 3; |
در مثال سمت چپ ابتدا يک واحد به b اضافه می شود، يعنی b مقدار 4 را می گيرد سپس عدد 4 در a قرار می گيرد؛ اما در مثال سمت راست ابتدا مقدار b يعنی عدد 3 در a قرار می گيرد سپس يک واحد به b اضافه می شود و مقدار 4 را می گيرد.
در اين مثال عدد 6 در m قرار می گيرد:
a = 2;
b = 3;
m = ++a + b--;
b مقدار 2 و a مقدار 3 را می گيرد.
حال که با انواع عملگرهای محاسباتی آشنا شديد عبارت زير را در نظر بگيريد.
y = 5 * 3 + 2 - 1 * 3 / 2;
مقداری که در y قرار می گيرد چه عددی می تواند باشد؟ 30 يا 24 يا 15.5 يا 17.5 . نظر شما چيست؟ شما مقدار y را چگونه حساب می کنيد؟
کامپيوتر برای بررسی و محاسبه چنين عبارتی برای اينکه با چندين جواب مواجه نشود قواعدی را در نظر می گيرد و طبق قوانين تقدم عملگرها عمل می کند. اين قوانين که مشابه قوانين جبر می باشند به ترتيب عبارتند از:
1- عملگرهايی که درون پرانتز قرار دارند اول محاسبه می شوند. در صورتی که پرانتزها تودرتو باشند ابتدا داخلی ترين پرانتز مورد بررسی و محاسبه قرار می گيرد.
2- اگر عبارتی حاوی * ، / و % باشد پس از پرانتز اين عملگرها در اولويت قرار دارند. اگر عبارتی حاوی ترکيبی از اين عملگرها باشد چون اين عملگرها در تقدم يکسانی نسبت به يکديگر قرار دارند، محاسبه به ترتيب از چپ به راست انجام می شود.
3- اعمال + و - در انتها انجام می شوند. اگر عبارتی شامل ترکيبی از اين دو عملگر باشد چون اين دو عملگر در تقدم يکسانی نسبت به هم هستند، محاسبه به ترتيب از چپ به راست انجام می شود.
با توجه به قواعد گفته شده حاصل عبارت فوق عدد 15.5 خواهد بود.
y = 5 * 3 + 2 - 1 * 3 / 2; ----» y = 15.5
6 1 4 5 2 3
به مثال های زير توجه کنيد:
x = (2 + 1) * 3 + 5; ----» x = 14
4 1 2 3
z = 5 % 3 * (3 + 1); ----» z = 8
4 2 3 1
y = p * r % q + w / x - y;
6 1 2 4 3 5
يک عبارت منطقی، عبارتی است با مقدار درست يا نادرست. به عنوان مثال 5 بزرگتر از 3 است، يک عبارت منطقی است با مقدار درست و 5 کوچکتر از 3 است، نيز يک عبارت منطقی است اما با مقدار نادرست. در کامپيوتر نتيجه عبارات منطقی درست عدد يک و نتيجه عبارات منطقی نادرست عدد صفر خواهد بود.
ضمناً کامپيوتر هر عدد مخالف صفر را به عنوان يک عبارت منطقی درست در نظر می گيرد.
عملگرهای رابطه ای
برای مقايسه دو متغير يا دو عبارت از عملگرهای رابطه ای استفاده می کنيم که همانطور که گفته شد دارای نتيجه درست يا نادرست می باشد. عملگرهای رابطه ای عبارتند از ==( مساوی )، =!( مخالف )، <(بزرگتر از )، >( کوچکتر از )، =<( بزرگتر مساوی از )، =>( کوچکتر مساوی از ). به مثال های زير توجه کنيد.
ضمناً به جای اينکه فقط از اعداد در عبارتهای رابطه ای استفاده کنيم می توانيم از عبارتهايی شامل متغيرها و يا ترکيبی از متغيرها و اعداد استفاده کنيم به عنوان مثال فرض کنيد a = 2 و b=3 و c=6 خواهيم داشت:
توجه کنيد که عملگر = همانند عملگر == نمی باشد. اولی عملگر انتساب است که مقدار سمت راست را در متغير سمت چپ قرار می دهد و ديگری عملگر رابطه ای است که برابر بودن يا نبودن دو مقدار را با هم مقايسه می کند. بنابراين در عبارت ((b=2)==a)) ما ابتدا مقدار 2 را در متغير b قرار داديم سپس آن را با a مقايسه کرديم، لذا نتيجه اين مقايسه درست بود.
عملگرهای منطقی
عملگرهای منطقی عبارتند از ! ، || و && . نتيجه عملگر ! (NOT) وقتی درست است که عبارتی که اين عملگر بر روی آن عمل می کند نادرست باشد و نتيجه هنگامی نادرست است که عملوند آن درست باشد. ضمناً اين عملگر تنها يک عملوند دارد. در حقيقت اين عملگر نقيض عملوند خود را به عنوان نتيجه می دهد.
شما برای اینکه به دستگاه بگوئید a از 5 کوچکتر و از ۱/۰ بزرگتر است نمی توانید بنویسید 5>a>ا/۰ زیرا کامپایلر متوجه نشده و پیغام خطا خواهد داد . حال شما برای فهماندن این موضوع به دستگاه باید اینگونه بنویسید: a>0.1 && a<5
که در انجا && همان معنی (و) در جمله(( a از 5 کوچکتر و از ۱/۰ بزرگتر است)) را داراست.
علامت || نیز معنی (یا) را دارد a==1 || a==2 یعنی مقدار a برابر 2 یا برابر 1 باشد.
به مثال های زير توجه کنيد:
!(5 == 5) ----> نادرست
!(6 <= 4) ----> درست
!0 ----> درست
!1 ----> نادرست
عملگرهای &&(AND) و ||(OR) هنگامی مورد استفاده قرار می گيرند که بخواهيم از دو عبارت يک نتيجه را بدست آوريم. نتيجه اين عملگرها بستگی به ارتباط بين دو عملوندشان طبق جدول زير دارد:
|
عملوند اول |
عملوند دوم |
نتيجه |
نتيجه |
|
درست |
درست |
درست |
درست |
|
درست |
نادرست |
نادرست |
درست |
|
نادرست |
درست |
نادرست |
درست |
|
نادرست |
نادرست |
نادرست |
نادرست |
به مثال های زير توجه نمائيد:
((5==5)&&(3>6)) -----> نادرست
((5==5)||(3>6)) -----> درست
((3-3)&&(3<5)) -----> نادرست
((3-3)||(3<5)) -----> درست
در مثال های زير به جای اعداد از متغير نيز استفاده شده است ( فرض کنيد a=1 و b=2 وc=3)
((b-2*a)&&(c==3)) -----> نادرست
((b==2*a)&&(c!=4)) -----> نادرست
((b-c==-a)||(b-c==a)) -----> درست
عملگر شرطی
اين عملگر يک عبارت را مورد ارزيابی قرار می دهد و براساس عبارت ارزيابی شده مقادير متفاوتی را به عنوان نتيجه بر می گرداند. ساختار اين عملگر به صورت زير می باشد:
نتيجه 2 : نتيجه 1 ? شرط
اگر شرط برقرار باشد نتيجه 1 به عنوان خروجی خواهد بود در غير اين صورت نتيجه 2 به عنوان خروجی در نظر گرفته می شود. به مثال های زير توجه نماييد:
7==6?4:3 --->خروجی عدد3 می باشد چون7 مساوی 6 نمی باشد
8==6+2?4:3 --->خروجی عدد4 می باشد چون8 مساوی 6+2می باشد
6>3?a:b --->خروجی a می باشد چون 6 از 3 بزرگتر است
a>b?a:b --->خروجی عدد بزرگتر می باشد a يا b
همانطور که در عملگرهای محاسباتی ديديم درک تقدم عملگرها، اهميت ويژه ای داشت در اينجا نيز دانستن اين تقدم از اهميت خاصی برخوردار می باشد، تقدم عملگرهای رابطه ای ، منطقی و شرطی به ترتيب عبارتند از:
1- !
2- => > =< <
3- =! ==
4- &&
5- ||
6- :?
به عنوان مثال مراحل بررسی عبارت مقابل به صورت زير می باشد:
2 >= 3 && 2 == 2 || 2 != 3
1 4 2 5 3
1 نادرست
2 درست
3 درست
4 نادرست && درست ----> نادرست
5 نادرست || درست ----> درست
جواب نهايی درست می باشد
پيشنهاد می شود برای جلوگيری از پيچيدگی فهم عبارتهای منطقی و يا محاسباتی تقدم های مورد نظر را با به کار بردن پرانتز کاملاً مشخص کنيم ، به عنوان مثال عبارت فوق را به صورت زير مورد استفاده قرار دهيم:
(((2 >= 3) && (2 == 2)) || (2 != 3))