[MUZYKI] David J. MALAN: To jest jak obecnie studentem pierwszego roku seminarium. OK. Tak bardzo deszczowo się. Prowadzi to się stało w środy, ale bardziej okazja na pytania dziś. Zacznijmy więc od rzeczywistości z filmu na chwilę. Ale zaczniemy wspaniale jak zawsze. Jest CS50, a to jest koniec tygodnia 4. Więc jeśli kiedykolwiek widziałeś TV lub w którym film tam niektórzy eksperci komputerowe i policja, ani FBI, lub niektórych agencji próbuje złapać niektóre przeciwnik, dobrze, masz Prawdopodobnie słyszałeś wyrażenie "wzmocnienia" przy czym, że technika jakoś magicznie przybliża nieskończoność daleko, aby zobaczyć przestępców tożsamości lub numer rejestracyjny nawet w połysku lustrem lub błysk czyimś oku. Więc rzeczywiście, rzućmy okiem na kilka takich scen z Hollywood. [ODTWARZANIE] -Ok, Teraz przejdźmy dobre spojrzenie na ciebie. -Trzymaj to. Uruchom że z powrotem. -Poczekaj minutkę. Idź w prawo. -Nie, Zamrażać, że. -Pełny ekran. -ok, Zamrażać, że. -Tighten Się na tym, dobrze? -vector Się na tym Facet przez tylne koło. -zoom Się tu, na tym miejscu. -Z Odpowiedniego sprzętu, zdjęcie może być powiększona i naostrzone. -Co to? -To Program poprawy. -Możesz Jasne, że się jakieś? -Nie Wiem. Miejmy poprawić go. -Enhance A6 sekcja. -I Wzmocnione szczegół, and-- Myślę, że wystarczy, aby zwiększyć, zwolnić go do mojego ekranu. -I Wzmocnione odbicie w oku. -Niech To uruchomić to przez Funkcje poprawy obrazu. -Edgar Można poprawić to? -Wytrzymać. -I've Pracuje w tej refleksji. Odbicie -Someone jest. -Reflection. -Jest Odbiciem twarzy mężczyzny. -The Refleksji. -Jest Odbiciem. -zoom Się na lustrze. -Można Zobaczyć odbicie. -Czy Można poprawić wizerunek stąd? -Czy Można zwiększyć go tutaj? -Czy Można zwiększyć go? Można zwiększyć go? -Czy Możemy poprawić to? -Czy Można zwiększyć go? -Hold Na sekundę, ja poprawić. -zoom Się do drzwi. -Times 10. -zoom. Przesuwanie znaczników w. -Jeszcze. -wait, Stop. Przestań. -Pause Go. -Rotate Nam 75 stopni wokół pionu, proszę. Przestań. Wróć do strony o drzwi, znowu. -Got Jest wzmacniacz obrazu, który może bitmapy? Hej, może uda nam się skorzystać z Pradeep Metoda Sen zobaczyć w okna. -To Oprogramowanie jest stan wiedzy. -The Wartość własna jest wyłączony. -Z Prawa Połączenie algorithm-- -Jest Podjęta likwidacja algorytmy do następnego poziomu, i mogę ich używać do zwiększenia zdjecia. -lock Się i powiększyć osi. -Enhance. -Enhance. -Enhance. -Freeze I wzmocnić. [Zakończyć odtwarzanie] David J. MALAN: Dobrze, więc wszystkie z nich są rzeczywiście słowa. Oni po prostu nawleczone razem w sposób, że nie jest to faktycznie sensowne. I, w rzeczywistości, CS50 i kursy podoba ma tendencję do ruiny wiele TV i filmów dla Ciebie. Bo kiedy tych ekspertów komputerowych są wyliczać terminy i mówiąc fantazyjne rzeczy jak wektory własne, a oś z, i wielu innych rzeczywiście warunki bardziej techniczne, oni naprawdę tylko sznurka słowa razem zbyt często. Jest to, że jedna z naszych nadziei jest to, że, jako efekt uboczny kursów inwentaryzacyjne takie jak ten, będzie więcej ludzi w Świat rzeczywiście być w stanie zważyć i po prostu bardzo nieznacznie wpływać na Jakość i dokładność tych filmów? W rzeczywistości, rzućmy okiem na rzeczywistość. Więc tutaj jest zdjęcie pracownicy Maryjo, jeden z naszych kolegów nauczania. I przypuszczam, że jest podejrzany o czymś. A jednak istnieje promyk niektóre z dowodów w oku, lub w odbicie jej okularów. Cóż, jeśli robimy dokładnie tak, jak na filmach Proponuję, w którym możemy powiększać i "poprawić", jest to, jak wiele informacji w twarz Maryi podczas robienia zdjęcia z tej oryginalnej rozdzielczości. I rzeczywiście, można zobaczyć te kropki. I to są, jakie są zwane pikseli, P-I-X-E-L-S, która jest tylko plac zwykle to jest punkt, który tworzy obraz. I z powrotem w dzień, a właściwie nawet dziś niektóre z dzisiejszych telewizorów LED Telewizory LCD lub, jeśli masz jeden w swoim pokoju lub w domu, jeśli go się bardzo blisko niej, a zwłaszcza jeśli jest to nieco starszy telewizor, prawdopodobnie można nawet zobaczyć te kropki i to, co tworzą zdjęcie. I nie ma więcej informacje niż to. Moglibyśmy "poprawić", w tym sensie, wygładzanie rzeczy nad i rodzaj wywodząc rodzaju, jakby co Kolor powinien być obok oka Maryi tak, że nie jest w rzeczywistości tak piksele. Ale jeśli Ciągle powiększanie, nie jest złym facetem w jej oku. Jak to wszystko Informacje mamy. Nie można tworzyć Informacje z niczego. Jest tylko skończony Liczba bitów tam. Więc Problem Set 4, gdzie masz okazję bawić się z tego rodzaju świata. W Problem Set 4, będziesz odkrywać świat grafiki i kryminalistyki, i rzeczywiście napisać kod które odzyskuje utracone obrazy. Musisz napisać kod, który manipuluje istniejących obrazów i ostatecznie zrozumieć, co jest dzieje się pod maską. I, jak się okazuje, to faktycznie Nie wszystko, co skomplikowane. Na przykład, jeśli chcemy stanowią buźkę gdzie z tych czarnych pikseli, czy te czarne kropki, Cóż, może po prostu reprezentują je jako naprawdę bitmapy. A jeśli nie słyszał, że bitmapy wyraz, być może teraz zaczyna się zrobić trochę więcej sensu dzisiaj. Wiemy już, co nieco jest. To jest 0 lub 1. A mapa jest po prostu coś, jak kawałek papieru który daje wskazówki i ma Może siatki xiy współrzędne. Więc o to bitmapy. Jest to mapa bitów przy czym 1 jest wyraźnie będzie reprezentować biały piksel, a 0 zamierza reprezentować czarny piksel. Ale czy na pewno obrócić go wokół. To naprawdę nie ma znaczenia, tak długo, jak jesteśmy konsekwentni. A oto, jak w binary-- wewnątrz z pamięci komputera, a nawet wewnątrz pliku na dysku twardym drive-- można przechowywać najprostszych emotikon twarz. Ale co mamy, oczywiście, brakuje na tym zdjęciu? Kolor, prawda? Jest to oczywiste, następnym krokiem lub poprawa poprawić to z koloru. Tak niestety się tylko jeden bit 0 lub 1, można było stanowią kolor. To może być czerwony lub niebieski, lub czarne lub białe, lub zielony lub różowy, lub jakiekolwiek pary kolorów. Ale dla uproszczenia, będziemy po prostu założyć, czarny i biały. Więc co trzeba zrobić, logicznie, jeśli chcą wprowadzić kolor na zdjęciu? Co mamy robić? Podobnie jak w przypadku czynnikiem ograniczającym tutaj jest to, że za pomocą jednego bitu można tylko stanowią dwa stany 0 lub 1, biały lub czarnym, co chcesz zrobić? Publiczność: Więcej danych. David J. MALAN: Więcej bity, yeah więcej danych, więcej bitów. I rzeczywiście, to jest dokładnie, jak kolorowe obrazy są reprezentowane. Zamiast używać jednego bitowe 0 lub 1 dla każdego piksela, każda kropka, po prostu korzystać z wielu. Może używać 8, być może, bardziej używać 24, i rzeczywiście, w Problem Set 4, można grać z pliku format, który wykorzystuje 24 bity zwykle. Ale większość z was pewnie zaznajomieni z plików JPEG. Jeśli kiedykolwiek podjęte zdjęcie w telefonie, lub przesłane lub widział coś na Facebook lub Flickr, dowolna liczba stron internetowych opartych na fotografii, masz prawdopodobnie widział obrazu JPEG wcześniej. I jak się okazuje, jest to plik Format będziemy używać w pset 4, w którym masz zamiar muszą odzyskać zdjęcia że przypadkowo usunięte z uszkodzona karta pamięci w aparacie, Jeśli będziesz. I okazuje się, że nawet JPEG jest dość sophisticated-- jest to o wiele bardziej wyrafinowane niż czarno-białe kropki widzieliśmy przed chwilą, bo nie ma Algorytmy naprawdę fantazyjne, że są wykorzystywane do kompresji JPEG, więc że można mieć naprawdę ładne, jakość obrazu, ale przy użyciu stosunkowo niewiele bitów. I wrócimy do kompresji niebawem. Okazuje się, że pierwszy trzy bajty w image-- JPEG bez względu na to, co już zrobione zdjęcie of-- są wartości 255, 216, 255. Innymi słowy, jeśli tylko zobaczyć, że wzorzec bitów, reprezentowane tu trzy bajtów, czyli w sumie 24 bity, z dużym prawdopodobieństwem można wywnioskować, że patrzysz na niego to pierwsze trzy bajtów w formacie JPEG. I to jest to, co jest znane jak podpisania JPEG. Wiele formatów plików tam mają tendencję do początku pewne wzory 0 i 1, tak, że Windows i Mac OS i iOS, i Android wiedzieć, jaki rodzaj pliku, że są, oprócz tzw pliku Rozszerzenie, że wiele plików. Jeśli .jpg, to kolejny trop do komputera. Więc niech teraz popatrz na to trochę bardziej technicznie. Wiemy, że po przecinku System jest od 0 do 9. Wiemy binarny jest 0 i 1. A jeśli uważasz, że powrót do pset 0, musieliśmy zmagać się z, na trochę, coś nazywa szesnastkowy, gdzie masz 16 cyfr, zamiast 10 lub zamiast 2. A te cyfry, zgodnie z konwencją, wynosi od 0 do 9, a następnie do f, gdzie f reprezentuje co liczba dziesiętna, podobnie jak szybkie rozsądek sprawdzić? Tak więc, 15. I musi reprezentować 10, po prostu charakter zamówienia, że ​​dałem. To tylko arbitralna konwencja, ale to dość standardowe. Więc jeśli spojrzymy na ten wzór trzech bytes-- niech po prostu zacząć patrzeć na to w sposób zgodny z tym, jak naukowcy generalnie komputerowe patrzeć i myśleć o plikach. Można oczywiście myśleć o Pliki w 0s i 1s, i po przecinku, ale w rzeczywistości, mamy tendencję do uruchomienia program lub częściej hexadecimal-- z powrotem z pset 0. Więc pozwól mi zaproponować, 255, 216 i 255 są tylko te wzorce 0 i 1. I można to sprawdzić, jeśli chcesz zrobić matematyki od tygodnia 0. Ale teraz, po prostu założyć, że jest to rzeczywiście prawidłowe. Właśnie przepisany trzy po przecinku numery jak trzech wartości binarnych. Teraz to, co mam zamiar zrobić, to wystarczy dodać spacje, właśnie ze względu na czytelność jest. Oraz informacja, jestem po prostu przenieść rzeczy od siebie. Tak więc przed, po, przed, po. Robię nic ciekawego inne niż tylko rozprzestrzeniania rzeczy tak że zawiadomienie każdy zestaw ośmiu Bity jest dwa zestawy czterech bitów. Jest to przydatne, ponieważ szesnastkowym Szczególnie modne ponieważ każdy szesnastkowy 0 do f, a dokładniej od 0 do 15, można przedstawić z dokładnie czterech bitów. Innymi słowy, w systemie szesnastkowym, jeśli Ciebie chcą reprezentować 0, to tylko 0000, cztery zera. A jeśli chcesz do reprezentowania 15, to 1111, które to cztery bity. A jeśli nie matematyka, jeśli jest to miejsce, te, jest to miejsce, 16s, że zamierza dać you-- raczej, że będzie to-- przykro, binarnie, że zamierza dać 15, te miejsce, Dwójki miejsce, czwórki i ósemki miejsce. Więc pozwól mi zaproponować, że Zestaw czterech bitów w lewo jest to, co mamy zamiar zadzwonić f. To największa liczba ty może reprezentować cztery bity. I już wiemy z szesnastkowy, f jest największą cyfrą w systemie szesnastkowym. Mamy kolejną f istnieje, dwa więcej tam. A teraz, po prostu wziąć na wiarę że zrobiłem prawo matematyczne i że lewa połowa z tych bitów, 1101, to samo jak d, w zapisie szesnastkowym. I prawa ręka, 1000, znajduje się zaledwie 8. I że łatwo zrozumieć, prawda? 8 represents-- ma rację ósemki pod tym miejscu. Mamy więc w kolumnie jeden ósemki i nic w czworakach, dwójkami lub jedynek. Więc teraz bardziej konwencjonalnie, ludzie mają tendencję pisać cyfry szesnastkowe jak ten, po prostu squish je razem, i wtedy poprzedzić je 0x. Oznacza to nic innego, wizualną wskazówkę do human-- Nadchodzi value-- szesnastkowym, ponieważ to nie może być inaczej oczywiste. To znaczy, ostatecznie, że wzór z zer i jedynek, lub wzór szesnastkowym cyfry równoważnie, że jesteś zamiar zacząć szukać Zestaw 4 w Problem jest this-- i problem Zestaw 4 specyfikacja będzie chodzić Ci przez to bardziej detail-- ale uświadomić sobie, jak rodzaj tajemnej jako może to wyglądać na pierwszy rzut oka, masz zamiar rozpocząć widząc to dużo. A w rzeczywistości, nawet w GDB, debugger wprowadziliśmy w poniedziałek i Dan wprowadza w pset 3, będzie często pokazać wartości szesnastkowe tylko dlatego, że są bardziej konwencjonalne niż dziesiętny lub binarny świecie komputerów. Teraz umieścić to w kontekście. Wiele można o tym pamiętać tu zdjęcie, które pochodzi od czego? Vista, więc nawet wcześniej niż że Windows XP nie to debiut. Więc to jest piękny krajobraz. I rzeczywiście, gdy rozglądamy online-- Myślę, że jest to artykuł Wikipedia, w którym ktoś bardzo niezwykle wyszedł znaleźć to miejsce w świecie skonfigurować jego lub jej aparat w właśnie prawo place-- i to dzisiaj wygląda like-- ale jest to dokładnie to samo ustawienie. Ten obraz, choć znajduje się w pliku Format nazywa bitmapy, b, m, p. I mamy zamiar zrobić super, Szybki rzut oka na to, co to znaczy. Ale bitmapy jest po prostu inny sposób reprezentujących obrazy wciąż przy pikseli w 0 i 1, ostatecznie. Ale w mgnieniu oka, to ma bardziej interesujące podpis na początku pliku. To nie tylko trzy bajtów, a nie ma cała masa wzorców bajtów które mają z góry określone znaczenie. Na przykład, w czasie pierwszych kilka bajtów bitmapy będzie rozmiar z Obraz, szerokość obrazu, wysokość obrazu, tak Przydatne metadanych, jeśli będzie. Przydatne informacje, że Photoshop lub jakiekolwiek grafiki programowania używasz może faktycznie zależy. Więc więcej na ten temat w Problem zestaw 4, ale to tylko powiedzieć, że na koniec dnia wszystkie formaty plików używałeś dla years-- plików Microsoft Word, Pliki liczby, Excel, dowolną liczbę formatów plików które mogą mieć pewne Wiadomo Rozszerzenie pliku to tylko 0s i 1s pod maską. A ludzie postanowili co konwencje, jakie wzorce 0 i 1 stanowią plik Word kontra pliku Excel, w stosunku do dowolnej liczby innych formatów. Tak więc w pset 4, będziesz mieć okazja do zabawy z tym. Ale co to znaczy mieć struct. Właściwie jest to miłe segue teraz w C, który ma tylko kilka o dodatkowe funkcje, które my nie spojrzał na jeszcze. Jest to dość mały język i jeden z ładne cechy o C jest struktura. Na przykład, jeśli Ciebie chciał represent-- niech że chcesz mieć zmienną, która reprezentuje ucznia w jakimś programie. Może pisali kurs Program rejestracji lub rdzenia zakupy Narzędzie, czy coś takiego. Jakie są kawałki danych związanych do studenta, który przyszedł do głowy? Jak student reprezentowana jakie wartości? Tak? Masz nazwy jako student. Co jeszcze robi typowy uczeń ma? PUBLICZNOŚCI: [niesłyszalne] David J. MALAN: Tak, przepraszam. PUBLICZNOŚCI: Wiek. David J. MALAN: wieku lub urodziny równoważnie, yep. Co jeszcze? PUBLICZNOŚCI: numer ID? David J. MALAN: Tak numer identyfikacyjny, może numer telefonu, może w akademiku lub dom, lub na uczelni, czy coś takiego. Dowolna ilość sztuk danych Może masz na liście kontaktów jest to, co może zdefiniować studenta. Więc jeśli chcemy to zrobić, w kodzie, możemy zrobić coś prostego, jak ten. Możemy mieć program tak, że ma powiedzmy, int main (void). A jeśli chcę do reprezentowania Student może ja, na przykład, ciąg o nazwie nazwa dla tego studenta, ciąg zwany akademik dla tego ucznia, Może int o nazwie ID dla tego studenta. A ponieważ używam ciąg, I trzeba wrócić i umieścić CS50.h. Być może będę potrzebował stdio.h. Więc pozwól mi zapobiegawczo zrobić ci, a ja jestem Zadzwonię do tej student.c teraz i zapisać to. A teraz może coś zrobić z tych zmiennych. A my po prostu zamiar napisać że jako komentarz w kodzie pseudo, bo to nie jest interesujące co robimy teraz. OK, więc jest to program, który jakoś przechowuje studenta. Co chcę zrobić, jeśli chcesz zapisać dwóch studentów? Więc moim pierwszym odruchem będzie wszystko będzie dobrze, zaraz, jeśli mam innego ucznia dlaczego nie mogę po prostu zrobić nazwa ciąg 2, ciąg akademiku 2, int ID2. I zrobiliśmy odszedł na tej drodze przed i to, co było nasze rozwiązanie do tego, co wydaje się być rodzajem hackish kopiowania pasty pracy tutaj? PUBLICZNOŚCI: Tablica. David J. MALAN: Tak, możemy używać tablicy. Prawo to bardzo szybko staje się niewydolny. Musisz rozwiązać dowolnie rozpocząć nazywania tych wszystkich zmiennych. A ty, człowiek, trzeba zachować utwór, który odpowiada OK NAME2 z dorm2 odpowiada ID2. To po prostu staje się bałagan. Więc jest to o wiele łatwiejsze, przypominam ze kilka tygodni temu, po prostu konieczności zwanych nazwisk smyczkowych a może dać nam trzy z nich. A potem może mamy akademiki smyczkowe i mają trzy z nich, albo ze stałą int identyfikatory i mają trzy z nich. Ale nawet teraz to czuje trochę zaniedbany, w prawo. Mówimy o studentów i jeszcze Jestem naprawdę mieszka się na niskim poziomie szczegóły realizacji. Student jest nazwa i osobowym oraz ID. Dlaczego nie mogę po prostu zadeklarować zmienną nazywa uczeń i nazywają to s. A jeśli chcę innego ucznia, dlaczego nie po prostu nazwać to t. Albo jeśli chcę całą masę studentów, dlaczego nie mogę po prostu że mam całą klasę studentów, i to trzy z nich. Innymi słowy, dlaczego nie mogę przyjść z mojego własnego typu danych, zwanych Studentów, wewnątrz którego jest nazwę, to ID, to w akademiku, jest liczbą innych dziedzinach. I okazuje się, was może zrobić dokładnie to. Więc C ma tę funkcję o nazwie struktura. To funkcja język, pozwala nam dokładnie to zrobić. Mam zamiar iść do przodu i otworzyć structs.h gdzie jedziemy zobaczyć po definicji studenta. Okazuje się - a ten jest jeszcze prostsze niż ten z udziałem identyfikator przed chwilą. Jeśli chcesz, aby wymyślić Twój domowy typ danych, a ponadto do int i char i pływać i tych wszystkich innych, które istnieją, Można to zrobić dosłownie pisania typedef struct, następnie niektóre nawiasy klamrowe, wewnątrz której Lista zmiennych, które chcesz skojarzyć z tym nowym niestandardowych danych wpisz nazwę i jak akademiku, a następnie po nawiasy podać nazwę do nowego typu danych. Tak więc, na przykład, student. I co teraz o tym miło jest, że jeśli spojrzymy na odpowiedni kod, konwencja, pierwszy wszystkim, jest wprowadzenie tego w pliku o nazwie coś dot h, plik nagłówka, które nie mamy zaczął używać się zbyt wiele. Ale mamy zamiar zacząć używając trochę teraz. I co możemy z tym zrobić, ostatecznie, w tych kilku linii kodu jest dokładnie to zadeklarować Typ danych, student. A teraz z niego korzystać. Idę teraz do plik o nazwie structs1.c. I rzućmy okiem na Kilka cech tutaj. Więc rzeczy tu jest w większości znane, a my wrócić do tego, co nie jest zaznajomieni za chwilę. To oczywiście jest w tym moje własne nagłówek pliku, który jest nowy, jak również, wyjątkiem pset 3, gdzie, Przypomnijmy, mamy helpers.h. Więc może przypomnieć #include helpers.h. Dlaczego choć używam cytatów zamiast ostrych nawiasach? Kiedy mam wybierać między nimi? Prawie zawsze wydaje mi się, używać ostrych nawiasach. A potem, nagle na Linia sześć używam cudzysłowów. Dlaczego może być? Tak? PUBLICZNOŚCI: [niesłyszalne] David J. MALAN: To jest rzeczywista, to co? PUBLICZNOŚCI: To w IDE. David J. MALAN: Tak, to w moim rzeczywistego IDE. I nie mieszkają na IDE, ponieważ to tylko narzędzie, które używam. To w moim prądu katalog, w szczególności. Więc structs.h jest mój własny plik nie jest zainstalowane w IDE, w samego systemu operacyjnego, a to w moim bieżącym katalogu. Tak więc konwencja jest, jeśli chcesz zawierać własny plik nagłówkowy, po prostu użyć cudzysłowia. Co nazywamy tę rzecz w Linia 8, ogólnie rzecz biorąc? Co to jest? coś #define. Jest to stałe, prawda? Jeśli chcesz mieć Wartość w programie że używasz całość kilka razy, to dobra konwencja czynnik go, zadeklarować, z symbolem krzyżyka zdefiniować, a następnie, zgodnie z konwencją, w ogóle wielkie litery word-- choć nie jest bezwzględnie konieczne, ale Konwencja jest człowiekiem wykorzystać stałe tak, aby wyskoczyć na ciebie visually-- miejsca i wówczas wartość chcesz być odpowiednik nazwy tej stałej jest. Nie średnik, ale po prostu wynika z tego wzoru nie. Więc co mam zrobić w tym konkretnym kodem. Warto więc przyjrzeć się główny program tutaj. W linii 12, bo obejmowały structs.h, Mam teraz magicznie w moim zbycie nowy typ danych. Nie wystarczy mieć dostęp do int, i char i float, i łańcuch, i niebieski i inne. Mam teraz dostęp do typ danych dla studentów. Tak więc w linii 12, mam połączenie dwóch ideas-- jeden typ danych niestandardowych i dwa, przy użyciu tablicy. I tak w tym programie, jeśli Chcę, aby faktycznie wspierać trzy różne studenci w moim programie, ja może po prostu powiedzieć mi dać zmienną zwane studentów, z których każda jest studentów typu, które jest mój niestandardowy typ danych. A konkretnie, daj mi trzy z nich w moim tablicy. I co teraz mamy zrobić w tym programie? Tu jest tylko dla pętli iteracji od 0 do 3, bo to jaka jest wartość studentów jest. Ja tylko monitowania użytkownika dać mi imię ucznia. I następnie w linii 17, to mają głównie znany wiersz. Mamy starego przyjaciela GetString po prawej stronie. A co kawałek składni jest podobno nowy, jeśli nigdy nie programować w C przed, i nigdy nie używał konstrukcjom? Tak? Uczestniczyć: .name. David J. MALAN: The .name. Ale to nie jest za dużo skoku, bo teraz studenci wspornik I daje i-tego ucznia. A jeśli chcesz nurkować wewnątrz tej struktury po prostu korzystać z jednego okresu i następnie nazwę zmiennej wewnątrz lub własność wewnątrz, że chcesz uzyskać dostęp. Podobnie więc, jeśli to poprosi Użytkownik, daj mi akademika studenta, Podobnie można zapisać, że ciąg w zmiennej akademiku wewnątrz tej struktury studentów. A teraz robi się trochę fantazji. I to będzie wyglądać co być może wielu już wkrótce. Ale zobaczysz, to o wiele bardziej w pset 4, więc niech po prostu spojrzenie na to teraz. Okazuje się, że w linii 23 przez 38, co myślisz ja może robić? I zostały usunięte komentarze do dzisiaj, ale w wersji kodu online dla odniesienie ma wszystkie komentarze. Co wydaje mi się, że robi? PUBLICZNOŚCI: Zapisywanie pliku z wszystkich informację, że wprowadzony przez użytkownika. David J. MALAN: Tak, dokładnie, jest to nowy sposób które widzimy dwa, Inną cechą C, w którym można tworzyć własne pliki. Do tej pory, prawie każdy program napisałeś jest bezpaństwowcem. Tak szybko, jak to się robi z systemem, to jest to. Nie ma pamięci lub pamięć o nim. Nie ma plik zapisany. Ale jeśli nie chcesz zapisać wejście, które ma stało się, jak w gry lub programu tak, okazuje się, możemy to zrobić. I zobaczysz, to bardziej w pset 4 oraz w ust. Ale ta linia 23 zasadniczo tworzy plik o nazwie students.csv. A może nie widziałem tego wcześniej. Nawet jeśli nigdy wcześniej nie studiowała CS wcześniej, CSV jest zmienne oddzielone przecinkami. To jak bardzo biednych wersja pliku Excel, co oznacza, że ​​może być otwarty w programie Excel i Numbers Apple, i ma wierszy i kolumn. Ale to nie jest zastrzeżona Format jak Microsoft czy Apple. To tylko przecinki oddzielające Wartości, które zobaczymy w tym momencie. I tylko zgadywać. W linii 23, na samym koniec, mój drugi argument do tej nowej funkcji o nazwie f otwarta do otwartego pliku jest w. Co może w oznaczają? Tak? PUBLICZNOŚCI: Pozwala na zapisywanie do pliku? David J. MALAN: Pozwala można zapisać do pliku. Więc jest kilka wariantów że możemy podłączyć tutaj. Ale jeśli chcesz tylko do odczytu plik, że jest na to patrzeć i przeczytaj go do pamięci, ci wystarczy użyć cytatu "R". Jeśli chcesz napisać do pliku, należy użyć cytatu "w". Istnieje również dołączyć i kilka innych rzeczy jeśli chcesz zmodyfikować istniejące pliki. Teraz mamy zamiar utrzymać widząc to rzeczą, wtedy wrócimy do linii 24. NULL, jak się okazuje, jest specjalną wartość, może zostać zwrócony przez niektórych funkcji jeśli coś poszło wrong-- Jeśli plik nie istnieje, jeśli już zabraknie pamięci, lub kilka innych błędów. Ale teraz, po prostu założyć, że to tylko konwencjonalne sprawdzanie błędów. Tu, w linii 26, jestem iteracji od 0 do 3 na wszystkich moich uczniów. I to jest rodzaj sortowania nowej funkcji fprintf, ale tylko zgadywać. Jeśli printf jest tylko do wydruku sformatowany ciąg znaków, co ma na myśli zapewne fprintf? PUBLICZNOŚCI: Drukuj do pliku. David J. MALAN: Wydrukuj sformatowany ciąg do pliku. To właśnie dodatkowe f środkiem jest plik. A nowy pierwszy argument musi być zmienna, która reprezentuje plik. Następnie musimy tylko format Ciąg jak printf. I mimo, że to Składnia jest nowa, to tylko oznacza podłączyć imię ucznia, plug-in w akademiku, a następnie z fclose zamknij plik. A potem lastly-- to nowa i wrócimy do tego przed long-- Jestem uwalniając uczeń z przyczyn że stało się ponad nie. Ale wrócimy do przed long-- to dlatego, że, jak GetString jest rzeczywiście pracuje pod maską. Więc rzućmy okiem tutaj. Gdybym wpisz ls w moim katalogu, zauważyć, że nie mam posiada plik o nazwie students.csv, po prostu nie istnieje, nie istnieje. Więc jeśli teraz skompilować ten program, aby konstrukcjom-1. / structury-1, i mam zamiar iść do przodu i wpisz Andi, który mieszka w Berkeley w Yale. My będziemy mieć Roba, który Mieszka w Thayer te dni. I niech wymyślić, gdzie jest, jak sądzę, Maria jest w Mather, gdybym nie pamiętał. Więc nic się nie stało. Ale jeśli wpisz ls teraz istnieje students.csv. Idziemy do przodu i otwarta students.csv. Jest to również bardzo lekki format pliku. Ale ja po prostu przyjęła konwencję że mam dwa rzędy i kolumny tutaj. Pierwsza kolumna imiona ludzi. Druga kolumna jest studenta w akademiku, lub szkoła lub dom, lub cokolwiek. A teraz mam zapisane to stałe w pliku. Więc to nie jest wszystko, co ciekawe. Ale to jest tylko odskocznią teraz do bycia w stanie utrzymywać się informacje na stałe. Zobaczmy teraz, co jeszcze możemy zrobić z tych i innych funkcji. Ale po pierwsze, jakieś pytania? To było dużo, i to szybko. Ale zobaczysz dużo więcej w pset 4, jak również. Tak? PUBLICZNOŚCI: Czy istnieje sposób, aby kontynuować dodawanie nazw do tego pliku? David J. MALAN: Dobre pytanie. Czy istnieje sposób, aby kontynuować dodanie nazwy do tego pliku? Tak. I rzeczywiście, gdy kończy się ponownego otwarcia pliku, należy użyć cytatu koniec cytatu "a" dla append, które po prostu dodać nową linię, A Nowa linia ponownie i ponownie, dokładnie. Dobre pytanie. Inne pytania? Tak? PUBLICZNOŚCI: Jeśli prowadził Program ponownie teraz, to dodajemy nazwisk do pliku lub byłoby otworzyć nowy plik? David J. MALAN: Ach, dobre pytanie. Jeśli prowadził program ponownie w prawo Teraz, być może wpisany w nowych nazw, to dodać do pliku lub nadpisać plik? Ten ostatni, bo jestem nie używając trybie dopisywania. A ponieważ jestem ślepo otwarcie pliku do zapisu, to po prostu będzie zastąpić plik. Więc chciałbym rzeczywiście musisz zrobić, to dołączyć, jeśli chcę, aby faktycznie mają długi termin w bazie. Teraz CSV jest przydatna, szczerze mówiąc, nawet na jak jeśli jesteś writing-- a my w końcu zobaczyć później w semestrze stosujemy pliki CSV do innych celów. Jeśli chcesz zapisać wszystkich ludzi którzy zarejestrowali jakiegoś zdarzenia, czy podpisał się za studenta Grupa, czy coś takiego, zapisywania danych w tego rodzaju format jest super wygodne. Ponieważ dosłownie, jeśli I były ściągnąć ten plik. Mógłbym double-- i niech rzeczywiście spróbować jeśli mam Excel lub numery tutaj. Idę do kliknięcia prawym przyciskiem myszy lub Control mój plik. Ups. Kliknij prawym przyciskiem myszy lub klawiszem Control mój plik. Chodź, moja mysz nie współpracuje. Download-- Zamierzam pobrać wszystkie pliki tutaj tak tak więc mogę złapać tego. I zobaczymy, czy to działa students.csv-- raz pierwszy Mam aktywowane. Teraz chcą zobaczyć moje kontakty. Teraz muszę się zarejestrować. Zobacz jak łatwo jest używać pliki CSV? Tak, utrzymać go na bieżąco. OK, teraz jesteśmy gotowi na klasy. OK, oh, co nowego? OK, blisko. To było magiczne. OK, teraz musimy zaktualizować. I teraz, że zapomniał, co plik początkowo otwarte, ale co tam A-- idziemy. OK, więc teraz mamy plik programu Excel. Dziękuję. OK, więc to, co zrobiłem było łatwe. Oczywiście, że mogło preinstalowany Excel lub liczb, czy cokolwiek innego programu. Ale to miłe, ponieważ teraz mogę manipulować dane w standardowym formacie. Kontekst Więc teraz niech przełączyć na którym skończyliśmy Ostatnim razem, co było do początku zdjąć kółka. Ale po pierwsze, nie zrobił zobacz ten wcześniejszy obiad znowu dzieje się tutaj w Ogniem i Lód w Cambridge, Sitar w New Haven. Zarejestruj się na stronie internetowej CS50s ASAP CS50 do udziału studentów i pracowników. Więc wzięliśmy kółka się w poniedziałek, jak follows-- Łańcuch został ogłoszony w Biblioteka CS50s przez jakiś czas. I to jest dobre, ponieważ pozwala nam mówić o zmiennych jako kompletne słowa i zdania i więcej. Ale okazuje się, ciąg nie istnieje. To jest po prostu synonimem lub pseudonim, że udało nam się stworzyć czegoś, co w rzeczywistości jest nieco bardziej techniczne zwane char *. I rzeczywiście, widzieliśmy przykład programu w poniedziałek że nie zachowują się zupełnie jak oczekiwaliśmy. To był plik, porównać-0. I przypominam, że porównanie-0, jeśli I ponownie skompilować program z poniedziałku i uruchomić porównać-0 i wpisać mamę w małymi literami, małymi literami, a mama znowu. Program nalegał I wpisać różne rzeczy, chociaż mama, wszystko w małe, jest identyczne wizualnie. Więc co to krótka odpowiedź dlaczego komputer myśli te dwa ciągi są różne? Tak? PUBLICZNOŚCI: [niesłyszalne] David J. MALAN: Racja. Tak, mama, po raz pierwszy I wpisz go w, jest bycie przechowywane gdzieś w moim komputerze Pamięć ale w innej lokalizacji niż raz drugi mam wpisać mamą. Teraz to na pewno może być zoptymalizowane. Komputer może być inteligentny i zrealizować te dwa ciągi, hej, są one identyczne. Nie pozwól mi niepotrzebnie go przechowywać. Ale komputery nie rób tego optymalizacja chyba powiedzieć im. Tak, domyślnie są one po prostu się skończyć w dwóch różnych miejscach w pamięci. I tak, aby być bardziej jasne, kiedy porównaliśmy dwa ciągi, Pierwszym było nazywane s, drugi został nazwany t, co konkretnie było mi Porównując tutaj, na linii 13? Tak. PUBLICZNOŚCI: Jest to miejsce w pamięci że zmienna będzie wskazywać. David J. MALAN: Dokładnie, jestem Porównując miejsce w pamięci że te zmienne wskazał. Tak więc konkretnie, jeśli mama w Liczba bajtów 1 i 2, i 3, i 4-- bo pamiętam ukośnik 0 musi być aż w końcu. A druga instancja mama, m-o-m, się pod adresem 10, 11, 12 i 13 lat. Miałem porównanie 1, że adres, że miejsce w pamięci, wobec 10, który jest Oczywiście nie same. 1 nie jest 10. Więc to jest ładne, w które to całkiem proste. Ale jest to problematyczne, o ile Nie możemy porównać ciągi. Więc fundamentally-- i na tym niskim poziomie, jeśli chcesz do wdrożenia program do porównania dwa oddzielne słowa, że Filmaster wpisany w zakresie jakości, oni kolejce char dla char, tylko w sposób ogólny, co musimy zrobić, widocznie? Nie wystarczy po prostu spojrzeć na te dwa adresy. Co trzeba zrobić? Tak? PUBLICZNOŚCI: iterację string [niesłyszalne]. David J. MALAN: Tak, niech iterację łańcucha. Użyjmy pętli for, pętli while, lub co jesteś najbardziej komfortowo. A jeśli mamy dwa ciągi gdzieś w pamięci, spójrzmy na każdego roku Pierwszy znak, to każdy jest druga charakter, potem trzeci, i czwarty, i piąty, aż trafiliśmy co Szczególna wartość wartowniczego? PUBLICZNOŚCI: [niesłyszalne] David J. MALAN: Tak, odwrotny ukośnik zero, przy której w każdej struny możemy uznać, że jest to. Czy możemy dopasować każdy pojedynczy znak? Jeśli nie, return false. Jeśli tak, to zwróci true. I tak to właśnie ta wersja programu porównać-1.c robi. Jest on identyczny z tym, co spojrzał na poniedziałek, z wyjątkiem, że mam pozbyć się string-- słowo choć że nie ma impact-- funkcjonalną wszystkich Robię teraz jest usunięcie niektóre wizualne kółka, ale aby zobaczyć wyraźnie, że s i t są adresami. I to właśnie gwiazda, gwiazdka, reprezentuje Jest to adres, który zwie bardziej technicznie jako wskaźnik. Kiedy więc Oświadczam s na linia 9 i powiedzieć, char * s, to nie znaczy, daj mi łańcuch. Oznacza to, że dał mi zmienną, której celem w życiu jest, aby zapisać adres. Ponieważ mam zamiar umieścić adres ciąg do niego. I rzeczywiście, GetString, być jasne, nie zwraca ciąg. To nie wraca mama backslash zero, per se. Co getString specjalnie i precyzyjnie wrócić? PUBLICZNOŚCI: [niesłyszalne] David J. MALAN: adresu, adres pierwszego znaku w pewien ciąg ma to zdobyć. A więc teraz widzimy Hasło specjalny ponownie. A, wspomniałem o tym wcześniej. To będzie dobry konwencji że zobaczymy znowu i znowu teraz. Sprawdzam, aby upewnić się, że s nie jest nieważna i t nie jest null. Ponieważ opiera się na mojej naprawdę szybkie wzmianka wcześniej, co może oznaczać, jeśli nie zwraca GetString adres ale N-U-L-L, który jest ponownie jakaś specjalna wartość? PUBLICZNOŚCI: Błąd. David J. MALAN: To błąd. Coś poszło nie tak. A co zwykle może się zdarzyć, zwłaszcza z strings-- co może być o nieznanej długości w advance-- być może komputery " z pamięci, może wpisany w taki długie słowo lub zdanie lub wklejone tak ogromny esej jest po prostu mało pamięci. I tak GetString nie mogą wrócić adres całej sprawy, tak, to po prostu nic nie zwraca. I to mówi błąd działo się zwracając szczególną wartość NULL. Jest to adres zera, że ​​tak powiem. Teraz okazuje się, C pochodzi z Funkcja, która robi to iteracji. Nie mamy do wykonania to z pętli for lub while siebie. Możemy użyć funkcji, nazywa zwięźle, wymieszać komp, lub ciąg porównanie, którego celem w życiu jest zrobić dokładnie to. Dajesz mu dwa wskaźniki, dwa adresy, i przejdzie do tych adresów a następnie porównać nas na List do listu do jakości, zatrzymując się tylko wtedy, gdy to, co jest prawdą? Gdy intuicyjnie powinien mieszać comp przestają iteracji, żeby była jasność? Gdy natrafi ukośnik 0 w obu ciąg, w którym momencie może zdecydować, ma wszystko dopasowane, lub Czy nastąpiła rozbieżność? Tak więc, jeśli prowadzimy tego teraz i spróbować nasza gra trochę kapitalizacji, tak, aby porównać-1, ./compare-1 i wpisz mama małymi literami zarówno razy. Teraz to samo. A jeśli zrobię to ponownie małe litery, a następnie być może wielkie litery. Teraz rzeczywiście odróżnia między górną i małe litery. Więc nie takie trudne lub magiczne, ale nie teraz wyjaśnić co dzieje się pod maską. Więc co więcej możemy wyodrębnić z takiej lekcji? Warto więc spojrzeć na to. Mam zamiar iść dalej i napisać szybkie Program tutaj nazywa kopiowaniem 0. A teraz idź i właściwie zróbmy this-- z kopią-0, spójrz na to, co mam tutaj. Pierwszy raz poinformować użytkownika, coś powiedzieć. Wtedy otrzymasz string i przechowywać go w s. Następnie sprawdź, czy s równa równa NULL, po prostu zwraca 1. Więc jest to tylko standardowe sprawdzanie błędów. Nic ciekawego się nie stało. I rzeczywiście, jeśli mamy pozbyć się błędu sprawdzanie, to wygląda jak kod tygodnie 1 w tym momencie. Ale zacząłem się dostać trochę lepiej o tym. Teraz w linii 16, tydzień temu, może dni lub nawet parę minut temu, można powiedzieć, linia 16 jest tworzenie zmiennej o nazwie t i kopiowanie s do niego. I to jest doskonale rozsądne wynos. Ale teraz bardziej precyzyjne. Co się dzieje w linii 16? Co jest uzyskiwanie skopiowane od prawej do lewej? Tak? PUBLICZNOŚCI: Czy t uzyskanie adresu s? David J. MALAN: Dokładnie, t jest coraz adres s. Więc być jasne, teraz, gdy odejdę z powrotem do tego wcześniejszego przykładu a ja wyciągnąć coś mam wpisane w. I co mam wpisane in-- oto s, a tu jest to, co mam wpisane w gdzieś w Pamięć, mama, a następnie ukośnik 0, który jest dodawany do mnie. Co ja przechowywane w tu przypomnieć, to jest w pozycji 1, 2, 3, 4, jest to, co jest obecnie w s. Więc jeśli na linii 16, mówię daj mi innej zmiennej o nazwie t i sklep się na wartość S, co zostanie zapisane tutaj nie będzie mamą ale raczej jest to numer 1. Więc jeśli spojrzymy w przyszłość w tym programie Teraz, to co się stanie? Tak więc zauważyć, że istnieje funkcja ta może po Korzystaliśmy z tego jakiś czas temu do Cezara, lub Vigenère, czy nie może być w ogóle. Twierdzę z moim printf, jestem zamierza wykorzystać do kopiowania t. Najpierw w linii 19, szybki rozsądku sprawdzić, strlen sprawdza długość t. Bo nie chcę starają się wykorzystać coś jeśli nie ma ciąg tam. Jeżeli użytkownik po prostu wciskamy Enter, nic nie wykorzystać. Więc nie chcę zrobić linię 21. Tak więc linia 21 jest czerpanie którego list, najwyraźniej, w t? PUBLICZNOŚCI: m? David J. MALAN: To wygląda jak jest kopiowanie, który z nich? PUBLICZNOŚCI: m. David J. MALAN: Uh, m. OK, więc pierwszym m, z powodu uprzedzenia, że ​​jestem przechodząc do TOUPPER, które jeśli nigdy wcześniej nie widziałem, że to tylko funkcja wykorzystać jako wejścia. t Uchwyt zera oznacza dać mi znak zero t. I tak, jak to robi Zmiana obraz, aby być jasne? Co musi się przepisany lub zmienione w stosunku do S i T i mama backslash zero. PUBLICZNOŚCI: [niesłyszalne] David J. MALAN: Tak, więc ten tutaj, po prostu musi się przebrać to-- naprawić this-- musi się zmienić na kapitałowego m. Ale teraz, spójrz później w Program, jeśli wydrukować s i t, jak czyścić tu oglądać co stanie się drukowanie S i T. Tak, aby kopia-0, ./copy-0. Pozwólcie mi iść do przodu i wpisz w mama we wszystkich małych liter. Zauważ, zarówno oryginalne i kopia zostały aktywowane. Czemu? Oraz, s i t są jak wskazuje, jeśli będzie ten sam fragment pamięci. I szczerze mówiąc, to jest coraz Naprawdę uninteresting-- fakt, że używamy adresów zera tutaj. To znaczy, ja naprawdę nie obchodzi gdzie rzeczy są w pamięci. Niestety jestem kasowania trochę za dużo. Ale ja naprawdę nie obchodzi gdzie rzeczy są w pamięci. I tak, rzeczywiście, co programiści mają tendencję do myślenia jest to, że kiedy mówisz o adres, lub wskaźnik, kogo to obchodzi, gdzie jest to w pamięci. Nie obchodzi mnie, czy to w bajt jeden lub jeden miliard. Właśnie obchodzi, że to Zmienna jest skutecznie wskazując na tym fragmencie pamięci. I tak, od tej chwili, a nie spierać na dowolnych adresów pamięci, niech po prostu zacznij rysować wskaźniki jako wskaźniki, jak strzały. Więc co S i T są naprawdę, zgodnie z tym programem ponieważ, jak stworzyłem t, to zaledwie dwa oddzielne zmienne wskazując w tym samym fragmencie pamięci. I nie obchodzi mnie, gdzie są. Więc możemy się tym abstrakcyjne szczegółowo. Więc jak to naprawić? Jeśli chcę napisać wersję kopii program, który faktycznie kopiuje ciąg i aktywuje tylko kopia, tylko intuicyjnie, co ma być składnikiem naszego rozwiązania? PUBLICZNOŚCI: [niesłyszalne] David J. MALAN: Potrzebujemy co? PUBLICZNOŚCI: fragment pamięci. David J. MALAN: Musimy kolejny fragment pamięci, prawda? Nie wiemy, jak zrobić to jeszcze koniecznie. Ale trochę trzeba to się stało tak że oryginalny mama małymi literami kończy się w tym dodatkowym kawałkiem pamięci. A potem, kiedy zmienić kopię, ja nie chce zmienić tę kopię tutaj. I zamiast tego chcesz zmienić tylko to Kopia tak, że oryginał jest bez zmian. Więc, zobaczmy, w jaki sposób możemy to zrobić. W copy-1, która już ma został pozbawiony komentarza, ale jest skomentował w Internecie. My, zamiast zrobić to following-- nich linie są identyczne, daj mi ciąg i nazywają to s. Ale teraz spójrzmy na jednym z naszych najbardziej Kompleks ale ostatni złożoności na chwilę, linia 16 jest dokładnie to. Więc jeśli wygodne z obraz po prostu drew-- daj mi nowy kawałek pamięci, skopiować wszystko, co do niego, Zobaczmy, jak to przetłumaczyć na kod. Tak więc linia 16, na lewej stronie, char * t daje mi to pole tutaj. To wszystko, co robi. Z prawej strony, m alokacji lub malloc, jest alokacja pamięci, bardzo fantazyjne, to tajny sposób po prostu mówiąc: daj mi kawałek pamięci. Ile pamięci jest nam potrzebny? No cóż, to rodzaj dużej ekspresji. Ale zobaczmy, co tu jest napisane. Tak, oczywiście, to dać mi długość ciąg s. Tak, mama powinna być, co? Więc tylko trzy, prawda? mama ma trzy znaki. Nie liczyć backslash zero po mówić o długości łańcucha jest to rzeczywiście ludzkie widoczne litery. Więc mama, więc to daje mi 3. Ale zaraz, jestem teraz dodanie 1. Dlaczego właściwie chcesz przeznaczyć 4 bajtów, a nie tylko 3? Tak? PUBLICZNOŚCI: Dla wartości wartowniczego? David J. MALAN: Dokładnie, dla tej wartości wartowniczego. Dla backslashem zerowej, Potrzebuję 4 bajty. Więc muszę długość łańcucha plus 1. A potem po prostu na dobre measure-- mimo że w tym systemie to zawsze będzie 1-- mówię pomnożyć to przez rozmiar char. Okazuje się, że sizeof jest operator w C, który po prostu mówi się liczba bajtów to wymagany dla określonego typu danych. To nie działa dla tablic, zazwyczaj, czasami to robi. Jednak w przypadku ogólnym, no. Ale to powiedz mi, jak wiele bajtów, char to, co okazuje się zawsze 1. Tak to jest jak mnożąc przez 1. Tak bardzo tajemnicze spojrzenie linii kodu. Ale wszystko, co robi to daje mi fragment pamięci. Ale nie wydaje się być kopiowania coś w tej pamięci? Jeszcze nie. A więc co mam na linii 22, a 23, 24, 25, no, po prostu to zrobić. I to jest coś w rodzaju stara szkoła rzeczy teraz. To jest jak pset 2, gdzie jesteś po prostu się rzeczy wokół w pamięci, a raczej w łańcuchach. Więc jestem iteracji od 0 do długość łańcucha s. A ja kopiowania i-tego znaku w s do i-tego znaku w t. A ponieważ ja, programista, wykonane Pamiętaj, aby przydzielić dokładnie tak, jak wiele bajtów jak trzeba, jest doskonały jeden-do-jednego związku. I skopiować mamę w małe litery na nowy. I wtedy wreszcie zrobić ten wiersz. A więc efekt tylko wykorzystać ten t tutaj. Tak wiele do wchłonięcia, ale jeśli tylko uznają co się naprawdę dzieje na pod maską jest po prostu przesuwając je bajty się, wszystko konieczne jest, aby rozwiązać ten problem po prostu dać nam ten fragment pamięci. Teraz na ryzyko przytłaczające, pozwól mi pokazać Innym przykładem, że prawie identyczne, z wyjątkiem tego jednego linii kodu. Więc to jest wersja haker tego programu, jeśli będzie. Ale niech tylko destylować to do tego, co się dzieje. Linia 24 kiedyś to t Uchwyt i dostaje s uchwyt i. Teraz jestem zmianę na znacznie bardziej tajemniczy gwiazda t plus 1 równa się gwiazdą s plus 1. Więc co się dzieje i dlaczego mamy znak gwiazda? Widzieliśmy gwiazdę przed i jest używany tu jest inaczej. Wcześniej widział char *, teraz widzę gwiazdy na początku, i to jest OK. Bo okazuje się, my rodzaj można wnioskować tylko z od tych, które pierwsze zasady, co się dzieje. Więc po prostu być jasne, co to s? W zeszłym tygodniu, to był łańcuch. To nie wystarczy już. Co jest s, zwłaszcza? PUBLICZNOŚCI: [niesłyszalne] David J. MALAN: Jest to wskaźnik. Jest to adres z Pierwszy znak, że wpisane. OK, to, co jest t? PUBLICZNOŚCI: [niesłyszalne] David J. MALAN: adres pierwszego bajta wt, że fragment pamięci przydzielone. Okazuje się, że kiedy iteracyjne od 0 do łańcucha length-- przede wszystkim ja rozpoczyna się na 0, ponieważ tej starej szkoły dla pętli rzeczy. Tak tylko dla uproszczenia, niech Zakładamy, że pierwszy wiersz kodu jest tak naprawdę to, prawda. Jeżeli i jest zero, dodając do zera do czegoś przypuszczalnie nie będzie mieć wpływ. Więc co to jest powiedzenie? Okazuje się, że gwiazdy operator w tym kontekście jest wyłuskanie Operator, który jest po prostu fantazyjny sposób na powiedzenie iść na adres. Tak więc, gdy s jest adres pierwszego znak w tym fragmencie pamięci, * s środki tam. A ponieważ mamy wyciągnąć obraz w ten sposób, można przyjąć po modelu mentalnego. Jeśli jest to s, a ty mówisz, * s, * s trochę jak zsypy i drabiny, jeśli pamiętać grę z dzieciństwa, jest jak podążać tą strzałkę i przejdź dla adresu. * t jest to samo. Więc zacznij tutaj, przejdź do jej fragment. Nie mogę po prostu zwrócić na ten ekran w ten sposób. * t oznacza udać się tutaj. A potem, do pętli jest po prostu mówiąc przenieść tę postać tutaj, przenieść tę postać tutaj, przenieść ten znak tutaj. Ale jak mam to zrobić incrementation? Muszę cofnąć to, co właśnie usunięte. To jest to, co zwykle nazywa wskaźnik arytmetyczne, które Oznacza matematyki z adresami. Jeżeli w tej pętli, Ciągle zwiększający i, i s oznacza liczbę adresów a t jest adres, jeśli po prostu dodajemy 1, że po prostu oznacza, naprzód, i przekazuje i przekazuje do pamięci. To jak Oxford Street Ulica, że ​​budynek CS jest. Budynki CS jest na 33 Oxford Street. Więc jeśli było zrobić 33 Oxford Street plus 1, które przynosi do 34 Oxford Ulica, następnie 35 Oxford Street, następnie 36 Oxford Street, niezależnie od tych, budynki rzeczywiście są - o ile takie istnieją. I tak, to wszystko robimy tutaj z arytmetyki wskaźników. Więc jest to bardzo tajemna droga wyrażania siebie. Ale wszystko, co się dzieje pod maską jest po prostu po tych adresów, jak po mapę, jeśli chcesz, lub po strzały jak mamy narysowany na ekranie. OK, dużo do strawienia. Wszelkie pytania na temat składni, koncepcje, wskaźniki, malloc, lub tym podobne. Tak, tutaj w pierwszej kolejności. PUBLICZNOŚCI: Więc gdzie to mówi * t * t równa toupper, jest to, że zamierza wykorzystać wszystkie litery lub just-- David J. MALAN: Ach, bardzo dobre pytanie. Więc w tej linii tutaj, 31, to jeszcze wykorzystać Pierwsza litera lub wszystkich liter. Warto więc odpowiedzieć, że będzie z powrotem do pierwszych zasad. I pierwsze zasady tutaj mam na myśli Wystarczy przejść do podstawowych definicji z tego, co się z tym wiąże. Więc toupper to funkcja które aktywuje char. To wszystko. * t oznacza przejść do first-- przejdź na adres w t. Tak więc, na rysunku, jeżeli jest to klocek pamięci mamy przydzielone z malloc, i to jest t, * t oznacza tutaj. Tymczasem, jesteś przejazdem że wartość, małe m do toupper, dostajesz z powrotem Kapitał M, gdzie jesteś wprowadzenie go? Jesteś wprowadzenie go w tym samym miejscu. I tak przez tę logikę tych podstawowe definicje To tylko pierwszej litery chyba iteracyjne z I lub do pętli lub pętli while, to nie będzie zrobić coś więcej, niż poprosić go. Dobre pytanie. Tak? PUBLICZNOŚCI: Dlaczego używasz dereference metody, a nie tablica? David J. MALAN: Ach, dobre pytanie. Dlaczego chcesz użyć dereference Sposób zamiast metody macierzowych Żadnego powodu, aby być uczciwym. I rzeczywiście, w tym rodzaj przykład, w prawo, Mówię tylko, argumentując, czyniąc Program bardziej skomplikowane, więcej oczy są przeszklenia na, ludzie sprawdzić bo to wygląda bardzo ezoteryczne, ale nawet jeśli to robi to samo. A tak szczerze mówiąc, to jest niepotrzebnie wizualnie kompleksowe rozwiązanie problemu. To wciąż dobry projekt, pięć z pięciu do projektowania, czy to w uchwycie Zapis lub oznaczenie wskaźnika. Ale-- zwłaszcza, gdy mamy później w toku w pset 5 kiedy wdrożenie tego słownika, który Pisałem kilka times-- my właściwie dbać o adresy pamięci niski poziom że naprawdę zrozumieć, co się dzieje. Ale teraz okazuje się, że to linii kodu nawiasach tutaj kwadratowych tak naprawdę nie istnieje. Są to, co nazywa lukrem składniowym, które jest po prostu niesamowicie fajny sposób mówiąc kompilator zamienia nawiasy kwadratowe być to wyrażenie matematyczne. Więc jest to ludzka konwencji aby móc się pisać te bardzo łatwy w obsłudze wsporniki. Ale to, co kompilator, dzyń, naprawdę robi w każdej chwili piszesz, co podkreślono w linii 24, pod maską to naprawdę przekształcenie go do tego. To jest po prostu bardziej przyjemne jako człowiek czytać i pisać kod jak wiersz 24. Ale w końcu ci, kółka zbyt schodzą kiedy czyjaś własna wygoda dostaje silniejszy. W porządku, więc pamiętam to, że ta był typem największy problem wpadliśmy. I to, co wywołało tę całość cholernie rozmowa o wskazówki, oraz adresy i rzeczy kopiowania. To było dlatego, że potknął się ten głupi, głupi problem, przy czym I wdrożone logically-- z Lauren tutaj na demo i soku pomarańczowego w milk-- doskonale algorytmicznie prawidłowa funkcja do ciężkich dwie zmienne " wartości, ale to cholerstwo nie ma żadnych trwałych, lub stałe, wpływ na mojego kodu. I dlaczego to było? W skrócie, dlaczego jest to Realizacja wymiany logicznie poprawne, ale nie ma wpływu od zmiennych, które są przekazywane do niej, jak x i y dla Głównym? Co było sedno problemu? Tak? PUBLICZNOŚCI: Ponieważ zmienna wykonane kopie zmiennej w przejściu za pośrednictwem funkcji. David J. MALAN: Dokładnie, kiedy przechodzą zmienne w funkcji lub argumenty do funkcji, są one uchwalona przez egzemplarzu, który oznacza, że ​​otrzymasz identyczny patrząc wzór bitów dla X i Y, zwany tu i b. I można zrobić wszystko chcesz z tych kopii, ale nie będziemy mieć żadnego Wpływ na funkcji wywołującej. I rzeczywiście, zwróciliśmy że obraz na ekranie, wycofanie Ostatni raz, przy czym, jeśli Ciebie naprawdę myślisz o tym, co dzieje pod spodem hood-- jeśli to jest pamięci komputera, i tu jest fragment Pamięć jest stosowany w głównym, jest to fragment Pamięć jest używany do wymiany, i tak, nawet jeśli główny ma dwie zmienne X i Y, Swap może mieć identyczne spojrzenie wartości, z których oba są 1 i 2, ale są całkowicie różne kawałki pamięci. Musimy więc rozwiązanie tego. I szczerze mówiąc, wydaje się, że teraz ma rozwiązanie tego problemu, prawda. Jeśli mamy zdolność do manipulować rzeczy w drodze adresów oraz, w rodzaju zjeżdżalnie i drabiny styl, wykonaj następujące strzały i gdziekolwiek chcemy w pamięci, nie mogliśmy Rozwiązaniem tego problemu przechodząc z głównym do wymiany nie wartości chcemy wymiany, ale po prostu intuicyjnie co możemy przejść do wymiany, a nie? [Wstawienie GŁOSY] David J. MALAN: Dlaczego nie możemy po prostu przekazać, że adresy, prawda? Dlaczego nie dajemy zamienić skarb mapa, jeśli chcesz, prowadziłoby to do Rzeczywiste wartości xi y. Miejmy wymiany, faktycznie zmienić te oryginalne bity, a nie tylko przejazdem kopie bitów. I tak, w rzeczywistości, to, co jest będzie rozwiązaniem. Ta wersja tutaj jest jednoznacznie złe i błędne. A teraz, na pierwszy rzut oka, to po prostu wygląda jak dodaliśmy kilka gwiazd losowo i przekroczył nasze palce że to skompilować. Ale, to teraz skompilować. Ale zobaczmy, co to znaczy. I, niestety, autorzy C mógł wybrać inny symbol aby ten mały jaśniejsze, ale operator gwiazda ma inne znaczenie w Dwa różne konteksty. I jak widzieliśmy, ale niech odróżnić. Tak się w tam na górze, kiedy zostały zmienione a i b od bycia int jest w złym Wersja do int gwiazd, A i B, Poprzednio były liczbami całkowitymi. Jakie są aib teraz dobra, zielona wersja? Są adresy. Adresy co, być jasne? Adresy liczb całkowitych. Tak więc fakt, że jestem mówiąc środki int gwiazdkowe To jest adres liczbą całkowitą, a konkretnie. Więc teraz zauważyć w linii kodu, jeszcze coś się zmieniło też. tmp pozostaje takie same, ponieważ to tylko tymczasowa całkowita, nie magia istnieje pamięci. Ale teraz musi gwiazdę. I faktycznie każdy inne wzmianki o A i B, zauważysz, że wszystko, co zmienia się od czerwieni do zieleni jest to, że jestem poprzedzenie te zmienne z gwiazdami. Bo nie chcę, aby skopiować i b. Bo jeśli po prostu skopiować aib oraz swapu a i b, co ja właściwie zamiana? Zaledwie adresy, chcę zamienić co pod tymi adresami. Chcę tam pójść. I tak operator gwiazda wewnątrz mojej funkcji, nie wewnątrz listy parametrów, oznacza idziesz do tych adresów i rzeczywiście zmienić te wartości. Więc co robi zdjęcie teraz wyglądać zamiast. Cóż, jeśli zamiast olewam w w A i B 1 i 2-- I rzeczywiście trzeba dodać jedna definicja tutaj. Więc przypuszczam, że ten fragment pamięci jest w miejscu 10. To jest w miejscu 11, ale w tym jest trochę uproszczeń, Mam teraz dwie możliwości mogę przekazać x i y czy mogę przekazać swoje adresy? Jeśli mijam ich adresy tak, po prostu Teraz należy wdrożyć Swap na zielonej kod tak, że gdy widzi, a kiedy widzi b, to nie wystarczy skopiować aib i przesunąć mleko i sok pomarańczowy. Mleko i sok pomarańczowy metafora teraz zepsuje, ponieważ są puchary mapy płynnych i nie. My zamiast tego trzeba iść do zajęcia 10 i my trzeba iść do rozwiązania 11, oraz następnie wykonać tę logikę swap. Tak więc układ logiczny jest tym samym, lecz musimy nieco inny sposób z dostępu do tych zmiennych. A więc w końcu, co Program ma wyglądać jak to jest. W swap.c dosłownie skopiowane i wklejony zieloną wersję. Ale muszę dokonać jednej zmiany. Nie wystarczy po prostu zmienić swapa. Co druga linia kodu muszę zmienić? Tak? PUBLICZNOŚCI: Gdzie to ma argumenty. David J. MALAN: Gdzie to ma swoje argumenty. Więc jeśli mogę przewinąć do głównego, ja Nie można po prostu przejść w X i Y, i obiecuję, ostatnia kawałek nowej składni dziś. Trzeba przekazać w nie xi y, ale adres xi y. I okazuje się, symbol że autorzy C wybrał to jeśli używasz ampersanda tutaj, aby nie mylić z ampersand mnożenie, jeśli używasz ampersanda tutaj i ampersand tutaj, to dane dla ciebie, co to jest adres x, być może jest to 10, co jest adres y, może to 11, i przesyła te w zamian. Tak wiele do pochłaniają wszystko na raz. Ale zobaczmy teraz szybko nasze pozostałe cztery minuty gdzie coś może pójść nie tak. I tak na marginesie, w rzeczywistości Wziąłem ten obraz, TF zrobił to zdjęcie rok czy dwa lata temu. Tak to jest z tyłu rogu od Eliot jadalni. Wskaźniki są chyba najtrudniejsze temat, który omówimy w CS50. Jeśli więc martwić rodzaj nachylenia jest jak może to więcej kija hokejowego tak, sobie sprawę, jesteśmy trochę zbliża się szczyt w warunki pojęciowej złożoności. A ja wychować to Fotografia, bo przysięgam do Boga, w jesieni 1996 roku, kiedy wziąłem CS50 z moim nauczania kolegów, Nishat Mehta, usiadł mnie w Narożnik Eliot D. Hall podczas lunchu, lub kolacja, lub coś, aby spróbować aby pomóc mi zrozumieć wskazówki. I to jest, gdzie jestem tygodnie po został wprowadzony w wykładzie, gdy I w końcu zrozumiał wskazówki. I mam nadzieję, że ten kliknij znacznie szybciej będzie dla Ciebie. Ale sobie z tego sprawy absolutnie m.in. bardziej zaawansowane tematy poznaliśmy już. Ale to jedne z najpotężniejszych. A kiedy je dostać, to naprawdę wszystko po prostu się wreszcie razem. Tak więc pewni, że nie robi musisz wszystkich umywalka w dzisiaj. Więc tutaj jest ostatni program będziemy patrzeć. I będziemy do końca z Szybkie trzy minuty claymation wykonane przez naszego przyjaciela, Nicka Parlante. Oto program, który na górze dwa linie deklaruje zmienną x i y. Z których oba są adresami liczb całkowitych, wskaźniki AKA. Następnie przydzielić tyle pamięci do przechowywania int i przechowywać adres tej pamięci w x. Tak, to jest jeszcze prostsze niż np przed. Daj mi czterech bajtów pamięci, to jest rozmiar int, i umieścić ten adres w x. Ta linia oznacza tutaj przejdź na adres w x i umieścić znaczenia życie, liczba 42 nie. Ale ta linia mnie martwi. Gwiazda y oznacza go na adres podany w y, i podać liczbę pechową 13 tam. Dlaczego jest to niebezpieczne, w tym momencie w story-- choć szybko powiedział w naszych schyłkowych minut here-- dlaczego jest tak źle mi powiedzieć, przejdź do adresu w y? PUBLICZNOŚCI: nie masz [niesłyszalne]. David J. MALAN: nie mam umieścić coś w r. Więc jaka jest wartość y, w tym momencie w historii? Nie mamy pojęcia. To jakaś wartość śmieci i ani nie Binky wiedzieć. Gdyby udało nam się zakończyć na tej nocie. [ODTWARZANIE] Hej, Binky, obudź się. Nadszedł czas na wskaźnik zabawy. -Co to? Dowiedz się o wskazówki? Och, cukierek. -No, Aby zacząć, myślę, że jesteśmy będziemy potrzebować kilka wskazówek. -OK. Ten kod przydziela dwa wskaźniki co może wskazywać na całkowite. -ok, Dobrze widzę dwa wskaźniki, ale nie wydaje się być skierowany do niczego. -To prawda. Początkowo wskaźnikami nie wskazują na nic. Rzeczy, które wskazują na to nazywa pointees i ich ustanowieniem jest odrębnym etapem. Och, tak, tak. Wiedziałem to. W pointees są oddzielne. Więc jak można przeznaczyć wskazywany? -ok, Dobrze jest kod alokuje nowy wskazywany liczbą całkowitą, i to zestawy części X pkt do niego. Hej, to wygląda lepiej. Więc należy coś zrobić. -ok, Będę wyłuskanie wskaźnika x do zapisać numer 42 w jego wskazywany. Do tej sztuczki, będę potrzebował mojej magiczna różdżka wyłuskania. -Twój Magiczna różdżka dereferencing? Uh, to, to świetnie. -To, Co kod wygląda. Ja po prostu ustawić liczbę and-- [POP SOUND] Hej, spójrz tam idzie. Tak, robi dereference na x następująco strzałka dostęp do swojego wskazywany. W tym przypadku, w celu przechowywania 42 w środku. Hej, spróbuj użyć go, aby zapisać numer 13 przez drugi wskaźnik, y. -OK. Pójdę tu do y, i uzyskać numer 13 ustawiony. A następnie podjąć różdżkę wyłuskania i just-- [BUZZER SOUND] Och, hej, że nie działa. Powiedzieć, uh, Binky, ja nie myślę dereferencing y jest dobrym pomysłem, ponieważ ustawienie w górę wskazywany jest odrębnym etapem. I nie sądzę, że kiedykolwiek to zrobił. -Hmm, Dobry punkt. -Tak, Mamy przydzielone wskaźnik, y, ale nigdy nie ustawić go zwrócić do wskazywany. -Hmm, Bardzo spostrzegawczy. Hej, szukasz dobre tam, Binky. Można go naprawić, więc Y punktów w tym samym wskazywany jako X. -Jasne, Mogę korzystać z magiczną różdżką cesji wskaźnika. -Czy To będzie Problem, jak wcześniej? -Nie, To nie dotykać pointees. To po prostu zmienia jeden wskaźnik zwrócić się do tego samego thing-- [Trzasków] --as innego. -Rozumiem. Teraz y wskazuje na tym samym miejscu, x. Więc, czekaj, teraz y jest stała. Ma wskazywany. Więc możesz spróbować różdżkę z dereferencing ponownie wysłać 13 over. Oh, OK, tu idzie. Hej, spójrz na to. Teraz dereferencing prac na rok. A ponieważ wskaźniki dzielą że jednym wskazywany, oboje zobaczyć 13. -Tak, Dzielenie się, uh, cokolwiek. Tak, mamy zamiar zamienić się miejscami teraz? Och, spójrz mamy czasu. -But-- -Wystarczy Pamiętam trzy zasady wskaźnika. Nr 1, podstawowa struktura jest to, że masz wskaźnik, i zwraca się do wskazywany. Jednak wskaźnik i wskazywany są oddzielne. I częsty błąd jest utworzenie wskaźnika ale zapomnij dać mu wskazywany. Numer 2, wskaźnik wyłuskania rozpoczyna się na wskaźniku i następuje jego strzałkę nad aby uzyskać dostęp do jego wskazywany. Jak wszyscy wiemy, to działa tylko wtedy, gdy jest wskazywany, jaki rodzaj wróci rządzić numer 1. Numer 3, wskaźnik Przyporządkowanie następuje jeden wskaźnik i zmienia go, by wskazywały na samo wskazywany jako inny wskaźnik. Więc po cesji, dwa wskaźniki będzie wskazywać na samym wskazywany, czasem to się nazywa dzielenie. I to wszystko na ten temat, naprawdę. Do widzenia teraz. [Zakończyć odtwarzanie] David J. MALAN: To wszystko na CS50. Dzięki profesor Nick Parlante. Do zobaczenia w przyszłym tygodniu. [Electronic Music Playing]