JavaRush /جاوا بلاگ /Random-SD /هارورڊ CS50: هفتو 2 تفويض (ليڪچر 5 ۽ 6)
Masha
سطح

هارورڊ CS50: هفتو 2 تفويض (ليڪچر 5 ۽ 6)

گروپ ۾ شايع ٿيل
cs50 اسائنمينٽس ليڪچر 5 ۽ 6 لاءِ 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/pset2mkdir ~/workspace/pset2 جي وچ ۾ ھڪڙو خلا آھي . recap ڪرڻ لاءِ، ~ مطلب آهي روٽ ڊاريڪٽري، ~/workspace هڪ فولڊر آهي جنهن کي Workspace سڏيو ويندو آهي روٽ ڊاريڪٽري اندر، ~/workspace/pset2 هڪ ڊاريڪٽري آهي جنهن کي pset2 اندر ~/workspace سڏيو ويندو آهي . ھاڻي ھلايو: نئين ڊاريڪٽري ۾ تبديل ڪرڻ لاء. ڪمانڊ لائن ڪجهه هن طرح ڏسڻ ۾ اچي ٿي: جيڪڏهن ڪجهه غلط آهي، قدمن کي ورجايو. توھان پڻ ڪال ڪري سگھو ٿا ھڪڙي حڪم کي ڏسڻ لاءِ آخري ڪجھ حڪمن کي تاريخ جي ترتيب ۾. توھان پڻ پنھنجي ڪرسر کي ڪمانڊ لائن تي رکي سگھو ٿا ۽ پنھنجي ڪيبورڊ تي مٿي تير کي دٻائي سگھوٿا سڀني حڪمن کي ڏسڻ لاءِ آخري داخل ٿيل کان پھرين تائين. ھيٺ ڏنل بٽڻ کي استعمال ڪندي توھان واپس ڪري سگھو ٿا. رستي ۾، هر ڀيري ساڳيا حڪم ٽائپ ڪرڻ جي بدران، توهان انهن حڪمن کي اسڪرول ڪري سگهو ٿا جيڪي توهان اڳ ۾ ئي ٽائيپ ڪري چڪا آهيو ۽ Enter کي دٻائڻ سان ٻيهر عمل ڪري سگهو ٿا. توهان شايد محسوس ڪيو هوندو ته ڊيوڊ پنهنجي ليڪچرن ۾ بلڪل ائين ڪندو آهي. ٻئي هفتي جا ڪم pset2 ۾ محفوظ ڪيا وڃن . cd ~/workspace/pset2username:~/workspace/pset2 $history

ٽاسڪ 0. شروعات

اچو ته لائنن تي هڪ ويجهي نظر رکون. Initials.c فائل ۾ ، هڪ پروگرام لکو جيڪو صارف جي نالي جي درخواست ڪري ٿو (GetString فنڪشن کي استعمال ڪندي اسان نالو حاصل ڪريون ٿا هڪ اسٽرنگ) ۽ پوءِ ظاهر ڪري ٿو پهريون نالو (يا نالا) ۽ آخري نالو اپر ڪيز ۾ بغير اسپيس، عرصو يا ٻيا اکر، صرف ليڪ فيڊ سان ( \ n ). اسان فرض ڪريون ٿا ته صارفين صرف اکر داخل ڪن ٿا (هيٺيون يا مٿيون ڪيس، يا ٻئي) ۽ لفظن جي وچ ۾ هڪ جاء. غور ڪريو ته جوزف گورڊن-ليوٽ، ڪنن اوبرين، يا ڊيوڊ جي ملان نالي ماڻهون پروگرام استعمال نه ڪندا. پروگرام جي صحيح آپريشن کي جانچڻ لاءِ، چيڪ 50 کي ڪال ڪريو: ڇا توھان 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
Cryptography
Cryptography، معلومات کي انڪرپٽ ڪرڻ ۽ سمجھائڻ جي سائنس... حقيقت ۾، انڪريپٽ ٿيل پيغام قديم زماني کان موجود آهن، ۽ فوجن پاران ڳجهي پيغامن کي منتقل ڪرڻ لاءِ استعمال ڪيا ويندا هئا. خير، هاڻي فيس بڪ ۽ ٻين نيٽ ورڪن تي توهان جا پاس ورڊ انڪريپٽڊ فارم ۾ محفوظ آهن.

ٽاسڪ 1. هيل، قيصر!

نظرياتي ڄاڻ
اسان هڪ سادي سيفرن جو مطالعو ڪنداسين - سيزر سيفر، رومن شهنشاهه جي نالي پٺيان. هن سيفر ۾، متن جي هر اکر کي هڪ ٻئي سان تبديل ڪيو ويندو آهي، جيڪو الفابيٽ ۾ هيٺ ڏنل اکرن جو هڪ مقرر تعداد آهي. اکر جي هن مقرر ٿيل انگ کي ڪيئي چئبو آهي . تنهن ڪري، Key 1 لاطيني اکر C کي اکر D ۾ ۽ Z کي چڪر ذريعي A ۾ تبديل ڪري ٿو. جيڪڏهن ڪيئي 3 آهي ته پوءِ اکر C کي F ۾ ۽ Z کي C ۾ تبديل ڪندو. مثال: اسان سيزر سيفر استعمال ڪندا آهيون. ڪي 5 لفظ cat تي. c -> h a -> f t -> y Caesar (cat, 5) = hfy Key = 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 cipher (ان تي وڌيڪ ايندڙ پيراگراف ۾). اچو ته ”رياضي“ ڪريون سيزر سيفر کي. اچو ته سادي متن کي اکر p سان ظاهر ڪريون، pi متن ۾ اهو خط آهي جيڪو پوزيشن نمبر i تي آهي. اچو ته ڳجهي اهم خط k، c کي ciphertext، ۽ ci ان خط کي ciphertext ۾ سڏيون جيڪو پوزيشن i تي آهي. پوءِ توھان حساب ڪري سگھوٿا ھر ھڪ اکر جي cipher جي فارمولا کي استعمال ڪندي: ci = (pi + k) % 26 ھن رسم الخط کي استعمال ڪريو، اھو توھان کي اجازت ڏئي ٿو پروگرام ڪرڻ جي الگورتھم ۽ بيان ڪري ٿو سائفر جي معني کي صحيح ۽ اختصار سان. جيڪڏهن اهم k = 13 ۽ اصل متن p آهي "پنهنجي Ovaltine پيئڻ لاءِ پڪ ڪريو!"، اهو اهو آهي جيڪو اسان حاصل ڪريون ٿا: Or fher gb qevax lbhe Binygvar! نوٽ ڪريو ته O (سيفر ٽيڪسٽ ۾ پهريون خط) خط B کان 13 پوزيشن منتقل ڪيو ويو آهي (The اصل متن ۾ پهريون اکر). ساڳي شيءِ اکر آر (انڪريپشن ۾ ٻيو اکر) سان 13 اکر شفٽ ڪيو ويو آهي اي (اصل ۾ ٻيو اکر). انڪريپشن ۾ ٽيون اکر، f، s کان 13 اکر (اصل ۾ ٽيون) منتقل ڪيو ويو آهي، هتي اسان z کان الف تائين هڪ دائري ۾ هلون ٿا. ڪيزر 13 سان گڏ هڪ سيزر سيفر جو خاص نالو ROT13 آهي . اهو سمجهه وارو آهي: ان کي ٻه ڀيرا لاڳو ڪرڻ، اسان اصل متن ڏانهن موٽون ٿا. يقينا، اتي پڻ ROT26 آهي، هي هڪ عام طور تي سپر محفوظ آهي، پر صرف جيڪڏهن توهان پنهنجي خيالن جو اظهار واضح طور تي نه ڪيو =).
حالت
فائل ۾ لکو caesar.c هڪ پروگرام جيڪو سيزر سائفر استعمال ڪندي ٽيڪسٽ کي انڪرپٽ ڪري ٿو. پروگرام ۾ ان پٽ جي طور تي ھڪڙي ڪمان لائن دليل ڏيو: ھڪڙو غير منفي عدد. سادگي لاء، اچو ته ان کي سڏين k. جيڪڏهن صارف پروگرام کي بغير ڪمانڊ لائن دليلن سان يا هڪ کان وڌيڪ دليلن سان عمل ڪري ٿو، ايپليڪيشن کي شڪايت ڪرڻ گهرجي ۽ قيمت 1 واپس ڪرڻ گهرجي (اهڙي طرح غلطيون عام طور تي ظاهر ڪيون وينديون آهن): return 1; ٻين سڀني حالتن ۾، پروگرام صارف کي متن لاء اشارو ڪري ٿو. انڪريپٽ ڪرڻ لاءِ، پوءِ ڪي ڪي ڪي سان انڪريپٽ ٿيل ٽيڪسٽ ڏيکاري ٿو (يعني، شفٽ ڪيل ڪ پوزيشن کي ساڄي پاسي چڪر ۾). جيڪڏهن متن ۾ اکر شامل آهن جيڪي انگريزي الفابيٽ کان ٻاهر آهن، پروگرام انهن کي تبديل نٿو ڪري. ciphertext کي پرنٽ ڪرڻ کان پوء، ايپليڪيشن نڪرندي آهي، مکيه واپسي 0: return 0; جيڪڏهن مکيه واضح طور تي صفر واپس نه ڪندو آهي، اهو خودڪار طور تي واپسي ڪندو آهي (int اصل ۾ مکيه جي واپسي جو قسم آهي، پر ان تي وڌيڪ ڪنهن ٻئي وقت). ڪنوينشن جي مطابق (پروگرامنگ ۾ سٺي شڪل جا ضابطا)، جيڪڏهن توهان واضح طور تي 1 کي واپس ڏيون ٿا ته ڪنهن غلطي کي ظاهر ڪرڻ لاءِ، ته پوءِ توهان کي پروگرام جي ڪامياب مڪمل ٿيڻ لاءِ پوائنٽر جي طور تي 0 به واپس ڪرڻ گهرجي. جيتوڻيڪ انگريزي الفابيٽ ۾ صرف 26 اکر آهن، k 26 کان وڏو ٿي سگهي ٿو. لازمي طور تي، ڪي = 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 = 2. ائين ڇو آهي؟ اندر argv[0] عام طور تي پروگرام جو نالو آهي. اھو آھي، argc ھميشه گھٽ ۾ گھٽ 1 ھوندو آھي. پر اسان جي پروگرام کي صارف کي ڪمانڊ لائن آرگيومينٽ k مهيا ڪرڻ جي ضرورت آھي، تنھنڪري، argc = 2. قدرتي طور تي، جيڪڏھن صارف ڪمانڊ لائن تي ھڪ کان وڌيڪ دليل داخل ڪري ٿو، ته ارگ ​​سي به وڌي ٿو ۽ ڪري سگھي ٿو. 2 کان وڌيڪ هجي جيڪڏهن صارف هڪ اسٽرنگ ۾ هڪ انٽيجر داخل ڪري ٿو، ان جو مطلب اهو ناهي ته داخل ڪيل قيمت خودڪار طور تي هڪ int طور محفوظ ڪئي ويندي. وڌيڪ واضح طور تي، اهو نه ٿيندو. اهو هڪ تار هوندو، جيتوڻيڪ اهو ڏسڻ ۾ بلڪل هڪ int وانگر! تنهن ڪري اسان کي ضرورت آهي اسٽرنگ کي پاڻ ۾ تبديل ڪرڻ. خوشقسمتيء سان، اتي هڪ فنڪشن آهي جنهن کي اتوئي سڏيو ويندو آهي هن مقصد لاء ٺهيل آهي. ان جو نحو آهي: int k = atoi(argv[1]); نوٽ ڪريو ته k قسم int جو آهي، تنهنڪري توهان ان سان رياضي ڪري سگهو ٿا. هن فنڪشن سان، توهان کي پريشان ٿيڻ جي ضرورت ناهي ته صارف هڪ عدد داخل ڪري ٿو يا، چئو، foo: انهي صورت ۾، atoi 0 واپس ڪندو. atoi فنڪشن stdlib.h لائبريري ۾ اعلان ڪيو ويو آهي ، تنهنڪري پڪ ڪريو # پروگرام جي شروعات ۾ شامل ڪريو. ڪوڊ ان کان سواء گڏ ڪندو، ڇاڪاڻ ته اسان اڳ ۾ ئي هن فنڪشن کي cs50.h لائبريري ۾ شامل ڪيو آهي . بهرحال، اهو بهتر آهي ته مقامي لائبريرين تي ڀروسو ڪرڻ. تنهن ڪري توهان k کي هڪ int طور محفوظ ڪيو. ھاڻي اچو ته ٽيڪسٽ ان پٽ لاءِ پڇون. جيڪڏھن توھان پھرين ھفتي جون اسائنمينٽس ڪيون آھن، توھان اڳي ئي واقف آھيو CS50 لائبريري فنڪشن سان جنھن کي GetString سڏيو ويندو آھي. هوءَ اسان جي مدد ڪندي. توهان کي k ۽ ابتدائي متن حاصل ڪرڻ کان پوء، اچو ته انڪرپشن شروع ڪريو. recap ڪرڻ لاءِ، توھان ھڪڙي اسٽرنگ جي سڀني اکرن جي ذريعي ٻيهر ڪري سگھو ٿا ۽ ھيٺ ڏنل لوپ استعمال ڪندي انھن کي پرنٽ ڪري سگھو ٿا: for (int i = 0, n = strlen(p); i < n; i++) { printf("%c", p[i]); } ٻين لفظن ۾، جھڙي طرح argv تارن جو ھڪڙو صف آھي، string اکرن جو ھڪڙو صف آھي. تنهن ڪري، اسان انفرادي اسٽرنگ عناصر تائين رسائي حاصل ڪرڻ لاء چورس بریکٹ استعمال ڪري سگهون ٿا ساڳئي طرح argv ۾ انفرادي اسٽرنگ حاصل ڪرڻ. يقينن، هر هڪ اکرن کي ڇپائڻ بابت ڪجهه به نه آهي cryptographic. يا، ٽيڪنيڪل طور، جڏهن k = 0. پر اسان کي ضرور مدد ڪرڻ گهرجي سيزر هن جي متن کي انڪرپٽ ڪرڻ ۾! سلام، قيصر! strlen استعمال ڪرڻ لاء، توهان کي ٻي لائبريري شامل ڪرڻ جي ضرورت آهي . جيئن ته اسان ڪجھ تصديق جي ٽيسٽ کي خودڪار ڪري رهيا آهيون، پروگرام کي بلڪل هن طرح سان عمل ڪرڻ گهرجي: atoiusername:~/workspace/pset2 $ ./caesar 13 Be sure to drink your Ovaltine! Or fher gb qevax lbhe Binygvar! کان علاوه ، توهان ctype.h ۽ stdlib.h لائبريرين ۾ ٻيا سٺا ڪم ڳولي سگهو ٿا . هن کي ڪرڻ لاء، لنڪ جي تابعداري ڪريو ۽ اتي ٿورو rummage. مثال طور، isdigit واضح طور تي ڪجهه دلچسپ آهي =). جڏهن Z کان A ڏانهن (يا z کان a تائين)، نه وساريو ماڊل آپريٽر %سي ٻولي ۾. ٽيبل جو پڻ مطالعو ڪريو ، اهو ڏيکاري ٿو ASCII اکرن کي نه رڳو اکرن لاءِ. چيڪ ڪرڻ لاءِ ته پروگرام صحيح طريقي سان ڪم ڪري رهيو آهي check50 سان ، هيٺيون ڪم ڪريو: 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 مثال طور، صارف داخل ڪيو string blastoff Team Rocket، پوءِ: هارورڊ 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 صحيح موٽائي، اسان کي هن ڪردار کي ڪيئي استعمال ڪرڻ جي ضرورت آهي. اچو ته غور ڪريون ۽ تجزيو ڪريون مثال طور Zamili جي پروگرام جو، CS50 اسسٽنٽ. توهان شايد حيران ٿي رهيا آهيو ته 'الف' هڪ انٽيجر ڇو آهي جڏهن اهو واضح طور تي هڪ اکر آهي. اهو ظاهر ٿئي ٿو ته علامتون ۽ انٽيجرز مٽائي سگهجن ٿيون. خط 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 ciphertext ۾، pi آهي اکر نمبر i سادي متن ۾، k آهي ڪيئي، ۽ %26 آهي باقي 26 (يا ”ماڊولو 26“) جي تقسيم جو باقي حصو. اچو ته هن فارمولا کي Y اکر تي لاڳو ڪريون. k = 2 وٺو. حساب ڪريو ('Y' + 2) %26 ASCII اکر جو ڪوڊ 'Y' = 89. پوءِ ('Y' + 2) %26 = (89 + 2) )% 26 = 91%26 = 13 پر هي ASCII اکر نه آهي جنهن جي اسان کي ضرورت آهي، جيڪا 65 آهي. هاڻي اچو ته الفابيٽ جي هر اکر کي ترتيب ۾ 0 کان 25 جي قيمت ڏيو. ھن حالت ۾، Y = 24. (24 + 2)٪ 26 = 0 اکر A ۾ صرف ھڪڙو انڊيڪس آھي. اهڙيء طرح، هي فارمولا اکرن جي الفابيٽيڪل انڊيڪس ڏانهن اشارو ڪري ٿو، نه انهن جي ASCII قدر. هڪ اينڪرپٽ ٿيل ڪردار پرنٽ ڪرڻ لاءِ توهان کي ان جي ASCII قدر جي ضرورت پوندي. ۽ معلوم ڪريو ته ڪيئن بدلجي ASCII قدر ۽ الفابيٽ ۾ نمبر جي وچ ۾. هڪ دفعو اسان هڪ اکر جو فارمولا سمجهي ورتو آهي، اسان کي ان کي هر اکر تي لاڳو ڪرڻو پوندو جيڪو ڪيبورڊ مان داخل ڪيو ويو آهي. پر رڳو جيڪڏھن اھي اکر آھن! ۽ ياد رکو، ڪيپيٽل اکر ۽ ننڍڙا اکر مختلف معنائون گھرندا آھن. هي اهو آهي جتي مٿي ۽ هيٺيون افعال هٿ ۾ اچن ٿا. توھان وٽ ٿي سگھي ٿو ٻه فارموليا، ھڪڙو سرمائيدار خطن لاءِ، ٻيو ننڍن اکرن لاءِ، فنڪشن توھان کي چونڊڻ ۾ مدد ڪندا جنھن کي لاڳو ڪرڻ گھرجي. هڪ اسٽرنگ ۾ هر هڪ ڪردار تي هڪ فارمولا ڪيئن لاڳو ڪجي؟ ياد رهي ته هڪ اسٽرنگ صرف اکرن جو هڪ صف آهي. strlen فنڪشن (string length) توهان کي هڪ لوپ ۾ ورهاڱي جو تعداد طئي ڪرڻ ۾ مدد ڪندو .هارورڊ CS50: هفتو 2 اسائنمينٽس (ليڪچر 5 ۽ 6) - 10

ٽاسڪ 2. Parlez-vous français؟

نظريو
Vigenère cipher ڪجهه حد تائين سيزر سيفر کان وڌيڪ محفوظ آهي: اهو هڪ لفظ کي ڪيئي طور استعمال ڪري ٿو ۽ دستي طور تي ٽوڙڻ ڏکيو آهي فريڪوئنسي تجزيو يا اڪيلي طاقت استعمال ڪندي. چاٻي جو ھر اکر ھڪڙو نمبر ٺاھي ٿو، ۽ نتيجي طور اسان کي اکر کي تبديل ڪرڻ لاء ڪيترائي ڪيز ملن ٿا. مثال: 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 کان پوء الفابيٽ جي شروعات تائين. تنهن ڪري M 1 طرف هليو ويندو، پهريون اي هرگز نه هلندو، ۽ ٻيو 2 پوزيشن طرفان منتقل ٿيندو. ھيٺ توھان ڏسندا اصل پيغام، لکيل ڪي ۽ ان جي ايپليڪيشن جو نتيجو. هارورڊ CS50: هفتو 2 تفويض (ليڪچر 5 ۽ 6) - 13 Vigenère cipher، يقينا، مضبوط آهي، پر جيڪڏھن توھان ڄاڻو ٿا ته ڪنجي جي ڊيگهه، ان کي ٽوڙڻ بلڪل آسان آھي. ان جي سڃاڻپ ڪيئن ڪجي؟ جيڪڏهن اصل متن ڪافي ڊگهو آهي ته ڪجهه لفظ ان ۾ ڪيترائي ڀيرا ظاهر ٿين ٿا، ته پوءِ توهان کي ڪجهه ورجائي نظر ايندي: توهان هارورڊ CS50: هفتو 2 تفويض (ليڪچر 5 ۽ 6) - 14 به استعمال ڪري سگهو ٿا brute force، پر اتي ڪيترائي آپشن آهن: 26^n – 1 جتي n نامعلوم ڪي جي ڊيگهه آهي. . پر عام طور تي اهو تمام گهڻو آهي. سچ، اهو ڪمپيوٽر لاء ڪو مسئلو ناهي. ۽ ھاڻي cipher جي رياضي: اچو ته p ڪجھ متن ھجي، ڪي لفظ ھجي، ڪيجي جو ج-ٿ اکر ھجي، pi اصل متن ۾ اکر نمبر i ھجي، انڪريپشن ۾ ci آھي خط نمبر i . پوءِ: ci = (pi + kj) % 26
مشق
حالت هڪ پروگرام لکو vigenere.c جيڪو Vigenere cipher استعمال ڪندي هڪ پيغام کي انڪرپٽ ڪري ٿو. اسان هڪ ڪمانڊ لائن دليل فراهم ڪريون ٿا پروگرام ان پٽ تي: لفظ k، انگريزي الفابيٽ جي اکرن تي مشتمل آهي. جيڪڏهن ايپليڪيشن هڪ کان وڌيڪ دليلن سان شروع ڪئي وئي آهي يا هڪ دليل سان الفابيٽ ۾ شامل نه آهي، اهو ضروري آهي ته غلطي جي معلومات ڏيکاري ۽ پروگرام کي ختم ڪيو وڃي. اھو آھي، مکيه 1 موٽندو - ھن حالت ۾، اسان جا خودڪار ٽيسٽ سمجھندا ته ھتي سڀ ڪجھ ٺيڪ آھي، ۽ ھن حالت کي حساب ۾ رکيو ويو آھي. جيڪڏهن سڀ ڪجهه ٺيڪ آهي، پروگرام کي اڳتي وڌڻ گهرجي ٽيڪسٽ اسٽرنگ پي جي درخواست ڪرڻ لاء، جنهن کي اسان مٿي حاصل ڪيل ڪي ڪي سان انڪرپٽ ڪريون ٿا، نتيجو پرنٽ ڪريو ۽ پروگرام مڪمل ڪري، قيمت 0 واپس ڪندي. وضاحت ڪرڻ ضروري آهي ته اها پڪ ڪرڻ لاءِ ته ڪي ۾ k اکر A ۽ a کي 0، B ۽ b کي 1، ...، Z ۽ z 25 طور مقرر ڪيو ويو آھي. پروگرام کي Vigenère cipher کي صرف متن جي p جي اکرن تي لاڳو ڪرڻ گھرجي. باقي اکر (نمبر، اوقاف جا نشان، اسپيس) بغير تبديلين جي آئوٽ ٿيڻ گهرجن. جيڪڏهن الگورٿم جٿ اکر k کي ith اکر p تي لاڳو ڪرڻ وارو آهي جيڪو الفابيٽ ۾ نه آهي، ان jth ڪيئي اکر کي متن ۾ ايندڙ الفابيٽ واري اکر تي لاڳو ڪريو؛ توهان صرف ان کي ڇڏي نه ٿا سگهو ۽ k ۾ ٻئي ڪردار ڏانهن وڃو. آخرڪار، پروگرام کي هر خط جي صورت ۾ محفوظ ڪرڻ گهرجي p .
خبر ناهي ڪٿي شروع ڪجي؟
هارورڊ CS50: هفتو 2 تفويض (ليڪچر 5 ۽ 6) - 15
ھتي ڪجھ مشورا آھن زميليا کان، CS50 ڪورس اسسٽنٽ
خوشقسمتيءَ سان، پروگرام سيزر سيفر سان بلڪل ملندڙ جلندڙ آهي، صرف ڪنجي هڪ تار آهي بجاءِ انٽيجر. جيڪڏھن توھان ڪاميابيءَ سان رومن حڪمران جي نالي جي سيفر تي عمل ڪيو آھي، اھو ٻئي ڪم لاءِ بھترين شروعات ٿي سگھي ٿو. توهان شايد اڳ ۾ ئي محسوس ڪيو آهي ته Vigenère cipher هڪ اکر سان هڪ ڪنجي وانگر ساڳيو آهي سيزر سائفر. Vigenère algorithm سيزر وانگر ساڳيا قدم استعمال ڪري ٿو:
  1. چاٻي حاصل ڪريو
    • ڪوڊ ورڊ ٻيو ڪمانڊ لائن دليل آهي argv[1]
    • الفابيٽ ۾ هجڻ گهرجي: isalpha فنڪشن
  2. متن حاصل ڪريو
  3. انڪرپٽ
  4. ciphertext پرنٽ ڪريو
تنهن ڪري، اچو ته ٻئي ڪمانڊ لائن جي دليل کي چيڪ ڪريون argv[1] اهو ڏسڻ لاءِ ته اهو الفابيٽ جي اکرن سان تعلق رکي ٿو. اسان اهو اڳ ۾ ئي واقف isalpha استعمال ڪندي ڪندا آهيون . جيڪڏهن چيڪ صحيح آهي، اسان صارف کان هڪ تار وصول ڪندا آهيون ۽ انڪرپشن شروع ڪندا آهيون. Vigenère cipher فارمولا سيزر سائفر فارمولا سان ملندڙ جلندڙ آهي. توهان هڪ خط کي لاڳاپيل سائفر آفسيٽ ۾ ڪيئن تبديل ڪندا آهيو؟ 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 . اهو هڪ ۽ صرف هڪ ڪمانڊ لائن دليل (ڪي ورڊ) وٺندو آهي، ۽ ان جو ڪم آهي ciphertext کي ان پٽ طور وٺڻ ۽ سادي متن کي واپس ڪرڻ. ان کي هلايو: ~cs50/pset2/devigenere k جتي k لفظ آهي. جيڪڏھن توھان چاھيو ٿا چيڪ 50 استعمال ڪندي پنھنجي پروگرام جي درستي کي، ھلايو: check50 2014.fall.pset2.vigenere vigenere.c ۽ جيڪڏھن توھان چاھيو ٿا جائزو وٺڻ اسان جي vigenere عملدرآمد، ٽائپ ڪريو: ~cs50/pset2/vigenere

