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:最後還有什麼問題 關於測驗什麼?