[Powered by Google Translate] [Phần 4] [Ít thoải mái] [Nate hardison] [Đại học Harvard] [Đây là CS50.] [CS50.TV] Được rồi, chào đón trở lại phần. Trong phần tuần này, chúng tôi đang đi để làm một vài điều. Chúng tôi sẽ Đặt vấn đề recap 2, đó là vấn đề tập Caesar và Vigenère. Và sau đó chúng tôi sẽ đi sâu vào xem xét Câu hỏi nhanh 0 và dành một chút thời gian recapping những gì chúng tôi đã nói chuyện về trong mỗi của các bài giảng cho đến nay, và chúng tôi cũng sẽ làm một vài vấn đề từ câu đố của năm trước. Bằng cách đó bạn có một cách tốt để chuẩn bị cho điều đó. Để bắt đầu, tôi đã khởi động một vài giải pháp tốt cho các thiết lập vấn đề trước đây, Problem Set 2, vào không gian này. Nếu bạn tất cả các liên kết này, và nếu bạn nhấp vào tên của tôi và nhấp vào trên phiên bản đầu tiên của tôi bạn sẽ thấy caesar.c, đó là chính xác những gì tôi đang nhìn. Chúng ta hãy nói về điều này thực sự nhanh chóng. Đây chỉ là một giải pháp mẫu. Điều này không nhất thiết phải là giải pháp hoàn hảo. Có nhiều cách khác nhau để viết này, nhưng có một vài điều mà tôi muốn làm nổi bật mà tôi thấy như tôi đã phân loại, lỗi thường gặp mà tôi nghĩ rằng giải pháp này làm một công việc rất tốt xử lý. Việc đầu tiên là có một số loại bình luận tiêu đề ở đầu trang. Trên các tuyến đường 1 đến 7, bạn thấy các chi tiết, chính xác những gì chương trình này đang làm. Một tiêu chuẩn thực hành tốt khi bạn đang viết mã C không phân biệt nếu chương trình của bạn được chứa trong một tập tin duy nhất hoặc cho dù đó là phân chia trên nhiều tập tin là có một số loại định hướng bình luận ở đầu trang. Đây cũng là những người đi ra ngoài và viết code trong thế giới thực. Đây là nơi mà họ sẽ đặt thông tin bản quyền. Dưới đây là bao gồm #. On line 16 # xác định, mà chúng tôi sẽ trở lại trong chỉ là một chút. Và sau đó một khi chức năng bắt đầu, bắt đầu một lần chính, bởi vì chương trình này đã được tất cả chứa trong một chức năng duy nhất Điều đầu tiên điều đó xảy ra và điều này là rất thành ngữ và điển hình của một chương trình C mà mất trong dòng lệnh đối số-là nó ngay lập tức kiểm tra số lượng đối số, argc. Ở đây chúng tôi thấy rằng chương trình này được mong đợi 2 đối số chính xác. Hãy nhớ rằng có rằng đối số đầu tiên đó là đặc biệt đó là luôn luôn tên của chương trình đang được chạy, tên của các tập tin thực thi. Và do đó, điều này không ngăn cản người sử dụng chạy chương trình với các đối số nhiều hơn hoặc ít hơn. Lý do chúng tôi muốn kiểm tra quyền này là bởi vì chúng ta không thể thực sự truy cập mảng này argv ngay tại đây đáng tin cậy cho đến khi chúng tôi đã kiểm tra để xem nó là lớn như thế nào. Một trong những lỗi phổ biến tôi thấy là mọi người ngay lập tức sẽ đi vào và lấy argv [1]. Họ sẽ lấy tham số quan trọng của mảng và làm các việc để tôi kiểm tra trên đó, và sau đó họ sẽ làm bài kiểm tra cho argc cũng như các thử nghiệm tiếp theo, có hoặc không có tham số đầu tiên thực sự là một số nguyên cùng một lúc, và điều đó không làm việc vì trong trường hợp mà không có đối số cung cấp bạn sẽ được lấy một luận cứ không có hoặc cố gắng để lấy một trong đó là không có. Điều lớn khác mà bạn nên chú ý là bạn luôn muốn in ra một số loại thông báo lỗi hữu ích cho người sử dụng để định hướng cho chúng. Tôi chắc chắn rằng bạn đã tất cả các chương trình chạy, nơi tất cả các của một bất ngờ nó bị treo, và bạn nhận được hộp thoại này vô lý nhỏ bật lên và nói một cái gì đó khủng khiếp khó hiểu và có thể cung cấp cho bạn một mã lỗi hoặc một cái gì đó như thế mà làm cho không có ý nghĩa. Đây là nơi mà bạn thực sự muốn cung cấp một cái gì đó hữu ích và nhắm mục tiêu cho người sử dụng do đó mà khi chạy nó họ đi "Oh," khuôn mặt lòng bàn tay. "Tôi biết chính xác phải làm gì tôi biết làm thế nào để sửa lỗi này." Nếu bạn không in một tin nhắn, sau đó bạn kết thúc thực sự để lại người sử dụng để kiểm tra mã nguồn của bạn để tìm ra những gì đã đi sai. Ngoài ra còn có một số lần mà bạn sẽ sử dụng các mã lỗi khác nhau. Ở đây chúng tôi chỉ được sử dụng để nói rằng có một lỗi, có một lỗi, đã có một lỗi. Lớn hơn các chương trình, thường chương trình được gọi là các chương trình khác, sẽ trở lại một số loại mã lỗi đặc biệt trong các kịch bản khác nhau để lập trình truyền đạt những gì bạn làm khác chỉ cần sử dụng một thông điệp tốt đẹp Tiếng Anh. Cool. Khi chúng tôi làm việc, bạn có thể thấy chúng tôi kéo ra chìa khóa. Chúng tôi thử nghiệm để xem nếu khoá phù hợp. Chúng tôi nhận được một tin nhắn từ người sử dụng. Lý do chúng tôi làm điều đó trong này làm trong khi vòng lặp và điều này là một cái gì đó mà chúng ta sẽ một chút-bit nhưng nó chỉ ra rằng nếu bạn gõ soát D khi bạn nhận được dấu nhắc rằng GetString trên thiết bị đầu cuối những gì mà thực hiện là nó sẽ gửi một ký tự đặc biệt cho chương trình. Nó được gọi là ELF hoặc kết thúc của tập tin ký tự. Và trong trường hợp đó, chuỗi tin nhắn của chúng tôi sẽ được null, do đó, điều này không phải là một cái gì đó chúng tôi kiểm tra trong vấn đề thiết lập chính nó. Nhưng khi chúng tôi đi về, bây giờ mà chúng tôi đã bắt đầu nói về con trỏ và năng động, cấp phát bộ nhớ trên heap, kiểm tra cho null bất cứ khi nào bạn có một chức năng mà có thể trở về null như một giá trị là cái gì mà bạn sẽ muốn có được trong thói quen làm. Này là ở đây chủ yếu để minh họa. Nhưng khi bạn thấy GetString trong tương lai, Vấn đề Set 4 trên, bạn sẽ muốn giữ điều này trong tâm trí. Một lần nữa, điều này không phải là một vấn đề đối với vấn đề Set 3 hoặc kể từ khi chúng tôi đã không bao phủ nó. Cuối cùng, chúng tôi nhận được này là một phần mà chúng tôi nhận được vòng lặp mã hóa chính, và có một vài điều xảy ra ở đây. Đầu tiên, chúng ta lặp qua chuỗi toàn bộ tin nhắn. Ở đây chúng tôi đã giữ cuộc gọi strlen trong điều kiện, mà một số bạn đã chỉ ra không phải là một cách tuyệt vời để đi. Nó chỉ ra trong trường hợp này nó cũng không lớn, một phần bởi vì chúng ta đang sửa đổi các nội dung của thông điệp riêng của mình bên trong cho vòng lặp, do đó, nếu chúng ta có một tin nhắn dài 10 ký tự, lần đầu tiên chúng tôi bắt đầu cho vòng lặp strlen sẽ trả lại những gì? 10. Nhưng nếu chúng ta sau đó sửa đổi tin nhắn, nói rằng chúng ta sửa đổi nhân vật thứ 5, và chúng tôi ném vào một nhân vật 0 \ ở vị trí thứ 5, trên lặp đi lặp lại tiếp theo strlen (message) sẽ không trả lại những gì đã làm lần đầu tiên chúng tôi lặp, nhưng thay vào đó sẽ trở lại 5 bởi vì chúng tôi đã ném trong đó terminator vô giá trị, và chiều dài của chuỗi được định nghĩa bởi vị trí đó \ 0. Trong trường hợp này, đây là một cách tuyệt vời để đi bởi vì chúng ta đang sửa đổi nó tại chỗ. Nhưng bạn có nhận thấy rằng điều này là thực sự đáng ngạc nhiên đơn giản để mã hóa nếu bạn có thể tính toán chính xác. Tất cả những gì cần thiết để kiểm tra hay không lá thư mà bạn đang tìm kiếm là chữ hoa hoặc chữ thường. Lý do chúng tôi chỉ phải kiểm tra cho điều đó và chúng tôi không có để kiểm tra là alpha trường hợp là do nếu một nhân vật là chữ hoa hoặc nếu nó là chữ thường sau đó nó chắc chắn là một ký tự chữ cái, vì chúng ta không có chữ số chữ hoa và chữ thường. Những điều khác mà chúng tôi làm và điều này là một chút khó khăn là chúng tôi đã sửa đổi công thức tiêu chuẩn Caesar cipher mà chúng tôi đã cung cấp trong vấn đề thiết lập các đặc điểm kỹ thuật. Có gì khác nhau ở đây là chúng ta trừ trong trường hợp vốn chữ hoa A, sau đó chúng tôi đã thêm A hoa sao ở cuối. Tôi biết một số các bạn đã làm điều này trong mã của bạn. Có phải bất kỳ của bạn làm điều này trong bản đệ trình của bạn? Bạn đã làm điều này. Bạn có thể giải thích điều này không, Sahb? Bằng cách trừ nó ra, bởi vì bạn đã làm một mod ngay sau khi nó, bạn phải lấy nó ra, để cách bạn nhận được [ho] vị trí. Và sau đó bằng cách thêm nó trở lại sau đó, bạn chuyển qua một trong những bạn muốn. Yeah, chính xác. Sahb nói là khi chúng ta muốn thêm tin nhắn của chúng tôi và chìa khóa của chúng tôi lại với nhau và sau đó mod, mod NUM_LETTERS, nếu chúng ta không quy mô thông điệp của chúng tôi vào trong phạm vi 0 đến 25 thích hợp đầu tiên, sau đó chúng tôi có thể kết thúc nhận được một số thực sự lạ bởi vì các giá trị mà chúng tôi đang tìm kiếm tại khi chúng ta nhìn vào tin nhắn [i], khi chúng ta nhìn vào các ký tự thứ i của tin nhắn đồng bằng văn bản của chúng tôi, là một giá trị một nơi nào đó trong phạm vi 65 đến 122 dựa trên các giá trị ASCII chữ hoa A đến chữ thường z. Và như vậy khi mod nó bởi 26 hoặc NUM_LETTERS, vì đó là của chúng tôi # xác định ở phía trên bên phải lên đây, đó là sẽ cung cấp cho chúng tôi một giá trị trong khoảng 0 đến 25, và chúng ta cần một cách để sau đó quy mô trở lại và nhận được nó trong phạm vi ASCII thích hợp. Cách dễ nhất để làm điều đó là chỉ cần quy mô tất cả mọi thứ xuống vào phạm vi 0 đến 25 để bắt đầu với, và sau đó chuyển tất cả mọi thứ trở lại ở cuối. Một lỗi phổ biến mà tôi thấy mọi người chạy vào là nếu bạn không thực sự làm rộng này ngay lập tức và bạn thêm tin nhắn và khóa lại với nhau và bạn thêm chúng, nói, vào một biến char, vấn đề với điều đó kể từ khi tin nhắn [i] là một số lượng tương đối lớn để bắt đầu với nhớ nó ít nhất 65 nếu nó là một chữ hoa nhân vật nếu bạn có một chìa khóa lớn, nói rằng, một cái gì đó như 100, và bạn thêm những 2 lại với nhau thành một char ký bạn sẽ nhận được một tràn. Bạn sẽ nhận được một giá trị lớn hơn 127, đó là giá trị lớn nhất mà một biến char có thể giữ. Một lần nữa, đó là lý do tại sao bạn muốn làm được một điều để bắt đầu với. Một số người xung quanh trường hợp đó bằng cách làm một nếu khác và thử nghiệm để xem nếu nó sẽ tràn trước khi làm điều đó, nhưng cách này được xung quanh đó. Và sau đó trong giải pháp này, chúng tôi in ra toàn bộ chuỗi ở cuối. Những người khác in ra một nhân vật tại một thời điểm. Cả hai đều là awesome. Tại thời điểm này, làm bạn có bất kỳ câu hỏi nào, bất kỳ bình luận nào về điều này? Những điều bạn thích, những điều bạn không thích? Tôi có một câu hỏi. Có lẽ tôi bị mất nó trong lời giải thích của bạn, nhưng làm thế nào để chương trình này bỏ qua không gian để kết nối chìa khóa để dài của văn bản? Đây chỉ là Caesar cơ yếu. >> Ồ, xin lỗi, yeah. Yeah, chúng ta sẽ thấy. Trong mật mã Caesar, chúng tôi có xung quanh rằng vì chúng tôi chỉ lộn ký tự. Chúng tôi chỉ xoay họ nếu họ là chữ hoa hoặc chữ thường. Các bạn cảm thấy khá tốt về điều này? Cảm thấy tự do để sao chép này về nhà, lấy nó, so sánh nó với những gì bạn đã viết. Chắc chắn cảm thấy tự do để gửi câu hỏi về nó quá. Và một lần nữa, nhận ra rằng mục tiêu ở đây với vấn đề của bạn thiết lập là không để có được bạn để viết mã hoàn hảo cho bộ vấn đề của bạn. Đó là một kinh nghiệm học tập. Yeah. Quay lại do trong khi vòng lặp, nếu nó bằng null, nên vô giá trị chỉ có nghĩa là không có gì, họ chỉ cần nhấn Enter? Null là một giá trị con trỏ đặc biệt, và chúng tôi sử dụng null khi chúng ta muốn nói chúng ta có một biến con trỏ trỏ để không có gì. Và do đó thường có nghĩa là biến này, biến thông điệp này là trống rỗng, và ở đây, bởi vì chúng tôi đang sử dụng các loại đặc biệt chuỗi CS50, loại dây CS50 là gì? Bạn đã nhìn thấy những gì nó là khi David kéo lại mui xe trong bài giảng? Đó là một funky nó là một con trỏ, phải không? Được rồi, yeah >> Nó là một *. Và như vậy thực sự chúng ta có thể thay thế này ngay tại đây với thông điệp char *, và do đó, các chức năng GetString, nếu nó không thành công có được một chuỗi từ người dùng, nó không thể phân tích một chuỗi, và một trường hợp trong đó nó không thể phân tích một chuỗi là nếu người sử dụng các loại phần cuối của tập tin ký tự, D kiểm soát, mà không phải là một cái gì đó bạn thường làm, nhưng nếu điều đó xảy ra sau đó chức năng sẽ trở lại giá trị vô giá trị này như là một cách nói "Này, tôi không nhận được một chuỗi". Điều gì sẽ xảy ra nếu chúng ta không đặt tin nhắn = null, đó là một cái gì đó mà chúng tôi đã không được làm chưa? Tại sao đó sẽ là một vấn đề ở đây? Bởi vì tôi biết rằng chúng tôi nói chuyện một chút trong bài giảng về rò rỉ bộ nhớ. Yeah, chúng ta hãy làm điều đó, và chúng ta hãy xem những gì sẽ xảy ra. Câu hỏi của Basil là những gì sẽ xảy ra nếu chúng ta không thực sự có thông điệp này = null thử nghiệm? Hãy di chuyển lên đến đỉnh. Các bạn có thể bình luận này ra ngoài. Thực ra, tôi sẽ lưu nó trong bản chỉnh sửa. Điều này sẽ được sửa đổi 3. Những gì bạn sẽ phải làm gì để chạy chương trình này là bạn sẽ phải bấm vào biểu tượng thiết bị này lên đây, và bạn sẽ có thêm một đối số cho nó. Bạn sẽ phải cung cấp cho nó các tham số quan trọng vì chúng ta muốn vượt qua trong một đối số dòng lệnh. Ở đây tôi sẽ cung cấp cho nó số 3. Tôi thích 3. Bây giờ phóng to trở lại, chạy chương trình. Nó đang chạy, biên soạn, xây dựng. Ở đây chúng tôi đi. Nó chờ đợi để được nhắc nhở. Nếu tôi gõ một cái gì đó giống như hello-nơi đã làm điều đó đi đâu? Oh, chương trình của tôi đã quá lâu để chạy. Tôi đã jawing quá lâu. Ở đây nó đi. Bây giờ tôi gõ trong hello. Chúng tôi thấy rằng nó mã hóa một cách thích hợp. Bây giờ những gì sẽ xảy ra nếu chúng ta làm GetString nhanh chóng để trở về null? Hãy nhớ rằng, tôi đã nói rằng chúng tôi đã làm điều đó bằng cách nhấn D kiểm soát cùng một lúc. Tôi sẽ di chuyển lên ở đây. Chúng tôi sẽ chạy lại nó. Xây dựng. Nó đi. Bây giờ khi tôi nhấn soát D Tôi có dòng này nói rằng opt/sandbox50/bin/run.sh, phân đoạn lỗi. Bạn đã thấy rằng trước? [Sinh viên] Tại sao lại có không >>-Xin lỗi? [Sinh viên] Tại sao không có bãi chứa lõi trong trường hợp này? Các bãi chứa lõi là câu hỏi là tại sao lại có không có bãi chứa lõi ở đây? Câu hỏi đặt ra là có thể được, nhưng các bãi chứa lõi là một tập tin mà được lưu trữ trên ổ đĩa cứng. Trong trường hợp này, chúng tôi đã vô hiệu hóa bãi lõi trên máy chủ chạy để chúng tôi không có người seg đứt gãy và xây dựng tấn bãi lõi. Nhưng bạn có thể nhận được một. Bãi lõi là các loại điều mà bạn thường có thể vô hiệu hóa, và đôi khi bạn. Lỗi phân khúc, để trả lời câu hỏi của bạn, Basil, nói rằng chúng tôi đã cố gắng để truy cập vào một con trỏ không được thiết lập để trỏ đến bất cứ điều gì. Ghi Binky trong đoạn video khi Binky cố gắng truy cập vào một con trỏ đó không phải chỉ để bất cứ điều gì? Trong trường hợp này tôi đoán kỹ thuật con trỏ trỏ đến một cái gì đó. Nó trỏ đến null, về mặt kỹ thuật là 0, nhưng được xác định là trong một phân đoạn đó là không thể truy cập chương trình của bạn, để bạn có được một lỗi phân khúc bởi vì bạn không truy cập bộ nhớ đó là trong một phân đoạn hợp lệ như phân khúc đống hoặc phân đoạn ngăn xếp hoặc phân đoạn dữ liệu. Cool. Bất kỳ câu hỏi về Caesar? Hãy di chuyển. Chúng ta hãy nhìn vào phiên bản 2 thực sự nhanh chóng. Đó là Vigenère. Trong Vigenère chúng tôi sẽ đi bộ qua một trong những điều này khá nhanh chóng bởi vì, một lần nữa, Vigenère và Caesar là khá giống nhau. Tiêu đề nhận xét là trước đây, # Xác định trước để tránh sử dụng những con số ma thuật. Những điều tốt đẹp là nói chúng tôi muốn chuyển đến một bảng chữ cái khác nhau hoặc một cái gì đó như thế. Thay vì phải tự thay đổi số 26 trong các mã chúng ta có thể thay đổi đến 27 hoặc thả nó xuống nếu chúng ta đang sử dụng bảng chữ cái khác nhau, ngôn ngữ khác nhau. Một lần nữa, chúng tôi đã có sẽ kiểm tra số lượng đối số, và thực sự bạn gần như có thể thực hiện việc này như một bản mẫu. Khá nhiều mỗi chương trình bạn viết nên có nếu nó mất đối số dòng lệnh-một số trình tự của các dòng mà đọc như thế này ở đầu. Đó là một trong các bài kiểm tra sanity đầu tiên bạn muốn làm. Ở đây những gì chúng tôi đã được chúng tôi đã chắc chắn rằng từ khóa là hợp lệ, và đó là kiểm tra thứ hai mà chúng tôi đã làm. Chú ý rằng chúng ta chỉ cách nhau từ argc và 2. Lưu ý rằng trong trường hợp này, một trong những điều mà chúng tôi phải làm là thay vì của việc sử dụng i, chúng tôi muốn xác nhận toàn bộ chuỗi, và để làm được điều mà bạn thực sự phải đi ký tự bằng ký tự trên chuỗi. Không có cách nào tốt để gọi một cái gì đó vào nó bởi vì ngay cả, ví dụ, để tôi sẽ trở về 0 nếu nó không thể phân tích một số nguyên, do đó, mà thậm chí không làm việc. Một lần nữa, đẹp thông báo cho người sử dụng một cách chính xác những gì đã xảy ra. Sau đó, ở đây, một lần nữa, chúng tôi cũng xử lý trường hợp loại người dùng trong một nhân vật kiểm soát ngẫu nhiên D. Và sau đó Charlotte đã có một câu hỏi trước đó về cách chúng tôi quản lý để bỏ qua không gian trong chuỗi của chúng tôi ở đây. Đây là loại tương tự như những gì chúng ta đã làm với chương trình Myspace mà chúng tôi đã làm trong phần, và cách này làm việc là chúng ta theo dõi số lượng thư mà chúng tôi đã nhìn thấy. Khi chúng tôi bước trong chuỗi tin nhắn, khi chúng tôi đi qua nhân vật bằng cách nhân vật, chúng tôi theo dõi các chỉ số như là một phần của chúng tôi cho vòng lặp, và sau đó chúng tôi cũng theo dõi số lượng chữ cái, vì thế các ký tự đặc biệt, chữ số, không gian không phải da trắng mà chúng tôi muốn nhìn thấy trong các biến riêng biệt. Và sau đó giải pháp này thay đổi phím để có được một số nguyên thực tế quan trọng, và nó thực hiện trên bay, ngay trước khi nó sau đó đi để mã hóa các ký tự tin nhắn thực tế. Có một số giải pháp hoàn hảo tuyệt vời quá sẽ sửa đổi quan trọng khi thử nghiệm hiệu lực của phím. Ngoài việc đảm bảo rằng các nhân vật và từ khóa được một ký tự chữ cái, nó cũng biến đó vào một số nguyên trong phạm vi 0 đến 25 sau đó bỏ qua phải để làm điều đó sau này trong điều này cho vòng lặp. Một lần nữa, bạn thấy ở đây này thực sự là cùng mã chính xác đã sử dụng trong Caesar vào thời điểm này. Bạn đang làm cùng một điều chính xác, do đó, các trick thực sự là tìm hiểu làm thế nào để biến các từ khóa vào một số nguyên. Một điều mà chúng tôi đã làm ở đây đó là một chút dày đặc là chúng ta lặp đi lặp lại cụm từ này, tôi đoán bạn có thể gọi nó, 3 riêng lần trên đường 58, 59, và 61. Ai đó có thể giải thích cụm từ này chính xác những gì? Nó truy cập vào một nhân vật, như bạn nói. Yeah, đó là [không nghe được một nhân vật trong từ khóa, nên nó là số của các chữ cái nhìn thấy bởi vì bạn đang di chuyển dọc theo từ khóa khi bạn đã nhìn thấy bức thư, đó là sẽ bỏ qua không gian và các công cụ như thế có hiệu quả. Yeah, chính xác. Và sau đó một khi bạn đã nhìn thấy trống từ khóa, bạn chỉ cần mod, do đó bạn di chuyển trở lại xung quanh. Chính xác. Đó là một lời giải thích hoàn hảo. Kevin nói là chúng tôi muốn chỉ mục vào từ khóa. Chúng tôi muốn có được nhân vật num_letters_seen, nếu bạn sẽ, nhưng nếu num_letters_seen vượt quá độ dài của từ khóa, cách chúng ta lấy lại vào phạm vi thích hợp là chúng ta sử dụng các nhà điều hành mod để có hiệu quả bọc xung quanh. Ví dụ, như trong ngắn hạn, từ khóa của chúng tôi là thịt xông khói, và đó là 5 chữ cái. Nhưng chúng tôi đã nhìn thấy 6 chữ cái trong văn bản đơn giản của chúng tôi vào thời điểm này và mã hóa 6. Chúng tôi sẽ kết thúc truy cập num_letters_seen, là 6, mod chiều dài của từ khóa, 5, và vì vậy chúng tôi sẽ nhận được 1, và như vậy những gì chúng tôi sẽ làm là chúng tôi sẽ truy cập bên trong ký tự đầu tiên của từ khóa của chúng tôi tại thời điểm đó. Tất cả các quyền, bất kỳ câu hỏi về Vigenère trước khi chúng tôi di chuyển trên? Các bạn cảm thấy khá tốt về điều này? Cool, tuyệt vời. Tôi muốn làm cho chắc chắn rằng bạn đang nhận được các cơ hội để xem mã mà chúng tôi nghĩ có vẻ tốt và có cơ hội để học hỏi từ nó. Điều này sẽ là lần cuối cùng chúng tôi sẽ được sử dụng không gian cho thời gian được, và chúng tôi sẽ chuyển đổi ngay bây giờ, và tôi sẽ đi đến cs50.net/lectures vì vậy chúng tôi có thể làm một chút của bài kiểm tra đánh giá. Cách tốt nhất tôi nghĩ rằng để bắt đầu làm bài kiểm tra đánh giá là để đến trang này bài giảng, cs50.net/lectures, và bên dưới mỗi thuộc các nhóm tuần, do đó, nếu tôi xem xét ở đây tại Tuần lễ 0, Tôi thấy rằng chúng tôi có một danh sách các chủ đề mà chúng tôi đã giới thiệu trong tuần 0. Nếu bất kỳ của các chủ đề này có vẻ quen thuộc với bạn bạn chắc chắn sẽ muốn quay trở lại và sói các bài giảng và có thể thậm chí lướt qua các bài giảng, xem chúng một lần nữa nếu bạn muốn để có được một cảm giác về những gì đang xảy ra với mỗi người trong số những chủ đề. Tôi sẽ nói thêm một năm các nguồn tài nguyên mát mẻ, chúng tôi đã có là những quần short mà chúng tôi đã tạo ra, và nếu bạn nhìn tại Tuần lễ 0, chúng tôi không có tất cả các chủ đề được đề cập, nhưng chúng tôi đã có khá một vài trong số họ, một số trong những người phức tạp hơn, do đó, xem những quần short là một cách tốt để giúp bạn để tăng tốc độ. Trong đó, tôi sẽ phải đặt trong một plug cho 3 dưới đáy, kể từ khi tôi đã làm những. Nhưng nếu bạn đang đấu tranh với nhị phân, bit, hex, rằng loại công cụ, nhị phân là một nơi tuyệt vời để bắt đầu. ASCII là một số khác đó là tốt để xem quá. Bạn thậm chí có thể xem tôi ở tốc độ 1.5x nếu tôi sẽ quá chậm đối với bạn. Kể từ khi xem xét nó, cảm thấy tự do để làm điều đó. Chỉ cần để bắt đầu thực sự nhanh chóng, chúng ta sẽ đi qua một vài bài kiểm tra những vấn đề này chỉ để nhanh chóng khuấy qua các. Ví dụ, chúng ta hãy nhìn vào vấn đề 16 rằng tôi đã có ngay ở đây trên diễn đàn. Chúng tôi đã có tính toán sau này trong hệ nhị phân, và chúng tôi muốn để hiển thị bất kỳ công việc. Được rồi, tôi sẽ cung cấp cho một shot. Các bạn nên làm theo cùng với các giấy tờ, và chúng tôi sẽ làm điều này thực sự nhanh chóng. Chúng tôi muốn để thực hiện các tính toán sau trong hệ nhị phân. Tôi đã có 00.110.010. Và tôi sẽ để thêm nó 00.110.010. Đối với toán học thiên tài sau cùng ở nhà, điều này là có hiệu quả nhân cho 2. Hãy bắt đầu. Chúng tôi sẽ theo các thuật toán bổ sung mà chúng tôi làm khi chúng ta thêm số thập phân với nhau. Thực sự khác biệt duy nhất ở đây là chúng ta lặp lại xung quanh một khi chúng ta có 1 + 1 thay vì một khi chúng ta nhận được đến 10. Nếu chúng ta bắt đầu từ bên phải, thực sự nhanh chóng, chữ số đầu tiên là gì? [Sinh viên] 0 >> [Nate H.. 0. Tuyệt vời, các chữ số thứ hai? [Sinh viên] 1. [Nate H.] Có một 1? 1 + 1? [Sinh viên] 10. [Nate H.] Chính xác, vì vậy những gì là các chữ số mà tôi viết ngay bên dưới 2 cái cộng lại với nhau? [Sinh viên] 1, 0, hoặc 0 và sau đó mang 1. [Nate H.] 0 và mang theo một 1, chính xác. Basil lên kế tiếp, bạn đang lên. Thứ ba là gì? >> [Basil] 1. [Nate H.] 1, hoàn hảo. Kevin? [Kevin] 0 >> [Nate H.. 0, Charlotte? [Charlotte] 0 >> [Nate H.. Yeah, và tôi phải làm gì? [Sinh viên] 1. [Nate H.] Và tôi phải làm gì? Và sau đó tôi mang 1. Hoàn hảo, Sahb >> [Sahb] Bây giờ bạn có 1. [Nate H.] Và tôi làm bất cứ điều gì ở đây? [Sahb] Sau đó, cho một kế tiếp bạn có 1 bởi vì bạn thực hiện hơn 1. [Nate H.] Great, do đó, ở đây chúng tôi có thể hoàn thành nó. Cool. [Sinh viên] Có 0 + 0 = 0? 0 + 0 = 0. 1 + 1, như bạn nói, 10, 1, 0, thay vì. 10 là một nhầm lẫn bởi vì tôi 10 có nghĩa là số 10, và đó là những đứa làm thế nào chúng tôi đang đại diện cho nó khi chúng ta đang viết nó. Chúng tôi đại diện cho các số 2 1, 0, và số 10 là hơi khác nhau. Loại tốt đẹp về nhị phân là gì là có thực sự không có nhiều trường hợp, bạn cần phải học. Có 0 + 0 = 0, 0 + 1 = 1, 1 + 1 là 0, và sau đó thực hiện một 1, và sau đó bạn có thể thấy ở đây trên cột thứ ba từ bên phải chúng tôi đã có 1, 1, 1. Và 1 + 1 + 1 là một 1, và bạn mang theo khác 1. Khi bạn đang làm Ngoài ra nhị phân, khá đơn giản. Tôi muốn làm một vài trong số này để kiểm tra sanity mình trước khi bạn đi bởi vì đây là có thể là một cái gì đó mà chúng ta sẽ thấy trên các bài kiểm tra. Bây giờ chúng ta hãy làm điều này một trong những kế tiếp cũng. Hãy làm vấn đề 17. Chúng tôi sẽ chuyển đổi số nhị phân sang thập phân như sau. Tôi đã có 10100111001. Nhớ trong video nhị phân mà tôi đã làm Tôi đi qua một vài ví dụ, và tôi cho thấy làm thế nào tất cả mọi thứ hoạt động khi bạn đang làm trong thập phân. Khi bạn đang làm việc trong đại diện thập phân, tôi nghĩ chúng ta vào thời điểm này trong cuộc sống của chúng tôi để thông thạo nó mà nó rất dễ dàng để bóng qua các cơ chế như thế nào nó thực sự hoạt động. Nhưng để làm được một bản tóm tắt nhanh chóng, nếu tôi có số 137 điều này thực sự có nghĩa là và một lần nữa, điều này là số thập phân đại diện số 137 trong hệ thập phân có nghĩa là tôi có 1 x 100 + 3 x 10 + 7 x 1. Điều này là tất cả ở trên màn hình. Và sau đó nếu bạn nhìn vào những con số này ngay tại đây, 100, 10 và 1, bạn sẽ thấy rằng họ đang thực sự tất cả các quyền hạn của 10. Tôi có 10 ², 10 ¹, và 10 số không. Chúng tôi có một loại tương tự của điều trong nhị phân, ngoại trừ cơ sở của chúng tôi, như chúng tôi gọi nó là 2 thay vì 10. Những 10s mà tôi đã viết xuống đây ở phía dưới, ² 10, 10 ¹, 10 đến số không, 10 là cơ sở của chúng tôi, và số mũ, 0, 1, hoặc 2, là ngụ ý vị trí của các chữ số trong số đó chúng tôi viết. 1, nếu chúng ta nhìn vào nó, 1 là ở vị trí thứ 2. 3 là ở vị trí 1, và 7 ở vị trí 0. Đó là làm thế nào chúng ta có được các số mũ khác nhau dưới đây cho các cơ sở của chúng tôi. Sau này we'll-thực sự, bạn biết những gì? Chúng tôi sẽ làm không lùi lại nút của tôi đi? Nó đi. Tôi thích điều này lùi lại. Sau này, tôi nghĩ rằng đối với tôi ít nhất cách dễ nhất để bắt đầu chuyển đổi một số nhị phân hoặc một số hệ thập lục phân nơi mà cơ sở là 16 và không phải là 10 hoặc 2 là để đi trước và viết ra cơ sở và số mũ cho tất cả các con số trong số nhị phân của tôi ở đầu trang. Nếu chúng ta bắt đầu từ trái sang phải một lần nữa, đó là loại phản, Tôi sẽ thay đổi trở lại màu đen ở đây, chúng ta có 2 vị trí 0, và sau đó chúng tôi có 2 ¹, 2 ², và sau đó 2 đến 3, 2 đến 4, 2 5, 6, 7, 8, 9, và 10. Những con số này tôi đã viết ra tất cả các số mũ. Tôi chỉ viết các căn cứ ở đây trong 3 đầu tiên chỉ cho không gian. Tại thời điểm này tôi sẽ đi trước và tôi thực sự sẽ để xóa những thứ mà chúng tôi đã làm trong thập phân, nếu đó là okay. Bạn đã có tất cả các điều đó. Những người bạn xem trực tuyến Tôi chắc chắn sẽ có thể quay ngược tôi nếu bạn muốn. Chuyển đổi qua lại cây bút. Bây giờ, những gì chúng ta có thể làm nếu bạn không phải là hoàn toàn lên đến tốc độ trên quyền hạn của 2, đó là hoàn toàn mát mẻ. Nó sẽ xảy ra. Tôi hiểu. Tôi đã từng có một cuộc phỏng vấn công việc mà tôi đã nói với tôi nên biết tất cả quyền hạn của 2 lên thông qua 2 đến ngày 30. Đó không phải là một công việc tôi có. Dù sao, các bạn có thể đi trước và làm toán ở đây, nhưng với nhị phân nó không thực sự có ý nghĩa, và cũng không phải không có ý nghĩa với số thập phân hoặc thập lục phân, làm toán ra nơi mà bạn có số không. Bạn có thể thấy tôi có 0, 0, 0, 0, 0, 0 đây. Tại sao có thể không có ý nghĩa để làm toán thực tế để tính toán sức mạnh thích hợp của 2 cho vị trí đó? Chính xác, như Charlotte nói, nó sẽ là 0. Cũng có thể tiết kiệm cho mình thời gian nếu tính toán quyền hạn của 2 không phải là điểm mạnh của bạn. Trong trường hợp này, chúng ta chỉ cần để tính toán nó cho 2 0 đó là? [Sinh viên] 1. [Nate H.] 1, 2 3 các- [Sinh viên] 8 >> [Nate H.]. 8. 2 cho 4? [Sinh viên] 2. Tôi xin lỗi, 1. [Nate H.] 2 cho 4 là 16, chính xác. 2 đến 5, Kevin >> 32. Nate H. 32, 2 với 8? [Sinh viên] 32 x 8, 256. [Nate H.] Perfect. Và 2 với 10? [Sinh viên 1024. [Nate H.] Yeah, 1024. Một khi chúng ta đã có những con số này chúng ta có thể tổng hợp tất cả lên. Và đây là nơi mà nó thực sự quan trọng để làm một vài điều. Một là đi chậm lại và kiểm tra công việc của bạn. Bạn có thể nói rằng có một 1 vào cuối của số này, vì vậy tôi chắc chắn sẽ nhận được một số lẻ như là kết quả của tôi, bởi vì tất cả những người khác đang có được ngay cả con số cho rằng đó là một số nhị phân. Điều khác để làm là nếu bạn nhận được đến thời điểm này trong bài thi và bạn đã viết nó ra điều này đến nay và bạn đang chạy ra khỏi thời gian nhìn vào số lượng các điểm rằng vấn đề này là giá trị. Vấn đề này, bạn có thể thấy nếu tôi lật trở lại để máy tính xách tay của tôi thực sự nhanh chóng vấn đề này là giá trị 2 điểm, do đó, điều này không phải là thứ bổ sung bạn cần phải đi qua nếu bạn đang thực sự ép cho thời gian. Nhưng chúng tôi sẽ chuyển đổi qua lại với iPad, và chúng tôi sẽ đi qua nó thực sự nhanh chóng. Tôi thích làm những con số nhỏ đầu tiên bởi vì tôi thấy rằng dễ dàng hơn. Tôi thích 32 và 8 bởi vì họ đi với nhau khá dễ dàng, và chúng tôi nhận được 50. 16 và 1 được 17. Hiện chúng tôi nhận được 57, và sau đó chúng ta có thể làm phần còn lại của điều này, vì vậy chúng tôi có thể làm 57, 156. Đi nào. Man, tốt, chúng ta hãy xem. Chúng tôi đã có 57, 256, và 1024. Tại thời điểm này, tôi muốn chỉ cần đi qua. Tôi không có đầu mối. Tôi rõ ràng cần phải đọc lên trên này. 7, 6, và 4, bạn nhận được 17. 1, 5, 5, 2, 13. Sau đó, chúng tôi nhận được 3, và sau đó chúng tôi nhận được 1. 1337. Trứng Phục Sinh, bất cứ ai? Bất kỳ ai nhận ra con số này? Chris nhận ra số. Có nghĩa là gì, Chris? [Chris] Leet. Leet, do đó, nếu bạn nhìn vào điều này, có vẻ như Leet. Hacker công cụ. Xem ra cho rằng loại công cụ trên bài kiểm tra giữa kỳ hoặc, thay. Nếu bạn thấy rằng loại công cụ và bạn đang tự hỏi "Huh," mà thực sự có thể có nghĩa là một cái gì đó. Tôi không biết. David thích đặt. Đó là một cách tốt để kiểm tra sanity. Như được rồi, tôi có thể nhìn thấy những gì đang xảy ra. Đó là Tuần 0/Week 1 thứ. Nếu chúng ta chuyển về máy tính xách tay của chúng tôi bây giờ, thu nhỏ, và một vài thứ khác. Có ASCII, mà chúng tôi đã làm rất nhiều với các bộ vấn đề. Khái niệm về vốn A. là thực sự? Biết đó là số nguyên thập phân. 65 là những gì nó được ánh xạ tới trong bảng mã ASCII, và đó là lý do đó máy tính viết nó như thế nào, và đó là cách chúng tôi đã nhận được đi với việc viết vốn ký tự A và ký tự chữ thường trong một số các giải pháp này và bộ vấn đề mà bạn đã làm. Một vài thứ khác. Chúng tôi đã có báo cáo, biểu thức boolean, điều kiện, vòng lặp, các biến và chủ đề. Tất cả những ai có vẻ có ý nghĩa đối với hầu hết các phần? Một số thuật ngữ này là một funky ít lần. Tôi thích nghĩ của một tuyên bố như đối với một cái gì đó hầu hết các phần kết thúc bằng một dấu chấm phẩy. Báo cáo chẳng hạn như x = 7, trong đó đặt ra một biến, có lẽ gọi là x = 7. Có lẽ x cũng là một loại có thể lưu trữ số 7, do đó, nó là một int hoặc có thể một phao hoặc một đoạn ngắn hoặc một char, một cái gì đó như thế. Một biểu thức boolean là sử dụng những đôi bằng và bang bằng hoặc bằng không, ít hơn, lớn hơn, nhỏ hơn hoặc bằng, rằng tất cả các loại công cụ. Điều kiện sau đó là những tuyên bố nếu người nào khác. Tôi sẽ nhớ rằng bạn không thể có một người nào khác mà không có một tương ứng nếu. Tương tự như vậy, bạn không thể có một người nào khác nếu không có tương ứng nếu. Loops, nhớ lại 3 loại của các vòng chúng tôi đã được búa vào bạn cho các cặp vợ chồng cuối cùng của các bộ phận và bộ vấn đề. Sử dụng làm trong khi khi bạn đang nhận được người dùng nhập vào, bằng cách sử dụng trong khi các vòng cho đến khi một điều kiện cụ thể là sự thật, và sau đó sử dụng những người cho vòng lặp nếu bạn cần biết mà lặp đi lặp lại của vòng lặp bạn hiện đang là cách tôi suy nghĩ về nó. Hoặc nếu bạn đang làm cho mỗi ký tự trong một chuỗi tôi muốn làm một cái gì đó, cho mỗi phần tử trong một mảng tôi muốn làm một cái gì đó cho phần tử đó. Chủ đề và các sự kiện. Này, chúng tôi đã không trình bày một cách rõ ràng trong C, nhưng hãy nhớ điều này từ đầu. Đây là khái niệm có các kịch bản khác nhau. Đây cũng là khái niệm này phát sóng một sự kiện. Một số người không sử dụng phát sóng trong các dự án của họ ban đầu, đó là hoàn toàn mát mẻ, nhưng đây là 2 cách khác nhau xử lý vấn đề này lớn hơn được gọi là đồng thời, đó là làm thế nào để bạn có được để thực hiện chương trình hoặc dường như thực hiện cùng một lúc? Nhiệm vụ khác nhau chạy các nhiệm vụ khác cũng đang chạy. Đây là hệ điều hành của bạn như thế nào dường như làm việc. Đây là lý do tại sao mặc dù, ví dụ, Tôi đã có trình duyệt của tôi chạy, tôi cũng có thể bật Spotify và chơi một bài hát. Đó là một khái niệm để hiểu. Tôi sẽ có một cái nhìn tại các chủ đề ngắn nếu bạn muốn tìm hiểu thêm về điều đó. Hãy xem, tôi tin rằng có thể có được một vấn đề về điều này trong một trong những. Một lần nữa, tôi nghĩ rằng các chủ đề và các sự kiện không phải là một cái gì đó mà chúng tôi sẽ giới thiệu trong C chỉ vì nó là nhiều hơn đáng kể khó khăn hơn trong Scratch. Bạn không nên lo lắng về nó ở đó, nhưng chắc chắn hiểu các khái niệm, hiểu những gì đang xảy ra. Trước khi chúng tôi di chuyển trên, bất kỳ câu hỏi nào về Tuần 0 tài liệu? Mọi người đều cảm thấy khá tốt? Biến sự hiểu biết và những gì một biến? Di chuyển trên. Tuần 1. Một vài điều ở đây không đặc biệt bao phủ trong việc xem xét bài kiểm tra cần thiết và cũng là những điều khái niệm nhiều hơn để suy nghĩ về. Đầu tiên là khái niệm về mã nguồn, trình biên dịch và mã đối tượng. Ai? Basil. Là mã đối tượng có nghĩa là mã nguồn là những gì bạn đưa vào kêu vang, và đối tượng đang kêu vang đặt ra để máy tính của bạn có thể đọc các chương trình. Chính xác. Mã nguồn là mã C mà bạn thực sự gõ lên. Mã đối tượng là những gì bạn có được ra khỏi kêu vang. Trong đó định dạng nhị phân 0 và 1. Sau đó, những gì xảy ra là khi bạn có một loạt các đối tượng tập tin, nói rằng bạn đang biên soạn một dự án hay một chương trình có sử dụng nhiều tập tin mã nguồn, theo quy ước được đưa ra phần mở rộng tập tin c. Đó là lý do tại sao chúng tôi có caesar.c, vigenère.c. Nếu bạn đang viết các chương trình Java, bạn cung cấp cho họ phần mở rộng. Java. Python chương trình có phần mở rộng py thường xuyên. Một khi bạn có nhiều c file, bạn biên dịch chúng. Clang spits ra tất cả những điều này rác nhị phân. Sau đó, vì bạn chỉ muốn 1 chương trình bạn có liên kết mối liên kết tất cả các đối tượng này tập tin với nhau vào 1 tập tin thực thi. Đây cũng là những gì sẽ xảy ra khi bạn sử dụng các thư viện CS50, ví dụ. Thư viện CS50 là cả hai, h phần đầu tập tin mà bạn đọc, # includecs50.h. Và sau đó nó cũng là một tập tin nhị phân thư viện đặc biệt được biên dịch là 0 và 1, và l cờ, vì vậy nếu chúng ta quay trở lại không gian của chúng tôi và chúng ta nhìn thực sự nhanh chóng vào những gì đang xảy ra ở đây khi chúng ta nhìn vào lệnh kêu vang của chúng tôi, những gì chúng tôi đã có là đây là tập tin mã nguồn của chúng tôi ngay tại đây. Đây là một loạt các cờ biên dịch. Và sau đó vào cuối những liên kết trong l cờ các tập tin nhị phân thực tế cho 2 thư viện, thư viện CS50 và sau đó thư viện toán học. Hiểu biết về mỗi loại mục đích files ' trong quá trình biên dịch là một cái gì đó bạn sẽ muốn để có thể cung cấp cho ít nhất là một mức khái quát cao. Mã nguồn có in mã đối tượng đi ra. Các tập tin mã đối tượng liên kết với nhau, và bạn nhận được một tập tin, xinh đẹp và thực thi. Cool. Đây cũng là nơi bạn có thể nhận được lỗi tại nhiều thời điểm trong quá trình biên dịch. Đây là nơi mà, ví dụ, nếu bạn đưa ra lá cờ này liên kết, CS50 cờ, và bạn bỏ qua nó trong không gian hoặc khi bạn đang chạy mã của bạn, đây là nơi mà bạn sẽ nhận được một lỗi trong giai đoạn liên kết, và các mối liên kết sẽ nói, "Hey, bạn gọi một GetString chức năng đó là trong thư viện CS50. " "Bạn nói với tôi đó là trong thư viện CS50, và tôi không thể tìm thấy mã cho nó." Đó là nơi mà bạn có để liên kết nó, và đó là riêng biệt từ một lỗi biên dịch bởi vì trình biên dịch là nhìn vào cú pháp và các loại công cụ. Đó là tốt để biết những gì đang xảy ra khi. Những thứ khác để biết về. Tôi sẽ nói bạn chắc chắn muốn có một cái nhìn ngắn trên typecasting thực hiện bởi Jordan để hiểu những gì ints dưới mui xe, những ký tự nằm dưới mui xe. Khi chúng ta nói về ASCII và chúng tôi thực sự nhìn vào bảng mã ASCII, đó là làm cho chúng ta một dưới cái nhìn mui xe làm thế nào máy tính thực sự đại diện cho vốn A và 7 chữ số và một dấu phẩy và dấu một câu hỏi. Máy tính cũng có những cách đặc biệt để đại diện cho số 7 là một số nguyên. Nó có một cách đặc biệt để đại diện cho số 7 là một số điểm nổi, và những người rất khác nhau. Typecasting là làm thế nào bạn cho máy tính "Này, tôi muốn bạn chuyển đổi từ một trong những đại diện khác đại diện. " Tại sao chúng ta không có một cái nhìn ở đó. Tôi cũng sẽ có một cái nhìn ngắn vào thư viện và ngắn trên trình biên dịch. Những người nói về quá trình biên dịch, một thư viện, và đi qua một số câu hỏi mà bạn có thể nhận được yêu cầu. Các câu hỏi về vật chất 1 Tuần? Có bất kỳ chủ đề nào ở đây mà có vẻ khó khăn bạn muốn để trang trải? Tôi đang cố gắng để thổi thông qua hầu hết các chủ đề này trước đó để chúng tôi có thể nhận được con trỏ và làm một ít đệ quy. Suy nghĩ? Bất cứ điều gì để trang trải? Thời gian cho một số sô cô la có thể? Các bạn đang làm việc thông qua nó. Tôi sẽ tiếp tục nhấm nháp cà phê của tôi. Tuần 2. Cuộc gọi, cuộc gọi tốt. Tuần 2 chúng tôi nói chuyện hơn một chút về chức năng. Trong bộ vấn đề đầu tiên chúng tôi đã không thực sự viết bất kỳ chức năng ở tất cả các khác hơn có chức năng nào? [Sinh viên] Main >> Main, chính xác. Và vì vậy chúng tôi đã nhìn thấy những bộ trang phục khác nhau mà chính mặc. Có mà trong đó không có đối số, và chúng tôi chỉ nói rằng khoảng trống giữa các dấu ngoặc đơn, và sau đó có một trong những khác mà chúng ta muốn đối số dòng lệnh, và như chúng ta đã thấy, đó là nơi bạn có int argc và chuỗi mảng argv hay bây giờ mà chúng tôi đã thực sự tiếp xúc với chuỗi là char * rằng đó là chúng ta sẽ bắt đầu viết nó như là char * argv và sau đó dấu ngoặc. Trong 3 Set vấn đề, bạn nhìn thấy một loạt các chức năng, và bạn thực hiện một loạt các chức năng, vẽ, nhìn lên, tranh giành. Các nguyên mẫu tất cả được viết cho bạn. Những gì tôi muốn nói chuyện về ở đây với các chức năng thực sự nhanh chóng là có 3 phần cho họ bất cứ khi nào bạn viết một chức năng. Bạn phải xác định kiểu trả về của hàm. Bạn phải xác định một tên định chức năng, nhiệm vụ, và sau đó bạn phải chỉ rõ danh sách đối số hoặc danh sách các tham số. Ví dụ, nếu tôi được viết một chức năng để tổng hợp một loạt các số nguyên và sau đó trở về tôi tổng hợp những gì sẽ là kiểu của tôi trở lại nếu tôi muốn tổng hợp số nguyên và sau đó trả lại số tiền? Sau đó, tên của hàm. Nếu tôi đi về tương lai và màu xanh lá cây, phần này là kiểu trả về. Phần này là tên. Và sau đó ở giữa dấu ngoặc đơn là nơi mà tôi cung cấp cho các đối số, thường được viết tắt là args, đôi khi được gọi là params cho các thông số. Và nếu bạn có, bạn chỉ cần chỉ định một. Nếu bạn có nhiều bạn tách mỗi một bằng dấu phẩy. Và cho mỗi đối số bạn cung cấp cho nó 2 điều mà-Kevin? [Kevin] Bạn có để cung cấp cho các loại và sau đó tên. Và sau đó tên, và tên là tên mà bạn đang sử dụng để tham khảo lập luận rằng trong phạm vi chức năng tổng hợp, trong phạm vi chức năng mà bạn đang viết. Bạn không cần phải ví dụ, nếu tôi sẽ tổng hợp, nói, một mảng các số nguyên we'll làm mảng int, và tôi sẽ cung cấp cho bản thân mình một số dấu ngoặc nhọn sau đó khi tôi vượt qua một mảng chức năng tổng hợp Tôi vượt qua nó ở vị trí đầu tiên của danh sách đối số. Nhưng các mảng mà tôi vượt qua trong không có có arr tên. Arr là có được tôi đề cập đến lý luận rằng trong cơ thể của các chức năng. Một thứ khác mà chúng ta cần phải đưa vào tài khoản, và điều này là hơi khác nhau từ các chức năng, nhưng tôi nghĩ rằng đó là một điểm quan trọng, là trong C khi tôi đang viết một chức năng như thế này làm thế nào để tôi biết nhiều yếu tố trong mảng này? Đây là phần nào của một câu hỏi trick. Chúng tôi đã nói chuyện về việc này một chút trong phần cuối cùng của tuần. Làm thế nào để biết số lượng các yếu tố bên trong một mảng trong C? Có cách nào không? Nó chỉ ra rằng không có cách nào để biết. Bạn phải vượt qua nó một cách riêng biệt. Có một thủ thuật mà bạn có thể làm nếu bạn đang ở trong cùng một chức năng, trong đó mảng đã được khai báo, và bạn đang làm việc với một mảng ngăn xếp. Nhưng điều đó chỉ hoạt động nếu bạn đang trong cùng chức năng. Một khi bạn vượt qua một mảng chức năng khác hoặc nếu bạn đã khai báo một mảng và bạn đặt mà mảng trên heap, bạn đã sử dụng malloc  và đó là loại công cụ, sau đó tất cả các cược đang tắt. Sau đó, bạn thực sự có để vượt qua xung quanh một đối số đặc biệt hoặc tham số khác nói cho bạn mảng lớn như thế nào. Trong trường hợp này, tôi muốn sử dụng một dấu phẩy - Tôi xin lỗi, nó sẽ tắt màn hình ở đây và tôi muốn vượt qua trong đối số khác  và gọi nó là int len ​​cho chiều dài. Một điều mà có thể đi lên trên quiz yêu cầu bạn viết hoặc thực hiện một chức năng cụ thể được gọi là một cái gì đó. Nếu chúng ta không cung cấp cho bạn các mẫu thử nghiệm, do đó, toàn bộ điều này ở đây, đống lộn xộn này được gọi là khai báo hàm hoặc mẫu thử nghiệm chức năng, đây là một trong những điều đầu tiên mà bạn sẽ muốn để móng tay xuống nếu nó không được cho bạn ngay lập tức trên các bài kiểm tra. Thủ thuật khác mà tôi đã học được là nói rằng chúng tôi cung cấp cho bạn một nguyên mẫu cho một chức năng, và chúng tôi nói, "Này, bạn đã có để viết nó." Bên trong dấu ngoặc nhọn mà bạn có trên quiz nếu bạn nhận thấy rằng có một kiểu trả về và bạn nhận thấy rằng kiểu trả về là một cái gì đó khác hơn là bãi bỏ, điều đó có nghĩa rằng các chức năng không trả lại bất cứ điều gì, sau đó một trong những điều mà bạn chắc chắn muốn làm là viết một số loại tuyên bố trở lại vào cuối của hàm. Quay trở lại, và trong trường hợp này, chúng tôi sẽ đặt một trống vì chúng tôi muốn điền vào chỗ trống. Nhưng điều này khiến bạn suy nghĩ một cách đúng đắn về việc làm thế nào tôi sẽ tiếp cận vấn đề này? Và nó nhắc nhở bạn bạn sẽ phải trả lại một giá trị người gọi của chức năng. Vâng >> [Sinh viên]. Có phong cách áp dụng khi chúng ta đang viết mã trên quiz? Chẳng hạn như thụt đầu dòng và loại thứ >> [Sinh viên] Yeah. Không, không phải là nhiều. Tôi nghĩ rằng rất nhiều-đây là một cái gì đó chúng tôi sẽ làm rõ về bài kiểm tra vào ngày, nhưng thường lo lắng về # bao gồm và rằng loại công cụ, nó là loại bên ngoài. [Sinh viên] bạn cần phải bình luận mã viết tay của bạn? Bạn cần phải bình luận mã viết tay của bạn? Bình luận luôn luôn là tốt nếu bạn đang lo lắng về tín dụng một phần hoặc bạn muốn truyền đạt ý định của bạn để các học sinh lớp. Nhưng tôi, một lần nữa, sẽ làm rõ trên các bài kiểm tra riêng của mình và vào ngày thi đố vui, nhưng tôi không tin rằng bạn sẽ được yêu cầu để viết ý kiến, không có. Thường không, nhưng nó chắc chắn các loại điều bạn có thể truyền đạt ý định của bạn, như "Này, đây là nơi tôi đang đi với nó." Và đôi khi có thể giúp với tín dụng một phần. Cool. Basil. [Basil] sự khác biệt giữa việc khai báo, nói rằng, int lang là gì trong các đối số hoặc các thông số so với khai báo một biến trong phạm vi chức năng? Wow, cà phê đi xuống khí quản. Basil] Cũng giống như những điều chúng ta muốn đặt trong lập luận. Vâng, đó là một câu hỏi lớn. Làm thế nào để bạn lựa chọn những gì những thứ bạn muốn đặt trong các đối số so với những gì điều bạn nên làm bên trong của hàm? Trong trường hợp này, chúng tôi bao gồm cả hai như là đối số bởi vì họ là một cái gì đó rằng bất cứ ai sẽ sử dụng chức năng tổng hợp cần phải xác định những điều đó. Các chức năng tổng hợp, giống như chúng ta đã nói, không có cách nào để biết lớn như thế nào mảng là nó được từ người gọi hoặc bất cứ ai đang sử dụng chức năng tổng hợp. Nó không có cách nào biết mảng đó lớn như thế nào. Lý do chúng tôi vượt qua trong chiều dài này ngay tại đây như một tham số bởi vì đó là một cái gì đó về cơ bản chúng ta đang nói với người gọi của chức năng, bất cứ ai sử dụng chức năng tổng hợp, "Hey, không chỉ làm bạn có để cung cấp cho chúng tôi một mảng ints, bạn cũng phải cho chúng tôi biết làm thế nào các mảng lớn mà bạn đã ban cho chúng ta. " Basil] Những người sẽ được cả hai đối số dòng lệnh? Không, đây là đối số thực tế rằng bạn sẽ vượt qua chức năng. Hãy để tôi làm một trang mới đây. [Basil] Giống như tên sẽ vượt qua [Nate H. Nếu tôi có int main (void), và tôi sẽ đặt trong 0 trở lại của tôi xuống đây ở phía dưới, và nói rằng tôi muốn gọi hàm tổng. Tôi muốn nói int x = sum (); Để sử dụng chức năng tổng hợp, tôi phải vượt qua trong cả hai mảng mà tôi muốn tổng hợp và chiều dài của mảng, do đó, đây là nơi mà giả sử tôi có một mảng ints, nói rằng tôi đã có int numbaz [] = 1, 2, 3, loại sử dụng hack lên đúng cú pháp, sau đó những gì tôi sẽ làm là tóm tôi sẽ muốn vượt qua trong cả hai numbaz và số 3 nói với chức năng tổng hợp "rồi, đây là mảng tôi muốn bạn tổng hợp." "Đây là kích thước của nó." Điều đó làm cho tinh thần? Điều đó trả lời câu hỏi của bạn? Trong nhiều cách nó không song song những gì chúng tôi đang làm với chính khi chúng ta có các đối số dòng lệnh. Một chương trình như Caesar cipher, ví dụ, cần đối số dòng lệnh sẽ không thể làm bất cứ điều gì. Nó sẽ không biết làm thế nào để mã hóa nếu bạn không nói với nó những gì quan trọng để sử dụng hoặc nếu bạn không nói cho nó chuỗi bạn muốn mã hóa. Khiến cho đầu vào, đây là nơi mà chúng tôi đã có 2 cơ chế khác nhau đầu vào từ người dùng, để lấy thông tin từ người sử dụng. Cho vấn đề là Set 1, chúng ta đã thấy getInt này, GetString, cách GetFloat khiến cho đầu vào, và đó được gọi là bằng cách sử dụng các dòng đầu vào tiêu chuẩn. Nó hơi khác nhau. Đó là một cái gì đó mà bạn có thể làm cùng một lúc như trái ngược với khi bạn gọi các chương trình, khi bạn bắt đầu chương trình đang chạy. Tất cả các đối số dòng lệnh được quy định cụ thể khi bạn bắt đầu chạy chương trình. Chúng tôi đã pha trộn hai của những người. Khi chúng ta sử dụng đối số đến một chức năng, nó giống như các đối số dòng lệnh chính. Đó là khi bạn gọi các chức năng bạn cần để cho nó chính xác những gì nó cần để thực hiện nhiệm vụ của mình. Một điều tốt để xem xét, và tôi sẽ cho bạn nhìn vào nó trong thời gian rảnh rỗi của bạn, và nó đã được bao gồm trong các bài kiểm tra là khái niệm phạm vi này và các biến địa phương so với các biến toàn cầu. Do chú ý đó. Bây giờ chúng ta đang nhận được vào các công cụ này khác, trong tuần 3, chúng tôi bắt đầu nói về tìm kiếm và phân loại. Tìm kiếm và phân loại, ít nhất là trong CS50, là rất nhiều một giới thiệu về một số trong những phần lý thuyết của khoa học máy tính. Các vấn đề của tìm kiếm, vấn đề phân loại là lớn, các vấn đề kinh điển. Làm thế nào để bạn tìm thấy một số lượng cụ thể trong một mảng tỷ số nguyên? Làm thế nào để bạn tìm thấy một tên cụ thể bên trong một cuốn sách điện thoại được lưu trữ trên máy tính xách tay của bạn? Và vì vậy chúng tôi giới thiệu khái niệm về thời gian chạy tiệm cận để thực sự định lượng bao lâu, khó khăn thế nào những vấn đề, bao lâu họ thực hiện để giải quyết. , Tôi tin rằng, bài kiểm tra năm 2011, có một vấn đề mà tôi nghĩ rằng giá trị bao gồm rất nhanh chóng, đó là này, vấn đề 12. O không có, nó là Omega. Ở đây chúng ta đang nói về thời gian chạy nhanh nhất có thể cho một thuật toán cụ thể và sau đó chạy thời gian chậm nhất có thể. Này Omega và O là thực sự chỉ là các phím tắt. Họ là những phím tắt ký hiệu để nói nhanh như thế nào trong trường hợp tốt nhất có thể chạy thuật toán của chúng tôi, và thuật toán của chúng tôi sẽ chạy chậm trong trường hợp xấu nhất có thể như thế nào? Hãy làm một vài trong số này, và chúng cũng được bảo hiểm trong ngắn trên ký hiệu tiệm cận, mà tôi đánh giá cao đề nghị. Jackson đã làm một công việc thực sự tốt. Với tìm kiếm nhị phân, chúng ta nói về tìm kiếm nhị phân là một thuật toán, và chúng ta thường nói về nó trong các điều khoản của lớn O. O lớn là gì? Thời gian chạy chậm nhất có thể tìm kiếm nhị phân là gì? [Sinh viên] N ²? Đóng cửa, tôi đoán tương tự như. Đó là nhanh hơn rất nhiều hơn thế. [Sinh viên] Binary >> Vâng, tìm kiếm nhị phân. [Sinh viên] log n. Đăng nhập n, do đó, những gì không đăng nhập n có nghĩa là? Nó nửa mỗi lần lặp. Chính xác, do đó, trong trường hợp chậm nhất có thể, nói rằng nếu bạn có một mảng được sắp xếp của một triệu số nguyên và số lượng bạn đang tìm kiếm hoặc là yếu tố đầu tiên trong mảng hoặc phần tử cuối cùng trong mảng. Hãy nhớ rằng, các thuật toán tìm kiếm nhị phân hoạt động bằng cách nhìn vào các yếu tố trung lưu, nhìn thấy nếu đó là trận đấu mà bạn đang tìm kiếm. Nếu có, sau đó tuyệt vời, bạn thấy nó. Trong trường hợp tốt nhất có thể, không tìm kiếm nhị phân chạy nhanh như thế nào? [Sinh viên] 1. 1, nó là hằng số thời gian, O lớn của 1. Yeah. [Sinh viên] Tôi có một câu hỏi. Khi bạn nói đăng nhập của n, bạn có nghĩa là đối với cơ sở 2, phải không? Có, vì vậy đó là điều khác. Chúng ta nói n log, và tôi đoán khi tôi còn học trung học Tôi luôn luôn giả định rằng bản ghi là 10 cơ sở. Yeah, vì vậy có, đăng nhập cơ sở 2 thường là những gì chúng tôi sử dụng. Một lần nữa, sẽ trở lại tìm kiếm nhị phân, nếu bạn đang tìm kiếm cho một trong hai phần tử ở cuối hoặc phần tử ở đầu rất, bởi vì bạn bắt đầu ở giữa và sau đó bạn loại bỏ tùy theo điều kiện nào 1/2 không đáp ứng được các tiêu chí mà bạn đang tìm kiếm, và bạn đi đến nửa rưỡi tiếp theo tiếp theo và một nửa sau. Nếu tôi đang tìm kiếm các yếu tố lớn nhất trong mảng số nguyên triệu Tôi sẽ giảm một nửa đăng nhập 1 triệu lần trước khi cuối cùng tôi đã kiểm tra và thấy rằng các phần tử tôi đang tìm kiếm là lớn nhất trong chỉ số cao nhất của mảng, và nó sẽ đưa log n, đăng nhập 1 triệu lần. Bong bóng sắp xếp. Bạn có nhớ các thuật toán sắp xếp bong bóng? Kevin, bạn có thể cung cấp cho tôi một bản tóm tắt nhanh chóng của những gì đã xảy ra trong các thuật toán sắp xếp bong bóng? [Kevin] Về cơ bản nó đi qua tất cả mọi thứ trong danh sách. Nó nhìn đầu tiên hai. Nếu một trong những đầu tiên là lớn hơn so với cái thứ hai nó hoán đổi chúng. Sau đó, nó so sánh điều, thứ hai và thứ ba cùng, hoán đổi, thứ ba và thứ tư, tất cả các con đường xuống. Lớn hơn con số sẽ theo dõi đến cùng. Và sau khi vòng tuy nhiên nhiều người bạn đang làm. Chính xác, do đó, những gì Kevin nói rằng chúng tôi sẽ xem lớn hơn con số bong bóng lên đến cuối mảng. Ví dụ, bạn có tâm đi bộ chúng tôi thông qua các ví dụ này nếu điều này là mảng của chúng tôi? [Kevin] Bạn sẽ mất 2 và 3. 3 là lớn hơn 2, do đó, bạn trao đổi chúng. [Nate H. phải, vì vậy chúng tôi trao đổi này, và do đó, chúng tôi nhận được 2, 3, 6, 4, và 9. [Kevin] Sau đó bạn so sánh 3 và 6. 3 là nhỏ hơn 6, do đó, bạn để lại cho họ, và 6 và 4, bạn muốn trao đổi chúng vì 4 là nhỏ hơn 6. [Nate H.] Quyền, do đó tôi nhận được 2, 3, 4, 6, 9. [Kevin] Và 9 là lớn hơn 6, vì vậy bạn rời khỏi nó. Và bạn muốn quay trở lại thông qua nó một lần nữa. [Nate H.] Tôi thực hiện vào thời điểm này? >> [Kevin] số Và tại sao tôi không được thực hiện vào thời điểm này? Bởi vì nó trông giống như mảng của tôi được sắp xếp. Tôi đang nhìn vào nó. [Kevin] Đi qua nó một lần nữa và chắc chắn rằng có những giao dịch hoán đổi không trước khi bạn hoàn toàn có thể dừng lại. Chính xác, vì vậy bạn cần tiếp tục đi qua và chắc chắn rằng không có giao dịch hoán đổi bạn có thể làm vào thời điểm này. Đó là thực sự chỉ là may mắn, như bạn nói, mà chúng ta đã kết thúc chỉ có làm cho 1 đi qua và chúng tôi đang sắp xếp. Nhưng để làm điều này trong trường hợp chung, chúng tôi thực sự sẽ phải làm điều này hơn và hơn nữa. Và trên thực tế, đây là một ví dụ về trường hợp tốt nhất có thể, như chúng ta đã thấy vấn đề này. Chúng tôi thấy rằng trường hợp tốt nhất có thể được n. Chúng tôi đã đi qua thời gian 1 mảng. Trường hợp xấu nhất có thể cho thuật toán này là gì? [Kevin] N ². Và những gì mà nhìn như thế nào? Một cái nhìn mảng sẽ như thế sẽ mất thời gian ² n? [Kevin] [không nghe được sắp xếp. Chính xác, do đó, nếu tôi đã có các mảng 9, 7, 6, 5, 2, đầu tiên 9 bong bóng tất cả các con đường lên. Sau 1 lặp đi lặp lại, chúng tôi muốn có 7, 6, 5, 2, 9. Thì 7 sẽ bong bóng lên, 6, 5, 2, 7, 9, và vv và vv. Chúng tôi phải đi qua toàn bộ mảng n lần, và bạn thực sự có thể nhận được hơn một chút chính xác hơn này bởi vì một khi chúng tôi đã di chuyển trong 9 tất cả các cách vào vị trí có thể có của nó. chúng ta biết rằng chúng ta không bao giờ có để so sánh với phần tử đó một lần nữa. Một khi chúng ta bắt đầu sủi bọt trong 7 chúng ta biết rằng chúng ta có thể dừng lại một khi 7 ngay trước khi các 9 kể từ khi chúng tôi đã so sánh 9 đến nó. Nếu bạn làm điều này một cách thông minh, nó không phải là thực sự, tôi đoán, có nhiều thời gian. Bạn sẽ không so sánh tất cả có thể không nghe được] kết hợp mỗi lần duy nhất bạn đi qua mỗi lần lặp. Tuy nhiên, vẫn còn, khi chúng ta nói về điều này trên ràng buộc chúng ta nói rằng bạn đang tìm kiếm tại n ² so sánh tất cả các cách thức thông qua. Hãy quay trở lại, và kể từ khi chúng tôi đang bắt đầu để có được một chút ngắn về thời gian Tôi sẽ nói bạn chắc chắn nên đi qua phần còn lại của bảng này, điền vào nó tất cả ra ngoài. Hãy suy nghĩ của các ví dụ. Hãy suy nghĩ của các ví dụ cụ thể. Đó là thực sự tiện dụng và hữu ích để làm. Vẽ nó ra. Đây là loại bảng khi bạn đi qua trong lĩnh vực khoa học máy tính bạn thực sự nên bắt đầu để biết những trái tim bằng. Đây là loại câu hỏi mà bạn nhận được trong các cuộc phỏng vấn. Đây là những loại những điều tốt để biết, và suy nghĩ về những trường hợp cạnh đó, thực sự tìm ra làm thế nào để suy nghĩ về biết rằng cho bong bóng sắp xếp các mảng tồi tệ nhất có thể để sắp xếp với đó là một trong đó là theo thứ tự ngược. Con trỏ. Hãy nói một chút về con trỏ. Trong những phút cuối, chúng tôi có ở đây Tôi biết đây là một cái gì đó cùng với tập tin I / O còn khá mới mẻ. Khi chúng ta nói về con trỏ là lý do chúng ta muốn nói về con trỏ là bởi vì, một, khi chúng tôi đang làm việc trong C chúng tôi thực sự ở mức khá thấp so với hầu hết các ngôn ngữ lập trình hiện đại. Chúng tôi thực sự có thể thao tác các biến trong bộ nhớ, tìm ra nơi mà họ đang thực sự nằm trong bộ nhớ RAM của chúng tôi. Khi bạn đã đi vào học các lớp hệ điều hành bạn sẽ thấy rằng đó là, một lần nữa, loại một trừu tượng. Đó không phải là thực sự là trường hợp. Chúng tôi đã có bộ nhớ ảo ẩn những chi tiết từ chúng tôi. Nhưng bây giờ bạn có thể giả định rằng khi bạn có một chương trình, ví dụ, khi bạn bắt đầu chạy chương trình mật mã Caesar của bạn Tôi sẽ chuyển đổi trở lại iPad của tôi thực sự nhanh chóng chương trình của bạn khi bắt đầu, nếu bạn có, nói, 4 GB bộ nhớ RAM trên máy tính xách tay của bạn, bạn được đặt sang một bên đoạn này, và chúng tôi sẽ gọi đây là bộ nhớ RAM. Và nó bắt đầu ở một nơi chúng ta sẽ gọi 0, và nó kết thúc ở một nơi mà chúng ta sẽ gọi 4 gigabyte. Tôi thực sự không thể viết. Người đàn ông, đó là tấn công. Khi chương trình của bạn thực hiện hệ điều hành khắc RAM, và nó xác định các phân đoạn khác nhau cho các phần khác nhau của chương trình của bạn. Xuống đây khu vực này là của một vùng đất không có người đàn ông. Khi bạn đi lên xa hơn một chút ở đây bạn đã thực sự nơi mã cho chương trình của bạn sống. Đó là mã nhị phân thực tế, đó là tập tin thực thi thực sự được nạp vào bộ nhớ khi bạn chạy một chương trình, và nó sống trong các đoạn mã. Và khi chương trình của bạn thực hiện các bộ vi xử lý xem xét đoạn mã này để tìm ra các lệnh tiếp theo là gì? Dòng tiếp theo của mã tôi cần phải thực hiện là gì? Ngoài ra còn có một phân đoạn dữ liệu, và đây là nơi mà những người hằng chuỗi được lưu trữ mà bạn đã sử dụng. Và sau đó xa hơn nữa nơi này được gọi là đống. Chúng tôi truy cập vào bộ nhớ trong đó bằng cách sử dụng malloc, và sau đó về phía đầu của chương trình của bạn có ngăn xếp, và đó là nơi chúng tôi đã được chơi cho hầu hết đầu. Đây không phải là quy mô hay bất cứ điều gì. Rất nhiều trong số này là rất phụ thuộc vào máy, hệ điều hành phụ thuộc, nhưng điều này là tương đối những thứ như thế nào chửi rủa lên. Khi bạn chạy một chương trình và bạn khai báo một biến gọi là x- Tôi sẽ rút ra một hộp bên dưới, và điều này là có được RAM là tốt. Và tôi sẽ xem xét. Chúng tôi sẽ vẽ các đường lởm chởm để cho biết đây chỉ là một phần nhỏ của RAM và không phải tất cả của nó như chúng ta rút ra ở đầu trang. Nếu tôi tuyên bố một biến số nguyên được gọi là x, sau đó những gì tôi thực sự có được một bản đồ được lưu trữ trong bảng biểu tượng của chương trình của tôi kết nối x tên cho vùng này của bộ nhớ mà tôi đã rút ra ngay tại đây giữa các thanh dọc. Nếu tôi có một dòng mã trong chương trình của tôi nói rằng x = 7 bộ xử lý biết "Ồ, được rồi, tôi biết rằng x sống tại vị trí này trong bộ nhớ." "Tôi sẽ đi trước và viết một 7". Làm thế nào để biết vị trí này là trong bộ nhớ? Vâng, đó là tất cả được thực hiện tại thời gian biên dịch. Trình biên dịch sẽ chăm sóc của bố trí nơi mỗi biến sẽ đi và tạo ra một bản đồ đặc biệt hay đúng hơn là kết nối các dấu chấm giữa một biểu tượng và sẽ đi đâu, tên của một biến và nơi mà nó sẽ sống trong bộ nhớ. Nhưng nó quay ra rằng chúng tôi thực sự có thể truy cập nó trong các chương trình của chúng tôi là tốt. Điều này trở nên quan trọng khi chúng tôi bắt đầu nói chuyện về một số cấu trúc dữ liệu, đó là một khái niệm mà chúng tôi sẽ giới thiệu sau. Nhưng bây giờ, những gì bạn có thể biết là tôi có thể tạo một con trỏ đến vị trí này, x. Ví dụ, tôi có thể tạo ra một biến con trỏ. Khi chúng ta tạo một biến con trỏ, chúng tôi sử dụng các ký hiệu ngôi sao. Trong trường hợp này, điều này nói tôi sẽ tạo ra một con trỏ đến một int. Đó là một loại giống như bất kỳ khác. Chúng tôi cung cấp cho nó một biến như y, và sau đó chúng tôi thiết lập nó bằng với địa chỉ, địa chỉ. Trong trường hợp này, chúng ta có thể thiết lập y để trỏ đến x bằng cách lấy địa chỉ của x, mà chúng ta làm với ký hiệu này, và sau đó chúng tôi thiết lập y để trỏ đến nó. Điều này về cơ bản không có gì nếu chúng ta nhìn vào bộ nhớ RAM của chúng tôi điều này tạo ra một biến riêng biệt. Nó sẽ gọi nó là y, và khi dòng này của mã thực thi nó thực sự sẽ tạo ra một con trỏ ít mà chúng tôi thường vẽ như một mũi tên, và nó đặt y để trỏ đến x. Vâng. [Sinh viên] Nếu x là một con trỏ, bạn sẽ chỉ cần làm int * y = x thay vì có dấu "và"? Vâng. Nếu x là một con trỏ, sau đó bạn có thể thiết lập 2 con trỏ bình đẳng với nhau, trong trường hợp đó y sẽ không trỏ đến x, nhưng nó sẽ trỏ đến bất cứ điều gì x được trỏ đến. Thật không may, chúng tôi hết thời gian. Những gì tôi sẽ nói vào thời điểm này, chúng ta có thể nói về ẩn này, nhưng tôi sẽ nói bắt đầu làm việc thông qua vấn đề này, # 14. Bạn có thể thấy đã có một chút điền vào cho bạn ở đây. Bạn có thể thấy rằng khi chúng ta khai báo 2 con trỏ, int * x * y, và lưu ý chỉ * bên cạnh các biến là một cái gì đó đã được thực hiện năm ngoái. Nó chỉ ra rằng điều này là tương tự như những gì chúng tôi đang làm trong năm nay. Nó không quan trọng nơi bạn viết * khi bạn khai báo con trỏ. Nhưng chúng tôi đã viết bên cạnh các loại * bởi vì điều đó làm cho nó rất rõ ràng rằng bạn đang khai báo một biến con trỏ. Bạn có thể thấy rằng tuyên bố 2 con trỏ cho chúng ta 2 hộp. Ở đây khi chúng ta thiết lập x bằng malloc điều này nói là thiết lập bộ nhớ lưu trữ trong heap. Hộp nhỏ này ngay tại đây, vòng tròn này, nằm trên heap này. X được trỏ đến nó. Lưu ý rằng y vẫn không trỏ đến bất cứ điều gì. Để có được bộ nhớ lưu trữ 42 số vào x chúng ta sẽ sử dụng ký hiệu không? [Sinh viên] * x = 42. Chính xác, * x = 42. Điều đó có nghĩa là theo các mũi tên và ném 42 trong đó. Ở đây, nơi chúng tôi đặt y và x, chúng tôi đã y chỉ x. Một lần nữa, điều này giống như những gì Kevin nói nơi chúng tôi thiết lập y bằng x. Y không chỉ vào x. Thay vào đó, nó trỏ đến những gì x được trỏ đến là tốt. Và cuối cùng trong hộp cuối cùng có 2 điều có thể mà chúng ta có thể làm. Một là chúng ta có thể nói * x = 13. Điều khác là chúng ta có thể nói Alex, bạn có biết những gì chúng tôi có thể làm ở đây? Bạn có thể nói * x = 13 hoặc [Sinh viên] Bạn có thể nói bất cứ điều gì int. [Nate H.] Nếu điều này được gọi là một biến int, chúng ta có thể làm điều đó. Chúng tôi cũng có thể nói * y = 13 bởi vì họ đang cả hai chỉ đến cùng một nơi, vì vậy chúng tôi có thể sử dụng một trong hai biến để đến đó. Vâng >> [Sinh viên]. Nó sẽ trông như thế nào nếu chúng ta chỉ nói int x là 13? Điều đó sẽ được tuyên bố một biến mới tên là x, mà sẽ không làm việc. Chúng tôi muốn có một vụ va chạm vì chúng ta khai báo x là một con trỏ lên ở đây. [Sinh viên] Nếu chúng ta chỉ có rằng tuyên bố của chính nó những gì nó sẽ giống như thế về của vòng tròn? Nếu chúng ta có x = 13 sau đó chúng tôi muốn có một hộp, và thay vì có một mũi tên ra khỏi hộp, chúng tôi rút ra nó như là một 13. [Sinh viên] Trong hộp thoại này. Okay. Cảm ơn bạn đã xem, và may mắn trên quiz 0. [CS50.TV]