"ႏွစ္ထပ္ကြမ္းအေဖသို႔တမ္းခ်င္း"

Sunday, February 13, 2011



"ႏွစ္ထပ္ကြမ္းအေဖသို႔တမ္းခ်င္း"

အေဖ
ပစၥဳပၸန္ေတြအတိတ္ျဖစ္လို႔
သမိုင္းမွတ္တိုင္စိုက္ရစ္တာ
၉၆ ႏွစ္ေတာင္ရွိၿပီအေဖ ..။

အရာအားလံုးကအနိစၥတဲ႔
ဘာသာတရားကသားကိုဆံုးမတယ္အေဖ
ဒါေပမဲ႔
သားတို႔အားလံုးရင္ထဲမွာေတာ႔
အေဖက နိစၥ ပဲ အေဖ
အၿမဲထာဝရ
တမ္းတမ္းတတ နဲ႔
လြမ္းရေနၾကဦးမွာပါအေဖ..။

တကယ္ဆို
အေဖကလူရိုးပါအေဖ
ဒါေပမဲ႔
ကိုယ္႔အမ်ိဳးကိုခ်စ္ေတာ႔
အေဖမႊတ္ေနေအာင္လည္တက္ခဲ႔တယ္ ...။

အေဖကလူဖလန္ေလးရယ္ပါ
ဒါေပမဲ႔ အေဖ႔သတၱိ
အေဖ႔သိကၡာ
အေဖ႔ရဲ့အစြမ္းေတြကေတာ႔
ဧရာမ လူသန္ႀကီးေတြထက္
အျပတ္အသတ္
ခန္႔ညားေနတယ္အေဖ..။

အေဖကအညာသားဆိုေတာ႔
အသားေတာ႔မဲခ်င္မဲမွာပါ
ဒါေပမဲ႔ေသခ်ာတယ္
အေဖ႔အသည္းကအျဖဴတကာ႔အျဖဴ..။

အေဖ႔စကားေတြ
သားနားေထာင္ၾကည့္တယ္အေဖ
အေဖကစကားေျပာမေျပျပစ္ပါဘူး
ပိတ္သေလးခဲနဲ႔ပစ္သလို
တစ္တစ္ခြခြေျပာတက္တယ္လို႔ထင္မိတယ္
ေနာက္ေတာ႔မွသတိရတယ္
အေဖေျပာတာစကားဆိုေပမဲ႔
ႏွုတ္ဖ်ားကလာတာမွမဟုတ္တာ
heart to heart
ရင္ဘက္နဲ႔အပ္ၾကည့္မွ
အေဖ႔စကားေတြက
သကာရည္ျမစ္ ၁၀ စင္းထက္
ခပ္ျပင္းျပင္းေတာင္ပိုလို႔ခ်ိဳေနေသးတယ္ ..။

အေဖကေရႊအစစ္ပါအေဖ
အေဖ႔ေခါင္းေဆာင္မွု
အေဖ႔ရဲ့ရိုးသားမွဳ
အေဖ႔ရဲ့သတၱိ
အေဖ႔ခံယူခ်က္
အေဖ႔အျမင္
အေဖ႔အေၾကာင္း
လူေပါင္းစံု
အလႊာေပါင္းစံု
ေထာင္႔ေပါင္းစံုက
ဘယ္လိုမွတ္ေက်ာက္နဲ႔ပဲျခစ္ျခစ္
အေဖက ေရႊအစစ္ဆိုတာ ျငင္းမရနိုင္ဘူးအေဖ..။

အေဖကေက်ာင္းသား
အေဖကစစ္သား
အေဖကနိုင္ငံေရးသမား
ဘဝအခ်ိဳးေကြ႔ေတြဘယ္လိုပဲမ်ားမ်ား
လူေတာ္ဆိုတာအရာတိုင္းမွာေတာ္ပီး
လူေကာင္းဆိုတာအခ်ိန္ခါမေရြးေကာင္းတယ္ဆိုတာ
အေဖတစ္ေယာက္ကိုပဲၾကည့္ပီး
သားတို႔သိနိုင္ခဲ႔တာပါအေဖ....။

အေဖကေျပာခဲ႔တယ္
လူႀကီးဆိုတာ
အသိဥာဏ္ႀကီးႀကီးနဲ႔
အလုပ္ႀကီးအကိုင္ႀကီးလုပ္တဲ႔လူေတြတဲ႔ ...
လူငယ္ဆိုတာ အမွန္တရားျမတ္နိဳးတဲ႔လူ တဲ႔ ...
ခုသားတို႔ပတ္ဝန္းက်င္မွာေတာ႔
လူႀကီးဆိုတာအတၱႀကီးတဲ႔လူ
လူငယ္ဆိုတာသေဘာထားငယ္တဲ႔လူ
ဆိုတာကိုပဲသားေတြ႔ေနရတယ္အေဖ...။

အေဖ႔တုန္းကေတာ႔
တိုင္းရင္းသားလူမ်ိဳးအမ်ားျပားကို
တသားတည္းျဖစ္ေအာင္စြမ္းနိုင္ခဲ႔တယ္..
ခုေတာ႔သားတို႔ဆီမွာ
လူမ်ိဳး၂ မ်ိဳးပဲရွိေတာ႔တယ္အေဖ
" ဟိုလူတစ္မ်ိဳး နဲ႔ ဒီလူတစ္မ်ိဳး "
လက္ညွိဳးေတြတစ္ထိုးထိုး
ယိုးစြပ္လာလိုက္ၾကတာ
ေခတ္ေတြေဟာင္းလို႔
ယိုးစြပ္နည္းစနစ္ေတြသာေျပာင္းလာတယ္
ခုထိေပါင္းစည္းလို႔မရဘူးအေဖ ...။

လူငယ္ေတြညည္းခ်င္းမ်ား
အေဖၾကားရင္
ခါးကိုေထာက္ပီး
ရိုးသားၾကစမ္း
ႀကိဳးစားၾကစမ္းလို႔
အေဖေျပာေလမလား
သားေတြးေနမိတယ္အေဖ ..။

အေဖတစ္ေယာက္လိုုဂါရဝနဲ႔
သားကန္ေတာ႔ပါရေစအေဖ ..။

အေဖ႔ကိုအရိုေသေပးလို႔
အေလးလည္းျပဳပါတယ္အေဖ..။

အေဖထာဝရၿငိမ္းခ်မ္းေနပါေစ...။

13.2.2011 မွာက်ေရာက္ေသာ အေဖဗိုလ္ခ်ဳပ္ေအာင္ဆန္း၏ ၉၆ ႏွစ္ေျမာက္ေမြးေန႔အမွတ္တရ
ဆက္လက္ဖက္ရႈ႕ရန္

Pascal Programming Books

Friday, September 10, 2010


စာအုပ္အမည္ = Pascal Programming Books
ဘာသာစကား = ျမန္မာ ၊ အဂၤလိပ္
ပမာဏ = 20.4MB
ဖိုင္အမ်ိဳးအစား = pdf

Photobucket
ဆက္လက္ဖက္ရႈ႕ရန္

borland 5.02 C++

ေဆာ႔ဖ္ဝဲအမည္ = borland 5.02 C++
ပမာဏ = 91.29 MB

Photobucket
ဆက္လက္ဖက္ရႈ႕ရန္

Csharp 3 BegineerGuide


စာအုပ္အမည္ = Csharp 3 BegineerGuide
ဘာသာစကား = အဂၤလိပ္
ပမာဏ = 6.28 MB
ဖိုင္အမ်ိဳးအစား = pdf


Photobucket
ဆက္လက္ဖက္ရႈ႕ရန္

ေဆြးေႏြးခ်က္ (၁၇)

Friday, September 3, 2010

Arrays

Array ဆိုတာ data items အမ်ားႀကီးကို တူညီတဲ႔ ဘံုနာမည္တစ္ခုေပးၿပီးေတာ႔ storage လုပ္ဖို႔အတြက္ သတ္မွတ္ထားတဲ႔ data type တစ္မ်ိဳးပါပဲ ။ တနည္း အားျဖင္႔ array ဆိုတာ data type တူညီတဲ႔ data အစုေဝးလို႔လည္းေျပာလို႔ရပါတယ္ ။


An array of airplanes



An array of cards



An array of characters


ပံုေလးေတြကိုၾကည့္ၾကည့္ပါ ။ အမ်ိဳးစားတူညီတဲ႔ ေဒတာ အစုအေဝး ကို array လို႔ေခၚနိုင္တယ္ဆိုတာ သေဘာေပါက္ပါလိမ္႔မယ္ ။ ကၽြန္ေတာ္တို႔ က Array တစ္ခု ကိုေၾကျငာလုိက္ၿပီဆိုတာနဲ႔ ကြန္ပ်ဴတာရဲ့ မန္မိုရီမွာ နာမည္တစ္ခုနဲ႔ ေဘာက္စ္ေလး အျဖစ္ေနရာယူလိုက္တယ္လို႔ ေတြးၾကည့္နိုင္ပါတယ္ ။ အဲဒီေဘာက္စ္ေလး မွာ အပိုင္းေလးေတြထပ္ပိုင္းမယ္ အဲလို ပိုင္းလိုက္တဲ႔အပိုင္းေလးတစ္ခုခ်င္းစီ ကို array ရဲ့ element လို႔ေခၚပါတယ္ ။ arrays မွာဆိုရင္ one-dimensional array နဲ႔ multi-dimensional array ရယ္လို႔ထပ္ၿပီးခြဲလို႔ရပါတယ္ ။

Array ကိုဘာေၾကာင္႔သံုးရတာလဲ

Array ရဲ့ အဓိပၸါယ္ န႔ဲ အမ်ိဳးစားကိုသိၿပီးၿပိဆိုရင္ array ကိုဘာေၾကာင္႔သံုးရလဲဆိုတာသိရင္ပိုအဆင္ေျပမယ္ထင္ပါတယ္ ။ ဥပမာ data type (int , float , char, …etc) ကြဲျပားမွုမရွိတဲ႔ ေဒတာ ၁၀ ခုကို ၁၀ ခါေၾကျငာၿပီးသံုးမယ္ဆိုရင္ မန္မိုရီမွာေနရာယူတာလည္းမ်ားမယ္ ။ လုပ္ေဆာင္ဖို႔အခ်ိန္လည္းၾကာမယ္ ေလ ။ အဲဒါဆိုေတာ တူညီေနတဲ႔ data ေတြကို ဘံုနာမည္တစ္ခုေပးၿပီး array အျဖစ္သံုးလိုက္မယ္ဆိုရင္ အခ်ိန္ကုန္လည္းသက္သာသလို ပိုၿပီးလည္းအဆင္ေျပတာေပါ႔ ။
int a = 10;
int b = 20;
int c = 30;
int d = 40;
လို႔ ေၾကျငာမဲ႔အစား
int Numbers[4]={10,20,30,40};
လို႔ေၾကျငာလိုက္တာပါ ။

Arrays ေတြကိုေၾကျငာျခင္း

One-dimensional array အတြက္

DataType Array_Name [ subscript ];
int OneDiArray [ 10 ]; // ဥပမာ ( 1,2,3,4,5,6,7,8,9,10 ) ဆိုၿပီး အတန္းလိုက္ ၁၀ လံုးရွိမွာပါ ။

Multi-dimensional array အတြက္

One-dimension ထပ္ပိုတဲ႔ ဟာေတြကို multi-dimensional array လို႔ ေခၚပါတယ္ ။ two-dimension ကေန စၿပီး dimension အမ်ားႀကီးထိျဖစ္နိုင္ပါတယ္ ။

DataType Array_Name [row][column]; //two-dimensional array
DataType Array_Name [pages][row][column]; // three-dimensional array

Float fNumbers [3][4];

// အေပၚမွာတုန္းက row နဲ႔ columns ဆိုတာ အလြယ္မွတ္တဲ႔နည္းပါ ။ တကယ္တန္းသူ႔အဓိပၸါယ္က Elements ၄ ခုပါတဲ႔ arrays ၃ ခုရွိမယ္လို႔ ေျပာခ်င္တာပါ ။ fNumbers ဆိုတဲ႔ array မွာ elements ဘယ္ႏွခုပါမလဲဆိုေတာ႔ 3X4 =12 လံုးပါမယ္ ။

Double dNumbers[2][3][4];

// သူကေတာ႔ [3][4] က two-dimensional တုန္းကအတိုင္းပါပဲ ။ [2][3][4] ကေတာ႔ 3 rows , 4 columns ပါမဲ႔ two-dimension arrays ၂ ခုရွိမယ္လို႔ေျပာခ်င္တာပါ ။ သူ႔မွာပါဝင္မဲ႔ elements အေရအတြက္ကိုသိခ်င္ရင္ 2x3x4= 24 ရွိမွာျဖစ္ပါတယ္ ။

စၿပီးေလ႔လာခါစဆိုရင္ dimension ေတြမွာမ်က္စိလည္တက္ပါတယ္ ။ မ်က္စိမလည္ေအာင္အလြယ္မွတ္ တဲ႔နည္း ကေတာ႔ အေပၚမွာေျပာခဲ႔တဲ႔တိုင္းပါပဲ ။ ေသခ်ာနားလည္သြားေအာင္ေနာက္တစ္ေခါက္ထပ္ေျပာျပပါ႔မယ္ ။

One-dimension
Int OneDimension [5] ;
1 2 3 4 5 ဆိုၿပီး ၅ လံုး တန္း တစ္တန္း ျဖစ္ပါတယ္ ။

Two-dimension

Int TwoDimension [4][5];
One-dimension တုန္းကလို array မ်ိဳး ၄ ခုပါဝင္ပါမယ္ ။ [4][5] မွာ 5 သည္ အတန္း (row)တစ္ခုခ်င္းဆီမွာပါဝင္မဲ႔ elements အေရတြက္ ၊ 4 သည္ ပါဝင္မဲ႔ အတန္း အေရအတြက္ ။

1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
21 22 23 24 25

Elements 25 ခုပါဝင္ေနတဲ႔ အေပၚက ဟာတစ္ခုလံုးကို two-dimension array တစ္ခုလို႔ေခၚပါတယ္ ။

Three-dimension

Int ThreeDimension [3][4][5];
Two-Dimension တုန္းကလို array မ်ိဳး ၃ ခုပါဝင္ပါမယ္ ။ elements 60 ပါဝင္ပါမယ္ ။ အဲဒီ elements 60 ပါဝင္တဲ႔ array တစ္ခုလံုးကို Three-Dimensional array တစ္ခုလို႔ေခၚပါတယ္ ။

Four-Dimension

Int FourDimension [2][3][4][5];
Three-Dimension တုန္းကလို array မ်ိဳး ၂ ခုပါဝင္ပါမယ္ ။ elements 120 ပါဝင္ပါမယ္ ။ အဲလို elements 120 ပါဝင္မဲ႔ array တစ္ခုလံုးကို four-Dimensional array တစ္ခုလို႔ ေခၚပါတယ္ ။

ေနာက္ dimension ေတြလည္းထိုနည္း လည္းေကာင္း အတိုင္းျဖစ္ပါတယ္ ။ ေသခ်ာၾကည့္ရင္နားလည္နိုင္လိမ္႔မယ္ထင္ပါတယ္ ။


Initializing An Array

Arrays ေတြကို သုံးမယ္ဆိုရင္ သံုးမဲ႔ array ကုိ intialize လုပ္ေပးဖို႔လိုပါတယ္ ။ array ေတြေၾကျငာတုန္းက ကၽြန္ေတာ္တို႔က array မွာ elements ဘယ္ႏွခု store လုပ္မယ္ဆိုတာကိုေၾကျငာခဲ႔ပါတယ္ ။ အဲလို ေၾကျငာၿပီးသတ္မွတ္ထားတဲ႔ေနရာေလးေတြမွာ value ေလးေတြထည့္ေပးရပါမယ္ ။ အဲဒါကို intialize လုပ္တယ္လို႔ေခၚပါတယ္ ။ တကယ္လို႔ ကၽြန္ေတာ္တို႔ကသာ intialize လုပ္မေပးဘူးဆိုရင္ ကၽြန္ေတာ္တို႔ ေၾကျငာထားတဲ႔ array ေတြက သူ႔ဘာသာ default value ေတြကို intialize လုပ္ေပးနိုင္မွာမဟုတ္ပါဘူး ။ array ေတြကို intialize လုပ္ရာ မွာ declare လုပ္ေပးရင္း တခါတည္း intialize လုပ္တာရယ္ ။ အေပၚမွာ declare လုပ္ၿပီးမွ ထည့္ခ်င္တဲ႔ element ေလးေတြကို ထည့္ေပးတာရယ္ ရွိပါတယ္ ။ ေအာက္က ဥပမာေလးၾကည့္ၾကည့္ပါ ။ ဒါကေတာ႔ declare လုပ္ရင္ းတခါတည္း initialize ပါတြဲလုပ္တ႔ဲ ပံုစံေပါ႔ ။

Example

#include <iostream>
using namespace std;

int main()
{
//initializing arrays
char c[]={'A','R','R','A','Y'};
int n[ 10 ] = { 2, 7, 4, 8, 5, 4, 9, 7, 6, 3 };

for ( int j = 0; j < 5; j++ )
cout << c[ j ] <<" ";
cout<<"---->";

for ( int i = 0; i < 10; i++ )
cout << n[ i ] <<" ";
cout<<endl;

cout<<"Element in character array[0] = "<<c[0]<<endl;
cout<<"Element in number array[0] = "<<n[0]<<endl;
return 0;
}

