1 00:00:00,000 --> 00:00:02,000 [Powered by Google Translate] [6] 2 00:00:02,000 --> 00:00:04,000 [David J. Malan] [Đại học Harvard] 3 00:00:04,000 --> 00:00:08,000 [Đây là CS50.] [CS50.TV] 4 00:00:08,000 --> 00:00:12,000 >> Đây là CS50, và đây là sự bắt đầu của Tuần 6, 5 00:00:12,000 --> 00:00:16,000 do đó, một vài công cụ mới đang có sẵn để bạn có thể tận dụng lợi thế, 6 00:00:16,000 --> 00:00:19,000 là người đầu tiên trong số đó được gọi là CS50 (US). 7 00:00:19,000 --> 00:00:22,000 Tỷ lệ cược là nếu bạn đang như tôi hoặc bất kỳ của những sinh viên giảng dạy, 8 00:00:22,000 --> 00:00:26,000 bạn đã có thể nhìn thấy một chương trình có phong cách có vẻ một chút gì đó như thế này. 9 00:00:26,000 --> 00:00:30,000 Có lẽ bạn bắt đầu cắt giảm một số góc muộn vào ban đêm, hoặc bạn sẽ đối phó với nó sau này, 10 00:00:30,000 --> 00:00:32,000 và sau đó một TF hoặc CA đi qua trong giờ làm việc. 11 00:00:32,000 --> 00:00:34,000 Sau đó, nó sẽ là khó khăn cho chúng tôi để đọc. 12 00:00:34,000 --> 00:00:38,000 Vâng, mã này là đúng cú pháp, và nó sẽ biên dịch, và nó thực sự sẽ chạy. 13 00:00:38,000 --> 00:00:40,000 Nhưng nó chắc chắn không phải là một 5 cho phong cách. 14 00:00:40,000 --> 00:00:45,000 >> Nhưng bây giờ, nếu chúng ta đi vào thư mục này ở đây 15 00:00:45,000 --> 00:00:48,000 và nhận thấy rằng tôi có conditions2.c- 16 00:00:48,000 --> 00:00:55,000 và tôi chạy lệnh này, style50, này conditions2.c tập tin, Enter, 17 00:00:55,000 --> 00:00:57,000 nhận thấy rằng nó thông báo với tôi rằng nó đã được cách điệu. 18 00:00:57,000 --> 00:01:00,000 Gedit nhận thấy rằng tập tin đã được thay đổi trên đĩa, 19 00:01:00,000 --> 00:01:08,000 và nếu tôi nhấp vào tải lại, tất cả các vấn đề của bạn tự động. 20 00:01:08,000 --> 00:01:15,000 [Vỗ tay] 21 00:01:15,000 --> 00:01:17,000 Đó là một trong những điều chúng tôi đã làm vào cuối tuần này. 22 00:01:17,000 --> 00:01:20,000 Nhận ra rằng nó không hoàn hảo bởi vì có một số mã 23 00:01:20,000 --> 00:01:23,000 mà nó chỉ đơn giản là không sẽ có thể phong cách hóa một cách hoàn hảo, 24 00:01:23,000 --> 00:01:26,000 nhưng nhận ra điều này bây giờ là một công cụ mà bạn có thể tận dụng 25 00:01:26,000 --> 00:01:33,000 nếu chỉ để dọn dẹp một số errantly đặt dấu ngoặc nhọn và muốn. 26 00:01:33,000 --> 00:01:36,000 >> Nhưng hấp dẫn hơn tại là CS50 tra. 27 00:01:36,000 --> 00:01:39,000 Với CS50 tra, bạn thực sự có thể thực hiện các bài kiểm tra tính chính xác tương tự 28 00:01:39,000 --> 00:01:42,000 mã riêng của bạn rằng các nghiên cứu sinh giảng dạy có thể. 29 00:01:42,000 --> 00:01:44,000 Đây là một dòng lệnh tiện ích mà đi kèm trong thiết bị 30 00:01:44,000 --> 00:01:46,000 ngay sau khi bạn làm một update50 theo 31 00:01:46,000 --> 00:01:49,000 pset 4 thông số kỹ thuật, và bạn sử dụng nó về cơ bản như thế này. 32 00:01:49,000 --> 00:01:51,000 Bạn chạy check50 lệnh. 33 00:01:51,000 --> 00:01:56,000 Sau đó, bạn vượt qua một đối số dòng lệnh, hay thường được gọi là một switch hoặc một lá cờ. 34 00:01:56,000 --> 00:01:58,000 Nói chung, những thứ có dấu gạch ngang được gọi là một chuyển đổi 35 00:01:58,000 --> 00:02:02,000 một chương trình dòng lệnh, vì vậy c quy định cụ thể 36 00:02:02,000 --> 00:02:04,000 kiểm tra mà bạn muốn chạy. 37 00:02:04,000 --> 00:02:07,000 >> Các bài kiểm tra mà bạn muốn chạy được xác định duy nhất bởi chuỗi này, 38 00:02:07,000 --> 00:02:10,000 2012/pset4/resize. 39 00:02:10,000 --> 00:02:13,000 Nói cách khác, đó chỉ là một chuỗi tùy ý, nhưng độc đáo 40 00:02:13,000 --> 00:02:18,000 mà chúng tôi sử dụng để xác định các bài kiểm tra chính xác pset 4. 41 00:02:18,000 --> 00:02:21,000 Và sau đó bạn chỉ định một danh sách không gian cách nhau của các tập tin mà bạn muốn tải lên 42 00:02:21,000 --> 00:02:24,000 CS50 Kiểm tra phân tích. 43 00:02:24,000 --> 00:02:29,000 Ví dụ, nếu tôi đi vào giải pháp của tôi đây cho resize.c- 44 00:02:29,000 --> 00:02:31,000 hãy để tôi mở ra một thiết bị đầu cuối lớn hơn cửa sổ 45 00:02:31,000 --> 00:02:42,000 và tôi đi trước và chạy chúng ta hãy nói check50-c 2012/pset4/resize, 46 00:02:42,000 --> 00:02:46,000 và sau đó tôi đi trước và chỉ định tên của các tập tin, 47 00:02:46,000 --> 00:02:49,000 resize.c, và sau đó nhấn Enter, nó nén, 48 00:02:49,000 --> 00:02:53,000 nó cập nhật, nó sẽ kiểm tra, và tôi chỉ thất bại một bó toàn bộ các bài kiểm tra. 49 00:02:53,000 --> 00:02:59,000 Một màu đỏ ở trên cùng bên trái nói rằng resize.c và bmp tồn tại. 50 00:02:59,000 --> 00:03:01,000 Đó là thử nghiệm. Đó là câu hỏi chúng tôi hỏi. 51 00:03:01,000 --> 00:03:04,000 Và nó không hài lòng vì câu trả lời là sai. 52 00:03:04,000 --> 00:03:08,000 Các văn bản màu trắng dưới nó cho biết dự kiến ​​sẽ bmp.h tồn tại, và chỉ đơn giản đó là lỗi của tôi. 53 00:03:08,000 --> 00:03:11,000 Tôi quên để tải nó lên, vì vậy tôi cần phải tải cả hai tập tin, 54 00:03:11,000 --> 00:03:14,000 resize.c và bmp.h. 55 00:03:14,000 --> 00:03:17,000 Nhưng bây giờ nhận thấy tất cả các xét nghiệm khác là màu vàng bởi vì họ đã không chạy, 56 00:03:17,000 --> 00:03:21,000 và do đó, các khuôn mặt cười theo chiều dọc bởi vì anh ấy không vui cũng không buồn, 57 00:03:21,000 --> 00:03:25,000 nhưng chúng tôi đã khắc phục vấn đề đó màu đỏ trước khi những người kiểm tra khác sẽ chạy. 58 00:03:25,000 --> 00:03:27,000 >> Hãy để tôi sửa lỗi này. 59 00:03:27,000 --> 00:03:30,000 Hãy để tôi thu nhỏ và chạy lại điều này, thời gian này với bmp.h cũng 60 00:03:30,000 --> 00:03:34,000 trên dòng lệnh, Enter, và bây giờ nếu mọi việc suôn sẻ, 61 00:03:34,000 --> 00:03:38,000 nó sẽ kiểm tra và sau đó trả về một kết quả của việc giữ hơi thở 62 00:03:38,000 --> 00:03:42,000 tất cả các màu xanh lá cây, có nghĩa là tôi đang làm thực sự tốt trên pset 4 cho đến nay. 63 00:03:42,000 --> 00:03:44,000 Bạn có thể xem và suy ra từ các văn bản mô tả ở đây 64 00:03:44,000 --> 00:03:47,000 chính xác những gì chúng tôi thử nghiệm. 65 00:03:47,000 --> 00:03:49,000 Chúng tôi đã thử nghiệm lần đầu tiên làm các tập tin tồn tại? 66 00:03:49,000 --> 00:03:51,000 Sau đó chúng tôi đã thử nghiệm không biên dịch resize.c? 67 00:03:51,000 --> 00:03:58,000 Sau đó, chúng tôi đã thử nghiệm nó không thay đổi kích thước một BMP 1x1-pixel khi n, các yếu tố thay đổi kích cỡ, là 1. 68 00:03:58,000 --> 00:04:01,000 Bây giờ, nếu bạn không có ý tưởng những gì n là, bạn sẽ một khi bạn nhảy vào pset 4, 69 00:04:01,000 --> 00:04:04,000 nhưng mà chỉ đơn giản là một kiểm tra sanity để đảm bảo rằng bạn không phải thay đổi kích thước 70 00:04:04,000 --> 00:04:08,000 một hình ảnh ở tất cả nếu các yếu tố thay đổi kích cỡ 1. 71 00:04:08,000 --> 00:04:14,000 Nếu, ngược lại, nó thay đổi kích thước một điểm ảnh 1x1 đến 1x1 điểm ảnh BMP 2x2 một cách chính xác 72 00:04:14,000 --> 00:04:19,000 khi n là 2, sau đó tương tự như vậy, tôi tạo cho phù hợp. 73 00:04:19,000 --> 00:04:22,000 >> Trong ngắn hạn, điều này có nghĩa là, một, đi qua ngón tay 74 00:04:22,000 --> 00:04:25,000 trong số các phương trình ngay trước khi bạn gửi pset của bạn. 75 00:04:25,000 --> 00:04:28,000 Bạn sẽ biết chính xác những gì TF của bạn sẽ sớm biết 76 00:04:28,000 --> 00:04:30,000 khi bạn đi về gửi một số trong những bộ vấn đề, 77 00:04:30,000 --> 00:04:34,000 và cũng là động lực sư phạm thực sự đặt 78 00:04:34,000 --> 00:04:37,000 cơ hội ở phía trước của bạn để khi bạn biết một ưu tiên 79 00:04:37,000 --> 00:04:39,000 rằng có lỗi trong mã của bạn và kiểm tra không được thông qua, 80 00:04:39,000 --> 00:04:43,000 bạn có thể đặt trong thời gian hiệu quả hơn lên phía trước để giải quyết những vấn đề này 81 00:04:43,000 --> 00:04:45,000 chứ không phải là bị mất điểm, nhận được phản hồi từ TF của bạn, 82 00:04:45,000 --> 00:04:48,000 và sau đó đi, "Ahh," như tôi nên đã tìm ra điều đó. 83 00:04:48,000 --> 00:04:50,000 Bây giờ ít nhất có một công cụ để giúp bạn tìm thấy điều đó. 84 00:04:50,000 --> 00:04:52,000 Nó sẽ không chỉ ra lỗi này là, nhưng nó sẽ cho bạn biết 85 00:04:52,000 --> 00:04:54,000 những gì là triệu chứng của nó. 86 00:04:54,000 --> 00:04:57,000 >> Bây giờ nhận ra các bài kiểm tra không nhất thiết phải đầy đủ. 87 00:04:57,000 --> 00:04:59,000 Chỉ vì bạn có được một màn hình đầy đủ của các khuôn mặt cười màu xanh lá cây 88 00:04:59,000 --> 00:05:02,000 không có nghĩa là mã của bạn là hoàn hảo, nhưng nó có nghĩa là 89 00:05:02,000 --> 00:05:06,000 đó đã vượt qua các xét nghiệm nhất định theo quy định của spec. 90 00:05:06,000 --> 00:05:08,000 Đôi khi chúng ta sẽ không phát hành kiểm tra. 91 00:05:08,000 --> 00:05:10,000 Ví dụ, whodunit, một trong những khía cạnh của pset 4, 92 00:05:10,000 --> 00:05:15,000 là loại đáng thất vọng nếu chúng tôi cung cấp cho bạn 93 00:05:15,000 --> 00:05:18,000 câu trả lời là những gì nó được, và có một số cách để tiết lộ 94 00:05:18,000 --> 00:05:21,000 người đó là ai trong đó tiếng ồn màu đỏ. 95 00:05:21,000 --> 00:05:24,000 Các spec sẽ luôn luôn xác định trong tương lai cho pset 5 trở đi 96 00:05:24,000 --> 00:05:26,000 những gì kiểm tra tồn tại cho bạn. 97 00:05:26,000 --> 00:05:28,000 Bạn sẽ nhận thấy có URL này màu trắng ở phía dưới. 98 00:05:28,000 --> 00:05:30,000 Để bây giờ, điều này chỉ là chẩn đoán đầu ra. 99 00:05:30,000 --> 00:05:33,000 Nếu bạn truy cập URL đó, bạn sẽ nhận được một bó toàn phát điên, thông điệp khó hiểu 100 00:05:33,000 --> 00:05:36,000 bạn đang chào đón để xem xét thông qua, nhưng chủ yếu là cho nhân viên 101 00:05:36,000 --> 00:05:41,000 để chúng tôi có thể chẩn đoán và debug lỗi trong check50 bản thân. 102 00:05:41,000 --> 00:05:46,000 >> Nếu không có ado, hãy di chuyển đến nơi chúng tôi rời đi. 103 00:05:46,000 --> 00:05:48,000 CS50 thư viện chúng tôi đã cho một vài tuần, 104 00:05:48,000 --> 00:05:52,000 nhưng sau đó tuần trước, chúng tôi bắt đầu hé một trong các lớp của nó. 105 00:05:52,000 --> 00:05:55,000 Chúng tôi bắt đầu gạt sang một bên chuỗi ủng hộ của những gì thay vì? 106 00:05:55,000 --> 00:05:57,000 [Sinh viên] Char. 107 00:05:57,000 --> 00:05:59,000 Char *, mà đã được một char * tất cả thời gian này, 108 00:05:59,000 --> 00:06:03,000 nhưng bây giờ chúng tôi không phải giả vờ rằng đó là một chuỗi dữ liệu loại thực tế. 109 00:06:03,000 --> 00:06:06,000 Thay vào đó, nó được một từ đồng nghĩa của các loại char *, 110 00:06:06,000 --> 00:06:09,000 và một chuỗi là một chuỗi các ký tự, 111 00:06:09,000 --> 00:06:14,000 vậy tại sao không làm cho tinh thần để đại diện cho chuỗi như là char * s? 112 00:06:14,000 --> 00:06:20,000 Một char * đại diện cho điều gì trong bối cảnh này khái niệm của một chuỗi? 113 00:06:20,000 --> 00:06:23,000 Vâng >> [Sinh viên] Các ký tự đầu tiên. 114 00:06:23,000 --> 00:06:25,000 Tốt, ký tự đầu tiên, nhưng không hẳn là nhân vật đầu tiên. 115 00:06:25,000 --> 00:06:27,000 [Sinh viên] Địa chỉ. 116 00:06:27,000 --> 00:06:29,000 Tốt, địa chỉ của ký tự đầu tiên. 117 00:06:29,000 --> 00:06:33,000 Tất cả đó là cần thiết để đại diện cho một chuỗi trong bộ nhớ của máy vi tính 118 00:06:33,000 --> 00:06:36,000 chỉ là địa chỉ duy nhất của byte đầu tiên của nó. 119 00:06:36,000 --> 00:06:38,000 Bạn thậm chí không có biết bao lâu nó 120 00:06:38,000 --> 00:06:42,000 bởi vì làm thế nào bạn có thể tìm ra động? 121 00:06:42,000 --> 00:06:44,000 [Sinh viên] chuỗi dài. 122 00:06:44,000 --> 00:06:48,000 Bạn có thể gọi chiều dài chuỗi, tuyệt vời, nhưng làm thế nào không làm việc chiều dài chuỗi? 123 00:06:48,000 --> 00:06:50,000 Làm gì? Yeah. 124 00:06:50,000 --> 00:06:52,000 [Sinh viên] Tiếp tục đi cho đến khi bạn nhận được các ký tự null. 125 00:06:52,000 --> 00:06:54,000 Yeah, chính xác, nó chỉ lặp đi lặp lại với một vòng lặp for, vòng lặp trong khi, 126 00:06:54,000 --> 00:06:57,000 bất cứ điều gì từ * đến cùng, và cuối cùng là đại diện 127 00:06:57,000 --> 00:07:01,000 \ 0, cái gọi là nhân vật nul, nul, 128 00:07:01,000 --> 00:07:05,000 không nên nhầm lẫn với null, mà là một con trỏ, 129 00:07:05,000 --> 00:07:07,000 sẽ đi lên trong cuộc trò chuyện ngày hôm nay. 130 00:07:07,000 --> 00:07:11,000 >> Chúng tôi bóc vỏ lại một lớp getInt, và sau đó chúng tôi đã xem xét GetString, 131 00:07:11,000 --> 00:07:14,000 và nhớ lại rằng cả hai những chức năng, hoặc thực sự, 132 00:07:14,000 --> 00:07:18,000 GetString, bằng cách sử dụng một chức năng nhất định 133 00:07:18,000 --> 00:07:21,000 thực sự phân tích, đó là, đọc hoặc phân tích, đầu vào của người dùng. 134 00:07:21,000 --> 00:07:25,000 Và đó là chức năng mới là gì? 135 00:07:25,000 --> 00:07:27,000 Scanf hoặc sscanf. Nó thực sự đến trong một vài hương vị khác nhau. 136 00:07:27,000 --> 00:07:31,000 Có scanf, có sscanf, có fscanf. 137 00:07:31,000 --> 00:07:35,000 Để bây giờ, mặc dù, chúng ta hãy tập trung vào một trong những cách dễ dàng nhất minh họa, 138 00:07:35,000 --> 00:07:38,000 và cho tôi đi trước và mở ra trong thiết bị 139 00:07:38,000 --> 00:07:41,000 một tập tin như thế này, scanf1.c. 140 00:07:41,000 --> 00:07:43,000 Đây là một chương trình đơn giản siêu, 141 00:07:43,000 --> 00:07:46,000 nhưng điều đó một cái gì đó mà chúng tôi đã không bao giờ thực hiện 142 00:07:46,000 --> 00:07:48,000 mà không có sự giúp đỡ của các thư viện CS50. 143 00:07:48,000 --> 00:07:51,000 Điều này được một int từ người sử dụng. Nó hoạt động như thế nào? 144 00:07:51,000 --> 00:07:53,000 Vâng, trong dòng 16 đó, 145 00:07:53,000 --> 00:07:56,000 nhận thấy rằng chúng ta khai báo một x được gọi là int, và vào thời điểm này trong câu chuyện, 146 00:07:56,000 --> 00:07:58,000 giá trị của x là gì? 147 00:07:58,000 --> 00:08:00,000 [Không nghe được sinh viên phản ứng] 148 00:08:00,000 --> 00:08:02,000 [David M. phải, những người hiểu biết, một số giá trị rác có khả năng, vì vậy trong 17, chúng tôi chỉ nói cho người dùng 149 00:08:02,000 --> 00:08:06,000 cung cấp cho tôi một số, xin vui lòng, và bước 18 là nơi nó được thú vị. 150 00:08:06,000 --> 00:08:11,000 Scanf dường như mượn một ý tưởng từ printf trong đó nó sử dụng các mã định dạng trong dấu ngoặc kép. 151 00:08:11,000 --> 00:08:13,000 % D tất nhiên là một số thập phân. 152 00:08:13,000 --> 00:08:21,000 Nhưng tại sao tôi đi qua trong & x thay vì chỉ x? 153 00:08:21,000 --> 00:08:24,000 Trước đây là chính xác. Yeah. 154 00:08:24,000 --> 00:08:26,000 [Không nghe được sinh viên phản ứng] 155 00:08:26,000 --> 00:08:31,000 Chính xác, nếu mục tiêu của chương trình này, như getInt chức năng chính nó, 156 00:08:31,000 --> 00:08:34,000 là để có được một int từ người sử dụng, tôi có thể vượt qua chức năng 157 00:08:34,000 --> 00:08:38,000 tất cả các biến tôi muốn, nhưng nếu tôi không vượt qua chúng bằng cách tham khảo 158 00:08:38,000 --> 00:08:41,000 hoặc theo địa chỉ hay bằng con trỏ, tất cả đồng nghĩa cho các mục đích của ngày hôm nay, 159 00:08:41,000 --> 00:08:46,000 sau đó chức năng mà không có khả năng thay đổi các nội dung của biến đó. 160 00:08:46,000 --> 00:08:49,000 Điều này sẽ vượt qua trong một bản sao giống như các phiên bản lỗi của trao đổi 161 00:08:49,000 --> 00:08:51,000 mà chúng tôi đã nói về một vài lần. 162 00:08:51,000 --> 00:08:54,000 >> Nhưng thay vào đó, bằng cách làm & x, tôi theo nghĩa đen đi qua trong những gì? 163 00:08:54,000 --> 00:08:57,000 [Sinh viên] địa chỉ. >> Địa chỉ của x. 164 00:08:57,000 --> 00:09:01,000 Nó giống như vẽ một bản đồ cho các chức năng được gọi là scanf và nói ở đây, 165 00:09:01,000 --> 00:09:04,000 đây là những hướng dẫn để một đoạn bộ nhớ trong máy tính 166 00:09:04,000 --> 00:09:07,000 mà bạn có thể lưu trữ một số nguyên vào. 167 00:09:07,000 --> 00:09:10,000 Để cho sscanf để làm điều đó 168 00:09:10,000 --> 00:09:13,000 những nhà điều hành, phần của cú pháp là nó sẽ phải sử dụng 169 00:09:13,000 --> 00:09:19,000 dù chúng ta không thể nhìn thấy nó bởi vì người khác đã viết chức năng này? 170 00:09:19,000 --> 00:09:21,000 Nói cách khác - đó là những gì? 171 00:09:21,000 --> 00:09:23,000 [Sinh viên] X đọc. 172 00:09:23,000 --> 00:09:27,000 Có sẽ là một số đọc, nhưng chỉ đối với x ở đây. 173 00:09:27,000 --> 00:09:30,000 Nếu scanf đang được thông qua địa chỉ của x, 174 00:09:30,000 --> 00:09:35,000 cú pháp, những gì nhà điều hành là ràng buộc để tồn tại một nơi nào đó 175 00:09:35,000 --> 00:09:38,000 bên trong thực hiện scanf để scanf 176 00:09:38,000 --> 00:09:42,000 thực sự có thể viết một số 2 đến địa chỉ đó? 177 00:09:42,000 --> 00:09:44,000 Yeah, do đó, các tập tin *. 178 00:09:44,000 --> 00:09:47,000 Nhớ lại rằng * nhà điều hành của chúng tôi tới đích, mà về cơ bản có nghĩa là đi đến đó. 179 00:09:47,000 --> 00:09:50,000 >> Một khi bạn đã được trao một địa chỉ, như là trường hợp ở đây, 180 00:09:50,000 --> 00:09:53,000 scanf có thể nếu chúng ta thực sự nhìn xung quanh nguồn mã 181 00:09:53,000 --> 00:09:59,000 đang làm * x hoặc tương đương để thực sự đi đến địa chỉ đó và đặt một số giá trị ở đó. 182 00:09:59,000 --> 00:10:02,000 Bây giờ, như đối với scanf được đầu vào từ bàn phím, 183 00:10:02,000 --> 00:10:04,000 chúng tôi sẽ vẫy tay của chúng tôi ngày hôm nay. 184 00:10:04,000 --> 00:10:07,000 Chỉ cần giả định rằng hệ thống điều hành cho phép sscanf để nói chuyện 185 00:10:07,000 --> 00:10:11,000 bàn phím của người sử dụng, nhưng vào thời điểm này trong dòng 19, 186 00:10:11,000 --> 00:10:14,000 khi chúng tôi chỉ đơn giản là in ra x, nó có vẻ là trường hợp 187 00:10:14,000 --> 00:10:17,000 scanf đã đặt một int trong x. 188 00:10:17,000 --> 00:10:19,000 Đó là chính xác scanf hoạt động như thế nào, và nhớ lại tuần trước 189 00:10:19,000 --> 00:10:25,000 đó chính là GetString và getInt và gia đình của các chức năng khác của nó 190 00:10:25,000 --> 00:10:28,000 cuối cùng hoạt động, mặc dù với phương sai nhẹ như sscanf, 191 00:10:28,000 --> 00:10:31,000 có nghĩa là quét một chuỗi thay vì bàn phím. 192 00:10:31,000 --> 00:10:33,000 Nhưng chúng ta hãy xem xét một phương sai nhỏ này. 193 00:10:33,000 --> 00:10:37,000 Năm scanf2, tôi thực sự hơi say lên. 194 00:10:37,000 --> 00:10:42,000 Điều gì là sai và tôi sẽ ẩn các bình luận giải thích càng nhiều 195 00:10:42,000 --> 00:10:47,000 những gì là sai với chương trình này, phiên bản 2? 196 00:10:47,000 --> 00:10:55,000 Hãy là kỹ thuật có thể thời gian này. 197 00:10:55,000 --> 00:10:57,000 Nó trông khá tốt. 198 00:10:57,000 --> 00:11:03,000 Nó độc đáo thụt vào, nhưng 199 00:11:03,000 --> 00:11:07,000 okay, làm thế nào về chúng ta hãy tỉa nó xuống cho các câu hỏi ngắn hơn? 200 00:11:07,000 --> 00:11:17,000 Line 16. Dòng 16 làm bằng tiếng Anh chính xác nhưng kỹ thuật là gì? 201 00:11:17,000 --> 00:11:20,000 Một chút vụng về. , Michael. 202 00:11:20,000 --> 00:11:25,000 [Sinh viên] Nó chỉ vào chữ cái đầu tiên của một chuỗi. 203 00:11:25,000 --> 00:11:27,000 >> Được rồi, gần gũi. Hãy để tôi tinh chỉnh đó một chút. 204 00:11:27,000 --> 00:11:33,000 Chỉ vào chữ cái đầu tiên của một chuỗi, bạn đang khai báo một biến gọi là bộ đệm 205 00:11:33,000 --> 00:11:36,000 sẽ trỏ đến địa chỉ đầu tiên của một chuỗi, 206 00:11:36,000 --> 00:11:39,000 hay đúng hơn, mà sẽ chỉ cụ thể hơn đến một char. 207 00:11:39,000 --> 00:11:42,000 Nhận thấy nó không thực sự chỉ bất cứ nơi nào bởi vì không có nhà điều hành phân công. 208 00:11:42,000 --> 00:11:46,000 Không có dấu bằng, do đó, tất cả những gì chúng ta đang làm là phân bổ các bộ đệm được gọi là biến. 209 00:11:46,000 --> 00:11:49,000 Nó sẽ xảy ra là 32 bit bởi vì nó là một con trỏ, 210 00:11:49,000 --> 00:11:52,000 và các nội dung của bộ đệm có lẽ là cuối cùng 211 00:11:52,000 --> 00:11:57,000 sẽ chứa một địa chỉ của một char, nhưng bây giờ, bộ đệm có chứa gì? 212 00:11:57,000 --> 00:11:59,000 Chỉ cần một số những người hiểu biết, không có thật một số giá trị rác, 213 00:11:59,000 --> 00:12:03,000 vì chúng ta đã không rõ ràng khởi tạo nó, vì vậy chúng ta không nên giả định bất cứ điều gì. 214 00:12:03,000 --> 00:12:06,000 Được rồi, vì vậy bây giờ dòng 17-những gì dòng 17 này làm gì? 215 00:12:06,000 --> 00:12:08,000 Có lẽ đó sẽ ấm lên này. 216 00:12:08,000 --> 00:12:10,000 Nó in một chuỗi, phải không? 217 00:12:10,000 --> 00:12:12,000 Nó in chuỗi xin vui lòng. 218 00:12:12,000 --> 00:12:15,000 >> Dòng 18 là loại quen thuộc mà chúng ta chỉ thấy một phương sai của 219 00:12:15,000 --> 00:12:18,000 nhưng với một mã định dạng khác nhau, do đó, ở dòng 18, 220 00:12:18,000 --> 00:12:23,000 chúng ta đang nói với scanf ở đây là địa chỉ của một đoạn bộ nhớ. 221 00:12:23,000 --> 00:12:27,000 Tôi muốn bạn để gọi trong một chuỗi, như ngụ ý của% s, 222 00:12:27,000 --> 00:12:32,000 nhưng vấn đề là chúng tôi đã không được thực hiện một vài điều ở đây. 223 00:12:32,000 --> 00:12:35,000 Một trong những vấn đề là gì? 224 00:12:35,000 --> 00:12:38,000 [Sinh viên] Đó là cố gắng dereference một con trỏ null. 225 00:12:38,000 --> 00:12:41,000 Tốt, con trỏ null hoặc nếu không thì chưa biết. 226 00:12:41,000 --> 00:12:45,000 Bạn đang giao scanf một địa chỉ, nhưng bạn chỉ cần nói một chút thời gian trước đây 227 00:12:45,000 --> 00:12:49,000 địa chỉ đó là một số giá trị rác bởi vì chúng tôi đã không thực sự gán nó cho bất cứ điều gì, 228 00:12:49,000 --> 00:12:53,000 và do đó bạn đang nói với scanf hiệu quả đặt một chuỗi ở đây, 229 00:12:53,000 --> 00:12:56,000 nhưng chúng tôi không biết nơi nào là, 230 00:12:56,000 --> 00:12:59,000 vì vậy chúng tôi đã không thực sự cấp phát bộ nhớ cho bộ đệm. 231 00:12:59,000 --> 00:13:03,000 Hơn nữa, bạn là gì cũng không phải nói cho các scanf? 232 00:13:03,000 --> 00:13:06,000 Giả sử đây là một đoạn bộ nhớ, và đó không phải là một giá trị rác, 233 00:13:06,000 --> 00:13:09,000 nhưng bạn vẫn không nói cho scanf một cái gì đó quan trọng. 234 00:13:09,000 --> 00:13:12,000 [Sinh viên Trường hợp thực sự là, các ký hiệu. 235 00:13:12,000 --> 00:13:15,000 Ký hiệu, do đó, trong trường hợp này, đó là okay. 236 00:13:15,000 --> 00:13:18,000 Bởi vì bộ đệm đã được khai báo như một con trỏ 237 00:13:18,000 --> 00:13:22,000 với các mảnh * cú pháp, chúng ta không cần phải sử dụng ký hiệu " 238 00:13:22,000 --> 00:13:25,000 bởi vì nó đã được một địa chỉ, nhưng tôi nghĩ rằng tôi nghe thấy nó ở đây. 239 00:13:25,000 --> 00:13:27,000 [Sinh viên] Làm thế nào lớn là nó? 240 00:13:27,000 --> 00:13:29,000 Tốt, chúng ta không nói cho scanf lớn như thế nào bộ đệm này, 241 00:13:29,000 --> 00:13:32,000 có nghĩa là ngay cả khi bộ đệm là một con trỏ, 242 00:13:32,000 --> 00:13:35,000 chúng tôi đang nói scanf, đặt một chuỗi ở đây, 243 00:13:35,000 --> 00:13:38,000 nhưng ở đây có thể là 2 byte, nó có thể là 10 byte, nó có thể là một megabyte. 244 00:13:38,000 --> 00:13:41,000 Scanf không có ý tưởng, và bởi vì đây là một đoạn bộ nhớ 245 00:13:41,000 --> 00:13:43,000 có lẽ, nó không phải là một chuỗi nào. 246 00:13:43,000 --> 00:13:48,000 Nó chỉ là một chuỗi khi bạn viết các ký tự và 0 \ rằng đoạn bộ nhớ. 247 00:13:48,000 --> 00:13:51,000 Bây giờ nó chỉ là một số đoạn bộ nhớ. 248 00:13:51,000 --> 00:13:55,000 Scanf sẽ không biết khi nào dừng lại bằng văn bản đến địa chỉ đó. 249 00:13:55,000 --> 00:13:59,000 >> Nếu bạn nhớ lại một số ví dụ trong quá khứ mà tôi ngẫu nhiên gõ trên bàn phím 250 00:13:59,000 --> 00:14:03,000 cố gắng tràn bộ đệm, và chúng tôi nói chuyện hôm thứ Sáu về chính xác điều đó. 251 00:14:03,000 --> 00:14:07,000 Nếu một kẻ thù nào đó tiêm vào chương trình của bạn một từ lớn hơn nhiều 252 00:14:07,000 --> 00:14:10,000 hoặc câu hoặc cụm từ sau đó bạn đã hy vọng bạn có thể bị tàn phá 253 00:14:10,000 --> 00:14:13,000 một đoạn bộ nhớ, có thể có hậu quả xấu, 254 00:14:13,000 --> 00:14:15,000 giống như chiếm toàn bộ chương trình của chính nó. 255 00:14:15,000 --> 00:14:17,000 Chúng ta cần để sửa lỗi này bằng cách nào đó. 256 00:14:17,000 --> 00:14:20,000 Hãy để tôi thu nhỏ và đi vào phiên bản 3 của chương trình này. 257 00:14:20,000 --> 00:14:22,000 Đó là một chút tốt hơn. 258 00:14:22,000 --> 00:14:24,000 Trong phiên bản này, nhận thấy sự khác biệt. 259 00:14:24,000 --> 00:14:27,000 Trong dòng 16, tôi đang một lần nữa tuyên bố một bộ đệm được gọi là biến, 260 00:14:27,000 --> 00:14:29,000 nhưng nó là gì bây giờ? 261 00:14:29,000 --> 00:14:33,000 Nó là một mảng của 16 ký tự. 262 00:14:33,000 --> 00:14:36,000 Điều này là tốt bởi vì điều này có nghĩa là bây giờ tôi có thể nói với scanf 263 00:14:36,000 --> 00:14:39,000 đây là một đoạn thực tế của bộ nhớ. 264 00:14:39,000 --> 00:14:42,000 Bạn gần như có thể suy nghĩ của mảng là con trỏ tại, 265 00:14:42,000 --> 00:14:44,000 mặc dù chúng không thực sự tương đương. 266 00:14:44,000 --> 00:14:47,000 Họ sẽ hành xử khác nhau trong các ngữ cảnh khác nhau. 267 00:14:47,000 --> 00:14:50,000 Nhưng nó chắc chắn là trường hợp mà bộ đệm là tham khảo 268 00:14:50,000 --> 00:14:53,000 16 ký tự tiếp giáp bởi vì đó là một mảng 269 00:14:53,000 --> 00:14:55,000 và đã được cho một vài tuần. 270 00:14:55,000 --> 00:14:59,000 >> Ở đây, tôi đang nói với scanf đây là một đoạn bộ nhớ. 271 00:14:59,000 --> 00:15:01,000 Thời gian này, nó thực sự là một đoạn bộ nhớ, 272 00:15:01,000 --> 00:15:07,000 nhưng tại sao chương trình này vẫn khai thác? 273 00:15:07,000 --> 00:15:11,000 Có gì sai vẫn còn? 274 00:15:11,000 --> 00:15:14,000 Tôi đã nói cho tôi 16 byte nhưng- 275 00:15:14,000 --> 00:15:16,000 [Sinh viên] nếu họ gõ trong hơn 16? 276 00:15:16,000 --> 00:15:20,000 Chính xác, điều gì sẽ xảy ra nếu người sử dụng các loại trong 17 ký tự hoặc ký tự 1700? 277 00:15:20,000 --> 00:15:23,000 Trong thực tế, chúng ta hãy xem nếu chúng ta có thể không đi qua sai lầm này. 278 00:15:23,000 --> 00:15:25,000 Nó là tốt hơn nhưng không hoàn hảo. 279 00:15:25,000 --> 00:15:28,000 Hãy để tôi đi trước và chạy làm cho scanf3 để biên dịch chương trình này. 280 00:15:28,000 --> 00:15:34,000 Hãy để tôi chạy scanf3, String xin vui lòng: hello, và chúng tôi dường như sẽ ổn. 281 00:15:34,000 --> 00:15:37,000 Hãy để tôi thử một hơi dài, chào anh. 282 00:15:37,000 --> 00:15:42,000 Được rồi, chúng ta hãy làm hello there làm thế nào bạn có ngày hôm nay, Enter. 283 00:15:42,000 --> 00:15:54,000 Bắt loại may mắn ở đây, chúng ta hãy nói rằng hello there thế nào là bạn. 284 00:15:54,000 --> 00:15:56,000 Chết tiệt. 285 00:15:56,000 --> 00:16:03,000 Được rồi, vì vậy chúng tôi đã may mắn. Hãy xem nếu chúng ta không có thể sửa lỗi này. 286 00:16:03,000 --> 00:16:06,000 Không, nó sẽ không để cho tôi sao chép. 287 00:16:06,000 --> 00:16:09,000 Hãy thử điều này một lần nữa. 288 00:16:09,000 --> 00:16:12,000 Được rồi, stand by. 289 00:16:12,000 --> 00:16:20,000 Chúng ta sẽ thấy bao lâu tôi có thể giả vờ tập trung trong khi vẫn làm điều này. 290 00:16:20,000 --> 00:16:23,000 Chết tiệt. Đó là khá thích hợp, thực sự. 291 00:16:23,000 --> 00:16:26,000 Hiện chúng tôi đi. 292 00:16:26,000 --> 00:16:30,000 Điểm thực hiện. 293 00:16:30,000 --> 00:16:34,000 >> Này, xấu hổ mặc dù nó cũng là, nó cũng là một trong những nguồn của sự nhầm lẫn rất lớn 294 00:16:34,000 --> 00:16:38,000 khi viết các chương trình có lỗi bởi vì họ tự biểu hiện 295 00:16:38,000 --> 00:16:40,000 chỉ một lần trong một thời gian đôi khi. 296 00:16:40,000 --> 00:16:43,000 Thực tế là ngay cả khi mã của bạn là hoàn toàn bị phá vỡ, 297 00:16:43,000 --> 00:16:46,000 nó chỉ có thể được hoàn toàn bị phá vỡ một lần trong một thời gian 298 00:16:46,000 --> 00:16:49,000 bởi vì đôi khi, về cơ bản những gì xảy ra là hệ thống điều hành giao 299 00:16:49,000 --> 00:16:52,000 thêm một ít bộ nhớ hơn bạn thực sự cần thiết vì lý do gì, 300 00:16:52,000 --> 00:16:57,000 và do đó không ai khác là sử dụng bộ nhớ ngay sau khi đoạn 16 ký tự, 301 00:16:57,000 --> 00:17:01,000 vì vậy nếu bạn đi đến 17, 18, 19, bất cứ điều gì, nó không phải là một thỏa thuận lớn như vậy. 302 00:17:01,000 --> 00:17:04,000 Bây giờ, máy tính, ngay cả khi nó không sụp đổ tại thời điểm đó, 303 00:17:04,000 --> 00:17:09,000 cuối cùng có thể sử dụng 17 hoặc 18 hoặc 19 số byte cho cái gì khác, 304 00:17:09,000 --> 00:17:14,000 điểm mà tại đó dữ liệu của bạn mà bạn đặt ở đó, mặc dù quá dài, 305 00:17:14,000 --> 00:17:18,000 sẽ có khả năng bị ghi đè bởi một số chức năng khác. 306 00:17:18,000 --> 00:17:21,000 Nó không nhất thiết sẽ vẫn còn nguyên vẹn, 307 00:17:21,000 --> 00:17:23,000 nhưng nó sẽ không nhất thiết phải gây ra một lỗi seg. 308 00:17:23,000 --> 00:17:26,000 Tuy nhiên, trong trường hợp này, cuối cùng tôi cung cấp đủ ký tự 309 00:17:26,000 --> 00:17:29,000 Tôi chủ yếu vượt quá phân đoạn bộ nhớ, và bam, 310 00:17:29,000 --> 00:17:33,000 hệ điều hành nói: "Xin lỗi, đó là không có lỗi phân khúc tốt." 311 00:17:33,000 --> 00:17:38,000 >> Và chúng ta thấy bây giờ những gì còn lại trong thư mục- 312 00:17:38,000 --> 00:17:40,000 nhận thấy rằng tôi có tập tin này ở đây, cốt lõi. 313 00:17:40,000 --> 00:17:42,000 Chú ý rằng điều này một lần nữa được gọi là một bãi chứa lõi. 314 00:17:42,000 --> 00:17:46,000 Đó là bản chất là một tập tin có chứa các nội dung của bộ nhớ chương trình của bạn 315 00:17:46,000 --> 00:17:48,000 tại điểm mà tại đó nó đã bị rơi, 316 00:17:48,000 --> 00:17:51,000 và chỉ cần thử một ví dụ nhỏ ở đây cho tôi đi ở đây 317 00:17:51,000 --> 00:17:57,000 và chạy gdb ngày scanf3 và sau đó xác định một đối số thứ ba được gọi là cốt lõi, 318 00:17:57,000 --> 00:18:01,000 và chú ý ở đây là nếu tôi liệt kê các mã, 319 00:18:01,000 --> 00:18:06,000 chúng ta sẽ có thể như bình thường với gdb để bắt đầu đi bộ thông qua chương trình này, 320 00:18:06,000 --> 00:18:10,000 và tôi có thể chạy nó và ngay sau khi tôi nhấn như với các lệnh bước trong gdb 321 00:18:10,000 --> 00:18:13,000 ngay sau khi tôi nhấn hàng có khả năng lỗi sau khi gõ vào một chuỗi rất lớn, 322 00:18:13,000 --> 00:18:16,000 Tôi sẽ có thể thực sự xác định nó ở đây. 323 00:18:16,000 --> 00:18:19,000 Thêm về điều này, tuy nhiên, trong phần về bãi lõi 324 00:18:19,000 --> 00:18:22,000 và như thế để bạn thực sự có thể poke xung quanh bên trong của các bãi chứa lõi 325 00:18:22,000 --> 00:18:27,000 và nhìn thấy trên những dòng chương trình không thành công bạn. 326 00:18:27,000 --> 00:18:32,000 Bất kỳ câu hỏi sau đó trên con trỏ và trên các địa chỉ? 327 00:18:32,000 --> 00:18:36,000 Bởi vì ngày hôm nay trên, chúng ta sẽ bắt đầu dùng cho rằng những điều này tồn tại 328 00:18:36,000 --> 00:18:40,000 và chúng ta biết chính xác những gì họ đang. 329 00:18:40,000 --> 00:18:42,000 Vâng. 330 00:18:42,000 --> 00:18:46,000 >> [Sinh viên] Làm thế nào đến bạn không có để đặt một dấu "và" bên cạnh phần 331 00:18:46,000 --> 00:18:48,000 Tốt câu hỏi. 332 00:18:48,000 --> 00:18:51,000 Làm thế nào đến tôi đã không cần phải đặt một dấu "và" bên cạnh các mảng ký tự như tôi đã làm trước đây 333 00:18:51,000 --> 00:18:53,000 với hầu hết các ví dụ của chúng tôi? 334 00:18:53,000 --> 00:18:55,000 Câu trả lời ngắn gọn là mảng là một chút đặc biệt. 335 00:18:55,000 --> 00:18:59,000 Bạn gần như có thể nghĩ rằng một bộ đệm là thực sự là một địa chỉ, 336 00:18:59,000 --> 00:19:03,000 và nó chỉ như vậy sẽ xảy ra là trường hợp các ký hiệu khung hình vuông 337 00:19:03,000 --> 00:19:06,000 là một sự thuận tiện để chúng ta có thể đi vào 0 khung, khung 1, 338 00:19:06,000 --> 00:19:10,000 2 khung, mà không cần phải sử dụng các ký hiệu *. 339 00:19:10,000 --> 00:19:13,000 Đó là một chút của một lời nói dối bởi vì mảng và con trỏ 340 00:19:13,000 --> 00:19:17,000 , trên thực tế, một chút khác nhau, nhưng họ có thể thường xuyên nhưng không luôn luôn được sử dụng thay thế cho nhau. 341 00:19:17,000 --> 00:19:21,000 Trong ngắn hạn, khi một chức năng được mong đợi một con trỏ đến một đoạn bộ nhớ, 342 00:19:21,000 --> 00:19:24,000 bạn có thể vượt qua nó một địa chỉ đã được trả lại bởi malloc, 343 00:19:24,000 --> 00:19:29,000 và chúng tôi sẽ xem malloc một lần nữa trước khi dài, hoặc bạn có thể vượt qua nó tên của một mảng. 344 00:19:29,000 --> 00:19:32,000 Bạn không phải để làm ký hiệu với mảng bởi vì họ đã 345 00:19:32,000 --> 00:19:34,000 cơ bản như địa chỉ. 346 00:19:34,000 --> 00:19:36,000 Đó là một ngoại lệ. 347 00:19:36,000 --> 00:19:39,000 Các dấu ngoặc vuông làm cho họ đặc biệt. 348 00:19:39,000 --> 00:19:41,000 >> Bạn có thể đặt một dấu "và" bên cạnh các bộ đệm? 349 00:19:41,000 --> 00:19:43,000 Không phải trong trường hợp này. 350 00:19:43,000 --> 00:19:46,000 Điều đó sẽ không làm việc vì, một lần nữa, trong trường hợp này góc 351 00:19:46,000 --> 00:19:49,000 nơi mà mảng là không hoàn toàn thực tế địa chỉ. 352 00:19:49,000 --> 00:19:54,000 Nhưng chúng ta có lẽ sẽ trở lại mà chẳng bao lâu với các ví dụ khác. 353 00:19:54,000 --> 00:19:56,000 Hãy cố gắng giải quyết một vấn đề ở đây. 354 00:19:56,000 --> 00:20:00,000 Chúng tôi có một cấu trúc dữ liệu mà chúng tôi đã được sử dụng cho một thời gian được biết đến như là một mảng. 355 00:20:00,000 --> 00:20:02,000 Trường hợp tại điểm, đó là những gì chúng tôi chỉ có. 356 00:20:02,000 --> 00:20:04,000 Tuy nhiên, các mảng có một số mặt tích cực và nhược điểm. 357 00:20:04,000 --> 00:20:06,000 Mảng là lý do tại sao tốt đẹp? 358 00:20:06,000 --> 00:20:11,000 Một điều mà bạn thích đến mức bạn thích mảng về mảng là gì? 359 00:20:11,000 --> 00:20:13,000 Có gì thuận lợi về họ? Có gì hấp dẫn? 360 00:20:13,000 --> 00:20:18,000 Tại sao chúng tôi giới thiệu chúng ở nơi đầu tiên? 361 00:20:18,000 --> 00:20:20,000 Yeah. 362 00:20:20,000 --> 00:20:27,000 [Sinh viên] Họ có thể lưu trữ rất nhiều dữ liệu, và bạn không cần phải sử dụng một điều toàn bộ. 363 00:20:27,000 --> 00:20:29,000 Bạn có thể sử dụng một phần. 364 00:20:29,000 --> 00:20:32,000 Tốt, với một mảng, bạn có thể lưu trữ rất nhiều dữ liệu, 365 00:20:32,000 --> 00:20:35,000 và bạn không nhất thiết phải sử dụng tất cả của nó, vì vậy bạn có thể overallocate, 366 00:20:35,000 --> 00:20:39,000 mà có thể là thuận tiện nếu bạn không biết trước bao nhiêu một cái gì đó để mong đợi. 367 00:20:39,000 --> 00:20:41,000 >> GetString là một ví dụ hoàn hảo. 368 00:20:41,000 --> 00:20:44,000 GetString, bằng văn bản của chúng tôi, không có ý tưởng bao nhiêu ký tự mong, 369 00:20:44,000 --> 00:20:48,000 do đó, thực tế là chúng ta có thể phân bổ khối bộ nhớ tiếp giáp là tốt. 370 00:20:48,000 --> 00:20:51,000 Mảng còn giải quyết một vấn đề chúng ta đã thấy một vài tuần trước đây bây giờ 371 00:20:51,000 --> 00:20:54,000 nơi mã của bạn bắt đầu phân cấp thành một cái gì đó rất được thiết kế kém. 372 00:20:54,000 --> 00:20:57,000 Nhớ lại mà tôi tạo ra một cấu trúc sinh viên gọi là David, 373 00:20:57,000 --> 00:21:00,000 và sau đó là thực sự là một thay thế, mặc dù, 374 00:21:00,000 --> 00:21:04,000 để có một tên gọi là biến và biến khác được gọi là, tôi nghĩ rằng, nhà ở, 375 00:21:04,000 --> 00:21:08,000 và một biến khác được gọi là ID bởi vì trong câu chuyện mà tôi muốn giới thiệu một cái gì đó khác 376 00:21:08,000 --> 00:21:11,000 như Rob vào chương trình, do đó, sau đó tôi quyết định chờ một phút, 377 00:21:11,000 --> 00:21:13,000 Tôi cần phải đổi tên các biến này. 378 00:21:13,000 --> 00:21:16,000 Hãy gọi tôi name1, ID1, house1. 379 00:21:16,000 --> 00:21:20,000 Hãy gọi của Rob name2, house2, ID2. 380 00:21:20,000 --> 00:21:22,000 Nhưng sau đó chờ một phút, những gì về Tommy? 381 00:21:22,000 --> 00:21:24,000 Sau đó, chúng tôi đã có thêm ba biến. 382 00:21:24,000 --> 00:21:27,000 Chúng tôi giới thiệu một người khác, bốn bộ của các biến. 383 00:21:27,000 --> 00:21:30,000 Thế giới bắt đầu nhận được lộn xộn rất nhanh chóng, 384 00:21:30,000 --> 00:21:33,000 vì vậy chúng tôi giới thiệu cấu trúc, và những gì hấp dẫn về một cấu trúc? 385 00:21:33,000 --> 00:21:39,000 Một cấu trúc C không cho bạn làm gì? 386 00:21:39,000 --> 00:21:42,000 Nó thực sự khó xử hôm nay. 387 00:21:42,000 --> 00:21:44,000 Gì >> [không nghe được sinh viên phản ứng] 388 00:21:44,000 --> 00:21:47,000 Yeah, cụ thể, typedef cho phép bạn tạo ra một kiểu dữ liệu mới, 389 00:21:47,000 --> 00:21:51,000 và cấu trúc, từ khoá struct, cho phép bạn đóng gói 390 00:21:51,000 --> 00:21:54,000 khái niệm liên quan mẩu dữ liệu với nhau 391 00:21:54,000 --> 00:21:56,000 và sau đó gọi cho họ một cái gì đó giống như một học sinh. 392 00:21:56,000 --> 00:21:58,000 >> Đó là bởi vì bây giờ chúng ta có thể mô hình 393 00:21:58,000 --> 00:22:03,000 nhiều loại khái niệm nhất quán các khái niệm của một học sinh trong một biến 394 00:22:03,000 --> 00:22:07,000 chứ không phải là tùy tiện có một cho một chuỗi, một cho một ID, và vv. 395 00:22:07,000 --> 00:22:10,000 Mảng là tốt đẹp bởi vì chúng cho phép chúng tôi bắt đầu làm sạch mã của chúng tôi. 396 00:22:10,000 --> 00:22:13,000 Tuy nhiên, một nhược điểm là những gì của một mảng? 397 00:22:13,000 --> 00:22:15,000 Bạn có thể làm gì? Yeah. 398 00:22:15,000 --> 00:22:17,000 [Sinh viên] Bạn phải biết nó là lớn như thế nào. 399 00:22:17,000 --> 00:22:19,000 Bạn phải biết nó là lớn như thế nào, do đó, nó là loại đau đớn. 400 00:22:19,000 --> 00:22:21,000 Những người bạn có kinh nghiệm lập trình trước khi biết rằng trong rất nhiều ngôn ngữ, 401 00:22:21,000 --> 00:22:24,000 như Java, bạn có thể yêu cầu một đoạn bộ nhớ, đặc biệt là một mảng, 402 00:22:24,000 --> 00:22:28,000 lớn như thế nào, với chiều dài, tài sản, do đó, để nói chuyện, và đó là thực sự thuận tiện. 403 00:22:28,000 --> 00:22:32,000 Trong C, bạn có thể không thậm chí gọi strlen trên một mảng chung 404 00:22:32,000 --> 00:22:35,000 bởi vì strlen, như từ nó, chỉ là cho các chuỗi, 405 00:22:35,000 --> 00:22:39,000 và bạn có thể tìm ra chiều dài của một chuỗi vì quy ước của con người 406 00:22:39,000 --> 00:22:43,000 có 0 \, nhưng một mảng, tổng quát hơn, chỉ là một đoạn bộ nhớ. 407 00:22:43,000 --> 00:22:46,000 Nếu nó là một mảng ints, sẽ không có một số ký tự đặc biệt 408 00:22:46,000 --> 00:22:48,000 ở cuối đang chờ bạn. 409 00:22:48,000 --> 00:22:50,000 Bạn phải nhớ chiều dài của một mảng. 410 00:22:50,000 --> 00:22:54,000 Một nhược điểm của một mảng nuôi đầu của nó trong getString chính nó. 411 00:22:54,000 --> 00:22:59,000 Nhược điểm khác của một mảng là gì? 412 00:22:59,000 --> 00:23:01,000 Sir, chỉ có bạn và tôi hôm nay. 413 00:23:01,000 --> 00:23:04,000 [Phản ứng sinh viên không nghe được] >> Đó là những gì? 414 00:23:04,000 --> 00:23:06,000 Đó là tuyên bố trên stack. 415 00:23:06,000 --> 00:23:09,000 Được rồi, tuyên bố trên stack. Tại sao bạn không như thế? 416 00:23:09,000 --> 00:23:13,000 [Sinh viên] Bởi vì nó được tái sử dụng. 417 00:23:13,000 --> 00:23:15,000 Nó được tái sử dụng. 418 00:23:15,000 --> 00:23:18,000 Được rồi, nếu bạn sử dụng một mảng để cấp phát bộ nhớ, 419 00:23:18,000 --> 00:23:21,000 bạn không thể, ví dụ, trả lại nó vì nó trên stack. 420 00:23:21,000 --> 00:23:23,000 Được rồi, đó là một bất lợi. 421 00:23:23,000 --> 00:23:25,000 Và làm thế nào về một với một mảng? 422 00:23:25,000 --> 00:23:28,000 Một khi bạn phân bổ nó, bạn đang loại hơi say nếu bạn cần nhiều không gian hơn 423 00:23:28,000 --> 00:23:30,000 hơn mảng đó. 424 00:23:30,000 --> 00:23:34,000 >> Sau đó, chúng tôi giới thiệu, thu hồi, malloc, trong đó đã cho chúng ta khả năng để tự động cấp phát bộ nhớ. 425 00:23:34,000 --> 00:23:37,000 Nhưng điều gì sẽ xảy ra nếu chúng ta đã cố gắng một thế giới khác hoàn toàn? 426 00:23:37,000 --> 00:23:40,000 Điều gì sẽ xảy ra nếu chúng tôi muốn giải quyết một trong những vấn đề 427 00:23:40,000 --> 00:23:45,000 do đó, chúng tôi thay vì bút của tôi đã ngủ ở đây 428 00:23:45,000 --> 00:23:51,000 điều gì sẽ xảy ra nếu chúng ta thay vì muốn để cơ bản tạo ra một thế giới không còn như thế này? 429 00:23:51,000 --> 00:23:56,000 Đây là một mảng, và, tất nhiên, loại hủy một khi chúng ta kết thúc của mảng, 430 00:23:56,000 --> 00:24:00,000 và bây giờ tôi không còn có không gian cho một số nguyên hoặc một nhân vật khác. 431 00:24:00,000 --> 00:24:03,000 Điều gì sẽ xảy ra nếu chúng ta loại preemptively nói tại sao chúng ta không thư giãn 432 00:24:03,000 --> 00:24:07,000 yêu cầu này rằng tất cả những phần bộ nhớ được tiếp giáp trở lại trở lại, 433 00:24:07,000 --> 00:24:10,000 và tại sao không, khi tôi cần một int hoặc một char, 434 00:24:10,000 --> 00:24:12,000 chỉ cho tôi không gian cho một trong số họ? 435 00:24:12,000 --> 00:24:14,000 Và khi tôi cần một, cung cấp cho tôi một không gian khác, 436 00:24:14,000 --> 00:24:16,000 và khi tôi cần một, cung cấp cho tôi một không gian khác. 437 00:24:16,000 --> 00:24:19,000 Lợi thế trong đó là nếu người khác 438 00:24:19,000 --> 00:24:21,000 có bộ nhớ ở đây, không có việc lớn. 439 00:24:21,000 --> 00:24:25,000 Tôi sẽ đưa đoạn bổ sung bộ nhớ ở đây và sau đó một trong những điều này. 440 00:24:25,000 --> 00:24:28,000 >> Bây giờ, nắm bắt duy nhất ở đây là điều này gần như cảm thấy như tôi có 441 00:24:28,000 --> 00:24:30,000 một bó toàn bộ các biến khác nhau. 442 00:24:30,000 --> 00:24:33,000 Điều này cảm thấy giống như năm biến khác nhau có khả năng. 443 00:24:33,000 --> 00:24:36,000 Nhưng nếu chúng ta ăn cắp ý tưởng từ chuỗi 444 00:24:36,000 --> 00:24:41,000 nhờ đó chúng ta bằng cách nào đó liên kết những điều này với nhau khái niệm, và những gì nếu tôi đã làm điều này? 445 00:24:41,000 --> 00:24:44,000 Đây là mũi tên của tôi rất kém rút ra. 446 00:24:44,000 --> 00:24:46,000 Nhưng giả sử rằng mỗi người trong số các phần bộ nhớ 447 00:24:46,000 --> 00:24:52,000 chỉ khác, và anh chàng này, không có anh, chị, em ruột phải của mình, 448 00:24:52,000 --> 00:24:54,000 không có mũi tên như vậy. 449 00:24:54,000 --> 00:24:56,000 Điều này là trong thực tế, những gì được gọi là một danh sách liên kết. 450 00:24:56,000 --> 00:25:00,000 Đây là một cấu trúc dữ liệu mới cho phép chúng ta cấp phát một đoạn bộ nhớ, 451 00:25:00,000 --> 00:25:03,000 khác, sau đó một, sau đó một, bất cứ lúc nào chúng ta muốn 452 00:25:03,000 --> 00:25:07,000 trong một chương trình, và chúng ta nhớ rằng tất cả chúng bằng cách nào đó có liên quan 453 00:25:07,000 --> 00:25:11,000 bằng cách xâu chuỗi chúng lại với nhau, và chúng tôi đã làm điều đó những bức tranh ở đây với một mũi tên. 454 00:25:11,000 --> 00:25:15,000 Nhưng trong mã, những gì sẽ là cơ chế thông qua đó bạn bằng cách nào đó có thể kết nối, 455 00:25:15,000 --> 00:25:20,000 gần giống như Scratch, một thành phần đoạn khác? 456 00:25:20,000 --> 00:25:22,000 Chúng ta có thể sử dụng một con trỏ, phải không? 457 00:25:22,000 --> 00:25:25,000 Bởi vì thực sự là mũi tên đi từ quảng trường phía trên bên trái, 458 00:25:25,000 --> 00:25:31,000 anh chàng này ở đây một trong những điều này, có thể chứa bên trong của hình vuông này 459 00:25:31,000 --> 00:25:34,000 không chỉ là một số ints, không chỉ một số char, nhưng những gì nếu tôi thực sự phân bổ 460 00:25:34,000 --> 00:25:37,000 thêm một chút không gian để bây giờ, 461 00:25:37,000 --> 00:25:41,000 mỗi khối bộ nhớ của tôi, mặc dù điều này sẽ chi phí cho tôi, 462 00:25:41,000 --> 00:25:45,000 bây giờ trông nhiều hơn một chút hình chữ nhật có một trong những phần bộ nhớ 463 00:25:45,000 --> 00:25:47,000 được sử dụng cho một số, như số 1, 464 00:25:47,000 --> 00:25:50,000 và sau đó nếu anh chàng này lưu trữ số 2, 465 00:25:50,000 --> 00:25:52,000 đoạn khác của bộ nhớ này được sử dụng cho một mũi tên, 466 00:25:52,000 --> 00:25:54,000 hay cụ thể hơn, một con trỏ. 467 00:25:54,000 --> 00:25:59,000 Và giả sử tôi lưu trữ các số 3 ở đây trong khi tôi sử dụng điều này để chỉ vào anh chàng đó, 468 00:25:59,000 --> 00:26:02,000 và bây giờ anh chàng này, chúng ta hãy giả sử tôi chỉ muốn ba khối của bộ nhớ. 469 00:26:02,000 --> 00:26:05,000 Tôi sẽ vẽ một đường thông qua đó, cho thấy vô giá trị. 470 00:26:05,000 --> 00:26:07,000 Không có ký tự bổ sung. 471 00:26:07,000 --> 00:26:10,000 >> Thật vậy, đây là làm thế nào chúng ta có thể đi về việc thực hiện 472 00:26:10,000 --> 00:26:12,000 một cái gì đó được gọi là một danh sách liên kết. 473 00:26:12,000 --> 00:26:18,000 Một danh sách liên kết là một cấu trúc dữ liệu mới, và đó là một bước hướng tới 474 00:26:18,000 --> 00:26:21,000 fancier nhiều dữ liệu cấu trúc bắt đầu giải quyết vấn đề 475 00:26:21,000 --> 00:26:23,000 dọc theo dòng của các vấn đề về Facebook và Google vấn đề loại 476 00:26:23,000 --> 00:26:26,000 nơi bạn có dữ liệu khổng lồ, và nó không còn cắt nó 477 00:26:26,000 --> 00:26:29,000 để lưu trữ tất cả mọi thứ liên tục kế nhau và sử dụng một cái gì đó giống như tìm kiếm tuyến tính 478 00:26:29,000 --> 00:26:31,000 hoặc thậm chí một cái gì đó như tìm kiếm nhị phân. 479 00:26:31,000 --> 00:26:33,000 Bạn muốn tốt hơn lần chạy. 480 00:26:33,000 --> 00:26:37,000 Trong thực tế, một trong những Grails Thánh chúng ta sẽ nói về vào cuối tuần này hoặc bên cạnh 481 00:26:37,000 --> 00:26:41,000 là một thuật toán có thời gian chạy là không đổi. 482 00:26:41,000 --> 00:26:44,000 Nói cách khác, nó luôn luôn có cùng một lượng thời gian không có vấn đề 483 00:26:44,000 --> 00:26:47,000 đầu vào là lớn như thế nào, và đó thực sự sẽ là rất thuyết phục, 484 00:26:47,000 --> 00:26:49,000 thậm chí nhiều hơn so với một cái gì đó logarit. 485 00:26:49,000 --> 00:26:51,000 Đây là những gì trên màn hình ở đây? 486 00:26:51,000 --> 00:26:55,000 Mỗi hình chữ nhật là chính xác những gì tôi vừa vẽ bằng tay. 487 00:26:55,000 --> 00:26:59,000 Nhưng điều tất cả các cách trên bên trái là một biến đặc biệt. 488 00:26:59,000 --> 00:27:02,000 Nó sẽ là một con trỏ duy nhất bởi vì các Gotcha 489 00:27:02,000 --> 00:27:04,000 với một danh sách liên kết, những điều này được gọi là, 490 00:27:04,000 --> 00:27:09,000 là bạn phải để treo vào một đầu của danh sách liên kết. 491 00:27:09,000 --> 00:27:13,000 >> Cũng giống như với một chuỗi, bạn cần phải biết địa chỉ của char đầu tiên. 492 00:27:13,000 --> 00:27:15,000 Tương tự đối phó cho danh sách liên kết. 493 00:27:15,000 --> 00:27:19,000 Bạn có biết địa chỉ của đoạn đầu tiên của bộ nhớ 494 00:27:19,000 --> 00:27:25,000 bởi vì từ đó, bạn có thể đạt mỗi khác. 495 00:27:25,000 --> 00:27:27,000 Nhược điểm. 496 00:27:27,000 --> 00:27:30,000 Giá cả những gì chúng tôi trả tiền cho tính linh hoạt của việc có một động 497 00:27:30,000 --> 00:27:34,000 cấu trúc dữ liệu khá lớn mà nếu chúng tôi cần nhiều bộ nhớ hơn, tiền phạt, 498 00:27:34,000 --> 00:27:37,000 chỉ cần phân bổ thêm một thành phần và vẽ một con trỏ từ 499 00:27:37,000 --> 00:27:39,000 cũ đuôi mới của danh sách? 500 00:27:39,000 --> 00:27:41,000 Yeah. 501 00:27:41,000 --> 00:27:43,000 [Sinh viên] Nó có không gian gấp hai lần. 502 00:27:43,000 --> 00:27:45,000 Nó có không gian gấp đôi, vì vậy đó là một nhược điểm, và chúng tôi đã nhìn thấy điều này 503 00:27:45,000 --> 00:27:48,000 sự cân bằng trước khi giữa thời gian và không gian linh hoạt và 504 00:27:48,000 --> 00:27:51,000 bây giờ, chúng ta cần không phải là 32 bit cho mỗi của những con số. 505 00:27:51,000 --> 00:27:57,000 Chúng tôi thực sự cần 64, 32 cho số lượng và 32 cho con trỏ. 506 00:27:57,000 --> 00:27:59,000 Nhưng hey, tôi có 2 GB RAM. 507 00:27:59,000 --> 00:28:02,000 Thêm 32 bit khác ở đây và ở đây không có vẻ là lớn của một thỏa thuận. 508 00:28:02,000 --> 00:28:05,000 Nhưng đối với các tập dữ liệu lớn, nó chắc chắn thêm lên nghĩa là gấp đôi. 509 00:28:05,000 --> 00:28:09,000 Một nhược điểm khác là bây giờ, hoặc những tính năng nào chúng ta từ bỏ, 510 00:28:09,000 --> 00:28:12,000 nếu chúng tôi đại diện cho danh sách những thứ với một danh sách liên kết và không phải là một mảng? 511 00:28:12,000 --> 00:28:14,000 [Sinh viên] Bạn không thể đi ngược trở lại. 512 00:28:14,000 --> 00:28:16,000 Bạn không thể đi qua nó ngược trở lại, do đó, bạn đang loại hơi say nếu bạn đang đi bộ 513 00:28:16,000 --> 00:28:19,000 từ trái sang phải bằng cách sử dụng một vòng lặp hoặc một vòng lặp trong khi 514 00:28:19,000 --> 00:28:21,000 và sau đó bạn nhận ra rằng, "Ồ, tôi muốn quay trở lại đầu của danh sách." 515 00:28:21,000 --> 00:28:26,000 Bạn có thể không phải vì các con trỏ chỉ đi từ trái sang phải như các mũi tên chỉ ra. 516 00:28:26,000 --> 00:28:29,000 >> Bây giờ, bạn có thể nhớ các đầu danh sách với biến khác, 517 00:28:29,000 --> 00:28:31,000 nhưng đó là một phức tạp để giữ trong tâm trí. 518 00:28:31,000 --> 00:28:35,000 Một mảng, không có vấn đề như thế nào đến nay bạn đi, bạn luôn có thể làm trừ, trừ, trừ, trừ đi 519 00:28:35,000 --> 00:28:37,000 và quay trở lại từ đâu bạn đến. 520 00:28:37,000 --> 00:28:40,000 Nhược điểm khác ở đây là gì? Yeah. 521 00:28:40,000 --> 00:28:43,000 [Câu hỏi sinh viên không nghe được] 522 00:28:43,000 --> 00:28:47,000 Bạn có thể, do đó, bạn đã thực sự chỉ đề xuất một cấu trúc dữ liệu gọi là một danh sách liên kết kép, 523 00:28:47,000 --> 00:28:50,000 và quả thật, bạn sẽ thêm một con trỏ cho mỗi của các hình chữ nhật 524 00:28:50,000 --> 00:28:53,000 mà đi theo một hướng khác, xu hướng tăng giá trong đó 525 00:28:53,000 --> 00:28:55,000 bây giờ là bạn có thể đi qua lại, 526 00:28:55,000 --> 00:28:59,000 Nhược điểm trong số đó là bây giờ bạn đang sử dụng ba lần như là bộ nhớ nhiều như chúng tôi được sử dụng để 527 00:28:59,000 --> 00:29:04,000 và cũng có thể thêm phức tạp trong điều khoản của mã này bạn phải viết để có được nó đúng. 528 00:29:04,000 --> 00:29:08,000 Nhưng đây là tất cả có lẽ sự cân bằng rất hợp lý, nếu đảo ngược là quan trọng hơn. 529 00:29:08,000 --> 00:29:10,000 Yeah. 530 00:29:10,000 --> 00:29:12,000 [Sinh viên] Bạn cũng không thể có một danh sách liên kết 2D. 531 00:29:12,000 --> 00:29:16,000 Tốt, bạn có thể không thực sự có một danh sách liên kết 2D. 532 00:29:16,000 --> 00:29:18,000 Bạn có thể. Nó không đơn giản như một mảng. 533 00:29:18,000 --> 00:29:21,000 Giống như một mảng, bạn làm khung mở, đóng khung, khung mở, đóng khung, 534 00:29:21,000 --> 00:29:23,000 và bạn nhận được một số cấu trúc 2-chiều. 535 00:29:23,000 --> 00:29:26,000 Bạn có thể thực hiện một danh sách 2-chiều liên kết 536 00:29:26,000 --> 00:29:29,000 nếu bạn làm tiện ích như bạn đề xuất một con trỏ thứ ba cho mỗi của những việc này, 537 00:29:29,000 --> 00:29:34,000 và nếu bạn nghĩ về danh sách khác đến lúc bạn phong cách 3D 538 00:29:34,000 --> 00:29:40,000 từ màn hình cho tất cả chúng ta, mà chỉ là một chuỗi của một số loại. 539 00:29:40,000 --> 00:29:45,000 Chúng tôi có thể làm điều đó, nhưng nó không phải đơn giản như gõ khung mở, khung vuông. Yeah. 540 00:29:45,000 --> 00:29:48,000 [Câu hỏi sinh viên không nghe được] 541 00:29:48,000 --> 00:29:50,000 Tốt, vì vậy đây là một kicker thực. 542 00:29:50,000 --> 00:29:54,000 >> Các thuật toán này mà chúng tôi đã pined, giống như oh, tìm kiếm nhị phân, 543 00:29:54,000 --> 00:29:57,000 bạn có thể tìm kiếm một mảng các số trên bảng 544 00:29:57,000 --> 00:30:01,000 hoặc một cuốn sách điện thoại nhiều hơn nữa một cách nhanh chóng nếu bạn sử dụng phân chia và chinh phục 545 00:30:01,000 --> 00:30:05,000 và một thuật toán tìm kiếm nhị phân, nhưng tìm kiếm nhị phân yêu cầu hai giả định. 546 00:30:05,000 --> 00:30:09,000 Một, rằng các dữ liệu được sắp xếp. 547 00:30:09,000 --> 00:30:11,000 Bây giờ, chúng ta có lẽ có thể sắp xếp này, 548 00:30:11,000 --> 00:30:14,000 như vậy có lẽ không phải là một mối quan tâm, nhưng tìm kiếm nhị phân cũng giả định 549 00:30:14,000 --> 00:30:18,000 mà bạn đã truy cập ngẫu nhiên danh sách các số, 550 00:30:18,000 --> 00:30:21,000 và một mảng cho phép bạn có quyền truy cập ngẫu nhiên, và bằng cách truy cập ngẫu nhiên, 551 00:30:21,000 --> 00:30:24,000 Tôi có nghĩa là nếu bạn đang đưa ra một mảng, bao nhiêu thời gian hiện nó đi bạn 552 00:30:24,000 --> 00:30:26,000 để có được với khung 0? 553 00:30:26,000 --> 00:30:29,000 Một hoạt động, bạn chỉ cần sử dụng [0] và bạn đang ở. 554 00:30:29,000 --> 00:30:33,000 Có bao nhiêu bước đi để có được vị trí 10? 555 00:30:33,000 --> 00:30:36,000 Một bước này, bạn chỉ cần đi đến [10] và bạn đang có. 556 00:30:36,000 --> 00:30:40,000 Ngược lại, làm thế nào để bạn có được số nguyên thứ 10 trong danh sách liên kết? 557 00:30:40,000 --> 00:30:42,000 Bạn phải bắt đầu ngay từ đầu bởi vì bạn đang chỉ nhớ 558 00:30:42,000 --> 00:30:45,000 sự khởi đầu của một danh sách liên kết, giống như một chuỗi được ghi nhớ 559 00:30:45,000 --> 00:30:48,000 địa chỉ của char đầu tiên của mình, và để tìm mà int thứ 10 560 00:30:48,000 --> 00:30:53,000 hoặc rằng nhân vật thứ 10 trong một chuỗi, bạn phải tìm kiếm toàn bộ điều chết tiệt. 561 00:30:53,000 --> 00:30:55,000 >> Một lần nữa, chúng tôi không giải quyết tất cả các vấn đề của chúng ta. 562 00:30:55,000 --> 00:31:00,000 Chúng tôi đang giới thiệu những cái mới, nhưng nó thực sự phụ thuộc vào những gì bạn đang cố gắng để thiết kế cho. 563 00:31:00,000 --> 00:31:04,000 Trong điều kiện thực hiện điều này, chúng ta có thể mượn một ý tưởng từ cấu trúc của học sinh. 564 00:31:04,000 --> 00:31:07,000 Cú pháp là rất giống nhau, ngoại trừ bây giờ, ý tưởng là một chút trừu tượng hơn 565 00:31:07,000 --> 00:31:09,000 hơn nhà, tên và ID. 566 00:31:09,000 --> 00:31:13,000 Nhưng tôi đề nghị chúng ta có thể có một cấu trúc dữ liệu trong C 567 00:31:13,000 --> 00:31:17,000 đó được gọi là nút, như lời cuối cùng về slide cho thấy, 568 00:31:17,000 --> 00:31:21,000 bên trong của một nút, và một nút là chỉ là một container chung chung trong khoa học máy tính. 569 00:31:21,000 --> 00:31:25,000 Nó thường được vẽ như một vòng tròn hoặc hình vuông hoặc hình chữ nhật như chúng tôi đã làm. 570 00:31:25,000 --> 00:31:27,000 Và trong cấu trúc dữ liệu này, chúng tôi có một int, n, 571 00:31:27,000 --> 00:31:29,000 vì vậy đó là số tôi muốn lưu trữ. 572 00:31:29,000 --> 00:31:36,000 Tuy nhiên, dòng thứ hai, struct node * next là gì? 573 00:31:36,000 --> 00:31:40,000 Tại sao điều này chính xác, hoặc vai trò thực hiện điều này chơi điều, 574 00:31:40,000 --> 00:31:42,000 mặc dù nó là một chút khó hiểu ở cái nhìn đầu tiên? 575 00:31:42,000 --> 00:31:44,000 Yeah. 576 00:31:44,000 --> 00:31:46,000 [Không nghe được sinh viên phản ứng] 577 00:31:46,000 --> 00:31:50,000 Chính xác, do đó, các loại * của chiến lợi phẩm mà nó là một con trỏ của một số loại. 578 00:31:50,000 --> 00:31:53,000 Tên của con trỏ này là tự ý tiếp theo, 579 00:31:53,000 --> 00:32:00,000 nhưng chúng ta có thể gọi nó là bất cứ điều gì chúng ta muốn, nhưng thời điểm này con trỏ làm những gì? 580 00:32:00,000 --> 00:32:03,000 [Sinh Viên] Một nút >> Chính xác, nó chỉ đến một nút khác như vậy. 581 00:32:03,000 --> 00:32:05,000 >> Bây giờ, đây là sắp xếp của một sự tò mò của C. 582 00:32:05,000 --> 00:32:09,000 Nhớ lại rằng C được đọc bởi một trình biên dịch trên xuống dưới, từ trái sang phải, 583 00:32:09,000 --> 00:32:13,000 có nghĩa là nếu đây là một chút khác nhau từ những gì chúng tôi đã làm với học sinh. 584 00:32:13,000 --> 00:32:16,000 Khi chúng ta định nghĩa một sinh viên, chúng tôi thực sự đã không đặt một từ đó. 585 00:32:16,000 --> 00:32:18,000 Nó chỉ nói typedef. 586 00:32:18,000 --> 00:32:20,000 Sau đó, chúng tôi đã có tên id string, int, chuỗi nhà, 587 00:32:20,000 --> 00:32:23,000 và sau đó sinh viên ở dưới cùng của cấu trúc. 588 00:32:23,000 --> 00:32:26,000 Tuyên bố này là một chút khác nhau bởi vì, 589 00:32:26,000 --> 00:32:28,000 một lần nữa, các trình biên dịch C là một chút câm. 590 00:32:28,000 --> 00:32:30,000 Nó chỉ để đọc trên xuống dưới, 591 00:32:30,000 --> 00:32:33,000 vì vậy nếu nó đạt đến dòng thứ 2 ở đây 592 00:32:33,000 --> 00:32:37,000 tiếp theo là khai báo và nó thấy, oh, đây là một biến gọi là tiếp theo. 593 00:32:37,000 --> 00:32:39,000 Đó là một con trỏ đến một nút struct. 594 00:32:39,000 --> 00:32:42,000 Trình biên dịch sẽ nhận ra một nút struct là những gì? 595 00:32:42,000 --> 00:32:44,000 Tôi chưa bao giờ nghe nói về điều này trước khi, 596 00:32:44,000 --> 00:32:47,000 bởi vì từ nút có thể không xuất hiện 597 00:32:47,000 --> 00:32:49,000 cho đến khi phía dưới, do đó, có dư thừa này. 598 00:32:49,000 --> 00:32:53,000 Bạn phải nói nút struct ở đây, mà sau đó bạn có thể rút ngắn sau đó 599 00:32:53,000 --> 00:32:56,000 nhờ typedef xuống đây, nhưng điều này là do 600 00:32:56,000 --> 00:33:02,000 chúng tôi đang tham khảo cấu trúc bên trong của cấu trúc. 601 00:33:02,000 --> 00:33:05,000 Đó là Gotcha ai ở đó. 602 00:33:05,000 --> 00:33:07,000 >> Một số vấn đề thú vị sẽ nảy sinh. 603 00:33:07,000 --> 00:33:09,000 Chúng tôi đã có một danh sách các số. Làm thế nào để chúng ta chèn vào nó? 604 00:33:09,000 --> 00:33:11,000 Làm thế nào để chúng ta tìm kiếm nó? Làm thế nào để chúng tôi xóa từ nó? 605 00:33:11,000 --> 00:33:13,000 Đặc biệt hiện nay là chúng ta phải quản lý tất cả các con trỏ. 606 00:33:13,000 --> 00:33:15,000 Bạn nghĩ rằng con trỏ là loại tâm-uốn 607 00:33:15,000 --> 00:33:17,000 khi bạn đã có một trong số họ chỉ cần cố gắng để đọc một int nó. 608 00:33:17,000 --> 00:33:20,000 Bây giờ chúng ta phải thao tác trị giá toàn bộ danh sách. 609 00:33:20,000 --> 00:33:22,000 Sao chúng ta không có giải lao 5 phút của chúng tôi ở đây, và sau đó chúng tôi sẽ mang lại cho 610 00:33:22,000 --> 00:33:34,000 một số người lên sân khấu để làm chính xác điều đó. 611 00:33:34,000 --> 00:33:36,000 >> C là thú vị hơn nhiều khi nó hành động ra. 612 00:33:36,000 --> 00:33:39,000 Nghĩa là muốn là người đầu tiên? 613 00:33:39,000 --> 00:33:41,000 Được rồi, đến lên. Bạn đang đầu tiên. 614 00:33:41,000 --> 00:33:44,000 Ai muốn là 9? Được rồi, 9. 615 00:33:44,000 --> 00:33:46,000 Làm thế nào khoảng 9? 17? 616 00:33:46,000 --> 00:33:51,000 Bè lũ nhỏ ở đây. 22 và 26 trong đó hàng ghế đầu. 617 00:33:51,000 --> 00:33:53,000 Và sau đó làm thế nào về một người nào đó trên có được chỉ vào. 618 00:33:53,000 --> 00:33:57,000 Bạn đang 34. Được rồi, 34 tuổi, đi lên trên. 619 00:33:57,000 --> 00:33:59,000 Đầu tiên là ở đó. Được rồi, tất cả bốn của các bạn. 620 00:33:59,000 --> 00:34:01,000 Và chúng tôi đã nói trong 9? 621 00:34:01,000 --> 00:34:04,000 9 của chúng tôi là ai? 622 00:34:04,000 --> 00:34:07,000 Ai thực sự muốn là 9? Được rồi, thôi nào, là 9. 623 00:34:07,000 --> 00:34:10,000 Ở đây chúng tôi đi. 624 00:34:10,000 --> 00:34:13,000 34, chúng tôi sẽ gặp các bạn ở đó. 625 00:34:13,000 --> 00:34:17,000 Phần đầu tiên là làm cho mình trông như thế. 626 00:34:17,000 --> 00:34:21,000 26, 22, 17, tốt. 627 00:34:21,000 --> 00:34:25,000 Nếu bạn có thể đứng sang một bên, bởi vì chúng ta sẽ malloc bạn trong một thời điểm. 628 00:34:25,000 --> 00:34:29,000 >> Tốt, tốt. 629 00:34:29,000 --> 00:34:32,000 Được rồi, tuyệt vời, do đó, hãy hỏi một vài câu hỏi ở đây. 630 00:34:32,000 --> 00:34:34,000 Và trên thực tế, tên của bạn là những gì? >> Anita. 631 00:34:34,000 --> 00:34:37,000 Anita, okay, đi qua đây. 632 00:34:37,000 --> 00:34:41,000 Anita sẽ để giúp chúng tôi loại giải quyết một câu hỏi khá đơn giản trong lần đầu tiên, 633 00:34:41,000 --> 00:34:44,000 đó là làm thế nào để bạn tìm thấy hay không một giá trị trong danh sách? 634 00:34:44,000 --> 00:34:48,000 Bây giờ, chú ý đầu tiên, đại diện ở đây bởi Lucas, 635 00:34:48,000 --> 00:34:52,000 là một chút khác nhau, và do đó, tác phẩm của mình giấy là cố tình đi ngang 636 00:34:52,000 --> 00:34:55,000 bởi vì nó không phải là khá cao và không mất nhiều như các bit, 637 00:34:55,000 --> 00:34:58,000 mặc dù về mặt kỹ thuật có cùng kích thước giấy chỉ xoay. 638 00:34:58,000 --> 00:35:01,000 Nhưng anh ấy là một chút khác nhau trong đó ông chỉ có 32 bit cho một con trỏ, 639 00:35:01,000 --> 00:35:05,000 và tất cả những kẻ là 64 bit, một nửa trong số đó là số lượng, một nửa trong số đó là một con trỏ. 640 00:35:05,000 --> 00:35:08,000 Tuy nhiên, con trỏ được không mô tả, do đó, nếu các bạn có thể phần nào lúng túng 641 00:35:08,000 --> 00:35:12,000 sử dụng tay trái của bạn chỉ vào người bên cạnh bạn. 642 00:35:12,000 --> 00:35:14,000 Và bạn là số 34. Tên của bạn là gì? 643 00:35:14,000 --> 00:35:16,000 Ari. 644 00:35:16,000 --> 00:35:19,000 Ari, do đó, thực sự, giữ giấy trong tay phải của bạn, và tay trái đi thẳng xuống. 645 00:35:19,000 --> 00:35:21,000 Bạn đại diện null trên bên trái. 646 00:35:21,000 --> 00:35:24,000 >> Bây giờ hình ảnh con người của chúng tôi là rất nhất quán. 647 00:35:24,000 --> 00:35:26,000 Điều này thực sự là con trỏ làm việc như thế nào. 648 00:35:26,000 --> 00:35:29,000 Và nếu bạn có thể nhai một chút theo cách này vì vậy tôi không theo cách của bạn. 649 00:35:29,000 --> 00:35:34,000 Anita ở đây, tìm thấy tôi số 22, 650 00:35:34,000 --> 00:35:40,000 nhưng giả sử một hạn chế của không phải con người nắm giữ lên mảnh giấy, 651 00:35:40,000 --> 00:35:43,000 nhưng đây là một danh sách, và bạn chỉ có Lucas để bắt đầu với 652 00:35:43,000 --> 00:35:46,000 bởi vì anh ta có nghĩa là con trỏ đầu tiên. 653 00:35:46,000 --> 00:35:51,000 Giả sử bạn mình là một con trỏ, và do đó, bạn cũng có khả năng chỉ vào một cái gì đó. 654 00:35:51,000 --> 00:35:56,000 Tại sao bạn không bắt đầu bằng cách chỉ tay vào chính xác những gì Lucas chỉ vào? 655 00:35:56,000 --> 00:35:58,000 Tốt, và hãy để tôi ban hành này ra ở đây. 656 00:35:58,000 --> 00:36:04,000 Chỉ vì lợi ích của cuộc thảo luận, hãy để tôi kéo lên một trang trắng ở đây. 657 00:36:04,000 --> 00:36:06,000 Làm thế nào để bạn đánh vần tên của bạn >> Anita. 658 00:36:06,000 --> 00:36:08,000 Được rồi, Anita. 659 00:36:08,000 --> 00:36:18,000 Hãy nói rằng node * anita = Lucas. 660 00:36:18,000 --> 00:36:22,000 Vâng, chúng ta không nên gọi bạn là Lucas. Chúng tôi nên gọi bạn đầu tiên. 661 00:36:22,000 --> 00:36:25,000 Tại sao điều này trong thực tế, phù hợp với thực tế ở đây? 662 00:36:25,000 --> 00:36:27,000 Một, lần đầu tiên đã tồn tại. 663 00:36:27,000 --> 00:36:30,000 Đầu tiên đã được phân bổ có lẽ là một nơi nào đó ở đây. 664 00:36:30,000 --> 00:36:35,000 Node * Đầu tiên, và nó được phân bổ một danh sách bằng cách nào đó. 665 00:36:35,000 --> 00:36:37,000 Tôi không biết làm thế nào điều đó xảy ra. Điều đó xảy ra trước khi lớp học bắt đầu. 666 00:36:37,000 --> 00:36:40,000 Này danh sách liên kết của con người đã được tạo. 667 00:36:40,000 --> 00:36:44,000 Và tại thời điểm này trong câu chuyện này là tất cả trên Facebook dường như sau 668 00:36:44,000 --> 00:36:49,000 vào thời điểm này trong câu chuyện, Anita đã được khởi tạo bằng đầu tiên, 669 00:36:49,000 --> 00:36:51,000 mà không có nghĩa là Anita điểm tại Lucas. 670 00:36:51,000 --> 00:36:53,000 Thay vào đó, cô chỉ vào những gì ông chỉ vào 671 00:36:53,000 --> 00:36:57,000 bởi vì cùng một địa chỉ bên trong của Lucas 32 bit - 1, 2, 3 - 672 00:36:57,000 --> 00:37:01,000 bây giờ là bên trong của Anita của 32 bit - 1, 2, 3. 673 00:37:01,000 --> 00:37:05,000 >> Bây giờ tìm thấy 22. Làm thế nào bạn sẽ đi về việc này? 674 00:37:05,000 --> 00:37:07,000 Mà điểm? >> Để bất cứ điều gì là những gì. 675 00:37:07,000 --> 00:37:11,000 Trỏ đến bất cứ điều gì, nên đi trước và hành động nó ra là tốt nhất bạn có thể ở đây. 676 00:37:11,000 --> 00:37:15,000 Tốt, tốt, và bây giờ bạn đang chỉ vào tên của bạn với 22? 677 00:37:15,000 --> 00:37:18,000 Ramon. >> Ramon, do đó, Ramon đang nắm giữ tăng 22. 678 00:37:18,000 --> 00:37:20,000 Bây giờ bạn đã thực hiện một kiểm tra. 679 00:37:20,000 --> 00:37:24,000 Có Ramon == 22, và nếu như vậy, ví dụ, chúng ta có thể trở lại đúng sự thật. 680 00:37:24,000 --> 00:37:26,000 Hãy cho tôi trong khi những kẻ đứng đây phần nào lúng túng- 681 00:37:26,000 --> 00:37:32,000 hãy để tôi làm một cái gì đó một cách nhanh chóng như bool. 682 00:37:32,000 --> 00:37:37,000 Tôi sẽ đi trước và nói (node ​​* danh sách, int n). 683 00:37:37,000 --> 00:37:39,000 Tôi sẽ quay lại ngay với bạn guys. Tôi chỉ cần có để viết một số mã. 684 00:37:39,000 --> 00:37:45,000 Và bây giờ tôi sẽ đi trước và làm điều này, node * anita = danh sách. 685 00:37:45,000 --> 00:37:51,000 Và tôi sẽ đi trước và nói trong khi (anita = NULL). 686 00:37:51,000 --> 00:37:57,000 >> Ẩn dụ ở đây là nhận được một chút kéo dài, nhưng trong khi (anita = NULL!), Tôi làm những gì muốn làm? 687 00:37:57,000 --> 00:38:03,000 Tôi cần một số cách để tham khảo 688 00:38:03,000 --> 00:38:05,000 số nguyên có Anita chỉ vào. 689 00:38:05,000 --> 00:38:08,000 Trong quá khứ, khi chúng tôi có các cấu trúc, một nút là, 690 00:38:08,000 --> 00:38:11,000 chúng tôi sử dụng các ký hiệu dấu chấm, và chúng tôi sẽ nói một cái gì đó như 691 00:38:11,000 --> 00:38:15,000 anita.n, nhưng vấn đề ở đây là Anita không phải là một cấu trúc cho mỗi gia nhập. 692 00:38:15,000 --> 00:38:17,000 Cô ấy là gì? 693 00:38:17,000 --> 00:38:21,000 Cô ấy là một con trỏ, như vậy thực sự, nếu chúng ta muốn sử dụng dấu chấm ký hiệu 694 00:38:21,000 --> 00:38:23,000 và điều này được nhìn cố ý một chút khó hiểu 695 00:38:23,000 --> 00:38:28,000 chúng ta phải làm một cái gì đó giống như đi đến bàn tay trái của bất cứ điều gì Anita chỉ 696 00:38:28,000 --> 00:38:31,000 và sau đó nhận được lĩnh vực được gọi là n. 697 00:38:31,000 --> 00:38:35,000 Anita là một con trỏ, nhưng * anita là những gì? 698 00:38:35,000 --> 00:38:38,000 Những gì bạn thấy khi bạn đi đến những gì Anita được chỉ vào? 699 00:38:38,000 --> 00:38:42,000 Một cấu trúc, một nút, và nút thu hồi, có một lĩnh vực được gọi là n 700 00:38:42,000 --> 00:38:47,000 bởi vì nó đã, thu hồi, 2 lĩnh vực này, tiếp theo và n, 701 00:38:47,000 --> 00:38:50,000 mà chúng ta thấy một chút thời gian trước đây ngay tại đây. 702 00:38:50,000 --> 00:38:53,000 >> Để thực sự bắt chước trong mã, 703 00:38:53,000 --> 00:39:02,000 chúng ta có thể làm điều này và nói rằng nếu ((* anita) n == n), n mà tôi đang tìm kiếm. 704 00:39:02,000 --> 00:39:04,000 Chú ý rằng chức năng này đã được thông qua trong số tôi quan tâm. 705 00:39:04,000 --> 00:39:10,000 Sau đó, tôi có thể đi trước và làm một cái gì đó giống như return true. 706 00:39:10,000 --> 00:39:12,000 Khác, nếu đó không phải là trường hợp, tôi làm những gì muốn làm? 707 00:39:12,000 --> 00:39:19,000 Làm thế nào để dịch mã Anita đã làm như vậy trực giác bằng cách đi bộ qua danh sách? 708 00:39:19,000 --> 00:39:26,000 Tôi nên làm gì đây để mô phỏng Anita rằng bước sang trái, bước sang bên trái? 709 00:39:26,000 --> 00:39:28,000 [Sinh viên phản ứng không nghe được] >> đó là gì? 710 00:39:28,000 --> 00:39:30,000 [Không nghe được sinh viên phản ứng] 711 00:39:30,000 --> 00:39:34,000 Tốt, không phải là một ý tưởng tồi, nhưng trong quá khứ, khi chúng tôi đã làm điều này, chúng tôi đã thực hiện anita + + 712 00:39:34,000 --> 00:39:37,000 vì đó sẽ thêm số 1 Anita, 713 00:39:37,000 --> 00:39:40,000 mà thường sẽ chỉ vào những người kế tiếp, như Ramon, 714 00:39:40,000 --> 00:39:44,000 hoặc người bên cạnh anh ta, hoặc bên cạnh anh người xuống dòng. 715 00:39:44,000 --> 00:39:49,000 Nhưng đó không phải là khá tốt ở đây bởi vì điều này trông giống như những gì trong bộ nhớ? 716 00:39:49,000 --> 00:39:54,000 Không phải là. Chúng tôi đã vô hiệu hóa điều đó. 717 00:39:54,000 --> 00:40:00,000 Nó trông như thế này trong bộ nhớ, và mặc dù tôi đã rút ra 1 và 2 và gần 3 với nhau, 718 00:40:00,000 --> 00:40:03,000 nếu chúng ta thực sự mô phỏng này có thể bạn guys, trong khi vẫn chỉ vào cùng một số người, 719 00:40:03,000 --> 00:40:07,000 có thể một số bạn lấy lại bước ngẫu nhiên, một số bạn một bước ngẫu nhiên về phía trước? 720 00:40:07,000 --> 00:40:10,000 >> Mess này vẫn còn là một danh sách liên kết, 721 00:40:10,000 --> 00:40:13,000 nhưng những kẻ có thể là bất cứ nơi nào trong bộ nhớ, 722 00:40:13,000 --> 00:40:15,000 để anita + + không làm việc tại sao? 723 00:40:15,000 --> 00:40:19,000 Những gì ở vị trí anita + +? 724 00:40:19,000 --> 00:40:21,000 Ai biết được. 725 00:40:21,000 --> 00:40:24,000 Đó là một số giá trị khác mà chỉ như vậy xảy ra được xen 726 00:40:24,000 --> 00:40:28,000 trong số tất cả các nút này một cách tình cờ bởi vì chúng tôi không sử dụng một mảng. 727 00:40:28,000 --> 00:40:30,000 Chúng tôi phân bổ mỗi một nút riêng lẻ. 728 00:40:30,000 --> 00:40:32,000 Được rồi, nếu các bạn có thể làm sạch mình trở lại. 729 00:40:32,000 --> 00:40:37,000 Chúng tôi đề xuất rằng thay vì anita + +, chúng ta thay vì làm anita được 730 00:40:37,000 --> 00:40:42,000 tốt, tại sao chúng ta không đi đến bất cứ điều gì Anita được chỉ vào và sau đó làm tiếp theo? 731 00:40:42,000 --> 00:40:45,000 Nói cách khác, chúng tôi đi đến Ramon, người đang nắm giữ số 22, 732 00:40:45,000 --> 00:40:51,000 và sau đó tiếp theo là như Anita sẽ được sao chép con trỏ bàn tay trái của mình. 733 00:40:51,000 --> 00:40:54,000 Nhưng cô sẽ không đi xa hơn so với Ramon bởi vì chúng tôi phát hiện 22. 734 00:40:54,000 --> 00:40:56,000 Nhưng đó sẽ là ý tưởng. Bây giờ, đây là một mớ hỗn độn thần khủng khiếp. 735 00:40:56,000 --> 00:40:59,000 Thành thật mà nói, không ai sẽ nhớ cú pháp này, và rất may mắn, 736 00:40:59,000 --> 00:41:04,000 nó thực sự là một mưu-oh chút, bạn đã không thực sự nhìn thấy những gì tôi đã viết. 737 00:41:04,000 --> 00:41:08,000 Điều này sẽ hấp dẫn hơn nếu bạn có thể. Thì đấy! 738 00:41:08,000 --> 00:41:10,000 >> Đằng sau hậu trường, tôi đã giải quyết vấn đề theo cách này. 739 00:41:10,000 --> 00:41:14,000 Anita, phải mất rằng bước sang bên trái, 740 00:41:14,000 --> 00:41:18,000 đầu tiên, chúng tôi đi đến địa chỉ mà Anita chỉ 741 00:41:18,000 --> 00:41:23,000 và nơi cô sẽ tìm thấy không chỉ n, mà chúng ta chỉ cần kiểm tra vì lợi ích so sánh, 742 00:41:23,000 --> 00:41:25,000 nhưng bạn cũng sẽ tìm thấy tiếp theo trong trường hợp này, 743 00:41:25,000 --> 00:41:28,000 Tay trái của Ramon trỏ đến nút tiếp theo trong danh sách. 744 00:41:28,000 --> 00:41:32,000 Nhưng đây là sự hỗn loạn thần khủng khiếp mà tôi đã đề cập trước đó, 745 00:41:32,000 --> 00:41:34,000 nhưng nó quay ra C cho phép chúng ta đơn giản hóa này. 746 00:41:34,000 --> 00:41:40,000 Thay vì viết (* anita), chúng ta có thể thay vì chỉ viết anita-> n, 747 00:41:40,000 --> 00:41:45,000 và đó là điều tương tự chính xác chức năng, nhưng nó rất trực quan hơn, 748 00:41:45,000 --> 00:41:48,000 và nó rất phù hợp với hình ảnh mà chúng tôi đã được vẽ 749 00:41:48,000 --> 00:41:50,000 tất cả thời gian này bằng cách sử dụng mũi tên. 750 00:41:50,000 --> 00:41:57,000 >> Cuối cùng, chúng ta cần gì để làm ở phần cuối của chương trình này? 751 00:41:57,000 --> 00:42:00,000 Có một dòng mã còn lại. 752 00:42:00,000 --> 00:42:02,000 Trả lại những gì? 753 00:42:02,000 --> 00:42:05,000 False, bởi vì nếu chúng tôi nhận được thông qua toàn bộ vòng lặp trong khi 754 00:42:05,000 --> 00:42:10,000 và Anita, trên thực tế, null, điều đó có nghĩa là cô ấy đã đi tất cả các cách để cuối danh sách 755 00:42:10,000 --> 00:42:12,000 nơi cô chỉ vào tên của bạn là gì nữa không? 756 00:42:12,000 --> 00:42:15,000 Ari >> Ari tay trái, đó là null. 757 00:42:15,000 --> 00:42:18,000 Anita bây giờ là null, và tôi nhận ra bạn chỉ cần đứng ở đây lúng túng trong tình trạng lấp lửng 758 00:42:18,000 --> 00:42:21,000 bởi vì tôi sẽ ra trên một độc thoại ở đây, 759 00:42:21,000 --> 00:42:23,000 nhưng chúng tôi sẽ liên quan đến bạn một lần nữa trong thời điểm này chỉ là một. 760 00:42:23,000 --> 00:42:27,000 Anita là null tại thời điểm đó trong câu chuyện, do đó, vòng lặp trong khi chấm dứt, 761 00:42:27,000 --> 00:42:30,000 và chúng ta phải quay trở lại sai bởi vì nếu cô ấy có tất cả các cách để con trỏ null của Ari 762 00:42:30,000 --> 00:42:34,000 sau đó không có số mà cô đã tìm kiếm trong danh sách. 763 00:42:34,000 --> 00:42:39,000 Chúng tôi có thể làm sạch này lên quá, nhưng điều này là một thực hiện khá tốt sau đó 764 00:42:39,000 --> 00:42:43,000 một chức năng traversal, một chức năng cho một danh sách liên kết. 765 00:42:43,000 --> 00:42:48,000 Nó vẫn còn tuyến tính tìm kiếm, nhưng nó không phải đơn giản như + + một con trỏ 766 00:42:48,000 --> 00:42:52,000 hoặc + + một biến i bởi vì bây giờ chúng ta không thể đoán 767 00:42:52,000 --> 00:42:54,000 nơi mà mỗi một nút đó trong bộ nhớ. 768 00:42:54,000 --> 00:42:57,000 Nghĩa là chúng ta phải thực hiện theo các dấu vết của breadcrumbs, hoặc cụ thể hơn, 769 00:42:57,000 --> 00:43:00,000 con trỏ, để có được từ một nút khác. 770 00:43:00,000 --> 00:43:02,000 >> Bây giờ chúng ta hãy thử một số khác. Anita, bạn có muốn quay lại đây? 771 00:43:02,000 --> 00:43:06,000 Tại sao chúng ta không đi trước và phân bổ một người khác từ phía khán giả? 772 00:43:06,000 --> 00:43:08,000 Malloc Tên bạn là gì? >> Rebecca. 773 00:43:08,000 --> 00:43:10,000 Rebecca. Rebecca đã được malloced từ khán giả, 774 00:43:10,000 --> 00:43:13,000 và cô ấy là lưu trữ số 55. 775 00:43:13,000 --> 00:43:17,000 Và mục tiêu trong tầm tay tại là Anita để chèn 776 00:43:17,000 --> 00:43:22,000 Rebecca vào danh sách liên kết ở vị trí thích hợp của nó. 777 00:43:22,000 --> 00:43:24,000 Thôi nào ở đây một lúc. 778 00:43:24,000 --> 00:43:28,000 Tôi đã làm một cái gì đó như thế này. 779 00:43:28,000 --> 00:43:32,000 Tôi đã làm * nút. Và tên của bạn là những gì một lần nữa? 780 00:43:32,000 --> 00:43:34,000 Rebecca. >> Rebecca, okay. 781 00:43:34,000 --> 00:43:41,000 Rebecca được malloc (sizeof (node)). 782 00:43:41,000 --> 00:43:44,000 Cũng giống như chúng tôi đã phân bổ những thứ như học sinh và whatnot trong quá khứ, 783 00:43:44,000 --> 00:43:46,000 chúng ta cần kích thước của nút, vì vậy bây giờ Rebecca 784 00:43:46,000 --> 00:43:49,000 chỉ vào những gì? 785 00:43:49,000 --> 00:43:52,000 Rebecca có hai lĩnh vực bên trong của cô, một trong số đó là 55. 786 00:43:52,000 --> 00:43:55,000 Hãy làm những gì, rebecca-> = 55. 787 00:43:55,000 --> 00:44:00,000 Nhưng sau đó rebecca-> tiếp theo nên được như bây giờ, bàn tay của cô là loại người hiểu biết? 788 00:44:00,000 --> 00:44:03,000 Nó chỉ vào một số giá trị rác, vậy tại sao không phải là phương pháp tốt 789 00:44:03,000 --> 00:44:07,000 ít nhất chúng ta làm điều này để tay trái bây giờ là ở bên cô. 790 00:44:07,000 --> 00:44:09,000 Bây giờ Anita, đưa nó từ đây. 791 00:44:09,000 --> 00:44:11,000 Bạn có Rebecca đã được phân bổ. 792 00:44:11,000 --> 00:44:20,000 Đi trước và tìm thấy nơi chúng ta nên đặt Rebecca. 793 00:44:20,000 --> 00:44:25,000 Tốt, rất tốt. 794 00:44:25,000 --> 00:44:28,000 Được rồi, tốt, và bây giờ chúng tôi cần bạn cung cấp một chút hướng, 795 00:44:28,000 --> 00:44:30,000 vì vậy bạn đã đạt đến Ari. 796 00:44:30,000 --> 00:44:33,000 Bàn tay trái của anh là vô giá trị, nhưng Rebecca rõ ràng thuộc về bên phải, 797 00:44:33,000 --> 00:44:36,000 vậy làm thế nào chúng ta phải thay đổi danh sách liên kết này 798 00:44:36,000 --> 00:44:38,000 để chèn Rebecca vào nơi thích hợp? 799 00:44:38,000 --> 00:44:42,000 Nếu bạn thật sự có thể di chuyển bàn tay trái của người dân xung quanh khi cần thiết, 800 00:44:42,000 --> 00:44:48,000 chúng tôi sẽ khắc phục vấn đề theo cách đó. 801 00:44:48,000 --> 00:44:52,000 Được rồi, tốt, và khi đó, tay trái của Rebecca bây giờ là bên cạnh cô. 802 00:44:52,000 --> 00:44:54,000 >> Đó là quá dễ dàng. 803 00:44:54,000 --> 00:44:57,000 Chúng ta hãy thử phân bổ chúng ta gần như đã hoàn tất, 20. 804 00:44:57,000 --> 00:44:59,000 Được rồi, đến lên. 805 00:44:59,000 --> 00:45:04,000 20 đã được giao, do đó hãy để tôi đi trước và nói một lần nữa ở đây 806 00:45:04,000 --> 00:45:07,000 chúng tôi đã chỉ làm Saad * nút. 807 00:45:07,000 --> 00:45:11,000 Chúng tôi có malloc (sizeof (node)). 808 00:45:11,000 --> 00:45:16,000 Chúng tôi sau đó làm cú pháp chính xác giống như chúng tôi đã làm trước khi cho 20, 809 00:45:16,000 --> 00:45:20,000 và tôi sẽ làm gì tiếp theo = NULL, và bây giờ nó lên để Anita 810 00:45:20,000 --> 00:45:23,000 để chèn vào danh sách liên kết, nếu bạn có thể đóng vai trò đó chính xác cùng. 811 00:45:23,000 --> 00:45:30,000 Thực thi. 812 00:45:30,000 --> 00:45:32,000 Được rồi, tốt. 813 00:45:32,000 --> 00:45:38,000 Bây giờ suy nghĩ cẩn thận trước khi bạn bắt đầu di chuyển tay trái xung quanh. 814 00:45:38,000 --> 00:45:46,000 Bạn đến nay có vai trò vụng về nhất. 815 00:45:46,000 --> 00:45:59,000 Bé bàn tay nên chuyển đầu tiên? 816 00:45:59,000 --> 00:46:02,000 Được rồi, chờ đợi, tôi nghe một số không. 817 00:46:02,000 --> 00:46:07,000 Nếu một số người lịch sự muốn giúp đỡ giải quyết một tình huống khó xử ở đây. 818 00:46:07,000 --> 00:46:11,000 Tay trái mà nên được cập nhật đầu tiên có lẽ? Yeah. 819 00:46:11,000 --> 00:46:13,000 [Sinh viên] Saad. 820 00:46:13,000 --> 00:46:15,000 Được rồi, Saad, tại sao, mặc dù? 821 00:46:15,000 --> 00:46:17,000 [Không nghe được sinh viên phản ứng] 822 00:46:17,000 --> 00:46:19,000 Tốt, bởi vì nếu chúng tôi di chuyển tên của bạn là gì? >> Marshall. 823 00:46:19,000 --> 00:46:22,000 Marshall, nếu chúng ta di chuyển bàn tay của mình đầu tiên xuống thành vô giá trị, 824 00:46:22,000 --> 00:46:25,000 bây giờ chúng tôi có nghĩa là mồ côi bốn người trong danh sách này 825 00:46:25,000 --> 00:46:29,000 bởi vì anh là điều duy nhất chỉ vào Ramon và tất cả mọi người bên trái, 826 00:46:29,000 --> 00:46:31,000 để cập nhật con trỏ đầu tiên là xấu. 827 00:46:31,000 --> 00:46:33,000 Hãy lùi lại mà. 828 00:46:33,000 --> 00:46:37,000 Tốt, và bây giờ đi trước và di chuyển tay trái thích hợp chỉ vào Ramon. 829 00:46:37,000 --> 00:46:39,000 Điều này cảm thấy dư thừa ít. 830 00:46:39,000 --> 00:46:41,000 Bây giờ có hai người chỉ vào Ramon, nhưng đó là tiền phạt 831 00:46:41,000 --> 00:46:43,000 bởi vì bây giờ làm thế nào khác để chúng tôi cập nhật danh sách? 832 00:46:43,000 --> 00:46:48,000 Mặt khác để di chuyển? 833 00:46:48,000 --> 00:46:53,000 Tuyệt vời, bây giờ chúng tôi bị mất bất kỳ bộ nhớ? 834 00:46:53,000 --> 00:46:57,000 Không, tốt như vậy, chúng ta hãy xem nếu chúng ta không có thể phá vỡ một lần nữa. 835 00:46:57,000 --> 00:47:00,000 >> Mallocing một lần cuối, số 5. 836 00:47:00,000 --> 00:47:04,000 Tất cả các con đường trong trở lại, trên xuống. 837 00:47:04,000 --> 00:47:08,000 Nó rất thú vị. 838 00:47:08,000 --> 00:47:15,000 [Vỗ tay] 839 00:47:15,000 --> 00:47:17,000 Tên bạn là gì? >> Ron. 840 00:47:17,000 --> 00:47:19,000 Ron, okay, bạn đang malloced là số 5. 841 00:47:19,000 --> 00:47:23,000 Chúng tôi đã chỉ thực hiện mã đó là gần như giống hệt với những 842 00:47:23,000 --> 00:47:26,000 chỉ với một cái tên khác nhau. 843 00:47:26,000 --> 00:47:28,000 Excellent. 844 00:47:28,000 --> 00:47:38,000 Bây giờ, Anita, chúc may mắn chèn số 5 vào danh sách. 845 00:47:38,000 --> 00:47:43,000 Tốt, và 846 00:47:43,000 --> 00:47:47,000 Tuyệt vời, do đó, đây thực sự là con thứ ba trong tổng số ba trường hợp. 847 00:47:47,000 --> 00:47:49,000 Chúng tôi lần đầu tiên có một người nào đó ở cuối, Rebecca. 848 00:47:49,000 --> 00:47:51,000 Sau đó chúng tôi đã có một người nào đó ở giữa. 849 00:47:51,000 --> 00:47:53,000 Bây giờ chúng ta có một người nào đó ngay từ đầu, và trong ví dụ này, 850 00:47:53,000 --> 00:47:56,000 bây giờ chúng ta phải cập nhật Lucas lần đầu tiên 851 00:47:56,000 --> 00:48:00,000 bởi vì phần tử đầu tiên trong danh sách đã chỉ vào một nút mới, 852 00:48:00,000 --> 00:48:03,000 , lần lượt, chỉ số nút 9. 853 00:48:03,000 --> 00:48:06,000 >> Đây là một cuộc biểu tình cực kỳ khó xử, tôi chắc chắn, 854 00:48:06,000 --> 00:48:08,000 do đó, người lớn vòng tràng pháo tay cho những kẻ nếu bạn có thể. 855 00:48:08,000 --> 00:48:11,000 Độc đáo làm. 856 00:48:11,000 --> 00:48:17,000 Đó là tất cả. Bạn có thể giữ mảnh giấy như là một ít bộ nhớ. 857 00:48:17,000 --> 00:48:22,000 Nó chỉ ra rằng làm điều này trong mã 858 00:48:22,000 --> 00:48:26,000 không phải là khá đơn giản như chỉ cần di chuyển tay 859 00:48:26,000 --> 00:48:28,000 và chỉ con trỏ vào những thứ khác nhau. 860 00:48:28,000 --> 00:48:31,000 Nhưng nhận ra rằng khi nói đến thời gian để thực hiện một cái gì đó như 861 00:48:31,000 --> 00:48:34,000 một danh sách liên kết hoặc biến thể của nó nếu bạn tập trung vào thực sự 862 00:48:34,000 --> 00:48:38,000 những nguyên tắc cơ bản cơ bản, những vấn đề bite-size tôi phải tìm ra, 863 00:48:38,000 --> 00:48:43,000 là bàn tay hoặc bàn tay này, nhận ra rằng những gì nếu không là một chương trình khá phức tạp 864 00:48:43,000 --> 00:48:47,000 , trên thực tế, có thể được giảm đến khối xây dựng khá đơn giản như thế này. 865 00:48:47,000 --> 00:48:51,000 >> Hãy lấy những thứ trong một hướng phức tạp hơn vẫn còn. 866 00:48:51,000 --> 00:48:53,000 Bây giờ chúng ta có khái niệm về danh sách liên kết. 867 00:48:53,000 --> 00:48:57,000 Chúng tôi cũng có những gợi ý lại có một danh sách liên kết kép, 868 00:48:57,000 --> 00:49:01,000 trông gần như giống nhau, nhưng bây giờ chúng tôi có hai con trỏ bên trong các cấu trúc 869 00:49:01,000 --> 00:49:05,000 thay vì một, và chúng tôi có thể có thể gọi các con trỏ trước và sau 870 00:49:05,000 --> 00:49:08,000 hoặc sang trái hoặc phải, nhưng chúng tôi, trên thực tế, cần hai người trong số họ. 871 00:49:08,000 --> 00:49:10,000 Mã sẽ được tham gia nhiều hơn một chút. 872 00:49:10,000 --> 00:49:12,000 Anita sẽ phải làm thêm công việc ở đây trên sân khấu. 873 00:49:12,000 --> 00:49:15,000 Nhưng chúng tôi chắc chắn có thể thực hiện điều đó loại cấu trúc. 874 00:49:15,000 --> 00:49:19,000 Về thời gian chạy, mặc dù, những gì sẽ là thời gian chạy 875 00:49:19,000 --> 00:49:24,000 Anita của việc tìm kiếm một số n trong một danh sách liên kết? 876 00:49:24,000 --> 00:49:27,000 Vẫn còn lớn O của n, vì vậy nó không có gì tốt hơn so với tìm kiếm tuyến tính. 877 00:49:27,000 --> 00:49:29,000 Chúng ta không thể làm tìm kiếm nhị phân, mặc dù, một lần nữa. 878 00:49:29,000 --> 00:49:34,000 Tại sao như vậy không? Bạn không thể nhảy xung quanh. 879 00:49:34,000 --> 00:49:36,000 Mặc dù chúng tôi rõ ràng nhìn thấy tất cả những con người trên sân khấu, 880 00:49:36,000 --> 00:49:39,000 và Anita có thể đã nghiệm nó và nói: "Đây là giữa của danh sách," 881 00:49:39,000 --> 00:49:42,000 cô sẽ không biết rằng nếu cô ấy là những chương trình máy tính 882 00:49:42,000 --> 00:49:47,000 bởi vì điều duy nhất cô phải bám vào lúc bắt đầu của kịch bản 883 00:49:47,000 --> 00:49:50,000 là Lucas, con trỏ đầu tiên. 884 00:49:50,000 --> 00:49:53,000 Cô ấy nhất thiết sẽ phải thực hiện theo các liên kết này, 885 00:49:53,000 --> 00:49:56,000 tính cách của mình cho đến khi cô tìm thấy khoảng giữa, 886 00:49:56,000 --> 00:49:58,000 và thậm chí sau đó, cô ấy sẽ không biết khi nào nó tới giữa 887 00:49:58,000 --> 00:50:01,000 trừ khi cô ấy đi tất cả các cách để kết thúc để tìm ra có bao nhiêu, 888 00:50:01,000 --> 00:50:05,000 sau đó backtracks, và đó cũng sẽ là khó trừ khi bạn có 889 00:50:05,000 --> 00:50:07,000 một danh sách liên kết kép của một số loại. 890 00:50:07,000 --> 00:50:10,000 >> Giải quyết một số vấn đề ngày hôm nay, nhưng giới thiệu những người khác. 891 00:50:10,000 --> 00:50:12,000 Điều gì về một cấu trúc dữ liệu khác nhau hoàn toàn? 892 00:50:12,000 --> 00:50:15,000 Đây là một bức ảnh của các khay trong Mather House, 893 00:50:15,000 --> 00:50:19,000 và trong trường hợp này, chúng tôi có một cấu trúc dữ liệu chúng tôi cũng đã loại được nói về. 894 00:50:19,000 --> 00:50:22,000 Chúng tôi nói về một chồng trong bối cảnh của bộ nhớ, 895 00:50:22,000 --> 00:50:26,000 và đó là loại cố tình đặt tên bởi vì một cây rơm trong các điều khoản của bộ nhớ 896 00:50:26,000 --> 00:50:31,000 là có hiệu quả một cấu trúc dữ liệu có nhiều thứ hơn và nhiều hơn nữa lớp trên đầu trang của nó. 897 00:50:31,000 --> 00:50:35,000 Nhưng điều thú vị về một chồng, như là trường hợp trong thực tế, 898 00:50:35,000 --> 00:50:38,000 rằng đó là một loại đặc biệt của cấu trúc dữ liệu. 899 00:50:38,000 --> 00:50:42,000 Đó là một cấu trúc dữ liệu, theo đó các yếu tố đầu tiên trong 900 00:50:42,000 --> 00:50:46,000 là yếu tố cuối cùng. 901 00:50:46,000 --> 00:50:50,000 Nếu bạn là khay đầu tiên được đưa vào stack, 902 00:50:50,000 --> 00:50:53,000 bạn sẽ là không may khay cuối cùng được đưa ra khỏi ngăn xếp, 903 00:50:53,000 --> 00:50:55,000 và đó là không nhất thiết phải là một điều tốt. 904 00:50:55,000 --> 00:50:58,000 Ngược lại, bạn có thể nghĩ về nó theo cách khác xung quanh, 905 00:50:58,000 --> 00:51:02,000 người cuối cùng trong là sản phẩm đầu tiên. 906 00:51:02,000 --> 00:51:05,000 >> Bây giờ, bất kỳ kịch bản đến với tâm trí, nơi có một chồng 907 00:51:05,000 --> 00:51:08,000 cấu trúc dữ liệu, nơi bạn có tài sản đó 908 00:51:08,000 --> 00:51:13,000 cuối cùng, ra đầu tiên, thực sự là hấp dẫn? 909 00:51:13,000 --> 00:51:16,000 Đó có phải là một điều tốt? Đó có phải là một điều xấu? 910 00:51:16,000 --> 00:51:19,000 Đó chắc chắn là một điều xấu nếu các khay không phải tất cả các giống hệt nhau 911 00:51:19,000 --> 00:51:21,000 và họ đã được tất cả các màu sắc khác nhau đặc biệt hoặc whatnot, 912 00:51:21,000 --> 00:51:24,000 và màu sắc mà bạn muốn là tất cả các con đường ở phía dưới. 913 00:51:24,000 --> 00:51:26,000 Tất nhiên, bạn không thể nhận được rằng nếu không có nỗ lực rất lớn. 914 00:51:26,000 --> 00:51:28,000 Bạn phải bắt đầu từ đầu và làm việc theo cách của bạn xuống. 915 00:51:28,000 --> 00:51:31,000 Tương tự như vậy, điều gì sẽ xảy ra nếu bạn là một trong những chàng trai hâm mộ 916 00:51:31,000 --> 00:51:34,000 người chờ đợi cả đêm cố gắng để có được một chiếc iPhone và dòng lên 917 00:51:34,000 --> 00:51:36,000 tại một nơi như thế này? 918 00:51:36,000 --> 00:51:40,000 Nó sẽ không được tốt đẹp nếu các cửa hàng Apple 919 00:51:40,000 --> 00:51:42,000 là một cấu trúc dữ liệu ngăn xếp? 920 00:51:42,000 --> 00:51:44,000 Yay? Nay? 921 00:51:44,000 --> 00:51:47,000 Nó chỉ tốt cho những người đến ở phút cuối cùng 922 00:51:47,000 --> 00:51:50,000 và sau đó nhận được ngắt hàng đợi. 923 00:51:50,000 --> 00:51:52,000 Và trên thực tế, thực tế là tôi đã nghiêng như vậy để nói rằng hàng đợi 924 00:51:52,000 --> 00:51:56,000 là thực sự phù hợp với những gì chúng tôi gọi đây là loại cấu trúc dữ liệu, 925 00:51:56,000 --> 00:51:59,000 trong thực tế thứ tự không thành vấn đề, 926 00:51:59,000 --> 00:52:02,000 và bạn muốn là người đầu tiên là một trong những người đầu tiên 927 00:52:02,000 --> 00:52:04,000 nếu chỉ vì lợi ích công bằng của con người. 928 00:52:04,000 --> 00:52:07,000 Chúng tôi thường sẽ gọi đó là một cấu trúc dữ liệu hàng đợi. 929 00:52:07,000 --> 00:52:11,000 >> Nó chỉ ra ngoài danh sách liên kết, chúng ta có thể bắt đầu bằng cách sử dụng những ý tưởng cơ bản giống nhau 930 00:52:11,000 --> 00:52:15,000 và bắt đầu tạo ra các loại mới và khác nhau của các giải pháp cho các vấn đề. 931 00:52:15,000 --> 00:52:19,000 Ví dụ, trong trường hợp của một chồng, chúng ta có thể đại diện cho một chồng 932 00:52:19,000 --> 00:52:22,000 bằng cách sử dụng một cấu trúc dữ liệu như thế này, tôi sẽ đề xuất. 933 00:52:22,000 --> 00:52:26,000 Trong trường hợp này, tôi đã tuyên bố một cấu trúc, và tôi đã nói bên trong của cấu trúc này 934 00:52:26,000 --> 00:52:30,000 là một loạt các con số và sau đó biến một kích thước được gọi là, 935 00:52:30,000 --> 00:52:33,000 và tôi sẽ gọi điều này một chồng. 936 00:52:33,000 --> 00:52:35,000 Bây giờ, tại sao điều này thực sự làm việc? 937 00:52:35,000 --> 00:52:43,000 Trong trường hợp của một chồng, tôi có thể vẽ này có hiệu quả trên màn hình như là một mảng. 938 00:52:43,000 --> 00:52:47,000 Dưới đây là chồng của tôi. Đó là những con số của tôi. 939 00:52:47,000 --> 00:52:50,000 Và chúng tôi sẽ vẽ chúng như thế này, này, này, này, này. 940 00:52:50,000 --> 00:52:53,000 Và sau đó tôi có một số thành viên dữ liệu khác ở đây, 941 00:52:53,000 --> 00:52:58,000 được gọi là kích thước, do đó, đây là kích thước, và đây là con số, 942 00:52:58,000 --> 00:53:02,000 và tập thể, cả iPad ở đây đại diện cho một cấu trúc ngăn xếp. 943 00:53:02,000 --> 00:53:07,000 Bây giờ, theo mặc định, kích thước đã có lẽ đã được khởi tạo là 0, 944 00:53:07,000 --> 00:53:11,000 và những gì bên trong các mảng của các con số ban đầu 945 00:53:11,000 --> 00:53:14,000 khi tôi lần đầu tiên cấp phát một mảng? 946 00:53:14,000 --> 00:53:16,000 Rác thải. Ai biết được? Và nó không thực sự quan trọng. 947 00:53:16,000 --> 00:53:20,000 Nó không quan trọng nếu điều này là 1, 2, 3, 4, 5, hoàn toàn ngẫu nhiên 948 00:53:20,000 --> 00:53:25,000 may mắn được lưu trữ trong cơ cấu của tôi bởi vì như tôi biết rằng kích thước của ngăn xếp 949 00:53:25,000 --> 00:53:29,000 là 0, sau đó tôi biết lập trình, không nhìn vào bất kỳ phần tử trong mảng. 950 00:53:29,000 --> 00:53:31,000 Nó không quan trọng những gì đang có. 951 00:53:31,000 --> 00:53:34,000 Đừng nhìn vào họ, như sẽ là ý nghĩa của một kích thước từ 0. 952 00:53:34,000 --> 00:53:38,000 >> Nhưng giả sử bây giờ tôi đi trước và chèn một cái gì đó vào ngăn xếp. 953 00:53:38,000 --> 00:53:42,000 Tôi muốn chèn số 5, vì vậy tôi đặt số 5 ở đây, 954 00:53:42,000 --> 00:53:45,000 và sau đó tôi làm những gì đặt xuống ở đây? 955 00:53:45,000 --> 00:53:48,000 Bây giờ tôi thực sự sẽ đặt xuống 1 với kích thước, 956 00:53:48,000 --> 00:53:50,000 và bây giờ stack là có kích thước 1. 957 00:53:50,000 --> 00:53:53,000 Điều gì sẽ xảy ra nếu tôi đi trước và chèn số, chúng ta hãy nói rằng, 7 tiếp theo? 958 00:53:53,000 --> 00:53:57,000 Điều này sau đó được cập nhật đến 2, và sau đó chúng tôi sẽ làm 9, 959 00:53:57,000 --> 00:54:02,000 và sau đó được cập nhật đến 3. 960 00:54:02,000 --> 00:54:05,000 Tuy nhiên, tính năng thú vị của ngăn xếp này là 961 00:54:05,000 --> 00:54:09,000 Tôi là nghĩa vụ để loại bỏ phần tử nếu tôi muốn để bật 962 00:54:09,000 --> 00:54:12,000 một cái gì đó của ngăn xếp, vậy để nói chuyện? 963 00:54:12,000 --> 00:54:14,000 9 sẽ là điều đầu tiên để đi. 964 00:54:14,000 --> 00:54:18,000 Làm thế nào hình ảnh cũng thay đổi nếu tôi muốn bật một phần tử ra khỏi stack, 965 00:54:18,000 --> 00:54:20,000 giống như một khay trong Mather? 966 00:54:20,000 --> 00:54:22,000 Vâng >> [Sinh viên] Set kích thước 2. 967 00:54:22,000 --> 00:54:27,000 Chính xác, tất cả những gì tôi làm là thiết lập kích thước đến 2, và tôi phải làm gì với mảng? 968 00:54:27,000 --> 00:54:29,000 Tôi không phải làm bất cứ điều gì. 969 00:54:29,000 --> 00:54:32,000 , Chỉ cần tôi có thể là hậu môn, có đặt một 0 hoặc -1 hoặc một cái gì đó để biểu 970 00:54:32,000 --> 00:54:34,000 điều này không phải là một giá trị VN, nhưng nó không quan trọng bởi vì 971 00:54:34,000 --> 00:54:37,000 Tôi có thể ghi bên ngoài của các mảng chính nó bao lâu nó 972 00:54:37,000 --> 00:54:41,000 vì vậy mà tôi biết chỉ nhìn vào hai yếu tố đầu tiên trong mảng này. 973 00:54:41,000 --> 00:54:47,000 Bây giờ, nếu tôi đi và thêm số 8 vào mảng này, làm thế nào để hình ảnh thay đổi tiếp theo? 974 00:54:47,000 --> 00:54:50,000 Điều này sẽ trở thành 8, và điều này trở thành 3. 975 00:54:50,000 --> 00:54:52,000 Tôi cắt một góc ở đây. 976 00:54:52,000 --> 00:54:56,000 Bây giờ chúng tôi có 5, 7, 8, và chúng tôi trở lại kích thước của 3. 977 00:54:56,000 --> 00:54:58,000 Điều này là khá đơn giản để thực hiện, 978 00:54:58,000 --> 00:55:06,000 nhưng khi chúng ta sẽ phải hối tiếc quyết định thiết kế này? 979 00:55:06,000 --> 00:55:09,000 Khi nào mọi thứ bắt đầu đi rất, rất sai trái? Yeah. 980 00:55:09,000 --> 00:55:11,000 [Không nghe được sinh viên phản ứng] 981 00:55:11,000 --> 00:55:13,000 Khi bạn muốn quay trở lại và được những yếu tố đầu tiên bạn đặt in 982 00:55:13,000 --> 00:55:18,000 >> Hóa ra ở đây mặc dù một chồng là một mảng bên dưới mui xe, 983 00:55:18,000 --> 00:55:21,000 các cấu trúc dữ liệu này chúng tôi đã bắt đầu nói về cũng thường được gọi là 984 00:55:21,000 --> 00:55:25,000 trừu tượng cấu trúc dữ liệu nhờ đó mà họ đang thực hiện như thế nào 985 00:55:25,000 --> 00:55:27,000 là hoàn toàn bên cạnh điểm. 986 00:55:27,000 --> 00:55:31,000 Một cấu trúc dữ liệu như một chồng là nghĩa vụ phải hỗ trợ thêm 987 00:55:31,000 --> 00:55:35,000 các hoạt động như đẩy, đẩy một khay vào ngăn xếp, 988 00:55:35,000 --> 00:55:39,000 và pop, mà loại bỏ một phần tử từ ngăn xếp, và đó là nó. 989 00:55:39,000 --> 00:55:43,000 Nếu bạn đã tải về mã của người khác đã thực hiện 990 00:55:43,000 --> 00:55:46,000 điều này được gọi là một chồng, người đó sẽ có văn bản 991 00:55:46,000 --> 00:55:49,000 chỉ có hai chức năng cho bạn, đẩy và pop, mục đích duy nhất trong cuộc sống 992 00:55:49,000 --> 00:55:51,000 sẽ làm chính xác điều đó. 993 00:55:51,000 --> 00:55:54,000 Bạn hoặc anh ta hoặc cô thực hiện chương trình đó 994 00:55:54,000 --> 00:55:58,000 sẽ có được hoàn toàn là một trong những quyết định làm thế nào để thực hiện 995 00:55:58,000 --> 00:56:00,000 ngữ nghĩa của đẩy và popping bên dưới mui xe 996 00:56:00,000 --> 00:56:03,000 hoặc các chức năng của đẩy và popping. 997 00:56:03,000 --> 00:56:07,000 Và tôi đã thực hiện một quyết định hơi thiển cận ở đây 998 00:56:07,000 --> 00:56:10,000 bằng cách thực hiện ngăn xếp của tôi với cấu trúc dữ liệu đơn giản tại sao? 999 00:56:10,000 --> 00:56:12,000 Khi thực hiện điều này phá vỡ cấu trúc dữ liệu? 1000 00:56:12,000 --> 00:56:18,000 Tại điểm nào tôi phải trả lại một lỗi khi người dùng gọi đẩy, ví dụ? 1001 00:56:18,000 --> 00:56:20,000 [Sinh viên] Nếu không có nhiều không gian hơn. 1002 00:56:20,000 --> 00:56:23,000 Chính xác, nếu có không có nhiều không gian hơn, nếu tôi đã vượt quá khả năng, 1003 00:56:23,000 --> 00:56:27,000 đó là tất cả các mũ vì nó cho rằng đó là một số loại hằng số toàn cầu. 1004 00:56:27,000 --> 00:56:30,000 Vâng, sau đó tôi chỉ cần đi có nói, "Xin lỗi, tôi không thể đẩy giá trị khác 1005 00:56:30,000 --> 00:56:32,000 vào stack ", giống như ở Mather. 1006 00:56:32,000 --> 00:56:36,000 >> Tại một số điểm, họ đang đi để đạt phần trên đó tủ nhỏ. 1007 00:56:36,000 --> 00:56:39,000 Không có nhiều không gian hơn hoặc năng lực trong stack, lúc này có một số loại lỗi. 1008 00:56:39,000 --> 00:56:42,000 Họ phải đặt các phần tử ở một nơi khác, khay ở một nơi khác, 1009 00:56:42,000 --> 00:56:44,000 hoặc hư không ở tất cả. 1010 00:56:44,000 --> 00:56:47,000 Bây giờ, với một hàng đợi, chúng ta có thể thực hiện nó một chút khác nhau. 1011 00:56:47,000 --> 00:56:50,000 Hàng đợi là một chút khác nhau trong đó bên dưới mui xe, nó có thể được thực hiện 1012 00:56:50,000 --> 00:56:54,000 như là một mảng, nhưng lý do tại sao, trong trường hợp này, tôi đề nghị 1013 00:56:54,000 --> 00:56:59,000 cũng có một yếu tố đứng đầu đại diện người đứng đầu danh sách, 1014 00:56:59,000 --> 00:57:06,000 mặt trước của danh sách, là người đầu tiên xếp hàng tại các cửa hàng Apple, ngoài kích thước? 1015 00:57:06,000 --> 00:57:14,000 Tại sao tôi cần thêm một mảnh dữ liệu ở đây? 1016 00:57:14,000 --> 00:57:16,000 Hãy suy nghĩ lại những gì con số là 1017 00:57:16,000 --> 00:57:18,000 nếu tôi đã rút ra như sau. 1018 00:57:18,000 --> 00:57:21,000 Giả sử điều này bây giờ là một hàng đợi thay vì một chồng, 1019 00:57:21,000 --> 00:57:24,000 sự khác biệt là giống như hàng đợi cửa hàng của Apple là công bằng. 1020 00:57:24,000 --> 00:57:27,000 Người đầu tiên trong đường dây tại đầu danh sách, số 5 trong trường hợp này, 1021 00:57:27,000 --> 00:57:30,000 họ sẽ được cho phép vào cửa hàng đầu tiên. 1022 00:57:30,000 --> 00:57:32,000 Hãy làm điều đó. 1023 00:57:32,000 --> 00:57:35,000 Giả sử rằng đây là trạng thái của hàng đợi của tôi tại thời điểm này trong thời gian, và bây giờ các cửa hàng Apple 1024 00:57:35,000 --> 00:57:39,000 sẽ mở ra và là người đầu tiên, số 5, được dẫn vào cửa hàng. 1025 00:57:39,000 --> 00:57:43,000 Làm thế nào để thay đổi hình ảnh bây giờ mà tôi đã de-xếp hàng đợi người đầu tiên 1026 00:57:43,000 --> 00:57:47,000 ở phía trước của các dòng? 1027 00:57:47,000 --> 00:57:50,000 Đó là những gì >> [Sinh viên] Thay đổi hàng đợi. 1028 00:57:50,000 --> 00:57:52,000 Thay đổi người đứng đầu, như vậy 5 biến mất. 1029 00:57:52,000 --> 00:57:56,000 Trong thực tế, nó như thế nào tốt nhất để làm điều này? 1030 00:57:56,000 --> 00:58:00,000 Trong thực tế, nó như là mặc dù anh chàng này biến mất. 1031 00:58:00,000 --> 00:58:03,000 Số 7 sẽ làm gì trong một cửa hàng thực tế? 1032 00:58:03,000 --> 00:58:05,000 Họ sẽ có được một bước tiến lớn về phía trước. 1033 00:58:05,000 --> 00:58:08,000 >> Nhưng những gì chúng tôi đã phải đánh giá cao khi nói đến mảng 1034 00:58:08,000 --> 00:58:10,000 và di chuyển những thứ xung quanh? 1035 00:58:10,000 --> 00:58:12,000 Đó là loại một sự lãng phí thời gian của bạn, phải không? 1036 00:58:12,000 --> 00:58:16,000 Tại sao bạn có được như vậy hậu môn như có người đầu tiên 1037 00:58:16,000 --> 00:58:21,000 ở đầu dòng thể chất lúc bắt đầu của đoạn bộ nhớ? 1038 00:58:21,000 --> 00:58:23,000 Đó là hoàn toàn không cần thiết. Tại sao? 1039 00:58:23,000 --> 00:58:26,000 Tôi có thể chỉ cần nhớ thay vì >> [không nghe được sinh viên phản ứng] 1040 00:58:26,000 --> 00:58:30,000 Chính xác, tôi chỉ có thể nhớ với đầu thành viên bổ sung dữ liệu 1041 00:58:30,000 --> 00:58:34,000 mà bây giờ người đứng đầu danh sách là không còn 0, mà nó là một thời điểm trước đây. 1042 00:58:34,000 --> 00:58:39,000 Bây giờ nó thực sự là số 1. Bằng cách này, tôi nhận được một tối ưu hóa nhẹ. 1043 00:58:39,000 --> 00:58:44,000 Chỉ vì tôi đã huỷ bỏ xếp hàng đợi một người nào đó từ dòng ở đầu dòng tại các cửa hàng Apple 1044 00:58:44,000 --> 00:58:47,000 không có nghĩa là tất cả mọi người đã thay đổi, đó là thu hồi một hoạt động tuyến tính. 1045 00:58:47,000 --> 00:58:50,000 Tôi thay vào đó có thể dành thời gian liên tục chỉ 1046 00:58:50,000 --> 00:58:53,000 và đạt được một phản ứng nhanh hơn nhiều. 1047 00:58:53,000 --> 00:58:56,000 Tuy nhiên, giá tôi phải trả là những gì để đạt được hiệu suất bổ sung 1048 00:58:56,000 --> 00:58:58,000 và không có thay đổi tất cả mọi người? 1049 00:58:58,000 --> 00:59:01,000 Vâng >> [không nghe được sinh viên phản ứng]. 1050 00:59:01,000 --> 00:59:04,000 Có thể thêm nhiều người hơn, tốt, vấn đề đó là trực giao 1051 00:59:04,000 --> 00:59:07,000 thực tế rằng chúng tôi không thay đổi những người xung quanh. 1052 00:59:07,000 --> 00:59:11,000 Nó vẫn là một mảng, do đó, có hay không chúng ta thay đổi tất cả mọi người hay không 1053 00:59:11,000 --> 00:59:13,000 oh, tôi thấy những gì bạn có nghĩa là, okay. 1054 00:59:13,000 --> 00:59:16,000 Thực ra, tôi đồng ý với những gì bạn đang nói ở chỗ nó gần như là mặc dù 1055 00:59:16,000 --> 00:59:19,000 chúng tôi bây giờ sẽ không bao giờ sử dụng bắt đầu của mảng này nữa 1056 00:59:19,000 --> 00:59:22,000 bởi vì nếu tôi loại bỏ 5, sau đó tôi loại bỏ 7. 1057 00:59:22,000 --> 00:59:24,000 Nhưng tôi chỉ đưa con người về bên phải. 1058 00:59:24,000 --> 00:59:28,000 >> Nó cảm thấy như tôi là lãng phí không gian, và cuối cùng hàng đợi của tôi tan rã vào không có gì cả, 1059 00:59:28,000 --> 00:59:31,000 vì vậy chúng tôi chỉ có thể có người wraparound, 1060 00:59:31,000 --> 00:59:35,000 và chúng ta có thể suy nghĩ của mảng này thực sự là một số loại cấu trúc tròn, 1061 00:59:35,000 --> 00:59:38,000 nhưng chúng tôi sử dụng những gì nhà điều hành trong C để làm điều đó loại wraparound? 1062 00:59:38,000 --> 00:59:40,000 [Không nghe được sinh viên phản ứng] >> Các nhà điều hành modulo. 1063 00:59:40,000 --> 00:59:43,000 Nó sẽ là một chút phiền phức để suy nghĩ làm thế nào để bạn làm wraparound, 1064 00:59:43,000 --> 00:59:46,000 nhưng chúng ta có thể làm điều đó, và chúng ta có thể bắt đầu đặt con người vào những gì được sử dụng là mặt trước của dòng, 1065 00:59:46,000 --> 00:59:52,000 nhưng chúng ta chỉ cần nhớ với biến này đầu người thực tế của người đứng đầu dòng thực sự là. 1066 00:59:52,000 --> 00:59:57,000 Điều gì sẽ xảy ra nếu, thay vào đó, mục tiêu của chúng tôi cuối cùng, mặc dù, 1067 00:59:57,000 --> 01:00:00,000 là để tìm số, như chúng tôi đã ở đây trên sân khấu với Anita, 1068 01:00:00,000 --> 01:00:02,000 nhưng chúng tôi thực sự muốn tốt nhất của tất cả các thế giới? 1069 01:00:02,000 --> 01:00:05,000 Chúng tôi muốn tinh tế hơn so với mảng cho phép 1070 01:00:05,000 --> 01:00:09,000 bởi vì chúng tôi muốn có khả năng tự động phát triển các cấu trúc dữ liệu. 1071 01:00:09,000 --> 01:00:12,000 Nhưng chúng tôi không muốn có một cái gì đó mà chúng tôi đã chỉ ra 1072 01:00:12,000 --> 01:00:15,000 trong bài giảng đầu tiên không phải là một thuật toán tối ưu, 1073 01:00:15,000 --> 01:00:17,000 đó là tìm kiếm tuyến tính. 1074 01:00:17,000 --> 01:00:21,000 Nó chỉ ra rằng bạn có thể, trên thực tế, đạt được 1075 01:00:21,000 --> 01:00:24,000 hoặc ít nhất là gần với thời gian liên tục, trong đó một người như Anita, 1076 01:00:24,000 --> 01:00:27,000 nếu cô ấy cấu hình cấu trúc dữ liệu của mình không phải là một danh sách liên kết, 1077 01:00:27,000 --> 01:00:30,000 không phải là một chồng, không phải là một hàng đợi, có thể, trong thực tế, 1078 01:00:30,000 --> 01:00:33,000 đi lên với một cấu trúc dữ liệu, cho phép cô nhìn mọi thứ, 1079 01:00:33,000 --> 01:00:37,000 thậm chí từ, chứ không phải chỉ là những con số, những gì chúng tôi sẽ gọi cho thời gian liên tục. 1080 01:00:37,000 --> 01:00:40,000 >> Và trên thực tế, nhìn về phía trước, một trong những các psets trong lớp học này là hầu như luôn luôn 1081 01:00:40,000 --> 01:00:43,000 một thực hiện một kiểm tra chính tả, theo đó 1082 01:00:43,000 --> 01:00:46,000 chúng tôi cung cấp cho bạn một lần nữa một số từ tiếng Anh 150.000 đến mục tiêu là để 1083 01:00:46,000 --> 01:00:51,000 load vào bộ nhớ và nhanh chóng có thể trả lời các câu hỏi của mẫu đơn 1084 01:00:51,000 --> 01:00:54,000 Từ này được viết chính xác? 1085 01:00:54,000 --> 01:00:58,000 Và nó thực sự sẽ suck nếu bạn đã có để lặp qua tất cả 150.000 từ để trả lời. 1086 01:00:58,000 --> 01:01:02,000 Tuy nhiên, trên thực tế, chúng ta sẽ thấy rằng chúng tôi có thể làm điều đó trong thời gian rất, rất nhanh chóng. 1087 01:01:02,000 --> 01:01:06,000 Và nó sẽ liên quan đến việc thực hiện một cái gì đó được gọi là một bảng băm, 1088 01:01:06,000 --> 01:01:09,000 và mặc dù ở cái nhìn đầu tiên điều này được gọi là một bảng băm sẽ 1089 01:01:09,000 --> 01:01:12,000 cho phép chúng tôi đạt được những thời gian nhanh chóng phản ứng siêu, 1090 01:01:12,000 --> 01:01:18,000 nó chỉ ra rằng có trong thực tế một vấn đề. 1091 01:01:18,000 --> 01:01:23,000 Khi nói đến thời gian để thực hiện điều này được gọi là một lần nữa, tôi đang làm nó một lần nữa. 1092 01:01:23,000 --> 01:01:25,000 Tôi là người duy nhất ở đây. 1093 01:01:25,000 --> 01:01:28,000 Khi nói đến thời gian để thực hiện điều này được gọi là một bảng băm, 1094 01:01:28,000 --> 01:01:30,000 chúng ta sẽ phải đưa ra quyết định. 1095 01:01:30,000 --> 01:01:32,000 Làm thế nào lớn nên điều này thực sự là gì? 1096 01:01:32,000 --> 01:01:36,000 Và khi chúng tôi bắt đầu số chèn vào bảng băm này, 1097 01:01:36,000 --> 01:01:38,000 làm thế nào chúng ta sẽ để lưu trữ chúng theo cách như vậy 1098 01:01:38,000 --> 01:01:42,000 rằng chúng ta có thể nhận được chúng trở lại một cách nhanh chóng như chúng tôi đã nhận chúng trong? 1099 01:01:42,000 --> 01:01:45,000 Nhưng chúng ta sẽ thấy lâu, câu hỏi này của 1100 01:01:45,000 --> 01:01:48,000 khi ngày sinh nhật của tất cả mọi người trong lớp sẽ được khá Gecman. 1101 01:01:48,000 --> 01:01:51,000 Nó chỉ ra rằng trong phòng này, chúng tôi đã có vài trăm người, 1102 01:01:51,000 --> 01:01:56,000 do đó, các tỷ lệ cược rằng hai chúng tôi có cùng một ngày sinh nhật có lẽ là khá cao. 1103 01:01:56,000 --> 01:01:58,000 Điều gì sẽ xảy ra nếu chỉ có 40 của chúng tôi trong căn phòng này? 1104 01:01:58,000 --> 01:02:02,000 Tỷ lệ cược của hai người có cùng ngày sinh là gì? 1105 01:02:02,000 --> 01:02:04,000 [Sinh viên] Hơn 50%. 1106 01:02:04,000 --> 01:02:06,000 Yeah, trên 50%. Trong thực tế, tôi thậm chí còn mang một biểu đồ. 1107 01:02:06,000 --> 01:02:08,000 Nó chỉ ra và điều này thực sự chỉ là một Sneak Preview 1108 01:02:08,000 --> 01:02:12,000 nếu chỉ có 58 của chúng tôi trong căn phòng này, xác suất của 2 của chúng tôi 1109 01:02:12,000 --> 01:02:16,000 có cùng ngày sinh là cực kỳ cao, gần như 100%, 1110 01:02:16,000 --> 01:02:20,000 và điều đó sẽ gây ra một bó toàn bộ bị tổn thương đối với chúng tôi hôm thứ Tư. 1111 01:02:20,000 --> 01:02:24,000 >> Với mà nói, chúng ta hãy hoãn ở đây. Chúng tôi sẽ gặp bạn vào thứ tư. 1112 01:02:24,000 --> 01:02:28,000 [Vỗ tay] 1113 01:02:28,000 --> 01:02:30,000 [CS50.TV]