JavaRush /Java блогы /Random-KK /Гарвард 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

Дайындық

update50 Жұмыс кеңістігіңіздің нұсқасы жаңартылғанына көз жеткізу үшін cs50.io сайтына кіріңіз . Терминал терезесін байқаусызда жапсаңыз, Көрініс мәзіріне өтіп, Консоль элементінің жанында құсбелгі бар екеніне көз жеткізіңіз (егер ол жоқ болса, оны тексеріңіз). Гарвард CS50: 2-апта тапсырмалары (5 және 6-дәрістер) - 1 Терминал терезесінің жақтауындағы жасыл шеңбердің ішінен (+) басыңыз, Жаңа терминалды таңдаңыз . Гарвард CS50: 2-апта тапсырмалары (5 және 6-дәрістер) - 2 Жұмыс каталогын жасаңыз: mkdir және ~/workspace/pset2mkdir ~/workspace/pset2 арасында бос орын бар екенін ескеріңіз . Қорытындылай келе, ~ түбірлік каталогты білдіреді, ~/workspace - түбірлік каталог ішіндегі жұмыс кеңістігі деп аталатын қалта, ~/workspace/pset2 - ~/workspace ішіндегі pset2 деп аталатын каталог . Енді іске қосыңыз: жаңа каталогқа өзгерту үшін. Пәрмен жолы келесідей көрінеді: Егер бірдеңе дұрыс болмаса, қадамдарды қайталаңыз. Сондай-ақ , соңғы бірнеше пәрмендерді хронологиялық ретпен қарау үшін пәрменді шақыруға болады . Сондай-ақ, курсорды пәрмен жолына қойып, барлық пәрмендерді соңғы енгізілгеннен біріншісіне дейінгі ретпен қарау үшін пернетақтадағы жоғары көрсеткіні басыңыз. Төмен түймені пайдалану арқылы кері оралуға болады. Айтпақшы, әр уақытта бірдей пәрмендерді терудің орнына, бұрын терілген пәрмендерді айналдырып, Enter пернесін басу арқылы оларды қайтадан орындауға болады. Сіз Дэвидтің өз дәрістерінде дәл осылай жасайтынын байқаған боларсыз. Екінші аптаның тапсырмаларын pset2 ішінде сақтау керек . cd ~/workspace/pset2username:~/workspace/pset2 $history

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

Жолдарды толығырақ қарастырайық. Initials.c файлында пайдаланушының атын сұрайтын бағдарламаны жазыңыз (GetString функциясын пайдаланып, біз атауды жол ретінде аламыз), содан кейін есімнің (немесе атаулардың) бірінші әріптерін және фамorяны бос орынсыз бас әріппен көрсетеді, нүктелер немесе басқа таңбалар, тек жол арнасымен ( \n ). Пайдаланушылар тек әріптерді (кіші немесе бас әріптерді немесе екеуін де) және сөздер арасында бір бос орынды енгізеді деп есептейміз. Джозеф Гордон-Левитт, Конан О'Брайен немесе Дэвид Дж. Малан есімді жігіттер бағдарламаны пайдаланbyteынын ескеріңіз. Бағдарламаның дұрыс жұмысын тексеру үшін 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 болса, онда С әрпі F, ал Z C әрпіне айналады. Мысалдар: біз Цезарь шифрін пайдаланамыз. мысық сөзіндегі 5 кілт. c -> h a -> f t -> y Caesar (cat, 5) = hfy Кілт = 7, сөз = компьютер c->j o->v m->t p->w u->b t->a e->l r->y Caesar(computer,7) = jvtwbaly Гарвард CS50: 2-апта тапсырмалары (5 және 6-дәрістер) - 3 Цезарь шифры қарапайым, бірақ, өкінішке орай, сенімсіз (бұл бір-бірімен байланысты нәрселер!): Ағылшын алфавиті үшін шифрлаудың 25 нұсқасы бар, тіпті компьютерсіз де барлық опциялардан өту оңай. Дегенмен, Цезарь шифры Vigenère шифрі сияқты басқа шифрларда қадам ретінде жиі пайдаланылады (бұл туралы келесі абзацта). Цезарь шифрын «математикадан» алайық. Ашық мәтінді p әрпімен белгілейік, pi — мәтіндегі p әріпі, ол i нөмірлі орнында орналасқан. Құпия кілт әрпін k, c әрпін шифрлы мәтін, ал ci әрпін шифрленген мәтіннің i позициясында тұрған әріп деп атаймыз. Содан кейін шифрдың әрбір әрпін мына формула арқылы есептеуге болады: ci = (pi + k) % 26 Бұл формализацияға үйреніңіз, ол алгоритмді бағдарламалауға мүмкіндік береді және шифрдың мағынасын дәл және қысқаша білдіреді. Егер k = 13 пернесі және p түпнұсқа мәтіні «Овалтинді міндетті түрде ішіңіз!» болса, бұл біз алатын шифр: Or fher gb qevax lbhe Binygvar! O (шифрлық мәтіндегі бірінші әріп) В әрпінен 13 позицияға жылжығанын ескеріңіз. түпнұсқа мәтіндегі бірінші әріп). r әрпімен бірдей нәрсе (шифрлаудағы екінші әріп) e-ден (түпнұсқадағы екінші әріп) 13 әріпке ауыстырылады. Шифрлаудағы үшінші әріп f, s-дан 13 әріпке (түпнұсқадағы үшінші) ығысқан, мұнда біз z-ден a-ға дейін шеңбер бойымен жүреміз. 13 кілті бар Цезарь шифрінде ROT13 арнайы атауы бар . Бұл симметриялы: оны екі рет қолданып, біз бастапқы мәтінге ораламыз. Әрине, ROT26 да бар, бұл әдетте өте қауіпсіз, бірақ егер сіз өз ойыңызды анық жеткізбесеңіз ғана =).
Шарт
Caesar.c файлына Цезарь шифры арқылы мәтінді шифрлайтын бағдарламаны жазыңыз. Бағдарламаға кіріс ретінде бір пәрмен жолы аргументін беріңіз: теріс емес бүтін сан. Қарапайымдылық үшін оны k деп атаймыз. Егер пайдаланушы бағдарламаны пәрмен жолы аргументтерісіз немесе бірнеше аргументпен орындаса, қолданба шағымдануы және 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 мәнін қабылдауы керек болғандықтан, біздің негізгі функция тақырыбы келесідей көрінеді: 6-тараудан argv жолдар массиві екенін int main(int argc, string argv[]) білесіз . Массивті спорт залындағы шкафтар қатары ретінде қарастыруға болады. Олардың әрқайсысында жасырылған мағына бар. Біздің жағдайда, әрбір ұяшықтың ішінде бірінші құлыпты ашу үшін argv[0], екіншісі - argv[1] және т.б. сияқты аргумент бар . Егер бізде n құлып болса, онда argv[n - 1] нүктесінде тоқтауымыз керек, өйткені argv[n] енді жоқ (немесе бар, бірақ басқа біреуге тиесілі, біз оны ұстамағанымыз жөн). Осылайша сіз k аргументіне келесідей қол жеткізе аласыз: stringstring k = argv[1]; Біз шынымен бір нәрсе бар деп сенеміз! argc - argv ішіндегі жолдар санына тең int айнымалысы екенін еске түсірейік. Бұл ұяшықты ашпас бұрын argc мәнін тексерген дұрыс, себебі ол жоқ болып шығуы мүмкін. Ең дұрысы argc = 2. Неліктен бұлай? 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 кітапханасына енгіздік . Дегенмен, отандық кітапханаларға сенген дұрыс. Осылайша сіз k файлын int ретінде сақтадыңыз. Енді мәтін енгізуді сұрайық. Бірінші аптаның тапсырмаларын орындаған болсаңыз, GetString деп аталатын CS50 кітапхана функциясымен бұрыннан таныссыз. Ол бізге көмектеседі. k және бастапқы мәтінді алғаннан кейін шифрлауды бастайық. Қорытындылау үшін жолдың барлық таңбаларын қайталауға және оларды келесі цикл арқылы басып шығаруға болады: for (int i = 0, n = strlen(p); i < n; i++) { printf("%c", p[i]); } Басқаша айтқанда, argv жолдар массиві сияқты, жол да таңбалар жиымы болып табылады. Сондықтан, argv ішіндегі жеке жолдарды алу сияқты жеке жол элементтеріне қол жеткізу үшін шаршы жақшаларды пайдалана аламыз. Әрине, әрбір таңбаны басып шығаруда криптографиялық ештеңе жоқ. Немесе техникалық тұрғыдан, k = 0 болған кезде. Бірақ біз Цезарьге оның мәтінін шифрлауға көмектесуіміз керек! Сәлем, Цезарь! strlen пайдалану үшін басқа кітапхананы қосу керек . Кейбір тексеру сынақтарын автоматтандыратындықтан, бағдарлама дәл осылай әрекет етуі керек: atoiusername:~/workspace/pset2 $ ./caesar 13 Be sure to drink your Ovaltine! Or fher gb qevax lbhe Binygvar! -дан басқа , ctype.h және stdlib.h кітапханаларында басқа тамаша функцияларды таба аласыз . Ол үшін сілтеме бойынша өтіп , сол жерді аздап ақтарыңыз. Мысалы, isdigit - бұл қызықты нәрсе =). Z-ден A-ға (немесе z-ден a-ға) өткенде, % модуль операторы туралы ұмытпаңыз.Си тілінде.Сонымен қатар кестені зерттеңіз , ол тек әріптер үшін ғана емес, 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 - жолдар массиві, оған енгізілген аргументтері бар тізім Массив - әртүрлі ұяшықтардағы бір типті әртүрлі деректерден тұратын деректер құрылымы. Гарвард CS50: 2-апта тапсырмалары (5 және 6-дәрістер) - 4 Мысалы, пайдаланушы 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 шын мәнін қайтарса, біз бұл таңбаны пернені пайдаланып өзгертуіміз керек. Мысал ретінде CS50 көмекшісі Замorдің бағдарламасын қарастырып, талдап көрейік. Сіз «А» анық әріп болса, неге бүтін сан деп сұрайтын шығарсыз. Символдар мен бүтін сандар бір-бірін алмастырады екен. А әрпін жалғыз тырнақшаға қою арқылы оның 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);Гарвард CS50: 2-апта тапсырмалары (5 және 6-дәрістер) - 8Гарвард 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 мәні мен әліпбидегі сан арасында қалай ауысуға болатынын анықтаңыз. Бір таңбаның формуласын анықтағаннан кейін оны пернетақтадан енгізілген жолдағы әрбір әріпке қолдануымыз керек. Бірақ бұл әріптер болса ғана! Есіңізде болсын, бас әріптер мен кіші әріптер әртүрлі мағыналарды қажет етеді. Бұл жерде isupper және islower функциялары ыңғайлы болады. Сізде екі формула болуы мүмкін, біреуі бас әріптерге, екіншісі кіші әріптерге арналған, функциялар қайсысын қолдану керектігін таңдауға көмектеседі. Жолдағы әрбір таңбаға формуланы қалай қолдануға болады? Жол тек таңбалар массиві екенін есте сақтаңыз. strlen функциясы (жол ұзындығы) циклдегі қайталанулар санын анықтауға көмектеседі .Гарвард CS50: 2-апта тапсырмалары (5 және 6 дәрістер) - 10

