1 00:00:00,000 --> 00:00:02,270 >> [Đánh giá: Câu hỏi 1] 2 00:00:02,270 --> 00:00:04,620 [Ali Nahm, Oreoluwa Barbarinsa, Lucas Freitas, Rob Bowden] [Đại học Harvard] 3 00:00:04,620 --> 00:00:07,660 [Đây là CS50.] [CS50.TV] 4 00:00:07,660 --> 00:00:11,610 [Lucas Freitas] Chào mừng tất cả mọi người. Đây là đánh giá cho bài kiểm tra 1. 5 00:00:11,610 --> 00:00:15,040 Chỉ như một sự từ bỏ, điều này được - Ý tôi là, chúng ta sẽ cố gắng để trang trải 6 00:00:15,040 --> 00:00:17,770 nhiều tài liệu càng tốt, nhưng điều đó không có nghĩa là 7 00:00:17,770 --> 00:00:20,780 chúng ta sẽ bao gồm tất cả những điều đó có thể là trong bài kiểm tra 1. 8 00:00:20,780 --> 00:00:25,270 Vì vậy, hãy chắc chắn rằng bạn cũng hãy nhìn vào bài giảng, phần, tất cả mọi thứ mà bạn có thể. 9 00:00:25,270 --> 00:00:28,240 Bài kiểm tra 1 là có được vào ngày thứ Tư, thứ tư tới. 10 00:00:28,240 --> 00:00:33,800 Vì vậy, hãy chắc chắn để nghiên cứu. Nó sẽ được, khá nhiều, như các bài kiểm tra đầu tiên 11 00:00:33,800 --> 00:00:36,390 liên quan đến định dạng của nó, nhưng nó có thể sẽ khó khăn hơn nhiều. 12 00:00:36,390 --> 00:00:39,600 Ít nhất, năm ngoái khi tôi đã 50 tuổi, tôi nghĩ đó là khó khăn hơn nhiều. 13 00:00:39,600 --> 00:00:42,410 Vì vậy, nghiên cứu rất nhiều. 14 00:00:42,410 --> 00:00:45,190 >> Tôi sẽ bao gồm cấu trúc dữ liệu và mã hóa Huffman. 15 00:00:45,190 --> 00:00:47,910 Đây là điều mà rất nhiều người nghĩ là phức tạp, 16 00:00:47,910 --> 00:00:51,930 nhưng tôi sẽ cố gắng để làm cho nó dễ dàng như có thể. 17 00:00:51,930 --> 00:00:56,330 Trước hết, những gì chúng tôi muốn các bạn biết cho bài kiểm tra 1 là 18 00:00:56,330 --> 00:01:00,970 hiểu các mô tả khái niệm của từng cấu trúc dữ liệu mà tôi sẽ trình bày. 19 00:01:00,970 --> 00:01:03,960 Điều đó có nghĩa rằng bạn không cần phải thực sự 20 00:01:03,960 --> 00:01:07,020 thực hiện một bảng băm trong bài kiểm tra của bạn 1. 21 00:01:07,020 --> 00:01:10,250 Chúng tôi không muốn bạn để thực hiện toàn bộ bảng băm, có lẽ chúng tôi sẽ cố gắng 22 00:01:10,250 --> 00:01:13,090 để làm cho bạn thực hiện một số chức năng, 23 00:01:13,090 --> 00:01:16,940 các hoạt động phổ biến nhất, nhưng chúng tôi sẽ không làm cho bạn thực hiện tất cả mọi thứ. 24 00:01:16,940 --> 00:01:21,010 Vì vậy, điều quan trọng là bạn hiểu khái niệm đằng sau mỗi cấu trúc dữ liệu 25 00:01:21,010 --> 00:01:23,510 và cũng là bạn có thể mã trong C, 26 00:01:23,510 --> 00:01:27,880 chỉ các hoạt động phổ biến nhất mà họ dành cho mỗi cấu trúc dữ liệu. 27 00:01:27,880 --> 00:01:30,090 Và cũng có thể xem lại con trỏ và cấu trúc, 28 00:01:30,090 --> 00:01:33,470 bởi vì chúng xuất hiện rất nhiều trong các cấu trúc dữ liệu. 29 00:01:33,470 --> 00:01:37,380 >> Đầu tiên, danh sách liên kết. Danh sách liên kết thực sự rất giống với mảng, 30 00:01:37,380 --> 00:01:39,930 nhưng sự khác biệt giữa một danh sách liên kết và một mảng, 31 00:01:39,930 --> 00:01:45,160 đầu tiên của tất cả, đó là một danh sách liên kết có kích thước rất linh hoạt, 32 00:01:45,160 --> 00:01:50,060 trong khi ở mảng bạn phải hoặc chọn một kích thước rất lớn cho mảng, 33 00:01:50,060 --> 00:01:53,710 để bạn biết rằng bạn sẽ có thể lưu trữ tất cả các dữ liệu của bạn trong mảng đó, 34 00:01:53,710 --> 00:01:59,370 hoặc bạn phải sử dụng malloc để có một chiều dài linh hoạt của mảng. 35 00:01:59,370 --> 00:02:03,680 Trong danh sách liên kết nó rất dễ dàng để chỉ nhận được nhiều yếu tố, 36 00:02:03,680 --> 00:02:07,210 đưa nhiều yếu tố trong danh sách liên kết hoặc loại bỏ các yếu tố. 37 00:02:07,210 --> 00:02:09,370 Và trên thực tế, nếu bạn không muốn các danh sách liên kết để được sắp xếp, 38 00:02:09,370 --> 00:02:13,950 bạn có thể tìm kiếm và loại bỏ các yếu tố trong thời gian liên tục, 39 00:02:13,950 --> 00:02:16,800 nên O (1) thời gian, vì vậy nó rất thuận tiện. 40 00:02:16,800 --> 00:02:20,660 Bạn chỉ cần cẩn thận để luôn luôn nhớ đến malloc và miễn phí các nút, 41 00:02:20,660 --> 00:02:25,510 chỉ bởi vì nếu bạn không, bạn sẽ có rò rỉ bộ nhớ. 42 00:02:25,510 --> 00:02:31,480 Vì vậy, danh sách liên kết - định nghĩa của một nút là giống như những gì chúng tôi có quyền ở đó. 43 00:02:31,480 --> 00:02:35,110 Tôi đặt int n, nhưng bạn có thể lưu bất kỳ dữ liệu nào bạn muốn. 44 00:02:35,110 --> 00:02:37,280 Vì vậy, nếu bạn muốn lưu trữ một chuỗi, nó tốt. 45 00:02:37,280 --> 00:02:41,690 Nếu bạn muốn lưu trữ một cấu trúc, đó là tốt, một đôi, bất cứ điều gì bạn muốn. 46 00:02:41,690 --> 00:02:44,630 Tôi chỉ cần đặt int n cho các ví dụ ở đây. 47 00:02:44,630 --> 00:02:46,800 Và bạn có một con trỏ đến nút tiếp theo. 48 00:02:46,800 --> 00:02:51,940 Vì vậy, về cơ bản, một danh sách liên kết có một số dữ liệu, và sau đó nó trỏ đến nút tiếp theo. 49 00:02:51,940 --> 00:02:56,710 Nếu đó là yếu tố cuối cùng trong danh sách liên kết, nó sẽ trỏ đến NULL. 50 00:02:56,710 --> 00:02:59,060 Vì vậy, đây là một ví dụ về một danh sách liên kết. 51 00:02:59,250 --> 00:03:05,960 >> Được rồi, vậy bây giờ chúng ta hãy xem những gì chúng ta nên làm gì nếu tôi muốn chèn một phần tử trong một danh sách liên kết. 52 00:03:05,960 --> 00:03:08,810 Đầu tiên, một chèn chức năng sẽ có kiểu void 53 00:03:08,810 --> 00:03:11,350 bởi vì tôi không muốn quay trở lại bất cứ điều gì. 54 00:03:11,350 --> 00:03:14,200 Và tôi sẽ có một int như một tham số, 55 00:03:14,200 --> 00:03:17,090 bởi vì tôi muốn biết những gì tôi muốn chèn. 56 00:03:17,090 --> 00:03:21,840 Vì vậy, điều đầu tiên tôi phải làm là gì? Vâng, tôi nên malloc trên newnode, 57 00:03:21,840 --> 00:03:24,240 vì vậy đó là những dòng đầu tiên. 58 00:03:24,240 --> 00:03:27,580 Tôi chỉ cần tạo ra một nút mới để đưa vào một danh sách liên kết. 59 00:03:27,580 --> 00:03:32,360 Vì vậy, những gì tôi có thể làm gì? Vâng, chúng ta biết rằng trong việc triển khai của chúng ta về danh sách liên kết 60 00:03:32,360 --> 00:03:38,180 trong lớp học, chúng tôi luôn đặt đầu như là một biến toàn cầu. 61 00:03:38,180 --> 00:03:41,800 Vì vậy, những gì chúng ta có thể làm là thay đổi người đứng đầu. 62 00:03:41,800 --> 00:03:44,300 Tôi có thể làm cho nút mới này là người đứng đầu mới, 63 00:03:44,300 --> 00:03:46,670 và nó sẽ chỉ cho người đứng đầu trước đó. 64 00:03:46,670 --> 00:03:50,390 Làm thế nào chúng ta có thể làm điều đó? Điều đầu tiên tôi phải làm 65 00:03:50,390 --> 00:03:54,770 là thay đổi 'n' trong nút mới vào giá trị, 66 00:03:54,770 --> 00:03:57,530 đã được thông qua với chức năng. 67 00:03:57,530 --> 00:04:01,050 Sau đó newnode tiếp theo sẽ là người đứng đầu. 68 00:04:01,050 --> 00:04:05,800 Người đứng đầu sẽ được newnode. Vì vậy, nó khá đơn giản. 69 00:04:05,800 --> 00:04:10,090 Để xóa một nút, chúng ta có thể làm điều đó như thế - 70 00:04:10,090 --> 00:04:14,790 Một trong những cách chúng ta có thể làm điều đó là để nói, 71 00:04:14,790 --> 00:04:18,160 không sao, nếu tôi muốn xóa, ví dụ, 3, 72 00:04:18,160 --> 00:04:24,850 những gì tôi có thể làm là chỉ cần điểm nút trước 73 00:04:24,850 --> 00:04:27,580 đến nút tiếp theo của 3. 74 00:04:27,580 --> 00:04:29,400 Vì vậy, tôi chỉ có thể làm một cái gì đó như thế. 75 00:04:29,400 --> 00:04:33,400 Nhưng vấn đề với việc đó là gì? 76 00:04:33,400 --> 00:04:37,400 Tôi có một rò rỉ bộ nhớ, vì vậy tôi không có quyền truy cập đến số 3 nữa. 77 00:04:37,400 --> 00:04:42,480 Vấn đề với đó là tôi sẽ không có khả năng giải phóng nút đó. 78 00:04:42,480 --> 00:04:45,360 Tôi sẽ có rò rỉ bộ nhớ và (khó hiểu) là sẽ ghét tôi. 79 00:04:45,360 --> 00:04:49,370 Vì vậy, thay vì làm điều đó, tôi có lẽ cần phải có một con trỏ tạm thời. 80 00:04:49,370 --> 00:04:53,210 Vì vậy, tôi đặt tạm thời. Nó sẽ trỏ đến nút mà tôi muốn xóa. 81 00:04:53,210 --> 00:04:58,170 Và sau đó tôi có thể di chuyển các nút trước để trỏ đến nút tiếp theo 82 00:04:58,170 --> 00:05:00,390 của nút mà tôi muốn xóa. 83 00:05:00,390 --> 00:05:02,730 Và cuối cùng, tôi có thể giải phóng con trỏ. 84 00:05:02,730 --> 00:05:07,480 Tôi phải làm để giải phóng con trỏ mà tôi tạo ra ở đó? 85 00:05:07,480 --> 00:05:09,560 Tôi không phải, chỉ vì - 86 00:05:09,560 --> 00:05:13,430 sự khác biệt là nút này được tạo ra bằng cách sử dụng malloc, 87 00:05:13,430 --> 00:05:17,280 vì vậy trong đống, trong khi một người đã chỉ khai báo là một chuyển đổi NULL trong ngăn xếp. 88 00:05:17,280 --> 00:05:20,000 Vì vậy tôi không cần phải giải phóng nó. 89 00:05:20,000 --> 00:05:22,030 >> Rồi. Vì vậy, bây giờ chúng ta hãy nói về ngăn xếp. 90 00:05:22,030 --> 00:05:24,680 Ngăn xếp là khá đơn giản. 91 00:05:24,680 --> 00:05:29,540 Chúng tôi đã ngăn xếp và hàng đợi trong lớp chỉ sử dụng các mảng, 92 00:05:29,540 --> 00:05:32,820 nhưng bạn nên quen thuộc - chỉ cần lưu ý 93 00:05:32,820 --> 00:05:40,740 bạn cũng có thể làm ngăn xếp trong hàng đợi sử dụng danh sách liên kết là tốt. 94 00:05:40,740 --> 00:05:44,460 Vì vậy, nếu bạn có một mảng, những gì sẽ là một chồng? 95 00:05:44,460 --> 00:05:46,810 Một đống, đầu tiên, sẽ phải có một kích thước. 96 00:05:46,810 --> 00:05:49,950 Bạn có để lưu trữ kích thước của stack mà bạn có ngay bây giờ là gì. 97 00:05:49,950 --> 00:05:52,980 Và cũng có thể bạn sẽ có một mảng, trong trường hợp này các con số, 98 00:05:52,980 --> 00:05:55,120 nhưng nếu bạn muốn, nó có thể là một mảng 99 00:05:55,120 --> 00:06:00,380 các chuỗi, một loạt các cấu trúc, bất cứ điều gì mà bạn muốn để lưu trữ. 100 00:06:00,380 --> 00:06:03,240 Về chồng: Sự khác biệt giữa một chồng và một danh sách liên kết 101 00:06:03,240 --> 00:06:08,590 là trong ngăn xếp bạn chỉ có quyền truy cập vào các phần tử cuối cùng đã được đưa vào ngăn xếp. 102 00:06:08,590 --> 00:06:11,770 Nó được gọi là cuối cùng, ra trước. 103 00:06:11,770 --> 00:06:15,090 Cũng giống như bạn có một chồng khay, 104 00:06:15,090 --> 00:06:17,670 nếu bạn đặt một khay trên cùng của ngăn xếp, 105 00:06:17,670 --> 00:06:22,670 bạn phải loại bỏ khay đầu tiên được tiếp cận với các khay khác. 106 00:06:22,670 --> 00:06:26,310 Đó là điều tương tự với ngăn xếp. 107 00:06:26,310 --> 00:06:31,220 Vì vậy, nếu tôi muốn, ví dụ, thêm một yếu tố để một chồng, những gì tôi nên làm gì? 108 00:06:31,220 --> 00:06:34,070 Nó được gọi là đẩy, và nó khá đơn giản. 109 00:06:34,070 --> 00:06:37,130 Điều đầu tiên bạn phải làm là kiểm tra xem kích thước của stack 110 00:06:37,130 --> 00:06:40,150 không phải là lớn hơn hoặc bằng năng lực của chồng. 111 00:06:40,150 --> 00:06:45,810 Bởi vì nếu bạn đã là trên hết công suất, bạn không thể thêm bất cứ điều gì khác. 112 00:06:45,810 --> 00:06:51,140 Và sau đó nếu không, bạn chỉ cần thêm phần tử vào stack. 113 00:06:51,140 --> 00:06:54,530 Và cuối cùng, tăng kích thước. Vì vậy, nó khá đơn giản. 114 00:06:54,530 --> 00:06:57,140 Vì vậy, tôi chỉ cần thêm số 2. 115 00:06:57,140 --> 00:07:00,350 Và nếu tôi muốn bật, có nghĩa là tôi muốn loại bỏ 116 00:07:00,350 --> 00:07:03,870 yếu tố cuối cùng đã được thêm vào và trả về giá trị của các yếu tố, 117 00:07:03,870 --> 00:07:09,180 điều đầu tiên tôi phải kiểm tra là các ngăn xếp là không có sản phẩm nào. 118 00:07:09,180 --> 00:07:11,510 Bởi vì nếu nó trống rỗng, tôi không thể trở về bất cứ điều gì. 119 00:07:11,510 --> 00:07:14,820 Trong trường hợp đó, tôi trở về -1. 120 00:07:14,820 --> 00:07:18,960 Nếu không, tôi sẽ giảm các kích thước của spec, 121 00:07:18,960 --> 00:07:22,510 và trở về con số (s.size). 122 00:07:22,510 --> 00:07:27,230 Tại sao tôi lại giảm các kích thước và sau đó trở về s.size? 123 00:07:27,230 --> 00:07:30,930 Đó là bởi vì, trong trường hợp này, spec có kích thước 4, 124 00:07:30,930 --> 00:07:33,810 và tôi muốn trở lại các yếu tố thứ tư, phải không? 125 00:07:33,810 --> 00:07:36,030 Nhưng chỉ số của phần tử thứ tư là gì? Ba. 126 00:07:36,030 --> 00:07:44,510 Kể từ khi tôi kích thước - là có được 3, tôi chỉ có thể trở lại s.numbers (s.size) 127 00:07:44,510 --> 00:07:48,410 bởi vì nó là 3. Vì vậy, nó chỉ là chỉ số. 128 00:07:48,410 --> 00:07:50,380 >> Bây giờ hàng đợi. Hàng đợi được khá nhiều điều tương tự. 129 00:07:50,380 --> 00:07:54,950 Sự khác biệt duy nhất là thay vì cuối cùng, ra trước, 130 00:07:54,950 --> 00:07:57,480 bạn có đầu tiên, ra trước. 131 00:07:57,480 --> 00:07:59,460 Có lẽ nếu bạn đang chờ đợi để đi đến một buổi hòa nhạc, 132 00:07:59,460 --> 00:08:04,260 bạn sẽ không được hạnh phúc nếu bạn đã có một chồng thay vì một hàng đợi. 133 00:08:04,260 --> 00:08:07,730 Là người cuối cùng đến sẽ là người đầu tiên vào buổi hòa nhạc. 134 00:08:07,730 --> 00:08:09,760 Có thể bạn sẽ không được hạnh phúc. 135 00:08:09,760 --> 00:08:15,020 Trong hàng đợi, là người đầu tiên để có được trong cũng là người đầu tiên để nhận ra. 136 00:08:15,020 --> 00:08:18,720 Vì vậy, trong định nghĩa của một hàng đợi, ngoài việc có kích thước trong mảng, 137 00:08:18,720 --> 00:08:23,360 bạn cũng phải có người đứng đầu, đó là chỉ số cho người đứng đầu của ngăn xếp. 138 00:08:23,360 --> 00:08:29,000 Vì vậy, yếu tố đầu tiên ngay bây giờ. 139 00:08:29,000 --> 00:08:32,710 Enqueue là điều tương tự như đẩy cho ngăn xếp. 140 00:08:32,710 --> 00:08:34,980 Nếu bạn đã rất ngây thơ, bạn sẽ chỉ nói, 141 00:08:34,980 --> 00:08:39,289 tốt, tôi chỉ có thể làm chính xác những điều tương tự như tôi đã làm cho đẩy. 142 00:08:39,289 --> 00:08:44,030 Tôi chỉ có thể kiểm tra nếu nó không vượt quá khả năng này. 143 00:08:44,030 --> 00:08:48,760 Nếu có, tôi quay trở lại sai, nếu không tôi chỉ có thể xuất khẩu các giá trị mới 144 00:08:48,760 --> 00:08:50,630 và sau đó tăng kích thước. 145 00:08:50,630 --> 00:08:52,750 Nhưng tại sao điều này là sai? 146 00:08:52,750 --> 00:08:55,010 Hãy xem ví dụ này. 147 00:08:55,010 --> 00:08:57,020 Tôi đang cố gắng để enqueue một loạt các công cụ, 148 00:08:57,020 --> 00:08:58,390 và sau đó tôi sẽ dequeue và enqueue. 149 00:08:58,390 --> 00:09:00,550 Có rất nhiều các lệnh, nhưng nó rất đơn giản. 150 00:09:00,550 --> 00:09:04,790 Tôi sẽ enqueue 5, do đó, thêm 5, và sau đó 7, 151 00:09:04,790 --> 00:09:09,310 1, 4, 6, và sau đó tôi muốn một cái gì đó dequeue, 152 00:09:09,310 --> 00:09:12,000 có nghĩa là tôi sẽ loại bỏ các yếu tố đầu tiên. 153 00:09:12,000 --> 00:09:14,640 Vì vậy, tôi sẽ loại bỏ các số 3, phải không? 154 00:09:14,640 --> 00:09:17,320 Yếu tố đầu tiên. Được rồi. 155 00:09:17,320 --> 00:09:21,450 Bây giờ nếu tôi cố gắng để enqueue cái gì khác, điều gì sẽ xảy ra? 156 00:09:21,450 --> 00:09:24,290 Theo thực hiện của tôi, 157 00:09:24,290 --> 00:09:31,040 Tôi sẽ đưa số tiếp theo trong chỉ số q.size. 158 00:09:31,040 --> 00:09:35,140 Trong trường hợp này, kích thước là 8, 159 00:09:35,140 --> 00:09:38,640 do đó, các chỉ số 8 sẽ được quyền ở vị trí cuối cùng. 160 00:09:38,640 --> 00:09:43,900 Nếu tôi cố gắng enqueue 1 ngay tại đây, tôi sẽ ghi đè lên các vị trí cuối cùng 161 00:09:43,900 --> 00:09:45,870 với số 1, đó là hoàn toàn sai. 162 00:09:45,870 --> 00:09:49,870 Những gì tôi muốn làm là bọc xung quanh và đi đến vị trí đầu tiên. 163 00:09:49,870 --> 00:09:52,870 Có thể bạn sẽ chỉ nói, tốt, tôi chỉ phải kiểm tra 164 00:09:52,870 --> 00:09:55,600 nếu tôi thực sự có thể đặt một cái gì đó ở đó. 165 00:09:55,600 --> 00:09:58,560 Nếu không, tôi chỉ nói, oh, công suất mới 166 00:09:58,560 --> 00:10:02,010 thực sự là lực - 1, và bạn không thể đặt một yếu tố đó. 167 00:10:02,010 --> 00:10:06,150 Nhưng vấn đề là gì? Vấn đề là nếu tôi chỉ dequeue tất cả mọi thứ ở đây 168 00:10:06,150 --> 00:10:08,240 và sau đó tôi cố gắng thêm một cái gì đó khác, nó chỉ nói: 169 00:10:08,240 --> 00:10:11,210 tốt, bạn đều rất sung sức, mà là 0. 170 00:10:11,210 --> 00:10:13,620 Vì vậy, hàng đợi của bạn đã biến mất. 171 00:10:13,620 --> 00:10:16,990 Bạn có để bọc xung quanh, và một cách để gói xung quanh 172 00:10:16,990 --> 00:10:22,040 mà các bạn đã học được trong tầm nhìn chiến lược và các psets đã sử dụng mod. 173 00:10:22,040 --> 00:10:29,090 Bạn có thể thử nó ở nhà để hiểu lý do tại sao bạn sẽ làm gì q.size + q.head 174 00:10:29,090 --> 00:10:31,080 khả năng mod, nhưng nếu bạn kiểm tra ngay tại đây, 175 00:10:31,080 --> 00:10:34,760 chúng ta có thể thấy rằng nó hoạt động. 176 00:10:34,760 --> 00:10:37,760 Vì vậy, trong ví dụ cuối cùng, q.size là 8 177 00:10:37,760 --> 00:10:47,590 và người đứng đầu là 1, vì đó là vị trí này đây của mảng. 178 00:10:47,590 --> 00:10:51,970 Vì vậy, nó sẽ là 8 + 1, 9. Mod suất 9 sẽ là 0. 179 00:10:51,970 --> 00:10:56,640 Nó sẽ đi đến chỉ số 0. Chúng tôi sẽ được ở vị trí bên phải. 180 00:10:56,640 --> 00:10:59,750 Và sau đó thử hàng đợi ở nhà. 181 00:10:59,750 --> 00:11:04,950 Một số điều quan trọng: cố gắng để hiểu sự khác biệt giữa một chồng và một hàng đợi. 182 00:11:04,950 --> 00:11:11,620 Ở nhà, cố gắng để có được rất quen thuộc với thực hiện enqueue, dequeue, đẩy và pop. 183 00:11:11,620 --> 00:11:16,560 Và cũng hiểu khi bạn sẽ sử dụng mỗi người. 184 00:11:16,560 --> 00:11:22,830 >> Vì vậy, hãy thư giãn trong 10 giây với một loạt các Pokemon. 185 00:11:22,830 --> 00:11:26,080 Và bây giờ chúng ta hãy quay trở lại cấu trúc dữ liệu. 186 00:11:26,080 --> 00:11:29,770 Băm bảng. Rất nhiều người đã sợ hãi của bảng băm. 187 00:11:29,770 --> 00:11:33,650 trong vấn đề thiết lập 6, Spell Checker. 188 00:11:33,650 --> 00:11:35,980 Bảng băm và cố gắng, rất nhiều người dân sợ hãi của họ. 189 00:11:35,980 --> 00:11:38,540 Họ nghĩ rằng họ rất khó hiểu. Yeah? 190 00:11:38,540 --> 00:11:41,490 [Rob Bowden] Vấn đề đặt 5. >> Vấn đề thiết lập 5, yeah. Nhờ Rob. 191 00:11:41,490 --> 00:11:43,370 Yeah. Sáu là Huff n 'Puff, yeah. 192 00:11:43,370 --> 00:11:49,340 Vấn đề thiết lập được 5 Spell Checker, và bạn phải sử dụng hoặc là một bảng băm hoặc một thử. 193 00:11:49,340 --> 00:11:55,360 Rất nhiều người nghĩ rằng họ là siêu khó hiểu, nhưng chúng thực sự khá đơn giản. 194 00:11:55,360 --> 00:12:01,290 Một bảng băm là gì, về cơ bản? Một bảng băm là một mảng của danh sách liên kết. 195 00:12:01,290 --> 00:12:06,730 Sự khác biệt duy nhất giữa một mảng và một bảng băm 196 00:12:06,730 --> 00:12:09,730 là trong bảng băm bạn có một cái gì đó gọi là một hàm băm. 197 00:12:09,730 --> 00:12:12,080 Một hàm băm là gì? 198 00:12:12,080 --> 00:12:13,970 Tôi không biết nếu các bạn có thể đọc ở đây. 199 00:12:13,970 --> 00:12:16,090 Đây là một ví dụ về một bảng băm. 200 00:12:16,090 --> 00:12:19,220 Vì vậy, bạn có thể thấy rằng bạn có một mảng với 31 yếu tố. 201 00:12:19,220 --> 00:12:22,440 Và những gì chúng ta làm trong một bảng băm là có một hàm băm 202 00:12:22,440 --> 00:12:26,660 có nghĩa là sẽ dịch một chìa khóa, mỗi int đến một chỉ số. 203 00:12:26,660 --> 00:12:31,740 Nếu, ví dụ, nếu tôi muốn chọn cho B. Harrison, 204 00:12:31,740 --> 00:12:34,190 Tôi sẽ đưa B. Harrison trong hàm băm của tôi, 205 00:12:34,190 --> 00:12:36,960 và hàm băm sẽ trở lại 24. 206 00:12:36,960 --> 00:12:40,930 Vì vậy, tôi biết rằng tôi muốn để lưu trữ B. Harrison trong 24. 207 00:12:40,930 --> 00:12:46,580 Vì vậy, đó là sự khác biệt giữa chỉ có một mảng và có một bảng băm. 208 00:12:46,580 --> 00:12:48,740 Trong bảng băm bạn sẽ có một chức năng có nghĩa là sẽ cho bạn biết 209 00:12:48,740 --> 00:12:54,740 nơi để lưu trữ các dữ liệu mà bạn muốn lưu trữ. 210 00:12:54,740 --> 00:12:57,040 Cho các chức năng băm, bạn muốn tìm một hàm băm 211 00:12:57,040 --> 00:13:00,600 đó là xác định và được phân phối. 212 00:13:00,600 --> 00:13:07,810 Như bạn có thể thấy ở đây, bạn sẽ thấy rằng rất nhiều các dữ liệu mà tôi muốn để lưu trữ thực sự là 19 213 00:13:07,810 --> 00:13:12,470 thay vì sử dụng 31 và 30 và 29, tất cả đều miễn phí. 214 00:13:12,470 --> 00:13:16,920 Vì vậy, các hàm băm mà tôi sử dụng không phải là rất tốt phân phối. 215 00:13:16,920 --> 00:13:20,710 Khi chúng ta nói tốt phân phối, nó có nghĩa là chúng ta muốn có, 216 00:13:20,710 --> 00:13:26,520 khoảng, ít nhất 1 hoặc 2 cho mỗi - 217 00:13:26,520 --> 00:13:32,190 như, một sự khác biệt của 1 hoặc 2 cho mỗi chỉ số trong mảng. 218 00:13:32,190 --> 00:13:43,950 Bạn muốn có, gần, cùng một số phần tử trong mỗi danh sách liên kết trong mảng. 219 00:13:43,950 --> 00:13:48,600 Và thật dễ dàng để kiểm tra xem nó có giá trị trong bảng băm, xem như bảng băm. 220 00:13:48,600 --> 00:13:51,770 >> Sau đó cây. Đây là một cây. 221 00:13:51,770 --> 00:13:56,400 Cây trong khoa học máy tính là lộn ngược đối với một số lý do. 222 00:13:56,400 --> 00:14:00,150 Vì vậy, ở đây bạn có thư mục gốc của cây và sau đó lá. 223 00:14:00,150 --> 00:14:05,630 Bạn chỉ cần biết các danh mục cho phụ huynh và trẻ em. 224 00:14:05,630 --> 00:14:12,880 Mỗi nút có con của nó, đó là các nút mà dưới đây cha mẹ. 225 00:14:12,880 --> 00:14:19,660 Vì vậy, ví dụ, 2 là có được phụ huynh cho 3 và cho đứa trẻ khác phải có, 226 00:14:19,660 --> 00:14:25,290 trong khi 3 là có được cha mẹ cho 1 và những đứa trẻ khác đang có. 227 00:14:25,290 --> 00:14:29,990 Và 1 là có được con 3, và như vậy. 228 00:14:29,990 --> 00:14:34,610 Chúng tôi có một cái gì đó thú vị hơn nhiều, được gọi là một cây tìm kiếm nhị phân, 229 00:14:34,610 --> 00:14:39,040 trong đó tất cả các giá trị trên bên phải của một nút 230 00:14:39,040 --> 00:14:41,660 sẽ được ở bên phải, ngay tại đây - phải, 231 00:14:41,660 --> 00:14:46,780 sẽ lớn hơn các yếu tố trong thư mục gốc. 232 00:14:46,780 --> 00:14:49,780 Vì vậy, nếu tôi có số 5 ở đây, tất cả các yếu tố trên bên phải 233 00:14:49,780 --> 00:14:51,940 sẽ được lớn hơn 5, và bên trái 234 00:14:51,940 --> 00:14:56,770 tất cả các yếu tố sẽ được ít hơn 5. 235 00:14:56,770 --> 00:14:58,780 Tại sao điều này hữu ích? 236 00:14:58,780 --> 00:15:01,660 Vâng, nếu tôi muốn kiểm tra xem số 7 là ở đây, ví dụ, 237 00:15:01,660 --> 00:15:05,960 Tôi chỉ cần đi đến 5 đầu tiên và tôi sẽ thấy, là 7 lớn hơn hoặc ít hơn 5? 238 00:15:05,960 --> 00:15:09,540 Nó lớn, vì vậy tôi biết nó sẽ có được trên bên phải của cây. 239 00:15:09,540 --> 00:15:13,980 Vì vậy, tôi có ít nhiều thứ để xem xét. 240 00:15:13,980 --> 00:15:19,520 Trong việc thực hiện một cây tìm kiếm nhị phân, các nút, tôi chỉ cần đi phải có dữ liệu, 241 00:15:19,520 --> 00:15:21,750 để int n, bạn cũng có thể có một chuỗi 242 00:15:21,750 --> 00:15:23,630 hoặc bất cứ điều gì bạn muốn. 243 00:15:23,630 --> 00:15:28,100 Bạn chỉ cần phải cẩn thận về việc xác định những gì là lớn hơn, những gì là ít hơn. 244 00:15:28,100 --> 00:15:30,390 Vì vậy, nếu bạn đã có chuỗi, ví dụ, bạn có thể xác định 245 00:15:30,390 --> 00:15:34,690 rằng tất cả những điều trên bên phải sẽ có chiều dài lớn hơn, 246 00:15:34,690 --> 00:15:40,940 bên trái sẽ có độ dài thấp hơn, do đó, nó thực sự vào bạn. 247 00:15:40,940 --> 00:15:44,930 >> Làm thế nào tôi có thể thực hiện tìm cho BST? 248 00:15:44,930 --> 00:15:47,840 Điều đầu tiên chúng ta sẽ phải làm là kiểm tra xem thư mục gốc là NULL. 249 00:15:47,840 --> 00:15:50,920 Nếu đó là NULL, có nghĩa là điều không có 250 00:15:50,920 --> 00:15:53,330 bởi vì bạn thậm chí không có một cây, phải không? 251 00:15:53,330 --> 00:15:55,790 Vì vậy, tôi trả về false. 252 00:15:55,790 --> 00:15:58,740 Nếu không, tôi sẽ kiểm tra xem số lượng lớn 253 00:15:58,740 --> 00:16:01,720 hơn giá trị trong thư mục gốc. 254 00:16:01,720 --> 00:16:04,250 Tôi sẽ cố gắng tìm các phần tử bên phải 255 00:16:04,250 --> 00:16:08,590 của cây. 256 00:16:08,590 --> 00:16:11,310 Bạn thấy rằng tôi đang sử dụng đệ quy ở đây. 257 00:16:11,310 --> 00:16:14,150 Và sau đó nếu nó ít hơn, tôi sẽ nhìn vào bên trái. 258 00:16:14,150 --> 00:16:18,330 Và cuối cùng, nếu không, nếu nó không phải là ít hoặc không lớn, 259 00:16:18,330 --> 00:16:20,660 nó có nghĩa rằng đó là giá trị của chính nó. 260 00:16:20,660 --> 00:16:23,010 Vì vậy, tôi chỉ trả lại sự thật. 261 00:16:23,010 --> 00:16:26,360 Bạn có thể thấy ở đây mà tôi sử dụng nếu, nếu, nếu. 262 00:16:26,360 --> 00:16:30,820 Và hãy nhớ, trong bài kiểm tra 0, chúng tôi đã có một vấn đề mà có nếu, nếu, nếu, 263 00:16:30,820 --> 00:16:32,780 và bạn đã dự định tìm thấy sự kém hiệu quả, 264 00:16:32,780 --> 00:16:35,180 và sự thiếu hiệu quả là bạn sử dụng nếu. 265 00:16:35,180 --> 00:16:39,060 Bạn nên sử dụng nếu, nếu người nào khác, nếu người nào khác, và khác. 266 00:16:39,060 --> 00:16:44,240 Vì vậy, tôi nên sử dụng nếu người nào khác và nếu người nào khác và khác ở đây? 267 00:16:44,240 --> 00:16:46,200 Có ai - vậy sao? 268 00:16:46,200 --> 00:16:51,140 [Nói sinh viên, không nghe được] 269 00:16:51,140 --> 00:16:53,480 Cái đó thật tuyệt hảo. Vì vậy, cô ấy nói rằng nó không quan trọng, 270 00:16:53,480 --> 00:16:55,930 chỉ vì sự thiếu hiệu quả mà chúng tôi đã có trước 271 00:16:55,930 --> 00:16:59,550 là bởi vì, có lẽ nếu một số điều kiện được thỏa mãn, 272 00:16:59,550 --> 00:17:03,570 do đó, bạn đã thực hiện một hành động, nhưng sau đó bạn đã đi để kiểm tra tất cả các điều kiện khác. 273 00:17:03,570 --> 00:17:06,319 Nhưng trong trường hợp này, nó trở lại ngay lập tức, do đó, nó không quan trọng. 274 00:17:06,319 --> 00:17:09,220 Vì vậy, bạn không cần phải sử dụng nếu người nào khác. 275 00:17:09,220 --> 00:17:11,740 >> Và cuối cùng, chúng ta hãy nói về cố gắng, 276 00:17:11,740 --> 00:17:13,800 đó là yêu thích của mọi người. 277 00:17:13,800 --> 00:17:15,980 Một thử là một cây của mảng. 278 00:17:15,980 --> 00:17:20,369 Nó rất nhanh để tìm kiếm giá trị, nhưng nó sử dụng rất nhiều bộ nhớ. 279 00:17:20,369 --> 00:17:22,530 Và nó thường là để lọc từ ngữ, vì vậy khi bạn 280 00:17:22,530 --> 00:17:27,920 muốn thực hiện, ví dụ, tôi không biết, giống như một cuốn sách điện thoại trong điện thoại của bạn 281 00:17:27,920 --> 00:17:30,440 và bạn muốn để có thể gõ B 282 00:17:30,440 --> 00:17:32,510 và chỉ có tên của những người có B. 283 00:17:32,510 --> 00:17:37,960 Nó rất dễ dàng để thực hiện điều đó bằng cách sử dụng một thử, ví dụ. 284 00:17:37,960 --> 00:17:39,820 Làm thế nào để bạn xác định một nút trong một thử? 285 00:17:39,820 --> 00:17:43,910 Bạn chỉ cần có một bool có nghĩa là sẽ được is_word. 286 00:17:43,910 --> 00:17:48,660 Đại diện cho rằng việc sử dụng tất cả các nhân vật trước khi nút đó, 287 00:17:48,660 --> 00:17:51,920 bạn đã có thể tạo thành một từ, 288 00:17:51,920 --> 00:17:57,230 và sau đó bạn sẽ có một mảng của con trỏ đến nút. 289 00:17:57,230 --> 00:18:03,120 Bạn có thể thấy rằng chúng tôi có một mảng các nút cha mẹ, vì vậy nút * mảng? Yeah? 290 00:18:03,120 --> 00:18:06,050 Vì vậy, chúng ta hãy xem làm thế nào mà sẽ làm việc. Cho kiểm tra chính tả, 291 00:18:06,050 --> 00:18:08,230 chúng tôi có một mảng của 27 yếu tố, 292 00:18:08,230 --> 00:18:12,150 bởi vì chúng tôi có tất cả các chữ cái cộng với dấu nháy đơn. 293 00:18:12,150 --> 00:18:17,800 Trước đây tôi chỉ sẽ sử dụng 2 bởi vì tôi muốn để có thể viết trên diễn đàn. 294 00:18:17,800 --> 00:18:20,230 Được rồi. Vì vậy, đây là một ví dụ về một thử. 295 00:18:20,230 --> 00:18:25,600 Nếu tôi chỉ cần xác định các nút đầu tiên, tôi sẽ có một mảng của 2 yếu tố 296 00:18:25,600 --> 00:18:29,290 có 2 con trỏ đến NULL, vì vậy tôi chỉ cần đặt 'a' và 'b'. 297 00:18:29,290 --> 00:18:32,430 Và tôi sẽ có một bool nói rằng is_word. 298 00:18:32,430 --> 00:18:34,420 Nó sẽ là sai lầm cho người đầu tiên, 299 00:18:34,420 --> 00:18:37,370 chỉ vì, trước đó bạn không có bất kỳ ký tự. 300 00:18:37,370 --> 00:18:40,900 Vì vậy, một từ trống rỗng không phải là một từ. Vì vậy, nó là sai. 301 00:18:40,900 --> 00:18:46,320 Nếu tôi muốn thêm 'a' đến từ điển này, những gì tôi sẽ phải làm gì? 302 00:18:46,320 --> 00:18:49,760 Tôi sẽ chỉ phải malloc một nút mới cho 'a', 303 00:18:49,760 --> 00:18:54,630 và sau đó thêm từ của nó đúng sự thật. 304 00:18:54,630 --> 00:19:00,180 Vì vậy, nó chỉ đại diện cho rằng có 'a' là có được sự thật. Có ý nghĩa? 305 00:19:00,180 --> 00:19:04,120 Sau đó, nếu tôi muốn thêm 'ba', tôi sẽ phải malloc 1 cho 'b', 306 00:19:04,120 --> 00:19:07,550 và sau đó tôi sẽ thiết lập boolean false, 307 00:19:07,550 --> 00:19:10,160 vì 'b' tự không phải là một từ. 308 00:19:10,160 --> 00:19:13,010 Sau đó tôi sẽ malloc một số khác cho 'a', do đó, 'ba', 309 00:19:13,010 --> 00:19:16,290 và sau đó tôi sẽ thiết lập nó là một từ đúng sự thật. 310 00:19:16,290 --> 00:19:18,950 Vì 'ba' là một từ. 311 00:19:18,950 --> 00:19:21,910 Và sau đó nếu tôi muốn xem nếu 'b' là trong từ điển này, 312 00:19:21,910 --> 00:19:26,730 Tôi chỉ có thể đi đến một trong những đầu tiên, 'b'. Tôi đi xuống, và tôi nhìn vào là văn bản, và nó nói sai. 313 00:19:26,730 --> 00:19:30,110 Vì vậy, nó không phải là một từ. Nếu tôi muốn kiểm tra 'ba', 314 00:19:30,110 --> 00:19:38,010 Tôi đi đến đầu tiên, 'b', và sau đó đi đến 'a', và tôi thấy đúng, vì vậy nó là một từ. Có ý nghĩa? 315 00:19:38,010 --> 00:19:41,950 Rất nhiều người bị lẫn lộn bởi cố gắng. Không? 316 00:19:41,950 --> 00:19:44,740 >> Cuối cùng, Huffman mã hóa. Huffman mã hóa là rất hữu ích 317 00:19:44,740 --> 00:19:47,550 để tiết kiệm bộ nhớ và nén tập tin văn bản, 318 00:19:47,550 --> 00:19:52,270 chỉ vì rất nhiều lần bạn sử dụng 'a' và 'e', ​​ví dụ, 319 00:19:52,270 --> 00:19:57,710 trong tài liệu của bạn, nhưng tôi không biết nếu các bạn sử dụng 'q' hoặc 'z' càng nhiều. 320 00:19:57,710 --> 00:20:02,040 Có chỉ 1 byte cho mỗi nhân vật duy nhất, 321 00:20:02,040 --> 00:20:08,520 mỗi đơn - 256 nhân vật mà chúng tôi có trong bảng mã ASCII không phải là rất tối ưu, 322 00:20:08,520 --> 00:20:11,410 chỉ vì có một số nhân vật mà bạn sử dụng nhiều hơn nữa, 323 00:20:11,410 --> 00:20:15,180 vì vậy bạn có lẽ nên sử dụng ít bộ nhớ cho những người. 324 00:20:15,180 --> 00:20:17,560 Làm thế nào để sử dụng mã hóa Huffman? 325 00:20:17,560 --> 00:20:20,010 Chúng ta phải làm một cây Huffman. 326 00:20:20,010 --> 00:20:23,370  Một cây Huffman có các nút 327 00:20:23,370 --> 00:20:27,760 có một biểu tượng có nghĩa là sẽ được như thế, 'a', 'b', 'c', bức thư, 328 00:20:27,760 --> 00:20:32,990 bất cứ điều gì bạn có thư, một tần số đó là tần số mà từ đó xuất hiện trong văn bản, 329 00:20:32,990 --> 00:20:36,280 mà bạn đã tạo ra cây Huffman cho, 330 00:20:36,280 --> 00:20:41,800 và sau đó một nút có nghĩa là sẽ chỉ ở bên trái của cây Huffman 331 00:20:41,800 --> 00:20:47,210 và một nút khác có nghĩa là sẽ chỉ ở bên phải. Vì vậy, giống như một cái cây. 332 00:20:47,210 --> 00:20:49,440 Làm thế nào để bạn xây dựng một cây Huffman? 333 00:20:49,440 --> 00:20:54,020 Bạn sẽ chọn 2 nút có tần số thấp nhất. 334 00:20:54,020 --> 00:20:56,490 Nếu bạn có một chiếc cà vạt bạn sẽ chọn 2 nút 335 00:20:56,490 --> 00:20:59,870 có các giá trị ASCII thấp nhất là tốt. 336 00:20:59,870 --> 00:21:02,420 Sau đó, bạn sẽ tạo ra một cây mới ra khỏi những 2 nút 337 00:21:02,420 --> 00:21:08,030 có nghĩa là sẽ có tần số kết hợp trong nút cha. 338 00:21:08,030 --> 00:21:13,240 Và sau đó bạn sẽ loại bỏ 2 trẻ em từ rừng 339 00:21:13,240 --> 00:21:15,570 và thay thế chúng với phụ huynh. 340 00:21:15,570 --> 00:21:18,930 Và bạn sẽ lặp lại điều đó cho đến khi bạn chỉ có 1 cây trong rừng. 341 00:21:18,930 --> 00:21:23,840 Vì vậy, chúng ta hãy xem làm thế nào bạn sẽ làm một cây Huffman cho ZAMYLA. 342 00:21:23,840 --> 00:21:29,220 Bạn có thể thấy ở đây là tất cả các chữ cái có tần số 1 trừ 'A'; có tần số 2. 343 00:21:29,220 --> 00:21:34,090 Vì vậy, tôi tạo ra các nút cho tất cả các chữ cái tôi đặt theo thứ tự giá trị ASCII và tần số. 344 00:21:34,090 --> 00:21:40,090 Vì vậy, nếu tôi muốn tạo ra cây đầu tiên, nó sẽ được với 'L' và 'M'. 345 00:21:40,090 --> 00:21:43,100 Vì vậy, nó đây. Tần số của các cặp sẽ có 2 346 00:21:43,100 --> 00:21:49,470 bởi vì nó là 1 + 1, sau đó tiếp theo 2 với các tần số thấp nhất là 'Y' và 'Z'. 347 00:21:49,470 --> 00:21:53,180 Và sau đó tôi có tất cả trong số đó là - có một tần số 2. 348 00:21:53,180 --> 00:22:00,470 Vì vậy, những người thân mà là những người có giá trị ASCII thấp nhất cho người tiếp theo? 349 00:22:00,470 --> 00:22:04,830 'A' và 'L'. Vì vậy, tôi tạo ra các nút mới, 350 00:22:04,830 --> 00:22:09,930 và cuối cùng, đó là 4 và 2, do 2 sẽ là bên trái. 351 00:22:09,930 --> 00:22:12,430 Và đây là cây Huffman. 352 00:22:12,430 --> 00:22:16,060 Sau đó nếu tôi muốn viết một số văn bản, 353 00:22:16,060 --> 00:22:24,440 như trong hệ nhị phân để chuyển đổi văn bản, bằng cách sử dụng cây Huffman là rất dễ dàng. 354 00:22:24,440 --> 00:22:30,220 Ví dụ, nếu tôi nói rằng di chuyển bên trái là 0 và chuyển sang bên phải là 1, 355 00:22:30,220 --> 00:22:32,410 Mà sẽ đại diện là gì? 356 00:22:32,410 --> 00:22:35,530 Vì vậy, như 1, 1, do đó bên phải,, 357 00:22:35,530 --> 00:22:40,370 và sau đó 0, do đó để lại sẽ là L, và sau đó 1, 0, 0. 358 00:22:40,370 --> 00:22:43,950 Vì vậy, 1, 0, vì vậy chỉ cần 1, 0, 'A'. 359 00:22:43,950 --> 00:22:47,540 Và sau đó 0, 1, do đó, 'Z'. 360 00:22:47,540 --> 00:22:52,170 Và sau đó 1, 0, 0 - không có. 361 00:22:52,170 --> 00:22:56,780 0, 0 sẽ là 'Y', vì vậy lười biếng. 362 00:22:56,780 --> 00:23:06,060 Vì vậy, đó là tất cả đối với tôi, Rob sẽ đi qua. 363 00:23:06,060 --> 00:23:08,400 >> [Rob Bowden] Vì vậy, tuần 7 công cụ. 364 00:23:08,400 --> 00:23:11,390 Chúng tôi đã có rất nhiều để đi qua rất nhanh. 365 00:23:11,390 --> 00:23:13,430 Nhà khai thác bitwise, lỗi tràn bộ đệm, 366 00:23:13,430 --> 00:23:16,760 Thư viện CS50, sau đó HTML, HTTP, CSS. 367 00:23:16,760 --> 00:23:20,990 Tất cả trong như 15 đến 20 phút. 368 00:23:20,990 --> 00:23:24,330 Nhà khai thác bitwise. Có 6 trong số họ mà bạn cần biết. 369 00:23:24,330 --> 00:23:31,200 Bitwise và phép toán hay, XOR, thay đổi trái, chuyển quyền, và không. 370 00:23:31,200 --> 00:23:35,420 Phải thay đổi và không chỉ thấy trong bài giảng ở tất cả. 371 00:23:35,420 --> 00:23:40,480 Chúng tôi sẽ đi qua nó một cách nhanh chóng ở đây, nhưng đó là tốt để biết rằng đây là 6 mà tồn tại. 372 00:23:40,480 --> 00:23:45,070 Hãy nhớ rằng các nhà khai thác Bitwise giống như khi bạn làm 3 + 4. 373 00:23:45,070 --> 00:23:49,420 Bạn không phải đối phó với nhị phân của 3 và 4. 374 00:23:49,420 --> 00:23:56,550 Với những hoạt động Bitwise bạn đang thực sự đối phó với các bit riêng lẻ của những con số 3 và 4. 375 00:23:56,550 --> 00:23:59,120 >> Vì vậy, một trong những đầu tiên mà chúng tôi sẽ nói là toán tử không, 376 00:23:59,120 --> 00:24:02,340 và tất cả nó là lật tất cả các bit. 377 00:24:02,340 --> 00:24:05,500 Vì vậy, ở đây, nếu bạn đang viết điều này trong C, bạn sẽ không viết nó 378 00:24:05,500 --> 00:24:09,380 như ~ 11011 hoặc bất cứ điều gì, bạn sẽ viết nó như ~ 4, 379 00:24:09,380 --> 00:24:12,970 và sau đó nó sẽ lật biểu diễn nhị phân của 4. 380 00:24:12,970 --> 00:24:24,800 Vì vậy, ở đây, ~ của một số số nhị phân 1101101 sẽ lật chính xác tất cả các của 1 đến 0 và tất cả các số 0 đến 1 của. 381 00:24:24,800 --> 00:24:27,600 Như tôi đã nói đó, việc sử dụng thường xuyên này, 382 00:24:27,600 --> 00:24:30,830 và chúng ta sẽ thấy nó trong một chút, giống như chúng tôi muốn đưa ra một số số 383 00:24:30,830 --> 00:24:35,460 nơi tất cả các bit là 1, ngoại trừ một trong số họ. 384 00:24:35,460 --> 00:24:38,560 Vì vậy, nó thường dễ dàng hơn để diễn tả số 385 00:24:38,560 --> 00:24:40,630 nơi chỉ là chút được thiết lập, 386 00:24:40,630 --> 00:24:44,650 và sau đó đi ~ của nó, vì vậy tất cả các bit khác được thiết lập ngoại trừ một điều đó. 387 00:24:44,650 --> 00:24:50,300 Vì vậy, đó là những gì chúng ta sẽ sử dụng nhiều hơn một chút. 388 00:24:50,300 --> 00:24:58,220 >> Đảo bit hoặc. Dưới đây là 2 số nhị phân, và những con số 2 389 00:24:58,220 --> 00:25:00,780 là khá đại diện, vì chúng đại diện cho mỗi thể 390 00:25:00,780 --> 00:25:07,290 sự kết hợp của các bit bạn có thể cần để hoạt động trên. 391 00:25:07,290 --> 00:25:13,540 Ở đây, khi tôi or'd mỗi bit, chúng ta chỉ cần đi để so sánh thẳng xuống. 392 00:25:13,540 --> 00:25:15,410 Vì vậy, ở phía bên trái có một 1 và 1. 393 00:25:15,410 --> 00:25:20,510 Khi tôi bitwise | những gì tôi sẽ nhận được? Một. 394 00:25:20,510 --> 00:25:25,320 Sau đó bitwise | 0 và 1 sẽ cung cấp cho tôi? Một. 395 00:25:25,320 --> 00:25:27,840 Bitwise 1 và 0 là có được điều tương tự, một. 396 00:25:27,840 --> 00:25:31,880 Bitwise 0 | 0 sẽ cung cấp cho tôi 0. 397 00:25:31,880 --> 00:25:37,300 Vì vậy, trường hợp duy nhất mà tôi nhận được là 0 trong 0 | 0 trường hợp. 398 00:25:37,300 --> 00:25:40,020 Và bạn có thể nghĩ rằng chỉ như ORS logic của bạn. 399 00:25:40,020 --> 00:25:44,830 Vì vậy, nếu bạn nghĩ về 1 như đúng và 0 là sai, điều tương tự áp dụng ở đây. 400 00:25:44,830 --> 00:25:50,040 Vì vậy, đúng hay đúng là sự thật; đúng hay sai là đúng. 401 00:25:50,040 --> 00:25:57,150 Sai hay đúng là sự thật, sai lệch hoặc giả là điều duy nhất đó là thực sự sai lầm. 402 00:25:57,150 --> 00:26:00,100 Dưới đây là ví dụ mà bạn nên biết 403 00:26:00,100 --> 00:26:05,160 là một ví dụ khá tốt khi các nhà khai thác bitwise được sử dụng. 404 00:26:05,160 --> 00:26:08,660 Ở đây nếu chúng ta vốn 'A' với Ox20, 405 00:26:08,660 --> 00:26:11,830 và chúng tôi sẽ xem xét những trong một giây, chúng tôi nhận được một cái gì đó. 406 00:26:11,830 --> 00:26:16,020 Và nếu chúng ta hoặc chữ thường 'a' với Ox20, chúng tôi nhận được một cái gì đó. 407 00:26:16,020 --> 00:26:26,750 Vì vậy, hãy kéo lên bảng ASCII. 408 00:26:26,750 --> 00:26:34,000 Được rồi. Ở đây chúng ta thấy rằng 'A' - 409 00:26:34,000 --> 00:26:36,920 ở đây chúng tôi có 'A' là số thập phân 65. 410 00:26:36,920 --> 00:26:45,120 Nhưng tôi sẽ đi với hệ thập lục phân, đó là Ox41. 411 00:26:45,120 --> 00:26:48,280 Đẹp, chắc chắn chúng ta đã thấy nó trong lớp học. Tôi nghĩ rằng chúng ta đã thấy nó trong lớp học 412 00:26:48,280 --> 00:26:52,730 rằng nó rất dễ dàng để chuyển đổi từ hệ thập lục phân sang nhị phân. 413 00:26:52,730 --> 00:26:55,280 Vì vậy, ở đây, nếu tôi muốn đặt 4 thành nhị phân, 414 00:26:55,280 --> 00:26:59,550 đó chỉ là sẽ 0100. 415 00:26:59,550 --> 00:27:03,620 Đây là 1 của địa điểm, vị trí của 2, nơi 4, vì vậy đây là 4. 416 00:27:03,620 --> 00:27:08,550 Sau đó, tôi có thể chia 1 thành nhị phân, mà là có được 0001. 417 00:27:08,550 --> 00:27:14,280 Và vì vậy đây sẽ là đại diện của 'A' trong hệ nhị phân. 418 00:27:14,280 --> 00:27:22,720 Dùng chữ thường 'a', nó bây giờ sẽ là Ox61, 419 00:27:22,720 --> 00:27:27,050 nơi, tách các thành nhị phân của nó, do đó, một 6 - 420 00:27:27,050 --> 00:27:37,830 Chúng ta hãy thực sự làm điều đó - là không có tẩy? Tẩy. 421 00:27:37,830 --> 00:27:48,220 Ox61. Vì vậy, chia 6 thành nhị phân sẽ là 0 + 4 + 2 + 0. 422 00:27:48,220 --> 00:27:54,610 Và tách 1 sẽ là 0001. 423 00:27:54,610 --> 00:27:56,520 Nhìn vào sự khác biệt giữa 2, 424 00:27:56,520 --> 00:28:04,250 chúng ta thấy rằng sự khác biệt duy nhất giữa một chữ thường và vốn 'A' là bit này. 425 00:28:04,250 --> 00:28:11,810 Vì vậy, trở lại đây - được. 426 00:28:11,810 --> 00:28:15,920 Trở lại đây, nếu chúng ta nhìn vào những gì các Ox20 bit, 427 00:28:15,920 --> 00:28:22,210 để tách Ox20 vào nhị phân của nó, 428 00:28:22,210 --> 00:28:27,310 là 0010, 0000. 429 00:28:27,310 --> 00:28:33,470 Ox20, các bit được thiết lập là bit này mà chúng tôi đang quan tâm đến, 430 00:28:33,470 --> 00:28:38,210 với chuyển đổi giữa vốn và chữ thường 'a'. 431 00:28:38,210 --> 00:28:47,610 Nếu tôi hoặc 'A', mà là một trong những điều này, 'A', 432 00:28:47,610 --> 00:28:50,580 nếu tôi hoặc 'A' với Ox20, 433 00:28:50,580 --> 00:28:53,490 những gì tôi sẽ nhận được? 434 00:28:53,490 --> 00:28:58,960 [Sinh viên, không nghe được] >> Chữ thường 'a', bởi vì nó sẽ lật bit này cho một 1. 435 00:28:58,960 --> 00:29:04,170 Và nếu tôi hoặc 'a' với Ox20, những gì tôi sẽ nhận được? 436 00:29:04,170 --> 00:29:08,780 Chữ thường một, bởi vì chỉ Oring 'a' với Ox20, 437 00:29:08,780 --> 00:29:14,580 Tôi chỉ sẽ được Oring chút này cho một 1, nó đã là một 1, vì vậy nó không quan trọng. 438 00:29:14,580 --> 00:29:17,960 Vì vậy, chúng tôi nhận được 'a' và 'a'. 439 00:29:17,960 --> 00:29:24,820 >> Đảo bit và. Một lần nữa, chúng ta có thể nghĩ về điều này như đối tác hợp lý và chúng tôi. 440 00:29:24,820 --> 00:29:28,180 Ở phía bên trái chúng ta có thật sự & thật. 441 00:29:28,180 --> 00:29:31,160 Nó sẽ là đúng, và cho tất cả các trường hợp, 442 00:29:31,160 --> 00:29:36,270 sai và đúng hay sai sự thật và hay sai và sai, 443 00:29:36,270 --> 00:29:38,550 không ai trong số những điều đó là sự thật. 444 00:29:38,550 --> 00:29:44,170 Vì vậy, những gì chúng tôi sẽ nhận được là 1000. 445 00:29:44,170 --> 00:29:48,830 Vì vậy, bây giờ, ở đây, đây là nơi mà tôi đã sử dụng các phép toán đáng tin cậy không, 446 00:29:48,830 --> 00:29:52,230 nơi chúng tôi đã có Ox20. 447 00:29:52,230 --> 00:29:54,350 Vì vậy, đây là Ox20. 448 00:29:54,350 --> 00:29:59,570 Bây giờ những gì tôi muốn làm, bitwise ~ của Ox20. 449 00:29:59,570 --> 00:30:03,600 Có nghĩa là sẽ lật tất cả các bit. 450 00:30:03,600 --> 00:30:09,330 Vì vậy, tôi có 1101, 1111. 451 00:30:09,330 --> 00:30:18,940 Và do đó, 'A' ANDed với ~ Ox20 sẽ cung cấp cho tôi những gì? 452 00:30:18,940 --> 00:30:22,430 Bit duy nhất chúng ta thực sự cần phải suy nghĩ về là một trong những điều này, 453 00:30:22,430 --> 00:30:26,020 Kể từ đó, nếu tất cả các bit này được thiết lập để 1, 454 00:30:26,020 --> 00:30:29,000 sau đó chúng ta sẽ có được chính xác những gì 'A' là, 455 00:30:29,000 --> 00:30:31,260 ngoại trừ, có thể, những gì bit này là. 456 00:30:31,260 --> 00:30:34,460 Bởi vì nếu đó là một 1, bây giờ nó sẽ được thiết lập để 0, 457 00:30:34,460 --> 00:30:39,810 bởi vì bất cứ điều gì đây là, ANDed với điều này là có được 0. 458 00:30:39,810 --> 00:30:43,280 Vì vậy, 'A' là những gì & ~ Ox20 sẽ cung cấp cho tôi? 459 00:30:43,280 --> 00:30:48,200 [Học sinh trả lời, không nghe được] >> Và 'a' và là những gì - đó là 'A'. 460 00:30:48,200 --> 00:30:52,170 Và là những gì 'a' & ~ Ox20 sẽ cung cấp cho tôi? 461 00:30:52,170 --> 00:30:56,720 'A' Bởi vì đây là một hiện 1. 462 00:30:56,720 --> 00:30:59,570 Anding với 0 điều này sẽ làm cho nó một 0, 463 00:30:59,570 --> 00:31:02,530 và bây giờ chúng ta sẽ có được một 'A'. 464 00:31:02,530 --> 00:31:06,600 >> Cả hai đều là 'A', và cuối cùng nhưng không kém của loại hình này, 465 00:31:06,600 --> 00:31:10,830 chúng tôi có XOR. Nó rất giống hoặc, 466 00:31:10,830 --> 00:31:14,400 ngoại trừ nó có nghĩa là độc quyền hoặc. 467 00:31:14,400 --> 00:31:18,420 Điều này giống như những gì bạn thường nghĩ là hay trong thế giới thực. 468 00:31:18,420 --> 00:31:23,190 Vì vậy, bạn làm một trong hai 'x' hoặc 'y', nhưng không phải cả hai. 469 00:31:23,190 --> 00:31:28,700 Đây 1 ^ 1 sẽ là 0. 470 00:31:28,700 --> 00:31:33,650 Bởi vì sự thật, đây là - nó không hoạt động cũng như với các hợp lý đúng và sai 471 00:31:33,650 --> 00:31:37,150 như phép toán & và hay làm, 472 00:31:37,150 --> 00:31:40,100 nhưng sự thật ^ đúng là sai. 473 00:31:40,100 --> 00:31:44,810 Bởi vì chúng tôi chỉ muốn trở về đúng nếu chỉ một trong số họ là đúng. 474 00:31:44,810 --> 00:31:50,950 Vì vậy, 1 ^ 1 là 0. Những gì về 0 ^ 1? 475 00:31:50,950 --> 00:31:56,010 Là 1. 1 ^ 0 là 1, 0 ^ 0 là 0. 476 00:31:56,010 --> 00:32:03,890 Vì vậy, trong mọi hoàn cảnh, một cái gì đó trên bit 0 0 sẽ là 0. 477 00:32:03,890 --> 00:32:10,270 1 phép toán một cái gì đó hoặc 0 0 1 phép toán, 478 00:32:10,270 --> 00:32:14,660 nếu nó | hoặc ^, nó sẽ là một 1, và nếu nó và nó sẽ là 0. 479 00:32:14,660 --> 00:32:20,850 Và trường hợp duy nhất mà 1 phép toán 1 không phải là 1 là với độc quyền hoặc. 480 00:32:20,850 --> 00:32:24,580 Đó là 0110. 481 00:32:24,580 --> 00:32:36,520 Vì vậy, ở đây bây giờ, sử dụng XOR - vì vậy chúng tôi đang trở lại ở tuổi 20. 482 00:32:36,520 --> 00:32:43,480 'A' ^ Ox20 là những 2 bit chúng ta đang so sánh. 483 00:32:43,480 --> 00:32:50,020 Vì vậy, một 1 ^ 0 sẽ cung cấp cho tôi một điều gì? Một một. 484 00:32:50,020 --> 00:32:58,430 'A' ^ Ox20 sẽ cung cấp cho tôi? Chữ thường a. 485 00:32:58,430 --> 00:33:04,010 'A' ^ Ox20 sẽ cung cấp cho tôi? Vốn A. 486 00:33:04,010 --> 00:33:09,310 Bởi vì bất cứ điều gì đang thực hiện, XORing này với Ox20 487 00:33:09,310 --> 00:33:15,380 được hiệu quả lật bất cứ điều gì bit này là. 488 00:33:15,380 --> 00:33:21,240 Nếu đây là một số 0, nó bây giờ sẽ trở thành một 1. 489 00:33:21,240 --> 00:33:26,160 Vì đây là một 1, 1 ^ 1 là 0. 490 00:33:26,160 --> 00:33:33,280 Vì vậy, chúng tôi 'a' đã trở thành 'A', và chúng tôi 'A' đã trở thành 'một'. 491 00:33:33,280 --> 00:33:36,910 Vì vậy, XOR là một cách thực sự thuận tiện chỉ lật trường hợp. 492 00:33:36,910 --> 00:33:39,960 Bạn chỉ muốn để lặp lại một chuỗi ký tự 493 00:33:39,960 --> 00:33:44,330 và thay thế trường hợp của mỗi nhân vật duy nhất, 494 00:33:44,330 --> 00:33:50,680 bạn chỉ cần XOR tất cả mọi thứ với Ox20. 495 00:33:50,680 --> 00:33:55,220 >> Bây giờ chúng ta đã để lại sự thay đổi. Thay đổi lại chỉ là sẽ, về cơ bản, 496 00:33:55,220 --> 00:34:01,250 đẩy tất cả các con số này vào, hoặc bên trái, và chèn số 0 phía sau họ. 497 00:34:01,250 --> 00:34:05,550 Vì vậy, ở đây chúng tôi có 00.001.101. 498 00:34:05,550 --> 00:34:08,560 Chúng ta sẽ đẩy 3 0 của từ cánh phải, 499 00:34:08,560 --> 00:34:13,580 và chúng tôi nhận được 01.101.000. 500 00:34:13,580 --> 00:34:16,380 Về nonbinary, 501 00:34:16,380 --> 00:34:24,699 chúng ta thấy rằng đó là thực sự giải quyết 13 trái dịch chuyển 3, mà cho chúng ta 104. 502 00:34:24,699 --> 00:34:32,530 Vì vậy, chuyển bên trái, chúng ta thấy ở đây, x << y về cơ bản là x * 2 ^ y. 503 00:34:32,530 --> 00:34:40,139 13 * 2 ^ 3, 2 ^ 3 là 8, vì thế 13 * 8 là 104. 504 00:34:40,139 --> 00:34:45,679 Nếu bạn chỉ nghĩ về nhị phân nói chung, làm thế nào mỗi chữ số, 505 00:34:45,679 --> 00:34:49,530 nếu chúng ta bắt đầu từ bên phải, đó là của 1 vị trí, sau đó nơi của 2, sau đó nơi 4. 506 00:34:49,530 --> 00:34:51,330 Vì vậy, bằng cách đẩy trong 0 của từ cánh phải, 507 00:34:51,330 --> 00:34:55,080 chúng ta chỉ cần đẩy những điều mà được đặt ra của 4 vị trí của 8, 508 00:34:55,080 --> 00:34:57,920 và những điều được đặt ra của 8 vị trí của 16. 509 00:34:57,920 --> 00:35:01,280 Mỗi ca chỉ nhân với 2. Yeah? 510 00:35:01,280 --> 00:35:05,210 [Sinh viên] Điều gì xảy ra nếu bạn chuyển 5? 511 00:35:05,210 --> 00:35:10,790 [Bowden] Nếu bạn chuyển 5 bạn sẽ chỉ mất chữ số. 512 00:35:10,790 --> 00:35:15,410 Chắc chắn, đó là điều tương tự. Như, số nguyên chỉ 32 bit, 513 00:35:15,410 --> 00:35:20,750 vì vậy nếu bạn thêm 2 số nguyên thực sự lớn, nó chỉ không phù hợp với một số nguyên. 514 00:35:20,750 --> 00:35:23,660 Vì vậy, nó là điều tương tự ở đây. Nếu bạn chuyển 5, 515 00:35:23,660 --> 00:35:25,650 chúng tôi sẽ chỉ mất một đó. 516 00:35:25,650 --> 00:35:28,820 Và đó là loại gì tôi có nghĩa là do "gần" 517 00:35:28,820 --> 00:35:37,470 mà nếu bạn chuyển quá xa, bạn sẽ mất bit. 518 00:35:37,470 --> 00:35:39,830 >> Thay đổi phải là có được điều ngược lại, 519 00:35:39,830 --> 00:35:43,090 nơi chúng ta sẽ xô 0 của off cuối cùng, 520 00:35:43,090 --> 00:35:48,400 và cho các mục đích của chúng tôi, điền số 0 từ cánh trái. 521 00:35:48,400 --> 00:35:52,910 Vì vậy, làm điều này, chúng tôi về cơ bản đảo ngược những gì chúng tôi đã thực hiện. 522 00:35:52,910 --> 00:35:57,780 Và chúng ta thấy rằng ba số 0 ở bên phải vừa giảm đi, 523 00:35:57,780 --> 00:36:02,020 và chúng tôi đã đẩy 1101 tất cả các cách bên phải. 524 00:36:02,020 --> 00:36:08,380 Này được làm 104 >> 3, đó là, có hiệu quả, x / 2 ^ y. 525 00:36:08,380 --> 00:36:11,200 Vì vậy, bây giờ, ở đây, đó là một ý tưởng tương tự. 526 00:36:11,200 --> 00:36:18,720 Tại sao nó chỉ khoảng x / 2 ^ y, và không thực sự x / 2 ^ y? 527 00:36:18,720 --> 00:36:22,240 Bởi vì nếu tôi đã chuyển 4, tôi đã mất đi một 1. 528 00:36:22,240 --> 00:36:25,950 Về cơ bản, những gì bạn nghĩ, chỉ cần nghĩ về phân chia số nguyên nói chung. 529 00:36:25,950 --> 00:36:31,070 Vì vậy, giống như 5/2 là 2. Nó không phải là 2,5. 530 00:36:31,070 --> 00:36:35,000 Đó là ý tưởng tương tự ở đây. Khi chúng tôi chia cho 2, 531 00:36:35,000 --> 00:36:39,910 chúng ta có thể mất bit lẻ trên đường đi. 532 00:36:39,910 --> 00:36:43,870 Vì vậy, bây giờ - đó là nó cho phép toán. Đó là tất cả các bạn cần biết. 533 00:36:43,870 --> 00:36:46,340 Hãy nhớ rằng các trường hợp sử dụng chúng ta đã thấy trong lớp học, 534 00:36:46,340 --> 00:36:49,340 như một mặt nạ bit là hữu ích cho các nhà khai thác trên bit, 535 00:36:49,340 --> 00:36:53,220 hoặc bạn sử dụng chúng cho các mặt nạ bit. 536 00:36:53,220 --> 00:36:58,620 Chữ hoa và chữ thường, chuyển đổi là một ví dụ khá nguyên mẫu. 537 00:36:58,620 --> 00:37:01,640 >> Được rồi, do cuộc tấn công tràn bộ đệm. 538 00:37:01,640 --> 00:37:05,110 Bất cứ ai cũng nhớ những gì đã xảy ra với chức năng này? 539 00:37:05,110 --> 00:37:10,140 Thông báo chúng tôi tuyên bố một mảng của 12 byte, 12 ký tự, 540 00:37:10,140 --> 00:37:18,510 và sau đó chúng tôi sao chép vào bộ đệm của chúng tôi là 12 ký tự toàn bộ chuỗi thanh. 541 00:37:18,510 --> 00:37:25,080 Vì vậy, vấn đề là gì đây? 542 00:37:25,080 --> 00:37:32,270 Con số kỳ diệu 12 nên khá nhiều ngay lập tức bật ra như - tại sao 12? 543 00:37:32,270 --> 00:37:35,050 Nếu thanh sẽ xảy ra là nhiều hơn 12 ký tự? 544 00:37:35,050 --> 00:37:41,200 Nếu thanh là hàng triệu ký tự? 545 00:37:41,200 --> 00:37:46,010 Ở đây vấn đề là memcpy. Nếu thanh là đủ dài, 546 00:37:46,010 --> 00:37:50,330 nó sẽ chỉ hoàn toàn - 'c', 'c' không quan tâm rằng đó là chỉ có 12 ký tự; 547 00:37:50,330 --> 00:37:53,280 'C' không quan tâm rằng nó không thể phù hợp với nhiều byte. 548 00:37:53,280 --> 00:37:58,250 Nó sẽ chỉ hoàn toàn ghi đè lên char, 12 byte chúng tôi đã phân bổ cho nó, 549 00:37:58,250 --> 00:38:01,830 và tất cả mọi thứ qua nó trong bộ nhớ mà không thực sự thuộc về bộ đệm 550 00:38:01,830 --> 00:38:06,520 với bất cứ điều gì thanh chuỗi. 551 00:38:06,520 --> 00:38:09,780 Vì vậy, đây là hình ảnh mà chúng ta thấy trong lớp 552 00:38:09,780 --> 00:38:12,220 nơi chúng tôi có ngăn xếp của chúng tôi lớn lên. 553 00:38:12,220 --> 00:38:16,040 Bạn nên sử dụng những hình ảnh hoặc làm quen với họ một lần nữa. 554 00:38:16,040 --> 00:38:21,260 Chúng tôi đã ngăn xếp của chúng tôi lớn lên, địa chỉ bộ nhớ bắt đầu từ 0 ở đầu 555 00:38:21,260 --> 00:38:26,270 và phát triển xuống như 4 tỷ ở phía dưới. 556 00:38:26,270 --> 00:38:28,820 Chúng tôi có mảng của chúng tôi 'c' một nơi nào đó trong bộ nhớ, 557 00:38:28,820 --> 00:38:32,260 sau đó chúng tôi có con trỏ của chúng tôi để thanh ngay bên dưới nó, 558 00:38:32,260 --> 00:38:38,720 và sau đó chúng tôi có con trỏ này được lưu trong khung địa chỉ trở về của chúng tôi và thường xuyên của cha mẹ của chúng tôi stack. 559 00:38:38,720 --> 00:38:40,800 Nhớ những gì các địa chỉ trả lại là? 560 00:38:40,800 --> 00:38:45,360 Đó là khi chính gọi một hàm foo, gọi một thanh chức năng, 561 00:38:45,360 --> 00:38:48,100 chắc chắn, thanh lợi nhuận. 562 00:38:48,100 --> 00:38:52,610 Vì vậy, khi trở về quán bar, họ cần phải biết rằng nó sẽ trở lại foo mà gọi nó. 563 00:38:52,610 --> 00:39:01,360 Vì vậy, các địa chỉ trả lại là địa chỉ của các chức năng mà nó phải trở lại khi trở về chức năng. 564 00:39:01,360 --> 00:39:05,830 Lý do đó là quan trọng đối với các cuộc tấn công tràn bộ đệm là bởi vì, thuận tiện, 565 00:39:05,830 --> 00:39:09,580 hacker muốn thay đổi địa chỉ trở lại. 566 00:39:09,580 --> 00:39:14,950 Thay vì đi lại cho foo, tôi sẽ quay trở lại bất cứ nơi nào các hacker muốn tôi quay trở lại. 567 00:39:14,950 --> 00:39:17,760 Và, thuận tiện, nơi mà các hacker thường xuyên muốn quay trở lại 568 00:39:17,760 --> 00:39:22,400 là sự bắt đầu của bộ đệm mà chúng ta ban đầu đã có. 569 00:39:22,400 --> 00:39:26,170 Vì vậy, nhận thấy, một lần nữa, Little Ấn Độ. 570 00:39:26,170 --> 00:39:28,490 Thiết bị này là một ví dụ về một hệ thống nhỏ Ấn Độ, 571 00:39:28,490 --> 00:39:34,140 vì vậy một số nguyên hoặc một con trỏ được lưu trữ với các byte đảo ngược. 572 00:39:34,140 --> 00:39:38,980 Vì vậy, ở đây chúng ta thấy - là điều này? Yeah. 573 00:39:38,980 --> 00:39:45,660 Chúng ta thấy Ox80, OxC0, Ox35, OxO8. 574 00:39:45,660 --> 00:39:48,250 Nhớ các chữ số thập lục phân? 575 00:39:48,250 --> 00:39:50,640 Chúng tôi không đảo ngược các chữ số thập lục phân ở Little Ấn Độ, 576 00:39:50,640 --> 00:39:56,110 vì 2 chữ số thập lục phân tạo thành một byte duy nhất, và chúng tôi đảo ngược các byte. 577 00:39:56,110 --> 00:40:00,300 Đó là lý do tại sao chúng ta không lưu trữ, như, 80530CO8. 578 00:40:00,300 --> 00:40:07,520 Chúng tôi lưu trữ, thay vào đó, mỗi cặp 2 chữ số, bắt đầu từ bên phải. 579 00:40:07,520 --> 00:40:10,880 Địa chỉ đề cập đến địa chỉ của người bắt đầu 580 00:40:10,880 --> 00:40:15,190 của bộ đệm của chúng tôi rằng chúng tôi thực sự muốn copy vào ở nơi đầu tiên. 581 00:40:15,190 --> 00:40:19,230 Lý do đó là hữu ích là bởi vì, nếu kẻ tấn công 582 00:40:19,230 --> 00:40:24,100 xảy ra, thay vì có một chuỗi đó chỉ 583 00:40:24,100 --> 00:40:27,060 một chuỗi vô hại như thế, tên của họ hoặc một cái gì đó, 584 00:40:27,060 --> 00:40:33,900 nếu, thay vào đó, chuỗi chỉ là một số mã tùy ý 585 00:40:33,900 --> 00:40:38,610 mà đã làm bất cứ điều gì họ muốn nó để làm gì? 586 00:40:38,610 --> 00:40:45,630 Vì vậy, họ có thể - tôi không thể nghĩ ra bất kỳ mã mát mẻ. 587 00:40:45,630 --> 00:40:47,780 Nó có thể là bất cứ điều gì, mặc dù. Bất kỳ mã thảm họa. 588 00:40:47,780 --> 00:40:51,440 Nếu họ muốn, họ chỉ có thể làm một cái gì đó ở lỗi seg, nhưng điều đó sẽ là vô nghĩa. 589 00:40:51,440 --> 00:40:54,950 Họ thường làm điều đó để hack hệ thống của bạn. 590 00:40:54,950 --> 00:40:59,930 >> Rồi. Thư viện CS50. 591 00:40:59,930 --> 00:41:04,800 Này, về cơ bản, getInt, getString, tất cả những chức năng chúng tôi cung cấp cho bạn. 592 00:41:04,800 --> 00:41:10,630 Vì vậy, chúng tôi có char * string, và đó là trừu tượng mà chúng tôi gió thổi bay mất 593 00:41:10,630 --> 00:41:12,450 tại một số điểm trong học kỳ. 594 00:41:12,450 --> 00:41:18,220 Hãy nhớ rằng một chuỗi chỉ là một mảng các ký tự. 595 00:41:18,220 --> 00:41:23,240 Vì vậy, ở đây chúng ta thấy một phiên bản rút gọn của getString. 596 00:41:23,240 --> 00:41:25,920 Bạn nên nhìn lại nó để nhớ làm thế nào nó thực sự thực hiện. 597 00:41:25,920 --> 00:41:30,950 Chi tiết quan trọng là, thông báo chúng tôi nhận được một nhân vật duy nhất tại một thời điểm 598 00:41:30,950 --> 00:41:34,570 từ tiêu chuẩn trong, đó là giống như chúng ta gõ vào bàn phím. 599 00:41:34,570 --> 00:41:37,890 Vì vậy, một nhân vật duy nhất tại một thời điểm, và nếu chúng ta có quá nhiều nhân vật, 600 00:41:37,890 --> 00:41:40,580 vì vậy nếu n + 1 lớn hơn công suất, 601 00:41:40,580 --> 00:41:44,140 sau đó chúng ta cần phải nâng cao năng lực của bộ đệm của chúng tôi. 602 00:41:44,140 --> 00:41:47,780 Vì vậy, ở đây chúng tôi đang tăng gấp đôi kích thước của bộ đệm của chúng tôi. 603 00:41:47,780 --> 00:41:51,840 Và tiếp tục đi, chúng ta chèn các ký tự vào bộ đệm của chúng tôi 604 00:41:51,840 --> 00:41:56,220 cho đến khi chúng tôi nhận được một dòng mới hoặc cuối của tập tin hoặc bất cứ điều gì, 605 00:41:56,220 --> 00:41:59,380 trong trường hợp này, chúng tôi đang thực hiện với chuỗi và sau đó là getString thực 606 00:41:59,380 --> 00:42:05,120 co lại bộ nhớ, như nếu chúng ta phân bổ quá nhiều bộ nhớ nó sẽ quay trở lại và thu nhỏ một chút. 607 00:42:05,120 --> 00:42:08,830 Vì vậy, chúng ta không thấy, nhưng ý tưởng chính là 608 00:42:08,830 --> 00:42:11,960 nó có đọc trong một nhân vật duy nhất tại một thời điểm. 609 00:42:11,960 --> 00:42:17,140 Nó không thể chỉ cần đọc trong một toàn bộ điều cùng một lúc, 610 00:42:17,140 --> 00:42:19,550 vì đệm của họ là duy nhất của một kích thước nhất định. 611 00:42:19,550 --> 00:42:26,590 Vì vậy, nếu chuỗi đó nó sẽ cố gắng để chèn vào bộ đệm quá lớn, sau đó nó sẽ tràn. 612 00:42:26,590 --> 00:42:28,940 Vì vậy, ở đây chúng tôi ngăn chặn điều đó bằng cách chỉ đọc trong một nhân vật duy nhất 613 00:42:28,940 --> 00:42:33,750 tại một thời điểm và phát triển bất cứ khi nào chúng tôi cần. 614 00:42:33,750 --> 00:42:40,270 Vì vậy, getInt và các chức năng thư viện CS50 khác có xu hướng sử dụng getString 615 00:42:40,270 --> 00:42:42,310 trong việc triển khai của họ. 616 00:42:42,310 --> 00:42:45,370 Vì vậy, tôi nhấn mạnh điều quan trọng ở đây. 617 00:42:45,370 --> 00:42:49,460 Nó gọi getString để có được một chuỗi. 618 00:42:49,460 --> 00:42:51,710 Nếu getString không trả lại bộ nhớ, 619 00:42:51,710 --> 00:42:54,270 hãy nhớ rằng getString mallocs một cái gì đó, bất cứ khi nào bạn gọi getString 620 00:42:54,270 --> 00:42:57,820 bạn không nên (khó hiểu) phóng rằng chuỗi mà bạn đã nhận. 621 00:42:57,820 --> 00:43:02,870 Vì vậy, ở đây, nếu nó không malloc một cái gì đó, chúng tôi trở lại INT_MAX như chỉ là một lá cờ đó, 622 00:43:02,870 --> 00:43:05,650 hey, chúng tôi không thực sự có thể để có được một số nguyên. 623 00:43:05,650 --> 00:43:10,830 Bạn nên bỏ qua bất cứ điều gì tôi trả lại cho bạn, hoặc 624 00:43:10,830 --> 00:43:15,540 bạn không nên điều trị này như là một đầu vào hợp lệ. 625 00:43:15,540 --> 00:43:21,360 Cuối cùng, giả định rằng đã thành công, chúng tôi sử dụng sscanf với lá cờ đặc biệt, 626 00:43:21,360 --> 00:43:23,820 có nghĩa là, đầu tiên phù hợp với một số nguyên, 627 00:43:23,820 --> 00:43:26,770 sau đó kết hợp bất kỳ ký tự sau khi số nguyên. 628 00:43:26,770 --> 00:43:29,070 Vì vậy, nhận thấy chúng tôi muốn nó bằng 1. 629 00:43:29,070 --> 00:43:32,940 Lợi nhuận để sscanf bao nhiêu trận đấu nếu thực hiện thành công? 630 00:43:32,940 --> 00:43:37,010 Nó sẽ trở lại 1 nếu nó xuất hiện thành công một số nguyên, 631 00:43:37,010 --> 00:43:40,890 nó sẽ trở về 0 nếu nó không phù hợp với một số nguyên, và nó sẽ trở lại 2 632 00:43:40,890 --> 00:43:45,920 nếu nó phù hợp với một số nguyên theo sau bởi một số nhân vật. 633 00:43:45,920 --> 00:43:49,780 Vì vậy, chúng tôi nhận thấy nếu chúng ta thử lại phù hợp với bất cứ điều gì nhưng 1. 634 00:43:49,780 --> 00:43:55,230 Vì vậy, nếu chúng tôi bước vào 1, 2, 3, C, hoặc 1, 2, 3, X, 635 00:43:55,230 --> 00:43:57,400 sau đó 1, 2, 3 sẽ được lưu trữ trong các số nguyên, 636 00:43:57,400 --> 00:43:59,620 X sẽ được lưu trữ tại các nhân vật, 637 00:43:59,620 --> 00:44:06,410 sscanf sẽ trở lại 2, và chúng tôi sẽ thử lại, bởi vì chúng tôi chỉ muốn một số nguyên. 638 00:44:06,410 --> 00:44:09,810 >> Nhanh chóng thổi qua HTML, HTTP, CSS. 639 00:44:09,810 --> 00:44:15,340 HyperText Markup Language là cấu trúc và ngữ nghĩa của trang web. 640 00:44:15,340 --> 00:44:19,960 Đây là ví dụ từ bài giảng mà chúng tôi có các thẻ HTML. 641 00:44:19,960 --> 00:44:22,110 Chúng tôi có thẻ tag head, cơ thể, 642 00:44:22,110 --> 00:44:27,770 chúng ta có ví dụ về các thẻ trống mà chúng ta thực sự không có một khởi đầu và tag đóng, 643 00:44:27,770 --> 00:44:30,820 chúng tôi chỉ có liên kết và hình ảnh. 644 00:44:30,820 --> 00:44:38,480 Không có thẻ hình ảnh đóng cửa, có chỉ là một từ khóa duy nhất là hoàn thành tất cả những thẻ cần phải làm. 645 00:44:38,480 --> 00:44:41,950 Liên kết là một ví dụ, chúng ta sẽ thấy cách bạn liên kết với CSS, 646 00:44:41,950 --> 00:44:45,910 kịch bản là một ví dụ về cách bạn liên kết đến một JavaScript bên ngoài. 647 00:44:45,910 --> 00:44:53,100 Nó khá đơn giản, và hãy nhớ rằng, HTML không phải là một ngôn ngữ lập trình. 648 00:44:53,100 --> 00:44:58,250 Ở đây, nhớ làm thế nào bạn sẽ xác định một hình thức hoặc ít nhất điều này sẽ làm gì? 649 00:44:58,250 --> 00:45:01,740 Một hình thức như vậy có một hành động và một phương pháp. 650 00:45:01,740 --> 00:45:06,210 Các phương pháp bạn sẽ chỉ bao giờ thấy là GET và POST. 651 00:45:06,210 --> 00:45:09,040 Vì vậy, GET là phiên bản mà điều được đặt vào URL. 652 00:45:09,040 --> 00:45:11,680 POST là nơi mà nó không được đưa vào URL. 653 00:45:11,680 --> 00:45:18,520 Thay vào đó, bất kỳ dữ liệu từ hình thức được đưa vào ẩn hơn trong yêu cầu HTTP. 654 00:45:18,520 --> 00:45:22,390 Vì vậy, ở đây, hành động xác định nơi các yêu cầu HTTP đi. 655 00:45:22,390 --> 00:45:27,490 Nơi mà nó sẽ là google.com / search. 656 00:45:27,490 --> 00:45:32,890 Phương pháp. Nhớ sự khác nhau giữa GET và POST, 657 00:45:32,890 --> 00:45:37,200 và, chỉ nói là một ví dụ, nếu bạn muốn đánh dấu một cái gì đó. 658 00:45:37,200 --> 00:45:40,660 Bạn sẽ không bao giờ có thể đánh dấu một URL POST 659 00:45:40,660 --> 00:45:44,970 vì dữ liệu không được bao gồm trong URL. 660 00:45:44,970 --> 00:45:49,790 >> HTTP, bây giờ, là HyperText Transfer Protocol. 661 00:45:49,790 --> 00:45:54,080 Hypertext Transfer Protocol, bạn mong chờ nó để chuyển 662 00:45:54,080 --> 00:45:57,710 HyperText Markup Language, và nó. 663 00:45:57,710 --> 00:46:00,170 Nhưng nó cũng chuyển bất kỳ hình ảnh bạn tìm thấy trên mạng, 664 00:46:00,170 --> 00:46:05,400 bất kỳ tải bạn thực hiện bắt đầu như là một yêu cầu HTTP. 665 00:46:05,400 --> 00:46:10,350 Vì vậy, HTTP chỉ là ngôn ngữ của World Wide Web. 666 00:46:10,350 --> 00:46:15,610 Và ở đây bạn cần phải nhận ra điều này loại một yêu cầu HTTP. 667 00:46:15,610 --> 00:46:19,300 Đây HTTP/1.1 trên mặt chỉ nói rằng là phiên bản 668 00:46:19,300 --> 00:46:21,570 của giao thức Tôi đang sử dụng. 669 00:46:21,570 --> 00:46:25,770 Nó khá nhiều luôn luôn có được HTTP/1.1, như bạn sẽ thấy nó. 670 00:46:25,770 --> 00:46:30,110 Sau đó chúng tôi thấy rằng đây là GET, thay thế được POST, mà bạn có thể nhìn thấy. 671 00:46:30,110 --> 00:46:40,790 Và URL mà tôi đã cố gắng để truy cập vào là www.google.com/search?q = blah, blah, blah. 672 00:46:40,790 --> 00:46:44,240 Vì vậy, hãy nhớ rằng điều này, dấu hỏi q = blah blah blah, 673 00:46:44,240 --> 00:46:49,040 là các loại công cụ mà được gửi bởi một hình thức. 674 00:46:49,040 --> 00:46:51,830 Phản ứng nó có thể quay trở lại tôi sẽ giống như thế này. 675 00:46:51,830 --> 00:46:54,050 Một lần nữa, bắt đầu với các giao thức, mà là có được mà, 676 00:46:54,050 --> 00:46:59,190 tiếp theo là mã trạng thái. Ở đây nó là 200 OK. 677 00:46:59,190 --> 00:47:05,060 Và cuối cùng, trang web mà tôi thực sự yêu cầu sẽ được theo sau. 678 00:47:05,060 --> 00:47:08,210 Mã trạng thái có thể bạn có thể thấy, và bạn nên biết một vài trong số họ. 679 00:47:08,210 --> 00:47:12,770 200 OK bạn có thể nhìn thấy trước. 680 00:47:12,770 --> 00:47:17,830 403 Forbidden, 404 Not Found, 500 Internal Server Error 681 00:47:17,830 --> 00:47:22,140 thường là nếu bạn đi đến một trang web và một cái gì đó là bị hỏng hoặc tai nạn của họ mã PHP, 682 00:47:22,140 --> 00:47:24,930 trong khi đó thiết bị chúng tôi có hộp màu cam lớn 683 00:47:24,930 --> 00:47:27,830 mà đi lên và nói như thế nào, cái gì là sai, mã này không làm việc 684 00:47:27,830 --> 00:47:30,380 hoặc của xấu chức năng này. 685 00:47:30,380 --> 00:47:33,230 Thường các trang web không muốn bạn biết những gì chức năng là thực sự xấu, 686 00:47:33,230 --> 00:47:37,880 nên thay vì họ sẽ chỉ cung cấp cho bạn 500 lỗi máy chủ nội bộ. 687 00:47:37,880 --> 00:47:43,050 >> TCP / IP là 1 lớp dưới HTTP. 688 00:47:43,050 --> 00:47:47,550 Hãy nhớ rằng không có Internet bên ngoài của World Wide Web. 689 00:47:47,550 --> 00:47:52,270 Cũng giống như nếu bạn chơi một trò chơi trực tuyến mà không đi qua HTTP, 690 00:47:52,270 --> 00:47:55,740 nó sẽ thông qua một khác nhau - nó vẫn còn sử dụng Internet, 691 00:47:55,740 --> 00:47:58,900 nhưng nó không sử dụng HTTP. 692 00:47:58,900 --> 00:48:02,470 HTTP chỉ là một ví dụ về giao thức được xây dựng trên giao thức TCP / IP. 693 00:48:02,470 --> 00:48:07,820 IP có nghĩa là Internet Protocol. 694 00:48:07,820 --> 00:48:11,500 Mỗi máy tính có địa chỉ IP, họ là những nhân vật có 4 chữ số 695 00:48:11,500 --> 00:48:16,510 như 192.168.2.1, hoặc bất cứ điều gì, đó có xu hướng được một địa phương. 696 00:48:16,510 --> 00:48:23,390 Nhưng đó là mô hình của một địa chỉ IP. 697 00:48:23,390 --> 00:48:29,060 Vì vậy, DNS, Domain Name Service, 698 00:48:29,060 --> 00:48:33,410 đó là những gì dịch những thứ như google.com đến một địa chỉ IP thực tế. 699 00:48:33,410 --> 00:48:37,700 Vì vậy, nếu bạn gõ địa chỉ IP vào một URL, 700 00:48:37,700 --> 00:48:40,850 rằng sẽ mang lại cho bạn với Google, nhưng bạn có xu hướng không nhớ những điều đó. 701 00:48:40,850 --> 00:48:45,470 Bạn có xu hướng nhớ google.com thay thế. 702 00:48:45,470 --> 00:48:51,560 Điều cuối cùng chúng ta có là bến cảng, nơi này là một phần của TCP IP. 703 00:48:51,560 --> 00:48:54,880 TCP không nhiều. Hãy suy nghĩ về, như thế, bạn có trình duyệt web của bạn đang chạy. 704 00:48:54,880 --> 00:48:58,670 Có thể bạn có một số ứng dụng email đang chạy; 705 00:48:58,670 --> 00:49:02,150 có thể bạn có một số chương trình khác có sử dụng các hoạt động Internet. 706 00:49:02,150 --> 00:49:05,090 Tất cả họ cần truy cập vào Internet, 707 00:49:05,090 --> 00:49:08,100 nhưng máy tính của bạn chỉ có 1 card WiFi hoặc bất cứ điều gì. 708 00:49:08,100 --> 00:49:10,780 Vì vậy, các cảng là cách mà chúng tôi có thể chia tay 709 00:49:10,780 --> 00:49:13,550 làm thế nào các ứng dụng này có thể sử dụng Internet. 710 00:49:13,550 --> 00:49:17,230 Mỗi ứng dụng được 1 cổng cụ thể mà nó có thể nghe trên, 711 00:49:17,230 --> 00:49:19,670 và theo mặc định, HTTP sử dụng cổng 80. 712 00:49:19,670 --> 00:49:22,410 Một số dịch vụ email sử dụng 25. 713 00:49:22,410 --> 00:49:24,490 Những người thấp số có xu hướng được bảo lưu. 714 00:49:24,490 --> 00:49:29,270 Bạn thường có khả năng nhận được những cái đánh số cao hơn cho chính mình. 715 00:49:29,270 --> 00:49:32,010 >> CSS, Cascading Style Sheets. 716 00:49:32,010 --> 00:49:36,030 Chúng tôi phong cách trang web với CSS, không phải với HTML. 717 00:49:36,030 --> 00:49:38,440 Có 3 địa điểm bạn có thể đặt CSS của bạn. 718 00:49:38,440 --> 00:49:46,300 Nó có thể được nội tuyến, phong cách giữa các thẻ, hoặc trong một tập tin hoàn toàn riêng biệt và sau đó liên kết nhập 719 00:49:46,300 --> 00:49:48,470 Và đây chỉ là một ví dụ về CSS. 720 00:49:48,470 --> 00:49:50,450 Bạn nên nhận ra mô hình này, 721 00:49:50,450 --> 00:49:54,310 nơi ví dụ đầu tiên là chúng tôi đang kết hợp các từ khóa cơ thể, 722 00:49:54,310 --> 00:49:56,680 và ở đây chúng tôi đang tập trung thẻ cơ thể. 723 00:49:56,680 --> 00:50:00,420 Ví dụ thứ hai, chúng tôi phù hợp với điều 724 00:50:00,420 --> 00:50:04,740 với ID chân trang, và chúng tôi đang áp dụng một số phong cách đó. 725 00:50:04,740 --> 00:50:07,310 Chú ý rằng ID chân văn bản Canh lề bên trái, 726 00:50:07,310 --> 00:50:09,840 trong khi trung tâm cơ thể văn bản Canh lề. 727 00:50:09,840 --> 00:50:13,180 Footer là bên trong cơ thể. 728 00:50:13,180 --> 00:50:16,470 Nó sẽ, thay vào đó, text-align trái, mặc dù cơ thể nói trung tâm text-align. 729 00:50:16,470 --> 00:50:18,880 Đây là một phần tầng toàn bộ của nó. 730 00:50:18,880 --> 00:50:22,110 Bạn có thể có - bạn có thể xác định phong cách cho cơ thể, 731 00:50:22,110 --> 00:50:25,320 và sau đó mọi thứ trong cơ thể bạn có thể xác định phong cách cụ thể hơn, 732 00:50:25,320 --> 00:50:28,160 và những công việc như bạn mong đợi. 733 00:50:28,160 --> 00:50:34,420 Specifiers CSS cụ thể hơn được ưu tiên. 734 00:50:34,420 --> 00:50:46,140 Tôi nghĩ rằng đó là nó. 735 00:50:46,140 --> 00:50:49,260 >> [Ali Nahm] Hi tất cả mọi người. Nếu tôi chỉ có thể nhận được sự chú ý của bạn. 736 00:50:49,260 --> 00:50:53,990 Tôi Ali và tôi sẽ phải đi qua PHP và SQL thực sự nhanh chóng. 737 00:50:53,990 --> 00:51:00,310 Vì vậy, chúng ta có thể bắt đầu. PHP là viết tắt của PHP: Hypertext Preprocessor. 738 00:51:00,310 --> 00:51:03,730 Và như tất cả các bạn nên biết, đó là một ngôn ngữ kịch bản phía máy chủ, 739 00:51:03,730 --> 00:51:06,800 và chúng tôi sử dụng nó cho kết thúc trở lại của các trang web, 740 00:51:06,800 --> 00:51:12,540 và làm thế nào nó có rất nhiều các tính toán, phần phía sau hậu trường. 741 00:51:12,540 --> 00:51:17,510 Cú pháp. Nó không giống như C, bất ngờ, ngạc nhiên. 742 00:51:17,510 --> 00:51:22,060 Nó luôn luôn phải bắt đầu với, nếu bạn có thể thấy, - tôi không thể di chuyển về phía trước. 743 00:51:22,060 --> 00:51:31,340 Bạn có thể xem bạn cần loại mới niềng răng và sau đó bạn cũng cần php?. 744 00:51:31,340 --> 00:51:35,780 Đó là luôn luôn làm thế nào bạn có khung văn bản PHP, mã PHP của bạn. 745 00:51:35,780 --> 00:51:39,180 Vì vậy, nó không thể chỉ là như C, nơi bạn có loại đặt nó trên đầu tiên. 746 00:51:39,180 --> 00:51:42,290 Bạn cần phải luôn luôn bao quanh nó. 747 00:51:42,290 --> 00:51:47,610 Và bây giờ, cú pháp chính là tất cả các biến cần phải bắt đầu với ký tự $. 748 00:51:47,610 --> 00:51:49,490 Bạn cần phải làm điều đó khi bạn định nghĩa chúng, bạn cần phải làm điều đó 749 00:51:49,490 --> 00:51:51,860 khi bạn đang đề cập đến với họ sau này. 750 00:51:51,860 --> 00:51:56,510 Bạn luôn cần $ đó. Đó là người bạn tốt nhất của bạn, khá nhiều. 751 00:51:56,510 --> 00:52:01,690 Bạn không - không giống như C, bạn không cần phải đặt loại kiểu biến nó được. 752 00:52:01,690 --> 00:52:04,940 Vì vậy, trong khi bạn làm cần $, bạn không cần phải đặt, như, 753 00:52:04,940 --> 00:52:09,470 int x hoặc chuỗi y, vân vân, vân vân. 754 00:52:09,470 --> 00:52:11,490 Vì vậy, một sự khác biệt nhỏ. 755 00:52:11,490 --> 00:52:15,590 Là kết quả của điều này, nó có nghĩa là PHP là một loại yếu ớt. 756 00:52:15,590 --> 00:52:19,310 PHP là một ngôn ngữ kiểu cách yếu ớt, và nó đã yếu gõ biến. 757 00:52:19,310 --> 00:52:24,020 Nói cách khác, điều đó có nghĩa rằng bạn có thể chuyển đổi giữa các loại khác nhau của các loại biến. 758 00:52:24,020 --> 00:52:27,230 Bạn có thể lưu số điện thoại của 1 như một int, 759 00:52:27,230 --> 00:52:29,650 bạn có thể lưu nó như là một chuỗi, và bạn có thể lưu nó như là một float, 760 00:52:29,650 --> 00:52:33,550 và tất cả nó sẽ là số 1. 761 00:52:33,550 --> 00:52:36,080 Ngay cả khi bạn đang lưu trữ nó trong các hình thức khác nhau, 762 00:52:36,080 --> 00:52:39,120 nó vẫn còn - các loại biến vẫn đang nắm giữ cuối cùng. 763 00:52:39,120 --> 00:52:41,540 Vì vậy, nếu bạn nhìn ở đây, nếu bạn nhớ từ pset 7, 764 00:52:41,540 --> 00:52:43,500 nhiều người trong số bạn có thể đã có vấn đề với điều này. 765 00:52:43,500 --> 00:52:47,280 Hai dấu bằng, dấu bằng 3, 4 dấu bằng. 766 00:52:47,280 --> 00:52:49,990 Được rồi, không có 4 dấu bằng, nhưng có 2 và 3. 767 00:52:49,990 --> 00:52:53,320 Bạn sử dụng 2 dấu bằng để kiểm tra các giá trị. 768 00:52:53,320 --> 00:52:55,830 Nó có thể kiểm tra trên các loại. 769 00:52:55,830 --> 00:52:58,770 Vì vậy, nếu bạn có thể thấy ở ví dụ đầu tiên, 770 00:52:58,770 --> 00:53:02,210 Tôi có num_int == num_string. 771 00:53:02,210 --> 00:53:06,710 Vì vậy, int của bạn và chuỗi của bạn là cả hai, về mặt kỹ thuật, 1, 772 00:53:06,710 --> 00:53:10,790 nhưng chúng khác nhau. Nhưng đối với bình đẳng đôi, nó vẫn sẽ vượt qua. 773 00:53:10,790 --> 00:53:15,510 Tuy nhiên, đối với các bằng ba, nó sẽ kiểm tra giá trị cũng như các loại khác nhau. 774 00:53:15,510 --> 00:53:18,760 Điều đó có nghĩa rằng nó sẽ không vượt qua trong đó trường hợp thứ hai ở đây, 775 00:53:18,760 --> 00:53:22,350 nơi bạn đang sử dụng 3 dấu bằng thay thế. 776 00:53:22,350 --> 00:53:26,590 Vì vậy, đó là một sự khác biệt lớn mà bạn nên tất cả đã cho thấy bây giờ. 777 00:53:26,590 --> 00:53:31,570 >> String nối là một điều mạnh mẽ mà bạn có thể sử dụng trong PHP. 778 00:53:31,570 --> 00:53:34,080 Nó về cơ bản chỉ ký hiệu dấu chấm tiện dụng này, 779 00:53:34,080 --> 00:53:36,230 và đó là cách bạn có thể gắn dây với nhau. 780 00:53:36,230 --> 00:53:40,800 Vì vậy, nếu bạn có Cát và bạn có chó, và bạn muốn đưa 2 chuỗi với nhau, 781 00:53:40,800 --> 00:53:44,080 bạn có thể sử dụng thời gian, và đó là loại như thế nào nó hoạt động. 782 00:53:44,080 --> 00:53:46,660 Bạn cũng có thể chỉ cần đặt chúng bên cạnh nhau, 783 00:53:46,660 --> 00:53:49,030 như bạn có thể thấy ở đây trong ví dụ dưới, 784 00:53:49,030 --> 00:53:51,610 nơi tôi đã vang chuỗi 1, không gian chuỗi 2. 785 00:53:51,610 --> 00:53:56,930 PHP sẽ biết để thay thế họ như vậy. 786 00:53:56,930 --> 00:53:59,780 Mảng. Bây giờ, trong PHP, có 2 loại khác nhau của các mảng. 787 00:53:59,780 --> 00:54:03,180 Bạn có thể có mảng thông thường, và bạn cũng có thể có các mảng kết hợp, 788 00:54:03,180 --> 00:54:06,040 và chúng ta sẽ đi qua chúng ngay bây giờ. 789 00:54:06,040 --> 00:54:08,280 Mảng thông thường chỉ điều này trong C, 790 00:54:08,280 --> 00:54:11,240 và do đó bạn có các chỉ số được đánh số. 791 00:54:11,240 --> 00:54:13,160 Ngay bây giờ chúng ta chỉ cần đi để tạo ra một và đặt - 792 00:54:13,160 --> 00:54:15,500 vì vậy đây là cách chúng tôi tạo ra một mảng trống rỗng, sau đó chúng ta sẽ 793 00:54:15,500 --> 00:54:17,310 đưa vào các số chỉ số 0. 794 00:54:17,310 --> 00:54:19,200 Chúng tôi sẽ đưa số 6, giá trị 6. 795 00:54:19,200 --> 00:54:21,500 Bạn có thể nhìn thấy nó ở phía dưới đây. 796 00:54:21,500 --> 00:54:24,240 Where's - tại chỉ số số 1 chúng ta sẽ đặt giá trị số 4, 797 00:54:24,240 --> 00:54:26,720 và do đó bạn có thể thấy có một 6, có một 4, 798 00:54:26,720 --> 00:54:29,160 và sau đó là chúng tôi đang in mọi thứ, 799 00:54:29,160 --> 00:54:33,550 khi chúng tôi cố gắng và in giá trị được lưu trữ tại chỉ số số 0, 800 00:54:33,550 --> 00:54:36,900 sau đó chúng ta sẽ thấy giá trị 6 được in ra. Mát mẻ? 801 00:54:36,900 --> 00:54:40,160 Vì vậy, đó là mảng thông thường cho bạn. 802 00:54:40,160 --> 00:54:42,750 Một cách khác bạn cũng có thể thêm những điều để mảng thường xuyên tại 803 00:54:42,750 --> 00:54:44,780 là bạn chỉ có thể thêm vào cuối. 804 00:54:44,780 --> 00:54:47,240 Điều đó có nghĩa rằng bạn không cần phải xác định các chỉ số cụ thể. 805 00:54:47,240 --> 00:54:51,000 Bạn có thể xem số, và sau đó trong dấu ngoặc vuông không có chỉ số quy định. 806 00:54:51,000 --> 00:54:56,270 Và nó sẽ biết - PHP sẽ biết chỉ cần thêm nó vào cuối danh sách, ngay tại chỗ miễn phí tiếp theo. 807 00:54:56,270 --> 00:54:59,190 Vì vậy, bạn sẽ nhìn thấy 1 ngay tại đó 0 điểm, 808 00:54:59,190 --> 00:55:02,690 2 đi ngay tại chỗ đầu tiên. 809 00:55:02,690 --> 00:55:04,690 3 đi - được thêm vào đó là tốt. 810 00:55:04,690 --> 00:55:06,720 Vì vậy, loại có ý nghĩa. Bạn chỉ cần liên tục bổ sung nó, 811 00:55:06,720 --> 00:55:09,360 và sau đó khi chúng ta lặp lại các chỉ số của số 1, 812 00:55:09,360 --> 00:55:13,080 nó sẽ in ra giá trị 2. 813 00:55:13,080 --> 00:55:16,800 >> Sau đó chúng ta có mảng đó là mảng kết hợp. 814 00:55:16,800 --> 00:55:19,370 Mảng kết hợp, thay vì có các chỉ số số, 815 00:55:19,370 --> 00:55:23,630 những gì họ làm là, họ có chỉ số đó là bởi chuỗi. 816 00:55:23,630 --> 00:55:25,670 Bạn có thể thấy, thay vì - Tôi đã thoát khỏi tất cả những chỉ số số lượng, 817 00:55:25,670 --> 00:55:32,140 và bây giờ là Key1, key2, key3, và họ đang ở trong dấu ngoặc kép để cho biết rằng họ đang tất cả các chuỗi. 818 00:55:32,140 --> 00:55:34,470 Vì vậy, chúng ta có thể có một ví dụ về điều này. 819 00:55:34,470 --> 00:55:38,790 Ví dụ của việc này là chúng ta có tf, và đó là tên chỉ số. 820 00:55:38,790 --> 00:55:42,030 Chúng ta sẽ đặt "Ali" như tên gọi, ở chỉ số, lượng calo ăn, 821 00:55:42,030 --> 00:55:47,640 chúng ta có thể đặt một int thời gian này thay vì một chuỗi, 822 00:55:47,640 --> 00:55:52,240 và sau đó ở những người như chỉ số, chúng ta có thể đặt một mảng toàn bộ bên trong của nó. 823 00:55:52,240 --> 00:55:55,490 Vì vậy, đây là loại - đó là một khái niệm tương tự như cách chúng tôi đã có 824 00:55:55,490 --> 00:55:58,930 chỉ số với những con số, nhưng bây giờ chúng tôi có thể thay đổi các chỉ số xung quanh 825 00:55:58,930 --> 00:56:03,890 để họ có như các chuỗi thay thế. 826 00:56:03,890 --> 00:56:06,070 Bạn cũng có thể làm được điều này, bên cạnh việc chỉ làm nó cá nhân, 827 00:56:06,070 --> 00:56:09,400 bạn có thể làm tất cả trong một đoạn. Vì vậy, bạn có thể thấy rằng tf của mảng đó, 828 00:56:09,400 --> 00:56:13,350 và sau đó chúng tôi đặt tất cả trong một bộ khung vuông khổng lồ. 829 00:56:13,350 --> 00:56:15,220 Vì vậy, có thể đẩy nhanh tốc độ. 830 00:56:15,220 --> 00:56:19,730 Nó là nhiều hơn một sự lựa chọn phong cách hơn không. 831 00:56:19,730 --> 00:56:21,550 Chúng tôi cũng có các vòng lặp. 832 00:56:21,550 --> 00:56:26,020 Trong C chúng ta có vòng làm việc như thế này. 833 00:56:26,020 --> 00:56:29,690 Chúng tôi đã có mảng của chúng tôi, và chúng tôi đã đi từ chỉ số 0 vào cuối danh sách, 834 00:56:29,690 --> 00:56:31,740 và chúng tôi in tất cả, phải không? 835 00:56:31,740 --> 00:56:33,880 Ngoại trừ vấn đề là, cho mảng kết hợp, 836 00:56:33,880 --> 00:56:36,610 chúng tôi không nhất thiết phải biết những chỉ số số 837 00:56:36,610 --> 00:56:39,610 bởi vì bây giờ chúng tôi có các chỉ số chuỗi. 838 00:56:39,610 --> 00:56:44,800 Bây giờ chúng ta sử dụng vòng lặp foreach, trong đó, một lần nữa, bạn hy vọng được sử dụng trong pset 7. 839 00:56:44,800 --> 00:56:48,930 Vòng lặp foreach sẽ chỉ biết tất cả các phần của danh sách. 840 00:56:48,930 --> 00:56:52,450 Và nó không phải biết chính xác các chỉ số số mà bạn có. 841 00:56:52,450 --> 00:56:56,490 Vì vậy, bạn có cú pháp foreach, vì vậy nó foreach, bạn đặt mảng. 842 00:56:56,490 --> 00:57:00,430 Vì vậy, mảng của tôi được gọi là pset, và sau đó là, các từ như, 843 00:57:00,430 --> 00:57:04,530 và sau đó bạn đặt biến này địa phương tạm thời mà bạn đang sử dụng 844 00:57:04,530 --> 00:57:10,690 chỉ cho những điều cụ thể mà sẽ giữ cụ thể - 845 00:57:10,690 --> 00:57:14,770 một trường hợp hoặc một phần của mảng. 846 00:57:14,770 --> 00:57:18,350 Pset num sẽ tổ chức 1, và sau đó có thể nó sẽ giữ số 6, 847 00:57:18,350 --> 00:57:20,410 và sau đó nó sẽ giữ số 2. 848 00:57:20,410 --> 00:57:26,630 Nhưng nó đảm bảo để đi qua tất cả các giá trị duy nhất đó là trong mảng. 849 00:57:26,630 --> 00:57:30,530 Chức năng hữu ích mà bạn nên biết trong PHP là những yêu cầu, 850 00:57:30,530 --> 00:57:35,880 để đảm bảo rằng bạn đang bao gồm cả tập tin nhất định, echo, xuất cảnh, sản phẩm nào. 851 00:57:35,880 --> 00:57:40,490 Tôi khuyên bạn nên nhìn vào pset 7 và nhìn vào những chức năng. 852 00:57:40,490 --> 00:57:42,810 Bạn có thể cần phải biết những, 853 00:57:42,810 --> 00:57:47,060 vì vậy tôi chắc chắn sẽ biết những gì, chính xác, những đang làm tất cả. 854 00:57:47,060 --> 00:57:50,080 >> Và bây giờ chúng ta sẽ đi qua phạm vi thực sự nhanh chóng. 855 00:57:50,080 --> 00:57:53,490 Trong phạm vi, PHP là loại một điều sôi nổi, không giống như C, 856 00:57:53,490 --> 00:57:56,170 và vì vậy chúng tôi chỉ cần đi để đi qua nó một cách nhanh chóng. 857 00:57:56,170 --> 00:57:58,930 Vì vậy, hãy nói rằng chúng tôi bắt đầu từ đó mũi tên mà chúng tôi có ở đó. 858 00:57:58,930 --> 00:58:02,900 Và chúng ta sẽ bắt đầu với $ i. Vì vậy, các biến 'i' là có được 0, 859 00:58:02,900 --> 00:58:06,730 và chúng tôi chỉ cần đi để giữ cho in nó trong hộp lớn màu trắng ở đó. 860 00:58:06,730 --> 00:58:09,220 Chúng ta sẽ bắt đầu với i0, và sau đó chúng ta sẽ echo nó. 861 00:58:09,220 --> 00:58:12,670 Do đó, có là 0. 862 00:58:12,670 --> 00:58:15,210 Và sau đó chúng ta sẽ tăng nó bởi các vòng lặp cho, 863 00:58:15,210 --> 00:58:17,810 và sau đó nó sẽ là giá trị 1. 864 00:58:17,810 --> 00:58:20,070 Một là ít hơn 3, do đó, nó sẽ đi qua đó cho vòng lặp, 865 00:58:20,070 --> 00:58:23,230 và sau đó chúng ta sẽ thấy nó được in lại. 866 00:58:23,230 --> 00:58:25,520 Chúng ta sẽ tăng nó một lần nữa để 2, 867 00:58:25,520 --> 00:58:29,860 và 2 là ít hơn 3, do đó, nó sẽ vượt qua vòng lặp, và nó sẽ in 2. 868 00:58:29,860 --> 00:58:35,100 Sau đó, bạn sẽ lưu ý rằng 3 là không ít hơn 3, vì vậy chúng tôi sẽ thoát ra khỏi vòng lặp. 869 00:58:35,100 --> 00:58:40,050 Vì vậy, bây giờ chúng ta đã thoát, và sau đó chúng ta sẽ đi vào aFunction. 870 00:58:40,050 --> 00:58:45,010 Được rồi. Vì vậy, bạn phải lưu ý rằng biến này mà chúng tôi đã tạo ra, 871 00:58:45,010 --> 00:58:48,270 'i' biến, không địa phương scoped. 872 00:58:48,270 --> 00:58:50,280 Điều đó có nghĩa rằng nó không phải địa phương để các vòng lặp, 873 00:58:50,280 --> 00:58:58,060 và biến mà chúng ta vẫn có thể truy cập và thay đổi sau đó, và nó vẫn sẽ có hiệu lực. 874 00:58:58,060 --> 00:59:02,160 Vì vậy, nếu bạn đi vào các chức năng bây giờ, bạn sẽ thấy rằng chúng tôi cũng sử dụng 'i' biến, 875 00:59:02,160 --> 00:59:05,320 và chúng ta sẽ tăng 'i' + +. 876 00:59:05,320 --> 00:59:09,410 Bạn sẽ nghĩ rằng, lần đầu tiên, dựa trên C, rằng đó là một bản sao của 'i' biến. 877 00:59:09,410 --> 00:59:12,830 Đó là một điều hoàn toàn khác nhau, đó là chính xác. 878 00:59:12,830 --> 00:59:16,560 Vì vậy, khi chúng ta in nó, chúng ta sẽ in 'i' + +, đó là sẽ in ra rằng 4, 879 00:59:16,560 --> 00:59:19,640 và sau đó chúng ta sẽ - xin lỗi. 880 00:59:19,640 --> 00:59:22,030 Sau đó chúng ta sẽ kết thúc trong chức năng, 881 00:59:22,030 --> 00:59:24,820 và chúng ta sẽ là nơi mũi tên đó là ngay bây giờ. 882 00:59:24,820 --> 00:59:29,190 Điều đó có nghĩa rằng sau đó, tuy nhiên, mặc dù các chức năng thay đổi giá trị của 'i', 883 00:59:29,190 --> 00:59:32,620 nó không thay đổi bên ngoài của các chức năng, 884 00:59:32,620 --> 00:59:35,060 bởi vì chức năng có một phạm vi riêng biệt. 885 00:59:35,060 --> 00:59:38,960 Điều đó có nghĩa rằng khi chúng ta echo 'i', nó đã không thay đổi trong phạm vi chức năng, 886 00:59:38,960 --> 00:59:43,660 và như vậy thì chúng ta sẽ in 3 lần nữa. 887 00:59:43,660 --> 00:59:47,520 Những điều khác nhau về phạm vi trong PHP hơn trong C. 888 00:59:47,520 --> 00:59:51,130 >> Bây giờ trong PHP và HTML. 889 00:59:51,130 --> 00:59:53,510 PHP được sử dụng để làm cho các trang web động. 890 00:59:53,510 --> 00:59:58,660 Nó loại làm cho mọi thứ khác nhau. 891 00:59:58,660 --> 01:00:02,090 Chúng tôi có nó khác với HTML. 892 01:00:02,090 --> 01:00:05,230 Với HTML, chúng tôi luôn luôn chỉ có điều tĩnh, như thế nào Rob cho thấy, 893 01:00:05,230 --> 01:00:09,370 trong khi PHP, bạn có thể thay đổi mọi thứ dựa trên những người người sử dụng. 894 01:00:09,370 --> 01:00:11,830 Vì vậy, nếu tôi có điều này, tôi đã, "Bạn đang đăng nhập như là -" và sau đó tên, 895 01:00:11,830 --> 01:00:14,420 và tôi có thể thay đổi tên. Vì vậy, ngay bây giờ tên là Joseph, 896 01:00:14,420 --> 01:00:18,880 và nó có "về tôi", nhưng sau đó tôi cũng có thể thay đổi tên để có Tommy. 897 01:00:18,880 --> 01:00:21,700 Và đó sẽ là một điều khác nhau. 898 01:00:21,700 --> 01:00:23,840 Vì vậy, sau đó chúng tôi cũng có thể thay đổi những điều khác nhau về anh ấy, 899 01:00:23,840 --> 01:00:27,070 và nó sẽ hiển thị nội dung khác nhau dựa vào tên. 900 01:00:27,070 --> 01:00:31,430 Vì vậy, PHP loại có thể thay đổi những gì đang xảy ra trong trang web của bạn. 901 01:00:31,430 --> 01:00:33,540 Tương tự ở đây. Tuy nhiên, lưu ý rằng họ có nội dung khác nhau, 902 01:00:33,540 --> 01:00:38,870 ngay cả khi bạn về mặt kỹ thuật vẫn còn truy cập trang web đó trên cùng một bề mặt. 903 01:00:38,870 --> 01:00:43,450 Tạo ra HTML. Có 2 cách khác nhau mà bạn có thể làm điều này. 904 01:00:43,450 --> 01:00:48,980 Vì vậy, chúng ta sẽ đi qua ngay bây giờ. Cách thứ nhất là, bạn có - vâng, xin lỗi. 905 01:00:48,980 --> 01:00:51,150 Vì vậy bạn chỉ có thường xuyên của bạn cho vòng lặp trong PHP, 906 01:00:51,150 --> 01:00:56,270 và sau đó bạn echo trong PHP và bạn echo ra HTML. 907 01:00:56,270 --> 01:00:58,720 Sử dụng những gì Rob cho thấy bạn của kịch bản HTML 908 01:00:58,720 --> 01:01:04,030 và sau đó sử dụng in PHP để chỉ in ra trang web. 909 01:01:04,030 --> 01:01:09,520 Cách khác là để làm điều đó, nếu như bạn tách ra PHP và HTML. 910 01:01:09,520 --> 01:01:11,940 Vì vậy, bạn có thể có một dòng PHP bắt đầu cho vòng lặp, 911 01:01:11,940 --> 01:01:16,020 sau đó bạn có thể có các dòng của HTML trong một điều riêng biệt, 912 01:01:16,020 --> 01:01:19,700 và sau đó bạn kết thúc vòng lặp, một lần nữa, với một PHP. 913 01:01:19,700 --> 01:01:21,800 Vì vậy, nó loại tách nó ra. 914 01:01:21,800 --> 01:01:24,020 Ở phía bên trái, bạn có thể bạn có tất cả các - 915 01:01:24,020 --> 01:01:26,360 nó chỉ là 1 đoạn PHP. 916 01:01:26,360 --> 01:01:28,510 Bên phải bạn có thể thấy rằng bạn có một dòng của PHP, 917 01:01:28,510 --> 01:01:32,540 bạn có một dòng của HTML, và bạn có một dòng của PHP lại. 918 01:01:32,540 --> 01:01:36,870 Vì vậy, tách nó ra thành những gì họ đang làm. 919 01:01:36,870 --> 01:01:39,330 Và bạn sẽ lưu ý rằng một trong hai cách, cho cả hai, 920 01:01:39,330 --> 01:01:41,980 họ vẫn in ra các hình ảnh, hình ảnh, hình ảnh, 921 01:01:41,980 --> 01:01:44,540 để HTML mà vẫn được in cùng một cách. 922 01:01:44,540 --> 01:01:49,870 Và sau đó bạn vẫn sẽ thấy 3 hình ảnh hiển thị trên trang web của bạn. 923 01:01:49,870 --> 01:01:52,820 Vì vậy, nó là 2 cách khác nhau để làm điều tương tự. 924 01:01:52,820 --> 01:01:55,060 >> Bây giờ chúng ta có các hình thức và yêu cầu. Như Rob cho thấy bạn, 925 01:01:55,060 --> 01:01:59,400 có các hình thức HTML, và chúng tôi sẽ chỉ lướt qua này. 926 01:01:59,400 --> 01:02:02,040 Bạn có một hành động và bạn có một phương pháp, và hành động của bạn 927 01:02:02,040 --> 01:02:04,350 loại cho bạn thấy nơi bạn đang đi để gửi nó, và phương pháp này là liệu 928 01:02:04,350 --> 01:02:06,960 nó sẽ là một GET hoặc POST. 929 01:02:06,960 --> 01:02:11,220 Và một yêu cầu GET, như Rob cho biết, có nghĩa là bạn sẽ đặt nó trong một hình thức 930 01:02:11,220 --> 01:02:15,760 và bạn sẽ thấy nó như là một URL, trong khi một yêu cầu POST, bạn sẽ không nhìn thấy trong một URL. 931 01:02:15,760 --> 01:02:17,840 Vì vậy, một sự khác biệt nhỏ. 932 01:02:17,840 --> 01:02:19,950 Tuy nhiên, có một điều đó là một điều tương tự 933 01:02:19,950 --> 01:02:22,560 là POST và GET đều không an toàn. 934 01:02:22,560 --> 01:02:26,430 Vì vậy, bạn có thể nghĩ rằng chỉ vì bạn không nhìn thấy nó trong URL, 935 01:02:26,430 --> 01:02:28,790 có nghĩa là POST là an toàn hơn, 936 01:02:28,790 --> 01:02:34,420 nhưng bạn vẫn có thể nhìn thấy nó trong các tập tin cookie của bạn trong những thông tin mà bạn đang gửi. 937 01:02:34,420 --> 01:02:38,260 Vì vậy, không nghĩ về một hay khác. 938 01:02:38,260 --> 01:02:42,160 Một điều cần lưu ý là bạn cũng có biến phần. 939 01:02:42,160 --> 01:02:45,850 Các bạn sử dụng điều này trong pset 7 để có được thông tin người dùng ID của bạn. 940 01:02:45,850 --> 01:02:48,550 Những gì đã xảy ra là bạn có thể sử dụng mảng kết hợp này, 941 01:02:48,550 --> 01:02:53,310 $ _SESSION, và sau đó bạn có thể truy cập vào những thứ khác nhau 942 01:02:53,310 --> 01:02:57,720 và lưu trữ những thứ khác nhau trên các trang. 943 01:02:57,720 --> 01:03:00,750 >> Điều cuối cùng là chúng ta có SQL, Structured Query Language, 944 01:03:00,750 --> 01:03:04,360 và đây là một ngôn ngữ lập trình để quản lý cơ sở dữ liệu. 945 01:03:04,360 --> 01:03:08,220 Những gì, chính xác, là cơ sở dữ liệu? Chúng bộ sưu tập các bảng, 946 01:03:08,220 --> 01:03:10,630 và mỗi bảng có thể có các loại tương tự của các đối tượng. 947 01:03:10,630 --> 01:03:14,990 Vì vậy, chúng tôi đã có một bảng của người sử dụng trong pset tài chính của bạn. 948 01:03:14,990 --> 01:03:20,610 Và tại sao họ hữu ích? Bởi vì nó là một cách vĩnh viễn lưu trữ thông tin. 949 01:03:20,610 --> 01:03:22,840 Đó là một cách để theo dõi và quản lý việc điều 950 01:03:22,840 --> 01:03:25,890 và thực sự nhìn thấy nó trên các trang khác nhau và lưu giữ theo dõi. 951 01:03:25,890 --> 01:03:29,930 Trong khi đó, nếu bạn chỉ cần lưu trữ nó ở đó trong một khoảnh khắc ngay lập tức 952 01:03:29,930 --> 01:03:33,720 và sau đó sử dụng nó sau này, bạn sẽ không thể truy cập bất cứ điều gì mà bạn đã lưu. 953 01:03:33,720 --> 01:03:37,660 Chúng ta có 4 điều quan trọng mà chúng tôi sử dụng cho các lệnh SQL. 954 01:03:37,660 --> 01:03:40,190 Chúng tôi có lựa chọn, chèn, xóa, và cập nhật. 955 01:03:40,190 --> 01:03:42,880 Đó là thực sự quan trọng cho các bạn biết cho bài kiểm tra của bạn. 956 01:03:42,880 --> 01:03:45,990 >> Chúng tôi sẽ nhanh chóng đi qua chọn ngay bây giờ. 957 01:03:45,990 --> 01:03:48,540 Về cơ bản, bạn đang lựa chọn các hàng từ một cơ sở dữ liệu. 958 01:03:48,540 --> 01:03:52,400 Vì vậy, nếu bạn có, ngay tại đây - 959 01:03:52,400 --> 01:03:56,740 chúng ta có những 2 thứ khác nhau, và chúng tôi muốn chọn từ bảng lớp 960 01:03:56,740 --> 01:04:01,480 nơi tuyệt vời - nơi ở cột tuyệt vời giá trị là 1. 961 01:04:01,480 --> 01:04:04,460 Vì vậy, bạn có thể thấy ở đây, chúng ta có những 2 điều của tên lớp, 962 01:04:04,460 --> 01:04:08,490 CS50 và Stat110, và chúng tôi có các ID lớp và khẩu hiệu. 963 01:04:08,490 --> 01:04:13,150 Vì vậy, chúng tôi muốn chọn tất cả các thông tin đó. 964 01:04:13,150 --> 01:04:17,480 Sau đó, bạn có thể nhìn thấy bây giờ mà nó loại chọn ra các cột tuyệt vời, 965 01:04:17,480 --> 01:04:25,170 nơi tất cả các điều này là 1, và sau đó nó có lớp ID, tên lớp và khẩu hiệu mà nó có thể nhận ra. 966 01:04:25,170 --> 01:04:28,100 Làm thế nào chính xác để bạn làm điều này trong mã? Bạn phải sử dụng PHP. 967 01:04:28,100 --> 01:04:33,830 Vì vậy, đó là loại như thế nào PHP và SQL có liên quan đến nhau. 968 01:04:33,830 --> 01:04:38,130 Bây giờ chúng ta có mã của chúng tôi, và chúng ta sẽ sử dụng chức năng truy vấn của chúng tôi 969 01:04:38,130 --> 01:04:41,370 như chúng tôi đã làm trong pset 7, và chúng ta sẽ chạy các truy vấn SQL. 970 01:04:41,370 --> 01:04:43,870 Sau đó chúng ta sẽ có - 971 01:04:43,870 --> 01:04:46,280 chúng tôi luôn luôn phải kiểm tra xem hàng của ba bằng nhau nếu sai. 972 01:04:46,280 --> 01:04:49,010 Vì vậy, một lần nữa, bạn muốn kiểm tra các loại và giá trị, 973 01:04:49,010 --> 01:04:53,880 và sau đó nếu nó không hoạt động, sau đó bạn muốn xin lỗi, như thường lệ, như chúng tôi đã làm trong pset 7. 974 01:04:53,880 --> 01:04:55,870 Nếu không, bạn muốn để lặp qua tất cả mọi thứ với những tiện dụng 975 01:04:55,870 --> 01:04:59,410 foreach vòng mà chúng ta vừa đi qua. 976 01:04:59,410 --> 01:05:01,280 Bây giờ chúng ta đang lặp qua và chúng tôi đã làm cho nó qua, 977 01:05:01,280 --> 01:05:05,080 chúng ta hãy giả sử rằng truy vấn của chúng tôi trôi qua, bây giờ chúng tôi có vòng lặp foreach của chúng tôi. 978 01:05:05,080 --> 01:05:11,050 Và hàng đầu tiên nó có, vì vậy đây là liên tiếp, ngay tại đây, nó đóng hộp. 979 01:05:11,050 --> 01:05:14,010 Nó sẽ in ra tất cả các thông tin mà nó nhận được. 980 01:05:14,010 --> 01:05:18,070 Vì vậy, nó sẽ in ra ở phía dưới "Wanna Tìm hiểu HTML?" 981 01:05:18,070 --> 01:05:23,370 Sau đó nó sẽ đi đến hàng tiếp theo, bởi vì nó hoàn thành đầu tiên cho vòng lặp, 982 01:05:23,370 --> 01:05:26,510 và như vậy thì nó sẽ in ra dòng thứ hai của nó, 983 01:05:26,510 --> 01:05:32,120 mà là có được STAT110, Tìm tất cả các khoảnh khắc. 984 01:05:32,120 --> 01:05:34,290 >> Một điều cuối cùng là trên SQL lỗ hổng. 985 01:05:34,290 --> 01:05:37,300 Tôi biết David xúc động về điều này một chút trong bài giảng. 986 01:05:37,300 --> 01:05:40,730 Bạn có thể đọc này sau đó. Nó thực sự buồn cười. 987 01:05:40,730 --> 01:05:45,320 SQL Injection là một loại điều khó khăn. 988 01:05:45,320 --> 01:05:49,890 Hãy nói rằng bạn chỉ cần dính vào những biến ngay vào truy vấn của bạn, 989 01:05:49,890 --> 01:05:52,290 như bạn có thể thấy trong dòng đầu tiên. 990 01:05:52,290 --> 01:05:54,520 Vì vậy, nó có vẻ tốt đẹp, phải không? Bạn chỉ cần đưa vào tên người dùng 991 01:05:54,520 --> 01:05:58,820 và mật khẩu để truy vấn SQL của bạn, và bạn muốn gửi nó đi và nhận được bất cứ điều gì trong bảng dữ liệu của bạn. 992 01:05:58,820 --> 01:06:01,450 Điều đó có vẻ khá đơn giản. Vì vậy, cho phép nói rằng ai đó đặt trong, 993 01:06:01,450 --> 01:06:04,910 cho mật khẩu, điều này hoặc văn bản ngay tại đây - 994 01:06:04,910 --> 01:06:06,780 thực sự cần được trong hộp màu đỏ. 995 01:06:06,780 --> 01:06:11,920 Vì vậy, hãy nói rằng họ đặt mật khẩu vào - đó là những gì họ nhập. 996 01:06:11,920 --> 01:06:16,520 Vì vậy, họ đang đặt hoặc "1" = 1. 997 01:06:16,520 --> 01:06:20,880 Loại mật khẩu ngớ ngẩn để có. 998 01:06:20,880 --> 01:06:25,070 Bây giờ chúng ta chỉ cần thay thế nó trong, và bạn sẽ lưu ý rằng trong truy vấn SQL bây giờ, 999 01:06:25,070 --> 01:06:29,090 nó để đánh giá luôn luôn đúng, bởi vì bạn sẽ lưu ý rằng 1000 01:06:29,090 --> 01:06:32,240 bạn có thể truy vấn SQL chọn tất cả các thông tin này 1001 01:06:32,240 --> 01:06:35,420 hoặc bạn chỉ có thể có 1 = 1. 1002 01:06:35,420 --> 01:06:41,030 Vì vậy, đó là luôn luôn đánh giá đúng sự thật. 1003 01:06:41,030 --> 01:06:46,610 Rằng sẽ không thực sự làm việc, bởi vì điều đó có nghĩa rằng các hacker có thể đột nhập vào hệ thống của bạn. 1004 01:06:46,610 --> 01:06:49,300 Các giải pháp này là bạn phải sử dụng hệ thống PDO, 1005 01:06:49,300 --> 01:06:51,360 có nghĩa là bạn phải sử dụng dấu hỏi, 1006 01:06:51,360 --> 01:06:53,350 đó là những gì các bạn được sử dụng trong pset 7, 1007 01:06:53,350 --> 01:06:57,620 nơi bạn đang sử dụng một dấu chấm hỏi ở vị trí của nơi mà bạn muốn đặt một cái gì đó, 1008 01:06:57,620 --> 01:07:01,430 và sau đó bạn sẽ có một dấu phẩy, và sau đó bạn sẽ có sau đó, 1009 01:07:01,430 --> 01:07:07,610 sau chuỗi của bạn, các biến khác nhau mà bạn muốn thay thế vào dấu chấm hỏi của bạn. 1010 01:07:07,610 --> 01:07:10,330 Vì vậy, bạn sẽ lưu ý ở đây là bây giờ tôi có những dấu hỏi màu đỏ. 1011 01:07:10,330 --> 01:07:15,420 Sau đó tôi đặt các biến sau chuỗi của tôi vì vậy tôi biết để thay thế chúng theo thứ tự mà sau đó. 1012 01:07:15,420 --> 01:07:18,470 Điều đó sẽ đảm bảo rằng nếu có ai đó làm nó như thế này, 1013 01:07:18,470 --> 01:07:24,050 và họ có hoặc 1 = 1 tình huống, mà sẽ làm cho chắc chắn, 1014 01:07:24,050 --> 01:07:30,490 trong kết thúc trở lại, chắc chắn rằng nó sẽ không thực sự phá vỡ các truy vấn SQL. 1015 01:07:30,490 --> 01:07:33,660 Được rồi, vì vậy đó là khá nhiều đó, một cơn lốc của PHP và SQL. 1016 01:07:33,660 --> 01:07:41,520 Tốt nhất của may mắn cho tất cả các bạn, và bây giờ đến Ore 1017 01:07:41,520 --> 01:07:44,270 >> [Oreoluwatomiwa Babarinsa] Được rồi tất cả mọi người. Thời gian để đi qua một số JavaScript 1018 01:07:44,270 --> 01:07:48,840 và một số điều khác rất nhanh chóng vì vậy chúng tôi không giữ bạn đêm nay. 1019 01:07:48,840 --> 01:07:56,930 JavaScript. Vâng. JavaScript là loại một điều thú vị, tự nhận. 1020 01:07:56,930 --> 01:07:59,090 Những điều bạn thực sự cần phải biết về JavaScript, đó là loại giống như 1021 01:07:59,090 --> 01:08:03,810 phía máy khách kết thúc những gì ứng dụng web của bạn sẽ được làm. 1022 01:08:03,810 --> 01:08:08,280 Có một số điều bạn chỉ không muốn chăm sóc của tất cả các thời gian trên phía máy chủ. 1023 01:08:08,280 --> 01:08:12,880 Tất cả các tương tác nhỏ, làm nổi bật một điều, làm một cái gì đó biến mất. 1024 01:08:12,880 --> 01:08:15,340 Bạn thực sự không muốn phải nói chuyện với máy chủ của bạn tất cả các thời gian cho điều đó. 1025 01:08:15,340 --> 01:08:18,069 Và một số trong đó thậm chí không thể làm ở phía máy chủ. 1026 01:08:18,069 --> 01:08:21,899 Đây là lý do tại sao chúng ta cần một cái gì đó như JavaScript. 1027 01:08:21,899 --> 01:08:24,359 Điều thú vị về JavaScript: Đây là kiểu động. 1028 01:08:24,359 --> 01:08:27,149 Điều này có nghĩa là chương trình của bạn không cần phải biết 1029 01:08:27,149 --> 01:08:30,970 những gì, chính xác, các biến khi bạn viết nó ra. 1030 01:08:30,970 --> 01:08:34,510 Nó sẽ chỉ là loại con số nó ra như nó đang chạy. 1031 01:08:34,510 --> 01:08:37,520 Những thứ khác được mát mẻ về nó: Đó là một ngôn ngữ cú đúp xoăn, 1032 01:08:37,520 --> 01:08:41,359 có nghĩa là các cú pháp tương tự như C và PHP. 1033 01:08:41,359 --> 01:08:47,050 Bạn không cần phải làm nhiều làm lại khi bạn đang học JavaScript. 1034 01:08:47,050 --> 01:08:49,180 Ở đây chúng tôi có một chút của JavaScript. 1035 01:08:49,180 --> 01:08:52,560 Thú vị đúng ở đây là, nếu bạn nhìn vào nó, 1036 01:08:52,560 --> 01:08:56,330 chúng tôi có một chút JavaScript phải có trong thẻ đầu. 1037 01:08:56,330 --> 01:08:59,479 Những gì là không được về cơ bản chỉ bao gồm một tập tin JavaScript. 1038 01:08:59,479 --> 01:09:02,260 Đây là một cách để bạn có thể bao gồm JavaScript vào chương trình của bạn. 1039 01:09:02,260 --> 01:09:06,910 Sau đó ít thứ hai thực sự là một số JavaScript nội tuyến, 1040 01:09:06,910 --> 01:09:10,790 rất giống với một phong cách nội tuyến với CSS, 1041 01:09:10,790 --> 01:09:16,180 và bạn chỉ cần viết một số mã rất nhanh chóng có. 1042 01:09:16,180 --> 01:09:18,120 JavaScript có mảng. 1043 01:09:18,120 --> 01:09:20,850 Chỉ là một cách để giữ cho dữ liệu xung quanh, rất hữu ích. 1044 01:09:20,850 --> 01:09:25,180 Rất đẹp và dễ cú pháp. 1045 01:09:25,180 --> 01:09:29,870 Bạn sử dụng dấu ngoặc vuông để truy cập vào tất cả mọi thứ và giữ tất cả mọi thứ lại với nhau. 1046 01:09:29,870 --> 01:09:35,020 Không có gì quá phức tạp. 1047 01:09:35,020 --> 01:09:38,630 Điều thú vị về JavaScript và ngôn ngữ kịch bản nói chung 1048 01:09:38,630 --> 01:09:40,920 là bạn không phải lo lắng về kích thước mảng. 1049 01:09:40,920 --> 01:09:43,880 Bạn chỉ có thể sử dụng array.length và theo dõi nó, 1050 01:09:43,880 --> 01:09:46,960 và cũng có mảng có thể phát triển hoặc thu nhỏ khi bạn cần đến. 1051 01:09:46,960 --> 01:09:49,279 Vì vậy, bạn thậm chí không cần phải lo lắng về bất kỳ loại, 1052 01:09:49,279 --> 01:09:57,050 oh không, tôi cần phải phân bổ nhiều điều, hoặc bất cứ điều gì như thế. 1053 01:09:57,050 --> 01:10:00,090 >> Điều thú vị ở đây là JavaScript có một cái gì đó gọi là các đối tượng. 1054 01:10:00,090 --> 01:10:04,800 Nó là một ngôn ngữ hướng đối tượng, vì vậy những gì nó đã là, về cơ bản, 1055 01:10:04,800 --> 01:10:10,100 một cách để bạn có thể nhóm dữ liệu với nhau, tương tự như một cấu trúc, 1056 01:10:10,100 --> 01:10:17,280 nhưng bạn có thể truy cập vào nó như một cấu trúc hoặc một cú pháp mảng kết hợp. 1057 01:10:17,280 --> 01:10:22,520 Nó khá đơn giản và những gì bạn có thể làm với dữ liệu này là nhóm lại với nhau 1058 01:10:22,520 --> 01:10:24,810 nếu bạn có một loạt các dữ liệu có liên quan. 1059 01:10:24,810 --> 01:10:26,850 Bởi vì đó là tất cả những điều bạn cần để mô tả một chiếc xe hơi, 1060 01:10:26,850 --> 01:10:29,050 bạn không cần phải có nó trong một loạt các địa điểm khác nhau. 1061 01:10:29,050 --> 01:10:35,300 Bạn chỉ có thể dính vào 1 đối tượng trong JavaScript. 1062 01:10:35,300 --> 01:10:39,090 Như bạn đã biết, iterating là một trong những nhiệm vụ tẻ nhạt. 1063 01:10:39,090 --> 01:10:43,810 Bạn chỉ cần làm điều đó trên một lần nữa. Bạn cần phải nói chuyện với tất cả các đối tượng trong xe, 1064 01:10:43,810 --> 01:10:47,340 hoặc bạn cần phải đi qua tất cả các mục trong một danh sách hoặc một cái gì đó như thế. 1065 01:10:47,340 --> 01:10:51,770 Vì vậy, JavaScript có, tương tự như PHP, cú pháp foreach. 1066 01:10:51,770 --> 01:10:54,590 Trong trường hợp này, đó là một trong cho vòng lặp. 1067 01:10:54,590 --> 01:10:57,300 Bạn muốn sử dụng này chỉ có trên các đối tượng. 1068 01:10:57,300 --> 01:11:01,030 Có một số vấn đề xảy ra nếu bạn sử dụng này trên các mảng. 1069 01:11:01,030 --> 01:11:03,750 Nó thường là một trong những điều đó, mặc dù, đó là rất hữu ích, 1070 01:11:03,750 --> 01:11:06,590 bởi vì bạn loại bỏ rất nhiều chi phí 1071 01:11:06,590 --> 01:11:10,270 bởi vì bạn không cần phải kéo lên tất cả mọi thứ trong đối tượng của bạn bằng chính bạn. 1072 01:11:10,270 --> 01:11:12,300 Bạn không cần phải nhớ tất cả các tên quan trọng. 1073 01:11:12,300 --> 01:11:18,270 Bạn chỉ cần loại được chúng trở lại trong cú pháp này. 1074 01:11:18,270 --> 01:11:21,500 Trong đó, với cho, bạn chỉ muốn nhớ 1075 01:11:21,500 --> 01:11:27,180 rằng bạn đang nhận lại tất cả các phím, theo một cách rất giống với bảng băm. 1076 01:11:27,180 --> 01:11:30,880 Nếu bạn nhớ ra, khi bạn sẽ đặt vào một chuỗi bạn có thể nhận được một cái gì đó 1077 01:11:30,880 --> 01:11:33,840 mà có thể có một giá trị liên kết với nó. 1078 01:11:33,840 --> 01:11:36,360 Những gì bạn có thể làm với điều này là bạn có thể nói, tất cả các bên phải, 1079 01:11:36,360 --> 01:11:42,120 Tôi đặt trong một chiếc xe hơi, và tôi gọi nó là một chiếc Ferrari. 1080 01:11:42,120 --> 01:11:45,290 Vì vậy, bạn có thể đặt trong chuỗi Ferrari lại sau, và bạn có thể nhận ra điều đó. 1081 01:11:45,290 --> 01:11:50,000 Và bạn có thể làm điều đó trong vòng một, với cho trong vòng lặp. 1082 01:11:50,000 --> 01:11:53,320 Vì vậy, chỉ hơn về các đối tượng. Điều quan trọng từ này, bạn cần phải nhớ 1083 01:11:53,320 --> 01:12:00,340 là bạn có thể sử dụng các cấu trúc đối tượng như cú pháp bất cứ khi nào bạn muốn với các, 1084 01:12:00,340 --> 01:12:04,590 trừ khi những gì xảy ra để sử dụng như là một chuỗi không phải là một tên biến hợp lệ. 1085 01:12:04,590 --> 01:12:07,650 Vì vậy, nếu bạn nhìn vào đó có, chúng tôi có quan trọng với không gian. 1086 01:12:07,650 --> 01:12:12,500 Vâng, nếu bạn đã đặt object.key, không gian, với, không gian, không gian, 1087 01:12:12,500 --> 01:12:15,320 đó sẽ chỉ có ý nghĩa cú pháp. 1088 01:12:15,320 --> 01:12:22,730 Vì vậy, bạn chỉ có thể làm điều đó với loại này cú pháp khung. 1089 01:12:22,730 --> 01:12:26,520 >> Ngoài ra, JavaScript là rất phạm vi khôn ngoan để PHP. 1090 01:12:26,520 --> 01:12:29,050 Bạn có 2 cách giải quyết phạm vi. 1091 01:12:29,050 --> 01:12:31,960 Bạn không thể có var trước một biến, 1092 01:12:31,960 --> 01:12:34,060 và rằng chỉ có nghĩa là đây là toàn cầu. 1093 01:12:34,060 --> 01:12:37,050 Bạn có thể nhìn thấy nó từ bất cứ nơi nào. Thậm chí nếu bạn đã đặt điều này trong một tuyên bố nếu, 1094 01:12:37,050 --> 01:12:42,430 bất cứ nơi nào khác trong mã của bạn sau thời điểm mà bạn có thể nhìn thấy biến đó. 1095 01:12:42,430 --> 01:12:46,730 Một điều, mặc dù là với var, nó giới hạn chức năng bất cứ điều gì bạn đang nhập 1096 01:12:46,730 --> 01:12:48,870 Nếu bạn đang không ở trong một chức năng, tốt, đó là toàn cầu. 1097 01:12:48,870 --> 01:12:53,900 Nhưng nếu bạn đang ở trong một chức năng nó chỉ có thể nhìn thấy trong chức năng đó. 1098 01:12:53,900 --> 01:12:56,420 Tôi không có một ví dụ, nhưng, yeah. Đó là một trong những điều mà 1099 01:12:56,420 --> 01:12:59,900 bạn có thể quản lý những gì biến bạn muốn được toàn cầu, 1100 01:12:59,900 --> 01:13:03,810 những gì biến bạn muốn được địa phương, nhưng bạn cần phải cẩn thận về điều này, 1101 01:13:03,810 --> 01:13:06,890 bởi vì bạn không có loại hình kiểm soát hạt mịn bạn làm trong C, 1102 01:13:06,890 --> 01:13:15,820 mà nếu một cái gì đó được khai báo trong một vòng lặp, nó sẽ ở lại trong đó cho vòng lặp. 1103 01:13:15,820 --> 01:13:18,790 Điều chúng tôi thực sự quan tâm về việc sử dụng JavaScript cho là thao tác các trang web, phải không? 1104 01:13:18,790 --> 01:13:21,800 Ý tôi là, đó là lý do tại sao chúng tôi đang làm điều này. 1105 01:13:21,800 --> 01:13:23,840 >> Để làm điều đó, chúng tôi sử dụng một cái gì đó gọi là DOM. 1106 01:13:23,840 --> 01:13:25,850 Document Object Model. 1107 01:13:25,850 --> 01:13:29,430 Về cơ bản, những gì nó làm là phải mất tất cả HTML của bạn 1108 01:13:29,430 --> 01:13:34,110 và các mô hình đó vào một loạt các đối tượng được lồng vào nhau. 1109 01:13:34,110 --> 01:13:37,080 Bạn bắt đầu với một cái gì đó như thế này. 1110 01:13:37,080 --> 01:13:44,770 Bạn có, bên phải đối với tôi, một loạt các mã ra có mà là loại - 1111 01:13:44,770 --> 01:13:46,640 Bạn sẽ nghĩ rằng sẽ rất khó để thao tác, 1112 01:13:46,640 --> 01:13:48,700 bởi vì bạn muốn được phân tách thông qua một loạt các văn bản 1113 01:13:48,700 --> 01:13:52,080 và phải mảnh ngoài điều. Và những gì nếu nó không được định dạng chính xác? 1114 01:13:52,080 --> 01:13:54,880 Những điều xấu sẽ xảy ra. 1115 01:13:54,880 --> 01:13:58,140 Vì vậy, JavaScript chăm sóc này cho bạn, và bạn sẽ có được một cấu trúc dữ liệu tốt đẹp, 1116 01:13:58,140 --> 01:14:01,390 như một trong những bên trái của tôi, nơi bạn chỉ cần có một tài liệu, 1117 01:14:01,390 --> 01:14:03,530 và bên trong bạn có một cái gì đó gọi là HTML, 1118 01:14:03,530 --> 01:14:05,600 và bên trong mà bạn có một cái đầu và một cơ thể, 1119 01:14:05,600 --> 01:14:08,420 và trong đầu rằng bạn có một tiêu đề, vân vân, vân vân, vân vân. 1120 01:14:08,420 --> 01:14:11,810 Đơn giản hóa thao tác này một trang web để nó chỉ là, 1121 01:14:11,810 --> 01:14:14,190 oh, tôi chỉ muốn nói chuyện với đối tượng này. 1122 01:14:14,190 --> 01:14:21,340 Loại một cách rất tương tự như bạn sẽ nói chuyện với một đối tượng bạn đã thực hiện chính mình. 1123 01:14:21,340 --> 01:14:25,980 Như tôi đã nói, tất cả các DOM là trong đối tượng tài liệu. 1124 01:14:25,980 --> 01:14:29,290 Hoặc là nó chỉ là một nơi và sau đó bạn có thể đi bên trong nó để tìm những thứ, 1125 01:14:29,290 --> 01:14:33,880 và bạn có thể làm điều đó - đây là phong cách cũ để làm việc đó, trên đó, 1126 01:14:33,880 --> 01:14:38,130 nơi bạn làm document.getElementById, và sau đó tên, 1127 01:14:38,130 --> 01:14:42,420 và như thể bạn có thể cho biết, đây sẽ rất khó sử dụng sau một thời gian. 1128 01:14:42,420 --> 01:14:44,480 Vì vậy, có thể bạn không muốn làm điều đó. Đó là lý do tại sao chúng tôi có 1129 01:14:44,480 --> 01:14:48,760 điều tiếp theo chúng ta sẽ nói về sau này. 1130 01:14:48,760 --> 01:14:52,510 Điều quan trọng ở đây là, tất cả các bên phải, bạn có tất cả những yếu tố này, phải không? 1131 01:14:52,510 --> 01:14:56,400 Vì vậy, có lẽ tôi có thể thay đổi màu sắc của một cái gì đó khi tải trang. 1132 01:14:56,400 --> 01:14:58,380 Vì vậy những gì? Những gì nếu người dùng nhấp chuột một cái gì đó của tôi? 1133 01:14:58,380 --> 01:15:00,540 Tôi muốn nó để làm một cái gì đó thú vị khi họ nhấp một cái gì đó. 1134 01:15:00,540 --> 01:15:02,600 Đó là lý do tại sao chúng tôi có các sự kiện. 1135 01:15:02,600 --> 01:15:05,330 Bạn có thể, về cơ bản, tìm thấy bất kỳ phần tử trong DOM của bạn, 1136 01:15:05,330 --> 01:15:08,560 và sau đó nói, hey. Khi điều này tải hoặc ai đó nhấp chuột nó, 1137 01:15:08,560 --> 01:15:11,410 hoặc khi họ chuột lên nó, làm điều gì đó với nó. 1138 01:15:11,410 --> 01:15:15,330 Và những gì bạn có được, bạn có chức năng có thể xử lý việc này cho bạn. 1139 01:15:15,330 --> 01:15:17,980 Các chức năng này là xử lý sự kiện. 1140 01:15:17,980 --> 01:15:20,440 They're gì - nó chỉ là một cách nói, 1141 01:15:20,440 --> 01:15:23,500 chức năng này chỉ được thực hiện khi sự kiện này xảy ra. 1142 01:15:23,500 --> 01:15:28,070 Vì vậy, nó xử lý các sự kiện xảy ra. 1143 01:15:28,070 --> 01:15:30,810 Đây là cách bạn sẽ đặt ra một xử lý sự kiện. 1144 01:15:30,810 --> 01:15:34,750 Tôi có một số nút, và khi bạn nhấp vào nó, nó phát nổ. 1145 01:15:34,750 --> 01:15:40,560 Do đó, không nhấn nút. 1146 01:15:40,560 --> 01:15:42,910 Đây là một cách tiếp cận nó, phải không? 1147 01:15:42,910 --> 01:15:46,430 Bạn có một thẻ nút, và nhấp chuột bạn có một chuỗi mà nói, 1148 01:15:46,430 --> 01:15:50,460 oh, bằng cách này, tôi làm điều nổ này cho tôi. 1149 01:15:50,460 --> 01:15:53,990 Nếu không, nó chỉ giống như một nút thường xuyên, bạn chỉ cần thực hiện. 1150 01:15:53,990 --> 01:15:56,550 Bạn cũng có thể làm điều này một cách khác, 1151 01:15:56,550 --> 01:16:02,770 bằng cách lấy các phần tử DOM, nhưng chúng tôi sẽ tiết kiệm được sau khi chúng ta nói về jQuery. 1152 01:16:02,770 --> 01:16:07,580 >> JQuery: Đây là một thư viện mà là qua trình duyệt. 1153 01:16:07,580 --> 01:16:09,580 Bạn có thể sử dụng nó trong khá nhiều bất cứ điều gì. 1154 01:16:09,580 --> 01:16:12,090 Và nó chỉ cung cấp cho bạn rất nhiều công cụ để làm việc với. 1155 01:16:12,090 --> 01:16:15,850 Vì JavaScript, trong khi mạnh mẽ, không có tất cả các công cụ bạn cần 1156 01:16:15,850 --> 01:16:20,550 ra khỏi hộp để thực sự giải quyết một ứng dụng web mà bạn có thể muốn làm. 1157 01:16:20,550 --> 01:16:24,650 Vì vậy, nó đơn giản hóa rất nhiều thứ, cung cấp cho bạn rất nhiều chức năng 1158 01:16:24,650 --> 01:16:28,760 ra khỏi hộp mà quý vị thường sẽ phải viết cho mình, hơn và hơn và hơn nữa. 1159 01:16:28,760 --> 01:16:31,600 Và chỉ làm cho mọi thứ rất đơn giản. 1160 01:16:31,600 --> 01:16:35,780 Bạn cũng có bộ chọn, cho phép bạn đưa ra tất cả những yếu tố 1161 01:16:35,780 --> 01:16:42,800 từ DOM của bạn nhiều hơn nữa chỉ đơn giản là, thay vì phải sử dụng các chức năng cuộc gọi rất dài. 1162 01:16:42,800 --> 01:16:46,630 Thêm về các bộ chọn. Bạn có, ở đó bạn đã, chúng ta hãy nói 1163 01:16:46,630 --> 01:16:49,800 Tôi muốn có được một phần tử với ID "đá." 1164 01:16:49,800 --> 01:16:56,450 Vâng, trong jQuery, nó chỉ $ và sau đó là một chuỗi mà có một pound, và sau đó "đá". 1165 01:16:56,450 --> 01:17:01,960 Nó rất đơn giản và nhanh hơn rất nhiều so với cách truyền thống JavaScript của việc giải quyết vấn đề này. 1166 01:17:01,960 --> 01:17:06,120 Và bạn có những điều tương tự cho các lớp học và các loại nguyên tố. 1167 01:17:06,120 --> 01:17:08,140 jQuery là - một trong những tính năng thú vị là bạn có thể loại nén 1168 01:17:08,140 --> 01:17:14,350 xuống truy vấn của bạn trên DOM của bạn rất, rất nhanh. 1169 01:17:14,350 --> 01:17:18,980 Bây giờ chúng tôi đang trở lại để xử lý sự kiện, và đây là cách bạn sẽ xử lý một sự kiện trong jQuery. 1170 01:17:18,980 --> 01:17:23,090 Vì vậy, những gì chúng ta sẽ ở đây là chúng ta đang nói, tất cả các bên phải. Tôi có một thẻ script, phải không? 1171 01:17:23,090 --> 01:17:25,400 Vì vậy, tôi có nội tuyến này JavaScript. 1172 01:17:25,400 --> 01:17:27,750 Những gì chúng ta sẽ làm là chúng ta sẽ nói, tất cả các bên phải. 1173 01:17:27,750 --> 01:17:30,860 Khi tài liệu đã sẵn sàng, có nghĩa là các tài liệu đã bị nạp, 1174 01:17:30,860 --> 01:17:34,660 chúng ta sẽ đi vào chức năng đó, và chúng ta sẽ nói, tất cả các bên phải, 1175 01:17:34,660 --> 01:17:37,060 chức năng này thực sự làm cái gì khác. 1176 01:17:37,060 --> 01:17:42,320 Đó là cơ bản nói rằng, tất cả các bên phải, làm cho tôi các phần tử với ID "myid." 1177 01:17:42,320 --> 01:17:47,960 Và sau đó cung cấp cho một xử lý chức năng để thực thi khi bạn nhấp vào nó. 1178 01:17:47,960 --> 01:17:49,820 Về cơ bản điều này không là, nó nói, được rồi. 1179 01:17:49,820 --> 01:17:52,630 Các trang được tải, vì vậy tôi sẽ trong, tìm yếu tố này, 1180 01:17:52,630 --> 01:17:56,420 cung cấp cho nó xử lý sự kiện này, và nó về cơ bản thiết lập trang của bạn cho bạn. 1181 01:17:56,420 --> 01:18:00,520 Và đây là cách bạn muốn suy nghĩ về xử lý sự kiện. 1182 01:18:00,520 --> 01:18:06,310 Bạn chỉ muốn suy nghĩ về, tất cả các bên phải, khi một cái gì đó xảy ra, những gì tôi muốn xảy ra? 1183 01:18:06,310 --> 01:18:10,520 Bạn không muốn phải suy nghĩ về, được rồi, tôi cần phải chắc chắn rằng các cuộc đàm phán điều này để điều này, 1184 01:18:10,520 --> 01:18:14,660 điều này blah blah blah, bởi vì bạn chỉ muốn nói chuyện điều về sự kiện. 1185 01:18:14,660 --> 01:18:17,650 Khi điều này xảy ra, điều này xảy ra. Khi điều này xảy ra, điều đó xảy ra. 1186 01:18:17,650 --> 01:18:20,240 Và nếu mọi thứ kích hoạt những thứ khác, đó là tuyệt vời. 1187 01:18:20,240 --> 01:18:22,150 Nhưng bạn không muốn cố gắng và làm mã phức tạp 1188 01:18:22,150 --> 01:18:24,130 nơi bạn đang gây ra nhiều điều cùng một lúc, 1189 01:18:24,130 --> 01:18:28,860 bởi vì bạn chỉ cần đi để cung cấp cho mình một nhức đầu. 1190 01:18:28,860 --> 01:18:32,340 >> Rồi. Bây giờ chúng ta có thể nhận được trang của chúng tôi để xử lý các sự kiện, 1191 01:18:32,340 --> 01:18:35,640 nhưng chúng ta hãy nói người sử dụng của tôi nhấn một nút. 1192 01:18:35,640 --> 01:18:38,040 Những gì nếu tôi muốn gửi yêu cầu đó lại cho máy chủ, 1193 01:18:38,040 --> 01:18:41,100 nhưng tôi không muốn tải lại trang web, bởi vì phải tải lại một trang mới 1194 01:18:41,100 --> 01:18:44,390 mỗi lần duy nhất được loại tẻ nhạt, và tại sao tôi cần 1195 01:18:44,390 --> 01:18:47,430 để kéo xuống tiêu đề một lần nữa, và chân một lần nữa, 1196 01:18:47,430 --> 01:18:49,670 và tất cả các yếu tố của trang một lần nữa 1197 01:18:49,670 --> 01:18:53,180 chỉ để làm mới chúc mừng hoặc thời gian? 1198 01:18:53,180 --> 01:18:55,290 Vì vậy, đó là lý do tại sao chúng tôi có một cái gì đó như Ajax. 1199 01:18:55,290 --> 01:18:59,150 Những gì chúng ta có thể làm ở đây với Ajax là chúng ta có thể nói rằng, tất cả các bên phải, 1200 01:18:59,150 --> 01:19:01,290 Tôi muốn gửi một số dữ liệu đến máy chủ, 1201 01:19:01,290 --> 01:19:04,010 và tôi muốn có được một phản ứng trở lại để tôi có thể cập nhật trang của tôi, 1202 01:19:04,010 --> 01:19:12,120 hoặc có thể chỉ làm một số tính toán thuật toán mà không nhất thiết phải thể hiện bất cứ điều gì cho người dùng. 1203 01:19:12,120 --> 01:19:15,500 Những gì bạn cần để làm điều này? Vâng, bạn cần một URL mà bạn cần phải nói chuyện. 1204 01:19:15,500 --> 01:19:18,650 Máy chủ của bạn có thể không chỉ là kỳ diệu nghe từ hư không. 1205 01:19:18,650 --> 01:19:21,960 Bạn cần phải có một vị trí cụ thể mà bạn đang gửi dữ liệu này để. 1206 01:19:21,960 --> 01:19:26,240 Và bạn cũng cần một số dữ liệu để gửi, hoặc có thể đó là một truy vấn dataless. 1207 01:19:26,240 --> 01:19:31,380 Bạn chỉ muốn ping lại cho máy chủ và nói, hey, tôi còn sống, hoặc một cái gì đó như thế. 1208 01:19:31,380 --> 01:19:35,150 Và sau đó bạn muốn có một chức năng cơ bản xử lý thành công. 1209 01:19:35,150 --> 01:19:38,250 Hãy nói rằng bạn lấy lại một số thông tin từ máy chủ của bạn, 1210 01:19:38,250 --> 01:19:42,960 và bạn muốn thay đổi tiêu đề của người dùng trên trang của họ. 1211 01:19:42,960 --> 01:19:44,930 Vì vậy, bạn sẽ nhận được các thông tin trở lại, 1212 01:19:44,930 --> 01:19:48,860 và bạn sẽ đẩy đó đến màn hình. 1213 01:19:48,860 --> 01:19:51,170 Điều gì xảy ra, khi trang đã sẵn sàng, 1214 01:19:51,170 --> 01:19:56,500 bạn tạo ra một chức năng nhấp chuột vào nút này để gọi là chào mừng. 1215 01:19:56,500 --> 01:19:58,810 Điều này sau đó không có gì, khi nút đó được đẩy, 1216 01:19:58,810 --> 01:20:03,700 bạn nói chuyện với greetings.php, bạn thực hiện một yêu cầu POST, 1217 01:20:03,700 --> 01:20:07,290 và bạn nói, hey, làm cho tôi một cái gì đó từ trang của bạn. 1218 01:20:07,290 --> 01:20:09,890 Chúng tôi không thực sự cần phải mô tả đó, nhưng greetings.php, 1219 01:20:09,890 --> 01:20:12,480 chúng ta hãy chỉ nói, cho trở lại "hello thế giới." 1220 01:20:12,480 --> 01:20:15,650 Vì vậy, chúng tôi trở lại này "hello thế giới", và thành công của này, 1221 01:20:15,650 --> 01:20:20,730 giả sử không có gì sai, thì chúng ta chỉ cần đi đến nơi mục tiêu này 1222 01:20:20,730 --> 01:20:25,720 mà chúng ta quy định và chúng tôi chỉ dính vào các phản ứng trong đó. 1223 01:20:25,720 --> 01:20:31,560 Và đây là một cách rất đơn giản thiết lập một truy vấn Ajax. 1224 01:20:31,560 --> 01:20:34,340 >> Rất nhanh chóng, Rob loại đề cập này đã có, 1225 01:20:34,340 --> 01:20:37,170 điều có thể đi sai, những điều xấu có thể xảy ra, 1226 01:20:37,170 --> 01:20:42,660 vì vậy bạn muốn làm quen với các mã phản hồi HTTP. 1227 01:20:42,660 --> 01:20:46,030 Những gì đang có chỉ là, như, 200, tất cả mọi thứ đã ổn. 1228 01:20:46,030 --> 01:20:48,670 Cái gì khác, những điều xấu xảy ra. 1229 01:20:48,670 --> 01:20:50,790 Đó là nói chung là điều bạn muốn ghi nhớ. 1230 01:20:50,790 --> 01:20:53,440 Nhưng nó là tốt đẹp để biết tất cả các. 1231 01:20:53,440 --> 01:20:55,970 Và cuối cùng, một khi chúng ta đã trải qua tất cả điều đó, 1232 01:20:55,970 --> 01:20:58,680 chúng ta cần phải nói chuyện rất nhanh chóng về thiết kế, 1233 01:20:58,680 --> 01:21:00,620 và sau đó chúng ta có thể cho tất cả các bạn để lại. 1234 01:21:00,620 --> 01:21:03,410 Thiết kế. Những điều bạn muốn ghi nhớ. 1235 01:21:03,410 --> 01:21:06,950 Hãy tự hỏi mình những câu hỏi: Ai sẽ sử dụng điều này? 1236 01:21:06,950 --> 01:21:09,580 Những gì họ sẽ được sử dụng nó cho? Những gì người dùng của tôi quan tâm? 1237 01:21:09,580 --> 01:21:11,750 Họ không quan tâm những gì về? 1238 01:21:11,750 --> 01:21:14,500 Bạn chỉ không muốn làm cho một ứng dụng và để cho nó chỉ phát triển 1239 01:21:14,500 --> 01:21:18,270 và trở thành khổng lồ này, tất cả tốn điều mà bạn thậm chí không thể hoàn thành. 1240 01:21:18,270 --> 01:21:23,900 Bạn muốn có những mục tiêu riêng biệt, kế hoạch và những điều bạn muốn để giải quyết. 1241 01:21:23,900 --> 01:21:29,000 Làm cho nó dễ dàng. Tất cả điều này cho biết, về cơ bản, 1242 01:21:29,000 --> 01:21:34,950 làm cho nó dễ dàng cho người dùng sử dụng nó, không làm cho nó một đốm khổng lồ của văn bản như slide này là, trên thực tế. 1243 01:21:34,950 --> 01:21:38,020 Bạn chỉ muốn nó được một cái gì đó mà nó rất dễ dàng cho người vào trong 1244 01:21:38,020 --> 01:21:40,800 và làm những gì họ muốn làm. 1245 01:21:40,800 --> 01:21:42,920 Bạn không muốn họ phải di chuyển 5 trang 1246 01:21:42,920 --> 01:21:45,460 để có được chức năng chính của trang web của bạn. 1247 01:21:45,460 --> 01:21:49,290 Nếu Google có 5 trang trước khi bạn có thể tìm kiếm một cái gì đó, 1248 01:21:49,290 --> 01:21:53,080 không ai có thể sử dụng nó. 1249 01:21:53,080 --> 01:21:55,890 Và cuối cùng, mẫu giấy, nhóm tập trung. 1250 01:21:55,890 --> 01:21:59,220 Có thiết kế tốt và thực hành thử nghiệm. 1251 01:21:59,220 --> 01:22:00,730 Chỉ vì bạn nghĩ rằng nó làm việc cho bạn, 1252 01:22:00,730 --> 01:22:04,860 không có nghĩa là bất cứ ai khác nghĩ rằng nó hoạt động. 1253 01:22:04,860 --> 01:22:14,490 Nhưng yeah, đó là nó. 1254 01:22:14,490 --> 01:22:17,490 [CS50.TV]