int main( ) { // Demonstrate character stacks. stack<char> s1, s2; // create two character stacks int i; s1.push( 'a' ); s2.push( 'x' ); //Continued s1.push( 'b' ); s2.push( 'y' ); s1.push( 'c' ); s2.push( 'z' ); for (i=0; i<3; i++ ) cout<<\" \" <<s1.pop( ) ; cout <<endl; for (i=0; i<3; i++ ) cout<< \" \" <<s2.pop( ) ; cout<<endl; // demonstrate double stacks stack<double> ds1, ds2; // create two double stacks ds1.push( 1.1 ); ds2.push( 2.2 ); ds1.push( 3.3 ); ds2.push( 4.4 ); ds1.push( 5.5); ds2.push( 6.6 ); for (i=0; i<3; i++ ) cout <<\" \"<<ds1.pop( ) ; cout<<endl; for (i=0; i<3; i++ ) cout<<\" \" <<ds2.pop( ) ; return 0; } :اﳋﺮج ﻣﻦ الﱪ ﻣﺞ c ba 201
zyx 5.5 3.3 1.1 6.6 4.4 2.2 ﰎ ﲤﺜﻴﻞ الﻔﺌﺔ stackﻫﻨﺎ ﻛﻘﺎلﺐ ﻓﺌﺎت ،ﻫﺬا اﻷﺳلوب ﻣﺸﺎﺑﻪ لﻸﺳلوب اﳌﺴﺘعﻤﻞ ﻣـﻊ قوالـﺐ الـﺪاﻻت .ﺗﺸـﲑ الﻜلﻤـﺔ اﻷﺳﺎﺳـﻴﺔ templateإﱃ أن الﻔﺌـﺔ ﻛﻤلﻬـﺎ ﺳـﺘﻜون قﺎلﺒـﺎً وﻳﺘﻢ ﻋﻨﺪﻫﺎ اﺳﺘعﻤﺎل وﺳﻴﻄﺔ قﺎلﺐ ﺗﺪﻋى . StackType ﲣﺘلف قوالـﺐ الﻔﺌـﺎت ﻋـﻦ قوالـﺐ الـﺪاﻻت ﰲ ﻃﺮﻳﻘـﺔ اﺳـﺘﻨﺒﺎﻃﻬﺎ .ﻹنﺸـﺎء دالـﺔ ﻓعلﻴـﺔ ﻣـﻦ قﺎلــﺐ داﻻت ﻳــﺘﻢ اﺳــﺘﺪﻋﺎﺋﻬﺎ ﺳ ـﺘعﻤﺎل وﺳــﻴﻄﺎت ﻣــﻦ نــوع ﻣعــﲔ ،لﻜــﻦ الﻔﺌــﺎت ﻳــﺘﻢ اﺳﺘﻨﺒﺎﻃﻬﺎ ﺑﺘعﺮﻳفﻛﺎﺋﻦ ﺳﺘعﻤﺎل وﺳﻴﻄﺔ الﻘﺎلﺐ -: ;stack <char> s1, s2 ﺗﻨﺸــﺊ ﻫـ ـﺬﻩ العﺒــﺎرةﻛــﺎﺋﻨﲔ s2 ،s1ﺑعــﲔ للﻔﺌــﺔ stackوﻳــﺰود اﳌﺼـ ـﺮف ﻣﺴــﺎﺣﺔ ﻣـ ـﻦ الﺬاﻛﺮة لﺒﻴﺎ ت ﻫﺬﻳﻦ الﻜﺎﺋﻨﲔ والﱵ ﻫﻲ ﻣﻦ الﻨـوع charلـﻴس ﻫـﺬا ﻓﻘـط ﺑـﻞ وﻳﻨﺸـﺊ أﻳﻀـﺎً ﳎﻤوﻋﺔ ﻣﻦ اﻷﻋﻀﺎء الﺪالﻴﺔ الﺘﺎﱄ ﺗعﻤﻞ ﻋلى الﻨوع .char ﻻﺣـﻆ ﻫﻨـﺎ أن اﺳـﻢ الﻜـﺎﺋﻨﲔ ﻳﺘﻜـون ﻣـﻦ اﺳـﻢ الﻔﺌـﺔ stackإﺿـﺎﻓﺔ إﱃ وﺳـﻴﻄﺔ الﻘﺎلـﺐ > <charﳑــﺎ ﳝﻴﺰﻫــﺎ ﻋــﻦﻛﺎﺋﻨــﺎت ﺑﻘﻴــﺔ الﻔﺌــﺎت الــﱵ قــﺪ ﻳــﺘﻢ اﺳــﺘﻨﺒﺎﻃﻬﺎ ﻣــﻦ نﻔــس الﻘﺎلــﺐﻛـــ > stack <doubleﻣﺜﻼً. 202
اﻹﺳﺘثﻨﺎءات 9.5 )(Exceptions ﺗﺰود اﻹﺳﺘﺜﻨﺎءات أﺳـلو ًﻛـﺎﺋﲏ اﳌﻨﺤـى ﳌعﺎﳉـﺔ أﺧﻄـﺎء الﺘﺸـﻐﻴﻞ الـﱵ ﺗولـﺪﻫﺎ ﻓﺌـﺎت C++ ،ولﻜﻲ ﺗﻜون إﺳﺘﺜﻨﺎءاً ﳚﺐ أن ﲢﺪث ﺗلﻚ اﻷﺧﻄﺎءﻛﻨﺘﻴﺠﺔ لعﻤﻞ ﻣﺎ ﺟﺮى ﺿـﻤﻦ الـﱪ ﻣﺞﻛﻤـﺎ ﳚﺐ أن ﺗﻜون أﺧﻄﺎء ﻳﺴﺘﻄﻴﻊ الﱪ ﻣﺞ اﻛﺘﺸﺎﻓﻬﺎ ﺑﻨﻔﺴﻪ . اﻟﱰﻛﻴﺐ اﻟﻨﺤﻮي ﻟﻼﺳﺘثﻨﺎء-: لﻨﻔــﱰض أن ﺑﺮ ﳎـ ـﺎً ﻣــﺎ ﻳﻨﺸـ ـﺊﻛﺎﺋﻨــﺎت ﺑعـ ـﺔ لﻔﺌـ ـﺔ ﻣعﻴﻨــﺔ وﻳﺘﻔﺎﻋــﻞ ﻣعﻬـ ـﺎ ،ﻻ ﺗﺴــﺒﺐ اﺳﺘﺪﻋﺎءات اﻷﻋﻀﺎء الﺪالﻴـﺔ أي ﻣﺸـﺎﻛﻞ لﻜـﻦ قـﺪ ﻳﺮﺗﻜـﺐ الـﱪ ﻣﺞ ﰲ ﺑعـﺾ اﻷﺣﻴـﺎن أﺧﻄـﺎء ﳑـﺎ ﻳﺆدى إﱃ اﻛﺘﺸﺎف ﺧﻄﺄ ﰲ ﻋﻀو داﱄ ﻣﺎ. ﻳﻘـوم العﻀـو الـﺪاﱄ ﻋﻨـﺪﻫﺎ ﺑـﻼغ الـﱪ ﻣﺞ أن ﺧﻄـﺄ ﻣـﺎ قـﺪ ﺣﺼـﻞ ،ﻳﺴـﻤى ﻫـﺬا اﻷﻣـﺮ رﻣى اﺳﺘﺜﻨﺎء وﳛﺘوى الﱪ ﻣﺞ ﻋلـى ﺟـﺰء ﻣﻨﻔﺼـﻞ ﳌعﺎﳉـﺔ اﳋﻄـﺄ ،ﻳﺴـﻤى ﻫـﺬا اﳉـﺰء ﻣعـﺎﰿ اﻻﺳـﺘﺜﻨﺎء أو ﻛﺘلﺔ اﻻلﺘﻘﺎط ﻷ ـﺎ ﺗلـﺘﻘط اﻹﺳـﺘﺜﻨﺎءات الـﱵ ﺗﺮﻣﻴﻬـﺎ اﻷﻋﻀـﺎء الﺪالﻴـﺔ .وأي ﻋﺒـﺎرات ﰲ الـﱪ ﻣﺞ ﺗﺴـﺘعﻤﻞﻛﺎﺋﻨـﺎت الﻔﺌـﺔ ﺗﻜـون ﻣوﺟـودة داﺧـﻞﻛﺘلـﺔ ﺗﺴـﻤىﻛﺘلـﺔ اﶈﺎولـﺔ وﻋلﻴـﻪ اﻷﺧﻄـﺎء اﳌولـﺪة ﰲ ﻛﺘلﺔ اﶈﺎولﺔ ﺳﻴﺘﻢ الﺘﻘﺎﻃﻬﺎ ﰲﻛﺘلﺔ اﻻلﺘﻘﺎط . ﻳﺴـــﺘعﻤﻞ اﻻﺳـــﺘﺜﻨﺎء ﺛـ ــﻼث ﻛلﻤــ ـﺎت أﺳﺎﺳـــﻴﺔ ﺟﺪﻳـــﺪة . try ،catch ،throw الـﱪ ﻣﺞ ﻳوﺿـﺢ ﻣﻴـﺰات آلﻴـﺔ اﻻﺳ ـﺘﺜﻨﺎء ﻫـﺬﻩ ) ﻫـو ﻓﻘـط ﲣﻄـﻴط ﻋ ـﺎم ﻹﻇﻬـﺎر الﱰﻛﻴـﺐ اﳌﻨﻄﻘـﻲ لﻼﺳﺘﺜﻨﺎء(-: //Program 9-4: class any class { public: class an error { ;} ) (void func { )if ( /* Error condition*/ ;) (throw an Error } 203
;} ) (void main //Continued { try { ;any class obj1 ;) (obj1.func } )catch(any class:: An Error { // tell user about the Error } } ﻳﺒﺪأ ﻫﺬا الﱪ ﻣﺞ ﺑﻔﺌﺔ ﺗﺪﻋى anyclassوﻫى ﲤﺜﻞ أي ﻓﺌﺔ ﳝﻜﻦ أن ﲢـﺪث ﻓﻴﻬـﺎ أي أﺧﻄـﺎء .ﻳـﺘﻢ ﲢﺪﻳـﺪ ﻓﺌـﺔ اﻻﺳـﺘﺜﻨﺎء ﰲ اﳉـﺰء العـﺎم ﻣـﻦ الﻔﺌـﺔ .any classﺗﻘـوم اﻷﻋﻀـﺎء الﺪالﻴـﺔ الﺘﺎﺑعﺔ للﻔﺌـﺔ any classلﺘـﺪقﻴﻖ ﲝﺜـﺎً ﻋـﻦ أي ﺧﻄـﺄ .إذا وﺟـﺪ ﺗﻘـوم ﺑﺮﻣـﻲ اﺳـﺘﺜﻨﺎء ﺳـﺘعﻤﺎل الﻜلﻤﺔ اﻷﺳﺎﺳﻴﺔ throwﻳلﻴﻬﺎ اﳌﺸﻴﺪ الﺘﺎﺑﻊ لﻔﺌﺔ اﳋﻄﺄ ) (. throw AnError قﻤﻨﺎ ﰲ ) ( mainﲝﺼﺮ العﺒﺎرات الﱵ ﺗﺘﻔﺎﻋﻞ ﻣﻊ الﻔﺌﺔ any classﰲ ﻛﺘلﺔ ﳏﺎولـﺔ إذا ﺳﺒﺒﺖ أي واﺣﺪة ﻣﻦ ﺗلﻚ العﺒﺎرات اﻛﺘﺸﺎف ﺧﻄﺄ ﰲ ﻋﻀو داﱄ ﺑـﻊ للﻔﺌـﺔ any class ﺳﻴﺘﻢ رﻣى اﺳﺘﺜﻨﺎء وﻳﻨﺘﻘﻞ الﺘﺤﻜﻢ إﱄ ﻛﺘلﺔ اﻻلﺘﻘﺎط الﱵ ﺗلﻲ اﶈﺎولﺔ ﻣﺒﺎﺷﺮة. الﱪ ﻣﺞ الﺘﺎﱄ ﻳﺴﺘعﻤﻞ اﻻﺳﺘﺜﻨﺎءات -: //Program 9-5: // Demonstrated Exceptions >#include <iostream.h >#include <conio.h ;const int SIZE =3 class stack { private: ;int tos 204
int stck[SIZE]; public: class Range { }; //Continued stack( ) { tos = 0; } ~stack( ){ }; void push (int i); int pop( ); }; void stack::push(int i) { if( tos >= SIZE) throw Range ( ); else { stck[tos] = i; tos ++; }} stack :: pop( ) { if( tos == 0) throw Range( ); else { tos --; return stck[tos]; }} main ( ) { stack s1; try { s1.push(1); s1.push(2); //Continued s1.push(3); cout << s1.pop ( )<< endl; cout << s1.pop ( )<< endl; cout << s1.pop ( )<< endl; 205
;cout << s1.pop ( )<< endl } )catch (stack::Range { ;cout << \"Stack Full or Empty\" << endl } ;return 0 } ﰲ الﱪ ﻣﺞ الﺴﺎﺑﻖ ﻋﺒﺎرﺗﲔ ﺗﺘﺴﺒﺒﺎن ﰲ رﻣﻲ اﺳﺘﺜﻨﺎء إذا ﺣﺬﻓﻨﺎ رﻣﺰ الﺘعلﻴﻖ الﺬي ﻳﺴﺒﻘﻬﻤﺎ ،اﺧﺘﱪ اﳊﺎلﺘﲔ .ﺳﱰى ﰲ ﻛﻼﳘﺎ رﺳﺎلﺔ اﳋﻄﺄ الﺘﺎلﻴﺔ-: Stack Full or Empty ﳛـﺪد الـﱪ ﻣﺞ أوﻻً ﺟﺴـﻢ ﻓـﺎرغ الﺪالـﺔ ﻷن ﻛـﻞ ﻣـﺎ ﳓﺘـﺎج إلﻴـﻪ ﻫـو ﻓﻘـط اﺳـﻢ الﻔﺌـﺔ الـﺬي ﻳﺘﻢ اﺳﺘعﻤﺎلﻪ لﺮﺑط ﻋﺒﺎرة الﺮﻣﻲ throwﺑﻜﺘلﺔ اﻻلﺘﻘﺎط. ﳛـﺪث اﻻﺳـﺘﺜﻨﺎء ﰲ الﻔﺌـﺔ stackإذا ﺣـﺎول الـﱪ ﻣﺞ ﺳـﺤﺐ قﻴﻤـﺔ ﻋﻨـﺪﻣﺎ ﻳﻜـون الــ stack ﻓﺎرﻏﺎً أو ﺣﺎول دﻓﻊ قﻴﻤﺔ ﻋﻨﺪﻣﺎ ﻳﻜون ﳑﺘلﺌﺎً . وﻹﺑـﻼغ الـﱪ ﻣﺞ أنـﻪ قـﺪ ارﺗﻜـﺐ ﺧﻄـﺄ ﻋﻨـﺪ ﻋﻤلـﻪ ﻣـﻊﻛـﺎﺋﻦ stackﺗـﺪقﻖ اﻷﻋﻀـﺎء الﺪالﻴـﺔ الﺘﺎﺑعـﺔ للﻔﺌـﺔ stackﲝﺜـﺎً ﻋـﻦ ﺧﻄـﺄ ﺳـﺘعﻤﺎل ﻋﺒـﺎرات ifوﺗﺮﻣـﻲ اﺳـﺘﺜﻨﺎءاً إذا ﺣـﺪﺛﺖ إﺣﺪى ﺗلﻚ اﳊﺎﻻت .ﻳﺘﻢ ﰲ الﱪ ﻣﺞ الﺴﺎﺑﻖ رﻣﻲ اﺳﺘﺜﻨﺎء ﰲ ﻣﻜﺎنﲔﻛﻼﳘﺎ ﺳﺘعﻤﺎل العﺒﺎرة: ;) (throw range ﺗﻘـوم ) ( rangeﺳﺘﺤﻀـﺎر اﳌﺸـﻴﺪ )الﻀـﻤﲏ( الﺘـﺎﺑﻊ للﻔﺌـﺔ rangeالـﺬي ﻳﻨﺸـﺊ ﻛﺎﺋﻨـﺎً ﺑـﻊ ﳍـﺬﻩ الﻔﺌـﺔ ﺑﻴﻨﻤـﺎ ﺗﻘـوم throwﺑﻨﻘـﻞ ﲢﻜـﻢ الـﱪ ﻣﺞ إﱃ ﻣعـﺎﰿ اﻻﺳـﺘﺜﻨﺎءات،ﻛـﻞ العﺒـﺎرات ﰲ mainوالـﱵ قـﺪ ﺗﺘﺴـﺒﺐ ﰲ ﻫـﺬا اﻻﺳـﺘﺜﻨﺎء ﳏﺼـورة ﺑـﲔ أقـواس ﺣﺎصـﺮة وﺗﺴـﺒﻘﻬﺎ الﻜلﻤﺔ اﻷﺳﺎﺳﻴﺔ . try اﳉـﺰء ﻣـﻦ الـﱪ ﻣﺞ والـﺬي ﻳعـﺎﰿ اﻻﺳـﺘﺜﻨﺎء ﻣوﺟـود ﺑـﲔ أقـواس ﺣﺎصـﺮة وﺗﺴـﺒﻘﻪ الﻜلﻤـﺔ اﻷﺳﺎﺳﻴﺔ catchﻣﻊ وﺟود اﺳﻢ ﻓﺌﺔ اﻻﺳﺘﺜﻨﺎء ﰲ أقواس . ﳚﺐ أن ﻳﺸﺘﻤﻞ اﺳﻢ ﻓﺌﺔ اﻻﺳﺘﺜﻨﺎء ﻋلى الﻔﺌﺔ الﱵ ﻳﺘواﺟﺪ ﻓﻴﻬﺎ. )catch(stack:: range ﻳــﺪﻋى ﻫــﺬا اﳌﺸــﻴﺪ ﻣعــﺎﰿ اﺳــﺘﺜﻨﺎء وﳚــﺐ أن ﻳلــﻲﻛﺘلــﺔ اﶈﺎولــﺔ ﻣﺒﺎﺷــﺮة وﻫــو ﻳﻘــوم ﰲ الـﱪ ﻣﺞ الﺴـﺎﺑﻖ ﺑعـﺮض رﺳـﺎلﺔ ﺧﻄـﺄ ﻓﻘـط لﻜـﻲ ﻳعلـﻢ اﳌﺴـﺘﺨﺪم ﻋـﻦ ﺳـﺒﺐ ﺗوقـف الـﱪ ﻣﺞ ﻋـﻦ العﻤﻞ . 206
ﻳﻨﺘﻘﻞ الﺘﺤﻜﻢ ﺑعﺪﻫﺎ إﱄ ﻣﺎ ﺑعﺪ ﻣعـﺎﰿ اﻻﺳـﺘﺜﻨﺎء لﻜـﻲ ﻳﺴـﺘﻄﻴﻊ ﻣﺘﺎﺑعـﺔ الـﱪ ﻣﺞ أو ﻳﺮﺳـﻞ الـﺘﺤﻜﻢ إﱃ ﻣﻜﺎن آﺧﺮ أو ﻳﻨﻬى الﱪ ﻣﺞ إذا ﱂ ﺗﻜﻦ ﻫﻨﺎلﻚ ﻃﺮﻳﻘﺔ أﺧﺮى . اﳋﻄوات الﺘﺎلﻴﺔ ﺗلﺨص ﻋﻤلﻴﺔ اﻻﺳﺘﺜﻨﺎء-: /1ﻳﺘﻢ ﺗﻨﻔﻴﺬ الﱪ ﻣﺞ ﺑﺸﻜﻞ ﻃﺒﻴعﻲ ﺧﺎرج ﻛﺘلﺔ اﶈﺎولﺔ . /2ﻳﻨﺘﻘﻞ الﺘﺤﻜﻢ إﱃ ﻛﺘلﺔ اﳌعﺎﳉﺔ. /3ﻋﺒﺎرة ﻣﺎ ﰲ ﻛﺘلﺔ اﶈﺎولﺔ ﺗﺴﺒﺐ ﺧﻄﺄ داﱄ . /4ﻳﺮﻣﻲ العﻀو الﺪاﱄ اﺳﺘﺜﻨﺎء. /5ﻳﻨﺘﻘﻞ الﺘﺤﻜﻢ إﱃ ﻛﺘلﺔ اﻻلﺘﻘﺎط الﱵ ﺗلﻲﻛﺘلﺔ اﶈﺎولﺔ. الﱪ ﻣﺞ الﺘﺎﱄ أﻳﻀﺎً ﻳﻘوم ﺑﺮﻣﻲ اﺳﺘﺜﻨﺎء إذا ﺣﺎول اﳌﺴﺘﺨﺪم إدﺧﺎل رقﻢ ﺳﺎلﺐ .negative //Program 9-6: // Catching class type exeptions. ># include <iostream.h ># include <string.h >#include <conio.h { class MyException public: ;]char str_what[80 ;int what } ;MyException( ) { *str_what =0 ; what = 0 { ) MyException(char *s, int e ;)strcpy (str_what, s ;what = e } ;} ) (int main { ;int i { try ; \" cout << \" Enter a positive number: ; cin >> i )if (i<0 207
; )throw MyException (\"Not Positive\" ,i } catch (MyException e) { // catch an error ; \" cout <<e.str_what << \": ; \"cout << e.what << \"\\n } ;)(getch ;return 0 } اﳋﺮج ﻣﻦ الﱪ ﻣﺞ ﻓﱰاض أن اﳌﺴﺘﺨﺪم قﺪ أدﺧﻞ :i= -4 Enter a positive number: -4 Not Positive: -4 ﰲ الـﱪ ﻣﺞ الﺴ ـﺎﺑﻖ ﻳﻄلــﺐ الـﱪ ﻣﺞ ﻣــﻦ اﳌﺴـﺘﺨﺪم إدﺧ ـﺎل رقـﻢ ﻣوﺟـﺐ ،ولﻜ ـﻦ إذا ﰎ إدﺧـﺎل رقـﻢ ﺳـﺎلﺐ ﻳﻘـوم الـﱪ ﻣﺞ نﺸـﺎء ﻛـﺎﺋﻦ ﺑـﻊ للﻔﺌـﺔ My Exceptionلوصـف ﻫـﺬا اﳋﻄﺄ. 208
اﳌﻠخﺺ: قوالـﺐ الـﺪاﻻت ﻫـو وﺳـﻴلﺔ ﳉعـﻞ الﺪالـﺔ ﺗعﻤـﻞ ﻋلـى أي نـوع ﻣـﻦ أنـواع الﺒﻴـﺎ ت اﳌﺨﺘلﻔﺔ. ﻳﺘﻢ إنﺸﺎء قﺎلﺐ الﺪاﻻت ﺳﺘﺨﺪام الﻜلﻤﺔ اﻷﺳﺎﺳﻴﺔ .Template ﰲ قﺎلﺐ الﺪاﻻت ﻻ ﻳـﺘﻢ ﲤﺜﻴـﻞ نـوع ﺑﻴـﺎ ت ﻣعـﲔ ﰲ الﺪالـﺔ ـﻛـ intﻣـﺜﻼً ﺑـﻞ ﺳـﻢ ﳝﻜﻦ أن ﻳﺸﲑ إﱃ أي نوع ﺑﻴﺎ ت وﻳﺴﻤى ﻫﺬا اﻻﺳﻢ وﺳﻴﻄﺔ قﺎلﺐ. ﳛــﺪد اﳌﺼــﺮف ﻛﻴﻔﻴــﺔ ﺗﺼــﺮﻳف الﺪالــﺔ ﻋلــى أﺳــﺎس نــوع الﺒﻨﻴــﺎت اﳌﺴــﺘعﻤﻞ ﰲ وﺳﻴﻄﺎت اﺳﺘﺪﻋﺎﺋﻬﺎ. قﺎلﺐ الﺪاﻻت ﻫو لﻴس ﰲ الواقﻊ دالﺔ ،ﻫو ﳐﻄط ﻹنﺸﺎء ﻋﺪة داﻻت. ﳝﻜﻦ ﺗعﺮﻳف أﻛﺜﺮ ﻣﻦ وﺳﻴﻄﺔ قﺎلﺐ ﰲ قﺎلﺐ الﺪاﻻت. قﺎلﺐ الﻔﺌﺎت ﻫو ﻓﺌﺔ ﺗعﻤﻞ ﻋلى ﻣﺘﻐﲑات ﰲﻛﻞ أنواع الﺒﻴﺎ ت. ﺗﺘﺒﻊ اﻻﺳﺘﺜﻨﺎءات أﺳلو ًﻛﺎﺋﲏ اﳌﻨﺤى ﳌعﺎﳉﺔ أﺧﻄﺎء الﺘﺸﻐﻴﻞ الﱵ ﺗولﺪﻫﺎ الﻔﺌﺎت ﰲ .C++ ﻋﻨﺪ ﺣﺪوث ﺧﻄﺄ ﰲ إﺣﺪى الﻔﺌﺎت ﺗﻘوم اﻷﻋﻀﺎء الﺪالﻴﺔ ﺑﻼغ الﱪ ﻣﺞ أن ﺧﻄﺄ ﻣﺎ قﺪ ﺣﺪث وﻳﺴﻤى ﻫﺬا اﻷﻣﺮ رﻣى اﺳﺘﺜﻨﺎء. ﳛﺘوى ﺑﺮ ﻣﺞ C++ﻋلى ﺟﺰء ﻣﻨﻔﺼﻞ ﳌعﺎﳉﺔ اﻷﺧﻄﺎء ﻳﺴﻤى ﻣعﺎﰿ اﻻﺳﺘﺜﻨﺎء أوﻛﺘلﺔ اﻻلﺘﻘﺎط. أي ﻋﺒﺎرات ﰲ الﱪ ﻣﺞ ﺗﺴﺘعﻤﻞﻛﺎﺋﻨﺎت الﻔﺌﺔ ﺗﻜون ﻣوﺟودة داﺧﻞ ﻛﺘلﺔ ﺗﺴﻤى ﻛﺘلﺔ اﶈﺎولﺔ. ﻳﺴﺘعﻤﻞ اﻻﺳﺘﺜﻨﺎء ﺛﻼث ﻛلﻤﺎت أﺳﺎﺳﻴﺔ ﻫﻲ.try, catch, throw : اﳋﻄوات الﺘﺎلﻴﺔ ﺗلﺨص ﻋﻤلﻴﺔ اﻻﺳﺘﺜﻨﺎء-: ﻳﺘﻢ ﺗﻨﻔﻴﺬ الﱪ ﻣﺞ ﺑﺸﻜﻞ ﻃﺒﻴعﻲ ﺧﺎرج ﻛﺘلﺔ اﶈﺎولﺔ. ﻳﻨﺘﻘﻞ الﺘﺤﻜﻢ إﱃ ﻛﺘلﺔ اﳌعﺎﳉﺔ. قﺪ ﺗﺆدى ﻋﺒﺎرة ﻣﺎ ﰲ ﻛﺘلﺔ اﶈﺎولﺔ ؟؟؟ ﺧﻄﺄ ﰲ ﻋﻀو داﱄ. ﻳﺮﻣى العﻀو الﺪاﱄ اﺳﺘﺜﻨﺎء. ﻳﻨﺘﻘﻞ الﺘﺤﻜﻢ إﱃ ﻛﺘلﺔ اﻻلﺘﻘﺎط الﱵ ﺗلﻲ ﻛﺘلﺔ اﶈﺎولﺔ. 209
اﻷﺳﺌﻠﺔ /1أﻛﺘﺐ داﻟﺔ ﻗﺎﻟﺐ ﺗﺪﻋﻰ IsEqualToواﻟﱵ ﺗﻘﺎرن ﺑﲔ وﺳﻴﻄﲔ ﺳﺘﻌﻤﺎل اﻟﻌﺎﻣﻞ == وﺗﺮﺟﻊ 1إذا ﻛﺎنﺘﺎ ﻣﺘﻄﺎﺑﻘﺘﲔ و 0إذا ﻛﺎنﺘﺎ ﻏﲑ ذﻟك. ﰒ أﻛﺘﺐ ﺑﺮ ﳎﺎً ﻻﺧﺘبﺎر ﻫﺬﻩ اﻟﺪاﻟﺔ ﻣﻊ أنﻮاع ﺑﻴﺎ ت C++اﻷﺳﺎﺳﻴﺔ. ﻗﻢ ﺑﺘﺤﻤﻴﻞ اﻟﻌﺎﻣﻞ == ﺑشﻜﻞ زاﺋﺪ واﺧﺘﱪﻫﺎ ﻣﻊ ﻛﺎﺋﻨﺎت. /2ﻣﺎ ﻫي اﻟﻌﻼﻗﺔ ﺑﲔ ﻗﻮاﻟﺐ اﻟﺪاﻻت وﲢﻤﻴﻞ اﻟﺪاﻻت ﺑشﻜﻞ زاﺋﺪ. /3وضﺢ اﻟﻌﻼﻗﺔ ﺑﲔ ﻗﺎﻟﺐ اﻟﻔﺌﺎت واﻟﻮراﺛﺔ. /4ﻋﺮف اﻹﺳﺘثﻨﺎء. /5أﻛﺘﺐ اﳋﻄﻮات اﻟﱵ ﺗﻮضﺢ ﻋﻤﻠﻴﺔ اﻹﺳﺘثﻨﺎء. /6أﻛﺘﺐ ﺑﺮ ﳎﺎً ﺗﺴﺘخﺪم فﻴه آﻟﻴﺔ اﻹﺳﺘثﻨﺎءات. 210
اﻟﻮﺣﺪة اﳊﺎدﻳﺔ ﻋشﺮة 11.0 دفﻖ دﺧﻞ/ﺧﺮج C++ ﺑﻨﻬﺎﻳﺔ ﻫﺬﻩ اﻟﻮﺣﺪة: ﺳﺘﺘﻤﻜﻦ ﻣﻦ اﺳﺘﺨﺪام )دﻓﻖ دﺧﻞ /ﺧﺮج( )(Input/Output Stream ﰲ لﻐﺔ .C++ ﺳﺘﺘﻤﻜﻦ ﻣﻦ ﺗﻨﺴﻴﻖ الﺪﺧﻞ /اﳋﺮج. ﺳﺘﺘعﺮف ﻋلىﻛﻴﻔﻴﺔ إدﺧﺎل وإﺧﺮاج الﻜﺎﺋﻨﺎت الﱵ ﺗﻨﺸﺌﻬﺎ ﺑﻨﻔﺴﻚ. ﺳﺘﺘﻤﻜﻦ ﻣﻦ إنﺸﺎء ﻣﻨﺎورات ﺧﺎصﺔ ﺑﻚ. 211
11.1ﻣﻘﺪﻣﺔ اﻟـﺪفﻖ ﻫـو اﺳـﻢ ﻋـﺎم ﻳﻄلـﻖ لﺴـﻴﻞ ﻣـﻦ الﺒﻴـﺎ ت ﰲ ﺣﺎلـﺔ دﺧـﻞ/ﺧﺮج .ﻳـﺘﻢ ﲤﺜﻴـﻞ دﻓـﻖ )الـﺪﺧﻞ /اﳋـﺮج( ﺑﻜـﺎﺋﻦ ﺑـﻊ لﻔﺌـﺔ ﻣعﻴﻨـﺔ ،ﻓﻤـﺜﻼً رأﻳﻨـﺎ ﰲ ﲨﻴـﻊ اﻷﻣﺜلـﺔ الﺴـﺎﺑﻘﺔﻛﺎﺋﻨـﺎت الـﺪﻓﻖ cout ,cinوالﱵ اﺳﺘعﻤلﻨﺎﻫﺎ لعﻤلﻴﺎت الﺪﺧﻞ واﳋﺮج. ﻫﺮﻣﻴﺔ فﺌﺎت اﻟﺪفﻖ 11.2 ﺑﻊ اﻟشﻜﻞ ) (11-1اﻟﺘﺎﱄ: ios istream ostream iostream اﻟشﻜﻞ 11-1ﻳﻮضﺢ ﻫﺮﻣﻴﺔ فﺌﺎت اﻟﺪفﻖ ﻛﻤـﺎ نـﺮى ﻣـﻦ الﺸـﻜﻞ الﻔﺌـﺔ iosﻫـﻲ الﻔﺌـﺔ الﻘﺎﻋـﺪة ﳍﺮﻣﻴـﺔ دﻓـﻖ الـﺪﺧﻞ واﳋـﺮج وﻫـى ﲢﺘـوى ﻋلـى العﺪﻳـﺪ ﻣـﻦ الﺜواﺑـﺖ واﻷﻋﻀـﺎء الﺪالﻴـﺔ اﳌﺸـﱰﻛﺔ ﺑـﲔ ﳐﺘلـف اﻷنـواع ﻣـﻦ ﻓﺌـﺎت الـﺪﺧﻞ واﳋﺮج .الﻔﺌﺘﺎن istreamو ostreamﻣﺸﺘﻘﺎت ﻣﻦ الﻔﺌـﺔ iosوﳘـﺎ ﻣﺘﺨﺼﺼـﺘﺎن ﻋﻤـﺎل الـﺪﺧﻞ واﳋـﺮج .ﲢﺘـوى الﻔﺌـﺔ istreamﻋلـى أﻋﻀـﺎء دالﻴـﺔ لــ ) (getline( ) , get وﻋﺎﻣـﻞ الـﺪﺧﻞ)>>( ﺑﻴﻨﻤـﺎ ﲢﺘـوى الﻔﺌـﺔ ostreamﻋلـى ) ( putو ) ( writeوﻋﺎﻣـﻞ اﳋﺮج )<<(. ﲢﺘـوى الﻔﺌـﺔ iosﻋلـى أﻏلﺒﻴـﺔ اﳌﻴـﺰات الـﱵ ﲢﺘـﺎج إلﻴﻬـﺎ ﻻﺳـﺘﺨﺪام الـﺪﻓﻖ ﰲ C++وﻣـﻦ أﻫﻢ ﻫﺬﻩ اﳌﻴﺰات أﻋﻼم الﺘﻨﺴﻴﻖ. 212
أﻋﻼم اﻟﺘﻨﺴﻴﻖ 11.3 Format state flags ﻫـﻲ ﳎﻤوﻋـﺔ ﻣـﻦ اﻷﻋﻀـﺎء ﰲ الﻔﺌـﺔ iosﺗعﻤـﻞ لﺘﺤﺪﻳـﺪ ﺧﻴـﺎرات ﰲ ﻋﻤـﻞ وﺗﻨﺴـﻴﻖ الﺪﺧﻞ واﳋﺮج. ﻫﻨﺎلـﻚ ﻋـﺪة ﻃـﺮق لﻀـﺒط أﻋـﻼم الﺘﻨﺴـﻴﻖ ،وﲟـﺎ أن اﻷﻋـﻼم ﻫـﻲ أﻋﻀـﺎء ﰲ الﻔﺌـﺔ ios ﳚـﺐ ﻋـﺎدة وﺿـﻊ اﺳـﻢ الﻔﺌـﺔ iosوﻋﺎﻣـﻞ دقـﺔ اﳌـﺪى قﺒلﻬـﺎ .ﳝﻜـﻦ ﺿـﺒط ﻛـﻞ اﻷﻋـﻼم ﺳـﺘعﻤﺎل اﻷﻋﻀﺎء الﺪالﻴﺔ ) ( setfو) ( unsetfالﺘﺎﺑعﺔ للﻔﺌﺔ -:ios اﳉﺪول الﺘﺎﱄ ﻳﺒﲔ ﺑعﺾ ﻷﻋﻼم ﺗﻨﺴﻴﻖ الﻔﺌﺔ -:ios اﻟﻌﻠﻢ ﻣﻌﻨﺎﻩ ﲡﺎﻫﻞ اﳌﺴﺎﻓﺎت الﺒﻴﻀﺎء اﳌوﺟودة ﰲ الﺪﺧﻞ skipws ﳏﺎذاة اﳋﺮج إﱃ الﻴﺴﺎر left ﳏﺎذاة اﳋﺮج إﱃ الﻴﻤﲔ right ﲢوﻳﻞ إﱃ ﻋﺸﺮي dec اﺳﺘعﻤﺎل ﻣﺆﺷﺮ الﻘﺎﻋﺪة ﰲ اﳋﺮج showbase إﻇﻬﺎر الﻨﻘﻄﺔ العﺸﺮﻳﺔ ﰲ اﳋﺮج showpoint اﺳﺘعﻤﺎل اﻷﺣﺮف الﻜﺒﲑة ﰲ اﳋﺮج uppercase ﻋﺮض ) (+قﺒﻞ اﻷﻋﺪاد الﺼﺤﻴﺤﺔ اﳌوﺟﺒﺔ showpos الﱪ ﻣﺞ الﺘﺎﱄ ﻳوﺿﺢ ﻛﻴﻔﻴﺔ اﺳﺘعﻤﺎل ﻋلﻤﻲ الﺘﻨﺴﻴﻖ showposو -:showpoint //Program 11-1: >#include <iostream.h ) (int main { ;)cout.setf(ios:: showpoint ;)cout.setf(ios:: showpos cout<< 100.0; // displays + 100.0 ; return 0 213
} اﳋﺮج ﻣﻦ الﱪ ﻣﺞ: +100.00 اﳌﻨﺎورات 11.4 Manipulators اﳌﻨﺎورات ﻫﻲ ﺗعلﻴﻤﺎت ﺗﻨﺴﻴﻖ ﺗﺪرج ﰲ الﺪﻓﻖ ﻣﺒﺎﺷﺮة ،رأﻳﻨﺎ ﻣﻨﻬﺎ ﺣﱴ اﻵن اﳌﻨﺎور endlوالﺜﺎﱐ ﻳﺮﺳﻞ ﺳﻄﺮاً ﺟﺪﻳﺪاً إﱃ الﺪﻓﻖ. ﻫﻨﺎلﻚ نوﻋﺎن ﻣﻦ اﳌﻨﺎورات ،نوع ﺧﺬ وﺳﻴﻄﺔ واﻵﺧﺮ ﻻ ﺧﺬ أي وﺳﻴﻄﺔ ،اﳉﺪول الﺘﺎﱄ ﻳوﺿﺢ ﺑعﺾ اﳌﻨﺎورات الﱵ ﻻ ﺧﺬ أي وﺳﻴﻄﺎت-: اﳌﻨﺎور ﻫﺪفه ﺗﻨﺸﻴط ﻣﻴﺰة ﲣﻄى اﳌﺴﺎﻓﺎت الﺒﻴﻀﺎء اﳌوﺟودة ﰲ الﺪاﺧﻞ ws الﺘﺤوﻳﻞ إﱃ ﻋﺸﺮي dec الﺘﺤوﻳﻞ إﱃ ﲦﺎﱐ oct الﺘﺤوﻳﻞ إﱃ ﺳﺖ ﻋﺸﺮي hex إدراج ﺳﻄﺮ ﺟﺪﻳﺪ endl إدراج ﺣﺮف ﺧﺎﻣﺪ ﻹ ﺎء ﺳلﺴلﺔ ﺧﺮج ends ﺗﺪرج ﻫﺬﻩ اﳌﻨـﺎورات ﰲ الـﺪﻓﻖ ﻣﺒﺎﺷـﺮة ،ﻓﻤـﺜﻼً ﳋـﺮج اﳌﺘﻐـﲑ varﰲ الﺘﻨﺴـﻴﻖ الﺴﺘعﺸـﺮى نﻜﺘﺐ: ;cout<<hex<<var إن اﳊﺎلﺔ الﱵ ﺗﻀﺒﻄﻬﺎ اﳌﻨﺎورات لﻴس ﳍﺎ وﺳﻴﻄﺎت ﺗﺒﻘى نﺸﻄﺔ إﱃ أن ﻳﺘﻢ ﺗـﺪﻣﲑ الـﺪﻓﻖ وﻋلﻴﻪ ﳝﻜﻨﻨﺎ ﺧﺮج ﻋﺪة أرقﺎم ﰲ الﺘﻨﺴﻴﻖ الﺴﺘعﺸﺮى ﻣﻦ ﺧﻼل إدراج ﻣﻨﺎور hexواﺣﺪ ﻓﻘط. اﳉ ـﺪول الﺘ ـﺎﱄ ﻳلﺨــص ﺑعــﺾ اﳌﻨــﺎورات الــﱵ ﺧــﺬ وﺳــﻴﻄﺎت وﳓﺘــﺎج إﱃ إدراج ﻣلــف الﱰوﻳﺴــﺔ iomanip.hلﻜﻲ نﺴﺘعﻤﻞ ﻫﺬﻩ اﳌﻨﺎورات-: اﻟﻮﺳﻴﻄﺔ ﻫﺪفه اﳌﻨﺎور 214
ﻋﺮض اﳊﻘﻞ ) (intﺿﺒط ﻋﺮض اﳊﻘﻞ اﳌﻄلوب ﻋﺮﺿﻪ )(setw ﺣﺮف اﳊﺸو ) (intﺿﺒط ﺣﺮف اﳊﺸو ﰲ اﳋﺮج)اﳊﺮف اﻻﻓﱰاﺿﻲ ﻫو اﳌﺴﺎﻓﺔ )(setfill ﺿﺒط الﺪقﺔ)ﻛﻤﻴﺔ اﻷرقﺎم اﳌعﺮوﺿﺔ( )( setprecisionالﺪقﺔ )(int )( set iosflagsأﻋﻼم ﺗﻨﺴﻴﻖ ) (longﺿﺒط اﻷﻋﻼم اﶈﺪدة )( Resetiosflagsأﻋﻼم ﺗﻨﺴﻴﻖ ) (longﻣﺴﺢ اﻷﻋﻼم اﶈﺪدة إن اﳌﻨـ ـﺎورات الـ ـﱵ ﺧـ ـﺬ وﺳـ ـﻴﻄﺎت ﺗـ ـﺆﺛﺮ ﻓﻘــط ﻋلــى الﺒﻨــﺪ الﺘـ ـﺎﱄ ﰲ الــﺪﻓﻖ ﻓﻤـ ـﺜﻼً إذا اﺳـﺘعﻤلﻨﺎ اﳌﻨـﺎور ) ( setwلﻀـﺒط ﻋـﺮض اﳊﻘـﻞ الـﺬي ﻳـﺘﻢ إﻇﻬـﺎر رقـﻢ ﻣـﺎ ﻓﻴـﻪ ﺳـﻨﺤﺘﺎج إﱃ اﺳﺘعﻤﺎلﻪ ﳎﺪداً ﻣﻊ الﺮقﻢ الﺘﺎﱄ. اﳌﺜﺎل الﺘﺎﱄ ﻳﺴﺘعﻤﻞ ﺑعﺾ ﻫﺬﻩ اﳌﻨﺎورات : //Program 11-2: >#include <iostream.h >#include <iomanip.h ) (int main { ;cout << hex << 100 << endl ;cout << setfill('?') << setw(10) << 2343.0 ;return 0 } اﳋﺮج ﻣﻦ الﱪ ﻣﺞ: 64 ??????2343 215
دوال اﻟﺪفﻖ 11.5 Stream Functions ﲢﺘوى الﻔﺌﺔ iosﻋلى ﻋـﺪد ﻣـﻦ الـﺪاﻻت الـﱵ ﳝﻜـﻦ اﺳـﺘﺨﺪاﻣﻬﺎ لﻀـﺒط أﻋـﻼم الﺘﻨﺴـﻴﻖ وﺗﻨﻔﻴﺬ ﻣﻬﺎم أﺧﺮى .اﳉﺪول الﺘﺎﱄ ﻳﺒﲔ ﻣعﻈﻢ ﻫﺬﻩ الﺪاﻻت . اﻟﺪاﻟﺔ ﻫﺪفﻬﺎ إﻋﺎدة ﺣﺮف اﳊﺸو)الﻔﺮاغ ﻫو اﻻﻓﱰاﺿﻲ( ;) (ch=fill ﺿﺒط ﺣﺮف اﳊﺸو ;)fill(ch اﳊﺼول ﻋلى الﺪقﺔ ;) (p=precision ﺿﺒط الﺪقﺔ ;)precision(p اﳊﺼول ﻋلى ﻋﺮض اﳊﻘﻞ الﺘﺎﱄ ;) (w=width ﺿﺒط أﻋﻼم الﺘﻨﺴﻴﻖ اﶈﺪدة ;)setf(flags إلﻐﺎء ﺿﺒط أﻋﻼم الﺘﻨﺴﻴﻖ اﶈﺪدة ;)unsetf (flags ﻣﺴﺢ اﳊﻘﻞ أوﻻً ﰒ ﺿﺒط اﻷﻋﻼم ;)setf(flags,field ﻳــﺘﻢ اﺳــﺘﺪﻋﺎء ﻫــﺬﻩ الــﺪاﻻت ﺑواﺳــﻄﺔ ﻛﺎﺋﻨــﺎت الــﺪﻓﻖ ﺳــﺘعﻤﺎل ﻋﺎﻣــﻞ الﻨﻘﻄــﺔ ،ﻓﻤــﺜﻼً لﻀﺒط ﻋﺮض اﳊﻘﻞ ﻋﻨﺪ 5ﳝﻜﻨﻨﺎﻛﺘﺎﺑﺔ : ;)cout.Width(5 أﻳﻀﺎً ﺗﻀﺒط العﺒﺎرة الﺘﺎلﻴﺔ ﺣﺮف اﳊﺸو ﻋﻨﺪ * -: ;)’*‘(cout.fill الﱪ ﻣﺞ الﺘﺎﱄ ﻳﺴﺘﺨﺪم الﺪوال ) ( widthو) ( precisionو) (. fill //Program 11-3: >#include <iostream.h >#include <iomanip.h ) (int main { ; )cout.precision (4 ;)cout.width(10 ; \"cout<< 10.12345 <<\"\\n ;)'?'(cout<<setfill ;)cout.width(10 216
; \"cout<< 10.12345 <<\"\\n اﳋﺮج ﻣﻦ الﱪ ﻣﺞ: //Continued // field width applies to strings, too ;)cout.width(10 ; \"cout<< \" Hi!\" <<\"\\n ;)cout.width(10 ;)cout.setf(ios::left ; cout<< 10.12345 ;return 0 } 10.12 *****10.12 !*******Hi *****10.12 اﻟﻔﺌﺔ istream 11.6 ﺗﻨﻔﺬ الﻔﺌﺔ istreamاﳌﺸﺘﻘﺔ ﻣﻦ الﻔﺌﺔ iosنﺸﺎﻃﺎت ﺧﺎصﺔ لﺪﺧﻞ ونﺸﺎﻃﺎت إﺿﺎﻓﻴﺔ .اﳉﺪول الﺘﺎﱄ ﻳوﺿﺢ ﺑعﺾ داﻻت الﻔﺌﺔ . istream اﻟﺪاﻟﺔ ﻫﺪفﻬﺎ إدﺧﺎل ﻣﻨﺴﻖ لﻜﻞ اﻷنواع اﻷﺳﺎﺳﻴﺔ واﶈﻤلﺔ ﺑﺸﻜﻞ زاﺋﺪ >> إدﺧﺎل ﺣﺮف واﺣﺪ )get(ch )get(str إدﺧﺎل أﺣﺮف إﱃ ﻣﺼﻔوﻓﺔ وصوﻻً إﱃ ’‘\\o )get(str,max إدﺧﺎل ﺣﱴ maxأﺣﺮف إﱃ اﳌﺼﻔوﻓﺔ )peek(ch قﺮاءة ﺣﺮف واﺣﺪ وﺗﺮﻛﻪ ﰲ الﺪﻓﻖ 217
) putpack(chإﻋﺎدة إدراج اﳊﺮف اﻷﺧﲑ اﳌﻘﺮوء ﰲ دﻓﻖ الﺪﺧﻞ count=gcountإﻋﺎدة ﻋﺪد اﻷﺣﺮف الﱵ قﺮأﻫﺎ اﺳﺘﺪﻋﺎء الﺪالﺔ )( getو )(getline لﻘﺪ رأﻳﻨﺎ ﺣﱴ اﻵن ﺑعﻀﺎً ﻣﻦ ﻫﺬﻩ الﺪاﻻتﻛـ ) ( getﻣﺜﻼً .ﻣعﻈﻤﻬﺎ ﻳعﻤﻞ ﻋلى الﻜﺎﺋﻦ cinاﳊﻘﻴﻘﻲ ﳝﺜﻞ لوﺣﺔ اﳌﻔﺎﺗﻴﺢ. 218
اﻟﻔﺌﺔ ostream 11.7 ﺗعﺎﰿ الﻔﺌﺔ ostreamنﺸﺎﻃﺎت اﳋﺮج ،ﻳﺒﲔ اﳉﺪول الﺘﺎﱄ أﻏلﺐ الﺪاﻻت الﱵ ﺗﺴﺘعﻤلﻬﺎ ﻫﺬﻩ الﻔﺌﺔ-: ﻫﺪفﻬﺎ اﻟﺪاﻟﺔ إﺧﺮاج ﻣﻨﺴﻖ لﻜﻞ اﻷنواع اﻷﺳﺎﺳﻴﺔ واﶈﻤلﺔ ﺑﺸﻜﻞ زاﺋﺪ << إﺧﺮاج اﳊﺮف chﰲ الﺪﻓﻖ )put(ch ) (flush ﻣﺴﺢ ﳏﺘو ت الﺪارئ ) (Bufferوإدراج ﺳﻄﺮ ﺟﺪﻳﺪ )write(str,size إﺧﺮاج sizeأﺣﺮف ﻣﻦ اﳌﺼﻔوﻓﺔ str لﻘﺪ اﺳﺘعﻤلﻨﺎ ﺣﱴ اﻵن ﻛﺎﺋﲏ دﻓـﻖ cinو . coutﻳـﺮﺗﺒط ﻫـﺬان الﻜﺎﺋﻨـﺎن ﻋـﺎدة ﺑلوﺣـﺔ اﳌﻔﺎﺗﻴﺢ والﺸﺎﺷﺔ ﻋلى الﺘواﱄ .ﻫﻨﺎك ﻛﺎﺋﻨﺎن آﺧﺮان ﳘﺎ cerrو . clog ﻏﺎلﺒــﺎً ﻣــﺎ ﻳــﺘﻢ اﺳــﺘعﻤﺎل الﻜــﺎﺋﻦ cerrلﺮﺳــﺎﺋﻞ اﳋﻄــﺄ .اﳋــﺮج اﳌﺮﺳــﻞ إﱃ cerrﻳــﺘﻢ ﻋﺮﺿﻪ ﻓوراً وﻻ ﳝﻜﻦ ﺗﻐﻴﲑ وﺟﻬﺘﻪ لﺬا ﺗﺮى رﺳـﺎلﺔ اﳋـﺮج ﻣـﻦ cerrﰲ ﺣـﺎل ﺗعﻄـﻞ الـﱪ ﻣﺞﻛلﻴـﺎً. ﻫﻨﺎلـﻚ ﻛﺎﺋﻨـﺎً ﳑـﺎﺛﻼً لـ ـ cerrﻫـو clogلﻜـﻦ ﻳـﺘﻢ وﺿـﻊ ﺧـﺮج الﻜـﺎﺋﻦ ﰲ الـﺪارئ ﻋلـى ﻋﻜـس .cerr ﲢﻤﻴﻞ اﻟﻌﻮاﻣﻞ << و >> ﺑشﻜﻞ زاﺋﺪ 11.8 ﳝﻜـﻦ ﲢﻤﻴـﻞ العواﻣـﻞ << و >> ﺑﺸـﻜﻞ زاﺋـﺪ ﻹدﺧـﺎل وإﺧـﺮاج ﻛﺎﺋﻨـﺎت ﺑعـﺔ لﻔﺌـﺎت ﻋﺮﻓﻬـﺎ اﳌﺴـﺘﺨﺪم .الـﱪ ﻣﺞ الﺘـﺎﱄ ﻳﻘـوم ﺑﺘﺤﻤﻴـﻞ ﻋﺎﻣـﻞ اﻹﺧـﺮاج <<ﺑﺸـﻜﻞ زاﺋـﺪ وذلـﻚ ﻹﺧـﺮاج ﻛﺎﺋﻦ ﺑﻊ للﻔﺌﺔ .phonebook //Program 11-4: >#include <iostream >#include <cstring { class phonebook // now private 219
char name[80]; int areacode; //Continued int prefix; int num; public: phonebook(char *n, int a, int p, int nm) { strcpy(name, n) ; areacode = a; prefix =p; num = nm; } friend ostream & operator <<(ostream &stream, phonebook o); }; // Display name and phone number. ostream & operator << (ostream &stream, phonebook o) { stream<< o.name <<\" \"; stream << \"(\" << o.areacode << \") \" ; stream <<o.prefix<< \"-\" << o.num <<\"\\n\" ; return stream; // must return stream } int main( ) { phonebook a(\"Mohammed\", 011, 011, 123456); phonebook b(\"Omer\" , 031, 011, 576890); phonebook c(\"Ali\" , 261, 011, 999009); cout<<a<<b<<c; return 0; } 220
اﳋﺮج ﻣﻦ الﱪ ﻣﺞ: Mohammed (011) 011 –123456 Omer (031) 011–576890 Ali (261) 011– 999009 ﻻﺣـﻆ ﰲ الﺪالـﺔ ) ( mainﻣـﺪى ﺳـﻬولﺔ ﻣعﺎﻣلـﺔ ﻛﺎﺋﻨـﺎت الﻔﺌـﺔ phonebookﻛـﺄي نوع ﺑﻴﺎ ت أﺳﺎﺳﻲ آﺧﺮ ﺳﺘعﻤﺎل العﺒﺎرة-: ;cout<<a<<b<<c ﰎ ﺗعﺮﻳف الﺪالـﺔ) ( << operatorﻋلـى أ ـﺎ صـﺪﻳﻘﺔ للﻔﺌـﺔ phonebookوذلـﻚ ﻷنﻛﺎﺋﻨـــــﺎت ostreamﺗﻈﻬـ ـــﺮ ﰲ اﳉﻬـــــﺔ الﻴﺴـــــﺮى للعﺎﻣـــــﻞ وﻫـــــى ﺗﻔﻴـــــﺪﻛﺎﺋﻨـ ـــﺎً ﺑعـ ـــﺎً للﻔﺌـﺔ ) ostreamالعﺎﻣـﻞ << ( ،ﺗﺴـﻤﺢ قـﻴﻢ اﻹﻋـﺎدة ﻫـﺬﻩ ﺧـﺮج أﻛﺜـﺮ ﻣـﻦ قﻴﻤـﺔ واﺣـﺪة ﰲ العﺒﺎرة .ﻳﻨﺴﺦ العﺎﻣﻞ << الﺒﻴﺎ ت ﻣﻦ الﻜﺎﺋﻦ اﶈﺪدﻛﺎلوﺳـﻴﻄﺔ الﺜﺎنﻴـﺔ وﻳﺮﺳـلﻬﺎ إﱃ الـﺪﻓﻖ اﶈـﺪد ﻛﺎلوﺳﻴﻄﺔ اﻷوﱃ. ﲢﻤﻴﻞ اﻟﻌﺎﻣﻞ >> ﺑشﻜﻞ زاﺋﺪ-: وﺑـﻨﻔس الﻄﺮﻳﻘـﺔ ﳝﻜﻨﻨـﺎ ﲢﻤﻴـﻞ العﺎﻣـﻞ >> ﺑﺸـﻜﻞ زاﺋـﺪ ﻹدﺧـﺎل الﻜﺎﺋﻨـﺎت الـﱵ ﻳعﺮﻓﻬـﺎ اﳌﺴﺘﺨﺪم ﺑﻨﻔﺴﻪ .الﱪ ﻣﺞ الﺘـﺎﱄ ﻳﺴـﻤﺢ للﻤﺴـﺘﺨﺪم ﺳـﺘعﻤﺎل العﺎﻣـﻞ >> ﻹدﺧـﺎلﻛﺎﺋﻨـﺎت ﺑعـﺔ للﻔﺌﺔ . phonebook //Program 11-5: >#include <iostream.h >#include <cstring.h { class phonebook ;]char name[80 ;int areacode ;int prefix ;int num 221
public: phonebook( ) { }; phonebook(char *n, int a, int p, int nm) { strcpy(name, n) ; areacode = a; //Continued prefix =p; num = nm; } friend ostream & operator<<(ostream &stream, phonebook o); friend istream & operator>>(istream &stream, phonebook &o); }; // Display name and phone number. ostream & operator << (ostream &stream, phonebook o) { stream<< o.name <<\" \"; stream << \"(\" << o.areacode << \") \" ; stream <<o.prefix<< \"-\" << o.num <<\"\\n\" ; return stream; // must return stream } // Input name and telephone number. istream & operator>> (istream &stream, phonebook &o) { cout << \" Enter name: \"; stream>> o.name; cout << \" Enter area code: \"; stream>> o.areacode; cout << \" Enter prefix: \"; stream>> o.prefix; cout << \" Enter number: \"; 222
stream>> o.num; :اﳋﺮج ﻣﻦ الﱪ ﻣﺞ cout<<\"\\n\" ; return stream; } int main( ) { phonebook b; cin>> b; cout << b; //Continued return 0; } Enter name: Ahmed Enter area code: 111 Enter prefix: 555 Enter number: 1010 Ahmed(111)555 –1010 ﻛﻴﻔﻴﺔ إنشﺎء ﻣﻨﺎورات ﺧﺎﺻﺔ ﺑﻨﺎ 11.9 . ﳝﻜﻦ أﻳﻀﺎً للﻤﺴﺘﺨﺪم إنﺸﺎء ﻣﻨﺎورات ﺗﻘوم ﺑﺘﻨﺴﻴﻖ ﺧﺎص ﳌﺴﺘﺨﺪم -:الﺼورة العﺎﻣﺔ ﻹنﺸﺎء ﻣﻨﺎور ﺧﺮج ﻫﻲ ostream & mani-name( ostream & stream) { //your code here return stream; } .() ( و) ﻳﻘوﻣﺎن ﺧﺮاجra( ) وla( ) اﳌﺜﺎل الﺘﺎﱄ ﻳﻘوم نﺸﺎء ﻣﻨﺎورﻳﻦ 223
//Program 11-6: #include <iostream> #include <iomanip> #include <conio.h> // Right Arrow ostream &ra(ostream &stream) { stream << \"-> \" ; return stream; } // Left Arrow ostream &la(ostream &stream) { stream << \"<- \" ; return stream; } int main( ) { cout << \"High balance\" <<ra<< 1233.23<<\"\\n\"; cout <<\"Over draft\" << ra<<567.66<< la; getch(); return 0; } :اﳋﺮج ﻣﻦ الﱪ ﻣﺞ High balance 1233.23 Over draft 567.66 -:اﻟصﻮرة اﻟﻌﺎﻣﺔ ﻹنشﺎء ﻣﻨﺎور دﺧﻞ ﻫي istream & mani-name(istream & stream) { //your code here return stream; 224
} والﺜﺎﱐ ﻳﻘوم ﺧﺮاج صوتgetpass( ) اﳌﺜﺎل الﺘﺎﱄ ﻳﻘوم نﺸﺎء ﻣﻨﺎور دﺧﻞ . password \\‘ وﻳﻄلﺐ ﻣﻦ اﳌﺴﺘﺨﺪم إدﺧﺎلa’ ﺟﺮس ﺳﺘعﻤﺎل ﺗﺘﺎﺑﻊ اﳍﺮوب //Program 11-7: #include <iostream> #include <cstring> // Asimple input manipulator. istream &getpass (istream &stream) { cout << '\\a' ; // sound bell cout << \"Enter password: \"; return stream; } int main( ) { char pw[80]; do cin>> getpass >>pw; while (strcmp (pw, \"password\")); cout <<\"logon complete\\n\"; return 0; } :اﳋﺮج ﻣﻦ الﱪ ﻣﺞ Enter password: password Login complete 225
اﳌﻠخﺺ: الﺪﻓﻖ ﻫو اﺳﻢ ﻋﺎم ﻳﻄلﻖ لﺴﻴﻞ ﻣﻦ الﺒﻴﺎ ت ﰲ ﺣﺎلﺔ دﺧﻞ /ﺧﺮج. الﻔﺌﺔ iosﻫﻲ الﻔﺌﺔ الﻘﺎﻋﺪة ﳍﺮﻣﻴﺔ دﻓﻖ الﺪﺧﻞ /اﳋﺮج. الﻔﺌﺎت ostream ،istreamﻣﺸﺘﻘﺘﺎن ﻣﻦ الﻔﺌﺔ iosوﳘﺎ ﳐﺘﺼﺘﺎن ﻋﻤﺎل الﺪﺧﻞ واﳋﺮج. أﻋﻼم الﺘﻨﺴﻴﻖ ﻫﻲ ﳎﻤوﻋﺔ ﻣﻦ اﻷﻋﻀﺎء ﰲ الﻔﺌﺔ iosﺗعﻤﻞ ﻋلى ﺗﻨﺴﻴﻖ الﺪﺧﻞ واﳋﺮج. اﳌﻨﺎورات ﻫﻲ ﺗعلﻴﻤﺎت ﺗﻨﺴﻴﻖ ﺗﺪرج ﰲ الﺪﻓﻖ ﻣﺒﺎﺷﺮة. ﻫﻨﺎلﻚ نوﻋﺎن ﻣﻦ اﳌﻨﺎورات ،نوع ﺧﺬ وﺳﻴﻄﺔ واﻵﺧﺮ ﻻ ﺧﺬ أي وﺳﻴﻄﺔ. اﳊﺎلﺔ الﱵ ﺗﻀﺒﻄﻬﺎ اﳌﻨﺎورات الﱵ لﻴس ﳍﺎ وﺳﻴﻄﺎت ﺗﺒﻘى نﺸﻄﺔ إﱃ أن ﻳﺘﻢ الﺪﻓﻖ. ﻋﻨﺪ اﺳﺘعﻤﺎل اﳌﻨﺎورات ﳚﺐ إﺧﺮاج ﻣلف الﱰوﻳﺴﺔ .iomanip.h ﲢﺘوى الﻔﺌﺔ iosﻋلى ﻋﺪد ﻣﻦ الﺪاﻻت الﱵ ﳝﻜﻦ اﺳﺘﺨﺪاﻣﻬﺎ لﻀﺒط أﻋﻼم الﺘﻨﺴﻴﻖ. ﺗﻨﻔﺬ الﻔﺌﺔ ostreamاﳌﺸﺘﻘﺔ ﻣﻦ الﻔﺌﺔ iosنﺸﺎﻃﺎت ﺧﺎصﺔ لﺪﺧﻞ. ﺗعﺎﰿ الﻔﺌﺔ ostreamنﺸﺎﻃﺎت اﳋﺮج. ﻳﺘﻢ اﺳﺘعﻤﺎل الﻜﺎﺋﻦ cerrلعﺮض رﺳﺎﺋﻞ اﳋﻄﺄ. ﳝﻜﻦ ﲢﻤﻴﻞ << و >> ﺑﺸﻜﻞ زاﺋﺪ ﻹدﺧﺎل و ﺑﺸﻜﻞ زاﺋﺪ ﻹدﺧﺎل وإﺧﺮاج ﻛﺎﺋﻨﺎت ﺑعﺔ لﻔﺌﺎت ﻋﺮﻓﻬﺎ اﳌﺴﺘﺨﺪم. ﳝﻜﻦ إنﺸﺎء ﻣﻨﺎورات ﺗﻘوم ﺑﺘﻨﺴﻴﻖ ﺧﺎص ﳌﺴﺘﺨﺪم. 226
اﻷﺳﺌﻠﺔ -1ﻗﻢ ﺑﻜﺘﺎﺑﺔ ﺑﺮ ﻣج ﻳﻨﻔﺬ اﻵﰐ: ﻃﺒﺎﻋـﺔ العـﺪد الﺼـﺤﻴﺢ 40000ﻣـﻊ ﳏﺎذاﺗـﻪ ﻋلـى الﻴﺴـﺎر ﻋلـى أن ﻳﻜـون ﻋـﺮض اﳊﻘـﻞ .15 قﺮاءة ﺳلﺴلﺔ وﲣﺰﻳﻨﻬﺎ ﰲ ﻣﺼﻔوﻓﺔ أﺣﺮف .state ﻃﺒﺎﻋﺔ 200ﺑعﻼﻣﺔ وﺑﺪون ﻋﻼﻣﺔ. ﻃﺒﺎﻋﺔ العﺪد 100لﻨﻈﺎم الﺴﺎدس ﻋﺸﺮ. /2أﻛﺘﺐ ﺑﺮ ﳎﺎً ﻟﺪﺧﻞ أﻋﺪاد ﺻﺤﻴﺤﺔ ﻟﻨظﺎم اﻟﻌشﺮي واﻟثﻤﺎﱐ واﻟﺴﺎدس ﻋشﺮ وﺧﺮج ﻫﺬﻩ اﻷﻋﺪاد .اﺧﺘﱪ اﻟﱪ ﻣج ﻟبﻴﺎ ت اﻵﺗﻴﺔ: 010 , 010 , 10 227
اﻟﻮﺣﺪة اﻟثﺎنﻴﺔ ﻋشﺮة 12.0 ﻣﻌﺎﳉﺔ اﳌﻠﻔﺎت File Processing ﺑﻨﻬﺎﻳﺔ ﻫﺬﻩ الوﺣﺪة: ﺳﺘﺘﻤﻜﻦ ﻣﻦ الﺘعﺎﻣﻞ ﻣﻊ الﺪﻓﻖ وﺗﺘعﺮف ﻋلى اﳌلﻔﺎت الﺘﺘﺎﺑعﻴﺔ. ﺳﺘﺘﻤﻜﻦ ﻣﻦ إنﺸﺎء ﻣلﻔﺎت ﺗﺘﺎﺑعﻴﺔ ،والﺘعﺎﻣﻞ ﻣعﻬﺎ. ﺳﺘﺘﻤﻜﻦ ﻣﻦ الوصول إﱃ الﺴﺠﻼت اﳌﺨﺘلﻔﺔ ﺗﺘﺎﺑعﻴﺎً. ﺳﺘﺘﻤﻜﻦ ﻣﻦ الوصول إﱃ الﺴﺠﻼت اﳌﺨﺘلﻔﺔ ﻋﺸواﺋﻴﺎً. 228
12.1ﻣﻘﺪﻣﺔ ﲣـﺰﻳﻦ الﺒﻴـﺎ ت ﰲ اﳌﺘﻐـﲑات أو اﳌﺼـﻔوﻓﺎت ﻫـو ﲣـﺰﻳﻦ ﻣﺆقـﺖ ،لـﺬلﻚ ﳓﺘـﺎج اﱃ وﺳـﻴلﺔ ﲣﺰﻳﻦ داﺋﻤﺔ .وﺗوﻓﺮ اﳌلﻔﺎت Filesﻫﺬﻩ الوﺳﻴلﺔ. ﳜﺰن اﳊﺎﺳوب اﳌلﻔﺎت ﰲ وﺳﺎﺋط الﺘﺨﺰﻳﻦ الﺜﺎنوﻳﺔ ﻣﺜﻞ اﻷقﺮاص. ﰲ ﻫﺬﻩ الوﺣﺪة ،ﺳﻨوﺿﺢ ﻛﻴﻔﻴﺔ إنﺸﺎء وﻣعﺎﳉﺔ اﳌلﻔﺎت ﻣﻦ ﺧﻼل ﺑﺮاﻣﺞ لﻐﺔ .C++ ﻋـﺎدة ﺗﺘﻜـون اﳌﻔـﺎت ﻣـﻦ ﳎﻤوﻋـﺔ ﻣـﻦ الﺴـﺠﻼت Recordsوالـﱵ ﺗﺘﻜـون ﺑـﺪورﻫﺎ ﻣـﻦ ﳎﻤوﻋﺔ ﻣﻦ اﳊﻘول .Fieldsﻳﺘﻜون ﻣلف للﻤوﻇﻔﲔ ﻣﺜﻼً ﻋلى ﳎﻤوﻋـﺔ ﻣـﻦ الﺴـﺠﻼت )ﺳـﺠﻞ لﻜﻞ ﻣوﻇف( ،وقﺪ ﳛﺘوي الﺴﺠﻞ ﻣﺜﻼً ﻋلى اﳊﻘول الﺘﺎلﻴﺔ: .1رقﻢ اﳌوﻇف. .2إﺳﻢ اﳌوﻇف. .3العﻨوان. .4اﳌﺮﺗﺐ. لﺘﺴﻬﻴﻞ الوصول اﱃ ﺳﺠﻞ ﻣﺎ ﰲ ﻣلف ،ﻳﺘﻢ اﺧﺘﻴﺎر ﺣﻘﻞ ﻣﻔﺘﺎﺣﻲ للﺴﺠﻞ Record . Keyوالﺬي ﳚﺐ أن ﻳﻜون ﻓﺮﻳﺪاً Uniqueﰲ اﳌلف. ﰲ ﻣلف اﳌوﻇﻔﲔ اﻋﻼﻩ ،ﳝﻜﻦ اﺧﺘﻴﺎر رقﻢ اﳌوﻇف ﻛﺤﻘﻞ ﻣﻔﺘﺎﺣﻲ للﻤلف. ﻫﻨﺎك ﻋﺪة ﻃـﺮق لﺘﻨﻈـﻴﻢ الﺴـﺠﻼت داﺧـﻞ اﳌلـف ،أﺷـﻬﺮ الﻄـﺮق اﳌﺴـﺘﺨﺪﻣﺔ ﻫـﻲ اﳌلﻔـﺎت الﺘﺘﺎﺑعﻴـﺔ Sequential Filesوالـﱵ ﻳـﺘﻢ ﻓﻴﻬـﺎ ﲣـﺰﻳﻦ الﺴـﺠﻼت ﺑﱰﺗﻴـﺐ ﺣﻘوﳍـﺎ اﳌﻔﺘﺎﺣﻴـﺔ، ﻓﻤﺜﻼً ﰲ ﻣلف اﳌوﻇﻔﲔ ،ﻳﻜون أول ﺳﺠﻞ ﻫو الﺴﺠﻞ الﺬي ﳛﻤﻞ أقﻞ رقﻢ ﻣوﻇف. اﳌلﻔﺎت والﺪﻓﻖ 12.2 Files and Stream ﺗعﺎﻣ ـﻞ C++اﳌلﻔــﺎتﻛﻔــﻴﺾ ﻣﺘﺘــﺎﺑﻊ ﻣــﻦ الﺜﻤﺎنﻴــﺎت .Bytesالﺸــﻜﻞ الﺘــﺎﱄ ﻳوﺿــﺢ 0123456789 ﻣلف ﻳﺘﻜون ﻣﻦ n Byte n-1 ……………… end 229
ﻋﻨﺪ ﻓﺘﺢ ﻣلف ﻳﺘﻢ إنﺸﺎءﻛﺎﺋﻦ ﻳﻘﱰن ﻣعﻪ الﺪﻓﻖ .لﻘﺪ رأﻳﻨﺎ ﻣﻦ قﺒـﻞ أرﺑعـﺔ ﻛﺎﺋﻨـﺎت ﻣﻨﺸـﺄة أﺗوﻣﺎﺗﻴﻜﻴﺎً ،وﻫﻲ cerr ، cin ،coutو .clog ﻳﺴـﺘﺨﺪم الﻜـﺎﺋﻦ cinﻹدﺧـﺎل ﺑﻴـﺎ ت ﻣـﻦ لوﺣـﺔ اﳌﻔـﺎﺗﻴﺢ ،والﻜـﺎﺋﻦ coutﻳﺴـﺘﺨﺪم ﻹﺧﺮاج ﺑﻴﺎ ت إﱃ الﺸﺎﺷﺔ ،والﻜﺎﺋﻨﺎن cerrو clogﻳﺴﺘﺨﺪﻣﺎن ﻹﺧﺮاج رﺳـﺎﺋﻞ اﻷﺧﻄـﺎء إﱃ الﺸﺎﺷﺔ. ﻋﻨــﺪ الﺘعﺎﻣــﻞ ﻣــﻊ اﳌلﻔــﺎت ،ﳚــﺐ ﺗﻀــﻤﲔ ﻣلﻔــﻲ الﱰوﻳﺴــﺔ iostream.hو fstream.hﺣﻴﺚ ﳛﺘـوي اﳌلـف fstream.hﻋلـى ﻓﺌـﺎت الـﺪﻓﻖ ) ifstreamوالـﱵ ﺗﺴـﺘﺨﺪم ﰲ إدﺧـﺎل ﺑﻴـﺎ ت إﱃ اﳌلﻔـﺎت( و ) ofstreamوالـﱵ ﺗﺴـﺘﺨﺪم ﻹﺧـﺮاج ﺑﻴـﺎت ﻣـﻦ اﳌﻔﺎت( ،و ) fstreamﻹدﺧﺎل وإﺧﺮاج ﺑﻴﺎ ت ﻣﻦ اﳌلﻔﺎت(. لﻔﺘﺢ ﻣلف ،ﳓﺘﺎج ﻹنﺸﺎء ﻛﺎﺋﻦ ﻳﺘﺒﻊ ﻹﺣﺪى ﻫﺬﻩ الﻔﺌﺎت. إنﺸﺎء ﻣلف ﺗﺘﺎﺑعﻲ 12.3 Creating a Sequential file ﻻ ﺗﺘﻄلـﺐ C++أي ﻫﻴﻜلﻴـﺔ ﻣعﻴﻨـﺔ للﻤلـف ،وﻋلﻴـﻪ ﻻ ﻳوﺟـﺪ ﻣﺼـﻄلﺢ ﺳـﺠﻼت ﰲ ﻣلﻔﺎت C++لﺬا ﳚﺐ ﻋلى اﳌﱪﻣﺞ ﲢﺪﻳﺪ الﻜﻴﻔﻴﺔ الﱵ ﻳﺘﻢ ﺎ ﺗﻨﻈﻴﻢ اﳌلف. الﱪ ﻣﺞ الﺘﺎﱄ ﻳوﺿﺢﻛﻴﻔﻴﺔ إنﺸﺎء ﻣلف ﺗﺘﺎﺑعﻲ: //Program 12-1 //Creating a sequential file >#include<iostream.h >#include<fstream.h >#include<stdlib.h ) (main { ;)ofstream outclientfile(“clients.dat”,ios::out {)if (!outclientfile ;cerr<<”File could not be opened”<<endl ;)exit (1 } ”cout<<”Enter the account, name, and balance. <<endl 230
<<”(Enter EOF to end input)”<<endl <<”? “; int account; char name[10]; //Continued float balance; while(cin>>account>>name>>balance){ outclientfile<<account<<” “<<name<<” “<<balance <<endl; cout<<”? “; } return 0; } :اﳋﺮج ﻣﻦ الﱪ ﻣﺞ Enter the account, name, and balance. (Enter EOF to end input) ? 100 Ahmed 24.98 ? 200 Ali 345.67 ? 300 Hassan 0.00 ? 400 Omer –42.16 ? 500 Abbas 224.62 ? ^Z ً ﺣﻴﺚ ﳝﻜﻦ اﺳﺘﺨﺪاﻣﻪ ﰲ نﻈﺎم ﺣﺴﺎ ت ﻣﺜﻼ،ًالﱪ ﻣﺞ الﺴﺎﺑﻖ ﻳﻨﺸﺊ ﻣلﻔﺎً ﺗﺘﺎﺑعﻴﺎ .لﻴﺴﺎﻋﺪ ﰲ إدارة ﺣﺴﺎ ت العﻤﻼء 231
لﻜﻞ ﻋﻤﻴﻞ ﻣﻦ العﻤﻼء ،ﻳﺘﺤﺼﻞ الﱪ ﻣﺞ ﻋلى رقﻢ ﺣﺴـﺎب العﻤﻴـﻞ accountوإﺳـﻢ العﻤﻴـﻞ nameورصـﻴﺪ العﻤﻴـﻞ .balanceالﺒﻴـﺎ ت الـﱵ ﻳﺘﺤﺼـﻞ ﻋلﻴﻬـﺎ الـﱪ ﻣﺞ لﻜـﻞ ﻋﻤﻴـﻞ ﲤﺜﻞ ﺳﺠﻞ ذلﻚ العﻤﻴﻞ. ﻳﺴـﺘﺨﺪم رقـﻢ ﺣﺴـﺎب العﻤﻴـﻞﻛﺤﻘـﻞ ﻣﻔﺘـﺎﺣﻲ ،وﻋلﻴـﻪ ﻳﻜـون اﳌلـف ﻣﺮﺗﺒـﺎً ﺑﱰﺗﻴـﺐ أرقـﺎم ﺣﺴﺎ ت العﻤﻼء. ﰎ ﻓـﺘﺢ اﳌلـف للﻜﺘﺎﺑـﺔ ﻓﻴـﻪ ،لـﺬلﻚ ﻳﻨﺸـﺊ الـﱪ ﻣﺞ ﻛـﺎﺋﻦ ﺧـﺮج ﺑـﻊ للﻔﺌـﺔ ofstream ﻳـ ــﺪﻋى ،outclientfileوﰎ ﲤﺮﻳـ ــﺮ وﺳـ ــﻴﻄﺘﲔ ﳌﺸــــﻴﺪ ذلــــﻚ الﻜــــﺎﺋﻦ وﳘــــﺎ إﺳـ ــﻢ اﳌلــــف ،Clients.datﻃﺮﻳﻘﺔ ﻓﺘﺢ اﳌلف )ios::out (File open mode ﻳﻘـوم الـﱪ ﻣﺞ ،ﺳـﺘﻘﺒﺎل الﺒﻴـﺎ ت اﳌﺪﺧلـﺔ وﺣﻔﻈﻬـﺎ ﰲ اﳌلـف ،إﱃ أن ﻳـﺘﻢ إدﺧـﺎل رﻣـﺰ ﺎﻳﺔ اﳌلف ).(<ctrl> Z ﺧﺮج الﱪ ﻣﺞ ﻳﻔﱰض أنﻪ ﰎ إدﺧﺎل ﺑﻴـﺎ ت ﲬﺴـﺔ ﻋﻤـﻼء ،ﰒ ﰎ إدﺧـﺎل رﻣـﺰ ﺎﻳـﺔ اﳌلـف .^Z نﻼﺣـﻆ أنﻨـﺎ قﻤﻨـﺎ ﺑﺘﻀـﻤﲔ ﻣلـف الﱰوﻳﺴـﺔ stdlib.hالـﺬي ﳛﺘـوي ﻋلـى ﺗعﺮﻳـف الﺪالـﺔ ،exitوالﱵ ﺗﻨﻬﻲ الﱪ ﻣﺞ ﰲ ﺣﺎلﺔ ﻋﺪم ﻓﺘﺢ اﳌلف ﺑﺼورة صﺤﻴﺤﺔ. قﺮاءة الﺒﻴﺎ ت ﻣﻦ ﻣلف ﺗﺘﺎﺑعﻲ 12.4 Reading Data from a Sequential file ﺳﻨﻘوم اﻵن ﺑﻜﺘﺎﺑﺔ ﺑﺮ ﻣﺞ ﻳﻘوم ﺑﻘﺮاءة اﳌلف الﺴﺎﺑﻖ ،وﻃﺒﺎﻋﺔ ﳏﺘو ﺗﻪ ﻋلى الﺸﺎﺷﺔ: Program 12-2: //Reading and printing a Sequential file >#include<iostream.h >#include<fstream.h >#include<iomanip.h >#include<stdlib.h ;)void outputline(int, char *, float ) (main { ;)ifstream inClientFile(“clients.dat”,ios::in 232
if (!inClientFile) { cerr << “File could not be opened” <<endl; exit(1); } int account; char name[10]; //Continued float balance; cout <<setiosflags(ios::left) <<setw(10) <<”Account” <<setw(13) <<”Name” <<”Balance”<<endl; while(inClientFile >> account >.name >>balance) outputline(account, name, balance); return 0; } void outputline(int acct, char *name, float bal) { cout << setiosflags(ios::left) << setw(10)<< acct << setw(13) << name<< setw(7) << setprecision(2) << setiosflags(ios::showpoint | ios::right) << bal << endl; } :اﳋﺮج ﻣﻦ الﱪ ﻣﺞ Account Name Balance 100 Ahmed 24.98 200 Ali 345.67 300 Hassan 0.00 400 Omer -42.16 500 Abbas 224.62 233
ﻳـﺘﻢ ﻓـﺘﺢ اﳌلﻔـﺎت لﻘـﺮاءة ﺑﻴـﺎ ت ﻣﻨﻬـﺎ نﺸـﺎء ﻛـﺎﺋﻦ ﻳﺘﺒـﻊ للﻔﺌـﺔ ifstreamوالـﺬي ﻳـﺘﻢ ﲤﺮﻳﺮ وﺳﻴﻄﺘﲔ لﻪ ﳘﺎ إﺳﻢ اﳌلف clients.datوﻃﺮﻳﻘﺔ ﻓـﺘﺢ اﳌلـف .File Open mode ﻓﺎﻹﻋﻼن: ;)ifstream inClientFile(“clients.dat”,ios::in ﻳﻨﺸﺊ ﻛﺎﺋﻦ ﺑﻊ للﻔﺌﺔ ifstreamﻳﺪﻋى ،inClientFileلﻴﻘوم ﺑﻔﺘﺢ اﳌلف clients.datللﻘﺮاءة ﻣﻨﻪ. الوصول العﺸواﺋﻲ ﶈﺘو ت ﻣلف ﺗﺘﺎﺑعﻲ 12.5 Random Access to a Sequential file ﳝلﻚﻛﻞ ﻛﺎﺋﻦ ﻣلف ،ﻣﺆﺷﺮﻳﻦ ﻣﻘﱰنﲔ ﺑﻪ ﻳﺴﻤﻴﺎن ﻣﺆﺷﺮ اﳊﺼول get pointer وﻣﺆﺷﺮ الوﺿﻊ ،put pointerوﻳﺴﻤﻴﺎن أﻳﻀﺎً ﻣﺆﺷﺮ اﳊﺼول اﳊﺎﱄ وﻣﺆﺷﺮ الوﺿﻊ اﳊﺎﱄ. ﰲ ﺑعﺾ اﻷﺣﻴﺎن ،قﺪ نﺮﻏﺐ ﰲ ﺑﺪء قﺮاءة اﳌلف ﻣﻦ ﺑﺪاﻳﺘﻪ وﻣﺘﺎﺑعﺘﻪ إﱃ ﺎﻳﺘﻪ ،وقﺪ ﺗﺮﻏﺐ ﻋﻨﺪ الﻜﺘﺎﺑﺔ الﺒﺪء ﻣﻦ الﺒﺪاﻳﺔ وﺣﺬف أي ﳏﺘو ت ﻣوﺟودة ،لﻜﻦ ﻫﻨﺎلﻚ أوقﺎت ﳓﺘﺎج ﻓﻴﻬﺎ إﱃ الﺘﺤﻜﻢ ﲟﺆﺷﺮات اﳌلﻔﺎت .لﻜﻲ نﺘﻤﻜﻦ ﻣﻦ الﻘﺮاءة أو الﻜﺘﺎﺑﺔ ﰲ ﻣواقﻊ ﻋﺸواﺋﻴﺔ ﻣﻦ اﳌلف. ﺗﺘﻴﺢ الﺪالﺘﺎن seekgو seekpﺿﺒط ﻣﺆﺷﺮي اﳊﺼول والوﺿﻊ ﻋلى الﺘواﱄ. ﳝﻜﻦ اﺳﺘﺨﺪام الﺪوال ) ( seekgو ) ( seekpﺑﻄﺮﻳﻘﺘﲔ -: /1ﻣﻊ وﺳﻴﻄﺔ واﺣﺪة ﻫﻲ ﻣوقﻊ الﺒﺎﻳﺖ اﳌﻄلﻖ ﰲ اﳌلف ) ﺑﺪاﻳﺔ اﳌلف ﻫﻲ الﺒﺎﻳﺖ .( 0 /2ﻣﻊ وﺳﻴﻄﺘﲔ اﻷوﱃ إزاﺣﺔ ﻣﻦ ﻣوقﻊ ﻣعﲔ ﰲ اﳌلف والﺜﺎنﻴﺔ اﳌوقﻊ الﺬي ﰎ قﻴﺎس اﻹزاﺣﺔ ﻣﻨﻪ. ﻫﻨﺎلﻚ ﺛﻼﺛﺔ اﺣﺘﻤﺎﻻت للوﺳﻴﻄﺔ الﺜﺎنﻴﺔ-: )أ( begوﻫى ﺑﺪاﻳﺔ اﳌلف. )ب( Curوﺗعﲎ اﳌوقﻊ اﳊﺎﱄ للﻤﺆﺷﺮ. )ت( Endوﺗعﲎ ﺎﻳﺔ اﳌلف. ﻓﻤﺜﻼً العﺒﺎرة -: ;)seekp( -10,ios:: end ﺳﺘﻀﻊ ﻣﺆﺷﺮ الوﺿﻊ 10ﻳﺘﺎت قﺒﻞ ﺎﻳﺔ اﳌلف. الﱪ ﻣﺞ الﺘﺎﱄ ﻳﺴﺘﺨﺪم الﺪالﺔ seekgﻣﻊ وﺳﻴﻄﺔ واﺣﺪة: 234
Program 12-3: #include<iostream.h> #include<fstream.h> #include<iomanip.h> #include<stdlib.h> void outputline(int, char *, float); main( ) { //Continued ifstream inClientFile(“clients.dat”, ios::in); if (!inClientFile){ cerr<< “File could not be opened” <<endl; exit(1); } cout <<”Enter request “<<endl <<” 1 – List accounts with zero balances” << endl <<” 2 – List accounts with credit balances”<<endl <<” 3 – List accounts with debit balances”<<endl <<” 4 – End of run” <<endl<<”?”; int request; //Continued cin>> request; while(request !=4) { int account; char name[10]; float balance; inClientFile >>account >>nam>>balance; switch (request) { case 1: cout <<endl <<”Account with zero balances:” <<endl; while(!inClientFile.eof()) { if (balance==0) outputline(account, name, balance); 235
inClientFile >>account >>name >>balance; } break; case 2: cout<<endl<<”Accounts with credit balance:” <<endl; while(!inClientFile.eof()) { if (balance <0) outputline(account, name, balance); //Continued inClientFile>>account >>name >>balance; } break; case 3: cout<<endl<<”Accounts with debit balances:” <<endl; while(!inClientFile.eof()) { if (balance > 0) outputline(account, name, balance); inClientFile >>account>>name>>balance; } break; } inClientFile.clear( ); //reset eof for next input inClientfile.seekg(0); //position to beginning of file cout<<endl <<”? “; cin>>request; } cout << “End of run.” <<endl; return 0; } 236
cout << setiosflags(ioa::left) << setw(10) << acct << setw(13) << name <<setw(7) <<setprecision(2) << setiosflags(ios::showpoint | ios::right) <<bal <<endl; } :اﳋﺮج ﻣﻦ الﱪ ﻣﺞ Enter request 1 – List accounts with zero balances 2 – List accounts with credit balances 3 – List accounts with debit balances 4 – End of run ?1 Accounts with zero balances: 300 Hassan 0.00 ?2 Accounts with credit balances: 400 Omer -42.16 ?3 Accounts with debit balances: 100 Ahmed 24.98 200 Ali 345.67 500 Abbas 224.62 ?4 237
End of run. 238
اﳌﻠخﺺ: اﳌلﻔﺎت ﻫﻲ وﺳﻴلﺔ داﺋﻤﺔ لﺘﺨﺰﻳﻦ الﺒﻴﺎ ت. ﺗﺘﻜون اﳌلﻔﺎت ﻋﺎدة ﻣﻦ ﳎﻤوﻋﺔ ﻣﻦ الﺴﺠﻼت. ﺗﺘﻜون الﺴﺠﻼت ﻣﻦ ﳎﻤوﻋﺔ ﻣﻦ اﳊﻘول. ﻳﻜون لﻜﻞ ﺳﺠﻞ ﺣﻘﻞ ﻣﻔﺘﺎﺣﻲ. ﰲ اﳌلﻔﺎت الﺘﺘﺎﺑعﻴﺔ ﻳﺘﻢ ﲣﺰﻳﻦ الﺴﺠﻼت ﺑﱰﺗﻴﺐ ﺣﻘوﳍﺎ اﳌﻔﺘﺎﺣﻴﺔ. ﻋﻨﺪ الﺘعﺎﻣﻞ ﻣﻊ اﳌلﻔﺎت ﳚﺐ ﺗﻀﻤﲔ اﳌلف .fstream.h ﻋﻨﺪ ﻓﺘﺢ ﻣلف للﻜﺘﺎﺑﺔ ﻓﻴﻪ ﳚﺐ إنﺸﺎء ﻛﺎﺋﻦ ﺑﻊ للﻔﺌﺔ .ofstream ﻳﺘﻢ ﻓﺘﺢ اﳌلﻔﺎت لﻘﺮاءة ﺑﻴﺎ ت ﻣﻨﻬﺎ نﺸﺎء ﻛﺎﺋﻦ ﻳﺘﺒﻊ الﻔﺌﺔ .ifstream ﻹﺳﱰﺟﺎع ﺑﻴﺎ ت ﻣﻦ ﻣلف ﺗﺘﻢ قﺮاءة اﳌلف ﻣﻦ ﺑﺪاﻳﺘﻪ وقﺮاءةﻛﻞ ﳏﺘو ت اﳌلف لﺘﺘﺎﺑﻊ ﺣﱴ نﺼﻞ إﱃ الﺒﻴﺎ ت اﳌﻄلوﺑﺔ. ﳝلﻚﻛﻞ ﻛﺎﺋﻦ ﻣلف ﻣﺆﺷﺮﻳﻦ ﻣﻘﱰنﲔ ﺑﻪ ﻳﺴﻤﻴﺎن ﻣﺆﺷﺮ اﳊﺼول get pointer وﻣﺆﺷﺮ الوﺿﻊ .Put pointer ﺗﻀﺒط الﺪالﺘﺎن ) ( seekgو ) ( seekpﻣﺆﺷﺮي اﳊﺼول والوﺿﻊ ﻋلى الﺘواﱄ. 239
اﻷﺳﺌﻠﺔ -1أنشﺊ ﻣﻠﻒ ﻟﻠﻤﻮﻇﻔﲔ ﻳﺪﻋﻰ Employeeﻋﻠﻰ أن ﳛﺘﻮيﻛﻞ ﺳﺠﻞ ﰲ اﳌﻠﻒ ﻋﻠﻰ اﳊﻘﻮل اﻟﺘﺎﻟﻴﺔ-: رﻗﻢ اﳌﻮﻇﻒ. إﺳﻢ اﳌﻮﻇﻒ. اﻟﻌﻨﻮان. ﰒ ﻗﻢ دﺧﺎل ﺑﻴﺎ ت ﲬﺴﺔ ﻣﻮﻇﻔﲔ. -2ﻛﺪ ﻣن إدﺧﺎل اﻟبﻴﺎ ت ﰲ اﻟﺴﺆال اﻟﺴﺎﺑﻖ ﺑصﻮرة ﺻﺤﻴﺤﺔ وذﻟك ﺑﻜﺘﺎﺑﺔ ﺑﺮ ﻣج ﻟﻘﺮاءة ﳏﺘﻮ ت اﳌﻠﻒ. -3ﻗﻢ ﺑﻜﺘﺎﺑﺔ ﺑﺮ ﻣج ﻳﻘﻮم ﺳﺘﻘبﺎل ﻣﻌﻠﻮﻣﺎت ﻋن ﻃﻼب ﻛﻠﻴﺔ وﻳﻀﻌﻬﺎ ﰲ ﻣﻠﻒ ﻳﺴﻤﻰ ،Studentsﲝﻴﺚ ﳛﺘﻮي ﻣﻠﻒ اﻟﻄﻼب ﻋﻠﻰ اﻵﰐ: رﻗﻢ اﻟﻄﺎﻟﺐ. إﺳﻢ اﻟﻄﺎﻟﺐ. ﲣصﺺ اﻟﻄﺎﻟﺐ. درﺟﺔ اﻟﻄﺎﻟﺐ. وﻣن ﰒ ﻗﻢ ﺑﻜﺘﺎﺑﺔ ﺑﺮ ﻣج ﻳﻘﻮم ﺑﻘﺮاءة ﻫﺬا اﳌﻠﻒ. 240
Search
Read the Text Version
- 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
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112
- 113
- 114
- 115
- 116
- 117
- 118
- 119
- 120
- 121
- 122
- 123
- 124
- 125
- 126
- 127
- 128
- 129
- 130
- 131
- 132
- 133
- 134
- 135
- 136
- 137
- 138
- 139
- 140
- 141
- 142
- 143
- 144
- 145
- 146
- 147
- 148
- 149
- 150
- 151
- 152
- 153
- 154
- 155
- 156
- 157
- 158
- 159
- 160
- 161
- 162
- 163
- 164
- 165
- 166
- 167
- 168
- 169
- 170
- 171
- 172
- 173
- 174
- 175
- 176
- 177
- 178
- 179
- 180
- 181
- 182
- 183
- 184
- 185
- 186
- 187
- 188
- 189
- 190
- 191
- 192
- 193
- 194
- 195
- 196
- 197
- 198
- 199
- 200
- 201
- 202
- 203
- 204
- 205
- 206
- 207
- 208
- 209
- 210
- 211
- 212
- 213
- 214
- 215
- 216
- 217
- 218
- 219
- 220
- 221
- 222
- 223
- 224
- 225
- 226
- 227
- 228
- 229
- 230
- 231
- 232
- 233
- 234
- 235
- 236
- 237
- 238
- 239
- 240