[Powered by Google Translate] DAVID J. Malan: Được rồi. Đây là CS50, và đây là kết thúc của tuần thứ hai. Nếu bạn mong đợi để bị đói khoảng thời gian này vào ngày mai, biết rằng chúng ta đang đi 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 theo thời gian bạn điền này ra ngoài. Một URL mặc dù có thể được quan tâm này. Vì vậ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 có thể làm theo cùng, tham gia vào các khóa học khá tích cực, trên thực tế. Họ sẽ sử dụng gia dụng CS50 và CS50 Chủ đề 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 bao nhiêu nội dung chúng ta có thể dịch thành khác nói và viết ngôn ngữ. 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ụ đề của khóa học bài giảng và quần short và 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 sẽ tham gia trong dự án này, nhờ đó mà bạn thực hiện trên một hoặc nhiều hơn các 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ó trong 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 chóng chuyển tiếp 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 lấy một phần trong thí nghiệm này và có lời nói của bạn nhìn thấy và đọc bởi có khả năng hàng ngàn người ra khỏi đó, cảm thấy miễn phí để tham gia. Bây giờ một từ về con mèo con từ thứ hai, vì sợ rằng chúng tôi đã gửi một quá đáng sợ tin nhắn. Do nhận ra rằng giờ làm việc đề nghị và là phòng đề nghị, 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, một lần nữa, công việc cuối cùng bạn phải nộp của riêng bạn. Và vì vậy nó 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 mong đợi, thậm chí - để được trò chuyện với một số những người bạn bên cạnh bạn. Nếu anh ta hoặc cô ấy đang đấu tranh với một số chủ đề, và bạn giống như, oh, tôi 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. Trường hợp dòng, một lần nữa, bị vượt qua khi đầu là loại nghiêng trên giây, quá nhiều hoặc phút cho rằng thực sự chỉ có 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ũng là dòng. Vì vậy, bằng mọi cách, 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 về 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 trình thực sự cần được sản phẩm sáng tạo của bạn và không phải một người nào khác. Vì vậy, trong cùng một tĩnh mạch của các sinh vật cuddly, bạn có thể biết của anh chàng này ở đây. Vì vậy, đây là một bộ phim horrifically cheesy từ năm trước. Bất cứ ai ở đây nhìn thấy Spaceballs? Được rồi. Vì vậy, một số tốt ở đây. Vì vậy, đây là cách học tập tuyệt vời của chúng tôi giới thiệu ngày hôm nay cuối cùng khái niệm về mật mã. Và như vậy một trong những vấn đề tên miền cụ thể cho 2 pset, sẽ đến ra chậm vào tối 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ờ bảo đảm cho 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 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 ý tưởng tốt nhất, như chúng ta sẽ thảo luận vào 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 của bạn màn hình, cũng không phải là nhất thiết phải thiết kế tốt nhất nhưng khá phổ biến hiện tượng này. 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ọ là đặ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 cách có một từ ẩn tài liệu một nơi nào đó trên ổ cứng của bạn 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 ai sẽ nhìn vào, mà cũng không phải là rất an toàn cơ chế. Và vì vậy những gì pset 2 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. Vì vậy, để thúc đẩy vấn đề này rất thực tế với một rất không thực thế giới kịch bản này, cho phép tôi giới thiệu với bạn một trong những đoạn phim yêu thích của chúng tôi ở đây từ này phim, Spaceballs. [VIDEO PLAYBACK] -Mũ bảo hiểm, bạn quái vật, những gì đang xảy ra? Bạn đang làm gì để con gái tôi? -Giấy phép tôi để giới thiệu các bác sĩ phẫu thuật rực rỡ trẻ, Tiến sĩ Philip Schlotkin, mũi lớn nhất công việc người đàn ông trong toàn bộ vũ trụ và Beverly Hills. -Your Điện hạ. Mũi công việc? Tôi không hiểu. Cô ấy đã có một công việc mũi. Đó là một 16 ngọt ngào hiện tại. -Không, nó không phải là những gì bạn nghĩ. Nó nhiều, tồi tệ hơn nhiều. Nếu bạn không cho tôi sự kết hợp lá chắn không khí, Tiến sĩ Schlotkin cho con gái của bạn trở lại mũi cũ của cô. -Không! Nơi mà bạn đã có được điều đó? -Tất cả các quyền. Tôi sẽ nói cho. Tôi sẽ nói cho. -Không, cha, không có. Bạn không được. Quyền phổ cập, thân yêu của tôi. Tôi sẽ bỏ lỡ mũi mới của bạn. Nhưng tôi sẽ không nói cho họ biết sự kết hợp không có vấn đề gì. -Rất tốt. Tiến sĩ Schlotkin, làm tồi tệ nhất của bạn. Niềm vui của tôi. -Không! Chờ đợi, chờ đợi. Tôi sẽ nói cho. Tôi sẽ nói cho. Tôi biết nó sẽ làm việc. Được rồi, đưa nó cho tôi. Sự kết hợp là một. -One. -One. -Two. -Two. -Two. -Ba -Ba. -Ba. -Four. -Four. -Four. -Five -Five. -Five. Vì vậy, sự kết hợp là một, hai, ba, bốn, năm. Đó là sự kết hợp ngu ngốc nhất tôi từng được nghe trong cuộc sống của tôi. Đó là điều mà một thằng ngốc sẽ có trong hành lý của mình. Cảm ơn bạn, manh liệt của bạn. -Những gì bạn đã làm gì? -Tôi tắt tường. -Không, bạn đã không. Bạn tắt toàn bộ phim. Tôi phải đã bấm nút sai. -Thôi, đưa nó trở lại. Đặt bộ phim trở lại. -Vâng, thưa ông. Vâng, thưa ông. - Đi thôi, Erna. Hãy đến, Gretchen. Tất nhiên bạn biết tôi vẫn sẽ có hoá đơn cho bạn cho việc này. -Vâng, nó hoạt động? Cổng đâu? Nó làm việc, thưa ông. Chúng tôi có sự kết hợp. -Great. Bây giờ chúng ta có thể mỗi hơi thở cuối cùng không khí trong lành từ hành tinh Druidia. Kết hợp là gì? Một, hai, ba, bốn, năm. Một, hai, ba, bốn, năm? -Vâng. Đó là tuyệt vời. Tôi đã có sự kết hợp trên cùng một hành lý của tôi. Chuẩn bị Spaceball 1 để khởi hành ngay lập tức. -Vâng, thưa ông. Và thay đổi sự kết hợp trên hành lý của tôi. -Ow! [END phát lại video] DAVID J. Malan: Một bộ phim tuyệt vời bạn nên bây giờ tất cả. Vì vậy, 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 một cái 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 những gì bí mật này tin nhắn ở đây. Nhưng trong thế giới thực của máy tính, mọi thứ thậm chí không giống như họ có thể là 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 Unix máy tính trong một tập tin đó là một lần khi 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ủa bạn tên đăng nhập 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 mã hóa củ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à quả thực, nghệ thuật mật mã cuối cùng nắm tin tưởng của một số sắp xếp và biết cái gì mà người khác không. Chúng tôi sẽ tìm hiểu 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. Vì vậy, đặc biệt là, như một số bạn đã tụt dốc vào 1 pset, thiết bị, và một thế giới mới cho chính mình, nhận ra rằng thất vọng và sự nhầm lẫn và khó khăn chỉ là kỹ thuật được mong đợi. Đặc biệt với các 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 trong 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á, mà chắc chắn có những giờ làm việc tồn tại như cơ cấu 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 điều đó là 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 cho tôi tham gia một lớp pass / fail, 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ố khác vùng biển hoàn toàn, 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 pass / thất bại 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ì đó mà 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 pset 0, 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 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 pset như 90% số đường, bạn biết bạn chỉ có thể tìm ra một điều - vượt qua / không thực sự có 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 của hạnh phúc 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à đó 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 đó 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 tốt hơn - là một, hai, ba, bốn, năm, tất cả các con đường lên đến tám vì tám là an toàn hơn hơn năm. 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. Một, hai, ba, bốn, năm, sáu, bảy, tám. 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. Những gì tôi đào lên từ một vài năm trở lại tập tin này ở đây, ilock.c, chỉ để loại làm cho cụ thể hơn và phức tạp hơn một số cơ bản hơn C chương trình chúng tôi đã viết. Vì vậy, tôi mở tập tin này, ilock.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, nhiều 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 thông qua, điều này thực sự là rất đầu tiên, tôi tin rằng, nứt cho iPhone gốc. Khi bạn muốn jailbreak iPhone phiên bản gốc, có nghĩa là untether 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 việc rằng Apple không muốn mọi người làm , một người đã dành thời gian để tìm ra chính xác làm thế nào họ có thể khai thác phần mềm sai sót, sai lầm, lỗi, phần mềm của Apple. Và do đó được sinh ra ilock.c. Rằng nếu bạn biên dịch nó trên một máy tính và cài đặt nó vào một 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 đặc quyền hành chính hoặc root trên iPhone của bạn và để cho bạn làm được 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 giống như nhiều công ty, đặc biệt là khi họ 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ọ có ý định. Tuy nhiên, nhờ có những người như thế này và sự hiểu biết của họ về mức độ thấp chi tiết và trong trường hợp này, 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 trong một cách mà 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. 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 xuất hiện 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, phá vỡ, 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 trên quá trình học kỳ - vào cuối ngày, sau cùng các quy tắc và logic mà chúng tôi đã được 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 ngay sau 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 rằng chúng tôi đã lặn xuống. Vì vậy, chúng ta hãy xem xét một ví dụ nhỏ đơn giản hơn. Điều này một, chỉ để có được ấm lên với một số cú pháp và cũng có một số dữ liệu khác loại mà chúng tôi đã nói chuyện về nhưng đã không thực sự nhìn thấy trong C. Vì vậy, đây là một tập tin gọi là positive1.c. Và theo các ý kiến ​​ở trên, điều này chỉ yêu cầu người sử 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 người sử dụng tương tác chương trình 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 với họ 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 19 đến 24 thời gian dài như người dùng có không cho tôi một số dương. Bây giờ chi tiết này ở đây trên dòng 18, tại sao tôi tuyên bố n ở trên này toàn bộ Looping xây dựng như trái ngược ngay bên cạnh dòng 22 thực sự quan tâm để có được n? Yeah? [Không nghe được] DAVID J. Malan: Yeah, vì vậy vấn đề này phạm vi. Và trong nhiệm kỳ của giáo dân, phạm vi những gì tham khảo? Yeah? [Không nghe được] DAVID J. Malan: Bạn có thể nói một chút to hơn? SPEAKER 1: bạn có thể truy cập vào một biến cụ thể. DAVID J. Malan: 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 các dấu ngoặc nhọn gần đây nhất mà bạn đã nhìn thấy. Và như vậy 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 mà dòng mã bây giờ sẽ không có ý tưởng những gì tôi đang nói về? Vì vậy, 25, và nó quay ra 24, là tốt, bởi vì trong trường hợp này, nó nằm 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 tuyên bố bên ngoài biến của các chức năng riêng của mình. Bây giờ chúng ta sẽ thấy sau 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ể nhận được lười biếng và đặt một biến trên toàn cầu, do đó, để nói chuyện, không bên trong của một chức năng, không ở bên trong một vòng lặp, nhưng trong 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. Nhưng điều này thường được tán thành. Tuy nhiên, nhận thấy đây là một giải pháp đôi khi các vấn đề khác, chúng tôi sẽ cuối cùng nhìn 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 này chỉ để bắt đầu thể hiện bản thân mình một chút khác nhau. Vì vậy, 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, có vẻ 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 ta đang đi đúng hướng. Vì vậy, bây giờ hãy để tôi đi trước và mở phiên bản hai của. 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? Yeah, do đó, điều này bool màu xanh lá cây. Gedit đã nhấn mạnh vào từ khóa này được gọi là bool màu xanh lá cây, đó 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 cụ thể của thư viện. Trong trường hợp của chúng tôi, tôi bao gồm các thư viện để CS50 có quyền 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. Vì vậy, tôi đã có thể gọi là bất cứ điều gì này. Nhưng tôi gọi nó là biết ơn khi 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 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 đến 23 là vừa 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, tôi kiểm tra nếu int người sử dụng đã cung cấp lớn hơn 0, sau đó tôi chỉ đơn giản là 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, rõ ràng, tôi sẽ 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 một phiên bản 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 vậy, tôi dường như không quan tâm để nhớ những gì người dùng gõ tại vì thông báo không có biến n. Vì vậy, thực sự, tôi - lời nói dối trắng một chút. 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 bởi vì tôi không nhớ những gì n là. 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 ở phía bên phải của một dấu bằng vậy, đến nay để chúng tôi 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 chỉ cần không quan tâm để lưu các giá trị, bạn chỉ muốn để kiểm tra giá trị, nhận thấy rằng chúng tôi chỉ đơn giản là có thể viết này 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 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à trong line 26, chúng tôi chỉ đơn giản là nói, cảm ơ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 điều này không đúng thứ ba và cuối cùng trong positive3. Vì vậy, nhận thấy sự khác biệt bây giờ chỉ là những dòng mã? Yeah, vì vậy 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 Thứ hai, mà biểu thị những gì? Vì vậy, không, hoặc phủ định. Vì vậy, một giá trị Boolean và lật giá trị của nó. Thực sự trở thành sai. False trở thành sự thật. Vì vậy, điều này, tôi sẽ đề xuất, thậm chí còn nhiều hơn một chút trực quan của một cách viết mã bởi vì tôi vẫn khởi tạo cảm ơn false. 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 không biết ơn. Bởi vì bang, 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 chuyện 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 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ác cách để viết một số chương trình, tỷ lệ cược bạn thật may mắn vì có sẽ được bất kỳ số các giải pháp mà bạn có thể xảy ra khi. Ví dụ, điều này chỉ là ba 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 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 lần một lần, 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 Tôi trở lại đầu ra dưới hình thức một lần một lần. Vì vậy, bây giờ tôi có khả năng, giống như tôi được sử dụng với printf 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à chức năng lập phương trả về một số đầu ra. Và do đó, 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 tôi quan tâm - mặc dù, như là một sang một bên, nó trả về một 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, đây là nói chung - đố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 kết quả đầu ra trở lại, 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. Được rồi, tên của bạn là gì? KEN: Ken. DAVID J. Malan: Ken. Được rồi, Ken. Nào lên. Vì vậy, Ken sẽ là một chức năng của các loại ở đây. Và chúng ta hãy đ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 để tốt, trên thực tế, không thể nói rằng. Tôi không thực sự có chữ viết tay tốt. Và vì thế, tôi muốn bạn in một cái gì đó trên màn hình cho tôi. Vì vậy, tôi là 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 ("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. Bây giờ anh ta là một hộp đen viết 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. Vì vậy, 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? Vì vậy, không phải là chúng tôi đã nhìn thấy cho đến nay. Một lần nữa, printf không thực sự trả lại một số. Nhưng chúng ta 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 trở lại để thực hiện - 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 về con đường của chúng tôi thực hiện bất cứ điều gì dòng khác có. Được rồi. Vì vậy, bây giờ chúng ta hãy thử một ví dụ hơi khác nhau. Và thời gian này, ở đây, trước tiên hãy xóa màn hình ở đây. 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ị đầu ra. Vì vậy, chúng ta hãy đi trước và làm điều này. Vì vậy, bây giờ tôi có một dòng mã nói rằng x = khối lập phương (x). Vì vậy, thực sự let's - 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? Vì vậy, chúng ta hãy đi trước và cung cấp cho bạn một màn hình trắng một lần nữa. Và tôi sẽ viết xuống giá trị của x, tại thời điểm này trong thời gian xảy ra được, chúng ta hãy nói, 2, để giữ cho nó đơn giản. Vì vậy, tôi đã viết vào 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. KEN: Và tôi chỉ cần viết câu trả lời? DAVID J. Malan: Vâng, 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ì đó. Vì vậy, - 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ó? Vâng, thực sự, 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 cùng một bit trong bộ nhớ. Nhưng 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ực, đó là chính xác những gì sẽ xảy ra. Vì vậy, nó quay ra rằng khi bạn gọi một chức năng, và bạn vượt qua trong một cuộc tranh cãi như "hello world" hoặc bạn vượt qua trong một cuộc tranh cãi như 2, nói chung, bạn đ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 phải có nghĩa là tôi vẫn còn có một bản sao của 2 giá trị một nơi nào đó. Bởi vì thực tế, bây giờ mà tôi đã nhận lại giá trị 8, tôi cần phải đ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 trong nghĩa đen 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ẽ được 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. Được rồi. Thực hiện rất tốt. Vì vậy, 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 mà chúng tôi đã làm ở đây. Vì vậy, hãy để tôi đi trước và mang lại cho chúng ta trở lại ví dụ cubing ở đây. Và nhận thấy 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 với những gì thực sự được thông qua thành chức năng. Vì vậy, một lần nữa, điều này được 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. Vì vậy, 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 buggy3, và nó thực hiện một chức năng trao đổi. Vì vậy, ở đây chúng tôi 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. Vì vậy, 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, một trong 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 trao đổi được gọi là mà phải mất hai đối số. Nó hoàn toàn legit cho các chức năng để có hai đố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 sẽ hy vọng rằng nó sẽ trao đổi hai giá trị này. Vì vậy, sau đó tôi yêu cầu bồi thường trên đường dây 25, đổi chỗ. 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 - chúng tôi mở ra 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. Và ở phần cuối của chương trình, họ vẫn còn, trên thực tế, giống nhau. 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? Vâng, hãy để nhảy 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. Nhưng vấn đề cơ bản dựa trên một câu chuyện đơn giản là những gì nói với lên đây với Ken? Trao đổi chia Tại sao? [Không nghe được] Chính xác. Vì vậy, 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 rõ ràng có hai đối số, một int. Và nó tùy tiện được gọi là a và b. Và ở đây, tôi đã vượt qua x và y tương ứng là 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ó giống như hầu hết như là mặc dù bạn sao chép và dán vào trao đổi các giá trị bạn muốn nó thực sự thao tác. Vì vậy, nếu đó là trường hợp, khi tôi, chương trình bắt đầu thực hiện dòng 35, sau đó 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ì? Vì vậy, nó chỉ nên là 1. Phải không? 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ó, một. 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. Bây giờ sự phân đôi này thực sự là 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 30 năm sau 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 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 bạn 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, anh ta hoặc cô ấy chắc chắn sẽ không biết những gì biến của tôi sẽ được gọi là. Vì vậy, 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 hoán đổi đã sử dụng cùng một tên. Được rồi. Vì vậy, tại thời điểm này trong câu chuyện, dòng 37, là 1. b là 2. Và bây giờ tôi tiến hành trao đổi chúng. Vâng đầu tiên của tất cả, 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 gì những người ba dòng mã đã làm. Hãy để tôi chỉ làm điều này. b được một. một được b. Xong. 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 b. Và b trở thành một. Nhưng vấn đề là ngay khi dòng 37 thực hiện, những gì giá trị của a và b? 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 được thực hiện, đó là tuyệt vời. Bây giờ bạn có hai bản sao của các bên trong số 1 của chức năng này. Vì vậy, sau đó khi bạn nói ở dòng 38, được b, tốt, bạn đang loại 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. Đây 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ữ một bản sao của một bên trong tmp. Vì vậy, một khi dòng 37 đã thực hiện, giá trị của một - 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. Vì vậy, một khi dòng 38 thực hiện, có giá trị của b. Và b là 2. Vì vậy, 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 tôi có thể chỉ tiếng tom tmp giá trị vào b. Và chúng tôi đang làm. 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ừ cách đây chỉ là một thời điểm. 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 năm thực hiện của chương trình. [Không nghe được] DAVID J. Malan: Vì vậy, 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, chỉ có điều 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ể trở lại thực sự là 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ỗ? 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ả những điều này làm việc - chúng tôi chỉ cần bỏ ra giống như ba phút nói về trao đổi chức năng và cả ba trong số 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 bên trong cho loop - tương tự như vậy, nếu bạn đang tuyên bố a và b bên trong của một hàm bạn đã viết, chúng chỉ có giá trị bên trong của chức năng đó. Điều đó có nghĩa là ngay khi trao đổi được thực hiện thực hiện và chúng tôi đi từ đường 24 đến 25 dòng, x và y chưa được thay đổi. 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. Nó không hoàn toàn đủ để trở về giá trị bởi vì chúng tôi có thể chỉ trả lại một 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 ta sẽ quay trở lại này. Nhưng hiện nay, nhận ra rằng vấn đề cơ bản xuất phát 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. Vâng, chúng ta 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, chúng ta hãy nói, một biến thể thứ tư này, buggy4. Và những 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 incrementing, dấu chấm, dấu chấm, dấu chấm. 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 bây giờ là bất cứ điều gì, 2 lẽ. Tuy nhiên, chương trình này là lỗi. Vấn đề là gì? Yeah? [Không nghe được] DAVID J. Malan: 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à, tốt, x tồn tại ở đây. Nó không tồn tại ở dòng 32. Vì vậy, chương trình này sẽ thực sự thậm chí 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 định danh không khai báo ở 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 rất hữu ích trong giờ 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 ở năm vị trí ký tự. Vì vậy, một, hai, ba, bốn, năm. Đó là, trên thực tế, nơi mà vấn đề là. Và cũng cần lưu ý vào các giờ văn phòng 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 toàn bộ màn hình đầ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 trên cùng những người thân. 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 hiệu ứng vòng hoa cúc cho 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? Đó là những gì? Okay. Vì vậy, chúng ta có thể làm cho x toàn cầu. Chúng ta hãy xem các phím tắt rằng 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. Vì vậy, 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ó quyền truy cập vào nó. Và tăng có quyền 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. Bây giờ đây là một trong những điều này - 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. Bởi vì nói chung, các chương trình của chúng tôi sẽ nhận được thú vị hơn nhiều và nhiều thời gian hơn. Và nếu giải pháp của bạn cho các vấn đề của cuộc sống chỉ là ah, đặt tất cả các biến ở phía trên cùng 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ó được 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 muốn để tăng x. Vì vậy, tôi có thể rõ ràng - vào cuối ngà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, điều này thời gian không hình khối nhưng để tăng? Làm thế nào để thay đổi điều này ở đây? Yeah. [Không nghe được] DAVID J. Malan: Đượ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 chỉ làm return x + 1? Bây giờ, mọi việc một vài chi tiết có 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] DAVID J. Malan: 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 có nghĩa là không có gì được trả lại. Nhưng rõ ràng, bây giờ nó là. Vì vậy, điều này cần phải thay đổi để int để 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] DAVID J. Malan: Vì vậy, tôi cần phải tăng x? [Không nghe được] DAVID J. 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. 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 phải 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ì? Vì vậy, nó đã nhận được 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, hãy chỉ cần tùy tiện chọn một quy ước đặt tên khác nhau cho tôi helper chức năng, 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ó là - hãy gọi nó là even_number 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 một điều khác ở đây và một những điều khác ở đây. Tôi phải làm gì để thay đổi trên đường dây 21 đầu tiên? Tôi phải gán nó vào x. Vì vậy, tôi có thể không chỉ cần gọi x tăng. Tôi cần phải nhớ câu trả lời bằng cách thay đổi giá trị của x 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 plopped vào bên trái tay điều, 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. Int number. Được rồi. Vì vậy, một bó toàn bộ những thay đổi cho một chức năng thực sự ngu ngốc. Tuy nhiên, đạ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 đó. Lạy Chúa tôi. Năm sai lầm trong, như, một chương trình sáu. Vì vậy, những gì sai trái trên dòng 18, nhân vật của 5? Được rồi. Vì vậy, tôi phải khai báo int này. Được rồi. Vì vậy, chúng ta hãy xem, một bó toàn bộ các lỗi khác. Oh my god. 19, 18, 21. Nhưng một lần nữa, chúng ta hãy xóa màn hình - L kiểm soát ở đây và Clang lại chạy. Vì vậy, năm vấn đề thực sự là chỉ là một. 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? SPEAKER 2: Tại sao nó rằng bạn chỉ có thể thay đổi x số trong biến tên và nó sẽ biết những gì bạn có nghĩa là? DAVID J. Malan: Tốt câu hỏi. 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? Vì vậy, 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à gia tăng, thẳng thắn, tôi không quan tâm 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ì mà đã làm với việc thực hiện của mình chức năng này. Vì vậ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ố ở đây và cuối cùng đâ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 của lái xe giấy phép, những người đã điều khiển, 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ần phải chăm sóc xe hoạt động như thế nào. Chúng tôi không có để chăm sóc tất cả những gì của các thanh và piston và cáp bên trong 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? [Không nghe được] DAVID J. Malan: 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. [Không nghe được] DAVID J. Malan: thứ tự đặc biệt như ở đây? Nếu điều này là int một số khác? Yeah. Vì vậy, để vấn đề 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 người đầu tiên tranh luận ở đây. Xin lỗi, 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 đã một 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. Vì vậy, đâ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. Vì vậy, ngay cả khi bạn không có ý tưởng làm thế nào bộ nhớ hoạt động 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 ta biết từ số không tuần một byte chỉ là những gì? 8 bit. Đúng, vì vậy 8 zero và những người thân. 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, hai hợp đồng biểu diễn của bộ nhớ RAM những ngày này, bạn có một tỷ hay 2 tỷ byte của bộ nhớ, hoặc khoảng 8 tỷ 16 tỷ đồng bit, bên trong máy tính của bạn. Bây giờ không giống như ví dụ nhỏ Willy Woolly, nó không phải là các hạt từ tính thường nữa. Càng ngày, trong máy tính xách tay ít nhất, đó là các ổ đĩa trạng thái rắn, ổ SSD, chỉ không có bộ phận chuyển động. Đó là tất cả điện tử. Đó là tất cả các điện theo. Vì vậy, suy nghĩ, mặc dù, của hình chữ nhật này chỉ đại diện cho một hoặc hai GB bộ nhớ mà bạn có. Vì vậy, đó là một đoạn bộ nhớ. Bây giờ thế giới của khoa học máy tính có loại khối phân vùng của bộ nhớ để làm việc khác nhau. Vì vậy, ví dụ, nếu điều này là bộ nhớ RAM của máy tính - theo đề nghị của hình chữ nhật đó - quay 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à zero và những người mà bạn đã biên soạn. Vì vậy, khi chúng tôi đã xem xét bên dưới mui xe vào những gì a.out, tất cả zero và những người thân - khi bạn chạy một chương trình, những zeroes và những người được nạp từ ổ cứng ổ đĩa vào một cái gì đó gọi là RAM. Và trong bộ nhớ RAM, họ đang đặt ở đầu trang. Bây giờ trong khi đó, bạn có những thứ khác. Khởi tạo dữ liệu, dữ liệu chưa được khởi tạo. Hai rộng bộ nhớ tham khảo biến toàn cầu, bạn không thường xuyên sử dụng. 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. Môi trường biến, chúng tôi sẽ không dành nhiều thời gian trên. Nhưng sau đó hai điều quan trọng 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 cái gì gọi là ngăn xếp và một cái gì đó gọi là đống. Và chúng tôi sẽ không nói về heap, nhưng chúng tôi sẽ nói về stack. Và ngăn xếp được có nghĩa là để gợi lên hình ảnh như phòng ăn khay bữa ăn trong Mather House, hoặc bất cứ nơi nào bạn xảy ra được, nơi mà 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ừ tầng trên lên. Và tương tự như trong bộ nhớ, có ý tưởng này đưa một cái gì đó trên một ngăn xếp, đặ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? Vâng, hãy để phóng to trên nửa dưới của hình ảnh này, máy tính của bạn RAM, đề 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ứ điều gì chương trình mà bạn đã viết, một lần nữa, những zeroes và những người được nạp từ ổ đĩa 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. Nó 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 máy PC - nó được nạp từ ổ cứng vào RAM. Ngay sau khi nó đã được nạp vào bộ nhớ RAM, zero và những người đi ở đầu đường, gọi là phân khúc văn bả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ính chức năng được gọi. Và chính, như chúng ta đã thấy, thường 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 có nhấp đúp vào 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 của bạn bộ nhớ, do đó, để nói chuyện. Bây giờ cụ thể, điều này thực sự có nghĩa gì? Điều này chỉ có nghĩa là nếu chúng ta để đếm những điều - 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ể là số zero byte. Điều này có thể là byte số một, hai, ba, bốn, năm, sáu, tất cả các con đường lên thích 2 tyû seõ là tất cả các con đường lên ở phía trên. 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, chỉ có nghĩa là ai đó đã quyết định những gì để từng con số nằm trên từng những khối của 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, để họ kết thúc trong bộ nhớ? Vậy khái niệm, họ chỉ kết thúc ở dưới cùng của điều đượ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 ý. Điều gì sẽ xảy ra là chính là ở dưới cùng của ngăn xếp bộ nhớ này. 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 mà foo đã kết thúc loại 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 như là nhiều với một cố ý lỗi chương trình. 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 chúng ta. Và hãy để 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. Cho int (i = 0; i> 0). Hãy làm cho sai lầm này, 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. Hãy có một phương pháp ở đây. Void đoạn điệp khúc, và chúng tôi sẽ nói int i. Và sau đó tôi sẽ nói, printf - oh, 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. Chorus (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 bị mất thị giác của thực sự là cơ bản lỗi. 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 người 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 void (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 khai hải quan không xác định i. Ồ, đó là ngu ngốc. Chúng ta không cần tranh luận. Hãy chỉ làm điều này. 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. Vì vậy, có. Bây giờ hãy đi qua cửa sổ thiết bị đầu cuối của tôi, lại chạy Clang. 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, vì vậy chúng tôi có thể nhìn thấy. Vì vậy, hãy để tôi nói printf, hãy nói, tôi đang ở đây. Được rồi, không có biến, chúng tôi sẽ để nó như thế. Hãy để tôi chạy lại làm. Hãy để tôi lại điệp khúc. Và đi kèm. 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] DAVID J. Malan: Chính xác. Vì vậy, nó cần có thời gian để in. Nó chỉ mất thêm công việc trên một phần của máy tính. Và vì thế,. 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? Vâng, nếu bạn nghĩ về bộ nhớ máy tính của bạn như thế nào được đặt ra, sẽ xảy ra là chính. Nhưng ở đây - chúng ta hãy gọi đây là đoạn đ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 là chỉ cần đi để nói điệp khúc, đoạn điệp khúc, đoạn điệp khúc, đoạn điệp khúc, đoạn đ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à zero và những người đạ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. Phải không? 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 ngu ngốc sai lầm, 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ờ điều nà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ả xấu. Nhưng thực tế là tôi không bao giờ thực sự ngừng kêu gọi bản thân mình là một cơ bản điểm yếu 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? Vâng, 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 một số. Vì vậy, sau đây sẽ xảy ra. Vì vậy, chúng ta hãy đi vào ví dụ tăng. Và anh chàng này ngay trên đây. Vì vậy, đây là những gì đang thực sự xảy ra. Khi tôi gọi tăng, và tôi vượt qua trong x, bức tranh những gì 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, bây giờ được gọi là điệp khúc - yeah, đó là ném tôi ra khỏi đây. Vì vậy, chúng ta hãy gọi việc tăng độ. Và chúng tôi không biết những gì chức năng tiếp theo này sẽ là. Vì vậy, những gì thực sự xảy ra ở đây là 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 sẽ trở thành 2 - kinh khủng bằng văn bản về màn hình ở đây. Nhưng sau đó, những gì 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ả bạn đã thực hiện là không có gì hữu ích. Một trong đó đã chứa trong chính vẫn là thực sự có. Vì vậy, chúng ta sẽ có điều này? Vâng, nó quay ra rằng trong bộ nhớ, bạn phải trở lại trở lại trình tự của các byte mà bạn có thể đặt công cụ. Và nó chỉ 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 để sao lưu để sao lưu để sao lưu. Một chuỗi, dựa trên một tuần và bây giờ hai tuần là gì? Vì vậy, 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 để trở lại 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 for 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. A có thể trở thành B. B có thể trở thành C. Vì vậy, mà 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 mỗi người thư cùng một lúc bằng cách đi bộ thông qua bộ nhớ của máy tính của chúng tôi để lại cho quyền 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. Vì vậy, trước khi chúng ta đi sâu vào một số mật mã và những điều được gọi là mảng, hãy để 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 chủ đề. Vì vậy, hãy sửa chữa bây giờ nếu chúng ta có thể. Vì vậy, chúng tôi chỉ nói chuyện về giá trị trả lại. Chúng tôi nói về đối số. Và chúng tôi đã nói về khái niệm này, mà chúng ta sẽ quay trở lại trong những tuần tới đến, xem bộ nhớ như là một bó toàn bộ các xếp chồng lên nhau khay, vậy để nói chuyện. Từ phía dưới lên, như vậy mà mỗi khay được đặt trên stack đại diện cho một chức năng mà hiện đang được gọi. Bất kỳ câu hỏi nào? Vì vậy, làm thế nào về - hãy để tôi thử hỏi một câu hỏi. Tôi tiếp tục làm hư đó, nhưng bây giờ it's - you've tất cả nhìn thấy khuôn mặt của cậu bé. Vì vậy, chúng tôi sẽ quay lại đó. Vậy cho 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. Và thực tế là tăng có dấu ngoặc đơn mở, int number, đóng cửa ngoặc đơn. Int number đại diện cho điều gì? [Không nghe được] DAVID J. Malan: Một lập luận. Được rồi, nhưng một đối số là gì? [Không nghe được] DAVID J. Malan: Xin lỗi, những gì? SPEAKER 3: Một cái gì đó bạn vượt qua. DAVID J. Malan: Được rồi. Vì vậy, 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 chút gì đó khác nhau mỗi lần bạn sử dụng nó, sau đó là cách duy nhất cho điều đó xảy ra sẽ thực 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 là thuận tiện của riêng của bạn để bạn có thể đề cập đến nó trong các chức năng mà bạn mình đang 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ỉ đòi hỏi rằng nếu bạn muốn một biến, bạn có để bảo máy tính kiểu dữ liệu đó là, phần lớn để nó biết bao nhiêu bit phân bổ cho biến đó. Bởi vì nó có thể là sáu xin lỗi, nó sẽ không là sáu. Nó có thể là 16. Nó có thể là 8. Nó có thể là 32, thậm chí 64. Tuy nhiên, máy tính cần phải biết. Bây giờ int ở phía bên tay trái đại diện cho những gì, ngược lại? [Không nghe được] DAVID J. Malan: đó là gì? [Không nghe được] DAVID J. Malan: Các loại chức năng và, cụ thể hơn, 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ề int. Và như vậy 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 trở về bên phải của từ khóa là một số nguyên, sau đó thực sự là 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 nó 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ụ thể như những gì chúng ta đang trở về và sau đó thực sự đi về trả lại nó. Và sau đó để làm cho rõ ràng hơn một chút bối cảnh ở đó, ông một lần nữa. Bối cảnh - lớn bất ngờ tới trong thời điểm này chỉ là một. Bối cảnh ở đây bây giờ là bộ nhớ máy tính của bạn, một lần nữa, một gigabyte, hai gigabyte, bất cứ điều gì. Có lẽ đó là nhiều hơn nữa. Có lẽ đó là ít hơn. Tuy nhiên, máy tính xem nó như là có phần khác nhau. Một cái gì đó đi xuống. Cái gì khác đi lên. Các công cụ khác nhau đi ở giữa. Và hôm nay, chúng tôi chỉ bắt đầu kể câu chuyện này. 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 các zero và những người Clang đã đư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 đôi nhấp 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ừ ổ cứng lái xe vào 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. Bây giờ 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 bạn đã viết hoặc chương trình Microsoft hay Apple đã viết, bất kỳ của nó các biến địa phương 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 chính các cuộc gọi một chức năng rằng chính nó đã biến hoặc đối số, 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, do đó, để nói chuyện, 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 khối lập phương - 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 những bức tranh là bạn đang nghĩa đen văn bản số 1 ​​trong một phần khác của bộ nhớ, thay đổi 1 đến 2, trong trường hợp của 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ớ bỏ ngay khi tăng hoặc khối lập phương trả về chức năng. Câu hỏi. [Không nghe được] DAVID J. Malan: Trường hợp các biến toàn cầu được lưu trữ trong những gì hiện đang đượ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 cho nó ngay lập tức một giá trị với dấu bằng, kết thúc ở đầu trang. Và nếu bạn chỉ nói int x dấu chấm phẩy không có giá trị, nó kết thúc tăng nhẹ trong bộ nhớ RAM thấp hơn chỉ đơn giản là theo 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 hiện nay, chúng ta hãy có một đoạn giới thiệu ngắn gọn về mật mã học, 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 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ã. Và mật mã khóa bí mật, như tên cho thấy, nguồn gốc an ninh của mình từ một bí mật. Vì vậy, ví dụ, nếu bạn đang ở trường lớp và bạn đang đi qua một thư ít bí mật tình yêu trai hoặc con gái bạn đang nghiền trên - nếu bạn muốn vượt qua thông qua khán giả, có thể bạn sẽ không viết một ghi chú bằng tiếng Anh hoặc bất kỳ 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 một tin nhắn văn bản 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 khá đơn giản thuật toá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 tinh vi 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ì đó. Đó là những gì, rõ ràng? Giống như, bí mật của bạn là gì. Giống như, rằng ánh xạ giữa A và B và Cs và Ds là gì? Là nó chỉ thêm một, do đó, để nói chuyện, để mỗi người trong số các chữ cái để đi từ A đến B, B đến 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 học, làm thế nào là trai hay con gái sẽ biết những gì bí mật, ngay cả là? Vì vậy, 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à đó thực sự là một mối quan hệ mà chúng ta sẽ trở lại đối với cuối học kỳ. Tương tự như vậy, không ai trong chúng tôi có thể gửi một - tương tự như vậy, hầu hết chúng ta không biết một người nào đó mà các công trình, ví dụ, Amazon.com. Tuy nhiên, nhiều người trong chúng ta có thể mua các công cụ tại Amazon.com. Và chúng ta đã được dạy để giả định rằng những thương mại điện tử giao dịch được an toàn. Phải không? URL có thể https. Có có thể ngớ ngẩn một chú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. Chưa hết, 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, như 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? Vâng, hoá 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 ứng trước cho biết một số bí mật, như cộng thêm 1 hoặc lập bản đồ một số giữa A 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ỉ A trở thành B, B trở thành C. Và sau đó bạn kết thúc với thuật toán mã hóa văn bản. Trong khi đó, một khi lòng của bạn nhận được lưu ý bí mật, anh ta hoặc cô ấy có để sau đó giải mã nó bằng cách thường đảo ngược rằng thuật toán để có được sao các văn bản đơn giản. Hiện nay có hiện thân vật lý của điều này. Ví dụ, đây là một chút nhẫn giải mã bí mật. 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à bên trong, có thực sự là một số con số, như vậy mà với điều này nhẫn, loại có thể biến bên ngoài nhưng không phải bên trong để xếp hàng số với các chữ cái. Và trong clip mà bạn đang về để xem một số trong đó bạn có thể đã thấy 24/7 xung quanh mùa Giáng sinh từ một bộ phim được gọi là A Christmas Story. Bạn sẽ thấy rằng Ralphie bé nhỏ đã mong muốn tìm ra những gì mồ côi Thông điệp bí mật của Annie là ông đã được truyền đạt, tôi nghĩ, trong hình thức thông điệp bằng số serial trên một hộp. 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 phải gửi bằng bưu điện. 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 lập bản đồ giữa các chữ cái và số, hoặc chữ cái và chữ. Vì vậy, tôi cung cấp cho bạn đoạn clip ngắn này từ A Christmas Story để thúc đẩy pset 2 và thảo luận của chúng tôi, trong một thời điểm, các mảng. Vì vậy, ở đây chúng tôi có Ralphie. [VIDEO PLAYBACK] -Be được biết là tất cả và bệnh lặt vặt mà Ralph Parker hướng bổ nhiệm thành viên của vòng bí mật nhỏ Orphan Annie và được hưởng tất cả danh dự và lợi ích xảy ra chúng. -Ký, Little Orphan Annie. Countersigned, Pierre Andre! Bằng mực! Danh dự và lợi ích, đã ở độ tuổi chín. Nào, chúng ta hãy về với nó. Tôi không cần tất cả những nhạc jazz về buôn lậu và cướp biển. Listen tối mai cho các cuộc phiêu lưu kết luận của The Black Pirate Ship. Bây giờ là thời gian cho thông điệp bí mật của Annie cho bạn thành viên vòng bí mật. Hãy nhớ rằng, trẻ em, thành viên duy nhất của vòng bí mật của Annie có thể giải mã Thông điệp bí mật của Annie. Hãy nhớ rằng, Annie là tùy thuộc vào bạn. Đặt chân của bạn B2. Đây là tin nhắn. 12, 11 - -Tôi đang ở trong cuộc họp bí mật đầu tiên của tôi. -14, 11, 18, 16 - -Pierre là trong giọng nói tuyệt vời đêm nay. Tôi có thể nói rằng tin nhắn tối nay là thực sự quan trọng. -3, 25. Đó là một tin nhắn từ Annie mình. Hãy nhớ rằng, không nói cho ai biết. -90 Giây sau đó, tôi đang ở trong căn phòng duy nhất trong nhà, nơi một cậu bé chín có thể ngồi trong sự riêng tư và giải mã. Aha, B. Tôi đã đi đến tiếp theo. E. Từ đầu tiên là được. S. Nó được dễ dàng hơn. U. -Oh, thôi nào, Ralphie. Tôi phải đi đây. -Tôi sẽ xuống ngay, ma. Gee whiz. -T, O. Hãy chắc chắn để. Hãy chắc chắn với những gì? Ít Orphan Annie cố gắng để nói là gì? Hãy chắc chắn với những gì? -Ralphie! Randy đã có để đi. Bạn sẽ vui lòng đi ra? -Tất cả các quyền, ma. Tôi sẽ ra ngay. -Tôi đã nhận được gần hơn. Sự căng thẳng là khủng khiếp. Đó là gì? Số phận của hành tinh có thể treo trong sự cân bằng. -Ralphie! Randy có để đi. -Ta sẽ ra ngay, buồn thì thôi. Gee, gần như ở đó. Ngón tay của tôi đã bay. Tâm trí của tôi là một cái bẫy thép. Mỗi lỗ chân lông rung. Nó đã gần như rõ ràng. Có, có, có, có. Hãy chắc chắn để uống Ovaltine của bạn. Ovaltine? Thương mại dể thương? Con trai của một bitch. [END phát lại video] DAVID J. Malan: Như vậy, có chúng tôi có mật mã. Vì vậy, 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? Vâng, chúng ta cần một cách để thể hiện mình nhiều hơn một chút linh hoạt hơn biến của chúng tôi vậy, đến nay đã cho phép. Chúng tôi đã có ints. Chúng tôi đã 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 miếng cá nhân của bộ nhớ mà không thực sự cho phép chúng ta thể hiện những thứ như từ và câu và cụm từ. Thật vậy, chúng tôi đã 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 sự đơn giản hóa trong CS50 thư viện mà chúng tôi đang có ý định vỏ trở 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ư trực tuyến thông thường - gọi là array.c để giải quyết một vấn đề không liên quan đến chuỗi nhưng mà vẽ hình ảnh ở đây về làm thế nào chúng ta có thể sử dụng một cái gì đó được gọi là một mảng. Một mảng là một kiểu dữ liệu. Đó là một kiểu của biến, 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 bài kiểm tra trung bình cho một khóa học như 50 có hai câu đố, bạn có thể rất dễ dàng viết chương trình này - thậm chí 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. Đó là 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 hai đ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 hai, 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ó ba câu đố hoặc bốn. 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ó như 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ả vốn chữ cái, chỉ cần để 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, nếu bạn 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 đó giá trị của các hằng số. Vì vậy, thông báo, đâ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. 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ề rằng một thời điểm 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 đố thực tế có số giá trị là 2. Vì vậy, bất cứ nơi nào bạn nhìn thấy các câu đố, câu đố, bài kiểm tra trong suốt tập tin này, đó là chỉ là số 2. Bây giờ, 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. Lúc đầu, có vẻ một chút khó hiểu. Nhưng đó là tất cả các công cụ từ một tuần. 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? Vâng, trong dòng 22 - đây 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. Rằng biến 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ố, đây là giống như chúng tôi đã làm điều này. Điều này có nghĩa là hey máy tính, cho tôi hai phao, và chúng ta hãy chung gọi 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 nhiều hơn nữa. 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 như vậy một cách mà chúng ta có thể viết một dòng mã thay vì, nói, 16 của một 16 tuần học kỳ. Vì vậy, 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ý - cho rằng năm tới CS50 thay đổi đến 3 câu đố thay vì. Và tôi đã có số 2. Tôi đã có số 2 ở đây. Tôi đã có số 2 ở đây. Tôi đã có 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 một 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ư của nó tên gợi ý, 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, lên đây ở đầu trang. Vì vậy, đó là tất cả các 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 ở đây. 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. Vì vậy, printf ("bài kiểm tra số% d% d") bởi vì tôi chỉ muốn in ra cho tôi bài kiểm tra số một trong hai và sau đó hai hai. Vì vậy, đây hoàn toàn là một điều 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 floating-point giá trị, bạn lại 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 không? 0. Vì vậy, trên phiên đầu tiên của vòng lặp này, nó như là mặc dù 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ó là như thể 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 gọi 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? Vâng, lý do tôi vẽ hình chữ nhật này siêu đơn giản trên màn hình ở đây trước đây 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ẽ được làm bằng cách gõ điểm số của bài kiểm tra của tôi, giống như ở đâ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 đã chỉ yêu cầu máy tính cho một loạt các kích thước 2. Những hình vuông là vẫn còn đó. Phải không? Bạn vẫn có 2 GB RAM, thậm chí nếu bạn chỉ yêu cầu hai phao. 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 của bộ nhớ, bên trong mà bạn có thể đặt mọi thứ. Bây giờ đ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 tổng hợp 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. Bài kiểm tra vì vậy đầu tiên cộng với bài kiểm tra thứ hai, chia cho 2, và sau đó in ấn 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. Và 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 bao nhiêu ký tự trong chuỗi đó. Đó là tất cả. Thực tế là nó là strlen thay vì chuỗi dài chỉ vì nó là gọn gàng hơn. 30 năm trước, 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 vẫn giữ nguyên quy ướ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ị. Vì vậy, trong dòng 24, tôi nói máy tính, cho tôi một nhân vật, tám 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ì? [Không nghe được] DAVID J. Malan: Chính xác. Hãy cho tôi ký tự đầu tiên trong mảng. Hay rộng hơn, 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 thực sự đếm từ 0. Bạn không có quyền tự quyết 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ừ số không bởi vì [0] sẽ là người đầu tiên nhân vật trong một chuỗi. [1] sẽ là người thứ hai. [2] là có được 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. Vì vậy, 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, nói rằng, David. Enter. Và bây giờ nó in DAVID trên tất cả các dòng khác nhau vì nhận thấy những gì tôi đang làm. Tôi đang in một ký tự tại một thời điểm. Bây giờ chúng ta 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, hoặc chỉ 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ể cho không có chuỗi ở tất cả. Hoặc nếu bạn là độc hại, bạn có thể thử để dán giá trị của một gigabyte của một bài tiểu luận để điền vào chuỗi này. Và nếu máy tính chạy ra khỏi bộ nhớ, nó chỉ ra rằng chúng ta sẽ để lấy lại giá trị đặc biệt này được gọi là vô giá trị. Vì vậy, bây giờ, chỉ biết rằng có giá trị đặc biệt này được gọi là vô giá trị 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 các giá trị tương ứng để chúng ta có thể nói về những người một thời điểm khác. Nhưng những gì khác nhau về cho vòng lặp thời gian này? Và tôi có thể quay trở lại ví dụ trước. Vì vậy, đó là phiên bản hai. Đây là một phiên bản Một, hai, một trong hai. Vì vậy, 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. [Không nghe được] DAVID J. 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 sắp xếp hiểu rằng đây là việc 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 tất cả các lặp đi lặp lại 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 này? 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à năm. Và nó sẽ không thay đổi trên mỗi lần lặp của vòng lặp 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ì sẽ 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ế, chỉ cần không làm cho máy tính làm việc không cần thiết. Bây giờ chỉ như một sneak xem trước của 2 pset, pset 2 trong phiên bản tiêu chuẩn là 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, vì vậy mà bạn có thể mã hóa và giải mã các tin nhắn bí mật, giống như Ralphie 1 có giải mã. Trong phiên bản hacker của pset 2, chúng ta sẽ đi xa hơn một chút. Chúng tôi sẽ giao 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 toàn bộ loạt 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 cho phiên bản hacker là có được để crack các mật khẩu đó và con số ra những mật mã, 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 mà tôi sẽ cung cấp cho bạn chỉ cần một bản demo của, được gọi là đối số dòng lệnh. Vì vậy, nó quay 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ừ mà bạn gõ sau 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 tôi đang đi để có thể làm, bắt đầu với pset 2, được 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 , nhận thấy rằng nó không có vẻ để làm bất cứ điều gì chưa. 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ẽ được truy cập từ mà người dùng có gõ tại dấu nhắc là 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à như vậy, sẽ được sinh ra đối số dòng lệnh. Và một khi bạn có được thực sự phức tạp này, bạn sẽ có thể viết chương trình thực sự trippy, chẳng hạn 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 thứ hai.