JavaRush /Blog Java /Random-PL /Harvard CS50: Zadania w tygodniu 2 (wykłady 5 i 6)
Masha
Poziom 41

Harvard CS50: Zadania w tygodniu 2 (wykłady 5 i 6)

Opublikowano w grupie Random-PL
Zadania cs50 do wykładów 5 i 6 Wykłady CS50 są tutaj: https://cdn.javarush.com/images/article/155cea79-acfd-4968-9361-ad585e939b82/original.pngcs50.html . Materiał ten zawiera 3 zadania, informacje teoretyczne na ich temat oraz przewodnik po działaniu.

Cele

• Wejdź głębiej w funkcje i biblioteki. • Zapoznaj się z kryptografią, zaimplementuj kilka prostych szyfrów

Dodatkowe materiały

https://reference.cs50.net/ - objaśnienie funkcji bibliotecznych wykorzystywanych podczas szkolenia. Po angielsku. http://computer.howstuffworks.com/c.htm strony 11 – 14 i 39

Przygotowanie

Zaloguj się do cs50.io, update50 aby upewnić się, że wersja obszaru roboczego jest aktualna. Jeśli przypadkowo zamkniesz okno terminala, przejdź do menu Widok i upewnij się, że obok pozycji Konsola znajduje się znacznik wyboru (sprawdź, jeśli tak nie jest). Harvard CS50: Zadania w tygodniu 2 (wykłady 5 i 6) – 1 Kliknij (+), w zielonym kółku w ramce okna terminala wybierz Nowy terminal . Harvard CS50: Zadania w tygodniu 2 (wykłady 5 i 6) – 2 Utwórz katalog roboczy: Zwróć uwagę, że pomiędzy mkdir i ~/workspace/pset2mkdir ~/workspace/pset2 znajduje się spacja . Podsumowując, ~ oznacza katalog główny, ~/workspace to folder o nazwie workspace wewnątrz katalogu głównego, ~/workspace/pset2 to katalog o nazwie pset2 wewnątrz ~/workspace . Teraz uruchom: aby przejść do nowego katalogu. Wiersz poleceń wygląda mniej więcej tak: Jeśli coś jest nie tak, powtórz kroki. Możesz także wywołać polecenie , aby wyświetlić kilka ostatnich poleceń w porządku chronologicznym. Możesz także umieścić kursor w wierszu poleceń i nacisnąć strzałkę w górę na klawiaturze, aby wyświetlić wszystkie polecenia w kolejności od ostatniego wprowadzonego do pierwszego. Za pomocą przycisku w dół możesz wrócić. Nawiasem mówiąc, zamiast wpisywać za każdym razem te same polecenia, możesz przewijać polecenia, które już wpisałeś i wykonywać je ponownie, naciskając Enter. Być może zauważyłeś, że David robi dokładnie to samo podczas swoich wykładów. Zadania z drugiego tygodnia należy zapisać w pset2 . cd ~/workspace/pset2username:~/workspace/pset2 $history

Zadanie 0. Inicjalizacja

Przyjrzyjmy się bliżej liniom. W pliku inicjały.c napisz program, który zażąda nazwy użytkownika (za pomocą funkcji GetString otrzymamy nazwę w postaci ciągu znaków), a następnie wyświetli pierwsze litery imienia (lub imion) i nazwiska wielkimi literami bez spacji, kropki lub inne znaki, tylko ze znakiem nowej linii ( \n ). Zakładamy, że użytkownicy wprowadzają tylko litery (małe, duże lub obie) plus jedną spację między wyrazami. Weź pod uwagę, że ludzie o nazwisku Joseph Gordon-Levitt, Conan O'Brien lub David J. Malan nie będą korzystać z programu. Aby sprawdzić poprawność działania programu zadzwoń na check50: Chcesz pobawić się realizacją programu przygotowanego przez obsługę CS50? Wpisz linię: username:~/workspace/pset2 $ ./initials Zamyla Chan ZC username:~/workspace/pset2 $ ./initials robert thomas bowden RTBcheck50 2015.fall.pset2.initials initials.c~cs50/pset2/initials
Kryptografia
Kryptografia, nauka o szyfrowaniu i deszyfrowaniu informacji... W rzeczywistości zaszyfrowane wiadomości istnieją od czasów starożytnych i były używane przez armie do przesyłania tajnych wiadomości. Cóż, teraz Twoje hasła na Facebooku i innych sieciach są przechowywane w formie zaszyfrowanej.

