JavaRush /Java блогу /Random-KY /Harvard CS50: 2-жума тапшырмалары (5 жана 6-лекциялар)
Masha
Деңгээл

Harvard 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

Даярдоо

update50 Жумуш аймагыңыздын versionсы жаңыртылганын текшерүү үчүн cs50.io сайтына кириңиз . Эгер сиз кокустан терминалдын терезесин жапсаңыз, Көрүү менюсуна өтүп, Консол пунктунун жанында белги бар экенин текшериңиз (эгер андай эмес болсо, аны текшериңиз). Harvard CS50: 2-жума тапшырмалары (5 жана 6-лекциялар) - 1 Терминал терезесинин алкагындагы жашыл тегеректин ичинде (+) чыкылдатып, Жаңы терминалды тандаңыз . Harvard CS50: 2-жума тапшырмалары (5 жана 6-лекциялар) - 2 Жумушчу каталогду түзүңүз: mkdir менен ~/workspace/pset2mkdir ~/workspace/pset2 ортосунда боштук бар экенине көңүл буруңуз . Кыскача айтканда, ~ тамыр каталогун билдирет, ~/workspace - бул өзөк каталогунун ичиндеги жумушчу мейкиндиги деп аталган папка, ~/workspace/pset2 - ~/workspace ичиндеги pset2 деп аталган каталог . Эми иштетүү: жаңы каталогго өзгөртүү үчүн. Буйрук сабы төмөнкүдөй көрүнөт: Эгер бир нерсе туура эмес болсо, кадамдарды кайталаңыз. Сиз ошондой эле акыркы бир нече буйруктарды хронологиялык тартипте көрүү үчүн буйрукту чакырсаңыз болот . Ошондой эле курсорду буйрук сабына коюп, клавиатураңыздагы өйдө жебени басып, бардык буйруктарды акыркы киргенден биринчиге чейин иретте көрсөңүз болот. Төмөн баскычын колдонуу менен артка кайтууга болот. Баса, бир эле буйруктарды ар дайым терүүнүн ордуна, сиз терген буйруктарыңызды жылдырып, Enter баскычын басып кайра аткарсаңыз болот. Сиз Дөөттүн лекцияларында дал ушундай кылганын байкаган чыгарсыз. Экинчи жуманын тапшырмалары pset2 сакталышы керек . cd ~/workspace/pset2username:~/workspace/pset2 $history

Тапшырма 0. Инициализация

