 اسلام علیکم آج ہمارا انٹردیکٹشنٹو پروگریمن کا تیرمہ لیکچر ہے آپ کو یاد ہوگا ہم نے ایرےز کی دیسکشن شروع کی ہوئی ہے آج ہم ایرےز کو لے کے کچھ آگے چلیں گے اور ٹو دیمینچل ایرےز کو مینیپلیٹ کرنے کی بات کریں گے اور پھر ہم ایک اپنا ایک پرولم لے لیں گے let's say a real world problem اور اس کو سارے سٹپس میں سے گزاریں گے جس کی بارے میں ہم نے دیزائن رسیپی میں بات کی تھی یعنی ڈائیز کریں گے اس کے function بنائیں گے سب کچھ کریں گے اور یہ problem جو ہے یہ ایرےز کے ساتھ ہی related ہوگا چلیں سب سے پہلے ہم کچھ ایرے مینیپلیٹشن کی بات کرتے ہیں ایرےز کی جہاں پہ بات آتی ہے تو میں نے پہلے مینشن کیا تھا کہ یہ ایرے ہے کیا چیز ایرےز کے اندر ہم ایک ہی کسم کا ڈیٹا سٹور کرنی کی کوشش کرتے ہیں یعنی we try to store identical or similar values in an array now when we say identical or similar what do we mean اس کا context کے ساتھ تعلق ہے یہ نہیں problem کونسہ ہے جس کو ہم حل کر رہے ہیں اب دیکھیں height کیسی individual کی وہ بھی ایک number ہے اور age جو ہے وہ بھی ایک number ہے ہم یہ قبی نہیں کرتے کہ height اور age جو ہے وہ ایک ہی ڈائیگ اندر رکھ لیں کیونکہ contextually they are different things ہم یہ ضرور کریں گے کہ ایک ڈیٹا ہے اس میں ہم کئی لوگوں کی height ڈیٹا سٹور کر لیں اور کوئی اور ڈیٹا ہے جس کے اندر اس کے اندر age ڈیٹا کر لیں لیکن ایک ڈیٹا میں ہم مکس نہیں کرتے ایرےز کے لئے جو سیملر ڈیٹا ہے کہ آپ پر پروسیس چاہتے ہیں اور وہ ملٹپل ڈیٹا کے لئے ایرے کے لئے ایرے کے لئے ایک ڈیٹا ہے دیتے ہیں ہم کس طرح کرتے ہیں اس کا کیا ہے پچھلی دفعہ بھی ہم نے ایک سامل میں تھوڑا سا mention کیا تھا جب بھی ڈیٹا آتی ہیں ہمارے سامنے تو ہم loops کے بارے میں سوچنے لگتے ہیں کہ ایک ڈیٹا ہے اس کے ساتھ کچھ کیا پھر دوسرہ ڈیٹا ہے کچھ کیا پھر تیسہ ڈیٹا ہے کچھ کیا and naturally that falls into an iterative structure so we are looping through a certain set of data ڈیٹا کیونکہ ڈیٹا ہم کرتے ہیں تو ڈیٹا ہے وہ ڈیٹا ہے وہ یاد ہوگا کہ c or c++ کے اندر arrays 0 ڈیٹ سے شروع ہوتی ہیں and they go up to some maximum value جب بھی ہم نے loops کی بات کی تھی تو ہم کہتے تھے 4 i equal to 0 i less than something i plus plus or something like that while کے اندر بھی ہم usually کرتے تھے i increment کر دیتے تھے کہیں پہ جاکے loop میں it falls very naturally into the concept take the first element so 0 ہو گیا کچھ کیا next element پھر گئے so you notice the loop counter is actually running so whenever we are processing arrays we are naturally looking at loops and processing arrays using loops now let's take a look at how do we process a two-dimensional array ڈیٹا ہے ہم کہتے ہیں ہمارے پاس ایک ڈیٹا ہے numbers کی two-dimensional array جب بھی میں two-dimensional array of numbers کی بات کرو you should think of a matrix matrix دیکھیاد ہوگی آپ کو it's an array of numbers with rows and columns اور ہر row column intersection پہ ایک number پڑا ہوتا ہے suppose میں آپ کو problem دیتا ہوں کہ یہ آپ کے پاس ایک two-dimensional array ہے let's say اس کا size 3 by 3 ہے for the moment simplest array اس میں کچھ number موجود ہیں ہم نے پہلے اس کو input کرنا ہے اور input memory میں لجاکے پھر ہم اس کو output کرنا چاہتے ہیں لیکن ہم output کرنا چاہتے ہیں اس کو کدی آخری row سب سے پہلے پرنٹ ہو پھر second last row and so on جب تک ہم first row سب سے نیچے نہیں پرنٹ کر لیتے لیکن اس کے اندر ہم چاہیں گے کہ column order جو ہے وہ وہی رہے یعنی the output would be last row first column then last row second column last row third column 3 by 3 ہے پھر second value row جو ہے وہ وہی رہے گی جو پہلے تھی second row first column second row second column second row third column اور اخیر پہ first row first column first row second column اور first row last column پھر ہم بہت ہی جانتے ہیں؟ پہلے بہت ساری حالی سنیس ایک پردوش کیا سکتم جائے یہاں دوسراحی فرمار سب سے جانتے ہیں آپ کو یاد ہوگا ہم ایرای مخدرہ کیا ہم کارتے ہیں کہ اگر ایی کا نام discount ای ہے تو ہم کہتیں پر حماان پر رو ٹیلل، انڈیکس پر چلوٹ ، پھرสکور برکٹ کھولا ، جزیہ پر حماان پر چلوٹ۔ یہ ایک س forms of the حوالے لائے۔ جو لوگ ہوں کہ ہے ، ہم اپر مستقبل جاتا ہوں، ہم تورک پہلے رہا جیسے کو جاہا ہوں۔ ہم اپنے باتی میں بکی چیزیں نہیں بتاتا ہے۔ اخری باتی میں ، کے جیسے باتی میں کامل ہے ، انکران پرپرکان پھر سکتے ہیں، جلوی ڈیجیا سے İstanbul'dے کارکوں پہلے ہمیں ہمیون کرتے ہیں۔ اس کے ایرے کو دمیشن دیکھیا ہوںتا ہے۔ کہی ڈیجیای کا ا کارک مہاد ہوں، اذن کے باروں کو مہاد ہوا پر پر دفعہ کیا۔ پھر ہم نے کہا کہ اکران مہاد ایرے کو دمیشن کیا ہوا ہے کہی ڈیجیا کو مہاد ہوا ہے، مہاد اکران مہاد ایرے کیا ہے۔ ایرے دیکلیر کی let's say int a of max calls max rows and then max calls اس کے بعد ہم نے اس کو انپوٹ کرنا ہے تو انپوٹ بھی وہی دبل نیستیڈ لوپ کے ساتھ ہوگی تو اگر ہم وہی جو انٹیجر ویریابلس ہم نے row and column کے لیے لکھی میں ان کے ساتھ ہم for لوپ لگا لیتے ہیں لہذا ہم کہتے ہیں کہ for row equal to zero remember array start from index number zero لہذا ہم کہتے ہیں کہ for row equal to zero row less than max rows increment row میں گریزی بول رہا ہوں سی میں it will be row plus plus اس کے بعد ہم نے opening grace دی اور پھر اندر والی لوپ شروع کی جو columns کو process کرے گی اس کو ہم لکھیں گے for call equal to zero call less than max calls call plus plus پھر opening grace آگئی inner for loop کی opening grace تیک ہے کہ میں for block ہوں braces کے اندر انکلوز کر دوں even if the block contains only one statement it's a matter of programming style but when blocks are clearly visible and no problem is there یہاں پہ ہم نے matrix input کرنی ہے تو ہم see in استعمال کر سکتے ہیں if we want to be polite we can even give a prompt saying please enter the value of element number اور آگئے row اور call کی values دے دیتے ہیں so پھر see in کے ساتھ ہم کہیں گے see in greater than a of row call اور دیکھیں وہ لکھتے کیسے ہیں a پھر square brackets کے اندر row پھر علیادہ square brackets کے اندر call اس چیز کا خاص خیال رکھے گا کہ whenever we using multi-dimensional arrays in c یا c plus plus the indexes are not written as row comma call ہم طور پر میت میں ہم رو comma call لکھ دیتے ہوتے ہیں اور language میں بھی اس طرح سے لکھا جاتا ہے لیکن c کے اندر علیادہ سے square brackets کے اندر پہلہ اندیکس آتا ہے پھر علیادہ اپنے پیر of square brackets کے اندر دوسرہ اندیکس آتا ہے and so on most c and c plus plus compilers will support up to 12-dimensional arrays so کافی لمبی چوڑیہ پرے بنا سکتے ہیں لیکن وہ سوچنا پڑتا ہے کہ بارہ dimension میں پورا کیا چیز آئے گی any way اب see in کر کے ہم نے matrix input کر لی ایک ایک element پڑکے اب اگر ان کو دیکھیں ہمارا جو nested loop structure ہے کر کیا رہا ہے کرتا ہے سب سے پہلے ایک row لیتا ہے let's say row equal to zero اس کے بعد ساتھ ہی ہم اندر والی loop شروع کر دیتے ہیں وہ کہتا ہے read column number zero پھر column number one پھر column number two remember in this case max rows max calls کی value ہم two رکھی ہوگی کیونکہ number of rows and number of columns would be three in this case وہی بات کے جی see کی indexing zero سے شروع ہوتی ہے جب ہم نے ایک پوری row پڑ لی so zero zero zero one zero two تو اندر والی loop ختم ہو جاتی ہے اندر والی loop ختم ہوتی ہے تو آپ واپس اوپر والی loop پی آتے ہیں جو کہتا ہے row plus plus so row becomes one zero تھی zero plus one is equal to one پھر آپ اندر والی loop میں داخل ہو جاتے and you go and read column number zero column one column two in a way you are reading row two i.e. the index is one but it's row number two اس کا پہلہ column پھر دوسرہ column پھر تیشہ column کی values آپ پڑھ رہے ہیں وہ ایرے میں سٹور کرتے جا رہیں اور پھر اندر والی loop ختم ہوئی تو بہر آئے تو it is now the third row پہلے first column کی value پڑی پھر second کی پڑی or third کی پڑی input ہو گئی matrix اب اس کو ہم چاہتے ہیں کہ جی فلپ کر کے display کیا جائے کیسے کریں گے ہم اس کے کئی طریقے ہیں ایک تو آپ سوچنے لگ پڑے ہوں گے جی اس میٹرکس کو اولتانا کیسے ہے تاکہ ایک اندر وہ روز انٹر چینج ہو جائیں یا ہم کوئی نئی میٹرکس دیفائن کریں جس کے اندر یہ پوری 2D array کی values کوپی کر لیں لیکن کوپی کرتے وے ان کو اولتا لیں لیکن you have to keep in mind کہ یہ problem ہم نے کیا سٹیٹ کیا ہے ہم نے problem سیمپلی کہا ہے کہ جی ایک انپوٹ کر کے میٹرکس کو اس کو reverse order میں reverse row order کے اندر آپ نے display کرنا ہے سو ہم not saying کہ جی میٹرکس کو in the computer's memory کچھ بھی کریں کہہ رہا ہوں سیمپلی display it with the last row first سو what do we do look کسی کتاب میں کسی صحیفے میں کوئی ایسی چیز نہیں لکھی ہوئی کہ جی for loop ہے وہ ہمیشا 0 سے شروع ہوگی اور کسی بڑے نمبر تک جائے گی اور loop counter جو ہے وہ increment ہی ہوتا رہے گا کیونہ ہم کوئی ایسی loop run کر دیں جو کہہ کہ جی آخری row سے شروع کرو اور پہلی row تک جاؤ اور row counter کو decrement کرتے جاو can we do that of course we can do that there is nothing in the rules that allows us that does not allow us or prohibits us from going backwards in a loop so very simple programming trick صرف اس میں خیال کیا رکھنا ہے کہ جی index کی value کیا ہے ہم نے کہا کہ جی size max rows جو ہے وہ 2 رکھا بہتا کہ یہ 0 سے لے کے 2 تک process کرے یا اگر آپ max rows 3 رکھلے تھے indicating the number of columns ٹھیک ہے کیونکہ declaration کے اندر max rows آپ نے استعمال کیا for declaring the array so max rows کی value would have been 3 if you come back and now use it as a loop counter you can only go up to max rows minus 1 that is the last row according to c indexing rules so how do we do it simple وہی والا nested loop structure ایک بہر loop ایک اندر loop لیکن بہر والی loop جو ہے جو روز کو count کر رہی ہے وہ آخری row سے شروع ہو آخری row کا index ہے max rows minus 1 اس کے بعد پہلی row کا index ہے 0 so we say for row equal to max rows minus 1 سیمیکولن رو greater than or equal to 0 یعنی آپ بڑی value سے چلکے آپ چھوٹی value کی طرف جا رہے ہیں so I'm just saying کہ 0 پر ہے بڑی value نیچہ ہے تو آپ اس طرف کو جا رہے ہیں so the second test ہے loop test that is for row greater than or equal to 0 because the first row is index 0 اور اب row counter کو کرنا کیا ہے row minus minus لیکن exactly جس طرح سے row plus plus ہم نے کیا تھا جس کا مطلب ہے row is equal to row plus 1 where row is an integer variable اب ہم لکھ رہے ہیں row minus minus یہ ہے decrement operator good shorthand it means row is equal to row minus 1 so اب اگر صرف اس loop کو چلائیں تو it'll run 2 1 0 اس طرح سے چلے گی یہ for loop آگئی جو کہ rows کو ہندل کرے گی اس کے اندر ہم نے braces ڈال کے second nested loop چلائیں وہ ہے for call equal to 0 call less than max calls call plus plus یہاں پہ loop کا order وہی رکھا because what we are saying is third row first element third row second element third row third element یہ سب سے پہلے پرنٹ ہوگا اب اگر اس کو ہاتھ سے بھی اب چلا کے دیکھ لیں so you will find کہ جی پہلے third row پرنٹ ہوگی پھر second ہوگی پھر first ہوگی so we have successfully flipped a row as far as output or flipped a matrix as far as output is concerned again because we defined the constant integer max rows and max calls up at the top of the program اگر آپ اس کو modify کرنا چاہیں to run it with larger matrices all you need to do is just change the value of the constants at the top the rest of the program remains the same آپ اپنے لیے program لکھیں اور اس کو چلا کے دیکھیں کہ جی میں ایردر اس میں انپوٹ کیا اور اوٹپوٹ میں یہاں میں ایردر ملا to be even nicer what you should do is first print the matrix out تیک ہے نا see out کر کے آپ matrix کے سارے elements print out کر لیں as stored in the memory اور پھر یہ reversal output کریں جس میں آخری رو اوپر آئے پھر اس سے آخری آئے etc till you come to the first row and you will be able to see on your screen that yes your program work the rows were reversed now how do you output a matrix تاکہ نظر آئے تھوڑی سی need formatting ہوئی ہو formatting actual formatting ہم بعد میں بات کریں گے جب ہم IO streams و گیرہ کے اوپر آئیں گے for the moment it's enough to remember کہ جی ایک کرکٹر میں نے آپ کو بتایا ہوئے backslash t backslash t character جو ہے وہ ٹیب جتنی space دیتا ہے بیچ میں so if you were to do something like کہ جی وہی double nested loop استعمال کریں جو input کیلئے کی ہے وہی output کیلئے چلتی ہے وہی loop لیکن see in کی جگہ پر see out آگیا so outside the loops you could see out something like the original matrix is آپ loop کی اندر آپ کہتے ہیں see out less than less than a of row call semi colon اتنا کر دیں گے تو سارے نمبر ساتھ سا جڑے بے ایک لائن پی آ جائیں گے ہم چاہتے ہیں ہر نمبر کے بعد کچھ space چھوڑی جائے تو آپ چاہتے ہیں کہتے ہیں کہ جی see out less than less than a of row call پھر less than less than single quotation marks میں آپ لیکنیں backslash t یہ کیا کرے گا کہ ایک نمبر output کرے گا ساتھ ہی ایک space output کر دے گا سو ایک جگہ چھوڑ جائیں گے آپ نمبر کے درمیان جب ایک row ختم ہو جاتی ہے اب کیا کریں کیونکہ unless we do something یہ آگے کو دوسی row لکھنا چروہ ہو جائے گا so what we do is جب inner loop ختم ہوتی ہے تو جب outer loop پی آتے ہیں outer loop goes to the next row before processing the next row we say something like see out less than less than single quote can get backslash n I already mentioned earlier in fact almost in the early lectures کہ جی backslash n جو ہے وہ ایک special character ہے جو کہ new line پے چلا جاتا ہے وہ cursor کو new line پے لے جاتا ہے so that means پہلی row output ہو گئی new line پے گئی دوسی row output ہو گئی new line پے گئی t-st row output ہو گئی so look at the logic and try to understand it and be aware that it's almost all the time whenever you're manipulating arrays one-dimensional array ایک loop two-dimensional array a nested pair of loops three-dimensional array third level of nested loop تیک ہے اس کی processing عام طور پے اس طرح سے ہو رہی ہوتی ہے دیکھیں یہاں پہچ بھی نہیں تھا کوئی serious problem نہیں ابھی ہم نے حل کیا لیکن ایک سیمپل سی چیز processing of arrays کی بات کی چیلے اپنے طور پہ آپ ایکسرسائز کریں کہ جی وہی matrix input کر کے اس کو reverse column order میں پرنت کریں یعنی اب روز وہی رہیں گی لیکن columns آپس میں reverse ہو جائیں گے ایکری column پہلے پرنت ہو پھر second last and so on till you print the first column at the end so give it a try not very difficult but remember کہ وہی loop پیچھے کو چلایں گے تو آسانی سے یہ کام ہو جائے گا let's move on to a slightly more practical problem ایک جو matrixیز کے ساتھ ہمیں constant requirement ہوتی ہے کہ جی matrix کو transpose کر دیا جائے maths والے کہیں گے وہ ہمیں تو آتا ہے باکیوں کے لیے میں explain کرتا چلو maths والے بھی سن لیں کہ جی matrix کو transpose کرنے کا مطلب یہ ہوتا ہے کہ اس کی row اور column کو آپس میں interchange کر دیا جائے یعنی first row becomes the first column in the transpose matrix second row becomes the second column in the transpose matrix third row becomes the third column and so on till we are done for our purposes اس وقت ہم ایک simple problem لیتے ہیں جس میں ہم square matrix کے ساتھ دیل کر رہے ہیں جتنی اس کی rows ہیں اُتنے ہی اس کے columns ہوں گے so one کہلیں کہ جی max rows is enough یا اس کو array size کہلیں whatever because جتنے rows ہیں اُتنے ہی array size اگر rows ہیں array size اس کے columns ہوں گے so how do we transpose an array اگر اس کو آپ مثمتیکلی لکھیں تو you will say کہ جس کی definition یہ ہے کہ جی نئی row column جگے کے اوپر پورانہ column row والی value لکھ دی جائے so it is like a of i j should be replaced with a of j i where i and j i'm using as row and column indexes so how do you suggest we do this I'm sure everybody is thinking now کہ جی nested loops absolutely right nested loops so let's say our array is a اس کی جو dimension ہے وہ array size ہے تو ہم ایک nested loop کا پیر لکھتے ہیں کہ for row equal to zero row less than array size row plus plus braces ڈالیں اندر والی loop ڈالیں for column equal to zero column less than array size column plus plus پھر اس کے اندر آ جائیں اور اب انٹر چینج کرتے جائیں پہلی چیز انٹر چینج کرتے وقت آپ کو خیال رکھنا پڑتا ہے can we simply say a of row call equals a of call row no we cannot یاد ہوگا جب بھی دو میمری لوکیشنز کو آپس میں آپ سوپ کرنا چاہتے ہیں تو سوپنگ کے لیے آپ کو ایک تیسری جگے چاہی ہے ہوتی ہے پہلے ایک چیز کی value علیدہ رکھ دی جائے پھر اس میں نئی value ڈالی جائے اور جہاں سے وہ value ڈالی تھی اس میں وہ space جو اپنے allocate کر کے جگے وہاں پہ value store کی وی تھی اس کو پرانی جگے پہ لکھ دیا جائے تو you have to run a little shop mechanism so let's use a temporary variable call it temp چیکنے I normally put in tmp or something like that and you can say temp is equal to a of ij یا a of row call next line a of row call equals a of call row so یہ overwrite ہو جائے گا it's an assignment اسی باستے ہم نے اس کی original value دیو تھی وہ temp میں save کر رکھی ہے اور آخری swap کی لائن آجائے گی a of call row equals temp اب row or column کی value ایدر کی column row کی value یہاں پے رکھی اور جو original value تھی اس کو call row والے index پے رکھ دیا nested loop ختم swap کی ختم problem solved is it I would strongly recommend that you actually run it yourself and you convince yourself that you have a problem do you know where the problem is کسی نے دیکھا ہے the interesting thing is that in this processing of all elements ہم کر کہہ رہے ہیں ہم کہتے ہیں کہ یہ پہلے element جو پہلہ row پہلے column پے element بیٹھا بے اس کو اپنے ساتھ swap کر دو کچھ نہیں ہوگا اس کی value بہر جائے گی اس کی value اندر آجائے گی وہ value وہیں کی وہی رہے گی which is all right transpose جب ہم کر رہے ہیں rows and columns کو انٹر چینچ کر رہے ہیں تو جو diagonal elements ہیں سارے matrix کے ان کی values ان چیز دہیں گی because they're the row and column indexes are the same so 00112233 in positions پہ جو elements ہیں وہ وہی کے وہی بیٹھے رہیں گے اس کے بعد ہماری یہ nested loop structure سے کیا ہوتا ہے row one یعنی پہلی row کہنا چاہی which is row number zero سال سے پہلی دوسری row one کا جو second element ہے that is now interchanged with column one کا second element so جو row one کا second element جو ہے وہ row two کے first element کے ساتھ انٹر چینچ ہوگا so you think of it row and column so پہلے column کا second element جو ہے which is second row first element اس کے ساتھ وہ interchanged ہو جاتا ہے جب آپ اس سے آگے جاتے ہیں تو پہلی row کا تیسرہ element جو ہے وہ تیسری row کے پہلے element کے ساتھ swap ہو جاتا ہے and so on جب آپ second row کو process کرتے ہیں اس پر کیا ہوگا second row کا پہلے element کس کے ساتھ swap ہوگا so by definition row call becomes call row so second row کا پہلے element جو ہے وہ پہلی row کے second element کے ساتھ swap ہو جائے گا wait a minute isn't this the same element جو کہ پہلی loop میں ایک دفعہ swap ہو چکا ہے so what happens is کہ وہ elements جو ایک دفعہ swap ہوئے تھے if you run both the loops وہ پھر واپس swap ہو جاتے ہیں and if you say a sit in chair number two اور بعد میں کہتے ہیں please now sit in chair number one تو original matrix remains undisturbed so we have to be careful کیا کیا جا think about it does anybody see the solution I mean I would have loved to give this as a programming exercise but then this exercise is so obvious جو تھوڑی دے کے بعد let me explain it here idea یہ ہے کہ اگر آپ square matrix لی اور کارس پے بشاک بنالیں اس کو اگر diagonally آپ کاتیں تو اس کے دو تکون حصے بن جاتے ہیں we call this the upper triangle and the lower triangle whatever آپ نے صرف ایک ٹرائنگل کو دوسرے ٹرائنگل کے ساتھ انٹر چینج کرنا ہے پوری matrix کو انٹر چینج نہیں کرنا otherwise وہ دو دفعہ انٹر چینج ہو جاتی ہے اور original شکل اختیار کر لیتی ہے so your question یہ ہے کہ جی یہ جو ٹرائنگل ہے اس کی limits کیا سی ڈیٹرمین ہوں so آپ conceptually اگر ٹرائنگل بنائیں matrix کا تو دیکھیں گے جی روز تو ساری پروسیس ہو رہی ہیں تیک ہے نا پہلی بھی کرنی ہے دوسری بھی کرنی ہے کیونکہ ٹرائنگل ہر رو کے وکرس کر رہا ہے اسی طرح کولم بھی سارے پروسیس ہو رہے ہیں کیونکہ پہلے ٹرائنگل جو ہے وہ کولمز بھی سارے جتنی چڑائی ہے وہ ٹرائنگل کور کر رہا ہے صرف فرق کی ہے کہ ہر رو کو شروع کرتے باک آپ beginning کے elements کو پروسیس نہیں کریں گے آپ رو کی processing جو ہے وہ diagonal element سے لے کے رو کے اخیر تک کریں گے what does it mean practically practically means that for every مطلب کولم loop جو اندر والی loop ہے you don't start with zero you start with the current row number دیکھیں وہی بات آجائے گی آپ پہلی رو جو ہے اس کو process کرتے ہوئے آپ zero zero سے شروع کریں گے row column اور zero array size minus one تک جائیں گے پہلے سارے elements جو تھے وہ پہلے سارے column کے اندر آ جائیں گے جب آپ next row پہ گئے آپ row one and column zero کو process نہیں کریں گے کیونکہ وہ پھر reverse ہو جائے گا so what do you do row number مطلب index number one column one سے شروع کرتے ہیں so it is 1,1 up till 1, array size minus one third row میں you start پہلہ بھی چھوڑنے دوسرہ بھی چھوڑنے 2,2 سے شروع کریں گے so element جس کی row column value ہے 2,2 in the index structure وہ 2,2 سے شروع ہوکے 2, array size minus one تک جائے گی اس طرح سے اگر آپ loop structure کریں گے تو یہ صرف ایک دفعہ upper triangle process ہوکے وہ lower triangle میں آ جائے گا or matrix جو ہے وہ transpose ہو جائے گی do this yourself as an exercise and make sure it works do it with the brute force concept جی دو loops لگانی اور پورا چلیں گی and then do it with this one as an exercise try to do it the other way آپ کہیں کہ جی نیچے والے triangle کو اوپر لیکے جانا ہے کیسے کریں گے the process here as is obvious would be کہ ہمیشہ 0 سے شروع کریں لیکن کہیں پے جاکے رکھ جائیں diagonal value پے جاکے رکھنے row کے اخیر تک نہیں جانا anyway these are exercises کہ آپ کو آپ کو کیسے کریں گے please do them so that you understand کہیں کسے ہو رہی ہے for the rest of the lecture what we will do is we will take one problem it's not very complex but we will follow it through rigorously through all the steps that ہم نے بہت شروع میں بات کی تھی ایک design recipe کی design recipe کے سارے steps کے through اس problem کو گزارتے ہیں اور پھر دیکھتے ہیں کہ جی اس کا حل کیا نکلتا ہے یہ real world problem ہے کیا دیکھیں جی ہمارے دفتر میں سارے لوگ تنخائیں لیتے ہیں we are all taxpayers we are very honest taxpayers sometimes an interesting situation develops situation ایسی ہو جاتی ہے کہ جی ایک شخص ہے اس کی salary let's say جی 10,000 روپے مہینہ ہے اس کے اوپر government کی rules کے مطابق ایک certain percentage income tax لگتا ہے چیکنہ ہر مہینے دیدکت ہوتا ہے government کی treasury میں جمع ہو جاتا ہے لیکن اگر اس کی salary 10,000 سے زیادہ ہو تو اس کو کسی اور ریٹ سے tax لگایا جاتا ہے 20,000 روپے مہینہ سے زیادہ salary جو ہے اور زیادہ ہو کوئی اور ریٹ لگتا ہے یہ tax labs کہلاتے ہیں نہیں ہے accounting کا problem نہیں ہے but it's a real world problem کوئی بھی payroll process کرنا ہوں تو اس کے اندر آسکتا ہے interesting situation یہ بنتی ہے کہ اگر کبھی tax rates کے اندر کوئی anomaly رہ جائے لیکن وہ پوری طرح سے rationalize نہ ہوں تو ایک شخص جو کہ ایک خاص level کی salary رہا ہے تو اس کی deduction کے بعد جو وہ تنخاء گھر لے کے جاتا ہے وہ کئی دفعہ کم ہو جاتی ہے as compared to an employee اور a colleague جس کی actual salary کم تھی اس سے لیکن اس پر کم tax لگا so ہمارے پاس problem یہ ہے کہ suppose ایک company ہے جس میں 100 یا 100 سے کم employees ہیں میں کوئی maximum limit رکھ لی ہے ان سب employees کی salaries آپ کو بتا دی گئے ہیں اور ساتھ tax rates بتا دی گئے ہیں آپ بتائیں کہ وہ کون سے ایسے unluckی individuals ہیں جو اپنی تنخاء جو گھر لے کے جاتے ہیں this is a net salary وہ کم لے کے جاتے ہیں as compared to their colleagues جن کی actual salary کم ہے لیکن کیوں کہ tax ان کا کم deduct ہوئے تو وہ گھر زیادہ پیسے لے کے جا رہیں this is an interesting problem now as per our design recipe let us see what steps we need to follow design recipe آپ کو یاد ہوگا اس نے کہا جی پہلے تو problem کو analyze کریں analyze کر کے اس کو کسی ایک concise precise statement میں آپ لکھیں کہ جی problem ہے کیا اور اس کے بعد maybe this precise statement کو formulate کرتے وے کچھ examples بھی ساتھ دے دیں i.e abstract analysis کے بعد ایک سامپل بھی دے دیں کہ جناب یہ ایک سامپل ہے جو کہ illustrate کرتا ہے یہ problem ہے کیا اور اس کے اندر کیا values آسکتی ہیں once this phase is complete we go on into the design phase which means we do some detailed designing کہ جی کونسے function اس کے بنتیں یا اس کا sudo code کیا ہے اور اس کو ہم پھر وہ والی precise language جو کہ computer understand کرتا ہے اس کے اندر لکھتے ہیں which is the actual programming اس کے بعد اس کو چلاتے ہیں اور اس کو test کرتے ہیں اور evaluate کرتے ہیں output کو and make sure things work as expected so when we go to the first step which is analysis تو اب کیا کریں گے پہلے تو ہے کہ جی precise problem statement ہمارے پاس آجائے اس کے بعد once that statement has been established we try to determine کہ جیسی program کی inputs کیا ہوں گی کیا دیتا ہے اس کو دیا جائے گا جو یہ process کریں جب inputs determine ہوگئے ساتھ اس کے ہم determine کریں گے کوئی ایسی چیز تو نہیں کوئی constants تو نہیں جو ذہب ایسی manipulation کی لیے چاہیں جو constants ہیں ان کو بھی determine کر کے ہم list کر دیتے ہیں اس کے بعد ہم اس کو split up کرتے ہیں into function and modules et cetera پہلے this problem کی کوئی precise یا concise statement بنا societal Mitte کوشش کرے آئے given tax brackets and given employee gross salaries دیترمین دوز امپلویز who actually get less take-home سیلری than others with lower initial income اب یہ اس کی ایک پریسائی سٹیٹمنٹ آ گئی پروبلم کی لیکن اس کے ساتھ کچھ اگزامپل ہو جائے تو اچھا ہے سپوز ہمارے پاس جو لو ہے اس وقت ٹیکس دیدکشن کا وہ کہتا ہے کہ جی 0 سے لے کے 5,000 تک جس کی سیلری ہے اس کا کوئی ٹیکس دیدک نہیں ہوگا 0% ریٹ پے چلے گا جن کی سیلری 5,000 ایک روپے سے لے کے 10,000 روپے تک ہے ان کے اوپر 5% انکم ٹیکس دیدکٹ کیا جائے گا جن کی سیلریز 10,000 ایک روپے سے لے کے 20,000 روپے تک ہیں ان کے اوپر 10 فیصد انکم ٹیکس دیدکٹ کیا جائے گا اور دیکھنے کیا سیلری جن کی سیلری 20,001 روپی اور اپ ہوں گی ان کے اوپر 15 فیصد انکم ٹیکس دیدکٹ کیا جائے گا ان روپے کو لے کے لیتا سیلریز ٹیکس دیدکٹ کیا جسے ہمیں نظر آئے کے جی مسئلہ ہے کیا دیکھیں اگر کسی کی سیلری 10,000 روپے مہینہ ہے تو از پر آر روپے اس کے اوپر 5% ٹیکس لگے گا 5% of 10,000 is 500 روپیز 500 روپیز دیدکٹ کیا وہ گھر 9,500 روپے لے کے جا رہا ہے اب وہ انفارٹنٹ اندیوڈیوڈیوڈیوڈی جس کی سیلری 10,000 اور ایک روپے آئے وہ تو نیکس برکٹ میں آگیا نیکس برکٹ میں آیا تو ہم نے از پر the rule it says کہ جی 10% انکم ٹیکس دیدکٹ ہوگا وہ ایک روپے کو چھوڑ بھی دیں تو 10 فیصد جو ہے of 10,000 will be 1,000 روپیز اس کا ٹیکس actually ایک ہزار اور کچھ پیسے دیدکٹ ہوگا that means اس کی ٹیک ہوم سیلری جو ہے وہ 9,000 کے لگ بھگ رہ جاتی ہے so here is a worked out example saying look if the salary is 10,000 the take home salary is 9,500 but if the gross salary جو ہے وہ 10,001 روپی ہے then the take home salary is almost 9,000 interesting gross salary زیادہ تھی سیکنڈ اندیوڈیوڈیوڈ کی لیکن take home 500 روپے کم ہو گئی ہے یہ ہمارا problem ہے اور ہم کرنا کیا چاہتے ہیں کہ جی اس کمپنی کے جتنے امپلویز ہیں ان کی پہلے تو سیلریز کالکلیٹ کریں کہ جی gross تو ہم نے دیدی نیٹ سیلری کیا بنتی ہے once that calculation has been done we want to determine کے ایسے انلکی اندیوڈیوڈیوڈیوڈ کو کون لوگ ہیں so that is the precise problem statement along with and let's say an example to exemplify the problem next step we go and we do the analysis of the requirements when we look at the requirements we say look how do we input the salaries of these people ایک تو problem statement ہم نے کہا تھا کہ جی یہ کمپنی کے سیلری employees جو ہیں وہ سو یا اس سے کم ہیں اچھا problem کے اندر یہ بھی شامل کر لیں کہ یہ two dimensional arrays or one dimensional arrays استمال ہوں گی for solving this problem وہ تو ہم نے آپ کو بتایا so so employees اگر ہیں یا اس سے کم ہیں تو ہمیں ایرے کا سائز تو پتہ چل گیا کہ جی کتنی بڑی arrays رکھی جائیں گی لیکن آج جس کمپنی کو ہم انلائز کرنے جا رہے ہیں ہمیں یہ نہیں پتا کہ جی اس کے آج employees ہیں کتنے so it makes sense کہ use سے input لے لی جائے کہ جی 45 employees کا دیتہ آرہا ہے یا 35 employees کا آرہا ہے یا 73 employees کا دیتہ آرہا ہے so come as come number of employees input ہوگا once we have determined the number of employees then for each employee we shall input the gross salary of that employee so gross salary input ہوگی اس کے سٹور کرنے کے لیے کوئی جگہ چاہیے ہم کہتے ہیں کہ جی اس کو سٹور ہم کریں گے ایک two dimensional array میں جس میں پہلے کولم میں اس کی gross salary آجائے گی اور دوسرے کولم کے اندر ہمارا program جو ہے compute کرے گا جی tax deduct کرنے کے بعد اس کی net salary کیا بنتی ہے وہ ہم دوسرے کولم میں لکھ دیں گے یہ تو ایک salary computation ہو جائے گی اس کے بعد تیسرہ حصہ یہ آتا ہے کہ جی اب درہ انلکی individuals کو locate کیا جائے تو اب یہاں پہ تھوڑا سا analysis اور algorithm والا حصہ آتا ہے کہ جناب جس کو locate کرنا کیسے ہے اس کو locate کرنے کے لیے ہم موٹی موٹی بات کرتے ہیں all right کوئی طریقہ ہوگا یہ ابھی میں higher level design کی بات کر کوئی طریقہ ہے جو differentiate کرتا ہے کہ جی individual a کی salary gross جو ہے وہ زیادہ ہے as compared to b لیکن اس کا take home جو ہے وہ کم ہے as compared to b ہم کہتے ہیں کہیں کہیں پہ بھی ایسا جوڑا نکل آیا تو وہ پہلے والا employee a جو ہے وہ he is one of the unlucky individuals اور اخیر پے ہم کیا کرنا چاہیں گے ہم اس کو output کرنا چاہیں گے a list of those unlucky employees in this case for our simple problem we will simply output a list of employee numbers کہ یہ پہلہ employee unlucky ہے 5 one lucky ہے 7 one lucky ہے اور 12 one lucky or whatever the result comes out to be اگر ہم اسی problem کی space یا storage requirements کو work out کریں تو میں نے کہا کہ جی ایک تو 2 dimension لے رہے ہو جائے گی جس میں gross or net salary رکھ لیں گے لیکن ہم نے ایک list of employees unlucky employees بھی output کرنی ہے that means کہ ہمیں list کو store کرنے کے لیے بھی جگہ چاہیے اس problem کے لیے ہم کیا کریں گے ہم ایک one dimensional array رکھ لیں گے let's say integer کی اس ایرے کے اندر ہم کریں گے یہ کہ جی پہلے سارے zero's لکھ دیں گے اور zero کا مطلب ہوگا یہ lucky ہے ان کو زیادہ تنخہ ملتی ہے تو زیادہ ہی گھر لے کے جاتے ہیں اور جہاں پہ ہمیں کوئی ایسا employee ملاف in the 2 dimensional array جس کی take home salary کم ہوگی as compared to some other employee with a lower gross salary اس جگہ پہ ہم اس one dimensional array میں one لکھ دے جائیں گے so یہ ایک اسم کا جھنڈہ ہے ایک سفلاگ saying that the zero employees are lucky by default all are lucky when you come to an anomalous situation وہاں پہاں پہاں one لکھ دیا so we know employee number 43 کے آگے one لکھا ہے so employee number 43 جو ہے نا he is an unlucky individual اس کی salary کم ہے تو یہ اس کی storage requirement ہوگی program کی اس کے بعد ہم interface issues کی بات کر لیتے ہیں تو interface guidelines وہی ہیں be polite try to explain what is required of the user تاکہ program جب چلے تھوڑا سا وہ explain کر دے کہ جناب یہ آپ سے چاہیی یہ دیتہ انپوٹ کریں so they will be prompts in there you will obtain the data and then so input ساری ہم کہیں گے keyboard سے آ رہی ہے اور اس کے ساتھ ہم کہیں گے the output you have وہ ہم screen پہ چاہیے so ایک اسم کا ایک rudimentary interface analysis ہو گیا اب کیا کریں اب دیکھیں کہ program کو ہم نے تقریبا موٹے موٹا تین چار ہی سمے distribute کر دیا ہے ایک input ہے ایک salary calculation ہے ایک identification of the unlucky individuals ہے اور ایک output ہے so let's go and start looking at the code or the detailed design of this program in true tradition یہ جو میں نے چار یا پانچ building blocks آپ کو باتا ہیں these should be function calls so the main program should be very very simple کہ مین کے اندر ہو get input کیا نا calculate salary locate unlucky individuals display output بات ختم arrays جو ہیں وہ ہم نے declare کرنی ہے main کے اندر ہم نے پہلے بتا دیا کہ جی maximum number of employees 100 ہے تو اس کو تو const کر کے آپ declare کر دیں تا کہ array کسی نام کے ساتھ declare ہو سکیں so if we say کہ جی the array size جو ہے وہ const int array size equal to 100 ہے تو جو 2 دیمینشنل ایرے ہے جس میں salary store ہوں گی اس کی declaration جو ہے وہ ہو جائے گی int a پہلے square brackets کے اندر آپ لکھیں گے array size because that is the number of rows it basically depicts the number of employees in the company and the second dimension of this array will be simply 2 2 columns کی array بن رہی ہے پہلے میں gross salary آئے گی دوسرے کے اندر net salary آئے گی اس ایرے کو کچھ نام دے دیں let's say sell اس ایرے کو ہم کچھ بھی نام دے دیں let's call it lucky lucky array کے بارے میں ہم نے یہ کہا تھا کہ جی اس کو ہم انیشلائز کریں گے to all zeros اور جو انلک ہوں گا اس میں اس کی value 1 کر دیں گے so let's say اس کی declaration جو ہے would be int lucky square brackets میں array size max amps whatever it is equal to curly braces کے اندر zero ایک zero لکھ دیں curly braces close semi colon that is the array initializer پسلی دفعہ بھی بات کی تھی تھوڑا سا touch کیا تھا کہ جی arrays کو initialize کیا جا سکتا اس طریقے سے so in this case all elements of the lucky array will be set to zero once this has been done یہ میں کے اندر we have to go and say کہ جی input data function جو ہے اس کو چلا لیا جائے وہاں پہ ان کی salaries پڑھ لی جائیں اب input data کی اندر ہم value پڑیں گے number of employees کی لیکن upper limit ہم نے رکھتی saw so number of employees تو input کرے گا user keyboard سے اگر وہ function کی اندر input کرا لیا تو کیا problem کیا آئے گا well actually input کرانے میں problem نہیں ہے declaration میں problem ہے declaration میں problem یہ ہے اگر تو numb amps that variable that stores the current number of employees that we want to process if that numb amps is declared inside the input function what will happen is it will be local to that function جب اب process کر کے واپس میں کے اندر آئیں گے تو numb amps نہ ہوگا نہ اس کی value پتا ہوگی so better یہ ہے کہ numb amps وہ میں میں declare کیا جائے by problem یہ آ جاتا ہے اگر میں میں declare کیا جائے تو وہ input function کو کیسے پتا چا لے گا input function میں numb amps کو بھیجنا پڑے گا either through a call by reference یا numb amps کو global بنادیں تا کہ جتنے ہمارے پاس functions ہیں ان کے اندر یہ variable available ہو global variables مطلب they are useful but they are also tricky جیسے کہتے ہیں کہ جی they exist when we need them but they also exist when we don't need them so maybe it is better کہ ہم numb amps تو ہے integer variable which is going to contain the number of employees whose salaries we want to analyze this is declared in the main function and then passed by reference into the input data function so input data function کو جو چیز ہم pass کریں گے وہ ایک تو ہوگی array cell جس کی دو dimension جس میں دیتا ہم نے پڑنا ہے so you would have something like function جو ہے get input so we say get input int cell square bracket اب دو square bracket ڈالیں input کے لیے کیا کریں function call کے اندر یہاں پہ ایک اور rule کا آپ کو پتا ہونہ لازمی ہے جب بھی ہم one dimensional array پاس کرتے ہیں function کو تو اس function کی prototype میں ہم لکھ دیتے ہیں something like f اور پھر parentheses کے اندر ہم دے دیتے ہیں int a square brackets خالی square brackets یہ اس function کو بتا دیتا ہے کہ جناب ایک array آ رہی ہے اور ساتھ ہم usually پاس کرتے ہیں array کا size تاکہ وہ array process ہو سکے جب اب two dimensional array پاس کرتے ہیں تو there is a subtle problem problem یہ ہے کہ receiving function کو یہ نہیں پتا کہ جناب اس array کے columns کتنے ہیں so it does not know where one row ends and the next row begins because that depends on the number of columns so what you have to do is you can leave the row square brackets empty in the function call جو کہ receiving function کا prototype ہے but you must specify the number of columns in that array اس کی وجہ یہ سوچیں زرا کہ computer جو ہے وہ memory کے اندر ایک two dimensional array کو store کیسے کرتا ہے it may store ایک پوری row اور پھر next row اور پھر next row and so on memory تو ایک continuous set of locations ہے نا so اگر یہ پتا کرنا ہو کہ جی پہلی رو جہاں ختم ہوئی ہے تو دوسی رو شروع کہاں سے ہوئی ہے you have to know کہ جی پہلی رو میں columns کتنے تھے that is the number of elements in the first row so whenever we are passing a two dimensional array from one function to another you must specify the column size which means the last جو subscript ہے اس کی value دینہ لازمی ہے پہلے والے کی دینہ لازمی نہیں ہے so in this case we will be passing cell to the get input function with two as the second index اور ساتھ ہم by reference نم ایمپس بھیجنا چاہتے ہیں تاکہ جو بھی اس کی value لی وہ main program میں آسکے اب یا تو ہم اس کو by reference pass کر دیں ampersand sign کے ساتھ جیسے میں نے پیشتی دفعہ بات کی تھی یا ہم input ہی main program میں کرا کے پھر call by value کر لیں sometimes taking the input one input line in the main program is easier rather than manipulating pointers so let's say کہ جی before we do the get input function call we will get the number of employees in the main function and then go to the get input function get input میں ہم نے کرنا کیا ہے ہم نے ہر employees کے لیے اس کی grow salary جو ہے وہ input کرنی ہے یہ grow salary is simply done with a one dimensional loop یا نہیں a single loop so for i equal to zero i less than numb amps اب numb amps کانسا ہے main میں get کیا اور یہاں by value pass کر دیا and then i increment for each value of i we say see in greater than greater than sell پہلے square brackets کندر ہم نے کہ دیا i or second square bracket کندر لکھ دیا zero یہ بھی دیکھیں ہم کر کیا رہے ہیں what we doing is for every employee we are getting his or her grow salary by definition ہم نے کہا ہے کہ یہ grow salary جو ہے ہم پہلے کولم میں store کریں گے پہلے کولم کا index ہے zero so ہمیں ایک loop چاہیے جو کہ اس two دی ایرے میں سے گزرے اور ہر row پے رکھتے ہوئے اس کے پہلے کولم کے اندر grow salary کی value لکھی جائے یہ ایرے will be of whatever جو ہم نے main میں declare کی ہے probably ڈبل رکھلتے ہیں کیونکہ we tax calculate کرنا ہے تو decimal values آنگی get input function now becomes a very simple function we say second array subscript specified it is also pass the number of employees inside the get input function we run a simple loop and we get the first column of this array which represents grow salary end of input یہاں سے آگے چلیں next statement جو ہے next step جو ہے ہمارا ہے calculate tax ہم نے کہا تھا کہ یہ a function declare کریں گے will tax calculation کرے گا تو tax calculation جو کرے گا اس کو بھی exactly یہی دو چیزیں pass کرنی ہے the sal array and number of employees اور وہ اپنے پاس tax calculation کر لے یہاں پہ زراہ سے رکھ جائیں دیکھیں ہم array pass کر رہے ہیں اور ساتھ numm imps pass کر رہے ہیں تو array I want to reiterate by default it is passed by reference which means if get input function نے array sal کے اندر کوئی values ڈالی تو وہ sal array کے اندر لکھی گئیں اور وہ main function میں بھی available اور main پھر اس array کو کہیں اور pass کر دے وہ ہو سکتا ہے کام numm imps on the other hand is passed by value as per C rules اور اگر وہ pass by value کیا تو get input نے اگر numm imps کو change کر بھی دیا جو اس problemیں اس کو ہرگیز نہیں کرنا چاہی ہے آپ نے صرف اس کو loop termination کیلی استعمال کرنا ہے اگر اس نے numm imps کی value بدل بھی دی تو اور پھر بعد میں ہم اس کو استعمال کر سکتے ہیں یہ problem جو ہے یہ تھوڑا سا آگے چلے گا کیونکہ اس کے اندر ہم algorithm بھی determine کرنا چاہتے ہیں کیا جی what is that precise sequence of steps جو کہ ہمیں determine کرنے دے کیا جی کونسا انلکی employee ہے اس کے لیے تھوڑا سا analysis کی all ضرورت ہے کیونکہ اس کے اندر a complex if condition آتی ہے لیکن calculate salary جو ہے net salary نکالنی اس کے اندر بھی انٹریسٹنگ اشوز ہیں I think that we should cover them next time آپ کے پاس handouts میں یہ پورا program دیا ہوا ہے اس کے flow charts بھی دیے ہوئے ہیں what I suggest is کہ آپ اس کو اچھی طرح دیکھیں پڑھیں اور سمجھیں and I will assume کہ آپ next لیکچر میں جا بائیں گے تو یہ problem اچھی طرح پڑھ کے آئے ہوں گے those of you who are more enterprising would probably have written the program and actually run it please try to do this try to stay ahead of the lectures all right that will make life easier for you and that will also show us that you know you are working hard کوئی problem کوئی question ہو you can email تک ہے CS201 at vu.edu.pk discussion board کے اوپر you are very free and feel free to discuss any problems like this I mean it is nice to get other people's input especially وہ Transpose والا پہنے جو کہا تھا ایک اور problem چلیں آپ کو چلتے چلتے دیتا جاؤ میٹرکس کے حوالے سے کہ جی اگر آپ کو ایک سکویر میٹرکس دی ہو سا نمبر of rows and columns are identical اس میں ایک خاص میٹرکس ہوتی اس کو کہتے ہیں identity matrix identity matrix وہ ہے جس کے جو دیگنل ایلیمنٹس ہیں وہ سارے ہون ہیں اور باقی تمام ایلیمنٹس زیروں ہیں سپوز آپ آپ سکویر میٹرکس دیتے ہیں اوپ سایز نبا نبا بھائی ایلیمنٹس دیتے ہیں اگر یہ نبا میٹرکس یہ سوچ سکتا ہوں گے اور ہم اس پرومنے دیتے ہیں خدا حفظ