1 00:00:00,000 --> 00:00:12,610 2 00:00:12,610 --> 00:00:12,900 >> DAVID J. Malan: Được rồi. 3 00:00:12,900 --> 00:00:16,790 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. 4 00:00:16,790 --> 00:00:18,340 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. 5 00:00:18,340 --> 00:00:20,960 Và điều này sẽ là một cơ hội đi qua 6 00:00:20,960 --> 00:00:22,220 các giải pháp cho các bài kiểm tra. 7 00:00:22,220 --> 00:00:26,160 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. 8 00:00:26,160 --> 00:00:29,730 >> 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 9 00:00:29,730 --> 00:00:31,170 nên đã trả lời một số những vấn đề này. 10 00:00:31,170 --> 00:00:33,300 Vậy tại sao chúng ta không có một cái nhìn ở phần này đầu tiên? 11 00:00:33,300 --> 00:00:34,450 Vì vậy, nhận chuỗi. 12 00:00:34,450 --> 00:00:37,600 Đ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, 13 00:00:37,600 --> 00:00:39,650 có nghĩa là để có được một chuỗi từ một người sử dụng. 14 00:00:39,650 --> 00:00:42,530 Có hay không nó đã làm điều đó là để lại cho bạn để xác định. 15 00:00:42,530 --> 00:00:45,150 >> 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à 16 00:00:45,150 --> 00:00:46,400 biên soạn và thực hiện. 17 00:00:46,400 --> 00:00:48,860 Tại sao có thể chương trình segfault? 18 00:00:48,860 --> 00:00:51,150 Ở cái nhìn đầu tiên, bất cứ đề nghị là tại sao? 19 00:00:51,150 --> 00:00:54,012 20 00:00:54,012 --> 00:00:54,489 Yeah. 21 00:00:54,489 --> 00:00:59,260 >> ĐỐ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 22 00:00:59,260 --> 00:01:05,506 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 23 00:01:05,506 --> 00:01:07,971 Nó đã ảnh hưởng đến những gì bạn quét? 24 00:01:07,971 --> 00:01:10,940 Là nó s hoặc địa chỉ của s? 25 00:01:10,940 --> 00:01:11,180 >> DAVID J. Malan: OK. 26 00:01:11,180 --> 00:01:11,480 Tốt. 27 00:01:11,480 --> 00:01:14,830 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 28 00:01:14,830 --> 00:01:16,210 với biến s. 29 00:01:16,210 --> 00:01:17,280 Và nó thực sự là một biến. 30 00:01:17,280 --> 00:01:19,900 Kiểu dữ liệu của biến đó là char *, có nghĩa là nó sẽ 31 00:01:19,900 --> 00:01:22,570 chứa địa chỉ của một nhân vật. 32 00:01:22,570 --> 00:01:23,850 Và đây là cái nhìn sâu sắc. 33 00:01:23,850 --> 00:01:28,330 Nó sẽ chứa địa chỉ của một nhân vật hay tổng quát hơn, 34 00:01:28,330 --> 00:01:32,110 địa chỉ của ký tự đầu tiên trong một khối toàn bộ các ký tự. 35 00:01:32,110 --> 00:01:36,680 >> 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 36 00:01:36,680 --> 00:01:40,960 một mã định dạng, như% s, đọc một chuỗi thành các đoạn 37 00:01:40,960 --> 00:01:42,330 bộ nhớ tại địa chỉ đó. 38 00:01:42,330 --> 00:01:46,040 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 39 00:01:46,040 --> 00:01:49,310 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 40 00:01:49,310 --> 00:01:53,020 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ả 41 00:01:53,020 --> 00:01:57,620 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 42 00:01:57,620 --> 00:02:00,490 giá trị rác, mà là trong s theo mặc định. 43 00:02:00,490 --> 00:02:04,480 Vì vậy, tỷ lệ cược là bạn sẽ segfault nếu địa chỉ không chỉ để xảy ra 44 00:02:04,480 --> 00:02:08,009 là một giá trị mà bạn có thể, trên thực tế, viết thư cho. 45 00:02:08,009 --> 00:02:10,889 Xấu như vậy không phân bổ bộ nhớ của bạn ở đó. 46 00:02:10,889 --> 00:02:13,150 >> 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à 47 00:02:13,150 --> 00:02:14,230 biên soạn và thực hiện. 48 00:02:14,230 --> 00:02:15,900 Tại sao có thể chương trình này segfault? 49 00:02:15,900 --> 00:02:17,990 Vì vậy, đây là một trong ít lỗi. 50 00:02:17,990 --> 00:02:21,470 Và có thực sự chỉ có một cách rõ ràng mà bạn có thể 51 00:02:21,470 --> 00:02:22,810 kích hoạt một segfault đây. 52 00:02:22,810 --> 00:02:23,730 Và đây là chủ đề. 53 00:02:23,730 --> 00:02:28,180 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 54 00:02:28,180 --> 00:02:30,718 với phiên bản 2? 55 00:02:30,718 --> 00:02:35,560 >> ĐỐI TƯỢNG: Nếu bạn sử dụng đầu vào trong một chuỗi dài hơn 49 56 00:02:35,560 --> 00:02:35,975 ký tự. 57 00:02:35,975 --> 00:02:37,260 >> DAVID J. Malan: Chính xác. 58 00:02:37,260 --> 00:02:41,420 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 59 00:02:41,420 --> 00:02:44,650 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 60 00:02:44,650 --> 00:02:45,810 ranh giới của một mảng. 61 00:02:45,810 --> 00:02:46,650 Và đó là vấn đề ở đây. 62 00:02:46,650 --> 00:02:47,910 Chúng tôi vẫn đang sử dụng scanf. 63 00:02:47,910 --> 00:02:52,200 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. 64 00:02:52,200 --> 00:02:56,300 Điều đó sẽ được đọc vào, mà, vào thời điểm này, là có hiệu quả 65 00:02:56,300 --> 00:02:58,570 địa chỉ của một đoạn bộ nhớ hoặc đó là tương đương. 66 00:02:58,570 --> 00:03:02,080 Đó là tên của một mảng các nhân vật của bộ nhớ. 67 00:03:02,080 --> 00:03:07,610 >> 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 68 00:03:07,610 --> 00:03:10,440 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 69 00:03:10,440 --> 00:03:11,390 bộ đệm. 70 00:03:11,390 --> 00:03:16,410 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. 71 00:03:16,410 --> 00:03:18,560 Nhưng tại một số điểm, hệ điều hành sẽ nói, không. 72 00:03:18,560 --> 00:03:21,270 Điều này chắc chắn không phải là bộ nhớ bạn được phép chạm vào. 73 00:03:21,270 --> 00:03:23,380 Và chương trình sẽ segfault. 74 00:03:23,380 --> 00:03:26,650 >> 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ó 75 00:03:26,650 --> 00:03:30,150 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 76 00:03:30,150 --> 00:03:31,090 đọc vào nó. 77 00:03:31,090 --> 00:03:35,110 >> ĐỐ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ố 78 00:03:35,110 --> 00:03:37,140 là lớn hơn chiều dài hơn hoặc ít hơn? 79 00:03:37,140 --> 00:03:37,730 >> DAVID J. Malan: Tuyệt đối. 80 00:03:37,730 --> 00:03:41,706 Bạn chỉ cần có một điều kiện nói rằng, nếu - 81 00:03:41,706 --> 00:03:46,080 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 82 00:03:46,080 --> 00:03:49,060 người sử dụng sẽ gõ, bởi vì bạn có gà và trứng. 83 00:03:49,060 --> 00:03:51,860 Không cho đến khi bạn đã đọc nó với scanf bạn có thể tìm ra nó là bao lâu. 84 00:03:51,860 --> 00:03:54,500 Nhưng tại thời điểm đó, nó là quá muộn, bởi vì bạn đã đọc nó vào 85 00:03:54,500 --> 00:03:55,710 một số khối của bộ nhớ. 86 00:03:55,710 --> 00:03:59,590 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 87 00:03:59,590 --> 00:04:01,060 bằng cách sử dụng fgetc. 88 00:04:01,060 --> 00:04:05,390 Và nó đọc một ký tự tại một thời gian, tip-toeing cùng, biết rằng bạn 89 00:04:05,390 --> 00:04:08,060 không thể tràn một nhân vật nếu bạn đọc cùng một lúc. 90 00:04:08,060 --> 00:04:11,580 >> 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 91 00:04:11,580 --> 00:04:13,590 rằng đoạn bộ nhớ, mà chỉ là một nỗi đau. 92 00:04:13,590 --> 00:04:15,310 Đó là rất nhiều dòng mã để làm điều đó. 93 00:04:15,310 --> 00:04:18,779 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 94 00:04:18,779 --> 00:04:19,790 để nói chuyện, trong scanf. 95 00:04:19,790 --> 00:04:22,820 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 96 00:04:22,820 --> 00:04:25,870 chiều dài của bao nhiêu ký tự bạn có thể đọc tối đa. 97 00:04:25,870 --> 00:04:29,430 Và bạn có thể chỉ định, không đọc hơn 50 ký tự. 98 00:04:29,430 --> 00:04:34,110 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. 99 00:04:34,110 --> 00:04:37,040 >> 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. 100 00:04:37,040 --> 00:04:39,960 Tại sao có thể chương trình segfault? 101 00:04:39,960 --> 00:04:42,650 Vì vậy, một điều này thực sự giống nhau trả lời, mặc dù nó 102 00:04:42,650 --> 00:04:43,590 nhìn một chút fancier. 103 00:04:43,590 --> 00:04:46,440 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. 104 00:04:46,440 --> 00:04:48,030 Và sau đó chúng tôi đang giải phóng mà bộ nhớ ở cuối. 105 00:04:48,030 --> 00:04:49,580 Nó vẫn chỉ là 50 byte của bộ nhớ. 106 00:04:49,580 --> 00:04:53,620 Vì vậy, chúng tôi vẫn có thể cố gắng đọc trong 51, 52, 1.000 byte. 107 00:04:53,620 --> 00:04:55,830 Nó sẽ segfault cho chính xác cùng một lý do. 108 00:04:55,830 --> 00:04:57,530 >> Nhưng có một lý do khác nữa. 109 00:04:57,530 --> 00:05:03,890 Những gì có thể trở lại bên cạnh malloc địa chỉ của một đoạn bộ nhớ? 110 00:05:03,890 --> 00:05:04,920 Nó có thể trở về null. 111 00:05:04,920 --> 00:05:07,560 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ì đó 112 00:05:07,560 --> 00:05:11,350 ngu ngốc vì lý do khác, đó là chúng ta có thể nói với scanf, đọc 113 00:05:11,350 --> 00:05:16,050 đầu vào của người dùng từ bàn phím vào vị trí 0, AKA null. 114 00:05:16,050 --> 00:05:18,890 Và đó cũng sẽ chắc chắn kích hoạt một segfault. 115 00:05:18,890 --> 00:05:21,590 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 116 00:05:21,590 --> 00:05:22,740 lý do chính đáng. 117 00:05:22,740 --> 00:05:23,420 Một là giống hệt nhau. 118 00:05:23,420 --> 00:05:25,720 Một là nhiều hơn một chút sắc thái. 119 00:05:25,720 --> 00:05:28,975 >> 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à 120 00:05:28,975 --> 00:05:30,350 phiên bản 3 khác nhau? 121 00:05:30,350 --> 00:05:35,070 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ể 122 00:05:35,070 --> 00:05:35,770 câu trả lời cho điều này. 123 00:05:35,770 --> 00:05:39,300 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 124 00:05:39,300 --> 00:05:42,250 điều, là một số đề cập đến thực tế là phiên bản 2 được sử dụng 125 00:05:42,250 --> 00:05:44,560 stack cái gọi là. 126 00:05:44,560 --> 00:05:46,710 Phiên bản 3 đang sử dụng heap. 127 00:05:46,710 --> 00:05:50,060 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. 128 00:05:50,060 --> 00:05:54,040 Vào cuối ngày, chúng ta vẫn còn chỉ nhận được 50 byte bộ nhớ. 129 00:05:54,040 --> 00:05:56,640 >> 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. 130 00:05:56,640 --> 00:05:59,730 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 131 00:05:59,730 --> 00:06:04,330 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. 132 00:06:04,330 --> 00:06:08,600 Nhưng chồng và đống sẽ là một câu trả lời dễ dàng để đi với. 133 00:06:08,600 --> 00:06:11,150 Bất kỳ câu hỏi? 134 00:06:11,150 --> 00:06:12,400 Tôi cung cấp cho bạn Rob. 135 00:06:12,400 --> 00:06:18,360 136 00:06:18,360 --> 00:06:20,210 >> ROB Bowden: Vì vậy, vấn đề 4. 137 00:06:20,210 --> 00:06:21,985 Đây là một trong những nơi bạn phải điền trong số byte trong số tất cả 138 00:06:21,985 --> 00:06:23,460 các loại khác nhau được sử dụng. 139 00:06:23,460 --> 00:06:24,830 Điều đầu tiên để chúng ta thấy. 140 00:06:24,830 --> 00:06:27,930 Giả sử một kiến ​​trúc 32-bit, như thiết bị CS50 này. 141 00:06:27,930 --> 00:06:33,530 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 142 00:06:33,530 --> 00:06:37,490 chính xác làm thế nào lớn một con trỏ sẽ là trong kiến ​​trúc. 143 00:06:37,490 --> 00:06:43,020 >> 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. 144 00:06:43,020 --> 00:06:46,010 Vì vậy, nhìn vào bảng này, một nút * là một loại con trỏ. 145 00:06:46,010 --> 00:06:47,250 Đó sẽ là 4 byte. 146 00:06:47,250 --> 00:06:51,640 Nút cấu trúc *, đó là nghĩa đen giống với ngôi sao nút. 147 00:06:51,640 --> 00:06:53,590 Và do đó sẽ là 4 byte. 148 00:06:53,590 --> 00:06:58,270 Chuỗi, do đó nó không giống như một con trỏ, nhưng typedef, một 149 00:06:58,270 --> 00:07:01,590 chuỗi chỉ là một char *, mà là một loại con trỏ. 150 00:07:01,590 --> 00:07:03,550 Vì vậy, đó sẽ là 4 byte. 151 00:07:03,550 --> 00:07:06,150 >> Vì vậy, ba là tất cả 4 byte. 152 00:07:06,150 --> 00:07:09,350 Bây giờ, nút và sinh viên là phức tạp hơn một chút. 153 00:07:09,350 --> 00:07:15,160 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ỏ. 154 00:07:15,160 --> 00:07:18,050 Và sinh viên là hai con trỏ bên trong của nó. 155 00:07:18,050 --> 00:07:23,340 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 156 00:07:23,340 --> 00:07:27,020 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. 157 00:07:27,020 --> 00:07:30,690 >> Vì vậy, cho nút, chúng tôi có một số nguyên, đó là 4 byte. 158 00:07:30,690 --> 00:07:32,830 Chúng tôi có một con trỏ, đó là 4 byte. 159 00:07:32,830 --> 00:07:35,820 Và như vậy một nút sẽ để mất 8 byte. 160 00:07:35,820 --> 00:07:39,490 Và tương tự cho sinh viên, chúng tôi có một con trỏ đó là 4 byte và một 161 00:07:39,490 --> 00:07:40,770 con trỏ đó là 4 byte. 162 00:07:40,770 --> 00:07:43,180 Vì vậy, đó sẽ kết thúc lên được 8 byte. 163 00:07:43,180 --> 00:07:45,480 Vì vậy, nút và sinh viên là 8 byte. 164 00:07:45,480 --> 00:07:48,950 Và ba là tất cả 4 byte. 165 00:07:48,950 --> 00:07:50,240 Câu hỏi về điều đó? 166 00:07:50,240 --> 00:07:54,640 167 00:07:54,640 --> 00:07:54,990 Vâng. 168 00:07:54,990 --> 00:07:58,413 >> ĐỐI TƯỢNG: Có là một 64-bit kiến trúc, sẽ là 169 00:07:58,413 --> 00:07:59,880 tăng gấp đôi tất cả trong số họ? 170 00:07:59,880 --> 00:08:01,790 >> ROB Bowden: Nó sẽ không tăng gấp đôi tất cả chúng. 171 00:08:01,790 --> 00:08:05,830 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 172 00:08:05,830 --> 00:08:08,910 con trỏ tại là 64 bit. 173 00:08:08,910 --> 00:08:09,290 Yeah. 174 00:08:09,290 --> 00:08:10,930 Vì vậy, một con trỏ là 8 byte. 175 00:08:10,930 --> 00:08:15,420 Vì vậy, những đó là 4 byte đang có được 8 byte. 176 00:08:15,420 --> 00:08:18,617 Một sinh viên, đó là hai con trỏ, tốt, bây giờ nó sẽ 177 00:08:18,617 --> 00:08:19,800 có 8 byte, 8 byte. 178 00:08:19,800 --> 00:08:21,980 Nó sẽ làm cho 16 byte. 179 00:08:21,980 --> 00:08:25,710 >> Nhưng một nút vẫn là 4 byte. 180 00:08:25,710 --> 00:08:27,800 Vì vậy, con trỏ này sẽ là 8 byte. 181 00:08:27,800 --> 00:08:28,930 Đây là 4 byte. 182 00:08:28,930 --> 00:08:30,870 Vì vậy, một nút chỉ đi là 12 byte. 183 00:08:30,870 --> 00:08:36,309 184 00:08:36,309 --> 00:08:39,280 Bất kỳ câu hỏi khác trên một trong những? 185 00:08:39,280 --> 00:08:44,500 Vì vậy, một trong những tiếp theo, đây là những các mã trạng thái HTTP. 186 00:08:44,500 --> 00:08:48,000 Và bạn có để mô tả hoàn cảnh theo đó những sức mạnh 187 00:08:48,000 --> 00:08:49,810 được trả lại cho bạn. 188 00:08:49,810 --> 00:08:56,730 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 189 00:08:56,730 --> 00:08:58,950 lỗi là ngày cuối cùng của khách hàng. 190 00:08:58,950 --> 00:09:02,320 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 191 00:09:02,320 --> 00:09:03,820 sai về kết thúc của chúng tôi. 192 00:09:03,820 --> 00:09:07,660 Nhưng nói chung, các mã số này được trả lại bởi các máy chủ. 193 00:09:07,660 --> 00:09:11,720 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ủ 194 00:09:11,720 --> 00:09:14,280 gây ra những điều cần được trả lại. 195 00:09:14,280 --> 00:09:18,670 Vậy tại sao có thể một máy chủ trả về mã trạng thái 200? 196 00:09:18,670 --> 00:09:19,920 Bất kỳ suy nghĩ? 197 00:09:19,920 --> 00:09:23,360 198 00:09:23,360 --> 00:09:23,730 >> Yeah. 199 00:09:23,730 --> 00:09:27,850 Vì vậy, một cái gì đó về thành công yêu cầu đã đi qua. 200 00:09:27,850 --> 00:09:30,260 Và họ có thể quay trở lại bất cứ điều gì bạn yêu cầu. 201 00:09:30,260 --> 00:09:32,240 Vì vậy, tất cả mọi thứ được tốt. 202 00:09:32,240 --> 00:09:35,662 Những gì về 302 tìm thấy? 203 00:09:35,662 --> 00:09:36,618 Yeah. 204 00:09:36,618 --> 00:09:39,008 >> ĐỐI TƯỢNG: Các máy chủ đang tìm kiếm cho những gì mà bạn yêu cầu. 205 00:09:39,008 --> 00:09:40,442 Nhưng nó không thể tìm thấy nó. 206 00:09:40,442 --> 00:09:42,850 Vì vậy, có một lỗi. 207 00:09:42,850 --> 00:09:47,720 >> ROB Bowden: Vì vậy, các máy chủ đã tìm kiếm những gì bạn muốn. 208 00:09:47,720 --> 00:09:51,682 Vì vậy chỉ cần tìm kiếm ở đây, 302 tìm thấy, nó đã có thể tìm thấy nó. 209 00:09:51,682 --> 00:09:53,035 >> ĐỐI TƯỢNG: Tôi xin lỗi. 210 00:09:53,035 --> 00:09:54,388 Tìm thấy có nghĩa là họ đã tìm thấy nó. 211 00:09:54,388 --> 00:09:55,638 Xin lôi. 212 00:09:55,638 --> 00:09:58,120 213 00:09:58,120 --> 00:10:00,160 >> ROB Bowden: Vì vậy, 302 được tìm thấy. 214 00:10:00,160 --> 00:10:02,350 Các máy chủ có thể tìm thấy những gì bạn muốn. 215 00:10:02,350 --> 00:10:04,640 >> ĐỐI TƯỢNG: Nhưng nó không hiển thị nó? 216 00:10:04,640 --> 00:10:08,180 >> ROB Bowden: Sự khác biệt giữa này 302 và 200 là nó 217 00:10:08,180 --> 00:10:09,280 biết những gì bạn muốn. 218 00:10:09,280 --> 00:10:12,000 Nhưng nó không phải là chính xác nơi bạn muốn hỏi. 219 00:10:12,000 --> 00:10:14,580 Vì vậy, 302 là một chuyển hướng điển hình. 220 00:10:14,580 --> 00:10:16,510 Vì vậy, bạn yêu cầu một trang. 221 00:10:16,510 --> 00:10:19,590 Nó biết, oh, tôi muốn để trả lại cho bạn này. 222 00:10:19,590 --> 00:10:21,070 Nhưng điều này là một URL khác nhau. 223 00:10:21,070 --> 00:10:23,534 Vì vậy, hey, bạn thực sự muốn điều này. 224 00:10:23,534 --> 00:10:26,950 >> 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 225 00:10:26,950 --> 00:10:30,830 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í, 226 00:10:30,830 --> 00:10:34,110 ruột kết, và sau đó các URL mà bạn muốn từ chối người sử dụng. 227 00:10:34,110 --> 00:10:37,480 Ngay cả khi bạn không nhìn thấy 302 rõ ràng có, đó là những gì PHP 228 00:10:37,480 --> 00:10:41,550 kỳ diệu sẽ chèn như tiêu đề nói chính xác những gì Rob nói rằng - 229 00:10:41,550 --> 00:10:41,930 được tìm thấy. 230 00:10:41,930 --> 00:10:43,180 Nhưng đi ở đây để thay thế. 231 00:10:43,180 --> 00:10:45,960 232 00:10:45,960 --> 00:10:46,160 >> ROB Bowden: OK. 233 00:10:46,160 --> 00:10:47,630 Vì vậy, những gì về 403 cấm? 234 00:10:47,630 --> 00:10:52,240 235 00:10:52,240 --> 00:10:57,120 >> ĐỐI TƯỢNG: Tôi nghĩ rằng đó là máy chủ về cơ bản nói rằng khách hàng 236 00:10:57,120 --> 00:10:59,970 không thể truy cập trang chủ. 237 00:10:59,970 --> 00:11:03,260 >> ROB Bowden: Vì vậy, có. 238 00:11:03,260 --> 00:11:07,670 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 239 00:11:07,670 --> 00:11:08,920 không chmodded thích hợp. 240 00:11:08,920 --> 00:11:11,590 Đó có thể là trong hoàn cảnh nào bạn nhìn thấy họ. 241 00:11:11,590 --> 00:11:18,920 Nhưng có một lý do mà khách hàng có thể có lỗi ở đây. 242 00:11:18,920 --> 00:11:20,440 Có thực sự là một mã trạng thái - 243 00:11:20,440 --> 00:11:21,210 401. 244 00:11:21,210 --> 00:11:22,820 Vì vậy, đây là rất giống nhau. 245 00:11:22,820 --> 00:11:24,590 >> 401 là trái phép. 246 00:11:24,590 --> 00:11:26,130 Và 403 bị cấm. 247 00:11:26,130 --> 00:11:31,890 Và do đó không được phép bạn độc quyền nhận được nếu bạn không đăng nhập 248 00:11:31,890 --> 00:11:34,520 Nhưng đăng nhập có thể có nghĩa rằng bạn được phép. 249 00:11:34,520 --> 00:11:37,930 Nhưng nếu bạn đã đăng nhập và bạn vẫn không có sự cho phép, sau đó 250 00:11:37,930 --> 00:11:40,140 bạn cũng có thể bị cấm. 251 00:11:40,140 --> 00:11:45,320 Vì vậy, nếu bạn đã đăng nhập và không có cho phép, cấm cũng là 252 00:11:45,320 --> 00:11:47,164 một cái gì đó bạn có thể nhận được. 253 00:11:47,164 --> 00:11:48,900 >> DAVID J. Malan: Và cơ chế mà những vấn đề này thường 254 00:11:48,900 --> 00:11:53,100 giải quyết trên máy chủ là qua những gì lệnh? 255 00:11:53,100 --> 00:11:57,700 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. 256 00:11:57,700 --> 00:11:59,220 >> ROB Bowden: Sau đó, 404 không tìm thấy. 257 00:11:59,220 --> 00:12:03,100 258 00:12:03,100 --> 00:12:03,470 Yeah. 259 00:12:03,470 --> 00:12:10,150 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ì 260 00:12:10,150 --> 00:12:12,710 bạn muốn, điều này, nó chỉ có không biết những gì bạn muốn. 261 00:12:12,710 --> 00:12:15,648 Và bạn không yêu cầu một cái gì đó có giá trị. 262 00:12:15,648 --> 00:12:18,580 263 00:12:18,580 --> 00:12:22,310 418 Tôi là một ấm trà và sau đó 500 máy chủ nội bộ. 264 00:12:22,310 --> 00:12:24,870 Vậy tại sao bạn có thể nhận được điều đó không? 265 00:12:24,870 --> 00:12:26,120 >> Vì vậy, segfault - 266 00:12:26,120 --> 00:12:28,760 267 00:12:28,760 --> 00:12:30,640 Tôi thực sự không biết việc xếp hạng tiêu chuẩn cho việc này. 268 00:12:30,640 --> 00:12:34,850 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ể 269 00:12:34,850 --> 00:12:39,650 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ì đó 270 00:12:39,650 --> 00:12:41,400 là sai với máy chủ của bạn cấu hình. 271 00:12:41,400 --> 00:12:44,320 Hoặc có một lỗi cú pháp trong mã PHP của bạn. 272 00:12:44,320 --> 00:12:46,095 Hoặc một cái gì đó xấu đang xảy ra. 273 00:12:46,095 --> 00:12:48,320 >> 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. 274 00:12:48,320 --> 00:12:49,490 Và về mặt kỹ thuật, nó có thể xảy ra. 275 00:12:49,490 --> 00:12:53,820 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ự 276 00:12:53,820 --> 00:12:57,790 segfaulted, mà chỉ khi những người hơi say lên và viết mã lỗi trong 277 00:12:57,790 --> 00:13:00,680 thông dịch viên của họ sẽ PHP chính nó segfault. 278 00:13:00,680 --> 00:13:06,460 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 279 00:13:06,460 --> 00:13:10,490 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, 280 00:13:10,490 --> 00:13:13,200 lỗi cú pháp, giống như bạn không đóng một báo giá. 281 00:13:13,200 --> 00:13:16,180 Hoặc bạn bị mất một dấu chấm phẩy ở đâu đó. 282 00:13:16,180 --> 00:13:23,677 >> ĐỐ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 283 00:13:23,677 --> 00:13:26,300 trình duyệt, nhưng không đưa ra, những gì họ gọi là trang trắng. 284 00:13:26,300 --> 00:13:28,056 Nhưng đó là vì các mã. 285 00:13:28,056 --> 00:13:29,440 Tôi nghĩ đó là JavaScript, phải không? 286 00:13:29,440 --> 00:13:29,770 >> ROB Bowden: Vâng. 287 00:13:29,770 --> 00:13:31,180 >> ĐỐI TƯỢNG: Sẽ lỗi vẫn đi lên? 288 00:13:31,180 --> 00:13:34,290 >> 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ứ 289 00:13:34,290 --> 00:13:36,930 từ quan điểm của các máy chủ web là hoàn toàn tốt đẹp. 290 00:13:36,930 --> 00:13:39,090 Nhưng mà bạn yêu cầu index.html. 291 00:13:39,090 --> 00:13:42,000 Bạn yêu cầu shuttle.js và service.js. 292 00:13:42,000 --> 00:13:44,580 Và nó đã có thể trở thành công để tất cả những điều bạn - 293 00:13:44,580 --> 00:13:44,980 200. 294 00:13:44,980 --> 00:13:45,680 OK. 295 00:13:45,680 --> 00:13:49,330 Nó chỉ khi trình duyệt của bạn cố gắng giải thích các mã JavaScript 296 00:13:49,330 --> 00:13:51,370 nó như thế, chờ đợi, đây không phải là lỗi JavaScript hợp lệ. 297 00:13:51,370 --> 00:13:55,720 298 00:13:55,720 --> 00:13:58,210 Bất kỳ câu hỏi nào khác không? 299 00:13:58,210 --> 00:14:00,750 Được rồi. 300 00:14:00,750 --> 00:14:04,120 >> DAVID J. Malan: Vì vậy, tiếp theo lên là số 11. 301 00:14:04,120 --> 00:14:07,610 Và 11 là đáng sợ nhất cho rất nhiều người. 302 00:14:07,610 --> 00:14:14,620 303 00:14:14,620 --> 00:14:18,570 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ề 304 00:14:18,570 --> 00:14:19,840 một danh sách liên kết kép. 305 00:14:19,840 --> 00:14:23,160 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 đề, 306 00:14:23,160 --> 00:14:27,170 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. 307 00:14:27,170 --> 00:14:29,640 >> 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à 308 00:14:29,640 --> 00:14:32,930 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 309 00:14:32,930 --> 00:14:35,430 những gì nếu không sẽ là một vấn đề khó khăn hơn 310 00:14:35,430 --> 00:14:36,600 và còn một. 311 00:14:36,600 --> 00:14:40,760 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 312 00:14:40,760 --> 00:14:45,580 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 313 00:14:45,580 --> 00:14:48,520 câu trả lời cho một câu hỏi khác nhau tinh thần tương tự. 314 00:14:48,520 --> 00:14:51,340 Nhưng sự tinh tế đây như sau. 315 00:14:51,340 --> 00:14:55,200 >> 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. 316 00:14:55,200 --> 00:14:59,230 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. 317 00:14:59,230 --> 00:15:02,150 Thì rõ ràng, có hai chức năng chúng tôi có nguyên mẫu cho đây, chèn 318 00:15:02,150 --> 00:15:03,240 và loại bỏ. 319 00:15:03,240 --> 00:15:06,600 Và sau đó chúng tôi có một số mẫu mã ở đây làm một loạt các chèn. 320 00:15:06,600 --> 00:15:09,930 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 321 00:15:09,930 --> 00:15:14,380 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, 322 00:15:14,380 --> 00:15:15,730 ngay cả khi đã hiện diện. 323 00:15:15,730 --> 00:15:20,600 >> Vì vậy, vẻ đẹp của việc có thể để chèn trong thời gian liên tục là nó ngụ ý 324 00:15:20,600 --> 00:15:23,060 mà bạn phải chèn nút mới ở đâu? 325 00:15:23,060 --> 00:15:23,690 Vào phía trước. 326 00:15:23,690 --> 00:15:27,760 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 327 00:15:27,760 --> 00:15:30,520 đườ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 328 00:15:30,520 --> 00:15:34,040 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ố 329 00:15:34,040 --> 00:15:35,250 mã giả bằng lời nói. 330 00:15:35,250 --> 00:15:39,190 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 331 00:15:39,190 --> 00:15:40,480 màn hình. 332 00:15:40,480 --> 00:15:42,230 >> Chú ý rằng chúng ta đang làm những điều sau đây. 333 00:15:42,230 --> 00:15:45,140 Và cũng nhận thấy sự đơn giản hóa khác là ngay cả khi nó 334 00:15:45,140 --> 00:15:48,280 đã 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ể 335 00:15:48,280 --> 00:15:50,280 chỉ một cách mù quáng chèn khác bản sao của nó. 336 00:15:50,280 --> 00:15:52,560 Và đó cũng có nghĩa là phải một đơn giản hóa, vì vậy mà bạn có thể 337 00:15:52,560 --> 00:15:54,940 tập trung vào, thực sự, một số chi tiết một phần trí tuệ thú vị và 338 00:15:54,940 --> 00:15:58,090 không chỉ là một số kiểm tra lỗi thêm cho thời gian hạn chế. 339 00:15:58,090 --> 00:16:02,880 >> 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 340 00:16:02,880 --> 00:16:04,510 bên đây với một nút. 341 00:16:04,510 --> 00:16:07,190 Bây giờ, nhận ra con trỏ đó, như Rob cho biết, chỉ 32 bit. 342 00:16:07,190 --> 00:16:09,060 Và nó không thực sự có chứa một địa chỉ cho đến khi bạn 343 00:16:09,060 --> 00:16:09,970 gán cho nó địa chỉ. 344 00:16:09,970 --> 00:16:13,220 Và chúng tôi làm điều đó trên cánh tay phải bên thông qua malloc. 345 00:16:13,220 --> 00:16:16,550 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 đó 346 00:16:16,550 --> 00:16:18,690 chúng tôi không vô tình tạo ra một segfault đây. 347 00:16:18,690 --> 00:16:22,840 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ợ 348 00:16:22,840 --> 00:16:24,090 bạn có một lỗi tinh tế. 349 00:16:24,090 --> 00:16:28,460 >> Sau đó, chúng ta khởi tạo không cho rằng bởi giao n và trước và sau. 350 00:16:28,460 --> 00:16:32,450 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 351 00:16:32,450 --> 00:16:34,780 nút là có được các mới bắt đầu của danh sách của tôi. 352 00:16:34,780 --> 00:16:37,050 Do đó sẽ là không có gì trước khi nó. 353 00:16:37,050 --> 00:16:42,010 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 354 00:16:42,010 --> 00:16:44,700 thiết kế bằng danh sách riêng của mình. 355 00:16:44,700 --> 00:16:47,120 Nhưng tôi không thực hiện chỉ được nêu ra. 356 00:16:47,120 --> 00:16:51,780 Vì vậy, nếu danh sách tự nó đã tồn tại, và đã có ít nhất một nút 357 00:16:51,780 --> 00:16:57,070 đã đượ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 358 00:16:57,070 --> 00:17:01,840 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, 359 00:17:01,840 --> 00:17:04,260 bởi vì đây là, một lần nữa, một danh sách liên kết kép. 360 00:17:04,260 --> 00:17:05,460 >> Vì vậy, chúng tôi làm một kiểm tra sự tỉnh táo. 361 00:17:05,460 --> 00:17:10,109 Nếu danh sách không phải là vô giá trị, nếu có đã một hay nhiều hạch ở đó, sau đó 362 00:17:10,109 --> 00:17:12,470 thêm rằng trở lại tham chiếu như vậy để nói chuyện. 363 00:17:12,470 --> 00:17:15,420 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 364 00:17:15,420 --> 00:17:20,329 danh sách biến bản thân để chỉ với nút mới. 365 00:17:20,329 --> 00:17:21,790 Yeah. 366 00:17:21,790 --> 00:17:26,579 >> ĐỐI TƯỢNG: Trong mũi tên con trỏ [Nghe được] bằng vô giá trị, không có 367 00:17:26,579 --> 00:17:30,420 đối phó với danh sách bởi vì danh sách là vô giá trị? 368 00:17:30,420 --> 00:17:30,596 >> DAVID J. Malan: Không. 369 00:17:30,596 --> 00:17:34,500 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 370 00:17:34,500 --> 00:17:38,730 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 371 00:17:38,730 --> 00:17:42,380 nút mới trên đây, có đi không có gì ở đây. 372 00:17:42,380 --> 00:17:44,720 Và tôi muốn nắm bắt ý tưởng bằng cách thiết lập trước đó 373 00:17:44,720 --> 00:17:47,740 null trên các node mới. 374 00:17:47,740 --> 00:17:51,410 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 375 00:17:51,410 --> 00:17:54,970 các nút khác hơn chức năng này, có lẽ, ngay cả khi đã có danh sách 376 00:17:54,970 --> 00:18:00,090 một hay nhiều hạch ở trong đó, có lẽ các danh sách, nút đầu tiên, sẽ có một 377 00:18:00,090 --> 00:18:02,750 con trỏ trước null chính nó. 378 00:18:02,750 --> 00:18:03,550 >> ĐỐI TƯỢNG: Và chỉ là một tiếp theo. 379 00:18:03,550 --> 00:18:08,139 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ỏ 380 00:18:08,139 --> 00:18:13,579 trước khi danh sách trong đó nó chỉ kế tiếp, tôi đoán - 381 00:18:13,579 --> 00:18:14,980 Tôi đừng - 382 00:18:14,980 --> 00:18:15,450 chỉ liệt kê? 383 00:18:15,450 --> 00:18:16,400 >> DAVID J. Malan: Chính xác. 384 00:18:16,400 --> 00:18:19,400 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ù 385 00:18:19,400 --> 00:18:22,070 Để chúng tôi sẽ xem xét không phải là hoàn toàn giống như các mã. 386 00:18:22,070 --> 00:18:26,250 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 387 00:18:26,250 --> 00:18:29,560 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. 388 00:18:29,560 --> 00:18:33,010 Và giả sử tôi muốn chèn số 50 là số đầu tiên. 389 00:18:33,010 --> 00:18:37,640 Vì vậy, tôi sẽ đi trước và phân bổ một nút, mà là có chứa 390 00:18:37,640 --> 00:18:38,770 ba lĩnh vực - 391 00:18:38,770 --> 00:18:42,070 n, trước và sau. 392 00:18:42,070 --> 00:18:44,580 >> Tôi sẽ đưa số 50 ở đây, bởi vì điều này sẽ là n. 393 00:18:44,580 --> 00:18:46,130 Điều này sẽ được tiếp theo. 394 00:18:46,130 --> 00:18:48,530 Và điều này sẽ được trước đó. 395 00:18:48,530 --> 00:18:50,910 Và vì vậy tôi phải làm gì trong trường hợp này? 396 00:18:50,910 --> 00:18:53,900 Vâng, tôi vừa thực hiện 1 dòng ở đây. 397 00:18:53,900 --> 00:18:55,400 Con trỏ n được n. 398 00:18:55,400 --> 00:18:57,740 Sau đó tôi nói, trước nên vô giá trị. 399 00:18:57,740 --> 00:18:59,470 Vì vậy, đây sẽ là vô giá trị. 400 00:18:59,470 --> 00:19:01,365 Sau đó tôi sẽ nói tiếp theo là sẽ nhận được danh sách. 401 00:19:01,365 --> 00:19:05,150 >> Và điều này chỉ hoạt động ra tốt. 402 00:19:05,150 --> 00:19:06,500 Điều này là vô giá trị. 403 00:19:06,500 --> 00:19:10,620 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à. 404 00:19:10,620 --> 00:19:12,570 Vì vậy mà đặt vô giá trị khác ở đó. 405 00:19:12,570 --> 00:19:14,510 Và sau đó là điều cuối cùng Tôi đang kiểm tra ở đây. 406 00:19:14,510 --> 00:19:17,870 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 407 00:19:17,870 --> 00:19:18,470 hoàn toàn. 408 00:19:18,470 --> 00:19:23,520 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 409 00:19:23,520 --> 00:19:25,570 một bức tranh như thế. 410 00:19:25,570 --> 00:19:26,620 Vì vậy, đó là một kịch bản. 411 00:19:26,620 --> 00:19:30,490 >> 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, 412 00:19:30,490 --> 00:19:33,190 nơi chúng tôi đã có một danh sách một nút. 413 00:19:33,190 --> 00:19:36,240 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ẽ 414 00:19:36,240 --> 00:19:39,320 chèn nói là 34, chỉ cần cho vì lợi ích của cuộc thảo luận. 415 00:19:39,320 --> 00:19:46,210 Vì vậy, tôi sẽ chỉ thuận tiện rút ra rằng ở đây. 416 00:19:46,210 --> 00:19:47,540 Tôi vừa malloced. 417 00:19:47,540 --> 00:19:49,310 Giả sử tôi đang kiểm tra cho null. 418 00:19:49,310 --> 00:19:51,870 >> Bây giờ, tôi sẽ khởi tạo n là 34. 419 00:19:51,870 --> 00:19:53,040 Và đây sẽ là n. 420 00:19:53,040 --> 00:19:54,670 Điều này sẽ được tiếp theo. 421 00:19:54,670 --> 00:19:57,100 Và điều này sẽ được trước đó. 422 00:19:57,100 --> 00:19:59,370 Hãy chắc chắn rằng tôi đã không có được điều này ngược. 423 00:19:59,370 --> 00:20:01,110 Trước đến trước trong định nghĩa. 424 00:20:01,110 --> 00:20:03,070 Hãy để tôi sửa lỗi này. 425 00:20:03,070 --> 00:20:04,410 Đây là trước đó. 426 00:20:04,410 --> 00:20:05,780 Đây là tiếp theo. 427 00:20:05,780 --> 00:20:08,620 Mặc dù đây là giống hệt nhau, chúng ta hãy giữ cho nó phù hợp. 428 00:20:08,620 --> 00:20:09,450 >> Trước. 429 00:20:09,450 --> 00:20:11,030 Đây là tiếp theo. 430 00:20:11,030 --> 00:20:16,310 Vì vậy, tôi đã chỉ malloced lưu ý của tôi, kiểm tra null, giao 34 vào nút. 431 00:20:16,310 --> 00:20:17,570 Trước được null. 432 00:20:17,570 --> 00:20:19,480 Để mang lại cho tôi đó. 433 00:20:19,480 --> 00:20:21,010 Tiếp theo được danh sách. 434 00:20:21,010 --> 00:20:22,370 Vì vậy, danh sách là thế này. 435 00:20:22,370 --> 00:20:26,520 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 436 00:20:26,520 --> 00:20:27,940 trong cùng. 437 00:20:27,940 --> 00:20:30,400 Và sau đó tôi kiểm tra nếu danh sách không bằng null. 438 00:20:30,400 --> 00:20:31,740 Và nó không phải thời điểm này. 439 00:20:31,740 --> 00:20:35,580 Sau đó, tôi sẽ làm danh sách trước được con trỏ. 440 00:20:35,580 --> 00:20:39,700 >> Vì vậy, danh sách trước được PTR. 441 00:20:39,700 --> 00:20:44,300 Vì vậy, đây có tác dụng đưa một mũi tên đồ họa ở đây. 442 00:20:44,300 --> 00:20:46,930 Và đó là nhận được một chút lượn sóng, các dòng. 443 00:20:46,930 --> 00:20:50,780 Và sau đó, cuối cùng, tôi cập nhật danh sách để trỏ đến con trỏ. 444 00:20:50,780 --> 00:20:55,560 Vì vậy, bây giờ điều này dẫn đến anh chàng này. 445 00:20:55,560 --> 00:20:57,170 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. 446 00:20:57,170 --> 00:20:59,470 >> Dưới đây là danh sách, đó là các biến toàn cầu. 447 00:20:59,470 --> 00:21:02,850 Nút đầu tiên là, thực sự, 34 tuổi, vì Tôi sau mũi tên. 448 00:21:02,850 --> 00:21:05,210 Và đó là chính xác bởi vì tôi muốn chèn vào đầu danh sách 449 00:21:05,210 --> 00:21:06,070 tất cả các nút mới. 450 00:21:06,070 --> 00:21:08,860 Lĩnh vực tiếp theo của mình dẫn tôi đến anh chàng này. 451 00:21:08,860 --> 00:21:10,710 Nếu tôi tiếp tục đi, tôi nhấn tiếp theo là null. 452 00:21:10,710 --> 00:21:11,760 Vì vậy, không có danh sách hơn. 453 00:21:11,760 --> 00:21:14,460 Nếu tôi nhấn trước, tôi nhận được trở lại nơi mà tôi mong đợi. 454 00:21:14,460 --> 00:21:16,435 >> Vì vậy, vẫn có một vài gợi ý, rõ ràng, để thao tác. 455 00:21:16,435 --> 00:21:19,870 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ỉ 456 00:21:19,870 --> 00:21:22,910 có một số hữu hạn các điều bạn được phép làm. 457 00:21:22,910 --> 00:21:24,290 Và con số này là gì? 458 00:21:24,290 --> 00:21:25,185 Nó có thể là một bước. 459 00:21:25,185 --> 00:21:25,700 Nó có thể là hai. 460 00:21:25,700 --> 00:21:26,820 Nó có thể là 1.000 bước. 461 00:21:26,820 --> 00:21:30,500 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 462 00:21:30,500 --> 00:21:32,010 ở đây, không đệ quy, không vòng. 463 00:21:32,010 --> 00:21:37,390 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. 464 00:21:37,390 --> 00:21:42,330 >> 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ỏ 465 00:21:42,330 --> 00:21:46,740 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. 466 00:21:46,740 --> 00:21:48,740 Vì vậy, bạn có nhiều hơn một chút phòng lung bây giờ. 467 00:21:48,740 --> 00:21:52,380 Bạn có thể giả định rằng n, nếu có trong danh sách, sẽ có mặt 468 00:21:52,380 --> 00:21:53,340 không quá một lần. 469 00:21:53,340 --> 00:21:56,770 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 470 00:21:56,770 --> 00:21:59,780 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 471 00:21:59,780 --> 00:22:02,890 phải lo lắng về việc tiếp tục lặp, tìm kiếm tất cả các thể 472 00:22:02,890 --> 00:22:06,990 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. 473 00:22:06,990 --> 00:22:10,460 >> 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 474 00:22:10,460 --> 00:22:11,640 mã để viết. 475 00:22:11,640 --> 00:22:14,990 Nhưng ở cái nhìn đầu tiên, thẳng thắn, nó có thể giống như áp đảo và 476 00:22:14,990 --> 00:22:17,060 không có cách nào bạn có thể có đưa ra trên một bài kiểm tra. 477 00:22:17,060 --> 00:22:22,450 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 478 00:22:22,450 --> 00:22:26,060 tấn công bạn rằng mỗi cá nhân bước có ý nghĩa rõ ràng 479 00:22:26,060 --> 00:22:27,080 khi nhìn lại. 480 00:22:27,080 --> 00:22:28,200 Vì vậy, chúng ta hãy có một cái nhìn. 481 00:22:28,200 --> 00:22:32,570 >> 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. 482 00:22:32,570 --> 00:22:36,040 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. 483 00:22:36,040 --> 00:22:39,730 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 484 00:22:39,730 --> 00:22:43,860 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 485 00:22:43,860 --> 00:22:46,990 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 486 00:22:46,990 --> 00:22:48,650 thông qua các cấu trúc dữ liệu. 487 00:22:48,650 --> 00:22:50,040 Vì vậy, tôi sẽ làm chính xác điều đó. 488 00:22:50,040 --> 00:22:54,260 >> 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 489 00:22:54,260 --> 00:22:55,660 đi trước và kiểm tra. 490 00:22:55,660 --> 00:22:56,910 Tôi đã nhận được may mắn? 491 00:22:56,910 --> 00:23:01,740 Là lĩnh vực n trong nút Tôi hiện đang nhìn vào bằng 492 00:23:01,740 --> 00:23:03,380 số tôi đang tìm kiếm? 493 00:23:03,380 --> 00:23:05,410 Và nếu như vậy, chúng ta hãy làm một cái gì đó. 494 00:23:05,410 --> 00:23:10,020 Bây giờ, thông báo này nếu điều kiện bao quanh toàn bộ 495 00:23:10,020 --> 00:23:11,520 dòng mã sau đây. 496 00:23:11,520 --> 00:23:14,610 Đây là điều duy nhất tôi quan tâm - tìm kiếm một số trong câu hỏi. 497 00:23:14,610 --> 00:23:18,010 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. 498 00:23:18,010 --> 00:23:22,040 >> 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ĩ 499 00:23:22,040 --> 00:23:24,720 nó thông qua một chút, có thực sự hai trường hợp ở đây. 500 00:23:24,720 --> 00:23:28,060 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 501 00:23:28,060 --> 00:23:31,040 í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ó 502 00:23:31,040 --> 00:23:33,340 với điều này, là sự bất thường mà thôi. 503 00:23:33,340 --> 00:23:35,720 Ở khắp mọi nơi khác trong danh sách, đó là điều tương tự. 504 00:23:35,720 --> 00:23:38,050 Có một nút trước và sau nút, nút trước, nút tiếp theo. 505 00:23:38,050 --> 00:23:40,940 Nhưng anh chàng này là một chút đặc biệt nếu anh ta ngay từ đầu. 506 00:23:40,940 --> 00:23:48,710 >> Vì vậy, nếu con trỏ bằng danh sách chính nó, vì vậy nếu tôi ở đầu 507 00:23:48,710 --> 00:23:53,960 danh sách và tôi đã tìm thấy n, tôi cần để làm một vài điều. 508 00:23:53,960 --> 00:23:59,230 Một, tôi cần phải thay đổi danh sách để trỏ đến trường tiếp theo, 50. 509 00:23:59,230 --> 00:24:01,270 Vì vậy, giả sử rằng tôi đang cố gắng để loại bỏ 34. 510 00:24:01,270 --> 00:24:03,560 Vì vậy, anh chàng này đã đi đi chỉ trong một khoảnh khắc. 511 00:24:03,560 --> 00:24:07,210 >> Vì vậy, tôi sẽ nói, danh sách được trỏ tới. 512 00:24:07,210 --> 00:24:08,570 Vâng, đây là con trỏ. 513 00:24:08,570 --> 00:24:10,360 Tiếp theo là chỉ ở đây. 514 00:24:10,360 --> 00:24:17,470 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. 515 00:24:17,470 --> 00:24:19,580 Bây giờ, hãy nhớ rằng, chúng tôi có một biến tạm thời. 516 00:24:19,580 --> 00:24:23,520 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 517 00:24:23,520 --> 00:24:25,010 thực hiện loại bỏ. 518 00:24:25,010 --> 00:24:29,600 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ì đó. 519 00:24:29,600 --> 00:24:32,690 >> 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 đó 520 00:24:32,690 --> 00:24:36,830 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 521 00:24:36,830 --> 00:24:41,910 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à 522 00:24:41,910 --> 00:24:42,820 mũi tên được đề xuất. 523 00:24:42,820 --> 00:24:44,820 Vì vậy, tôi chỉ làm dòng này. 524 00:24:44,820 --> 00:24:46,520 Vì vậy, sau đó tôi thực hiện. 525 00:24:46,520 --> 00:24:48,040 Trường hợp đó thực sự là khá dễ dàng. 526 00:24:48,040 --> 00:24:51,010 Cắt bỏ phần đầu của danh sách là tương đối đơn giản. 527 00:24:51,010 --> 00:24:52,980 >> Thật không may, điều này khối gây phiền nhiễu khác. 528 00:24:52,980 --> 00:24:56,170 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. 529 00:24:56,170 --> 00:24:59,880 Nhưng nó không phải là quá khủng khiếp, ngoại trừ cho cú pháp như thế này. 530 00:24:59,880 --> 00:25:03,080 Vì vậy, nếu tôi không phải ở đầu danh sách, tôi đâu đó ở giữa. 531 00:25:03,080 --> 00:25:08,160 Và dòng này ở đây là nói, bắt đầu ở bất cứ nút bạn đang ở. 532 00:25:08,160 --> 00:25:11,210 533 00:25:11,210 --> 00:25:18,550 Tới trường tiếp theo nút trước và chỉ có ở con trỏ. 534 00:25:18,550 --> 00:25:20,390 >> Chúng ta hãy làm điều này trong những bức tranh. 535 00:25:20,390 --> 00:25:21,640 Đã trở nên phức tạp. 536 00:25:21,640 --> 00:25:30,480 537 00:25:30,480 --> 00:25:37,990 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. 538 00:25:37,990 --> 00:25:41,200 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ộ 539 00:25:41,200 --> 00:25:45,710 mọi thứ trở lại và ra crisscrossing nhau. 540 00:25:45,710 --> 00:25:50,870 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í 541 00:25:50,870 --> 00:25:53,410 mặc dù điều đó không thẳng hàng với vấn đề trong câu hỏi. 542 00:25:53,410 --> 00:25:55,900 >> Vì vậy, đây là danh sách liên kết của tôi. 543 00:25:55,900 --> 00:25:59,300 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. 544 00:25:59,300 --> 00:26:01,960 Vì vậy, tôi đã cập nhật con trỏ tới được trỏ đến anh chàng này. 545 00:26:01,960 --> 00:26:03,315 Vì vậy, đây là PTR. 546 00:26:03,315 --> 00:26:04,530 Anh ta chỉ ở đây. 547 00:26:04,530 --> 00:26:07,170 Đây là danh sách, mà tồn tại trên toàn cầu như trước. 548 00:26:07,170 --> 00:26:09,200 Và anh ta chỉ ở đây không có vấn đề gì. 549 00:26:09,200 --> 00:26:10,800 Và bây giờ, tôi đang cố gắng để loại bỏ hai. 550 00:26:10,800 --> 00:26:13,850 >> Vì vậy, nếu con trỏ trỏ ở đây, tôi đi theo, rõ ràng, 551 00:26:13,850 --> 00:26:17,110 con trỏ trước, trong đó đặt tôi ở 1. 552 00:26:17,110 --> 00:26:22,290 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 553 00:26:22,290 --> 00:26:25,410 hộp đây, sẽ con trỏ bằng tiếp theo. 554 00:26:25,410 --> 00:26:28,400 Vì vậy, nếu con trỏ này, đây là tiếp theo. 555 00:26:28,400 --> 00:26:31,840 Điều đó có nghĩa rằng mũi tên này nhu cầu để trỏ đến anh chàng này. 556 00:26:31,840 --> 00:26:35,140 >> 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. 557 00:26:35,140 --> 00:26:37,500 Và bây giờ, điều này dường như đang tạo bước đi đúng hướng. 558 00:26:37,500 --> 00:26:41,390 Chúng tôi chủ yếu muốn snip 2 của giữa 1 và 3. 559 00:26:41,390 --> 00:26:44,400 Vì vậy, nó có ý nghĩa mà chúng ta muốn tuyến đường này con trỏ xung quanh nó. 560 00:26:44,400 --> 00:26:50,400 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ó 561 00:26:50,400 --> 00:26:54,200 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 562 00:26:54,200 --> 00:26:55,850 một chút snip đây. 563 00:26:55,850 --> 00:27:00,590 >> 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ề 564 00:27:00,590 --> 00:27:05,410 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. 565 00:27:05,410 --> 00:27:07,100 Và bây giờ, trực quan này là tốt đẹp. 566 00:27:07,100 --> 00:27:11,930 Đó là một chút lộn xộn trong đó có không ai chỉ vào 2 nữa. 567 00:27:11,930 --> 00:27:13,600 2 được trỏ đến bên trái. 568 00:27:13,600 --> 00:27:14,980 Và 2 được trỏ đến bên phải. 569 00:27:14,980 --> 00:27:17,480 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. 570 00:27:17,480 --> 00:27:19,480 Và nó không có vấn đề gì những giá trị được nữa. 571 00:27:19,480 --> 00:27:23,040 >> Điều quan trọng là còn lại kẻ được định tuyến trên 572 00:27:23,040 --> 00:27:24,280 và bên dưới anh ta bây giờ. 573 00:27:24,280 --> 00:27:25,810 Và quả thật, đó là những gì chúng tôi làm gì tiếp theo. 574 00:27:25,810 --> 00:27:29,360 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 575 00:27:29,360 --> 00:27:30,906 đòi lại này. 576 00:27:30,906 --> 00:27:34,900 Và sau đó cuối cùng, chúng tôi quay trở lại. 577 00:27:34,900 --> 00:27:37,220 Khác mặc nhiên, nếu chúng ta đã không trở về nữa, 578 00:27:37,220 --> 00:27:38,290 chúng ta phải tiếp tục tìm kiếm. 579 00:27:38,290 --> 00:27:41,485 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. 580 00:27:41,485 --> 00:27:42,600 Di chuyển anh chàng này ở đây. 581 00:27:42,600 --> 00:27:45,400 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ố 582 00:27:45,400 --> 00:27:46,960 chúng tôi đang tìm kiếm được nêu ra. 583 00:27:46,960 --> 00:27:49,630 >> Vì vậy, thẳng thắn, có vẻ hoàn toàn áp đảo, tôi nghĩ rằng, lúc đầu 584 00:27:49,630 --> 00:27:52,180 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 585 00:27:52,180 --> 00:27:52,850 một cái gì đó như thế này. 586 00:27:52,850 --> 00:27:55,050 Và bạn pat mình ở mặt sau. 587 00:27:55,050 --> 00:27:57,080 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. 588 00:27:57,080 --> 00:28:00,470 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 589 00:28:00,470 --> 00:28:04,400 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 590 00:28:04,400 --> 00:28:06,300 hoàn cảnh căng thẳng. 591 00:28:06,300 --> 00:28:09,470 >> 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. 592 00:28:09,470 --> 00:28:11,050 Bạn có thể vẽ này trong nhiều cách. 593 00:28:11,050 --> 00:28:12,760 Bạn không cần phải làm crisscrossing điều ở đây. 594 00:28:12,760 --> 00:28:14,520 Bạn có thể làm điều đó với thẳng dòng như thế này. 595 00:28:14,520 --> 00:28:18,790 Nhưng các ý chính của vấn đề này, trong Nói chung, đã nhận ra rằng 596 00:28:18,790 --> 00:28:22,060 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ì 597 00:28:22,060 --> 00:28:25,030 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 598 00:28:25,030 --> 00:28:29,900 các nút mới vào đầu danh sách. 599 00:28:29,900 --> 00:28:31,960 Bất kỳ câu hỏi? 600 00:28:31,960 --> 00:28:34,565 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. 601 00:28:34,565 --> 00:28:37,690 >> ĐỐI TƯỢNG: Vậy là danh sách tương tự như đầu trong ví dụ trước. 602 00:28:37,690 --> 00:28:39,640 >> DAVID J. Malan: Chính xác, chính xác. 603 00:28:39,640 --> 00:28:43,130 Chỉ là một tên khác cho một biến toàn cầu. 604 00:28:43,130 --> 00:28:44,380 Trên toàn thế giới những gì? 605 00:28:44,380 --> 00:28:48,880 606 00:28:48,880 --> 00:28:49,730 >> ROB Bowden: OK. 607 00:28:49,730 --> 00:28:52,020 Vì vậy, đây là một trong những nơi bạn đã phải viết đoạn văn. 608 00:28:52,020 --> 00:28:56,060 Một số người đã viết bài tiểu luận cho câu hỏi này. 609 00:28:56,060 --> 00:29:00,230 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 610 00:29:00,230 --> 00:29:02,440 bạn cố gắng liên hệ với facebook.com. 611 00:29:02,440 --> 00:29:07,930 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. 612 00:29:07,930 --> 00:29:11,290 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. 613 00:29:11,290 --> 00:29:17,280 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 614 00:29:17,280 --> 00:29:22,220 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 615 00:29:22,220 --> 00:29:24,450 HTML của trang của mình. 616 00:29:24,450 --> 00:29:28,800 >> Vì vậy, quá trình này là gì bởi mà yêu cầu HTTP 617 00:29:28,800 --> 00:29:30,730 thực sự được vào Facebook? 618 00:29:30,730 --> 00:29:32,790 Vì vậy, đầu tiên, chúng ta cần phải dịch Facebook.com. 619 00:29:32,790 --> 00:29:38,780 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 620 00:29:38,780 --> 00:29:39,940 cần phải đi? 621 00:29:39,940 --> 00:29:44,120 Vì vậy, chúng ta cần phải dịch Facebook.com đến một địa chỉ IP, trong đó duy nhất 622 00:29:44,120 --> 00:29:47,620 xác định những máy chúng tôi thực sự muốn gửi yêu cầu này. 623 00:29:47,620 --> 00:29:49,310 Máy tính xách tay của bạn có một địa chỉ IP. 624 00:29:49,310 --> 00:29:52,240 Bất cứ điều gì kết nối với internet có địa chỉ IP. 625 00:29:52,240 --> 00:29:59,030 >> Vì vậy, DNS, Domain Name System, có nghĩa là những gì sẽ xử lý các bản dịch 626 00:29:59,030 --> 00:30:03,750 từ facebook.com đến một địa chỉ IP bạn thực sự muốn liên lạc. 627 00:30:03,750 --> 00:30:08,075 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ì? 628 00:30:08,075 --> 00:30:16,560 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ì đó. 629 00:30:16,560 --> 00:30:16,900 Được rồi. 630 00:30:16,900 --> 00:30:18,850 Bây giờ, tôi biết những gì máy tính Tôi muốn liên lạc. 631 00:30:18,850 --> 00:30:22,360 >> Vì vậy, sau đó bạn gửi yêu cầu HTTP của bạn qua máy đó. 632 00:30:22,360 --> 00:30:24,140 Vì vậy, làm thế nào để nó có được để máy đó? 633 00:30:24,140 --> 00:30:27,200 Vâng, yêu cầu đi từ router với router nảy. 634 00:30:27,200 --> 00:30:32,630 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 635 00:30:32,630 --> 00:30:35,340 gói mất khi chúng ta cố gắng để giao tiếp. 636 00:30:35,340 --> 00:30:38,460 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ì. 637 00:30:38,460 --> 00:30:42,820 >> Vì vậy, các cổng hạn cuối cùng. 638 00:30:42,820 --> 00:30:46,520 Vì vậy, đây là bây giờ trên máy tính của bạn. 639 00:30:46,520 --> 00:30:49,970 Bạn có thể có nhiều điều hiện giao tiếp với internet. 640 00:30:49,970 --> 00:30:53,730 Vì vậy, tôi có thể chạy, nói, Skype. 641 00:30:53,730 --> 00:30:55,670 Tôi có thể có một trình duyệt web mở. 642 00:30:55,670 --> 00:30:59,010 Tôi có thể có cái gì đó torrent file. 643 00:30:59,010 --> 00:31:00,880 Vì vậy, tất cả những điều này là giao tiếp với 644 00:31:00,880 --> 00:31:02,600 internet một cách nào đó. 645 00:31:02,600 --> 00:31:08,070 >> 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ó 646 00:31:08,070 --> 00:31:10,130 biết ứng dụng thực tế muốn dữ liệu? 647 00:31:10,130 --> 00:31:12,610 Làm thế nào để nó biết liệu đặc biệt này dữ liệu có nghĩa là cho 648 00:31:12,610 --> 00:31:16,070 torrent ứng dụng như trái ngược cho trình duyệt web? 649 00:31:16,070 --> 00:31:20,980 Vì vậy, đây là mục đích của các cảng ở đó tất cả các ứng dụng có 650 00:31:20,980 --> 00:31:22,720 tuyên bố một cổng trên máy tính của bạn. 651 00:31:22,720 --> 00:31:27,580 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. 652 00:31:27,580 --> 00:31:32,240 Và chương trình torrent bạn đang nói, Tôi đang lắng nghe trên cổng 3000. 653 00:31:32,240 --> 00:31:34,770 Và Skype cho biết, tôi đang sử dụng cổng 4000. 654 00:31:34,770 --> 00:31:41,950 >> 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 655 00:31:41,950 --> 00:31:45,510 được đánh dấu bằng cổng nó thực sự phải được gửi cùng với. 656 00:31:45,510 --> 00:31:47,950 Vì vậy, điều này nói, oh, tôi thuộc về đến cổng 1000. 657 00:31:47,950 --> 00:31:50,950 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. 658 00:31:50,950 --> 00:31:56,440 Vì vậy, lý do nó có liên quan ở đây là các máy chủ web có xu hướng 659 00:31:56,440 --> 00:31:58,240 lắng nghe trên cổng 80. 660 00:31:58,240 --> 00:32:02,420 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. 661 00:32:02,420 --> 00:32:06,390 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. 662 00:32:06,390 --> 00:32:09,160 Và các máy chủ web có xu hướng lắng nghe trên cổng 80. 663 00:32:09,160 --> 00:32:14,010 >> Nếu họ muốn, họ có thể thiết lập nó để nó liệt kê như trên cổng 7000. 664 00:32:14,010 --> 00:32:19,090 Và sau đó trong một trình duyệt web, tôi có thể tay gõ Facebook.com: 7000 665 00:32:19,090 --> 00:32:24,600 gửi yêu cầu đến cổng 7000 của máy chủ web của Facebook. 666 00:32:24,600 --> 00:32:26,820 >> 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 667 00:32:26,820 --> 00:32:30,000 đề 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? 668 00:32:30,000 --> 00:32:36,630 669 00:32:36,630 --> 00:32:37,880 Thử lại. 670 00:32:37,880 --> 00:32:42,810 671 00:32:42,810 --> 00:32:44,300 Chính xác. 672 00:32:44,300 --> 00:32:47,960 Không tìm kiếm điều đó, nhưng một sự tinh tế đó là có không có cuối cùng. 673 00:32:47,960 --> 00:32:51,770 >> ROB Bowden: Vì vậy, HTTPS, vì nó nghe đặc biệt cho các 674 00:32:51,770 --> 00:32:55,180 mã hóa, đó là trên cổng 4430. 675 00:32:55,180 --> 00:32:57,680 >> ĐỐI TƯỢNG: Và email là 25, phải không? 676 00:32:57,680 --> 00:33:00,670 >> DAVID J. Malan: Outbound email, 25, vâng. 677 00:33:00,670 --> 00:33:03,760 >> 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 678 00:33:03,760 --> 00:33:06,310 dành cho mọi thứ. 679 00:33:06,310 --> 00:33:09,260 Tôi nghĩ rằng tất cả mọi thứ dưới 1024 được dành riêng. 680 00:33:09,260 --> 00:33:13,450 >> ĐỐI TƯỢNG: Tại sao bạn nói 3 là số sai? 681 00:33:13,450 --> 00:33:18,820 >> ROB Bowden: Bởi vì trong một địa chỉ IP, có bốn nhóm của các chữ số. 682 00:33:18,820 --> 00:33:21,090 Và họ đang từ 0 đến 255. 683 00:33:21,090 --> 00:33:28,060 Vì vậy, 192.168.2.1 là một phổ biến mạng địa chỉ IP địa phương. 684 00:33:28,060 --> 00:33:30,840 Thông báo tất cả những người đang có ít hơn 255. 685 00:33:30,840 --> 00:33:33,570 Vì vậy, khi tôi bắt đầu với 300, mà không có thể có thể có 686 00:33:33,570 --> 00:33:35,210 là một trong những con số. 687 00:33:35,210 --> 00:33:38,170 >> DAVID J. Malan: Nhưng mà đoạn ngớ ngẩn từ - là nó CSI, nơi họ đã có một 688 00:33:38,170 --> 00:33:39,970 con số này là quá lớn cho địa chỉ IP. 689 00:33:39,970 --> 00:33:42,940 690 00:33:42,940 --> 00:33:46,110 >> ROB Bowden: Bất kỳ câu hỏi về điều này? 691 00:33:46,110 --> 00:33:51,710 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 692 00:33:51,710 --> 00:33:53,270 những ngôi nhà trong tứ. 693 00:33:53,270 --> 00:33:56,360 Và chúng tôi có một danh sách có thứ tự. 694 00:33:56,360 --> 00:33:59,550 Và chúng tôi muốn in ra mỗi mục chỉ chứa tên nhà. 695 00:33:59,550 --> 00:34:09,090 696 00:34:09,090 --> 00:34:11,870 Vì vậy, chúng ta có một vòng lặp foreach. 697 00:34:11,870 --> 00:34:17,540 Vì vậy, hãy nhớ rằng, cú pháp foreach mảng như mục trong mảng. 698 00:34:17,540 --> 00:34:22,360 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 699 00:34:22,360 --> 00:34:24,060 giá trị bên trong của mảng. 700 00:34:24,060 --> 00:34:26,530 >> Trên phiên đầu tiên, nhà sẽ Cabot House. 701 00:34:26,530 --> 00:34:30,370 Trên một lần lặp thứ hai, nhà sẽ Chuyển phát nhanh là nhà và như vậy. 702 00:34:30,370 --> 00:34:34,370 Vì vậy, đối với mỗi quad như ngôi nhà, chúng tôi chỉ cần đi để in - 703 00:34:34,370 --> 00:34:37,250 bạn cũng có thể lặp lại - 704 00:34:37,250 --> 00:34:42,199 mục danh sách và sau đó tên của nhà và sau đó đóng mục danh sách. 705 00:34:42,199 --> 00:34:45,210 Các dấu ngoặc nhọn là tùy chọn ở đây. 706 00:34:45,210 --> 00:34:49,480 >> Và sau đó chúng tôi cũng đã nói trong câu hỏi bản thân, hãy nhớ để đóng 707 00:34:49,480 --> 00:34:50,770 thẻ danh sách không có thứ tự. 708 00:34:50,770 --> 00:34:53,949 Vì vậy, chúng ta cần phải thoát khỏi chế độ PHP để làm điều này. 709 00:34:53,949 --> 00:35:00,280 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. 710 00:35:00,280 --> 00:35:02,380 >> DAVID J. Malan: Cũng tốt ở đây sẽ đã được sử dụng cho một trường học cũ 711 00:35:02,380 --> 00:35:07,340 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. 712 00:35:07,340 --> 00:35:09,240 Hoàn toàn tốt quá, chỉ một chút wordier. 713 00:35:09,240 --> 00:35:12,170 714 00:35:12,170 --> 00:35:14,742 >> ĐỐI TƯỢNG: Vì vậy, nếu bạn đã đi vào [Nghe được], bạn sẽ làm gì - 715 00:35:14,742 --> 00:35:16,734 Tôi quên những gì các vòng lặp [không nghe được] là. 716 00:35:16,734 --> 00:35:21,380 Bạn có $ khung quad tôi? 717 00:35:21,380 --> 00:35:21,850 >> DAVID J. Malan: Chính xác. 718 00:35:21,850 --> 00:35:23,100 Vâng, chính xác. 719 00:35:23,100 --> 00:35:26,650 720 00:35:26,650 --> 00:35:27,900 >> ROB Bowden: Bất cứ điều gì khác? 721 00:35:27,900 --> 00:35:31,350 722 00:35:31,350 --> 00:35:32,010 >> DAVID J. Malan: Được rồi. 723 00:35:32,010 --> 00:35:32,300 Thương mại-off. 724 00:35:32,300 --> 00:35:38,290 Vì vậy, có những chùm câu trả lời có thể cho mỗi trong số này. 725 00:35:38,290 --> 00:35:40,510 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à 726 00:35:40,510 --> 00:35:41,100 một nhược điểm. 727 00:35:41,100 --> 00:35:44,830 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, 728 00:35:44,830 --> 00:35:47,280 thay vì phía máy chủ, như với PHP. 729 00:35:47,280 --> 00:35:49,450 Vì vậy, một lộn ngược của những gì làm phía khách hàng? 730 00:35:49,450 --> 00:35:53,780 >> 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 731 00:35:53,780 --> 00:35:56,750 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 732 00:35:56,750 --> 00:36:00,390 mili giây hoặc thậm chí một vài giây bằng cách tránh điều đó và chỉ 733 00:36:00,390 --> 00:36:04,670 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à 734 00:36:04,670 --> 00:36:06,650 chỉ kiểm tra, họ đã gõ một cái gì đó trong tên? 735 00:36:06,650 --> 00:36:08,080 Họ đã gõ một cái gì đó trong địa chỉ email? 736 00:36:08,080 --> 00:36:10,950 Họ đã chọn một ký túc xá từ trình đơn thả xuống? 737 00:36:10,950 --> 00:36:14,360 >> 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 738 00:36:14,360 --> 00:36:16,770 hoặc bất cứ điều gì họ có đó là thực sự trên bàn của họ. 739 00:36:16,770 --> 00:36:19,310 Vì vậy, nó chỉ là một người dùng tốt hơn kinh nghiệm thường. 740 00:36:19,310 --> 00:36:24,460 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 741 00:36:24,460 --> 00:36:29,860 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 742 00:36:29,860 --> 00:36:33,980 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. 743 00:36:33,980 --> 00:36:37,030 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ỉ 744 00:36:37,030 --> 00:36:40,110 tắt JavaScript, mà sẽ, do đó, vô hiệu hóa bất kỳ hình thức 745 00:36:40,110 --> 00:36:41,080 xác nhận. 746 00:36:41,080 --> 00:36:44,460 >> 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 747 00:36:44,460 --> 00:36:47,790 telnet và thực sự giả vờ là một trình duyệt bằng cách gửi get 748 00:36:47,790 --> 00:36:49,240 yêu cầu tới một máy chủ. 749 00:36:49,240 --> 00:36:51,030 Và đó chắc chắn không phải sử dụng bất kỳ JavaScript. 750 00:36:51,030 --> 00:36:53,290 Đó chỉ là tôi gõ lệnh tại một bàn phím. 751 00:36:53,290 --> 00:36:57,410 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 752 00:36:57,410 --> 00:37:01,690 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. 753 00:37:01,690 --> 00:37:05,470 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à 754 00:37:05,470 --> 00:37:08,930 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 755 00:37:08,930 --> 00:37:12,800 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ẽ 756 00:37:12,800 --> 00:37:15,450 sẽ không thể là một điều tốt nếu bạn đã giả định nó đã có. 757 00:37:15,450 --> 00:37:16,770 >> Vì vậy, đây là một thực tế gây phiền nhiễu. 758 00:37:16,770 --> 00:37:19,890 Nhưng nói chung, phía khách hàng xác nhận là rất tốt. 759 00:37:19,890 --> 00:37:21,810 Nhưng nó có nghĩa là gấp đôi việc. 760 00:37:21,810 --> 00:37:25,970 Mặc dù có làm tồn tại khác nhau thư viện, thư viện JavaScript cho 761 00:37:25,970 --> 00:37:28,830 Chẳng hạn, mà làm cho nhiều, ít nhiều đau đầu. 762 00:37:28,830 --> 00:37:31,940 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. 763 00:37:31,940 --> 00:37:35,980 Nhưng nhận ra rằng nó là thường việc bổ sung. 764 00:37:35,980 --> 00:37:36,415 Yeah. 765 00:37:36,415 --> 00:37:37,792 >> ĐỐI TƯỢNG: Vì vậy, nếu chúng ta chỉ nói ít an toàn - 766 00:37:37,792 --> 00:37:39,205 >> DAVID J. Malan: [LAUGHS] 767 00:37:39,205 --> 00:37:39,680 Ugh. 768 00:37:39,680 --> 00:37:43,105 Đó là luôn luôn khó khăn hơn những người xét xử. 769 00:37:43,105 --> 00:37:44,480 >> ROB Bowden: Điều đó sẽ đã được chấp nhận. 770 00:37:44,480 --> 00:37:44,810 >> DAVID J. Malan: Cái gì? 771 00:37:44,810 --> 00:37:45,810 >> ROB Bowden: Tôi tạo ra vấn đề này. 772 00:37:45,810 --> 00:37:46,735 Điều đó đã được chấp nhận. 773 00:37:46,735 --> 00:37:47,220 >> DAVID J. Malan: Vâng. 774 00:37:47,220 --> 00:37:47,830 >> ĐỐI TƯỢNG: Cool. 775 00:37:47,830 --> 00:37:51,770 >> ROB Bowden: Nhưng chúng tôi không chấp nhận cho người đầu tiên - 776 00:37:51,770 --> 00:37:53,630 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 777 00:37:53,630 --> 00:37:55,270 giao tiếp với máy chủ. 778 00:37:55,270 --> 00:37:58,355 Chúng tôi không chấp nhận chỉ nhanh hơn. 779 00:37:58,355 --> 00:38:00,080 >> ĐỐI TƯỢNG: Còn không tải lại trang? 780 00:38:00,080 --> 00:38:00,430 >> ROB Bowden: Có. 781 00:38:00,430 --> 00:38:03,000 Đó là một câu trả lời chấp nhận. 782 00:38:03,000 --> 00:38:06,300 >> 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 783 00:38:06,300 --> 00:38:09,780 mà bạn biết những gì bạn đã nói, đó là một khó khăn 784 00:38:09,780 --> 00:38:13,500 dòng để vẽ đôi khi. 785 00:38:13,500 --> 00:38:16,000 Sử dụng một danh sách liên kết thay vì của một mảng để duy trì một 786 00:38:16,000 --> 00:38:17,590 sắp xếp danh sách các số nguyên. 787 00:38:17,590 --> 00:38:21,000 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ọ 788 00:38:21,000 --> 00:38:22,370 giới thiệu là bạn sẽ có được tính năng động. 789 00:38:22,370 --> 00:38:23,030 Họ có thể phát triển. 790 00:38:23,030 --> 00:38:23,950 Họ có thể thu nhỏ. 791 00:38:23,950 --> 00:38:27,370 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 792 00:38:27,370 --> 00:38:28,140 với một mảng. 793 00:38:28,140 --> 00:38:30,310 Hoặc bạn không phải chỉ nói, xin lỗi, người dùng. 794 00:38:30,310 --> 00:38:31,410 Mảng được lấp đầy. 795 00:38:31,410 --> 00:38:35,850 Vì vậy, tăng trưởng năng động của danh sách. 796 00:38:35,850 --> 00:38:37,210 Một nhược điểm mặc dù danh sách liên kết? 797 00:38:37,210 --> 00:38:40,916 798 00:38:40,916 --> 00:38:43,356 >> ĐỐI TƯỢNG: Đó là tuyến tính. 799 00:38:43,356 --> 00:38:45,800 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 800 00:38:45,800 --> 00:38:46,360 >> DAVID J. Malan: Chính xác. 801 00:38:46,360 --> 00:38:50,160 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ể 802 00:38:50,160 --> 00:38:53,170 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 803 00:38:53,170 --> 00:38:53,570 để kết thúc. 804 00:38:53,570 --> 00:38:57,970 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ó 805 00:38:57,970 --> 00:39:00,740 sắp xếp, bạn có thể làm với một mảng. 806 00:39:00,740 --> 00:39:02,390 Và cũng có chi phí khác. 807 00:39:02,390 --> 00:39:02,966 Yeah. 808 00:39:02,966 --> 00:39:03,800 >> ĐỐI TƯỢNG: bộ nhớ không hiệu quả? 809 00:39:03,800 --> 00:39:04,130 >> DAVID J. Malan: Vâng. 810 00:39:04,130 --> 00:39:06,940 Vâng, tôi sẽ không nhất thiết phải nói không hiệu quả. 811 00:39:06,940 --> 00:39:10,110 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 812 00:39:10,110 --> 00:39:13,400 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ẻ. 813 00:39:13,400 --> 00:39:16,660 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à 814 00:39:16,660 --> 00:39:17,830 thực sự loại không tầm thường. 815 00:39:17,830 --> 00:39:19,340 Nó tăng gấp đôi số lượng bộ nhớ. 816 00:39:19,340 --> 00:39:22,330 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ó 817 00:39:22,330 --> 00:39:25,540 8 byte, 16 byte, thậm chí nhiều hơn thế, có thể nó ít 818 00:39:25,540 --> 00:39:26,500 một chi phí cận biên. 819 00:39:26,500 --> 00:39:28,320 Nhưng đó là một chi phí dù sao. 820 00:39:28,320 --> 00:39:31,880 Vì vậy, một trong những người sẽ đã được tốt như nhược điểm. 821 00:39:31,880 --> 00:39:32,110 >> 18. 822 00:39:32,110 --> 00:39:36,100 Sử dụng PHP thay vì C để viết một chương trình dòng lệnh. 823 00:39:36,100 --> 00:39:41,890 Vì vậy, ở đây, nó thường nhanh hơn để sử dụng một ngôn ngữ như PHP hay Ruby hay Python. 824 00:39:41,890 --> 00:39:43,700 Bạn chỉ cần nhanh chóng mở lên một trình soạn thảo văn bản. 825 00:39:43,700 --> 00:39:45,900 Bạn có nhiều chức năng hơn sẵn cho bạn. 826 00:39:45,900 --> 00:39:49,325 PHP có bồn rửa nhà bếp của các chức năng, trong khi đó trong C, bạn 827 00:39:49,325 --> 00:39:50,420 có rất, rất ít. 828 00:39:50,420 --> 00:39:53,820 Trong thực tế, các chàng trai biết cách cứng bạn không có bảng băm. 829 00:39:53,820 --> 00:39:55,000 Bạn không có danh sách liên kết. 830 00:39:55,000 --> 00:39:57,470 Nếu bạn muốn những người, bạn phải thực hiện chúng mình. 831 00:39:57,470 --> 00:40:00,950 >> 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 832 00:40:00,950 --> 00:40:02,920 mà bạn có thể viết mã. 833 00:40:02,920 --> 00:40:06,660 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 834 00:40:06,660 --> 00:40:11,780 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 835 00:40:11,780 --> 00:40:13,570 thường chậm hơn. 836 00:40:13,570 --> 00:40:18,420 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 837 00:40:18,420 --> 00:40:24,440 giây, vì việc giải thích đó thực sự xảy ra. 838 00:40:24,440 --> 00:40:27,060 >> Ngược khác là bạn không cần phải biên dịch. 839 00:40:27,060 --> 00:40:30,130 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ó 840 00:40:30,130 --> 00:40:31,360 hai bước để chạy một chương trình. 841 00:40:31,360 --> 00:40:32,140 Bạn chỉ có một. 842 00:40:32,140 --> 00:40:35,260 Và đó là khá hấp dẫn là tốt. 843 00:40:35,260 --> 00:40:38,450 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. 844 00:40:38,450 --> 00:40:40,230 Cơ sở dữ liệu SQL để được sử dụng cho pset7. 845 00:40:40,230 --> 00:40:42,060 Các tập tin CSV bạn không sử dụng nhiều. 846 00:40:42,060 --> 00:40:45,960 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. 847 00:40:45,960 --> 00:40:49,330 >> 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 848 00:40:49,330 --> 00:40:54,010 chỉ demarked bằng dấu phẩy bên trong của một tập tin văn bản khác. 849 00:40:54,010 --> 00:40:56,740 Và sử dụng một cơ sở dữ liệu SQL là thêm một chút hấp dẫn. 850 00:40:56,740 --> 00:41:00,060 Đâ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. 851 00:41:00,060 --> 00:41:03,790 Và bạn nhận được, có lẽ, chỉ số đó MySQL và cơ sở dữ liệu khác, như 852 00:41:03,790 --> 00:41:07,510 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 853 00:41:07,510 --> 00:41:09,000 sẽ đầu tuyến tính xuống dưới. 854 00:41:09,000 --> 00:41:11,300 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ì đó 855 00:41:11,300 --> 00:41:12,520 tinh thần tương tự. 856 00:41:12,520 --> 00:41:13,930 Vì vậy, họ thường nhanh hơn. 857 00:41:13,930 --> 00:41:16,040 >> Tuy nhiên, một nhược điểm là nó chỉ là công việc nhiều hơn. 858 00:41:16,040 --> 00:41:16,730 Đó là nỗ lực nhiều hơn. 859 00:41:16,730 --> 00:41:18,140 Bạn phải hiểu cơ sở dữ liệu. 860 00:41:18,140 --> 00:41:18,940 Bạn phải cài đặt nó. 861 00:41:18,940 --> 00:41:20,840 Bạn cần một máy chủ để chạy rằng cơ sở dữ liệu trên. 862 00:41:20,840 --> 00:41:22,750 Bạn cần phải hiểu làm thế nào để cấu hình nó. 863 00:41:22,750 --> 00:41:24,930 Vì vậy, đây chỉ là những các loại thương mại-off. 864 00:41:24,930 --> 00:41:27,860 Trong khi một tập tin CSV, bạn có thể tạo ra nó với gedit. 865 00:41:27,860 --> 00:41:28,770 Và bạn tốt để đi. 866 00:41:28,770 --> 00:41:31,550 Không có phức tạp hơn thế. 867 00:41:31,550 --> 00:41:34,870 >> 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 868 00:41:34,870 --> 00:41:37,490 từ điển các từ gợi nhớ của pset5. 869 00:41:37,490 --> 00:41:42,480 Vì vậy, một cố xu hướng tăng, trong lý thuyết ít nhất, là những gì? 870 00:41:42,480 --> 00:41:46,380 Thời gian liên tục, ít nhất là nếu bạn băm trên mỗi cá nhân 871 00:41:46,380 --> 00:41:48,990 chữ cái trong một từ, như bạn có thể có cho pset5. 872 00:41:48,990 --> 00:41:52,720 Đó có thể là năm băm, sáu băm nếu có năm hoặc sáu 873 00:41:52,720 --> 00:41:53,900 chữ cái trong từ. 874 00:41:53,900 --> 00:41:54,580 Và đó là khá tốt. 875 00:41:54,580 --> 00:41:56,910 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à 876 00:41:56,910 --> 00:41:59,320 thời gian thực sự tiệm cận không đổi. 877 00:41:59,320 --> 00:42:05,180 >> Trong khi một bảng băm với riêng chaining, vấn đề có với 878 00:42:05,180 --> 00:42:09,070 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 879 00:42:09,070 --> 00:42:12,700 phụ thuộc vào số thứ đã có trong cấu trúc dữ liệu. 880 00:42:12,700 --> 00:42:15,660 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 881 00:42:15,660 --> 00:42:18,800 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 882 00:42:18,800 --> 00:42:21,960 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 883 00:42:21,960 --> 00:42:26,000 những dây chuyền, mà hiệu quả chuyển giao các thành cái gì đó tuyến tính. 884 00:42:26,000 --> 00:42:29,450 >> 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 885 00:42:29,450 --> 00:42:32,820 chuỗi là nhanh hơn so với một tương ứng thực hiện Trie. 886 00:42:32,820 --> 00:42:35,570 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 887 00:42:35,570 --> 00:42:39,240 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 888 00:42:39,240 --> 00:42:42,410 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 889 00:42:42,410 --> 00:42:45,420 trong bộ nhớ có thể được truy cập thường nhanh hơn. 890 00:42:45,420 --> 00:42:48,180 Và đôi khi bạn có thể đến với một hàm băm thực sự tốt. 891 00:42:48,180 --> 00:42:51,060 Ngay cả khi bạn phải tốn một chút bộ nhớ, bạn có thể, thực sự, có thể 892 00:42:51,060 --> 00:42:54,430 tìm thấy những thứ nhanh chóng và không xấu như tuyến tính. 893 00:42:54,430 --> 00:42:58,410 >> 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 894 00:42:58,410 --> 00:43:00,050 những việc cụ thể chúng tôi đang tìm kiếm. 895 00:43:00,050 --> 00:43:03,080 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 896 00:43:03,080 --> 00:43:04,800 thường bắt gặp ánh mắt của chúng tôi. 897 00:43:04,800 --> 00:43:11,840 >> 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 898 00:43:11,840 --> 00:43:14,540 phải nói điều gì đó về nó. 899 00:43:14,540 --> 00:43:17,910 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 900 00:43:17,910 --> 00:43:19,470 rằng đó là 0 của 1. 901 00:43:19,470 --> 00:43:22,820 Và bảng băm, về mặt lý thuyết, không phải là 0 trong tổng số 1. 902 00:43:22,820 --> 00:43:26,550 Đề cập đến bất cứ điều gì về thời gian chạy nói chung có bạn điểm. 903 00:43:26,550 --> 00:43:32,640 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à 904 00:43:32,640 --> 00:43:34,990 khách quan chậm hơn so với các giải pháp đó là bảng băm. 905 00:43:34,990 --> 00:43:37,250 Vì vậy, nhanh hơn trong và của chính nó là không thực sự đúng. 906 00:43:37,250 --> 00:43:41,550 907 00:43:41,550 --> 00:43:44,380 >> DAVID J. Malan: Dom dom dom de. 908 00:43:44,380 --> 00:43:46,686 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 909 00:43:46,686 --> 00:43:47,500 được phát âm, phải không? 910 00:43:47,500 --> 00:43:50,400 >> ROB Bowden: thực sự tôi không có ý kiến. 911 00:43:50,400 --> 00:43:51,650 >> DAVID J. Malan: Nó làm cảm giác trong đầu tôi. 912 00:43:51,650 --> 00:43:53,830 913 00:43:53,830 --> 00:43:57,580 >> ROB Bowden: tôi đang làm này. 914 00:43:57,580 --> 00:43:58,020 OK. 915 00:43:58,020 --> 00:44:04,243 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ể 916 00:44:04,243 --> 00:44:06,040 đã thấy trong các kỳ thi vừa qua. 917 00:44:06,040 --> 00:44:12,200 Vì vậy, chúng ta hãy nhìn vào điều này. 918 00:44:12,200 --> 00:44:18,170 Vì vậy, từ nút HTML, chúng ta có hai trẻ em, người đứng đầu và cơ thể. 919 00:44:18,170 --> 00:44:20,570 Vì vậy, chúng tôi chi nhánh - đứng đầu và cơ thể. 920 00:44:20,570 --> 00:44:22,280 Người đứng đầu có một thẻ tiêu đề. 921 00:44:22,280 --> 00:44:23,710 Vì vậy, chúng tôi có một tiêu đề. 922 00:44:23,710 --> 00:44:28,450 >> 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à 923 00:44:28,450 --> 00:44:30,430 yếu tố bên trong cây này. 924 00:44:30,430 --> 00:44:36,260 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 925 00:44:36,260 --> 00:44:37,380 loại nút. 926 00:44:37,380 --> 00:44:41,450 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 927 00:44:41,450 --> 00:44:42,560 các nút văn bản. 928 00:44:42,560 --> 00:44:46,250 Vì vậy, quên đi những đã phần nào một sai lầm phổ biến. 929 00:44:46,250 --> 00:44:48,770 >> Cơ thể có ba đứa con - ba divs. 930 00:44:48,770 --> 00:44:53,340 Vì vậy, div, div, div và sau đó văn bản nút con của những người divs. 931 00:44:53,340 --> 00:44:55,900 Đó là khá nhiều đó cho câu hỏi đó. 932 00:44:55,900 --> 00:44:57,860 >> DAVID J. Malan: Và đó là đáng chú ý, mặc dù chúng tôi không dừng lại ở những 933 00:44:57,860 --> 00:45:01,040 chi tiết trong thời gian chúng ta dành trên JavaScript, rằng thứ tự nào, trong 934 00:45:01,040 --> 00:45:02,290 Trên thực tế, vấn đề về mặt kỹ thuật. 935 00:45:02,290 --> 00:45:06,330 Vì vậy, nếu đầu đến trước khi cơ thể trong HTML, sau đó nó sẽ xuất hiện vào 936 00:45:06,330 --> 00:45:08,860 bên trái của cơ thể trong DOM thực tế. 937 00:45:08,860 --> 00:45:12,265 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 938 00:45:12,265 --> 00:45:13,260 nó không thành vấn đề. 939 00:45:13,260 --> 00:45:17,470 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 940 00:45:17,470 --> 00:45:20,960 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 941 00:45:20,960 --> 00:45:24,720 làm anyway - trên xuống dưới, trái sang phải. 942 00:45:24,720 --> 00:45:26,116 >> ROB Bowden: Các câu hỏi về điều đó? 943 00:45:26,116 --> 00:45:29,080 944 00:45:29,080 --> 00:45:30,000 Tôi có nên làm tiếp theo? 945 00:45:30,000 --> 00:45:32,380 >> DAVID J. Malan: Chắc chắn. 946 00:45:32,380 --> 00:45:33,810 >> ROB Bowden: OK. 947 00:45:33,810 --> 00:45:39,320 Vì vậy, đây là tràn bộ đệm câu hỏi tấn công. 948 00:45:39,320 --> 00:45:43,740 Đ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ù 949 00:45:43,740 --> 00:45:46,170 chương trình này vào thực hiện mã tùy ý? 950 00:45:46,170 --> 00:45:51,860 Vì vậy, argv1, dòng lệnh đầu tiên đối số cho chương trình này, có thể được 951 00:45:51,860 --> 00:45:53,920 tùy tiện lâu. 952 00:45:53,920 --> 00:45:59,160 Nhưng ở đây chúng tôi đang sử dụng memcpy để sao chép argv1, mà ở đây là quán bar. 953 00:45:59,160 --> 00:46:00,165 Chúng tôi đang đi qua nó như là đối số. 954 00:46:00,165 --> 00:46:02,050 Và do đó, nó tham gia vào các thanh tên. 955 00:46:02,050 --> 00:46:08,040 >> Vì vậy, chúng tôi đang memcpying thanh vào bộ đệm này c. 956 00:46:08,040 --> 00:46:09,400 Bao nhiêu byte chúng ta sao chép? 957 00:46:09,400 --> 00:46:14,040 Tuy nhiên cũng nhiều byte thanh xảy ra được sử dụng, độ dài của tham số. 958 00:46:14,040 --> 00:46:17,930 Nhưng c chỉ 12 byte rộng. 959 00:46:17,930 --> 00:46:22,280 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 960 00:46:22,280 --> 00:46:25,470 sẽ tràn này đệm cụ thể. 961 00:46:25,470 --> 00:46:31,000 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 ý? 962 00:46:31,000 --> 00:46:34,910 >> Vì vậy, hãy nhớ rằng ở đây chính đang kêu gọi foo. 963 00:46:34,910 --> 00:46:37,340 Và như vậy thì cuộc gọi chính foo. 964 00:46:37,340 --> 00:46:40,408 Chúng ta hãy vẽ này. 965 00:46:40,408 --> 00:46:44,720 966 00:46:44,720 --> 00:46:46,990 Vì vậy, chúng ta có ngăn xếp của chúng tôi. 967 00:46:46,990 --> 00:46:49,090 Và chính có một stack frame ở phía dưới. 968 00:46:49,090 --> 00:46:51,860 969 00:46:51,860 --> 00:46:53,250 Tại một số điểm, các cuộc gọi chính foo. 970 00:46:53,250 --> 00:46:55,390 Vâng, ngay lập tức, cuộc gọi chính foo. 971 00:46:55,390 --> 00:46:57,130 Và do đó foo được stack frame riêng của mình. 972 00:46:57,130 --> 00:46:59,650 973 00:46:59,650 --> 00:47:02,220 >> Bây giờ, tại một số điểm, foo sẽ trở lại. 974 00:47:02,220 --> 00:47:06,810 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 975 00:47:06,810 --> 00:47:10,610 là để biết được nơi chúng ta nên tiếp tục trong chính. 976 00:47:10,610 --> 00:47:13,100 Chúng ta có thể gọi foo từ một tổng thể loạt các địa điểm khác nhau. 977 00:47:13,100 --> 00:47:14,620 Làm thế nào để chúng tôi biết được nơi để trở lại? 978 00:47:14,620 --> 00:47:16,460 Vâng, chúng ta cần phải lưu trữ ở đâu đó rằng. 979 00:47:16,460 --> 00:47:23,010 >> 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 980 00:47:23,010 --> 00:47:24,070 lợi nhuận foo. 981 00:47:24,070 --> 00:47:26,350 Và đây là địa chỉ trả lại. 982 00:47:26,350 --> 00:47:30,490 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à 983 00:47:30,490 --> 00:47:37,550 đệm này c được lưu trữ, chúng ta hãy nói, ở đây là c. 984 00:47:37,550 --> 00:47:39,690 Vì vậy, chúng tôi đã có 12 byte cho c. 985 00:47:39,690 --> 00:47:40,540 Đây là c. 986 00:47:40,540 --> 00:47:43,030 Và đây là foo của chồng nhẫn. 987 00:47:43,030 --> 00:47:49,970 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 988 00:47:49,970 --> 00:47:54,570 đối số dòng đó là dài hơn 12 nhân vật, sau đó chúng ta sẽ 989 00:47:54,570 --> 00:47:57,540 tràn bộ đệm này. 990 00:47:57,540 --> 00:47:59,910 >> Chúng ta có thể tiếp tục đi. 991 00:47:59,910 --> 00:48:02,220 Và tại một số điểm, chúng tôi đi xa đủ để chúng ta bắt đầu 992 00:48:02,220 --> 00:48:05,120 ghi đè lên địa chỉ này trở lại. 993 00:48:05,120 --> 00:48:08,310 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 994 00:48:08,310 --> 00:48:14,220 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 995 00:48:14,220 --> 00:48:19,490 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. 996 00:48:19,490 --> 00:48:24,320 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 997 00:48:24,320 --> 00:48:29,255 quay trở lại nơi nào đó trong printDef chức năng hoặc một nơi nào đó trong malloc 998 00:48:29,255 --> 00:48:31,830 chức năng, chỉ cần bất cứ nơi nào tùy ý. 999 00:48:31,830 --> 00:48:38,420 >> 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. 1000 00:48:38,420 --> 00:48:41,920 Và sau đó bạn bắt đầu thực hiện những như dòng mã. 1001 00:48:41,920 --> 00:48:46,610 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. 1002 00:48:46,610 --> 00:48:52,210 Và ông đã kiểm soát hoàn toàn trên chương trình của bạn. 1003 00:48:52,210 --> 00:48:53,460 Câu hỏi về điều đó? 1004 00:48:53,460 --> 00:48:56,380 1005 00:48:56,380 --> 00:49:00,970 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 1006 00:49:00,970 --> 00:49:02,620 rằng nó không còn dễ bị tổn thương. 1007 00:49:02,620 --> 00:49:03,870 >> Do đó, có một vài cách bạn có thể làm điều này. 1008 00:49:03,870 --> 00:49:10,900 1009 00:49:10,900 --> 00:49:13,330 Chúng tôi vẫn có c chỉ là chiều dài 12. 1010 00:49:13,330 --> 00:49:16,480 Bạn có thể đã thay đổi này như một phần của giải pháp của bạn. 1011 00:49:16,480 --> 00:49:18,930 Chúng tôi cũng đã thêm một kiểm tra để đảm chắc chắn thanh không null. 1012 00:49:18,930 --> 00:49:24,460 Mặc dù bạn không cần rằng đối với tín dụng đầy đủ. 1013 00:49:24,460 --> 00:49:27,690 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. 1014 00:49:27,690 --> 00:49:31,650 Nếu nó lớn hơn 12, sau đó không thực sự làm các bản sao. 1015 00:49:31,650 --> 00:49:33,010 Vì vậy, đó là một cách để sửa chữa nó. 1016 00:49:33,010 --> 00:49:36,750 >> 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ó 1017 00:49:36,750 --> 00:49:39,310 có chiều dài strlen (bar). 1018 00:49:39,310 --> 00:49:43,370 Một cách khác để sửa chữa nó là thực sự chỉ cần trả lại. 1019 00:49:43,370 --> 00:49:46,690 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ả 1020 00:49:46,690 --> 00:49:51,830 dòng mã, bạn đã có thể nhận tín dụng đầy đủ, vì chức năng này 1021 00:49:51,830 --> 00:49:54,150 không thực sự thực hiện bất cứ điều gì. 1022 00:49:54,150 --> 00:49:57,650 Nó sao chép các dòng lệnh đối số vào một số mảng trong 1023 00:49:57,650 --> 00:49:59,960 stack frame địa phương. 1024 00:49:59,960 --> 00:50:01,310 Và sau đó là điều đang trở lại. 1025 00:50:01,310 --> 00:50:04,020 Và bất cứ điều gì hoàn đã biến mất. 1026 00:50:04,020 --> 00:50:09,740 Vì vậy, trở lại cũng là một đầy đủ cách để nhận được tín dụng đầy đủ. 1027 00:50:09,740 --> 00:50:13,425 >> 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 1028 00:50:13,425 --> 00:50:15,580 đặc tả dù sao. 1029 00:50:15,580 --> 00:50:18,260 >> ROB Bowden: Các câu hỏi về điều đó? 1030 00:50:18,260 --> 00:50:22,270 Một trong những điều mà bạn ít nhất cần thiết để có biên dịch mã. 1031 00:50:22,270 --> 00:50:24,810 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 1032 00:50:24,810 --> 00:50:29,130 biên dịch, chúng tôi không chấp nhận điều đó. 1033 00:50:29,130 --> 00:50:31,350 Không có câu hỏi? 1034 00:50:31,350 --> 00:50:33,320 OK. 1035 00:50:33,320 --> 00:50:34,580 >> DAVID J. Malan: Bạn có muốn nói danh hiệu này? 1036 00:50:34,580 --> 00:50:37,230 >> ROB Bowden: số 1037 00:50:37,230 --> 00:50:40,470 >> 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. 1038 00:50:40,470 --> 00:50:43,870 Đây là nghĩa đen cùng một vấn đề như các bài kiểm tra đầu tiên. 1039 00:50:43,870 --> 00:50:46,140 Và nó gần như giống nhau vấn đề như pset1. 1040 00:50:46,140 --> 00:50:49,980 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ể 1041 00:50:49,980 --> 00:50:52,330 giải quyết với một chút lặp đi lặp lại đơn giản hơn. 1042 00:50:52,330 --> 00:50:55,680 Và thực sự, những gì chúng tôi đã nhận được ở đây là không quá nhiều logic, 1043 00:50:55,680 --> 00:50:58,100 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à 1044 00:50:58,100 --> 00:51:01,850 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à 1045 00:51:01,850 --> 00:51:04,790 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ì 1046 00:51:04,790 --> 00:51:05,290 lập trình. 1047 00:51:05,290 --> 00:51:07,820 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. 1048 00:51:07,820 --> 00:51:10,060 >> Và quả thật, đó là những gì chúng tôi đã cố gắng để hút sự chú ý của bạn để. 1049 00:51:10,060 --> 00:51:12,060 Đây là một chương trình PHP dòng lệnh. 1050 00:51:12,060 --> 00:51:16,690 Do đó, C mã ở đây, trong khi đúng trong C, không chính xác cho PHP. 1051 00:51:16,690 --> 00:51:17,940 Nhưng mã thực sự là như nhau. 1052 00:51:17,940 --> 00:51:21,720 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 1053 00:51:21,720 --> 00:51:25,630 nó gần như giống hệt nhau, ngoại trừ một số dấu hiệu đồng đô la và cho 1054 00:51:25,630 --> 00:51:27,250 trường hợp không có một kiểu dữ liệu. 1055 00:51:27,250 --> 00:51:31,720 Đặ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 1056 00:51:31,720 --> 00:51:33,730 trường hợp, từ 1 lên đến 7. 1057 00:51:33,730 --> 00:51:34,910 >> Chúng ta có thể thực hiện nó 0 chỉ số. 1058 00:51:34,910 --> 00:51:37,320 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 1059 00:51:37,320 --> 00:51:38,200 1-7. 1060 00:51:38,200 --> 00:51:40,300 Nếu bạn muốn một khối, sau đó hai khối, sau đó ba, sau đó 1061 00:51:40,300 --> 00:51:41,770 dấu chấm, dấu chấm, chấm bảy. 1062 00:51:41,770 --> 00:51:45,960 Chúng tôi đã j được khởi tạo bằng 1 và sau đó đếm trên lên đến tôi. 1063 00:51:45,960 --> 00:51:48,150 Và tất cả mọi thứ ở đây là nếu không giống hệt nhau. 1064 00:51:48,150 --> 00:51:49,790 Nhưng đáng chú ý là một vài điều. 1065 00:51:49,790 --> 00:51:53,230 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 1066 00:51:53,230 --> 00:51:54,560 cho nổ mạnh. 1067 00:51:54,560 --> 00:51:58,770 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 1068 00:51:58,770 --> 00:52:02,160 thấy rằng bạn muốn sử dụng để giải thích tập tin này. 1069 00:52:02,160 --> 00:52:04,710 >> Và sau đó dòng sau đó, của Tất nhiên, có nghĩa là vào chế độ PHP. 1070 00:52:04,710 --> 00:52:07,740 Và dòng ở dưới cùng rất có nghĩa là chế độ thoát PHP. 1071 00:52:07,740 --> 00:52:09,740 Và các công trình này, nói chung, với giải thích ngôn ngữ. 1072 00:52:09,740 --> 00:52:14,370 Đó 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. 1073 00:52:14,370 --> 00:52:17,320 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 1074 00:52:17,320 --> 00:52:22,320 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. 1075 00:52:22,320 --> 00:52:25,270 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ả 1076 00:52:25,270 --> 00:52:27,060 mà chiếu sáng cho người sử dụng. 1077 00:52:27,060 --> 00:52:30,100 >> 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. 1078 00:52:30,100 --> 00:52:35,690 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ó 1079 00:52:35,690 --> 00:52:36,500 thực thi. 1080 00:52:36,500 --> 00:52:39,630 Vì vậy, chmod a + x foo sẽ làm điều đó. 1081 00:52:39,630 --> 00:52:41,460 Và nếu bạn cũng có thể thêm các công việc đây. 1082 00:52:41,460 --> 00:52:45,320 Nhưng thực sự, vấn đề đã nhận được ở in ra một cái gì đó như thế này. 1083 00:52:45,320 --> 00:52:51,100 Không có HTML, không có C-mã chắc chắn, chỉ là một số PHP. 1084 00:52:51,100 --> 00:52:54,100 Vì vậy, Milo sau đó trở về trong vấn đề 25. 1085 00:52:54,100 --> 00:52:58,050 Và 25, bạn đã được đưa ra sau đây đang xương, đó là một 1086 00:52:58,050 --> 00:52:59,730 trang web khá đơn giản. 1087 00:52:59,730 --> 00:53:04,230 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ể 1088 00:53:04,230 --> 00:53:09,160 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 1089 00:53:09,160 --> 00:53:11,950 với một ý tưởng về tên, một với một ý tưởng nút. 1090 00:53:11,950 --> 00:53:14,240 >> Việc đầu tiên là loại văn bản, thứ hai có kiểu trình. 1091 00:53:14,240 --> 00:53:16,930 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 1092 00:53:16,930 --> 00:53:19,230 các bạn có tùy chọn mà để giải quyết vấn đề này. 1093 00:53:19,230 --> 00:53:21,130 Bạn không cần phải chặt chẽ tất cả các ID. 1094 00:53:21,130 --> 00:53:23,580 Nhưng nó cho phép bạn để giải quyết nó theo những cách khác nhau. 1095 00:53:23,580 --> 00:53:27,050 Và ở đầu trang, nhận thấy rằng mục tiêu là để kích hoạt 1096 00:53:27,050 --> 00:53:27,960 một cửa sổ như thế này - 1097 00:53:27,960 --> 00:53:28,780 Xin chào, Milo - 1098 00:53:28,780 --> 00:53:31,270 để bật lên trong trình duyệt sử dụng siêu đơn giản, nếu 1099 00:53:31,270 --> 00:53:33,190 không xấu xí, chức năng cảnh báo. 1100 00:53:33,190 --> 00:53:37,480 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 1101 00:53:37,480 --> 00:53:41,290 đệ 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 đó 1102 00:53:41,290 --> 00:53:45,640 đáp ứng trình đó bằng cách lấy giá trị mà người dùng gõ 1103 00:53:45,640 --> 00:53:50,120 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. 1104 00:53:50,120 --> 00:53:53,460 >> 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 1105 00:53:53,460 --> 00:53:56,880 cú pháp bối rối lúc đầu tiên. 1106 00:53:56,880 --> 00:54:00,760 Bạn có thể làm điều này với mã DOM tinh khiết - document.getelement bởi ID. 1107 00:54:00,760 --> 00:54:02,530 Nhưng chúng ta hãy nhìn vào phiên bản này. 1108 00:54:02,530 --> 00:54:05,110 Tôi có một vài quan trọng dòng đầu tiên. 1109 00:54:05,110 --> 00:54:09,460 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 1110 00:54:09,460 --> 00:54:13,830 trong, tôi tin rằng, form2.html từ lớp trong tuần 9. 1111 00:54:13,830 --> 00:54:16,960 Và điều này chỉ nói rằng, thực hiện các mã sau khi 1112 00:54:16,960 --> 00:54:18,430 các tài liệu đã sẵn sàng. 1113 00:54:18,430 --> 00:54:21,770 Điều này là quan trọng chỉ vì Các trang HTML được đọc trên xuống 1114 00:54:21,770 --> 00:54:23,280 dưới, trái sang phải. 1115 00:54:23,280 --> 00:54:27,910 >> 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 1116 00:54:27,910 --> 00:54:31,560 yếu tố, một số thẻ HTML, đó là xuống ở đây, bạn đang làm nó quá sớm, 1117 00:54:31,560 --> 00:54:34,220 bởi vì điều này có thậm chí không được đọc vào bộ nhớ. 1118 00:54:34,220 --> 00:54:37,740 Vì vậy, bằng cách nói document.ready này dòng, chúng tôi đang nói, 1119 00:54:37,740 --> 00:54:39,040 đây là một số mã, trình duyệt. 1120 00:54:39,040 --> 00:54:42,440 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 1121 00:54:42,440 --> 00:54:44,320 cây tồn tại trong bộ nhớ. 1122 00:54:44,320 --> 00:54:47,110 Đây là một trong nhiều hơn một chút đơn giản, nếu cú ​​pháp một 1123 00:54:47,110 --> 00:54:51,890 chút khác nhau, nơi tôi nói, lấy các phần tử HTML mà độc đáo 1124 00:54:51,890 --> 00:54:53,560 nhận dạng là yếu tố đầu vào. 1125 00:54:53,560 --> 00:54:56,220 Đó là những gì các tag băm biểu thị, các ID duy nhất. 1126 00:54:56,220 --> 00:54:58,070 Và sau đó tôi sẽ gọi. Trình. 1127 00:54:58,070 --> 00:55:01,660 >> 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à 1128 00:55:01,660 --> 00:55:05,850 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. 1129 00:55:05,850 --> 00:55:08,990 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à. 1130 00:55:08,990 --> 00:55:10,440 Đó là một nút trong một cây - 1131 00:55:10,440 --> 00:55:16,580 . 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 1132 00:55:16,580 --> 00:55:17,700 các mã sau đây. 1133 00:55:17,700 --> 00:55:20,290 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. 1134 00:55:20,290 --> 00:55:23,760 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 1135 00:55:23,760 --> 00:55:24,720 chức năng ẩn danh. 1136 00:55:24,720 --> 00:55:27,640 Nó không phải ở tất cả trí tuệ thú vị khác hơn là nó không có tên, 1137 00:55:27,640 --> 00:55:30,220 đó là tốt nếu bạn chỉ bao giờ sẽ gọi nó một lần. 1138 00:55:30,220 --> 00:55:34,490 Và bên trong có tôi thực sự xử lý nộp mẫu đơn. 1139 00:55:34,490 --> 00:55:36,810 Đầu tiên tôi khai báo một biến gọi là giá trị. 1140 00:55:36,810 --> 00:55:40,610 Và sau đó là hiệu quả của việc này là gì nhấn mạnh phần ở đây bây giờ? 1141 00:55:40,610 --> 00:55:44,755 Điều đó có làm ở một mức độ cao đối với tôi? 1142 00:55:44,755 --> 00:55:48,539 >> ĐỐI TƯỢNG: Nó được giá trị mà người sử dụng không trong HTML dưới đây. 1143 00:55:48,539 --> 00:55:50,920 Nó được ID đó và sau đó tìm thấy giá trị của nó. 1144 00:55:50,920 --> 00:55:51,590 >> DAVID J. Malan: Chính xác. 1145 00:55:51,590 --> 00:55:54,300 Nó lấy các nút, mà độc đáo định danh là tên. 1146 00:55:54,300 --> 00:55:56,900 Nó được giá trị trong đó, mà là, có lẽ, những gì người dùng 1147 00:55:56,900 --> 00:55:58,190 gõ chính mình. 1148 00:55:58,190 --> 00:56:01,020 Và sau đó nó lưu rằng trong biến được gọi là giá trị. 1149 00:56:01,020 --> 00:56:03,720 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. 1150 00:56:03,720 --> 00:56:09,250 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 1151 00:56:09,250 --> 00:56:10,500 document.getElementById. 1152 00:56:10,500 --> 00:56:12,860 1153 00:56:12,860 --> 00:56:15,460 Và đây là lý do tại sao nó là một chút tẻ nhạt để không sử dụng jQuery. 1154 00:56:15,460 --> 00:56:16,710 "Tên" giá trị.. 1155 00:56:16,710 --> 00:56:18,330 1156 00:56:18,330 --> 00:56:19,620 Vì vậy, hoàn toàn chấp nhận được. 1157 00:56:19,620 --> 00:56:22,770 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à 1158 00:56:22,770 --> 00:56:25,230 chắc chắn phổ biến hơn giữa các lập trình viên. 1159 00:56:25,230 --> 00:56:27,590 >> 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 đề 1160 00:56:27,590 --> 00:56:30,820 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 1161 00:56:30,820 --> 00:56:32,580 tên, không hiển thị một cảnh báo. 1162 00:56:32,580 --> 00:56:35,390 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 1163 00:56:35,390 --> 00:56:37,850 quote-unquote nếu có không có gì thực sự ở đó. 1164 00:56:37,850 --> 00:56:40,880 Nhưng nếu nó không phải bằng quote-unquote, Tôi muốn gọi cảnh báo. 1165 00:56:40,880 --> 00:56:45,610 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à 1166 00:56:45,610 --> 00:56:48,130 làm những gì trong JavaScript? 1167 00:56:48,130 --> 00:56:48,740 Nối. 1168 00:56:48,740 --> 00:56:50,690 Vì vậy, nó giống như PHPs dấu chấm. 1169 00:56:50,690 --> 00:56:52,820 Cùng một ý tưởng, cú pháp hơi khác nhau. 1170 00:56:52,820 --> 00:56:55,280 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 - 1171 00:56:55,280 --> 00:56:57,750 Xin chào, vậy và như vậy. 1172 00:56:57,750 --> 00:56:59,200 >> Và sau đó chi tiết cuối cùng là thế này. 1173 00:56:59,200 --> 00:57:04,970 Tại sao tôi trở lại bên trong sai chức năng ẩn danh này? 1174 00:57:04,970 --> 00:57:07,420 >> ĐỐI TƯỢNG: Không có giá trị. 1175 00:57:07,420 --> 00:57:09,380 Bạn đặt nó ở dạng. 1176 00:57:09,380 --> 00:57:12,320 1177 00:57:12,320 --> 00:57:16,730 Nó chỉ nói, nếu giá trị không phải là bằng trống, sau đó làm điều đó. 1178 00:57:16,730 --> 00:57:20,040 1179 00:57:20,040 --> 00:57:20,940 Có một trống trong trình đó. 1180 00:57:20,940 --> 00:57:21,170 >> DAVID J. Malan: OK. 1181 00:57:21,170 --> 00:57:21,640 Cẩn thận mặc dù. 1182 00:57:21,640 --> 00:57:22,830 Không có ai khác ở đây. 1183 00:57:22,830 --> 00:57:25,510 Và return false là bên ngoài của nếu có điều kiện. 1184 00:57:25,510 --> 00:57:29,470 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 1185 00:57:29,470 --> 00:57:32,310 biểu mẫu được gửi. 1186 00:57:32,310 --> 00:57:36,810 Những gì không trở về bên trong giả này xử lý sự kiện, như nó được gọi là, 1187 00:57:36,810 --> 00:57:38,450 các sự kiện trong câu hỏi được trình? 1188 00:57:38,450 --> 00:57:42,350 1189 00:57:42,350 --> 00:57:44,470 >> ĐỐI TƯỢNG: Bởi vì nó chỉ xảy ra một lần. 1190 00:57:44,470 --> 00:57:45,320 >> DAVID J. Malan: Chỉ xảy ra một lần. 1191 00:57:45,320 --> 00:57:46,821 Không hoàn toàn. 1192 00:57:46,821 --> 00:57:47,292 Yeah? 1193 00:57:47,292 --> 00:57:50,589 >> ĐỐI TƯỢNG: Nó ngăn chặn các hình thức từ trình hành vi mặc định, 1194 00:57:50,589 --> 00:57:52,480 mà sẽ làm cho tải lại trang. 1195 00:57:52,480 --> 00:57:53,110 >> DAVID J. Malan: Chính xác. 1196 00:57:53,110 --> 00:57:56,490 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à 1197 00:57:56,490 --> 00:57:57,670 được gửi. 1198 00:57:57,670 --> 00:58:02,240 Nhưng như bạn đề nghị, nó thực sự không được đệ trình theo cách HTTP sự thật. 1199 00:58:02,240 --> 00:58:06,870 Khi bạn nhấn Submit, vì chúng tôi xử lý onSubmit, chúng ta chặn 1200 00:58:06,870 --> 00:58:09,040 mà hình thức trình như vậy để nói chuyện. 1201 00:58:09,040 --> 00:58:11,290 Chúng tôi sau đó làm việc của chúng tôi với mã JavaScript. 1202 00:58:11,290 --> 00:58:14,070 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 1203 00:58:14,070 --> 00:58:18,430 phân chia thứ hai sau đó là cho cả hình thức bản thân để trình web 1204 00:58:18,430 --> 00:58:22,800 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ư 1205 00:58:22,800 --> 00:58:26,180 q = mèo hoặc bất cứ điều gì chúng tôi đã làm, Ví dụ, trong lớp học. 1206 00:58:26,180 --> 00:58:29,640 Tôi không muốn điều đó xảy ra, bởi vì không có nghe máy chủ này 1207 00:58:29,640 --> 00:58:30,690 tạo trình. 1208 00:58:30,690 --> 00:58:32,320 Nó hoàn toàn thực hiện trong mã JavaScript. 1209 00:58:32,320 --> 00:58:35,760 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 1210 00:58:35,760 --> 00:58:38,870 không có ý định cho điều này bao giờ đi đến máy chủ. 1211 00:58:38,870 --> 00:58:40,780 >> Vì vậy, nó đã được nộp. 1212 00:58:40,780 --> 00:58:44,340 Nhưng chúng ta đang ngăn chặn hình thức trình và ngăn chặn mặc định 1213 00:58:44,340 --> 00:58:47,477 hành vi, mà là để thực sự đi tất cả các cách để các máy chủ. 1214 00:58:47,477 --> 00:58:48,730 >> ĐỐI TƯỢNG: Vì vậy, giữ nó phía khách hàng. 1215 00:58:48,730 --> 00:58:49,780 >> DAVID J. Malan: Giữ nó phía khách hàng. 1216 00:58:49,780 --> 00:58:51,030 Chính xác. 1217 00:58:51,030 --> 00:58:53,240 1218 00:58:53,240 --> 00:58:55,757 Lên tiếp theo là của tôi oh MySQL. 1219 00:58:55,757 --> 00:59:00,000 1220 00:59:00,000 --> 00:59:00,430 >> ROB Bowden: OK. 1221 00:59:00,430 --> 00:59:04,990 Vì vậy, câu hỏi đầu tiên này nói chung thô cho người dân. 1222 00:59:04,990 --> 00:59:07,270 Mặc dù những người sau đó đã tốt hơn. 1223 00:59:07,270 --> 00:59:12,260 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. 1224 00:59:12,260 --> 00:59:17,750 Và cả hai có một số điều về họ mà 1225 00:59:17,750 --> 00:59:20,620 làm cho sự lựa chọn khó khăn. 1226 00:59:20,620 --> 00:59:24,430 Vì vậy, int không phải là một hợp lệ gõ cho số. 1227 00:59:24,430 --> 00:59:29,410 Lý do là một tài khoản 12 chữ số số, một int là không đủ lớn để 1228 00:59:29,410 --> 00:59:31,070 lưu trữ tổng số chữ số. 1229 00:59:31,070 --> 00:59:36,570 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 đó. 1230 00:59:36,570 --> 00:59:42,090 Một lựa chọn khác có thể có được một lĩnh vực char chiều dài 12. 1231 00:59:42,090 --> 00:59:44,560 Vì vậy, một trong những người sẽ làm việc. 1232 00:59:44,560 --> 00:59:46,100 Int sẽ không được. 1233 00:59:46,100 --> 00:59:50,170 >> Bây giờ, sự cân bằng, nghĩ lại pset7. 1234 00:59:50,170 --> 00:59:59,540 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 - 1235 00:59:59,540 --> 01:00:00,550 >> DAVID J. Malan: Tiền mặt. 1236 01:00:00,550 --> 01:00:01,060 >> ROB Bowden: Tiền mặt. 1237 01:00:01,060 --> 01:00:05,710 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ó. 1238 01:00:05,710 --> 01:00:10,950 Vì vậy, lý do chúng tôi làm điều đó là bởi vì, hãy nhớ, phao nổi. 1239 01:00:10,950 --> 01:00:12,480 Có dấu chấm động trong độ chính xác. 1240 01:00:12,480 --> 01:00:18,200 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. 1241 01:00:18,200 --> 01:00:23,630 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. 1242 01:00:23,630 --> 01:00:27,630 Đó 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. 1243 01:00:27,630 --> 01:00:30,230 >> DAVID J. Malan: Và cũng có thể, quá, mặc dù nó có thể là thông minh trong khác 1244 01:00:30,230 --> 01:00:32,760 bối cảnh để suy nghĩ, có lẽ điều này là cơ hội để một int. 1245 01:00:32,760 --> 01:00:34,420 Tôi sẽ theo dõi những thứ trong đồng xu. 1246 01:00:34,420 --> 01:00:38,670 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à 1247 01:00:38,670 --> 01:00:40,380 có nghĩa là nó chỉ có thể là một int. 1248 01:00:40,380 --> 01:00:45,310 Và một sự tinh tế quá với số là nó không có nghĩa là 1249 01:00:45,310 --> 01:00:46,180 là một câu hỏi trick. 1250 01:00:46,180 --> 01:00:49,860 Nhưng nhớ lại rằng một int trong MySQL, như trong C, ít nhất là trong 1251 01:00:49,860 --> 01:00:51,440 thiết bị, là 32-bit. 1252 01:00:51,440 --> 01:00:53,960 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à 1253 01:00:53,960 --> 01:00:56,910 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 1254 01:00:56,910 --> 01:01:00,710 với một số 32-bit là khoảng những gì? 1255 01:01:00,710 --> 01:01:02,760 >> Số những gì chúng ta luôn luôn nói không? 1256 01:01:02,760 --> 01:01:04,530 2 đến 32, đó là những gì gần? 1257 01:01:04,530 --> 01:01:07,492 1258 01:01:07,492 --> 01:01:08,780 Bạn không cần phải biết chính xác. 1259 01:01:08,780 --> 01:01:10,580 Nhưng khoảng là hữu ích trong cuộc sống. 1260 01:01:10,580 --> 01:01:12,200 Đó là khoảng 4 tỷ USD. 1261 01:01:12,200 --> 01:01:14,430 Vì vậy, chúng tôi đã nói rằng một vài lần. 1262 01:01:14,430 --> 01:01:16,360 Tôi biết tôi đã nói rằng một vài lần. 1263 01:01:16,360 --> 01:01:17,670 Và nó là khoảng 4 tỷ USD. 1264 01:01:17,670 --> 01:01:19,710 Và đó là một nguyên tắc của ngón tay cái biết. 1265 01:01:19,710 --> 01:01:21,880 Nếu bạn có 8 bit, 256 là con số kỳ diệu. 1266 01:01:21,880 --> 01:01:24,160 Nếu bạn có 32 bit, 4 tỷ cho hay phải mất. 1267 01:01:24,160 --> 01:01:27,140 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 1268 01:01:27,140 --> 01:01:30,970 12, có nghĩa là rõ ràng không đủ biểu cảm để nắm bắt một 1269 01:01:30,970 --> 01:01:34,220 Số tài khoản 12 chữ số. 1270 01:01:34,220 --> 01:01:34,940 >> ROB Bowden: OK. 1271 01:01:34,940 --> 01:01:38,520 Vì vậy, những người khác đã đi tốt hơn. 1272 01:01:38,520 --> 01:01:40,900 Vì vậy, giả sử rằng ngân hàng áp đặt một hàng tháng $ 20 1273 01:01:40,900 --> 01:01:42,400 phí bảo trì trên tất cả các tài khoản. 1274 01:01:42,400 --> 01:01:45,506 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 1275 01:01:45,506 --> 01:01:47,520 nó kết quả trong một số cân đối tiêu cực? 1276 01:01:47,520 --> 01:01:50,380 Vì vậy, về cơ bản, có bốn loại chính của các truy vấn - 1277 01:01:50,380 --> 01:01:52,840 chèn, chọn, cập nhật, và xóa. 1278 01:01:52,840 --> 01:01:56,080 Vì vậy, những gì chúng ta nghĩ chúng ta sẽ sử dụng ở đây? 1279 01:01:56,080 --> 01:01:57,000 Cập nhật. 1280 01:01:57,000 --> 01:01:58,260 >> Vì vậy, chúng ta hãy có một cái nhìn. 1281 01:01:58,260 --> 01:02:04,290 1282 01:02:04,290 --> 01:02:05,870 Vì vậy, ở đây chúng tôi đang cập nhật. 1283 01:02:05,870 --> 01:02:09,900 Bảng những gì chúng tôi đang cập nhật tài khoản? 1284 01:02:09,900 --> 01:02:11,670 Để cập nhật tài khoản. 1285 01:02:11,670 --> 01:02:15,390 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? 1286 01:02:15,390 --> 01:02:19,520 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. 1287 01:02:19,520 --> 01:02:22,860 Vì vậy, đây sẽ cập nhật tất cả các hàng tài khoản, trừ 1288 01:02:22,860 --> 01:02:26,250 $ 20 từ sự cân bằng. 1289 01:02:26,250 --> 01:02:29,260 >> DAVID J. Malan: Một sai lầm phổ biến ở đây, mặc dù đôi khi chúng ta tha thứ cho nó, 1290 01:02:29,260 --> 01:02:32,990 là thực sự có mã PHP ở đây kêu gọi các chức năng truy vấn hoặc đưa 1291 01:02:32,990 --> 01:02:35,460 dấu ngoặc kép quanh tất cả mọi thứ không cần phải có mặt ở đó. 1292 01:02:35,460 --> 01:02:39,780 >> ROB Bowden: Hãy nhớ rằng MySQL là một ngôn ngữ riêng biệt từ PHP. 1293 01:02:39,780 --> 01:02:42,410 Chúng tôi tình cờ được viết MySQL trong PHP. 1294 01:02:42,410 --> 01:02:46,180 Và PHP sau đó gửi nó hơn với máy chủ MySQL. 1295 01:02:46,180 --> 01:02:51,120 Nhưng bạn không cần PHP để giao tiếp với một máy chủ MySQL. 1296 01:02:51,120 --> 01:02:51,730 >> DAVID J. Malan: Chính xác. 1297 01:02:51,730 --> 01:02:54,240 Vì vậy, không có dấu hiệu biến đô la nên trong bối cảnh này. 1298 01:02:54,240 --> 01:02:59,550 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. 1299 01:02:59,550 --> 01:03:00,080 >> ROB Bowden: OK. 1300 01:03:00,080 --> 01:03:01,300 Vì vậy, một trong những tiếp theo. 1301 01:03:01,300 --> 01:03:02,731 Đây có phải là người tiếp theo? 1302 01:03:02,731 --> 01:03:03,210 Yeah. 1303 01:03:03,210 --> 01:03:06,570 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 1304 01:03:06,570 --> 01:03:09,300 khách hàng giàu có nhất, những người có số dư lớn hơn 1.000? 1305 01:03:09,300 --> 01:03:13,280 Vì vậy mà trong bốn loại chính chúng ta sẽ muốn ở đây? 1306 01:03:13,280 --> 01:03:14,430 Chọn. 1307 01:03:14,430 --> 01:03:16,650 Vì vậy, chúng tôi muốn chọn. 1308 01:03:16,650 --> 01:03:17,610 Chúng ta muốn gì để lựa chọn? 1309 01:03:17,610 --> 01:03:19,380 Cột những gì chúng ta muốn chọn? 1310 01:03:19,380 --> 01:03:20,970 Chúng tôi sẽ đặc biệt muốn để chọn số. 1311 01:03:20,970 --> 01:03:23,910 Nhưng nếu bạn nói sao, chúng tôi cũng chấp nhận điều đó. 1312 01:03:23,910 --> 01:03:25,820 >> Vì vậy, chọn số từ những gì bảng? 1313 01:03:25,820 --> 01:03:26,640 Tài khoản. 1314 01:03:26,640 --> 01:03:28,370 Và sau đó điều kiện chúng ta muốn? 1315 01:03:28,370 --> 01:03:30,140 Nơi cân bằng lớn hơn 1.000. 1316 01:03:30,140 --> 01:03:31,720 Chúng tôi cũng chấp nhận lớn hơn hơn hoặc bằng. 1317 01:03:31,720 --> 01:03:35,230 1318 01:03:35,230 --> 01:03:36,190 Tác phẩm mới nhất. 1319 01:03:36,190 --> 01:03:42,940 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 1320 01:03:42,940 --> 01:03:44,480 có một sự cân bằng $ 0? 1321 01:03:44,480 --> 01:03:47,620 Vì vậy mà trong bốn chúng ta sẽ muốn sử dụng không? 1322 01:03:47,620 --> 01:03:48,320 Xóa. 1323 01:03:48,320 --> 01:03:50,180 Vì vậy, các cú pháp cho điều đó? 1324 01:03:50,180 --> 01:03:51,890 Xóa từ những gì bảng? 1325 01:03:51,890 --> 01:03:53,550 Tài khoản. 1326 01:03:53,550 --> 01:03:55,790 Và sau đó điều kiện mà chúng tôi muốn xóa - 1327 01:03:55,790 --> 01:03:57,280 nơi cân bằng số không. 1328 01:03:57,280 --> 01:04:03,050 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. 1329 01:04:03,050 --> 01:04:04,300 Các câu hỏi về bất cứ? 1330 01:04:04,300 --> 01:04:08,840 1331 01:04:08,840 --> 01:04:10,260 Muốn xếp hàng? 1332 01:04:10,260 --> 01:04:11,200 >> DAVID J. Malan: Queue dẫn. 1333 01:04:11,200 --> 01:04:17,110 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 1334 01:04:17,110 --> 01:04:20,450 bit trong lớp học cùng với các cấu trúc, đó là một dữ liệu 1335 01:04:20,450 --> 01:04:21,910 cấu trúc liên quan đến tinh thần. 1336 01:04:21,910 --> 01:04:24,670 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 1337 01:04:24,670 --> 01:04:27,900 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 1338 01:04:27,900 --> 01:04:30,530 sử dụng hiệu quả bộ nhớ, ít nhất nếu chúng ta đang sử dụng một mảng. 1339 01:04:30,530 --> 01:04:35,460 >> 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 1340 01:04:35,460 --> 01:04:38,470 hàng đợi, nếu tôi nhận được vào hàng đợi ở đây, và sau đó ai đó có được trong dòng 1341 01:04:38,470 --> 01:04:42,710 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 1342 01:04:42,710 --> 01:04:45,930 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 1343 01:04:45,930 --> 01:04:47,100 thay đổi theo cách này. 1344 01:04:47,100 --> 01:04:50,880 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 1345 01:04:50,880 --> 01:04:54,600 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ì 1346 01:04:54,600 --> 01:04:56,520 thời gian chạy tiệm cận? 1347 01:04:56,520 --> 01:04:57,420 Đó là tuyến tính. 1348 01:04:57,420 --> 01:04:59,600 >> Và tôi cảm thấy như đó là ngu ngốc. 1349 01:04:59,600 --> 01:05:02,890 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 1350 01:05:02,890 --> 01:05:04,660 cửa hàng, họ không phải tất cả có để di chuyển với nhau. 1351 01:05:04,660 --> 01:05:08,200 Chỉ cho người đó được nhổ khi thời gian đến, ví dụ. 1352 01:05:08,200 --> 01:05:09,870 Vì vậy, chúng ta có thể tiết kiệm một chút thời gian ở đó. 1353 01:05:09,870 --> 01:05:14,840 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 1354 01:05:14,840 --> 01:05:18,060 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 1355 01:05:18,060 --> 01:05:23,340 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 1356 01:05:23,340 --> 01:05:25,790 mảng để lưu trữ các người đợi này. 1357 01:05:25,790 --> 01:05:28,390 Vì vậy, bạn gần như có thể nghĩ về mảng như là một dữ liệu tròn 1358 01:05:28,390 --> 01:05:29,880 cấu trúc trong ý nghĩa đó. 1359 01:05:29,880 --> 01:05:33,970 >> 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ó 1360 01:05:33,970 --> 01:05:36,250 và sau đó, nơi bắt đầu của nó là. 1361 01:05:36,250 --> 01:05:39,490 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 1362 01:05:39,490 --> 01:05:41,330 nó q, chỉ cần một chữ cái. 1363 01:05:41,330 --> 01:05:44,570 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 1364 01:05:44,570 --> 01:05:45,470 được khởi tạo bằng không. 1365 01:05:45,470 --> 01:05:47,770 >> Vì vậy, ngay bây giờ, không có gì bên trong của hàng đợi đó. 1366 01:05:47,770 --> 01:05:50,910 Và chúng tôi yêu cầu bạn hoàn thành thực hiện enqueue dưới đây 1367 01:05:50,910 --> 01:05:55,250 một cách mà các chức năng bổ sung thêm n cuối q và sau đó trả về true. 1368 01:05:55,250 --> 01:05:58,690 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. 1369 01:05:58,690 --> 01:06:01,060 Và chúng tôi đã cho bạn một vài các giả định. 1370 01:06:01,060 --> 01:06:04,320 Nhưng chúng không thực sự chức năng có liên quan, chỉ bool tồn tại, 1371 01:06:04,320 --> 01:06:06,690 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 1372 01:06:06,690 --> 01:06:07,310 tập tin tiêu đề nhất định. 1373 01:06:07,310 --> 01:06:09,350 Để được chỉ cần đảm bảo có đã không là một thủ thuật này 1374 01:06:09,350 --> 01:06:10,940 câu hỏi đại loại vậy. 1375 01:06:10,940 --> 01:06:16,280 >> 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. 1376 01:06:16,280 --> 01:06:20,420 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. 1377 01:06:20,420 --> 01:06:23,820 Nếu hàng đợi có đầy đủ hoặc số mà bạn đang cố gắng để chèn ít 1378 01:06:23,820 --> 01:06:26,380 hơn không, mà chúng tôi đã nói trong đặc điểm kỹ thuật của vấn đề nên 1379 01:06:26,380 --> 01:06:30,320 không được phép, vì chúng tôi chỉ muốn giá trị không âm, sau đó bạn nên 1380 01:06:30,320 --> 01:06:31,640 chỉ trả lại sai ngay lập tức. 1381 01:06:31,640 --> 01:06:33,820 Vì vậy, một số tương đối dễ dàng kiểm tra lỗi. 1382 01:06:33,820 --> 01:06:38,720 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ề 1383 01:06:38,720 --> 01:06:39,440 suy nghĩ đây. 1384 01:06:39,440 --> 01:06:41,330 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 1385 01:06:41,330 --> 01:06:43,000 tìm ra cách để xử lý bao quanh. 1386 01:06:43,000 --> 01:06:46,870 >> 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 đó 1387 01:06:46,870 --> 01:06:51,480 thường ngụ ý số học mô-đun và các nhà điều hành mod, bên phần trăm, 1388 01:06:51,480 --> 01:06:55,140 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à 1389 01:06:55,140 --> 01:06:58,650 ba và sau đó trở lại khoảng không, một và hai và ba và vv 1390 01:06:58,650 --> 01:06:59,380 một lần nữa và một lần nữa. 1391 01:06:59,380 --> 01:07:02,880 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 1392 01:07:02,880 --> 01:07:05,850 mảng gọi là số nơi số nguyên của chúng tôi nói dối. 1393 01:07:05,850 --> 01:07:10,740 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 1394 01:07:10,740 --> 01:07:14,080 sau đó thêm vào đó bất cứ điều gì phía trước của danh sách là. 1395 01:07:14,080 --> 01:07:17,880 Và hiệu quả của việc đó là để đưa chúng tôi tại đúng vị trí trong hàng đợi và 1396 01:07:17,880 --> 01:07:20,970 không cho rằng người đầu tiên trong dòng là ngay từ đầu, mà người 1397 01:07:20,970 --> 01:07:24,130 cô hoàn toàn có thể nếu chúng ta cũng đã được thay đổi tất cả mọi người. 1398 01:07:24,130 --> 01:07:26,710 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 1399 01:07:26,710 --> 01:07:27,800 con đường cụ thể. 1400 01:07:27,800 --> 01:07:29,330 >> Vì vậy chúng tôi có thể giữ nó tương đối đơn giản. 1401 01:07:29,330 --> 01:07:32,180 Chúng tôi phải nhớ rằng chúng ta chỉ thêm một int vào hàng đợi. 1402 01:07:32,180 --> 01:07:35,850 Và sau đó chúng tôi chỉ trả lại sự thật. 1403 01:07:35,850 --> 01:07:38,560 Trong khi đó, trong dequeue, chúng tôi hỏi bạn làm như sau. 1404 01:07:38,560 --> 01:07:42,260 Thực hiện nó trong một cách mà nó dequeues, đó là loại bỏ việc và lợi nhuận, 1405 01:07:42,260 --> 01:07:44,190 int ở phía trước của hàng đợi. 1406 01:07:44,190 --> 01:07:46,410 Để loại bỏ các int, nó cũng đủ để quên nó. 1407 01:07:46,410 --> 01:07:47,650 Bạn không cần phải ghi đè lên bit của nó. 1408 01:07:47,650 --> 01:07:48,820 Vì vậy, nó vẫn thực sự có. 1409 01:07:48,820 --> 01:07:51,930 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ế 1410 01:07:51,930 --> 01:07:52,970 rằng nó bây giờ có. 1411 01:07:52,970 --> 01:07:55,520 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. 1412 01:07:55,520 --> 01:07:56,750 Vì vậy, điều này cảm thấy tùy ý. 1413 01:07:56,750 --> 01:08:01,640 Tại sao lại tiêu cực 1 thay vì sai? 1414 01:08:01,640 --> 01:08:02,620 Yeah. 1415 01:08:02,620 --> 01:08:05,070 >> ĐỐI TƯỢNG: Q là lưu trữ giá trị tích cực. 1416 01:08:05,070 --> 01:08:10,950 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. 1417 01:08:10,950 --> 01:08:11,510 >> DAVID J. Malan: OK, đúng. 1418 01:08:11,510 --> 01:08:14,850 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 1419 01:08:14,850 --> 01:08:18,050 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. 1420 01:08:18,050 --> 01:08:21,630 Nhưng bạn đang viết lại lịch sử đó, vì lý do chúng tôi chỉ 1421 01:08:21,630 --> 01:08:25,890 trả về giá trị không âm là bởi vì chúng tôi muốn 1422 01:08:25,890 --> 01:08:27,670 có giá trị trọng điểm. 1423 01:08:27,670 --> 01:08:32,617 Vì vậy, cụ thể hơn, tại sao không chỉ return false trong trường hợp lỗi? 1424 01:08:32,617 --> 01:08:33,099 Yeah. 1425 01:08:33,099 --> 01:08:35,510 >> ĐỐI TƯỢNG: Bạn đã không thành công để trả lại một số nguyên. 1426 01:08:35,510 --> 01:08:36,630 >> DAVID J. Malan: Chính xác. 1427 01:08:36,630 --> 01:08:38,569 Và đây là nơi mà C được ràng buộc khá. 1428 01:08:38,569 --> 01:08:40,590 Nếu bạn đang nói rằng bạn đang đi để trả lại một int, bạn đã có 1429 01:08:40,590 --> 01:08:41,279 để trả lại một int. 1430 01:08:41,279 --> 01:08:43,689 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 1431 01:08:43,689 --> 01:08:45,040 chuỗi hoặc một cái gì đó như thế. 1432 01:08:45,040 --> 01:08:49,370 Bây giờ, trong khi đó, JavaScript và PHP và một số ngôn ngữ khác có thể, trên thực tế, 1433 01:08:49,370 --> 01:08:51,310 bạn đã trở về khác nhau loại giá trị. 1434 01:08:51,310 --> 01:08:54,819 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, 1435 01:08:54,819 --> 01:08:59,439 ints tiêu cực, hay sai hoặc null thậm chí để biểu lỗi. 1436 01:08:59,439 --> 01:09:01,890 Nhưng chúng tôi không có mà tính linh hoạt trong C. 1437 01:09:01,890 --> 01:09:04,569 >> Vì vậy, với dequeue, những gì chúng ta đề xuất làm là - 1438 01:09:04,569 --> 01:09:07,350 1439 01:09:07,350 --> 01:09:09,830 >> ROB Bowden: Bạn có thể trả về false. 1440 01:09:09,830 --> 01:09:13,189 Nó chỉ là sai là băm xác định sai số không. 1441 01:09:13,189 --> 01:09:16,000 Vì vậy, nếu bạn quay trở lại sai, bạn đang trở về số không. 1442 01:09:16,000 --> 01:09:25,470 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 1443 01:09:25,470 --> 01:09:27,000 sai xảy ra để được tiêu cực 1. 1444 01:09:27,000 --> 01:09:29,972 Nhưng bạn không nên thậm chí cần phải biết điều đó. 1445 01:09:29,972 --> 01:09:32,399 >> DAVID J. Malan: Đó là lý do tại sao tôi không nói điều đó. 1446 01:09:32,399 --> 01:09:36,450 >> ROB Bowden: Nhưng đó là không đúng sự thật rằng bạn không thể trả về false. 1447 01:09:36,450 --> 01:09:37,700 >> DAVID J. Malan: Chắc chắn. 1448 01:09:37,700 --> 01:09:40,920 1449 01:09:40,920 --> 01:09:44,240 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ó. 1450 01:09:44,240 --> 01:09:45,479 Và đó là bởi vì chúng tôi không đi qua bất cứ điều gì in 1451 01:09:45,479 --> 01:09:48,359 Chúng tôi chỉ muốn loại bỏ các phần tử ở phía trước của hàng đợi. 1452 01:09:48,359 --> 01:09:49,819 Vậy làm thế nào chúng ta có thể đi về việc này? 1453 01:09:49,819 --> 01:09:51,290 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. 1454 01:09:51,290 --> 01:09:53,350 Nếu kích thước hàng đợi là 0, có không có việc phải làm. 1455 01:09:53,350 --> 01:09:54,210 Trở lại tiêu cực 1. 1456 01:09:54,210 --> 01:09:54,800 Thực hiện. 1457 01:09:54,800 --> 01:09:56,340 Vì vậy, đó là một vài dòng chương trình của tôi. 1458 01:09:56,340 --> 01:09:58,180 Vì vậy, chỉ có bốn dòng vẫn còn. 1459 01:09:58,180 --> 01:10:01,310 >> Vì vậy, ở đây tôi quyết định giảm giá trị kích thước. 1460 01:10:01,310 --> 01:10:04,620 Và giảm các kích thước hiệu quả có nghĩa là tôi quên 1461 01:10:04,620 --> 01:10:06,010 một cái gì đó là ở đó. 1462 01:10:06,010 --> 01:10:09,910 Nhưng tôi cũng phải cập nhật nơi mặt trước của con số này. 1463 01:10:09,910 --> 01:10:11,620 Vì vậy, để làm được điều đó, tôi cần phải làm hai việc. 1464 01:10:11,620 --> 01:10:16,390 Đầu tiên tôi cần phải nhớ những gì số là ở phía trước của hàng đợi, 1465 01:10:16,390 --> 01:10:17,860 bởi vì tôi cần phải trả lại điều đó. 1466 01:10:17,860 --> 01:10:20,910 Vì vậy tôi không muốn vô tình quên về nó và sau đó ghi đè lên nó. 1467 01:10:20,910 --> 01:10:22,840 Tôi chỉ cần đi để nhớ trong một int. 1468 01:10:22,840 --> 01:10:27,310 >> Và bây giờ, tôi muốn cập nhật q.front được q.front 1. 1469 01:10:27,310 --> 01:10:30,070 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 1470 01:10:30,070 --> 01:10:31,930 chỉ vào người tiếp theo trong dòng. 1471 01:10:31,930 --> 01:10:33,420 Nhưng tôi phải xử lý bao quanh đó. 1472 01:10:33,420 --> 01:10:37,270 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 1473 01:10:37,270 --> 01:10:41,140 như tôi đã chỉ ra người cuối cùng trong đường, các hoạt động sẽ mang lại modulo 1474 01:10:41,140 --> 01:10:43,840 tôi trở lại bằng không ở phía trước của hàng đợi. 1475 01:10:43,840 --> 01:10:46,050 Và xử lý các bao quanh đây. 1476 01:10:46,050 --> 01:10:48,950 Và sau đó tôi tiến hành trở lại n. 1477 01:10:48,950 --> 01:10:51,530 >> Bây giờ, nói đúng, tôi đã không phải khai báo n. 1478 01:10:51,530 --> 01:10:53,880 Tôi không phải lấy nó và lưu nó tạm thời, bởi vì giá trị là 1479 01:10:53,880 --> 01:10:54,740 vẫn còn đó. 1480 01:10:54,740 --> 01:10:57,490 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 1481 01:10:57,490 --> 01:10:58,450 của hàng đợi. 1482 01:10:58,450 --> 01:11:01,850 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ó 1483 01:11:01,850 --> 01:11:04,320 trong n, và sau đó trở về mà vì lợi ích của sự rõ ràng nhưng 1484 01:11:04,320 --> 01:11:05,735 không thực sự cần thiết. 1485 01:11:05,735 --> 01:11:09,313 1486 01:11:09,313 --> 01:11:12,130 Psst. 1487 01:11:12,130 --> 01:11:13,410 Tất cả chúng phát âm trong đầu tôi. 1488 01:11:13,410 --> 01:11:15,940 1489 01:11:15,940 --> 01:11:19,110 >> ROB Bowden: Câu hỏi đầu tiên Vì vậy, là vấn đề cây nhị phân. 1490 01:11:19,110 --> 01:11:22,140 Vì vậy, câu hỏi đầu tiên là, chúng tôi đưa ra những con số. 1491 01:11:22,140 --> 01:11:27,160 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 1492 01:11:27,160 --> 01:11:30,110 cây tìm kiếm nhị phân hợp lệ. 1493 01:11:30,110 --> 01:11:36,260 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 1494 01:11:36,260 --> 01:11:39,800 chỉ là điều bên trái là ít hơn và là điều phải 1495 01:11:39,800 --> 01:11:41,120 bên phải là lớn hơn. 1496 01:11:41,120 --> 01:11:44,580 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 1497 01:11:44,580 --> 01:11:45,740 bên phải là lớn hơn. 1498 01:11:45,740 --> 01:11:55,260 >> 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ệ để 1499 01:11:55,260 --> 01:11:56,970 đến nay, bởi vì 34 ở đây. 1500 01:11:56,970 --> 01:11:57,920 20 đang diễn ra bên trái. 1501 01:11:57,920 --> 01:11:58,950 Vì vậy, đó là ít. 1502 01:11:58,950 --> 01:12:03,640 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, 1503 01:12:03,640 --> 01:12:06,140 nó vẫn còn ở bên trái 34. 1504 01:12:06,140 --> 01:12:10,760 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 1505 01:12:10,760 --> 01:12:14,330 vấn đề là chỉ cần loại của những con số - 1506 01:12:14,330 --> 01:12:18,720 để 20, 34, 36, 52, 59, 106. 1507 01:12:18,720 --> 01:12:21,640 Và sau đó chèn những từ trái sang phải. 1508 01:12:21,640 --> 01:12:23,390 >> Vì vậy, 20 tại đây. 1509 01:12:23,390 --> 01:12:24,630 34 tại đây. 1510 01:12:24,630 --> 01:12:25,830 36 tại đây. 1511 01:12:25,830 --> 01:12:29,360 52, 59, 106. 1512 01:12:29,360 --> 01:12:34,730 Và bạn cũng có thể đã tìm ra với một số cắm vào và thực hiện, 1513 01:12:34,730 --> 01:12:38,830 oh, chờ đợi, tôi không có đủ số để điền vào đây ở đây. 1514 01:12:38,830 --> 01:12:42,170 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. 1515 01:12:42,170 --> 01:12:47,490 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 1516 01:12:47,490 --> 01:12:48,740 thứ tự tăng dần. 1517 01:12:48,740 --> 01:12:52,150 1518 01:12:52,150 --> 01:12:56,540 >> 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 1519 01:12:56,540 --> 01:12:58,300 các nút trong cây này. 1520 01:12:58,300 --> 01:13:02,720 Vì vậy, những gì chúng ta cần trong một cây nhị phân? 1521 01:13:02,720 --> 01:13:05,830 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. 1522 01:13:05,830 --> 01:13:07,220 Tôi không biết những gì chúng ta gọi là nó trong các giải pháp - 1523 01:13:07,220 --> 01:13:08,500 int n. 1524 01:13:08,500 --> 01:13:13,570 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. 1525 01:13:13,570 --> 01:13:17,540 Vì vậy, nó sẽ trông như thế này. 1526 01:13:17,540 --> 01:13:20,510 Và nó thực sự sẽ xem xét trước khi khi nào các liên kết kép 1527 01:13:20,510 --> 01:13:25,090 danh sách các công cụ, vì vậy thông báo - 1528 01:13:25,090 --> 01:13:27,860 Tôi sẽ phải di chuyển tất cả các cách quay trở lại vấn đề 11. 1529 01:13:27,860 --> 01:13:30,980 1530 01:13:30,980 --> 01:13:36,390 >> 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 1531 01:13:36,390 --> 01:13:38,590 tên gọi khác nhau. 1532 01:13:38,590 --> 01:13:41,440 Chúng tôi vẫn có một số nguyên giá trị và hai con trỏ. 1533 01:13:41,440 --> 01:13:44,850 Nó chỉ là thay vì điều trị con trỏ như chỉ vào điều tiếp theo 1534 01:13:44,850 --> 01:13:47,955 và điều trước, chúng tôi đang điều trị các con trỏ để trỏ đến một con trái 1535 01:13:47,955 --> 01:13:49,205 và con phải. 1536 01:13:49,205 --> 01:13:57,372 1537 01:13:57,372 --> 01:13:57,860 OK. 1538 01:13:57,860 --> 01:13:59,650 Vì vậy, đó là nút cấu trúc của chúng tôi. 1539 01:13:59,650 --> 01:14:03,920 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à 1540 01:14:03,920 --> 01:14:08,320 chúng tôi muốn đi qua cây, in ấn ra các giá trị của cây theo thứ tự. 1541 01:14:08,320 --> 01:14:15,241 >> Vì vậy, nhìn ở đây, chúng tôi muốn in ra 20, 34, 36, 52, 59, và 106. 1542 01:14:15,241 --> 01:14:17,970 Làm thế nào để chúng ta thực hiện điều đó? 1543 01:14:17,970 --> 01:14:18,890 Vì vậy, nó khá tương tự. 1544 01:14:18,890 --> 01:14:22,910 Nếu bạn nhìn thấy trong kỳ thi vừa qua vấn đề mà bạn muốn in ra 1545 01:14:22,910 --> 01:14:25,940 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í 1546 01:14:25,940 --> 01:14:27,320 dễ dàng hơn đó. 1547 01:14:27,320 --> 01:14:30,950 Vì vậy, đây là giải pháp. 1548 01:14:30,950 --> 01:14:33,110 Này được dễ dàng hơn đáng kể nếu bạn đã làm nó đệ quy. 1549 01:14:33,110 --> 01:14:36,650 Tôi không biết nếu có ai cố gắng để làm điều đó lặp đi lặp lại. 1550 01:14:36,650 --> 01:14:38,340 >> Nhưng trước tiên, chúng ta có trường hợp cơ sở của chúng tôi. 1551 01:14:38,340 --> 01:14:39,660 Nếu gốc là null? 1552 01:14:39,660 --> 01:14:40,610 Sau đó chúng ta chỉ cần đi trở lại. 1553 01:14:40,610 --> 01:14:42,300 Chúng tôi không muốn in bất cứ điều gì. 1554 01:14:42,300 --> 01:14:45,940 Khác chúng ta sẽ đi qua đệ quy xuống. 1555 01:14:45,940 --> 01:14:48,140 In toàn bộ cây con bên trái. 1556 01:14:48,140 --> 01:14:51,440 Vì vậy, tất cả mọi thứ in ít hơn giá trị hiện tại của tôi. 1557 01:14:51,440 --> 01:14:53,930 Và sau đó tôi sẽ in bản thân mình. 1558 01:14:53,930 --> 01:14:57,310 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ứ 1559 01:14:57,310 --> 01:14:58,810 lớn hơn giá trị của tôi. 1560 01:14:58,810 --> 01:15:03,870 Và điều này sẽ in ra tất cả mọi thứ theo thứ tự. 1561 01:15:03,870 --> 01:15:05,860 Câu hỏi về cách thức này thực sự hoàn thành điều đó không? 1562 01:15:05,860 --> 01:15:09,892 1563 01:15:09,892 --> 01:15:12,545 >> ĐỐI TƯỢNG: Tôi có một câu hỏi trên [nghe được]. 1564 01:15:12,545 --> 01:15:15,090 1565 01:15:15,090 --> 01:15:23,550 >> ROB Bowden: Vì vậy, một cách tiếp cận bất kỳ vấn đề đệ quy là chỉ cần nghĩ 1566 01:15:23,550 --> 01:15:26,275 về nó như bạn phải suy nghĩ về tất cả các trường hợp góc. 1567 01:15:26,275 --> 01:15:32,150 1568 01:15:32,150 --> 01:15:38,110 Vì vậy, xem xét rằng chúng tôi muốn in toàn bộ cây này. 1569 01:15:38,110 --> 01:15:42,030 Vì vậy, tất cả chúng ta sẽ tập trung vào là nút đặc biệt này - 1570 01:15:42,030 --> 01:15:43,740 36. 1571 01:15:43,740 --> 01:15:47,420 Các cuộc gọi đệ quy, chúng tôi giả vờ những người chỉ làm việc. 1572 01:15:47,420 --> 01:15:54,000 Vì vậy, ở đây, gọi đệ quy này đi qua, chúng tôi thậm chí không cần suy nghĩ 1573 01:15:54,000 --> 01:15:58,640 về nó, chỉ cần đi qua bên trái ba, tưởng tượng rằng đã in 20 1574 01:15:58,640 --> 01:16:00,730 và 34 đối với chúng tôi. 1575 01:16:00,730 --> 01:16:03,350 Và sau đó khi chúng tôi cuối cùng đệ quy gọi đi qua trên 1576 01:16:03,350 --> 01:16:07,890 đúng, đó sẽ in một cách chính xác 52, 59, và 106 cho chúng tôi. 1577 01:16:07,890 --> 01:16:13,620 >> Vì vậy, cho rằng điều này có thể in 20, 34, và khác có thể in 52, 59, 108, 1578 01:16:13,620 --> 01:16:17,180 tất cả chúng ta cần để có thể làm là in ourself ở giữa đó. 1579 01:16:17,180 --> 01:16:21,250 Vì vậy, in ra tất cả mọi thứ trước khi chúng tôi. 1580 01:16:21,250 --> 01:16:27,710 In ourself, do đó nút in hiện tại 36, printf thường xuyên, và sau đó 1581 01:16:27,710 --> 01:16:31,170 in tất cả mọi thứ sau khi chúng tôi. 1582 01:16:31,170 --> 01:16:32,730 >> DAVID J. Malan: Đây là nơi đệ quy được thực sự đẹp. 1583 01:16:32,730 --> 01:16:36,270 Đó 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. 1584 01:16:36,270 --> 01:16:38,460 Và sau đó bạn hãy để một người nào đó khác làm phần còn lại. 1585 01:16:38,460 --> 01:16:40,180 Và người khác là, trớ trêu thay, bạn. 1586 01:16:40,180 --> 01:16:44,260 1587 01:16:44,260 --> 01:16:48,360 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 - 1588 01:16:48,360 --> 01:16:50,530 >> ROB Bowden: Trên các câu hỏi? 1589 01:16:50,530 --> 01:16:53,490 >> DAVID J. Malan: Và xuống một chút để những con số, không ai biết nơi 1590 01:16:53,490 --> 01:16:55,190 những con số này đến từ đâu? 1591 01:16:55,190 --> 01:16:56,610 >> ROB Bowden: Tôi có nghĩa là không có ý tưởng. 1592 01:16:56,610 --> 01:16:59,794 >> DAVID J. Malan: Chúng xuất hiện trong suốt bài kiểm tra. 1593 01:16:59,794 --> 01:17:01,150 >> ĐỐI TƯỢNG: Có phải họ những con số giống nhau không? 1594 01:17:01,150 --> 01:17:01,910 >> DAVID J. Malan: Những con số này. 1595 01:17:01,910 --> 01:17:03,260 Một chút trứng Phục Sinh. 1596 01:17:03,260 --> 01:17:08,100 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 1597 01:17:08,100 --> 01:17:12,680 heads@CS50.net những gì ý nghĩa của sáu con số định kỳ là 1598 01:17:12,680 --> 01:17:18,560 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 1599 01:17:18,560 --> 01:17:21,610 bài giảng và một quả bóng căng thẳng. 1600 01:17:21,610 --> 01:17:25,460 1601 01:17:25,460 --> 01:17:27,790 Tốt đẹp, tinh tế. 1602 01:17:27,790 --> 01:17:29,570 >> 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? 1603 01:17:29,570 --> 01:17:32,608