Келгиле, сызыктарды жакшыраак карап көрөлү. Баш тамгалар.c файлында колдонуучунун атын сураган программаны жазыңыз (GetString функциясын колдонуп, биз сап катары атын алабыз) жана андан кийин аты (же аттардын) жана фамorясынын биринчи тамгаларын боштуксуз чоң тамга менен көрсөтөт, чекиттер же башка символдор, сап түрмөгү менен гана ( \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
Криптография
Криптография, маалыматты шифрлөө жана чечмелөө orми... Чындыгында, шифрленген билдирүүлөр байыркы доорлордон бери бар жана аскерлер тарабынан жашыруун кабарларды берүү үчүн колдонулган. Эми Facebook жана башка тармактардагы сырсөздөрүңүз шифрленген түрдө сакталат.

Тапшырма 1. Салам, Цезарь!

Теориялык маалымат
Биз эң жөнөкөй шифрлердин бирин – Рим императорунун атын алып жүргөн Цезарь шифрин изилдейбиз. Бул шифрде тексттин ар бир тамгасы экинчиси менен алмаштырылат, бул алфавитте төмөнкү тамгалардын белгиленген саны. Бул тамгалардын белгиленген саны ачкыч деп аталат . Ошентип, 1 баскычы латын C тамгасын D тамгасына, ал эми Z цикл аркылуу А тамгасына айлантат. Эгер ачкыч 3 болсо, анда С тамгасы F, Z тамгасы С тамгасына айланат. Мисалдар: биз Цезарь шифрин колдонобуз. мышык сөзүндөгү 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 шифри сыяктуу башка шифрлерде кадам катары колдонулат (бул тууралуу кийинки абзацта). Цезарь шифрин «математикалаштырып» көрөлү. Ачык текстти р тамгасы менен белгилейли, pi – тексттеги p тамгасы, ал i номериндеги позицияда турат. Жашыруун ачкыч тамгасын k, c тамгасын шифрленген текст, ci тамгасын i позициясында турган шифрленген текст деп атайлы. Андан кийин сиз формуланын жардамы менен шифрдин ар бир тамгасын эсептей аласыз: ci = (pi + k) % 26 Бул формалдаштырууга көнүңүз, ал алгоритмди программалоого мүмкүндүк берет жана шифрдин маанисин так жана кыска көрсөтөт. Эгерде ачкыч k = 13 жана түпнуска текст p "Ovaltine ичип туруңуз!" болсо, бул биз алган шифр: Or fher gb qevax lbhe Binygvar! О (шифрленген тексттин биринчи тамгасы) Б тамгасынан 13 позицияга жылганына көңүл буруңуз. баштапкы тексттин биринчи тамгасы). Ошол эле нерсе r тамгасы (шифрлөөдөгү экинчи тамга) e тамгасынан 13 тамгага жылдырылат (оригиналдагы экинчи тамга). Шифрлөөнүн үчүнчү тамгасы f, s тамгасынан 13 тамгага жылдырылды (оригиналда үчүнчү), бул жерде биз zден ага чейин тегерек боюнча баратабыз. 13 ачкычы бар Цезарь шифринин ROT13 өзгөчө аталышы бар . Бул симметриялуу: эки жолу колдонуу менен, биз баштапкы текстке кайтып келет. Албетте, ROT26 дагы бар, бул жалпысынан супер-коопсуз, бирок сиз өз оюңузду так билдирбесеңиз гана =).
Шарт
Caesar.c файлына Цезарь шифринин жардамы менен текстти шифрлөөчү программаны жазыңыз. Программага киргизүү катары бир буйрук сабынын аргументин бериңиз: терс эмес бүтүн сан. Жөнөкөйлүк үчүн аны к деп атайлы. Эгерде колдонуучу программаны буйрук сабынын аргументтери жок же бирден ашык аргумент менен аткарса, тиркеме арызданып, 1 маанисин кайтарышы керек (каталар адатта ушундай белгиленет): return 1; Калган бардык учурларда, программа колдонуучуга текстти сунуштайт. шифрлөө үчүн, андан кийин k баскычы менен шифрленген текстти көрсөтөт (б.а., цикл боюнча оңго к позициясы жылдырылган). Эгерде текстте англис алфавитинен тышкаркы символдор болсо, программа аларды өзгөртпөйт. Шифрленген текстти басып чыгаргандан кийин, тиркеме чыгат, main 0 кайтарат: return 0; Эгерде main ачык нөлдү кайтарбаса, аны автоматтык түрдө кайтарат (int - бул негизгинин кайтаруу түрү, бирок башка жолу). Конвенцияга ылайык (программалоодогу жакшы форманын эрежелери), катаны көрсөтүү үчүн 1ди ачык кайтарсаңыз, анда программанын ийгorктүү аякташынын көрсөткүчү катары 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] мындан ары жок (же бар, бирок башка бирөөгө таандык, биз ага тийгенибиз жакшы). Ошентип, сиз к аргументине төмөнкүдөй кире аласыз: string k = argv[1]; Биз чындап эле ал жерде бир нерсе бар деп ишенебиз! Эске салсак, argc argv ичиндеги саптардын санына барабар int өзгөрмө. Бул уячаны ачууга аракет кылуудан мурун argc маанисин текшерген жакшы дегенди билдирет, анткени ал жок болуп чыгышы мүмкүн. Идеалдуу argc = 2. Эмне үчүн мындай? Inside argv[0] адатта программанын аталышы. Башкача айтканда, argc ар дайым 1ден кем эмес. Бирок биздин программа колдонуучуга буйрук сабынын аргументин камсыз кылышы керек k, демек, argc = 2. Албетте, эгерде колдонуучу буйрук сабына бирден ашык аргумент киргизсе, argc да өсөт жана мүмкүн 2ден чоңураак болсо, колдонуучу сапка бүтүн санды киргизсе, бул киргизилген маани автоматтык түрдө int катары сакталат дегенди билдирбейт. Тагыраак айтканда, ЖОК. Бул так int сыяктуу көрүнсө да, сап болот! Ошентип, биз сапты өзүбүзгө intке айландырышыбыз керек. Бактыга жараша, бул максат үчүн иштелип чыккан atoi деген функция бар. Анын синтаксиси: int k = atoi(argv[1]); k int тибинде экенин эске алыңыз, андыктан аны менен арифметика жасай аласыз. Бул функция менен колдонуучу бүтүн санды киргизеби же, айталы, foo деп кабатырланбайсыз: мындай учурда, atoi 0 кайтарат. atoi функциясы stdlib.h китепканасында жарыяланган , андыктан # аны программанын башында киргизиңиз. Код ансыз да түзүлөт, анткени биз бул функцияны cs50.h китепканасына киргизгенбиз . Бирок, жергorктүү китепканаларга ишенген жакшы. Ошентип, сиз k int катары сакталган. Эми текст киргизүүнү сураналы. Эгерде сиз биринчи жуманын тапшырмаларын аткарган болсоңуз, сиз GetString деп аталган CS50 китепкана функциясы менен таанышсыз. Ал бизге жардам берет. Сиз k жана баштапкы текстти алгандан кийин, шифрлөөнү баштайлы. Кыскача айтканда, сиз саптын бардык символдорун кайталап, аларды төмөнкү циклдин жардамы менен басып чыгарсаңыз болот: for (int i = 0, n = strlen(p); i < n; i++) { printf("%c", p[i]); } Башка сөз менен айтканда, argv саптардын массиви сыяктуу эле, string да символдордун массиви. Ошондуктан, 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дан Ага (же zден ага) бара жатканда % модулунун операторун унутпаңыз.C тorнде.Ошондой эле tableны изилдеңиз , анда тамгалар үчүн гана эмес, ASCII символдору да көрсөтүлөт. Программанын check50 менен туура иштеп жатканын текшерүү үчүн төмөнкүнү аткарыңыз: check50 2015.fall.pset2.caesar caesar.c Жана эгер сиз CS50 кызматкерлери тарабынан жасалган code менен ойногуңуз келсе, буйрукту иштетиңиз: ~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 саптардын массиви, ага аргументтер киргизилген тизме Массив – ар кандай уячаларда бир типтеги ар кандай маалыматтарды камтыган маалымат структурасы. 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 tableсын эстеп калууга убакыт келди! 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 чындыкты кайтарса, анда биз ачкычтын жардамы менен бул символду өзгөртүүбүз керек. Мисал катары CS50 жардамчысы Zamili программасын карап жана талдап көрөлү. Сиз эмне үчүн "A" бүтүн сан экенине таң калып жаткандырсыз. Символдор менен бүтүн сандар бири-бирин алмаштырат экен. А тамгасын бир тырмакчага коюу менен, анын ASCII codeун intтен ала аласыз. Сак болуңуз: сизге жалгыз тырмакча керек; аларсыз компилятор символду эмес, А аттуу өзгөрмөнү издейт. Андан кийин сапта биз тамганын ASCII codeуна ачкыч маанисин кошуп, аларды бүтүн өзгөрмөдө сактайбыз. Натыйжа int болсо да, printf оператору символдор үчүн %c толтургучун колдонот. Ошентип, программа бүтүн натыйжа менен байланышкан символду басып чыгарат. Экинчи учурда, биз санды %d толтургучту колдонуп көрсөтөбүз. Сиз бул codeду cs50 IDEге киргизип, аны менен ойной аласыз. Келгиле, asciimath ар кандай баскычтар үчүн кандай иштээрин текшерип көрөлү. Келгиле, 25 маанисин алалы, анда биз төмөнкү сүрөттү көрөбүз: Эми ачкыч 26 болсун: Бизде [, а такыр А тамгасы эмес. Бул 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);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 'Y' тамгасынын ASCII codeун = 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 шифри Цезарь шифрине караганда бир аз коопсузураак: ал сөздү ачкыч катары колдонот жана жыштык анализин же катаал күчтүн жардамы менен кол менен бузуу кыйын. Ачкычтын ар бир тамгасы санды жаратат, натыйжада биз тамгаларды алмаштыруу үчүн бир нече баскычтарды алабыз. Мисал: 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 тамгасынан кийин алфавиттин башына кайтарылат. Ошентип, М 1ге жылат, биринчи е такыр жылbyte, экинчиси 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 шифринин жардамы менен билдирүүнү шифрлеген vigenere.c программасын жазыңыз. Биз программанын киргизүүсүнө бир буйрук сабынын аргументин беребиз: англис алфавитинин тамгаларынан турган к ачкыч сөзү. Эгерде тиркеме бирден ашык аргумент менен же алфавитке кирбеген аргумент менен иштетилсе, анда ката тууралуу маалыматты көрсөтүү жана программаны токтотуу керек. Башкача айтканда, негизги 1 кайтарат - бул учурда биздин автоматтык тесттер бул жерде баары жакшы экенин түшүнөт жана бул шарт эске алынат. Эгерде баары жакшы болсо, анда программа p тексттик сабын суроону улантуу керек, аны биз жогоруда алынган k баскычы менен шифрлеп, натыйжаны басып чыгарып, 0 маанисин кайтарып, программаны аягына чыгарабыз . Тактоо k A жана a символдору 0, B жана b 1, ..., Z жана z 25 катары белгиленет. Программа Vigenère шифрин p текстинин тамгаларына гана колдонушу керек. Калган символдор (сандар, тыныш белгилери, боштуктар) өзгөрүүсүз чыгарылууга тийиш. Эгерде алгоритм алфавитте жок i-белги pке j -белгисин колдоно турган болсо , ошол j-башкы символду тексттеги кийинки алфавиттик символго колдонуңуз; аны жөн эле таштап, к-да башка каарманга өтө албайсың. Акыр-аягы, программа р ар бир тамганын абалын сактап калууга тийиш .
Эмнеден баштоону билбей жатасызбы?
Harvard CS50: 2-жума тапшырмалары (5 жана 6-лекциялар) - 15
Бул жерде CS50 курсунун жардамчысы Замилянын кээ бир кеңештери
Бактыга жараша, программа Цезарь шифрине абдан окшош, бир гана ачкыч бүтүн сан эмес, сап болуп саналат. Эгер сиз Рим башкаруучусунун ысымынын шифрин ийгorктүү ишке ашырган болсоңуз, бул экинчи тапшырма үчүн эң сонун башталыш болушу мүмкүн. Сиз ачкыч катары бир тамгадан турган Vigenère шифри Цезарь шифрине окшош экенин түшүнгөн чыгарсыз. Vigenère алгоритми Цезарь сыяктуу эле кадамдарды колдонот:
  1. Ачкычты ал
    • code сөзү argv[1] экинчи буйрук сабынын аргументи
    • алфавитте болушу керек: isalpha функциясы
  2. Текст алуу
  3. Шифрлөө
  4. Шифрленген текстти басып чыгаруу
