 اسلام علیکم لیکچر 10 اپنے اس سے سی دوزیرو بان کوز باتی ہے پسلی دفعہ ہم نے فونکشنز کی بات کی اور فونکشنز جو حینہ اس سے فرمہ کیا جائے and you probably already have learnt a little bit are the bread and butter of a C programmer یعنی ہر جگہ پی اس تمال ہوتے ہیں and we shall become very, very expert at writing our own functions and using functions نندلیس اس فکر میں آپ کو تھوڑا سا ریٹریٹ کرنا چاہتا ہوں ایک چیز کا یہ کوز یہ ہے انٹروڈکشنٹو پروگریمنگ یہ نہیں انٹروڈکشنٹو پروگریمنگ این سی تو پلیس بھی اویر بہنائے ٹھیک بنا چاہتا ہوں کانسیپٹز وہ فندمینٹلز کی رینج میں آنے چاہیں ہیں اور آپ کو کانسیٹر کے یہ بات یہ دوسی لنگوڈیز میں بھی اپلائے ہو سکتی ہے صرف سی تک مہدود نہیں ہے فنگٹنز کا کانسیپٹ اور نام آ جائیں گے جاوہ میں جائیں گے وہاں پہ میں میٹھردز کا نام آنا چروہ ہو جائے گا ونٹوز پروگریمنگ میں جائیں گے تو میسجز کا نام آنا چروہ ہو جائے گا بہت بہت ہونے کی کانسیپٹزی یہاں ہوں پروگریمنگ چاہتا ہوں اگر انٹروڈکشنٹو پروگریمنگ انکیمتی رائے کسا مجھے ساتھ ملہوں تعییی کرنے ہیں آپ کسی آپ سر بڑھائے ہیں بہت کی سر جیانا ہے آپ کا بڑھا کے ساتھ اورовой لیئے آپ کو کچھ پرٹھای کرسکے آپ کو بہت بہت بہت بہت ہے تو سہنہ اور ایکچھ بہتا ہے آپ کو بہت بہتا ہے مجھے بہت بہت ساتھ جانا ہے ہوتے ہیں اور جانا ہے تو ہم بہتر ایک چیزیں آپ کو بہت بہت بہت śmہنی جائے Then we will go on and talk about the scope of variables. Then we will come back to functions again and we will complete our discussion or rather continue our discussion on call by value and call by reference. Let us start with header files. آپ already ایک header file استعمال کرتے ہیں Day 0 سے Or you may know that we first wrote all the main programs Sharp include I show stream.h تو iostream.h جو تھی وہ ہیڈر فائل تھی اور .h سے آپ کو ایڈیا بھی ہوگیا ہوگا یہ ہیڈر فائل ہے that is the extension of the file name ہیڈر فائل کیوں ہم استعمال کرتے ہیں last time I spoke a little bit about function prototypes کہ یہ ایک declaration ہوتی یہ ایک definition ہوتی ہے declaration کا دوسر نائم نام جو ہے وہ prototype ہو سکتا ہے کہا جا سکتا ہے اس کو normally if we have a lot of functions اور ان کو ہم کسی اور program میں یا کسی اور function میں استعمال کرنا چاہتے ہیں تو ہمار پاس ایک ہی طریقہ رہ جاتا ہے کہ جی پہلے اس function کی body یا definition سے پہلے سارے functions کے prototype list کر دیں اور پھر function کے اندر اس کو استعمال کریں and we do that again and again and we do that with many functions maybe you got a complex program اس کے اندر کئی دفعاب کو یہ کرنا پڑھ رہا ہوتا ہے wouldn't it be simpler اگر ہم وہ ساری function prototypes کہی ایک جگے پرکھ دیتے ہیں اور یہاں پہ کوئی ایک چھوٹی سی بات کہہ دیتے ہیں کہ یہ فائل ہے جس میں سارے prototypes پڑھے ہیں اور ان کو وہاں سے لے کے استعمال کر لو that is the basic concept of a header file so what we can do is make our own header files which is a simple text file with a .h extension that is usually the extension کوئی لازمی نہیں ہے but in rules of good practice ہم ان کو .h extension دے دیتے ہیں اور اس کے اندر ہم اپنے function prototypes لکھ دیتے ہیں and you will recall the prototype is just that return value function name and an argument list and the argument list also has the data types in it and that is it تیکنے ہیچ لائن end it by a semicolon and you've got a header file and you've got a prototype list in that header file اس کو آپ اسی دیریکٹیب کے ساتھ شارپ انکلود کے ساتھ آپ اپنے پرگرم میں لکھ سکتے ہیں and that will then be like the declaration of the function as if آپ نے اس پرگرم یا اس پرگرم سے پہلے آپ نے خود لکھا ہوتا explicitly وہ جو پرگرم تھیں but function prototypes are not the only thing that can be put into a header file again if you remember last time ہم نے ایک area of a circle کا پرگرم لکھا تھا اس میں ہم نے پای کی ویلو بھی استعمال کی تھی اور پای کی ویلو استعمال کرتے بے میں نے وہاں پے لکھ دیا ہوا تھا 3.1415 whatever ٹھیک ہے یہ جو ہے things which are considered as universal constants or even as constants within our domain of operations it would be nice اگر ان کو بھی کوئی meaningful نام دے دیے جائیں اور اس کے بھی دو فائدیں ہیں آپ دیکھیں پرگرم کے اندر تو میں کر سکتا تھا I could have declared a variable of type double اور اس کو نام دے دیتا پای پی اور پھر پی ایکوال تو 3.1415926 اور whatever I want وہ لکھ کے بعد میں ہر کالکلیشن کے اندر میں پی لکھتا جاتا اس سے بہتر یہ ہے کہ جی ہم کسی ہیڈر فائل میں اس کے سمکہ constant کی value pre-defined کر چھوڑیں once and for all اور then simply by including the header file in our program that value is defined and it has a name again a meaningful name PI اور وہ ہم اپنی کالکلیشن میں استمال کریں گے without seeing the horrendous number 3 point blah blah تیک ہے so we don't want to do that we want to give some meaningful names to constants وہ constants بھی ہم header file کے اندر دیفائن کر سکتے ہیں header files کے اندر کچھ اور pre-processor directives ہوتے ہیں لیکن it's too early to talk about those for the moment but ایک بتاتا چلو وہ ہے شاپ دیفائن so by using the sharp symbol and the keyword define دیفائن اس کے بعد ہم نام لکھتے ہیں so in this case پائی پی اور پھر سپیس دے کے اس کی value لکھتے ہیں what this does is it does a funny thing it's not really creating a variable it is associating a name with a value and the name can then be used inside a program exactly like a variable why it is not a variable you cannot use it on the left hand side of any assignment so once it's defined it's defined اور بیسیکلی یہ ایک short hand کا طریقہ ہے what happens is کہ آپ نے پائی کی value define کے ساتھ دیفائن کر دی اور پھر پی جا سیمبل ہے اس کو آپ نے program میں استعمال کرنا شروع کر دیا جب program لکھ کے آپ کمپائلر کو ہندور کریں گے what it does is جہاں جہاں اس کو پی ملتا ہے وہاں پے اس کی actual numeric value ہے or whatever value you've assigned to it وہ وہاں پے رپلیس کر کے اس کو کمپائل کرتا ہے so actually compilation وگیرہ کے اندر پائی وگیرہ بھول جاتے ہیں اس میں values آجاتی ہیں اور ان کے actual استعمال شروع ہو جاتا ہے for us as human beings it becomes very readable in a program to see the symbol πائی add to that the fact کہ میں بار بار آپ کو کہہ رہا ہوں use meaningful names for variables so if you see a line which says something is equal to πائی times radius times radius it's obvious کہ جی پائیہ سکویڈ کالکلیٹ کیا جا رہا ہے if you see in a program something like 2 times πائی times radius you know کہ یہ کسی سرکل کی circumference کالکلیٹ کی جا رہی ہے notice یہاں میں میں 2 استعمال کیا ہے circumference میں کیونکہ 2 پائیہ ہم استعمال کرتے ہیں don't go overboard اتنی زیادتی نہیں کرنے کے لیے اب 2 کو ہم defining کرنے چل پڑیں 2 is a constant but it is used in this particular expression in this formula πائیہ ہم اس کے لیوڈل ایک اور ہے وہ ایک universal constant ہے تو اس کے لیے شارپ defining کرنا is intelligent and good اب ہم توریسی بات آگے چلاتے ہیں اور ہم بات کرتے ہیں scope of identifiers کی and notice کریں کہ میں نے variable کا لفظ نہیں استعمال کیا میں نے identifiers کہا ہے کیوں کیوں کہ identifiers means any names that the user creates inside his or her program names کس کس چیز کے ہو سکتے ہیں well obviously variables is one but functions بھی جو ہیں وہ بھی نام ہے ان کے so they are also identifiers اس کے علاوہ see میں labels بھی ہوتے ہیں وہ بھی identifiers ہیں so we will talk about the scope of identifiers when we talk scope what are we talking about ہم بات یہ کر رہے ہیں کہ کوئی variable یا کوئی function یا کوئی چیز جو identifier کے ساتھ associate ہم کرتے ہیں وہ جب بھی declare کی جاتی ہے وہ نظر کہاں کہاں آ سکتی ہے this is an important concept to understand دیکھیں ہم نے ایک function لکھا اس کے اندر ہم نے لکھتی ہے int i یہ i جو ہے اس function کے اندر ہم استعمال کرتے ہیں اور اس کے اندر جو بھی computation کرنی ہے i کو استعمال کیا جا سکتا ہے لیکن اس function سے ہٹ کے ہم دوسرہ function لکھتے ہیں اور اس میں ہم کہتے ہیں کہ جی i استعمال ہو جائے so sorry وہ i تو اس function کو belong کرتا تھا اس function میں سے وہ نظر نہیں آئے گا so it is not visible to any other function that i is local to the previous function جس میں وہ declare کیا گیا تھا اس function میں اگر استعمال کرنا ہے تو یا تو کسی mechanism سے اس کی value ڈر پاس کی جائے اور یا اگر value نہیں پاس کرنی اور سمplی آپ کو ایک variable چاہیے تو یہاں پھر سے اس کو declare کریں so all the functions you write can have an int i and there is no problem ہاں اگر کسی function میں آپ نے i as an integer declare کر دیا ہے تو دو بارہ اس کو کر سکتے ہیں کہ نہیں we will worry about that in the next little item that we come to which is the scope inside a function جب ہم نے پہلی scoping کی ہم نے کہا ایک variable declare کیا ہے inside a function اور میں نے کہا کہ وہ function کے اندر نظر آتا ہے اس کو تھوڑا سے definition کو expand کر لیں دیکھیں function کی body جو ہے وہ شروع ہوتی ہے curly braces سے اور end ہوتی ہے curly braces کے ساتھ یہ جو ہے that's the body of the function اور میں نے early آپ کو باتتا ہے کہ braces جو ہے وہ code کے block کو encapsulate کرنے کے لیے استعمال ہوتے ہیں so function کی body is also a block of code nonetheless inside the function they can be another block of code so you can have another set of curly braces while statement آگی تو while کا اپنا block آ جائے گا for آگے اس کا اپنا block آ جائے گا یا simply standalone block بھی آ سکتا ہے you can just write braces and enclose a block of code in it اگر کسی بھی statement block which is enclosed by curly braces اگر اس کے اندر آپ ایک اور variable declare کر دیں تو وہ اس block کے لیے local variable بن جاتا ہے وہ اس block سے بہر نظر نہیں آتا so if you have a variable that is declared now be careful we are not saying used i mean declared so اگر ہم نے curly braces کے اندر int i لکھ دیا تو وہ اون curly braces کے اندر نظر آئے گا ان سے بہر نظر نہیں آئے گا so in a way this definition is more proper because it applies to the function itself اس پر بھی curly braces لگے ہوئے when we talk about scope we are talking off the visibility so this particular variable جو کہ block کے اندر define کیا ہوا ہے اس کی visibility is within the block its scope is within that block the variable that is defined within the function has a scope which is function-wide if you insist and you say کہ ہم نے function کی اندر داخل ہوتے ہم نے int i لکھا اور پھر آگے چلے ایک اور block define کیا اس کے اندر پھر int i لکھ دیا so is that a problem is that a syntax error the answer is no it is not a syntax error کیونکہ ہم c++ بھی استعمال کر رہے ہیں you can declare function rather than variables anywhere you want ہوگا کیا کہ جو block کے اندر i declare آپ نے کیا ہے وہ block کے اندر نظر آئے گا جو بہر والا i ہے وہ نظر نہیں آئے گا it is hidden now it tends to get a little confusing and therefore i do not recommend this use of creating variables with the same names inside blocks inside a bigger function or inside a bigger block you should try to use separate variable names so that there is no confusion reuse of a variable is very valid اوپر int i declare کریں اس کو اس لوپ میں بھی استعمال کریں اس میں بھی کریں اس میں بھی کریں no problem but ہر دفعہ int i یا i کو redeclair کرنا is bad practice وہ آپ کو confusion ہو جائے گی کہ جی اس وقت یہاں پے code میں جو i استعمال ہو رہے یہ وہ والا ہے جو function level پر declare کیا تھا we don't want to do that یہ تو ہو گئی function or blocks کی سکو کیا کوئے ایسا طریقہ ہے کہ اسی مشہورہ زمانہ int i کو declare کیا جائے تاکہ ہمارے سارے functions کے اندر وہ نظر آتا رہے سوچیں already ہم نے ایک کام یہ کر چکے ہیں کیا کیا ہم نے ایک function prototype تو لکھی تھی نا جس وہا ہم نے کہا function declaration اور وہ mean سے بہر رکھ دی a calling program سے بہر رکھ دی یہ بہر رکھی تو it is outside of any function the same thing applies to the declaration of variables you can declare variables outside of any function in which case they are accessible and visible inside all functions in that file اب میں نے نیال اف سیستمال کر لیا میں نے اب file کا love سیستمال کر لیا within that file which is the source code file within that file which is the source code file جو آپ کی .c or .cpp کر کے آپ سیف کر رہے ہیں disk کے اوپر اس کے اندر کئی functions اور programs ہو سکتے ہیں ایک main ہو گا ملازمی ہے کہ یہ main کے دو دفہ نہیں ہو سکتا کم از کام ایک main ہو گا اور پھر باقی functions ہو گے اگر آپ کو کوئی ایسا variable چاہی ہے جو کہ accessible ہو سارے functions سے تو آپ اس کو بہر لکھتے تھیں یہاں ہم نے shop include iostream.h لکھا تھا اس کے ساتھ آپ لکھتے نیچے int i semicolon اب یہ i ہر function کے اندر visible ہو گا including main جو اس فائل میں پڑا ہوئے اس کا ہم کہہ دیتے ہیں یہ file scope ہے یا global scope ہے it becomes a global variable it's available from everywhere global variables کے use بھی ہیں you can think of some کہ یہ ایک variable ہونا چاہی ہے جو گا global ہے ہم اس کو استمال کرنے اس کی value ہمیں مل جائے لیکن اس کے dangers بھی ہیں because you might by mistake think that it's a local variable اس کو i کو استمال کر لو کچھ نہیں ہوتا پتہ چاہے گا کہ جی وہ جو function i کو واپس رفر کر رہا تھا اس کے لیے value بدل چکی ہے and you have a problem you will have a logical error you won't have a syntax error your logic can go wrong so the moral of the story here is that you should try to minimize the use of global variables you should try to use local variables as far as possible اور یہ جو ہے یہ back to the philosophy of encapsulation and data hiding کی طرف چلا جاتا ہے کہ جی locally کو چیز دیکلیر کرو وہاں استمال کرو جا وہاں سے نکلے تو چیز فارق so we have to worry about the visibility of identifiers there's a global scope anything identified or declared outside of any function is visible to all functions in that file and can be used there's a function level scope function کے اندر آپ نے a variable declare کر دیا تو وہاں پورے function کے اندر استمال ہو سکتا ہے there's a block level scope block کے اندر function یا integer کوئی اور variable declare کر دیا وہ block کے اندر استمال ہو جاتا ہے آپ اپنی کتاب میں دیکھیں گے بہت سارے examples ہیں جہاں پہ وہ لکھا ہوتا ہے اس طرح کی چیز کے جی for int i equal to zero i less than something do something else یہ بلک level scope یہ for statement کے اندر int i declare ہو رہا ہے اور یہ جیسے ہی for ختم ہوگی i no longer exist it is not visible it is not available again it's a matter of programming style whether you adopt this for blocks or you keep it outside my own preferences I would like to have the declaration very clear and visible then I would want to use that variable I don't want to confuse an issue کہ جی بہر بھی کوئی آئی ہے یہاں پہ کوئی اور آئی ہے کہیں اور ہے I want to make things very easy for myself I want to know کہ میں نے declare کیا کیا ہوا ہے اور پھر اس کو میں استمال کہاں کہاں کر رہا ہوں let us take a look at a very simple example of global scope ہم یہ i integer ہمارا famous i اس کو declare کرتے ہیں outside of the main function ایو سٹریم کے بعد جو لائن ہے وہاں ہم کہہ دیتے ہیں main کے اندر آتے ہیں اور پہلے ہم اس کو کوئی value ایسائن کرتے ہیں ہم کہتے ہیں i is equal to 10 اور c out کے ساتھ ہم اس کی value پرنٹ کر دیتے ہیں screen کے ساتھ ہم بتا دیتے ہیں کہاں سے پرنٹ ہو رہی ہے ہم کہتے ہیں within main i is equal to اور i کی value so 10 will be printed on the screen اس کے بعد we go and we try to call a function ہم کہتے ہیں function let's say for this simple example ہم نے اس کا نام f دیا ہوئے اس کی کوئی return type نہیں ہے اس کو کوئی argument نہیں پیش ہوتا so اس کا prototype is simply void f with empty parentheses یا اس میں بھی void لکھیں another new keyword void specifically used in c++ and these later languages to indicate کہ یہ function کوئی چیز واپس نہیں کرتا so otherwise we could just write parentheses and that's enough وہ ڈیفالٹ کر جائے گا to some other data type so main کے اندر سے ہم f call کرتے ہیں اور f کی اگر آپ definition دیکھیں تو وہ کہتا ہے کہ this see out کے ساتھ inside function f i is equal to so and so اب جو main میں ہم نے i equal to 10 کہا تھا وہ f کے اندر سے بھی وہی value print ہو جاتی ہے f کے اندر ہم next line ڈال دیتے ہیں i is equal to 20 اور function کو ختم کر دیتے ہیں کیا ہوا i کو value 20 assign ہو گئی کنسا i وہ i جو کہ تمام functions including main سے بہر declared ہے it has global scope so it actually this assignment statement worked واپس ہم function call کے بعد main میں آئے گا آپ کا جو program flow ہے وہاں پھر آپ see out کے ساتھ اگر i کی value print کرنے کی کوشش کریں گے تو value 20 نظر آئے گی so global variables can be assigned to and used by any and all functions within the file that's why I said that there is a danger کیجی function کے اندر ہم نے i کو as a loop counter استمال کر لیا واپس آئے تو پتہ چلا جی وہ جہاں loop ختم ہوئی تھی وہ value واپس پہنچ گئی ہے so those are side effects that you have to guard against so you should restrict your use of global variables use local variables wherever possible so that there are no unwanted side effects let us move now to function calling again پس کی دفعہ میں نے بات کی تھی کہ see کا default وہ ہے call by value what does that mean it means کہ جب ہم ایک function کو call کرتے ہیں اور اس کو کوئی arguments بھیجتے ہیں تو actually آپ arguments کی copy بھیج رہ ہوتے ہیں original argument یا any variables نہیں بھیج رہے ہوتے ہیں وہ copy کی value function میں پہن جاتی ہے اس کو استعمال کرے چینج کرے جو مرزی کرے اس کا result جو مرزی واپس بھیجے لیکن وہ value ہی استعمال ہوری ہوتی ہے original variable is not being touched so it is call by value اس کا simple سا example دے دوں suppose میرے پاس ایک خت ہے اور خت کے اوپر میں چاہتا ہوں کہ کوئی corrections ہونے والی ہیں تو میں کہتا ہوں کسی اور کو deput کرتا ہوں کہ بھی اس کی copy بناو اور original میرے پاس چھوڑ دو اور copy کی اوپر corrections کرکے لیاو I have noticed کہ وہ corrections آجائیں گی میرے پاس لیکن original کو کچھ نہیں ہوا ہوگا ٹھیک ہے so I have given a copy of the original which is the call by value part on the other hand اگر میں لٹر ہی original پکرا دیتا اور میں کہتا ہے اس پے corrections کر لاؤ تو جب وہ واپس آتا تو original بھی بدلا ہوا ہوتا that would have been a call by reference now see کا default وہ ہے call by value and it is nice because it saves us from unwanted side effects جو call by reference ہے وہ زرہ سا complicated ہے but you can see کجی sometimes we may want to actually have the value of a variable changed by a function that we have called from the calling program in that case we will use call by reference let us take an example and make certain for ourselves کجی call by value works the way it is supposed to work so suppose آپ ایک mean program لے لیتے ہیں اور ایک اس کے ساتھ ایک چھوٹا سا function our usual f function لے لیتے ہیں جس کو ایک integer pass ہوتا ہے اور وہ integer کو دبل کر کے اس کو print کر دیتا ہے اور پھر واپس control mean program کو دے دیتا ہے so basically اوپر ایک function کا f کا prototype دے دیا we say f within parenthesis you say int وہ اس کا prototype ہو گیا main لکھ لے integer int i declare کر لے اور پھر i کو let's say i is equal to 10 use a c out to display the value of i and of course put in the word saying in main تاکہ پتا چل جائے یہ print کہاں سے آئے جب screen پر نظر آری ہوتی ہے چیز تو آپ کو پتا نہیں ہوتا کہ اس وقت کونسا function چل رہا ہے so یہ چیزیں ہم اپنے لیے اپنے سہولت کے لیے لکھتے ہیں so it helps us in debugging and tracking the flow of a program so we say in main i is equal to whatever value we have assigned to it then we call the function f f call ہوتا تو وہ ہوگا with i so f parenthesis i اب ہم function میں چلے گئے function میں جب کنٹرول گیا تو اس کی جو آپ کی definition ہے وہ آپ کی ہندوٹس میں پڑی ہوئی ہے definition میں ہمارے پاس آگیا کہ جی int i میں ہم نے اس کو رسیب کر لیا اب یہ i یہ function کا i ہے ہمیں اس کو پہلے سکتے ہیں ہمیں کسی منتزہ کریں یہاں پہ جاکے ہم کہتے ہیں کہ جی c out in function f i is equal to 10 or whatever the value is that we have assigned in main اس کے ذات ہم کہتے ہیں کہ جی i star equals 2 remember star equal is the compound assignment operator so we have said i is equal to i multiplied by 2 to confirm یہ ہو گیا ہے ہم function f میں ایک اور c out کر دیتے ہیں print لیے لیے لیے ہم کہتے ہیں c out in function f i is now equal to value of i تو اگر پہلے 10 تھا اب وہ 20 ہو جائے گا اور یہاں سے function ختم ہو جاتے you go back to main main میں جاکے next line f کی call کے بعد والی line پہاں ہم پھر کہتے ہیں c out back in main i is equal to کیا print ہوگا وہ value print ہوگی جو پہلے main میں assignment کے طرف ہم نے i میں ڈالی تھی یعنی function نے i star equals 2 کیا ہوا ہے لیکن main والے i کو کچھ نہیں ہوا this in a way proves the point کہ جو call تھی وہ by value گئی تھی from a conceptual perspective we should always think in terms of کہ جی ہوتا کیسے ہے کہ جی میرے پاس کچھ values ہیں جو میں کسی function کو پاس کرنا چاہتا ہوں اور چاہتا ہوں کہ وہ ان کو استعمال کرے اور operate کرے میں ان values کی copy بنا کے کہیں اور رکھ دیتا ہوں اور پھر function کو کہتا ہوں یہ copy پڑی ہوئے یہ لے جاو اور in values کو استعمال کر لو جو میرے پاس original ہے وہ secure ہے it is not touched چلیں ایک اور call by value ایک example کرتے ہیں جو زراہ سا زیادہ useful ہے suppose ہمارے پاس ایک function ہمیں چاہی ہے جو کہ ایک number کا square return کرتا ہوں now number جو have a double precision ہوسکتا ہے so پہلے تو ہم function لکھ لیتے ہیں let's say double that will be the return type name of the function ہم لکھتے ہیں square again descriptive اور اس کے ایک number pass کیا جائے گا as an argument will be of type double ہوگا so parenthesis can we say double x opening brace closing brace ڈال کے درمیان میں body of the function کرتے ہیں return x times x simple جو بھی value number اس کو pass کیا جائے گا اس کو اس نے آپ نے آپ سے اب آجیں ہم main کی طرف تو main کی اندر ہم کیا کرتے ہیں ہم number declare کرتے ہیں double number اور اس کو پھر ہم value assign کر رہے ہیں number equals 123.456 for example اور ہم آگے جاکے سیدہ function call کرتے ہیں اور وہ function call ہم c out کی اندر سے ہی کر لیتے ہیں ہم کہتے ہیں c out less than less than within quotation marks the square of quotation marks closed پھر less than less than number پھر less than less than پھر quotation marks اساتھ is پھر space چھوڑکے میں سارا کچھ اس پاس دے پڑھ رہوں تاکہ آپ کو اسانی ہو hand out follow کرنے کی no need it's in front of you and you should be familiar with the c out syntax by now is کے بعد جو پھر less than sign ہم نے دالے اس کے بعد ہم کہتے ہیں square parenthesis number parenthesis closed semi colon what happens is کے c out کی اندر سے ہی یہ function call ہوگا جو بھی number کی value ہے وہ ہی جو میں نے بات کی تھی کہ copy بن کے اس کی value square function کو چلی گئی اس نے اس کو اپنے آپ کے ساتھ multiply کیا اس نے receive کیا in its own local variable called x اس کے اندر اس کو multiply کر کے square کی value واپس بھیج دی جو value واپس آئی وہ c out نے print کر دی so if you want to confirm کہ جی number کی value ابھی بھی نہیں بدلی تو بیشا کے اس کے بعد ایک اور c out line ڈالنے کہ جی the current value of number is the variable number ٹھیک ہے and you will find out کہ جی number کی value نہیں بدلی جو square function تھا اس نے these are all examples of call by value why I mentioned this particular example کہ جی square in fact کیونکہ c کے اندر built in یہ operators نہیں ہے square root کرنے کے لی یا square square کرنے کے لیے یا square root لینے کے لیے یا log لینے کے لیے انہوں نے پوری ایک mathematics کی library آپ کو دی ہوئی ہے وہ library جو ہے وہ ان کے prototype سارے ایک file ہے called math.h وہ ہی header file اس کے اندر سارے function کے prototypes پڑے ہوئے ہیں وہ math.h میں دی اور علیادہ ایک library file ہے میں ہم بعد میں بات کریں گے سو اگر آپ نے کوئی بھی math کا function استعمال کرنا ہو تو آپ نے program کے اوپر آپ لکھیں گے sharp include اسی طرح angle brackets کے ساتھ math.h وہ include ہو جائے گی سارے prototypes آپ کو مل جائیں گے اس میں mathematical functions آجائیں گے square root sqrt takes one number of type double and returns a double اس کا اگر prototype ہم لکھ رہے ہوں ہم لکھیں گے double but یہی چیز math.h کے اندر already لکھی ہوئی ہے اسی طرح log ہے log 10 ہے power ایک function ہے ابھی دا کیا دے ہم نے ایک function لکھا تھا which said x to the power n where n was an integer یہ جو c کا ساتھ function آتا ہے I am careful I am not using the word built in there is no such thing as a built in function ساتھ آتا ہے because somebody else wrote it for you you can write your own whatever you want جو ساتھ آتا ہے power کا function p o w وہ ہمارے raise to power x comma n function سے کہیں زیادہ فلکسبل ہے کیونکہ وہ raise کرتا ہے x to the power y جہاں x or y جو ہیں دونوں doubles ہو سکتے ہیں there is no requirement کہ وہ integer کو raise to the power کرے and so on there is a huge number sign, cost, tan یہ سب available ہے math.h کے اندر اور سب میں ایک چیز کامن ہے they are all call by value جو بھی نمبر آپ بھیجیں گے کہ اس کا sign لے کے ہمیں value دو اس کی square root لے کے value دو اس نمبر کے original variable کو کچھ نہیں ہوگا اس کی value maintain رہے گی copy اس کی جائے گی by value استعمال ہوگی اس کا result آپ کے پاس آجائے گا it's all call by value do we ever want to use call by reference in other words جب ہم چاہیں کہ کوئی ایسا جس میں original variable کی value ہی بدل جائے so think about یہ جو بھی ہم نے square کا ایک function لکھا ہے ہم ایسا چاہیں کہ جی ہم کہیں square x اور x جو ہے وہ بزاتے ہود square ہو جائے that means کہ جی اب صرف value پاس ہوکے وہاں کچھ کام نہیں ہوا کوئی چیز ہم نے بھیجی جس کا result ہمارے calling program والے x کو بھی affect کر گیا یہ والے function جہیں یہ call by reference functions کیا لاتے ہیں اب ان کے اندھر تھوڑی سی مطلب complicated issues کچھ آ جاتے ہیں کہ جی ان کو کیسے communicate کیا جائے between the calling program and the function which is being called by reference as the name is apparent from the name reference means کہ جی ہم value نہیں بھیج رہے ہم اس کا کوئی پتہ بھیج رہے you can think in terms of کہ جی آپ کو یاد ہوگا ہم نے بات کی تھی کہ variable جو ہم وہ memory locations کے نام ہیں تو جہاں پہ memory location ہے وہاں نام بھی تو اس کا پتہ بھی ہے there is a memory address associated with that name if I want my calling program or rather if I want the called program to change the value of any variable inside a calling program then I must pass the address of the variable to the sub function if I pass the address سوچن کیا ہوگا کیا میں function کو کہ رہا ہوں کہ جی وہ نمبر جو memory address 1 2 3 کے اوپر پڑا ہوئے اس نمبر کو سکویر کر دو اور ساتھ میں یہ کہہ سکتا ہوں کہ اس کی value اسی کے اندر دال دینہ تو جب یہ کام ہو کے ہمارے مین calling function کے پاس ہم واپس آتے ہیں تو calling function تو وہاں پہ اس کو نئی value مل جاتی ہے مورل of the story جب ہمارے ہمارے ہمارے رفرنس تو ہمارے نمبر ہمارے نمبر نمبر ہمارے نمبر ہمارے نمبر ہمارے نمبر ہمارے نمبر اپنے اپنے نمبر اپنے نمبر کیا ہمارے ہمارے تو ہاتے عرش ہمارے ہماری ہمارے ننب اپنے ہمارے ہمارے نمبر ہمارے نمبر ہمارے ہمارے ہمارے نمبر اس کو کوئی ویلیو دے دی لیتے سی x is equal to 1 2 3 point 4 5 6 it's a ڈبل نمبر اس کے بعد ہم نے کہا square x ٹھیک ہے اب square x اکیلہ نہیں ہم کہا سکتے otherwise it would be a call by value پہلی چیز it's not we don't want it to return anything ہم تو کہتے ہیں کہ x اس کو اس طرح سے پاس کیا کہ x بزاتے خود بدل جائے لیکن we're not looking at a return value تو square x will be on a line by itself لیکن x کو ہم اس طرح نہیں لکتے ہم کہتے ہیں square parenthesis ampersand x parenthesis closed semicolon یہ جو and x لکھا ہے so I will call the ampersand and and x جو لکھا ہے that means کیجی x کی value پاس نہیں ہو رہی x کا memory address پاس ہو رہا ہے so the function square is being called with the memory address of the variable x I hope that is clear now we go to the function itself ابھی میں اس کی proto-type declaration definition اسی باستے چھوڑی رکھی ہے کہ اب ایک اور تھوڑی سی trickی بات آ رہی ہے جب ہم function میں پہنچے square میں تو اب بتائیے کہ وہ receive کیا چیز کر رہا ہے is it receiving a variable of type double No It is in a way receiving a variable of type address but ہمیں تو address کا بھی پتا ہی نہیں کہ وہ variable type کیا ہوتی ہے یہ وہ see کا مشہورہ زمانہ ایک word of سب میں استعمال کرتا ہوں جو کے بعد میں بہت عام استعمال میں آئے گا وہ ہے pointer اس کا symbol is the asterisk symbol the star on the keyboard square کا function جو چیز ریسیب کر رہا ہے that is the address of a variable or address of a variable کو ریسیب کرنے کے لیے the type of variable is a pointer so we say square than within parenthesis we say double star x اس کو پڑھنے کا طریقہ یہ ہے کہ جی when we say double star x you read it normally as x is a pointer to a variable of type double so it's like right to left آپ پڑھ رہے ہیں x is a pointer so star جہاں آئے گا اس کو آپ پڑھیں گے is a pointer to a variable of type جو پہلے دیو ہی ہے which is double so اب جب آپ نے main program سے and x کر کے بھیجا address وہ اس variable میں آگیا جو star x ہے this actually means whatever x points to you need the value لہذا آپ پہلے جانتے ہیں you can get the value of the variable by using star x now inside square we have to do this we have to say whatever x points to is equal to whatever x points to multiplied by whatever x points to that's the square so اب ہم کیا کہ رہے ہیں اس کو لکھنے کا star x equal to star x whatever x points to پھر star which is the multiplication اور پھر star x semi colon but not that bad صرف جو ٹرک ہے اور جو چیز یاد رکھنے والی ہے وہ star x آپ نے ایک کتھا لکھنے اس کے درمیان میں space نہیں دینی so now what we are saying is کہ جی وہ جو میمری میں ایک دبہ تھا box number 100 یہ لائن کہہ رہی ہے box number 100 کے contents کو لو جو بھی اس میں ویلیوں پڑی ہوئے اس کو اس کے اپنے ساتھ ملتیپلائے کرو اور واپس اسی دبہ میں ڈال دو okay so you can think of envelops, labels, boxes, buckets whatever but the concept is the same we are now not sending you the value inside the box we are sending you the box number and x a box number گیا and star xے ہم نے استعمال کیا کیا whatever x points to any whatever the contents of the location at address x okay اس میکنیزم کے ساتھ اب ہم call by reference implement کر سکتے ہیں so back to the function square x جو ہے کہتا ہے star x equals star x times star x semicolon end of function why no return statement return تو اگر ہم کوئی value کرنا چاہتے تو پھر return statement آتی اب تو ہم نے یہ کہا کہ جی وہ value کے واپس ہم نے اس دبے میں ڈال دی ہے آپ واپس main program میں آئے وہاں پہ جاکے x کی value پرنٹ کریں you will find کہ وہ square ہو چکی ہے okay so this is now a call by reference by and large we try to avoid a call by reference کیوں کیوں کہ جی اس کے side effect تو automatically ہو گئے نا آپ نے تو کسی جس کا پتا ہی بتا دیا okay dangerous even in real life if you want to you know give somebody some value you don't provide them your home address کہ جی وہ گھر پی آکے you know وہاں پے کچھ کرلیں okay you normally try to work with values rather than with references یہاں پہ بھی whenever we need to use a reference we use it otherwise we don't we stay with the call by value convention so just to recap the default is call by value and if we want to do a call by reference in c we have to do something special but let me warn you against it we will worry about it when we get to the erase part لیکن اس وقت by and large you should be using call by value point us کے بارے میں ہم بہت تفسیل میں جائیں گے آگے so آج کے لیے صرف اتنا کافی ہے کہ جی reference کے لیے پاس کرنا پڑتا ہمیں address of a variable وہ address لینے کے لیے ہمارے پاس ampersand operator ہے so we say and x to send the address of x and to receive it we use a pointer variable and star x which receives the address of a variable and star x means whatever x points to it becomes a value اب ہم تھوڑسا شفٹ کرتے ہیں on another type of function یہ function ہیں جن کو ہم کہتے ہیں recursive functions ایک special کسم کا function ہے جو کے اپنے آپ کو call کر سکتا ہے یہ کس کسم کا function ہوگا think about it there are many problems and many specific areas جہاں پہ آپ دیکھیں گے کہ جی ایک چیز اس طرح سے model کی جا سکتی ہے کہ وہ آپ کو اپنے آپ کو repeat کرے I'll give you a simple example what about x to the power 10 کیسے کالکلیٹ کریں گے well there are many ways of doing it but from a simple perspective you can say by definition x to the power 10 is x times x to the power 9 so what is x to the power 9 it is x times x to the power 8 what is x to the power 8 it's x times x you can see the pattern the pattern is if I have x to the power n I can always write it as x times x to the power n minus 1 or if you want to compute then I can always write a program which says کہ جی مجھے power لینی آنی چاہیے وہ کیسے لیں گے کہ جی the power function itself says کہ if I'm given x and I'm given in I'll say return x times power of x of n x comma n minus 1 so it's a recursive call function اپنے آپ کو call کر رہا ہے now can we just leave it at that نہیں you have to know کہ یہ recursive call رکے گی کہاں پہ جاکے so when n minus 1 جاتا ہے یا 1 پے آجاتا ہے یا 0 پے آجاتا ہے آپ اس کو روک لیتے ہیں for example کے لیے اسی طرح کے کئی اور problems آپ دیکھ سکتے ہیں factorials factorial آپ کو یاد ہوگا کہ جی for a positive integer is defined as مطلب اک n factorial لینے تو n multiplied by n minus 1 multiplied by n minus 2 all the way down to times 3 times 2 times 1 so it's a whole multiplication اور اگر اس کو split کیا جائے تو دیکھیں let's say 5 factorial یہ کتاب میں بھی اچھی طرح کھولکے example دیوے so you can study it there کہ جی 5 factorial by definition is 5 times 4 times 3 times 2 times 1 but اگر 5 times کو میں علیدہ کر دوں تو باقی کیا بچا باقی بچا 4 times 3 times 2 times 1 which by definition is 4 factorial so 5 factorial is equal to 5 multiplied by 4 factorial so if I had a factorial function then it would do something like that کیا جی factorial n کیا چیز ریٹن کرتے n times factorial of n minus 1 لیکن اس کو رکھنے کیلئے کوئی جگہ چاہیے تو factorial میں بھی ہم رکھنے کیلئے 1 استعمال کر سکتے ہیں although 0 factorial is also equal to 1 so recursive function اس کے اندر ہمیشہ ایک base case ہونا چاہیے کہ ایک رکھنے کی جگہ ہونی چاہیے اور پھر جو problem ہے وہ اس طرح کا ہونا چاہیے کہ اس کے دو ٹکڑے ہو جائیں ایک ٹکڑا وہ جو کہ program خود مطلب ڈیکسیکوٹ کرے اور دوسرا ٹکڑا وہ جو کہ بار بار رپیٹ ہو رہا یہ نہیں program کی ہی شکل اختیار کر رہا ہو so recursive functions کے اندر فیبناچی سیریز ہے وہ بھی آپ کے اندر کتاب میں دی ہوئی ہے factorial کو طرح سا دیکھ لیتے ہیں کیسے لکھیں گے factorial کا function لکنے کیلئے پہلہ ہم نے کہا جی it's a positive integer جو pass ہو رہا ہے so we say return بھی integer ہوگا I would prefer کے دی آپ return long کردیں کیوں long کردیں because factorial کی بھی value بہت جلدی بہت بڑی ہو جاتی ہے so جب آپ factorial compute کرنے لگیں گے تو شہد integer overflow کر جائے memory میں اتنی جگہ ہی نہ ہو کہ integer کی value store کر سکے so if we were to write the factorial function let us use long integers which as you know in C are called long so we say long factorial long n so n will be the variable that we use inside جب ہم function کی اندر جاتے ہیں so سب سے پہلے آپ base case کو چک کر لیں کیا n1 تو نہیں ہوگیا so if n is equal to 1 return 1 or return n because values کی 1 ہے else return n times factorial n-1 very elegant very logical کیا کیا کیا کیا n علیدہ کر دیا باقی کیا بچا n-1 factorial تو اس کے ساتھ ہم نے اس کو واپس کر دیا now you can look at the worked out example فیبناجی سیریز کا example ہے میں نے power کا example دیا you can try to program it recursively the issue is most of these problems can be handled by the programming techniques جو کہ already ہم master کر چکے ہیں I already told you کہ جی decisions and loops and you can write any program so do we need to go into recursion the answer is look it adds a little elegance to your programming but there is a big price to pay لیکن ہوتا کیا ہے اگر آپ وہی کتاب میں اگر دیکھیں گے فیبناجی کا example تو آپ کو پتہ چلے گا کیا ایک function call ہوتی ہے اس کے اندر سے دوسی function call ہوتی ہے اس کے اندر سے تیسری ہوتی ہے یہ ہوتا جاتا ہے جب تک آپ بیس کیس میں نہیں پہنچے اور بیس کیس میں پہنچتے ہیں تو اب واپس آنا شروع ہوتے ہیں اتنی دیر تک یہ ساری function call یہ سیکونس تھا یہ ختم نہیں ہوا ایک call شروع ہوئی وہ بھی ختم نہیں ہوا اسے ایک اور call شروع ہو گئی وہ بھی ختم نہیں ہوا اسے ایک اور call شروع ہو گئی from inside the computer the perspective is کہ جی there is a management issue function کنسا تھا کتنے level پہ ہے کیا چیز اس کو پاس ہوئی یہ کھولا رکھو ابھی آگے اور چلا جائے گا تو there is a memory overhead the other overhead is a stacking overhead سوچ لیں کہ جیگر میں فکٹوریل اس کو کہدوں کہ جی 500 it is 500 nested calls of a function and none of them completes now I could write the factorial function very easily with a simple loop جس میں کوئی stacking نہیں ہوگی کوئی memory overhead نہیں ہوگا کوئی management overhead نہیں ہوگا لہذا آپ کو اپنے اپنے افترام کنیہ کنیے افترام ساری گنی و اپنے اپنے افترام اگر گا تو کوئی از اپنے افترام میں پہلی تک سمجھتے ہیں کسی سے ساتھ انسان ہے اپنے افترام و اپنے افترام حفظنہ لے جو ایک جانک کے باری جانتے ہیں جانتے ہے yet لیکن جانا سب ایک فرم اپنے افترام انسان کمپیٹر vere ہے بہا ہے Metropolitan اور آپ کو کھڑی کھڑی خرچ زیادہ کرنا ہے یا ایلگنس لینی ہے یا افیشنسی لینی ہے لیکن now let's take a little review of what we've done we spoke about header files and we said that this is a nice mechanism of putting all your prototypes and definitions of let's say global constants that you want to use inside وجہزارہوں آپ کو حالت میں عملہ راحاکتے ہیں۔ بعد اندن ہمیشکتے ہیں اور ہمیش powiedzی ہمارے ایک چاہئے کا خلق کیا ہے کہاں ویزبل ہے کہاں نہیں ویزبل ہے کہاں پے بہت اندربائے ہیں تو کہاں استعمال کر سکتے ہیں اور جہاں ہمیشکتے ہیں اور ہمیشکتے ہے کہی اندریات ، call by reference اور میں ہمیشکتے ہیں۔ کیونکہ ہمیں بیوزِیٹنگ تک سے ہمیشکتے ہیں اور گیرنے Right from Day Zero میں آپ کو کہتا رہا ہوں Right programs Right programs Right programs Maybe اس وقت آپ نے اب یہ سلاحیت نہ ہوکی جی اپنے لئے کوئی پروBLEM سوچیں I think you have that capability All you need to do is just look around you Find a problem that's computable And write a computer program On the other hand آپ کی کتاب میں بے شمار ڈیزئزی دی ہوئی ہیں آپ انکہ کریں جکنا کوڑ لکھیں گے اتنی آپ کو نہ پروفیشنسی حاصل ہوگی اتنی آپ کی علیگنس اتنا آپ کا سٹائل بڑھنا شروع ہو جائے گا آپ کے پاس ایک اچھی پروگریمنگ انوارنمنٹ ہے ڈیو سی پلاس پلاس is a good tool اس کو استعمال کریں ہیڈر فائلز آپ کو مل جائیں گی اس کے فولڈر سٹرکچر کے اندر آپ کو اندر کھولیں ان کو دیکھیں ان کے اندر کیا لکھا ہوئے اور کس نے لکھا ہوئے یا وہ گروں نے لکھا ہوئے جو لنگوچ لکھتے ہیں انہوں نے آپ کے لیے فمکشنس لکھے دہجے ہوئے ایک اور اپریٹنگ سسٹم آپ کو پتا ہوگا لائنکس ہے لائنکس کی اگر آپ کو CD's کهی سے مل جائیں تو usually اس CD سیٹ کے اندر اپریٹنگ سسٹم کا source code موجود ہوتا ہے and that source is also written in C so you can open it and look at you know how the master's write programs so don't just attend the lectures and leave it at that and we have assigned you the assignment I have exhorted you and I have told you and I have repeated it again and again tomorrow belongs to brilliant but hardworking people there is no substitute for hard work so do a lot of programming on your own not just the assignments only then will you become a proficient programmer thank you very much اگلی دفعہ پھر ملاکات ہوگی خدا حافظ