ရွင္းလင္းခ်က္

• Array ကို ေၾကျငာမယ္ဆိုရင္ လိုအပ္တဲ႔ပံုစံ အတုိင္းပဲ type ရယ္ array name ရယ္ ၿပီးေတာ႔ [] (square brackts - ေလးေထာင္႔ကြင္း ) ရယ္ပါပါမယ္ ။ တခါတေလမွာ square brackets ထဲမွာ dimension တန္ဖိုးမပါပဲလည္းေရးလို႔ရပါတယ္ ။ ဥပမာ char c[] လိုေပါ႔ ။ တခါတေလမွာေတာ႔ square brackets ထဲမွာ တန္ဖိုးထည့္ေရးနိုင္ပါတယ္ ။ ဥပမာ int n[ 10 ] လိုေပါ႔ ။ ၿပီးရင္ = (equal sign) ခံပါတယ္ ။ ေနာက္ၿပီး ၾကရင္ {} (braces - တြန္႔ကြင္း) ထဲမွာ ကိုယ္ထည့္ခ်င္တဲ႔ တန္ဖိုး (characters , numbers ) ေတြကို ေကာ္မာ ( , ) ခံၿပီးေရးေပးရမွာပါ ။ ၿပီးရင္ေတာ႔ ( ; ) နဲ႔ပိတ္ ေပးရပါမယ္ ။ ဒါဆိုရင္ arrays ေတြကို declare လုပ္တာနဲ႔ initialize လုပ္တာၿပီးပါၿပီ ။
• ေအာက္က for looping ၂ ခုကေတာ႔ array ၂ ခုကို secreen မွာ ထုတ္ျပေပးဖို႔ပါ ။ array မွာေတာ႔ for looping ေတာ္ေတာ္သံုးပါတယ္ ။ for loop ရဲ့အလုပ္လုပ္ပုံကိုနားလည္မွရမွာပါ ။
• ေအာက္ က cout ၂ ခု ထုတ္ေပးထားတာကေတာ႔ array မွာ elements ေတြဘယ္လိုေနရာခ်လဲဆိုတာသိသာေအာင္လို႔ပါ ။ array မွာေနရာခ်ရင္ ၀ (သုည) ကေနစၿပီးေနရာခ်တာပါ ။ အေပၚက ဥပမာမွာ c[0] နဲ႔ n[0] ကိုထုတ္ေပးထားပါတယ္ ။ ကၽြန္ေတာ္တို႔ initialize လုပ္ထားတဲ႔ ပထမဆံုး ဂဏန္းေတြကို ထုတ္ေပးမွာျဖစ္ပါတယ္ ။ ကၽြန္ေတာ္တုိ႔မ်က္စိနဲ႔ၾကည့္ၿပီးေရေတာ႔သာ ၁ ခု ၂ ခု ၃ ခု ဆိုၿပီး elements ေတြကိုေရေနေပမဲ႔ array ကလက္ခံတဲ႔အခါ ၀ ၊ ၁ ၊ ၂ ၊ ၃ ဆိုၿပီး ေရတြက္ပါတယ္ ။ မ်က္စိလည္တက္ပါတယ္ ။ မွတ္ထားရမွာပါ ။


Result


Initialize လုပ္တာေနာက္ထပ္ပံုစံတစ္မ်ိဳးျဖစ္တဲ႔ အရင္ဆံုးေၾကျငာၿပီးေနာက္ၿပီးမွ ႏွစ္သက္ရာ value ကို user ကထည့္ေပးတဲ႔ဥပမာ ေလးထပ္ၾကည့္ပါဦး ။

#include <iostream>
using namespace std;

int main()
{
int n,i,j;
int Num[100];
cout<<"How many numbers in arrays = ";
cin>>n;
for(i=0;i<n;i++)
{
cout<<"Enter Num["<<i<<"] = ";
cin>>Num[i];
}

cout<<"Your Array is = ";
for(j=0;j<n;j++)
{
cout<<Num[j]<<" ";
}
cout<<endl;
return 0;
}

ရွင္းလင္းခ်က္

• Program မွာသံုးမဲ႔ variableေတြျဖစ္တဲ႔ I,j,n တို႔ကို ေၾကျငာလုိက္ပါတယ္ ။ ၿပီးေတာ႔ Num ဆိုတဲ႔ array တစ္ခုကို elements ၁၀၀ အတြက္ဆိုၿပီး ေၾကျငာလုိက္ပါတယ္ ။
• အရင္ဥပမာတုန္းကလို တစ္ခါတည္း value ေတြထည့္ထားတာမ်ိဳးမဟုတ္ပဲ Program ကိုသံုးမဲ႔ user စိတ္ႀကိဳက္ elements ဘယ္ႏွလံုးထည့္ခ်င္လဲဆိုတာေမးလိုက္ပါတယ္ ။ user ကေနထည့္ေပးလိုက္တဲ႔တန္ဖိုးကို variable n ထဲမွာထည့္ထားလိုက္ပါတယ္ ။
• For looping စၿပီးသံုးပါတယ္ ။ i=0 ကေနၿပီး i တန္ဖိုး က ယူဆာ ထည့္ေပးတဲ႔ n ကိုေရာက္တဲ႔အထိ i<n တိုင္ေအာင္ အလုပ္လုပ္ခိုင္းလိုက္ပါတယ္ ။ ဘာလို႔လဲဆိုေတာ႔ array က 0 elements ကေနစလို႔ပါပဲ ။ for loop ထဲမွာပါပဲ elements တစ္ခုခ်င္းစီ အတြက္ တန္ဖိုးေတြကို user ကို ထည့္ေပးခိုင္းပါတယ္ ။ အဲဒီထည့္ေပးလိုက္တဲ႔တန္ဖိုးေတြကို array နဲ႔ဖမ္းထားလိုက္ပါတယ္ ။
• ေနာက္ for loop တစ္ခုကေတာ႔ ယူဆာထည့္ေပးတဲ႔ array ကို ျပန္ျပေပးတာျဖစ္ပါတယ္ ။

Result


Random Arrays

Arrays ရဲ့ elements ေတြကို declare လုပ္ရင္တခါတည္း initialize လုပ္တာရွိတယ္ ။ ေနာက္ၿပီး ယူဆာ ရဲ့စိတ္ႀကိဳက္ တန္ဖိုးေတြရိုက္ထည့္တာ ရွိတယ္ ။ အခု ဟာကေတာ႔ Ramdom ေခါက္ၿပီးထည့္တာ ပါ ။ Ramdom ဆိုတာကေတာ႔ ကံစမ္းမဲအတြက္ ေဂၚလီလံုးေလးေတြႏွိဳက္သလို ပါပဲ သူက်ခ်င္တဲ႔ ဂဏန္းေတြက်ပါတယ္ ။ arrays ရဲ့ elements ေတြအတြက္ တန္ဖိုးထည့္ရာမွာလည္း ဘယ္ကေနဘယ္အတြင္း က ဂဏန္းေတြ ကို random numbers ေခါက္ေပးပါလို႔ေျပာထားလို႔ရပါတယ္ ။ ဥပမာေလးကိုၾကည့္ၾကည့္ရေအာင္။

Example

#include <iostream>
#include <stdlib>h>
using namespace std;
int main()
{
int a[10], b[3][4];
double d[10];

cout<<"First array : "<<endl;
for (int i=0;i<10;i++)
a[i]=rand()%400;

for (int i=0;i<10;i++)
cout<<a[i]<<" ";
cout<<endl;
cout<<endl;

cout<<"Second array : "<<endl;
for (int i=0;i<3;i++)
d[i]=rand()/32768>0;
for (int i=0;i<3;i++)
cout<<d[i]<<" ";
cout<<endl;
cout<<endl;
cout<<"Third array : "<<endl;
for (int i=0;i<3;i++)
for (int j=0;j<4;j++)
b[i][j]=rand()%100+1;

for (int i=0;i<3;i++)
{cout<<endl;
for (int j=0;j<4;j++)
cout<<b[i][j]<<" ";
}
cout<<endl;
cout<<endl;
return 0;
}

ရွင္းလင္းခ်က္

• Program ထဲမွာကၽြန္ေတာ္တို႔ က rand() ဆိုတဲ႔ဖန္ရွင္ကိုသံုးမွာျဖစ္လို႔ သူနဲ႔ပက္သက္တဲ႔ header file ကိုဦးစြာေၾကျငာေပးရပါမယ္။ rand ဖန္ရွင္ဟာ stdlib>h ရဲ့ေအာက္မွာရွိလို႔ အေပၚမွာသူ႔ကိုေၾကျငာေပးခဲ႔ရပါမယ္ ။
• Program မွာသံုးမဲ႔ variables နဲ႔ arrays ေတြကို declare လုပ္ပါတယ္ ။
• ေနာက္ First Array ရဲ့ေအာက္မွာ for looping စသံုးၿပီးေတာ႔ array a[] ထဲကို ၀ ကေန ၃၉၉ ထိဂဏန္းေတြကို random ေခါက္ၿပီးထည့္လိုက္ပါတယ္ ။ မ်က္စိနည္းနည္းလည္သြားမယ္ထင္တယ္ ။ rand ရဲ ့အလုပ္လုပ္ပံုကိုေအာက္မွာတစ္ခ်က္ၾကည့္ၾကည့္ပါ ။
rand () -- ဆိုရင္ 0 ကေန infinity သူက်ခ်င္ရာက်မွာပါ ။
rand ()% 400 - ဆိုရင္ 0 ကေန 399 အတြင္း ဂဏန္းေတြကို random ေခါက္ေပးမွာပါ ။
rand()%100+1 -- ဆိုရင္ 1 ကေန 100 အတြင္းဂဏန္းေတြကို random ေခါက္ေပးမွာပါ
rand()%50+1000 -- ဆိုရင္ေတာ႔ 1000 ကေန 1050 အတြင္းက ဂဏန္းေတြကို random ေခါက္ေပးမွာျဖစ္ပါတယ္ ။
ဒါေၾကာင္႔မို႔ ပ ထမ array မွာဆိုရင္ elements တန္ဖိုး ကို ၁၀ လံုးေပးထားတဲ႔အတြက္ 0 ကေန 399 ၾကားမွာရွိတဲ႔ ဂဏန္း ၁၀ လံုးပါဝင္မွာျဖစ္ပါတယ္ ။
• ဒုတိယ arrays မွာက်ေတာ႔ elements ကို ၃ လံုးပဲထုတ္ခိုင္းထားတယ္ ။ ဒါေပမဲ႔ random ေခါက္လို႔ရလာတဲ႔တန္းဖိုးကို 32768>0 နဲ႔တခါတည္းတန္းစားၿပီး ရတဲ႔ တန္ဖိုးကိုမွ array ထဲထည့္ခိုင္းထားပါတယ္ ။ ၿပီးတဲ႔အခါမွ အေျဖထုတ္ေပးတဲ႔အခါမွာေတာ႔ ဂဏန္း ၃ လံုးကိုျမင္ရမွာျဖစ္ပါတယ္ ။
• တတိယ array မွာေတာ႔ two-dimension array တစ္ခုကို row 3 ခု column 4 ခုနဲ႔ ေၾကျငာေပးထားပါတယ္ ။ သူ႔ရဲ့ elements ေတြအတြက္ေတာ႔ rand()%100+1 ဆိုတဲ႔အတြက္ ၁ ကေန ၁၀၀ အတြင္း က ဂဏန္း ၁၂ ခုကို random ေခါက္ေပးခိုင္းထားတာျဖစ္ပါတယ္ ။
ကၽြန္ေတာ္ run ထားတ႔ဲအေျဖေလးကိုၾကည့္ၾကည့္ပါ ။ စာဖတ္သူ အေနနဲ႔ကိုယ္တုိင္ Run ၾကည့္မယ္ဆုိရင္ေတာ႔ ကၽြန္ေတာ္ထြက္တဲ႔အေျဖနဲ႔တူခ်င္မွတူမွာပါ ။ ဘာလို႔လဲဆိုေတာ႔ random numbers ေတြဟာတစ္ႀကိမ္နဲ႔တစ္ႀကိမ္မတူညီိလို႔ပါပဲ ။

Result



Finding MAXIMUM , MINIMUM , SUM , AVERAGE in Arrays

Arrays ထဲမွာရွိတဲ႔ elements ေတြရဲ့ အႀကီးဆံုး elements ေတြ အငယ္ဆံုး element ေတြ ၿပီးေတာ႔ အဲဒီ elements ေတြေပါင္းလဒ္ေတြ ၊ၿပီးေတာ႔ အဲဒီ elements ေတြရဲ့ ပ်မ္းမွ် တန္ဖိုးေတြကိုရွာေပးနိုင္မဲ႔ ဥပမာေလးတစ္ပုဒ္ကိုၾကည့္ၾကည့္ရေအာင္ဗ်ာ ။

#include <iostream>
using namespace std;

int main()
{
int n,i,j,sum=0,max,min;
float avg;
int Num[100];
cout<<"How many numbers in arrays = ";
cin>>n;
for(i=0;i<n;i++)
{
cout<<"Enter Num["<<i<<"] = ";
cin>>Num[i];
}
cout<<"Your Array is = ";
for(j=0;j<n;j++)
{
cout<<Num[j]<<" ";
}
cout<<endl;
max=min=Num[0];
for(i=0;i<n;i++)
{
if(Num[i]>max)
max=Num[i];
if(Num[i]<min)
min=Num[i];

sum=sum+Num[i];

}
avg=sum/n;

cout<<"Maximum Number in Array is = "<<max<<endl;
cout<<"Minimum Number in Array is = "<<min<<endl;
cout<<"The Sum of elements in Array is = "<<sum<<endl;
cout<<"Average Number in Array is = "<<avg<<endl;

return 0;
}

ရွင္းလင္းခ်က္

• ထံုးစံအတုိင္းပဲ Program ထဲမွာသံုးမဲ႔ variables (n , I ,j , max ,min , sum ,)ေတြ နဲ႔ array ကိုေၾကျငာလိုက္ေပးလိုက္ပါတယ္ ။
• ၿပီးတဲ႔အခါမွာေတာ႔ အရင္က ဥပမာေရးျပခဲ႔တဲ႔အတိုင္းပဲ array မွာ elements ဘယ္ႏွလံုးေပးမလဲဆိုတာကို ေတာင္းပါတယ္ ။ ေပးလိုက္ၿပီဆိုရင္ cin>>n; ဆိုၿပီ ထည့္ထားလိုက္ပါတယ္ ။ ၿပီးေတာ႔ for looping သံုးၿပီးေတာ႔ element တစ္လံုးခ်င္းစီအတြက္တန္ဖိုးေတြရိုက္ထည့္ေပးခိုင္းပါတယ္ ။ ေနာက္ၿပီး user ရဲ့ array ကို Your array is ဆုိၿပီးျပန္ျပေပးလိုက္တယ္ ။
• ေနာက္တဆင္႔မွာေတာ႔ max=min=Num[0]; ဆိုၿပီး အႀကီးဆံုးအငယ္ဆံုးကိန္းေတြဟာ Num ဆိုတဲ႔ array ရဲ့ ပထမဆံုးကိန္းနဲ႔ ညီပါတယ္ဆိုၿပီး initialize လုပ္ထားလိုက္ပါတယ္ ။
• For loop ကိုသံုးၿပီး စ အလုပ္လုပ္ပါေတာ႔မယ္ ။ ပထမဆံုး for loop တစ္ပါတ္မွာ max နဲ႔ min ထဲမွာ array ရဲ့ ပထမဆံုး element က ဝင္ၿပီးသားျဖစ္လို႔ ပထမအလံုးနဲ႔ ေနာက္ထပ္ ဒုတိယေျမာက္ element နဲ႔တိုက္စစ္လုိက္ပါတယ္ တကယ္လို႔ ဒုတိယ element ဟာ ပထမ element ထက္ ႀကီးမယ္ဆိုရင္ ဒုတိယ element ကို maximum ေနရာေလးမွာေျပာင္းထားလိုက္ပါတယ္ ။ တကယ္လို႔ ငယ္ခဲ႔မယ္ဆိုရင္ေတာ႔ ဒုတိယ element ကို minimun ဆိုတဲ႔ေနရာေလးမွာေျပာင္းထားလိုက္ပါတယ္ ။
• အဲဒီအတိုင္းပဲ ဒုတိယ for looping တစ္ပတ္မွာ တတိယ elements နဲ႔ ထပ္စစ္ပါတယ္ ။ အဲလို နဲ႔ ႀကီးတာေတြ႔ရင္ max ထဲေျပာင္းထည့္လိုက္ ။ ပိုငယ္တာေတြ႔ရင္ min ထဲေျပာင္းထဲ႔လိုက္နဲ႔ looping ပတ္လိုက္စစ္လိုက္ လုပ္လိုက္တာ elements ေတြအားလံုး ကုန္သြားတဲ႔အခါမွာေတာ႔ array ထဲကအႀကီးဆံုး element ဟာ max မွာရွိေနၿပီး ။ အငယ္ဆံုး element ကေတာ႔min မွာရွိေနပါတယ္ ။
• ေနာက္ ေပါင္းလဒ္ေတြကိုရွာ တဲ႔အခါမွာေတာ႔ sum=0; လို႔ intialize လုပ္ေပးထားခဲ႔ၿပီး ေအာက္က for loop ထဲမွာေတာ႔ sum=sum+Num[i]; လို႔ေရးထားတဲ႔အတြက္ ။ sum=0+Num[0]; ကေနစၿပီးေပါင္းလိုက္တာ element ေတြ အားလံုးၿပီးတဲ႔အခါမွာ အားလံုးေပါင္းျခင္းတန္ဖိုး ဟာ sum ထဲမွာေရာက္ေနပါတယ္ ။
• Average တန္ဖိုးကေတာ႔ ရွင္းပါတယ္ ။ elements ေတြအားလံုးရဲ့ေပါင္းျခင္းတန္ဖိုးျဖစ္တဲ႔ sum ကုိတည္ၿပီး ၊ element အေရအတြက္ျဖစ္တဲ႔ user ထည့္ေပးထားတဲ႔ n တန္ဖိုးနဲ႔စားေပးလိုက္တဲ႔အခါမွာ average တန္ဖိုးရလာတာပါ ။
• အားလံုးလုပ္ေဆာင္ၿပီးတဲ႔အခါမွာ အႀကီးဆံုးတန္ဖိုး ၊ အငယ္ဆံုးတန္ဖိုး ၊ ေပါင္းျခင္းတန္ဖိုး ၊ နဲ႔ပ်မ္းမွ် တန္ဖိုးတို႔ကို အသီးသီး secreen မွာထုတ္ေပးလိုက္ပါတယ္ ။
Result ကို ၾကည့္ၾကည့္လိုက္ရင္ ပိုၿပီးနားလည္သြားမယ္ထင္ပါတယ္ ။

