Important Announcement
PubHTML5 Scheduled Server Maintenance on (GMT) Sunday, June 26th, 2:00 am - 8:00 am.
PubHTML5 site will be inoperative during the times indicated!

C++

Published by Mahmoud Zain, 2021-05-16 08:14:53

Description: C++

Search

Read the Text Version

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‬أﻛﺘﺐ ﺑﺮ ﳎﺎً ﻟﺪﺧﻞ أﻋﺪاد ﺻﺤﻴﺤﺔ ﻟﻨظﺎم اﻟﻌشﺮي واﻟثﻤﺎﱐ واﻟﺴﺎدس ﻋشﺮ وﺧﺮج ﻫﺬﻩ اﻷﻋﺪاد‪ .‬اﺧﺘﱪ اﻟﱪ ﻣج‬ ‫ﻟبﻴﺎ ت اﻵﺗﻴﺔ‪:‬‬ ‫‪010 , 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‬‬


Like this book? You can publish your book online for free in a few minutes!
Create your own flipbook