[Chơi nhạc] DAVID J Malan: Được rồi, chào đón trở lại CS50. Đây là khởi đầu của tuần hai. Một lời từ một trong những của chúng tôi bạn bè trong khuôn viên trường - nếu bạn quan tâm, có thể, hoặc ngay bây giờ hoặc trong một số hạn tương lai thậm chí, một khi thoải mái hơn, giảng dạy học sinh trung học một chút một cái gì đó về khoa học máy tính, làm đầu đến URL đó. Họ có nhu cầu đặc biệt ngay bây giờ của giáo viên, đặc biệt là nếu bạn có đã có một số tiếp xúc với khoa học máy tính. Vì vậy, nhớ lại rằng thời gian qua, chúng tôi giới thiệu một vài kiểu dữ liệu trong C, và bạn có thể đã bắt đầu để có được của bạn tay bẩn với những vậy, đến nay trong vấn đề thiết lập một. Và chúng tôi đã có một char. Vì vậy, về phần kỹ thuật, những gì là một char như bạn biết điều đó ngày hôm nay? Vì vậy, đó là một nhân vật, nhưng chúng ta hãy được chính xác hơn bây giờ. Chúng ta có ý nghĩa gì bởi nhân vật hoặc cá nhân char? Một nhân vật không số - do đó, không nhất thiết. Nó chỉ ra rằng con số thậm chí, ngay cả dấu chấm câu và chữ là đại diện với dữ liệu này gõ được biết đến như một char. Vì vậy, nó không nhất thiết phải theo thứ tự abc. Yeah? Vì vậy, nó là một ký tự ASCII. Vì vậy, nếu bạn nghĩ về tuần không, khi chúng tôi đã có byte của chúng tôi tình nguyện viên đi lên và hai nắm tay của họ lên hoặc không phải tất cả, họ đại diện cho bit. Nhưng chung là một nhóm tám, họ đại diện cho một byte. Và chúng tôi giới thiệu các khái niệm về ASCII ở bài giảng đó, mà chỉ đơn giản là một lập bản đồ giữa các con số và chữ cái. Và sử dụng ASCII, như những con người ngụ ý, tám bit để đại diện cho một nhân vật. Vì vậy, cho phù hợp, nếu tám bit có thể từng đảm nhận một trong hai giá trị - không hoặc một - đó có nghĩa là có hai khả năng cho người này - không hoặc một - hai cho người này, hai này người, hai cho một này. Vì vậy, tổng cộng hai lần hai lần hai lần hai lần hai - do đó, hai thứ tám trong tổng số. Do đó, có một tổng số ký tự 256 có thể là bạn có thể đại diện với tám bit. Bây giờ, những người bạn của người nói tiếng châu Á ngôn ngữ có thể biết rằng có hơn các nhân vật trong thế giới hơn là chỉ A và B và Cs và Ds. Và quả thực, ASCII không đủ cho rất nhiều ngôn ngữ trên thế giới. Nhưng thêm vào đó một thời gian. Cho bây giờ, biết rằng trong C nếu bạn muốn để đại diện cho một lá thư, một mảnh dấu chấm câu, hoặc chỉ cần một cái gì đó nhân vật trong tự nhiên, chúng tôi sử dụng một char. Và đó là một byte hoặc tám bit. Làm thế nào về một int? Vâng, một int là một số nguyên. Bao nhiêu bit, nếu bạn nhớ lại, là một số nguyên thường? Bất cứ ai thu hồi? Vì vậy, nó thường 32. Nó thực sự phụ thuộc vào máy tính mà bạn đang sử dụng. Nhưng trong thiết bị, và trong rất nhiều máy tính, đó là 32 bit hoặc bốn byte - tám lần bốn. Và số nguyên chỉ được sử dụng để lưu trữ số, hoặc là tiêu cực, tích cực, hoặc không. Và nếu bạn đã có 32 bit, và bạn chỉ chăm sóc về những con số tích cực, có thể bất cứ ai sân chơi bóng chày bao nhiêu có thể nguyên một máy tính có thể đại diện cho từ không vào lên? Vì vậy, nó sẽ là hai đến 32, trong đó là khoảng bốn tỷ USD. Vì vậy, các quyền hạn của hai sẽ được chủ đề định kỳ trong khoa học máy tính. Như chúng ta sẽ thấy, họ đang khá thuận tiện làm việc với ngay cả khi nó không hoàn toàn dễ dàng để làm các phép tính trong đầu của một người. Vì vậy, chúng tôi sẽ nói khoảng bốn tỷ USD. Bây giờ, một lâu dài - bạn có thể loại đoán. Nó dài hơn một int. Bao nhiêu bit? Vì vậy, 64 bit hoặc tám byte. Điều này chỉ có nghĩa là bạn có thể đại diện cho cả số lớn hơn, lớn hơn tích cực hay số âm lớn hơn. Và làm thế nào về nổi? Đó là một điểm nổi giá trị của 32 bit. Đây chỉ là một số thực, một cái gì đó với một dấu thập phân. Nhưng nếu bạn thay vì cần nhiều nơi hơn sau dấu thập phân hoặc bạn muốn đại diện cho một số lượng lớn hơn với một số phần sau nó, bạn có thể sử dụng một đôi, đó là 64 bit. Nhưng có một thú vị takeaway đây. Vì vậy, nếu số nguyên được giới hạn bởi 32 bit và thậm chí chờ đợi lâu được giới hạn bởi 64 bit, sắp xếp của đặt ra câu hỏi, nếu bạn thực sự muốn đếm cao hơn 4 tỷ USD cho một int? Vâng, bạn chỉ cần sử dụng một lâu dài. Nhưng nếu bạn muốn đếm cao hơn hai đến thứ 64, cho hay phải mất? Bây giờ, đó là một số lượng lớn. Nhưng cuối cùng, bạn có thể thực sự quan tâm đến các loại giá trị, đặc biệt là nếu bạn đang sử dụng một cơ sở dữ liệu và bắt đầu thu thập rất nhiều và rất nhiều và rất nhiều dữ liệu và phân công độc đáo số điện thoại để mỗi phần dữ liệu đó. Vì vậy, chúng tôi loại có một vấn đề. Và tương tự, với dấu chấm động giá trị - nổi hoặc đôi - nếu bạn đã chỉ có một số hữu hạn bit, bao nhiêu tổng số có thể bạn có thể đại diện? Vâng, đó là chưa rõ ràng khi bạn liên quan đến một điểm thập phân. Nhưng nó chắc chắn hữu hạn. Nếu bạn có một số hữu hạn các bit, một số hữu hạn của con người, một hữu hạn số lượng bóng đèn, chắc chắn bạn có thể chỉ đại diện cho một số hữu hạn các nổi các giá trị điểm. Nhưng bao nhiêu số thực là của họ trên thế giới? Có một vô hạn. Vì vậy, đó là loại một vấn đề bởi vì chúng tôi không có một số lượng vô hạn của bộ nhớ hoặc bộ nhớ RAM trong máy tính của chúng tôi. Vì vậy, một số điều khó khăn có thể xảy ra. Vì vậy, chúng ta hãy đi trước và thử để thể hiện điều này ở đây. Hãy để tôi đi trước và mở gedit. Tôi sẽ đi trước và lưu một tập tin được gọi là "floats0.c" chỉ để được phù hợp với một ví dụ đó là có sẵn trực tuyến, nếu bạn muốn. Và tôi sẽ đi trước và định nghĩa nó như sau - Tôi sẽ đi trước và nói, int void main, như chúng ta thường làm. Và sau đó trong chương trình này, tôi sẽ tuyên bố bản thân mình một phao, do đó, một 32-bit biến được gọi là f, tùy tiện. Và sau đó tôi sẽ lưu trữ trong nó Tôi không biết, một phần mười, vì vậy 0.1. Vì vậy, tôi sẽ thể hiện điều đó như một chia cho 10, đó là hoàn toàn hợp pháp trong C. Và sau đó trên dòng thứ hai, tôi chỉ đơn giản là muốn in ra giá trị đó. Vì vậy, nhớ lại rằng chúng ta có thể sử dụng quen thuộc printf. Chúng tôi không muốn sử dụng% i cho một int. Chúng tôi muốn sử dụng% f cho một phao. Và sau đó tôi sẽ làm dấu gạch chéo ngược n, quote gần, dấu phẩy, f, dấu chấm phẩy. Vì vậy, đây là chương trình của tôi. Đã có một lỗi. Không ai cho ai này nhấp đã muốn chỉ ở mức tối thiểu một lỗi tôi đã thực hiện? Yeah? Vâng. Tôi quên "# bao gồm" ở đầu, triệu chứng của họ mà nếu tôi cố gắng biên dịch này là có được rằng biên dịch sẽ hét vào mặt tôi, nói biểu tượng không xác định hoặc một cái gì đó để có hiệu lực đó. Nó không hiểu điều gì đó như printf. Vì vậy, tôi sẽ làm "# bao gồm ", Lưu tập tin. Và bây giờ là trong hình dạng tốt hơn. Nhưng tôi cũng sẽ chỉ ra một chi tiết mới hôm nay. Ngoài việc xác định nơi chủ như% f% i% s, bạn có thể đôi khi ảnh hưởng đến hành vi của giữ chỗ đó. Ví dụ, trong trường hợp của một nổi giá trị điểm, nếu tôi chỉ muốn để hiển thị một số thập phân sau khi thời gian, tôi thực sự có thể làm 0.1f. Vì vậy, nói cách khác, tôi tách f và các dấu phần trăm với 0.1, chỉ nói printf, bạn có thể có toàn bộ loạt các con số sau dấu thập phân chỉ cho tôi. Nhưng tôi chỉ muốn xem một trong số họ. Vì vậy, tôi sẽ đi trước bây giờ và tiết kiệm chương trình này, đi vào thiết bị đầu cuối của tôi cửa sổ, và tôi sẽ đi trước và loại làm nổi 0, nhập. Tôi thấy rằng dòng hơi khó hiểu mà sẽ bắt đầu có ý nghĩa hơn khi chúng ta trêu chọc nó ra trong tuần này và tiếp theo. Bây giờ tôi sẽ đi trước và chạy nổi không. Và, chết tiệt. Do đó, có lỗi khác đây đối với một số lý do. Tôi khá chắc chắn rằng một phần mười, hoặc một chia cho 10, không phải là 0.0. Có lẽ tôi chỉ không tìm kiếm tại đủ chữ số. Vì vậy, tại sao tôi không nói hai 0,2 để xem hai chữ số thập phân thay vì chỉ một. Hãy để tôi quay trở lại cửa sổ thiết bị đầu cuối của tôi đây và nhấn lên một vài lần để xem lịch sử của tôi. Đừng làm nổi không nữa, và sau đó một lần nữa. Và bây giờ nhập. Và bây giờ tôi chắc rằng điều này là sai. Và tôi có thể làm ba và bốn, và tôi có thể sẽ tiếp tục nhìn thấy số không. Vậy mà là lỗi? Một chia cho 10 sẽ là 0,1. Ai đó muốn mất một đâm vào những gì vấn đề cơ bản là? Yeah? Chúng đều là số nguyên. Vì vậy, những gì? Vì vậy, với một chia cho 10, đó là những gì tôi làm trong số học. Và tôi nhận được 0.1. Vâng. Và do đó, nó thực sự là vấn đề. Khi bạn có một số nguyên trong một máy tính và bạn chia nó cho số nguyên khác, máy tính theo mặc định sẽ cho rằng bạn muốn một số nguyên. Vấn đề mặc dù, tất nhiên, là mà 0.1 không phải là một số nguyên. Đó là một số thực. Và vì vậy những gì các máy tính không bằng mặc định là nó chỉ ném đi tất cả mọi thứ sau dấu thập phân. Nó không làm tròn xuống hoặc lên cho mỗi gia nhập. Nó chỉ ném đi tất cả mọi thứ sau dấu thập phân. Và bây giờ có ý nghĩa. Bởi vì bây giờ chúng tôi rõ ràng trái với không. Nhưng chờ một phút. Tôi không nhìn thấy một không int. Tôi đang thực sự nhìn thấy 0.00. Vì vậy, làm thế nào để dung hòa này ngay bây giờ? Nếu một chia cho 10 là số không, nhưng tôi nhìn thấy 0.00, ở đâu là nó nhận được chuyển đổi trở lại một số thực? Vâng. Chính xác. Vì vậy, ở đây trong dòng năm, khi tôi thực sự lưu trữ là 0.1, mà sau đó cắt ngắn không, bên trong của một phao, đó là có hiệu quả tương đương với lưu trữ nó không phải là một int nhưng, thực sự, như một phao. Hơn nữa, tôi sau đó sử dụng printf để rõ ràng in số đó để hai chữ số thập phân mặc dù có có thể không thực sự có bất kỳ. Vì vậy, loại này hút, phải không? Rõ ràng bạn không thể làm toán, ít nhất là ở mức độ thành chính xác, trong một máy tính. Nhưng chắc chắn có một giải pháp. Sửa chữa đơn giản nhất chúng ta có thể có thể là những gì làm, thậm chí chỉ là trực giác đây để giải quyết này? Yeah? Lần lượt các số nguyên vào - yeah. Ngay cả khi tôi không hoàn toàn chắc chắn những gì thực sự xảy ra ở đây, nếu nó về cơ bản đã làm với những cả là số nguyên, tốt, tại sao không tôi làm cho rằng 10,0, làm này 1.0, lưu lại các tập tin. Hãy để tôi quay trở lại xuống phía dưới và biên dịch lại. Cho tôi bây giờ chạy lại. Và có - bây giờ, tôi đã có một phần mười của tôi đại diện là 0.10. Được rồi. Vì vậy, đó không phải là xấu. Và hãy để tôi chỉ ra một cách khác chúng ta có thể giải quyết điều này. Hãy để tôi thực sự quay trở lại trong thời gian đến khi chúng tôi đã có điều này như một thứ mười một thời điểm trước đây. Và để cho tôi đi trước và lưu lại tập tin này như một tên tập tin khác nhau, chỉ để có một trạm kiểm soát ít. Vì vậy, đó là phiên bản một. Và bây giờ hãy để tôi đi trước và làm một phiên bản hơn. Chúng tôi sẽ gọi phiên bản này hai không lập chỉ mục. Và tôi sẽ thay vì làm điều này - bạn biết gì không? Thêm dấu chấm không hoạt động trong trường hợp này. Nhưng giả sử một là một biến. Coi 10 là một biến. Nói cách khác, giả sử rằng tôi không thể chỉ mã hóa cứng 0,0 ở cuối của biểu thức số học này. Vâng, tôi thực sự có thể làm điều gì đó trong dấu ngoặc đơn được gọi là đúc. Tôi có thể sử rằng số nguyên 10 nổi một, và tôi có thể bỏ rằng một số nguyên cho một nổi, là tốt. Sau đó, toán học đó sẽ được thực hiện là 1.0 có hiệu quả chia cho 10,0, kết quả trong số đó đi trong e như trước. Vì vậy, nếu tôi biên dịch lại này như làm nổi 2, và bây giờ nổi 2, tôi nhận được cùng một trả lời, là tốt. Vì vậy, đây là một ví dụ khá giả tạo, để giải quyết vấn đề này bằng cách giới thiệu đúc. Nhưng nói chung, đúc sẽ là một điều mạnh mẽ, đặc biệt đối với vấn đề thiết lập hai trong thời gian một tuần, khi bạn muốn chuyển đổi một kiểu dữ liệu khác mà vào cuối ngày được thể hiện trong cùng một cách. Vào cuối ngày, mỗi đơn điều chúng tôi đã nói chuyện về cho đến nay là chỉ số nguyên bên dưới mui xe. Hoặc nếu đó là quá thấp cấp cho bạn, họ chỉ là con số bên dưới mui xe. Ngay cả nhân vật, một lần nữa, nhớ lại từ tuần không, là những con số bên dưới mui xe. Có thể nói là, chúng ta có thể chuyển đổi giữa các loại khác nhau của số nếu họ bit chỉ. Chúng ta có thể chuyển đổi giữa các số và chữ nếu họ chỉ bit, và ngược lại. Và đúc theo cách này là một cơ chế trong lập trình cho phép bạn buộc phải thay đổi một kiểu dữ liệu khác. Thật không may, điều này không như là đơn giản như tôi có thể đã thích. Tôi sẽ quay trở lại vào phao nổi 1, đó là đơn giản, hơn một đơn giản với 0,0 nhất vào với nhau. Và cũng giống như một bồi dưỡng nhanh chóng, hãy để tôi đi trước và biên dịch lại này, làm nổi 2 - xin lỗi, đây là làm nổi 1. Và bây giờ chúng ta hãy chạy nổi 1. Và ở phía dưới, chú ý mà tôi thực sự có được 0.1. Vì vậy, vấn đề được giải quyết. Nhưng không được nêu ra. Bây giờ tôi đang đi để có được một chút tò mò, và tôi sẽ quay trở lại vào tôi Báo cáo printf và nói, bạn biết những gì? Tôi muốn khẳng định đây thực sự là một phần mười. Và tôi sẽ muốn thấy điều này , nói rằng, năm chữ số thập phân. Nó không phải là một vấn đề. Tôi thay đổi hai đến một năm, Tôi biên dịch lại với thực hiện. Tôi chạy lại nó như nổi 1. Tìm kiếm khá tốt. Kiểm tra sự tỉnh táo của tôi có thể dừng lại ở đó, nhưng Tôi nhận được một chút mạo hiểm hơn. Tôi sẽ thay đổi 0,5-0,10. Tôi muốn nhìn thấy 10 chữ số sau số thập phân. Và tôi sẽ đi trước và biên dịch lại này và chạy lại nổi 1. Tôi loại tiếc vì thử nghiệm này hơn nữa bởi vì toán học của tôi không phải là quá sửa chữa nữa, có vẻ như. Nhưng chờ một phút, có thể đó chỉ là một sự may mắn. Có lẽ máy tính là hành động một chút lạ. Hãy để tôi đi trước và làm 20 điểm thập phân và trấn an bản thân mình rằng tôi biết làm thế nào để làm toán. Tôi biết làm thế nào để lập trình. Làm nổi 1, biên dịch lại, và chết tiệt. Đó thực sự là, thực sự nhận được xa nhãn hiệu. Vì vậy, những gì đang xảy ra ở đây? Trực quan, dựa trên những giả định của chúng tôi trước đó về kích thước của các loại dữ liệu, những gì phải xảy ra ở đây bên dưới mui xe? Yeah? Chính xác. Nếu bạn muốn chính xác hơn này, và đó là một heck của rất nhiều chính xác - 20 con số sau dấu thập phân. Bạn có thể không có thể đại diện cho một số lượng tùy ý, trừ khi bạn có một số tùy ý của bit. Nhưng chúng tôi thì không. Đối với một phao, chúng tôi chỉ có 32 bit. Vì vậy, nếu 32 bit chỉ có thể được hoán vị trong một cách - giống như con người của chúng tôi trên, giai đoạn tay lên hoặc xuống - trong một số hữu hạn cách, chỉ có một số hữu hạn các số thực, bạn có thể đại diện cho với những bit. Và do đó, máy tính cuối cùng sẽ phải bắt đầu cắt góc. Máy tính có thể che giấu những chi tiết từ chúng tôi cho một chút thời gian. Nhưng nếu chúng ta bắt đầu đâm vào những con số và nhìn xa hơn và xa hơn tại theo sau con số trong số nguyên, sau đó chúng tôi bắt đầu thấy rằng nó thực sự xấp xỉ ý tưởng về một phần mười. Và do đó, nó quay ra, bi kịch, có một số lượng vô hạn các số chúng tôi không thể bảo đảm chính xác trong một máy tính, ít nhất là với một hữu hạn số bit, một hữu hạn số lượng bộ nhớ RAM. Bây giờ không may, điều này đôi khi có những hậu quả thực tế. Nếu mọi người không hoàn toàn đánh giá cao này hoặc loại đưa cho các cấp thực tế rằng máy tính của họ sẽ chỉ làm những gì họ nói với nó để làm và làm không hiểu được những tiềm ẩn chi tiết đại diện - trong đó, thẳng thắn, trong một số ngôn ngữ là ẩn từ người dùng, không giống như trong C - một số những điều xấu có thể xảy ra. Và những gì tôi nghĩ chúng tôi sẽ làm được lùi lại một bước. Và điều này là về một tám phút video. Phát sóng một vài năm trước đây, và nó mang lại cho cái nhìn sâu vào thực tế những gì có thể đi sai khi bạn dưới đánh giá cao những các loại chi tiết trong rất tất cả các quá thế giới thực. Nếu chúng ta có thể tắt đèn trong một vài phút. SPEAKER 1: Bây giờ chúng ta quay trở lại kỹ thuật thiên tai đối với tuyệt đại. Máy tính - chúng tôi đã đến để chấp nhận vấn đề thường bực bội mà đi với họ. Lỗi, virus, và ổn định phần mềm là giá nhỏ để trả cho các thuận tiện. Nhưng trong công nghệ cao và tốc độ cao quân sự và chương trình không gian các ứng dụng, các vấn đề nhỏ nhất có thể được phóng đại thành 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 Ariane 5 tên lửa không người lái. Nó được mang vệ tinh khoa học được thiết kế để thiết lập một cách chính xác như thế nào từ trường của trái đất tương tác với gió mặt trời. Các tên lửa được xây dựng cho châu Âu Cơ quan không gian và cất cánh từ của nó cơ sở trên bờ biển của Guyane thuộc Pháp. JACK GANSSLE: Vào khoảng 37 giây vào các chuyến bay, lần đầu tiên họ nhận thấy một cái gì đó đã đi sai. 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 các chuyến bay, rõ ràng chiếc xe đã gặp rắc rối. Và đó là khi họ thực hiện một 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, 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. SPEAKER 1: Đây là chuyến đi đầu tiên của tên lửa Ariane 5, và tàn phá của nó diễn ra do có một lỗ hổng nhúng trong phần mềm của tên lửa. JACK GANSSLE: Vấn đề trên Ariane là có một số rằng cần 64 bit để thể hiện. Và họ muốn chuyển đổi một số 16-bit. Họ cho rằng con số này là không bao giờ sẽ là rất lớn, mà hầu hết các chữ số trong 64-bit số là số không. Họ đã lầm. SPEAKER 1: Không có khả năng của một phần mềm chương trình để chấp nhận các loại số được tạo ra bởi một người khác là ở gốc của sự thất bại. Phát triển phần mềm đã trở thành một rất một phần chi phí của công nghệ mới. Ariane 4 tên lửa đã được rất thành công, rất nhiều các phần mềm tạo ra cho nó cũng là được sử dụng trong tên lửa Ariane 5. PHILIP COYLE: Vấn đề cơ bản là rằng tên lửa Ariane 5 là nhanh hơn, tăng tốc nhanh hơn. Và các phần mềm có không chiếm đó. SPEAKER 1: Sự hủy diệt của 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à dữ liệu lần đầu tiên vấn đề chuyển đổi đã cản hiện đại công nghệ tên lửa. JACK GANSSLE: Năm 1991, với sự bắt đầu của Chiến tranh vùng Vịnh đầu tiên, Patriot tên lửa đã trải qua một loại tương tự của một vấn đề chuyển đổi số. Kết quả là, 28 lính Mỹ đã thiệt mạng và khoảng 100 người khác bị thương khi Patriot, được cho là để bảo vệ chống lại tên lửa Scud đến, thất bại trong việc bắn tên lửa. SPEAKER 1: Khi Iraq xâm lược Kuwait và Mỹ đưa ra Bão táp sa mạc trong đầu năm 1991, tên lửa Patriot đã được triển khai để bảo vệ Saudi Arabia và Israel từ Iraq tên lửa Scud các cuộc tấn công tên lửa. Patriot là một tầm trung của Mỹ hệ thống bề mặt-đối-không được sản xuất bởi các công ty Raytheon. THEODORE POSTOL: Kích thước của Patriot tự đánh chặn là khoảng Dài 20 feet. Và nó chỉ nặng khoảng 2.000 kg. Và nó mang một đầu đạn khoảng - Tôi nghĩ rằng đó là khoảng 150 bảng Anh. Và các đầu đạn hạt nhân tự nó là một nổ cao trong đó có mảnh vỡ xung quanh nó. Vỏ của đầu đạn hạt nhân được thiết kế để hành động như đạn chì. SPEAKER 1: Các tên lửa được tiến hành bốn mỗi container và vận chuyển bởi một trailer bán. PHILIP COYLE: The Patriot chống tên lửa hệ thống đi lại ít nhất 20 năm nay. Ban đầu nó được thiết kế 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 cuộc chiến tranh đến cùng, quân đội muốn sử dụng nó để bắn hạ tên lửa Scud, không máy bay. Lực lượng không quân Iraq là 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. SPEAKER 1: Chặn một tên lửa của đối phương đi du lịch ở mach năm là sẽ được thử thách đủ. Nhưng khi Patriot được đưa vào dịch vụ, quân đội đã không nhận thức một Sửa đổi Iraq đã làm cho họ Tên lửa Scud gần như không thể đạt. THEODORE POSTOL: Điều gì đã xảy ra là tên lửa Scud đã được đến trong là không ổn định. Họ đã lắc lư. Lý do cho điều này là người Iraq, trong Để có được 600 km ra khỏi một 300-km-tên lửa tầm xa, mất trọng lượng ra khỏi đầu đạn phía trước. Họ thực hiện các đầu đạn nhẹ hơn. Vì vậy bây giờ Patriot đang cố gắng để đến lúc các tên lửa Scud. Và hầu hết thời gian, áp đảo Phần lớn thời gian, nó sẽ chỉ bay của tên lửa Scud. SPEAKER 1: Sau khi hệ thống Patriot nhà điều hành nhận ra Patriot bỏ lỡ mục tiêu của nó, họ phát nổ Patriots đầu đạn hạt nhân để tránh có thể thương vong nếu nó được cho phép để rơi xuống đất. THEODORE POSTOL: Đó là những gì hầu hết người ta 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ủa tên lửa Scud đầu đạn hạt nhân. SPEAKER 1: Mặc dù trên bầu trời đêm Người yêu nước dường như là thành công phá hủy tên lửa Scud, tại Dhahran có có thể là không có lỗi về mình hiệu suất. Ở đó, hệ thống radar của Patriot bị mất theo dõi của một tên lửa Scud vào 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 hệ thống là trên, càng có nhiều 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. JACK GANSSLE: Khoảng hai tuần trước khi bi 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 là ngày càng trở nên đáng chú ý ít chính xác. 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 rời khỏi 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. Tám giờ? 10 giờ? 1.000 giờ? Không ai biết. SPEAKER 1: pin Patriot đóng tại doanh trại ở Dhahran và đồng hồ nội bộ thiếu sót của nó đã được trên hơn 100 giờ trong đêm Ngày 25 tháng 2. JACK GANSSLE: Nó theo dõi thời gian để một độ 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 số thú vị bởi vì nó không thể được thể hiện trong hệ nhị phân chính xác, có nghĩa là nó không thể được thể hiện 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ố một phần ba. Một phần ba không thể được thể hiện trong số thập phân chính xác. Một phần ba là 0,333 đi trên cho vô cực. Không có cách nào để làm điều đó với độ chính xác tuyệt đối trong số thập phân. Đó là chính xác cùng một loại vấn đề đã xảy ra trong Patriot. Dài hệ thống chạy, tồi tệ nhất đã trở thành lỗi thời. SPEAKER 1: 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ề mục tiêu tên lửa đi du lịch ở mach năm, nó dẫn đến một lỗi theo dõ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. THEODORE POSTOL: Điều gì đã xảy ra là một Scud ra mắt đã được phát hiện vào đầu vệ tinh cảnh báo. Và họ biết rằng các tên lửa Scud đã đến trong chỉ đạo chung của họ. Họ không biết nó sẽ đến. SPEAKER 1: Đó là 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. JACK GANSSLE: Radar là rất thông minh. Nó thực sự có thể theo dõi vị trí của các tên lửa Scud và sau đó tiên đoán nó có lẽ sẽ là thời gian tiếp theo radar gửi một xung ra. Đó được gọi là cổng phạm vi. THEODORE POSTOL: Sau đó, một khi Patriot QUYẾT ĐỊNH đủ thời gian đã trôi qua đi sao lưu và kiểm tra các vị trí tiếp theo cho đối tượng phát hiện này, nó đi lại. Vì vậy, khi quay trở lại sai nơi, nó sau đó thấy không có đối tượng. Và nó quyết định rằng không có đối tượng, đó là một phát hiện sai, và xuống theo dõi. SPEAKER 1: Tên lửa Scud đến biến mất từ màn hình radar, và giây sau nó đập vào doanh trại. Tên lửa Scud giết chết 28 và là người cuối cùng bắn trong chiến tranh vùng Vịnh đầu tiên. Bi kịch, phần mềm cập nhật đến tại Dhahran ngày hôm sau. Các lỗ hổng phần mềm đã được cố định, đóng một chương trong khó khăn lịch sử của tên lửa Patriot. Người yêu nước thực sự là một từ viết tắt cho Phased Array theo dõi Trong đánh chặn mục tiêu. DAVID J Malan: Được rồi, do đó, một nghiêm túc ví dụ, để đảm bảo. Và may mắn thay, những cấp độ thấp hơn lỗi không phải là một cái gì đó mà chúng ta sẽ thường phải đánh giá cao, chắc chắn không với một số của chúng tôi đầu tiên của chương trình. Thay vào đó, hầu hết các lỗi bạn sẽ cuộc gặp gỡ sẽ là hợp lý trong tự nhiên, cú pháp trong tự nhiên theo đó đang không hoạt động đúng. Và bạn biết điều đó khá nhanh. Nhưng đặc biệt là khi chúng tôi đến được với các kết thúc học kỳ, nó sẽ ngày càng trở nên nhiều hơn một khả năng thực sự nghĩ rằng khó khăn về thiết kế chương trình của bạn và cơ bản đại diện ở đó, các dữ liệu. Ví dụ, chúng tôi sẽ giới thiệu MySQL, mà là một cơ sở dữ liệu phổ biến mà bạn có thể sử dụng với các trang web để lưu trữ dữ liệu trở lại vào cuối. Và bạn sẽ phải bắt đầu quyết định ở kết thúc học kỳ không chỉ những gì các loại dữ liệu dọc theo những dòng sử dụng nhưng chính xác bao nhiêu bit để sử dụng, hay không, bạn muốn để lưu trữ ngày như ngày và giờ như thời gian, và cũng những thứ như thế nào lớn nào bạn muốn ID duy nhất để được cho, nói rằng, những người sử dụng trong cơ sở dữ liệu của bạn. Trong thực tế, nếu một số bạn có có Facebook chiếm một thời gian, và bạn biết làm thế nào để có được truy cập để Tên người dùng - mà đôi khi xuất hiện trong của bạn URL của hồ sơ, trừ khi bạn đã chọn một biệt danh cho URL, hoặc nếu bạn đã Đồ thị được sử dụng API của Facebook, các công bố công khai API mà bạn có thể yêu cầu Facebook cho dữ liệu thô - bạn có thể xem số ID của bạn. Và một số năm trước, Facebook chủ yếu đã phải thay đổi từ việc sử dụng tương đương với số nguyên để sử dụng lâu lâu bởi vì theo thời gian khi người dùng đến và đi và tạo ra nhiều tài khoản và tài khoản giả, ngay cả khi họ rất dễ dàng đã có thể làm cạn kiệt một cái gì đó giống như một 4 tỷ có giá trị như một int. Vì vậy, nhiều trên các loại của các vấn đề xuống đường, là tốt. Được rồi, do đó đã được đúc. Đó là không chính xác. Một vài thông báo nhanh chóng. Vì vậy, phần chính thức bắt đầu này tới Chủ nhật, thứ hai, thứ ba. Bạn sẽ nghe thông qua email vào cuối tuần này như sự phân công phần của bạn. Và bạn cũng ở đây vào thời điểm đó sẽ như thế nào để thay đổi phần của bạn nếu bạn lịch trình bây giờ đã thay đổi hoặc của bạn mức độ thoải mái bây giờ đã thay đổi. Trong khi đó P thiết lập một và hacker là một do thứ năm này với các tùy chọn mở rộng thời hạn mà theo các thông số kỹ thuật đến thứ Sáu một cách điển hình. Nhận ra rằng đi kèm với vấn đề thiết lập thông số kỹ thuật là hướng dẫn cách sử dụng các thiết bị CS50, thực hiện, cũng như một số công cụ cụ thể CS50 như phong cách 50, có thể cung cấp cho bạn với thông tin phản hồi tự động trên chất lượng của phong cách mã của bạn và cũng có kiểm tra 50, có thể cung cấp cho bạn thông tin phản hồi năng động như của bạn chính xác mã của. Tha thứ mà chúng ta vẫn còn ủi ra một vài trở ngại với kiểm tra 50. Một vài người bạn cùng lớp của bạn những người đã bắt đầu khoảng 04:00 vào tối thứ Sáu khi spec lên đã nhận thấy kể từ đó một vài lỗi mà chúng ta đang làm việc thông qua, và lời xin lỗi cho bất cứ ai đã trải qua nỗi thất vọng quá mức. Lỗi là của tôi. Nhưng chúng tôi sẽ tiếp tục công CS50 thảo luận khi điều đó được giải quyết. Vì vậy, một từ trên điểm số của mình. Vì vậy, nó sẽ có một hoặc hai tuần trước khi bạn bắt đầu để có được thông tin phản hồi về bài tập bởi vì bạn chưa có một giảng viên. Và thậm chí sau đó, chúng tôi sẽ bắt đầu để đánh giá vấn đề đặt ra trước khi chúng tôi C quay trở lại và đánh giá đầu để mà bạn nhận được có liên quan hơn thông tin phản hồi một cách nhanh chóng hơn. Nhưng nói chung mỗi giáo trình, CS50 bộ vấn đề được đánh giá theo sau bốn trục - phạm vi, chính xác, thiết kế, và phong cách. Phạm vi là có được một số thông thường giữa số không và thứ năm có chụp bao nhiêu mảnh mà bạn cắn ra. Thông thường, bạn muốn điều này là năm. Bạn ít nhất là cố gắng tất cả mọi thứ. Và nhận thấy đó là một yếu tố nhân giống để làm chỉ là một phần của tập hợp vấn đề không phải là chiến lược tốt nhất. Trong khi đó, rõ ràng hơn là tầm quan trọng của tính chính xác - chỉ là chương trình của bạn đúng với tôn trọng với đặc điểm kỹ thuật? Này là trọng cố tình hơn nhiều hơn so với hai trục khác bởi một yếu tố của ba bởi vì chúng tôi nhận ra mà thông thường bạn sẽ phải chi tiêu một thời gian nhiều hơn đuổi xuống một số lỗi, nhận được mã của bạn để làm việc, sau đó bạn được thụt vào nó và chọn tên biến thích hợp và thích, mà là ở đầu bên kia của quang phổ của phong cách. Đó không phải để nói rằng phong cách không phải là quan trọng, và chúng tôi sẽ rao giảng trên thời gian cả trong các bài giảng và trong phần. Phong cách đề cập đến thẩm mỹ mã của bạn. Bạn đã chọn cũng được đặt tên biến đó là ngắn nhưng hơi mô tả? Là mã của bạn thụt vào như bạn đã thấy trong bài giảng và trong một cách nhất quán với phong cách 50? Cuối cùng là thiết kế phù hợp có ở giữa. Thiết kế là một khó khăn hơn để đặt một ngón tay trên bởi vì nó nhiều hơn nữa chủ quan. Nhưng nó có lẽ là quan trọng nhất của ba trục về sư phạm giá trị theo thời gian và điều này sẽ được cơ hội đồng giảng dạy để cung cấp cho bạn thông tin phản hồi về chất lượng. Thật vậy, trong CS50 mặc dù chúng tôi có các công thức và điểm số, cuối cùng trong những ngày này rất cố tình xô rất nhỏ - các giá trị điểm giữa không và ba và số không và năm. Chúng tôi không cố gắng để vẽ đường rất thô giữa các bộ vấn đề hoặc giữa sinh viên mà là tập trung càng nhiều càng tốt chúng ta có thể về chất lượng, longhand thông tin phản hồi, hoặc đánh máy hoặc bằng lời nói từ đồng giảng dạy cụ thể của bạn, bạn sẽ nhận được để biết khá tốt. Nhưng nói chung, đó là những trọng lượng rằng các trục khác nhau sẽ có. Trong khi đó, quá, nó có giá trị lưu giữ trong nhớ rằng bạn không nên cho rằng một ba trong số năm là 60% và do đó khoảng không. Ba là cố ý có nghĩa là phải loại giữa đường tốt. Nếu bạn nhận được chia thành ba tại bắt đầu học kỳ, đó là thực sự có nghĩa là một tốt đặt để bắt đầu. Nếu bạn nhận được hàng hai, hội chợ, có chắc chắn một số việc phải trả một ít quan tâm hơn nữa, để tận dụng lợi thế các bộ phận và giờ làm việc. Nếu bạn nhận được bốn chân và đập tay, tuyệt vời. Nhưng thực sự, chúng tôi hy vọng sẽ nhìn thấy quỹ đạo giữa các học sinh - rất từng cá nhân mỗi học sinh, nhưng bắt đầu học kỳ ở đây trong loại hai phạm vi ba nhưng kết thúc ở đây trong khoảng 4-5. Đó là những gì chúng tôi đang thực sự tìm kiếm. Và chúng tôi lưu ý rằng vùng đồng bằng bạn thể hiện giữa không tuần và tuần 12 khi tôi đang làm lớp. Nó không quan trọng để chúng tôi hoàn toàn như thế nào bạn công bằng ngay từ đầu nếu bạn quỹ đạo thực sự là trở lên và mạnh mẽ. Trung thực học - vì vậy hãy để tôi đặt trên của tôi hơn giọng nói nghiêm trọng cho một thời điểm. Vì vậy, khóa học này có sự khác biệt gửi nhiều sinh viên hơn bất kỳ khác trong lịch sử để hội đồng quản trị quảng cáo, tôi tin. Chúng tôi đã loại số bị mất tại này điểm thường xuyên điều này xảy ra. Và đó không phải bởi vì học sinh trong 50 được nữa không trung thực hơn của họ bạn cùng lớp ở những nơi khác. Nhưng nhận ra, quá, mà chúng tôi rất tốt khả năng phát hiện các loại điều này. Và đó là lợi thế mà một lớp học khoa học máy tính có trong chúng ta có thể và chúng tôi so sánh tất cả học sinh vấn đề đặt ra cặp-khôn ngoan chống lại mọi khác, không chỉ trong năm nay nhưng tất cả các năm trước. Chúng tôi có khả năng, như học sinh các lớp học, để Google và tìm mã trên các trang web như github và diễn đàn thảo luận. Có hoàn toàn giải pháp của CS50 p-đặt nổi xung quanh đó. Nhưng nếu bạn có thể tìm thấy chúng, chúng ta có thể tìm thấy chúng. Và tất cả điều này là rất nhiều tự động và dễ dàng và buồn cho chúng tôi để tìm. Nhưng tôi muốn nhấn mạnh, quá, mà các chính sách học tập trung thực tất nhiên là rất nhiều có nghĩa là rất nhiều trái ngược với tinh thần đó. Thật vậy, năm nay chúng tôi đã viết lại những điều trong giáo trình được điều này, dấu chấm chấm điểm, với nhiều chi tiết trong giáo trình. Nhưng chủ đề bao quát trong khóa học thực sự là hợp lý. Chúng tôi nhận ra rằng có một ý nghĩa số lượng sư phạm giá trị trong cộng tác, đến mức độ nào, với bạn cùng lớp, nhờ đó mà bạn hai hoặc ba bạn hoặc bạn hơn là đứng ở một bảng trắng whiteboarding, do đó, để nói chuyện, ý tưởng của bạn - viết ra giả trong hình ảnh, biểu đồ gì Mario nên nếu bạn đã viết nó đầu tiên trong giả. Nên những gì các thuật toán tham lam - cách mã sẽ chạy mỗi vấn đề đặt ra không? Và để nhận ra hành vi mà chúng tôi khuyến khích là rất nhiều dọc theo các dòng. Và trong các giáo trình, bạn sẽ thấy một bó toàn bộ các viên đạn trong một thể loại hợp lý và không hợp lý thể loại giúp chúng ta giúp bạn chiếm hết tâm trí của bạn xung quanh nơi chúng tôi vẽ một đường cong đó. Và nói chung, một quy tắc phong nha của ngón tay cái là nếu bạn đang đấu tranh để giải quyết một số lỗi và bạn bè hoặc bạn cùng lớp của bạn đang ngồi bên cạnh bạn, nó được hợp lý cho bạn để cho anh ta hoặc cô mã của bạn và nói, hey, bạn có thể giúp tôi tìm ra những gì đang xảy ra sai ở đây? Chúng tôi không thường ôm hôn phía đối diện. Nó không phải là một câu trả lời chính xác cho bạn bạn bè hoặc bạn cùng lớp ở đây để nói, oh, chỉ cần nhìn vào tôi và con số nó ra từ đó. Đó là loại không hợp lý. Nhưng có người khác, não khác, một đôi mắt nhìn vào màn hình hoặc cái nhìn của bạn vào code của bạn và nói, bạn có chắc bạn muốn để có một vòng lặp ở đây? Hoặc bạn có chắc bạn muốn rằng dấu chấm phẩy đây? Hoặc oh, thông báo lỗi có nghĩa này. Đó là rất hợp lý và hành vi khuyến khích. Các trường hợp mà tôi đề cập tới trước đó đun sôi xuống để khi học sinh muộn vào ban đêm làm cho sự phán xét người nghèo quyết định và gửi email mã của họ để người khác hoặc chỉ nói, ở đây, đó là trong Dropbox hoặc Googling muộn vào ban đêm. Và vì vậy tôi sẽ khuyến khích và cầu xin của bạn, nếu bạn có những người không thể tránh khỏi những giây phút căng thẳng, bạn đang va chạm với thời hạn, bạn không có cuối ngày kể từ khi nó đã thứ sáu tại đó điểm, gửi email cho người đứng đầu của khóa học hoặc bản thân mình trực tiếp. Nói, nghe, tôi đang ở tôi vi phạm điểm ở đây. Chúng ta hãy có một cuộc trò chuyện và con số nó ra. Phải dùng đến các trang web hay không một số khác hành vi hợp lý không bao giờ là giải pháp, và quá nhiều của bạn bạn cùng lớp không còn đây trên khuôn viên vì sự phán xét người nghèo. Nhưng nó rất dễ dàng để bao quanh các đường dây đó. Và đây là một hình ảnh nhỏ để cổ vũ bạn từ Reddit để bây giờ mọi thứ sẽ ổn. Vì vậy, một bản tóm tắt nhanh chóng, sau đó, nơi chúng tôi rời đi. Vì vậy, tuần trước, nhớ lại rằng chúng tôi giới thiệu điều kiện, không trong Scratch nhưng trong C thời gian này. Và đã có một số cú pháp mới nhưng thực sự không có ý tưởng mới cho mỗi gia nhập. Chúng tôi đã có các biểu thức Boolean mà chúng ta có thể hoặc cùng với hai theo chiều dọc thanh hay và cùng với hai ampersands, nói rằng cả hai bên trái và quyền phải đúng sự thật cho này để thực thi. Sau đó, chúng tôi đã có công tắc, mà chúng tôi nhìn tại một thời gian ngắn, nhưng tôi đề nghị là thực sự chỉ là cú pháp khác nhau để đạt được các cùng một loại mục tiêu nếu bạn biết thúc đẩy những trường hợp của bạn đang có được. Chúng tôi nhìn vào các vòng lặp. Một vòng lặp là có thể phổ biến nhất, hoặc ít nhất là một trong những người thường tiếp cận với bản năng. Mặc dù có vẻ hơi khó hiểu, bạn sẽ thấy rất nhiều, rất nhiều ví dụ về điều này Không lâu sau, như bạn có đã vào cuối tuần trước. Trong khi các vòng có thể tương tự đạt được điều tương tự. Nhưng nếu bạn muốn làm bất kỳ incrementation hoặc cập nhật giá trị của biến, bạn phải làm điều đó bằng tay hơn so với cho vòng trước khi cho phép. Và sau đó là do-trong khi vòng lặp, cho phép chúng tôi làm điều gì đó tại ít nhất một lần trong khi một cái gì đó khác là sự thật. Và điều này đặc biệt tốt cho chương trình hoặc cho các trò chơi mà bạn muốn để nhắc nhở người dùng cho một cái gì đó ít nhất một lần. Và sau đó nếu người đó không hợp tác, bạn có thể muốn làm điều đó một lần nữa và một lần nữa. Với các biến số, trong khi đó, chúng tôi đã có dòng mã như thế này, mà có thể được hai dòng. Bạn có thể khai báo một int truy cập, dấu chấm phẩy. Hoặc bạn có thể chỉ cần kê khai, xác định nó, vì vậy để nói chuyện. Cung cấp cho nó một giá trị cùng một lúc. Và sau đó cuối cùng, chúng tôi nói chuyện về chức năng. Và đây là một ví dụ tốt đẹp trong nghĩa là nó minh họa hai loại chức năng. Một là GetString (), trong đó, một lần nữa, được một chuỗi từ người sử dụng. Nhưng GetString () lại khá thú vị, cho đến nay như chúng ta đã sử dụng nó, bởi vì chúng tôi đã luôn luôn sử dụng nó với một cái gì đó ở phía bên tay trái của một dấu bằng. Đó là để nói rằng GetString () trả về giá trị. Nó trả về, tất nhiên, một chuỗi. Và sau đó ở phía bên trái, chúng tôi chỉ đơn giản là tiết kiệm chuỗi bên trong một biến được gọi tên. Điều này là khác nhau, trong một nghĩa nào đó, từ printf vì printf, ít nhất là của chúng tôi sử dụng ở đây, không trả lại bất cứ điều gì. Như một sang một bên, nó trở lại một cái gì đó. Chúng tôi không quan tâm nó là gì. Nhưng nó không có gì được gọi là một tác dụng phụ. Và tác dụng phụ trong mỗi là những gì trường hợp chúng tôi đã nhìn thấy cho đến nay? Những gì printf làm gì? Nó in một cái gì đó để màn hình, hiển thị văn bản hoặc số hoặc một cái gì đó trên màn hình. Và đó là chỉ được coi là một tác dụng phụ bởi vì nó không thực sự giao nó trở lại với tôi. Nó không phải là một câu trả lời bên trong một hộp đen mà tôi có thể sau đó đạt được vào và lấy. Nó chỉ làm nó ngày của riêng mình, nhiều như Colton đã được cắm vào điều này hộp đen tuần trước, và anh ta bằng cách nào đó kỳ diệu đã được vẽ trên bảng mà không có tôi thực sự có liên quan. Đó sẽ là một tác dụng phụ. Nhưng nếu tôi thực sự đã phải quay trở về ở đây và nói, ồ, đây là chuỗi từ người sử dụng, mà có thể là một giá trị trả về. Và cho đến nay chúng tôi đã chỉ được sử dụng các chức năng mà người khác đã viết. Nhưng chúng tôi thực sự có thể làm những cả mọi thứ mình. Vì vậy, tôi sẽ đi vào CS50 thiết bị một lần nữa. Hãy để tôi đóng tab đó chúng tôi đã mở ra một thời điểm trước đây. Và để cho tôi đi trước và tạo ra một tập tin mới. Và tôi sẽ đi trước và gọi một positive.c này. Vì vậy, tôi muốn làm một cái gì đó với số dương ở đây. Vì vậy, tôi sẽ đi trước và làm int - xin lỗi - # Bao gồm. Chúng ta không làm cho rằng cùng sai lầm như trước. Int main (void), mở xoăn cú đúp, đóng xoăn cú đúp. Và bây giờ tôi muốn làm như sau. Tôi muốn viết một chương trình khẳng định rằng người sử dụng cung cấp cho tôi một số nguyên dương. Vì vậy, không có chức năng GetPositiveInt trong thư viện CS50. Chỉ có getInt (). Nhưng đó là OK bởi vì tôi có cấu trúc mà tôi có thể áp đặt một hạn chế hơn về giá trị đó. Tôi có thể làm một cái gì đó như thế này. Vì vậy, int n - và nếu bạn gõ cùng, chỉ cần nhận ra Tôi sẽ quay trở lại và thay đổi một số điều trong một thời điểm - để int n bằng getInt (). Và điều đó sẽ đặt một trong int n. Và hãy để tôi được mô tả nhiều hơn. Hãy để tôi nói điều gì đó như Tôi yêu cầu bạn cung cấp cho tôi một số nguyên dương. Được rồi. Vì vậy, chỉ cần một chút hướng dẫn. Và bây giờ những gì tôi có thể làm gì? Vâng, tôi đã biết từ đơn giản của tôi điều kiện hoặc chi nhánh, giống như tôi đã có trong cào, tôi có thể nói điều gì đó thích nếu n là nhỏ hơn hoặc bằng bằng không, thì tôi muốn làm một cái gì đó thích, đó không phải là tích cực. Và sau đó tôi có thể làm - OK, nhưng tôi thực sự muốn được int đó. Vì vậy, tôi có thể đi lên đây và tôi có thể loại các bản sao này và indent này. Và sau đó, OK. Vì vậy, nếu n là nhỏ hơn hoặc bằng không làm điều này. Bây giờ, nếu người sử dụng không hợp tác? Vâng, sau đó tôi sẽ vay này đây. Và sau đó tôi đi trong đây và đây và đây. Vì vậy, đây rõ ràng là không các giải pháp, phải không? Bởi vì không có kết thúc trong cảnh. Nếu tôi muốn yêu cầu người dùng cung cấp cho tôi một số nguyên dương, tôi có thể thực sự có được các int. Sau đó tôi có thể kiểm tra cho int đó. Nhưng sau đó tôi muốn kiểm tra xem nó một lần nữa và kiểm tra lại và kiểm tra lại. Vì vậy, rõ ràng, những gì là tốt hơn xây dựng được sử dụng ở đây? Được rồi, vì vậy một số loại vòng lặp. Vì vậy, tôi đang đi để thoát khỏi của gần như tất cả điều này. Và tôi muốn có được điều này int ít nhất một lần. Vì vậy, tôi sẽ nói làm - và tôi sẽ quay trở lại trong khi chỉ trong một thời điểm - bây giờ, làm những gì? Tôi sẽ làm int n được getInt (). OK. Vì vậy, đó là khá tốt. Và bây giờ mức độ thường xuyên làm Tôi muốn làm điều này? Hãy để tôi đặt trong printf của vòng lặp vì vậy tôi có thể yêu cầu một lần nữa và một lần nữa, nếu cần thiết. Và những gì tôi muốn điều này trong khi điều kiện để làm gì? Tôi muốn tiếp tục làm điều này trong khi các trường hợp là gì? Vâng. N là ít hơn hoặc bằng số không. Như vậy, chúng tôi đã đáng kể làm sạch mã này lên. Chúng tôi đã vay rất đơn giản xây dựng - do-trong khi vòng lặp. Tôi đã bị đánh cắp chỉ là những dòng quan trọng mã mà tôi bắt đầu sao chép và dán, mà là không khôn ngoan. Và vì vậy bây giờ tôi sẽ thực sự dán nó ở đây và chỉ làm điều đó một lần. Và bây giờ những gì tôi muốn làm tại cuối của chương trình này? Tôi sẽ chỉ nói một cái gì đó đơn giản thích, cảm ơn cho - và Tôi sẽ làm% i cho int - dấu gạch chéo ngược n, dấu phẩy, và sau đó cắm n, dấu chấm phẩy. Được rồi. Vì vậy, chúng ta hãy xem những gì sẽ xảy ra khi tôi chạy chương trình này. Tôi sẽ đi trước và không làm tích cực. Chết tiệt. Một vài lỗi. Vì vậy, hãy để tôi di chuyển trở lại cho đến đầu tiên. Không làm việc qua chúng về phía sau. Làm việc thông qua chúng từ trên xuống vì sợ rằng họ thác và chỉ một điều là sai. Khai tiềm ẩn của chức năng getInt (). Vâng. Vì vậy, nó là không đủ. Tôi gần như đã sai lầm tương tự, nhưng một chút khác nhau thời gian này. Tôi cần không chỉ bao gồm stdio.h nhưng cũng cs50.h, trong đó bao gồm các cái gọi là tờ khai được int, mà dạy cho thiết bị, hoặc dạy C những gì getInt () là. Vì vậy, hãy để tôi lưu lại. Tôi sẽ bỏ qua các lỗi khác bởi vì tôi sẽ hy vọng rằng họ bằng cách nào đó liên quan đến lỗi Tôi đã được cố định. Vì vậy, hãy để tôi đi trước và biên dịch lại với thực hiện tích cực, Enter. Chết tiệt. Ba lỗi, vẫn còn. Hãy để tôi di chuyển đến đầu tiên. Không sử dụng biến n. Chúng tôi đã không nhìn thấy điều này trước đây. Và điều này cũng là một chút khó hiểu. Đây là đầu ra của trình biên dịch. Và những gì mà dòng nhấn mạnh có - positive.c :9:13 - được nói, nó nói trên dòng chín positive.c, ở nhân vật thứ 13, Cột thứ 13, bạn đã thực hiện sai lầm này. Và đặc biệt, nó nói tôi không sử dụng biến n. Vì vậy, chúng ta hãy xem - đường chín. Tôi đang sử dụng n theo nghĩa là Tôi cho nó một giá trị. Nhưng những gì các trình biên dịch không thích là rằng tôi không dường như sử dụng nó. Nhưng chờ một phút, tôi đang sử dụng nó. Trong dòng 11, tôi đang sử dụng nó ở đây. Nhưng nếu tôi di chuyển xuống thấp hơn nữa tại positive.c :11 - do đó, tại dòng 11, nhân vật 12, trình biên dịch nói với tôi, sử dụng không khai báo định danh n. Phương tiện để khai báo tôi có không xác định nó như là một biến với một kiểu dữ liệu. Nhưng chờ một phút. Tôi đã làm chính xác điều đó trong dòng chín. Vì vậy, một người nào đó thực sự nhầm lẫn ở đây. Nó hoặc là tôi hoặc các trình biên dịch bởi vì trong đường chín, một lần nữa, tôi tuyên bố một int n, và tôi đang giao nó trả lại giá trị của getInt (). Sau đó, tôi đang sử dụng mà n biến trong dòng 11 và kiểm tra nếu giá trị của nó là ít hơn hoặc bằng số không. Nhưng điều này dường như là xấu và bị hỏng tại sao? Nói lại lần nữa? Ah, tôi phải khai báo trước khi n bước vào vòng lặp. Nhưng tại sao? Ý tôi là, chúng tôi chỉ đề xuất một chút trước đó nó là tốt để khai báo các biến trên cùng một dòng và sau đó giao cho một số giá trị. Một biến toàn cầu - chúng ta hãy trở lại với ý tưởng chỉ trong một thời điểm. Tại sao bạn muốn tôi để đặt nó bên ngoài vòng lặp? Nó được. Chính xác. Vì vậy, mặc dù, phần nào phản trực giác, cho phép tôi tóm tắt. Khi bạn khai báo n trong của khối do đó - đặc biệt bên trong những dấu ngoặc nhọn - rằng biến n có gì gọi là phạm vi - không liên quan đến hệ thống tính điểm của chúng tôi trong tất nhiên - nhưng có một phạm vi đó là giới hạn trong những dấu ngoặc nhọn. Nói cách khác, thông thường nếu bạn khai báo một biến trong một bộ dấu ngoặc nhọn, biến chỉ tồn tại bên trong những dấu ngoặc nhọn. Vì vậy, theo logic một mình, mặc dù Tôi đã tuyên bố n trong đường chín, nó về cơ bản biến mất khỏi phạm vi, biến mất khỏi bộ nhớ, có thể nói, do thời gian tôi nhấn dòng 11. Vì đường 11, không may, là ngoài những dấu ngoặc nhọn. Vì vậy, tôi tiếc là không có thể sửa lỗi này bằng sẽ trở lại với những gì tôi đã làm điều đó trước. Bạn có thể lần đầu tiên làm điều này. Nhưng bạn là gì bây giờ không làm theo chu kỳ? Bạn rõ ràng là không nhận được int theo chu kỳ. Vì vậy, chúng ta có thể rời khỏi getInt (), và chúng tôi nên để lại getInt () bên trong vòng lặp bởi vì đó là những gì chúng tôi muốn làm phiền người sử dụng cho một lần nữa và một lần nữa. Nhưng nó không đủ để đi đến dòng, nói, sáu. Int n, dấu chấm phẩy. Không cung cấp cho nó một giá trị nào vì bạn không cần phải chỉ được nêu ra. Nhưng bây giờ xuống đây, thông báo - điều này sẽ là một sai lầm rất dễ dàng. Tôi không muốn để bóng trước đây của tôi Tuyên bố của n. Tôi muốn sử dụng n mà thực sự tồn tại. Và vì vậy bây giờ trong dòng 10, Tôi chỉ định một giá trị n. Nhưng trong dòng sáu, tôi tuyên bố n. Và vì vậy tôi có thể hoặc có thể tôi không sử dụng nó trong dòng 12 bây giờ? Tôi vì có thể giữa chúng xoăn niềng răng là n tuyên bố bây giờ? Một ở đây trên đường năm. Để ai ở đây trên đường 14. Vì vậy, nếu tôi bây giờ thu nhỏ, lưu tập tin này, đi sao vào và chạy làm tích cực, nó biên soạn lần này. Vì vậy, đó là đã có tiến bộ. Cắt giảm. . / Tích cực, Enter. Tôi yêu cầu bạn cung cấp cho tôi một số nguyên dương. Tiêu cực 1. Tiêu cực 2. Âm tính 3. Không. Một. Và cảm ơn cho một là những gì bây giờ được in. Hãy để tôi thử một cái gì đó khác, ra khỏi tò mò. Tôi đang được nói đến đầu vào một số nguyên. Nhưng nếu tôi thay vì gõ trong thịt cừu? Vì vậy, bây giờ bạn nhìn thấy một cửa sổ khác nhau - thử lại. Nhưng không nơi nào trong mã của tôi tôi đã viết thử lại. Vì vậy, ở đâu, có lẽ, là này thử lại nhắc đến từ, bạn sẽ nói gì? Yeah, từ getInt () chính nó. Vì vậy, một trong những điều nhân viên của CS50 không cho bạn, ít nhất là trong vài lần đầu tiên tuần, là chúng tôi đã viết một số lượng kiểm tra để đảm bảo rằng nếu lỗi bạn gọi getInt (), bạn sẽ có ít nhất lấy lại một int từ người sử dụng. Bạn sẽ không nhận được một chuỗi. Bạn sẽ không có được một char. Bạn sẽ không nhận được một cái gì đó khác hoàn toàn. Bạn sẽ nhận được một int. Bây giờ, nó có thể không được tích cực. Nó có thể không được tiêu cực. Chúng tôi không đảm bảo xung quanh đó. Nhưng chúng tôi sẽ làm phiền người sử dụng để thử lại, thử lại, thử lại cho đến khi họ thực sự hợp tác. Tương tự như vậy, nếu tôi làm 1.23, đó không phải là một int. Nhưng nếu tôi gõ vào, nói, 50 tuổi, mà mang lại cho tôi một giá trị mà tôi muốn. Được rồi. Vì vậy, không xấu. Bất kỳ câu hỏi về những gì chúng ta vừa thực hiện? Các Yếu tố chính là, phải rõ ràng, không rất nhiều vòng, mà chúng tôi đã nhìn thấy trước mặc dù chúng tôi đã không thực sự sử dụng nó, nhưng vấn đề phạm vi, nơi biến chỉ có thể được có thể chỉ được sử dụng trong một số phạm vi quy định. Được rồi, hãy để tôi giải quyết các đề nghị bạn đã thực hiện trước đó, đó là một biến toàn cầu. Như một sang một bên, nó quay ra rằng khác giải pháp cho vấn đề này, nhưng thường là một giải pháp không chính xác hoặc một giải pháp được thiết kế kém, là khai báo biến của bạn như những gì được gọi là một biến toàn cầu. Bây giờ tôi là loại vi phạm định nghĩa của tôi phạm vi vì có không có dấu ngoặc nhọn ở đầu và dưới cùng của một tập tin. Nhưng ý nghĩa của mà là bây giờ trong dòng bốn, n là một biến toàn cầu. Và như tên gọi của nó, đó là chỉ có thể truy cập ở khắp mọi nơi. Đầu thực sự có này. Nếu bạn sử dụng một biến, bạn có thể nhớ lại bạn phải lựa chọn nếu nó cho ma này hoặc cho tất cả các họa tiết. Vâng, tất cả các họa chỉ là rõ ràng hơn Nói cách toàn cầu. Yeah? Ah, câu hỏi thực sự tốt. Vì vậy, nhớ lại rằng trong phiên bản đầu tiên mã của tôi, khi tôi không chính xác n khai báo và xác định trong đường chín - Tôi tuyên bố nó như là một biến và tôi đã cho nó một giá trị các nhà điều hành phân công - này đã cho tôi hai lỗi. Một, thực tế là n không được sử dụng, và hai, trong dòng 11 nó chỉ là không khai báo. Vì vậy, người đầu tiên tôi đã không địa chỉ tại thời điểm đó. Nó không phải là một lỗi nghiêm chỉnh tuyên bố một biến nhưng không sử dụng nó. Nhưng một trong những điều chúng tôi đã làm trong thiết bị CS50, cố tình, sư phạm, là chúng tôi đã tăng chỉ mong đợi của các trình biên dịch để thực hiện chắc chắn rằng bạn đang làm những việc không chỉ đúng nhưng thực sự chính xác. Bởi vì nếu bạn khai báo một biến như n và không bao giờ sử dụng nó, hoặc sử dụng nó chính xác, sau đó những gì là nó làm gì ở đó? Nó thực sự không có mục đích. Và nó rất dễ dàng theo thời gian, nếu bạn không cấu hình máy tính của mình trong Bằng cách này, chỉ cần có mã số đó có tàn tích nhỏ ở đây, còn sót lại ở đó. Và sau đó vài tháng sau bạn nhìn lại và bạn giống như, tại sao dòng này của đang có? Và nếu không có lý do chính đáng, nó không có lợi cho bạn hoặc đồng nghiệp của bạn xuống đường phải vấp ngã trên nó sau đó. Như một sang một bên, mà là đó đến từ đâu? Vâng, nhớ lại rằng mỗi khi chúng tôi biên dịch chương trình, tất cả các công cụ này là được in. Vì vậy, chúng tôi sẽ trở lại vấn đề này. Nhưng một lần nữa, hãy là một tiện ích tự động hóa quá trình biên soạn bởi chạy trình biên dịch thực tế gọi là kêu vang. Điều này, cuối cùng chúng ta sẽ thấy, có để làm với gỡ lỗi với một đặc biệt chương trình được gọi là trình gỡ lỗi. Điều này đã làm với tối ưu hóa mã - thêm vào đó trong tương lai. Std = c99 - điều này chỉ có nghĩa là sử dụng phiên bản năm 1999 của C. C được xung quanh thậm chí còn hơn đó, nhưng họ đã thực hiện một số đẹp thay đổi cộng với 10 năm trước đây. Và đây là những người có liên quan. Chúng ta đang nói làm bất cứ điều gì trước đó sẽ là một cảnh báo một lỗi ngăn chặn học sinh từ biên soạn. Và phương tiện tường làm điều đó cho một bó toàn bộ của sự vật, không chỉ liên quan đến các biến. Và sau đó cho phép tôi di chuyển đến cuối dòng này. Và điều này cũng vậy, chúng tôi sẽ cuối cùng quay trở lại. Điều này rõ ràng là tên của các tập tin tôi đang biên soạn. Điều này nhắc lại tên của tập tin Tôi xuất như tên của chương trình Runnable của tôi. Này-lcs50 chỉ có nghĩa là sử dụng CS50 thư viện, và bất kỳ số không và những người các nhân viên đã viết và biên soạn trước đó năm nay, tích hợp chúng vào chương trình của tôi. Và bất cứ ai biết những gì-lm? Đó là thư viện toán học, đó là chỉ có ngay cả khi bạn không thực hiện bất kỳ toán học. Nó chỉ tự động cung cấp cho chúng ta thực hiện. Vâng, hãy để tôi làm một ví dụ khác đây bằng cách mở một tập tin mới. Và cho tôi tiết kiệm này như string.c. Nó chỉ ra rằng khi chúng ta nói về dữ liệu loại ngày hôm nay, có nhiều hơn đang diễn ra bên dưới mui xe hơn chúng ta đã thấy cho đến nay. Vì vậy, hãy để tôi nhanh chóng làm một chương trình nhanh chóng. Bao gồm stdio.h. Và tôi sẽ tiết kiệm đó. Và bạn biết, hãy để tôi không làm cho cùng một sai lầm một lần nữa và một lần nữa. Bao gồm cs50.h. Và để cho tôi đi trước bây giờ và làm int main (void). Và bây giờ tôi chỉ muốn làm một chương trình thực hiện điều này - khai báo một chuỗi gọi là s và có được một chuỗi từ người sử dụng. Và để cho tôi làm một ít hướng dẫn tại đây - xin vui lòng cho tôi một chuỗi - vì vậy người sử dụng biết phải làm gì. Và sau đó xuống bên dưới đây này, Tôi muốn làm như sau - cho int i được không. Một lần nữa, các nhà khoa học máy tính thường bắt đầu đếm từ số không, nhưng chúng tôi có thể làm cho rằng một khi chúng ta thực sự muốn. Bây giờ tôi sẽ làm tôi ít hơn chiều dài chuỗi s. Vì vậy, strlen - S-T-R-L-E-N - một lần nữa, đó là chính xác bởi vì nó dễ dàng hơn đánh máy, mặc dù đó là một chút khó hiểu. Đó là một chức năng chúng tôi đã không được sử dụng trước nhưng nghĩa nào đó - trở về với tôi một số đại diện chiều dài của chuỗi mà người dùng gõ. Nếu họ gõ vào xin chào, nó sẽ trở lại năm bởi vì có năm chữ trong hello. Sau đó, trên mỗi lần lặp của vòng lặp này, tôi cộng với cộng với. Vì vậy, một lần nữa, một tiêu chuẩn xây dựng ngay cả khi bạn không hoàn toàn quá thoải mái hay quen thuộc với nó được nêu ra. Nhưng bây giờ mỗi lần lặp của vòng lặp này, thông báo những gì tôi sẽ làm. Tôi muốn đi trước và in ra một nhân vật duy nhất - để% c n dấu chéo ngược trên một dòng mới. Và sau đó, bạn biết những gì tôi muốn làm gì? Bất cứ điều gì từ là loại người sử dụng trong, như xin chào, tôi muốn in H-E-L-L-O, một ký tự trên mỗi dòng. Nói cách khác, tôi muốn có được ở các đặc điểm cá nhân trong một chuỗi, theo đó cho đến bây giờ chỉ có một chuỗi là một chuỗi các ký tự. Và nó quay ra tôi có thể làm s, khung, i, dấu đóng ngoặc, đóng ngoặc đơn, dấu chấm phẩy. Và tôi phải làm một điều nữa. Đó là trong một tập tin gọi là string.h rằng strlen được khai báo. Vì vậy, nếu tôi muốn sử dụng chức năng, Tôi cần phải nói với trình biên dịch, hy vọng sẽ sử dụng nó. Bây giờ hãy để tôi đi trước và thực hiện chương trình được gọi là chuỗi. Dấu chấm, dấu gạch chéo, chuỗi. Xin vui lòng cho tôi một chuỗi. Tôi sẽ đi trước và gõ nó. Xin chào, trong tất cả các mũ, Enter. Và bây giờ tôi nhận thấy đã in này một nhân vật sau khi khác. Vì vậy, các chi tiết mới đây là một chuỗi, vào cuối ngày, có thể truy cập bằng cách cá nhân của mình nhân vật bằng cách giới thiệu vuông khung ký hiệu. Và đó là bởi vì một chuỗi bên dưới mui xe thực sự là một chuỗi các ký tự. Nhưng những gì gọn gàng về họ là RAM trong máy tính của bạn - Mac, máy tính, bất cứ điều gì - chúng nghĩa đen trở lại trở lại để trở lại - H-E-L-L-O - ở cá nhân, liền kề byte trong bộ nhớ. Vì vậy, nếu bạn muốn nhận được ở thứ tám như vậy byte, trong vòng này sẽ là khung bằng không, một khung, khung hai, khung ba, bốn khung - đó là không được lập chỉ mục cho đến năm - sẽ in ra H-E-L-L-O trên một dòng riêng. Bây giờ, như một lời trêu ghẹo, hãy để tôi chỉ cho bạn các loại vật bạn cuối cùng sẽ được có thể hiểu, ít nhất với một số gần gũi. Đối với một, những gì chúng tôi có trong ngày hôm nay ví dụ, nếu bạn muốn, thực sự là một trong những jailbreaks đầu tiên cho iPhone. Jailbreaking có nghĩa là nứt điện thoại do đó, bạn thực sự có thể sử dụng nó trên một nhà cung cấp khác nhau hoặc cài đặt phần mềm của riêng bạn. Và bạn sẽ nhận thấy điều này có vẻ hoàn toàn khó hiểu, rất có thể. Nhưng nhìn vào điều này. IPhone dường như đã bị nứt với một vòng lặp, một điều kiện nếu, một khác điều kiện, một loạt các chức năng chúng tôi đã không nhìn thấy. Và một lần nữa, bạn sẽ không phải ở Thoạt nhìn có thể hiểu làm thế nào điều này đang làm việc. Nhưng tất cả mọi thứ mà chúng ta loại đi cho các cấp trong cuộc sống hiện đại của chúng tôi thực sự có xu hướng giảm thậm chí một số các nguyên tắc cơ bản chúng tôi đã xem xét. Hãy để tôi đi trước và mở một chương trình khác, holloway.c. Vì vậy, đây cũng là một cái gì đó bạn nên không thực sự biết. Thậm chí không có nhân viên hoặc tôi có thể có thể con số này ra bằng cách nhìn vào vì đây là mã của một ai đó đã được nộp cho những gì lịch sử được biết đến như một obfuscated C cuộc thi, nơi bạn viết một chương trình đó biên dịch và chạy nhưng là như vậy damn khó hiểu con người không thể hiểu những gì nó sẽ làm cho đến khi họ thực sự chạy nó. Vì vậy, trên thực tế, nếu bạn nhìn vào điều này mã, tôi nhìn thấy một chuyển đổi. Tôi thấy chính. Tôi nhìn thấy những dấu ngoặc vuông ngụ ý một số loại của một mảng. Có ai muốn đoán những gì chương trình này thực sự không nếu tôi chạy Holloway? Vâng. OK. Thực hiện tốt. Vì vậy, chỉ có các nhân viên và tôi không thể hình ra những gì những điều làm. Và bây giờ cuối cùng, hãy để tôi đi trước và mở ra một chương trình khác. Này - một lần nữa, chúng tôi sẽ làm cho mã nguồn có sẵn trực tuyến - điều này chỉ loại khá để xem xét. Tất cả họ đã làm là nhấn thanh không gian khá một chút. Nhưng đây là mã thực. Vì vậy, nếu bạn nghĩ rằng đó là đẹp, nếu chúng ta thực sự chạy này tại dấu nhắc, cuối cùng bạn sẽ thấy cách chúng tôi có thể làm những việc như thế này. Vì vậy, chúng tôi sẽ để lại cho bạn lưu ý và nhìn thấy bạn vào thứ tư. [Chơi nhạc] SPEAKER 2: Tại CS50 tiếp theo, các TF giai đoạn một cuộc binh biến. SPEAKER 3: Có anh. Có được anh ta! [Chơi nhạc]