DAVID J. Malan: Được rồi. Vì vậy, chào mừng bạn đến đầu tiên CS50 sau khi chết cho một bài kiểm tra. Chúng tôi nghĩ rằng chúng tôi sẽ khai trương truyền thống này trong năm nay. Và điều này sẽ là một cơ hội đi qua các giải pháp cho các bài kiểm tra. Và chúng tôi sẽ tăng tốc độ hoặc làm chậm dựa trên lợi ích của những người ở đây. Vì vậy, có lẽ bạn đang ở đây bởi vì bạn quan tâm đến việc làm thế nào bạn có thể có hoặc nên đã trả lời một số những vấn đề này. Vậy tại sao chúng ta không có một cái nhìn ở phần này đầu tiên? Vì vậy, nhận chuỗi. Điều này đã cho bạn ba phiên bản khác nhau của một chương trình đó là, cuối cùng, có nghĩa là để có được một chuỗi từ một người sử dụng. Có hay không nó đã làm điều đó là để lại cho bạn để xác định. Và chúng tôi yêu cầu trong câu hỏi 0, giả sử rằng phiên bản 1 là biên soạn và thực hiện. Tại sao có thể chương trình segfault? Ở cái nhìn đầu tiên, bất cứ đề nghị là tại sao? Yeah. ĐỐI TƯỢNG: Vì vậy, tôi nhớ đã nhìn thấy điều này trong một ví dụ trước của nhìn vào char * s và nhìn thấy quá trình quét của s và nhìn thấy bởi vì nó là một con trỏ, làm thế nào Nó đã ảnh hưởng đến những gì bạn quét? Là nó s hoặc địa chỉ của s? DAVID J. Malan: OK. Tốt. Vì vậy, cuối cùng, là nguồn gốc của bất kỳ vấn đề được có lẽ sẽ giảm với biến s. Và nó thực sự là một biến. Kiểu dữ liệu của biến đó là char *, có nghĩa là nó sẽ chứa địa chỉ của một nhân vật. Và đây là cái nhìn sâu sắc. Nó sẽ chứa địa chỉ của một nhân vật hay tổng quát hơn, địa chỉ của ký tự đầu tiên trong một khối toàn bộ các ký tự. Nhưng nắm bắt được rằng s quét, mục đích cuộc sống, được đưa ra một địa chỉ và được một mã định dạng, như% s, đọc một chuỗi thành các đoạn bộ nhớ tại địa chỉ đó. Nhưng vì không có dấu hiệu bình đẳng trước rằng dấu chấm phẩy vào ngày đầu tiên dòng mã, bởi vì chúng tôi không thực sự phân bổ bất kỳ bộ nhớ với malloc, bởi vì nó không thực sự cấp phát một mảng của một số kích thước, tất cả bạn đang làm là đọc của người sử dụng bàn phím nhập vào một số hoàn chỉnh giá trị rác, mà là trong s theo mặc định. Vì vậy, tỷ lệ cược là bạn sẽ segfault nếu địa chỉ không chỉ để xảy ra là một giá trị mà bạn có thể, trên thực tế, viết thư cho. Xấu như vậy không phân bổ bộ nhớ của bạn ở đó. Vì vậy, trong câu hỏi 1, chúng tôi hỏi, giả sử rằng phiên bản 2 là biên soạn và thực hiện. Tại sao có thể chương trình này segfault? Vì vậy, đây là một trong ít lỗi. Và có thực sự chỉ có một cách rõ ràng mà bạn có thể kích hoạt một segfault đây. Và đây là chủ đề. Bất cứ lúc nào chúng tôi đang sử dụng c trong bộ nhớ, những gì bạn có thể làm để tạo ra một segfault với phiên bản 2? ĐỐI TƯỢNG: Nếu bạn sử dụng đầu vào trong một chuỗi dài hơn 49 ký tự. DAVID J. Malan: Chính xác. Bất cứ lúc nào bạn nhìn thấy một cái gì đó cố định chiều dài khi nói đến một mảng, của bạn radar nên đi ra rằng điều này có thể là có vấn đề nếu bạn không kiểm tra ranh giới của một mảng. Và đó là vấn đề ở đây. Chúng tôi vẫn đang sử dụng scanf. Chúng tôi vẫn đang sử dụng% s, có nghĩa là cố gắng để đọc một chuỗi từ người sử dụng. Điều đó sẽ được đọc vào, mà, vào thời điểm này, là có hiệu quả địa chỉ của một đoạn bộ nhớ hoặc đó là tương đương. Đó là tên của một mảng các nhân vật của bộ nhớ. Nhưng chính xác điều đó, nếu bạn đọc một chuỗi đó là dài hơn 49 ký tự, 49 bởi vì bạn cần chỗ cho các dấu gạch chéo ngược 0, bạn sẽ tràn bộ đệm. Và bạn có thể nhận được may mắn và có thể viết một nhân vật thứ 51, 52, 53. Nhưng tại một số điểm, hệ điều hành sẽ nói, không. Điều này chắc chắn không phải là bộ nhớ bạn được phép chạm vào. Và chương trình sẽ segfault. Do đó, các chẩn đoán nên có bất kỳ thời gian bạn đã có độ dài cố định, bạn có chắc chắn rằng bạn đang kiểm tra độ dài của bất cứ điều gì bạn đang cố gắng đọc vào nó. ĐỐI TƯỢNG: Vì vậy, để giải quyết điều đó, bạn có thể đã có một kiểm tra thực sự tuyên bố là lớn hơn chiều dài hơn hoặc ít hơn? DAVID J. Malan: Tuyệt đối. Bạn chỉ cần có một điều kiện nói rằng, nếu - hay đúng hơn là bạn không nhất thiết phải biết trước bao nhiêu nhân vật người sử dụng sẽ gõ, bởi vì bạn có gà và trứng. Không cho đến khi bạn đã đọc nó với scanf bạn có thể tìm ra nó là bao lâu. Nhưng tại thời điểm đó, nó là quá muộn, bởi vì bạn đã đọc nó vào một số khối của bộ nhớ. Vì vậy, như một sang một bên, tránh thư viện CS50 vấn đề này hoàn toàn, thu hồi bằng cách sử dụng fgetc. Và nó đọc một ký tự tại một thời gian, tip-toeing cùng, biết rằng bạn không thể tràn một nhân vật nếu bạn đọc cùng một lúc. Việc nắm bắt được với getString thu hồi là rằng chúng ta phải liên tục chỉnh lại kích thước rằng đoạn bộ nhớ, mà chỉ là một nỗi đau. Đó là rất nhiều dòng mã để làm điều đó. Vì vậy, cách tiếp cận khác sẽ được thực sự sử dụng một người anh em họ, vì vậy để nói chuyện, trong scanf. Có các biến thể của rất nhiều những chức năng mà thực sự kiểm tra chiều dài của bao nhiêu ký tự bạn có thể đọc tối đa. Và bạn có thể chỉ định, không đọc hơn 50 ký tự. Vì vậy, đó sẽ là cách tiếp cận khác nhưng ít có sức chứa đầu vào lớn hơn. Vì vậy, câu hỏi 2 yêu cầu, giả sử phiên bản 3 được biên dịch và thực thi. Tại sao có thể chương trình segfault? Vì vậy, một điều này thực sự giống nhau trả lời, mặc dù nó nhìn một chút fancier. Chúng tôi đang sử dụng malloc, mà cảm thấy như chúng tôi đang đem lại cho chúng ta nhiều lựa chọn hơn. Và sau đó chúng tôi đang giải phóng mà bộ nhớ ở cuối. Nó vẫn chỉ là 50 byte của bộ nhớ. Vì vậy, chúng tôi vẫn có thể cố gắng đọc trong 51, 52, 1.000 byte. Nó sẽ segfault cho chính xác cùng một lý do. Nhưng có một lý do khác nữa. Những gì có thể trở lại bên cạnh malloc địa chỉ của một đoạn bộ nhớ? Nó có thể trở về null. Và bởi vì chúng tôi không kiểm tra đó, chúng tôi có thể làm một cái gì đó ngu ngốc vì lý do khác, đó là chúng ta có thể nói với scanf, đọc đầu vào của người dùng từ bàn phím vào vị trí 0, AKA null. Và đó cũng sẽ chắc chắn kích hoạt một segfault. Vì vậy, cho mục đích của bài kiểm tra, chúng tôi sẽ đã chấp nhận một trong những người như một lý do chính đáng. Một là giống hệt nhau. Một là nhiều hơn một chút sắc thái. Cuối cùng, đối với các chương trình với sử dụng bộ nhớ, làm thế nào phiên bản 2 và phiên bản 3 khác nhau? Vì vậy, cho những gì nó có giá trị, chúng tôi thấy một cung cấp dường như vô tận của thể câu trả lời cho điều này. Và trong số những câu trả lời của người dân, những gì chúng tôi đã hy vọng, nhưng chúng tôi chấp nhận khác điều, là một số đề cập đến thực tế là phiên bản 2 được sử dụng stack cái gọi là. Phiên bản 3 đang sử dụng heap. Và chức năng, điều này không thực sự làm cho tất cả rằng có rất nhiều sự khác biệt. Vào cuối ngày, chúng ta vẫn còn chỉ nhận được 50 byte bộ nhớ. Nhưng đó là một trong những câu trả lời có thể rằng chúng tôi đã nhìn vào. Nhưng bạn sẽ thấy, khi bạn nhận được câu đố của bạn trở lại từ TF, mà chúng tôi đã làm chấp nhận các cuộc thảo luận khác của họ sử dụng khác nhau của bộ nhớ là tốt. Nhưng chồng và đống sẽ là một câu trả lời dễ dàng để đi với. Bất kỳ câu hỏi? Tôi cung cấp cho bạn Rob. ROB Bowden: Vì vậy, vấn đề 4. Đây là một trong những nơi bạn phải điền trong số byte trong số tất cả các loại khác nhau được sử dụng. Điều đầu tiên để chúng ta thấy. Giả sử một kiến ​​trúc 32-bit, như thiết bị CS50 này. Vì vậy, một trong những điều cơ bản về Kiến trúc 32-bit, mà nói với chúng tôi chính xác làm thế nào lớn một con trỏ sẽ là trong kiến ​​trúc. Vì vậy, ngay lập tức, chúng tôi biết rằng bất kỳ con trỏ loại là 32-bit hoặc 4 byte. Vì vậy, nhìn vào bảng này, một nút * là một loại con trỏ. Đó sẽ là 4 byte. Nút cấu trúc *, đó là nghĩa đen giống với ngôi sao nút. Và do đó sẽ là 4 byte. Chuỗi, do đó nó không giống như một con trỏ, nhưng typedef, một chuỗi chỉ là một char *, mà là một loại con trỏ. Vì vậy, đó sẽ là 4 byte. Vì vậy, ba là tất cả 4 byte. Bây giờ, nút và sinh viên là phức tạp hơn một chút. Vì vậy, nhìn vào nút và học sinh, chúng ta thấy nút là một số nguyên và một con trỏ. Và sinh viên là hai con trỏ bên trong của nó. Vì vậy, ít nhất là đối với trường hợp của chúng tôi ở đây, cách mà chúng tôi kết thúc tính toán kích thước của cấu trúc này chỉ là thêm lên tất cả mọi thứ đó là bên trong cấu trúc. Vì vậy, cho nút, chúng tôi có một số nguyên, đó là 4 byte. Chúng tôi có một con trỏ, đó là 4 byte. Và như vậy một nút sẽ để mất 8 byte. Và tương tự cho sinh viên, chúng tôi có một con trỏ đó là 4 byte và một con trỏ đó là 4 byte. Vì vậy, đó sẽ kết thúc lên được 8 byte. Vì vậy, nút và sinh viên là 8 byte. Và ba là tất cả 4 byte. Câu hỏi về điều đó? Vâng. ĐỐI TƯỢNG: Có là một 64-bit kiến trúc, sẽ là tăng gấp đôi tất cả trong số họ? ROB Bowden: Nó sẽ không tăng gấp đôi tất cả chúng. Vì vậy, kiến ​​trúc 64-bit, nó, một lần nữa, thay đổi mà điều cơ bản mà một con trỏ tại là 64 bit. Yeah. Vì vậy, một con trỏ là 8 byte. Vì vậy, những đó là 4 byte đang có được 8 byte. Một sinh viên, đó là hai con trỏ, tốt, bây giờ nó sẽ có 8 byte, 8 byte. Nó sẽ làm cho 16 byte. Nhưng một nút vẫn là 4 byte. Vì vậy, con trỏ này sẽ là 8 byte. Đây là 4 byte. Vì vậy, một nút chỉ đi là 12 byte. Bất kỳ câu hỏi khác trên một trong những? Vì vậy, một trong những tiếp theo, đây là những các mã trạng thái HTTP. Và bạn có để mô tả hoàn cảnh theo đó những sức mạnh được trả lại cho bạn. một vấn đề mà tôi nghe nói một số sinh viên có là họ đã cố gắng để làm cho lỗi là ngày cuối cùng của khách hàng. Vì vậy, khi chúng tôi cố gắng thực hiện yêu cầu đến máy chủ, một cái gì đó đi sai về kết thúc của chúng tôi. Nhưng nói chung, các mã số này được trả lại bởi các máy chủ. Vì vậy, chúng tôi muốn tìm ra những gì đang xảy ra đúng hay sai trên máy chủ gây ra những điều cần được trả lại. Vậy tại sao có thể một máy chủ trả về mã trạng thái 200? Bất kỳ suy nghĩ? Yeah. Vì vậy, một cái gì đó về thành công yêu cầu đã đi qua. Và họ có thể quay trở lại bất cứ điều gì bạn yêu cầu. Vì vậy, tất cả mọi thứ được tốt. Những gì về 302 tìm thấy? Yeah. ĐỐI TƯỢNG: Các máy chủ đang tìm kiếm cho những gì mà bạn yêu cầu. Nhưng nó không thể tìm thấy nó. Vì vậy, có một lỗi. ROB Bowden: Vì vậy, các máy chủ đã tìm kiếm những gì bạn muốn. Vì vậy chỉ cần tìm kiếm ở đây, 302 tìm thấy, nó đã có thể tìm thấy nó. ĐỐI TƯỢNG: Tôi xin lỗi. Tìm thấy có nghĩa là họ đã tìm thấy nó. Xin lôi. ROB Bowden: Vì vậy, 302 được tìm thấy. Các máy chủ có thể tìm thấy những gì bạn muốn. ĐỐI TƯỢNG: Nhưng nó không hiển thị nó? ROB Bowden: Sự khác biệt giữa này 302 và 200 là nó biết những gì bạn muốn. Nhưng nó không phải là chính xác nơi bạn muốn hỏi. Vì vậy, 302 là một chuyển hướng điển hình. Vì vậy, bạn yêu cầu một trang. Nó biết, oh, tôi muốn để trả lại cho bạn này. Nhưng điều này là một URL khác nhau. Vì vậy, hey, bạn thực sự muốn điều này. DAVID J. Malan: Đó là một phần những gì đã nói rằng chúng tôi đã cho các bạn một chuyển hướng chức năng sử dụng các chức năng tiêu đề rằng, lần lượt, in ra vị trí, ruột kết, và sau đó các URL mà bạn muốn từ chối người sử dụng. Ngay cả khi bạn không nhìn thấy 302 rõ ràng có, đó là những gì PHP kỳ diệu sẽ chèn như tiêu đề nói chính xác những gì Rob nói rằng - được tìm thấy. Nhưng đi ở đây để thay thế. ROB Bowden: OK. Vì vậy, những gì về 403 cấm? ĐỐI TƯỢNG: Tôi nghĩ rằng đó là máy chủ về cơ bản nói rằng khách hàng không thể truy cập trang chủ. ROB Bowden: Vì vậy, có. Vâng, câu trả lời điển hình chúng tôi hy vọng là một cái gì đó như, các tập tin không chmodded thích hợp. Đó có thể là trong hoàn cảnh nào bạn nhìn thấy họ. Nhưng có một lý do mà khách hàng có thể có lỗi ở đây. Có thực sự là một mã trạng thái - 401. Vì vậy, đây là rất giống nhau. 401 là trái phép. Và 403 bị cấm. Và do đó không được phép bạn độc quyền nhận được nếu bạn không đăng nhập Nhưng đăng nhập có thể có nghĩa rằng bạn được phép. Nhưng nếu bạn đã đăng nhập và bạn vẫn không có sự cho phép, sau đó bạn cũng có thể bị cấm. Vì vậy, nếu bạn đã đăng nhập và không có cho phép, cấm cũng là một cái gì đó bạn có thể nhận được. DAVID J. Malan: Và cơ chế mà những vấn đề này thường giải quyết trên máy chủ là qua những gì lệnh? Chmod, nếu nó, thực sự, một quyền phát hành trên các tập tin hoặc thư mục. ROB Bowden: Sau đó, 404 không tìm thấy. Yeah. Vì vậy, không giống như 302, nơi nó là không chính xác nơi bạn đang yêu cầu nhưng nó biết những gì bạn muốn, điều này, nó chỉ có không biết những gì bạn muốn. Và bạn không yêu cầu một cái gì đó có giá trị. 418 Tôi là một ấm trà và sau đó 500 máy chủ nội bộ. Vậy tại sao bạn có thể nhận được điều đó không? Vì vậy, segfault - Tôi thực sự không biết việc xếp hạng tiêu chuẩn cho việc này. Nhưng nếu mã PHP của bạn có một cái gì đó sai trong đó, về mặt lý thuyết, nó có thể thực sự segfault, trong trường hợp đó, điều này 500 lỗi máy chủ nội bộ, một cái gì đó là sai với máy chủ của bạn cấu hình. Hoặc có một lỗi cú pháp trong mã PHP của bạn. Hoặc một cái gì đó xấu đang xảy ra. DAVID J. Malan: Chúng tôi đã nhìn thấy segfault giữa các câu trả lời một vài người dân. Và về mặt kỹ thuật, nó có thể xảy ra. Nhưng đó sẽ là một PHP, chương trình được viết bởi những người khác, thực sự segfaulted, mà chỉ khi những người hơi say lên và viết mã lỗi trong thông dịch viên của họ sẽ PHP chính nó segfault. Vì vậy, mặc dù 500 là giống như một segfault trong tinh thần, đó là hầu như luôn luôn kết quả của một vấn đề file cấu hình với máy chủ web của bạn hoặc, như Rob cho biết, lỗi cú pháp, giống như bạn không đóng một báo giá. Hoặc bạn bị mất một dấu chấm phẩy ở đâu đó. ĐỐI TƯỢNG: Vì vậy, cho pset tàu con thoi, tôi nghĩ rằng khi tôi đã làm nó một lần tôi nhấp vào trình duyệt, nhưng không đưa ra, những gì họ gọi là trang trắng. Nhưng đó là vì các mã. Tôi nghĩ đó là JavaScript, phải không? ROB Bowden: Vâng. ĐỐI TƯỢNG: Sẽ lỗi vẫn đi lên? ROB Bowden: Vì vậy, bạn sẽ không nhận được lỗi này bởi vì tất cả mọi thứ từ quan điểm của các máy chủ web là hoàn toàn tốt đẹp. Nhưng mà bạn yêu cầu index.html. Bạn yêu cầu shuttle.js và service.js. Và nó đã có thể trở thành công để tất cả những điều bạn - 200. OK. Nó chỉ khi trình duyệt của bạn cố gắng giải thích các mã JavaScript nó như thế, chờ đợi, đây không phải là lỗi JavaScript hợp lệ. Bất kỳ câu hỏi nào khác không? Được rồi. DAVID J. Malan: Vì vậy, tiếp theo lên là số 11. Và 11 là đáng sợ nhất cho rất nhiều người. Vì vậy, điều quan trọng nhất cần lưu ý ở đây được rằng điều này là, trên thực tế, về một danh sách liên kết kép. Nhưng điều này là không giống như năm ngoái gấp đôi danh sách liên kết vấn đề, mà đã không cung cấp cho bạn sự báo trước rằng danh sách có thể, trên thực tế, được phân loại. Vì vậy, thực tế là danh sách là không được phân loại và thực tế là từ đó là gạch chân có có nghĩa là để chuyển tải rằng đây thực sự là một việc đơn giản hóa những gì nếu không sẽ là một vấn đề khó khăn hơn và còn một. Vì vậy, một sai lầm phổ biến ở đây là đã đặt giải pháp của năm ngoái trên một của bạn máy nhắn tin và sau đó chỉ cần một cách mù quáng sao chép mà xuống là câu trả lời, đó là quyền câu trả lời cho một câu hỏi khác nhau tinh thần tương tự. Nhưng sự tinh tế đây như sau. Vì vậy, một, chúng tôi đã tuyên bố một nút và được xác định theo cách thông thường ở đây. Sau đó, chúng tôi xác định danh sách các là một toàn cầu con trỏ khởi tạo null. Thì rõ ràng, có hai chức năng chúng tôi có nguyên mẫu cho đây, chèn và loại bỏ. Và sau đó chúng tôi có một số mẫu mã ở đây làm một loạt các chèn. Và sau đó chúng tôi yêu cầu bạn để hoàn tất thực hiện chèn dưới đây chẳng hạn một cách mà nó chèn n vào danh sách trong thời gian liên tục, cũng nhấn mạnh, ngay cả khi đã hiện diện. Vì vậy, vẻ đẹp của việc có thể để chèn trong thời gian liên tục là nó ngụ ý mà bạn phải chèn nút mới ở đâu? Vào phía trước. Vì vậy, nó giúp loại bỏ, may mắn thay, ít nhất một trong các trường hợp được sử dụng để yêu cầu đường nhiều hơn mã, như nó đã làm năm ngoái và ngay cả trong lớp học khi chúng ta nói chuyện thông qua hình thức này mà với con người và với một số mã giả bằng lời nói. Vì vậy, trong các giải pháp ở đây, chúng ta hãy bỏ qua đó chỉ để có một hình ảnh trên màn hình. Chú ý rằng chúng ta đang làm những điều sau đây. Và cũng nhận thấy sự đơn giản hóa khác là ngay cả khi nó đã có mặt, vì vậy điều này có nghĩa là ngay cả khi con số này đã có, bạn có thể chỉ một cách mù quáng chèn khác bản sao của nó. Và đó cũng có nghĩa là phải một đơn giản hóa, vì vậy mà bạn có thể tập trung vào, thực sự, một số chi tiết một phần trí tuệ thú vị và không chỉ là một số kiểm tra lỗi thêm cho thời gian hạn chế. Vì vậy, trong dung dịch mẫu này, chúng tôi phân bổ một con trỏ trên bên trái bên đây với một nút. Bây giờ, nhận ra con trỏ đó, như Rob cho biết, chỉ 32 bit. Và nó không thực sự có chứa một địa chỉ cho đến khi bạn gán cho nó địa chỉ. Và chúng tôi làm điều đó trên cánh tay phải bên thông qua malloc. Như một công dân tốt, chúng ta kiểm tra malloc không phải là, trên thực tế, vô giá trị, do đó chúng tôi không vô tình tạo ra một segfault đây. Và bất cứ lúc nào bạn sử dụng malloc trong cuộc sống, bạn nên được kiểm tra cho null, vì sợ bạn có một lỗi tinh tế. Sau đó, chúng ta khởi tạo không cho rằng bởi giao n và trước và sau. Và trong trường hợp này đây, tôi khởi tạo trước để vô giá trị, bởi vì đây mới nút là có được các mới bắt đầu của danh sách của tôi. Do đó sẽ là không có gì trước khi nó. Và tôi muốn về cơ bản phụ thêm danh sách hiện có để các nút mới bằng cách thiết kế bằng danh sách riêng của mình. Nhưng tôi không thực hiện chỉ được nêu ra. Vì vậy, nếu danh sách tự nó đã tồn tại, và đã có ít nhất một nút đã được đặt ra, nếu đây là danh sách ở đây và tôi chèn một nút mới ở đây, tôi cần phải chắc chắn rằng nút cũ của tôi chỉ ngược trở lại để nút mới của tôi, bởi vì đây là, một lần nữa, một danh sách liên kết kép. Vì vậy, chúng tôi làm một kiểm tra sự tỉnh táo. Nếu danh sách không phải là vô giá trị, nếu có đã một hay nhiều hạch ở đó, sau đó thêm rằng trở lại tham chiếu như vậy để nói chuyện. Và sau đó là điều cuối cùng chúng ta cần làm là thực sự cập nhật toàn cầu danh sách biến bản thân để chỉ với nút mới. Yeah. ĐỐI TƯỢNG: Trong mũi tên con trỏ [Nghe được] bằng vô giá trị, không có đối phó với danh sách bởi vì danh sách là vô giá trị? DAVID J. Malan: Không. Mà chỉ đơn giản là tôi được chủ động cẩn thận, trong đó nếu điều này là của tôi danh sách ban đầu có thể với một số nút hơn ở đây và tôi chèn của tôi nút mới trên đây, có đi không có gì ở đây. Và tôi muốn nắm bắt ý tưởng bằng cách thiết lập trước đó null trên các node mới. Và có lẽ, nếu mã của tôi là chính xác và không có cách nào khác để chèn các nút khác hơn chức năng này, có lẽ, ngay cả khi đã có danh sách một hay nhiều hạch ở trong đó, có lẽ các danh sách, nút đầu tiên, sẽ có một con trỏ trước null chính nó. ĐỐI TƯỢNG: Và chỉ là một tiếp theo. Lý do bạn đưa con trỏ ngang hàng tiếp theo Danh sách được bạn đang làm cho con trỏ trước khi danh sách trong đó nó chỉ kế tiếp, tôi đoán - Tôi đừng - chỉ liệt kê? DAVID J. Malan: Chính xác. Và vì vậy chúng ta thực sự xem xét hai trường hợp đây thực sự, mặc dù Để chúng tôi sẽ xem xét không phải là hoàn toàn giống như các mã. Nhưng trên một cấp độ cao, nếu điều này đại diện cho liệt kê và đây là một 32-bit con trỏ, kịch bản đơn giản nhất là rằng điều này là vô giá trị mặc định. Và giả sử tôi muốn chèn số 50 là số đầu tiên. Vì vậy, tôi sẽ đi trước và phân bổ một nút, mà là có chứa ba lĩnh vực - n, trước và sau. Tôi sẽ đưa số 50 ở đây, bởi vì điều này sẽ là n. Điều này sẽ được tiếp theo. Và điều này sẽ được trước đó. Và vì vậy tôi phải làm gì trong trường hợp này? Vâng, tôi vừa thực hiện 1 dòng ở đây. Con trỏ n được n. Sau đó tôi nói, trước nên vô giá trị. Vì vậy, đây sẽ là vô giá trị. Sau đó tôi sẽ nói tiếp theo là sẽ nhận được danh sách. Và điều này chỉ hoạt động ra tốt. Điều này là vô giá trị. Và vì vậy tôi nói, các nút mới tiếp theo lĩnh vực sẽ nhận được bất cứ điều gì là. Vì vậy mà đặt vô giá trị khác ở đó. Và sau đó là điều cuối cùng Tôi đang kiểm tra ở đây. Nếu danh sách không phải là bằng vô giá trị, nhưng nó bằng vô giá trị, vì vậy chúng tôi bỏ qua hoàn toàn. Và vì vậy tất cả tôi làm tiếp theo là danh sách được con trỏ, mà những bức tranh kết quả trong một bức tranh như thế. Vì vậy, đó là một kịch bản. Và một trong những bạn đã hỏi về đặc biệt là một tình huống như thế này, nơi chúng tôi đã có một danh sách một nút. Và nếu tôi quay trở lại trong bản gốc báo cáo vấn đề, tiếp theo chúng ta sẽ chèn nói là 34, chỉ cần cho vì lợi ích của cuộc thảo luận. Vì vậy, tôi sẽ chỉ thuận tiện rút ra rằng ở đây. Tôi vừa malloced. Giả sử tôi đang kiểm tra cho null. Bây giờ, tôi sẽ khởi tạo n là 34. Và đây sẽ là n. Điều này sẽ được tiếp theo. Và điều này sẽ được trước đó. Hãy chắc chắn rằng tôi đã không có được điều này ngược. Trước đến trước trong định nghĩa. Hãy để tôi sửa lỗi này. Đây là trước đó. Đây là tiếp theo. Mặc dù đây là giống hệt nhau, chúng ta hãy giữ cho nó phù hợp. Trước. Đây là tiếp theo. Vì vậy, tôi đã chỉ malloced lưu ý của tôi, kiểm tra null, giao 34 vào nút. Trước được null. Để mang lại cho tôi đó. Tiếp theo được danh sách. Vì vậy, danh sách là thế này. Vì vậy, đây là giống như bây giờ vẽ này mũi tên, vì vậy chúng chỉ đến một trong cùng. Và sau đó tôi kiểm tra nếu danh sách không bằng null. Và nó không phải thời điểm này. Sau đó, tôi sẽ làm danh sách trước được con trỏ. Vì vậy, danh sách trước được PTR. Vì vậy, đây có tác dụng đưa một mũi tên đồ họa ở đây. Và đó là nhận được một chút lượn sóng, các dòng. Và sau đó, cuối cùng, tôi cập nhật danh sách để trỏ đến con trỏ. Vì vậy, bây giờ điều này dẫn đến anh chàng này. Và bây giờ, chúng ta hãy làm một cách nhanh chóng sự tỉnh táo kiểm tra. Dưới đây là danh sách, đó là các biến toàn cầu. Nút đầu tiên là, thực sự, 34 tuổi, vì Tôi sau mũi tên. Và đó là chính xác bởi vì tôi muốn chèn vào đầu danh sách tất cả các nút mới. Lĩnh vực tiếp theo của mình dẫn tôi đến anh chàng này. Nếu tôi tiếp tục đi, tôi nhấn tiếp theo là null. Vì vậy, không có danh sách hơn. Nếu tôi nhấn trước, tôi nhận được trở lại nơi mà tôi mong đợi. Vì vậy, vẫn có một vài gợi ý, rõ ràng, để thao tác. Nhưng thực tế là bạn đã được bảo phải làm này trong thời gian liên tục có nghĩa là bạn chỉ có một số hữu hạn các điều bạn được phép làm. Và con số này là gì? Nó có thể là một bước. Nó có thể là hai. Nó có thể là 1.000 bước. Nhưng đó là hữu hạn, có nghĩa là bạn có thể không đã bất kỳ loại vòng lặp xảy ra ở đây, không đệ quy, không vòng. Nó chỉ là đã nhận được dòng mã hóa cứng mã như chúng tôi có trong mẫu này. Vì vậy, vấn đề tiếp theo 12 yêu cầu chúng tôi hoàn thành việc thực hiện loại bỏ dưới đây trong một cách mà nó loại bỏ n từ danh sách trong thời gian tuyến tính. Vì vậy, bạn có nhiều hơn một chút phòng lung bây giờ. Bạn có thể giả định rằng n, nếu có trong danh sách, sẽ có mặt không quá một lần. Và rằng quá được hiểu là một bài kiểm tra dựa trên đơn giản hoá giả định, vì vậy rằng nếu bạn tìm thấy những số 50 ở đâu đó trong danh sách, bạn không còn phải lo lắng về việc tiếp tục lặp, tìm kiếm tất cả các thể bản sao của 50, mà sẽ chỉ phân cấp vào một số minutia trong thời gian giới hạn. Vì vậy, với loại bỏ, điều này là chắc chắn khó khăn hơn và nhiều hơn nữa mã để viết. Nhưng ở cái nhìn đầu tiên, thẳng thắn, nó có thể giống như áp đảo và không có cách nào bạn có thể có đưa ra trên một bài kiểm tra. Nhưng nếu chúng ta tập trung vào các bước cá nhân, hy vọng, nó sẽ đột nhiên tấn công bạn rằng mỗi cá nhân bước có ý nghĩa rõ ràng khi nhìn lại. Vì vậy, chúng ta hãy có một cái nhìn. Vì vậy, đầu tiên, chúng ta khởi tạo con trỏ được liệt kê riêng của mình. Bởi vì tôi muốn thời gian tuyến tính, điều đó có nghĩa Tôi sẽ có một số vòng lặp. Và một cách phổ biến để duyệt qua các các nút trong một cấu trúc danh sách hoặc bất cứ loại nào cấu trúc lặp đi lặp lại là để có một con trỏ đến phía trước của dữ liệu cấu trúc và sau đó chỉ cần bắt đầu cập nhật nó và đi theo cách của bạn thông qua các cấu trúc dữ liệu. Vì vậy, tôi sẽ làm chính xác điều đó. Trong khi con trỏ, biến tạm thời của tôi, không bằng vô giá trị, chúng ta hãy đi trước và kiểm tra. Tôi đã nhận được may mắn? Là lĩnh vực n trong nút Tôi hiện đang nhìn vào bằng số tôi đang tìm kiếm? Và nếu như vậy, chúng ta hãy làm một cái gì đó. Bây giờ, thông báo này nếu điều kiện bao quanh toàn bộ dòng mã sau đây. Đây là điều duy nhất tôi quan tâm - tìm kiếm một số trong câu hỏi. Vì vậy, không có gì khác, mà đơn giản hóa điều khái niệm một chút. Nhưng bây giờ, tôi nhận ra, và bạn có thể có chỉ nhận ra điều này sau khi suy nghĩ nó thông qua một chút, có thực sự hai trường hợp ở đây. Là một trong những nơi mà các nút là ở bắt đầu của danh sách, mà là một ít gây phiền nhiễu, bởi vì đó là một trường hợp đặc biệt, bởi vì bạn phải đối phó với điều này, là sự bất thường mà thôi. Ở khắp mọi nơi khác trong danh sách, đó là điều tương tự. Có một nút trước và sau nút, nút trước, nút tiếp theo. Nhưng anh chàng này là một chút đặc biệt nếu anh ta ngay từ đầu. Vì vậy, nếu con trỏ bằng danh sách chính nó, vì vậy nếu tôi ở đầu danh sách và tôi đã tìm thấy n, tôi cần để làm một vài điều. Một, tôi cần phải thay đổi danh sách để trỏ đến trường tiếp theo, 50. Vì vậy, giả sử rằng tôi đang cố gắng để loại bỏ 34. Vì vậy, anh chàng này đã đi đi chỉ trong một khoảnh khắc. Vì vậy, tôi sẽ nói, danh sách được trỏ tới. Vâng, đây là con trỏ. Tiếp theo là chỉ ở đây. Vì vậy, đây đang thay đổi mũi tên này ngay bây giờ để trỏ đến anh chàng này ở đây. Bây giờ, hãy nhớ rằng, chúng tôi có một biến tạm thời. Vì vậy, chúng tôi đã không mồ côi bất kỳ nút, vì tôi cũng có anh chàng này trong tôi thực hiện loại bỏ. Vì vậy, bây giờ, nếu danh sách tự nó không phải là vô giá trị, Tôi cần phải sửa chữa một chút gì đó. Tôi cần phải bây giờ chắc chắn rằng mũi tên này, được chỉ trước đó 50-34, điều này đã phải đi xa, bởi vì nếu tôi đang cố gắng để thoát khỏi 34, 50 có tốt hơn không duy trì bất kỳ loại trở lại tham chiếu đến nó như là mũi tên được đề xuất. Vì vậy, tôi chỉ làm dòng này. Vì vậy, sau đó tôi thực hiện. Trường hợp đó thực sự là khá dễ dàng. Cắt bỏ phần đầu của danh sách là tương đối đơn giản. Thật không may, điều này khối gây phiền nhiễu khác. Vì vậy, bây giờ, tôi phải xem xét các trường hợp nơi có một cái gì đó ở giữa. Nhưng nó không phải là quá khủng khiếp, ngoại trừ cho cú pháp như thế này. Vì vậy, nếu tôi không phải ở đầu danh sách, tôi đâu đó ở giữa. Và dòng này ở đây là nói, bắt đầu ở bất cứ nút bạn đang ở. Tới trường tiếp theo nút trước và chỉ có ở con trỏ. Chúng ta hãy làm điều này trong những bức tranh. Đã trở nên phức tạp. Vì vậy, nếu tôi có một lĩnh vực trước đây - chúng ta hãy làm điều này - các lĩnh vực sau đây. Tôi sẽ đơn giản hóa con trỏ của tôi chứ không phải hơn vẽ một bó toàn bộ mọi thứ trở lại và ra crisscrossing nhau. Và bây giờ, chúng ta hãy chỉ nói rằng đây là 1, 2, 3 vì lợi ích của cuộc thảo luận, thậm chí mặc dù điều đó không thẳng hàng với vấn đề trong câu hỏi. Vì vậy, đây là danh sách liên kết của tôi. Tôi cố gắng để loại bỏ hai trong này phiên bản đặc biệt của câu chuyện. Vì vậy, tôi đã cập nhật con trỏ tới được trỏ đến anh chàng này. Vì vậy, đây là PTR. Anh ta chỉ ở đây. Đây là danh sách, mà tồn tại trên toàn cầu như trước. Và anh ta chỉ ở đây không có vấn đề gì. Và bây giờ, tôi đang cố gắng để loại bỏ hai. Vì vậy, nếu con trỏ trỏ ở đây, tôi đi theo, rõ ràng, con trỏ trước, trong đó đặt tôi ở 1. Tôi sau đó sẽ nói rằng tiếp theo lĩnh vực, trong đó mang lại cho tôi trên này hộp đây, sẽ con trỏ bằng tiếp theo. Vì vậy, nếu con trỏ này, đây là tiếp theo. Điều đó có nghĩa rằng mũi tên này nhu cầu để trỏ đến anh chàng này. Vì vậy, những gì mà dòng mã có chỉ thực hiện là một chút về điều này. Và bây giờ, điều này dường như đang tạo bước đi đúng hướng. Chúng tôi chủ yếu muốn snip 2 của giữa 1 và 3. Vì vậy, nó có ý nghĩa mà chúng ta muốn tuyến đường này con trỏ xung quanh nó. Vì vậy, dòng tiếp theo này được kiểm tra nếu con trỏ tiếp theo là không null, có thực sự một ai đó ở bên phải của 2, điều đó có nghĩa chúng tôi cũng phải làm một chút snip đây. Vì vậy, bây giờ tôi cần phải làm theo con trỏ này và cập nhật con trỏ trước đây về anh chàng này để làm một chút của một Cách giải quyết ở đây điểm ở đây. Và bây giờ, trực quan này là tốt đẹp. Đó là một chút lộn xộn trong đó có không ai chỉ vào 2 nữa. 2 được trỏ đến bên trái. Và 2 được trỏ đến bên phải. Nhưng ông có thể làm bất cứ điều gì anh ta muốn, bởi vì ông là về để có được giải phóng. Và nó không có vấn đề gì những giá trị được nữa. Điều quan trọng là còn lại kẻ được định tuyến trên và bên dưới anh ta bây giờ. Và quả thật, đó là những gì chúng tôi làm gì tiếp theo. Chúng tôi con trỏ miễn phí, có nghĩa là chúng ta kể hệ điều hành, bạn được chào đón đòi lại này. Và sau đó cuối cùng, chúng tôi quay trở lại. Khác mặc nhiên, nếu chúng ta đã không trở về nữa, chúng ta phải tiếp tục tìm kiếm. Vì vậy, con trỏ bằng con trỏ tới chỉ có nghĩa là di chuyển anh chàng này ở đây. Di chuyển anh chàng này ở đây. Di chuyển anh chàng này ở đây nếu, trong thực tế, chúng tôi không tìm thấy số chúng tôi đang tìm kiếm được nêu ra. Vì vậy, thẳng thắn, có vẻ hoàn toàn áp đảo, tôi nghĩ rằng, lúc đầu Trong nháy mắt, đặc biệt là nếu bạn gặp khó khăn với điều này trong các bài kiểm tra sau đó xem một cái gì đó như thế này. Và bạn pat mình ở mặt sau. Vâng, không có cách nào tôi có thể có đưa ra rằng trên các bài kiểm tra. Nhưng tôi sẽ tranh luận, bạn có thể nếu bạn phá vỡ nó ra thành những cá nhân trường hợp và chỉ cần đi bộ qua nó cẩn thận, mặc dù, phải thừa nhận rằng, dưới hoàn cảnh căng thẳng. Rất may, các hình ảnh được thực hiện tất cả mọi thứ hạnh phúc hơn. Bạn có thể vẽ này trong nhiều cách. Bạn không cần phải làm crisscrossing điều ở đây. Bạn có thể làm điều đó với thẳng dòng như thế này. Nhưng các ý chính của vấn đề này, trong Nói chung, đã nhận ra rằng hình ảnh cuối cùng nên xem xét một chút một cái gì đó như thế này, bởi vì thời gian liên tục ngụ ý rằng bạn giữ gây nhiễu và gây nhiễu và gây nhiễu các các nút mới vào đầu danh sách. Bất kỳ câu hỏi? Có lẽ là thách thức lớn nhất của chắc chắn những câu hỏi mã hóa. ĐỐI TƯỢNG: Vậy là danh sách tương tự như đầu trong ví dụ trước. DAVID J. Malan: Chính xác, chính xác. Chỉ là một tên khác cho một biến toàn cầu. Trên toàn thế giới những gì? ROB Bowden: OK. Vì vậy, đây là một trong những nơi bạn đã phải viết đoạn văn. Một số người đã viết bài tiểu luận cho câu hỏi này. Nhưng bạn chỉ cần sử dụng sáu điều kiện để mô tả những gì xảy ra khi bạn cố gắng liên hệ với facebook.com. Vì vậy tôi sẽ chỉ nói chuyện qua quá trình sử dụng tất cả các điều khoản này. Vì vậy, trong trình duyệt của chúng tôi, chúng tôi gõ facebook.com và nhấn Enter. Vì vậy, trình duyệt của chúng tôi sẽ xây dựng một HTTP yêu cầu nó sẽ gửi thông qua một số quá trình lên Facebook cho Facebook để đối phó với chúng tôi với các HTML của trang của mình. Vì vậy, quá trình này là gì bởi mà yêu cầu HTTP thực sự được vào Facebook? Vì vậy, đầu tiên, chúng ta cần phải dịch Facebook.com. Vì vậy chỉ cần được đặt tên là Facebook.com, nơi thực hiện các yêu cầu HTTP cần phải đi? Vì vậy, chúng ta cần phải dịch Facebook.com đến một địa chỉ IP, trong đó duy nhất xác định những máy chúng tôi thực sự muốn gửi yêu cầu này. Máy tính xách tay của bạn có một địa chỉ IP. Bất cứ điều gì kết nối với internet có địa chỉ IP. Vì vậy, DNS, Domain Name System, có nghĩa là những gì sẽ xử lý các bản dịch từ facebook.com đến một địa chỉ IP bạn thực sự muốn liên lạc. Vì vậy, chúng tôi liên hệ với các máy chủ DNS và nói, facebook.com là gì? Nó nói, oh, đó là địa chỉ IP 190,212 một cái gì đó, một cái gì đó, một cái gì đó. Được rồi. Bây giờ, tôi biết những gì máy tính Tôi muốn liên lạc. Vì vậy, sau đó bạn gửi yêu cầu HTTP của bạn qua máy đó. Vì vậy, làm thế nào để nó có được để máy đó? Vâng, yêu cầu đi từ router với router nảy. Ghi ví dụ trong lớp học, nơi chúng ta thực sự nhìn thấy con đường mà các gói mất khi chúng ta cố gắng để giao tiếp. Chúng ta đã thấy nó nhảy qua Đại Tây Dương Đại dương tại một điểm hay bất cứ điều gì. Vì vậy, các cổng hạn cuối cùng. Vì vậy, đây là bây giờ trên máy tính của bạn. Bạn có thể có nhiều điều hiện giao tiếp với internet. Vì vậy, tôi có thể chạy, nói, Skype. Tôi có thể có một trình duyệt web mở. Tôi có thể có cái gì đó torrent file. Vì vậy, tất cả những điều này là giao tiếp với internet một cách nào đó. Vì vậy, khi máy tính của bạn nhận được một số dữ liệu từ Internet, làm thế nào nó biết ứng dụng thực tế muốn dữ liệu? Làm thế nào để nó biết liệu đặc biệt này dữ liệu có nghĩa là cho torrent ứng dụng như trái ngược cho trình duyệt web? Vì vậy, đây là mục đích của các cảng ở đó tất cả các ứng dụng có tuyên bố một cổng trên máy tính của bạn. Vì vậy, trình duyệt web của bạn nói, hey, Tôi đang lắng nghe trên cổng 1000. Và chương trình torrent bạn đang nói, Tôi đang lắng nghe trên cổng 3000. Và Skype cho biết, tôi đang sử dụng cổng 4000. Vì vậy, khi bạn nhận được một số dữ liệu thuộc cho một trong các ứng dụng, dữ liệu được đánh dấu bằng cổng nó thực sự phải được gửi cùng với. Vì vậy, điều này nói, oh, tôi thuộc về đến cổng 1000. Tôi biết sau đó tôi cần để chuyển tiếp này cùng với trình duyệt web của tôi. Vì vậy, lý do nó có liên quan ở đây là các máy chủ web có xu hướng lắng nghe trên cổng 80. Vì vậy, khi tôi liên hệ với Facebook.com, tôi giao tiếp với một số máy. Nhưng tôi cần phải nói trước với các cảng mà máy tôi muốn giao tiếp với. Và các máy chủ web có xu hướng lắng nghe trên cổng 80. Nếu họ muốn, họ có thể thiết lập nó để nó liệt kê như trên cổng 7000. Và sau đó trong một trình duyệt web, tôi có thể tay gõ Facebook.com: 7000 gửi yêu cầu đến cổng 7000 của máy chủ web của Facebook. DAVID J. Malan: Và trong trường hợp này, thậm chí mặc dù chúng tôi không yêu cầu người đề cập đến điều này, trong trường hợp này, cổng gì sẽ yêu cầu thực sự đi đến? Thử lại. Chính xác. Không tìm kiếm điều đó, nhưng một sự tinh tế đó là có không có cuối cùng. ROB Bowden: Vì vậy, HTTPS, vì nó nghe đặc biệt cho các mã hóa, đó là trên cổng 4430. ĐỐI TƯỢNG: Và email là 25, phải không? DAVID J. Malan: Outbound email, 25, vâng. ROB Bowden: Tôi thậm chí không biết hầu hết các - tất cả những cái thấp hơn có xu hướng dành cho mọi thứ. Tôi nghĩ rằng tất cả mọi thứ dưới 1024 được dành riêng. ĐỐI TƯỢNG: Tại sao bạn nói 3 là số sai? ROB Bowden: Bởi vì trong một địa chỉ IP, có bốn nhóm của các chữ số. Và họ đang từ 0 đến 255. Vì vậy, 192.168.2.1 là một phổ biến mạng địa chỉ IP địa phương. Thông báo tất cả những người đang có ít hơn 255. Vì vậy, khi tôi bắt đầu với 300, mà không có thể có thể có là một trong những con số. DAVID J. Malan: Nhưng mà đoạn ngớ ngẩn từ - là nó CSI, nơi họ đã có một con số này là quá lớn cho địa chỉ IP. ROB Bowden: Bất kỳ câu hỏi về điều này? Kế tiếp, thay đổi để hoàn thành trong chủ đề, nhưng chúng tôi có điều này mảng PHP cho những ngôi nhà trong tứ. Và chúng tôi có một danh sách có thứ tự. Và chúng tôi muốn in ra mỗi mục chỉ chứa tên nhà. Vì vậy, chúng ta có một vòng lặp foreach. Vì vậy, hãy nhớ rằng, cú pháp foreach mảng như mục trong mảng. Vì vậy, thông qua mỗi lần lặp của vòng lặp, nhà sẽ mất một trong những giá trị bên trong của mảng. Trên phiên đầu tiên, nhà sẽ Cabot House. Trên một lần lặp thứ hai, nhà sẽ Chuyển phát nhanh là nhà và như vậy. Vì vậy, đối với mỗi quad như ngôi nhà, chúng tôi chỉ cần đi để in - bạn cũng có thể lặp lại - mục danh sách và sau đó tên của nhà và sau đó đóng mục danh sách. Các dấu ngoặc nhọn là tùy chọn ở đây. Và sau đó chúng tôi cũng đã nói trong câu hỏi bản thân, hãy nhớ để đóng thẻ danh sách không có thứ tự. Vì vậy, chúng ta cần phải thoát khỏi chế độ PHP để làm điều này. Hoặc chúng ta có thể lặp lại đóng cửa không có thứ tự danh sách từ khóa. DAVID J. Malan: Cũng tốt ở đây sẽ đã được sử dụng cho một trường học cũ vòng lặp với một $ i = 0 0 và sử dụng tính đến tìm ra độ dài của ray. Hoàn toàn tốt quá, chỉ một chút wordier. ĐỐI TƯỢNG: Vì vậy, nếu bạn đã đi vào [Nghe được], bạn sẽ làm gì - Tôi quên những gì các vòng lặp [không nghe được] là. Bạn có $ khung quad tôi? DAVID J. Malan: Chính xác. Vâng, chính xác. ROB Bowden: Bất cứ điều gì khác? DAVID J. Malan: Được rồi. Thương mại-off. Vì vậy, có những chùm câu trả lời có thể cho mỗi trong số này. Chúng tôi đã thực sự chỉ tìm kiếm một cái gì đó hấp dẫn cho một tăng và một nhược điểm. Và số 16 yêu cầu, xác nhận của người sử dụng đầu vào phía khách hàng, như với JavaScript, thay vì phía máy chủ, như với PHP. Vì vậy, một lộn ngược của những gì làm phía khách hàng? Vâng, một trong những điều chúng tôi đề xuất là bạn nên giảm độ trễ, bởi vì bạn không phải bận tâm liên hệ với máy chủ, mà có thể mất một vài mili giây hoặc thậm chí một vài giây bằng cách tránh điều đó và chỉ xác nhận của người sử dụng đầu vào phía khách hàng bởi kích hoạt một xử lý trên trình và chỉ kiểm tra, họ đã gõ một cái gì đó trong tên? Họ đã gõ một cái gì đó trong địa chỉ email? Họ đã chọn một ký túc xá từ trình đơn thả xuống? Bạn có thể cung cấp cho họ thông tin phản hồi tức thời sử dụng máy tính gigahertz hoặc bất cứ điều gì họ có đó là thực sự trên bàn của họ. Vì vậy, nó chỉ là một người dùng tốt hơn kinh nghiệm thường. Nhưng một nhược điểm làm phía máy khách xác nhận, nếu bạn làm điều đó mà không có cũng làm xác nhận phía máy chủ là hầu hết bất cứ ai ra khỏi CS50 biết bạn chỉ có thể gửi bất kỳ dữ liệu bạn muốn đến một máy chủ nhiều cách. Thành thật mà nói, trong hầu hết các trình duyệt, bạn có thể nhấp vào xung quanh trong các thiết lập và chỉ tắt JavaScript, mà sẽ, do đó, vô hiệu hóa bất kỳ hình thức xác nhận. Nhưng bạn cũng có thể nhớ lại rằng ngay cả tôi đã làm một số điều phức tạp trong lớp sử dụng telnet và thực sự giả vờ là một trình duyệt bằng cách gửi get yêu cầu tới một máy chủ. Và đó chắc chắn không phải sử dụng bất kỳ JavaScript. Đó chỉ là tôi gõ lệnh tại một bàn phím. Vì vậy, thực sự, bất kỳ lập trình trong đủ thoải mái với các trang web và HTTP có thể gửi bất cứ dữ liệu mình muốn đến một máy chủ mà không cần xác nhận. Và nếu máy chủ của bạn không còn kiểm tra, họ đã cho tôi một cái tên, là thực sự là một địa chỉ email hợp lệ này, đã làm họ chọn một ký túc xá, bạn có thể kết thúc lên chèn không có thật hoặc chỉ là dữ liệu trống vào cơ sở dữ liệu của bạn, mà có lẽ sẽ không thể là một điều tốt nếu bạn đã giả định nó đã có. Vì vậy, đây là một thực tế gây phiền nhiễu. Nhưng nói chung, phía khách hàng xác nhận là rất tốt. Nhưng nó có nghĩa là gấp đôi việc. Mặc dù có làm tồn tại khác nhau thư viện, thư viện JavaScript cho Chẳng hạn, mà làm cho nhiều, ít nhiều đau đầu. Và bạn có thể sử dụng lại một số mã phía máy chủ, phía khách hàng. Nhưng nhận ra rằng nó là thường việc bổ sung. Yeah. ĐỐI TƯỢNG: Vì vậy, nếu chúng ta chỉ nói ít an toàn - DAVID J. Malan: [LAUGHS] Ugh. Đó là luôn luôn khó khăn hơn những người xét xử. ROB Bowden: Điều đó sẽ đã được chấp nhận. DAVID J. Malan: Cái gì? ROB Bowden: Tôi tạo ra vấn đề này. Điều đó đã được chấp nhận. DAVID J. Malan: Vâng. ĐỐI TƯỢNG: Cool. ROB Bowden: Nhưng chúng tôi không chấp nhận cho người đầu tiên - tốt, những gì chúng ta đang tìm kiếm là một cái gì đó như bạn không cần phải giao tiếp với máy chủ. Chúng tôi không chấp nhận chỉ nhanh hơn. ĐỐI TƯỢNG: Còn không tải lại trang? ROB Bowden: Có. Đó là một câu trả lời chấp nhận. DAVID J. Malan: Bất cứ điều gì mà chúng ta cảm thấy đó là nhiều khả năng hơn không có khả năng mà bạn biết những gì bạn đã nói, đó là một khó khăn dòng để vẽ đôi khi. Sử dụng một danh sách liên kết thay vì của một mảng để duy trì một sắp xếp danh sách các số nguyên. Vì vậy, một ngược chúng ta thường trích dẫn với liên kết danh sách đó thúc đẩy toàn bộ của họ giới thiệu là bạn sẽ có được tính năng động. Họ có thể phát triển. Họ có thể thu nhỏ. Vì vậy, bạn không cần phải nhảy qua hoops để thực sự tạo ra nhiều bộ nhớ hơn với một mảng. Hoặc bạn không phải chỉ nói, xin lỗi, người dùng. Mảng được lấp đầy. Vì vậy, tăng trưởng năng động của danh sách. Một nhược điểm mặc dù danh sách liên kết? ĐỐI TƯỢNG: Đó là tuyến tính. Tìm kiếm trên danh sách liên kết là tuyến tính thay vì những gì bạn đăng nhập DAVID J. Malan: Chính xác. Tìm kiếm trên một danh sách liên kết là tuyến tính, ngay cả khi nó được sắp xếp, bởi vì bạn có thể chỉ thực hiện theo các mẩu bánh mì, các con trỏ, từ khi bắt đầu danh sách để kết thúc. Bạn không thể tận dụng truy cập ngẫu nhiên và, do đó, tìm kiếm nhị phân, ngay cả khi nó sắp xếp, bạn có thể làm với một mảng. Và cũng có chi phí khác. Yeah. ĐỐI TƯỢNG: bộ nhớ không hiệu quả? DAVID J. Malan: Vâng. Vâng, tôi sẽ không nhất thiết phải nói không hiệu quả. Nhưng nó chi phí bạn nhiều bộ nhớ hơn, bởi vì bạn cần 32 bit cho mỗi nút cho con trỏ thêm, tại ít nhất là cho một danh sách liên kết đơn lẻ. Bây giờ, nếu bạn chỉ lưu trữ các số nguyên và bạn đang thêm con trỏ, đó là thực sự loại không tầm thường. Nó tăng gấp đôi số lượng bộ nhớ. Nhưng trong thực tế, nếu bạn đang lưu trữ một danh sách liên kết các cấu trúc có thể có 8 byte, 16 byte, thậm chí nhiều hơn thế, có thể nó ít một chi phí cận biên. Nhưng đó là một chi phí dù sao. Vì vậy, một trong những người sẽ đã được tốt như nhược điểm. 18. Sử dụng PHP thay vì C để viết một chương trình dòng lệnh. Vì vậy, ở đây, nó thường nhanh hơn để sử dụng một ngôn ngữ như PHP hay Ruby hay Python. Bạn chỉ cần nhanh chóng mở lên một trình soạn thảo văn bản. Bạn có nhiều chức năng hơn sẵn cho bạn. PHP có bồn rửa nhà bếp của các chức năng, trong khi đó trong C, bạn có rất, rất ít. Trong thực tế, các chàng trai biết cách cứng bạn không có bảng băm. Bạn không có danh sách liên kết. Nếu bạn muốn những người, bạn phải thực hiện chúng mình. Vì vậy, một tăng của PHP hoặc thực sự bất kỳ ngôn ngữ diễn giải là sự nhanh chóng mà bạn có thể viết mã. Nhưng một nhược điểm, chúng tôi thấy điều này khi tôi nhanh chóng đánh lên một misspeller thực hiện trong bài giảng sử dụng PHP, là rằng việc sử dụng một ngôn ngữ giải thích thường chậm hơn. Và chúng tôi thấy rằng trình diễn với một tăng trong thời gian từ 0,3 giây đến 3 giây, vì việc giải thích đó thực sự xảy ra. Ngược khác là bạn không cần phải biên dịch. Vì vậy, nó cũng tăng tốc phát triển tình cờ, bởi vì bạn không có hai bước để chạy một chương trình. Bạn chỉ có một. Và đó là khá hấp dẫn là tốt. Sử dụng một cơ sở dữ liệu SQL thay vì một tập tin CSV để lưu trữ dữ liệu. Cơ sở dữ liệu SQL để được sử dụng cho pset7. Các tập tin CSV bạn không sử dụng nhiều. Nhưng bạn sử dụng nó một cách gián tiếp trong pset7 như cũng nói chuyện với Yahoo Finance. Nhưng CSV là giống như một tập tin Excel nhưng siêu đơn giản, nơi mà các cột chỉ demarked bằng dấu phẩy bên trong của một tập tin văn bản khác. Và sử dụng một cơ sở dữ liệu SQL là thêm một chút hấp dẫn. Đây là một xu hướng tăng, bởi vì bạn có được những thứ như lựa chọn và chèn và xóa. Và bạn nhận được, có lẽ, chỉ số đó MySQL và cơ sở dữ liệu khác, như Oracle, xây dựng cho bạn trong bộ nhớ, mà có nghĩa là lựa chọn của bạn có lẽ không sẽ đầu tuyến tính xuống dưới. Nó thực sự có được một cái gì đó như tìm kiếm nhị phân hoặc một cái gì đó tinh thần tương tự. Vì vậy, họ thường nhanh hơn. Tuy nhiên, một nhược điểm là nó chỉ là công việc nhiều hơn. Đó là nỗ lực nhiều hơn. Bạn phải hiểu cơ sở dữ liệu. Bạn phải cài đặt nó. Bạn cần một máy chủ để chạy rằng cơ sở dữ liệu trên. Bạn cần phải hiểu làm thế nào để cấu hình nó. Vì vậy, đây chỉ là những các loại thương mại-off. Trong khi một tập tin CSV, bạn có thể tạo ra nó với gedit. Và bạn tốt để đi. Không có phức tạp hơn thế. Sử dụng một Trie thay vì một bảng băm với chain riêng biệt để lưu trữ một từ điển các từ gợi nhớ của pset5. Vì vậy, một cố xu hướng tăng, trong lý thuyết ít nhất, là những gì? Thời gian liên tục, ít nhất là nếu bạn băm trên mỗi cá nhân chữ cái trong một từ, như bạn có thể có cho pset5. Đó có thể là năm băm, sáu băm nếu có năm hoặc sáu chữ cái trong từ. Và đó là khá tốt. Và nếu có một trên ràng buộc về cách dài từ của bạn có thể được, đó là thời gian thực sự tiệm cận không đổi. Trong khi một bảng băm với riêng chaining, vấn đề có với loại cấu trúc dữ liệu là thực hiện các thuật toán của bạn thường phụ thuộc vào số thứ đã có trong cấu trúc dữ liệu. Và đó chắc chắn là trường hợp với dây chuyền, theo đó các công cụ hơn bạn đưa vào một bảng băm, còn những dây chuyền đi, có nghĩa là trong điều tồi tệ nhất trường hợp, điều bạn có thể tìm kiếm là tất cả các con đường ở phần cuối của một những dây chuyền, mà hiệu quả chuyển giao các thành cái gì đó tuyến tính. Bây giờ, trong thực tế, nó có thể hoàn toàn là trường hợp đó một bảng băm với chuỗi là nhanh hơn so với một tương ứng thực hiện Trie. Nhưng đó là vì nhiều lý do, trong số được cố gắng sử dụng một toàn bộ rất nhiều bộ nhớ có thể, trên thực tế, mọi thứ chậm xuống, bởi vì bạn không có được tốt đẹp lợi ích của một cái gì đó gọi là bộ nhớ đệm, nơi mà mọi thứ có được gần nhau trong bộ nhớ có thể được truy cập thường nhanh hơn. Và đôi khi bạn có thể đến với một hàm băm thực sự tốt. Ngay cả khi bạn phải tốn một chút bộ nhớ, bạn có thể, thực sự, có thể tìm thấy những thứ nhanh chóng và không xấu như tuyến tính. Vì vậy, trong ngắn hạn, không nhất thiết phải có với bất kỳ các một hoặc thậm chí hai những việc cụ thể chúng tôi đang tìm kiếm. Thực sự bất cứ điều gì có sức thuyết phục như một lộn ngược và nhược điểm thường bắt gặp ánh mắt của chúng tôi. ROB Bowden: Vì vậy, xu hướng tăng, chúng tôi đã làm không chấp nhận ngày của riêng mình "nhanh hơn." Anh phải nói điều gì đó về nó. Ngay cả khi bạn nói về mặt lý thuyết nhanh hơn, chúng tôi biết rằng bạn loại hiểu rằng đó là 0 của 1. Và bảng băm, về mặt lý thuyết, không phải là 0 trong tổng số 1. Đề cập đến bất cứ điều gì về thời gian chạy nói chung có bạn điểm. Nhưng "nhanh hơn," hầu hết các giải pháp trên hội đồng quản trị lớn mà cố gắng được là khách quan chậm hơn so với các giải pháp đó là bảng băm. Vì vậy, nhanh hơn trong và của chính nó là không thực sự đúng. DAVID J. Malan: Dom dom dom de. Có lẽ tôi là người duy nhất nhận ra rằng đó là làm thế nào mà là nghĩa vụ phải được phát âm, phải không? ROB Bowden: thực sự tôi không có ý kiến. DAVID J. Malan: Nó làm cảm giác trong đầu tôi. ROB Bowden: tôi đang làm này. OK. Vì vậy, đây là một trong những nơi mà bạn đã phải rút ra sơ đồ tương tự như bạn có thể đã thấy trong các kỳ thi vừa qua. Vì vậy, chúng ta hãy nhìn vào điều này. Vì vậy, từ nút HTML, chúng ta có hai trẻ em, người đứng đầu và cơ thể. Vì vậy, chúng tôi chi nhánh - đứng đầu và cơ thể. Người đứng đầu có một thẻ tiêu đề. Vì vậy, chúng tôi có một tiêu đề. Bây giờ, có một điều rất nhiều người dân quên là các nút văn bản là yếu tố bên trong cây này. Vì vậy, ở đây chúng tôi xảy ra để thu hút họ như hình bầu dục để phân biệt với các loại nút. Nhưng thông báo cũng ở đây chúng tôi có hàng đầu, giữa và cuối sẽ kết thúc được các nút văn bản. Vì vậy, quên đi những đã phần nào một sai lầm phổ biến. Cơ thể có ba đứa con - ba divs. Vì vậy, div, div, div và sau đó văn bản nút con của những người divs. Đó là khá nhiều đó cho câu hỏi đó. DAVID J. Malan: Và đó là đáng chú ý, mặc dù chúng tôi không dừng lại ở những chi tiết trong thời gian chúng ta dành trên JavaScript, rằng thứ tự nào, trong Trên thực tế, vấn đề về mặt kỹ thuật. Vì vậy, nếu đầu đến trước khi cơ thể trong HTML, sau đó nó sẽ xuất hiện vào bên trái của cơ thể trong DOM thực tế. Rằng mình là, nói chung, chỉ FYI, một cái gì đó gọi là thứ tự tài liệu, nơi nó không thành vấn đề. Và nếu bạn đang thực hiện một phân tích cú pháp, một chương trình đọc HTML trong xây dựng lên cây trong bộ nhớ, phải trung thực, đó là trực giác có thể là những gì bạn làm anyway - trên xuống dưới, trái sang phải. ROB Bowden: Các câu hỏi về điều đó? Tôi có nên làm tiếp theo? DAVID J. Malan: Chắc chắn. ROB Bowden: OK. Vì vậy, đây là tràn bộ đệm câu hỏi tấn công. Điều chủ yếu để nhận ra ở đây là, tốt, thế nào có thể là một thủ thuật kẻ thù chương trình này vào thực hiện mã tùy ý? Vì vậy, argv1, dòng lệnh đầu tiên đối số cho chương trình này, có thể được tùy tiện lâu. Nhưng ở đây chúng tôi đang sử dụng memcpy để sao chép argv1, mà ở đây là quán bar. Chúng tôi đang đi qua nó như là đối số. Và do đó, nó tham gia vào các thanh tên. Vì vậy, chúng tôi đang memcpying thanh vào bộ đệm này c. Bao nhiêu byte chúng ta sao chép? Tuy nhiên cũng nhiều byte thanh xảy ra được sử dụng, độ dài của tham số. Nhưng c chỉ 12 byte rộng. Vì vậy, nếu chúng ta gõ một số dòng lệnh đó là dài hơn 12 byte, chúng tôi sẽ tràn này đệm cụ thể. Bây giờ, làm thế nào một kẻ thù có thể lừa chương trình vào thực thi mã tùy ý? Vì vậy, hãy nhớ rằng ở đây chính đang kêu gọi foo. Và như vậy thì cuộc gọi chính foo. Chúng ta hãy vẽ này. Vì vậy, chúng ta có ngăn xếp của chúng tôi. Và chính có một stack frame ở phía dưới. Tại một số điểm, các cuộc gọi chính foo. Vâng, ngay lập tức, cuộc gọi chính foo. Và do đó foo được stack frame riêng của mình. Bây giờ, tại một số điểm, foo sẽ trở lại. Và đi trở lại foo, chúng ta cần phải biết tại những gì dòng mã bên trong của chúng tôi chủ yếu là để biết được nơi chúng ta nên tiếp tục trong chính. Chúng ta có thể gọi foo từ một tổng thể loạt các địa điểm khác nhau. Làm thế nào để chúng tôi biết được nơi để trở lại? Vâng, chúng ta cần phải lưu trữ ở đâu đó rằng. Vì vậy, một nơi nào đó ngay ở đây, chúng tôi lưu trữ nơi chúng tôi sẽ trở lại một lần lợi nhuận foo. Và đây là địa chỉ trả lại. Vậy làm thế nào một kẻ thù có thể tận dụng lợi thế điều này là một thực tế mà đệm này c được lưu trữ, chúng ta hãy nói, ở đây là c. Vì vậy, chúng tôi đã có 12 byte cho c. Đây là c. Và đây là foo của chồng nhẫn. Vì vậy, nếu người sử dụng độc hại xâm nhập vào hơn byte so với 12 hay rơi vào một lệnh đối số dòng đó là dài hơn 12 nhân vật, sau đó chúng ta sẽ tràn bộ đệm này. Chúng ta có thể tiếp tục đi. Và tại một số điểm, chúng tôi đi xa đủ để chúng ta bắt đầu ghi đè lên địa chỉ này trở lại. Vì vậy, một khi chúng ta ghi đè lên địa chỉ trở lại, điều này có nghĩa rằng khi foo lợi nhuận, chúng tôi quay trở lại bất cứ nơi nào người sử dụng độc hại được nói cho nó bằng cách bất cứ điều gì giá trị nó nhập vào, bởi bất cứ điều gì ký tự người dùng nhập vào. Và do đó, nếu người sử dụng độc hại đang được đặc biệt thông minh, ông có thể có điều này quay trở lại nơi nào đó trong printDef chức năng hoặc một nơi nào đó trong malloc chức năng, chỉ cần bất cứ nơi nào tùy ý. Nhưng ngay cả thông minh hơn là những gì nếu anh ta có người sử dụng trở lại ngay tại đây. Và sau đó bạn bắt đầu thực hiện những như dòng mã. Vì vậy, tại thời điểm đó, người dùng có thể nhập bất cứ điều gì anh ta muốn vào khu vực này. Và ông đã kiểm soát hoàn toàn trên chương trình của bạn. Câu hỏi về điều đó? Vì vậy, câu hỏi tiếp theo là hoàn thành reimplementation của foo theo cách như vậy rằng nó không còn dễ bị tổn thương. Do đó, có một vài cách bạn có thể làm điều này. Chúng tôi vẫn có c chỉ là chiều dài 12. Bạn có thể đã thay đổi này như một phần của giải pháp của bạn. Chúng tôi cũng đã thêm một kiểm tra để đảm chắc chắn thanh không null. Mặc dù bạn không cần rằng đối với tín dụng đầy đủ. Vì vậy, chúng tôi đang kiểm tra đầu tiên chiều dài chuỗi các quán bar. Nếu nó lớn hơn 12, sau đó không thực sự làm các bản sao. Vì vậy, đó là một cách để sửa chữa nó. Một cách khác để sửa chữa nó là thay vì có c chỉ có chiều dài 12, có nó có chiều dài strlen (bar). Một cách khác để sửa chữa nó là thực sự chỉ cần trả lại. Vì vậy, nếu bạn đã chỉ gạt bỏ tất cả này, nếu bạn đã chỉ cần xóa tất cả dòng mã, bạn đã có thể nhận tín dụng đầy đủ, vì chức năng này không thực sự thực hiện bất cứ điều gì. Nó sao chép các dòng lệnh đối số vào một số mảng trong stack frame địa phương. Và sau đó là điều đang trở lại. Và bất cứ điều gì hoàn đã biến mất. Vì vậy, trở lại cũng là một đầy đủ cách để nhận được tín dụng đầy đủ. DAVID J. Malan: Không hoàn toàn tinh thần của các câu hỏi, nhưng chấp nhận được theo đặc tả dù sao. ROB Bowden: Các câu hỏi về điều đó? Một trong những điều mà bạn ít nhất cần thiết để có biên dịch mã. Vì vậy, mặc dù kỹ thuật bạn có không dễ bị tổn thương nếu mã của bạn không biên dịch, chúng tôi không chấp nhận điều đó. Không có câu hỏi? OK. DAVID J. Malan: Bạn có muốn nói danh hiệu này? ROB Bowden: số DAVID J. Malan: Vì vậy, trong một này, điều này hoặc là tin tốt hay tin xấu. Đây là nghĩa đen cùng một vấn đề như các bài kiểm tra đầu tiên. Và nó gần như giống nhau vấn đề như pset1. Nhưng nó đã cố tình đơn giản hóa được một kim tự tháp đơn giản, một trong đó có thể giải quyết với một chút lặp đi lặp lại đơn giản hơn. Và thực sự, những gì chúng tôi đã nhận được ở đây là không quá nhiều logic, bởi vì có lẽ, bởi thời điểm này, bạn thoải mái hơn so với bạn là trong tuần với một vòng lặp for hoặc lý do tại sao các vòng, nhưng thực sự trêu chọc nhau mà bạn là một chút thoải mái với quan điểm cho rằng PHP không chỉ là về những gì lập trình. Nó thực sự có thể được sử dụng như một ngôn ngữ để viết các chương trình dòng lệnh. Và quả thật, đó là những gì chúng tôi đã cố gắng để hút sự chú ý của bạn để. Đây là một chương trình PHP dòng lệnh. Do đó, C mã ở đây, trong khi đúng trong C, không chính xác cho PHP. Nhưng mã thực sự là như nhau. Nếu bạn so sánh các giải pháp cho quiz 0 chống lại đố 1, bạn sẽ thấy rằng nó gần như giống hệt nhau, ngoại trừ một số dấu hiệu đồng đô la và cho trường hợp không có một kiểu dữ liệu. Đặc biệt, nếu chúng ta có một cái nhìn ở đây, bạn sẽ thấy rằng chúng ta lặp, trong này trường hợp, từ 1 lên đến 7. Chúng ta có thể thực hiện nó 0 chỉ số. Nhưng đôi khi, tôi nghĩ rằng nó chỉ tinh thần dễ dàng hơn để nghĩ về những điều 1-7. Nếu bạn muốn một khối, sau đó hai khối, sau đó ba, sau đó dấu chấm, dấu chấm, chấm bảy. Chúng tôi đã j được khởi tạo bằng 1 và sau đó đếm trên lên đến tôi. Và tất cả mọi thứ ở đây là nếu không giống hệt nhau. Nhưng đáng chú ý là một vài điều. Chúng tôi cung cấp cho bạn hai dòng, điều này đầu tiên một, goofily được đặt tên là một công việc cho nổ mạnh. Và rằng chỉ cần chỉ định đường dẫn, thư mục, trong đó có một chương trình có thể được thấy rằng bạn muốn sử dụng để giải thích tập tin này. Và sau đó dòng sau đó, của Tất nhiên, có nghĩa là vào chế độ PHP. Và dòng ở dưới cùng rất có nghĩa là chế độ thoát PHP. Và các công trình này, nói chung, với giải thích ngôn ngữ. Đó là loại gây phiền nhiễu nếu bạn viết một chương trình trong một tập tin gọi là foo.php. Và sau đó người dùng của bạn phải chỉ nhớ, OK, để chạy chương trình này, tôi phải gõ "không gian php foo.php." Loại gây phiền nhiễu nếu không có gì khác. Và nó cũng cho thấy rằng chương trình của bạn được viết bằng PHP, mà không phải là tất cả mà chiếu sáng cho người sử dụng. Vì vậy, bạn có thể loại bỏ các php. Hoàn toàn nhớ lại từ bài giảng. Và bạn thực sự có thể làm. / Foo nếu bạn đã chmodded nó bằng cách làm cho nó thực thi. Vì vậy, chmod a + x foo sẽ làm điều đó. Và nếu bạn cũng có thể thêm các công việc đây. Nhưng thực sự, vấn đề đã nhận được ở in ra một cái gì đó như thế này. Không có HTML, không có C-mã chắc chắn, chỉ là một số PHP. Vì vậy, Milo sau đó trở về trong vấn đề 25. Và 25, bạn đã được đưa ra sau đây đang xương, đó là một trang web khá đơn giản. Và phần ngon ngọt HTML-khôn ngoan giảm ở đây, nơi chúng tôi có bên trong cơ thể một hình thức có ID duy nhất của yếu tố đầu vào trong số đó là hai yếu tố đầu vào, một với một ý tưởng về tên, một với một ý tưởng nút. Việc đầu tiên là loại văn bản, thứ hai có kiểu trình. Và vì vậy chúng tôi đã cho bạn, thực sự, hơn thành phần hơn bạn cần, chỉ cần như vậy các bạn có tùy chọn mà để giải quyết vấn đề này. Bạn không cần phải chặt chẽ tất cả các ID. Nhưng nó cho phép bạn để giải quyết nó theo những cách khác nhau. Và ở đầu trang, nhận thấy rằng mục tiêu là để kích hoạt một cửa sổ như thế này - Xin chào, Milo - để bật lên trong trình duyệt sử dụng siêu đơn giản, nếu không xấu xí, chức năng cảnh báo. Và như vậy, cuối cùng, điều này nắm khái niệm bằng cách nào đó lắng nghe đệ trình của các hình thức phía máy khách , Không phải là phía máy chủ, bằng cách nào đó đáp ứng trình đó bằng cách lấy giá trị mà người dùng gõ vào các trường tên, và sau đó hiển thị nó trong cơ thể của một cảnh báo. Vì vậy, một trong những cách bạn có thể làm điều này là với jQuery, trông một chút cú pháp bối rối lúc đầu tiên. Bạn có thể làm điều này với mã DOM tinh khiết - document.getelement bởi ID. Nhưng chúng ta hãy nhìn vào phiên bản này. Tôi có một vài quan trọng dòng đầu tiên. Vì vậy, một, chúng tôi có dòng này, đó là giống hệt với những gì bạn có thể đã thấy trong, tôi tin rằng, form2.html từ lớp trong tuần 9. Và điều này chỉ nói rằng, thực hiện các mã sau khi các tài liệu đã sẵn sàng. Điều này là quan trọng chỉ vì Các trang HTML được đọc trên xuống dưới, trái sang phải. Và do đó, nếu bạn cố gắng làm một cái gì đó trong mã lên đây để một số DOM yếu tố, một số thẻ HTML, đó là xuống ở đây, bạn đang làm nó quá sớm, bởi vì điều này có thậm chí không được đọc vào bộ nhớ. Vì vậy, bằng cách nói document.ready này dòng, chúng tôi đang nói, đây là một số mã, trình duyệt. Nhưng không thực hiện điều này cho đến khi toàn bộ tài liệu đã sẵn sàng, đó là DOM cây tồn tại trong bộ nhớ. Đây là một trong nhiều hơn một chút đơn giản, nếu cú ​​pháp một chút khác nhau, nơi tôi nói, lấy các phần tử HTML mà độc đáo nhận dạng là yếu tố đầu vào. Đó là những gì các tag băm biểu thị, các ID duy nhất. Và sau đó tôi sẽ gọi. Trình. Như vậy. Trình đây là một chức năng, nếu không được biết đến như một phương pháp, đó là bên trong của đối tượng trên bên trái bên đó mà tôi đã không làm nổi bật. Vì vậy, nếu bạn nghĩ rằng yếu tố đầu vào như một đối tượng trong bộ nhớ - và thực sự nó là. Đó là một nút trong một cây - . Trình phương tiện khi hình thức này với ID này được gửi, thực hiện các mã sau đây. Tôi không quan tâm những gì tên của chức năng là tôi đang thực hiện. Vì vậy, ở đây tôi đang sử dụng, như trước đây, những gì gọi là chức năng lambda hoặc một chức năng ẩn danh. Nó không phải ở tất cả trí tuệ thú vị khác hơn là nó không có tên, đó là tốt nếu bạn chỉ bao giờ sẽ gọi nó một lần. Và bên trong có tôi thực sự xử lý nộp mẫu đơn. Đầu tiên tôi khai báo một biến gọi là giá trị. Và sau đó là hiệu quả của việc này là gì nhấn mạnh phần ở đây bây giờ? Điều đó có làm ở một mức độ cao đối với tôi? ĐỐI TƯỢNG: Nó được giá trị mà người sử dụng không trong HTML dưới đây. Nó được ID đó và sau đó tìm thấy giá trị của nó. DAVID J. Malan: Chính xác. Nó lấy các nút, mà độc đáo định danh là tên. Nó được giá trị trong đó, mà là, có lẽ, những gì người dùng gõ chính mình. Và sau đó nó lưu rằng trong biến được gọi là giá trị. Như một sang một bên, bạn có thể có cũng thực hiện điều này một chút khác nhau. Hoàn toàn chấp nhận được bằng cách làm một cái gì đó giá trị lời nói dối var được document.getElementById. Và đây là lý do tại sao nó là một chút tẻ nhạt để không sử dụng jQuery. "Tên" giá trị.. Vì vậy, hoàn toàn chấp nhận được. Cách khác nhau để làm điều này. jQuery chỉ có xu hướng được nhiều hơn một chút gọn gàng và chắc chắn phổ biến hơn giữa các lập trình viên. Bây giờ, tôi đang làm một chút của một sự tỉnh táo kiểm tra, bởi vì trong vấn đề tuyên bố chúng tôi đã nói một cách rõ ràng, nếu người sử dụng chưa gõ của mình tên, không hiển thị một cảnh báo. Nhưng bạn có thể kiểm tra cho rằng, bằng cách chỉ kiểm tra các chuỗi sản phẩm nào cho một quote-unquote nếu có không có gì thực sự ở đó. Nhưng nếu nó không phải bằng quote-unquote, Tôi muốn gọi cảnh báo. Và một phần thú vị ở đây là chúng ta đang sử dụng các nhà điều hành cộng, mà làm những gì trong JavaScript? Nối. Vì vậy, nó giống như PHPs dấu chấm. Cùng một ý tưởng, cú pháp hơi khác nhau. Và tôi chỉ cần tạo ra các chuỗi bạn thấy trên ảnh chụp màn hình - Xin chào, vậy và như vậy. Và sau đó chi tiết cuối cùng là thế này. Tại sao tôi trở lại bên trong sai chức năng ẩn danh này? ĐỐI TƯỢNG: Không có giá trị. Bạn đặt nó ở dạng. Nó chỉ nói, nếu giá trị không phải là bằng trống, sau đó làm điều đó. Có một trống trong trình đó. DAVID J. Malan: OK. Cẩn thận mặc dù. Không có ai khác ở đây. Và return false là bên ngoài của nếu có điều kiện. Vì vậy, đây được đánh dấu dòng, trở lại sai, thực hiện không có vấn đề gì khi biểu mẫu được gửi. Những gì không trở về bên trong giả này xử lý sự kiện, như nó được gọi là, các sự kiện trong câu hỏi được trình? ĐỐI TƯỢNG: Bởi vì nó chỉ xảy ra một lần. DAVID J. Malan: Chỉ xảy ra một lần. Không hoàn toàn. Yeah? ĐỐI TƯỢNG: Nó ngăn chặn các hình thức từ trình hành vi mặc định, mà sẽ làm cho tải lại trang. DAVID J. Malan: Chính xác. Vì vậy, tôi quá tải thời hạn nộp đây, bởi vì tôi đang nói, hình thức là được gửi. Nhưng như bạn đề nghị, nó thực sự không được đệ trình theo cách HTTP sự thật. Khi bạn nhấn Submit, vì chúng tôi xử lý onSubmit, chúng ta chặn mà hình thức trình như vậy để nói chuyện. Chúng tôi sau đó làm việc của chúng tôi với mã JavaScript. Nhưng tôi cố tình trở về sai, bởi vì những gì tôi không muốn xảy ra một phân chia thứ hai sau đó là cho cả hình thức bản thân để trình web máy chủ với cặp giá trị quan trọng bằng cách thay đổi URL là một cái gì đó như q = mèo hoặc bất cứ điều gì chúng tôi đã làm, Ví dụ, trong lớp học. Tôi không muốn điều đó xảy ra, bởi vì không có nghe máy chủ này tạo trình. Nó hoàn toàn thực hiện trong mã JavaScript. Và đó là lý do tại sao tôi thậm chí không có một hành động thuộc tính trên hình thức của tôi, bởi vì tôi không có ý định cho điều này bao giờ đi đến máy chủ. Vì vậy, nó đã được nộp. Nhưng chúng ta đang ngăn chặn hình thức trình và ngăn chặn mặc định hành vi, mà là để thực sự đi tất cả các cách để các máy chủ. ĐỐI TƯỢNG: Vì vậy, giữ nó phía khách hàng. DAVID J. Malan: Giữ nó phía khách hàng. Chính xác. Lên tiếp theo là của tôi oh MySQL. ROB Bowden: OK. Vì vậy, câu hỏi đầu tiên này nói chung thô cho người dân. Mặc dù những người sau đó đã tốt hơn. Vì vậy, bạn phải lựa chọn các dữ liệu chính xác loại cho cả hai cột. Và cả hai có một số điều về họ mà làm cho sự lựa chọn khó khăn. Vì vậy, int không phải là một hợp lệ gõ cho số. Lý do là một tài khoản 12 chữ số số, một int là không đủ lớn để lưu trữ tổng số chữ số. Vì vậy, một sự lựa chọn hợp lệ sẽ là một lớn int nếu bạn xảy ra để biết điều đó. Một lựa chọn khác có thể có được một lĩnh vực char chiều dài 12. Vì vậy, một trong những người sẽ làm việc. Int sẽ không được. Bây giờ, sự cân bằng, nghĩ lại pset7. Vì vậy, chúng tôi đặc biệt sử dụng số thập phân để lưu trữ các giá trị cổ phần hoặc - DAVID J. Malan: Tiền mặt. ROB Bowden: Tiền mặt. Chúng tôi sử dụng số thập phân để lưu trữ số lượng tiền mà người sử dụng hiện có. Vì vậy, lý do chúng tôi làm điều đó là bởi vì, hãy nhớ, phao nổi. Có dấu chấm động trong độ chính xác. Nó không có thể lưu trữ một cách chính xác tiền mặt giá trị như chúng tôi muốn ở đây. Vì vậy, số thập phân có thể chính xác cửa hàng một cái gì đó để, nói, hai chữ số thập phân. Đó là lý do tại sao cân bằng, chúng tôi muốn nó là số thập phân và không nổi. DAVID J. Malan: Và cũng có thể, quá, mặc dù nó có thể là thông minh trong khác bối cảnh để suy nghĩ, có lẽ điều này là cơ hội để một int. Tôi sẽ theo dõi những thứ trong đồng xu. Bởi vì chúng tôi đã cho thấy một cách rõ ràng mặc định giá trị của việc 100.00, mà có nghĩa là nó chỉ có thể là một int. Và một sự tinh tế quá với số là nó không có nghĩa là là một câu hỏi trick. Nhưng nhớ lại rằng một int trong MySQL, như trong C, ít nhất là trong thiết bị, là 32-bit. Và mặc dù chúng tôi không mong đợi bạn biết chính xác có bao nhiêu chữ số mà phương tiện, làm nhớ lại rằng số lượng lớn nhất bạn có thể đại diện cho khả năng với một số 32-bit là khoảng những gì? Số những gì chúng ta luôn luôn nói không? 2 đến 32, đó là những gì gần? Bạn không cần phải biết chính xác. Nhưng khoảng là hữu ích trong cuộc sống. Đó là khoảng 4 tỷ USD. Vì vậy, chúng tôi đã nói rằng một vài lần. Tôi biết tôi đã nói rằng một vài lần. Và nó là khoảng 4 tỷ USD. Và đó là một nguyên tắc của ngón tay cái biết. Nếu bạn có 8 bit, 256 là con số kỳ diệu. Nếu bạn có 32 bit, 4 tỷ cho hay phải mất. Vì vậy, nếu bạn chỉ cần viết xuống 4 tỷ USD, bạn sẽ thấy rằng nó ít chữ số hơn 12, có nghĩa là rõ ràng không đủ biểu cảm để nắm bắt một Số tài khoản 12 chữ số. ROB Bowden: OK. Vì vậy, những người khác đã đi tốt hơn. Vì vậy, giả sử rằng ngân hàng áp đặt một hàng tháng $ 20 phí bảo trì trên tất cả các tài khoản. Với những gì truy vấn SQL có thể ngân hàng trừ $ 20 từ tất cả các tính, ngay cả khi nó kết quả trong một số cân đối tiêu cực? Vì vậy, về cơ bản, có bốn loại chính của các truy vấn - chèn, chọn, cập nhật, và xóa. Vì vậy, những gì chúng ta nghĩ chúng ta sẽ sử dụng ở đây? Cập nhật. Vì vậy, chúng ta hãy có một cái nhìn. Vì vậy, ở đây chúng tôi đang cập nhật. Bảng những gì chúng tôi đang cập nhật tài khoản? Để cập nhật tài khoản. Và sau đó là cú pháp cho biết, những gì trong tài khoản được chúng tôi cập nhật? Vâng, chúng tôi đang thiết lập sự cân bằng bằng giá trị hiện tại của sự cân bằng trừ đi 20. Vì vậy, đây sẽ cập nhật tất cả các hàng tài khoản, trừ $ 20 từ sự cân bằng. DAVID J. Malan: Một sai lầm phổ biến ở đây, mặc dù đôi khi chúng ta tha thứ cho nó, là thực sự có mã PHP ở đây kêu gọi các chức năng truy vấn hoặc đưa dấu ngoặc kép quanh tất cả mọi thứ không cần phải có mặt ở đó. ROB Bowden: Hãy nhớ rằng MySQL là một ngôn ngữ riêng biệt từ PHP. Chúng tôi tình cờ được viết MySQL trong PHP. Và PHP sau đó gửi nó hơn với máy chủ MySQL. Nhưng bạn không cần PHP để giao tiếp với một máy chủ MySQL. DAVID J. Malan: Chính xác. Vì vậy, không có dấu hiệu biến đô la nên trong bối cảnh này. Nó chỉ có thể làm tất cả các môn toán trong cơ sở dữ liệu riêng của mình. ROB Bowden: OK. Vì vậy, một trong những tiếp theo. Đây có phải là người tiếp theo? Yeah. Vì vậy, với những gì truy vấn SQL có thể ngân hàng lấy số tài khoản của mình khách hàng giàu có nhất, những người có số dư lớn hơn 1.000? Vì vậy mà trong bốn loại chính chúng ta sẽ muốn ở đây? Chọn. Vì vậy, chúng tôi muốn chọn. Chúng ta muốn gì để lựa chọn? Cột những gì chúng ta muốn chọn? Chúng tôi sẽ đặc biệt muốn để chọn số. Nhưng nếu bạn nói sao, chúng tôi cũng chấp nhận điều đó. Vì vậy, chọn số từ những gì bảng? Tài khoản. Và sau đó điều kiện chúng ta muốn? Nơi cân bằng lớn hơn 1.000. Chúng tôi cũng chấp nhận lớn hơn hơn hoặc bằng. Tác phẩm mới nhất. Với những gì truy vấn SQL có thể ngân hàng gần, tức là xóa tất cả các tài khoản có một sự cân bằng $ 0? Vì vậy mà trong bốn chúng ta sẽ muốn sử dụng không? Xóa. Vì vậy, các cú pháp cho điều đó? Xóa từ những gì bảng? Tài khoản. Và sau đó điều kiện mà chúng tôi muốn xóa - nơi cân bằng số không. Vì vậy, xóa tất cả các hàng từ tài khoản nơi số dư bằng không. Các câu hỏi về bất cứ? Muốn xếp hàng? DAVID J. Malan: Queue dẫn. Vì vậy, trong một này, chúng tôi đã cho bạn một phần nào cấu trúc quen thuộc mà chúng tôi khám phá một bit trong lớp học cùng với các cấu trúc, đó là một dữ liệu cấu trúc liên quan đến tinh thần. Sự khác biệt mặc dù với một hàng đợi mà chúng tôi đã bằng cách nào đó nhớ người là ở phía trước của hàng đợi, trong lớn một phần để chúng tôi có thể làm nhiều hơn sử dụng hiệu quả bộ nhớ, ít nhất nếu chúng ta đang sử dụng một mảng. Vì thu hồi, nếu chúng ta có một mảng, nếu, Ví dụ, đây là mặt trước của hàng đợi, nếu tôi nhận được vào hàng đợi ở đây, và sau đó ai đó có được trong dòng phía sau tôi, phía sau tôi, phía sau tôi, và một người bước ra khỏi dòng, bạn có thể, như chúng ta đã thấy một số người của chúng tôi tình nguyện viên trong lớp học, có tất cả mọi người thay đổi theo cách này. Nhưng nói chung, tất cả mọi người đã làm một cái gì đó không phải là việc sử dụng tốt nhất thời gian trong một chương trình, bởi vì nó có nghĩa là bạn thuật toán đang chạy trong những gì thời gian chạy tiệm cận? Đó là tuyến tính. Và tôi cảm thấy như đó là ngu ngốc. Nếu người tiếp theo trong dòng là tiếp theo người là nghĩa vụ phải đi vào cửa hàng, họ không phải tất cả có để di chuyển với nhau. Chỉ cho người đó được nhổ khi thời gian đến, ví dụ. Vì vậy, chúng ta có thể tiết kiệm một chút thời gian ở đó. Và do đó, để làm điều đó, mặc dù phương tiện rằng người đứng đầu của hàng đợi hoặc phía trước của hàng đợi là sẽ dần dần di chuyển sâu hơn và sâu hơn vào mảng và cuối cùng có thể thực sự quấn quanh nếu chúng ta đang sử dụng một mảng để lưu trữ các người đợi này. Vì vậy, bạn gần như có thể nghĩ về mảng như là một dữ liệu tròn cấu trúc trong ý nghĩa đó. Vì vậy bạn nào đó phải theo dõi các kích thước của nó hoặc thực sự kết thúc của nó và sau đó, nơi bắt đầu của nó là. Vì vậy, chúng tôi đề xuất mà bạn khai báo một hàng đợi như vậy, gọi điện thoại nó q, chỉ cần một chữ cái. Sau đó, chúng tôi đề nghị phía trước được khởi tạo bằng không và rằng kích thước được khởi tạo bằng không. Vì vậy, ngay bây giờ, không có gì bên trong của hàng đợi đó. Và chúng tôi yêu cầu bạn hoàn thành thực hiện enqueue dưới đây một cách mà các chức năng bổ sung thêm n cuối q và sau đó trả về true. Nhưng nếu q là đầy đủ hay tiêu cực, các chức năng nên thay vì trả về false. Và chúng tôi đã cho bạn một vài các giả định. Nhưng chúng không thực sự chức năng có liên quan, chỉ bool tồn tại, bởi vì, về mặt kỹ thuật, bool không tồn tại trong C, trừ khi bạn có một tập tin tiêu đề nhất định. Để được chỉ cần đảm bảo có đã không là một thủ thuật này câu hỏi đại loại vậy. Vì vậy, enqueue, chúng tôi đề xuất trong mẫu các giải pháp thực hiện như sau. Một, đầu tiên chúng tôi kiểm tra một cách dễ dàng, các loại trái cây treo thấp. Nếu hàng đợi có đầy đủ hoặc số mà bạn đang cố gắng để chèn ít hơn không, mà chúng tôi đã nói trong đặc điểm kỹ thuật của vấn đề nên không được phép, vì chúng tôi chỉ muốn giá trị không âm, sau đó bạn nên chỉ trả lại sai ngay lập tức. Vì vậy, một số tương đối dễ dàng kiểm tra lỗi. Nếu mặc dù bạn muốn thêm rằng thực tế số, bạn phải làm một chút về suy nghĩ đây. Và đây là nơi mà nó là một chút khó chịu tinh thần, bởi vì bạn phải tìm ra cách để xử lý bao quanh. Nhưng mầm mống của ý tưởng ở đây đó là của quan tâm đến chúng tôi là bao quanh đó thường ngụ ý số học mô-đun và các nhà điều hành mod, bên phần trăm, nơi bạn có thể đi từ một giá trị lớn hơn trở về số không và sau đó một và hai và ba và sau đó trở lại khoảng không, một và hai và ba và vv một lần nữa và một lần nữa. Vì vậy, cách chúng tôi đề xuất làm điều này là mà chúng ta muốn đánh chỉ mục vào mảng gọi là số nơi số nguyên của chúng tôi nói dối. Nhưng để đạt được điều đó, trước tiên chúng ta muốn làm bất kể kích thước của hàng đợi là nhưng sau đó thêm vào đó bất cứ điều gì phía trước của danh sách là. Và hiệu quả của việc đó là để đưa chúng tôi tại đúng vị trí trong hàng đợi và không cho rằng người đầu tiên trong dòng là ngay từ đầu, mà người cô hoàn toàn có thể nếu chúng ta cũng đã được thay đổi tất cả mọi người. Nhưng chúng ta chỉ cần tạo ra công việc cho chính chúng ta nếu chúng ta con đường cụ thể. Vì vậy chúng tôi có thể giữ nó tương đối đơn giản. Chúng tôi phải nhớ rằng chúng ta chỉ thêm một int vào hàng đợi. Và sau đó chúng tôi chỉ trả lại sự thật. Trong khi đó, trong dequeue, chúng tôi hỏi bạn làm như sau. Thực hiện nó trong một cách mà nó dequeues, đó là loại bỏ việc và lợi nhuận, int ở phía trước của hàng đợi. Để loại bỏ các int, nó cũng đủ để quên nó. Bạn không cần phải ghi đè lên bit của nó. Vì vậy, nó vẫn thực sự có. Cũng giống như dữ liệu trên một ổ đĩa cứng, chúng tôi chỉ bỏ qua thực tế rằng nó bây giờ có. Và nếu q là trống rỗng, chúng ta nên thay vì quay trở lại tiêu cực 1. Vì vậy, điều này cảm thấy tùy ý. Tại sao lại tiêu cực 1 thay vì sai? Yeah. ĐỐI TƯỢNG: Q là lưu trữ giá trị tích cực. Kể từ khi bạn chỉ lưu trữ các giá trị tích cực trong q, tiêu cực là một lỗi. DAVID J. Malan: OK, đúng. Vì vậy, bởi vì chúng tôi chỉ lưu trữ tích cực giá trị hay không, sau đó nó tốt đến trả lại một giá trị tiêu cực như một trọng điểm giá trị, một biểu tượng đặc biệt. Nhưng bạn đang viết lại lịch sử đó, vì lý do chúng tôi chỉ trả về giá trị không âm là bởi vì chúng tôi muốn có giá trị trọng điểm. Vì vậy, cụ thể hơn, tại sao không chỉ return false trong trường hợp lỗi? Yeah. ĐỐI TƯỢNG: Bạn đã không thành công để trả lại một số nguyên. DAVID J. Malan: Chính xác. Và đây là nơi mà C được ràng buộc khá. Nếu bạn đang nói rằng bạn đang đi để trả lại một int, bạn đã có để trả lại một int. Bạn không thể có được ưa thích và bắt đầu trở lại một bool hoặc một phao hoặc một chuỗi hoặc một cái gì đó như thế. Bây giờ, trong khi đó, JavaScript và PHP và một số ngôn ngữ khác có thể, trên thực tế, bạn đã trở về khác nhau loại giá trị. Và đó thực sự có thể hữu ích, nơi bạn có thể trở lại số nguyên dương, số không, ints tiêu cực, hay sai hoặc null thậm chí để biểu lỗi. Nhưng chúng tôi không có mà tính linh hoạt trong C. Vì vậy, với dequeue, những gì chúng ta đề xuất làm là - ROB Bowden: Bạn có thể trả về false. Nó chỉ là sai là băm xác định sai số không. Vì vậy, nếu bạn quay trở lại sai, bạn đang trở về số không. Và không là một điều hợp lệ trong hàng đợi của chúng tôi, trong khi tiêu cực 1 là không nếu sai xảy ra để được tiêu cực 1. Nhưng bạn không nên thậm chí cần phải biết điều đó. DAVID J. Malan: Đó là lý do tại sao tôi không nói điều đó. ROB Bowden: Nhưng đó là không đúng sự thật rằng bạn không thể trả về false. DAVID J. Malan: Chắc chắn. Vì vậy, dequeue, thông báo chúng tôi chấp nhận làm mất hiệu lực như đối số của nó. Và đó là bởi vì chúng tôi không đi qua bất cứ điều gì in Chúng tôi chỉ muốn loại bỏ các phần tử ở phía trước của hàng đợi. Vậy làm thế nào chúng ta có thể đi về việc này? Vâng, đầu tiên, chúng ta hãy làm điều này kiểm tra sự tỉnh táo nhanh chóng. Nếu kích thước hàng đợi là 0, có không có việc phải làm. Trở lại tiêu cực 1. Thực hiện. Vì vậy, đó là một vài dòng chương trình của tôi. Vì vậy, chỉ có bốn dòng vẫn còn. Vì vậy, ở đây tôi quyết định giảm giá trị kích thước. Và giảm các kích thước hiệu quả có nghĩa là tôi quên một cái gì đó là ở đó. Nhưng tôi cũng phải cập nhật nơi mặt trước của con số này. Vì vậy, để làm được điều đó, tôi cần phải làm hai việc. Đầu tiên tôi cần phải nhớ những gì số là ở phía trước của hàng đợi, bởi vì tôi cần phải trả lại điều đó. Vì vậy tôi không muốn vô tình quên về nó và sau đó ghi đè lên nó. Tôi chỉ cần đi để nhớ trong một int. Và bây giờ, tôi muốn cập nhật q.front được q.front 1. Vì vậy, nếu điều này là người đầu tiên trong dòng, bây giờ, tôi muốn làm cộng 1 tới chỉ vào người tiếp theo trong dòng. Nhưng tôi phải xử lý bao quanh đó. Và nếu công suất là một hằng số toàn cầu, đó sẽ cho phép tôi để đảm bảo như tôi đã chỉ ra người cuối cùng trong đường, các hoạt động sẽ mang lại modulo tôi trở lại bằng không ở phía trước của hàng đợi. Và xử lý các bao quanh đây. Và sau đó tôi tiến hành trở lại n. Bây giờ, nói đúng, tôi đã không phải khai báo n. Tôi không phải lấy nó và lưu nó tạm thời, bởi vì giá trị là vẫn còn đó. Vì vậy, tôi chỉ có thể làm các phép tính số học ngay để trả lại cựu lãnh đạo của hàng đợi. Nhưng tôi chỉ cảm thấy rằng điều này là rõ ràng hơn để thực sự lấy int, đặt nó trong n, và sau đó trở về mà vì lợi ích của sự rõ ràng nhưng không thực sự cần thiết. Psst. Tất cả chúng phát âm trong đầu tôi. ROB Bowden: Câu hỏi đầu tiên Vì vậy, là vấn đề cây nhị phân. Vì vậy, câu hỏi đầu tiên là, chúng tôi đưa ra những con số. Và chúng tôi muốn bằng cách nào đó chèn chúng vào các nút như vậy mà nó là một cây tìm kiếm nhị phân hợp lệ. Vì vậy, có một điều cần nhớ về cây tìm kiếm nhị phân là nó không chỉ là điều bên trái là ít hơn và là điều phải bên phải là lớn hơn. Nó cần phải được rằng toàn bộ cây bên trái là ít hơn, và toàn bộ cây bên phải là lớn hơn. Vì vậy, nếu tôi đặt 34 đây ở đầu trang, và sau đó Tôi đặt 20 ở đây, vì vậy đó là hợp lệ để đến nay, bởi vì 34 ở đây. 20 đang diễn ra bên trái. Vì vậy, đó là ít. Nhưng tôi không thể sau đó đặt 59 ở đây, bởi vì mặc dù 59 là trên bên phải của 20, nó vẫn còn ở bên trái 34. Vì vậy, với ràng buộc trong tâm trí, Cách đơn giản nhất của thể giải quyết điều này vấn đề là chỉ cần loại của những con số - để 20, 34, 36, 52, 59, 106. Và sau đó chèn những từ trái sang phải. Vì vậy, 20 tại đây. 34 tại đây. 36 tại đây. 52, 59, 106. Và bạn cũng có thể đã tìm ra với một số cắm vào và thực hiện, oh, chờ đợi, tôi không có đủ số để điền vào đây ở đây. Vì vậy, tôi cần phải reshift những gì của tôi tuyến đường lưu ý là có được. Nhưng nhận thấy rằng trong trận chung kết ba, nếu bạn đọc từ trái sang phải, đó là trong thứ tự tăng dần. Vì vậy, bây giờ, chúng tôi muốn khai báo những gì cấu trúc là có được cho các nút trong cây này. Vì vậy, những gì chúng ta cần trong một cây nhị phân? Vì vậy, chúng ta có một giá trị của loại int, vì vậy một số giá trị int. Tôi không biết những gì chúng ta gọi là nó trong các giải pháp - int n. Chúng ta cần một con trỏ đến con trái và một con trỏ tới các con phải. Vì vậy, nó sẽ trông như thế này. Và nó thực sự sẽ xem xét trước khi khi nào các liên kết kép danh sách các công cụ, vì vậy thông báo - Tôi sẽ phải di chuyển tất cả các cách quay trở lại vấn đề 11. Vì vậy, nhận thấy nó trông giống hệt này, ngoại trừ chúng tôi chỉ xảy ra để gọi những tên gọi khác nhau. Chúng tôi vẫn có một số nguyên giá trị và hai con trỏ. Nó chỉ là thay vì điều trị con trỏ như chỉ vào điều tiếp theo và điều trước, chúng tôi đang điều trị các con trỏ để trỏ đến một con trái và con phải. OK. Vì vậy, đó là nút cấu trúc của chúng tôi. Và bây giờ, chức năng duy nhất chúng ta cần phải thực hiện việc này là đi qua, mà chúng tôi muốn đi qua cây, in ấn ra các giá trị của cây theo thứ tự. Vì vậy, nhìn ở đây, chúng tôi muốn in ra 20, 34, 36, 52, 59, và 106. Làm thế nào để chúng ta thực hiện điều đó? Vì vậy, nó khá tương tự. Nếu bạn nhìn thấy trong kỳ thi vừa qua vấn đề mà bạn muốn in ra toàn bộ cây bằng dấu phẩy ở giữa tất cả mọi thứ, nó đã thực sự thậm chí dễ dàng hơn đó. Vì vậy, đây là giải pháp. Này được dễ dàng hơn đáng kể nếu bạn đã làm nó đệ quy. Tôi không biết nếu có ai cố gắng để làm điều đó lặp đi lặp lại. Nhưng trước tiên, chúng ta có trường hợp cơ sở của chúng tôi. Nếu gốc là null? Sau đó chúng ta chỉ cần đi trở lại. Chúng tôi không muốn in bất cứ điều gì. Khác chúng ta sẽ đi qua đệ quy xuống. In toàn bộ cây con bên trái. Vì vậy, tất cả mọi thứ in ít hơn giá trị hiện tại của tôi. Và sau đó tôi sẽ in bản thân mình. Và sau đó tôi sẽ recurse xuống của tôi toàn bộ cây con bên phải, vì vậy tất cả mọi thứ lớn hơn giá trị của tôi. Và điều này sẽ in ra tất cả mọi thứ theo thứ tự. Câu hỏi về cách thức này thực sự hoàn thành điều đó không? ĐỐI TƯỢNG: Tôi có một câu hỏi trên [nghe được]. ROB Bowden: Vì vậy, một cách tiếp cận bất kỳ vấn đề đệ quy là chỉ cần nghĩ về nó như bạn phải suy nghĩ về tất cả các trường hợp góc. Vì vậy, xem xét rằng chúng tôi muốn in toàn bộ cây này. Vì vậy, tất cả chúng ta sẽ tập trung vào là nút đặc biệt này - 36. Các cuộc gọi đệ quy, chúng tôi giả vờ những người chỉ làm việc. Vì vậy, ở đây, gọi đệ quy này đi qua, chúng tôi thậm chí không cần suy nghĩ về nó, chỉ cần đi qua bên trái ba, tưởng tượng rằng đã in 20 và 34 đối với chúng tôi. Và sau đó khi chúng tôi cuối cùng đệ quy gọi đi qua trên đúng, đó sẽ in một cách chính xác 52, 59, và 106 cho chúng tôi. Vì vậy, cho rằng điều này có thể in 20, 34, và khác có thể in 52, 59, 108, tất cả chúng ta cần để có thể làm là in ourself ở giữa đó. Vì vậy, in ra tất cả mọi thứ trước khi chúng tôi. In ourself, do đó nút in hiện tại 36, printf thường xuyên, và sau đó in tất cả mọi thứ sau khi chúng tôi. DAVID J. Malan: Đây là nơi đệ quy được thực sự đẹp. Đó là bước nhảy vọt này tuyệt vời của đức tin nơi bạn làm các bit nhỏ nhất của công trình. Và sau đó bạn hãy để một người nào đó khác làm phần còn lại. Và người khác là, trớ trêu thay, bạn. Vì vậy, cho đên điểm nghiêm trọng, nếu bạn di chuyển lên trên những câu hỏi - ROB Bowden: Trên các câu hỏi? DAVID J. Malan: Và xuống một chút để những con số, không ai biết nơi những con số này đến từ đâu? ROB Bowden: Tôi có nghĩa là không có ý tưởng. DAVID J. Malan: Chúng xuất hiện trong suốt bài kiểm tra. ĐỐI TƯỢNG: Có phải họ những con số giống nhau không? DAVID J. Malan: Những con số này. Một chút trứng Phục Sinh. Vì vậy, cho những người bạn xem trực tuyến tại nhà, nếu bạn có thể cho chúng tôi biết qua email đến heads@CS50.net những gì ý nghĩa của sáu con số định kỳ là Câu đố trong suốt 1, chúng tôi sẽ tắm bạn với sự chú ý tuyệt vời ở trận chung kết bài giảng và một quả bóng căng thẳng. Tốt đẹp, tinh tế. ROB Bowden: Bất kỳ câu hỏi cuối cùng về bất cứ điều gì về các bài kiểm tra?