1 00:00:00,000 --> 00:00:02,670 [Powered by Google Translate] Mục Vấn đề Set 2: Edition Hacker 2 00:00:02,670 --> 00:00:04,910 Rob Bowden, Đại học Harvard 3 00:00:04,910 --> 00:00:07,410 Đây là CS50. CS50.TV 4 00:00:07,410 --> 00:00:15,770 Vì vậy, tôi là Rob. Tôi là một cấp cao trong Kirkland. Đây là năm thứ ba của tôi TFing CS50. 5 00:00:15,770 --> 00:00:22,220 Đây là lần đầu tiên mà chúng tôi đang thay đổi từ phần bài giảng theo phong cách truyền thống, 6 00:00:22,220 --> 00:00:25,610 nơi mà chúng tôi chỉ xem xét những gì đã xảy ra trong bài giảng và sau đó bạn đặt câu hỏi, 7 00:00:25,610 --> 00:00:32,250 ngay bây giờ để được rất nhiều dựa trên vấn đề, chúng tôi sử dụng không gian, và - 8 00:00:32,250 --> 00:00:37,410 Oh, do đó, ý tưởng là để đi đến liên kết tôi đã gửi cho bạn và sau đó bạn sẽ có trong không gian của tôi. 9 00:00:37,410 --> 00:00:42,410 Có ai không có một máy tính xách tay? Okay. 10 00:00:42,410 --> 00:00:47,050 Vì vậy, chúng ta sẽ được sử dụng điều này, và chúng ta sẽ được thực hiện vấn đề sống trong phần 11 00:00:47,050 --> 00:00:50,740 và thảo luận và tìm ra những gì sai 12 00:00:50,740 --> 00:00:56,390 và tôi có thể kéo lên một số mã của bạn, và tôi có thể thảo luận về các ý tưởng của bạn. 13 00:00:56,390 --> 00:01:02,140 Vì vậy, có ai gặp khó khăn? 14 00:01:02,140 --> 00:01:07,000 Bạn có thể trò chuyện ở bên cạnh, tôi không biết nếu chúng ta sẽ có lý do cho điều đó. 15 00:01:07,000 --> 00:01:12,270 Bây giờ, như supersection trước, nếu bạn đang ở lớp đó, bạn biết đó là về. 16 00:01:12,270 --> 00:01:19,200 Trên tất cả các bộ P có được những phần này. 17 00:01:19,200 --> 00:01:22,550 Vì vậy, P-set 2, chi tiết kỹ thuật, tôi đoán bạn nhìn thấy nó trên P-set 1 đã. 18 00:01:22,550 --> 00:01:27,400 Nhưng chúng ta có thể nhìn vào P-set 2 cho những gì chúng ta sẽ đi qua ngày hôm nay. 19 00:01:27,400 --> 00:01:29,460 Và bạn sẽ thấy một phần của câu hỏi. 20 00:01:29,460 --> 00:01:37,530 Vì vậy, đây sẽ là trong tất cả các P-bộ, sẽ có một phần của câu hỏi. 21 00:01:37,530 --> 00:01:41,340 Vì vậy, đến nay chúng tôi đã nói, "Hãy xem xét điều này một cơ hội để thực hành." 22 00:01:41,340 --> 00:01:44,940 Bạn sẽ không được yêu cầu nộp chương trình này. 23 00:01:44,940 --> 00:01:48,480 Ý tưởng là những có nghĩa vụ phải loại giúp bạn bắt đầu với bộ vấn đề. 24 00:01:48,480 --> 00:01:53,220 Tôi đoán trên phiên bản Hacker, rất nhiều trong số họ có nghĩa vụ phải chỉ là mới, những điều thú vị để tìm hiểu. 25 00:01:53,220 --> 00:01:58,590 Họ có thể không được trực tiếp áp dụng đối với các thiết lập vấn đề. 26 00:01:58,590 --> 00:02:01,810 Và ngay bây giờ chúng ta không có bạn gửi cho họ, nhưng trong lý thuyết, 27 00:02:01,810 --> 00:02:07,480 cho bộ vấn đề sau, bạn có thể trình, và do đó bạn có thể đến phần 28 00:02:07,480 --> 00:02:10,380 hoặc xem các phần để có được câu trả lời, hoặc bạn chỉ có thể nhận được chúng trên của riêng bạn 29 00:02:10,380 --> 00:02:16,350 nếu bạn không cảm thấy như thưởng thức sự hiện diện của tôi. 30 00:02:16,350 --> 00:02:21,010 Vì vậy, tôi nghĩ rằng đây là một trong những người đầu tiên. 31 00:02:21,010 --> 00:02:29,280 Oh. Ngoài ra, theo các phần câu hỏi, chúng tôi cũng đã đặt câu hỏi về quần short. 32 00:02:29,280 --> 00:02:33,440 Vì vậy, tôi đoán, trong lý thuyết, bạn đang nghĩ xem những trước khi đến phần, 33 00:02:33,440 --> 00:02:38,550 nhưng đó là tiền phạt nếu bạn không, chúng ta sẽ đi qua chúng anyway. 34 00:02:38,550 --> 00:02:42,590 Vì vậy, chúng ta có thể bắt đầu với những: "Làm thế nào để một vòng lặp trong khi khác nhau từ một vòng lặp do-trong khi? 35 00:02:42,590 --> 00:02:46,210 Khi là sau này đặc biệt hữu ích? " 36 00:02:46,210 --> 00:02:49,390 Vì vậy, bất cứ ai có bất kỳ? 37 00:02:49,390 --> 00:02:52,730 [Sinh viên] do-trong khi vòng lặp sẽ luôn luôn thực hiện ít nhất một lần. 38 00:02:52,730 --> 00:03:02,950 Vâng. Vì vậy, đó là sự khác biệt. Một trong khi vòng lặp - sẽ chỉ làm điều đó ở đây - trong khi vòng lặp, chúng ta có điều kiện 39 00:03:02,950 --> 00:03:19,760 ngay tại đây, trong khi một do-trong khi, bạn không có điều kiện cho đến khi chúng tôi xuống đây. 40 00:03:19,760 --> 00:03:24,130 Và như vậy, khi chương trình của bạn đang thực hiện, và nó được đến vòng lặp trong khi, 41 00:03:24,130 --> 00:03:26,380 nó ngay lập tức kiểm tra nếu tình trạng này là đúng sự thật. 42 00:03:26,380 --> 00:03:30,710 Nếu tình trạng đó là không đúng, nó sẽ chỉ bỏ qua các vòng lặp hoàn toàn. 43 00:03:30,710 --> 00:03:34,390 Do-trong khi vòng lặp, như các chương trình được thực hiện, nó được cho là "làm". 44 00:03:34,390 --> 00:03:37,920 Không có gì xảy ra vào thời điểm này, chỉ cần tiếp tục thực hiện. 45 00:03:37,920 --> 00:03:42,690 Sau đó, khi nó cập "trong khi," nếu điều kiện là đúng, vòng lặp sẽ trở lại và làm điều đó một lần nữa 46 00:03:42,690 --> 00:03:46,730 và một lần nữa và một lần nữa cho đến khi điều kiện là không đúng sự thật và sau đó chỉ cần rơi xuống. 47 00:03:46,730 --> 00:03:50,600 Vì vậy, sự khác biệt là, rằng điều này có thể bỏ qua ngay từ khi bắt đầu. 48 00:03:50,600 --> 00:03:56,770 Điều này nhất thiết phải thực hiện một lần và sau đó có thể thực hiện nhiều lần hơn nếu tình trạng này vẫn là sự thật. 49 00:03:56,770 --> 00:04:03,720 Vì vậy, vòng lặp while sẽ chỉ làm điều đó một lần, hoặc vòng lặp trong khi chúng ta có thể không cần phải làm điều đó cả, 50 00:04:03,720 --> 00:04:07,900 kể từ ngay khi chúng tôi nhận được để nó, nếu điều kiện là sai, chúng tôi sẽ chỉ nhảy qua nó. 51 00:04:07,900 --> 00:04:11,770 Trong khi đó, làm trong khi vòng lặp, chúng tôi sẽ thực hiện nó một lần, nhất thiết phải. 52 00:04:11,770 --> 00:04:14,560 Sau đó, khi chúng tôi nhận được tình trạng này, chúng tôi kiểm tra nếu nó là đúng hay sai. 53 00:04:14,560 --> 00:04:19,790 Nếu đó là sự thật, chúng tôi sẽ làm điều đó một lần nữa, nếu nó sai, chúng ta sẽ tiếp tục. 54 00:04:19,790 --> 00:04:24,680 Vì vậy, khi sau này đặc biệt hữu ích? 55 00:04:24,680 --> 00:04:31,190 Vì vậy, tôi có thể nói rằng trong toàn bộ 4 năm, 3 năm, bất cứ điều gì, 56 00:04:31,190 --> 00:04:38,780 mà tôi đã được lập trình, tôi đã sử dụng điều này, như thế, dưới 10 lần. 57 00:04:38,780 --> 00:04:43,140 Và có lẽ 5 người họ trong CS50 khi chúng tôi giới thiệu làm trong khi các vòng. 58 00:04:43,140 --> 00:04:47,510 Vì vậy, khi bạn đã sử dụng làm trong khi các vòng? 59 00:04:47,510 --> 00:04:49,510 Khi nào là yeah? 60 00:04:49,510 --> 00:04:53,180 [Sinh viên] Khi bạn đang cố gắng để có được đầu vào của người dùng, hoặc một cái gì đó bạn muốn kiểm tra - 61 00:04:53,180 --> 00:04:59,700 Yeah. Vì vậy, trong khi các vòng, người sử dụng đầu vào là lớn. 62 00:04:59,700 --> 00:05:03,160 Đó là lý do tại sao các bộ vấn đề đầu tiên, khi bạn muốn yêu cầu người dùng, như, 63 00:05:03,160 --> 00:05:08,520 "Cho tôi một chuỗi," bạn không thể tiếp tục cho đến khi bạn nhận được rằng chuỗi. 64 00:05:08,520 --> 00:05:12,980 Và như vậy bạn nhất thiết, cần phải hỏi cho chuỗi ít nhất một lần. 65 00:05:12,980 --> 00:05:16,950 Nhưng sau đó nếu họ trả lời cái gì xấu, sau đó bạn cần phải lặp lại và hỏi lại lần nữa. 66 00:05:16,950 --> 00:05:20,810 Nhưng khác với người dùng nhập vào, nó rất hiếm hoi mà tôi gặp phải một trường hợp 67 00:05:20,810 --> 00:05:27,170 nơi mà tôi muốn để lặp "ít nhất một lần", nhưng có thể nhiều hơn. 68 00:05:27,170 --> 00:05:33,370 Câu hỏi hay - Có ai sử dụng một do-trong khi vòng lặp bất cứ nơi nào khác? 69 00:05:33,370 --> 00:05:36,780 Okay. Vì vậy, một trong những tiếp theo là, "Cái gì không không khai báo định danh 70 00:05:36,780 --> 00:05:43,310 thường chỉ ra nếu kết quả bằng cách kêu vang? " 71 00:05:43,310 --> 00:05:47,380 Vì vậy, tôi có thể viết loại mã để có được 'định danh không khai báo? 72 00:05:47,380 --> 00:05:49,550 [Sinh viên] Đó là x = 2? 73 00:05:49,550 --> 00:05:52,650 Vì vậy, chúng tôi chỉ có thể thử nó ở đây, x = 2. 74 00:05:52,650 --> 00:06:04,830 Chúng tôi sẽ chạy này - oh, tôi không nhấp vào nó. Vì vậy, ở đây chúng tôi nhận được - tất cả các quyền. 75 00:06:04,830 --> 00:06:07,100 "Sử dụng định danh không khai báo x". 76 00:06:07,100 --> 00:06:11,610 Vì vậy, đó là định danh không khai báo, một biến. 77 00:06:11,610 --> 00:06:13,910 Nó thường xuyên sẽ gọi một định danh một biến. 78 00:06:13,910 --> 00:06:17,300 Vì vậy, nó có thể không biết nó thực sự là một biến, nó không biết nó là gì. 79 00:06:17,300 --> 00:06:19,380 Vì vậy, nó là một định danh. 80 00:06:19,380 --> 00:06:26,060 Vậy tại sao nó không khai báo? Yeah. 81 00:06:26,060 --> 00:06:32,190 Vì vậy, để được rõ ràng về thuật ngữ, việc kê khai của một biến 82 00:06:32,190 --> 00:06:37,360 là khi bạn nói "x int," hoặc "chuỗi y", bất cứ điều gì. 83 00:06:37,360 --> 00:06:41,910 Việc khởi tạo của biến, hoặc phân công của biến, 84 00:06:41,910 --> 00:06:44,510 là bất cứ khi nào bạn nói "x = 2." 85 00:06:44,510 --> 00:06:52,950 Vì vậy, chúng ta có thể làm điều này trong bước riêng biệt, int x, x = 2, và cho đến khi chúng tôi có thể có một loạt các công cụ ở đây - 86 00:06:52,950 --> 00:07:00,350 nhưng cho đến khi dòng này xảy ra, x vẫn chưa được khởi tạo, nhưng nó đã được tuyên bố. 87 00:07:00,350 --> 00:07:06,760 Và vì vậy chúng tôi rõ ràng có thể làm điều đó trong 1 dòng, và bây giờ chúng tôi đang kê khai, khởi tạo. 88 00:07:06,760 --> 00:07:10,730 Câu hỏi? 89 00:07:10,730 --> 00:07:18,390 Và cuối cùng, "Tại sao là yếu Caesar không phải là rất an toàn?" 90 00:07:18,390 --> 00:07:23,830 Vì vậy, trước, không ai muốn nói những gì các yếu Caesar? 91 00:07:23,830 --> 00:07:28,100 [Sinh viên] Caesar Cipher chỉ là bạn có bản đồ, bạn chuyển tất cả thư, 92 00:07:28,100 --> 00:07:34,420 một số lượng nhất định của các chữ cái đi qua, và di chuyển trên, và nó không phải là rất an toàn bởi vì 93 00:07:34,420 --> 00:07:42,260 chỉ có 26 tùy chọn có thể, và bạn chỉ cần có cố gắng mỗi 1 trong những người cho đến khi bạn nhận được nó. 94 00:07:42,260 --> 00:07:45,470 Oh. Vì vậy, tôi cần phải lặp lại? 95 00:07:45,470 --> 00:07:51,600 Cơ yếu Caesar, it's - Ý tôi là, bạn sẽ đối phó với nó về những vấn đề mà bạn 96 00:07:51,600 --> 00:07:56,110 Tôi đoán phiên bản tiêu chuẩn của tập vấn đề đó không phải là trên phiên bản hacker. 97 00:07:56,110 --> 00:08:01,550 Vì vậy, phiên bản tiêu chuẩn để các thiết lập vấn đề, bạn nhận được một tin nhắn như, "thế giới, Xin chào", 98 00:08:01,550 --> 00:08:08,410 và bạn cũng có một số giống như 6, và bạn đưa thông điệp đó, và mỗi nhân vật cá nhân, 99 00:08:08,410 --> 00:08:11,310 bạn xoay nó bởi 6 vị trí trong bảng chữ cái. 100 00:08:11,310 --> 00:08:16,560 Vì vậy, 'h' trong hello sẽ trở thành h-i-j-k-l-m-n. 101 00:08:16,560 --> 00:08:19,600 Vì vậy, các chữ cái đầu tiên sẽ được n. Chúng tôi làm điều tương tự với e. 102 00:08:19,600 --> 00:08:23,530 Nếu chúng ta có một, như, z hoặc một cái gì đó, sau đó chúng tôi quấn lại xung quanh 'một'. 103 00:08:23,530 --> 00:08:29,280 Tuy nhiên, mỗi nhân vật được quay vòng 6 ký tự sau đó trong bảng chữ cái, và nó không phải rất an toàn 104 00:08:29,280 --> 00:08:35,440 kể từ khi có chỉ có 26 khả năng có bao nhiêu cách bạn có thể bọc một lá thư duy nhất. 105 00:08:35,440 --> 00:08:42,919 Vì vậy, bạn chỉ có thể thử tất cả 26 người trong số họ và, có lẽ, cho một tin nhắn đủ dài, 106 00:08:42,919 --> 00:08:46,860 chỉ có 1 trong số những người 26 điều có thể là có được rõ ràng, 107 00:08:46,860 --> 00:08:50,300 và rõ ràng là có được các thông báo ban đầu. 108 00:08:50,300 --> 00:08:56,240 Vì vậy, nó không phải là một cách rất tốt mã hóa bất cứ điều gì ở tất cả. 109 00:08:56,240 --> 00:08:59,070 Không liên quan đến những quần short, "một chức năng là gì?" 110 00:08:59,070 --> 00:09:03,370 Vì vậy, một chức năng là gì? Vâng. 111 00:09:03,370 --> 00:09:11,640 [Sinh viên] Nó giống như một mảnh riêng biệt của mã mà bạn có thể gọi để đi qua và sau đó nhận được giá trị trả lại bất cứ điều gì. 112 00:09:11,640 --> 00:09:18,160 Yeah. Vì vậy, tôi sẽ trả lời bằng cách trả lời tiếp theo hoặc lặp lại bằng cách cũng chỉ trả lời tiếp theo. 113 00:09:18,160 --> 00:09:22,410 Bạn có thể sử dụng chức năng thay vì chỉ cần sao chép và dán mã hơn và hơn một lần nữa. 114 00:09:22,410 --> 00:09:27,200 Chỉ cần lấy mã, đặt nó vào một fuction, và sau đó bạn chỉ có thể gọi hàm 115 00:09:27,200 --> 00:09:29,870 bất cứ nơi nào bạn đã được sao chép và dán. 116 00:09:29,870 --> 00:09:33,350 Vì vậy, chức năng này là hữu ích. 117 00:09:33,350 --> 00:09:35,860 Vì vậy, bây giờ chúng tôi sẽ làm vấn đề thực tế. 118 00:09:35,860 --> 00:09:46,490 Người đầu tiên. Vì vậy, ý tưởng của một trong những đầu tiên là bạn vượt qua nó một chuỗi, và bất kể - 119 00:09:46,490 --> 00:09:52,060 hoặc nó không nói tất cả các chữ thường? Nó không nói tất cả các chữ thường. 120 00:09:52,060 --> 00:09:57,730 Vì vậy, các tin nhắn có thể được bất cứ điều gì, và - oh no. Nó không. 121 00:09:57,730 --> 00:10:01,610 Để đơn giản, bạn có thể giả định rằng người sử dụng sẽ chỉ nhập vào chữ thường và không gian. " 122 00:10:01,610 --> 00:10:08,180 Vì vậy, chúng tôi vượt qua nó một tin nhắn với các chữ thường và sau đó chúng tôi luân phiên 123 00:10:08,180 --> 00:10:15,450 giữa tư bản và chữ thường - chúng tôi thay đổi chuỗi được vốn và chữ thường, xen kẽ. 124 00:10:15,450 --> 00:10:22,920 Vì vậy, trước khi chúng tôi cung cấp cho bạn một thứ hai thậm chí nhảy vào vấn đề, 125 00:10:22,920 --> 00:10:32,420 điều đầu tiên mà chúng ta cần làm là gì? 126 00:10:32,420 --> 00:10:36,900 Ồ, tôi đã làm những gì chỉ cần nhấp vào? Oh, tôi chỉ nhấp vào một email ở đây. 127 00:10:36,900 --> 00:10:42,870 Vì vậy, điều đầu tiên chúng ta cần làm - tôi đang tìm kiếm tại một sai lầm? 128 00:10:42,870 --> 00:10:49,320 Đây có phải là một phần của một trong những điều này? 129 00:10:49,320 --> 00:10:51,320 Không, những người vẫn còn ở trong đó, mặc dù. 130 00:10:51,320 --> 00:10:55,160 Được rồi, vẫn ở đây. 131 00:10:55,160 --> 00:11:03,160 Bây giờ chúng ta không thể giả định -? Vâng. Ở đây chúng ta không thể giả định rằng đó chỉ là chữ thường và không gian. 132 00:11:03,160 --> 00:11:07,770 Vì vậy, bây giờ chúng tôi phải đối phó với thực tế rằng các ký tự có thể được bất cứ điều gì chúng tôi muốn họ được. 133 00:11:07,770 --> 00:11:11,910 Và do đó, điều đầu tiên chúng tôi muốn làm là chỉ cần nhận được thông báo. 134 00:11:11,910 --> 00:11:19,790 Chúng ta chỉ cần nhận được một chuỗi string s = GetString, okay. 135 00:11:19,790 --> 00:11:24,890 Bây giờ vấn đề này, có một vài cách để làm nó. 136 00:11:24,890 --> 00:11:29,840 Nhưng chúng ta sẽ muốn sử dụng Bitwise nhà khai thác ở đây. 137 00:11:29,840 --> 00:11:35,280 Có những người hoặc là không phải ở các supersection, 138 00:11:35,280 --> 00:11:37,480 hoặc một cái gì đó, và không biết những gì bitwise nhà khai thác? 139 00:11:37,480 --> 00:11:41,710 Hoặc làm thế nào chúng liên quan đến ASCII trong bất kỳ cách nào? 140 00:11:41,710 --> 00:11:45,650 [Sinh viên] Tôi không phải tại supersection, nhưng tôi biết những gì bitwise nhà khai thác. 141 00:11:45,650 --> 00:11:49,560 Okay. Vì vậy, sau đó tôi không phải đi qua những căn bản của họ, nhưng tôi sẽ giải thích 142 00:11:49,560 --> 00:11:51,830 những gì chúng ta sẽ muốn sử dụng ở đây. 143 00:11:51,830 --> 00:11:59,680 Vì vậy, 'A': nhị phân đại diện vốn A, con số này là 65. 144 00:11:59,680 --> 00:12:07,560 Tôi chỉ sẽ xem xét - 41 là có được 01.000.001. 145 00:12:07,560 --> 00:12:14,170 Vì vậy, mà nên là 65 trong thập phân, vì vậy đây là biểu diễn nhị phân của các nhân vật vốn A. 146 00:12:14,170 --> 00:12:19,440 Bây giờ, các biểu diễn nhị phân của nhân vật chữ thường 'a' 147 00:12:19,440 --> 00:12:33,350 là có được điều tương tự, hầu như. Là - 6, yeah. Điều này là đúng. 148 00:12:33,350 --> 00:12:37,670 Vốn Vì vậy, nhị phân, nhị phân chữ thường. 149 00:12:37,670 --> 00:12:43,940 Vì vậy, nhận thấy rằng sự khác biệt giữa A và 'a' là bit duy nhất này. 150 00:12:43,940 --> 00:12:49,440 Và điều này sẽ xảy ra là 32 bit, bit đại diện cho số 32. 151 00:12:49,440 --> 00:12:53,910 Và điều đó làm cho tinh thần từ A là 65, 'a' là 97. 152 00:12:53,910 --> 00:12:56,610 Sự khác biệt giữa chúng là 32. 153 00:12:56,610 --> 00:13:03,770 Vì vậy, bây giờ chúng ta biết chúng ta có thể chuyển đổi từ A đến 'a' bằng cách lấy A 154 00:13:03,770 --> 00:13:09,710 và bitwise ORing, trông giống như một 1. 155 00:13:09,710 --> 00:13:20,900 Đây là một bitwise OR, với 00100000, mà sẽ cung cấp cho chúng tôi ". 156 00:13:20,900 --> 00:13:26,850 Và chúng ta có thể nhận được từ 'a' đến A Bitwise ANDing 157 00:13:26,850 --> 00:13:33,700 với 11, 0 ở nơi đó, 11.111. 158 00:13:33,700 --> 00:13:43,840 Vì vậy, điều này sau đó sẽ cung cấp cho chúng tôi chính xác những gì 'a', nhưng hủy bỏ ra chút cá nhân, 159 00:13:43,840 --> 00:13:50,070 vì vậy chúng ta sẽ có 01000001; Tôi không biết nếu tôi đếm đúng. 160 00:13:50,070 --> 00:13:56,750 Nhưng kỹ thuật này bitwise ORing để có được từ vốn thành chữ thường, 161 00:13:56,750 --> 00:14:02,080 và Bitwise ANDing để có được từ chữ thường vốn không phải là độc quyền A. 162 00:14:02,080 --> 00:14:06,510 Tất cả các chữ cái, K vs k, Z vs z, 163 00:14:06,510 --> 00:14:10,080 tất cả trong số họ chỉ sẽ khác nhau của thành viên này bit duy nhất. 164 00:14:10,080 --> 00:14:16,290 Và như vậy bạn có thể sử dụng để thay đổi từ bất kỳ lá thư chữ thường cho bất kỳ bức thư vốn và ngược lại. 165 00:14:16,290 --> 00:14:26,670 Okay. Vì vậy, một cách dễ dàng để nhận được từ này - vì vậy thay vì phải 166 00:14:26,670 --> 00:14:32,170 viết ra bất cứ điều gì 1011111 - một cách dễ dàng đại diện cho con số này, và điều này không phải là một 167 00:14:32,170 --> 00:14:39,710 mà tôi đã đi qua trong supersection, nhưng dấu ngã (~) là một nhà điều hành Bitwise. 168 00:14:39,710 --> 00:14:42,520 ~ Không là nó xem xét các đại diện bit. 169 00:14:42,520 --> 00:14:45,630 Chúng ta hãy bất kỳ số lượng. 170 00:14:45,630 --> 00:14:53,130 Đây chỉ là một số nhị phân, và những gì ~ không là nó chỉ là lật tất cả các bit. 171 00:14:53,130 --> 00:15:00,630 Vì vậy, đây là một 1, bây giờ là 0, điều này là một số 0, bây giờ một 1, 010.100. 172 00:15:00,630 --> 00:15:08,320 Vì vậy, đó là tất cả ~. Nên 32 là có được số lượng - có được thoát khỏi đó - 173 00:15:08,320 --> 00:15:23,320 nên 32 sẽ là số 00.100.000, và như vậy ~ này là có được 174 00:15:23,320 --> 00:15:29,980 con số này ở đây mà tôi ANDed 'a'. 175 00:15:29,980 --> 00:15:35,600 Tất cả mọi người nhìn thấy không? Điều này là khá phổ biến, giống như khi bạn muốn tìm ra 176 00:15:35,600 --> 00:15:40,740 cho những thứ sau này chúng ta có thể được nhìn thấy, khi chúng ta muốn xem nếu - 177 00:15:40,740 --> 00:15:44,710 hay chúng ta muốn tất cả mọi thứ, tất cả các thiết lập bit duy nhất trừ 1 178 00:15:44,710 --> 00:15:47,910 bạn có xu hướng để làm ~ của bit mà chúng ta không muốn đặt. 179 00:15:47,910 --> 00:15:53,090 Vì vậy, chúng tôi không muốn các thiết lập 32 bit, do đó, chúng tôi ~ của 32. 180 00:15:53,090 --> 00:15:57,790 Okay. Vì vậy, chúng ta có thể sử dụng tất cả những người ở đây. 181 00:15:57,790 --> 00:16:03,000 Tất cả các quyền, vì vậy nó là tốt nếu bạn không thực hiện, chúng tôi sẽ từ từ đi bộ qua lại với nhau, 182 00:16:03,000 --> 00:16:11,870 hoặc đi bộ qua này, vì vậy thông qua này. Đi bộ qua này. 183 00:16:11,870 --> 00:16:20,790 Vì vậy, chúng tôi có chuỗi ký tự của chúng tôi, và chúng tôi muốn để lặp qua mỗi nhân vật trong chuỗi đó và làm điều gì đó với nó. 184 00:16:20,790 --> 00:16:26,710 Vì vậy, làm thế nào để chúng tôi vòng qua một chuỗi? Những gì chúng tôi nên sử dụng? 185 00:16:26,710 --> 00:16:30,980 Tôi sẽ không để làm điều đó ở đây. Yeah. 186 00:16:30,980 --> 00:16:42,940 Vì vậy, tôi có iterator của tôi, và ông cho biết, nhưng làm thế nào để tôi biết bao nhiêu ký tự trong chuỗi? 187 00:16:42,940 --> 00:16:47,030 Strlen (s), sau đó tôi + +. 188 00:16:47,030 --> 00:16:49,860 Vì vậy, những gì tôi đã thực hiện ở đây không phải là cách tốt nhất để làm việc. 189 00:16:49,860 --> 00:16:51,860 Có ai biết tại sao? 190 00:16:51,860 --> 00:16:55,290 Bởi vì bạn đang kiểm tra ngôn ngữ của chuỗi mỗi lần duy nhất. 191 00:16:55,290 --> 00:17:06,859 Vì vậy, chúng ta sẽ muốn di chuyển strlen, tôi có thể nói lên ở đây, int length = strlen (s), 192 00:17:06,859 --> 00:17:11,900 và sau đó làm i 00:17:20,410 Tôi cũng có thể làm int i = 0, chiều dài = strlen (s). 194 00:17:20,410 --> 00:17:25,010 Và do đó, điều này có phần thích hợp hơn, kể từ bây giờ tôi đã hạn chế phạm vi 195 00:17:25,010 --> 00:17:29,150 của chiều dài biến chỉ cần 'cho' vòng lặp này, thay vì tuyên bố nó trước khi 196 00:17:29,150 --> 00:17:34,990 và nó luôn luôn tồn tại, và trong trường hợp bạn đã không bắt được lý do tại sao đó là xấu, 197 00:17:34,990 --> 00:17:39,410 hoặc lý do tại sao ban đầu là xấu, it's - bắt đầu cho vòng lặp. 198 00:17:39,410 --> 00:17:43,380 Tôi đã kiểm tra điều kiện. I <độ dài của s? 199 00:17:43,380 --> 00:17:46,790 Vì vậy, độ dài của s, chúng ta hãy làm việc với "hello" toàn bộ thời gian. 200 00:17:46,790 --> 00:17:49,670 Vì vậy, chiều dài của s, h-e-l-l-o. Chiều dài là 5. 201 00:17:49,670 --> 00:17:57,580 Vì vậy, i = 0, chiều dài là 5, vì vậy tôi không phải là <5, do đó, vòng lặp tiếp tục. 202 00:17:57,580 --> 00:18:02,750 Sau đó, chúng tôi đi một lần nữa. Chúng tôi kiểm tra điều kiện. I 00:18:08,390 Vì vậy, hãy kiểm tra độ dài của hello. H-e-l-l-o. Đó là 5, tôi không phải là <5, vì vậy chúng tôi tiếp tục một lần nữa. 204 00:18:08,390 --> 00:18:13,330 Vì vậy, chúng tôi đang tính toán, chúng tôi đang đếm chào, mỗi lần lặp của vòng lặp, 205 00:18:13,330 --> 00:18:17,380 thậm chí nghĩ rằng nó không bao giờ thay đổi, nó luôn luôn là 5. 206 00:18:17,380 --> 00:18:22,530 Vì vậy, chúng tôi chỉ cần nhớ 5 lên phía trước, và bây giờ mọi thứ tốt hơn. 207 00:18:22,530 --> 00:18:24,990 Vì vậy, iterating trên toàn bộ chuỗi. 208 00:18:24,990 --> 00:18:31,470 Chúng ta muốn gì để làm cho mỗi ký tự của chuỗi? 209 00:18:31,470 --> 00:18:38,510 [Sinh viên nói, khó hiểu] 210 00:18:38,510 --> 00:18:47,000 Yeah. Vì vậy, nếu nhân vật này là không thuộc chữ cái, sau đó chúng tôi chỉ muốn bỏ qua nó. 211 00:18:47,000 --> 00:18:52,300 Bởi vì chúng tôi chỉ quan tâm đến chữ chữ cái, chúng ta không thể tận dụng một số. 212 00:18:52,300 --> 00:19:10,850 Vì vậy, làm thế nào chúng ta có thể làm điều này? Vì vậy, điều kiện của chúng tôi, vì vậy nếu chúng ta muốn một cái gì đó - kiểm tra nếu nó là chữ cái. 213 00:19:10,850 --> 00:19:14,060 Vì vậy, làm thế nào để chúng ta kiểm tra này? 214 00:19:14,060 --> 00:19:18,720 [Sinh viên] Bạn chỉ có thể sử dụng chức năng là alpha. 215 00:19:18,720 --> 00:19:23,160 Là bao gồm trong một trong những, hoặc bất kỳ bao gồm như thế, char.h hoặc một cái gì đó? 216 00:19:23,160 --> 00:19:32,710 Hãy sử dụng alpha chức năng, và sử dụng rõ ràng - vì vậy chúng tôi có s [i], 217 00:19:32,710 --> 00:19:40,460 là nhân vật thứ tám của s, hãy nhớ rằng một chuỗi là một mảng kí tự, 218 00:19:40,460 --> 00:19:43,180 do đó, nhân vật thứ tám của s. 219 00:19:43,180 --> 00:19:49,280 Bây giờ, nếu nó là một bức thư vốn, chúng ta biết nó có phải là trong một phạm vi cụ thể. 220 00:19:49,280 --> 00:19:54,370 Và phạm vi đó là gì? 221 00:19:54,370 --> 00:20:07,860 Yeah. Vì vậy, nếu s [i] là ≥ 65, và s [i] là ≤ 90, tôi nên làm gì thay vì? 222 00:20:07,860 --> 00:20:18,470 Yeah. Vì vậy, bạn nên tuyệt đối không bao giờ cần phải biết giá trị ASCII của bất cứ điều gì bao giờ. 223 00:20:18,470 --> 00:20:25,640 Đừng bao giờ nghĩ rằng trong số 65 số, 90, 97 và 102, hoặc bất cứ điều gì nó là. 224 00:20:25,640 --> 00:20:32,470 Bạn không cần - 112 - bạn không cần phải biết những người ở tất cả? Đó là sai quá. 225 00:20:32,470 --> 00:20:41,940 Chỉ sử dụng các ký tự single-quote, các hằng số báo duy nhất. Vì vậy, 'A' và ít hơn 90 Z. 226 00:20:41,940 --> 00:20:47,930 Và đây là tốt hơn đáng kể - Tôi sẽ không biết ra khỏi đỉnh đầu của tôi rằng Z là 90. 227 00:20:47,930 --> 00:20:52,690 Tôi không biết ra khỏi đỉnh đầu của tôi rằng 'Z' là vốn Z. 228 00:20:52,690 --> 00:21:02,100 Vì vậy, miễn là điều này là trong phạm vi của vốn vốn Z, hoặc chúng tôi có thể kiểm tra chữ thường, 229 00:21:02,100 --> 00:21:17,010 Hoặc nếu đó là trong phạm vi ≥ 'a' và ≤ z. 230 00:21:17,010 --> 00:21:19,010 Vì vậy, đó là điều kiện của chúng tôi. 231 00:21:19,010 --> 00:21:22,520 Các phong cách cho các nơi để đưa những điều khác nhau. 232 00:21:22,520 --> 00:21:29,520 Tôi sẽ làm điều đó như thế này. 233 00:21:29,520 --> 00:21:31,520 Bây giờ, những gì chúng ta muốn làm gì? 234 00:21:31,520 --> 00:21:39,530 Chúng tôi biết lá thư này là một nhân vật, một ký tự chữ cái. 235 00:21:39,530 --> 00:21:46,270 Vì vậy, chúng ta cần phải luân phiên giữa liệu điều này, nên có một bức thư vốn hoặc một lá thư chữ thường. 236 00:21:46,270 --> 00:21:48,820 Làm thế nào để chúng ta theo dõi một trong số đó, chúng tôi muốn nó được? 237 00:21:48,820 --> 00:21:55,520 [Sinh viên tiếng nói, không thể hiểu] 238 00:21:55,520 --> 00:21:59,150 Vì vậy, có, nhưng hãy để tôi kiểm tra. 239 00:21:59,150 --> 00:22:04,910 Mô-đun 0-2 đã nói, là một gợi ý ném ra, và tôi đồng ý với điều đó. 240 00:22:04,910 --> 00:22:11,780 Ngoại trừ thông báo rằng, giống như là trường hợp? Yeah. 241 00:22:11,780 --> 00:22:18,270 Mỗi khác, nhưng chúng ta không thể module 2 của tôi, hoặc mod i 2, kể từ khi 242 00:22:18,270 --> 00:22:22,950 nhận thấy rằng E là vốn và 'a' là chữ thường? Nhưng có một không gian tách biệt chúng? 243 00:22:22,950 --> 00:22:27,150 Vì vậy, họ sẽ cùng các mod 2, nhưng họ là những trường hợp khác nhau. 244 00:22:27,150 --> 00:22:29,150 [Sinh viên câu hỏi, không thể hiểu] 245 00:22:29,150 --> 00:22:34,690 Yeah. Vì vậy, chúng tôi chỉ cần đi để giữ một số. 246 00:22:34,690 --> 00:22:38,730 Chúng tôi cũng có thể làm điều đó ở đây nếu chúng ta muốn, mà có thể có được một chút khó sử dụng 247 00:22:38,730 --> 00:22:41,300 trong vòng lặp cho các tờ khai; tôi sẽ đưa nó lên đây. 248 00:22:41,300 --> 00:22:48,840 Vì vậy, int count = bắt đầu từ 0. 249 00:22:48,840 --> 00:22:54,070 Và vì vậy bây giờ tôi sẽ đếm có bao nhiêu ký tự chữ cái chúng ta đã có. 250 00:22:54,070 --> 00:22:59,550 Vì vậy, chúng tôi chắc chắn sẽ để đếm + + kể từ khi chúng tôi tìm thấy một chữ cái khác. 251 00:22:59,550 --> 00:23:09,130 Tuy nhiên, vì vậy bây giờ bạn đang nói rằng nếu số đếm mod 2. 252 00:23:09,130 --> 00:23:12,590 Vì vậy, những gì nếu số đếm mod 2? Oh. Tôi sẽ làm == 0 cho bây giờ. 253 00:23:12,590 --> 00:23:21,740 Chúng tôi cũng sẽ đi qua đó. Vì vậy, nếu đếm mod 2 == 0, sau đó những gì? 254 00:23:21,740 --> 00:23:27,830 [Sinh viên câu trả lời, không thể hiểu] 255 00:23:27,830 --> 00:23:32,750 Vì vậy, chúng tôi muốn nó kết thúc chữ hoa. 256 00:23:32,750 --> 00:23:37,520 Có 2 trường hợp, hoa và chữ thường là 2 trường hợp. 257 00:23:37,520 --> 00:23:40,990 Vì vậy, nếu chúng ta đang ở dạng chữ thường chúng ta cần để làm cho nó thành chữ hoa. 258 00:23:40,990 --> 00:23:43,710 Nếu đó là chữ hoa, chúng tôi không cần phải làm bất cứ điều gì. 259 00:23:43,710 --> 00:23:50,760 Tuy nhiên, có một cách - shouldn't đã lộn - 260 00:23:50,760 --> 00:23:54,800 mà chúng ta thậm chí không cần phải kiểm tra xem nó là chữ hoa hoặc chữ thường? 261 00:23:54,800 --> 00:24:02,240 Những gì chúng tôi có thể làm gì để luôn luôn đảm bảo rằng chúng tôi luôn luôn kết thúc ở chữ hoa? 262 00:24:02,240 --> 00:24:07,830 Vì vậy, nhận thấy những gì chúng tôi đã làm cho chữ thường 'a', nếu chúng ta đã làm cùng một điều này chính xác chữ hoa A? 263 00:24:07,830 --> 00:24:11,900 Có chữ hoa Một sự thay đổi, hoặc không thay đổi giá trị? 264 00:24:11,900 --> 00:24:23,100 Yeah. Vì vậy, bất kỳ bức thư vốn bitwise ANDed với ~ 32 là có được rằng nhân vật cùng một chữ hoa 265 00:24:23,100 --> 00:24:29,220 bởi vì đối với bất kỳ ký tự chữ hoa bit 32 không được thiết lập. 266 00:24:29,220 --> 00:24:40,920 Vì vậy, nếu chúng ta muốn phải đưa nhân vật s [i], chúng tôi muốn nó trở thành chữ thường hoặc chữ hoa. 267 00:24:40,920 --> 00:24:46,890 Vì vậy, nếu nó là chữ thường, bây giờ là chữ hoa, nếu nó đã được viết hoa, nó vẫn còn chữ hoa, và đó là nó. 268 00:24:46,890 --> 00:24:54,290 Tôi đã nói điều này trong các supersection: Bạn có thể sử dụng 32 nếu bạn muốn, nhưng tôi có xu hướng thích làm 'a' - A, 269 00:24:54,290 --> 00:25:01,150 thay vì chỉ đơn giản 32, bởi vì nó có thể là bất kỳ bit khác. 270 00:25:01,150 --> 00:25:03,610 Sau khi 32 bit, nó có thể là bất kỳ trong số này, hoặc chúng tôi sẽ không có đủ 271 00:25:03,610 --> 00:25:05,840 con số đại diện cho tất cả các nhân vật. 272 00:25:05,840 --> 00:25:09,110 Vì vậy, nếu bạn nhận được 32 bit, nó có thể là 64 bit, nó có thể là 128 bit. 273 00:25:09,110 --> 00:25:13,990 Bất kỳ của các bit có thể là bit phân biệt giữa chữ hoa và chữ thường. 274 00:25:13,990 --> 00:25:18,350 Tôi không nên cần phải biết rằng đó là 32 bit. 275 00:25:18,350 --> 00:25:27,130 Tôi có thể sử dụng 'a' - A để có được các bit khác nhau giữa hai 276 00:25:27,130 --> 00:25:33,000 mà không cần phải dựa vào con số kỳ diệu đó là 32. 277 00:25:33,000 --> 00:25:38,770 Và vì vậy bây giờ, khác tính thật kỳ quặc, và do đó, những gì tôi muốn làm? 278 00:25:38,770 --> 00:25:43,920 [Câu trả lời của sinh viên, không thể hiểu] 279 00:25:43,920 --> 00:25:45,920 [Sinh viên] đó là gì? 280 00:25:45,920 --> 00:25:49,850 Tôi sẽ làm điều đó trong 1 giây. 281 00:25:49,850 --> 00:25:55,690 Vì vậy, bây giờ nếu tôi muốn - tôi muốn chắc chắn rằng nhân vật này là chữ thường, 282 00:25:55,690 --> 00:26:04,140 và vì vậy tôi có thể hoặc 32, và 'a' 32 ý nghĩa - A. 283 00:26:04,140 --> 00:26:06,510 Nhưng chú ý, bởi cùng một lý do là trước đó, rằng nếu 284 00:26:06,510 --> 00:26:11,670 lá thư đã chữ thường, sau đó ORing của 32 chỉ giữ nó thành chữ thường. 285 00:26:11,670 --> 00:26:16,220 Nó đã không thay đổi các ký tự ban đầu. 286 00:26:16,220 --> 00:26:19,910 Nhưng bây giờ tôi không cần phải tránh nói rằng, "Nếu nó là chữ thường, chỉ cần quên nó đi, 287 00:26:19,910 --> 00:26:23,650 nếu nó là chữ hoa, sau đó thay đổi nó. " 288 00:26:23,650 --> 00:26:26,900 Đó là thuận tiện hơn nhiều để làm điều này. 289 00:26:26,900 --> 00:26:33,190 [Sinh viên] rằng chiến lược của trừ chữ hoa chữ thường từ công việc nếu nó không được 32? 290 00:26:33,190 --> 00:26:35,330 Nếu nó là, như, 34 hoặc một cái gì đó? 291 00:26:35,330 --> 00:26:41,840 Vì vậy, bạn cần phải biết rằng sự khác biệt giữa 2? >> 1 bit. 292 00:26:41,840 --> 00:26:49,840 Nó có thể là nhiều hơn 1 bit, miễn là tất cả các bit dưới vị trí này là như nhau. 293 00:26:49,840 --> 00:26:58,500 Vì vậy, chúng ta cần ít nhất 26 ký tự - hoặc, có 26 ký tự. 294 00:26:58,500 --> 00:27:04,590 Vì vậy, chúng ta cần ít nhất 26 số để đại diện cho sự khác biệt - 295 00:27:04,590 --> 00:27:07,650 Sự khác biệt giữa A và 'a' có được ít nhất là 26, 296 00:27:07,650 --> 00:27:10,760 nếu không chúng ta sẽ không có đại diện tất cả các số vốn. 297 00:27:10,760 --> 00:27:18,630 Điều đó có nghĩa là A, nếu chúng ta bắt đầu từ 1, nó sẽ sử dụng tất cả các bit, 298 00:27:18,630 --> 00:27:23,900 tất cả của 5 bit đầu tiên, đại diện cho tất cả mọi thứ thông qua Z. 299 00:27:23,900 --> 00:27:32,170 Đó là lý do tại sao các bit tiếp theo, hoặc bit này, các bit tiếp theo là một trong đó là lựa chọn để phân biệt giữa A và 'a'. 300 00:27:32,170 --> 00:27:40,930 Đó cũng là lý do tại sao, trong bảng mã ASCII, có 5 biểu tượng tách chữ hoa chữ thường. 301 00:27:40,930 --> 00:27:49,050 Kể từ khi những người đang có những biểu tượng, thêm 5 sẽ trả số 32 là sự khác biệt giữa chúng. 302 00:27:49,050 --> 00:27:51,840 [Sinh viên] Vì vậy, chúng ta có thể làm điều đó, bởi vì ASCII thiết kế như vậy. 303 00:27:51,840 --> 00:27:57,280 Vâng. Nhưng ASCII - sự khác biệt cũng có thể được cả hai của các bit. 304 00:27:57,280 --> 00:28:12,040 Giống như, nếu A là 10000001, và 'a' là 11100001 - tôi quên, bất cứ điều gì. 305 00:28:12,040 --> 00:28:18,100 Nhưng nếu nó đã được điều này, thì chúng ta vẫn có thể sử dụng 'a' - A. 306 00:28:18,100 --> 00:28:22,650 Nó chỉ là sự khác biệt giữa A và 'a' vẫn còn 2 bit này. 307 00:28:22,650 --> 00:28:32,240 Tôi nghĩ rằng nó được viết bằng 48. Có 32 + 64? Tôi nghĩ rằng đó là? 308 00:28:32,240 --> 00:28:40,160 Nó vẫn sẽ là 2 bit, tất cả các nhân vật duy nhất, như, Z và z, K và k, 309 00:28:40,160 --> 00:28:45,160 họ vẫn sẽ có các bit chính xác cùng trừ 2 bit. 310 00:28:45,160 --> 00:28:48,870 Vì vậy, miễn là đó là luôn luôn đúng, bất kể nếu chúng ta đang sử dụng ASCII hoặc một số hệ thống khác, 311 00:28:48,870 --> 00:28:53,050 miễn là chỉ có một số thiết lập của các bit khác nhau cho mỗi ký tự, 312 00:28:53,050 --> 00:28:55,050 sau đó hoạt động tốt. 313 00:28:55,050 --> 00:29:06,110 Nó chỉ là 32 bit đã được thiết lập bởi vì đó là một trong những đầu tiên chúng ta có thể có thể sử dụng. >> Cool. 314 00:29:06,110 --> 00:29:14,520 Tôi có xu hướng thích, trong trường hợp bạn không nhìn thấy, nếu khối là chỉ có một đường duy nhất, 315 00:29:14,520 --> 00:29:24,280 bạn có thể nhận được thoát khỏi dấu ngoặc nhọn, vì vậy tôi có xu hướng thích làm điều này. 316 00:29:24,280 --> 00:29:34,010 Ngoài ra, bạn biết làm thế nào chúng ta có thể làm những việc như s [i] + = 1? 317 00:29:34,010 --> 00:29:41,090 Bạn cũng có thể làm s [i] phép toán AND = 32. 318 00:29:41,090 --> 00:29:46,400 Và bitwise OR = 32. 319 00:29:46,400 --> 00:29:51,490 Ngoài ra, đếm mod 2 == 0. 320 00:29:51,490 --> 00:30:00,900 Vì vậy, hãy nhớ rằng tôi sẽ không viết bất kỳ giá trị nào khác không là đúng, và 0 là sai. 321 00:30:00,900 --> 00:30:07,880 Vì vậy, "nếu số đếm mod 2 == 0" là giống như nói rằng "nếu không tính mod 2." 322 00:30:07,880 --> 00:30:11,580 Tôi có lẽ sẽ chỉ cần đảo ngược các dòng và nói, "nếu số đếm mod 2, 323 00:30:11,580 --> 00:30:15,350 làm các việc OR 1, người khác làm những VÀ 1 ", vì vậy mà tôi không cần" không ". 324 00:30:15,350 --> 00:30:18,650 Nhưng công trình này chỉ là tốt. 325 00:30:18,650 --> 00:30:25,660 Và những gì khác tôi có thể làm ở đây? 326 00:30:25,660 --> 00:30:29,060 Bạn có thể kết hợp chúng với ternary nếu bạn muốn, nhưng sau đó mà chỉ muốn làm cho mọi thứ hỗn độn 327 00:30:29,060 --> 00:30:33,770 và có lẽ khó khăn hơn để đọc, vì vậy chúng tôi sẽ không làm điều đó. 328 00:30:33,770 --> 00:30:37,330 Bất cứ ai có bất cứ lời đề nghị khác? 329 00:30:37,330 --> 00:30:41,580 Rằng tất cả các vấn đề yêu cầu? Oh yeah. 330 00:30:41,580 --> 00:30:51,070 Vì vậy, để loại bỏ những dòng trống, bây giờ chúng tôi sẽ in f,% s là một chuỗi, 331 00:30:51,070 --> 00:30:56,620 Chúng tôi sẽ in f, s. 332 00:30:56,620 --> 00:30:59,330 Bây giờ chúng ta hãy chạy nó. Tôi đã làm gì sai? 333 00:30:59,330 --> 00:31:03,200 Đó là một \ ", tôi muốn có một n. 334 00:31:03,200 --> 00:31:07,840 Okay. Bây giờ chúng ta sẽ chạy nó. Nó có thể sẽ hét lên với tôi. 335 00:31:07,840 --> 00:31:11,250 Strlen là trong string.h. 336 00:31:11,250 --> 00:31:14,290 Vì vậy, đây là điều tốt đẹp về Clang là nó sẽ cho bạn những gì nó có trong, 337 00:31:14,290 --> 00:31:19,140 thay vì GCC mà chỉ cần nói: "Này, bạn quên một cái gì đó, tôi không biết nó là cái gì." 338 00:31:19,140 --> 00:31:29,220 Nhưng điều này sẽ cho tôi biết, "Bạn có nghĩa là bao gồm string.h". 339 00:31:29,220 --> 00:31:32,130 Vì vậy, tôi đã không nhắc nhở cho bất cứ điều gì, vì vậy nó không nói bất cứ điều gì. 340 00:31:32,130 --> 00:31:42,540 Nhưng chúng tôi sẽ làm ví dụ của họ, "Cảm ơn 4 tiện ích". 341 00:31:42,540 --> 00:31:47,880 Điều đó có vẻ đúng. Hoan hô. 342 00:31:47,880 --> 00:31:52,370 Vì vậy, trở lại chính của bạn, tôi gần như không bao giờ làm điều đó. 343 00:31:52,370 --> 00:31:57,110 Đó là tùy chọn. Và chính là chức năng duy nhất đó là tùy chọn. 344 00:31:57,110 --> 00:32:07,140 Nếu bạn không trả lại bất cứ điều gì từ chính, nó giả định rằng bạn có nghĩa là để trở về 0. 345 00:32:07,140 --> 00:32:13,070 Câu hỏi? 346 00:32:13,070 --> 00:32:20,980 Okay. Vì vậy, bây giờ vấn đề thứ hai. 347 00:32:20,980 --> 00:32:24,810 "Xem lại từ bài giảng thứ hai tuần 2 trao đổi giá trị của 2 biến bằng cách đi qua 348 00:32:24,810 --> 00:32:30,780 những 2 biến đến một chức năng (thậm chí nếu gọi là swap) không chính xác làm việc, ít nhất là không phải không có con trỏ. " 349 00:32:30,780 --> 00:32:37,020 Và bỏ qua con trỏ cho đến khi chúng tôi nhận được cho họ. 350 00:32:37,020 --> 00:32:40,070 Chúng tôi muốn trao đổi 2 biến, chúng tôi không sử dụng một chức năng để làm điều đó. 351 00:32:40,070 --> 00:32:43,410 Chúng tôi vẫn sẽ làm điều đó trong chính như nó nói. 352 00:32:43,410 --> 00:32:48,360 Nhưng để sử dụng 2 biến, chúng tôi không muốn sử dụng một biến tạm thời. 353 00:32:48,360 --> 00:32:50,770 Có 2 cách để làm điều này. 354 00:32:50,770 --> 00:32:56,310 Bạn có thể làm điều đó bằng cách sử dụng các nhà điều hành nhị phân truyền thống của bạn. 355 00:32:56,310 --> 00:33:00,180 Vì vậy, không ai biết một cách nhanh chóng và bẩn làm điều đó? 356 00:33:00,180 --> 00:33:07,650 Nó thực sự có thể mất một phút suy nghĩ. Nếu tôi có - 357 00:33:07,650 --> 00:33:12,130 Tôi sẽ đặt vấn đề như họ yêu cầu. Vì vậy, nếu tôi có 2 biến, A, chỉ là một số nguyên 358 00:33:12,130 --> 00:33:17,800 họ cung cấp cho tôi, và B biến Tóm lại, đó là một số nguyên mà tôi cho. 359 00:33:17,800 --> 00:33:22,700 Vì vậy, nếu tôi có 2 biến này, bây giờ tôi muốn trao đổi chúng. 360 00:33:22,700 --> 00:33:31,550 Truyền thống, sử dụng toán tử nhị phân thường xuyên của bạn, tôi có nghĩa là, như +, -, ÷. 361 00:33:31,550 --> 00:33:36,630 Không Bitwise điều hành hoạt động nhị phân. 362 00:33:36,630 --> 00:33:39,600 Vì vậy, bằng cách sử dụng -, +, ÷, và tất cả những người. 363 00:33:39,600 --> 00:33:52,980 Chúng tôi có thể trao đổi bằng cách làm một cái gì đó giống như a = a + b, và b = a - b, a = a - b. 364 00:33:52,980 --> 00:34:04,260 Vì vậy, sự tỉnh táo kiểm tra, và sau đó chúng ta sẽ thấy lý do tại sao mà các công trình. 365 00:34:04,260 --> 00:34:13,320 Hãy nói rằng = 7, b = 3, sau đó a + b sẽ là 10. 366 00:34:13,320 --> 00:34:18,820 Vì vậy, chúng tôi đang thiết lập một 10 =, và sau đó chúng tôi đang làm b = a - b. 367 00:34:18,820 --> 00:34:30,250 Vì vậy, chúng tôi đang làm b = a - b, đó là sẽ là 7, và b = a - b một lần nữa, 368 00:34:30,250 --> 00:34:38,650 hoặc a = a - b. Đó là sẽ là 10 - 7 là 3. 369 00:34:38,650 --> 00:34:44,850 Vì vậy, bây giờ, một cách chính xác, 'a' là 7, b là 3, và bây giờ b 7 và 'a' là 3. 370 00:34:44,850 --> 00:34:48,679 Vì vậy, loại đó có ý nghĩa; 'a' là sự kết hợp của 2 con số. 371 00:34:48,679 --> 00:34:53,000 Tại thời điểm này, 'a' là sự kết hợp, và sau đó chúng ta trừ đi b ban đầu, 372 00:34:53,000 --> 00:34:56,860 và sau đó chúng ta trừ đi ra ban đầu là 'a'. 373 00:34:56,860 --> 00:35:01,150 Nhưng điều này không làm việc cho tất cả các số. 374 00:35:01,150 --> 00:35:08,880 Để thấy điều này, chúng ta hãy xem xét một hệ thống, vì thế chúng ta thường nghĩ các số nguyên như 32 bit. 375 00:35:08,880 --> 00:35:13,050 Hãy làm việc trên một cái gì đó chỉ giống như 4 bit. 376 00:35:13,050 --> 00:35:15,450 Hy vọng rằng tôi đến với một ví dụ tốt ngay bây giờ. 377 00:35:15,450 --> 00:35:18,680 Vì vậy, tôi biết, điều này sẽ dễ dàng. 378 00:35:18,680 --> 00:35:26,720 Hãy nói rằng 2 của chúng tôi số là 1111, và 1111, vì vậy chúng tôi trong hệ nhị phân ngay bây giờ. 379 00:35:26,720 --> 00:35:34,630 Trong số thập phân thực tế, nếu bạn muốn nghĩ về nó theo cách đó, một = 15 và b = 15 380 00:35:34,630 --> 00:35:37,630 Và vì vậy chúng tôi hy vọng, sau khi chúng tôi trao đổi chúng - họ thậm chí không phải là những con số tương tự, 381 00:35:37,630 --> 00:35:41,140 nhưng tôi đã làm nó theo cách này. 382 00:35:41,140 --> 00:35:47,100 Hãy làm cho họ không phải là những con số tương tự. Hãy làm 1111 và 0001. 383 00:35:47,100 --> 00:35:51,860 Vì vậy, một = 15 và b = 1. 384 00:35:51,860 --> 00:35:57,670 Sau khi chúng tôi trao đổi chúng, chúng tôi hy vọng 'a' là 1 và b là 15. 385 00:35:57,670 --> 00:36:01,780 Vì vậy, bước đầu tiên của chúng tôi là a = a + b. 386 00:36:01,780 --> 00:36:08,770 Số lượng của chúng tôi là chỉ có 4 bit rộng, do đó, 'a' là 1111, + b, đó là 0001, 387 00:36:08,770 --> 00:36:16,780 sẽ kết thúc được 10.000, nhưng chúng tôi chỉ có 4 bit. 388 00:36:16,780 --> 00:36:22,540 Vì vậy, bây giờ a = 0. 389 00:36:22,540 --> 00:36:34,080 Và bây giờ chúng tôi muốn thiết lập b = a - b - trên thực tế, điều này vẫn còn hoạt động ra hoàn hảo. 390 00:36:34,080 --> 00:36:39,630 = a - chúng ta hãy xem nếu điều này hoạt động ra hoàn hảo - b. 391 00:36:39,630 --> 00:36:53,720 Vì vậy, sau đó b = 0 - 1, mà vẫn sẽ là 15, và sau đó a = a - b, đó sẽ là 1. 392 00:36:53,720 --> 00:36:56,210 Có lẽ điều này không làm việc. 393 00:36:56,210 --> 00:36:59,020 Tôi cảm thấy như có một lý do nó không hoạt động sử dụng thường xuyên. 394 00:36:59,020 --> 00:37:06,400 Được rồi, do đó, làm việc trên giả định rằng nó không làm việc với các hoạt động nhị phân thường xuyên, 395 00:37:06,400 --> 00:37:15,040 và tôi sẽ tìm kiếm - Google để xem nếu đó là sự thật. 396 00:37:15,040 --> 00:37:23,490 Vì vậy, chúng tôi muốn làm điều đó bằng cách sử dụng Bitwise nhà điều hành, và các đầu mối ở đây là XOR. 397 00:37:23,490 --> 00:37:28,780 Vì vậy, giới thiệu XOR (^) nếu bạn không nhìn thấy nó. 398 00:37:28,780 --> 00:37:34,610 Đó là, một lần nữa, một nhà điều hành Bitwise vì vậy nó hoạt động từng chút từng chút, và it's 399 00:37:34,610 --> 00:37:39,910 Nếu bạn có các bit 0 và 1, sau đó sẽ được 1. 400 00:37:39,910 --> 00:37:45,230 Nếu bạn có bit 1 và 0, nó sẽ là 1, bạn có 0 bit và 0 nó sẽ là 0, 401 00:37:45,230 --> 00:37:47,640 và nếu bạn có bit 1 và 1 nó sẽ là 0. 402 00:37:47,640 --> 00:37:56,180 Vì vậy, nó như OR. Nếu một trong các bit là đúng sự thật, đó là 1, nhưng không giống như OR, nó không thể là cả hai bit là đúng sự thật. 403 00:37:56,180 --> 00:37:59,320 OR sẽ là 1, XOR này là 0. 404 00:37:59,320 --> 00:38:02,250 Vì vậy, chúng ta sẽ muốn sử dụng XOR đây. 405 00:38:02,250 --> 00:38:09,960 Hãy suy nghĩ về nó trong một phút, tôi sẽ đến Google. 406 00:38:09,960 --> 00:38:16,230 Vâng, bạn không thể đọc rằng, tôi là hiện nay trên trang XOR các thuật toán trao đổi. 407 00:38:16,230 --> 00:38:21,340 Hy vọng rằng điều này sẽ giải thích lý do tại sao tôi không thể nào - 408 00:38:21,340 --> 00:38:34,190 Đây chính là thuật toán mà chúng ta chỉ cần làm. 409 00:38:34,190 --> 00:38:37,330 Tôi vẫn không thấy lý do tại sao tôi phải có chỉ chọn một ví dụ xấu, 410 00:38:37,330 --> 00:38:44,940 nhưng trường hợp này 'a' đã xảy ra để trở thành 0, sau khi nhận được đến 5 bit, vì vậy bây giờ 'a' là 0, 411 00:38:44,940 --> 00:38:48,730 đó là những gì được gọi là "số nguyên tràn". 412 00:38:48,730 --> 00:38:54,370 Theo Wikipedia, "Không giống như các trao đổi XOR, sự thay đổi này đòi hỏi sử dụng một số phương pháp 413 00:38:54,370 --> 00:38:59,780 để đảm bảo rằng x + y không gây ra một tràn số nguyên. " 414 00:38:59,780 --> 00:39:08,350 Vì vậy, điều này không có vấn đề, đây là số nguyên tràn, nhưng tôi đã làm gì đó sai trái. 415 00:39:08,350 --> 00:39:10,520 Tôi không chắc. Tôi sẽ cố gắng để đến với một số khác. 416 00:39:10,520 --> 00:39:13,640 [Sinh viên], không phải là số nguyên tràn khi bạn đang cố gắng để đặt một số trong đó 417 00:39:13,640 --> 00:39:16,640 lớn hơn số bit bạn đã phân bổ? 418 00:39:16,640 --> 00:39:23,730 Yeah. Chúng tôi có 4 bit. Đó - chúng tôi đã có 4 bit, sau đó chúng tôi cố gắng thêm 1 đến nó, vì vậy chúng tôi kết thúc với 5 bit. 419 00:39:23,730 --> 00:39:26,690 Tuy nhiên, các bit thứ năm chỉ bị cắt, yeah. 420 00:39:26,690 --> 00:39:28,970 Nó có thể thực sự - 421 00:39:28,970 --> 00:39:33,010 [Sinh viên] mà ném cho bạn một lỗi, hoặc nào đó - đó sẽ ném ra một lỗi? 422 00:39:33,010 --> 00:39:40,720 Số Vì vậy, không có lỗi. Khi bạn nhận được đến cấp độ lắp ráp, một chút đặc biệt 423 00:39:40,720 --> 00:39:47,020 một nơi nào đó được thiết lập cho biết đã có một tràn, nhưng trong C bạn loại không đối phó với điều đó. 424 00:39:47,020 --> 00:39:55,160 Bạn thực sự không thể đối phó với nó, trừ khi bạn sử dụng các hướng dẫn lắp ráp đặc biệt trong C. 425 00:39:55,160 --> 00:39:58,110 Hãy suy nghĩ về trao đổi XOR. 426 00:39:58,110 --> 00:40:02,220 Và tôi nghĩ rằng các bài viết Wikipedia cũng có thể nói rằng - 427 00:40:02,220 --> 00:40:07,310 Vì vậy, nó cũng đưa ra số học modula, vì vậy tôi đoán tôi đã, trong lý thuyết, làm số học mô-đun 428 00:40:07,310 --> 00:40:11,160 khi tôi nói rằng 0 - 1 là 15 một lần nữa. 429 00:40:11,160 --> 00:40:15,410 Vì vậy mà có thể thực sự - một bộ xử lý thường xuyên mà không 0 - 1 = 15. 430 00:40:15,410 --> 00:40:20,430 Kể từ khi chúng tôi kết thúc ở 0, chúng ta trừ đi 1, do đó, sau đó nó chỉ kết thúc tốt đẹp trở lại khoảng 1111. 431 00:40:20,430 --> 00:40:28,930 Vì vậy, thuật toán này thực sự có thể làm việc, a + b, a - b, b - a, mà có thể được sử dụng tốt. 432 00:40:28,930 --> 00:40:34,030 Nhưng có một số bộ vi xử lý mà không làm điều đó, và vì vậy nó sẽ không được sử dụng tốt trong những những người cụ thể. 433 00:40:34,030 --> 00:40:39,880 XOR trao đổi này sẽ làm việc trên bất kỳ bộ vi xử lý. Okay. 434 00:40:39,880 --> 00:40:42,280 Ý tưởng là nó phải là như vậy, mặc dù. 435 00:40:42,280 --> 00:40:50,120 Nơi mà chúng tôi đang sử dụng XOR bằng cách nào đó có được các thông tin của cả hai vào 1 trong các biến, 436 00:40:50,120 --> 00:40:54,120 và sau đó kéo ra các thông tin của các biến cá nhân một lần nữa. 437 00:40:54,120 --> 00:41:04,330 Vì vậy, không ai có ý tưởng / câu trả lời? 438 00:41:04,330 --> 00:41:14,540 [Sinh viên câu trả lời, không thể hiểu] 439 00:41:14,540 --> 00:41:22,220 Vì vậy, nên làm việc này, và cũng có thể, XOR là giao hoán. 440 00:41:22,220 --> 00:41:27,620 Bất kể đó để 2 số này xảy ra được ở đây, 441 00:41:27,620 --> 00:41:30,100 kết quả này là có được như vậy. 442 00:41:30,100 --> 00:41:35,800 Vì vậy, một ^ b là b ^ a. 443 00:41:35,800 --> 00:41:51,860 Bạn cũng có thể thấy điều này bằng văn bản như a ^ = b, b ^ = a, a ^ = b một lần nữa. 444 00:41:51,860 --> 00:42:00,200 Vì vậy, điều này là đúng, và để xem lý do tại sao các công trình này, suy nghĩ của các bit. 445 00:42:00,200 --> 00:42:10,400 Sử dụng một số smallish, chúng ta hãy nói 11.001, và 01.100. 446 00:42:10,400 --> 00:42:12,790 Vì vậy, đây là 'a', đây là b. 447 00:42:12,790 --> 00:42:15,540 Vì vậy, một ^ = b. 448 00:42:15,540 --> 00:42:22,380 Chúng ta sẽ được thiết lập = 'a' XOR của 2 điều này. 449 00:42:22,380 --> 00:42:32,920 Vì vậy, 1 ^ 0 là 1, 1 ^ 1 là 0, 0 ^ 1 là 1, và 0 ^ 0 là 0, 1 ^ 0 là 1. 450 00:42:32,920 --> 00:42:37,380 Vì vậy, ',' nếu bạn nhìn vào số thập phân, nó sẽ được - 451 00:42:37,380 --> 00:42:41,160 bạn sẽ không thấy nhiều của một mối quan hệ giữa bản gốc 'a' và mới ',' 452 00:42:41,160 --> 00:42:45,600 nhưng nhìn vào các bit, 'a' bây giờ là giống như một mạng lưới thông tin 453 00:42:45,600 --> 00:42:49,970 cả hai bản gốc 'a' và b ban đầu. 454 00:42:49,970 --> 00:42:57,930 Vì vậy, nếu chúng ta lấy b ^ a, chúng ta thấy rằng chúng tôi sẽ kết thúc tại một. 455 00:42:57,930 --> 00:43:08,910 Và nếu chúng ta lấy bản gốc 'a' mới ', chúng ta thấy chúng ta kết thúc tại b ban đầu. 456 00:43:08,910 --> 00:43:18,380 Vì vậy, (a ^ b) ^ b = gốc. 457 00:43:18,380 --> 00:43:27,910 Và (a ^ b) ^ a = b ban đầu. 458 00:43:27,910 --> 00:43:37,010 Có một cách khác để nhìn thấy điều này là bất cứ điều gì XOR chính nó luôn luôn là 0. 459 00:43:37,010 --> 00:43:45,020 Vì vậy, 1101 ^ 1101, tất cả các bit sẽ là như vậy. 460 00:43:45,020 --> 00:43:47,920 Vì vậy, sẽ không bao giờ là một trường hợp trong đó 1 là 0 và sự khác 1. 461 00:43:47,920 --> 00:43:51,080 Vì vậy, đây là 0000. 462 00:43:51,080 --> 00:43:57,240 Cùng với điều này. (A ^ b) ^ b giống như một ^ (b ^ b). 463 00:43:57,240 --> 00:44:03,680 (B ^ b) sẽ là 0 ^ 0 là chỉ cần đi là 'a', vì tất cả các bit là 0. 464 00:44:03,680 --> 00:44:08,050 Vì vậy, những người duy nhất đang có được nơi 'a' ban đầu là 1 - có những người thân. 465 00:44:08,050 --> 00:44:12,070 Và cùng một ý tưởng ở đây, tôi khá chắc chắn rằng nó cũng giao hoán. 466 00:44:12,070 --> 00:44:17,590 Yeah. Tôi đã nói trước rằng đó là giao hoán. 467 00:44:17,590 --> 00:44:24,680 ^ ',' Và đó là kết hợp, vì vậy bây giờ (b ^ a) ^ a. 468 00:44:24,680 --> 00:44:28,970 Và chúng ta có thể làm b ^ (a ^ a). 469 00:44:28,970 --> 00:44:31,540 Và như vậy một lần nữa, chúng tôi nhận b ban đầu. 470 00:44:31,540 --> 00:44:37,120 Vì vậy, 'a' bây giờ là sự kết hợp của 'a' và b với nhau. 471 00:44:37,120 --> 00:44:49,660 Sử dụng combo mới của chúng tôi "chúng ta nói b = combo một '^ b ban đầu, chúng tôi nhận được bản gốc. 472 00:44:49,660 --> 00:45:05,170 Và một combo = 'a' ^ b, là bản gốc hoặc bây giờ là 'a' hoặc b là những gì. 473 00:45:05,170 --> 00:45:13,620 Đó là trường hợp này đây. Đây là = b, b cũ. 474 00:45:13,620 --> 00:45:16,550 Vì vậy, bây giờ tất cả mọi thứ trở lại theo thứ tự trao đổi. 475 00:45:16,550 --> 00:45:22,960 Nếu chúng ta thực sự nhìn vào các bit, b = a ^ b, sẽ XOR những 2, 476 00:45:22,960 --> 00:45:33,920 và câu trả lời là có được điều này, và sau đó a = a ^ b XORing những 2 và câu trả lời là điều này. 477 00:45:33,920 --> 00:45:41,090 Câu hỏi? Okay. Vì vậy, cuối cùng là một chút khó khăn hơn đáng kể. 478 00:45:41,090 --> 00:45:43,180 [Sinh viên] Tôi nghĩ rằng ông đã có một câu hỏi về nó. >> Ồ, xin lỗi. 479 00:45:43,180 --> 00:45:49,380 [Sinh viên] Điều gì thực sự nhanh hơn? Nếu bạn sử dụng XOR này, hoặc là nó nếu bạn khai báo một biến mới? 480 00:45:49,380 --> 00:45:55,190 Vì vậy, những gì là thực sự nhanh hơn, khai báo một biến mới hoặc sử dụng XOR để trao đổi? 481 00:45:55,190 --> 00:45:59,600 Câu trả lời là, trong tất cả các khả năng, một biến tạm thời. 482 00:45:59,600 --> 00:46:05,780 Và đó là bởi vì một khi nó được biên dịch xuống - vì vậy ở mức độ lắp ráp, 483 00:46:05,780 --> 00:46:12,320 không có những điều như biến địa phương hoặc bất kỳ biến tạm thời hoặc bất kỳ công cụ này. 484 00:46:12,320 --> 00:46:16,060 Họ giống như có bộ nhớ, và có đăng ký. 485 00:46:16,060 --> 00:46:20,920 Đăng ký là nơi mà mọi thứ đang tích cực xảy ra. 486 00:46:20,920 --> 00:46:24,750 Bạn không thêm 2 điều trong bộ nhớ, bạn thêm 2 điều trong sổ đăng ký. 487 00:46:24,750 --> 00:46:28,160 Và bạn mang lại những điều từ bộ nhớ vào sổ đăng ký sau đó thêm chúng, 488 00:46:28,160 --> 00:46:33,180 và sau đó bạn có thể đặt chúng trở lại vào bộ nhớ, nhưng tất cả các hành động xảy ra trong sổ đăng ký. 489 00:46:33,180 --> 00:46:38,750 Vì vậy, khi bạn đang sử dụng phương pháp biến tạm thời, thường là những gì xảy ra là 490 00:46:38,750 --> 00:46:42,810 2 con số này đã có trong sổ đăng ký. 491 00:46:42,810 --> 00:46:46,570 Và sau đó từ thời điểm đó, sau khi bạn đã đổi chỗ, 492 00:46:46,570 --> 00:46:51,540 nó sẽ chỉ bắt đầu sử dụng sổ đăng ký khác. 493 00:46:51,540 --> 00:46:56,510 Bất cứ nơi nào bạn đã sử dụng b, nó sẽ chỉ sử dụng sổ đăng ký đã được lưu trữ một '. 494 00:46:56,510 --> 00:47:02,180 Vì vậy, nó không cần phải làm bất cứ điều gì để thực sự làm hoán đổi. Yeah? 495 00:47:02,180 --> 00:47:05,690 [Sinh viên] Nhưng nó cũng phải mất nhiều bộ nhớ hơn, phải không? 496 00:47:05,690 --> 00:47:10,280 Nó sẽ chỉ mất nhiều bộ nhớ hơn nếu nó cần để lưu trữ biến tạm thời. 497 00:47:10,280 --> 00:47:14,830 Cũng giống như nếu sau này bạn sử dụng biến tạm thời một lần nữa một nơi nào đó, 498 00:47:14,830 --> 00:47:18,920 sau đó - bạn chỉ định một cái gì đó để mà biến tạm thời. 499 00:47:18,920 --> 00:47:24,630 Vì vậy, nếu tại bất kỳ điểm nào trong thời gian ',' b ở nhiệt độ có giá trị riêng biệt hoặc một cái gì đó, 500 00:47:24,630 --> 00:47:30,680 sau đó nó sẽ có vị trí khác nhau trong bộ nhớ, nhưng nó là sự thật 501 00:47:30,680 --> 00:47:34,800 có rất nhiều biến địa phương đó sẽ chỉ tồn tại trong sổ đăng ký. 502 00:47:34,800 --> 00:47:44,370 Trong trường hợp đó, nó không bao giờ đặt vào bộ nhớ, và do đó bạn sẽ không bao giờ lãng phí bộ nhớ. 503 00:47:44,370 --> 00:47:58,620 Okay. Câu hỏi cuối cùng là một chút. 504 00:47:58,620 --> 00:48:04,850 Vì vậy, ở đây, thiết bị này CS50, có một từ điển. 505 00:48:04,850 --> 00:48:12,390 Và lý do cho điều này là bởi vì [? B66?] Là một kiểm tra chính tả nơi bạn sẽ được viết 506 00:48:12,390 --> 00:48:15,780 bằng cách sử dụng bảng băm hoặc cố gắng hoặc cấu trúc một số dữ liệu. 507 00:48:15,780 --> 00:48:22,660 Bạn đang đi để được viết một kiểm tra chính tả, và bạn sẽ được sử dụng từ điển này để làm điều đó. 508 00:48:22,660 --> 00:48:28,280 Nhưng đối với vấn đề này, chúng tôi chỉ cần đi để tìm kiếm để xem nếu một từ duy nhất có trong từ điển. 509 00:48:28,280 --> 00:48:31,250 Vì vậy, thay vì lưu trữ toàn bộ từ điển trong một số cấu trúc dữ liệu 510 00:48:31,250 --> 00:48:35,180 và sau đó nhìn trên toàn bộ tài liệu để xem nếu bất cứ điều gì sai chính tả, 511 00:48:35,180 --> 00:48:38,490 chúng tôi chỉ muốn tìm 1 từ. Vì vậy, chúng tôi chỉ có thể quét qua toàn bộ từ điển 512 00:48:38,490 --> 00:48:44,300 và nếu chúng ta không bao giờ tìm thấy từ trong từ điển, sau đó nó là không ở trong đó. 513 00:48:44,300 --> 00:48:52,150 Nếu chúng ta quét qua toàn bộ từ điển và tôi thấy từ, sau đó chúng tôi đang tốt, chúng tôi tìm thấy nó. 514 00:48:52,150 --> 00:48:56,580 Nó nói ở đây là chúng tôi muốn bắt đầu tìm kiếm chức năng xử lý tập tin của C, 515 00:48:56,580 --> 00:48:59,930 kể từ khi chúng tôi muốn đọc từ điển, 516 00:48:59,930 --> 00:49:07,680 nhưng tôi sẽ cung cấp cho các gợi ý ở đây là chức năng mà bạn nên nghĩ đến. 517 00:49:07,680 --> 00:49:11,510 Tôi sẽ viết chúng trên Spaces. 518 00:49:11,510 --> 00:49:20,490 Vì vậy, những người chủ yếu bạn sẽ muốn để nhìn được f mở và sau đó, chắc chắn, f đóng cửa, 519 00:49:20,490 --> 00:49:26,540 mà sẽ đi vào cuối của chương trình của bạn, và f f quét. 520 00:49:26,540 --> 00:49:31,060 Bạn cũng có thể sử dụng e đọc, nhưng có thể bạn không muốn 521 00:49:31,060 --> 00:49:34,200 bởi vì đó - bạn không kết thúc cần rằng. 522 00:49:34,200 --> 00:49:41,880 F quét f là những gì bạn sẽ được sử dụng để quét qua từ điển. 523 00:49:41,880 --> 00:49:46,370 Và như vậy bạn không cần phải mã lên các giải pháp, chỉ cần cố gắng và thích giả mã theo cách của bạn 524 00:49:46,370 --> 00:50:05,200 một giải pháp, và sau đó chúng tôi sẽ thảo luận về nó. 525 00:50:05,200 --> 00:50:14,110 Và trên thực tế, kể từ khi tôi đã đưa cho bạn những, nếu bạn đi vào bất kỳ thiết bị đầu cuối hoặc vỏ của thiết bị của bạn, 526 00:50:14,110 --> 00:50:18,250 Tôi sẽ - Tôi thường - nếu bạn không nhìn thấy, tôi không biết nếu bạn đã làm trong lớp học, 527 00:50:18,250 --> 00:50:23,490 nhưng người đàn ông, do đó, các trang con người, là khá hữu ích để xem xét chức năng khá nhiều bất kỳ. 528 00:50:23,490 --> 00:50:27,330 Vì vậy, tôi có thể làm, như, người đàn ông f, quét f. 529 00:50:27,330 --> 00:50:32,300 Đây là các thông tin về gia đình f quét các chức năng. 530 00:50:32,300 --> 00:50:37,070 Tôi cũng có thể làm e người đàn ông, mở, và đó sẽ cung cấp cho tôi các chi tiết của điều đó. 531 00:50:37,070 --> 00:50:40,750 Vì vậy, nếu bạn biết chức năng bạn đang sử dụng, hoặc bạn đang đọc mã 532 00:50:40,750 --> 00:50:43,000 và bạn thấy một số chức năng và bạn đang như thế, "làm gì?" 533 00:50:43,000 --> 00:50:45,280 Chỉ cần người đàn ông đó tên hàm. 534 00:50:45,280 --> 00:50:47,340 Có một vài ví dụ kỳ lạ, nơi bạn có thể phải nói 535 00:50:47,340 --> 00:50:51,620 muốn. man 2 tên hàm, hay người đàn ông 3 tên hàm đó, 536 00:50:51,620 --> 00:50:58,230 nhưng bạn chỉ có để làm điều đó nếu tên người đàn ông chức năng không xảy ra để làm việc lần đầu tiên. 537 00:50:58,230 --> 00:51:03,010 [Sinh viên] Vì vậy, tôi đang đọc trang người đàn ông cho mở, nhưng tôi vẫn còn lẫn lộn về làm thế nào để sử dụng nó và chương trình. 538 00:51:03,010 --> 00:51:06,170 Okay. Rất nhiều các trang người đàn ông ít hơn hữu ích. 539 00:51:06,170 --> 00:51:08,470 Chúng hữu ích hơn nếu bạn đã biết những gì họ làm 540 00:51:08,470 --> 00:51:12,670 và sau đó bạn chỉ cần phải nhớ thứ tự của các đối số hoặc một cái gì đó. 541 00:51:12,670 --> 00:51:17,640 Hoặc họ có thể cung cấp cho bạn một tổng quan chung, nhưng một số người trong số họ là rất áp đảo. 542 00:51:17,640 --> 00:51:22,220 Giống như e f quét, cũng. Nó cung cấp cho bạn những thông tin cho tất cả các chức năng này, 543 00:51:22,220 --> 00:51:28,120 và 1 dòng xuống đây sẽ xảy ra để nói, "F quét f đọc từ điểm chuỗi hoặc dòng." 544 00:51:28,120 --> 00:51:32,360 Nhưng e mở. Vì vậy, làm thế nào chúng ta sẽ sử dụng e mở? 545 00:51:32,360 --> 00:51:38,470 Ý tưởng của một chương trình mà cần phải làm tập tin I / O là 546 00:51:38,470 --> 00:51:45,070 trước tiên bạn cần để mở các tập tin bạn muốn làm việc với, và chắc chắn, 547 00:51:45,070 --> 00:51:51,220 đọc những điều từ tập tin đó và làm công cụ với họ. 548 00:51:51,220 --> 00:51:55,350 F mở là những gì chúng tôi sử dụng để mở các tập tin. 549 00:51:55,350 --> 00:52:04,190 Điều chúng tôi nhận được trở lại, do đó, những tập tin nào chúng tôi muốn mở, nó cho chúng ta - 550 00:52:04,190 --> 00:52:11,970 ở đây nó nói "/ user / share / dict / words". 551 00:52:11,970 --> 00:52:16,740 Đây là tập tin mà chúng tôi muốn mở, và chúng tôi muốn để mở nó - 552 00:52:16,740 --> 00:52:21,440 chúng tôi có chỉ định rõ ràng cho dù chúng tôi muốn mở nó để đọc hoặc nếu chúng tôi muốn mở nó để viết. 553 00:52:21,440 --> 00:52:26,490 Có một vài kết hợp và các công cụ, nhưng chúng tôi muốn mở này để đọc. 554 00:52:26,490 --> 00:52:29,380 Chúng tôi muốn đọc từ tập tin. 555 00:52:29,380 --> 00:52:34,290 Vì vậy, trở lại này không những gì? Nó trả về một ngôi sao tập tin (*), 556 00:52:34,290 --> 00:52:37,260 và tôi sẽ chỉ hiển thị tất cả mọi thứ trong biến f, *, 557 00:52:37,260 --> 00:52:40,840 một lần nữa, nó là một con trỏ, nhưng chúng tôi không muốn để đối phó với con trỏ. 558 00:52:40,840 --> 00:52:46,470 Bạn có thể nghĩ của f, f là biến bạn đang sử dụng để đại diện cho các tập tin. 559 00:52:46,470 --> 00:52:49,850 Vì vậy, nếu bạn muốn đọc từ tập tin, bạn đọc từ f. 560 00:52:49,850 --> 00:52:54,820 Nếu bạn muốn đóng các tập tin, bạn đóng f. 561 00:52:54,820 --> 00:53:00,350 Vì vậy, vào cuối của chương trình khi chúng tôi chắc chắn muốn đóng các tập tin, những gì chúng ta nên làm gì? 562 00:53:00,350 --> 00:53:06,750 Chúng tôi muốn đóng f. 563 00:53:06,750 --> 00:53:12,600 Vì vậy, bây giờ là chức năng tập tin cuối cùng mà chúng ta sẽ muốn sử dụng là quét f, f quét f. 564 00:53:12,600 --> 00:53:20,930 Và những gì mà không là nó quét qua các tập tin tìm kiếm một mô hình cho phù hợp. 565 00:53:20,930 --> 00:53:39,100 Nhìn vào trang người đàn ông ở đây, chúng ta thấy int f quét f, bỏ qua giá trị trả lại cho bây giờ. 566 00:53:39,100 --> 00:53:45,230 Đối số đầu tiên là tập tin * dòng, do đó, đối số đầu tiên chúng ta sẽ muốn vượt qua là f. 567 00:53:45,230 --> 00:53:47,900 Chúng tôi đang quét qua f. 568 00:53:47,900 --> 00:53:53,680 Số thứ hai là một chuỗi định dạng. 569 00:53:53,680 --> 00:53:58,310 Tôi sẽ cung cấp cho bạn một chuỗi định dạng ngay bây giờ. 570 00:53:58,310 --> 00:54:05,180 Tôi nghĩ rằng chúng ta phải nói, 127s \ n, rất nhiều đó là không cần thiết. 571 00:54:05,180 --> 00:54:12,490 Ý tưởng về những gì mà chuỗi định dạng, bạn có thể nghĩ quét f như là trái ngược của f in. 572 00:54:12,490 --> 00:54:17,160 Vì vậy, in f, f in chúng tôi cũng sử dụng loại của tham số định dạng, 573 00:54:17,160 --> 00:54:25,000 nhưng trong f in những gì chúng tôi đang làm là hãy nhìn vào tương đương. 574 00:54:25,000 --> 00:54:32,550 Vì vậy, in f, và có thực sự là f in f, tham số đầu tiên là có được f. 575 00:54:32,550 --> 00:54:40,980 Khi bạn in f, chúng tôi có thể nói một cái gì đó như "in 127s \ n" và sau đó nếu chúng ta vượt qua nó một số chuỗi, 576 00:54:40,980 --> 00:54:44,050 nó sẽ in chuỗi này và sau đó là một dòng mới. 577 00:54:44,050 --> 00:54:49,690 127 phương tiện, tôi khá chắc chắn, nhưng tôi đã không bao giờ giới hạn bản thân mình để nó, 578 00:54:49,690 --> 00:54:52,470 Bạn thậm chí không cần phải nói '127 'trong f in, 579 00:54:52,470 --> 00:54:57,090 nhưng những gì nó có nghĩa là in 127 ký tự đầu tiên. 580 00:54:57,090 --> 00:54:59,350 Vì vậy, tôi khá chắc chắn đó là trường hợp. Bạn có thể Google cho điều đó. 581 00:54:59,350 --> 00:55:03,000 Tuy nhiên, trong một trong những tiếp theo tôi gần như tích cực nó có nghĩa là. 582 00:55:03,000 --> 00:55:08,880 Vì vậy, đây là in 127 ký tự đầu tiên, tiếp theo là một dòng mới. 583 00:55:08,880 --> 00:55:14,680 F quét f bây giờ, thay vì nhìn vào một biến và in ấn, 584 00:55:14,680 --> 00:55:22,620 nó sẽ nhìn vào một số chuỗi, và lưu trữ các mẫu vào biến. 585 00:55:22,620 --> 00:55:26,360 Hãy để thực sự sử dụng f quét trong một ví dụ khác. 586 00:55:26,360 --> 00:55:31,670 Vì vậy, hãy nói rằng chúng tôi đã có một số int x = 4, 587 00:55:31,670 --> 00:55:41,110 và chúng tôi muốn tạo ra một chuỗi làm bằng - muốn tạo ra các chuỗi 588 00:55:41,110 --> 00:55:44,250 đó là như thế, điều này sẽ đến muộn hơn nhiều, 589 00:55:44,250 --> 00:55:49,020 một cái gì đó giống như 4.jpg. 590 00:55:49,020 --> 00:55:51,870 Vì vậy, đây có thể là một chương trình, nơi bạn sẽ có truy cập tổng hợp, 591 00:55:51,870 --> 00:55:56,420 tổng hợp chống lại tôi, và bạn muốn lưu một loạt các hình ảnh. 592 00:55:56,420 --> 00:56:02,430 Vì vậy, bạn muốn lưu i.jpg, nơi mà tôi có một số lần lặp của vòng lặp của bạn. 593 00:56:02,430 --> 00:56:05,500 Vì vậy, làm thế nào để chúng ta làm cho chuỗi này cho rằng JPEG? 594 00:56:05,500 --> 00:56:11,720 Nếu bạn muốn in 4.jpg, chúng tôi chỉ có thể nói f in, d.jpg%, 595 00:56:11,720 --> 00:56:14,410 và sau đó nó sẽ in cho rằng JPEG. 596 00:56:14,410 --> 00:56:20,050 Nhưng nếu chúng ta muốn lưu 4.jpg chuỗi, chúng tôi sử dụng f quét. 597 00:56:20,050 --> 00:56:30,860 Vì vậy, string s - thực sự chúng tôi không thể nào nhân vật, char s, chúng ta hãy đi 100. 598 00:56:30,860 --> 00:56:35,400 Vì vậy, tôi chỉ tuyên bố một số mảng của 100 ký tự, 599 00:56:35,400 --> 00:56:39,830 và đó là những gì chúng ta chắc chắn sẽ được lưu trữ đó JPEG. 600 00:56:39,830 --> 00:56:47,920 Vì vậy, chúng ta sẽ sử dụng quét f, và định dạng, làm thế nào chúng tôi sẽ nói d.jpg% 601 00:56:47,920 --> 00:56:54,980 để in 4.jpg, định dạng này sẽ được% d.jpg. 602 00:56:54,980 --> 00:57:04,020 Vì vậy, định dạng là% d.jpg, những gì chúng ta muốn thay thế d% với x, 603 00:57:04,020 --> 00:57:06,590 và bây giờ chúng ta cần phải lưu trữ chuỗi một nơi nào đó. 604 00:57:06,590 --> 00:57:12,500 Và nơi chúng tôi đang đi để lưu trữ chuỗi này là trong mảng. 605 00:57:12,500 --> 00:57:21,640 Vì vậy, sau khi dòng này của mã, s, nếu chúng ta in f% s, biến s, 606 00:57:21,640 --> 00:57:26,280 nó sẽ in 4.jpg. 607 00:57:26,280 --> 00:57:38,930 Vì vậy, f quét f là giống như quét f, ngoại trừ bây giờ nó đang tìm kiếm trên tập tin này 608 00:57:38,930 --> 00:57:43,600 cho những gì để lưu trữ trong s. 609 00:57:43,600 --> 00:57:46,160 Đó là những gì đối số cuối cùng là có được. 610 00:57:46,160 --> 00:57:54,170 Chúng tôi muốn để lưu trữ - "Gia đình f Scan quét chức năng trong cả hai theo định dạng như thử dưới đây. 611 00:57:54,170 --> 00:58:02,450 Nếu bất kỳ được lưu trữ trong các điểm vị trí, bạn có thể quay trở lại - " 612 00:58:02,450 --> 00:58:12,910 Không, chúng tôi có thể là tốt. Hãy để tôi suy nghĩ cho một thứ hai. 613 00:58:12,910 --> 00:58:26,350 Vì vậy, quét f không - những gì heck là chức năng nào đó? 614 00:58:26,350 --> 00:58:31,650 Vì vậy, quét f không phải là đi để có một số nguyên và làm dot jpg. 615 00:58:31,650 --> 00:58:43,490 Nó sẽ [lầm bầm]. 616 00:58:43,490 --> 00:58:49,360 Lưu biến int trong chuỗi int C. 617 00:58:49,360 --> 00:58:55,940 Biến này là gì, hoặc chức năng này gọi là gì? 618 00:58:55,940 --> 00:59:04,950 Vâng. Đó có. Vì vậy, những gì tôi đã xác định cho bạn trước khi được in f s, 619 00:59:04,950 --> 00:59:09,820 - có ý nghĩa nhiều hơn nữa, lý do tại sao tôi nói rằng nó đã được nhiều hơn như f in. 620 00:59:09,820 --> 00:59:14,700 Scan f vẫn là loại như in f, nhưng s in f để quét nó 621 00:59:14,700 --> 00:59:17,510 và thay thế các biến và lưu trữ nó trong một chuỗi. 622 00:59:17,510 --> 00:59:19,620 Thay vì in ấn nó, nó lưu nó trong một chuỗi. 623 00:59:19,620 --> 00:59:25,070 Vì vậy, bỏ qua điều đó hoàn toàn. Bạn vẫn có thể nghĩ đến sự xác định định dạng như của f in. 624 00:59:25,070 --> 00:59:34,510 Vì vậy, bây giờ, nếu chúng ta muốn làm điều 4.jpg, chúng tôi sẽ làm in s f, x này. 625 00:59:34,510 --> 00:59:38,520 Vì vậy, những gì quét f được làm những gì đã được câu hỏi của bạn sẽ được? 626 00:59:38,520 --> 00:59:40,820 [Sinh viên] Tôi chỉ nhầm lẫn về những gì chúng tôi đang cố gắng làm ngay tại đây 627 00:59:40,820 --> 00:59:43,450 với JPEG. Bạn có thể giải thích thêm 1 thời gian? 628 00:59:43,450 --> 00:59:52,710 Vì vậy, đây là nó ít có liên quan đến f quét f bây giờ, hy vọng, nó sẽ buộc trở lại trong một số loại cách. 629 00:59:52,710 --> 01:00:02,240 Nhưng những gì tôi bước đầu đã có ý định để hiển thị - điều này thực sự liên quan trực tiếp đến [những? F5] 630 01:00:02,240 --> 01:00:08,520 Bạn sẽ được sử dụng f in s, ở đâu, nói rằng chúng ta có 100 hình ảnh, 631 01:00:08,520 --> 01:00:13,630 và bạn muốn đọc 1.jpg image, 2.jpg, 3.jpg. 632 01:00:13,630 --> 01:00:21,520 Vì vậy, để làm được điều đó, bạn cần đến f mở, và sau đó bạn phải vượt qua trong chuỗi mà bạn muốn mở. 633 01:00:21,520 --> 01:00:30,020 Vì vậy, chúng tôi muốn mở 1.jpg, để tạo ra các chuỗi đó là 1.jpg, 634 01:00:30,020 --> 01:00:37,660 f in chúng tôi làm s của% d.jpg chúng ta không làm cho int i = 0. 635 01:00:37,660 --> 01:00:46,580 i <40, i + +. 636 01:00:46,580 --> 01:00:51,130 Vì vậy, f in% s d.jpg của i. 637 01:00:51,130 --> 01:00:56,320 Vì vậy, sau khi đường dây này, bây giờ biến hoặc mảng sẽ 1.jpg. 638 01:00:56,320 --> 01:01:10,610 Hoặc, 0.jpg, 1.jpg, 2.jpg. Và vì vậy chúng tôi có thể mở, lần lượt, mỗi hình ảnh để đọc. 639 01:01:10,610 --> 01:01:19,550 Vì vậy, đó là những gì s in f không. Bạn có thấy những gì s in f hiện đang làm? 640 01:01:19,550 --> 01:01:25,720 [Sinh viên] Được rồi, do đó, nó dùng - nó tạo ra một chuỗi, something.jpg, và sau đó lưu nó. 641 01:01:25,720 --> 01:01:30,360 Vâng. Nó tạo ra - đây là một chuỗi định dạng, giống như quét f và f in, 642 01:01:30,360 --> 01:01:37,530 nơi nó chèn tất cả các biến vào đối số thứ hai, có thể là như trái ngược với tôi. 643 01:01:37,530 --> 01:01:42,280 Có lẽ - Ý tôi là, đó là trường hợp. Nhưng bất cứ điều gì, thứ tự của các đối số. 644 01:01:42,280 --> 01:01:45,440 Nó sẽ để chèn tất cả các biến vào chuỗi định dạng 645 01:01:45,440 --> 01:01:52,250 và sau đó lưu trữ vào bộ đệm của chúng tôi, chúng tôi gọi đó là một bộ đệm, nó là nơi chúng tôi đang lưu trữ các chuỗi. 646 01:01:52,250 --> 01:02:00,750 Vì vậy, chúng tôi đang lưu trữ bên trong của chuỗi định dạng một cách chính xác,% d đã được thay thế bằng 4. 647 01:02:00,750 --> 01:02:08,080 [Sinh viên] Vì vậy, nếu chúng ta làm điều này, là biến f sẽ được bố trí? 648 01:02:08,080 --> 01:02:18,110 Vâng. Vì vậy, chúng ta nên đóng f ban đầu trước khi làm điều này. 649 01:02:18,110 --> 01:02:22,810 Nhưng - và sau đó cũng có thể, nếu không có một e mở ra, sau đó chúng tôi sẽ cần phải nói - 650 01:02:22,810 --> 01:02:29,280 Yeah. Nhưng nó sẽ mở ra một trăm tập tin khác nhau. 651 01:02:29,280 --> 01:02:37,360 [Sinh viên] Nhưng chúng ta sẽ không có thể truy cập hoặc - okay. 652 01:02:37,360 --> 01:02:44,230 Okay. Vì vậy, quét f, f quét f, là loại cùng một ý tưởng, 653 01:02:44,230 --> 01:02:53,610 nhưng thay vì, thay vì lưu trữ nó vào một chuỗi, nó giống như bạn bây giờ 654 01:02:53,610 --> 01:03:02,420 đi qua một sting và mô hình phù hợp với chuỗi đó và lưu trữ các kết quả vào các biến. 655 01:03:02,420 --> 01:03:11,290 Bạn có thể sử dụng e quét để phân tích trên một cái gì đó giống như 4.jpg, và lưu trữ trong 4 số nguyên vào x int tổng hợp. 656 01:03:11,290 --> 01:03:13,430 Đó là những gì chúng ta có thể sử dụng e quét. 657 01:03:13,430 --> 01:03:16,300 F quét f sẽ làm điều đó tại dòng lệnh. 658 01:03:16,300 --> 01:03:19,200 Tôi thực sự đẹp, chắc chắn đây là những gì thư viện CS50 không. 659 01:03:19,200 --> 01:03:29,050 Vì vậy, khi bạn nói, "có được int", đó là quét e-ing qua - quét f là cách bạn có được người dùng nhập vào. 660 01:03:29,050 --> 01:03:34,670 F quét e là sẽ làm điều tương tự nhưng bằng cách sử dụng một tập tin để quét qua. 661 01:03:34,670 --> 01:03:41,090 Vì vậy, ở đây, chúng ta đang quét qua tập tin này. 662 01:03:41,090 --> 01:03:45,460 Mẫu, chúng tôi đang cố gắng để phù hợp với một số chuỗi dài là 127 ký tự 663 01:03:45,460 --> 01:03:48,100 tiếp theo là một dòng mới 664 01:03:48,100 --> 01:03:54,770 Vì vậy, tôi khá chắc chắn rằng chúng tôi thậm chí chỉ có thể nói "phù hợp với s," từ trong từ điển 665 01:03:54,770 --> 01:03:57,770 chúng tôi xảy ra để có, chúng tôi sẽ được bảo đảm từ không lâu, 666 01:03:57,770 --> 01:04:03,310 và cũng có thể f f quét, tôi nghĩ, sẽ dừng lại ở các dòng mới không có vấn đề gì. 667 01:04:03,310 --> 01:04:06,970 Nhưng chúng tôi sẽ bao gồm các dòng mới trong trận đấu, và - 668 01:04:06,970 --> 01:04:13,960 [Sinh viên] Nếu chúng ta không bao gồm các dòng mới, sẽ không tìm thấy các bộ phận của một từ? 669 01:04:13,960 --> 01:04:22,900 - Mỗi - nhìn từ điển - 670 01:04:22,900 --> 01:04:26,200 Vì vậy, trong từ điển, đó là tất cả các từ của chúng tôi. 671 01:04:26,200 --> 01:04:30,500 Mỗi một là trên một dòng mới. 672 01:04:30,500 --> 01:04:32,510 F quét được sẽ chọn từ này. 673 01:04:32,510 --> 01:04:38,750 Nếu chúng ta không bao gồm các dòng mới, sau đó nó có thể là f quét tiếp theo sẽ chỉ đọc những dòng mới. 674 01:04:38,750 --> 01:04:44,180 Tuy nhiên, bao gồm cả dòng mới sau đó chỉ cần bỏ qua dòng mới. 675 01:04:44,180 --> 01:04:49,440 Nhưng chúng ta sẽ không bao giờ có được một phần của một từ, vì chúng ta đang luôn luôn đọc một dòng mới, không có vấn đề gì. 676 01:04:49,440 --> 01:04:54,530 [Sinh viên] Nhưng nếu bạn tìm kiếm từ "cissa" như cissa. 677 01:04:54,530 --> 01:04:57,380 Nó sẽ tìm thấy điều đó, và nói rằng đó là một trận đấu? 678 01:04:57,380 --> 01:05:05,110 Vì vậy, ở đây chúng tôi - nó sẽ đọc trong - điều này thực sự là một điểm tốt. 679 01:05:05,110 --> 01:05:10,660 Chúng tôi sẽ không bao giờ sử dụng hiện nay - từ chúng tôi đang tìm kiếm các đối số dòng lệnh đầu tiên. 680 01:05:10,660 --> 01:05:16,460 Vì vậy, chuỗi, từ = argv 1. 681 01:05:16,460 --> 01:05:20,020 Vì vậy, các chuỗi chúng tôi đang tìm kiếm là argv 1. 682 01:05:20,020 --> 01:05:23,290 Chúng tôi không tìm kiếm một từ ở tất cả các trong f quét của chúng tôi. 683 01:05:23,290 --> 01:05:28,030 Những gì chúng tôi đã làm với quét f là nhận được mỗi từ trong từ điển, 684 01:05:28,030 --> 01:05:34,320 và sau đó khi chúng tôi có từ đó chúng ta sẽ sử dụng strcmp để so sánh chúng. 685 01:05:34,320 --> 01:05:39,210 Chúng ta sẽ so sánh các từ ngữ của chúng tôi và những gì chúng ta vừa đọc. 686 01:05:39,210 --> 01:05:45,110 Vì vậy, chắc chắn, chúng ta sẽ kết thúc làm một bó quét fs 687 01:05:45,110 --> 01:05:52,130 cho đến khi nó chỉ như vậy sẽ xảy ra mà quét f sẽ trở lại - 688 01:05:52,130 --> 01:05:54,800 nó sẽ trở lại một, miễn là nó đã xuất hiện một từ mới, 689 01:05:54,800 --> 01:06:01,360 và nó sẽ trở lại một cái gì đó khác ngay sau khi nó đã không thành công để phù hợp với từ. 690 01:06:01,360 --> 01:06:08,440 Chúng tôi đọc qua toàn bộ từ điển, lưu trữ từng dòng từng chữ vào biến s. 691 01:06:08,440 --> 01:06:17,240 Sau đó, chúng tôi đang so sánh từ với s, và nếu so sánh == 0, 692 01:06:17,240 --> 01:06:21,650 strcmp xảy ra để mang lại 0 nếu kết hợp đã được thực hiện. 693 01:06:21,650 --> 01:06:31,510 Vì vậy, nếu nó là 0, sau đó chúng tôi có thể in f, lần xuất hiện, 694 01:06:31,510 --> 01:06:35,370 hoặc một từ trong từ điển, hoặc bất cứ điều gì bạn muốn in f. 695 01:06:35,370 --> 01:06:41,450 Và sau đó chúng tôi không muốn để f gần hơn và hơn nữa. 696 01:06:41,450 --> 01:06:50,410 Đây là loại điều chúng tôi muốn làm, và chúng tôi không chỉ tìm kiếm từ trong từ điển. 697 01:06:50,410 --> 01:06:56,660 Vì vậy, chúng ta có thể làm điều đó, nếu chúng ta muốn tìm kiếm mô hình của họ, cissa, như bạn đã nói trước, 698 01:06:56,660 --> 01:07:00,260 nếu chúng ta muốn tìm kiếm mô hình mà, sau đó nó sẽ thất bại trong trường hợp 699 01:07:00,260 --> 01:07:08,010 bởi vì đó không phải là thực sự là một từ, nhưng một trong những từ trong từ điển xảy ra để có trong nó. 700 01:07:08,010 --> 01:07:13,560 Vì vậy, nó sẽ phù hợp với từ này, nhưng tập hợp con của từ này không phải là một từ chính nó. 701 01:07:13,560 --> 01:07:17,250 Nhưng đó không phải là làm thế nào chúng ta đang sử dụng nó, chúng tôi đang đọc trong mỗi từ 702 01:07:17,250 --> 01:07:19,740 và sau đó so sánh từ chúng tôi có với từ đó. 703 01:07:19,740 --> 01:07:25,780 Vì vậy, chúng tôi luôn so sánh từ đầy đủ. 704 01:07:25,780 --> 01:07:29,620 Tôi có thể gửi ra các giải pháp hoàn thiện sau đó. 705 01:07:29,620 --> 01:07:32,050 Đây là loại của câu trả lời gần đúng, tôi nghĩ. 706 01:07:32,050 --> 01:07:34,720 [Sinh viên bình luận, không thể hiểu] 707 01:07:34,720 --> 01:07:40,870 Ồ, tôi nhận được thoát khỏi đó trước khi? Char s, tôi đoán chúng tôi đã nói 127 - Tôi quên đi những gì lớn nhất là. 708 01:07:40,870 --> 01:07:44,100 Chúng tôi sẽ chỉ làm 128; vì vậy bây giờ s là đủ dài. 709 01:07:44,100 --> 01:07:46,570 Chúng ta không cần in bất cứ điều gì. 710 01:07:46,570 --> 01:07:56,440 Chúng tôi cũng muốn có để đóng tập tin của chúng tôi, và đó nên được về câu trả lời đúng. 711 01:07:56,440 --> 01:07:59,440 CS50.TV