Ошентип, алфавиттик символдорго таандык экенин билүү үчүн argv[1] экинчи буйрук сабынын аргументин текшерип көрөлү. Биз муну мурунтан эле тааныш isalpha аркылуу жасайбыз . Эгерде ачкыч туура болсо, биз колдонуучудан сапты алып, шифрлөөнү баштайбыз. Виженер шифринин формуласы Цезарь шифринин формуласына окшош. Тиешелүү шифрдин офсетине тамганы кантип айландырса болот? ASCII tableсын колдонуп маанилерди салыштырып көрүңүз. Harvard CS50: 2-жума тапшырмалары (5 жана 6-лекциялар) - 16 Кыязы, сиз tableдагы ырааттуулукту колдонуу менен тамгалардын жана алардын алфавиттик индекстеринин ортосундагы үлгүнү таба аласыз. Сиз каалаган натыйжаны алуу үчүн бир тамганы экинчи тамгадан кантип кемитүү керектигин түшүндүңүзбү? Баш жана кичине тамгалар үчүн офсеттер бирдей, ошондуктан кичине жана чоң тамгалар үчүн офсетти аныктоо үчүн эки окшош формуланы аныкташыңыз керек болот. Ошондой эле текст цикли англисче эмес белгилерди этибарга албашы керек экенин унутпаңыз. Жана каттын башын сактоону унутпаңыз. Эгер сиз шифрдин формуласын карасаңыз: ci = (pi + kj) % 26 сиз эки индекс өзгөрмөсүн көрөсүз, i жана j. Бири баштапкы тексттеги позицияны, экинчиси ачкычта сактайт. Эгер текстиңиз ачкычтан узун болсо, ачкычтагы индекс ачкычтын аягынан башына чейин барат. Муну кандай жасаш керек? Модулдук бөлүү операциясын колдонуу! Операциянын натыйжасы эки санды бөлүүдөн калган калдык. Программалоодо бул операциянын практикалык пайдасы абдан чоң! Элестеткиле, адамдардын чоң тобу үч топко бөлүнүшү керек. Мунун бир жолу - биринчи, экинчи, үчүнчү үчүн төлөөнү талап кылуу. Harvard CS50: 2-жума тапшырмалары (5 жана 6-лекциялар) - 17 Башкача айтканда, биринчи адам биринчи топко, экинчиси экинчиге, үчүнчүсү үчүнчүгө, төртүнчүсү кайрадан биринчиге ж.б.у.с. Ошол эле операцияны аткаруу үчүн модулдук бөлүүнү колдоно аласыз. Ошол эле үч топту нөлдөн баштап номерлейли. Муну кантип жасоо керек: Harvard CS50: 2-жума тапшырмалары (5 жана 6-лекциялар) - 18 Эгерде сиз индексти алып, аны модуль боюнча максималдуу мааниге бөлсөңүз, натыйжа эч качан ал мааниден чоң же барабар болбойт. Ачкыч сөздү башына кайтаруу үчүн бул принципти колдонуп көрүңүз! Топ боюнча иреттөөнүн ордуна сизге ачкыч сөздүн индекси керек, андыктан сиз ачкычтын узундугун ашпай туруп, туура тамганы алмаштыра аласыз. Биз сиздин codeуңуздун кээ бир сыноолорун автоматташтыргандыктан, программа төмөндө көрсөтүлгөндөй иштеши керек: 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 платформасында бааларды алгыңыз келсе, төмөндө сүрөттөлгөн proceduresаны аткарыңыз. Эсиңизде болсун, бул proceduresа тапшырмаларды текшерүү үчүн ошол эле cs50check колдонот. Бир гана айырмасы, ал жыйынтыктарды эстеп, жалпы баллды эсептейт.
  1. CS50 IDEге кириңиз
  2. CS50 IDE файлынын браузери жайгашкан жогорку сол бурчка жакын жерде (терминал терезесинде эмес), pset2 каталогунда жайгашкан initials.c файлыңызды оң баскыч менен чыкылдатып, Жүктөп алуу баскычын басыңыз . Сиз браузерде initials.c жүктөгөнүн көрүшүңүз керек .
  3. Caesar.c үчүн кайталаңыз .
  4. vigenere.c үчүн кайталаңыз .
  5. Өзүнчө терезеде же өтмөктө CS50 Submitке кириңиз
  6. Экрандын жогорку сол бурчундагы Тапшыруу сөлөкөтүн чыкылдатыңыз .Harvard CS50: 2-жума тапшырмалары (5 жана 6-лекциялар) - 19
  7. Сол жактагы папкалардын тизмесинен Көйгөйлөр топтому 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. Жүктөп баштоону басыңыз. Файлдарыңыз CS50 serverлерине жүктөлөт .
  14. Пайда болгон экранда Файл тандалган жок терезени көрүшүңүз керек . Чычкан курсоруңузду солго жылдырсаңыз, жүктөлүп алынган файлдардын тизмесин көрөсүз. Ырастоо үчүн, алардын ар бирине чыкылдатыңыз. Эгер бир нерсеге ишенбесеңиз, ошол эле кадамдарды кайталап файлдарды кайра жүктөсөңүз болот. Муну 2016-жылдын аягына чейин каалаганча кыла аласыз.
Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION