JavaRush /Java blogi /Random-UZ /Garvard CS50: 2-hafta topshiriqlari (5 va 6-ma'ruzalar)
Masha
Daraja

Garvard CS50: 2-hafta topshiriqlari (5 va 6-ma'ruzalar)

Guruhda nashr etilgan
5 va 6 ma'ruzalar uchun cs50 topshiriqlari CS50 ma'ruzalari bu yerda: https://cdn.javarush.com/images/article/155cea79-acfd-4968-9361-ad585e939b82/original.pngcs50.html . Ushbu materialda 3 ta vazifa, ular haqida nazariy ma'lumotlar va harakatlar bo'yicha qo'llanma mavjud.

Maqsadlar

• Funksiyalar va kutubxonalarga chuqurroq kirib boring • Kriptografiya bilan tanishing, bir nechta oddiy shifrlarni amalga oshiring

Qo'shimcha materiallar

https://reference.cs50.net/ - trening davomida foydalaniladigan kutubxona funksiyalarini tushuntirish. Inzgliz tilida. http://computer.howstuffworks.com/c.htm sahifalar 11 – 14 va 39

Tayyorgarlik

update50 Ish joyingiz versiyasi yangilanganligiga ishonch hosil qilish uchun cs50.io saytiga kiring . Agar siz tasodifan terminal oynasini yopib qo'ysangiz, Ko'rish menyusiga o'ting va Konsol elementi yonida tasdiq belgisi mavjudligiga ishonch hosil qiling (agar yo'qligini tekshiring). Garvard CS50: 2-hafta topshiriqlari (5 va 6-ma'ruzalar) - 1 Terminal oynasi ramkasidagi yashil doira ichida (+) tugmasini bosing, Yangi terminal ni tanlang . Garvard CS50: 2-hafta topshiriqlari (5 va 6-ma'ruzalar) - 2 Ishchi katalog yarating: mkdir va ~/workspace/pset2mkdir ~/workspace/pset2 o'rtasida bo'sh joy mavjudligiga e'tibor bering . Xulosa qilib aytadigan bo'lsak, ~ ildiz katalogini bildiradi, ~/workspace - bu ildiz katalog ichidagi ishchi maydoni deb nomlangan papka, ~/workspace/pset2 - ~/workspace ichidagi pset2 deb nomlangan katalog . Endi ishga tushirish: yangi katalogga o'tish uchun. Buyruqlar qatori quyidagicha ko'rinadi: Agar biror narsa noto'g'ri bo'lsa, amallarni takrorlang. Bundan tashqari , oxirgi bir nechta buyruqlarni xronologik tartibda ko'rish uchun buyruq chaqirishingiz mumkin . Shuningdek, siz kursorni buyruq satriga qo'yishingiz va barcha buyruqlarni oxirgi kiritilganidan birinchisiga qadar tartibda ko'rish uchun klaviaturadagi yuqoriga o'qni bosishingiz mumkin. Pastga tugmasi yordamida siz orqaga qaytishingiz mumkin. Aytgancha, har safar bir xil buyruqlarni kiritish o'rniga, siz allaqachon kiritgan buyruqlar bo'ylab harakat qilishingiz va Enter tugmasini bosish orqali ularni qayta bajarishingiz mumkin. Ehtimol, Devid o'z ma'ruzalarida aynan shunday qilganini payqagandirsiz. Ikkinchi haftaning vazifalari pset2 da saqlanishi kerak . cd ~/workspace/pset2username:~/workspace/pset2 $history

Vazifa 0. Initsializatsiya

Keling, chiziqlarni batafsil ko'rib chiqaylik. Bosh harflar.c faylida foydalanuvchi nomini so'raydigan dastur yozing (GetString funksiyasidan foydalanib, biz ismni satr sifatida olamiz) va keyin ism (yoki ismlar) va familiyaning birinchi harflarini bo'sh joysiz katta harflar bilan ko'rsatadi, nuqtalar yoki boshqa belgilar, faqat satr tasmasi bilan ( \n ). Biz foydalanuvchilar faqat harflar (kichik yoki katta yoki ikkalasi) va so'zlar orasidagi bo'sh joy kiritadi deb taxmin qilamiz. Jozef Gordon-Levitt, Konan O'Brayen yoki Devid J. Malan ismli yigitlar dasturdan foydalanmaydi. Dasturning to'g'ri ishlashini tekshirish uchun check50 raqamiga qo'ng'iroq qiling: CS50 xodimlari tomonidan tayyorlangan dasturni amalga oshirish bilan o'ynashni xohlaysizmi? Qatorni yozing: username:~/workspace/pset2 $ ./initials Zamyla Chan ZC username:~/workspace/pset2 $ ./initials robert thomas bowden RTBcheck50 2015.fall.pset2.initials initials.c~cs50/pset2/initials
Kriptografiya
Kriptografiya, ma'lumotni shifrlash va shifrlash fani... Aslida shifrlangan xabarlar qadim zamonlardan beri mavjud bo'lib, qo'shinlar tomonidan maxfiy xabarlarni uzatish uchun foydalanilgan. Xo'sh, endi Facebook va boshqa tarmoqlardagi parollaringiz shifrlangan shaklda saqlanadi.

1-topshiriq. Salom, Qaysar!

Nazariy ma'lumotlar
Biz eng oddiy shifrlardan birini - Rim imperatori nomi bilan atalgan Tsezar shifrini o'rganamiz. Ushbu shifrda matnning har bir harfi boshqasi bilan almashtiriladi, bu alifboda pastroq harflarning belgilangan soni. Ushbu sobit harflar soni kalit deb ataladi . Shunday qilib, 1-tugma lotincha C harfini D harfiga, Z sikl davomida A harfiga aylantiradi. Agar kalit 3 boʻlsa, C harfi F ga, Z esa C ga aylanadi. Misollar: biz Sezar shifridan foydalanamiz. mushuk so'zi bo'yicha 5 kalit. c -> h a -> f t -> y Caesar (cat, 5) = hfy Kalit = 7, so'z = kompyuter c->j o->v m->t p->w u->b t->a e->l r->y Caesar(computer,7) = jvtwbaly Garvard CS50: 2-hafta topshiriqlari (5 va 6-ma'ruzalar) - 3 Qaysar shifrlash oddiy, ammo, afsuski, ishonchsiz (bular bir-biriga bog'langan narsalar!): Ingliz alifbosi uchun atigi 25 ta shifrlash opsiyasi mavjud, hatto kompyutersiz ham barcha variantlardan o'tish oson. Biroq, Sezar shifrlash ko'pincha boshqa shifrlarda, masalan, Vigenère shifrida qadam sifatida ishlatiladi (bu haqda keyingi xatboshida). Keling, Tsezar shifrini "matematiklashtiramiz". Oddiy matnni p harfi bilan belgilaymiz, pi - matndagi p harfi i raqamida joylashgan. Maxfiy kalit harfni k, c harfini shifrlangan matn, ci harfini esa shifrlangan matnning i pozitsiyasida joylashgan harfi deb ataymiz. Keyin siz quyidagi formuladan foydalanib shifrning har bir harfini hisoblashingiz mumkin: ci = (pi + k) % 26 Bu rasmiylashtirishga o'rganing, u algoritmni dasturlash imkonini beradi va shifrning ma'nosini aniq va ixcham ifodalaydi. Agar kalit k = 13 va asl matn p bo'lsa, "Ovaltini ichishingizga ishonch hosil qiling!", bu biz oladigan shifrdir: Or fher gb qevax lbhe Binygvar! E'tibor bering, O (shifrlangan matnning birinchi harfi) B harfidan 13 pozitsiyaga siljiydi. asl matndagi birinchi harf). R harfi bilan bir xil narsa (shifrlashdagi ikkinchi harf) e dan 13 ta harfga siljiydi (asl nusxadagi ikkinchi harf). Shifrlashdagi uchinchi harf f s dan 13 ta harfga siljiydi (asl nusxada uchinchi), bu erda biz z dan a gacha aylana bo'ylab boramiz. 13-kalitli Sezar shifrida ROT13 maxsus nomi bor . Bu nosimmetrik: uni ikki marta qo'llash orqali biz asl matnga qaytamiz. Albatta, ROT26 ham bor, bu umuman o'ta xavfsiz, lekin agar siz o'z fikrlaringizni aniq ifodalamasangiz =).
Vaziyat
Caesar.c fayliga Sezar shifridan foydalanib matnni shifrlaydigan dasturni yozing. Dasturga kirish sifatida bitta buyruq qatori argumentini taqdim eting: manfiy bo'lmagan butun son. Oddiylik uchun uni k deb ataymiz. Agar foydalanuvchi dasturni buyruq qatori argumentlarisiz yoki bir nechta argumentlar bilan bajarsa, dastur shikoyat qilishi va 1 qiymatini qaytarishi kerak (odatda xatolar shunday belgilanadi): return 1; Boshqa barcha holatlarda dastur foydalanuvchidan matn kiritishni taklif qiladi. shifrlash uchun, keyin k tugmasi bilan shifrlangan matnni ko'rsatadi (ya'ni, sikl bo'ylab o'ngga k pozitsiyasi siljigan). Agar matnda ingliz alifbosidan tashqarida bo'lgan belgilar mavjud bo'lsa, dastur ularni o'zgartirmaydi. Shifrlangan matnni chop etgandan so'ng, dastur chiqadi, main 0 ni qaytaradi: return 0; Agar main aniq nolni qaytarmasa, uni avtomatik ravishda qaytaradi (int - bu asosiyning qaytish turi, lekin bu haqda boshqa safar). Konventsiyaga ko'ra (dasturlashda yaxshi shakl qoidalari), agar siz xatoni ko'rsatish uchun aniq 1 ni qaytarsangiz, dasturni muvaffaqiyatli yakunlash uchun ko'rsatgich sifatida 0 ni ham qaytarishingiz kerak. Ingliz alifbosida atigi 26 ta harf mavjud bo'lsa-da, k 26 dan katta bo'lishi mumkin. Aslida, k = 27 kaliti k = 1 bilan bir xil natijani beradi, lekin siz foydalanuvchiga har qanday manfiy bo'lmagan raqamni kiritishiga ruxsat berishingiz kerak. 2^31 – 26 dan ortiq (u int ga mos kelishi kerak). Dastur shuningdek, kichik harflar kichik, katta harflar esa katta harflar bilan shifrlanishini hisobga olishi kerak. Qayerdan boshlaymiz? Ilova argumentlar qatorida to'g'ridan-to'g'ri k qiymatini qabul qilishi kerakligi sababli, bizning asosiy funktsiya sarlavhasi quyidagicha ko'rinadi: 6-bobdan argv satrlar massivi ekanligini int main(int argc, string argv[]) bilasiz . Massivni sport zalidagi shkaflar qatori sifatida tasavvur qilish mumkin. Ularning har biri yashirin ma'noga ega. Bizning holatda, har bir katak ichida birinchi shkafni ochish uchun biz argv[0] dan foydalanamiz, ikkinchisi - argv[1] va hokazo kabi argument mavjud. Agar bizda n ta qulf bo'lsa, biz argv[n - 1] da to'xtashimiz kerak, chunki argv[n] endi mavjud emas (yoki mavjud, lekin boshqa birovga tegishli bo'lsa, biz unga tegmaganimiz ma'qul). Shunday qilib, k argumentiga quyidagi tarzda kirishingiz mumkin: stringstring k = argv[1]; Biz haqiqatan ham u erda nimadir borligiga ishonamiz! Eslatib o'tamiz, argc argv dagi qatorlar soniga teng int o'zgaruvchisidir. Bu shuni anglatadiki, hujayrani ochishga urinishdan oldin argc qiymatini tekshirish yaxshiroqdir, chunki u mavjud emasligi aniqlanishi mumkin. Ideal holda argc = 2. Nima uchun bu shunday? argv[0] ichida odatda dasturning nomi. Ya'ni, argc har doim kamida 1 bo'ladi. Lekin bizning dasturimiz foydalanuvchi k buyruq qatori argumentini taqdim etishi kerak, shuning uchun argc = 2. Tabiiyki, agar foydalanuvchi buyruq satriga bir nechta argument kiritsa, argc ham o'sib boradi va mumkin. 2 dan katta bo'lishi Agar foydalanuvchi satrga butun sonni kiritsa, bu kiritilgan qiymat avtomatik ravishda int sifatida saqlanadi degani emas. Aniqrog'i, BO'LADI. Aynan int ga o'xshasa ham, u satr bo'ladi! Shunday qilib, biz stringni o'zimiz int ga aylantirishimiz kerak. Yaxshiyamki, bu maqsad uchun mo'ljallangan atoi deb nomlangan funktsiya mavjud. Uning sintaksisi: int k = atoi(argv[1]); E'tibor bering, k int turiga kiradi, shuning uchun siz u bilan arifmetika qilishingiz mumkin. Bu funksiya yordamida foydalanuvchi butun son yoki, aytaylik, foo kiritadimi, deb tashvishlanishingiz shart emas: u holda atoi 0 ni qaytaradi. Atoi funksiyasi stdlib.h kutubxonasida e’lon qilingan , shuning uchun # ga ishonch hosil qiling. uni dasturning boshida kiriting. Kod busiz kompilyatsiya qilinadi, chunki biz bu funktsiyani allaqachon cs50.h kutubxonasiga kiritganmiz . Biroq, mahalliy kutubxonalarga ishonish yaxshiroqdir. Shunday qilib, siz k ni int sifatida saqladingiz. Endi matn kiritishni so'raymiz. Agar siz birinchi haftaning topshiriqlarini bajargan bo'lsangiz, siz allaqachon GetString deb nomlangan CS50 kutubxonasi funksiyasi bilan tanishsiz. U bizga yordam beradi. K va dastlabki matnni olganingizdan so'ng, shifrlashni boshlaymiz. Xulosa qilish uchun siz satrning barcha belgilarini takrorlashingiz va ularni quyidagi sikl yordamida chop etishingiz mumkin: for (int i = 0, n = strlen(p); i < n; i++) { printf("%c", p[i]); } Boshqacha qilib aytganda, argv qatorlar massivi bo'lgani kabi, string ham belgilar massividir. Shuning uchun, biz argv-da alohida satrlarni olish kabi alohida satr elementlariga kirish uchun kvadrat qavslardan foydalanishimiz mumkin. Albatta, har bir belgini chop etishda kriptografik hech narsa yo'q. Yoki texnik jihatdan, k = 0 bo'lganda. Lekin biz Qaysarga uning matnini shifrlashda yordam berishimiz kerak! Salom, Qaysar! Strlen-dan foydalanish uchun siz boshqa kutubxonani qo'shishingiz kerak . Biz ba'zi tekshirish testlarini avtomatlashtirganimiz sababli, dastur aynan shunday harakat qilishi kerak: atoiusername:~/workspace/pset2 $ ./caesar 13 Be sure to drink your Ovaltine! Or fher gb qevax lbhe Binygvar! dan tashqari , ctype.h va stdlib.h kutubxonalarida boshqa ajoyib funksiyalarni topishingiz mumkin . Buni amalga oshirish uchun havolaga rioya qiling va u erda biroz o'rganing. Masalan, isdigit , aniq qiziq narsa =). Z dan A ga (yoki z dan a ga) o'tayotganda % modul operatori haqida unutmang.C tilida.Shuningdek, jadvalni o'rganing , u faqat harflar uchun emas, balki ASCII belgilarini ham ko'rsatadi. Dasturning check50 bilan to'g'ri ishlashini tekshirish uchun quyidagilarni bajaring: check50 2015.fall.pset2.caesar caesar.c Va agar siz CS50 xodimlari tomonidan yaratilgan kod bilan o'ynashni xohlasangiz, buyruqni bajaring: ~cs50/pset2/caesar Aytgancha, uggc://jjj.lbhghor.pbz/jngpu ?i=bUt5FWLEUN0 .
Vazifani tahlil qilish
  1. Kalitni oling
  2. Matnni oling
  3. Shifrlash
  4. Shifrlangan xabarni ko'rsatish
1. Biz asosiy funktsiyani shakllantiramiz, shunda foydalanuvchi kalitni buyruq satriga kiritadi va kalitni to'g'riligini tekshiradi. int main(int argc, string argv[]) argc: • int • buyruq satriga kiritilgan argumentlar soni • argc = 2 bo'lsa, hammasi joyida. Agar yo'q bo'lsa, yo'riqnomani chop eting va dasturni yoping. • Agar argc = 2 bo'lsa, kalit butun son ekanligini tekshiramiz • Argv qatorlar massivi, unga argumentlar kiritilgan ro'yxat Massiv - turli kataklardagi bir xil turdagi turli ma'lumotlarni o'z ichiga olgan ma'lumotlar strukturasi. Garvard CS50: 2-hafta topshiriqlari (5 va 6-ma'ruzalar) - 4 Misol uchun, foydalanuvchi blastoff Team Rocket qatorini kiritdi, keyin: Garvard CS50: 2-hafta topshiriqlari (5 va 6-ma'ruzalar) - 5 atoi() funktsiyasidan foydalanib, biz olingan sonni butun songa aylantiramiz. Agar buning iloji bo'lmasa, funksiya 0 ni qaytaradi. Garvard CS50: 2-hafta topshiriqlari (5 va 6-ma'ruzalar) - 6 2. Foydalanuvchiga matn kiritishni so'rang. Hammasi oddiy: foydalanuvchi kiritgan hamma narsa satrdir. 3. Shifrlash. Algoritm oddiy, lekin qaysi harflar ketma-ket kelishini kompyuterga qanday tushuntirish mumkin? ASCII jadvalini eslash vaqti keldi! Garvard CS50: 2-hafta topshiriqlari (5 va 6-ma'ruzalar) - 7 Biroq, satrda shunchaki harflar bo'lishi mumkin emas... Satrlarni o'zgartirishga o'tishdan oldin, faqat bitta belgini o'zgartirishingiz kerakligini tasavvur qiling. Biz belgilar yoki raqamlarni emas, balki boshlang'ich matndagi harflarni o'zgartirmoqchimiz. Nima qilishimiz kerak? Avval bu belgi alifboda yoki yo'qligini tekshirishimiz kerak. Buni isalpha() funksiyasi yordamida amalga oshirish mumkin . Agar belgi alifboda bo'lsa, bu funktsiya rost va aks holda yolg'onni qaytaradi. Yana ikkita foydali funksiya - isupper() va islower(), agar harf mos ravishda katta yoki kichik bo'lsa, rostni qaytaradi. Shunday qilib: Isalpha(‘Z’) -> true Isalpha(‘;’) -> false Isupper(‘Z’) ->true Isupper(‘z’) -> false Islower(‘Z’) -> false Islower(‘z’)->true Agar isalpha rost bo'lsa, biz kalit yordamida bu belgini o'zgartirishimiz kerak. CS50 yordamchisi Zamili dasturini misol tariqasida ko'rib chiqamiz va tahlil qilamiz. "A" harfi aniq bo'lsa, nima uchun butun son ekanligiga hayron bo'lishingiz mumkin. Ma'lum bo'lishicha, belgilar va butun sonlar bir-birini almashtiradi. A harfini bitta tirnoq ichiga qo'yish orqali siz uning ASCII kodini int-da olishingiz mumkin. Ehtiyot bo'ling: sizga bitta tirnoq kerak; ularsiz kompilyator belgi emas, balki A nomli o'zgaruvchini qidiradi. Keyin qatorda harfning ASCII kodiga kalit qiymatini qo'shamiz va ularni butun o'zgaruvchida saqlaymiz. Natija int bo'lsa ham, printf iborasi belgilar uchun %c to'ldirgichdan foydalanadi. Shunday qilib, dastur butun natija bilan bog'liq belgini chop etadi. Ikkinchi holda, biz raqamni %d to'ldiruvchisi yordamida ko'rsatamiz. Siz ushbu kodni cs50 IDE-ga kiritishingiz va u bilan o'ynashingiz mumkin. Keling, turli xil kalitlar uchun asciimath qanday ishlashini tekshiramiz. Keling, 25 qiymatini olaylik, biz quyidagi rasmni ko'ramiz: Va endi kalit 26 bo'lsin: Bizda [, va umuman A harfi emas.Bu Z dan keyingi keyingi ASCII belgisidir. ish. Harflar tugashi bilan alifboning boshiga qaytish uchun shifrlash formulasidan foydalanishimiz kerak. Esingizda bo'lsin, biz yuqorida yozgan edik: /* * 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);Garvard CS50: 2-hafta topshiriqlari (5 va 6-ma'ruzalar) - 8Garvard CS50: 2-hafta topshiriqlari (5 va 6-ma'ruzalar) - 9ci = (pi + k) % 26 Bu erda ci - shifrlangan matndagi i harfi, pi - ochiq matndagi i harfi, k - kalit va % 26 - 26 ga bo'linishning qolgan qismi (yoki "modul 26"). Bu formulani Y harfiga qo'llaymiz. k = 2 ni oling. Hisoblang ('Y' + 2) %26 'Y' harfining ASCII kodi = 89. Keyin ('Y' + 2) %26 = (89 + 2) )% 26 = 91%26 = 13 Lekin bu bizga kerak bo'lgan A harfining ASCII qiymati emas, ya'ni 65. Endi alifboning har bir harfiga tartib bilan 0 dan 25 gacha qiymat beraylik. Bu holda, Y = 24. (24+2)%26 = 0 A harfi aynan shunday indeksga ega. Shunday qilib, bu formula harflarning ASCII qiymatlariga emas, balki alifbo indeksiga ishora qiladi. Shifrlangan belgini chop etish uchun uning ASCII qiymati kerak bo'ladi. Va ASCII qiymati va alifbodagi raqam o'rtasida qanday o'tishni aniqlang. Bitta belgi uchun formulani aniqlaganimizdan so'ng, uni klaviaturadan kiritilgan satrdagi har bir harfga qo'llashimiz kerak. Ammo bu harflar bo'lsa! Va esda tutingki, katta va kichik harflar turli xil ma'nolarni talab qiladi. Bu erda isupper va islower funksiyalari yordam beradi. Sizda ikkita formula bo'lishi mumkin, biri bosh harflar uchun, ikkinchisi kichik harflar uchun, funktsiyalar qaysi birini qo'llashni tanlashga yordam beradi. Formulani satrdagi har bir belgiga qanday qo'llash mumkin? Esda tutingki, satr shunchaki belgilar massividir. Strlen funktsiyasi (string uzunligi) tsikldagi takrorlanishlar sonini aniqlashga yordam beradi .Garvard CS50: 2-hafta topshiriqlari (5 va 6-ma'ruzalar) - 10

2-topshiriq. Parlez-vous français?

Nazariya
Vigenère shifrlash Tsezar shifriga qaraganda biroz xavfsizroq: u kalit sifatida so'zdan foydalanadi va chastota tahlili yoki qo'pol kuch yordamida qo'lda buzish qiyin. Kalitning har bir harfi raqam hosil qiladi va natijada biz harflarni almashtirish uchun bir nechta kalitlarni olamiz. Misol: p = Meet me in the park at eleven am В качестве ключевого слова возьмем k = bacon Длина messages p = 25 В то время How длина k = 5 Поэтому его нужно повторять 5 раз. Garvard CS50: 2-hafta topshiriqlari (5 va 6-ma'ruzalar) - 11 Agar xabardagi harflar soni kalitga bo'linmasa, biz kalitning oxirgi ilovasida uning faqat bir qismidan foydalanamiz: Garvard CS50: 2-hafta topshiriqlari (5 va 6-ma'ruzalar) - 12 Ofset qiymatini topish uchun biz bekon kalitimizning har bir harfining pozitsiyasidan foydalanamiz. alifboda (a dan z gacha). Biz haqiqiy dasturchilar kabi noldan hisoblaymiz. Va asl matndagi har bir harf, Tsezar shifrida bo'lgani kabi, berilgan raqamga siljiydi, agar kerak bo'lsa, Z dan keyin alifboning boshiga qaytariladi. Shunday qilib, M 1 ga siljiydi, birinchi e umuman harakat qilmaydi, ikkinchisi esa 2 pozitsiyaga siljiydi. Quyida siz asl xabarni, yozma kalitni va uni qo'llash natijasini ko'rasiz. Garvard CS50: 2-hafta topshiriqlari (5 va 6-ma'ruzalar) - 13 Vigenère shifrlash, albatta, kuchliroq, lekin agar siz kalitning uzunligini bilsangiz, uni buzish juda oson. Uni qanday aniqlash mumkin? Agar asl matn etarlicha uzun bo'lsa, unda ba'zi so'zlar bir necha marta paydo bo'lsa, siz ba'zi takrorlashlarni ko'rasiz: Siz Garvard CS50: 2-hafta topshiriqlari (5 va 6-ma'ruzalar) - 14 qo'pol kuch ishlatishingiz mumkin, lekin ko'p variantlar mavjud: 26^n - 1 bu erda n - noma'lum kalitning uzunligi . Lekin, odatda, bu juda ko'p. To'g'ri, bu kompyuter uchun muammo emas. Endi esa shifrlash matematikasi: p - ba'zi matn, k - kalit so'z, kj - kalitning j-harfi, pi - asl matndagi i harfi, ci - shifrlashda i harfi bo'lsin. . Keyin: ci = (pi + kj) % 26
Mashq qilish
Shart Vigenere shifridan foydalanib xabarni shifrlaydigan vigenere.c dasturini yozing. Biz dastur kiritishiga bitta buyruq qatori argumentini keltiramiz: ingliz alifbosi harflaridan iborat k kalit so'zi. Agar dastur bir nechta argument bilan yoki alifboga kiritilmagan argument bilan ishga tushirilsa, xato ma'lumotlarini ko'rsatish va dasturni tugatish kerak. Ya'ni, asosiy 1 ni qaytaradi - bu holda bizning avtomatik testlarimiz bu erda hamma narsa yaxshi ekanligini tushunadi va bu shart hisobga olinadi. Agar hamma narsa yaxshi bo'lsa, dastur p matn satrini so'rashni davom ettirishi kerak, biz yuqorida olingan k kaliti bilan shifrlaymiz, natijani chop etamiz va dasturni yakunlaymiz, 0 qiymatini qaytaramiz. Aniqlash kalitda ekanligiga ishonch hosil qilish kerak. k A va a belgilari 0, B va b 1, ..., Z va z 25 sifatida belgilanadi. Dastur Vigenère shifrini faqat p matnining harflariga qo'llashi kerak. Qolgan belgilar (raqamlar, tinish belgilari, bo'shliqlar) o'zgarishsiz chiqarilishi kerak. Agar algoritm alifboda mavjud bo'lmagan p belgisiga j-chi belgini qo'llamoqchi bo'lsa , u j-kalit belgini matndagi keyingi alifbo belgisiga qo'llang ; uni tark etib, k-dagi boshqa belgiga o'tolmaysiz. Nihoyat, dastur p dagi har bir harfning holatini saqlab qolishi kerak .
Qayerdan boshlashni bilmayapsizmi?
Garvard CS50: 2-hafta topshiriqlari (5 va 6-ma'ruzalar) - 15
CS50 kursi yordamchisi Zamilyadan ba'zi maslahatlar
Yaxshiyamki, dastur Tsezar shifriga juda o'xshaydi, faqat kalit butun son emas, balki satrdir. Agar siz Rim hukmdori nomi shifrini muvaffaqiyatli amalga oshirgan bo'lsangiz, bu ikkinchi vazifa uchun ajoyib boshlanish bo'lishi mumkin. Kalit sifatida bitta harfdan iborat bo'lgan Vigenère shifrlash Tsezar shifriga o'xshashligini allaqachon tushungan bo'lsangiz kerak. Vigenère algoritmi Sezar bilan bir xil qadamlardan foydalanadi:
  1. Kalitni oling
    • kod so'zi ikkinchi buyruq qatori argumenti argv[1]
    • alifboda bo'lishi kerak: isalpha funktsiyasi
  2. Matnni oling
  3. Shifrlash
  4. Shifrlangan matnni chop etish
Shunday qilib, keling, ikkinchi buyruq qatori argv[1] argumentini alifbo belgilariga tegishli yoki yo'qligini tekshirib ko'ramiz. Biz buni allaqachon tanish bo'lgan isalpha yordamida qilamiz . Agar kalit to'g'ri bo'lsa, biz foydalanuvchidan satr olamiz va shifrlashni boshlaymiz. Vigenere shifrlash formulasi Sezar shifrlash formulasiga o'xshaydi. Qanday qilib harfni mos keladigan shifr ofsetiga aylantirasiz? ASCII jadvali yordamida qiymatlarni solishtirishga harakat qiling. Garvard CS50: 2-hafta topshiriqlari (5 va 6-ma'ruzalar) - 16 Katta ehtimol bilan siz jadvaldagi ketma-ketliklardan foydalanib, harflar va ularning alifbo indekslari orasidagi naqshni topishingiz mumkin. Istalgan natijani olish uchun bir harfni boshqasidan qanday olib tashlashni aniqladingizmi? Katta va kichik harflar uchun ofsetlar bir xil, shuning uchun kichik harflar va alohida katta harflar uchun ofsetni aniqlash uchun ikkita o'xshash formulani belgilashingiz kerak bo'ladi. Shuni ham yodda tutingki, matn tsikli inglizcha bo'lmagan belgilarni e'tiborsiz qoldirishi kerak. Va harflar sonini saqlashni unutmang. Agar siz shifrlash formulasiga qarasangiz: ci = (pi + kj) % 26 ikkita indeks o'zgaruvchisini ko'rasiz, i va j. Ulardan biri manba matnidagi pozitsiyani, ikkinchisi kalitda saqlaydi. Agar sizning matningiz kalitdan uzunroq bo'lsa, kalitdagi indeks kalitning oxiridan boshiga qaytadi. Buni qanday qilish kerak? Moduli bo'linish operatsiyasidan foydalanish! Amaliyot natijasi ikki raqamning bo'linishining qolgan qismidir. Dasturlashda ushbu operatsiyaning amaliy foydalari juda katta! Tasavvur qiling-a, odamlarning katta guruhini uchta kichik guruhga bo'lish kerak. Buning bir yo'li - birinchi, ikkinchi, uchinchi uchun pul to'lashni so'rash. Garvard CS50: 2-hafta topshiriqlari (5 va 6-ma'ruzalar) - 17 Ya'ni, birinchi shaxs birinchi guruhga, ikkinchisi ikkinchisiga, uchinchisi uchinchisiga, to'rtinchisi yana birinchisiga va hokazo. Xuddi shu operatsiyani bajarish uchun modul bo'linmasidan foydalanishingiz mumkin. Keling, bir xil uchta guruhni noldan raqamlaymiz. Buni qanday qilish kerak: Garvard CS50: 2-hafta topshiriqlari (5 va 6-ma'ruzalar) - 18 Agar indeksni olib, uni modulga maksimal qiymatga ajratsangiz, natija hech qachon bu qiymatdan katta yoki teng bo'lmaydi. Kalit so'zni boshiga qaytarish uchun ushbu tamoyilni sinab ko'ring! Guruh bo'yicha saralash o'rniga kalit so'zning indeksi kerak bo'ladi, shuning uchun kalit uzunligini oshirmasdan to'g'ri harfni almashtirishingiz mumkin. Kodingizning ba'zi sinovlarini avtomatlashtirganimiz sababli, dastur quyida ko'rsatilgandek harakat qilishi kerak: jharvard@appliance (~/Dropbox/pset2): ./vigenere bacon Meet me at the park at eleven am Negh zf av huf pcfx bt gzrwep oz Dasturni shifrlangan matnni qo'lda hisoblashdan tashqari yana qanday qilib sinab ko'rishingiz mumkin? Biz mehribonmiz: buning uchun biz dastur yozdik devigenere . U bitta va bitta buyruq qatori argumentini (kalit so'z) oladi va uning vazifasi shifrlangan matnni kirish sifatida qabul qilish va ochiq matnni qaytarishdir. Uni ishga tushiring: ~cs50/pset2/devigenere k Bu erda k - kalit so'z. Agar siz check50 dan foydalanib dasturingizning toʻgʻriligini tekshirmoqchi boʻlsangiz, ishga tushiring: check50 2014.fall.pset2.vigenere vigenere.c Va agar siz bizning vigenere amaliyotimizni baholashni istasangiz, yozing: ~cs50/pset2/vigenere

Kodni qanday tekshirish va belgilarni olish

Diqqat! Agar siz uchun faqat vazifalarning to'g'riligini tekshirish muhim bo'lsa, cs50check-dan foydalaning. Agar siz edx platformasida baho olishni istasangiz, quyida tavsiflangan tartibni bajaring. Shuni yodda tutingki, ushbu protsedura vazifalarni tekshirish uchun bir xil cs50check-dan foydalanadi. Faqatgina farq shundaki, u natijalarni eslab qoladi va umumiy ballni hisoblaydi.
  1. CS50 IDE ga kiring
  2. CS50 IDE ning yuqori chap burchagida , uning fayl brauzeri joylashgan joyda (terminal oynasida emas), pset2 katalogida joylashgan bosh harflar.c faylni o'ng tugmasini bosing va Yuklab olish tugmasini bosing . Brauzerda bosh harflar.c yuklanganligini ko'rishingiz kerak .
  3. Caesar.c uchun takrorlang .
  4. vigenere.c uchun takrorlang .
  5. Alohida oyna yoki yorliqda CS50 Submit- ga kiring
  6. Ekranning yuqori chap burchagidagi Yuborish belgisini bosing .Garvard CS50: 2-hafta topshiriqlari (5 va 6-ma'ruzalar) - 19
  7. Chapdagi papkalar ro'yxatida Muammolar to'plami 2 katalogini bosing, so'ng "Yangi yuborishni yuklash" tugmasini bosing . U o'ng tomonda. Garvard CS50: 2-hafta topshiriqlari (5 va 6-ma'ruzalar) - 20
  8. Ko'rsatilgan ekranda " Fayllarni qo'shish ..." tugmasini bosing. Kompyuteringizdan fayllarni tanlash oynasi ochiladi. Garvard CS50: 2-hafta topshiriqlari (5 va 6-ma'ruzalar) - 21
  9. Bosh harflar saqlanadigan jildga o'ting.c . U "Yuklashlar" jildida yoki brauzeringiz sukut bo'yicha fayllarni joylashtirgan joyda joylashgan bo'lishi mumkin . Bosh harflar.c ni topganingizda , uni tanlash uchun ustiga bir marta bosing va keyin Ochish tugmasini bosing.
  10. Fayllarni qo'shish-ni yana bosing .
  11. caesar.c toping va uni oching.
  12. vigenere.c fayli uchun ham xuddi shunday qiling .
  13. Yuklashni boshlash tugmasini bosing. Fayllaringiz CS50 serverlariga yuklanadi .
  14. Ko'rsatilgan ekranda siz Tanlangan fayl yo'q oynasini ko'rishingiz kerak . Agar sichqoncha kursorini chapga sursangiz, yuklab olingan fayllar ro'yxatini ko'rasiz. Tasdiqlash uchun ularning har birini bosing. Agar biror narsaga ishonchingiz komil bo'lmasa, xuddi shu amallarni takrorlash orqali fayllarni qayta yuklashingiz mumkin. Buni 2016 yil oxirigacha xohlaganingizcha qilishingiz mumkin.
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION