[Powered by Google Translate] [評論:測驗1] 阿里的Nahm,Oreoluwa Barbarinsa,盧卡斯·弗雷塔斯,羅布·鮑登] [哈佛大學] 這是CS50。[CS50.TV] 盧卡斯·弗雷塔斯]歡迎大家。這是審查測驗1。 正如一個聲明,這是 - 我的意思是,我們要盡量覆蓋 為盡可能多的材料,但是,這並不意味著 我們將覆蓋所有的東西,可以是測驗1。 因此,可以肯定,你也來看看在演講中,第一切,你可以。 測驗1日(星期三),下週三將是。 因此,一定要學習。這將是幾乎一樣,第一次測驗 關於它的格式,但它可能會更難。 至少,去年我花了50元時,我想這是更難。 所以,學習了很多東西。 我要說的是,數據結構和哈夫曼編碼。 這是什麼,很多人認為是複雜的, 但我要去嘗試,使其盡可能容易。 首先,我們要你們知道問答1 理解,我要提出的每一個的數據結構的概念性描述。 這意味著,你沒有實際 實現一個哈希表,在您的問答1。 我們不希望你實​​現一個整體的哈希表,也許我們可以嘗試 讓你實現一些功能, 最常見的操作,但我們不會讓你實現一切。 所以,重要的是你了解每個數據結構背後的概念 ,您也可以在C代碼, 只是最常見的操作,它們的每個數據結構。 還可以審查指針和結構, 因為這些數據結構中出現了很多。 首先,鍊錶。鍊錶的數組實際上是非常相似的, 但一個鏈接列表和數組之間的差異, 首先,是一個鏈接列表,有一個非常靈活的大小, 而在你選擇了一個非常大的大小的數組的數組, 所以你知道你要能夠在該數組來存儲所有的數據, 或者你必須使用malloc有一個靈活的數組的長度。 在鍊錶中,它很容易得到更多的元素, 把更多的鏈接列表中的元素或刪除元素。 實際上,如果你不想要鏈接的列表進行排序, 你可以搜索和刪除元素,在固定的時間, O(1)的時間,所以這是非常方便的。 你一定要小心,要永遠記住malloc和free的節點, 只是因為如果你不這樣做,你就會有內存洩漏。 所以鍊錶 - 節點的定義,就像我們所擁有的在那裡。 我把整數n,但是你可以存儲任何你想要的數據。 所以,如果你想存儲一個字符串,它的罰款。 如果你想存儲一個結構,它是正常的,雙,任何你想要的。 我只是把整數n為這裡的例子。 你有一個指針到下一個節點。 因此,基本上是一個鍊錶有一些數據,然後它指向下一個節點。 如果它的鏈接列表中的最後一個元素,它會指向NULL。 因此,這是一個鏈接的列表的一個例子。 好了,現在讓我們來看看我們應該做的,如果我想在一個鍊錶中插入一個元素。 首先,將功能插入類型為void 因為我不想返回任何東西。 我要接受一個int作為參數, 因為我想知道我要插入。 那麼,什麼是我應該做的第一件事情嗎?好吧,我應該newnode的malloc上, 所以這是第一線。 我只是把一個鍊錶中創建一個新的節點。 所以,我能做些什麼呢?好了,我們知道,在我們的鍊錶的實現 在課堂上,我們始終把頭部作為一個全局變量。 所以,我們能做的就是改變頭。 我可以使這個新的節點是新的頭, 和它的將以指向先前磁頭。 如何才能做到這一點呢?我必須做的第一件事情 被改變的價值,在新的節點上的'n' 這是傳遞給函數。 newnode的未來將是頭部。 頭將是newnode。因此,它是非常簡單的。 為了刪除一個節點,我們可以像 - 我們能做到這一點的方法之一是說, 好吧,如果我想刪除,例如,3, 我可以做什麼,只是點的前一個節點 3到下一個節點。 所以,我只想做類似的東西。 但這樣做的問題是什麼? 我有一個內存洩漏,所以我沒有再數3。 的問題,那就是,我不打算能夠釋放該節點。 我將有內存洩漏(不知所云)會恨我。 因此,而不是這樣做的話,我應該有一個臨時指針。 所以我把溫度。這是要指出,我想刪除的節點。 然後,我可以將以前的節點,以點到下一個節點 我要刪除的節點。 最後,我可以釋放的指針。 我一定要釋放的指針,我在那裡嗎? 我沒有,只是因為 - 不同的是,這個節點是使用的malloc, 所以這是在堆中,而這一次是剛剛宣布為NULL堆疊中的交換機。 所以,我不釋放它。 好吧。所以,現在讓我們來談談棧。 棧是相當簡單的。 棧和隊列在課堂上,我們沒有使用數組, 但你應該很熟悉 - 只需要知道 你也可以做協議棧,隊列使用鍊錶。 所以,如果你有一個數組,這將是一個堆棧嗎? 一個堆棧,第一,必須有一個尺寸。 你要存儲什麼是你現在的堆棧的大小。 你也有一個數組,在這種情況下,數字 但如果你願意,它可以是一個數組 字符串,數組的結構,什麼,你要存儲。 關於棧:棧和鍊錶的區別 是,在堆棧中,你只需要訪問堆棧中的最後一個元素。 這就是所謂的最後,先出。 就像你有一個托盤堆疊, 如果你把一個托盤上的堆棧的頂部, 你必須先刪除該盤有機會到其他盤。 這是同樣的事情,一摞摞。 所以,如果我想,例如,一個元素添加到堆棧中,我該怎麼辦? 這就是所謂的推,這是很簡單的。 你必須做的第一件事是檢查是否堆棧的大小 是不是大於或等於堆棧的容量。 因為如果你已經是滿負荷,你可以不添加任何東西。 然後,如果不是,你只需要添加的元素在堆棧中。 最後,增加的大小。因此,它是非常簡單的。 所以,我想補充的數字2。 如果我想彈出,這意味著我要刪除 加入的最後一個元素,並返回該元素的值, 我要檢查的第一件事是,堆棧不為空。 因為如果它是空的,我不能返回任何值。 在這種情況下,我返回-1。 否則,我要遞減的大小的規格, 並返回的數字(s.size)。 為什麼我遞減的規模和然後返回s.size“嗎? 這是因為,在這種情況下,該規範具有大小為4, 我想回到的第四個元素,對嗎? 但是,指數的第四個元素是什麼?三。 因為我做的大小 - 將是3,我可以返回s.numbers(s.size,) 因為它是3。因此,這只是索引。 現在的隊列。隊列是幾乎同樣的事情。 唯一的區別是,而不是最後,先出, 你必須首先先出。 可能是如果你等著去聽音樂會, 你不會是快樂的,如果你有一個堆棧,而不是一個隊列。 作為最後一個人來,將進入演唱會的第一人。 你可能會高興不起來。 在隊列中,取得的第一人,也是第一個人走出。 因此,在一個隊列中的定義中,除了具有在陣列中的大小, 你還必須有頭,這是該指數的堆棧頭。 所以現在的第一個元素。 入隊是推動棧同樣的事情。 如果你是非常幼稚的,你也許會說, 好了,我就可以做同樣的事情,我為推。 我可以只檢查,如果它不是超越的能力。 如果是的話,我返回false,否則我就可以導出新值 然後遞增的大小。 但是,為什麼這是錯的? 讓我們來看看這個例子。 我想排隊了一堆東西, 然後我要出列和排隊。 有很多的命令,但它是非常簡單的。 我要排隊5,因此加5,然後7, 1,4,6,然後我要出列的東西, 這意味著我要刪除第一個元素。 所以我要刪除3號,對嗎? 第一個元素。好吧。 現在,如果我嘗試排隊別的什麼,將要發生什麼? 根據我的實現, 我要放的下一個數字指標q.size。 在這種情況下,大小為8, 因此該指標8將在這裡的最後一個位置。 如果我試圖排隊在這裡,我會覆蓋上一次的位置 為數字1,這是完全錯誤的。 我想要做的是包裝,到第一的位置。 也許你會說,好吧,我只是要檢查 如果我可以把東西。 如果沒有,我只是說,哦,新的滿負荷生產 實際上是能力 - 1,你不能把元素。 但是,是什麼問題呢?問題是,如果我只是出列,這裡的一切權利 然後我嘗試添加其他什麼東西,它只是說, 好了,你是在滿負荷生產,這是0。 所以,你的隊列中消失了。 你必須環繞,和環繞著 你們的經驗教訓,有遠見的和其他pset使用模。 您可以嘗試在家裡明白你為什麼會做q.size + q.head 模的能力,但如果你在這裡檢查, 我們可以看到,它的工作原理。 因此,在最後一個例子,q.size 8 頭是1,因為它是這個位置的數組。 所以這將是8 + 1,9。國防部能力9將是0。 會去的索引為0。我們會在合適的位置。 然後嘗試的隊列在家裡。 一些重要的事情:試著去了解棧和隊列之間的差異。 在家裡,試圖讓非常熟悉,實施入隊,出隊,push和pop。 也明白時,你會使用他們每個人。 因此,讓我們放鬆,持續10秒的小寵物了一堆。 現在讓我們回去的數據結構。 哈希表。很多人都被嚇壞了的哈希表。 在問題設置6,拼寫檢查器。 哈希表和嘗試,很多人感到害怕他們。 他們認為,他們是很難理解的。是嗎? [羅布·鮑登問題5。 >>習題集,是的。由於搶劫。 是啊。六是憤慨N'蓬蓬,是的。 習題集5,拼寫檢​​查,你不得不使用一個哈希表或一個嘗試。 很多人都以為他們是超級不難理解,但他們其實很簡單。 什麼是哈希表,基本上嗎?哈希表是一個數組,鍊錶。 一個數組和一個哈希表之間的唯一區別 在哈希表中,你有什麼事情稱為散列函數。 什麼是哈希函數? 我不知道,如果你們可以在這裡閱讀。 這是一個哈希表的一個例子。 所以,你可以看到,你有一個有31個元素的數組。 在哈希表中我們做什麼是有一個哈希函數 要翻譯的關鍵,每一個整數索引。 如果,例如,如果我想選擇B.哈里森, ,我會把B.哈里森在我的哈希函數, 和散列函數將返回24。 所以,我知道,我想在24個存儲B.哈里森。 所以,這就是區別只是有一個數組,哈希表。 在哈希表中,你將有一個功能是要告訴你 你要存儲的數據的存儲位置。 對於散列函數,你想看看一個散列函數 是確定的,分佈式的。 正如你可以看到這裡,你看到了很多,我想存儲的數據實際上是19 而不是使用31和30和29,這些都是免費的。 所以,我用的哈希函數不是很均勻分佈。 當我們說好分配,它意味著我們要擁有, 粗略地說,在至少1或2為每個 - 等,在陣列中的每一個的指數的差為1或2。 你想,大約有相同數量的元素在數組中的每個鍊錶。 可以很容易地檢查它是否是有效的哈希表中,哈希表中查看。 然後樹木。這是一棵樹。 在計算機科學的樹木倒過來的一些原因。 所以,在這裡,你有樹的根,然後葉子。 你應該知道的術語為家長和孩子。 每個節點都有它的孩子,這是低於父節點。 因此,舉例來說,2是3和其他兒童的父權, 而3將是1和其他孩子有父。 和1將是3的兒童,並依此類推。 我們有一些更有趣的是,被稱為二叉搜索樹, 上的右側的一個節點的所有的值 要在正確的,就在這裡 - 在右邊, 將大於在根目錄中的元素。 所以,如果我在這裡,5號上的所有元素的權利 將要大於5,並在左邊 所有的元素都將小於5。 這是為什麼有用嗎? 嗯,如果我要檢查,如果7號在這裡,例如, 我只是去5首先,我要去看,是7大於或小於5? 這是更大的,所以我知道這是怎麼回事,必須在右邊的樹。 所以,我有東西看少得多。 在實施過程中的二叉查找樹,節點,我只是必須有數據, 所以int N;你也可以有一個字符串 或任何你想要的。 你一定要小心界定什麼是更大的,什麼是不。 所以,如果你有字符串,例如,你可以定義 所有這些事情的權利將有較大的長度, 的左邊將有較低的長度,所以它真的給你。 我怎樣才能實現找到BST? 我們將不得不做的第一件事是檢查,如果根是NULL。 如果它是NULL,這意味著的東西是不是有 ,因為你甚至不會有一棵樹,對不對? 因此,我返回false。 否則,我要檢查的數量是更大的 比的值的根目錄中。 我要試圖找到正確的元素 樹。 你看,我在這裡使用遞歸。 然後,如果它的不足,我會看一下左邊的。 最後,否則,如果它不小於或不大於, 這意味著它本身的價值。 所以,我剛剛返回true。 在這裡,你可以看到,如果,如​​果,如​​果我用。 請記住,競猜0,我們有一個問題,如果,如​​果,如​​果, 你應該找到效率低下, 及無效率的,你如果。 你應該使用的話,否則,如果,如​​果,和其他人。 所以,我應該使用else if和else if人在這裡嗎? 有沒有人 - 是嗎? [學生來說,聽不見] 那很完美。於是,她說,不要緊, 只是因為效率低下,我們收到 ,因為,也許,如果一些條件感到滿意, 所以你已經完成的動作,但你要檢查所有的其他條件。 但是,在這種情況下,馬上回來,所以無所謂。 所以,你不必使用其他如果。 最後,讓我們來談談嘗試, 這是大家的喜愛。 一試的是樹的數組。 這是非常快的期待值,但它使用了大量的內存。 它通常進行過濾的話,所以當你 要實現,例如,我不知道,像您的手機電話簿中 你想成為B型 只是有名字的人有B. 這是很容易實現的,使用一個嘗試,例如。 你如何定義一個節點在一個try? 你只需要一個布爾值,將是is_word。 這表示使用該節點之前的所有字符, 你能夠形成詞語, 然後你就會有一個數組的指針的節點。 你可以看到,我們的父節點,所以節點*數組的數組?是嗎? 所以,讓我們來看看如何工作。拼寫檢查, 我們有一個數組的27個元素, 因為我們擁有所有的字母加撇號。 在這裡,我只是使用2個,因為我希望能夠寫在黑板上。 好吧。所以這是一個嘗試的一個例子。 如果我剛才定義的第一個節點,我將有2個元素的數組 2的指針為NULL,所以我只是把'A'和'B'。 我有一個布爾值,表示is_word。 這將是假的第一個, 只因為,在這之前你沒有任何字符。 因此,是不是一個詞是一句空話。因此,它是假的。 如果我想補充的'a'到本字典,那麼我有什麼關係? 我只想有對malloc一個新的節點為'A', 然後添加其字為true。 因此,它只是表示'A'是真實的。有意義嗎? 然後,如果我想,我將不得不對malloc 1'B'添加'BA', 然後我要建立布爾為false, 因為'B'本身是不是一個詞。 然後,我要對malloc另一種為'A',所以'BA', 然後我將設置為true,它是一個字。 因為'BA'這個詞。 然後,如果我想看到的,如果'b'是在這本字典, 我可以去到的第一個,'B'。我下去,我看是字,並說假的。 因此,它不是一個字。如果我要檢查'BA', 我去的第一個,'B',然後去為'a',和我看到真正的,所以它是一個單詞。有意義嗎? 很多人都感到困惑的嘗試。不是嗎? 最後,霍夫曼編碼。霍夫曼編碼是非常有用的 以節省內存和壓縮文本文件, 只是,因為很多時候,你用'A'和'e',例如, 在您的文件,但我不知道,如果你們使用盡可能多的'q'或'Z'。 只是有1個字節的每一個字符, 每單 - 我們的ASCII表中的256個字符,是不是很理想, 只是因為有一些字符,你用得多, 所以你應該為那些使用更少的內存。 我如何使用Huffman編碼? 我們所要做的霍夫曼樹。  霍夫曼樹的節點 有一個符號,將是一樣,'A','B','C',信, 無論你有信,頻率,是這個詞在文本中出現的頻率, 您創建的哈夫曼樹, 然後將一個節點指向左側的哈夫曼樹 要指向正確的另一個節點。因此,就像一棵樹。 你如何建立一個哈夫曼樹嗎? 你要選擇具有最低頻率的2個節點。 如果你有一個領帶你要挑選的2個節點 具有最低的ASCII值。 然後,你要創建一個新的樹,這2個節點 是要在父節點中的組合的頻率。 然後你要刪除的2個孩子從森林 取代他們的父母。 你會重複,直到你只有一棵樹在森林裡。 因此,讓我們來看看你會怎麼做一個Huffman樹ZAMYLA。 您可以在這裡看到,除了'A',所有的字母頻率1,頻率為2。 所以,我把所有的字母的ASCII值和頻率,以我創建的節點。 所以,如果我要創建的第一棵樹,這將是'L'和'M'。 因此,它是在這裡。該對的頻率將是2 因為它是1 +1,然後在接下來的2的最低頻率是“Y”和“Z”。 ,然後我所有的人 - 有一個頻率為2。 因此,哪些是具有最低的ASCII值的下一個嗎? 'A'和'L'。所以我創建新的節點, 最後,它是4和2,所以2的是,要在左邊。 這是哈夫曼樹。 然後,如果我想要寫一些文字, 想在二進制文件轉換為文本,使用霍夫曼樹是很容易的。 例如,如果我說向左移動,向右移動一個0和1, 什麼是代表? 因此,像1,1,右,右, 然後按0,所以離開將L,然後1,0,0。 因此,1,0,所以只需1,0,'A'。 然後,0,1,所以'Z'。 然後,1,0,0 - 沒有。 0,0,'Y',那麼懶惰。 所以,這一切對我來說,Rob的接管。 [羅布·鮑登]因此,第7週的東西。 我們已經得到了很多去真快。 按位運算符,緩衝區溢出, 的CS50庫,然後HTTP,HTML,CSS。 所有在如15〜20分鐘。 按位運算符。其中有6個,你需要知道的。 按位與,按位或,異或,左移,右移,而不是。 向右移位,而不是你幾乎沒有看到在所有的演講。 我們將在很快在這裡,但它是很好的知道,這些都是存在的。 請記住,按位運算符一樣,當你做3 + 4。 你不處理的二進制3和4。 按位運算符,你實際上是在處理的各個位數字3和4。 因此,第一個,我們會說是按位, 和所有它是翻蓋的所有位。 所以在這裡,如果你正在寫在C,你不會把它寫 〜11011或什麼的,你會寫這樣〜4, 然後將翻轉4的二進制表示形式。 所以,在這裡,〜的一些二進制數1101101,完全翻轉所有的“0”和所有“0”到“1”。 我說有,經常利用這一點, 我們會看到它的一點,是我們要拿出一些數字 其中所有的位都為1,除非其中之一。 因此,它通常是更容易表達數 只是單一的位被置位, ,然後採取〜的,所以每一個位被置位,一個除外。 所以,這就是我們要使用更多的位。 按位或。這裡有2個二進制數字,這兩個數字 是相當的代表性,因為它們代表了每一個可能的 你可以需要操作的位組合。 在這裡時我或運算的每一位,我們只是要比較直降。 因此,在左側,我們有a 1和a 1。 當我按位|那些,我要得到的嗎?一。 然後按位0和1是要給我嗎?一。 按位1和0將是同樣的事情,1。 按位0 | 0要給我0。 因此,唯一的情況下,我得到0 0 | 0的情況。 你能想到的,就像你的邏輯的口服補液鹽。 所以,如果你認為1為真,0為假,同樣的道理也適用於這裡。 因此,真正的或真實不虛,真或假是真。 或真或假是真實的,,虛假或假是唯一的,這實際上是假的。 下面是這個例子,你應該知道 作為一個很好的例子,使用時按位運算符。 在這裡,如果我們資本與OX20'A', 我們來看看這些在第二,我們得到的東西。 如果我們或小寫字母'A'OX20,我們得到的東西。 因此,讓我們拉起ASCII表。 好吧。在這裡,我們看到,'A'是 - 在這裡,我們有'A'是十進制的65。 不過,我會去與十六進制的,這是Ox41。 相當肯定,我們看到了在課堂上。我認為,我們看到它在類 它是很容易的從十六進制轉換為二進制。 所以在這裡,我想提出4成二進制, 這將是0100。 這是1的地方,2的地方,4的位置,所以這是4。 然後,我可以分裂成二進制數,這將是0001。 因此,這將是'A'的二進制表示。 以小寫字母'A',它現在是Ox61, 在那裡,這些分裂成它的二進制,所以6 - 讓我們真正做到這一點 - 有沒有橡皮擦?橡皮擦。 Ox61。因此分裂成二進制0 + 4 + 2 + 0。 1分裂將是0001。 在這兩個之間的區別, 我們可以看到,一個小寫字母和一個大寫'A'之間的唯一區別是本單位。 所以回到這裡 - 好了。 回到這裡,如果我們期待位OX20是什麼, 所以分解OX20到它的二進制文件, 0010,0000。 OX20,唯一的一位被設置位,這是我們所關注的, 資本和小寫字母'A'之間切換。 如果我或'A',這是一個'A', 如果我或'A'與OX20, 我會得到什麼? [學生,無聲] >>小寫字母'A',因為它會翻轉該位為1。 如果我或'A'與OX20,我會得到呢? 小寫的a,因為剛剛O型環'A'OX20, 我只是將要“或”操作此單位為1,它已經是一個1,因此它並不重要。 因此,我們得到'A'和'a'。 按位與。同樣,我們可以認為這是我們的邏輯和對應。 在左邊,我們有真正的和真實的。 這將是真實的,所有的情況下, 虛假與真實的或真實的,假的,或假,假, 沒有這些東西都是真實的。 所以我們最終得到的是什麼1000。 所以,現在,在這裡,這裡就是我已經使用了可靠的按位, 在那裡我們有OX20。 因此,這是OX20。 現在,我想要做什麼,按位〜OX20。 這是要翻轉的所有位。 所以,我有1101,1111。 因此,'A'〜OX20相與要給我什麼呢? 位,我們真的需要考慮的是這一個, 因為,如果所有這些位被設置為1, 然後,我們將得到什麼'A', 除了,可能的話,此位是什麼。 因為如果它是一個1,現在它的將被設置為0時, 因為無論是什麼,相與為0。 那麼,什麼是'A'&〜OX20要給我嗎? [學生回答,無聲]“什麼是'a' - 'A'。 什麼是'A'〜OX20要給我嗎? “A”。因為這是目前的1。 這個0與安定,使其為0, 現在我們將得到一個'A'。 兩者都是“A”,以及最後但並非最不重要的這種類型的, 我們有異。它非常喜歡, 除了這意味著只。 這就像你通常會想到什麼或在現實世界中。 所以,你做的是'X'或'y',但不能同時使用。 這裡1 ^ 1將是0。 因為真正的,這是 - 這是行不通的,以及與邏輯真和假 按位與,或做, 但真正^哪句是假。 因為我們只想要返回true,如果其中只有一個是真實的。 因此,1 ^ 1是0。 0 ^ 1? 為1。 1 ^ 0是1,0 ^ 0為0。 因此,在任何情況下,東西0 0位將是0。 1位元東西0或從0按位1, 如果是^,它會是1,如果是和它會是0。 1位1的情況下是不與異或。 這是0110。 所以,現在在這裡,使用XOR - 所以我們早在20。 'A'^ OX20是我們比較這2位。 因此,1 ^ 0是要給我什麼?阿一。 'A'^ OX20是要給我嗎?小寫字母a。 'A'^ OX20是要給我嗎?資本A. 因為不管是幹什麼的,這個異或OX20 有效地翻轉,無論該位。 如果這是一個0,它現在將成為1。 由於這是一個1,1 ^ 1是0。 因此,我們的'A'已經成為'A',和我們的'A'已經變成了'“。 因此,XOR,只是翻轉的情況下是一個非常方便的方法。 你只是想遍歷字符串的字母 並交替的情況下,每一個字符, 你只是的XOR一切與OX20。 現在,我們已經左移。左移去,基本上, 將所有的數字,或到左邊,然後將他們後面的“0”。 所以,在這裡,我們有00001101。 我們要推動從右邊的3 0, 我們得到01101000。 在非二進制條款, 我們可以看到,這是真的處理13左移,這給了我們104。 所以左移,我們在這裡看到的,基本上是X << Y X * 2 ^ Y。 13 * 2 ^ 3,2 ^ 3是8,所以13 * 8 104。 如果你只是覺得在一般情況下,每個數字有關二進制, 如果我們從右邊開始,這是1的地方,然後在2的位置,然後4的地方。 因此,通過從右側推入“0”, 我們只是把8位4的地方, 和活動,在8位到16的地方。 每個班次乘以2。是嗎? [學生]:會發生什麼事,如果你移動了5? 鮑登]如果你移5,你會失去數字。 不可避免的是,這是同樣的事情。喜歡,整數只有32位, 所以,如果你添加了2個非常大的整數,它只是不適合在一個整數。 所以,在這裡同樣的事情。如果你移動了5星, 我們會失去的那一個。 這是一種“粗略地說,我的意思” 如果你改變過猶不及,失位。 右移將是相反的, 我們要去的地方推0結束, 對於我們而言,從左邊的0填補。 所以這樣做,我們基本上扭轉我們已經做了的事。 而且我們看到,三個0,在右邊剛剛落下, 我們推1101的方式的權利。 這是做104 >> 3,這是,有效地中,x / 2 ^ y的 所以,現在,在這裡,這是一個類似的想法。 為什麼它只是大致的x / 2 ^ Y,而不是實際的x / 2 ^ Y? 因為如果我已經轉移了4,我已經失去了一個1。 基本上,你所想的,只是覺得在一般的整數除法。 因此,像5/2為2。這是不是2.5。 這是同樣的想法。當我們除以2, 前進的道路上,我們可以失去奇數位。 所以,現在 - 這是它位。這就是所有你需要知道的。 記住在課堂上的使用情況下,我們看到, 像一個位掩碼是非常有用的按位運算符, 或您使用它們的位掩碼。 大寫字母和小寫字母,轉換是一個非常典型的例子。 好了,所以緩衝區溢出攻擊。 還有人記得這個功能什麼是錯的嗎? 請注意,我們聲明數組的12個字節,12個字符, 那麼我們的12個字符的整個字符串欄中複製到我們的緩衝區。 那麼,是什麼問題呢? 神奇的12號幾乎馬上蹦出來一樣 - 為什麼是12? 如果酒吧恰好是超過12個字符? 如果酒吧是數以百萬計的字符? 這裡的問題是,memcpy的調用。如果酒吧是足夠長的時間, 它只是完全 - 'C','C',這是只有12個字符,不關心; “C”不關心它不適合,許多字節。 它只會完全覆蓋字符,我們已經為它分配的12字節, 在內存中,一切都會過去,它實際上並不屬於該緩衝區 無論是串酒吧。 因此,這是我們在課堂上看到的圖片 我們有我們的堆棧。 您應使用這些圖片或再熟悉他們。 我們已經長大的我們的堆棧,內存地址是從0開始的頂部 成長喜歡4億美元的底部。 我們有我們的數組'C'的地方在內存中, 然後,我們有我們的指針,以阻止它的下面, 然後我們有這個保存的返回地址和我們的父常規的堆棧幀指針。 要記住的返回地址是什麼? 這是當主調用函數foo調用一個函數吧, 不可避免的是,酒吧的回報。 所以,當酒吧回報,他們需要知道它會返回到foo調用它。 因此,返回地址的功能,它在函數返回時返回的地址。 這是非常重要的緩衝區溢出攻擊的原因是因為,方便, 黑客喜歡改變返回地址。 為foo回去,我要回去的地方,黑客想要我回去。 ,交通方便,在這裡黑客經常要回到 是我們原來的緩衝區的開始。 因此,通知,再次,小印度。 該設備是一個小印度系統的一個例子, 反轉字節存儲一個整數或指針。 所以在這裡,我們看到了 - 是這樣的嗎?是啊。 我們看到Ox80,OxC0的,Ox35,OxO8的。 還記得十六進制數字嗎? 我們不扭轉在小印度的十六進制數字, 因為2個十六進制數字,一個單字節,而我們扭轉字節。 這就是為什麼我們不存儲,喜歡的80530CO8。 我們存儲,而不是每對2位,從右邊開始。 該地址是指到的起始地址 我們的緩衝區,我們其實是想複製到擺在首位。 究其原因,是非常有用的,如果是因為攻擊者 發生,而不是只是一個字符串, 像一個無害的字符串,其名稱或什麼的, 什麼,相反,如果該字符串只是一些任意代碼 做任何他們想要它做的事嗎? 這樣他們就可以 - 我想不出任何酷的代碼。 它可以是任何東西,但。任何災難性的代碼。 如果他們想,他們可能只是做一些事情段故障,但是這將是毫無意義的。 通常,他們這樣做是為了入侵你的系統。 好吧。 CS50庫。 基本上,這是調用getInt,GetString時,我們為您提供所有這些功能。 因此,我們必須char *字符串,這就是抽象,我們吹去 在本學期的一些點。 請記住,一個字符串就是一個字符數組。 所以在這裡我們看到的是刪節版的getString。 你應該看看它,記住它是如何實際執行。 關鍵的細節是,我們注意到在一個單一的字符一次 的標準,這是和我們一樣在鍵盤上打字。 因此,一個單一的字符時,如果我們得到太多的字符, 因此,如果n + 1是大於容量, 然後,我們需要增加我們的緩衝區的容量。 所以,在這裡我們加倍我們的緩衝區的大小。 不斷,我們到我們的緩衝區中插入字符 直到我們收到的文件或任何一個新的生產線或結束, 在這種情況下,我們已經完成了字符串,然後真正的getString 縮小的內存,如果我們分配了太多的內存,它會回去縮了一下。 因此,我們不顯示,但其主要思想是 它具有一次讀取的單個字符。 它不能只是讀了整個事情, 因為他們的緩衝器大小為一定的大小。 因此,如果該字符串,它試圖插入緩衝過大,那麼它就會溢出。 所以,在這裡,我們防止這種情況只在一個單一的字符閱讀 時間和成長每當我們需要。 因此,調用getInt和其他CS50庫函數傾向於使用GetString 在它們的實現。 所以,我強調重要的事情。 它調用getString得到一個字符串。 如果GetString還沒有返回內存, 記得的getString mallocs的東西,所以每當你調用getString 你不應該(不知所云)免費字符串,你知道的。 如果它失敗了,對malloc的東西,所以在這裡,我們返回INT_MAX只是一個標誌, 嘿,我們實際上並沒有能夠得到一個整數。 您應該忽略什麼,我回你,或 你不應該把它當作一個有效的輸入。 最後,假定沒有成功,我們使用sscanf與該特殊標誌, 這意味著,第一場比賽是一個整數, 之後,整數,然後匹配任何字符。 因此,注意,我們希望它等於1。 因此,sscanf的回報有多少場比賽,如果成功? 它會返回1,如果成功匹配的整數, 將返回0,如果它不匹配的整數,它將返回2 如果它匹配的整數,後面跟一些字符。 因此,通知我們重試,如果我們什麼,但1相匹配。 因此,如果我們輸入1,2,3,C,或1,2,3,X, 然後1,2,3將開始瀏覽存儲在整數 X將獲取存儲在字符, sscanf函數將返回2,我們將重試,因為我們只想要一個整數。 快速通過HTTP,HTML,CSS吹。 超文本標記語言是在網絡的結構和語義。 以下是演講的例子,我們有HTML標籤。 我們有head標籤,body標籤, 我們的空標籤的例子,我們其實並不有一個開始和結束標記, 我們只是鏈接和圖像。 有沒有關閉圖像標籤,完成標籤的所有需要​​做的只是一個單一的標籤。 鏈接是一個例子,我們將看到如何鏈接到CSS, 您如何鏈接到外部JavaScript的腳本就是一個例子。 這是很簡單的,記住,HTML不是一種編程語言。 在這裡,請記住,你將如何定義的一種形式,或者至少這是什麼做的嗎? 這樣的形式有一個動作和一個方法。 的方法,你將永遠只能看到是GET和POST。 因此,獲得的是在URL的版本中得到的東西。 POST是它是不是把在URL中。 相反,任何形式的數據被插入了隱藏在HTTP請求。 所以在這裡,行動定義的HTTP請求。 它會是google.com /搜索。 方法。記住GET和POST之間的差異, ,只是說作為一個例子,如果你想書籤的東西。 你將永遠無法書籤的POST URL 因為數據是不包含在URL中。 現在,HTTP,超文本傳輸協議。 超文本傳輸協議,你會期望它來傳輸 超文本標記語言,它確實。 但是,這也將任何圖像,你會發現在網絡上, 你做的任何下載開始作為一個HTTP請求。 因此,HTTP是萬維網的語言。 在這裡,你必須認識到這樣一個HTTP請求。 這裡HTTP/1.1就在身邊,只是說這是版本 我使用的協議。 它幾乎總是要HTTP/1.1,你會看到它。 然後,我們可以看到,這是GET,另一種是POST,你可能會看到。 我試圖訪問的URL是www.google.com/search?q =嗒嗒,嗒嗒,嗒嗒。 所以請記住這一點,問號Q =等等等等等等, 之類的東西的一種形式提交。 會是這個樣子的反應,它可能會回到我這裡來。 此外,協議開始,這是怎麼回事是, 隨後的狀態代碼。在這裡,它的200 OK。 最後,網頁,我其實是要求將緊隨其後。 可能的狀態代碼,您可能會看到,你應該知道其中幾個。 200 OK,你可能已經看到過的。 403故宮,404,500內部服務器錯誤 通常,如果你去一個網站,有什麼地方不對頭或PHP代碼崩潰, 而在家電,我們有大的橙色框 和一樣,說什麼是錯的,這個代碼不工作 這個功能是壞的。 通常情況下,網站也不想讓你知道哪些功能是居然是壞的, ,而不是他們會只給你500內部服務器錯誤。 下HTTP,TCP / IP是1層。 請記住,萬維網是互聯網之外。 就像如果你玩在線遊戲,不通過HTTP, 它會通過不同的 - 它仍然使用互聯網, 但它不使用HTTP。 HTTP是建立在TCP / IP協議就是一個例子。 IP的字面意思是互聯網協議。 每台計算機都有一個IP地址,它們是那些4位數字的東西 如192.168.2.1,或什麼的,往往是當地的一個。 但是,這是一個IP地址的模式。 因此,DNS,域名服務, 這就是如google.com的東西轉換到實際的IP地址。 所以,如果你鍵入一個URL,IP地址, ,將谷歌,但你會不記得那些事情。 您應該都還記得google.com而不是。 我們的最後一件事是港口,這是TCP IP的一部分。 TCP會更多。想想看,喜歡,你有你的網頁瀏覽器中運行。 也許你有一些電子郵件應用程序的運行; 也許你有一些互聯網上運行的其他程序使用。 他們都需要接入互聯網, 但你的電腦只有1的WiFi卡或任何。 所以端口的方式,我們能夠分裂 如何將這些應用程序能夠使用互聯網。 每個應用程序獲取特定的端口,它可以聽上, 默認情況下,HTTP使用端口80。 有些電子郵件服務的使用25。 低則往往將保留。 通常,您能為自己獲得更高的編號。 CSS層疊樣式表(Cascading Style Sheets)。 我們的風格,而不是HTML與CSS的網頁。 有3個地方,你可以把你的CSS。 之間風格的標記,它可以是內聯的,或在一個完全獨立的文件,然後鏈接中。 這裡是CSS只是一個例子。 你應該認識到這種模式, 第一個例子是我們身體相匹配標籤, 在這裡我們中心的body標籤。 第二個例子,我們相匹配的東西 ID頁腳,我們應用一些樣式來表示。 請注意,ID頁腳文本的左對齊, 而主體文本對齊中心。 頁腳是身體內部。 ,而不是,它將文本左對齊,即使身體說的text-align中心。 這是整個級聯的一部分。 你可以有 - 你可以指定樣式的身體, 的東西在身上,然後你可以指定特定的樣式, 工作是否符合預期。 更具體的CSS符的優先級。 我想這就是它。 阿里的Nahm]大家好。如果我能得到您的關注。 我是阿里,我會去通過PHP和SQL真快。 因此,我們可以開始了。 PHP是為PHP:Hypertext Preprocessor的。 大家都應該知道,這是一個服務器端腳本語言, 我們用它的後端的網站, 它做了很多的計算,背後的幕後部分。 語法。它不象C,驚喜,驚喜。 它總是開始的,如果你能看到的, - 我不能繼續向前邁進。 你可以看到你需要種新的大括號,那麼你還需要嗎?PHP。 這一直是你有你的PHP的文字,你的PHP代碼框架。 因此,它不能像C,在那裡你把它種在第一。 你需要始終圍繞著它。 而現在,主要的語法是所有的變量必須以$字符開始。 你需要做的,當你定義,你需要做的是 當你指的是他們。 你總是需要$。這是你最好的朋友,漂亮多了。 你不 - C語言不同,你不需要把它是什麼樣的變量類型。 因此,當你需要時,你並不需要把喜歡的, 整數x或字符串y,等等,等等。 因此,一個細微的差別。 由於這樣做的結果,這意味著PHP是一種弱類型。 PHP是一種弱類型語言,它有弱類型的變量。 換句話說,這意味著你可以切換不同的變量類型。 您可以將您的電話號碼1為int, 你可以將它作為一個字符串,你可以把它作為一個float, 它都將是,數字1。 即使你把它存儲在不同的形式, 它仍然是 - 變量的類型仍然保持到底。 所以,如果你看這裡,如果你還記得的pset 7, 你們中許多人可能有這個問題。 兩個等號,3個等號,等號。 行,有沒有4等號,但也有2和3。 您可以使用等號(=)檢查值。 它可以檢查跨類型。 所以,如果你在第一個例子中可以看到, 我有num_int == num_string。 所以,你的int和字符串,在技術上,1, 但他們是不同的類型。但對於雙等號,它仍然通過。 然而,對於三元組等於,它檢查值,以及不同類型的。 這意味著,它不是要通過在第二種情況中,在這裡, 您在何處使用3個等號。 所以這是一個主要的區別,你都應該顯示。 字符串連接是另一個強大的東西,你可以在PHP中使用。 這基本上是這個方便的點符號, 這就是你如何能結合串在了一起。 所以,如果你有貓,你有狗,你想放的2串在了一起, 您可以使用期間,這是一種它是如何工作的。 您也可以只將它們彼此相鄰, 在這裡你可以看到底部的例子, 我有迴聲,空間字符串2串1。 PHP會知道以取代他們這樣。 陣列。現在,在PHP中,有2個不同類型的數組。 你可以有規則排列,你也可以有關聯數組, 我們要通過他們去。 常規數組在C, 讓你有編號的指數。 現在我們只是要創建一個,並把 - 所以這是我們如何創建一個空的數組,然後我們要 放入索引編號為0。 我們打算把6號,值6。 你可以看到它在這裡的底部。 Where's - 在索引號為1,我們打算把價值數4, 所以你可以看到有一個6,有一個4, 然後我們打印的東西, 當我們試圖和打印的值存儲在索引號0, 然後我們會看到打印出來的值是6。酷吧? 所以這是你的規則排列。 另一種方法,你也可以添加一些東西,現在常規數組 結束時,你就可以把它們添加。 這意味著,你不必指定特定的索引。 你可以看到數,然後在方括號中有沒有指定的索引。 它會知道 - PHP就知道只是把它添加到列表的末尾,下一個空閒點。 所以你可以看到,1,0點, 2去在第一的位置。 3“ - 被添加為好。 因此,那種是有道理的。你只是不斷增加, 然後,當我們呼應的索引號為1, 它會打印出值2。 然後,我們是關聯數組的數組。 關聯數組,而不是數字索引, 他們做的是什麼,他們是通過字符串的索引。 你可以看到,而不是 - 我擺脫了所有這些數字索引, ,現在它是KEY1,KEY2,KEY3,他們在雙引號,以表示他們的所有字符串。 因此,我們可以有這樣的一個例子。 的例子,這是我們的tf,這是該指數的名稱。 我們打算把“阿里”的名稱,在該指數,卡路里吃, 我們可以把一個int,而不是一個字符串,這個時候, 然後在索引喜歡,我們可以把整個數組內的。 因此,這是怎麼樣的 - 這是一個類似的概念,我們如何有 用數字指標,但現在我們可以改變周圍的指數 作為字符串,而不是讓他們。 您也可以做到這一點,除了只是做單獨, 在一大塊,你可以做到這一切。所以你可以看到,該數組的TF, 然後我們將它們都在一個巨大的方括號集。 因此,能否加快辦事速度。 這是不是一個風格上的選擇。 我們也有循環。 在C語言中,我們有這樣的工作循環。 我們有我們的數組,我們從索引0到列表末尾, 和我們打印出來,對不對? 問題是,除關聯數組, 我們不一定知道這些數字索引 因為現在我們有字符串的索引。 現在我們使用foreach循環,再強調一下,你所希望使用的pset 7。 foreach循環,只知道每一個列表的一部分。 它不知道,你有準確的數值指標。 所以,你必須在foreach的語法,所以它的foreach,你把陣列。 所以我的數組被稱為pset中,然後作為,這個詞作為, 然後你把這個地方你要使用臨時變量 只是具體的事情,要保持特定的 - 一個實例或陣列的一個部分。 PSET num將舉行,,然後也許將舉行6號, 然後它會保持數字2。 但它保證要經過數組中的每一個值。 有用的功能,你應該知道在PHP的要求, 這樣就使得確保您包括某些文件,迴聲,退出,空的。 我強烈建議你看一下在pset中7和看這些功能。 您可能知道這些, 所以我肯定會知道,究竟是什麼,這些都在做。 現在,我們要通過範圍真的很快。 範圍,PHP是一種時髦的事情,不像C, 所以我們只是要去迅速。 因此,讓我們說,我們有,我們開始在那個箭頭。 我們將開始與美元我。因此,該變量的“i”為0, 我們只是要在那裡繼續打印,大的白色框。 我們將開始與I0,然後我們要呼應它。 因此,有0。 然後,我們要增加它的循環, 那麼它的值為1。 一個是小於3,所以它要通過for循環, 然後,我們將看到它再次打印。 我們將再次增加至2, 和2小於3,所以它會通過for循環,它會打印2。 然後,你會注意到,三是不小於3,所以我們將擺脫的循環。 現在,我們已經退出了,那麼我們要進入和低下。 好吧。所以,你要注意,這個變量,我們已經建立, '我'變量,不是局部範圍內。 這意味著,它不是本地的循環, 和變量,我們仍然可以訪問和改變之後,它仍然是有效的。 所以,如果你現在進入的功能,你會看到,我們還可以使用'我'變量, 我們要增加的“i”+ +。 你可能會認為,第一,根據C,這是'我'的變量的副本。 這是一個完全不同的東西,這是正確的。 所以,當我們打印時,我們將​​打印'我'+ +,這是要打印出來,4, 然後我們 - 對不起。 然後,我們將結束該功能, 我們要去的地方,箭頭是現在。 這意味著,然後,然而,即使函數改變的“i”的值, 它並沒有改變的功能外, 因為該函數具有一個單獨的範圍。 這意味著,當我們使用echo'我',它並沒有改變在職能範圍的, 這樣的話,我們要再次打印3。 C.比範圍在PHP不同的事情 現在,在PHP和HTML。 PHP是用來做網頁的動態。 這使事情變得不同。 我們有不同的HTML。 在HTML中,我們始終只是具有相同的靜態的東西,像如何羅伯顯示, 而PHP,你可以改變的事情,基於用戶是誰。 所以,如果我有,我有,你登錄為 - “,然後的名稱, 我可以更改名稱。所以,現在的名字是約瑟夫, 它有“我”,但然後我也可以將名稱更改為具有湯米。 而這將是一個不同的事情。 那麼我們也可以改變不同的東西,他 它的基礎上的名稱,將顯示不同的內容。 所以PHP樣的變化,在您的網站上發生了什麼事情。 我也一樣。不過,請注意,他們有不同的內容, 即使你是技術上還是訪問相同的網頁在表面上。 生成HTML。有2種不同的方式,你可以做到這一點。 因此,我們將通過正確的現在。第一種方法是,你 - 是啊,對不起。 所以,你只需要您的正常循環在PHP, 然後你迴盪在PHP和,你回音HTML。 用什麼搶你的HTML腳本 ,然後用PHP打印到打印出來的網頁。 另一種方式是做出來的,如果你分離出的PHP和HTML。 所以,你可以有一個線的PHP開始循環中, 然後,你可以有一個獨立的東西線中的HTML, 然後你結束循環,再次用PHP。 因此,它是一種分離出來。 在左側,可以說你把所有的 - 僅有1塊的PHP。 在右邊,你可以看到,你有一個PHP的線, 你有一個行的HTML,你再有一條線的PHP。 所以分離出來,到他們在做什麼。 你會注意到,無論哪種方式,其中之一, 他們打印出來的圖像,圖像,圖像, 使HTML仍然打印相同的方式。 然後,你仍然會看到3個圖像,顯示在您的網站上。 所以這是兩種不同的方式做同樣的事情。 現在,我們有形式和要求。作為羅布向您展示, 是HTML形式的,我們將通過這只是微風。 你有一個行動,你有一個方法,你的行動 種顯示了你,你就要將它的方法是 這將是一個GET或​​POST。 一個GET請求,羅布說,這意味著你打算把它的形式 你會看到它作為一個URL,而一個POST請求,你將不會看到在URL中。 因此,一個細微的差別。 但是,有一點是類似的事情, 的是,POST和GET同樣不安全。 因此,你可能會認為,只是因為你沒有看到它的URL, 這意味著POST更安全, 但你仍然可以看到它在你的cookies在你發送的信息。 所以,不要認為一個或其他。 另外要注意的是,你也有部分變量。 你們的pset 7,讓你的用戶ID信息。 發生了什麼事,你可以使用這個關聯數組, $ _SESSION,然後你就可以訪問不同的東西 將整個頁面的不同的東西。 最後一件事是,我們有SQL結構化查詢語言, 這是一種編程語言,數據庫管理。 究竟是什麼,是數據庫?他們是表的集合, 且每個表可以有類似的對象種。 因此,我們有一個表的用戶在你的財務pset中。 那麼,為什麼他們有用嗎?因為它是一個永久存儲信息的方式。 它是一種跟踪和管理的東西 真正看到它在不同的頁面和跟踪。 而如果你只是將其存儲在一個立即的時刻 ,然後使用它後,你將不能夠訪問任何你保存。 我們有4個重要的事情,我們使用的SQL命令。 我們選擇,插入,刪除和更新。 這些都是你們知道真正重要的是你的測驗。 我們很快就會去選擇合適的。 基本上,你從數據庫中選擇行。 所以,如果你有,就在這裡 - 我們有這兩個不同的東西,我們要選擇的類別表 真棒 - 在的真棒列的值是1。 所以,你可以在這裡看到,我們有兩件事情的類名, CS50和Stat110,我們有一流的ID和口號。 所以,我們要選擇所有的信息。 然後,你可以在這裡看到,它是種挑選出,真棒列的, 所有的東西都為1,那麼它的類ID,類名和口號,它可以挑選出。 你究竟是如何做到這一點的代碼?你必須使用PHP。 因此,這是一種PHP和SQL的相互關係。 現在,我們有我們的代碼,我們將使用我們的查詢功能 因為我們沒有在pset中7,和我們將要執行的SQL查詢。 然後,我們將有 - 我們總是要檢查,如果行的三重平等的,如果假的。 所以,你要檢查的類型和值, 然後,如果它不工作,然後你想道歉,像往常一樣,我們在pset中7。 否則,你要遍歷所有這些方便的 foreach循環,我們只是去了。 現在我們已經遍歷,我們已經取得了過去, 讓我們假設通過我們的查詢,現在我們有我們的foreach循環。 它的第一行,所以這裡的行,就在這裡,它是盒裝。 這將打印出所有的信息,它得到。 因此,它會打印出底部“想學習HTML?” 那麼它會去到下一行,因為它完成了第一個for循環, 等那麼它會打印出的第二行, 這將是STAT110,所有的時刻。 最後一件事是SQL的漏洞。 我知道大衛談到這一點在演講。 你可以閱讀這一點。這是非常有趣的。 SQL注入是一種棘手的事情。 比方說,你只要堅持這些變量到你的查詢, 你可以看到,第一行。 因此,它似乎罰款,對嗎?你只是把用戶名 和密碼到您的SQL查詢,並且你想將其關閉,並獲得無論是在你的數據表。 這似乎很簡單。因此,可以說有人將在 輸入密碼,這還是文字在這裡 - 實際上應該是在紅色框。 因此,讓我們說,他們的密碼 - 這就是他們進入。 所以他們把OR“1”= 1。 類有一個愚蠢的密碼。 現在,讓我們只是取代它,你會注意到,在現在的SQL查詢, 它的計算結果總是正確的,因為你會注意到 你可以在SQL查詢中選擇所有信息 或者你可以有1 = 1。 因此,總是會評估為true。 這並不是要真正發揮作用,因為這意味著,黑客可以闖入你的系統。 這個問題的解決方案是,你必須使用PDO系統, 這意味著,你必須使用問號, 這是你們的pset 7, 你要去的地方,你想放的東西用一個問號, ,然後你有一個逗號,那麼你就必須事後, 你的字符串後,不同的變量,你要更換成問號。 所以,你會注意到這裡,現在我有這些紅色的問號。 然後,我把我的字符串變量後,所以我知道他們在後的順序更換。 這將確保,如果有人不喜歡這個, 或1 = 1的情況下,這將確保, 在後端,請確保它實際上並不會打破SQL查詢。 好了,所以這是非常,PHP和SQL旋風。 祝您好運你們所有的人,現在到了俄勒岡州 [Oreoluwatomiwa Babarinsa好了大家。去一些JavaScript的時間 和其他一些東西非常快,所以我們不抱你今晚。 的JavaScript。是。 JavaScript是種一件很酷的事情,據稱。 你真正需要知道的關於JavaScript的事情,它有點像 你的Web應用程序的客戶端做的事情。 有一些東西,你只是不想照顧所有的時間在服務器端。 所有的小互動,強調一件事,做的東西消失。 你真的不希望有談論到你的服務器,所有的時間。 一些在服務器端的,甚至是不可能做。 這就是為什麼我們需要的東西,像JavaScript。 關於JavaScript的很酷的事情:它是動態類型。 這意味著什麼,是你的程序不需要知道 究竟是什麼,變量是當你寫出來。 就整理出來,因為它的運行。 其他的東西,都涼了:這是一個大括號語言, 這意味著語法類似C和PHP。 當你學習JavaScript,您不必做太多的返工。 在這裡,我們有一點點的JavaScript。 有趣的事情,在這裡,如果你看它, 我們有位在頭部標記中的JavaScript。 是什麼做的,基本上是只包含一個JavaScript文件。 這是一種方式,你可以到你的程序中包括JavaScript。 第二一點實際上是一些內嵌的JavaScript, 內聯樣式與CSS非常相似, 你只是寫一些代碼有非常迅速。 JavaScript中的數組。 只是另一種方式來保持數據周圍,非常實用。 很不錯的,簡單的語法。 您可以使用方括號來訪問的一切,讓一切一起。 沒有什麼太複雜了。 最酷的JavaScript和腳本語言一般 是,你不必擔心數組的大小。 你可以只使用的array.length和保持它的軌道, 也數組可以擴大或縮小,因為你需要它。 所以,你甚至不需要任何形式的擔心, 哦,不,我需要分配更多的東西,或類似的東西。 這裡的很酷的事情是,JavaScript稱為對象的東西。 這是一個面向對象的語言,因此它有什麼,從本質上講, 一個方法可以讓你的數據組合在一起,有點類似於一個結構, 但您可以訪問它像一個結構或關聯數組中的語法。 這是很簡單的,你可以做什麼與這組數據 如果你有一堆的相關數據。 因為它是所有你需要的東西,描述了車, 你不需要在一堆不同的地方。 您只需把它貼在JavaScript中的對象為1。 正如你可能知道,迭代是那些繁瑣的任務之一。 您只要做到這一點再次超過一個以上。您需要交談的每一個對象在車上, 或者你需要通過每一個項目的列表或類似的東西。 所以JavaScript,PHP,foreach語法類似。 在這種情況下,它是一個用於在循環中。 你想使用這個唯一的對象。 有一些出現的問題,如果你使用這個陣列上。 它通常是一個人的東西,不過,這是非常有用的, 因為你消除了很多的開銷 因為你沒有在你的對象由自己拉了一切。 你不必記住所有的鍵名。 你只是讓他們在這個語法。 在這方面,同為,你只是要記住 你取回所有的鑰匙,在一個非常類似的哈希表。 如果你還記得,當你把一個字符串中,你可以得到的東西 將有一個與它相關聯的值。 你可以做這個的,你可以說,所有的權利, 我把一輛汽車,我把它叫做一輛法拉利。 所以,你可以把字符串中的法拉利後,你可以做到這一點,。 ,你可以做在一個循環,在循環的。 因此,只要更多的對象。你需要記住的關鍵是從 是,你可以使用該對象的結構類似的語法,每當你想這些, 除非你要使用一個字符串是不是一個有效的變量名。 因此,如果你有,我們必須用空格鍵。 好吧,如果你把object.key,空間與空間,空間, ,僅僅是沒有意義的語法。 所以,你唯一能做的,這種括號的語法。 此外,JavaScript是明智的PHP範圍。 你有2種方式的尋址範圍。 你不能有前面的變量VAR, 這只是意味著,這是全球性的。 你可以看到它的任何地方。即使你把這個if語句中, 其他任何地方在你的代碼中,你可以看到這一點後,該變量。 不過,還有一件事,是用var,它的功能你 如果你不能在一個函數中,這是全球性的。 但是,如果你是在一個函數,它僅在該函數中可見。 我沒有一個例子,但是,是的。這是一個的東西在那裡 你可以管理你想要什麼樣的變量是全球性的, 你想成為的地方,但你確實需要小心的變量, 因為你沒有的細粒度控制的類型在C, 如果事情是在for循環中聲明,它會留在for循環。 這件事,我們真正關心使用JavaScript操縱網頁,對不對? 我的意思是,這就是為什麼我們正在這樣做。 要做到這一點,我們使用的東西叫DOM。 文檔對象模型。 基本上,它是什麼它需要所有的HTML 和模型成一組相互嵌套的對象。 你開始像這樣的東西。 你,適合我,一堆代碼,在那裡,有幾分 - 你可能會認為這會是非常難以操縱, 因為你解析一堆文字 不得不的東西拼湊分開。如果它是格式不正確呢? 不好的事情會發生。 所以JavaScript照顧你,你會得到一個不錯的數據結構, 像一個在我左邊,你只是有一個文件, 內,你有一種叫做HTML, 您有一個頭部和一個體和內部, 裡面的頭,你有一個標題,等等,等等,等等。 這簡化了操縱網頁,因此,它只是, 哦,我只是想談談對這個對象。 排序的方式非常相似,你會跟你做你自己的另一個對象。 就像我說的,所有的DOM文檔中的對象。 它要么是一個地方,那麼你可以去內找到的東西, 你可以做到這一點 - 這是舊的風格,做它,在那裡, 你的document.getElementById,然後的名稱, ,你可能會說,這一段時間後變得很笨重。 所以,你可能不希望這樣做。這就是為什麼我們有 接下來的事情,我們要談談在這之後。 這裡的關鍵是,沒事,你把所有這些元素,對不對? 所以也許我可以改變顏色的東西,在頁面加載時。 還等什麼?如果我的用戶點擊的東西嗎? 我希望它做一些有趣的事情,當他們點擊的東西。 這就是為什麼我們有活動。 基本上,您可以找到您的DOM中的任何元素, 然後說,哎。當此負載或有人點擊它, 時,鼠標經過它,用它做什麼。 你是,你必須為您處理此項功能。 這些功能的事件處理程序。 什麼都有一定時序 - 它只是一種奇特的方式說, 當該事件發生時,此功能僅被執行。 因此,處理發生的事件。 這是你將如何制定出一個事件處理程序。 我有一些按鈕,當你點擊它時,它會爆炸。 所以,不要單擊該按鈕。 這是一種接近它,? 你有一個按鈕,標籤,點擊一下,你有一個字符串,它表示, 哦,順便說一下,我做的這個爆炸的東西給我。 否則,它只是像一個普通的按鈕,您剛才提出。 您也可以用另一種方​​式, 抓住DOM元素,但我們會保存後,我們談論的jQuery。 jQuery的:這是一個庫,它是跨瀏覽器。 您可以使用它在幾乎任何東西。 它只是給你很多的工具來使用。 因為JavaScript,雖然功能強大,並沒有你所需要的所有工具 開箱即用的真正解決一個Web應用程序,你可能想要做的。 因此,它簡化了很多東西,為你提供了很多的功能 開箱即用的,你通常會自己寫,一遍又一遍又一遍。 只是使事情變得非常簡單。 您也可以選擇器,讓你把所有這些元素 從DOM簡單得多,而不是使用這些很長的函數調用。 更多關於這些選擇。你,有你,讓我們說 我要得到一個元素ID為“岩石”。 那麼,在jQuery的,它只是$,然後一個字符串,一斤,然後“石頭”。 這是非常簡單和速度超過了很多傳統的JavaScript的方式解決這個問題。 你的類和元素類型也有類似的事情。 jQuery是 - 一個很酷的功能是可以排序的壓縮 您查詢您的DOM非常,非常快。 現在我們回到事件處理,這是你會如何處理jQuery中的一個事件。 那麼,我們要在這裡我們說,所有的權利。我有一個腳本標記,對不對? 所以,我有這個內嵌的JavaScript。 我們要做的是我們要去說,沒事的。 文件準備就緒時,這意味著該文件被加載, 我們將去到該函數,我們要去說,沒事, 這個功能實際上是在做別的事情。 它基本上說,所有的權利,讓我的元素與ID“MYID。” 然後給這個函數執行的處理程序,當你點擊它。 基本上這是什麼做的是,它說,所有的權利。 頁面加載,所以我要在這個元素, 這事件處理程序,它基本上設置您的網頁。 這是你要考慮如何處理有關事件。 你只是想考慮一下,所有的權利,事情發生時,我希望發生的呢? 你不想去想,好了,我要確保這件事情談判,這件事情, 這件事情等等等等,因為你只是想談的事情事件。 當發生這種情況時,發生這種情況。當發生這種情況時,這種情況發生。 如果事情引發其他的東西,這是偉大的。 但是,你不想嘗試這樣做複雜的代碼 你同時觸發多個, 因為你只是給自己一個頭痛。 好的。現在,我們可以讓我們的頁面來處理事件, 但讓​​我們說我的用戶點擊一個按鈕。 如果我要發送請求到服務器, 但我不希望重新載入頁面,因為無需重新加載一個新的頁面 每一次得到一種單調乏味的,為什麼我需要 再次拉下頭和頁腳再次, 所有的元素的頁面再次 剛刷新的問候語或時間嗎? 所以這就是為什麼我們有一些像Ajax。 我們可以在這裡做什麼用Ajax的是,我們可以說,所有的權利, 我想發送一些數據到服務器, 我要回一個響應,這樣我就可以更新我的網頁, 或者只是做一些算法的計算,這並不一定表明任何用戶。 要做到這一點,你需要什麼?那麼,你需要一個URL,你需要談談。 你的服務器不能奇蹟般地不知從哪兒聽。 你需要有一個特定的地方,你發送此數據。 你還需要一些數據要發送,或者它可能是一個無數據查詢。 你只是要ping的服務器,並說,嘿,我還活著,或類似的東西。 然後你要的功能,主要處理與成功。 比方說,你會得到一些信息,從您的服務器, 您要更改的用戶其網頁上的標題。 所以,你會得到的信息, ,你會推到屏幕上。 什麼情況是,當頁面已經準備好, 您創建了一個在點擊此按鈕,所謂的迎賓功能。 這是什麼那麼,當該按鈕被按下時, 您交談greetings.php的,你一個POST請求, 哎,你說,我的東西從你的網頁。 我們並不真正需要來描述這一點,但greetings.php, 我們只能說,給後面的“Hello World”。 因此,我們得到這個“世界你好”,並在此成功的, 假設一切正常,那麼我們就到這個目標的地方 我們指定的,我們只是在那裡堅持的響應。 這是一個非常簡單的方式建立一個Ajax查詢。 很快,羅布排序已經提到這一點, 東西可以去錯了,不好的事情都可能發生, 所以你要熟悉這些HTTP響應代碼。 這是公正的,像200,一切正常。 其他的東西,壞的事情發生了。 你要記住,這是一般的東西。 但它是很好的知道所有這些。 最後,我們已經經歷了所有這一切, 我們需要聊得非常迅速設計, 然後我們就可以讓你離開。 設計。你要記住的事情。 問問自己這些問題:誰來使用這個嗎? 他們會怎麼使用它呢?我什麼用戶關心什麼? 他們什麼都不關心嗎? 你只是不想讓一個應用程序,它只是成長 並成為這個巨大的,耗時的事情,你甚至不能完成。 你想擁有獨立的目標和計劃,你想要的東西,以解決。 毫不費力。所有這一切都說,基本上 很容易讓用戶使用它,不讓它喜歡這張幻燈片,實際上是一個巨大的blob的文字。 您只是希望它成為的東西在那裡的人很容易去 做他們想做的事情。 你不想讓他們不得不瀏覽5頁 到您的網站的首要功能。 如果谷歌有5個頁面之前,你甚至可以搜索一些東西, 沒有人會使用它。 最後,紙上原型,焦點小組。 有良好的設計和測試方法。 僅僅因為你認為你的作品, 並不意味著任何人都認為它的工作原理。 但是,是的,就是這樣。 [CS50.TV]