Result



How to know Size Of Arrays

Arrays ေတြရဲ့ size (သို႔) array မွာ elements ဘယ္ေလာက္ပါဝင္လဲဆိုတာကို အလြယ္တကူသိနုိင္ပါတယ္ ။ အဲလိုသိဖို႔ အတြက္ sizeof ေအာ္ပေရတာကိုသံုးရပါတယ္ ။ ေအာက္ကဥပမာေလးကိုၾကည့္ၾကည့္ပါ ။

#include<iostream>
using namespace std;
int main()
{
int a[]={1,2,3,4,5,6,11,16,12,2,2,4,6,7,8,9,0,12,-3,5,1,1,100,23,65,90};
char b[]={'O','n','O','u','r','H','a','n','d','s'};
int nArraySize,cArraySize;
nArraySize=sizeof a/sizeof(int); //total size of array/size of array data type

cArraySize=sizeof b/sizeof(b[0]);
cout<<"size Of NumberArray is = "<<nArraySize<<endl;
cout<<"size Of CharacterArray is = "<<cArraySize<<endl;

int min=a[0];
int max=a[0];
for(int i=0;i<nArraySize;i++)
{
if(max<a[i]) max=a[i];
if(min>a[i]) min=a[i];
}
cout<<"Maximum Element in NmuberArray is = "<<max<<endl;
cout<<"Minimun Element in NmuberArray is = "<<min<<endl;
return 0;
}

ရွင္းလင္းခ်က္

• int a[]={1,2,3,4,5,6,11,16,12,2,2,4,6,7,8,9,0,12,-3,5,1,1,100,23,65,90};
char b[]={'O','n','O','u','r','H','a','n','d','s'};
arrays 2 ခုကို declareation နဲ႔ initialization တခါတည္းလုပ္လိုက္ပါတယ္ ။ ၿပီးေတာ႔size ေတြကိုသိဖို႔အတြက္ variables ႏွစ္ခုကို ပါ declare လုပ္ေပးလိုက္ပါတယ္ ။
• အေပၚမွာ ကၽြန္ေတာ္ သံုးခဲ႔ arrays ၂ ခုရဲ့ size (သို႔) element ဘယ္ႏွခု ပါသလဲဆိုတာ သိခ်င္တယ္ ။ အဲဒီအတြက္ေၾကာင္႔ sizeof array/sizeof array(type) ဆို ၿပီး sizeof Operator ကိုသံုးၿပီးရွာလိုက္ပါတယ္ ။ Program မွာေတာ႔ sizeof a/sizeof a(int); ဆိုၿပီးေရးထားပါတယ္ ။ အဲလိုမ်ိဳးသံုးလို႔ရသလို sizeof a/ sizeof (a[0]); ဆိုတဲ႔ပံုစံမ်ိဳးလည္း သံုးနိုင္ပါေသးတယ္ ။ အဲဒီ ၂ ခုကတူတူပဲျဖစ္ပါတယ္ ။
• ေနာက္ character array အတြက္ size ကိုလည္း အေပၚကနည္းအတိုင္း ပဲ sizeof b/sizeof (char); လို႔ေရးၿပီးရွာနိုင္သလို sizeof b/sizeof(b[0]); လို႔ေရးၿပီးလည္းရွာနိုင္ပါတယ္ ။
• Arrays ၂ ခုရဲ့ size ေတြကို သိသာေအာင္ secreen မွာထုတ္ေပးလိုက္ပါတယ္ ။
• ၿပီးတဲ႔အခါမွာေတာ႔ အရင္ဥပမာတုန္းကတိုင္းပဲ max နဲ႔ min ကို intialize လုပ္လိုက္တယ္ ။ ၿပီးေတာ႔ i=0 ကေန အခုနကရွာထားတဲ႔ size အထိ looping ပတ္ၿပီး Maximun နဲ႔ minimun တန္ဖိုးေတြကိုရွာေပးလိုက္ပါတယ္ ။အေပၚဥပမာနဲ႔တူတူမို႔ အက်ဥ္းခ်ဳပ္ေျပာလိုက္တာပါ ။ ဒီဥပမာ က sizeof သံုးၿပီး array ေတြရဲ့ size ရွာတာ ကို အဓိကေျပာခ်င္တာပါ ။

Result



Sorting in Arrays

အခု Arrays ေတြမွာ elements ေတြကို sorting လုပ္တဲ႔နည္းကို ဥပမာေလးနဲ႔ေဆြးေႏြးေပးပါမယ္ ။ ေအာက္ကဥပမာေလးကိုၾကည့္ၾကည့္ပါ။
#include<iostream>
using namespace std;
int main()
{
int i;
int j,n;
int tmp;
int arr[]={6,3,9,8,4,8,9,4,2,9,4,8,1,5,2};
n=sizeof arr/sizeof(int);
cout<<"Before Sorting ---> ";
for(j = 0; j < n; j++)
{
cout<<arr[j]<<" ";
}
cout<<endl;
//start sorting ascending
for(i = 0; i <= n-1; i++)
{
for(j = 0; j <= n-2-i; j++)
{
if( arr[j]>arr[j+1] )
{
tmp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = tmp;
}
}
}
//For Output
cout<<"After Sorting(Ascending) ---> ";
for(j = 0; j < n; j++)
{
cout<<arr[j]<<" ";
}
cout<<endl;

//start sorting decending
for(i = 0; i <= n-1; i++)
{
for(j = 0; j <= n-2-i; j++)
{
if( arr[j]<arr[j+1] )
{
tmp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = tmp;
}
}
}
//For Output
cout<<"After Sorting(Decending) ---> ";
for(j = 0; j < n; j++)
{
cout<<arr[j]<<" ";
}
cout<<endl;

return 0;
}

ရွင္းလင္းခ်က္

• အရင္ဥပမာေတြတုန္း ကေဆြးေႏြးခဲ႔တဲ႔တိုင္းပါပဲပထမဆံုးလိုအပ္တာေတြကို declare လုပ္တယ္ array ရဲ့ size ကိုရွာမယ္ ။ ၿပီးေတာ႔ looping ပတ္ၿပီး sorting မစီရေသးခင္ array ကုိထုတ္ျပမယ္ ။ ဒီအထိက အရင္ဥပမာေတြတိုင္းပါပဲ ။
• Start sorting ဆိုတဲ႔ အစိမ္းေရာင္ေလးနဲ႔ ကြန္႔မန္႔ေပးထားတဲ႔ေနရာေလးကစၿပီး array ထဲက elements ေတြကို sorting စီမွာျဖစ္ပါတယ္ ။ sorting စီတဲ႔ေနရာမွာ bubblesort နည္းကိုသံုးၿပီးစီမွာျဖစ္ပါတယ္ ။ program ထဲမွာေတာ႔ for loop ၂ ခုသံုးၿပိးေရးထားတယ္ ၿပီးေတာ႔ i<n-1 ေတြေရာ i<n-2-i ေတြေရာဆိုေတာ႔ နည္းနည္းရွဳပ္သလိုလိုပါပဲ ။ ဒါေပမဲ႔ bubble sort ရဲ့ စီတဲ႔ပံုကို ၾကည့္ရင္ နားလည္လြယ္မွာပါ ။ ကၽြန္ေတာ္႔ ေပးထားတဲ႔ array မွာက element 15 လံုးရွိပါတယ္ အားလံုးစီျပရင္ေတာ႔ အရွည္ႀကိးျဖစ္ေနမွာမို႔ ေရွ့ ၅ လံုးပဲစီျပပါ႔မယ္ ။ ငယ္စဥ္ႀကီးလိုက္စီမွာျဖစ္လို႔ ေရွ့ေနာက္ ဂဏန္း ၂ လံုးကို ႏွိဳင္းယွဥ္ၿပီး ငယ္တဲ႔ဟာကိုေရွ့ကိုပို႔မွာပါ ။
6 3 9 8 4
၃ ၆ 9 8 4
3 ၆ ၉ 8 4
3 6 ၈ ၉ 4
3 6 8 ၄ ၉
ဒါဆိုရင္Looping တစ္ပါတ္ျပည့္မွာပါ ။ ႏွိဳင္းယွဥ္ၿပီး ခ်ိန္းတဲ႔ ဂဏန္းေတြကိုကၽြန္ေတာ္ျမန္မာလုိေရးျပထားပါတယ္ ။ အခုေနာက္ထပ္တစ္ပါတ္ ထပ္ပတ္မွာျဖစ္ပါတယ္ ။
3 6 8 4 9
၃ ၆ 8 4 9
3 ၆ ၈ 4 9
3 6 ၄ ၈ 9
3 6 4 ၈ ၉
ဒါဆိုရင္ ဒုတိယတစ္ပါတ္ၿပိးပါၿပီ ။
3 6 4 8 9
၃ ၆ 4 8 9
3 ၄ ၆ 8 9
3 4 ၆ ၈ 9
3 4 6 ၈ ၉

ဒါဆိုရင္ ၿပီးသြားပါၿပီ ။ ၆ ၃ ၉ ၈ ၄ ဆိုတဲ႔ ဂဏန္း ၅ လံုးကေန ၃ ၄ ၆ ၈ ၉ ဆိုၿပီး ငယ္စဥ္ႀကီးလိုက္ ဂဏန္းေတြ စဥ္ၿပီးသားျဖစ္သြားပါၿပီ ။ တကယ္လို႔ ႀကီးရာကေနငယ္တဲ႔ ႀကီးစဥ္ငယ္လုိက္စီမယ္ဆိုလည္း ႀကီးတဲ႔ဂဏန္းကို ေရွ့ပို႔ သြားတာပါ ။ ဒါေၾကာင္႔ ascending နဲ႔ decending စီဖို႔ အတြက္ေရးတဲ႔အခါမွာ if (arr[j] < arr[j+1]) ဆို ၿပီး > (greater than) နဲ႔ < (less than) ဆိုတဲ႔ sign ေလး ၂ ခုပဲကြာသြားတာပါ ။
• Ascending Sorting အတြက္ For Loop တစ္ခုသံုးတယ္ၿပီးေတာ႔ OutPut ျပဖို႔အတြက္ For Loop တစ္ခါထပ္သံုးတယ္ ။ စတဲ႔ေနရာေတြကိုသိသာေအာင္လို႔ ကြန္႔မန္႔ေလးေတြနဲ႔ //start sorting Ascending စသည္ျဖင္႔ေရးျပထားပါတယ္ ။
• Decending Sorting အတြက္လည္းပဲ Ascending လိုပါပဲ ။ sorting စီတဲ႔ For loop ေလးကိုေသခ်ာျပန္ၾကည့္ၾကည့္ပါ ။ နားလည္ပါလိမ္႔မယ္ ။


Result


Arrays မွ စံုဂဏန္းမ်ား ၊ မဂဏန္းမ်ား ၊ အႏွုတ္ကိန္းမ်ား ၊ အေပါင္းကိန္းမ်ား ကိုရွာေဖြျခင္း

Arrays ေတြနဲ႔အလုပ္လုပ္ရာမွာ Looping ေတြကိုအသံုးျပဳပါတယ္ ။ အဲဒီ Loop ေတြထဲမွာ စစ္ေဆးတဲ႔ condition ေလးေတြထည့္ၿပီးကိုယ္ လိုခ်င္တဲ႔ elements ေလးေတြခ်ည္းပဲ ထုတ္ႏွဳတ္ၿပီးယူ လို႔ရပါတယ္ ။ အခု ေဆြးေႏြးမွာကေတာ႔ Array တစ္ခုကေနၿပိးေတာ႔ အေပါင္းကိန္း၊ အႏွုတ္ကိန္းေတြ ၊ စံုကိန္းမကိန္းေတြ ထုတ္ႏွဳတ္ၿပီးယူတဲ႔ပံုစံေလးပဲျဖစ္ပါတယ္ ။

Example

#include<iostream>
using namespace std;
int main()
{
int i;
int j,n;
int tmp;
int arr[]={6,3,9,8,4,-8,9,4,2,9,-4,8,1,5,2,0,-23,-3,4,22,35};
n=sizeof arr/sizeof(int);
cout<<"Natural Numbers in Array -----> ";
for(i=0;i<n;i++)
{
if(arr[i]>=0)
cout<<arr[i]<<" ";

}
cout<<endl;
cout<<"Sorting Natural Numbers(ascending)-----> ";
for(i = 0; i <= n-1; i++)
{
for(j = 0; j <= n-2-i; j++)
{
if( arr[j]>arr[j+1] )
{
tmp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = tmp;
}
}
}
for(j = 0; j < n; j++)
{
if(arr[j]>=0)
cout<<arr[j]<<" ";
}
cout<<endl;
cout<<"Negative Numbers in Array -----> ";
for(i=0;i<n;i++)
{
if(arr[i]<=0)
cout<<arr[i]<<" ";

}
cout<<endl;
cout<<"Even Numbers in Array----> ";
for(j = 0; j < n; j++)
{
if(arr[j]%2==0)
cout<<arr[j]<<" ";
}
cout<<endl;
cout<<"Odd Numbers in Array----> ";
for(j = 0; j < n; j++)
{
if(arr[j]%2!=0)
cout<<arr[j]<<" ";
}
cout<<endl;
int max=arr[0];
cout<<"Largest Even Numbers in Array----> ";
for(j = 0; j < n; j++)
{
if((arr[j]%2==0)&&(arr[j]>max))
max=arr[j];

}
cout<<max<<endl;

return 0;
}


ရွင္းလင္းခ်က္

