[評論:測驗1] [阿里的Nahm,Oreoluwa Barbarinsa,盧卡斯塔斯,羅布鮑登] [哈佛大學] [這是CS50。] [CS50.TV] [盧卡斯塔斯]歡迎大家。這是審查測驗1。 正如一個聲明,這是 - 我的意思是,我們要盡量覆蓋 盡可能多的材料成為可能,但是,這並不意味著 我們將覆蓋所有的東西,可以在測驗1。 所以,要確保你也來看看演講,路段,一切,你可以。 測驗1將是週三,下週三。 所以一定要學習。這將是,相當多,像第一次測驗 關於它的格式,但它可能將是更難。 至少,在去年的時候我花了50,我還以為是更難。 所以,學習了很多。 >>我要說的是,數據結構和哈夫曼編碼。 這一點是很多人都認為是複雜的, 但我要去嘗試,使之盡可能簡單。 首先,我們要你們知道問答1什麼是 了解每個數據結構,我要呈現的概念性描述。 這意味著,你不必實際 在你的測驗1實現一個哈希表。 我們不想讓你實現一個整體的哈希表,也許我們會盡力 讓你實現一些功能, 最常見的操作,但我們不會讓你實現一切。 所以,你了解每個數據結構背後的概念很重要 並且還可以為您能夠在C代碼, 只是他們對每一個數據結構中最常見的操作。 並且還能夠審查指針和結構, 因為他們出現了很多在這些數據結構。 >>首先,鍊錶。鍊錶實際上是非常相似的陣列, 但是鍊錶和數組之間的差別, 首先,這是一個鍊錶有一個非常靈活的尺寸, 而在數組,你必須要么選擇一個非常大的規模為陣, 所以你知道你要能夠存儲所有的數據在陣列中, 或者你必須使用malloc有數組的長度靈活。 在鍊錶它很容易就得到更多的元素, 把更多的元素在鍊錶或刪除元素。 而實際上,如果你不想鍊錶進行排序, 您可以搜索並刪除在常數時間的元素, 所以為O(1)的時間,所以這是非常方便的。 你一定要小心,要永遠記住malloc和free的節點, 只是因為如果你不這樣做,你就會有內存洩漏。 所以鍊錶 - 一個節點的定義就像我們所擁有的權利在那裡。 我把整數n,但是你可以存儲你想要的任何數據。 所以,如果你想存儲一個字符串,它的罰款。 如果你想存儲一個結構,它的罰款,雙,任何你想要的。 我只是把INT N為這裡的例子。 和你有一個指向下一個節點。 因此,基本上是一個鍊錶有一些數據,然後將它指向下一個節點。 如果它在鍊錶中的最後一個元素,它會指向NULL。 所以這是一個鍊錶的示例。 >>好了,現在讓我們來看看我們應該做的,如果我要插入一個鍊錶的元素。 首先,一個函數插入將是void類型 因為我不想返回任何東西。 我要去參加一個int作為參數, 因為我想知道我要插入。 那麼什麼是我應該做的第一件事?嗯,我應該用malloc上newnode, 所以這是第一行。 我只是創建一個新的節點放在一個鍊錶。 所以,我能做些什麼?好吧,我們知道,在我們的鍊錶的實現 在課堂上,我們總是把頭部作為一個全局變量。 所以,我們能做的就是改變頭。 我可以使這個新的節點是新的頭, 並且它要指向以前頭。 我們怎樣才能做到這一點?首先我必須做的 改變是在新的節點值'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,這是完全錯誤的。 我想要做的就是環繞並進入到第一個位置。 也許你只是說,好吧,我只需要檢查 如果我能真正把東西存在。 如果沒有,我只是說,哦,新的滿負荷生產 其實容量 - 1,你不能把一個元素存在。 但是,是什麼問題?問題是,如果我只是出列的一切就在這裡 然後我嘗試添加別的東西,它只是說, 好了,你是在滿負荷,這是0。 所以,你的隊列消失了。 你有環繞和環繞著的一種方式 那你們的遠見卓識和其他pset中了解到,使用MOD。 你可以在家裡嘗試理解為什麼你會做q.size + q.head MOD能力,但如果你在這裡檢查, 我們可以看到,它的工作原理。 因此,在最後一個例子,q.size為8 和頭部為1,因為它是這個位置在這裡的數組。 所以這將是8 + 1,9。國防部容量9將是0。 它會去到索引0。我們會在合適的位置。 然後嘗試隊列在家裡。 一些重要的事情:試著去了解棧和隊列之間的差異。 在家裡,試圖讓很熟悉執行入隊,出隊,push和pop。 同時也明白什麼時候你會使用它們。 >>因此,讓我們放鬆10秒,一幫小寵物。 現在讓我們再回到數據結構。 哈希表。許多人被嚇壞了哈希表。 在問題設置6,拼寫檢查器。 哈希表和嘗試,很多人會害怕他們。 他們認為,他們很難理解。是嗎? [羅布鮑登]習題集5。 >>習題集5,是的。感謝羅布。 是啊。六是哈夫N'噗,是啊。 習題集5被拼寫檢查,而你不得不使用一個哈希表或一試。 很多人以為自己是超級很難理解,但他們其實很簡單。 什麼是哈希表,基本上?哈希表是鍊錶的數組。 數組和哈希表的唯一區別 是,在哈希表中你有一些所謂的哈希函數。 散列函數是什麼? 我不知道,如果你們可以在這裡閱讀。 這是一個哈希表的一個例子。 所以,你可以看到,你有31個元素的數組。 而我們在做一個哈希表是什麼有一個散列函數 這是要翻譯的關鍵,每個INT到一個索引。 如果,例如,如果我要選擇適合B.哈里森, 我會把B.哈里森在我的哈希函數, 和散列函數將返回24。 所以我知道我想要存儲B.哈里森在24。 所以,這只是有一個數組,並有一個哈希表之間的差異。 在哈希表你就會有一個是要告訴你一個函數 在哪裡存儲您要存儲的數據。 對於散列函數,你要尋找一個哈希函數 這是確定的,均勻分佈。 正如你可以在這裡看到,你看到了很多,我想存儲數據的竟是19 而不是使用31和30和29,這都是免費的。 所以我使用了哈希函數不是很均勻分佈。 當我們說分佈均勻,這意味著我們想擁有, 粗略地說,至少有1或2個為每個 - 像,1或2中的每個陣列的指數的差異。 你想有,大致在每個鍊錶元件的陣列中的相同的編號。 並可以很容易地檢查它是否有效的哈希表中,查看哈希表。 >>然後樹。這是一棵樹。 在計算機科學中的樹木是倒掛的一些原因。 所以,在這裡你有樹的葉子的根部,然後。 你應該知道的術語為家長和孩子。 每個節點都有它的孩子,這是屬於母公司下面的節點。 因此,舉例來說,2將是父為3和另一子在那裡, 而3將是父為1,其餘的孩子,都在那裡。 和1將是3的孩子,等等。 我們有一些更有趣,叫做二叉搜索樹, 其中一個節點的右側所有的值 將要在右邊,就在這裡 - 在右邊, 要大於在根元素。 所以,如果我有5號在這裡,所有的右邊元素 將要大於5,並且在左側 所有的元素都將是小於5。 為什麼這是有用的? 好吧,如果我要檢查,如果數字7是在這裡,例如, 我只是去5第一,我要去看看,是不是5 7或大或小? 這是更大的,所以我知道這將必須在樹的右側。 所以,我有少得多的東西來看待。 在實現二叉搜索樹,節點,我只是要必須有數據, 所以詮釋n;你也可以有一個字符串 或者你想要的任何東西。 你一定要小心,在界定什麼是更大的,什麼是少。 所以,如果你有字符串,例如,你可以定義 所有這些東西放在右邊將會有更大的長度, 左邊將會有更低的長度,所以它真的取決於你。 >>我如何能實現找到BST? 我們必須做的第一件事就是檢查根是空的。 如果是NULL,則這意味著該事情是不存在的 因為你甚至沒有一棵樹,對不對? 於是我返回false。 否則,我要檢查,如果數量大 比在根目錄中的值。 我要去嘗試找到正確的元素 的樹狀結構。 你看,我在這裡使用遞歸。 然後,如果它的不足,我要去看看左邊。 終於,否則,如果它不小於或不大於, 這意味著它本身的價值。 於是我就返回true。 你可以在這裡看到我使用,如果,如​​果,如​​果。 請記住,在測驗0,我們有一個問題,如果有如果,如果, 而你應該找到效率低下, 而效率低下是你使用,如果。 你應該使用,如果,否則,如果,否則,如果和其他人。 所以,我應該用別的if和else if和else這裡? 有沒有人 - 耶? [學生來講,無聲] 那很完美。所以,她說,不要緊, 只是因為我們之前所擁有的低效率 是因為,也許,如果某些條件被滿足, 所以你執行的操作,但隨後你要檢查所有的其他條件。 但在這種情況下,它返回的時候了,所以沒關係。 所以,你不必如果要使用其他。 >>最後,讓我們來談談嘗試, 這是每個人的最愛。 一個try是陣列的樹。 它非常快速查找值,但它使用了大量的內存。 這通常過濾的話,那麼當你 想要實現,例如,我不知道,像電話簿中的電話 並且希望能B型 而只是誰的人有二名 它非常容易使用try來實現,例如。 在一個try你如何定義一個節點? 你只需要擁有一個bool,是要被is_word。 它表示使用的所有字符的節點之前, 你能形成一個字, 然後你就會有一個指針數組節點。 你可以看到,我們有父節點的數組,所以節點*數組?是嗎? 因此,讓我們來看看如何將工作。對於拼寫檢查, 我們有27個元素的數組, 因為我們擁有所有的字母加上單引號。 在這裡我只是要使用2,因為我希望能夠在黑板上寫字。 好吧。所以這是一個嘗試的一個例子。 如果我只是定義的第一個節點,我將有2個元素的數組 這2個指針為NULL,所以我只是把'A'和'B'。 我要去有一個bool,說is_word。 這將是虛假的第一個, 只是因為,在這之前你沒有任何字符。 因此,一個空字是不是一個詞。因此,它是假的。 如果我想'一'加入到這個字典中,那麼我有什麼關係? 我只是將malloc為'一'一個新的節點, 然後將其單詞添加為true。 因此,它只是表示有'一'將是真實的。有意義嗎? 那麼如果我想添加'BA',我得的malloc 1'B', 然後我要去布爾設置為false, 因為'B'本身不是一個字。 然後我會用malloc另一個為'A',所以'BA', 然後我要建立它的一個字為true。 因為'BA'這個詞。 然後如果我想看看'b'是本詞典, 我可以去到的第一個,'B'。我要下去,我看是字,和它說假的。 所以它不是一個字。如果我要檢查'BA', 我去的第一個,'B',然後去'一',我看真正的,所以它是一個字。有意義嗎? 很多人通過嘗試感到困惑。沒有? >>最後,Huffman編碼。霍夫曼編碼是非常有用的 為了節省內存和壓縮文本文件, 只是因為很多你用'a'和'E',例如時間, 在文檔中,但我不知道,如果你們使用'Q'或'Z'為多。 剛走1個字節為每一個字符, 每一個 - 在256個字符,我們在ASCII表不是很理想, 只是因為有您使用更一些字符, 所以你應該使用更少的內存為那些。 我如何使用霍夫曼編碼? 我們要做一個哈夫曼樹。  哈夫曼樹有節點 有,是要像,'A','B','C',信的象徵, 不管信你,一個頻率,這個詞出現在文本的頻率, 您正在創建哈夫曼樹, 然後,是要指向哈夫曼樹的左節點 並且,是要指向正確的另一個節點。所以就像一棵樹。 你如何建立一個哈夫曼樹? 你會挑2個節點具有最低頻率。 如果你有一個領帶你要挑2個節點 具有最低的ASCII值也是如此。 然後,你要創建一個新的樹掉那些2節點 這是要在父節點的合併次數。 然後你會從林中刪除了2名兒童 並與家長進行更換。 而你要再說一遍,直到你只有1棵樹在森林裡。 因此,讓我們看看你會怎麼做一個哈夫曼樹ZAMYLA。 你可以在這裡看到,所有的字母有頻率1,除了“A”,即具有頻率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',那麼懶惰。 所以,這一切對我來說,羅布的去接管。 [羅布鮑登]所以,​​每週7的東西。 我們已經得到了很多去了真快。 位運算符,緩衝區溢出, CS50庫,然後HTML,HTTP,CSS。 所有在像15到20分鐘。 位運算符。有他們的6,你需要知道的。 按位與,按位或,異或,左移,右移,而不是。 右移,而不是你在演講幾乎沒有看到的。 我們就去了它很快在這裡,但它是很好的了解,這些都是存在的6。 請記住,按位運算符是當你做3 + 4等。 你所面對的並非是3和4的二進制文件。 與位運算符實際上是在處理數字3和4的各個位。 >>所以我們會說的第一個是按位沒有, 而它所做的就是翻轉所有位。 所以在這裡,如果你正在寫在C,你不會寫 作為〜11011或什麼的,你會寫什麼樣子〜4, 然後將翻轉的4的二進制表示。 所以在這裡,〜的一些二進制數1101101是要精確地翻轉全1到0和1的全0。 正如我說有,經常利用這一點, 我們會看到它的有點,就像是我們要拿出一些數字 其中所有的位都為1,除了其中之一。 因此,它通常更容易表達數 其中只是單位被設置, 然後利用它的〜,所以每隔位被置位,除了那一個。 所以,這就是我們要使用更多的位。 >>按位或。這裡有2二進制數,而這些2號 有相當代表性,因為它們代表每一個可能的 位的組合,你可能需要進行操作。 在這裡,當我邏輯或運算的每一位,我們只是將直降比較。 這樣的左側,我們有一個1和1。 當我按位|那些,我該怎麼走?之一。 然後按位| 0和1是要給我嗎?之一。 按位1和0的將是同樣的東西,1。 按位0 | 0是要給我0。 所以,在這裡我得到0的唯一情況是在0 | 0例。 和你能想到的,就像你的邏輯OR。 所以,如果你認為1為真和0為假,同樣的道理也適用於這裡。 所以,真正的或真實不虛;真或假為真。 或真或假為真,假的還是假的是唯一的事情,實際上是假的。 下面是你應該知道的例子 作為一個相當不錯的,當位運算符的使用的例子。 在這裡,如果我們或大寫A與OX20, 我們將看看這些在第二,我們得到的東西。 如果我們還是小寫'A'與OX20,我們得到的東西。 因此,讓我們拉起ASCII表。 好吧。在這裡,我們看到,'A'是 - 在這裡,我們有'A'是十進制的65。 但我會去用十六進制,這是Ox41。 敢肯定,我們看到它在課堂上。我認為,我們看到它在課堂上 這是很容易轉換為十六進制二進制。 所以在這裡,如果我想要把4成二進制, 這只是將是0100。 這是1個位,2個位,4個位,所以這是4。 然後,我可以一拆二,這將是0001。 所以這將是二進制“A”的表示。 以小寫字母'A',它現在將是Ox61, 在那裡,這些分裂成它的二進制,所以6 - 讓我們真正做到這一點 - 有沒有橡皮擦?橡皮擦。 Ox61。因此分裂6成二進制將是0 + 4 + 2 + 0。 和分割1將是0001。 看著這兩個之間的區別, 我們看到,一個小寫和大寫“A”之間的唯一區別是這樣的單個位。 於是又回到這裡 - 好吧。 回來到這裡,如果我們再看一下位OX20是, 因此分裂OX20轉換為二進制, 是0010,0000。 OX20,所設置的唯一的一點是此位是我們所關注的, 資本和小寫'A'之間的切換。 如果我或'A',這是這個,'A', 如果我或'A'與OX20, 我該怎麼走? [學生,無聲] >>小寫字母'A',因為它會翻轉該位為1。 如果我或'a'與OX20,我該怎麼走? 小寫a,因為剛奧林格'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要給我? '答:'因為這是目前一個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不1是異或。 那是0110。 所以現在在這裡,使用XOR - 所以我們回到20。 'A'^ OX20是這2位我們比較。 因此,一個1 ^ 0是要給我一個什麼?一個。 'A'^ OX20是要給我嗎?小寫a。 '一'^ OX20是要給我嗎? A.資本 因為不管這是幹什麼的,這個異或與OX20 有效地翻轉不管該位。 如果這是一個0,它現在會成為一個1。 由於這是一個1,1 ^ 1是0。 因此,我們的'一'已經變成了'A',而我們的'A'已經變成了'一'。 因此,異或僅僅是翻轉的情況下,一個真正方便的方式。 你只是想遍歷字母串 和交替的每一個字符的情況下, 你只是XOR一切與OX20。 >>現在我們已經左移。左移只是要,基本上, 推動所有數字成,或左側,並插入0的甩在身後。 所以在這裡我們有00001101。 我們打算從右邊推3 0在, 我們得到01101000。 在非二進制計算, 我們看到,這是真正處理13左移3,這給了我們104。 所以左移位,我們在這裡看到,X << y是基本X * 2 ^年。 13 * 2 ^ 3,2 ^ 3為8位,所以13 * 8是104。 如果你只是想二進制一般來說,每個數字如何, 如果我們從右邊開始,它是1的位置,那麼2的地方,那麼4的地方。 因此,通過從右邊0的推動, 我們只是推的東西,分別在4的地方到8的位置, 和事情是在8的位置到16的位置。 每班只需乘以2。是嗎? [學生]:如果你通過5移,會發生什麼? [鮑登]如果通過5轉移你只是失去位數。 不可避免的是,這是同樣的事情。像,整數僅為32位, 所以,如果你添加2真正的大整數,它只是不適合在一個整數。 所以它在這裡同樣的事情。如果通過5移, 我們只是失去的那一個。 這就是那種我所說的“大致” 在那裡,如果你移動得太遠,你輸了位。 >>右移將是相反的, 我們要去的地方,以推0的關底, 並為我們的宗旨,填0的從左邊。 所以這樣做,我們基本上扭轉了我們已經做了。 而且我們看到,三個0的右側剛剛脫落, 我們已經推動了1101一路的權利。 這是做104 3,這是有效的,X / 2 ^年。 所以,現在,在這裡,這是一個類似的想法。 為何說是大致的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的調用它。 因此返回地址是它的函數的地址,返回在函數返回時。 究其原因,是對緩衝區溢出攻擊重要的是因為,方便, 黑客喜歡改變返回地址。 而不是要回富的,我要回去的地方黑客要我回去。 而且,方便,那裡的黑客經常想回去 是,我們原本有緩衝區的開始。 所以請注意,再次,小印度。 該設備是一個小印第安人系統的一個例子, 這樣的一個整數或者指針被存儲並反轉字節。 所以在這裡,我們看到 - 是什麼?是啊。 我們看到Ox80,OxC0,Ox35,OxO8。 還記得十六進制數字? 我們不扭轉小印度的十六進制數字, 因為2個十六進制數字組成一個字節,而我們扭轉字節。 這就是為什麼我們不存儲一樣,80530CO8。 我們存儲,相反,每對2個數字,從右邊開始。 該地址是指起始地址 我們的緩衝,我們其實是想複製到擺在首位。 究其原因,是非常有用的,因為,如果有什麼攻擊 事,而不是有一個字符串,它只是為了, 像一個無害的字符串,他們的名字什麼的, 如果,相反,該字符串只是一些任意代碼 那做任何他們想要它做什麼? 這樣他們就可以 - 我想不出任何很酷的代碼。 它可以是任何東西,但。任何災難性的代碼。 如果他們想,他們可能只是做一些在段錯誤,但是這將是毫無意義的。 他們通常做破解你的系統。 >>好吧。 CS50庫。 這是,基本上,調用getInt,的getString,我們為您提供所有這些功能。 因此,我們有字符*字符串,這就是我們吹散了抽象 在學期中的一些點。 請記住,一個字符串是一個字符只是一個數組。 所以在這裡我們看到的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會被存儲在整數, 十大將獲取存儲在字符, sscanf的將返回2,我們會重試,因為我們只想要一個整數。 >>快速通過HTML,HTTP,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行。 最後,該網頁實際上我要求將緊隨其後。 可能的狀態代碼,你可能會看到,你應該知道其中幾個。 200 OK你可能已經見過。 403禁止,404未找​​到,500內部服務器錯誤 通常如果你去一個網站,有什麼地方不對頭或他們的PHP代碼崩潰, 而在家電,我們有一個大的橙色框 ,來了,說,喜歡,什麼是錯的,這個代碼不能正常工作 或此功能的糟糕。 通常網站不想讓你知道什麼是函數實際上是不好的, 所以不是他們只會給你500內部服務器錯誤。 TCP / IP是在HTTP的1層。 請記住,有互聯網萬維網之外。 就像如果你玩網絡遊戲,不通過HTTP, 它會通過不同的 - 它仍然使用互聯網, 但它不使用HTTP。 HTTP協議是建立在TCP / IP協議只是一個例子。 IP的字面意思是互聯網協議。 每台計算機都有一個IP地址,它們是那些4位數字的東西 像192.168.2.1,或者什麼,這往往是一個地方之一。 但是,這是一個IP地址的模式。 因此,DNS,域名服務, 這就是翻譯的東西如google.com到實際的IP地址。 所以,如果你鍵入IP地址轉換成一個URL, 這將帶您到谷歌,但你往往不記得那些事情。 你會記得google.com來代替。 我們的最後一件事就是口,如果這是知識產權的技術合作計劃的一部分。 TCP會更多。想想看,像,你有你的網頁瀏覽器中運行。 也許你有一些運行電子郵件應用程序; 也許你有一個使用互聯網上運行的其他程序。 他們都需要接入互聯網, 但你的電腦只有1 WiFi卡或什麼的。 所以端口是我們能夠分裂方式 這些應用程序都能夠使用互聯網。 每個應用程序獲得1特定的端口,它可以監聽, 並且默認情況下,HTTP使用端口80。 有些電子郵件服務使用25。 低編號的人往往會被保留。 你通常能夠獲得更高的編號,那些為自己。 CSS,層疊樣式表。 我們的風格網頁使用CSS,不使用HTML。 有3個地方,你可以把你的CSS。 它可以是內聯的,風格標籤之間,或者在一個完全獨立的文件,然後掛英寸 這裡是CSS只是一個例子。 你應該認識到這種模式, 其中第一個例子是我們相匹配的body標籤, 在這裡,我們正在圍繞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等號。 好吧,有沒有4等號,但也有2和3。 您可以使用2等號檢查的值。 它可以檢查跨類型。 所以,如果你可以在第一個例子中看到的, 我有num_int == num_string。 所以,你的int和你的字符串都是,在技術上,1, 但他們是不同的類型。但對於雙等號,它仍然通過。 然而,對於三重等號,它檢查值以及不同類型。 這意味著,它不會到那第二種情況下在這裡, 您使用的是3等號代替。 所以這就是你應該所有現在已經證明的主要區別。 >>字符串連接是另一種強大的東西你可以在PHP中使用。 它基本上只是這個方便點符號, 這就是你如何綁定字符串連接在一起。 所以,如果你有貓,你有狗,和你想放的2串在一起, 您可以使用期,這是一種工作方式。 你也可以將它們彼此相鄰, 你可以看到在底部的例子在這裡, 在那裡我有迴聲串1,空間字符串2。 PHP將知道把它們放回這樣。 數組。現在,在PHP中,有2個不同類型的數組。 你可以有規則排列,並且你也可以有關聯數組, 而且我們要通過他們去現在。 常規數組只是在C, 所以您有編號的指標。 現在我們只是要創建一個,並把 - 所以這是我們如何創建一個空的數組,然後我們要 投入的索引號0。 我們打算把數字6,值6。 您可以在底部看到它在這裡。 Where's - 索引號為1,我們打算把價值數4, 所以你可以看到有一個6,有一個4, 然後當我們要打印的東西, 當我們試圖和打印存儲在索引號為0的值, 然後我們會看到值6被打印出來。酷? 所以這是常規數組為您服務。 另一種方法,你也可以添加東西經常陣列現​​在 是你可以將它們附加在最後。 這意味著,你不必指定具體的指標。 你可以看到號碼,然後在方括號中有沒有指定的索引。 它會知道 - PHP會知道只需將其添加到列表中,下一個空閒點的結束。 所以,你可以看到1正好遇上了0點, 2去正好遇上的第一個點。 3雲 - 添加有作為。 所以,那種是有道理的。你只是不斷地增加它, 然後當我們回響著數1的指數, 它會打印出值2。 >>然後我們有數組是關聯數組。 關聯數組而不是有數字索引, 他們做的是什麼,他們有指數是由字符串。 你可以看到,而不是 - 我擺脫了所有這些數量指標, 現在它的密鑰1,密鑰2,密鑰3,而且他們在雙引號,以表明他們都是字符串。 所以我們可以有這樣的一個例子。 這樣做的例子是,我們有TF,這就是索引名稱。 我們打算把“阿里”作為名稱,該指數在,吃的熱量, 我們可以把而不是字符串一個int這個時候, 然後在指數喜歡,我們可以把整個數組裡面它。 因此,這是一種 - 這是一個類似的概念,我們怎麼了 用數字索引,但現在我們可以改變周圍的指標 有他們作為字符串來代替。 您也可以做到這一點,除了剛剛做單獨, 你可以做到這一切在一個塊。所以,你可以看到,數組的TF, 然後我們將它們都在一個巨大的方括號集。 這樣就可以加快速度。 它更多的是一種風格上的選擇不是。 我們也有循環。 在C語言中,我們有這樣的工作循環。 我們有我們的數組,我們從索引0到該列表的末尾, 我們打印出來,對嗎? 除了這個問題,對於關聯數組, 我們並不一定知道那些數字索引 因為現在我們有字符串索引。 現在我們使用foreach循環,其中,再次,你希望在PSET 7中使用。 foreach循環將只知道列表的每一個部分。 並且它沒有確切地知道您有數字索引。 所以,你必須在foreach的語法,所以它的foreach,你把數組。 所以,我的數組被稱為pset中,然後作為,字如, 然後你把你要使用這個局部臨時變量 只是對於具體的事情,那將持有的具體 - 一個實例或數組中的一個部分。 PSET民將舉行1,然後說不定還會舉辦數6, 然後將持有的數量2。 但它保證要經過的每一個值,該值的數組中。 有用的功能,你應該知道在PHP中是需要, 這樣就使得確保您包括某些文件,迴聲,退出,空的。 我強烈建議你看看PSET 7,看看這些功能。 你可能需要知道這些, 所以我肯定會知道,究竟是什麼,這些都在做的事情。 >>現在我們要真正快速辦理範圍。 在範圍上,PHP是一種時髦的東西,不像C, 所以我們只是要快速通過它去。 因此,讓我們說,我們開始在那個方向,我們有在那裡。 而且我們要以$開頭我。這樣的變量i將是0, 而我們只是要保持在大的白色盒印刷它在那裡。 我們將開始與I0,然後我們要呼應它。 因此,有0。 然後我們將通過for循環來增加它, 然後它會是1的值。 一個是小於3,所以它要穿過那個for循環, 然後我們將看到它再次打印。 我們將再次增加它到2, 和2小於3,所以它會通過for循環,它會打印2。 然後,你會注意到,3不小於3,所以我們會打出來的for循環。 所以,現在我們已經退出了,然後我們將進入機能缺失。 好吧。所以,你必須要注意,這個變量,我們已經創建, “我”的變量,是不是局部範圍。 這意味著,它不是本地的循環, 和變量,我們仍然可以訪問並更改之後,它仍然是有效的。 所以,如果你現在進入的功能,你會看到,我們還可以使用'我'的變量, 而且我們要增加'I'+ +。 你可能會認為,首先,基於C,那這就是'我'的變量的副本。 這是一個完全不同的事情,這是正確的。 因此,當我們打印時,我們將​​打印的“i”+ +,這是會打印出4, 然後我們要 - 對不起。 然後,我們要結束了該功能的, 並且我們將會在那裡的箭頭是現在。 這意味著,然後,然而,即使該功能改變的“i”的值, 它並沒有改變的功能外, 因為該函數有一個單獨的範圍。 這意味著,當我們回顯'我',它並沒有在函數的範圍變化, 所以當時我們要再次打印3。 有關範圍在PHP中不同的東西比C >>現在在PHP和HTML。 PHP是用來製作網頁的動態。 那種它使事情有所不同。 我們把它與HTML不同。 在HTML中,我們始終只是有相同的靜態的東西,像羅布如何表現, 而PHP中,你可以根據用戶是誰改變的事情。 所以,如果我有這個,我,“你登錄為 - ”,然後名字, 我可以更改名稱。所以,現在的名字是約瑟夫, 它具有“關於我”,但後來我也可以改名字有湯米。 而這將是一個不同的事情。 這樣的話,我們也可以改變對他的不同的事情, 並且基於該名稱將顯示不同的內容。 這麼說PHP可以種改變什麼在你的網站怎麼回事。 同樣在這裡。還是請注意,它們具有不同的內容, 即使你是在技術上還是訪問表面上的同一個網頁。 生成HTML。有兩種不同的方式,你可以做到這一點。 所以我們現在要通過正確的。第一種方法是,你必須 - 是啊,對不起。 所以你只要你經常for循環在PHP中, 然後迴響在PHP和你回音了HTML。 用什麼羅布顯示HTML腳本的你 然後使用PHP打印剛剛打印出來的網頁。 另一種方法就是做它,如果你分離出的PHP和HTML。 所以你可以有一個啟動循環線的PHP, 那麼你可以讓HTML的線在一個獨立的東西, 然後就結束循環,再次用一個PHP。 所以這是一種分離出來。 在左側,你可以說你把所有的 - 這只是1塊的PHP。 在右邊你可以看到,你有一個行PHP的, 你有一行HTML,和你有一個行PHP的一次。 所以分離出來成為他們在做什麼。 而且你會注意到,無論哪種方式,對於其中任何一個, 他們還是打印出來的圖像,圖像,圖像, 使得HTML仍然被印刷的方式相同。 然後你仍然會看到3張圖片顯示在您的網站上。 所以這是2個不同的做同樣的事情的方法。 >>現在我們有形式和要求。正如羅布表明您, 有HTML的形式,我們將只通過這個微風。 你有一個動作,你有一個方法,而你的行動 那種告訴你你要去哪裡送呢,而且方法是否 這將是一個GET或​​POST一個。 和一個GET請求,羅布說,這意味著你要放在一個表格 你會看到它作為一個URL,而POST請求,你不會在URL中看到。 所以,一個細微的差別。 然而,有一點是類似的事情 是POST和GET同樣不安全。 所以,你可能會認為只是因為你沒有看到它在URL中, 這意味著在POST更安全, 但你仍然可以看到它在你的cookies在你發送的信息。 所以,不要認為對一個或另一個。 另一個要注意的是,你也有部分變量。 你們用這個在pset中7得到你的用戶ID信息。 當時的情況是,你可以用這個關聯數組, 在$ _SESSION,然後就可以訪問不同的東西 並存儲整個頁面不同的事情。 >>最後一件事是,我們有SQL,結構化查詢語言, 這是一種編程語言來管理數據庫。 究竟是什麼,是數據庫?他們是表的集合, 每個表只能有相似的類型的對象。 因此,我們在你的財務pset中有一個用戶表。 他們為什麼有用?因為它是永久存儲信息的一種方式。 這是事物的跟踪和管理事物的一種方式 實際上看到它在不同的頁面和跟踪。 而如果你只是存放在那一個瞬間眼前 再後來使用它,你將無法訪問您保存任何東西。 我們有我們使用的SQL命令4件大事。 我們有選擇,插入,刪除和更新。 這些都是非常重要的,你們要知道你的測驗。 >>我們將快速選擇現在。 基本上,你從數據庫中選擇行。 所以,如果你有,就在這裡 - 我們有這2個不同的東西,我們希望從類表選擇 其中真棒 - 凡在真棒列中的值是1。 所以,你可以在這裡看到,我們有這2個東西的類名, CS50和Stat110,並且我們有一流的ID和口號。 所以,我們要選擇所有的信息。 然後,你可以看到在這裡種,它的挑選出真棒列, 那裡所有的東西都是1,然後將其擁有的類ID,類名和口號,它可以挑選出。 你是做這個的代碼究竟怎麼了?你必須使用PHP。 所以這是怎麼樣的PHP和SQL是相互關聯的。 現在,我們有我們的代碼,我們將使用我們的查詢功能 因為我們沒有在PSET 7,和我們要執行的SQL查詢。 然後,我們就要有 - 我們總要檢查,如果行的三重平等的,如果為false。 所以,再一次,你要檢查的類型和價值, 然後,如果它不工作,那麼你要道歉,像往常一樣,就像我們在PSET 7一樣。 否則,你經歷的一切與方便要循環 foreach循環,我們只是走過去。 現在,我們正在遍歷和我們過去做了, 讓我們假設我們的查詢過去了,現在我們有我們的foreach循環。 和第一行有,所以這裡的行,就在這裡,它的盒裝。 這將打印出所有它得到的信息。 所以它會打印出在底部“想學HTML嗎?” 然後它會去到下一行,因為它完成了第一個for循環, 等等然後它會打印出它的第二行, 這將是STAT110,查找所有的時刻。 >>最後一件事是對的SQL漏洞。 我知道大衛在這感動的演講一點點。 您可以稍後閱讀。這真的很有趣。 SQL注入是一種棘手的事情。 比方說,你只是這些變量堅持正確進入您的查詢, 你可以在第一行看到。 因此,它似乎罰款,對不對?你只是把在用戶名 和密碼到您的SQL查詢,並且要出貨其關閉,並獲得無論是在你的數據表。 這似乎很簡單。因此,可以說有人把中, 輸入密碼,這或文字在這裡 - 實際上應該是在紅色框。 所以我們說,他們把該密碼進入 - 這就是他們進入。 所以他們把或“1”= 1。 樣一個愚蠢的密碼有。 現在,讓我們只需更換它,你會注意到,在S​​QL查詢現在, 它的計算結果總是正確的,因為你會注意到, 你可以在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有權利在head標籤。 什麼是它基本上只包含一個JavaScript文件。 這是一種方式你可以包含JavaScript到你的程序。 那麼第二個點點實際上是一些內嵌的JavaScript, 非常類似於使用CSS內聯樣式, 而你只是寫一些代碼很快出現。 JavaScript有數組。 只是另一種方式來保持數據周圍,非常有用。 非常好,容易語法。 您可以使用方括號來訪問一切,把一切都在一起。 沒有什麼太複雜。 關於JavaScript和腳本語言一般很酷的事情 是,你不必擔心數組的大小。 你可以只使用array.length,並保持它的軌道, 也是數組可以增大或縮小,因為你需要它。 所以你甚至不需要擔心任何形式的, 哦,不,我需要分配更多的東西,或者類似的東西。 >>這裡很酷的事情是,JavaScript有一些所謂的對象。 這是一種面向對象的語言,因此它已經是,本質上, 一個方法可以讓你組數據放在一起,有點類似於一個結構, 但你可以訪問它像一個結構或一個關聯數組的語法。 這是很簡單,你可以用這個做的是組數據一起 如果你有一堆數據的的關聯。 因為它是所有你需要描述一輛車的事情, 你不需要把它在一堆不同的地方。 您只需把它貼到JavaScript中對象1。 正如你可能知道,迭代是那些繁瑣的任務之一。 你只需做一遍過。你需要跟每一個對象在車上, 或者你需要通過每一個項目列表或類似的東西。 所以,JavaScript有,類似於PHP的,一個foreach語法。 在這種情況下,它是一個用於在迴路。 你想只在對象使用這個。 還有,如果你使用這個陣列上所發生的一些問題。 它一般是其中的一件事情,雖然,這是非常有用的, 因為你消除大量的開銷 因為你沒有自己拉起來一切都在你的對象。 你不必記住所有的鍵名。 你只是有點讓他們回到這個語法。 在此,對,你只是要記住 你得到回所有的鑰匙,在一個非常類似的方式來哈希表。 如果從記住,當你想放在一個字符串,你可以得到的東西 這將具有與其相關聯的值。 你可以用這個做的是,你可以說,沒事, 我把一輛車,我把它叫做一個法拉利。 所以,你可以把字符串法拉利再續前緣,你可以得到這一點。 你也可以這樣做,在一個循環中,在循環的。 所以只是更多的對象。從此,你需要記住的關鍵一點 是,你可以使用該對象結構的語法,只要你想用這些, 除非你有什麼打算作為一個字符串使用的是不是一個有效的變量名。 所以,如果你看一下,有,我們有空格鍵。 好吧,如果你把object.key,空間,與空間,空間, 只是沒有意義語法。 所以,你唯一能做的,隨著這種支架的語法。 >>此外,JavaScript是非常適用範圍,明智的PHP。 你有2種方式解決範圍。 你不能有變種在變量的前面, 那只是意味著這是全球性的。 你可以從任何地方看到它。即使你是把這個在if語句中, 其他地方在你的代碼這一點後,你可以看到這個變量。 另一件事,雖然是用var,它是有限的,以什麼功能你英寸 如果你不是在一個函數,那麼,它是全球性的。 但如果你是在一個函數中,這只是該函數內可見。 我沒有一個例子,但是,是的。這是其中的一件事情,其中 你可以管理你想成為全球哪些變量, 你想成為本地的,但你必須要小心這個變量, 因為你不具備細粒度控制你在C語言中的類型, 在那裡,如果事情是在一個聲明for循環,它會留在那個for循環。 我們真正關心使用JavaScript的事情是操縱網頁,對不對? 我的意思是,這就是為什麼我們正在這樣做。 >>為了做到這一點,我們使用一種叫做DOM。 文檔對象模型。 基本上,它的作用是它需要所有的HTML 它的模型伸到了一堆相互嵌套那些對象。 你的東西是這樣開始了。 你有,就適合我,一堆代碼,在那裡,有幾分 - 你可能會認為這會是很難操縱, 因為你會透過一堆文字解析 並有拼湊分開的東西。而如果它沒有正確格式化? 不好的事情會發生。 因此,JavaScript的需要照顧的為你,你會得到一個很好的數據結構, 像一個在我左邊,在那裡你只是有一個文件, 並且裡面,你有一些所謂的HTML, 並且裡面你有一個頭和身體, 而且腦袋裡面你有一個標題,等等,等等,等等。 這簡化了操作的Web頁面,以便它只是, 哦,我只是想談談這個對象。 排序的一個非常類似的方式,你會跟你做自己的另一對象。 就像我說的,所有的DOM是文檔對象。 或者它只是一個地方,那麼你可以去在它裡面找到的東西, 你可以做到這一點 - 這是舊的風格做,在那裡的, 你在那裡做的document.getElementById,然後將名稱, 正如你可能會說,這得到了一段時間後,很笨重。 所以,你可能不希望這樣做。這就是為什麼我們有 我們將在此之後談論未來的事情。 這裡的關鍵是,沒事,你擁有所有這些元素,對不對? 所以也許我可以改變的頁面加載時的東西的顏色。 還等什麼?如果我的用戶點擊的東西? 我想要它做的一些有趣的事情,當他們點擊什麼。 這就是為什麼我們有活動。 可以,基本上,找到DOM中的任何元素, 然後說,嘿。當此負載或有人點擊它, 或者當他們鼠標移到它,用它做什麼。 和你有什麼,你有函數處理這個給你。 這些函數是事件處理程序。 什麼不著痕跡 - 它的說法只是一種奇特的方式, 當這種事件發生,此功能僅執行。 因此處理時發生的事件。 這是你將如何佈置一個事件處理程序。 我有一些按鈕,當你點擊它,它爆炸。 所以,不要單擊該按鈕。 這是接近它的方法之一,對不對? 你有一個按鈕標籤,並在點擊你有一個字符串,上面寫著: 哦,順便說一下,我這樣做是爆炸事情對我來說。 否則,它就像你剛才做了一個常規按鈕。 您也可以做到這一點的另一種方式, 通過抓取DOM元素,但我們會拯救我們談論的jQuery之後。 jQuery的:它是一個庫,它是跨瀏覽器。 你可以在幾乎任何使用它。 它只是給你很多的工具一起工作。 因為JavaScript雖然強大,沒有您需要的所有工具 開箱真正解決一個web應用程序中你可能想要做的。 因此,它簡化了很多東西,給你很多的功能 出,你通常會需要重新寫自己,一遍又一遍又一遍的方塊。 而只是使事情非常簡單。 你也有選擇,這讓你把所有這些元素 從你的DOM更簡單的,而不必使用這些很長的函數調用。 更多關於這些選擇。你有,在那裡你有,讓我們說 我想獲得一個元素ID為“岩石”。 那麼,在jQuery的,它只是$,然後在出現一斤的字符串,然後“石頭”。 這很簡單,不是解決這個問題的傳統的JavaScript方法快了很多。 和你有類和元素類型類似的事情。 jQuery是 - 涼爽的特點之一是某種可以壓縮 您的查詢您的DOM非常,非常快。 現在,我們又回到了事件處理,這是你將如何處理jQuery的一個事件。 所以我們要在這裡是什麼我們說,沒事的。我有一個腳本標記,對不對? 所以,我有這個內嵌的JavaScript。 我們現在要做的是我們要去說,沒事。 當文檔準備,這意味著該文件的加載, 我們要去的那個函數,並且我們會說,沒事, 這個功能實際上是做別的事情。 它基本上是說,沒事的,讓我的ID的元素“身份識別碼”。 然後給這個,當你點擊它執行的功能的處理程序。 基本上,這是什麼做的是,它說,所有的權利。 在頁面加載,所以我要在,找到這個元素, 給它這個事件處理程序,它基本上設置頁面為您服務。 這是你想怎麼去想事件處理。 你只需要考慮一下,沒事的時候發生的東西,我想要什麼發生? 你不想去想,好吧,我需要確保這件事情要談這件事情, 這個東西等等等等,因為你只是想談的事情在活動方面。 當此情況發生時,發生這種情況。當此情況發生時,發生這種情況。 如果事情引發其他的事情,這是偉大的。 但是,你不想嘗試做複雜的代碼 您要去哪裡觸發多個事物的同時, 因為你只是給自己一個頭痛的問題。 >>所有權利。現在,我們可以得到我們的頁面來處理事件, 但讓​​我們說我的用戶點擊一個按鈕。 如果我想這一請求發送回服務器, 但我不想重新載入頁面,因為不必重新加載一個新的頁面 每一次得到種繁瑣,為什麼我需要 拉下頭又一次,又一次頁腳, 而頁面的所有再次要素 剛刷新的問候語或時間? 所以這就是為什麼我們有類似的Ajax。 我們可以使用Ajax在這裡做的是,我們可以說,所有的權利, 我要一些數據發送到服務器時, 我想獲得回應,所以我可以更新我的網頁, 或者只是做一些算法計算,這並不一定顯示任何內容給用戶。 你有什麼需要做的?那麼,你需要你需要跟一個URL。 您的服務器無法奇蹟般地從無處收聽。 你需要有你要發送這個數據到一個特定的地方。 而且你還需要一些數據要發送,或者也許這是一個無數據的查詢。 你只是想要Ping回服務器,說,哎,我還活著,或者類似的東西。 然後你想要一個函數,基本上處理與成功。 比方說,你從你的服務器取回一些信息, 並且要更改用戶的標題上他們的網頁。 所以,你會得到信息反饋, 而你將推動該到屏幕上。 什麼情況是,當頁面準備就緒, 你為這個按鈕叫迎賓創建的點擊功能。 這是什麼然後做的是,當按下該按鈕, 你跟greetings.php,你犯了一個POST請求, 和你說,哎,讓我從你的網頁的東西。 我們並不真的需要來形容,但greetings.php, 我們只能說,給後面的“hello world”。 因此,我們得到這回的“hello world”,並在這一成功, 假設一切正常,那麼我們只要到這個目標的地方 我們指定的,我們只是堅持的響應在那裡。 這是建立一個Ajax查詢的一個非常簡單的方法。 >>很快,羅布那種提到這個已經, 事情都可能出錯,壞事情都可能發生, 所以你要熟悉這些HTTP響應代碼。 這是什麼意思,只是,像200,一切正常。 別的東西,不好的事情發生了。 它通常你想記住的東西。 但它是很好的知道所有的這些。 最後,一旦我們通過了這一切消失了, 我們需要談談很快對設計, 然後我們就可以讓大家都離開了。 設計。你要記住的東西。 問問自己這些問題:誰將會使用這個? 他們會怎麼使用它呢?什麼我的用戶關心的? 什麼他們不關心? 你只是不想讓一個應用程序,讓它剛長出 並成為這個巨大的,所有費力的事情,你甚至不能完成。 你想擁有你想要解決離散的目標和計劃與事。 使其毫不費力。所有這一切說,基本上 很容易讓用戶使用它,不讓它文本的巨型一滴這樣的幻燈片是,其實。 你只是希望它是什麼它是非常容易有人進去 ,做他們想做的事情。 你不希望他們有瀏覽5頁 去你的網站的主要功能。 如果谷歌有5個頁面之前,你甚至可以搜索一些東西, 沒有人會使用它。 最後,紙上原型,焦點小組。 有良好的設計和測試實踐。 只是因為你覺得你的作品, 不意味著別人想它的工作原理。 但是,是的,就是這樣。 [CS50.TV]