ROB Bowden: Hi, tôi là Rob Bowden, và chúng ta hãy nói về quiz0. Vì vậy, câu hỏi đầu tiên. Đây là câu hỏi mà bạn cần thiết để mã số 127 trong bóng đèn nhị phân. Nếu bạn muốn, bạn có thể thực hiện chuyển đổi thường xuyên từ bi-- hay, từ thập phân sang nhị phân. Nhưng điều đó có lẽ sẽ mất rất nhiều thời gian. Tôi có nghĩa là, bạn có thể tìm ra rằng, OK, 1 là trong đó, 2 là trong đó, 4 trong đó, 8 là ở đó. Cách dễ dàng hơn, 127 là 128 trừ đi một. Đó là bóng đèn ngoài cùng bên trái là 128-bit. Vì vậy, 127 thực sự chỉ là tất cả của bóng đèn khác, vì đó là tận cùng bên trái bóng đèn trừ đi 1. Đó là nó cho câu hỏi đó. Một câu hỏi. Vì vậy, với 3 bit bạn có thể đại diện cho 8 giá trị khác nhau. Tại sao, sau đó, là 7 lớn nhất không âm số nguyên thập phân, bạn có thể đại diện? Vâng, nếu chúng ta chỉ có thể đại diện cho 8 giá trị khác nhau, sau đó những gì chúng ta sẽ được đại diện là 0 đến 7. 0 chiếm một trong các giá trị. Câu hỏi hai. Với n bit, có bao nhiêu khác biệt giá trị mà bạn có thể đại diện? Vì vậy, với n bit, bạn có 2 giá trị có thể cho mỗi bit. Vì vậy, chúng tôi có 2 giá trị có thể cho bit đầu tiên, 2 giá trị có thể cho phần thứ hai, 2 có thể cho người thứ ba. Và đó là 2 lần 2 lần 2, và cuối cùng câu trả lời là 2 đến n. Câu hỏi ba. 0x50 trong hệ nhị phân là gì? Vì vậy, hãy nhớ rằng hệ thập lục phân có rất chuyển đổi đơn giản để nhị phân. Vì vậy, ở đây, chúng ta chỉ cần nhìn vào 5 và 0 độc lập. Vì vậy, những gì 5 trong hệ nhị phân? 0101, đó là bit 1 và bit 4. Là những gì 0 trong hệ nhị phân? Không khó khăn. 0000. Vì vậy, chỉ cần đặt chúng lại với nhau, và đó là số lượng đầy đủ trong hệ nhị phân. 01.010.000. Và nếu bạn muốn bạn có thể cất cánh mà không tận cùng bên trái. Nó không liên quan. Vì vậy, sau đó cách khác, 0x50 trong số thập phân là gì? Nếu bạn muốn, bạn could-- nếu bạn thoải mái hơn với các nhị phân, bạn có thể đi mà câu trả lời nhị phân và chuyển đổi đó vào thập phân. Hoặc chúng ta có thể chỉ cần nhớ rằng hệ thập lục phân. Vì vậy, đó 0 là ở vị trí thứ 0, và 5 là trong 16 vị trí đầu tiên. Vì vậy, ở đây, chúng tôi có 5 lần 16 với đầu tiên, cộng với 0 lần 16 đến số không, là 80. Và nếu bạn nhìn vào tiêu đề cho câu hỏi, nó là CS 80, đó là loại một gợi ý cho câu trả lời cho vấn đề này. Câu hỏi năm. Chúng tôi có kịch bản Scratch này, đó là lặp đi lặp lại 4 lần bơ đậu phộng thạch. Vì vậy, làm thế nào bây giờ chúng ta mã trong C? Vâng, chúng tôi có here-- phần in đậm là phần duy nhất bạn phải thực hiện. Vì vậy, chúng tôi có một vòng lặp 4 đó là vòng lặp 4 lần, printf-ing bơ đậu phộng thạch, với dòng mới như vấn đề yêu cầu. Câu hỏi sáu, một vấn đề khác Scratch. Chúng tôi thấy rằng chúng tôi đang ở trong một vòng lặp mãi mãi. Chúng tôi đang nói rằng tôi biến và sau đó incrementing i 1. Bây giờ chúng tôi muốn làm điều đó trong C. Có nhiều cách chúng ta có thể làm điều này. Ở đây chúng ta đã xảy ra với mã mãi mãi là một vòng lặp while (true). Vì vậy, chúng ta khai báo biến i, chỉ như chúng tôi đã có i biến trong Scratch. Khai báo biến i, và mãi mãi while (true), chúng ta nói biến i. Vì vậy, printf% i-- hoặc bạn có thể đã sử dụng% d. Chúng tôi nói biến đó, và sau đó tăng nó, i ++. Câu hỏi bảy. Bây giờ chúng tôi muốn làm một cái gì đó rất giống nhau Mario dot c từ vấn đề thiết lập một. Chúng tôi muốn in những hashtags, chúng tôi muốn in một năm bởi ba hình chữ nhật của các băm. Vậy làm thế nào chúng ta sẽ làm điều đó? Vâng, chúng tôi cung cấp cho bạn một tổng thể bó mã, và bạn chỉ cần phải điền vào các chức năng lưới in. Vì vậy, những gì PrintGrid như thế nào? Vâng, bạn đang quá khứ chiều rộng và chiều cao. Vì vậy, chúng tôi có một bên ngoài 4 vòng, đó là vòng lặp trên tất cả các hàng này lưới mà chúng ta muốn in ra. Sau đó, chúng tôi có 4 vòng liên lồng nhau, đó là in ấn trên mỗi cột. Vì vậy, cho mỗi hàng, chúng tôi in cho mỗi cột, một hash duy nhất. Sau đó, vào cuối của hàng chúng tôi in một đơn dòng mới để đi đến hàng tiếp theo. Và đó là nó cho toàn bộ lưới điện. Câu hỏi tám. Một chức năng như PrintGrid được cho là có một tác dụng phụ, nhưng không phải là một trở lại giá trị. Giải thích sự khác biệt. Vì vậy, điều này dựa vào bạn ghi nhớ những gì một tác dụng phụ là. Vâng, một trở value-- chúng ta biết PrintGrid không có giá trị trả về, kể từ khi ở đây nó nói void. Vì vậy, bất cứ điều gì mà trả về void không thực sự quay trở lại bất cứ điều gì. Vì vậy, các tác dụng phụ là gì? Vâng, một tác dụng phụ là bất cứ điều gì mà loại vẫn tồn tại sau khi kết thúc chức năng đó không phải là vừa trở về, và nó đã được không chỉ từ đầu vào. Vì vậy, ví dụ, chúng ta có thể thay đổi một biến toàn cầu. Đó sẽ là một tác dụng phụ. Trong trường hợp này, một tác dụng phụ rất quan trọng được in ra màn hình. Vì vậy, đó là một tác dụng phụ PrintGrid có. Chúng tôi in những điều này cho màn hình. Và bạn có thể nghĩ đó như là một tác dụng phụ, vì đó là một cái gì đó vẫn còn sau khi chức năng này kết thúc. Đó là một cái gì đó ngoài phạm vi của chức năng này mà cuối cùng đang được thay đổi, nội dung của màn hình. Câu hỏi chín. Hãy xem xét các chương trình dưới đây, mà số dòng đã được thêm vào cho vì lợi ích của cuộc thảo luận. Vì vậy, trong chương trình này, chúng ta chỉ gọi GetString, lưu trữ nó trong này biến, và sau đó in rằng biến s. OK. Vì vậy, giải thích tại sao một dòng là hiện tại. #include CS50 dot h. Tại sao chúng ta cần phải #include CS50 dot h? Vâng, chúng tôi đang kêu gọi các Chức năng GetString, và GetString được xác định trong thư viện CS50. Vì vậy, nếu chúng tôi không có #include CS50 dot h, chúng tôi sẽ nhận được những lời tuyên bố ngầm các lỗi chức năng GetString từ trình biên dịch. Vì vậy, chúng ta cần phải bao gồm các library-- chúng ta cần phải bao gồm các tập tin tiêu đề, hoặc nếu không trình biên dịch sẽ không nhận ra rằng GetString tồn tại. Giải thích lý do tại sao hai dòng là hiện tại. Vì vậy, tiêu chuẩn io dot h. Đó là giống hệt nhau như các vấn đề trước đây, ngoại trừ thay vì đối phó với GetString, chúng ta đang nói về printf. Vì vậy, nếu chúng ta không nói rằng chúng ta cần bao gồm các tiêu chuẩn io dot h, sau đó chúng tôi sẽ không thể sử dụng chức năng printf, vì trình biên dịch sẽ không biết về nó. Why-- ý nghĩa là gì làm mất hiệu lực của phù bốn? Vì vậy, ở đây chúng tôi có int main (void). Đó là chỉ nói rằng chúng tôi không nhận được bất kỳ dòng lệnh lập luận để chính. Hãy nhớ rằng chúng ta có thể nói int chính int argc dấu ngoặc chuỗi argv. Vì vậy, ở đây chúng tôi chỉ nói trống để nói rằng chúng ta đang bỏ qua các đối số dòng lệnh. Giải thích, liên quan đến bộ nhớ, chính xác những gì GetString trong dòng sáu lợi nhuận. GetString đang trở lại một khối bộ nhớ, một mảng các ký tự. Nó thực sự trở về một con trỏ đến ký tự đầu tiên. Hãy nhớ rằng một chuỗi là một ngôi sao char. Vì vậy, s là một con trỏ đến đầu tiên nhân vật trong bất cứ chuỗi là mà người dùng nhập vào bàn phím. Và bộ nhớ điều đó xảy ra để được malloced, nên nhớ đó là trong heap. Câu hỏi 13. Hãy xem xét các chương trình dưới đây. Vì vậy, tất cả các chương trình này được thực hiện được printf-ing 1 chia cho 10. Vì vậy, khi biên soạn và thực hiện, chương trình này kết quả đầu ra 0.0, mặc dù 1 chia cho 10 là 0,1. Vì vậy, tại sao nó là 0.0? Vâng, điều này là do phân chia số nguyên. Vì vậy, 1 là một số nguyên, 10 là một số nguyên. Vì vậy, 1 chia cho 10, tất cả mọi thứ được coi là số nguyên, và C, khi chúng tôi phân chia số nguyên, chúng tôi cắt bất kỳ dấu thập phân. Vì vậy, 1 chia cho 10 được 0, và sau đó chúng tôi đang cố gắng in đó như là một float, vì vậy không in như một phao là 0.0. Và đó là lý do tại sao chúng tôi nhận được 0.0. Hãy xem xét các chương trình dưới đây. Bây giờ chúng tôi đang in 0.1. Vì vậy, không phân chia số nguyên, chúng ta chỉ cần in 0.1, nhưng chúng tôi đang in nó đến 28 chữ số thập phân. Và chúng tôi nhận được 0,1000 này, toàn bộ một loạt số không, 5 5 5, blah blah blah. Vì vậy, câu hỏi ở đây là tại sao nó in rằng, thay vì chính xác 0.1? Vì vậy, lý do ở đây bây giờ là nổi điểm không chính xác. Hãy nhớ rằng một phao chỉ là 32 bit. Vì vậy, chúng tôi chỉ có thể đại diện cho một số hữu hạn nổi các giá trị điểm với những người 32 bit. Cũng có vô hạn cuối cùng nhiều giá trị dấu chấm động, và có vô cùng nhiều nổi các giá trị điểm ở giữa 0 và 1, và chúng tôi rõ ràng là có thể đại diện cho các giá trị thậm chí nhiều hơn thế. Vì vậy, chúng ta phải hy sinh để có thể đại diện cho hầu hết các giá trị. Vì vậy, một giá trị như 0,1, rõ ràng chúng tôi không thể bảo đảm rằng chính xác. Vì vậy, thay vì đại diện cho 0,1 chúng ta làm tốt nhất chúng tôi có thể đại diện này 0.100000 5 5 5. Và đó là khá chặt chẽ, nhưng cho rất nhiều ứng dụng bạn phải lo lắng về nổi điểm không chính xác, bởi vì chúng tôi chỉ có thể không đại diện cho tất cả các điểm nổi chính xác. Câu hỏi 15. Xem xét các mã dưới đây. Chúng tôi chỉ in 1 cộng thêm 1. Vì vậy, không có trick ở đây. 1 cộng 1 đánh giá đến 2, và sau đó chúng tôi đang in đó. Điều này chỉ cần in 2. Câu hỏi 16. Bây giờ chúng tôi đang in các nhân vật 1 cộng với 1 nhân vật. Vậy tại sao điều này không in điều tương tự? Vâng các nhân vật cộng với 1 nhân vật 1, nhân vật 1 có giá trị ASCII 49. Vì vậy, đây thực sự là nói 49 cộng với 49, và cuối cùng này sẽ in 98. Vì vậy, điều này không in 2. Câu hỏi 17. Hoàn thành việc thực hiện lẻ dưới đây theo cách như vậy rằng các chức năng trả về true nếu n là số lẻ và sai nếu n là số chẵn. Đây là một mục đích lớn cho các nhà điều hành mod. Vì vậy, chúng tôi có lập luận n của chúng tôi, nếu n mod 2 bằng 1, cũng điều đó có nghĩa rằng n chia 2 đã có một phần còn lại. Nếu n chia cho 2 đã có một phần còn lại, mà có nghĩa là n là số lẻ, vì vậy chúng tôi trở thành sự thật. Khác, chúng tôi trở lại sai. Bạn cũng có thể làm n mod 2 equals bằng không, trả về false, else return true. Hãy xem xét các chức năng đệ quy bên dưới. Vì vậy, nếu n là nhỏ hơn hoặc bằng 1, trở về 1, khác trở lại n lần f của n trừ đi 1. Vì vậy, chức năng này là gì? Vâng, đây chỉ là chức năng thừa. Điều này là độc đáo đại diện là n giai thừa. Vì vậy, câu 19 bây giờ, chúng tôi muốn có hàm đệ quy này. Chúng tôi muốn làm cho nó lặp đi lặp lại. Vì vậy, làm thế nào để chúng tôi làm điều đó? Tốt cho nhân viên giải pháp, và một lần nữa có nhiều cách bạn có thể làm đó, chúng tôi bắt đầu với int sản phẩm này bằng 1. Và trong suốt này cho vòng lặp, chúng ta sẽ được nhân sản phẩm cuối cùng kết thúc với giai thừa đầy đủ. Vì vậy, cho int i bằng 2, tôi là nhỏ hơn hoặc bằng n, i ++. Bạn có thể tự hỏi tại sao i = 2. Vâng, hãy nhớ rằng ở đây chúng ta phải đảm bảo trường hợp cơ sở của chúng tôi là chính xác. Vì vậy, nếu n là nhỏ hơn hoặc bằng 1, chúng ta chỉ trả lại 1. Vì vậy, ở đây, chúng tôi bắt đầu từ i = 2. Vâng, nếu tôi là 1, sau đó the-- hoặc nếu n là 1, sau đó cho vòng lặp sẽ không thực hiện ở tất cả. Và vì vậy chúng tôi sẽ chỉ sản phẩm trở lại, đó là 1. Tương tự như vậy, nếu n là bất cứ điều gì ít hơn 1-- nếu nó là 0, 1 tiêu cực, whatever-- chúng tôi vẫn muốn được trở về 1, đó là chính xác những gì phiên bản đệ quy là làm. Bây giờ, nếu n lớn hơn 1, sau đó chúng ta sẽ làm ít nhất một lặp đi lặp lại của vòng lặp này. Vì vậy, hãy nói n là 5, sau đó chúng tôi sẽ làm lần sản phẩm bằng 2. Vì vậy, hiện nay sản phẩm là 2. Bây giờ chúng tôi đang đi làm Thời gian sản phẩm bằng 3. Bây giờ là 6. Lần sản phẩm tương đương với 4, bây giờ là 24. Thời gian sản phẩm bằng 5, bây giờ là 120. Vì vậy, sau đó cuối cùng, chúng tôi đang trở về 120, đó là chính xác 5 thừa. Câu hỏi 20. Đây là một trong những nơi bạn phải điền trong bảng này với bất kỳ thuật toán nhất định, bất cứ điều gì mà chúng tôi đã nhìn thấy, đó phù hợp với các thuật toán chạy lần những lần chạy tiệm cận. Vì vậy, một thuật toán là những gì mà là omega là 1, nhưng O lớn của n? Vì vậy, có thể có vô hạn nhiều câu trả lời ở đây. Một trong đó chúng tôi đã nhìn thấy có lẽ hầu hết thường xuyên chỉ là tìm kiếm tuyến tính. Vì vậy, trong trường hợp tốt nhất kịch bản, các mục chúng tôi tìm ở bắt đầu của danh sách và như vậy trong omega 1 bước, điều đầu tiên chúng tôi kiểm tra, chúng ta chỉ cần ngay lập tức quay trở lại mà chúng tôi tìm thấy mục. Trong trường hợp xấu nhất, mục là lúc kết thúc, hoặc item không có trong danh sách ở tất cả. Vì vậy, chúng ta phải tìm kiếm toàn bộ danh sách, tất cả n yếu tố, và đó là lý do tại sao nó o của n. Vì vậy, bây giờ nó là cái gì đó là cả hai omega của n log n, và O lớn của n log n. Vâng điều phù hợp nhất chúng tôi đã nhìn thấy ở đây là hợp nhất phân loại. Vì vậy, hợp nhất phân loại, ghi nhớ, cuối cùng là theta của n n log, nơi theta được xác định nếu cả hai omega và O lớn đều giống nhau. Cả hai n log n. Cái gì đó là omega là gì của n, và O của n bình phương? Vâng, một lần nữa có nhiều câu trả lời có thể. Ở đây chúng tôi xảy ra để nói bong bóng sắp xếp. Sắp xếp chèn cũng sẽ làm việc ở đây. Hãy nhớ rằng bong bóng sắp xếp có tối ưu hóa mà ở đâu, nếu bạn có thể nhận được thông qua toàn bộ danh sách mà không cần phải làm bất kỳ giao dịch hoán đổi, sau đó, tốt, chúng tôi ngay lập tức có thể trở lại mà danh sách đã được sắp xếp để bắt đầu với. Vì vậy, trong trường hợp tốt nhất, nó chỉ là omega của n. Nếu nó không phải chỉ là một độc đáo sắp xếp danh sách để bắt đầu với, sau đó chúng tôi có O n bình phương hoán đổi. Và cuối cùng, chúng ta phải lựa chọn loại cho n bình phương, cả hai omega và lớn O. Câu hỏi 21. Tràn số nguyên là gì? Vâng một lần nữa, tương tự như trước đó, chúng tôi chỉ có hữu hạn nhiều bit để đại diện cho một số nguyên, như vậy có lẽ 32 bit. Hãy nói rằng chúng tôi có một số nguyên ký. Sau đó, cuối cùng cao nhất số tích cực chúng tôi có thể đại diện là từ 2 đến 31 trừ đi 1. Vì vậy, những gì sẽ xảy ra nếu chúng tôi cố gắng sau đó tăng số nguyên? Vâng, chúng ta sẽ đi từ 2 đến 31 trừ đi 1, tất cả các con đường xuống âm 2 đến 31. Vì vậy, tràn số nguyên này là khi bạn giữ incrementing, và cuối cùng bạn có thể không nhận được bất kỳ cao hơn và nó chỉ kết thúc tốt đẹp tất cả các cách trở lại xung quanh để một giá trị âm. Điều gì về một lỗi tràn bộ đệm? Vì vậy, một bộ đệm overflow-- nhớ những gì một bộ đệm. Nó chỉ là một đoạn bộ nhớ. Một cái gì đó giống như một mảng là một bộ đệm. Vì vậy, một lỗi tràn bộ đệm là khi bạn cố gắng để truy cập bộ nhớ vượt ra ngoài cuối cùng của mảng đó. Vì vậy, nếu bạn có một mảng có kích thước 5 và bạn cố gắng truy cập vào khung mảng 5 hoặc 6 khung hoặc khung 7, hoặc bất cứ điều gì vượt ra ngoài kết thúc, hoặc thậm chí bất cứ điều gì khung mảng below-- tiêu cực 1-- tất cả đều là những lỗi tràn bộ đệm. Bạn đang chạm vào bộ nhớ trong cách xấu. Câu hỏi 23. Vì vậy, trong một này, bạn cần để thực hiện strlen. Và chúng tôi nói với bạn rằng bạn có thể giả s sẽ không được null, vì vậy bạn không cần phải làm bất cứ kiểm tra cho null. Và có rất nhiều cách bạn có thể đã làm điều này. Ở đây chúng ta chỉ cần lấy đơn giản. Chúng tôi bắt đầu với một truy cập, n. n là đếm bao nhiêu ký tự có. Vì vậy, chúng tôi bắt đầu từ 0, và sau đó chúng tôi duyệt qua toàn bộ danh sách. Là s khung 0 bằng rỗng kí tự kết thúc? Nhớ là chúng tôi đang tìm kiếm các kí tự kết thúc rỗng để xác định bao lâu chuỗi của chúng tôi là. Có nghĩa là sẽ chấm dứt chuỗi bất kỳ có liên quan. Vì vậy, là của khung bằng 0 đến terminator null? Nếu không, sau đó chúng ta sẽ nhìn vào khung s 1, s 2 khung. Chúng tôi tiếp tục đi cho đến khi chúng tôi tìm terminator null. Một khi chúng ta đã tìm thấy nó, sau đó n chứa tổng chiều dài của chuỗi, và chúng tôi chỉ có thể trở lại đó. Câu hỏi 24. Vì vậy, đây là một trong những nơi bạn phải làm cho thương mại giảm. Vì vậy, có một điều tốt trong một cách, nhưng bằng cách nào là nó xấu? Vì vậy, ở đây, hợp nhất phân loại có xu hướng được nhanh hơn bong bóng sắp xếp. Có nói that-- tốt, có nhiều câu trả lời ở đây. Nhưng một trong những chính là bong bóng sắp xếp là omega của n cho một danh sách được sắp xếp. Ghi bảng mà chúng ta chỉ nhìn thấy trước đó. Vì vậy, bong bóng sắp xếp của omega n, trường hợp kịch bản tốt nhất là nó có thể chỉ cần đi qua danh sách một lần, xác định hey điều này đã sắp xếp, và ngược lại. Hợp nhất phân loại, không có vấn đề gì bạn làm, là omega của n log n. Vì vậy, danh sách sắp xếp, bong bóng loại sẽ được nhanh hơn. Bây giờ những gì về danh sách liên kết? Vì vậy, một danh sách liên kết có thể phát triển và thu nhỏ để phù hợp với nhiều yếu tố khi cần thiết. Có nói như vậy that-- thường so sánh trực tiếp sẽ là một liên kết liệt kê với một mảng. Vì vậy, mặc dù mảng có thể dễ dàng phát triển và thu nhỏ để phù hợp với nhiều yếu tố khi cần thiết, một danh sách liên kết so với một một array-- mảng có thể truy cập ngẫu nhiên. Chúng tôi có thể chỉ vào bất kỳ yếu tố đặc biệt của mảng. Vì vậy, cho một danh sách liên kết, chúng ta không thể chỉ cần đi đến các yếu tố thứ năm, chúng ta phải đi qua từ đầu cho đến khi chúng tôi nhận được yếu tố thứ năm. Và đó sẽ ngăn cản chúng ta làm một cái gì đó như tìm kiếm nhị phân. Nói về tìm kiếm nhị phân, tìm kiếm nhị phân có xu hướng nhanh hơn so với tìm kiếm tuyến tính. Có nói that-- vì vậy, có một điều có thể là bạn không thể làm nhị phân tìm kiếm trên danh sách liên kết, bạn chỉ có thể làm điều đó trên mảng. Nhưng có lẽ quan trọng hơn, bạn không thể làm tìm kiếm nhị phân trên một mảng mà không được sắp xếp. Trả trước bạn có thể cần phải sắp xếp mảng, và chỉ sau đó có thể bạn thực hiện tìm kiếm nhị phân. Vì vậy, nếu bạn không phải là điều được sắp xếp để bắt đầu với, sau đó tìm kiếm tuyến tính có thể được nhanh hơn. Câu hỏi 27. Vì vậy, xem xét các chương trình dưới đây, sẽ có mặt trên các slide tiếp theo. Và đây là một trong những nơi chúng tôi sẽ muốn nêu một cách rõ ràng các giá trị cho các biến khác nhau. Vì vậy, chúng ta hãy nhìn vào đó. Vì vậy, xếp hàng một. Chúng tôi có int x = 1. Đó là điều duy nhất mà đã xảy ra. Vì vậy, tại một dòng, chúng ta thấy trong của chúng tôi bảng, mà y, a, b, và tmp là tất cả bôi đen. Vì vậy, x là gì? Vâng, chúng tôi chỉ cần đặt nó bằng 1. Và sau đó xếp hàng hai, tốt, chúng ta thấy rằng y được thiết lập để 2, và bàn là đã điền vào cho chúng tôi. Vì vậy, x là 1 và y là 2. Bây giờ, dòng ba, chúng tôi hiện bên trong các chức năng trao đổi. Chúng tôi đã vượt qua những gì để trao đổi? Chúng tôi đã thông qua ký hiệu x cho một, và ký hiệu y cho b. Nơi mà vấn đề trước nói rằng địa chỉ của x là 0x10, và địa chỉ của y là 0x14. Vì vậy, a và b là bằng 0x10 và 0x14, tương ứng. Bây giờ, ở dòng ba, x và y là gì? Vâng, không có gì đã thay đổi về x và y vào thời điểm này. Mặc dù chúng bên trong một stack frame chính, họ vẫn có cùng một giá trị mà họ đã làm trước đây. Chúng tôi đã không thay đổi bất kỳ bộ nhớ. Vì vậy, x là 1, y là 2. Được rồi. Vì vậy, bây giờ chúng tôi nói int tmp bằng một ngôi sao. Vì vậy, tại dòng bốn, tất cả mọi thứ là như nhau ngoại trừ cho tmp. Chúng tôi đã không thay đổi bất kỳ giá trị bất cứ điều gì ngoại trừ tmp. Chúng tôi đang thiết tmp bằng một ngôi sao. Một ngôi sao là gì? Vâng, một điểm x, Vì vậy, một ngôi sao sẽ x bằng nhau, đó là 1. Vì vậy, tất cả mọi thứ được sao chép xuống, và tmp được thiết lập để 1. Bây giờ dòng tiếp theo. Sao bằng một ngôi sao b. Vì vậy, bằng dòng five-- cũng một lần nữa, tất cả mọi thứ là như nhau ngoại trừ bất cứ điều gì một ngôi sao là. Một ngôi sao là gì? Vâng, chúng ta chỉ nói sao một là x. Vì vậy, chúng tôi đang thay đổi x cho bằng sao b. Sao b là gì? y. điểm b để y. Vì vậy, sao b là y. Vì vậy, chúng tôi đang thiết x bằng y, và mọi thứ khác là như nhau. Vì vậy, chúng ta thấy ở hàng tiếp theo mà x bây giờ là 2, và phần còn lại chỉ là sao chép xuống. Bây giờ các dòng tiếp theo, ngôi sao b bằng tmp. Vâng, chúng ta chỉ nói sao b là y, vì vậy chúng tôi đang thiết lập y bằng tmp. Mọi thứ khác là như nhau, vì vậy tất cả mọi thứ được sao chép xuống. Chúng tôi đang thiết lập y bằng tmp, đó là một, và mọi thứ khác là như nhau. Bây giờ cuối cùng, dòng bảy. Chúng tôi đang trở lại trong các chức năng chính. Chúng tôi trao đổi sau khi kết thúc. Chúng tôi đã mất a, b, và tmp, nhưng cuối cùng chúng tôi không thay đổi bất kỳ giá trị bất cứ điều gì vào thời điểm này, chúng tôi chỉ cần sao chép x và y xuống. Và chúng ta thấy rằng x và y là hiện giờ là 2 và 1 thay vì 1 và 2. Các trao đổi đã thực hiện thành công. Câu hỏi 28. Giả sử rằng bạn gặp phải các thông báo lỗi dưới đây trong giờ hành chính năm tiếp theo như một CA hoặc TF. Tư vấn làm thế nào để sửa chữa từng lỗi. Tham khảo để xác định để GetString. Tại sao bạn có thể thấy điều này? Vâng, nếu một học sinh sử dụng GetString trong mã của họ, họ đã đúng băm bao gồm CS50 dot h để bao gồm các thư viện CS50. Vâng, những gì họ làm cần phải sửa chữa lỗi này? Họ cần phải làm một lcs50 dấu gạch ngang ở dòng lệnh khi họ đang biên soạn. Vì vậy, nếu họ không vượt qua kêu vang dash lcs50, họ đang sẽ không có thực tế mã thực hiện GetString. Câu hỏi 29. Ngầm tuyên bố chức năng thư viện strlen. Vâng điều này bây giờ, họ có không thực hiện băm thích hợp bao gồm. Trong trường hợp này, các tập tin tiêu đề họ cần phải bao gồm là chuỗi dấu chấm h, và bao gồm chuỗi dot h, bây giờ các student-- nay là trình biên dịch có quyền truy cập vào tờ khai của strlen, và nó biết rằng mã của bạn được sử dụng strlen một cách chính xác. Câu hỏi 30. Nhiều chuyển đổi phần trăm hơn đối số dữ liệu. Vì vậy, đây là những gì? Cũng hãy nhớ rằng những phần trăm signs-- như thế nào chúng thích hợp với printf. Vì vậy, trong printf chúng ta có thể percent-- chúng tôi có thể in một cái gì đó như phần trăm i n dấu gạch chéo ngược. Hoặc chúng ta có thể in như phần trăm i, không gian, phần trăm i, không gian, phần trăm i. Vì vậy, cho mỗi người dấu phần trăm, chúng ta cần để vượt qua một biến vào cuối printf. Vì vậy, nếu chúng ta nói paren printf phần trăm i dấu gạch chéo ngược dấu ngoặc n gần, tốt, chúng ta nói rằng chúng tôi sẽ in một số nguyên, nhưng sau đó chúng tôi không vượt qua printf một số nguyên để thực sự in. Vì vậy, đây hơn trăm chuyển đổi hơn đối số dữ liệu? Điều đó nói rằng chúng ta có một bó toàn bộ phần trăm, và chúng tôi không có đủ biến để điền thực sự trong những phần trăm. Và sau đó chắc chắn, cho câu hỏi 31, chắc chắn bị mất 40 byte trong một khối. Vì vậy, đây là một lỗi Valgrind. Điều này được nói rằng một nơi nào đó trong mã của bạn, bạn có một phân bổ là 40 byte lớn, do đó bạn malloced 40 byte, và bạn không bao giờ giải thoát nó. Nhiều khả năng bạn chỉ cần để tìm thấy một số rò rỉ bộ nhớ, và tìm thấy nơi bạn cần giải phóng khối bộ nhớ này. Và câu hỏi 32, viết không hợp lệ kích thước 4. Một lần nữa đây là một lỗi Valgrind. Điều này không phải làm với rò rỉ bộ nhớ bây giờ. Đây là, hầu hết likely-- Ý tôi là, đó là một số loại quyền bộ nhớ không hợp lệ. Và rất có thể đây là một số loại lỗi tràn bộ đệm. Trong trường hợp bạn có một mảng, có thể một mảng số nguyên, và chúng ta hãy nói đó là kích thước 5, và bạn cố gắng chạm vào khung mảng 5. Vì vậy, nếu bạn cố gắng để viết cho rằng giá trị, đó không phải là một phần của bộ nhớ mà bạn thực sự có thể truy cập, và do đó, bạn sẽ nhận được lỗi này, nói viết không hợp lệ kích thước 4. Valgrind sẽ nhận ra bạn cố gắng để chạm vào bộ nhớ không thích hợp. Và đó là nó cho quiz0. Tôi Rob Bowden, và đây là CS50.