• အေပၚကဥပမာ Program ေလးမွာဆိုရင္ Natural Number ရွာေပးတာ ၊ Negative Nuber ရွာေပးတာ ၊ Even Number ရွာေပးတာ ၊ Odd Numbers ရွာေပးတာ ၊ ေနာက္ၿပီး Even Numbers ေတြထဲကအႀကီးဆံုးကိန္း ရွာေပးတာဆိုၿပီး အပိုင္း ၅ပုိင္းကို သူ႔အပိုင္းေလးနဲ႔သူေရးထားပါတယ္ ။
• ပထမဆံုးကေတာ႔ လုပ္ရိုးလုပ္စဥ္အတုိငး္ပါပဲ Program မွာသံုးမဲ႔ variables ေတြ နဲ႔ array ကို declare လုပ္ပါမယ္ ။ array ရဲ့ Size ကိုရွာေပးပါမယ္ ။ ၿပီးရင္ Natural Numbers ေတြကိုရွာေပးပါမယ္ ။ Natural Numbers ဆိုတာကေတာ႔သိၿပီးတဲ႔အတိုင္းပါပဲ 0 (သုည) ကေနၿပီး infinity (အဆံုးမရွိ) ဂဏန္းေတြထိကို Natural Numbers လို႔ေခၚတာပါ ။ သုညန႔ဲသုညထက္ႀကိးတဲ႔ဂဏန္းအားလံုးကို array ထဲကေန ၿပီး ထုတ္ေပးမွာပါ ။ အဲဒါေၾကာင္႔ ပထမဆံုး array ထဲ က elements အားလံုးကိုအလုပ္လုပ္နိုင္ဖို႔ For (i=0;i<n;i++) ဆိုၿပီး Looping သံုးလိုက္ပါတယ္ ။ ၿပီးေတာ႔ Looping ထဲမွာ ပဲ if(arr[j]>=0) ဆိုၿပီး ကၽြန္ေတာ္တို႔လိုခ်င္တဲ႔ Condition ေလးတစ္ခုနဲ႔ စစ္လိုက္ပါတယ္ ။ array arr ထဲမွာပါတဲ႔ elements ေတြထဲက သုည နဲ႔ သုညထက္ႀကိးတဲ႔ ဂဏန္းေတြပါရင္ေတာ႔ထုတ္ေပးပါလို႔ခိုင္းလိုက္တာပါ ။
• ေနာက္တစ္ပိုင္း ကေတာ႔ အဲဒီ Natural Numbers ေတြကို Sorting အေနနဲ႔စီၿပီးထုတ္ေပးခိုင္းတာပါ ။
• တတိယတစ္ပိုင္းျဖစ္တဲ႔ cout<<”Negative Numbers in Array --” ; ဆိုတဲ႔ေနရာကစၿပိးေတာ႔ Negative (အႏွုတ္) တန္းဖိုးဂဏန္းေတြကို Arrays ထဲကေန ထုတ္ယူေပးဖို႔ေရးထားတာပါ ။ အႏွုတ္တန္ဖိုးဆိုတာကေတာ႔ 0 (သုည) ေအာက္ငယ္ေသာဂဏန္းအားလံုးပါ ။
• Cout<<”Even Numbers in Array--”; ဆိုတဲ႔ Line ရဲ့ေအာက္ကအပိုင္းကေတာ႔ စံုကိန္းေတြကို array ကေန ထုတ္ႏွုတ္ေပးဖို႔ေရးထားတာပါ ။ စံုကိန္းဆိုတာကေတာ႔သိၿပီးတဲ႔တိုင္းပါပဲ ၂ နဲ႔စားၿပီး ျပတ္တဲ႔ကိန္း (အၾကြင္း သုည) အားလံုးကို စံုကိန္းလို႔ေခၚတာပါ ။ အေပါင္းကိန္းေရာ အႏွုတ္ကိန္းပါ အက်ံဳးဝင္ပါတယ္ ။ ဒါေၾကာင္႔မို႔ for Looping ထဲမွာ arr[j]%2==0 လို႔ေရးထားတာပါ ။ % (mod) အၾကြင္းယူတဲ႔ Operator ပါ ။ Operators ေတြအေၾကာင္းေဆြးေႏြးတုန္းကေရးခဲ႔ဖူးပါတယ္ ။
• Cout<<”Odd Numbers in Array -- ”; ဆိုတဲ႔Line ေအာက္ကအပိုင္းကေတာ႔ မကိန္းေတြ ကို array ကေန စစ္ထုတ္ေပးဖို႔ေရးထားတာပါ ။ မကိန္းဆိုတာကေတာ႔ ၂ နဲ႔စားလို႔မျပတ္တဲ႔ကိန္းေတြကိုေခၚတာပါ ။ ဒါေၾကာင္႔ arr[j]%2!=0 ဆိုၿပိး condition ေပးထားတာပါ ။
• ေနာက္ဆံုးတစ္ပိုင္းကေတာ႔ Even Numbers ေတြထဲကေန ၿပီးေတာ႔အႀကီးဆံုးကို ရွာေပးမဲ႔ အပို္င္းပါ ။ array ထဲမွာရွိတဲ႔ elements ေတြထဲကေန ကၽြန္ေတာ္တို႔လိုခ်င္တဲ႔ဟာ က အေျခေန ၂ ခုနဲ႔ ထုတ္ယူရမွာပါ ပထမ စံုကိန္းလည္းျဖစ္ရမယ္ ။ ဒုတိယ စံုကိန္းေတြထဲက အႀကီးဆံုးကိန္းလည္းျဖစ္ရမယ္ ။ အဲဒါေၾကာင္႔ if((arr[j]%2==0)&&(arr[j]>max)) ဆိုၿပီး Condition ၂ ခုကို && (AND Operator) နဲ႔ဆက္ေပးထားတာပါ ။ ရလာမဲ႔ Result ကိုၾကည့္ၾကည့္ပါ ။


Result




Array and Pointer

Array နဲ႔ Pointer အေၾကာင္းကို Pointer အေၾကာင္းေဆြးေႏြးတုန္းကလည္း တစ္ခါေဆြးေႏြးခဲ႔ဖူးပါတယ္ ။ အဲဒီတုန္း က array အေၾကာင္းမေျပာရေသးေတာ႔ ခ်န္လွန္ထားခဲ႔တာေတြရွိခဲ႔ပါတယ္ ။ ဒါေၾကာင္႔ဒီမွာထပ္ၿပီးေဆြးေႏြးလိုက္ပါတယ္ ။ Array ေတြကို Pointer နဲ႔ point လုပ္တဲ႔အခါမွာ Array ရဲ့ ပထမဆံုး element ျဖစ္တဲ႔ array[0] ကိုပဲ Point လုပ္နိုင္ပါတယ္ ။ ဒါေလးကိုသတိထားမိဖို႔လိုပါတယ္ ။ အရင္ေပးခဲ႔တဲ႔ ဥပမာနဲ႔ပဲျပန္ရွင္းျပလိုက္ပါတယ္ ။ ၾကည့္ၾကည့္ ပါ ။


Example

#include<iostream>
using namespace std;
int main()
{
//declare and initialization of array
int iArray[5]={1,2,3,4,5};
char chArray[]="OnOurHands";

//declare Pointers
int *iPtr;
char *chPtr;

//Point Array
iPtr=iArray;
chPtr=chArray;

//deference and Output Pointer
cout<<*iPtr<<endl;
cout<<*chPtr<<endl;

//If you want to output all Elements , do like that
cout<<*(iPtr);
cout<<*(iPtr+1);
cout<<*(iPtr+2);
cout<<*(iPtr+3);
cout<<*(iPtr+4)<<endl;

for(int i=0;i<10;i++)
{
cout<<*(chPtr+i);
}
cout<<endl;
return 0;

}

Array ေတြ Declare လုပ္တယ္ ။ ၿပီးေတာ႔ Pointers ေတြ Declare လုပ္တယ္ ။ Arrays ေတြကို Pointer ေတြနဲ႔ Point လုပ္လိုက္တယ္ ။ အဲဒါေတြၿပီးေတာ႔ cout<<*iPtr<<endl; cout<<*chPtr<<endl; ဆိုၿပီး Pointers ေတြ Derefence လုပ္ၿပီး Output ထုတ္ေပးလိုက္တဲ႔အခါ မွာ 1 ရယ္ O (အို) ရယ္ဆိုၿပီး Array ၂ ခု ရဲ့ ပထမဆံုး Element ၂ ခု ထြက္လာတာကိုေတြ႔ပါလိမ္႔မယ္ ။ ဒါဆိုရင္ Pointer ေတြ က Arrays ေတြရဲ့ ပထမဆံုး Element ကိုသာ Point လုပ္နိုင္တယ္ဆိုတာ သေဘာေပါက္ေလာက္ပါၿပီ ။ ေနာက္မွာေရးထားတာေတြကေတာ႔ ကၽြန္ေတာ္တို႔ က ပထမဆံုး Element တင္မဟုတ္ပဲ Array တစ္ခုမွာရွိတဲ႔ Elements ေတြကို Pointer နဲ႔ထုတ္ေပးခ်င္တဲ႔အခါ Pointer Arithmetic ကိုသံုးၿပီး ထုတ္ေပးတဲ႔ပံုစံ ေရးျပထားတာပါ ။ အဲဒါေၾကာင္႔ ပထမ Integer Array အတြက္
1 2 3 4 5 ေနာက္ Array အတြက္ OnOurHands ဆိုၿပီး Elements အားလံုးထြက္လာတာပါ ။

Example 2

Example 2 မွာေတာ႔ elements ေတြႀကိဳတင္ထည့္မထားခင္ ponter နဲ႔ ႀကိဳၿပီး Point လုပ္ထားၿပီးမွ elements ေတြကိုထည့္တဲ႔ပံုစံေလးပါ။ အရင္ array initialize လုပ္တာေဆြးေႏြးတုန္းကတစ္ခါ ေဆြးေႏြးခ႔ဲဖူးပါတယ္ ။ အဲဒီပံုစံနဲ႔ နည္းနည္းေလးပဲကြာပါတယ္ ။
ေလ႔လာၾကည့္ပါ ။

#include <iostream>
using namespace std;
void main()
{
int Count,*arr;

cout<<"How many numbers in Array : ";
cin>>Count;
arr=new int[Count];
for(int i=0;i<Count;i++)
{
cout<<"Enter arr ["<<i<<"] : ";
cin>>arr[i];
}

cout<<"Your Array is : ";
for(int i=0;i<Count;i++)
{
cout<<arr[i]<<" ";
}
cout<<endl;
}

ရွင္းလင္းခ်က္

• int Count,*arr; မွာ ယူဆာ ကထည့္ေပးတဲ႔ elements ဘယ္ႏွလံုးလဲဆိုတာကို ဖမ္းေပးဖို႔ count ကို integer type အျဖစ္ေၾကျငာတာျဖစ္ၿပီးေတာ႔ *arr ဆိုတာကေတာ႔ pointer array တစ္ခုအျဖစ္ႀကိဳၿပီး ေၾကျငာထားတာပါ ။
• cout<<"How many numbers in Array : ";
cin>>Count;
မွာ စၿပီးေတာ႔ Program User ကိုေမးလိုက္ပါတယ္ array ထဲကို ဂဏန္းဘယ္ႏွလံုးထည့္မလဲေပါ႔ ။ User ထည့္လိုက္တဲ႔ ဂဏန္းကို variable Count ထဲမွာသိမ္းထားလိုက္ပါတယ္ ။
• arr=new int[Count]; ဆိုတာကေတာ႔ ယူဆာကထည့္လိုက္တဲ႔ element အေရအတြက္နဲ႔ array တစ္ခုတည္ေဆာက္ၿပီး Point လုပ္လိုက္တဲ႔သေဘာပါ ။ ဥပမာ Program User ကေန array ထဲမွာ elements ၁၀ လံုးလို႔ ရိုက္ေပးလိုက္တယ္စိုပါ႔စို႔ ။
arr = new int[10]; ဆိုတဲ႔ပံုစံမ်ိဳးျဖစ္သြားပါတယ္ အဲဒါကေတာ႔ Pointer array တစ္ခုျဖစ္တဲ႔ arr မွာ elements ၁၀ ခုပါဝင္တယ္ ။ int arr[10]; ဆိုတဲ႔သေဘာမ်ိဳးျဖစ္သြားပါတယ္ ။ ဘာလို႔ကၽြန္ေတာ္တို႔ က ဒီလိုတန္းမေရးပဲ Pointer array နဲ႔ေရးလည္းဆိုေတာ႔ User ကေန ရိုက္ေပးမဲ႔ Count ဆိုတဲ႔တန္ဖိုး ကို ႀကိဳမသိပါဘူး ။ ၁၀ ျဖစ္ခ်င္လည္းျဖစ္မယ္ ။ ၅ ျဖစ္ခ်င္လည္းျဖစ္မယ္ ။ ၁၀၀ ျဖစ္ခ်င္လည္းျဖစ္မယ္ ။ အဲလိုသူ႔စိတ္ႀကိဳက္ ေပးနိုင္ေအာင္လို႔ အရွင္ျဖစ္ေအာင္လို႔ Pointer array ကိုသံုးၿပီးေရးေပးတာျဖစ္ပါတယ္။
• for(int i=0;i<Count;i++)
{
cout<<"Enter arr ["<<i<<"] : ";
cin>>arr[i];
}
မွာေတာ႔ i = 0 ကေန i < Count (User ရိုက္ထည့္ေပးမဲ႔တန္ဖိုး) ထိ Looping ပတ္ၿပိး Array ထဲကို elements ေတြထည့္သြားမွာျဖစ္ပါတယ္ ။ Looping ပထမတစ္ပါတ္ i = 0 ျဖစ္တဲ႔အခ်ိန္မွာ Enter arr[0] : -- လို႔ေတာင္းမွာျဖစ္ၿပီးေတာ႔ ရိုက္ထည့္ေပးလိုက္တဲ႔တန္ဖိုးကို arr[0] အျဖစ္သိမ္းဆည္းသြားမွာျဖစ္ပါတယ္ ။


• cout<<"Your Array is : ";
for(int i=0;i<Count;i++)
{
cout<<arr[i]<<" ";
}
ကေတာ႔ User ထည့္ထားတဲ႔ elements ေတြကို Secreen မွာ ျပန္ျပေပးဖို႔ေရးေပးထားတာျဖစ္ပါတယ္ ။

ကၽြန္ေတာ္ေဆြးေႏြးတာ က အကုန္ျဖစ္ခ်င္မွျဖစ္မွာပါ ။ ဒါေပမဲ႔ဒီဥပမာ ၂ ခုနဲ႔ဆိုရင္ Pointer နဲ႔ Array ကိုအေျခခံ ေလာက္ေတာ႔ နားလည္လိမ္႔မယ္လို႔ထင္ပါတယ္ ။


Array And Function

တခါတရံမွာ array ေတြကို function ရဲ့ Parameter အျဖစ္ ေရးဖို႔လိုအပ္လာနိုင္ပါတယ္ ။ အဲလို array ေတြကို function မွာ parameter အျဖစ္သံုးမယ္ဆိုရင္ေတာ႔ function ေၾကျငာတဲ႔အခါမွာ void MyFunction(int arg[]) ဆိုၿပီး parameter ေနရာမွာ arg နဲ႔ [] (square bracket) ထည့္ေပးရမွာပါ ။ အဲဒီ arg[] ဟာ int MyArray[50]; စတဲ႔ Integer array မွာပါတဲ႔ elements အားလံုးကုိ pass လုပ္ေပးမွာျဖစ္ပါတယ္ ။ တကယ္လို႔ char arg[] အျဖစ္ ေၾကျငာတယ္ဆိုရင္ေတာ႔ character array ကို pass လုပ္ေပးမွာျဖစ္ပါတယ္ ။ arg ဆိုတာ argument ကိုဆိုလိုတာပါ ။ တကယ္လို႔ arg[] ေနရာမွာ x[] ဒါမွမဟုတ္ myarray [] ဆိုလည္း အလုပ္လုပ္မွာျဖစ္ပါတယ္ ။

Example
// arrays as parameters
#include <iostream>
using namespace std;

void printarray (int arg[], int length)
{
for (int n=0; n<length; n++)
cout << arg[n] << " ";
cout << "\n";
}

int main ()
{
//Declare array
int firstarray[] = {5, 10, 15};
int secondarray[] = {2, 4, 6, 8, 10};
//calling function
printarray (firstarray,3);
printarray (secondarray,5);
return 0;
}


ရွင္းလင္းခ်က္

• Main Function ထဲမွာ
int firstarray[] = {5, 10, 15};
int secondarray[] = {2, 4, 6, 8, 10}; ဆိုၿပီး array ၂ ခုကို declare လုပ္ေပးထားပါတယ္ ။
• ၿပီးတဲ႔အခါမွာေတာ႔ printarray (firstarray,3); ဆိုၿပီး printarray ဆိုတဲ႔ Function ကုိ call ေခၚလိုက္ပါတယ္ ။ အဲလို call ေခၚလိုက္တဲ႔ အခါမွာ firstarray ထဲမွာရွိတဲ႔ elements အားလံုး ကို arg[] က ေကာ္ပီယူ ၊ 3 ကို length ဆိုတဲ႔ parameter ကေကာ္ပီ ယူၿပီး printarray ဖန္ရွင္မွာ passလုပ္ေပးပါတယ္ ။
• ဒါေၾကာင္႔ printarray ဖန္ရွင္မွာ for (int n=0; n<length; n++) လို႔ေျပာထားတဲ႔အတြက္ n တန္ဖို ၀ ကေန firstarray ရဲ့ length တန္ဖိုး ၃ ထိ looping ပတ္ေပးမွာျဖစ္ပါတယ္ ။ cout << arg[n] << " "; ဆိုတဲ႔အတြက္ firstarray မွာပါတဲ႔ elements ၃ ခုကို ထုတ္ေပးသြားမွာျဖစ္ပါတယ္ ။
• Secondarray ကမွာလည္း firstarray အလုပ္လုပ္တဲ႔အတုိင္းတူတူပဲျဖစ္ပါတယ္ ။ ဒီေလာက္ဆို နားလည္မယ္ထင္ပါတယ္ ။


Two-Dimensional Array (or) Matrix

Two-Dimensional Array ဒါမွမဟုတ္ Matrix ဆိုတာ Array တစ္ခုပါပဲ ။ ဥပမာ
Int TwoDimension [6][6];
One-dimension တုန္းကလို array မ်ိဳး ၆ ခုပါဝင္ပါမယ္ ။ [6][6] မွာ ပထမ 6 သည္ အတန္း (row)တန္ဖိုးျဖစ္ၿပီး ၊ ဒုတိယ 6 သည္ အတိုင္ (column) တန္ဖိုး ျဖစ္ပါတယ္ ။ ေနာက္တစ္မ်ိဳး အေနနဲ႔ဆိုရင္ေတာ႔ ေနာက္ကအေရတြက္သည္ element အေရတြက္ ၊ ေရွ့ကတန္ဖိုးသည္ အတန္းအေရတြက္တန္းဖိုး ၊ တစ္တန္းမွာ elements ၆ ခုပါဝင္မဲ႔ ၆ တန္းပါဝင္မယ္လို႔ဆိုလိုတာပါ ။ Matrix နဲ႔ပက္သက္လို႔ လုပ္ေဆာင္နိုင္မဲ႔ Process ေလးေတြကို ကၽြန္ေတာ္သိသေလာက္ေရးထားတာပါ တခါတည္းပဲ ေရးထားပါတယ္ ။ ေလ႔လာၾကည့္ပါ

