>> DAVID J.馬蘭：好的。
所以歡迎大家來首次 CS50死後來做個測試。
我們認為我們會開幕 這一傳統在今年。
這將是一個機會 漫步
解決方案的測試。
我們會加快或基於放緩 對那些在這裡的利益。
>> 所以你可能在這裡，因為你 感興趣的是如何你可以有或
應該回答一些 的這些問題。
那麼我們為什麼不來看看 在本節第一？
因此讓字符串。
這給了你三個不同的版本 一個程序，是的，最終，
為了從用戶獲得一個字符串。
不論它這樣做是 留給你來決定。
>> 我們問的問題0， 假設第1版
編譯和執行。
為什麼會程序出現段錯誤？
乍一看，有什麼建議 至於為什麼？
是啊。
>> 觀眾：所以我記得在看到這個 看著在前面的例子
的char * s和看到S的掃描和 看到因為它是一個指針，如何
沒有它會影響您的掃描？
它是S或s的地址？
>> DAVID J.馬蘭：確定。
好。
所以，最後，任何問題的來源 大概是要減少
該變量s。
而且這的確是一個變量。
該變量的數據類型是 的char *，這意味著它要
包含一個字符的地址。
而這其中就有敏銳的洞察力。
它要包含的地址 一個字符，或者更一般地，本
在第一個字符的地址 字符的整個塊。
>> 但美中不足的是，掃描秒，目的在 生活中，被賦予一個地址和給定的
格式的代碼，如％s，讀取 字符串轉換成的塊
存儲在該地址。
但因為沒有等號前 在第一次的分號
一行代碼，因為我們實際上並不 分配任何內存
malloc的，其實是因為它沒有 分配一些大小的數組，所有
你正在做的是讀取用戶 鍵盤輸入到一些完整的
垃圾值， 是s中默認情況下。
所以賠率是你要出現段錯誤，如果 該地址並不僅僅如此發生
是一個值就可以了， 其實，寫。
如此糟糕不分配 你的內存有。
>> 因此，在問題1中，我們問， 假設2版
編譯和執行。
為什麼會這個程序出現段錯誤？
所以這一塊是bug更少。
而且也真的只有一個 顯而易見的方法，你可以
這裡觸發段錯誤。
這是主題。
任何我們用c + +在內存中的時間，有什麼 你能做些什麼來誘發段錯誤
與第2版？
>> 觀眾：如果您使用的輸入 一個字符串，它比49再
字符。
>> DAVID J.馬蘭：沒錯。
你看到的東西固定長度的任何時間 當它涉及到一個數組，你
雷達會熄滅，這可能是 有問題的，如果你不檢查
陣列的界限。
這就是這裡的問題。
我們仍然使用scanf函數。
我們還在用％s，這意味著嘗試 從用戶讀取的字符串。
這就是它會被讀成s，， 在這一點上，是有效的
內存塊的地址 或同類產品。
這是一個數組的名字 的內存字符。
>> 但恰恰是，如果你讀一個字符串 這是超過49個字符，49長
因為你需要的空間反斜線 0，你要溢出
該緩衝區。
你可能會得到幸運，能夠 寫一個字第51，第52，第53。
但在某些時候，操作系統 會說，沒有。
這絕對不是內存 你不准碰。
並且程序將會出現段錯誤。
>> 因此，啟發式應該有任何 你已經有了固定長度的時間，你有
確保你檢查的長度 不管它是什麼你想要
讀了進去。
>> 觀眾：所以要解決這個問題，你可以 有一個說法實際上檢查
為長度大於 大於或小於？
>> DAVID J.馬蘭：當然可以。
你只需要一個條件 那說，如果 -
或者說你不一定知道 提前多少個字符
用戶將要輸入時，因為 你有雞和蛋。
直到你跟scanf函數讀取它 你可以計算出它有多長。
但在這一點上，為時已晚， 因為你已經將它讀入
一些內存塊。
所以，作為一個在旁邊，CS50庫避免了 這個問題完全，召回
用龜etc。
它讀取一個字符時， 針尖沿著八字，知道你
不能溢出一個字符，如果 你讀一次。
>> 美中不足的是GetString的召回 我們必須不斷地調整大小
那大塊的內存，這 僅僅是一個痛苦。
這是一個很大的行 代碼來做到這一點。
因此，另一種方法是將 實際使用的表弟，所以
說話scanf函數的。
有很多這樣的變種 功能，實際上檢查
的長度多少個字符 你可能會最大限度地閱讀。
並且您可以指定，不讀 超過50個字符。
所以這將是另一種方法，但 更大的投入較少寬鬆。
>> 所以，問題2問，假設版本 3編譯和執行。
為什麼會是程序出現段錯誤？
所以這一塊實際上是相同的 回答，即使它
看起來有點票友。
我們正在使用的malloc，這感覺就像 我們正在給自己更多的選擇。
然後我們釋放了 存儲在末尾。
它仍然只有50個字節的內存。
因此，我們可能仍然嘗試讀取 在51，52，1000字節。
它會出現段錯誤的 正是由於同樣的原因。
>> 但還有另外一個原因了。
還有什麼能malloc返回除了 內存塊的地址？
它可能返回null。
而且因為我們不檢查 這一點，我們可能會做一些
愚蠢的另一個原因，那就是 我們可能會告訴scanf函數，讀取
用戶從鍵盤輸入 到0的位置，又名空。
而這，也一定會 觸發段錯誤。
所以對於測驗的目的，我們將 已接受或者那些作為的
正當理由。
一個是相同的。
一個是多了幾分微妙。
>> 最後，相對於該節目的 使用的內存，怎麼辦第2版和
第3版有什麼區別？
因此，對於它的價值，我們看到了一個 可能看似源源不絕
回答這個。
而人與人之間的答案，我們都 希望，但我們接受的其他
的東西，是一些提到的 事實上版本2使用
所謂堆棧。
版本3正在使用的堆。
而在功能上，這並沒有真正 讓所有的多大的差別。
在一天結束的時候，我們仍然 剛開50字節的內存。
>> 但是，這是可能的答案之一 我們在看。
但你會看到，當你得到你的測驗 從轉錄因子回首，那我們做
接受其他討論他們的 內存完全不同的用途。
但堆棧和堆本來 一個簡單的答案去用。
有問題嗎？
我給你搶。
>> ROB BOWDEN：所以問題4。
這是一個在那裡你必須填寫 在字節數出所有的
這些不同類型的使用。
我們看到那麼第一件事情。
假設一個32-bit架構， 這樣CS50設備。
所以對基本的事情之一 32位體系結構，它告訴我們
到底有多大的指針是怎麼回事 是在體系結構。
>> 於是馬上，我們知道，任何指針 類型是32位或4個字節。
所以看這個表， 節點*為指針類型。
這將是4個字節。
結構節點*，這是字面上 相同的節點明星。
所以那將是4個字節。
字符串，所以它看起來並不像一個 指針還，但自定義類型，一
字符串只是一個char *，這 為指針類型。
所以這將是4個字節。
>> 所以，這三個都是4個字節。
現在，節點和學生都 更複雜一點。
所以看著節點和學生，我們看到 節點為一個整數和一個指針。
和學生是兩個指針 裡面的它。
所以至少在我們的情況下在這裡，該方法 我們最終計算的大小
這個結構是只加了一切 這就是結構體裡面。
>> 因此，對於節點，我們有一個整數， 這是4個字節。
我們有一個指針，它是4個字節。
所以一個節點是怎麼回事 佔用8個字節。
同樣的學生，我們有 指針，該指針是4字節而另一個
指針就是4個字節。
所以這將結束 最高為8個字節。
因此，節點和學生都是8個字節。
而這三項都是4個字節。
該問題？
是。
>> 觀眾：是它是一個64位 建築，那會
加倍所有的人？
>> ROB BOWDEN：不會 加倍所有的人。
因此，64位架構，它再次， 的變化，根本的東西，一個
指針現在是64位。
是啊。
這樣一個指針是8個字節。
因此，這些是分別為4個字節 都將是8個字節。
一個學生，這是兩個指針， 好了，現在它要
是8個字節，8字節。
這將會使16個字節。
>> 但一個節點仍然是4個字節。
所以這個指針是怎麼回事 為8字節。
這是4個字節。
所以一個節點只打算 為12個字節。
在那一個別的問題嗎？
所以，下一個，這些都是 HTTP狀態碼。
而你必須描述的情況 根據這些威力
退還給您。
我聽到有些同學一個問題 有是，他們試圖使
錯誤是在客戶端的結束。
所以，當我們試圖提出要求 到服務器上，出了
錯在我們這邊。
但一般來說，這些代碼是 服務器正在返回。
因此，我們要弄清楚這是怎麼回事 錯誤或正確的服務器上
導致返回這些東西。
那麼，為什麼一個服務器返回 狀態代碼200？
有什麼想法？
>> 是啊。
因此，一些關於成功 請求經歷。
而且他們能夠返回 不管你提出的要求。
所以，一切都很好。
怎麼樣302發現了什麼？
是啊。
>> 觀眾：服務器一直在尋找 為你所要求的。
但無法找到它。
所以這是一個錯誤。
>> ROB BOWDEN：那麼服務器是 找你想要的東西。
所以只是看這裡，302發現， 它能夠找到它。
>> 觀眾：我很抱歉。
發現意味著，他們沒有找到它。
抱歉。
>> ROB BOWDEN：那麼302個記錄。
該服務器能夠找到 你想要的東西。
>> 觀眾：但它不顯示呢？
>> ROB BOWDEN：之間的區別 這個302和200的是，它
知道你想要什麼。
但它是不完全的地方 你要問。
所以302是一個典型的重定向。
所以，你所請求的頁面。
它知道，哦，我想 給你退貨。
但是，這是在一個不同的URL。
所以，嘿，你真正想要的。
>> DAVID J.馬蘭：這是一塊提到 我們給你們一個重定向
函數所使用的頭功能 這，反過來，打印出來的位置，
冒號，然後到的URL 你要拒絕的用戶。
即使你沒看見302 明確存在，這就是PHP的
會奇蹟般地插入的標頭 說正是羅布說有 -
發現。
但到這裡吧。
>> ROB BOWDEN：確定。
那麼，關於403被禁止？
>> 觀眾：我認為這是服務器 基本上說，在客戶端
無法訪問主頁。
>> ROB BOWDEN：所以，是的。
嗯，典型的答案我們 期待是一樣的東西，這些文件
沒有適當chmodded。
這可能是在什麼情況下 你看見了他們。
但還有一個原因，客戶端 可能是錯在這裡。
實際上，有另外一個狀態代碼 -
401。
因此，這些都是非常相似的。
>> 401是未經授權的。
而403是被禁止的。
所以你們擅自專 如果你沒有登錄。得到
但登錄可能意味著 你被授權。
但如果你已經登錄，並且您 仍然沒有權限，然後
你也可以禁止。
所以，如果你登錄並且沒有 許可，嚴禁也是
有些東西你可以得到的。
>> DAVID J.馬蘭：而到了機制 這些問題通常是
解決了在服務器上是 通過什麼命令？
文件模式，如果是，的確，一個權限 發出的文件或目錄。
>> ROB BOWDEN：那404未找​​到。
是啊。
所以不像302的地方是不完全 在那裡你問，但它知道什麼
你想，這一點，它只是 不知道你想要什麼。
而你沒有請求 一些有效的。
418我是一個茶壺，然後 500內部服務器。
那麼，為什麼你明白了嗎？
>> 所以出現段錯誤 -
我居然不知道該分級 標準這一點。
但是，如果你的PHP代碼有一些東西 錯了，從理論上講，它可以
實際上段錯誤，在這種情況下，這 500內部服務器錯誤，東西
是錯誤的與您的服務器的 配置。
或者有語法錯誤 在你的PHP代碼。
或壞事是怎麼回事。
>> DAVID J.馬蘭：我們確實看到段錯誤 其中幾個人的答案。
而在技術上，它可能發生。
但是這將是一個PHP的程序 其他人寫的，實際上
segfaulted，只如果那些人 搞砸了，並在寫bug的代碼
他們的解釋器 PHP本身出現段錯誤。
因此，即使500就像是一個段錯誤 在精神上，它幾乎總是
配置文件問題的結果 與您的Web服務器，或如羅布說，
一個語法錯誤，像你 沒有關閉的報價。
或者你在某處失去了一個分號。
>> 觀眾：所以對於班車PSET，我 認為當我做到了，一旦我點擊
瀏覽器，但沒有上來， 他們所謂的白頁。
但它是因為代碼。
我認為這是JavaScript的，對不對？
>> ROB BOWDEN：是啊。
>> 觀眾：請問這個錯誤 還是來了？
>> ROB BOWDEN：所以你就不會得到 這個錯誤，因為一切
從Web服務器的角度來看 是完全沒問題。
但你要求的index.html。
你要求shuttle.js 和service.js。
它能夠成功返回 給你所有這些事情 -
200。
確定。
只有當您的瀏覽器嘗試 解釋JavaScript代碼
這就像，等待，這是不 有效的JavaScript錯誤。
還有沒有其他問題？
好的。
>> DAVID J.馬蘭：那麼下一個 時間為11號。
和11是最可怕的 對於很多人。
所以最重要的事情需要注意 是，這是，事實上，大約
一個雙向鍊錶。
但是，這並不等同於去年的 雙向鍊錶的問題，
它沒有給你有條件的，就是 這個名單可以，其實是未排序。
>> 這樣一個事實，即列表是排序的 而事實上，這個詞是
有下劃線是為了傳達 這實際上是一種簡化
什麼否則會一直 更具挑戰性的問題
和一個較長的一個。
所以這裡一個常見的錯誤是已經把 您的最後一個年度的解決方案
尋呼機，然後就盲目地複製 跌的答案，這是正確的
回答不同的問題 類似的精神。
但這裡的微妙之處 分別如下。
>> 因此，一個，我們有一個節點，並宣布 在這裡以通常的方式來定義。
然後，我們定義列表是一個全球性的 指針初始化為null。
那麼顯然，有兩個功能 我們有原型在這裡，插入
並刪除。
然後，我們這裡有一些示例代碼 的做了一堆插入的。
然後，我們要求你完成 下面的實施刀片以這樣
一種方式，它插入n轉換成列表 在固定的時間，還強調，
即使已經存在。
>> 因此能夠插入美女 在常數時間是，它意味著
你必須插入 新的節點在哪裡？
到前面。
所以它消除了，幸運的是，至少 的過去需要一個案件
甚至更多的代碼行，像它那樣 去年，甚至在上課的時候我們
通過這種事情談 與人類和一些
語言偽代碼。
所以在這裡的解決方案，讓我們跳過 到只是為了有一個視覺上的
在屏幕上。
>> 請注意，我們正在做以下。
同時也注意到另一種簡化 是，即使是
已經存在的，所以這意味著即使 數已經是存在的，你可以
只是一味地插入另一 它的副本。
而這，太，本來是一個 簡化，這樣你可以
集中精力，說真的，一些比較 智力有趣的部分和
不只是一些額外的錯誤檢查 在有限的時間。
>> 所以在這個示例解決方案，我們分配 在左側的指針
這裡邊一個節點。
現在，認識到指針，如 羅布說，只有32位。
而實際上它並不包含 一個地址，直到你
分配給它的地址。
我們這樣做的右手 通過malloc的一面。
像一個好公民，我們檢查 malloc的是不是，事實上，空，從而使
我們不小心創建 這裡一個段錯誤。
任何時候你在生活中使用malloc，你 應檢查null，以免
你有一個微妙的錯誤。
>> 然後我們初始化由空 分配n和上一頁和下一頁。
而在這裡這種情況下，我初始化 以前為null，因為這個新的
節點將是新的 開始我的名單。
所以有將是 什麼才。
我想基本上追加 現有列表，由新的節點
接下來設置等於列表本身。
但我沒有這樣做，只是還沒有。
所以，如果列表本身已經存在， 並且有至少有一個節點
已經到位，如果是這樣的列表 在這裡，我插入一個新的節點在這裡，我
需要確保我的前任節點 向後指向我的新節點，
因為這是再一次 一個雙向鍊錶。
>> 所以我們做完整性檢查。
如果列表不為空，如果有已經 一個或多個節點存在，則
添加反向引用可以這麼說。
然後，我們需要的最後一件事 這樣做實際上是更新全局
變量列表本身為指向 到該新節點。
是啊。
>> 觀眾：在指針箭頭 [聽不清]等於null，即不
處理列表中，因為 該列表為空？
>> DAVID J.馬蘭：不。
這簡直是我正在積極 小心，因為如果這是我的
原來列表也許更多一些節點 在這裡，我插入我的
在這裡新的節點，還有的將 是什麼在這裡。
我希望捕獲的想法 通過設置前，以
在新節點上無效。
想必，如果我的代碼是正確的 並有插入沒有其他辦法
節點比這個功能以外， 據推測，即使列表已經有
在它的一個或多個節點，想必 列表中，在第一個節點，將具有
空本身先前的指針。
>> 觀眾：而就在跟進。
你把指針下一個等號的原因 列表是你正在做的指針
列表中，它的指向前 下一個，我猜 -
我鴕鳥政策 -
只是列出？
>> DAVID J.馬蘭：沒錯。
所以，讓我們真正考慮兩種情況 這裡真的，即使
訂單，我們會考慮他們是不是 不太一樣的代碼。
但在一個高的水平，如果該指 列表，這是一個32位的
指針，最簡單的情況是 這是默認為空。
並假設我想插入 數字50是一個數字。
所以我要繼續前進並分配 一個節點，它也會包含
三個領域 -
N，上一頁和下一頁。
>> 我打算把50號 在這裡，因為這會為n。
這將是下一個。
而這將是以前的。
所以我該怎麼在這種情況下呢？
好吧，我剛剛做1號線在這裡。
指針n得到Ñ。
我接著說，以前的 應該得到空。
因此，這將是空。
然後我會說下 是會得到列表。
>> 而這只是工作搞好。
這是空。
所以我說，新節點的下一個 字段應該得到什麼，這是。
讓把另一個空在那裡。
再過去的事情 我要做的就是在這裡檢查。
如果list不等於空，但它 等於空，所以我們跳過
乾脆。
等等一切我下一步要做的就是獲取列表 指針，它形象地導致
類似的圖片。
所以這是一個情景。
>> 和一個你問的是有關 具體是這樣的情況，
我們已經有一個單節點列表。
如果我回去了原 問題陳述，接下來我們將
插入說的是34，只為 就事論事。
所以我打算只方便 繪製在這裡。
我剛剛malloced。
假設我檢查null。
>> 現在，我要初始化 電量為34。
這將為n。
這將是下一個。
而這將是以前的。
讓我們確保我沒有 得到這個倒退。
上一頁至上 在該定義中。
讓我來解決這個問題。
這是以前的。
這是下一個。
儘管這些是相同的， 讓我們保持一致。
>> 上一頁。
這是下一個。
所以，我剛剛malloced我的注意，檢查 為null，則分配34到節點。
上一頁變空。
所以，讓我說。
下一步得到列表。
所以列表是這樣的。
所以這個現在是一樣的繪畫本 箭頭，使它們指向一個
中是相同的。
然後我檢查，如果列表 不等於空。
它不是這個時候。
那麼我該怎麼辦名單 先前得到的指針。
>> 所以列表上得到的PTR。
所以這把的效果 這裡的圖形箭頭。
這就是開始有點 波浪狀的線條。
然後，我最後更新 列出指向指針。
所以，現在這個指向這個傢伙。
現在，讓我們做一個快速 完整性檢查。
>> 這裡的名單，這是 全局變量。
第一個節點是，事實上，34，因為 我下面的箭頭。
這就是正確的，因為我想 插入在列表的開頭
所有新的節點。
他的下一場讓我這個傢伙。
如果我堅持下去，我打接下來為空。
所以沒有更多的列表。
如果我打以前，我得到 回到了我的期望。
>> 所以還是有幾個指針， 顯然，操縱。
但事實上，你被告知這樣做 這在常數時間內只意味著你
有一個事物的有限數目 你可以這樣做。
那是什麼號碼？
它可能是一個步驟。
這可能有兩個。
這可能是1000步。
但它是有限的，這意味著你不能 有什麼樣的循環的事
在這裡，沒有遞歸，沒有循環。
這只是必須是硬編碼線 的代碼，因為我們有這樣的樣本。
>> 所以接下來的問題12問我們 完成刪除的實現
下面以這樣一種方式，它消除 N從該列表中的線性時間。
所以，你必須多一點 現在迴旋的餘地。
你可以假設N，如果存在 在列表中，將存在
不超過一次。
而這也意味著是一個測驗為基礎的 簡化的假設，因此
如果你發現數字50的地方 在列表中，你不還
擔心繼續 遍歷，尋找一切可能的
50個拷貝，這將只是下放 為在有限的時間一些細節。
>> 因此，與刪除，這其中肯定 更具挑戰性和更
代碼編寫。
但乍一看，坦率地說，它可能 看起來喧賓奪主，喜歡的東西
有沒有辦法，你可以有 拿出了一個小測驗。
但是，如果我們專注於各個步驟， 希望，它會突然
打擊你，每個個體的 步驟做明顯的感覺
回想起來。
因此，讓我們一起來看看。
>> 因此，首先，我們初始化指針 是列表本身。
因為我想線性時間，那手段 我要去有一些循環。
和常見的方式來遍歷 在列表結構或任何種類的節點
結構的迭代是採取 一個指針的數據的前
結構，然後就開始更新 它和走你的路
通過該數據結構中。
所以我打算這樣做。
>> 雖然指針，我的臨時變量， 不等於空，讓我們
繼續和檢查。
難道我很幸運？
是我目前的節點n場 看著等於
數我在找？
如果是這樣，讓我們做一些事情。
現在，請注意這一點，如果條件 圍繞整個
代碼如下行。
這是我所關心的唯一的事情 - 發現了一些問題。
所以沒有其他人，從而簡化 概念上的東西一點點。
>> 但現在，我才明白，你可能有 只有思前想後意識到了這一點
它通過了一下，有 實際上2箱子這裡。
一種是其中的節點是在 開頭的列表，這是一個的
有點討厭，因為這是一個 特殊情況，因為你必須處理
有了這個東西，這 是唯一的異常。
放眼天下，列表， 這是同樣的事情。
有一個以前的節點和下一 節點，前一個節點，下一個節點。
不過這傢伙有點特殊 如果他是在開始。
>> 因此，如果該指針等於列表 本身，因此，如果我在初
列表中，我發現N，我需要 做了幾件事情。
一，我需要改變列表 指向下一個領域，50。
因此，假設我想 刪除34。
原來這傢伙的得走了 走一會兒就好了。
>> 所以我要說，列表 獲取指針下一個。
那麼，這是指針。
接著指向了這裡。
所以，這種情況正在改變這個箭頭向右 現在指向這個傢伙在這裡。
現在，請記住，我們有 一個臨時變量。
所以我們並沒有孤立的任何節點， 因為我也有這個傢伙在我
執行刪除的。
所以，現在，如果列表本身不為空， 我需要修復的一點心意。
>> 我現在需要確保這個箭頭， 這是先前指向
從50到34，這得走了， 因為如果我試圖擺脫
34，50，最好不要保留任何 一種反向引用它作為
箭頭提示。
所以，我只是做了這一行。
所以後來我做。
這種情況下，實際上是非常容易的。
斬去列表的頭部 相對來說比較簡單。
>> 遺憾的是，這 惱人的else塊。
所以，現在，我要考慮的情況下 那裡有什麼東西在中間。
但它不是太可怕了，除了 像這樣的語法。
所以，如果我不在的開始 名單，我在中間某個地方。
而這條線在這裡是說，開始 在任何節點你在。
前往上一個節點的下一個字段 並指出，在指針。
>> 讓我們做這樣形象地。
這是越來越複雜。
所以，如果我有一個以前的領域在這裡 - 讓我們做到這一點 - 下一個欄位在這裡。
我要簡化我的指針，而 比畫出一大堆
東西來回往返奔波 對方。
現在，讓我們只說這是1，2， 3為便於討論，甚至
雖然不與排隊 所討論的問題。
>> 因此，這裡是我的鏈接列表。
我想在此刪除兩個 特別版本的故事。
所以，我已經更新指針 是指向這個傢伙。
因此，這是PTR。
他指指點點。
這是列表，其中存在 作為全球前。
而且他指指點點不管。
而現在，我試圖刪除兩個。
>> 所以，如果指針指向這裡，我 要遵循，顯然，該
以前的指針，這使我在1。
我接著要說的話，下一個 場，這使我到這
框這裡，將要 平等的指針下一個。
因此，如果這個指針，這是下一個。
這意味著，該箭頭的需求 指向這個傢伙。
>> 那麼，這行代碼剛 所做的就是這一點。
而現在，這看起來像一個 步在正確的方向。
我們基本上要剪斷2出 的1和3的中間。
因此，它是有道理的，我們要 路線this指針周圍。
因此，這下一行檢查，如果指針 接下來是不是null，則
確實有人為2的右邊， 這意味著我們還必須做
這裡一點剪斷。
>> 所以，我現在需要遵循這個指針 和更新先前的指針
這傢伙做的一點點 解決辦法在這裡這裡的重點。
而現在，在視覺上，這是很好的。
這是一個有點凌亂在有 沒有人在2指點了。
2是指向左邊。
和圖2是指向右側。
但他可以做任何他想做的，因為 他即將得到釋放。
它什麼都無所謂 這些值了。
>> 最重要的是，剩餘的 傢伙上面的路由
現在他之下。
事實上，這正是我們下一步的行動。
我們免費的指針，這意味著我們告訴 操作系統，歡迎你
回收這一點。
然後最後，我們返回。
否則含蓄，如果我們 還沒有還回來，
我們必須繼續尋找。
所以指針等於next指針剛 這裡指移動這個傢伙。
搬到這裡這個傢伙。
這裡提出這個傢伙的話，其實， 我們沒有發現的數
我們正在尋找的呢。
>> 所以坦率地說，它看起來完全 鋪天蓋地，我認為，首先
一目了然，特別是如果你掙扎 與此測驗中則見
這樣的事情。
和你拍拍自己的背。
那麼，有沒有辦法，我能有 想出，關於測驗。
但我認為，你可以，如果你打破 它分解成這些個人
例，只是通過它走 小心，雖然，不可否認，在
壓力的情況下。
>> 值得慶幸的是，畫面製作 一切快樂。
你可以在此畫 任何數量的方式。
你不必做交叉的 這裡的事情。
你可以用直線做 線路是這樣的。
但這個問題的要點，在 一般情況下，是要認識到，在
圖片到底應該看起來有點 這樣的事情，因為
固定的時間暗示你保持 干擾與抗干擾和干擾的
在開始新的節點 的列表。
有問題嗎？
可能是最具挑戰性的 肯定是編碼的問題。
>> 觀眾：那麼類似於清單 在頭前面的例子。
>> DAVID J. MALAN：沒錯，沒錯。
只是不同的名稱 一個全局變量。
世界各地的什麼？
>> ROB BOWDEN：確定。
因此，這是一個在那裡你 不得不寫一段。
有些人撰寫的論文 對於這個問題。
但是，你只需要使用這六個條款 描述發生的事情時，
你嘗試聯繫facebook.com。
所以我就談談整個過程 使用所有這些條款。
所以在我們的瀏覽器，我們輸入facebook.com 然後按Enter鍵。
因此，我們的瀏覽器將構建一個 HTTP請求，它將會發送
通過一些過程的Facebook Facebook來與回應我們
它的HTML頁面。
>> 那麼，什麼是過程 該HTTP請求
實得到Facebook？
因此，首先我們需要翻譯 Facebook.com。
因此，只要給定的名稱Facebook.com， 其中實際執行HTTP請求
需要去？
因此，我們需要翻譯Facebook.com 到一個IP地址，它唯一
標識實際上是什麼，我們的機器 要將此請求發送到。
你的筆記本電腦都有一個IP地址。
任何連接到互聯網 有一個IP地址。
>> 所以DNS，域名系統，也就是 這是怎麼回事處理翻譯
從facebook.com到一個IP地址， 你其實是要聯繫。
所以我們聯繫了DNS服務器和 比如說，什麼是facebook.com？
它說，哦，它的IP地址190.212 什麼，什麼，什麼的。
好的。
現在，我知道什麼機器 我想聯繫。
>> 這樣的話你把你的HTTP請求 在該機器。
那麼它是怎樣得到那台機器？
好了，該請求會從 路由器到路由器的反彈。
請記住這個例子在課堂上，在那裡 我們居然看到了路由的
包了，當我們試圖 進行通信。
我們看到它跳過去的大西洋 海洋在一個點或什麼的。
>> 所以最後期限端口。
所以這是現在你的電腦上。
你可以有多個當前的事情 與互聯網通信。
這樣我就可以運行，例如，Skype公司。
我可能有一個Web瀏覽器中打開。
我可能有一些 torrenting文件。
因此，所有這些事情都 與通信
互聯網以某種方式。
>> 所以，當您的計算機接收的一些數據 從互聯網上，是怎麼做的
知道什麼是真正的應用 想要的數據？
它如何知道是否這個特殊的 數據，是為
torrenting應用程序，而不是 到web瀏覽器？
因此，這是在該端口的目的 所有這些應用都
要求您的計算機上的端口。
所以，你的網頁瀏覽器說，哎， 我正在偵聽端口1000。
和你的torrenting程序是在說， 我正在偵聽端口3000。
和Skype說，我使用的是端口4000。
>> 所以，當你得到一些數據屬於 一個這些應用程序，數據
標有哪個端口它實際上 沿途應該被發送。
所以這個說，哦，我是屬於 到端口1000。
我知道，那麼我就需要這個轉發 跟著我的網頁瀏覽器。
因此，它之所以與此有關 是Web服務器往往
偵聽端口80。
所以，當我聯繫Facebook.com，我 配有人機通信。
但我需要說的是哪個端口 機器我要與之通信。
和Web服務器往往是 偵聽端口80。
>> 如果他們想要的，他們可以將其設置 高達所以它會列出為端口7000。
然後在Web瀏覽器，我可以 手動輸入Facebook.com：7000
將請求發送到端口7000 Facebook的Web服務器。
>> DAVID J. MALAN：而且在這種情況下，即使 雖然我們沒有要求的人
提到這一點，在這種情況下，什麼端口 會的要求，其實去？
請再試一次。
沒錯。
不找了，但一個微妙 那有沒有最後一次。
>> ROB BOWDEN：所以HTTPS的，因為它是 聽專門為
加密的，它在端口4430。
>> 觀眾：和電子郵件是25吧？
>> DAVID J.馬蘭：出站 電子郵件，25，是的。
>> ROB BOWDEN：我什至不知道大多數的 的 - 所有的較低的往往是
對於保留的東西。
我覺得一切都在 1024被保留。
>> 觀眾：你為什麼說 3是打錯電話了？
>> ROB BOWDEN：因為在一個IP地址， 有四組數字。
並且他們是從0到255。
所以192.168.2.1是一種常見的 本地網絡的IP地址。
請注意，所有這些都小於255。
所以，當我開始用300，這 不可能有
一直是數字之一。
>> DAVID J.馬蘭：但是，這傻夾 從 - 這是CSI，在那裡他們有一個
數字太大 為IP地址。
>> ROB BOWDEN：本有問題嗎？
下一個，在如此徹底的改變 的話題，但是我們有這個PHP數組的
房子在四。
我們有一個無序列表。
我們想打印出每個列表項 只是含有的房子名字。
所以我們有一個foreach循環。
所以請記住，語法的foreach 數組作為項目的數組中。
因此，通過循環的每次迭代， 房子是要採取的一個
該數組內的值。
>> 在第一次迭代中，房子 將卡博特眾議院。
在第二次迭代，房子會 是快遞樓等。
因此，對於每一個為四家，我們是 只是要打印 -
你也可以呼應 -
列表項，然後房子的名字 然後關閉列表項。
花括號是可選的在這裡。
>> 然後我們又在這個問題說 本身，記得關閉
無序列表標記。
因此，我們需要退出PHP模式 為了做到這一點。
或者，我們也可以呼應 關閉無序列表標記。
>> DAVID J.馬蘭：精也將在這裡 一直使用舊的學校
循環使用$ I = 0，並使用計數 計算出射線的長度。
完全沒問題，只要 有點wordier。
>> 觀眾：所以，如果你要 [聽不清]，你會怎麼做 -
我忘記了環[聽不清]是什麼。
你會$四架我？
>> DAVID J.馬蘭：沒錯。
是的，沒錯。
>> ROB BOWDEN：還有別的嗎？
>> DAVID J.馬蘭：好的。
權衡。
因此，有答案的串 可以為每個這些。
我們真的只是尋找 對於一個顛倒和令人信服的東西
不利的一面。
和16號要求，驗證用戶的 輸入客戶端，使用JavaScript，
而不是服務器端，如使用PHP。
那麼什麼是一個顛倒 做客戶端？
>> 好了，我們提出的事情之一是 你減少等待時間，因為你
不必費心接觸 服務器，這可能需要幾分鐘
毫秒甚至幾秒鐘 通過避免和公正
驗證用戶的輸入客戶端通過 觸發的提交和處理程序
只是檢查，沒有他們的類型 在對名稱的東西？
難道他們輸入一些內容 在電子郵件地址？
難道他們從中選擇一個宿舍 下拉菜單？
>> 你可以給他們即時的反饋 使用千兆赫茲的電腦
或不管他們有那 其實自己的辦公桌上。
所以它只是一個更好的用戶 通常會遇到。
但在做客戶端的缺點 驗證，如果你這樣做也沒有
做服務器端驗證是 大多數人現身CS​​50都知道
你可以直接發送你想要的任何數據 到服務器任何數目的方式。
坦率地說，在幾乎所有的瀏覽器，你可以 單擊各地在設置和公正
關閉JavaScript，這會， 因此，禁止任何形式的
驗證。
>> 但您可能還記得，即使我 沒有使用類的一些神秘的東西
telnet和實際假裝 是一個瀏覽器通過發送GET
請求到服務器。
而這當然不是 使用任何JavaScript。
這只是我輸入命令 在一個鍵盤。
所以真的，足夠在任何程序員 舒適與Web和HTTP
可以發送任何數據，他或她想要的 到未經驗證的服務器。
如果你的服務器是不是也檢查， 沒有他們給我一個名字，是
這實際上是一個有效的電子郵件地址，做 他們選擇一個宿舍，你可能最終
向上插入偽造的或只是空白數據 進入你的數據庫，這可能
不會是一件好事，如果 你假設它在那裡。
>> 所以這是一個惱人的現實。
但在一般情況下，客戶端 驗證是很大的。
但它意味著兩倍的工作。
雖然確實存在各 庫的JavaScript庫
例如，使這麼多， 更不用說頭痛。
並且可以重複使用一些代碼 服務器端，客戶端。
但一定要明白，這是典型的 額外的工作。
是啊。
>> 觀眾：所以，如果我們只是 說不太安全 -
>> DAVID J.馬蘭：[笑]
唉。
那些總是更難 那些作出裁決。
>> ROB BOWDEN：那倒 已被接受。
>> DAVID J.馬蘭：什麼？
>> ROB BOWDEN：我創造了這個問題。
這將被接受。
>> DAVID J.馬蘭：是啊。
>> 觀眾：酷。
>> ROB BOWDEN：但我們不接受 第1 -
好了，我們要找的是 像你不必
與服務器通信。
我們不接受只是速度更快。
>> 觀眾：怎麼樣 不重新加載頁面？
>> ROB BOWDEN：是的。
這是一個公認的答案。
>> DAVID J.馬蘭：凡是我們認為 它比不太可能更容易
你知道你是什麼 說，這是一個艱難的
有時行畫。
使用鏈接列表，而不是 陣列保持的
排序的整數列表。
所以，一個顛倒，我們經常引用與鏈接 這促使他們的整個列表
引入是你的活力。
他們可以成長。
他們可以收縮。
所以，你不必赴湯蹈火 實際創建更多的內存
與陣列。
或者你也不必只 說，對不起，用戶。
陣列被充滿。
列表中的那麼強勁增長。
雖然鍊錶的缺點？
>> 觀眾：它是線性的。
搜索關於鍊錶是線性的 而不是你登錄。
>> DAVID J.馬蘭：沒錯。
上搜索一個鍊錶是線性的， 即使它的排序，因為你可以
只有遵循這些麵包屑，這些 指針，從列表的開始
到結束。
你不能利用隨機訪問和， 因而，二進制搜索，即使它是
排序，您可以 做的一個數組。
還有還有另一個代價。
是啊。
>> 觀眾：內存效率低下？
>> DAVID J.馬蘭：是啊。
好吧，我不一定會 說效率低下。
但它確實花費你更多的內存， 因為你需要32位，每
節點為額外的指針，在 至少一個單向鍊錶。
現在，如果你只是存儲整數， 您要添加的指針，這是
種不平凡的實際。
這是加倍的內存量。
但在現實中，如果你存儲一個 可能有結構的鍊錶
8字節，16字節，甚至更 重要的是，也許是少
的邊際成本。
但它的成本仍然。
因此，無論是那些已經會 被罰款的缺點。
>> 18。
使用PHP，而非C + +寫 一個命令行程序。
所以在這裡，它往往更快的使用 如PHP或Ruby或Python語言。
你只是迅速打開 一個文本編輯器。
你有更多的功能 提供給您。
PHP有功能的廚房水槽， 而在C中，你
有非常，非常小。
事實上，傢伙知道硬盤的方式 那你沒有哈希表。
你不用鍊錶。
如果你想這些，你必須 實現它們自己。
>> PHP的這麼一顛倒或任何真正 解釋型語言是快速性
使用它可以編寫代碼。
但不利的一面，我們看到這個的時候我 迅速刮起了miss​​peller
使用PHP在講座的實施，是 在使用一種解釋語言
通常比較慢。
而且我們看到，明確與 0.3秒的時間增加至3
秒，因為該解釋， 實際發生的情況。
>> 另一個上攻是你 不必編譯。
因此，它也加快了發展 順便說一句，因為你沒有
兩個步驟來運行的程序。
你只有一個。
所以這是相當 引人注目的為好。
使用SQL數據庫，而不是 CSV文件來存儲數據。
因此SQL數據庫用於pset7。
CSV文件你沒有使用太多。
但是你用它間接pset7為 以及通過交談雅虎財經。
>> 但CSV就像一個Excel文件，但 超級簡單，這裡的列
只是劃出由內而外逗號 否則一個文本文件中。
並使用SQL數據庫 多了幾分吸引力。
這是一個顛倒的，因為你得到的東西 像選擇並插入和刪除。
你會得到，據推測，該索引 MySQL和其他數據庫一樣，
甲骨文在內存中建立你的，這 意味著你的選擇可能是不
將是線性從上到下。
它實際上將是什麼 像二進制搜索什麼
類似的精神。
所以他們普遍較快。
>> 但缺點是， 它只是更多的工作。
這是更多的努力。
你必須了解數據庫。
你必須設置它。
你需要一個服務器來運行 該數據庫。
你需要了解 如何配置它。
所以這些都只是這些 各種權衡。
而一個CSV文件，你可以 用gedit創建它。
和你去好。
有沒有超出複雜性。
>> 用trie樹代替了哈希表 有獨立的鏈接來存儲
話讓人想起字典 的pset5。
所以試圖上攻，在理論上 至少，是什麼呢？
固定的時間，至少如果你是 散列上每個單獨的
字母詞，像你 可能對pset5。
這可能是五哈希，六 哈希值，如果有五六個
字母的單詞。
並就不錯了。
如果有一個上限如何 長你的話可能是，這是
的確漸近常數時間。
>> 而具有獨立的哈希表 鏈，問題出在那裡與
樣的數據結構是 你的算法的性能通常
取決於事物的數量 已經在該數據結構中。
而這肯定與案件 鏈，從而使更多的東西你把
到哈希表中，這些長 鏈去，這意味著在最壞
情況下，你可能會尋找的東西 是所有的方式在一個的端
那些枷鎖，有效的 轉予弄成線性的。
>> 現在，在實踐中，它可能完全 這樣的話，與一個哈希表
鏈是比相應的快 特里實施。
但是，這是由於各種原因，其中 這是嘗試使用了一大堆
內存可以，其實，慢的東西 下來，因為你沒有得到很好的
一種叫做緩存的好處， 那裡的東西都是靠在一起
在存儲器中可被訪問。 往往更快。
有時你能想出 一個真正好的哈希函數。
即使你有浪費一點 內存，則可能確實，能夠
找東西快速而且效果不 那樣糟糕線性。
>> 因此，在短，存在不一定是 與上述任何一種或兩種的
我們正在尋找具體的事情。
真的什麼說服力 作為上行和下行
一般吸引了我們的眼球。
>> ROB BOWDEN：所以對於上升空間，我們做 不接受它自己的“更快”。您
不得不說一些事情。
即使你更快地從理論上說， 我們知道那種你明白
它的0 1。
及哈希表，從理論上講， 不為0的1。
提及在運行什麼 一般把你的分。
但“快”，大部分的解決方案上 大板，分別是嘗試
客觀上比慢的解決方案 這是哈希表。
所以更快本身並 是不是真的。
>> DAVID J.馬蘭：DOM德DOM DOM。
我可能是唯一一個實現 這是怎麼說的應該
發音，對不對？
>> ROB BOWDEN：我居然不知道。
>> DAVID J.馬蘭：這讓 感覺在我的頭上。
>> ROB BOWDEN：我做這一個。
確定。
因此，這是一個在那裡你不得不動用 類似於你的圖可能
看到過去的考試。
所以，就讓我們看看這個。
所以從HTML節點，我們有兩個 兒童的頭部和主體。
因此，我們分支 - 頭部和身體。
頭部有一個標題標籤。
因此，我們有一個標題。
>> 現在，有一件事很多人 忘了的是，這些文本節點
此樹中的元素。
所以在這裡我們碰巧吸引他們為橢圓形 從這些區分它們
類型的節點。
但公告同時在這裡我們有頂， 中部和底部最終會被
文本節點。
所以，忘記那些有點 一個常見的錯誤。
>> 人體有三個孩子 - 這三個div的。
所以格，格，格，然後在文本 這些div的子節點。
這幾乎是它 該問題。
>> DAVID J.馬蘭：而且這是值得注意的， 儘管我們不會對這些糾纏
在我們花費的時間細節 JavaScript中，該命令呢，
事實上，無論在技術上。
所以，如果頭自帶的身體之前，在 HTML，那麼它應該出現在
在實際的DOM離開身體。
他是，在一般情況下，剛剛僅供參考， 一些所謂的文檔順序，其中
這非常重要。
如果你正在實施一個解析器， 一個程序，在建築讀取HTML
在內存中的樹，說實話， 這就是直覺可能是你
無論如何做 - 從上到下， 左到右。
>> ROB BOWDEN：該問題？
我應該做的下一個？
>> DAVID J.馬蘭：當然可以。
>> ROB BOWDEN：確定。
因此，這是緩衝區溢出 攻擊的問題。
最主要的是要在這裡認識的是， 好了，怎麼可能一個對手絕招
這個程序到執行 任意代碼？
所以argv1，第一個命令行 參數傳遞給這個程序，那可以是
任意長。
但在這裡，我們用memcpy複製 argv1，在這裡是酒吧。
我們把它當作參數。
所以它採取的名字吧。
>> 因此，我們memcpying吧 這個緩衝液C。
我們有多少字節複製？
然而，良好的字節酒吧恰好 可以使用，這樣的說法的長度。
但c是只有12個字節寬。
因此，如果我們輸入命令行參數 這比12個字節長，我們
將這個溢出 特定的緩衝區。
現在，怎麼可能對手的絕招 程序執行任意代碼？
>> 所以請記住，在這裡 主要是調用foo。
所以當時主要調用foo。
讓我們得出這樣的。
因此，我們有我們的堆棧。
與主有一個堆棧幀 在底部。
在某些時候，主要調用foo。
好了，馬上，主要調用foo。
所以富都有自己的堆棧幀。
>> 現在，在某些時候，富 將要返回。
又走了foo返回了，我們需要知道在 哪些代碼主要我們的內線
是為了知道在哪裡 我們應該恢復在主。
我們可以從整個調用foo 一堆不同的地方。
我們怎麼知道從哪裡回來？
好了，我們需要存儲在某個地方。
>> 所以，正確的地方在這裡，我們存儲 在這裡我們還是要回到曾經
富回報。
這是返回地址。
因此，如何對手可能利用 的是這樣的事實，即
這個緩衝區C存放，讓我們 說，就在這裡為c。
因此，我們已經有了12個字節對於C。
這是C。
這是Foo的堆棧環。
因此，如果惡意用戶輸入更多 超過12字節或者輸入命令
行參數，這比12再 字符，那麼我們要
溢出這個緩衝區。
>> 我們可以繼續下去。
在某些時候，我們走多遠 夠了，我們開始
這個覆蓋返回地址。
所以一旦我們覆蓋返回地址， 這意味著，當富
返回時，我們返回的地方 惡意用戶告訴它
任何值它進入，以任何 字符的用戶輸入。
所以，如果惡意用戶正在 特別聰明，他能有這樣的
返回到某處printDef 功能或某處的malloc
功能，只要在任何地方隨心所欲。
>> 但更巧的是什麼，如果他有 用戶返回到這裡。
然後你開始執行 由於這些代碼行。
所以在這一點上，用戶可以輸入 任何他想要進入這一地區。
他有完全的控制 在你的計劃。
該問題？
因此，接下來的問題是完全的 富的以這樣的方式重新實現
它不再是脆弱的。
>> 因此，有幾種方法 你可以這樣做。
我們還有C只 是長度為12。
你可以改變這 作為解決方案的一部分。
我們還增加了一個檢查，以 確保酒吧是不是null。
雖然你並不需要 對於全額貸款。
因此，我們先檢查 酒吧的字符串的長度。
如果是大於12，則 實際上不做副本。
所以這就是修復它的方法之一。
>> 固定它的另一種方式是代替 有C只是長度為12，擁有它
是長度函數strlen（巴）。
固定它的另一種方式是 實際上只是返回。
所以，如果你剛剛擺脫了所有的 這一點，如果你剛剛刪除了所有
行代碼，你會得到 全額貸款，因為該功能
實際上並沒有完成任何事情。
它的複製命令行 參數為一些陣列
它的棧幀。
然後事情就是返回。
此外，無論它成功的走了。
所以回報也足夠 獲得全部學分的方式。
>> DAVID J.馬蘭：不太精神 這個問題，但每可接受
規格書號仍然。
>> ROB BOWDEN：在任何的問題？
有一件事，你至少 需要已編譯代碼。
因此，即使在技術上你是不是 脆弱的，如果您的代碼不
編譯，我們不接受。
沒有問題？
確定。
>> DAVID J.馬蘭：你想 說這個稱號？
>> ROB BOWDEN：號
>> DAVID J.馬蘭：所以在這一塊，這 無論是好消息還是壞消息。
這是字面上相同的問題 作為第一次測驗。
而且它幾乎是相同的 問題是PSET1。
但它被刻意簡化為 一個更簡單的金字塔，一個可
解決了用微 簡單的迭代。
真的，我們都拿到在 這裡是沒有那麼多的邏輯，
大概是因為，通過這一點，你 比你更舒適
在一個用for循環或循環為什麼一周， 但真正捉弄除了那
你有點舒服的 概念，PHP是不只是什麼
編程。
它實際上可以被用來作為一種語言 寫命令行程序。
>> 事實上，這正是我們試圖 提請你注意。
這是一個PHP命令行程序。
因此，這裡的C代碼，而正確的 在C中，不正確的PHP。
但是代碼確實是相同的。
如果你比較對測驗的解決方案 0反對測驗1，你會發現，
它幾乎是相同的，除了 一些美元符號和對
缺少數據類型。
特別是，如果我們看看這裡， 你會看到，我們遍歷，在這
情況下，從1到7。
>> 我們可以做它0指數。
但有時候，我認為這只是 精神上更容易思考的東西
從1到7。
如果你想有一個街區，然後兩個 塊，然後三，然後
點，點，點7。
我們已經j為初始化為1 然後指望達我。
而這裡的一切 否則相同。
但值得注意的是 一對夫婦的事情。
我們給你這兩條線，這首 1，goofily命名為家當
對於尖銳的爆炸。
而這只是指定的路徑中， 文件夾，在其中一個程序可以
發現要使用 解釋這個文件。
>> 和隨後的線路之後， 當然，是指進入PHP模式。
和線在最底層 表示退出PHP模式。
而這個工程，在一般情況下，與 解釋型語言。
這有點惱人，如果你寫了一個 計劃在一個名為foo.php文件。
然後你的用戶要的只是 記住，好了，運行這個程序，我
必須輸入“php空間foo.php。”樣 惱人的，如果沒有別的。
同時也表明你的程序 是用PHP編寫的，這是不是所有的
該照射的用戶。
>> 這樣你就可以完全消除。PHP 從講座召回。
而你實際上可以做。/ foo的，如果 你通過使已經chmodded它
可執行文件。
因此存取權限chmod a + X富會做的。
如果你也在這裡添加家當。
不過說真的，這個問題是越來越在 打印出這樣的事情。
沒有HTML，沒有C代碼肯定， 只是一些PHP。
所以米洛然後在問題25返回。
而在25日，你被賦予以下 框架代碼，這是一個
很簡單的網頁。
而多汁部分的HTML明智下跌 這裡，我們有身體的內部
具有輸入唯一ID的形式 其內部是兩個輸入，一個
同的名稱，1的想法 與按鈕的想法。
>> 第一個是文本類型的 類型的第二提交。
因此，我們給了你，其實，更 比你需要的，只是這樣的成分
你們有選擇與 來解決這個問題。
你並不需要嚴格 所有這些ID的。
但它可以讓你解決 它以不同的方式。
並在頂部，注意 的目的是為了觸發
像這樣的窗口 -
您好，米洛！ -
使用彈出的瀏覽器 超級簡單，如果
不醜，報警功能。
所以，最終，這歸結 概念以某種方式監聽
表單的客戶端提交的材料 ，而不是服務器端的，不知何故
要答复意見書 抓住用戶鍵入的值
在Name字段，然後 在警告的正文中顯示它。
>> 所以，你可以做到這一點的方法之一是用 jQuery的，看起來有點
語法傻了眼在第一。
為此，您可以用純DOM代碼 - 通過ID document.getelement。
但是，讓我們來看看這個版本。
我有幾個重要的 行第一。
這麼一句，我們這行，這是 相同的你可能已經看到
在，我相信，form2.html 從類中第9週。
這只是說，執行 下面的代碼時，
該文件已準備就緒。
這是重要的，因為只有 HTML頁面頂部讀
底，左到右。
>> 因此，如果你嘗試做 東西在這兒代碼在一定的DOM
元素，一些HTML標籤，這就是下降 在這裡，你這樣做為時過早，
因為這並沒有什 被讀入內存。
所以說這樣的document.ready 行，我們在說，
這裡的一些代碼，瀏覽器。
但不執行此操作，直到整個 文檔準備好，即在DOM
樹存在於內存中。
這一個是多一點 直截了當，如果一個語法
有點不同，這裡我說的，搶 在HTML元素，其獨特的
標識符輸入。
這就是散列標籤 表示，唯一ID。
然後我打電話。提交。
>> 因此，這裡提出的是一個函數，否則 已知作為一種方法，這就是
在左側的對象的內 一邊有，我沒有強調。
所以，如果你想輸入作為一個對象 在內存中 - 實際上它是。
這是在一個樹中的節點 -
。提交的手段時，這種形式與 這個ID被提交後，執行
下面的代碼。
我不在乎什麼的名字 功能是我執行。
所以在這裡我使用的，和以前一樣，有什麼 被稱為lambda函數或
匿名函數。
它不是在所有智力 有趣以外它沒有名字，
這是好的，如果你只 永遠要調用它一次。
裡邊有我真正處理 提交表單。
我首先聲明一個變量 所謂的價值。
然後這個是什麼效果 這裡突出部分嗎？
這是什麼做的一 高層給我嗎？
>> 觀眾：它得到的值的 用戶在下面的HTML沒有。
它得到的ID，然後 發現它的價值。
>> DAVID J.馬蘭：沒錯。
它抓住節點，其獨特的 標識符名稱。
它得到了其中的價值，這 是，據推測，什麼樣的用戶
鍵入他或她自己。
然後將其存儲在該 變量稱為價值。
順便說一句，你可以有也 這樣做有點不同。
通過做一些完全可以接受 謊言無功值變
的document.getElementById。
這就是為什麼它是一個小 乏味，不使用jQuery的。
“名”。值。
所以完全可以接受的。
不同的方法來做到這一點。 jQuery的剛 往往是多了幾分簡潔和
肯定更受歡迎 間的程序員。
>> 現在，我正在做一個有點理智的 檢查一下，因為在這個問題
聲明中我們明確地說，如果 用戶尚未鍵入他或她的
名，不顯示一個警報。
但你可以檢查，通過剛 檢查一個空字符串
報價引文結束，如果有 什麼居然還有。
但如果它不等於報價引文結束， 我想打電話報警。
這裡最有趣的部分是， 我們使用加運算符，
在JavaScript中做什麼？
串連。
所以它就像PHPS點運算符。
同樣的想法，稍有不同的語法。
而我只是在創建字符串 你看到了屏幕截圖 -
您好，某某。
>> 然後最後的細節是這樣的。
為什麼我返回false內 這個匿名函數？
>> 觀眾：有沒有價值。
你把它的形式。
它只是說，如果值不 等於空白，然後再去做。
有在提交的一項空白。
>> DAVID J.馬蘭：確定。
小心，雖然。
有沒有一個人在這裡。
並且返回false是外 的if條件。
因此，這突出顯示的行，返回false， 執行不管是什麼時候
表單被提交。
什麼是回國這裡面的假 事件處理程序，因為它叫，
在有關活動 被提交？
>> 觀眾：因為它 只發生一次。
>> DAVID J.馬蘭：只發生一次。
不完全是。
是嗎？
>> 觀眾：它防止表單 提交到默認的行為，
這樣就會使頁面重載。
>> DAVID J.馬蘭：沒錯。
所以我對超載提交一詞在這裡， 因為我說的，形式是
提交。
但如你所說，它實際上不是 在提交的真實的HTTP方法被。
當您點擊提交，因為，我們的 onsubmit處理，我們正在攔截
該表單提交可以這麼說。
我們然後做我們的事 與JavaScript代碼。
但我故意返回false， 因為我不希望發生的一
一瞬間之後，是為整個表格 本身提交到網上
服務器與鍵值對通過改變 是類似的URL
Q =貓，或任何我們所做的， 例如，在課堂上。
我不希望這樣的事情發生，因為 有沒有這個問題的服務器監聽
表單提交。
這是純粹的JavaScript代碼完成。
這就是為什麼我什至沒有一個 action屬性的窗體上，因為我
沒有為這個打算 曾經去到服務器。
>> 因此，它被提交。
但是我們截取該表單 提交並防止默認
的行為，這是實際 走一路到服務器。
>> 觀眾：所以保持它的客戶端。
>> DAVID J.馬蘭：保持 它的客戶端。
完全正確。
接下來是我的哦MySQL的。
>> ROB BOWDEN：確定。
所以這第一個問題通常是 粗糙的人。
雖然後來者去更好。
所以，你必須選擇正確的數據 類型這兩個列。
和這兩個有一定 關於他們的事情，
做出選擇很難。
所以整數是不是一個有效的 鍵入數字。
究其原因是一個12位帳號 數，一個int是不是足夠大的
存儲總位數。
因此，一個有效的選擇將是一個很大的 如果你碰巧知道INT。
另一種選擇可能是 長度12的字符字段。
因此，無論是那些會工作。
詮釋不會。
>> 現在，平衡，回想著pset7。
所以我們專門用於十進制 儲存的股份或價值 -
>> DAVID J.馬蘭：現金。
>> ROB BOWDEN：現金。
我們使用十進位存儲量 現金用戶目前擁有。
所以我們這樣做的原因是 因為，記住，浮在水上。
有沒有在精度浮點。
它不能精確地存儲的現金 像我們想要的值在這裡。
所以，十進制是能夠精確地存儲 東西，說，小數點後兩位。
這就是為什麼平衡，我們希望它 為十進制數，而不是浮動。
>> DAVID J.馬蘭：此外，他也一樣，雖然 它可能在其他被聰明
上下文去思考，也許這 是一個int的機會。
我就繼續跟踪 事情便士。
因為我們明確地顯示了默認 的是100.00，值
意味著它可能僅僅是一個int。
而另一個微妙過與數 是，這並不意味著
是一個棘手的問題。
但記得，在MySQL的一個int， 像在C中，至少在
家電，是32位的。
而且即使我們不指望你來 確切地知道有多少位數的
手段，千萬記得最多 你可以代表可能
一個32位數字大致是怎樣的？
>> 什麼號碼我們老是說什麼？
2至32，這是大約？
你不必知道準確。
但大致是在生活中有所幫助。
這是約4十億。
因此，我們說了幾次。
我知道我已經說過，幾十倍。
它是約4十億。
這就是一個很好的規則 拇指就知道了。
如果你有8位，256 是一個神奇的數字。
如果你有32位，4 十億給予或採取。
所以，如果你只寫下跌4十億， 你會看到它的位數少於
12，表示這顯然不 夠表現來捕獲
12位帳號。
>> ROB BOWDEN：確定。
所以其他的人去比較好。
因此，假設銀行 規定了每月20元
維修收費標準上的所有帳戶。
用什麼SQL查詢可以在銀行 從每一個計數中扣除20元，就算
它會導致一些負面的餘額？
因此，基本上，有四個 查詢的主要類型 -
插入，選擇，更新和刪除。
那麼，我們認為我們 要在這裡使用？
更新。
>> 因此，讓我們一起來看看。
所以在這裡，我們要更新。
我們要更新什麼表帳戶？
所以更新賬戶。
然後語法說什麼 帳戶被我們更新？
好了，我們設置的平衡等於 餘額減去20的電流值。
因此，這將更新所有行 帳戶，減去
20美元的餘額。
>> DAVID J.馬蘭：這裡一個常見的錯誤， 即使我們有時會原諒它，
是實際上這裡有PHP代碼 調用查詢功能，或將
周圍的一切引號的 並不需要在那裡。
>> ROB BOWDEN：請記住，MySQL是 從PHP一個獨立的語言。
我們碰巧在PHP中要編寫的MySQL。
和PHP，然後送它 在MySQL服務器。
但你不為了需要使用PHP 與MySQL服務器進行通信。
>> DAVID J.馬蘭：沒錯。
所以沒有帶美元符號變量 應於該上下文。
它可以做所有的數學 在數據庫本身。
>> ROB BOWDEN：確定。
所以，下一個。
這是下一個？
是啊。
所以用什麼SQL查詢可以在銀行 其檢索的帳號
最豐富的客戶，那些與 餘額大於1,000？
所以這四個主要類型 我們要在這裡想要什麼？
選擇。
所以，我們要選擇。
我們究竟要選擇？
我們想要怎樣欄選擇？
我們會特別希望 選擇號碼。
但是，如果你說的明星，我們 也接受這一點。
>> 那麼從什麼表中選擇號碼？
帳戶。
然後條件，我們想要的嗎？
凡結餘超過1000人。
我們也接受更大 小於或等於。
最後一個。
用什麼SQL查詢可以在銀行 接近，即刪除每一個帳戶
有$ 0的平衡？
因此，這四個是我們 會想使用？
刪除。
所以，語法是什麼？
從什麼表中刪除？
帳戶。
然後在其上的條件 我們想刪除 -
其中平衡等於零。
因此，從賬戶中刪除所有行 當餘額為零。
對上述任何一個問題？
要排隊？
>> DAVID J.馬蘭：隊列指南。
所以在這一塊，我們給你一個有點 熟悉的結構，我們探索出了
在課堂位旁邊的結構， 這是一個數據
結構中的精神有關。
雖然與隊列的區別是 我們必須以某種方式記得是誰
是在隊列的前面，在大 一部分這樣我們就可以賺更多
有效地使用存儲器，至少 如果我們用一個數組。
>> 因為召回，如果我們有一個數組，如果， 舉例來說，這是前部
隊列中，如果我進入隊列這裡， 然後有人得到一致
我，在我身後，在我身後，後面 一個人走出行，你
可以，因為我們看到了一些我們人類的 在課堂的志願者，讓每個人都
轉向這種方式。
但在一般情況下，大家有做 自己是不是時間的最佳利用
在程序中，因為這意味著你的 算法在運行什麼
漸近運行時間？
它是線性的。
>> 我覺得這是種愚蠢的。
如果下一人行是下一個 人誰的應該進入
商店，他們不都 一起移動。
只是讓那人被人拔光了 在時機成熟時，例如。
這樣既可以節省一點時間在那裡。
所以要做到這一點，那就是說 該隊列的頭部或
該隊列的前面是要 逐步移動越陷越深
到陣列中，並最終可能 實際上環繞，如果我們使用的是
數組來存儲人 在此隊列中。
所以你幾乎可以想到的 數組作為循環數據
結構在這個意義上。
>> 所以，你無論如何都必須跟踪的 它的大小或它的真正結束
然後在那裡它的開始是。
因此，我們建議您聲明 一個這樣的隊列，呼叫
它Q，只是一個字母。
然後，我們建議把前面是 初始化為零，並且大小
初始化為零。
>> 所以現在，沒有什麼 裡面的那個隊列。
我們要求你完成 在下面執行的入隊
這樣一種方式，該函數將n到 q的末尾，然後返回true。
但是，如果q是滿的或負的，本 函數應該改為返回false。
我們給你一對夫婦 假設。
但他們並不是真正的功能 相關的，剛才那布爾存在，
因為，從技術上講，布爾不 存在於C，除非你有一個
某些頭文件。
所以這只是確保有 沒有了這是一招
問題之類的話。
>> 所以排隊，我們的樣本中提出的 解決方案來實現，如下所示。
一，我們首先檢查方便， 低懸的果實。
如果隊列已滿或數 你試圖插入小於
大於零，這是我們在所述 規範的問題應
不會被允許的，因為我們只想要 非負值，那麼你應該
只是立即返回false。
因此，一些相對容易 錯誤檢查。
如果你雖然想補充的是，實際 號，你不得不做一點
想在這裡。
而這正是它是一個有點討厭 弱智，因為你必須
弄清楚如何處理環繞。
>> 但這個想法的萌芽在這裡，是的 我們感興趣的是，環繞
往往意味著模運算和 mod運算符，百分比方面，
在那裡你可以從一個較大的值 回零，然後一個及兩個
3，然後繞回至零， 1和2和3等
一遍又一遍。
因此，我們建議這樣做的方法是 那不是我們不想索引到
陣列被叫號碼所在 我們的整數說謊。
但到那裡，我們首先想要做的 無論隊列的大小是但
然後添加到無論 在列表的前面是。
和其效果是把我們 在隊列中合適的位置和
不要以為在線路的第一人 是在開始時，他或
她絕對可以，如果我們 也被轉移大家。
但我們只是創建工作 為了我們自己，如果我們把
該特定路徑。
>> 所以我們可以保持它相對簡單。
我們必須記住，我們只是 添加一個int到隊列中。
然後我們就返回true。
同時，在出隊，我們問 你要做到以下幾點。
實現它以這樣一種方式，它 出隊，那就是移除並返回，
整型在隊列的前面。
要取出整數，它滿足 忘記它。
你並不需要覆蓋其位。
因此，它實際上仍然存在。
就像一個硬盤上的數據， 我們只是忽略了一個事實
它現在在那裡。
而如果q是空的，我們應該 而不是返回負1。
所以這種感覺隨心所欲。
為什麼返回負1 而不是假的？
是啊。
>> 觀眾：Q被存儲 正值。
既然你只存儲正值 在第q，負是一個錯誤。
>> DAVID J. MALAN：好，真的。
所以，因為我們只存儲正 值或者為零，那麼它的罰款
返回一個負的值作為定點 值，特殊符號。
但你重寫歷史上​​， 因為我們是唯一的原因
返回非負值 是因為我們要
有一個標記值。
所以，更確切地說，為什麼不乾脆 在錯誤的情況下返回假的？
是啊。
>> 觀眾：你已經失敗 返回一個整數。
>> DAVID J.馬蘭：沒錯。
這就是其中C得到 漂亮的制約。
如果你說你要去 返回一個int，你有
返回一個int。
你不能花哨，並開始返回 一個bool或浮或
字符串或類似的東西。
現在，與此同時，JavaScript和PHP和 其他一些語言可以，其實，
你有不同的返回 類型的值。
而這實際上是有用的，其中 你可以返回正整數，零，
負整數，或虛假或無效 甚至表示錯誤。
但是，我們沒有這方面的 多功能性C.
>> 因此，與出隊，我們什麼 建議做的是 -
>> ROB BOWDEN：你可以返回false。
這只是虛假的散列 定義虛假為零。
所以，如果你返回false， 你返回零。
零是一個有效的事情在我們的隊列中， 而負1是不是如果
假正好是負1。
但你應該甚至不 需要知道。
>> DAVID J.馬蘭：這是 為什麼我沒有說出來。
>> ROB BOWDEN：但它是不是真的 你不能返回false。
>> DAVID J.馬蘭：當然可以。
所以出隊，發現我們接受 喪失作為它的參數。
那是因為我們不是 遞東西英寸
我們只是要移除的元素 在隊列的前面。
那麼我們如何能夠去這樣做？
嗯，首先，讓我們這樣做 快速完整性檢查。
如果隊列大小為0，有 沒有工作要做。
返回負1。
Done（完成）。
所以這是我的程序幾行。
因此，只有四行依然存在。
>> 所以在這裡我決定遞減 的大小。
並有效地遞減的大小 也就是說，我忘了
東西就在那裡。
但我也有更新的地方 數字的前面是。
因此，要做到這一點，我需要 做兩件事情。
我首先需要記住的數量 是在該隊列的前面，
因為我需要返回那個東西。
所以我不想忘記意外 關於它，然後覆蓋它。
我只是要記得在一個int。
>> 而現在，我要更新 q.front被q.front +1。
因此，如果這是在第一人稱 行，現在，我想要做加1
指向下一個人行。
但是，我必須處理迴繞。
如果能力是一個全局常量， 那將讓我確定
當我點到最後的人 線，該模運算將帶來
我回零的 前面的隊列。
而且這裡處理環繞。
然後我繼續返回否。
>> 現在，嚴格地說，我沒有 必須聲明ñ。
我沒有抓住它並將其存儲 是暫時的，因為該值是
仍然存在。
所以我只能做正確的算術 返回前負責人
隊列。
但我只是覺得這是更清晰 實際上搶整數，把它
以n，然後返回 為清晰起見，但
不是嚴格必要的。
噓。
他們都是發音的在我的腦海。
>> ROB BOWDEN：所以第一個問題 是二叉樹的問題。
所以，第一個問題是，我們是 考慮到這些數字。
我們希望以某種方式將它們插入到 這些節點，例如，它是一個
有效的二叉搜索樹。
所以，有一點要記住的 二叉搜索樹是它的不
剛才說的事情向左移 少與事
右邊是更大的。
它需要整個樹 左邊是更小，並且在整個樹
向右更大。
>> 所以，如果我把34在此間舉行的頂部，然後 我把20在這裡，所以這是有效的，
到目前為止，因為34在這裡。
20是要在左邊​​。
所以這是少。
但我不能再放入59在這裡，因為 儘管圖59是對20的右側，
它仍然在34的左邊。
因此，在這該約束時， 大概解決這個最簡單的方法
問題是，只是排序 這些數字 -
所以20，34，36，52，59，106。
然後將這些 從左至右。
>> 所以20放在這裡。
34放在這裡。
36放在這裡。
52，59，106。
你也可以想通了與 有些堵塞和實現，
哦，等一下，我沒有足夠的數字 填補這個在在這裡。
所以我需要reshift我什麼 路線音符將是。
但是請注意，在最後三，如果 你讀從左至右，它是在
遞增的順序。
>> 所以，現在，我們想聲明的是什麼 結構將是為
在這棵樹的節點。
所以，我們需要在一個二叉樹是什麼？
因此，我們有類型的值 整型，所以一些int值。
我不知道我們所謂的 它在溶液中 -
INT N。
我們需要一個指向左邊的孩子 和一個指向右邊的孩子。
所以它會看起來像這樣。
它會實際上看前 什麼時候的雙向鏈接
列表的東西，所以通知 -
我將不得不滾動所有 方法回落到問題11。
>> 所以發現它看起來相同這一點， 除了我們只是碰巧調用這些
不同的名稱。
我們還有一個整數 值和兩個指針。
它是這樣的態度對待這一點的 作為指針指向的下一件事
和以前的事情，我們正在處理 該指針指向一個左子
和右孩子。
確定。
所以這是我們的結構節點。
而現在，唯一的功能，我們需要 實施這是遍歷，這
我們要越過樹，印刷 從樹上，以便這些值。
>> 所以在這裡看，我們要打印 出20，34，36，52，59，和106。
我們如何實現這一目標？
所以這是非常相似的。
如果你在過去的考試，看到了問題 你想打印出
整個樹用逗號之間 一切，它實際上是連
比這更容易。
因此，這裡的解決方案。
這是顯著更容易 如果你遞歸地做到了。
我不知道是否有人試圖 要反复做。
>> 但首先，我們有我們的基本情況。
如果哪根是空？
然後，我們只是要回。
我們不希望打印出任何東西。
否則我們將遍歷 遞歸下降。
打印整個左子樹。
所以打印較少的一切 比我的當前值。
然後我要打印我自己。
然後，我要向下遞歸我 整個右子樹，所以一切
比我的價值更大。
這是要打印 出一切為了。
這個實際上是怎樣的問題 完成了嗎？
>> 觀眾：我有一個問題 在[聽不清]。
>> ROB BOWDEN：逼近所以單程 任何遞歸的問題是只是覺得
它喜歡你不得不思考 所有的角落案件。
因此認為，我們要 打印此整個樹。
所以我們要專注於 就是這個特殊的節點 -
36。
遞歸調用，我們假裝 那些只是工作。
所以在這裡，這個遞歸調用 遍歷，我們甚至沒有想到
關於它，只是遍歷左 3，假設已經打印20
34我們。
然後當我們最終遞歸 遍歷調用的
右，這將正確打印 52，59，106我們。
>> 所以考慮到這可以打印20，34，和 另可打印52，59，108，
所有我們需要能夠做的就是打印 我們自己在那中間。
因此，擺在我們面前打印出來的一切。
打印我們自己，所以當前節點的打印 36，定期的printf，然後
之後，我們打印了一切。
>> DAVID J.馬蘭：這是遞歸 變得非常漂亮。
這是信仰的這個驚人的飛躍，其中 你做的工作哪怕一丁點。
然後你讓別人 別人做休息。
和別人 是，諷刺的是，你。
因此，對於嚴重的印象分，如果 你向上滾動的問題 -
>> ROB BOWDEN：在的問題呢？
>> DAVID J.馬蘭：上下了多大 這些數字，有沒有人知道在哪裡
這些數字從何而來？
>> ROB BOWDEN：我簡直不知道。
>> DAVID J.馬蘭：他們似乎 整個測驗。
>> 觀眾：他們是相同的號碼？
>> DAVID J.馬蘭：這些數字。
有點復活節彩蛋。
因此，對於那些你在網上看 回家，如果你可以通過電子郵件告訴我們
heads@CS50.net什麼意義 這些反复出現的六個號碼是
整個測驗1，我們將沐浴你 以驚人的注意力在最後
演講和一個壓力球。
美觀大方，含蓄。
>> ROB BOWDEN：最後還有什麼問題 關於測驗什麼？