مشکلات پر قابو پانے کا طریقہ سکھائیں، اور ساتھ ہی سائیکل لکھیں۔

اس حقیقت کے باوجود کہ ہم بنیادی موضوعات میں سے ایک کے بارے میں بات کریں گے، یہ مضمون تجربہ کار پیشہ ور افراد کے لیے لکھا گیا ہے۔ مقصد یہ ظاہر کرنا ہے کہ پروگرامنگ میں ابتدائی افراد کیا غلط فہمیاں رکھتے ہیں۔ پریکٹس کرنے والے ڈویلپرز کے لیے، یہ مسائل طویل عرصے سے حل ہو چکے ہیں، بھول گئے ہیں یا بالکل بھی محسوس نہیں کیے گئے ہیں۔ اگر آپ کو اچانک اس موضوع کے ساتھ کسی کی مدد کرنے کی ضرورت ہو تو مضمون کارآمد ہو سکتا ہے۔ مضمون میں Schildt، Stroustrup، Okulov کی پروگرامنگ پر مختلف کتابوں کے مواد کے ساتھ ہم آہنگی پیدا کی گئی ہے۔

سائیکل کے بارے میں موضوع کا انتخاب اس لیے کیا گیا تھا کہ پروگرامنگ میں مہارت حاصل کرتے وقت بہت سارے لوگ اس سے باہر رہ جاتے ہیں۔

یہ تکنیک کمزور طلبہ کے لیے بنائی گئی ہے۔ ایک اصول کے طور پر، مضبوط لوگ اس موضوع پر پھنس نہیں جاتے ہیں اور ان کے لئے خصوصی تکنیک کے ساتھ آنے کی ضرورت نہیں ہے. مضمون کا ثانوی مقصد اس تکنیک کو "تمام طلباء کے لیے کام کرتا ہے، لیکن صرف ایک استاد" کلاس سے "تمام طلباء، تمام اساتذہ کے لیے کام کرتا ہے" کلاس میں منتقل کرنا ہے۔ میں مطلق اصلیت کا دعوی نہیں کرتا ہوں۔ اگر آپ پہلے ہی اس موضوع کو سکھانے کے لیے اسی طرح کا طریقہ استعمال کر رہے ہیں، تو براہ کرم لکھیں کہ آپ کا ورژن کیسے مختلف ہے۔ اگر آپ اسے استعمال کرنے کا فیصلہ کرتے ہیں تو ہمیں بتائیں کہ یہ کیسا رہا۔ اگر کسی کتاب میں ایسی ہی تکنیک بیان کی گئی ہو تو نام لکھیں۔


میں نے اس تکنیک پر 4 سال تک کام کیا، مختلف سطحوں کی تربیت کے طلباء کے ساتھ انفرادی طور پر مطالعہ کیا۔ مجموعی طور پر تقریباً پچاس طلباء اور دو ہزار گھنٹے کی کلاسز ہیں۔ پہلے تو طلبہ ہمیشہ اس موضوع پر اٹک جاتے اور چلے جاتے۔ ہر طالب علم کے بعد طریقہ کار اور مواد کو ایڈجسٹ کیا گیا۔ پچھلے ایک سال کے دوران، طلباء اب اس موضوع پر پھنس نہیں رہے ہیں، لہذا میں نے اپنے نتائج کو شیئر کرنے کا فیصلہ کیا۔

اتنے خطوط کیوں؟ سائیکل بہت ابتدائی ہیں!

جیسا کہ میں نے اوپر لکھا، پریکٹس کرنے والے ڈویلپرز اور مضبوط طلباء کے لیے، لوپس کے تصور کی پیچیدگی کو کم سمجھا جا سکتا ہے۔ مثال کے طور پر، آپ ایک لمبا لیکچر دے سکتے ہیں، سر ہلاتے ہوئے اور ذہین آنکھیں دیکھ سکتے ہیں۔ لیکن جب کسی بھی مسئلے کو حل کرنے کی کوشش کی جاتی ہے تو بے وقوفی اور ناقابل فہم مسائل شروع ہو جاتے ہیں۔ لیکچر کے بعد، طالب علموں کو شاید صرف جزوی سمجھ تھی۔ صورتحال اس حقیقت سے گھمبیر ہے کہ طلباء خود آواز نہیں دے سکتے کہ ان کا فریب کیا ہے۔
ایک دن میں نے محسوس کیا کہ طلباء میری مثالوں کو ہیروگلیفس کے طور پر سمجھتے ہیں۔ یعنی متن کے ناقابل تقسیم ٹکڑوں کی طرح جس میں آپ کو کچھ "جادو" خط شامل کرنے کی ضرورت ہے اور یہ کام کرے گا۔
کبھی کبھی میں نے دیکھا کہ طلباء یہ سوچتے ہیں کہ آپ کو کسی خاص مسئلے کو حل کرنے کی ضرورت ہے۔ اس کے علاوہ کچھ اور ایک ایسا ڈیزائن جسے میں نے ابھی تک کور نہیں کیا ہے۔ اگرچہ حل کے لیے مثال کی صرف تھوڑی سی ترمیم درکار تھی۔

لہذا میں یہ خیال لے کر آیا کہ توجہ اظہار کے نحو پر نہیں، بلکہ لوپس کا استعمال کرتے ہوئے دہرائے جانے والے کوڈ کو دوبارہ بنانے کے خیال پر ہونا چاہیے۔ ایک بار جب طلباء اس خیال میں مہارت حاصل کر لیتے ہیں، تو کسی بھی نحو کو تھوڑی مشق کے ساتھ بہتر بنایا جا سکتا ہے۔

میں کون اور کیوں پڑھاتا ہوں؟

چونکہ داخلہ کے امتحانات نہیں ہوتے ہیں، اس لیے کلاسز میں مضبوط اور بہت کمزور دونوں طلبہ شامل ہو سکتے ہیں۔ آپ مضمون میں میرے طلباء کے بارے میں مزید پڑھ سکتے ہیں۔ شام کے کورس کے طلباء کی تصویر
میں نے اس بات کو یقینی بنانے کی کوشش کی کہ ہر وہ شخص جو پروگرامنگ سیکھنا چاہتا ہے اسے سیکھ سکے۔
میری کلاسیں انفرادی طور پر منعقد کی جاتی ہیں اور طالب علم ہر ایک کے لیے اپنے پیسے خود ادا کرتا ہے۔ ایسا لگتا ہے کہ طلباء لاگت کو بہتر بنائیں گے اور کم سے کم کا مطالبہ کریں گے۔ تاہم، لوگ ایک زندہ استاد کے ساتھ آمنے سامنے کلاسوں میں جاتے ہیں علم کے لیے نہیں، بلکہ جو کچھ انہوں نے سیکھا ہے اس پر اعتماد، ترقی کے احساس اور ماہر (استاد) سے منظوری کے لیے۔ اگر طلباء اپنی پڑھائی میں ترقی محسوس نہیں کرتے ہیں تو وہ چھوڑ دیں گے۔ عام طور پر، کلاسز کو اس طرح ترتیب دیا جا سکتا ہے کہ طلباء واقف ڈھانچے کی تعداد میں اضافہ کرتے ہوئے ترقی محسوس کریں۔ یعنی پہلے ہم تفصیل کے ساتھ پڑھتے ہیں، پھر اس کے لیے پڑھتے ہیں، پھر کرتے ہیں، اور اب ہمارے پاس ایک ہزار ایک رات کا کورس تیار ہے، جس میں دو ماہ تک اکیلے چکر کا مطالعہ کیا جاتا ہے، اور آخر میں ایک طالب علم جس نے لکھا۔ ڈکٹیشن کے تحت ایک معیاری لائبریری۔ تاہم، عملی مسائل کو حل کرنے کے لیے، آپ کو نہ صرف مواد کا علم ہونا چاہیے، بلکہ اس کے اطلاق میں اور نئی معلومات کی تلاش میں بھی خود مختاری کی ضرورت ہے۔ اس لیے، آمنے سامنے کورسز کے لیے، میں سمجھتا ہوں کہ صحیح اصول یہ ہے کہ کم سے کم پڑھایا جائے اور باریکیوں اور متعلقہ موضوعات کے آزادانہ مطالعہ کی حوصلہ افزائی کی جائے۔ loops کے موضوع میں، میں while construct کو کم سے کم سمجھتا ہوں۔ آپ اس سے اصول سمجھ سکتے ہیں۔ اصول کو جان کر، آپ اپنے لیے اور کرتے وقت دونوں میں مہارت حاصل کر سکتے ہیں۔

کمزور طلبہ کی مواد پر عبور حاصل کرنے کے لیے، نحو کو بیان کرنا کافی نہیں ہے۔ مزید آسان لیکن متنوع کام دینے اور مثالوں کو مزید تفصیل سے بیان کرنا ضروری ہے۔ بالآخر، ترقی کی رفتار طالب علم کی تاثرات کو تبدیل کرنے اور نمونوں کو تلاش کرنے کی صلاحیت سے محدود ہوتی ہے۔ ہوشیار طلباء کے لیے، زیادہ تر اسائنمنٹ بورنگ ہوں گی۔ ان کے ساتھ مطالعہ کرتے وقت، آپ کو 100% مسائل حل کرنے پر اصرار کرنے کی ضرورت نہیں ہے۔ میرا مواد پر دیکھا جا سکتا ہے میرا گیتھب. یہ سچ ہے کہ ذخیرہ گاہ زیادہ تر جنگجو کے گریمور کی طرح ہے - میرے علاوہ کوئی نہیں سمجھے گا کہ کہاں ہے، اور اگر آپ چیک کرنے میں ناکام رہے تو آپ پاگل ہو سکتے ہیں۔

طریقہ کار پریکٹس پر مبنی ہے۔

نظریہ کی وضاحت کسی مسئلے کو حل کرنے کی مثال کے ذریعے کی گئی ہے۔ پروگرامنگ کلاس کے بنیادی اصولوں میں جہاں شاخیں اور لوپ پڑھائے جاتے ہیں، پورے گھنٹے تک ایک موضوع پر مفید لیکچر دینا ممکن نہیں ہے۔ تصور کی وضاحت کے لیے 15-20 منٹ کافی ہیں۔ عملی کاموں کو انجام دیتے وقت اہم مشکلات پیدا ہوتی ہیں۔
ابتدائی اساتذہ ایک لیکچر میں آپریٹرز، شاخوں، لوپس، اور صفوں کو ختم کر سکتے ہیں۔ لیکن ان کے طلباء کو اس معلومات کو ضم کرنے میں پریشانی کا سامنا کرنا پڑے گا۔
نہ صرف مواد کو بتانا بلکہ اس بات کو یقینی بنانا بھی ضروری ہے کہ سننے والے اسے سمجھیں۔

کسی موضوع پر عبور حاصل کرنے کی حقیقت کا تعین اس بات سے ہوتا ہے کہ طالب علم آزادانہ کام کا مقابلہ کیسے کرتا ہے۔
اگر کوئی طالب علم استاد کی مدد کے بغیر کسی موضوع پر کوئی مسئلہ حل کرنے میں کامیاب ہو گیا تو اس موضوع پر عبور حاصل کر لیا گیا ہے۔ خود جانچ کو یقینی بنانے کے لیے، ہر کام کو ٹیسٹ منظرناموں کے ساتھ ایک جدول میں بیان کیا گیا ہے۔ کاموں کی ایک واضح ترتیب ہے۔ کاموں کو چھوڑنے کی سفارش نہیں کی جاتی ہے۔ اگر موجودہ کام بہت مشکل ہے تو پھر اگلے کام پر جانا بیکار ہے۔ یہ اور بھی پیچیدہ ہے۔ تاکہ طالب علم موجودہ پیچیدہ کام میں مہارت حاصل کر سکے، پہلے مسئلے کی مثال کے ذریعے اسے کئی تکنیکیں سمجھائی جاتی ہیں۔ دراصل، موضوع کا پورا مواد مشکلات پر قابو پانے کی تکنیکوں پر آتا ہے۔ سائیکل ایک ضمنی اثر کے زیادہ ہیں.

پہلا کام ہمیشہ ایک مثال ہوتا ہے۔ دوسرا تھوڑا سا مختلف ہے اور اسے استاد کی نگرانی میں پہلی کے فوراً بعد "آزادانہ طور پر" انجام دیا جاتا ہے۔ تمام بعد کے کاموں کا مقصد مختلف چھوٹی چھوٹی چیزوں پر توجہ دینا ہے جو غلط فہمیوں کا سبب بن سکتی ہیں۔

مثال کی وضاحت ایک مکالمہ ہے جس میں طالب علم کو اس بات کا یقین کرنے کے لیے کہ اس نے مواد کے کسی حصے میں مہارت حاصل کر لی ہے، پروپیگیشن اور کراس توثیق کو واپس بلانے کی ضرورت ہے۔

میں یہ کہوں گا کہ اس موضوع پر پہلی مثال بہت اہم ہے۔ اگر آپ کے پاس وسیع آزاد کام کے لیے مواد ہے، تو پہلی مثال کی کوتاہیوں کو درست کیا جا سکتا ہے۔ اگر مثال کے علاوہ کوئی اور چیز نہیں ہے، تو غالب امکان ہے کہ طالب علم اس موضوع پر عبور حاصل نہیں کر پائے گا۔

جبکہ یا کے لیے؟

متنازعہ مسائل میں سے ایک مثال کے لیے تعمیر کا انتخاب ہے: جبکہ یا کے لیے۔ ایک بار، میرے ایک پریکٹس کرنے والے ڈویلپر دوست نے جس میں تدریس کا کوئی تجربہ نہیں تھا، مجھے یہ باور کرانے میں ایک گھنٹہ گزارا کہ فار لوپ کو سمجھنا سب سے آسان ہے۔ دلائل ابلتے ہوئے "اس میں موجود ہر چیز واضح اور اپنی جگہ پر رکھی ہوئی ہے۔" تاہم، حقیقی ابتدائیوں کے لیے مشکلات کی بنیادی وجہ سائیکل کا خیال ہے، نہ کہ اس کی تحریر۔ اگر کوئی شخص اس خیال کو نہ سمجھے تو اسے نحو میں مشکل پیش آئے گی۔ جیسے ہی خیال آتا ہے، کوڈ ڈیزائن کے مسائل خود ہی ختم ہو جاتے ہیں۔

میرے مواد میں، لوپس کا تھیم برانچنگ کے تھیم کی پیروی کرتا ہے۔ if اور while کی خارجی مماثلت ہمیں براہ راست مشابہت کھینچنے کی اجازت دیتی ہے: "جب ہیڈر میں شرط درست ہے، تو جسم کو پھانسی دی جاتی ہے۔" سائیکل کی واحد خاصیت یہ ہے کہ جسم کو کئی بار پھانسی دی جاتی ہے۔

میری دوسری دلیل یہ ہے کہ جبکہ for کے مقابلے میں کم فارمیٹنگ کی ضرورت ہوتی ہے۔ کم فارمیٹنگ کا مطلب ہے کوما اور قوسین کے ساتھ کم احمقانہ غلطیاں۔ ابتدائی افراد نے ابھی تک اتنی توجہ اور احتیاط پیدا نہیں کی ہے کہ وہ خود بخود نحوی غلطیوں سے بچ سکیں۔
تیسری دلیل کو بہت سی اچھی کتابوں میں پہلی دلیل کے طور پر بیان کیا گیا ہے۔

اگر طالب علم آسانی سے تاثرات کو تبدیل کر سکتا ہے، تو آپ پاسنگ کے بارے میں بات کر سکتے ہیں۔ اس کے بعد طالب علم اس چیز کا انتخاب کرے گا جو اسے زیادہ پسند ہے۔ اگر تبدیلیاں مشکلات کا باعث بنتی ہیں، تو بہتر ہے کہ آپ اپنی توجہ نہ بٹائیں۔ طالب علم کو پہلے استعمال کرتے ہوئے ہر چیز کو حل کرنے دیں۔ ایک بار جب آپ لوپس کے موضوع میں مہارت حاصل کر لیتے ہیں، تو آپ تبدیل کرنے کی مشق کرنے کے لیے حل کو دوبارہ لکھ سکتے ہیں۔
پوسٹ کنڈیشن لوپس ایک بہت ہی نایاب جانور ہیں۔ میں اس پر بالکل بھی وقت نہیں گزارتا۔ اگر کسی طالب علم نے نمونوں کی شناخت اور تاثرات کو تبدیل کرنے کے خیالات میں مہارت حاصل کی ہے، تو وہ میری مدد کے بغیر اس کا پتہ لگا سکتا ہے۔

مضبوط طلباء کے سامنے پہلی مثال کا مظاہرہ کرتے وقت، میں اس حقیقت کی طرف توجہ مبذول کرواتا ہوں کہ پہلی مثال میں نہ صرف حل کو ریکارڈ کرنا ضروری ہے، بلکہ عمل کے اس پورے سلسلے کو بھی درج کرنا ضروری ہے جس کی وجہ سے نتیجہ نکلا۔ سست طلباء تحریر کو نظر انداز کر سکتے ہیں اور صرف حتمی الگورتھم کاپی کر سکتے ہیں۔ انہیں یقین دلانے کی ضرورت ہے کہ ایک دن ایک مشکل کام ان کے راستے میں آئے گا۔ اسے حل کرنے کے لیے، آپ کو اس مثال کی طرح اقدامات پر عمل کرنے کی ضرورت ہوگی۔ اس لیے تمام مراحل کو ریکارڈ کرنا ضروری ہے۔ مندرجہ ذیل مسائل میں حل کے صرف آخری ورژن کو چھوڑنا ممکن ہو گا۔

آٹومیشن کا بنیادی خیال یہ ہے کہ ہم ایک کمپیوٹر کو کسی شخص کے لیے معمول کا کام کرنے کے لیے سونپتے ہیں۔ بنیادی تکنیکوں میں سے ایک لوپس لکھنا ہے۔ یہ اس وقت استعمال ہوتا ہے جب ایک پروگرام میں ایک قطار میں کئی ایک جیسی دہرائی جانے والی کارروائیاں لکھی جاتی ہیں۔

ظاہری سے بہتر ہے۔

پہلے لوپنگ ٹاسک میں ایک ہی جملے کو متعدد بار ظاہر کرنا ایک اچھا خیال لگتا ہے۔ مثال کے طور پر:

ہیرے، یہ کام کرتا ہے!
ہیرے، یہ کام کرتا ہے!
ہیرے، یہ کام کرتا ہے!
ہیرے، یہ کام کرتا ہے!
ہیرے، یہ کام کرتا ہے!
ہیرے، یہ کام کرتا ہے!
ہیرے، یہ کام کرتا ہے!
ہیرے، یہ کام کرتا ہے!

یہ آپشن خراب ہے کیونکہ کاؤنٹر ویلیو آؤٹ پٹ میں نظر نہیں آتی۔ یہ beginners کے لئے ایک مسئلہ ہے. اسے کم مت سمجھو۔ سب سے پہلے، یہ کام پہلا تھا، اور صعودی ترتیب میں اعداد کا سلسلہ اخذ کرنا دوسرا کام تھا۔ اضافی اصطلاحات "سائیکل این ٹائمز" اور "سائیکل سے A سے بی تک" متعارف کرانا ضروری تھا، جو کہ بنیادی طور پر ایک ہی چیز ہیں۔ غیر ضروری ہستیوں کو تخلیق نہ کرنے کے لیے، میں نے اعداد کی سیریز کے آؤٹ پٹ کے ساتھ صرف ایک مثال دکھانے کا فیصلہ کیا۔ بہت کم لوگ یہ سیکھنے کا انتظام کرتے ہیں کہ کس طرح اپنے سر میں کاؤنٹر رکھنا ہے اور بغیر تیاری کے اپنے سر میں کسی پروگرام کے طرز عمل کو ماڈل بنانا ہے۔ کچھ طلباء سب سے پہلے سائیکل کے موضوع پر ذہنی ماڈلنگ کا سامنا کرتے ہیں۔
کچھ مشق کے بعد، میں آزادانہ طور پر حل کرنے کے لیے اسی متن کو دہرانے کا ٹاسک دیتا ہوں۔ اگر آپ پہلے مرئی کاؤنٹر دیتے ہیں اور پھر پوشیدہ جواب دیتے ہیں، تو طلباء کو کم مسائل کا سامنا کرنا پڑے گا۔ بعض اوقات "اسکرین پر کاؤنٹر نہ لکھیں" کا اشارہ کافی ہوتا ہے۔

دوسرے اسے کیسے سمجھائیں؟

انٹرنیٹ پر زیادہ تر تعلیمی مواد میں، سائیکل کا نحو ایک "لیکچر" کے حصے کے طور پر دیا جاتا ہے۔ مثال کے طور پر، developer.mozilla.org پر (فی الحال)، while loop کے ساتھ کئی دیگر تعمیرات بیان کی گئی ہیں۔ اس صورت میں، صرف ڈیزائن خود ٹیمپلیٹس کی شکل میں دیے جاتے ہیں۔ ان کے آغاز کا نتیجہ الفاظ میں بیان کیا گیا ہے، لیکن کوئی مثال نہیں ہے۔ میری رائے میں، موضوع کی اس طرح کی پیشکش اس طرح کے مواد کی افادیت کو صفر سے ضرب دیتی ہے۔ طالب علم کوڈ کو دوبارہ لکھ سکتا ہے اور اسے خود چلا سکتا ہے، لیکن اسے پھر بھی موازنہ کے لیے ایک معیار کی ضرورت ہے۔ آپ کیسے سمجھ سکتے ہیں کہ ایک مثال کو صحیح طریقے سے دوبارہ لکھا گیا ہے اگر نتیجہ کا موازنہ کرنے کے لئے کچھ نہیں ہے؟
جب مثال کے بغیر صرف ایک ٹیمپلیٹ دیا جائے تو طالب علم کے لیے یہ اور بھی مشکل ہو جاتا ہے۔ یہ کیسے سمجھیں کہ کوڈ کے ٹکڑے ٹیمپلیٹ میں صحیح طریقے سے رکھے گئے ہیں؟ آپ لکھنے کی کوشش کر سکتے ہیں۔ کسی نہ کسی طرح، اور پھر چلائیں. لیکن اگر نتیجہ کا موازنہ کرنے کا کوئی معیار نہیں ہے، تو لانچ کرنے سے بھی کوئی فائدہ نہیں ہوگا۔

