 اسلام علیکم Welcome to CS201 Introduction to Programming Today is lecture number 43 We concluded our discussion last time of template classes And I promised you that now we will take an comprehensive example and conclude the course The example that we have chosen for you is to implement the matrix class Why? Let's talk about that a little bit دیکھیں اب ہم نے اتنا کچھ سیکھ لیا ہے کہ ہم اپنی سمجھ لیں کوڑ لیبرریز تیار کر سکتے ہیں لیبرری کے اندر one of the important libraries is a math library پھر math library کیونکہ mathematics بہت لمبی چوڑی فیلڈ ہے اس کے اندر ہم کیا کچھ کر سکتے ہیں ہم چاہیں تو complex numbers کو implement کر لیں ہم چاہیں تو matrix کو implement کر لیں ہم چاہیں تو quadratic equations اور ان کے solutions کو implement کر لیں اس مطلب بھی it's a good problem domain to work with Matrix میں نے اس فاستے چوز کی کہ اس کے اندر بہت سارے جو programming concepts ہیں لنگوچ نہیں programming concepts ان کو ہم یہاں پے as an example ڈیٹ کر سکتے ہیں ان کو استعمال آ سکتا ہے اب جو ہم کرنا چاہ رہے ہیں وہ یہ کہ ایک problem پکڑا اور اس کو analyze کیا پھر اس کے design کے تھوے گزرے اور پھر اس کی implementation کے تھوے جائیں گے آج کا lecture شاید آپ کو لگے کہ جی ہم math پڑھ رہے ہیں math نہیں پڑھ رہے ہم ایک اسم کی problem definition کرنے لگے ہیں code examples اگر آج time ہوا تو آج ان کو شروع کریں گے ورنہ following lecture کے اندر ہم اس کی coding کی بات کریں گے so let us look at our basic design recipe آپ کا یاد ہوگا اس کے اندر ہم نے analyze بھی کرنا ہے problem domain کو پھر analyze کرنے کے بعد ہم نے کوششہ کرنے ہیں کسی طریقے سے examples کے through اس کو بالکل up clearly state کر سکیں problem کو اور کوئی examples اگر دے سکتے ہیں practical examples وہ بھی دے دیں اس کے بعد ہم چاہیں گے کہ جی اس کو analyze کرنے کے بعد ہم اس کا کچھ code لکھیں پھر اس کو test کریں analyze کریں further کہ جی یہ code بھی کام کرتا ہے کہ نہیں کرتا اور پھر اگر اس میں کوئی غلطی یا کوئی shortcoming رہ گئی ہے تو ہم اس کو اپنہ revise کریں code کو اور structure complete کریں ساتھ ساتھ جو beginning میں بہت سیادہ کہتا تھا بیچ میں کچھ ارسا ہوگیا کہیں remember you have to pay attention to detail so we will try to do that the other thing that I would like to mention over here is کہ جی ہم example کے through تو چلیں گے ایک خاص version of a matrix لے کے لیکن یہ جو ابھی ہم نے templates کی باتیں کی ہیں templates بھی آئیں گی یہ میں پہلے ہی آپ کو بتا دوں کیونکہ matrix جو ہے وہ ایک basic a mathematical structure ہے لیکن matrix کے اندر جو ہے وہ integers بھی ہو سکتے ہیں and doubles بھی ہو سکتے ہیں and floats بھی ہو سکتے ہیں so ہم چاہیں گے کہ a template class بنے so let us start by looking at the matrix and what it is and what is the problem domain that we are working with لیکن matrix جو ہے that is nothing but a two-dimensional array of numbers ہم نمالی اس کو rows and columns کے اندر لکھتے ہیں یہ ایک ساتھا دیکھ لیں کہ اگر ایک matrix ہے اور اس کے اندر یہ numbers ہم نے لکھے گے 1,2,3,4,5,6,7,8,9,10,11,12 it is simply a matrix which has 3 rows and 4 columns کسی بھی element کی بات کرنی ہو تو ہمیں بتانا پڑتا ہے کنسی row اور کنسا column اس کے اندر سیکٹشن ہے وہاں پہ جو element پڑا بے اس کی value کی بات کرتے ہیں اتھای بھائیز we treat the whole matrix as one block matrices بزاتِ خود جو ہیں they are important because they are used in many many different problems جو ہم problems real world سے اخس کرتے ہیں اور ان کو solve کرنے جاتے ہیں وہاں پہ یہ matrices استعمال ہوتی ہیں there is nothing very very complicated about them but I will lead you through the basic steps that we need to perform with the matrix so that you understand the concept a little bit کیونکہ یہ 2 dimensional ڈیمینشن ہے آپ بار بار سنیں گے row and column row and column کی بات ہو رہی اور اس کے لیے for the moment ہم i اور j استعمال کریں گے so you should think of i and j as two integers i representing the row number and j representing the column number of a matrix ابھی c or c++ کی بات نہیں ہو رہی تو ہم 0 to n minus 1 وگیرا کی بات نہیں کر رہے ہم روز کہیں گے پہلی row دوسری row تیسی row and so on and so forth matrix is کے ساتھ کیا کیا جا سکتا ہے دیکھیں اگر آپ کے پاس دو matrices ہوں ان کو اپس میں آپ جمع کر سکتے ہیں اگر آپ کے پاس ایک matrix ہو اس کو آپ multiply کر سکتے ہیں کسی ordinary number کے ساتھ آپ اس میں ایک number جمع کر سکتے ہیں ان ساری چیزوں کا مطلب بیان کرنا ہمیں پڑتا ہے we have to define what the problem is before we go and we solve it so let us take a look at the various operations that we may want to perform with a matrix the various operations that we would want to perform would be addition of two matrices addition of a scalar and a matrix scalar I mean an ordinary number آپ نے تھوڑا سا اتنا تو دیکھا ہوگا کہ جی ایک number کو ہم scalar کہتے ہیں پھر ایک vector آجاتا ہے which is multiple scalars and then we have a matrix which is multiple vectors ہم scalar کی جبات کریں it means an ordinary number so treat it as such so we would want to add two matrices together you would want to add a scalar and a matrix you may want to subtract two matrices one from another you may want to subtract a scalar from a matrix you would want to multiply two matrices together ان چیزوں کی definition کی ضرورت پڑے گی آپ یہ بھی چاہیں گے کہ جی ایک matrix کو کسی scalar کے ساتھ multiply کر لیا جائیں ہم یہ بھی چاہیں گے کہ جی کسی matrix کو کسی scalar کے ساتھ divide کر دیا جائیں so there are basic arithmetic operations لیکن ان کی definition کی ضرورت ہے اس کے بعد SPECIFICALLY matrix کے حوالے سے ہم چاہیں گے کہ جی matrix کو transpose بھی کر لیا جائیں transpose means rows and columns کو interchange کرنا ہم اس کو transpose بھی کرنا چاہیں گے دو بڑے important operations ہے matrix کے وہ ایک تو ہے matrix کا inverse لینے اور دوسرا ہے اس کا determinant معلوم کرنا لیکن اس میں ہم ابھی نہیں جاتا ہے کیونکہ وہ پھر بہت سیادہ complex ہو جاتی ہے بعد so ہمارا جو problem جس کو ہم solve کرنے جا رہے ہیں کہ جی matrix ایک class ہونی چاہیے اور وہ یہ یہ چیزیں کر سکے جو میں نے بھی گنی ہیں addition subtraction multiplication and division یہ کمس کم ہونا چاہیے اور یہ دونوں چیزوں کیلئے matrix versus matrix and matrix versus scalar کیلئے ہونا چاہیے اور پھر ایک operation ہم define کر لیں گے transpose کا وہ matrix کیوں پر act کرتا ہے now if we start talking about the interface before we get there we should maybe start defining these operations تھوڑی سی terminology جو میں نے بھی بات کی تھی کہ جی row and column والی terminology if we take two matrices a and b the question is وہ آپس میں جمع ہو سکتی ہے کہ نہیں پہلی چیز دو matrices کو آپس میں جمع کرنے کا مطلب کیا ہے اور پھر یہ کہ جی جمع کیا جا سکتا ہے کہ نہیں مطلب اس کا یہ ہے کہ جو resultant matrix ہوگی so پہلی چیز when you add two matrices the resultant is a matrix the resultant matrix کا کوئی element لے لیں let's say ith row and column میں جو element ہے ith represents the sum of the corresponding elements in the two matrices which means اگر c آپ کی matrix results آتا ہے تو c کا i't اور j't row and column میں جو element پڑا ہوئے it is equal to the sum of a of ij اس طرح سے لکھا جاتا ہے کہ جی ایک matrix کا نام ہے اور اس کے subscript میں ہم لکھتے ہیں row and column so a of ij plus b of ij جو ہے اس طرح اس کے ایک روار کوئی یا اس کے انہوں میں جو ایک نام جانا ہوں نا its its its its its its its its its its its its its its its its its its its مجھے میں ہم اس fingers و اید ہوسکتے ہیں کہ ڈوسقین میں میکنی اِنی راقص جو بھی کار کار شدیوں کو بصنقت کی Good نسام گی chance ک ہے Person�� رب SPEC ہیں creates ڈوسیک سواہی او ڈوسیک س zip trophy�� آج که Foundimaan کیا آج البیٹ لہذا ، جونسی کی ا었어itis Colin مدین کیا ہے۔ لہذا MAY' کے تکویمان میں بہت مختلف نہیں ہے.. لہاہی بہت مختلف پر اُس کے لئے رسلٹنٹ میٹرکس کا کوئی بھی کسی ڈو کولوم ڈو کالم پوزیشن پہ جو ڈو تو for example resultant matrix کے 2nd row کا 3rd column کا جو element ہے that will be the difference of a matrix کی 2nd row اور 3rd column کا element minus b matrix کی 2nd row اور 3rd column کا element straight forward enough conformability وہی ہے دونوں matrices کا ایک ہی row column structure ہوگا یعنی ایک ہی size ہوگا تو ان کو آپس میں subtract کیا جا سکتا ہے ساتھ ہم نے کچھ اور چیزیں بھی implement کرنی ہے اس کے اندر ہم چاہیں گے کہ جی matrix کے اندر scalar جما کیا جا سکے first of all we have to define what is meant in this instance by adding a scalar to a matrix what we would want is کہ ordinary ایک number جب ہم کسی matrix کے اندر add کرتے ہیں تو اس کے ہر element کے اندر وہ number جما کر دیا جائے so it is an addition of that scalar to every element of the matrix in every row column position the same thing again applies to subtraction of a scalar if we subtract a scalar from a matrix which means we subtract an ordinary number from a matrix what we are talking about is take a number and subtract it from every element individually so آپ دیکھیں گے کہ جی addition and subtraction of scalars اس سے matrix کے size کو کچھ نہیں ہوا وہی rows وہی columns رہے لیکن her value جو ہے her number کی وہ بدل گئی so we have now defined addition and subtraction of 2 matrices and we have defined the addition of a matrix and a scalar and the subtraction of a scalar from a matrix the next one is let's take division first before we go to multiplication division of a matrix by a scalar ہم دیفائن کریں گے بالکل جس طرح سے ہم نے بات کی کہی addition کی یا subtraction کی ہم کہتے ہیں if we divide a matrix by a scalar we are going to divide every element of the matrix by that scalar so for example اگر ہمارے پاس x ایک نمبر ہے which is an ordinary number therefore it's a scalar اور ہمارے پاس a ایک matrix ہے تو a slash x یعنی a divided by x کو ہم دیفائن کریں گے کہ اس کا result اگر c matrix ہے تو c of i j یعنی c matrix کا i'th row اور j'th column پہ جو element ہے وہ a matrix کے i'th row اور j'th column پہ جو element پڑھا ہوا تھا اس کی value لے کے x سے divide کر کے جو result آئے گا وہ اس جگے پہ لکھا جائے گا c matrix کے اندر تو the division of a matrix by a scalar we are defining ہم not saying this is maths we are defining for our purposes وہ اس طرح سے define ہوگی اب آ جاتے ہیں matrix multiplication کی طرف یہ زراہ سا complicated ہے لیکن بہت زیادہ نہیں پہلے تو سیمپل کام کر لیتے ہیں what about multiplying a matrix with a scalar the concept we want to use over here is کہ again if x is an ordinary number so x multiplied by a where capital A لکھا جاتا ہے normally matrices کے نام ہم capitals may denote کرتے ہیں so x multiplied by capital A which is the matrix means multiply every element of the matrix with this number x so it is again the same size but every number has been multiplied so that would be the multiplication of a matrix with a scalar next part slightly more complicated multiplying two matrices together ان کو کیسے multiply کیا جائے اس کے اندر ہم کرتے یہ ہیں پہلی matrix لیکے اس کا پہلی row لی اور دوسری matrix لیکے اس کا پہلا column لیا اس row کو اس column کے ساتھ ملتیپلائے کرنا ہے element by element یعنی پہلی row کا پہلے element جو ہے وہ دوسری matrix کے پہلے column پہلے row والے element کے ساتھ ملتیپلائے ہوگا پھر پہلی matrix کے first row second element جو ہے دوسری matrix کے first column second element کے ساتھ ملتیپلائے ہوگا and so on so forth اور جو ان کا result ہے جو سار result کو جمع کر دینا ہے اور جمع کر کے resultant matrix میں لکنا ہے کہاں پہ ایک خاص row اور column position پہ وہ row and column position کونسی ہے پہلی matrix کی row number اور دوسری matrix کا column number let me recap I know it gets complicated لیکن کاغز پے کریں یا تصویروں بنائکے کریں that is the best way of doing it the resultant matrix کا آیتھ row اور جیتھ column کے اوپر جو element پڑا ہوئے that value which is an ordinary single value a scalar the آیتھ row جیتھ column represents the dot product یعنی element by element product اور پھر اس کا sum of the آیتھ row of the first matrix multiplied by the جیتھ column of the second matrix once you understand this you realize کہ جی ان matrix کے اوپر کچھ لوازمات ہیں you can't just take two matrices and expect کہ وہ اپس میں multiply ہو سکتی ہیں کیوں ہم نے کہا ہے کہ جی پہلی row کو پہلے column کے ساتھ multiply کرنا ہے لہذا دونوں کا size برابر ہونا چاہیے یعنی پہلی row کے اندر یا پہلی matrix کی row جو ہے اس میں جتنے elements ہیں یہ exactly اتنے ہونے چاہیے جو کہ دوسری row کے ایک column کے اندر elements ہیں now اب آپ سوچیں کہ جی ایک column کے اندر کتنے elements ہوں گے well matrix کے ایک column کے اندر اتنے ہی elements ہوں گے جتنے اس کی rows ہیں کیونکہ ہر row کا ایک element اس column کو contribute کر رہا ہے to make a long story short two matrices can be multiplied with each other if the number of columns of the first matrix is equal to the number of rows of the second matrix if there are five columns if there are five rows then we can take this kind of product and then how do we get the result pick up one row pick up one column multiply them by element and whatever row and column position resultant matrix write that scalar value and you go doing that for every row every column you realize resultant matrix so we will be developing a routine to multiply two matrices together ایک چیز سوچنے والی رہ گئی جناب ہم نے تو بات کر دی کہ the number of columns of the first matrix must be equal to the number of rows of the second matrix وہ تو ٹھیک ہو گیا resultant matrix میں کتنے rows and columns ہوں گے well again it may be hard for me to explain in words لیکن اگر آپ تصویر بناکے دیکھیں تو جتنی rows ہیں پہلی matrix میں resultant matrix میں اتنی rows ہوں گی اور جتنے columns ہیں دوسری matrix کے اندر resultant matrix میں اتنے columns ہوں گے so to put it in mathematical notation اگر پہری جو matrix ہے اس میں m rows ہیں اور n columns ہیں اور دوسری matrix جو ہے اس میں n rows ہیں they have to be the same n columns n rows اور اس کے اندر p columns ہیں تو جو resultant matrix ہوگی اس میں پہلی rows ہوں گی یعنی m اور دوسری matrix والے columns ہوں گے so the resultant matrix کا dimension will be m by p m rows p columns lot of abstract math but draw the picture and you will understand it clearly what about the transpose of a matrix transpose of a matrix is defined as the interchange of rows and columns when we interchange you have to understand because the row of a matrix is now a column دوسری row دوسرہ column resultant اگر تو یہ matrix square ہو square matrix کیا ہوتی ہے جس کے rows اور columns کی تعداد ایک جیسی ہے 3 columns it's a square matrix 4 rows 4 columns it's a square matrix پھر تو آپ کو لگے گا کہ جب ہم اس کو transpose کرتے ہیں تو انہ وی اس کا diagonal اگر آپ درو کریں top left corner سے bottom right corner کہ ایک لائن لگائیں تو وہ elements آپس میں interchange ہو جاتے ہیں دیکھیں گے اس interchange کا effect تو وہی لگے گا کہ پہلی row پکڑی اور اس کو as a column لکھ دیا دوسری row پکڑی اس کو as a second column لکھ دیا تو 3 by 3 matrix جو ہے وہ transpose ہو جاتی ہے square matrices کے اندر تو یہ transpose کا concept straight forward ہے جب ہم non square matrix میں جاتے ہیں یعنی وہ matrix جس کا rows اور columns کی تعداد ایک جیسی نہیں ہے پھر concept exactly یہی ہے کہ پہلی row پکڑیں اور اس کو column لکھ دیں پہلا column بنادیں دوسری row پکڑیں دوسری row پکڑیں and so on till the first matrix is finished what happens is the size of the matrix changes so if the first matrix was 3 rows and 4 columns the transpose will be 4 rows and 3 columns so it is simply writing the matrix like this we are transposing it this was basic matrix operations ان کو ہم implement کرنا چاہیں گے class کے اندر یہ جتنی ابھی ہم نے باتیں کی میں آپ کو domain کو define کر رہا تھا آپ سمجھیں یہ ہمارا analysis کے phase کا ایک important component ہے کیونکہ جو بھی ہم problem solve کرنے جا رہے ہیں اس کی سمجھ ہونا لازمی ہے we have analyzed the problem domain and we have understood what a matrix is what its operations are that we would want to implement they are important operations جو ہم implement نہیں کریں گے and now we go on to the next phase اس کے اندر عملہ جیس میں constants کیا استمال ہونے ہیں ہمارے problem کی اندر اس میں memory کیسے allocates ہونی ہے یا کتی memory چاہیے اس کا interface کیا ہوگا so let us talk of these issues one by one ہم جو matrix class define کرنے جا رہے ہیں ہم چاہیں گے جب ہم اس کا object بنایں تو اس وقت اس کے لیے memory allocates ہو یعنی شروع سے لکھتے وقت ہمیں نہیں پتہ کتنے روز ہونے ہیں اور کتنے کالمس ہونے ہیں لہذا ہم جاننا نہیں ہے امریکور کیا پکرہ ہمیں کنی کانسٹنٹ کے لئے میں کتنے دنیا ہوسنا نہیں ہیں تیار میں ممری ہنگی ایک بارے جیسے پہلے ممری ہنگی بہت ہوں جب آپ نے کلاس کو بتا دیا کہ کلامی ہی بڑائے تو پھر وہ جائے اور کسی طرق سے اپنے لیے ممری کار کرے لہذا ہم آتے ہیں and we've looked at the constrain analyze کیا. نہیں چاہیں. we looked at the memory allocation نہیں چاہیے چھوٹی موٹی ہوگی وہ ہم دل لیں گے اور ہم run time کے ابر memory allocates کریں گے. next important thing is to think of the interface یاد رہے بھی ہم کلاس دیفعین کرنے جاتے ہیں we're Talking of انٹفیس سے ساکتے ہیں، انٹفیس سے ساکتے ہیں۔ اور بار بار میں نے آپ کو بتایا کہ انٹفیس وہ چیز ہے جو ہماری کلاس باہر والی دنیا کو دیکھاتی ہے۔ حالی تاکہ کلائنٹ آفہ کلاس، بہت مجھے کلائنٹ بہت کلائنٹ کلائنٹ کیا نظر آتا ہے؟ وہ اس کلاس کے ساتھ کیا کچھ کر سکتا ہے؟ لہذا ہم ایک کلائنٹ کیا سکتے ہیں؟ بہت سکتے ہیں۔ لیکن ہم خود کرتے ہیں، کیا چیز پاس ہونbles being پاس ہوں تو ہیچ ہیش جیس میں کنسٹرٹس اسٹمال نہیں کر کے لئےٹا ہے تو کم اس گم کنسٹرٹسکے کیا آپ روز اور کنسٹرٹسکے کے لیے تھی باتا سکیں۔ یہاں یہاں کنسٹرٹسکے میں کنزٹرٹسکے کے لیے بھی نائی کرسکے تھے۔ کالم اور then will allocate the adequate amount of memory. You will notice کمہنے انٹیجوز کا لفظ استمال کر لیا. Well, why? Look, the number of rows and columns will always be a whole number. It is an int. It doesn't matter کہ matrix me جو elements ہیں وہ کس کسم کے ہیں. They may be doubles, they may be floats, but the number of rows is an int. The number of columns is an int. وہی باتھ whole number ہوگا. So it could even be a long. نندلیس ہمیں پرمیٹرائیز کنسترکٹر نیمترائیز اور پرمیٹرائیز will be the number of rows and columns of the matrix. اس کے علاوہ ہمیں کوئی طریقہ چاہیے کہ جی ہم میٹرکس کو دیسپلے کر سکیں. کمہز کم ایک چیز تو ہونی چاہیے. So we'll have a display function جو کہ نیٹلی formatted میٹرکس بنا سکیں. آپ نوٹس کریں گے یہ most of these things we already have covered. سموئر along the course کوئی نہ کوئی ایکسرسائیز ہم کرتے رہے ہیں. آج ہم اس ساری ایکسرسائیز کو سمیٹ رہے ہیں. And we're trying to bring it all together. سو ہی will put in a display function. Then we need some manipulation functions. منیپلیشن function کے اندر جو ابھی میں نے matrix operations کی بات کی تھی. ان اپریشن کے لیے ہمیں اپریٹرز جاہییں. اپریٹرز کا ذہا سوچنے لگیں تو کیا ہوگا. دو میٹرکس کو ہم نے اپس میں add کرنا ہے. Add کرنا ہے تو ہمیں ایک plus operator چاہیے. Because we would want to write a plus b not make a function call. This plus operator which operates on two matrices will be a member operator. یہ نہیں اس کے left side پہ میٹرکس ہے اور پھر right side پہ ایک matrix اس کو پاس کی جاتی ہے. ہم چاہیں تو اسی وقت interface analysis میں لکھتے جائیں کہ جنابیو اپریٹر اس کو کیا نظر آئے گا اور یہ واپس کیا کرے گا. یہ وہی بات ہے جب بھی ہم function کی بات کرتے ہیں. We talk in terms of what is the return type of this function. What is passed to this function. And then we say what this function will do. So here we are talking of a plus operator which is going to be a member operator of the matrix class. And we have to think in terms of کی جی اس کو call کرنے والا matrix ہے. So that's the left-hand side. Then comes the plus. And right-hand side پہ بھی matrix آ رہی ہے. Return کیا کرتا ہے. Well we want to add to matrices and get a matrix in return. So the return type is also a matrix. So the member operator will take one matrix which is the second one کیونکہ پہلی والی تو اس کو call کر رہی ہے. وہ this pointer کی طرف وہاں پہن جائے گی. Second matrix اس کو ملے گی as an argument. اور دونوں کو add کر کے اس نے ایک matrix ہی واپس کرنی ہے. Same thing applies to the subtraction of two matrices. A minus B the whole same story. It's a member operator. It has a matrix on one side, a matrix on the other and it returns a matrix. But when we start bringing scalars into the picture the whole situation changes. When we say matrix A plus X where X is a scalar. اب ہمیں overload کرنا پڑھرہا ہے plus operator کو. It is still a member operator because when we write A plus X پہلی چیز جو ہے وہ A ہے which is a matrix. So matrix ہی plus کو call کر رہی ہے it's a member. Member operator کو اب پاس کیا ہو رہا ہے. ایک اور matrix نہیں ہو رہی ایک scalar ہو رہا ہے. Scalar may be an int double float. We'll worry about that later. پھر ہم نے جمع کر کے return کیا کرنا ہے؟ ایک اور matrix. So the first instance we've got an overload of the plus operator. Returns a matrix is called by a matrix. It's a member operator. But it expects a number an ordinary scalar as an argument. And again we will not specify what number will come to that later. But this particular operation جہاں پہ ایک طرف matrix ہے اور ایک طرف scalar ہے. اس کی بھی دو varieties ہیں. Varieties کیا ہیں؟ A plus X and X plus A. اب یاد کریں کہ جی X plus A کیسے implement کریں گے جہاں X جو ہے وہ scalar ہے اور A جو ہے وہ matrix ہے. The question I'm asking is can this be a member operator? And by now I hope you realize کہ جی X plus A جہاں پہ X scalar ہے وہ والا plus matrix کلاس کا ممبر نہیں ہو سکتا. کیوں نہیں ہو سکتا؟ اس کے left-hand side پہ جو چیز ہے جو plus کو ڈرائیو کر رہی ہے وہ scalar ہے. اگر وہ scalar ہے تو پھر یہ کس کسم کا operator ہوگا. It will be a friend operator. So it's a friend function defined outside the class. یہاں پہ آپ دیفائن کریں گے. ایک plus operator جو کہ argument as an argument matrix except کرے. اور اس کو drive کر رہا ہو ایک کوئی اور number may be an int double float or something like that. So it's an externally defined function. اس کے دو arguments ہوں گے. پہلا argument ordinary scalar. دوسرا argument matrix. ان کو آپس میں جمع کرے گا. As per the rules defined in the problem definition. پہلے анالیسس کیا ہے کہ یہ سکیلر کا matrix کے ساتھ جمع کرنے کا مطلب کیا ہوتا ہے. اور پھر اس نے return کیا کرنا ہے? return کرنی ہے matrix. یہاں پہ آپ function دیفائن کریں گے. لیکن matrix class کے اندر اس function کو friend declare کریں گے. سیم thing applies when we go to subtraction. کہ a minus b where a and b were matrices. وہاں تو مسئلہ کوئی نہیں ہے وہ member operator چلے گا. لیکن a minus x جہاں پہ x scalar ہے اور a matrix ہے. وہاں پہ a minus x میں تو member operator کام کرے گا. کیونکہ left hand side پہ matrix لکھی ہوئی ہے. لیکن جب ہم x minus a کرنے جائیں گے تو وہاں پہ آپ کو friend operator چاہی ہوگا. friend function چاہی ہوگا. کیونکہ اب left hand side پہ scalar آگیا ہے. اور if we want to define. اگر آپ سوچے میں نے اس کی بات نہیں کی تھی. but we might as well define it for completeness. کہ x minus a جو ہے وہ x میں سے ہر element کو سپریکٹ کر دو اور resultant matrix بن جائے گی. تو another friend function کمزین. now we go on to multiplication. یہ سب interface کی بات ہوری ہے. multiplication کیلئے ہم symbol استعمال کریں گے star. which is the standard asterisk کیو کیبوٹ پہ ہے. ہر دفعہ ہم programming میں star استعمال کرتے ہیں. so matrix multiplication میں بھی star استعمال کرنا ہے is valid. اب a multiplied by b a star b یہ اپریشن ابھی میں نے آپ کو کچھ تفصیل سے کیا کیا کیا کیا کیا جاتا ہے. پہلی رو کو پہلے کالم کے ساتھ دوسری رو کو دوسرے کالم and so on so forth. but what we talking of here in terms of the interfaces یہ جائے گا کہاں. by left hand side پہ matrix ہے لہذا یہ member operator ہے. پھر a multiplied by x کی باری آجاتی ہے. a matrix multiplied by a scalar. left hand side پہ matrix ہے لہذا a star x والا operator. it's an overload of the star any multiplication operator. but it's a member function. it's a member of the class matrix. but اس کا counter part which is x star a. where x is a scalar and a is a matrix is not a member operator. because the thing on the left hand side happens to be a scalar. so x star a again has to be a friend function. defined outside the class and declared as a friend inside. یہ آپ کے version آجاتے ہیں Multiplication کے. division کے لیے ہم نے تھوڑی سی زندگی آسان رکھی ہے. ہم نے کہہ جی matrix جو ہے وہ scalar کے ساتھ divide ہو سکتی ہے. this is only one definition. so matrix a slash x کی definition is ہر element کو x کے ساتھ divide کرنا ہے. اور یہ جو ہے کیونکہ a پہلے آرہ ہے پھر slash آرہ ہے which is the division symbol. ہم کہیں گے یہ member operator ہے. یہ ہمارے mathematical operations تھے انٹفیس کے. اس کے علاوہ ہم نے بات کی ترانسپوز کرنے کی. تو ترانسپوز جو ہے وہ ایک matrix کو ترانسپوز کرتی ہے اور دوسری matrix اس کا result ہوتا ہے. اور ترانسپوز کے اندر میں نے بھی ذکر کیا کہ matrix کے dimension بدل سکتی ہیں. لہذا original matrix کو چھوڑ کے ہم کوئی نئی matrix بنائیں گے اور پھر original matrix کو وہاں پہلے رپلیس کر دیں گے when we say transpose a matrix ہم چاہیں گے کہ وہی matrix ترانسپوز ہو جائے کسی طریقے سے یا resultant دے دی ہم assign کر سکیں. یہ ہمارا بیسیک rudimentary interface بنتا ہے. so transpose is a function and it's a member function لیکن this is not the complete picture we still have a few more things to cover to complete the interface. the other things that we do need to cover is the fact that common operators ہوتے ہیں plus equal to minus equal to and so on but they require the assignment equal to operator کیونکہ یہ کلاس ہے جوکہ dynamic memory allocation کر رہی ہے تو ہم اس کے اندر assignment operator بھی define کرنا چاہیں گے ہم کہہ سکیں a equals b جہاں a اور b دونوں matrices ہیں so it's a member operator but there's a particular thing that we need to do for assignment we will cover that when we come into the code ہمارے پاس اگر plus بھی ہے اور equal to بھی ہے تو پھر plus equal to define کرنا آسان ہو جاتا ہے ہم اس کو define کر سکتے ہیں by reusing code جوکہ ہم نے plus operator کیلئے لکھا اور equals operator کیلئے لکھا same applies to minus equal to I don't know whether we will be able to apply to star equal to or not ابھی تک ہم simple ہی رکھتے ہیں ہم plus equal to or minus equal to رکھتے ہیں پھر کچھ اور utility operators ہم define کرنا چاہیں گے ہم چاہیں گے کہ جی stream insertion اور stream extraction operators وہ بھی define کر لیے جائیں اس کلاس کے لئے stream extraction operator means stream سے چیزیں لینی اور اپنے object میں ڈالنی which means it is the operator اس کے اندر بھی آپ سوچیں کیا ہوگا left hand side پہ see in ہوتا ہے ہماری input stream ہوتی ہے right hand side پہ ہمارا object ہوگا یعنی matrix کا object ہوگا لہذا it is it's an operator جس کے left side پہ matrix نہیں ہے so again یہ member operator نہیں ہو سکتا it has to be a friend same applies to a stream insertion operator یعنی وہ operator جو کہ matrix کو لے اور screen پہ دکھا دے کیونکہ وہاں پہ left side پہ see out آجاتا ہے یعنی output stream آتی ہے تو جب output stream آتی ہے پھر less than less than and an object of class matrix that means it cannot be a member operator it has to be a friend یہ ہم ایک interface analysis کر لیتے ہیں آپ کو handouts میں بھی مل چکا ہوا ہے پوری list اور ساتھ ساتھ ہم نے یہ determine کرتے جانا ہے کہ جناب کونسی چیز matrix ممبر ہے یعنی اندر ڈیفائن کرنی ہے اور کونسی چیز وہ friend ہے یا matrix class سے بہر ڈیفائن ہوگی ساتھ ساتھ جہاں پہ بھی functions یا operators کی بات ہو رہی ہے میں نے پہلے بھی ذکر کیا تھا we should actually go over that list and see کہ جی اس کی return ڈائپ کیا ہوگی اور اس کو argument کیا پاس ہوگا so let us review that list one by one اوپر سے نیچے تک to determine these extra issues لیکن ہم first of all the addition of two matrices return ڈائپ matrix argument matrix سمپل enough next addition of a matrix with a scalar return ڈائپ matrix argument scalar یہ ہے member version of the plus operator friend function plus جو ہے اس میں scalar پہلے آگا matrix بعد میں return ڈائپ matrix argument matrix minus کیلئے یہی ساری چیزیں member operator a minus b جہاں پہ لکھیں گے جہاں a اور b matrices ہیں return ڈائپ matrix argument matrix یہاں پہ تھوڑا سرق جاتے ہیں let me cover something else جو کہ important ہے سوچنے کیلئے matrix ہم نے بات کی کہ جی rows and columns کے ساتھ اس کے اندر ہم نے number لکھے ہوئے اس نے memory لینی ہے جب بھی یہ ہم operators اور functions کی بات کر رہے ہیں اور matrix ان کو بھیج رہے ہیں اور matrix حاصل کر رہے ہیں we have to think in terms of efficiency as well should we pass a matrix remember our last lecture were talking about the stack یہ وہی stack ہے جس پر elements ڈالے جائیں گے should we pass a matrix which may turn out to be what can we do with passing a reference to the matrix normally all of these operations will use references we will pass references اور ہم چاہتے ہیں اگر کہ جی جو matrix pass ہوری ہے وہ change نہ ہو سکے تو اس کو constant reference بنا دیں گے a constant reference so we will use references extensively so notice we are expanding our vocabulary جو کچھ آجتا کرنے سکھا تھا friend functions آ چکے ہیں references آ چکے ہیں overloading آ چکی ہے so we will develop these concepts going on minus cover ہو گیا when multiplication comes return type matrix a star b will return a matrix argument matrix when we want to do scalar multiplication a star x return type matrix argument a scalar and a double a float we will determine that later when we go to the second version of the multiplication x star a where x is a scalar return type matrix argument matrix now whenever I say return type an argument we can start thinking reference آئے گا we will always have a reference or we may use an actual matrix we will come to that when we discuss the code the division operator is not enough a divided by x return type matrix argument a scalar لیکن اس کے اندر اگر چاہیں تو اسی وقت ہم نوٹ کر لیں otherwise code لکھتے وقت نوٹ کیا جائے گا x cannot be zero you don't want to have a divide by zero error so maybe this operator should do a check and make sure جسی سے ہم divide کر رہے ہیں وہ zero نہیں ہے return type matrix and is being called so it's a member function اس میں argument دینے کی ضرورت نہیں ہے you can transpose a matrix on its own we have basically discovered or done an analysis of the entire problem from beginning to end اور اب ہم چلیں گے اس کو code کرنے کی طرف but let us just review our steps پہلی چیز یہ تھی کہ ہم نے problem domain کو سمجھا کی ضرورت ہے وہ آپ کو بار بار پیش آئے گی remember یہ course ہے یہ introduction to programming ہے not introduction to mathematics or introduction to c++ from a programming perspective you are the person who is going to be equipped with the necessary tools to solve problems but the problems may not fall within your own domain شاید آپ کا client کوئی doctor ہو ایجی میرے patient records میں سٹور کرنے ہیں patient records میں وہ کہا ہے میں نے x-ray سٹور کرنے ہیں now آپ کو programming آنی چاہی ہے لیکن اس کا domain سمجھنے کے لیے آپ کو client کے ساتھ بھی بیٹنا پڑے گا اس کا brain کھانا پڑے گا pick کرنا پڑے گا and you will have to analyze کی جی اس کی requirements کیا ہیں اس کا problem کیسم کا ہے banker کے ساتھ بیٹ جاتے ہیں accountant کے ساتھ بیٹ جاتے ہیں ہم نے problem domain وہ چوز کیا ہوئے simple math کی اندر سے basic matrices but nonetheless we had to analyze the problem domain and understand کیا چیز ہم implement کرنے جا رہے ہیں جب ہمیں problem کی سمجھ آگئے which is the phase one of the analysis اس کے بعد ہم نے اس کی لوازمات کی طرف خور کیا کہ جناب اس کو کوئی constants چاہیے اس کو memory allocation چاہیے شروع میں کردیں گے dynamically کریں گے پھر ہم نے کہا اس کا interface کیا ہوگا بہر کی دنیا کو کیا نظر آئے گا interface پہ چلتے چلتے میں دو آپ کو کلیر کرتا جاو ایک issue ہے کہ جب ہم یہ matrix class بنا لیں گے اور اس کے objects ہم تشکیل کریں گے وہ ایک اور program کر رہا ہوگا جس کو ہم اپنا main program کہتے ہیں یا کوئی اور functions لکھے وہ matrices کو استعمال کر رہے ہوں گے ان programs کا جو interface جو user کو نظر آئے گا screen پیجی a دباو تو یہ ہوگا وہ different issue ہے وہ اس program کا interface ہے یہاں پہ جب ہم class کے حوالے سے interface کی بات کر رہے ہیں it means clients of the class کو کیا نظر آئے گا and the clients are other programs یا clients of the class کس کس function کو call کر سکتے ہیں so you have to be careful when we define an interface کیا ہے having gone through the problem domain then we went through all the behaviors that we want to implement we listed them down and for each behavior we tried to go one slightly level deeper in detail to determine کس کی return type کیا ہوگی اور اس کو pass کیا چیز کی جائے گی اس کے اندر کیا ہونے وہ problem domain نے dictate کیا تھا وہ یاد رکھنا چاہیے کیونکہ جب code لکھنے جائیں گے اس چیز کو implement کریں گے ہم so for the moment we did an understanding of the problem domain an understanding of constants and then we had a listing of the various interface functions that we want to implement اب جو ہماری matrix کلاس ہے اس کے بارے میں تھوڑی سی اور باتیں کرتے چلتے ہیں تاکہ وہ ہمارے خیال میں رہے جب ہم implementation کی طرف جائیں گے دیکھیں شروع میں ہی میں نے آپ کو بتا دیا کہ اس کے rows and columns بھی ہم کنسٹر کے تھوڑے بتائیں گے کہ کتنے rows کی matrix اور کتنے columns کی matrix ہم نے کنسٹرٹر کو دے دیں گے تو ہم کہیں گے جاؤ اس کے لیے memory allocate کرو اور memory allocate کیسم کی کرنی ہے depends کی ہم نے int کی matrix بنانی ہے double کی بنانی and so on یہ باتیں میں نے اس پاس دیکییں کہ یہ ایک کلاس ہے جس کے اندر dynamic memory allocation ہو رہی ہے اب سیدہ سیدے بات آپ پورانی بات کریں جو ہم یاد کریں باتیں جو ہم نے discuss کی تھی ہوتی ہے we have to start thinking of something special first thing is it has to have a constructor constructor نے memory allocate کرنی ہے اس کے بعد جہاں پہ بھی dynamic memory allocation ہو رہی ہے تو اس کو free بھی کرنا ہے لہذا اس کا destructor بھی ہوگا جو کہ memory کو free کر سکے we don't want to consume memory and make it unusable the other thing is assignment operator has to be a special one you can't do a shallow copy you can't do کہ جی وہ ایرے کا نام copy کر دو in other words pointer copy کر دو then it will be pointing to the same memory location you have to make sure that you allocate a deep copy اسی copy کے حوالے سے you also want to have a so called copy constructor or copy constructor وہ ہے given a matrix make a new matrix based on this one so you initialize a new matrix based on an existing matrix so we will do a copy constructor we will do an assignment operator that does a deep copy and we have to worry about memory allocation and memory deallocation next lecture we will start worrying about the actual code that goes into this class for the moment let me now go back over what we did today and tell you what the surprise was they came from beginning to end i kept saying int double float etc but کہی پہ میں نے commit نہیں کیا کہ جی ہماری class matrix کی یہ matrix of type int ہے یا matrix of type float ہے یا matrix of type double ہے numbers ہیں اتنی ہم نے بات کی یہ ضرور میں نے commit کیا کہ جی rows and columns کیونکہ ہمیشہ whole numbers ہوں گے تو convenience کے لی ہم سے پہلے ہمیں گو انٹیجز بن آ لیتے ہیں ہم اس کینے بھی دی will see where this discussion is going since everything else about this class is the same ہم ڈیگیگی کو رہا ہاکant to write this code once and use it to declare a matrix of integers یا a matrix of doubles یا a matrix of floats مجمن کیا کہہتا Shiny کیا مجنے کیا eventually we are going to end up with a template تیمپلیٹ of a class so ہم نے اس طرف جانا ہے شروع میں نہیں کریں گے شروع میں ہم کوئی ایک چیز بکر لیں گے لیکسے the simplest one ہم انٹ لے لیں گے اور اس سے کلاس کو دیویلپ کریں گے and then we will see how to transform that into a تیمپلیٹ when we are all done nonetheless یہ تیمپلیٹ کا سلسلہ یہاں پہ ختم نہیں ہوتا دیکھیں بار بار ہم نے بیچ میں سکیلر کی بات کی ہے جب بھی سکیلر کی بات ہے تو سکیلر being an ordinary number وہ بزاتے خود بھی انٹ ہو سکتا ہے دبل ہو سکتا ہے فلوٹ ہو سکتا ہے so what do we do we can start overload overload overload کرتے جائیں ہر چیز کے لیے انٹ دبل فلوٹ انٹ دبل فلوٹ انٹ دبل فلوٹ functions define کرتے جائیں کس کس چیز کے لیے دیکھیں ہم نے addition of a سکیلر کی ہے matrix plus scalar scalar plus matrix دو یہ ہو گے تین کسم کے نمبرز آگئے انٹ فلوٹ دبل اور اس کے آپ کے پس چھیکو functions بن گئے پھر minus پی آجائیں matrix minus scalar scalar minus matrix پھر آپ کے پاس یہ functions آگئے یہ سب overload ہو رہے ہیں کوئی member کے طور پے کوئی friend کے طور پے پھر آپ آجائیں matrix multiplied by a scalar scalar multiplied by a matrix again you have this member and friend concept but you have three different types of numbers and you have three different types of matrices that you could make نمبر چڑے functions آگئے what we are going to do is to try to templatize the whole thing functions جو ہیں وہ template functions بن جائیں گے یعنی ایک function لکھیں کہ ایک نمبر ہو اور ایک matrix ہو تو اس کا اپس میں behavior کیا ہو گا اور پھر اس کو instantiate جب کرنے جائیں گے تو ہم بتائیں گے کس کسم کا نمبر کمپائلر جو ہے وہ ہمارے لیے پوری template سے ایک copy ایک چھاپا اس کا develop کر لے گا اور ہمیں ہمیں جانتے ہیں لیکن six different functions doing the same thing تو یہاں where we also going to use template classes and template functions تو ہم actually are going to exercise everything if we think in terms of how we are going to display it how we are going to define the insertion operator how we are going to do the extraction operator again these are areas that we have touched on and you will realize کیجیس میں decisions بھی آئیں گے for example کیجی اگر x0 ہے تو اسے divide نہ کرو it's going to be a decision اس میں loops بھی آئیں گے بھئی rows ہیں columns ہیں so اس کے numbers کیسے پرنے ہیں بھئی پہلی row سے لے کے آخری row تک پہلے column سے لے کے آخری column تک آپ نمبر پڑتے جائیں so they are nested loops یہ program کا concept جو ہے یہ exercise ہو گا display کے لیے again you would have loops آپ کو نستed loops آپ کو سیمپل لوپس now one of the things that we were discussing when designing or developing these lectures the issue was کیجی class matrix کو just numbers کے اوپر بیس کریں یا اس کو کسی اور class کے ساتھ استعمال کرتے ہوئے matrix کی class بنائیں اس میں example میں آپ کو دیتا چاہلوں we could have taken a different approach the approach would have کیجی آپ class row define کرلیں row کیا ہے it's a simple array of numbers اس پہ سارے operations define کرلیں اور پھر matrix آتے وقت matrix بناتے وقت ہم کہیں کہ اس میں اتنی rows ہیں کیونکہ row میں بزاتے خود numbers ہیں so جب آپ نے کہا کہ اتنی rows ہیں تو ہر row کے ساتھ column خود ہی بن گیا it would have been a matrix but it would have been a different approach I did not want to add that additional level of complexity because that will come when you go into object oriented programming then you will also learn inheritance and polymorphism and things like that virtual functions اس course میں the concept is basic programming so we're going to use as many constructs as we can within a single class to give you a workable code مطلب او کچھ کام کرتا بھی ہو and maybe it's a class that you file away in your library and you use it again and again the complex number class would have been too simple the matrix class exercises most of the programming constructs جو ہم استعمال کرتی آئے ہیں so it's a good example it does also lead us towards template functions and classes so it's an area where we could even exercise that concept so it's a good example اگلی دفعہ ہم اس کے اوپر اس کے actual code development کی باتیں کریں گے the code development itself will take place in a structured manner ہم نے آج problem کا analysis کیا ہے and then next time اس آنالیسس کو ہم لیکے آسطا آسطا ایک ایک module develop کرتے جائیں گے جو ہمارے class structure اور your modular programming کا concept ہے آپ دیکھیں گے کہ ہر module جو ہے وہ بالکل چھوٹا سا ہے it's very easily understandable and we don't have to worry about pages and pages of code this again goes back all the way to the beginning of the course where we said کہ یہ ایک بڑا سا problem لیکے اس کے چھوٹے چھوٹے independent part کر دیے جائیں جو آپس میں انٹریکٹ کرتے ہیں اور problem solve کرتے ہیں لیکن ہر حصہ جو ہے that's a small standalone piece of code these will be the member functions and the friend functions and the member operators and the friend operators that we will be defining in our code so next time we will start talking about the code for this class matrix till that time اللہ حافظ