2-тапсырма. Parlez-vous français?

Теория
Vigenère шифрі Цезарь шифріне қарағанда біршама қауіпсіз: ол кілт ретінде сөзді пайдаланады және жиілікті талдау немесе тек қана қатыгез күш көмегімен қолмен бұзу қиын. Кілттің әрбір әрпі санды тудырады, нәтижесінде біз әріптерді ауыстыру үшін бірнеше кілт аламыз. Мысал: p = Meet me in the park at eleven am В качестве ключевого слова возьмем k = bacon Длина messages p = 25 В то время How длина k = 5 Поэтому его нужно повторять 5 раз. Гарвард CS50: 2-апта тапсырмалары (5 және 6 дәрістер) - 11 Хабарламадағы әріптер саны кілтке бөлінбесе, кілттің соңғы қолданбасында оның бір бөлігін ғана пайдаланамыз: Гарвард CS50: 2-апта тапсырмалары (5 және 6 дәрістер) - 12 Офсеттің мәнін табу үшін біз бекон кілтіміздің әрбір әріпінің орнын пайдаланамыз. алфавитте (а-дан z-ге дейін). Біз нағыз бағдарламашылар сияқты нөлден бастап санаймыз. Ал түпнұсқа мәтіндегі әрбір әріп Цезарь шифріндегідей берілген санға ауыстырылып, қажет болған жағдайда Z-дан кейін әліпбидің басына қайтарылады. Сонымен M 1-ге жылжиды, бірінші e мүлдем қозғалмайды, ал екіншісі 2 позицияға жылжиды. Төменде сіз хабарламаның түпнұсқасын, жазба кілтін және оны қолдану нәтижесін көресіз. Гарвард CS50: 2-апта тапсырмалары (5 және 6-дәрістер) - 13 Vigenère шифры, әрине, күштірек, бірақ егер сіз кілттің ұзындығын білсеңіз, оны бұзу өте оңай. Оны қалай анықтауға болады? Түпнұсқа мәтіннің ұзындығы жеткілікті болса, онда кейбір сөздер бірнеше рет пайда болады, онда сіз бірнеше қайталауларды көресіз: Сіз Гарвард CS50: 2-апта тапсырмалары (5 және 6-дәрістер) - 14 сондай-ақ дөрекі күш қолдануға болады, бірақ көптеген опциялар бар: 26^n – 1 мұндағы n – белгісіз кілттің ұзындығы . Бірақ әдетте бұл өте көп. Рас, бұл компьютер үшін проблема емес. Ал енді шифрдың математикасы: p - кейбір мәтін, k кілт сөз, kj кілттің j-ші әрпі, pi - бастапқы мәтіндегі i әрпі, ci - шифрлаудағы i әрпі болсын. . Содан кейін: ci = (pi + kj) % 26
Жаттығу
Шарт Vigenere шифрі арқылы хабарламаны шифрлайтын vigenere.c бағдарламасын жазыңыз. Бағдарлама енгізуіне бір пәрмен жолы аргументін береміз: ағылшын алфавитінің әріптерінен тұратын k кілт сөзі. Егер қолданба бірнеше аргументпен немесе алфавитке қосылмаған аргументпен іске қосылса, қате туралы ақпаратты көрсету және бағдарламаны тоқтату қажет. Яғни, негізгі 1 қайтарады - бұл жағдайда біздің автоматты сынақтар мұнда бәрі жақсы екенін түсінеді және бұл жағдай ескеріледі. Егер бәрі жақсы болса, бағдарлама p мәтіндік жолын сұрауды жалғастыру керек, оны біз жоғарыда алынған k кілтімен шифрлаймыз, нәтижені басып шығарамыз және 0 мәнін қайтаратын бағдарламаны аяқтаймыз. Түсіндіру Кілтте екеніне көз жеткізу керек. k A және a таңбалары 0, B және b 1, ..., Z және z 25 ретінде белгіленеді. Бағдарлама Vigenère шифрін тек p мәтінінің әріптеріне қолдануы керек. Қалған таңбалар (сандар, тыныс белгілері, бос орындар) өзгеріссіз шығарылуы керек. Егер алгоритм әліпбиде жоқ i-ші р символына j-ші таңбаны қолданатын болса , сол j-ші перне таңбасын мәтіндегі келесі алфавиттік таңбаға қолданыңыз; оны қалдырып, k-дағы басқа таңбаға өтуге болмайды. Соңында, бағдарлама p ішіндегі әрбір әріптің регистрін сақтауы керек .
Неден бастау керек екенін білмейсіз бе?
Гарвард CS50: 2-апта тапсырмалары (5 және 6 дәрістер) - 15
Мұнда CS50 курсының көмекшісі Замиляның кейбір кеңестері берілген
Бақытымызға орай, бағдарлама Цезарь шифріне өте ұқсас, тек кілт бүтін сан емес, жол болып табылады. Егер сіз римдік билеушінің атының шифрін сәтті енгізген болсаңыз, бұл екінші тапсырма үшін тамаша бастама болуы мүмкін. Сіз кілт ретінде бір әріптен тұратын Виженер шифры Цезарь шифрімен бірдей екенін түсінген шығарсыз. Vigenère алгоритмі Цезарь сияқты қадамдарды пайдаланады:
  1. Кілтті алыңыз
    • code сөзі – екінші пәрмен жолы аргументі argv[1]
    • алфавитте болуы керек: isalpha функциясы
  2. Мәтінді алу
  3. Шифрлау
  4. Шифрлық мәтінді басып шығару
Сонымен, алфавиттік таңбаларға жататынын білу үшін argv[1] екінші пәрмен жолы аргументін тексерейік. Біз мұны бұрыннан таныс isalpha көмегімен жасаймыз . Егер кілт дұрыс болса, біз пайдаланушыдан жолды аламыз және шифрлауды бастаймыз. Виженер шифрінің формуласы Цезарь шифрінің формуласына ұқсас. Әріпті сәйкес шифр офсетіне қалай түрлендіруге болады? ASCII кестесін пайдаланып мәндерді салыстырып көріңіз. Гарвард CS50: 2-аптадағы тапсырмалар (5 және 6-дәрістер) - 16 Сірә, сіз әріптер мен олардың алфавиттік индекстері арасындағы үлгіні кестедегі тізбектерді пайдалана отырып таба аласыз. Қалаған нәтижеге қол жеткізу үшін бір әріпті екіншісінен қалай шегеруге болатынын анықтадыңыз ба? Бас әріптер мен кіші әріптердің ығысулары бірдей, сондықтан кіші әріптер үшін және бас әріптер үшін бөлек ығысуды анықтау үшін екі ұқсас формуланы анықтауға тура келеді. Сондай-ақ мәтіндік цикл ағылшын емес таңбаларды елемеуі керек екенін есте сақтаңыз. Әріптердің регистрін сақтауды ұмытпаңыз. Егер сіз шифр формуласын қарасаңыз: ci = (pi + kj) % 26 екі индекс айнымалысын көресіз, i және j. Біреуі бастапқы мәтіндегі орынды сақтайды, екіншісі кілтте. Егер мәтін кілттен ұзын болса, пернедегі индекс кілттің соңынан басына дейін қайтады. Бұны қалай істейді? Модульді бөлу операциясын қолдану! Операцияның нәтижесі екі санның бөліндісінің қалдығы болып табылады. Бағдарламалаудағы бұл операцияның практикалық пайдасы өте зор! Адамдардың үлкен тобын үш кіші топқа бөлу керек деп елестетіңіз. Мұны істеудің бір жолы - бірінші, екінші, үшінші үшін төлеуді сұрау. Гарвард CS50: 2-апта тапсырмалары (5 және 6-дәрістер) - 17 Яғни, бірінші тұлға бірінші топқа, екінші екінші адамға, үшінші үшінші адамға, төртінші қайтадан біріншіге т.б. Бірдей әрекетті орындау үшін модульді бөлуді пайдалануға болады. Бірдей үш топты нөлден бастап нөмірлейміз. Мұны істеу жолы: Гарвард 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. Экранның жоғарғы сол жақ бұрышындағы Жіберу белгішесін басыңыз .Гарвард CS50: 2-аптадағы тапсырмалар (5 және 6-дәрістер) - 19
  7. Сол жақтағы қалталар тізімінде Проблемалар жинағы 2 каталогын нұқыңыз, содан кейін Жаңа жіберуді жүктеп салу түймесін басыңыз . Ол оң жақта. Гарвард CS50: 2-апта тапсырмалары (5 және 6-дәрістер) - 20
  8. Пайда болған экранда Файлдарды қосу ... түймесін басыңыз. Компьютерден файлдарды таңдауға арналған терезе ашылады. Гарвард 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