JavaRush /جاوا بلاگ /Random-UR /ہارورڈ CS50: ہفتہ 2 اسائنمنٹس (لیکچرز 5 اور 6)
Masha
سطح

ہارورڈ CS50: ہفتہ 2 اسائنمنٹس (لیکچرز 5 اور 6)

گروپ میں شائع ہوا۔
لیکچرز 5 اور 6 کے لیے cs50 اسائنمنٹس CS50 لیکچرز یہاں ہیں: https://cdn.javarush.com/images/article/155cea79-acfd-4968-9361-ad585e939b82/original.pngcs50.html ۔ اس مواد میں 3 کام، ان کے بارے میں نظریاتی معلومات اور عمل کے لیے رہنمائی شامل ہے۔

اہداف

• فنکشنز اور لائبریریوں کی گہرائی میں جائیں • کرپٹوگرافی سے واقف ہوں، چند سادہ سیفرز کو لاگو کریں

اضافی مواد

https://reference.cs50.net/ - تربیت کے دوران استعمال ہونے والے لائبریری کے افعال کی وضاحت۔ انگریزی میں. http://computer.howstuffworks.com/c.htm صفحہ 11 – 14 اور 39

تیاری

cs50.io میں لاگ ان کریں update50 اس بات کو یقینی بنانے کے لیے کہ آپ کا ورک اسپیس ورژن اپ ٹو ڈیٹ ہے۔ اگر آپ غلطی سے ٹرمینل ونڈو کو بند کر دیتے ہیں، تو ویو مینو پر جائیں اور یقینی بنائیں کہ کنسول آئٹم کے آگے ایک چیک مارک موجود ہے (اگر یہ نہیں ہے تو اسے چیک کریں)۔ ہارورڈ CS50: ہفتہ 2 اسائنمنٹس (لیکچرز 5 اور 6) - 1 ٹرمینل ونڈو کے فریم پر سبز دائرے کے اندر (+) پر کلک کریں، نیا ٹرمینل منتخب کریں ۔ ہارورڈ CS50: ہفتہ 2 اسائنمنٹس (لیکچرز 5 اور 6) - 2 ایک ورکنگ ڈائرکٹری بنائیں: mkdir ~/workspace/pset2 نوٹ کریں کہ mkdir اور ~/workspace/pset2 کے درمیان ایک جگہ ہے ۔ recap کرنے کے لیے، ~ کا مطلب ہے روٹ ڈائرکٹری، ~/workspace ایک فولڈر ہے جسے روٹ ڈائرکٹری کے اندر ورک اسپیس کہتے ہیں، ~/workspace/pset2 ایک ڈائریکٹری ہے جسے pset2 کے اندر کہتے ہیں ~/workspace ۔ اب چلائیں: cd ~/workspace/pset2 نئی ڈائریکٹری میں تبدیل کرنے کے لیے۔ کمانڈ لائن کچھ اس طرح نظر آتی ہے: username:~/workspace/pset2 $ اگر کچھ غلط ہے تو، اقدامات کو دوبارہ کریں. آپ history آخری چند کمانڈز کو تاریخی ترتیب میں دیکھنے کے لیے ایک کمانڈ کو بھی کال کر سکتے ہیں۔ آپ اپنے کرسر کو کمانڈ لائن پر بھی رکھ سکتے ہیں اور اپنے کی بورڈ پر اوپر والے تیر کو دبائیں تاکہ آخری درج کردہ سے پہلی تک تمام کمانڈز کو ترتیب سے دیکھیں۔ نیچے والے بٹن کا استعمال کرتے ہوئے آپ واپس جا سکتے ہیں۔ ویسے، ہر بار ایک ہی کمانڈز کو ٹائپ کرنے کے بجائے، آپ ان کمانڈز کو اسکرول کر سکتے ہیں جو آپ پہلے ہی ٹائپ کر چکے ہیں اور Enter دبا کر ان پر دوبارہ عمل کر سکتے ہیں۔ آپ نے دیکھا ہوگا کہ ڈیوڈ اپنے لیکچرز میں بالکل ایسا ہی کرتا ہے۔ دوسرے ہفتے کے کاموں کو pset2 میں محفوظ کیا جانا چاہیے ۔

ٹاسک 0۔ آغاز

آئیے لائنوں کو قریب سے دیکھیں۔ Initials.c فائل میں ، ایک پروگرام لکھیں جو صارف کے نام کی درخواست کرتا ہے (GetString فنکشن کا استعمال کرتے ہوئے ہم ایک سٹرنگ کے طور پر نام حاصل کرتے ہیں) اور پھر پہلے نام کے پہلے حروف (یا نام) اور آخری نام کو خالی جگہوں کے بغیر بڑے حروف میں دکھاتا ہے، ادوار یا دوسرے حروف، صرف ایک لائن فیڈ ( \n ) کے ساتھ۔ ہم فرض کرتے ہیں کہ صارفین صرف حروف (لوئر یا اپر کیس، یا دونوں) کے علاوہ الفاظ کے درمیان ایک جگہ درج کرتے ہیں۔ غور کریں کہ جوزف گورڈن لیویٹ، کونن اوبرائن، یا ڈیوڈ جے ملان نام کے لوگ پروگرام استعمال نہیں کریں گے۔ پروگرام کے درست آپریشن کو چیک کرنے کے لیے، check50 پر کال کریں: کیا آپ CS50 کے عملے کے تیار کردہ پروگرام کے نفاذ کے ساتھ کھیلنا چاہتے ہیں؟ لائن ٹائپ کریں: username:~/workspace/pset2 $ ./initials Zamyla Chan ZC username:~/workspace/pset2 $ ./initials robert thomas bowden RTBcheck50 2015.fall.pset2.initials initials.c~cs50/pset2/initials
خفیہ نگاری
خفیہ نگاری، معلومات کو خفیہ کرنے اور سمجھنے کی سائنس... درحقیقت، خفیہ پیغامات قدیم زمانے سے موجود ہیں، اور خفیہ پیغامات کی ترسیل کے لیے فوجیں استعمال کرتی تھیں۔ ٹھیک ہے، اب فیس بک اور دیگر نیٹ ورکس پر آپ کے پاس ورڈز انکرپٹڈ شکل میں محفوظ ہیں۔