Example

#include<iostream>
#include<cmath>
using namespace std;
int main()
{
int i,j,k;
int Arr[6][6];

//***********************************************************************
//Input your 2dimensional-array by keyboard
//***********************************************************************
for(i=0;i<6;i++)
for(j=0;j<6;j++)
{
Arr[i][j]=(i+j)-2;
}
cout<<endl;
//Result your matrix
cout<<"1>Your Original Matrix : "<<endl;
for(i=0;i<6;i++)
{
cout<<endl;
for(j=0;j<6;j++)
{
cout<<Arr[i][j]<<" ";

}
}
cout<<endl;

//***********************************************************************
//Sorting your Matrix
//***********************************************************************
cout<<"\n2>After Sorting : "<<endl;
int tempElement;
for (i=0;i<6;i++)
for (j=0;j<6;j++)
for (k=0;k<6;k++)
if (Arr[i][j]>Arr[i][k])
{
tempElement=Arr[i][j];
Arr[i][j]=Arr[i][k];
Arr[i][k]=tempElement;
}
cout<<endl;
for(i=0;i<6;i++)
{
cout<<endl;
for(j=0;j<6;j++)
{
cout<<Arr[i][j]<<" ";

}
}
cout<<endl;

//***********************************************************************
// Delete Column with Largest Element
//***********************************************************************
cout<<"\n3>After Delete Column with Largest Element : "<<endl;
int jmax; // to store no of column with largest element
int max; //to store largest element
int b[6][5];
max=Arr[0][0];
jmax=0;

for (i=0;i<6;i++)
for (j=0;j<6;j++);
if (Arr[i][j]>max) // find largest number
{max=Arr[i][j];jmax=j;}

for (i=0;i<6;i++)
for (j=0;j<5;j++)
if (j>=jmax) //find no of column with largest number
b[i][j]=Arr[i][j+1];
else
b[i][j]=Arr[i][j];

cout<<endl;
for (i=0;i<6;i++)
{ cout<<endl;
for (j=0;j<5;j++)
cout<<b[i][j]<<" ";
}
cout<<endl;

//***********************************************************************
// Delete Column with Largest Element
//***********************************************************************
cout<<"\n4>After Changing Row with maximum and minimum element : "<<endl;

int c[6][6],min;
int imax, imin;
max=Arr[0][0];
imax=1;
min=Arr[0][0];
imin=1;
// Find maximum and minimum elements in row
for (i=0;i<6;i++)
for (j=0;j<6;j++)
{
if (Arr[i][j]>max) {max=Arr[i][j];imax=i;}
if (Arr[i][j]<min) {min=Arr[i][j];imin=i;}
}
// Change Row
if (imin!=imax)
{
for (j=0;j<6;j++)
{
tempElement=Arr[imin][j];
Arr[imin][j]=Arr[imax][j];
Arr[imax][j]=tempElement;
}
}
// Output Matrix
cout<<endl;
for (i=0;i<6;i++)
{ cout<<endl;
for (j=0;j<6;j++)
cout<<Arr[i][j]<<" ";
}
cout<<endl;



//***********************************************************************
// Create next Matrix
//***********************************************************************
cout<<"\n5>Next Matrix : "<<endl;
// Next Matrix

for (i=0;i<6;i++)
for (j=0;j<6;j++)
if (j<=i) c[i][j]=6-i+j; else c[i][j]=0;

// OutPut Next Matrix
cout<<endl;
for (i=0;i<6;i++)
{ cout<<endl;
for (j=0;j<6;j++)
cout<<c[i][j]<<" ";
}
cout<<endl;

//***********************************************************************
//Multiplacation of original and next matrix
//***********************************************************************
cout<<"\n6>Multiplication Matrix : "<<endl;
int d[6][6];
for (i=0;i<6;i++)
for (j=0;j<6;j++)
{
d[i][j]=0;
for (k=0;k<6;k++)
d[i][j]=d[i][j]+Arr[i][k]*c[k][j];
}
// Output Result
cout<<endl;
for (i=0;i<6;i++)
{ cout<<endl;
for (j=0;j<6;j++)
cout<<d[i][j]<<" ";
}
cout<<endl;

//***********************************************************************
//Finding Num of Column with Maximum sum
//***********************************************************************
cout<<"\n7>Finding Num of Column with Maximum sum : "<<endl;
int smax,s;
smax=0;
jmax=0;

for (i=0;i<6;i++)
{
smax=smax+d[i][0];
for (j=0;j<6;j++)
{
s=0;
for (i=0;i<6;i++)
{
s=s+d[i][j];
if (s>=smax)
{
smax=s;
jmax=j;
}
}
}
}

//Output No of Colimn
cout<<"j="<<jmax<<endl;
cout<<"Sum of elements in Column = "<<smax<<endl;
cout<<endl;

//***********************************************************************
// Finding smallest elment from any Column
//***********************************************************************
cout<<"\n8>Finding smallest elment from Column 3 and 5 : "<<endl;
int emin3, emin5;
emin3=d[0][2];
emin5=d[0][4];

for (i=1;i<6;i++)
{
if (emin3>d[i][2]) emin3=d[i][2];
if (emin5>d[i][4]) emin5=d[i][4];
}
// output
cout<<"3="<<emin3<<endl;
cout<<"5="<<emin5<<endl;
return 0;
}


Result




သူရဲ့အလုပ္လုပ္ပံုကေတာ႔ အေထြအထူးမရွိပါဘူး အပိုင္ေလးေတြလိုက္ ကြန္႔မန္႔ မွတ္ေပးထားပါတယ္ ။ ကိုယ္တိုင္ Run ၾကည့္ပီးေလ႔လာၾကည့္မယ္ဆိုရင္ အလြယ္တကူနားလည္နိုင္မွာပါ ။ အရင္ က ေဆြးေႏြးခ်က္ေတြကို ေသခ်ာနားလည္ခဲ႔တယ္ဆိုရင္ ပိုအဆင္ေျပမွာပါ ။ multidimensional array (Matrix) နဲ႔ပက္သက္လို႔လုပ္ေဆာင္နိုင္တဲ႔ ဟာေလးေတြကို တစ္ပုဒ္ထဲမွာေပါင္းေရးပီးဥပမာေပးထားတာပါ ။
ဆက္လက္ဖက္ရႈ႕ရန္

ေဆြးေႏြးခ်က္(၁၆)

Functions

Functions ေတြဆိုတာ Program ေတြမွာ မျဖစ္မေနပါတဲ႔ ပရိုဂရမ္အပိုင္းေလးေတြပဲျဖစ္ပါတယ္ ။ ဥပမာ main() {} ဆိုတာလည္း function တစ္ခုပါပဲ ။ function ေတြ ကိုဘာေၾကာင္႔ Program ထဲမွာထည့္သံုးရလဲဆိုေတာ႔ call ေခၚၿပီး သံုးလို႔ရလို႔ပါပဲ ။ Program ထဲမွာထပ္ခါထပ္ခါ လုပ္ေနရမဲ႔ အလုပ္ေတြကို ခဏခဏ ေရေနဖို႔မလိုပဲ တစ္ေနရာတည္းမွာ ဖန္ရွင္အေနနဲ႔ေရးထားၿပီး calling function အေနနဲ႔ ေခၚသံုးရင္ တိုလည္းတိုမယ္ ရွင္းလည္းရွင္းသြားပါတယ္ ။ function ေတြကိုသံုးမယ္ဆိုရင္ ေအာက္ပါအတိုင္းေရးၿပီးသံုးနိုင္ပါတယ္ ။

၁ ။ Return type FunctionName () { statements }

၂ ။ Return type FunctionName ( parameter1, parameter2, ...) { statements }

• ReturnType ဆိုတာကေတာ႔ Function ရဲ့ Return ျပန္ေပးမဲ႔ types အမ်ိဳးအစားျဖစ္ပါတယ္ ။ void , int , float , double စသည္ျဖင္႔ အမ်ိဳးမ်ိဳးျဖစ္နိုင္ပါတယ္ ။
• FunctionName ဆိုတာကေတာ႔ ဖန္ရွင္ကိုသတ္မွတ္ေပးမဲ႔နာမည္ပဲျဖစ္ပါတယ္ ။
• () ခ်ည္းပဲဟာကေတာ႔ parameters ေတြမပါတဲ႔ functionေတြအတြက္ပါ ။
• ( parameter1, parameter2, ...) ဆိုတာကေတာ႔ parameters ေတြ ဖန္ရွင္ထဲမွာကိုယ္သံုးရင္သံုးသေလာက္ ေၾကျငာေပးလို႔ရပါတယ္ ။ int a , float b စသည္ျဖင္႔ေပါ႔ ။
• { statements } ဆိုတာကေတာ႔ ကိုယ္လုပ္ခ်င္တဲ႔ ညြန္ၾကားခ်က္ေတြကိုေရးေပးရမဲ႔ေနရာပါ ။


Example For Function

// void function example
#include <iostream>
using namespace std;

void printmessage ()
{
cout << "First Function!";
}

int main ()
{
printmessage ();
cout<<endl;
return 0;
}

ရွင္းလင္းခ်က္

အေပၚက Program ေလးကို ၾကည့္မယ္ဆိုရင္ Function ၂ ခုသံုးထားတာကို ေတြ႔မွာျဖစ္ပါတယ္ ။
• ပထမ Function မွာ Return Type မွာ void ကိုသံုးထားပါတယ္ ။ ၿပီးေတာ႔ Parameters ေတြမပါပါဘူး ။ ဘာလို႔လဲဆိုေတာ႔ စာေၾကာင္းတစ္ေၾကာင္းကိုထုတ္ေပးယံု ပဲျဖစ္တဲပအတြက္ မလိုအပ္လို႔ ျဖစ္ပါတယ္ ။Function Statements မွာေတာ႔ First Function! ဆိုတဲ႔စာေၾကာငး္ေလးကိုထုတ္ေပးဖို႔ေရးထားပါတယ္ ။
• ေနာက္ဖန္ရွင္တစ္ခုကေတာ႔ main ဖန္ရွင္ပါ ။ Return type ကိုေတာ႔ int ေပးထားပါတယ္ ။ ဒါေၾကာင္႔ function statements ထဲမွာ return 0 ဆိုၿပီး ျပန္ေပးထားတာျဖစ္ပါတယ္ ။ printmessage(); ဆိုတာကေတာ႔ အေပၚ က ေရးထားတဲ႔ Function ကို main function ထဲကေန Call ေခၚထားတာျဖစ္ပါတယ္ ။


Function ေတြကုိေၾကျငာျခင္း

Function ေတြကိုအေပၚမွာ ျပထားတဲ႔ ဥပမာအတုိင္း တန္းေရးၿပီးသံုးနိုင္သလို ပထမဆံုး main function အတိုင္ခင္မွာ ေၾကျငာၿပီးလည္းသံုးနိုင္ပါတယ္ ။ အဲလို main function မတိုင္ခင္ ေၾကျငာလုိက္တဲ႔ Prototype Function လို႔ေခၚပါတယ္ ။ သူ႔ရဲ့ အသံုးျပဳပံုကိုေအာက္မွာတစ္ခ်က္ၾကည့္ၾကည့္ပါ ။


Example For Prototype Function

// void function example
#include <iostream>
using namespace std;

void printmessage ();

int main ()
{
printmessage ();
cout<<endl;
return 0;
}
void printmessage ()
{
cout << "Declaration Function! (OR) Prototype ";
}

ဖန္ရွင္ေတြကို Prototype ဖန္ရွင္ေတြအျဖစ္ေၾကညာၿပီးသံုးမယ္ဆိုရင္ေတာ႔အေပၚမွာျပထားခဲ႔တဲ႔တိုင္းပဲ ကိုယ္ သံုးခ်င္တဲ႔ ဖန္ရွင္ေတြကို main function မတိုင္ခင္မွာေၾကျငာခဲ႔ရမွာျဖစ္ပါတယ္ ။

Prototype ကိုေၾကျငာတဲ႔ခါမွာ void printmessage (); သို႔မဟုတ္ int Add (int , int ,float); စတဲ႔ပံု စံေတြနဲ႔ ေၾကျငာနိုင္ပါတယ္ ။ အဲဒီမွမျဖစ္မေနသတိထားရမွာ က ( ; ) ပိတ္ခဲ႔ဖို႔ ေမ႔လို႔မရဘူးဆိုတာပါပဲ ။ ပီးေတာ႔ int Add (int , int ,float); ပံုစံ Parameters ေတြနဲ႔ prototype ေၾကျငာတဲ႔အခါ Parameters တစ္ခုနဲ႔တစ္ခုၾကား က ( , )ေကာ္မာ ခံ ၿပီးေရးတယ္ဆိုတာပါပဲ ။ စၿပီးေလ႔လာတဲ႔သူေတြအဖို႔မွားတက္တာေလးေတြက အဲဒါေလးေတြပါ ။

ေနာက္ တစ္ခ်က္ကေတာ႔ အေပၚ က Prototype ေၾကျငာတဲ႔အခါမွာ Parameters မပါတဲ႔ Function ဆိုလွ်င္လည္းမပါတဲ႔တိုင္း Parameters ေတြပါတဲ႔ဖန္ရွင္ဆိုရင္ လည္း Parameters ေတြပါတဲ႔အေရအတြက္ ေၾကျငာထားခဲ႔တဲ႔တိုင္း ေအာက္ကဖန္ရွင္ေရးတဲ႔အခါမွာ ျပန္လည္းအသံုးျပဳဖို႔ ပါ ။ ေနာက္တစ္ခ်က္က Prototype ေၾကျငာတုန္းက function ေနာက္မွာ ( ; ) နဲ႔ပိတ္ခဲ႔ေပးရေပမ႔ဲ main function ေအာက္ Function စေရးတဲ႔အခါမွာေတာ႔ ( ; ) ပါလို႔မရပါဘူး ။ အေပၚ က ေရးထားတဲ႔ကုဒ္ေလးေတြကိုေသခ်ာျပန္ၾကည့္ၾကည့္ပါ ။

ေနာက္တစ္ခ်က္ကေတာ႔ ကိုယ္သံုးခဲ႔တဲ႔ ဖန္ရွင္ကို main function မွာ call ျပန္ေခၚဖို႔ေမ႔လို႔မရပါဘူး ။ ေမ႔ေနခဲ႔တယ္ဆိုရင္ေတာ႔ ကိုယ္လိုခ်င္တဲ႔အေျဖထြက္မွာမဟုတ္ပါဘူး ။


Pass The Variables By Value

C++ က Function ေတြမွာ Passing လုပ္တယ္ Pass လုပ္တယ္ဆိုတာ Data ေတြကို တစ္ေနရာကေနတစ္ေနရာ ေျပာငး္ေရႊ႔ေပးတာပါပဲ ။ အဲလိုေျပာငး္ေရႊ႔တဲ႔နည္းေတြ အမ်ိဳးမ်ိဳးရွိၾကပါတယ္ ။ value , pointer , reference , const , စသည္ျဖင္႔ pass လုပ္ေပးနိုင္တဲ႔ နည္းေတြအမ်ားႀကီးရွိပါတယ္ အခုေျပာမွာကေတာ႔ value နဲ႔ pass လုပ္ေပးတဲ႔နည္းပါ ။ ေအာက္ကကုဒ္ေလးေတြကိုၾကည့္ၾကည့္ပါ

Void f(int n)
{
n++;
}


int main()
{
int x = 2;
f(x);
cout << x;
}

Variables ေတြကို value ေတြနဲ႔ pass လုပ္တဲ႔အခါမွာ Call ေခၚခံရတဲ႔ဖန္ရွင္ရဲ့ parameters ေတြကို copy ပဲယူတာပါ ။ အေပၚက f ဖန္ရွင္မွာ က parameter ကို int n ဆုိၿပီးေၾကျငာထားတာပါ ။ ဒါေပမဲ႔ mainဖန္ရွင္မွာေတာ႔f(x);ဆိုၿပီးေရးထားတာကိုေတြ႔မွာပါ။ f ဖန္ရွင္ထဲက parameter ဟာ n မဟုတ္ေတာ႔ပဲ x ျဖစ္သြားတာကိုသတိထားမိမွာပါ ။ main ဖန္ရွင္ထဲမွာ int x=2; ဆိုၿပီး တန္ဖိုးတစ္ခုထည့္ၿပီးသားျဖစ္တဲ႔အတြက္ f(2); ဆိုတဲ႔ပံုစံမ်ိဳးဝင္သြားပါတယ္ အဲဒီ 2 ဆိုတဲ႔ value ဟာ call ေခၚခံရတဲ႔ f ဖန္ရွင္ရဲ့ parameter ျဖစ္တဲ႔ n ေနရာမွာဝင္သြားပါတယ္ ။ အဲဒါကို Data Passing လုပ္တယ္လို႔ေခၚပါတယ္ ။ f ဖန္ရွင္ ရဲ့ statement မွာ n++ ဆိုတဲ႔ အတြက္ 2 ကို တစ္တိုးၿပီး cout << x; ထုတ္ေပးတဲ႔အခါ ၃ ဆိုၿပီးထြက္မွာျဖစ္ပါတယ္ ။ ဒါကေတာ႔ Value ေတြ နဲ႔ function ေတြမွာ pass လုပ္ေပးတဲ႔နည္း ပါ ။
ပိုၿပီးနားလည္သြားေအာင္ ေအာက္က ဥပမာကိုထပ္ၾကည့္ၾကည့္ပါ ။


#include <iostream>
using namespace std;

double RigArea(double,double);

int main ()
{
double area = RigArea(20,30);
cout<<"\nLength = "<<30;
cout<<"\nWidth = "<<20;
cout<<"\nArea of Rightangle = "<<area<<endl;
return 0;
}
double RigArea(double W,double L)
{
return W*L;
}


• Program စစ ခ်င္းမွာ ဆိုရင္ အေပၚ function ေတြေၾကျငာျခင္း မွာတုန္းကေျပာထားခဲ႔တဲ႔တိုင္းပဲ main () ဖန္ရွင္ရဲ့အေပၚမွာ RigArea ဆိုတဲ႔ prototype ကိုေၾကျငာလိုက္ပါတယ္ ။ အဲဒီ Prototype မွာဆိုရင္ return type က double ျဖစ္ပီးေတာ႔ Parameters ေတြကိုလည္း double ၂ ခုအေနနဲ႔ေၾကျငာေပးထားပါတယ္ ။
• ေနာက္ main ဖန္ရွင္ထဲမွာ area ဆိုတဲ႔ variable တစ္ခုကို double အေနနနဲ႔ေၾကျငာၿပီး RigArea ဆိုတဲ႔ ဖန္ရွင္ကို call ေခၚလိုက္ပါတယ္ အဲလို call ေခၚရာမွာ pass လုပ္ေပးရမဲ႔ arguments ေတြကို တစ္ခါတည္းထည့္ေပးထားပါတယ္ ။
• အဲလို constant value ရွိတဲ႔ arguments ေတြ ကို ေကာ္ပီ ယူၿပီး ေအာက္မွာရွိတဲ႔ RigArea ဆိုတဲ႔ ဖန္ရွင္က parameters ေတြျဖစ္တဲ႔ W နဲ႔ L တို႔မွာ ထည့္လိုက္ပါတယ္ ။ အဲဒါဆိုေတာ႔ W=20 နဲ႔ L = 30 ဆိုတဲ႔သေဘာျဖစ္သြားပါတယ္ ။
• RigArea ဆိုတဲ႔ဖန္ရွင္ထဲမွာ ကၽြန္ေတာ္ က W*L ကိုေျမွာက္ပီး return ျပန္ေပးပါလို႔ ခိုင္းထားတဲ႔အတြက္ 20x30 =600 ဆိုတဲ႔ တန္ဖိုးကို return ျပန္ေပးပါတယ္ ။
• ဟုတ္ၿပီး main () ဖန္ရွင္ထဲမွာတစ္ခ်က္ျပန္ၾကည့္ၾကည့္ရေအာင္ double area = RigArea(20,30); လို႔ကၽြန္ေတာ္ကေရးထားတယ္။ ဒါေၾကာင္႔ RigArea(20,30); ကေနထြက္လာတဲ႔ ၆၀၀ ဆိုတဲ႔တန္ဖိုးဟာ area ဆိုတဲ႔ variable ထဲကိုဝင္သြားပါတယ္ ။ function call ေခၚပီးတဲ႔အခ်ိန္မွာ area ထဲမွာ 600 ဆိုတဲ႔တန္ဖိုးရွိေနပါၿပီ ။
• ေနာက္ ကၽြန္ေတာ္ထည့္ခဲ႔တဲ႔ Length နဲ႔ Width တို႔ရဲ့ constant တန္ဖိုးေတြကို ထုတ္ေပးတယ္ ။
• ေနာက္ဆံုးမွာေတာ႔ area ကို output ထုတ္ေပးလိုက္ပါတယ္ ။ အဲဒါေၾကာင္႔ အေျဖမွာ ၆၀၀ ဆိုၿပီးထြက္သြားတာပါ ။Result ကိုၾကည့္ၾကည့္ပါ ။

Result




Pass variables by Reference

Pointer အေၾကာင္းေဆြးေႏြး Reference (address as) အေၾကာင္းကိုေျပာခဲ႔တာမွတ္မိမယ္ထင္ပါတယ္ ။ value ေတြနဲ႔ pass လုပ္တဲ႔နည္းကိုအေပၚမွာေဆြးေႏြးခဲ႔ၿပီးၿပီ ။ value နဲ႔ pass လုပ္တယ္ဆိုတာ တိတိက်က်သတ္မွတ္လို႔ရတဲ႔ တန္ဖိုး ၊ variable ေတြနဲ႔ ေရႊ႔ေျပာင္းမွဳလုပ္ရာမွာ အဆင္ေျပေပမဲ႔ အမ်ိဳးမ်ိဳးျဖစ္လာနိုင္တဲ႔ တန္ဖိုးေတြအတြက္က်ေတာ႔ ခက္ခဲပါလိမ္႔မယ္ ။ အဲလိုအေျခအေနမွာ value ေတြ memory မွာတည္ေနတဲ႔ address (Reference) ကိုကိုင္ၿပီး pass လုပ္မယ္ဆိုရင္ အဲဒီေနရာမွာဘယ္တန္ဖိုးပဲဝင္ဝင္ ကၽြန္ေတာ္တို႔ကေနရာကို ကိုင္ထားတာျဖစ္တဲ႔အတြက္ လြယ္လြယ္ကူကူနဲ႔အဆင္ေျပပါတယ္ ။ အဲဒါေၾကာင္႔ Pass variable by Reference ကလည္း အေရးပါတဲ႔ passing ways တစ္မ်ိဳးပါပဲ ။ ေအာက္ကဥပမာေလးကိုၾကည့္ၾကည့္ပါ ။

// passing parameters by reference
#include <iostream>
using namespace std;

void duplicate (int&, int&, int&);
int main ()
{
int x, y, z;
cout<<"Three numbers for x ,y ,z "<<endl;
cin>>x>>y>>z;
duplicate (x, y, z);
cout << "x=" << x << ", y=" << y << ", z=" << z<<endl;
return 0;
}
void duplicate (int& a, int& b, int& c)
{
a*=2;
b*=2;
c*=2;
}

ရွင္းလင္းခ်က္

• Prototype declaration ကိုေသခ်ာၾကည့္ၾကည့္ပါ ။ return type ကို void အေနနဲ႔ေၾကျငာထားပါတယ္ ။ အဲဒါေၾကာင္႔ return value မရွိပါဘူး ။ ေနာက္ၿပီး Parameters list မွာ int& ဆိုၿပီး ၃ ခုေၾကျငာေပးထားပါတယ္ ။ အဲဒါေတြကေတာ႔ reference ေတြပါပဲ ။
• main () ဖန္ရွင္ထဲမွာ စစခ်င္း variables ၃ ခုကို integers အျဖစ္ေၾကျငာလုိက္ပါတယ္ ။ ပီးေတာ႔ အဲဒီ ၃ ခုအတြက္ user ကိုရိုက္ထည့္ေပးခိုက္ပါတယ္ ။ ကၽြန္ေတာ္ က ၂ ၊ ၄ ၊ ၆ လို႔ရိုက္ထည့္ေပးလိုက္တယ္ဆိုပါေတာ႔ ။ x=2 , y =4 , z=6 လို႔ဝင္သြားပါတယ္ ။
• ေနာက္ duplicate ဖန္ရွင္ကို call ေခၚပါတယ္ ။ အဲဒီမွာ စပါၿပီ ။ pass by value တုန္းက arguments to arguments ေကာ္ပီလုပ္သြားေပမဲ႔ ။ pass by reference မွာက်ေတာ႔ argument to reference အျဖစ္သြားပါတယ္ ။ ဒါေၾကာင္႔ထည့္လိုက္တ႔ဲ တန္ဖိုးေတြက duplicate ဖန္ရွင္ရဲ့ reference အသီးသီးမွာရွိတဲ႔ တန္ဖိုးေတြေနရာမွာဝင္သြားတယ္ေပါ႔ဗ်ာ ။
• x ရဲ့တန္ဖိုးကို a ကေကာ္ပီကူးတာျဖစ္လို႔ a*=2; ဆိုတဲ႔အတြက္ &a ဆိုတဲ႔ေနရာမွာ ၄ ဆိုတဲ႔ တန္ဖိုးတစ္ခုရွိေနပါၿပီ ။ေနာက္ထပ္ y တန္ဖိုး ၊ z တန္ဖိုးေတြသည္းလည္း ထိုနည္းအတိုင္းအသီးသီး လုပ္ေဆာင္ၾကၿပီး &b , &c ဆိုတဲ႔ေနရာေတြမွာ ၈ ၊ ၁၂ ဆိုၿပီးတန္ဖိုးအသီးသီးေရာက္သြားပါတယ္ ။ ပထမ main ဖန္ရွင္ ကေနအသြားမွာ 2 , 4, 6 ဆိုတဲ႔ arguments ေတြနဲ႔ argument to reference ပံု စံ သြားတာျဖစ္ၿပီး ၊ duplicate ဖန္ရွင္ထဲကေန main () ကိုျပန္တဲ႔ အခါမွာေတာ႔ေျပာင္းျပန္ reference to arguments ျဖစ္သြားတာပါတယ္ ။ ဒါေၾကာင္႔ references အသီးသီးမွာရွိေနၾကတဲ႔ 4 , 8, 12 ဆိုတဲ႔တန္ဖိုးေတြက main () ဖန္ရွင္ဆီကိုအသီးသီး ျပန္ဝင္သြားၾကပါတယ္ ။
• duplicate ဖန္ရွင္ကို call ေခၚအၿပီး x,y,z တိုရဲ့ တန္ဖိုးေတြကိုထုတ္ၾကည့္တဲ႔အခါမွာေတာ႔ ေအာက္က result မွာျမင္ရတဲ႔အတိုင္းပါပဲ

Result



Default values in parameters

Functions ေတြအသံုးျပဳဖို႔အတြက္ Prototype Function အျဖစ္ေၾကျငာရာမွာ parameters ေတြကို ၊ ဒါမွမဟုတ္ parameters ေတြထဲမွ ကိုယ္ႀကိဳက္သေလာက္အေရအတြက္ကို default value အေနနဲ႔ေပးထားလို႔ရပါတယ္ ။ function call ေခၚလိုက္တဲ႔အခါ မွာ pass လုပ္ေပးမဲ႔ value ေတြမရွိဘူးဆိုရင္ မူရင္း default argument ကို ထည့္ေပးမွာျဖစ္ပါတယ္ ။ ဥပမာကိုၾကည့္ၾကည့္ ပါ ။

#include <iostream>
using namespace std;

void f(int x = 0, int y = 50);

int main()
{
f(1, 2);
f(10);
f();
return 0;
}

void f(int x, int y)
{
cout << "\nx: " << x << ", y: " << y << "\n\n";
}

ရွင္းလင္းခ်က္

• Prototype ေၾကျငာထားတာကိုၾကည့္ၾကည့္ပါ ။ int x=0 , int y = 50 ဆို ၿပီး default argument တန္ဖိုးေတြထည့္ထားတာကိုေတြ႔ရပါလိမ္႔မယ္ ။ အဲဒါဆိုရင္ x နဲ႔ y ထဲမွာတန္ဖိုးအသီးသီးဝင္ၿပီးသား ျဖစ္သြားပါတယ္ ။ ဒါေပမဲ႔ main () ဖန္ရွင္မွာၾကည့္ၾကည့္ပါ ။
• f (1,2) ဆိုၿပီး f ဖန္ရွင္ကို call ေခၚလိုက္ပါတယ္ အဲဒီ 1 နဲ႔ 2 က function pass by value နည္းနဲ႔ ေအာက္က f ဖန္ရွင္ထဲဝင္သြားၿပီး ။ x နဲ႔ y ကိုထုတ္ေပးတဲ႔အခါမွာ ။ ၁ နဲ႔ ၂ ထြက္လာတာ ေတြ႔ပါလိမ္႔မယ္ ။
• ေနာက္ f (10) ဆိုၿပီး function call ေခၚလိုက္တဲ႔အခါမွာေတာ႔ f ဖန္ရွင္ထဲမွာ argument ကတစ္ခုတည္းျဖစ္ေနပါတယ္ ။ အဲလို တစ္ခုတည္းျဖစ္ရင္ အစဥ္တုိင္း ျဖစ္တဲ႔အတြက္ ေအာက္ က f ဖန္ရွင္ရဲ့ x ေနရာမွာဝင္သြားပါတယ္ ။ ဒါေၾကာင္႔ x တန္ဖိုး ၁၀ နဲ႔ y မွက default တန္ဖိုးျဖစ္တဲ႔ ၅၀ ကိုထုတ္ေပးမွာျဖစ္ပါတယ္ ။
• ေနာက္ f() ဆိုၿပီး function call ေခၚတဲ႔အခါမွာေတာ႔ argument တစ္ခုမွမပါတာျဖစ္လို႔ မူရင္း default value ေတြျဖစ္ၾကတဲ႔ x တန္ဖိုး ၀ နဲ႔ y တန္ဖိုး ၅၀ တို႔ကို ထုတ္ေပးမွာျဖစ္ပါတယ္ ။result မွာၾကည့္ၾကည့္ပါ ။

Result



Inline Function

Function ေတြ ကိုသံုးတဲ႔အခါမွာ ပထမဖန္ရွင္တစ္ခု ေဆာက္လိုက္တယ္ ပီးေတာ႔ အဲဒီ ဖန္ရွင္ကို main ဖန္ရွင္ကေနေခၚတယ္ ။ ေနာက္ၿပီး ေဆာက္ထားတဲ႔ဖန္ရွင္ ကေန main () ဖန္ရွင္ဆီကိုျပန္သြားတယ္ ။ အဲလိုေတြအလုပ္လုပ္ေနတာျဖစ္လို႔ တည္ေဆာက္တဲ႔ဖန္ရွင္ က ႀကီးရင္မေျပာပေလာက္ေပမဲ႔ တကယ္တမ္း ဖန္ရွင္မွာေရးထားတဲ႔ အလုပ္လုပ္ဖို႔ရွိတာ ကနည္းနည္းေလး ဆိုရင္ေတာ႔ ဖန္ရွင္လုပ္ေဆာင္ဖို႔အခ်ိန္ထက္ သြားလိုက ျပန္လိုက္လုပ္ေနမဲ႔အခ်ိန္က ပိုမ်ားပါမယ္ ။ အဲလိုေသးငယ္တဲ႔ဖန္ရွင္ေလးေတြကိုတည္ေဆာက္မယ္ ဆိုရင္ အခ်ိန္ကုန္သက္သာေအာင္ inline function ကိုသံုးပါတယ္ ။ inline function တစ္ခုတည္ေဆာက္မယ္ ဆိုရင္ေတာ႔ ပံုမွန္ function ေတြ ေရွ့မွာ inline ဆိုတဲ႔ keyword ေလးထည့္ေပးရံုပါပဲ ။ သူရဲ့ ပံုစံကေတာ႔

Inline returnType functionName (arguments….){statements….}


Example for inline function

#include <iostream>
using namespace std;

inline int max(int a, int b)
{
return a>b ? a : b;
}

int main()
{
cout << max(10, 20)<<endl;
cout << max(99, 88)<<endl;

return 0;
}

ရွင္းလင္းခ်က္

• Maximum ကိုရွာေပးမဲ႔ max() function ကိုၾကည့္ၾကည့္ပါ ေရွ့ဆံုး ကမွာ inline ဆိုတဲ႔ keyword ေလးကို သတိထားမိမွာပါ ။ အဲဒါေတာ႔ inline ဖန္ရွင္တစ္ခုအသံုးျပဳတဲ႔ပံုစံပါ ။ ဖန္ရွင္ရဲ့ အလုပ္လုပ္မဲ႔ statements ေလးကတကယ္ကို နည္းနည္းေလးပါ ။ အဲလို ဖန္ရွင္မ်ိဳးေတြဆိုရင္ inline ကိုသံုးတာပါ ။
• ဂဏန္ ၂ လံုးတစ္စံုဆီရဲ့ အႀကီးဂဏန္းကိုရွာေပးမဲ႔ ပံုစံေလးပါ ။ max ဖန္ရွင္ထဲမွာေတာ႔ operator ? ကိုသံုးထားတာပါ ။ သူ႔ရဲ့အလုပ္လုပ္ပံုကိုေတာ႔ ေဆြးေႏြးခ်က္(၄) Operators ေတြအေၾကာင္းတုန္း က conditional operator အျဖစ္ေဆြးေႏြးခဲ႔ဖူးပါတယ္ ။ ပထမကိန္း ဟာ ဒုတိယကိန္းထက္ႀကီးသလား ? ႀကီးရင္ ပထမကိန္း a ကိုထုတ္ေပးပါ : မဟုတ္ရင္ေတာ႔ ဒုတိယကိန္းကိုထုတ္ေပးပါလို႔ခိုင္းထား တာပါ ။ ဒီေလာက္ဆိုရင္သေဘာေပါက္မယ္ထင္ပါတယ္။ Result ကိုၾကည့္ၾကည့္ပါ ။

Result




Overloaded Function

C++ မွာ Function ေတြအမ်ားႀကီးကို နာမည္တစ္ခုတည္းေပးၿပီး ဖန္တီးနိင္ပါတယ္ ။ ဒါေပမဲ႔ return type တုိ႔ parameters type ေတြ ပါဝင္တဲ႔အေရအတြက္ေတြေတာ႔ကြဲျပားပါလိမ္႔မယ္ ။ အဲဒါ နာမည္တူနဲ႔ ဖန္ရွင္တစ္ခု ထက္ပိုသံုးတာကို overload လုပ္တယ္လို႔ေခၚပါတယ္ ။ C++ မွာ OOP ရဲ့ concept တစ္ခုျဖစ္တဲ႔ Polymophism ရဲ့ ပံုစံျဖစ္ပါတယ္ ။ Polymophism အေၾကာင္းကိုေတာ႔ ေနာက္မွပဲ ေဆြးေႏြးပါေတာ႔မယ္ ။ အခုကေတာ႔ overload ဆိုတာဘာလဲသိရင္အဆင္ေျပပါၿပီ ။ ဥပမာေလး ကိုၾကည့္ၾကည့္ပါ ။

Example

// overloaded function
#include <iostream>
using namespace std;

int operate (int a, int b);
float operate (float a, float b);
int main ()
{
int x=5,y=2;
float n=5.0,m=2.0;
cout << operate (x,y);
cout << "\n";
cout << operate (n,m);
cout << "\n";
return 0;
}

int operate (int a, int b)
{
return (a*b);
}

float operate (float a, float b)
{
return (a/b);
}

ရွင္းလင္းခ်က္

Prototype Function ကိုၾကည့္ၾကည့္ပါ operate ဆုိတဲ႔ နာမည္တူ ဖန္ရွင္ႏွစ္ခုကို သတိထားမိမယ္ထင္ပါတယ္ ။ ဒါေပမဲ႔ တစ္ခုက integer ျဖစ္ၿပီးတစ္ခုကေတာ႔ float အမ်ိဳးအစားျဖစ္ပါတယ္ ။ က်န္တဲ႔ ဖန္ရွင္ call ေခၚတာေတြ အလုပ္လုပ္ပံုေတြကေတာ႔ အေပၚဖန္ရွင္ေတြအေၾကာင္းအမ်ားႀကိး ေဆြးေႏြးခဲ႔ၿပိးျဖစ္လို႔ ထက္မေဆြးေႏြးေတာ႔ပါဘူး ။ နာလည္လိမ္႔မယ္လို႔ထင္ပါတယ္ ။



Recursivity

Recursion Function ရဲ့ဂုဏ္သတၱိကေတာ႔ တျခား ဖန္ရွင္တစ္ခုေန ေနာက္ဖန္ရွင္တစ္ခုကို call ေခၚသလိုမဟုတ္ပါဘူး ။ တျခားဖန္ရွင္တစ္ခုကေန ေနာက္ဖန္ရွင္တစ္ခုကို call ေခၚတယ္ဆိုရင္ ေခၚၿပီးတာနဲ႔ အေျဖတန္းထုတ္ေပးပါတယ္ ။ recursion function မွာေတာ႔ ကိုယ္႔ဘာသာ ပဲျပန္ေခၚေနၿပီး လိုခ်င္တဲ႔ အေျဖကို မထြက္မခ်င္း looping ပတ္ေနပါတယ္ ။ လိုခ်င္တဲ႔ ပြဳိင္႔အေျဖကိုေရာက္ၿပီဆိုမွ အေျဖထုတ္ေပးတဲ႔ Method တစ္မ်ိဳးပါပဲ ။ Function ေတြမွာ အဲလို ဂုဏ္သတၱိေတြ အသံုးျပဳနုိင္ပါတယ္ ။ ဥပမာေလးကိုၾကည့္ၾကည့္ပါ ။

// recursion function
#include <iostream>
using namespace std;

long factorial (long a)
{
if (a > 1)
return (a * factorial (a-1));
else
return (1);
}

int main ()
{
long number;
cout << "Please type a number: ";
cin >> number;
cout << number << "! = " << factorial (number);
return 0;
}

ရွင္းလင္းခ်က္

• ဒီဥပမာေလး က ဂဏန္းေတြရဲ့ Factorial တန္ဖိုးကိုရွာေပးမဲ႔ Program ေလးပါ ။
• Factorial ရွာတဲ႔ ပံုသနည္းကေတာ႔ n! = n * (n-1)! ပါ ။ ဥပမာ ကၽြန္ေတာ္တို႔ က 3 factorial ကိုရွာမယ္ဆိုရင္ 3 ! = 3*2! , 2!= 2* 1 ! ပါ ။ အားလံုး ေပါင္းေရးလိုက္တဲ႔အခါ မွာ 3 ! = 3*2*1 ရွာခ်င္တဲ႔ ဂဏန္း ကေန 1 အထိ ေျမွာက္သြားတာပါ ။
• Program မွာ main() function ကိုၾကည့္ၾကည့္ပါ ။ factorial တန္ဖိုးရွာဖို႔အတြက္ ဂဏန္းတစ္လံုးေပးပါဆိုၿပီးေတာင္ထားပါတယ္။ user ကေန တန္ဖိုးတစ္ခုရိုက္လိုက္ရင္ number ဆိုတဲ႔ variable နဲ႔ဖမ္းလိုက္တယ္ ။ ၿပီးေတာ႔ factorial ဖန္ရွင္ ကို call ေခၚပါတယ္။
• Call ေခၚစဥ္က ဝင္လာတဲ႔ argument ကို factorial ဖန္ရွင္က a ထဲကို ေကာ္ပီထည့္လိုက္ပါတယ္ ။ ၿပီးေတာ႔ ဖန္ရွင္ statements ထဲကိုဆင္းသြားၿပီး if နဲ႔စစ္ေဆးပါတယ္ ။ user ထည့္လုိက္တဲ႔ တန္ဖိုး ဟာ ၁ ထက္ႀကီးသလား ႀကိးတယ္ဆိုရင္ recursion စလုပ္ပါတယ္ ။ ဘယ္မွာလုပ္တာလဲဆိုေတာ႔ ပထမ ထည့္လိုက္တဲ႔ တန္ဖိုးက a ေနရာမွာဝင္တာဆိုေတာ႔ a* လို႔သိၿပီးတာနဲ႔ factorial (a-1) ဆိုၿပီး ဖန္ရွင္ကို call ျပန္ေခၚလိုက္တာပါ ။ အဲလိုနဲ႔တစ္ခါ a-1 တန္ဖိုးကို if နဲဲ႔ျပန္စစ္ပါတယ္ ။ အဲလိုနဲ႔ user ထည့္လိုက္တဲ႔တန္ဖိုးကို ၁ ေလွ်ာ႔ေလွ်ာ႔သြားၿပီး ၁ နဲ႔ညီတဲ႔အထိ ေလွ်ာ႔သြားပါတယ္ ။ ၁ နဲ႔ညီသြားၿပီဆိုရင္ေတာ႔ looping ကေနရပ္ၿပီး ေနာက္ဆံုးအေျဖကို ထုတ္ေပးမွာျဖစ္ပါတယ္ ။ ဒါဟာ Recurisivity ပါပဲ ။
• Variable နာမည္ေတြနဲ႔ရွင္းျပေတာ႔နည္းနည္း ရွဳပ္သြားတယ္ထင္တယ္ ။ ဥပမာ ကၽြန္ေတာ္က ေနၿပီး ၄ ရဲ့ factorial ကိုရွာေပးပါဆိုၿပီးထည့္ေပးလိုက္တယ္ဆိုပါေတာ႔ ။ factorial ဖန္ရွင္ကို call စေခၚပါတယ္ ပီးေတာ႔ ကၽြန္ေတာ္ထည့္လိုက္တဲ႔ 4 ဆိုတဲ႔ တန္ဖိုးကို if (4>1) ဆိုၿပီးစစ္လိုက္တယ္ ။ ႀကီး ေနတာျဖစ္တဲ႔အတြက္ 4*factorial(4-1) ဆိုတဲ႔ပံုစံျဖစ္သြားတယ္ ။ အဲဒီေတာ႔ factorial ဖန္ရွင္ကိုေကာ္ျပန္ေခၚတယ္ ။ 3>1 ဆိုၿပိးစစ္တယ္ ။ ႀကီးေနေသးတယ္ အဲဒီေတာ႔ 4*3*factorial(2) ဆိုတဲ႔ပံုစံျဖစ္သြားတယ္ ။ ဖန္ရွင္ေကာျပန္ေခၚတယ္ ။ 2>1 ဆိုၿပိးစစ္တယ္ ႀကိးေနေသးေတာ႔ 4*3*2*factorial(1) ပံုစံျဖစ္တယ္ ။
1>1 ဆိုၿပီးစစ္တယ္ ။ အဲဒီေတာ႔ မႀကီးေတာ႔ဘူး မႀကိးေတာ႔ loop ကေနရပ္သြားတယ္ ။ ဒါေၾကာင္႔ 4 ! = 4*3*2 =24 ဆိုၿပီးအေျဖထုတ္ေပးတာပါ ။ 4 ထည့္ထားတဲ႔ Result ကိုၾကည့္ၾကည့္ပါ ။

Result




Function အေၾကာင္းမွာဒီေလာက္ဆိုရင္ ေတာ္ေတာ္ေလးလံုေလာက္မယ္ထင္ပါတယ္ ။ ကၽြန္ေတာ္ မေဆြးေႏြးပဲက်န္ေနတာေတြလည္းရွိနိင္ပါေသးတယ္ ။ ဖန္ရွင္နဲ႔ပက္သက္ၿပီး program code ေလးေတြထပ္မံေလံလာခ်င္ေသးတယ္ဆိုရင္ေတာ႔
http://www.java2s.com/Tutorial/Cpp/0140__Function/Catalog0140__Function.htm မွာ ကိုယ္တိုင္သြားၿပီးေလ႔လာနိုင္ပါတယ္ ။ ကၽြန္ေတာ္ေဆြးေႏြးထားတဲ႔သီအိုရီေတြနဲ႔ ေပးထားတ႔ဲလင္႔ခ္က ကုဒ္ေလးေတြ တြဲၿပီး ေလ႔လာမယ္ဆိုရင္ ပိုၿပီးနားလည္မွာပါ ။ အားလံုးပဲအဆင္ေျပၾကပါေစ ။
ဆက္လက္ဖက္ရႈ႕ရန္

ေဆြးေႏြးခ်က္ (၁၅)

Pointer

Pointer ဆိုမွေတာ႔ ညႊန္ျပသူေပါ႔ ဗ်ာ ။ ညႊန္ျပတယ္ဆိုေတာ႔ သူကဘာေတြကိုညႊန္ျပမလဲ ဘယ္ေနရာမွာ ၊ ဘယ္နားေလးမွာ စတဲ႔ ေနရာကိုပဲ ညႊန္ျပမွာေပါ႔ ။ ဒါက ကၽြန္ေတာ္တို႔ အလြယ္ျမင္သာေအာင္လူၿပိန္းေတြးေတြးၾကည့္လိုက္တာေပါ႔ ။ သူကဘာလဲဆိုတာအေသးစိတ္ေဆြးေႏြးၾကည့္ရေအာင္ဗ်ာ ။ ကၽြန္ေတာ္တို႔ Program မွာ variable ေတြေၾကျငာလိုက္ပီဆုိတာနဲ႔ Computer ထဲမွာရွိတဲ႔ memory မွာ အဲဒီ variable ေလးေတြအတြက္ ေနရာေဝျခမ္းေရးေတြလုပ္ပါတယ္ ။ ဥပမာ ကၽြန္ေတာ္တို႔ က int a; နဲ႔ int b ; လို႔ variables ၂ ခုေၾကျငာလိုက္တယ္ဆိုပါေတာ႔ ။ မန္မိုရီႀကီး ထဲမွာ variable a အတြက္တစ္ေနရာ variable b အတြက္တစ္ေနရာ ေနရာသတ္မွတ္ေပးပါတယ္ ။ အဲလို integer variables ေတြအတြက္ memory ေပၚမွာ 4 bytes ေနရာေပးပါတယ္(32 bits computer မ်ားအတြက္) ။ တျခား char တို႔ float တို႔ စတဲ႔ data types ေတြကေနရာဘယ္ေလာက္ယူတယ္ဆိုတာ ကို ေဆြးေႏြးခ်က္ (၃) က DataTypes and Ranks ဆိုတဲ႔ဇယားမွာသြားၾကည့္နုိင္ပါတယ္ ။ အဲလို memory ထဲမွာ variable ေတြသတ္မွတ္ထားတဲ႔ေနရာကိုေတာ႔ အဲဒီvariable ရဲ့ address as လို႔ေခၚပါတယ္(တနည္း reference လုပ္တယ္လို႔လည္းေခၚပါေသးတယ္) ။ program ေရးတဲ႔အခါမွာေတာ႔ သူ႔ကို & (ampersand) နဲ႔ကိုယ္စားျပဳပါတယ္ ။Pointer ဆိုတာကေတာ႔ အဲဒီ variable ရဲ့ address ကို ညႊန္ျပပီး variable ေတြကိုေခၚသံုနုိင္တဲ႔အရာပါပဲ ။ Pointer ကိုေတာ႔ * (star sign)နဲ႔ကိုယ္စားျပဳပါတယ္ ။ ပထမဆံုး Variable ရဲ့ value (တန္ဖိုး) နဲ႔ address (ေနရာ) ကိုေကာင္းေကာင္းနားလည္ေအာင္ ေအာက္ကဥပမာေလး ၾကည့္ၾကည့္ပါ ။

Example Program

#include<iostream>
using namespace std;
int main()
{
int a,b;
a=200;
b=300;
cout<<"Value of a = "<<a<<endl;
cout<<"Address of a = "<<&a<<endl;
cout<<"Value of b = "<<b<<endl;
cout<<"Address of b = "<<&b<<endl;
return 0;

}

Result



ဒီ Program ေလးနဲ႔ Result ေလးကို တြဲၾကည့္မယ္ဆိုရင္ variable တိုင္းမွာ address ကိုယ္စီရွိတယ္ဆိုတာ နားလည္မယ္ထင္ပါတယ္ ။ အဲဒါကိုနားလည္ပီဆိုရင္ Pointer ေတြဘယ္လို ေၾကျငာလဲအသံုးျပဳလဲဆိုတာကို ၾကည့္ၾကည့္ရေအာင္ဗ်ာ ။


Declaring variables of pointer types

Variables ေတြကို Pointer Types အေနနဲ႔ေၾကျငာမယ္ဆိုရင္

Type * name;

ပံုစံေၾကျငာရမွာပါ ။ ဥပမာ

int * iNumber;
char * character;
float * fNumber;

အခု Pointer ဆိုတာဘာလဲသိသြားၿပီ Pointer ကိုယ္လုိေၾကျငာရလဲဆိုတာသိသြားၿပီ ။ ပိုၿပီးေတာ႔ အဓိပၸါယ္ရွိသြားေအာင္ Pointer ကိုဘာေၾကာင္႔သံုးရလဲဆိုတာကို ကၽြန္ေတာ္တို႔ ေဆြးေႏြးၾကည့္ရေအာင္ ။ ေအာက္က ပရိုဂရမ္ေလးၾကည့္ၾကည့္ပါ ။

Example Program

#include<iostream>
using namespace std;
int main()
{
int a,b;
a=200;
b=300;
cout<<"Value of a = "<<a<<endl;
cout<<"Address of a = "<<&a<<endl;
cout<<"Value of b = "<<b<<endl;
cout<<"Address of b = "<<&b<<endl;

a=500;
cout<<"Value of a = "<<a<<endl;
cout<<"Address of a = "<<&a<<endl;

a=1000;
cout<<"Value of a = "<<a<<endl;
cout<<"Address of a = "<<&a<<endl;

b=2;
cout<<"Value of b = "<<b<<endl;
cout<<"Address of b = "<<&b<<endl;
return 0;

}

Result


အခုနက တစ္ပုဒ္ကိုပဲ ထပ္ျဖည့္ထားတာပါ ။ သတိထားမိလားမသိဘူး ။ ကၽြန္ေတာ္ a နဲ႔ b အတြက္တန္ဖိုးေတြကိုေျပာင္းထည့္ေပးသြားတယ္။ ပီးေတာ႔ value နဲ႔ address ကိုထုတ္ေပးခိုင္းတယ္ ။ value ေတြသာခ်ိန္းသြားတယ္ address ကမေျပာင္းဘူး ။ ကၽြန္ေတာ္႔မွာခြက္တစ္ခု ရွိတယ္ပဲဆိုၾကပါစို႔ အဲဒီခြက္ကိုေရထည့္ေသာက္ေတာ႔ေရခြက္ျဖစ္တယ္ ။ ေကာ္ဖိထည့္ေတာ႔ေကာ္ဖီခြက္ျဖစ္တယ္ ။ အေအးထည့္ေသာက္ေတာ႔ အေအးခြက္ျဖစ္တယ္ ။ ေရ ၊ ေကာ္ဖိီ ၊အေအး စတဲ႔ တန္ဖိုးေတြဘယ္လိုေျပာင္ေျပာင္း ၊ထည့္တဲခြက္ကို ကၽြန္ေတာ္ က ကိုင္ထားတာျဖစ္တဲ႔အတြက္ ဘာလာလာေအးေဆးပဲေပါ႔ ။ အခုလည္း Program ထဲမွာ variable ရဲ့ value ေတြႀကိဳက္သလိုေျပာင္းပါ ကၽြန္ေတာ္က အဲဒီ variable ရဲ့ address ကို pointer နဲ႔ ျပပီးသံုးမယ္ဆိုရင္ အမ်ားႀကီးသက္သာသြားတာေပါ႔ ။ pointer ရဲ့တျခားေကာင္းက်ိဳးေတြလည္းရွိခ်င္ရွိဦးမွာပါ ။ ဒါကကၽြန္ေတာ္သိတာေလးကိုပဲေဆြးေႏြးတာပါ ။


Dereference operator (*)

Pointerေတြဟာ Address (reference) ေတြပဲ Point လုပ္ေပးနိုင္ပါတယ္ ValueေတြကိုPointလုပ္လို႔မရပါဘူး(စိတ္ထဲမွာအေသမွတ္ထားပါ) ။ ဒါေၾကာင္႔ Pointer ကို Output အေနနဲ႔ျပလိုက္မယ္ဆိုရင္ Address အေနနဲ႔ ပဲထြက္လာမွာပါ ။ တကယ္လို႔ ကၽြန္ေတာ္တို႔ က အဲဒီ Address မွာရွိတဲ႔ Value ကို Output ထုတ္ေပးခ်င္တယ္ဆိုရင္ေတာ႔ Deference Pointer (သို႔) Dereference Operator(*) ျပန္လုပ္ေပးရပါတယ္ ။ ေအာက္ကကုဒ္ေလးေတြကိုတစ္ခ်က္ၾကည့္ၾကည့္ပါ ။

double Num =10;
double dNum;
double *ptr=&Num // ၁၀ ဆိုတဲ႔ value ရွိရာ address ကို Pointer နဲ႔ point လုပ္လိုက္ပါတယ္ ။
cout<<ptr; // အခုတိုင္းထုတ္လိုက္ပီဆိုရင္ pointer ကို output ထုတ္တာျဖစ္လို႔ address ပဲထြက္လာမွာပါ ။

dNum=*ptr;
// ဒီ လုပ္ေဆာင္ခ်က္ေလးကိုေတာ႔ Dereference လုပ္တယ္လု႔ိေခၚပါတယ္။(ဒါကေတာ႔ Variable အလြတ္တစ္လံုးနဲ႔ Dereference လုပ္တာပါ)
cout<<dNum; // အခုတိုင္း ဆိုရင္ေတာ႔ နဂို value ျဖစ္တဲ႔ ၁၀ ဆိုတာကို output ထုတ္ေပးမွာျဖစ္ပါတယ္ ။
cout<<*ptr; // ဒီလုပ္ေဆာင္ခ်က္ဆိုရင္လည္း Dereference လုပ္တာပါပဲ ၁၀ ဆိုတာကို output ထုတ္ေပးမွာျဖစ္ပါတယ္ ။


Pointer Arithmetic

တျခား Variables ေတြ ကို Operation လုပ္ဖို႔အတြက္ Arithmetic Operator ေတြသံုးနုိင္သလို Pointer မွာလည္းသံုးနုိင္ပါတယ္ ။ ဒါေပမဲ႔ ပံုမွန္ data types ေတြ Arithmetic နဲ႔ေတာ႔ ျခားနားပါတယ္ ။ Pointer Arithmetic ေအာက္မွာ ဘယ္ Operators ေတြသုံးနိုင္လဲဆိုေတာ႔
+ , - , ++ , -- , += , -= , == , != , > , < , <= , >= စတဲ႔ Operators ေတြ အသံုးျပဳနိုင္ပါတယ္ ။ Pointer Arithmetic နဲ႔ ရိုးရိုး datatype ေတြရဲ့ Arithmetic ဘာကြာလဲဆိုတာ ကို ေအာက္က ဥပမာေလးေတြမွာ ေလ႔လာၾကည့္ရေအာင္ဗ်ာ ။

Example For Pointer Arithmetic

#include<iostream>
using namespace std;
int main()
{
int nValue = 8;
int *pnPtr = &nValue;

cout << pnPtr << endl;
cout << pnPtr+1 << endl;
cout << pnPtr+2 << endl;
cout << pnPtr+3 << endl;
return 0;
}

Result



Result န႔ဲ Code ေလးေတြကိုတြဲၾကည့္ၾကည့္ပါ ။ ပထမ မူရင္းPointer ရဲ့ Address ျဖစ္တဲ႔ 0013ff60 ဆိုတာကိုထုတ္ေပးတယ္ ။ အဲဒါ cout << pnPtr << endl; ဆိုတဲ႔ line အတြက္ေပါ႔ ။ ေနာက္ cout << pnPtr+1 << endl; ဆိုတဲ႔ line အတြက္က်ေတာ႔ 0013ff64 ဆိုၿပီးထုတ္ေပးပါတယ္ ။ code ေတြမွာ ကၽြန္ေတာ္က 1 ,2,3 ကိုအစဥ္လိုက္ေပါင္းပီးထုတ္သြားတာ ပါ ။ result မွာ 4 စီကြာသြားတာကိုေတြ႔မယ္ထင္ပါတယ္ ။ ေနာက္ဆံုး က 0013ff6c ဆိုတာကိုၾကည့္ၿပီး မ်က္စိမလည္ပါနဲ႔ ။ ႔ သူက hexadecimal တန္ဖိုးနဲ႔တြက္တာျဖစ္တဲ႔အတြက္ 0 ကေန f ထိဆိုေတာ႔ (0 1 2 3 4 5 6 7 8 9 A B C D E Fဆိုၿပီး ၁၆ လံုးရွိပါတယ္) C ဆိုတာ ၁၂ ကို ကိုယ္စားျပဳပါတယ္ ။ ဒါဆိုရင္ 0 , 4 , 8, 12 ဆိုၿပီး ၄ စီကြာသြားတာကိုသတိထားမိမွာပါ ။ ဟုတ္ၿပီ ၄ စီကြာတယ္ ဘာေၾကာင္႔ ၄ စီကြာလဲဆိုေတာ႔ data ေတြစေၾကျငာတုန္းက int nValue = 8; int *pnPtr = &nValue; ဆိုၿပီး integer ပါလို႔ ေၾကျငာခဲ႔တာျဖစ္တဲ႔အတြက္ 4 စီကြာသြားတာပါ ။ ေဆြးေႏြးခ်က္ (၃) က datatype and rank ဇယားကိုျပန္ၾကည့္ၾကည့္ပါ ။ integer ရဲ့ memory မွာေနရာယူတဲ႔ တန္ဖိုးက 4 bytes ရွိပါတယ္ ။ ဒါေၾကာင္႔ တစ္ခုနဲ႔ တစ္ခု 4 စီကြာသြားတာပါ ။ တကယ္လို႔ double နဲ႔ေၾကျငာခဲ႔မယ္ဆိုရင္ 8 စီကြာသြားပါလိမ္႔မယ္ ။ char နဲ႔ေၾကျငာရင္ 1 စီကြာၿပီး short နဲ႔ေၾကျငာရင္ ၂ စီကြာသြားတာကိုေတြ႔ပါလိမ္႔မယ္ ။ အေပၚက ဥပမာေလး ကိုပဲ data type ေျပာင္းေၾကျငာၿပီး ထုတ္ၾကည့္ၾကည့္ပါ ။

တကယ္လို႔ မရွင္းေသးဘူးဆိုရင္ ေအာက္ကပံုေလးပါထပ္ၾကည့္ပါ ဦး ။ &mychar (address of mychar) = 1000 လို႔သတ္မွတ္ထားပီး ++ ေအာ္ပေရတာသံုးလိုက္တဲ႔အခါ 1001 ဆိုၿပီး ၁ ပဲတိုးပါတယ္ ။ &myshort = 2000 လို႔သတ္မွတ္ၿပီး ++ ေအာ္ပေရတာကိုသံုးလိုက္တဲ႔ အခါမွာ 2002 ဆိုၿပီး ၂ တိုးတဲ႔ေနရာကိုေရာက္သြားတယ္ ။ &mylong = 3000 လို႔သတ္မွတ္ၿပီး ++ ေအာ္ပေရတာသံုးတဲ႔အခါမွာေတာ႔ 3004 ေနရာကိုေရာက္သြားတယ္ဆိုေတာ႔ 4 တိုးသြားတယ္ ။



၁ ေပါင္းတာခ်င္းတူေပမဲ႔ data types ေတြေပၚမူတည္ၿပီး ထြက္လာမဲ႔ result က်ေတာ႔ကြဲျပားသြားတယ္ ။ ရိုးရိုး arithmetic မွာေတာ႔ int a =1 ; a+1=2; double a=1; a+1=2 ; data types ေတြဘယ္လိုပဲေျပာင္းေၾကျငာေၾကျငာ ရလာမဲ႔ ရလာဒ္က တန္ဖိုး က data types ေတြေပၚမွာ မွီတည္မေနပါဘူး ။ အဲဒီအခ်က္ က ရိုးရိုး arithmetic နဲ႔ pointer arithmetic မတူတဲ႔အခ်က္ပါပဲ ။ ဒါဆိုရင္ Pointer Arithmetic ကို သေဘာေပါက္မယ္ထင္ပါတယ္ ။


Pointer And Array

Array အေၾကာငး္ကိုေတာ႔ မေဆြးေႏြးရေသးပါဘူး ။ Array ဆိုတာကေတာ႔ Variable name တစ္ခုတည္းမွာElements (value) တစ္ထပ္ပိုၿပီး သံုးခ်င္တဲ႔အခါမ်ိဳးမွာ Array နဲ႔ေရးတာ ပါ ။ အဲဒီ Array ထဲမွာလည္း Pointer ကိုသံုးနိုင္တာေၾကာင္႔ Pointers ေခါင္းစဥ္ေအာက္မွာ ထည့္ေဆြးေႏြးလိုက္တာပါ ။ Array ကို ေၾကျငာေတာ႔မယ္ဆိုရင္ ေအာက္ကတုိင္းေၾကျငာနိုင္ပါတယ္ ။

int anArray[5]={1,2,3,4,5}; // Integers 5 ခုပါတဲ႔ array တစ္ခုအျဖစ္ေၾကျငာလိုက္တာပါ ။
char chArray[] = “OnOurHands”; // character array တစ္ခုေၾကျငာလုိက္တာပါ ။

အခု က Array ကို Point လုပ္မဲ႔ Pointers ေတြအေၾကာင္းကိုေျပာမွာျဖစ္လို႔ Array အတြက္အေသးစိတ္ကိုေတာ႔ေနာက္မွာပဲေျပာပါေတာ႔မယ္
Pointer တစ္ခုနဲ႔ Array ကို Point လုပ္မယ္ဆိုရင္ Array ရဲ့ ပထမဆံုး Element Address ကိုပဲ Point လုပ္နုိင္မွာျဖစ္ပါတယ္ ။ Element အားလံုးရဲ့ Address ကို Pointers တစ္ခုတည္းနဲ႔ Point လုပ္လို႔မရပါဘူး ။ ေအာက္ကဥပမာေလးကိုေလ႔လာၾကည့္ပါ

#include<iostream>
using namespace std;
int main()
{
//declare and initialization of array
int iArray[5]={1,2,3,4,5};
char chArray[]="OnOurHands";

//declare Pointers
int *iPtr;
char *chPtr;

//Point Array
iPtr=iArray;
chPtr=chArray;

//deference and Output Pointer
cout<<*iPtr<<endl;
cout<<*chPtr<<endl;

//If you want to output all Elements , do like that
cout<<*(iPtr);
cout<<*(iPtr+1);
cout<<*(iPtr+2);
cout<<*(iPtr+3);
cout<<*(iPtr+4)<<endl;

for(int i=0;i<10;i++)
{
cout<<*(chPtr+i);
}
cout<<endl;
return 0;

}


Result




ရွင္းလင္းခ်က္

Array ေတြ Declare လုပ္တယ္ ။ ၿပီးေတာ႔ Pointers ေတြ Declare လုပ္တယ္ ။ Arrays ေတြကို Pointer ေတြနဲ႔ Point လုပ္လိုက္တယ္ ။ အဲဒါေတြၿပီးေတာ႔ cout<<*iPtr<<endl; cout<<*chPtr<<endl; ဆိုၿပီး Pointers ေတြ Derefence လုပ္ၿပီး Output ထုတ္ေပးလိုက္တဲ႔အခါ မွာ 1 ရယ္ O (အို) ရယ္ဆိုၿပီး Array ၂ ခု ရဲ့ ပထမဆံုး Element ၂ ခု ထြက္လာတာကိုေတြ႔ပါလိမ္႔မယ္ ။ ဒါဆိုရင္ Pointer ေတြ က Arrays ေတြရဲ့ ပထမဆံုး Element ကိုသာ Point လုပ္နိုင္တယ္ဆိုတာ သေဘာေပါက္ေလာက္ပါၿပီ ။ ေနာက္မွာေရးထားတာေတြကေတာ႔ ကၽြန္ေတာ္တို႔ က ပထမဆံုး Element တင္မဟုတ္ပဲ Array တစ္ခုမွာရွိတဲ႔ Elements ေတြကို Pointer နဲ႔ထုတ္ေပးခ်င္တဲ႔အခါ Pointer Arithmetic ကိုသံုးၿပီး ထုတ္ေပးတဲ႔ပံုစံ ေရးျပထားတာပါ ။ အဲဒါေၾကာင္႔ ပထမ Integer Array အတြက္
1 2 3 4 5 ေနာက္ Array အတြက္ OnOurHands ဆိုၿပီး Elements အားလံုးထြက္လာတာပါ ။


Pointer To Pointer

ရိုးရိုး Variable ေတြကို Pointers ေတြနဲ႔ Point လုပ္လို႔ရသလို Pointers ေတြကိုထပ္ၿပီး Pointers ေတြနဲ႔ Point လုပ္လို႔ရပါေသးတယ္ ။ အဲလိုလုပ္တာကို Pointer to Pointer လို႔ေခၚတာပါ ။ Pointer နဲ႔ Pointer ကိုထပ္ၿပီး Point လုပ္ဖို႔ အတြက္ ** (star ၂ လံုး) ကိုသံုးပါတယ္ ။ ဥပမာေလး ကိုၾကည့္လိုက္ရင္နားလည္မယ္ထင္ပါတယ္ ။

#include<iostream>
using namespace std;
int main()
{
char a;
//declare Pointer
char * b;
//declare Pointer to Pointer
char ** c;

//initialization
a = 'z';
b = &a;
c = &b;

//dereference and output Pointers
cout<<c<<endl;
cout<<*c<<endl;
cout<<**c<<endl;
return 0;

}


ပုံေလးကိုၾကည့္ၾကည့္ပါ ။ variable a ထဲမွာ z ဆိုတဲ႔ character value ရွိပါတယ္ ။ သူရဲ့ address ကေတာ႔ 7230 ပါ ။ b က a ကုိလွမ္းၿပီး point လုပ္တာျဖစ္လို႔ သူရဲ့ တန္ဖိုးသည္ 7230 ျဖစ္ၿပီး address 8092 ပါ ။ ေနာက္ခါ c က b ကိုထပ္ၿပိး Pointer to Pointer နဲ႔ထပ္ၿပီး Point လုပ္ထားတာ ျဖစ္လို႔ c တန္ဖိုးသည္ 8092 ျဖစ္ၿပီးေတာ႔ address ကေတာ႔ 10502 ပါ ။ အဲဒါကို Dereference လုပ္ခ်င္တယ္ဆိုရင္ေတာ႔
ဥပမာProgram မွာျပထားတဲ႔ အတုိင္းပဲ **c ဆိုမွ မူရင္းတန္ဖိုး z ကိုျပန္ရမွာျဖစ္ပါတယ္ ။


Null pointer

Null Pointer ဆိုတာကေတာ႔ မန္မိုရီေပၚက ဘယ္ Address (reference ) တန္ဖိုးမွ Point လုပ္မေပးတဲ႔ Pointer Type တစ္မ်ိဳးပါပဲ ။ တကယ္လို႔ Pointer ကို Deference လုပ္မယ္ဆိုရင္ ေတာ႔ int နဲ႔ Casting လုပ္ၿပီး မွ OutPut ထုတ္မယ္ဆိုရင္ေတာ႔ သူရဲ့တန္ဖိုး က ၀(သုည) ထုတ္ေပးမွာျဖစ္ပါတယ္ ။ Null Pointer ေၾကျငာေပးတဲ႔ပံုစံေလး ပါ ။

int * p;
p = 0; // p has a null pointer value


အေပၚမွာ ေဆြးေႏြးခဲ႔ တာေတြကိုနားလည္မယ္ဆိုရင္ Pointer အေၾကာင္းေတာ္ေတာ္ေလး သိေလာက္ၿပီထင္ပါတယ္ ။ ေနာက္ထပ္ Void Pointer တို႔ Pointer To function တို႔ အပိုင္းေတြရွိပါေသးတယ္ ။ ထပ္ၿပီး ပိုေလ႔လာခ်င္တယ္ဆိုရင္ေတာ႔
http://www.cplusplus.com/doc/tutorial/pointers/
http://www.java2s.com/Tutorial/Cpp/0220__Pointer/Catalog0220__Pointer.htm
တို႔မွာကိုယ္တုိင္ေလ႔လာနိုင္ပါတယ္ ။
ဆက္လက္ဖက္ရႈ႕ရန္