[MUZYKI] DAVID MALAN: Wszystko w porządku. Jest CS50, a to jest koniec tygodnia 2. Tak mi przykro, że nie może być tam z tobą wszystkim dzisiaj, ale jesteś w dobrych rękach. Pozwolić mi przedstawić CS50 własnej Rob Bowden. ROB BOWDEN: I oczywiście, to mamy się śmiać z faktu, że wysłał nam pionowa wideo i pokazać to. [ODTWARZANIE] [MUZYKI] [Ślady] -Ten Film nie mają wyglądać w ten sposób. Może to było zapobiec. Powiedz nie pionowych filmów. -Vertical Filmy stanie, gdy ci przytrzymaj aparat w niewłaściwy sposób. Twój film będzie koniec wyglądać jak gówno. - [GRUNT] -Jest Coraz więcej osób uzależnionych do tworzenia pionowych filmy codziennie. To nie pęka i nic, ale nadal jest naprawdę źle. Istnieją dwa rodzaje ludzie, którzy są dotknięci VVS. Pierwsza grupa traktuje filmy strzelają jak zdjęcia. Nie oznacza to żadnej szkody. Oni po prostu nie rozumieją, że podczas gdy można obrócić obraz, naprawdę nie można włączyć wideo. [CRASH] - [MAŁPA SOUNDS] -The Druga grupa to ludzie, którzy nie dać [BLEEP]. -Vertical Syndrome wideo jest niebezpieczne. Filmów mają zawsze w pozycji poziomej. W ofercie telewizyjnej są poziome. Ekrany komputerowe są poziome. Ludziom oczy są poziome. Nie są przystosowane do oglądać pionowe filmy. -I Kocham pionowe filmy. -Nobody Troszczy się o ciebie. -Jeśli Ten problem na zlekceważenia, Ty też rozpocznie pokazując cztery filmy na raz tylko zaoszczędzić przepustowość. -Letterboxed Pionowe wideo będzie być wielkości znaczka pocztowego. -I To rozprzestrzenił się wszędzie. Ekrany mają zawsze w pozycji poziomej. Jeśli pionowe filmy stają się zaakceptowanych, kina będzie musiał być wysoki i chudy. -A Wszystkich kinach będzie muszą uzyskać zburzony i odbudowany. I do czasu, kiedy zostały odbudowane, Mila Kunis będzie stara i brzydka. -Birds Padnie na nich i umrzeć. -We'll Wszyscy się sztywne szyje od patrząc w górę. -I Nikt nie będzie siedzieć w przedni rząd nigdy. -George Lucas ponownie zwolnienie Gwiazda Wojny again-- wydanie chudy. -Ja Nigdy nie był naprawdę w stanie powiedzieć historia, którą chciałem opowiedzieć. To była dla mnie wielka szansa, aby eksperymentować z nową technologią. -Jesteś gnojkiem. -Co Razem, gdy urządzenie mobilne jest używany do nagrywanie wideo, pokusa jest tam. Po prostu powiedz nie. Powiedz nie George'a Lucasa. Powiedz nie starego Mila Kunis. Powiedz nie pionowych filmów. -A Jeśli zobaczysz, że ktoś robi to, powiedzmy, "nie jesteś fotografowania tego prawa manekina!" [MUZYKI] [Zakończyć odtwarzanie] [APPLAUSE] [AUDIO] ROB BOWDEN: --simple forma kryptografii, która jest w zasadzie kodowania i deszyfrowanie grypsów. Więc tutaj mamy bardzo prostą zabawkę. A pomysł jest pierścień zewnętrzny obraca się wokół wewnętrznego pierścienia. I widać, może gdybym powiększyć w, that-- trudno zobaczyć. Ale, podobnie jak liczba 1-- dobrze, że przeniósł. Numer 1 mapy do listu X, numer 2 mapy do listu J. Niezwykle trudne nie aby przejść do przodu. List 2 mapuje J. Numer 3 mapy do D. Tak z tego pierścienia można dać ktoś się komunikat 1, 2, 3. Z jakiegoś powodu chcesz powiedzieć im XJD. Ale można dać im niektóre wiadomości z numerów, i pod warunkiem, że ten pierścień ma one może odszyfrować, co próbujesz powiedzieć. Więc może widzieliście to Szczególnym przykładem kryptografii przed, czy wokół Bożego Narodzenia oglądałeś A Christmas Story. Jeśli nigdy wcześniej nie widział to przed, a potem po prostu włączyć TBS w dosłownie za każdym razem, w Wigilię Bożego Narodzenia, bo po prostu pokazać go z powrotem do tyłu z powrotem do tyłu do siebie przez cały dzień. I odpowiedni film jest taki. [ODTWARZANIE] -bE Wiadomo wszem i wobec, że Ralph Parker Niniejszym mianowany członkiem Little Orphan Annie Tajny Krąg i ma prawo do wszystkich zaszczytów i korzyści występujące niego. Podpisano Mała Orphan Annie. Kontrasygnaty Pierre Andre atramentem! Nagrody i korzyści już w wieku dziewięciu lat! [KRZYCZAŁ z radia] -Chodź Na. Chodźmy się z nim. Nie muszę cały ten jazz o przemytników i piratów. -listen Jutro w nocy z przygoda zawieranie Czarnej statek piracki. Teraz nadszedł czas na TAJNE Annie dla Ciebie członkowie Secret Circle. Pamiętaj dzieci, tylko członkowie Secret Annie Koła może rozszyfrować tajne wiadomości Annie. Pamiętaj, Annie zależy od Ciebie. Ustaw szpilki do B2. Oto wiadomość. 12. 11. 2. -Jestem W moim pierwszym tajnym spotkaniu. -25. 14. 11. 18. 16. Och, Pierre jest w wielkim dzisiaj głosu. Mógłbym powiedzieć, że dzisiejszy Przesłanie było naprawdę ważne. -3. 25. To wiadomość od Annie sama. Pamiętaj, nie mów nikomu. -Five Sekund później, jestem w jedynym pokój w domu, w którym chłopiec z dziewięciu może siedzieć w prywatność i dekodowania. Aha! B! Poszedłem do następnego. E. Pierwsze słowo to "być". S. Został on teraz przychodzi łatwiej. U. 25. To R. -Chodź Na, Ralphie! Muszę iść! -I'll Zaraz zejdzie, mamo! Gee świst. T. O. "Koniecznie" - upewnij się, że co? Co było Mała Orphan Annie chce powiedzieć? Upewnij się, że co? -Randy Musi odejść! Czy mógłbyś wyjść? -Wszystkie Porządku, mamo! Zaraz będę się! Byłem coraz bliżej. Napięcie było straszne. Co to było? Los planety może wisi na włosku! -Ralphie, Randy iść! -I'll Być prosto, na litość boską! Prawie na miejscu! Moje palce poleciał. Mój umysł był pułapką stali. Każda pora wibruje. To było niemal oczywiste! Tak. Tak. Tak. Tak. Pamiętaj, aby pić Ovaltine. Ovaltine? Za durny komercyjnych? Sukinsynem. [Zakończyć odtwarzanie] ROB BOWDEN: Więc tak Ovaltine dotyczy kryptografii. Zasadniczo CS50 tylko reklamowane Ovaltine, więc mogliśmy być kiepska handlowa dla Ovaltine. W porządku. Więc teraz rzeczywista informatyka. Pamiętaj poniedziałek skończyliśmy nurkowanie w głąb strun. Tak więc mamy do czynienia z ciąg "Zamyla." I byliśmy uznając fakt, że możemy traktować "Zamyla" jako ciąg znaków. I pamiętaj, że dowiedzieliśmy się, notacja uchwyt. Więc jeśli były przechowywane w ciąg "s", a następnie jeśli mówi s Uchwyt 0, które wskazać kapitału Z. się A jeśli mówi s uchwyt 1, które wskazywałyby pierwsze małe litery a, i tak dalej, aż do s wspornika 5, co oznaczałoby mógł. Pamiętaj, że Długość tego ciągu jest 6, ale indeksy w łańcuchu są 0 do 5, Z przez to trwać. Tak to się teraz pasuje do większego obrazu pamięci komputera, pamięci RAM. Więc gdzieś program, który używasz komputera należy pamiętać Zamyla gdzie w pamięci. Więc może mam ochotnika? Tak, proszę. A jak się nazywasz? DEAN: Dean. ROB BOWDEN: Dean? Miło cię poznać, Dean. Więc chodź tutaj, a będziemy mieć narysować na naszej miłej fajną układ pamięci. Teraz lubię myśleć pamięci jako jeden długi pas bajtów ale tylko dla celów wyświetlania że będziesz po prostu nie od lewej do prawej, od góry do dołu. OK? Więc mam zamiar pokazać program-- Getstrings.c. A więc wszystko, ten program jest robi prosi cztery struny od użytkownika z Druk GetString a następnie cokolwiek to pierwszy ciąg znaków wpisany był. Jesteśmy ignorując dwa przez cztery. OK. Więc tutaj now-- kiedy I pierwszy wniosek s1. Więc jesteś komputer. I implementowania getString. Więc poprosić o ciąg znaków z mnie, a ja mówię, OK, Dean. Podaj ciąg znaków "Dean". Więc gdzieś w pamięci, trzeba pamiętać "Dean". Więc napisać to w pamięci gdzieś. Doskonały. OK. Więc teraz mamy s2. I s2 będzie żądanie getString. Więc mam zamiar wprowadzić łańcuch. Mam zamiar wprowadzić "Hannah". Więc wpisz "Hannah" gdzieś w pamięci. Tak. A-H. OK, więc teraz s3. I to będzie kolejny żądać getString. A więc teraz wpisać "Maria". W porządku. I jest jeszcze jeden ostatni Żądanie getString, S4. Tak więc, nie wiem. Jak o idziemy z antidisestablishmentarianism. Więc podaj, że do pamięci. Tak. Więc po prostu zrobić "Rob". OK. Więc teraz explain-- dlaczego zostawić te miejsca? Dlaczego masz to pole puste Przestrzeń tutaj, tutaj i tutaj? Tak. Tak więc zauważyć, kiedy idę wydrukować s1-- więc jeśli miał "Hannah" running aż obok "Dean" skąd mamy wiedzieć, kiedy ciąg "Dean" się kończy? Więc drukowania s1 ciąg może mieć po prostu wydrukować "DeanHannahMariaRob" Jeśli nie ma żadnej wskazówki od kiedy "Dziekan" rzeczywiście się kończy. W porządku. Tak więc w pamięci, jak nam się właściwie reprezentowania tego końca łańcucha jest z backslashem zera. Więc to miejsce jest dokładnie to, co chcieliśmy. To powinien być odwrotny ukośnik zero. To będzie odwrotny ukośnik zero, i to będzie odwrotny ukośnik zero. I można mieć wspaniałe nagrody za to, że idealne wolontariuszy. Weź piłkę na stres! OK. Więc to znak backslash zero jak wskazują na koniec łańcucha. To jak, kiedy dany program chce drukować ciąg, Pamiętam, że to how-- dowiedzieliśmy Funkcja strlen zeszłym tygodniu? Długość łańcucha? To, jak długość ciągu jest w stanie określić, jak długo ciąg jest. To po prostu utrzymuje iteracji ciągu znaków dopóki nie znajdzie interpretacja odwrotnego ukośnika zerowy charakter. Tak więc ważne jest, aby uświadomić sobie, o znaku backslash zera jest to reprezentowane wszystkich zer w bitach. Tak więc zauważyć, że jest to odrębny od znaku zerowego. Więc znak zero, jeśli pamiętać, w przykładzie, który dał w celu wykładu, gdzie mapy znaków to-- jak mapy stolicy A do 65. Małe litery na mapy do 97. Małe litery b będzie 98. Tak więc liczba 0 mapy to-- nie mam wiem, od szczytu głowy. 44 lub 45. Gdzieś w tym regionie. Więc postać 0 jest rzeczywista liczba. Ale backslash zera mapy do wszystkich bitami zerowymi. Więc nie ma rozróżnienia między backslashem zerowej, które będziemy nazywać NUL. Istnieje różnica między backslash zero i znak zero. W porządku. Więc mówienie trochę więcej o strunach. Tak więc widzimy tutaj, to jak to być określone w pamięci. Więc ten pomysł strun jak sekwencja z characters-- więc oficjalnym komputer sciency określenie sekwencji jest tablicą. Więc my nazywamy ciąg tablica znaków. A tak naprawdę są inne dane Typy że możemy tablice z. Tak, aby motywować tym, spójrz na przykład. Nazwiemy go ages0.c będę skopiować i wkleić nasz szablon. OK. Tak więc w tym programie, co chcesz zrobić, to chwycić wiek trzech uczniów w toku. Więc wiemy, int age-- i teraz mam zamiar powiedzieć 0. Więc może chcesz powiedzieć age1, ale w celach zobaczymy wkrótce, Powiem int age0 równa GetInt. Więc tym samym wezwaniem do GetInt że używaliśmy I nie stało się monitowania mówiąc: "daj mi wiek." Ale właśnie o to prosi. I age1 równa GetInt. I int age2 równa GetInt. Tak więc raz jeszcze, trzech studentów, ale Ostatecznie zmienne indeksy są age0 przez age2. OK. Więc ten program zrobi wszystko chcemy z age0, age1 i age2, ale ten program ostatecznie działa na trzech studentów. OK. I co teraz, czy chcę czterech studentów? Cóż, mam zamiar wrócić do mojego kodu, zmienić komentarz, a teraz mamy int age3 równa GetInt. OK. Więc kto widzi problem tutaj? Jaki jest problem z tego rodzaju instalacji? Tak. Tak. Więc my tworząc Zmienna dla każdego ucznia. Teraz, że działa, ale ostatecznie Co jeśli teraz powiedzieć: "Chcę, aby pobrać wiek ośmiu studentów lub 16 uczniów czy to jednak wiele studentów setki studentów w CS50 lub tysiące studentów na kampusie lub miliardy ludzi na świecie? Więc w końcu to nie jest trwałe. Za każdym razem widzisz siebie kopiowania i wklejanie kodu tak, należy na ogół czują że istnieje lepszy sposób. Tak to jest, gdy wprowadzamy deklaracja tablicy. Więc kiedy zadeklarować tablicę, to jest to, co ogólnie Format będzie wyglądać. Jedziemy do powiedzenia typu. a następnie jedziemy do podać nazwę tej tablicy, jak możemy zdefiniować dowolną zmienną. I w końcu używamy Uchwyt ten zapis ponownie ale w innym kontekście, z jak używaliśmy go wcześniej. Więc tutaj to wygląda jak zwykły deklaracja zmiennej, które widzieliśmy. Tak więc widzieliśmy int x średnik przed. No to teraz możemy zobaczyć coś jak int x nawiasach 5. I wprowadzenie tego pomysłu w Program GetInt że have-- więc możemy realizować w ten sam sposób. Powiedzmy, że w CS mamy tendencję do korzystania n liczba czegoś. Więc tutaj mamy zamiar przechowywać czterech studentów. A teraz możemy powiedzieć, int wiek Uchwyt nie n-- dość dostać yet-- zadeklarować tablicę czterech studentów. Więc jak to będzie wyglądać w Pamięć jest podobna do tego. Jasne, tego. A my będziemy mieć gdzieś w memory-- będę tego znosić tam. Gdzieś w pamięci. Jeden dwa trzy cztery. Mamy cztery liczby całkowite z rzędu dla tego zestawu czterech liczb całkowitych. Tak więc, obecnie, co jest Rozmiar jednego z tych pól? Tak. To cztery bajty. Jest to 32 bitów. Więc teraz jest inaczej z matrycy, że widziałem wcześniej, tablicę znaków. W ciąg każde pole było tylko jeden bajt, bo postać jest tylko jeden bajt. Ale z tablicy liczb całkowitych, z których każda pole ma być cztery bajty w kolejności aby zmieścić cały całkowitą. Więc to jest to, co tablica cztery int będzie wyglądać. A następnie z powrotem do kodu. Teraz chcemy, aby rzeczywiście sklepu liczby całkowite do tej tablicy. Więc teraz jest to bardzo, bardzo, bardzo wspólny wzór, który będzie w pewnym momencie stać pamięci mięśniowej. Więc int i jest równa 0. i mniej niż n. ja plus plusem. Wiekowej i równa GetInt. Więc to dla pętli, ten format, należy się bardzo przyzwyczajeni. Tak to jest na ogół, jak będziemy iteracyjnego prawie każdą tablicę. Teraz zauważyć tego rodzaju wyjaśnia, dlaczego od początku nie mieliśmy do pętli będzie na int I wynosi 1, i mniej niż lub równa się 10. Wynika to z faktu, że od zera sprawia, że ​​działają dobrze z tablic. Więc tablice są indeksowane zera. Jeśli ta tablica ma długość 4, indeksy są 0 do 3. Więc po pierwsze iteracja to dla pętli jedziemy do ustawiania wiek Uchwyt 0 równa wywołanie GetInt. Więc co mi się stało wprowadzić z klawiatury. W drugim przebiegu, jesteśmy ustawienie age1 równa GetInt. Trzeci przebieg, age2. Ostatni przebieg age3. Jeśli więc w pierwszym przebiegu pętli I wprowadzić numer 4 na klawiaturze, Potem włóż 4 tutaj. Jeśli przy drugim przejściu mi wejść 50, będziemy umieścić 50 tutaj. Na trzecim przejściu mógłbym wprowadzić ujemne 1, negatywne 1, i wreszcie, jeśli wejdę 0-- i teraz pamiętam, że to był wskaźnik trzy. Po pętla tyłu, i jest ma być zwiększona do 4. i nie jest mniejsze od n, które jest 4. I możemy wyrwać się z pętli. Więc co byłoby w tym złego? [Niesłyszalne]? PUBLICZNOŚCI: [niesłyszalne] Tak. Więc tablica ma tylko cztery miejsca, co oznacza w indeksach 0 do 3. Więc jeśli tak było, że tak przyjąć wartość 4 w pewnym momencie. wiekowej 4 będzie ustawienie co dzieje się tutaj do tego, co mam do powiedzenia, wprowadź 6. To będzie ustawienie to 6. Ale nie wiemy, co jest tutaj. To nie jest pamięcią że mieliśmy dostęp. Więc jeśli pamiętamy z poprzedni wykład, był drukowanie wartości Zamyla i w pewnym momencie uderzył tej segmentacji przyczepić. Więc prawdopodobnie będziesz widzieć wiele błędów segmentacji jak Ciebie wykonania niektórych zestawów problemowych. Jednak jest to jeden ze sposobów, w którym można napotkać segmentacji winy, po uruchomieniu dostępu pamięci w taki sposób, że nie powinno być. Więc nie ma dostępu do to miejsce i to jest błąd. Więc to jest lepsze. Teraz nie jest jeszcze mały Problem z tym kodem. I to w zasadzie, że jesteśmy nadal tkwi w czterech studentów. Teraz, jeśli chcę użyć ośmiu studentów, OK. To nie jest nic wielkiego. Mogę iść, zmienić komentarz i zmień n. Teraz to będzie działać z ośmiu studentów. Jeśli mogę skompilować to i uruchomić to, to pokaże me-- będzie żądać całkowitymi dla ośmiu uczniowie i będzie po prostu pracować. Ale to mniej niż idealne trzeba rekompilacji programu za każdym razem Chcę zmienić liczbę studentów że chcę wprowadzić w wieku do. Tak więc końcowa ulepszeniem to, jak zobaczymy here-- jesteśmy zamierza zwrócić się do liczby osób. Tutaj mamy kilka osób w pokojach lub jakiekolwiek wiek osób w pokoju. Ale mamy zamiar zwrócić się do liczby osób w pokoju od użytkownika. Więc to jest dokładnie to samo zrób podczas Pętla, które widzieliśmy wcześniej. To dokładnie to samo do-while, że może być wdrożenie na planie problemów. Tak długo, jak są one Wprowadzanie n mniejszy od 1, więc nie musi być w najmniej jedna osoba w pokoju. Tak długo, jak są one Wprowadzanie n mniejszy od 1, wtedy będziemy prosić ponownie. Proszę podać numer osób w pokoju. Teraz, kiedy mamy numer osób w room-- więc mogę podać, że nie 200 osób w tym pokoju. Potem tu mamy zamiar przyjść i zadeklarować tablicę o rozmiarze 200. Jesteśmy deklarowania tablicę, która jest wystarczająco duży, aby pomieścić 200 wieki. Jadąc w dół, to jest to dla pętli że będzie się bardzo przyzwyczajeni. Więc iteracji po tej tablicy, przypisanie do każdej lokalizacji w tej tablicy liczbą całkowitą, a następnie ostatecznie tutaj jesteśmy tylko coraz przykład iteracji na tej tablicy, aby nie przypisywać wartości, ale aby uzyskać dostęp do wartości. Więc tutaj widzimy, że mówią, za rok, Osoba% i będzie% i lat, gdzie pierwsza% i jest i plus 1. Więc jest to indeks zmiennej. A drugi% i ma być Wartość przechowywana w tablicy wieków plus 1. Więc to plus 1 to tylko dlatego, że jesteśmy saying-- ten plus 1, w wieku ja plus 1. To plus 1 to tylko dlatego, że jesteśmy mówiąc, za rok osoby będzie to stare. Więc dlaczego tak jest i plus 1? Dlaczego mamy plus 1 nie? Tak. Tak. Więc pamiętaj, tablice są indeksowane zera. Jeśli więc są to drukowanie na ktoś po prostu przeczytać wyjście to prawdopodobnie chcą zobaczyć coś jak osoby, jeden, osoba numer jeden, będzie 20 lat. Numer osoby dwa będzie 15 lat. Oni raczej nie widzieć osobę Numer zerowy ma 15 lat. Więc kompilacji to i po prostu zobaczyć, co wygląda like-- Tworzenie trochę miejsca. Sprawdź, w wieku kompilację. Uruchamianie wieku. Widzimy liczby osób w pokoju. Więc powiem nie ma trzy osoby w pokoju. Wiek osoby numer jeden, powiedzmy, 15, 20, 25. A teraz powiem za rok teraz będą 16, 21, 26. Zobaczmy, że to działa z n nie jest równa 3. Więc jeśli powiem, liczba osób to 5, jeden, dwa, trzy, dwa, jeden, za rok oni będą dwa, trzy, cztery, trzy, dwa lata. Więc mogłem tak łatwo n będzie 10.000. Teraz będę siedział tu dość chwili wejścia w wieku, ale to działa. Więc teraz w pamięci gdzieś mamy tablicę wielkości 10000, więc ostatecznie 40000 bajty, ponieważ istnieją cztery bajty dla każdego z tych liczb. Więc jest tablica Rozmiar 10000, gdzie się da przechowywać w wieku od tych 10.000 osób. W porządku. Pytania o coś z tego? Tak. Co zrobić, jeśli dał liczbę ujemną? Zobaczmy co się stanie. Tak więc w tym konkretnym numerem case-- osób w pokoju, negatywny. Odrzucił że bo się tu stało do obchodzenia się z tym, że gdy n jest mniej niż jednej mamy zamiar zapytać ponownie. Jeśli spróbujesz zadeklarować szereg negatywnych wielkości, na ogół nie działa. Więc spróbujmy. Zignorujmy co Wartość ich wejście dla n i po prostu powiedzieć int wieku od negatywny. Zobaczymy, czy nawet kompiluje. Nie jestem pewien. Nie. Więc wieku jest zadeklarowana jako Tablica z ujemnym wielkości. Więc z góry uznaje tablica nie może mieć negatywny wielkości i odrzuca ją. Teraz, jeśli nie obsługiwać to do-while poprawnie, jeśli nie sprawdzali gdy n jest mniejsze niż 1-- Powiedzmy, że po prostu nie ma tego w ogóle i zamiast po prostu złapać liczbę całkowitą. Bez względu na to, że liczba całkowita jest, deklarujemy tablicę tej wielkości. Więc kompilator nie może ewentualnie narzekać teraz. Jeśli mogę skompilować this-- więc nie mogę narzekać, ponieważ nie może wiedzieć, że jestem zamierza wprowadzić liczbę ujemną, co może być nieprawidłowy. Dla wszystkich, że wie, że może Wprowadź liczbę dodatnią, która jest w pełni uzasadniona. Więc wyobraźcie sobie, że wejdę ujemne 1 osób w pokoju, segmentacja winy. Więc ok. Warto więc dodać to powrót po prostu zachować to, co pierwotnie było. Tak aby wieku. Teraz, jeśli chcę spróbować negatywne age-- więc niech powiedzieć, że pięć osób w pokoju. Wiek osoby numer jeden jest ujemna 4, osoba, trzy jest zero, osoba three-- OK. Więc tutaj, za rok, liczba osób jeden będzie negatywna 3 lat. Więc chyba nie ma sensu. Ale to tylko dlatego, że poszukuje w kodzie wszystko robimy żąda GetInt. Teraz, jeśli nie miał Funkcja GetPositiveInt czy my po prostu zrobił to rodzaj samej pętli tam, wtedy to będzie działać perfekcyjnie. Jednak w tym konkretnym przypadek, po prostu nie stało się obsługi wartości ujemne. Wszelkie inne pytania na temat tablic? OK. Więc my teraz widać tablice. I mamy zamiar trzeba użyć to dla argumentów wiersza poleceń. Więc problemu ustawić two-- Wiem, że wielu z was może być nadal pracuje na planie problemu jeden, ale problemem ustawić dwa nadjeżdża. W problemu ustawić dwa, będziesz muszą mieć do czynienia z smyczki, tablic, i argumenty wiersza polecenia. Więc jakie są argumenty wiersza poleceń? Teraz można zobaczyć w dół tutaj mała zapowiedź na dokładnie to, co jest będzie działo. Widzimy int main, INC argc, wsporniki ciąg ARGV. Więc najpierw spróbujmy zinterpretować co to próbuje powiedzieć. Teraz dobrze. Więc w linii poleceń powinno być przyzwyczaić się do niektórych z tych poleceń teraz, i to prawdopodobnie uruchomić cd w terminalu przed. Więc jeśli mówimy cd pset1, wiesz, że powinien być zmiany w katalogu pset1. Teraz zauważyć, że nigdy nie napisany program, jak to wcześniej. Każdy z programów, które zostały napisane, chcesz uruchomić, powiedzmy, dot slash Mario, Dot slash chciwy, a następnie go Może poprosi o wejściu. Teraz, to nie to, co katalog zmiana robi. Po uruchomieniu płyty CD, to nie ma to znaczy, który katalog chcesz cd się? Zamiast tego, po prostu powiedzieć, cd pset1 i to po prostu idzie do katalogu pset1. Podobnie więc mamy inne przykłady. aby przywitać. Po uruchomieniu zrobić, to nie ma to znaczy, program, który chcesz zrobić? Wystarczy powiedzieć, u Wiersz polecenia, aby przywitać. Move jest kolejnym przykładem. Ten jesteśmy przesuwając mario.c złożyć maksymalnie jeden katalog. Więc teraz wiemy o tym przykładzie tak naprawdę przechodzi dwa argumenty. Jest mario.c jako pierwszy argument, a dot dot jest drugi argument. A potem, kiedy uruchomić zrobić, ty zobaczyć, że naprawdę dużo polecenie line-- że naprawdę długo polecenie drukowane w linii poleceń. Więc tak długo command-- tego znajduje się w niewielkiej części, ale teraz mamy trzy argumenty wiersza polecenia. Dot Dash zero, witam, i hello.c. To są wiersza polecenia argumenty, argumenty że jesteś przechodzącej przez Wiersz polecenia, tak aby nie muszą być poproszony po uruchomieniu programu. Byłoby to frustrujące, jeżeli podczas uruchomiłeś Clang to powiedział: "OK, które program-- które Plik ty kompilacji? Hello.c. Co flagi prawda jak wejść? kreska o. Co byś chciał plik nazywać? Halo. Nie, po prostu uruchomić szczęk kreska o powitania hello.c. Więc patrząc na to. Teraz argc-- argc to liczy argumentów. Jest to liczba linii poleceń Argumenty wprowadzone w wierszu poleceń. Cóż, argv-- technicznie v oznacza wektor, co w zasadzie oznacza tablicę. Ale można to zignorować. Argv-- mamy ciąg argv, tak wsporniki ciąg ARGV. Więc to jest inna forma wsporników jeszcze nie widział. Tak więc widzieliśmy Wspornik Zapis, gdy mówiliśmy, jak, łańcuch s równa Zamyla. s Uchwyt 0 uzyskuje dostęp do Z. znaków Mamy również postrzegane wsporniki, gdy powiedzieliśmy int wiek wspornika 5. Deklarowanej tablicę wielkości 5. Więc tutaj jest to wersja Uchwyty nie widzieliśmy wcześniej. Więc ten rodzaj strun argv, że byłoby całkowicie zaznajomiony że byłoby to po prostu ciąg. Teraz nawiasy wskazują, że to jest tablicą. Więc wsporniki ciąg ARGV środki że argv jest tablicą łańcuchów. Teraz technicznie ciąg jest tablicą znaków. Więc to jest teraz tablica z szeregu znaków. Ale jest dużo łatwiej myśleć o to jako po prostu tablica łańcuchów. Dlaczego więc może być puste nawiasy? Jak, dlaczego nie możemy powiedzieć, Wspornik 5, wspornik n? Tak. Tak. Nie wiemy, ile Wejścia tam będą. Więc jeśli spojrzymy na brzękiem przykład mówimy brzękiem kreskę o witam hello.c. W tym konkretnym przypadku, nie stało za trzy argumenty wiersza polecenia. I tak brackets-- zobaczymy w drugim nie będzie trzy. To technicznie będzie cztery. Ale nawiasy, że będzie powiedzmy, są trzy. Ale teraz, gdy patrzyliśmy na ruch mario.c dot dot wsporniki chcielibyśmy umieścić dwa w nich. I istnieje wiele poleceń, które mają zmienną liczbę linii poleceń argumenty. Więc co to wersja z Zapis uchwyt wskazuje jest to, że argv jest tablicą łańcuchów. Ale nie wiemy, jak wiele łańcuchy są w tej tablicy. A jak mamy to wiedzieć, jak wiele ciągi są w tablicy? To cały punkt argc. argc mówi nam, jak długo argv jest. Więc ostatnią rzeczą, aby Umysł jest to, że, technicznie, Samo polecenie liczy się jako jeden z argumentów wiersza poleceń. Więc cd pset1, istnieją dwa argumenty wiersza polecenia. Program sam w sobie, cd, a następnie Część rzeczywista Argument o tym, pset1. Każdy program, który napisałeś do tej pory miał jednego wiersza polecenia argument-- kropkę slash Mario. To jest jedyny argument wiersza poleceń. Więc teraz, patrząc na brzękiem kreska o powitania hello.c. Więc co jest argc? 4. Więc argc jest 4. Szczęk, więc argv Uchwyt 0 jest brzęk. argv Wspornik 1 jest kreska 0. argv uchwyt 2 jest cześć, i argv Uchwyt 3 jest hello.c. Ok, więc pytania dotyczące tego, a wtedy spojrzeć na niektórych programowych przykładów. OK. Będziemy więc przyjrzeć hello3.c. Więc to powinien zapoznać się z jeden z pierwszych przykładów c mieliśmy gdzie chcemy tylko powiedzieć, hello świecie, ale teraz to jest bardziej ogólne. Więc tutaj mówimy komentarzy % s odwrotny ukośnik n Uchwyt argv 1. Notice-- więc aż do tego punktu, to jest co mój szablon nie wyglądał. Miałem int main (void), a następnie chciałbym zrobić coś w głównej funkcji. Teraz zamiast raz zaczniemy czynienia z argumentów wiersza poleceń, musimy członkowskim A inna forma głównym. Więc patrząc na hello3 kolejny główny idzie wziąć dwa argumenty int argc now--, liczba argumentów wiersza poleceń, i łańcuch argv nawiasach, rzeczywista struny wpisana w wierszu poleceń. Więc mam zamiar to zmienić Szablon odzwierciedlać ten fakt. Teraz, kiedy piszesz program, jeśli nie trzeba podejmować żadnych wiersza polecenia argumenty, a potem po prostu użyć int main (void). Ale teraz, kiedy piszesz programy argumentów wiersza polecenia, które masz zamiar robić dla problemu ustawić two-- więc teraz, że używasz programy, które należy podjąć, Argumenty wiersza polecenia, trzeba mieć Głównym tego formularza. Więc here-- to jest duże zużycie argumentu wiersza poleceń. Więc drukowania argv 1. OK, więc niech to skompilować i uruchomić program. Bądź hello3. Kompiluje. Dot slash hello3. I powiedzmy, "Rob". Witaj Rob. Jeśli powiem "Cześć Maria" Cześć Maria. Witaj Maria. Hannah wciąż mówi "cześć Maria ", bo nie jestem cokolwiek z naszej argv 2. Argv 2 teraz będzie "Hannah". Argc będzie 3. A gdybym to zrobił? Więc witam zerowy. Na krótko poruszył fakt, że, technicznie, GetString może zwrócić null, ale musimy dostać wiele więcej do jakiej wartości null w rzeczywistości. Ale się go jako przedmiot Fakt, że nie jest na ogół złe. Zrobiliśmy coś złego, jeśli to drukowanie "cześć zerowy". A powód zrobiliśmy coś nie tak jest-- dobrze, kiedy wpadłem dot slash hello3, argc było 1. To oznacza długość argv to 1. Jeśli tablica jest o długości 1, tylko ważne indeksu jest zero. A więc o argv 1 jest poza zakres tej tablicy. To było podobne do wcześniej, kiedy próbowałem przechowywanie 6 poza koniec tablicy. Więc staram się uzyskać dostęp do czegoś poza liczbą argv, i jesteśmy coraz zerowy. Więc lepsza wersja tego, poprawa, jest wyraźnie sprawdzenie argc. Więc jeśli argc jest równy 2, co oznacza, że ​​prowadziliśmy coś jak kropka ukośnik hello3 Roba. I będzie drukować "witaj Rob". Jeśli argc nie równa 2, to jest to po prostu będzie zignorować cokolwiek umieścić na argument wiersza poleceń jako argumenty wiersza poleceń. Albo jeśli nie umieścić w ogóle, to po prostu się do tego zignorować i po prostu powiedzieć, "cześć." Więc kompilacji tego. Bądź hello4. I działa hello4. Działa to w ten sposób, co powinno być drukowane? "Cześć." Cześć. Co hello4 Rob? "Witaj Rob". I wreszcie, witaj Rob Maria jest po prostu "cześć You" ponownie, dlatego, że tak naprawdę nie wejść coś, co go oczekuje. Wprowadzono kilka nazw niż może obsłużyć, więc po prostu domyślnie Hello Ci zachowanie. Tak więc pytania dotyczące tego? Lub argumenty wiersza polecenia? OK, więc rzucić okiem na Kilka innych przykładów wykorzystania wiersza polecenia arguments-- pierwszy mamy argv kreska 1 kropka c. Więc komentarze oddać to, co ten program powinien robić. Ale zauważmy now-- to dla pętli, to odpowiada dokładnie wzór Mówiłem wcześniej. Po prostu stało się Używanie ARGC zamiast n. Teraz argc jest naprawdę n. Jest to długość tablicy argv. Więc są iteracji nad argv Tablica printf-ing każdą wartość argv. Więc jeśli zrobię to. Bądź argv 1. Kompiluje. Dot slash argv 1. Podobnie działa to go druki dot slash argv 1 ponieważ był to jedyny wiersza polecenia argument-- nazwę programu. Nie zawsze będzie przynajmniej: argc nie może być mniejszy niż jeden, ponieważ nie zawsze będzie co najmniej być nazwa programu do uruchomienia. Więc argv 1 Rob będzie drukować argv 1 a następnie na nowej linii "Rob". Tak więc w pierwszej iteracji z tej pętli i 0. Argv 0 jest nazwa programu. Dot slash argv 1. A potem argv 1 jest mój pierwszy Argument wiersza polecenia, które jest Rob. W tym momencie jesteśmy równe argc. Mamy wyjść z pętli i gotowe. Więc to będzie działać na dowolnym liczba argumentów wiersza poleceń. Zauważ, drukuje argv 0, argv 1, argv 2, argv 3, argv 4. I nie ma argv 5. argc wynosi 5. Więc w argc-- się i równa się 5, wyjdziemy z pętli. OK. Więc pytania, że ​​zanim spojrzeć na bardziej złożony przykład? Więc argv 2. W porządku. Więc my wciąż drukowania argumenty wiersza polecenia. Ale teraz zauważyć mamy zagnieżdżonych pętli. Więc co to robi? Tak więc pierwsza pętla robi dokładnie to, co przedtem. Wciąż pętli na każdy argument wiersza poleceń, ale teraz ten drugi loop-- mamy też widziałem coś takiego wcześniej. Kiedy został iteracji po Zamyla drukowania Z-A-m-Y-L-A. Więc to druga pętla dla Int J równa 0, n wynosi strlen wspornika argv i. Więc najpierw pomyśleć o the-- niech przejść. Pomyślmy, co komputer będzie zrobił, gdybym prowadził ten program, jak tylko kropka slash argv Dash 2. Więc gdybym prowadził ten kod, a następnie argc będzie równa 1. I ciąg argv-- jest tylko będzie jeden indeks w argv, i że będzie równa kropka slash argv 2-- nazwę programu. OK, więc teraz ja równa się 0, i mniej niż 1, i także plus dla int j jest równa 0, n wynosi strlen wspornika argv 0, to w pierwszej iteracji tej pętli. argv Uchwyt 0 jest kropka ukośnik argv 2. Więc jaka jest długość tego łańcucha? Cóż, kropka slash A-R-G-V Dash 2. Tak strlen tego będzie 8. Więc j jest równa 0, n jest równa 8. Tak długo, jak j wynosi mniej niż 8, j ++. A z tym, że będziemy mieć drukowania pojedynczy znak, który jest argv uchwyt i wspornik j. Tak więc tylko i jest zero. Mamy jeszcze tylko jeden Argument wiersza polecenia. W pierwszej iteracji z pętli for my będzie drukowanie Uchwyt Uchwyt 0 argv 0. A potem j zamierza zwiększyć. I jedziemy do druku argv Uchwyt 0 Wspornik 1. A potem argv Uchwyt 0 wspornika 2. Więc to jest nasze pierwsze spotkanie tablic wielowymiarowych. Pamiętaj wcześniej, że powiedziałem że argv jest technicznie tablica tablic znaków. Więc gdybym powiedział coś takiego łańcuch s równa wspornik argv i, a potem powiedział, s uchwyt j, to byłoby realizacji tego samego. Teraz, widziałeś s uchwytu j wcześniej. To tylko dostęp do j-tego charakter tego łańcucha. Więc z tego, że otrzymujesz j-tego charakter i-tego argv. Co więc należy to ostatecznie wyjście? Bądź argv 2. Kompiluje. Dot slash argv 2. "Rob Maria Anna" i dać nam pokój. Widzimy więc, że jest to wyprowadzanie kropka na własnej linii i ukośnik z własnej linii i na własnej linii. To drukowania każdego indywidualny charakter każdego argumentu wiersza poleceń. A następnie pomiędzy nimi ze względu na nową linię mamy do drukowania tutaj, w między nimi, będzie to wydrukować nową linię. Tak więc jest to podobne do przeor argv kreska 1, które drukowane każdego Argument wiersza poleceń, ale teraz mamy do drukowania argumenty wiersza polecenia a następnie iteracja każdego charakter każdego argumentu wiersza poleceń otrzymaj wyjście. OK? Tak więc pytania dotyczące tego? Należy zwrócić uwagę, że wiersza polecenia arguments-- więc są one oddzielone spacjami jak byś naturalnie oczekiwać, że będą. Tak więc ciąg może mieć miejsca w nim. To nie jest bardzo ważne, ale jeśli chciał trzeci argument wiersza poleceń mieć miejsce w nim, a następnie I mógł powiedzieć coś takiego. OK? Tak to teraz jeszcze tylko trzy wiersza polecenia arguments-- oraz 4. Dot slash argv kreska 2, Rob, Maria, i Hannah Bloomberg. OK. Pytania w tej sprawie? Nie ma nic specjalnego o charakterze kosmicznym. To po prostu zdarza się, że wiersza poleceń traktuje spacji w jaki sposób oddzielić każdy argument. W porządku. Tak więc zestaw problem two-- masz zamiar być patrząc na tajnej kryptografii. Tak więc, podobnie do tego przykładu widzieliśmy od A Christmas Story, idziesz do realizacji niektórych algorytmy, że podane wiadomości, masz zamiar być w stanie zaszyfrować tę wiadomość że tylko ktoś o tej tajemnicy Klucz, z tym pierścieniem dekodera powinna być w stanie odszyfrować. Tak, że to standard edition. Idziesz do realizacji dwie różne wersje. Jeśli zdarzy ci się przyjrzeć w haker Wersja profesjonalna teraz mamy zamiar dać Ci ciąg tak, co oznacza zaszyfrowane hasło. Tak więc twoim celem jest, aby dowiedzieć się, co rozszyfrowane hasło. Teraz jest to faktycznie how hasła przechowywane są w wielu komputerach i po prostu przechowuje to losowy ciąg znaków. Musisz dowiedzieć się, jak uzyskać z tego losowego ciągu znaków do tego, co oryginalne hasło było. I wreszcie, po tym Zestaw problemu, należy być w stanie zrozumieć, co to oznacza. Więc dowiesz się jak odszyfrować ten rodzaj losowego ciągu znaków. Podobnie, jeśli pamiętasz z tygodnia 0, może widzieliście ten adres. I powinieneś być w stanie odszyfrować to ostatecznie. Może nie być szczęśliwy, kiedy odszyfrować go i kliknij na link. W porządku. To wszystko na dzisiaj. Tak więc do zobaczenia w przyszłym tygodniu! [Electronic Music Playing]