[MUZYKI] DOUG LLOYD: Wszystko w porządku. Praca z pojedynczym Zmienne jest całkiem zabawne. Ale co, jeśli chcemy pracować z wieloma zmiennymi, ale nie chcemy mieć kilka różne nazwy latające wokół naszego kodu? W tym przypadku, tablice są przyjdzie w naprawdę przydatne. Tablice są naprawdę fundamentalne dane Struktura dla każdego języka programowania że będzie korzystać. I są naprawdę użyteczne, Szczególnie, jak zobaczymy, w CS 50. Używamy tablice do przechowywania Wartości danych tego samego typu w sąsiadujących komórek pamięci. To znaczy, że jest to sposób, w jaki możemy zgrupować kilka liczb całkowitych razem w pamięci lub kilka znaków lub pływa w pamięci bardzo blisko siebie i pracy z nich bez podania każdego jedną swoją unikalną nazwę, która może uzyskać kłopotliwe po chwili. Teraz jeden sposób analogizować tablice jest, aby myśleć o Twoim poście biuro na sekundę. Więc krok od programowania i po prostu zamknąć oczy i wizualizacji w głowie urzędzie pocztowym. Zwykle, w większości postu biura, istnieje duży bank a skrzynki pocztowe na ścianie. Tablica jest gigantyczny blok z pamięci ciągłej, w ten sam sposób, że poczta Bank w swojej poczcie Jest to duża przestrzeń na Ściana poczcie. Tablice zostały podzielone na małe, identycznie wielkości bloki przestrzeni, z których każdy jest nazywany elementem w w ten sam sposób, że ściany postu Biuro został podzielony na małe, identycznie wielkości bloki przestrzeni, które nazywamy skrzynkę pocztową. Każdy element tablicy może przechowywać pewną ilość danych, tak jak każda skrytka pocztowa jest w stanie posiadać pewną ilość mailem. Jakie mogą być przechowywane w każdym z elementów tablica jest zmienne tego samego danych typu, takich jak int lub char, tylko jak w skrzynce pocztowej, można zmieścić tylko rzeczy podobnego typu, takich jak liter lub małych opakowaniach. Wreszcie, możemy uzyskać dostęp do każdego elementu tablica bezpośrednio numer indeksu, jak możemy wejść na naszą pocztę box znając jego numer skrzynki. Mamy nadzieję, że analogia pomaga uzyskać głowę wokół idei macierzy przez analogizing do czegoś innego które są prawdopodobnie już znane. W C, elementy tablicy są indeksowane począwszy od 0, nie od 1. I to jest bardzo ważne. A w rzeczywistości, to dlaczego my, w CS 50, I dlaczego informatycy często liczy się od 0, to ze względu na tablicy z C. indeksowania, która zawsze zaczyna się od 0. Więc jeśli tablica składa się z n elementów, pierwszy element tej tablicy znajduje się przy indeksie 0, a ostatni element tablicy znajduje się na indeksie n minus 1. Ponownie, jeśli nie ma n elementów w naszym tablica, ostatni indeks jest n minus 1. Więc jeśli nasza tablica ma 50 elementów, Pierwszy element znajduje się w indeksie 0, i ostatni element znajduje się wskaźnik 49. Niestety, lub na szczęście, zależności od punktu widzenia, C jest tutaj bardzo wyrozumiali. To nie przeszkodzi wychodzi z granic swojej tablicy. Można uzyskać dostęp do minusa 3 element macierzy lub 59. elementem macierzy, jeśli tablica ma tylko 50 elementów. To nie zatrzyma program z kompilacji, ale w czasie wykonywania, może napotkasz bał winy segmentacji jeśli zaczniesz dostępu do pamięci które znajduje się poza granicami tego, co pytasz swój program, aby dać. Więc należy być ostrożnym. Co tablicę Deklaracja wygląda? Jak możemy zakodować tablicę do istnienia jak możemy zakodować dowolnej innej zmiennej? Istnieją trzy części do tablicy declaration-- typ, nazwa, i rozmiar. Jest to bardzo podobne do deklaracja zmiennej, która jest po prostu rodzaj i nazwę, element rozmiar jest szczególny przypadek na tablicy, dlatego, że są coraz kilka z nich w tym samym czasie. Więc jest to typ zmiennej, jakie można aby każdy element tablicy będzie. Czy chcesz go do tablicy liczb całkowitych? Wtedy twój typ danych powinien być int. Czy ma to być Tablica deblu lub pływaków? Typ danych powinna być dwukrotnie lub float. Nazwa to co masz Aby połączyć się z tablicy. Co chcesz, aby wymienić ten gigant bank liczb całkowitych lub pływaki lub znaków lub dwu, lub cokolwiek co? Co chcesz to nazwać? Dość wymowne. Wreszcie, rozmiar, który jedzie wewnątrz nawiasów kwadratowych, jest, jak wiele elementów byś jak swoją tablicę do przechowywania. Ile liczb całkowitych chcesz? Jak wielu pływaków chcesz? Tak na przykład, int klas 40 uczniów. Ten deklaruje tablicę o nazwie Student gatunki, które składa się z 40 całkowitymi. Dość wymowne, mam nadzieję. Oto kolejny przykład. Podwójne menu ceny 8. To tworzy tablicę o nazwie Menu ceny, które składa się miejsca w pamięci do ośmiu dwuosobowych. Jeśli uważasz, że każdy element z tablicy typu danych typu, Tak na przykład, jeden z elementów tablicę typu int, w ten sam sposób by myśleć o jakichkolwiek innych zmienna typu int, wszystkie znane operacje, że my omówione wcześniej w działalności film będzie sensu. Więc, możemy zadeklarować tablicę wartości logicznych zwanych Truthtable, który składa się z pokoju do 10 wartości logiczne. A potem, tak jak moglibyśmy przypisać wartość do każdej innej zmiennej typu Boolean, możemy coś powiedzieć jak Truthtable nawiasach kwadratowych 2, którym jest, jak to wskazuje, którego elementem tabeli prawdy? Trzecim elementem Tabela prawdy, bo pamiętam, liczymy od 0. Tak, to w jaki sposób wskazywać Trzeci element tabeli prawdy. Truthtable 2 równa się fałszywe, jak możemy declare-- albo możemy przypisać, a każdy Zmienna typu Boolean się fałszywe. Możemy również użyć go w warunkach. if (truthtable 7 == prawda), to znaczy, Jeżeli element ósmy z Truthtable jest prawdą, Może chcemy wydrukować wiadomość dla użytkownika, printf ("n PRAWDA!") ;. To powoduje, że mówią Truthtable 10 równa się prawdziwe, prawda? Cóż, mogę, ale to dość niebezpieczne, bo pamiętam, mamy tablicę 10 wartości logiczne. Więc najwyższy wskaźnik, że Kompilator dał nam jest 9. Ten program zostanie skompilowany, ale czy coś innego w pamięci istnieje, gdzie będzie spodziewać Truthtable 10 przejść, moglibyśmy ponieść winy segmentacji. My może uciec z nim, ale w ogóle, dość niebezpieczne. Więc co tu robię to C prawnych, ale niekoniecznie najlepszy pojedynek. Teraz, kiedy deklarujemy i zainicjować tablicę jednocześnie, Jest rzeczywiście dość specjalna składnia, że ​​cię można użyć, aby wypełnić tablicę z jego wartości wyjściowych. Może się kłopotliwe zadeklarować tablicę o rozmiarze 100, i muszę powiedzieć, element 0 równa się to; Element 1 równa się to; Element 2 dorównuje. Jaki jest sens, prawda? Jeśli jest to mała tablica, ty mógłby zrobić coś takiego. Bool truthtable 3 równa otwarta nawias klamrowy a następnie przecinek oddzielić listę elementów które chcesz umieścić w tablicy. Następnie zamknij nawias klamrowy średnik. To tworzy tablicę rozmiar trzy nazywa Truthtable, z elementami fałszywe, prawdziwe i prawdziwe. I w rzeczywistości instancji Składnia Mam tu jest dokładnie tak samo jak robią to Pojedynczy element składni poniżej. Te dwa sposoby kodowania would Produkujemy dokładnie tę samą tablicę. Podobnie, można iterujemy na wszystkich elementach tablicy za pomocą pętli, które, w Fakt, jest bardzo zalecane at-home ćwiczenia. Jak stworzyć tablicę 100 całkowite, w których każdy element tablicy jest jej indeks? Tak na przykład, mamy tablicę 100 całkowitymi, oraz w pierwszym elemencie chcemy umieścić 0. W drugim elemencie, chcemy umieścić 1. W trzecim elementem, chcemy umieścić 2; i tak dalej, i tak dalej. To jest naprawdę dobry at-home ćwiczenia, aby to zrobić. Tutaj, to nie wygląda jak za dużo się nie zmieniło. Ale zauważmy, że w między nawiasy kwadratowe, tym razem, Ja właściwie pominięte numer. Jeśli używasz tego bardzo Specjalny instancji Składnia chcą tworzyć tablica, to faktycznie nie należy wskazać wielkość tablicy wcześniej. Kompilator jest wystarczająco inteligentny, wiedzieć, że rzeczywiście chcą tablicę o rozmiarach 3, ponieważ można umieścić trzy elementy z prawej jednakowej znaku. Jeśli włożył cztery, musiałby wam tabelę prawdy o wielkości czterech; i tak dalej, i tak dalej. Tablice nie są ograniczone do pojedynczego Wymiar, który jest całkiem fajne. Rzeczywiście można mieć aż Specyfikatory uboczne, jak chcesz. Tak na przykład, jeśli chcesz utworzyć deska do gry Battleship, które, jeśli kiedykolwiek grał, to gra, która jest grał z kołkami na 10 do 10 sieci, można utworzyć tablicę takiego. Można powiedzieć, Bool pancernik nawias kwadratowy 10 zamknięty nawias kwadratowy plac Uchwyt 10 zamknięty nawias kwadratowy. A potem, można wybrać interpretują to w głowie, jak 10 przez 10 siatki komórek. Otóż, w rzeczywistości, w pamięci to naprawdę nie tylko pozostanie 100 elementów, pojedyncza tablica wymiarowa. I to w rzeczywistości idzie na razie Ciebie mają trzy wymiary lub cztery lub pięć. To naprawdę nie rozmnażajcie wszystkie indices-- lub wszystkich rozmiarów specifiers-- razem, i po prostu się jednowymiarowa Tablica tej wielkości. Ale jeśli chodzi o organizację i wizualizacji i ludzkiej percepcji, może to być o wiele łatwiej do pracy z sieci jeśli pracujesz nad grą jak Kółko i krzyżyk lub Battleship, czy coś takiego. To wielka abstrakcja, zamiast myśleć o Kółko i krzyżyk wyżywienie w postaci linii dziewięciu kwadratów lub płyta Battleship w linii 100 pól. 10 do 10 sieci lub trzy przez trzy sieci jest chyba o wiele łatwiej dostrzec. Teraz coś naprawdę ważne o tablicach. Możemy traktować każdy Element tablicy jako zmienną. Widzieliśmy, że wcześniej kiedy byliśmy przypisywania wartość prawda do niektórych wartości logiczne lub testowania ich w warunkowych. Ale nie możemy traktować całej karty przyodziewa się jako zmienne. Nie możemy, na przykład przypisać jednej tablicy do innego tablicy przy użyciu przypisania Operator. To nie jest legalne C. Jeśli chcemy, aby example-- co będziemy robić w tym przykładzie byłoby skopiować jednej tablicy do drugiej. Jeśli chcemy to zrobić, faktycznie trzeba użyć pętli skopiować na każdego elementu po jednym na raz. Wiem, że to trochę czasochłonne. Tak na przykład, gdybyśmy mieli te parę linii kodu, to będzie działać? No, nie, to nie będzie, prawda? Ponieważ chcemy przypisać jedzenie do baru. To nie będzie działać, dlatego, że jest tablicą, i po prostu opisane że to nie jest legalne C. Zamiast tego, jeśli chcemy skopiować zawartość żywności w barze, który jest co staramy się zrobić tutaj, musielibyśmy składni takiego. Mamy dla pętli, która wykracza z j jest równe 0 do 5, i zwiększamy J na każdej iteracji pętla i przypisać elementy takie jak to. Spowodowałoby to pasek także jako jedna, dwie, trzy, cztery, pięć, ale musimy zrobić to bardzo powolny sposób Element po elemencie, zamiast po prostu kopiując całą tablicę. W drugiej programowania języki, te bardziej nowoczesne, można, w rzeczywistości, nie tylko, proste równa składni. Ale C, niestety, jesteśmy Nie wolno tego robić. Teraz jest jeszcze jedna co chcę wspomnieć o macierzach, że może być trochę nieco trudne pierwszy raz współpracy z nimi. Omówiliśmy w wideo o zmiennym zakresie, że większość zmiennych w C, gdy dzwonisz ich funkcje, są przekazywane przez wartość. Czy pamiętasz, co to znaczy coś przekazać przez wartość? Oznacza to, że robimy Kopię jest zmienną, która jest przekazywana w. Funkcja wywoływany funkcja że będzie odbierał zmienną, nie dostać samą zmienną. To staje się jego własna lokalna kopia pracować. Tablice, oczywiście, zrobić nie przestrzegać tej reguły. Raczej, co nazywamy to przechodzi przez odniesienie. Wywoływany w rzeczywistości ma otrzymać tablicę. To nie otrzyma własna lokalna kopia. A jeśli myślisz o to, że to ma sens. Jeśli tablice są bardzo duże, to zajmuje tak dużo czasu i wysiłku aby zrobić kopię tablicy 100 lub 1000 lub 10000 elementów, że nie warto dla funkcjonować otrzymać kopię tego, popracować z nim, a następnie po prostu zrobić z kopii; nie mieć go kręcącego się więcej. Ponieważ tablice są niektóre nieporęczne i niewygodne, po prostu przekazać je przez referencję. My po prostu zaufać, że funkcja aby nie złamać coś. Więc to jest rzeczywiście dostać tablicę. Nie ma się własną lokalną kopię. Więc co to oznacza, Następnie, gdy wywoływany manipuluje elementy tablicy? Co się dzieje? Na razie będziemy połysk ponad dlaczego właśnie ten się dzieje, dlaczego tablice są przekazywane przez referencję i wszystko co jest przekazywane przez wartość. Ale obiecuję wam, będziemy wrócić i dać odpowiedź to w późniejszej wideo. Oto jedno ćwiczenie dla Ciebie zanim zawinąć rzeczy na tablicach. Pęczek kod tutaj, że to nie jest szczególnie dobry styl, po prostu zrobię to zastrzeżenie. Nie ma żadnych komentarzy tutaj, co jest całkiem zła forma. Ale to tylko dlatego, że chcę być w stanie zmieścić wszystko na ekranie. Na górze, widać, że mam dwie deklaracje funkcji dla zadanej macierzy i ustawić int. Zestaw tablica podobno pobiera tablicę z czterech liczb całkowitych jak jego wejścia. A zestaw int podobno trwa jedna liczba całkowita jako wejścia. Ale obaj nie mają wyjścia. Wyjście, powrót typu, z których każdy jest nieważna. W Main, mamy kilka linii kodu. Deklarujemy zmienną całkowitą, nazywa się i przypisz jej wartość 10. Oświadczamy tablicę czterech liczb całkowitych zwany B i przypisać elementy 0, 1, 2 i 3, odpowiednio. Następnie mamy rozmowę, aby ustawić int i wezwaniem, aby ustawić tablicę. Definicje ustawionej tablicy i zestaw int w dół poniżej dolnej krawędzi. I tak, ponownie, zadam ci pytanie. Co zostaje wydrukowana tutaj, na końcu Main? Istnieje kol wydruk. Jestem drukując dwie liczby całkowite. Jestem drukowanie zawartości oraz zawartość B uchwyt kwadratowy 0. Wstrzymaj film tutaj i zająć minutę. Można dowiedzieć się, co to Funkcja drukowania na końcu? Mam nadzieję, że jeśli przypomnieć Rozróżnienie pomiędzy przechodzącej wartości i przechodzącej przez odniesienie, w tym Problemem nie było zbyt trudne dla Ciebie. A odpowiedź byś znalazłem jest to. Jeśli nie jesteś pewien, co do dlaczego tak jest, weź drugi, wrócić, sprawdzić, co ja po prostu dyskusji na temat przekazywania tablic przez odniesienie, w porównaniu do przechodzenia inne zmienne przez wartość, i miejmy nadzieję, będzie to make trochę więcej sensu. Jestem Doug Lloyd, i to jest CS50.