JavaRush /Блоги Java /Random-TG /Harvard CS50: Супоришҳои ҳафтаи 2 (Лекцияҳои 5 ва 6)
Masha
Сатҳи

Harvard 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 , то боварӣ ҳосил кунед, ки versionи фазои кории шумо нав аст. Агар шумо тасодуфан равзанаи терминалро пӯшед, ба менюи Намоиш гузаред ва боварӣ ҳосил кунед, ки дар паҳлӯи банди Консол аломати қайд мавҷуд аст (агар ин тавр набошад, тафтиш кунед). Harvard CS50: Супоришҳои ҳафтаи 2 (Лекцияҳои 5 ва 6) - 1 Тугмаи (+) -ро клик кунед, дар дохor доираи сабз дар чаҳорчӯбаи равзанаи терминал, Терминали нав -ро интихоб кунед . Harvard CS50: Супоришҳои ҳафтаи 2 (Лекцияҳои 5 ва 6) - 2 Феҳристи корӣ эҷод кунед: Дар хотир доред, ки дар байни mkdir ва ~/workspace/pset2mkdir ~/workspace/pset2 фосила вуҷуд дорад . Барои хулоса, ~ маънои феҳристи решаро дорад, ~/workspace ҷузвдонест, ки фазои корӣ дар дохor директорияи решавӣ номида мешавад, ~/workspace/pset2 директорияи pset2 дар дохor ~/workspace номида мешавад . Акнун иҷро кунед: барои тағир додан ба феҳристи нав. Сатри фармон чунин аст: Агар чизе нодуруст бошад, қадамҳоро такрор кунед. Шумо инчунин метавонед фармонро барои дидани чанд фармони охир бо тартиби хронологӣ занг занед. Шумо инчунин метавонед курсори худро дар сатри фармон ҷойгир кунед ва тирчаи болоро дар клавиатураи худ пахш кунед, то ҳамаи фармонҳоро бо тартиби аз охирин воридшуда то аввал дидан кунед. Бо истифода аз тугмаи поён шумо метавонед баргардед. Дар омади гап, ба ҷои ҳар дафъа навиштани як фармон, шумо метавонед дар байни фармонҳои чопкардаи худ ҳаракат кунед ва онҳоро бо пахшкунии Enter дубора иҷро кунед. Шумо шояд пай бурда бошед, ки Дэвид дар лексияҳояш маҳз ҳамин тавр мекунад. Вазифаҳои ҳафтаи дуюм бояд дар pset2 захира карда шаванд . cd ~/workspace/pset2username:~/workspace/pset2 $history

Вазифаи 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
Криптография
Криптография, илми рамзгузорӣ ва рамзкушоии иттилоот... Воқеан, паёмҳои рамзӣ аз замонҳои қадим вуҷуд доштанд ва аз ҷониби артишҳо барои интиқоли паёмҳои махфӣ истифода мешуданд. Хуб, ҳоло паролҳои шумо дар Facebook ва дигар шабакаҳо дар шакли рамзгузорӣ нигоҳ дошта мешаванд.