ٹاسک 1. سلام، سیزر!

نظریاتی معلومات
ہم سب سے آسان سائفرز میں سے ایک کا مطالعہ کریں گے - سیزر سائفر، جسے رومن شہنشاہ کے نام پر رکھا گیا ہے۔ اس سائفر میں، متن کے ہر حرف کو دوسرے سے بدل دیا جاتا ہے، جو حروف تہجی میں کم حروف کی ایک مقررہ تعداد ہے۔ حروف کی اس مقررہ تعداد کو کلید کہا جاتا ہے ۔ لہذا، کلید 1 لاطینی حرف C کو حرف D میں اور Z کو سائیکل کے ذریعے A میں تبدیل کرتی ہے۔ اگر کلید 3 ہے، تو حرف C F میں اور Z کو C میں تبدیل کر دے گا۔ مثالیں: ہم سیزر سائفر کو اس کے ساتھ استعمال کرتے ہیں۔ لفظ بلی پر کلید 5۔ c -> h a -> f t -> y Caesar (cat, 5) = hfy کلید = 7، لفظ = کمپیوٹر c->j o->v m->t p->w u->b t->a e->l r->y Caesar(computer,7) = jvtwbaly ہارورڈ CS50: ہفتہ 2 اسائنمنٹس (لیکچرز 5 اور 6) - 3 سیزر سائفر سادہ ہے، لیکن افسوس، ناقابل اعتبار ہے (یہ آپس میں جڑی ہوئی چیزیں ہیں!): انگریزی حروف تہجی کے لیے صرف 25 خفیہ کاری کے اختیارات ہیں، کمپیوٹر کے بغیر بھی تمام اختیارات سے گزرنا آسان ہے۔ تاہم، سیزر سائفر اکثر دوسرے سائفرز میں ایک قدم کے طور پر استعمال ہوتا ہے، جیسے کہ Vigenère سائفر (اگلے پیراگراف میں اس پر مزید)۔ آئیے سیزر سائفر کو "ریاضی بنائیں"۔ آئیے سادہ متن کو حرف p سے ظاہر کرتے ہیں، pi متن p میں وہ حرف ہے جو پوزیشن نمبر i پر ہے۔ آئیے خفیہ کلیدی خط کو کال کریں، c کو سائفر ٹیکسٹ، اور ci کو اس سائفر ٹیکسٹ میں خط کہتے ہیں جو i پوزیشن پر ہے۔ پھر آپ فارمولے کا استعمال کرتے ہوئے سائفر کے ہر حرف کا حساب لگا سکتے ہیں: ci = (pi + k) % 26 اس فارمولائزیشن کی عادت ڈالیں، یہ آپ کو الگورتھم پروگرام کرنے کی اجازت دیتا ہے اور سائفر کے معنی کو درست اور اختصار سے ظاہر کرتا ہے۔ اگر کلیدی k = 13 اور اصل متن p ہے "اپنی اوولٹائن پینا یقینی بنائیں!"، یہ وہ سائفر ہے جو ہمیں ملتا ہے: Or fher gb qevax lbhe Binygvar! نوٹ کریں کہ O (سائپر ٹیکسٹ میں پہلا حرف) حرف B سے 13 پوزیشنز منتقل ہو گیا ہے۔ اصل متن میں پہلا حرف)۔ حرف r (انکرپشن میں دوسرا حرف) کے ساتھ ایک ہی چیز کو e (اصل میں دوسرا حرف) سے 13 حروف منتقل کیا گیا ہے۔ خفیہ کاری میں تیسرا حرف، f، s سے 13 حروف سے منتقل ہوتا ہے (اصل میں تیسرا)، یہاں ہم z سے a کی طرف دائرے میں جاتے ہیں۔ کلید 13 کے ساتھ ایک سیزر سائفر کا خاص نام ROT13 ہے ۔ یہ سڈول ہے: اسے دو بار لگانے سے، ہم اصل متن کی طرف لوٹتے ہیں۔ بلاشبہ، ROT26 بھی ہے، یہ عام طور پر انتہائی محفوظ ہے، لیکن صرف اس صورت میں جب آپ اپنے خیالات کا واضح طور پر اظہار نہ کریں =)۔
حالت
caesar.c فائل میں ایک پروگرام لکھیں جو سیزر سائفر کا استعمال کرتے ہوئے متن کو خفیہ کرتا ہے۔ پروگرام میں ان پٹ کے بطور ایک کمانڈ لائن دلیل فراہم کریں: ایک غیر منفی عدد۔ سادگی کے لیے، آئیے اسے k کہتے ہیں۔ اگر صارف پروگرام کو بغیر کمانڈ لائن کے دلائل کے یا ایک سے زیادہ دلیلوں کے ساتھ چلاتا ہے، تو درخواست کو شکایت کرنی چاہیے اور قدر 1 واپس کرنا چاہیے (عام طور پر اس طرح غلطیوں کی نشاندہی کی جاتی ہے): return 1; دیگر تمام معاملات میں، پروگرام صارف کو متن کے لیے اشارہ کرتا ہے۔ انکرپٹ کرنے کے لیے، پھر کلیدی k کے ساتھ خفیہ کردہ متن دکھاتا ہے (یعنی، سائیکل کے ساتھ ساتھ k پوزیشنز کو دائیں طرف منتقل کیا گیا)۔ اگر متن میں ایسے حروف ہیں جو انگریزی حروف تہجی سے باہر ہیں، تو پروگرام انہیں تبدیل نہیں کرتا ہے۔ سائفر ٹیکسٹ پرنٹ کرنے کے بعد، ایپلی کیشن باہر نکلتی ہے، مین ریٹرن 0: return 0; اگر main واضح طور پر صفر نہیں لوٹاتا ہے، تو یہ اسے خود بخود واپس کر دیتا ہے (int اصل میں مین کی واپسی کی قسم ہے، لیکن اس پر کسی اور وقت مزید)۔ کنونشن (پروگرامنگ میں اچھی شکل کے اصول) کے مطابق، اگر آپ واضح طور پر غلطی کی نشاندہی کرنے کے لیے 1 واپس کرتے ہیں، تو آپ کو پروگرام کی کامیاب تکمیل کے لیے 0 کو بھی ایک پوائنٹر کے طور پر واپس کرنا چاہیے۔ اگرچہ انگریزی حروف تہجی میں صرف 26 حروف ہیں، k 26 سے بڑا ہو سکتا ہے۔ بنیادی طور پر، کلید k = 27 وہی نتیجہ دے گی جو k = 1 ہے، لیکن آپ کو صارف کو کوئی بھی غیر منفی نمبر درج کرنے کی اجازت دینی ہوگی۔ 2^31 - 26 سے زیادہ (اس کا int میں فٹ ہونا ضروری ہے)۔ پروگرام کو اس بات کا بھی خیال رکھنا چاہیے کہ چھوٹے حروف کو چھوٹے حروف میں خفیہ کیا جاتا ہے، اور بڑے حروف کو بڑے حروف میں خفیہ کیا جاتا ہے۔ ہم کہاں سے شروع کریں؟ چونکہ ایپلیکیشن کو آرگیومینٹ سٹرنگ میں براہ راست k کی قدر کو قبول کرنا چاہیے، ہمارا مین فنکشن ہیڈر اس طرح نظر آتا ہے: int main(int argc, string argv[]) باب 6 سے، آپ جانتے ہیں کہ argv تاروں کی ایک صف ہے۔ سرنی کو جم میں لاکرز کی قطار کے طور پر سوچا جا سکتا ہے۔ ان میں سے ہر ایک کا کوئی نہ کوئی مطلب پوشیدہ ہے۔ ہمارے معاملے میں، ہر سیل کے اندر ایک دلیل ہوتی ہے جیسے string پہلا لاکر کھولنے کے لیے، ہم استعمال کرتے ہیں argv[0]، دوسرا - argv[1]، وغیرہ۔ اگر ہمارے پاس n تالے ہیں، تو ہمیں argv[n - 1] پر رکنے کی ضرورت ہے، کیونکہ argv[n] اب موجود نہیں ہے (یا موجود ہے، لیکن کسی اور کا ہے، بہتر ہے کہ ہم اسے ہاتھ نہ لگائیں)۔ لہذا آپ دلیل k تک اس طرح رسائی حاصل کرسکتے ہیں: string k = argv[1]; ہمیں یقین ہے کہ وہاں واقعی کچھ ہے! یاد رکھیں کہ argc ایک int متغیر ہے argv میں قطاروں کی تعداد کے برابر۔ اس کا مطلب یہ ہے کہ سیل کو کھولنے کی کوشش کرنے سے پہلے argc کی قدر کو چیک کرنا بہتر ہے، کیونکہ یہ معلوم ہو سکتا ہے کہ یہ موجود نہیں ہے۔ مثالی طور پر argc = 2۔ ایسا کیوں ہے؟ inside argv[0] عام طور پر پروگرام کا نام ہوتا ہے۔ یعنی، argc ہمیشہ کم از کم 1 ہوتا ہے۔ لیکن ہمارے پروگرام کو صارف کو کمانڈ لائن آرگیومنٹ k فراہم کرنے کی ضرورت ہوتی ہے، لہذا، argc = 2۔ قدرتی طور پر، اگر صارف کمانڈ لائن پر ایک سے زیادہ دلیلیں داخل کرتا ہے، تو argc بھی بڑھتا ہے اور کر سکتا ہے۔ 2 سے زیادہ ہو اگر صارف سٹرنگ میں ایک عدد عدد داخل کرتا ہے، تو اس کا مطلب یہ نہیں ہے کہ درج کردہ قدر خود بخود ایک int کے طور پر محفوظ ہو جائے گی۔ زیادہ واضح طور پر، یہ نہیں کرے گا. یہ ایک تار ہو گا، یہاں تک کہ اگر یہ بالکل ایک int کی طرح لگتا ہے! لہذا ہمیں سٹرنگ کو خود میں تبدیل کرنے کی ضرورت ہے۔ خوش قسمتی سے، ایک فنکشن ہے جسے ایٹوئی کہا جاتا ہے اس مقصد کے لیے ڈیزائن کیا گیا ہے۔ اس کا نحو ہے: int k = atoi(argv[1]); نوٹ کریں کہ k قسم int کا ہے، لہذا آپ اس کے ساتھ ریاضی کر سکتے ہیں۔ اس فنکشن کے ساتھ، آپ کو اس بات کی فکر کرنے کی ضرورت نہیں ہے کہ آیا صارف انٹیجر داخل کرتا ہے یا، foo: اس صورت میں، atoi 0 لوٹائے گا۔ atoi فنکشن کا اعلان stdlib.h لائبریری میں کیا گیا ہے ، اس لیے یقینی بنائیں کہ # اسے پروگرام کے آغاز میں شامل کریں۔ کوڈ اس کے بغیر مرتب کرے گا، کیونکہ ہم پہلے ہی اس فنکشن کو cs50.h لائبریری میں شامل کر چکے ہیں ۔ تاہم، مقامی لائبریریوں پر بھروسہ کرنا بہتر ہے۔ تو آپ کو ایک int کے طور پر k کو محفوظ کیا گیا ہے۔ اب ہم ٹیکسٹ ان پٹ کے لیے پوچھتے ہیں۔ اگر آپ نے پہلے ہفتے کی اسائنمنٹس کی ہیں، تو آپ CS50 لائبریری فنکشن سے پہلے ہی واقف ہیں جسے GetString کہتے ہیں۔ وہ ہماری مدد کرے گی۔ k اور ابتدائی متن موصول ہونے کے بعد، آئیے انکرپشن شروع کریں۔ recap کرنے کے لیے، آپ سٹرنگ کے تمام حروف کے ذریعے اعادہ کر سکتے ہیں اور درج ذیل لوپ کا استعمال کرتے ہوئے انہیں پرنٹ کر سکتے ہیں: for (int i = 0, n = strlen(p); i < n; i++) { printf("%c", p[i]); } دوسرے لفظوں میں، جس طرح argv تاروں کی ایک صف ہے، اسٹرنگ حروف کی ایک صف ہے۔ لہذا، ہم انفرادی سٹرنگ عناصر تک رسائی کے لیے مربع بریکٹ کا استعمال اسی طرح کر سکتے ہیں جیسے argv میں انفرادی سٹرنگ حاصل کرنا۔ یقینا، ہر ایک کردار کو پرنٹ کرنے کے بارے میں خفیہ نگاری کی کوئی چیز نہیں ہے۔ یا، تکنیکی طور پر، جب k = 0۔ لیکن ہمیں سیزر کے متن کو خفیہ کرنے میں مدد کرنی چاہیے! سلام، قیصر! strlen استعمال کرنے کے لیے، آپ کو ایک اور لائبریری شامل کرنے کی ضرورت ہے ۔ چونکہ ہم توثیق کے کچھ ٹیسٹ خودکار کر رہے ہیں، اس لیے پروگرام کو بالکل اس طرح برتاؤ کرنا چاہیے: atoiusername:~/workspace/pset2 $ ./caesar 13 Be sure to drink your Ovaltine! Or fher gb qevax lbhe Binygvar! کے علاوہ ، آپ ctype.h اور stdlib.h لائبریریوں میں دیگر عمدہ فنکشنز تلاش کر سکتے ہیں ۔ ایسا کرنے کے لیے، لنک پر عمل کریں اور وہاں تھوڑا سا چکر لگائیں۔ مثال کے طور پر، isdigit واضح طور پر کوئی دلچسپ چیز ہے =)۔ Z سے ​​A (یا z سے a) جاتے وقت، modulo operator % کے بارے میں مت بھولناC زبان میں۔ ٹیبل کا بھی مطالعہ کریں ، یہ نہ صرف حروف کے لیے ASCII حروف دکھاتا ہے۔ یہ چیک کرنے کے لیے کہ پروگرام چیک50 کے ساتھ صحیح طریقے سے کام کر رہا ہے ، درج ذیل کریں: check50 2015.fall.pset2.caesar caesar.c اور اگر آپ CS50 کے عملے کے بنائے گئے کوڈ کے ساتھ کھیلنے میں دلچسپی رکھتے ہیں، تو کمانڈ چلائیں: ~cs50/pset2/caesar ویسے، uggc://jjj.lbhghor.pbz/jngpu ?i=bUt5FWLEUN0 .
کام کا تجزیہ
  1. چابی لے لو
  2. متن حاصل کریں۔
  3. خفیہ کاری
  4. ایک خفیہ کردہ پیغام ڈسپلے کریں۔
