[Đánh giá: Câu hỏi 1] [Ali Nahm, Oreoluwa Barbarinsa, Lucas Freitas, Rob Bowden] [Đại học Harvard] [Đây là CS50.] [CS50.TV] [Lucas Freitas] Chào mừng tất cả mọi người. Đây là đánh giá cho bài kiểm tra 1. 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 nhiều tài liệu càng tốt, nhưng điều đó không có nghĩa là chúng ta sẽ bao gồm tất cả những điều đó có thể là trong bài kiểm tra 1. 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ể. Bài kiểm tra 1 là có được vào ngày thứ Tư, thứ tư tới. 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 liên quan đến định dạng của nó, nhưng nó có thể sẽ khó khăn hơn nhiều. Ít nhất, năm ngoái khi tôi đã 50 tuổi, tôi nghĩ đó là khó khăn hơn nhiều. Vì vậy, nghiên cứu rất nhiều. Tôi sẽ bao gồm cấu trúc dữ liệu và mã hóa Huffman. Đây là điều mà rất nhiều người nghĩ là phức tạp, nhưng tôi sẽ cố gắng để làm cho nó dễ dàng như có thể. 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à 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. Điều đó có nghĩa rằng bạn không cần phải thực sự thực hiện một bảng băm trong bài kiểm tra của bạn 1. 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 để làm cho bạn thực hiện một số chức năng, 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ứ. 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 và cũng là bạn có thể mã trong C, 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. Và cũng có thể xem lại con trỏ và cấu trúc, bởi vì chúng xuất hiện rất nhiều trong các cấu trúc dữ liệu. Đầ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, nhưng sự khác biệt giữa một danh sách liên kết và một mảng, đầ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, 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, để 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 đó, hoặc bạn phải sử dụng malloc để có một chiều dài linh hoạt của mảng. Trong danh sách liên kết nó rất dễ dàng để chỉ nhận được nhiều yếu tố, đưa nhiều yếu tố trong danh sách liên kết hoặc loại bỏ các yếu tố. 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, 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, nên O (1) thời gian, vì vậy nó rất thuận tiện. Bạn chỉ cần cẩn thận để luôn luôn nhớ đến malloc và miễn phí các nút, chỉ bởi vì nếu bạn không, bạn sẽ có rò rỉ bộ nhớ. 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 ở đó. 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. Vì vậy, nếu bạn muốn lưu trữ một chuỗi, nó tốt. 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. Tôi chỉ cần đặt int n cho các ví dụ ở đây. Và bạn có một con trỏ đến nút tiếp theo. 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. Nếu đó là yếu tố cuối cùng trong danh sách liên kết, nó sẽ trỏ đến NULL. Vì vậy, đây là một ví dụ về một danh sách liên kết. Đượ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. Đầu tiên, một chèn chức năng sẽ có kiểu void bởi vì tôi không muốn quay trở lại bất cứ điều gì. Và tôi sẽ có một int như một tham số, bởi vì tôi muốn biết những gì tôi muốn chèn. 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, vì vậy đó là những dòng đầu tiên. 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. 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 trong lớp học, chúng tôi luôn đặt đầu như là một biến toàn cầu. Vì vậy, những gì chúng ta có thể làm là thay đổi người đứng đầu. Tôi có thể làm cho nút mới này là người đứng đầu mới, và nó sẽ chỉ cho người đứng đầu trước đó. 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 là thay đổi 'n' trong nút mới vào giá trị, đã được thông qua với chức năng. Sau đó newnode tiếp theo sẽ là người đứng đầu. Người đứng đầu sẽ được newnode. Vì vậy, nó khá đơn giản. Để xóa một nút, chúng ta có thể làm điều đó như thế - Một trong những cách chúng ta có thể làm điều đó là để nói, không sao, nếu tôi muốn xóa, ví dụ, 3, những gì tôi có thể làm là chỉ cần điểm nút trước đến nút tiếp theo của 3. Vì vậy, tôi chỉ có thể làm một cái gì đó như thế. Nhưng vấn đề với việc đó là gì? 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. Vấn đề với đó là tôi sẽ không có khả năng giải phóng nút đó. Tôi sẽ có rò rỉ bộ nhớ và (khó hiểu) là sẽ ghét tôi. 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. Vì vậy, tôi đặt tạm thời. Nó sẽ trỏ đến nút mà tôi muốn xóa. Và sau đó tôi có thể di chuyển các nút trước để trỏ đến nút tiếp theo của nút mà tôi muốn xóa. Và cuối cùng, tôi có thể giải phóng con trỏ. Tôi phải làm để giải phóng con trỏ mà tôi tạo ra ở đó? Tôi không phải, chỉ vì - sự khác biệt là nút này được tạo ra bằng cách sử dụng malloc, 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. Vì vậy tôi không cần phải giải phóng nó. Rồi. Vì vậy, bây giờ chúng ta hãy nói về ngăn xếp. Ngăn xếp là khá đơn giản. Chúng tôi đã ngăn xếp và hàng đợi trong lớp chỉ sử dụng các mảng, nhưng bạn nên quen thuộc - chỉ cần lưu ý 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. Vì vậy, nếu bạn có một mảng, những gì sẽ là một chồng? Một đống, đầu tiên, sẽ phải có một kích thước. Bạn có để lưu trữ kích thước của stack mà bạn có ngay bây giờ là gì. Và cũng có thể bạn sẽ có một mảng, trong trường hợp này các con số, nhưng nếu bạn muốn, nó có thể là một mảng 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ữ. Về chồng: Sự khác biệt giữa một chồng và một danh sách liên kết 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. Nó được gọi là cuối cùng, ra trước. Cũng giống như bạn có một chồng khay, nếu bạn đặt một khay trên cùng của ngăn xếp, bạn phải loại bỏ khay đầu tiên được tiếp cận với các khay khác. Đó là điều tương tự với ngăn xếp. 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ì? Nó được gọi là đẩy, và nó khá đơn giản. Điều đầu tiên bạn phải làm là kiểm tra xem kích thước của stack không phải là lớn hơn hoặc bằng năng lực của chồng. 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. Và sau đó nếu không, bạn chỉ cần thêm phần tử vào stack. Và cuối cùng, tăng kích thước. Vì vậy, nó khá đơn giản. Vì vậy, tôi chỉ cần thêm số 2. Và nếu tôi muốn bật, có nghĩa là tôi muốn loại bỏ yếu tố cuối cùng đã được thêm vào và trả về giá trị của các yếu tố, đ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. Bởi vì nếu nó trống rỗng, tôi không thể trở về bất cứ điều gì. Trong trường hợp đó, tôi trở về -1. Nếu không, tôi sẽ giảm các kích thước của spec, và trở về con số (s.size). Tại sao tôi lại giảm các kích thước và sau đó trở về s.size? Đó là bởi vì, trong trường hợp này, spec có kích thước 4, và tôi muốn trở lại các yếu tố thứ tư, phải không? Nhưng chỉ số của phần tử thứ tư là gì? Ba. 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) bởi vì nó là 3. Vì vậy, nó chỉ là chỉ số. Bây giờ hàng đợi. Hàng đợi được khá nhiều điều tương tự. Sự khác biệt duy nhất là thay vì cuối cùng, ra trước, bạn có đầu tiên, ra trước. Có lẽ nếu bạn đang chờ đợi để đi đến một buổi hòa nhạc, 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. Là người cuối cùng đến sẽ là người đầu tiên vào buổi hòa nhạc. Có thể bạn sẽ không được hạnh phúc. Trong hàng đợi, là người đầu tiên để có được trong cũng là người đầu tiên để nhận ra. 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, 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. Vì vậy, yếu tố đầu tiên ngay bây giờ. Enqueue là điều tương tự như đẩy cho ngăn xếp. Nếu bạn đã rất ngây thơ, bạn sẽ chỉ nói, 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. Tôi chỉ có thể kiểm tra nếu nó không vượt quá khả năng này. 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 và sau đó tăng kích thước. Nhưng tại sao điều này là sai? Hãy xem ví dụ này. Tôi đang cố gắng để enqueue một loạt các công cụ, và sau đó tôi sẽ dequeue và enqueue. Có rất nhiều các lệnh, nhưng nó rất đơn giản. Tôi sẽ enqueue 5, do đó, thêm 5, và sau đó 7, 1, 4, 6, và sau đó tôi muốn một cái gì đó dequeue, có nghĩa là tôi sẽ loại bỏ các yếu tố đầu tiên. Vì vậy, tôi sẽ loại bỏ các số 3, phải không? Yếu tố đầu tiên. Được rồi. Bây giờ nếu tôi cố gắng để enqueue cái gì khác, điều gì sẽ xảy ra? Theo thực hiện của tôi, Tôi sẽ đưa số tiếp theo trong chỉ số q.size. Trong trường hợp này, kích thước là 8, do đó, các chỉ số 8 sẽ được quyền ở vị trí cuối cùng. 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 với số 1, đó là hoàn toàn sai. Những gì tôi muốn làm là bọc xung quanh và đi đến vị trí đầu tiên. Có thể bạn sẽ chỉ nói, tốt, tôi chỉ phải kiểm tra nếu tôi thực sự có thể đặt một cái gì đó ở đó. Nếu không, tôi chỉ nói, oh, công suất mới thực sự là lực - 1, và bạn không thể đặt một yếu tố đó. Nhưng vấn đề là gì? Vấn đề là nếu tôi chỉ dequeue tất cả mọi thứ ở đây và sau đó tôi cố gắng thêm một cái gì đó khác, nó chỉ nói: tốt, bạn đều rất sung sức, mà là 0. Vì vậy, hàng đợi của bạn đã biến mất. Bạn có để bọc xung quanh, và một cách để gói xung quanh 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. Bạn có thể thử nó ở nhà để hiểu lý do tại sao bạn sẽ làm gì q.size + q.head khả năng mod, nhưng nếu bạn kiểm tra ngay tại đây, chúng ta có thể thấy rằng nó hoạt động. Vì vậy, trong ví dụ cuối cùng, q.size là 8 và người đứng đầu là 1, vì đó là vị trí này đây của mảng. Vì vậy, nó sẽ là 8 + 1, 9. Mod suất 9 sẽ là 0. Nó sẽ đi đến chỉ số 0. Chúng tôi sẽ được ở vị trí bên phải. Và sau đó thử hàng đợi ở nhà. 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. Ở nhà, cố gắng để có được rất quen thuộc với thực hiện enqueue, dequeue, đẩy và pop. Và cũng hiểu khi bạn sẽ sử dụng mỗi người. Vì vậy, hãy thư giãn trong 10 giây với một loạt các Pokemon. Và bây giờ chúng ta hãy quay trở lại cấu trúc dữ liệu. Băm bảng. Rất nhiều người đã sợ hãi của bảng băm. trong vấn đề thiết lập 6, Spell Checker. Bảng băm và cố gắng, rất nhiều người dân sợ hãi của họ. Họ nghĩ rằng họ rất khó hiểu. Yeah? [Rob Bowden] Vấn đề đặt 5. Vấn đề thiết lập 5, yeah. Nhờ Rob. Yeah. Sáu là Huff n 'Puff, yeah. 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ử. 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. 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. Sự khác biệt duy nhất giữa một mảng và một bảng băm là trong bảng băm bạn có một cái gì đó gọi là một hàm băm. Một hàm băm là gì? Tôi không biết nếu các bạn có thể đọc ở đây. Đây là một ví dụ về một bảng băm. Vì vậy, bạn có thể thấy rằng bạn có một mảng với 31 yếu tố. Và những gì chúng ta làm trong một bảng băm là có một hàm băm có nghĩa là sẽ dịch một chìa khóa, mỗi int đến một chỉ số. Nếu, ví dụ, nếu tôi muốn chọn cho B. Harrison, Tôi sẽ đưa B. Harrison trong hàm băm của tôi, và hàm băm sẽ trở lại 24. Vì vậy, tôi biết rằng tôi muốn để lưu trữ B. Harrison trong 24. 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. 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 nơi để lưu trữ các dữ liệu mà bạn muốn lưu trữ. Cho các chức năng băm, bạn muốn tìm một hàm băm đó là xác định và được phân phối. 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 thay vì sử dụng 31 và 30 và 29, tất cả đều miễn phí. 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. Khi chúng ta nói tốt phân phối, nó có nghĩa là chúng ta muốn có, khoảng, ít nhất 1 hoặc 2 cho mỗi - như, một sự khác biệt của 1 hoặc 2 cho mỗi chỉ số trong mảng. 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. 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. Sau đó cây. Đây là một cây. Cây trong khoa học máy tính là lộn ngược đối với một số lý do. Vì vậy, ở đây bạn có thư mục gốc của cây và sau đó lá. Bạn chỉ cần biết các danh mục cho phụ huynh và trẻ em. Mỗi nút có con của nó, đó là các nút mà dưới đây cha mẹ. Vì vậy, ví dụ, 2 là có được phụ huynh cho 3 và cho đứa trẻ khác phải có, trong khi 3 là có được cha mẹ cho 1 và những đứa trẻ khác đang có. Và 1 là có được con 3, và như vậy. 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, trong đó tất cả các giá trị trên bên phải của một nút sẽ được ở bên phải, ngay tại đây - phải, sẽ lớn hơn các yếu tố trong thư mục gốc. 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 sẽ được lớn hơn 5, và bên trái tất cả các yếu tố sẽ được ít hơn 5. Tại sao điều này hữu ích? Vâng, nếu tôi muốn kiểm tra xem số 7 là ở đây, ví dụ, 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? Nó lớn, vì vậy tôi biết nó sẽ có được trên bên phải của cây. Vì vậy, tôi có ít nhiều thứ để xem xét. 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, để int n, bạn cũng có thể có một chuỗi hoặc bất cứ điều gì bạn muốn. 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. Vì vậy, nếu bạn đã có chuỗi, ví dụ, bạn có thể xác định 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, bên trái sẽ có độ dài thấp hơn, do đó, nó thực sự vào bạn. Làm thế nào tôi có thể thực hiện tìm cho BST? Đ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. Nếu đó là NULL, có nghĩa là điều không có bởi vì bạn thậm chí không có một cây, phải không? Vì vậy, tôi trả về false. Nếu không, tôi sẽ kiểm tra xem số lượng lớn hơn giá trị trong thư mục gốc. Tôi sẽ cố gắng tìm các phần tử bên phải của cây. Bạn thấy rằng tôi đang sử dụng đệ quy ở đây. Và sau đó nếu nó ít hơn, tôi sẽ nhìn vào bên trái. Và cuối cùng, nếu không, nếu nó không phải là ít hoặc không lớn, nó có nghĩa rằng đó là giá trị của chính nó. Vì vậy, tôi chỉ trả lại sự thật. Bạn có thể thấy ở đây mà tôi sử dụng nếu, nếu, nếu. 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, và bạn đã dự định tìm thấy sự kém hiệu quả, và sự thiếu hiệu quả là bạn sử dụng nếu. 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. 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? Có ai - vậy sao? [Nói sinh viên, không nghe được] Cái đó thật tuyệt hảo. Vì vậy, cô ấy nói rằng nó không quan trọng, chỉ vì sự thiếu hiệu quả mà chúng tôi đã có trước là bởi vì, có lẽ nếu một số điều kiện được thỏa mãn, 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. 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. Vì vậy, bạn không cần phải sử dụng nếu người nào khác. Và cuối cùng, chúng ta hãy nói về cố gắng, đó là yêu thích của mọi người. Một thử là một cây của mảng. Nó rất nhanh để tìm kiếm giá trị, nhưng nó sử dụng rất nhiều bộ nhớ. Và nó thường là để lọc từ ngữ, vì vậy khi bạn 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 và bạn muốn để có thể gõ B và chỉ có tên của những người có B. Nó rất dễ dàng để thực hiện điều đó bằng cách sử dụng một thử, ví dụ. Làm thế nào để bạn xác định một nút trong một thử? Bạn chỉ cần có một bool có nghĩa là sẽ được is_word. Đạ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 đó, bạn đã có thể tạo thành một từ, và sau đó bạn sẽ có một mảng của con trỏ đến nút. 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? 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ả, chúng tôi có một mảng của 27 yếu tố, 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. 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. Được rồi. Vì vậy, đây là một ví dụ về một thử. 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ố có 2 con trỏ đến NULL, vì vậy tôi chỉ cần đặt 'a' và 'b'. Và tôi sẽ có một bool nói rằng is_word. Nó sẽ là sai lầm cho người đầu tiên, chỉ vì, trước đó bạn không có bất kỳ ký tự. Vì vậy, một từ trống rỗng không phải là một từ. Vì vậy, nó là sai. 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ì? Tôi sẽ chỉ phải malloc một nút mới cho 'a', và sau đó thêm từ của nó đúng sự thật. Vì vậy, nó chỉ đại diện cho rằng có 'a' là có được sự thật. Có ý nghĩa? Sau đó, nếu tôi muốn thêm 'ba', tôi sẽ phải malloc 1 cho 'b', và sau đó tôi sẽ thiết lập boolean false, vì 'b' tự không phải là một từ. Sau đó tôi sẽ malloc một số khác cho 'a', do đó, 'ba', và sau đó tôi sẽ thiết lập nó là một từ đúng sự thật. Vì 'ba' là một từ. Và sau đó nếu tôi muốn xem nếu 'b' là trong từ điển này, 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. Vì vậy, nó không phải là một từ. Nếu tôi muốn kiểm tra 'ba', 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? Rất nhiều người bị lẫn lộn bởi cố gắng. Không? Cuối cùng, Huffman mã hóa. Huffman mã hóa là rất hữu ích để tiết kiệm bộ nhớ và nén tập tin văn bản, chỉ vì rất nhiều lần bạn sử dụng 'a' và 'e', ​​ví dụ, 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. Có chỉ 1 byte cho mỗi nhân vật duy nhất, 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, chỉ vì có một số nhân vật mà bạn sử dụng nhiều hơn nữa, vì vậy bạn có lẽ nên sử dụng ít bộ nhớ cho những người. Làm thế nào để sử dụng mã hóa Huffman? Chúng ta phải làm một cây Huffman.  Một cây Huffman có các nút có một biểu tượng có nghĩa là sẽ được như thế, 'a', 'b', 'c', bức thư, 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, mà bạn đã tạo ra cây Huffman cho, và sau đó một nút có nghĩa là sẽ chỉ ở bên trái của cây Huffman 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. Làm thế nào để bạn xây dựng một cây Huffman? Bạn sẽ chọn 2 nút có tần số thấp nhất. Nếu bạn có một chiếc cà vạt bạn sẽ chọn 2 nút có các giá trị ASCII thấp nhất là tốt. Sau đó, bạn sẽ tạo ra một cây mới ra khỏi những 2 nút có nghĩa là sẽ có tần số kết hợp trong nút cha. Và sau đó bạn sẽ loại bỏ 2 trẻ em từ rừng và thay thế chúng với phụ huynh. Và bạn sẽ lặp lại điều đó cho đến khi bạn chỉ có 1 cây trong rừng. 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. 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. 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ố. 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'. Vì vậy, nó đây. Tần số của các cặp sẽ có 2 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'. Và sau đó tôi có tất cả trong số đó là - có một tần số 2. 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? 'A' và 'L'. Vì vậy, tôi tạo ra các nút mới, và cuối cùng, đó là 4 và 2, do 2 sẽ là bên trái. Và đây là cây Huffman. Sau đó nếu tôi muốn viết một số văn bản, 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. 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, Mà sẽ đại diện là gì? Vì vậy, như 1, 1, do đó bên phải,, và sau đó 0, do đó để lại sẽ là L, và sau đó 1, 0, 0. Vì vậy, 1, 0, vì vậy chỉ cần 1, 0, 'A'. Và sau đó 0, 1, do đó, 'Z'. Và sau đó 1, 0, 0 - không có. 0, 0 sẽ là 'Y', vì vậy lười biếng. Vì vậy, đó là tất cả đối với tôi, Rob sẽ đi qua. [Rob Bowden] Vì vậy, tuần 7 công cụ. Chúng tôi đã có rất nhiều để đi qua rất nhanh. Nhà khai thác bitwise, lỗi tràn bộ đệm, Thư viện CS50, sau đó HTML, HTTP, CSS. Tất cả trong như 15 đến 20 phút. Nhà khai thác bitwise. Có 6 trong số họ mà bạn cần biết. Bitwise và phép toán hay, XOR, thay đổi trái, chuyển quyền, và không. Phải thay đổi và không chỉ thấy trong bài giảng ở tất cả. 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. Hãy nhớ rằng các nhà khai thác Bitwise giống như khi bạn làm 3 + 4. Bạn không phải đối phó với nhị phân của 3 và 4. 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. 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, và tất cả nó là lật tất cả các bit. 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ó như ~ 11011 hoặc bất cứ điều gì, bạn sẽ viết nó như ~ 4, và sau đó nó sẽ lật biểu diễn nhị phân của 4. 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. Như tôi đã nói đó, việc sử dụng thường xuyên này, 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ố nơi tất cả các bit là 1, ngoại trừ một trong số họ. Vì vậy, nó thường dễ dàng hơn để diễn tả số nơi chỉ là chút được thiết lập, 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 đó. Vì vậy, đó là những gì chúng ta sẽ sử dụng nhiều hơn một chút. Đảo bit hoặc. Dưới đây là 2 số nhị phân, và những con số 2 là khá đại diện, vì chúng đại diện cho mỗi thể sự kết hợp của các bit bạn có thể cần để hoạt động trên. Ở đây, khi tôi or'd mỗi bit, chúng ta chỉ cần đi để so sánh thẳng xuống. Vì vậy, ở phía bên trái có một 1 và 1. Khi tôi bitwise | những gì tôi sẽ nhận được? Một. Sau đó bitwise | 0 và 1 sẽ cung cấp cho tôi? Một. Bitwise 1 và 0 là có được điều tương tự, một. Bitwise 0 | 0 sẽ cung cấp cho tôi 0. 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. Và bạn có thể nghĩ rằng chỉ như ORS logic của bạn. 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. Vì vậy, đúng hay đúng là sự thật; đúng hay sai là đúng. 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. Dưới đây là ví dụ mà bạn nên biết là một ví dụ khá tốt khi các nhà khai thác bitwise được sử dụng. Ở đây nếu chúng ta vốn 'A' với Ox20, 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ì đó. 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ì đó. Vì vậy, hãy kéo lên bảng ASCII. Được rồi. Ở đây chúng ta thấy rằng 'A' - ở đây chúng tôi có 'A' là số thập phân 65. Nhưng tôi sẽ đi với hệ thập lục phân, đó là Ox41. Đẹ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 rằng nó rất dễ dàng để chuyển đổi từ hệ thập lục phân sang nhị phân. Vì vậy, ở đây, nếu tôi muốn đặt 4 thành nhị phân, đó chỉ là sẽ 0100. Đây là 1 của địa điểm, vị trí của 2, nơi 4, vì vậy đây là 4. Sau đó, tôi có thể chia 1 thành nhị phân, mà là có được 0001. Và vì vậy đây sẽ là đại diện của 'A' trong hệ nhị phân. Dùng chữ thường 'a', nó bây giờ sẽ là Ox61, nơi, tách các thành nhị phân của nó, do đó, một 6 - Chúng ta hãy thực sự làm điều đó - là không có tẩy? Tẩy. Ox61. Vì vậy, chia 6 thành nhị phân sẽ là 0 + 4 + 2 + 0. Và tách 1 sẽ là 0001. Nhìn vào sự khác biệt giữa 2, 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. Vì vậy, trở lại đây - được. Trở lại đây, nếu chúng ta nhìn vào những gì các Ox20 bit, để tách Ox20 vào nhị phân của nó, là 0010, 0000. Ox20, các bit được thiết lập là bit này mà chúng tôi đang quan tâm đến, với chuyển đổi giữa vốn và chữ thường 'a'. Nếu tôi hoặc 'A', mà là một trong những điều này, 'A', nếu tôi hoặc 'A' với Ox20, những gì tôi sẽ nhận được? [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. Và nếu tôi hoặc 'a' với Ox20, những gì tôi sẽ nhận được? Chữ thường một, bởi vì chỉ Oring 'a' với Ox20, 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. Vì vậy, chúng tôi nhận được 'a' và 'a'. Đả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. Ở phía bên trái chúng ta có thật sự & thật. Nó sẽ là đúng, và cho tất cả các trường hợp, sai và đúng hay sai sự thật và hay sai và sai, không ai trong số những điều đó là sự thật. Vì vậy, những gì chúng tôi sẽ nhận được là 1000. 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, nơi chúng tôi đã có Ox20. Vì vậy, đây là Ox20. Bây giờ những gì tôi muốn làm, bitwise ~ của Ox20. Có nghĩa là sẽ lật tất cả các bit. Vì vậy, tôi có 1101, 1111. Và do đó, 'A' ANDed với ~ Ox20 sẽ cung cấp cho tôi những gì? 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, Kể từ đó, nếu tất cả các bit này được thiết lập để 1, sau đó chúng ta sẽ có được chính xác những gì 'A' là, ngoại trừ, có thể, những gì bit này là. Bởi vì nếu đó là một 1, bây giờ nó sẽ được thiết lập để 0, bởi vì bất cứ điều gì đây là, ANDed với điều này là có được 0. Vì vậy, 'A' là những gì & ~ Ox20 sẽ cung cấp cho tôi? [Học sinh trả lời, không nghe được] Và 'a' và là những gì - đó là 'A'. Và là những gì 'a' & ~ Ox20 sẽ cung cấp cho tôi? 'A' Bởi vì đây là một hiện 1. Anding với 0 điều này sẽ làm cho nó một 0, và bây giờ chúng ta sẽ có được một 'A'. Cả hai đều là 'A', và cuối cùng nhưng không kém của loại hình này, chúng tôi có XOR. Nó rất giống hoặc, ngoại trừ nó có nghĩa là độc quyền hoặc. Điều này giống như những gì bạn thường nghĩ là hay trong thế giới thực. Vì vậy, bạn làm một trong hai 'x' hoặc 'y', nhưng không phải cả hai. Đây 1 ^ 1 sẽ là 0. 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 như phép toán & và hay làm, nhưng sự thật ^ đúng là sai. Bởi vì chúng tôi chỉ muốn trở về đúng nếu chỉ một trong số họ là đúng. Vì vậy, 1 ^ 1 là 0. Những gì về 0 ^ 1? Là 1. 1 ^ 0 là 1, 0 ^ 0 là 0. Vì vậy, trong mọi hoàn cảnh, một cái gì đó trên bit 0 0 sẽ là 0. 1 phép toán một cái gì đó hoặc 0 0 1 phép toán, nếu nó | hoặc ^, nó sẽ là một 1, và nếu nó và nó sẽ là 0. 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. Đó là 0110. 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. 'A' ^ Ox20 là những 2 bit chúng ta đang so sánh. Vì vậy, một 1 ^ 0 sẽ cung cấp cho tôi một điều gì? Một một. 'A' ^ Ox20 sẽ cung cấp cho tôi? Chữ thường a. 'A' ^ Ox20 sẽ cung cấp cho tôi? Vốn A. Bởi vì bất cứ điều gì đang thực hiện, XORing này với Ox20 được hiệu quả lật bất cứ điều gì bit này là. Nếu đây là một số 0, nó bây giờ sẽ trở thành một 1. Vì đây là một 1, 1 ^ 1 là 0. Vì vậy, chúng tôi 'a' đã trở thành 'A', và chúng tôi 'A' đã trở thành 'một'. Vì vậy, XOR là một cách thực sự thuận tiện chỉ lật trường hợp. Bạn chỉ muốn để lặp lại một chuỗi ký tự và thay thế trường hợp của mỗi nhân vật duy nhất, bạn chỉ cần XOR tất cả mọi thứ với Ox20. Bây giờ chúng ta đã để lại sự thay đổi. Thay đổi lại chỉ là sẽ, về cơ bản, đẩ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ọ. Vì vậy, ở đây chúng tôi có 00.001.101. Chúng ta sẽ đẩy 3 0 của từ cánh phải, và chúng tôi nhận được 01.101.000. Về nonbinary, 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. 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. 13 * 2 ^ 3, 2 ^ 3 là 8, vì thế 13 * 8 là 104. Nếu bạn chỉ nghĩ về nhị phân nói chung, làm thế nào mỗi chữ số, 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. Vì vậy, bằng cách đẩy trong 0 của từ cánh phải, chúng ta chỉ cần đẩy những điều mà được đặt ra của 4 vị trí của 8, và những điều được đặt ra của 8 vị trí của 16. Mỗi ca chỉ nhân với 2. Yeah? [Sinh viên] Điều gì xảy ra nếu bạn chuyển 5? [Bowden] Nếu bạn chuyển 5 bạn sẽ chỉ mất chữ số. Chắc chắn, đó là điều tương tự. Như, số nguyên chỉ 32 bit, 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. Vì vậy, nó là điều tương tự ở đây. Nếu bạn chuyển 5, chúng tôi sẽ chỉ mất một đó. Và đó là loại gì tôi có nghĩa là do "gần" mà nếu bạn chuyển quá xa, bạn sẽ mất bit. Thay đổi phải là có được điều ngược lại, nơi chúng ta sẽ xô 0 của off cuối cùng, và cho các mục đích của chúng tôi, điền số 0 từ cánh trái. 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. Và chúng ta thấy rằng ba số 0 ở bên phải vừa giảm đi, và chúng tôi đã đẩy 1101 tất cả các cách bên phải. Này được làm 104 3, đó là, có hiệu quả, x / 2 ^ y. Vì vậy, bây giờ, ở đây, đó là một ý tưởng tương tự. Tại sao nó chỉ khoảng x / 2 ^ y, và không thực sự x / 2 ^ y? Bởi vì nếu tôi đã chuyển 4, tôi đã mất đi một 1. Về cơ bản, những gì bạn nghĩ, chỉ cần nghĩ về phân chia số nguyên nói chung. Vì vậy, giống như 5/2 là 2. Nó không phải là 2,5. Đó là ý tưởng tương tự ở đây. Khi chúng tôi chia cho 2, chúng ta có thể mất bit lẻ trên đường đi. 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. Hãy nhớ rằng các trường hợp sử dụng chúng ta đã thấy trong lớp học, như một mặt nạ bit là hữu ích cho các nhà khai thác trên bit, hoặc bạn sử dụng chúng cho các mặt nạ bit. Chữ hoa và chữ thường, chuyển đổi là một ví dụ khá nguyên mẫu. Được rồi, do cuộc tấn công tràn bộ đệm. Bất cứ ai cũng nhớ những gì đã xảy ra với chức năng này? Thông báo chúng tôi tuyên bố một mảng của 12 byte, 12 ký tự, 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. Vì vậy, vấn đề là gì đây? Con số kỳ diệu 12 nên khá nhiều ngay lập tức bật ra như - tại sao 12? Nếu thanh sẽ xảy ra là nhiều hơn 12 ký tự? Nếu thanh là hàng triệu ký tự? Ở đây vấn đề là memcpy. Nếu thanh là đủ dài, nó sẽ chỉ hoàn toàn - 'c', 'c' không quan tâm rằng đó là chỉ có 12 ký tự; 'C' không quan tâm rằng nó không thể phù hợp với nhiều byte. Nó sẽ chỉ hoàn toàn ghi đè lên char, 12 byte chúng tôi đã phân bổ cho nó, và tất cả mọi thứ qua nó trong bộ nhớ mà không thực sự thuộc về bộ đệm với bất cứ điều gì thanh chuỗi. Vì vậy, đây là hình ảnh mà chúng ta thấy trong lớp nơi chúng tôi có ngăn xếp của chúng tôi lớn lên. 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. 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 và phát triển xuống như 4 tỷ ở phía dưới. Chúng tôi có mảng của chúng tôi 'c' một nơi nào đó trong bộ nhớ, sau đó chúng tôi có con trỏ của chúng tôi để thanh ngay bên dưới nó, 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. Nhớ những gì các địa chỉ trả lại là? Đó là khi chính gọi một hàm foo, gọi một thanh chức năng, chắc chắn, thanh lợi nhuận. 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ó. 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. 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, hacker muốn thay đổi địa chỉ trở lại. 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. Và, thuận tiện, nơi mà các hacker thường xuyên muốn quay trở lại là sự bắt đầu của bộ đệm mà chúng ta ban đầu đã có. Vì vậy, nhận thấy, một lần nữa, Little Ấn Độ. Thiết bị này là một ví dụ về một hệ thống nhỏ Ấn Độ, 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. Vì vậy, ở đây chúng ta thấy - là điều này? Yeah. Chúng ta thấy Ox80, OxC0, Ox35, OxO8. Nhớ các chữ số thập lục phân? Chúng tôi không đảo ngược các chữ số thập lục phân ở Little Ấn Độ, 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. Đó là lý do tại sao chúng ta không lưu trữ, như, 80530CO8. 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. Địa chỉ đề cập đến địa chỉ của người bắt đầu 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. Lý do đó là hữu ích là bởi vì, nếu kẻ tấn công xảy ra, thay vì có một chuỗi đó chỉ một chuỗi vô hại như thế, tên của họ hoặc một cái gì đó, nếu, thay vào đó, chuỗi chỉ là một số mã tùy ý mà đã làm bất cứ điều gì họ muốn nó để làm gì? Vì vậy, họ có thể - tôi không thể nghĩ ra bất kỳ mã mát mẻ. Nó có thể là bất cứ điều gì, mặc dù. Bất kỳ mã thảm họa. 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. Họ thường làm điều đó để hack hệ thống của bạn. Rồi. Thư viện CS50. 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. 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 tại một số điểm trong học kỳ. Hãy nhớ rằng một chuỗi chỉ là một mảng các ký tự. Vì vậy, ở đây chúng ta thấy một phiên bản rút gọn của getString. Bạn nên nhìn lại nó để nhớ làm thế nào nó thực sự thực hiện. 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 từ tiêu chuẩn trong, đó là giống như chúng ta gõ vào bàn phím. 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, vì vậy nếu n + 1 lớn hơn công suất, 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. 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. 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 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ì, 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 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. Vì vậy, chúng ta không thấy, nhưng ý tưởng chính là nó có đọc trong một nhân vật duy nhất tại một thời điểm. Nó không thể chỉ cần đọc trong một toàn bộ điều cùng một lúc, vì đệm của họ là duy nhất của một kích thước nhất định. 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. 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 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. 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 trong việc triển khai của họ. Vì vậy, tôi nhấn mạnh điều quan trọng ở đây. Nó gọi getString để có được một chuỗi. Nếu getString không trả lại bộ nhớ, hãy nhớ rằng getString mallocs một cái gì đó, bất cứ khi nào bạn gọi getString bạn không nên (khó hiểu) phóng rằng chuỗi mà bạn đã nhận. 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ờ đó, hey, chúng tôi không thực sự có thể để có được một số nguyên. Bạn nên bỏ qua bất cứ điều gì tôi trả lại cho bạn, hoặc bạn không nên điều trị này như là một đầu vào hợp lệ. 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, có nghĩa là, đầu tiên phù hợp với một số nguyên, sau đó kết hợp bất kỳ ký tự sau khi số nguyên. Vì vậy, nhận thấy chúng tôi muốn nó bằng 1. Lợi nhuận để sscanf bao nhiêu trận đấu nếu thực hiện thành công? Nó sẽ trở lại 1 nếu nó xuất hiện thành công một số nguyên, 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 nếu nó phù hợp với một số nguyên theo sau bởi một số nhân vật. 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. Vì vậy, nếu chúng tôi bước vào 1, 2, 3, C, hoặc 1, 2, 3, X, sau đó 1, 2, 3 sẽ được lưu trữ trong các số nguyên, X sẽ được lưu trữ tại các nhân vật, 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. Nhanh chóng thổi qua HTML, HTTP, CSS. HyperText Markup Language là cấu trúc và ngữ nghĩa của trang web. Đây là ví dụ từ bài giảng mà chúng tôi có các thẻ HTML. Chúng tôi có thẻ tag head, cơ thể, 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, chúng tôi chỉ có liên kết và hình ảnh. 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. 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, 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. 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. Ở đâ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ì? Một hình thức như vậy có một hành động và một phương pháp. Các phương pháp bạn sẽ chỉ bao giờ thấy là GET và POST. Vì vậy, GET là phiên bản mà điều được đặt vào URL. POST là nơi mà nó không được đưa vào URL. 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. Vì vậy, ở đây, hành động xác định nơi các yêu cầu HTTP đi. Nơi mà nó sẽ là google.com / search. Phương pháp. Nhớ sự khác nhau giữa GET và POST, và, chỉ nói là một ví dụ, nếu bạn muốn đánh dấu một cái gì đó. Bạn sẽ không bao giờ có thể đánh dấu một URL POST vì dữ liệu không được bao gồm trong URL. HTTP, bây giờ, là HyperText Transfer Protocol. Hypertext Transfer Protocol, bạn mong chờ nó để chuyển HyperText Markup Language, và nó. Nhưng nó cũng chuyển bất kỳ hình ảnh bạn tìm thấy trên mạng, bất kỳ tải bạn thực hiện bắt đầu như là một yêu cầu HTTP. Vì vậy, HTTP chỉ là ngôn ngữ của World Wide Web. Và ở đây bạn cần phải nhận ra điều này loại một yêu cầu HTTP. Đây HTTP/1.1 trên mặt chỉ nói rằng là phiên bản của giao thức Tôi đang sử dụng. Nó khá nhiều luôn luôn có được HTTP/1.1, như bạn sẽ thấy nó. 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. Và URL mà tôi đã cố gắng để truy cập vào là www.google.com/search?q = blah, blah, blah. Vì vậy, hãy nhớ rằng điều này, dấu hỏi q = blah blah blah, là các loại công cụ mà được gửi bởi một hình thức. Phản ứng nó có thể quay trở lại tôi sẽ giống như thế này. Một lần nữa, bắt đầu với các giao thức, mà là có được mà, tiếp theo là mã trạng thái. Ở đây nó là 200 OK. Và cuối cùng, trang web mà tôi thực sự yêu cầu sẽ được theo sau. 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ọ. 200 OK bạn có thể nhìn thấy trước. 403 Forbidden, 404 Not Found, 500 Internal Server Error 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, trong khi đó thiết bị chúng tôi có hộp màu cam lớn 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 hoặc của xấu chức năng này. 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, nên thay vì họ sẽ chỉ cung cấp cho bạn 500 lỗi máy chủ nội bộ. TCP / IP là 1 lớp dưới HTTP. Hãy nhớ rằng không có Internet bên ngoài của World Wide Web. 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, nó sẽ thông qua một khác nhau - nó vẫn còn sử dụng Internet, nhưng nó không sử dụng HTTP. HTTP chỉ là một ví dụ về giao thức được xây dựng trên giao thức TCP / IP. IP có nghĩa là Internet Protocol. Mỗi máy tính có địa chỉ IP, họ là những nhân vật có 4 chữ số như 192.168.2.1, hoặc bất cứ điều gì, đó có xu hướng được một địa phương. Nhưng đó là mô hình của một địa chỉ IP. Vì vậy, DNS, Domain Name Service, đó là những gì dịch những thứ như google.com đến một địa chỉ IP thực tế. Vì vậy, nếu bạn gõ địa chỉ IP vào một URL, 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 đó. Bạn có xu hướng nhớ google.com thay thế. Đ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. 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. Có thể bạn có một số ứng dụng email đang chạy; có thể bạn có một số chương trình khác có sử dụng các hoạt động Internet. Tất cả họ cần truy cập vào Internet, nhưng máy tính của bạn chỉ có 1 card WiFi hoặc bất cứ điều gì. Vì vậy, các cảng là cách mà chúng tôi có thể chia tay làm thế nào các ứng dụng này có thể sử dụng Internet. Mỗi ứng dụng được 1 cổng cụ thể mà nó có thể nghe trên, và theo mặc định, HTTP sử dụng cổng 80. Một số dịch vụ email sử dụng 25. Những người thấp số có xu hướng được bảo lưu. 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. CSS, Cascading Style Sheets. Chúng tôi phong cách trang web với CSS, không phải với HTML. Có 3 địa điểm bạn có thể đặt CSS của bạn. 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 Và đây chỉ là một ví dụ về CSS. Bạn nên nhận ra mô hình này, nơi ví dụ đầu tiên là chúng tôi đang kết hợp các từ khóa cơ thể, và ở đây chúng tôi đang tập trung thẻ cơ thể. Ví dụ thứ hai, chúng tôi phù hợp với điều với ID chân trang, và chúng tôi đang áp dụng một số phong cách đó. Chú ý rằng ID chân văn bản Canh lề bên trái, trong khi trung tâm cơ thể văn bản Canh lề. Footer là bên trong cơ thể. Nó sẽ, thay vào đó, text-align trái, mặc dù cơ thể nói trung tâm text-align. Đây là một phần tầng toàn bộ của nó. Bạn có thể có - bạn có thể xác định phong cách cho cơ thể, và sau đó mọi thứ trong cơ thể bạn có thể xác định phong cách cụ thể hơn, và những công việc như bạn mong đợi. Specifiers CSS cụ thể hơn được ưu tiên. Tôi nghĩ rằng đó là nó. [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. Tôi Ali và tôi sẽ phải đi qua PHP và SQL thực sự nhanh chóng. Vì vậy, chúng ta có thể bắt đầu. PHP là viết tắt của PHP: Hypertext Preprocessor. 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ủ, và chúng tôi sử dụng nó cho kết thúc trở lại của các trang web, 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. Cú pháp. Nó không giống như C, bất ngờ, ngạc nhiên. 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. 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?. Đó 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. 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. Bạn cần phải luôn luôn bao quanh nó. 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ự $. 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 đó khi bạn đang đề cập đến với họ sau này. Bạn luôn cần $ đó. Đó là người bạn tốt nhất của bạn, khá nhiều. 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. Vì vậy, trong khi bạn làm cần $, bạn không cần phải đặt, như, int x hoặc chuỗi y, vân vân, vân vân. Vì vậy, một sự khác biệt nhỏ. Là kết quả của điều này, nó có nghĩa là PHP là một loại yếu ớt. PHP là một ngôn ngữ kiểu cách yếu ớt, và nó đã yếu gõ biến. 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. Bạn có thể lưu số điện thoại của 1 như một int, 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, và tất cả nó sẽ là số 1. Ngay cả khi bạn đang lưu trữ nó trong các hình thức khác nhau, nó vẫn còn - các loại biến vẫn đang nắm giữ cuối cùng. Vì vậy, nếu bạn nhìn ở đây, nếu bạn nhớ từ pset 7, nhiều người trong số bạn có thể đã có vấn đề với điều này. Hai dấu bằng, dấu bằng 3, 4 dấu bằng. Được rồi, không có 4 dấu bằng, nhưng có 2 và 3. Bạn sử dụng 2 dấu bằng để kiểm tra các giá trị. Nó có thể kiểm tra trên các loại. Vì vậy, nếu bạn có thể thấy ở ví dụ đầu tiên, Tôi có num_int == num_string. 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, nhưng chúng khác nhau. Nhưng đối với bình đẳng đôi, nó vẫn sẽ vượt qua. 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. Điều đó có nghĩa rằng nó sẽ không vượt qua trong đó trường hợp thứ hai ở đây, nơi bạn đang sử dụng 3 dấu bằng thay thế. 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ờ. String nối là một điều mạnh mẽ mà bạn có thể sử dụng trong PHP. Nó về cơ bản chỉ ký hiệu dấu chấm tiện dụng này, và đó là cách bạn có thể gắn dây với nhau. 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, bạn có thể sử dụng thời gian, và đó là loại như thế nào nó hoạt động. Bạn cũng có thể chỉ cần đặt chúng bên cạnh nhau, như bạn có thể thấy ở đây trong ví dụ dưới, nơi tôi đã vang chuỗi 1, không gian chuỗi 2. PHP sẽ biết để thay thế họ như vậy. Mảng. Bây giờ, trong PHP, có 2 loại khác nhau của các mảng. 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, và chúng ta sẽ đi qua chúng ngay bây giờ. Mảng thông thường chỉ điều này trong C, và do đó bạn có các chỉ số được đánh số. Ngay bây giờ chúng ta chỉ cần đi để tạo ra một và đặt - 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ẽ đưa vào các số chỉ số 0. Chúng tôi sẽ đưa số 6, giá trị 6. Bạn có thể nhìn thấy nó ở phía dưới đây. Where's - tại chỉ số số 1 chúng ta sẽ đặt giá trị số 4, và do đó bạn có thể thấy có một 6, có một 4, và sau đó là chúng tôi đang in mọi thứ, khi chúng tôi cố gắng và in giá trị được lưu trữ tại chỉ số số 0, sau đó chúng ta sẽ thấy giá trị 6 được in ra. Mát mẻ? Vì vậy, đó là mảng thông thường cho bạn. 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 là bạn chỉ có thể thêm vào cuối. Điều đó có nghĩa rằng bạn không cần phải xác định các chỉ số cụ thể. Bạn có thể xem số, và sau đó trong dấu ngoặc vuông không có chỉ số quy định. 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. Vì vậy, bạn sẽ nhìn thấy 1 ngay tại đó 0 điểm, 2 đi ngay tại chỗ đầu tiên. 3 đi - được thêm vào đó là tốt. Vì vậy, loại có ý nghĩa. Bạn chỉ cần liên tục bổ sung nó, và sau đó khi chúng ta lặp lại các chỉ số của số 1, nó sẽ in ra giá trị 2. Sau đó chúng ta có mảng đó là mảng kết hợp. Mảng kết hợp, thay vì có các chỉ số số, những gì họ làm là, họ có chỉ số đó là bởi chuỗi. Bạn có thể thấy, thay vì - Tôi đã thoát khỏi tất cả những chỉ số số lượng, 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. Vì vậy, chúng ta có thể có một ví dụ về điều này. Ví dụ của việc này là chúng ta có tf, và đó là tên chỉ số. Chúng ta sẽ đặt "Ali" như tên gọi, ở chỉ số, lượng calo ăn, chúng ta có thể đặt một int thời gian này thay vì một chuỗi, 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ó. 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ó 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 để họ có như các chuỗi thay thế. 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, 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 đó, và sau đó chúng tôi đặt tất cả trong một bộ khung vuông khổng lồ. Vì vậy, có thể đẩy nhanh tốc độ. Nó là nhiều hơn một sự lựa chọn phong cách hơn không. Chúng tôi cũng có các vòng lặp. Trong C chúng ta có vòng làm việc như thế này. 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, và chúng tôi in tất cả, phải không? Ngoại trừ vấn đề là, cho mảng kết hợp, chúng tôi không nhất thiết phải biết những chỉ số số bởi vì bây giờ chúng tôi có các chỉ số chuỗi. 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. Vòng lặp foreach sẽ chỉ biết tất cả các phần của danh sách. Và nó không phải biết chính xác các chỉ số số mà bạn có. Vì vậy, bạn có cú pháp foreach, vì vậy nó foreach, bạn đặt mảng. Vì vậy, mảng của tôi được gọi là pset, và sau đó là, các từ như, và sau đó bạn đặt biến này địa phương tạm thời mà bạn đang sử dụng chỉ cho những điều cụ thể mà sẽ giữ cụ thể - một trường hợp hoặc một phần của mảng. Pset num sẽ tổ chức 1, và sau đó có thể nó sẽ giữ số 6, và sau đó nó sẽ giữ số 2. Nhưng nó đảm bảo để đi qua tất cả các giá trị duy nhất đó là trong mảng. Chức năng hữu ích mà bạn nên biết trong PHP là những yêu cầu, để đả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. 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. Bạn có thể cần phải biết những, 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ả. Và bây giờ chúng ta sẽ đi qua phạm vi thực sự nhanh chóng. Trong phạm vi, PHP là loại một điều sôi nổi, không giống như C, và vì vậy chúng tôi chỉ cần đi để đi qua nó một cách nhanh chóng. 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ó ở đó. Và chúng ta sẽ bắt đầu với $ i. Vì vậy, các biến 'i' là có được 0, và chúng tôi chỉ cần đi để giữ cho in nó trong hộp lớn màu trắng ở đó. Chúng ta sẽ bắt đầu với i0, và sau đó chúng ta sẽ echo nó. Do đó, có là 0. Và sau đó chúng ta sẽ tăng nó bởi các vòng lặp cho, và sau đó nó sẽ là giá trị 1. Một là ít hơn 3, do đó, nó sẽ đi qua đó cho vòng lặp, và sau đó chúng ta sẽ thấy nó được in lại. Chúng ta sẽ tăng nó một lần nữa để 2, và 2 là ít hơn 3, do đó, nó sẽ vượt qua vòng lặp, và nó sẽ in 2. 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. Vì vậy, bây giờ chúng ta đã thoát, và sau đó chúng ta sẽ đi vào aFunction. Đượ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, 'i' biến, không địa phương scoped. Điều đó có nghĩa rằng nó không phải địa phương để các vòng lặp, 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. 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, và chúng ta sẽ tăng 'i' + +. 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. Đó là một điều hoàn toàn khác nhau, đó là chính xác. Vì vậy, khi chúng ta in nó, chúng ta sẽ in 'i' + +, đó là sẽ in ra rằng 4, và sau đó chúng ta sẽ - xin lỗi. Sau đó chúng ta sẽ kết thúc trong chức năng, và chúng ta sẽ là nơi mũi tên đó là ngay bây giờ. Đ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', nó không thay đổi bên ngoài của các chức năng, bởi vì chức năng có một phạm vi riêng biệt. Đ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, và như vậy thì chúng ta sẽ in 3 lần nữa. Những điều khác nhau về phạm vi trong PHP hơn trong C. Bây giờ trong PHP và HTML. PHP được sử dụng để làm cho các trang web động. Nó loại làm cho mọi thứ khác nhau. Chúng tôi có nó khác với HTML. 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, 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. 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, và tôi có thể thay đổi tên. Vì vậy, ngay bây giờ tên là Joseph, và nó có "về tôi", nhưng sau đó tôi cũng có thể thay đổi tên để có Tommy. Và đó sẽ là một điều khác nhau. Vì vậy, sau đó chúng tôi cũng có thể thay đổi những điều khác nhau về anh ấy, và nó sẽ hiển thị nội dung khác nhau dựa vào tên. Vì vậy, PHP loại có thể thay đổi những gì đang xảy ra trong trang web của bạn. Tương tự ở đây. Tuy nhiên, lưu ý rằng họ có nội dung khác nhau, 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. Tạo ra HTML. Có 2 cách khác nhau mà bạn có thể làm điều này. 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. Vì vậy bạn chỉ có thường xuyên của bạn cho vòng lặp trong PHP, và sau đó bạn echo trong PHP và bạn echo ra HTML. Sử dụng những gì Rob cho thấy bạn của kịch bản HTML và sau đó sử dụng in PHP để chỉ in ra trang web. Cách khác là để làm điều đó, nếu như bạn tách ra PHP và HTML. Vì vậy, bạn có thể có một dòng PHP bắt đầu cho vòng lặp, sau đó bạn có thể có các dòng của HTML trong một điều riêng biệt, và sau đó bạn kết thúc vòng lặp, một lần nữa, với một PHP. Vì vậy, nó loại tách nó ra. Ở phía bên trái, bạn có thể bạn có tất cả các - nó chỉ là 1 đoạn PHP. Bên phải bạn có thể thấy rằng bạn có một dòng của PHP, bạn có một dòng của HTML, và bạn có một dòng của PHP lại. Vì vậy, tách nó ra thành những gì họ đang làm. Và bạn sẽ lưu ý rằng một trong hai cách, cho cả hai, họ vẫn in ra các hình ảnh, hình ảnh, hình ảnh, để HTML mà vẫn được in cùng một cách. Và sau đó bạn vẫn sẽ thấy 3 hình ảnh hiển thị trên trang web của bạn. Vì vậy, nó là 2 cách khác nhau để làm điều tương tự. 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, có các hình thức HTML, và chúng tôi sẽ chỉ lướt qua này. 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 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 nó sẽ là một GET hoặc POST. 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 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. Vì vậy, một sự khác biệt nhỏ. Tuy nhiên, có một điều đó là một điều tương tự là POST và GET đều không an toàn. Vì vậy, bạn có thể nghĩ rằng chỉ vì bạn không nhìn thấy nó trong URL, có nghĩa là POST là an toàn hơn, 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. Vì vậy, không nghĩ về một hay khác. Một điều cần lưu ý là bạn cũng có biến phần. 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. Những gì đã xảy ra là bạn có thể sử dụng mảng kết hợp này, $ _SESSION, và sau đó bạn có thể truy cập vào những thứ khác nhau và lưu trữ những thứ khác nhau trên các trang. Điều cuối cùng là chúng ta có SQL, Structured Query Language, và đây là một ngôn ngữ lập trình để quản lý cơ sở dữ liệu. Những gì, chính xác, là cơ sở dữ liệu? Chúng bộ sưu tập các bảng, và mỗi bảng có thể có các loại tương tự của các đối tượng. 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. 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. Đó là một cách để theo dõi và quản lý việc điều và thực sự nhìn thấy nó trên các trang khác nhau và lưu giữ theo dõi. 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 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. Chúng ta có 4 điều quan trọng mà chúng tôi sử dụng cho các lệnh SQL. Chúng tôi có lựa chọn, chèn, xóa, và cập nhật. Đó là thực sự quan trọng cho các bạn biết cho bài kiểm tra của bạn. Chúng tôi sẽ nhanh chóng đi qua chọn ngay bây giờ. Về cơ bản, bạn đang lựa chọn các hàng từ một cơ sở dữ liệu. Vì vậy, nếu bạn có, ngay tại đây - 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 nơi tuyệt vời - nơi ở cột tuyệt vời giá trị là 1. 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, CS50 và Stat110, và chúng tôi có các ID lớp và khẩu hiệu. Vì vậy, chúng tôi muốn chọn tất cả các thông tin đó. 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, 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. 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. Vì vậy, đó là loại như thế nào PHP và SQL có liên quan đến nhau. 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 như chúng tôi đã làm trong pset 7, và chúng ta sẽ chạy các truy vấn SQL. Sau đó chúng ta sẽ có - 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. Vì vậy, một lần nữa, bạn muốn kiểm tra các loại và giá trị, 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. 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 foreach vòng mà chúng ta vừa đi qua. Bây giờ chúng ta đang lặp qua và chúng tôi đã làm cho nó qua, 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. 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. Nó sẽ in ra tất cả các thông tin mà nó nhận được. Vì vậy, nó sẽ in ra ở phía dưới "Wanna Tìm hiểu HTML?" 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, và như vậy thì nó sẽ in ra dòng thứ hai của nó, mà là có được STAT110, Tìm tất cả các khoảnh khắc. Một điều cuối cùng là trên SQL lỗ hổng. Tôi biết David xúc động về điều này một chút trong bài giảng. Bạn có thể đọc này sau đó. Nó thực sự buồn cười. SQL Injection là một loại điều khó khăn. 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, như bạn có thể thấy trong dòng đầu tiên. 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 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. Điều đó có vẻ khá đơn giản. Vì vậy, cho phép nói rằng ai đó đặt trong, cho mật khẩu, điều này hoặc văn bản ngay tại đây - thực sự cần được trong hộp màu đỏ. Vì vậy, hãy nói rằng họ đặt mật khẩu vào - đó là những gì họ nhập. Vì vậy, họ đang đặt hoặc "1" = 1. Loại mật khẩu ngớ ngẩn để có. 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ờ, nó để đánh giá luôn luôn đúng, bởi vì bạn sẽ lưu ý rằng bạn có thể truy vấn SQL chọn tất cả các thông tin này hoặc bạn chỉ có thể có 1 = 1. Vì vậy, đó là luôn luôn đánh giá đúng sự thật. 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. Các giải pháp này là bạn phải sử dụng hệ thống PDO, có nghĩa là bạn phải sử dụng dấu hỏi, đó là những gì các bạn được sử dụng trong pset 7, 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ì đó, và sau đó bạn sẽ có một dấu phẩy, và sau đó bạn sẽ có sau đó, 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. Vì vậy, bạn sẽ lưu ý ở đây là bây giờ tôi có những dấu hỏi màu đỏ. 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 đó. Điều đó sẽ đảm bảo rằng nếu có ai đó làm nó như thế này, và họ có hoặc 1 = 1 tình huống, mà sẽ làm cho chắc chắn, 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. Được rồi, vì vậy đó là khá nhiều đó, một cơn lốc của PHP và SQL. Tốt nhất của may mắn cho tất cả các bạn, và bây giờ đến Ore [Oreoluwatomiwa Babarinsa] Được rồi tất cả mọi người. Thời gian để đi qua một số JavaScript 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. JavaScript. Vâng. JavaScript là loại một điều thú vị, tự nhận. Những điều bạn thực sự cần phải biết về JavaScript, đó là loại giống như 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. 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ủ. 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. 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 đó. Và một số trong đó thậm chí không thể làm ở phía máy chủ. Đây là lý do tại sao chúng ta cần một cái gì đó như JavaScript. Điều thú vị về JavaScript: Đây là kiểu động. Điều này có nghĩa là chương trình của bạn không cần phải biết những gì, chính xác, các biến khi bạn viết nó ra. Nó sẽ chỉ là loại con số nó ra như nó đang chạy. Những thứ khác được mát mẻ về nó: Đó là một ngôn ngữ cú đúp xoăn, có nghĩa là các cú pháp tương tự như C và PHP. Bạn không cần phải làm nhiều làm lại khi bạn đang học JavaScript. Ở đây chúng tôi có một chút của JavaScript. Thú vị đúng ở đây là, nếu bạn nhìn vào nó, chúng tôi có một chút JavaScript phải có trong thẻ đầu. Những gì là không được về cơ bản chỉ bao gồm một tập tin JavaScript. Đây là một cách để bạn có thể bao gồm JavaScript vào chương trình của bạn. Sau đó ít thứ hai thực sự là một số JavaScript nội tuyến, rất giống với một phong cách nội tuyến với CSS, và bạn chỉ cần viết một số mã rất nhanh chóng có. JavaScript có mảng. Chỉ là một cách để giữ cho dữ liệu xung quanh, rất hữu ích. Rất đẹp và dễ cú pháp. 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. Không có gì quá phức tạp. Điều thú vị về JavaScript và ngôn ngữ kịch bản nói chung là bạn không phải lo lắng về kích thước mảng. Bạn chỉ có thể sử dụng array.length và theo dõi nó, và cũng có mảng có thể phát triển hoặc thu nhỏ khi bạn cần đến. Vì vậy, bạn thậm chí không cần phải lo lắng về bất kỳ loại, 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ế. Điều thú vị ở đây là JavaScript có một cái gì đó gọi là các đối tượng. Nó là một ngôn ngữ hướng đối tượng, vì vậy những gì nó đã là, về cơ bản, 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, 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. 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 nếu bạn có một loạt các dữ liệu có liên quan. Bởi vì đó là tất cả những điều bạn cần để mô tả một chiếc xe hơi, bạn không cần phải có nó trong một loạt các địa điểm khác nhau. Bạn chỉ có thể dính vào 1 đối tượng trong JavaScript. Như bạn đã biết, iterating là một trong những nhiệm vụ tẻ nhạt. 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, 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ế. Vì vậy, JavaScript có, tương tự như PHP, cú pháp foreach. Trong trường hợp này, đó là một trong cho vòng lặp. Bạn muốn sử dụng này chỉ có trên các đối tượng. Có một số vấn đề xảy ra nếu bạn sử dụng này trên các mảng. Nó thường là một trong những điều đó, mặc dù, đó là rất hữu ích, bởi vì bạn loại bỏ rất nhiều chi phí 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. Bạn không cần phải nhớ tất cả các tên quan trọng. Bạn chỉ cần loại được chúng trở lại trong cú pháp này. Trong đó, với cho, bạn chỉ muốn nhớ 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. 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ì đó mà có thể có một giá trị liên kết với nó. 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, Tôi đặt trong một chiếc xe hơi, và tôi gọi nó là một chiếc Ferrari. 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 đó. Và bạn có thể làm điều đó trong vòng một, với cho trong vòng lặp. 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ớ 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, 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ệ. 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. Vâng, nếu bạn đã đặt object.key, không gian, với, không gian, không gian, đó sẽ chỉ có ý nghĩa cú pháp. Vì vậy, bạn chỉ có thể làm điều đó với loại này cú pháp khung. Ngoài ra, JavaScript là rất phạm vi khôn ngoan để PHP. Bạn có 2 cách giải quyết phạm vi. Bạn không thể có var trước một biến, và rằng chỉ có nghĩa là đây là toàn cầu. 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, 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 đó. 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 Nếu bạn đang không ở trong một chức năng, tốt, đó là toàn cầu. 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 đó. Tôi không có một ví dụ, nhưng, yeah. Đó là một trong những điều mà bạn có thể quản lý những gì biến bạn muốn được toàn cầu, 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, 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, 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. Đ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? Ý tôi là, đó là lý do tại sao chúng tôi đang làm điều này. Để làm điều đó, chúng tôi sử dụng một cái gì đó gọi là DOM. Document Object Model. Về cơ bản, những gì nó làm là phải mất tất cả HTML của bạn và các mô hình đó vào một loạt các đối tượng được lồng vào nhau. Bạn bắt đầu với một cái gì đó như thế này. 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 - Bạn sẽ nghĩ rằng sẽ rất khó để thao tác, 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 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? Những điều xấu sẽ xảy ra. 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, 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, và bên trong bạn có một cái gì đó gọi là HTML, và bên trong mà bạn có một cái đầu và một cơ thể, và trong đầu rằng bạn có một tiêu đề, vân vân, vân vân, vân vân. Đơn giản hóa thao tác này một trang web để nó chỉ là, oh, tôi chỉ muốn nói chuyện với đối tượng này. 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. Như tôi đã nói, tất cả các DOM là trong đối tượng tài liệu. 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ứ, và bạn có thể làm điều đó - đây là phong cách cũ để làm việc đó, trên đó, nơi bạn làm document.getElementById, và sau đó tên, và như thể bạn có thể cho biết, đây sẽ rất khó sử dụng sau một thời gian. 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ó điều tiếp theo chúng ta sẽ nói về sau này. Đ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? 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. 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? Tôi muốn nó để làm một cái gì đó thú vị khi họ nhấp một cái gì đó. Đó là lý do tại sao chúng tôi có các sự kiện. Bạn có thể, về cơ bản, tìm thấy bất kỳ phần tử trong DOM của bạn, và sau đó nói, hey. Khi điều này tải hoặc ai đó nhấp chuột nó, hoặc khi họ chuột lên nó, làm điều gì đó với nó. 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. Các chức năng này là xử lý sự kiện. They're gì - nó chỉ là một cách nói, chức năng này chỉ được thực hiện khi sự kiện này xảy ra. Vì vậy, nó xử lý các sự kiện xảy ra. Đây là cách bạn sẽ đặt ra một xử lý sự kiện. Tôi có một số nút, và khi bạn nhấp vào nó, nó phát nổ. Do đó, không nhấn nút. Đây là một cách tiếp cận nó, phải không? Bạn có một thẻ nút, và nhấp chuột bạn có một chuỗi mà nói, oh, bằng cách này, tôi làm điều nổ này cho tôi. 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. Bạn cũng có thể làm điều này một cách khác, 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. JQuery: Đây là một thư viện mà là qua trình duyệt. Bạn có thể sử dụng nó trong khá nhiều bất cứ điều gì. Và nó chỉ cung cấp cho bạn rất nhiều công cụ để làm việc với. Vì JavaScript, trong khi mạnh mẽ, không có tất cả các công cụ bạn cần 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. 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 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. Và chỉ làm cho mọi thứ rất đơn giản. Bạn cũng có bộ chọn, cho phép bạn đưa ra tất cả những yếu tố 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. Thêm về các bộ chọn. Bạn có, ở đó bạn đã, chúng ta hãy nói Tôi muốn có được một phần tử với ID "đá." Vâng, trong jQuery, nó chỉ $ và sau đó là một chuỗi mà có một pound, và sau đó "đá". 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. 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ố. jQuery là - một trong những tính năng thú vị là bạn có thể loại nén xuống truy vấn của bạn trên DOM của bạn rất, rất nhanh. 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. 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? Vì vậy, tôi có nội tuyến này JavaScript. 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. Khi tài liệu đã sẵn sàng, có nghĩa là các tài liệu đã bị nạp, 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, chức năng này thực sự làm cái gì khác. Đó 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." 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ó. Về cơ bản điều này không là, nó nói, được rồi. Các trang được tải, vì vậy tôi sẽ trong, tìm yếu tố này, 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. Và đây là cách bạn muốn suy nghĩ về xử lý sự kiện. 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? 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, đ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. 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. Và nếu mọi thứ kích hoạt những thứ khác, đó là tuyệt vời. Nhưng bạn không muốn cố gắng và làm mã phức tạp nơi bạn đang gây ra nhiều điều cùng một lúc, bởi vì bạn chỉ cần đi để cung cấp cho mình một nhức đầu. 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, nhưng chúng ta hãy nói người sử dụng của tôi nhấn một nút. Những gì nếu tôi muốn gửi yêu cầu đó lại cho máy chủ, 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 mỗi lần duy nhất được loại tẻ nhạt, và tại sao tôi cần để kéo xuống tiêu đề một lần nữa, và chân một lần nữa, và tất cả các yếu tố của trang một lần nữa chỉ để làm mới chúc mừng hoặc thời gian? Vì vậy, đó là lý do tại sao chúng tôi có một cái gì đó như Ajax. 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, Tôi muốn gửi một số dữ liệu đến máy chủ, 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, 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. 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. Máy chủ của bạn có thể không chỉ là kỳ diệu nghe từ hư không. Bạn cần phải có một vị trí cụ thể mà bạn đang gửi dữ liệu này để. 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. 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ế. Và sau đó bạn muốn có một chức năng cơ bản xử lý thành công. 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, và bạn muốn thay đổi tiêu đề của người dùng trên trang của họ. Vì vậy, bạn sẽ nhận được các thông tin trở lại, và bạn sẽ đẩy đó đến màn hình. Điều gì xảy ra, khi trang đã sẵn sàng, 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. Điều này sau đó không có gì, khi nút đó được đẩy, bạn nói chuyện với greetings.php, bạn thực hiện một yêu cầu POST, và bạn nói, hey, làm cho tôi một cái gì đó từ trang của bạn. Chúng tôi không thực sự cần phải mô tả đó, nhưng greetings.php, chúng ta hãy chỉ nói, cho trở lại "hello thế giới." 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, giả sử không có gì sai, thì chúng ta chỉ cần đi đến nơi mục tiêu này mà chúng ta quy định và chúng tôi chỉ dính vào các phản ứng trong đó. Và đây là một cách rất đơn giản thiết lập một truy vấn Ajax. Rất nhanh chóng, Rob loại đề cập này đã có, điều có thể đi sai, những điều xấu có thể xảy ra, vì vậy bạn muốn làm quen với các mã phản hồi HTTP. Những gì đang có chỉ là, như, 200, tất cả mọi thứ đã ổn. Cái gì khác, những điều xấu xảy ra. Đó là nói chung là điều bạn muốn ghi nhớ. Nhưng nó là tốt đẹp để biết tất cả các. Và cuối cùng, một khi chúng ta đã trải qua tất cả điều đó, chúng ta cần phải nói chuyện rất nhanh chóng về thiết kế, và sau đó chúng ta có thể cho tất cả các bạn để lại. Thiết kế. Những điều bạn muốn ghi nhớ. Hãy tự hỏi mình những câu hỏi: Ai sẽ sử dụng điều này? 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? Họ không quan tâm những gì về? Bạn chỉ không muốn làm cho một ứng dụng và để cho nó chỉ phát triển 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. 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. Làm cho nó dễ dàng. Tất cả điều này cho biết, về cơ bản, 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ế. 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 và làm những gì họ muốn làm. Bạn không muốn họ phải di chuyển 5 trang để có được chức năng chính của trang web của bạn. Nếu Google có 5 trang trước khi bạn có thể tìm kiếm một cái gì đó, không ai có thể sử dụng nó. Và cuối cùng, mẫu giấy, nhóm tập trung. Có thiết kế tốt và thực hành thử nghiệm. Chỉ vì bạn nghĩ rằng nó làm việc cho bạn, không có nghĩa là bất cứ ai khác nghĩ rằng nó hoạt động. Nhưng yeah, đó là nó. [CS50.TV]