1 00:00:00,000 --> 00:00:09,572 2 00:00:09,572 --> 00:00:12,030 ROB Bowden: Hi, tôi là Rob Bowden, và chúng ta hãy nói về quiz0. 3 00:00:12,030 --> 00:00:13,280 4 00:00:13,280 --> 00:00:14,545 >> Vì vậy, câu hỏi đầu tiên. 5 00:00:14,545 --> 00:00:17,750 Đây là câu hỏi mà bạn cần thiết để mã số 6 00:00:17,750 --> 00:00:21,270 127 trong bóng đèn nhị phân. 7 00:00:21,270 --> 00:00:23,550 Nếu bạn muốn, bạn có thể thực hiện chuyển đổi thường xuyên 8 00:00:23,550 --> 00:00:25,950 từ bi-- hay, từ thập phân sang nhị phân. 9 00:00:25,950 --> 00:00:28,300 Nhưng điều đó có lẽ sẽ mất rất nhiều thời gian. 10 00:00:28,300 --> 00:00:31,750 Tôi có nghĩa là, bạn có thể tìm ra rằng, OK, 1 là trong đó, 2 là trong đó, 11 00:00:31,750 --> 00:00:33,650 4 trong đó, 8 là ở đó. 12 00:00:33,650 --> 00:00:39,280 Cách dễ dàng hơn, 127 là 128 trừ đi một. 13 00:00:39,280 --> 00:00:42,013 Đó là bóng đèn ngoài cùng bên trái là 128-bit. 14 00:00:42,013 --> 00:00:43,490 15 00:00:43,490 --> 00:00:47,860 Vì vậy, 127 thực sự chỉ là tất cả của bóng đèn khác, 16 00:00:47,860 --> 00:00:51,420 vì đó là tận cùng bên trái bóng đèn trừ đi 1. 17 00:00:51,420 --> 00:00:52,800 Đó là nó cho câu hỏi đó. 18 00:00:52,800 --> 00:00:54,060 >> Một câu hỏi. 19 00:00:54,060 --> 00:00:56,710 Vì vậy, với 3 bit bạn có thể đại diện cho 8 giá trị khác nhau. 20 00:00:56,710 --> 00:01:01,000 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? 21 00:01:01,000 --> 00:01:04,050 Vâng, nếu chúng ta chỉ có thể đại diện cho 8 giá trị khác nhau, 22 00:01:04,050 --> 00:01:07,430 sau đó những gì chúng ta sẽ được đại diện là 0 đến 7. 23 00:01:07,430 --> 00:01:08,745 0 chiếm một trong các giá trị. 24 00:01:08,745 --> 00:01:09,980 25 00:01:09,980 --> 00:01:11,190 >> Câu hỏi hai. 26 00:01:11,190 --> 00:01:14,610 Với n bit, có bao nhiêu khác biệt giá trị mà bạn có thể đại diện? 27 00:01:14,610 --> 00:01:19,080 Vì vậy, với n bit, bạn có 2 giá trị có thể cho mỗi bit. 28 00:01:19,080 --> 00:01:22,300 Vì vậy, chúng tôi có 2 giá trị có thể cho bit đầu tiên, 2 giá trị có thể 29 00:01:22,300 --> 00:01:24,450 cho phần thứ hai, 2 có thể cho người thứ ba. 30 00:01:24,450 --> 00:01:28,730 Và đó là 2 lần 2 lần 2, và cuối cùng câu trả lời là 2 đến n. 31 00:01:28,730 --> 00:01:30,010 32 00:01:30,010 --> 00:01:31,100 >> Câu hỏi ba. 33 00:01:31,100 --> 00:01:33,450 0x50 trong hệ nhị phân là gì? 34 00:01:33,450 --> 00:01:39,490 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. 35 00:01:39,490 --> 00:01:43,180 Vì vậy, ở đây, chúng ta chỉ cần nhìn vào 5 và 0 độc lập. 36 00:01:43,180 --> 00:01:45,110 Vì vậy, những gì 5 trong hệ nhị phân? 37 00:01:45,110 --> 00:01:48,400 0101, đó là bit 1 và bit 4. 38 00:01:48,400 --> 00:01:49,900 Là những gì 0 trong hệ nhị phân? 39 00:01:49,900 --> 00:01:50,520 Không khó khăn. 40 00:01:50,520 --> 00:01:52,180 0000. 41 00:01:52,180 --> 00:01:54,970 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. 42 00:01:54,970 --> 00:01:57,640 01.010.000. 43 00:01:57,640 --> 00:02:00,439 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. 44 00:02:00,439 --> 00:02:01,105 Nó không liên quan. 45 00:02:01,105 --> 00:02:02,920 46 00:02:02,920 --> 00:02:05,733 >> Vì vậy, sau đó cách khác, 0x50 trong số thập phân là gì? 47 00:02:05,733 --> 00:02:08,649 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, 48 00:02:08,649 --> 00:02:11,340 bạn có thể đi mà câu trả lời nhị phân và chuyển đổi đó vào thập phân. 49 00:02:11,340 --> 00:02:13,870 Hoặc chúng ta có thể chỉ cần nhớ rằng hệ thập lục phân. 50 00:02:13,870 --> 00:02:21,140 Vì vậy, đó 0 là ở vị trí thứ 0, và 5 là trong 16 vị trí đầu tiên. 51 00:02:21,140 --> 00:02:25,990 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, 52 00:02:25,990 --> 00:02:27,520 là 80. 53 00:02:27,520 --> 00:02:29,710 Và nếu bạn nhìn vào tiêu đề cho câu hỏi, 54 00:02:29,710 --> 00:02:32,920 nó là CS 80, đó là loại một gợi ý cho câu trả lời cho vấn đề này. 55 00:02:32,920 --> 00:02:34,460 56 00:02:34,460 --> 00:02:35,420 >> Câu hỏi năm. 57 00:02:35,420 --> 00:02:40,320 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. 58 00:02:40,320 --> 00:02:42,800 Vì vậy, làm thế nào bây giờ chúng ta mã trong C? 59 00:02:42,800 --> 00:02:47,730 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. 60 00:02:47,730 --> 00:02:51,950 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, 61 00:02:51,950 --> 00:02:53,910 với dòng mới như vấn đề yêu cầu. 62 00:02:53,910 --> 00:02:55,250 63 00:02:55,250 --> 00:02:57,490 >> Câu hỏi sáu, một vấn đề khác Scratch. 64 00:02:57,490 --> 00:03:00,210 Chúng tôi thấy rằng chúng tôi đang ở trong một vòng lặp mãi mãi. 65 00:03:00,210 --> 00:03:05,000 Chúng tôi đang nói rằng tôi biến và sau đó incrementing i 1. 66 00:03:05,000 --> 00:03:09,580 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. 67 00:03:09,580 --> 00:03:12,840 Ở đây chúng ta đã xảy ra với mã mãi mãi là một vòng lặp while (true). 68 00:03:12,840 --> 00:03:16,600 Vì vậy, chúng ta khai báo biến i, chỉ như chúng tôi đã có i biến trong Scratch. 69 00:03:16,600 --> 00:03:21,950 Khai báo biến i, và mãi mãi while (true), chúng ta nói biến i. 70 00:03:21,950 --> 00:03:25,260 Vì vậy, printf% i-- hoặc bạn có thể đã sử dụng% d. 71 00:03:25,260 --> 00:03:27,985 Chúng tôi nói biến đó, và sau đó tăng nó, i ++. 72 00:03:27,985 --> 00:03:29,560 73 00:03:29,560 --> 00:03:30,830 >> Câu hỏi bảy. 74 00:03:30,830 --> 00:03:35,560 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. 75 00:03:35,560 --> 00:03:39,110 Chúng tôi muốn in những hashtags, chúng tôi muốn in một năm 76 00:03:39,110 --> 00:03:40,700 bởi ba hình chữ nhật của các băm. 77 00:03:40,700 --> 00:03:41,770 78 00:03:41,770 --> 00:03:43,162 Vậy làm thế nào chúng ta sẽ làm điều đó? 79 00:03:43,162 --> 00:03:45,370 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 80 00:03:45,370 --> 00:03:47,560 phải điền vào các chức năng lưới in. 81 00:03:47,560 --> 00:03:49,540 >> Vì vậy, những gì PrintGrid như thế nào? 82 00:03:49,540 --> 00:03:51,480 Vâng, bạn đang quá khứ chiều rộng và chiều cao. 83 00:03:51,480 --> 00:03:53,520 Vì vậy, chúng tôi có một bên ngoài 4 vòng, đó là vòng lặp 84 00:03:53,520 --> 00:03:57,650 trên tất cả các hàng này lưới mà chúng ta muốn in ra. 85 00:03:57,650 --> 00:04:01,250 Sau đó, chúng tôi có 4 vòng liên lồng nhau, đó là in ấn trên mỗi cột. 86 00:04:01,250 --> 00:04:06,210 Vì vậy, cho mỗi hàng, chúng tôi in cho mỗi cột, một hash duy nhất. 87 00:04:06,210 --> 00:04:10,045 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. 88 00:04:10,045 --> 00:04:11,420 Và đó là nó cho toàn bộ lưới điện. 89 00:04:11,420 --> 00:04:12,810 90 00:04:12,810 --> 00:04:13,675 >> Câu hỏi tám. 91 00:04:13,675 --> 00:04:17,170 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 92 00:04:17,170 --> 00:04:17,670 giá trị. 93 00:04:17,670 --> 00:04:19,209 Giải thích sự khác biệt. 94 00:04:19,209 --> 00:04:23,080 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à. 95 00:04:23,080 --> 00:04:25,180 Vâng, một trở value-- chúng ta biết PrintGrid không 96 00:04:25,180 --> 00:04:28,180 có giá trị trả về, kể từ khi ở đây nó nói void. 97 00:04:28,180 --> 00:04:31,150 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ì. 98 00:04:31,150 --> 00:04:32,200 99 00:04:32,200 --> 00:04:33,620 Vì vậy, các tác dụng phụ là gì? 100 00:04:33,620 --> 00:04:36,620 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 101 00:04:36,620 --> 00:04:39,500 sau khi kết thúc chức năng đó không phải là vừa trở về, 102 00:04:39,500 --> 00:04:41,340 và nó đã được không chỉ từ đầu vào. 103 00:04:41,340 --> 00:04:44,970 >> Vì vậy, ví dụ, chúng ta có thể thay đổi một biến toàn cầu. 104 00:04:44,970 --> 00:04:46,590 Đó sẽ là một tác dụng phụ. 105 00:04:46,590 --> 00:04:49,000 Trong trường hợp này, một tác dụng phụ rất quan trọng 106 00:04:49,000 --> 00:04:51,070 được in ra màn hình. 107 00:04:51,070 --> 00:04:53,110 Vì vậy, đó là một tác dụng phụ PrintGrid có. 108 00:04:53,110 --> 00:04:54,980 Chúng tôi in những điều này cho màn hình. 109 00:04:54,980 --> 00:04:56,370 Và bạn có thể nghĩ đó như là một tác dụng phụ, 110 00:04:56,370 --> 00:04:58,690 vì đó là một cái gì đó vẫn còn sau khi chức năng này kết thúc. 111 00:04:58,690 --> 00:05:01,481 Đó là một cái gì đó ngoài phạm vi của chức năng này mà cuối cùng 112 00:05:01,481 --> 00:05:03,380 đang được thay đổi, nội dung của màn hình. 113 00:05:03,380 --> 00:05:05,200 114 00:05:05,200 --> 00:05:05,839 >> Câu hỏi chín. 115 00:05:05,839 --> 00:05:07,880 Hãy xem xét các chương trình dưới đây, mà số dòng 116 00:05:07,880 --> 00:05:09,740 đã được thêm vào cho vì lợi ích của cuộc thảo luận. 117 00:05:09,740 --> 00:05:13,480 Vì vậy, trong chương trình này, chúng ta chỉ gọi GetString, lưu trữ nó 118 00:05:13,480 --> 00:05:16,220 trong này biến, và sau đó in rằng biến s. 119 00:05:16,220 --> 00:05:16,720 OK. 120 00:05:16,720 --> 00:05:19,090 Vì vậy, giải thích tại sao một dòng là hiện tại. 121 00:05:19,090 --> 00:05:20,920 #include CS50 dot h. 122 00:05:20,920 --> 00:05:23,820 Tại sao chúng ta cần phải #include CS50 dot h? 123 00:05:23,820 --> 00:05:26,180 Vâng, chúng tôi đang kêu gọi các Chức năng GetString, 124 00:05:26,180 --> 00:05:28,840 và GetString được xác định trong thư viện CS50. 125 00:05:28,840 --> 00:05:31,600 Vì vậy, nếu chúng tôi không có #include CS50 dot h, 126 00:05:31,600 --> 00:05:35,760 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 127 00:05:35,760 --> 00:05:36,840 từ trình biên dịch. 128 00:05:36,840 --> 00:05:40,110 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 đề, 129 00:05:40,110 --> 00:05:42,870 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. 130 00:05:42,870 --> 00:05:44,380 131 00:05:44,380 --> 00:05:46,140 >> Giải thích lý do tại sao hai dòng là hiện tại. 132 00:05:46,140 --> 00:05:47,890 Vì vậy, tiêu chuẩn io dot h. 133 00:05:47,890 --> 00:05:50,430 Đó là giống hệt nhau như các vấn đề trước đây, 134 00:05:50,430 --> 00:05:53,310 ngoại trừ thay vì đối phó với GetString, chúng ta đang nói về printf. 135 00:05:53,310 --> 00:05:56,654 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, 136 00:05:56,654 --> 00:05:58,820 sau đó chúng tôi sẽ không thể sử dụng chức năng printf, 137 00:05:58,820 --> 00:06:00,653 vì trình biên dịch sẽ không biết về nó. 138 00:06:00,653 --> 00:06:01,750 139 00:06:01,750 --> 00:06:05,260 >> Why-- ý nghĩa là gì làm mất hiệu lực của phù bốn? 140 00:06:05,260 --> 00:06:08,010 Vì vậy, ở đây chúng tôi có int main (void). 141 00:06:08,010 --> 00:06:10,600 Đó là chỉ nói rằng chúng tôi không nhận được bất kỳ dòng lệnh 142 00:06:10,600 --> 00:06:12,280 lập luận để chính. 143 00:06:12,280 --> 00:06:17,390 Hãy nhớ rằng chúng ta có thể nói int chính int argc dấu ngoặc chuỗi argv. 144 00:06:17,390 --> 00:06:20,400 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. 145 00:06:20,400 --> 00:06:21,840 146 00:06:21,840 --> 00:06:25,225 >> 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. 147 00:06:25,225 --> 00:06:27,040 148 00:06:27,040 --> 00:06:31,640 GetString đang trở lại một khối bộ nhớ, một mảng các ký tự. 149 00:06:31,640 --> 00:06:34,870 Nó thực sự trở về một con trỏ đến ký tự đầu tiên. 150 00:06:34,870 --> 00:06:37,170 Hãy nhớ rằng một chuỗi là một ngôi sao char. 151 00:06:37,170 --> 00:06:41,360 Vì vậy, s là một con trỏ đến đầu tiên nhân vật trong bất cứ chuỗi là 152 00:06:41,360 --> 00:06:43,510 mà người dùng nhập vào bàn phím. 153 00:06:43,510 --> 00:06:47,070 Và bộ nhớ điều đó xảy ra để được malloced, nên nhớ đó là trong heap. 154 00:06:47,070 --> 00:06:49,080 155 00:06:49,080 --> 00:06:50,450 >> Câu hỏi 13. 156 00:06:50,450 --> 00:06:51,960 Hãy xem xét các chương trình dưới đây. 157 00:06:51,960 --> 00:06:55,579 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. 158 00:06:55,579 --> 00:06:57,370 Vì vậy, khi biên soạn và thực hiện, chương trình này 159 00:06:57,370 --> 00:07:01,170 kết quả đầu ra 0.0, mặc dù 1 chia cho 10 là 0,1. 160 00:07:01,170 --> 00:07:02,970 Vì vậy, tại sao nó là 0.0? 161 00:07:02,970 --> 00:07:05,510 Vâng, điều này là do phân chia số nguyên. 162 00:07:05,510 --> 00:07:08,580 Vì vậy, 1 là một số nguyên, 10 là một số nguyên. 163 00:07:08,580 --> 00:07:11,980 Vì vậy, 1 chia cho 10, tất cả mọi thứ được coi là số nguyên, 164 00:07:11,980 --> 00:07:16,380 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. 165 00:07:16,380 --> 00:07:19,590 Vì vậy, 1 chia cho 10 được 0, và sau đó chúng tôi đang cố gắng 166 00:07:19,590 --> 00:07:24,410 in đó như là một float, vì vậy không in như một phao là 0.0. 167 00:07:24,410 --> 00:07:27,400 Và đó là lý do tại sao chúng tôi nhận được 0.0. 168 00:07:27,400 --> 00:07:28,940 >> Hãy xem xét các chương trình dưới đây. 169 00:07:28,940 --> 00:07:31,280 Bây giờ chúng tôi đang in 0.1. 170 00:07:31,280 --> 00:07:34,280 Vì vậy, không phân chia số nguyên, chúng ta chỉ cần in 0.1, 171 00:07:34,280 --> 00:07:37,100 nhưng chúng tôi đang in nó đến 28 chữ số thập phân. 172 00:07:37,100 --> 00:07:41,810 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. 173 00:07:41,810 --> 00:07:45,495 Vì vậy, câu hỏi ở đây là tại sao nó in rằng, thay vì chính xác 0.1? 174 00:07:45,495 --> 00:07:46,620 175 00:07:46,620 --> 00:07:49,640 >> Vì vậy, lý do ở đây bây giờ là nổi điểm không chính xác. 176 00:07:49,640 --> 00:07:53,410 Hãy nhớ rằng một phao chỉ là 32 bit. 177 00:07:53,410 --> 00:07:57,540 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 178 00:07:57,540 --> 00:07:58,560 bit. 179 00:07:58,560 --> 00:08:01,760 Cũng có vô hạn cuối cùng nhiều giá trị dấu chấm động, 180 00:08:01,760 --> 00:08:04,940 và có vô cùng nhiều nổi các giá trị điểm ở giữa 0 và 1, 181 00:08:04,940 --> 00:08:07,860 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ế. 182 00:08:07,860 --> 00:08:13,230 Vì vậy, chúng ta phải hy sinh để có thể đại diện cho hầu hết các giá trị. 183 00:08:13,230 --> 00:08:16,960 >> 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. 184 00:08:16,960 --> 00:08:22,500 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 185 00:08:22,500 --> 00:08:23,260 5. 186 00:08:23,260 --> 00:08:26,306 Và đó là khá chặt chẽ, nhưng cho rất nhiều ứng dụng 187 00:08:26,306 --> 00:08:28,430 bạn phải lo lắng về nổi điểm không chính xác, 188 00:08:28,430 --> 00:08:30,930 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. 189 00:08:30,930 --> 00:08:32,500 190 00:08:32,500 --> 00:08:33,380 >> Câu hỏi 15. 191 00:08:33,380 --> 00:08:34,679 Xem xét các mã dưới đây. 192 00:08:34,679 --> 00:08:36,630 Chúng tôi chỉ in 1 cộng thêm 1. 193 00:08:36,630 --> 00:08:38,289 Vì vậy, không có trick ở đây. 194 00:08:38,289 --> 00:08:41,780 1 cộng 1 đánh giá đến 2, và sau đó chúng tôi đang in đó. 195 00:08:41,780 --> 00:08:42,789 Điều này chỉ cần in 2. 196 00:08:42,789 --> 00:08:43,850 197 00:08:43,850 --> 00:08:44,700 >> Câu hỏi 16. 198 00:08:44,700 --> 00:08:49,450 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. 199 00:08:49,450 --> 00:08:52,110 Vậy tại sao điều này không in điều tương tự? 200 00:08:52,110 --> 00:08:57,680 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. 201 00:08:57,680 --> 00:09:04,840 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. 202 00:09:04,840 --> 00:09:06,130 Vì vậy, điều này không in 2. 203 00:09:06,130 --> 00:09:08,070 204 00:09:08,070 --> 00:09:09,271 >> Câu hỏi 17. 205 00:09:09,271 --> 00:09:11,520 Hoàn thành việc thực hiện lẻ dưới đây theo cách như vậy 206 00:09:11,520 --> 00:09:14,615 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. 207 00:09:14,615 --> 00:09:16,710 208 00:09:16,710 --> 00:09:19,330 Đây là một mục đích lớn cho các nhà điều hành mod. 209 00:09:19,330 --> 00:09:24,530 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 210 00:09:24,530 --> 00:09:28,030 điều đó có nghĩa rằng n chia 2 đã có một phần còn lại. 211 00:09:28,030 --> 00:09:33,270 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. 212 00:09:33,270 --> 00:09:34,910 Khác, chúng tôi trở lại sai. 213 00:09:34,910 --> 00:09:39,070 Bạn cũng có thể làm n mod 2 equals bằng không, trả về false, else return true. 214 00:09:39,070 --> 00:09:41,600 215 00:09:41,600 --> 00:09:43,640 >> Hãy xem xét các chức năng đệ quy bên dưới. 216 00:09:43,640 --> 00:09:46,920 Vì vậy, nếu n là nhỏ hơn hoặc bằng 1, trở về 1, 217 00:09:46,920 --> 00:09:50,430 khác trở lại n lần f của n trừ đi 1. 218 00:09:50,430 --> 00:09:52,556 Vì vậy, chức năng này là gì? 219 00:09:52,556 --> 00:09:54,305 Vâng, đây chỉ là chức năng thừa. 220 00:09:54,305 --> 00:09:55,410 221 00:09:55,410 --> 00:09:57,405 Điều này là độc đáo đại diện là n giai thừa. 222 00:09:57,405 --> 00:09:58,720 223 00:09:58,720 --> 00:10:02,310 >> Vì vậy, câu 19 bây giờ, chúng tôi muốn có hàm đệ quy này. 224 00:10:02,310 --> 00:10:04,530 Chúng tôi muốn làm cho nó lặp đi lặp lại. 225 00:10:04,530 --> 00:10:05,874 Vì vậy, làm thế nào để chúng tôi làm điều đó? 226 00:10:05,874 --> 00:10:07,790 Tốt cho nhân viên giải pháp, và một lần nữa có 227 00:10:07,790 --> 00:10:11,090 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 228 00:10:11,090 --> 00:10:11,812 bằng 1. 229 00:10:11,812 --> 00:10:13,520 Và trong suốt này cho vòng lặp, chúng ta sẽ 230 00:10:13,520 --> 00:10:17,590 được nhân sản phẩm cuối cùng kết thúc với giai thừa đầy đủ. 231 00:10:17,590 --> 00:10:21,870 Vì vậy, cho int i bằng 2, tôi là nhỏ hơn hoặc bằng n, i ++. 232 00:10:21,870 --> 00:10:24,130 >> Bạn có thể tự hỏi tại sao i = 2. 233 00:10:24,130 --> 00:10:28,380 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. 234 00:10:28,380 --> 00:10:32,180 Vì vậy, nếu n là nhỏ hơn hoặc bằng 1, chúng ta chỉ trả lại 1. 235 00:10:32,180 --> 00:10:34,830 Vì vậy, ở đây, chúng tôi bắt đầu từ i = 2. 236 00:10:34,830 --> 00:10:39,090 Vâng, nếu tôi là 1, sau đó the-- hoặc nếu n là 1, sau đó cho vòng lặp 237 00:10:39,090 --> 00:10:40,600 sẽ không thực hiện ở tất cả. 238 00:10:40,600 --> 00:10:43,190 Và vì vậy chúng tôi sẽ chỉ sản phẩm trở lại, đó là 1. 239 00:10:43,190 --> 00:10:45,920 Tương tự như vậy, nếu n là bất cứ điều gì ít hơn 1-- 240 00:10:45,920 --> 00:10:49,290 nếu nó là 0, 1 tiêu cực, whatever-- chúng tôi vẫn muốn được trở về 1, 241 00:10:49,290 --> 00:10:52,260 đó là chính xác những gì phiên bản đệ quy là làm. 242 00:10:52,260 --> 00:10:54,660 >> Bây giờ, nếu n lớn hơn 1, sau đó chúng ta sẽ 243 00:10:54,660 --> 00:10:56,550 làm ít nhất một lặp đi lặp lại của vòng lặp này. 244 00:10:56,550 --> 00:11:00,630 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. 245 00:11:00,630 --> 00:11:02,165 Vì vậy, hiện nay sản phẩm là 2. 246 00:11:02,165 --> 00:11:04,040 Bây giờ chúng tôi đang đi làm Thời gian sản phẩm bằng 3. 247 00:11:04,040 --> 00:11:04,690 Bây giờ là 6. 248 00:11:04,690 --> 00:11:07,500 Lần sản phẩm tương đương với 4, bây giờ là 24. 249 00:11:07,500 --> 00:11:10,420 Thời gian sản phẩm bằng 5, bây giờ là 120. 250 00:11:10,420 --> 00:11:16,730 Vì vậy, sau đó cuối cùng, chúng tôi đang trở về 120, đó là chính xác 5 thừa. 251 00:11:16,730 --> 00:11:17,510 >> Câu hỏi 20. 252 00:11:17,510 --> 00:11:22,480 Đâ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, 253 00:11:22,480 --> 00:11:25,735 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 254 00:11:25,735 --> 00:11:28,060 lần những lần chạy tiệm cận. 255 00:11:28,060 --> 00:11:33,270 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? 256 00:11:33,270 --> 00:11:35,970 Vì vậy, có thể có vô hạn nhiều câu trả lời ở đây. 257 00:11:35,970 --> 00:11:39,790 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. 258 00:11:39,790 --> 00:11:42,050 >> Vì vậy, trong trường hợp tốt nhất kịch bản, các mục chúng tôi 259 00:11:42,050 --> 00:11:44,050 tìm ở bắt đầu của danh sách 260 00:11:44,050 --> 00:11:47,400 và như vậy trong omega 1 bước, điều đầu tiên chúng tôi kiểm tra, 261 00:11:47,400 --> 00:11:49,740 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. 262 00:11:49,740 --> 00:11:52,189 Trong trường hợp xấu nhất, mục là lúc kết thúc, 263 00:11:52,189 --> 00:11:53,730 hoặc item không có trong danh sách ở tất cả. 264 00:11:53,730 --> 00:11:56,700 Vì vậy, chúng ta phải tìm kiếm toàn bộ danh sách, tất cả n 265 00:11:56,700 --> 00:11:58,480 yếu tố, và đó là lý do tại sao nó o của n. 266 00:11:58,480 --> 00:11:59,670 267 00:11:59,670 --> 00:12:04,880 >> 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. 268 00:12:04,880 --> 00:12:08,650 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. 269 00:12:08,650 --> 00:12:12,950 Vì vậy, hợp nhất phân loại, ghi nhớ, cuối cùng là theta 270 00:12:12,950 --> 00:12:16,920 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. 271 00:12:16,920 --> 00:12:17,580 Cả hai n log n. 272 00:12:17,580 --> 00:12:18,690 273 00:12:18,690 --> 00:12:21,970 >> Cái gì đó là omega là gì của n, và O của n bình phương? 274 00:12:21,970 --> 00:12:23,990 Vâng, một lần nữa có nhiều câu trả lời có thể. 275 00:12:23,990 --> 00:12:26,440 Ở đây chúng tôi xảy ra để nói bong bóng sắp xếp. 276 00:12:26,440 --> 00:12:28,840 Sắp xếp chèn cũng sẽ làm việc ở đây. 277 00:12:28,840 --> 00:12:31,400 Hãy nhớ rằng bong bóng sắp xếp có tối ưu hóa mà ở đâu, 278 00:12:31,400 --> 00:12:34,630 nếu bạn có thể nhận được thông qua toàn bộ danh sách 279 00:12:34,630 --> 00:12:37,402 mà không cần phải làm bất kỳ giao dịch hoán đổi, sau đó, tốt, 280 00:12:37,402 --> 00:12:40,110 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. 281 00:12:40,110 --> 00:12:43,185 Vì vậy, trong trường hợp tốt nhất, nó chỉ là omega của n. 282 00:12:43,185 --> 00:12:45,960 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, 283 00:12:45,960 --> 00:12:48,270 sau đó chúng tôi có O n bình phương hoán đổi. 284 00:12:48,270 --> 00:12:49,330 285 00:12:49,330 --> 00:12:55,610 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. 286 00:12:55,610 --> 00:12:56,850 >> Câu hỏi 21. 287 00:12:56,850 --> 00:12:58,870 Tràn số nguyên là gì? 288 00:12:58,870 --> 00:13:02,160 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 289 00:13:02,160 --> 00:13:04,255 để đại diện cho một số nguyên, như vậy có lẽ 32 bit. 290 00:13:04,255 --> 00:13:06,300 291 00:13:06,300 --> 00:13:09,180 Hãy nói rằng chúng tôi có một số nguyên ký. 292 00:13:09,180 --> 00:13:12,800 Sau đó, cuối cùng cao nhất số tích cực chúng tôi có thể đại diện 293 00:13:12,800 --> 00:13:15,910 là từ 2 đến 31 trừ đi 1. 294 00:13:15,910 --> 00:13:19,370 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? 295 00:13:19,370 --> 00:13:25,320 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 296 00:13:25,320 --> 00:13:26,490 đến 31. 297 00:13:26,490 --> 00:13:29,470 Vì vậy, tràn số nguyên này là khi bạn giữ incrementing, 298 00:13:29,470 --> 00:13:32,330 và cuối cùng bạn có thể không nhận được bất kỳ cao hơn và nó chỉ 299 00:13:32,330 --> 00:13:34,520 kết thúc tốt đẹp tất cả các cách trở lại xung quanh để một giá trị âm. 300 00:13:34,520 --> 00:13:35,850 301 00:13:35,850 --> 00:13:37,779 >> Điều gì về một lỗi tràn bộ đệm? 302 00:13:37,779 --> 00:13:39,820 Vì vậy, một bộ đệm overflow-- nhớ những gì một bộ đệm. 303 00:13:39,820 --> 00:13:41,000 Nó chỉ là một đoạn bộ nhớ. 304 00:13:41,000 --> 00:13:43,350 Một cái gì đó giống như một mảng là một bộ đệm. 305 00:13:43,350 --> 00:13:46,120 Vì vậy, một lỗi tràn bộ đệm là khi bạn cố gắng để truy cập bộ nhớ 306 00:13:46,120 --> 00:13:47,880 vượt ra ngoài cuối cùng của mảng đó. 307 00:13:47,880 --> 00:13:50,410 Vì vậy, nếu bạn có một mảng có kích thước 5 và bạn 308 00:13:50,410 --> 00:13:53,700 cố gắng truy cập vào khung mảng 5 hoặc 6 khung hoặc khung 7, 309 00:13:53,700 --> 00:13:56,610 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ì 310 00:13:56,610 --> 00:14:00,790 khung mảng below-- tiêu cực 1-- tất cả đều là những lỗi tràn bộ đệm. 311 00:14:00,790 --> 00:14:02,810 Bạn đang chạm vào bộ nhớ trong cách xấu. 312 00:14:02,810 --> 00:14:04,090 313 00:14:04,090 --> 00:14:04,730 >> Câu hỏi 23. 314 00:14:04,730 --> 00:14:05,760 315 00:14:05,760 --> 00:14:09,100 Vì vậy, trong một này, bạn cần để thực hiện strlen. 316 00:14:09,100 --> 00:14:11,630 Và chúng tôi nói với bạn rằng bạn có thể giả s sẽ không được null, 317 00:14:11,630 --> 00:14:13,790 vì vậy bạn không cần phải làm bất cứ kiểm tra cho null. 318 00:14:13,790 --> 00:14:16,190 Và có rất nhiều cách bạn có thể đã làm điều này. 319 00:14:16,190 --> 00:14:18,440 Ở đây chúng ta chỉ cần lấy đơn giản. 320 00:14:18,440 --> 00:14:21,780 Chúng tôi bắt đầu với một truy cập, n. n là đếm bao nhiêu ký tự có. 321 00:14:21,780 --> 00:14:25,560 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. 322 00:14:25,560 --> 00:14:29,092 >> Là s khung 0 bằng rỗng kí tự kết thúc? 323 00:14:29,092 --> 00:14:31,425 Nhớ là chúng tôi đang tìm kiếm các kí tự kết thúc rỗng 324 00:14:31,425 --> 00:14:33,360 để xác định bao lâu chuỗi của chúng tôi là. 325 00:14:33,360 --> 00:14:35,890 Có nghĩa là sẽ chấm dứt chuỗi bất kỳ có liên quan. 326 00:14:35,890 --> 00:14:39,400 Vì vậy, là của khung bằng 0 đến terminator null? 327 00:14:39,400 --> 00:14:42,850 Nếu không, sau đó chúng ta sẽ nhìn vào khung s 1, s 2 khung. 328 00:14:42,850 --> 00:14:45,050 Chúng tôi tiếp tục đi cho đến khi chúng tôi tìm terminator null. 329 00:14:45,050 --> 00:14:48,580 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, 330 00:14:48,580 --> 00:14:49,942 và chúng tôi chỉ có thể trở lại đó. 331 00:14:49,942 --> 00:14:51,180 332 00:14:51,180 --> 00:14:51,865 >> Câu hỏi 24. 333 00:14:51,865 --> 00:14:53,010 334 00:14:53,010 --> 00:14:56,050 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. 335 00:14:56,050 --> 00:14:59,810 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? 336 00:14:59,810 --> 00:15:02,980 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. 337 00:15:02,980 --> 00:15:06,530 Có nói that-- tốt, có nhiều câu trả lời ở đây. 338 00:15:06,530 --> 00:15:12,930 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. 339 00:15:12,930 --> 00:15:14,950 >> Ghi bảng mà chúng ta chỉ nhìn thấy trước đó. 340 00:15:14,950 --> 00:15:17,600 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 341 00:15:17,600 --> 00:15:20,010 là nó có thể chỉ cần đi qua danh sách một lần, xác định 342 00:15:20,010 --> 00:15:22,270 hey điều này đã sắp xếp, và ngược lại. 343 00:15:22,270 --> 00:15:25,960 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. 344 00:15:25,960 --> 00:15:29,200 Vì vậy, danh sách sắp xếp, bong bóng loại sẽ được nhanh hơn. 345 00:15:29,200 --> 00:15:30,870 346 00:15:30,870 --> 00:15:32,430 >> Bây giờ những gì về danh sách liên kết? 347 00:15:32,430 --> 00:15:36,070 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. 348 00:15:36,070 --> 00:15:38,489 Có nói như vậy that-- thường so sánh trực tiếp 349 00:15:38,489 --> 00:15:40,280 sẽ là một liên kết liệt kê với một mảng. 350 00:15:40,280 --> 00:15:41,600 351 00:15:41,600 --> 00:15:44,050 Vì vậy, mặc dù mảng có thể dễ dàng phát triển và thu nhỏ 352 00:15:44,050 --> 00:15:47,130 để phù hợp với nhiều yếu tố khi cần thiết, một danh sách liên kết 353 00:15:47,130 --> 00:15:49,600 so với một một array-- mảng có thể truy cập ngẫu nhiên. 354 00:15:49,600 --> 00:15:52,960 Chúng tôi có thể chỉ vào bất kỳ yếu tố đặc biệt của mảng. 355 00:15:52,960 --> 00:15:56,430 >> 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, 356 00:15:56,430 --> 00:16:00,260 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. 357 00:16:00,260 --> 00:16:03,990 Và đó sẽ ngăn cản chúng ta làm một cái gì đó như tìm kiếm nhị phân. 358 00:16:03,990 --> 00:16:08,150 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. 359 00:16:08,150 --> 00:16:11,120 Có nói that-- vì vậy, có một điều có thể 360 00:16:11,120 --> 00:16:13,380 là bạn không thể làm nhị phân tìm kiếm trên danh sách liên kết, 361 00:16:13,380 --> 00:16:14,730 bạn chỉ có thể làm điều đó trên mảng. 362 00:16:14,730 --> 00:16:18,030 Nhưng có lẽ quan trọng hơn, bạn không thể làm tìm kiếm nhị phân 363 00:16:18,030 --> 00:16:20,690 trên một mảng mà không được sắp xếp. 364 00:16:20,690 --> 00:16:23,990 Trả trước bạn có thể cần phải sắp xếp mảng, và chỉ sau đó có thể 365 00:16:23,990 --> 00:16:25,370 bạn thực hiện tìm kiếm nhị phân. 366 00:16:25,370 --> 00:16:27,660 Vì vậy, nếu bạn không phải là điều được sắp xếp để bắt đầu với, 367 00:16:27,660 --> 00:16:29,250 sau đó tìm kiếm tuyến tính có thể được nhanh hơn. 368 00:16:29,250 --> 00:16:30,620 369 00:16:30,620 --> 00:16:31,740 >> Câu hỏi 27. 370 00:16:31,740 --> 00:16:34,770 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. 371 00:16:34,770 --> 00:16:37,790 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 372 00:16:37,790 --> 00:16:39,980 các giá trị cho các biến khác nhau. 373 00:16:39,980 --> 00:16:41,990 Vì vậy, chúng ta hãy nhìn vào đó. 374 00:16:41,990 --> 00:16:43,160 >> Vì vậy, xếp hàng một. 375 00:16:43,160 --> 00:16:45,457 Chúng tôi có int x = 1. 376 00:16:45,457 --> 00:16:47,040 Đó là điều duy nhất mà đã xảy ra. 377 00:16:47,040 --> 00:16:50,440 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ả 378 00:16:50,440 --> 00:16:51,540 bôi đen. 379 00:16:51,540 --> 00:16:52,280 Vì vậy, x là gì? 380 00:16:52,280 --> 00:16:53,860 Vâng, chúng tôi chỉ cần đặt nó bằng 1. 381 00:16:53,860 --> 00:16:55,020 382 00:16:55,020 --> 00:16:58,770 Và sau đó xếp hàng hai, tốt, chúng ta thấy rằng y được thiết lập để 2, 383 00:16:58,770 --> 00:17:00,550 và bàn là đã điền vào cho chúng tôi. 384 00:17:00,550 --> 00:17:03,040 Vì vậy, x là 1 và y là 2. 385 00:17:03,040 --> 00:17:05,890 >> Bây giờ, dòng ba, chúng tôi hiện bên trong các chức năng trao đổi. 386 00:17:05,890 --> 00:17:07,560 Chúng tôi đã vượt qua những gì để trao đổi? 387 00:17:07,560 --> 00:17:11,609 Chúng tôi đã thông qua ký hiệu x cho một, và ký hiệu y cho b. 388 00:17:11,609 --> 00:17:15,160 Nơi mà vấn đề trước nói rằng địa chỉ của x 389 00:17:15,160 --> 00:17:17,520 là 0x10, và địa chỉ của y là 0x14. 390 00:17:17,520 --> 00:17:18,970 391 00:17:18,970 --> 00:17:21,909 Vì vậy, a và b là bằng 0x10 và 0x14, tương ứng. 392 00:17:21,909 --> 00:17:23,670 393 00:17:23,670 --> 00:17:26,250 >> Bây giờ, ở dòng ba, x và y là gì? 394 00:17:26,250 --> 00:17:28,554 Vâng, không có gì đã thay đổi về x và y vào thời điểm này. 395 00:17:28,554 --> 00:17:30,470 Mặc dù chúng bên trong một stack frame chính, 396 00:17:30,470 --> 00:17:32,469 họ vẫn có cùng một giá trị mà họ đã làm trước đây. 397 00:17:32,469 --> 00:17:34,030 Chúng tôi đã không thay đổi bất kỳ bộ nhớ. 398 00:17:34,030 --> 00:17:35,710 Vì vậy, x là 1, y là 2. 399 00:17:35,710 --> 00:17:36,550 400 00:17:36,550 --> 00:17:37,050 Được rồi. 401 00:17:37,050 --> 00:17:40,300 Vì vậy, bây giờ chúng tôi nói int tmp bằng một ngôi sao. 402 00:17:40,300 --> 00:17:44,410 Vì vậy, tại dòng bốn, tất cả mọi thứ là như nhau ngoại trừ cho tmp. 403 00:17:44,410 --> 00:17:47,130 Chúng tôi đã không thay đổi bất kỳ giá trị bất cứ điều gì ngoại trừ tmp. 404 00:17:47,130 --> 00:17:49,230 Chúng tôi đang thiết tmp bằng một ngôi sao. 405 00:17:49,230 --> 00:17:50,620 Một ngôi sao là gì? 406 00:17:50,620 --> 00:17:56,240 Vâng, một điểm x, Vì vậy, một ngôi sao sẽ x bằng nhau, đó là 1. 407 00:17:56,240 --> 00:18:00,080 Vì vậy, tất cả mọi thứ được sao chép xuống, và tmp được thiết lập để 1. 408 00:18:00,080 --> 00:18:01,110 >> Bây giờ dòng tiếp theo. 409 00:18:01,110 --> 00:18:03,380 Sao bằng một ngôi sao b. 410 00:18:03,380 --> 00:18:10,000 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à. 411 00:18:10,000 --> 00:18:10,830 Một ngôi sao là gì? 412 00:18:10,830 --> 00:18:13,720 Vâng, chúng ta chỉ nói sao một là x. 413 00:18:13,720 --> 00:18:16,400 Vì vậy, chúng tôi đang thay đổi x cho bằng sao b. 414 00:18:16,400 --> 00:18:18,960 Sao b là gì? y. điểm b để y. 415 00:18:18,960 --> 00:18:21,030 Vì vậy, sao b là y. 416 00:18:21,030 --> 00:18:25,140 Vì vậy, chúng tôi đang thiết x bằng y, và mọi thứ khác là như nhau. 417 00:18:25,140 --> 00:18:29,130 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. 418 00:18:29,130 --> 00:18:31,120 >> Bây giờ các dòng tiếp theo, ngôi sao b bằng tmp. 419 00:18:31,120 --> 00:18:34,740 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. 420 00:18:34,740 --> 00:18:37,450 Mọi thứ khác là như nhau, vì vậy tất cả mọi thứ được sao chép xuống. 421 00:18:37,450 --> 00:18:42,050 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. 422 00:18:42,050 --> 00:18:43,210 >> Bây giờ cuối cùng, dòng bảy. 423 00:18:43,210 --> 00:18:44,700 Chúng tôi đang trở lại trong các chức năng chính. 424 00:18:44,700 --> 00:18:46,350 Chúng tôi trao đổi sau khi kết thúc. 425 00:18:46,350 --> 00:18:48,972 Chúng tôi đã mất a, b, và tmp, nhưng cuối cùng chúng tôi 426 00:18:48,972 --> 00:18:51,180 không thay đổi bất kỳ giá trị bất cứ điều gì vào thời điểm này, 427 00:18:51,180 --> 00:18:52,800 chúng tôi chỉ cần sao chép x và y xuống. 428 00:18:52,800 --> 00:18:56,490 Và chúng ta thấy rằng x và y là hiện giờ là 2 và 1 thay vì 1 và 2. 429 00:18:56,490 --> 00:18:58,160 Các trao đổi đã thực hiện thành công. 430 00:18:58,160 --> 00:18:59,500 431 00:18:59,500 --> 00:19:00,105 >> Câu hỏi 28. 432 00:19:00,105 --> 00:19:01,226 433 00:19:01,226 --> 00:19:03,100 Giả sử rằng bạn gặp phải các thông báo lỗi 434 00:19:03,100 --> 00:19:06,790 dưới đây trong giờ hành chính năm tiếp theo như một CA hoặc TF. 435 00:19:06,790 --> 00:19:08,930 Tư vấn làm thế nào để sửa chữa từng lỗi. 436 00:19:08,930 --> 00:19:11,160 Tham khảo để xác định để GetString. 437 00:19:11,160 --> 00:19:12,540 Tại sao bạn có thể thấy điều này? 438 00:19:12,540 --> 00:19:15,380 Vâng, nếu một học sinh sử dụng GetString trong mã của họ, 439 00:19:15,380 --> 00:19:20,310 họ đã đúng băm bao gồm CS50 dot h để bao gồm các thư viện CS50. 440 00:19:20,310 --> 00:19:22,380 >> Vâng, những gì họ làm cần phải sửa chữa lỗi này? 441 00:19:22,380 --> 00:19:26,810 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. 442 00:19:26,810 --> 00:19:29,501 Vì vậy, nếu họ không vượt qua kêu vang dash lcs50, họ đang 443 00:19:29,501 --> 00:19:32,000 sẽ không có thực tế mã thực hiện GetString. 444 00:19:32,000 --> 00:19:33,190 445 00:19:33,190 --> 00:19:34,170 >> Câu hỏi 29. 446 00:19:34,170 --> 00:19:36,190 Ngầm tuyên bố chức năng thư viện strlen. 447 00:19:36,190 --> 00:19:37,550 448 00:19:37,550 --> 00:19:40,360 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. 449 00:19:40,360 --> 00:19:41,440 450 00:19:41,440 --> 00:19:45,410 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, 451 00:19:45,410 --> 00:19:48,710 và bao gồm chuỗi dot h, bây giờ các student-- nay là trình biên dịch 452 00:19:48,710 --> 00:19:51,750 có quyền truy cập vào tờ khai của strlen, 453 00:19:51,750 --> 00:19:54,120 và nó biết rằng mã của bạn được sử dụng strlen một cách chính xác. 454 00:19:54,120 --> 00:19:55,380 455 00:19:55,380 --> 00:19:56,580 >> Câu hỏi 30. 456 00:19:56,580 --> 00:20:00,240 Nhiều chuyển đổi phần trăm hơn đối số dữ liệu. 457 00:20:00,240 --> 00:20:01,540 Vì vậy, đây là những gì? 458 00:20:01,540 --> 00:20:06,470 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. 459 00:20:06,470 --> 00:20:08,890 Vì vậy, trong printf chúng ta có thể percent-- chúng tôi có thể in một cái gì đó 460 00:20:08,890 --> 00:20:11,380 như phần trăm i n dấu gạch chéo ngược. 461 00:20:11,380 --> 00:20:15,310 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. 462 00:20:15,310 --> 00:20:18,950 Vì vậy, cho mỗi người dấu phần trăm, chúng ta cần 463 00:20:18,950 --> 00:20:21,560 để vượt qua một biến vào cuối printf. 464 00:20:21,560 --> 00:20:26,980 >> 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, 465 00:20:26,980 --> 00:20:30,270 tốt, chúng ta nói rằng chúng tôi sẽ in một số nguyên, 466 00:20:30,270 --> 00:20:33,970 nhưng sau đó chúng tôi không vượt qua printf một số nguyên để thực sự in. 467 00:20:33,970 --> 00:20:37,182 Vì vậy, đây hơn trăm chuyển đổi hơn đối số dữ liệu? 468 00:20:37,182 --> 00:20:39,390 Điều đó nói rằng chúng ta có một bó toàn bộ phần trăm, 469 00:20:39,390 --> 00:20:42,445 và chúng tôi không có đủ biến để điền thực sự trong những phần trăm. 470 00:20:42,445 --> 00:20:44,850 471 00:20:44,850 --> 00:20:50,010 >> 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. 472 00:20:50,010 --> 00:20:52,350 Vì vậy, đây là một lỗi Valgrind. 473 00:20:52,350 --> 00:20:54,720 Điều này được nói rằng một nơi nào đó trong mã của bạn, 474 00:20:54,720 --> 00:20:59,010 bạn có một phân bổ là 40 byte lớn, do đó bạn malloced 40 byte, 475 00:20:59,010 --> 00:21:00,515 và bạn không bao giờ giải thoát nó. 476 00:21:00,515 --> 00:21:02,480 477 00:21:02,480 --> 00:21:05,140 Nhiều khả năng bạn chỉ cần để tìm thấy một số rò rỉ bộ nhớ, 478 00:21:05,140 --> 00:21:07,650 và tìm thấy nơi bạn cần giải phóng khối bộ nhớ này. 479 00:21:07,650 --> 00:21:08,780 480 00:21:08,780 --> 00:21:11,910 >> Và câu hỏi 32, viết không hợp lệ kích thước 4. 481 00:21:11,910 --> 00:21:13,250 Một lần nữa đây là một lỗi Valgrind. 482 00:21:13,250 --> 00:21:15,440 Điều này không phải làm với rò rỉ bộ nhớ bây giờ. 483 00:21:15,440 --> 00:21:20,750 Đâ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ệ. 484 00:21:20,750 --> 00:21:23,270 Và rất có thể đây là một số loại lỗi tràn bộ đệm. 485 00:21:23,270 --> 00:21:26,560 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 486 00:21:26,560 --> 00:21:30,115 nói đó là kích thước 5, và bạn cố gắng chạm vào khung mảng 5. 487 00:21:30,115 --> 00:21:34,150 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ớ 488 00:21:34,150 --> 00:21:37,440 mà bạn thực sự có thể truy cập, và do đó, bạn sẽ nhận được lỗi này, 489 00:21:37,440 --> 00:21:39,272 nói viết không hợp lệ kích thước 4. 490 00:21:39,272 --> 00:21:42,480 Valgrind sẽ nhận ra bạn cố gắng để chạm vào bộ nhớ không thích hợp. 491 00:21:42,480 --> 00:21:43,980 >> Và đó là nó cho quiz0. 492 00:21:43,980 --> 00:21:47,065 Tôi Rob Bowden, và đây là CS50. 493 00:21:47,065 --> 00:21:51,104