[Powered by Google Translate] [Opis przejścia - Set Problem 2]
[Zamyla Chan - Harvard University]
[To jest CS50. CS50.TV]
Dobrze. Witam wszystkich i zapraszamy do Walkthrough 2.
Po pierwsze, chciałbym pogratulować wykańczania PSET 1.
Wiem, że może to być nieco trudne dla niektórych z was,
mógł być twój pierwszy program komputerowy, który napisałeś,
, ale należy pamiętać, że w końcu tego, gdy patrzy się z powrotem na koniec semestru
będziesz wyglądać na PSET 1 i powiesz "Hej, mogę tego zrobić w 5 minut."
Więc wiedzieć i wierzyć, że w końcu to będzie na pewno znajdziesz PSET 1 dość prosta.
Ale teraz to jest ogromnym sukcesem, i gratulacje dla zrobienia kupujemy.
Teraz, również szybkie notatki, zanim przejdziemy do mięsa z instrukcji.
Chcę tylko, aby szybko zauważyć, że czasami nie mają wystarczająco dużo czasu
podczas solucje przejść każdy sposób prowadzenia zestawu problemu
i raczej tylko może skupić się na 1 lub 2 rodzaju wdrożeniach,
sposoby, że można to zrobić.
Ale to nie znaczy, że są zabronione robi to w inny sposób.
Są to często, jak w informatyce, liczne sposoby działania,
a więc na pewno tutaj użyć innego rodzaju rozwiązania, niż może już prezentowane.
[Pset 2: Crypto - Zamyla Chan - zamyla@cs50.net]
[Pset2 - 0. Sekcja Pytania - 1. Caesar - 2. Vigenere'a]
Dobrze. Więc problem ustawić 2: Crypto jest zabawa jeden.
Ponownie, z każdym Pset zaczniesz z sekcji pytań
że zamierza przeprowadzić w swoich sekcjach z przypisanego kolegów nauczycieli.
Nie zamierzamy przejść przez te ponad samouczka
ale na pewno pomogą Ci zakończyć PSET.
Tak więc pierwsza część zestawu problemu jest Cezar.
I tak w Cezara ktoś przejdzie ci klucz z liczbą całkowitą,
i będzie szyfrować ciąg tekstu, że dostarczy Ci
i dać je zaszyfrowane rzeczy.
Jeśli ktoś oglądał A Christmas Story, jest przykładem, że nie.
Następnie druga część zestawu problemu jest Vigenère
która jest bardziej zaawansowana technika szyfrowania.
I tak mamy zamiar zaszyfrować fragment tekstu,
wyjątkiem zamiast z tylko jednej liczby całkowitej, jesteśmy rzeczywiście będzie zakodować
z hasła, które użytkownik dostarczy nam.
Ok, więc pierwsze narzędzie w przyborniku jest dziś faktycznie będzie aktualizacji urządzenia.
Na forum dyskusyjnym moglibyśmy zobaczyć takie rzeczy jak: "Dlaczego to nie działa?"
"Dlaczego nie przedstawi 50 działa?"
i często rozwiązaniem jest właściwie tylko do aktualizacji urządzenia.
A jeśli tak po prostu uruchomić w oknie terminala w Twoim sudo urządzenia yum-y -
to flaga mówi tak, aktualizować wszystko - update
wówczas urządzenie będzie aktualizować, jeśli zajdzie potrzeba.
I to nie zaszkodzi, jeśli już są w najnowszej wersji urządzenia.
Wtedy będzie po prostu powiedzieć, żadne nowe aktualizacje dostępne i można kontynuować pracę wzdłuż.
Ale to jest dobry do wykonania nawet przy każdym otwarciu urządzenia
bo jesteśmy wciąż bardzo dużo -
czasem, jeśli wejdziemy do błędu - Ustalenie go w urządzeniu.
Więc upewnij się, że masz najnowszą wersję urządzenia
i uruchomić tę aktualizację tam.
Dobrze. Więc skoro mamy do czynienia z literami i zmienia, szyfrowania rzeczy,
będziemy naprawdę chcesz zostać najlepszym przyjacielem naszej ASCII wykresu.
Istnieje wiele z nich w trybie online, jeśli znajdziesz. Może nawet stworzyć własną.
Zasadniczo, z każdą literą i każdej ilości i każdej postaci
Numer jest związane z nimi,
i tak dobrze jest zobaczyć ich wartości ASCII obok rzeczywistego listu.
To na pewno pomoże ci w zbiorze problemów.
Jedna rzecz, która bardzo pomogła mi w tym zestawie problem był rzeczywiście wydrukować,
i jak szedłem, ja rzeczywiście wyciągnąć z niego,
napisać: "Jeśli to ma iść do tam, a potem ..."
Rodzaj wyciągnąć z niego i zaznaczyć go, stają najlepsi przyjaciele z twoim ASCII tabeli.
Następnie mamy kilka innych narzędzi do naszej dyspozycji.
Tym razem zamiast faktycznie monitowania użytkownika o wszystkie ich wejścia
mamy zamiar zrobić kombinację.
Będziemy monitować je dla jakiegoś wejścia,
ale jesteśmy również będzie po prostu użyć argumentów wiersza poleceń.
Więc kiedy uruchomić swój program, zwykle mówisz. / Hello, na przykład,
jeśli program był hello.c.
Ale tym razem, zamiast po prostu mówiąc, że można je umieścić słowa, argumenty później.
I tak mamy zamiar użyć jakichkolwiek przechodzą one w nas jako ich wejście, jak również,
więc wyjście poza właśnie skłoniło do liczby całkowitej, ale także za pomocą argumentów wiersza poleceń.
A potem pójdziemy na tablice i ciągi znaków, które będziemy używać dużo, jak również.
Tu jest tylko przykład 1 mini wykresie ASCII.
Jak już mówiłem, każda litera odpowiada liczbie,
a więc zapoznać się z tym. To się przyda.
A później, gdy zaczynamy jakiejś ASCIIMath czynienia z liczbami -
dodawanie, odejmowanie ich - to na pewno dobry w odniesieniu do tego wykresu.
Tak tu jest przykładem szyfru Cezara - coś, co może grałeś z.
To jest po prostu koła. Zasadniczo, jest zewnętrzna alfabetu, a następnie jest wewnętrzna alfabetu.
Tak więc jest tu przykład szyfru Caesar ale klucza 0.
Zasadniczo, jest wyrównany, B jest zgodne z B, aż do Z.
Ale wtedy powiedzieć chcieliśmy klawisz 3, na przykład.
To wtedy obracać tak, że wewnętrzne koło się w jednej linii z D, itp.
I tak to jest w zasadzie to, co zamierzamy zrobić.
Nie mamy koło, ale co mamy zamiar zrobić, to nasz program
rodzaj przesunięcia alfabetu wraz z nas pewnym liczb.
Tak jak powiedziałem wcześniej, będziemy mieć do czynienia z argumentami wiersza polecenia
jak również coraz liczbę całkowitą.
Tak więc sposób, że użytkownik będzie uruchomić program Cezar mówiąc. / Caesar
a następnie wpisz numer po tym.
Oraz że liczba reprezentuje klucz, zmiany biegów,
ile razy będziemy się obracając wewnętrzną kierownicą szyfru Cezara.
I tak można zobaczyć tutaj przykładem.
Jeżeli weszliśmy litery od A do L w naszym szyfrem Cezara,
wtedy byłoby wejście D przez O bo to każda litera przesunięte ponad 3 razy,
tak jak na przykładzie koła, które pokazałem.
Tak więc, jeśli wprowadzone, na przykład, to CS50!
wtedy to również przenieść wszystkie litery.
I to jest ważne zarówno Cezara i Vigenère
jest to, że mamy zamiar pominąć żadnych nie-litery.
Więc żadnych spacji, znaków, itp., liczby, będziemy trzymać je same.
Jesteśmy tylko będzie zmieniać litery w tym przypadku.
Więc jak widać w kole, mamy tylko litery dla nas dostępne,
tak tylko chcemy przesunąć litery i szyfrować listy.
Więc pierwszą rzeczą do zrobienia, to zobaczyłem, że korzystanie z Internetu do Cezara w problemu ustawić 2
jest uruchomienie Cezara, a następnie wpisz numer po uruchomieniu go w terminalu.
Więc to, co musimy zrobić, to jakoś ten klucz i dostęp.
A więc chcemy jakoś zobaczyć to będzie drugi argument linii poleceń.
Pierwszy z nich będzie. / Cezar, a następny będzie numer klucza.
Więc zanim mieliśmy int main (), aby rozpocząć nasze programy w C.
Będziemy odwinąć warstwy nieco mało
i rzeczywiście widać, że zamiast z przechodzącą w pustce naszej głównej funkcji
mamy rzeczywiście do czynienia z 2 parametrami.
Mamy int nazwie argc i tablica łańcuchów nazywany argv.
Więc argc jest liczbą całkowitą,
i reprezentuje liczbę argumentów przekazanych do swojego programu.
A potem argv jest rzeczywiście lista argumentów.
Wszystkie argumenty są ciągami, a więc reprezentuje tablicę argv, listy, łańcuchów.
Porozmawiajmy o tablicach bitowych mało.
Tablice są zasadniczo nową strukturę danych.
Mamy wskazówki, mamy podwójne, mamy łańcuchy, a teraz mamy tablice.
Tablice są struktury danych, które mogą zawierać wiele wartości tego samego typu,
tak zasadniczo, niezależnie od jej rodzaju lista chcesz.
Zasadniczo, jeśli chcesz listę liczb całkowitych wszystkim w 1 zmiennej,
Następnie należy utworzyć nową zmienną, która była z tablicy typu int.
Więc tablice są indeksowane od zera, co oznacza, że ​​pierwszy element tablicy o indeksie 0 jest.
Jeśli tablica ma długość 4, tak jak w tym przykładzie, to twój ostatni element będzie o indeksie 3,
które jest 4 - 1.
Tak, aby utworzyć tablicę, byś zrobił coś takiego.
Powiedzmy, że chce podwójną tablicę.
To odnosi się do każdego rodzaju typu danych, chociaż.
Tak, że chcesz podwójne tablicę. Powiedzmy, że chcesz to nazwać skrzynki.
Podobnie jak można zainicjować inne podwójne,
powiedziałbyś double, a następnie nazwę, ale tym razem umieścić w nawiasach kwadratowych,
i liczba będzie długość tablicy.
Zauważ, że w tablicach nie możemy kiedykolwiek zmienić długość,
więc zawsze muszą zdefiniować i wybierz, ile pól,
ile wartości twojej tablicy będzie się trzymać.
Tak, aby ustawić różne wartości w macierzy, będziesz korzystać z tego następującą składnię,
jak widać na slajdzie.
Masz 0 Indeks skrzynka zostanie ustawiona na 1,2,
Indeks 1 skrzynka ustawiona na 2,4, itd.
Więc teraz, że mamy recenzja tablic trochę, wróćmy do argc i argv.
Wiemy, że argv jest teraz tablica łańcuchów.
Tak, gdy użytkownik przechodzi się - mówią, że uruchomiony program -
mówią. / hello David Malan,
co program zrobi ci już faktycznie wymyślić co argc i argv są.
Więc nie musisz się o to martwić.
Argc w tym przypadku byłoby 3 ponieważ widzi 3 różne słowa oddzielone spacjami.
I tak, to tablica w tym przypadku, pierwszy indeks będzie. / Hello,
David następny, następny Malan.
Czy ktoś od razu zobaczyć, co relacja między argv,
tablicy, a argc jest?
Tak. Zajmiemy się, że w np. w args.c.
Zobaczmy, czy możemy skorzystać z relacji między 2.
Tutaj może się okazać, że w urządzeniu domyślną aplikacją
otwierać pliki. C jest czasami Emacs.
Ale chcemy zajmować gedit, więc co można zrobić, to można kliknąć prawym przyciskiem myszy na pliku C
przejdź do Właściwości, Otwórz za pomocą, a następnie wybierz gedit, Ustaw jako domyślne,
a teraz Twój program powinien otworzyć w gedit zamiast Emacs.
Perfect.
Więc mam program, który chcę wydrukować każdy argument wiersza poleceń.
Więc niezależnie od użytkownika wejścia, chcę przede wszystkim zwrócić go z powrotem do nich w nowej linii.
Więc co jest struktura, które możemy wykorzystać do iteracyjnego coś -
coś, czego prawdopodobnie używane w PSET 1?
Jeśli chcesz przejść przez określoną liczbę rzeczy? >> [Uczeń] Na pętli.
Na pętli. Dokładnie. Więc zacznijmy od pętli for.
Mamy dla int i = 0. Zacznijmy ze standardowym zmiennej inicjalizacji.
Zamierzam opuścić warunek zbioru, a potem mówią i + +, zamierza zrobić coś tam.
Dobrze.
Więc myśli powrót do argv, jeśli argv jest lista argumentów przekazanych do programu
i argc to liczba argumentów w programie,
to znaczy, że argc jest zasadniczo długość argv, w prawo,
bo nie będą tak wielu argumentów jak wartości argc.
Więc jeśli chcemy iterować każdy element w argv,
będziemy chcesz za każdym razem dostęp do zmiennej w argv o podanym indeksie.
, Które mogą być reprezentowane w to, prawda?
Zmienna ta reprezentuje tutaj szczególny ciąg w tym przypadku
bo to tablica string - ciąg znaków w tym zwłaszcza danego indeksu.
Co chcemy zrobić w tym przypadku chcemy, aby go wydrukować, więc powiedzmy, że printf.
A teraz argv jest ciągiem znaków, więc chcemy umieścić ten zastępczy tam.
Chcemy nowej linii tylko, aby dobrze wyglądać.
Tak więc mamy tu do pętli. Nie mamy jeszcze stan.
Więc zaczyna się od 0, a następnie za każdym razem, to będzie drukować dany ciąg
w tym szczególnym Indeks tablicy.
Tak więc, gdy chcemy, aby zatrzymać drukowanie elementów w tablicy?
Kiedy skończymy, prawda? Kiedy doszliśmy do końca tablicy.
Więc nie chcę przekraczać przeszłość długości tablicy,
i już wiem, że nie trzeba rzeczywiście aktywnie dowiedzieć się, co jest długość argv
ponieważ jest to nam dane, a co to takiego? Argc. Dokładnie.
Dlatego chcemy, aby zrobić ten numer argc procesu razy.
Nie jestem w odpowiednim katalogu.
Dobrze.
Teraz zróbmy args. Brak błędów, co jest dobre.
Więc po prostu uruchomić args.
Co to wróci do nas? To po prostu będzie wydrukować go z powrotem.
"You wprowadzane argumenty do programu, mam zamiar dać z powrotem do Ciebie."
Więc powiedzmy, że chcemy powiedzieć args następnie foo bar.
Więc to drukuje je z powrotem do nas. Wszystko w porządku?
Więc jest przykładem tego, jak można wykorzystać ARGC i ARGV
wiedząc, że ARGC reprezentuje długość argv.
Upewnij się, że nie zawsze z dostępem do tablic jeden poza długość tablicy
ponieważ C na pewno krzyczeć na ciebie.
Dostaniesz coś zwanego błędu segmentacji,
które nigdy nie jest zabawne, w zasadzie mówi, że próbujesz uzyskać dostęp do czegoś
że nie istnieje, nie należy do Ciebie.
Więc upewnij się, a zwłaszcza z zerową indeksowania, nie chcemy, aby -
Jak na przykład, jeśli mają długości tablicy 4,
że indeks tablicy 4 nie istnieje, bo zaczynają się od 0, przy zerowym indeksie.
Stanie się drugą naturą, tak jak dla pętli, kiedy zaczynają się 0.
Więc po prostu mieć to na uwadze.
Nie chcesz, aby kiedykolwiek przejść do indeksu tablicy, która znajduje się poza Twoim zasięgiem.
Tak więc widzimy teraz, jak możemy rodzaj dostępu
Argumenty wiersza poleceń, które są przekazywane w.
Ale jak zobaczyłem napis, argv jest faktycznie tablicy string.
Więc nie jest to właściwie jeszcze całkowitą, ale Cezara możemy mieć do czynienia z liczbami całkowitymi.
Na szczęście, istnieje funkcja stworzona dla nas, że w rzeczywistości może konwertować ciąg znaków na liczbę całkowitą.
Również tutaj mamy do czynienia nie z danych wejściowych użytkownika dokąd nakłania
dla wejścia tutaj na klucz, więc nie możemy faktycznie reprompt i powiedzieć,
"Och, daj mi jeszcze jedną liczbę całkowitą, powiedzmy, jeśli to nie jest ważne."
Ale mamy jeszcze trzeba sprawdzić poprawność użycia.
W Cezara są dozwolone jedynie przekazać w 1 liczby,
i tak trzeba uruchomić. / Cezar i to muszą dać ci numer.
Więc argc musi być pewna liczba.
Jaki numer byłoby to, czy mają przekazać wam. / Cezara i klawisza?
Co to jest argc? >> [Student] 2. >> Two. Dokładnie.
Więc chcesz się upewnić, że jest 2 argc.
W przeciwnym razie po prostu odmówić, aby uruchomić program.
W main to funkcja, która mówi, int main,
tak to zawsze w dobrym 0 powrotnych praktyce na koniec udanego programu.
Jeśli tak, to znaczy, że da ci 3 argumenty wiersza polecenia zamiast 2
lub dać 1, na przykład, to co zrobisz, to będziemy chcieli, aby sprawdzić, że
, a następnie powrót 1 mówiąc, nie, nie mogę kontynuować programu.
[Uczeń] Nie może być miejsca w tekście. >> Przepraszam?
[Uczeń] Nie może być miejsca w tekście, który próbujesz zaszyfrować.
Ah!
Jeśli chodzi o tekst, który chcemy zaszyfrować, że faktycznie przychodzi później
gdy dajemy ten tekst.
Więc teraz jesteśmy po prostu przyjmując jako argumenty poleceń rzeczywista liczba,
Rzeczywista zmiana na szyfrowanie Cezara.
[Uczeń] Dlaczego musisz 2, w przeciwieństwie do tylko 1 argc? Jest zdecydowanie 1 numer.
Racja. Dlatego musimy 2 dla argc zamiast 1
ponieważ po uruchomieniu programu i powiedzieć. / caesar lub. / hello,
faktycznie liczy się jako argument wiersza poleceń.
Tak więc, że już zajmuje 1 i tak to mamy do wprowadzania 1 extra.
Więc wprowadzania faktycznie ciąg znaków w argumencie wiersza poleceń.
Co chcesz zrobić, dla Cezara możemy mieć do czynienia z liczbą całkowitą,
dzięki czemu można korzystać z tej funkcji atoi.
I w zasadzie, można przekazać je w ciąg, a następnie powróci z powrotem integer
jeśli jest to możliwe, aby ten ciąg do liczby całkowitej.
Teraz pamiętam, kiedy mamy do czynienia z printf lub GetString, takie rzeczy,
to to biblioteki, które są specyficzne dla nas.
Więc na początku zaczynamy standardowego skrótu słowa I / O,. H, coś takiego.
Cóż, atoi nie jest w jednej z tych bibliotek,
więc to, co musimy zrobić, to musimy włączyć odpowiednią bibliotekę do tego.
Więc przypominam powrotem Walkthrough 1, gdzie omówiono z funkcji ręcznego.
Wpisać w terminalu mężczyzna a następnie po nazwie funkcji.
I tak, że wywoła całą listę jego użytkowania,
ale jak będzie wychowywać co biblioteka należy.
Więc zostawię to dla was do korzystania z funkcji ręcznego z atoi
i dowiedzieć się, które biblioteki trzeba dołączyć, aby móc korzystać z funkcji atoi.
Więc mamy klucz i teraz chodzi o uzyskanie zwykłego tekstu,
i tak, że faktycznie będzie to wejście użytkownika, w którym poprosi.
Mieliśmy do czynienia z getInt i GetFloat, a więc w tym samym duchu
będziemy mieć do czynienia z getString.
Ale w tym przypadku nie musimy robić żadnych While lub pętle while do sprawdzenia.
GetString pewnością daje nam ciąg,
i jedziemy do szyfrowania, co użytkownik podaje nam.
Tak więc można przyjąć, że wszystkie z tych użytkowników ciągów wprowadzane są prawidłowe.
Great.
Więc gdy masz klucz i raz masz tekst,
Teraz to, co pozostaje, to trzeba zaszyfrować zwykłego tekstu.
Tylko szybko pokrywają ponad slangu, plaintext to co użytkownik daje,
a szyfrogram jest to, co do nich wrócić.
Więc strun, aby móc przejść przez faktycznie pismo pismem
ponieważ mamy do przesunięcia każdego listu,
Rozumiemy, że struny, jeśli rodzaj odwinąć warstwy,
widzimy, że są one po prostu bardzo lista znaków.
Jeden jest po drugiej.
A więc możemy traktować ciągi jako tablic, ponieważ są tablice znaków.
Tak, że masz ciąg o nazwie text,
iw ramach tego tekstu zmiennego jest przechowywany To CS50.
Następnie tekst o indeksie 0 będzie stolicą T, index 1 byłoby h itp.
A potem z tablicami, w argc przykład args.c,
widzieliśmy, że mieliśmy do iteracyjnego tablicę
i tak, że miał iteracyjne z i = 0, aż do i jest mniejsza niż długość.
Dlatego musimy jakiś sposób dowiedzieć się, co długość naszego łańcucha jest
jeśli mamy do iteracji nad nim.
Na szczęście znowu jest funkcją nie nam, choć w dalszej CS50
to na pewno będzie w stanie wdrożyć i tworzyć własne funkcje
że można obliczyć długość łańcucha.
Ale teraz mamy zamiar wykorzystać długość łańcucha, tak strlen.
Przechodzą w ciągu, a następnie powróci ci int reprezentującą długość łańcucha.
Spójrzmy na przykład, jak może być w stanie iterować każdy znak w ciągu znaków
i zrobić coś z tym.
Co chcemy zrobić jest iteracyjne nad każdy znak łańcucha,
i co chcemy zrobić, to możemy wydrukować z powrotem każdy znak 1 przez 1
wyjątkiem dodamy coś obok niego.
Więc zacznijmy od pętli for. Int i = 0.
Jedziemy do pozostawienia miejsca na stanie.
Chcemy iteracyjne, dojeżdżamy do końca łańcucha, prawda?
Więc co funkcja daje nam długość łańcucha?
[Niesłyszalne odpowiedź uczeń]
To długość argumentów wiersza poleceń.
Ale na ciąg chcemy użyć funkcji, która daje nam długość łańcucha.
Więc to jest długość łańcucha.
I tak to trzeba przekazać w ciągu do niego.
Trzeba wiedzieć, co łańcuch musi obliczyć długość.
Tak więc w tym przypadku mamy do czynienia z string s.
Great.
Tak więc to, co chcemy zrobić, niech printf.
Teraz możemy mieć do czynienia z postaciami. Chcemy wydrukować każdy indywidualny charakter.
Gdy chcesz go wydrukować pływak, należałoby użyć zastępczy jak f%.
Przy wew byłoby użyć% d.
I tak podobnie, z charakterem korzystania C% powiedzieć, że zamierzam być drukowane znak
, które jest przechowywane wewnątrz zmiennej.
Więc mamy to, a dodajmy termin i miejsce do tego.
Która postać jesteśmy przy użyciu?
Będziemy używać cokolwiek znak, że jesteśmy w ciągu.
Tak więc mamy zamiar używać coś z łańcucha,
ale chcemy, aby uzyskiwać dostęp do jakiegoś znaku tam.
Tak więc, jeśli ciąg jest tylko tablica, to w jaki sposób dostęp do elementów tablic?
Mamy tych nawiasów kwadratowych, a potem umieścić wskaźnik w środku.
Więc mamy nawiasów kwadratowych. Nasz indeks w tym przypadku możemy po prostu użyć i. Dokładnie.
Więc tutaj mówimy idziemy do drukowania znaku następuje kropka i spacja,
i że postać będzie ith pismo w naszym s string.
Idę, aby zapisać, że. Okay.
Teraz mam zamiar uruchomić długość ciągu.
Więc mieliśmy ciąg nazwie OMG, a teraz jest jeszcze bardziej podkreślić.
Podobnie, powiedzmy, że faktycznie chce się ciąg od użytkownika.
W jaki sposób możemy to zrobić?
Przed, w jaki sposób możemy uzyskać int?
Powiedzieliśmy getInt, prawda? Ale to nie jest int, więc niech GetString.
Zróbmy długość ciągu. Tu nie wchodzi specjalny monit.
Więc ja nie wiem.
Mam zamiar umieścić moje nazwisko w tu i tak to można zrobić jedną z tych rzeczy
gdzie mogę przypisać słowo na każdy list, czy coś w tym stylu. Cool.
Więc to jest długość łańcucha.
Więc wracamy do Cezara.
Mamy kilka narzędzi na jak iteracyjne nad ciąg znaków,
jak mamy dostęp do każdego elementu.
Więc teraz możemy wrócić do programu.
Jak wspomniałem wcześniej, w tabeli ASCII, twoim najlepszym przyjacielem,
masz zamiar zobaczyć numery, które są związane z każdą literę.
Więc powiedzieć, że nasze plaintext jest mi głowy!
Następnie każdą z tych postaci będzie miała liczbę ASCII i związanego z nim,
nawet apostrof, nawet miejsca, nawet wykrzyknik,
więc będziemy chcieli, aby o tym pamiętać.
Tak mówią nasz klucz, że użytkownik zawarte w ich argument wiersza polecenia jest 6.
Oznacza to, że do pierwszej litery, która jest i, który jest reprezentowany przez 73,
Aby powrócić do nich cokolwiek litera jest reprezentowana przez wartość ASCII 73 + 6.
W tym przypadku będzie 79.
Teraz chcemy, aby przejść do następnego znaku.
Więc następnym w indeksie 1 z tekstu jawnego będzie apostrof.
Ale pamiętaj, tylko chcemy zaszyfrować litery.
Dlatego chcemy, aby upewnić się, że apostrof faktycznie pozostaje taka sama,
to, że nie zmieni się z 39 do 45 jest cokolwiek.
Chcemy zachować go jako apostrof.
Dlatego chcemy, aby pamiętać, aby zaszyfrować tylko litery
bo chcemy wszystkich innych symboli pozostać niezmienione w naszym programie.
Inna sprawa, że ​​chcemy, aby zachować wielkość.
Więc kiedy masz wielką literę, należy zatrzymać jako wielkie.
Dokonuje konwersji powinien pozostać jako małe.
Więc kilka przydatnych funkcji, aby móc zająć się tylko literami szyfrujących
i przechowywać zachowując kapitalizację rzeczy
jest isalpha isupper, funkcje islower.
A więc są to funkcje, które zwracają Ci wartość logiczną.
Zasadniczo, prawda lub fałsz. Czy to wielka? Czy to alfanumeryczny?
Czy to pismo, w istocie.
Więc są 3 przykłady jak można wykorzystać tę funkcję.
Zasadniczo, można sprawdzić, czy wartość zwracana Państwu tej funkcji jest prawdziwe czy fałszywe
oparte na tym wejściu.
Albo nie zaszyfrować coś lub szyfrem go lub upewnij się, że jest to wielkie, itp.
[Student] Czy możesz to wyjaśnić te trochę więcej i jak z nich korzystać? >> Tak, na pewno.
Więc jeśli spojrzymy wstecz, mamy tu kapitałowego ï, prawda?
Więc wiemy, że idzie do O bo + 6 jest O.
Ale chcemy, aby upewnić się, że O będzie stolicą O.
Więc w zasadzie, że jest trochę coś zmieni wejście.
Więc czy to jest wielkie i nie będzie rodzaj zmienić sposób mamy do czynienia z nim.
Więc jeśli używamy funkcji isupper na danym indeksie,
tak isupper ("I"), która zwraca nam prawdziwej, więc wiemy, że to jest górna.
Tak więc na tej podstawie, a później pójdziemy do formuły
że będziesz używać do zmiany rzeczy Cezara,
tak, to w zasadzie, że będzie nieco inna formuła, czy to wielkie
w przeciwieństwie do małych liter. Ma sens?
Tak. Nie przejmuj się.
Rozmawiałem trochę o dodanie 6 do pisma, które nie dość sensu
wyjątkiem sytuacji, gdy rodzaj zrozumienia, że ​​te znaki
są rodzajem zamiennie z liczb całkowitych.
Co my możemy zrobić, to rodzaj wykorzystania ukrytych odlewania.
Pójdziemy do odlewania nieco później, gdzie wybrać się na wartość i przekształcić go w innego typu
niż pierwotnie było.
Ale z tego Pset będziemy mogli trochę zamiennie używać znaków
i odpowiadające im wartości całkowitych.
Więc jeśli po prostu wstawcie znak z zaledwie cudzysłowów pojedynczych,
wtedy będziesz mógł z nim pracować z liczbami całkowitymi, radzenia sobie z nim jako liczba całkowita.
Więc kapitał C odnosi się do 67. Mała litera f dotyczy 102.
Ponownie, jeśli chcesz wiedzieć, te wartości, spójrz na ASCII tabeli.
Więc chodźmy do niektórych przykładów jak może być w stanie odjąć, dodawanie,
jak rzeczywiście można naprawdę pracować z tymi postaciami, ich używać zamiennie.
Muszę powiedzieć, że ASCIIMath będzie obliczyć dodanie znaku do liczby całkowitej
, a następnie wyświetla się wynikowy charakter oraz wynikowy ASCII.
A więc mówię - we'll dotyczą tej części później -
ale w zasadzie, mówię, że użytkownik powinien powiedzieć uruchomić ASCIIMath wraz z kluczem,
i mówię że klucz będzie liczba
z którym mamy zamiar dodać ten znak.
Więc tutaj zauważyć, że ponieważ jestem wymagający klucza,
ponieważ jestem wymagający, że dajesz mi 1 rzecz,
Chcę tylko, aby zaakceptować. / Asciimath i klucz.
Więc wracam do żądania argc jest równe 2.
Jeśli nie jest, to ja zamierzam powrócić 1 i program zostanie zamknięty.
Więc mówię, klucz nie będzie pierwszy argument linii poleceń,
to będzie drugi, a jak widać tutaj,
Idę do kolei, że do liczby całkowitej.
Potem mam zamiar ustawić znak do r.
Należy zauważyć, że rodzaj zmiennej CHR faktycznie całkowitą.
Sposób, że jestem w stanie używać r jako liczba całkowita jest znacznikow to z tymi apostrofami.
Więc z powrotem do naszego printf gdzie mamy zastępczy dla znaku
a następnie zastępczy liczby całkowitej,
jest reprezentowany przez CHR, a jest liczbą całkowitą klucza.
I tak potem będziemy w wyniku dodać 2 razem.
Więc mamy zamiar dodać r + cokolwiek klucz,
a następnie jedziemy do wydrukować wynik tego.
Więc zróbmy asciimath. Jest na bieżąco, więc po prostu uruchomić asciimath.
Oh, ale widzisz, to nic nie robi, bo w rzeczywistości nie jest na klucz.
Tak więc, gdy tylko wrócił 1, naszym głównym funkcji, to po prostu wróciła do nas.
Więc niech przechodzą w kluczu. Ktoś dał mi numer. >> [Uczeń] 4.
4. Okay.
Więc r wzrosła o 4 ma dać nam v, która odpowiada wartości 118 ASCII.
Więc to trochę sens, że -
Właściwie, mogę zapytać, co o tym myślisz ASCII wartość r jest, jeśli r + 4 jest 118?
To tak, r 114.
Więc jeśli spojrzeć na ASCII tabeli wtedy, na pewno wystarczy, zobaczysz, że r jest reprezentowana przez 114.
Więc teraz, że wiemy, że możemy dodać liczby całkowite do znaków, to wydaje się dość prosta.
Jesteśmy po prostu będzie iterować ciąg jak widzieliśmy w przykładzie poprzednim.
Sprawdzimy, czy jest to list.
Jeśli tak jest, to będziemy przesuwać go w jakikolwiek klucz.
Całkiem proste, z wyjątkiem, gdy pojawi się w ten sposób,
widać, że z, reprezentowany przez 122, wtedy da ci inny charakter.
Naprawdę chcesz się zatrzymać w naszym alfabecie, tak?
Więc musimy wymyślić jakiś sposób rodzaj owijania wokół.
Po dotarciu zed i chcesz zwiększyć o pewną liczbę,
nie chcesz, aby przejść do sekcji poza ASCII alfabetu;
chcesz zawinąć z powrotem całą drogę do A.
Ale należy pamiętać, że wciąż zachowując sprawę.
Więc wiedząc, że listy nie może stać się symbolami
jak symbole nie będą się zmieniać, jak również.
W ostatnim Pset pewno nie trzeba,
ale opcja była wdrożyć swój chciwy Pset używając modułu funkcji.
Ale teraz jesteśmy rzeczywiście będzie trzeba użyć modułu,
więc po prostu przejść nad tym trochę mało.
Zasadniczo, gdy masz x modulo y, która daje resztę x podzielona przez y.
Oto kilka przykładów. Mamy 27% 15.
Zasadniczo, gdy odejmiemy 15 od 27 tyle razy, jak to możliwe bez uzyskania negatywnej
wtedy otrzymasz 12 pozostały.
Więc to jest trochę jak w kontekście matematyki, ale jak faktycznie możemy to wykorzystać?
To będzie przydatny dla naszej wrapover.
Do tego powiedzmy Poprosiłem was wszystkich podzielić na 3 grupy.
Czasami można to zrobić w grupach, i coś w tym stylu.
Powiedzieć, że powiedział: "Dobra, chcę, żebyście wszyscy dzielą się na 3".
Jak można to zrobić?
[Niesłyszalne odpowiedź uczeń] Tak, dokładnie. Odliczać. Okay.
Powiedzmy to w życie. Czy chcesz zacząć?
[OFF] licząc studentów 1, 2, 3, 4.
Ale pamiętaj ... >> [Uczeń] Oh, przepraszam.
To bardzo dobry punkt.
Mówiłeś, że 4, ale naprawdę chcemy Ci powiedzieć 1 ponieważ chcemy jedynie 3 grupy.
Tak więc, w jaki sposób - Nie, to jest bardzo dobry przykład, bo to w jaki sposób można powiedzieć, że 1?
Jaki jest związek między 4 i 1?
Cóż, 4 mod 3 jest 1.
Tak więc, jeśli w dalszym ciągu, by być 2.
Więc mieć 1, 2, 3, 1, 2.
Znowu jesteś rzeczywiście 5-gi osoba. Skąd wiesz, że do powiedzenia 2 zamiast 5?
Mówisz, 5 mod 3 jest 2.
Chcę zobaczyć, jak wiele grup 3 pozostałe pozostają wtedy kolejnosc am I.
I tak wtedy, jeśli będziemy kontynuować na całej sali,
wtedy widzimy, że zawsze jesteśmy w rzeczywistości zastosowanie funkcji mod do siebie
do rodzaju odliczać.
To bardziej rodzaj namacalny przykład tego, jak można użyć modulo
bo jestem pewien, że większość z nas zapewne już przez ten proces
gdzie musieliśmy liczyć się.
Wszelkie pytania dotyczące modulo?
To będzie bardzo ważne, aby zrozumieć pojęcia tego,
więc chcę się upewnić, wam zrozumieć.
[Uczeń] Jeśli nie ma reszta, to daje rzeczywistą liczbę?
Jeśli jeden z pierwszych 3 z nich to zrobił, to dałem im to, co rzeczywiście było,
albo w ogóle nie dałem im [niesłyszalne] >> To jest dobre pytanie.
Gdy nie ma reszta na modulo - tak, że masz 6 mod 3 -
faktycznie daje z powrotem 0.
Porozmawiamy o tym nieco później.
O tak, na przykład, 3 osoba - 3 mod 3 jest faktycznie 0 ale powiedziała 3.
Tak, że tak jakby połowu wewnętrznej, na przykład,
jak dobrze, jeśli mod jest 0 wtedy będę 3. osoba.
Ale my się do rodzaju, jak możemy mieć do czynienia z tym, co 0 później.
Więc teraz jakoś mają sposób mapowania zed do właściwej litery.
Więc teraz mamy przeszedł tych przykładach
my niby jak Cezar może działać.
Widzisz 2 alfabety, a potem zobaczyć je zmienia.
Warto więc spróbować i wyrazić, że pod względem wzoru.
Ta formuła jest faktycznie podawany w specyfikacji,
Ale spójrzmy prawdzie w rodzaju wyglądu przez co każda zmienna oznacza.
Nasz wynik końcowy będzie zaszyfrowany.
Więc to mówi, że i-ty znak z szyfrogramu
będzie odpowiadać ego charakteru jawnego.
To ma sens, bo chcemy być zawsze w kolejce tych rzeczy.
Więc to będzie ith charakter zaszyfrowany powiększonej k, który jest naszym kluczem -
to ma sens - i wtedy mamy ten mod 26.
Pamiętacie, kiedy mieliśmy zed
nie chcieliśmy dostać się do znaku, więc chcieliśmy to mod
i rodzaj zawinięcia alfabetu.
Po zed by udać się do a, b, c, d, dopóki nie dostał się do właściwej liczby.
Wiemy, że Zed jeśli + 6 dałoby F, ponieważ po Zed jest a, b, c, d, e, f.
Warto więc pamiętać, wiemy na pewno, że zed + 6 ma dać nam f.
W ASCII wartości, z jest 122 i f jest 102.
Więc musimy znaleźć jakiś sposób, że nasz wzór Caesar nam 102
po wykonaniu w 122.
Więc jeśli tylko zastosować tę formułę, ('z' + 6)% 26, że faktycznie daje 24
ponieważ 122 + 6 wynosi 128 128% 26 daje 24 resztę.
Ale to naprawdę nie znaczy f. To na pewno nie 102.
To również nie 6-te litery alfabetu.
Tak oczywiście, musimy mieć jakiś sposób szczypanie to trochę mało.
W kategoriach zwykłego alfabetu, wiemy, że z jest 26-list oraz f jest 6.
Ale jesteśmy w informatyce, więc idziemy do indeksu na 0.
Więc zamiast z jest liczbą 26, będziemy mówić, że to numer 25
, ponieważ jest 0.
Więc teraz niech stosuje tę formułę.
Mamy z reprezentowana przez 25 + 6, co daje 31.
Mod 26 i 31 daje 5 jak reszty.
To jest doskonałe, bo wiemy, że f jest 5 literą alfabetu.
Ale to nadal nie jest f, prawda? To nadal nie jest 102.
Tak więc w tym zbior, wyzwaniem będzie próbował dowiedzieć się relacji
między konwersji między tymi wartości ASCII a indeksem alfabetycznym.
Zasadniczo to, co będziesz chciał zrobić, chcesz zacząć z ASCII wartości,
ale chcesz się jakoś tłumaczyć, że w indeksie alfabetycznym
następnie obliczyć pismo powinno być - w zasadzie, co jej jest indeks alfabetyczny
charakteru szyfrów - wtedy tłumaczyć, że z powrotem do wartości ASCII.
Więc jeśli bicz swój ASCII tabeli, a następnie spróbować znaleźć relacje między, powiedzmy, 102 i 5
lub 122 i 25.
Otrzymaliśmy nasz klucz od argumentów wiersza poleceń, staliśmy zwykłego tekstu,
mamy zakodowane to.
Teraz wszystko, co pozostało do zrobienia jest wydrukowane.
Możemy to zrobić na kilka różnych sposobów.
Co możemy zrobić, jest faktycznie drukować jak iść.
Jak iteracyjne nad znaków w ciągu,
może po prostu wystarczy wydrukować prawo wtedy, gdy obliczenia.
Alternatywnie, można również zapisać je w tablicy i mieć tablicę znaków
i na koniec iteracji całej tej tablicy i wydrukować.
Więc masz kilka opcji do tego.
I pamiętaj, że% c będzie zastępczy do drukowania znak.
Więc nie mamy Cezara, a teraz przechodzimy do Vigenère
która jest bardzo podobna do Cezara, ale po prostu nieco bardziej skomplikowane.
Więc zasadniczo z Vigenère jest masz zamiar być przechodzącą w hasła.
Więc zamiast numeru, będziesz mieć ciąg,
i tak, że będzie działać jako hasła.
Potem, jak zwykle, masz zamiar się monit o ciąg od użytkownika
a następnie zaszyfrować go, a następnie dać im plecy szyfrogram.
Tak jak powiedziałem, to jest bardzo podobne do Cezara, z wyjątkiem zamiast przesuwania przez pewną liczbę,
liczba faktycznie się zmienić za każdym razem od znaku do znaku.
Który reprezentuje rzeczywistą liczbę do zmiany, jest reprezentowane przez litery na klawiaturze.
Więc jeśli wchodzi do przesunięcia, na przykład, to, że odpowiadają przesunięcia 0.
Więc to znowu powrót do indeksu alfabetycznego.
, Co może być przydatne, jeśli widzisz, że mamy do czynienia z rzeczywiście wartości ASCII
jak liter, jak również wskaźnik alfabetycznej
może znaleźć lub stworzyć własną tabelę ASCII pokazujący alfabetyczny indeks 0 do 25,
a do z, a wartości kodu ASCII, dzięki czemu można zobaczyć rodzaj relacji
i naszkicować i spróbować znaleźć jakieś wzory.
Podobnie, jeżeli były w pewnym przesunięcie przykład przez F -
i to jest albo małe lub wielkie f - wtedy, że odpowiadają 5.
Czy jesteśmy dobrze do tej pory?
Formuła Vigenère jest nieco inna.
Generalnie widać, że to jest jak Cezar,
chyba zamiast k mamy k indeksu j.
Zauważ, że nie używasz i. ponieważ zasadniczo na długość hasła
niekoniecznie jest długość naszego szyfrogramu.
To będzie nieco jaśniejszy, kiedy widzimy przykład, że mam trochę później.
Zasadniczo, jeśli uruchomić program z hasła z ohai,
to znaczy, że za każdym razem, ohai będzie Twoja zmiana.
Więc w zależności od jakiej pozycji jesteś w słowo kluczowe,
masz zamiar przenieś pewien charakter szyfrogram o tę kwotę.
Znowu, podobnie jak Cezar, chcemy się upewnić, że możemy zachować kapitalizację rzeczy
a my nie tylko litery zaszyfrować, znaki lub spacje.
Więc spojrzeć do Cezara od funkcji, które może być używane,
sposób, że zdecydowałeś, jak przenieść rzeczy, i że stosuje się do programu tutaj.
Więc mapować to.
Mamy tekst jawny, że dostaliśmy od użytkownika z getString
mówiąc: To ... CS50 jest!
Następnie mamy słowo kluczowe ohai.
Pierwsze 4 znaki są całkiem proste.
Wiemy, że T ma być przesunięty o,
następnie h zostanie przesunięty o godzinę, i ma być przesunięty.
Tutaj widać, że reprezentuje 0,
tak, to wartość końcowa jest właściwie tylko sama litera, jak wcześniej.
Wtedy s jest przesunięty i.
Ale wtedy masz te okresy tutaj.
Nie chcemy, aby zaszyfrować, że tak, to nie zmienimy go przez cokolwiek
i po prostu wydrukować okres bez zmian.
[Uczeń] I nie rozumiem, jak wiesz, że to jest przesunięty o - Gdzie - >> O, przepraszam.
Na górze tutaj widać, że linia poleceń ohai argumentem,
że to będzie kluczowe.
I tak w zasadzie, jesteś na rowerze w ciągu znaków w hasła.
[Uczeń] Więc o zostanie przesunięcie samo -
Więc o odpowiada pewnej liczby alfabetu.
[Uczeń] Racja. Ale skąd wziął się CS50 część z?
Oh. To w getString gdzie jesteś jak "Daj mi ciąg do zakodowania."
[Uczeń] Zamierzają dać ci ten argument do przeniesienia przez
i wtedy poprosić o pierwszym ciągu. >> Tak.
Więc kiedy uruchomisz program, oni będą zawierać słowo kluczowe
swoich argumentów wiersza poleceń, kiedy go uruchomić.
Potem, gdy już sprawdził, że oni rzeczywiście dał ci 1 i nie więcej, nie mniej,
następnie masz zamiar skłonić ich do łańcucha, powiedzieć: "Daj mi łańcuch."
Więc to, gdzie w tym przypadku dali Ci To ... CS50 jest!
Więc masz zamiar używać, i korzystać ohai i iteracyjne.
Zauważ, że tu pomijane szyfrowanie okresy,
ale z punktu widzenia naszej pozycji na ohai, jeden obok użyliśmy o.
W tym przypadku jest to trochę trudniejsze do zobaczenia bo to 4,
więc niech to nadal sporo. Wystarczy trzymać się ze mną tutaj.
Następnie mamy I i S, które następnie są tłumaczone przez o hi odpowiednio.
Następnie mamy miejsca, a tak to wiemy, że nie będzie zaszyfrować przestrzenie.
Ale zauważ, że zamiast do w tym miejscu właśnie tutaj,
mamy szyfrowanie przez - I nie wiem, czy widać, że - tu.
Więc to nie jest tak, jak rzeczywiście z góry ustalony, powiedzmy, o idzie tutaj, h idzie tutaj
przechodzi tutaj, idzie o, o, h, i, o, h, i. Nie rób tego.
Tylko przenieś swoją pozycję w kluczowych
gdy wiesz, że jesteś rzeczywiście będzie szyfrowanie rzeczywiste list.
Czy tego typu ma sens?
Okay.
Więc tylko kilka przypomnień.
Chcesz się upewnić, że tylko przejść do następnej litery w słowo kluczowe
jeśli znak w postaci zwykłego tekstu jest list.
Więc powiedzieć, że jesteśmy na o.
Zauważamy, że następny znak, indeks i na zwykły tekst, to numer, na przykład.
Wtedy nie awansować j, indeks dla naszego hasła, aż docieramy inną literę.
Znowu chcemy także upewnić się, że wraparound do początku hasła
gdy jesteś na koniec.
Jeśli widzisz tu jesteśmy na I następna ma być o.
Więc chcesz znaleźć jakiś sposób jest możliwość nawijania na początku słowo kluczowe
każdym razem, gdy do końca.
I znowu, jakie operator jest przydatny w tym przypadku do owijania wokół?
Podobnie jak w przykładzie off liczenia.
[Uczeń] znak procent. >> Tak, znak procent, co jest modulo.
Więc modulo będzie przydatna tutaj, jeśli chcesz, aby otoczyć się indeksu w ohai.
I tylko szybkie wskazówka: Spróbuj pomyśleć o owijanie na hasła trochę jak wyłączyć liczenie,
gdzie jeśli jest 3 grupy, 4. osoba,
ich liczba, że ​​że był 4 MOD 3, który wynosił 1.
Więc spróbuj i myśleć o tym w ten sposób.
Jak widzieliśmy w formule, gdziekolwiek mamy CI i potem pi ale kJ,
chcesz się upewnić, że śledzenie tych.
Nie musisz nazywać go i, nie trzeba to nazwać j,
ale chcesz się upewnić, że śledzenie pozycji, że jesteś na w postaci zwykłego tekstu
jak również na stanowisku, że jesteś na swoje hasło
bo te niekoniecznie będzie taki sam.
Nie tylko słowo - to może być zupełnie inna długość niż tekst.
Należy również pamiętać, plaintext, są cyfry i znaki,
więc to nie będzie idealnie dopasować się razem. Tak.
[Student] Czy jest funkcja, aby zmienić sprawę?
Można zmienić na kapitał A? >> Tak, tam na pewno jest.
Możesz sprawdzić - Wierzę, że to wszystko, toupper 1 słowo.
Ale kiedy próbujesz do szyfrowania rzeczy i zachować tekst,
to najlepiej po prostu mieć oddzielne przypadki.
Jeśli to jest wielkie, to chcesz przenieść przez to
ponieważ w formule, kiedy patrzę wstecz, jak mamy do rodzaju komórce
zamiennie pomiędzy ASCII sposobu przedstawiania liczb
i rzeczywisty indeks alfabetyczny, chcemy się upewnić,
tam będzie jakiś wzór, który masz zamiar używać.
Inna uwaga na wzór, faktycznie.
Będziesz na pewno do czynienia z liczbami.
Próby nie używać magiczne numerów, która jest przykładem stylu.
Więc mówisz, że chcesz każdego coś przesunięcia czasowego jak -
Ok, więc podpowiedź, inny spoiler jest, gdy masz zamiar być przesunięcie czegoś
pewną kwotą, staraj się nie oświadcza, że ​​przez rzeczywistą liczbę
ale spróbować i zobaczyć, czy można użyć wartość ASCII, który rodzaj bardziej sensowne.
Inna uwaga: Ponieważ mamy do czynienia z wzorami,
mimo że TF będzie rodzaj wiesz co wzór może być używany,
najlepszy w swoim rodzaju na uwagi wyjaśnić logikę, jak,
"Używam tego wzoru, bo ..." i rodzaj wzoru zwięźle wyjaśnić w swoich komentarzach.
[To solucja 2] Jeśli nie ma żadnych innych pytań, to ja po prostu zatrzymać się tu na chwilę.
Powodzenia Pset 2: i Crypto Dzięki za przyjście.
[Uczeń] Dziękuję. >> Dzięki.
[Media Offline intro]