Intuitive پر C++ کورس میں، لوپ نحو کو لیکچر 4 کے تیسرے صفحہ میں "آپریٹرز" کے عنوان پر دفن کیا گیا ہے۔ لوپس کے نحو کی وضاحت کرتے وقت، اصطلاح "آپریٹر" پر خصوصی زور دیا جاتا ہے۔ اصطلاح کو حقائق کے ایک مجموعہ کے طور پر پیش کیا جاتا ہے جیسے "علامت؛ یہ ایک بیان ہے، "{} ایک مرکب بیان ہے"، "لوپ کا جسم ایک بیان ہونا چاہیے"۔ مجھے یہ نقطہ نظر پسند نہیں ہے کیونکہ ایسا لگتا ہے کہ یہ ایک اصطلاح کے پیچھے اہم تعلقات کو چھپاتا ہے۔ کسی پروگرام کے سورس کوڈ کو اس سطح پر اصطلاحات میں پارس کرنا کمپائلر ڈویلپرز کو زبان کی تصریح کو لاگو کرنے کے لیے درکار ہوتا ہے، لیکن طالب علموں کو پہلے قریب کے طور پر نہیں۔ پروگرامنگ میں نئے آنے والے شاذ و نادر ہی اتنے محتاط ہوتے ہیں کہ وہ شرائط پر اتنی گہری توجہ دیں۔ یہ ایک نایاب شخص ہے جو پہلی بار نئے الفاظ کو یاد اور سمجھتا ہے۔ تقریباً کوئی بھی اس اصطلاح کو درست طریقے سے لاگو نہیں کر سکتا جو اس نے ابھی سیکھی ہے۔ لہذا، طالب علموں کو بہت سی غلطیاں ملتی ہیں جیسے کہ "میں نے اس وقت لکھا تھا(a<7);{، لیکن پروگرام کام نہیں کرتا۔"
میری رائے میں شروع میں ہی بہتر ہے کہ فوری طور پر قوسین کے ساتھ تعمیر کا نحو دے دیا جائے۔ قوسین کے بغیر اختیار کی وضاحت صرف اس صورت میں کی جانی چاہیے جب طالب علم کا کوئی مخصوص سوال ہو: "کیوں کوئی قوسین نہیں ہے اور یہ کام کرتا ہے۔"

Okulov کی 2012 کی کتاب "Fundamentals of Programming" میں لوپس کا تعارف for پیٹرن سے شروع ہوتا ہے، پھر اس کے استعمال کے لیے سفارشات دیتا ہے، اور پھر فوراً سبق کے تجرباتی حصے میں جاتا ہے۔ میں سمجھتا ہوں کہ یہ کتاب بہت قابل طلباء کی اس اقلیت کے لیے لکھی گئی ہے جو میری کلاسوں میں شاذ و نادر ہی آتے ہیں۔

مشہور کتابوں میں، کوڈ کے ٹکڑوں کا نتیجہ ہمیشہ لکھا جاتا ہے۔ مثال کے طور پر، Shildt کا "Java 8. The Complete Guide" 2015 ایڈیشن۔ سب سے پہلے، ایک ٹیمپلیٹ دیا جاتا ہے، پھر ایک مثال پروگرام اور اس کے فورا بعد - عملدرآمد کا نتیجہ.

مثال کے طور پر، تھوڑی دیر کے لوپ پر غور کریں جو ریورس کرتا ہے۔
الٹی گنتی 10 سے شروع ہوتی ہے، اور "اقدامات" کی بالکل 10 لائنیں ظاہر ہوتی ہیں:

//Продемонстрировать применение оператора цикла while
class While {
    public static void main(String args []) {
        int n = 10;
        while (n > 0) {
            System.out.println("такт " + n);
            n--;
        }
    }
}

ایک بار چلنے کے بعد، یہ پروگرام مندرجہ ذیل دس "سائیکل" کو آؤٹ پٹ کرتا ہے:
такт 10
такт 9
такт 8
такт 7
такт 6
такт 5
такт 4
такт 3
такт 2
такт 1

ایک ٹیمپلیٹ، ایک مثالی پروگرام، اور اس پروگرام کے نتیجے کو بیان کرنے کا طریقہ کتاب "جاوا اسکرپٹ فار کڈز" اور w3schools.com پر js کورس میں بھی استعمال ہوتا ہے۔ ویب صفحہ کی شکل بھی اس مثال کو انٹرایکٹو ہونے کی اجازت دیتی ہے۔

Stroustrup کی 2016 کی کتاب پرنسپلز اینڈ پریکٹس یوزنگ C++ اور بھی آگے بڑھ گئی۔ پہلا مرحلہ یہ بتانا ہے کہ کیا نتیجہ حاصل کرنا چاہئے، اور اس کے بعد پروگرام کا متن دکھایا جاتا ہے۔ مزید یہ کہ، وہ نہ صرف ایک بے ترتیب پروگرام کو مثال کے طور پر لیتے ہیں، بلکہ تاریخ میں ایک سیر کرتے ہیں۔ اس سے اس کی طرف توجہ مبذول کرنے میں مدد ملتی ہے: "دیکھو، یہ صرف کچھ بیکار متن نہیں ہے۔ آپ کو کچھ معنی خیز نظر آتا ہے۔"

تکرار کی ایک مثال کے طور پر، ذخیرہ شدہ پروگرام مشین (EDSAC) پر عمل میں آنے والے پہلے پروگرام پر غور کریں۔ اسے ڈیوڈ وہیلر نے 6 مئی 1949 کو انگلینڈ کی کیمبرج یونیورسٹی کی کمپیوٹر لیبارٹری میں لکھا تھا۔ یہ پروگرام مربعوں کی ایک سادہ فہرست کا حساب لگاتا اور پرنٹ کرتا ہے۔
0 0
1 1
2 4
3 9
4 16
...
98 9604
99 9801

یہاں، ہر لائن میں ایک عدد ہوتا ہے جس کے بعد ایک ٹیب کریکٹر ('t') اور اس نمبر کا مربع ہوتا ہے۔ اس پروگرام کا C++ ورژن اس طرح لگتا ہے:

//Вычисляем и распечатываем таблицу квадратов чисел 0-99
int main()
{
    int i = 0; // Начинаем с нуля
    while(i < 100){
        cout << i << 't' << square(i) << 'n';
        ++i;
    }
}

دلچسپ بات یہ ہے کہ اس کتاب میں نحوی انداز بیان نہیں کیا گیا ہے۔ انسٹرکٹر کے دستی میں اسٹرسٹرپ (ترجمہ) اس بات پر زور دیتا ہے کہ وہ اپنے طلباء کی ذہانت کا احترام کرتا ہے۔ شاید کئی مثالوں میں ایک پیٹرن کی شناخت کرنے کی صلاحیت کو اس طرح کی ذہانت کا مظہر سمجھا جاتا ہے۔

جیسا کہ میں خود کو سمجھاتا ہوں۔

Stroustrup کا نقطہ نظر: نتیجہ بیان کرنا، پھر مسئلے کو حل کرنا، اور پھر طالب علم کا آزادانہ تجزیہ - سب سے زیادہ سوچ سمجھ کر لگتا ہے۔ لہذا، میں نے اسے بنیاد کے طور پر لینے کا فیصلہ کیا، لیکن ایک کم تاریخی مثال کا استعمال کرتے ہوئے اسے بتانا ہے - "مشتملات کا جدول" اخذ کرنے کا کام۔ یہ ایک قابل شناخت اینکر بناتا ہے تاکہ آپ پھر کہہ سکیں کہ "مشتملات کے جدول کے بارے میں کام کو یاد رکھیں" اور تاکہ طالب علموں کو یہ بالکل یاد ہو۔ اپنی مثال میں، میں نے دو اور عام غلط فہمیوں کو روکنے کی کوشش کی۔ آگے ان کے بارے میں مزید تفصیل سے لکھوں گا۔

اس کام میں ہمیں پیچیدہ مسائل کو حل کرنے کی تکنیکوں سے متعارف کرایا گیا ہے۔ ابتدائی فیصلہ ابتدائی اور سادہ کرنے کی ضرورت ہے۔ ٹھیک ہے، پھر آپ اس حل کو بہتر بنانے کے بارے میں سوچ سکتے ہیں.
Введение
Глава 1
Глава 2
Глава 3
Глава 4
Глава 5
Глава 6
Глава 7
Заключение

میرے مشاہدے کے مطابق، مختلف مجموعوں میں "ٹیمپلیٹ-مثال-نتیجہ" کا نقطہ نظر اب بھی اس حقیقت کی طرف لے جاتا ہے کہ طالب علم سائیکل کو ہیروگلیف کے طور پر سمجھتے ہیں۔ اس نے خود کو اس حقیقت سے ظاہر کیا کہ وہ یہ نہیں سمجھتے تھے کہ وہاں لکھنے کی شرط کیوں ہے، i++ اور i— اور دیگر بظاہر واضح چیزوں کے درمیان انتخاب کیسے کیا جائے۔ ان غلط فہمیوں سے بچنے کے لیے، سائیکلوں کے بارے میں بات کرنے کے نقطہ نظر میں ایک جیسی کارروائیوں کو دہرانے کے معنی پر زور دینا چاہیے اور صرف اس کے بعد ساخت کا استعمال کرتے ہوئے انہیں باقاعدہ بنانا چاہیے۔ لہذا، لوپ نحو دینے سے پہلے، آپ کو مسئلہ کو سر پر حل کرنے کی ضرورت ہے۔ مندرجات کی میز کے مسئلے کا ایک قدیم حل اس طرح لگتا ہے:

Console.WriteLine("Введение");
Console.WriteLine("Глава 1");
Console.WriteLine("Глава 2");
Console.WriteLine("Глава 3");
Console.WriteLine("Глава 4");
Console.WriteLine("Глава 5");
Console.WriteLine("Глава 6");
Console.WriteLine("Глава 7");
Console.WriteLine("Заключение");

اسے کیسے بہتر کیا جا سکتا ہے؟
نیرس اعمال کو سائیکل سے بدل دیں۔
بغیر کسی تبدیلی کے مسلسل کون سے اعمال دہرائے جاتے ہیں؟
اس ٹکڑے میں کوئی نہیں ہے۔ تاہم، ایک عدد کے ساتھ لفظ "باب" ظاہر کرنے کے احکامات ایک دوسرے سے بہت ملتے جلتے ہیں۔
لہذا، اگلا مرحلہ ٹکڑوں کے درمیان فرق کو تلاش کرنا ہے۔ یہ صرف اس کام میں ہے کہ سب کچھ واضح ہے، پھر ایک کمانڈ کو نہیں دہرایا جائے گا، لیکن 5 لائنوں یا اس سے زیادہ کے کوڈ کے بلاکس۔ آپ کو صرف کمانڈز کی فہرست میں نہیں بلکہ برانچنگ یا لوپ کنسٹرکشنز میں تلاش کرنا پڑے گا۔
مثال میں، کمانڈز کے درمیان فرق لفظ "باب" کے بعد نمبر میں ہے۔
ایک بار جب فرق پایا جاتا ہے، آپ کو تبدیلی کے پیٹرن کو سمجھنے کی ضرورت ہے. مختلف ٹکڑا نمبر ہے؟ کیا یہ مسلسل بڑھ رہا ہے یا کم ہو رہا ہے؟ دو ٹیموں کے درمیان ایک عدد کی قدر کیسے بدلتی ہے؟
مثال میں، لفظ "باب" کے بعد نمبر 1 کے اضافے سے بڑھتا ہے۔ فرق پایا جاتا ہے، پیٹرن ظاہر ہوتا ہے۔ اب آپ مختلف ٹکڑے کو متغیر سے بدل سکتے ہیں۔
آپ کو دہرائے جانے والے ٹکڑوں کے پہلے سے پہلے اس طرح کے متغیر کا اعلان کرنے کی ضرورت ہے۔ اس طرح کے متغیر کو عام طور پر I یا j یا کچھ زیادہ تفصیلی کہا جاتا ہے۔ اس کی ابتدائی قیمت اسکرین پر ظاہر ہونے والی پہلی قدر کے برابر ہونی چاہیے۔ مثال میں، پہلی قدر 1 ہے۔
"100، 101، 102، 103، 104، 105" نمبروں کی سیریز کو ظاہر کرنے کے لیے کیا ابتدائی قدر لی جانی چاہیے؟
اس سلسلے کا پہلا نمبر 100 ہے۔
ہر آؤٹ پٹ کمانڈ کے بعد، آپ کو اس متغیر کی قدر کو 1 تک بڑھانے کی ضرورت ہے۔ یہ یونٹ تبدیلی کا مرحلہ ہے۔
"100، 102، 104، 106" نمبروں کی سیریز میں کیا مرحلہ ہوگا؟
اس قطار میں مرحلہ 2۔
مختلف ٹکڑے کو متغیر سے تبدیل کرنے کے بعد، کوڈ اس طرح نظر آئے گا:

Console.WriteLine("Введение");
int i;
i = 0;
Console.WriteLine("Глава " + i);
i = i + 1;
Console.WriteLine("Глава " + i);
i = i + 1;
Console.WriteLine("Глава " + i);
i = i + 1;
Console.WriteLine("Глава " + i);
i = i + 1;
Console.WriteLine("Глава " + i);
i = i + 1;
Console.WriteLine("Глава " + i);
i = i + 1;
Console.WriteLine("Глава " + i);
i = i + 1;
Console.WriteLine("Заключение");

کوڈ میں "ایکسپریس دی پیٹرن آف ایک متغیر" تکنیک کو لاگو کرنے کے بعد، آپ کو ایک جیسی کارروائیوں کے کئی گروپ ملتے ہیں جو ایک قطار میں چلتے ہیں۔ اب دہرائی جانے والی کارروائیوں کو سائیکل سے تبدیل کیا جا سکتا ہے۔

کسی مسئلے کو حل کرنے کی ترتیب جہاں آپ کو لوپس استعمال کرنے کی ضرورت ہے درج ذیل مراحل پر مشتمل ہے:

  1. بہت سے الگ الگ کمانڈز کے ساتھ "ہیڈ آن" کو حل کریں۔
  2. ایک نمونہ تلاش کریں۔
  3. متغیر کے پیٹرن کا اظہار کریں۔
  4. ایک سائیکل کے طور پر ڈیزائن

اس کے بعد، نئی اصطلاحات متعارف کرائی جاتی ہیں تاکہ طالب علم خود کو "میں سب کچھ سمجھتا ہوں، لیکن میں یہ نہیں کہہ سکتا" کی حالت میں نہ پائے:
- کاؤنٹر ہمیشہ ایک متغیر ہوتا ہے جو لوپ میں قدموں کی تعداد کو ٹریک کرنے کے لیے درکار ہوتا ہے۔ عام طور پر ایک عدد عدد جس کا موازنہ رکاوٹ سے کیا جاتا ہے۔
جوابی قدم — جوابی تبدیلیوں کے پیٹرن کی تفصیل۔
- constraint - ایک عدد یا متغیر جس کے ساتھ کاؤنٹر کا موازنہ کیا جاتا ہے تاکہ الگورتھم حتمی ہو۔ کاؤنٹر ویلیو حد تک پہنچنے کے لیے تبدیل ہوتی ہے۔
- لوپ باڈی - کمانڈز کا ایک سیٹ جو دہرایا جائے گا۔ جب وہ کہتے ہیں کہ "کمانڈ ایک لوپ کے اندر لکھا گیا ہے،" ان کا مطلب جسم ہے۔
- لوپ تکرار - لوپ باڈی کا ایک وقتی عمل۔
- لوپ کنڈیشن - ایک منطقی اظہار جو اس بات کا تعین کرتا ہے کہ آیا ایک اور تکرار کو انجام دیا جائے گا۔ (یہاں برانچنگ ڈھانچے کے ساتھ الجھن ہوسکتی ہے)
آپ کو اس حقیقت کے لیے تیار رہنے کی ضرورت ہے کہ پہلے طلبہ اصطلاحات کو دوسرے مقاصد کے لیے استعمال کریں گے۔ یہ مضبوط اور کمزور دونوں پر لاگو ہوتا ہے۔ مشترکہ زبان کا قیام ایک فن ہے۔ اب میں مختصراً لکھوں گا: آپ کو ٹاسک سیٹ کرنے کی ضرورت ہے "<term> کے ساتھ کوڈ کے ٹکڑے کو نمایاں کریں" اور بات چیت میں خود ان شرائط کو درست طریقے سے استعمال کریں۔
ایک لوپ کے ساتھ تبدیلی کے بعد، ٹکڑا حاصل کیا جاتا ہے:

Console.WriteLine("Введение");
int i = 0;
while (i < 7) {
    Console.WriteLine("Глава " + i);
    i = i + 1;
}
Console.WriteLine("Заключение");

بنیادی غلط فہمی۔

طالب علموں کے درمیان ایک مقبول غلط فہمی یہ ہے کہ وہ ایک لوپ کے اندر ایکشن رکھتے ہیں جو صرف ایک بار کرنے کی ضرورت ہے۔ مثال کے طور پر اس طرح:

;
int i = 0;
while (i < 7) {
    Console.WriteLine("Введение")
    Console.WriteLine("Глава " + i);
    i = i + 1;
    Console.WriteLine("Заключение");
}

طالب علم ہر وقت اس مسئلے سے دوچار رہتے ہیں، شروع میں اور زیادہ پیچیدہ مسائل میں۔
اس معاملے میں اہم اشارہ:

آپ کو کمانڈ کو کتنی بار دہرانا چاہئے: ایک بار یا کئی بار؟

"تعارف" اور "اختتام" کے الفاظ پرنٹ کرنے اور متغیر i کا اعلان کرنے اور شروع کرنے کے احکامات دوسرے دہرائے جانے والے اعمال کی طرح نہیں ہیں۔ انہیں صرف ایک بار پھانسی دی جاتی ہے، جس کا مطلب ہے کہ انہیں لوپ باڈی کے باہر لکھنے کی ضرورت ہے۔

حل کے تینوں مراحل کوڈ میں رہنے چاہئیں تاکہ آپ بعد میں مشکلات کی صورت میں ان سے رجوع کر سکیں۔ پہلے دو اختیارات پر تبصرہ کرنا کافی ہے تاکہ وہ مداخلت نہ کریں۔
طالب علم کی توجہ درج ذیل حقائق کی طرف مبذول کرانی چاہیے:
- ایک لوپ حالت میں، ایک کاؤنٹر اور ایک حد کا عام طور پر موازنہ کیا جاتا ہے۔ کاؤنٹر لوپ کے جسم میں تبدیل ہوسکتا ہے، لیکن حد نہیں ہوسکتی ہے۔ اس قاعدے کو توڑنے کے لیے، آپ کو مجبوری کی وجوہات بنانے کی ضرورت ہے۔
- الفاظ "تعارف" اور "اختتام" کو ظاہر کرنے کے لیے کمانڈز لوپ کے باڈی کے باہر واقع ہیں۔ ہمیں انہیں 1 بار انجام دینے کی ضرورت ہے۔ "تعارف" - اعمال کو دہرانے سے پہلے، "نتیجہ" - بعد میں۔
اس موضوع کو مضبوط کرنے، اگلے پر عبور حاصل کرنے کے ساتھ ساتھ مشکلات سے نمٹنے کے عمل میں، یہاں تک کہ مضبوط طلباء کے لیے یہ سوال پوچھنا مفید ہے: "اس عمل کو کتنی بار انجام دینے کی ضرورت ہے؟ ایک یا کئی؟

اضافی مہارتوں کی ترقی

سائیکلوں کا مطالعہ کرنے کے عمل میں، طلباء مسائل کی تشخیص اور حل کرنے کی مہارت بھی پیدا کرتے ہیں۔ تشخیص کو انجام دینے کے لیے، طالب علم کو مطلوبہ نتیجہ پیش کرنے اور اس کا اصل نتیجہ سے موازنہ کرنے کی ضرورت ہے۔ اصلاحی اقدامات کا انحصار ان کے درمیان فرق پر ہے۔
چونکہ اس مرحلے پر طلباء کو ابھی بھی "مطلوبہ" نتیجہ کا بہت کم اندازہ ہے، اس لیے وہ ٹیسٹ ڈیٹا پر توجہ مرکوز کر سکتے ہیں۔ ایک اصول کے طور پر، اس مرحلے پر کوئی بھی نہیں سمجھتا کہ کیا غلط ہو سکتا ہے اور اس سے کیسے نمٹا جائے۔ لہذا، میں ایک نوٹ بک میں عام مسائل کی تفصیل اور ان کو حل کرنے کے کئی طریقے لکھتا ہوں۔ سب سے موزوں کا انتخاب خود طالب علم کا کام ہے۔
یہ پوچھنے کے لیے ایک ریکارڈ کی ضرورت ہے کہ "کیا ہونے کی توقع تھی؟"، "ان میں سے کون سی صورتحال اب ہوئی؟"، "کیا لاگو کردہ حل مدد ملی؟"

  1. کارروائیوں کی تعداد توقع سے 1 کم یا زیادہ ہے۔ حل:
    - کاؤنٹر کی ابتدائی قدر میں 1 اضافہ کریں۔
    - سخت موازنہ آپریٹر (< یا >) کو غیر سخت (<= یا >=) سے تبدیل کریں۔
    - حد کی قدر کو 1 میں تبدیل کریں۔
  2. ایک لوپ میں کارروائیاں غیر معینہ مدت تک رکے بغیر کی جاتی ہیں۔ حل:
    - کاؤنٹر چینج کمانڈ شامل کریں اگر یہ غائب ہے۔
    - کاؤنٹر چینج کمانڈ کو ٹھیک کریں تاکہ اس کی قدر حد کے قریب ہوجائے۔
    اگر یہ لوپ کے باڈی میں ہے تو کنسٹرائنٹ چینج کمانڈ کو ہٹا دیں۔
  3. ایک لوپ میں کارروائیوں کی تعداد 1 سے کم یا توقع سے زیادہ ہے۔ لوپ میں کارروائی ایک بار بھی نہیں کی گئی۔ سب سے پہلے آپ کو لوپ شروع ہونے سے پہلے متغیرات کی اصل قدریں معلوم کرنے کی ضرورت ہے۔ حل:
    - رکاوٹ کی ابتدائی قدر کو تبدیل کریں۔
    - کاؤنٹر کی ابتدائی قیمت کو تبدیل کریں۔

مسئلہ 3 میں عام طور پر غلط متغیر کا استعمال کرنا یا کاؤنٹر کو صفر پر دوبارہ ترتیب نہ دینا شامل ہے۔

اس وضاحت کے بعد، طالب علم کو اب بھی مختلف غلط فہمیاں ہو سکتی ہیں کہ لوپس کیسے کام کرتے ہیں۔
سب سے عام کو دور کرنے کے لیے، میں آپ کو درج ذیل کام دیتا ہوں:

  1. جس میں صارف کی طرف سے حد، ابتدائی کاؤنٹر ویلیو، یا جوابی قدم درج کیا جاتا ہے۔
  2. جس میں کاؤنٹر ویلیو کو کچھ ریاضی کے اظہار میں استعمال کیا جانا چاہئے۔ ریڈیکل ایکسپریشن یا ڈینومینیٹر میں کاؤنٹر استعمال کرنے کا مشورہ دیا جاتا ہے تاکہ فرق نان لائنر ہو۔
  3. جس میں کاؤنٹر ویلیو اسکرین پر ظاہر نہیں ہوتی جب کہ لوپ چل رہا ہو۔ مثال کے طور پر، ایک جیسے متن کے ٹکڑوں کی مطلوبہ تعداد کو ظاہر کرنا یا کچھوے کے گرافکس کے ساتھ ایک شکل بنانا۔
  4. جس میں آپ کو پہلے کچھ دہرانے والے اعمال انجام دینے کی ضرورت ہے، اور پھر دیگر۔
  5. جس میں آپ کو دہرانے سے پہلے اور بعد میں دیگر اعمال انجام دینے کی ضرورت ہے۔

ہر کام کے لیے آپ کو ٹیسٹ ڈیٹا اور متوقع نتیجہ فراہم کرنے کی ضرورت ہے۔

یہ سمجھنے کے لیے کہ آپ کتنی جلدی حرکت کر سکتے ہیں، آپ کو ان مسائل کی شرائط کو پڑھنا ہوگا اور پوچھنا ہوگا: "وہ مثال سے کیسے مختلف ہیں؟"، "ان کو حل کرنے کے لیے مثال میں کس چیز کو تبدیل کرنے کی ضرورت ہے؟" اگر طالب علم معنی خیز جواب دیتا ہے تو اسے کم از کم ایک کلاس میں اور باقی گھر میں خود ہی حل کرنے دیں۔ اگر حل کامیاب ہو جاتا ہے، تو ہم لوپس کے اندر کے حالات کی وضاحت شروع کر سکتے ہیں۔
اگر آپ کو خود ہی مسائل حل کرنے میں دشواری ہے، تو آپ کو کلاس میں ہر چیز پر کام کرنے کی ضرورت ہے۔ اس مسئلے کو حل کرنے سے بچنے کے لیے جو اُلّو کی تصویر کشی کی یاد دلاتا ہے، میں تجویز کرتا ہوں کہ پہلے اس مسئلے کو غیر عالمگیر طریقے سے حل کریں۔ یعنی، تاکہ حل پہلا امتحان پاس کرے اور لوپ کی تعمیر کا استعمال نہ کرے۔ ٹھیک ہے، پھر حل کی آفاقیت کو حاصل کرنے کے لیے تبدیلیوں کا اطلاق کریں۔

لوپس اور شاخیں

میری رائے میں، "شاخوں کے اندر سائیکل" کا عنوان الگ سے دینا مفید ہے۔ تاکہ بعد میں آپ ایک شرط کو متعدد بار چیک کرنے اور ایک بار چیک کرنے کے درمیان فرق دیکھ سکیں۔
یکجا کرنے کے کام A سے B تک نمبروں کو آؤٹ پٹ کرنے کے بارے میں ہوں گے، جو صارف کے ذریعہ درج کیے گئے ہیں:
- ہمیشہ صعودی ترتیب میں۔
- A اور B کی قدروں کے لحاظ سے صعودی یا نزول۔

"لوپس کے اندر برانچنگ" کے موضوع کو طالب علم کی تکنیکوں میں مہارت حاصل کرنے کے بعد ہی آگے بڑھایا جانا چاہئے: "متغیر کے ساتھ پیٹرن کو تبدیل کرنا" اور "دوہرائی جانے والی کارروائیوں کو سائیکل سے تبدیل کرنا۔"
لوپس کے اندر شاخوں کو استعمال کرنے کی بنیادی وجہ پیٹرن میں بے ضابطگی ہے۔ درمیان میں یہ ابتدائی ڈیٹا کے لحاظ سے ٹوٹ جاتا ہے۔
ان طلباء کے لیے جو آسان تکنیکوں کو ملا کر حل تلاش کرنے کے قابل ہیں، یہ کہنا کافی ہے کہ "برانچنگ کو لوپس کے اندر لکھا جا سکتا ہے" اور مسئلہ کو "مثال کے طور پر" مکمل طور پر آزادانہ طور پر حل کرنے کے لیے دیں۔
مثالی کام:

صارف نمبر X داخل کرتا ہے۔ کالم میں 0 سے 9 تک کے نمبروں کو دکھائیں اور نمبر کے سامنے '+' نشان لگائیں جو X کے برابر ہے۔

اگر 0 درج کیا گیا تھا۔0+
1
2
3
4
5
6
7
8
9

اگر 6 درج کیا گیا تھا۔0
1
2
3
4
5
6+
7
8
9

اگر 9 درج کیا گیا تھا۔0
1
2
3
4
5
6
7
8
9+

اگر 777 درج کیا گیا تھا۔0
1
2
3
4
5
6
7
8
9

اگر ایک مختصر وضاحت لوپ کے ساتھ لکھنے کے لیے کافی نہیں ہے، تو آپ کو لوپ کے بغیر اسی مسئلے کا عالمگیر حل حاصل کرنے کی ضرورت ہے۔
آپ کو دو میں سے ایک آپشن ملے گا:
مطلوبہ

string temp;
temp = Console.ReadLine();
int x;
x = int.Parse(temp);
if (x==0) {
    Console.WriteLine(0 + "+");
} else {
    Console.WriteLine(0);
}
if (x==1) {
    Console.WriteLine(1 + "+");
} else {
    Console.WriteLine(1);
}
if (x==2) {
    Console.WriteLine(2 + "+");
} else {
    Console.WriteLine(2);
}
if (x==3) {
    Console.WriteLine(3 + "+");
} else {
    Console.WriteLine(3);
}
if (x==4) {
    Console.WriteLine(4 + "+");
} else {
    Console.WriteLine(4);
}
if (x==5) {
    Console.WriteLine(5 + "+");
} else {
    Console.WriteLine(5);
}
if (x==6) {
    Console.WriteLine(6 + "+");
} else {
    Console.WriteLine(6);
}
if (x==7) {
    Console.WriteLine(7 + "+");
} else {
    Console.WriteLine(7);
}
if (x==8) {
    Console.WriteLine(8 + "+");
} else {
    Console.WriteLine(8);
}
if (x==9) {
    Console.WriteLine(9 + "+");
} else {
    Console.WriteLine(9);
}

ممکن

string temp;
temp = Console.ReadLine();
int x;
x = int.Parse(temp);
if (x==0) {
    Console.WriteLine("0+n1n2n3n4n5n6n7n8n9");
}
if (x==1) {
    Console.WriteLine("0n1+n2n3n4n5n6n7n8n9");
}
if (x==2) {
    Console.WriteLine("0n1n2+n3n4n5n6n7n8n9");
}
if (x==3) {
    Console.WriteLine("0n1n2n3+n4n5n6n7n8n9");
}
if (x==4) {
    Console.WriteLine("0n1n2n3n4+n5n6n7n8n9");
}
if (x==5) {
    Console.WriteLine("0n1n2n3n4n5+n6n7n8n9");
}
if (x==6) {
    Console.WriteLine("0n1n2n3n4n5n6+n7n8n9");
}
if (x==7) {
    Console.WriteLine("0n1n2n3n4n5n6n7+n8n9");
}
if (x==8) {
    Console.WriteLine("0n1n2n3n4n5n6n7n8+n9");
}
if (x==9) {
    Console.WriteLine("0n1n2n3n4n5n6n7n8n9+");
}

برانچنگ کے موضوع کا مطالعہ کرتے ہوئے، میں پیشگی ایک ایسا ہی کام دیتا ہوں۔
اگر طالب علم "ممکنہ" آپشن لے کر آتا ہے، تو آپ کو انہیں بتانا ہوگا کہ ایک ہی مسئلے کے بہت سے حل ہو سکتے ہیں۔ تاہم، وہ ضروریات میں تبدیلیوں کے خلاف مزاحمت میں مختلف ہیں۔ سوال پوچھیں: "اگر مجھے کوئی اور نمبر شامل کرنا پڑے تو کوڈ میں کتنی جگہوں کو درست کرنے کی ضرورت ہوگی؟" "ممکنہ" ورژن میں، آپ کو ایک اور برانچ شامل کرنے اور 10 دوسری جگہوں پر ایک نیا نمبر شامل کرنے کی ضرورت ہوگی۔ "مطلوبہ" میں صرف ایک شاخ شامل کرنا کافی ہے۔
"مطلوبہ" آپشن کو دوبارہ پیش کرنے کے لیے ٹاسک کو سیٹ کریں، پھر کوڈ میں ایک پیٹرن تلاش کریں، متغیر کو تبدیل کریں اور ایک لوپ لکھیں۔
اگر آپ کو اس مسئلے کو کسی اور طریقے سے حل کرنے کے بارے میں کوئی خیال ہے تو، براہ کرم تبصرے میں لکھیں۔

لوپس کے اندر لوپس

اس موضوع میں آپ کو درج ذیل باتوں پر توجہ دینے کی ضرورت ہے۔
- اندرونی اور بیرونی لوپ کے کاؤنٹر مختلف متغیر ہونے چاہئیں۔
- اندرونی لوپ کے کاؤنٹر کو کئی بار دوبارہ ترتیب دینا ضروری ہے (یعنی بیرونی لوپ کے باڈی میں)۔
— ٹیکسٹ آؤٹ پٹ ٹاسکس میں، آپ پہلے ایک حرف کئی سطروں میں نہیں لکھ سکتے، اور پھر دوسرا۔ آپ کو پہلے پہلی سطر کے تمام حروف، پھر دوسری کے تمام حروف وغیرہ پرنٹ کرنے چاہئیں۔

کاؤنٹر کو صفر پر دوبارہ ترتیب دینے کی اہمیت کی وضاحت کرتے ہوئے لوپس کے اندر لوپس کے موضوع کی وضاحت کرنا بہتر ہے۔
مثالی کام:

صارف دو نمبر داخل کرتا ہے: R اور T۔ "#" حروف کی دو لائنیں پرنٹ کریں۔ پہلی لائن میں R حروف ہونا چاہیے۔ دوسری لائن میں T کے ٹکڑے ہیں۔ اگر کوئی نمبر منفی ہے تو غلطی کا پیغام دکھائیں۔

R=5، T=11#####
#############

R=20، T=3###################
# # # # # # #

R=-1، T=6R کی قدر غیر منفی ہونی چاہیے۔

R=6، T=-2T قدر غیر منفی ہونی چاہیے۔

ظاہر ہے اس مسئلے کے بھی کم از کم دو حل ہیں۔
مطلوبہ

string temp;
int R;
int T;
temp = Console.ReadLine();
R = int.Parse(temp);
temp = Console.ReadLine();
T = int.Parse(temp);
int i = 0;
while (i < R)
{
    Console.Write("#");
    i = i + 1;
}
Console.WriteLine();
i = 0;
while (i < T)
{
    Console.Write("#");
    i = i + 1;
}

ممکنہ نمبر 1

string temp;
int R;
int T;
temp = Console.ReadLine();
R = int.Parse(temp);
temp = Console.ReadLine();
T = int.Parse(temp);
int i = 0;
while (i < R)
{
    Console.Write("#");
    i = i + 1;
}
Console.WriteLine();
int j = 0;
j = 0;
while (j < T)
{
    Console.Write("#");
    j = j + 1;
}

فرق یہ ہے کہ "ممکنہ" حل میں، دوسری لائن کو آؤٹ پٹ کرنے کے لیے دوسرا متغیر استعمال کیا جاتا تھا۔ آپ کو دونوں لوپس کے لیے ایک ہی متغیر کے استعمال پر اصرار کرنا چاہیے۔ اس حد کو اس حقیقت سے درست قرار دیا جا سکتا ہے کہ دو چکروں کے لیے ایک کاؤنٹر والا حل "کاؤنٹر ری سیٹ" کی اصطلاح کی مثال ہو گا۔ مندرجہ ذیل مسائل کو حل کرتے وقت اس اصطلاح کو سمجھنا ضروری ہے۔ سمجھوتہ کے طور پر، آپ مسئلے کے دونوں حل محفوظ کر سکتے ہیں۔

دو لوپس کے لیے ایک کاؤنٹر متغیر استعمال کرنے میں ایک عام مسئلہ اس طرح ظاہر ہوتا ہے:
R=5، T=11#####
#######

دوسری سطر میں حروف کی تعداد T کی قدر سے مطابقت نہیں رکھتی۔ اگر آپ کو اس مسئلے میں مدد کی ضرورت ہے، تو آپ کو لوپس کے ساتھ عام مسائل کے بارے میں نوٹس کو دیکھنے کی ضرورت ہے۔ یہ علامت نمبر 3 ہے۔ اس کی تشخیص ہوتی ہے اگر آپ دوسرے چکر سے فوراً پہلے کاؤنٹر ویلیو آؤٹ پٹ شامل کرتے ہیں۔ دوبارہ ترتیب دے کر درست کیا گیا۔ لیکن بہتر ہے کہ یہ فوراً نہ بتائیں۔ طالب علم کو کم از کم ایک مفروضہ ترتیب دینے کی کوشش کرنی چاہیے۔

یقیناً ایک اور حل بھی ہے۔ لیکن میں نے اسے طلباء میں کبھی نہیں دیکھا۔ سائیکل کے مطالعہ کے مرحلے پر، اس کے بارے میں کہانی توجہ کو ہٹا دے گی. سٹرنگ فنکشنز کے بارے میں سیکھنے پر آپ بعد میں اس پر واپس آ سکتے ہیں۔
ممکنہ نمبر 2

string temp;
int R;
int T;
temp = Console.ReadLine();
R = int.Parse(temp);
temp = Console.ReadLine();
T = int.Parse(temp);
Console.WriteLine(new String('#', R));
Console.WriteLine(new String('#', T));

اگلا مطلوبہ کام:

نمبر 0 سے 9 تک دکھائیں۔ ہر نمبر کو اس کی اپنی لائن پر ہونا چاہیے۔ ایک لائن (W) میں ہندسوں کی تعداد کی بورڈ سے درج کی جاتی ہے۔

ڈبلیو = 10
1
2
3
4
5
6
7
8
9

ڈبلیو = 100000000000
1111111111
2222222222
3333333333
4444444444
5555555555
6666666666
7777777777
8888888888
9999999999

اگر ایک طالب علم نے متغیر کو تبدیل کرنے کی تکنیک میں مہارت حاصل کی ہے، تو وہ کافی تیزی سے مقابلہ کرے گا۔ ایک ممکنہ مسئلہ پھر متغیر کو دوبارہ ترتیب دینے میں ہو گا۔ اگر آپ تبدیلی کو نہیں سنبھال سکتے، تو اس کا مطلب ہے کہ آپ جلدی میں تھے اور آسان مسائل کو حل کرنے کی ضرورت ہے۔

آپکی توجہ کا شکریہ. چینل کو لائک اور سبسکرائب کریں۔

PS اگر آپ کو متن میں ٹائپنگ کی غلطیاں یا غلطیاں نظر آئیں تو براہ کرم مجھے بتائیں۔ یہ ٹیکسٹ کے کچھ حصے کو منتخب کرکے اور Mac پر "⌘ + Enter" اور کلاسک کی بورڈز پر "Ctrl / Enter" دبانے، یا نجی پیغامات کے ذریعے کیا جا سکتا ہے۔ اگر یہ آپشنز دستیاب نہیں ہیں تو کمنٹس میں غلطیوں کے بارے میں لکھیں۔ شکریہ!

سروے میں صرف رجسٹرڈ صارفین ہی حصہ لے سکتے ہیں۔ سائن ان، برائے مہربانی.

کرما کے بغیر قارئین کے لیے پول

  • 20,0٪میں پیشہ ورانہ طور پر پڑھاتا ہوں، +12

  • 10,0٪میں پیشہ ورانہ طور پر پڑھاتا ہوں، -11

  • 70,0٪میں نہیں سکھاتا، +17

  • 0,0٪میں نہیں سکھاتا، -10

  • 0,0٪دیگر0

10 صارفین نے ووٹ دیا۔ 5 صارفین غیر حاضر رہے۔

ماخذ: www.habr.com

نیا تبصرہ شامل کریں