[Powered by Google Translate] [Walkthrough - Vấn đề Set 2] [Zamyla Chan - Đại học Harvard] [Đây là CS50. CS50.TV] Được rồi. Xin chào, tất cả mọi người, và được chào đón để Walkthrough 2. Trước tiên, tôi muốn chúc mừng bạn đã hoàn thành pset 1. Tôi biết rằng nó có thể có được một chút khó khăn cho một số bạn, có thể là chương trình đầu tiên máy tính của bạn mà bạn đã viết, nhưng chỉ cần nhớ rằng vào cuối này, khi bạn nhìn lại vào cuối học kỳ, bạn sẽ nhìn pset 1 và bạn sẽ nói, "Hey, tôi có thể đã làm điều đó trong 5 phút." Vì vậy, biết và tin tưởng rằng vào cuối này, bạn chắc chắn sẽ tìm thấy pset 1 khá đơn giản. Nhưng bây giờ nó là một thành tựu rất lớn, và chúc mừng cho việc thực hiện. Bây giờ, cũng là một lưu ý nhanh chóng trước khi chúng tôi nhận được vào thịt của hương. Tôi chỉ muốn làm cho một lưu ý nhanh chóng mà tôi đôi khi sẽ không có đủ thời gian trong walkthroughs đi qua mọi cách duy nhất để làm bộ vấn đề và thay vì chỉ có thể tập trung vào 1 hoặc 2 loại hiện thực, cách mà bạn có thể làm điều này. Nhưng đó không phải là để nói rằng bạn bị cấm không được làm việc đó một cách khác. Có thường xuyên, như với khoa học máy tính, nhiều cách để làm việc, và vì vậy chắc chắn cảm thấy miễn phí để sử dụng một loại khác nhau của các giải pháp hơn là tôi có thể trình bày. [Pset 2: Crypto - Zamyla Chan - zamyla@cs50.net] [Pset2 - 0. Một phần của câu hỏi - 1. Caesar - 2. Vigenere] Được rồi. Vì vậy, vấn đề thiết lập 2 Crypto là một niềm vui. Một lần nữa, với mỗi pset bạn sẽ bắt đầu với một phần của câu hỏi đó là sẽ được tiến hành trong các phần của bạn với giáo viên giảng dạy được giao của bạn. Chúng tôi sẽ không phải đi qua những hơn walkthrough, nhưng họ chắc chắn sẽ giúp bạn hoàn thành pset. Vì vậy, phần đầu tiên của bộ vấn đề là Caesar. Và như vậy trong Caesar ai đó sẽ vượt qua bạn một chìa khóa bằng một số nguyên, và bạn sẽ mã hóa một chuỗi văn bản mà họ cung cấp cho bạn và cung cấp cho họ lại là một điều được mã hóa. Nếu bất cứ ai xem A Christmas Story, có một ví dụ rằng có. Sau đó, phần thứ hai của bộ vấn đề là Vigenere, đó là một kỹ thuật mã hóa tiên tiến hơn. Và vì vậy chúng ta sẽ để encipher một đoạn văn bản, ngoại trừ thay vì với chỉ một số nguyên duy nhất, chúng ta đang thực sự sẽ mã hóa nó với một từ khóa mà người sử dụng sẽ cung cấp cho chúng tôi. Được rồi, do đó, công cụ đầu tiên trong ngày hôm nay hộp công cụ thực sự sẽ được cập nhật thiết bị. Trên các diễn đàn thảo luận, chúng ta sẽ thấy những thứ như: "Tại sao không làm việc này?" "Tại sao không nộp 50 công việc?" và thường là giải pháp thực sự là chỉ để cập nhật thiết bị của bạn. Và vì vậy nếu bạn chỉ chạy trong một cửa sổ terminal sudo thiết bị của bạn yum-y - đó là một lá cờ khẳng định là có, cập nhật tất cả mọi thứ - cập nhật, sau đó thiết bị của bạn sẽ cập nhật nếu cần thiết. Và nó không đau, nếu bạn đã có phiên bản mới nhất của thiết bị. Sau đó, nó sẽ chỉ nói không có bản cập nhật mới có sẵn và bạn có thể tiếp tục làm việc cùng. Nhưng điều này là tốt để thực hiện ngay cả mỗi khi bạn mở thiết bị bởi vì chúng ta vẫn còn rất nhiều - đôi khi nếu chúng ta đi vào một lỗi - sửa chữa nó trong thiết bị. Vì vậy, hãy chắc chắn rằng bạn có phiên bản mới nhất của thiết bị và chạy mà cập nhật có. Được rồi. Vì vậy, kể từ khi chúng tôi đang làm việc với các chữ cái và thay đổi, enciphering điều, chúng ta sẽ thực sự muốn trở thành người bạn tốt nhất với các biểu đồ ASCII của chúng tôi. Có rất nhiều những trực tuyến, nếu bạn tìm thấy. Thậm chí có thể làm của riêng bạn. Về cơ bản, với mỗi chữ và số hàng và mỗi nhân vật có một số liên kết với chúng, và vì thế rất tốt để xem các giá trị ASCII của họ cùng với các thư thực tế. Điều đó chắc chắn sẽ giúp bạn trong vấn đề thiết lập. Một điều mà thực sự đã giúp tôi trong vấn đề thiết lập này là thực sự in nó ra, và như tôi đã đi qua, tôi thực sự sẽ thu hút vào nó, viết, "Nếu điều này để đi đến đó, sau đó ..." Loại vẽ vào nó và đánh dấu nó lên, trở thành người bạn tốt nhất với bảng mã ASCII của bạn. Sau đó, chúng tôi có một vài công cụ khác lúc xử lý của chúng tôi. Lần này thay vì thực sự khiến người sử dụng cho tất cả các đầu vào của họ chúng ta sẽ làm một sự kết hợp. Chúng tôi sẽ nhắc cho một số đầu vào, nhưng chúng tôi cũng sẽ chỉ cần sử dụng các đối số dòng lệnh. Vì vậy, khi họ chạy chương trình của họ, thường là bạn nói / hello, ví dụ, nếu chương trình của bạn là hello.c. Nhưng lần này thay vì chỉ nói rằng, họ có thể đặt từ, lập luận sau đó. Và vì vậy chúng ta sẽ sử dụng bất cứ điều gì họ vượt qua cho chúng ta như là đầu vào của họ cũng, để di chuyển vượt ra ngoài chỉ khiến cho số nguyên, nhưng cũng bằng cách sử dụng các đối số dòng lệnh. Và sau đó chúng tôi sẽ đi vào mảng và chuỗi, mà chúng ta sẽ được sử dụng rất là tốt. Dưới đây chỉ là một ví dụ của 1 biểu đồ ASCII nhỏ. Như tôi đã nói, mỗi chữ tương ứng với một số, và để làm quen với điều đó. Nó sẽ có ích. Và sau đó khi chúng tôi bắt đầu làm một số ASCIIMath đối phó với những con số - cộng, trừ họ - sau đó chắc chắn tốt để tham khảo bảng xếp hạng này. Vì vậy, đây là một ví dụ của một mật mã Caesar - một cái gì đó mà bạn có thể đã chơi với. Nó chỉ là một bánh xe. Về cơ bản, một bảng chữ cái bên ngoài và sau đó có một bảng chữ cái bên trong. Vì vậy, ngay ở đây là một ví dụ về mật mã Caesar nhưng với một phím từ 0. Về cơ bản, phù hợp với A, B phù hợp với B, tất cả các con đường lên đến Z. Nhưng sau đó nói rằng chúng tôi muốn một chìa khóa 3, ví dụ. Sau đó, chúng tôi sẽ xoay bánh xe bên trong để phù hợp với D, vv Và do đó, điều này về cơ bản là những gì chúng ta sẽ làm. Chúng tôi không có một bánh xe, nhưng những gì chúng ta sẽ làm là làm cho chương trình của chúng tôi loại thay đổi bảng chữ cái cùng với chúng tôi một số tiền nhất định các con số. Vì vậy, như tôi đã nói, chúng ta sẽ được giao dịch với đối số dòng lệnh cũng như nhận được một số nguyên. Vì vậy, cách mà một người dùng sẽ chạy chương trình của bạn Caesar bằng cách nói / caesar và sau đó nhập một số sau đó. Và con số đó đại diện cho chìa khóa, thay đổi, bao nhiêu lần bạn sẽ được quay bánh xe bên trong của mật mã Caesar của bạn. Và để bạn nhìn thấy ở đây một ví dụ. Nếu chúng tôi đã nhập các chữ cái từ A L để bằng khoá mật mã Caesar của chúng tôi, sau đó nó sẽ nhập D qua O bởi vì đó là tất cả các bức thư chuyển hơn 3 lần, giống như ví dụ của bánh xe mà tôi đã giới thiệu cho các bạn. Vì vậy, sau đó nếu bạn đã nhập vào, ví dụ, Đây là CS50! sau đó nó cũng sẽ di chuyển tất cả các chữ cái. Và đó là một điều quan trọng trong cả hai Caesar và Vigenere rằng chúng ta sẽ bỏ qua bất cứ lá thư nào không. Vì vậy, bất kỳ không gian, nhân vật, vv, số, chúng ta sẽ để giữ cho chúng giống nhau. Chúng tôi sẽ chỉ chuyển đổi các ký tự trong trường hợp này. Vì vậy, như bạn thấy trong bánh xe, chúng tôi chỉ có các chữ cái có sẵn cho chúng tôi, vì vậy chúng tôi chỉ muốn thay đổi các chữ cái và mã hóa các chữ cái. Vì vậy, điều đầu tiên cần làm, bạn đã thấy rằng việc sử dụng cho Caesar trong vấn đề thiết lập 2 là chạy Caesar và sau đó nhập một số khi bạn chạy nó trong thiết bị đầu cuối. Vì vậy, những gì chúng ta cần làm là bằng cách nào đó nhận được rằng chìa khóa và truy cập nó. Và vì vậy chúng tôi muốn bằng cách nào đó nó sẽ là đối số dòng lệnh thứ hai. Người đầu tiên là có được / caesar., Và một trong những tiếp theo sẽ là phím số. Vì vậy, trước khi chúng tôi đã có int main (void) để bắt đầu các chương trình C của chúng tôi. Chúng tôi sẽ để một lớp vỏ trở lại một chút và thực sự thấy rằng thay vì đi qua trong khoảng trống chức năng chính của chúng tôi chúng tôi đang thực sự đối phó với 2 thông số. Chúng tôi có một int có tên là argc và sau đó một mảng của chuỗi được gọi là argv. Vì vậy, argc là một số nguyên, và nó đại diện cho số lượng các đối số được truyền vào chương trình của bạn. Và sau đó argv thực sự là danh sách các đối số được truyền. Tất cả các đối số là chuỗi, và như vậy argv đại diện cho một mảng, một danh sách, các chuỗi. Chúng ta hãy nói về mảng một chút. Mảng là bản chất là một cấu trúc dữ liệu mới. Chúng tôi có ints, chúng tôi đã tăng gấp đôi, chúng tôi có các chuỗi, và bây giờ chúng tôi có mảng. Mảng là cấu trúc dữ liệu có thể chứa nhiều giá trị cùng loại, Vì vậy, về cơ bản, một danh sách của bất cứ điều gì bạn muốn loại. Về cơ bản, nếu bạn muốn có một danh sách các số nguyên tất cả trong 1 biến, sau đó bạn sẽ tạo ra một biến mới đó là mảng kiểu int. Vì vậy, mảng là zero-lập chỉ mục, có nghĩa rằng các phần tử đầu tiên của mảng là chỉ số 0. Nếu mảng có chiều dài 4, như trong ví dụ này, sau đó yếu tố cuối cùng của bạn sẽ là tại chỉ số 3, đó là 4 - 1. Vì vậy, để tạo ra mảng, bạn sẽ làm một cái gì đó như thế này. Giả sử bạn muốn có một mảng đôi. Điều này đi cho bất kỳ loại kiểu dữ liệu, mặc dù. Vì vậy, nói bạn muốn có một mảng đôi. Giả sử bạn muốn gọi nó là hộp thư. Giống như bạn sẽ khởi tạo bất kỳ đôi khác, bạn sẽ nói đôi và sau đó tên, nhưng lần này chúng tôi đặt các dấu ngoặc vuông, và sau đó là số sẽ có độ dài của mảng. Lưu ý trong mảng, chúng ta có thể không bao giờ thay đổi chiều dài, vì vậy bạn luôn phải xác định và lựa chọn bao nhiêu hộp, bao nhiêu giá trị mảng của bạn sẽ tổ chức. Vì vậy, để thiết lập các giá trị khác nhau trong mảng của bạn, bạn sẽ sử dụng cú pháp sau đây, như bạn thấy trên slide. Chỉ số 0 hộp thư bạn có sẽ được thiết lập đến 1,2, hộp thư chỉ số 1 thiết lập để 2,4, vv Vì vậy, bây giờ mà chúng tôi đã xem xét các mảng một chút, chúng ta hãy quay trở lại argc và argv. Chúng tôi biết rằng argv bây giờ là một mảng của chuỗi. Vì vậy, khi người dùng đi - nói rằng họ đang chạy một chương trình - họ nói. / hello David Malan, chương trình sẽ làm cho bạn đã thực sự đến với những gì argc và argv là. Vì vậy, bạn không cần phải lo lắng về điều đó. Argc trong trường hợp này sẽ là 3 bởi vì nó thấy 3 từ riêng biệt bằng dấu cách. Và như vậy thì mảng trong trường hợp này, chỉ số đầu tiên sẽ là / hello, một David, một trong những Malan. Có ai nhìn thấy ngay lập tức những gì các mối quan hệ giữa argv,  mảng, và argc? Yeah. Chúng tôi sẽ nhận được vào đó trong một ví dụ trong args.c. Hãy xem nếu chúng ta có thể tận dụng lợi thế của các mối quan hệ giữa 2. Ở đây bạn có thể thấy rằng trong thiết bị ứng dụng mặc định mở các tập tin c. đôi khi Emacs. Nhưng chúng tôi muốn để đối phó với gedit, do đó, những gì bạn có thể làm là bạn có thể nhấp chuột phải vào tập tin C của bạn, vào Properties, Open With, và sau đó chọn gedit, Đặt làm mặc định, và bây giờ chương trình của bạn nên mở trong gedit thay vì của Emacs. Hoàn hảo. Vì vậy, ở đây tôi có một chương trình mà tôi muốn in ra mỗi đối số dòng lệnh. Vì vậy, người sử dụng đầu vào bất cứ điều gì, tôi muốn để cơ bản trở lại nó trở lại chúng trên một dòng mới. Vì vậy, một cấu trúc mà chúng ta có thể sử dụng để lặp qua một cái gì đó là những gì - một cái gì đó mà bạn có thể sử dụng trong pset 1 của bạn? Nếu bạn muốn đi qua một số thiết lập của sự vật? >> [Sinh viên] Đối với loop. Đối với loop. Chính xác. Vì vậy, chúng ta hãy bắt đầu với vòng lặp for. Chúng tôi có cho int i = 0. Hãy bắt đầu ngay với một biến khởi tạo tiêu chuẩn. Tôi sẽ để lại những điều kiện cho một bộ và sau đó nói i + +, sẽ làm những điều đó. Được rồi. Vì vậy, suy nghĩ lại argv, nếu argv là danh sách các đối số được truyền vào chương trình và argc là số lượng các đối số trong chương trình, thì đó có nghĩa rằng argc cơ bản là chiều dài của argv, phải, bởi vì có đang có được nhiều như các đối số là giá trị của argc. Vì vậy, nếu chúng ta muốn để lặp lại trên mỗi phần tử trong argv, chúng ta sẽ muốn cho mỗi thời gian truy cập vào các biến trong argv tại chỉ số nhất định. Điều đó có thể được đại diện với điều này, phải không? Biến này ở đây đại diện cho chuỗi cụ thể trong trường hợp này bởi vì đó là một mảng chuỗi chuỗi cụ thể tại đó chỉ số nhất định. Những gì chúng tôi muốn làm, trong trường hợp này, chúng tôi muốn in nó ra, vì vậy chúng ta hãy nói printf. Và bây giờ argv là một chuỗi, vì vậy chúng tôi muốn đặt giữ chỗ đó có. Chúng tôi muốn có một dòng mới chỉ để làm cho nó trông tốt. Vì vậy, ở đây chúng tôi có một vòng lặp cho. Chúng tôi không có điều kiện được nêu ra. Vì vậy, tôi bắt đầu từ 0, và sau đó mỗi khi nó sẽ in các chuỗi cung cấp lúc đó chỉ số cụ thể trong mảng. Vì vậy, khi nào chúng ta muốn in ra các phần tử trong mảng? Khi chúng tôi đã hoàn tất, phải không? Khi chúng ta đã đến cuối của mảng. Vì vậy, chúng tôi không muốn vượt qua chiều dài của mảng, và chúng ta đã biết chúng tôi không cần phải thực sự tích cực tìm ra chiều dài của argv bởi vì nó được ban cho chúng ta, và đó là những gì? Argc. Chính xác. Vì vậy, chúng tôi muốn làm con số này argc quá trình lần. Tôi không ở trong thư mục bên phải. Được rồi. Bây giờ chúng ta hãy làm args. Không có lỗi, đó là rất tốt. Vì vậy, chúng ta hãy chỉ chạy args. Này là những gì sẽ trở lại với chúng ta? Nó chỉ là sẽ in lại. "Bạn inputted args vào chương trình, tôi sẽ để cho nó trở về với bạn." Vì vậy, hãy nói rằng chúng tôi muốn nói args sau đó foo bar. Vì vậy, sau đó nó in nó ra lại cho chúng tôi. Tất cả phải không? Vì vậy, có một ví dụ về làm thế nào bạn có thể sử dụng argc và argv biết rằng argc đại diện cho chiều dài của argv. Hãy chắc chắn rằng bạn không bao giờ với mảng truy cập vượt quá chiều dài của mảng bởi vì C chắc chắn sẽ hét vào bạn. Bạn sẽ nhận được một cái gì đó được gọi là một lỗi phân khúc, bao giờ vui vẻ, về cơ bản nói rằng bạn đang cố gắng để truy cập vào một cái gì đó điều đó không tồn tại, không thuộc về bạn. Vì vậy, chắc chắn, và đặc biệt là với việc lập chỉ mục bằng không, chúng tôi không muốn - Giống như ví dụ, nếu chúng ta có một mảng có chiều dài 4, rằng chỉ số mảng 4 không tồn tại bởi vì chúng tôi bắt đầu từ 0, không chỉ số. Nó sẽ trở thành bản chất thứ hai giống như cho các vòng lặp khi chúng tôi bắt đầu từ 0. Vì vậy, chỉ cần giữ cho rằng trong tâm trí. Bạn không muốn bao giờ truy cập vào các chỉ số của một mảng đó là vượt quá tầm tay của bạn. Vì vậy, chúng ta có thể thấy bây giờ làm thế nào chúng ta có thể loại truy cập đối số dòng lệnh được thông qua. Tuy nhiên, như bạn đã thấy các chuỗi, argv thực sự là một mảng chuỗi. Vì vậy, nó thực sự không phải là một số nguyên nào được nêu ra, nhưng Caesar, chúng tôi muốn để đối phó với số nguyên. May mắn thay, có một chức năng được tạo ra cho chúng ta thực sự có thể chuyển đổi một chuỗi đến một số nguyên. Cũng ở đây, chúng tôi không phải đối phó với đầu vào của người sử dụng, nơi chúng tôi đang thúc đẩy họ cho đầu vào đây để chìa khóa, vì vậy chúng tôi có thể không thực sự nhắc nhở lại và nói, "Oh, cho tôi một số nguyên khác, nói rằng, nếu nó không hợp lệ." Nhưng chúng ta vẫn cần phải kiểm tra để sử dụng chính xác. Trong Caesar, họ chỉ được phép để vượt qua trong số 1, và vì vậy họ phải chạy / caesar. và sau đó họ có để cung cấp cho bạn một số. Vì vậy, argc có được một số lượng nhất định. Những gì số đó sẽ là nếu họ có để vượt qua bạn / caesar. Và sau đó một phím? Argc là gì? >> [Sinh viên] 2. >> Hai. Chính xác. Vì vậy, bạn muốn làm cho chắc chắn rằng argc là 2. Nếu không, bạn về cơ bản từ chối để chạy chương trình. Trong chính nó là một chức năng nói rằng int main, do đó, sau đó chúng tôi luôn luôn trong 0 tốt trở lại thực hành ở phần cuối của một chương trình thành công. Vì vậy, nếu nói, họ cung cấp cho bạn 3 đối số dòng lệnh thay vì 2 hoặc cung cấp cho bạn 1, ví dụ, sau đó những gì bạn sẽ làm là bạn sẽ muốn kiểm tra cho rằng và sau đó trở về 1 nói rằng, không có, tôi không thể tiến hành với chương trình này. [Sinh viên] Không thể có một không gian trong văn bản của bạn. >> Xin lỗi? [Sinh viên] Không thể có một không gian trong văn bản mà bạn đang cố gắng để mã hóa. Ah! Trong điều khoản của các văn bản mà chúng tôi đang cố gắng để mã hóa, mà thực sự đến sau khi chúng tôi cung cấp cho văn bản đó. Vì vậy, ngay bây giờ chúng tôi chỉ chấp nhận như là đối số lệnh số thực tế, sự chuyển đổi thực tế cho các mã hóa Caesar. [Sinh viên] Tại sao bạn cần 2 như trái ngược với argc 1 chỉ? Có chắc chắn là số 1. Đúng. Lý do tại sao chúng ta cần 2 cho argc thay vì 1 bởi vì khi bạn chạy một chương trình và nói. / caesar hoặc / hello. mà thực sự có giá trị như một đối số dòng lệnh. Vì vậy, sau đó đã chiếm 1 và sau đó chúng tôi đang nhập thêm 1. Vì vậy, bạn nhập vào một chuỗi trong đối số dòng lệnh. Những gì bạn muốn làm, cho Caesar chúng tôi muốn để đối phó với một số nguyên, vì vậy bạn có thể sử dụng chức năng này atoi. Và về cơ bản, bạn vượt qua nó trong một chuỗi và sau đó nó sẽ đưa bạn trở lại một số nguyên nếu nó có thể để làm cho rằng chuỗi thành một số nguyên. Bây giờ hãy nhớ khi chúng ta đang đối phó với những điều printf hay GetString, như thế, chúng tôi bao gồm các thư viện được cụ thể cho chúng tôi. Vì vậy, ngay từ đầu, chúng tôi bắt đầu với một cái gì đó tag băm I / O, h, tiêu chuẩn như thế. Vâng, atoi không phải là trong một trong những thư viện, vì vậy những gì chúng ta phải làm là chúng ta phải bao gồm các thư viện cho rằng. Vì vậy, nhớ lại trở lại Walkthrough 1 nơi tôi đã thảo luận chức năng hướng dẫn sử dụng. Bạn gõ người đàn ông trong thiết bị đầu cuối của bạn và sau đó tiếp theo là tên của một hàm. Và đó sẽ mang đến một danh sách toàn bộ cách sử dụng của nó, nhưng cũng như nó sẽ mang đến thư viện mà thuộc về. Vì vậy, tôi sẽ để lại cho bạn để sử dụng chức năng hướng dẫn sử dụng với atoi và tìm ra thư viện mà bạn cần bao gồm có thể sử dụng chức năng atoi. Vì vậy, chúng tôi đã có chìa khóa và bây giờ nó để nhận được các văn bản đơn giản, và do đó thực sự là có được người dùng nhập vào nơi mà bạn nhắc nhở. Chúng tôi xử lý với getInt và GetFloat, và do đó trong cùng một tĩnh mạch chúng ta sẽ được giao dịch với GetString. Nhưng trong trường hợp này, chúng tôi không cần phải làm bất cứ do khi hoặc trong khi vòng lặp để kiểm tra. GetString chắc chắn sẽ cho chúng ta một chuỗi, và chúng ta sẽ mã hóa bất cứ điều gì người sử dụng cung cấp cho chúng ta. Vì vậy, bạn có thể giả định rằng tất cả những chuỗi người dùng nhập vào là chính xác. Lớn. Vì vậy, sau đó một khi bạn đã có chìa khóa và một khi bạn đã có các văn bản, bây giờ những gì còn lại là bạn phải để encipher bản rõ. Chỉ cần để nhanh chóng bao gồm theo biệt ngữ, rõ là những gì người dùng cung cấp cho bạn, và bản mã là những gì bạn trả lại cho họ. Vì vậy, chuỗi, để có thể đi qua thực sự thư bằng thư bởi vì chúng tôi phải chuyển tất cả thư, chúng tôi hiểu rằng chuỗi, nếu chúng ta loại vỏ lớp trở lại, chúng ta thấy rằng họ chỉ thực sự là một danh sách các ký tự. Một đi kèm sau khi khác. Và vì vậy chúng tôi có thể điều trị chuỗi như mảng, vì họ là mảng ký tự. Vì vậy, nói rằng bạn có một chuỗi văn bản có tên là, và trong đó văn bản biến được lưu trữ Đây là CS50. Sau đó, văn bản chỉ số 0 sẽ là một T vốn, chỉ số 1 sẽ là h, vv Và sau đó với mảng, trong ví dụ argc trong args.c, chúng tôi thấy rằng chúng tôi đã phải lặp qua một mảng và vì vậy chúng tôi đã để lặp từ i = 0 cho đến khi tôi là ít hơn chiều dài. Vì vậy, chúng tôi cần một số cách để tìm ra chiều dài của chuỗi ký tự của chúng tôi là những gì nếu chúng ta để iterate qua nó. May mắn một lần nữa, có một chức năng đó cho chúng tôi, mặc dù sau này trong CS50 bạn chắc chắn sẽ có thể thực hiện và làm cho chức năng của riêng bạn có thể tính toán chiều dài của một chuỗi. Nhưng bây giờ chúng ta sẽ sử dụng chiều dài chuỗi, do đó strlen. Bạn vượt qua trong một chuỗi, và sau đó nó sẽ trả về cho bạn một int đại diện cho chiều dài của chuỗi của bạn. Hãy nhìn vào một ví dụ về làm thế nào chúng ta có thể lặp qua mỗi nhân vật trong một chuỗi và làm điều gì đó với điều đó. Những gì chúng tôi muốn làm là lặp qua mỗi nhân vật của chuỗi, và những gì chúng tôi muốn làm là chúng tôi in lại mỗi nhân vật 1 của 1 ngoại trừ chúng tôi thêm một cái gì đó bên cạnh nó. Vì vậy, chúng ta hãy bắt đầu với vòng lặp for. Int i = 0. Chúng tôi sẽ để lại không gian cho tình trạng này. Chúng tôi muốn để lặp lại cho đến khi chúng tôi đạt được kết thúc của chuỗi, phải không? Vì vậy, sau đó những gì chức năng cho chúng ta chiều dài của chuỗi? [Không nghe được sinh viên phản ứng] Đó là chiều dài của các đối số dòng lệnh. Nhưng đối với một chuỗi chúng ta muốn sử dụng một chức năng mà cho chúng ta chiều dài của chuỗi. Vì vậy, đó là chuỗi dài. Và như vậy thì bạn phải vượt qua trong một chuỗi cho nó. Nó cần phải biết chuỗi nó cần phải tính toán chiều dài. Vì vậy, sau đó trong trường hợp này, chúng tôi đang làm việc với chuỗi s. Lớn. Vì vậy, sau đó những gì chúng tôi muốn làm, chúng ta hãy printf. Bây giờ, chúng tôi muốn để đối phó với các nhân vật. Chúng tôi muốn in ra mỗi nhân vật cá nhân. Khi bạn muốn nó để in ra một phao, bạn sẽ sử dụng giữ chỗ như f%. Với một int, bạn sẽ sử dụng% d. Và tương tự như vậy, với một nhân vật bạn sử dụng c% nói rằng tôi sẽ được in một nhân vật được lưu trữ bên trong một biến. Vì vậy, chúng tôi có điều này, và chúng ta hãy thêm một khoảng thời gian và không gian cho nó. Nhân vật mà chúng ta sử dụng? Chúng tôi sẽ được sử dụng bất kỳ hình thức nào chúng ta đang ở của chuỗi. Vì vậy, sau đó chúng ta sẽ được sử dụng một cái gì đó với chuỗi, nhưng chúng tôi muốn được truy cập vào nhân vật nào đó có. Vì vậy, nếu một chuỗi chỉ là một mảng, sau đó làm thế nào để chúng ta truy cập phần tử của mảng? Chúng tôi có những dấu ngoặc vuông, và sau đó chúng tôi đặt các chỉ số trong đó. Vì vậy, chúng tôi có dấu ngoặc vuông. Chỉ mục của chúng tôi trong trường hợp này, chúng tôi chỉ có thể sử dụng i. Chính xác. Vì vậy, ở đây chúng ta đang nói rằng chúng tôi đang đi để được in một ký tự tiếp theo là một dấu chấm và một không gian, và rằng nhân vật là có được ký tự thứ i trong chuỗi s của chúng tôi. Tôi chỉ cần đi để tiết kiệm mà. Okay. Bây giờ tôi sẽ chạy chiều dài chuỗi. Vì vậy, chúng tôi đã có một chuỗi được gọi là OMG, và bây giờ nó nhấn mạnh nhiều hơn. Tương tự như vậy, chúng ta hãy nói rằng chúng tôi thực sự muốn để có được một chuỗi từ người sử dụng. Làm thế nào chúng ta có thể làm điều này? Trước đây, làm thế nào chúng ta có được một int? Chúng tôi nói getInt, phải không? Nhưng điều này không phải là int, vì vậy hãy GetString. Hãy làm cho chiều dài chuỗi. Ở đây chúng tôi không nhập một gợi ý cụ thể. Vì vậy, tôi không biết. Tôi sẽ đặt tên của tôi ở đây và vì vậy sau đó tôi có thể làm một trong những điều nơi mà tôi chỉ định một từ cho mỗi lá thư hoặc một cái gì đó như thế. Cool. Vì vậy, đó là chuỗi dài. Vì vậy, chúng tôi đang trở lại Caesar. Chúng tôi có một vài công cụ về làm thế nào chúng ta lặp qua một chuỗi, làm thế nào chúng ta truy cập mỗi yếu tố cá nhân. Vì vậy, bây giờ chúng tôi có thể quay lại vào chương trình. Như tôi đã đề cập trước đây, trong bảng mã ASCII, người bạn tốt nhất của bạn, bạn sẽ nhìn thấy các con số được liên kết với mỗi thư. Vì vậy, ở đây nói rõ chúng tôi là tôi chóng mặt! Sau đó, mỗi người trong số những nhân vật này sẽ có một số lượng và giá trị ASCII liên kết với nó, ngay cả những dấu nháy đơn, ngay cả không gian, ngay cả những dấu chấm than, vì vậy bạn sẽ muốn giữ cho rằng trong tâm trí. Vì vậy, nói chính của chúng tôi là người sử dụng bao gồm trong đối số dòng lệnh của họ là 6. Điều đó có nghĩa là chữ cái đầu tiên, đó là cái ta, là đại diện của 73, bạn muốn trả lại cho họ bất cứ điều gì thư được đại diện bởi giá trị ASCII của 73 + 6. Trong trường hợp này, đó sẽ là 79. Bây giờ chúng tôi muốn đi đến ký tự tiếp theo. Vì vậy, tiếp theo trong chỉ số 1 của bản rõ sẽ là dấu nháy đơn. Nhưng hãy nhớ rằng chúng ta chỉ muốn encipher các chữ cái. Vì vậy, chúng tôi muốn chắc chắn rằng dấu lược thực sự vẫn như nhau, rằng chúng ta không thay đổi từ 39 đến bất cứ điều gì 45. Chúng tôi muốn giữ nó như là một dấu nháy đơn. Vì vậy, chúng tôi muốn ghi nhớ chỉ encipher các chữ cái bởi vì chúng tôi muốn tất cả những biểu tượng khác vẫn không thay đổi trong chương trình của chúng tôi. Một điều mà chúng tôi muốn là để bảo tồn vốn. Vì vậy, khi bạn có một ký tự hoa, nó phải ở lại như là một chữ hoa. Lowercases nên ở lại như là chữ thường. Vì vậy, một số chức năng hữu ích để có thể để đối phó với các chữ cái chỉ enciphering và tiếp tục bảo tồn vốn điều isalpha, isupper, chức năng islower. Và vì vậy đây là những chức năng mà trả lại cho bạn một giá trị Boolean. Về cơ bản, đúng hay sai. Một chữ hoa? Chữ số này? Thư, về cơ bản. Vì vậy, đây là 3 ví dụ về cách bạn sẽ sử dụng chức năng. Về cơ bản, bạn có thể kiểm tra xem giá trị trả lại cho bạn bởi chức năng đó là đúng hay sai dựa trên đầu vào đó. Hoặc là làm một cái gì đó không encipher, cơ yếu hoặc làm cho chắc chắn rằng đó là chữ hoa, vv [Sinh viên] bạn chỉ có thể giải thích những người hơn một chút và bạn sử dụng chúng như thế nào? >> Yeah, cho chắc chắn. Vì vậy, nếu chúng ta nhìn lại, ở đây chúng tôi có một số vốn tôi, phải không? Vì vậy, chúng tôi biết rằng tôi đi đến O vì tôi + 6 là O. Nhưng chúng tôi muốn chắc chắn rằng O sẽ là một vốn O. Vì vậy, về cơ bản, đó là sẽ thay đổi đầu vào của chúng tôi. Vì vậy, cho dù đó là chữ hoa hay không sẽ loại thay đổi cách mà chúng ta đối phó với nó. Vì vậy, sau đó nếu chúng ta sử dụng chức năng isupper trên rằng chỉ số cụ thể, để isupper ("I"), trả về cho chúng ta sự thật, vì vậy chúng tôi biết rằng đó là trên. Vì vậy, sau đó trên cơ sở đó, sau này chúng ta sẽ đi vào một công thức là bạn sẽ được sử dụng để thay đổi mọi thứ trong Caesar, như vậy thì về cơ bản, có sẽ là một công thức hơi khác nhau nếu nó là chữ hoa như trái ngược với thành chữ thường. Có ý nghĩa? Yeah. Không có lo lắng. Tôi đã nói chuyện một chút về thêm 6 một lá thư, không hoàn toàn có ý nghĩa trừ khi chúng tôi loại hiểu rằng những nhân vật này là loại hoán đổi cho nhau với số nguyên. Những gì chúng tôi làm là chúng ta loại đúc sử dụng tiềm ẩn. Tôi sẽ đi vào đúc một chút sau đó vào nơi bạn có một giá trị và biến nó thành một loại khác nhau hơn so với ban đầu là. Nhưng với pset này, chúng tôi sẽ có thể loại thay thế cho nhau sử dụng các ký tự và tương ứng với giá trị số nguyên. Vì vậy, nếu bạn chỉ đơn giản là bọc lấy một nhân vật chỉ với các dấu nháy đơn, sau đó bạn sẽ có thể làm việc với nó với số nguyên, đối phó với nó là một số nguyên. Vì vậy, các C vốn liên quan đến 67. F chữ thường liên quan đến 102. Một lần nữa, nếu bạn muốn biết những giá trị này, nhìn vào bảng mã ASCII của bạn. Vì vậy, chúng ta hãy đi vào một số ví dụ về cách bạn có thể có thể trừ và thêm, làm thế nào bạn có thể thực sự thực sự làm việc với những nhân vật này, sử dụng chúng thay thế cho nhau. Tôi nói rằng ASCIIMath được để tính toán bổ sung của một nhân vật đến một số nguyên và sau đó hiển thị các ký tự kết quả cũng như các giá trị kết quả ASCII. Và vì vậy ở đây tôi đang nói đến - we'll đối phó với phần này sau đó - nhưng về cơ bản, tôi nói rằng người dùng nên nói ASCIIMath chạy cùng với một phím, và tôi nói rằng mà quan trọng là có được số lượng mà chúng ta sẽ thêm nhân vật này. Vì vậy, ở đây nhận thấy rằng kể từ khi tôi đòi hỏi một phím, kể từ khi tôi yêu cầu họ cho tôi 1 điều, Tôi chỉ muốn chấp nhận / asciimath. Và một phím. Vì vậy, tôi sẽ yêu cầu rằng argc bằng 2. Nếu nó không phải, sau đó tôi sẽ trở về 1 và chương trình sẽ thoát. Vì vậy, tôi nói chính là sẽ không phải là đối số dòng lệnh đầu tiên, nó sẽ là thứ hai, và như bạn thấy ở đây, Tôi sẽ biến chúng thành một số nguyên. Sau đó, tôi sẽ thiết lập một nhân vật được r. Chú ý rằng các loại của chr biến là một số nguyên. Cách mà tôi có thể sử dụng r là một số nguyên bằng cách bọc nó với những dấu nháy đơn. Vì vậy, sao tuyên bố printf của chúng tôi, nơi chúng tôi có một giữ chỗ cho một nhân vật và sau đó là một giữ chỗ cho một số nguyên, nhân vật này được đại diện bởi chr, và số nguyên là chìa khóa. Và như vậy thì chúng ta sẽ trong kết quả thêm 2 lại với nhau. Vì vậy, chúng ta sẽ để thêm r + bất cứ điều gì quan trọng là, và sau đó chúng ta sẽ in kết quả đó. Vì vậy, chúng ta hãy làm asciimath. Đến nay, vì vậy hãy chỉ cần chạy asciimath. Ồ, nhưng nhìn thấy, nó không làm bất cứ điều gì vì chúng tôi không thực sự cung cấp cho nó một phím. Vì vậy, khi vừa trở về 1, chức năng chính của chúng tôi, nó chỉ quay trở lại với chúng ta. Vì vậy, sau đó để vượt qua trong một chìa khóa. Ai đó đưa cho tôi một số. >> [Sinh viên] 4. 4. Okay. Vì vậy, r tăng 4 được sẽ để cho chúng ta v, tương ứng với giá trị ASCII của 118. Vì vậy, sau đó nó loại làm cho cảm giác rằng - Thực ra, tôi có thể hỏi bạn, những gì bạn nghĩ rằng giá trị ASCII của r là nếu r + 4 là 118? Sau đó, yeah, r là 114. Vì vậy, nếu bạn nhìn vào bảng ASCII sau đó, chắc chắn, bạn sẽ thấy r được thể hiện bởi 114. Vì vậy, bây giờ chúng ta biết rằng chúng ta có thể thêm các số nguyên với các nhân vật, điều này có vẻ khá đơn giản. Chúng tôi chỉ để lặp lại một chuỗi như chúng ta đã thấy trong một ví dụ trước. Chúng tôi sẽ kiểm tra nếu nó là một lá thư. Nếu có, sau đó chúng tôi sẽ thay đổi nó bằng bất kỳ phím nào. Khá đơn giản, trừ khi bạn nhận được như thế này, bạn thấy rằng z, đại diện 122, sau đó sẽ cung cấp cho bạn một nhân vật khác. Chúng tôi thực sự muốn ở lại trong bảng chữ cái của chúng tôi, phải không? Vì vậy, chúng ta cần phải tìm ra một số cách để loại gói xung quanh. Khi bạn đạt đến Zed và bạn muốn tăng một số lượng nhất định, bạn không muốn đi vào vượt ra ngoài phần bảng chữ cái ASCII; bạn muốn để bọc lại tất cả các cách để A. Nhưng hãy nhớ bạn vẫn còn bảo tồn các trường hợp. Vì vậy, biết rằng chữ cái không thể trở thành biểu tượng giống như biểu tượng sẽ không được thay đổi là tốt. Trong pset cuối cùng, bạn chắc chắn không cần phải, nhưng là một lựa chọn là thực hiện pset tham lam của bạn bằng cách sử dụng chức năng modulus. Nhưng bây giờ chúng tôi đang thực sự sẽ cần phải sử dụng mô đun, vì vậy chúng ta hãy đi qua này một chút một chút. Về cơ bản, khi bạn có x modulo y, cung cấp cho bạn phần còn lại của x chia cho y. Dưới đây là một số ví dụ ở đây. Chúng tôi có 27% 15. Về cơ bản, khi bạn trừ đi 15 từ 27 như nhiều lần nhất có thể mà không nhận được tiêu cực sau đó bạn nhận được 12 trái qua. Vì vậy, đó là loại giống như trong bối cảnh toán học, nhưng làm thế nào chúng ta có thể thực sự sử dụng này? Nó sẽ có ích cho wrapover của chúng tôi. Đối với điều này, chúng ta hãy chỉ nói rằng tôi yêu cầu tất cả các bạn để phân chia thành 3 nhóm. Đôi khi bạn làm điều này trong các nhóm và một cái gì đó như thế. Nói rằng tôi nói: "Được rồi, tôi muốn tất cả các bạn được chia thành 3". Làm thế nào bạn có thể làm điều đó? [Không nghe được sinh viên phản ứng] Yeah, chính xác. Đếm. Okay. Hãy thực sự làm điều đó. Nào bạn muốn để bắt đầu? [Sinh viên, kể] 1, 2, 3, 4. Nhưng hãy nhớ ... >> [Sinh viên] Ồ, xin lỗi. Đó là một điểm thực sự tốt. Bạn nói 4, nhưng chúng tôi thực sự muốn bạn nói 1 bởi vì chúng tôi chỉ muốn 3 nhóm. Vì vậy, sau đó, làm thế nào - Không, đó là một ví dụ thực sự tốt bởi vì sau đó làm thế nào bạn có thể nói 1? Mối quan hệ giữa 4 và 1 là gì? Vâng, 4 mod 3 là 1. Vì vậy, nếu bạn tiếp tục, bạn sẽ là 2. Vì vậy, chúng tôi có 1, 2, 3, 1, 2. Một lần nữa, bạn đang thực sự người thứ 5. Làm thế nào để bạn biết để nói 2 thay vì 5? Bạn nói 5 mod 3 là 2. Tôi muốn xem có bao nhiêu nhóm 3 còn lại, sau đó để am I. Và như vậy sau đó nếu chúng tôi tiếp tục cùng cả căn phòng, sau đó chúng ta sẽ thấy rằng chúng tôi luôn thực sự áp dụng chức năng mod với chính bản thân mình loại đếm. Đó là một loại nhiều ví dụ hữu hình của cách bạn có thể sử dụng modulo bởi vì tôi chắc chắn rằng hầu hết chúng ta có thể trải qua quá trình đó nơi mà chúng tôi đã có để đếm ra. Bất kỳ câu hỏi trên modulo? Nó sẽ là khá quan trọng để hiểu các khái niệm này, vì vậy tôi muốn chắc chắn rằng các bạn hiểu. [Sinh viên] Nếu có còn lại, nó cung cấp cho bạn số lượng thực tế? Nếu một trong 3 đầu tiên của họ đã thực hiện nó, nó sẽ cho họ những gì họ thực sự là, hoặc nó sẽ cho họ không nghe được] >> Đó là một câu hỏi hay. Khi không có còn lại cho modulo - vì vậy nói rằng bạn có 6 mod 3 - mà thực sự cung cấp cho bạn trở lại 0. Chúng ta sẽ nói về điều đó một chút sau đó. Oh yeah, ví dụ, người thứ 3 - 3 mod 3 thực sự là 0, nhưng cô cho biết 3. Vì vậy, đó là loại giống như một catch bên trong, ví dụ, như okay, nếu mod 0 sau đó tôi sẽ là người thứ 3. Nhưng chúng tôi sẽ nhận được vào loại làm thế nào chúng ta có thể muốn để đối phó với những gì 0 là sau đó. Vì vậy, bây giờ chúng tôi bằng cách nào đó có một cách để lập bản đồ các Zed thư. Vì vậy, bây giờ chúng ta đã đi qua những ví dụ, chúng ta thấy Caesar có thể làm việc như thế nào. Bạn thấy 2 bảng chữ cái và sau đó bạn nhìn thấy chúng thay đổi. Vì vậy, hãy cố gắng và thể hiện rằng trong điều khoản của công thức. Công thức này được thực sự trao cho bạn trong spec, nhưng chúng ta hãy xem qua những gì mỗi biến có nghĩa là Kết quả cuối cùng của chúng tôi là có được các bản mã. Vì vậy, điều này nói rằng nhân vật thứ i của các bản mã sẽ tương ứng với ký tự thứ i của bản rõ. Có ý nghĩa bởi vì chúng tôi muốn luôn luôn được xếp hàng những việc này lên. Vì vậy, nó sẽ là nhân vật thứ i cộng với bản mã k, đó là chìa khóa của chúng ta - ý nghĩa - và sau đó chúng ta có mod 26. Hãy nhớ lại khi chúng tôi đã có Zed chúng tôi không muốn để có được vào nhân vật, vì vậy chúng tôi muốn mod nó và loại bọc quanh bảng chữ cái. Sau khi Zed, bạn sẽ đi đến một, b, c, d, cho đến khi bạn có số bên phải. Vì vậy, chúng ta biết rằng Zed, nếu + 6, sẽ cung cấp cho chúng tôi f bởi vì sau khi Zed đến a, b, c, d, e, f. Vì vậy, hãy nhớ là chúng tôi biết chắc chắn rằng Zed + 6 sẽ cung cấp cho chúng tôi f. Trong các giá trị ASCII, z là 122 và f là 102. Vì vậy, chúng ta phải tìm một số cách để làm cho công thức Caesar của chúng tôi cung cấp cho chúng tôi 102 sau khi vào 122. Vì vậy, nếu chúng ta chỉ cần áp dụng công thức này,% ('z' + 6) 26, mà thực sự cung cấp cho bạn 24 vì 122 + 6 là 128; 128% 26 cung cấp cho bạn 24 còn lại. Nhưng điều đó không thực sự có nghĩa là f. Đó chắc chắn không phải 102. Đó cũng không phải là chữ thứ 6 trong bảng chữ cái. Vì vậy, rõ ràng là, chúng ta cần có một số cách tinh chỉnh một chút. Trong điều kiện của bảng chữ cái thông thường, chúng ta biết rằng z là lá thư thứ 26 và f là 6. Nhưng chúng ta đang ở trong khoa học máy tính, do đó, chúng ta sẽ chỉ số 0. Vì vậy, sau đó thay vì z là số 26, chúng ta sẽ nói rằng số của 25 bởi vì một là 0. Vì vậy, bây giờ hãy áp dụng công thức này. Chúng tôi có z đại diện bởi 25 + 6, trong đó cung cấp cho bạn 31. Và 31 mod 26 cung cấp cho bạn 5 như còn lại một. Đó là hoàn hảo bởi vì chúng ta biết rằng f là lá thư thứ 5 trong bảng chữ cái. Nhưng nó vẫn không phải là f, phải không? Nó vẫn không phải là 102. Vì vậy, sau đó cho pset này, một thách thức sẽ được cố gắng tìm ra mối quan hệ giữa chuyển đổi giữa các giá trị ASCII và chỉ số thứ tự chữ cái. Về cơ bản, những gì bạn sẽ muốn làm, bạn muốn bắt đầu với các giá trị ASCII, nhưng sau đó bạn muốn bằng cách nào đó dịch đó vào một chỉ số theo thứ tự abc sau đó tính toán nó phải là những gì thư - về cơ bản, chỉ số chữ cái của nó là gì của các ký tự mật mã - sau đó dịch lại cho rằng các giá trị ASCII. Vì vậy, nếu bạn whip ra bảng mã ASCII của bạn, sau đó thử và tìm thấy mối quan hệ giữa, nói rằng, 102 và 5 hoặc 122 và 25. Chúng tôi đã nhận được chìa khóa của chúng tôi từ các đối số dòng lệnh, chúng tôi đã nhận được các bản rõ, chúng tôi đã enciphered nó. Bây giờ tất cả chúng tôi còn lại để làm là in nó. Chúng ta có thể làm điều này một vài cách khác nhau. Những gì chúng ta có thể làm là thực sự in như chúng tôi đi cùng. Như chúng ta lặp qua các ký tự trong chuỗi, chúng ta có thể chỉ đơn giản là chỉ cần in ngay sau đó khi chúng tôi tính toán nó. Ngoài ra, bạn cũng có thể lưu trữ nó trong một mảng và có một loạt các nhân vật và cuối cùng lặp lại rằng toàn bộ mảng và in ra. Vì vậy, bạn có một vài lựa chọn cho điều đó. Và hãy nhớ rằng% c là có được giữ chỗ cho in một nhân vật. Vì vậy, chúng tôi đã có Caesar, và bây giờ chúng ta chuyển đến Vigenere, mà là rất giống với Caesar nhưng chỉ hơi phức tạp hơn. Vì vậy, về cơ bản với Vigenere bạn sẽ đi qua trong một từ khóa. Vì vậy, thay vì một số, bạn sẽ có một chuỗi, và do đó sẽ hành động như từ khóa của bạn. Sau đó, như thường lệ, bạn sẽ nhận được một nhắc nhở cho một chuỗi từ người sử dụng và sau đó encipher nó và sau đó cung cấp cho họ trở lại bản mã. Vì vậy, như tôi đã nói, nó rất giống với Caesar, ngoại trừ thay vì chuyển một số lượng nhất định, con số này đang thực sự sẽ thay đổi mỗi khi từ nhân vật này đến nhân vật khác. Đại diện cho rằng con số thực tế thay đổi, nó được trình bày bởi các chữ cái của bàn phím. Vì vậy, nếu bạn nhập vào một sự thay đổi của một, ví dụ, sau đó sẽ tương ứng với một sự thay đổi từ 0. Vì vậy, đó là một lần nữa trở lại với chỉ số chữ cái. Những gì có thể có ích nếu bạn nhìn thấy rằng chúng tôi đang thực sự đối phó với các giá trị ASCII cũng như các chữ cái, cũng như chỉ số theo thứ tự abc, có thể tìm thấy hoặc làm cho bảng ASCII của bạn cho thấy các chỉ số theo thứ tự chữ cái 0 đến 25, a đến z, và các giá trị ASCII để bạn có loại có thể thấy mối quan hệ và phác thảo ra và thử và tìm thấy một số mẫu. Tương tự như vậy, nếu bạn đã chuyển đổi ở các trường hợp nhất định f và điều này là một trong hai f chữ thường hoặc chữ hoa thì đó sẽ tương ứng đến 5. Chúng tôi tốt cho đến nay? Công thức cho Vigenere là một chút khác nhau. Về cơ bản, bạn sẽ thấy rằng nó chỉ giống như Caesar, ngoại trừ thay vì chỉ k có k chỉ số j. Chú ý rằng chúng tôi không sử dụng i bởi vì về cơ bản, độ dài của từ khóa không nhất thiết phải là chiều dài của bản mã của chúng tôi. Đây sẽ là một rõ ràng hơn chút khi chúng ta thấy một ví dụ mà tôi có một chút sau này. Về cơ bản, nếu bạn chạy chương trình của bạn với một từ khóa ohai, thì đó có nghĩa là mọi thời gian, ohai là có được sự thay đổi của bạn. Vì vậy, tùy thuộc vào vị trí bạn đang ở trong từ khóa của bạn, bạn đang đi để thay đổi nhân vật nào đó bản mã của bạn bằng số tiền đó. Một lần nữa, giống như Caesar, chúng tôi muốn đảm bảo rằng chúng tôi duy trì mức vốn điều và chúng ta chỉ có chữ encipher, không phải là các ký tự hoặc các không gian. Vì vậy, nhìn lại cho Caesar về chức năng mà bạn có thể sử dụng, cách thức mà bạn đã quyết định làm thế nào để thay đổi mọi thứ, và áp dụng cho chương trình của bạn ở đây. Vì vậy, hãy bản đồ này ra. Chúng tôi có một bản rõ rằng chúng tôi đã nhận được từ người sử dụng từ getString nói ... là CS50! Sau đó, chúng tôi có một từ khoá của ohai. 4 ký tự đầu tiên là khá đơn giản. Chúng tôi biết rằng T sẽ được chuyển bởi o, sau đó h sẽ được chuyển bởi h, tôi sẽ được chuyển bởi một. Ở đây bạn thấy rằng một đại diện cho 0, do đó, sau đó giá trị cuối cùng là thực sự chỉ là cùng một lá thư như trước đây. Sau đó, s là chuyển của tôi. Nhưng sau đó bạn có những khoảng thời gian ở đây. Chúng tôi không muốn để encipher đó, vì vậy sau đó chúng tôi không thay đổi nó bằng bất cứ điều gì và chỉ cần in ra khoảng thời gian không thay đổi. [Sinh viên] Tôi không hiểu làm thế nào bạn biết rằng đây là chuyển - còn bạn thì sao - >> Ồ, xin lỗi. Ở phía trên ở đây, bạn thấy rằng các đối số dòng lệnh ohai đây, đó là sẽ là từ khoá. Và do đó, về cơ bản, bạn đang đi xe đạp trên các ký tự trong từ khóa. [Sinh viên] Vì vậy, o sẽ được chuyển Vì vậy, o tương ứng với một số lượng nhất định trong bảng chữ cái. [Sinh viên] Right. Nhưng nơi mà bạn đã nhận được một phần CS50? Oh. Đó là trong getString nơi bạn đang như thế, "Hãy cho tôi một chuỗi để mã hóa." [Sinh viên] Họ sẽ cung cấp cho bạn rằng đối số thay đổi bởi và sau đó bạn sẽ yêu cầu cho chuỗi đầu tiên của bạn. >> Yeah. Vì vậy, khi chạy chương trình, họ sẽ bao gồm các từ khóa trong đối số dòng lệnh của họ khi họ chạy nó. Sau đó, một khi bạn đã kiểm tra rằng họ đã thực sự cho bạn 1 và không nhiều hơn, không ít hơn, sau đó bạn sẽ để nhắc nhở cho một chuỗi, nói rằng, "Hãy cho tôi một chuỗi." Vì vậy, đó là nơi mà trong trường hợp này họ đã đưa cho bạn này ... là CS50! Vì vậy, sau đó bạn sẽ sử dụng nó và sử dụng ohai và duyệt qua. Chú ý rằng ở đây chúng tôi bỏ qua mã hóa các thời kỳ, nhưng về vị trí của chúng tôi cho ohai, tiếp theo, chúng tôi sử dụng o. Trong trường hợp này đó là một chút khó nhìn thấy bởi vì đó là 4, do đó, chúng ta hãy tiếp tục một chút. Chỉ gắn bó với tôi ở đây. Sau đó, chúng tôi có i và s, sau đó được dịch bởi o và h tương ứng. Sau đó, chúng tôi có một không gian, và do đó, sau đó chúng tôi biết rằng chúng tôi sẽ không để encipher không gian. Nhưng chú ý rằng thay vì đi đến một chỗ này ngay tại đây, chúng tôi đang mã hóa bởi một - Tôi không biết nếu bạn có thể thấy rằng ngay tại đây. Vì vậy, nó không giống như bạn thực sự được xác định trước, nói, o đi ở đây, h đi ở đây, đi ở đây, tôi đi đây, o, h, a, i, o, h, một, tôi. Bạn không làm điều đó. Bạn chỉ thay đổi vị trí của bạn trong từ khóa khi bạn biết rằng bạn đang thực sự sẽ được mã hóa một bức thư thực tế. Loại đó có ý nghĩa? Okay. Vì vậy, chỉ một số nhắc nhở. Bạn muốn đảm bảo rằng bạn chỉ tạm ứng cho chữ cái tiếp theo trong từ khóa của bạn nếu nhân vật trong bản rõ của bạn là một lá thư. Vì vậy, nói chúng ta đang ở o. Chúng tôi nhận thấy rằng nhân vật tiếp theo, chỉ số i của bản rõ, là một con số, ví dụ. Sau đó, chúng tôi không tiến j, chỉ số cho từ khóa của chúng tôi, cho đến khi chúng ta đạt được một lá thư khác. Một lần nữa, bạn cũng muốn làm cho chắc chắn rằng bạn wraparound đầu của từ khóa khi bạn đang ở phần cuối của nó. Nếu bạn thấy ở đây chúng tôi đang ở tôi, một trong những kế tiếp có được o. Vì vậy, bạn muốn tìm một số cách có thể để wraparound đến đầu của từ khóa của bạn mỗi khi bạn đạt được kết thúc. Và như vậy một lần nữa, những gì loại của nhà điều hành là hữu ích trong trường hợp đó, để gói xung quanh? Giống như trong kiểm off ví dụ. [Sinh viên] dấu phần trăm. >> Yeah, dấu phần trăm, đó là modulo. Vì vậy, modulo sẽ có ích khi bạn muốn để bọc trên các chỉ số trong ohai của bạn. Và chỉ cần một gợi ý nhanh chóng: Hãy thử nghĩ về gói qua từ khóa một chút như đếm off, mà nếu có 3 nhóm, người thứ 4, số của họ mà họ nói là 4 mod 3, là 1. Vì vậy, hãy thử và nghĩ về nó theo cách đó. Như bạn đã thấy trong công thức, bất cứ nơi nào bạn có ci và sau đó pi nhưng sau đó kj, bạn muốn làm cho chắc chắn rằng bạn theo dõi những người. Bạn không cần phải gọi nó là, bạn không cần phải gọi nó là j, nhưng bạn muốn làm cho chắc chắn rằng bạn theo dõi các vị trí mà bạn đang ở trong bản rõ của bạn cũng như vị trí mà bạn đang ở trong từ khóa của bạn bởi vì những người không nhất thiết sẽ là như vậy. Không chỉ các từ khóa - nó có thể có một chiều dài hoàn toàn khác với bản rõ của bạn. Ngoài ra, bản rõ của bạn, có số và ký tự, do đó, nó sẽ không hoàn toàn phù hợp với nhau. Vâng. [Sinh viên] Có một chức năng để thay đổi trường hợp? Bạn có thể thay đổi một vốn A? >> Yeah, có chắc chắn là. Bạn có thể kiểm tra - Tôi tin rằng toupper của nó, tất cả các từ 1. Tuy nhiên, khi bạn đang cố gắng thuật toán mã hóa và bảo quản các văn bản, nó về cơ bản tốt nhất để có những trường hợp riêng biệt. Nếu nó là một chữ hoa, sau đó bạn muốn thay đổi của thành viên này bởi vì trong công thức của bạn, khi bạn nhìn lại cách chúng ta phải loại đi hoán đổi cho nhau giữa cách ASCII đại diện cho những con số và chữ cái chỉ số thực tế, chúng tôi muốn chắc chắn có sẽ là một số loại mô hình mà các bạn đang sử dụng. Một lưu ý trên mẫu, thực sự. Bạn sẽ chắc chắn được giao dịch với số. Cố gắng không để sử dụng các con số ma thuật, đó là một ví dụ về phong cách. Vì vậy, nói rằng bạn muốn mỗi một cái gì đó thay đổi thời gian thích Được rồi, do đó, gợi ý, spoiler khác là khi nào bạn sẽ được thay đổi một cái gì đó một số tiền nhất định, cố gắng không để đại diện cho rằng một số thực tế mà đúng hơn là cố gắng và xem bạn có thể sử dụng giá trị ASCII, trong đó loại sẽ có ý nghĩa hơn. Một lưu ý: Bởi vì chúng tôi đang làm việc với các công thức, mặc dù TF của bạn loại sẽ biết những mẫu mà bạn có thể sử dụng, tốt nhất để loại ý kiến ​​của bạn giải thích logic, thích, "Tôi đang sử dụng mô hình này bởi vì ..." và loại giải thích các mô hình một cách ngắn gọn trong ý kiến ​​của bạn. [Đây là hương 2] Nếu không có bất kỳ câu hỏi nào khác, sau đó tôi sẽ chỉ ở lại đây cho một ít. Chúc may mắn với pset 2: Crypto và cảm ơn vì đã đến. [Sinh viên] Cảm ơn bạn. >> Cảm ơn. [Bài intro Media]