Zadanie 1. Witaj, Cezarze!

Informacje teoretyczne
Przeanalizujemy jeden z najprostszych szyfrów - szyfr Cezara, nazwany na cześć cesarza rzymskiego. W tym szyfrze każda litera tekstu jest zastępowana inną, czyli stałą liczbą liter znajdujących się niżej w alfabecie. Ta stała liczba liter nazywana jest kluczem . Zatem klucz 1 przekształca łacińską literę C w literę D, a Z poprzez cykl w A. Jeśli kluczem jest 3, wówczas litera C zamieni się w F, a Z w C. Przykłady: używamy szyfru Cezara z klawisz 5 na słowie kot. c -> h a -> f t -> y Caesar (cat, 5) = hfy Klucz = 7, słowo = komputer c->j o->v m->t p->w u->b t->a e->l r->y Caesar(computer,7) = jvtwbaly Harvard CS50: Zadania w tygodniu 2 (wykłady 5 i 6) – 3 Szyfr Cezara jest prosty, ale niestety zawodny (są to ze sobą powiązane rzeczy!): w przypadku alfabetu angielskiego istnieje tylko 25 opcji szyfrowania, łatwo jest przejść przez wszystkie opcje nawet bez komputera. Jednak szyfr Cezara jest często używany jako krok w innych szyfrach, takich jak szyfr Vigenère'a (więcej na ten temat w następnym akapicie). „Matematyzujemy” szyfr Cezara. Oznaczmy tekst jawny literą p, pi jest literą w tekście p znajdującą się na pozycji i. Nazwijmy tajny klucz literą k, c tekstem zaszyfrowanym, a literą ci w zaszyfrowanym tekście znajdującą się na pozycji i. Następnie możesz obliczyć każdą literę szyfru za pomocą wzoru: ci = (pi + k) % 26 Przyzwyczaj się do tej formalizacji, pozwala ona zaprogramować algorytm i dokładnie i zwięźle wyraża znaczenie szyfru. Jeśli klucz k = 13, a oryginalny tekst p brzmi: „Pamiętaj, żeby wypić Ovaltine!”, otrzymamy taki szyfr: Or fher gb qevax lbhe Binygvar! Zauważ, że O (pierwsza litera w zaszyfrowanym tekście) jest przesunięta o 13 pozycji w stosunku do litery B ( pierwsza litera w tekście oryginalnym) ). To samo z literą r (druga litera w szyfrowaniu) jest przesunięta o 13 liter od e (druga litera w oryginale). Trzecia litera w szyfrowaniu, f, jest przesunięta o 13 liter od s (trzecia w oryginale), tutaj poruszamy się po okręgu od z do a. Szyfr Cezara z kluczem 13 ma specjalną nazwę ROT13 . Jest symetryczny: stosując go dwukrotnie wracamy do tekstu pierwotnego. Oczywiście jest też ROT26, ten jest ogólnie superbezpieczny, ale tylko jeśli nie wyrażasz jasno swoich myśli =).
Stan
Wpisz w pliku caesar.c program szyfrujący tekst za pomocą szyfru Cezara. Podaj jeden argument wiersza poleceń jako dane wejściowe programu: nieujemną liczbę całkowitą. Dla uproszczenia nazwijmy to k. Jeśli użytkownik wykona program bez argumentów wiersza poleceń lub z więcej niż jednym argumentem, aplikacja powinna zgłosić skargę i zwrócić wartość 1 (tak zwykle oznacza się błędy): return 1; We wszystkich pozostałych przypadkach program pyta użytkownika o tekst do zaszyfrowania, a następnie wyświetla tekst zaszyfrowany kluczem k (tj. przesunięty o k pozycji w prawo w cyklu). Jeśli tekst zawiera znaki spoza alfabetu angielskiego, program ich nie zmienia. Po wydrukowaniu tekstu zaszyfrowanego aplikacja kończy działanie, main zwraca 0: return 0; Jeśli main nie zwróci jawnie zero, zwraca je automatycznie (int jest właściwie typem zwracanym przez main, ale o tym innym razem). Zgodnie z konwencją (zasady dobrej formy w programowaniu), jeśli jawnie zwrócisz 1, aby wskazać błąd, powinieneś także zwrócić 0 jako wskaźnik pomyślnego zakończenia programu. Chociaż alfabet angielski ma tylko 26 liter, k może być większe niż 26. Zasadniczo klawisz k = 27 da taki sam wynik jak k = 1, ale należy pozwolić użytkownikowi na wprowadzenie dowolnej liczby nieujemnej, nie przekraczające 2^31 – 26 (musi mieścić się w int). Program musi także uwzględniać, że małe litery szyfrowane są małymi, a wielkie litery szyfrowane dużymi. Gdzie zaczynamy? Ponieważ aplikacja musi zaakceptować wartość k bezpośrednio w argumencie, nagłówek naszej głównej funkcji wygląda następująco: int main(int argc, string argv[]) Z rozdziału 6 wiemy, że argv jest tablicą ciągów znaków. Zestaw można traktować jako rząd szafek w sali gimnastycznej. W każdym z nich kryje się jakieś znaczenie. W naszym przypadku w każdej komórce znajduje się argument typu string Aby otworzyć pierwszą szafkę, używamy argv[0], drugiej - argv[1] i tak dalej. Jeśli mamy n zamków, to musimy zatrzymać się na argv[n - 1], ponieważ argv[n] już nie istnieje (lub istnieje, ale należy do kogoś innego, lepiej go nie dotykać). Możesz więc uzyskać dostęp do argumentu k w następujący sposób: string k = argv[1]; Wierzymy, że naprawdę coś w tym jest! Przypomnijmy, że argc jest zmienną int równą liczbie wierszy w argv. Oznacza to, że lepiej sprawdzić wartość argc przed próbą otwarcia komórki, bo może się okazać, że ona nie istnieje. Idealnie argc = 2. Dlaczego tak jest? Wewnątrz argv[0] zwykle znajduje się nazwa programu. Oznacza to, że argc zawsze wynosi co najmniej 1. Jednak nasz program wymaga od użytkownika podania argumentu k wiersza poleceń, dlatego argc = 2. Naturalnie, jeśli użytkownik wprowadzi więcej niż jeden argument w wierszu poleceń, argc również rośnie i może być większa niż 2 Jeśli użytkownik wprowadzi do łańcucha liczbę całkowitą, nie oznacza to, że wprowadzona wartość zostanie automatycznie zapisana jako int. Dokładniej, NIE będzie. Będzie to ciąg znaków, nawet jeśli wygląda dokładnie jak int! Musimy więc sami przekonwertować ciąg na int. Na szczęście istnieje funkcja o nazwie atoi przeznaczona do tego celu. Jego składnia jest następująca: int k = atoi(argv[1]); Zauważ, że k jest typu int, więc możesz na nim wykonywać działania arytmetyczne. Dzięki tej funkcji nie musisz się martwić, czy użytkownik wprowadzi liczbę całkowitą, czy, powiedzmy, foo: w takim przypadku atoi zwróci 0. Funkcja atoi jest zadeklarowana w bibliotece stdlib.h , więc pamiętaj o # umieść go na początku programu. Kod skompiluje się bez tego, ponieważ umieściliśmy już tę funkcję w bibliotece cs50.h. Lepiej jednak zaufać bibliotekom natywnym. Więc masz k zapisane jako int. Teraz poprośmy o wprowadzenie tekstu. Jeśli wykonałeś zadania z pierwszego tygodnia, znasz już funkcję biblioteki CS50 o nazwie GetString. Ona nam pomoże. Po otrzymaniu k i początkowego tekstu rozpocznijmy szyfrowanie. Podsumowując, możesz iterować po wszystkich znakach ciągu i wydrukować je, korzystając z następującej pętli: for (int i = 0, n = strlen(p); i < n; i++) { printf("%c", p[i]); } Innymi słowy, tak jak argv jest tablicą ciągów, tak ciąg jest tablicą znaków. Dlatego możemy używać nawiasów kwadratowych, aby uzyskać dostęp do poszczególnych elementów ciągu w taki sam sposób, jak w przypadku uzyskiwania pojedynczych ciągów w argv. Oczywiście nie ma nic kryptograficznego w drukowaniu każdego ze znaków. Lub, technicznie rzecz biorąc, gdy k = 0. Ale musimy pomóc Cezarowi zaszyfrować jego tekst! Witaj, Cezarze! Aby użyć strlen, musisz dołączyć inną bibliotekę . Ponieważ automatyzujemy niektóre testy walidacyjne, program powinien zachowywać się dokładnie tak: username:~/workspace/pset2 $ ./caesar 13 Be sure to drink your Ovaltine! Or fher gb qevax lbhe Binygvar! Oprócz atoi , w bibliotekach ctype.h i stdlib.h można znaleźć inne fajne funkcje . Aby to zrobić, kliknij link i poszperaj trochę tam. Na przykład isdigit jest wyraźnie czymś interesującym =). Przechodząc od Z do A (lub od z do a), nie zapomnij o operatorze modulo %w języku C. Przestudiuj także tabelę , pokazuje znaki ASCII nie tylko dla liter. Aby sprawdzić, czy program działa poprawnie z check50 wykonaj następujące czynności: check50 2015.fall.pset2.caesar caesar.c A jeśli jesteś zainteresowany zabawą z kodem stworzonym przez obsługę CS50, uruchom komendę: ~cs50/pset2/caesar Przy okazji, uggc://jjj.lbhghor.pbz/jngpu ?i=bUt5FWLEUN0 .
Analiza zadania
  1. Weź klucz
  2. Pobierz tekst
  3. Szyfruj
  4. Wyświetl zaszyfrowaną wiadomość
1. Funkcję główną tworzymy tak, aby użytkownik wprowadził klucz w wierszu poleceń i sprawdził poprawność klucza. int main(int argc, string argv[]) argc: • int • liczba argumentów wprowadzonych w linii poleceń • jeśli argc = 2 wszystko jest w porządku. Jeśli nie, wydrukuj instrukcję i zamknij program. • Jeżeli argc = 2 sprawdzamy, czy klucz jest liczbą całkowitą. • Argv to tablica ciągów znaków, czyli lista z wprowadzonymi argumentami. Tablica to struktura danych zawierająca różne dane tego samego typu w różnych komórkach. Harvard CS50: Zadania w tygodniu 2 (wykłady 5 i 6) – 4 Na przykład użytkownik wprowadził ciąg blastoff Team Rocket, a następnie: Harvard CS50: Zadania w tygodniu 2 (wykłady 5 i 6) – 5 Za pomocą funkcji atoi() konwertujemy wynikową liczbę na liczbę całkowitą. Jeśli nie jest to możliwe, funkcja zwróci 0. Harvard CS50: Zadania w tygodniu 2 (wykłady 5 i 6) – 6 2. Zapytaj użytkownika o tekst. To proste: wszystko, co wprowadza użytkownik, jest ciągiem znaków. 3. Szyfrowanie. Algorytm jest prosty, ale jak wytłumaczyć komputerowi, które litery następują jedna po drugiej? Czas przypomnieć sobie tabelę ASCII! Harvard CS50: Zadania w tygodniu 2 (wykłady 5 i 6) – 7 Jednakże ciąg znaków może zawierać więcej niż tylko litery... Zanim przejdziesz do zmiany ciągów znaków, wyobraź sobie, że musisz zmienić tylko jeden znak. Chcemy zmienić litery z tekstu początkowego, a nie znaki czy cyfry. Co powinniśmy zrobić? Najpierw musimy sprawdzić, czy ten znak występuje w alfabecie. Można to zrobić za pomocą funkcji isalpha() . Jeśli znak jest alfabetem, ta funkcja zwraca wartość true, a w przeciwnym razie false. Dwie kolejne przydatne funkcje - isupper() i islower() zwracają wartość true, jeśli litera jest odpowiednio duża lub mała. Zatem: Isalpha(‘Z’) -> true Isalpha(‘;’) -> false Isupper(‘Z’) ->true Isupper(‘z’) -> false Islower(‘Z’) -> false Islower(‘z’)->true Jeśli isalpha zwróci wartość true, musimy zmienić ten znak za pomocą klawisza. Rozważmy i przeanalizujmy jako przykład program Zamili, asystenta CS50. Być może zastanawiasz się, dlaczego „A” jest liczbą całkowitą, skoro jest wyraźnie literą. Okazuje się, że symbole i liczby całkowite są wymienne. Umieszczając literę A w pojedynczym cudzysłowie, możesz uzyskać jej kod ASCII w postaci int. Bądź ostrożny: potrzebujesz pojedynczych cudzysłowów; bez nich kompilator będzie szukał zmiennej o nazwie A, a nie symbolu. Następnie w linii dodajemy wartość klucza do kodu ASCII litery i przechowujemy je w zmiennej całkowitej. Nawet jeśli wynikiem jest int, instrukcja printf używa symbolu zastępczego %c dla znaków. Zatem program wypisuje znak powiązany z wynikiem będącym liczbą całkowitą. W drugim przypadku liczbę wyświetlamy za pomocą symbolu zastępczego %d. Możesz wprowadzić ten kod do CS50 IDE i pobawić się nim. Sprawdźmy jak działa asciimath dla różnych kluczy. Weźmy wartość 25, zobaczymy następujący obrazek: A teraz niech kluczem będzie 26: Mamy [, a nie literę A. To po prostu kolejny znak ASCII po Z. Zatem samo dodanie klucza nie będzie praca. Musimy użyć wzoru szyfrującego, aby powrócić na początek alfabetu, gdy tylko skończą nam się litery. Pamiętajcie, pisaliśmy już powyżej: /* * 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: Zadania w tygodniu 2 (wykłady 5 i 6) – 8Harvard CS50: Zadania w tygodniu 2 (wykłady 5 i 6) – 9ci = (pi + k) % 26 Gdzie ci to litera numer i w zaszyfrowanym tekście, pi to litera i w tekście jawnym, k to klucz, a %26 to reszta z dzielenia przez 26 (lub „modulo 26”). Zastosujmy ten wzór do litery Y. Weźmy k = 2. Oblicz ('Y' + 2) %26 Kod ASCII litery 'Y' = 89. Następnie ('Y' + 2) %26 = (89 + 2) )% 26 = 91%26 = 13 Ale to nie jest wartość ASCII litery A, której potrzebujemy, czyli 65. Teraz nadajmy każdej literze alfabetu wartość od 0 do 25 w kolejności. W tym przypadku Y = 24. (24+2)%26 = 0 Litera A ma właśnie taki indeks. Zatem formuła ta odnosi się do alfabetycznego indeksu liter, a nie ich wartości ASCII. Aby wydrukować zaszyfrowany znak, będziesz potrzebować jego wartości ASCII. Dowiedz się, jak przełączać się między wartością ASCII a liczbą w alfabecie. Kiedy już opracujemy wzór na jeden znak, musimy zastosować go do każdej litery ciągu wprowadzonego z klawiatury. Ale tylko jeśli to są litery! I pamiętaj, wielkie i małe litery wymagają różnych znaczeń. Tutaj z pomocą przychodzą funkcje isupper i islower. Możesz mieć dwie formuły, jedną dla wielkich liter, drugą dla małych liter, funkcje pomogą Ci wybrać, którą zastosować. Jak zastosować formułę do każdego znaku w ciągu? Pamiętaj, że ciąg znaków to po prostu tablica znaków. Funkcja strlen (długość łańcucha) pomoże Ci określić liczbę iteracji w pętli .Harvard CS50: Zadania w tygodniu 2 (wykłady 5 i 6) – 10

Zadanie 2. Parlez-vous français?

Teoria
Szyfr Vigenère'a jest nieco bezpieczniejszy niż szyfr Cezara: wykorzystuje słowo jako klucz i trudno go złamać ręcznie, stosując samą analizę częstotliwości lub samą brutalną siłę. Każda litera klucza generuje liczbę, w wyniku czego otrzymujemy kilka kluczy do przesuwania liter. Przykład: p = Meet me in the park at eleven am В качестве ключевого слова возьмем k = bacon Длина wiadomości p = 25 В то время Jak длина k = 5 Поэтому его нужно повторять 5 раз. Harvard CS50: Zadania w tygodniu 2 (wykłady 5 i 6) – 11 Jeśli liczba liter w wiadomości nie jest podzielna przez klucz, przy ostatnim zastosowaniu klucza używamy tylko jej części: Harvard CS50: Zadania w tygodniu 2 (wykłady 5 i 6) – 12 Aby znaleźć wartość przesunięcia, używamy pozycji każdej litery naszego klucza bekonowego w alfabecie (od a do z). Liczymy od zera, jak prawdziwi programiści. I każda litera w tekście oryginalnym jest przesuwana o zadaną liczbę, jak w szyfrze Cezara, wracając w razie potrzeby po Z na początek alfabetu. Zatem M przesunie się o 1, pierwsze e nie przesunie się w ogóle, a drugie przesunie się o 2 pozycje. Poniżej widzisz oryginalną wiadomość, zapisany klucz i wynik jego zastosowania. Harvard CS50: Zadania w tygodniu 2 (wykłady 5 i 6) – 13 Szyfr Vigenère'a jest oczywiście silniejszy, ale znając długość klucza, dość łatwo go złamać. Jak to zidentyfikować? Jeśli oryginalny tekst jest na tyle długi, że niektóre słowa pojawiają się w nim kilka razy, to zauważysz pewne powtórzenia: Możesz Harvard CS50: Zadania w tygodniu 2 (wykłady 5 i 6) – 14 też użyć brutalnej siły, ale opcji jest wiele: 26^n – 1 gdzie n to długość nieznanego klucza . Ale zazwyczaj to dużo. To prawda, że ​​​​nie stanowi to problemu dla komputera. A teraz matematyka szyfru: Niech p będzie jakimś tekstem, k będzie słowem kluczowym, kj będzie j-tą literą klucza, pi będzie numerem litery i w tekście oryginalnym, ci będzie numerem litery i w szyfrowaniu . Następnie: ci = (pi + kj) % 26
Ćwiczenia
Warunek Napisz program vigenere.c, który szyfruje wiadomość przy użyciu szyfru Vigenere. Na wejście programu podajemy jeden argument wiersza poleceń: słowo kluczowe k, składające się z liter alfabetu angielskiego. Jeżeli aplikacja zostanie uruchomiona z więcej niż jednym argumentem lub z argumentem nie zawartym w alfabecie, konieczne jest wyświetlenie informacji o błędzie i zakończenie programu. Oznacza to, że main zwróci 1 - w tym przypadku nasze automatyczne testy zrozumieją, że tutaj wszystko jest w porządku i ten warunek jest brany pod uwagę. Jeżeli wszystko jest w porządku, program powinien przystąpić do żądania ciągu tekstowego p, który szyfrujemy uzyskanym powyżej kluczem k, wypisać wynik i zakończyć program zwracając wartość 0. Wyjaśnienie Należy koniecznie upewnić się, że w kluczu k znaki A i a są oznaczone jako 0, B i b jako 1, ..., Z i z jako 25. Program musi zastosować szyfr Vigenère'a tylko do liter tekstu p. Pozostałe znaki (cyfry, znaki interpunkcyjne, spacje) należy wypisać bez zmian. Jeśli algorytm zamierza zastosować j-ty znak k do i-tego znaku p , który nie występuje w alfabecie, zastosuj ten j-ty znak kluczowy do następnego znaku alfabetu w tekście; nie możesz tego po prostu zostawić i przejść do innej postaci w k. Na koniec program musi zachować wielkość każdej litery w p .
Nie wiesz od czego zacząć?
Harvard CS50: Zadania w tygodniu 2 (wykłady 5 i 6) – 15
Oto kilka wskazówek od Zamilyi, asystentki kursu CS50
Na szczęście program jest bardzo podobny do szyfru Cezara, tyle że kluczem jest ciąg znaków, a nie liczba całkowita. Jeśli pomyślnie zaimplementowałeś szyfr imion rzymskiego władcy, może to być świetny początek drugiego zadania. Prawdopodobnie już zdałeś sobie sprawę, że szyfr Vigenère'a z jedną literą jako kluczem jest taki sam, jak szyfr Cezara. Algorytm Vigenère'a wykorzystuje te same kroki, co Cezar:
  1. Weź klucz
    • słowo kodowe jest drugim argumentem wiersza poleceń argv[1]
    • musi być zapisane w alfabecie: funkcja isalpha
  2. Pobierz tekst
  3. Szyfruj
  4. Wydrukuj tekst zaszyfrowany
Sprawdźmy więc drugi argument wiersza poleceń argv[1], aby zobaczyć, czy należy on do znaków alfabetu. Robimy to za pomocą znanego już isalpha . Jeśli klucz jest poprawny, otrzymujemy od użytkownika ciąg znaków i rozpoczynamy szyfrowanie. Wzór szyfru Vigenère’a jest podobny do wzoru szyfru Cezara. Jak przekonwertować literę na odpowiednie przesunięcie szyfru? Spróbuj porównać wartości za pomocą tabeli ASCII. Harvard CS50: Zadania w tygodniu 2 (wykłady 5 i 6) – 16 Najprawdopodobniej będziesz w stanie znaleźć wzór pomiędzy literami i ich indeksami alfabetycznymi, korzystając z sekwencji podanych w tabeli. Czy zastanawiałeś się, jak odjąć jedną literę od drugiej, aby uzyskać pożądany rezultat? Przesunięcia dla wielkich i małych liter są takie same, dlatego będziesz musiał zdefiniować dwie podobne formuły, aby określić przesunięcie dla małych liter i osobno dla wielkich liter. Pamiętaj również, że pętla tekstowa powinna ignorować znaki inne niż angielskie. I nie zapomnij zachować wielkości liter. Jeśli spojrzysz na formułę szyfru: ci = (pi + kj) % 26 zobaczysz dwie zmienne indeksowe, i oraz j. Jeden zapisuje pozycję w tekście źródłowym, drugi w kluczu. Jeśli tekst jest dłuższy niż klucz, indeks na klawiszu przechodzi od końca klucza z powrotem do początku. Jak to zrobić? Korzystanie z operacji dzielenia modulo! Wynikiem operacji jest reszta z dzielenia dwóch liczb. Praktyczne korzyści z tej operacji w programowaniu są po prostu ogromne! Wyobraź sobie, że dużą grupę ludzi należy podzielić na trzy podgrupy. Jednym ze sposobów, aby to zrobić, jest poproszenie ich o zapłatę za pierwszy, drugi, trzeci. Harvard CS50: Zadania w tygodniu 2 (wykłady 5 i 6) – 17 Oznacza to, że pierwsza osoba należy do pierwszej grupy, druga do drugiej, trzecia do trzeciej, czwarta ponownie do pierwszej i tak dalej. Aby wykonać tę samą operację, możesz użyć dzielenia modulo. Ponumerujmy od zera te same trzy grupy. Oto jak to zrobić: Harvard CS50: Zadania w tygodniu 2 (wykłady 5 i 6) – 18 Jeśli weźmiesz indeks i podzielisz go modulo przez wartość maksymalną, wynik nigdy nie będzie większy lub równy tej wartości. Wypróbuj tę zasadę, aby zwrócić słowo kluczowe na początek! Tylko zamiast sortowania według grup potrzebny jest indeks słowa kluczowego, aby można było przesunąć właściwą literę bez przekraczania długości klucza. Ponieważ automatyzujemy niektóre testy Twojego kodu, program powinien zachowywać się jak pokazano poniżej: jharvard@appliance (~/Dropbox/pset2): ./vigenere bacon Meet me at the park at eleven am Negh zf av huf pcfx bt gzrwep oz W jaki inny sposób możesz przetestować program poza ręcznym obliczeniem tekstu zaszyfrowanego? Jesteśmy mili: w tym celu napisaliśmy program devigenere . Pobiera jeden i tylko jeden argument wiersza poleceń (słowo kluczowe), a jego zadaniem jest przyjęcie tekstu zaszyfrowanego jako wejścia i zwrócenie zwykłego tekstu. Uruchom to: ~cs50/pset2/devigenere k Gdzie k jest słowem kluczowym. Jeśli chcesz sprawdzić poprawność swojego programu za pomocą check50, uruchom: check50 2014.fall.pset2.vigenere vigenere.c A jeśli chcesz ocenić naszą implementację vigenere, wpisz: ~cs50/pset2/vigenere

Jak zweryfikować kod i zdobyć oceny

Uwaga! Jeśli ważne jest dla Ciebie sprawdzenie tylko poprawności zadań to użyj cs50check. Jeżeli chcesz otrzymywać oceny na platformie edx postępuj zgodnie z procedurą opisaną poniżej. Należy pamiętać, że ta procedura wykorzystuje ten sam program cs50check do sprawdzania zadań. Jedyną różnicą jest to, że zapamiętuje wyniki i oblicza ogólny wynik.
  1. Zaloguj się do CS50 IDE
  2. W pobliżu lewego górnego rogu CS50 IDE , gdzie znajduje się jego przeglądarka plików (nie w oknie terminala), kliknij prawym przyciskiem myszy plik inicjały.c znajdujący się w katalogu pset2 i kliknij Pobierz . Powinieneś zobaczyć, że przeglądarka załadowała inicjały.c .
  3. Powtórz dla caesar.c .
  4. Powtórz dla vigenere.c .
  5. W osobnym oknie lub zakładce zaloguj się do CS50 Submit
  6. Kliknij ikonę Prześlij w lewym górnym rogu ekranu. Harvard CS50: Zadania w tygodniu 2 (wykłady 5 i 6) – 19
  7. Na liście folderów po lewej stronie kliknij katalog Problem Set 2 , a następnie kliknij przycisk Prześlij nowe zgłoszenie . To jest po prawej. Harvard CS50: Zadania w tygodniu 2 (wykłady 5 i 6) – 20
  8. Na wyświetlonym ekranie kliknij przycisk Dodaj pliki .... Otworzy się okno wyboru plików z komputera. Harvard CS50: Zadania w tygodniu 2 (wykłady 5 i 6) – 21
  9. Przejdź do folderu, w którym przechowujesz inicjały.c . Najprawdopodobniej znajduje się on w folderze Pobrane lub w dowolnym miejscu, w którym przeglądarka domyślnie umieszcza pliki. Gdy znajdziesz plik inicjały.c , kliknij go raz, aby go zaznaczyć, a następnie kliknij Otwórz.
  10. Kliknij ponownie Dodaj pliki .
  11. Znajdź stronę caesar.c i otwórz ją.
  12. Zrób to samo dla pliku vigenere.c .
  13. Kliknij Rozpocznij przesyłanie. Twoje pliki zostaną przesłane na serwery CS50 .
  14. Na wyświetlonym ekranie powinno pojawić się okno Nie wybrano pliku . Jeśli przesuniesz kursor myszy w lewo, zobaczysz listę pobranych plików. Aby potwierdzić, kliknij każdy z nich. Jeśli nie jesteś czegoś pewien, możesz ponownie przesłać pliki, powtarzając te same kroki. Możesz to zrobić tyle razy, ile chcesz, do końca 2016 roku.
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION