 اسلام علیکم ، سلام ہمارے کیا ، لیکچر نمبر44 of our course CS201 Introduction to Programming ۔ اس کے راکھ گاہاک جو لیکنے میں کتنا پہنے میں ہمیشہ کر داتا ہوں کہ ہمیں کامل خوش سیدہ اور ہمیں کارے میکنے میں بہترہا جاتا ہوں۔ آپ کے راکھ کارے جاتا ہوں کہ ہمیں کارے لیکنے میں ہمیشہ کیا دیتے ہیں۔ ہمیشہ بھی کارے کارے کارے کارے کارے کیا دکتے ہیں۔ اج ہم اس کا کارے کارے دیکھیں گے۔ میٹرکس کلاس استعمال کرنے کی وجہ یہ تھی کہ most of the programming constructs جو ہم دسکس کرتے رہے ہیں وہ اس کے اندر exercise ہو جاتی ہے it is a good class to work with especially because we have a concept of constructors and destructors and dynamic memory allocation and we also have decisions and loops we will have some functions that return constants some functions that return references and so on so forth most of the things that we have discussed وہ یہاں پہ exercise ہو جاتی ہیں یہ سامپل کوڈ جو ہے وہ آپ کو handouts میں بھی مل چکا ہے اور آپ کے learning management system کے اوپر بھی پڑا ہوا ہے you can download it plug it straight into your compiler and test it out but as usual my recommendation is that you should not stop just there کہ یہ کوڈ اٹارہ دیکھا اور اس کو exercise کر لیا this class is not complete not by a long shot ابھی بہت ساری چیزیں جو اس میں add کی جا سکتی ہیں کچھ کے بارے میں شاہد میں آپ کو ہند بھی دوں اس لیکچر میں but you should try to enhance this class you should try to improve it or add to its functionality but as it stands it's pretty comprehensive one of the things that you might want to do with this class is to templatize it مطلب یہ ہے کہ جی ہم نے اس وقت اس کو لکھا ہوئے کہ اس کے elements جو ہے وہ of type double ہیں any real floating point numbers ہیں you might want to improve it or make a template out of this class so that it can handle integer elements or float elements the way I've written this class is also fairly straightforward it allows you to do this کیونکہ دول جو word ہے ہمارا qualifier وہ صرف اور صرف elements کیلئے استعمال ہوئے or double type of variables کیلئے استعمال ہوئے so in this whole code if you just do a search and replace آنکھیں بند کر کے or double کو int سے replace کرنے تو یہ integer matrix کیلئے کلاس بن جائے گی خیال رہے کہ integer سے واپس آنا زرا مشکل ہوگا because there are other integers involved in this entire code anyway let us start looking at the class itself پہلے تو ہم matrix کی data structure کی بات کرتے ہیں وہ data structure and keeping with the concept of data hiding and encapsulation ہم نے اس کو private section of the matrix class میں رکھا ہے تو آپ دیکھیں تو private section کے اندر ہم نے integer define کیے ہیں اس کی number of rows اور number of columns اس کے لیے variable named num rows اور num calls استعمال کیا ہے number of rows اور columns تو ہمیشہ whole numbers ہی ہوں گے you cannot have one and a half row so therefore these are integers these are fixed, these are defined so whenever you have an object of this class it will have a certain number of rows and certain number of columns or in variables میں ان کی values جو ہے وہ stored ہوں گی اس کے علاوہ the question is کہ جی اس کی matrix کی اپنے elements کی values کہاں پہ ہوں گی اس کے لیے دیکھیں ہم نے کچھ interesting کام کیا ہے ہم نے یہ next line جو declare کی ہے یہ ہے double star star elements what it says is elements is an array of pointers to double that's how you read the star star پہلہ ایک star جو ہے وہ array بن گئی دوسرہ جو ہے وہ pointer بن گیا what it means is کہ elements کو اگر لیا جائے تو یہ ایک two dimensional array of doubles کو point کر رہا ہے پھر elements of i اگر لیں گے یہ نہیں ایک index دیں گے تو یہ ایک row کو define کر رہا ہوگا یہ نہیں it's a pointer to an array of doubles and finally اگر ہم elements of i جے کریں then we are talking of one particular element which will be a variable of type double so be comfortable with this the thing that you would immediately notice is کیوں کہ matrix میں ہم نے two dimensional array کی بات کرنی ہے ہم نے یہاں پہ two dimensional array نہیں دکھائی that should warn you کہ جی ہم dynamic memory allocation کی طرف جا رہے ہیں اس کی وجہ یہ justifications simple ہے یہ تو ہم ایک general ایک class بنائی ہے of type matrix اس سے جو objects ہم create کریں گے یعنی instances of this class they could be a small matrix two by two it could be a big matrix twenty by twenty in other words the size of the matrix will be variable in fact there is no requirement that the size be a square it need not be a twenty by twenty matrix it could be a matrix of three by ten three rows ten columns so we have complete flexibility لیکن what I would like to point out here is just from the data structure perspective دو انٹیجرز ہم نے رکھیں ایک میں رکھیں گے اس کی rows کتنی ہے ایک میں رکھیں گے اس matrix کے column کتنے ہیں جو object create ہو رہا ہے اس کی بات ہو رہی ہے اور پھر elements جو ہے it will be dynamically allocated memory جس کی اندر actual double values لکھی جائیں گے جیسے ہی میں نے بات کی کہ جی یہ class اس میں dynamic memory allocation ہوگی تو آپ کو اپنے پچھلے lecture سے ذہب یاد ہوگا کہ اس class کے اوپر ہمارے لیے نا تین چیزیں نیسسری ہو گئی ہیں ایک یہ کہ جی اس کا constructor جو ہے وہ dynamic memory allocate کریں لیکن کیوں کہ ہم dynamic memory allocate کریں یعنی new operator استعمال کریں گے اس فارس سے اس class کے لیے destructor بھی Provide کرنا لازمی ہے ورنہ یہ ہوگا کہ وہ جو ہمارا free store تھا اس سے memory allocate ہوتی جائے گی جب بھی ہم ایک object create کریں گے لیکن وہ free نہیں ہوگی یعنی memory زایا ہو جائے گی so a destructor is necessary the other thing if you recall again with classes having dynamic memory allocation you would realize کہ جی ہمیں ایک assignment operator بھی چاہیے کیونکہ اگر ہم assignment operator یعنی equal to sign والا operator جو ہے وہ Provide نہیں کریں گے تو جو default ہے وہ member wise copy دے گا یعنی shallow copy ہوگی pointer کی value pointer کے اندر copy ہو جائے گی لیکن پورا data جو ہے وہ copy نہیں ہوگا so یہ ابھی بس خیال رکھیں اس چیز کا بعد میں جب ہم code میں پہنچیں گے پھر اس کو ہم detail میں دیکھیں گے کہ ہم نے یہ کیا کیسے ہے اب اگر دیکھیں کہ ہم نے اس کے public interface جو Provide کرنا ہے اصل ساری چیز وہاں پہ ہے private was the data وہاں نے define کر دیا very very simple 2 integers 1 array of pointers to double جو public interface ہے اس کے اندر پہلے تو آجاتے ہیں اس کے constructors ہم نے ایک default constructor اس کے لیے رکھا ہے وہ ایسا ہے کہ جو اس میں ہم number of rows or number of columns بتائیں گے اور ان کیا ہم نے default values بھی دال دی ہیں 0 so that if you just declare a matrix m it means it'll be an object of class matrix بر اس کی 0 rows or 0 columns ہوں گے اس میں memory بھی allocate نہیں ہوئی ہوگی object will be complete so we've given a default constructor then we have also given a copy constructor copy constructor یاد رہے یہ بھی اونی situations کے اندر important ہو جاتا ہے جب آپ کے پاس dynamic memory allocation ہو رہی ہو یعنی run time پہ ہم object کی لیے memory حاصل کریں free store پہ تو یہ ایک چاثی چیز ہے کہ constructor or destructor or assignment یہ جو ہے ان کے علاوہ copy constructor بھی provide کرنا پڑتا ہے copy constructor کا جو syntax ہے یا اس کی declaration line ہے وہ ہمیشہ ایک جیسی ہوتی ہے یعنی class کا نام which is the name of the constructor اور پھر اس کے arguments کے اندر ہم ایک reference دیتے ہیں to an object of the same class so the assignment rather the declaration line for the copy constructor looks like matrix and then within parentheses matrix and the ampersand sign representing a reference to a matrix یہ تو اس کا prototype ہے جب ہم اس کی definition میں آئیں گے پھر دیکھیں گے کیسے ہم کرتے ہیں constructors کے بعد ہم نے اس کا ایک destructor ڈیفائن کیا ہوا ہے اس کے بھی prototype line جو ہے وہ standard ہے کہ یہ till the matrix name so here it is till the matrix it takes no arguments it returns nothing یاد رہے constructors or destructors یہ return کچھ نہیں کرتے اس کے بعد ہمارے utility functions شروع ہو جاتے ہیں کہ جی ہم جو چیز چاہتے ہیں اس matrix کے ساتھ اس کی manipulation کے لیے اس کے لیے جو بھی ہم functions ڈیفائن کرتے ہیں so 2 چھوٹے چھوٹے ہم نے بتا دیے ہیں کہ جی اگر get rows کا ایک function ہم ڈیفائن کیا ہو تو وہ ہمیں بتا دے گا کہ جو ہماری matrix ہے اس میں rows کتنی ہیں اسی طرح a get calls کا function لکتیں گے وہ بتائے گا اس matrix میں columns کتنے ہیں یاد رہے ہم class لکھ رہے ہیں ہم اس کے استمال والا program نہیں لکھ رہے ہیں in other words we are not writing a client of the matrix class جب client کی باری آئے گی جب آپ اس کو استمال کرنے جائیں گے اس وقت پتہ چلے گا کہ جی ہمیں کچھ اور functions بھی چاہئے تھے so that is why I said that you should enhance this class to actually make it very very useful as it stand it does quite a few things but you may need to add more so I've just put down two little utility functions get rows and get calls it returns the integer which says کہ rows کتنے ہیں یا columns کتنے ہیں you might want to write a function which says کہ جی row مجھے فلانی row return کر دو as a vector or give me the nth column of a matrix so these things we have left for you to do get rows or get calls سے آگے چلیں تو پھر اس کے اوپر کچھ اور ہمارے now input output والے functions شروع ہو جاتے ہیں وہ important ہیں because we want کسی طریقے سے کوئی object کے اندر ہم input بھی دال سکیں so input کے لیے میں نے دو functions لکھیں ہیں دونوں کا نام input ہی ہے ایک جو ہے وہ keyboard سے input لے گا اور دوسرا function جو ہے input کا وہ کسی file میں اگر matrix لکھی ہو وہاں سے پڑے گا دونوں میں زرا سفرک ہے یہ بھی جب ہم code definition کی طرف پہنچیں گے وہاں پی آپ کو نظر آئے گا لیکن اس وقت آپ یہ دیکھتے چلیں کہ میں نے اس کو اور زیادہ جنرلائز کیا ہے جو input لے رہا ہے keyboard سے function اس کے دیکھیں تو اس کو argument بھی دے دیا ہے کہ جناب i stream کا argument ہے یاد رہے جو ہمارے c in ہے جو default input stream ہے جو keyboard کے ساتھ associate it ہے that is of class i stream ہم نے کہا کہ جی اس کو ایک argument ملے گا یاد رہے یہ member functions ہیں یہ call ان کو ایک matrix object کر رہا ہے so matrix object یہاں پر نظر نہیں آ رہا وہ تو this pointer سے پہنچے گا function کی اندر لیکن جو دوسرہ حصہ ہے وہ اس کو as an argument پیش کیا جا رہا ہے that is the i stream object اس کو ہم نے نام دے دیا ہے temporary name is اور ساتھ کہا دیا اس کی default value بھی ہے وہاں ہے c in so it is a nice way of handling default values کہ اگر آپ کہیں m.input اور پھر آگے empty parenthesis لکھتے ہیں تو یہ keyboard سے input لے گا کیونکہ default c in اس کو مل رہا ہے nonetheless we have defined a second input function یاد رہے یہ overloading ہو رہی ہے اب function overloading ہو رہی ہے the second input function takes if stream as a parameter اس کا argument وہ if stream ہے which means it is a file stream یہ اگر file میں کوئی matrix لکھی ہو کسی طریقے سے اس کو اگر ہم پرنا چاہیں تو یہ ہم دوسرا والا input function استعمال کریں گے اس میں کوئی default argument نہیں ہے انی دو input جو ہے ہمارے functions ان کے پیر اگر دیکھ لیں تو ہمار پس output function بھی ہونے چاہیں now again the names I have used are arbitrary مجھے لگا کہ جی input کے ساتھ output ہونا چاہے you might want to use print or display whatever suits you you might want to write in your own classes but for this class ہم نے output کا word استعمال کیا ہے so we have two output functions and with the same reasoning ایک output function وہ ہے جوکے screen پہ ہمیں دکھائے گا اس کے جو argument ہے وہ o stream type of argument ہے اور o stream os کے ساتھ ہم نے default value بھی دیدی ہے وہ ہے c out دوسرہ جو output function ہے وہ ہے جو اگر matrix کو ہم file میں لکھنا چاہیں تو وہ پھر o f stream والا argument لیتا ہے اور اس کے ساتھ کوئی default argument ہم نے نہیں Provide کیا you will have to provide a file handle if you want to call the second output function then we go on and we talk about the arithmetic manipulations that we might want to do with matrices so plus کو اگر لیلیں plus operator کو اس کے لیے ہم نے دو تین چار different functions وہ Provide کی ہے these are now member operators some are members some will become friends پہلا پلس تو ہے operation وہ ہے دو matrices کو اپس میں add کرنے کا in that case it's a member operator and it takes a matrix as an argument the second one is ایک matrix میں کوئی double add کرنے کا اب یاد رہے یہ matrix of type double ہم بنا رہے ہیں اس میں ہم double he add کریں گے اس کے اندر again it's a member operator when you write something like a plus d where a is a matrix and d is a double تو یہ operator call ہوگا اس میں again matrix you have a left-hand side اپنے آرہے ہیں so it's a member operator وہ تو call کرے گی or function کے اندر through this pointer پہن جائے گی on the other hand the double value ہم matrix میں add کرنا چاہ رہے ہیں that is presented as an argument there is another variety of adding a double to a matrix وہ ہے اگر ہم d plus a لکھ رہے ہیں here d وہ double variable ہے or a جو ہے that's an object of type matrix اب دیکھیں یہاں پے your left hand side والی چیز ہے وہ matrix نہیں ہے so what the function has to be it cannot be a member function because the driving force is not an object of our desired class if it is not a member function اس کو دو arguments ملیں گے پہلا argument وہ type double ہوگا دوسرہ argument وہ matrix ہوگی جس میں ہم چیز اس کے ساتھ جمع کرنا چاہ رہے ہیں because it's not a member function and we do want to manipulate the private data elements of this class it has to be a friend function it will be hard defined ہوگا and it will be defined at the file level in other words it's not a member function of the class matrix but it has to be declared here as a friend so it is declared as friend operator plus or پھر d or matrix اس کو pass کی جاری ہیں or اس کی return type ہی ہے return type will always be matrix کیونکہ matrix میں ہم نے define یہ کیا ہے جو پچھلے لیکچر میں بھی بات کی تھی or final a variant ہے جو میں نے for example بیچ میں دالا ہوئے to show you code reuse وہ ہے plus equal to operator یا نہیں دیکھیں ہم i plus equal to 3 لکھ لیتے ہیں اپنے programs کے اندر and what that means is i is equal to i plus 3 it would be nice if we could write a plus equals b where a and b are both matrices so that would be an interesting function to write or an interesting operator to have اور ہم دیکھیں گے کہ جی اس کی کتنی اسانی سے یہ لکھا جاتا ہے plus کے بعد یہی سارے کام ہم minus کے ساتھ کر سکتے ہیں جنی ہم اگر دو matrices ہیں a اور b تو ہم a minus b کرنا چاہیں گے left side پہ matrix ہے so it's a friend operator ایک argument اس کو ملے گا that will be of type matrix وہ right hand side پہ آئے گا so a minus b میں a call کر رہا ہے اس کو and b as an argument چاہرا ہے جو ہم نے plus کے ساتھ کیا اور doubles کے ساتھ کیا وہی ہم minus کے ساتھ کرنا چاہیں گے ہم چاہیں گے کہ ہم a minus d لکھ سکیں where d is a double a is a matrix so اس کے لیے ہمارا ایک member operator ہم define کریں گے minus کا یہ سارے overload ہو رہے ہیں because minus minus minus جو minus overloaded operator ہے وہ جو ہے اس میں double جو ہے وہ argument پیش کیا جائے گا return یہ سب matrix کر رہے ہیں they're returning a matrix then we might want to do d minus a where d is a double variable and a is a matrix again as I said earlier with the plus sign since the left hand side is a double the left hand side of the minus sign is a double what we need is a friend function now we cannot use a member function so we define a friend اس کا prototype یہاں لکھتے ہیں کہ جی friend return type matrix operator minus takes two arguments the first one is a double one is a matrix we go on now to multiplication multiplication کے بارے میں بھی میں نے پسلی دفعہ بات کی تھی کہ کیا کچھ ہم کرنا چاہیں گے پہلہ ایکشن جو ہے وہ ہے multiplication of two matrices a star b اور a اور b دونوں matrices ہیں کیونکہ a جو star کے left hand side پی آ رہے ہیں وہ matrix ہے لہذا یہ member operator ہے as a member operator a اس operator کی اندر this pointer کی طرف پہن جائے گی b جو ہے وہ as an argument پیش ہوگی return matrix ہونی چاہیے so we have a member operator returns a matrix takes one argument which is the matrix on the right hand side then you would want to do the same thing as we wanted to do with plus and minus in other words multiply a matrix with a double or multiply a double with a matrix in either case ہم چاہتے ہیں کہ جی matrix ہی return ہو so پہلہ جو ہے matrix with a double that is a member function and takes one argument which is of type double but the double multiplied by matrix d star a where d is a variable of type double a is a matrix وہاں پہ ہمیں friend function بنانا پڑے گا and again the return type will be matrix division کی لیے ہم نے ایک سمپل سی بات کی تھی کہ جی divide ہم matrix کو صرف double سے کریں گے so there is only one variation of that theme it is a slash d again a matrix divided by d which is a double variable اور اس کو define بھی ہم نے کیا تھا کہ ہر element کو d سے divide کر دو that is the definition of the divide sign and here again it will return a matrix which is the same size as the original multiplication is more interesting when we look at the code we will see what happens پھر ہم نے some stream insertion or extraction operators لکھے ہیں again ہم چاہیں گے کہ جیسے ہم نے input operation کیا تھا لیے ایک function لکھا تھا تو ہم double greater than sign بھی استعمال کر سکیں so we can do something like c in greater than greater than m where m is a matrix ہم نے stream extraction operator لکھا یہ جو ہے یہ last month friend function ہوگا کیونکہ اس کے left side پے stream object آ رہا ہوتا یا ice stream ہوگا یا o stream ہوگا depending on input or output but it will always be a friend and it will take two arguments the first argument is a stream object and the second argument is a matrix دو اور ہمارے functions ہیں which are important ones سب سے important تو رہا گیا بیچ میں وہ ہمارا ہے assignment so equal to which is the assignment function وہ بھی ہم نے define کیا ہے اور کیوںکہ اس کلاس میں میں نے جیسے پہلے ہاں کیا تھا dynamic memory allocation ہو رہے ہیں assignment is an important operator and we look at it in detail and the other one was another function that we required of a matrix that was the transpose function یعنی matrix کے rows اور columns کو interchanged کر کے ہمیں ایک اور matrix دی جائے اس وقت یہ ہم نے interface define کیا ہے as I said earlier it is not comprehensive there are still things that can be added to it few compound operators plus equals کیا minus equals کیا ہے you might want to do a star equal to you will not be doing a slash equal to because the divide is a very limited scope operator over here جو آپ کے پاس code ہے اس میں دیکھیں تو آپ کو نظر آرہا ہے کہ جی کبھی میں اس کو beginning میں لکھا ہے کبھی اس کو end کے اوپر لکھا ہوا ہے پھر کہیں پے return type matrix ہے کہیں پے matrix and ہے یعنی a reference to a matrix ہے یہ ساری چیزیں یہ سمجھنے والی ہیں یہ جیسے ہم code میں داخل ہوتے ہیں یہ ایک ایک کر کے میں دیسکس کرتا جاؤنگا let us start with our default constructor default constructor کے اندر دیکھیں ہم نے جہاں پہاں پہاں prototype declare کیا تھا class کے اندر وہاں پہاں ہم نے اس کو default values دی دی تھی row equal to zero or column equal to zero یعنی int equal to zero وہاں پہاں پہاں لکھا ہوا تھا جب ہم actual function لکھنے آتے ہیں اس وقت ہم default values کو repeat نہیں کرتے because then that there might be a conflict or a confusion اوپر zero لکھتی انیچے کچھ اور لکھتے ہیں ایک جگہ پہ default values دی جاتی ہیں now when we come into the constructor it is past two integers one representing the number of rows and one representing the number of columns of the matrix object that we want to create the first thing that we do is we assign these values to the num rows and num calls variables which are part of our data structure in the object so پہلی دو لائنے تو assign کریے کہ جیسی matrix کی اتنی rows ہوں گی اتنے columns ہوں گے یہ تو کام آسان ہو گیا next line پر زراکور کریں کہ وہ کیا کر رہی ہے یاد رہے ہم نے element اس کو declare کیا تھا as a double star star یعنی an array of pointers to double یہاں پہ elements کو درکلی اگر ہم allocate کرنے جائیں گے تو یا تو وہ double type کے ہم num rows time num calls elements وہ freestore سے حاصل کر لیں لیکن then we wouldn't have the double pointer so what we do is سب سے پہلے ہم elements جو ہے اس کو کہتے ہیں کہ جیسی an array of pointers to double اور اتنے ہمیں pointers چاہیں وہ ہم allocate کرتے ہیں so we use the new operator we use the double star cast یہاں جو بی چیز return ہوگی that will be of type pointer to double اور کتنے pointers چاہیں جتنی rows ہیں those matrix کے اندر so her row کے لیے a pointer ہو گیا that means now the row can be an array which is fine کیونکہ اس کے اندر ہم نے columns میں data ڈیٹا ڈالنا ہے اب elements جو ہے now that is a num rows number of pointers to double یہ جب ہمار پاس allocation ہو گئی اب ہم loop چلاتے ہیں ہم کہتے ہیں for i equal to zero i less than num rows i++ just to reiterate a very minor point دیکھیں c میں c++ میں ساری arrays جو ہے وہ zero سے شروع ہوتی ہیں اور upper limit minus one وہاں پہ ختم ہوتی ہیں that is the num rows part یہ جب loop چلی تو پہلی چیز کیا کرنی ہے اب ہر elements pointer elements of i اس کے لیے جگے allocate کی جائے free store سے کتنی جگے اب یہ جگے of type ڈبل ہوگی اور it will be of number of columns سو when we say new double num calls within square brackets it means give me an array of doubles اب دیکھیں pointer ختم ہو گیا اب array of doubles آگی which is fine because elements of i represents a pointer اور آپ کو یاد ہوگا pointers and arrays are synonymous اب ایک pointer وہ اس array کو point کر رہا ہے ہمار پاس جگے آگئی جگے آگئی تو ہم نے کہا چلیں اس matrix کو initialize بھی کرتے چلتے ہیں ہم نے کہا for int j equal to zero جی less than num calls جی plus plus اور کہا elements of i جی دونوں square brackets میں equals 0.0 let's review this again ہم نے پہلے تو num rows اور num calls کو values assign کر دیں پھر elements کو ہم نے کہا اتنے سارے pointers to doubles حاصل کرو free store سے اور elements کو دے دو پھر ہر pointer کے لیے ہم نے کہا اتنی جگے to store double variables وہ حاصل کرو اور that is pointed to by each element اور finally once we've gotten the space for doubles اس کو ہم نے initialize کرویا to zero and now we have a constructed matrix اس code کو اب دیکھیں کوئی exceptional values تا نہیں ہیں exceptional values میں سوچ سکتا ہوں کہ اگر میں negative rows اور negative columns اس کو pass کر دوں تو مسئلہ آجائے گا ہمیں یہ خ��로 نہیں سکنا چاہتا ہوں کہ آپ کی ہے کہ آپ بالکہ میں آپ کو سب کے بارکا لائن کچھ بہت سہن کہ نمے روز مجھے آپ کو عطا کر رہا ہوں اور نمے کالست مجھے فروگر اگر actually zero pass کیا جائے تو ہمیں کوئی problems نہیں ہو تھا because what we're saying is کوئی نمے روز زیادہ نمے کالست زیادہ ڈینی zero gives me zero pointers ورائی zero اور کچھ آگا سببیٹان پرگیات پیدا ہوتا ہے۔ جو جاننا ہوتا ہوں گے۔ اس قرآن ہے کہ یہ دانامک مرئیی الوکیشن ہے جو عحن ہوتا ہے۔ یہ جو ہے یہ ہے کابی کنسٹر۔ کابی کنسٹر کا استعمال کہاں پہ ہوتا ہے جب آپ اپنے پرگرم میں لکھتے ہیں میٹریکس ای اور پرانثیسیز میں بی جہاں ای اور بی دونوں میٹریسیز ہیں ای ہم بنانے جا رہے ہیں اور بی already exist کرتی ہے جب آپ لکھتے ہیں میٹریکس ای پرانثیسیز بی ہم کہتے ہیں give me a new object called a which should be identical to the object b which already exists so it's a copy constructor we are constructing an object as a copy of another object that already exists دوسر طریقہ جو ہوتا ہے اسی copy constructor کو استعمال کرنے کا اگر ہم اپنے code میں لکھیں یا main function کی بات ہوری ہے جو client ہوگا اس کلاس کا وہاں پہاں لکھتے ہیں میٹریکس a equal to b یاد رہے یہ کیونکہ declaration ہو رہی ہے this is not an assignment when we write matrix a equals b semicolon you are actually calling a copy constructor and saying b کی طرح کی ایک duplicate matrix ہمیں دے دو اور اس کا نام a ہونا چاہیے اس کے سامتے زرکہ پہن کو کشک کنت کو حیرت داشتے ہیں اور جب ہم کوئی پینا کتے ہیں کسی جانتے ہیں پہلی چیز کہ جو اس کو آگومنت دیا جا رہا ہے اس کو مثال ہے کیونکہ ہم چاتے ہیں کہ جو میٹریکس اس سے جس کی ہم کشک کتے ہیں اس کو کچھ نہ ہو تو وہ ہم کانست کردیتے ہیں اس کے ساتھ کانست میٹریکس اور ام کانست کو پاست مجھے جا رہا ہے کیونکھیں یہ ایک کام ہمی کا اس کا مطلب ہے اس وقت وہ exist نہیں کرتا so in fact life is quite easy all we need to do is repeat the code for the regular constructor except اس کی نیشلیزیشن کہاں سے ہو رہی ہے کہ num rows is equal to m.num rows اتنی rows جوکہ matrix اس کو ہم duplicate کریں اسی کی rows یہاں پہاں سائن کر دو جو ہے num calls equals m.num calls اس کے columns لے لیے اب اس کے لیے جگے allocate کرنی ہے exactly وہی تیکنیک جو ہم نے regular matrix والے constructor میں کی تھی اسے ہم نے جگے allocate کر لیے جہاں پہ ہم نے ordinary or default constructor کے اندر elements کو zero سے initialize کیا تھا یہاں پہ اس چیز میں ہم فرق کرتے ہیں ہم کہتے ہیں zero سے initialize مت کرو ان elements کو value دے دو m dots elements of i j یاد رہے جب بھی ہم کسی matrix کے element کی بات کر رہے ہیں دیتا ممبر کی بات کر رہے ہیں تو ہم m.operator استعمال کرتے ہیں نوٹس کریں لفت ہن side پہ ہم نے dot نہیں لکھا کیوں نہیں لکھا کیوںکہ ایک object جو ہے جو left hand side والا ہے but in this case of the constructor it is the object that is being constructed وہ تو اس function کو available ہے through this pointer so وہاں پہ کوئی dot variable نہیں آئے گا dot والا جو operator ہے وہ right hand side پہ جو ہم استعمال کر رہے ہیں یعنی جو argument میں matrix آئی ہے اس کے ساتھ ہم لگائیں گے so m dot num rows m dot num calls m dot elements of i j اس طرح سے استعمال ہوگا یہ ہمارا ایک copy constructor بن گیا اس نے کیا کیا ہے number of rows and columns وہ لیے ہیں جو کہ already matrix میں موجود تھے دوسی matrix میں جس کی ہم copy بنانا چاہر ہیں اس کے لیے جگہ allocate کیا جگہ allocate کرنے کے بعد element by element اس کے اندر copy کر دیا ہے the other thing you might want to note from a programming perspective this is an example of a nested loop both in the regular constructor as well as in this copy constructor the next part is our destructor relatively simple and remember it is necessary کیونکہ ہم نے new استعمال کیا ہے constructor کے اندر جب بھی ہم matrix type object create کرنے جا رہے ہیں ہم free store سے memory حاصل کر رہے ہیں destructor میں ہمیں وہ memory واپس کرنی ہے واپس کرنی ہے بہت آسان delete empty square brackets elements یاد رہے elements وہ were able تھا جس کے اندر ہم نے memory allocate کرکے رکھی ہوئی تھی the square brackets simply indicate it's an array the compiler automatically takes care of it کی ایرے کتنی بڑی تھی اتنی memory واپس free store پر دال دی جاتی ہے the destructor is extremely simple one line but it is necessary in this case please remember that اس کے بعد ہم چلتے ہیں تھوڑے سے اب اس کے utility functions کی طرف get rows get calls they are relatively trivial they are member functions they do not change anything in the object itself they only read the object so یہ functions کو ہم نے const کر دیا ہے so دیکھیں function کی end کے اوپر ہم نے const لکھا ہوا ہے it means it does not change the object that is calling this return کیا کر رہا ہے it's returning an int which is the number of rows so int get rows no arguments because it's a member function matrix کو call کر رہی ہے and it's a const one line body it says return num rows ختم اس کا استعمال جو ہوگا وہ ہوگا i is equal to a.get rows اس طرح سے استعمال ہوگا same thing applies to the get calls it returns an integer it is of type const because it does not change anything in the object that is calling it and it returns num calls so very simple now let's go on to the slightly more complicated ones یہ کمپلکیٹر جس کو میں کہہ رہا ہوں function actually complicated نہیں ہے it is the output to the screen function اس کے اندرسرف میں نے وہ ترک استعمال کی ہے کہ جب screen پہ ہماری matrix نظر آئے تو خوبصورت سے حاشی ایک اندر نظر آئے جیسے ہم کتابوں میں دیکھتے ہیں matrix لکھی ہوئی کہ you have like big square brackets اور اس کے اندر elements لکھے ہوتے ہیں so اس کے لیے ہم نے وہ special characters استعمال کی ہے جو کہ dos window میں یعنی ہماری command window ہے وہاں پر اگر آپ matrix کو دیکھیں گے تو وہ نیٹلی formatted نظر آئے گی یاد رہے میں نے آپ کو یہ کہا تھا یہ exercise کریں eski table print کریں اور eski table میں 128 value سے آگے جو values ہیں you will notice there are special graphic symbols وہاں گر ڈیبل آپ نے print کیا ہو کبھی تو آپ دیکھیں گے اس code کے اندر میں نے ان ڈیبل کی values استعمال کی ہوئی ہیں اور اس کو to print it as a symbol میں نے force کیا ہے کہ output stream کو یہاں پہ چار کے طور پہ اس کو print کرو اگر میں چار نہ لکھتا تو وہاں پہ وہ شہد 218 ایک number لکھتا it would have written an integer ایک character whose value whose eski value happens to be 218 or something like that then it prints the graphic symbol for that character so we make a reference to the eski table which is what i have done as well اور وہاں سے میں نے دیکھا کہ جنا یہ میں نے left corner بنانا ہے اس character کا code کیا ہے وہاں پہ نظر آیا 218 میں نے یہاں پہ دال دیا کہ os which is my output stream default will be c out less than less than 4 which is forcing it to print as a character 218 value دی دی so it prints the character whose eski value is 218 corner print ہو جاتا ہے اب کونے کے بعد مجھے جگہ چاہیے کتی جگہ چاہیے جس میں column elements print ہو جائیں گے اور پھر میں دوسرا corner بنانا چاہتا ہوں لیکن پہلی لین پہ میں کچھ print کرنا نہیں چاہتا ایک کچھ لیکن نے جو اس کے لوک کیا ہے کہ i equal to 0 i less than number of columns i plus plus c out یعنی os ہم استعمال کر رہے ہیں as a short hand یا یہاں پہ جو argument pass ہوا تھا تو os کو ہم نے کہا کہ جی set width کر دو 10 characters کی so everything is printed in a width of 10 you can change this you can go to whatever you want کیونکہ دبل ہم پرنت کر رہے ہیں میں نے کہا کہ 10 characters کم کم print ہونا چاہیے اور پھر اس کو print کیا کیا اس 10 character کی width کے اندر کچھ نہیں so it will always print nothing which means blank in a space of 10 characters and repeat that for the number of columns in the matrix جب وہ ختم ہوا تو میں نے دوسرا جو corner تھا اس کا character یہاں پرنت کر دیا یہ تو ہو گئی پہلی لین اس کے بعد جو لینے ہیں جس میں actual matrix کی values آنی ہیں ان کو ہم شروع کرنا چاہتے ہیں with a vertical line پھر نمبر نمبر نمبر نمبر جب تا کولمز والے elements پورے نہیں ہو جاتے اور پھر ایک vertical line so that our matrix starts looking well enclosed inside those square brackets same thing applies I've gone to the asky table picked up the code for the vertical bar for each row I've printed the vertical bar once then I've printed the number values which is the number of columns کے حصاب سے وہ values ہوتی ہیں وہ ایک loop شلائی ان کو پرنت کیا اور پھر end والہ vertical bar پرنت کر دیا اس کوٹ کے beginning پر آپ دیکھیں تو میں نے دو اور utilities استعمال کیا ہے تاکہ زرا formatting ہماری اچھی ہو جائے یاد رہے یہ ہم نے double matrix بنا رہے تھے so every element is of type double double کے لیے میں نے ایک تو call کیا ہے set fixed یعنی IOS colon fixed جو ہے اس کو specify کر دیا ہے which means it's going to be a fixed point display سائنٹیفک نہیں ہوگا decimal number ہمیشہ decimal point کے ساتھ دکھائے جائے گا اس کے بعد set precision بھی ہم نے کر دی اور اس کی number of places ہم نے 2 کر دی so we have a format جو کے ہمیشہ ہمارے جو دبل elements ہیں اس کو decimal point with 2 decimal places پرنت کرے گا اب اگر آپ دیکھیں کہ ہم جو پرنت کرتے ہیں اس کو set width 10 کے ساتھ کرتے ہیں تو 10 جگوں کے اندر آخیر والی تین جگے جو ہے وہ point xx جہاں پہ اس کے refraction کی value ہے اس طرح سے print ہوں گی otherwise the code is simple enough again it's a case of nested loops we've done enough examples on matrices to realize whenever you want to process rows and columns you will have to use nested loops that is what we are doing over here جب یہ ساری rows پرنت ہو جاتی ہیں تو پھر ہم نے جو شروع میں کیا تھا اسی کا inverse function جہاں پہ کریں گے ہم نیچے والے کو نے draw کریں گے وہ بھی asky table سے لے کے ہم نے draw کر گئے صرف چھوٹے سے point سے formating کے لیے ہم نے output stream کا setf function call کیا تھا beginning میں وہ آپ کے پاس code میں ہے اور ایک ہم نے کہا دیا کہ جناب show point اور دوسرا fixed notation ہوگی اور decimal point دکھایا جائے گا let's go on and look at the ordinary output to file function تھوڑا سمحہ آپ کے تھوڑا اسی justification دیتا چلو screen پہ جب ہم output کریں تو ہم نے چاہا کہ جناب لائنوں کے ساتھ اچھی طرح formated matrix آئے دوسرہ جو ہے یہ code لکھتے میں مجھے شاہا لا ہے کہ جی میں بھی ایک matrix ہو جو کہ میں file میں سیف کرنا چاہوں file میں جب سیف کرنے لگوں گا matrix کو تو پھر مجھے یہ لائنے وگیرا نہیں چاہیں مجھے صرف اس کی values چاہیں تاکہ میں file سے matrix پڑھ بھی سکوں فرمیہ جانتے ہیں تاکہ میں ایک خلال معلومات جانتے ہیں کہ ہم اس کے مجھے حقیط لگا ہم ایک خلال معلومات کتی ہے کہ یہ اگر file میں ایک matrix پڑی ہوئی ہے تو اس کو پڑھا کیسے جائے گا میں نے اپنے program کے اندر ایک matrix ڈکلیر کی 2 rows 2 columns اور پھر some were along the line میں نے جاکے کہا پاکے کہا یہ میٹریکس ایم جو ہے اس کو فائل سے پڑھکے پوپلیٹ کر دو دو I know کہ فائل کے اندر 2 x 2 میٹریکس پڑی ہوئی ہے ہاں دو I know that maybe it's a 5 x 5 maybe it's a 7 x 3 میٹریکس سو what we need to do is somehow in the file save the number of rows and columns as well سو the output function that puts out to the file must put out the number of rows and the number of columns and then all of the elements of the matrix سو اس کا کوڈ دیکھیں تو اس میں یہ چینج آئی ہے کوڈ چھوٹا ہو گیا ہے کیونکہ اس کے اندر ہم graphic elements استعمال نہیں کر رہے but what we do is first of all we say یہ جو میٹریکس آنے لگی ہے اس فائل کے اندر اس میں اتنی rows ہیں اور اتنی columns ہیں اور پھر اس کے بعد اتنے rows اور columns کے لیے ہم نے اس کی data values لکھنی ہیں لکھی پھر بھی تھوڑسی formatted طریقے سے ہیں تو آپ کو پہلے پر صورتی جو آپ کا اتنے لگی اور اتنے لگی ہے اور یہ میٹریکس ہے but you will notice there's an extra line on top which says number of rows number of columns اسے آپ چلتے ہیں آگے which is the input functions ۔ انپوٹ فنچنز کی بھی exactly output functions کی ترہ دو ورائیتیس ہیں ایک input function ہے جو کیبورٹ سے انپوٹ لے گا اور دوسرا input function میں لے گا ہے جو کہ file سے matrix کو پڑے گا جو کیبورٹ سے انپوٹ لے گا function وہ کیونکہ human beings operate کر رہے ہوں گے اس واستے اس کے اندر ہم نے تمیز دکھائی ہے we have been polite in that function what we've done is you said look you're going to input a matrix of size so many rows by so many columns so it will show that and then it will ask کجی ہر row کے لیے اتنی values input کرو اور ان کے درمیان میں spaces چھوڑ دو spaces جہیں remember they are the limiters as far as see in is concerned so keyboard input کے لیے spaces are the same as pressing enter so you can actually put اگر چار روز چار values چاہیں آپ کو ایک row کے اندر تو number space number space number space number enter چار values انٹر ہو سکتی ہیں اندر جو ہے وہ چھوٹی سی وہی loop چل رہی ہے جو see in یا ہماری input stream کو process کر رہی ہے اور her value کو پڑکے وہ elements of ای کمہ جے کے اندر یا ای جے کے اندر سٹور کر رہی ہے so the only difference between this function and the input from file function is number one it has prompts to the user it is polite and it reads spaces چھوڑ کے ایک لین سے وہ values اٹھا لیتی ہے جب ہم اس کا next version دیکھتے ہیں which is input from a file اس کے اندر یاد رہے نے کہا تھا کہ جی ہم نے number of rows اور columns بھی file میں output کر دیے ہیں اس کا code زرہ سا interesting ہے let us look at that in more detail یہ جو input ہے from file اس کے اندر ہم نے سب سے پہلے یہ کیا کہ جی file میں سے number of rows or number of columns پڑے کیونکہ یاد رہے ہمارے output function نے وہ لکھے تھے file کے اندر so we can get the number of rows and columns اس کے بعد ہم نے ایک تھوڑی سی intelligence بیچ میں ڈالی جناب اگر number of rows is greater than zero and number of columns is greater than zero پھر کچھ کرو otherwise there is nothing to do جب وہ ہمیں zero سے زیادہ مل گئے تو ہم نے کہا جی ایک temporary matrix بناؤ so we made a matrix temp جس کے اندر ہم نے numb rows or norm calls دے دیے جو values ہم نے file سے پڑی ہیں وہ values دییں so what we've got is we've got a temporary matrix of the correct size and that by our default constructor is already initialized to zero now we can do two things we can either read the matrix and then return the value or we can first assign it to the matrix that was calling this function so we were saying something like m dot input ہم نے یہ کیا ہے کہ جی پہلے assign کر دیا ہے so notice the interesting line which says star this equals temp now temp is my temporary matrix جو اس function کے اندر بنی ہے لیکن star this is whatever this points to یاد رہے یہ member function ہے so this pointer جو ہے اس کے it points to the matrix that was calling this function so all we've said is جو matrix اس کو call کر رہی تھی اس کو temp assign کر دو یہ equal to sign چلے گا کنسا چلے گا ہمارے assignment operator والا جو ابھی ہم دوری در میں دیسکس کریں گے وہ یہاں پہ استعمال ہوگا وہ جب ہم اس کو اس کے ساتھ ملا کے ہمیں دیکھنا پڑے گا کہ assignment operator automatically یہ کرتا ہے کہ suppose ہماری جو this pointer کے ساتھ matrix آئی ہے وہ 2 rows by 2 columns کی ہے اور temp جو ہے وہ 5 row اور 7 column کی ہے so assignment operator پہلے ہماری جو calling matrix ہے اس کے dimension تھیک کرے گا اس کو بھی 5 rows or 7 columns کر کے پھر اس کو assign کرے گا values سو ہم نے temp کی values اور assign کر دی which for the moment is 0 and now we can read the values in from the file exactly the same nested loop the other way may be even easier اس کے جی پہلے temp declare کرو پھر file سے پڑھلو اور اخیر میں کہ دو star this equals temp and that is the end of the function notice temp matrix جو ہے وہ اس function کی اندر create ہوئی جب یہ function exit کرے گا وہ destroy ہو جائے گی so the equal to جو اپریٹر ہم نے استعمال کی assignment that is important وہ this کو assign کر دے اس کی ساری values کوپی ہو جائیں گی it's a deep copy اس کے بعد questionی آتا ہے کہ جس نے return کیا کرنا ہے آپ اس کی return type دیکھیں تو ہم نے کہا ہے it returns a reference to a matrix ہم نے اس کے ساتھ const بھی لگا ہے it returns a reference to a constant matrix انی وہ change نہیں ہو سکتی لہذا اس کی جو ending line ہے وہ ہے return star this which is return whatever this points do and it is returned as a reference اس کے اوپر میں تھوڑی سی detail میں آپ سے بات کرنا چاہوں گا لیکن وہ assignment operator کے ساتھ جاکے بات کریں گے کہ یہ const کیوں لگایا ہے اور reference جب return کر رہے ہیں کب توہر سا rule of thumb کہ جب بھی ہم this pointer کو return کر رہے ہیں تو you can return it as a reference because وہ ہی object ہے جو اس کو call کر رہا ہے when you are returning a matrix which is not a reference then it is a call or return by value پوری matrix ٹیک پہ کوپی ہوگی اور واپس جائے گی which is slightly wasteful but you cannot return a reference to a temporary object ینی اس کوڑ کے اندر میں return تمپ نہیں کر سکتا you return اگر reference میں نے return کرنا ہے تمپ کیوں کہ یہاں پہ دستروی ہو جائے گی اس کا reference واپس جالا جائے گا and will be pointing to nothing so you have to be careful whenever you are returning a reference جب بھی return star this ہو رہا ہے تو reference جو ہے that is safe to return کانس جو لگائے ہے اس کی بات میں تھوڑی بات میں کروں گا let's move on to the next function and that is the transpose function یاد رہے میں نے define کیا تھا کہ جی matrix کا transpose جو ہے that is when we want to interchange the rows and the columns اس کے اندر دو alternative requirements آ جاتی ہیں ایک case وہ ہے جہاں پہ ہمار پر square matrix ہے یعنی number of rows is the same as the number of columns in which case we can do it in place یعنی without requiring any extra storage ہم matrix کو transpose کر سکتے ہیں اور دوسرہ جو ہے وہ طریقہ ہے کہ جی اس کے number of rows and columns ایکوال نہیں ہے تو اس کی شکل ہی بدل جائے گی یعنی وہ پہلے ادھر کو لمبی تھی matrix اور transpose کے بعد ادھر کو لمبی ہو جائے گی so we have to have two cases we can actually use the general case for both purposes but you will notice that it is slightly inefficient let's look at the code in the first case that is the case for a square matrix ہم نے پہلے ہی چیک کر لیا کہ جی if num rows equals num calls پھر square matrix کا case ہے اب یہ کوٹ جہاں یہ وہی ہے جو پہلے آپ کو exercise میں بھی میں نے دیا تھا کہ جی ہم نے rows and columns کی values interchange کرنی ہے ایک matrix کے اندر رہتے ہوئے اس کے لیے ہمیں ایک temporary variable چاہیے in this case it is a variable of type ڈبل جوکہ ہم ڈبل matrix کی ساتھ بات کر رہیں so اس کے اندر ایک قسم کا swapping of elements ہو رہا ہے لیکن trick جو ہے غور سے دیکھیں کہ loop کیس چیز پہ چل رہی ہے ہم نے بہر والی loop چل آئی ہے for i equal to zero i less than num rows i plus plus لیکن اندر والی loop جو ہے وہ شروع ہوتی ہے for j equal to i plus one j less than num calls j plus plus اور پھر اس کے بعد standard swap ہے x x equals y y equals ڈیمپ اس طرح والا کیوں ہم نے یہ loops کا indexing رکھی ہے کیوں کہ آپ تھوڑا سا غور کریں تو ہم نے کیا کیا ہے کہ matrix کا ایک triangle یعنی اس کو درمیان میں سے youn کاتا ہے اور ایک triangle کو process کیا ہے اس رو میں اس row number کے column سے آگے والے columns کو process کرو پھر next row کیوں کہ بڑھ گئی ہے تو اس کا in a way ہم نے column b next شروع کیا ہے اور پھر youn process کر رہے ہیں ایک triangle کو process کر رہے ہیں triangle کی جو processing ہے اس کی وجہ سے ایک کام efficient لی ہو جاتا ہے اگر آپ آنکھیں بند کر کے inner loop کو بھی zero سے شروع کر دے تھے تو اگر آپ logical ease کو work out کریں گے ہوگا یہ کہ پہلے آپ نے ایک number کو دوسر کے ساتھ interchange کیا اور پھر آگے چلتے چلتے اس number کو پہلے والے کے ساتھ واپس interchange کر دیا you will notice کیا آپ کی matrix کو کچھ بھی نہیں ہوا so you have to be careful with that this is the case of the square matrix when we have the case of the non square matrix that is the else part of this code اس کے اندر what you need to do is to define a new matrix except اس کی روز کتنی ہے calling matrix کے columns جتنی اور اس کے columns کتنے ہے calling matrix کی روز جتنی so we have defined a new matrix temp with the number of rows and columns interchange اس کے بعد اس کا code جو ہے وہ زیادہ آسان ہے it is a straight element to element copy فرق کیا ہے کہ اگر آپ گور سے دیکھیں کہ جی loop جو چل رہی ہے وہ اب فلانے row فلانے column سے جو element ہے ہماری calling matrix کا اس کو دال رہی ہے فلانے column فلانے row کے اندر so it's an interchange of rows and columns which was the definition of the transpose جب تمپ کے اندر ساری values copy ہو جاتی ہے we do our little magic which is star this equals تمپ which means whatever this point points to is now assigned the value of the matrix تمپ ساری چیز ادھر copy ہو گئی which means آپ کی horizontal value matrix ویرٹکل بن گئی یا ویرٹکل ویرٹکل بن گئی whichever the case may be and we return this this is the basic essence of the transpose code now what happens is that we go we want you to discuss the assignment operator which is very important and is very interesting because this is a case of dynamic memory allocation in this class لیکن آج کی لیکچر کا time ختم ہو رہا ہے so what we will do is we will continue the discussion of this code in the next lecture next lecture میں we will look at the assignment statement we will look at the stream insertion and extraction operators and we will also then try اگر time ہوا to recap کی جی پورے کوس میں ہم کدھر سے آئی اور کدھر کو گئی so till the next time اللہ حافظ