توهان جي ڪوڊ جي تصديق ڪيئن ڪجي ۽ نشان حاصل ڪجي

ڌيان! جيڪڏھن توھان لاءِ ضروري آھي ته صرف ڪمن جي درستگي کي چيڪ ڪريو، پوءِ استعمال ڪريو cs50check. جيڪڏھن توھان edx پليٽ فارم تي گريڊ حاصل ڪرڻ چاھيو ٿا، ھيٺ ڏنل طريقي سان عمل ڪريو. ذهن ۾ رکو، اهو طريقو ساڳيو استعمال ڪري ٿو cs50check ڪمن کي چيڪ ڪرڻ لاء. فرق صرف اهو آهي ته اهو نتيجن کي ياد ڪري ٿو ۽ مجموعي سکور جي حساب سان.
  1. CS50 IDE ۾ لاگ ان ٿيو
  2. CS50 IDE جي مٿين کاٻي ڪنڊ جي ويجهو ، جتي ان جو فائل برائوزر واقع آهي (ٽرمينل ونڊو ۾ نه)، pset2 ڊاريڪٽري ۾ موجود پنهنجي initials.c فائل تي ساڄي ڪلڪ ڪريو ۽ ڪلڪ ڪريو ڊائونلوڊ ڪريو . توھان کي ڏسڻ گھرجي ته برائوزر لوڊ ڪيو آھي initials.c .
  3. ورجايو caesar.c لاءِ
  4. ورجايو vigenere.c لاءِ
  5. هڪ الڳ ونڊو يا ٽيب ۾، لاگ ان ٿيو CS50 جمع
  6. اسڪرين جي مٿين کاٻي ڪنڊ ۾ جمع آئڪن تي ڪلڪ ڪريو .هارورڊ CS50: هفتو 2 تفويض (ليڪچر 5 ۽ 6) - 19
  7. کاٻي پاسي فولڊرن جي لسٽ ۾، مسئلو سيٽ 2 ڊاريڪٽري تي ڪلڪ ڪريو ، پوء اپلوڊ نيو جمع ڪرڻ واري بٽڻ تي ڪلڪ ڪريو . اهو ساڄي پاسي آهي. هارورڊ CS50: هفتو 2 تفويض (ليڪچر 5 ۽ 6) - 20
  8. اسڪرين تي جيڪو ظاهر ٿئي ٿو، تي ڪلڪ ڪريو فائلون شامل ڪريو ... بٽڻ تي. توهان جي ڪمپيوٽر مان فائلون چونڊڻ لاءِ هڪ ونڊو کلي ويندي. هارورڊ CS50: هفتو 2 تفويض (ليڪچر 5 ۽ 6) - 21
  9. ان فولڊر ڏانھن وڃو جتي توھان رکو ٿا initials.c . اهو گهڻو ڪري توهان جي ڊائون لوڊ فولڊر ۾ واقع آهي يا جتي توهان جو برائوزر ڊفالٽ طور فائلون رکي ٿو. جڏھن توھان ڳوليندا آھيو initials.c ، ان تي ڪلڪ ڪريو ھڪ ڀيرو ان کي چونڊڻ لاءِ، پوءِ ڪلڪ ڪريو کوليو.
  10. ڪلڪ ڪريو فائلون شامل ڪريو ٻيهر.
  11. caesar.c ڳولھيو ۽ ان کي کوليو.
  12. ساڳيو ئي ڪريو vigenere.c فائل لاءِ .
  13. ڪلڪ ڪريو اپلوڊ شروع ڪريو. توهان جون فائلون CS50 سرورز تي اپ لوڊ ڪيون وينديون .
  14. اسڪرين تي جيڪو ظاهر ٿئي ٿو، توھان کي ڏسڻ گھرجي No File Selected Window . جيڪڏھن توھان پنھنجي ماؤس جي ڪرسر کي کاٻي پاسي ھلايو، توھان کي ڊائون لوڊ ڪيل فائلن جي ھڪڙي فهرست نظر ايندي. تصديق ڪرڻ لاء، انهن مان هر هڪ تي ڪلڪ ڪريو. جيڪڏهن توهان ڪنهن شيءِ جي باري ۾ پڪ نه آهيو، ته توهان ساڳيون مرحلا ورجائي فائلن کي ٻيهر اپلوڊ ڪري سگهو ٿا. توھان 2016 جي آخر تائين جيترا ڀيرا توھان چاھيو اھو ڪري سگھو ٿا.
تبصرا
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION