برنامه نویسی ++C جلسه سوم
مقدمه
همۀ برنامههايي که در دو جلسه اول بيان شد، به شکل ترتيبي اجرا ميشوند، يعني دستورات برنامه به ترتيب از بالا به پايين و هر کدام دقيقا يک بار اجرا ميشوند. در اين جلسه نشان داده ميشود چگونه از دستورالعملهاي انتخاب1 جهت انعطافپذيري بيشتر برنامه استفاده کنيم. همچنين در اين جلسه انواع صحيح كه در C++ وجود دارد بيشتر بررسي ميگردد.
دستور if
دستور if موجب ميشود برنامه به شکل شرطي اجرا شود. نحو آن به گونۀ زير است:
If (condition) statement;
Condition که شرط ناميده ميشود يك عبارت صحيح است (عبارتي که با يک مقدار صحيح برآورد ميشود) و statement ميتواند هر فرمان قابل اجرا باشد. Statement وقتي اجرا خواهد شد كه condition مقدار غير صفر داشته باشد. دقت كنيد كه شرط بايد درون پرانتز قرار داده شود.
2- دستور if..else
دستور if..else موجب ميشود بسته به اين که شرط درست باشد يا خير، يكي از دو دستورالعمل فرعي اجرا گردد. نحو اين دستور به شکل زير است:
if (condition) statement1;
else statement2;
condition همان شرط مساله است که يك عبارت صحيح ميباشد و statement1 و statement2 فرمانهاي قابل اجرا هستند. اگر مقدار شرط، غير صفر باشد، statement1 اجرا خواهد شد وگرنه statement2 اجرا ميشود.
مثال يک آزمون قابليت تقسيم
int main()
{ int n, d;
cout << " Enter two positive integers: ";
cin >> n >> d;
if (n%d) cout << n << " is not divisible by " << d << endl;
else cout << n << " is divisible by " << d << endl;
}
4- عملگرهاي مقايسهاي
در C++ شش عملگر مقايسهاي وجود دارد: < و > و <= و >= و == و != . هر يک از اين شش عملگر به شکل زير به کار ميروند:
x > y x بزرگتر از y است
x < y x کوچکتر از y است
x <= y x کوچکتر یا مساوی y است
x >= y x بزرگتر یا مساوی y است
x = = x x مساوی با y است
x != y x مخالف y است
اينها ميتوانند براي مقايسۀ مقدار عبارات با هر نوع ترتيبي استفاده شوند. عبارت حاصل به عنوان يك شرط تفسير ميشود. مقدار اين شرط صفر است اگر شرط نادرست باشد و غير صفر است اگر شرط درست باشد. براي نمونه، عبارت 7*8<6*5 برابر با صفر ارزيابي ميشود، به اين معني كه اين شرط نادرست است.
2- متغير عدد صحيح
C++ شش نوع متغير عدد صحيح دارد تفاوت اين شش نوع مربوط به ميزان حافظۀ مورد استفاده و محدودۀ مقاديري است که هر کدام ميتوانند داشته باشند.
اين ميزان حافظۀ مورد استفاده و محدودۀ مقادير، بستگي زيادي به سختافزار و همچنين سيستم عامل دارد. يعني ممکن است روي يک رايانه، نوع int دو بايت از حافظه را اشغال کند در حالي که روي رايانهاي از نوع ديگر نوع int به چهار بايت حافظه نياز داشته باشد.
دقت کنيد كه در ++C عملگر جايگزيني با عملگر برابري فرق دارد. عملگر جايگزيني يک مساوي تکي " = " است ولي عملگر برابري، دو مساوي " = = " است.
مثلا دستور x = 33; مقدار 33 را در x قرار ميدهد ولي دستور x == 33; بررسي ميکند که آيا مقدار x با 33 برابر است يا خير. درک اين تفاوت اهميت زيادي دارد.
4- بلوكهاي دستورالعمل
يك بلوك دستورالعمل زنجيرهاي از دستورالعملهاست كه درون براكت {} محصور شده، مانند :
{ int temp=x;
x = y;
y = temp;
}
در برنامههاي ++C يک بلوک دستورالعمل مانند يک دستورالعمل تکي است.
مثال : يك بلوك دستورالعمل درون يك دستور if
اين برنامه دو عدد صحيح را گرفته و به ترتيب بزرگتري، آنها را چاپ ميكند:
int main()
{ int x, y;
cout << "Enter two integers: ";
cin >> x >> y;
if (x > y) { int temp = x;
x = y;
y = temp;
} //swap x and y
cout << x << " <= " << y << endl;
}
int main()
{ int n=44;
cout << "n = " << n << endl;
{ int n;
cout << "Enter an integer: ";
cin >> n;
cout << "n = " << n << endl; }
{ cout << " n = " << n << endl; }
{ int n;
cout << "n = " << n << endl; }
cout << "n = " << n << endl; }
5 – شرطهاي مركب
شرطهايي مانند n%d و x>=y ميتوانند به صورت يك شرط مركب با هم تركيب شوند. اين كار با استفاده ازعملگرهاي منطقي && (and) و || (or) و ! (not) صورت ميپذيرد. اين عملگرها به شکل زير تعريف ميشوند:
p && q درست است اگر و تنها اگر هم p و هم q هر دو درست باشند
p || q نادرست است اگر و تنها اگر هم p و هم q هر دو نادرست باشند
!pدرست است اگر و تنها اگر p نادرست باشد
براي مثال(n%d || x>=y) نادرست است اگر و تنها اگر n%d برابر صفر و x كوچكتر از y باشد.
سه عملگر منطقي && (and) و || (or) و ! (not) معمولا با استفاده از جداول درستي به گونۀ زير بيان ميشوند:
|
P&&q |
q |
p |
|
T |
T |
T |
|
F |
F |
T |
|
F |
T |
F |
|
F |
F |
F |
|
P||q |
q |
p |
|
T |
T |
T |
|
T |
F |
T |
|
T |
T |
F |
|
F |
F |
F |
|
!P |
P |
|
F |
T |
|
T |
F |
طبق جدولهاي فوق اگر p درست و q نادرست باشد، عبارت p&&q نادرست و عبارت p||q درست است.
6- ارزيابي ميانبري
عملگرهاي && و || به دو عملوند نياز دارندتا مقايسه را روي آن دو انجام دهند. جداول درستي نشان ميدهد که p&&q نادرست است اگر p نادرست باشد. در اين حالت ديگر نيازي نيست که q بررسي شود. همچنين p||q درست است اگر p درست باشد و در اين حالت هم نيازي نيست که q بررسي شود. در هر دو حالت گفته شده، با ارزيابي عملوند اول به سرعت نتيجه معلوم ميشود. اين كار ارزيابي ميانبري ناميده ميشود.
شرطهاي مركب كه از && و || استفاده ميكنند عملوند دوم را بررسي نميكنند مگر اين كه لازم باشد.
7- عبارات منطقي
يك عبارت منطقي شرطي است كه يا درست است يا نادرست. قبلا ديديم که عبارات منطقي با مقادير صحيح ارزيابي ميشوند. مقدار صفر به معناي نادرست و هر مقدار غير صفر به معناي درست است. به عبارات منطقي «عبارات بولي» هم ميگويند.
چون همۀ مقادير صحيح ناصفر به معناي درست تفسير ميشوند، عبارات منطقي اغلب تغيير قيافه ميدهند. براي مثال دستور
if (n) cout << "n is not zero";
وقتي n غير صفر است عبارت n is not zero را چاپ ميكند زيرا عبارت منطقي (n) وقتي مقدار n غير صفر است به عنوان درست تفسير ميگردد.
کد زير را نگاه کنيد:
if (n%d) cout << "n is not a multiple of d";
دستور خروجي فقط وقتي كه n%d ناصفر است اجرا ميگردد و n%d وقتي ناصفر است که n بر d بخشپذير نباشد. گاهي ممکن است فراموش کنيم که عبارات منطقي مقادير صحيح دارند و اين فراموشي باعث ايجاد نتايج غير منتظره و نامتعارف شود.
يك خطاي منطقي ديگر، اين برنامه خطادار است:
int main()
{ int n1, n2, n3;
cout << "Enter three integers: ";
cin >> n1 >> n2 >> n3;
if (n1 >= n2 >= n3) cout << "max = " << n1;
}
منشأ خطا در برنامۀ بالا اين اصل است كه عبارات منطقي مقدارهاي عددي دارند.
8- دستورهاي انتخاب تودرتو
دستورهاي انتخاب ميتوانند مانند دستورالعملهاي مركب به كار روند. به اين صورت که يك دستور انتخاب ميتواند درون دستور انتخاب ديگر استفاده شود. به اين روش، جملات تودرتو ميگويند.
مثال 12-3 دستورهاي انتخاب تودرتو
اين برنامه همان اثر مثال 10-3 را دارد:
int main()
{ int n, d;
cout << "Enter two positive integers: ";
cin >> n >> d;
if (d != 0)
if (n%d = = 0) cout << d << " divides " << n << endl;
else cout << d << " does not divide " << n << endl;
else cout << d << " does not divide " << n << endl;
}
در برنامۀ بالا، دستور if..else دوم درون دستور if..else اول قرار گرفته است.
وقتي دستور if..else به شکل تو در تو به کار ميرود، كامپايلر از قانون زير جهت تجزيه اين دستورالعمل مركب استفاده ميكند:
« هر else با آخرين if تنها جفت ميشود.»
9- ساختار else if
دستور if..else تودرتو، اغلب براي بررسي مجموعهاي از حالتهاي متناوب يا موازي به كار ميرود. در اين حالات فقط عبارت else شامل دستور if بعدي خواهد بود. اين قبيل کدها را معمولا با ساختار else ifميسازند.
استفاده از ساختار else if براي مشخص کردن محدودۀ نمره
برنامۀ زير يك نمرۀ امتحان را به درجۀ حرفي معادل تبديل ميكند:
int main()
{ int score;
cout << "Enter your test score: "; cin >> score;
if (score > 100) cout << "Error: that score is out of range.";
else if (score >= 90) cout << "Your grade is an A." << endl;
else if (score >= 80) cout << "Your grade is a B." << endl;
else if (score >= 70) cout << "Your grade is a C." << endl;
else if (score >= 60) cout << "Your grade is a D." << endl;
else if (score >= 0) cout << "Your grade is an F." << endl;
else cout << "Error: that score is out of range.";
}
10- دستورالعمل switch
دستور switch ميتواند به جاي ساختار else if براي بررسي مجموعهاي از حالتهاي متناوب و موازي به كار رود. نحو دستور switch به شکل زير است:
switch (expression)
{ case constant1: statementlist1;
case constant2: statementlist2;
case constant3: statementlist3;
:
:
case constantN: statementlistN;
default: statementlist0;
}
اين دستور ابتدا expression را برآورد ميكند و سپس ميان ثابتهاي case به دنبال مقدار آن ميگردد. اگر مقدار مربوطه از ميان ثابتهاي فهرستشده يافت شد، دستور statementlist مقابل آن case اجرا ميشود. اگر مقدار مورد نظر ميان caseها يافت نشد و عبارت default وجود داشت، دستور statementlist مقابل آن اجرا ميشود.
عبارتdefault يک عبارت اختياري است. يعني ميتوانيم در دستور switch آن را قيد نکنيم. expression بايد به شکل يك نوع صحيح ارزيابي شود و constantها بايد ثابتهاي صحيح باشند.
لازم است در انتهاي هر case دستور break قرار بگيرد. بدون اين دستور، اجراي برنامه پس از اين كه case مربوطه را اجرا کرد از دستور switch خارج نميشود، بلکه همۀ caseهاي زيرين را هم خط به خط ميپيمايد و دستورات مقابل آنها را اجرا ميکند. به اين اتفاق، تلۀ سقوط ميگويند.
case constant1: statementlist1;break;
11- عملگر عبارت شرطي
در اين عملگر ابتدا شرط condition بررسي ميشود. اگر اين شرط درست بود، حاصل کل عبارت برابر با expression1 ميشود و اگر شرط نادرست بود، حاصل کل عبارت برابر با expression2 ميشود.
عملگر عبارت شرطي يکي از امکاناتي است که جهت اختصار در کدنويسي تدارک ديده شده است. اين عملگر را ميتوانيم به جاي دستور if..else به کار ببريم. اين عملگر از نشانههاي ? و : به شکل زير استفاده ميكند:
condition ? expression1 : expression2;
مثلا در دستور انتساب زير:
min = ( x
اگر x
12- كلمات كليدي
اکنون با کلماتي مثل if و case و float آشنا شديم. دانستيم که اين کلمات براي C++ معاني خاصي دارند. از اين کلمات نميتوان به عنوان نام يک متغير يا هر منظور ديگري استفاده کرد و فقط بايد براي انجام همان کار خاص استفاده شوند. مثلا کلمۀ float فقط بايد براي معرفي يک نوع اعشاري به کار رود.
يك كلمۀ كليدي در يك زبان برنامهنويسي كلمهاي است كه از قبل تعريف شده و براي هدف مشخصي منظور شده است.
C++ استاندارد اكنون شامل 74 كلمۀ كليدي است:
|
asm |
and_eq |
and |
|
Bitor |
bitand |
auto |
|
case |
break |
bool |
|
class |
char |
catch |
|
const_cast |
const |
compl |
|
delete |
default |
continue |
|
else |
dynamic_cast |
dodouble |
|
export |
explicit |
enum |
|
float |
dfalse |
extern |
|
goto |
friend |
for |
|
int |
inline |
if |
|
namespace |
mutable |
long |
|
not_eq |
not |
new |
|
or_eq |
or |
operator |
|
public |
eprotected |
privat |
|
return |
reinterpret_cast |
register |
|
sizeof |
signed |
short |
|
struct |
static_cast |
static |
|
this |
template |
swich |
|
try |
TRUE |
throw |
|
typename |
typoid |
typedef |
|
unsigned |
union |
using |
|
volatile |
void |
virtual |
|
xor |
while |
wchar_t |
|
|
|
xor_eq |
دو نوع كلمۀ كليدي وجود دارد:
1- كلمههاي رزرو شده
2- شناسههاي استاندارد.
يك كلمۀ رزرو شده كلمهاي است که يک دستور خاص از آن زبان را نشان ميدهد. كلمۀ كليدي if و else كلمات رزرو شده هستند.
يك شناسۀ استاندارد كلمهاي است كه يك نوع دادۀ استاندارد از زبان را مشخص ميكند. كلمات كليدي bool و int شناسههاي استاندارد هستند