1 00:00:00,000 --> 00:00:03,000 [Powered by Google Translate] [Tuần 4] 2 00:00:03,000 --> 00:00:05,000 [David J. Malan] [Đại học Harvard] 3 00:00:05,000 --> 00:00:08,000 [Đây là CS50.] [CS50.TV] 4 00:00:08,000 --> 00:00:12,000 >> Được rồi, đây là CS50, và điều này là sự bắt đầu của tuần thứ 4, 5 00:00:12,000 --> 00:00:16,000 và đây là một trong các thuật toán phân loại chậm nhất có thể. 6 00:00:16,000 --> 00:00:19,000 Đó một lần mà chúng tôi chỉ xem đó? 7 00:00:19,000 --> 00:00:24,000 Đó là bong bóng sắp xếp, để lớn O (n ^ 2) + tổng hợp, 8 00:00:24,000 --> 00:00:28,000 và thực sự chúng tôi không phải là những người duy nhất trong thế giới này dường như biết 9 00:00:28,000 --> 00:00:30,000 bong bóng sắp xếp thời gian chạy của nó. 10 00:00:30,000 --> 00:00:33,000 Thật vậy, đây là một cuộc phỏng vấn với Eric Schmidt của Google 11 00:00:33,000 --> 00:00:45,000 và cựu Thượng nghị sĩ Barack Obama chỉ là một vài năm trước đây. 12 00:00:45,000 --> 00:00:48,000 >> Bây giờ, Thượng nghị sĩ, bạn ở đây tại Google, 13 00:00:48,000 --> 00:00:54,000 và tôi thích nghĩ của nhiệm kỳ tổng thống là một cuộc phỏng vấn việc làm. 14 00:00:54,000 --> 00:00:58,000 Bây giờ, thật khó để có được một công việc như là chủ tịch, và bạn đang trải qua sự khắc nghiệt. 15 00:00:58,000 --> 00:01:00,000 Nó cũng khó để có được một công việc tại Google. 16 00:01:00,000 --> 00:01:05,000 Chúng tôi có thắc mắc, và chúng tôi yêu cầu ứng viên câu hỏi, 17 00:01:05,000 --> 00:01:10,000 và điều này là từ Larry Schwimmer. 18 00:01:10,000 --> 00:01:14,000 Các bạn nghĩ rằng tôi đang đùa? Nó ở ngay đây. 19 00:01:14,000 --> 00:01:18,000 Cách hiệu quả nhất để sắp xếp một triệu số nguyên 32-bit là gì? 20 00:01:18,000 --> 00:01:21,000 [Cười] 21 00:01:21,000 --> 00:01:24,000 Well- 22 00:01:24,000 --> 00:01:26,000 Tôi xin lỗi >> Không, không, không, không. 23 00:01:26,000 --> 00:01:34,000 Tôi nghĩ rằng các loại bong bóng sẽ là con đường sai để đi. 24 00:01:34,000 --> 00:01:39,000 >> Thôi nào, người đã nói với anh như thế? 25 00:01:39,000 --> 00:01:43,000 Tuần trước, nhớ lại chúng tôi đã nghỉ một từ mã, ít nhất là trong một ngày, 26 00:01:43,000 --> 00:01:46,000 và bắt đầu tập trung vào một số ý tưởng cấp độ cao hơn và giải quyết vấn đề nói chung 27 00:01:46,000 --> 00:01:49,000 trong bối cảnh tìm kiếm và phân loại, 28 00:01:49,000 --> 00:01:53,000 và chúng tôi giới thiệu một cái gì đó mà chúng tôi không tát tên này vào tuần trước, 29 00:01:53,000 --> 00:01:56,000 nhưng tiệm cận ký hiệu, Big O, Omega Big, 30 00:01:56,000 --> 00:02:00,000 và đôi khi Theta Big ký hiệu, và những đơn giản chỉ là cách 31 00:02:00,000 --> 00:02:02,000 mô tả thời gian chạy của thuật toán, 32 00:02:02,000 --> 00:02:05,000 phải mất bao nhiêu thời gian cho một thuật toán để chạy. 33 00:02:05,000 --> 00:02:08,000 >> Và bạn có thể nhớ lại rằng bạn nói chuyện về thời gian hoạt động về kích thước 34 00:02:08,000 --> 00:02:11,000 của các đầu vào, mà chúng ta thường gọi là n, bất cứ vấn đề có thể, 35 00:02:11,000 --> 00:02:13,000 trong đó n là số lượng người trong phòng, 36 00:02:13,000 --> 00:02:17,000 số lượng các trang trong một cuốn sách điện thoại, và chúng tôi bắt đầu viết những điều trên 37 00:02:17,000 --> 00:02:21,000 như O (n ^ 2) hoặc O (n) hoặc O (n log n), 38 00:02:21,000 --> 00:02:24,000 và ngay cả khi tính toán không làm việc khá hoàn hảo 39 00:02:24,000 --> 00:02:28,000 và nó đã được n ² - n / 2 hoặc một cái gì đó như thế 40 00:02:28,000 --> 00:02:31,000 chúng tôi thay vì chỉ ném đi một số các điều khoản cấp thấp hơn, 41 00:02:31,000 --> 00:02:34,000 và động cơ là chúng ta thực sự muốn có một 42 00:02:34,000 --> 00:02:37,000 sắp xếp cách khách quan đánh giá 43 00:02:37,000 --> 00:02:39,000 việc thực hiện các chương trình, hoạt động của các thuật toán 44 00:02:39,000 --> 00:02:42,000 vào cuối ngày không có gì để làm, ví dụ, 45 00:02:42,000 --> 00:02:45,000 với tốc độ của máy tính của bạn ngày hôm nay. 46 00:02:45,000 --> 00:02:47,000 >> Ví dụ, nếu bạn thực hiện loại bong bóng, 47 00:02:47,000 --> 00:02:50,000 hoặc bạn thực hiện hợp nhất phân loại hoặc lựa chọn sắp xếp trên máy tính ngày nay, 48 00:02:50,000 --> 00:02:53,000 2 GHz máy tính, và bạn chạy nó, 49 00:02:53,000 --> 00:02:56,000 và phải mất một số giây, trong năm tới có GHz 3 50 00:02:56,000 --> 00:02:59,000 hoặc 4 GHz máy tính, và sau đó bạn có thể cho rằng "Wow, thuật toán của tôi 51 00:02:59,000 --> 00:03:03,000 bây giờ là nhanh gấp hai lần ", trong khi thực tế rõ ràng là không phải như vậy. 52 00:03:03,000 --> 00:03:06,000 Nó chỉ là phần cứng đã nhận được nhanh hơn, nhưng máy tính của bạn 53 00:03:06,000 --> 00:03:10,000 không và vì vậy chúng tôi thực sự muốn vứt bỏ những thứ như 54 00:03:10,000 --> 00:03:13,000 bội số của 2 hoặc bội số của 3 khi nói đến mô tả 55 00:03:13,000 --> 00:03:17,000 nhanh như thế nào hoặc làm thế nào chậm thuật toán là thực sự chỉ tập trung 56 00:03:17,000 --> 00:03:20,000 n hoặc một số yếu tố của, 57 00:03:20,000 --> 00:03:24,000 một số quyền lực hiện như trong trường hợp của các loại so với tuần trước. 58 00:03:24,000 --> 00:03:27,000 Và nhớ lại rằng với sự giúp đỡ của loại hợp nhất 59 00:03:27,000 --> 00:03:31,000 chúng tôi đã có thể làm tốt hơn rất nhiều hơn loại bong bóng và sắp xếp lựa chọn 60 00:03:31,000 --> 00:03:33,000 và thậm chí chèn loại. 61 00:03:33,000 --> 00:03:36,000 >> Chúng tôi đã xuống đến n log n, và một lần nữa, 62 00:03:36,000 --> 00:03:39,000 nhớ lại rằng log n thường dùng để chỉ một cái gì đó mà phát triển 63 00:03:39,000 --> 00:03:43,000 chậm hơn sau đó n, vì vậy n log n vậy, đến nay là tốt 64 00:03:43,000 --> 00:03:45,000 bởi vì nó là ít hơn n ². 65 00:03:45,000 --> 00:03:47,000 Nhưng để đạt được n đăng nhập n với loại hợp nhất 66 00:03:47,000 --> 00:03:51,000 mầm mống cơ bản của một ý tưởng mà chúng tôi đã tận dụng được những gì 67 00:03:51,000 --> 00:03:54,000 rằng chúng ta cũng thừa hưởng trở lại trong tuần 0? 68 00:03:54,000 --> 00:03:58,000 Làm thế nào chúng ta giải quyết các vấn đề sắp xếp khéo léo với merge loại? 69 00:03:58,000 --> 00:04:04,000 Cái nhìn sâu sắc quan trọng là gì, có lẽ? 70 00:04:04,000 --> 00:04:07,000 Bất cứ ai ở tất cả. 71 00:04:07,000 --> 00:04:09,000 Được rồi, chúng ta hãy lùi lại một bước. 72 00:04:09,000 --> 00:04:11,000 Mô tả hợp nhất sắp xếp theo cách của bạn. 73 00:04:11,000 --> 00:04:15,000 Làm thế nào nó hoạt động? 74 00:04:15,000 --> 00:04:17,000 Được rồi, chúng tôi sẽ chèo trở lại 0 tuần. 75 00:04:17,000 --> 00:04:19,000 Được rồi, yeah. 76 00:04:19,000 --> 00:04:22,000 [Không nghe được học sinh] 77 00:04:22,000 --> 00:04:26,000 Được rồi, tốt, vì vậy chúng tôi chia các mảng của các con số thành 2 mảnh. 78 00:04:26,000 --> 00:04:29,000 Chúng tôi sắp xếp những mảnh, và sau đó chúng tôi kết hợp chúng, 79 00:04:29,000 --> 00:04:33,000 và chúng tôi đã nhìn thấy ý tưởng này trước khi tham gia một vấn đề lớn này 80 00:04:33,000 --> 00:04:36,000 và cắt nó ra thành một vấn đề đó là lớn hay lớn này. 81 00:04:36,000 --> 00:04:38,000 >> Nhớ lại những ví dụ cuốn sách điện thoại. 82 00:04:38,000 --> 00:04:42,000 Nhớ lại những thuật toán tự đếm từ vài tuần trước đây, 83 00:04:42,000 --> 00:04:45,000 sort hợp nhất tóm tắt của thành viên này giả ở đây. 84 00:04:45,000 --> 00:04:48,000 Khi bạn đang đưa ra n phần tử, đầu tiên là kiểm tra sanity. 85 00:04:48,000 --> 00:04:51,000 Nếu n <2 sau đó không làm bất cứ điều gì ở tất cả 86 00:04:51,000 --> 00:04:55,000 bởi vì nếu n <2 sau đó n rõ ràng là 0 hoặc 1, 87 00:04:55,000 --> 00:04:57,000 và vì vậy nếu nó là 0 hoặc 1 không có gì để sắp xếp. 88 00:04:57,000 --> 00:04:59,000 Bạn đang làm. 89 00:04:59,000 --> 00:05:01,000 Danh sách của bạn đã được trivially sắp xếp. 90 00:05:01,000 --> 00:05:04,000 Nhưng nếu không nếu bạn đã có 2 hoặc nhiều hơn các yếu tố đi trước và chia chúng 91 00:05:04,000 --> 00:05:06,000 thành 2 nửa, trái và phải. 92 00:05:06,000 --> 00:05:09,000 Sắp xếp của những người nửa, và sau đó hợp nhất các nửa sắp xếp. 93 00:05:09,000 --> 00:05:13,000 Nhưng vấn đề ở đây là ở cái nhìn đầu tiên này cảm thấy như chúng tôi đang punting. 94 00:05:13,000 --> 00:05:17,000 Đây là một định nghĩa vòng tròn trong đó nếu tôi đã hỏi bạn sắp xếp các yếu tố n 95 00:05:17,000 --> 00:05:22,000 và bạn đang nói với tôi "Được rồi, tốt, chúng tôi sẽ sắp xếp những yếu tố n / 2 và những n / 2", 96 00:05:22,000 --> 00:05:27,000 sau đó câu hỏi tiếp theo của tôi là có được "Được rồi, làm thế nào để sắp xếp n / 2 phần tử?" 97 00:05:27,000 --> 00:05:30,000 >> Tuy nhiên, vì cấu trúc của chương trình này, 98 00:05:30,000 --> 00:05:33,000 bởi vì có trường hợp này cơ sở, có thể nói, 99 00:05:33,000 --> 00:05:39,000 trường hợp đặc biệt này nói rằng nếu n là 00:05:42,000 Không đáp ứng với cùng một câu trả lời tròn. 101 00:05:42,000 --> 00:05:46,000 Quá trình này, cuối cùng cyclicity này sẽ kết thúc. 102 00:05:46,000 --> 00:05:50,000 Nếu tôi yêu cầu "Sắp xếp các yếu tố n," và bạn nói, "Được rồi, sắp xếp các n / 2," 103 00:05:50,000 --> 00:05:53,000 sau đó bạn nói, "Fine, sắp xếp những n / 4, n / 8, n/16," 104 00:05:53,000 --> 00:05:56,000 cuối cùng bạn sẽ chia cho một số lượng đủ lớn 105 00:05:56,000 --> 00:05:59,000 rằng bạn sẽ có chỉ cần 1 yếu tố bên trái, lúc này bạn có thể nói, 106 00:05:59,000 --> 00:06:02,000 "Ở đây, ở đây là một yếu tố duy nhất được sắp xếp." 107 00:06:02,000 --> 00:06:06,000 Sau đó, các sáng chói của thuật toán này ở đây là xuất phát từ thực tế 108 00:06:06,000 --> 00:06:09,000 một khi bạn có tất cả các danh sách này được sắp xếp riêng, 109 00:06:09,000 --> 00:06:12,000 tất cả đều có kích thước 1, mà dường như là vô ích, 110 00:06:12,000 --> 00:06:15,000 khi bạn bắt đầu hợp nhất và sáp nhập chúng 111 00:06:15,000 --> 00:06:19,000 bạn xây dựng cuối cùng như Rob đã làm trong video một danh sách cuối cùng đã được sắp xếp. 112 00:06:19,000 --> 00:06:22,000 >> Nhưng ý tưởng này mở rộng vượt xa phân loại. 113 00:06:22,000 --> 00:06:26,000 Có ý tưởng này được nhúng trong chương trình này được gọi là đệ quy, 114 00:06:26,000 --> 00:06:29,000 ý tưởng theo đó là một chương trình, 115 00:06:29,000 --> 00:06:32,000 và để giải quyết một số vấn đề bạn gọi cho mình, 116 00:06:32,000 --> 00:06:36,000 hoặc đặt trong bối cảnh của những ngôn ngữ lập trình là một chức năng, 117 00:06:36,000 --> 00:06:39,000 và để giải quyết một vấn đề, bạn có chức năng gọi cho mình 118 00:06:39,000 --> 00:06:42,000 một lần nữa và một lần nữa và một lần nữa, nhưng bạn chức năng 119 00:06:42,000 --> 00:06:44,000 không thể gọi cho mình vô số lần. 120 00:06:44,000 --> 00:06:47,000 Cuối cùng bạn phải chạm đáy, do đó, để nói chuyện, 121 00:06:47,000 --> 00:06:49,000 và có một số điều kiện cơ sở mã hóa cứng nói rằng 122 00:06:49,000 --> 00:06:53,000 tại thời điểm này dừng lại gọi mình để toàn bộ quá trình 123 00:06:53,000 --> 00:06:56,000 cuối cùng không thực tế dừng lại. 124 00:06:56,000 --> 00:06:58,000 Điều này không thực sự có nghĩa là gì, để recurse? 125 00:06:58,000 --> 00:07:01,000 >> Hãy xem, nếu chúng ta có thể làm một ví dụ đơn giản, tầm thường với, nói, 126 00:07:01,000 --> 00:07:03,000 3 người với tôi lên trên sân khấu, nếu có ai đó là thoải mái. 127 00:07:03,000 --> 00:07:06,000 1, đến ngày lên, 2 và 3. 128 00:07:06,000 --> 00:07:09,000 Nếu bạn 3 muốn lên đây. 129 00:07:09,000 --> 00:07:12,000 Nếu bạn muốn đứng ngay bên cạnh tôi ở đây trong một dòng, giả sử rằng các vấn đề ở bàn tay 130 00:07:12,000 --> 00:07:15,000 rất trivially đếm số lượng của những người đang ở đây. 131 00:07:15,000 --> 00:07:18,000 Nhưng thẳng thắn, tôi mệt mỏi của tất cả những ví dụ kể. 132 00:07:18,000 --> 00:07:21,000 Điều này sẽ mất một thời gian, 1, 2, và một dấu chấm, dấu chấm, dấu chấm. 133 00:07:21,000 --> 00:07:23,000 Nó sẽ mất mãi mãi. 134 00:07:23,000 --> 00:07:25,000 Tôi muốn chỉ punt vấn đề này hoàn toàn với sự giúp đỡ của tên của bạn là gì? 135 00:07:25,000 --> 00:07:27,000 Sara. >> Sara, tất cả các quyền. 136 00:07:27,000 --> 00:07:29,000 Kelly. >> Kelly và? 137 00:07:29,000 --> 00:07:31,000 >> Willy. >> Willy, Sara, Kelly, và Willy. 138 00:07:31,000 --> 00:07:34,000 Ngay bây giờ tôi đã được hỏi những câu hỏi của một ai đó 139 00:07:34,000 --> 00:07:37,000 bao nhiêu người trên sân khấu này, và tôi không có ý tưởng. 140 00:07:37,000 --> 00:07:40,000 Đây là một danh sách rất dài, và do đó, thay vì tôi sẽ làm điều này lừa. 141 00:07:40,000 --> 00:07:43,000 Tôi sẽ yêu cầu người bên cạnh tôi để làm hầu hết công việc, 142 00:07:43,000 --> 00:07:46,000 và khi cô ấy được thực hiện làm hầu hết công việc 143 00:07:46,000 --> 00:07:49,000 Tôi sẽ làm số tiền ít nhất có thể làm việc và chỉ cần thêm 1 144 00:07:49,000 --> 00:07:51,000 bất cứ câu trả lời của cô, vì vậy ở đây chúng tôi đi. 145 00:07:51,000 --> 00:07:54,000 Tôi đã yêu bao nhiêu người trên sân khấu. 146 00:07:54,000 --> 00:07:57,000 Có bao nhiêu người trên sân khấu để bên trái của bạn? 147 00:07:57,000 --> 00:08:00,000 Bên trái của tôi >> Được rồi, nhưng không ăn gian. 148 00:08:00,000 --> 00:08:04,000 Đó là tốt, đó là chính xác, nhưng nếu chúng ta muốn tiếp tục logic này 149 00:08:04,000 --> 00:08:08,000 chúng ta hãy giả sử rằng bạn tương tự như muốn punt vấn đề này để bên trái của bạn, 150 00:08:08,000 --> 00:08:11,000 chứ không phải là câu trả lời trực tiếp đi trước và chỉ cần vượt qua các buck. 151 00:08:11,000 --> 00:08:14,000 Oh, có bao nhiêu người bên trái của tôi? 152 00:08:14,000 --> 00:08:16,000 Có bao nhiêu người bên trái? 153 00:08:16,000 --> 00:08:18,000 1. 154 00:08:18,000 --> 00:08:27,000 [Cười] 155 00:08:27,000 --> 00:08:30,000 Được rồi, do đó, 0, vì vậy những gì bây giờ Willy đã làm 156 00:08:30,000 --> 00:08:33,000 là bạn đã quay trở lại câu trả lời của bạn hướng này nói rằng 0. 157 00:08:33,000 --> 00:08:36,000 Bây giờ, những gì bạn nên làm gì? >> 1. 158 00:08:36,000 --> 00:08:39,000 Được rồi, do đó, bạn là số 1, vì vậy bạn nói, "Được rồi, tôi sẽ thêm 1 159 00:08:39,000 --> 00:08:41,000 để bất cứ điều gì Willy đếm được ", vì vậy 1 + 0. 160 00:08:41,000 --> 00:08:43,000 Bây giờ bạn đã 1 do đó, câu trả lời của bạn bên phải bây giờ là 161 00:08:43,000 --> 00:08:45,000 1. >> Và tôi sẽ là 2. 162 00:08:45,000 --> 00:08:48,000 Tốt, do đó, bạn đang dùng các câu trả lời trước của 1, 163 00:08:48,000 --> 00:08:51,000 thêm số tiền tối thiểu của công việc bạn muốn làm, mà là +1. 164 00:08:51,000 --> 00:08:55,000 Bây giờ bạn có 2, và sau đó bạn đưa cho tôi mà giá trị? 165 00:08:55,000 --> 00:08:57,000 3, tôi có nghĩa là, xin lỗi, 2. 166 00:08:57,000 --> 00:08:59,000 Tốt. 167 00:08:59,000 --> 00:09:02,000 >> Vâng, chúng tôi đã có 0 bên trái. 168 00:09:02,000 --> 00:09:05,000 Sau đó, chúng tôi đã có 1, và sau đó chúng tôi thêm 2, 169 00:09:05,000 --> 00:09:07,000 và bây giờ bạn đang trao cho tôi số 2, 170 00:09:07,000 --> 00:09:10,000 và vì vậy tôi đang nói, okay, +1, 3. 171 00:09:10,000 --> 00:09:13,000 Có thực sự 3 người đứng cạnh tôi trên sân khấu này, 172 00:09:13,000 --> 00:09:16,000 vì vậy chúng tôi có thể đã rõ ràng làm điều này rất tuyến tính, 173 00:09:16,000 --> 00:09:19,000 rất nhiều trong thời trang rõ ràng, nhưng những gì chúng tôi đã thực sự làm? 174 00:09:19,000 --> 00:09:21,000 Chúng tôi đã là một vấn đề có kích thước 3 ban đầu. 175 00:09:21,000 --> 00:09:24,000 Sau đó chúng tôi đã phá vỡ nó xuống thành một vấn đề về kích thước 2, 176 00:09:24,000 --> 00:09:27,000 sau đó là một vấn đề có kích thước 1, và cuối cùng trường hợp cơ sở 177 00:09:27,000 --> 00:09:29,000 thật sự, oh, không có ai ở đó, 178 00:09:29,000 --> 00:09:33,000 điểm mà tại đó Willy trở lại có hiệu quả một câu trả lời cứng mã hóa một vài lần, 179 00:09:33,000 --> 00:09:36,000 và một trong những thứ hai sau đó đã được sôi nổi, sôi nổi, sôi nổi, 180 00:09:36,000 --> 00:09:39,000 và sau đó thêm này thêm một 1 181 00:09:39,000 --> 00:09:41,000 chúng tôi đã thực hiện ý tưởng này cơ bản của đệ quy. 182 00:09:41,000 --> 00:09:44,000 >> Bây giờ, trong trường hợp này, nó không thực sự giải quyết một vấn đề 183 00:09:44,000 --> 00:09:46,000 bất kỳ hiệu quả hơn sau đó chúng tôi đã nhìn thấy cho đến nay. 184 00:09:46,000 --> 00:09:48,000 Nhưng hãy nghĩ về các thuật toán chúng tôi đã thực hiện trên sân khấu vậy, đến nay. 185 00:09:48,000 --> 00:09:51,000 Chúng tôi đã có 8 miếng giấy lên bảng, 186 00:09:51,000 --> 00:09:55,000 trên video khi Sean đang tìm kiếm cho số 7, và ông đã làm những gì thực sự làm? 187 00:09:55,000 --> 00:09:58,000 À, anh ấy đã không làm bất kỳ loại phân chia và chinh phục. 188 00:09:58,000 --> 00:10:01,000 Ông đã không làm bất kỳ loại đệ quy. 189 00:10:01,000 --> 00:10:03,000 Thay vì ông đã làm điều này thuật toán tuyến tính. 190 00:10:03,000 --> 00:10:07,000 Nhưng khi chúng tôi giới thiệu ý tưởng của các số được sắp xếp trên sân khấu sống tuần trước 191 00:10:07,000 --> 00:10:09,000 sau đó chúng tôi đã có bản năng đi đến giữa, 192 00:10:09,000 --> 00:10:13,000 tại thời điểm đó, chúng tôi đã có một danh sách nhỏ hơn kích thước 4 hoặc danh sách khác của kích thước 4, 193 00:10:13,000 --> 00:10:17,000 và sau đó chúng tôi đã có cùng một vấn đề chính xác, vì vậy chúng tôi lặp đi lặp lại, lặp đi lặp lại, lặp đi lặp lại. 194 00:10:17,000 --> 00:10:19,000 Nói cách khác, chúng tôi recursed. 195 00:10:19,000 --> 00:10:24,000 Cảm ơn bạn rất nhiều đến 3 tình nguyện viên của chúng tôi ở đây để chứng minh đệ quy với chúng tôi. 196 00:10:24,000 --> 00:10:28,000 >> Hãy xem nếu chúng ta không thể thực hiện điều này cụ thể hơn một chút, 197 00:10:28,000 --> 00:10:30,000 việc giải quyết một vấn đề mà một lần nữa chúng ta có thể làm được khá dễ dàng, 198 00:10:30,000 --> 00:10:34,000 nhưng chúng tôi sẽ sử dụng nó như là một bước để thực hiện ý tưởng này cơ bản. 199 00:10:34,000 --> 00:10:37,000 Nếu tôi muốn để tính toán tổng của một loạt các con số, 200 00:10:37,000 --> 00:10:39,000 Ví dụ, nếu bạn vượt qua trong số 3, 201 00:10:39,000 --> 00:10:42,000 Tôi muốn cung cấp cho bạn giá trị của sigma 3, 202 00:10:42,000 --> 00:10:46,000 như vậy tổng của 3 + 2 + 1 + 0. 203 00:10:46,000 --> 00:10:48,000 Tôi muốn nhận được câu trả lời 6, 204 00:10:48,000 --> 00:10:51,000 do đó, chúng tôi sẽ thực hiện chức năng này sigma, chức năng này tổng kết 205 00:10:51,000 --> 00:10:54,000 , một lần nữa, có trong đầu vào, và sau đó trả về tổng kết 206 00:10:54,000 --> 00:10:57,000 của con số tất cả các cách xuống 0. 207 00:10:57,000 --> 00:10:59,000 Chúng ta có thể làm điều này khá đơn giản, phải không? 208 00:10:59,000 --> 00:11:01,000 Chúng ta có thể làm điều này với một số loại cấu trúc vòng lặp, 209 00:11:01,000 --> 00:11:04,000 vì vậy hãy để tôi đi trước và điều này bắt đầu. 210 00:11:04,000 --> 00:11:07,000 >> Bao gồm stdio.h. 211 00:11:07,000 --> 00:11:09,000 Hãy để tôi nhận được bản thân mình vào chính để làm việc ở đây. 212 00:11:09,000 --> 00:11:12,000 Hãy lưu là sigma.c. 213 00:11:12,000 --> 00:11:14,000 Sau đó, tôi sẽ đi ở đây, và tôi sẽ khai báo một n int, 214 00:11:14,000 --> 00:11:18,000 và tôi sẽ làm như sau trong khi người sử dụng không hợp tác. 215 00:11:18,000 --> 00:11:22,000 Trong khi người sử dụng đã không cho tôi một số dương 216 00:11:22,000 --> 00:11:26,000 hãy để tôi đi trước và nhắc nhở họ cho n = getInt, 217 00:11:26,000 --> 00:11:28,000 và để cho tôi cung cấp cho họ một số hướng dẫn như những gì để làm, 218 00:11:28,000 --> 00:11:33,000 để printf ("Tích cực số nguyên"). 219 00:11:33,000 --> 00:11:39,000 Chỉ cần một cái gì đó tương đối đơn giản như thế này để theo thời gian, chúng tôi nhấn dòng 14 220 00:11:39,000 --> 00:11:42,000 bây giờ chúng ta có một số nguyên dương có lẽ trong n. 221 00:11:42,000 --> 00:11:44,000 >> Bây giờ chúng ta hãy làm một cái gì đó với nó. 222 00:11:44,000 --> 00:11:50,000 Hãy để tôi đi trước và tính toán tổng kết, vì vậy int sum = sigma (n). 223 00:11:50,000 --> 00:11:54,000 Sigma chỉ là tổng kết, vì vậy tôi chỉ viết nó trong cách fancier. 224 00:11:54,000 --> 00:11:56,000 Chúng tôi sẽ chỉ gọi nó là sigma có. 225 00:11:56,000 --> 00:11:58,000 Đó là số tiền, và bây giờ tôi sẽ in ra kết quả, 226 00:11:58,000 --> 00:12:08,000 printf ("tổng hợp là% d \ n", tổng hợp). 227 00:12:08,000 --> 00:12:11,000 Và sau đó tôi sẽ trở về 0 cho các biện pháp tốt. 228 00:12:11,000 --> 00:12:15,000 Chúng tôi đã làm tất cả mọi thứ mà chương trình này đòi hỏi ngoại trừ phần thú vị, 229 00:12:15,000 --> 00:12:18,000 đó là thực sự thực hiện chức năng sigma. 230 00:12:18,000 --> 00:12:22,000 >> Hãy để tôi đi xuống đây vào phía dưới, và để cho tôi tuyên bố chức năng sigma. 231 00:12:22,000 --> 00:12:26,000 Nó có để có một biến kiểu số nguyên, 232 00:12:26,000 --> 00:12:30,000 và những gì loại dữ liệu nào tôi muốn trở lại có lẽ là từ sigma? 233 00:12:30,000 --> 00:12:34,000 Int, bởi vì tôi muốn nó để phù hợp với mong đợi của tôi trên dòng 15. 234 00:12:34,000 --> 00:12:37,000 Tại đây, hãy để tôi đi trước và thực hiện điều này 235 00:12:37,000 --> 00:12:41,000 một cách khá đơn giản. 236 00:12:41,000 --> 00:12:45,000 >> Chúng ta hãy đi trước và nói int sum = 0, 237 00:12:45,000 --> 00:12:47,000 và bây giờ tôi sẽ đi một chút cho vòng lặp ở đây 238 00:12:47,000 --> 00:12:50,000 đó là sẽ nói một cái gì đó như thế này, 239 00:12:50,000 --> 00:13:01,000 for (int i = 0; I <= số; i + +) tổng + = i. 240 00:13:01,000 --> 00:13:05,000 Và sau đó tôi sẽ trả lại số tiền. 241 00:13:05,000 --> 00:13:07,000 Tôi đã có thể thực hiện điều này trong bất kỳ số cách khác nhau. 242 00:13:07,000 --> 00:13:09,000 Tôi đã có thể sử dụng một vòng lặp while. 243 00:13:09,000 --> 00:13:11,000 Tôi có thể bỏ qua bằng cách sử dụng các biến số tiền nếu tôi thực sự muốn, 244 00:13:11,000 --> 00:13:15,000 nhưng trong ngắn hạn, chúng tôi chỉ có một chức năng mà nếu tôi không goof tuyên bố số tiền là 0. 245 00:13:15,000 --> 00:13:18,000 Sau đó, nó lặp từ 0 lên thông qua số lượng, 246 00:13:18,000 --> 00:13:23,000 và mỗi lần lặp, nó cho biết thêm rằng giá trị hiện tại tổng hợp và sau đó trả về tổng hợp. 247 00:13:23,000 --> 00:13:25,000 >> Bây giờ, có một tối ưu hóa nhẹ ở đây. 248 00:13:25,000 --> 00:13:29,000 Đây có lẽ là một bước lãng phí, nhưng để được nó. Đó là tốt cho bây giờ. 249 00:13:29,000 --> 00:13:32,000 Chúng tôi ít nhất là kỹ lưỡng và sẽ 0 tất cả các cách trên lên. 250 00:13:32,000 --> 00:13:34,000 Không phải rất khó khăn và khá đơn giản, 251 00:13:34,000 --> 00:13:37,000 nhưng nó quay ra rằng với chức năng sigma chúng tôi có cơ hội như nhau 252 00:13:37,000 --> 00:13:39,000 như chúng ta đã ở đây trên sân khấu. 253 00:13:39,000 --> 00:13:42,000 Trên sân khấu, chúng tôi chỉ đếm được có bao nhiêu người bên cạnh tôi, 254 00:13:42,000 --> 00:13:47,000 nhưng thay vào đó nếu chúng ta muốn đếm số 3 + 2 + 1 255 00:13:47,000 --> 00:13:51,000 trên xuống đến 0, chúng ta có thể tương tự như punt đến một chức năng 256 00:13:51,000 --> 00:13:55,000 mà tôi thay vào đó sẽ mô tả như là đệ quy. 257 00:13:55,000 --> 00:13:57,000 Ở đây, chúng ta hãy làm một sự tỉnh táo nhanh chóng kiểm tra và chắc chắn rằng tôi đã không goof. 258 00:13:57,000 --> 00:14:00,000 >> Tôi biết có ít nhất một điều trong chương trình này mà tôi đã làm sai. 259 00:14:00,000 --> 00:14:04,000 Khi tôi nhấn vào tôi để có được bất kỳ loại la tôi? 260 00:14:04,000 --> 00:14:06,000 Những gì tôi sẽ hét lên vào khoảng? 261 00:14:06,000 --> 00:14:11,000 Yeah, tôi quên các mẫu thử nghiệm, do đó, tôi đang sử dụng một chức năng được gọi là sigma on line 15, 262 00:14:11,000 --> 00:14:16,000 nhưng nó không được khai báo cho đến dòng 22, vì vậy tôi tốt nhất chủ động đi lên 263 00:14:16,000 --> 00:14:22,000 và tuyên bố một mẫu thử nghiệm, và tôi sẽ nói int sigma (int number), và đó là nó. 264 00:14:22,000 --> 00:14:24,000 Nó được thực hiện ở phía dưới. 265 00:14:24,000 --> 00:14:27,000 >> Hoặc một cách khác tôi có thể giải quyết vấn đề này, 266 00:14:27,000 --> 00:14:30,000 Tôi có thể di chuyển các chức năng trên đó, mà không phải là xấu, 267 00:14:30,000 --> 00:14:32,000 nhưng ít nhất là khi chương trình của bạn bắt đầu để có được lâu dài, thẳng thắn, 268 00:14:32,000 --> 00:14:35,000 Tôi nghĩ rằng có một số giá trị luôn luôn có chính ở đầu 269 00:14:35,000 --> 00:14:38,000 để bạn đọc có thể mở các tập tin và sau đó ngay lập tức nhìn thấy 270 00:14:38,000 --> 00:14:40,000 những gì chương trình được thực hiện mà không cần phải tìm kiếm thông qua nó 271 00:14:40,000 --> 00:14:42,000 tìm kiếm cho rằng chức năng chính. 272 00:14:42,000 --> 00:14:49,000 Hãy đi xuống vào cửa sổ thiết bị đầu cuối của tôi ở đây, hãy thử làm sigma làm cho sigma, 273 00:14:49,000 --> 00:14:51,000 và tôi hơi say lên ở đây quá. 274 00:14:51,000 --> 00:14:55,000 Implicit tuyên bố getInt chức năng có nghĩa là tôi đã quên làm những gì khác? 275 00:14:55,000 --> 00:14:57,000 [Không nghe được học sinh] 276 00:14:57,000 --> 00:15:00,000 Tốt, như vậy rõ ràng là một sai lầm phổ biến, vì vậy chúng ta hãy đặt này lên đây, 277 00:15:00,000 --> 00:15:04,000 cs50.h, và bây giờ hãy quay trở lại cửa sổ thiết bị đầu cuối của tôi. 278 00:15:04,000 --> 00:15:08,000 >> Tôi sẽ xóa màn hình, và tôi sẽ chạy lại làm cho sigma. 279 00:15:08,000 --> 00:15:11,000 Nó dường như đã biên soạn. Hãy để tôi bây giờ chạy sigma. 280 00:15:11,000 --> 00:15:15,000 Tôi sẽ nhập vào số 3, và tôi đã nhận được 6, do đó, không phải là một kiểm tra nghiêm ngặt, 281 00:15:15,000 --> 00:15:18,000 nhưng ít nhất có vẻ như được làm việc ở cái nhìn đầu tiên, nhưng bây giờ hãy rip nó ngoài, 282 00:15:18,000 --> 00:15:21,000 và chúng ta hãy thực sự tận dụng ý tưởng của đệ quy, một lần nữa, 283 00:15:21,000 --> 00:15:24,000 trong một bối cảnh rất đơn giản vì vậy mà trong một thời gian vài tuần 284 00:15:24,000 --> 00:15:27,000 khi chúng tôi bắt đầu khám phá fancier cấu trúc dữ liệu cho các mảng 285 00:15:27,000 --> 00:15:30,000 chúng ta có một công cụ trong bộ công cụ nào đó để 286 00:15:30,000 --> 00:15:33,000 thao tác các cấu trúc dữ liệu như chúng ta sẽ thấy. 287 00:15:33,000 --> 00:15:36,000 Đây là phương pháp lặp đi lặp lại, cách tiếp cận dựa trên vòng lặp. 288 00:15:36,000 --> 00:15:39,000 >> Hãy để tôi thay vì bây giờ làm điều này. 289 00:15:39,000 --> 00:15:44,000 Hãy để tôi thay vì nói rằng tổng của số lượng 290 00:15:44,000 --> 00:15:48,000 xuống 0 thực sự là điều tương tự như 291 00:15:48,000 --> 00:15:53,000 số + sigma (số 1). 292 00:15:53,000 --> 00:15:57,000 Nói cách khác, giống như trên sân khấu tôi punted mỗi người bên cạnh tôi, 293 00:15:57,000 --> 00:16:00,000 và họ lần lượt giữ punting cho đến khi chúng tôi cuối cùng đã chạm đáy tại Willy, 294 00:16:00,000 --> 00:16:03,000 người đã phải trả lại một câu trả lời cứng mã hóa như 0. 295 00:16:03,000 --> 00:16:07,000 Ở đây bây giờ chúng ta đang tương tự như punting sigma 296 00:16:07,000 --> 00:16:10,000 chức năng giống như ban đầu được gọi là, nhưng cái nhìn sâu sắc quan trọng ở đây 297 00:16:10,000 --> 00:16:12,000 rằng chúng tôi không gọi sigma giống nhau. 298 00:16:12,000 --> 00:16:14,000 Chúng tôi không đi qua trong n. 299 00:16:14,000 --> 00:16:17,000 Rõ ràng chúng ta đang đi qua trong số 1, 300 00:16:17,000 --> 00:16:20,000 do đó, một vấn đề hơi nhỏ hơn, nhỏ hơn một chút vấn đề. 301 00:16:20,000 --> 00:16:23,000 >> Thật không may, điều này không phải là một giải pháp được nêu ra, và trước khi chúng tôi sửa chữa 302 00:16:23,000 --> 00:16:26,000 những gì có thể nhảy ra khỏi rõ ràng tại một số các bạn 303 00:16:26,000 --> 00:16:28,000 hãy để tôi đi trước và chạy lại làm. 304 00:16:28,000 --> 00:16:30,000 Nó dường như biên dịch được không. 305 00:16:30,000 --> 00:16:32,000 Hãy để tôi chạy lại sigma với 6. 306 00:16:32,000 --> 00:16:37,000 Whoops, tôi chạy lại sigma với 6. 307 00:16:37,000 --> 00:16:42,000 Chúng tôi đã nhìn thấy điều này trước khi, mặc dù thời gian vô tình cuối cùng là tốt. 308 00:16:42,000 --> 00:16:48,000 Tại sao tôi nhận được lỗi phân khúc này khó hiểu? Yeah. 309 00:16:48,000 --> 00:16:50,000 [Không nghe được học sinh] 310 00:16:50,000 --> 00:16:53,000 Không có trường hợp cơ sở, và đặc biệt hơn, những gì có thể xảy ra? 311 00:16:53,000 --> 00:16:58,000 Đây là một triệu chứng của những hành vi nào? 312 00:16:58,000 --> 00:17:00,000 Nói nó to hơn một chút. 313 00:17:00,000 --> 00:17:02,000 [Không nghe được học sinh] 314 00:17:02,000 --> 00:17:05,000 Đây là một vòng lặp vô hạn có hiệu quả, và vấn đề với các vòng lặp vô hạn 315 00:17:05,000 --> 00:17:08,000 khi chúng liên quan đến đệ quy trong trường hợp này, một chức năng gọi điện thoại, 316 00:17:08,000 --> 00:17:10,000 điều gì sẽ xảy ra mỗi khi bạn gọi một chức năng? 317 00:17:10,000 --> 00:17:13,000 Vâng, nghĩ lại làm thế nào chúng ta đặt ra bộ nhớ trong một máy tính. 318 00:17:13,000 --> 00:17:16,000 Chúng tôi nói rằng có đoạn bộ nhớ này được gọi là ngăn xếp ở phía dưới cùng, 319 00:17:16,000 --> 00:17:19,000 và mỗi khi bạn gọi một chức năng nhiều hơn một chút bộ nhớ được đặt 320 00:17:19,000 --> 00:17:24,000 trên stack này được gọi là có chứa các biến địa phương hoặc các thông số của chức năng đó, 321 00:17:24,000 --> 00:17:27,000 vì vậy nếu sigma gọi sigma cuộc gọi sigma gọi sigma 322 00:17:27,000 --> 00:17:29,000  gọi sigma kết thúc câu chuyện này? 323 00:17:29,000 --> 00:17:31,000 >> Vâng, nó cuối cùng đã vượt tổng số tiền 324 00:17:31,000 --> 00:17:33,000 bộ nhớ mà bạn có sẵn cho máy tính của bạn. 325 00:17:33,000 --> 00:17:37,000 Bạn tràn ngập các phân khúc mà bạn đang nghĩ ở bên trong, 326 00:17:37,000 --> 00:17:40,000 và bạn nhận được lỗi phân khúc này, lõi bán phá giá, 327 00:17:40,000 --> 00:17:43,000 và những gì core dumped có nghĩa là bây giờ tôi có một tập tin lõi 328 00:17:43,000 --> 00:17:46,000 mà là một tập tin có chứa số không và những người thân 329 00:17:46,000 --> 00:17:49,000 mà thực sự trong tương lai sẽ được chẩn đoán hữu ích. 330 00:17:49,000 --> 00:17:52,000 Nếu nó không rõ ràng cho bạn nơi lỗi của bạn là 331 00:17:52,000 --> 00:17:54,000 bạn thực sự có thể làm một chút phân tích pháp y, do đó, để nói chuyện, 332 00:17:54,000 --> 00:17:58,000 trên tập tin dump cốt lõi này, một lần nữa, chỉ là một bó toàn bộ số không và những người thân 333 00:17:58,000 --> 00:18:02,000 mà về cơ bản đại diện cho trạng thái của chương trình của bạn trong bộ nhớ 334 00:18:02,000 --> 00:18:05,000 thời điểm này, nó đã bị rơi theo cách này. 335 00:18:05,000 --> 00:18:11,000 >> Việc sửa chữa ở đây là chúng tôi có thể không chỉ một cách mù quáng trở lại sigma, 336 00:18:11,000 --> 00:18:14,000 số + sigma của một vấn đề nhỏ hơn một chút. 337 00:18:14,000 --> 00:18:16,000 Chúng tôi cần phải có một số loại trường hợp cơ sở ở đây, 338 00:18:16,000 --> 00:18:19,000 và trường hợp cơ sở những gì có thể được? 339 00:18:19,000 --> 00:18:22,000 [Không nghe được học sinh] 340 00:18:22,000 --> 00:18:25,000 Được rồi, miễn là số là dương chúng tôi thực sự nên trở về này, 341 00:18:25,000 --> 00:18:29,000 hay nói một cách khác, nếu số là, nói, <= 0 342 00:18:29,000 --> 00:18:32,000 bạn biết gì, tôi sẽ đi trước và trở về 0, 343 00:18:32,000 --> 00:18:36,000 giống như Willy đã làm, và khác, tôi sẽ đi trước 344 00:18:36,000 --> 00:18:41,000 và trở về điều này, vì vậy nó không phải là ngắn hơn nhiều 345 00:18:41,000 --> 00:18:44,000 so với phiên bản lặp đi lặp lại mà chúng tôi whipped lên đầu tiên sử dụng một vòng lặp for, 346 00:18:44,000 --> 00:18:48,000 nhưng nhận thấy rằng có loại này sang trọng với nó. 347 00:18:48,000 --> 00:18:51,000 Thay vì trả lại một số số lượng và thực hiện tất cả những điều này toán học 348 00:18:51,000 --> 00:18:54,000 và thêm với các biến địa phương 349 00:18:54,000 --> 00:18:57,000 Thay vào đó, bạn đang nói "Được rồi, nếu điều này là một vấn đề dễ dàng siêu, 350 00:18:57,000 --> 00:19:01,000 như số là <0, cho tôi ngay lập tức trở về 0. " 351 00:19:01,000 --> 00:19:03,000 >> Chúng tôi sẽ không bận tâm hỗ trợ số âm, 352 00:19:03,000 --> 00:19:05,000 vì vậy tôi sẽ cứng mã giá trị 0. 353 00:19:05,000 --> 00:19:08,000 Nhưng nếu không, để thực hiện ý tưởng tổng hợp 354 00:19:08,000 --> 00:19:11,000 tất cả những con số này lại với nhau bạn có hiệu quả có thể ăn một miếng nhỏ 355 00:19:11,000 --> 00:19:14,000 trong số các vấn đề, giống như chúng tôi đã làm ở đây trên sân khấu, 356 00:19:14,000 --> 00:19:18,000 sau đó punt phần còn lại của vấn đề cho người kế tiếp, 357 00:19:18,000 --> 00:19:20,000 nhưng trong trường hợp này người tiếp theo là chính mình. 358 00:19:20,000 --> 00:19:22,000 Đây là một chức năng giống nhau được đặt tên. 359 00:19:22,000 --> 00:19:25,000 Chỉ cần vượt qua một vấn đề nhỏ hơn và nhỏ hơn và nhỏ hơn mỗi lần, 360 00:19:25,000 --> 00:19:28,000 và mặc dù chúng ta không có những điều khá chính thức hóa trong mã ở đây 361 00:19:28,000 --> 00:19:33,000 điều này là chính xác những gì đang diễn ra trong tuần 0 với các cuốn sách điện thoại. 362 00:19:33,000 --> 00:19:36,000 Điều này là chính xác những gì đang diễn ra trong tuần qua với Sean 363 00:19:36,000 --> 00:19:39,000 và với các cuộc biểu tình của chúng tôi tìm kiếm các số. 364 00:19:39,000 --> 00:19:42,000 Đó là một vấn đề và chia nó một lần nữa và một lần nữa. 365 00:19:42,000 --> 00:19:44,000 >> Nói cách khác, có một cách dịch thuật 366 00:19:44,000 --> 00:19:47,000 này xây dựng thế giới thực, xây dựng này mức độ cao hơn 367 00:19:47,000 --> 00:19:51,000 phân chia và chinh phục và làm một cái gì đó một lần nữa và một lần nữa 368 00:19:51,000 --> 00:19:56,000 trong mã, vì vậy đây là một cái gì đó chúng ta sẽ thấy một lần nữa theo thời gian. 369 00:19:56,000 --> 00:20:00,000 Bây giờ, khi một sang một bên, nếu bạn mới để đệ quy, bạn nên ít nhất là hiểu bây giờ 370 00:20:00,000 --> 00:20:02,000 lý do tại sao điều này là buồn cười. 371 00:20:02,000 --> 00:20:05,000 Tôi sẽ đi đến google.com, 372 00:20:05,000 --> 00:20:17,000 và tôi sẽ tìm kiếm một số mẹo và thủ thuật về đệ quy, nhập. 373 00:20:17,000 --> 00:20:21,000 Hãy nói với người bên cạnh bạn nếu chúng không được cười ngay bây giờ. 374 00:20:21,000 --> 00:20:23,000 Ý của bạn là đệ quy? 375 00:20:23,000 --> 00:20:25,000 Ý của bạn là-ah, có chúng tôi đi. 376 00:20:25,000 --> 00:20:28,000 Được rồi, bây giờ đó là phần còn lại của tất cả mọi người. 377 00:20:28,000 --> 00:20:30,000 Một quả trứng Phục Sinh ít nhúng một nơi nào đó trong Google. 378 00:20:30,000 --> 00:20:33,000 Là một sang một bên, một trong các liên kết mà chúng tôi đặt trên trang web của khóa học 379 00:20:33,000 --> 00:20:36,000 cho ngày hôm nay chỉ là lưới này của các thuật toán phân loại khác nhau, 380 00:20:36,000 --> 00:20:39,000 một số trong đó chúng ta nhìn vào tuần trước, nhưng những gì tốt đẹp về quán tưởng này 381 00:20:39,000 --> 00:20:43,000 như bạn cố gắng để bọc tâm trí của bạn xung quanh những điều khác nhau liên quan đến các thuật toán 382 00:20:43,000 --> 00:20:46,000 biết rằng bạn có thể rất dễ dàng bây giờ bắt đầu với các loại khác nhau của các yếu tố đầu vào. 383 00:20:46,000 --> 00:20:50,000 Tất cả các yếu tố đầu vào đảo ngược, các yếu tố đầu vào chủ yếu là sắp xếp, các yếu tố đầu vào ngẫu nhiên và vv. 384 00:20:50,000 --> 00:20:53,000 Như bạn cố gắng, một lần nữa, phân biệt những điều này trong tâm trí của bạn 385 00:20:53,000 --> 00:20:57,000 nhận ra rằng URL này trên trang web của khóa học trên trang bài giảng 386 00:20:57,000 --> 00:21:00,000 có thể giúp bạn lý do thông qua một số những người. 387 00:21:00,000 --> 00:21:05,000 >> Hôm nay chúng ta cuối cùng cũng có được để giải quyết vấn đề này từ khi trở lại, 388 00:21:05,000 --> 00:21:08,000 đó là chức năng này trao đổi đã không làm việc, 389 00:21:08,000 --> 00:21:12,000 và vấn đề cơ bản này trao đổi chức năng là gì, 390 00:21:12,000 --> 00:21:15,000 mục tiêu trong số đó là, một lần nữa, để trao đổi một giá trị ở đây và ở đây 391 00:21:15,000 --> 00:21:17,000 như vậy mà điều này xảy ra? 392 00:21:17,000 --> 00:21:20,000 Điều này đã không thực sự làm việc. Tại sao? 393 00:21:20,000 --> 00:21:22,000 Yeah. 394 00:21:22,000 --> 00:21:28,000 [Không nghe được học sinh] 395 00:21:28,000 --> 00:21:31,000 Chính xác, lời giải thích cho bugginess này 396 00:21:31,000 --> 00:21:34,000 chỉ đơn giản là bởi vì khi bạn gọi chức năng trong C 397 00:21:34,000 --> 00:21:38,000 và những chức năng đối số, như a và b ở đây, 398 00:21:38,000 --> 00:21:42,000 bạn đang đi qua các bản sao của bất cứ điều gì giá trị mà bạn đang cung cấp cho chức năng đó. 399 00:21:42,000 --> 00:21:46,000 Bạn không cung cấp các giá trị ban đầu, 400 00:21:46,000 --> 00:21:49,000 vì vậy chúng ta đã thấy điều này trong bối cảnh của buggyc 401 00:21:49,000 --> 00:21:52,000 buggy3.c, nhìn một chút gì đó như thế này. 402 00:21:52,000 --> 00:21:57,000 >> Nhớ lại rằng chúng tôi đã có x và y khởi tạo 1 và 2, tương ứng. 403 00:21:57,000 --> 00:21:59,000 Chúng tôi sau đó in ra những gì họ được. 404 00:21:59,000 --> 00:22:03,000 Sau đó tôi tuyên bố rằng tôi đã trao đổi chúng bằng cách gọi điện thoại trao đổi của x, y. 405 00:22:03,000 --> 00:22:06,000 Nhưng vấn đề là các trao đổi làm việc, 406 00:22:06,000 --> 00:22:10,000 nhưng chỉ trong phạm vi trao đổi chức năng của chính nó. 407 00:22:10,000 --> 00:22:13,000 Ngay khi chúng tôi nhấn đường 40 những giá trị trao đổi 408 00:22:13,000 --> 00:22:16,000 đã được vứt bỏ, và như vậy không có gì 409 00:22:16,000 --> 00:22:21,000 trong chính chức năng ban đầu đã thực sự thay đổi ở tất cả, 410 00:22:21,000 --> 00:22:26,000 vì vậy nếu bạn nghĩ rằng sau đó là những gì này trông giống như trong bộ nhớ của chúng tôi 411 00:22:26,000 --> 00:22:29,000 nếu điều này phía bên tay trái của hội đồng quản trị đại diện cho- 412 00:22:29,000 --> 00:22:33,000 và tôi sẽ làm tốt nhất của tôi cho mọi người xem này nếu điều này phía bên tay trái của hội đồng quản trị 413 00:22:33,000 --> 00:22:37,000 đại diện, nói, bộ nhớ RAM của bạn, và ngăn xếp là sẽ phát triển lên theo cách này, 414 00:22:37,000 --> 00:22:43,000 và chúng tôi gọi một chức năng như chính, và chính có 2 biến địa phương, x và y, 415 00:22:43,000 --> 00:22:48,000 hãy mô tả những người như x ở đây, và chúng ta hãy mô tả những như y, 416 00:22:48,000 --> 00:22:55,000 và chúng ta hãy đặt trong các giá trị 1 và 2, do đó, ở đây là chính, 417 00:22:55,000 --> 00:22:58,000 và khi chính các cuộc gọi chức năng hoán đổi hệ điều hành 418 00:22:58,000 --> 00:23:02,000 cung cấp cho các chức năng hoán đổi swath riêng của mình bộ nhớ trên stack, 419 00:23:02,000 --> 00:23:04,000 khung hình riêng của mình trên stack, do đó, để nói chuyện. 420 00:23:04,000 --> 00:23:08,000 Nó cũng phân bổ 32 bit cho các ints. 421 00:23:08,000 --> 00:23:11,000 Nó xảy ra để gọi a, b, nhưng đó là hoàn toàn tùy ý. 422 00:23:11,000 --> 00:23:13,000 Nó có thể gọi họ bất cứ điều gì nó muốn, nhưng điều gì sẽ xảy ra khi chính 423 00:23:13,000 --> 00:23:19,000 cuộc gọi trao đổi là phải mất 1, đặt một bản sao ở đó, đặt một bản sao ở đó. 424 00:23:19,000 --> 00:23:23,000 >> Hiện có 1 biến địa phương khác trong trao đổi, mặc dù, được gọi là >> Tmp những gì. 425 00:23:23,000 --> 00:23:27,000 Tmp, vì vậy hãy để tôi cung cấp cho bản thân mình khác 32 bit ở đây, 426 00:23:27,000 --> 00:23:29,000 và tôi đã làm gì trong chức năng này? 427 00:23:29,000 --> 00:23:34,000 Tôi nói int tmp được, do đó, có 1, vì vậy tôi đã làm điều này khi chúng tôi đã chơi gần với ví dụ này. 428 00:23:34,000 --> 00:23:39,000 Sau đó, một được b, do đó, b là 2, vì vậy bây giờ trở thành 2, 429 00:23:39,000 --> 00:23:42,000 và bây giờ b được temp, vì vậy temp là 1, 430 00:23:42,000 --> 00:23:44,000 vì vậy bây giờ b trở thành này. 431 00:23:44,000 --> 00:23:46,000 Đó là tuyệt vời. Nó làm việc. 432 00:23:46,000 --> 00:23:49,000 Nhưng sau đó, ngay sau khi trở về chức năng 433 00:23:49,000 --> 00:23:52,000 trao đổi của bộ nhớ một cách hiệu quả biến mất để nó có thể được tái sử dụng 434 00:23:52,000 --> 00:23:58,000 một số chức năng khác trong tương lai, và chính rõ ràng là hoàn toàn không thay đổi. 435 00:23:58,000 --> 00:24:00,000 Chúng tôi cần một cách cơ bản giải quyết vấn đề này, 436 00:24:00,000 --> 00:24:03,000 và hôm nay chúng tôi cuối cùng sẽ có một cách để làm điều này, theo đó 437 00:24:03,000 --> 00:24:06,000 chúng tôi có thể giới thiệu một cái gì đó được gọi là một con trỏ. 438 00:24:06,000 --> 00:24:09,000 Nó chỉ ra rằng chúng ta có thể giải quyết vấn đề này 439 00:24:09,000 --> 00:24:12,000 không phải bằng cách đi qua trong bản sao của x và y 440 00:24:12,000 --> 00:24:18,000 nhưng thay vì đi qua trong những gì bạn nghĩ, chức năng trao đổi? 441 00:24:18,000 --> 00:24:20,000 Yeah, những gì về địa chỉ? 442 00:24:20,000 --> 00:24:22,000 Chúng tôi đã không thực sự nói về các địa chỉ chi tiết hơn, 443 00:24:22,000 --> 00:24:25,000 nhưng nếu bảng đen đại diện cho bộ nhớ máy tính của tôi 444 00:24:25,000 --> 00:24:28,000 chúng tôi chắc chắn có thể bắt đầu đánh số các byte trong bộ nhớ RAM của tôi 445 00:24:28,000 --> 00:24:31,000 và nói rằng đây là # 1 byte, byte # 2, # 3 byte, 446 00:24:31,000 --> 00:24:35,000 byte # 4, byte # ... 2 tỷ đồng nếu tôi có 2 GB RAM, 447 00:24:35,000 --> 00:24:38,000 vì vậy chúng tôi chắc chắn có thể đưa ra một số đề án đánh số tùy ý 448 00:24:38,000 --> 00:24:41,000 cho tất cả các byte cá nhân trong bộ nhớ máy tính của tôi. 449 00:24:41,000 --> 00:24:43,000 >> Điều gì sẽ xảy ra nếu thay vì khi tôi gọi hoán đổi 450 00:24:43,000 --> 00:24:47,000 chứ không phải vượt qua trong bản sao của x và y 451 00:24:47,000 --> 00:24:51,000 tại sao tôi không thay vì vượt qua trong địa chỉ của x ở đây, 452 00:24:51,000 --> 00:24:55,000 địa chỉ của y ở đây, chủ yếu là địa chỉ bưu điện 453 00:24:55,000 --> 00:24:59,000 của x và y bởi vì sau đó trao đổi, nếu anh ta thông báo 454 00:24:59,000 --> 00:25:01,000 của địa chỉ trong bộ nhớ của x và y, 455 00:25:01,000 --> 00:25:04,000 sau đó trao đổi, nếu chúng ta đào tạo anh ta một chút, 456 00:25:04,000 --> 00:25:07,000 ông có thể có khả năng lái xe đến địa chỉ đó, có thể nói, 457 00:25:07,000 --> 00:25:11,000 x, và thay đổi số ở đó, sau đó lái xe đến địa chỉ của y, 458 00:25:11,000 --> 00:25:16,000 thay đổi số ở đó, ngay cả khi không thực sự nhận được bản sao của những giá trị bản thân mình, 459 00:25:16,000 --> 00:25:19,000 do đó, mặc dù chúng tôi đã nói về điều này như là chính của bộ nhớ 460 00:25:19,000 --> 00:25:23,000 và trao đổi như là bộ nhớ mạnh mẽ và nguy hiểm của C 461 00:25:23,000 --> 00:25:28,000 là bất kỳ chức năng có thể chạm vào bộ nhớ bất cứ nơi nào trong máy tính, 462 00:25:28,000 --> 00:25:32,000 và điều này là mạnh mẽ mà bạn có thể làm những điều rất lạ mắt với các chương trình máy tính trong C. 463 00:25:32,000 --> 00:25:36,000 Điều này rất nguy hiểm bởi vì bạn cũng có thể vít lên rất dễ dàng. 464 00:25:36,000 --> 00:25:39,000 Trong thực tế, một trong những cách phổ biến nhất cho các chương trình trong những ngày này được khai thác 465 00:25:39,000 --> 00:25:42,000 vẫn còn là một lập trình viên không nhận ra 466 00:25:42,000 --> 00:25:45,000 rằng người đó cho phép dữ liệu 467 00:25:45,000 --> 00:25:49,000 được viết ở một vị trí trong bộ nhớ mà không được dự định. 468 00:25:49,000 --> 00:25:51,000 >> Ví dụ, anh ta hoặc cô ta khai báo một mảng có kích thước là 10 469 00:25:51,000 --> 00:25:56,000 nhưng sau đó vô tình cố gắng để đưa 11 byte vào mảng đó của bộ nhớ, 470 00:25:56,000 --> 00:25:59,000 và bạn bắt đầu chạm vào các bộ phận của bộ nhớ không còn giá trị. 471 00:25:59,000 --> 00:26:02,000 Chỉ cần theo ngữ cảnh này, một số bạn có thể biết rằng 472 00:26:02,000 --> 00:26:06,000 phần mềm thường yêu cầu bạn nhập số hoặc các phím đăng ký, 473 00:26:06,000 --> 00:26:08,000 Photoshop và Word và các chương trình như thế này. 474 00:26:08,000 --> 00:26:12,000 Có tồn tại các vết nứt, như một số bạn biết, trực tuyến, nơi bạn có thể chạy một chương trình nhỏ, 475 00:26:12,000 --> 00:26:14,000 và thì đấy, không có yêu cầu nhiều hơn cho một số serial. 476 00:26:14,000 --> 00:26:16,000 Làm thế nào là làm việc? 477 00:26:16,000 --> 00:26:21,000 Trong nhiều trường hợp những điều này chỉ đơn giản là việc tìm kiếm trong các máy tính 478 00:26:21,000 --> 00:26:24,000 các phân đoạn trong văn bản số không thực tế và những người thân của máy tính 479 00:26:24,000 --> 00:26:28,000 là chức năng nơi mà số serial được yêu cầu, 480 00:26:28,000 --> 00:26:31,000 và bạn ghi đè lên không gian đó, hoặc trong khi chương trình đang chạy 481 00:26:31,000 --> 00:26:33,000 bạn có thể tìm ra mà chính là thực sự được lưu trữ 482 00:26:33,000 --> 00:26:37,000 sử dụng cái gì được gọi là một trình gỡ lỗi, và bạn có thể crack phần mềm như vậy. 483 00:26:37,000 --> 00:26:40,000 Điều này không phải là để nói rằng đây là mục tiêu của chúng tôi trong vài ngày tới, 484 00:26:40,000 --> 00:26:42,000 nhưng nó có rất thực tế hậu quả. 485 00:26:42,000 --> 00:26:45,000 Một trong đó xảy ra liên quan đến hành vi trộm cắp của phần mềm, 486 00:26:45,000 --> 00:26:47,000 nhưng cũng có sự thỏa hiệp của toàn bộ máy. 487 00:26:47,000 --> 00:26:50,000 >> Trong thực tế, khi các trang web những ngày này đang khai thác 488 00:26:50,000 --> 00:26:53,000 và bị xâm nhập và dữ liệu bị rò rỉ và mật khẩu bị đánh cắp 489 00:26:53,000 --> 00:26:58,000 điều này rất thường xuyên liên quan đến quản lý yếu kém của bộ nhớ của một người, 490 00:26:58,000 --> 00:27:01,000 hoặc, trong trường hợp của cơ sở dữ liệu, không để dự đoán 491 00:27:01,000 --> 00:27:03,000 đối lập đầu vào, do đó, thêm vào đó trong những tuần tới, 492 00:27:03,000 --> 00:27:07,000 nhưng bây giờ chỉ cần một sneak xem trước của các loại thiệt hại mà bạn có thể làm 493 00:27:07,000 --> 00:27:11,000 bằng cách không hoàn toàn hiểu những thứ như thế nào làm việc bên dưới mui xe. 494 00:27:11,000 --> 00:27:14,000 Hãy đi về sự hiểu biết lý do tại sao điều này bị phá vỡ 495 00:27:14,000 --> 00:27:17,000 với một công cụ mà sẽ trở thành nhiều hơn và hữu ích hơn 496 00:27:17,000 --> 00:27:19,000 như các chương trình của chúng tôi có được phức tạp hơn. 497 00:27:19,000 --> 00:27:21,000 Như vậy đến nay, khi bạn đã có một lỗi trong chương trình của bạn 498 00:27:21,000 --> 00:27:23,000 Anh đã đi như thế nào về gỡ lỗi nó? 499 00:27:23,000 --> 00:27:25,000 Kỹ thuật của bạn đang làm gì vậy, đến nay, cho dù được giảng dạy bởi TF của bạn 500 00:27:25,000 --> 00:27:27,000 hay chỉ là tự học? 501 00:27:27,000 --> 00:27:29,000 [Sinh viên] printf. 502 00:27:29,000 --> 00:27:31,000 Printf, do đó, printf có thể là bạn của bạn ở chỗ nếu bạn muốn xem 503 00:27:31,000 --> 00:27:33,000 những gì đang xảy ra bên trong của chương trình của bạn 504 00:27:33,000 --> 00:27:36,000 bạn chỉ cần đặt printf đây, printf, printf. 505 00:27:36,000 --> 00:27:38,000 Sau đó, bạn chạy nó, và bạn nhận được một bó toàn bộ công cụ trên màn hình 506 00:27:38,000 --> 00:27:43,000 mà bạn có thể sử dụng để sau đó suy luận những gì đang thực sự xảy ra sai trong chương trình của bạn. 507 00:27:43,000 --> 00:27:45,000 >> Printf có xu hướng là một điều rất mạnh mẽ, 508 00:27:45,000 --> 00:27:47,000 nhưng đó là một quá trình rất hướng dẫn sử dụng. 509 00:27:47,000 --> 00:27:49,000 Bạn có phải đặt một printf ở đây, một printf đây, 510 00:27:49,000 --> 00:27:51,000 và nếu bạn đặt nó bên trong một vòng lặp, bạn có thể nhận được 100 dòng 511 00:27:51,000 --> 00:27:53,000 sản lượng mà sau đó bạn phải sift thông qua. 512 00:27:53,000 --> 00:27:58,000 Đó không phải là một cơ chế rất thân thiện với người sử dụng tương tác cho các chương trình gỡ lỗi, 513 00:27:58,000 --> 00:28:00,000 nhưng may mắn tồn tại lựa chọn thay thế. 514 00:28:00,000 --> 00:28:03,000 Có một chương trình, ví dụ, được gọi là GDB, GNU Debugger, 515 00:28:03,000 --> 00:28:06,000 mà là một phức tạp chút trong cách bạn sử dụng nó. 516 00:28:06,000 --> 00:28:08,000 Đó là một chút phức tạp, nhưng thẳng thắn, 517 00:28:08,000 --> 00:28:11,000 đây là một trong những điều mà nếu bạn đặt trong tuần này và tiếp theo 518 00:28:11,000 --> 00:28:14,000 thêm giờ để hiểu một cái gì đó giống như GDB 519 00:28:14,000 --> 00:28:18,000 nó sẽ giúp bạn tiết kiệm có thể hàng chục giờ trong thời gian dài, 520 00:28:18,000 --> 00:28:21,000 do đó, với điều đó, hãy để tôi cung cấp cho bạn một lời trêu ghẹo của điều này làm việc như thế nào. 521 00:28:21,000 --> 00:28:23,000 >> Tôi trong cửa sổ thiết bị đầu cuối của tôi. 522 00:28:23,000 --> 00:28:26,000 Hãy để tôi đi trước và biên dịch chương trình này, buggy3. 523 00:28:26,000 --> 00:28:28,000 Nó đã được cập nhật. 524 00:28:28,000 --> 00:28:31,000 Hãy để tôi chạy nó giống như chúng ta đã làm một trở lại trong khi, và thực sự, nó bị hỏng. 525 00:28:31,000 --> 00:28:34,000 Nhưng tại sao điều này? Có lẽ tôi hơi say lên chức năng trao đổi. 526 00:28:34,000 --> 00:28:37,000 Có lẽ đó là a và b. Tôi không hoàn toàn di chuyển chúng xung quanh một cách chính xác. 527 00:28:37,000 --> 00:28:39,000 Hãy để tôi đi trước và làm điều này. 528 00:28:39,000 --> 00:28:43,000 Thay vì chỉ cần chạy buggy3 cho tôi thay vì chạy GDB chương trình, 529 00:28:43,000 --> 00:28:48,000 và tôi sẽ nói cho nó để chạy buggy3, 530 00:28:48,000 --> 00:28:52,000 và tôi sẽ bao gồm một số dòng lệnh-tui, 531 00:28:52,000 --> 00:28:55,000 và chúng tôi sẽ đặt điều này trong các vấn đề trong tương lai tại spec để nhắc nhở. 532 00:28:55,000 --> 00:28:57,000 Và giờ đây, giao diện màu đen và trắng xuất hiện đó, một lần nữa, 533 00:28:57,000 --> 00:28:59,000 là một chút áp đảo lúc đầu vì có tất cả những điều này 534 00:28:59,000 --> 00:29:02,000 thông tin bảo hành ở đây, nhưng ít nhất có một cái gì đó quen thuộc. 535 00:29:02,000 --> 00:29:04,000 Ở phía trên cùng của cửa sổ là mã thực tế của tôi, 536 00:29:04,000 --> 00:29:08,000 và nếu tôi di chuyển lên đây cho tôi di chuyển đến phần trên của tập tin của tôi, 537 00:29:08,000 --> 00:29:11,000 và quả thật, có buggy3.c, và thông báo ở phía dưới cùng của cửa sổ này 538 00:29:11,000 --> 00:29:13,000 Tôi có nhắc nhở này GDB. 539 00:29:13,000 --> 00:29:16,000 >> Điều này không giống như bình thường John Harvard dấu nhắc của tôi. 540 00:29:16,000 --> 00:29:19,000 Đây là một nhắc nhở sẽ cho phép tôi để kiểm soát GDB. 541 00:29:19,000 --> 00:29:21,000 GDB là một trình gỡ lỗi. 542 00:29:21,000 --> 00:29:24,000 Trình gỡ lỗi là một chương trình cho phép bạn đi bộ qua 543 00:29:24,000 --> 00:29:27,000 thực hiện các chương trình của bạn dòng từng dòng, 544 00:29:27,000 --> 00:29:30,000 trên đường đi làm bất cứ điều gì bạn muốn chương trình, 545 00:29:30,000 --> 00:29:33,000 thậm chí còn gọi chức năng, hoặc tìm kiếm, quan trọng hơn, 546 00:29:33,000 --> 00:29:35,000 tại các giá trị khác nhau của biến. 547 00:29:35,000 --> 00:29:37,000 Hãy cho đi trước và làm điều này. 548 00:29:37,000 --> 00:29:40,000 Tôi sẽ đi trước và gõ vào chạy tại dấu nhắc GDB của, 549 00:29:40,000 --> 00:29:43,000 do đó, lưu ý ở phía dưới bên trái của màn hình tôi đã đánh máy chạy, 550 00:29:43,000 --> 00:29:45,000 và tôi đã nhấn Enter, và điều đó đã làm gì? 551 00:29:45,000 --> 00:29:50,000 Nó nghĩa là chạy chương trình của tôi, nhưng tôi đã không thực sự nhìn thấy nhiều ở đây 552 00:29:50,000 --> 00:29:55,000 bởi vì tôi đã không thực sự nói với các trình gỡ lỗi 553 00:29:55,000 --> 00:29:57,000 tạm dừng tại một thời điểm cụ thể trong thời gian. 554 00:29:57,000 --> 00:29:59,000 Chỉ cần đánh chạy chạy chương trình. 555 00:29:59,000 --> 00:30:01,000 Tôi không thực sự nhìn thấy bất cứ điều gì. Tôi không thể thao tác nó. 556 00:30:01,000 --> 00:30:03,000 >> Thay vào đó, hãy để tôi làm việc này. 557 00:30:03,000 --> 00:30:08,000 Tại dấu nhắc GDB cho tôi thay vì gõ break, nhập. 558 00:30:08,000 --> 00:30:10,000 Đó không phải là những gì tôi có nghĩa là để loại. 559 00:30:10,000 --> 00:30:13,000 Hãy thay vì gõ nghỉ chính. 560 00:30:13,000 --> 00:30:15,000 Nói cách khác, tôi muốn thiết lập một cái gì đó được gọi là một breakpoint, 561 00:30:15,000 --> 00:30:18,000 được đặt tên bởi vì nó sẽ phá vỡ hoặc tạm dừng 562 00:30:18,000 --> 00:30:21,000 thực hiện các chương trình của bạn tại nơi cụ thể. 563 00:30:21,000 --> 00:30:23,000 Chính là tên của chức năng của tôi. 564 00:30:23,000 --> 00:30:25,000 Chú ý rằng GDB là khá thông minh. 565 00:30:25,000 --> 00:30:28,000 Nó đã tìm ra rằng chính xảy ra để bắt đầu khoảng dòng 18 566 00:30:28,000 --> 00:30:32,000 của buggy3.c, và sau đó nhận thấy đây ở trên cùng bên trái 567 00:30:32,000 --> 00:30:34,000 b + là ngay bên cạnh dòng 18. 568 00:30:34,000 --> 00:30:38,000 Điều đó nhắc nhở tôi rằng tôi đã thiết lập một breakpoint tại dòng 18. 569 00:30:38,000 --> 00:30:42,000 Lần này khi tôi gõ chạy, tôi sẽ chạy chương trình của tôi 570 00:30:42,000 --> 00:30:45,000 lên cho đến khi nó chạm breakpoint đó, 571 00:30:45,000 --> 00:30:48,000 do đó, chương trình sẽ tạm dừng cho tôi ở dòng 18. 572 00:30:48,000 --> 00:30:50,000 Ở đây chúng tôi đi, chạy. 573 00:30:50,000 --> 00:30:53,000 Không có gì dường như đã xảy ra, nhưng thông báo ở phía dưới trái 574 00:30:53,000 --> 00:30:58,000 bắt đầu chương trình, buggy3, breakpoint 1 trong chính tại buggy3.c dòng 18. 575 00:30:58,000 --> 00:31:00,000 Những gì tôi có thể làm bây giờ? 576 00:31:00,000 --> 00:31:03,000 >> Thông báo tôi có thể bắt đầu gõ những thứ như in, 577 00:31:03,000 --> 00:31:08,000 không printf, in x, và bây giờ đó là lạ. 578 00:31:08,000 --> 00:31:11,000 $ 1 chỉ là một sự tò mò, như chúng ta sẽ thấy 579 00:31:11,000 --> 00:31:14,000 mỗi khi bạn in một cái gì đó bạn sẽ có được một giá trị mới. 580 00:31:14,000 --> 00:31:18,000 Đó là để bạn có thể tham khảo lại giá trị trước đó chỉ trong trường hợp, 581 00:31:18,000 --> 00:31:21,000 nhưng bây giờ những gì in nói với tôi là giá trị của x vào thời điểm này trong câu chuyện 582 00:31:21,000 --> 00:31:26,000 rõ ràng là 134.514.032. 583 00:31:26,000 --> 00:31:29,000 Gì? Ở đâu mà ngay cả đến từ đâu? 584 00:31:29,000 --> 00:31:31,000 [Không nghe được học sinh] 585 00:31:31,000 --> 00:31:34,000 Thật vậy, đây là những gì chúng ta sẽ gọi một giá trị rác, và chúng tôi đã không nói chuyện về việc này chưa, 586 00:31:34,000 --> 00:31:37,000 nhưng lý do mà bạn khởi tạo các biến 587 00:31:37,000 --> 00:31:40,000 rõ ràng là để họ có một số giá trị mà bạn muốn họ có. 588 00:31:40,000 --> 00:31:44,000 Tuy nhiên, sản lượng đánh bắt được nhớ lại rằng bạn có thể khai báo các biến 589 00:31:44,000 --> 00:31:46,000 như tôi đã làm một chút thời gian trước đây trong ví dụ sigma của tôi 590 00:31:46,000 --> 00:31:48,000 mà không thực sự đem lại cho họ một giá trị. 591 00:31:48,000 --> 00:31:50,000 Nhớ lại những gì tôi đã làm ở đây trong sigma. 592 00:31:50,000 --> 00:31:52,000 Tôi tuyên bố n, nhưng những gì giá trị tôi đã cung cấp cho nó? 593 00:31:52,000 --> 00:31:56,000 Không, bởi vì tôi biết rằng trong vài dòng tiếp theo 594 00:31:56,000 --> 00:31:59,000 GetInt sẽ chăm sóc của vấn đề của việc đưa một giá trị bên trong của n. 595 00:31:59,000 --> 00:32:02,000 >> Nhưng vào thời điểm này trong câu chuyện của dòng 11 596 00:32:02,000 --> 00:32:05,000 và dòng 12 và dòng 13 và dòng 14 597 00:32:05,000 --> 00:32:08,000 trong suốt những một vài dòng giá trị của n là gì? 598 00:32:08,000 --> 00:32:10,000 Trong C, bạn chỉ không biết. 599 00:32:10,000 --> 00:32:14,000 Đó là nói chung một số giá trị rác, một số số hoàn toàn ngẫu nhiên 600 00:32:14,000 --> 00:32:17,000 còn lại chủ yếu từ một số chức năng trước đây 601 00:32:17,000 --> 00:32:21,000 đã được chạy, để chương trình của bạn chạy 602 00:32:21,000 --> 00:32:24,000 nhớ lại rằng chức năng được chức năng, chức năng, chức năng. 603 00:32:24,000 --> 00:32:27,000 Tất cả những khung hình có được đặt vào bộ nhớ, sau đó những người trở về chức năng, 604 00:32:27,000 --> 00:32:31,000 và cũng giống như tôi đã đề nghị với tẩy bộ nhớ của họ được tái sử dụng cuối cùng. 605 00:32:31,000 --> 00:32:37,000 Vâng, nó chỉ như vậy sẽ xảy ra rằng điều này biến x trong chương trình này 606 00:32:37,000 --> 00:32:41,000 dường như đã có một số giá trị rác như 134514032 607 00:32:41,000 --> 00:32:44,000 từ một số chức năng trước đây, không phải một mà tôi đã viết. 608 00:32:44,000 --> 00:32:47,000 Nó có thể là một cái gì đó mà đi kèm hiệu quả với hệ điều hành, 609 00:32:47,000 --> 00:32:49,000 một số chức năng bên dưới mui xe. 610 00:32:49,000 --> 00:32:52,000 >> Được rồi, đó là tốt, nhưng chúng ta hãy tiến đến dòng kế tiếp. 611 00:32:52,000 --> 00:32:55,000 Nếu tôi gõ "tiếp theo" tại dấu nhắc GDB của tôi và tôi nhấn Enter, 612 00:32:55,000 --> 00:32:58,000 nhận thấy rằng làm nổi bật di chuyển xuống dòng 19, 613 00:32:58,000 --> 00:33:01,000 nhưng ngụ ý hợp lý là dòng 18 614 00:33:01,000 --> 00:33:06,000 đã hoàn tất thi công, vì vậy nếu tôi lại gõ "in x" 615 00:33:06,000 --> 00:33:10,000 Bây giờ tôi sẽ thấy 1, và quả thật, tôi làm. 616 00:33:10,000 --> 00:33:14,000 Một lần nữa, những thứ là một cách để GDB nhắc nhở bạn 617 00:33:14,000 --> 00:33:17,000 lịch sử của bản in mà bạn đã thực hiện. 618 00:33:17,000 --> 00:33:21,000 Bây giờ để tôi đi trước và in ra y, và quả thật, y là một số giá trị điên như, 619 00:33:21,000 --> 00:33:24,000 nhưng không có vấn đề lớn bởi vì trong dòng 19, chúng tôi đang về để gán cho nó 620 00:33:24,000 --> 00:33:27,000 giá trị 2, vì vậy hãy để tôi gõ "bên cạnh" một lần nữa. 621 00:33:27,000 --> 00:33:29,000 Và bây giờ chúng tôi đang ở trên dòng printf. 622 00:33:29,000 --> 00:33:31,000 Hãy để tôi làm x in. 623 00:33:31,000 --> 00:33:34,000 Hãy để tôi làm y in. Thẳng thắn mà nói, tôi nhận được một chút mệt mỏi in ấn này. 624 00:33:34,000 --> 00:33:38,000 Hãy để tôi thay vì gõ "hiển thị x" và "hiển thị y" 625 00:33:38,000 --> 00:33:41,000 và bây giờ mỗi khi tôi gõ lệnh trong tương lai 626 00:33:41,000 --> 00:33:45,000 Tôi sẽ được nhắc nhở về những gì x và y, những gì x và y, x và y là những gì. 627 00:33:45,000 --> 00:33:48,000 >> Tôi cũng có thể, như là một loại, bên cạnh "người dân địa phương biết." 628 00:33:48,000 --> 00:33:50,000 Thông tin là một lệnh đặc biệt. 629 00:33:50,000 --> 00:33:52,000 Người dân địa phương có nghĩa là nó cho thấy tôi các biến địa phương. 630 00:33:52,000 --> 00:33:55,000 Chỉ trong trường hợp tôi quên hoặc đây là một chức năng phức tạp điên 631 00:33:55,000 --> 00:33:57,000 mà tôi hoặc người khác đã viết người dân địa phương thông tin sẽ cho bạn biết 632 00:33:57,000 --> 00:34:00,000 tất cả các biến địa phương bên trong chức năng địa phương này là gì 633 00:34:00,000 --> 00:34:03,000 mà bạn có thể quan tâm đến nếu bạn muốn poke xung quanh. 634 00:34:03,000 --> 00:34:07,000 Bây giờ, printf về để thực hiện, vì vậy hãy để tôi đi trước và chỉ cần gõ "tiếp theo." 635 00:34:07,000 --> 00:34:10,000 Bởi vì chúng ta đang ở trong môi trường này, chúng tôi đang không thực sự nhìn thấy nó 636 00:34:10,000 --> 00:34:14,000 thực hiện xuống ở đây, nhưng nhận thấy nó nhận được một chút đã bị đọc sai ở đây. 637 00:34:14,000 --> 00:34:17,000 Nhưng hãy chú ý trọng các màn hình có, 638 00:34:17,000 --> 00:34:21,000 vì vậy nó không phải là một chương trình hoàn hảo ở đây, nhưng đó là ổn bởi vì tôi luôn luôn có thể poke xung quanh 639 00:34:21,000 --> 00:34:23,000 sử dụng in nếu tôi muốn. 640 00:34:23,000 --> 00:34:26,000 >> Hãy để tôi gõ tiếp theo một lần nữa, và bây giờ đây là phần thú vị. 641 00:34:26,000 --> 00:34:29,000 Tại thời điểm này trong câu chuyện y là 2, và x là 1, 642 00:34:29,000 --> 00:34:32,000 như đề xuất ở đây, và một lần nữa, 643 00:34:32,000 --> 00:34:35,000 lý do này được tự động hiển thị giờ là bởi vì tôi đã sử dụng lệnh 644 00:34:35,000 --> 00:34:40,000 hiển thị x và màn hình hiển thị y, do đó, thời điểm tôi gõ tiếp theo 645 00:34:40,000 --> 00:34:43,000 trong lý thuyết x và y sẽ trở nên đổi chỗ. 646 00:34:43,000 --> 00:34:45,000 Bây giờ, chúng ta đã biết điều đó sẽ không phải là trường hợp, 647 00:34:45,000 --> 00:34:49,000 nhưng chúng ta sẽ thấy trong một thời điểm như thế nào chúng tôi có thể lặn sâu hơn để tìm ra lý do tại sao đó là sự thật. 648 00:34:49,000 --> 00:34:54,000 Tiếp theo, và không may, y vẫn còn 2 và x vẫn còn 1, và tôi có thể xác nhận càng nhiều. 649 00:34:54,000 --> 00:34:56,000 In x, y in. 650 00:34:56,000 --> 00:34:59,000 Thật vậy, không có trao đổi đã thực sự xảy ra, vì vậy hãy bắt đầu điều này hơn. 651 00:34:59,000 --> 00:35:01,000 Rõ ràng hoán đổi là bị hỏng. 652 00:35:01,000 --> 00:35:04,000 Hãy thay vì gõ "chạy" một lần nữa. 653 00:35:04,000 --> 00:35:07,000 Hãy để tôi nói có, tôi muốn khởi động lại nó từ đầu, nhập. 654 00:35:07,000 --> 00:35:09,000 >> Bây giờ tôi trở lên ở dòng 18. 655 00:35:09,000 --> 00:35:11,000 Bây giờ nhận thấy x và y là các giá trị rác một lần nữa. 656 00:35:11,000 --> 00:35:15,000 Tiếp theo, tiếp theo, tiếp theo, tiếp theo. 657 00:35:15,000 --> 00:35:17,000 Nếu tôi nhận được chán, tôi cũng có thể chỉ cần gõ n tiếp theo. 658 00:35:17,000 --> 00:35:21,000 Bạn có thể viết tắt trình tự ngắn nhất có thể của các nhân vật. 659 00:35:21,000 --> 00:35:23,000 Swap bây giờ bị hỏng. 660 00:35:23,000 --> 00:35:25,000 Hãy lặn trong, do đó, thay vì gõ tiếp theo, 661 00:35:25,000 --> 00:35:30,000 bây giờ tôi sẽ gõ bước vì vậy mà tôi đang bước vào bên trong của chức năng này 662 00:35:30,000 --> 00:35:33,000 vì vậy mà tôi có thể đi bộ qua nó, do đó, tôi nhấn bước và sau đó nhập vào. 663 00:35:33,000 --> 00:35:37,000 Chú ý rằng nhảy làm nổi bật xuống thấp trong chương trình của tôi đến dòng 36. 664 00:35:37,000 --> 00:35:39,000 Bây giờ các biến địa phương là gì? 665 00:35:39,000 --> 00:35:41,000 Thông tin người dân địa phương. 666 00:35:41,000 --> 00:35:43,000 Không có gì chỉ được nêu ra bởi vì chúng tôi đã không nhận được dòng đó, 667 00:35:43,000 --> 00:35:47,000 do đó, chúng ta hãy đi trước và nói "bên cạnh". 668 00:35:47,000 --> 00:35:50,000 Bây giờ chúng ta dường như có tmp tmp in,. 669 00:35:50,000 --> 00:35:52,000 Garbage giá trị, phải không? Tôi nghĩ vậy. 670 00:35:52,000 --> 00:35:55,000 Làm thế nào về in, in b, 1 và 2? 671 00:35:55,000 --> 00:35:58,000 Trong một khoảnh khắc, ngay sau khi tôi gõ tiếp theo nữa 672 00:35:58,000 --> 00:36:02,000 tmp là sẽ mất giá trị là 1, hy vọng, 673 00:36:02,000 --> 00:36:05,000 vì tmp sẽ được gán giá trị của một. 674 00:36:05,000 --> 00:36:08,000 >> Bây giờ chúng ta hãy làm in, in b, 675 00:36:08,000 --> 00:36:11,000 nhưng bây giờ in tmp, và nó thực sự 1. 676 00:36:11,000 --> 00:36:14,000 Hãy để tôi làm gì tiếp theo. Hãy để tôi làm gì tiếp theo. 677 00:36:14,000 --> 00:36:16,000 Tôi đã hoàn thành các chức năng trao đổi. 678 00:36:16,000 --> 00:36:19,000 Tôi vẫn còn bên trong của nó ở đường 40, vì vậy hãy để tôi in một, 679 00:36:19,000 --> 00:36:22,000 in b, và tôi không quan tâm những gì tmp. 680 00:36:22,000 --> 00:36:27,000 Có vẻ như trao đổi là chính xác khi nói đến để trao đổi a và b. 681 00:36:27,000 --> 00:36:31,000 Nhưng nếu tôi gõ tiếp theo, tôi nhảy trở lại dòng 25, 682 00:36:31,000 --> 00:36:34,000 và dĩ nhiên, nếu tôi gõ trong x và y in 683 00:36:34,000 --> 00:36:38,000 họ vẫn không thay đổi, vì vậy chúng tôi đã không cố định được vấn đề. 684 00:36:38,000 --> 00:36:41,000 Nhưng chẩn đoán bây giờ có lẽ với chương trình này GDB 685 00:36:41,000 --> 00:36:44,000 chúng tôi đã ít nhất nhận được một bước gần hơn để hiểu 686 00:36:44,000 --> 00:36:47,000 những gì đang xảy ra sai mà không cần phải xả rác mã của chúng tôi bằng cách đặt một printf ở đây, 687 00:36:47,000 --> 00:36:50,000 printf, printf đây và sau đó chạy nó một lần nữa và một lần nữa 688 00:36:50,000 --> 00:36:52,000 cố gắng tìm ra những gì đang xảy ra sai. 689 00:36:52,000 --> 00:36:55,000 >> Tôi sẽ đi trước và bỏ điều này hoàn toàn bỏ thuốc lá. 690 00:36:55,000 --> 00:36:57,000 Nó sẽ sau đó nói, "Thoát không?" Vâng. 691 00:36:57,000 --> 00:37:00,000 Bây giờ tôi đang trở lại tại dấu nhắc bình thường của tôi, và tôi đang thực hiện bằng cách sử dụng GDB. 692 00:37:00,000 --> 00:37:03,000 Một sang một bên, bạn không cần phải sử dụng-tui cờ. 693 00:37:03,000 --> 00:37:07,000 Trong thực tế, nếu bạn bỏ qua nó, bạn sẽ có được bản chất nửa dưới của màn hình. 694 00:37:07,000 --> 00:37:11,000 Nếu tôi sau đó gõ nghỉ chính và sau đó chạy 695 00:37:11,000 --> 00:37:15,000 Tôi vẫn có thể chạy chương trình của tôi, nhưng những gì nó sẽ làm là textually 696 00:37:15,000 --> 00:37:18,000 chỉ cần cho tôi một dòng tại một thời điểm hiện nay. 697 00:37:18,000 --> 00:37:21,000 Tui qua, giao diện người dùng văn bản, 698 00:37:21,000 --> 00:37:25,000 chỉ cho bạn thấy nhiều chương trình cùng một lúc, mà có lẽ là một chút dễ dàng hơn khái niệm. 699 00:37:25,000 --> 00:37:27,000 Nhưng thực sự, tôi chỉ có thể làm gì tiếp theo, tiếp theo, tiếp theo, 700 00:37:27,000 --> 00:37:30,000 và tôi sẽ nhìn thấy một dòng tại một thời điểm, và nếu tôi thực sự muốn xem những gì đang xảy ra 701 00:37:30,000 --> 00:37:35,000 Tôi có thể loại danh sách và nhìn thấy một bó toàn bộ các đường lân cận. 702 00:37:35,000 --> 00:37:39,000 >> Có một video mà chúng tôi đã hỏi bạn xem vấn đề đặt ra 3 703 00:37:39,000 --> 00:37:43,000 trong đó Nate bao gồm một số những phức tạp của GDB, 704 00:37:43,000 --> 00:37:46,000 và đây là một cách trung thực, những điều đó, một số tỷ lệ phần trăm không tầm thường của bạn 705 00:37:46,000 --> 00:37:49,000 sẽ không bao giờ chạm vào GDB, và điều đó sẽ là một điều xấu 706 00:37:49,000 --> 00:37:53,000 vì nghĩa là bạn sẽ kết thúc dành nhiều thời gian vào cuối học kỳ này 707 00:37:53,000 --> 00:37:56,000 đuổi xuống lỗi sau đó bạn sẽ nếu bạn đặt trong nửa giờ / giờ 708 00:37:56,000 --> 00:38:00,000 trong tuần này và học tập tiếp theo để có được thoải mái với GDB. 709 00:38:00,000 --> 00:38:02,000 Printf là bạn của bạn. 710 00:38:02,000 --> 00:38:05,000 GDB nên bây giờ là bạn của bạn. 711 00:38:05,000 --> 00:38:08,000 >> Bất kỳ câu hỏi trên GDB? 712 00:38:08,000 --> 00:38:12,000 Và đây là danh sách của một số các lệnh công cụ mạnh mẽ và hữu ích nhất. 713 00:38:12,000 --> 00:38:15,000 Yeah. >> Bạn có thể in một chuỗi? 714 00:38:15,000 --> 00:38:17,000 Bạn có thể in một chuỗi? Chắc chắn rồi. 715 00:38:17,000 --> 00:38:19,000 Nó không phải chỉ là các số nguyên. 716 00:38:19,000 --> 00:38:22,000 Nếu một biến s là một chuỗi chỉ cần gõ vào s in. 717 00:38:22,000 --> 00:38:24,000 Nó sẽ cho bạn những gì mà biến chuỗi. 718 00:38:24,000 --> 00:38:26,000 [Không nghe được học sinh] 719 00:38:26,000 --> 00:38:28,000 Nó sẽ cho bạn địa chỉ và bản thân chuỗi. 720 00:38:28,000 --> 00:38:32,000 Nó sẽ cho bạn cả. 721 00:38:32,000 --> 00:38:34,000 Và một điều cuối cùng, chỉ vì đây là tốt để biết quá. 722 00:38:34,000 --> 00:38:37,000 Truy ngược và khung hình, hãy để tôi nhảy vào một lần cuối cùng này, 723 00:38:37,000 --> 00:38:39,000 chương trình giống hệt với GDB. 724 00:38:39,000 --> 00:38:44,000 Hãy để tôi đi trước và chạy các phiên bản giao diện người dùng văn bản, 725 00:38:44,000 --> 00:38:46,000 phá vỡ chính. 726 00:38:46,000 --> 00:38:49,000 Hãy để tôi đi trước và chạy một lần nữa. Tôi ở đây. 727 00:38:49,000 --> 00:38:55,000 Bây giờ hãy để tôi đi tiếp theo, tiếp theo, tiếp theo, tiếp theo, tiếp theo, bước, bước vào. 728 00:38:55,000 --> 00:39:00,000 >> Và bây giờ giả sử tôi bây giờ trong trao đổi cố ý, nhưng tôi như "Damn, giá trị của x là gì?" 729 00:39:00,000 --> 00:39:02,000 Tôi không thể làm x nữa. 730 00:39:02,000 --> 00:39:05,000 Tôi không thể làm y bởi vì họ đang không ở trong phạm vi. 731 00:39:05,000 --> 00:39:07,000 Chúng không phải là trong bối cảnh, nhưng không có vấn đề. 732 00:39:07,000 --> 00:39:09,000 Tôi có thể gõ backtrace. 733 00:39:09,000 --> 00:39:13,000 Điều đó cho thấy tôi tất cả các chức năng đã thực hiện đến thời điểm này. 734 00:39:13,000 --> 00:39:16,000 Chú ý rằng một trong những ngày phía dưới, chính, đường dây với chính 735 00:39:16,000 --> 00:39:18,000 trên dưới cùng của hình ảnh của chúng tôi ở đây. 736 00:39:18,000 --> 00:39:22,000 Thực tế rằng trao đổi ở trên nó dòng với trao đổi ở trên nó trong bộ nhớ ở đây, 737 00:39:22,000 --> 00:39:26,000 và nếu tôi muốn để lại cho chính tạm thời tôi có thể nói "khung". 738 00:39:26,000 --> 00:39:30,000 Những gì số? Chính là khung # 1. 739 00:39:30,000 --> 00:39:32,000 Tôi sẽ đi trước và nói "frame 1". 740 00:39:32,000 --> 00:39:36,000 >> Bây giờ tôi đang trở lại trong chính, và tôi có thể in x, và tôi có thể in y, 741 00:39:36,000 --> 00:39:40,000 nhưng tôi không thể in a hoặc b. 742 00:39:40,000 --> 00:39:43,000 Nhưng tôi có thể nếu tôi nói, "Được rồi, chờ một phút là trao đổi?" 743 00:39:43,000 --> 00:39:46,000 Hãy để tôi đi trước và nói "khung 0." 744 00:39:46,000 --> 00:39:48,000 Bây giờ tôi trở lại nơi mà tôi muốn, và như một sang một bên, 745 00:39:48,000 --> 00:39:52,000 có lệnh khác quá, giống như nếu bạn đang thực sự nhận được đánh máy chán tiếp theo, tiếp theo, tiếp theo, tiếp theo, 746 00:39:52,000 --> 00:39:56,000 bạn thường có thể nói những điều như "tới 10", và điều đó sẽ bước qua 10 dòng tiếp theo. 747 00:39:56,000 --> 00:39:59,000 Bạn cũng có thể viết "tiếp tục" khi bạn thực sự nhận được chán với việc đẩy mạnh thông qua nó. 748 00:39:59,000 --> 00:40:05,000 Tiếp tục chạy chương trình của bạn mà không bị gián đoạn cho đến khi nó chạm khác breakpoint, 749 00:40:05,000 --> 00:40:07,000 cho dù trong một vòng lặp hoặc giảm xuống trong chương trình của bạn. 750 00:40:07,000 --> 00:40:11,000 >> Trong trường hợp này, chúng tôi tiếp tục đến cùng, và chương trình đã thoát bình thường. 751 00:40:11,000 --> 00:40:13,000 Đây là một cách ưa thích, quá trình kém. 752 00:40:13,000 --> 00:40:16,000 Chỉ cần chương trình của bạn đã thoát bình thường. 753 00:40:16,000 --> 00:40:24,000 Thêm vào đó trong đoạn video và trong gỡ lỗi các phiên tới. 754 00:40:24,000 --> 00:40:26,000 Đó là rất nhiều. 755 00:40:26,000 --> 00:40:35,000 Chúng ta hãy nghỉ 5-phút của chúng tôi ở đây, và chúng tôi sẽ trở lại với cấu trúc và các tập tin. 756 00:40:35,000 --> 00:40:38,000 >> Nếu bạn đã tụt dốc vào pset tuần này đã 757 00:40:38,000 --> 00:40:41,000 bạn sẽ biết rằng chúng tôi sử dụng trong mã phân phối, 758 00:40:41,000 --> 00:40:45,000 mã nguồn mà chúng tôi cung cấp cho bạn như là một điểm khởi đầu, một số kỹ thuật mới. 759 00:40:45,000 --> 00:40:50,000 Đặc biệt, chúng tôi giới thiệu từ khoá này mới được gọi là cấu trúc, cấu trúc, 760 00:40:50,000 --> 00:40:53,000 để chúng tôi có thể tạo ra các biến tùy chỉnh của các loại. 761 00:40:53,000 --> 00:40:57,000 Chúng tôi cũng giới thiệu khái niệm về tập tin tập tin đầu vào và đầu ra I / O,, 762 00:40:57,000 --> 00:41:00,000 và điều này là để chúng ta có thể lưu trạng thái 763 00:41:00,000 --> 00:41:03,000 của hội đồng quản trị Scramble của bạn vào một tập tin trên đĩa 764 00:41:03,000 --> 00:41:06,000 để các nghiên cứu sinh giảng dạy và tôi có thể hiểu 765 00:41:06,000 --> 00:41:09,000 những gì đang xảy ra bên trong của chương trình của bạn mà không cần phải tự chơi 766 00:41:09,000 --> 00:41:11,000 hàng chục trò chơi của Scramble. 767 00:41:11,000 --> 00:41:13,000 Chúng ta có thể làm điều này automatedly hơn. 768 00:41:13,000 --> 00:41:18,000 >> Ý tưởng này của một cấu trúc giải quyết một vấn đề khá hấp dẫn. 769 00:41:18,000 --> 00:41:21,000 Giả sử chúng ta muốn thực hiện một số chương trình 770 00:41:21,000 --> 00:41:25,000 bằng cách nào đó theo dõi những thông tin về học sinh, 771 00:41:25,000 --> 00:41:28,000 và sinh viên có thể có, ví dụ, một ID, một tên 772 00:41:28,000 --> 00:41:31,000 và một ngôi nhà tại một nơi như Harvard, do đó, đây là 3 mẩu thông tin 773 00:41:31,000 --> 00:41:34,000 chúng tôi muốn giữ cho xung quanh, vì vậy hãy để tôi đi trước và bắt đầu viết một chương trình nhỏ ở đây, 774 00:41:34,000 --> 00:41:38,000 bao gồm stdio.h. 775 00:41:38,000 --> 00:41:42,000 Hãy để tôi làm bao gồm cs50.h. 776 00:41:42,000 --> 00:41:44,000 Và sau đó bắt đầu chức năng chính của tôi. 777 00:41:44,000 --> 00:41:46,000 Tôi sẽ không bận tâm với bất kỳ đối số dòng lệnh, 778 00:41:46,000 --> 00:41:49,000 và ở đây tôi muốn có một sinh viên, do đó, tôi sẽ nói 779 00:41:49,000 --> 00:41:54,000 một học sinh có tên, vì vậy tôi sẽ nói "tên chuỗi". 780 00:41:54,000 --> 00:41:59,000 Sau đó, tôi sẽ nói một học sinh cũng có một ID, id để int, 781 00:41:59,000 --> 00:42:03,000 và một học sinh có một căn nhà, vì vậy tôi cũng sẽ nói "chuỗi nhà". 782 00:42:03,000 --> 00:42:06,000 Sau đó, tôi sẽ đặt hàng những một chút sạch hơn như thế này. 783 00:42:06,000 --> 00:42:11,000 Được rồi, bây giờ tôi có 3 biến để đại diện cho một học sinh, do đó, "một học sinh." 784 00:42:11,000 --> 00:42:15,000 >> Và bây giờ tôi muốn để cư các giá trị, vì vậy hãy để tôi đi trước và nói một cái gì đó như 785 00:42:15,000 --> 00:42:18,000 "Id = 123". 786 00:42:18,000 --> 00:42:21,000 Tên là sẽ nhận được David. 787 00:42:21,000 --> 00:42:24,000 Hãy nói rằng ngôi nhà là sẽ nhận được Mather, 788 00:42:24,000 --> 00:42:31,000 và sau đó tôi sẽ làm một cái gì đó tùy ý giống như printf ("% s, 789 00:42:31,000 --> 00:42:37,000 có ID là% d, sống trong% s. 790 00:42:37,000 --> 00:42:41,000 Và bây giờ, tôi làm những gì muốn cắm ở đây, sau khi một khác? 791 00:42:41,000 --> 00:42:47,000 Tên, id, house, trở về 0. 792 00:42:47,000 --> 00:42:50,000 Được rồi, trừ khi tôi hơi say lên một nơi nào đó ở đây 793 00:42:50,000 --> 00:42:54,000 Tôi nghĩ rằng chúng tôi có một chương trình khá tốt mà các cửa hàng một học sinh. 794 00:42:54,000 --> 00:42:57,000 Tất nhiên, đây không phải là tất cả những gì thú vị. Điều gì sẽ xảy ra nếu tôi muốn có 2 học sinh? 795 00:42:57,000 --> 00:42:59,000 Đó là không có vấn đề lớn. Tôi có thể hỗ trợ 2 người. 796 00:42:59,000 --> 00:43:03,000 Hãy để tôi đi trước và làm nổi bật này và đi xuống đây, 797 00:43:03,000 --> 00:43:09,000 và tôi có thể nói "id = 456" cho một người nào đó giống như Rob người sống trong Kirkland. 798 00:43:09,000 --> 00:43:12,000 >> Được rồi, chờ đợi, nhưng tôi không thể gọi những điều tương tự, 799 00:43:12,000 --> 00:43:15,000 và có vẻ như tôi sẽ phải để sao chép, 800 00:43:15,000 --> 00:43:19,000 vì vậy hãy để tôi nói rằng đây sẽ là David biến, 801 00:43:19,000 --> 00:43:23,000 và để cho tôi có được một số bản sao của các Rob. 802 00:43:23,000 --> 00:43:27,000 Chúng tôi sẽ gọi những Rob nhưng điều này sẽ không làm việc bây giờ 803 00:43:27,000 --> 00:43:33,000 bởi vì tôi đã chờ đợi, chúng ta hãy thay đổi tôi id1, name1 và house1. 804 00:43:33,000 --> 00:43:35,000 Rob sẽ là 2, 2. 805 00:43:35,000 --> 00:43:42,000 Tôi đã có để thay đổi điều này đây, ở đây, ở đây, ở đây, ở đây, ở đây. 806 00:43:42,000 --> 00:43:45,000 Chờ đợi, những gì về Tommy? Hãy làm điều này một lần nữa. 807 00:43:45,000 --> 00:43:49,000 Rõ ràng là nếu bạn vẫn còn nghĩ đây là một cách tốt để làm điều này, nó không phải, 808 00:43:49,000 --> 00:43:52,000 để sao chép / dán xấu. 809 00:43:52,000 --> 00:43:55,000 Nhưng chúng ta giải quyết điều này một tuần trước đây. 810 00:43:55,000 --> 00:43:59,000 >> Giải pháp của chúng tôi là gì khi chúng tôi muốn có nhiều trường hợp của cùng một kiểu dữ liệu? 811 00:43:59,000 --> 00:44:01,000 [Sinh viên] Một mảng. 812 00:44:01,000 --> 00:44:03,000 Một mảng, vì vậy hãy để tôi cố gắng làm sạch này lên. 813 00:44:03,000 --> 00:44:07,000 Hãy để tôi làm cho một số phòng cho bản thân mình ở đầu trang, và để cho tôi thay vì làm điều này ở đây. 814 00:44:07,000 --> 00:44:12,000 Chúng tôi sẽ gọi những người này, và thay vào đó tôi sẽ nói "id int," 815 00:44:12,000 --> 00:44:14,000 và tôi sẽ hỗ trợ 3 của chúng tôi bây giờ. 816 00:44:14,000 --> 00:44:18,000 Tôi sẽ nói "tên chuỗi," và tôi sẽ hỗ trợ 3 của chúng tôi, 817 00:44:18,000 --> 00:44:22,000 và sau đó tôi sẽ nói "nhà chuỗi," và tôi sẽ hỗ trợ 3 của chúng tôi. 818 00:44:22,000 --> 00:44:26,000 Bây giờ ở đây thay vì David nhận được các biến riêng của địa phương của mình 819 00:44:26,000 --> 00:44:28,000 chúng ta có thể thoát khỏi những. 820 00:44:28,000 --> 00:44:30,000 Mà cảm thấy tốt mà chúng ta đang lau chùi này. 821 00:44:30,000 --> 00:44:35,000 Sau đó tôi có thể nói rằng David sẽ là [0] và tên [0] 822 00:44:35,000 --> 00:44:38,000 và nhà [0]. 823 00:44:38,000 --> 00:44:41,000 Và sau đó Rob chúng tôi tương tự như vậy có thể tiết kiệm này. 824 00:44:41,000 --> 00:44:46,000 Chúng ta hãy đặt này xuống đây, vì vậy anh sẽ tự ý id [1]. 825 00:44:46,000 --> 00:44:50,000 Ông ấy sẽ có tên [1], 826 00:44:50,000 --> 00:44:53,000 và sau đó cuối cùng, nhà [1]. 827 00:44:53,000 --> 00:44:57,000 >> Vẫn còn một chút buồn tẻ, và bây giờ tôi có con số này ra, 828 00:44:57,000 --> 00:45:03,000 do đó, chúng ta hãy nói rằng "tên [0], id [0], nhà [0], 829 00:45:03,000 --> 00:45:06,000 và chúng ta hãy pluralize này. 830 00:45:06,000 --> 00:45:09,000 Id, id, id. 831 00:45:09,000 --> 00:45:12,000 Và một lần nữa, tôi đang làm nó, vì vậy một lần nữa, tôi đã viện đến sao chép / dán lại, 832 00:45:12,000 --> 00:45:14,000 do đó, tỷ lệ cược là có một giải pháp khác ở đây. 833 00:45:14,000 --> 00:45:18,000 Tôi có lẽ có thể làm sạch này lên cao hơn nữa với một vòng lặp hoặc một cái gì đó như thế, 834 00:45:18,000 --> 00:45:21,000 do đó, trong ngắn hạn, đó là tốt hơn một chút, nhưng vẫn cảm thấy như 835 00:45:21,000 --> 00:45:24,000 Tôi đang phải dùng đến sao chép / dán, nhưng ngay cả điều này, tôi yêu cầu bồi thường, 836 00:45:24,000 --> 00:45:27,000 không thực sự về cơ bản là giải pháp đúng vì 837 00:45:27,000 --> 00:45:29,000 bạn nếu đôi khi chúng ta quyết định những gì biết không? 838 00:45:29,000 --> 00:45:32,000 Chúng tôi thực sự nên đã được lưu trữ các địa chỉ email cho David và Rob 839 00:45:32,000 --> 00:45:34,000 và tất cả mọi người khác trong chương trình này. 840 00:45:34,000 --> 00:45:36,000 Chúng ta cũng nên lưu số điện thoại. 841 00:45:36,000 --> 00:45:39,000 Chúng ta cũng nên lưu trữ các số liên lạc khẩn cấp. 842 00:45:39,000 --> 00:45:41,000 Chúng tôi có tất cả các mảnh dữ liệu mà chúng tôi muốn để lưu trữ, 843 00:45:41,000 --> 00:45:43,000 vậy làm thế nào để bạn đi về làm điều đó? 844 00:45:43,000 --> 00:45:46,000 >> Bạn khai báo một mảng ở đầu trang, và sau đó bạn tự thêm 845 00:45:46,000 --> 00:45:49,000 một địa chỉ email [0], địa chỉ email [1] 846 00:45:49,000 --> 00:45:51,000 David và Rob và vv. 847 00:45:51,000 --> 00:45:56,000 Nhưng có thực sự chỉ là một giả định cơ bản thiết kế này 848 00:45:56,000 --> 00:45:59,000 Tôi đang sử dụng hệ thống vinh dự để biết rằng 849 00:45:59,000 --> 00:46:03,000 [I] trong mỗi của các mảng nhiều 850 00:46:03,000 --> 00:46:06,000 chỉ để xảy ra để chỉ cùng một người, 851 00:46:06,000 --> 00:46:10,000 [0] trong id là số 123, 852 00:46:10,000 --> 00:46:13,000 và tôi sẽ cho rằng tên [0] 853 00:46:13,000 --> 00:46:16,000 là cùng một người tên và nhà [0] 854 00:46:16,000 --> 00:46:21,000 là cùng một người nhà và vv cho tất cả các mảng khác nhau mà tôi tạo ra. 855 00:46:21,000 --> 00:46:24,000 Nhưng hãy chú ý rằng không có mối liên kết cơ bản 856 00:46:24,000 --> 00:46:27,000 trong số những 3 mẩu thông tin, tên, id và ngôi nhà, 857 00:46:27,000 --> 00:46:32,000 mặc dù đơn vị chúng tôi đang cố gắng để mô hình trong chương trình này không phải là mảng. 858 00:46:32,000 --> 00:46:35,000 Mảng là một cách như vậy chương trình để làm điều này. 859 00:46:35,000 --> 00:46:38,000 Những gì chúng tôi thực sự muốn mô hình trong chương trình của chúng tôi là một người 860 00:46:38,000 --> 00:46:41,000 như David, một người như Rob bên trong đó 861 00:46:41,000 --> 00:46:46,000 hoặc đóng gói là một cái tên và ID và một ngôi nhà. 862 00:46:46,000 --> 00:46:49,000 >> Bằng cách nào đó chúng ta có thể bày tỏ ý tưởng này đóng gói 863 00:46:49,000 --> 00:46:52,000 theo đó một người có một ID, một cái tên và một ngôi nhà 864 00:46:52,000 --> 00:46:55,000 và không phải nghỉ mát để hack thực sự này nhờ đó chúng ta chỉ 865 00:46:55,000 --> 00:46:58,000 tin tưởng rằng một cái gì đó khung 866 00:46:58,000 --> 00:47:02,000 đề cập đến các thực thể của con người tương tự trong mỗi của các mảng khác nhau? 867 00:47:02,000 --> 00:47:04,000 Chúng tôi thực sự có thể làm điều này. 868 00:47:04,000 --> 00:47:08,000 Hãy để tôi đi trên chính cho bây giờ, và cho tôi tạo kiểu dữ liệu của tôi 869 00:47:08,000 --> 00:47:10,000 thực sự là lần đầu tiên. 870 00:47:10,000 --> 00:47:14,000 Chúng tôi sử dụng kỹ thuật này trong Scramble, 871 00:47:14,000 --> 00:47:17,000 nhưng ở đây tôi sẽ đi trước và tạo ra một kiểu dữ liệu, 872 00:47:17,000 --> 00:47:19,000 và bạn biết không, tôi cũng sẽ gọi nó là sinh viên hoặc người, 873 00:47:19,000 --> 00:47:23,000 và tôi sẽ sử dụng typedef cho định nghĩa một kiểu. 874 00:47:23,000 --> 00:47:25,000 Tôi sẽ nói rằng đây là một cấu trúc, 875 00:47:25,000 --> 00:47:29,000 và sau đó cấu trúc này sẽ là kiểu của học sinh, chúng tôi sẽ nói, 876 00:47:29,000 --> 00:47:31,000 mặc dù nó là một ít ngày bây giờ cho tôi. 877 00:47:31,000 --> 00:47:33,000 Chúng tôi sẽ nói "int id." 878 00:47:33,000 --> 00:47:35,000 Chúng tôi sẽ nói "tên chuỗi." 879 00:47:35,000 --> 00:47:37,000 Sau đó, chúng tôi sẽ nói "chuỗi nhà," 880 00:47:37,000 --> 00:47:40,000 vì vậy bây giờ vào cuối những vài dòng mã 881 00:47:40,000 --> 00:47:45,000 Tôi vừa dạy kêu vang rằng có tồn tại 882 00:47:45,000 --> 00:47:49,000 một kiểu dữ liệu bên cạnh ints, bên cạnh chuỗi, bên cạnh việc tăng gấp đôi, bên cạnh nổi. 883 00:47:49,000 --> 00:47:54,000 >> Tính đến thời điểm này trong 11 dòng thời gian, bây giờ có một kiểu dữ liệu mới gọi là sinh viên, 884 00:47:54,000 --> 00:47:58,000 và bây giờ tôi có thể khai báo một biến của học sinh ở bất cứ nơi nào tôi muốn, 885 00:47:58,000 --> 00:48:01,000 vì vậy hãy để tôi di chuyển xuống cho người dân. 886 00:48:01,000 --> 00:48:05,000 Bây giờ tôi có thể nhận được thoát khỏi điều này, và tôi có thể trở lại David ở đây, 887 00:48:05,000 --> 00:48:10,000 và cho David, tôi thực sự có thể nói rằng David, 888 00:48:10,000 --> 00:48:13,000 nghĩa là chúng tôi có thể đặt tên biến sau khi bản thân mình, 889 00:48:13,000 --> 00:48:16,000 là có được kiểu của học sinh. 890 00:48:16,000 --> 00:48:18,000 Điều này có thể trông hơi kì lạ một chút, nhưng điều này không phải là tất cả những gì khác nhau 891 00:48:18,000 --> 00:48:22,000 tuyên bố một cái gì đó như là một int hoặc một chuỗi hoặc một phao. 892 00:48:22,000 --> 00:48:24,000 Nó chỉ như vậy sẽ xảy ra để được gọi là sinh viên bây giờ, 893 00:48:24,000 --> 00:48:28,000 và nếu tôi muốn đặt một cái gì đó bên trong của cấu trúc này 894 00:48:28,000 --> 00:48:31,000 Tôi bây giờ có sử dụng một đoạn mới của cú pháp, nhưng nó khá đơn giản, 895 00:48:31,000 --> 00:48:39,000 david.id = 123, david.name = "David" ở thủ đô D, 896 00:48:39,000 --> 00:48:42,000 và david.house = "Mather," 897 00:48:42,000 --> 00:48:46,000 và bây giờ tôi có thể nhận được thoát khỏi công cụ này ở đây. 898 00:48:46,000 --> 00:48:51,000 Thông báo bây giờ chúng tôi đã thiết kế lại chương trình của chúng tôi trong một cách thực sự tốt hơn nhiều 899 00:48:51,000 --> 00:48:54,000 trong chương trình của chúng tôi phản ánh thế giới thực. 900 00:48:54,000 --> 00:48:57,000 >> Có một khái niệm thực tế của một người hoặc một học sinh. 901 00:48:57,000 --> 00:49:02,000 Ở đây chúng tôi có một phiên bản C của một người hoặc cụ thể hơn là một học sinh. 902 00:49:02,000 --> 00:49:05,000 Bên trong của người đó là những đặc điểm này có liên quan, 903 00:49:05,000 --> 00:49:10,000 ID, tên và ngôi nhà, do đó, Rob cơ bản trở thành điều tương tự ở đây, 904 00:49:10,000 --> 00:49:14,000 cho nên sinh viên cướp, và bây giờ rob.id = 456, 905 00:49:14,000 --> 00:49:17,000 rob.name = "Rob". 906 00:49:17,000 --> 00:49:20,000 Thực tế là biến được gọi là Rob là loại vô nghĩa. 907 00:49:20,000 --> 00:49:22,000 Chúng ta có thể gọi nó là x hoặc y hoặc z. 908 00:49:22,000 --> 00:49:25,000 Chúng tôi chỉ đặt tên cho nó là Rob được ngữ nghĩa phù hợp, 909 00:49:25,000 --> 00:49:28,000 nhưng thực sự tên là bên trong của bản thân mà lĩnh vực, 910 00:49:28,000 --> 00:49:30,000 vậy bây giờ tôi có này. 911 00:49:30,000 --> 00:49:33,000 Điều này cũng không cảm thấy như thiết kế tốt nhất mà tôi đã cứng mã hoá David. 912 00:49:33,000 --> 00:49:35,000 Tôi đã cứng mã hoá Rob. 913 00:49:35,000 --> 00:49:39,000 Và tôi vẫn phải nghỉ mát một số bản sao và dán mỗi khi tôi muốn biến mới. 914 00:49:39,000 --> 00:49:43,000 Hơn nữa, dường như tôi phải cung cấp cho mỗi của các biến này một tên, 915 00:49:43,000 --> 00:49:46,000 mặc dù tôi rất muốn mô tả các biến 916 00:49:46,000 --> 00:49:48,000  hơn tổng quát như sinh viên. 917 00:49:48,000 --> 00:49:52,000 >> Bây giờ chúng ta có thể hợp nhất các ý tưởng đã được làm việc tốt cho chúng tôi 918 00:49:52,000 --> 00:49:56,000 và thay vì nói, "Anh biết không, cho tôi một sinh viên gọi là biến, 919 00:49:56,000 --> 00:50:01,000 và để cho nó có được kích thước 3 ", vì vậy bây giờ tôi có thể tinh chỉnh này hơn nữa, 920 00:50:01,000 --> 00:50:04,000 thoát khỏi David tay tuyên bố, 921 00:50:04,000 --> 00:50:08,000 và tôi thay vì có thể nói một cái gì đó giống như sinh viên [0] ở đây. 922 00:50:08,000 --> 00:50:11,000 Sau đó tôi có thể nói sinh viên [0] ở đây, 923 00:50:11,000 --> 00:50:14,000 sinh viên [0] ở đây, và vân vân, và tôi có thể đi xung quanh 924 00:50:14,000 --> 00:50:16,000 và làm sạch mà cho Rob. 925 00:50:16,000 --> 00:50:19,000 Tôi cũng có thể đi về thể bổ sung thêm một vòng lặp 926 00:50:19,000 --> 00:50:23,000 và sử dụng GetString và getInt để thực sự có được những giá trị từ người sử dụng. 927 00:50:23,000 --> 00:50:27,000 Tôi có thể đi về việc thêm một hằng số vì đây là nói chung là xấu thực hành 928 00:50:27,000 --> 00:50:29,000 cứng mã một số số tùy ý như 3 ngay tại đây 929 00:50:29,000 --> 00:50:33,000 và sau đó chỉ cần nhớ rằng bạn phải dồn không quá 3 học sinh ở trong đó. 930 00:50:33,000 --> 00:50:36,000 Nó có lẽ sẽ tốt hơn để sử dụng # xác định ở trên cùng của tập tin của tôi 931 00:50:36,000 --> 00:50:40,000 và các yếu tố mà ra, do đó, thực sự, hãy để tôi đi trước và tổng quát này. 932 00:50:40,000 --> 00:50:43,000 >> Hãy để tôi mở ra một ví dụ đó là trong ngày hôm nay 933 00:50:43,000 --> 00:50:46,000 ví dụ trước, structs1. 934 00:50:46,000 --> 00:50:49,000 Đây là một chương trình hoàn chỉnh hơn sử dụng # xác định đây 935 00:50:49,000 --> 00:50:51,000 và nói rằng chúng ta sẽ có 3 sinh viên theo mặc định. 936 00:50:51,000 --> 00:50:54,000 Ở đây tôi tuyên bố một giá trị lớp học của học sinh, 937 00:50:54,000 --> 00:50:57,000 do đó, một lớp học của sinh viên, và bây giờ tôi đang sử dụng một vòng lặp 938 00:50:57,000 --> 00:51:00,000 chỉ để làm cho đoạn code một chút thanh lịch hơn, cư trú trong lớp học 939 00:51:00,000 --> 00:51:05,000 với đầu vào của người dùng, do đó, lặp từ i = 0 trên cho học sinh, mà là 3. 940 00:51:05,000 --> 00:51:07,000 Và sau đó tôi nhắc nhở người dùng trong phiên bản này 941 00:51:07,000 --> 00:51:10,000  ID của học sinh là gì, và tôi nhận được nó với getInt. 942 00:51:10,000 --> 00:51:13,000 Tên của học sinh là gì, và sau đó tôi nhận được nó với GetString. 943 00:51:13,000 --> 00:51:15,000 Nhà của học sinh là gì? Tôi nhận được nó với GetString. 944 00:51:15,000 --> 00:51:19,000 Và sau đó ở dưới cùng ở đây, tôi quyết định thay đổi 945 00:51:19,000 --> 00:51:22,000 làm thế nào tôi in này ra và thực sự sử dụng một vòng lặp, 946 00:51:22,000 --> 00:51:24,000 và tôi ai in? 947 00:51:24,000 --> 00:51:27,000 Theo những nhận xét tôi in bất cứ ai trong Mather, 948 00:51:27,000 --> 00:51:30,000 và đó là nó để Rob và Tommy và vv thực sự của Tommy Mather. 949 00:51:30,000 --> 00:51:34,000 Tommy và David sẽ được in trong trường hợp này, nhưng làm thế nào là làm việc này? 950 00:51:34,000 --> 00:51:40,000 Chúng tôi đã không nhìn thấy chức năng này trước đây, nhưng có nhiều phán đoán điều này không. 951 00:51:40,000 --> 00:51:42,000 So sánh hai xâu. 952 00:51:42,000 --> 00:51:45,000 >> Đó là một chút không rõ ràng làm thế nào nó so sánh chuỗi bởi vì nó chỉ ra 953 00:51:45,000 --> 00:51:49,000 nếu nó trả về 0 có nghĩa là các chuỗi bằng nhau. 954 00:51:49,000 --> 00:51:53,000 Nếu nó trả về một -1 có nghĩa là một đến theo thứ tự bảng chữ cái trước kia, 955 00:51:53,000 --> 00:51:57,000 và nếu nó trả về +1 mà có nghĩa là từ khác đi kèm theo bảng chữ cái 956 00:51:57,000 --> 00:52:00,000 trước kia, và bạn có thể xem trực tuyến hoặc tại trang người đàn ông 957 00:52:00,000 --> 00:52:04,000 để xem chính xác đó là cách, nhưng tất cả những điều này hiện đang làm là nó nói 958 00:52:04,000 --> 00:52:09,000 nếu [i]. nhà bằng "Mather" 959 00:52:09,000 --> 00:52:13,000 sau đó đi trước và in ra như vậy và như vậy là trong Mather. 960 00:52:13,000 --> 00:52:16,000 Nhưng đây là một cái gì đó chúng tôi đã không nhìn thấy trước, và chúng tôi sẽ trở lại này. 961 00:52:16,000 --> 00:52:21,000 Tôi không nhớ bao giờ phải làm điều này trong bất kỳ chương trình của tôi. 962 00:52:21,000 --> 00:52:24,000 Free là dường như đề cập đến bộ nhớ, giải phóng bộ nhớ, 963 00:52:24,000 --> 00:52:31,000 nhưng nhớ những gì tôi dường như giải phóng trong vòng lặp này ở dưới cùng của chương trình này? 964 00:52:31,000 --> 00:52:34,000 Dường như tôi đang giải phóng tên của một người 965 00:52:34,000 --> 00:52:37,000 và nhà của một người, nhưng tại sao vậy? 966 00:52:37,000 --> 00:52:41,000 >> Hóa ra tất cả những tuần lễ mà bạn đã sử dụng GetString 967 00:52:41,000 --> 00:52:45,000 chúng tôi đã loại được giới thiệu một lỗi vào mỗi một trong các chương trình của bạn. 968 00:52:45,000 --> 00:52:51,000 GetString cấp phát bộ nhớ thiết kế để nó có thể quay trở lại một chuỗi, 969 00:52:51,000 --> 00:52:55,000 như David, Rob, và sau đó bạn có thể làm bất cứ điều gì bạn muốn 970 00:52:55,000 --> 00:52:59,000 với chuỗi trong chương trình của bạn bởi vì chúng tôi đã dành bộ nhớ cho bạn. 971 00:52:59,000 --> 00:53:02,000 Vấn đề là tất cả thời gian này, mỗi khi bạn gọi getString 972 00:53:02,000 --> 00:53:05,000 chúng tôi, các tác giả của GetString, đã được yêu cầu hệ điều hành 973 00:53:05,000 --> 00:53:07,000 để cung cấp cho chúng tôi một chút RAM cho chuỗi này. 974 00:53:07,000 --> 00:53:09,000 Hãy cho chúng tôi một chút bộ nhớ RAM cho chuỗi này tiếp theo. 975 00:53:09,000 --> 00:53:11,000 Hãy cho chúng tôi RAM một số chi tiết cho chuỗi này tiếp theo. 976 00:53:11,000 --> 00:53:13,000 Những gì bạn, lập trình, chưa bao giờ được làm 977 00:53:13,000 --> 00:53:15,000 cho chúng tôi mà quay trở lại bộ nhớ, 978 00:53:15,000 --> 00:53:17,000 do đó, cho tất cả những vài tuần của các chương trình bạn đã viết 979 00:53:17,000 --> 00:53:20,000 đã có những gì được gọi là một bước nhảy vọt nhớ, theo đó họ tiếp tục sử dụng 980 00:53:20,000 --> 00:53:24,000 nhiều hơn và nhiều hơn nữa bộ nhớ mỗi khi bạn gọi GetString, và đó là tiền phạt. 981 00:53:24,000 --> 00:53:27,000 Chúng tôi cố tình làm điều đó trong những tuần đầu tiên vì nó không phải là thú vị 982 00:53:27,000 --> 00:53:29,000 có phải lo lắng về chuỗi là đến từ đâu. 983 00:53:29,000 --> 00:53:34,000 Tất cả những gì bạn muốn là từ Rob trở lại khi người dùng nhập vào. 984 00:53:34,000 --> 00:53:38,000 >> Nhưng di chuyển về phía trước chúng ta bây giờ phải bắt đầu phức tạp hơn về điều này. 985 00:53:38,000 --> 00:53:42,000 Bất cứ lúc nào chúng ta cấp phát bộ nhớ tốt hơn hết chúng ta cuối cùng đã đưa nó trở lại. 986 00:53:42,000 --> 00:53:45,000 Nếu không, trong thế giới thực trên máy Mac hoặc máy PC của bạn, bạn có thể có đôi khi kinh nghiệm 987 00:53:45,000 --> 00:53:50,000 triệu chứng máy tính của bạn được mài dừng lại cuối cùng 988 00:53:50,000 --> 00:53:54,000 hoặc quả bóng bãi biển quay ngu ngốc chỉ là chiếm của máy tính 989 00:53:54,000 --> 00:53:56,000 toàn bộ sự chú ý và bạn không thể làm việc. 990 00:53:56,000 --> 00:54:00,000 Điều đó có thể được giải thích bằng bất kỳ số lượng lỗi, nhưng trong số những lỗi có thể xảy ra 991 00:54:00,000 --> 00:54:03,000 điều được gọi là rò rỉ bộ nhớ, theo đó một người đã viết rằng phần của phần mềm 992 00:54:03,000 --> 00:54:07,000 bạn đang sử dụng không nhớ bộ nhớ miễn phí 993 00:54:07,000 --> 00:54:10,000 mà người đó yêu cầu hệ điều hành cho, 994 00:54:10,000 --> 00:54:14,000 không sử dụng GetString, bởi vì đó là một điều CS50, nhưng bằng cách sử dụng các chức năng tương tự 995 00:54:14,000 --> 00:54:16,000 yêu cầu hệ điều hành cho bộ nhớ. 996 00:54:16,000 --> 00:54:19,000 Nếu bạn hoặc họ vít lên và không bao giờ thực sự trở lại là bộ nhớ 997 00:54:19,000 --> 00:54:24,000 một triệu chứng có thể là một chương trình chậm và làm chậm và làm chậm 998 00:54:24,000 --> 00:54:26,000 trừ khi bạn nhớ để gọi miễn phí. 999 00:54:26,000 --> 00:54:28,000 >> Chúng tôi sẽ trở lại khi nào và tại sao bạn sẽ gọi miễn phí, 1000 00:54:28,000 --> 00:54:32,000 nhưng chúng ta hãy chỉ cho biện pháp tốt và cố gắng chạy chương trình này cụ thể. 1001 00:54:32,000 --> 00:54:35,000 Này được gọi là structs1, nhập. 1002 00:54:35,000 --> 00:54:40,000 Hãy để tôi đi trước và chạy structs1, 123, David Mather, 1003 00:54:40,000 --> 00:54:47,000 456, Rob Kirkland, 789, 1004 00:54:47,000 --> 00:54:50,000 Tommy Mather, và chúng ta thấy David trong Mather, Tommy trong Mather. 1005 00:54:50,000 --> 00:54:53,000 Đây chỉ là một ít kiểm tra sanity rằng chương trình đang hoạt động. 1006 00:54:53,000 --> 00:54:56,000 Bây giờ, thật không may, chương trình này là một chút bực bội trong đó 1007 00:54:56,000 --> 00:55:00,000 Tôi đã làm tất cả những công việc, tôi đã gõ trong 9 dây khác nhau, nhấn Enter, 1008 00:55:00,000 --> 00:55:04,000 nói với người trong Mather, nhưng rõ ràng là tôi biết ai đứng ở Mather đã vì tôi đã gõ nó. 1009 00:55:04,000 --> 00:55:07,000 Nó sẽ là ít nhất là tốt đẹp nếu chương trình này là giống như một cơ sở dữ liệu 1010 00:55:07,000 --> 00:55:10,000 và nó thực sự nhớ những gì tôi đã gõ vào 1011 00:55:10,000 --> 00:55:12,000 vì vậy tôi không bao giờ phải nhập vào các hồ sơ học sinh. 1012 00:55:12,000 --> 00:55:15,000 Có lẽ nó giống như một hệ thống registrarial. 1013 00:55:15,000 --> 00:55:21,000 >> Chúng tôi có thể làm điều này bằng cách sử dụng kỹ thuật này được gọi là tập tin tập tin đầu vào và đầu ra I / O,, 1014 00:55:21,000 --> 00:55:24,000 một cách rất chung chung nói rằng bất cứ lúc nào bạn muốn đọc các tập tin hoặc viết các tập tin 1015 00:55:24,000 --> 00:55:26,000 bạn có thể làm điều này với một tập hợp các chức năng. 1016 00:55:26,000 --> 00:55:29,000 Hãy để tôi đi trước và mở structs2.c ví dụ này, 1017 00:55:29,000 --> 00:55:33,000 đó là gần như giống hệt nhau, nhưng chúng ta hãy xem những gì nó bây giờ không. 1018 00:55:33,000 --> 00:55:36,000 Ở phía trên của tập tin tôi khai báo một lớp học của học sinh. 1019 00:55:36,000 --> 00:55:38,000 Tôi sau đó cư các lớp học với đầu vào của người dùng, 1020 00:55:38,000 --> 00:55:41,000 do đó, những dòng mã được chính xác như trước đây. 1021 00:55:41,000 --> 00:55:45,000 Sau đó, nếu tôi di chuyển xuống đây tôi in tất cả mọi người là trong Mather tùy tiện như trước đây, 1022 00:55:45,000 --> 00:55:47,000 nhưng đây là một tính năng mới thú vị. 1023 00:55:47,000 --> 00:55:51,000 Các dòng mã mới, và họ giới thiệu cái gì ở đây, 1024 00:55:51,000 --> 00:55:55,000 FILE, tất cả các mũ, và nó có * ở đây là tốt. 1025 00:55:55,000 --> 00:55:58,000 Hãy để tôi di chuyển này ở đây, a * ở đây cũng. 1026 00:55:58,000 --> 00:56:00,000 >> Chức năng này chúng tôi đã không nhìn thấy trước, fopen, 1027 00:56:00,000 --> 00:56:03,000 nhưng nó có nghĩa là tập tin mở, do đó, chúng ta hãy lướt qua những, 1028 00:56:03,000 --> 00:56:05,000 và điều này là một cái gì đó chúng tôi sẽ trở lại trong psets trong tương lai, 1029 00:56:05,000 --> 00:56:10,000 nhưng dòng này ở đây về cơ bản sẽ mở ra một tập tin cơ sở dữ liệu, 1030 00:56:10,000 --> 00:56:13,000 và nó cụ thể mở nó trong một cách mà nó có thể làm những gì với nó? 1031 00:56:13,000 --> 00:56:15,000 [Không nghe được học sinh] 1032 00:56:15,000 --> 00:56:19,000 Đúng, vì vậy "w" chỉ có nghĩa là nó nói với hệ điều hành 1033 00:56:19,000 --> 00:56:21,000 mở tập tin này trong một cách mà tôi có thể viết thư cho nó. 1034 00:56:21,000 --> 00:56:23,000 Tôi không muốn đọc nó. Tôi không muốn chỉ cần nhìn vào nó. 1035 00:56:23,000 --> 00:56:26,000 Tôi muốn thay đổi nó và thêm công cụ có khả năng cho nó, 1036 00:56:26,000 --> 00:56:28,000 và các tập tin sẽ được gọi là cơ sở dữ liệu. 1037 00:56:28,000 --> 00:56:30,000 Điều này có thể được gọi là bất cứ điều gì. 1038 00:56:30,000 --> 00:56:32,000 Điều này có thể database.txt. Điều này có thể là db. 1039 00:56:32,000 --> 00:56:37,000 Điều này có thể là một từ như foo, nhưng tôi tự ý chọn để đặt tên cho tập tin cơ sở dữ liệu. 1040 00:56:37,000 --> 00:56:42,000 Đây là một kiểm tra sanity ít rằng chúng tôi sẽ trở lại rất chi tiết theo thời gian, 1041 00:56:42,000 --> 00:56:47,000 nếu fp, cho con trỏ tập tin, không bằng NULL có nghĩa là tất cả là tốt. 1042 00:56:47,000 --> 00:56:51,000 >> Long câu chuyện ngắn, các chức năng như fopen đôi khi thất bại. 1043 00:56:51,000 --> 00:56:53,000 Có lẽ các tập tin không tồn tại. Có lẽ bạn đang trên không gian đĩa. 1044 00:56:53,000 --> 00:56:55,000 Có lẽ bạn không có sự cho phép vào thư mục đó, 1045 00:56:55,000 --> 00:56:58,000 vì vậy nếu fopen trả về một cái gì đó vô giá trị xấu xảy ra. 1046 00:56:58,000 --> 00:57:02,000 Ngược lại, nếu fopen không trả lại null tất cả là tốt 1047 00:57:02,000 --> 00:57:04,000 và tôi có thể bắt đầu bằng văn bản cho tập tin này. 1048 00:57:04,000 --> 00:57:06,000 Đây là một thủ thuật mới. 1049 00:57:06,000 --> 00:57:08,000 Đây là một vòng lặp cho iterating trên mỗi sinh viên của tôi, 1050 00:57:08,000 --> 00:57:10,000 và điều này có vẻ rất giống với những gì chúng tôi đã làm trước đó, 1051 00:57:10,000 --> 00:57:15,000 nhưng chức năng này là một người anh em họ của printf gọi là fprintf cho tập tin printf, 1052 00:57:15,000 --> 00:57:18,000 và nhận thấy nó khác nhau chỉ trong 2 cách. 1053 00:57:18,000 --> 00:57:20,000 Một, nó bắt đầu với f thay vì của p, 1054 00:57:20,000 --> 00:57:23,000 nhưng sau đó số đầu tiên của nó là rõ ràng những gì? 1055 00:57:23,000 --> 00:57:25,000 [Sinh viên] File. Đó là một tập tin. 1056 00:57:25,000 --> 00:57:30,000 Điều này được gọi là fp, mà cuối cùng chúng ta sẽ tách một con trỏ tập tin là những gì, 1057 00:57:30,000 --> 00:57:35,000 nhưng bây giờ fp chỉ đơn giản là đại diện cho các tập tin mà tôi đã mở, 1058 00:57:35,000 --> 00:57:41,000 fprintf đây nói in ID của người dùng này vào tập tin, không phải màn hình. 1059 00:57:41,000 --> 00:57:44,000 In tên của người dùng vào tập tin, không màn hình, 1060 00:57:44,000 --> 00:57:47,000 nhà cho các tập tin, không màn hình, và sau đó xuống đây, rõ ràng, 1061 00:57:47,000 --> 00:57:50,000 đóng tập tin, và sau đó xuống ở đây miễn phí bộ nhớ. 1062 00:57:50,000 --> 00:57:53,000 >> Sự khác biệt duy nhất giữa 2 phiên bản này và phiên bản 1 1063 00:57:53,000 --> 00:57:58,000 là sự ra đời của fopen và FILE này với * 1064 00:57:58,000 --> 00:58:01,000 và khái niệm này fprintf, do đó, chúng ta hãy xem kết quả cuối cùng là những gì. 1065 00:58:01,000 --> 00:58:03,000 Hãy để tôi đi vào cửa sổ thiết bị đầu cuối của tôi. 1066 00:58:03,000 --> 00:58:06,000 Hãy để tôi chạy structs2, nhập. 1067 00:58:06,000 --> 00:58:09,000 Hình như tất cả là tốt. Hãy chạy lại structs2. 1068 00:58:09,000 --> 00:58:15,000 123, David Mather, 456, Rob Kirkland, 1069 00:58:15,000 --> 00:58:19,000 789, Tommy Mather, nhập vào. 1070 00:58:19,000 --> 00:58:23,000 Hình như nó cư xử như nhau, nhưng nếu tôi làm ls 1071 00:58:23,000 --> 00:58:28,000 nhận thấy tập tin là trong số tất cả các mã của tôi, cơ sở dữ liệu, 1072 00:58:28,000 --> 00:58:32,000 do đó, chúng ta hãy mở rằng, gedit cơ sở dữ liệu, và nhìn vào lúc đó. 1073 00:58:32,000 --> 00:58:34,000 Đây không phải là gợi cảm nhất của các định dạng tập tin. 1074 00:58:34,000 --> 00:58:38,000 Nó thực sự là một phần của dòng dữ liệu trên mỗi dòng mỗi dòng, 1075 00:58:38,000 --> 00:58:42,000 nhưng những người bạn của những người sử dụng Excel hoặc CSV file, giá trị cách nhau bằng dấu phẩy, 1076 00:58:42,000 --> 00:58:47,000 Tôi chắc chắn có thể đã sử dụng fprintf để thay vào đó có thể làm một cái gì đó như thế này 1077 00:58:47,000 --> 00:58:50,000 vì vậy mà tôi thực sự có thể tạo ra tương đương với một tập tin Excel 1078 00:58:50,000 --> 00:58:53,000 bằng cách tách biệt bằng dấu phẩy, không chỉ mới dòng. 1079 00:58:53,000 --> 00:58:56,000 >> Trong trường hợp này nếu tôi thay vì sử dụng dấu phẩy thay vì dòng mới 1080 00:58:56,000 --> 00:59:01,000 Tôi thật sự có thể mở tập tin cơ sở dữ liệu trong Excel nếu tôi thay vì làm cho nó trông như thế này. 1081 00:59:01,000 --> 00:59:03,000 Trong ngắn hạn, bây giờ chúng ta có sức mạnh để viết các tập tin 1082 00:59:03,000 --> 00:59:07,000 bây giờ chúng ta có thể bắt đầu dữ liệu bền bỉ, giữ nó trên đĩa 1083 00:59:07,000 --> 00:59:10,000 để chúng tôi có thể giữ thông tin xung quanh một lần nữa và một lần nữa. 1084 00:59:10,000 --> 00:59:14,000 Chú ý một vài thứ khác mà bây giờ một chút quen thuộc hơn. 1085 00:59:14,000 --> 00:59:16,000 Ở phía trên của tập tin này C, chúng tôi có một typedef 1086 00:59:16,000 --> 00:59:21,000 bởi vì chúng tôi muốn tạo ra một kiểu dữ liệu đại diện cho một từ, 1087 00:59:21,000 --> 00:59:25,000 do đó, loại này được gọi là từ, và bên trong của cấu trúc này 1088 00:59:25,000 --> 00:59:27,000 đó là một chút fancier. 1089 00:59:27,000 --> 00:59:30,000 Tại sao là một từ của mảng rõ ràng? 1090 00:59:30,000 --> 00:59:33,000 Một từ chỉ trực giác là gì? 1091 00:59:33,000 --> 00:59:35,000 >> Đây là một mảng các ký tự. 1092 00:59:35,000 --> 00:59:37,000 Đó là một chuỗi các ký tự trở lại trở lại trở lại. 1093 00:59:37,000 --> 00:59:41,000 Thư trong tất cả các mũ sẽ xảy ra là chúng tôi tự ý nói chiều dài tối đa 1094 00:59:41,000 --> 00:59:44,000 bất kỳ từ nào trong từ điển mà chúng tôi đang sử dụng cho Scramble. 1095 00:59:44,000 --> 00:59:46,000 Tại sao tôi có một 1? 1096 00:59:46,000 --> 00:59:48,000 Các ký tự null. 1097 00:59:48,000 --> 00:59:51,000 Nhớ lại khi chúng tôi đã làm ví dụ Bananagrams chúng tôi cần một giá trị đặc biệt 1098 00:59:51,000 --> 00:59:55,000 ở cuối từ để theo dõi 1099 00:59:55,000 --> 00:59:59,000 mà những từ thực sự kết thúc, và như vấn đề thiết lập các đặc điểm kỹ thuật nói 1100 00:59:59,000 --> 01:00:03,000 ở đây chúng tôi đang liên kết với một từ cho trước một giá trị boolean, 1101 01:00:03,000 --> 01:00:05,000 một lá cờ, vậy để nói chuyện, đúng hay sai. 1102 01:00:05,000 --> 01:00:09,000 Bạn đã tìm thấy từ này rồi, vì chúng ta nhận ra 1103 01:00:09,000 --> 01:00:13,000 chúng tôi thực sự cần một cách ghi nhớ không chỉ những gì một từ trong Scramble 1104 01:00:13,000 --> 01:00:15,000 nhưng có hay không bạn, con người đã tìm thấy nó 1105 01:00:15,000 --> 01:00:20,000 do đó nếu bạn không tìm thấy từ "" bạn có thể không chỉ cần gõ, nhập, nhập vào,, nhập 1106 01:00:20,000 --> 01:00:23,000 và nhận được 3 điểm, 3 điểm, 3 điểm, 3 điểm. 1107 01:00:23,000 --> 01:00:26,000 Chúng tôi muốn để có thể vào danh sách đen từ đó bằng cách thiết lập một bool 1108 01:00:26,000 --> 01:00:29,000 đúng nếu bạn đã tìm thấy nó, và vì vậy đó là lý do tại sao chúng tôi 1109 01:00:29,000 --> 01:00:31,000 đóng gói nó trong cấu trúc này. 1110 01:00:31,000 --> 01:00:35,000 >> Bây giờ, xuống đây Scramble này struct khác được gọi là từ điển. 1111 01:00:35,000 --> 01:00:39,000 Vắng mặt ở đây là từ typedef bởi vì trong trường hợp này 1112 01:00:39,000 --> 01:00:43,000 chúng tôi cần để đóng gói các ý tưởng của một từ điển, 1113 01:00:43,000 --> 01:00:46,000 và một từ điển chứa một bó toàn bộ từ, 1114 01:00:46,000 --> 01:00:49,000 như ngụ ý của mảng này, và bao nhiêu của những từ nào? 1115 01:00:49,000 --> 01:00:51,000 Vâng, kích thước biến này được gọi là bất cứ điều gì. 1116 01:00:51,000 --> 01:00:53,000 Nhưng chúng ta chỉ cần một từ điển. 1117 01:00:53,000 --> 01:00:55,000 Chúng ta không cần một kiểu dữ liệu được gọi là từ điển. 1118 01:00:55,000 --> 01:00:58,000 Chúng tôi chỉ cần một trong số họ, do đó, nó quay ra trong C 1119 01:00:58,000 --> 01:01:03,000 rằng nếu bạn không nói typedef, bạn chỉ cần nói struct, sau đó bên trong các dấu ngoặc nhọn 1120 01:01:03,000 --> 01:01:05,000 bạn đặt biến của bạn, sau đó bạn đặt tên. 1121 01:01:05,000 --> 01:01:09,000 Này được tuyên bố một biến từ điển được gọi là 1122 01:01:09,000 --> 01:01:11,000 trông như thế này. 1123 01:01:11,000 --> 01:01:16,000 Ngược lại, những dòng này được tạo ra từ một cấu trúc dữ liệu có thể tái sử dụng được gọi là 1124 01:01:16,000 --> 01:01:19,000 bạn có thể tạo nhiều bản sao của, giống như chúng ta đã tạo ra 1125 01:01:19,000 --> 01:01:22,000 nhiều bản sao của các học sinh. 1126 01:01:22,000 --> 01:01:24,000 >> Điều này không gì cuối cùng cho phép chúng ta làm? 1127 01:01:24,000 --> 01:01:30,000 Hãy để tôi đi trở lại, hãy nói, một ví dụ đơn giản từ thời đơn giản, 1128 01:01:30,000 --> 01:01:34,000 và cho tôi mở ra, hãy nói, compare1.c. 1129 01:01:34,000 --> 01:01:38,000 Vấn đề ở đây ở bàn tay là để thực sự vỏ trở lại 1130 01:01:38,000 --> 01:01:41,000 lớp một chuỗi và bắt đầu dùng những bánh xe đào tạo 1131 01:01:41,000 --> 01:01:44,000 bởi vì nó chỉ ra rằng một chuỗi thời gian này 1132 01:01:44,000 --> 01:01:47,000 như chúng tôi đã hứa trong 1 tuần thực sự chỉ là một biệt danh, 1133 01:01:47,000 --> 01:01:51,000 một từ đồng nghĩa từ thư viện CS50 cho một cái gì đó có vẻ nhiều hơn một chút khó hiểu, 1134 01:01:51,000 --> 01:01:53,000 char *, và chúng tôi đã nhìn thấy ngôi sao này trước khi. 1135 01:01:53,000 --> 01:01:55,000 Chúng tôi nhìn thấy nó trong bối cảnh của các tập tin. 1136 01:01:55,000 --> 01:01:59,000 >> Bây giờ chúng ta hãy xem lý do tại sao chúng tôi đã ẩn chi tiết này một thời gian. 1137 01:01:59,000 --> 01:02:02,000 Đây là một tập tin gọi compare1.c, 1138 01:02:02,000 --> 01:02:07,000 và nó dường như yêu cầu người dùng cho 2 dây, s và t, 1139 01:02:07,000 --> 01:02:11,000 và sau đó nó sẽ cố gắng để so sánh những chuỗi bình đẳng trong line 26, 1140 01:02:11,000 --> 01:02:14,000 và nếu chúng bằng nó nói, "Bạn gõ cùng một điều," 1141 01:02:14,000 --> 01:02:17,000 và nếu họ không bằng nó nói, "Bạn gõ những thứ khác nhau." 1142 01:02:17,000 --> 01:02:19,000 Hãy để tôi đi trước và chạy chương trình này. 1143 01:02:19,000 --> 01:02:23,000 Hãy để tôi đi vào thư mục mã nguồn của tôi, làm cho một compare1. Nó được biên dịch okay. 1144 01:02:23,000 --> 01:02:25,000 Hãy để tôi chạy compare1. 1145 01:02:25,000 --> 01:02:27,000 Tôi sẽ phóng to, nhập. 1146 01:02:27,000 --> 01:02:29,000 Nói điều gì đó. HELLO. 1147 01:02:29,000 --> 01:02:32,000 Tôi sẽ nói điều gì đó một lần nữa. HELLO. 1148 01:02:32,000 --> 01:02:34,000 Tôi chắc chắn không gõ những thứ khác nhau. 1149 01:02:34,000 --> 01:02:37,000 >> Hãy để tôi thử này một lần nữa. BYE BYE. 1150 01:02:37,000 --> 01:02:40,000 Chắc chắn không phải khác nhau, do đó, những gì đang xảy ra ở đây? 1151 01:02:40,000 --> 01:02:44,000 Vâng, những gì là thực sự đang được so sánh trong line 26? 1152 01:02:44,000 --> 01:02:46,000 [Không nghe được học sinh] 1153 01:02:46,000 --> 01:02:49,000 Có, do đó nó chỉ ra rằng một chuỗi, kiểu dữ liệu, là một lời nói dối trắng. 1154 01:02:49,000 --> 01:02:53,000 Một chuỗi là một char *, nhưng một char * là những gì? 1155 01:02:53,000 --> 01:02:56,000 A * char, như họ nói, là một con trỏ, 1156 01:02:56,000 --> 01:03:00,000 và một con trỏ là có hiệu quả một địa chỉ, 1157 01:03:00,000 --> 01:03:05,000 một vị trí tổng hợp trong bộ nhớ, và nếu bạn xảy ra đã gõ vào một từ như Hello, 1158 01:03:05,000 --> 01:03:08,000 nhớ lại từ các cuộc thảo luận qua các chuỗi 1159 01:03:08,000 --> 01:03:16,000 điều này giống như từ HELLO. 1160 01:03:16,000 --> 01:03:19,000 Hãy nhớ rằng một từ như Hello có thể được đại diện 1161 01:03:19,000 --> 01:03:22,000 như là một mảng của các nhân vật như thế này 1162 01:03:22,000 --> 01:03:25,000 và sau đó với một nhân vật đặc biệt ở cuối được gọi là các ký tự null, 1163 01:03:25,000 --> 01:03:27,000 như là \. 1164 01:03:27,000 --> 01:03:29,000 Điều gì thực sự là một chuỗi? 1165 01:03:29,000 --> 01:03:32,000 Chú ý rằng điều này là nhiều khối của bộ nhớ, 1166 01:03:32,000 --> 01:03:36,000 và trong thực tế, kết thúc của nó chỉ được biết đến khi bạn xem xét thông qua toàn bộ chuỗi 1167 01:03:36,000 --> 01:03:38,000 tìm kiếm các ký tự null đặc biệt. 1168 01:03:38,000 --> 01:03:41,000 Nhưng nếu điều này là một đoạn bộ nhớ từ bộ nhớ của máy tính của tôi, 1169 01:03:41,000 --> 01:03:44,000 chúng ta hãy tự ý nói rằng chuỗi này chỉ có may mắn, 1170 01:03:44,000 --> 01:03:47,000 và nó đã được đặt ở đầu của bộ nhớ RAM của máy tính của tôi. 1171 01:03:47,000 --> 01:03:54,000 Đây là 0 byte, 1, 2, 3, 4, 5, 6 ... 1172 01:03:54,000 --> 01:04:02,000 >> Khi tôi nói điều gì đó như GetString và tôi làm string s = GetString 1173 01:04:02,000 --> 01:04:04,000 những gì thực sự được quay trở lại? 1174 01:04:04,000 --> 01:04:08,000 Đối với những tuần lễ vừa qua, những gì đang thực sự được lưu trữ trong s 1175 01:04:08,000 --> 01:04:13,000 không phải là chuỗi này mỗi se, nhưng trong trường hợp này những gì đang được lưu trữ 1176 01:04:13,000 --> 01:04:18,000 số 0 bởi vì những gì GetString thực hiện 1177 01:04:18,000 --> 01:04:20,000 là nó không thể chất trả về một chuỗi. 1178 01:04:20,000 --> 01:04:22,000 Mà thậm chí không thực sự có ý nghĩa khái niệm. 1179 01:04:22,000 --> 01:04:24,000 Những gì nó trả về là một số. 1180 01:04:24,000 --> 01:04:28,000 Con số này là địa chỉ của Hello trong bộ nhớ, 1181 01:04:28,000 --> 01:04:32,000 string s sau đó, nếu chúng ta vỏ trở lại lớp này, chuỗi không thực sự tồn tại. 1182 01:04:32,000 --> 01:04:35,000 Nó chỉ là một đơn giản hóa trong thư viện CS50. 1183 01:04:35,000 --> 01:04:38,000 >> Điều này thực sự là một cái gì đó gọi là char *. 1184 01:04:38,000 --> 01:04:41,000 Char có ý nghĩa bởi vì một từ là những gì, như Hello? 1185 01:04:41,000 --> 01:04:44,000 Vâng, đó là một loạt các ký tự, một loạt các ký tự. 1186 01:04:44,000 --> 01:04:47,000 Char * có nghĩa là địa chỉ của một nhân vật, 1187 01:04:47,000 --> 01:04:50,000 do đó, nó trả về một chuỗi có ý nghĩa gì? 1188 01:04:50,000 --> 01:04:53,000 Một cách đơn giản, đẹp trả lại một chuỗi 1189 01:04:53,000 --> 01:04:57,000 chứ không phải là cố gắng tìm ra làm thế nào tôi trở về 5 hoặc 6 byte khác nhau 1190 01:04:57,000 --> 01:05:01,000 hãy để tôi quay trở lại địa chỉ trong đó byte? 1191 01:05:01,000 --> 01:05:03,000 Người đầu tiên. 1192 01:05:03,000 --> 01:05:06,000 Nói cách khác, hãy để tôi cung cấp cho bạn địa chỉ của một nhân vật trong bộ nhớ. 1193 01:05:06,000 --> 01:05:10,000 Đó là những gì char * đại diện cho địa chỉ của một nhân vật duy nhất trong bộ nhớ. 1194 01:05:10,000 --> 01:05:12,000 Gọi đó là biến s. 1195 01:05:12,000 --> 01:05:15,000 Cửa hàng ở địa chỉ cụ thể, mà tôi tự ý nói là 0, 1196 01:05:15,000 --> 01:05:19,000 chỉ để giữ cho mọi thứ đơn giản, nhưng trong thực tế nó thường là một số lớn hơn. 1197 01:05:19,000 --> 01:05:21,000 >> Chờ một phút. 1198 01:05:21,000 --> 01:05:23,000 Nếu bạn chỉ cho tôi địa chỉ của ký tự đầu tiên, làm thế nào để tôi biết những gì địa chỉ 1199 01:05:23,000 --> 01:05:25,000 của nhân vật thứ hai, thứ ba, thứ tư và thứ năm? 1200 01:05:25,000 --> 01:05:27,000 [Không nghe được học sinh] 1201 01:05:27,000 --> 01:05:31,000 Bạn chỉ biết nơi kết thúc của chuỗi là bằng cách lừa này tiện dụng, 1202 01:05:31,000 --> 01:05:35,000 vì vậy khi bạn sử dụng một cái gì đó giống như printf printf nghĩa là mất như là đối số của nó, 1203 01:05:35,000 --> 01:05:39,000 nhớ lại rằng chúng tôi sử dụng giữ chỗ này% s, và sau đó bạn vượt qua trong 1204 01:05:39,000 --> 01:05:41,000 biến lưu trữ một chuỗi. 1205 01:05:41,000 --> 01:05:47,000 Những gì bạn đang thực sự đi qua là địa chỉ của ký tự đầu tiên của chuỗi đó. 1206 01:05:47,000 --> 01:05:50,000 Printf sau đó sử dụng một vòng lặp hoặc một vòng lặp trong khi khi nhận được địa chỉ đó, 1207 01:05:50,000 --> 01:05:53,000 ví dụ, 0, do đó, hãy để tôi làm điều này ngay bây giờ, 1208 01:05:53,000 --> 01:06:02,000 printf ("% s \ n", s); 1209 01:06:02,000 --> 01:06:07,000 Khi tôi gọi printf ("% s \ n", s); những gì tôi đang thực sự cung cấp printf với 1210 01:06:07,000 --> 01:06:13,000 là địa chỉ của ký tự đầu tiên trong s, mà trong trường hợp này tùy ý là H. 1211 01:06:13,000 --> 01:06:16,000 >> Làm thế nào để printf biết chính xác những gì hiển thị trên màn hình? 1212 01:06:16,000 --> 01:06:19,000 Người thực hiện printf thực hiện một vòng lặp trong khi một vòng lặp for 1213 01:06:19,000 --> 01:06:23,000 nói rằng nhân vật này bằng các ký tự null đặc biệt? 1214 01:06:23,000 --> 01:06:25,000 Nếu không, in nó. Làm thế nào về một trong những điều này? 1215 01:06:25,000 --> 01:06:28,000 Nếu không in, in, in ấn, in nó. 1216 01:06:28,000 --> 01:06:32,000 Ồ, cái này là đặc biệt. Ngừng in ấn và trả lại cho người sử dụng. 1217 01:06:32,000 --> 01:06:35,000 Và đó là nghĩa là tất cả những gì đang xảy ra bên dưới mui xe, 1218 01:06:35,000 --> 01:06:38,000 và đó là rất nhiều để tiêu hóa trong ngày đầu tiên của một lớp, 1219 01:06:38,000 --> 01:06:43,000 nhưng bây giờ nó thực sự là khối xây dựng sự hiểu biết tất cả mọi thứ 1220 01:06:43,000 --> 01:06:46,000 đã xảy ra bên trong bộ nhớ máy tính của chúng tôi, 1221 01:06:46,000 --> 01:06:49,000 và cuối cùng chúng tôi sẽ trêu chọc này ngoài với một chút giúp đỡ 1222 01:06:49,000 --> 01:06:51,000 từ một trong những bạn bè của chúng tôi tại Stanford. 1223 01:06:51,000 --> 01:06:56,000 >> Giáo sư Nick Parlante tại Stanford đã làm điều này chuỗi video tuyệt vời 1224 01:06:56,000 --> 01:06:58,000 từ tất cả các loại ngôn ngữ khác nhau mà giới thiệu 1225 01:06:58,000 --> 01:07:00,000 Binky nhân vật này Claymation ít. 1226 01:07:00,000 --> 01:07:03,000 Giọng nói bạn đang về để nghe chỉ trong một sneak xem trước vài thứ hai 1227 01:07:03,000 --> 01:07:05,000 là của một giáo sư Đại học Stanford, và bạn đang nhận được 1228 01:07:05,000 --> 01:07:07,000 chỉ có 5 hoặc 6 giây của quyền này bây giờ, 1229 01:07:07,000 --> 01:07:09,000 nhưng đây là lưu ý mà chúng ta sẽ kết thúc ngày hôm nay 1230 01:07:09,000 --> 01:07:11,000 và bắt đầu vào thứ tư. 1231 01:07:11,000 --> 01:07:15,000 Tôi cung cấp cho bạn Fun Pointer với Binky, xem trước. 1232 01:07:15,000 --> 01:07:18,000 [♪ Âm nhạc ♪] [Giáo sư Parlante] Hey, Binky. 1233 01:07:18,000 --> 01:07:21,000 Thức dậy. Đó là thời gian cho vui con trỏ. 1234 01:07:21,000 --> 01:07:24,000 [Binky] đó là gì? Tìm hiểu về con trỏ? 1235 01:07:24,000 --> 01:07:26,000 Oh, goody! 1236 01:07:26,000 --> 01:07:29,000 >> Chúng ta sẽ thấy bạn hôm thứ Tư. 1237 01:07:29,000 --> 01:07:32,000 [CS50.TV]