1. ہم مرکزی فنکشن بناتے ہیں تاکہ صارف کمانڈ لائن پر کلید داخل کرے اور کلید کو درست کرنے کے لیے چیک کرے۔ int main(int argc, string argv[]) argc: • int • کمانڈ لائن پر درج دلائل کی تعداد • اگر argc = 2 سب کچھ ٹھیک ہے۔ اگر نہیں، تو ہدایات پرنٹ کریں اور پروگرام بند کریں۔ • اگر argc = 2 ہم چیک کرتے ہیں کہ آیا کلید ایک عدد عدد ہے • Argv تاروں کی ایک صف ہے، اس میں درج دلائل کے ساتھ ایک فہرست Array ایک ڈیٹا ڈھانچہ ہے جس میں مختلف سیلز میں ایک ہی قسم کے مختلف ڈیٹا ہوتے ہیں۔ ہارورڈ CS50: ہفتہ 2 اسائنمنٹس (لیکچرز 5 اور 6) - 4 مثال کے طور پر، صارف نے سٹرنگ بلاسٹ آف ٹیم راکٹ میں داخل کیا، پھر: ہارورڈ CS50: ہفتہ 2 اسائنمنٹس (لیکچرز 5 اور 6) - 5 atoi() فنکشن کا استعمال کرتے ہوئے، ہم نتیجے میں آنے والے نمبر کو عدد میں تبدیل کرتے ہیں۔ اگر یہ ممکن نہیں ہے تو، فنکشن 0 لوٹائے گا۔ ہارورڈ CS50: ہفتہ 2 اسائنمنٹس (لیکچرز 5 اور 6) - 6 2. صارف کو متن کے لیے اشارہ کریں۔ یہ آسان ہے: صارف جو بھی داخل کرتا ہے وہ ایک تار ہے۔ 3. خفیہ کاری۔ الگورتھم آسان ہے، لیکن آپ کمپیوٹر کو یہ کیسے سمجھ سکتے ہیں کہ کون سے حروف ایک کے بعد ایک آتے ہیں؟ یہ ASCII ٹیبل کو یاد کرنے کا وقت ہے! ہارورڈ CS50: ہفتہ 2 اسائنمنٹس (لیکچرز 5 اور 6) - 7 تاہم، سٹرنگ میں صرف حروف سے زیادہ ہو سکتے ہیں... سٹرنگز کو تبدیل کرنے سے پہلے، تصور کریں کہ آپ کو صرف ایک حرف تبدیل کرنے کی ضرورت ہے۔ ہم ابتدائی متن سے حروف کو تبدیل کرنا چاہتے ہیں، نہ کہ نشانات یا اعداد۔ ہمیں کیا کرنا چاہئے؟ پہلے ہمیں یہ چیک کرنے کی ضرورت ہے کہ آیا یہ حرف حروف تہجی میں ہے یا نہیں۔ یہ isalpha() فنکشن کا استعمال کرتے ہوئے کیا جا سکتا ہے ۔ اگر حرف حروف تہجی میں ہے، تو یہ فنکشن صحیح اور غلط لوٹاتا ہے۔ دو اور مفید فنکشنز - isupper() اور islower() صحیح واپس آتے ہیں اگر حرف بالترتیب بڑے یا چھوٹے ہو۔ اس طرح: Isalpha(‘Z’) -> true Isalpha(‘;’) -> false Isupper(‘Z’) ->true Isupper(‘z’) -> false Islower(‘Z’) -> false Islower(‘z’)->true اگر isalpha صحیح لوٹتا ہے، تو ہمیں کلید کا استعمال کرتے ہوئے اس حرف کو تبدیل کرنے کی ضرورت ہے۔ آئیے مثال کے طور پر CS50 اسسٹنٹ، Zamili کے پروگرام پر غور کریں اور تجزیہ کریں۔ آپ سوچ رہے ہوں گے کہ 'A' ایک عدد عدد کیوں ہے جب یہ واضح طور پر ایک حرف ہے۔ یہ پتہ چلتا ہے کہ علامتیں اور انٹیجرز قابل تبادلہ ہیں۔ حرف A کو سنگل کوٹس میں ڈال کر آپ اس کا ASCII کوڈ int میں حاصل کر سکتے ہیں۔ ہوشیار رہو: آپ کو ایک اقتباسات کی ضرورت ہے؛ ان کے بغیر، مرتب کنندہ A نامی متغیر کی تلاش کرے گا، علامت نہیں۔ پھر لائن میں ہم کلیدی قدر کو خط کے ASCII کوڈ میں شامل کرتے ہیں اور ان کو ایک عدد متغیر میں محفوظ کرتے ہیں۔ یہاں تک کہ اگر نتیجہ ایک int ہے، printf بیان حروف کے لیے %c پلیس ہولڈر کا استعمال کرتا ہے۔ تو پروگرام عددی نتیجہ سے وابستہ کردار کو پرنٹ کرتا ہے۔ دوسری صورت میں، ہم %d پلیس ہولڈر کا استعمال کرتے ہوئے نمبر دکھاتے ہیں۔ آپ اس کوڈ کو cs50 IDE میں داخل کر سکتے ہیں اور اس کے ساتھ کھیل سکتے ہیں۔ آئیے چیک کریں کہ asciimath مختلف کلیدوں کے لیے کیسے کام کرتا ہے۔ آئیے 25 کی قدر لیتے ہیں، ہم مندرجہ ذیل تصویر دیکھیں گے: اور اب کلید کو 26 ہونے دیں: ہمیں [، اور حرف A نہیں ہے۔ یہ صرف Z کے بعد اگلا ASCII حرف ہے۔ کام. حروف کے ختم ہوتے ہی ہمیں حروف تہجی کے شروع میں واپس آنے کے لیے ایک سائفر فارمولہ استعمال کرنے کی ضرورت ہے۔ یاد رکھیں، ہم پہلے ہی اوپر لکھ چکے ہیں: /* * asciimath.c * by Zamyla Chan * * Calculates the addition of a char and an integer, * and displays both the resultant character and its * ASCII value. * * Usage: ./asciimath key [char] * */ #include #include #include int main(int argc, string argv[]) { if (argc != 2) { printf("print the key next time \n"); return 1; } // key is the second command line argument int key = atoi(argv[1]); //преобразование строки в int int letter = 'A'; printf("\nCalculating '%c' + %d...\n", letter, key); int result = (letter + key); printf("The ASCII value of %c is %d.\n\n", result, result); return 0; } int result = (letter + key);ہارورڈ CS50: ہفتہ 2 اسائنمنٹس (لیکچرز 5 اور 6) - 8ہارورڈ CS50: ہفتہ 2 اسائنمنٹس (لیکچرز 5 اور 6) - 9ci = (pi + k) % 26 جہاں سائفر ٹیکسٹ میں ci حرف نمبر i ہے، pi سادہ متن میں حرف نمبر i ہے، k کلید ہے، اور %26 26 (یا "modulo 26") سے تقسیم کا بقیہ حصہ ہے۔ آئیے اس فارمولے کو حرف Y پر لاگو کرتے ہیں۔ k = 2 لیں۔ حساب لگائیں ('Y' + 2) %26 ASCII کوڈ حرف 'Y' = 89۔ پھر ('Y' + 2) %26 = (89 + 2) )% 26 = 91%26 = 13 لیکن یہ خط A کی ASCII ویلیو نہیں ہے جس کی ہمیں ضرورت ہے، جو کہ 65 ہے۔ اب ہم حروف تہجی کے ہر حرف کو 0 سے 25 تک ترتیب دیتے ہیں۔ اس صورت میں، Y = 24. (24+2)%26 = 0 حرف A میں صرف اتنا ہی ایک اشاریہ ہے۔ اس طرح، یہ فارمولہ حروف کے حروف تہجی کے اشاریہ سے مراد ہے، نہ کہ ان کی ASCII اقدار۔ ایک انکرپٹڈ کریکٹر پرنٹ کرنے کے لیے آپ کو اس کی ASCII ویلیو کی ضرورت ہوگی۔ اور معلوم کریں کہ ASCII قدر اور حروف تہجی میں نمبر کے درمیان کیسے سوئچ کیا جائے۔ ایک بار جب ہم ایک حرف کا فارمولہ معلوم کر لیتے ہیں، تو ہمیں اسے کی بورڈ سے درج سٹرنگ کے ہر حرف پر لاگو کرنے کی ضرورت ہوتی ہے۔ لیکن صرف اس صورت میں جب یہ خطوط ہیں! اور یاد رکھیں، بڑے حروف اور چھوٹے حروف کو مختلف معنی درکار ہوتے ہیں۔ یہ وہ جگہ ہے جہاں اوپری اور اس سے نیچے کے افعال کام آتے ہیں۔ آپ کے پاس دو فارمولے ہو سکتے ہیں، ایک بڑے حروف کے لیے، دوسرا چھوٹے حروف کے لیے، فنکشنز آپ کو یہ منتخب کرنے میں مدد کریں گے کہ کس کو لاگو کرنا ہے۔ سٹرنگ میں ہر ایک کریکٹر پر فارمولہ کیسے لگائیں؟ یاد رکھیں کہ سٹرنگ صرف حروف کی ایک صف ہے۔ strlen فنکشن (سٹرنگ کی لمبائی) آپ کو لوپ میں تکرار کی تعداد کا تعین کرنے میں مدد کرے گی ۔ہارورڈ CS50: ہفتہ 2 اسائنمنٹس (لیکچرز 5 اور 6) - 10

ٹاسک 2۔ Parlez-vous français؟

نظریہ
Vigenère سائفر سیزر سائفر سے کچھ زیادہ محفوظ ہے: یہ ایک لفظ کو کلید کے طور پر استعمال کرتا ہے اور صرف فریکوئنسی تجزیہ یا بروٹ فورس کا استعمال کرتے ہوئے اسے دستی طور پر توڑنا مشکل ہے۔ کلید کا ہر حرف ایک عدد پیدا کرتا ہے، اور اس کے نتیجے میں ہمیں حروف کو تبدیل کرنے کے لیے کئی کلیدیں ملتی ہیں۔ مثال: p = Meet me in the park at eleven am В качестве ключевого слова возьмем k = bacon Длина messages p = 25 В то время How длина k = 5 Поэтому его нужно повторять 5 раз. ہارورڈ CS50: ہفتہ 2 اسائنمنٹس (لیکچرز 5 اور 6) - 11 اگر پیغام میں حروف کی تعداد کو کلید سے تقسیم نہیں کیا جا سکتا ہے، تو ہم کلید کے آخری اطلاق میں اس کا صرف ایک حصہ استعمال کرتے ہیں: آفسیٹ کی ہارورڈ CS50: ہفتہ 2 اسائنمنٹس (لیکچرز 5 اور 6) - 12 قدر معلوم کرنے کے لیے، ہم اپنی بیکن کلید کے ہر حرف کی پوزیشن استعمال کرتے ہیں۔ حروف تہجی میں (a سے z تک)۔ ہم سچے پروگرامرز کی طرح شروع سے شمار کرتے ہیں۔ اور اصل متن میں ہر حرف کو ایک دیے گئے نمبر کے ذریعے منتقل کیا جاتا ہے، جیسا کہ سیزر سائفر میں، اگر ضروری ہو تو، Z کے بعد حروف تہجی کے آغاز میں واپس آ رہا ہے۔ لہذا M 1 سے آگے بڑھے گا، پہلا e بالکل بھی حرکت نہیں کرے گا، اور دوسرا 2 پوزیشنوں سے آگے بڑھے گا۔ نیچے آپ کو اصل پیغام، تحریری کلید اور اس کی درخواست کا نتیجہ نظر آئے گا۔ ہارورڈ CS50: ہفتہ 2 اسائنمنٹس (لیکچرز 5 اور 6) - 13 Vigenère سائفر یقیناً زیادہ مضبوط ہے، لیکن اگر آپ کو کلید کی لمبائی معلوم ہے تو اسے توڑنا کافی آسان ہے۔ اس کی شناخت کیسے کی جائے؟ اگر اصل متن کافی لمبا ہے کہ اس میں کچھ الفاظ کئی بار ظاہر ہوتے ہیں، تو آپ کو کچھ تکرار نظر آئے گی: آپ ہارورڈ CS50: ہفتہ 2 اسائنمنٹس (لیکچرز 5 اور 6) - 14 بروٹ فورس بھی استعمال کر سکتے ہیں، لیکن بہت سے آپشنز ہیں: 26^n – 1 جہاں n نامعلوم کلید کی لمبائی ہے۔ . لیکن عام طور پر یہ بہت زیادہ ہے۔ سچ ہے، یہ کمپیوٹر کے لیے کوئی مسئلہ نہیں ہے۔ اور اب سائفر کی ریاضی: چلو p کچھ متن ہو، k کلیدی لفظ ہو، kj کلید کا j-th حرف ہو، pi اصل متن میں حرف نمبر i ہو، ci خفیہ کاری میں حرف نمبر i ہو . پھر: ci = (pi + kj) % 26
ورزش
شرط ایک پروگرام vigenere.c لکھیں جو Vigenere سائفر کا استعمال کرتے ہوئے ایک پیغام کو خفیہ کرتا ہے۔ ہم پروگرام ان پٹ پر ایک کمانڈ لائن دلیل فراہم کرتے ہیں: کلیدی لفظ k، انگریزی حروف تہجی کے حروف پر مشتمل ہے۔ اگر ایپلیکیشن ایک سے زیادہ دلیلوں کے ساتھ یا کسی دلیل کے ساتھ شروع کی گئی ہے جو حروف تہجی میں شامل نہیں ہے، تو یہ ضروری ہے کہ غلطی کی معلومات کو ظاہر کیا جائے اور پروگرام کو ختم کیا جائے۔ یعنی، مین 1 لوٹائے گا - اس صورت میں، ہمارے خودکار ٹیسٹ سمجھ جائیں گے کہ یہاں سب کچھ ٹھیک ہے، اور اس شرط کو مدنظر رکھا گیا ہے۔ اگر سب کچھ ٹھیک ہے تو، پروگرام کو ٹیکسٹ سٹرنگ پی کی درخواست کرنے کے لیے آگے بڑھنا چاہیے، جسے ہم اوپر حاصل کردہ کلید k کے ساتھ انکرپٹ کرتے ہیں، نتیجہ پرنٹ کرتے ہیں اور پروگرام کو مکمل کرتے ہیں، قدر 0 واپس کرتے ہیں۔ وضاحت یہ یقینی بنانا ضروری ہے کہ کلید میں k حروف A اور a کو 0، B اور b کو 1، ...، Z اور z کے طور پر 25 کے طور پر نامزد کیا گیا ہے۔ پروگرام کو Vigenère سائفر کو صرف متن کے حروف پر لاگو کرنا چاہیے۔ باقی حروف (نمبرز، اوقاف کے نشانات، خالی جگہیں) بغیر کسی تبدیلی کے آؤٹ پٹ ہونے چاہئیں۔ اگر الگورتھم jth کیریکٹر k کو ith کریکٹر p پر لاگو کرنے جا رہا ہے جو کہ حروف تہجی میں نہیں ہے، تو اس jth کلید کو متن کے اگلے حروف تہجی کے کریکٹر پر لگائیں؛ آپ اسے چھوڑ کر k میں دوسرے کردار کی طرف نہیں جا سکتے۔ آخر میں، پروگرام کو p میں ہر حرف کے کیس کو محفوظ کرنا چاہیے ۔
پتہ نہیں کہاں سے شروع کرنا ہے؟
ہارورڈ CS50: ہفتہ 2 اسائنمنٹس (لیکچرز 5 اور 6) - 15
Zamilya، CS50 کورس اسسٹنٹ کی طرف سے کچھ نکات یہ ہیں۔
خوش قسمتی سے، یہ پروگرام سیزر سائفر سے بہت ملتا جلتا ہے، صرف کلید انٹیجر کے بجائے سٹرنگ ہے۔ اگر آپ نے رومن حکمران کے نام کے سیفر کو کامیابی سے لاگو کیا ہے، تو یہ دوسرے کام کے لیے ایک بہترین آغاز ہو سکتا ہے۔ آپ شاید پہلے ہی جان چکے ہوں گے کہ کلید کے بطور ایک حرف والا Vigenère سائفر سیزر سائفر جیسا ہی ہے۔ Vigenère الگورتھم وہی اقدامات استعمال کرتا ہے جیسے سیزر:
  1. چابی لے لو
    • کوڈ ورڈ دوسری کمانڈ لائن آرگیومینٹ آرگ وی ہے[1]
    • حروف تہجی میں ہونا ضروری ہے: isalpha فنکشن
  2. متن حاصل کریں۔
  3. خفیہ کاری
  4. سائفر ٹیکسٹ پرنٹ کریں۔
تو، آئیے دوسری کمانڈ لائن آرگیومینٹ argv[1] کو چیک کرتے ہیں کہ آیا یہ حروف تہجی کے حروف سے تعلق رکھتا ہے۔ ہم یہ پہلے سے واقف isalpha کا استعمال کرتے ہوئے کرتے ہیں ۔ اگر کلید درست ہے تو، ہم صارف سے ایک تار وصول کرتے ہیں اور خفیہ کاری شروع کرتے ہیں۔ Vigenère سائفر فارمولہ سیزر سائفر فارمولے سے ملتا جلتا ہے۔ آپ کسی خط کو متعلقہ سائفر آفسیٹ میں کیسے تبدیل کرتے ہیں؟ ASCII ٹیبل کا استعمال کرتے ہوئے اقدار کا موازنہ کرنے کی کوشش کریں۔ ہارورڈ CS50: ہفتہ 2 اسائنمنٹس (لیکچر 5 اور 6) - 16 زیادہ امکان ہے کہ آپ ٹیبل میں ترتیب کو استعمال کرتے ہوئے حروف اور ان کے حروف تہجی کے اشاریوں کے درمیان ایک نمونہ تلاش کر سکیں گے۔ کیا آپ نے سوچا ہے کہ مطلوبہ نتیجہ حاصل کرنے کے لیے ایک حرف کو دوسرے سے کیسے گھٹایا جائے؟ بڑے اور چھوٹے حروف کے لیے آفسیٹ ایک جیسے ہیں، لہذا آپ کو چھوٹے حروف کے لیے آفسیٹ کا تعین کرنے کے لیے اور بڑے حروف کے لیے الگ الگ دو ملتے جلتے فارمولوں کی وضاحت کرنی ہوگی۔ یہ بھی یاد رکھیں کہ ٹیکسٹ لوپ کو غیر انگریزی حروف کو نظر انداز کرنا چاہیے۔ اور خطوط کے کیس کو محفوظ کرنا نہ بھولیں۔ اگر آپ سائفر فارمولے کو دیکھیں: ci = (pi + kj) % 26 آپ کو دو انڈیکس متغیر نظر آئیں گے، i اور j۔ ایک سورس ٹیکسٹ میں پوزیشن محفوظ کرتا ہے، دوسرا کلید میں۔ اگر آپ کا متن کلید سے لمبا ہے تو، کلید پر موجود انڈیکس کلید کے آخر سے شروع تک واپس چلا جاتا ہے۔ یہ کیسے کرنا ہے؟ ماڈیولو ڈویژن آپریشن کا استعمال کرتے ہوئے! آپریشن کا نتیجہ دو نمبروں کی تقسیم کا باقی حصہ ہے۔ پروگرامنگ میں اس آپریشن کے عملی فوائد صرف بہت زیادہ ہیں! تصور کریں کہ لوگوں کے ایک بڑے گروپ کو تین ذیلی گروپوں میں تقسیم کرنے کی ضرورت ہے۔ ایسا کرنے کا ایک طریقہ یہ ہے کہ ان سے پہلے، دوسرے، تیسرے کی ادائیگی کے لیے کہا جائے۔ ہارورڈ CS50: ہفتہ 2 اسائنمنٹس (لیکچرز 5 اور 6) - 17 یعنی پہلا شخص پہلے گروہ سے تعلق رکھتا ہے، دوسرے کا دوسرے سے، تیسرا کا تیسرا، چوتھا دوبارہ پہلے سے، وغیرہ۔ آپ اسی آپریشن کو انجام دینے کے لیے ماڈیولو ڈویژن کا استعمال کر سکتے ہیں۔ آئیے شروع سے ایک ہی تین گروہوں کو نمبر دیتے ہیں۔ اسے کرنے کا طریقہ یہ ہے: ہارورڈ CS50: ہفتہ 2 اسائنمنٹس (لیکچرز 5 اور 6) - 18 اگر آپ ایک اشاریہ لیتے ہیں اور اسے زیادہ سے زیادہ قدر کے ماڈیول میں تقسیم کرتے ہیں، تو نتیجہ کبھی بھی اس قدر سے زیادہ یا اس کے برابر نہیں ہوگا۔ کلیدی لفظ کو شروع میں واپس کرنے کے لیے اس اصول کو آزمائیں! صرف گروپ کے لحاظ سے چھانٹنے کے بجائے آپ کو مطلوبہ الفاظ کے اشاریہ کی ضرورت ہے تاکہ آپ کلیدی طوالت کو بڑھائے بغیر آفسیٹ کرنے کے لیے درست خط لکھ سکیں۔ چونکہ ہم آپ کے کوڈ کے کچھ ٹیسٹوں کو خودکار کر رہے ہیں، اس لیے پروگرام کو ذیل میں دکھایا گیا برتاؤ کرنا چاہیے: jharvard@appliance (~/Dropbox/pset2): ./vigenere bacon Meet me at the park at eleven am Negh zf av huf pcfx bt gzrwep oz سائفر ٹیکسٹ کو دستی طور پر کمپیوٹنگ کرنے کے علاوہ آپ اس پروگرام کی جانچ کیسے کر سکتے ہیں؟ ہم مہربان ہیں: اس کے لیے ہم نے پروگرام لکھا devigenere ۔ یہ ایک اور صرف ایک کمانڈ لائن آرگومنٹ (کی ورڈ) لیتا ہے، اور اس کا کام سائفر ٹیکسٹ کو بطور ان پٹ لینا اور سادہ متن کو واپس کرنا ہے۔ اسے چلائیں: ~cs50/pset2/devigenere k جہاں k کلیدی لفظ ہے۔ اگر آپ check50 کا استعمال کرتے ہوئے اپنے پروگرام کی درستگی کو چیک کرنا چاہتے ہیں تو چلائیں: check50 2014.fall.pset2.vigenere vigenere.c اور اگر آپ ہمارے vigenere نفاذ کا جائزہ لینا چاہتے ہیں تو ٹائپ کریں: ~cs50/pset2/vigenere

اپنے کوڈ کی توثیق کیسے کریں اور نمبر حاصل کریں۔

توجہ! اگر آپ کے لیے صرف کاموں کی درستگی کی جانچ کرنا ضروری ہے، تو cs50check استعمال کریں۔ اگر آپ edx پلیٹ فارم پر گریڈ حاصل کرنا چاہتے ہیں تو نیچے بیان کردہ طریقہ کار پر عمل کریں۔ ذہن میں رکھیں کہ یہ طریقہ کار کاموں کو چیک کرنے کے لیے وہی cs50check استعمال کرتا ہے۔ فرق صرف اتنا ہے کہ یہ نتائج کو یاد رکھتا ہے اور مجموعی اسکور کا حساب لگاتا ہے۔
  1. CS50 IDE میں لاگ ان کریں۔
  2. CS50 IDE کے اوپری بائیں کونے کے قریب ، جہاں اس کا فائل براؤزر واقع ہے (ٹرمینل ونڈو میں نہیں)، pset2 ڈائرکٹری میں واقع اپنی ابتدائیوں.c فائل پر دائیں کلک کریں اور ڈاؤن لوڈ پر کلک کریں ۔ آپ کو یہ دیکھنا چاہئے کہ براؤزر نے شروع کی ہے .
  3. caesar.c کے لیے دہرائیں ۔
  4. vigenere.c کے لیے دہرائیں ۔
  5. ایک علیحدہ ونڈو یا ٹیب میں، CS50 Submit میں لاگ ان کریں۔
  6. اسکرین کے اوپری بائیں کونے میں جمع کروائیں آئیکن پر کلک کریں ۔ہارورڈ CS50: ہفتہ 2 اسائنمنٹس (لیکچر 5 اور 6) - 19
  7. بائیں طرف فولڈرز کی فہرست میں، پرابلم سیٹ 2 ڈائریکٹری پر کلک کریں ، پھر اپ لوڈ نیو جمع کرانے والے بٹن پر کلک کریں ۔ یہ سیدھے ہاتھ پر ہے. ہارورڈ CS50: ہفتہ 2 اسائنمنٹس (لیکچرز 5 اور 6) - 20
  8. ظاہر ہونے والی اسکرین پر، فائلیں شامل کریں ... بٹن پر کلک کریں۔ آپ کے کمپیوٹر سے فائلوں کو منتخب کرنے کے لیے ایک ونڈو کھل جائے گی۔ ہارورڈ CS50: ہفتہ 2 اسائنمنٹس (لیکچرز 5 اور 6) - 21
  9. اس فولڈر پر جائیں جہاں آپ ابتدائیہ رکھتے ہیں ۔ یہ غالباً آپ کے ڈاؤن لوڈز فولڈر میں یا جہاں کہیں بھی آپ کا براؤزر فائلوں کو بطور ڈیفالٹ رکھتا ہے۔ جب آپ کو initials.c مل جائے تو اسے منتخب کرنے کے لیے ایک بار اس پر کلک کریں، پھر کھولیں پر کلک کریں۔
  10. دوبارہ فائلیں شامل کریں پر کلک کریں ۔
  11. caesar.c تلاش کریں اور اسے کھولیں۔
  12. vigenere.c فائل کے لیے بھی ایسا ہی کریں ۔
  13. اپ لوڈ شروع کریں پر کلک کریں۔ آپ کی فائلیں CS50 سرورز پر اپ لوڈ ہو جائیں گی ۔
  14. ظاہر ہونے والی اسکرین پر، آپ کو No File سلیکٹڈ ونڈو نظر آنی چاہیے ۔ اگر آپ اپنے ماؤس کرسر کو بائیں طرف لے جاتے ہیں، تو آپ کو ڈاؤن لوڈ کی گئی فائلوں کی فہرست نظر آئے گی۔ تصدیق کرنے کے لیے، ان میں سے ہر ایک پر کلک کریں۔ اگر آپ کو کسی چیز کے بارے میں یقین نہیں ہے، تو آپ انہی مراحل کو دہرا کر فائلوں کو دوبارہ اپ لوڈ کر سکتے ہیں۔ آپ اسے 2016 کے آخر تک جتنی بار چاہیں کر سکتے ہیں۔
تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION