DAVID Malan: Được rồi. Vì vậy, đây là CS50, và đây là nay là đầu tuần ba. Vì vậy, cho đến bây giờ, chúng tôi đã được viết chương trình trong C mà nhìn một chút một cái gì đó như thế này đây. Vì vậy, chúng tôi đã có một vài sắc nét bao gồm ở đầu trang. Chúng tôi đã có int, chính, bãi bỏ, và sau đó cái gì để làm ở giữa, một số bit của mã bên trong các chức năng đó. Nhưng quan trọng đã được thực tế là chúng tôi đã nói rằng khoảng trống ở đây. Vì vậy, có hiệu lực, tất cả các thời gian này, quy định cụ thể rằng chương trình này, khi chạy, chỉ có thể chạy thông qua tên của nó. Bạn không thể gõ bất kỳ từ nào khác hoặc số sau khi tên của chương trình khi chạy nó. Vì vậy, ví dụ, nếu chương trình là biên soạn thành một tập tin gọi là xin chào, bạn có thể làm ./hello, nhưng đó là nó. Cách duy nhất mà bạn có thể cung cấp đầu vào cho chương trình này là bằng cách gọi một hàm. Ví dụ, những gì chức năng chúng tôi đã được sử dụng cho đến nay để có được đầu vào từ người sử dụng? TƯỢNG: Lấy chuỗi. DAVID Malan: Để có được chuỗi, hoặc int có được, hoặc bạn đã nhìn thấy những người khác, ngay cả khi bạn không sử dụng chúng nữa, như được dài, và muốn. Nhưng giả sử rằng chúng ta thực sự muốn bắt đầu viết các chương trình có nhiều hơn một chút linh hoạt, và, thẳng thắn, nhiều hơn một chút như các lệnh mà bạn đã đã nhận được, hy vọng, một chút quen với. Giống như cd không gian Dropbox. Điều này, tất nhiên, những thay đổi thư mục của bạn, giả sử bạn đang ở trong nhà John Harvard thư mục, vào thư mục Dropbox của bạn. Trong khi đó, một lệnh như thế này tạo ra một thư mục mới được gọi là pset2, như bạn có thể đã hoặc sẽ sớm cho vấn đề đặt hai. Hãy Xin chào, tất nhiên, là một lệnh mà xây dựng một chương trình gọi là chào từ một tập tin hello điểm c. Và trong mỗi trường hợp, bây giờ, chúng tôi đã có cung cấp một cuộc tranh cãi về cái gọi là dòng lệnh, dấu nhắc nhấp nháy, để làm cho mà biết những gì để xây dựng, và như vậy mkdir mà biết những gì để tạo ra các thư mục, và như vậy cd mà biết nơi bạn muốn đi. Nhưng cho đến bây giờ, chúng tôi tiếp tục nói rằng chính, chức năng mặc định của bạn, có một biểu hiện trống bên trong những dấu ngoặc đơn, có nghĩa là nó không thể lấy bất kỳ đối số. Vì vậy, bắt đầu từ ngày hôm nay, những gì chúng ta sẽ làm được, chúng ta sẽ bắt đầu hỗ trợ điều như thế này, ngay cả. Trong thực tế, trong trường hợp này, mà bạn thường không tự nhập, Làm được việc này cho chúng ta, không có một trong nhưng một, hai, ba thêm chuỗi sau của chương trình có tên là kêu vang. Vì vậy, làm thế nào để chúng ta đạt được điều này? Vâng, bắt đầu từ ngày hôm nay, trong trường hợp chúng ta muốn để cung cấp đầu vào thông qua cái gọi là dòng lệnh, chúng ta sẽ bắt đầu thêm ở đây những gì trong yellow-- thay thế khoảng trống với int argc dấu phẩy chuỗi argv mở khung khung gần. Bây giờ đây là thú vị cho một vài lý do. Một, nó sẽ để cho chúng tôi viết chương trình có nhiều hơn một chút năng động. Nhưng, compellingly hơn, nó sẽ mở ra tại một cuộc trò chuyện như những mảng có thể thực sự được sử dụng, cho những gì một chuỗi thực sự là dưới mui xe, đến tuần sau khi chúng tôi bắt đầu lặn trong thậm chí sâu hơn như thế nào là máy làm cho tất cả các công việc công cụ này. Nhưng hiện nay, chúng ta hãy vẽ, có lẽ, một bức tranh. Khi bạn viết một chương trình với chính tuyên bố theo cách này, như vậy là chính mất hai đối số, một int và- loại dữ liệu là tham số thứ hai? TƯỢNG: Array. DAVID Malan: Array. Vì vậy, có vẻ ở cái nhìn đầu tiên như đó là một chuỗi, nhưng nhận thấy các dấu ngoặc vuông. Nhớ lại lần cuối cùng chúng tôi giới thiệu khái niệm về một mảng. Và mảng sử dụng dấu ngoặc vuông trong một vài trường hợp. Bạn có thể sử dụng các hình vuông dấu ngoặc để đi vào một mảng và có được một yếu tố đặc biệt, giống như khung 0 hoặc 1 khung hoặc khung 2. Nhưng chúng ta đã thấy, nếu một thời gian ngắn, Tuần trước, bạn cũng có sử dụng các dấu ngoặc vuông để khai báo kích thước của một mảng, nếu bạn biết trước có bao nhiêu int hoặc có bao nhiêu dây hoặc bất cứ điều gì bạn thực sự muốn. Vì vậy, nó quay ra có của một bối cảnh thứ ba ở đây mà không có số bên trong trong dấu ngoặc vuông. Khi bạn chỉ định, như tôi đã ở đây, tên của một cái gì đó giống như argv, mà chỉ là một cách ưa thích của nói vector tham số, mà là một cách ưa thích của nói một mảng các đối số, mở khung khung gần chỉ có nghĩa là bạn không nhất thiết phải biết trước như thế nào lớn mảng là có được, nhưng bạn biết nó sẽ là một mảng. Vì vậy, nếu bạn không biết số không đặt nó ở đó, để mở khung khung gần có nghĩa là argv không phải là một chuỗi, nhưng một mảng các chuỗi. Vì vậy, cú pháp, nếu bạn nghĩ lại tuần trước, nó rất giống với nói một cái gì đó giống như int tuổi mở khung, và sau đó một cái gì đó sau đó. Vì vậy, điều này như thế nào? Hãy thực sự vẽ một bức tranh. Vì vậy, khi bạn chạy chương trình này với chính có hai đối số định nghĩa bên trong những dấu ngoặc đơn, bạn về cơ bản có ít nhất hai khối bộ nhớ giao cho bạn bên dưới mui xe. Một, như tôi sẽ rút ra như hình chữ nhật, sẽ được gọi là argc. Và cũng giống như một bản tóm tắt nhanh chóng, kiểu dữ liệu của argc là gì? Vì vậy, nó là một int. Vì vậy, một số sẽ đi lần lượt argc-- ra rằng viết tắt của số đối số. Trong khi đó, tôi đã rút ra argv là một mảng. Và tôi thực sự không biết bao lâu nó sẽ được, để cho các mục đích của ngày hôm nay chấm chấm chấm. Nó có thể nhận được một số chiều dài. Nhưng tôi đã mô tả ở đây ít nhất bốn hình chữ nhật. Vì vậy, argv một đoạn bộ nhớ mà các cửa hàng chuỗi xâu chuỗi dot dot dot, argc và chỉ là một đoạn bộ nhớ cho một số nguyên. Vì vậy, bây giờ, chúng ta hãy thêm một chút chính xác. Nếu, khi tôi có dây trong mảng này, được gọi là argv, tôi muốn được ở họ cá nhân, giống như tuần trước, chúng ta sẽ sử dụng ký hiệu như khung argv 0 để có được những điều đầu tiên một mảng. Argv khung 1 để có được Điều thứ hai, và vv. Chìa khóa ở đây là chúng ta vẫn còn 0 indexed-- chúng tôi vẫn đếm từ 0. Vì vậy, bây giờ chúng ta hãy thực sự đặt một cái gì đó trong này. Nếu tôi được biên dịch một chương trình gọi là hello từ một tập tin hello điểm c, và sau đó tôi chạy chương trình với dấu chấm giảm hello, những gì máy tính, máy tính xách tay của tôi, trông giống như bên dưới mui xe thời điểm tôi chạy dot giảm chào và nhấn Enter? Vâng, điều này có lẽ những gì chúng ta có thể mô tả như nội dung của máy tính của bạn bộ nhớ, hoặc bộ nhớ truy cập ngẫu nhiên RAM--. Nói cách khác, máy tính, bằng cách nào đó cho bạn một cách kỳ diệu, đưa ra con số 1 trong argc, AKA argcount, và nó đặt theo nghĩa đen chuỗi ./hello trong khung argv 0. Tôi không có ý tưởng, thẳng thắn, có gì trong khung argv 1 hoặc 2 hoặc 3, vì nếu người dùng không có gõ bất cứ điều gì ngoài ./hello, chúng ta sẽ giả định rằng các là những giá trị rác rất có thể, vậy để nói chuyện. Những khối của bộ nhớ tồn tại, nhưng nó không đến với chúng tôi nhìn vào họ, bởi vì các argcount chỉ có một. Bây giờ, trong khi đó, nếu tôi viết chạy một chương trình khác, cd, mà đúng hơn là một lệnh, nhấp nháy trong không gian cd prompt-- của bạn Dropbox-- khi tôi chạy đó, hiệu quả, khi chương trình được chạy cd, argc, bên trong bộ nhớ máy tính của tôi, là cho ngắn ngủi nhất thứ hai số 2. Và sau đó argv khung o có cd, khung argv 1 có Dropbox, và sau đó tất nhiên lệnh hoàn thành, vì vậy tất cả các bộ nhớ này về cơ bản biến mất và được sử dụng cho cái gì khác. Và đó là lý do tại sao tôi nói chỉ một giây. Trong khi đó, nếu chúng ta làm mkdir pset2, hình ảnh trông gần như giống nhau, nhưng với dây khác nhau bên trong argv. Nếu tôi làm vang dấu gạch ngang chào chào dot c, cùng ý tưởng. Nhiều công cụ được điền vào cho argv, và argc, tất nhiên, là 4. Vì vậy, nói cách khác, mặc dù mảng này có thể được chấm chấm chấm, một số chiều dài thay đổi, có thể nói, bạn luôn biết được nơi kết thúc của nó , bởi vì argc sẽ cho bạn biết vào thời điểm những gì bạn phải dừng lại nhìn vào các yếu tố trong argv. Bạn chỉ có thể nhìn vào bốn tổng cộng trong trường hợp này. Vì vậy, bây giờ chúng ta hãy xem, có lẽ, một chương trình đơn giản. Một là chỉ nói xin chào với một người như Zamyla. Vì vậy, tôi khẳng định tôi sẽ viết một chương trình chỉ trong một thời điểm thông qua đó tôi có thể làm ./hello Zamyla không gian, và sau đó tôi muốn chương trình của tôi để in ra một cái gì đó siêu đơn giản như "hello, Zamyla." Bây giờ trong quá khứ chúng ta đã sử dụng getString. Vì vậy, trong quá khứ, ngay cả khi bạn mới để lập trình, tỷ lệ cược là bạn có thể whip lên một chương trình sử dụng getString và sau đó sử dụng printf để nói chào Zamyla. Nhưng chúng ta không sử dụng GetString thời gian này. Hãy để tôi thay vì đi vào Appliant và không bao gồm tiêu chuẩn I O dot h. Hãy để tôi cũng bao gồm CS50 chấm h. Bây giờ int chính, và bây giờ tôi sẽ không làm vô hiệu ngày hôm nay. Thay vào đó, tôi sẽ làm int argc chuỗi argv mở khung khung gần, không quy định cụ thể một số. Và bây giờ ở đây là tôi được gọi là để làm. Những gì tôi sẽ làm gì bây giờ, tôi sẽ làm một chút về một bước nhảy vọt của đức tin, Tôi sẽ cho rằng người sử dụng của sẽ sử dụng chương trình này một cách chính xác, và tôi chỉ đơn giản là sẽ làm printf hello,% sn. Vì vậy, không có gì mới ở đó. Nhưng tôi muốn bây giờ đặt bất cứ điều gì từ các loại dùng sau khi tên của chương trình. Vì vậy, nếu tôi làm ./hello gian Zamyla, tôi muốn bằng cách nào đó lập trình truy cập trích dẫn unquote "Zamyla." vì vậy tôi có thể đi vào vector lập luận của tôi, mảng của tôi về chuỗi, và nếu lệnh, một lần nữa, là không gian ./hello Zamyla, những gì tôi muốn làm số để đưa vào argv ở đây? ĐỐI TƯỢNG: 1. DAVID Malan: 1, bởi vì khung 0 hóa ra là có được các tên chương trình, như chúng ta đã thấy. Vì vậy, khung 1 là từ đầu tiên mà tôi, người sử dụng, đã gõ. Tôi sẽ đi trước và lưu này. Tôi sẽ đi vào thư mục của tôi nơi mà tôi đã đặt tập tin này. Tôi sẽ làm cho chào 3. OK Comp IO. ./hello Zamyla Enter. Tôi đã làm gì sai? Tôi đã bị bất ngờ bản thân mình chỉ là một khoảnh khắc đó. Tôi đã làm gì sai? TƯỢNG: Tên. DAVID Malan: Các tập tin của thực sự gọi là hello3.c. Và tôi đã làm điều đó chỉ dành cho nhất quán, bởi vì chúng tôi đã có của hello.c trong qua trong mã trực tuyến. Vì vậy, hãy sửa chữa ./hello này khung gạch ngang 3 Zamyla. Enter. Và bây giờ chúng tôi có xin chào, Zamyla. Trong khi đó, tôi có thể thay đổi điều này để Rob được, hoặc thực sự bất kỳ từ nào khác. Nhưng chúng ta hãy xem xét một trường hợp góc. Những gì bạn có thể mong đợi sẽ xảy ra nếu Tôi không gõ tên của bất kỳ ai ở tất cả? TƯỢNG: Lỗi. DAVID Malan: Một lỗi của một số loại, có lẽ. Hãy xem. Enter. Null. Vì vậy, thực sự là printf một chút bảo vệ của chúng tôi ở đây, và theo nghĩa đen in dấu ngoặc mở null, nhưng mọi thứ còn tồi tệ hơn có thể xảy ra. Và chỉ để chứng minh một cái gì đó bạn hoàn toàn không nên làm, chúng ta hãy đi ở đây và bắt đầu chĩa ra xung quanh. Phải không? Nếu tôi biết rằng các hình ảnh trong bộ nhớ cơ bản này, argv khung 1 có Zamyla, argv khung 0 có ./hello, hoặc hello-3. Là gì trong khung 2? Vì vậy, tôi có thể trả lời rằng đặt câu hỏi về bản thân mình, phải không? Tôi chỉ có thể thay đổi từ 1 đến 2. Bây giờ tôi có thể biên dịch lại chào 3, ./hello3 Hãy phóng to và nhấn Enter. Rất tiếc. Không có dấu ngoặc. Thú vị. Vì vậy, đó là loại mát mẻ để xem những gì khác là ở đây. Vì vậy, những gì khác là bên trong của máy tính xách tay của tôi? Hãy lưu nó với khung 3. Hãy hello3, hello-3. Tò mò. Và bây giờ chúng ta hãy thực sự bold-- 50. Vì vậy, đó là thực sự lặn sâu vào bộ nhớ máy tính của tôi. 50 chỉ số trong. Vì vậy, hãy chào 3 hello-3. Tò mò. Được rồi, bây giờ tôi chỉ sẽ nhận được liều lĩnh. Hãy đi đến 5000. Tất cả các quyền. Vì vậy, hãy để tôi biên dịch lại. Hãy hello3, hello-3. OK. Bây giờ một số bạn, có thể là một bóng đèn sẽ tắt. Có bao nhiêu bạn có thấy thông báo này trước khi? OK. Vì vậy, tại sao? Tỷ lệ are-- và có khác nhau những thứ có thể gây ra điều này, và rõ ràng bạn đang ở tốt company-- chúng ta phải rõ ràng gây ra những gì được gọi là một lỗi phân khúc. Và câu chuyện dài ngắn cho ngày hôm nay, tôi đã chạm vào một phân đoạn của bộ nhớ rằng tôi không nên có. Trong trường hợp một phân đoạn chỉ có nghĩa là một đoạn bộ nhớ rằng tôi không nên có. Bây giờ máy tính đảm bảo rằng nếu tôi chạy ./helloZamyla mà tôi có thể chạm vào argv có khung 0 và argv khung 1. Nhưng argc là giá trị 2, có nghĩa là tôi chỉ allowed-- đó là loại danh dự system-- chạm khung 0 và 1 khung. Nếu tôi đi xa hơn, có hoàn toàn sẽ có bộ nhớ. RAM của tôi tồn tại vật lý trong máy tính. Nhưng ai mà biết được những gì đang có? Thật vậy, tôi đang chạy nhiều chương trình cùng một lúc. Tôi có thể có seen-- nếu tôi không làm điều này trên Appliant nhưng trên máy Mac hoặc PC-- của tôi, tôi có thể có nhìn thấy các nội dung của email. Tôi có thể nhìn thấy ngay lập tức thông điệp mà tôi vừa mới gửi. Bất cứ điều gì có thể kéo dài xung quanh trong bộ nhớ có thể được truy cập bằng cách tùy ý vuông khung ký hiệu này. Hoặc tệ hơn nữa, bạn có thể có tìm thấy một trong những mật khẩu của tôi Gần đây tôi đã muốn gõ vào, mà một chương trình đã được lưu trữ trong bộ nhớ như vậy là để xác thực cho tôi, và sau đó chỉ cần loại bỏ nó trong bộ nhớ RAM cho đến khi tôi bỏ chương trình đó. Và quả thực, đây là một trong sự nguy hiểm và là một trong các cường quốc của việc sử dụng một ngôn ngữ như C. Bạn có thể truy cập tự do để toàn bộ nội dung bộ nhớ của chương trình, và những kẻ xấu có thể thậm chí làm trong những cases-- đặc biệt là khi chúng tôi được lập trình web vào cuối học kỳ, chúng tôi sẽ lại topic-- này poke xung quanh, có khả năng, một người nào đó là máy tính bộ nhớ và tìm thấy những điều kỳ lạ như vậy như chúng ta đã thấy ở đó. Hoặc thậm chí tệ hơn, mật khẩu là ông người đọc có thể sử dụng để làm điều xấu. Vì vậy, rõ ràng tôi không nên làm điều này, vì những điều kỳ lạ bắt đầu xảy ra. Thật vậy, đây là một chương trình bị rơi. Điều này sẽ tương đương với của Mac OS hoặc trong Windows một cửa sổ chương trình chỉ biến mất. Một lỗi không mong muốn đã xảy ra. Trong môi trường dòng lệnh chúng ta thấy một cái gì đó như thế này. Nhưng đó là lý do tại sao, là tôi chỉ đơn giản là chạm vào bộ nhớ mà không thuộc về tôi. Vì vậy, hãy bảo vệ chống lại một này chút theo một cách khác bằng cách nhìn vào chương trình này ở đây. Vì vậy, một lần nữa, bộ xương mà chúng ta đã thấy earlier-- và tôi đã nhấn mạnh thời gian int này. Và tất cả thời gian chính này có thực sự trở lại một giá trị. Mặc dù trong hầu hết các bài giảng của chúng tôi ví dụ chúng tôi đã không bao giờ được sử dụng một lần trả lại bất cứ điều gì trong chính. Chúng tôi chỉ cần viết printf gần ngoặc móc và đó là nó. Nhưng miễn phí, những gì các trình biên dịch đã làm cho bạn, có hiệu quả, được trở về 0 cho bạn. Hóa out-- và đó là một chút counterintuitive-- đó 0 là tốt. Nó không có nghĩa sai cho mỗi gia nhập. 0 là tốt, và bất kỳ không 0 giá trị, thế giới đã quyết định, có thể biểu hiện một lỗi. Vì vậy, nếu bạn đã từng sai lầm một cái gì đó trên máy tính của bạn, hoặc một chương trình vừa qua đời vào bạn và bạn đã nhận được một số cửa sổ có sai sót trên màn hình của bạn, nói lỗi 49 tiêu cực hoặc sai sót 23-- một số value-- dường như đó là tùy ý vì một lập trình đã mã hóa cứng một giá trị như tiêu cực hay tích cực 49 23 đại diện cho bất kỳ số nào, dám nói, 4 tỷ điều có thể mà có thể đi sai trong một chương trình. Vì vậy, làm thế nào tôi có thể mất lợi dụng điều này bản thân mình? Vâng, hãy để tôi mở ra một chương trình mà tôi đã viết trước, và poke xung quanh trực tuyến hello 4. Và nó gần như giống hệt nhau, ngoại trừ việc có của nó một chút kiểm tra lỗi. Trong trường hợp này, tôi đã một lần nữa tuyên bố chính là dùng hai tham số, nhưng thời gian này, trên đường 17, thông báo Tôi đang làm một chút của một kiểm tra sanity. Tôi đảm bảo rằng argc bằng bằng 2. Bởi vì nếu nó là, có nghĩa là tôi có thể an toàn không chỉ chạm vào khung 0, nhưng khung 1. Và tôi đi trước và in ra, trong trường hợp này, Zamyla hoặc Rob hoặc bất cứ điều gì từ tôi đánh ra. Và bây giờ chỉ để có được một chút thích hợp hơn, Tôi sẽ trở lại một cách rõ ràng 0 để biểu thị tất cả là tốt. Không có gì xấu xảy ra. Tuy nhiên, theo quy ước, tôi sẽ trở về 1, hoặc thẳng thắn bất kỳ không giá trị 0, nếu một cái gì đó đã đi sai. Bây giờ người dùng sẽ không thực sự nhận thấy những gì đang xảy ra. Thật vậy, nếu tôi đi vào thư mục này, chúng tôi phóng to và làm cho chào 4, hello-4 Zamyla cư xử như tôi mong đợi. Nhưng nếu tôi thay vì không gõ bất cứ điều gì, không có gì có thể xảy ra, nhưng nó không sụp đổ. Và nếu tôi thay vì làm điều gì đó Rob như là một giám thị trong việc chia sẻ Thayer-- thông tin tùy ý. Tuy nhiên, thông báo, argv 1, 2, 3, 4, và 5 giờ nên tồn tại trong bộ nhớ. Đó cũng không phải những gì là dự kiến ​​chương trình của tôi, bởi vì tôi đã kiểm tra xem argc bằng bình đẳng 2 hay không. Vì vậy, bây giờ tôi đang bảo vệ chống lại điều này. Bây giờ, khi một sang một bên, chúng tôi các programmer-- hay đúng hơn là chúng tôi các users-- không bao giờ thấy 0 hoặc 1 nhưng sử dụng một công cụ gọi là Debugger, hoặc các công cụ khác, như chúng ta sẽ thấy trước dài, bạn lập trình viên thực sự có thể nhìn thấy những gì có thể đi sai bên trong chương trình của bạn. Vì vậy, bất kỳ câu hỏi về argc? Yeah. TƯỢNG: Tôi đã nhìn thấy nơi họ đã không có nhân vật, [không nghe được] vừa nói sao chuỗi d, giống như nhân vật dấu phẩy. Họ là tương đương ở đây? DAVID Malan: Họ là. Vì vậy, câu hỏi là, bạn có chương trình đôi khi nhìn thấy như thế này mà không làm nói khung chuỗi argv nhưng thay vì nói điều gì đó như char khung sao argv. Và thậm chí có khác biến thể mà bạn có thể nhìn thấy. Họ có thực sự tương đương. Hiện tại, chúng tôi có những loại bánh xe đào tạo trên dưới dạng chuỗi trong CS50 thư viện, nhưng chỉ trong vòng một tuần hay như vậy chúng ta sẽ loại bỏ tắc nghẽn hoàn toàn và thực sự nhìn vào những gì các char và ngôi sao là, và làm thế nào những người liên quan đến bộ nhớ đại diện nói chung. Vì vậy, chúng tôi sẽ quay trở lại đó. Các câu hỏi khác về argv hoặc argc của chúng tôi? Yeah. TƯỢNG: Tại sao nó lại trở lại một lỗi [không nghe được]? DAVID Malan: Tại sao nó trả lại một lỗi only-- oh! Trong trường hợp trước, khi chúng tôi được futzing xung quanh với bộ nhớ, tại sao nó chỉ trả lại một lỗi khi tôi thực sự đánh máy một số lượng lớn? Câu trả lời ngắn gọn là, chúng tôi chỉ có may mắn. Nói chung, một máy tính cấp phát bộ nhớ trong khối, và nó đã cho tôi một đoạn đủ lớn mà Tôi đã đi, mà không bị nhận thấy, cảm động của 2 khung, khung 3, khung 50, nhưng ngay sau khi tôi đẩy may mắn của tôi, tôi đã vượt ra ngoài ranh giới của đoạn bộ nhớ hệ điều hành đã cho tôi. Và đó là khi nó kiểm soát chặt và nói rằng, không có. Lỗi phân khúc. Yeah. TƯỢNG: Làm thế nào để máy tính biết giá trị của argc? DAVID Malan: Làm thế nào để máy tính biết giá trị của argc? Khi bạn chạy một chương trình, chương trình, bởi bản chất của dấu nhắc nhấp nháy, được giao mảng từ được đánh máy tại dấu nhắc, đó là gõ tại dấu nhắc. Và do đó, nó là điều hành của bạn hệ thống cơ bản populates lập luận chính cho bạn. Vì vậy, đó là một trong những dịch vụ mà bạn nhận được, loại bí mật bên dưới mui xe của một hệ điều hành. Các câu hỏi khác? Yeah. TƯỢNG: không cốt lõi bãi nghĩa là gì? DAVID Malan: không đổ lõi có nghĩa là gì? Vì vậy, đó là một câu hỏi hay. Và hãy để tôi quay trở lại thư mục này ở đây. Và bạn sẽ nhận thấy rằng Tôi có một tập tin mới có. Nó thực sự gọi là cốt lõi, và nó thực sự thường là một tập tin có kích thước khá. Đó thực chất là một bản chụp của các nội dung của bộ nhớ chương trình của tôi hoặc bộ nhớ RAM khi nó bị rơi. Và điều này sẽ có ích, có khả năng, diagnostically, khi chúng tôi nói chuyện trong một bài giảng tương lai và phần về gỡ lỗi, bởi vì bạn thực sự có thể làm tương đương với một số khám nghiệm tử thi trên tập tin đó để giúp tìm ra những gì bạn đã làm sai trong chương trình của bạn. Yeah. TƯỢNG: argc là một câu lệnh trong chính nó, hoặc bạn có thể đặt tên cho nó bất cứ điều gì? DAVID Malan: Câu hỏi. Argc là một lệnh trong chính nó, hoặc bạn có thể đặt tên nó là gì không? Đó chắc chắn không phải là một lệnh. Nó chỉ đơn giản là một biến của tên hoặc tên của một đối số, và như vậy chúng ta hoàn toàn có thể gọi foo này, chúng ta có thể gọi thanh này, mà có xu hướng là đi-đến từ một máy tính nhà khoa học đi đến. Tuy nhiên, theo quy ước, chúng tôi sử dụng argc và argv. Nhưng đó chỉ là một con người ước, không có gì hơn. Tất cả các quyền. Vì vậy, hóa ra, tôi đã nói một chút của một lie-- trắng và thẳng thắn, trong tương lai, bạn sẽ thấy chúng tôi đã nói dối trắng khác. Nhưng hiện nay, chúng ta sẽ để vỏ lại một trong những. Trong trường hợp này đây khi tôi trước đây chạy một chương trình như ./hello hoặc hello-3 Zamyla, chúng tôi đã có các nội dung của tôi bộ nhớ máy tính của tìm kiếm gần như thế này. Nhưng nhớ lại những gì là một chuỗi. Chúng tôi đã nói gì một tuần trước đây những gì một chuỗi thực sự là bên dưới mui xe? TƯỢNG: Mảng ký tự. DAVID Malan: Đây là một mảng ký tự, phải không? Vì vậy, chúng ta có thể có một mảng của chuỗi, nhưng, lần lượt, một chuỗi là một mảng các ký tự. Vì vậy, nếu tôi thực sự muốn được hậu môn khi tôi vẽ bức tranh này, Tôi thực sự cần được vẽ nó nhiều hơn một chút như thế này, nhờ đó mà trong mỗi chỉ số của mảng argv của tôi, có chính là một chuỗi toàn bộ mà chính nó là trong một mảng. Và bây giờ là lời nói dối trắng chúng ta đang nói hôm nay là hình ảnh không trông khá như thế này. Trong thực tế, các hình vuông nhỏ là thường bên ngoài của hình chữ nhật lớn có. Nhưng chúng tôi sẽ trở lại mà chẳng bao lâu. Nhưng đây là dấu gạch chéo ngược ./hello 0, đó là nhân vật đặc biệt demarcates cuối của một chuỗi, và chúng tôi đã có với nhau sau khi Tên của Zamyla. Vì vậy, điều này có nghĩa là gì? Vâng, hãy để tôi đi trước và mở ra hai ví dụ khác mà có sẵn trực tuyến. Một được gọi là argv1.c và khác là argv2. Đó là một chương trình siêu đơn giản là khác nhau từ các chương trình trước đây trong đó bây giờ tôi đang sử dụng argc và argv ở đây. Và bây giờ tôi đang kết hợp với một vòng lặp for ở dòng 18, từ i = 0 trên lên đến argc. Và những gì tôi sẽ làm gì với các dòng mã này ở đây? Trong tiếng Anh. Điều này rõ ràng cho thấy sử dụng argc. Nhưng trong tiếng Anh, những gì hiện nó làm gì nếu tôi chạy chương trình này? Vâng? TƯỢNG: Nó sẽ in của bạn màn hình nhiều lần như bạn muốn. DAVID Malan: Chính xác. Vì vậy, bất cứ điều gì từ tôi gõ tại dấu nhắc, đó là sẽ nôn ra chúng tôi mỗi dòng. Vì vậy, chúng ta hãy đi trước và làm điều này. Hãy để tôi đi vào thư mục của tôi và làm cho ./argv1 argv1. Và bây giờ, chúng ta hãy giữ nó đơn giản. Hãy làm điều gì đầu tiên. Nó đã in ra một điều, và đó là thực sự là tên của chương trình, bởi vì đó là trong khung 0. Nếu bây giờ tôi nói foo, nó sẽ làm hai, và nếu tôi nói foo bar, nó sẽ nói những ba điều. Bây giờ đó là một chút thú vị, có thể. Nhưng nhớ rằng argv là một mảng các chuỗi, nhưng một chuỗi là một mảng ký tự, vì vậy chúng tôi có thể có những điều lên một notch và áp dụng mà cơ bản logic và thực hiện mã có vẻ nhiều hơn một chút khó hiểu, thừa nhận. Nhưng bằng việc có một lồng nhau vòng lặp, một cái gì đó giống như với những gì bạn có thể nhớ lại từ Mario, Ví dụ, nếu bạn đã làm nó theo cách này. Vì vậy, bây giờ thấy trên dòng 19, tôi một lần nữa lặp lại trên lập luận của tôi, từ 0 lên đến trên argc. Và bây giờ trong dòng 21-- tôi vay một thủ thuật từ week-- cuối cùng Tôi đang kiểm tra những gì là chiều dài của khung argv tôi. Tôi đang lưu trữ mà câu trả lời trong n. Và sau đó tôi kết hợp từ j đến n, trong đó j được khởi tạo 0. Vì vậy, quy ước để đếm. Một khi bạn đã sử dụng tôi, nếu bạn có một vòng lặp lồng nhau, bạn không thể sử dụng tôi một lần nữa, nếu không bạn sẽ clobber, có khả năng, giá trị bên ngoài của các vòng trong. Vì vậy, tôi đang sử dụng theo quy ước j. Chúng ta có thể sử dụng k. Nếu bạn có nhiều hơn k, bạn có thể có quá nhiều làm tổ, thông thường. Nhưng bây giờ, tôi nhận thấy printf dòng là hơi khác nhau. Tôi không in% s, tôi in c%, trong đó, tất nhiên, là một giữ chỗ cho một char. Và bây giờ thấy cú pháp này. Mới. Chúng tôi đã không nhìn thấy nó trước đây. Nhưng một cách hợp lý, điều này chỉ có nghĩa là có được chuỗi thứ i trong argv và nhận được những j gì? TƯỢNG: nhân vật. DAVID Malan: Nhân vật trong chuỗi đó. Vì vậy, bằng cách sử dụng dấu ngoặc vuông theo sau dấu ngoặc vuông, đây là lặn đầu tiên thành chuỗi argv của, và sau đó là thứ hai dấu ngoặc vuông với j là lặn vào các nhân vật trong rằng chuỗi đặc biệt trong argv. Và sau đó, chỉ cần cho các biện pháp tốt, Tôi đang in một dòng mới ở đây. Vì vậy, bây giờ hãy để tôi đi trước và mở lên một cửa sổ hơi lớn vì vậy chúng tôi có thể thấy điều này trong hành động. Hãy để tôi đi vào thư mục đó. Và bây giờ làm cho argv-2-- whoops-- làm argv-2, ./argv 2. Enter. Và đó là một chút khó khăn để đọc theo chiều dọc, nhưng đó thực sự là tên của chương trình, tiếp theo là một dòng trống. Bây giờ hãy để tôi đi trước và làm foo. Tương tự như vậy khó đọc, nhưng nó thực sự in một ký tự trên mỗi dòng. Và nếu tôi làm quầy bar, nó bây giờ in những dòng dòng. Vì vậy, các takeaway ở đây không phải là quá nhiều rằng, wow, nhìn vào thủ thuật này mới gọn gàng nơi bạn có thể có được ở các nội dung các nhân vật cụ thể của một mảng, mà là cách chúng ta đang dùng những cơ bản ý tưởng như chỉ mục vào một mảng, và sau đó lập chỉ mục vào một mảng đó là trong mảng đó, và chỉ cần áp dụng những ý tưởng tương tự để ví dụ hơi phức tạp hơn. Nhưng những điều cơ bản thực sự có không thay đổi, thậm chí kể từ tuần trước. Bây giờ đây là loại kịp thời, trong đó, nhớ lại, trong tuần không chúng tôi đã chơi với một cuốn sách điện thoại như thế này. Và mặc dù điều này rõ ràng phần vật lý của giấy, bạn có thể loại suy nghĩ của một cuốn sách điện thoại như là một mảng. Chắc chắn, nếu bạn đã reimplement phần này những mảnh giấy trong một máy tính, có thể bạn sẽ sử dụng một cái gì đó giống như một mảng để lưu trữ tất cả những tên và số từ A tất cả các cách thông qua Z. Vì vậy, đây là tốt đẹp, bởi vì nó cho phép chúng ta một cơ hội, có lẽ, để xem xét như thế nào có lẽ bạn thực sự thực hiện một cái gì đó như thế. Như với một loạt các cửa ra ở đây. Vì vậy, nếu tôi could-- chúng ta cần một tình nguyện đi lên trên. Hãy xem. Một khuôn mặt quen thuộc có lẽ, khuôn mặt quen thuộc có lẽ. Làm thế nào về màu da cam? Ở đây. Áo sơ mi màu da cam, đi lên trên. Chúng ta hãy đi trước bây giờ và di chuyển các cánh cửa trên sang một bên, di chuyển các ra khỏi con đường cho một thời điểm. Tên của bạn là gì? Ajay: DAVID Malan: Ajay. David. Rất vui được gặp bạn. Tất cả các quyền. Vì vậy, chúng tôi có sau sáu cửa kỹ thuật số trên screen-- hoặc, đúng hơn, bảy cửa trên screen-- một bó toàn bộ số. Và tôi đã nói với bạn không có gì trong advance-- đồng ý? Ajay: Không có gì trước. DAVID Malan: Tất cả tôi muốn bạn làm bây giờ là tìm cho tôi, và cho chúng ta, thực sự, số 50, một bước tại một thời điểm. Ajay: Số 50? DAVID Malan: Số 50. Và bạn có thể tiết lộ những gì là phía sau mỗi cánh cửa chỉ đơn giản bằng cách chạm vào nó với một ngón tay. Chết tiệt. [Cười] [Vỗ tay] Thực hiện rất tốt. OK. Chúng tôi có một món quà đáng yêu giải thưởng dành cho bạn ở đây. Lựa chọn của bạn những bộ phim chúng tôi thảo luận tuần trước. Ajay: Oh, người đàn ông. Ồ, tôi chưa bao giờ thấy Spaceballs. DAVID Malan: Spaceballs. Tất cả các quyền. Vì vậy, tổ chức trên chỉ là một thời điểm. How-- chúng ta hãy làm này một moment-- có thể dạy dỗ làm thế nào để bạn đi về tìm kiếm số 50? Ajay: tôi đã chọn ngẫu nhiên. DAVID Malan: Vì vậy, bạn đã chọn ngẫu nhiên và đã gặp may. Ajay: Có. DAVID Malan: OK. Tuyệt vời. Vì vậy, bây giờ, có bạn không nhận được may mắn, những gì khác có thể đã xảy ra đằng sau những cánh cửa? Vì vậy, nếu tôi đi trước và tiết lộ những con số này ở đây, họ thực sự là theo thứ tự ngẫu nhiên. Và tốt nhất bạn có thể có thực hiện, thẳng thắn, là bởi, cuối cùng, trong trường hợp xấu nhất, kiểm tra tất cả. Vì vậy, bạn có siêu may mắn, mà không phải là những gì chúng tôi muốn gọi một thuật toán. Có, congrats. Nhưng bây giờ tôi let's-- hài hước, nếu bạn có thể. Hãy đi đến tab này ở đây. Và đây là những con số rõ ràng những gì có vẻ là một thứ tự ngẫu nhiên, và họ. Nhưng bây giờ nếu tôi thay vì yêu cầu bồi thường rằng đằng sau những cánh cửa là những con số được sắp xếp. Mục tiêu bây giờ là cũng tìm thấy chúng tôi số 50. Nhưng làm điều đó thuật toán, và cho chúng tôi biết bạn đang đi về nó. Và nếu bạn tìm thấy nó, bạn giữ cho bộ phim. Bạn không tìm thấy nó, bạn cung cấp cho nó trở lại. Ajay: Vì vậy, tôi sẽ kiểm tra kết thúc đầu tiên, để xác định xem there's-- [Cười và vỗ tay] DAVID Malan: Ở đây bạn đi. Chúng ta hãy xem một trong người tiền nhiệm của Ajay, Sean, người không phải là khá may mắn. OK, vì vậy công việc của bạn ở đây, Sean, là như sau. Tôi đã giấu đằng sau những cửa số bảy, nhưng giấu đi trong một số các cửa cũng như là con số không âm khác. Và mục tiêu của bạn là để nghĩ về điều này hàng đầu của các con số như chỉ là một mảng. Chúng tôi chỉ là một chuỗi các mảnh giấy với những con số phía sau họ. Và mục tiêu của bạn, chỉ sử dụng đầu mảng ở đây, tôi thấy số bảy. Và chúng tôi sau đó sẽ phê bình làm thế nào bạn đi về làm việc đó. Tìm chúng tôi biết số bảy, xin vui lòng. Số 5, 19, 13. Nó không phải là một câu hỏi trick. 1. Tại thời điểm này điểm số của bạn không phải là rất tốt, vì vậy bạn cũng có thể tiếp tục đi. 3. Đi đi. Thành thật mà nói, tôi không thể không tự hỏi bạn đang thậm chí nghĩ về. SEAN: Tôi có thể mất từ ​​chỉ hàng đầu. DAVID Malan: Chỉ có dòng đầu tiên. Vì vậy, bạn đã có ba trái. Vì vậy, tìm thấy tôi 7. [TƯỢNG hét ĐỀ XUẤT] Vì vậy, cả hai đều là những người tuyệt vời vì những lý do rất khác nhau. Vì vậy, đây là nơi chúng ta rời đi một thời điểm trước đây, và cái nhìn sâu sắc quan trọng ở đây đã được các cửa ra vào có số lượng phía sau họ đã được sắp xếp, lý tưởng takeaway cho đó là bạn có thể làm về cơ bản tốt hơn trong example-- thứ hai này và, trên thực tế, đó là Sean nỗ lực đầu tiên với số ngẫu nhiên cũng giống như before-- nhưng ngay sau là những con số được sắp xếp, giống như danh bạ điện thoại, rõ ràng là những gì bạn có thể làm gì? Hoặc làm thế nào bạn có thể tận dụng kiến ​​thức đó? Yeah. TƯỢNG: Bạn đi nửa đường [không nghe được]. DAVID Malan: Vâng. Chính xác. Vì vậy, bản năng ban đầu là Ajay để kiểm tra kết thúc, khi tôi gọi lại, và sau đó chúng tôi loại thành ví dụ một cách nhanh chóng. Nhưng nếu chúng ta bắt đầu làm nhiều hơn này có phương pháp theo con đường này, nhưng bắt đầu có lẽ trong trung bình, bởi vì họ đang sắp xếp, ngay khi chúng tôi tiết lộ số 16, do đó chúng tôi know-- và chúng ta hãy thực hiện chính xác that-- chúng tôi Do đó, biết rằng 50, trong trường hợp hiện nay, đã có được bên phải. Vì vậy, giống như trong tuần không khi chúng tôi xé cuốn sách điện thoại trong nửa và ném một nửa số vấn đề đi, cùng một ý tưởng ở đây. Chúng ta có thể ném một nửa này của vấn đề đi. Và có lẽ những gì bạn có thể làm thuật toán, một khi bạn biết rằng 50 phải bên phải, nếu nó bất cứ nơi nào, là cố gắng ở đó, ở giữa các cánh cửa còn lại. Tất nhiên, 50 là cao hơn hơn 42, vì vậy chúng tôi có thể ném này còn lại quý của vấn đề đi, và cuối cùng là xác định một cái gì đó giống như 50. Nhưng cũng giống như với danh bạ điện thoại, những con số đã được ban cho chúng ta đã có trong thứ tự sắp xếp, khiến cho chúng tôi với câu hỏi, làm thế nào để bạn có được những thứ đi vào trật tự sắp xếp? Và, thẳng thắn, với giá nào? Đó là một điều được trao danh bạ điện thoại và sau đó gây ấn tượng với bạn bè của bạn bằng cách tìm một số điện thoại thực sự nhanh chóng, đúng không? Xé 32 trang ra để tìm một người trong tổng số 4 tỷ trang, chúng tôi đã nói là một ví dụ điển hình. Nhưng bao nhiêu thời gian đã mất Verizon sắp xếp cuốn sách điện thoại? Bao nhiêu thời gian đã làm nó đưa chúng ta để sắp xếp bảy con số? Đó là một câu hỏi mà chúng tôi đã cho đến nay hoàn toàn bị bỏ qua. Vì vậy, hãy trả lời câu hỏi này ngay bây giờ. Và chúng tôi đã hết các bộ phim hiện nay, nhưng chúng tôi có một số quả bóng căng thẳng. Nếu, nói, tám tình nguyện viên sẽ không nhớ tham gia với chúng tôi ở đây? Chúng ta hãy đi trước và làm, làm thế nào về bốn người bạn, ba của bạn ở đây? Nhận được một số gương mặt mới. Và bốn người bạn đó? Và now-- chúng ta không thiên vị và here-- thứ tám ở đây vào cuối. Nào lên. Tất cả các quyền. Vì vậy, những gì chúng tôi có ở đây cho mỗi bạn là một con số. Nếu bạn muốn đi phía trước, đưa con số này. Tên của bạn là gì? Artie: Artie. DAVID Malan: Artie, được chứ. Bạn là số 1. Amin: Amin. DAVID Malan: Amin. David. Bạn là số 2. Và đi trước, như tôi tay bạn tờ giấy, dòng hãy tự lập ở phía trước của âm nhạc đứng ở thứ tự như trên đó. ANDY: Hi, Andy. DAVID Malan: Andy, nó là tốt đẹp để xem bạn. Số 3. Jacob: Jacob. DAVID Malan: Jacob, số 4. Chào mừng bạn. CẤP: Grant. DAVID Malan: Grant. Số 5. Alanna: Alanna. DAVID Malan: Alanna, số 6. FRANCES: Frances. DAVID Malan: Frances, số 7. Và? Rachel: Rachel. DAVID Malan: Rachel, số 8. Tất cả các quyền. Đi trước và có được cho mình theo thứ tự này. Hãy để tôi đặt một còn lại âm nhạc đứng tại chỗ. Nơi nào bạn cần một lập trường? OK. Đi trước và chỉ cần đặt con số của bạn nơi mà khán giả có thể nhìn thấy chúng trên, âm nhạc đứng đối mặt với bên ngoài. Và hy vọng, lần đầu tiên của chúng tôi kiểm tra sự tỉnh táo here-- 4, 2, 6. Oh-oh. Chờ một phút. Chúng tôi không có một 8. Tôi cần phải đuổi cậu ra khỏi ví dụ bằng cách nào đó. Số Không, đó là OK. Hãy xem. Chúng ta có thể làm điều này. Stand by. Có chúng tôi đi. Chính xác. Tất cả các quyền. Vì vậy, bây giờ chúng tôi có 8, 1, 3 7, 5. OK. Tuyệt vời. Vậy câu hỏi ở bàn tay là, tại những chi phí, và thông qua những phương pháp, chúng ta có thể thực sự sắp xếp những con số ở đây để chúng tôi có loại có thể làm việc trở về trước, cuối cùng, và nó thực sự là decide-- ấn tượng, là nó thực sự hiệu quả, mà tôi có thể phân chia và chinh phục một danh bạ điện thoại? Là nó thực sự hiệu quả mà Tôi có thể phân chia và chinh phục những mảnh kỹ thuật số giấy trên bảng, nếu có thể nó sẽ chi phí cho chúng tôi một tài sản trong thời gian hay năng lượng hoặc chu kỳ CPU để thực sự có được dữ liệu của chúng tôi vào một số thứ tự sắp xếp? Vì vậy, hãy hỏi câu hỏi đó. Vì vậy, trước hết, những con số này trong khá nhiều thứ tự ngẫu nhiên, và tôi sẽ đề xuất một thuật toán, hoặc quá trình nhờ đó chúng ta có thể sắp xếp những người này. Tôi sẽ tiếp cận điều này khá ngây thơ. Và tôi sẽ nhận ra rằng đó là loại rất nhiều đối với tôi để bọc tâm trí của tôi xung quanh toàn bộ dữ liệu thiết lập cùng một lúc. Nhưng bạn biết không? Tôi sẽ làm cho một số sửa chữa biên rất đơn giản. 4 và 2 là ra lệnh, nếu Mục đích là để đi từ 1 đến 8 trên. Vì vậy, bạn biết gì không? Tôi sẽ có bạn kẻ trao đổi, nếu bạn chuyển đổi thể chất và vị trí phần của giấy. Bây giờ 4 và 6, đây là theo thứ tự. Tôi sẽ để lại những được. 6 và 8, đó là theo thứ tự. Sẽ để lại cho họ được. 8 and1, ra lệnh. Nếu hai bạn sẽ không nhớ trao đổi. Bây giờ 8 và 3, nếu các bạn có thể trao đổi. 8 và 7, nếu các bạn có thể trao đổi. Và 8 và 5, nếu các bạn có thể trao đổi. Bây giờ, tôi làm gì? Không, rõ ràng là không. Nhưng tôi đã thực hiện các tình hình tốt hơn, phải không? Tên của bạn là gì nữa, số 8? Rachel: Rachel. DAVID Malan: Vì vậy, Rachel có bọt khí hiệu quả lên khá xa, tất cả các cách để kết thúc mảng của tôi về con số ở đây. Và vì vậy vấn đề là loại giải quyết. Bây giờ, rõ ràng, 2 vẫn cần di chuyển một chút, và 4 và 6 và 1. Nhưng tôi dường như đã nhận được một ít gần gũi hơn với các giải pháp. Vì vậy, hãy áp dụng điều này cùng phỏng đoán ngây thơ một lần nữa. 2 và 4, OK. 4 và 6, OK. 6 và 1, mm-mm. Hãy trao đổi. 6 và 3 mm-mm. Hãy trao đổi. 6 và 7 là OK. 7 và 5, nope. Hãy trao đổi. Và giờ đây, 7 và 8. Và tên của bạn là gì nữa? FRANCES: Frances. DAVID Malan: Frances. Vì vậy, bây giờ Frances là dù chỉ là một tốt hơn vị trí, bởi vì bây giờ 7 và 8 đang sôi sục một cách chính xác lên đến đỉnh. Vì vậy, 2 và 4, OK. 4 và 1, trao đổi cho phép của. 4 và 3, trao đổi cho phép của. 4 và 6, bạn là OK. 6 và 5, trao đổi cho phép của. Và bây giờ những kẻ là tốt. Chúng tôi gần như ở đó. 2 và 1, trong trật tự, để trao đổi. Và bây giờ hãy để tôi làm một kiểm tra sự tỉnh táo. 2 và 3, 3, 4, 4, 5, 5 và 6, 6, 7, 8. OK, vì vậy chúng tôi đang thực hiện. Nhưng còn cái giá đã làm tôi sắp xếp những con số này ở đây? Vâng, có bao nhiêu bước đã làm tôi có khả năng có khi sắp xếp những người này? Vâng, chúng tôi sẽ trở lại với câu hỏi đó. Tuy nhiên, thẳng thắn mà nói, nếu bạn có một chút buồn chán, đó là loại tiết lộ ở đây không phải có thể là thuật toán hiệu quả nhất. Và quả thực, thẳng thắn, tôi đổ mồ hôi tất cả các chi tiết đi đi lại lại. Điều đó đã không cảm thấy đặc biệt hiệu quả. Vì vậy, hãy thử cái gì khác. Nếu các bạn có thể thiết lập lại mình để tám giá trị. Tốt công việc. Chúng ta hãy nhìn kỹ thuật số, chỉ một lúc trước khi chúng tôi cố gắng cái gì khác, vào những gì vừa xảy ra. Ở đây, bạn đang về để xem một trực quan của tám con người trong đó màu xanh và đỏ thanh đại diện cho số. Các cao thanh, lớn hơn số lượng. Ngắn hơn thanh, nhỏ hơn số lượng. Và những gì bạn sẽ thấy là trong thứ tự ngẫu nhiên hơn tám trong số họ. Bạn sẽ nhìn thấy những thanh việc sắp xếp theo đó cùng một thuật toán, hoặc thiết lập các hướng dẫn, mà chúng tôi sẽ gọi từ đó bong bóng sắp xếp. Vì vậy, nhận thấy, mỗi giây hoặc lâu hơn, hai thanh được thắp sáng lên màu đỏ, đang được so sánh bằng máy tính. Và sau đó nếu thanh lớn và ít thanh là ra lệnh, họ đang được trao đổi với tôi. Bây giờ điều này là vô cùng tẻ nhạt xem này, chắc chắn, cho rất dài, nhưng chú ý takeaway-- thanh lớn di chuyển về bên phải, quán bar nhỏ di chuyển sang bên trái. Hãy hủy bỏ quá trình này và tốc độ này lên để được nhanh hơn nhiều, vì vậy chúng tôi có thể có được một cảm giác cao cấp của những gì, trên thực tế, bong bóng sắp xếp đang làm. Thật vậy, nó sủi bọt lên đến phía bên phải của danh sách, hoặc các mảng, các thanh lớn hơn. Và ngược lại, các quán bar nhỏ là sủi bọt cách của mình xuống bên trái, mặc dù với tốc độ nhanh hơn so với trước đây chúng tôi đã làm. Vì vậy, khó nhìn thấy với con người, nhưng bề ngoài đó là những gì thực sự đã xảy ra. Nhưng hãy thử một cơ bản cách tiếp cận khác bây giờ. Hãy thử một khác nhau thuật toán nhờ đó chúng ta có bạn chàng trai bắt đầu vào những gốc vị trí, đó là thứ tự này ở đây. Và chúng ta hãy đi trước bây giờ. Và tôi sẽ làm điều gì đó thậm chí đơn giản, phải không? Nhìn lại, trao đổi cặp lần nữa và một lần nữa, gần như một chút thông minh. Hãy làm những việc thậm chí nhiều hơn một cách ngây thơ, mà nếu tôi muốn sắp xếp những người này, hãy để tôi tiếp tục tìm kiếm cho các phần tử nhỏ nhất. Vì vậy, ngay bây giờ, 4 là số nhỏ nhất mà tôi đã nhìn thấy. Tôi sẽ nhớ điều đó. Không, 2 là tốt hơn, và hãy nhớ rằng. 1 thậm chí còn nhỏ hơn. 3, 7, 5. OK. One-- tên của bạn là gì nữa? Artie: Artie. DAVID Malan: Artie. Vì vậy, Artie, đi trước. Tôi sẽ kéo bạn ra khỏi đường. Nếu bạn có thể quay lại đây. Và tôi cần phải nhường chỗ cho anh. Chúng tôi có một điểm quyết định ở đây. Làm thế nào chúng ta có thể nhường chỗ cho Artie đây ở đầu nơi số 1 thuộc về? TƯỢNG: Shift. DAVID Malan: OK, chúng tôi có thể thay đổi tất cả mọi người. Tuy nhiên, đề xuất việc tối ưu. Mà cảm thấy một chút khó chịu cho tôi để hỏi bốn người để di chuyển tất cả các con đường xuống. Tôi có thể làm gì khác? TƯỢNG: Chuyển chúng. DAVID Malan: Chuyển chúng. Và tên của bạn là gì nữa? Jacob: Jacob. DAVID Malan: Jacob, di chuyển. Nhiều hiệu quả hơn chỉ để có Địa điểm trao đổi Jacob với Artie, như trái ngược với buộc tất cả bốn người trong số những người này, cảm ơn bạn rất nhiều, để vị trí chính xác của họ. Những gì tốt đẹp về Artie bây giờ, anh ta ở đúng vị trí của mình. Hãy làm điều này một lần nữa. 2, đó là số lượng nhỏ nhất tôi đã nhìn thấy. 3, 7, 5. OK. 2 chắc chắn là nhỏ nhất. Không cần phải làm bất cứ công việc. Hãy làm điều đó một lần nữa. 6. Nhỏ nhất? 8. Không. 4? Ooh. Hãy để tôi nhớ 4. 3. Hãy để tôi nhớ 3. 7, 5. Số nhỏ nhất mà tôi đã nhìn thấy trên đường chuyền này là 3. Nếu bạn muốn đi trên ra ngoài. Chúng ta đi đâu để đưa bạn? Và tên của bạn là gì? Alanna: Alanna. DAVID Malan: Alanna, chúng tôi sẽ phải đuổi bạn. Nhưng đó là hiệu quả hơn, chỉ trao đổi hai người, hơn để có nhiều người thực sự tránh né qua. Bây giờ chúng ta hãy làm điều này một lần nữa. Tôi sẽ lựa chọn 4, vì vậy đến ngày ra. Và ai sẽ di chuyển? Số 8, tất nhiên. Nếu bây giờ tôi tìm thấy số 5, đến ngày ra. Số 8 sẽ được đuổi ra khỏi nhà một lần nữa. Tôi bây giờ sẽ tìm thấy số 6 tại chỗ. 7 tại chỗ. 8 tại chỗ. Những gì chúng ta chỉ cần làm bây giờ là một cái gì đó gọi là lựa chọn sắp xếp, và nếu chúng ta hình dung này, nó sẽ cảm thấy một chút khác nhau. Chúng ta hãy đi trước và từ này đơn ở đây, visualization-- này hãy thay đổi này đối với: come on, Firefox. Hãy thay đổi điều này để lựa chọn sắp xếp. Và chúng ta hãy tốc độ nó lên như trước, và bắt đầu hình dung bây giờ. Và thuật toán này có một cảm giác khác nhau cho nó. Trên mỗi lần lặp, thẳng thắn, nó thậm chí còn đơn giản hơn. Tôi chỉ lựa chọn phần tử nhỏ nhất. Bây giờ, thẳng thắn mà nói, tôi có một chút may mắn thời gian, trong đó nó được sắp xếp siêu nhanh. Các yếu tố là ngẫu nhiên. Đó không phải là, như chúng ta sẽ thấy cuối cùng thấy, về cơ bản nhanh hơn. Nhưng chúng ta hãy xem một phần ba và cuối cùng tiếp cận ở đây như những gì đang xảy ra. Vì vậy, chúng ta hãy đi trước và thiết lập lại các bạn một lần cuối cùng để được theo thứ tự sau đây. Và bây giờ, tôi sẽ được nhiều hơn một chút thông minh, chỉ để vòng ra thuật toán của chúng tôi. Tôi sẽ làm điều này. Tôi sẽ không đi qua lại rất nhiều. Thành thật mà nói, tôi cảm thấy mệt mỏi tất cả traversing này. Tôi chỉ sẽ mất những gì tôi đưa ra ở đầu danh sách, và tôi sẽ sắp xếp mà sau đó và ở đó. Vì vậy, ở đây chúng tôi đang có. Số 4. Tôi sẽ chèn số 4 vào một danh sách được sắp xếp. Xong. Tôi tuyên bố bây giờ, và chỉ để làm cho hơn này rõ ràng, một phần của danh sách của tôi được sắp xếp. Đó là loại một yêu cầu ngu ngốc, nhưng thực sự 4 được sắp xếp theo một danh sách các kích thước một. Bây giờ, tôi sẽ đưa vào số 2. Số 2 giờ tôi sẽ chèn vào đúng nơi. Vì vậy, nơi không thuộc về 2? Rõ ràng, ở đây. Vì vậy, đi trước và di chuyển trở lại, nếu bạn có thể. Và tại sao cậu không chỉ mất âm nhạc của bạn đứng với bạn lúc này. Và chúng ta buộc phải chèn bạn vào đầu danh sách. Vì vậy, một công việc ít hơn. Tôi đã phải di chuyển Jacob xung quanh, và tên của bạn là gì? Amin: Amin. DAVID Malan: Amin. Nhưng ít nhất tôi đã không đi qua lại. Tôi chỉ lấy những thứ như tôi đi. Tôi chỉ chèn chúng ở đúng nơi. 6, điều này thực sự là khá dễ dàng. Hãy chèn bạn ở đó, nếu bạn chỉ muốn di chuyển trên một chút. Số 8, cũng khá dễ dàng. Ngay ở đó. Chết tiệt. Số 1, chúng tôi không thể chỉ trao đổi với Amin ở đây, vì đó là sẽ để gây rối trật tự. Vì vậy, chúng ta phải thêm một chút thông minh. Vì vậy, Artie, nếu bạn có thể sao lưu cho một thời điểm. Chúng ta hãy đi trước và thay đổi bây giờ, không giống như các thuật toán trước đó của chúng tôi, để nhường chỗ cho Artie ngay lúc đầu. Vì vậy, vào cuối ngày, tôi là loại làm những gì tôi muốn tránh trước. Và như vậy thuật toán của tôi là loại của đảo ngược, trí tuệ, từ những gì nó ban đầu được. Tôi chỉ làm việc chuyển đổi tại một điểm khác nhau. Bây giờ tôi đang ở 3. Oh, chết tiệt. Chúng tôi phải làm việc nhiều hơn nữa. Vì vậy, hãy đẩy bạn ra ngoài. Hãy di chuyển 8, 6, 4-- oh oh-- và 3 sẽ đi ngay. Vì vậy, tại tiết kiệm chút ít nhất là thời gian này. 7, không quá nhiều việc phải làm. Vì vậy, nếu bạn muốn bật trở lại, chúng ta hãy chèn bạn. Và cuối cùng, 5, nếu bạn muốn bật trở lại, chúng tôi cần phải thay đổi bạn, bạn, bạn, cho đến khi năm được đặt ra. Vì vậy, bây giờ thấy điều này tại một đồ họa cao cấp, chúng ta hãy làm thuật toán này hình dung một thời gian bổ sung. Vì vậy, chúng tôi sẽ gọi này sắp xếp chèn. Chúng tôi sẽ chạy nó cũng giống như nhanh chóng, và bắt đầu nó ở đây. Và nó cũng có một cảm giác khác nhau. Đó là loại được tốt hơn và tốt hơn, nhưng nó không bao giờ hoàn hảo cho đến khi tôi đi vào và trơn tru trong những khoảng trống. Bởi vì, một lần nữa, tôi chỉ lấy những gì Tôi được đưa ra từ trái sang phải. Vì vậy, tôi đã không nhận được may mắn như vậy rằng tất cả mọi thứ đã được hoàn hảo. Đó là lý do tại sao chúng tôi đã có những chút mispositions mà chúng ta cố định theo thời gian. Vì vậy, tất cả các thuật toán có vẻ chạy ở những tốc độ hơi khác nhau. Trong thực tế, bạn có thể nói là tốt nhất hoặc nhanh nhất cho đến nay? Sắp xếp nổi bọt, là người đầu tiên? Loại lựa chọn, thứ hai? Loại chèn, thứ ba? Tôi nghe một số loại lựa chọn. Suy nghĩ khác? Vì vậy, nó chỉ ra rằng tất cả các thuật toán về cơ bản cũng giống như hiệu quả như mỗi other-- hoặc ngược lại, cũng giống như không hiệu quả như nhau, bởi vì chúng tôi có thể làm cơ bản tốt hơn so với cả ba của các thuật toán. Và đó là một chút của một lời nói dối trắng. khi tôi nói như hiệu quả hoặc là không hiệu quả, đó là ít nhất là cho giá trị siêu lớn của n. Khi chúng ta chỉ có tám người dân ở đây, hoặc có thể 50 hoặc hơn thanh trên màn hình, bạn sẽ nhận thấy sự khác biệt hoàn toàn giữa ba thuật toán. Nhưng khi n, số lượng người, hoặc số lượng các số, hoặc số lượng người trong điện thoại cuốn sách, hoặc số lượng các trang web trong cơ sở dữ liệu của Google được lớn hơn và lớn hơn, chúng ta sẽ thấy rằng tất cả ba trong số này thuật toán là thực sự khá nghèo. Và chúng tôi có thể làm cơ bản tốt hơn thế. Chúng ta hãy có một cái nhìn, cuối cùng, vào những gì các thuật toán might âm thanh như trong bối cảnh của một vài người khác cũng bằng cách này hình dung đây sẽ giới thiệu chúng tôi với một số thuật toán. Chúng ta hãy đi trước và chúc mừng tham gia của chúng tôi ở đây, tất cả đều sắp xếp bản thân rất tốt. Nếu bạn muốn có một món quà chia tay. Bạn có thể giữ số của bạn. Và những gì bạn sẽ thấy, hay đúng hơn là nghe, bây giờ, là khi chúng tôi đặt âm thanh để mỗi người trong các quán bar và kết hợp nó với các phần mềm, tần số khác nhau của âm thanh, bạn có thể bọc tâm trí nhiều audioly của bạn xung quanh những gì mỗi người trong số những điều này như thế nào. Là người đầu tiên trong số đó là sắp xếp chèn [Nhạc] Đây là bong bóng sắp xếp. [Nhạc] Loại lựa chọn. [Nhạc] Một cái gì đó gọi là sắp xếp hợp nhất. [Nhạc] Loại Gnome. [Nhạc] Đó là nó cho CS50. Chúng ta sẽ thấy bạn vào ngày thứ Tư. Người kể chuyện: Và bây giờ, "Deep Suy nghĩ "của Daven Farnham. Tại sao nó là một vòng lặp? Tại sao không làm cho nó tốt hơn? Tôi muốn tạo ra một vòng lặp năm. [Cười]