[MUSIC CHƠI] DAVID J. Malan: Được rồi. Đây là CS50, và điều này là sự bắt đầu của tuần thứ hai. Vì vậy, chúng ta hãy bắt đầu ngày hôm nay với một lỗi. Một lỗi, tất nhiên, là một sai lầm trong một chương trình, và bạn sẽ nhận được rất quen thuộc với khái niệm này nếu bạn đã không bao giờ được lập trình trước. pset0 và bây giờ pset1. Nhưng chúng ta hãy xem xét một cái gì đó một chút đơn giản lúc đầu. Chương trình này ở đây mà tôi ném lại với nhau trước, và tôi cho rằng điều này nên in 10 ngôi sao trên màn hình sử dụng printf, nhưng nó dường như có lỗi một cách nào đó. Với đặc điểm kỹ thuật mà cần in 10 sao, nhưng nó không rõ ràng, những gì bạn sẽ yêu cầu bồi thường là lỗi? Vâng? Vì vậy, nó là một tắt của một lỗi, và làm những gì bạn có nghĩa là bằng cách đó? OK. Tuyệt vời. Vì vậy, chúng tôi đã chỉ định bắt đầu giá trị của số không cho tôi, và chúng tôi đã chỉ định một giá trị n 10, nhưng chúng tôi đã sử dụng ít hơn hoặc bằng. Và lý do rằng đây là hai ký tự và không chỉ là một biểu tượng, như trong một cuốn sách toán học, là bạn không có một cách thể hiện một nhân vật tương đương. Vì vậy, có nghĩa là ít hơn, nhưng nếu bạn bắt đầu đếm từ số không, nhưng bạn đếm tất cả các cách lên thông qua và bằng 10, bạn tất nhiên sẽ tính 11 điều trong tổng số. Và như vậy bạn sẽ in 11 sao. Vì vậy, những gì có thể là một sửa chữa cho điều này? Vâng? Vì vậy, chỉ cần điều chỉnh ít hơn hoặc bằng chỉ ít hơn, và có, tôi khẳng định, có lẽ một giải pháp khác, quá. Có thể khác bạn làm gì? Vâng? Vì vậy, bắt đầu bằng nó là 1, và lại càng ít hơn hoặc bằng. Và thẳng thắn mà nói tôi sẽ yêu cầu bồi thường rằng, đối với một con người điển hình, điều này có lẽ đơn giản hơn. Bắt đầu đếm 1 và đếm đến 10. Về cơ bản làm những gì bạn có ý nghĩa. Nhưng thực tế là trong lập trình, như chúng ta đã thấy, các nhà khoa học máy tính và lập trình viên thường không bắt đầu đếm từ số không. Và đó là tiền phạt nếu bạn đã quen với nó. Tình trạng của bạn sẽ thường có cái gì đó như ít hơn. Vì vậy, chỉ đơn giản là hợp lý lỗi mà chúng ta có thể bây giờ sửa chữa và cuối cùng là biên dịch lại này và nhận được chỉ là 10. Như thế nào về lỗi này ở đây? Ở đây, một lần nữa, tôi cho rằng tôi có mục tiêu in 10 stars-- mỗi dòng thời gian này, nhưng nó không. Trước khi chúng tôi đề xuất những gì sửa chữa là, những gì thực hiện điều này in trực quan nếu tôi được biên dịch và chạy chương trình này bạn nghĩ gì? Vâng? Sao. Vì vậy, tất cả các ngôi sao trên cùng một đường dây là những gì tôi nghe, và sau đó là ký tự dòng mới. Vì vậy, hãy cố gắng đó. Vì vậy, hãy lỗi-1, vào, và tôi thấy lệnh kêu vang mà chúng ta đã nói về thời gian qua. ./buggy-1, và thực sự tôi thấy tất cả 10 ngôi sao trên cùng một dòng mặc dù tôi yêu cầu bồi thường trong đặc điểm kỹ thuật của tôi chỉ là một bình luận trên đỉnh mã mà tôi có ý định làm một trong dòng. Nhưng điều này có vẻ đúng. Bây giờ dòng 15 có vẻ như tôi in một ngôi sao, và sau đó dòng 16 có vẻ như tôi là in ấn một ký tự dòng mới, và chúng đều thụt vào như vậy Tôi bên trong vòng lặp rõ ràng. Vì vậy, nên tôi không thể làm sao, mới đường, ngôi sao, dòng mới, ngôi sao, dòng sản phẩm mới? Có? Vâng, không giống như một ngôn ngữ như Python, nếu bạn đã quen thuộc, thụt đầu dòng không quan trọng đối với máy tính. Nó chỉ quan trọng đối với con người. Vì vậy, trong khi dòng ở đây tôi đã phát minh ra 15 16-- trông đẹp, nhưng máy tính không quan tâm. Các máy tính quan tâm thực sự có dấu ngoặc nhọn xung quanh các dòng mã. Vì vậy, nó giống như trong clear-- Scratch-- rằng hai dòng mã phải được thực hiện. Giống như một trong những câu đố Scratch vàng miếng một lần nữa và một lần nữa và một lần nữa. Vì vậy, bây giờ nếu tôi chạy lại này program-- ./buggy-2-- Hm. Tôi có một lỗi ngay bây giờ. Tôi đã quên những gì để làm gì? Vâng, vì vậy tôi đã không biên dịch nó. Vì vậy, hãy lỗi-2. Không có tập tin như vậy bởi vì tôi đã không thực sự biên dịch phiên bản thứ hai. Vì vậy, bây giờ thú vị không khai báo variable-- không 2. Chúng tôi đang làm 1. Hãy lỗi-1-- ./buggy-1-- và bây giờ mỗi người là trên cùng một dòng. Bây giờ có một ngoại lệ yêu cầu bồi thường phải này của tôi bạn cần các dấu ngoặc nhọn. Khi là nó thực sự OK-- nếu bạn đã nhận thấy trong phần hoặc textbooks-- bỏ qua các dấu ngoặc nhọn? Vâng? Chính xác. Khi chỉ có một dòng mã mà bạn muốn được liên kết với các vòng lặp như trong ví dụ đầu tiên của chúng tôi. Nó là hoàn toàn hợp pháp bỏ qua các dấu ngoặc nhọn cũng giống như loại một tiện nghi từ trình biên dịch cho bạn. Vâng? Câu hỏi. Nó sẽ được coi là một lỗi phong cách? Chúng tôi sẽ promote-- như trong CS50 phong cách dẫn URL mà là trong pset1-- luôn sử dụng dấu ngoặc nhọn. Chắc chắn nếu bạn là người mới đến lập trình. Thực tế là chúng ta không sẽ cấm bạn từ làm các tiện nghi. Nhưng nếu bạn chỉ nhận được vào swing của sự vật, hoàn toàn chỉ luôn luôn sử dụng xoăn niềng răng cho đến khi bạn nhận được hang của nó. Câu hỏi. Tất cả các quyền. Vì vậy, mà sau đó là một lỗi. Ít nhất là trong một cái gì đó khá đơn giản. Và bạn có thể nghĩ rằng đây là khá thô sơ, phải không? Đây là loại tuần đầu tiên nhìn vào ngôn ngữ như thế, nhìn thấy lỗi của mình trong đó. Nhưng thực tế đây là những thực sự đại diện một số vấn đề khá đáng sợ có thể phát sinh trong thế giới thực. Vì vậy, một số bạn có thể nhớ lại nếu bạn làm theo tin tức công nghệ, hoặc thậm chí có thể bị bắt gió này trong tháng Hai năm vừa qua rằng Apple đã có thực hiện một chút sai lầm trong cả iOS, hệ điều hành trên điện thoại của họ, và cũng có thể Mac OS, hệ điều hành trên máy tính để bàn và máy tính xách tay của họ. Và bạn thấy tiêu đề như thế này. Và sau đó, Apple hứa sẽ sửa chữa lỗi này, và rất nhanh chóng đã sửa chữa nó trong iOS, nhưng sau đó cuối cùng là cố định nó trong Mac OS là tốt. Bây giờ không có những tiêu đề một mình thực sự tiết lộ những vấn đề cơ bản là, nhưng lỗi sau cùng đã được giảm xuống một lỗi trong SSL, ổ cắm an toàn lớp. Và câu chuyện dài ngắn, đây là phần mềm rằng trình duyệt của chúng tôi và các phần mềm được sử dụng để làm gì? Nếu tôi nói rằng SSL là liên quan, bất cứ khi nào bạn truy cập vào một URL bắt đầu với HTTPS, những gì sau đó SSL có thể liên quan đến? Mã hóa. Vì vậy, chúng ta sẽ nói về này trong những ngày tới. Mã hóa, nghệ thuật xáo trộn thông tin. Nhưng câu chuyện dài ngắn, Apple đôi khi trước đã phạm sai lầm trong việc thực hiện của họ về SSL, phần mềm mà cuối cùng thực hiện URL như HTTPS hoặc tối đa kết nối có quá. Kết quả trong số đó là của bạn kết nối có thể có khả năng bị chặn. Và các kết nối của bạn đã được không nhất thiết phải được mã hóa nếu bạn đã có một số kẻ xấu ở giữa bạn và các trang web đích người biết làm thế nào để tận dụng lợi thế này. Bây giờ Apple cuối cùng đã đăng một sửa chữa cho điều này cuối cùng, và mô tả của sửa chữa của họ là như thế này. Vận chuyển an toàn không xác nhận tính xác thực của kết nối. Vấn đề này được giải quyết bằng khôi phục lại thiếu bước xác nhận. Vì vậy, đây là một lời giải thích lượn sóng rất tay chỉ đơn giản nói rằng chúng tôi hơi say lên. Có nghĩa là một dòng mã đó là lỗi trong việc thực hiện của họ về SSL, và nếu bạn đi trực tuyến và tìm kiếm này bạn thực sự có thể tìm thấy mã nguồn gốc. Ví dụ, đây là một ảnh chụp màn hình chỉ là một phần của một tập tin khá lớn, nhưng điều này dường như là một chức năng được gọi là SSL xác minh dấu hiệu trao đổi khóa máy chủ. Và phải mất một loạt các lập luận và nguyên liệu đầu vào. Và chúng tôi sẽ không tập trung quá nhiều vào các minutia đó, nhưng nếu bạn tập trung vào các mã bên trong trong đó trên cùng function-- hãy phóng to trên đó. Bạn có thể đã nghi ngờ những gì các lỗi có thể là ngay cả khi bạn không có ý tưởng cuối cùng là những gì bạn đang tìm kiếm. Có loại một sự bất thường ở đây, đó là những gì? Vâng, tôi không thực sự thích giao diện của hai goto không. Thành thật mà nói, tôi không thực sự biết những gì goto không phương tiện, nhưng có hai người trở lại trở lại. Đó chỉ là loại xoa tôi trí tuệ một cách sai lầm, và thực sự nếu chúng ta phóng to chỉ những dòng, đây là C. Vì vậy, rất nhiều mã của Apple được tự viết bằng C, và điều này rõ ràng thực sự equivalent-- không có vết lõm khá phiên bản, nhưng nếu bạn nhận ra thực tế rằng không có dấu ngoặc nhọn, những gì Apple thực sự đã viết là mã trông như thế này. Vì vậy, tôi đã thu nhỏ và tôi chỉ cố định lề trong ý nghĩa rằng nếu không có dấu ngoặc nhọn, mà goto thứ hai thất bại đó là màu vàng sẽ thực hiện không có vấn đề gì. Nó không liên quan đến nếu điều kiện ở trên nó. Vì vậy, thậm chí một lần nữa, nếu bạn không hoàn toàn hiểu những gì này có thể có thể được làm, biết rằng mỗi người trong các conditions-- mỗi dòng là một bước rất quan trọng trong quá trình kiểm tra nếu dữ liệu của bạn là trong thực tế được mã hóa. Vì vậy, bỏ qua một trong những bước, không phải là ý tưởng tốt nhất. Nhưng bởi vì chúng tôi có điều này goto thứ hai thất bại trong màu vàng, và bởi vì một khi chúng tôi loại thẩm mỹ di chuyển nó sang bên trái, nơi nó một cách hợp lý là tại thời điểm này, những gì Điều này có nghĩa cho các dòng mã dưới đây goto thứ hai thất bại, bạn sẽ nghĩ gì? Nó luôn luôn được bỏ qua. Vì vậy, gotos thường được tán thành vì lý do chúng tôi sẽ không thực sự đi vào, và thực sự ở CS50 chúng ta có xu hướng không dạy goto tuyên bố này, nhưng bạn có thể nghĩ goto không như ý nghĩa đi nhảy một số phần khác của mã này. Nói cách khác nhảy qua dòng cuối cùng này hoàn toàn, và như vậy là kết quả của ngu ngốc này sai lầm đơn giản đó chỉ là là kết quả của một người nào đó có thể sao chép và dán một quá nhiều lần là toàn bộ bảo mật của iOS và Mac OS là dễ bị đánh chặn bởi kẻ xấu trong một thời gian. Cho đến khi Apple cuối cùng đã cố định này. Bây giờ, nếu một số bạn đang thực sự chạy các phiên bản cũ của iOS hoặc Mac OS, bạn có thể vào đó gotofail.com là một trang web mà một người nào đó thành lập về cơ bản xác định lập trình nếu máy tính của bạn vẫn còn dễ bị tổn thương. Và thẳng thắn mà nói, nếu có, nó có thể là một ý tưởng tốt để cập nhật điện thoại của bạn hoặc Mac của bạn vào thời điểm này. Nhưng ở đó, chỉ minh chứng cho như thế nào một sự đánh giá cao của các cấp thấp hơn chi tiết và công bằng ý tưởng đơn giản có thể thực sự chuyển thành quyết định và những vấn đề affected-- trong case-- này hàng triệu người. Bây giờ một từ về quản lý. Phần sẽ bắt đầu vào chủ nhật tới. Bạn sẽ nhận được một email của cuối tuần về phần, lúc này quá trình resectioning sẽ bắt đầu nếu bạn đã nhận ra bây giờ bạn có một số cuộc xung đột mới. Vì vậy, điều này xảy ra mỗi năm, và chúng tôi sẽ phù hợp trong những ngày tới. Văn phòng làm hours-- giữ một mắt theo đúng kế hoạch này ở đây. Thay đổi một chút trong tuần này, đặc biệt là thời gian bắt đầu và vị trí, do đó, tham khảo ý kiến trước khi đến giờ làm việc bất kỳ trong bốn đêm tiếp theo. Và bây giờ là một lời đánh giá, đặc biệt là khi bạn đi sâu vào vấn đề thiết lập một và xa hơn nữa. Vì vậy, theo các đặc điểm kỹ thuật, đây là những thường các trục dọc mà chúng tôi đánh giá công việc của bạn. Phạm vi đề cập đến những gì mức độ cụ mã của bạn các tính năng cần thiết bởi đặc điểm kỹ thuật của chúng tôi. Nói cách khác, có bao nhiêu một bộ mảnh đã làm bạn cắn. Bạn đã làm một phần ba của nó, một nửa của nó, 100% của nó. Ngay cả khi nó không đúng, bao nhiêu bạn đã cố gắng? Vì vậy, nắm bắt được mức độ nỗ lực và số tiền mà bạn cắn ra khỏi vấn đề vấn đề của bộ. Correctness-- này, để mức độ nào, là mã của bạn phù hợp với chúng tôi thông số kỹ thuật và miễn lỗi. Vì vậy, nó hoạt động một cách chính xác? Nếu chúng ta cung cấp cho nó một số đầu vào, hiện nó cho chúng ta những kết quả mà chúng ta mong đợi? Design-- bây giờ đây là lần đầu tiên của những người đặc biệt là chất lượng, hoặc những người đòi hỏi sự phán xét con người. Và quả thực, đây là lý do tại sao chúng tôi có một đội ngũ nhân viên của rất nhiều nghiên cứu sinh giảng dạy và học trợ lý. Đến mức độ nào là của bạn mã được viết tốt? Và một lần nữa điều này là rất đánh giá định tính mà sẽ làm việc với bạn về hai hướng trong tuần tới. Vì vậy, khi bạn nhận được không chỉ có điểm số, mà còn một điểm bằng văn bản hoặc thông tin phản hồi đánh máy, hoặc bằng văn bản phản hồi từ tiếng Anh. Đó là những gì chúng tôi sẽ sử dụng để lái xe bạn đối với việc viết mã tốt hơn. Và trong bài giảng và phần, chúng tôi sẽ cố gắng chỉ out-- thường xuyên như chúng tôi can-- những gì làm cho một chương trình không chỉ chính xác và chức năng tốt, mà còn được thiết kế tốt. Hiệu quả nhất nó có thể được, hoặc thậm chí đẹp nhất có thể. Trong đó dẫn chúng ta đến phong cách. Phong cách cuối cùng là một phán đoán thẩm mỹ. Bạn có lựa chọn tốt tên cho các biến của bạn? Bạn đã thụt vào mã của bạn đúng cách? Liệu nó nhìn tốt, và do đó, là nó dễ dàng cho một người khác đọc tương ứng của bạn về tính đúng đắn của nó. Bây giờ nói chung trong các giáo trình, chúng tôi ghi những điều trên thang điểm từ năm điểm. Và hãy để tôi búa nhà điểm rằng ba thực sự là tốt. Rất nhanh chóng làm folks bắt đầu làm số học. Khi họ nhận được một ba trong số năm trên đúng đắn cho một số pset và họ nghĩ rằng chết tiệt, tôi sẽ 60% mà chủ yếu là D hoặc E. Đó không phải là cách chúng ta nghĩ về những con số này. Một ba là thực sự tốt, và những gì chúng tôi thường mong đợi ở đầu của thuật ngữ này là nếu bạn đang nhận được một loạt các three's-- có thể một vài hội chợ, một vài fours-- hoặc một vài lần hai, một vài fours-- đó là một nơi tốt để bắt đầu. Và miễn là chúng ta thấy một quỹ đạo đi lên theo thời gian, bạn đang ở một nơi đặc biệt tốt. Công thức chúng tôi sử dụng để trọng lượng là điều cơ bản này theo các giáo trình, mà chỉ có nghĩa là chúng tôi cung cấp thêm trọng lượng cho chính xác. Bởi vì nó rất thường xuyên đúng đắn mà phải mất nhiều thời gian nhất. Hãy tin tôi bây giờ. Bạn sẽ find-- ít nhất trong một pset-- bạn dành 90% thời gian của bạn làm việc trên 10% của vấn đề. Và tất cả mọi thứ loại công trình ngoại trừ một hoặc hai lỗi, và đó là những lỗi mà giữ cho bạn thức khuya. Đó là những cái mà loại thoát khỏi bạn. Nhưng sau khi ngủ trên đó, hoặc tham dự các giờ làm việc hoặc đặt câu hỏi trực tuyến, được khi bạn tới được mục tiêu 100%, và đó là lý do tại sao chúng tôi cân đúng đắn nhất. Thiết kế một chút ít, và phong cách một chút ít hơn. Nhưng hãy phong cách mind-- có lẽ là dễ nhất trong số này để cắn theo hướng dẫn phong cách. Và bây giờ, một nghiêm trọng hơn lưu ý về sự trung thực trong học tập. CS50 có sự khác biệt bất hạnh của là nhà sản xuất lớn nhất của Hội đồng quản trị rao vặt trường hợp hầu như mỗi năm lịch sử. Đây không phải là bởi vì học sinh gian lận trong CS50 bất kỳ nhiều hơn so với các lớp khác, nhưng bởi vì tính chất công việc, thực tế là nó là điện tử, thực tế là chúng ta tìm kiếm nó, và thực tế chúng tôi có các nhà khoa học máy tính, Tôi có thể nói rằng chúng tôi không may rất giỏi phát hiện nó. Vì vậy, điều này có nghĩa là trong thực tế? Vì vậy, nó, mỗi giáo trình, triết lý của khóa học thực sự không đun sôi xuống là hợp lý. Có dòng này giữa làm công việc của một ngày của riêng bạn và nhận được một chút giúp đỡ hợp lý từ một người bạn, và hoàn toàn làm điều đó làm việc cho bạn người bạn, hoặc gửi người đó mã của bạn để người đó có thể chỉ đơn giản là mất hoặc mượn nó ra ngay. Và đó là vượt qua dòng mà chúng ta rút ra trong lớp. Xem, giáo trình cuối cùng cho các dòng mà chúng ta rút ra như là hợp lý và hành vi không hợp lý, nhưng nó thực sự sôi xuống đến bản chất công việc của bạn cần phải là của riêng bạn trong các kết thúc. Bây giờ với những gì đã nói, có một heuristic. Bởi vì như bạn có thể imagine-- từ giờ hành chính và hình ảnh và các đoạn video chúng tôi đã thể hiện như vậy, far-- CS50 thực sự có nghĩa là phải như hợp tác và như hợp tác xã và xã hội càng tốt. Khi hợp tác vì nó là nghiêm ngặt. Nhưng với điều này cho biết, các heuristic, như bạn sẽ thấy trong giáo trình, là khi bạn gặp một số vấn đề. Bạn có một số lỗi trong mã của bạn mà bạn không thể giải quyết, đó là hợp lý cho bạn để hiển thị mã của bạn cho người khác. Một người bạn ngay cả trong lớp học, một người bạn ngồi bên cạnh bạn vào những giờ văn phòng, hoặc một thành viên của nhân viên. Nhưng họ có thể không hiển thị mã của họ cho bạn. Nói cách khác, một câu trả lời cho question-- của bạn Tôi cần help-- không oh, đây là mã của tôi. Hãy xem này và suy ra từ nó những gì bạn muốn. Bây giờ, tất nhiên, có một cách rõ ràng để chơi game hệ thống này, trong đó tôi sẽ chỉ cho bạn mã của tôi trước khi có một câu hỏi. Bạn chỉ cho tôi mã của bạn tôi trước khi có một câu hỏi. Nhưng thấy các giáo trình một lần nữa cho chi tiết tốt hơn của dòng này là nơi. Chỉ cần bây giờ vẽ lên bức tranh và chia sẻ như minh bạch càng tốt nơi chúng ta đang ở trong những năm gần đây, đây là số trường hợp Hội đồng quản trị rao vặt CS50 rằng đã có hơn Trong bảy năm qua. Với 14 trường hợp này giảm gần đây nhất. Xét về mặt học sinh tham gia, nó đã được 20 sinh viên một số lẻ mùa thu vừa qua. Có một đỉnh cao của 33 sinh viên cách đây vài năm. Nhiều người trong số họ là không may không còn ở đây trong khuôn viên trường. Học sinh tham gia như là một tỷ lệ phần trăm lớp học có lịch sử dao động từ 0% 5,3%, mà chỉ là để nói đây là một thách thức hàng năm. Và vào giai đoạn cuối đó, những gì chúng tôi muốn làm là truyền đạt một rằng chúng ta dd-- chỉ FYI-- so sánh ở một sự công bằng cho những học sinh sau đây là dòng phù hợp. Chúng tôi so sánh tất cả hiện tại đệ trình chống lại tất cả các nhiệm vụ trong quá khứ từ nhiều năm qua. Chúng tôi cũng biết làm thế nào để Google Quyền xung quanh và tìm thấy kho lưu trữ mã trực tuyến, diễn đàn thảo luận trực tuyến, trang web việc làm trực tuyến. Nếu một học sinh có thể tìm thấy nó, chúng ta có thể chắc chắn tìm thấy nó nhiều như chúng tôi tiếc làm gì. Vì vậy, những gì bạn sẽ thấy trong giáo trình mặc dù là khoản hối tiếc này. Tôi có thể chắc chắn đánh giá cao, và tất cả chúng ta có nhân viên đã thực hiện quá trình như này, hoặc này một mình theo thời gian, chắc chắn biết những gì nó giống như khi cuộc sống được trong cách khi bạn có một số đêm deadline-- không chỉ trong lớp học này, nhưng another-- khi bạn hoàn toàn kiệt sức, căng thẳng, có một số lượng quá mức những thứ khác để làm. Bạn sẽ thực hiện tại một số điểm trong cuộc sống chắc chắn là một xấu, có lẽ cuối quyết định ban đêm. Vì vậy, mỗi giáo trình, có điều khoản này, như vậy là nếu trong vòng 72 giờ làm một số quyết định sai lầm, bạn sở hữu lên đến nó và tiếp cận với tôi và một trong những người đứng đầu của khóa học và chúng ta sẽ có một cuộc trò chuyện. Chúng tôi sẽ xử lý mọi thứ nội bộ với hy vọng của nó ngày càng trở nên một lúc giảng dạy, bài học cuộc sống, và không phải cái gì với hậu quả đặc biệt mạnh mẽ như bạn có thể nhìn thấy trên các bảng xếp hạng ở đây. Vì vậy, đó là một giai điệu rất nghiêm trọng. Chúng ta hãy dừng lại chỉ là một vài giây để phá vỡ sự căng thẳng. [MUSIC CHƠI] DAVID J. Malan: Được rồi, vậy làm thế nào là một segue? Để chủ đề chính của ngày hôm nay. Là người đầu tiên trong số đó là trừu tượng. Một trong số đó là có được các đại diện của dữ liệu, mà thẳng thắn là một cách thực sự khô nói như thế nào chúng ta có thể đi về giải quyết vấn đề và suy nghĩ về việc giải quyết vấn đề? Vì vậy, bạn đã thấy trong Scratch, và bạn đã nhìn thấy có lẽ đã có trong pset1 với C bạn không chỉ có thể sử dụng chức năng, giống như printf, rằng những người khác trong năm qua đã viết cho bạn. Bạn cũng có thể viết các chức năng của riêng bạn. Và mặc dù bạn có thể không có thực hiện điều này trong C, và thẳng thắn trong pset1 bạn không thực sự cần phải viết của bạn chức năng riêng vì problem-- trong khi có lẽ khó khăn tại glance-- đầu tiên bạn sẽ thấy cuối cùng có thể được giải quyết với không phải tất cả mà nhiều dòng mã. Nhưng với những gì đã nói, trong điều kiện viết chức năng riêng của bạn, nhận ra rằng C không cung cấp cho bạn có khả năng này. Tôi sẽ đi vào mã nguồn của ngày hôm nay, trong đó có sẵn đã được trực tuyến, và tôi sẽ đi trước và mở một chương trình gọi là chức năng 0.C, và chức năng không chúng ta sẽ thấy một vài điều. Trong dòng đầu tiên thông qua 18 23 là chức năng chính của tôi. Và bây giờ chúng ta đang bắt đầu đọc mã mà chúng tôi không viết trên bay, nhưng thay vào đó tôi đã viết trước hoặc là bạn trong một vấn đề thiết lập có thể nhận được có được viết trước. Một cách tốt để bắt đầu đọc mã của người khác là tìm kiếm các chức năng chính. Tìm ra nơi mà mục Vấn đề là để chạy chương trình, và sau đó thực hiện nó một cách hợp lý từ đó. Vì vậy, chương trình này dường như bản in Tên của bạn theo sau dấu hai chấm. Sau đó chúng tôi sử dụng GetString từ thư viện CS50 để có được một chuỗi, hoặc một từ hoặc cụm từ từ người sử dụng vào bàn phím. Và sau đó có này điều PrintName here--. Bây giờ không phải là một PrintName chức năng mà đi kèm với C. Nó không có trong tiêu chuẩn io.h. Nó không phải trong CS50.h. Đó là thay vì trong cùng một tập tin. Chú ý nếu tôi di chuyển xuống một dòng bit-- 25 đến 27-- nó chỉ là một cách khá các bình luận mã của bạn bằng cách sử dụng các ngôi sao và dấu gạch chéo. Đây là một dòng đa bình luận, và điều này chỉ là mô tả của tôi trong màu xanh của những chức năng này không. Bởi vì trong dòng 28 đến 31, Tôi đã viết một chức năng siêu đơn giản Tên mà là PrintName. Phải mất bao nhiêu số, bạn sẽ nói gì? Vì vậy, một argument-- vì có một Lập luận được liệt kê trong dấu ngoặc đơn. Các loại đó là String. Mà là để nói PrintName giống như hộp đen này hoặc chức năng mà phải mất như là đầu vào một chuỗi. Và tên của String thuận tiện sẽ Name. Không S, không tồn tại, nhưng Name. Vì vậy, những gì PrintName làm gì? Đó là tốt đẹp đơn giản. Cũng như một dòng mã cho printf, nhưng dường như nó in ra "Hello", vậy và như vậy. Trong trường hợp như vậy và do xuất phát từ lập luận. Bây giờ đây không phải là một sự đổi mới rất lớn ở đây. Thực sự, tôi đã thực hiện một chương trình mà có thể đã được viết với một dòng mã bằng cách này lên đây, và thay đổi nó để một cái gì đó có liên quan đến một số sáu hoặc bảy hoặc lâu hơn dòng mã tất cả các con đường xuống đây. Nhưng đó là sự hành nghề của một nguyên tắc được gọi là trừu tượng. Loại đóng gói bên trong một mới chức năng mà có một cái tên, và tốt hơn nhưng tên đó theo nghĩa đen nói những gì nó làm. Ý tôi là printf-- đó không phải là đặc biệt mô tả. Nếu tôi muốn tạo ra một mảnh ghép, hoặc nếu tôi muốn tạo ra một chức năng có in tên của một ai đó, vẻ đẹp làm điều này là tôi thực sự có thể cung cấp chức năng mà một tên mô tả những gì nó làm. Bây giờ nó có một đầu vào Tôi đã tự ý gọi tên, nhưng đó cũng là tuyệt vời mô tả thay vì được nhiều hơn một chút chung chung như S. Và bãi bỏ, bây giờ, chỉ có nghĩa là rằng chức năng này không đưa cho tôi trở lại bất cứ điều gì. Nó không giống như GetString rằng nghĩa là đưa tôi trở lại một chuỗi như chúng ta đã làm với các mảnh giấy với các bạn cùng lớp của bạn tuần trước, mà đúng hơn là nó chỉ có một tác dụng phụ. Nó in một cái gì đó ra màn hình. Vì vậy, vào cuối ngày, nếu tôi không thực hiện chức năng-0, ./function-0, chúng ta sẽ thấy rằng nó hỏi tên của tôi. Tôi gõ David, và nó loại tên tôi. Nếu tôi làm điều đó một lần nữa với Rob, nó sẽ nói "Xin chào, Rob." Vì vậy, một ý tưởng đơn giản, nhưng có lẽ ngoại suy từ này tinh thần đó là chương trình của bạn có được một chút phức tạp hơn, và bạn muốn viết một đoạn mã và gọi đó code-- invoke code-- rằng một số mô tả đặt tên như PrintName, C không đủ khả năng cho chúng tôi khả năng này. Đây là một ví dụ đơn giản. Ví dụ, nếu tôi mở ra một nộp từ hôm nay được gọi là return.c, nhận thấy những gì tôi đã thực hiện ở đây. Hầu hết các chức năng chính này là printf. Lần đầu tiên tôi khởi tạo một cách tùy tiện biến gọi là x với số 2. Sau đó tôi in ra "x giờ là % I "đi qua trong giá trị của x. Vì vậy, tôi chỉ nói nó là gì. Bây giờ tôi chỉ mạnh dạn tuyên bố với printf. Tôi cubing rằng giá trị x, và tôi làm như vậy bằng cách gọi một chức năng gọi là khối lập phương qua trong x như là đối số, và sau đó tiết kiệm đầu ra trong biến chính nó, x. Vì vậy, tôi clobbering giá trị của x. Tôi trọng các giá trị của x với bất cứ điều gì kết quả của gọi chức năng khối này là. Và sau đó tôi chỉ in ra một số thứ lông ở đây nói những gì tôi đã làm. Vì vậy, những gì sau đó là khối lập phương? Chú ý những gì cơ bản khác nhau ở đây. Tôi đã cho các chức năng một tên như trước. Tôi đã chỉ định một tên cho một đối số. Lần này nó được gọi là n thay cho tên, nhưng tôi có thể gọi nó là bất cứ điều gì tôi muốn. Nhưng điều này là khác nhau. Điều này bên trái. Trước đây nó là những gì từ khóa? Boys. Bây giờ rõ ràng là int. Vì vậy, những gì có thể lấy đi? Trong khi đó, khoảng trống biểu thị loại hư vô, và đó là trường hợp. PrintName trở về không có gì. Nó đã làm một cái gì đó, nhưng nó không đưa cho tôi trở lại một cái gì đó mà tôi có thể đưa vào phía bên tay trái của một dấu bằng như tôi đã làm ở đây trên dòng 22. Vì vậy, nếu tôi nói ra trên đường 30, những gì mà có lẽ ngụ ý về khối không cho tôi? Vâng? Nó trả về một số nguyên. Vì vậy, nó đưa tôi trở lại, cho Ví dụ, một mảnh giấy mà nó đã viết câu trả lời. 2 giống tiêu, hoặc 3 giống tiêu, hoặc 4 cubed-- bất cứ điều gì tôi thông qua tại, và làm thế nào tôi thực hiện điều này? Vâng, chỉ cần n lần n lần n là làm thế nào tôi có thể cube một giá trị. Vì vậy, một lần nữa, siêu đơn giản ý tưởng, nhưng chỉ thị bây giờ làm thế nào chúng ta có thể viết các chức năng mà thực sự đã trở lại với chúng tôi giá trị mà có thể quan tâm. Hãy xem xét một ví dụ mới nhất đây gọi là chức năng một. Trong ví dụ này, nó bắt đầu để có được hấp dẫn hơn. Vì vậy, trong chức năng, thao tác này program-- thông báo cuối cùng gọi một chức năng được gọi là GetPositiveInt. GetPositiveInt không phải là một chức năng trong thư viện CS50, nhưng chúng tôi quyết định muốn nó tồn tại. Vì vậy, nếu chúng ta di chuyển xuống sau này trong các tập tin, nhận thấy làm thế nào tôi đã đi về việc thực hiện được tích cực int, và tôi nói đó là hấp dẫn hơn bởi vì đây là một phong nha số dòng mã. Nó không phải chỉ là một ngớ ngẩn ít chương trình đồ chơi. Nó thực sự có một số kiểm tra lỗi và làm một cái gì đó hữu ích hơn. Vì vậy, nếu bạn đã không thấy hương video mà chúng tôi đã nhúng vào trong pset1, biết rằng đây là một loại vòng lặp trong C, tinh thần tương tự đến các loại điều Scratch có thể làm. Và làm cho biết làm điều này. In trang này ra. Sau đó đi trước và nhận được n-- nhận được một int và lưu nó trong n, và tiếp tục làm điều này một lần nữa và một lần nữa và một lần nữa, miễn là n là ít hơn một. Vì vậy, n là có được ít hơn một chỉ khi con người không hợp tác. Nếu người đó là đánh máy trong 0 hoặc -1 hoặc -50, vòng lặp này sẽ giữ thực hiện một lần nữa và một lần nữa. Và cuối cùng nhận thấy, tôi chỉ đơn giản là trả về giá trị. Vì vậy, bây giờ chúng tôi có một chức năng mà có thể đã được tốt đẹp nếu CS50 sẽ thực hiện trong CS50.h và CS50.c cho bạn, nhưng ở đây chúng tôi có thể bây giờ thực hiện điều này bản thân mình. Nhưng hai ý kiến ​​trên một số chi tiết quan trọng. One-- tại sao tôi khai báo int n, bạn có nghĩ rằng, trên đường 29 thay vì chỉ làm ở đây, đó là phù hợp hơn với những gì chúng tôi đã làm tuần trước? Vâng? Một ý nghĩ tốt. Vì vậy, nếu chúng ta đặt nó ở đây, đó là hình như chúng ta tiếp tục tuyên bố một lần nữa và một lần nữa. Đó là trong và của chính nó là không có vấn đề, cho mỗi gia nhập, bởi vì chúng ta chỉ cần giá trị một lần và sau đó chúng ta sẽ có được một cái mới nào. Nhưng một ý nghĩ tốt. Vâng? Close. Vì vậy, bởi vì tôi đã tuyên bố trên n đường 29 bên ngoài vòng lặp, nó có thể truy cập trong suốt toàn bộ chức năng này. Không phải là các chức năng khác vì n vẫn là bên trong của các xoăn niềng răng ở đây. So-- chắc chắn. Chính xác. Vì vậy, đây thậm chí còn hơn thế nữa. Nếu chúng ta thay vì tuyên bố n ngay trên đường 32, đó là vấn đề bởi vì đoán nơi khác tôi cần phải truy cập vào nó? Trên đường 34, và quy tắc đơn giản của ngón tay cái là mà bạn chỉ có thể sử dụng một biến bên trong dấu ngoặc nhọn gần đây nhất mà bạn tuyên bố. Thật không may, dòng 34 là một trong những dòng quá muộn, bởi vì tôi đã đóng nẹp nhọn trên đường 33 tương ứng với ngoặc móc trên đường 30. Và vì vậy đây là một cách nói rằng biến int này được scoped, có thể nói, chỉ trong những dấu ngoặc nhọn. Nó chỉ không tồn tại bên ngoài của họ. Vì vậy, thực sự, nếu tôi làm điều này sai, hãy để tôi lưu các mã vì nó is-- không chính xác bằng văn bản. Hãy để tôi đi trước và làm cho chức năng-1, và lỗi notice--. Sử dụng không khai báo định danh n trên đường 35, ngay ở đây. Và nếu chúng ta di chuyển lên hơn nữa, một số khác. Sử dụng không khai báo n định trên dòng 34. Vì vậy, các trình biên dịch, kêu vang, được nhận thấy rằng nó chỉ không tồn tại mặc dù rõ ràng nó có trực quan. Vì vậy, một sửa chữa đơn giản là tuyên bố nó ở đó. Bây giờ hãy để tôi di chuyển đến trên cùng của tập tin. Có gì nhảy ra lúc bạn như là một chút khác nhau từ những thứ chúng ta nhìn vào tuần trước? Không chỉ để tôi có tên, không chỉ làm Tôi có một số sắc nét bao gồm lên hàng đầu, Tôi có một cái gì đó tôi gọi một nguyên mẫu. Bây giờ trông hết sức tương tự như những gì chúng tôi chỉ nhìn thấy một thời điểm cách đây trên dòng 27. Vì vậy, hãy suy ra từ một khác nhau thông báo lỗi do tại sao tôi đã làm điều này. Hãy để tôi đi trước và xóa những dòng đó. Và vì vậy chúng tôi không biết gì về nguyên mẫu. Làm lại tập tin này. Thực hiện chức năng một. Và bây giờ, chết tiệt, bốn lỗi. Hãy di chuyển lên đến đầu tiên. Khai tiềm ẩn của chức năng được tích cực int là không hợp lệ trong C99. C99 chỉ có nghĩa là năm 1999 phiên bản của ngôn ngữ C, đó là những gì chúng tôi đang thực sự sử dụng. Vì vậy, điều này có nghĩa là gì? Vâng C-- và cụ thể hơn C compilers-- là chương trình khá ngớ ngẩn. Họ chỉ biết những gì bạn đã nói với họ, và đó là chuyên đề thực sự so với tuần trước. Vấn đề là nếu tôi đi về việc thực hiện tên lên đây, và tôi gọi một chức năng được gọi là GetPositiveInt ở đây trên đường 20, chức năng về mặt kỹ thuật không tồn tại cho đến khi trình biên dịch thấy dòng 27. Thật không may, trình biên dịch làm những việc trên, xuống, trái, phải, như vậy bởi vì nó đã không nhìn thấy thực hiện GetPositiveInt, nhưng nó thấy bạn đang cố gắng sử dụng nó lên đây, nó chỉ sẽ bail-- mắng bạn với một lỗi có lẽ message-- khó hiểu, và không thực sự biên dịch các tập tin. Vì vậy, một cái gọi là nguyên mẫu lên ở đây là phải thừa nhận là không cần thiết. Theo nghĩa đen, tôi đi xuống ở đây và tôi sao chép và dán này, và tôi đặt nó lên đây. Void sẽ là thích hợp hơn, vì vậy chúng tôi sẽ nghĩa là sao chép và dán nó thời gian này. Tôi nghĩa là sao chép và dán nó. Thực sự chỉ là giống như một mảnh vụn bánh mì. Một đầu mối nhỏ để trình biên dịch. Tôi không biết điều này không Chưa hết, nhưng tôi hứa hẹn với bạn rằng nó sẽ tồn tại cuối cùng. Và đó là lý do tại sao trong này line-- dòng 16-- kết thúc bằng một dấu chấm phẩy. Nó là không cần thiết do thiết kế. Có? Nếu bạn không liên kết thư viện của bạn để gì-- oh, câu hỏi hay. Sharp bao gồm vùi đầu tập tin. Cần be-- nên hầu như luôn luôn ở đầu của tập tin cho một similar-- cho chính xác cùng một lý do, có. Bởi vì trong tiêu chuẩn io.h đúng là một dòng như thế này, nhưng với printf từ, và với đối số của nó và kiểu trả về của nó. Và như vậy bằng cách làm mạnh bao gồm lên ở đây, những gì bạn đang làm nghĩa đen được sao chép và dán nội dung của ai đó đã viết lên hàng đầu. Qua đó cluing mã của bạn vào các thực tế là những chức năng không tồn tại. Vâng? Hoàn toàn. Vì vậy, rất thông minh và chính xác giải pháp sẽ được, bạn biết không? Tôi không biết những gì một nguyên mẫu, nhưng tôi biết nếu tôi hiểu rằng chỉ là C câm và suy nghĩ lại trên xuống dưới. Vâng chúng ta hãy cung cấp cho nó những gì nó muốn. Hãy cắt mã, dán nó lên đầu, và bây giờ chính đẩy xuống dưới đây. Điều này cũng sẽ giải quyết vấn đề. Nhưng bạn có thể dễ dàng đưa ra một kịch bản trong đó A cần phải gọi B, B và có thể gọi trở lại A. này là một cái gì đó gọi là đệ quy, và chúng tôi sẽ quay trở lại đó. Và nó có thể hoặc không có thể là một tốt điều, nhưng bạn có thể chắc chắn phá vỡ giải pháp này. Và hơn thế nữa, tôi sẽ khẳng định phong cách, đặc biệt là khi chương trình của bạn trở thành này dài và dài này, nó chỉ là siêu thuận tiện đặt chính ở đầu bởi vì đó là điều hầu hết lập trình viên sẽ quan tâm. Và do đó, nó là một chút sạch hơn, cho là, để làm điều đó cách Ban đầu tôi đã làm nó với một nguyên mẫu thậm chí mặc dù nó có vẻ hơi dư thừa ở cái nhìn đầu tiên. Vâng? Xin lỗi, bạn có thể nói nó to hơn? Nếu bạn chuyển đổi vị trí của các thực hiện và nguyên mẫu? Vì vậy, đó là một câu hỏi hay. Nếu bạn lại tuyên bố này xuống ở đây, chúng ta hãy xem điều gì xảy ra. Vì vậy, nếu tôi đặt xuống này ở đây, bạn đang nói. Ồ, xin lỗi. To hơn? Thậm chí to hơn. Ồ, câu hỏi hay. Nó sẽ mất hiệu lực chức năng? Bạn biết đấy, sau khi tất cả những năm này, tôi có bao giờ đặt một nguyên mẫu sau đó. Vì vậy, chúng ta hãy làm cho chức năng-1 sau khi làm điều đó. [Lẩm bẩm] DAVID J. Malan: Oh, chờ đợi. Chúng tôi vẫn phải đặt mọi thứ lên hàng đầu. Vì vậy, hãy làm điều này ở đây, nếu tôi hiểu câu hỏi của bạn một cách chính xác. Tôi đang đặt tất cả mọi thứ, bao gồm cả các mẫu thử nghiệm trên chính, nhưng tôi đặt các mẫu thử nghiệm dưới thực hiện. Vì vậy, nếu tôi làm một, tôi nhận được lại không sử dụng một biến n error--. Oh, có. Cảm ơn bạn. Hãy xem, chúng ta thoát khỏi điều này. Đó là một lỗi khác nhau, vì vậy hãy bỏ qua điều đó. Hãy thực sự nhanh chóng làm lại này. OK, vì vậy tranh cãi dữ liệu không sử dụng định dạng chuỗi n-- oh, đó là bởi vì Tôi đã thay đổi những ở đây. Được rồi, chúng ta biết câu trả lời đang xảy ra đối với: được rồi, ở đây chúng tôi đi. Ah, nhờ tích cực. Được rồi, tôi sẽ sửa chữa mã này after-- bỏ qua lỗi này đặc biệt vì đây was-- nó hoạt động là câu trả lời. Vì vậy, nó không ghi đè lên những gì bạn vừa thực hiện. Tôi nghi ngờ trình biên dịch được viết theo cách như vậy rằng nó được bỏ qua nguyên mẫu của bạn bởi vì cơ thể, có thể nói, chức năng đã có được triển khai lên cao hơn. Tôi sẽ phải thực sự tham khảo ý kiến hướng dẫn của trình biên dịch để hiểu nếu có bất kỳ khác ý nghĩa, nhưng ở cái nhìn đầu tiên chỉ cần cố gắng và thử nghiệm, có vẻ là không có tác động. Câu hỏi. Vì vậy, chúng ta hãy giả mạo trước bây giờ, di chuyển khỏi tác dụng phụ là chức năng mà làm điều gì đó như trực quan trên màn hình với printf, nhưng không trả về giá trị. Và chức năng có trở lại giá trị như chúng tôi chỉ nhìn thấy một vài trong số. Chúng ta đã thấy khái niệm về phạm vi, và chúng ta sẽ thấy điều này một lần nữa và một lần nữa. Nhưng hiện nay, một lần nữa, sử dụng các quy tắc của ngón tay cái một biến chỉ có thể được sử dụng bên trong mở gần đây nhất và dấu ngoặc nhọn đóng như chúng ta thấy trong đó ví dụ cụ thể. Và như bạn chỉ ra, có một ability-- bạn có thể giải quyết một số vấn đề bằng cách đặt một biến toàn cầu ở đầu của một tập tin. Nhưng ở hầu hết các trường hợp chúng tôi sẽ tiết kiệm nụ cười khi đó, và thực sự thậm chí không đi vào rằng giải pháp cho bây giờ. Vì vậy, bây giờ, takeaway là biến có khái niệm về phạm vi. Nhưng bây giờ chúng ta hãy nhìn vào một cách khô thực sự tìm kiếm tại một số khá thú vị chi tiết thực hiện. Làm thế nào chúng ta có thể thể hiện thông tin. Và chúng tôi đã xem xét này trong tuần đầu tiên của lớp. Nhìn vào những chương trình, và nhắc nhở chúng ta về số thập phân. Nhưng nhớ lại từ tuần trước rằng C có các kiểu dữ liệu khác nhau và bó hơn, nhưng những người hữu ích nhất bây giờ có thể là các. Một char, hoặc nhân vật, trong đó xảy ra là một byte, hoặc tám tổng số bit. Và đó là để nói rằng kích thước của một char chỉ là một byte. Một byte là tám bit, vì vậy điều này có nghĩa là chúng ta có thể đại diện cho bao nhiêu ký tự. Có bao nhiêu chữ cái hoặc biểu tượng trên bàn phím nếu chúng ta có một byte hoặc tám bit. Hãy nhớ lại tuần không. Nếu bạn có tám bit, có bao nhiêu tổng giá trị bạn có thể đại diện với mô hình số không và những người thân? One-- nhiều hơn thế. Vì vậy, tổng số 256 nếu bạn bắt đầu đếm từ số không. Vì vậy, nếu bạn có tám bits-- vì vậy nếu chúng ta có bóng đèn nhị phân của chúng tôi ở đây một lần nữa, chúng ta có thể biến những bóng đèn trên và tắt trong bất kỳ 256 mẫu độc đáo. Bây giờ đây là một chút vấn đề. Không quá nhiều tiếng Anh và ngôn ngữ lãng mạn, nhưng chắc chắn khi bạn giới thiệu, cho Ví dụ, ngôn ngữ châu Á, trong đó có thêm rất nhiều biểu tượng hơn như 26 chữ cái trong bảng chữ cái. Chúng tôi thực sự có thể cần nhiều hơn một byte. Và may mắn trong những năm gần đây có xã hội các tiêu chuẩn khác thông qua sử dụng nhiều hơn một byte mỗi lần sạc. Nhưng hiện nay trong C, mặc định chỉ là một byte hoặc tám bit. Một số nguyên, trong khi đó, là bốn byte, hay còn gọi là 32 bit. Điều đó có nghĩa những gì là lớn nhất có thể số chúng ta có thể đại diện với một int rõ ràng? Với một tỷ USD. Vì vậy, nó là bốn tỷ nhân đạo hoặc thực hiện. 2 với sức mạnh 32th, nếu chúng ta giả sử không có số âm và chỉ cần sử dụng tất cả tích cực số, đó là bốn tỷ cho hoặc mất khả năng. Một float, trong khi đó, là một loại khác nhau các kiểu dữ liệu trong C. Nó vẫn là một con số, nhưng đó là một số thực. Một cái gì đó với một dấu thập phân. Và nó chỉ ra rằng C cũng sử dụng bốn byte để đại diện cho các giá trị nổi điểm. Thật không may có bao nhiêu nổi các giá trị điểm đang có trên thế giới? Có bao nhiêu số thực nào? Có một vô hạn số, và cho rằng vấn đề có một số lượng vô hạn các số nguyên. Vì vậy, chúng tôi đã loại đào mình một lỗ ở đây. Nhờ đó mà dường như trong computers-- tại chương trình ít nhất viết bằng C trên them-- chỉ có thể đếm cao bốn tỷ cho hoặc mất, và nổi các giá trị điểm chỉ có thể rõ ràng có một số lượng hữu hạn của độ chính xác. Chỉ có rất nhiều chữ số sau dấu thập phân của họ. Bởi vì, tất nhiên, nếu bạn chỉ có 32 bit, Tôi không biết làm thế nào chúng ta sẽ đi về đại diện numbers-- thực thể với các loại khác nhau của các mẫu. Nhưng có chắc chắn là một hữu hạn số mô hình như vậy, vì vậy ở đây cũng vậy, đây là vấn đề. Bây giờ chúng ta có thể tránh được vấn đề một chút. Nếu bạn không sử dụng một phao, bạn có thể sử dụng một đôi trong C, cho phép bạn tám byte, là cách nhiều mẫu có thể có của số không và những người thân. Nhưng nó vẫn còn hữu hạn, đó là sẽ là vấn đề nếu bạn viết phần mềm cho đồ họa hoặc ưa thích công thức toán học. Vì vậy, bạn thực sự có thể muốn đếm lớn hơn đó. Một dài long-- ngớ ngẩn named-- cũng tám byte, hoặc 64 bit là, và điều này là gấp đôi thời gian như một int, và đó là một giá trị số nguyên dài. Fact-- thú vị nếu một int là bốn byte, bao lâu là một chặng đường dài trong C thường? Ngoài ra bốn byte, nhưng một lâu dài là tám byte, và điều này là vì các lý do lịch sử. Nhưng bây giờ takeaway chỉ là dữ liệu có được đại diện trong một computer-- đó là một thiết bị vật lý như điện, nó thường được lái xe những số không và ones-- với số lượng hữu hạn của độ chính xác. Vì vậy, vấn đề là những gì sau đó? Cũng có một vấn đề tràn số nguyên. Không chỉ trong C, nhưng trong máy tính nói chung. Ví dụ, nếu điều này là một byte có giá trị một bit-- vì vậy nếu đây là tám bit-- tất cả trong đó có một số. Số lượng này là gì đại diện nếu chúng ta giả đó là tất cả các giá trị tích cực trong hệ nhị phân? 255, và nó không phải là 256, vì không là số lượng thấp nhất. Vì vậy, 255 là cao nhất một, nhưng vấn đề là giả mà tôi muốn tăng biến này đang sử dụng tổng cộng tám bit nếu tôi muốn tăng nó. Cũng như ngay sau khi tôi thêm một một cho tất cả những người này, có lẽ bạn có thể tưởng tượng chỉ visually-- như thực hiện một trong những sử dụng decimals-- một cái gì đó sẽ chảy vào bên trái. Và quả thực, nếu tôi thêm số một này, những gì xảy ra trong hệ nhị phân là nó tràn trở lại bằng không. Vì vậy, nếu bạn chỉ use-- không phải là một int, nhưng một byte đơn để đếm số nguyên trong một chương trình, bởi default-- càng sớm càng bạn nhận được đến 250, 251, 252, 253, 254, 255-- 0 đến sau 255, mà có lẽ không phải những gì một người sử dụng sẽ mong đợi. Bây giờ trong khi ở dấu chấm động thế giới, bạn cũng có một vấn đề tương tự. Không quá nhiều với number-- lớn nhất mặc dù đó vẫn là một vấn đề. Nhưng với số lượng chính xác mà bạn có thể đại diện. Vì vậy, chúng ta hãy xem ví dụ này ở đây cũng từ code-- nguồn của ngày hôm nay phao 0.c. Và nhận thấy đó là một siêu chương trình đơn giản rõ ràng nên in ra giá trị gì? Điều gì làm bạn cược này sẽ in mặc dù có một chút của cú pháp mới ở đây? Vì vậy, hy vọng 0.1. Vì vậy, tương đương với một phần mười bởi vì tôi đang làm 1 chia cho 10. Tôi đang lưu trữ các câu trả lời trong một biến gọi là f. Biến đó là kiểu float, mà là một từ khóa Tôi chỉ đề nghị tồn tại. Chúng tôi đã không nhìn thấy điều này trước đây, nhưng đây là loại một cách gọn gàng trong printf để xác định có bao nhiêu chữ số bạn muốn nhìn thấy sau khi một điểm thập phân. Vì vậy, ký hiệu này chỉ có nghĩa là rằng đây là một giữ chỗ. Đó là một dấu chấm động giá trị, và oh, bằng cách này, hiển thị nó với dấu thập phân với một số sau dấu thập phân. Vì vậy, đó là số đáng kể chữ số, vậy để nói chuyện, bạn có thể muốn. Vì vậy, hãy để tôi đi trước và làm làm nổi-0, ./float-0, và dường như 1 chia cho 10 là 0.0. Bây giờ tại sao điều này? Vâng một lần nữa, các máy tính đang tôi theo nghĩa đen, và tôi đã viết 1 và tôi bằng văn bản 10, và hãy đoán những gì là kiểu dữ liệu giả định cho hai giá trị? Một int, đó là kỹ thuật một chút gì đó khác nhau. Đó là điển hình một thời gian dài, nhưng nó cuối cùng là một giá trị không thể thiếu. Không phải là một giá trị dấu chấm. Mà là để nói rằng nếu điều này là một int và đây là một int, vấn đề là máy tính không có khả năng thậm chí lưu trữ mà dấu thập phân. Vì vậy, khi bạn làm 1 chia 10 cách sử dụng số nguyên cho cả tử số và mẫu số, câu trả lời phải là 0.1. Nhưng vì computer-- đó là integers-- không biết phải làm gì với 0,1. Vì vậy, những gì nó làm rõ ràng không? Nó chỉ cần ném nó đi, và những gì tôi nhìn thấy cuối cùng là 0.0 chỉ vì tôi nhấn mạnh rằng printf chỉ cho tôi một điểm thập phân. Nhưng vấn đề là nếu bạn chia một số nguyên của một số nguyên, bạn sẽ get-- theo định nghĩa C-- của một số nguyên. Và nó sẽ không làm một cái gì đó tốt đẹp và thuận tiện như vòng nó lên đến gần nhất lên hoặc xuống. Nó sẽ cắt xén tất cả mọi thứ sau khi các số thập phân. Vì vậy, chỉ bằng trực giác, những gì có thể là một sửa chữa? Sửa chữa đơn giản nhất ở đây là gì? Vâng? Chính xác. Tại sao chúng ta không chỉ điều trị này như là nổi các giá trị điểm hiệu quả biến chúng thành phao hoặc gấp đôi. Và bây giờ nếu tôi làm cho nổi-0, hoặc nếu tôi biên dịch nổi-1, là giống hệt với những gì đã được chỉ là đề xuất. Và bây giờ tôi làm nổi-0, bây giờ tôi có được 0,1 tôi. Bây giờ điều này là tuyệt vời. Nhưng bây giờ tôi sẽ làm một chút gì đó khác nhau. Tôi tò mò để xem những gì thực sự xảy ra dưới mui xe, và tôi sẽ in này ra 28 chữ số thập phân. Tôi muốn thực sự thấy 0.1000-- một infinite-- [Không nghe được] 27 số không sau đó 0.1. Vâng chúng ta hãy xem nếu đó là những gì tôi thực sự nhận được. Hãy cùng một tập tin nổi-0. ./floats-0. Hãy phóng to đáp trả mạnh mẽ. Tất cả thời gian này, bạn đã suy nghĩ 1 chia cho 10 là 10%, tương đương 0.1. Nó không phải. Ít nhất cho đến nay là máy tính có liên quan. Bây giờ why-- OK, đó là hoàn thành lời nói dối 1 chia cho 10 là 0,1. Nhưng đó không phải là why-- takeaway ngày hôm nay. Vậy tại sao máy tính nghĩ rằng, không giống như tất cả chúng ta trong phòng, mà 1 chia cho 10 là thực sự là giá trị điên? Máy tính làm rõ ràng là gì? Đó là những gì? Nó không tràn, cho mỗi gia nhập. Tràn là thường khi bạn quấn quanh một giá trị. Đó là vấn đề này không chính xác trong một giá trị dấu chấm động nơi mà bạn chỉ có 32 hoặc thậm chí 64 bit. Nhưng nếu có một vô hạn số numbers-- thực với số điểm thập phân và số thereafter-- chắc chắn bạn không thể đại diện cho tất cả chúng. Vì vậy, các máy tính đã được chúng ta những trận đấu gần nhất để giá trị của nó có thể đại diện cho sử dụng mà nhiều bit với giá trị Tôi thực sự muốn, đó là 0,1. Thật không may, nếu bạn bắt đầu làm toán, hoặc bạn bắt đầu liên quan đến các loại trôi nổi các giá trị điểm quan trọng trong programs-- phần mềm tài chính, quân sự bất cứ điều gì software-- nơi nhận thức là có lẽ là khá quan trọng. Và bạn bắt đầu thêm số như thế này, và bắt đầu chạy phần mềm với đầu vào thực sự lớn hoặc cho rất nhiều giờ hoặc nhiều ngày hoặc nhiều năm, những sai lầm nhỏ chút chắc chắn có thể tăng lên theo thời gian. Bây giờ là một sang một bên, nếu bạn đã bao giờ Superman nhìn thấy 3 hoặc Office Space và bạn có thể nhớ lại làm thế nào những kẻ đánh cắp rất nhiều tiền từ các máy tính của họ bằng cách sử dụng các giá trị điểm nổi và thêm lên ít còn lại, hy vọng bộ phim mà bây giờ có ý nghĩa hơn. Đây là những gì họ ám chỉ đến trong bộ phim đó. Thực tế là hầu hết các công ty sẽ không nhìn sau khi một số lượng nhất định các chữ số thập phân, nhưng đó là những thành phần của xu. Vì vậy, bạn bắt đầu thêm chúng lên, bạn bắt đầu kiếm được nhiều tiền trong tài khoản ngân hàng của bạn. Vì vậy, đó là Office Space giải thích. Bây giờ không may ngoài Office Space, có một số hợp pháp gây phiền hà và tác động đáng kể của các loại quyết định thiết kế cơ bản, và thực sự là một trong những lý do chúng tôi sử dụng C trong khóa học là như vậy mà bạn thực sự có đất này tăng sự hiểu biết về cách thức các máy tính làm việc, phần mềm hoạt động như thế nào, và không có bất cứ điều gì cho các cấp. Và quả thật không may, ngay cả với rằng sự hiểu biết cơ bản, con người chúng ta phạm sai lầm. Và những gì tôi nghĩ rằng tôi muốn chia sẻ là Video tám phút này đây thực từ một tập phim Modern Marvels, đó là một chương trình giáo dục về cách làm việc mà vẽ hai hình ảnh trong khi sử dụng không đúng và hiểu biết về giá trị dấu chấm động dẫn đến một số đáng kể kết quả đáng tiếc. Chúng ta hãy có một cái nhìn. [VIDEO xem lại] -Chúng tôi bây giờ quay trở lại "Kỹ thuật Thảm họa "trên Modern Marvels. Máy tính. Tất cả chúng ta đã đến để chấp nhận vấn đề thường bực bội mà có với them-- lỗi, virus, và phần mềm glitches-- cho giá nhỏ phải trả cho sự tiện lợi. Nhưng trong công nghệ cao và tốc độ cao quân sự và chương trình không gian ứng dụng, vấn đề nhỏ nhất có thể được phóng vào thảm họa. Ngày 4 tháng Sáu năm 1996, các nhà khoa học chuẩn bị để khởi động một tên lửa không người lái Ariane 5. Nó được thực hiện khoa học vệ tinh được thiết kế thiết lập một cách chính xác như thế nào Tương tác từ trường của Trái đất với sức gió mặt trời. Các tên lửa được xây dựng cho Cơ quan Vũ trụ châu Âu, và dỡ bỏ khỏi cơ sở của mình trên bờ biển French Guiana. -At Khoảng 37 giây vào chuyến bay, họ lần đầu tiên một cái gì đó nhận thấy đã đi sai. Đó là các đầu phun được xoay trong một cách mà họ thực sự không nên. Khoảng 40 giây vào chuyến bay, rõ ràng chiếc xe đang gặp khó khăn, và đó là khi họ thực hiện quyết định phá hủy nó. Nhân viên an toàn phạm vi, với quyết tâm to lớn, nhấn nút và thổi lên các tên lửa trước khi nó có thể trở thành một mối nguy hiểm cho an toàn công cộng. -Đây Là đầu tiên hành trình của tên lửa Ariane 5, và phá hủy nó mất đặt vì các lỗ hổng nhúng vào trong phần mềm của tên lửa. -Các Vấn đề trên Ariane là có là một số đòi hỏi 64 bit để thể hiện, và họ muốn chuyển đổi nó đến một số 16-bit. Họ cho rằng số lượng sẽ không bao giờ là rất lớn. Rằng hầu hết những chữ số trong số 64-bit là số không. Họ đã lầm. -Các Không có khả năng của một chương trình phần mềm để chấp nhận các loại số được tạo ra bởi khác là gốc rễ của sự thất bại. Phát triển phần mềm đã trở thành một một phần rất tốn kém của công nghệ mới. Các tên lửa Ariane 4 có đã rất thành công. Vì vậy, phần lớn các phần mềm được tạo ra cho nó cũng được sử dụng trong tên lửa Ariane 5. -Các Vấn đề cơ bản là các tên lửa Ariane 5. Được faster-- tăng tốc nhanh hơn, và phần mềm đã không được tính đó. -Các Phá hủy các tên lửa là một thảm họa tài chính khổng lồ. Tất cả đều do một lỗi phần mềm phút. Nhưng đây không phải là lần đầu tiên Hiện vấn đề chuyển đổi dữ liệu đã cản công nghệ tên lửa hiện đại. -Trong năm 1991 với sự khởi đầu Chiến tranh vùng Vịnh đầu tiên, các tên lửa Patriot kinh nghiệm một loại tương tự của một vấn đề chuyển đổi số. Và kết quả là 28 people-- 28 Soldiers-- Mỹ đã thiệt mạng, và khoảng một trăm người khác bị thương. Khi Patriot, được cho là để bảo vệ chống lại các tên lửa Scud đến, thất bại trong việc bắn tên lửa. -Khi Iraq xâm chiếm Kuwait, và Mỹ đưa ra Bão táp sa mạc vào đầu năm 1991, Pin tên lửa Patriot đã được triển khai để bảo vệ Ả Rập Saudi và Israel từ các cuộc tấn công tên lửa Scud của Iraq. Patriot là một Mỹ tầm trung bề mặt-đối-không hệ thống sản xuất bởi công ty Raytheon. -Các Kích thước của Patriot đánh chặn itself-- nó dài khoảng khoảng 20 feet, và nó chỉ nặng khoảng 2.000 kg. Và nó mang một đầu đạn hạt nhân của khoảng, Tôi nghĩ đó là khoảng 150 pounds. Và chính nó là đầu đạn hạt nhân một vụ nổ, trong đó có mảnh vỡ xung quanh mình. Vì vậy, vỏ của đầu đạn hạt nhân là được thiết kế để hoạt động như một đạn chì. -Các Tên lửa được thực hiện bốn trên mỗi container, và được vận chuyển bằng một trailer bán. -Các Hệ thống chống tên lửa Patriot đi lại ít nhất 20 năm nay. Nó được thiết kế ban đầu như một tên lửa phòng không để bắn hạ máy bay của đối phương. Trong chiến tranh vùng Vịnh đầu tiên khi chiến tranh đã vào, Quân đội muốn sử dụng nó để bắn hạ tên lửa Scud, không phải máy bay. Không quân Iraq đã không quá nhiều của một vấn đề, nhưng quân đội đã lo lắng về tên lửa Scud. Và vì vậy họ đã cố gắng để nâng cấp Patriot. -Intercepting Một kẻ thù tên lửa đi du lịch ở tốc độ Mach 5 được sẽ được thử thách đủ. Nhưng khi Patriot được đưa vào hoạt động, Quân đội đã không nhận thức một sửa đổi của Iraq mà làm tên lửa Scud của họ gần không thể để nó. Cái gì đã xảy ra là tên lửa Scud mà đã đi vào là không ổn định. Họ đã lung lay. Lý do cho điều này là Iraqis-- để có được 600 cây số ra của một phạm vi 300 km missile-- mất trọng lượng của đầu đạn phía trước, và thực hiện các đầu đạn nhẹ hơn. Vì vậy, bây giờ của Patriot cố gắng để đến tại Scud, và hầu hết các time-- đại đa số các time-- nó sẽ chỉ bay của tên lửa Scud. -Một Khi các nhà khai thác hệ thống Patriot nhận ra Patriot bỏ lỡ mục tiêu của nó, họ nổ đầu đạn của Patriot để tránh thương vong có thể nếu nó được phép rơi xuống mặt đất. -Điều Đó là những gì hầu hết mọi người thấy như quả cầu lửa lớn trên bầu trời, và hiểu lầm như chặn các tên lửa Scud đầu đạn hạt nhân. -Although Trên bầu trời đêm, Patriots xuất hiện để được phá hủy thành công Tên lửa Scud, tại Dhahran có thể có không có sai lầm về hiệu quả của nó. Có hệ thống radar của Patriot bị mất theo dõi của một tên lửa Scud đến và không bao giờ đưa ra do để một lỗ hổng phần mềm. Đó là người Israel đầu tiên phát hiện ra mà còn là hệ thống trên, lớn hơn các thời gian khác biệt đã trở thành. Do một đồng hồ nhúng trong máy tính của hệ thống. -Về Hai tuần trước khi thảm kịch ở Dhahran, Israel báo cáo Bộ Quốc phòng rằng hệ thống đã làm mất thời gian. Sau khoảng tám giờ chạy, họ nhận thấy rằng hệ thống của trở thành đáng chú ý kém chính xác hơn. Bộ Quốc phòng trả lời bằng cách nói với tất cả các pin Patriot để không để lại các hệ thống trong một thời gian dài. Họ không bao giờ nói những gì một thời gian dài được. 8 giờ, 10 giờ, một nghìn giờ. Không ai biết. -Các Pin Patriot đóng tại doanh trại tại Dhahran và thiếu sót nội bộ của mình đồng hồ đã được bật lên trong hơn 100 giờ vào đêm 25 tháng 2. -Nó Theo dõi thời gian với độ chính xác khoảng một phần mười của một giây. Bây giờ một phần mười của một giây là một con số thú vị bởi vì nó không thể được thể hiện trong hệ nhị phân chính xác, mà có nghĩa là nó không thể được thể hiện một cách chính xác trong bất kỳ máy tính kỹ thuật số hiện đại. Thật khó để tin, nhưng sử dụng như là một ví dụ. Hãy lấy số thứ ba. Một phần ba không thể thể hiện trong thập phân chính xác. Một phần ba là 0,333 diễn ra trong vô cùng. Không có cách nào để làm điều đó với độ chính xác tuyệt đối trong một số thập phân. Đó chính là loại vấn đề đã xảy ra trong Patriot. Các hệ thống còn chạy, tồi tệ hơn đã trở thành lỗi thời gian. -Sau 100 giờ hoạt động, lỗi trong thời gian chỉ khoảng một phần ba của một giây. Nhưng về nhắm mục tiêu một tên lửa đi du lịch ở tốc độ Mach 5, nó dẫn đến một theo dõi lỗi của hơn 600 mét. Nó sẽ là một lỗi nghiêm trọng cho những người lính tại Dhahran. Cái gì đã xảy ra là một khởi động tên lửa Scud là phát hiện bởi vệ tinh cảnh báo sớm, và họ biết rằng một tên lửa Scud đã đến trong chỉ đạo chung của họ. Họ không biết nơi nó sẽ đến. Bây giờ nó đã lên đến radar thành phần của hệ thống Patriot bảo vệ Dhahran để xác định vị trí và giữ theo dõi các tên lửa của địch. -Các Radar là rất thông minh. Nó thực sự có thể theo dõi vị trí của tên lửa Scud và sau đó dự đoán nơi nó có lẽ sẽ trong thời gian tới radar gửi một xung ra. Đó được gọi là cổng phạm vi. -Sau Khi Patriot quyết định có đủ thời gian thông qua để quay trở lại và kiểm tra tiếp theo vị trí cho đối tượng phát hiện này nó đi lại. Vì vậy, khi trở lại sai vị trí, nó sau đó thấy không có đối tượng. Và nó quyết định rằng không có đối tượng. Đó là có một phát hiện sai và tụt xuống theo dõi. -Các Đến Scud biến mất từ màn hình radar, và giây sau đó, đâm sầm vào doanh trại. Các tên lửa Scud giết chết 28. Đó là người cuối cùng bị sa thải trong cuộc chiến tranh vùng Vịnh đầu tiên. Buồn thay, phần mềm cập nhật đến lúc bình minh ngày hôm sau. Các phần mềm có lỗ hổng được cố định, đóng cửa một chương trong khó khăn lịch sử của tên lửa Patriot. [END IMG xem lại] DAVID J. Malan: Đó là nó cho CS50. Chúng ta sẽ thấy bạn vào ngày thứ Tư. [MUSIC CHƠI]