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