[MUZYKA GRA] David J. MALAN: Wszystko w porządku. Jest CS50, a to Jest koniec tygodnia 2. Więc dzisiaj, jedziemy kontynuować wygląd w jaki sposób przedstawiają rzeczy pod hood-- odejście z numerów, takich jak liczby całkowite i zmiennoprzecinkowych i koncentrując się na strunach i ostatecznie bardziej interesujące programy. Ale my też przyjrzeć Kilka specyficznych problems-- domeny z których pierwszy, być udziałem kryptografii, Sztuka kodowania informacji, , w którym można zobaczyć powyżej tutaj Jest to obraz Radio Orphan Annie Sekret pierścień dekoder z przeszłości. To jest rzeczywiście bardzo prymitywne formy i przyjazny dla dzieci postać z cryptopgraphy przy czym ten pierścień ma dwa disks-- jeden wewnątrz i jeden na zewnątrz. I obracając jedną z tych, można zasadniczo wyrównać litery jak -Z z innymi literami jak B do A. Innymi słowy można dosłownie obraca się alfabetu, a tym samym zbliża się z mapowaniem z litery do litery, tak że, jeśli chciał wysłać tajną wiadomość do kogoś takiego jak Annie, można napisać w dół wiadomości, a następnie obrócić litery, przy czym, jeśli masz na myśli powiedzieć "A", to zamiast powiedzieć "B", chcesz powiedzieć "B", Ci, zamiast powiedzieć, "C" - lub coś bardziej sprytna niż that-- i ostatecznie tak długo jak ma to dekoder Annie pierścień, ona może dekodować wiadomość. Teraz, być może pamiętasz, w rzeczywistości, że ten zastosowano w bardzo atrakcyjnej powłoki, która ad podczas odgrywa nauseum Bożego Narodzenia. Rzućmy okiem tutaj. Ralphie Parker: "Czy to Wszystkie znane w skrócie że Ralph Parker zostaje mianowany członkiem Little Orphan Annie Tajemnicy Okrąg i ma prawo do wszystkich zaszczyty i korzyści występujące do niej. " Ralphie Parker (narrację): Podpisano Mała Orphan Annie. Kontrasygnaty, Pierre Andre! Atramentem. Zaszczytów i korzyści, już w wieku dziewięciu lat. [MUZYKA GRA] [RADIO paplanina] Ralphie Parker: Chodź. Zabierzmy się za to. Nie potrzebuję All That Jazz o przemytników i piratów. Spiker radiowy: Słuchaj jutro noc dla przygody końcowej The Black Pirate Ship. Teraz nadszedł czas na Annie Sekret dla ciebie wiadomość członków Secret Circle. Pamiętaj, dzieci, tylko członkowie z Annie Secret Circle może dekodować tajną wiadomość Annie. Pamiętaj, Annie zależy od Ciebie. Ustaw szpilki do B-2. Oto message-- 12, 11, 2-- Ralphie Parker (narrację): I jestem w moim pierwszym tajnym spotkaniu. Spiker radiowy: --25, 14, 11, 18, 16-- Ralphie Parker (narrację): Och, Pierre był w wielkiej dziś głosu. Mógłbym powiedzieć, że dzisiaj jest Wiadomość była bardzo ważna. Spiker radiowy: --3, 25. To wiadomość z Annie sama. Pamiętaj, nie mów nikomu. [Dysząc] Ralphie Parker (narrację): Dziewięćdziesiąt sekund później, jestem w jedynym pokoju w Dom, w którym chłopiec z dziewięciu może siedzieć w prywatność i dekodowania. Ah. "B." [Chichocze] Ralphie Parker (narrację): Poszedłem do następnego. "E." Pierwsze słowo to "być". Tak! To było teraz nadchodzi łatwiej. "U." [Chichocze] RANDY PARKER: Daj spokój, Ralphie. Muszę iść! Ralphie Parker: Zaraz będę się, mamo. Gee świst. "T." "O." "Upewnij się, się. "" Pamiętaj, aby: "Co? Jaki był mały Orphan Annie chce powiedzieć? "Upewnij się, że" co z tego? MATKA: Ralphie, Randy musi odejść. Czy możesz wyjść? Ralphie Parker: Wszystko w porządku, mamo! Zaraz będę się! Ralphie Parker (narrację): Byłem coraz bliżej teraz. Napięcie było straszne. Co to było? Los planety może zawiesić w bilansie. MATKA: Ralphie, Randy ma się udać! Ralphie Parker: Zaraz będę się, na litość boską! Ralphie Parker (Narrację): Prawie tam! Moje palce poleciał! Mój umysł był pułapką stali. Każda pora drga. To było prawie jasne! Tak! Tak! Tak! Tak! Ralphie Parker: "Pamiętaj, pić swoją Ovaltine. " Ovaltine? Kiepska reklama? [MUZYKA GRA] Ralphie Parker: Skurwysyn. [LAUGHING] David J. MALAN: Tak, że to jest spojrzenie na jakim kryptografii może być dla To-- a pić z przeszłości. Tak szybkie ogłoszenie. Jeśli jesteś wolny, to Piątek o godzinie 13:15 i będzie jak do nas dołączyć na CS50 obiad, udać się do tego adresu URL tutaj. Kto pierwszy, służyć jak zwykle. Ale z biegiem czasu, będziemy mieć pewność, że Najbardziej ktoś, którzy chcieliby wziąć udział może zaplanować mądry. Więc ciągi. Mamy Zamyla-- kogo już teraz spotkał się najprawdopodobniej Problem Zestaw 1-- w których nazwisko jest pisane w ten sposób. I załóżmy, że jej imię wpisane do programu komputerowego, który jest przy użyciu coś jak getString. W celu odzyskania te skróty klawiszowe, jak idziemy o reprezentowanie ciąg, słowo, ustęp, lub kilka liter, takie jak te tutaj? Rozmawialiśmy ostatnio o liczby całkowite i problemy które wynikają z liczby całkowitej przepełnienie i zmiennoprzecinkowych i problemy, które pojawiają się w ciągu precyzją. Z tekstem, że co najmniej mają nieco większą elastyczność bo Strings-- tylko w rzeczywistym world-- może być dość dowolna długość. Dość krótki, bardzo długo. Ale nawet wtedy, będziemy okaże się, że komputery mogą czasami zabrakło pamięci i nawet nie przechowywać wystarczająco duży ciąg. Ale teraz, zacznijmy wyobrażać ciąg jako coś w tych polach tutaj. Tak więc sześć tego rodzaju pudła, z których każda oznacza znak lub "char". Więc przypomnieć, że "char" - c-h--r-- jest jeden z wbudowanych typów danych w C I co miłe jest to, że można użyć tego rodzaju jako element, kawałek układanki, jeśli chcesz, aby utworzyć większy typ danych, które będziemy kontynuować wywołać "string". Teraz, co jest przydatne, o myślenie o takie rzeczy jak struny w ten sposób? Cóż, okazuje się, że możemy właściwie wykorzystać tę strukturę faktycznie dostęp do pojedynczych znaków w dość prosty sposób. Mam zamiar iść do przodu i tworzyć Plik o nazwie "stringzero.c" ale można nazwać to, co chcesz. Oraz na stronie internetowej kursu jest Już wcześniej w tym przykładzie, więc nie musisz się wpisz wszystkiego. I mam zamiar iść do przodu i najpierw zrobić int main pustkę. I w ciągu kilku dni, zaczniemy drażnić siebie co nieważne jest tutaj, dlaczego to int obok głównego, i tak dalej. Ale teraz, niech nadal skopiować wklej to. Mam zamiar zadeklarować ciąg nazwie s. I mam zamiar wrócić z GetString cokolwiek użytkownik wpisze. To będzie prosty Program, żadne instrukcje, Idę na oślep Spodziewam się, że użytkownik wie, co zrobić, aby nie komplikować. A teraz mam zamiar mieć do pętli. I wewnątrz mojej pętli for jestem będzie mieć int i dostaje zero. I ja jest, ponownie, po prostu konwencja, indeks zmiennej do liczenia, ale mogę nazwać to, co chcę. Mam zamiar zrobić i jest mniejsze niż: a Nazwa Zamyla jest długa sześć liter. Więc mam zamiar ciężko Kod, który jest teraz. A potem i ++. A teraz w środku z nich kręcone szelki Zamierzam zrobić printf, i chcę, aby wydrukować jedną literze. Więc mam zamiar wykorzystać% c na Może raz. A potem chcę wydrukować każdy postaci własnej linii. Więc mam zamiar umieścić trochę backslash n istnieje. Zamknij cytatu. A teraz chcę zrobić coś tutaj. Chcę wydrukować określonej litery w łańcuchu, e, jak ja iteracji od zera do sześciu. Innymi słowy, chcę wydrukować i'th charakter s. Teraz w jaki sposób można to zrobić? Oraz podobnie jak w pudełkach reprezentacja tutaj, rodzaj, wyczarować pojęcia boks litery, można podobnie zrobić składniowo w C po prostu określenie, Chcę wydrukować s: i'th charakteru. Korzystanie z nawiasów kwadratowych na klawiaturze komputera że na klawiaturze są USA ogólnie powyżej klucza powrotną. Więc to jest nie tak Jednak, jak można zauważyć. Ale mam zamiar rodzaju ślepo posunąć się naprzód tutaj. I mam zamiar zrobić, aby ciąg 0. Ale zanim to zrobisz, zobaczmy, czy możemy Nie można przewidzieć kilka typowych błędów. Czy to będzie skompilować? Nie, brakuje mi całą masę rzeczy. Biblioteki słyszałem. Więc, które pliki nagłówka Mógłbym dodać tutaj? Tak. PUBLICZNOŚCI: Musisz Standard I / O [niesłyszalne] David J. MALAN: Doskonały. Więc muszę Standardowe we / wy. Za to, co Celem chcę Standard I / O? Dla printf. Więc to stdio.h. I ty również zaproponować, że to Biblioteka CS50 z jakiego powodu? Mieć łańcuchy. Więc zobaczymy co Biblioteka CS50 jest robić do stworzenia tego pojęcia łańcucha. Ale teraz można tylko myśleć o nim jako o rzeczywistym typie danych. Tak, że wydaje się być trochę posprzątać. A teraz mam zamiar iść do przodu i rzeczywiście robią ciąg 0. Skompilowany. Tak, to jest dobre. Więc ./string0 pozwól mi przybliżyć więc możemy zobacz więcej ściśle, co się dzieje. Enter. Z--Y-M-L-wejść. I mamy wydrukowane nazwy Zamyla za. Więc to jest bardzo dobre. Teraz idziemy do przodu i ponownie uruchomić ten program, i wpisz się pełną nazwę Daven za. Niespodzianka, niespodzianka. Enter. Hmm. My nie drukowane Daven na pełne imię poprawnie. Teraz powinno być oczywiste retrospect powodu tego, co, rodzaj, głupie decyzje projektowe? Tak, trudno kodowane sześć wewnątrz mój pętli. Teraz zrobiłem to tylko dlatego, Wiedziałem, że w imię Zamyla to będzie sześć liter. Ale na pewno nie jest to ogólne rozwiązanie. Tak więc okazuje się, że można dynamicznie dowiedzieć się długość łańcucha przez wywołanie funkcji o nazwie strlen. Ponownie, celowo zwięźle nazwany po prostu aby uczynić go bardziej wygodne do pisania. Ale to jest synonimem się długość łańcucha. Mam zamiar wrócić do mojego terminalu okno i ponownie uruchomić kompilatora. Ale to na mnie krzyczeć. Niejawnie deklarowania funkcji biblioteki strlen z typu int const-- Jestem zagubiony. Całkowicie. Tak, zwłaszcza w swojej oczy zaczynają szkliwo komunikaty o błędach, takich jak ta, ostrości szczerze na kilka pierwszych słów. Wiemy, że problem jest w Linia 8, jak wskazano tutaj. I to jest w sznurek 0.c. Pośrednio oświadczając Funkcja biblioteki strlen. Tak, że będą się na ogół być wzór komunikatów o błędach. Niejawnie deklarując coś. Tak w skrócie, to, co wydawało się, że mają zrobili w stosunku do linii 8, tutaj. Co może być jeszcze rozwiązanie jeśli nigdy nie używane strlen siebie? PUBLICZNOŚCI: Część z innej biblioteki? David J. MALAN: Część innej bibliotece. Więc to jest zadeklarowana, że ​​tak powiem. Jest on wymieniony w jakimś pliku inne niż stdio.h i CS50.h. Teraz, gdy jest to określone? Aby być uczciwym, trzeba albo po prostu wiem to od szczytu głowy, lub google to i się dowiedzieć. Czy wiedzą o tym, jakie otworzyły się w CS50 Urządzanie program terminala, który jest po prostu duży, pełny ekran z wersją co znajduje się w dolnej części okna gedit jest. I okazuje się, że nie podobnie lakoniczne polecenie, zwany Człowiek do instrukcji, gdzie po wpisaniu w nazwa funkcji i naciśnij klawisz Enter, dostaniesz z powrotem dość Arcane dokumentacji. To jest tylko tekst, który zazwyczaj wygląda trochę coś takiego. To trochę przytłaczające na pierwszy rzut oka. Ale szczerze mówiąc mam zamiar niech moje oczy błyszczą i skupić się tylko na części Zależy mi na chwilę. Co jest tego. Która wygląda jak strukturalnie coś mi znać. Rzeczywiście strona człowieka, tak mówić, powie w jakim pliku funkcję nagłówka jak strlen jest zdefiniowany. Więc mam zamiar wrócić teraz do gedit. I mam zamiar iść do przodu i dodaj tutaj include i zapisz plik. Zamierzam wyczyścić ekran z Kontrola P Jeśli już zastanawiasz. I mam zamiar ponownie uruchomić make string.0, kompiluje ten czas. ./string.0 Zamyla. Wydawało się, że do pracy Pozwól mi odejść przed i uruchom go z Davenport. Enter. I to też wydawało się do pracy. Tak więc możemy zrobić to trochę lepiej niż, choć możemy zacząć sprzątać rzeczy się tylko trochę. I mam zamiar faktycznie wprowadzić jedną rzecz teraz. Mam zamiar iść do przodu i zapisać to w innym pliku. I mam zamiar zadzwonić Właśnie ten plik string1.c jest zgodny z kodem będzie można znaleźć w Internecie. I skupmy się na dokładnie takie same kodu. Okazuje się, że mam był rodzaj podejmowania za pewnik faktu, że moim laptopie, a to z kolei, urządzenie CS50 ma dużo pamięci, dużo RAM, dużo bajtów przestrzeni , w którym można przechowywać ciągi. Ale rzeczywistość, jeśli wpisane długo wystarczająco dużo, i wystarczająco dużo klawiszy, Mogłem w rodzaju teorii w więcej znaków niż mojego komputera fizycznie posiada pamięć. I jest problematyczne. Podobnie jak int może tylko Liczba tak wysoka, teoretycznie można tylko dopchać tyle znaków do pamięci RAM komputera w dowolnej kolejności Dostępu do pamięci. Więc lepiej przewidywać ten problem, nawet choć może to być rzadkie Sprawa rogu, że tak powiem. Nie zdarza się, że często może się zdarzyć. A jeśli to się dzieje, a ja nie przewidywania i program do niego, mój program może robić, co kto wie. Zamrażać, powiesić, restart, cokolwiek. Coś Przewiduje może się zdarzyć. Więc co mam zrobić teraz, od tej pory tak naprawdę, I nigdy nie jest ślepo przed użyć zmiennej jak s, które została przypisana wartość zwracaną niektóre inne funkcje jak getString, Mam zamiar upewnić się, , że jego wartość jest prawidłowa. Tak wiem tylko ze po przeczytaniu Dokumentacja CS50 dla getString, co ostatecznie będziemy punktu, w, że zwraca szczególną getString symbol nazwie BRAK, N-U-P-P W sumie czapki, jeśli coś pójdzie nie tak. Tak normalnie, to zwraca łańcuch. Ale w przeciwnym razie, jeśli zwraca N-U-L-ja-- my w końcu zobaczyć, co to naprawdę means-- To oznacza, że coś złego się stało. Teraz oznacza to, podobnie jak na początku, Mogę sprawdzić stan tutaj w C, jeżeli S nie równy NULL. Więc jeśli nie widziałem tego wcześniej, Oznacza to po prostu nie ma sobie równych. Więc to jest przeciwieństwem równe równe, co pamiętam, różni się od pojedynczego równa, co jest przypisanie. Tak więc, jeśli y jest różny NULL, dopiero potem zrobić Chcę, aby wykonać te linie kodu. Tak więc, innymi słowy, Zanim zabierzesz się ślepo i rozpocząć iteracji powyżej s i traktując jakby to sekwencją znaków, mam zamiar najpierw sprawdzić, Chwileczkę, to na pewno nie s równa tej szczególnej wartości NULL? Bo jeśli tak, złe rzeczy mogą się zdarzyć. A teraz załóżmy, że złe rzeczy dzieje oznacza, awarii programu, i nie można zawsze odzyskać. Tak szczerze mówiąc, wygląda brzydsze. To trochę mylące teraz spojrzeć na. Będzie to jednak bardziej znać wkrótce. Ale mam zamiar zaproponować teraz jedna poprawa. To poprawa do poprawności. Mój program jest bardziej poprawne, ponieważ w rzadkich przypadkach, że mało pamięci istnieje, będę go obsługiwać, a ja po prostu nic nie robić. Ja przynajmniej nie padnie. Ale zróbmy ostateczną wersję. I plik o nazwie string2.c. Mam zamiar wkleić że sam kod na chwilę, i mam zamiar podkreślić to linia 11, tutaj, na chwilę. Teraz rzeczywistość jest, że inteligentne kompilatory jak Clang może naprawić to dla nas za kulisami bez naszej wiedząc. Ale pomyślmy o tym zasadniczo jako problematycznego projektu. Ta linia kodu jest, oczywiście, mówiąc: zainicjować jakąś zmienną i do 0. To całkiem proste. I znów jest to, co Oświadczenie, o, i ++, robi? Widzieliśmy to już wcześniej, ale tak naprawdę nie o tym mówić. PUBLICZNOŚCI: Zwiększanie i. David J. MALAN: Zwiększanie i. Tak na każdej iteracji poprzez to pętla, w każdym cyklu, jesteś zwiększając I o jeden. Więc robi się coraz większy i większy, i większe, aż pętla kończy. Jak to rozwiązać? Dobrze jest ten środkowy warunek, który używaliśmy wcześniej. Widziałeś w solucje w zestawie P. Ale co to powiedzenie? Wykonaj następującą pętlę tak długo, jak jest mniej niż co? PUBLICZNOŚCI: długość łańcucha. David J. MALAN: długość łańcucha. Tak to tłumaczy dość czysto język angielski w tym sensie. Teraz problemem jest to, że za każdym razem kiedy iteracji tej pętli w teorii, Pytam to pytanie. Jest i mniej niż długość łańcucha S? Jest i mniej niż długość łańcucha S? Teraz jest i zmienia się na każdej iteracji? Jest. Ze względu na ++. Więc każdej iteracji i jest coraz większe. Ale to s coraz większe, lub mniejsze lub w ogóle zmienia? Nie Tak pod względem wzornictwa, jednej z osi wzdłuż której staramy się ocenić kod w klasie, to czuje się trochę głupio. Jak jesteś dosłownie, na każdej iteracji z tej pętli prośbą cholera znowu to samo pytanie, i znowu, i znowu, i dosłownie to nigdy się nie zmieni. Przynajmniej, jeśli nie jestem dotykając s i stara się zmienić zawartość s. Więc można zrobić trochę lepiej. I co mam zamiar zrobić, nie jest zadeklarować tylko jedną zmienną i, ale druga zmienna będę arbitralnie, ale tradycyjnie, nazywają to n. Przypisać n równa Długość ciąg s. A następnie tutaj, będę zrobić sprytny mały optymalizacji, tak mówić, że na koniec dnia prawidłowe lub nie więcej nie mniej poprawne jest niż wcześniej. Ale to lepsze projektowanie. W tym, że używam mniej czasu, mniej cykli procesora, więc mówić, aby odpowiedzieć na to samo pytanie, ale tylko raz. Wszelkie pytania dotyczące tego generała Zasada poprawy, powiedzieć, efektywność danego programu? Tak? PUBLICZNOŚCI: Dlaczego użyj [niesłyszalne]? David J. MALAN: Dobre pytanie. Dlaczego więc umieścić ++ na koniec I zamiast początek I? W tym przypadku ma brak wpływu funkcjonalny. A w ogóle, to mają tendencję do użyć operatora postfix więc, że jest to trochę bardziej jasne, jak kiedy operacja się dzieje. Dla tych nieznane, istnieje inna Oświadczenia w którym można zrobić ++ i. Są to funkcjonalnie w tym przypadku równoważne bo nie ma nic innego wokół tego zwiększania wartości. Ale można wymyślić przypadki i linie kodu , w którym robi różnicę. Tak ogólnie, nie mamy nawet mówić o tym. Bo szczerze mówiąc, to sprawia, że Kod bardziej seksownego i rodzaju płaszcz, i mniej znaków. Ale rzeczywistość jest to dużo trudniejsze, Myślę, że nawet dla mnie, by zakończyć swój umysł wokół niego czasami, kolejność operacji. Tak na marginesie, jeśli Naprawdę nie podoba mi się to, mimo, że jest to rodzaj sexy patrząc, można to zrobić również i + = 1, który jest efektowna wersja sam pomysł na Postfix zwiększania wartości. Mówię to i was powinna zabawy, ale przyjdziesz zobaczyć kod, jak coś pięknego przed długo. [Śmiech] David J. MALAN: Prawda? Tak. Pytanie w środku. PUBLICZNOŚCI: Czy chcesz powiedzieć, int n? David J. MALAN: Robisz nie trzeba powiedzieć int n. Tak dlatego, że już powiedziałem int, nie trzeba powiedzieć to jeszcze raz. Połów jest, że n musi są dane tego samego typu, jak i. Tak, że po prostu wygoda tutaj. Tak. PUBLICZNOŚCI: Czy można przejść Uchwyt wydrukować bohatera s ponownie? David J. MALAN: Absolutnie. Tak% c, przypominam od ostatniego czas, jest tylko symbolem zastępczym. Oznacza to umieścić char tutaj. backslash n, oczywiście, po prostu środki umieścić tutaj podział wiersza. Tak, że po prostu odchodzi, teraz, ten kawałek nowej składni. I to jest dosłownie mówiąc, grab ciąg nazywa ów i przejdź się jej charakter i'th, że tak powiem. I powtarzają charakter i'th ponieważ na każdej iteracji pętli To tak, jakbyśmy drukowania po pierwsze a wspornik 0, jako programista może powiedzieć. Następnie s wspornik 1, a następnie s Uchwyt 2, a następnie 3, po czym dodano 4. Ale oczywiście to jest zmienna, więc po prostu wyrazić to, i. Kluczem jest jednak to, aby zdać sobie sprawę, zwłaszcza jeśli nie mam zostały acclimating do tego świata programowania, w którym wszyscy wydają się liczyć od zera, musi zaczynają się od zera, teraz. Because smyczki, pierwszy znak, oo, w Zamyla jest na lepsze lub na gorsze będzie żył na numer miejsca zerowego. W porządku, więc pozwól mi przynieść nas z powrotem do Zamyla i zobaczyć, co się naprawdę dzieje pod powierzchnią okapu. Więc jest to pojęcie typu odlewu. Możesz mieć faktycznie grał z tym już, może dla hakera edycja P ustawione. Ale typ odlewu dotyczy tylko umiejętność w C i innych języków konwersji danych jednego typu do drugiego. Teraz, jak możemy to zobaczyć całkiem wprost? Więc to, wycofanie, jest początkiem z alfabetu angielskiego. I kontekst, przypomnieć, od jak tydzień temu jest ASCII. Amerykański Standard Code do wymiany informacji. Który jest po prostu bardzo długa droga mówić mapowanie z literami do liczb, a od liczb do liter. Więc przez M tutaj, DOT DOT kropki, linie się z, wycofanie, liczbę dziesiętną 65 na górę. I nie mów o tym wyraźnie, ale na pewno nie jest podobna numery za małe litery. I rzeczywiście, istnieją. Świat postanowił kilka lat temu, że mało, małe litery, będzie 97. I mały b będzie jako 98, i tak dalej. I dla każdego innego klawisza na klawiatura, nie będzie podobny wzór bitów. Lub równoważnie, liczba dziesiętna. Więc pytanie pod ręką, Następnie, jest to, jak możemy faktycznie zobaczyć to pod maską? Więc mam zamiar pójść do gedit ponownie. I zamiast typu to jedna z podstaw, Mam zamiar iść do przodu i wystarczy otworzyć coś z dzisiejszego kodu zwany ASCII zera. I ASCII zera wygląda tak. Więc nasze umysły owinąć wokół tego. Więc po pierwsze, ja skomentował Kod, który jest miły. Bo to dosłownie mówi mi, czego się spodziewać, wyświetlić odwzorowanie dla wielkich liter. Teraz nie bardzo wiem, co mam przez to na myśli, więc niech to wywnioskować. W języku angielskim, może nieco technika angielski, linia 18, co wydaje się nie się robi dla nas? Tylko linia 18. Co to wywoływania? Co idzie skopać tutaj? PUBLICZNOŚCI: pętla. David J. MALAN: pętla. A ile razy jest że będzie iteracyjne? PUBLICZNOŚCI: [wstawienie GŁOSÓW] sześć razy. David J. MALAN: Nie sześć razy. PUBLICZNOŚCI: 26 razy. David J. MALAN: 26 razy. Tak, przepraszam. 26 razy. Dlaczego? Dobrze, że to trochę dziwne, ale Zacząłem liczyć od 65. Co jest dziwne, ale nie jest źle. To nie jest złe na powiedzieć. I robię, że tylko bo, na ten przykład, Jestem rodzaju przewidywanie że kapitał był 65. Teraz nie jest to najbardziej eleganckie sposobem na to, aby rodzaj dysku kodu wartości ezoteryczne, że nikt nie się nie spodziewał, aby pamiętać. Ale teraz, zauważysz, że jestem robi się przez 65 Plus 26. Bo podobno nawet nie chcą zrobić arytmetykę w głowie. Więc dam kompilator zrobić. Ale wtedy na każdej pętli, każda iteracja pętli, mam zwiększając i. Tak teraz wygląda to trochę tajemnicze. Ale powinniśmy mieć podstawową budynku bloki z których to zrozumieć. % C jest tylko symbolem zastępczym char. % I jest symbolem zastępczym dla wew. I okazuje się, że za pomocą tego Nowa składnia, ten nawias, więc mówić, więc typ danych wewnątrz nawiasów, Mogę zmusić kompilator do leczenia I nie jest liczbą całkowitą, ale jako char. Co pokazuje mi znak równoważne z tym numerem. Teraz tu, to kod jest prawie identyczna. Chciałem tylko, aby Fakt bardzo wyraźny że zaczynam na 97, który jest małe litery. Na górę przez 26 więcej liter. A ja doing-- ponownie, odlewania i, że tak powiem. Lub wpisz odlewania i, że tak powiem. Z int do char. Tak więc efekt końcowy będzie, szczerze mówiąc, informacja już wiemy. Mam zamiar zrobić ASCII-0 nie dot-- kropka c. Zauważ, że można zapewne błąd jak ja po prostu nie przypadkowo. Dodać ASCII 0. Teraz mam zamiar zrobić ./ascii-0. Będę powiększyć, i niestety to będzie przewijać się na ekranie. Ale widzimy cały schemat gdzie mapy do 97, b mapy do 98, i jeśli przewinąć dalej Oczywiście, mapy do 65. Więc jest to tylko powiedzieć, że co byliśmy głosząc, Równoważność ta nie jest, jest W rzeczywistości w przypadku rzeczywistości. Tak więc szybkie zmiany tego. Pozwól mi otworzyć ASCII 1.C. Ten sprytny i zauważyć, sortowania o wyjaśnienie tego. To jest ASCII-1.c i zauważyć tego szalonego. I to naprawdę robi się do serca z tego, co robią komputery. Mimo, że my, ludzie, byłoby Nie liczyć się względem letters-- Nie mam zacząć myśleć, wszystko w porządku, a następnie b, i używać tych liczyć obiektów fizycznych. Można oczywiście powiedzieć, że chcę zainicjować jakąś zmienną C-- ale może nazwałem to anything-- więc c jest inicjowany kapitałowej A. Bo na koniec dnia, w komputerze nie obchodzi mnie, co ty przechowywania, to tylko zależy, jak chcesz przedstawienia tych informacji. Jak chcesz komputer do interpretacji tego wzoru bitów? Więc to nie jest coś, co na ogół to polecam. To naprawdę tylko przykład do przekazać, że można całkowicie zainicjować liczbę całkowitą do char. Ponieważ pod kaptur z char, oczywiście, tylko liczbę od 0 do 255. Z pewnością można więc umieścić go wewnątrz int. I co to też pokazuje, że my można konwertować z jednego typu do innego, tutaj, ostatecznie drukowanie samo. A w rzeczywistości, to będzie to naprawić online-- miał powiedzieć, znowu tutaj. Pozwól mi to posprzątać w Internecie, a my zobacz w przewodniku internetowym, ile potrzeba, co miało na nie. OK. Więc teraz udziałem ostatni przykład A i B i wtedy będziemy wziąć się w garść. Tak więc z tych i B i c w kapitalizacji i ich równoważności, niech spojrzeć na ten przykład tutaj. Kolejny przykład kodu. Będziemy otworzyć taki, który jest już wykonane, więc nie trzeba go wpisać wszystko się od podstaw. I zauważyć, w oczekiwaniu używamy wielu nagłówek plików, z których to nasz nowy przyjaciel, string.h. Teraz to wygląda, na pierwszy spojrzenie, trochę tajemnicze. Ale zobaczmy, czy nie możemy rozumować przez to, co się tutaj dzieje. Pierwszy pojawia się ciąg od użytkownika, i umieścić ten ciąg w zmiennej zwane s. Kopiuj wklej od wcześniej. W linii 22, jestem widocznie robi dokładnie to, co Zrobiłem przed chwilą, jestem iteracji ciągu znaków s. Oraz nowe triki są tu za pomocą długość łańcucha, niewielka optymalizacja przechowywania długość ciągu w N, raczej niż dzwonienie ponownie strlen, i znowu, i znowu. I po prostu sprawdzenie, czy i jest mniejsze od n. Teraz tutaj, robi się mało interesujące. Ale to tylko aplikacja z tej samej nowej idei. Co robi w angielski s uchwyt i reprezentują? PUBLICZNOŚCI: Liczenie każdego znak [niesłyszalne]. David J. MALAN: Liczenie każdy znak. I jeszcze bardziej zwięźle, s uchwyt i reprezentują co? Czy można powiedzieć. Aby nie narazić Cię na miejscu tutaj. PUBLICZNOŚCI: Well-- David J. MALAN: Więc jeśli słowo jest-- jeśli Ciąg Zamyla, które starts-- PUBLICZNOŚCI: --you czynienia z znaki separately-- David J. MALAN: Dobra. Dokładnie. Notacji nawias kwadratowy pozwala aby uzyskać dostęp do każdego znaku indywidualnie, tak e wspornik 0 będzie Pierwszy znak w ciągu. s Uchwyt 1 będzie Po drugie, i tak dalej. Więc pytanie Pytam, tu, w tym stanie jest co? Czy i'th charakter ów Wielkopolski niż lub równa na małe? A co to znaczy, tutaj, z podwójnymi znaków handlowego? Wszystkich (razem): I. David J. MALAN: I. To jest po prostu odpowiednikiem tego. I nie jest to słowo kluczowe w C, trzeba Zastosowanie, irytująco, Ampersand Ampersand. I to, i odwrotnie, jest pytaniem jest y na i'th charakteru mniejsza lub równa na małe litery z? I znowu, oto gdzie zrozumienie podstawowa Wdrożenie Komputer ma sens. Zauważ, że, mimo że mam kropka kropka kropka tam, wygląda do z małymi literami są wszystkie wartości sąsiadujących up od 97 wzwyż. I sam na wielkie litery, począwszy od 65. Więc na wynos, a następnie, jest to, że w języku angielskim, Jak opisałbyś Linia 24 jest, co robi? Tak? PUBLICZNOŚCI: W dniu 24 to sprawdzając czy każda postać jest małe. David J. MALAN: To sprawdzenie, czy każdy znak jest małą literą. Więc jeszcze bardziej zwięźle, jest i'th charakter s małymi literami? To wszystko, co mamy wyrażania tutaj logicznie, trochę tajemniczo, ale ostatecznie całkiem wprost. Czy s na i'th postaci małej litery? Jeśli tak, a tu, gdzie wszystko trochę umysł gięcia na chwilę, jeśli tak, przejdź do przodu i wydrukować znak. Więc jest to tylko symbol zastępczy, ale jaki charakter? Dlaczego to robię y wspornik I minus to wyrażenie tutaj? Również zauważyć wzór tutaj. Rzeczywiste liczby nie mają znaczenia tak dużo. Ale zauważ, że 97 jest jak daleko od 65? PUBLICZNOŚCI: 32. David J. MALAN: 32. Jak daleko jest 98 od 66? PUBLICZNOŚCI: 32. David J. MALAN: Mała c z wielkim C? 32. Więc jest 32 chmielu z jedną literę do drugiego. Tak szczerze mówiąc, może uprościć to do tego. Ale to ja jestem niby twardy kodowania Ten niski poziom zrozumienia że nigdy nie jest czytnik zrozumie. Więc będę uogólniać go jak ja wiem małe litery są większe. Wiem, że litery są mniejsze wartości, jak na ironię. Jest to jednak skutecznie równoważna mówiąc odjąć 32 od S wspornika i. Tak więc w ramach niniejszego liter, jeśli litery dzieje się, małe , i odjąć 32, jaki wpływ to ma, matematycznie, na małe litery? PUBLICZNOŚCI: Capitalizes-- David J. MALAN: aktywuje go. I rzeczywiście, to dlaczego nasze Program nazywa się wykorzystać zero. Ten program albo aktywuje do nas, Po sprawdzeniu, czy jest rzeczywiście mała litera. W przeciwnym razie, w linii 30, co zrobić, jeśli to nie jest mała litera, że ​​jestem patrząc w szczególności iteracji w pętli. Wystarczy go wydrukować. Więc nie zmieniają rzeczy to nie jest nawet małe. Ograniczyć się do Trochę przez trochę z. Teraz jest to dość zaawansowanych. A na koniec dnia, to to w jaki sposób, raz po raz, miał do wykonania rzeczy. Gdybym zamiast otworzyć wykorzystać jeden, oh dzięki Bogu. Jest to funkcja nazywa się górna, które mogą zrobić wszystko, co po prostu nie na stosunkowo niskim poziomie. Teraz do górnej ciekawe ponieważ jest zadeklarowana w pliku, i nie wiesz, że to tylko przez sprawdzenie dokumentacji, i powiedziano nam, powiedzmy, w klasie, w której istnieje, w pliku o nazwie ctype.h. Tak więc jest to kolejny nowy nasz przyjaciel. I robi dokładnie górna , co sugeruje jego nazwa. Możesz przekazać w, jako argument, między te nawiasy, niektóre postaci. Mam zamiar przejść w i'th charakteru S za pomocą naszego ochotę na nowy zapis udziałem nawiasów kwadratowych. I zgadywać, co jest powrót Wartość górna najwyraźniej dzieje się być? Litera. Litera. Więc jeśli mogę przekazać małymi literami a, miejmy nadzieję, że z definicji do górnej, to będzie powrót wielkie A. W przeciwnym razie, jeśli to nie jest mała litera w Pierwsze miejsce, po prostu go wydrukować. I rzeczywiście, zauważyć Drugi przyjaciel. Nie tylko do górnej istnieje, ale jest niższa, co rzeczywiście odpowiada na to pytanie dla mnie. Teraz każdy, kto napisał te rzeczy, 10s lat temu, wiesz co? Realizowany jest na górnej i obniżyć za pomocą kodu w ten sposób. Jednakże ponownie, zgodnie z idea abstrahując od hotelu, rodzaj, niższy poziom szczegóły realizacji. I stoi na barkach ludzi , którzy byli przed nami, za pomocą funkcji podobne do górnej i dolnej, które tyle cudownie są ładnie o nazwie powiedzieć, co robią, jest wspaniałe przyjęcie paradygmatu. Teraz okazuje się, że jeśli czytam Strona man dla, powiedzmy, do górnej, Uczę się czegoś innego. Więc człowiek TOUPPER. To trochę przytłaczające. Ale informacja, oto, że wzmianka o nagłówek pliku, który należy użyć. Tak na marginesie, bo to wprowadza w błąd, funkcja używa ints zamiast znaków ze względu na kontrolę błędów. Ale my może przyjść powrotem do tego w przyszłości. Ale zauważ, tutaj, do górnych nawróconych Litera c na wielkie litery, jeśli to możliwe. Więc to jest bardzo proste. A teraz trochę bardziej szczegółowe. Spójrzmy na części Strona człowiek pod wartości zwracanej. Zwracana jest wartość przekształconej litery. Lub c, w przypadku konwersji Nie było to możliwe, gdzie c jest przy wejściowego. Które znam stąd, z argument do górnej. Tak więc to, co jest na wynos z tego? Zwracana jest wartość przekształconej litery, i c, przy litera, jeżeli konwersji nie było możliwe. Co można zatem poprawa wprowadzić do projektu mojego kodu za? Tak? PUBLICZNOŚCI: Możesz usunąć indziej. David J. MALAN: mogę usunąć oświadczenie innego, i to nie tylko oświadczenie indziej. PUBLICZNOŚCI: Możesz usunąć [niesłyszalne]. David J. MALAN: mogę usunąć cały widelec w drodze, czy też w ogóle. Więc rzeczywiście, pozwól mi otworzyć Ostateczna wersja tego, wykorzystać-2 i zauważyć, jak, jeśli będziesz, sexy, kod jest teraz coraz, się, że mam obniżone od niektórych siedem lub tak do tylko cztery linie, Funkcjonalność, że zamierzałem po prostu dzwoniąc do górnej, przekazując ów wspornika I i drukowania z, z zastępczego% c, że szczególny charakter. Teraz prawdopodobnie nie jest to błąd, lub przynajmniej ryzyko błędu, w tym programie. Tak po prostu wrócić do wcześniejszego dania na wynos, Co mam zrobić w prawdopodobnie również ten program, aby to bardziej wytrzymałe, tak, że nie ma mowy, to może upaść, nawet w rzadkich przypadkach? PUBLICZNOŚCI: Upewnij się, że nie jest NULL. David J. MALAN: Upewnij się, że nie jest NULL. Tak naprawdę, do tego super właściwa, należy zrobić coś, jeśli s nie jest NULL, to iść dalej i wykonać te linie kodu, które I następnie tiret tak, a następnie umieścić w ścisłej nawiasu. Tak dobrze wiązana razem z dwóch pomysłów. Tak? PUBLICZNOŚCI: Czy używasz zrobić podczas pętli, a nie? David J. MALAN: Could Zrobić pętlę Do While? PUBLICZNOŚCI: --you chcesz się upewnić, że rzeczywiście [niesłyszalne]. David J. MALAN: Could użyć do podczas? Krótka odpowiedź, nie. Bo jesteś o przedstawić inny przypadek rożny. Jeśli łańcuch jest zerowej długości. Jeżeli, na przykład, po prostu hit Wpisz, nigdy wpisując Zamyla. Zamierzam oddać rzeczywisty powrót ciąg, jak my w końcu zobaczyć, że ma zero znaków. To wciąż łańcuch, to jest po prostu bardzo krótkie. Ale jeśli używasz do podczas, idziesz na ślepo spróbuj zrobić coś z w odniesieniu do tego ciągu, i nic się nie dzieje, aby tam być. PUBLICZNOŚCI: Cóż, jeśli nie zrobić [niesłyszalne] podczas S-- David J. MALAN: O widzę, zachować uzyskiwanie ciąg od użytkownika. Tak więc krótka odpowiedź, ty może i zachować męczył im dać ciąg, który jest wystarczająco krótki, aby zmieścić w pamięci. Absolutnie. Ja po prostu nie zdecydował się. Jeśli nie dasz mi struny chcą, rzucam, daję się. Ale absolutnie, w tym celu, można absolutnie zrobić. Więc pliki nagłówkowe biblioteki, które jesteśmy teraz zna to jest, tutaj. Standard I / O, CS50.h, string.h, ctype.h i nie są w rzeczywistości, inne. Niektórzy z was odkryli biblioteka matematyczna w math.h. Ale pozwól, że przedstawię ci teraz, aby ten zasób, że personel CS50, Davin, i Rob, a Gabe szczególności przygotowaliśmy. Że wkrótce połączyć na strona kursu jest. To się nazywa odniesienia CS50. Które po prostu dać szybkie Smak nią działa w następujący sposób. Pozwólcie mi iść do reference.cs50.net. Zobaczysz na lewej ręce bok zdecydowaną listę funkcji, które pochodzą z C. Ale jeśli zależy mi, w tej chwili, o czymś takim jak strlen, Mogę go wpisać tam. Filtruje listę w dół się tylko to, co mnie obchodzi. Zamierzam go kliknąć. A teraz na lewo, zobaczysz, co mamy nadzieję, jest łatwiejsze, ludzkie Wyjaśnienie, w jaki sposób przyjazny ta funkcja działa. Zwraca długość łańcucha. Oto streszczenie, oto jak się używać go w odniesieniu do pliku nagłówka, i pod względem co funkcja Wygląda na to, pod względem swoich argumentów. A następnie tutaj, powraca długość łańcucha. Ale dla tych z Was, bardziej komfortowe, rzeczywiście można kliknąć bardziej wygodne, i zawartość tego strona, teraz, zmieni być domyślne wartości co uzyskać za pomocą strony man. Innymi słowy, CS50 odniesienia jest uproszczenie stron człowieka przez pracowników, dla studentów. W szczególności, te mniej wygodne i pomiędzy nimi, tak że nie spróbować zawinąć Twój umysł się, szczerze mówiąc, niektóre dość tajemnicze składnia i dokumentacja kiedyś. Więc miej to na uwadze, w nadchodzących dniach. Więc tutaj, ponownie, jest Zamyla. Załóżmy teraz zadać pytanie, które jest trochę bardziej ludzki dostępne. Dzięki Chang, który był drukujesz więcej słoni Nonstop w ciągu ostatnich kilku dni. Mamy możliwość, aby dać co najmniej jeden z nich. Czy możemy dostać tylko jednego wolontariusza przyjść na do rysowania na ekranie. Jak tutaj? Chodź na górę. Jak masz na imię? Alex: Alex. David J. MALAN: Alex. Wszystko w porządku. Alex, chodź się. Jesteśmy by zobaczyć swoje czne na ekranie tutaj. Wszystko w porządku, miło cię poznać. ALEX: Ładny Ci poznać. David J. MALAN: Wszystko w porządku. Tak, bardzo proste ćwiczenie. Bar nie jest wysoka, aby się dziś słonia. Grasz rolę getString. I mam zamiar po prostu powiedzieć, Ciąg że dotarłeś. I przypuszczam, że ty, getString, zostały nazwane. I człowieka, tak jak ja, ma wpisane w Zamyla, Z-A-M-Y-L-A. Wystarczy pójść dalej i napisać Zamyla na ekran tak, jakbyś dostał go i przechowywać go gdzieś w pamięci. Pozostawiając miejsce na to, co będzie kilka inne words-- to jest OK, nie poddawać się. [Śmiech] Więc Zamyla, Excellent. Teraz załóżmy, że, getString, nazywane są ponownie. I dlatego, że dostarczy Ci, co klawiatury, z inną nazwą, Belinda. Wszystko w porządku. A teraz jest getString następnym razem nazywa, to wpisz w coś Gabe, G-B-E. Jesteś naprawdę biorąc do serca pamięci o dostępie swobodnym. Który jest rysunek wszystko całkowicie losowo. OK. [Śmiech] ALEX: Niestety mój charakter pisma jest zła. David J. MALAN: Nie, to jest OK. I jak o Roba, R-O-B. OK. Dobry. Więc nie przewidujemy Ci będzie rodzaju ustalenie co w ten sposób. Ale możemy dokonać tej pracy. Więc jak go o r z tych znaków w pamięci? Innymi słowy, jeśli myślimy o to prostokątny czarny ekran reprezentowanie komputera RAM lub pamięci. I przypomnieć, że RAM jest po prostu cała masa bajtów, i bajty są całe grono bitów. I bity są jakoś realizowany ogólnie z pewną formą energii elektrycznej w sprzęcie. Więc to jest coś w rodzaju warstw rozmawialiśmy o i może teraz przyjąć za rzecz oczywistą. Jak się go o podejmowaniu decyzji, gdzie napisać Rob porównaniu Gabe porównaniu Belinda porównaniu Zamyla? Alex: Ja po prostu zrobił to w postanowić, że mi powiedziałeś. David J. MALAN: I to jest prawda. Ale to, co podlega, gdzie można umieścić Nazwa Belindy i nazwisko Gabe? Alex: Nic? David J. MALAN: [śmieje się] Tak to działa, to w porządku. Tak więc komputery są mało bardziej uporządkowany niż. I tak, gdy implement-- my tam tylko na moment-- kiedy faktycznie zaimplementować coś takiego GetString w komputerze Zamyla mogą być rozmieszczone prawie jak ty na ekranie, nie. I to, co jest kluczem do zawiadomienia tu, co Alex zrobił, to jest rodzaj demarkacji na każdym z tych słów, prawda? Nie pisać Z--Y-M-L-B-E-L-I-N-D-G-B-- innymi słowy, nie ma jakiś demarkacyjnej, która wydaje się być, rodzaj, losowe odstępy między tymi różnymi słowami. Ale to dobrze, bo my, ludzie mogą teraz wyobrazić, że są to cztery różne ciągi. To nie jest tylko jedna sekwencja partii znaków. Więc komputer, a następnie, w międzyczasie, może podjąć ciąg jak Zamyla, umieścić każdy z tych listów wewnątrz bajt pamięci. Ale ta liczba jest znacznie większa, Oczywiście, niż sześciu znaków. Jest cała masa RAM. I tak od tej pory, to Siatka pól będzie do reprezentowania, co Alex tylko tak tu na ekranie. A teraz, Alex, możemy zaoferować Państwu pomarańczowy lub niebieski słoń z Chang. ALEX: Wezmę Blue Elephant. David J. MALAN: niebieski słoń. Tak duże brawa, jeśli można, dla Alex tutaj. [Aplauz] Alex: Dziękuję. David J. MALAN: Dziękuję. Tak więc na wynos, że nawet chociaż wzór rodzaj zmieniał się w czasie, tutaj na pokładzie, nie było to demarkacyjnej pomiędzy różnymi ciągi że Alex ma dla nas. Teraz komputery, szczerze mówiąc, może zrobić to samo. Mogli rodzaj plop ciągi gdziekolwiek w pamięci RAM. Tutaj, tutaj, tu, na dole. Mogą zrobić dokładnie to. Ale, oczywiście, to jest Prawdopodobnie nie najlepszy planowanie. Prawda? Jeśli Pytałem Alex inne nazwiska, prawdopodobnie Miał umieścić tu trochę więcej, może się tutaj, tutaj, tutaj, w końcu tutaj. Ale z nieco więcej planowania, na pewno, możemy położyć rzeczy bardziej czysto. I rzeczywiście, to, co robi komputer. Ale jest haczyk jeśli następny ciąg mam po Zamyla jest coś jak Belinda, Proponuję, gdzie możemy napisać Litera B w odniesieniu do tej sieci? Gdzie się udać? Po prawej stronie osi A, poniżej z, poniżej a? Co by twoje pierwsze instynkty być? PUBLICZNOŚCI: Poniżej z. David J. MALAN: Więc poniżej z. I to jest dość proste, prawda? Jest to rodzaj schludne, to, co robimy na klawiaturze, kiedy naciśnij Enter, lub e-mail przy podejmowaniu wypunktowanie rzeczy. Ale rzeczywistość jest, że komputery starają się bardziej wydajne i na pewno tak samo dopchać danych do pamięci RAM, jak to możliwe, tak, aby nie tracić żadnych bajtów. Tak, aby nie tracić dowolny ekran nieruchomości. A problemem jest jednak to, że jeśli dosłownie umieścić literę b po, jak będziemy wiedzieć, gdzie kończy się nazwa Zamyla i nazwisko Belindy zaczyna? Więc wy, ludzie po prostu zaproponował, dobrze, nacisnąć klawisz Enter, zasadniczo. Umieścić go w dół poniżej. Lub nawet tak jak Alex, po prostu zacząć pisać obok nazwy poniżej poprzedniego, i pod tym jednym, i to poniżej tego. To wizualne cue. Komputery mają inną pamięć wzrokową, ale to trochę bardziej zwięzłe. To ten modny charakter. Backslash 0, co jest być może przypomina backslash n, i tak dalej, obecnie. Specjalne sekwencje specjalne. Backslash 0 jest sposobem reprezentujących osiem bitów zerowych w wierszu. 0000 0000. Sposób wyrazić, że nie jest hit numer zerowy na klawiaturze, ponieważ w tym, że jest char ASCII. Wygląda jak liczby, ale jest rzeczywiście liczbą dziesiętną że reprezentuje okólnik glif, okrągły krój. Tymczasem, odwrotny ukośnik Zero oznacza, dosłownie umieścić osiem zera bajtów tutaj dla mnie. Więc to jest nieco arbitralne. Mogliśmy stosować dowolny wzór bitów, lecz świecie postanowił kilka lat temu, że do reprezentowania Koniec łańcucha w pamięci wystarczy umieścić całą masę zer. Ponieważ możemy wykryć, że. Teraz to znaczy, że nie ma list alfabetu może być reprezentowane przez zerowe. Ale to jest OK, mamy już widział że używamy 65 na 97 w górę w górę. Nie dostać wszędzie Blisko do wszystkich zer. Więc Belinda w pamięci komputera faktycznie się tutaj. Mam wyciągnąć go na żółto tylko zwrócić uwagę na to. Oraz informacja, zbyt, to jest całkowicie arbitralne. Mam wyciągnąć go w postaci siatki. Jak, RAM jest tylko niektóre obiekt fizyczny. Nie musi koniecznie wiersze i kolumny, per se. Po prostu dostałem całą masę bajtów zaimplementowane sprzętowo jakoś. Ale jeśli po Belinda I wpisane w nazwę Gabe'a, ma zamiar skończyć się tutaj w pamięci, i jeśli wpisane imię Daven, w na przykład, że zamierza do końca się tutaj. I mogę kontynuować Napisać jeszcze więcej nazwisk. Niestety, gdy próbuję napisać bardzo długą nazwę, I może w końcu zabraknąć pamięci. W takim przypadku, getString jest powróci NULL, jak powiedzieliśmy. Ale na szczęście, przynajmniej w tym wizualne tutaj, nie mieliśmy dość, że daleko. Teraz to, co miłe jest to, że Ogólna idea traktowania rzeczy jako w rubrykach jest Przedstawiciel cecha C i wiele języków znany jako tablica. Tablica jest inny typ danych. Jest to struktura danych, jeśli będzie. Struktury w sensie to naprawdę, rodzaj, patrząc jak pudełko, co najmniej w myślach. Tablica jest ciągłe sekwencja identycznych typów danych, z powrotem do tyłu, aby z powrotem do tyłu. Więc ciąg, w innych słowa, jest tablica znaków. Tablica znaków. Ale okazuje się, można mieć tablice kiści rzeczy. W rzeczywistości, możemy umieścić nawet liczby w tablicy. Więc formie, w jakiej mamy zamiar rozpocząć uznające te dane Konstrukcja znana jako tablica zamierza także używać nawiasów kwadratowych. Ale te nawiasy kwadratowe będą mają różne znaczenie w niniejszym kontekście. I zobaczymy go w następujący sposób. Załóżmy, że mam otwarte się nowy plik tutaj. I zapisać to jako ages.c. A ja zapisać w moim folderze tutaj. A teraz mam zamiar iść do przodu i zacząć pisać coś podobne obejmują CS50.h obejmują stdio.h, int main pustkę. A następnie wewnątrz tutaj, chcę aby najpierw int o nazwie wiek. I mam zamiar używać, aby uzyskać int od użytkownika na jego wiek. Program ten jednak ma być stosowany przez wiele osób, niezależnie od kontekstu. Mam linię ludzi. Wszystkie z nich mają do wpisania ich wiek może jakiś, nie wiem, konkurencji lub zdarzeń że znalazłeś się na. Tak więc następna osoba, ja potrzebuję innej zmiennej. Bo jeśli po prostu zrobić wiek dostaje getInt, to będzie sprać, lub nadpisać wiek osoby poprzedniego. Więc to nie jest dobre. Więc moim pierwszym instynktem może być, oh, wszystko w porządku, jeśli chcę dostać wiele Ludowej ages-- nazwijmy to age1, int age2 dostaje int, int age3 dostaje getInt. A teraz mam zamiar użyć jakiś kod tutaj pseudokod. Zrobić coś z tymi numerami. Zostawimy na inny dzień, co robimy tam, dlatego, że tylko obchodzi w tym momencie o age1, age2, age3. Niestety, po I skompilować program i umieścić go przed rzeczywistych użytkowników, , co jest zasadniczo słaby projekt Decyzję wydaje mi się dokonały? Tak? PUBLICZNOŚCI: [niesłyszalne] David J. MALAN: Tak, I nawet nie próbował dowiedzieć się, jak wiele wieków mam naprawdę obchodzi? Jeśli mam mniej niż trzy osoby tutaj, a więc mniej niż trzy grupy wiekowe, Jestem wciąż ślepo spodziewa trzy. Nie daj Boże pojawi się cztery osoby. Mój program po prostu nie będzie nawet je wspierać. I tak to długa historia Krótko mówiąc, nie jest to dobry zwyczaj. Prawda? Ja w zasadzie kopiowania i wklejeniu kodu i po prostu szczypanie Nazwy zmiennych. I, mój Boże, jeśli miał, nie trzy wieku, ale 10 lub 100, a nawet 6500 studenci, na przykład. Nie będzie szczególnie elegancki kod, lub zrównoważone. Będziesz musiał Zmienić program za każdym razem, Twoja liczba osób zmian. Tak, na szczęście, w naszych rzeczywistych Plik ages.c na dzisiaj, mamy bardziej sprytne rozwiązanie. Po pierwsze, mam zamiar pożyczyć skonstruowania użyliśmy kilka razy, while tym, w celu uzyskania liczba osób w pokoju. Jestem po prostu będzie męczyć użytkownika, ponownie i znowu, dopóki on lub ona daje mi Wartość n to liczba całkowita dodatnia. Mogłem użyć, ostatni Czas jest uzyskać pozytywną int. Ale my nie mamy, że za prawdziwe, więc poszedł do przodu i ponownie wdrożyć ten pomysł. Teraz tutaj jest to nowa sztuczka. W linii 27, jako komentarze w linii 26 sugeruje, zadeklarować tablicę, w której przechowywać wiek wszystkich. Więc jeśli chcesz uzyskać, a nie jeden int, nie dwa ints, ale całe grono wskazówki. Konkretnie n liczb całkowitych, były n mógłby być trzy, może być 100, może być 1000. Składnia prościej jest powiedzmy, jaki rodzaj danych chcesz? Co chcesz zadzwonić że fragment pamięci? Co chcesz zadzwonić siatkę że wygląda tak obrazowo? I tu w nawiasach, mówisz jak duży chcesz tablica będzie. I tak wcześniej, kiedy powiedziałem, Składnia jest tutaj trochę inaczej, my wciąż w nawiasach kwadratowych, ale kiedy jestem deklarując tablicę, Numer wewnątrz Uchwyty kwadratowych środki jak duży chcesz tablica będzie. Natomiast, gdy używaliśmy s Uchwyt i chwilą, s, ciąg, rzeczywiście jest tablica znaków, ale gdy nie jest zadeklarowanie zmiennej, jak z tego hasła tutaj, jesteś po prostu się specyficzny wskaźnik, specyficzne Element z tej tablicy. Gdy wiemy, że reszta to jest proste. Jeśli nowy jestem pierwszy zamiar wydrukować co wiek numeru i osoby. Gdzie mogę tylko powiedzieć, osoba numer jeden, Osoba numer dwa, osoba numer trzy. A ja po prostu robi arytmetycznych, więc, że tak jak normalni ludzie, możemy liczyć od jednego do tego Program, a nie od zera. Potem zadzwoń getint, ale przechowywać odpowiedź w wieku wspornik i. Który jest i'th wieku w tablicy. Tak więc, podczas gdy ostatni raz byliśmy leczenia te pola jak nazwa Zamyla znaków dla tych, i inne. Teraz, te pola przedstawiają 32 bity lub cztery bajty w którym możemy przechowywać int, int, int. Wszystko to znowu są dane tego samego typu. Teraz robię coś głupiego, jak czas mija, tylko uzasadnić pisanie tego programu. A następnie na dół, znowu iteracji na tablicy, mówiąc rok, liczba osób, jedna wola coś lat. I dowiedzieć się, że math-- To znaczy, to nie jest bardzo skomplikowane arithmetic-- Po prostu dodaj jeden do ich wieku. Wystarczy wykazać, ponownie, tym. Tak jak mogę indeks do ciągu, s, więc mogę indeks do tablicy wieku, tak, że nie. Więc gdzie jest ta będzie przy nas? Więc zobaczymy, w końcu, Kilka rzeczy w nadchodzących dniach. Jeden, przez cały ten czas, kiedy pisania własnych programów, jak Mario, chciwy, kredytu. Zostaliście wpisując nazwę program i nacisnąć Enter. A potem się wejście użytkownika. Z getString, getInt, getLongLong lub podobne. Ale okazuje się, że podpory C coś, co nazywa się wiersz poleceń Argumenty, które nie pozwoli nam rzeczywiście się na słowa, które podczas pisania, w wierszu miga, po nazwie Twojego programu. Tak więc w najbliższych dniach, ci może wpisać coś Cezara, lub ./caesar numer 13, potem. Zobaczymy, jak to działa. Ponieważ w rzeczywistości, w Problem ustawić dwa, jesteśmy zamierza przedstawić Państwu do trochę coś przypomina Ralphie jest wyzwanie wcześniej kartografii. Sztuka kodowania informacji. To jest w rzeczywistości bardzo przypomina, co Ralphie nie. Jest przykładem kodowania algorytm nazywa rot13, R-O-T 13. Co oznacza po prostu obrócić litery w alfabecie 13 miejscach. A jeśli to zrobisz, zobaczysz teraz to, co jest, być może, zna zdanie. Ale sposób, w jaki będziemy korzystać to jest w końcu bardziej ogólny. W P ustawić dwa, w standardowej wersji, musisz wprowadzić kilka cyfr, jeden nazywa się Cezar, jeden nazywa Vigenere'a. Obie z nich są obrotowe szyfry, w które jakoś włączyć jedną literę na inną literę. I Cezar jest bardzo prosta. Dodać jeden, dodać 13, lub jakiś numer do 26. Vigenere'a robi, że na na piśmie podstawy. Więc Vigenère, jak zobaczysz w specyfikacji, jest bardziej bezpieczne. A na koniec dnia, co będziesz wdrażania i P ustawić dwa, jest to, że klucz jest używanie zarówno do szyfrowania i deszyfrowania. Odnosząc się do procesu toczenia zwykły tekst, niektóre oryginalna wiadomość, do tekstu, który Cypher jest coś, szyfrowane. A następnie odszyfrowanie go ponownie. W edycji hakerów, tymczasem, będziesz zadanie z czymś podobnym w duchu, w których podamy plik, z typowym Linux lub Mac lub Unix nazywane Etsy hasłem zawierająca całość grono użytkowników i haseł. I te hasła mają wszystko zostały zaszyfrowane, lub mieszany, że tak powiem, bardziej prawidłowo jak zobaczysz w spec. I haker będzie wyzwaniem wydanie Ci z podjęciem wejście w ten sposób, i pękanie hasła. Oznacza to, że zastanawianie się, co Hasło ludzka faktycznie było. Bo rzeczywiście, hasła są na ogół nie są przechowywane w jasny, Hasła i ogólnie powinno być trudne do odgadnięcia. To nie często się zdarza. A ja myślałem, że to, co robimy, jest zawrzeć z kilka minut Szczególnie w skrócie kiepski wybór haseł z filmu można przypomnieć czule. A jeśli nie, należy wynająć. [ODTWARZANIE] -Helmet, To diabeł, co się dzieje? Co robisz z moją córką? -Permit Mnie przedstawić genialny młody chirurg plastyczny, Lekarz Phillip Schlotkin. Największy nos w pracy człowieka Cały wszechświat i Beverly Hills. Wasza Wysokość. -Nose Pracy? Nie rozumiem. Ona już miała nosa. To był jej słodki 16 obecnych. Nie, to nie to, co myślisz. To dużo, dużo gorzej. Jeśli nie dasz mi połączenie z osłoną powietrza Lekarz Schlotkin daje Państwu córkę jej stary nos. - [Wzdycha] Nooooooooooooo. Skąd to masz? -Dobrze. Powiem, powiem. Nie, tato, nie. Nie musi. Masz rację kochanie. Będę tęsknił nowy nos. Ale nie powiem im Połączenie nie wiem co. Bardzo dobrze. Lekarz Schlotkin, czy twój najgorszy. -My Przyjemność. Nie! Czekaj, czekaj. Powiem. Powiem. -I Wiedziałem, że to działa. Dobra, daj mi to. -The Kombinacja jest jeden. Onu. Onu. -Dwa. -Dwa. -Dwa. -Trzy. -Trzy. -Trzy. -Four. -Four. -Four. -Five. -Five. -Five. Więc połączenie jest, dwa, trzy, cztery, pięć. To najgłupsza połączenie Kiedykolwiek usłyszeć w moim życiu. To rodzaj rzeczą, idiota ma na swoim bagażu. Dziękuję, Wasza Wysokość. [REMOTE CLICKS] -Co Zrobiłeś? -I Odwrócił się od ściany. Nie, ty nie, ty wyłączony cały film. -I Musiało naciśnięty niewłaściwy przycisk. Cóż, umieścić go z powrotem! Umieścić film z powrotem! Tak jest, sir! Tak, proszę pana. -Pozwól Idziemy, Arnold. Przyjdź, Gretchen. Oczywiście wiesz, że będziesz musieli obciążyć Cię za to. Cóż? Czy to działa? Gdzie jest król? -it Pracował, panie, my mają połączenia. -great. Teraz możemy podjąć każdy ostatni oddech świeżego powietrza z planety Druidia. Co znajduje się połączenie? Onu, dwa, trzy, cztery, pięć. Onu, dwa, trzy, cztery, pięć? Tak. -To Niesamowite. Mam to samo połączenie na mój bagaż. Przygotuj Spaceball 1 do natychmiastowego wyjazdu. Tak, proszę pana. -I zmienić połączenie na mój bagaż. [ZAMYKANIE DRZWI DŹWIĘK] [Brzęk DRZWI uderzając KASKU] -Ahh. [KONIEC ODTWARZANIE] David J. MALAN: To jest to dla CS50, do zobaczenia w przyszłym tygodniu. Narrator: A teraz, Głębokie Myśli, by Daven Farnham. Daven FARNHAM: Kodowanie w C jest tak dużo trudniejsze niż na początku. printf, Scratch było kłamstwo. [Śmiech Soundbite]