Вазифаи 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 Harvard CS50: Супоришҳои ҳафтаи 2 (Лекцияҳои 5 ва 6) - 3 Рамзи қайсар оддӣ аст, аммо, мутаассифона, эътимоднок нест (инҳо чизҳои ба ҳам алоқаманданд!): барои алифбои англисӣ ҳамагӣ 25 варианти рамзгузорӣ мавҷуд аст, ки ҳатто бидуни компютер гузаштан аз ҳама имконот осон аст. Бо вуҷуди ин, шифри қайсар аксар вақт ҳамчун як қадам дар рамзҳои дигар истифода мешавад, ба монанди шифри Vigenère (бештар дар ин бора дар параграфи оянда). Биёед шифри қайсарро «математикӣ» кунем. Биёед матни оддиро бо ҳарфи p ишора кунем, pi ҳарфи дар матни p аст, ки дар мавқеи рақами i ҷойгир аст. Биёед ҳарфи калиди махфиро k, c -ро матни рамзӣ ва ci -ро дар матни рамзгузорие, ки дар мавқеи i ҷойгир аст, меномем. Он гоҳ шумо метавонед ҳар як ҳарфи шифрро бо истифода аз формула ҳисоб кунед: ci = (pi + k) % 26 Ба ин расмиятсозӣ одат кунед, он ба шумо имкон медиҳад алгоритмро барномарезӣ кунед ва маънои шифрро дақиқ ва дақиқ ифода мекунад. Агар калиди k = 13 ва матни аслии p бошад, "Хатман нӯшед, ки Ovaltine-и худро бинӯшед!", ин рамзест, ки мо мегирем: Аҳамият Or fher gb qevax lbhe Binygvar! диҳед, ки O (ҳарфи аввал дар матн) аз ҳарфи B 13 ҷой иваз карда мешавад ( ҳарфи аввал дар матни аслӣ). Ҳамин чиз бо ҳарфи r (ҳарфи дуюм дар рамзгузорӣ) аз e (ҳарфи дуюм дар асл) 13 ҳарф иваз карда мешавад. Ҳарфи сеюм дар рамзгузорӣ, f ба 13 ҳарф аз s (севум дар асл) кӯчонида шудааст, дар ин ҷо мо дар доира аз z ба a мегузарем. Рамзи қайсар бо калиди 13 дорои номи махсуси ROT13 мебошад . Он симметрӣ аст: онро ду маротиба татбиқ карда, мо ба матни аслӣ бармегардем. Албатта, ROT26 низ вуҷуд дорад, ин умуман хеле бехатар аст, аммо танҳо агар шумо фикрҳои худро равшан баён накунед =).
Вазъият
Дар файли caesar.c барномаеро нависед, ки матнро бо истифодаи шифри Caesar рамзгузорӣ мекунад. Як далели сатри фармонро ҳамчун вуруд ба барнома пешниҳод кунед: адади ғайриманфӣ. Барои содда, биёед онро к номем. Агар корбар барномаро бидуни далелҳои сатри фармон ё бо зиёда аз як аргумент иҷро кунад, барнома бояд шикоят кунад ва арзиши 1-ро баргардонад (хатоҳо одатан ҳамин тавр ифода карда мешаванд): return 1; Дар ҳама ҳолатҳои дигар, барнома аз корбар матнро дархост мекунад. барои рамзкунонӣ, баъд матни бо калиди k рамзкунонидашударо намоиш медиҳад (яъне, мавқеъҳои k ба тарафи рост дар тӯли давра кӯчонида шудаанд). Агар матн дорои аломатҳои берун аз алифбои англисӣ бошад, барнома онҳоро тағир намедиҳад. Пас аз чопи матни рамз, барнома аз кор мебарояд, main 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 массиви сатрҳост. Массивро метавон ҳамчун як қатор ҷевонҳо дар толори варзишӣ баррасӣ кард. Ҳар яке аз онҳо маънои пинҳон доранд. Дар ҳолати мо, дар дохor ҳар як ячейка як аргумент мавҷуд аст, ба монанди string Барои кушодани қулфбанди аввал, мо argv[0], дуюм - argv[1] ва ғайраро истифода мебарем. Агар мо n қуфл дошта бошем, пас мо бояд дар argv[n - 1] таваққуф кунем, зеро argv[n] дигар вуҷуд надорад (ё вуҷуд дорад, аммо ба ягон каси дигар тааллуқ дорад, беҳтараш ба он даст нарасонем). Ҳамин тавр, шумо метавонед ба далели k чунин дастрас шавед: string k = argv[1]; Мо боварӣ дорем, ки дар ҳақиқат чизе вуҷуд дорад! Ба ёд оред, ки argc як тағирёбандаи int аст, ки ба шумораи сатрҳои argv баробар аст. Ин маънои онро дорад, ки пеш аз кӯшиши кушодани ячейка арзиши argc-ро тафтиш кардан беҳтар аст, зеро он метавонад маълум шавад, ки он вуҷуд надорад. Идеалӣ argc = 2. Чаро ин тавр аст? Дар дохor argv[0] одатан номи барнома аст. Яъне, argc ҳамеша ҳадди аққал 1 аст. Аммо барномаи мо ба корбар ниёз дорад, ки аргументи сатри фармонро пешниҳод кунад, бинобар ин, argc = 2. Табиист, ки агар корбар дар сатри фармон зиёда аз як аргумент ворид кунад, argc низ афзоиш меёбад ва метавонад бузургтар аз 2 бошад Агар корбар адади бутунро ба сатр ворид кунад, ин маънои онро надорад, ки арзиши воридшуда ба таври худкор ҳамчун int нигоҳ дошта мешавад. Аниқтараш, НЕСТ. Он сатр хоҳад буд, ҳатто агар он маҳз ба int монанд бошад! Пас, мо бояд сатрро ба худамон табдил диҳем. Хушбахтона, функсияе мавҷуд аст, ки atoi ном дорад, ки барои ин мақсад пешбинӣ шудааст. Синтаксиси он чунин аст: int k = atoi(argv[1]); Дар хотир доред, ки k намуди int аст, бинобар ин шумо метавонед бо он арифметикӣ кунед. Бо ин функсия ба шумо лозим нест, ки оё корбар адади бутунро ворид мекунад ё, масалан, foo: дар ин ҳолат, atoi 0-ро бармегардонад. Функсияи atoi дар китобхонаи stdlib.h эълон шудааст , аз ин рӯ ҳатман # онро дар аввали барнома дохил кунед. Рамз бидуни ин тартиб дода мешавад, зеро мо аллакай ин функсияро ба китобхонаи cs50.h дохил кардаем . Бо вуҷуди ин, беҳтар аст, ки ба китобхонаҳои ватанӣ бовар кунед. Ҳамин тавр, шумо k ҳамчун int захира кардаед. Акнун биёед вуруди матнро талаб кунем. Агар шумо супоришҳои ҳафтаи аввалро иҷро карда бошед, шумо аллакай бо функсияи китобхонаи CS50 бо номи GetString шинос ҳастед. Вай ба мо кумак мекунад. Пас аз он ки шумо k ва матни аввалро гирифтед, биёед рамзкунониро оғоз кунем. Барои ҷамъбаст, шумо метавонед ҳамаи аломатҳои сатрро такрор кунед ва онҳоро бо истифода аз ҳалқаи зерин чоп кунед: for (int i = 0, n = strlen(p); i < n; i++) { printf("%c", p[i]); } Ба ибораи дигар, ҳамон тавре ки argv массиви сатрҳост, сатр массиви аломатҳост. Аз ин рӯ, мо метавонем қавсҳои мураббаъро барои дастрасӣ ба унсурҳои сатри инфиродӣ ҳамон тавре ки дар argv гирифтан сатрҳои инфиродӣ истифода барем. Албатта, дар бораи чопи ҳар як аломат ҳеҷ чизи криптографӣ вуҷуд надорад. Ё аз ҷиҳати техникӣ, вақте ки k = 0. Аммо мо бояд ба қайсар дар рамзгузории матни худ кӯмак кунем! Салом, Қайсар! Барои истифодаи strlen, шумо бояд китобхонаи дигарро дохил кунед . Азбаски мо баъзе санҷишҳои тасдиқкуниро автоматӣ карда истодаем, барнома бояд маҳз чунин рафтор кунад: username:~/workspace/pset2 $ ./caesar 13 Be sure to drink your Ovaltine! Or fher gb qevax lbhe Binygvar! Ба ғайр аз atoi , шумо метавонед дар китобхонаҳои ctype.h ва stdlib.h дигар вазифаҳои ҷолибро пайдо кунед . Барои ин, истинодро пайгирӣ кунед ва дар атрофи он ҷо каме саргарм кунед. Масалан, isdigit як чизи ҷолиб аст =). Ҳангоми гузаштан аз Z ба A (ё аз z ба a), дар бораи оператори модули % фаромӯш накунед.Ҷадвалро низ омӯзед , он аломатҳои ASCII на танҳо барои ҳарфҳоро нишон медиҳад. Барои санҷидани он, ки барнома бо check50 дуруст кор мекунад , амалҳои зеринро иҷро кунед: check50 2015.fall.pset2.caesar caesar.c Ва агар шумо ба бозӣ бо codeи аз ҷониби кормандони CS50 сохташуда таваҷҷӯҳ дошта бошед, фармонро иҷро кунед: ~cs50/pset2/caesar Дар омади гап, uggc://jjj.lbhghor.pbz/jngpu ?i=bUt5FWLEUN0 .
Таҳлor вазифа
  1. Калидро гиред
  2. Матн гиред
  3. Рамзгузорӣ
  4. Намоиши паёми рамзшуда
1. Функсияи асосиро тавре ташкил мекунем, ки корбар калидро дар сатри фармон ворид намуда, дурустии калидро тафтиш кунад. int main(int argc, string argv[]) argc: • int • шумораи аргументҳои дар сатри фармон воридшуда • агар argc = 2 ҳамааш хуб аст. Агар не, дастурро чоп кунед ва барномаро пӯшед. • Агар argc = 2 бошад, мо тафтиш мекунем, ки калид адади бутун аст ё не • Argv массиви сатрҳо мебошад, рӯйхат бо аргументҳои ба он воридшуда Массив сохтори додаҳоест, ки дорои маълумоти гуногуни як навъи дар ячейкаҳои гуногун мебошад. Harvard CS50: Супоришҳои ҳафтаи 2 (Лекцияҳои 5 ва 6) - 4 Масалан, корбар сатри blastoff Team Rocket-ро ворид кард, пас: Harvard CS50: Супоришҳои ҳафтаи 2 (Лекцияҳои 5 ва 6) - 5 Бо истифода аз функсияи atoi(), мо адади ҳосилшударо ба адади бутун табдил медиҳем. Агар ин имконнопазир бошад, функсия 0-ро бармегардонад. Harvard CS50: Супоришҳои ҳафтаи 2 (Лекцияҳои 5 ва 6) - 6 2. Аз корбар матнро дархост кунед. Ин оддӣ аст: ҳар чизе ки корбар ворид мекунад, сатр аст. 3. Рамзгузорӣ. Алгоритм оддӣ аст, аммо чӣ тавр шумо метавонед ба компютер фаҳмонед, ки кадом ҳарфҳо паси дигар меоянд? Вақти он расидааст, ки ҷадвали ASCII-ро ба ёд орем! Harvard 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 гиред. Эҳтиёт бошед: ба шумо нохунакҳои ягона лозиманд; бидуни онҳо, компилятор тағирёбандаеро бо номи А ҷустуҷӯ мекунад, на рамз. Сипас дар сатр мо арзиши калидро ба рамзи ASCII ҳарф илова мекунем ва онҳоро дар як тағирёбандаи бутун нигоҳ медорем. Ҳатто агар натиҷа int бошад ҳам, изҳороти printf барои аломатҳо ҷойнишини %cро истифода мебарад. Ҳамин тавр, барнома аломати марбут ба натиҷаи бутунро чоп мекунад. Дар ҳолати дуюм, мо рақамро бо истифода аз ҷойнишини %d намоиш медиҳем. Шумо метавонед ин codeро ба cs50 IDE ворид кунед ва бо он бозӣ кунед. Биёед бубинем, ки чӣ тавр asciimath барои калидҳои гуногун кор мекунад. Биёед арзиши 25-ро гирем, мо расми зеринро мебинем: Ва акнун калид 26 бошад: Мо [ гирифтем, на ҳарфи А.Ин танҳо аломати ASCII пас аз Z аст. кор. Мо бояд формулаи рамзгузориро истифода барем, то баробари тамом шудани ҳарфҳо ба аввали алифбо баргардем. Дар хотир доред, ки мо аллакай дар боло навишта будем: /* * 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);Harvard CS50: Супоришҳои ҳафтаи 2 (Лекцияҳои 5 ва 6) - 8Harvard CS50: Супоришҳои ҳафтаи 2 (Лекцияҳои 5 ва 6) - 9ci = (pi + k) % 26 Дар куҷо ci ҳарфи рақами i дар матни рамзӣ аст, 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 Ҳарфи А маҳз ҳамин гуна нишондиҳанда дорад. Ҳамин тариқ, ин формула ба индекси алифбои ҳарфҳо дахл дорад, на арзишҳои ASCII. Барои чоп кардани аломати рамзгузорӣ ба шумо арзиши ASCII лозим мешавад. Ва бифаҳмед, ки чӣ тавр байни арзиши ASCII ва рақам дар алифбо гузаред. Вақте ки мо формулаи як аломатро муайян кардем, мо бояд онро ба ҳар як ҳарфи сатри аз клавиатура воридшуда татбиқ кунем. Аммо танҳо агар ин ҳарфҳо бошанд! Ва дар хотир доред, ки ҳарфҳои калон ва хурд маънои гуногунро талаб мекунанд. Дар ин ҷо функсияҳои боло ва поёнтар ба кор меоянд. Шумо метавонед ду формула дошта бошед, яке барои ҳарфҳои калон, дигаре барои ҳарфҳои хурд, функсияҳо ба шумо дар интихоби кадоме аз онҳо кӯмак мекунанд. Чӣ тавр формуларо ба ҳар як аломати сатр истифода бурдан мумкин аст? Дар хотир доред, ки сатр танҳо як массиви аломатҳост. Функсияи strlen (дарозии сатр) ба шумо барои муайян кардани шумораи такрори давр кӯмак мекунад .Harvard CS50: Супоришҳои ҳафтаи 2 (Лекцияҳои 5 ва 6) - 10

Вазифаи 2. Parlez-vous français?

Назария
Рамзи Vigenère нисбат ба шифри қайсар то андозае бехатартар аст: он калимаро ҳамчун калид истифода мебарад ва шикастани дастӣ бо истифода аз таҳлor басомад ё танҳо қувваи бераҳмона душвор аст. Ҳар як ҳарфи калид адад тавлид мекунад ва дар натиҷа мо барои иваз кардани ҳарфҳо якчанд калид мегирем. Мисол: p = Meet me in the park at eleven am В качестве ключевого слова возьмем k = bacon Длина messages p = 25 В то время How длина k = 5 Поэтому его нужно повторять 5 раз. Harvard CS50: Супоришҳои ҳафтаи 2 (Лекцияҳои 5 ва 6) - 11 Агар шумораи ҳарфҳои паём ба калид тақсим нашавад, мо танҳо як қисми онро дар барномаи охирини калид истифода мебарем: Harvard CS50: Супоришҳои ҳафтаи 2 (Лекцияҳои 5 ва 6) - 12 Барои дарёфти арзиши офсет, мо мавқеи ҳар як ҳарфи калиди беконамонро истифода мебарем. дар алифбо (аз а то з). Мо мисли барномасозони ҳақиқӣ аз сифр ҳисоб мекунем. Ва ҳар ҳарф дар матни аслӣ бо рақами додашуда, ба мисли шифри қайсарӣ, дар сурати зарурат пас аз Z ба аввали алифбо бармегардад. Ҳамин тавр, M ба 1 ҳаракат мекунад, е якум ҳеҷ гоҳ ҳаракат намекунад ва дуюм ба 2 мавқеъ ҳаракат мекунад. Дар зер шумо паёми аслӣ, калиди хаттӣ ва натиҷаи татбиқи онро мебинед. Harvard CS50: Супоришҳои ҳафтаи 2 (Лекцияҳои 5 ва 6) - 13 Рамзи Vigenère, албатта, қавитар аст, аммо агар шумо дарозии калидро донед, шикастани он хеле осон аст. Чӣ тавр онро муайян кардан мумкин аст? Агар матни аслӣ ба қадри кофӣ дароз бошад, ки баъзе калимаҳо дар он якчанд маротиба пайдо шаванд, пас шумо якчанд такрорҳоро хоҳед дид: Шумо Harvard CS50: Супоришҳои ҳафтаи 2 (Лекцияҳои 5 ва 6) - 14 инчунин метавонед қувваи бераҳмона истифода баред, аммо имконоти зиёде мавҷуданд: 26^n – 1, ки дар он n дарозии калиди номаълум аст. . Аммо одатан ин бисёр аст. Дуруст аст, ки ин барои компютер мушкил нест. Ва ҳоло математикаи рамз: Бигзор p баъзе матн бошад, k калимаи калидӣ бошад, kj ҳарфи j-уми калид бошад, pi рақами ҳарфи i дар матни аслӣ, ci ҳарфи рақами i дар рамзгузорӣ бошад . Сипас: ci = (pi + kj) % 26
Машқ кунед
Шарт Барномаи vigenere.c нависед, ки паёмро бо истифода аз рамзгузории Vigenere рамзгузорӣ мекунад. Мо як далели сатри фармонро ба вуруди барнома пешниҳод мекунем: калимаи калидии k, ки аз ҳарфҳои алифбои англисӣ иборат аст. Агар замима бо зиёда аз як аргумент ё бо аргументи ба алифбо дохилнашуда оғоз карда шавад, нишон додани маълумоти хато ва қатъ кардани барнома зарур аст. Яъне, асосӣ 1-ро бармегардонад - дар ин ҳолат, санҷишҳои автоматии мо мефаҳманд, ки дар ин ҷо ҳама чиз хуб аст ва ин ҳолат ба инобат гирифта мешавад. Агар ҳамааш хуб бошад, барнома бояд ба дархости сатри матнии p идома диҳад, ки мо онро бо калиди k дар боло гирифташуда рамзгузорӣ мекунем, натиҷаро чоп мекунем ва барномаро анҷом дода, арзиши 0-ро бармегардонем. Тавзеҳот Боварӣ ҳосил кардан лозим аст, ки дар калид k аломатҳои A ва a ҳамчун 0, B ва b ҳамчун 1, ..., Z ва z ҳамчун 25 таъин карда мешаванд. Барнома бояд рамзи Vigenère-ро танҳо ба ҳарфҳои матни p истифода барад. Ҳарфҳои боқимонда (рақамҳо, аломатҳои пунктуатсия, фосила) бояд бидуни тағир дода шаванд. Агар алгоритм аломати j-уми k-ро ба аломати 1-уми p , ки дар алифбо нест, татбиқ карданӣ бошад, он аломати j-умро ба аломати алифбои навбатии матн татбиқ кунед; шумо наметавонед онро тарк кунед ва ба аломати дигар дар к гузаред. Дар ниҳоят, барнома бояд ҳолати ҳар як ҳарфро дар p нигоҳ дорад .
Намедонед, ки аз куҷо сар кунед?
Harvard CS50: Супоришҳои ҳафтаи 2 (Лекцияҳои 5 ва 6) - 15
Инҳоянд чанд маслиҳат аз Замиля, ёвари курси CS50
Хушбахтона, барнома ба шифри қайсар хеле монанд аст, танҳо калид сатр аст, на адади бутун. Агар шумо рамзи номи ҳокими Румро бомуваффақият татбиқ карда бошед, он метавонад барои вазифаи дуюм оғози олӣ бошад. Эҳтимол шумо аллакай дарк кардаед, ки шифри Vigenère бо як ҳарф ҳамчун калид якхела бо рамзи қайсар аст. Алгоритми Vigenère ҳамон қадамҳоеро истифода мебарад, ки Сезар аст:
  1. Калидро гиред
    • codeword далели дуюми сатри фармон аст argv[1]
    • бояд дар алифбо бошад: функсияи isalpha
  2. Матн гиред
  3. Рамзгузорӣ
  4. Матни шифрро чоп кунед
Пас, биёед аргументи дуюми сатри фармони argv [1]-ро тафтиш кунем, то бубинем, ки он ба аломатҳои алифбо тааллуқ дорад. Мо ин корро бо истифода аз isalpha аллакай шинос мекунем . Агар калид дуруст бошад, мо аз корбар сатр мегирем ва рамзкунониро оғоз мекунем. Формулаи рамзгузории Vigenère ба формулаи шифри қайсар монанд аст. Чӣ тавр шумо ҳарфро ба офсети рамзгузории мувофиқ табдил медиҳед? Кӯшиш кунед, ки арзишҳоро бо истифода аз ҷадвали ASCII муқоиса кунед. Harvard CS50: Супоришҳои ҳафтаи 2 (Лекцияҳои 5 ва 6) - 16 Эҳтимол, шумо метавонед бо истифода аз пайдарпайии ҷадвал намунаи байни ҳарфҳо ва нишондиҳандаҳои алифбои онҳоро пайдо кунед. Оё шумо фаҳмидед, ки чӣ тавр як ҳарфро аз ҳарфи дигар тарҳ кунед, то натиҷаи дилхоҳ ба даст оред? Ҷубронҳо барои ҳарфҳои калон ва хурд якхелаанд, бинобар ин шумо бояд ду формулаи шабеҳро муайян кунед, то ҷубронро барои ҳарфҳои хурд ва алоҳида барои ҳарфҳои калон муайян кунед. Инчунин дар хотир доред, ки ҳалқаи матн бояд аломатҳои забони англисиро сарфи назар кунад. Ва фаромӯш накунед, ки парвандаи ҳарфро нигоҳ доред. Агар шумо ба формулаи рамз нигаред: ci = (pi + kj) % 26 шумо ду тағирёбандаи индексро хоҳед дид, i ва j. Яке мавқеъро дар матни манбаъ нигоҳ медорад, дигаре дар калид. Агар матни шумо аз калид дарозтар бошад, индекси калид аз охири калид ба аввал бармегардад. Чӣ тавр бояд кард? Истифодаи амалиёти тақсимоти модул! Натиҷаи амалиёт қисми боқимондаи тақсими ду адад мебошад. Манфиатҳои амалии ин амалиёт дар барномасозӣ хеле бузурганд! Тасаввур кунед, ки як гурӯҳи калони одамон бояд ба се зергурӯҳ тақсим карда шаванд. Яке аз роҳҳое, ки ин корро анҷом медиҳанд, ин аст, ки аз онҳо талаб кунед, ки барои якум, дуюм ва сеюм пардохт кунанд. Harvard CS50: Супоришҳои ҳафтаи 2 (Лекцияҳои 5 ва 6) - 17 Яъне шахси якум ба гурӯҳи якум, дуюм ба дуюм, сеюм ба сеюм, чорум боз ба якум ва ғайра тааллуқ дорад. Шумо метавонед тақсимоти модулҳоро барои иҷрои ҳамон амал истифода баред. Биёед, ҳамон се гурӯҳро аз сифр рақамгузорӣ кунем. Ин аст, ки чӣ тавр ин корро кардан мумкин аст: Harvard 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 , ки дар он браузери файли он ҷойгир аст (на дар равзанаи терминал), файли initials.c -и худро, ки дар директорияи pset2 ҷойгир аст , бо тугмаи рости муш клик кунед ва Зеркашӣ -ро пахш кунед . Шумо бояд бубинед, ки браузери initials.c бор кардааст .
  3. Барои caesar.c такрор кунед .
  4. Барои vigenere.c такрор кунед .
  5. Дар равзанаи алоҳида ё ҷадвали алоҳида ба CS50 Submit ворид шавед
  6. Тасвири Ирсолро дар кунҷи чапи болоии экран клик кунед .Harvard CS50: Супоришҳои ҳафтаи 2 (Лекцияҳои 5 ва 6) - 19
  7. Дар рӯйхати ҷузвдонҳо дар тарафи чап, директорияи Problem Set 2- ро клик кунед ва сипас тугмаи Боркунии пешниҳоди навро клик кунед . Он дар тарафи рост аст. Harvard CS50: Супоришҳои ҳафтаи 2 (Лекцияҳои 5 ва 6) - 20
  8. Дар экране, ки пайдо мешавад, тугмаи Иловаи файлҳо ... -ро клик кунед. Равзанаи интихоби файлҳо аз компютери шумо кушода мешавад. Harvard CS50: Супоришҳои ҳафтаи 2 (Лекцияҳои 5 ва 6) - 21
  9. Ба ҷузвдоне, ки ҳарфҳои ибтидоиро нигоҳ медоред.c гузаред . Он эҳтимолан дар папкаи Боргириҳои шумо ё ҳар ҷое, ки браузери шумо файлҳоро бо нобаёнӣ ҷойгир мекунад, ҷойгир аст. Вақте ки шумо ибтидо ҳарфҳои.c -ро пайдо мекунед , онро як маротиба клик кунед ва онро интихоб кунед ва Кушоданро пахш кунед.
  10. Боз пахш кунед Иловаи файлҳо .
  11. caesar.c-ро ёбед ва онро кушоед.
  12. Барои файли vigenere.c низ ҳамин тавр кунед .
  13. Зеркаширо оғоз кунед. Файлҳои шумо ба serverҳои CS50 бор карда мешаванд .
  14. Дар экране, ки пайдо мешавад, шумо бояд равзанаи "Не файли интихобшуда" -ро бинед . Агар шумо курсори мушро ба чап ҳаракат кунед, шумо рӯйхати файлҳои зеркашидашударо хоҳед дид. Барои тасдиқ, ҳар яки онҳоро клик кунед. Агар шумо дар бораи чизе боварӣ надошта бошед, шумо метавонед файлҳоро бо такрори ҳамон қадамҳо дубора бор кунед. Шумо метавонед ин корро то охири соли 2016 ҳар қадар, ки мехоҳед иҷро кунед.
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION