[Powered by Google Translate] [Tuần 2, Tiếp tục] [David J. Malan, Đại học Harvard] [Đây là CS50. - CS50.TV] Được rồi. Đây là CS50, và điều này là cuối tuần thứ 2. Nếu bạn mong đợi để được đói khoảng thời gian này vào ngày mai, 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. URL này nếu bạn muốn RSVP. 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. Một URL, mặc dù, có thể được quan tâm này. Chỉ trong khoảng thời gian một tháng, các khóa học sẽ được làm sẵn có 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, tham gia vào các khóa học khá tích cực, trong thực tế. Họ sẽ sử dụng gia dụng CS50 và CS50 Thảo luận 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. 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 là để xem chúng ta có thể dịch bao nhiêu nội dung sang ngôn ngữ khác nói và viết. Vì vậy, nếu bạn có thể có một quan tâm đến tham gia trong dự án này 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 và quần soóc, hội thảo và các bộ phận và như thế, 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, 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, chuyển chúng thành một ngôn ngữ mà bạn biết khá tốt. Để 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 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. Điều này đã được tôi giảng dạy một số Halloween trước đây, và ở phía bên tay phải có màu đen bên cạnh các tem thời gian, 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 đó, và sau đó dưới nó bạn sẽ có thể để dịch sang một số ngôn ngữ khác 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. 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. 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. 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 có khả năng hàng ngàn folks ra có, xin vui lòng cảm thấy miễn phí để tham gia. Một từ về kitten từ thứ hai. 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 và như phần cho thấy, thiết kế của khóa học là rất nhiều 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 và các vấn đề với nhau, và thực sự dòng đi xuống đến, một lần nữa, công việc bạn cuối cùng trình của riêng bạn. Và như vậy khá trung thực, trong giờ hành chính, nó hoàn toàn bình thường, 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. Nếu người ấy đang đấu tranh với một số chủ đề và bạn giống như, "Ồ, 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, đ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. Khi đường thẳng bị vượt qua khi đầu là sắp xếp của nghiêng giây quá nhiều 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, và chắc chắn khi nhận được những điều trao đổi qua email và Dropbox và như thế, có quá dòng. 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è 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 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. Và như vậy, một trong những vấn đề tên miền cụ thể cho pset2, mà sẽ đến muộn vào đêm mai, là để nhảy vào thế giới của mật mã, đó là nghệ thuật mã hóa hoặc xáo trộn thông tin, và điều này cuối cùng liên quan đến thế giới của an ninh. 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. Tất cả chúng ta đều có tên người dùng và mật khẩu, 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. 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, như chúng ta sẽ thảo luận về phía cuối học kỳ. 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, 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. Và nếu bạn không sử dụng mật mã để mã hóa mật khẩu của bạn, họ đặc biệt dễ bị tổn thương. 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 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 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. Và vì vậy những gì pset2 sẽ giới thiệu này là nghệ thuật mật mã và xáo trộn thông tin để những thứ như mật khẩu an toàn hơn. Bối cảnh ở đây là với các dữ liệu không an toàn đến một cơ hội để mã hóa nó và để tranh giành nó. Và như vậy, ví dụ, là một ví dụ về một tin nhắn mã hóa. Đ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. 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ì. 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. 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 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. Ngày nay nó đã bị di chuyển đi nơi khác. 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 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ọ. Thật vậy, hầm mộ, từ đó cho thấy rằng những thứ sau đây là mã hóa, 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 có thể được giải mã chỉ bằng cách nói chung biết một số bí mật một từ bí mật, một số bí mật - 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 và biết một cái gì đó mà người khác không. 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. Và bây giờ là một từ pass / thất bại. Điều đặc biệt là một số bạn đã lặn xuống pset1, gia dụng, 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 và chỉ khó khăn về kỹ thuật rất được mong đợi, đặc biệt là với pset đầu tiên, nơi có rất nhiều mới, chỉ nhận được quen thuộc với ls và cd và tất cả các lệnh phức tạp 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ự. 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ợ. Phần bắt đầu vào chủ nhật tới. 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, nhận ra rằng nó thực sự chỉ cần mất thời gian. 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, trung thực, tôi sẽ không bao giờ thậm chí còn đặt chân trong lớp học. 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, 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, tôi chắc chắn xem xét chỉ cần thay đổi để vượt qua / không. 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 kể từ khi tất cả mọi người thực sự muốn đạt được hoặc khẳ, nhưng thẳng thắn, đây là một cách tuyệt vời cố gắng một cái gì đó 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, có lẽ nhiều ngạc nhiên của bạn. 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, đặc biệt là khi bạn có thể đã có kinh nghiệm với pset0, nếu bạn đặt trong 10 giờ, 15 giờ, 25 giờ vào một số pset 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 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, 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, 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, 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 ", và điều đó sẽ đáp ứng sự mong đợi vượt qua / thất bại. Vì vậy, giữ cho rằng trong tâm trí. Được rồi. 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, biết rằng có một SSID CS50, một kết nối Wi-Fi, nổi xung quanh mà bạn có thể có may mắn hơn. Đó 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 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 vì 8 là an toàn hơn hơn 5. 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, 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, 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. 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. 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, chỉ để loại cụ thể hơn và phức tạp hơn một số cơ bản C chương trình chúng tôi đã viết. 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. Ở 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. 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. Ô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, đ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. Khi bạn muốn jailbreak iPhone phiên bản gốc, có nghĩa là untether nó từ AT & T 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, 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, những sai lầm, lỗi, trong phần mềm Apple, và do đó được sinh ra iUnlock.c - 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 đã đượ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, đ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 và cho phép bạn làm khá nhiều bất cứ điều gì bạn muốn. Và như vậy có được mèo này hấp dẫn và trò chơi chuột 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, 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. 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 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 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 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. 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, nhưng GetVersion âm thanh khá đơn giản, và có vẻ như thế này là một chức năng mà người này đã viết. 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ì, 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, 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, mặc dù rất nhiều các từ khóa này sẽ là mới. 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 trong quá trình của học kỳ. 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. 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, 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. Chúng ta hãy xem xét một ví dụ nhỏ đơn giản hơn: 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 mà chúng tôi đã nói chuyện về nhưng đã không thực sự nhìn thấy trong C. Đây là một tập tin gọi là positive1.c, và theo các ý kiến ​​ở trên cùng, điều này chỉ yêu cầu người dùng cung cấp một số dương. 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 khi bạn cần phải nói cho người dùng để làm một cái gì đó, 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ọ. Trường hợp tại điểm: Tôi sẽ làm dòng từ 19 đến 24 miễn là người dùng đã không cho tôi một số dương. 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 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. [Sinh viên] Phạm vi. >> Yeah, do đó, vấn đề này phạm vi. Và trong điều khoản của layman, phạm vi những gì tham khảo? Yeah. >> [Không nghe được sinh viên phản ứng] >> Bạn có thể nói một chút to hơn? [Sinh viên] Nơi bạn có thể truy cập biến đó. >> Perfect. Nơi bạn có thể truy cập vào một biến cụ thể. 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 được xác định bởi dấu ngoặc nhọn gần đây nhất mà bạn đã nhìn thấy. 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. Tôi sẽ nhận được một int, và tôi sẽ đặt nó vào đó n biến ở dòng 22, 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. [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. 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 ngoài các chức năng chính nó. 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 và thậm chí bạn có thể nhận được một chút lười biếng. 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 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, 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. Đ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, như chúng ta cuối cùng sẽ thấy. 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 chỉ để bắt đầu thể hiện bản thân mình một chút khác nhau. Chương trình này, chỉ để được rõ ràng, là positive1. 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. Biên dịch okay. Tôi sẽ chạy positive1, nhấn Enter. 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. 0, 99. Điều đó dường như làm việc. 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 mà chúng tôi đang đi đúng hướng. 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, và những gì là khác nhau chưa? 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? 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. Nó không đến được xây dựng trong tất cả các phiên bản của C. Bạn cần phải bao gồm một thư viện cụ thể. 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. 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. Tôi đã có thể gọi là bất cứ điều gì, nhưng tôi gọi nó là biết ơn chỉ để loại truyền đạt một số ý nghĩa ngữ nghĩa. Vì vậy, ban đầu trên dòng 18, tôi dường như không biết ơn bởi vì giá trị Boolean biết ơn được khởi tạo là sai ở dòng 18. 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 là tôi đã chỉ cần loại viết lại logic của tôi. 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 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. 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. Làm điều này trong khi vòng lặp biết ơn là sai. Vì vậy, tôi đề nghị này như là một thay thế cho phiên bản 1 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. 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. Và lần này cũng dường như không quan tâm để nhớ những gì người dùng gõ 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ó. 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ó bởi vì tôi không nhớ n là gì. Nhưng tôi muốn chứng minh ở đây là mặc dù chúng tôi đã nhìn thấy getInt 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 để chúng ta nhớ giá trị, kỹ thuật, đó không phải là thực sự cần thiết. Nếu vì lý do gì bạn không quan tâm để lưu các giá trị, 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, mở paren, gần paren. Chức năng sẽ trả về một giá trị, như chúng ta đã nói. Nó sẽ cung cấp cho bạn trở lại một int. Và vì vậy nếu bạn có tinh thần nghĩ rằng điều này xảy ra, khi tôi gõ trong 99, getInt trả về số 99, và như vậy khái niệm, nó như là mặc dù mã của tôi đã thực sự. 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, 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, 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!" bất cứ điều gì xảy ra để được. Bây giờ chúng ta hãy làm nhẹ đường cú pháp ở đây, vậy để nói chuyện. 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. Chú ý sự khác biệt bây giờ chỉ là những dòng mã? >> [Sinh viên] 25. >> [Malan] Yeah, 25. 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, mà biểu thị những gì? >> [Sinh viên] Không phải. >> Không hoặc phủ định. Vì vậy, một giá trị Boolean và lật giá trị của nó. Đúng sai, sai trở thành sự thật. 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ã bởi vì tôi vẫn khởi tạo cảm ơn để sai, tôi vẫn làm như sau, Tôi đặt cảm ơn đúng sự thật khi thời gian đến, 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, trong khi (cảm ơn); vì nổ hoặc dấu chấm than biểu thị khái niệm về không, do đó, trong khi không biết ơn. 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. Chúng tôi nói về Booleans trở lại khi chúng tôi chơi với Scratch, 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. 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, 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 mà bạn có thể xảy ra khi. 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. 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. 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; nó cũng có chức năng riêng tùy chỉnh của nó mà tôi đã viết ở đây. 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. Nó không phải phức tạp. Nó chỉ là một * a * a trong trường hợp này. 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 và tôi trở lại sản xuất theo hình thức a * a * a. 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, để 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. 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. Ngược lại, printf chỉ cần làm một cái gì đó. 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ị; bạn chỉ nói chung bỏ qua nó. 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. 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ì đó. 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. 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, chúng ta hãy thử đơn giản chỉ là cái gì đó siêu. Có ai thoải mái trên sân khấu một thời gian ngắn? Bạn có để được thoải mái với một máy ảnh trên bạn cũng. Yeah? Okay. Tên của bạn là gì? >> [Sinh viên] Ken. >> Ken. Được rồi. Ken, đi lên trên. Ken sẽ là một chức năng của các loại ở đây. Hãy cho đi trước và làm điều này. Hãy để có được một ưa thích ít. 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. Hãy nhấn nút này ở đây. Được rồi. Vì vậy, ở đây bạn có một bảng đen hiện đại, và những gì tôi là các chức năng chính, ví dụ, và tôi không có một chiếc iPad trong tay tôi. Tôi thực sự không nhớ làm thế nào để - Vâng, tôi không thể nói rằng. Tôi không thực sự có chữ viết tay tốt, 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. Tôi đang được chương trình chính, và tôi sẽ có bạn nói điều này bằng cách viết nó trong đầu con gà của tôi và sau đó đi qua một đầu vào. 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 và trả về một chức năng thực sự nắm xuống này. 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, Tôi đang chạy chương trình này, và ngay sau khi printf được gọi là, phải mất một đối số hoặc một tham số đôi khi giữa dấu ngoặc kép. Đây là lập luận rằng. Tôi đang đi qua nó để Ken. Ông là một hộp đen bằng văn bản một số số năm trước mà dường như chỉ biết làm thế nào để in những thứ trên màn hình. Vì vậy, thực hiện. Đó không phải là xấu. Rất tốt. 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? Không phải là chúng ta đã thấy cho đến nay. 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ờ bởi vì chúng tôi đã không bao giờ sử dụng nó. Vì vậy, đó là nó cho Ken. 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 bởi vì đó là dòng mã, printf, được thực hiện thực hiện. 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. Vì vậy, bây giờ chúng ta hãy thử một ví dụ hơi khác nhau. 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, nhưng lần này, tôi mong đợi một giá trị sản lượng. Vì vậy, chúng ta hãy đi trước và làm điều này. 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. Các dòng mã, thu hồi, trông như thế này: x = cube (x); 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. Tôi sẽ viết ngay bây giờ giá trị của x, 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. 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. 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. Okay. Và bây giờ ông đã trả lại cho tôi một cái gì đó. Hoàn hảo. Đẹp segue. 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ó? 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ó? 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ớ. Nhưng hãy chú ý tôi là loại đấu tranh ở đây. 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, 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, là x, và quả thật, đó là chính xác những gì đã xảy ra. 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 như hello, thế giới hoặc bạn vượt qua trong một cuộc tranh cãi như 2, nói chung, bạn đang đi qua trong một bản sao của đối số đó. Và như tôi đã viết xuống số 2 ở đây và đưa nó đến Ken 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 đó 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 và thực sự viết xuống 8 nơi mà tôi đã từng có số 2. 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ị. 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 - 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. 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. Cảm ơn bạn rất nhiều cho bản demo này ở đây, Ken. [Vỗ tay] Thực hiện rất tốt. 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. Hãy để tôi đi trước và mang lại cho chúng ta trở lại ví dụ cubing ở đây. Chú ý rằng nếu chúng ta muốn thực sự bắt đầu này thêm nữa, 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 là khác nhau từ những gì thực sự được thông qua vào chức năng, nhiệm vụ. 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. 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. 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, và nó được gọi là buggy3 và nó thực hiện một chức năng trao đổi. Ở đâ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. 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, do đó, nó cứng mã hóa là 1 và 2. 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. 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. 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ố. 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ó đã. Vì vậy, trao đổi rõ ràng có x và y, và như tên gọi của nó, Tôi hy vọng rằng nó sẽ trao đổi 2 giá trị này. 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 theo giả định rằng họ đã thực sự được đổi chỗ. 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, 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 bởi vì khi tôi nhấn Enter, nhận thấy rằng x là 1, y là 2, 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. 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? 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. 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ì? Trao đổi chia Tại sao? [Sinh viên] Bạn đang lưu trữ một bản sao, không phải là biến. 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. Nói cách khác, trao đổi dường như mất 2 đối số, một int, và nó tùy tiện được gọi là a và b, và ở đây tôi đã được thông qua trong x và y, tương ứng 1 và 2, 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, Tôi đang đi qua một bản sao của x và một bản sao của y. Nó gần như là mặc dù bạn đã sao chép và dán vào trao đổi các giá trị mà bạn muốn nó thực sự thao tác. 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, 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ì? 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. [Malan] Nó chỉ nên là 1, phải, bởi vì x đã được thông qua như là đối số đầu tiên, và chức năng này chỉ tùy tiện gọi là đối số đầu tiên của nó. 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. Sự phân đôi này thực sự khá đơn giản giải thích. Hãy suy nghĩ về nó. Không ai trong chúng tôi đã gặp người đã viết printf, 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à. 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 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. Vì vậy, nói cách khác, tôi đã viết biến của tôi là x và y, 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 biến của tôi sẽ được gọi là, để 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. 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, nhưng họ vẫn sẽ được thông qua như là bản sao. 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 đã sử dụng cùng một tên. 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. 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. Tôi không biết những 3 dòng mã đã làm. Hãy để tôi chỉ làm điều này: b = a; a = b; thực hiện. Tại sao điều này bị phá vỡ, một cách logic không? Đó là trong những điều trực quan, phải không? Vì vậy, trở thành a, b và b trở thành một, 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ì? 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. 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 bên trong của chức năng này, do đó, sau đó khi bạn nói trong dòng 38 a = b, bạn đang hơi say bởi vì bạn chỉ cần gán 1 đến 1. Bạn đã bị mất giá trị mà bạn quan tâm. 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. Tôi thay vào đó đã có một dòng thứ ba của mã trông như thế này. Tôi tuyên bố một biến tạm thời. 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 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. 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, giá trị của một là nhanh chóng kiểm tra sanity - 1, giá trị của b là 2, và giá trị của tmp cũng là 1. Vì vậy, bây giờ tôi thực hiện dòng 38. 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. 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, 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. Vì vậy, chúng tôi đã giải quyết vấn đề đó. 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ị. Tuy nhiên, để được rõ ràng, tại sao? Tôi cố định các vấn đề hợp lý từ chỉ một khoảnh khắc trước đây, 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 vào cuối thực hiện của chương trình. [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. Nhưng hóa ra có một chút của một vấn đề ở đây vì vậy, đến nay, đ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. 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 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, nhưng tôi muốn cả hai trở lại. Vì vậy, trở lại là không phải là giải pháp đơn giản ở đây. Nhưng vấn đề về cơ bản là lý do tại sao? Chúng ta đã thực sự đổi chỗ? [Sinh viên] a và b. >> A và b. 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, 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, và đó là tuyệt vời, hoàn toàn chính xác trong sự cô lập, nhưng a và phạm vi của b duy nhất là trong những dòng này ở đây. 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, 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, 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 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ả. 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. Vì vậy, nó chỉ ra rằng giải pháp này là thực sự không rõ ràng. Đó 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ị, và tôi thực sự muốn trao đổi cả x và y cùng một lúc, vì vậy chúng tôi sẽ phải trở lại này. 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 và họ đang có trong phạm vi của riêng mình. Hãy cố gắng giải quyết vấn đề này một cách nào đó. 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. Điều gì về điều này? Đâ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ó. 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. Sau đó tôi cho x là 1, Sau đó tôi yêu cầu bồi thường "Tăng dần ..." 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, 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. Vấn đề là gì? Yeah. >> [Không nghe được sinh viên phản ứng] >> Chính xác. Vì vậy, x đã được khai báo, rõ ràng, trên dòng 18. Đó là bên trong dấu ngoặc nhọn chính. Vì vậy, câu trả lời đơn giản ở đây là trong khi x tồn tại ở đây, 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. 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 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ử. Điều này là làm cho buggy4. Có nó được. Sử dụng 'x' không khai báo định danh ở dòng 32. 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 trong giờ làm việc và ở nhà. Chú ý rằng nó là một chút khó hiểu bằng văn bản. 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. Nó có nghĩa rằng lỗi này là trên đường 32 ở 5 vị trí ký tự. Vì vậy, 1, 2, 3, 4, 5. Đó là, trên thực tế, nơi mà vấn đề là. 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. Tôi có một sai lầm. Nó sẽ là tương đối dễ dàng để sửa chữa. 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á, 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. Vì vậy, luôn luôn đuổi xuống lỗi của bạn từ trên xuống bởi vì chỉ có thể là một chuỗi daisy hiệu lực được cho thấy bạn có vấn đề cách hơn bạn thực sự làm. 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. Được rồi, vì vậy chúng tôi có thể làm cho x toàn cầu. 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, 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. Vì vậy, bây giờ chính có truy cập vào nó và tăng truy cập vào nó, và để cho tôi đi trước và biên dịch này ngay bây giờ. Hãy buggy4, Enter. Có vẻ để biên dịch ngay bây giờ. Hãy để chạy buggy4. Và có vẻ như thực sự làm việc. Đâ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, như tôi đã chỉ cần thực hiện ở đây, vì nói chung, 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, 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, rất nhanh chóng làm các chương trình nhận được horrifically khó quản lý. Nó được còn khó nghĩ ra tên biến mới, nó bị khó khăn hơn để hiểu những gì biến là làm những gì, và do đó, nói chung, điều này không phải là một giải pháp tốt. Vì vậy, hãy làm điều này tốt hơn. Chúng tôi không muốn sử dụng một biến toàn cầu ở đây. Tôi không muốn để tăng x, vì vậy tôi có thể rõ ràng - 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 - 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, 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? Làm thế nào để thay đổi điều này ở đây? Yeah. [Sinh viên] Pass trong x và sau đó trở về không nghe được] >> Được rồi, tốt. Vì vậy, tại sao tôi không vượt qua trong x và sau đó thay vì trả lại, tại sao tôi không chỉ cần trả về x + 1. Một cặp vợ chồng phải thay đổi ở đây. Tôi đang đi đúng hướng. Những gì khác tôi cần tinh chỉnh không? Người khác. Yeah. [Không nghe được sinh viên phản ứng] 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. Void không có gì, phương tiện được trả lại, nhưng rõ ràng bây giờ nó là, do đó, điều này cần phải thay đổi - >> [sinh viên] int. int là phù hợp với bất cứ điều gì tôi đang thực sự trở lại. Bây giờ cái gì khác là vẫn còn lỗi ở đây. Yeah. [Không nghe được sinh viên phản ứng] >> [Malan] Vì vậy, tôi cần phải tăng x? [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. 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] Malan] Vì vậy, các mẫu thử nghiệm, tôi phải thay đổi này tại đây. Vì vậy, điều này đã trở thành một int, điều này đã trở thành - hmm, tôi thực sự có một lỗi ở đây. Hãy để sửa lỗi này đầu tiên. Điều này sẽ thực sự là gì? Nó có phải là một cái gì đó int. 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, nó sẽ nhận được ít hơn và ít rõ ràng hơn được mà. 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, 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ó - Hãy gọi nó là số thậm chí còn rõ ràng hơn. 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, và bây giờ tôi phải thay đổi 1 điều khác ở đây và một điều khác ở đây. 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] Malan tôi phải gán nó vào x. Tôi không thể gọi tăng (x). 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. Và mặc dù x là bây giờ trái và phải, đó là hoàn toàn tốt 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 - x trong trường hợp này. Và rồi cuối cùng, đây là một sửa chữa dễ dàng. Điều này chỉ nên phù hợp với những gì xuống dưới đây, số int. 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 nhưng đại diện của những điều mà chúng ta ngày càng sẽ muốn làm. Vì vậy, hãy buggy4. Tôi đã hơi say lên một nơi nào đó. Oh, Thiên Chúa của tôi. Năm sai lầm trong một chương trình dòng 6-. Vì vậy, những gì sai trái trên dòng 18, nhân vật của 5? Vì vậy, tôi phải khai báo int,. Hãy xem. Có một bó toàn bộ các lỗi khác. 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, và chạy lại kêu vang. Vì vậy, 5 vấn đề thực sự là chỉ là 1. 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. Được rồi. Bất kỳ câu hỏi về việc làm thế nào để tăng số? Yeah. [Sinh viên không nghe được câu hỏi] >> Câu hỏi hay. 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? Một lần nữa, hãy nghĩ về nó như là trừu tượng này. 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. 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. Đây là một chi tiết thực hiện mà tôi, chính, không phải quan tâm đến. 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 - là tất cả phải mất quá lâu như tôi biên dịch lại. Đó 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 đã thúc đẩy hoặc nếu bạn đã thậm chí lái xe trong một chiếc xe, 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. Và nghĩa đen, nếu bạn mở mui xe, hầu hết chúng ta - trong đó có tôi - sẽ không thực sự biết những gì chúng tôi đang tìm kiếm tại, 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ờ. Nhưng chúng tôi không thực sự có để chăm sóc xe hoạt động như thế nào, 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 đang thực sự làm. 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. Yeah. >> [Câu hỏi sinh viên không nghe được] Nếu có sử dụng trong những thời điểm xa biến trước đây, bạn, các lập trình viên, sẽ phải thay đổi chúng ở khắp mọi nơi. 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ế - nhưng bạn sẽ phải tự mình thực hiện những thay đổi. Bạn có phải là phù hợp. >> [Sinh viên] Nếu có nhiều biến [không nghe được] 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. [Malan] Yeah. Thứ tự quan trọng khi bạn đang gọi chức năng. 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ì đó, có một ánh xạ trực tiếp. 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. Xin lôi. Điều này không phải là một dấu ngoặc đơn. Đố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. Xin lôi. Tôi lấy chặng đường dài để đến đó. Các câu hỏi khác? Được rồi. 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 bên dưới mui xe, do đó, để nói chuyện. Đâ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. 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, ít nhất là cho rằng bạn có chùm của nó những ngày này. Bạn đã có MB của nó, bạn đã có GB của nó, và chúng tôi biết từ tuần 0 byte chỉ là những gì? >> [Sinh viên] 8 bit. 8 bit, phải không? Vì vậy, 8 zero và 1. 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, bạn có một tỷ hoặc 2 tỷ byte của bộ nhớ hoặc khoảng 8 tỷ 16 tỷ bit bên trong máy tính của bạn. 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. Ngày càng trong máy tính xách tay ít nhất - đó là ổ đĩa trạng thái rắn, ổ SSD, 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. 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ó. Vì vậy, đó là một đoạn bộ nhớ. Thế giới của khoa học máy tính đã loại phân vùng những phần bộ nhớ để làm những việc khác nhau. 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 đó, 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, nói chung là những gì được gọi là một đoạn văn bản. Đó là 0 và 1 mà bạn đã biên soạn. Vì vậy, khi chúng tôi đã xem xét bên dưới mui xe a.out là gì, tất cả các số 0 và 1, khi bạn chạy một chương trình, 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, và trong RAM họ đang đặt ở đầu trang. Trong khi đó, bạn có những thứ khác: khởi tạo dữ liệu, uninitialize dữ liệu. 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ử nhưng đôi khi nếu bạn làm, họ kết thúc ở đó là tốt. 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, nhưng sau đó 2 điều quan trọng mà sẽ trở lại trong suốt học kỳ, stack và heap. 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 cho một cái gì đó được gọi là ngăn xếp và một cái gì đó gọi là đống. Chúng tôi sẽ không nói về heap, nhưng chúng ta sẽ nói về stack. 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 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, họ ngăn xếp chúng lên từ sàn trở lên, 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, đặt một cái gì đó trên một chồng, đặt một cái gì đó trên một chồng. Và chúng tôi làm những gì có nghĩa là bằng cách này? 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, đề nghị sau đây. Nó chỉ ra rằng khi bạn chạy một chương trình như a.out hoặc hello - bất cứ chương trình mà bạn đã viết - 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, vẫn ở đó ngay cả khi bạn rút phích cắm, được nạp vào bộ nhớ RAM. RAM là nhanh hơn so với ổ đĩa cứng - đó là nhỏ hơn so với các ổ đĩa cứng - nhưng đó là nơi mà các chương trình sống trong khi bạn đang chạy. 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. Ngay sau khi nó đã được nạp vào bộ nhớ RAM, đi 0 và 1 ở đầu đường, 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, 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, và nó có ints và chuỗi ký tự và các loại tương tự. 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 sử dụng một số các biến bên trong của chính, họ kết thúc ở dưới cùng của ngăn xếp bộ nhớ, do đó, để nói chuyện. Cụ thể hơn, điều này không những gì thực sự có nghĩa là gì? Đ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, 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, 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. 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, 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ớ. 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, nơi nào họ kết thúc trong bộ nhớ? 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. Nhưng những gì thú vị bây giờ là khi gọi một chức năng - giả sử một chức năng được gọi là foo, chỉ là một tên tùy ý - những gì xảy ra là chính là ở dưới cùng của ngăn xếp bộ nhớ; foo bây giờ được đặt trên đầu trang của chính trong bộ nhớ. 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. 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. Nếu thanh gọi là cái gì khác, ở đây, ở đây, ở đây. 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 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, bạn xây dựng chồng này của các chức năng trong bộ nhớ. 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. 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 là để viết các chức năng mà không bao giờ trở lại. Vì vậy, ví dụ, chúng ta hãy chứng minh với một chương trình lỗi cố ý. Hãy để tôi đi trước và # include, int main (void), 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, và để cho tôi đi trước và làm printf. Trên thực tế, điều đó sẽ được ít trực quan thú vị. Hãy làm điều này. Đối với int i = 0; i> 0 - chúng ta hãy làm cho sai lầm - i + +. Và chúng ta không printf đây. Hãy thực hành những gì tôi đang giảng dạy. 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, 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. 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). Được rồi. Vì vậy, đây là lỗi vì lý do tại sao? 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. Nhưng đó không phải là mục tiêu. 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? 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. 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. Cuộc gọi chính điệp khúc hát một số đoạn điệp khúc, 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 bởi vì tôi cho rằng một người nào khác để thực hiện nó có thể, 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ì? Tôi cần các mẫu thử nghiệm, hãy nhớ. Vì vậy, tôi cần phải có điệp khúc khoảng trống (int i); 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. Hãy cho đi trước và làm cho đoạn điệp khúc. Hãy cho đi trước và làm cho đoạn điệp khúc. Sử dụng định danh không khai báo i. Ồ, đó là ngu ngốc. Chúng ta không cần tranh luận. Hãy chỉ làm điều này. 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. Ở đó. 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. Đó là thực sự nhanh chóng. Điều gì thực sự xảy ra, mặc dù? Vâng, bây giờ tôi sẽ thêm dòng in, do đó chúng ta có thể nhìn thấy. Hãy để tôi nói printf ("Tôi ở đây") - không có biến. Chúng tôi sẽ để nó như thế. Hãy để tôi chạy lại thực hiện. Hãy để tôi chạy lại điệp khúc. Và ... thôi nào. Tiếp tục đi. Một sang một bên, tại sao nó không bị rơi chưa? Lỗi phân khúc xảy ra siêu nhanh trước đây. [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? Nó chỉ mất thêm công việc trên một phần của máy tính. Và đó là: Segmentation fault. Vì vậy, nhận thấy chương trình nhanh chóng chạy như thế nào. Nếu bạn không in bất cứ điều gì, siêu nhanh. 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? Nếu bạn nghĩ về bộ nhớ máy tính của bạn như thế nào được đặt ra, đ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. 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, đ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? 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? Ngăn xếp vượt heap. 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, đó là 0 và 1 đại diện cho chương trình của bạn. Trong ngắn hạn, điều này chỉ là siêu, siêu xấu. Chương trình của bạn đã nằm ngoài vòng kiểm soát. Bạn đang sử dụng bộ nhớ cách nhiều hơn bạn dự định tất cả vì một sai lầm ngu ngốc trong trường hợp này, 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ó. Bây giờ, đây không phải là tất cả xấu. 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. Tôi đã không được sử dụng nó một cách chính xác ở đây. 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 là một điểm yếu cơ bản ở đây của chương trình này. 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? Khi tôi gọi chức năng tăng như chúng tôi đã làm trong những ví dụ, Tôi có một giá trị như 1 mà tôi vượt qua. Tôi vượt qua trong một bản sao của số 1, vì vậy sau đây xảy ra. Hãy đi vào ví dụ tăng, anh chàng này ngay trên đây. Dưới đây là những gì thực sự xảy ra. 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. Nếu tôi có giá trị của 1 lưu trữ ở đây và tôi thực sự gọi tăng, mà bây giờ được gọi là điệp khúc - iPad là ném tôi ra khỏi đây. 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. 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ớ được lưu trữ số 1. Khi tôi gọi tăng, tôi đang sử dụng một đoạn bộ nhớ, nhưng bây giờ tôi có bản sao của 1. Khi tôi tăng giá trị đó, điều này trở thành 2, nhưng sau đó điều gì sẽ xảy ra ngay sau khi trở lại tăng? Bộ nhớ này chỉ được bàn giao lại cho hệ điều hành, có nghĩa là tất cả những gì bạn đã làm là không có gì hữu ích. 1 đầu tiên được chứa trong chính vẫn là thực sự có. Vì vậy, chúng ta sẽ có điều này? Nó chỉ ra rằng trong bộ nhớ, bạn có back-to-back chuỗi byte 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ì đó liên quan đến việc đưa mọi thứ trở lại trở lại để sao lưu để sao lưu. Một chuỗi dựa trên tuần 1 và tuần bây giờ 2 là gì? Nó chỉ là một tập hợp các ký tự. Vì vậy, nó quay ra cũng giống như bạn có thể đặt số điện thoại trong bộ nhớ, tương tự như vậy bạn có thể đặt các ký tự trong bộ nhớ. 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, 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, 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 và bắt đầu xoa bóp chúng thành các nhân vật khác nhau hoàn toàn - có thể trở thành b, b có thể trở thành c - để cuối cùng, chúng ta có thể có một câu tiếng Anh mà thực sự có ý nghĩa và chuyển đổi của những bức thư tại một thời điểm 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. Vì vậy, chúng ta hãy nghỉ năm phút của chúng tôi ở đây, 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. Được rồi. 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, 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 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ể. 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, 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, 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, từ dưới lên, mỗi khay được đặt trên stack đại diện cho một chức năng được gọi là. Bất kỳ câu hỏi nào? Hãy để tôi hỏi một câu hỏi ở đây. 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. Thực tế là tăng có dấu ngoặc đơn mở, int number, đóng ngoặc - int number đại diện cho những gì? [Sinh viên] Một lập luận. >> Một lập luận. Okay. Nhưng lập luận là gì? [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. Đượ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. 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 là để làm một cái gì đó một chút khác nhau mỗi khi bạn sử dụng nó, 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 để nó có thể làm một cái gì đó khác nhau với đầu vào mà mỗi lần. Vì vậy, bạn cần phải xác định hai điều khi một hàm có đầu vào. Bạn cần xác định tên mà bạn muốn cung cấp cho đầu vào hoàn toàn cho thuận tiện của riêng của bạn để bạn có thể tham khảo trong các chức năng chính bạn viết, như tôi đã làm ở đây ở dòng 32. 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 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, phần lớn để nó biết bao nhiêu bit để phân bổ cho biến đó vì nó có thể là 6 - xin lỗi, nó sẽ không là 6. Nó có thể là 16, nó có thể là 8, nó có thể là 32, thậm chí 64, nhưng máy tính cần biết. Bây giờ, int trên phía bên tay trái đại diện cho những gì, ngược lại? [Sinh viên phản ứng không nghe được] >> đó là gì? >> [Sinh viên] Loại chức năng. 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. 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ó, điều bên trái đại diện cho đầu ra của nó. Và trong trường hợp này, tăng dường như trả về một int, và do đó, int là kiểu trả về của chức năng này. Để trở về có nghĩa là gì? 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 ở bên phải của từ khóa là một số nguyên, thì đó là thật sự phù hợp với những gì chúng tôi đã hứa. 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. Rõ ràng, đó không phải là một số nguyên. 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ể như những gì chúng tôi đang trở về và sau đó thực sự đi về trả lại nó. Bối cảnh ở đây là bộ nhớ máy tính của bạn là một GB, 2 GB - bất cứ điều gì - có thể nó nhiều hơn, có thể ít hơn, nhưng máy tính xem nó như là có phần khác nhau. Một cái gì đó đi xuống, một cái gì đó khác đi lên đó, 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, nhưng chúng tôi sẽ quay trở lại thời gian này. Để 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 bởi vì đó chỉ đại diện cho Clang 0 và 1 đã đưa ra cả. Vì vậy, khi bạn chạy một lệnh vào bàn phím như a.out hoặc bạn nhấp đúp chuột vào một biểu tượng trên Mac OS hoặc Windows, chương trình của bạn được tải từ ổ đĩa cứng của bạn vào bộ nhớ RAM 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. Trong khi đó, chương trình của bạn bắt đầu chạy và chính được gọi là trong chương trình mà bạn đã viết hoặc chương trình Microsoft hay Apple đã viết, 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. 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ó. 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ó. 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, bắt đầu để có được thấp hơn và thấp hơn. 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 hoặc bạn gọi tăng, bạn đang đi qua trong một bản sao của giá trị. Và điều đó có nghĩa là những bức tranh mà bạn đang theo nghĩa đen viết số 1 trong một phần khác của bộ nhớ, thay đổi 1 đến 2 trong trường hợp tăng 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ớ càng sớm càng tăng hoặc trở về chức năng lập phương. Câu hỏi. [Sinh viên] biến toàn cầu được lưu trữ? 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, 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ị với dấu bằng, nó kết thúc ở phía trên đó, 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 chỉ đơn giản bằng cách quy ước. Các câu hỏi khác? Được rồi. Vì vậy, hình ảnh này sẽ quay trở lại khi chúng ta mạnh mẽ hơn với những gì chúng ta có thể làm với máy tính, 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ã, 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 nhưng không giải quyết được một số người trong số họ. 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ã. 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. 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 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ả, 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. 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. 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. 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 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, trẻ mặc dù bạn có thể được, chỉ tranh giành từ. Vì vậy, thay vì viết một bạn có thể viết b, thay vì b bạn có thể viết c, thay vì c bạn có thể viết d, và vv. Hoặc bạn có thể đi lên với một bản dịch phức tạp hơn của các chữ cái chữ cái khác nhau. Tuy nhiên, nắm bắt được trai hay gái mà bạn đang gửi ghi chú này 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. 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ì. 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? Là nó phức tạp hơn? 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, nhưng có loại catch-22 ở đây. 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, làm thế nào là trai hay con gái sẽ biết những gì bí mật, ngay cả là? 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, 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ỳ. 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, và nhiều người trong chúng ta có thể mua các công cụ tại Amazon.com, 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. URL có thể nói https, có thể là một ngớ ngẩn ít biểu tượng ổ khóa ở đâu đó, 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 giữa bạn và Amazon.com. Và nếu mật mã liên quan đến việc biết một số bí mật 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 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? Nó chỉ ra có các loại mật mã hoàn toàn giải quyết vấn đề. Nhưng ngày hôm nay, chúng ta sẽ tập trung vào đơn giản nơi bạn có thể sắp xếp trước để biết một số bí mật như +1 hoặc lập bản đồ một số giữa một và b. Và quá trình mật mã nói chung liên quan đến việc này. Bạn có một số văn bản đơn giản, được mô tả ở đây ở bên trái, 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ó - có lẽ đó chỉ trở thành b, b trở thành c - và sau đó bạn kết thúc với bản mã. Trong khi đó, một khi lòng của bạn nhận được ghi chú này bí mật, người đó có sau đó giải mã nó bằng cách thường đảo ngược rằng thuật toán để lấy lại các văn bản đơn giản. Có hóa thân vật lý của điều này. Ví dụ, đây là một bí mật ít bộ giải mã vòng, và đây là một chiếc nhẫn trong ý nghĩa rằng có hai quay ở đây. 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, mặc dù họ đang ở trong thứ tự ngẫu nhiên, và vào bên trong, có thực sự là số một số 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 để xếp hàng với các chữ cái. Từ một bộ phim được gọi là A Christmas Story, bạn sẽ thấy rằng Ralphie ít rất háo hức để tìm ra những thông điệp bí mật nhỏ Orphan Annie là anh đã đượ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 và bạn phải tích lũy tất cả các thẻ đi kèm trong hộp ngũ cốc, 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 để 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ố hoặc chữ cái và chữ. 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? 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 biến của chúng tôi vậy, đến nay đã cho phép. 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, 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ứ như từ và câu và cụm từ. Thật vậy, chúng tôi đã được gọi là chuỗi những điều như vậy, 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 mà chúng tôi đang có ý định để vỏ lại. Và do đó, chúng ta hãy bắt đầu để làm điều đó ở đây. Hãy để tôi đi trước và mở một tập tin - tất cả các file có sẵn, như thường lệ, trực tuyến được gọi là array.c để 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 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. Một mảng là một kiểu dữ liệu. Đó 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ó trở lại trở lại để sao lưu để sao lưu. 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 cho một khóa học như 50 có 2 câu đố, 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 bằng cách sử dụng getInt và một vài biến: int quiz1 int quiz2. Và nó khá đơn giản. Nó có thể 10, 20 dòng mã tối đa để thực hiện một chương trình 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ọ bằng cách thêm chúng với nhau, chia cho 2, và sau đó in kết quả. 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. Nhưng vấn đề là giả sử rằng 50 đã có 3 câu đố hoặc 4. 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 đố. Hãy suy nghĩ về một lớp học mà đã hàng tuần các câu đố. Nếu có 16 hoặc tuần trong một học kỳ, bây giờ bạn có 16 biến: int quiz1, int quiz2, int quiz3, int quiz4. 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ã, nó nên bắt đầu để làm cho bạn muốn có một cách tốt hơn. Và may mắn thay, vì các mảng có. Vì vậy, hãy làm điều này. 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, nhưng bạn sẽ thấy nó đôi khi trong mã. Đây là những gì thường được gọi là một hằng số. 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. Các quy ước của con người khi tạo ra một hằng số 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, và từ khóa đặc biệt mà bạn sử dụng trong C # define. 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ố và sau đó là giá trị của các hằng số. Chú ý điều này là khác nhau do chuyển giao một cái gì đó cho một biến. Không có dấu bằng, không có dấu chấm phẩy. Đây là những gì thường được biết đến như là một chỉ thị tiền xử lý, nhưng nhiều hơn về thời gian khác. Để bây giờ, điều này tạo ra một giá trị không thay đổi được gọi là câu đố có giá trị số thực tế là 2. 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, đó chỉ là số 2. 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. Đầ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. 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? Ở dòng 22 - đây là thực sự là một phần ngon ngọt - Tôi tuyên bố một phao 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. Biến được sẽ được gọi là lớp, như ngụ ý ở đây, nhưng mảnh duy nhất của cú pháp mới sau đó là những dấu ngoặc vuông. Thực tế mà tôi đã nói điểm nổi và sau đó khung mở và sau đó một số 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 - đ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." Đ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; nổi grade2; và vv. 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ả, 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. 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ý, giả sử trong năm tới CS50 thay đổi đến 3 câu đố thay vì và tôi đã có số 2 ở đây, tôi đã có số 2, Tôi đã có số 2, số 2 ở đây. Nó trở nên rất tẻ nhạt và rất dễ dàng để vít lên và vô tình thay đổi 1 giá trị 3 và bỏ lỡ một số giá trị khác 2. 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, như tên của nó cho thấy, không bao giờ thay đổi. 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, Tôi chỉ cần có để thay đổi nó ở một nơi đây ở đầu trang. Vì vậy, đó là một hằng số. Trong khi đó, tính năng khái niệm mới là của một mảng. 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. Vì vậy, bây giờ chúng ta hãy xem những gì tôi sẽ làm. Trong dòng 24 là sự khởi đầu của một vòng lặp for. Đ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. Nhưng không có gì trí tuệ khác nhau có từ tuần trước. Đây chỉ là printf, do đó, printf ("quiz #% d của% d:") 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. Vì vậy, đây là một điều hoàn toàn thẩm mỹ. Nhưng phần thú vị bây giờ là ở dòng 27. Để điền vào một trong hai giữ chỗ với một giá trị dấu chấm động, bạn một lần nữa sử dụng dấu ngoặc vuông. 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? [Sinh viên] 0. >> [Malan] 0. 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ã, 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. 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, nó thay đổi giá trị của nó trên mỗi iteration, vì vậy tôi điền vào mảng này một chỗ tại một thời điểm. Mảng này trông như thế nào? 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. Một mảng là một đoạn bộ nhớ tiếp theo là một đoạn bộ nhớ tiếp theo là một đoạn bộ nhớ và vv. 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 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 - 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 cho một mảng kích thước 2. Đó làm vuông vẫn còn ở đó, phải không? Bạn vẫn có 2 GB bộ nhớ RAM ngay cả khi bạn chỉ yêu cầu 2 phao nổi. Vì vậy, ý tưởng đằng sau mảng là máy tính chỉ mất một đoạn bộ nhớ và sau đó phân chia lại các phần nhỏ hơn để sao lưu để sao lưu để sao lưu. Và đó là tất cả các mảng. Đó là một đoạn tiếp giáp bên trong bộ nhớ của bạn có thể đặt mọi thứ. Điều này xảy ra sau đó làm chỉ là một số số học nhàm chán. Nếu tôi di chuyển xuống đây, đây là nơi mà tôi sau đó lặp qua mảng. Tôi đi lên với tổng của tất cả các giá trị trong mảng, 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 đố. 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ờ. 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. 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. Nhưng chúng ta hãy chuyển sang một ví dụ khác nhau gọi là string1, trong đó vẽ ra một hình ảnh tương tự nhưng sử dụng chuỗi. Hãy để tôi đi trước và đơn giản hóa này chỉ là một thời điểm. Hãy tha thứ cho thụt đầu dòng cho bây giờ. 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. Nhưng hãy chú ý tiếp theo những gì tôi đang làm trong các dòng 22 trở đi. 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. Đâ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, nó cho bạn biết bao nhiêu ký tự trong chuỗi đó. Đó là tất cả. Và thực tế rằng đó là strlen thay vì chuỗi dài chỉ vì nó gọn gàng hơn. 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, vì vậy chúng tôi đã giữ ước đó ở đây. i + + chỉ có nghĩa là tăng i trong mỗi lần lặp. Và bây giờ nhận thấy điều này, đó là thực sự thú vị. 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." Nhưng đây là những gì trên phía bên tay phải nói? Bằng tiếng Anh, đại diện cho những gì? [Sinh viên] Các ký tự đầu tiên trong mảng. Chính xác. Hãy cho tôi ký tự đầu tiên trong mảng. Hoặc, nói chung, cung cấp cho tôi những ký tự thứ i trong mảng. Và nhận ra điều quan trọng là bây giờ mà là nhà khoa học máy tính, chúng tôi đang thực sự đếm từ 0. 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. 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 bởi vì [0] là có được ký tự đầu tiên trong một chuỗi, [1] sẽ là người thứ hai, [2] sẽ là thứ ba, và vv. 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, và bây giờ tôi đã chạy string1 trong cửa sổ thiết bị đầu cuối của tôi. Nó đang chờ đợi cho đầu vào, vì vậy tôi sẽ gõ vào David, Nhập, 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. Tôi đang in một ký tự tại một thời điểm. 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. 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, bạn thực sự có thể không đưa ra một chuỗi có độ dài một số. 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ả, 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 để điền vào chuỗi này, và nếu máy tính chạy ra khỏi bộ nhớ, 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. Vì vậy, bây giờ, chỉ biết rằng có giá trị đặc biệt này được gọi là NULL 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. Nhưng nếu tôi mở ngay bây giờ string2, nhận thấy một sự khác biệt ở đây. Nhận thấy một sự khác biệt ở đây với string2. Với string2, điều này cho vòng lặp là một chút khác nhau. 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. Có gì khác nhau về cho vòng lặp thời gian này? Tôi có thể quay trở lại ví dụ trước. Vì vậy, đó là phiên bản 2, đây là phiên bản 1. 1, 2. 1, 2. Các cuộc gọi strlen là ở đâu? Đó là trong phần đầu tiên của vòng lặp for. Bất kỳ suy nghĩ như lý do tại sao tôi đang làm điều này? Yeah. [Sinh viên] Vì vậy, bạn không thể gọi chức năng mỗi lần duy nhất. [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. Nhớ lại từ cho các vòng rằng họ là siêu đơn giản 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. Vấn đề là điều kiện xảy ra trên mỗi lần lặp của vòng lặp. 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? [Sinh viên] Bạn đang gọi điện thoại strlen. [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. Nhưng một khi tôi đã nhập vào David, chiều dài của chuỗi đó là 5, và nó sẽ không thay đổi trên mỗi lần lặp của vòng lặp bởi vì chuỗi vẫn còn D-a-v-i-d. 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 đượ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. Cũng như một sneak xem trước của pset2, pset2 trong phiên bản tiêu chuẩn 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, một số số thuật toán mã hóa, do đó bạn có thể mã hóa cả hai và tin nhắn giải mã bí mật giống như Ralphie 1 giải mã. Trong phiên bản hacker pset2, chúng ta sẽ đi xa hơn một chút. 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ế 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ế, 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 đó 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. 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 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. Hóa ra, như một số bạn có thể đã thấy trong phần hoặc trong sách giáo khoa, chính không phải luôn luôn là vô hiệu trong dấu ngoặc đơn. Nó chỉ ra rằng chính cũng có thể được viết như thế này, với hai đối số, argc và argv, argc là số lượng từ sau khi bạn gõ tên của chương trình trên dòng lệnh của bạn và argv là những từ. Và như các dấu ngoặc vuông có đề nghị, argv rõ ràng là một mảng. Nó sẽ là một chuỗi sau khi một chuỗi sau khi một chuỗi trong bộ nhớ. 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. 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ó, nhận thấy rằng nó dường như không làm bất cứ điều gì. Nó chỉ in ra tên riêng của mình. 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 trên mỗi của các từ được gõ tại dấu nhắc. 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 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) và do đó sẽ được sinh ra đối số dòng lệnh. 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 như này ở đây, mà đi ở trên và vượt ra ngoài một số chức năng chúng tôi đã làm vậy, đến nay nhưng khá mạnh mẽ. 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. [CS50.TV]